Merge "mediawiki.searchSuggest: Show full article title as a tooltip for each suggestion"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Wed, 28 May 2014 20:57:13 +0000 (20:57 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Wed, 28 May 2014 20:57:13 +0000 (20:57 +0000)
1511 files changed:
.gitattributes [new file with mode: 0644]
.jscsrc
.jshintrc
RELEASE-NOTES-1.23
RELEASE-NOTES-1.24
composer-example.json [deleted file]
composer.json [new file with mode: 0644]
docs/contenthandler.txt
docs/hooks.txt
docs/kss/Makefile
docs/kss/README.txt
docs/kss/styleguide-template/index.html
img_auth.php
includes/AjaxResponse.php
includes/Article.php
includes/AuthPlugin.php
includes/AutoLoader.php
includes/Autopromote.php
includes/Block.php
includes/CacheHelper.php
includes/Category.php
includes/CategoryViewer.php
includes/Categoryfinder.php
includes/ChangeTags.php
includes/ChangesFeed.php
includes/Collation.php
includes/Cookie.php
includes/DefaultSettings.php
includes/DeprecatedGlobal.php
includes/EditPage.php
includes/Export.php
includes/Fallback.php
includes/Feed.php
includes/FeedUtils.php
includes/FileDeleteForm.php
includes/FormOptions.php
includes/GitInfo.php
includes/GlobalFunctions.php
includes/HistoryBlob.php
includes/Hooks.php
includes/Html.php
includes/HtmlFormatter.php
includes/HttpFunctions.php
includes/ImagePage.php
includes/ImageQueryPage.php
includes/Import.php
includes/Init.php
includes/Licenses.php
includes/LinkFilter.php
includes/Linker.php
includes/MWTimestamp.php
includes/MagicWord.php
includes/Message.php
includes/MessageBlobStore.php
includes/MimeMagic.php
includes/Namespace.php
includes/OutputHandler.php
includes/OutputPage.php
includes/PHPVersionError.php
includes/PageQueryPage.php
includes/Pager.php
includes/PathRouter.php
includes/Preferences.php
includes/PrefixSearch.php
includes/ProtectionForm.php
includes/QueryPage.php
includes/Revision.php
includes/RevisionList.php
includes/Sanitizer.php
includes/Setup.php
includes/SiteConfiguration.php
includes/SiteStats.php
includes/Skin.php
includes/SkinTemplate.php
includes/SquidPurgeClient.php
includes/StatCounter.php
includes/Status.php
includes/StreamFile.php
includes/StubObject.php
includes/TimestampException.php
includes/Title.php
includes/TitleArrayFromResult.php
includes/User.php
includes/UserArrayFromResult.php
includes/UserMailer.php
includes/UserRightsProxy.php
includes/WatchedItem.php
includes/WebRequest.php
includes/WebStart.php
includes/Wiki.php
includes/WikiFilePage.php
includes/WikiMap.php
includes/WikiPage.php
includes/Xml.php
includes/actions/InfoAction.php
includes/api/ApiBase.php
includes/api/ApiComparePages.php
includes/api/ApiDelete.php
includes/api/ApiEditPage.php
includes/api/ApiFeedContributions.php
includes/api/ApiFeedWatchlist.php
includes/api/ApiFileRevert.php
includes/api/ApiFormatBase.php
includes/api/ApiFormatJson.php
includes/api/ApiFormatRaw.php
includes/api/ApiFormatWddx.php
includes/api/ApiFormatXml.php
includes/api/ApiHelp.php
includes/api/ApiImport.php
includes/api/ApiLogin.php
includes/api/ApiMain.php
includes/api/ApiModuleManager.php
includes/api/ApiMove.php
includes/api/ApiPageSet.php
includes/api/ApiParamInfo.php
includes/api/ApiParse.php
includes/api/ApiQuery.php
includes/api/ApiQueryAllCategories.php
includes/api/ApiQueryAllImages.php
includes/api/ApiQueryAllLinks.php
includes/api/ApiQueryAllMessages.php
includes/api/ApiQueryAllPages.php
includes/api/ApiQueryAllUsers.php
includes/api/ApiQueryBacklinks.php
includes/api/ApiQueryBase.php
includes/api/ApiQueryBlocks.php
includes/api/ApiQueryCategories.php
includes/api/ApiQueryCategoryInfo.php
includes/api/ApiQueryCategoryMembers.php
includes/api/ApiQueryContributors.php
includes/api/ApiQueryDeletedrevs.php
includes/api/ApiQueryDuplicateFiles.php
includes/api/ApiQueryExtLinksUsage.php
includes/api/ApiQueryExternalLinks.php
includes/api/ApiQueryFileRepoInfo.php
includes/api/ApiQueryFilearchive.php
includes/api/ApiQueryIWBacklinks.php
includes/api/ApiQueryIWLinks.php
includes/api/ApiQueryImageInfo.php
includes/api/ApiQueryImages.php
includes/api/ApiQueryInfo.php
includes/api/ApiQueryLangBacklinks.php
includes/api/ApiQueryLangLinks.php
includes/api/ApiQueryLinks.php
includes/api/ApiQueryLogEvents.php
includes/api/ApiQueryPagePropNames.php
includes/api/ApiQueryPageProps.php
includes/api/ApiQueryPagesWithProp.php
includes/api/ApiQueryPrefixSearch.php
includes/api/ApiQueryProtectedTitles.php
includes/api/ApiQueryQueryPage.php
includes/api/ApiQueryRandom.php
includes/api/ApiQueryRecentChanges.php
includes/api/ApiQueryRedirects.php
includes/api/ApiQueryRevisions.php
includes/api/ApiQuerySearch.php
includes/api/ApiQuerySiteinfo.php
includes/api/ApiQueryStashImageInfo.php
includes/api/ApiQueryTags.php
includes/api/ApiQueryUserContributions.php
includes/api/ApiQueryUserInfo.php
includes/api/ApiQueryUsers.php
includes/api/ApiQueryWatchlist.php
includes/api/ApiQueryWatchlistRaw.php
includes/api/ApiResult.php
includes/api/ApiRollback.php
includes/api/ApiRsd.php
includes/api/ApiUpload.php
includes/cache/BacklinkCache.php
includes/cache/CacheDependency.php
includes/cache/FileCacheBase.php
includes/cache/GenderCache.php
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/ObjectFileCache.php
includes/cache/ResourceFileCache.php
includes/cache/UserCache.php
includes/changes/ChangesList.php
includes/changes/EnhancedChangesList.php
includes/changes/RecentChange.php
includes/clientpool/RedisConnectionPool.php
includes/composer/ComposerPackageModifier.php
includes/config/Config.php
includes/config/ConfigException.php [new file with mode: 0644]
includes/config/ConfigFactory.php [new file with mode: 0644]
includes/config/GlobalConfig.php [deleted file]
includes/config/GlobalVarConfig.php [new file with mode: 0644]
includes/content/AbstractContent.php
includes/content/Content.php
includes/content/ContentHandler.php
includes/content/CssContent.php
includes/content/JavaScriptContent.php
includes/content/TextContent.php
includes/content/WikitextContent.php
includes/context/ContextSource.php
includes/context/DerivativeContext.php
includes/context/IContextSource.php
includes/context/RequestContext.php
includes/db/Database.php
includes/db/DatabaseError.php
includes/db/DatabaseMssql.php
includes/db/DatabaseMysqlBase.php
includes/db/DatabaseOracle.php
includes/db/DatabasePostgres.php
includes/db/DatabaseSqlite.php
includes/db/IORMRow.php
includes/db/IORMTable.php
includes/db/LBFactory.php
includes/db/LBFactorySingle.php
includes/db/LoadBalancer.php
includes/db/ORMResult.php
includes/db/ORMRow.php
includes/db/ORMTable.php
includes/debug/Debug.php
includes/deferred/CallableUpdate.php
includes/deferred/HTMLCacheUpdate.php
includes/deferred/LinksUpdate.php
includes/deferred/SearchUpdate.php
includes/diff/DairikiDiff.php
includes/exception/MWException.php
includes/filebackend/FSFile.php
includes/filebackend/FSFileBackend.php
includes/filebackend/FileBackend.php
includes/filebackend/FileBackendMultiWrite.php
includes/filebackend/FileBackendStore.php
includes/filebackend/FileOp.php
includes/filebackend/SwiftFileBackend.php
includes/filebackend/TempFSFile.php
includes/filebackend/filejournal/FileJournal.php
includes/filebackend/lockmanager/DBLockManager.php
includes/filerepo/FileRepo.php
includes/filerepo/FileRepoStatus.php
includes/filerepo/ForeignAPIRepo.php
includes/filerepo/RepoGroup.php
includes/filerepo/file/ArchivedFile.php
includes/filerepo/file/File.php
includes/filerepo/file/ForeignAPIFile.php
includes/filerepo/file/ForeignDBFile.php
includes/filerepo/file/LocalFile.php
includes/filerepo/file/OldLocalFile.php
includes/gallery/ImageGalleryBase.php
includes/htmlform/HTMLButtonField.php
includes/htmlform/HTMLCheckField.php [changed mode: 0644->0755]
includes/htmlform/HTMLCheckMatrix.php
includes/htmlform/HTMLForm.php
includes/htmlform/HTMLFormField.php
includes/htmlform/HTMLFormFieldCloner.php [new file with mode: 0644]
includes/htmlform/HTMLHiddenField.php
includes/htmlform/HTMLMultiSelectField.php
includes/htmlform/HTMLNestedFilterable.php
includes/htmlform/HTMLRadioField.php
includes/htmlform/HTMLSelectAndOtherField.php
includes/htmlform/HTMLSelectOrOtherField.php
includes/installer/CliInstaller.php
includes/installer/DatabaseInstaller.php
includes/installer/DatabaseUpdater.php
includes/installer/Installer.php
includes/installer/LocalSettingsGenerator.php
includes/installer/MssqlInstaller.php
includes/installer/MssqlUpdater.php
includes/installer/MysqlInstaller.php
includes/installer/MysqlUpdater.php
includes/installer/OracleUpdater.php
includes/installer/PostgresInstaller.php
includes/installer/PostgresUpdater.php
includes/installer/SqliteInstaller.php
includes/installer/SqliteUpdater.php
includes/installer/WebInstaller.php
includes/installer/WebInstallerOutput.php
includes/installer/WebInstallerPage.php
includes/installer/i18n/af.json
includes/installer/i18n/am.json
includes/installer/i18n/an.json
includes/installer/i18n/ang.json
includes/installer/i18n/ar.json
includes/installer/i18n/ary.json
includes/installer/i18n/arz.json
includes/installer/i18n/as.json
includes/installer/i18n/ast.json
includes/installer/i18n/az.json
includes/installer/i18n/ba.json
includes/installer/i18n/bar.json
includes/installer/i18n/bcc.json
includes/installer/i18n/bcl.json
includes/installer/i18n/be-tarask.json
includes/installer/i18n/be.json
includes/installer/i18n/bg.json
includes/installer/i18n/bjn.json
includes/installer/i18n/bn.json
includes/installer/i18n/bpy.json
includes/installer/i18n/br.json
includes/installer/i18n/bs.json
includes/installer/i18n/ca.json
includes/installer/i18n/ce.json
includes/installer/i18n/ceb.json
includes/installer/i18n/ckb.json
includes/installer/i18n/cps.json
includes/installer/i18n/crh-cyrl.json
includes/installer/i18n/crh-latn.json
includes/installer/i18n/cs.json
includes/installer/i18n/cv.json
includes/installer/i18n/cy.json
includes/installer/i18n/da.json
includes/installer/i18n/de-formal.json
includes/installer/i18n/de.json
includes/installer/i18n/diq.json
includes/installer/i18n/dsb.json
includes/installer/i18n/dtp.json
includes/installer/i18n/en-gb.json
includes/installer/i18n/en.json
includes/installer/i18n/eo.json
includes/installer/i18n/es-formal.json
includes/installer/i18n/es.json
includes/installer/i18n/et.json
includes/installer/i18n/eu.json
includes/installer/i18n/ext.json
includes/installer/i18n/fa.json
includes/installer/i18n/fi.json
includes/installer/i18n/fr.json
includes/installer/i18n/frc.json
includes/installer/i18n/frp.json
includes/installer/i18n/frr.json
includes/installer/i18n/fy.json
includes/installer/i18n/gag.json
includes/installer/i18n/gan-hans.json
includes/installer/i18n/gan-hant.json
includes/installer/i18n/gd.json
includes/installer/i18n/gl.json
includes/installer/i18n/gom-latn.json
includes/installer/i18n/grc.json
includes/installer/i18n/gsw.json
includes/installer/i18n/gu.json
includes/installer/i18n/hak.json
includes/installer/i18n/he.json
includes/installer/i18n/hi.json
includes/installer/i18n/hif-latn.json
includes/installer/i18n/hil.json
includes/installer/i18n/hrx.json
includes/installer/i18n/hsb.json
includes/installer/i18n/ht.json
includes/installer/i18n/hu-formal.json
includes/installer/i18n/hu.json
includes/installer/i18n/hy.json
includes/installer/i18n/ia.json
includes/installer/i18n/id.json
includes/installer/i18n/ig.json
includes/installer/i18n/io.json
includes/installer/i18n/is.json
includes/installer/i18n/it.json
includes/installer/i18n/ja.json
includes/installer/i18n/jam.json
includes/installer/i18n/jv.json
includes/installer/i18n/ka.json
includes/installer/i18n/kaa.json
includes/installer/i18n/kbd-cyrl.json
includes/installer/i18n/kiu.json
includes/installer/i18n/kk-arab.json
includes/installer/i18n/kk-cyrl.json
includes/installer/i18n/kk-latn.json
includes/installer/i18n/km.json
includes/installer/i18n/kn.json
includes/installer/i18n/ko.json
includes/installer/i18n/krc.json
includes/installer/i18n/ksh.json
includes/installer/i18n/ku-latn.json
includes/installer/i18n/lad.json
includes/installer/i18n/lb.json
includes/installer/i18n/lfn.json
includes/installer/i18n/lg.json
includes/installer/i18n/li.json
includes/installer/i18n/lrc.json
includes/installer/i18n/lt.json
includes/installer/i18n/lv.json
includes/installer/i18n/lzh.json
includes/installer/i18n/lzz.json
includes/installer/i18n/mai.json
includes/installer/i18n/mdf.json
includes/installer/i18n/mg.json
includes/installer/i18n/min.json
includes/installer/i18n/mk.json
includes/installer/i18n/ml.json
includes/installer/i18n/mn.json
includes/installer/i18n/mr.json
includes/installer/i18n/ms.json
includes/installer/i18n/mt.json
includes/installer/i18n/nan.json
includes/installer/i18n/nb.json
includes/installer/i18n/nds-nl.json
includes/installer/i18n/ne.json
includes/installer/i18n/nl-informal.json
includes/installer/i18n/nl.json
includes/installer/i18n/nn.json
includes/installer/i18n/oc.json
includes/installer/i18n/or.json
includes/installer/i18n/pam.json
includes/installer/i18n/pdc.json
includes/installer/i18n/pl.json
includes/installer/i18n/pms.json
includes/installer/i18n/prg.json
includes/installer/i18n/ps.json
includes/installer/i18n/pt-br.json
includes/installer/i18n/pt.json
includes/installer/i18n/qqq.json
includes/installer/i18n/qu.json
includes/installer/i18n/rm.json
includes/installer/i18n/ro.json
includes/installer/i18n/roa-tara.json
includes/installer/i18n/ru.json
includes/installer/i18n/rue.json
includes/installer/i18n/sah.json
includes/installer/i18n/scn.json
includes/installer/i18n/sco.json
includes/installer/i18n/sdc.json
includes/installer/i18n/sh.json
includes/installer/i18n/shi.json
includes/installer/i18n/si.json
includes/installer/i18n/sk.json
includes/installer/i18n/sl.json
includes/installer/i18n/sli.json
includes/installer/i18n/so.json
includes/installer/i18n/sr-ec.json
includes/installer/i18n/sr-el.json
includes/installer/i18n/srn.json
includes/installer/i18n/sv.json
includes/installer/i18n/sw.json
includes/installer/i18n/szl.json
includes/installer/i18n/ta.json
includes/installer/i18n/tcy.json
includes/installer/i18n/te.json
includes/installer/i18n/tg-cyrl.json
includes/installer/i18n/tg-latn.json
includes/installer/i18n/th.json
includes/installer/i18n/tk.json
includes/installer/i18n/tl.json
includes/installer/i18n/tr.json
includes/installer/i18n/tt-cyrl.json
includes/installer/i18n/tt-latn.json
includes/installer/i18n/ug-arab.json
includes/installer/i18n/uk.json
includes/installer/i18n/uz.json
includes/installer/i18n/vec.json
includes/installer/i18n/vep.json
includes/installer/i18n/vi.json
includes/installer/i18n/vo.json
includes/installer/i18n/vro.json
includes/installer/i18n/war.json
includes/installer/i18n/wo.json
includes/installer/i18n/wuu.json
includes/installer/i18n/xal.json
includes/installer/i18n/yi.json
includes/installer/i18n/yo.json
includes/installer/i18n/yue.json
includes/installer/i18n/zea.json
includes/installer/i18n/zh-hans.json
includes/installer/i18n/zh-hant.json
includes/jobqueue/Job.php
includes/jobqueue/JobQueue.php
includes/jobqueue/JobQueueDB.php
includes/jobqueue/JobQueueFederated.php
includes/jobqueue/JobQueueGroup.php
includes/jobqueue/JobQueueRedis.php
includes/jobqueue/jobs/DoubleRedirectJob.php
includes/jobqueue/jobs/RefreshLinksJob2.php
includes/jobqueue/jobs/UploadFromUrlJob.php
includes/json/FormatJson.php
includes/libs/CSSJanus.php
includes/libs/CSSMin.php
includes/libs/GenericArrayObject.php
includes/libs/HashRing.php
includes/libs/IEContentAnalyzer.php
includes/libs/IPSet.php [new file with mode: 0644]
includes/libs/JavaScriptMinifier.php
includes/libs/MWMessagePack.php
includes/libs/MultiHttpClient.php
includes/libs/ProcessCacheLRU.php
includes/libs/jsminplus.php
includes/libs/lessc.inc.php
includes/libs/virtualrest/SwiftVirtualRESTService.php [new file with mode: 0644]
includes/libs/virtualrest/VirtualRESTService.php [new file with mode: 0644]
includes/libs/virtualrest/VirtualRESTServiceClient.php [new file with mode: 0644]
includes/limit.sh
includes/logging/LogEntry.php
includes/logging/LogEventsList.php
includes/logging/LogFormatter.php
includes/logging/LogPager.php
includes/media/BMP.php
includes/media/Bitmap.php
includes/media/Bitmap_ClientOnly.php
includes/media/DjVu.php
includes/media/DjVuImage.php
includes/media/ExifBitmap.php
includes/media/FormatMetadata.php
includes/media/Jpeg.php
includes/media/MediaHandler.php
includes/media/MediaTransformOutput.php
includes/media/SVG.php
includes/media/SVGMetadataExtractor.php
includes/media/XMP.php
includes/media/XMPValidate.php
includes/normal/RandomTest.php
includes/normal/Utf8Test.php
includes/normal/UtfNormal.php
includes/normal/UtfNormalBench.php
includes/normal/UtfNormalData.inc
includes/normal/UtfNormalDataK.inc
includes/normal/UtfNormalDefines.php
includes/normal/UtfNormalGenerate.php
includes/normal/UtfNormalMemStress.php
includes/normal/UtfNormalTest.php
includes/normal/UtfNormalTest2.php
includes/normal/UtfNormalUtil.php
includes/objectcache/APCBagOStuff.php
includes/objectcache/BagOStuff.php
includes/objectcache/EmptyBagOStuff.php
includes/objectcache/HashBagOStuff.php
includes/objectcache/MemcachedBagOStuff.php
includes/objectcache/MemcachedClient.php
includes/objectcache/MemcachedPeclBagOStuff.php
includes/objectcache/MemcachedPhpBagOStuff.php
includes/objectcache/MultiWriteBagOStuff.php
includes/objectcache/ObjectCache.php
includes/objectcache/ObjectCacheSessionHandler.php
includes/objectcache/RedisBagOStuff.php
includes/objectcache/SqlBagOStuff.php
includes/objectcache/WinCacheBagOStuff.php
includes/objectcache/XCacheBagOStuff.php
includes/parser/CacheTime.php
includes/parser/CoreParserFunctions.php
includes/parser/CoreTagHooks.php
includes/parser/DateFormatter.php
includes/parser/LinkHolderArray.php
includes/parser/Parser.php
includes/parser/ParserCache.php
includes/parser/ParserOptions.php
includes/parser/ParserOutput.php
includes/parser/Parser_DiffTest.php
includes/parser/Preprocessor.php
includes/parser/Preprocessor_DOM.php
includes/parser/Preprocessor_Hash.php
includes/parser/StripState.php
includes/parser/Tidy.php
includes/poolcounter/PoolCounter.php
includes/poolcounter/PoolCounterRedis.php
includes/poolcounter/PoolCounterWork.php
includes/profiler/Profiler.php
includes/profiler/ProfilerMwprof.php
includes/profiler/ProfilerSimpleDB.php
includes/profiler/ProfilerSimpleText.php
includes/profiler/ProfilerSimpleTrace.php
includes/profiler/ProfilerSimpleUDP.php
includes/profiler/ProfilerStandard.php [new file with mode: 0644]
includes/profiler/ProfilerStub.php
includes/rcfeed/IRCColourfulRCFeedFormatter.php
includes/rcfeed/MachineReadableRCFeedFormatter.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderContext.php
includes/resourceloader/ResourceLoaderFileModule.php
includes/resourceloader/ResourceLoaderFilePageModule.php
includes/resourceloader/ResourceLoaderLESSFunctions.php
includes/resourceloader/ResourceLoaderLanguageDataModule.php
includes/resourceloader/ResourceLoaderLanguageNamesModule.php [new file with mode: 0644]
includes/resourceloader/ResourceLoaderModule.php
includes/resourceloader/ResourceLoaderNoscriptModule.php
includes/resourceloader/ResourceLoaderSiteModule.php
includes/resourceloader/ResourceLoaderStartUpModule.php
includes/resourceloader/ResourceLoaderUserCSSPrefsModule.php
includes/resourceloader/ResourceLoaderUserGroupsModule.php
includes/resourceloader/ResourceLoaderUserModule.php
includes/resourceloader/ResourceLoaderUserOptionsModule.php
includes/resourceloader/ResourceLoaderUserTokensModule.php
includes/resourceloader/ResourceLoaderWikiModule.php
includes/revisiondelete/RevisionDelete.php
includes/revisiondelete/RevisionDeleteAbstracts.php
includes/revisiondelete/RevisionDeleteUser.php
includes/revisiondelete/RevisionDeleter.php
includes/search/SearchEngine.php
includes/search/SearchHighlighter.php
includes/search/SearchMssql.php
includes/search/SearchMySQL.php
includes/search/SearchOracle.php
includes/search/SearchPostgres.php
includes/search/SearchResult.php
includes/search/SearchResultSet.php
includes/search/SearchSqlite.php
includes/site/MediaWikiSite.php
includes/site/Site.php
includes/site/SiteList.php
includes/site/SiteSQLStore.php
includes/site/SiteStore.php
includes/specialpage/ChangesListSpecialPage.php
includes/specialpage/FormSpecialPage.php
includes/specialpage/RedirectSpecialPage.php
includes/specialpage/SpecialPageFactory.php
includes/specials/SpecialActiveusers.php
includes/specials/SpecialAllmessages.php
includes/specials/SpecialAllpages.php
includes/specials/SpecialBlock.php
includes/specials/SpecialBlockList.php
includes/specials/SpecialBooksources.php
includes/specials/SpecialBrokenRedirects.php
includes/specials/SpecialCachedPage.php
includes/specials/SpecialChangeEmail.php
includes/specials/SpecialChangePassword.php
includes/specials/SpecialComparePages.php
includes/specials/SpecialContributions.php
includes/specials/SpecialCreateAccount.php
includes/specials/SpecialDeletedContributions.php
includes/specials/SpecialEditWatchlist.php
includes/specials/SpecialEmailuser.php
includes/specials/SpecialExpandTemplates.php
includes/specials/SpecialExport.php
includes/specials/SpecialFewestrevisions.php
includes/specials/SpecialFileDuplicateSearch.php
includes/specials/SpecialImport.php
includes/specials/SpecialJavaScriptTest.php
includes/specials/SpecialLinkSearch.php
includes/specials/SpecialListfiles.php
includes/specials/SpecialListgrouprights.php
includes/specials/SpecialListusers.php
includes/specials/SpecialLockdb.php
includes/specials/SpecialLog.php
includes/specials/SpecialMIMEsearch.php
includes/specials/SpecialMergeHistory.php
includes/specials/SpecialMostinterwikis.php
includes/specials/SpecialMostlinked.php
includes/specials/SpecialMostlinkedtemplates.php
includes/specials/SpecialMovepage.php
includes/specials/SpecialNewimages.php
includes/specials/SpecialNewpages.php
includes/specials/SpecialPasswordReset.php
includes/specials/SpecialPrefixindex.php
includes/specials/SpecialProtectedpages.php
includes/specials/SpecialProtectedtitles.php
includes/specials/SpecialRandomInCategory.php
includes/specials/SpecialRandompage.php
includes/specials/SpecialRecentchanges.php
includes/specials/SpecialRevisiondelete.php
includes/specials/SpecialRunJobs.php
includes/specials/SpecialSearch.php
includes/specials/SpecialShortpages.php
includes/specials/SpecialTrackingCategories.php
includes/specials/SpecialUnblock.php
includes/specials/SpecialUndelete.php
includes/specials/SpecialUnwatchedpages.php
includes/specials/SpecialUpload.php
includes/specials/SpecialUploadStash.php
includes/specials/SpecialUserlogin.php
includes/specials/SpecialUserrights.php
includes/specials/SpecialVersion.php
includes/specials/SpecialWatchlist.php
includes/specials/SpecialWhatlinkshere.php
includes/templates/NoLocalSettings.php
includes/templates/Usercreate.php
includes/templates/Userlogin.php
includes/title/MalformedTitleException.php
includes/title/MediaWikiPageLinkRenderer.php
includes/title/MediaWikiTitleCodec.php
includes/title/PageLinkRenderer.php
includes/title/TitleFormatter.php
includes/title/TitleParser.php
includes/title/TitleValue.php
includes/upload/UploadBase.php
includes/upload/UploadFromChunks.php
includes/upload/UploadFromFile.php
includes/upload/UploadFromStash.php
includes/upload/UploadFromUrl.php
includes/upload/UploadStash.php
includes/utils/ArrayUtils.php
includes/utils/Cdb.php
includes/utils/CdbPHP.php
includes/utils/ConfEditor.php [deleted file]
includes/utils/IP.php
includes/utils/UIDGenerator.php
includes/utils/ZipDirectoryReader.php
languages/FakeConverter.php [new file with mode: 0644]
languages/Language.php
languages/LanguageConverter.php
languages/classes/LanguageBe_tarask.php
languages/classes/LanguageBs.php
languages/classes/LanguageCu.php
languages/classes/LanguageDsb.php
languages/classes/LanguageFi.php
languages/classes/LanguageGan.php
languages/classes/LanguageHsb.php
languages/classes/LanguageIu.php
languages/classes/LanguageKk.php
languages/classes/LanguageKk_cyrl.php
languages/classes/LanguageKsh.php
languages/classes/LanguageKu.php
languages/classes/LanguageKu_ku.php
languages/classes/LanguageShi.php
languages/classes/LanguageSl.php
languages/classes/LanguageTyv.php
languages/classes/LanguageUk.php
languages/classes/LanguageZh.php
languages/classes/LanguageZh_hans.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/bjn.json
languages/i18n/bn.json
languages/i18n/bo.json
languages/i18n/bpy.json
languages/i18n/br.json
languages/i18n/bs.json
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/cv.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/lo.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/tcy.json
languages/i18n/te.json
languages/i18n/tg-cyrl.json
languages/i18n/tg-latn.json
languages/i18n/th.json
languages/i18n/tk.json
languages/i18n/tl.json
languages/i18n/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/MessagesCy.php
languages/messages/MessagesEl.php
languages/messages/MessagesEn.php
languages/messages/MessagesEt.php
languages/messages/MessagesId.php
languages/messages/MessagesLzh.php
languages/messages/MessagesNn.php
languages/messages/MessagesTh.php
languages/messages/MessagesTyv.php
languages/messages/MessagesYue.php
languages/messages/MessagesZh_hans.php
languages/utils/CLDRPluralRuleConverter.php
languages/utils/CLDRPluralRuleConverterExpression.php [new file with mode: 0644]
languages/utils/CLDRPluralRuleConverterFragment.php [new file with mode: 0644]
languages/utils/CLDRPluralRuleConverterOperator.php [new file with mode: 0644]
languages/utils/CLDRPluralRuleConverter_Expression.php [deleted file]
languages/utils/CLDRPluralRuleConverter_Fragment.php [deleted file]
languages/utils/CLDRPluralRuleConverter_Operator.php [deleted file]
languages/utils/CLDRPluralRuleError.php
languages/utils/CLDRPluralRuleEvaluator.php
languages/utils/CLDRPluralRuleEvaluatorRange.php [new file with mode: 0644]
languages/utils/CLDRPluralRuleEvaluator_Range.php [deleted file]
maintenance/7zip.inc
maintenance/Maintenance.php
maintenance/archives/patch-drop-rc_cur_time.sql [new file with mode: 0644]
maintenance/archives/patch-pp_sortkey.sql [new file with mode: 0644]
maintenance/archives/upgradeLogging.php
maintenance/attachLatest.php
maintenance/backup.inc
maintenance/backupPrefetch.inc
maintenance/backupTextPass.inc
maintenance/benchmarks/Benchmarker.php
maintenance/benchmarks/bench_HTTP_HTTPS.php
maintenance/benchmarks/bench_delete_truncate.php
maintenance/benchmarks/bench_if_switch.php
maintenance/benchmarks/bench_strtr_str_replace.php
maintenance/benchmarks/bench_utf8_title_check.php
maintenance/benchmarks/bench_wfBaseConvert.php
maintenance/benchmarks/bench_wfIsWindows.php
maintenance/benchmarks/benchmarkHooks.php
maintenance/benchmarks/benchmarkParse.php
maintenance/benchmarks/benchmarkPurge.php
maintenance/cdb.php
maintenance/checkBadRedirects.php
maintenance/checkImages.php
maintenance/checkLess.php
maintenance/checkSyntax.php
maintenance/checkUsernames.php
maintenance/cleanupAncientTables.php
maintenance/cleanupCaps.php
maintenance/cleanupImages.php
maintenance/cleanupRemovedModules.php
maintenance/cleanupSpam.php
maintenance/cleanupWatchlist.php
maintenance/commandLine.inc
maintenance/compareParserCache.php [new file with mode: 0644]
maintenance/compareParsers.php
maintenance/convertLinks.php
maintenance/convertUserOptions.php
maintenance/copyFileBackend.php
maintenance/copyJobQueue.php
maintenance/createAndPromote.php
maintenance/deleteArchivedFiles.inc
maintenance/deleteArchivedFiles.php
maintenance/deleteArchivedRevisions.inc
maintenance/deleteArchivedRevisions.php
maintenance/deleteBatch.php
maintenance/deleteDefaultMessages.php
maintenance/deleteEqualMessages.php
maintenance/deleteImageMemcached.php
maintenance/deleteOrphanedRevisions.php
maintenance/deleteRevision.php
maintenance/dev/includes/router.php
maintenance/dictionary/mediawiki.dic
maintenance/doMaintenance.php
maintenance/dumpBackup.php
maintenance/dumpIterator.php
maintenance/dumpTextPass.php
maintenance/dumpUploads.php
maintenance/fetchText.php
maintenance/findHooks.php
maintenance/fixDoubleRedirects.php
maintenance/fixExtLinksProtocolRelative.php
maintenance/fixSlaveDesync.php
maintenance/fixTimestamps.php
maintenance/fixUserRegistration.php
maintenance/generateJsonI18n.php
maintenance/generateSitemap.php
maintenance/getConfiguration.php
maintenance/getSlaveServer.php
maintenance/getText.php
maintenance/importDump.php
maintenance/importImages.inc
maintenance/importImages.php
maintenance/importSiteScripts.php
maintenance/importTextFile.php
maintenance/initSiteStats.php
maintenance/install.php
maintenance/interwiki.list
maintenance/interwiki.sql
maintenance/jsduck/MetaTags.rb [deleted file]
maintenance/jsduck/categories.json
maintenance/jsduck/config.json
maintenance/jsduck/eg-iframe.html
maintenance/lag.php
maintenance/language/StatOutputs.php
maintenance/language/countMessages.php [deleted file]
maintenance/language/generateCollationData.php
maintenance/language/languages.inc
maintenance/language/messageTypes.inc [deleted file]
maintenance/language/messages.inc [deleted file]
maintenance/language/rebuildLanguage.php [deleted file]
maintenance/language/validate.php [deleted file]
maintenance/language/writeMessagesArray.inc [deleted file]
maintenance/mctest.php
maintenance/mergeMessageFileList.php
maintenance/minify.php
maintenance/moveBatch.php
maintenance/mssql/archives/patch-user_password_expires.sql [new file with mode: 0644]
maintenance/mssql/tables.sql
maintenance/mwdocgen.php
maintenance/mwjsduck-gen
maintenance/namespaceDupes.php
maintenance/nukeNS.php
maintenance/oracle/alterSharedConstraints.php
maintenance/oracle/archives/patch-page_links_updated.sql [new file with mode: 0644]
maintenance/oracle/archives/patch-rc_source.sql [new file with mode: 0644]
maintenance/oracle/archives/patch-user_password_expire.sql
maintenance/oracle/tables.sql
maintenance/orphans.php
maintenance/pageExists.php [new file with mode: 0644]
maintenance/parse.php
maintenance/patchSql.php
maintenance/populateCategory.php
maintenance/populateFilearchiveSha1.php
maintenance/populateImageSha1.php
maintenance/populateLogSearch.php
maintenance/populateLogUsertext.php
maintenance/populateParentId.php
maintenance/populateRecentChangesSource.php
maintenance/populateRevisionLength.php
maintenance/populateRevisionSha1.php
maintenance/postgres/tables.sql
maintenance/preprocessDump.php
maintenance/preprocessorFuzzTest.php
maintenance/purgeChangedFiles.php
maintenance/purgeChangedPages.php
maintenance/purgeList.php
maintenance/purgeOldText.inc
maintenance/purgeParserCache.php
maintenance/reassignEdits.php
maintenance/rebuildImages.php
maintenance/rebuildLocalisationCache.php
maintenance/rebuildall.php
maintenance/rebuildrecentchanges.php
maintenance/rebuildtextindex.php
maintenance/refreshImageMetadata.php
maintenance/refreshLinks.php
maintenance/removeUnusedAccounts.php
maintenance/renderDump.php
maintenance/resetUserTokens.php
maintenance/resources/update-oojs-ui.sh [new file with mode: 0755]
maintenance/resources/update-oojs.sh
maintenance/rollbackEdits.php
maintenance/runBatchedQuery.php
maintenance/runJobs.php
maintenance/showCacheStats.php
maintenance/showJobs.php
maintenance/showSiteStats.php
maintenance/sql.php
maintenance/sqlite.inc
maintenance/sqlite.php
maintenance/sqlite/archives/patch-drop-rc_cur_time.sql [new file with mode: 0644]
maintenance/storage/checkStorage.php
maintenance/storage/compressOld.php
maintenance/storage/fixBug20757.php
maintenance/storage/orphanStats.php
maintenance/storage/recompressTracked.php
maintenance/storage/resolveStubs.php
maintenance/storage/testCompression.php
maintenance/storage/trackBlobs.php
maintenance/syncFileBackend.php
maintenance/tables.sql
maintenance/update.php [changed mode: 0644->0755]
maintenance/updateArticleCount.php
maintenance/updateCollation.php
maintenance/updateDoubleWidthSearch.php
maintenance/updateRestrictions.php
maintenance/updateSearchIndex.php
maintenance/updateSpecialPages.php
maintenance/userDupes.inc
maintenance/userOptions.inc
maintenance/waitForSlave.php
mw-config/index.php
mw-config/overrides.php
resources/Resources.php
resources/lib/jquery/jquery.js
resources/lib/jquery/jquery.migrate.js [new file with mode: 0644]
resources/lib/oojs-ui/i18n/ast.json
resources/lib/oojs-ui/i18n/bn.json
resources/lib/oojs-ui/i18n/br.json
resources/lib/oojs-ui/i18n/ce.json
resources/lib/oojs-ui/i18n/ckb.json
resources/lib/oojs-ui/i18n/cs.json
resources/lib/oojs-ui/i18n/de.json
resources/lib/oojs-ui/i18n/diq.json
resources/lib/oojs-ui/i18n/egl.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/eml.json
resources/lib/oojs-ui/i18n/en.json
resources/lib/oojs-ui/i18n/es.json
resources/lib/oojs-ui/i18n/et.json
resources/lib/oojs-ui/i18n/fa.json
resources/lib/oojs-ui/i18n/fi.json
resources/lib/oojs-ui/i18n/fr.json
resources/lib/oojs-ui/i18n/he.json
resources/lib/oojs-ui/i18n/ilo.json
resources/lib/oojs-ui/i18n/it.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/krc.json
resources/lib/oojs-ui/i18n/lb.json
resources/lib/oojs-ui/i18n/lzh.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/mk.json
resources/lib/oojs-ui/i18n/ms.json
resources/lib/oojs-ui/i18n/ne.json
resources/lib/oojs-ui/i18n/nl.json
resources/lib/oojs-ui/i18n/oc.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/pfl.json
resources/lib/oojs-ui/i18n/pl.json
resources/lib/oojs-ui/i18n/pt.json
resources/lib/oojs-ui/i18n/qqq.json
resources/lib/oojs-ui/i18n/ro.json
resources/lib/oojs-ui/i18n/ru.json
resources/lib/oojs-ui/i18n/scn.json
resources/lib/oojs-ui/i18n/sco.json
resources/lib/oojs-ui/i18n/sq.json
resources/lib/oojs-ui/i18n/sr-ec.json
resources/lib/oojs-ui/i18n/sr-el.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/sv.json
resources/lib/oojs-ui/i18n/tg-cyrl.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/tl.json
resources/lib/oojs-ui/i18n/vec.json
resources/lib/oojs-ui/i18n/vi.json
resources/lib/oojs-ui/i18n/yi.json
resources/lib/oojs-ui/i18n/zh-hans.json
resources/lib/oojs-ui/i18n/zh-hant.json
resources/lib/oojs-ui/images/fade-down.png [deleted file]
resources/lib/oojs-ui/images/fade-up.png [deleted file]
resources/lib/oojs-ui/images/icons/info.png [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/info.svg [new file with mode: 0644]
resources/lib/oojs-ui/images/indicators/alert.png [new file with mode: 0644]
resources/lib/oojs-ui/images/indicators/alert.svg [new file with mode: 0644]
resources/lib/oojs-ui/images/indicators/required.png
resources/lib/oojs-ui/images/indicators/required.svg
resources/lib/oojs-ui/oojs-ui-agora.css
resources/lib/oojs-ui/oojs-ui-apex.css
resources/lib/oojs-ui/oojs-ui.js
resources/lib/oojs-ui/oojs-ui.svg.css
resources/lib/oojs-ui/themes/agora/images/icons/check.svg [new file with mode: 0644]
resources/lib/oojs-ui/update-oojs-ui.sh [deleted file]
resources/src/jquery.tipsy/jquery.tipsy.css
resources/src/jquery.tipsy/jquery.tipsy.js
resources/src/jquery.ui-themes/vector/jquery.ui.button.css
resources/src/jquery.ui-themes/vector/jquery.ui.theme.css
resources/src/jquery/jquery.accessKeyLabel.js [new file with mode: 0644]
resources/src/jquery/jquery.arrowSteps.js
resources/src/jquery/jquery.badge.css
resources/src/jquery/jquery.byteLength.js
resources/src/jquery/jquery.checkboxShiftClick.js
resources/src/jquery/jquery.client.js
resources/src/jquery/jquery.colorUtil.js
resources/src/jquery/jquery.footHovzer.js
resources/src/jquery/jquery.getAttrs.js
resources/src/jquery/jquery.hidpi.js
resources/src/jquery/jquery.highlightText.js
resources/src/jquery/jquery.makeCollapsible.css
resources/src/jquery/jquery.makeCollapsible.js
resources/src/jquery/jquery.placeholder.js
resources/src/jquery/jquery.qunit.completenessTest.js
resources/src/jquery/jquery.suggestions.js
resources/src/jquery/jquery.tabIndex.js
resources/src/jquery/jquery.tablesorter.js
resources/src/jquery/jquery.textSelection.js
resources/src/mediawiki.action/mediawiki.action.edit.editWarning.js
resources/src/mediawiki.action/mediawiki.action.edit.preview.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.history.js
resources/src/mediawiki.action/mediawiki.action.view.dblClickEdit.js
resources/src/mediawiki.action/mediawiki.action.view.metadata.js
resources/src/mediawiki.action/mediawiki.action.view.postEdit.css
resources/src/mediawiki.action/mediawiki.action.view.postEdit.js
resources/src/mediawiki.action/mediawiki.action.view.redirectToFragment.js
resources/src/mediawiki.action/mediawiki.action.view.rightClickEdit.js
resources/src/mediawiki.api/mediawiki.api.category.js
resources/src/mediawiki.api/mediawiki.api.js
resources/src/mediawiki.api/mediawiki.api.watch.js
resources/src/mediawiki.language/languages/he.js
resources/src/mediawiki.language/mediawiki.language.init.js
resources/src/mediawiki.less/mediawiki.mixins.less
resources/src/mediawiki.page/mediawiki.page.gallery.js
resources/src/mediawiki.page/mediawiki.page.image.pagination.js
resources/src/mediawiki.page/mediawiki.page.patrol.ajax.js
resources/src/mediawiki.page/mediawiki.page.startup.js
resources/src/mediawiki.page/mediawiki.page.watch.ajax.js
resources/src/mediawiki.skinning/content.parsoid.less [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.block.css
resources/src/mediawiki.special/mediawiki.special.block.js
resources/src/mediawiki.special/mediawiki.special.changeemail.css
resources/src/mediawiki.special/mediawiki.special.changeemail.js
resources/src/mediawiki.special/mediawiki.special.changeslist.css
resources/src/mediawiki.special/mediawiki.special.changeslist.enhanced.css
resources/src/mediawiki.special/mediawiki.special.changeslist.legend.css
resources/src/mediawiki.special/mediawiki.special.changeslist.legend.js
resources/src/mediawiki.special/mediawiki.special.css
resources/src/mediawiki.special/mediawiki.special.javaScriptTest.js
resources/src/mediawiki.special/mediawiki.special.js
resources/src/mediawiki.special/mediawiki.special.movePage.js
resources/src/mediawiki.special/mediawiki.special.preferences.css
resources/src/mediawiki.special/mediawiki.special.preferences.js
resources/src/mediawiki.special/mediawiki.special.recentchanges.js
resources/src/mediawiki.special/mediawiki.special.search.css
resources/src/mediawiki.special/mediawiki.special.search.js
resources/src/mediawiki.special/mediawiki.special.undelete.js
resources/src/mediawiki.special/mediawiki.special.unwatchedPages.css [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.unwatchedPages.js [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.upload.js
resources/src/mediawiki.special/mediawiki.special.userlogin.common.css
resources/src/mediawiki.special/mediawiki.special.userlogin.common.js
resources/src/mediawiki.special/mediawiki.special.userlogin.signup.js
resources/src/mediawiki.special/mediawiki.special.version.css
resources/src/mediawiki.ui/components/default/buttons.less
resources/src/mediawiki.ui/components/default/forms.less
resources/src/mediawiki.ui/mixins/utilities.less
resources/src/mediawiki.ui/styleguide.md
resources/src/mediawiki.ui/vector.less
resources/src/mediawiki/mediawiki.cookie.js [new file with mode: 0644]
resources/src/mediawiki/mediawiki.debug.profile.css
resources/src/mediawiki/mediawiki.debug.profile.js
resources/src/mediawiki/mediawiki.htmlform.js
resources/src/mediawiki/mediawiki.jqueryMsg.js
resources/src/mediawiki/mediawiki.js
resources/src/mediawiki/mediawiki.log.js
resources/src/mediawiki/mediawiki.searchSuggest.js
resources/src/mediawiki/mediawiki.toc.js
resources/src/mediawiki/mediawiki.user.js
resources/src/mediawiki/mediawiki.util.js
skins/.gitignore
skins/CologneBlue.php [deleted file]
skins/Modern.php [deleted file]
skins/MonoBook.php
skins/Vector.php
skins/cologneblue/print.css [deleted file]
skins/cologneblue/screen.css [deleted file]
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/feed.css
skins/common/oldshared.css
skins/common/shared.css
skins/common/wikibits.js
skins/modern/audio.png [deleted file]
skins/modern/bullet.gif [deleted file]
skins/modern/discussionitem_icon.gif [deleted file]
skins/modern/document.png [deleted file]
skins/modern/external.png [deleted file]
skins/modern/file_icon.gif [deleted file]
skins/modern/footer-grad.png [deleted file]
skins/modern/link_icon.gif [deleted file]
skins/modern/lock_icon.gif [deleted file]
skins/modern/mail_icon.gif [deleted file]
skins/modern/main.css [deleted file]
skins/modern/news_icon.png [deleted file]
skins/modern/print.css [deleted file]
skins/modern/video.png [deleted file]
skins/monobook/IE60Fixes.css
skins/monobook/IE70Fixes.css
skins/monobook/main.css
skins/vector/collapsibleNav.js [deleted file]
skins/vector/collapsibleTabs.js
skins/vector/components/collapsibleNav.less [deleted file]
skins/vector/components/common.less
skins/vector/components/navigation.less
skins/vector/components/notifications.less
skins/vector/components/watchstar.less
skins/vector/screen-hd.less
skins/vector/screen.less [new file with mode: 0644]
skins/vector/styles.less [deleted file]
skins/vector/variables.less
skins/vector/vector.js
tests/TestsAutoLoader.php
tests/frontend/package.json
tests/parser/parserTest.inc
tests/parser/parserTests.txt
tests/phpunit/MediaWikiLangTestCase.php
tests/phpunit/MediaWikiPHPUnitCommand.php
tests/phpunit/MediaWikiPHPUnitTestListener.php
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/ResourceLoaderTestCase.php
tests/phpunit/TODO
tests/phpunit/bootstrap.php
tests/phpunit/data/gitinfo/info-testValidJsonData.json [new file with mode: 0644]
tests/phpunit/data/media/Portrait.png [new file with mode: 0644]
tests/phpunit/includes/ArticleTest.php
tests/phpunit/includes/BlockTest.php
tests/phpunit/includes/EditPageTest.php
tests/phpunit/includes/ExternalStoreTest.php
tests/phpunit/includes/ExtraParserTest.php
tests/phpunit/includes/FallbackTest.php
tests/phpunit/includes/FauxRequestTest.php
tests/phpunit/includes/FauxResponseTest.php
tests/phpunit/includes/GitInfoTest.php [new file with mode: 0644]
tests/phpunit/includes/GlobalFunctions/GlobalTest.php
tests/phpunit/includes/GlobalFunctions/wfBaseConvertTest.php
tests/phpunit/includes/GlobalFunctions/wfBaseNameTest.php
tests/phpunit/includes/GlobalFunctions/wfExpandUrlTest.php
tests/phpunit/includes/GlobalFunctions/wfGetCallerTest.php
tests/phpunit/includes/GlobalFunctions/wfTimestampTest.php
tests/phpunit/includes/GlobalFunctions/wfUrlencodeTest.php
tests/phpunit/includes/HooksTest.php
tests/phpunit/includes/HtmlFormatterTest.php
tests/phpunit/includes/HtmlTest.php
tests/phpunit/includes/HttpTest.php
tests/phpunit/includes/ImportTest.php [new file with mode: 0644]
tests/phpunit/includes/LinkerTest.php
tests/phpunit/includes/LinksUpdateTest.php
tests/phpunit/includes/LocalFileTest.php
tests/phpunit/includes/MWNamespaceTest.php
tests/phpunit/includes/MessageTest.php
tests/phpunit/includes/PathRouterTest.php
tests/phpunit/includes/RequestContextTest.php
tests/phpunit/includes/RevisionStorageTest.php
tests/phpunit/includes/RevisionStorageTestContentHandlerUseDB.php [new file with mode: 0644]
tests/phpunit/includes/RevisionStorageTest_ContentHandlerUseDB.php [deleted file]
tests/phpunit/includes/RevisionTest.php
tests/phpunit/includes/SampleTest.php
tests/phpunit/includes/SanitizerTest.php
tests/phpunit/includes/SiteConfigurationTest.php
tests/phpunit/includes/SkinTemplateTest.php
tests/phpunit/includes/StatusTest.php
tests/phpunit/includes/TestUser.php
tests/phpunit/includes/TitleArrayFromResultTest.php
tests/phpunit/includes/TitlePermissionTest.php
tests/phpunit/includes/TitleTest.php
tests/phpunit/includes/UserArrayFromResultTest.php
tests/phpunit/includes/UserTest.php
tests/phpunit/includes/WebRequestTest.php
tests/phpunit/includes/WikiPageTest.php
tests/phpunit/includes/WikiPageTestContentHandlerUseDB.php [new file with mode: 0644]
tests/phpunit/includes/WikiPageTest_ContentHandlerUseDB.php [deleted file]
tests/phpunit/includes/XmlSelectTest.php
tests/phpunit/includes/XmlTest.php
tests/phpunit/includes/api/ApiEditPageTest.php
tests/phpunit/includes/api/ApiLoginTest.php
tests/phpunit/includes/api/ApiOptionsTest.php
tests/phpunit/includes/api/ApiParseTest.php
tests/phpunit/includes/api/ApiPurgeTest.php
tests/phpunit/includes/api/ApiTestCase.php
tests/phpunit/includes/api/ApiTestCaseUpload.php
tests/phpunit/includes/api/ApiUploadTest.php
tests/phpunit/includes/api/PrefixUniquenessTest.php
tests/phpunit/includes/api/RandomImageGenerator.php
tests/phpunit/includes/api/query/ApiQueryContinueTestBase.php
tests/phpunit/includes/changes/RCCacheEntryFactoryTest.php
tests/phpunit/includes/composer/ComposerVersionNormalizerTest.php
tests/phpunit/includes/config/ConfigFactoryTest.php [new file with mode: 0644]
tests/phpunit/includes/config/GlobalConfigTest.php [deleted file]
tests/phpunit/includes/config/GlobalVarConfigTest.php [new file with mode: 0644]
tests/phpunit/includes/content/ContentHandlerTest.php
tests/phpunit/includes/content/CssContentTest.php
tests/phpunit/includes/content/JavaScriptContentTest.php
tests/phpunit/includes/content/TextContentTest.php
tests/phpunit/includes/content/WikitextContentHandlerTest.php
tests/phpunit/includes/content/WikitextContentTest.php
tests/phpunit/includes/db/DatabaseMysqlBaseTest.php
tests/phpunit/includes/db/DatabaseSQLTest.php
tests/phpunit/includes/db/DatabaseSqliteTest.php
tests/phpunit/includes/db/DatabaseTest.php
tests/phpunit/includes/db/DatabaseTestHelper.php
tests/phpunit/includes/diff/ArrayDiffFormatterTest.php
tests/phpunit/includes/filebackend/FileBackendTest.php
tests/phpunit/includes/filerepo/StoreBatchTest.php
tests/phpunit/includes/htmlform/HTMLCheckMatrixTest.php
tests/phpunit/includes/installer/InstallDocFormatterTest.php
tests/phpunit/includes/installer/OracleInstallerTest.php
tests/phpunit/includes/jobqueue/RefreshLinksPartitionTest.php
tests/phpunit/includes/libs/CSSMinTest.php
tests/phpunit/includes/libs/GenericArrayObjectTest.php
tests/phpunit/includes/libs/IPSetTest.php [new file with mode: 0644]
tests/phpunit/includes/libs/JavaScriptMinifierTest.php
tests/phpunit/includes/media/DjVuTest.php
tests/phpunit/includes/media/ExifBitmapTest.php
tests/phpunit/includes/media/ExifRotationTest.php
tests/phpunit/includes/media/FormatMetadataTest.php
tests/phpunit/includes/media/GIFTest.php
tests/phpunit/includes/media/IPTCTest.php
tests/phpunit/includes/media/JpegMetadataExtractorTest.php
tests/phpunit/includes/media/JpegTest.php
tests/phpunit/includes/media/MediaWikiMediaTestCase.php [new file with mode: 0644]
tests/phpunit/includes/media/PNGTest.php
tests/phpunit/includes/media/SVGMetadataExtractorTest.php
tests/phpunit/includes/media/SVGTest.php
tests/phpunit/includes/media/TiffTest.php
tests/phpunit/includes/normal/CleanUpTest.php
tests/phpunit/includes/objectcache/BagOStuffTest.php
tests/phpunit/includes/parser/MagicVariableTest.php
tests/phpunit/includes/parser/NewParserTest.php
tests/phpunit/includes/parser/ParserMethodsTest.php
tests/phpunit/includes/parser/PreprocessorTest.php
tests/phpunit/includes/parser/TagHooksTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderLESSTest.php [new file with mode: 0644]
tests/phpunit/includes/resourceloader/ResourceLoaderStartupModuleTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderTest.php
tests/phpunit/includes/resourceloader/fixtures/001-embeddable.css [new file with mode: 0644]
tests/phpunit/includes/resourceloader/fixtures/001-embeddable.less [new file with mode: 0644]
tests/phpunit/includes/search/SearchEngineTest.php
tests/phpunit/includes/site/MediaWikiSiteTest.php
tests/phpunit/includes/specials/QueryAllSpecialPagesTest.php
tests/phpunit/includes/specials/SpecialSearchTest.php
tests/phpunit/includes/title/MediaWikiTitleCodecTest.php
tests/phpunit/includes/upload/UploadFromUrlTest.php
tests/phpunit/install-phpunit.sh
tests/phpunit/languages/LanguageBe_taraskTest.php
tests/phpunit/languages/LanguageGdTest.php
tests/phpunit/languages/LanguageHeTest.php
tests/phpunit/languages/LanguageTest.php
tests/phpunit/languages/utils/CLDRPluralRuleEvaluatorTest.php
tests/phpunit/maintenance/DumpTestCase.php
tests/phpunit/maintenance/backupPrefetchTest.php
tests/phpunit/maintenance/backupTextPassTest.php
tests/phpunit/maintenance/backup_PageTest.php
tests/phpunit/maintenance/fetchTextTest.php
tests/phpunit/mocks/media/MockDjVuHandler.php [new file with mode: 0644]
tests/phpunit/phpunit.php
tests/phpunit/structure/AutoLoaderTest.php
tests/phpunit/structure/ResourcesTest.php
tests/phpunit/structure/StructureTest.php
tests/phpunit/suite.xml
tests/phpunit/suites/ExtensionsTestSuite.php
tests/qunit/QUnitTestResources.php
tests/qunit/suites/resources/jquery/jquery.accessKeyLabel.test.js [new file with mode: 0644]
tests/qunit/suites/resources/jquery/jquery.autoEllipsis.test.js
tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js
tests/qunit/suites/resources/jquery/jquery.textSelection.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.category.test.js [new file with mode: 0644]
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.parse.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.watch.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.cookie.test.js [new file with mode: 0644]
tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.toc.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.user.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js
tests/testHelpers.inc
thumb.php

diff --git a/.gitattributes b/.gitattributes
new file mode 100644 (file)
index 0000000..50ca329
--- /dev/null
@@ -0,0 +1 @@
+*.sh eol=lf
diff --git a/.jscsrc b/.jscsrc
index b5481ea..0da9aa5 100644 (file)
--- a/.jscsrc
+++ b/.jscsrc
@@ -1,30 +1,94 @@
 {
-       "requireCurlyBraces": ["if", "else", "for", "while", "do"],
-       "requireSpaceAfterKeywords": ["if", "else", "for", "while", "do", "switch", "return", "function"],
-       "requireParenthesesAroundIIFE": true,
-       "requireSpacesInFunctionExpression": {
-               "beforeOpeningCurlyBrace": true
-       },
-       "requireMultipleVarDecl": true,
-       "disallowEmptyBlocks": true,
-       "requireSpacesInsideObjectBrackets": "all",
-       "disallowSpaceAfterObjectKeys": true,
-       "requireCommaBeforeLineBreak": true,
-       "disallowLeftStickedOperators": ["?", ">", ">=", "<", "<="],
-       "disallowRightStickedOperators": ["?", "/", "*", ":", "=", "==", "===", "!=", "!==", ">", ">=", "<", "<="],
-       "requireRightStickedOperators": ["!"],
-       "requireLeftStickedOperators": [","],
-       "disallowSpaceAfterPrefixUnaryOperators": ["++", "--", "+", "-", "~"],
-       "disallowSpaceBeforePostfixUnaryOperators": ["++", "--"],
-       "requireSpaceBeforeBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
-       "requireSpaceAfterBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
-       "disallowKeywords": [ "with" ],
-       "disallowMultipleLineBreaks": true,
-       "validateLineBreaks": "LF",
-       "validateQuoteMarks": "'",
-       "disallowMixedSpacesAndTabs": "smart",
-       "disallowTrailingWhitespace": true,
-       "requireLineFeedAtFileEnd": true,
-       "requireCapitalizedConstructors": true,
-       "requireDotNotation": true
+    "requireCurlyBraces": [
+        "if",
+        "else",
+        "for",
+        "while",
+        "do",
+        "try",
+        "catch"
+    ],
+    "requireSpaceAfterKeywords": [
+        "if",
+        "else",
+        "for",
+        "while",
+        "do",
+        "switch",
+        "return",
+        "try",
+        "catch",
+        "function"
+    ],
+    "requireSpaceBeforeBlockStatements": true,
+    "requireParenthesesAroundIIFE": true,
+    "requireSpacesInConditionalExpression": true,
+    "disallowSpacesInNamedFunctionExpression": {
+        "beforeOpeningRoundBrace": true
+    },
+    "disallowSpacesInFunctionDeclaration": {
+        "beforeOpeningRoundBrace": true
+    },
+    "requireMultipleVarDecl": "onevar",
+    "requireBlocksOnNewline": 1,
+    "disallowEmptyBlocks": true,
+    "requireSpacesInsideObjectBrackets": "all",
+    "disallowSpaceAfterObjectKeys": true,
+    "requireCommaBeforeLineBreak": true,
+    "disallowSpaceAfterPrefixUnaryOperators": [
+        "++",
+        "--",
+        "+",
+        "-",
+        "~",
+        "!"
+    ],
+    "disallowSpaceBeforePostfixUnaryOperators": [
+        "++",
+        "--"
+    ],
+    "disallowSpaceBeforeBinaryOperators": [
+        ","
+    ],
+    "requireSpaceBeforeBinaryOperators": [
+        "=",
+        "+",
+        "-",
+        "/",
+        "*",
+        "==",
+        "===",
+        "!=",
+        "!==",
+        ">",
+        ">=",
+        "<",
+        "<="
+    ],
+    "requireSpaceAfterBinaryOperators": [
+        "=",
+        "+",
+        "-",
+        "/",
+        "*",
+        "==",
+        "===",
+        "!=",
+        "!==",
+        ">",
+        ">=",
+        "<",
+        "<="
+    ],
+    "disallowKeywords": [ "with" ],
+    "disallowMultipleLineBreaks": true,
+    "validateLineBreaks": "LF",
+    "validateQuoteMarks": "'",
+    "disallowMixedSpacesAndTabs": true,
+    "disallowTrailingWhitespace": true,
+    "disallowTrailingComma": true,
+    "requireLineFeedAtFileEnd": true,
+    "requireCapitalizedConstructors": true,
+    "requireDotNotation": true,
+    "disallowYodaConditions": true
 }
index 4eec7a0..c136dfc 100644 (file)
--- a/.jshintrc
+++ b/.jshintrc
@@ -1,37 +1,30 @@
 {
-       /* Common */
-
        // Enforcing
+       "bitwise": true,
        "eqeqeq": true,
        "es3": true,
+       "freeze": true,
        "latedef": true,
        "noarg": true,
        "nonew": true,
        "undef": true,
        "unused": true,
-
-       /* Local */
-
-       // FIXME: Deprecated, handle these with node-jscs instead.
-       // Handled here because we still have inline overrides in some places.
-       "camelcase": true,
-       "nomen": true,
-
-       // Enforcing
-       "bitwise": true,
-       "forin": false,
-       "regexp": false,
        "strict": false,
+
        // Relaxing
        "laxbreak": true,
-       "smarttabs": true,
        "multistr": true,
+
        // Environment
        "browser": true,
 
-       "predef": [
-               "mediaWiki",
-               "jQuery",
-               "QUnit"
-       ]
+       "globals": {
+               "mediaWiki": true,
+               "jQuery": false,
+               "QUnit": false
+       },
+
+       // Legacy (to be handled by jscs once supported)
+       "camelcase": true,
+       "nomen": true
 }
index 2b1dba3..baf69c5 100644 (file)
@@ -9,6 +9,9 @@ MediaWiki 1.23 is an alpha-quality branch and is not recommended for use in
 production.
 
 === Configuration changes in 1.23 ===
+* (bug 13250) Restored method for clearing a watchlist in web UI
+  so that users with large watchlists don't have to perform
+  contortions to clear them.
 * When $wgJobRunRate is higher that zero, jobs are now executed via an
   asynchronous HTTP request to a MediaWiki entry point. This may require
   increasing the number of server worker threads. $wgRunJobsAsync has been
@@ -36,6 +39,12 @@ production.
 * $wgPasswordSenderName has been removed and is no longer functional. To set a
   custom mailer name, the system message 'emailsender' should be modified
   (default: "{{SITENAME}}").
+* (bug 63269) Email notifications were not correctly handling the
+  [[MediaWiki:Helppage]] message being set to a full URL (the default).
+  If you customized [[MediaWiki:Enotif body]] (the text of email notifications),
+  you'll need to edit it locally to include the URL via the new variable
+  $HELPPAGE instead of the parser functions fullurl and canonicalurl; otherwise
+  you don't have to do anything.
 * $wgDBAhandler was removed as the only class using it was also removed
 * The 'max threads' setting was removed from $wgDBservers.
 * Support for AdminSettings.php has been completely removed. All configuration
@@ -57,6 +66,7 @@ production.
 * $wgProfileOnly is now deprecated; set the log file in
   $wgDebugLogGroups['profileoutput'] to replace it.
 * $wgMaxBacklinksInvalidate was removed; use $wgJobBackoffThrottling instead
+* Deprecated ResourceLoaderGetStartupModules hook.
 
 === New features in 1.23 ===
 * ResourceLoader can utilize the Web Storage API to cache modules client-side.
@@ -100,9 +110,6 @@ production.
   'user' or 'bot'. The API will throw an error if the user is not logged
   in (user) or does not have the 'bot' userright (bot). Based off of the
   AssertEdit extension by Steve Sanbeg.
-* WikitextContent will now render redirects with the expected "redirect"
-  header, rather than as an ordered list. Code calling Article::viewRedirect
-  can probably be changed to no longer special-case redirects.
 * [[Special:Diff]] was added, allowing users to create internal links to
   revision comparison pages using syntax such as [[Special:Diff/12345]],
   [[Special:Diff/12345/prev]] or [[Special:Diff/12345/98765]].
@@ -137,7 +144,7 @@ production.
 * Added BaseTemplateAfterPortlet hook to allow injecting html after portlets in skins.
 * Support has been added for a JSON based localisation file format. The
   installer has been updated to use it.
-* Changes to content typography (fonts, line-height, etc.). See
+* Changes to content typography (colors, line-height etc.). See
   https://www.mediawiki.org/wiki/Typography_refresh for further information.
 * The Vector skin's visual treatment of external links has been simplified to a
   single icon (from nine). This should not affect local rules unless they were
@@ -180,8 +187,6 @@ production.
   the JavaScript evaluator were updated to support the new format. Plural rules
   for some languages have changed, most notably Russian. Affected software
   messages have been updated and marked for review at translatewiki.net.
-* (bug 14323) Redirect pages, when viewed with redirect=no, no longer hide the
-  remaining page content.
 * (bug 23542) imagelinks now stores both the redirect and target (as
   templatelinks does).
 * (bug 58167) The web installer no longer throws an exception when PHP is
@@ -198,6 +203,9 @@ production.
   no longer applies in such cases.
 * (bug 60960) Avoid doing file_exist() checks on data: URIs, as they cause
   warnings to be printed on Windows due to large path length.
+* (bug 48084) Fixed a bug in the installer that could cause $wgLogo to hold
+  the wrong path to the placeholder logo (skins/common/images/wiki.png).
+* (bug 64289) jquery.textSelection: Don't throw errors on empty collections.
 
 === Web API changes in 1.23 ===
 * (bug 54884) action=parse&prop=categories now indicates hidden and missing
@@ -282,14 +290,14 @@ changes to languages because of Bugzilla reports.
 * (bug 52812) Removed "Disable search suggestions" from Preference.
 * (bug 52809) Removed "Disable browser page caching" from Preference.
 * Three new modules intended for use by custom skins were added:
-  'skins.common.elements', 'skins.common.content', and 'skins.common.interface',
-  representing three levels of standard MediaWiki styling. Previously skin
-  creators wishing to use them had to refer to the file names of appropriate
-  files directly, which is now discouraged.
+  'mediawiki.skinning.elements', 'mediawiki.skinning.content', and
+  'mediawiki.skinning.interface', representing three levels of standard
+  MediaWiki styling. Previously skin creators wishing to use them had to refer
+  to the file names of appropriate files directly, which is now discouraged.
 * The modules 'skins.vector' and 'skins.monobook' have been renamed to
   'skins.vector.styles' and 'skins.monobook.styles', respectively,
   and their definition was changed not to include the common*.css files;
-  the two skins now load the 'skins.common.interface' module instead.
+  the two skins now load the 'mediawiki.skinning.interface' module instead.
 * A page_links_updated field has been added to the page table.
 * SpecialPage::getTitle has been deprecated in favor of
   SpecialPage::getPageTitle.
@@ -503,7 +511,7 @@ Don't forget to always back up your database before upgrading!
 
 See the file UPGRADE for more detailed upgrade instructions.
 
-For notes on 1.21.x and older releases, see HISTORY.
+For notes on 1.22.x and older releases, see HISTORY.
 
 == Online documentation ==
 
index 500d19f..ba9dbad 100644 (file)
@@ -9,17 +9,81 @@ MediaWiki 1.24 is an alpha-quality branch and is not recommended for use in
 production.
 
 === Configuration changes in 1.24 ===
+* The server's canonical hostname is available as $wgServerName, which is
+  exposed in both mw.config and ApiQuerySiteInfo.
+* Introduced $wgPagePropsHaveSortkey as a backwards-compatibility switch,
+  for using the old schema of the page_props table, in case the respective
+  schema update was not applied.
 
 === New features in 1.24 ===
+* Added a new hook, "WhatLinksHereProps", to allow extensions to annotate
+  WhatLinksHere entries.
+* Added a new hook, "ContentGetParserOutput", to customize parser output for
+  a given content object.
+* Deprecated the hook "ShowRawCssJs", use "ContentGetParserOutput" instead.
+* HTMLForm's HTMLTextField now supports the 'url' type.
+* HTMLForm fields may now be dynamically hidden based on the values of other
+  fields in the form.
+* HTMLForm now supports multiple copies of an input field or set of input
+  fields, e.g. the form may request "one or more usernames" without having to
+  have the user enter delimited list of names into a text field.
+* Added a new hook, "SidebarBeforeOutput", to allow to edit the structure of
+  the sidebar just before its display.
+* (bug 49156) Added the mediawiki.cookie ResourceLoader module, which wraps
+  jQuery.cookie so that getting/setting a cookie is syntactically and functionally
+  similar to using the WebRequest#getCookie/WebResponse#setcookie methods.
+* (bug 44740) jQuery upgraded from 1.8.3 to 1.11.1.
+* Changes to content typography (fonts, etc.). See
+  https://www.mediawiki.org/wiki/Typography_refresh for further information.
+* WikitextContent will now render redirects with the expected "redirect"
+  header, rather than as an ordered list. Code calling Article::viewRedirect
+  can probably be changed to no longer special-case redirects.
+* Header font set to a serif font stack. See
+  https://www.mediawiki.org/wiki/Typography_refresh for further information.
+* (bug 63903) Thumbnails without an explicit size specification are
+  now resized to a square bounding box. This gives better results for
+  non-landscape thumbnails.
+* (bug 65567) Added a new hook, "BeforeHttpsRedirect", to allow cancellation of the HTTP
+  to HTTPS redirect due to forceHTTPS cookie, userRequires, etc.  This is only for page views,
+  since this hook doesn't affect UserLogin, OAuth, CentralAuth, etc.
+  ATTENTION: This hook is likely to be removed soon due to overall design of the system.
 
 === Bug fixes in 1.24 ===
+* (bug 49116) Footer copyright notice is now always displayed in user language
+  rather than content language (same as copyright notice for editing interface).
 * (bug 62258) A bug was fixed in File::getUnscaledThumb when a height
   restriction was present in the parameters.  Images with both the "frame"
   option and a size specification set will now always ignore the provided
   size and display an unscaled image, as the documentation has always
   claimed it would.
+* (bug 39035) Improved Vector skin performance by removing collapsibleNav,
+  which used to collapse some sidebar elements by default.
+  This removes -list id suffixes like p-lang-list: instead of using things like
+  #p-lang-list, you can do #p-lang .body ul.
+* (bug 890) Links in Special:RecentChanges and Special:Watchlist no longer
+  follow redirects to their target pages.
+* Parser now dies early if called recursively, instead of producing subtle bugs.
+* (bug 14323) Redirect pages, when viewed with redirect=no, no longer hide the
+  remaining page content.
+* (bug 52587) Maintenance script deleteBatch.php no longer follows redirects
+  in the file namespace and delete the file on the target page. It will still
+  however delete the redirect page.
 
 === Web 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
+  a particular interwiki map entry.
+* ApiQueryLogEvents 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
+  specified.
+* action=logevents has a new parameter, lenamespace, to allow filtering by
+  namespace.
 
 === Languages updated in 1.24 ===
 
@@ -32,6 +96,59 @@ changes to languages because of Bugzilla reports.
 * The deprecated function mw.util.toggleToc was removed.
 * The Special:Search hooks SpecialSearchGo and SpecialSearchResultsAppend
   were removed as they were unused.
+* (bug 65477) User::pingLimiter() now has an additional profile point varying
+  by action being used.
+* mediawiki.util.$content no longer supports old versions of the Vector,
+  Monobook, Modern and CologneBlue skins that don't yet implement the "mw-body"
+  and/or "mw-body-primary" class name in their html.
+* Added pp_sortkey column to page_props table, so pages can be efficiently
+  queried and sorted by property value (bug 58032).
+  See $wgPagePropsHaveSortkey if you want to postpone the schema change.
+* BREAKING CHANGE: The Modern and Cologne Blue skins were moved out of MediaWiki
+  core to their own respective repositories. See also
+  https://www.mediawiki.org/wiki/Skin:Modern and
+  https://www.mediawiki.org/wiki/Skin:CologneBlue.
+
+==== Renamed classes ====
+* CLDRPluralRuleConverter_Expression to CLDRPluralRuleConverterExpression
+* CLDRPluralRuleConverter_Fragment to CLDRPluralRuleConverterFragment
+* CLDRPluralRuleConverter_Operator to CLDRPluralRuleConverterOperator
+* CLDRPluralRuleEvaluator_Range to CLDRPluralRuleEvaluatorRange
+* CSSJanus_Tokenizer to CSSJanusTokenizer
+* MediaWiki_I18N to MediaWikiI18N
+* RevDel_ArchiveItem to RevDelArchiveItem
+* RevDel_ArchiveList to RevDelArchiveList
+* RevDel_ArchivedFileItem to RevDelArchivedFileItem
+* RevDel_ArchivedFileList to RevDelArchivedFileList
+* RevDel_ArchivedRevisionItem to RevDelArchivedRevisionItem
+* RevDel_FileItem to RevDelFileItem
+* RevDel_FileList to RevDelFileList
+* RevDel_Item to RevDelItem
+* RevDel_List to RevDelList
+* RevDel_LogItem to RevDelLogItem
+* RevDel_LogList to RevDelLogList
+* RevDel_RevisionItem to RevDelRevisionItem
+* RevDel_RevisionList to RevDelRevisionList
+* WebInstaller_Complete to WebInstallerComplete
+* WebInstaller_Copying to WebInstallerCopying
+* WebInstaller_DBConnect to WebInstallerDBConnect
+* WebInstaller_DBSettings to WebInstallerDBSettings
+* WebInstaller_Document to WebInstallerDocument
+* WebInstaller_ExistingWiki to WebInstallerExistingWiki
+* WebInstaller_Install to WebInstallerInstall
+* WebInstaller_Language to WebInstallerLanguage
+* WebInstaller_Name to WebInstallerName
+* WebInstaller_Options to WebInstallerOptions
+* WebInstaller_Readme to WebInstallerReadme
+* WebInstaller_ReleaseNotes to WebInstallerReleaseNotes
+* WebInstaller_Restart to WebInstallerRestart
+* WebInstaller_Upgrade to WebInstallerUpgrade
+* WebInstaller_UpgradeDoc to WebInstallerUpgradeDoc
+* WebInstaller_Welcome to WebInstallerWelcome
+
+==== Removed classes ====
+* IPBlockForm - Use SpecialBlock directly
+* WatchlistEditor - Use SpecialEditWatchlist directly
 
 == Compatibility ==
 
@@ -51,7 +168,7 @@ The supported versions are:
 
 == Upgrading ==
 
-1.24 has several database changes since 1.22, and will not work without schema
+1.24 has several database changes since 1.23, 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).
@@ -71,7 +188,7 @@ Don't forget to always back up your database before upgrading!
 
 See the file UPGRADE for more detailed upgrade instructions.
 
-For notes on 1.21.x and older releases, see HISTORY.
+For notes on 1.22.x and older releases, see HISTORY.
 
 == Online documentation ==
 
diff --git a/composer-example.json b/composer-example.json
deleted file mode 100644 (file)
index 85304c1..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-{
-       "require": {
-               "php": ">=5.3.2"
-       },
-       "suggest": {
-               "ext-fileinfo": "More accurate file type detection for uploaded files",
-               "ext-mbstring": "Faster unicode handling",
-               "ext-wikidiff2": "Faster diff generation",
-               "ext-apc": "Speed up MediaWiki with opcode caching (before PHP 5.5)"
-       },
-       "autoload": {
-               "psr-0": {
-                       "ComposerHookHandler": "includes/composer"
-               }
-       },
-       "scripts": {
-               "pre-update-cmd": "ComposerHookHandler::onPreUpdate",
-               "pre-install-cmd": "ComposerHookHandler::onPreInstall"
-       }
-}
diff --git a/composer.json b/composer.json
new file mode 100644 (file)
index 0000000..8389f00
--- /dev/null
@@ -0,0 +1,32 @@
+{
+       "name": "mediawiki/core",
+       "description": "Free software wiki application developed by the Wikimedia Foundation and others",
+       "keywords": ["mediawiki", "wiki"],
+       "homepage": "https://www.mediawiki.org/",
+       "authors": [
+               {
+                       "name": "MediaWiki Community",
+                       "homepage": "https://www.mediawiki.org/wiki/Special:Version/Credits"
+               }
+       ],
+       "license": "GPL-2.0",
+       "support": {
+               "issues": "https://bugzilla.wikimedia.org/",
+               "irc": "irc://irc.freenode.net/mediawiki",
+               "wiki": "https://www.mediawiki.org/"
+       },
+       "require": {
+               "php": ">=5.3.2",
+               "psr/log": "1.0.0"
+       },
+       "require-dev": {
+               "phpunit/phpunit": "*"
+       },
+       "suggest": {
+               "ext-fileinfo": "*",
+               "ext-mbstring": "*",
+               "ext-wikidiff2": "*",
+               "ext-apc": "*",
+               "monolog/monolog": "*"
+       }
+}
index 899554a..3f0fca2 100644 (file)
@@ -18,7 +18,7 @@ ContentHandler::getDefaultModelFor($title) as follows:
 
 * The global setting $wgNamespaceContentModels specifies a content model for the given namespace.
 * The hook ContentHandlerDefaultModelFor may be used to override the page's default model.
-* Pages in NS_MEDIAWIKI and NS_USER default to the CSS or JavaScript model if they end in .js or .css, respectively.
+* Pages in NS_MEDIAWIKI and NS_USER default to the CSS or JavaScript model if they end in .css or .js, respectively.
   Pages in NS_MEDIAWIKI default to the wikitext model otherwise.
 * The hook TitleIsCssOrJsPage may be used to force a page to use the CSS or JavaScript model.
   This is a compatibility feature. The ContentHandlerDefaultModelFor hook should be used instead if possible.
index de4bc3b..0b072f2 100644 (file)
@@ -250,6 +250,7 @@ $block: The block from which the autoblock is coming.
 'AbortEmailNotification': Can be used to cancel email notifications for an edit.
 $editor: The User who made the change.
 $title: The Title of the page that was edited.
+$rc: The current RecentChange object.
 
 'AbortLogin': Return false to cancel account login.
 $user: the User object being authenticated against
@@ -280,7 +281,7 @@ $title: the page title
 'SendWatchlistEmailNotification': Return true to send watchlist email notification
 $targetUser: the user whom to send watchlist email notification
 $title: the page title
-$this: EmailNotification object
+$enotif: EmailNotification object
 
 'AbortChangePassword': Return false to cancel password change.
 $user: the User object to which the password change is occuring
@@ -312,11 +313,11 @@ $apiModule: the ApiCreateAccount module calling
 $loginForm: the LoginForm used
 &$result: associative array for API result data
 
-'AfterFinalPageOutput': At the end of OutputPage::output() but before final
-ob_end_flush() which will send the buffered output to the client. This allows
-for last-minute modification of the output within the buffer by using
-ob_get_clean().
-&$output: OutputPage object
+'AfterFinalPageOutput': Nearly at the end of OutputPage::output() but
+before OutputPage::sendCacheControl() and final ob_end_flush() which
+will send the buffered output to the client. This allows for last-minute
+modification of the output within the buffer by using ob_get_clean().
+$output: The OutputPage object where output() was called
 
 'AfterImportPage': When a page import is completed.
 $title: Title under which the revisions were imported
@@ -325,12 +326,6 @@ $revCount: Number of revisions in the XML file
 $sRevCount: Number of successfully imported revisions
 $pageInfo: associative array of page information
 
-'AfterFinalPageOutput': Nearly at the end of OutputPage::output() but
-before OutputPage::sendCacheControl() and final ob_end_flush() which
-will send the buffered output to the client. This allows for last-minute
-modification of the output within the buffer by using ob_get_clean().
-$output: The OutputPage object where output() was called
-
 'AjaxAddScript': Called in output page just before the initialisation
 of the javascript ajax engine. The hook is only called when ajax
 is enabled ( $wgUseAjax = true; ).
@@ -637,6 +632,7 @@ $title: Title corresponding to the article restored
 $create: Whether or not the restoration caused the page to be created (i.e. it
   didn't exist before).
 $comment: The comment associated with the undeletion.
+$oldPageId: ID of page previously deleted (from archive table)
 
 'ArticleUndeleteLogEntry': When a log entry is generated but not yet saved.
 $pageArchive: the PageArchive object
@@ -732,6 +728,13 @@ $mediaWiki: Mediawiki object
 &$out: OutputPage object
 &$skin: Skin object
 
+'BeforeHttpsRedirect': Prior to forcing HTTP->HTTPS redirect. Gives a chance to
+override how the redirect is output by modifying, or by returning false, and
+letting standard HTTP rendering take place.
+ATTENTION: This hook is likely to be removed soon due to overall design of the system.
+$context: IContextSource object
+&$redirect: string URL, modifiable
+
 'BeforePageRedirect': Prior to sending an HTTP redirect. Gives a chance to
 override how the redirect is output by modifying, or by returning false and
 taking over the output.
@@ -887,6 +890,19 @@ $title: the Title in question.
 Handler functions that modify $ok should generally return false to prevent further
 hooks from further modifying $ok.
 
+'ContentGetParserOutput': Customize parser output for a given content object,
+called by AbstractContent::getParserOutput. May be used to override the normal
+model-specific rendering of page content.
+$content: The Content to render
+$title: Title of the page, as context
+$revId: The revision ID, as context
+$options: ParserOptions for rendering. To avoid confusing the parser cache,
+the output can only depend on parameters provided to this hook function, not on global state.
+$generateHtml: boolean, indicating whether full HTML should be generated. If false,
+generation of HTML may be skipped, but other information should still be present in the
+ParserOutput object.
+&$output: ParserOutput, to manipulate or replace
+
 'ConvertContent': Called by AbstractContent::convert when a conversion to another
 content model is requested.
 $content: The Content object to be converted.
@@ -1623,6 +1639,11 @@ localisation checks.
 &$blacklist: array of checks to blacklist. See the bottom of
   maintenance/language/checkLanguage.inc for the format of this variable.
 
+'LocalisationIgnoredOptionalMessages': When fetching the list of ignored and
+optional localisation messages
+&$ignored Array of ignored message keys
+&$optional Array of optional message keys
+
 'LogEventsListShowLogExtract': Called before the string is added to OutputPage.
 Returning false will prevent the string from being added to the OutputPage.
 &$s: html string to show for the log extract
@@ -2096,7 +2117,7 @@ configuration variables to JavaScript. Things that depend on the current page
 or request state must be added through MakeGlobalVariablesScript instead.
 &$vars: array( variable name => value )
 
-'ResourceLoaderGetStartupModules': Run once the startup module is being
+'ResourceLoaderGetStartupModules': DEPRECATED. Run once the startup module is being
 generated. This allows you to add modules to the startup module. This hook
 should be used sparingly since any module added here will be loaded on all
 pages. This hook is useful if you want to make code available to module loader
@@ -2171,7 +2192,7 @@ $title : Current Title object being displayed in search results.
 $article: The article object corresponding to the page
 
 'ShowRawCssJs': Customise the output of raw CSS and JavaScript in page views.
-DEPRECATED, use the ContentHandler facility to handle CSS and JavaScript!
+DEPRECATED, use the ContentGetParserOutput hook instead!
 $text: Text being shown
 $title: Title of the custom script/stylesheet page
 $output: Current OutputPage object
@@ -2226,6 +2247,12 @@ $skin: Skin object
 &$bar: Sidebar contents
 Modify $bar to add or modify sidebar portlets.
 
+'SidebarBeforeOutput': Allows to edit sidebar just before its output by skins.
+$skin Skin object
+&$bar: Sidebar content
+Modify $bar to add or modify sidebar portlets.
+Warning: This hook is run on each display. You should consider to use 'SkinBuildSidebar' that is aggressively cached.
+
 'SkinCopyrightFooter': Allow for site and per-namespace customization of
 copyright notice.
 $title: displayed page title
@@ -2234,6 +2261,7 @@ $type: 'normal' or 'history' for old/diff views
   message must be in HTML format, not wikitext!
 &$link: overridable HTML link to be passed into the message as $1
 &$forContent: overridable flag if copyright footer is shown in content language.
+  This parameter is deprecated.
 
 'SkinGetPoweredBy': TODO
 &$text: additional 'powered by' icons in HTML. Note: Modern skin does not use
@@ -2596,7 +2624,7 @@ $user: Current user object
 &$whitelisted: Boolean value of whether this title is whitelisted
 
 'TitleSquidURLs': Called to determine which URLs to purge from HTTP caches.
-$this: Title object to purge
+$title: Title object to purge
 &$urls: An array of URLs to purge from the caches, to be manipulated.
 
 'UndeleteForm::showHistory': Called in UndeleteForm::showHistory, after a
@@ -2922,6 +2950,12 @@ Return false to prevent setting of the cookie.
 &$expire: Cookie expiration, as for PHP's setcookie()
 $options: Options passed to WebResponse::setcookie()
 
+'WhatLinksHereProps': Allows annotations to be added to WhatLinksHere
+$row: The DB row of the entry.
+$title: The Title of the page where the link comes FROM
+$target: The Title of the page where the link goes TO
+&$props: Array of HTML strings to display after the title.
+
 'WikiExporter::dumpStableQuery': Get the SELECT query for "stable" revisions
 dumps. One, and only one hook should set this, and return false.
 &$tables: Database tables to use in the SELECT query
index fee82cb..374bab2 100644 (file)
@@ -6,7 +6,7 @@ kss: nodecheck
 # 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|mediawiki.ui.button&only=styles" > $(KSS_RL_TMP)
+       @curl -sG "${MEDIAWIKI_LOAD_URL}?modules=mediawiki.legacy.shared|mediawiki.legacy.commonPrint|mediawiki.ui|mediawiki.ui.button&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 d91bf2a..c383af9 100644 (file)
@@ -1,4 +1,19 @@
 The Makefile, package.json, scripts, styleguide-template, and
-mediawiki.ui/styleguide.md files and directories in here support the automatic
-generation of CSS documentation from the source LESS files using kss for
+mediawiki.ui/styleguide.md files and directories here and in
+resources/src/mediawiki.ui/ support the automatic generation
+of CSS documentation from the source LESS files using kss for
 node.js, https://github.com/kneath/kss
+
+To build and open in your web browser, run:
+
+MEDIAWIKI_LOAD_URL=mediawiki_hostname/w/load.php make kssopen
+
+For example,
+
+MEDIAWIKI_LOAD_URL=1.2.3.4/w/load.php make kssopen
+
+If MediaWiki is running on localhost, you can omit MEDIAWIKI_LOAD_URL.
+
+To rebuild without opening the web browser, run:
+
+MEDIAWIKI_LOAD_URL=mediawiki_hostname/w/load.php make
index 99f3e4f..cb95197 100644 (file)
@@ -28,6 +28,7 @@
                        {{html overview}}
                {{else}}
                        {{#eachSection rootNumber}}
+                       <section>
                                {{#whenDepth 1}}
                                        <h1>{{ reference }}.0 - {{ header }}</h1>
                                {{else}}
                                {{/whenDepth}}
                                {{#ifAny markup modifiers}}
                                                <div>{{html description}}</div>
-                                               <strong>Default styling</strong><br>
-                                               {{modifierMarkup}}
+                                               <h4>Default styling</h4>
+                                               <blockquote>{{modifierMarkup}}</blockquote>
                                                {{#eachModifier}}
-                                               {{html description}}<br>
-                                               <p>{{name}}</p>
-                                               {{modifierMarkup}}
+                                                       <h4>{{name}}</h4>
+                                                       {{html description}}
+                                                       <blockquote>{{modifierMarkup}}</blockquote>
                                                {{/eachModifier}}
                                                <pre class="prettyprint lang-html">{{markup}}</pre>
                                {{else}}
@@ -53,6 +54,7 @@
                                                        {{html description}}
                                                {{/if}}
                                {{/ifAny}}
+                       </section>
                        {{/eachSection}}
                {{/if}}
        </article>
index e139227..6f449c6 100644 (file)
@@ -12,8 +12,6 @@
  * - Set $wgImgAuthDetails = true if you want the reason the access was denied messages to
  *       be displayed instead of just the 403 error (doesn't work on IE anyway),
  *       otherwise it will only appear in error logs
- * - Set $wgImgAuthPublicTest false if you don't want to just check and see if all are public
- *       must be set to false if using specific restrictions such as LockDown or NSFileRepo
  *
  *  For security reasons, you usually don't want your user to know *why* access was denied,
  *  just that it was. If you want to change this, you can set $wgImgAuthDetails to 'true'
@@ -50,18 +48,16 @@ $wgActionPaths = array( "$wgUploadPath/" );
 
 wfImageAuthMain();
 wfLogProfilingData();
+// Commit and close up!
+$factory = wfGetLBFactory();
+$factory->commitMasterChanges();
+$factory->shutdown();
 
 function wfImageAuthMain() {
-       global $wgImgAuthPublicTest, $wgImgAuthUrlPathMap, $wgRequest;
-
-       // See if this is a public Wiki (no protections).
-       if ( $wgImgAuthPublicTest
-               && in_array( 'read', User::getGroupPermissions( array( '*' ) ), true )
-       ) {
-               // This is a public wiki, so disable this script (for private wikis only)
-               wfForbidden( 'img-auth-accessdenied', 'img-auth-public' );
-               return;
-       }
+       global $wgImgAuthUrlPathMap;
+
+       $request = RequestContext::getMain()->getRequest();
+       $publicWiki = in_array( 'read', User::getGroupPermissions( array( '*' ) ), true );
 
        // Get the requested file path (source file or thumbnail)
        $matches = WebRequest::getPathInfo();
@@ -77,11 +73,11 @@ function wfImageAuthMain() {
 
        // Check for bug 28235: QUERY_STRING overriding the correct extension
        $whitelist = array();
-       $extension = FileBackend::extensionFromPath( $path );
+       $extension = FileBackend::extensionFromPath( $path, 'rawcase' );
        if ( $extension != '' ) {
                $whitelist[] = $extension;
        }
-       if ( !$wgRequest->checkUrlExtension( $whitelist ) ) {
+       if ( !$request->checkUrlExtension( $whitelist ) ) {
                return;
        }
 
@@ -110,53 +106,72 @@ function wfImageAuthMain() {
 
        // Get the local file repository
        $repo = RepoGroup::singleton()->getRepo( 'local' );
+       $zone = strstr( ltrim( $path, '/' ), '/', true );
 
        // Get the full file storage path and extract the source file name.
        // (e.g. 120px-Foo.png => Foo.png or page2-120px-Foo.png => Foo.png).
-       // This only applies to thumbnails, and all thumbnails should
+       // This only applies to thumbnails/transcoded, and each of them should
        // be under a folder that has the source file name.
-       if ( strpos( $path, '/thumb/' ) === 0 ) {
-               $name = wfBaseName( dirname( $path ) ); // file is a thumbnail
-               $filename = $repo->getZonePath( 'thumb' ) . substr( $path, 6 ); // strip "/thumb"
+       if ( $zone === 'thumb' || $zone === 'transcoded' ) {
+               $name = wfBaseName( dirname( $path ) );
+               $filename = $repo->getZonePath( $zone ) . substr( $path, strlen( "/".$zone ) );
+               // Check to see if the file exists
+               if ( !$repo->fileExists( $filename ) ) {
+                       wfForbidden( 'img-auth-accessdenied', 'img-auth-nofile', $filename );
+                       return;
+               }
        } else {
                $name = wfBaseName( $path ); // file is a source file
                $filename = $repo->getZonePath( 'public' ) . $path;
+               // Check to see if the file exists and is not deleted
+               $bits = explode( '!', $name, 2 );
+               if ( substr( $path, 0, 9 ) === '/archive/' && count( $bits ) == 2 ) {
+                       $file = $repo->newFromArchiveName( $bits[1], $name );
+               } else {
+                       $file = $repo->newFile( $name );
+               }
+               if ( !$file->exists() || $file->isDeleted( File::DELETED_FILE ) ) {
+                       wfForbidden( 'img-auth-accessdenied', 'img-auth-nofile', $filename );
+                       return;
+               }
        }
 
-       // Check to see if the file exists
-       if ( !$repo->fileExists( $filename ) ) {
-               wfForbidden( 'img-auth-accessdenied', 'img-auth-nofile', $filename );
-               return;
-       }
+       $headers = array(); // extra HTTP headers to send
 
-       $title = Title::makeTitleSafe( NS_FILE, $name );
-       if ( !$title instanceof Title ) { // files have valid titles
-               wfForbidden( 'img-auth-accessdenied', 'img-auth-badtitle', $name );
-               return;
-       }
+       if ( !$publicWiki ) {
+               // For private wikis, run extra auth checks and set cache control headers
+               $headers[] = 'Cache-Control: private';
+               $headers[] = 'Vary: Cookie';
 
-       // Run hook for extension authorization plugins
-       /** @var $result array */
-       $result = null;
-       if ( !wfRunHooks( 'ImgAuthBeforeStream', array( &$title, &$path, &$name, &$result ) ) ) {
-               wfForbidden( $result[0], $result[1], array_slice( $result, 2 ) );
-               return;
-       }
+               $title = Title::makeTitleSafe( NS_FILE, $name );
+               if ( !$title instanceof Title ) { // files have valid titles
+                       wfForbidden( 'img-auth-accessdenied', 'img-auth-badtitle', $name );
+                       return;
+               }
 
-       // Check user authorization for this title
-       // Checks Whitelist too
-       if ( !$title->userCan( 'read' ) ) {
-               wfForbidden( 'img-auth-accessdenied', 'img-auth-noread', $name );
-               return;
+               // Run hook for extension authorization plugins
+               /** @var $result array */
+               $result = null;
+               if ( !wfRunHooks( 'ImgAuthBeforeStream', array( &$title, &$path, &$name, &$result ) ) ) {
+                       wfForbidden( $result[0], $result[1], array_slice( $result, 2 ) );
+                       return;
+               }
+
+               // Check user authorization for this title
+               // Checks Whitelist too
+               if ( !$title->userCan( 'read' ) ) {
+                       wfForbidden( 'img-auth-accessdenied', 'img-auth-noread', $name );
+                       return;
+               }
        }
 
-       if ( $wgRequest->getCheck( 'download' ) ) {
-               header( 'Content-Disposition: attachment' );
+       if ( $request->getCheck( 'download' ) ) {
+               $headers[] = 'Content-Disposition: attachment';
        }
 
        // Stream the requested file
        wfDebugLog( 'img_auth', "Streaming `" . $filename . "`." );
-       $repo->streamFile( $filename, array( 'Cache-Control: private', 'Vary: Cookie' ) );
+       $repo->streamFile( $filename, $headers );
 }
 
 /**
index 4b5ca75..a3808a5 100644 (file)
@@ -48,7 +48,7 @@ class AjaxResponse {
 
        /**
         * Date for the HTTP header Last-modified
-        * @var string|false $mLastModified
+        * @var string|bool $mLastModified
         */
        private $mLastModified;
 
@@ -71,7 +71,7 @@ class AjaxResponse {
        private $mText;
 
        /**
-        * @param $text string|null
+        * @param string|null $text
         */
        function __construct( $text = null ) {
                $this->mCacheDuration = null;
@@ -90,7 +90,7 @@ class AjaxResponse {
 
        /**
         * Set the number of seconds to get the response cached by a proxy
-        * @param $duration int
+        * @param int $duration
         */
        function setCacheDuration( $duration ) {
                $this->mCacheDuration = $duration;
@@ -98,7 +98,7 @@ class AjaxResponse {
 
        /**
         * Set the HTTP Vary header
-        * @param $vary string
+        * @param string $vary
         */
        function setVary( $vary ) {
                $this->mVary = $vary;
@@ -106,7 +106,7 @@ class AjaxResponse {
 
        /**
         * Set the HTTP response code
-        * @param $code string
+        * @param string $code
         */
        function setResponseCode( $code ) {
                $this->mResponseCode = $code;
@@ -114,7 +114,7 @@ class AjaxResponse {
 
        /**
         * Set the HTTP header Content-Type
-        * @param $type string
+        * @param string $type
         */
        function setContentType( $type ) {
                $this->mContentType = $type;
@@ -129,7 +129,7 @@ class AjaxResponse {
 
        /**
         * Add content to the response
-        * @param $text string
+        * @param string $text
         */
        function addText( $text ) {
                if ( ! $this->mDisabled && $text ) {
@@ -206,7 +206,7 @@ class AjaxResponse {
         * possible. If successful, the AjaxResponse is disabled so that
         * any future call to AjaxResponse::printText() have no effect.
         *
-        * @param $timestamp string
+        * @param string $timestamp
         * @return bool Returns true if the response code was set to 304 Not Modified.
         */
        function checkLastModified( $timestamp ) {
@@ -262,8 +262,8 @@ class AjaxResponse {
        }
 
        /**
-        * @param $mckey string
-        * @param $touched int
+        * @param string $mckey
+        * @param int $touched
         * @return bool
         */
        function loadFromMemcached( $mckey, $touched ) {
@@ -290,8 +290,8 @@ class AjaxResponse {
        }
 
        /**
-        * @param $mckey string
-        * @param $expiry int
+        * @param string $mckey
+        * @param int $expiry
         * @return bool
         */
        function storeInMemcached( $mckey, $expiry = 86400 ) {
index 5ebeb60..09d843d 100644 (file)
  * @internal documentation reviewed 15 Mar 2010
  */
 class Article implements Page {
-       /**@{{
-        * @private
-        */
-
-       /**
-        * The context this Article is executed in
-        * @var IContextSource $mContext
-        */
+       /** @var IContextSource The context this Article is executed in */
        protected $mContext;
 
-       /**
-        * The WikiPage object of this instance
-        * @var WikiPage $mPage
-        */
+       /** @var WikiPage The WikiPage object of this instance */
        protected $mPage;
 
-       /**
-        * ParserOptions object for $wgUser articles
-        * @var ParserOptions $mParserOptions
-        */
+       /** @var ParserOptions ParserOptions object for $wgUser articles */
        public $mParserOptions;
 
        /**
-        * Text of the revision we are working on
-        * @var string $mContent
+        * @var string Text of the revision we are working on
+        * @todo BC cruft
         */
-       var $mContent;                    // !< #BC cruft
+       public $mContent;
 
        /**
-        * Content of the revision we are working on
-        * @var Content
+        * @var Content Content of the revision we are working on
         * @since 1.21
         */
-       var $mContentObject;              // !<
+       protected $mContentObject;
 
-       /**
-        * Is the content ($mContent) already loaded?
-        * @var bool $mContentLoaded
-        */
-       var $mContentLoaded = false;      // !<
+       /** @var bool Is the content ($mContent) already loaded? */
+       protected $mContentLoaded = false;
 
-       /**
-        * The oldid of the article that is to be shown, 0 for the
-        * current revision
-        * @var int|null $mOldId
-        */
-       var $mOldId;                      // !<
+       /** @var int|null The oldid of the article that is to be shown, 0 for the current revision */
+       protected $mOldId;
 
-       /**
-        * Title from which we were redirected here
-        * @var Title $mRedirectedFrom
-        */
-       var $mRedirectedFrom = null;
+       /** @var Title Title from which we were redirected here */
+       protected $mRedirectedFrom = null;
 
-       /**
-        * URL to redirect to or false if none
-        * @var string|false $mRedirectUrl
-        */
-       var $mRedirectUrl = false;        // !<
+       /** @var string|bool URL to redirect to or false if none */
+       protected $mRedirectUrl = false;
 
-       /**
-        * Revision ID of revision we are working on
-        * @var int $mRevIdFetched
-        */
-       var $mRevIdFetched = 0;           // !<
-
-       /**
-        * Revision we are working on
-        * @var Revision $mRevision
-        */
-       var $mRevision = null;
+       /** @var int Revision ID of revision we are working on */
+       protected $mRevIdFetched = 0;
 
-       /**
-        * ParserOutput object
-        * @var ParserOutput $mParserOutput
-        */
-       var $mParserOutput;
+       /** @var Revision Revision we are working on */
+       protected $mRevision = null;
 
-       /**@}}*/
+       /** @var ParserOutput */
+       public $mParserOutput;
 
        /**
         * Constructor and clear the article
-        * @param $title Title Reference to a Title object.
-        * @param $oldId Integer revision ID, null to fetch from request, zero for current
+        * @param Title $title Reference to a Title object.
+        * @param int $oldId Revision ID, null to fetch from request, zero for current
         */
        public function __construct( Title $title, $oldId = null ) {
                $this->mOldId = $oldId;
@@ -125,7 +87,7 @@ class Article implements Page {
        }
 
        /**
-        * @param $title Title
+        * @param Title $title
         * @return WikiPage
         */
        protected function newPage( Title $title ) {
@@ -134,7 +96,7 @@ class Article implements Page {
 
        /**
         * Constructor from a page id
-        * @param int $id article ID to load
+        * @param int $id Article ID to load
         * @return Article|null
         */
        public static function newFromID( $id ) {
@@ -147,9 +109,9 @@ class Article implements Page {
        /**
         * Create an Article object of the appropriate class for the given page.
         *
-        * @param $title Title
-        * @param $context IContextSource
-        * @return Article object
+        * @param Title $title
+        * @param IContextSource $context
+        * @return Article
         */
        public static function newFromTitle( $title, IContextSource $context ) {
                if ( NS_MEDIA == $title->getNamespace() ) {
@@ -179,9 +141,9 @@ class Article implements Page {
        /**
         * Create an Article object of the appropriate class for the given page.
         *
-        * @param $page WikiPage
-        * @param $context IContextSource
-        * @return Article object
+        * @param WikiPage $page
+        * @param IContextSource $context
+        * @return Article
         */
        public static function newFromWikiPage( WikiPage $page, IContextSource $context ) {
                $article = self::newFromTitle( $page->getTitle(), $context );
@@ -192,7 +154,7 @@ class Article implements Page {
        /**
         * Tell the page view functions that this view was redirected
         * from another page on the wiki.
-        * @param $from Title object.
+        * @param Title $from
         */
        public function setRedirectedFrom( Title $from ) {
                $this->mRedirectedFrom = $from;
@@ -201,7 +163,7 @@ class Article implements Page {
        /**
         * Get the title object of the article
         *
-        * @return Title object of this page
+        * @return Title Title object of this page
         */
        public function getTitle() {
                return $this->mPage->getTitle();
@@ -290,8 +252,7 @@ class Article implements Page {
        }
 
        /**
-        * @return int The oldid of the article that is to be shown, 0 for the
-        *             current revision
+        * @return int The oldid of the article that is to be shown, 0 for the current revision
         */
        public function getOldID() {
                if ( is_null( $this->mOldId ) ) {
@@ -373,7 +334,7 @@ class Article implements Page {
         * uses this method to retrieve page text from the database, so the function
         * has to remain public for now.
         *
-        * @return mixed string containing article contents, or false if null
+        * @return string|bool String containing article contents, or false if null
         * @deprecated since 1.21, use WikiPage::getContent() instead
         */
        function fetchContent() { #BC cruft!
@@ -387,6 +348,11 @@ class Article implements Page {
 
                $content = $this->fetchContentObject();
 
+               if ( !$content ) {
+                       wfProfileOut( __METHOD__ );
+                       return false;
+               }
+
                // @todo Get rid of mContent everywhere!
                $this->mContent = ContentHandler::getContentText( $content );
                ContentHandler::runLegacyHooks( 'ArticleAfterFetchContent', array( &$this, &$this->mContent ) );
@@ -404,7 +370,7 @@ class Article implements Page {
         * @note Code that wants to retrieve page content from the database should
         * use WikiPage::getContent().
         *
-        * @return Content|null|boolean false
+        * @return Content|null|bool
         *
         * @since 1.21
         */
@@ -499,7 +465,7 @@ class Article implements Page {
        /**
         * Use this to fetch the rev ID used on page views
         *
-        * @return int revision ID of last article revision
+        * @return int Revision ID of last article revision
         */
        public function getRevIdFetched() {
                if ( $this->mRevIdFetched ) {
@@ -769,7 +735,7 @@ class Article implements Page {
 
        /**
         * Adjust title for pages with displaytitle, -{T|}- or language conversion
-        * @param $pOutput ParserOutput
+        * @param ParserOutput $pOutput
         */
        public function adjustDisplayTitle( ParserOutput $pOutput ) {
                # Adjust the title if it was set by displaytitle, -{T|}- or language conversion
@@ -828,10 +794,11 @@ class Article implements Page {
         * Show a page view for a page formatted as CSS or JavaScript. To be called by
         * Article::view() only.
         *
-        * This is hooked by SyntaxHighlight_GeSHi to do syntax highlighting of these
-        * page views.
+        * This exists mostly to serve the deprecated ShowRawCssJs hook (used to customize these views).
+        * It has been replaced by the ContentGetParserOutput hook, which lets you do the same but with
+        * more flexibility.
         *
-        * @param bool $showCacheHint whether to show a message telling the user
+        * @param bool $showCacheHint Whether to show a message telling the user
         *   to clear the browser cache (default: true).
         */
        protected function showCssOrJsPage( $showCacheHint = true ) {
@@ -863,10 +830,10 @@ class Article implements Page {
 
        /**
         * Get the robot policy to be used for the current view
-        * @param string $action the action= GET parameter
-        * @param $pOutput ParserOutput|null
-        * @return Array the policy that should be set
-        * TODO: actions other than 'view'
+        * @param string $action The action= GET parameter
+        * @param ParserOutput|null $pOutput
+        * @return array The policy that should be set
+        * @todo: actions other than 'view'
         */
        public function getRobotPolicy( $action, $pOutput = null ) {
                global $wgArticleRobotPolicies, $wgNamespaceRobotPolicies, $wgDefaultRobotPolicy;
@@ -944,9 +911,9 @@ class Article implements Page {
        /**
         * Converts a String robot policy into an associative array, to allow
         * merging of several policies using array_merge().
-        * @param $policy Mixed, returns empty array on null/false/'', transparent
-        *            to already-converted arrays, converts String.
-        * @return Array: 'index' => \<indexpolicy\>, 'follow' => \<followpolicy\>
+        * @param array|string $policy Returns empty array on null/false/'', transparent
+        *   to already-converted arrays, converts string.
+        * @return array 'index' => \<indexpolicy\>, 'follow' => \<followpolicy\>
         */
        public static function formatRobotPolicy( $policy ) {
                if ( is_array( $policy ) ) {
@@ -975,7 +942,7 @@ class Article implements Page {
         * the output. Returns true if the header was needed, false if this is not
         * a redirect view. Handles both local and remote redirects.
         *
-        * @return boolean
+        * @return bool
         */
        public function showRedirectedFromHeader() {
                global $wgRedirectSources;
@@ -1277,7 +1244,7 @@ class Article implements Page {
         * If the revision requested for view is deleted, check permissions.
         * Send either an error message or a warning header to the output.
         *
-        * @return boolean true if the view is allowed, false if not.
+        * @return bool true if the view is allowed, false if not.
         */
        public function showDeletedRevisionHeader() {
                if ( !$this->mRevision->isDeleted( Revision::DELETED_TEXT ) ) {
@@ -1320,7 +1287,7 @@ class Article implements Page {
         *   Revision as of \<date\>; view current revision
         *   \<- Previous version | Next Version -\>
         *
-        * @param int $oldid revision ID of this article revision
+        * @param int $oldid Revision ID of this article revision
         */
        public function setOldSubtitle( $oldid = 0 ) {
                if ( !wfRunHooks( 'DisplayOldSubtitle', array( &$this, &$oldid ) ) ) {
@@ -1445,10 +1412,10 @@ class Article implements Page {
         * Chances are you should just be using the ParserOutput from
         * WikitextContent::getParserOutput instead of calling this for redirects.
         *
-        * @param $target Title|Array of destination(s) to redirect
-        * @param $appendSubtitle Boolean [optional]
-        * @param $forceKnown Boolean: should the image be shown as a bluelink regardless of existence?
-        * @return string containing HMTL with redirect link
+        * @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
         */
        public function viewRedirect( $target, $appendSubtitle = true, $forceKnown = false ) {
                $lang = $this->getTitle()->getPageLanguage();
@@ -1467,9 +1434,9 @@ class Article implements Page {
         *
         * @since 1.23
         * @param Language $lang
-        * @param Title|array $target destination(s) to redirect
+        * @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 HMTL with redirect link
         */
        public static function getRedirectHeaderHtml( Language $lang, $target, $forceKnown = false ) {
                global $wgStylePath;
@@ -1658,7 +1625,7 @@ class Article implements Page {
        /**
         * Output deletion confirmation dialog
         * @todo FIXME: Move to another file?
-        * @param string $reason prefilled reason
+        * @param string $reason Prefilled reason
         */
        public function confirmDelete( $reason ) {
                wfDebug( "Article::confirmDelete\n" );
@@ -1826,7 +1793,7 @@ class Article implements Page {
         * output to the client that is necessary for this request.
         * (that is, it has sent a cached version of the page)
         *
-        * @return boolean true if cached version send, false otherwise
+        * @return bool true if cached version send, false otherwise
         */
        protected function tryFileCache() {
                static $called = false;
@@ -1882,9 +1849,9 @@ class Article implements Page {
         *
         * @since 1.16 (r52326) for LiquidThreads
         *
-        * @param $oldid mixed integer Revision ID or null
-        * @param $user User The relevant user
-        * @return ParserOutput or false if the given revision ID is not found
+        * @param int|null $oldid Revision ID or null
+        * @param User $user The relevant user
+        * @return ParserOutput|bool ParserOutput or false if the given revision ID is not found
         */
        public function getParserOutput( $oldid = null, User $user = null ) {
                //XXX: bypasses mParserOptions and thus setParserOptions()
@@ -1928,7 +1895,7 @@ class Article implements Page {
        /**
         * Sets the context this Article is executed in
         *
-        * @param $context IContextSource
+        * @param IContextSource $context
         * @since 1.18
         */
        public function setContext( $context ) {
@@ -2006,7 +1973,7 @@ class Article implements Page {
         * raw WikiPage fields for backwards compatibility.
         *
         * @param string $fname Field name
-        * @param $fvalue mixed New value
+        * @param mixed $fvalue New value
         */
        public function __set( $fname, $fvalue ) {
                if ( property_exists( $this->mPage, $fname ) ) {
@@ -2039,11 +2006,11 @@ class Article implements Page {
        // ****** B/C functions to work-around PHP silliness with __call and references ****** //
 
        /**
-        * @param $limit array
-        * @param $expiry array
-        * @param $cascade bool
-        * @param $reason string
-        * @param $user User
+        * @param array $limit
+        * @param array $expiry
+        * @param bool $cascade
+        * @param string $reason
+        * @param User $user
         * @return Status
         */
        public function doUpdateRestrictions( array $limit, array $expiry, &$cascade,
@@ -2053,10 +2020,10 @@ class Article implements Page {
        }
 
        /**
-        * @param $limit array
-        * @param $reason string
-        * @param $cascade int
-        * @param $expiry array
+        * @param array $limit
+        * @param string $reason
+        * @param int $cascade
+        * @param array $expiry
         * @return bool
         */
        public function updateRestrictions( $limit = array(), $reason = '',
@@ -2072,11 +2039,11 @@ class Article implements Page {
        }
 
        /**
-        * @param $reason string
-        * @param $suppress bool
-        * @param $id int
-        * @param $commit bool
-        * @param $error string
+        * @param string $reason
+        * @param bool $suppress
+        * @param int $id
+        * @param bool $commit
+        * @param string $error
         * @return bool
         */
        public function doDeleteArticle( $reason, $suppress = false, $id = 0,
@@ -2086,12 +2053,12 @@ class Article implements Page {
        }
 
        /**
-        * @param $fromP
-        * @param $summary
-        * @param $token
-        * @param $bot
-        * @param $resultDetails
-        * @param $user User
+        * @param string $fromP
+        * @param string $summary
+        * @param string $token
+        * @param bool $bot
+        * @param array $resultDetails
+        * @param User|null $user
         * @return array
         */
        public function doRollback( $fromP, $summary, $token, $bot, &$resultDetails, User $user = null ) {
@@ -2100,11 +2067,11 @@ class Article implements Page {
        }
 
        /**
-        * @param $fromP
-        * @param $summary
-        * @param $bot
-        * @param $resultDetails
-        * @param $guser User
+        * @param string $fromP
+        * @param string $summary
+        * @param bool $bot
+        * @param array $resultDetails
+        * @param User|null $guser
         * @return array
         */
        public function commitRollback( $fromP, $summary, $bot, &$resultDetails, User $guser = null ) {
@@ -2113,7 +2080,7 @@ class Article implements Page {
        }
 
        /**
-        * @param $hasHistory bool
+        * @param bool $hasHistory
         * @return mixed
         */
        public function generateReason( &$hasHistory ) {
@@ -2132,30 +2099,30 @@ class Article implements Page {
        }
 
        /**
-        * @param $title Title
+        * @param Title $title
         */
        public static function onArticleCreate( $title ) {
                WikiPage::onArticleCreate( $title );
        }
 
        /**
-        * @param $title Title
+        * @param Title $title
         */
        public static function onArticleDelete( $title ) {
                WikiPage::onArticleDelete( $title );
        }
 
        /**
-        * @param $title Title
+        * @param Title $title
         */
        public static function onArticleEdit( $title ) {
                WikiPage::onArticleEdit( $title );
        }
 
        /**
-        * @param $oldtext
-        * @param $newtext
-        * @param $flags
+        * @param string $oldtext
+        * @param string $newtext
+        * @param int $flags
         * @return string
         * @deprecated since 1.21, use ContentHandler::getAutosummary() instead
         */
index 217744e..45ad4d1 100644 (file)
@@ -204,8 +204,8 @@ class AuthPlugin {
         * Update user information in the external authentication database.
         * Return true if successful.
         *
-        * @param $user User object.
-        * @return Boolean
+        * @param User $user
+        * @return bool
         */
        public function updateExternalDB( $user ) {
                return true;
index baa9501..69f0e2f 100644 (file)
@@ -89,6 +89,7 @@ $wgAutoloadLocalClasses = array(
        'HTMLButtonField' => 'includes/htmlform/HTMLButtonField.php',
        'HTMLCheckField' => 'includes/htmlform/HTMLCheckField.php',
        'HTMLCheckMatrix' => 'includes/htmlform/HTMLCheckMatrix.php',
+       'HTMLFormFieldCloner' => 'includes/htmlform/HTMLFormFieldCloner.php',
        'HTMLEditTools' => 'includes/htmlform/HTMLEditTools.php',
        'HTMLFloatField' => 'includes/htmlform/HTMLFloatField.php',
        'HTMLForm' => 'includes/htmlform/HTMLForm.php',
@@ -134,7 +135,7 @@ $wgAutoloadLocalClasses = array(
        'MagicWordArray' => 'includes/MagicWord.php',
        'MailAddress' => 'includes/UserMailer.php',
        'MediaWiki' => 'includes/Wiki.php',
-       'MediaWiki_I18N' => 'includes/SkinTemplate.php',
+       'MediaWikiI18N' => 'includes/SkinTemplate.php',
        'MediaWikiVersionFetcher' => 'includes/MediaWikiVersionFetcher.php',
        'Message' => 'includes/Message.php',
        'MessageBlobStore' => 'includes/MessageBlobStore.php',
@@ -391,7 +392,9 @@ $wgAutoloadLocalClasses = array(
 
        # includes/config
        'Config' => 'includes/config/Config.php',
-       'GlobalConfig' => 'includes/config/GlobalConfig.php',
+       'ConfigException' => 'includes/config/ConfigException.php',
+       'ConfigFactory' => 'includes/config/ConfigFactory.php',
+       'GlobalVarConfig' => 'includes/config/GlobalVarConfig.php',
 
        # includes/content
        'AbstractContent' => 'includes/content/AbstractContent.php',
@@ -621,22 +624,22 @@ $wgAutoloadLocalClasses = array(
        'SqliteInstaller' => 'includes/installer/SqliteInstaller.php',
        'SqliteUpdater' => 'includes/installer/SqliteUpdater.php',
        'WebInstaller' => 'includes/installer/WebInstaller.php',
-       'WebInstaller_Complete' => 'includes/installer/WebInstallerPage.php',
-       'WebInstaller_Copying' => 'includes/installer/WebInstallerPage.php',
-       'WebInstaller_DBConnect' => 'includes/installer/WebInstallerPage.php',
-       'WebInstaller_DBSettings' => 'includes/installer/WebInstallerPage.php',
-       'WebInstaller_Document' => 'includes/installer/WebInstallerPage.php',
-       'WebInstaller_ExistingWiki' => 'includes/installer/WebInstallerPage.php',
-       'WebInstaller_Install' => 'includes/installer/WebInstallerPage.php',
-       'WebInstaller_Language' => 'includes/installer/WebInstallerPage.php',
-       'WebInstaller_Name' => 'includes/installer/WebInstallerPage.php',
-       'WebInstaller_Options' => 'includes/installer/WebInstallerPage.php',
-       'WebInstaller_Readme' => 'includes/installer/WebInstallerPage.php',
-       'WebInstaller_ReleaseNotes' => 'includes/installer/WebInstallerPage.php',
-       'WebInstaller_Restart' => 'includes/installer/WebInstallerPage.php',
-       'WebInstaller_Upgrade' => 'includes/installer/WebInstallerPage.php',
-       'WebInstaller_UpgradeDoc' => 'includes/installer/WebInstallerPage.php',
-       'WebInstaller_Welcome' => 'includes/installer/WebInstallerPage.php',
+       'WebInstallerComplete' => 'includes/installer/WebInstallerPage.php',
+       'WebInstallerCopying' => 'includes/installer/WebInstallerPage.php',
+       'WebInstallerDBConnect' => 'includes/installer/WebInstallerPage.php',
+       'WebInstallerDBSettings' => 'includes/installer/WebInstallerPage.php',
+       'WebInstallerDocument' => 'includes/installer/WebInstallerPage.php',
+       'WebInstallerExistingWiki' => 'includes/installer/WebInstallerPage.php',
+       'WebInstallerInstall' => 'includes/installer/WebInstallerPage.php',
+       'WebInstallerLanguage' => 'includes/installer/WebInstallerPage.php',
+       'WebInstallerName' => 'includes/installer/WebInstallerPage.php',
+       'WebInstallerOptions' => 'includes/installer/WebInstallerPage.php',
+       'WebInstallerReadme' => 'includes/installer/WebInstallerPage.php',
+       'WebInstallerReleaseNotes' => 'includes/installer/WebInstallerPage.php',
+       'WebInstallerRestart' => 'includes/installer/WebInstallerPage.php',
+       'WebInstallerUpgrade' => 'includes/installer/WebInstallerPage.php',
+       'WebInstallerUpgradeDoc' => 'includes/installer/WebInstallerPage.php',
+       'WebInstallerWelcome' => 'includes/installer/WebInstallerPage.php',
        'WebInstallerOutput' => 'includes/installer/WebInstallerOutput.php',
        'WebInstallerPage' => 'includes/installer/WebInstallerPage.php',
 
@@ -676,7 +679,7 @@ $wgAutoloadLocalClasses = array(
 
        # includes/libs
        'CSSJanus' => 'includes/libs/CSSJanus.php',
-       'CSSJanus_Tokenizer' => 'includes/libs/CSSJanus.php',
+       'CSSJanusTokenizer' => 'includes/libs/CSSJanus.php',
        'CSSMin' => 'includes/libs/CSSMin.php',
        'GenericArrayObject' => 'includes/libs/GenericArrayObject.php',
        'HashRing' => 'includes/libs/HashRing.php',
@@ -684,6 +687,7 @@ $wgAutoloadLocalClasses = array(
        'IEContentAnalyzer' => 'includes/libs/IEContentAnalyzer.php',
        'IEUrlExtension' => 'includes/libs/IEUrlExtension.php',
        'MappedIterator' => 'includes/libs/MappedIterator.php',
+       'IPSet' => 'includes/libs/IPSet.php',
        'JavaScriptMinifier' => 'includes/libs/JavaScriptMinifier.php',
        'JSCompilerContext' => 'includes/libs/jsminplus.php',
        'JSMinPlus' => 'includes/libs/jsminplus.php',
@@ -697,6 +701,9 @@ $wgAutoloadLocalClasses = array(
        'RunningStat' => 'includes/libs/RunningStat.php',
        'ScopedCallback' => 'includes/libs/ScopedCallback.php',
        'ScopedPHPTimeout' => 'includes/libs/ScopedPHPTimeout.php',
+       'SwiftVirtualRESTService' => 'includes/libs/virtualrest/SwiftVirtualRESTService.php',
+       'VirtualRESTService' => 'includes/libs/virtualrest/VirtualRESTService.php',
+       'VirtualRESTServiceClient' => 'includes/libs/virtualrest/VirtualRESTServiceClient.php',
        'XmlTypeCheck' => 'includes/libs/XmlTypeCheck.php',
 
        # includes/libs/lessphp
@@ -834,8 +841,10 @@ $wgAutoloadLocalClasses = array(
        'ProfilerSimpleText' => 'includes/profiler/ProfilerSimpleText.php',
        'ProfilerSimpleTrace' => 'includes/profiler/ProfilerSimpleTrace.php',
        'ProfilerSimpleUDP' => 'includes/profiler/ProfilerSimpleUDP.php',
+       'ProfilerStandard' => 'includes/profiler/ProfilerStandard.php',
        'ProfilerStub' => 'includes/profiler/ProfilerStub.php',
        'ProfileSection' => 'includes/profiler/Profiler.php',
+       'TransactionProfiler' => 'includes/profiler/Profiler.php',
 
        # includes/rcfeed
        'RCFeedEngine' => 'includes/rcfeed/RCFeedEngine.php',
@@ -865,28 +874,28 @@ $wgAutoloadLocalClasses = array(
        'ResourceLoaderUserTokensModule' => 'includes/resourceloader/ResourceLoaderUserTokensModule.php',
        'ResourceLoaderLanguageDataModule' =>
                'includes/resourceloader/ResourceLoaderLanguageDataModule.php',
+       'ResourceLoaderLanguageNamesModule' =>
+               'includes/resourceloader/ResourceLoaderLanguageNamesModule.php',
        'ResourceLoaderWikiModule' => 'includes/resourceloader/ResourceLoaderWikiModule.php',
 
        # includes/revisiondelete
-       'RevDel_ArchivedFileItem' => 'includes/revisiondelete/RevisionDelete.php',
-       'RevDel_ArchivedFileList' => 'includes/revisiondelete/RevisionDelete.php',
-       'RevDel_ArchivedRevisionItem' => 'includes/revisiondelete/RevisionDelete.php',
-       'RevDel_ArchiveItem' => 'includes/revisiondelete/RevisionDelete.php',
-       'RevDel_ArchiveList' => 'includes/revisiondelete/RevisionDelete.php',
-       'RevDel_FileItem' => 'includes/revisiondelete/RevisionDelete.php',
-       'RevDel_FileList' => 'includes/revisiondelete/RevisionDelete.php',
-       'RevDel_Item' => 'includes/revisiondelete/RevisionDeleteAbstracts.php',
-       'RevDel_List' => 'includes/revisiondelete/RevisionDeleteAbstracts.php',
-       'RevDel_LogItem' => 'includes/revisiondelete/RevisionDelete.php',
-       'RevDel_LogList' => 'includes/revisiondelete/RevisionDelete.php',
-       'RevDel_RevisionItem' => 'includes/revisiondelete/RevisionDelete.php',
-       'RevDel_RevisionList' => 'includes/revisiondelete/RevisionDelete.php',
+       'RevDelArchivedFileItem' => 'includes/revisiondelete/RevisionDelete.php',
+       'RevDelArchivedFileList' => 'includes/revisiondelete/RevisionDelete.php',
+       'RevDelArchivedRevisionItem' => 'includes/revisiondelete/RevisionDelete.php',
+       'RevDelArchiveItem' => 'includes/revisiondelete/RevisionDelete.php',
+       'RevDelArchiveList' => 'includes/revisiondelete/RevisionDelete.php',
+       'RevDelFileItem' => 'includes/revisiondelete/RevisionDelete.php',
+       'RevDelFileList' => 'includes/revisiondelete/RevisionDelete.php',
+       'RevDelItem' => 'includes/revisiondelete/RevisionDeleteAbstracts.php',
+       'RevDelList' => 'includes/revisiondelete/RevisionDeleteAbstracts.php',
+       'RevDelLogItem' => 'includes/revisiondelete/RevisionDelete.php',
+       'RevDelLogList' => 'includes/revisiondelete/RevisionDelete.php',
+       'RevDelRevisionItem' => 'includes/revisiondelete/RevisionDelete.php',
+       'RevDelRevisionList' => 'includes/revisiondelete/RevisionDelete.php',
        'RevisionDeleter' => 'includes/revisiondelete/RevisionDeleter.php',
        'RevisionDeleteUser' => 'includes/revisiondelete/RevisionDeleteUser.php',
 
        # includes/search
-       'MssqlSearchResultSet' => 'includes/search/SearchMssql.php',
-       'MySQLSearchResultSet' => 'includes/search/SearchMySQL.php',
        'PostgresSearchResult' => 'includes/search/SearchPostgres.php',
        'PostgresSearchResultSet' => 'includes/search/SearchPostgres.php',
        'SearchDatabase' => 'includes/search/SearchDatabase.php',
@@ -902,7 +911,6 @@ $wgAutoloadLocalClasses = array(
        'SearchResultSet' => 'includes/search/SearchResultSet.php',
        'SearchResultTooMany' => 'includes/search/SearchEngine.php',
        'SearchSqlite' => 'includes/search/SearchSqlite.php',
-       'SqliteSearchResultSet' => 'includes/search/SearchSqlite.php',
        'SqlSearchResultSet' => 'includes/search/SearchResultSet.php',
 
        # includes/site
@@ -947,7 +955,6 @@ $wgAutoloadLocalClasses = array(
        'HTMLBlockedUsersItemSelect' => 'includes/specials/SpecialBlockList.php',
        'ImageListPager' => 'includes/specials/SpecialListfiles.php',
        'ImportReporter' => 'includes/specials/SpecialImport.php',
-       'IPBlockForm' => 'includes/specials/SpecialBlock.php',
        'LinkSearchPage' => 'includes/specials/SpecialLinkSearch.php',
        'ListredirectsPage' => 'includes/specials/SpecialListredirects.php',
        'ListDuplicatedFilesPage' => 'includes/specials/SpecialListDuplicatedFiles.php',
@@ -1058,7 +1065,6 @@ $wgAutoloadLocalClasses = array(
        'WantedFilesPage' => 'includes/specials/SpecialWantedfiles.php',
        'WantedPagesPage' => 'includes/specials/SpecialWantedpages.php',
        'WantedTemplatesPage' => 'includes/specials/SpecialWantedtemplates.php',
-       'WatchlistEditor' => 'includes/specials/SpecialEditWatchlist.php',
        'WithoutInterwikiPage' => 'includes/specials/SpecialWithoutinterwiki.php',
 
        # includes/templates
@@ -1102,9 +1108,6 @@ $wgAutoloadLocalClasses = array(
        'CdbWriter' => 'includes/utils/Cdb.php',
        'CdbWriterDBA' => 'includes/utils/CdbDBA.php',
        'CdbWriterPHP' => 'includes/utils/CdbPHP.php',
-       'ConfEditor' => 'includes/utils/ConfEditor.php',
-       'ConfEditorParseError' => 'includes/utils/ConfEditor.php',
-       'ConfEditorToken' => 'includes/utils/ConfEditor.php',
        'DoubleReplacer' => 'includes/utils/StringUtils.php',
        'ExplodeIterator' => 'includes/utils/StringUtils.php',
        'HashtableReplacer' => 'includes/utils/StringUtils.php',
@@ -1121,15 +1124,15 @@ $wgAutoloadLocalClasses = array(
 
        # languages
        'ConverterRule' => 'languages/ConverterRule.php',
-       'FakeConverter' => 'languages/Language.php',
+       'FakeConverter' => 'languages/FakeConverter.php',
        'Language' => 'languages/Language.php',
        'LanguageConverter' => 'languages/LanguageConverter.php',
        'CLDRPluralRuleConverter' => 'languages/utils/CLDRPluralRuleConverter.php',
-       'CLDRPluralRuleConverter_Expression' => 'languages/utils/CLDRPluralRuleConverter_Expression.php',
-       'CLDRPluralRuleConverter_Fragment' => 'languages/utils/CLDRPluralRuleConverter_Fragment.php',
-       'CLDRPluralRuleConverter_Operator' => 'languages/utils/CLDRPluralRuleConverter_Operator.php',
+       'CLDRPluralRuleConverterExpression' => 'languages/utils/CLDRPluralRuleConverterExpression.php',
+       'CLDRPluralRuleConverterFragment' => 'languages/utils/CLDRPluralRuleConverterFragment.php',
+       'CLDRPluralRuleConverterOperator' => 'languages/utils/CLDRPluralRuleConverterOperator.php',
        'CLDRPluralRuleEvaluator' => 'languages/utils/CLDRPluralRuleEvaluator.php',
-       'CLDRPluralRuleEvaluator_Range' => 'languages/utils/CLDRPluralRuleEvaluator_Range.php',
+       'CLDRPluralRuleEvaluatorRange' => 'languages/utils/CLDRPluralRuleEvaluatorRange.php',
        'CLDRPluralRuleError' => 'languages/utils/CLDRPluralRuleError.php',
 
        # maintenance
@@ -1163,7 +1166,6 @@ $wgAutoloadLocalClasses = array(
        'CsvStatsOutput' => 'maintenance/language/StatOutputs.php',
        'ExtensionLanguages' => 'maintenance/language/languages.inc',
        'Languages' => 'maintenance/language/languages.inc',
-       'MessageWriter' => 'maintenance/language/writeMessagesArray.inc',
        'StatsOutput' => 'maintenance/language/StatOutputs.php',
        'TextStatsOutput' => 'maintenance/language/StatOutputs.php',
        'WikiStatsOutput' => 'maintenance/language/StatOutputs.php',
@@ -1177,11 +1179,7 @@ $wgAutoloadLocalClasses = array(
        'MyLocalSettingsGenerator' => 'mw-config/overrides.php',
 
        # skins
-       'CologneBlueTemplate' => 'skins/CologneBlue.php',
-       'ModernTemplate' => 'skins/Modern.php',
        'MonoBookTemplate' => 'skins/MonoBook.php',
-       'SkinCologneBlue' => 'skins/CologneBlue.php',
-       'SkinModern' => 'skins/Modern.php',
        'SkinMonoBook' => 'skins/MonoBook.php',
        'SkinVector' => 'skins/Vector.php',
        'VectorTemplate' => 'skins/Vector.php',
@@ -1255,8 +1253,8 @@ class AutoLoader {
         * Sanitizer that have define()s outside of their class definition. Of course
         * this wouldn't be necessary if everything in MediaWiki was class-based. Sigh.
         *
-        * @param $class string
-        * @return Boolean Return the results of class_exists() so we know if we were successful
+        * @param string $class
+        * @return bool Return the results of class_exists() so we know if we were successful
         */
        static function loadClass( $class ) {
                return class_exists( $class );
index 197ad9c..81f3b7a 100644 (file)
@@ -29,7 +29,7 @@ class Autopromote {
        /**
         * Get the groups for the given user based on $wgAutopromote.
         *
-        * @param $user User The user to get the groups for
+        * @param User $user The user to get the groups for
         * @return array Array of groups to promote to.
         */
        public static function getAutopromoteGroups( User $user ) {
@@ -53,8 +53,8 @@ class Autopromote {
         *
         * Does not return groups the user already belongs to or has once belonged.
         *
-        * @param $user User The user to get the groups for
-        * @param string $event key in $wgAutopromoteOnce (each one has groups/criteria)
+        * @param User $user The user to get the groups for
+        * @param string $event Key in $wgAutopromoteOnce (each one has groups/criteria)
         *
         * @return array Groups the user should be promoted to.
         *
@@ -99,8 +99,8 @@ class Autopromote {
         * This function evaluates the former type recursively, and passes off to
         * self::checkCondition for evaluation of the latter type.
         *
-        * @param $cond Mixed: a condition, possibly containing other conditions
-        * @param $user User The user to check the conditions against
+        * @param mixed $cond A condition, possibly containing other conditions
+        * @param User $user The user to check the conditions against
         * @return bool Whether the condition is true
         */
        private static function recCheckCondition( $cond, User $user ) {
@@ -156,7 +156,7 @@ class Autopromote {
         * APCOND_AGE.  Other types will throw an exception if no extension evaluates them.
         *
         * @param array $cond A condition, which must not contain other conditions
-        * @param $user User The user to check the condition against
+        * @param User $user The user to check the condition against
         * @throws MWException
         * @return bool Whether the condition is true for the user
         */
index a3d3691..3896369 100644 (file)
  * @file
  */
 class Block {
-       /* public*/ var $mReason, $mTimestamp, $mAuto, $mExpiry, $mHideName;
+       /** @var string */
+       public $mReason;
 
-       protected
-               $mId,
-               $mFromMaster,
+       /** @var bool|string */
+       public $mTimestamp;
 
-               $mBlockEmail,
-               $mDisableUsertalk,
-               $mCreateAccount,
-               $mParentBlockId;
+       /** @var int */
+       public $mAuto;
 
-       /** @var User|String */
+       /** @var bool|string */
+       public $mExpiry;
+
+       public $mHideName;
+
+       /** @var int */
+       public $mParentBlockId;
+
+       /** @var int */
+       protected $mId;
+
+       /** @var bool */
+       protected $mFromMaster;
+
+       /** @var bool */
+       protected $mBlockEmail;
+
+       /** @var bool */
+       protected $mDisableUsertalk;
+
+       /** @var bool */
+       protected $mCreateAccount;
+
+       /** @var User|string */
        protected $target;
 
-       /** @var Integer Hack for foreign blocking (CentralAuth) */
+       /** @var int Hack for foreign blocking (CentralAuth) */
        protected $forcedTargetID;
 
-       /** @var Integer Block::TYPE_ constant. Can only be USER, IP or RANGE internally */
+       /** @var int Block::TYPE_ constant. Can only be USER, IP or RANGE internally */
        protected $type;
 
        /** @var User */
        protected $blocker;
 
-       /** @var Bool */
+       /** @var bool */
        protected $isHardblock = true;
 
-       /** @var Bool */
+       /** @var bool */
        protected $isAutoblocking = true;
 
        # TYPE constants
@@ -57,9 +78,8 @@ class Block {
        const TYPE_ID = 5;
 
        /**
-        * Constructor
-        * @todo FIXME: Don't know what the best format to have for this constructor is, but fourteen
-        * optional parameters certainly isn't it.
+        * @todo FIXME: Don't know what the best format to have for this constructor
+        *   is, but fourteen optional parameters certainly isn't it.
         */
        function __construct( $address = '', $user = 0, $by = 0, $reason = '',
                $timestamp = 0, $auto = 0, $expiry = '', $anonOnly = 0, $createAccount = 0, $enableAutoblock = 0,
@@ -104,8 +124,8 @@ class Block {
        /**
         * Load a blocked user from their block id.
         *
-        * @param $id Integer: Block id to search for
-        * @return Block object or null
+        * @param int $id Block id to search for
+        * @return Block|null
         */
        public static function newFromID( $id ) {
                $dbr = wfGetDB( DB_SLAVE );
@@ -151,7 +171,7 @@ class Block {
         * Check if two blocks are effectively equal.  Doesn't check irrelevant things like
         * the blocking user or the block timestamp, only things which affect the blocked user
         *
-        * @param $block Block
+        * @param Block $block
         *
         * @return bool
         */
@@ -176,10 +196,10 @@ class Block {
         *     1) A block directly on the given user or IP
         *     2) A rangeblock encompassing the given IP (smallest first)
         *     3) An autoblock on the given IP
-        * @param $vagueTarget User|String also search for blocks affecting this target.  Doesn't
+        * @param User|string $vagueTarget Also search for blocks affecting this target.  Doesn't
         *     make any sense to use TYPE_AUTO / TYPE_ID here. Leave blank to skip IP lookups.
         * @throws MWException
-        * @return Bool whether a relevant block was found
+        * @return bool Whether a relevant block was found
         */
        protected function newLoad( $vagueTarget = null ) {
                $db = wfGetDB( $this->mFromMaster ? DB_MASTER : DB_SLAVE );
@@ -280,7 +300,7 @@ class Block {
         * Get a set of SQL conditions which will select rangeblocks encompassing a given range
         * @param string $start Hexadecimal IP representation
         * @param string $end Hexadecimal IP representation, or null to use $start = $end
-        * @return String
+        * @return string
         */
        public static function getRangeCond( $start, $end = null ) {
                if ( $end === null ) {
@@ -312,8 +332,8 @@ class Block {
        /**
         * Get the component of an IP address which is certain to be the same between an IP
         * address and a rangeblock containing that IP address.
-        * @param $hex String Hexadecimal IP representation
-        * @return String
+        * @param string $hex Hexadecimal IP representation
+        * @return string
         */
        protected static function getIpFragment( $hex ) {
                global $wgBlockCIDRLimit;
@@ -327,7 +347,7 @@ class Block {
        /**
         * Given a database row from the ipblocks table, initialize
         * member variables
-        * @param $row ResultWrapper: a row from the ipblocks table
+        * @param ResultWrapper $row A row from the ipblocks table
         */
        protected function initFromRow( $row ) {
                $this->setTarget( $row->ipb_address );
@@ -362,7 +382,7 @@ class Block {
 
        /**
         * Create a new Block object from a database row
-        * @param $row ResultWrapper row from the ipblocks table
+        * @param ResultWrapper $row Row from the ipblocks table
         * @return Block
         */
        public static function newFromRow( $row ) {
@@ -375,7 +395,7 @@ class Block {
         * Delete the row from the IP blocks table.
         *
         * @throws MWException
-        * @return Boolean
+        * @return bool
         */
        public function delete() {
                if ( wfReadOnly() ) {
@@ -397,8 +417,8 @@ class Block {
         * Insert a block into the block table. Will fail if there is a conflicting
         * block (same name and options) already in the database.
         *
-        * @param $dbw DatabaseBase if you have one available
-        * @return mixed: false on failure, assoc array on success:
+        * @param DatabaseBase $dbw If you have one available
+        * @return bool|array False on failure, assoc array on success:
         *      ('id' => block ID, 'autoIds' => array of autoblock IDs)
         */
        public function insert( $dbw = null ) {
@@ -482,8 +502,8 @@ class Block {
 
        /**
         * Get an array suitable for passing to $dbw->insert() or $dbw->update()
-        * @param $db DatabaseBase
-        * @return Array
+        * @param DatabaseBase $db
+        * @return array
         */
        protected function getDatabaseArray( $db = null ) {
                if ( !$db ) {
@@ -521,7 +541,7 @@ class Block {
        }
 
        /**
-        * @return Array
+        * @return array
         */
        protected function getAutoblockUpdateArray() {
                return array(
@@ -538,7 +558,7 @@ class Block {
         * Retroactively autoblocks the last IP used by the user (if it is a user)
         * blocked by this Block.
         *
-        * @return Array: block IDs of retroactive autoblocks made
+        * @return array Block IDs of retroactive autoblocks made
         */
        protected function doRetroactiveAutoblock() {
                $blockIds = array();
@@ -562,7 +582,7 @@ class Block {
         *
         * @param Block $block
         * @param array &$blockIds
-        * @return Array: block IDs of retroactive autoblocks made
+        * @return array Block IDs of retroactive autoblocks made
         */
        protected static function defaultRetroactiveAutoblock( Block $block, array &$blockIds ) {
                global $wgPutIPinRC;
@@ -603,7 +623,7 @@ class Block {
         * TODO: this probably belongs somewhere else, but not sure where...
         *
         * @param string $ip The IP to check
-        * @return Boolean
+        * @return bool
         */
        public static function isWhitelistedFromAutoblocks( $ip ) {
                global $wgMemc;
@@ -645,8 +665,8 @@ class Block {
        /**
         * Autoblocks the given IP, referring to this Block.
         *
-        * @param string $autoblockIP the IP to autoblock.
-        * @return mixed: block ID if an autoblock was inserted, false if not.
+        * @param string $autoblockIP The IP to autoblock.
+        * @return int|bool Block ID if an autoblock was inserted, false if not.
         */
        public function doAutoblock( $autoblockIP ) {
                # If autoblocks are disabled, go away.
@@ -716,7 +736,7 @@ class Block {
 
        /**
         * Check if a block has expired. Delete it if it is.
-        * @return Boolean
+        * @return bool
         */
        public function deleteIfExpired() {
                wfProfileIn( __METHOD__ );
@@ -736,7 +756,7 @@ class Block {
 
        /**
         * Has the block expired?
-        * @return Boolean
+        * @return bool
         */
        public function isExpired() {
                $timestamp = wfTimestampNow();
@@ -751,7 +771,7 @@ class Block {
 
        /**
         * Is the block address valid (i.e. not a null string?)
-        * @return Boolean
+        * @return bool
         */
        public function isValid() {
                return $this->getTarget() != null;
@@ -782,7 +802,7 @@ class Block {
        /**
         * Get the IP address at the start of the range in Hex form
         * @throws MWException
-        * @return String IP in Hex form
+        * @return string IP in Hex form
         */
        public function getRangeStart() {
                switch ( $this->type ) {
@@ -801,7 +821,7 @@ class Block {
        /**
         * Get the IP address at the end of the range in Hex form
         * @throws MWException
-        * @return String IP in Hex form
+        * @return string IP in Hex form
         */
        public function getRangeEnd() {
                switch ( $this->type ) {
@@ -820,7 +840,7 @@ class Block {
        /**
         * Get the user id of the blocking sysop
         *
-        * @return Integer (0 for foreign users)
+        * @return int (0 for foreign users)
         */
        public function getBy() {
                $blocker = $this->getBlocker();
@@ -832,7 +852,7 @@ class Block {
        /**
         * Get the username of the blocking sysop
         *
-        * @return String
+        * @return string
         */
        public function getByName() {
                $blocker = $this->getBlocker();
@@ -852,8 +872,8 @@ class Block {
        /**
         * Get/set a flag determining whether the master is used for reads
         *
-        * @param $x Bool
-        * @return Bool
+        * @param bool $x
+        * @return bool
         */
        public function fromMaster( $x = null ) {
                return wfSetVar( $this->mFromMaster, $x );
@@ -861,8 +881,8 @@ class Block {
 
        /**
         * Get/set whether the Block is a hardblock (affects logged-in users on a given IP/range
-        * @param $x Bool
-        * @return Bool
+        * @param bool $x
+        * @return bool
         */
        public function isHardblock( $x = null ) {
                wfSetVar( $this->isHardblock, $x );
@@ -885,9 +905,9 @@ class Block {
 
        /**
         * Get/set whether the Block prevents a given action
-        * @param $action String
-        * @param $x Bool
-        * @return Bool
+        * @param string $action
+        * @param bool $x
+        * @return bool
         */
        public function prevents( $action, $x = null ) {
                switch ( $action ) {
@@ -911,7 +931,7 @@ class Block {
 
        /**
         * Get the block name, but with autoblocked IPs hidden as per standard privacy policy
-        * @return String, text is escaped
+        * @return string Text is escaped
         */
        public function getRedactedName() {
                if ( $this->mAuto ) {
@@ -928,8 +948,8 @@ class Block {
        /**
         * Get a timestamp of the expiry for autoblocks
         *
-        * @param $timestamp String|Int
-        * @return String
+        * @param string|int $timestamp
+        * @return string
         */
        public static function getAutoblockExpiry( $timestamp ) {
                global $wgAutoblockExpiry;
@@ -955,7 +975,7 @@ class Block {
 
        /**
         * Given a target and the target's type, get an existing Block object if possible.
-        * @param $specificTarget String|User|Int a block target, which may be one of several types:
+        * @param string|User|int $specificTarget A block target, which may be one of several types:
         *     * A user to block, in which case $target will be a User
         *     * An IP to block, in which case $target will be a User generated by using
         *       User::newFromName( $ip, false ) to turn off name validation
@@ -965,10 +985,10 @@ class Block {
         *     Calling this with a user, IP address or range will not select autoblocks, and will
         *     only select a block where the targets match exactly (so looking for blocks on
         *     1.2.3.4 will not select 1.2.0.0/16 or even 1.2.3.4/32)
-        * @param $vagueTarget String|User|Int as above, but we will search for *any* block which
+        * @param string|User|int $vagueTarget As above, but we will search for *any* block which
         *     affects that target (so for an IP address, get ranges containing that IP; and also
         *     get any relevant autoblocks). Leave empty or blank to skip IP-based lookups.
-        * @param bool $fromMaster whether to use the DB_MASTER database
+        * @param bool $fromMaster Whether to use the DB_MASTER database
         * @return Block|null (null if no relevant block could be found).  The target and type
         *     of the returned Block will refer to the actual block which was found, which might
         *     not be the same as the target you gave if you used $vagueTarget!
@@ -1006,11 +1026,11 @@ class Block {
        /**
         * Get all blocks that match any IP from an array of IP addresses
         *
-        * @param Array $ipChain list of IPs (strings), usually retrieved from the
+        * @param array $ipChain List of IPs (strings), usually retrieved from the
         *         X-Forwarded-For header of the request
-        * @param Bool $isAnon Exclude anonymous-only blocks if false
-        * @param Bool $fromMaster Whether to query the master or slave database
-        * @return Array of Blocks
+        * @param bool $isAnon Exclude anonymous-only blocks if false
+        * @param bool $fromMaster Whether to query the master or slave database
+        * @return array Array of Blocks
         * @since 1.22
         */
        public static function getBlocksForIPList( array $ipChain, $isAnon, $fromMaster = false ) {
@@ -1030,7 +1050,7 @@ class Block {
                                continue;
                        }
                        # Don't check trusted IPs (includes local squids which will be in every request)
-                       if ( wfIsTrustedProxy( $ipaddr ) ) {
+                       if ( IP::isTrustedProxy( $ipaddr ) ) {
                                continue;
                        }
                        # Check both the original IP (to check against single blocks), as well as build
@@ -1085,11 +1105,11 @@ class Block {
         *  - If there are multiple exact or range blocks at the same level, the one chosen
         *    is random
 
-        * @param Array $ipChain list of IPs (strings). This is used to determine how "close"
+        * @param array $ipChain List of IPs (strings). This is used to determine how "close"
         *        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, ...)
-        * @param Array $block Array of blocks
+        * @param array $block Array of blocks
         * @return Block|null the "best" block from the list
         */
        public static function chooseBlock( array $blocks, array $ipChain ) {
@@ -1194,7 +1214,7 @@ class Block {
         * as a string; for User objects this will return User::__toString()
         * which in turn gives User::getName().
         *
-        * @param $target String|Int|User|null
+        * @param string|int|User|null $target
         * @return array( User|String|null, Block::TYPE_ constant|null )
         */
        public static function parseTarget( $target ) {
@@ -1251,7 +1271,7 @@ class Block {
 
        /**
         * Get the type of target for this particular block
-        * @return Block::TYPE_ constant, will never be TYPE_ID
+        * @return int Block::TYPE_ constant, will never be TYPE_ID
         */
        public function getType() {
                return $this->mAuto
@@ -1274,7 +1294,7 @@ class Block {
         * Get the target for this particular Block.  Note that for autoblocks,
         * this returns the unredacted name; frontend functions need to call $block->getRedactedName()
         * in this situation.
-        * @return User|String
+        * @return User|string
         */
        public function getTarget() {
                return $this->target;
@@ -1283,7 +1303,7 @@ class Block {
        /**
         * @since 1.19
         *
-        * @return Mixed|string
+        * @return mixed|string
         */
        public function getExpiry() {
                return $this->mExpiry;
@@ -1291,7 +1311,7 @@ class Block {
 
        /**
         * Set the target for this block, and update $this->type accordingly
-        * @param $target Mixed
+        * @param mixed $target
         */
        public function setTarget( $target ) {
                list( $this->target, $this->type ) = self::parseTarget( $target );
@@ -1307,7 +1327,7 @@ class Block {
 
        /**
         * Set the user who implemented (or will implement) this block
-        * @param $user User|string Local User object or username string for foreign users
+        * @param User|string $user Local User object or username string for foreign users
         */
        public function setBlocker( $user ) {
                $this->blocker = $user;
index cfa4160..695eac3 100644 (file)
@@ -32,7 +32,7 @@ interface ICacheHelper {
         * Sets if the cache should be enabled or not.
         *
         * @since 1.20
-        * @param boolean $cacheEnabled
+        * @param bool $cacheEnabled
         */
        function setCacheEnabled( $cacheEnabled );
 
@@ -42,8 +42,8 @@ interface ICacheHelper {
         *
         * @since 1.20
         *
-        * @param integer|null $cacheExpiry Sets the cache expiry, either ttl in seconds or unix timestamp.
-        * @param boolean|null $cacheEnabled Sets if the cache should be enabled or not.
+        * @param int|null $cacheExpiry Sets the cache expiry, either ttl in seconds or unix timestamp.
+        * @param bool|null $cacheEnabled Sets if the cache should be enabled or not.
         */
        function startCache( $cacheExpiry = null, $cacheEnabled = null );
 
@@ -77,7 +77,7 @@ interface ICacheHelper {
         *
         * @since 1.20
         *
-        * @param integer $cacheExpiry
+        * @param int $cacheExpiry
         */
        function setExpiry( $cacheExpiry );
 }
@@ -105,7 +105,7 @@ class CacheHelper implements ICacheHelper {
         * The time to live for the cache, in seconds or a unix timestamp indicating the point of expiry.
         *
         * @since 1.20
-        * @var integer
+        * @var int
         */
        protected $cacheExpiry = 3600;
 
@@ -124,7 +124,7 @@ class CacheHelper implements ICacheHelper {
         * Null if this information is not available yet.
         *
         * @since 1.20
-        * @var boolean|null
+        * @var bool|null
         */
        protected $hasCached = null;
 
@@ -132,7 +132,7 @@ class CacheHelper implements ICacheHelper {
         * If the cache is enabled or not.
         *
         * @since 1.20
-        * @var boolean
+        * @var bool
         */
        protected $cacheEnabled = true;
 
@@ -156,7 +156,7 @@ class CacheHelper implements ICacheHelper {
         * Sets if the cache should be enabled or not.
         *
         * @since 1.20
-        * @param boolean $cacheEnabled
+        * @param bool $cacheEnabled
         */
        public function setCacheEnabled( $cacheEnabled ) {
                $this->cacheEnabled = $cacheEnabled;
@@ -168,8 +168,8 @@ class CacheHelper implements ICacheHelper {
         *
         * @since 1.20
         *
-        * @param integer|null $cacheExpiry Sets the cache expiry, either ttl in seconds or unix timestamp.
-        * @param boolean|null $cacheEnabled Sets if the cache should be enabled or not.
+        * @param int|null $cacheExpiry Sets the cache expiry, either ttl in seconds or unix timestamp.
+        * @param bool|null $cacheEnabled Sets if the cache should be enabled or not.
         */
        public function startCache( $cacheExpiry = null, $cacheEnabled = null ) {
                if ( is_null( $this->hasCached ) ) {
@@ -192,7 +192,7 @@ class CacheHelper implements ICacheHelper {
         * @since 1.20
         *
         * @param IContextSource $context
-        * @param boolean $includePurgeLink
+        * @param bool $includePurgeLink
         *
         * @return string
         */
@@ -328,7 +328,7 @@ class CacheHelper implements ICacheHelper {
         *
         * @since 1.20
         *
-        * @param integer $cacheExpiry
+        * @param int $cacheExpiry
         */
        public function setExpiry( $cacheExpiry ) {
                $this->cacheExpiry = $cacheExpiry;
@@ -378,7 +378,7 @@ class CacheHelper implements ICacheHelper {
         *
         * @since 1.20
         *
-        * @param $handlerFunction
+        * @param callable $handlerFunction
         */
        public function setOnInitializedHandler( $handlerFunction ) {
                $this->onInitHandler = $handlerFunction;
index e326ce2..e235e4e 100644 (file)
@@ -129,8 +129,8 @@ class Category {
        /**
         * Factory function.
         *
-        * @param $title Title for the category page
-        * @return Category|bool on a totally invalid name
+        * @param Title $title Title for the category page
+        * @return Category|bool On a totally invalid name
         */
        public static function newFromTitle( $title ) {
                $cat = new self();
@@ -144,7 +144,7 @@ class Category {
        /**
         * Factory function.
         *
-        * @param $id Integer: a category id
+        * @param int $id A category id
         * @return Category
         */
        public static function newFromID( $id ) {
@@ -156,11 +156,11 @@ class Category {
        /**
         * Factory function, for constructing a Category object from a result set
         *
-        * @param $row Result set row, must contain the cat_xxx fields. If the
+        * @param object $row Result set row, must contain the cat_xxx fields. If the
         *   fields are null, the resulting Category object will represent an empty
         *   category if a title object was given. If the fields are null and no
         *   title was given, this method fails and returns false.
-        * @param Title $title optional title object for the category represented by
+        * @param Title $title Optional title object for the category represented by
         *   the given row. May be provided if it is already known, to avoid having
         *   to re-create a title object later.
         * @return Category
@@ -253,9 +253,9 @@ class Category {
        /**
         * Fetch a TitleArray of up to $limit category members, beginning after the
         * category sort key $offset.
-        * @param $limit integer
-        * @param $offset string
-        * @return TitleArray object for category members.
+        * @param int $limit
+        * @param string $offset
+        * @return TitleArray TitleArray object for category members.
         */
        public function getMembers( $limit = false, $offset = '' ) {
                wfProfileIn( __METHOD__ );
index 7f213c3..49818e6 100644 (file)
  */
 
 class CategoryViewer extends ContextSource {
-       var $limit, $from, $until,
-               $articles, $articles_start_char,
-               $children, $children_start_char,
-               $showGallery, $imgsNoGalley,
-               $imgsNoGallery_start_char,
-               $imgsNoGallery;
+       /** @var int */
+       public $limit;
 
-       /**
-        * @var Array
-        */
-       var $nextPage;
+       /** @var array */
+       protected $from;
 
-       /**
-        * @var Array
-        */
-       var $flip;
+       /** @var array */
+       protected $until;
 
-       /**
-        * @var Title
-        */
-       var $title;
+       /** @var string[] */
+       public $articles;
 
-       /**
-        * @var Collation
-        */
-       var $collation;
+       /** @var array */
+       public $articles_start_char;
 
-       /**
-        * @var ImageGallery
-        */
-       var $gallery;
+       /** @var array */
+       protected $children;
 
-       /**
-        * Category object for this page
-        * @var Category
-        */
+       /** @var array */
+       protected $children_start_char;
+
+       /** @var bool */
+       protected $showGallery;
+
+       /** @var array */
+       protected $imgsNoGallery_start_char;
+
+       /** @var array */
+       protected $imgsNoGallery;
+
+       /** @var array */
+       protected $nextPage;
+
+       /** @var array */
+       protected $flip;
+
+       /** @var Title */
+       protected $title;
+
+       /** @var Collation */
+       protected $collation;
+
+       /** @var ImageGallery */
+       protected $gallery;
+
+       /** @var Category Category object for this page. */
        private $cat;
 
-       /**
-        * The original query array, to be used in generating paging links.
-        * @var array
-        */
+       /** @var array The original query array, to be used in generating paging links. */
        private $query;
 
        /**
-        * Constructor
-        *
         * @since 1.19 $context is a second, required parameter
-        * @param $title Title
-        * @param $context IContextSource
+        * @param Title $title
+        * @param IContextSource $context
         * @param array $from An array with keys page, subcat,
         *        and file for offset of results of each section (since 1.17)
         * @param array $until An array with 3 keys for until of each section (since 1.17)
-        * @param $query Array
+        * @param array $query
         */
        function __construct( $title, IContextSource $context, $from = array(),
                $until = array(), $query = array()
@@ -162,9 +167,9 @@ class CategoryViewer extends ContextSource {
 
        /**
         * Add a subcategory to the internal lists, using a Category object
-        * @param $cat Category
-        * @param $sortkey
-        * @param $pageLength
+        * @param Category $cat
+        * @param string $sortkey
+        * @param int $pageLength
         */
        function addSubcategoryObject( Category $cat, $sortkey, $pageLength ) {
                // Subcategory; strip the 'Category' namespace from the link text.
@@ -210,10 +215,10 @@ class CategoryViewer extends ContextSource {
 
        /**
         * Add a page in the image namespace
-        * @param $title Title
-        * @param $sortkey
-        * @param $pageLength
-        * @param $isRedirect bool
+        * @param Title $title
+        * @param string $sortkey
+        * @param int $pageLength
+        * @param bool $isRedirect
         */
        function addImage( Title $title, $sortkey, $pageLength, $isRedirect = false ) {
                global $wgContLang;
@@ -240,10 +245,10 @@ class CategoryViewer extends ContextSource {
 
        /**
         * Add a miscellaneous page
-        * @param $title
-        * @param $sortkey
-        * @param $pageLength
-        * @param $isRedirect bool
+        * @param Title $title
+        * @param string $sortkey
+        * @param int $pageLength
+        * @param bool $isRedirect
         */
        function addPage( $title, $sortkey, $pageLength, $isRedirect = false ) {
                global $wgContLang;
@@ -474,10 +479,10 @@ class CategoryViewer extends ContextSource {
         * Format a list of articles chunked by letter, either as a
         * bullet list or a columnar format, depending on the length.
         *
-        * @param $articles Array
-        * @param $articles_start_char Array
-        * @param $cutoff Int
-        * @return String
+        * @param array $articles
+        * @param array $articles_start_char
+        * @param int $cutoff
+        * @return string
         * @private
         */
        function formatList( $articles, $articles_start_char, $cutoff = 6 ) {
@@ -507,9 +512,9 @@ class CategoryViewer extends ContextSource {
         * More distant TODO: Scrap this and use CSS columns, whenever IE finally
         * supports those.
         *
-        * @param $articles Array
-        * @param $articles_start_char Array
-        * @return String
+        * @param array $articles
+        * @param string[] $articles_start_char
+        * @return string
         * @private
         */
        static function columnList( $articles, $articles_start_char ) {
@@ -563,9 +568,9 @@ class CategoryViewer extends ContextSource {
 
        /**
         * Format a list of articles chunked by letter in a bullet list.
-        * @param $articles Array
-        * @param $articles_start_char Array
-        * @return String
+        * @param array $articles
+        * @param string[] $articles_start_char
+        * @return string
         * @private
         */
        static function shortList( $articles, $articles_start_char ) {
@@ -590,7 +595,7 @@ class CategoryViewer extends ContextSource {
         * @param string $last The 'from' parameter for the generated URL
         * @param string $type A prefix for parameters, 'page' or 'subcat' or
         *     'file'
-        * @return String HTML
+        * @return string HTML
         */
        private function pagingLinks( $first, $last, $type = '' ) {
                $prevLink = $this->msg( 'prevn' )->numParams( $this->limit )->escaped();
index 6ef224b..b9cbc9a 100644 (file)
  *
  */
 class Categoryfinder {
-       var $articles = array(); # The original article IDs passed to the seed function
-       var $deadend = array(); # Array of DBKEY category names for categories that don't have a page
-       var $parents = array(); # Array of [ID => array()]
-       var $next = array(); # Array of article/category IDs
-       var $targets = array(); # Array of DBKEY category names
-       var $name2id = array();
-       var $mode; # "AND" or "OR"
+       /** @var int[] The original article IDs passed to the seed function */
+       protected $articles = array();
 
-       /**
-        * @var DatabaseBase
-        */
-       var $dbr; # Read-DB slave
+       /** @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  "AND" or "OR" */
+       protected $mode;
+
+       /** @var DatabaseBase Read-DB slave */
+       protected $dbr;
 
-       /**
-        * Constructor (currently empty).
-        */
        function __construct() {
        }
 
        /**
         * Initializes the instance. Do this prior to calling run().
-        * @param $article_ids Array of article IDs
-        * @param $categories FIXME
+        * @param array $article_ids Array of article IDs
+        * @param array $categories FIXME
         * @param string $mode FIXME, default 'AND'.
         * @todo FIXME: $categories/$mode
         */
@@ -113,7 +121,7 @@ class Categoryfinder {
         * 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
+        * @param array $path Used to check for recursion loops
         * @return bool Does this match the conditions?
         */
        function check( $id, &$conds, $path = array() ) {
index f73ec1f..d3dd51a 100644 (file)
@@ -65,8 +65,8 @@ class ChangeTags {
         *
         * @param string $tag tag
         *
-        * @return String: Short description of the tag from "mediawiki:tag-$tag" if this message exists,
-        *                 html-escaped version of $tag otherwise
+        * @return string Short description of the tag from "mediawiki:tag-$tag" if this message exists,
+        *   html-escaped version of $tag otherwise
         */
        public static function tagDescription( $tag ) {
                $msg = wfMessage( "tag-$tag" );
@@ -77,13 +77,13 @@ class ChangeTags {
         * Add tags to a change given its rc_id, rev_id and/or log_id
         *
         * @param string|array $tags Tags to add to the change
-        * @param $rc_id int: rc_id of the change to add the tags to
-        * @param $rev_id int: rev_id of the change to add the tags to
-        * @param $log_id int: log_id of the change to add the tags to
+        * @param int $rc_id rc_id of the change to add the tags to
+        * @param int $rev_id rev_id of the change to add the tags to
+        * @param int $log_id Log_id of the change to add the tags to
         * @param string $params params to put in the ct_params field of table 'change_tag'
         *
         * @throws MWException
-        * @return bool: false if no changes are made, otherwise true
+        * @return bool false if no changes are made, otherwise true
         *
         * @exception MWException when $rc_id, $rev_id and $log_id are all null
         */
@@ -192,9 +192,9 @@ class ChangeTags {
         *
         * @param string|array $tables Table names, see DatabaseBase::select
         * @param string|array $fields Fields used in query, see DatabaseBase::select
-        * @param string|array $conds conditions used in query, see DatabaseBase::select
-        * @param $join_conds Array: join conditions, see DatabaseBase::select
-        * @param array $options options, see Database::select
+        * @param string|array $conds Conditions used in query, see DatabaseBase::select
+        * @param array $join_conds Join conditions, see DatabaseBase::select
+        * @param array $options Options, see Database::select
         * @param bool|string $filter_tag Tag to select on
         *
         * @throws MWException When unable to determine appropriate JOIN condition for tagging
@@ -238,12 +238,12 @@ class ChangeTags {
         * Build a text box to select a change tag
         *
         * @param string $selected tag to select by default
-        * @param $fullForm Boolean:
+        * @param bool $fullForm
         *        - if false, then it returns an array of (label, form).
         *        - if true, it returns an entire form around the selector.
-        * @param $title Title object to send the form to.
+        * @param Title $title Title object to send the form to.
         *        Used when, and only when $fullForm is true.
-        * @return String or array:
+        * @return string|array
         *        - if $fullForm is false: Array with
         *        - if $fullForm is true: String, html fragment
         */
@@ -297,7 +297,7 @@ class ChangeTags {
         *
         * Tries memcached first.
         *
-        * @return Array of strings: tags
+        * @return string[] Array of strings: tags
         */
        public static function listDefinedTags() {
                // Caching...
index a5e5364..fb491e5 100644 (file)
@@ -31,8 +31,8 @@ class ChangesFeed {
        /**
         * Constructor
         *
-        * @param string $format feed's format (either 'rss' or 'atom')
-        * @param string $type type of feed (for cache keys)
+        * @param string $format Feed's format (either 'rss' or 'atom')
+        * @param string $type Type of feed (for cache keys)
         */
        public function __construct( $format, $type ) {
                $this->format = $format;
@@ -42,10 +42,10 @@ class ChangesFeed {
        /**
         * Get a ChannelFeed subclass object to use
         *
-        * @param string $title feed's title
-        * @param string $description feed's description
-        * @param string $url url of origin page
-        * @return ChannelFeed subclass or false on failure
+        * @param string $title Feed's title
+        * @param string $description Feed's description
+        * @param string $url Url of origin page
+        * @return ChannelFeed|bool ChannelFeed subclass or false on failure
         */
        public function getFeedObject( $title, $description, $url ) {
                global $wgSitename, $wgLanguageCode, $wgFeedClasses;
@@ -112,9 +112,9 @@ class ChangesFeed {
        /**
         * Save to feed result to $messageMemc
         *
-        * @param string $feed feed's content
-        * @param string $timekey memcached key of the last modification
-        * @param string $key memcached key of the content
+        * @param string $feed Feed's content
+        * @param string $timekey Memcached key of the last modification
+        * @param string $key Memcached key of the content
         */
        public function saveToCache( $feed, $timekey, $key ) {
                global $messageMemc;
@@ -126,10 +126,10 @@ class ChangesFeed {
        /**
         * Try to load the feed result from $messageMemc
         *
-        * @param $lastmod Integer: timestamp of the last item in the recentchanges table
-        * @param string $timekey memcached key of the last modification
-        * @param string $key memcached key of the content
-        * @return string|bool feed's content on cache hit or false on cache miss
+        * @param int $lastmod Timestamp of the last item in the recentchanges table
+        * @param string $timekey Memcached key of the last modification
+        * @param string $key Memcached key of the content
+        * @return string|bool Feed's content on cache hit or false on cache miss
         */
        public function loadFromCache( $lastmod, $timekey, $key ) {
                global $wgFeedCacheTimeout, $wgOut, $messageMemc;
@@ -163,8 +163,8 @@ class ChangesFeed {
 
        /**
         * Generate the feed items given a row from the database, printing the feed.
-        * @param $rows DatabaseBase resource with recentchanges rows
-        * @param $feed Feed object
+        * @param object $rows DatabaseBase resource with recentchanges rows
+        * @param Feed $feed
         */
        public static function generateFeed( $rows, &$feed ) {
                wfProfileIn( __METHOD__ );
@@ -179,7 +179,7 @@ class ChangesFeed {
 
        /**
         * Generate the feed items given a row from the database.
-        * @param $rows DatabaseBase resource with recentchanges rows
+        * @param object $rows DatabaseBase resource with recentchanges rows
         */
        public static function buildItems( $rows ) {
                wfProfileIn( __METHOD__ );
index 050ec63..71adb09 100644 (file)
@@ -21,7 +21,7 @@
  */
 
 abstract class Collation {
-       static $instance;
+       private static $instance;
 
        /**
         * @return Collation
@@ -108,7 +108,8 @@ abstract class Collation {
 }
 
 class UppercaseCollation extends Collation {
-       var $lang;
+       private $lang;
+
        function __construct() {
                // Get a language object so that we can use the generic UTF-8 uppercase
                // function there
@@ -153,8 +154,20 @@ class IdentityCollation extends Collation {
 class IcuCollation extends Collation {
        const FIRST_LETTER_VERSION = 2;
 
-       var $primaryCollator, $mainCollator, $locale, $digitTransformLanguage;
-       var $firstLetterData;
+       /** @var Collator */
+       private $primaryCollator;
+
+       /** @var Collator */
+       private $mainCollator;
+
+       /** @var  */
+       private $locale;
+
+       /** @var Language */
+       protected $digitTransformLanguage;
+
+       /** @var array */
+       private $firstLetterData;
 
        /**
         * Unified CJK blocks.
@@ -165,7 +178,7 @@ class IcuCollation extends Collation {
         * is pretty useless for sorting Chinese text anyway. Japanese and Korean
         * blocks are not included here, because they are smaller and more useful.
         */
-       static $cjkBlocks = array(
+       private static $cjkBlocks = array(
                array( 0x2E80, 0x2EFF ), // CJK Radicals Supplement
                array( 0x2F00, 0x2FDF ), // Kangxi Radicals
                array( 0x2FF0, 0x2FFF ), // Ideographic Description Characters
@@ -204,14 +217,19 @@ class IcuCollation extends Collation {
         * Empty arrays are intended; this signifies that the data for the language is
         * available and that there are, in fact, no additional letters to consider.
         */
-       static $tailoringFirstLetters = array(
+       private static $tailoringFirstLetters = array(
                // Verified by native speakers
                'be' => array( "Ё" ),
                'be-tarask' => array( "Ё" ),
+               'cy' => array( "Ch", "Dd", "Ff", "Ng", "Ll", "Ph", "Rh", "Th" ),
                'en' => array(),
+               'fa' => array( "آ", "ء", "ه" ),
                'fi' => array( "Å", "Ä", "Ö" ),
+               'fr' => array(),
                'hu' => array( "Cs", "Dz", "Dzs", "Gy", "Ly", "Ny", "Ö", "Sz", "Ty", "Ü", "Zs" ),
+               'is' => array( "Á", "Ð", "É", "Í", "Ó", "Ú", "Ý", "Þ", "Æ", "Ö", "Å" ),
                'it' => array(),
+               'lv' => array( "Č", "Ģ", "Ķ", "Ļ", "Ņ", "Š", "Ž" ),
                'pl' => array( "Ą", "Ć", "Ę", "Ł", "Ń", "Ó", "Ś", "Ź", "Ż" ),
                'pt' => array(),
                'ru' => array(),
@@ -229,7 +247,6 @@ class IcuCollation extends Collation {
                'ca' => array(),
                'co' => array(),
                'cs' => array( "Č", "Ch", "Ř", "Š", "Ž" ),
-               'cy' => array( "Ch", "Dd", "Ff", "Ng", "Ll", "Ph", "Rh", "Th" ),
                'da' => array( "Æ", "Ø", "Å" ),
                'de' => array(),
                'dsb' => array( "Č", "Ć", "Dź", "Ě", "Ch", "Ł", "Ń", "Ŕ", "Š", "Ś", "Ž", "Ź" ),
@@ -238,9 +255,7 @@ class IcuCollation extends Collation {
                'es' => array( "Ñ" ),
                'et' => array( "Š", "Ž", "Õ", "Ä", "Ö", "Ü" ),
                'eu' => array( "Ñ" ),
-               'fa' => array( "آ", "ء", "ه" ),
                'fo' => array( "Á", "Ð", "Í", "Ó", "Ú", "Ý", "Æ", "Ø", "Å" ),
-               'fr' => array(),
                'fur' => array( "À", "Á", "Â", "È", "Ì", "Ò", "Ù" ),
                'fy' => array(),
                'ga' => array(),
@@ -248,7 +263,6 @@ class IcuCollation extends Collation {
                'gl' => array( "Ch", "Ll", "Ñ" ),
                'hr' => array( "Č", "Ć", "Dž", "Đ", "Lj", "Nj", "Š", "Ž" ),
                'hsb' => array( "Č", "Dź", "Ě", "Ch", "Ł", "Ń", "Ř", "Š", "Ć", "Ž" ),
-               'is' => array( "Á", "Ð", "É", "Í", "Ó", "Ú", "Ý", "Þ", "Æ", "Ö", "Å" ),
                'kk' => array( "Ү", "І" ),
                'kl' => array( "Æ", "Ø", "Å" ),
                'ku' => array( "Ç", "Ê", "Î", "Ş", "Û" ),
@@ -256,7 +270,6 @@ class IcuCollation extends Collation {
                'la' => array(),
                'lb' => array(),
                'lt' => array( "Č", "Š", "Ž" ),
-               'lv' => array( "Č", "Ģ", "Ķ", "Ļ", "Ņ", "Š", "Ž" ),
                'mk' => array(),
                'mo' => array( "Ă", "Â", "Î", "Ş", "Ţ" ),
                'mt' => array( "Ċ", "Ġ", "Għ", "Ħ", "Ż" ),
@@ -510,28 +523,6 @@ class IcuCollation extends Collation {
                return count( $this->firstLetterData['chars'] );
        }
 
-       /**
-        * Do a binary search, and return the index of the largest item that sorts
-        * less than or equal to the target value.
-        *
-        * @deprecated since 1.23; use ArrayUtils::findLowerBound() instead
-        *
-        * @param array $valueCallback A function to call to get the value with
-        *     a given array index.
-        * @param int $valueCount The number of items accessible via $valueCallback,
-        *     indexed from 0 to $valueCount - 1
-        * @param array $comparisonCallback A callback to compare two values, returning
-        *     -1, 0 or 1 in the style of strcmp().
-        * @param string $target The target value to find.
-        *
-        * @return int|bool The item index of the lower bound, or false if the target value
-        *     sorts before all items.
-        */
-       function findLowerBound( $valueCallback, $valueCount, $comparisonCallback, $target ) {
-               wfDeprecated( __METHOD__, '1.23' );
-               return ArrayUtils::findLowerBound( $valueCallback, $valueCount, $comparisonCallback, $target );
-       }
-
        static function isCjk( $codepoint ) {
                foreach ( self::$cjkBlocks as $block ) {
                        if ( $codepoint >= $block[0] && $codepoint <= $block[1] ) {
@@ -551,7 +542,7 @@ class IcuCollation extends Collation {
         * This function will return false on older PHPs.
         *
         * @since 1.21
-        * @return string|false
+        * @return string|bool
         */
        static function getICUVersion() {
                return defined( 'INTL_ICU_VERSION' ) ? INTL_ICU_VERSION : false;
@@ -562,7 +553,7 @@ class IcuCollation extends Collation {
         * currently in use, or false when it can't be determined.
         *
         * @since 1.21
-        * @return string|false
+        * @return string|bool
         */
        static function getUnicodeVersionForICU() {
                $icuVersion = IcuCollation::getICUVersion();
index e0a11a2..b8d34e2 100644 (file)
@@ -43,8 +43,8 @@ class Cookie {
         * cookies. Used internally after a request to parse the
         * Set-Cookie headers.
         *
-        * @param string $value the value of the cookie
-        * @param array $attr possible key/values:
+        * @param string $value The value of the cookie
+        * @param array $attr Possible key/values:
         *        expires A date string
         *        path    The path this cookie is used on
         *        domain  Domain this cookie is used on
@@ -85,9 +85,9 @@ class Cookie {
         * @todo fixme fails to detect 2-letter top-level domains for single-domain use (probably
         * not a big problem in practice, but there are test cases)
         *
-        * @param string $domain the domain to validate
+        * @param string $domain The domain to validate
         * @param string $originDomain (optional) the domain the cookie originates from
-        * @return Boolean
+        * @return bool
         */
        public static function validateCookieDomain( $domain, $originDomain = null ) {
                // Don't allow a trailing dot
@@ -149,9 +149,9 @@ class Cookie {
        /**
         * Serialize the cookie jar into a format useful for HTTP Request headers.
         *
-        * @param string $path the path that will be used. Required.
-        * @param string $domain the domain that will be used. Required.
-        * @return String
+        * @param string $path The path that will be used. Required.
+        * @param string $domain The domain that will be used. Required.
+        * @return string
         */
        public function serializeToHttpRequest( $path, $domain ) {
                $ret = '';
@@ -166,7 +166,7 @@ class Cookie {
        }
 
        /**
-        * @param $domain
+        * @param string $domain
         * @return bool
         */
        protected function canServeDomain( $domain ) {
@@ -189,7 +189,7 @@ class Cookie {
        }
 
        /**
-        * @param $path
+        * @param string $path
         * @return bool
         */
        protected function canServePath( $path ) {
@@ -210,6 +210,9 @@ class CookieJar {
        /**
         * Set a cookie in the cookie jar. Make sure only one cookie per-name exists.
         * @see Cookie::set()
+        * @param string $name
+        * @param string $value
+        * @param array $attr
         */
        public function setCookie( $name, $value, $attr ) {
                /* cookies: case insensitive, so this should work.
@@ -226,6 +229,8 @@ class CookieJar {
 
        /**
         * @see Cookie::serializeToHttpRequest
+        * @param string $path
+        * @param string $domain
         * @return string
         */
        public function serializeToHttpRequest( $path, $domain ) {
@@ -245,8 +250,8 @@ class CookieJar {
        /**
         * Parse the content of an Set-Cookie HTTP Response header.
         *
-        * @param $cookie String
-        * @param string $domain cookie's domain
+        * @param string $cookie
+        * @param string $domain Cookie's domain
         * @return null
         */
        public function parseCookieResponseHeader( $cookie, $domain ) {
index c0c2e22..16c0187 100644 (file)
@@ -60,11 +60,14 @@ if ( !defined( 'MEDIAWIKI' ) ) {
 $wgConf = new SiteConfiguration;
 
 /**
- * Class name to use for accessing Config.
- * Currently only 'GlobalConfig' is available
+ * Registry of factory functions to create config objects:
+ * The 'main' key must be set, and the value should be a valid
+ * callable.
  * @since 1.23
  */
-$wgConfigClass = 'GlobalConfig';
+$wgConfigRegistry = array(
+       'main' => 'GlobalVarConfig::newInstance'
+);
 
 /**
  * MediaWiki version number
@@ -104,6 +107,13 @@ $wgServer = WebRequest::detectServer();
  */
 $wgCanonicalServer = false;
 
+/**
+ * Server name. This is automatically computed by parsing the bare
+ * hostname out of $wgCanonicalServer. It should not be customized.
+ * @since 1.24
+ */
+$wgServerName = false;
+
 /************************************************************************//**
  * @name   Script path settings
  * @{
@@ -361,13 +371,6 @@ $wgDeletedDirectory = false;
  */
 $wgImgAuthDetails = false;
 
-/**
- * If this is enabled, img_auth.php will not allow image access unless the wiki
- * is private. This improves security when image uploads are hosted on a
- * separate domain.
- */
-$wgImgAuthPublicTest = true;
-
 /**
  * Map of relative URL directories to match to internal mwstore:// base storage paths.
  * For img_auth.php requests, everything after "img_auth.php/" is checked to see
@@ -407,8 +410,6 @@ $wgImgAuthUrlPathMap = array();
  *                          url        : base URL to the root of the zone
  *                          urlsByExt  : map of file extension types to base URLs
  *                                       (useful for using a different cache for videos)
- *                          handlerUrl : base script-handled URL to the root of the zone
- *                                       (see FileRepo::getZoneHandlerUrl() function)
  *                      Zones default to using "<repo name>-<zone name>" as the container name
  *                      and default to using the container root as the zone's root directory.
  *                      Nesting of zone locations within other zones should be avoided.
@@ -1313,21 +1314,22 @@ $wgDjvuOutputExtension = 'jpg';
  * @{
  */
 
-$serverName = substr( $wgServer, strrpos( $wgServer, '/' ) + 1 );
 
 /**
  * Site admin email address.
+ *
+ * Defaults to "wikiadmin@{$wgServerName}".
  */
-$wgEmergencyContact = 'wikiadmin@' . $serverName;
+$wgEmergencyContact = false;
 
 /**
  * Password reminder email address.
  *
  * The address we should use as sender when a user is requesting his password.
+ *
+ * Defaults to "apache@{$wgServerName}".
  */
-$wgPasswordSender = 'apache@' . $serverName;
-
-unset( $serverName ); # Don't leak local variables to global scope
+$wgPasswordSender = false;
 
 /**
  * Password reminder name
@@ -1625,10 +1627,10 @@ $wgAllDBsAreLocalhost = false;
  * $wgSharedPrefix is the table prefix for the shared database. It defaults to
  * $wgDBprefix.
  *
- * @deprecated In new code, use the $wiki parameter to wfGetLB() to access
- *   remote databases. Using wfGetLB() allows the shared database to reside on
- *   separate servers to the wiki's own database, with suitable configuration
- *   of $wgLBFactoryConf.
+ * @deprecated since 1.21 In new code, use the $wiki parameter to wfGetLB() to
+ *   access remote databases. Using wfGetLB() allows the shared database to
+ *   reside on separate servers to the wiki's own database, with suitable
+ *   configuration of $wgLBFactoryConf.
  */
 $wgSharedDB = null;
 
@@ -2894,11 +2896,6 @@ $wgShowIPinHeader = true;
  */
 $wgSiteNotice = '';
 
-/**
- * A subtitle to add to the tagline, for skins that have it/
- */
-$wgExtraSubtitle = '';
-
 /**
  * If this is set, a "donate" link will appear in the sidebar. Set it to a URL.
  */
@@ -3363,7 +3360,6 @@ $wgResourceLoaderLESSFunctions = array(
  */
 $wgResourceLoaderLESSImportPaths = array(
        "$IP/resources/src/mediawiki.less/",
-       "$IP/skins/vector/",
 );
 
 /**
@@ -3608,14 +3604,17 @@ $wgNamespacesWithSubpages = array(
 );
 
 /**
-  * Array holding default tracking category names.
-  *
-  * Array contains the system messages for each tracking category.
-  * Tracking categories allow pages with certain characteristics to be tracked.
-  * It works by adding any such page to a category automatically.
-  *
-  * @since 1.23
-  */
+ * Array holding default tracking category names.
+ *
+ * Array contains the system messages for each tracking category.
+ * Tracking categories allow pages with certain characteristics to be tracked.
+ * It works by adding any such page to a category automatically.
+ *
+ * A message with the suffix '-desc' should be added as a description message
+ * to have extra information on Special:TrackingCategories.
+ *
+ * @since 1.23
+ */
 $wgTrackingCategories = array(
        'index-category',
        'noindex-category',
@@ -3624,6 +3623,8 @@ $wgTrackingCategories = array(
        'post-expand-template-inclusion-category',
        'hidden-category-category',
        'broken-file-category',
+       'node-count-exceeded-category',
+       'expansion-depth-exceeded-category',
 );
 
 /**
@@ -3723,36 +3724,14 @@ $wgMaxTemplateDepth = 40;
 $wgMaxPPExpandDepth = 40;
 
 /**
- * The external URL protocols
+ * URL schemes that should be recognized as valid by wfParseUrl().
+ * @see wfParseUrl
  */
 $wgUrlProtocols = array(
-       'http://',
-       'https://',
-       'ftp://',
-       'ftps://', // If we allow ftp:// we should allow the secure version.
-       'ssh://',
-       'sftp://', // SFTP > FTP
-       'irc://',
-       'ircs://', // @bug 28503
-       'xmpp:', // Another open communication protocol
-       'sip:',
-       'sips:',
-       'gopher://',
-       'telnet://', // Well if we're going to support the above.. -ævar
-       'nntp://', // @bug 3808 RFC 1738
-       'worldwind://',
-       'mailto:',
-       'tel:', // If we can make emails linkable, why not phone numbers?
-       'sms:', // Likewise this is standardized too
-       'news:',
-       'svn://',
-       'git://',
-       'mms://',
-       'bitcoin:', // Even registerProtocolHandler whitelists this along with mailto:
-       'magnet:', // No reason to reject torrents over magnet: when they're allowed over http://
-       'urn:', // Allow URNs to be used in Microdata/RDFa <link ... href="urn:...">s
-       'geo:', // urls define geo locations, they're useful in Microdata/RDFa and for coordinates
-       '//', // for protocol-relative URLs
+       'bitcoin:', 'ftp://', 'ftps://', 'geo:', 'git://', 'gopher://', 'http://',
+       'https://', 'irc://', 'ircs://', 'magnet:', 'mailto:', 'mms://', 'news:',
+       'nntp://', 'redis://', 'sftp://', 'sip:', 'sips:', 'sms:', 'ssh://',
+       'svn://', 'tel:', 'telnet://', 'urn:', 'worldwind://', 'xmpp:', '//'
 );
 
 /**
@@ -4283,6 +4262,7 @@ $wgGroupPermissions['*']['editmyoptions'] = true;
 $wgGroupPermissions['user']['move'] = true;
 $wgGroupPermissions['user']['move-subpages'] = true;
 $wgGroupPermissions['user']['move-rootuserpages'] = true; // can move root userpages
+$wgGroupPermissions['user']['move-categorypages'] = true;
 $wgGroupPermissions['user']['movefile'] = true;
 $wgGroupPermissions['user']['read'] = true;
 $wgGroupPermissions['user']['edit'] = true;
@@ -4330,6 +4310,7 @@ $wgGroupPermissions['sysop']['importupload'] = true;
 $wgGroupPermissions['sysop']['move'] = true;
 $wgGroupPermissions['sysop']['move-subpages'] = true;
 $wgGroupPermissions['sysop']['move-rootuserpages'] = true;
+$wgGroupPermissions['sysop']['move-categorypages'] = true;
 $wgGroupPermissions['sysop']['patrol'] = true;
 $wgGroupPermissions['sysop']['autopatrol'] = true;
 $wgGroupPermissions['sysop']['protect'] = true;
@@ -4771,6 +4752,13 @@ $wgRateLimits = array(
                'ip' => null,
                'subnet' => null,
        ),
+       'renderfile-nonstandard' => array( // same as above but for non-standard thumbnails
+               'anon' => null,
+               'user' => null,
+               'newbie' => null,
+               'ip' => null,
+               'subnet' => null,
+       ),
 );
 
 /**
@@ -4842,7 +4830,7 @@ $wgProxyKey = false;
  */
 
 /**
- * Default cookie expiration time. Setting to 0 makes all cookies session-only.
+ * Default cookie lifetime, in seconds. Setting to 0 makes all cookies session-only.
  */
 $wgCookieExpiration = 180 * 86400;
 
@@ -5334,17 +5322,6 @@ $wgNamespacesToBeSearchedDefault = array(
        NS_MAIN => true,
 );
 
-/**
- * Namespaces to be searched when user clicks the "Help" tab
- * on Special:Search.
- *
- * Same format as $wgNamespacesToBeSearchedDefault.
- */
-$wgNamespacesToBeSearchedHelp = array(
-       NS_PROJECT => true,
-       NS_HELP => true,
-);
-
 /**
  * If set to true the 'searcheverything' preference will be effective only for
  * logged-in users.
@@ -5622,7 +5599,7 @@ $wgRC2UDPOmitBots = false;
  * The common options are:
  *   * 'uri' -- the address to which the notices are to be sent.
  *   * 'formatter' -- the class name (implementing RCFeedFormatter) which will
- *     produce the text to send.
+ *     produce the text to send. This can also be an object of the class.
  *   * 'omit_bots' -- whether the bot edits should be in the feed
  *   * 'omit_anon' -- whether anonymous edits should be in the feed
  *   * 'omit_user' -- whether edits by registered users should be in the feed
@@ -6200,6 +6177,7 @@ $wgJobTypesExcludedFromDefaultQueue = array( 'AssembleUploadChunks', 'PublishSta
  * may have a variable number of work items, as is the case with batch jobs.
  * This is used by runJobs.php and not jobs run via $wgJobRunRate.
  * These settings should be global to all wikis.
+ * @var float[]
  */
 $wgJobBackoffThrottling = array();
 
@@ -7080,6 +7058,21 @@ $wgSiteTypes = array(
  */
 $wgCompiledFiles = array();
 
+/**
+ * Whether the page_props table has a pp_sortkey column. Set to false in case
+ * the respective database schema change was not applied.
+ * @since 1.23
+ */
+$wgPagePropsHaveSortkey = true;
+
+/**
+ * Port where you have HTTPS running
+ * Supports HTTPS on non-standard ports
+ * @see bug 65184
+ * @since 1.24
+ */
+$wgHttpsPort = 443;
+
 /**
  * For really cool vim folding this needs to be at the end:
  * vim: foldmarker=@{,@} foldmethod=marker
index 8a63786..14329d3 100644 (file)
  */
 
 class DeprecatedGlobal extends StubObject {
-       // The m's are to stay consistent with parent class.
-       protected $mRealValue, $mVersion;
+       protected $realValue, $version;
 
        function __construct( $name, $realValue, $version = false ) {
                parent::__construct( $name );
-               $this->mRealValue = $realValue;
-               $this->mVersion = $version;
+               $this->realValue = $realValue;
+               $this->version = $version;
        }
 
+       // @codingStandardsIgnoreStart
+       // PSR2.Methods.MethodDeclaration.Underscore
+       // PSR2.Classes.PropertyDeclaration.ScopeMissing
        function _newObject() {
+
                /* Put the caller offset for wfDeprecated as 6, as
                 * that gives the function that uses this object, since:
                 * 1 = this function ( _newObject )
@@ -48,7 +51,8 @@ class DeprecatedGlobal extends StubObject {
                 * sequences for this method, but that seems to be
                 * rather unlikely.
                 */
-               wfDeprecated( '$' . $this->mGlobal, $this->mVersion, false, 6 );
-               return $this->mRealValue;
+               wfDeprecated( '$' . $this->global, $this->version, false, 6 );
+               return $this->realValue;
        }
+       // @codingStandardsIgnoreEnd
 }
index c266996..ca11f16 100644 (file)
@@ -175,8 +175,9 @@ class EditPage {
         * The cookie will be removed instantly if the JavaScript runs.
         *
         * Otherwise, though, we don't want the cookies to accumulate.
-        * RFC 2109 ( https://www.ietf.org/rfc/rfc2109.txt ) specifies a possible limit of only 20 cookies per domain.
-        * This still applies at least to some versions of IE without full updates:
+        * RFC 2109 ( https://www.ietf.org/rfc/rfc2109.txt ) specifies a possible
+        * limit of only 20 cookies per domain. This still applies at least to some
+        * versions of IE without full updates:
         * https://blogs.msdn.com/b/ieinternals/archive/2009/08/20/wininet-ie-cookie-internals-faq.aspx
         *
         * A value of 20 minutes should be enough to take into account slow loads and minor
@@ -184,65 +185,160 @@ class EditPage {
         */
        const POST_EDIT_COOKIE_DURATION = 1200;
 
-       /**
-        * @var Article
-        */
-       var $mArticle;
+       /** @var Article */
+       public $mArticle;
 
-       /**
-        * @var Title
-        */
-       var $mTitle;
+       /** @var Title */
+       public $mTitle;
+
+       /** @var null|Title */
        private $mContextTitle = null;
-       var $action = 'submit';
-       var $isConflict = false;
-       var $isCssJsSubpage = false;
-       var $isCssSubpage = false;
-       var $isJsSubpage = false;
-       var $isWrongCaseCssJsPage = false;
-       var $isNew = false; // new page or new section
-       var $deletedSinceEdit;
-       var $formtype;
-       var $firsttime;
-       var $lastDelete;
-       var $mTokenOk = false;
-       var $mTokenOkExceptSuffix = false;
-       var $mTriedSave = false;
-       var $incompleteForm = false;
-       var $tooBig = false;
-       var $kblength = false;
-       var $missingComment = false;
-       var $missingSummary = false;
-       var $allowBlankSummary = false;
-       var $autoSumm = '';
-       var $hookError = '';
-       #var $mPreviewTemplates;
-
-       /**
-        * @var ParserOutput
-        */
-       var $mParserOutput;
-
-       /**
-        * Has a summary been preset using GET parameter &summary= ?
-        * @var Bool
-        */
-       var $hasPresetSummary = false;
-
-       var $mBaseRevision = false;
-       var $mShowSummaryField = true;
+
+       /** @var string */
+       protected $action = 'submit';
+
+       /** @var bool */
+       public $isConflict = false;
+
+       /** @var bool */
+       public $isCssJsSubpage = false;
+
+       /** @var bool */
+       public $isCssSubpage = false;
+
+       /** @var bool */
+       public $isJsSubpage = false;
+
+       /** @var bool */
+       protected $isWrongCaseCssJsPage = false;
+
+       /** @var bool New page or new section */
+       protected $isNew = false;
+
+       /** @var bool */
+       protected $deletedSinceEdit;
+
+       /** @var string */
+       public $formtype;
+
+       /** @var bool */
+       public $firsttime;
+
+       /** @var bool|stdClass */
+       protected $lastDelete;
+
+       /** @var bool */
+       protected $mTokenOk = false;
+
+       /** @var bool */
+       protected $mTokenOkExceptSuffix = false;
+
+       /** @var bool */
+       protected $mTriedSave = false;
+
+       /** @var bool */
+       protected $incompleteForm = false;
+
+       /** @var bool */
+       protected $tooBig = false;
+
+       /** @var bool */
+       protected $kblength = false;
+
+       /** @var bool */
+       protected $missingComment = false;
+
+       /** @var bool */
+       protected $missingSummary = false;
+
+       /** @var bool */
+       protected $allowBlankSummary = false;
+
+       /** @var string */
+       protected $autoSumm = '';
+
+       /** @var string */
+       public $hookError = '';
+
+       /** @var ParserOutput */
+       protected $mParserOutput;
+
+       /** @var bool Has a summary been preset using GET parameter &summary= ? */
+       protected $hasPresetSummary = false;
+
+       /** @var bool */
+       protected $mBaseRevision = false;
+
+       /** @var bool */
+       public $mShowSummaryField = true;
 
        # Form values
-       var $save = false, $preview = false, $diff = false;
-       var $minoredit = false, $watchthis = false, $recreate = false;
-       var $textbox1 = '', $textbox2 = '', $summary = '', $nosummary = false;
-       var $edittime = '', $section = '', $sectiontitle = '', $starttime = '';
-       var $oldid = 0, $editintro = '', $scrolltop = null, $bot = true;
-       var $contentModel = null, $contentFormat = null;
+
+       /** @var bool */
+       public $save = false;
+
+       /** @var bool */
+       public $preview = false;
+
+       /** @var bool */
+       protected $diff = false;
+
+       /** @var bool */
+       public $minoredit = false;
+
+       /** @var bool */
+       protected $watchthis = false;
+
+       /** @var bool */
+       protected $recreate = false;
+
+       /** @var string */
+       public $textbox1 = '';
+
+       /** @var string */
+       public $textbox2 = '';
+
+       /** @var string */
+       public $summary = '';
+
+       /** @var bool */
+       protected $nosummary = false;
+
+       /** @var string */
+       public $edittime = '';
+
+       /** @var string */
+       public $section = '';
+
+       /** @var string */
+       public $sectiontitle = '';
+
+       /** @var string */
+       protected $starttime = '';
+
+       /** @var int */
+       public $oldid = 0;
+
+       /** @var string */
+       protected $editintro = '';
+
+       /** @var null */
+       public $scrolltop = null;
+
+       /** @var bool */
+       public $bot = true;
+
+       /** @var null|string */
+       public $contentModel = null;
+
+       /** @var null|string */
+       public $contentFormat = null;
 
        # Placeholders for text injection by hooks (must be HTML)
        # extensions should take care to _append_ to the present value
-       public $editFormPageTop = ''; // Before even the preview
+
+       /** @var string Before even the preview */
+       public $editFormPageTop = '';
        public $editFormTextTop = '';
        public $editFormTextBeforeContent = '';
        public $editFormTextAfterWarn = '';
@@ -258,15 +354,17 @@ class EditPage {
 
        public $suppressIntro = false;
 
-       /**
-        * Set to true to allow editing of non-text content types.
-        *
-        * @var bool
-        */
+       /** @var bool Set to true to allow editing of non-text content types. */
        public $allowNonTextContent = false;
 
+       /** @var bool */
+       protected $edit;
+
+       /** @var bool */
+       public $live;
+
        /**
-        * @param $article Article
+        * @param Article $article
         */
        public function __construct( Article $article ) {
                $this->mArticle = $article;
@@ -296,7 +394,7 @@ class EditPage {
        /**
         * Set the context Title object
         *
-        * @param $title Title object or null
+        * @param Title|null $title Title object or null
         */
        public function setContextTitle( $title ) {
                $this->mContextTitle = $title;
@@ -307,7 +405,7 @@ class EditPage {
         * If not set, $wgTitle will be returned. This behavior might change in
         * the future to return $this->mTitle instead.
         *
-        * @return Title object
+        * @return Title
         */
        public function getContextTitle() {
                if ( is_null( $this->mContextTitle ) ) {
@@ -411,6 +509,7 @@ class EditPage {
                $this->isCssJsSubpage = $this->mTitle->isCssJsSubpage();
                $this->isCssSubpage = $this->mTitle->isCssSubpage();
                $this->isJsSubpage = $this->mTitle->isJsSubpage();
+               // @todo FIXME: Silly assignment.
                $this->isWrongCaseCssJsPage = $this->isWrongCaseCssJsPage();
 
                # Show applicable editing introductions
@@ -487,8 +586,8 @@ class EditPage {
         *   "View source for ..." page displaying the source code after the error message.
         *
         * @since 1.19
-        * @param array $permErrors of permissions errors, as returned by
-        *                    Title::getUserPermissionsErrors().
+        * @param array $permErrors Array of permissions errors, as returned by
+        *    Title::getUserPermissionsErrors().
         * @throws PermissionsError
         */
        protected function displayPermissionsError( array $permErrors ) {
@@ -514,7 +613,10 @@ class EditPage {
                wfRunHooks( 'EditPage::showReadOnlyForm:initial', array( $this, &$wgOut ) );
 
                $wgOut->setRobotPolicy( 'noindex,nofollow' );
-               $wgOut->setPageTitle( wfMessage( 'viewsource-title', $this->getContextTitle()->getPrefixedText() ) );
+               $wgOut->setPageTitle( wfMessage(
+                       'viewsource-title',
+                       $this->getContextTitle()->getPrefixedText()
+               ) );
                $wgOut->addBacklinkSubtitle( $this->getContextTitle() );
                $wgOut->addWikiText( $wgOut->formatPermissionsErrorMessage( $permErrors, 'edit' ) );
                $wgOut->addHTML( "<hr />\n" );
@@ -577,7 +679,9 @@ class EditPage {
                } elseif ( $this->section == 'new' ) {
                        // Nothing *to* preview for new sections
                        return false;
-               } elseif ( ( $wgRequest->getVal( 'preload' ) !== null || $this->mTitle->exists() ) && $wgUser->getOption( 'previewonfirst' ) ) {
+               } elseif ( ( $wgRequest->getVal( 'preload' ) !== null || $this->mTitle->exists() )
+                       && $wgUser->getOption( 'previewonfirst' )
+               ) {
                        // Standard preference behavior
                        return true;
                } elseif ( !$this->mTitle->exists()
@@ -625,7 +729,7 @@ class EditPage {
 
        /**
         * This function collects the form data and uses it to populate various member variables.
-        * @param $request WebRequest
+        * @param WebRequest $request
         * @throws ErrorPageError
         */
        function importFormData( &$request ) {
@@ -747,7 +851,8 @@ class EditPage {
                        ) {
                                $this->allowBlankSummary = true;
                        } else {
-                               $this->allowBlankSummary = $request->getBool( 'wpIgnoreBlankSummary' ) || !$wgUser->getOption( 'forceeditsummary' );
+                               $this->allowBlankSummary = $request->getBool( 'wpIgnoreBlankSummary' )
+                                       || !$wgUser->getOption( 'forceeditsummary' );
                        }
 
                        $this->autoSumm = $request->getText( 'wpAutoSummary' );
@@ -764,7 +869,8 @@ class EditPage {
                        $this->save = false;
                        $this->diff = false;
                        $this->minoredit = false;
-                       $this->watchthis = $request->getBool( 'watchthis', false ); // Watch may be overridden by request parameters
+                       // Watch may be overridden by request parameters
+                       $this->watchthis = $request->getBool( 'watchthis', false );
                        $this->recreate = false;
 
                        // When creating a new section, we can preload a section title by passing it as the
@@ -790,17 +896,26 @@ class EditPage {
                $this->bot = $request->getBool( 'bot', true );
                $this->nosummary = $request->getBool( 'nosummary' );
 
-               $this->contentModel = $request->getText( 'model', $this->contentModel ); #may be overridden by revision
-               $this->contentFormat = $request->getText( 'format', $this->contentFormat ); #may be overridden by revision
+               // May be overridden by revision.
+               $this->contentModel = $request->getText( 'model', $this->contentModel );
+               // May be overridden by revision.
+               $this->contentFormat = $request->getText( 'format', $this->contentFormat );
 
-               if ( !ContentHandler::getForModelID( $this->contentModel )->isSupportedFormat( $this->contentFormat ) ) {
+               if ( !ContentHandler::getForModelID( $this->contentModel )
+                       ->isSupportedFormat( $this->contentFormat )
+               ) {
                        throw new ErrorPageError(
                                'editpage-notsupportedcontentformat-title',
                                'editpage-notsupportedcontentformat-text',
                                array( $this->contentFormat, ContentHandler::getLocalizedName( $this->contentModel ) )
                        );
                }
-               #TODO: check if the desired model is allowed in this namespace, and if a transition from the page's current model to the new model is allowed
+
+               /**
+                * @todo Check if the desired model is allowed in this namespace, and if
+                *   a transition from the page's current model to the new model is
+                *   allowed.
+                */
 
                $this->live = $request->getCheck( 'live' );
                $this->editintro = $request->getText( 'editintro',
@@ -819,7 +934,7 @@ class EditPage {
         * this method should be overridden and return the page text that will be used
         * for saving, preview parsing and so on...
         *
-        * @param $request WebRequest
+        * @param WebRequest $request
         */
        protected function importContentFormData( &$request ) {
                return; // Don't do anything, EditPage already extracted wpTextbox1
@@ -828,7 +943,7 @@ class EditPage {
        /**
         * Initialise form fields in the object
         * Called on the first invocation, e.g. when a user clicks an edit link
-        * @return bool -- if the requested section is valid
+        * @return bool If the requested section is valid
         */
        function initialiseForm() {
                global $wgUser;
@@ -864,8 +979,8 @@ class EditPage {
        /**
         * Fetch initial editing page content.
         *
-        * @param $def_text string|bool
-        * @return mixed string on success, $def_text for invalid sections
+        * @param string|bool $def_text
+        * @return string|bool string on success, $def_text for invalid sections
         * @private
         * @deprecated since 1.21, get WikiPage::getContent() instead.
         */
@@ -887,7 +1002,7 @@ class EditPage {
        /**
         * @param Content|null $def_content The default value to return
         *
-        * @return mixed Content on success, $def_content for invalid sections
+        * @return Content|null Content on success, $def_content for invalid sections
         *
         * @since 1.21
         */
@@ -1074,7 +1189,7 @@ class EditPage {
        /**
         * Use this method before edit() to preload some text into the edit box
         *
-        * @param $text string
+        * @param string $text
         * @deprecated since 1.21, use setPreloadedContent() instead.
         */
        public function setPreloadedText( $text ) {
@@ -1088,7 +1203,7 @@ class EditPage {
        /**
         * Use this method before edit() to preload some content into the edit box
         *
-        * @param $content Content
+        * @param Content $content
         *
         * @since 1.21
         */
@@ -1102,7 +1217,7 @@ class EditPage {
         *
         * @param string $preload representing the title to preload from.
         *
-        * @return String
+        * @return string
         *
         * @deprecated since 1.21, use getPreloadedContent() instead
         */
@@ -1119,8 +1234,8 @@ class EditPage {
         * Get the contents to be preloaded into the box, either set by
         * an earlier setPreloadText() or by loading the given page.
         *
-        * @param string $preload representing the title to preload from.
-        * @param Array $params Parameters to use (interface-message style) in the preloaded text
+        * @param string $preload Representing the title to preload from.
+        * @param array $params Parameters to use (interface-message style) in the preloaded text
         *
         * @return Content
         *
@@ -1186,7 +1301,7 @@ class EditPage {
        /**
         * Make sure the form isn't faking a user's credentials.
         *
-        * @param $request WebRequest
+        * @param WebRequest $request
         * @return bool
         * @private
         */
@@ -1209,18 +1324,24 @@ class EditPage {
         * marked HttpOnly. The JavaScript code converts the cookie to a wgPostEdit config
         * variable.
         *
-        * We use a path of '/' since wgCookiePath is not exposed to JS
-        *
         * If the variable were set on the server, it would be cached, which is unwanted
         * since the post-edit state should only apply to the load right after the save.
+        *
+        * @param $statusValue int The status value (to check for new article status)
         */
-       protected function setPostEditCookie() {
+       protected function setPostEditCookie( $statusValue ) {
                $revisionId = $this->mArticle->getLatest();
                $postEditKey = self::POST_EDIT_COOKIE_KEY_PREFIX . $revisionId;
 
+               $val = 'saved';
+               if ( $statusValue == self::AS_SUCCESS_NEW_ARTICLE ) {
+                       $val = 'created';
+               } elseif ( $this->oldid ) {
+                       $val = 'restored';
+               }
+
                $response = RequestContext::getMain()->getRequest()->response();
-               $response->setcookie( $postEditKey, '1', time() + self::POST_EDIT_COOKIE_DURATION, array(
-                       'path' => '/',
+               $response->setcookie( $postEditKey, $val, time() + self::POST_EDIT_COOKIE_DURATION, array(
                        'httpOnly' => false,
                ) );
        }
@@ -1248,16 +1369,21 @@ class EditPage {
         * @param array|bool $resultDetails
         *
         * @throws ErrorPageError
-        * return bool false, if output is done, true if rest of the form should be displayed
+        * @return bool false, if output is done, true if rest of the form should be displayed
         */
        private function handleStatus( Status $status, $resultDetails ) {
                global $wgUser, $wgOut;
 
-               // FIXME: once the interface for internalAttemptSave() is made nicer, this should use the message in $status
-               if ( $status->value == self::AS_SUCCESS_UPDATE || $status->value == self::AS_SUCCESS_NEW_ARTICLE ) {
+               /**
+                * @todo FIXME: once the interface for internalAttemptSave() is made
+                *   nicer, this should use the message in $status
+                */
+               if ( $status->value == self::AS_SUCCESS_UPDATE
+                       || $status->value == self::AS_SUCCESS_NEW_ARTICLE
+               ) {
                        $this->didSave = true;
                        if ( !$resultDetails['nullEdit'] ) {
-                               $this->setPostEditCookie();
+                               $this->setPostEditCookie( $status->value );
                        }
                }
 
@@ -1290,7 +1416,10 @@ class EditPage {
                                $sectionanchor = $resultDetails['sectionanchor'];
 
                                // Give extensions a chance to modify URL query on update
-                               wfRunHooks( 'ArticleUpdateBeforeRedirect', array( $this->mArticle, &$sectionanchor, &$extraQuery ) );
+                               wfRunHooks(
+                                       'ArticleUpdateBeforeRedirect',
+                                       array( $this->mArticle, &$sectionanchor, &$extraQuery )
+                               );
 
                                if ( $resultDetails['redirect'] ) {
                                        if ( $extraQuery == '' ) {
@@ -1345,7 +1474,7 @@ class EditPage {
        /**
         * Run hooks that can filter edits just before they get saved.
         *
-        * @param Content $content the Content to filter.
+        * @param Content $content The Content to filter.
         * @param Status $status For reporting the outcome to the caller
         * @param User $user The user performing the edit
         *
@@ -1393,18 +1522,26 @@ class EditPage {
        /**
         * Attempt submission (no UI)
         *
-        * @param array $result array to add statuses to, currently with the possible keys:
-        *  spam - string - Spam string from content if any spam is detected by matchSpamRegex
-        *  sectionanchor - string - Section anchor for a section save
-        *  nullEdit - boolean - Set if doEditContent is OK.  True if null edit, false otherwise.
-        *  redirect - boolean -  Set if doEditContent is OK.  True if resulting revision is a redirect
+        * @param array $result Array to add statuses to, currently with the
+        *   possible keys:
+        *   - spam (string): Spam string from content if any spam is detected by
+        *     matchSpamRegex.
+        *   - sectionanchor (string): Section anchor for a section save.
+        *   - nullEdit (boolean): Set if doEditContent is OK.  True if null edit,
+        *     false otherwise.
+        *   - redirect (bool): Set if doEditContent is OK. True if resulting
+        *     revision is a redirect.
         * @param bool $bot True if edit is being made under the bot right.
         *
-        * @return Status object, possibly with a message, but always with one of the AS_* constants in $status->value,
+        * @return Status Status object, possibly with a message, but always with
+        *   one of the AS_* constants in $status->value,
         *
-        * FIXME: This interface is TERRIBLE, but hard to get rid of due to various error display idiosyncrasies. There are
-        * also lots of cases where error metadata is set in the object and retrieved later instead of being returned, e.g.
-        * AS_CONTENT_TOO_BIG and AS_BLOCKED_PAGE_FOR_USER. All that stuff needs to be cleaned up some time.
+        * @todo FIXME: This interface is TERRIBLE, but hard to get rid of due to
+        *   various error display idiosyncrasies. There are also lots of cases
+        *   where error metadata is set in the object and retrieved later instead
+        *   of being returned, e.g. AS_CONTENT_TOO_BIG and
+        *   AS_BLOCKED_PAGE_FOR_USER. All that stuff needs to be cleaned up some
+        * time.
         */
        function internalAttemptSave( &$result, $bot = false ) {
                global $wgUser, $wgRequest, $wgParser, $wgMaxArticleSize;
@@ -1445,7 +1582,12 @@ class EditPage {
                        # Construct Content object
                        $textbox_content = $this->toEditContent( $this->textbox1 );
                } catch ( MWContentSerializationException $ex ) {
-                       $status->fatal( 'content-failed-to-parse', $this->contentModel, $this->contentFormat, $ex->getMessage() );
+                       $status->fatal(
+                               'content-failed-to-parse',
+                               $this->contentModel,
+                               $this->contentFormat,
+                               $ex->getMessage()
+                       );
                        $status->value = self::AS_PARSE_ERROR;
                        wfProfileOut( __METHOD__ . '-checks' );
                        wfProfileOut( __METHOD__ );
@@ -1455,7 +1597,8 @@ class EditPage {
                # Check image redirect
                if ( $this->mTitle->getNamespace() == NS_FILE &&
                        $textbox_content->isRedirect() &&
-                       !$wgUser->isAllowed( 'upload' ) ) {
+                       !$wgUser->isAllowed( 'upload' )
+               ) {
                                $code = $wgUser->isAnon() ? self::AS_IMAGE_REDIRECT_ANON : self::AS_IMAGE_REDIRECT_LOGGED;
                                $status->setResult( false, $code );
 
@@ -1494,7 +1637,10 @@ class EditPage {
                        wfProfileOut( __METHOD__ );
                        return $status;
                }
-               if ( !wfRunHooks( 'EditFilter', array( $this, $this->textbox1, $this->section, &$this->hookError, $this->summary ) ) ) {
+               if ( !wfRunHooks(
+                       'EditFilter',
+                       array( $this, $this->textbox1, $this->section, &$this->hookError, $this->summary ) )
+               ) {
                        # Error messages etc. could be handled within the hook...
                        $status->fatal( 'hookaborted' );
                        $status->value = self::AS_HOOK_ERROR;
@@ -1616,7 +1762,8 @@ class EditPage {
                                        $content = $content->addSectionHeader( $this->sectiontitle );
 
                                        // Jump to the new section
-                                       $result['sectionanchor'] = $wgParser->guessLegacySectionNameFromWikiText( $this->sectiontitle );
+                                       $result['sectionanchor'] =
+                                               $wgParser->guessLegacySectionNameFromWikiText( $this->sectiontitle );
 
                                        // If no edit summary was specified, create one automatically from the section
                                        // title and have it link to the new section. Otherwise, respect the summary as
@@ -1659,14 +1806,19 @@ class EditPage {
                                                // Probably a duplicate submission of a new comment.
                                                // This can happen when squid resends a request after
                                                // a timeout but the first one actually went through.
-                                               wfDebug( __METHOD__ . ": duplicate new section submission; trigger edit conflict!\n" );
+                                               wfDebug( __METHOD__
+                                                       . ": duplicate new section submission; trigger edit conflict!\n" );
                                        } else {
                                                // New comment; suppress conflict.
                                                $this->isConflict = false;
                                                wfDebug( __METHOD__ . ": conflict suppressed; new section\n" );
                                        }
-                               } elseif ( $this->section == '' && Revision::userWasLastToEdit( DB_MASTER, $this->mTitle->getArticleID(),
-                                                       $wgUser->getId(), $this->edittime ) ) {
+                               } elseif ( $this->section == ''
+                                       && Revision::userWasLastToEdit(
+                                               DB_MASTER, $this->mTitle->getArticleID(),
+                                               $wgUser->getId(), $this->edittime
+                                       )
+                               ) {
                                        # Suppress edit conflict with self, except for section edits where merging is required.
                                        wfDebug( __METHOD__ . ": Suppressing edit conflict, same user.\n" );
                                        $this->isConflict = false;
@@ -1683,13 +1835,23 @@ class EditPage {
                        $content = null;
 
                        if ( $this->isConflict ) {
-                               wfDebug( __METHOD__ . ": conflict! getting section '{$this->section}' for time '{$this->edittime}'"
-                                               . " (article time '{$timestamp}')\n" );
-
-                               $content = $this->mArticle->replaceSectionContent( $this->section, $textbox_content, $sectionTitle, $this->edittime );
+                               wfDebug( __METHOD__
+                                       . ": conflict! getting section '{$this->section}' for time '{$this->edittime}'"
+                                       . " (article time '{$timestamp}')\n" );
+
+                               $content = $this->mArticle->replaceSectionContent(
+                                       $this->section,
+                                       $textbox_content,
+                                       $sectionTitle,
+                                       $this->edittime
+                               );
                        } else {
                                wfDebug( __METHOD__ . ": getting section '{$this->section}'\n" );
-                               $content = $this->mArticle->replaceSectionContent( $this->section, $textbox_content, $sectionTitle );
+                               $content = $this->mArticle->replaceSectionContent(
+                                       $this->section,
+                                       $textbox_content,
+                                       $sectionTitle
+                               );
                        }
 
                        if ( is_null( $content ) ) {
@@ -1773,12 +1935,13 @@ class EditPage {
                                                ->rawParams( $cleanSummary )->inContentLanguage()->text();
                                }
                        } elseif ( $this->section != '' ) {
-                               # Try to get a section anchor from the section source, redirect to edited section if header found
-                               # XXX: might be better to integrate this into Article::replaceSection
-                               # for duplicate heading checking and maybe parsing
+                               # Try to get a section anchor from the section source, redirect
+                               # to edited section if header found.
+                               # XXX: Might be better to integrate this into Article::replaceSection
+                               # for duplicate heading checking and maybe parsing.
                                $hasmatch = preg_match( "/^ *([=]{1,6})(.*?)(\\1) *\\n/i", $this->textbox1, $matches );
-                               # we can't deal with anchors, includes, html etc in the header for now,
-                               # headline would need to be parsed to improve this
+                               # We can't deal with anchors, includes, html etc in the header for now,
+                               # headline would need to be parsed to improve this.
                                if ( $hasmatch && strlen( $matches[2] ) > 0 ) {
                                        $sectionanchor = $wgParser->guessLegacySectionNameFromWikiText( $matches[2] );
                                }
@@ -1797,7 +1960,7 @@ class EditPage {
                }
 
                // Check for length errors again now that the section is merged in
-                       $this->kblength = (int)( strlen( $this->toEditText( $content ) ) / 1024 );
+               $this->kblength = (int)( strlen( $this->toEditText( $content ) ) / 1024 );
                if ( $this->kblength > $wgMaxArticleSize ) {
                        $this->tooBig = true;
                        $status->setResult( false, self::AS_MAX_ARTICLE_SIZE_EXCEEDED );
@@ -1810,8 +1973,8 @@ 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, $this->contentFormat );
 
                if ( !$doEditStatus->isOK() ) {
                        // Failure from doEdit()
@@ -1866,7 +2029,7 @@ class EditPage {
        /**
         * Attempts to merge text content with base and current revisions
         *
-        * @param $editText string
+        * @param string $editText
         *
         * @return bool
         * @deprecated since 1.21, use mergeChangesIntoContent() instead
@@ -1892,7 +2055,7 @@ class EditPage {
         *
         * @since 1.21
         *
-        * @param $editContent
+        * @param Content $editContent
         *
         * @return bool
         */
@@ -1948,9 +2111,9 @@ class EditPage {
        /**
         * Check given input text against $wgSpamRegex, and return the text of the first match.
         *
-        * @param $text string
+        * @param string $text
         *
-        * @return string|bool matching string or false
+        * @return string|bool Matching string or false
         */
        public static function matchSpamRegex( $text ) {
                global $wgSpamRegex;
@@ -1962,9 +2125,9 @@ class EditPage {
        /**
         * Check given input text against $wgSummarySpamRegex, and return the text of the first match.
         *
-        * @param $text string
+        * @param string $text
         *
-        * @return string|bool matching string or false
+        * @return string|bool Matching string or false
         */
        public static function matchSummarySpamRegex( $text ) {
                global $wgSummarySpamRegex;
@@ -1973,8 +2136,8 @@ class EditPage {
        }
 
        /**
-        * @param $text string
-        * @param $regexes array
+        * @param string $text
+        * @param array $regexes
         * @return bool|string
         */
        protected static function matchSpamRegexInternal( $text, $regexes ) {
@@ -2012,9 +2175,14 @@ class EditPage {
                } elseif ( $contextTitle->exists() && $this->section != '' ) {
                        $msg = $this->section == 'new' ? 'editingcomment' : 'editingsection';
                } else {
-                       $msg = $contextTitle->exists() || ( $contextTitle->getNamespace() == NS_MEDIAWIKI && $contextTitle->getDefaultMessageText() !== false ) ?
-                               'editing' : 'creating';
+                       $msg = $contextTitle->exists()
+                               || ( $contextTitle->getNamespace() == NS_MEDIAWIKI
+                                       && $contextTitle->getDefaultMessageText() !== false
+                               )
+                               ? 'editing'
+                               : 'creating';
                }
+
                # Use the title defined by DISPLAYTITLE magic word when present
                $displayTitle = isset( $this->mParserOutput ) ? $this->mParserOutput->getDisplayTitle() : false;
                if ( $displayTitle === false ) {
@@ -2148,14 +2316,16 @@ class EditPage {
         *
         * If $content is null or false or a string, $content is returned unchanged.
         *
-        * If the given Content object is not of a type that can be edited using the text base EditPage,
-        * an exception will be raised. Set $this->allowNonTextContent to true to allow editing of non-textual
+        * If the given Content object is not of a type that can be edited using
+        * the text base EditPage, an exception will be raised. Set
+        * $this->allowNonTextContent to true to allow editing of non-textual
         * content.
         *
         * @param Content|null|bool|string $content
-        * @return String the editable text form of the content.
+        * @return string The editable text form of the content.
         *
-        * @throws MWException if $content is not an instance of TextContent and $this->allowNonTextContent is not true.
+        * @throws MWException if $content is not an instance of TextContent and
+        *   $this->allowNonTextContent is not true.
         */
        protected function toEditText( $content ) {
                if ( $content === null || $content === false ) {
@@ -2177,16 +2347,18 @@ class EditPage {
        /**
         * Turns the given text into a Content object by unserializing it.
         *
-        * If the resulting Content object is not of a type that can be edited using the text base EditPage,
-        * an exception will be raised. Set $this->allowNonTextContent to true to allow editing of non-textual
+        * If the resulting Content object is not of a type that can be edited using
+        * the text base EditPage, an exception will be raised. Set
+        * $this->allowNonTextContent to true to allow editing of non-textual
         * content.
         *
         * @param string|null|bool $text Text to unserialize
-        * @return Content The content object created from $text. If $text was false or null, false resp. null will be
-        *                 returned instead.
+        * @return Content The content object created from $text. If $text was false
+        *   or null, false resp. null will be  returned instead.
         *
-        * @throws MWException if unserializing the text results in a Content object that is not an instance of TextContent
-        *          and $this->allowNonTextContent is not true.
+        * @throws MWException if unserializing the text results in a Content
+        *   object that is not an instance of TextContent and
+        *   $this->allowNonTextContent is not true.
         */
        protected function toEditContent( $text ) {
                if ( $text === false || $text === null ) {
@@ -2206,7 +2378,7 @@ class EditPage {
 
        /**
         * Send the edit form and related headers to $wgOut
-        * @param $formCallback Callback|null that takes an OutputPage parameter; will be called
+        * @param callable|null $formCallback That takes an OutputPage parameter; will be called
         *     during form output near the top, for captchas and the like.
         */
        function showEditForm( $formCallback = null ) {
@@ -2254,9 +2426,16 @@ class EditPage {
 
                // @todo add EditForm plugin interface and use it here!
                //       search for textarea1 and textares2, and allow EditForm to override all uses.
-               $wgOut->addHTML( Html::openElement( 'form', array( 'id' => self::EDITFORM_ID, 'name' => self::EDITFORM_ID,
-                       'method' => 'post', 'action' => $this->getActionURL( $this->getContextTitle() ),
-                       'enctype' => 'multipart/form-data' ) ) );
+               $wgOut->addHTML( Html::openElement(
+                       'form',
+                       array(
+                               'id' => self::EDITFORM_ID,
+                               'name' => self::EDITFORM_ID,
+                               'method' => 'post',
+                               'action' => $this->getActionURL( $this->getContextTitle() ),
+                               'enctype' => 'multipart/form-data'
+                       )
+               ) );
 
                if ( is_callable( $formCallback ) ) {
                        call_user_func_array( $formCallback, array( &$wgOut ) );
@@ -2265,8 +2444,20 @@ class EditPage {
                // Add an empty field to trip up spambots
                $wgOut->addHTML(
                        Xml::openElement( 'div', array( 'id' => 'antispam-container', 'style' => 'display: none;' ) )
-                       . Html::rawElement( 'label', array( 'for' => 'wpAntiSpam' ), wfMessage( 'simpleantispam-label' )->parse() )
-                       . Xml::element( 'input', array( 'type' => 'text', 'name' => 'wpAntispam', 'id' => 'wpAntispam', 'value' => '' ) )
+                       . Html::rawElement(
+                               'label',
+                               array( 'for' => 'wpAntiSpam' ),
+                               wfMessage( 'simpleantispam-label' )->parse()
+                       )
+                       . Xml::element(
+                               'input',
+                               array(
+                                       'type' => 'text',
+                                       'name' => 'wpAntispam',
+                                       'id' => 'wpAntispam',
+                                       'value' => ''
+                               )
+                       )
                        . Xml::closeElement( 'div' )
                );
 
@@ -2383,7 +2574,12 @@ class EditPage {
                                $this->showConflict();
                        } catch ( MWContentSerializationException $ex ) {
                                // this can't really happen, but be nice if it does.
-                               $msg = wfMessage( 'content-failed-to-parse', $this->contentModel, $this->contentFormat, $ex->getMessage() );
+                               $msg = wfMessage(
+                                       'content-failed-to-parse',
+                                       $this->contentModel,
+                                       $this->contentFormat,
+                                       $ex->getMessage()
+                               );
                                $wgOut->addWikiText( '<div class="error">' . $msg->text() . '</div>' );
                        }
                }
@@ -2401,7 +2597,7 @@ class EditPage {
         * Extract the section title from current section text, if any.
         *
         * @param string $text
-        * @return Mixed|string or false
+        * @return string|bool string or false
         */
        public static function extractSectionTitle( $text ) {
                preg_match( "/^(=+)(.+)\\1\\s*(\n|$)/i", $text, $matches );
@@ -2413,6 +2609,9 @@ class EditPage {
                }
        }
 
+       /**
+        * @return bool
+        */
        protected function showHeader() {
                global $wgOut, $wgUser, $wgMaxArticleSize, $wgLang;
 
@@ -2470,9 +2669,15 @@ class EditPage {
                                        // Let sysop know that this will make private content public if saved
 
                                        if ( !$revision->userCan( Revision::DELETED_TEXT, $wgUser ) ) {
-                                               $wgOut->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n", 'rev-deleted-text-permission' );
+                                               $wgOut->wrapWikiMsg(
+                                                       "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
+                                                       'rev-deleted-text-permission'
+                                               );
                                        } elseif ( $revision->isDeleted( Revision::DELETED_TEXT ) ) {
-                                               $wgOut->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n", 'rev-deleted-text-view' );
+                                               $wgOut->wrapWikiMsg(
+                                                       "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
+                                                       'rev-deleted-text-view'
+                                               );
                                        }
 
                                        if ( !$revision->isCurrent() ) {
@@ -2489,7 +2694,10 @@ class EditPage {
                }
 
                if ( wfReadOnly() ) {
-                       $wgOut->wrapWikiMsg( "<div id=\"mw-read-only-warning\">\n$1\n</div>", array( 'readonlywarning', wfReadOnlyReason() ) );
+                       $wgOut->wrapWikiMsg(
+                               "<div id=\"mw-read-only-warning\">\n$1\n</div>",
+                               array( 'readonlywarning', wfReadOnlyReason() )
+                       );
                } elseif ( $wgUser->isAnon() ) {
                        if ( $this->formtype != 'preview' ) {
                                $wgOut->wrapWikiMsg( "<div id=\"mw-anon-edit-warning\">\n$1</div>", 'anoneditwarning' );
@@ -2500,15 +2708,24 @@ class EditPage {
                        if ( $this->isCssJsSubpage ) {
                                # Check the skin exists
                                if ( $this->isWrongCaseCssJsPage ) {
-                                       $wgOut->wrapWikiMsg( "<div class='error' id='mw-userinvalidcssjstitle'>\n$1\n</div>", array( 'userinvalidcssjstitle', $this->mTitle->getSkinFromCssJsSubpage() ) );
+                                       $wgOut->wrapWikiMsg(
+                                               "<div class='error' id='mw-userinvalidcssjstitle'>\n$1\n</div>",
+                                               array( 'userinvalidcssjstitle', $this->mTitle->getSkinFromCssJsSubpage() )
+                                       );
                                }
                                if ( $this->formtype !== 'preview' ) {
                                        if ( $this->isCssSubpage ) {
-                                               $wgOut->wrapWikiMsg( "<div id='mw-usercssyoucanpreview'>\n$1\n</div>", array( 'usercssyoucanpreview' ) );
+                                               $wgOut->wrapWikiMsg(
+                                                       "<div id='mw-usercssyoucanpreview'>\n$1\n</div>",
+                                                       array( 'usercssyoucanpreview' )
+                                               );
                                        }
 
                                        if ( $this->isJsSubpage ) {
-                                               $wgOut->wrapWikiMsg( "<div id='mw-userjsyoucanpreview'>\n$1\n</div>", array( 'userjsyoucanpreview' ) );
+                                               $wgOut->wrapWikiMsg(
+                                                       "<div id='mw-userjsyoucanpreview'>\n$1\n</div>",
+                                                       array( 'userjsyoucanpreview' )
+                                               );
                                        }
                                }
                        }
@@ -2555,16 +2772,27 @@ class EditPage {
 
                if ( $this->tooBig || $this->kblength > $wgMaxArticleSize ) {
                        $wgOut->wrapWikiMsg( "<div class='error' id='mw-edit-longpageerror'>\n$1\n</div>",
-                               array( 'longpageerror', $wgLang->formatNum( $this->kblength ), $wgLang->formatNum( $wgMaxArticleSize ) ) );
+                               array(
+                                       'longpageerror',
+                                       $wgLang->formatNum( $this->kblength ),
+                                       $wgLang->formatNum( $wgMaxArticleSize )
+                               )
+                       );
                } else {
                        if ( !wfMessage( 'longpage-hint' )->isDisabled() ) {
                                $wgOut->wrapWikiMsg( "<div id='mw-edit-longpage-hint'>\n$1\n</div>",
-                                       array( 'longpage-hint', $wgLang->formatSize( strlen( $this->textbox1 ) ), strlen( $this->textbox1 ) )
+                                       array(
+                                               'longpage-hint',
+                                               $wgLang->formatSize( strlen( $this->textbox1 ) ),
+                                               strlen( $this->textbox1 )
+                                       )
                                );
                        }
                }
                # Add header copyright warning
                $this->showHeaderCopyrightWarning();
+
+               return true;
        }
 
        /**
@@ -2576,12 +2804,14 @@ class EditPage {
         *
         * @param string $summary The value of the summary input
         * @param string $labelText The html to place inside the label
-        * @param array $inputAttrs of attrs to use on the input
-        * @param array $spanLabelAttrs of attrs to use on the span inside the label
+        * @param array $inputAttrs Array of attrs to use on the input
+        * @param array $spanLabelAttrs Array of attrs to use on the span inside the label
         *
         * @return array An array in the format array( $label, $input )
         */
-       function getSummaryInput( $summary = "", $labelText = null, $inputAttrs = null, $spanLabelAttrs = null ) {
+       function getSummaryInput( $summary = "", $labelText = null,
+               $inputAttrs = null, $spanLabelAttrs = null
+       ) {
                // Note: the maxlength is overridden in JS to 255 and to make it use UTF-8 bytes, not characters.
                $inputAttrs = ( is_array( $inputAttrs ) ? $inputAttrs : array() ) + array(
                        'id' => 'wpSummary',
@@ -2598,7 +2828,11 @@ class EditPage {
 
                $label = null;
                if ( $labelText ) {
-                       $label = Xml::tags( 'label', $inputAttrs['id'] ? array( 'for' => $inputAttrs['id'] ) : null, $labelText );
+                       $label = Xml::tags(
+                               'label',
+                               $inputAttrs['id'] ? array( 'for' => $inputAttrs['id'] ) : null,
+                               $labelText
+                       );
                        $label = Xml::tags( 'span', $spanLabelAttrs, $label );
                }
 
@@ -2629,7 +2863,12 @@ class EditPage {
                }
                $summary = $wgContLang->recodeForEdit( $summary );
                $labelText = wfMessage( $isSubjectPreview ? 'subject' : 'summary' )->parse();
-               list( $label, $input ) = $this->getSummaryInput( $summary, $labelText, array( 'class' => $summaryClass ), array() );
+               list( $label, $input ) = $this->getSummaryInput(
+                       $summary,
+                       $labelText,
+                       array( 'class' => $summaryClass ),
+                       array()
+               );
                $wgOut->addHTML( "{$label} {$input}" );
        }
 
@@ -2637,7 +2876,7 @@ class EditPage {
         * @param bool $isSubjectPreview true if this is the section subject/title
         *   up top, or false if this is the comment summary
         *   down below the textarea
-        * @param string $summary the text of the summary to display
+        * @param string $summary The text of the summary to display
         * @return string
         */
        protected function getSummaryPreview( $isSubjectPreview, $summary = "" ) {
@@ -2656,7 +2895,8 @@ class EditPage {
 
                $message = $isSubjectPreview ? 'subject-preview' : 'summary-preview';
 
-               $summary = wfMessage( $message )->parse() . Linker::commentBlock( $summary, $this->mTitle, $isSubjectPreview );
+               $summary = wfMessage( $message )->parse()
+                       . Linker::commentBlock( $summary, $this->mTitle, $isSubjectPreview );
                return Xml::tags( 'div', array( 'class' => 'mw-summary-preview' ), $summary );
        }
 
@@ -2710,8 +2950,8 @@ HTML
         * The $textoverride method can be used by subclasses overriding showContentForm
         * to pass back to this method.
         *
-        * @param array $customAttribs of html attributes to use in the textarea
-        * @param string $textoverride optional text to override $this->textarea1 with
+        * @param array $customAttribs Array of html attributes to use in the textarea
+        * @param string $textoverride Optional text to override $this->textarea1 with
         */
        protected function showTextbox1( $customAttribs = null, $textoverride = null ) {
                if ( $this->wasDeletedSinceLastEdit() && $this->formtype == 'save' ) {
@@ -2748,7 +2988,11 @@ HTML
                        }
                }
 
-               $this->showTextbox( $textoverride !== null ? $textoverride : $this->textbox1, 'wpTextbox1', $attribs );
+               $this->showTextbox(
+                       $textoverride !== null ? $textoverride : $this->textbox1,
+                       'wpTextbox1',
+                       $attribs
+               );
        }
 
        protected function showTextbox2() {
@@ -2772,7 +3016,9 @@ HTML
                        'id' => $name,
                        'cols' => $wgUser->getIntOption( 'cols' ),
                        'rows' => $wgUser->getIntOption( 'rows' ),
-                       'style' => '' // avoid php notices when appending preferences (appending allows customAttribs['style'] to still work
+                       // Avoid PHP notices when appending preferences
+                       // (appending allows customAttribs['style'] to still work).
+                       'style' => ''
                );
 
                $pageLang = $this->mTitle->getPageLanguage();
@@ -2807,7 +3053,12 @@ HTML
                        try {
                                $this->showDiff();
                        } catch ( MWContentSerializationException $ex ) {
-                               $msg = wfMessage( 'content-failed-to-parse', $this->contentModel, $this->contentFormat, $ex->getMessage() );
+                               $msg = wfMessage(
+                                       'content-failed-to-parse',
+                                       $this->contentModel,
+                                       $this->contentFormat,
+                                       $ex->getMessage()
+                               );
                                $wgOut->addWikiText( '<div class="error">' . $msg->text() . '</div>' );
                        }
                }
@@ -2817,7 +3068,7 @@ HTML
         * Append preview output to $wgOut.
         * Includes category rendering if this is a category page.
         *
-        * @param string $text the HTML to be output for the preview.
+        * @param string $text The HTML to be output for the preview.
         */
        protected function showPreview( $text ) {
                global $wgOut;
@@ -2946,8 +3197,7 @@ HTML
         * Get the copyright warning, by default returns wikitext
         *
         * @param Title $title
-        * @param string $format output format, valid values are any function of
-        *                       a Message object
+        * @param string $format Output format, valid values are any function of a Message object
         * @return string
         */
        public static function getCopyrightWarning( $title, $format = 'plain' ) {
@@ -3046,14 +3296,19 @@ HTML
                                array( 'class' => 'mw-editButtons-pipe-separator' ),
                                wfMessage( 'pipe-separator' )->text() );
                }
-               $edithelpurl = Skin::makeInternalOrExternalUrl( wfMessage( 'edithelppage' )->inContentLanguage()->text() );
+
+               $message = wfMessage( 'edithelppage' )->inContentLanguage()->text();
+               $edithelpurl = Skin::makeInternalOrExternalUrl( $message );
                $edithelp = '<a target="helpwindow" href="' . $edithelpurl . '">' .
                        wfMessage( 'edithelp' )->escaped() . '</a> ' .
                        wfMessage( 'newwindow' )->parse();
+
                $wgOut->addHTML( "      <span class='cancelLink'>{$cancel}</span>\n" );
                $wgOut->addHTML( "      <span class='editHelp'>{$edithelp}</span>\n" );
                $wgOut->addHTML( "</div><!-- editButtons -->\n" );
+
                wfRunHooks( 'EditPage::showStandardInputs:options', array( $this, $wgOut, &$tabindex ) );
+
                $wgOut->addHTML( "</div><!-- editOptions -->\n" );
        }
 
@@ -3106,7 +3361,7 @@ HTML
         * variable in the constructor is not enough. This can be used when the
         * EditPage lives inside of a Special page rather than a custom page action.
         *
-        * @param $title Title object for which is being edited (where we go to for &action= links)
+        * @param Title $title Title object for which is being edited (where we go to for &action= links)
         * @return string
         */
        protected function getActionURL( Title $title ) {
@@ -3118,6 +3373,7 @@ HTML
         * Note that we rely on the logging table, which hasn't been always there,
         * but that doesn't matter, because this only applies to brand new
         * deletes.
+        * @return bool
         */
        protected function wasDeletedSinceLastEdit() {
                if ( $this->deletedSinceEdit !== null ) {
@@ -3139,6 +3395,9 @@ HTML
                return $this->deletedSinceEdit;
        }
 
+       /**
+        * @return bool|stdClass
+        */
        protected function getLastDelete() {
                $dbr = wfGetDB( DB_SLAVE );
                $data = $dbr->selectRow(
@@ -3174,6 +3433,7 @@ HTML
                                $data->log_comment = wfMessage( 'rev-deleted-comment' )->escaped();
                        }
                }
+
                return $data;
        }
 
@@ -3208,7 +3468,10 @@ HTML
                        $content = $this->toEditContent( $this->textbox1 );
 
                        $previewHTML = '';
-                       if ( !wfRunHooks( 'AlternateEditPreview', array( $this, &$content, &$previewHTML, &$this->mParserOutput ) ) ) {
+                       if ( !wfRunHooks(
+                               'AlternateEditPreview',
+                               array( $this, &$content, &$previewHTML, &$this->mParserOutput ) )
+                       ) {
                                wfProfileOut( __METHOD__ );
                                return $previewHTML;
                        }
@@ -3220,7 +3483,6 @@ HTML
                        if ( $this->mTriedSave && !$this->mTokenOk ) {
                                if ( $this->mTokenOkExceptSuffix ) {
                                        $note = wfMessage( 'token_suffix_mismatch' )->plain();
-
                                } else {
                                        $note = wfMessage( 'session_fail_preview' )->plain();
                                }
@@ -3278,7 +3540,11 @@ HTML
                        # But it's now deprecated, so never mind
 
                        $content = $content->preSaveTransform( $this->mTitle, $wgUser, $parserOptions );
-                       $parserOutput = $content->getParserOutput( $this->getArticle()->getTitle(), null, $parserOptions );
+                       $parserOutput = $content->getParserOutput(
+                               $this->getArticle()->getTitle(),
+                               null,
+                               $parserOptions
+                       );
 
                        $previewHTML = $parserOutput->getText();
                        $this->mParserOutput = $parserOutput;
@@ -3288,13 +3554,19 @@ HTML
                                $note .= "\n\n" . implode( "\n\n", $parserOutput->getWarnings() );
                        }
                } catch ( MWContentSerializationException $ex ) {
-                       $m = wfMessage( 'content-failed-to-parse', $this->contentModel, $this->contentFormat, $ex->getMessage() );
+                       $m = wfMessage(
+                               'content-failed-to-parse',
+                               $this->contentModel,
+                               $this->contentFormat,
+                               $ex->getMessage()
+                       );
                        $note .= "\n\n" . $m->parse();
                        $previewHTML = '';
                }
 
                if ( $this->isConflict ) {
-                       $conflict = '<h2 id="mw-previewconflict">' . wfMessage( 'previewconflict' )->escaped() . "</h2>\n";
+                       $conflict = '<h2 id="mw-previewconflict">'
+                               . wfMessage( 'previewconflict' )->escaped() . "</h2>\n";
                } else {
                        $conflict = '<hr />';
                }
@@ -3313,7 +3585,7 @@ HTML
        }
 
        /**
-        * @return Array
+        * @return array
         */
        function getTemplates() {
                if ( $this->preview || $this->section != '' ) {
@@ -3494,7 +3766,7 @@ HTML
         * minor and watch
         *
         * @param int $tabindex Current tabindex
-        * @param array $checked of checkbox => bool, where bool indicates the checked
+        * @param array $checked Array of checkbox => bool, where bool indicates the checked
         *                 status of the checkbox
         *
         * @return array
@@ -3551,6 +3823,7 @@ HTML
        public function getEditButtons( &$tabindex ) {
                $buttons = array();
 
+               // @todo FIXME: Hardcoded square brackets.
                $temp = array(
                        'id' => 'wpSave',
                        'name' => 'wpSave',
@@ -3558,11 +3831,13 @@ HTML
                        'tabindex' => ++$tabindex,
                        'value' => wfMessage( 'savearticle' )->text(),
                        'accesskey' => wfMessage( 'accesskey-save' )->text(),
-                       'title' => wfMessage( 'tooltip-save' )->text() . ' [' . wfMessage( 'accesskey-save' )->text() . ']',
+                       'title' => wfMessage( 'tooltip-save' )->text()
+                               . ' [' . wfMessage( 'accesskey-save' )->text() . ']',
                );
                $buttons['save'] = Xml::element( 'input', $temp, '' );
 
                ++$tabindex; // use the same for preview and live preview
+               // @todo FIXME: Hardcoded square brackets.
                $temp = array(
                        'id' => 'wpPreview',
                        'name' => 'wpPreview',
@@ -3570,11 +3845,13 @@ HTML
                        'tabindex' => $tabindex,
                        'value' => wfMessage( 'showpreview' )->text(),
                        'accesskey' => wfMessage( 'accesskey-preview' )->text(),
-                       'title' => wfMessage( 'tooltip-preview' )->text() . ' [' . wfMessage( 'accesskey-preview' )->text() . ']',
+                       'title' => wfMessage( 'tooltip-preview' )->text()
+                               . ' [' . wfMessage( 'accesskey-preview' )->text() . ']',
                );
                $buttons['preview'] = Xml::element( 'input', $temp, '' );
                $buttons['live'] = '';
 
+               // @todo FIXME: Hardcoded square brackets.
                $temp = array(
                        'id' => 'wpDiff',
                        'name' => 'wpDiff',
@@ -3582,7 +3859,8 @@ HTML
                        'tabindex' => ++$tabindex,
                        'value' => wfMessage( 'showdiff' )->text(),
                        'accesskey' => wfMessage( 'accesskey-diff' )->text(),
-                       'title' => wfMessage( 'tooltip-diff' )->text() . ' [' . wfMessage( 'accesskey-diff' )->text() . ']',
+                       'title' => wfMessage( 'tooltip-diff' )->text()
+                               . ' [' . wfMessage( 'accesskey-diff' )->text() . ']',
                );
                $buttons['diff'] = Xml::element( 'input', $temp, '' );
 
@@ -3612,11 +3890,11 @@ HTML
                #$categories = $skin->getCategoryLinks();
 
                $s =
-               '<?xml version="1.0" encoding="UTF-8" ?>' . "\n" .
-               Xml::tags( 'livepreview', null,
-                       Xml::element( 'preview', null, $previewText )
-                       #.      Xml::element( 'category', null, $categories )
-               );
+                       '<?xml version="1.0" encoding="UTF-8" ?>' . "\n" .
+                       Xml::tags( 'livepreview', null,
+                               Xml::element( 'preview', null, $previewText )
+                               #.      Xml::element( 'category', null, $categories )
+                       );
                echo $s;
        }
 
@@ -3673,7 +3951,7 @@ HTML
        /**
         * Show "your edit contains spam" page with your diff and text
         *
-        * @param $match string|Array|bool Text (or array of texts) which triggered one or more filters
+        * @param string|array|bool $match Text (or array of texts) which triggered one or more filters
         */
        public function spamPageWithContent( $match = false ) {
                global $wgOut, $wgLang;
@@ -3772,7 +4050,8 @@ HTML
                $bytesleft = 0;
                $result = "";
                $working = 0;
-               for ( $i = 0; $i < strlen( $invalue ); $i++ ) {
+               $valueLength = strlen( $invalue );
+               for ( $i = 0; $i < $valueLength; $i++ ) {
                        $bytevalue = ord( $invalue[$i] );
                        if ( $bytevalue <= 0x7F ) { // 0xxx xxxx
                                $result .= chr( $bytevalue );
index 0ebdb78..21fcd5a 100644 (file)
  * @ingroup SpecialPage Dump
  */
 class WikiExporter {
-       var $list_authors = false; # Return distinct author list (when not returning full history)
-       var $author_list = "";
+       /** @var bool Return distinct author list (when not returning full history) */
+       public $list_authors = false;
 
-       var $dumpUploads = false;
-       var $dumpUploadFileContents = false;
+       /** @var bool */
+       public $dumpUploads = false;
+
+       /** @var bool */
+       public $dumpUploadFileContents = false;
+
+       /** @var string */
+       protected $author_list = "";
 
        const FULL = 1;
        const CURRENT = 2;
@@ -49,14 +55,14 @@ class WikiExporter {
        const TEXT = 0;
        const STUB = 1;
 
-       var $buffer;
+       /** @var int */
+       protected $buffer;
 
-       var $text;
+       /** @var int */
+       protected $text;
 
-       /**
-        * @var DumpOutput
-        */
-       var $sink;
+       /** @var DumpOutput */
+       protected $sink;
 
        /**
         * Returns the export schema version.
@@ -97,7 +103,7 @@ class WikiExporter {
         * various row objects and XML output for filtering. Filters
         * can be chained or used as callbacks.
         *
-        * @param $sink mixed
+        * @param DumpOutput $sink
         */
        public function setOutputSink( &$sink ) {
                $this->sink =& $sink;
@@ -125,7 +131,7 @@ class WikiExporter {
        /**
         * Dumps a series of page and revision records for those pages
         * in the database falling within the page_id range given.
-        * @param int $start inclusive lower limit (this id is included)
+        * @param int $start Inclusive lower limit (this id is included)
         * @param int $end Exclusive upper limit (this id is not included)
         *   If 0, no upper limit.
         */
@@ -140,7 +146,7 @@ class WikiExporter {
        /**
         * Dumps a series of page and revision records for those pages
         * in the database with revisions falling within the rev_id range given.
-        * @param int $start inclusive lower limit (this id is included)
+        * @param int $start Inclusive lower limit (this id is included)
         * @param int $end Exclusive upper limit (this id is not included)
         *   If 0, no upper limit.
         */
@@ -153,7 +159,7 @@ class WikiExporter {
        }
 
        /**
-        * @param $title Title
+        * @param Title $title
         */
        public function pageByTitle( $title ) {
                $this->dumpFrom(
@@ -162,7 +168,7 @@ class WikiExporter {
        }
 
        /**
-        * @param $name string
+        * @param string $name
         * @throws MWException
         */
        public function pageByName( $name ) {
@@ -175,7 +181,7 @@ class WikiExporter {
        }
 
        /**
-        * @param $names array
+        * @param array $names
         */
        public function pagesByName( $names ) {
                foreach ( $names as $name ) {
@@ -188,8 +194,8 @@ class WikiExporter {
        }
 
        /**
-        * @param $start int
-        * @param $end int
+        * @param int $start
+        * @param int $end
         */
        public function logsByRange( $start, $end ) {
                $condition = 'log_id >= ' . intval( $start );
@@ -204,7 +210,7 @@ class WikiExporter {
         * Not called by default (depends on $this->list_authors)
         * Can be set by Special:Export when not exporting whole history
         *
-        * @param $cond
+        * @param array $cond
         */
        protected function do_list_authors( $cond ) {
                wfProfileIn( __METHOD__ );
@@ -237,7 +243,7 @@ class WikiExporter {
        }
 
        /**
-        * @param $cond string
+        * @param string $cond
         * @throws MWException
         * @throws Exception
         */
@@ -426,7 +432,7 @@ class WikiExporter {
         * separate database connection not managed by LoadBalancer; some
         * blob storage types will make queries to pull source data.
         *
-        * @param $resultset ResultWrapper
+        * @param ResultWrapper $resultset
         */
        protected function outputPageStream( $resultset ) {
                $last = null;
@@ -461,7 +467,7 @@ class WikiExporter {
        }
 
        /**
-        * @param $resultset array
+        * @param array $resultset
         */
        protected function outputLogStream( $resultset ) {
                foreach ( $resultset as $row ) {
@@ -591,7 +597,7 @@ class XmlDumpWriter {
         * Opens a "<page>" section on the output stream, with data
         * from the given database row.
         *
-        * @param $row object
+        * @param object $row
         * @return string
         */
        public function openPage( $row ) {
@@ -634,7 +640,7 @@ class XmlDumpWriter {
         * Dumps a "<revision>" section on the output stream, with
         * data filled in from the given database row.
         *
-        * @param $row object
+        * @param object $row
         * @return string
         * @access private
         */
@@ -664,12 +670,30 @@ class XmlDumpWriter {
                        $out .= "      " . Xml::elementClean( 'comment', array(), strval( $row->rev_comment ) ) . "\n";
                }
 
+               if ( isset( $row->rev_content_model ) && !is_null( $row->rev_content_model ) ) {
+                       $content_model = strval( $row->rev_content_model );
+               } else {
+                       // probably using $wgContentHandlerUseDB = false;
+                       $title = Title::makeTitle( $row->page_namespace, $row->page_title );
+                       $content_model = ContentHandler::getDefaultModelFor( $title );
+               }
+
+               $content_handler = ContentHandler::getForModelID( $content_model );
+
+               if ( isset( $row->rev_content_format ) && !is_null( $row->rev_content_format ) ) {
+                       $content_format = strval( $row->rev_content_format );
+               } else {
+                       // probably using $wgContentHandlerUseDB = false;
+                       $content_format = $content_handler->getDefaultFormat();
+               }
+
                $text = '';
                if ( isset( $row->rev_deleted ) && ( $row->rev_deleted & Revision::DELETED_TEXT ) ) {
                        $out .= "      " . Xml::element( 'text', array( 'deleted' => 'deleted' ) ) . "\n";
                } elseif ( isset( $row->old_text ) ) {
                        // Raw text from the database may have invalid chars
                        $text = strval( Revision::getRevisionText( $row ) );
+                       $text = $content_handler->exportTransform( $text, $content_format );
                        $out .= "      " . Xml::elementClean( 'text',
                                array( 'xml:space' => 'preserve', 'bytes' => intval( $row->rev_len ) ),
                                strval( $text ) ) . "\n";
@@ -689,26 +713,7 @@ class XmlDumpWriter {
                        $out .= "      <sha1/>\n";
                }
 
-               if ( isset( $row->rev_content_model ) && !is_null( $row->rev_content_model ) ) {
-                       $content_model = strval( $row->rev_content_model );
-               } else {
-                       // probably using $wgContentHandlerUseDB = false;
-                       // @todo test!
-                       $title = Title::makeTitle( $row->page_namespace, $row->page_title );
-                       $content_model = ContentHandler::getDefaultModelFor( $title );
-               }
-
                $out .= "      " . Xml::element( 'model', null, strval( $content_model ) ) . "\n";
-
-               if ( isset( $row->rev_content_format ) && !is_null( $row->rev_content_format ) ) {
-                       $content_format = strval( $row->rev_content_format );
-               } else {
-                       // probably using $wgContentHandlerUseDB = false;
-                       // @todo test!
-                       $content_handler = ContentHandler::getForModelID( $content_model );
-                       $content_format = $content_handler->getDefaultFormat();
-               }
-
                $out .= "      " . Xml::element( 'format', null, strval( $content_format ) ) . "\n";
 
                wfRunHooks( 'XmlDumpWriterWriteRevision', array( &$this, &$out, $row, $text ) );
@@ -723,7 +728,7 @@ class XmlDumpWriter {
         * Dumps a "<logitem>" section on the output stream, with
         * data filled in from the given database row.
         *
-        * @param $row object
+        * @param object $row
         * @return string
         * @access private
         */
@@ -767,7 +772,7 @@ class XmlDumpWriter {
        }
 
        /**
-        * @param $timestamp string
+        * @param string $timestamp
         * @param string $indent Default to six spaces
         * @return string
         */
@@ -777,8 +782,8 @@ class XmlDumpWriter {
        }
 
        /**
-        * @param $id
-        * @param $text string
+        * @param int $id
+        * @param string $text
         * @param string $indent Default to six spaces
         * @return string
         */
@@ -796,8 +801,8 @@ class XmlDumpWriter {
 
        /**
         * Warning! This data is potentially inconsistent. :(
-        * @param $row
-        * @param $dumpContents bool
+        * @param object $row
+        * @param bool $dumpContents
         * @return string
         */
        function writeUploads( $row, $dumpContents = false ) {
@@ -817,7 +822,7 @@ class XmlDumpWriter {
 
        /**
         * @param File $file
-        * @param $dumpContents bool
+        * @param bool $dumpContents
         * @return string
         */
        function writeUpload( $file, $dumpContents = false ) {
@@ -891,45 +896,45 @@ class XmlDumpWriter {
 class DumpOutput {
 
        /**
-        * @param $string string
+        * @param string $string
         */
        function writeOpenStream( $string ) {
                $this->write( $string );
        }
 
        /**
-        * @param $string string
+        * @param string $string
         */
        function writeCloseStream( $string ) {
                $this->write( $string );
        }
 
        /**
-        * @param $page
-        * @param $string string
+        * @param object $page
+        * @param string $string
         */
        function writeOpenPage( $page, $string ) {
                $this->write( $string );
        }
 
        /**
-        * @param $string string
+        * @param string $string
         */
        function writeClosePage( $string ) {
                $this->write( $string );
        }
 
        /**
-        * @param $rev
-        * @param $string string
+        * @param object $rev
+        * @param string $string
         */
        function writeRevision( $rev, $string ) {
                $this->write( $string );
        }
 
        /**
-        * @param $rev
-        * @param $string string
+        * @param object $rev
+        * @param string $string
         */
        function writeLogItem( $rev, $string ) {
                $this->write( $string );
@@ -937,7 +942,7 @@ class DumpOutput {
 
        /**
         * Override to write to a different stream type.
-        * @param $string string
+        * @param string $string
         * @return bool
         */
        function write( $string ) {
@@ -949,7 +954,7 @@ class DumpOutput {
         * and reopen new file with the old name. Use this
         * for writing out a file in multiple pieces
         * at specified checkpoints (e.g. every n hours).
-        * @param $newname mixed File name. May be a string or an array with one element
+        * @param string|array $newname File name. May be a string or an array with one element
         */
        function closeRenameAndReopen( $newname ) {
        }
@@ -958,7 +963,7 @@ class DumpOutput {
         * Close the old file, and move it to a specified name.
         * Use this for the last piece of a file written out
         * at specified checkpoints (e.g. every n hours).
-        * @param $newname mixed File name. May be a string or an array with one element
+        * @param string|array $newname File name. May be a string or an array with one element
         * @param bool $open If true, a new file with the old filename will be opened
         *   again for writing (default: false)
         */
@@ -983,7 +988,7 @@ class DumpFileOutput extends DumpOutput {
        protected $handle = false, $filename;
 
        /**
-        * @param $file
+        * @param string $file
         */
        function __construct( $file ) {
                $this->handle = fopen( $file, "wt" );
@@ -991,7 +996,7 @@ class DumpFileOutput extends DumpOutput {
        }
 
        /**
-        * @param $string string
+        * @param string $string
         */
        function writeCloseStream( $string ) {
                parent::writeCloseStream( $string );
@@ -1002,21 +1007,21 @@ class DumpFileOutput extends DumpOutput {
        }
 
        /**
-        * @param $string string
+        * @param string $string
         */
        function write( $string ) {
                fputs( $this->handle, $string );
        }
 
        /**
-        * @param $newname
+        * @param string $newname
         */
        function closeRenameAndReopen( $newname ) {
                $this->closeAndRename( $newname, true );
        }
 
        /**
-        * @param $newname
+        * @param string $newname
         * @throws MWException
         */
        function renameOrException( $newname ) {
@@ -1026,8 +1031,8 @@ class DumpFileOutput extends DumpOutput {
        }
 
        /**
-        * @param $newname array
-        * @return mixed
+        * @param array $newname
+        * @return string
         * @throws MWException
         */
        function checkRenameArgCount( $newname ) {
@@ -1042,8 +1047,8 @@ class DumpFileOutput extends DumpOutput {
        }
 
        /**
-        * @param $newname mixed
-        * @param $open bool
+        * @param string $newname
+        * @param bool $open
         */
        function closeAndRename( $newname, $open = false ) {
                $newname = $this->checkRenameArgCount( $newname );
@@ -1078,8 +1083,8 @@ class DumpPipeOutput extends DumpFileOutput {
        protected $procOpenResource = false;
 
        /**
-        * @param $command
-        * @param $file null
+        * @param string $command
+        * @param string $file
         */
        function __construct( $command, $file = null ) {
                if ( !is_null( $file ) ) {
@@ -1092,7 +1097,7 @@ class DumpPipeOutput extends DumpFileOutput {
        }
 
        /**
-        * @param $string string
+        * @param string $string
         */
        function writeCloseStream( $string ) {
                parent::writeCloseStream( $string );
@@ -1103,7 +1108,7 @@ class DumpPipeOutput extends DumpFileOutput {
        }
 
        /**
-        * @param $command
+        * @param string $command
         */
        function startCommand( $command ) {
                $spec = array(
@@ -1115,15 +1120,15 @@ class DumpPipeOutput extends DumpFileOutput {
        }
 
        /**
-        * @param mixed $newname
+        * @param string $newname
         */
        function closeRenameAndReopen( $newname ) {
                $this->closeAndRename( $newname, true );
        }
 
        /**
-        * @param $newname mixed
-        * @param $open bool
+        * @param string $newname
+        * @param bool $open
         */
        function closeAndRename( $newname, $open = false ) {
                $newname = $this->checkRenameArgCount( $newname );
@@ -1144,7 +1149,6 @@ class DumpPipeOutput extends DumpFileOutput {
                        }
                }
        }
-
 }
 
 /**
@@ -1152,9 +1156,8 @@ class DumpPipeOutput extends DumpFileOutput {
  * @ingroup Dump
  */
 class DumpGZipOutput extends DumpPipeOutput {
-
        /**
-        * @param $file string
+        * @param string $file
         */
        function __construct( $file ) {
                parent::__construct( "gzip", $file );
@@ -1166,9 +1169,8 @@ class DumpGZipOutput extends DumpPipeOutput {
  * @ingroup Dump
  */
 class DumpBZip2Output extends DumpPipeOutput {
-
        /**
-        * @param $file string
+        * @param string $file
         */
        function __construct( $file ) {
                parent::__construct( "bzip2", $file );
@@ -1180,9 +1182,8 @@ class DumpBZip2Output extends DumpPipeOutput {
  * @ingroup Dump
  */
 class Dump7ZipOutput extends DumpPipeOutput {
-
        /**
-        * @param $file string
+        * @param string $file
         */
        function __construct( $file ) {
                $command = $this->setup7zCommand( $file );
@@ -1191,7 +1192,7 @@ class Dump7ZipOutput extends DumpPipeOutput {
        }
 
        /**
-        * @param $file string
+        * @param string $file
         * @return string
         */
        function setup7zCommand( $file ) {
@@ -1203,8 +1204,8 @@ class Dump7ZipOutput extends DumpPipeOutput {
        }
 
        /**
-        * @param $newname string
-        * @param $open bool
+        * @param string $newname
+        * @param bool $open
         */
        function closeAndRename( $newname, $open = false ) {
                $newname = $this->checkRenameArgCount( $newname );
@@ -1227,7 +1228,6 @@ class Dump7ZipOutput extends DumpPipeOutput {
  * @ingroup Dump
  */
 class DumpFilter {
-
        /**
         * @var DumpOutput
         * FIXME will need to be made protected whenever legacy code
@@ -1241,29 +1241,29 @@ class DumpFilter {
        protected $sendingThisPage;
 
        /**
-        * @param $sink DumpOutput
+        * @param DumpOutput $sink
         */
        function __construct( &$sink ) {
                $this->sink =& $sink;
        }
 
        /**
-        * @param $string string
+        * @param string $string
         */
        function writeOpenStream( $string ) {
                $this->sink->writeOpenStream( $string );
        }
 
        /**
-        * @param $string string
+        * @param string $string
         */
        function writeCloseStream( $string ) {
                $this->sink->writeCloseStream( $string );
        }
 
        /**
-        * @param $page
-        * @param $string string
+        * @param object $page
+        * @param string $string
         */
        function writeOpenPage( $page, $string ) {
                $this->sendingThisPage = $this->pass( $page, $string );
@@ -1273,7 +1273,7 @@ class DumpFilter {
        }
 
        /**
-        * @param $string string
+        * @param string $string
         */
        function writeClosePage( $string ) {
                if ( $this->sendingThisPage ) {
@@ -1283,8 +1283,8 @@ class DumpFilter {
        }
 
        /**
-        * @param $rev
-        * @param $string string
+        * @param object $rev
+        * @param string $string
         */
        function writeRevision( $rev, $string ) {
                if ( $this->sendingThisPage ) {
@@ -1293,23 +1293,23 @@ class DumpFilter {
        }
 
        /**
-        * @param $rev
-        * @param $string string
+        * @param object $rev
+        * @param string $string
         */
        function writeLogItem( $rev, $string ) {
                $this->sink->writeRevision( $rev, $string );
        }
 
        /**
-        * @param $newname string
+        * @param string $newname
         */
        function closeRenameAndReopen( $newname ) {
                $this->sink->closeRenameAndReopen( $newname );
        }
 
        /**
-        * @param $newname string
-        * @param $open bool
+        * @param string $newname
+        * @param bool $open
         */
        function closeAndRename( $newname, $open = false ) {
                $this->sink->closeAndRename( $newname, $open );
@@ -1324,7 +1324,7 @@ class DumpFilter {
 
        /**
         * Override for page-based filter types.
-        * @param $page
+        * @param object $page
         * @return bool
         */
        function pass( $page ) {
@@ -1337,9 +1337,8 @@ class DumpFilter {
  * @ingroup Dump
  */
 class DumpNotalkFilter extends DumpFilter {
-
        /**
-        * @param $page
+        * @param object $page
         * @return bool
         */
        function pass( $page ) {
@@ -1352,12 +1351,15 @@ class DumpNotalkFilter extends DumpFilter {
  * @ingroup Dump
  */
 class DumpNamespaceFilter extends DumpFilter {
-       var $invert = false;
-       var $namespaces = array();
+       /** @var bool */
+       protected $invert = false;
+
+       /** @var array */
+       protected $namespaces = array();
 
        /**
-        * @param $sink DumpOutput
-        * @param $param
+        * @param DumpOutput $sink
+        * @param array $param
         * @throws MWException
         */
        function __construct( &$sink, $param ) {
@@ -1403,7 +1405,7 @@ class DumpNamespaceFilter extends DumpFilter {
        }
 
        /**
-        * @param $page
+        * @param object $page
         * @return bool
         */
        function pass( $page ) {
@@ -1417,11 +1419,17 @@ class DumpNamespaceFilter extends DumpFilter {
  * @ingroup Dump
  */
 class DumpLatestFilter extends DumpFilter {
-       var $page, $pageString, $rev, $revString;
+       protected $page;
+
+       protected $pageString;
+
+       protected $rev;
+
+       protected $revString;
 
        /**
-        * @param $page
-        * @param $string string
+        * @param object $page
+        * @param string $string
         */
        function writeOpenPage( $page, $string ) {
                $this->page = $page;
@@ -1429,7 +1437,7 @@ class DumpLatestFilter extends DumpFilter {
        }
 
        /**
-        * @param $string string
+        * @param string $string
         */
        function writeClosePage( $string ) {
                if ( $this->rev ) {
@@ -1444,8 +1452,8 @@ class DumpLatestFilter extends DumpFilter {
        }
 
        /**
-        * @param $rev
-        * @param $string string
+        * @param object $rev
+        * @param string $string
         */
        function writeRevision( $rev, $string ) {
                if ( $rev->rev_id == $this->page->page_latest ) {
@@ -1462,7 +1470,7 @@ class DumpLatestFilter extends DumpFilter {
 class DumpMultiWriter {
 
        /**
-        * @param $sinks
+        * @param array $sinks
         */
        function __construct( $sinks ) {
                $this->sinks = $sinks;
@@ -1470,7 +1478,7 @@ class DumpMultiWriter {
        }
 
        /**
-        * @param $string string
+        * @param string $string
         */
        function writeOpenStream( $string ) {
                for ( $i = 0; $i < $this->count; $i++ ) {
@@ -1479,7 +1487,7 @@ class DumpMultiWriter {
        }
 
        /**
-        * @param $string string
+        * @param string $string
         */
        function writeCloseStream( $string ) {
                for ( $i = 0; $i < $this->count; $i++ ) {
@@ -1488,8 +1496,8 @@ class DumpMultiWriter {
        }
 
        /**
-        * @param $page
-        * @param $string string
+        * @param object $page
+        * @param string $string
         */
        function writeOpenPage( $page, $string ) {
                for ( $i = 0; $i < $this->count; $i++ ) {
@@ -1498,7 +1506,7 @@ class DumpMultiWriter {
        }
 
        /**
-        * @param $string
+        * @param string $string
         */
        function writeClosePage( $string ) {
                for ( $i = 0; $i < $this->count; $i++ ) {
@@ -1507,8 +1515,8 @@ class DumpMultiWriter {
        }
 
        /**
-        * @param $rev
-        * @param $string
+        * @param object $rev
+        * @param string $string
         */
        function writeRevision( $rev, $string ) {
                for ( $i = 0; $i < $this->count; $i++ ) {
@@ -1517,14 +1525,14 @@ class DumpMultiWriter {
        }
 
        /**
-        * @param $newnames
+        * @param array $newnames
         */
        function closeRenameAndReopen( $newnames ) {
                $this->closeAndRename( $newnames, true );
        }
 
        /**
-        * @param $newnames array
+        * @param array $newnames
         * @param bool $open
         */
        function closeAndRename( $newnames, $open = false ) {
@@ -1543,12 +1551,12 @@ class DumpMultiWriter {
                }
                return $filenames;
        }
-
 }
 
 /**
- * @param $string string
+ * @param string $string
  * @return string
+ * @todo FIXME: Only used in OAI extension. Move over there.
  */
 function xmlsafe( $string ) {
        wfProfileIn( __FUNCTION__ );
index cdf6c88..e38bdf1 100644 (file)
@@ -26,9 +26,9 @@
 class Fallback {
 
        /**
-        * @param $from
-        * @param $to
-        * @param $string
+        * @param string $from
+        * @param string $to
+        * @param string $string
         * @return string
         */
        public static function iconv( $from, $to, $string ) {
@@ -57,9 +57,9 @@ class Fallback {
         * can be up to 100x slower than native if the text is heavily
         * multibyte and we have to slog through a few hundred kb.
         *
-        * @param $str
-        * @param $start
-        * @param $count string
+        * @param string $str
+        * @param int $start
+        * @param string $count
         *
         * @return string
         */
@@ -78,8 +78,8 @@ class Fallback {
        }
 
        /**
-        * @param $str
-        * @param $splitPos
+        * @param string $str
+        * @param int $splitPos
         * @return int
         */
        public static function mb_substr_split_unicode( $str, $splitPos ) {
@@ -130,7 +130,7 @@ class Fallback {
        /**
         * Fallback implementation of mb_strlen, hardcoded to UTF-8.
         * @param string $str
-        * @param string $enc optional encoding; ignored
+        * @param string $enc Optional encoding; ignored
         * @return int
         */
        public static function mb_strlen( $str, $enc = '' ) {
@@ -151,10 +151,10 @@ class Fallback {
 
        /**
         * Fallback implementation of mb_strpos, hardcoded to UTF-8.
-        * @param $haystack String
-        * @param $needle String
-        * @param string $offset optional start position
-        * @param string $encoding optional encoding; ignored
+        * @param string $haystack
+        * @param string $needle
+        * @param string $offset Optional start position
+        * @param string $encoding Optional encoding; ignored
         * @return int
         */
        public static function mb_strpos( $haystack, $needle, $offset = 0, $encoding = '' ) {
@@ -172,8 +172,8 @@ class Fallback {
 
        /**
         * Fallback implementation of mb_strrpos, hardcoded to UTF-8.
-        * @param $haystack String
-        * @param $needle String
+        * @param string $haystack
+        * @param string $needle
         * @param string $offset optional start position
         * @param string $encoding optional encoding; ignored
         * @return int
index d5a9553..1674b13 100644 (file)
  * @ingroup Feed
  */
 class FeedItem {
-       /**
-        * @var Title
-        */
-       var $title;
+       /** @var Title */
+       protected $title;
+
+       protected $description;
+
+       protected $url;
+
+       protected $date;
 
-       var $description;
-       var $url;
-       var $date;
-       var $author;
-       var $uniqueId;
-       var $comments;
-       var $rssIsPermalink = false;
+       protected $author;
+
+       protected $uniqueId;
+
+       protected $comments;
+
+       public $rssIsPermalink = false;
 
        /**
         * Constructor
         *
         * @param string|Title $title Item's title
-        * @param $description String
+        * @param string $description
         * @param string $url URL uniquely designating the item.
         * @param string $date Item's date
         * @param string $author Author's user name
-        * @param $comments String
+        * @param string $comments
         */
        function __construct( $title, $description, $url, $date = '', $author = '', $comments = '' ) {
                $this->title = $title;
@@ -72,8 +76,8 @@ class FeedItem {
        /**
         * Encode $string so that it can be safely embedded in a XML document
         *
-        * @param string $string string to encode
-        * @return String
+        * @param string $string String to encode
+        * @return string
         */
        public function xmlEncode( $string ) {
                $string = str_replace( "\r\n", "\n", $string );
@@ -84,7 +88,7 @@ class FeedItem {
        /**
         * Get the unique id of this item
         *
-        * @return String
+        * @return string
         */
        public function getUniqueId() {
                if ( $this->uniqueId ) {
@@ -93,10 +97,10 @@ class FeedItem {
        }
 
        /**
-        * set the unique id of an item
+        * Set the unique id of an item
         *
-        * @param string $uniqueId unique id for the item
-        * @param $rssIsPermalink Boolean: set to true if the guid (unique id) is a permalink (RSS feeds only)
+        * @param string $uniqueId Unique id for the item
+        * @param bool $rssIsPermalink Set to true if the guid (unique id) is a permalink (RSS feeds only)
         */
        public function setUniqueId( $uniqueId, $rssIsPermalink = false ) {
                $this->uniqueId = $uniqueId;
@@ -106,7 +110,7 @@ class FeedItem {
        /**
         * Get the title of this item; already xml-encoded
         *
-        * @return String
+        * @return string
         */
        public function getTitle() {
                return $this->xmlEncode( $this->title );
@@ -115,7 +119,7 @@ class FeedItem {
        /**
         * Get the URL of this item; already xml-encoded
         *
-        * @return String
+        * @return string
         */
        public function getUrl() {
                return $this->xmlEncode( $this->url );
@@ -124,7 +128,7 @@ class FeedItem {
        /**
         * Get the description of this item; already xml-encoded
         *
-        * @return String
+        * @return string
         */
        public function getDescription() {
                return $this->xmlEncode( $this->description );
@@ -133,7 +137,7 @@ class FeedItem {
        /**
         * Get the language of this item
         *
-        * @return String
+        * @return string
         */
        public function getLanguage() {
                global $wgLanguageCode;
@@ -141,9 +145,9 @@ class FeedItem {
        }
 
        /**
-        * Get the title of this item
+        * Get the date of this item
         *
-        * @return String
+        * @return string
         */
        public function getDate() {
                return $this->date;
@@ -152,7 +156,7 @@ class FeedItem {
        /**
         * Get the author of this item; already xml-encoded
         *
-        * @return String
+        * @return string
         */
        public function getAuthor() {
                return $this->xmlEncode( $this->author );
@@ -161,7 +165,7 @@ class FeedItem {
        /**
         * Get the comment of this item; already xml-encoded
         *
-        * @return String
+        * @return string
         */
        public function getComments() {
                return $this->xmlEncode( $this->comments );
@@ -171,7 +175,7 @@ class FeedItem {
         * Quickie hack... strip out wikilinks to more legible form from the comment.
         *
         * @param string $text wikitext
-        * @return String
+        * @return string
         */
        public static function stripComment( $text ) {
                return preg_replace( '/\[\[([^]]*\|)?([^]]+)\]\]/', '\2', $text );
@@ -190,7 +194,6 @@ abstract class ChannelFeed extends FeedItem {
         * @code
         * print "<feed>";
         * @endcode
-        * @param $item
         */
        abstract public function outHeader();
 
@@ -200,7 +203,7 @@ abstract class ChannelFeed extends FeedItem {
         * @code
         * print "<item>...</item>";
         * @endcode
-        * @param $item
+        * @param FeedItem $item
         */
        abstract public function outItem( $item );
 
@@ -239,27 +242,35 @@ abstract class ChannelFeed extends FeedItem {
         * Return an internet media type to be sent in the headers.
         *
         * @return string
-        * @private
         */
-       function contentType() {
+       private function contentType() {
                global $wgRequest;
+
                $ctype = $wgRequest->getVal( 'ctype', 'application/xml' );
-               $allowedctypes = array( 'application/xml', 'text/xml', 'application/rss+xml', 'application/atom+xml' );
+               $allowedctypes = array(
+                       'application/xml',
+                       'text/xml',
+                       'application/rss+xml',
+                       'application/atom+xml'
+               );
+
                return ( in_array( $ctype, $allowedctypes ) ? $ctype : 'application/xml' );
        }
 
        /**
         * Output the initial XML headers with a stylesheet for legibility
         * if someone finds it in a browser.
-        * @private
         */
-       function outXmlHeader() {
+       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 ) ) .
+                       htmlspecialchars( wfExpandUrl(
+                               "$wgStylePath/common/feed.css?$wgStyleVersion",
+                               PROTO_CURRENT
+                       ) ) .
                        '"?' . ">\n";
        }
 }
@@ -274,8 +285,8 @@ class RSSFeed extends ChannelFeed {
        /**
         * Format a date given a timestamp
         *
-        * @param $ts Integer: timestamp
-        * @return String: date string
+        * @param int $ts Timestamp
+        * @return string Date string
         */
        function formatTime( $ts ) {
                return gmdate( 'D, d M Y H:i:s \G\M\T', wfTimestamp( TS_UNIX, $ts ) );
@@ -301,9 +312,10 @@ class RSSFeed extends ChannelFeed {
 
        /**
         * Output an RSS 2.0 item
-        * @param $item FeedItem: item to be output
+        * @param FeedItem $item Item to be output
         */
        function outItem( $item ) {
+               // @codingStandardsIgnoreStart Ignore long lines and formatting issues.
        ?>
                <item>
                        <title><?php print $item->getTitle(); ?></title>
@@ -315,6 +327,7 @@ class RSSFeed extends ChannelFeed {
                        <?php if ( $item->getComments() ) { ?><comments><?php print wfExpandUrl( $item->getComments(), PROTO_CURRENT ); ?></comments><?php }?>
                </item>
 <?php
+               // @codingStandardsIgnoreEnd
        }
 
        /**
@@ -349,6 +362,7 @@ class AtomFeed extends ChannelFeed {
                global $wgVersion;
 
                $this->outXmlHeader();
+               // @codingStandardsIgnoreStart Ignore long lines and formatting issues.
                ?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="<?php print $this->getLanguage() ?>">
                <id><?php print $this->getFeedId() ?></id>
                <title><?php print $this->getTitle() ?></title>
@@ -359,6 +373,7 @@ class AtomFeed extends ChannelFeed {
                <generator>MediaWiki <?php print $wgVersion ?></generator>
 
 <?php
+               // @codingStandardsIgnoreEnd
        }
 
        /**
@@ -368,28 +383,27 @@ class AtomFeed extends ChannelFeed {
         * have to change the id? Maybe? Maybe not.
         *
         * @return string
-        * @private
         */
-       function getFeedId() {
+       private function getFeedId() {
                return $this->getSelfUrl();
        }
 
        /**
         * Atom 1.0 requests a self-reference to the feed.
         * @return string
-        * @private
         */
-       function getSelfUrl() {
+       private function getSelfUrl() {
                global $wgRequest;
                return htmlspecialchars( $wgRequest->getFullRequestURL() );
        }
 
        /**
         * Output a given item.
-        * @param $item
+        * @param FeedItem $item
         */
        function outItem( $item ) {
                global $wgMimeType;
+               // @codingStandardsIgnoreStart Ignore long lines and formatting issues.
        ?>
        <entry>
                <id><?php print $item->getUniqueId(); ?></id>
@@ -413,5 +427,6 @@ class AtomFeed extends ChannelFeed {
         */
        function outFooter() {?>
        </feed><?php
+               // @codingStandardsIgnoreEnd
        }
 }
index 22cb52b..83ce755 100644 (file)
@@ -33,8 +33,8 @@ class FeedUtils {
         * If the feed should be purged; $timekey and $key will be removed from
         * $messageMemc
         *
-        * @param string $timekey cache key of the timestamp of the last item
-        * @param string $key cache key of feed's content
+        * @param string $timekey Cache key of the timestamp of the last item
+        * @param string $key Cache key of feed's content
         */
        public static function checkPurge( $timekey, $key ) {
                global $wgRequest, $wgUser, $messageMemc;
@@ -49,7 +49,7 @@ class FeedUtils {
         * Check whether feeds can be used and that $type is a valid feed type
         *
         * @param string $type feed type, as requested by the user
-        * @return Boolean
+        * @return bool
         */
        public static function checkFeedOutput( $type ) {
                global $wgOut, $wgFeed, $wgFeedClasses;
@@ -70,8 +70,8 @@ class FeedUtils {
        /**
         * Format a diff for the newsfeed
         *
-        * @param $row Object: row from the recentchanges table
-        * @return String
+        * @param object $row Row from the recentchanges table
+        * @return string
         */
        public static function formatDiff( $row ) {
                $titleObj = Title::makeTitle( $row->rc_namespace, $row->rc_title );
@@ -94,15 +94,17 @@ class FeedUtils {
        /**
         * Really format a diff for the newsfeed
         *
-        * @param $title Title object
-        * @param $oldid Integer: old revision's id
-        * @param $newid Integer: new revision's id
-        * @param $timestamp Integer: new revision's timestamp
-        * @param string $comment new revision's comment
-        * @param string $actiontext text of the action; in case of log event
-        * @return String
+        * @param Title $title Title object
+        * @param int $oldid Old revision's id
+        * @param int $newid New revision's id
+        * @param int $timestamp New revision's timestamp
+        * @param string $comment New revision's comment
+        * @param string $actiontext Text of the action; in case of log event
+        * @return string
         */
-       public static function formatDiffRow( $title, $oldid, $newid, $timestamp, $comment, $actiontext = '' ) {
+       public static function formatDiffRow( $title, $oldid, $newid, $timestamp,
+               $comment, $actiontext = ''
+       ) {
                global $wgFeedDiffCutoff, $wgLang;
                wfProfileIn( __METHOD__ );
 
@@ -214,9 +216,9 @@ class FeedUtils {
         * Generates a diff link. Used when the full diff is not wanted for example
         * when $wgFeedDiffCutoff is 0.
         *
-        * @param $title Title object: used to generate the diff URL
-        * @param $newid Integer newid for this diff
-        * @param $oldid Integer|null oldid for the diff. Null means it is a new article
+        * @param Title $title Title object: used to generate the diff URL
+        * @param int $newid Newid for this diff
+        * @param int|null $oldid Oldid for the diff. Null means it is a new article
         * @return string
         */
        protected static function getDiffLink( Title $title, $newid, $oldid = null ) {
@@ -237,17 +239,23 @@ class FeedUtils {
         * Might be 'cleaner' to use DOM or XSLT or something,
         * but *gack* it's a pain in the ass.
         *
-        * @param string $text diff's HTML output
-        * @return String: modified HTML
+        * @param string $text Diff's HTML output
+        * @return string Modified HTML
         */
        public static function applyDiffStyle( $text ) {
                $styles = array(
                        'diff'             => 'background-color: white; color:black;',
                        'diff-otitle'      => 'background-color: white; color:black; text-align: center;',
                        'diff-ntitle'      => 'background-color: white; color:black; text-align: center;',
-                       'diff-addedline'   => 'color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;',
-                       'diff-deletedline' => 'color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;',
-                       'diff-context'     => 'background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;',
+                       'diff-addedline'   => 'color:black; font-size: 88%; border-style: solid; '
+                               . 'border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; '
+                               . 'vertical-align: top; white-space: pre-wrap;',
+                       'diff-deletedline' => 'color:black; font-size: 88%; border-style: solid; '
+                               . 'border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; '
+                               . 'vertical-align: top; white-space: pre-wrap;',
+                       'diff-context'     => 'background-color: #f9f9f9; color: #333333; font-size: 88%; '
+                               . 'border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; '
+                               . 'border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;',
                        'diffchange'       => 'font-weight: bold; text-decoration: none;',
                );
 
index 444d26f..b4e2458 100644 (file)
@@ -83,7 +83,10 @@ class FileDeleteForm {
                $suppress = $wgRequest->getVal( 'wpSuppress' ) && $wgUser->isAllowed( 'suppressrevision' );
 
                if ( $this->oldimage ) {
-                       $this->oldfile = RepoGroup::singleton()->getLocalRepo()->newFromArchiveName( $this->title, $this->oldimage );
+                       $this->oldfile = RepoGroup::singleton()->getLocalRepo()->newFromArchiveName(
+                               $this->title,
+                               $this->oldimage
+                       );
                }
 
                if ( !self::haveDeletableFile( $this->file, $this->oldfile, $this->oldimage ) ) {
@@ -107,11 +110,20 @@ class FileDeleteForm {
                                $reason = $deleteReasonList;
                        }
 
-                       $status = self::doDelete( $this->title, $this->file, $this->oldimage, $reason, $suppress, $wgUser );
+                       $status = self::doDelete(
+                               $this->title,
+                               $this->file,
+                               $this->oldimage,
+                               $reason,
+                               $suppress,
+                               $wgUser
+                       );
 
                        if ( !$status->isGood() ) {
                                $wgOut->addHTML( '<h2>' . $this->prepareMessage( 'filedeleteerror-short' ) . "</h2>\n" );
-                               $wgOut->addWikiText( '<div class="error">' . $status->getWikiText( 'filedeleteerror-short', 'filedeleteerror-long' ) . '</div>' );
+                               $wgOut->addWikiText( '<div class="error">' .
+                                       $status->getWikiText( 'filedeleteerror-short', 'filedeleteerror-long' )
+                                       . '</div>' );
                        }
                        if ( $status->ok ) {
                                $wgOut->setPageTitle( wfMessage( 'actioncomplete' ) );
@@ -141,7 +153,9 @@ class FileDeleteForm {
         * @throws MWException
         * @return bool|Status
         */
-       public static function doDelete( &$title, &$file, &$oldimage, $reason, $suppress, User $user = null ) {
+       public static function doDelete( &$title, &$file, &$oldimage, $reason,
+               $suppress, User $user = null
+       ) {
                if ( $user === null ) {
                        global $wgUser;
                        $user = $wgUser;
@@ -149,7 +163,7 @@ class FileDeleteForm {
 
                if ( $oldimage ) {
                        $page = null;
-                       $status = $file->deleteOld( $oldimage, $reason, $suppress );
+                       $status = $file->deleteOld( $oldimage, $reason, $suppress, $user );
                        if ( $status->ok ) {
                                // Need to do a log item
                                $logComment = wfMessage( 'deletedrevision', $oldimage )->inContentLanguage()->text();
@@ -180,7 +194,7 @@ class FileDeleteForm {
                                // doDeleteArticleReal() returns a non-fatal error status if the page
                                // or revision is missing, so check for isOK() rather than isGood()
                                if ( $deleteStatus->isOK() ) {
-                                       $status = $file->delete( $reason, $suppress );
+                                       $status = $file->delete( $reason, $suppress, $user );
                                        if ( $status->isOK() ) {
                                                $dbw->commit( __METHOD__ );
                                        } else {
@@ -188,7 +202,8 @@ class FileDeleteForm {
                                        }
                                }
                        } catch ( MWException $e ) {
-                               // rollback before returning to prevent UI from displaying incorrect "View or restore N deleted edits?"
+                               // Rollback before returning to prevent UI from displaying
+                               // incorrect "View or restore N deleted edits?"
                                $dbw->rollback( __METHOD__ );
                                throw $e;
                        }
@@ -266,8 +281,14 @@ class FileDeleteForm {
                        <tr>
                                <td></td>
                                <td class='mw-submit'>" .
-                                       Xml::submitButton( wfMessage( 'filedelete-submit' )->text(),
-                                               array( 'name' => 'mw-filedelete-submit', 'id' => 'mw-filedelete-submit', 'tabindex' => '4' ) ) .
+                                       Xml::submitButton(
+                                               wfMessage( 'filedelete-submit' )->text(),
+                                               array(
+                                                       'name' => 'mw-filedelete-submit',
+                                                       'id' => 'mw-filedelete-submit',
+                                                       'tabindex' => '4'
+                                               )
+                                       ) .
                                "</td>
                        </tr>" .
                        Xml::closeElement( 'table' ) .
@@ -303,14 +324,16 @@ class FileDeleteForm {
         * showing an appropriate message depending upon whether
         * it's a current file or an old version
         *
-        * @param string $message message base
-        * @return String
+        * @param string $message Message base
+        * @return string
         */
        private function prepareMessage( $message ) {
                global $wgLang;
                if ( $this->oldimage ) {
+                       # Message keys used:
+                       # 'filedelete-intro-old', 'filedelete-nofile-old', 'filedelete-success-old'
                        return wfMessage(
-                               "{$message}-old", # To ensure grep will find them: 'filedelete-intro-old', 'filedelete-nofile-old', 'filedelete-success-old'
+                               "{$message}-old",
                                wfEscapeWikiText( $this->title->getText() ),
                                $wgLang->date( $this->getTimestamp(), true ),
                                $wgLang->time( $this->getTimestamp(), true ),
@@ -336,6 +359,7 @@ class FileDeleteForm {
        /**
         * Is the provided `oldimage` value valid?
         *
+        * @param string $oldimage
         * @return bool
         */
        public static function isValidOldSpec( $oldimage ) {
@@ -349,9 +373,9 @@ class FileDeleteForm {
         * value was provided, does it correspond to an
         * existing, local, old version of this file?
         *
-        * @param $file File
-        * @param $oldfile File
-        * @param $oldimage File
+        * @param File $file
+        * @param File $oldfile
+        * @param File $oldimage
         * @return bool
         */
        public static function haveDeletableFile( &$file, &$oldfile, $oldimage ) {
index a8da67e..079267a 100644 (file)
@@ -44,7 +44,7 @@ class FormOptions implements ArrayAccess {
        /** Integer type, maps guessType() to WebRequest::getInt() */
        const INT = 1;
        /** Float type, maps guessType() to WebRequest::getFloat()
-         * @since 1.23 */
+        * @since 1.23 */
        const FLOAT = 4;
        /** Boolean type, maps guessType() to WebRequest::getBool() */
        const BOOL = 2;
index 6b092d9..304c1bc 100644 (file)
@@ -35,33 +35,91 @@ class GitInfo {
         */
        protected $basedir;
 
+       /**
+        * Path to JSON cache file for pre-computed git information.
+        */
+       protected $cacheFile;
+
+       /**
+        * Cached git information.
+        */
+       protected $cache = array();
+
        /**
         * Map of repo URLs to viewer URLs. Access via static method getViewers().
         */
        private static $viewers = false;
 
        /**
-        * @param string $dir The root directory of the repo where the .git dir can be found
+        * @param string $repoDir The root directory of the repo where .git can be found
+        * @param bool $usePrecomputed Use precomputed information if available
+        * @see precomputeValues
+        */
+       public function __construct( $repoDir, $usePrecomputed = true ) {
+               $this->cacheFile = self::getCacheFilePath( $repoDir );
+               if ( $usePrecomputed &&
+                       $this->cacheFile !== null &&
+                       is_readable( $this->cacheFile )
+               ) {
+                       $this->cache = FormatJson::decode(
+                               file_get_contents( $this->cacheFile ),
+                               true
+                       );
+               }
+
+               if ( !$this->cacheIsComplete() ) {
+                       $this->basedir = $repoDir . DIRECTORY_SEPARATOR . '.git';
+                       if ( is_readable( $this->basedir ) && !is_dir( $this->basedir ) ) {
+                               $GITfile = file_get_contents( $this->basedir );
+                               if ( strlen( $GITfile ) > 8 &&
+                                       substr( $GITfile, 0, 8 ) === 'gitdir: '
+                               ) {
+                                       $path = rtrim( substr( $GITfile, 8 ), "\r\n" );
+                                       if ( $path[0] === '/' || substr( $path, 1, 1 ) === ':' ) {
+                                               // Path from GITfile is absolute
+                                               $this->basedir = $path;
+                                       } else {
+                                               $this->basedir = $repoDir . DIRECTORY_SEPARATOR . $path;
+                                       }
+                               }
+                       }
+               }
+       }
+
+       /**
+        * Compute the path to the cache file for a given directory.
+        *
+        * @param string $repoDir The root directory of the repo where .git can be found
+        * @return string Path to GitInfo cache file in $wgCacheDirectory or null if
+        * $wgCacheDirectory is false (cache disabled).
         */
-       public function __construct( $dir ) {
-               $this->basedir = $dir . DIRECTORY_SEPARATOR . '.git';
-               if ( is_readable( $this->basedir ) && !is_dir( $this->basedir ) ) {
-                       $GITfile = file_get_contents( $this->basedir );
-                       if ( strlen( $GITfile ) > 8 && substr( $GITfile, 0, 8 ) === 'gitdir: ' ) {
-                               $path = rtrim( substr( $GITfile, 8 ), "\r\n" );
-                               $isAbsolute = $path[0] === '/' || substr( $path, 1, 1 ) === ':';
-                               $this->basedir = $isAbsolute ? $path : $dir . DIRECTORY_SEPARATOR . $path;
+       protected static function getCacheFilePath( $repoDir ) {
+               global $IP, $wgCacheDirectory;
+               if ( $wgCacheDirectory ) {
+                       // Transform path to git repo to something we can safely embed in a filename
+                       $repoName = $repoDir;
+                       if ( strpos( $repoName, $IP ) === 0 ) {
+                               // Strip $IP from path
+                               $repoName = substr( $repoName, strlen( $IP ) );
                        }
+                       $repoName = strtr( $repoName, DIRECTORY_SEPARATOR, '-' );
+                       $fileName = 'info' . $repoName . '.json';
+                       return implode(
+                               DIRECTORY_SEPARATOR,
+                               array( $wgCacheDirectory, 'gitinfo', $fileName )
+                       );
                }
+               return null;
        }
 
        /**
-        * Return a singleton for the repo at $IP
+        * Get the singleton for the repo at $IP
+        *
         * @return GitInfo
         */
        public static function repo() {
-               global $IP;
                if ( is_null( self::$repo ) ) {
+                       global $IP;
                        self::$repo = new self( $IP );
                }
                return self::$repo;
@@ -78,50 +136,56 @@ class GitInfo {
        }
 
        /**
-        * Return the HEAD of the repo (without any opening "ref: ")
-        * @return string The HEAD
+        * Get the HEAD of the repo (without any opening "ref: ")
+        *
+        * @return string|bool The HEAD (git reference or SHA1) or false
         */
        public function getHead() {
-               $headFile = "{$this->basedir}/HEAD";
+               if ( !isset( $this->cache['head'] ) ) {
+                       $headFile = "{$this->basedir}/HEAD";
+                       $head = false;
 
-               if ( !is_readable( $headFile ) ) {
-                       return false;
-               }
+                       if ( is_readable( $headFile ) ) {
+                               $head = file_get_contents( $headFile );
 
-               $head = file_get_contents( $headFile );
-
-               if ( preg_match( "/ref: (.*)/", $head, $m ) ) {
-                       return rtrim( $m[1] );
-               } else {
-                       return rtrim( $head );
+                               if ( preg_match( "/ref: (.*)/", $head, $m ) ) {
+                                       $head = rtrim( $m[1] );
+                               } else {
+                                       $head = rtrim( $head );
+                               }
+                       }
+                       $this->cache['head'] = $head;
                }
+               return $this->cache['head'];
        }
 
        /**
-        * Return the SHA1 for the current HEAD of the repo
-        * @return string A SHA1 or false
+        * Get the SHA1 for the current HEAD of the repo
+        *
+        * @return string|bool A SHA1 or false
         */
        public function getHeadSHA1() {
-               $head = $this->getHead();
-
-               // If detached HEAD may be a SHA1
-               if ( self::isSHA1( $head ) ) {
-                       return $head;
-               }
-
-               // If not a SHA1 it may be a ref:
-               $refFile = "{$this->basedir}/{$head}";
-               if ( !is_readable( $refFile ) ) {
-                       return false;
+               if ( !isset( $this->cache['headSHA1'] ) ) {
+                       $head = $this->getHead();
+                       $sha1 = false;
+
+                       // If detached HEAD may be a SHA1
+                       if ( self::isSHA1( $head ) ) {
+                               $sha1 = $head;
+                       } else {
+                               // If not a SHA1 it may be a ref:
+                               $refFile = "{$this->basedir}/{$head}";
+                               if ( is_readable( $refFile ) ) {
+                                       $sha1 = rtrim( file_get_contents( $refFile ) );
+                               }
+                       }
+                       $this->cache['headSHA1'] = $sha1;
                }
-
-               $sha1 = rtrim( file_get_contents( $refFile ) );
-
-               return $sha1;
+               return $this->cache['headSHA1'];
        }
 
        /**
-        * Return the commit date of HEAD entry of the git code repository
+        * Get the commit date of HEAD entry of the git code repository
         *
         * @since 1.22
         * @return int|bool Commit date (UNIX timestamp) or false
@@ -129,67 +193,54 @@ class GitInfo {
        public function getHeadCommitDate() {
                global $wgGitBin;
 
-               if ( !is_file( $wgGitBin ) || !is_executable( $wgGitBin ) ) {
-                       return false;
-               }
-
-               $environment = array( "GIT_DIR" => $this->basedir );
-               $cmd = wfEscapeShellArg( $wgGitBin ) . " show -s --format=format:%ct HEAD";
-               $retc = false;
-               $commitDate = wfShellExec( $cmd, $retc, $environment );
-
-               if ( $retc !== 0 ) {
-                       return false;
-               } else {
-                       return (int)$commitDate;
+               if ( !isset( $this->cache['headCommitDate'] ) ) {
+                       $date = false;
+                       if ( is_file( $wgGitBin ) &&
+                               is_executable( $wgGitBin ) &&
+                               $this->getHead() !== false
+                       ) {
+                               $environment = array( "GIT_DIR" => $this->basedir );
+                               $cmd = wfEscapeShellArg( $wgGitBin ) .
+                                       " show -s --format=format:%ct HEAD";
+                               $retc = false;
+                               $commitDate = wfShellExec( $cmd, $retc, $environment );
+                               if ( $retc === 0 ) {
+                                       $date = (int)$commitDate;
+                               }
+                       }
+                       $this->cache['headCommitDate'] = $date;
                }
+               return $this->cache['headCommitDate'];
        }
 
        /**
-        * Return the name of the current branch, or HEAD if not found
-        * @return string The branch name, HEAD, or false
+        * Get the name of the current branch, or HEAD if not found
+        *
+        * @return string|bool The branch name, HEAD, or false
         */
        public function getCurrentBranch() {
-               $head = $this->getHead();
-               if ( $head && preg_match( "#^refs/heads/(.*)$#", $head, $m ) ) {
-                       return $m[1];
-               } else {
-                       return $head;
+               if ( !isset( $this->cache['branch'] ) ) {
+                       $branch = $this->getHead();
+                       if ( $branch &&
+                               preg_match( "#^refs/heads/(.*)$#", $branch, $m )
+                       ) {
+                               $branch = $m[1];
+                       }
+                       $this->cache['branch'] = $branch;
                }
+               return $this->cache['branch'];
        }
 
        /**
         * Get an URL to a web viewer link to the HEAD revision.
         *
-        * @return string|bool string if a URL is available or false otherwise.
+        * @return string|bool String if a URL is available or false otherwise
         */
        public function getHeadViewUrl() {
-               $config = "{$this->basedir}/config";
-               if ( !is_readable( $config ) ) {
-                       return false;
-               }
-
-               wfSuppressWarnings();
-               $configArray = parse_ini_file( $config, true );
-               wfRestoreWarnings();
-               $remote = false;
-
-               // Use the "origin" remote repo if available or any other repo if not.
-               if ( isset( $configArray['remote origin'] ) ) {
-                       $remote = $configArray['remote origin'];
-               } elseif ( is_array( $configArray ) ) {
-                       foreach ( $configArray as $sectionName => $sectionConf ) {
-                               if ( substr( $sectionName, 0, 6 ) == 'remote' ) {
-                                       $remote = $sectionConf;
-                               }
-                       }
-               }
-
-               if ( $remote === false || !isset( $remote['url'] ) ) {
+               $url = $this->getRemoteUrl();
+               if ( $url === false ) {
                        return false;
                }
-
-               $url = $remote['url'];
                if ( substr( $url, -4 ) !== '.git' ) {
                        $url .= '.git';
                }
@@ -209,6 +260,91 @@ class GitInfo {
                return false;
        }
 
+       /**
+        * Get the URL of the remote origin.
+        * @return string|bool string if a URL is available or false otherwise.
+        */
+       protected function getRemoteUrl() {
+               if ( !isset( $this->cache['remoteURL'] ) ) {
+                       $config = "{$this->basedir}/config";
+                       $url = false;
+                       if ( is_readable( $config ) ) {
+                               wfSuppressWarnings();
+                               $configArray = parse_ini_file( $config, true );
+                               wfRestoreWarnings();
+                               $remote = false;
+
+                               // Use the "origin" remote repo if available or any other repo if not.
+                               if ( isset( $configArray['remote origin'] ) ) {
+                                       $remote = $configArray['remote origin'];
+                               } elseif ( is_array( $configArray ) ) {
+                                       foreach ( $configArray as $sectionName => $sectionConf ) {
+                                               if ( substr( $sectionName, 0, 6 ) == 'remote' ) {
+                                                       $remote = $sectionConf;
+                                               }
+                                       }
+                               }
+
+                               if ( $remote !== false && isset( $remote['url'] ) ) {
+                                       $url = $remote['url'];
+                               }
+                       }
+                       $this->cache['remoteURL'] = $url;
+               }
+               return $this->cache['remoteURL'];
+       }
+
+       /**
+        * Check to see if the current cache is fully populated.
+        *
+        * Note: This method is public only to make unit testing easier. There's
+        * really no strong reason that anything other than a test should want to
+        * call this method.
+        *
+        * @return bool True if all expected cache keys exist, false otherwise
+        */
+       public function cacheIsComplete() {
+               return isset( $this->cache['head'] ) &&
+                       isset( $this->cache['headSHA1'] ) &&
+                       isset( $this->cache['headCommitDate'] ) &&
+                       isset( $this->cache['branch'] ) &&
+                       isset( $this->cache['remoteURL'] );
+       }
+
+       /**
+        * Precompute and cache git information.
+        *
+        * Creates a JSON file in the cache directory associated with this
+        * GitInfo instance. This cache file will be used by subsequent GitInfo objects referencing
+        * the same directory to avoid needing to examine the .git directory again.
+        *
+        * @since 1.24
+        */
+       public function precomputeValues() {
+               if ( $this->cacheFile !== null ) {
+                       // Try to completely populate the cache
+                       $this->getHead();
+                       $this->getHeadSHA1();
+                       $this->getHeadCommitDate();
+                       $this->getCurrentBranch();
+                       $this->getRemoteUrl();
+
+                       if ( !$this->cacheIsComplete() ) {
+                               wfDebugLog( "Failed to compute GitInfo for \"{$this->basedir}\"" );
+                               return;
+                       }
+
+                       $cacheDir = dirname( $this->cacheFile );
+                       if ( !file_exists( $cacheDir ) &&
+                               !wfMkdirParents( $cacheDir, null, __METHOD__ )
+                       ) {
+                               throw new MWException( "Unable to create GitInfo cache \"{$cacheDir}\"" );
+                       }
+
+                       file_put_contents( $this->cacheFile, FormatJson::encode( $this->cache ) );
+               }
+       }
+
        /**
         * @see self::getHeadSHA1
         * @return string
index b132826..9cbb9d6 100644 (file)
@@ -108,8 +108,8 @@ if ( !function_exists( 'gzdecode' ) ) {
 
 /**
  * Like array_diff( $a, $b ) except that it works with two-dimensional arrays.
- * @param $a array
- * @param $b array
+ * @param array $a
+ * @param array $b
  * @return array
  */
 function wfArrayDiff2( $a, $b ) {
@@ -117,8 +117,8 @@ function wfArrayDiff2( $a, $b ) {
 }
 
 /**
- * @param $a array|string
- * @param $b array|string
+ * @param array|string $a
+ * @param array|string $b
  * @return int
  */
 function wfArrayDiff2_cmp( $a, $b ) {
@@ -145,8 +145,8 @@ function wfArrayDiff2_cmp( $a, $b ) {
  * values in array $a with the corresponding keys
  *
  * @deprecated since 1.22; use array_intersect_key()
- * @param $a Array
- * @param $b Array
+ * @param array $a
+ * @param array $b
  * @return array
  */
 function wfArrayLookup( $a, $b ) {
@@ -157,10 +157,10 @@ function wfArrayLookup( $a, $b ) {
 /**
  * Appends to second array if $value differs from that in $default
  *
- * @param $key String|Int
- * @param $value Mixed
- * @param $default Mixed
- * @param array $changed to alter
+ * @param string|int $key
+ * @param mixed $value
+ * @param mixed $default
+ * @param array $changed Array to alter
  * @throws MWException
  */
 function wfAppendToArrayIfNotDefault( $key, $value, $default, &$changed ) {
@@ -231,8 +231,8 @@ function wfMergeErrorArrays( /*...*/ ) {
  *
  * @param array $array The array.
  * @param array $insert The array to insert.
- * @param $after Mixed: The key to insert after
- * @return Array
+ * @param mixed $after The key to insert after
+ * @return array
  */
 function wfArrayInsertAfter( array $array, array $insert, $after ) {
        // Find the offset of the element to insert after.
@@ -253,9 +253,9 @@ function wfArrayInsertAfter( array $array, array $insert, $after ) {
 /**
  * Recursively converts the parameter (an object) to an array with the same data
  *
- * @param $objOrArray Object|Array
- * @param $recursive Bool
- * @return Array
+ * @param object|array $objOrArray
+ * @param bool $recursive
+ * @return array
  */
 function wfObjectToArray( $objOrArray, $recursive = true ) {
        $array = array();
@@ -296,7 +296,7 @@ function wfRandom() {
  *       of token please use MWCryptRand instead.
  *
  * @param int $length The length of the string to generate
- * @return String
+ * @return string
  * @since 1.20
  */
 function wfRandomString( $length = 32 ) {
@@ -326,7 +326,7 @@ function wfRandomString( $length = 32 ) {
  *
  * %2F in the page titles seems to fatally break for some reason.
  *
- * @param $s String:
+ * @param string $s
  * @return string
  */
 function wfUrlencode( $s ) {
@@ -363,8 +363,8 @@ function wfUrlencode( $s ) {
  *
  * @param array $array1 ( String|Array )
  * @param array $array2 ( String|Array )
- * @param $prefix String
- * @return String
+ * @param string $prefix
+ * @return string
  */
 function wfArrayToCgi( $array1, $array2 = null, $prefix = '' ) {
        if ( !is_null( $array2 ) ) {
@@ -408,7 +408,7 @@ function wfArrayToCgi( $array1, $array2 = null, $prefix = '' ) {
  * with legacy functions that accept raw query strings instead of nice
  * arrays.  Of course, keys and values are urldecode()d.
  *
- * @param string $query query string
+ * @param string $query Query string
  * @return string[] Array version of input
  */
 function wfCgiToArray( $query ) {
@@ -490,14 +490,15 @@ function wfAppendQuery( $url, $query ) {
  * @todo this won't work with current-path-relative URLs
  * like "subdir/foo.html", etc.
  *
- * @param string $url either fully-qualified or a local path + query
- * @param $defaultProto Mixed: one of the PROTO_* constants. Determines the
+ * @param string $url Either fully-qualified or a local path + query
+ * @param string $defaultProto One of the PROTO_* constants. Determines the
  *    protocol to use if $url or $wgServer is protocol-relative
  * @return string Fully-qualified URL, current-path-relative URL or false if
  *    no valid URL can be constructed
  */
 function wfExpandUrl( $url, $defaultProto = PROTO_CURRENT ) {
-       global $wgServer, $wgCanonicalServer, $wgInternalServer, $wgRequest;
+       global $wgServer, $wgCanonicalServer, $wgInternalServer, $wgRequest,
+               $wgHttpsPort;
        if ( $defaultProto === PROTO_CANONICAL ) {
                $serverUrl = $wgCanonicalServer;
        } elseif ( $defaultProto === PROTO_INTERNAL && $wgInternalServer !== false ) {
@@ -536,6 +537,13 @@ function wfExpandUrl( $url, $defaultProto = PROTO_CURRENT ) {
        }
 
        $bits = wfParseUrl( $url );
+
+       // ensure proper port for HTTPS arrives in URL
+       // https://bugzilla.wikimedia.org/show_bug.cgi?id=65184
+       if ( $defaultProto === PROTO_HTTPS && $wgHttpsPort != 443 ) {
+               $bits['port'] = $wgHttpsPort;
+       }
+
        if ( $bits && isset( $bits['path'] ) ) {
                $bits['path'] = wfRemoveDotSegments( $bits['path'] );
                return wfAssembleUrl( $bits );
@@ -692,7 +700,7 @@ function wfRemoveDotSegments( $urlPath ) {
  *
  * @param bool $includeProtocolRelative If false, remove '//' from the returned protocol list.
  *        DO NOT USE this directly, use wfUrlProtocolsWithoutProtRel() instead
- * @return String
+ * @return string
  */
 function wfUrlProtocols( $includeProtocolRelative = true ) {
        global $wgUrlProtocols;
@@ -737,7 +745,7 @@ function wfUrlProtocols( $includeProtocolRelative = true ) {
  * Like wfUrlProtocols(), but excludes '//' from the protocol list. Use this if
  * you need a regex that matches all URL protocols but does not match protocol-
  * relative URLs
- * @return String
+ * @return string
  */
 function wfUrlProtocolsWithoutProtRel() {
        return wfUrlProtocols( false );
@@ -751,7 +759,7 @@ function wfUrlProtocolsWithoutProtRel() {
  *    protocol-relative URLs) correctly.
  * 3) Adds a "delimiter" element to the array, either '://', ':' or '//' (see (2)).
  *
- * @param string $url a URL to parse
+ * @param string $url A URL to parse
  * @return string[] Bits of the URL in an associative array, per PHP docs
  */
 function wfParseUrl( $url ) {
@@ -821,7 +829,7 @@ function wfParseUrl( $url ) {
  *
  * @todo handle punycode domains too
  *
- * @param $url string
+ * @param string $url
  * @return string
  */
 function wfExpandIRI( $url ) {
@@ -844,7 +852,7 @@ function wfExpandIRI_callback( $matches ) {
 /**
  * Make URL indexes, appropriate for the el_index field of externallinks.
  *
- * @param $url String
+ * @param string $url
  * @return array
  */
 function wfMakeUrlIndexes( $url ) {
@@ -924,7 +932,7 @@ function wfMatchesDomainList( $url, $domains ) {
  * $wgDebugRawPage - if false, 'action=raw' hits will not result in debug output.
  * $wgDebugComments - if on, some debug items may appear in comments in the HTML output.
  *
- * @param $text String
+ * @param string $text
  * @param string|bool $dest Destination of the message:
  *     - 'all': both to the log and HTML (debug toolbar or HTML comments)
  *     - 'log': only to the log and not in HTML
@@ -1007,14 +1015,14 @@ function wfDebugTimer() {
 /**
  * Send a line giving PHP memory usage.
  *
- * @param bool $exact print exact values instead of kilobytes (default: false)
+ * @param bool $exact Print exact byte values instead of kibibytes (default: false)
  */
 function wfDebugMem( $exact = false ) {
        $mem = memory_get_usage();
        if ( !$exact ) {
-               $mem = floor( $mem / 1024 ) . ' kilobytes';
+               $mem = floor( $mem / 1024 ) . ' KiB';
        } else {
-               $mem .= ' bytes';
+               $mem .= ' B';
        }
        wfDebug( "Memory usage: $mem\n" );
 }
@@ -1084,7 +1092,7 @@ function wfDebugLog( $logGroup, $text, $dest = 'all' ) {
 /**
  * Log for database errors
  *
- * @param string $text database error message.
+ * @param string $text Database error message.
  */
 function wfLogDBError( $text ) {
        global $wgDBerrorLog, $wgDBerrorLogTZ;
@@ -1116,11 +1124,11 @@ function wfLogDBError( $text ) {
 /**
  * Throws a warning that $function is deprecated
  *
- * @param $function String
+ * @param string $function
  * @param string|bool $version Version of MediaWiki that the function
  *    was deprecated in (Added in 1.19).
  * @param string|bool $component Added in 1.19.
- * @param $callerOffset integer: How far up the call stack is the original
+ * @param int $callerOffset How far up the call stack is the original
  *    caller. 2 = function that called the function that called
  *    wfDeprecated (Added in 1.20)
  *
@@ -1135,9 +1143,9 @@ function wfDeprecated( $function, $version = false, $component = false, $callerO
  * $wgDevelopmentWarnings. To log warnings in production, use wfLogWarning() instead.
  *
  * @param string $msg message to send
- * @param $callerOffset Integer: number of items to go back in the backtrace to
+ * @param int $callerOffset Number of items to go back in the backtrace to
  *        find the correct caller (1 = function calling wfWarn, ...)
- * @param $level Integer: PHP error level; defaults to E_USER_NOTICE;
+ * @param int $level PHP error level; defaults to E_USER_NOTICE;
  *        only used when $wgDevelopmentWarnings is true
  */
 function wfWarn( $msg, $callerOffset = 1, $level = E_USER_NOTICE ) {
@@ -1148,10 +1156,10 @@ function wfWarn( $msg, $callerOffset = 1, $level = E_USER_NOTICE ) {
  * Send a warning as a PHP error and the debug log. This is intended for logging
  * warnings in production. For logging development warnings, use WfWarn instead.
  *
- * @param $msg String: message to send
- * @param $callerOffset Integer: number of items to go back in the backtrace to
+ * @param string $msg Message to send
+ * @param int $callerOffset Number of items to go back in the backtrace to
  *        find the correct caller (1 = function calling wfLogWarning, ...)
- * @param $level Integer: PHP error level; defaults to E_USER_WARNING
+ * @param int $level PHP error level; defaults to E_USER_WARNING
  */
 function wfLogWarning( $msg, $callerOffset = 1, $level = E_USER_WARNING ) {
        MWDebug::warning( $msg, $callerOffset + 1, $level, 'production' );
@@ -1163,8 +1171,8 @@ function wfLogWarning( $msg, $callerOffset = 1, $level = E_USER_WARNING ) {
  * Can also log to TCP or UDP with the syntax udp://host:port/prefix. This will
  * send lines to the specified port, prefixed by the specified prefix and a space.
  *
- * @param $text String
- * @param string $file filename
+ * @param string $text
+ * @param string $file Filename
  * @throws MWException
  */
 function wfErrorLog( $text, $file ) {
@@ -1299,8 +1307,8 @@ function wfLogProfilingData() {
 /**
  * Increment a statistics counter
  *
- * @param $key String
- * @param $count Int
+ * @param string $key
+ * @param int $count
  * @return void
  */
 function wfIncrStats( $key, $count = 1 ) {
@@ -1319,7 +1327,7 @@ function wfReadOnly() {
 /**
  * Get the value of $wgReadOnly or the contents of $wgReadOnlyFile.
  *
- * @return string|bool: String when in read-only mode; false otherwise
+ * @return string|bool String when in read-only mode; false otherwise
  */
 function wfReadOnlyReason() {
        global $wgReadOnly, $wgReadOnlyFile;
@@ -1339,7 +1347,7 @@ function wfReadOnlyReason() {
 /**
  * Return a Language object from $langcode
  *
- * @param $langcode Mixed: either:
+ * @param Language|string|bool $langcode Either:
  *                  - a Language object
  *                  - code of the language to get the message for, if it is
  *                    a valid code create a language for that language, if
@@ -1349,7 +1357,7 @@ function wfReadOnlyReason() {
  *                    the current user's language (as a fallback for the old parameter
  *                    functionality), or if it is true then use global object
  *                    for the wiki's content language.
- * @return Language object
+ * @return Language
  */
 function wfGetLangObj( $langcode = false ) {
        # Identify which language to get or create a language object for.
@@ -1443,7 +1451,7 @@ function wfMessageFallback( /*...*/ ) {
  * - As an array in the second parameter
  * These are not shown in the function definition.
  *
- * @return String
+ * @return string
  */
 function wfMsg( $key ) {
        wfDeprecated( __METHOD__, '1.21' );
@@ -1458,8 +1466,8 @@ function wfMsg( $key ) {
  *
  * @deprecated since 1.18
  *
- * @param $key String
- * @return String
+ * @param string $key
+ * @return string
  */
 function wfMsgNoTrans( $key ) {
        wfDeprecated( __METHOD__, '1.21' );
@@ -1490,9 +1498,9 @@ function wfMsgNoTrans( $key ) {
  *
  * @deprecated since 1.18
  *
- * @param string $key lookup key for the message, usually
+ * @param string $key Lookup key for the message, usually
  *     defined in languages/Language.php
- * @return String
+ * @return string
  */
 function wfMsgForContent( $key ) {
        wfDeprecated( __METHOD__, '1.21' );
@@ -1514,8 +1522,8 @@ function wfMsgForContent( $key ) {
  *
  * @deprecated since 1.18
  *
- * @param $key String
- * @return String
+ * @param string $key
+ * @return string
  */
 function wfMsgForContentNoTrans( $key ) {
        wfDeprecated( __METHOD__, '1.21' );
@@ -1537,7 +1545,7 @@ function wfMsgForContentNoTrans( $key ) {
  *
  * @deprecated since 1.18
  *
- * @param string $key key to get.
+ * @param string $key Key to get.
  * @param array $args
  * @param bool $useDB
  * @param string|bool $forContent Language code, or false for user lang, true for content lang.
@@ -1562,7 +1570,7 @@ function wfMsgReal( $key, $args, $useDB = true, $forContent = false, $transform
  * @param string $key
  * @param bool $useDB
  * @param string|bool $langCode Code of the language to get the message for, or
- *                  behaves as a content language switch if it is a boolean.
+ *   behaves as a content language switch if it is a boolean.
  * @param bool $transform Whether to parse magic words, etc.
  * @return string
  */
@@ -1659,8 +1667,8 @@ function wfMsgWikiHtml( $key ) {
  *
  * @deprecated since 1.18
  *
- * @param string $key key of the message
- * @param array $options processing rules.
+ * @param string $key Key of the message
+ * @param array $options Processing rules.
  *   Can take the following options:
  *     parse: parses wikitext to HTML
  *     parseinline: parses wikitext to HTML and removes the surrounding
@@ -1675,7 +1683,7 @@ function wfMsgWikiHtml( $key ) {
  *       (overridden by content).
  * Behavior for conflicting options (e.g., parse+parseinline) is undefined.
  *
- * @return String
+ * @return string
  */
 function wfMsgExt( $key, $options ) {
        wfDeprecated( __METHOD__, '1.21' );
@@ -1726,10 +1734,7 @@ function wfMsgExt( $key, $options ) {
                }
 
                if ( $parseInline ) {
-                       $m = array();
-                       if ( preg_match( '/^<p>(.*)\n?<\/p>\n?$/sU', $string, $m ) ) {
-                               $string = $m[1];
-                       }
+                       $string = Parser::stripOuterParagraph( $string );
                }
        } elseif ( in_array( 'parsemag', $options, true ) ) {
                $string = $messageCache->transform( $string,
@@ -1770,7 +1775,7 @@ function wfEmptyMsg( $key ) {
  * but now throws an exception instead, with similar results.
  *
  * @deprecated since 1.22; just throw an MWException yourself
- * @param string $msg message shown when dying.
+ * @param string $msg Message shown when dying.
  * @throws MWException
  */
 function wfDebugDieBacktrace( $msg = '' ) {
@@ -1849,7 +1854,7 @@ function wfReportTime() {
  *
  * @param int $limit This parameter can be used to limit the number of stack frames returned
  *
- * @return array of backtrace information
+ * @return array Array of backtrace information
  */
 function wfDebugBacktrace( $limit = 0 ) {
        static $disabled = null;
@@ -1937,7 +1942,7 @@ function wfBacktrace() {
  * wfGetCaller( 2 ) [default] is the caller of the function running wfGetCaller()
  * wfGetCaller( 3 ) is the parent of that.
  *
- * @param $level Int
+ * @param int $level
  * @return string
  */
 function wfGetCaller( $level = 2 ) {
@@ -1953,9 +1958,8 @@ function wfGetCaller( $level = 2 ) {
  * Return a string consisting of callers in the stack. Useful sometimes
  * for profiling specific points.
  *
- * @param int $limit The maximum depth of the stack frame to return, or false for
- *               the entire stack.
- * @return String
+ * @param int $limit The maximum depth of the stack frame to return, or false for the entire stack.
+ * @return string
  */
 function wfGetAllCallers( $limit = 3 ) {
        $trace = array_reverse( wfDebugBacktrace() );
@@ -1969,7 +1973,7 @@ function wfGetAllCallers( $limit = 3 ) {
 /**
  * Return a string representation of frame
  *
- * @param $frame Array
+ * @param array $frame
  * @return string
  */
 function wfFormatStackFrame( $frame ) {
@@ -1997,8 +2001,8 @@ function wfShowingResults( $offset, $limit ) {
  * @param string $offset
  * @param int $limit
  * @param string $link
- * @param string $query optional URL query parameter string
- * @param bool $atend optional param for specified if this is the last page
+ * @param string $query Optional URL query parameter string
+ * @param bool $atend Optional param for specified if this is the last page
  * @return string
  * @deprecated since 1.19; use Language::viewPrevNext() instead
  */
@@ -2057,10 +2061,9 @@ function wfClientAcceptsGzip( $force = false ) {
  * Obtain the offset and limit values from the request string;
  * used in special pages
  *
- * @param int $deflimit default limit if none supplied
+ * @param int $deflimit Default limit if none supplied
  * @param string $optionname Name of a user preference to check against
  * @return array
- *
  */
 function wfCheckLimits( $deflimit = 50, $optionname = 'rclimit' ) {
        global $wgRequest;
@@ -2073,8 +2076,8 @@ function wfCheckLimits( $deflimit = 50, $optionname = 'rclimit' ) {
  * is achieved by substituting certain characters with HTML entities.
  * As required by the callers, "<nowiki>" is not used.
  *
- * @param string $text text to be escaped
- * @return String
+ * @param string $text Text to be escaped
+ * @return string
  */
 function wfEscapeWikiText( $text ) {
        static $repl = null, $repl2 = null;
@@ -2121,7 +2124,7 @@ function wfEscapeWikiText( $text ) {
 /**
  * Get the current unix timestamp with microseconds.  Useful for profiling
  * @deprecated since 1.22; call microtime() directly
- * @return Float
+ * @return float
  */
 function wfTime() {
        wfDeprecated( __FUNCTION__, '1.22' );
@@ -2133,10 +2136,10 @@ function wfTime() {
  * If source is NULL, it just returns the value, it doesn't set the variable
  * If force is true, it will set the value even if source is NULL
  *
- * @param $dest Mixed
- * @param $source Mixed
- * @param $force Bool
- * @return Mixed
+ * @param mixed $dest
+ * @param mixed $source
+ * @param bool $force
+ * @return mixed
  */
 function wfSetVar( &$dest, $source, $force = false ) {
        $temp = $dest;
@@ -2149,9 +2152,9 @@ function wfSetVar( &$dest, $source, $force = false ) {
 /**
  * As for wfSetVar except setting a bit
  *
- * @param $dest Int
- * @param $bit Int
- * @param $state Bool
+ * @param int $dest
+ * @param int $bit
+ * @param bool $state
  *
  * @return bool
  */
@@ -2171,7 +2174,7 @@ function wfSetBit( &$dest, $bit, $state = true ) {
  * A wrapper around the PHP function var_export().
  * Either print it or add it to the regular output ($wgOut).
  *
- * @param $var mixed A PHP variable to dump.
+ * @param mixed $var A PHP variable to dump.
  */
 function wfVarDump( $var ) {
        global $wgOut;
@@ -2186,9 +2189,9 @@ function wfVarDump( $var ) {
 /**
  * Provide a simple HTTP error.
  *
- * @param $code Int|String
- * @param $label String
- * @param $desc String
+ * @param int|string $code
+ * @param string $label
+ * @param string $desc
  */
 function wfHttpError( $code, $label, $desc ) {
        global $wgOut;
@@ -2223,7 +2226,7 @@ function wfHttpError( $code, $label, $desc ) {
  * Note that some PHP configuration options may add output buffer
  * layers which cannot be removed; these are left in place.
  *
- * @param $resetGzipEncoding Bool
+ * @param bool $resetGzipEncoding
  */
 function wfResetOutputBuffers( $resetGzipEncoding = true ) {
        if ( $resetGzipEncoding ) {
@@ -2338,8 +2341,8 @@ function mimeTypeMatch( $type, $avail ) {
  * array of type to preference (preference is a float between 0.0 and 1.0).
  * Wildcards in the types are acceptable.
  *
- * @param array $cprefs client's acceptable type list
- * @param array $sprefs server's offered types
+ * @param array $cprefs Client's acceptable type list
+ * @param array $sprefs Server's offered types
  * @return string
  *
  * @todo FIXME: Doesn't handle params like 'text/plain; charset=UTF-8'
@@ -2384,7 +2387,7 @@ function wfNegotiateType( $cprefs, $sprefs ) {
 /**
  * Reference-counted warning suppression
  *
- * @param $end Bool
+ * @param bool $end
  */
 function wfSuppressWarnings( $end = false ) {
        static $suppressCount = 0;
@@ -2476,11 +2479,10 @@ define( 'TS_ISO_8601_BASIC', 9 );
 /**
  * Get a timestamp string in one of various formats
  *
- * @param $outputtype Mixed: A timestamp in one of the supported formats, the
- *                    function will autodetect which format is supplied and act
- *                    accordingly.
- * @param $ts Mixed: optional timestamp to convert, default 0 for the current time
- * @return Mixed: String / false The same date in the format specified in $outputtype or false
+ * @param mixed $outputtype A timestamp in one of the supported formats, the
+ *   function will autodetect which format is supplied and act accordingly.
+ * @param mixed $ts Optional timestamp to convert, default 0 for the current time
+ * @return string|bool String / false The same date in the format specified in $outputtype or false
  */
 function wfTimestamp( $outputtype = TS_UNIX, $ts = 0 ) {
        try {
@@ -2583,9 +2585,9 @@ function wfTempDir() {
 /**
  * Make directory, and make all parent directories if they don't exist
  *
- * @param string $dir full path to directory to create
+ * @param string $dir Full path to directory to create
  * @param int $mode Chmod value to use, default is $wgDirectoryMode
- * @param string $caller optional caller param for debugging.
+ * @param string $caller Optional caller param for debugging.
  * @throws MWException
  * @return bool
  */
@@ -2630,6 +2632,7 @@ function wfMkdirParents( $dir, $mode = null, $caller = null ) {
 /**
  * Remove a directory and all its content.
  * Does not hide error.
+ * @param string $dir
  */
 function wfRecursiveRemoveDir( $dir ) {
        wfDebug( __FUNCTION__ . "( $dir )\n" );
@@ -2651,7 +2654,7 @@ function wfRecursiveRemoveDir( $dir ) {
 }
 
 /**
- * @param number $nr The number to format
+ * @param int $nr The number to format
  * @param int $acc The number of digits after the decimal point, default 2
  * @param bool $round Whether or not to round the value, default true
  * @return string
@@ -2790,18 +2793,18 @@ function wfShellExecDisabled() {
  * configuration if supported.
  *
  * @param string $cmd Command line, properly escaped for shell.
- * @param &$retval null|Mixed optional, will receive the program's exit code.
- *                 (non-zero is usually failure). If there is an error from
- *                 read, select, or proc_open(), this will be set to -1.
- * @param array $environ optional environment variables which should be
- *                 added to the executed command environment.
- * @param array $limits optional array with limits(filesize, memory, time, walltime)
- *                 this overwrites the global wgMaxShell* limits.
+ * @param null|mixed &$retval Optional, will receive the program's exit code.
+ *   (non-zero is usually failure). If there is an error from
+ *   read, select, or proc_open(), this will be set to -1.
+ * @param array $environ Optional environment variables which should be
+ *   added to the executed command environment.
+ * @param array $limits Optional array with limits(filesize, memory, time, walltime)
+ *   this overwrites the global wgMaxShell* limits.
  * @param array $options Array of options:
- *    - duplicateStderr: Set this to true to duplicate stderr to stdout,
- *      including errors from limit.sh
+ *   - duplicateStderr: Set this to true to duplicate stderr to stdout,
+ *     including errors from limit.sh
  *
- * @return string collected stdout as a string
+ * @return string Collected stdout as a string
  */
 function wfShellExec( $cmd, &$retval = null, $environ = array(),
        $limits = array(), $options = array()
@@ -2924,8 +2927,10 @@ function wfShellExec( $cmd, &$retval = null, $environ = array(),
                $readyPipes = $pipes;
 
                // Clear last error
+               // @codingStandardsIgnoreStart Generic.PHP.NoSilencedErrors.Discouraged
                @trigger_error( '' );
                if ( @stream_select( $readyPipes, $emptyArray, $emptyArray, null ) === false ) {
+                       // @codingStandardsIgnoreEnd
                        $error = error_get_last();
                        if ( strncmp( $error['message'], $eintrMessage, strlen( $eintrMessage ) ) == 0 ) {
                                continue;
@@ -3011,13 +3016,13 @@ function wfShellExec( $cmd, &$retval = null, $environ = array(),
  *
  * @note This also includes errors from limit.sh, e.g. if $wgMaxShellFileSize is exceeded.
  * @param string $cmd Command line, properly escaped for shell.
- * @param &$retval null|Mixed optional, will receive the program's exit code.
- *                 (non-zero is usually failure)
+ * @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
- *                 added to the executed command environment.
- * @param array $limits optional array with limits(filesize, memory, time, walltime)
- *                 this overwrites the global wgShellMax* limits.
- * @return string collected stdout and stderr as a string
+ *   added to the executed command environment.
+ * @param array $limits Optional array with limits(filesize, memory, time, walltime)
+ *   this overwrites the global wgShellMax* limits.
+ * @return string Collected stdout and stderr as a string
  */
 function wfShellExecWithStderr( $cmd, &$retval = null, $environ = array(), $limits = array() ) {
        return wfShellExec( $cmd, $retval, $environ, $limits, array( 'duplicateStderr' => true ) );
@@ -3158,9 +3163,9 @@ function wfMerge( $old, $mine, $yours, &$result ) {
  * Returns unified plain-text diff of two texts.
  * Useful for machine processing of diffs.
  *
- * @param string $before the text before the changes.
- * @param string $after the text after the changes.
- * @param string $params command-line options for the diff command.
+ * @param string $before The text before the changes.
+ * @param string $after The text after the changes.
+ * @param string $params Command-line options for the diff command.
  * @return string Unified diff of $before and $after
  */
 function wfDiff( $before, $after, $params = '-u' ) {
@@ -3238,8 +3243,7 @@ function wfDiff( $before, $after, $params = '-u' ) {
  *
  * @see perldoc -f use
  *
- * @param string|number $req_ver The version to check, can be a string, an integer, or
- *                 a float
+ * @param string|int|float $req_ver The version to check, can be a string, an integer, or a float
  * @throws MWException
  */
 function wfUsePHP( $req_ver ) {
@@ -3268,8 +3272,7 @@ function wfUsePHP( $req_ver ) {
  *
  * @see perldoc -f use
  *
- * @param string|number $req_ver The version to check, can be a string, an integer, or
- *                 a float
+ * @param string|int|float $req_ver The version to check, can be a string, an integer, or a float
  * @throws MWException
  */
 function wfUseMW( $req_ver ) {
@@ -3289,7 +3292,7 @@ function wfUseMW( $req_ver ) {
  * We'll consider it so always, as we don't want '\s' in our Unix paths either.
  *
  * @param string $path
- * @param string $suffix to remove if present
+ * @param string $suffix String to remove if present
  * @return string
  */
 function wfBaseName( $path, $suffix = '' ) {
@@ -3312,7 +3315,7 @@ function wfBaseName( $path, $suffix = '' ) {
  * May explode on non-matching case-insensitive paths,
  * funky symlinks, etc.
  *
- * @param string $path absolute destination path including target filename
+ * @param string $path Absolute destination path including target filename
  * @param string $from Absolute source path, directory only
  * @return string
  */
@@ -3411,9 +3414,11 @@ function wfBaseConvert( $input, $sourceBase, $destBase, $pad = 1,
                        $decimal = bcadd( $decimal, $baseChars[$char] );
                }
 
+               // @codingStandardsIgnoreStart Generic.CodeAnalysis.ForLoopWithTestFunctionCall.NotAllowed
                for ( $result = ''; bccomp( $decimal, 0 ); $decimal = bcdiv( $decimal, $destBase, 0 ) ) {
                        $result .= $baseChars[bcmod( $decimal, $destBase )];
                }
+               // @codingStandardsIgnoreEnd
 
                $result = strrev( $result );
        } else {
@@ -3690,7 +3695,7 @@ function &wfGetLBFactory() {
  *
  *     bypassCache:    If true, do not use the process-local cache of File objects
  *
- * @return File, or false if the file does not exist
+ * @return File|bool File, or false if the file does not exist
  */
 function wfFindFile( $title, $options = array() ) {
        return RepoGroup::singleton()->findFile( $title, $options );
@@ -3726,7 +3731,7 @@ function wfQueriesMustScale() {
  * extensions; this is a wrapper around $wgScriptExtension etc.
  * except for 'index' and 'load' which use $wgScript/$wgLoadScript
  *
- * @param string $script script filename, sans extension
+ * @param string $script Script filename, sans extension
  * @return string
  */
 function wfScript( $script = 'index' ) {
@@ -3944,7 +3949,7 @@ function wfBCP47( $code ) {
 /**
  * Get a cache object.
  *
- * @param $inputType integer Cache type, one the the CACHE_* constants.
+ * @param int $inputType Cache type, one the the CACHE_* constants.
  * @return BagOStuff
  */
 function wfGetCache( $inputType ) {
@@ -3994,9 +3999,9 @@ function wfGetLangConverterCacheStorage() {
 /**
  * Call hook functions defined in $wgHooks
  *
- * @param string $event event name
- * @param array $args parameters passed to hook functions
- * @param string|null $deprecatedVersion optionally mark hook as deprecated with version number
+ * @param string $event Event name
+ * @param array $args Parameters passed to hook functions
+ * @param string|null $deprecatedVersion Optionally mark hook as deprecated with version number
  *
  * @return bool True if no handler aborted the hook
  */
@@ -4049,9 +4054,9 @@ function wfUnpack( $format, $data, $length = false ) {
  *    * Any subsequent links on the same line are considered to be exceptions,
  *      i.e. articles where the image may occur inline.
  *
- * @param string $name the image name to check
+ * @param string $name The image name to check
  * @param Title|bool $contextTitle The page on which the image occurs, if known
- * @param string $blacklist wikitext of a file blacklist
+ * @param string $blacklist Wikitext of a file blacklist
  * @return bool
  */
 function wfIsBadImage( $name, $contextTitle = false, $blacklist = null ) {
@@ -4126,7 +4131,7 @@ function wfIsBadImage( $name, $contextTitle = false, $blacklist = null ) {
  * access the wiki via HTTPS.
  *
  * @param string $ip The IPv4/6 address in the normal human-readable form
- * @return boolean
+ * @return bool
  */
 function wfCanIPUseHTTPS( $ip ) {
        $canDo = true;
@@ -4151,39 +4156,23 @@ function wfGetIP() {
  * Checks if an IP is a trusted proxy provider.
  * Useful to tell if X-Forwarded-For data is possibly bogus.
  * Squid cache servers for the site are whitelisted.
+ * @deprecated Since 1.24, use IP::isTrustedProxy()
  *
  * @param string $ip
  * @return bool
  */
 function wfIsTrustedProxy( $ip ) {
-       $trusted = wfIsConfiguredProxy( $ip );
-       wfRunHooks( 'IsTrustedProxy', array( &$ip, &$trusted ) );
-       return $trusted;
+       return IP::isTrustedProxy( $ip );
 }
 
 /**
  * Checks if an IP matches a proxy we've configured.
+ * @deprecated Since 1.24, use IP::isConfiguredProxy()
  *
  * @param string $ip
  * @return bool
  * @since 1.23 Supports CIDR ranges in $wgSquidServersNoPurge
  */
 function wfIsConfiguredProxy( $ip ) {
-       global $wgSquidServers, $wgSquidServersNoPurge;
-
-       // quick check of known proxy servers
-       $trusted = in_array( $ip, $wgSquidServers )
-               || in_array( $ip, $wgSquidServersNoPurge );
-
-       if ( !$trusted ) {
-               // slightly slower check to see if the ip is listed directly or in a CIDR
-               // block in $wgSquidServersNoPurge
-               foreach ( $wgSquidServersNoPurge as $block ) {
-                       if ( strpos( $block, '/' ) !== false && IP::isInRange( $ip, $block ) ) {
-                               $trusted = true;
-                               break;
-                       }
-               }
-       }
-       return $trusted;
+       return IP::isTrustedProxy( $ip );
 }
index a3ed700..d0cae36 100644 (file)
  * two-part external storage URLs. Used for represent efficient concatenated
  * storage, and migration-related pointer objects.
  */
-interface HistoryBlob
-{
+interface HistoryBlob {
        /**
         * Adds an item of text, returns a stub object which points to the item.
         * You must call setLocation() on the stub object before storing it to the
         * database
         *
-        * @param $text string
+        * @param string $text
         *
-        * @return String: the key for getItem()
+        * @return string The key for getItem()
         */
        function addItem( $text );
 
        /**
         * Get item by key, or false if the key is not present
         *
-        * @param $key string
+        * @param string $key
         *
-        * @return String or false
+        * @return string|bool
         */
        function getItem( $key );
 
@@ -55,14 +54,14 @@ interface HistoryBlob
         *
         * Default text is not required for two-part external storage URLs.
         *
-        * @param $text string
+        * @param string $text
         */
        function setText( $text );
 
        /**
         * Get default text. This is called from Revision::getRevisionText()
         *
-        * @return String
+        * @return string
         */
        function getText();
 }
@@ -71,8 +70,7 @@ interface HistoryBlob
  * Concatenated gzip (CGZ) storage
  * Improves compression ratio by concatenating like objects before gzipping
  */
-class ConcatenatedGzipHistoryBlob implements HistoryBlob
-{
+class ConcatenatedGzipHistoryBlob implements HistoryBlob {
        public $mVersion = 0, $mCompressed = false, $mItems = array(), $mDefaultHash = '';
        public $mSize = 0;
        public $mMaxSize = 10000000;
@@ -83,12 +81,13 @@ class ConcatenatedGzipHistoryBlob implements HistoryBlob
         */
        public function __construct() {
                if ( !function_exists( 'gzdeflate' ) ) {
-                       throw new MWException( "Need zlib support to read or write this kind of history object (ConcatenatedGzipHistoryBlob)\n" );
+                       throw new MWException( "Need zlib support to read or write this "
+                               . "kind of history object (ConcatenatedGzipHistoryBlob)\n" );
                }
        }
 
        /**
-        * @param $text string
+        * @param string $text
         * @return string
         */
        public function addItem( $text ) {
@@ -102,7 +101,7 @@ class ConcatenatedGzipHistoryBlob implements HistoryBlob
        }
 
        /**
-        * @param $hash string
+        * @param string $hash
         * @return array|bool
         */
        public function getItem( $hash ) {
@@ -115,7 +114,7 @@ class ConcatenatedGzipHistoryBlob implements HistoryBlob
        }
 
        /**
-        * @param $text string
+        * @param string $text
         * @return void
         */
        public function setText( $text ) {
@@ -134,7 +133,7 @@ class ConcatenatedGzipHistoryBlob implements HistoryBlob
        /**
         * Remove an item
         *
-        * @param $hash string
+        * @param string $hash
         */
        public function removeItem( $hash ) {
                $this->mSize -= strlen( $this->mItems[$hash] );
@@ -190,18 +189,25 @@ class ConcatenatedGzipHistoryBlob implements HistoryBlob
  */
 class HistoryBlobStub {
        /**
-        * One-step cache variable to hold base blobs; operations that
-        * pull multiple revisions may often pull multiple times from
-        * the same blob. By keeping the last-used one open, we avoid
-        * redundant unserialization and decompression overhead.
+        * @var array One-step cache variable to hold base blobs; operations that
+        * pull multiple revisions may often pull multiple times from the same
+        * blob. By keeping the last-used one open, we avoid redundant
+        * unserialization and decompression overhead.
         */
        protected static $blobCache = array();
 
-       var $mOldId, $mHash, $mRef;
+       /** @var int */
+       public $mOldId;
+
+       /** @var string */
+       public $mHash;
+
+       /** @var  */
+       public $mRef;
 
        /**
-        * @param string $hash the content hash of the text
-        * @param $oldid Integer the old_id for the CGZ object
+        * @param string $hash The content hash of the text
+        * @param int $oldid The old_id for the CGZ object
         */
        function __construct( $hash = '', $oldid = 0 ) {
                $this->mHash = $hash;
@@ -210,6 +216,7 @@ class HistoryBlobStub {
        /**
         * Sets the location (old_id) of the main object to which this object
         * points
+        * @param int $id
         */
        function setLocation( $id ) {
                $this->mOldId = $id;
@@ -217,6 +224,7 @@ class HistoryBlobStub {
 
        /**
         * Sets the location (old_id) of the referring object
+        * @param string $id
         */
        function setReferrer( $id ) {
                $this->mRef = $id;
@@ -224,6 +232,7 @@ class HistoryBlobStub {
 
        /**
         * Gets the location of the referring object
+        * @return string
         */
        function getReferrer() {
                return $this->mRef;
@@ -237,10 +246,16 @@ class HistoryBlobStub {
                        $obj = self::$blobCache[$this->mOldId];
                } else {
                        $dbr = wfGetDB( DB_SLAVE );
-                       $row = $dbr->selectRow( 'text', array( 'old_flags', 'old_text' ), array( 'old_id' => $this->mOldId ) );
+                       $row = $dbr->selectRow(
+                               'text',
+                               array( 'old_flags', 'old_text' ),
+                               array( 'old_id' => $this->mOldId )
+                       );
+
                        if ( !$row ) {
                                return false;
                        }
+
                        $flags = explode( ',', $row->old_flags );
                        if ( in_array( 'external', $flags ) ) {
                                $url = $row->old_text;
@@ -251,6 +266,7 @@ class HistoryBlobStub {
                                $row->old_text = ExternalStore::fetchFromUrl( $url );
 
                        }
+
                        if ( !in_array( 'object', $flags ) ) {
                                return false;
                        }
@@ -273,6 +289,7 @@ class HistoryBlobStub {
                        $obj->uncompress();
                        self::$blobCache = array( $this->mOldId => $obj );
                }
+
                return $obj->getItem( $this->mHash );
        }
 
@@ -295,10 +312,11 @@ class HistoryBlobStub {
  * on conversion if $wgLegacySchemaConversion is set to true.
  */
 class HistoryBlobCurStub {
-       var $mCurId;
+       /** @var int */
+       public $mCurId;
 
        /**
-        * @param $curid Integer: the cur_id pointed to
+        * @param int $curid The cur_id pointed to
         */
        function __construct( $curid = 0 ) {
                $this->mCurId = $curid;
@@ -308,7 +326,7 @@ class HistoryBlobCurStub {
         * Sets the location (cur_id) of the main object to which this object
         * points
         *
-        * @param $id int
+        * @param int $id
         */
        function setLocation( $id ) {
                $this->mCurId = $id;
@@ -332,50 +350,43 @@ class HistoryBlobCurStub {
  * Requires xdiff 1.5+ and zlib
  */
 class DiffHistoryBlob implements HistoryBlob {
-       /** Uncompressed item cache */
-       var $mItems = array();
+       /** @var array Uncompressed item cache */
+       protected $mItems = array();
 
-       /** Total uncompressed size */
-       var $mSize = 0;
+       /** @var int Total uncompressed size */
+       protected $mSize = 0;
 
        /**
-        * Array of diffs. If a diff D from A to B is notated D = B - A, and Z is
-        * an empty string:
+        * @var array Array of diffs. If a diff D from A to B is notated D = B - A,
+        * and Z is an empty string:
         *
         *              { item[map[i]] - item[map[i-1]]   where i > 0
         *    diff[i] = {
         *              { item[map[i]] - Z                where i = 0
         */
-       var $mDiffs;
+       protected $mDiffs;
 
-       /** The diff map, see above */
-       var $mDiffMap;
+       /** @var array The diff map, see above */
+       protected $mDiffMap;
 
-       /**
-        * The key for getText()
+       /** @var int The key for getText()
         */
-       var $mDefaultKey;
+       protected $mDefaultKey;
 
-       /**
-        * Compressed storage
-        */
-       var $mCompressed;
+       /** @var string Compressed storage */
+       public $mCompressed;
 
-       /**
-        * True if the object is locked against further writes
-        */
-       var $mFrozen = false;
+       /** @var bool True if the object is locked against further writes */
+       protected $mFrozen = false;
 
        /**
-        * The maximum uncompressed size before the object becomes sad
+        * @var int The maximum uncompressed size before the object becomes sad
         * Should be less than max_allowed_packet
         */
-       var $mMaxSize = 10000000;
+       public $mMaxSize = 10000000;
 
-       /**
-        * The maximum number of text items before the object becomes sad
-        */
-       var $mMaxCount = 100;
+       /** @var int The maximum number of text items before the object becomes sad */
+       public $mMaxCount = 100;
 
        /** Constants from xdiff.h */
        const XDL_BDOP_INS = 1;
@@ -390,7 +401,7 @@ class DiffHistoryBlob implements HistoryBlob {
 
        /**
         * @throws MWException
-        * @param $text string
+        * @param string $text
         * @return int
         */
        function addItem( $text ) {
@@ -405,7 +416,7 @@ class DiffHistoryBlob implements HistoryBlob {
        }
 
        /**
-        * @param $key string
+        * @param string $key
         * @return string
         */
        function getItem( $key ) {
@@ -413,7 +424,7 @@ class DiffHistoryBlob implements HistoryBlob {
        }
 
        /**
-        * @param $text string
+        * @param string $text
         */
        function setText( $text ) {
                $this->mDefaultKey = $this->addItem( $text );
@@ -457,7 +468,8 @@ class DiffHistoryBlob implements HistoryBlob {
                );
                $smallFactor = 0.5;
 
-               for ( $i = 0; $i < count( $this->mItems ); $i++ ) {
+               $mItemsCount = count( $this->mItems );
+               for ( $i = 0; $i < $mItemsCount; $i++ ) {
                        $text = $this->mItems[$i];
                        if ( $i == 0 ) {
                                $seqName = 'main';
@@ -493,7 +505,8 @@ class DiffHistoryBlob implements HistoryBlob {
                                $this->mDiffs[] = $this->diff( $tail, $head );
                        }
                        $this->mDiffMap[] = $seq['map'][0];
-                       for ( $i = 1; $i < count( $seq['diffs'] ); $i++ ) {
+                       $diffsCount = count( $seq['diffs'] );
+                       for ( $i = 1; $i < $diffsCount; $i++ ) {
                                $this->mDiffs[] = $seq['diffs'][$i];
                                $this->mDiffMap[] = $seq['map'][$i];
                        }
@@ -502,8 +515,8 @@ class DiffHistoryBlob implements HistoryBlob {
        }
 
        /**
-        * @param $t1
-        * @param $t2
+        * @param string $t1
+        * @param string $t2
         * @return string
         */
        function diff( $t1, $t2 ) {
@@ -516,8 +529,8 @@ class DiffHistoryBlob implements HistoryBlob {
        }
 
        /**
-        * @param $base
-        * @param $diff
+        * @param string $base
+        * @param string $diff
         * @return bool|string
         */
        function patch( $base, $diff ) {
@@ -580,7 +593,7 @@ class DiffHistoryBlob implements HistoryBlob {
         * the bytes backwards and initialised with 0 instead of 1. See bug 34428.
         *
         * @param string $s
-        * @return string|bool: false if the hash extension is not available
+        * @return string|bool false if the hash extension is not available
         */
        function xdiffAdler32( $s ) {
                if ( !function_exists( 'hash' ) ) {
@@ -603,7 +616,8 @@ class DiffHistoryBlob implements HistoryBlob {
                        return;
                }
                $tail = '';
-               for ( $diffKey = 0; $diffKey < count( $this->mDiffs ); $diffKey++ ) {
+               $mDiffsCount = count( $this->mDiffs );
+               for ( $diffKey = 0; $diffKey < $mDiffsCount; $diffKey++ ) {
                        $textKey = $this->mDiffMap[$diffKey];
                        $text = $this->patch( $tail, $this->mDiffs[$diffKey] );
                        $this->mItems[$textKey] = $text;
index 785e717..89457e8 100644 (file)
@@ -27,7 +27,8 @@
 /**
  * @since 1.18
  */
-class MWHookException extends MWException {}
+class MWHookException extends MWException {
+}
 
 /**
  * Hooks class.
@@ -37,7 +38,6 @@ class MWHookException extends MWException {}
  * @since 1.18
  */
 class Hooks {
-
        /**
         * Array of events mapped to an array of callbacks to be run
         * when that event is triggered.
index b1d4f00..5262ffe 100644 (file)
@@ -139,9 +139,9 @@ class Html {
         * Identical to rawElement(), but HTML-escapes $contents (like
         * Xml::element()).
         *
-        * @param $element string
-        * @param $attribs array
-        * @param $contents string
+        * @param string $element
+        * @param array $attribs
+        * @param string $contents
         *
         * @return string
         */
@@ -158,8 +158,8 @@ class Html {
         * Identical to rawElement(), but has no third parameter and omits the end
         * tag (and the self-closing '/' in XML mode for empty elements).
         *
-        * @param $element string
-        * @param $attribs array
+        * @param string $element
+        * @param array $attribs
         *
         * @return string
         */
@@ -267,7 +267,7 @@ class Html {
         * to the input array (currently per the HTML 5 draft as of 2009-09-06).
         *
         * @param string $element Name of the element, e.g., 'a'
-        * @param array $attribs  Associative array of attributes, e.g., array(
+        * @param array $attribs Associative array of attributes, e.g., array(
         *   'href' => 'http://www.mediawiki.org/' ).  See expandAttributes() for
         *   further documentation.
         * @return array An array of attributes functionally identical to $attribs
@@ -583,7 +583,7 @@ class Html {
         * Output a "<script>" tag linking to the given URL, e.g.,
         * "<script src=foo.js></script>".
         *
-        * @param $url string
+        * @param string $url
         * @return string Raw HTML
         */
        public static function linkedScript( $url ) {
@@ -598,7 +598,7 @@ class Html {
         * contains literal "</style>" (admittedly unlikely).
         *
         * @param string $contents CSS
-        * @param $media mixed A media type string, like 'screen'
+        * @param string $media A media type string, like 'screen'
         * @return string Raw HTML
         */
        public static function inlineStyle( $contents, $media = 'all' ) {
@@ -618,8 +618,8 @@ class Html {
         * Output a "<link rel=stylesheet>" linking to the given URL for the given
         * media type (if any).
         *
-        * @param $url string
-        * @param $media mixed A media type string, like 'screen'
+        * @param string $url
+        * @param string $media A media type string, like 'screen'
         * @return string Raw HTML
         */
        public static function linkedStyle( $url, $media = 'all' ) {
@@ -695,16 +695,20 @@ class Html {
         *
         * @param array $params Params to set.
         * - selected: [optional] Id of namespace which should be pre-selected
-        * - all: [optional] Value of item for "all namespaces". If null or unset, no "<option>" is generated to select all namespaces
-        * - label: text for label to add before the field
-        * - exclude: [optional] Array of namespace ids to exclude
-        * - disable: [optional] Array of namespace ids for which the option should be disabled in the selector
+        * - all: [optional] Value of item for "all namespaces". If null or unset,
+        *   no "<option>" is generated to select all namespaces.
+        * - label: text for label to add before the field.
+        * - exclude: [optional] Array of namespace ids to exclude.
+        * - disable: [optional] Array of namespace ids for which the option should
+        *   be disabled in the selector.
         * @param array $selectAttribs HTML attributes for the generated select element.
-        * - id:   [optional], default: 'namespace'
-        * - name: [optional], default: 'namespace'
+        * - id:   [optional], default: 'namespace'.
+        * - name: [optional], default: 'namespace'.
         * @return string HTML code to select a namespace.
         */
-       public static function namespaceSelector( array $params = array(), array $selectAttribs = array() ) {
+       public static function namespaceSelector( array $params = array(),
+               array $selectAttribs = array()
+       ) {
                global $wgContLang;
 
                ksort( $selectAttribs );
@@ -854,11 +858,11 @@ 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 $alt alternate text for the icon
-        * @param string $class additional class name to add to the wrapper div
-        * @param $useStylePath
+        * @param string $text Wikitext, get this with wfMessage()->plain()
+        * @param string $icon Icon name, file in skins/common/images
+        * @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
         */
index 96ffe9e..b2209c3 100644 (file)
@@ -136,9 +136,15 @@ class HtmlFormatter {
                wfProfileIn( __METHOD__ );
                $removals = $this->parseItemsToRemove();
 
-               if ( !$removals ) {
+               // Bail out early if nothing to do
+               if ( array_reduce( $removals,
+                       function( $carry, $item ) {
+                               return $carry && !$item;
+                       },
+                       true
+               ) ) {
                        wfProfileOut( __METHOD__ );
-                       return;
+                       return array();
                }
 
                $doc = $this->getDoc();
@@ -253,7 +259,8 @@ class HtmlFormatter {
         * specify the $element in the method it'll change the underlying dom and you won't be able to get
         * it back.
         *
-        * @param DOMElement|string|null $element ID of element to get HTML from or false to get it from the whole tree
+        * @param DOMElement|string|null $element ID of element to get HTML from or
+        *   false to get it from the whole tree
         * @return string Processed HTML
         */
        public function getText( $element = null ) {
@@ -287,11 +294,12 @@ class HtmlFormatter {
                                // XML code paths if possible and fix there.
                                $html = str_replace( '&#13;', '', $html );
                        }
-                       $html = preg_replace( '/<!--.*?-->|^.*?<body>|<\/body>.*$/s', '', $html );
                        wfProfileOut( __METHOD__ . '-fixes' );
                } else {
                        $html = $this->html;
                }
+               // Remove stuff added by wrapHTML()
+               $html = preg_replace( '/<!--.*?-->|^.*?<body>|<\/body>.*$/s', '', $html );
                $html = $this->onHtmlReady( $html );
 
                wfProfileIn( __METHOD__ . '-flatten' );
index 1fd437e..c9dd0c0 100644 (file)
@@ -55,7 +55,7 @@ class Http {
         *                                  to avoid attacks on intranet services accessible by HTTP.
         *    - userAgent           A user agent, if you want to override the default
         *                          MediaWiki/$wgVersion
-        * @return Mixed: (bool)false on failure or a string on success
+        * @return string|bool (bool)false on failure or a string on success
         */
        public static function request( $method, $url, $options = array() ) {
                wfDebug( "HTTP: $method: $url\n" );
@@ -85,9 +85,9 @@ class Http {
         * Simple wrapper for Http::request( 'GET' )
         * @see Http::request()
         *
-        * @param $url
-        * @param $timeout string
-        * @param $options array
+        * @param string $url
+        * @param string $timeout
+        * @param array $options
         * @return string
         */
        public static function get( $url, $timeout = 'default', $options = array() ) {
@@ -99,8 +99,8 @@ class Http {
         * Simple wrapper for Http::request( 'POST' )
         * @see Http::request()
         *
-        * @param $url
-        * @param $options array
+        * @param string $url
+        * @param array $options
         * @return string
         */
        public static function post( $url, $options = array() ) {
@@ -110,8 +110,8 @@ class Http {
        /**
         * Check if the URL can be served by localhost
         *
-        * @param string $url full url to check
-        * @return Boolean
+        * @param string $url Full url to check
+        * @return bool
         */
        public static function isLocalURL( $url ) {
                global $wgCommandLineMode, $wgConf;
@@ -150,7 +150,7 @@ class Http {
 
        /**
         * A standard user-agent we can use for external requests.
-        * @return String
+        * @return string
         */
        public static function userAgent() {
                global $wgVersion;
@@ -166,8 +166,8 @@ class Http {
         *
         * @todo FIXME this is wildly inaccurate and fails to actually check most stuff
         *
-        * @param $uri Mixed: URI to check for validity
-        * @return Boolean
+        * @param string $uri URI to check for validity
+        * @return bool
         */
        public static function isValidURI( $uri ) {
                return preg_match(
@@ -217,7 +217,7 @@ class MWHttpRequest {
        public $status;
 
        /**
-        * @param string $url url to use. If protocol-relative, will be expanded to an http:// URL
+        * @param string $url Url to use. If protocol-relative, will be expanded to an http:// URL
         * @param array $options (optional) extra params to pass (see Http::request())
         */
        protected function __construct( $url, $options = array() ) {
@@ -276,7 +276,7 @@ class MWHttpRequest {
 
        /**
         * Generate a new request object
-        * @param string $url url to use
+        * @param string $url Url to use
         * @param array $options (optional) extra params to pass (see Http::request())
         * @throws MWException
         * @return CurlHttpRequest|PhpHttpRequest
@@ -310,7 +310,7 @@ class MWHttpRequest {
        /**
         * Get the body, or content, of the response to the request
         *
-        * @return String
+        * @return string
         */
        public function getContent() {
                return $this->content;
@@ -319,7 +319,7 @@ class MWHttpRequest {
        /**
         * Set the parameters of the request
         *
-        * @param $args Array
+        * @param array $args
         * @todo overload the args param
         */
        public function setData( $args ) {
@@ -352,7 +352,7 @@ class MWHttpRequest {
 
        /**
         * Set the user agent
-        * @param $UA string
+        * @param string $UA
         */
        public function setUserAgent( $UA ) {
                $this->setHeader( 'User-Agent', $UA );
@@ -360,8 +360,8 @@ class MWHttpRequest {
 
        /**
         * Set an arbitrary header
-        * @param $name
-        * @param $value
+        * @param string $name
+        * @param string $value
         */
        public function setHeader( $name, $value ) {
                // I feel like I should normalize the case here...
@@ -405,7 +405,7 @@ class MWHttpRequest {
         * bytes are reported handled than were passed to you, the HTTP fetch
         * will be aborted.
         *
-        * @param $callback Callback
+        * @param callable $callback
         * @throws MWException
         */
        public function setCallback( $callback ) {
@@ -419,8 +419,8 @@ class MWHttpRequest {
         * A generic callback to read the body of the response from a remote
         * server.
         *
-        * @param $fh handle
-        * @param $content String
+        * @param resource $fh
+        * @param string $content
         * @return int
         */
        public function read( $fh, $content ) {
@@ -507,7 +507,7 @@ class MWHttpRequest {
         * (see RFC2616, section 10, http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
         * for a list of status codes.)
         *
-        * @return Integer
+        * @return int
         */
        public function getStatus() {
                if ( !$this->respHeaders ) {
@@ -520,7 +520,7 @@ class MWHttpRequest {
        /**
         * Returns true if the last status code was a redirect.
         *
-        * @return Boolean
+        * @return bool
         */
        public function isRedirect() {
                if ( !$this->respHeaders ) {
@@ -542,7 +542,7 @@ class MWHttpRequest {
         * (e.g. Set-Cookie) can appear more than once the, each value of
         * the associative array is an array of the values given.
         *
-        * @return Array
+        * @return array
         */
        public function getResponseHeaders() {
                if ( !$this->respHeaders ) {
@@ -555,8 +555,8 @@ class MWHttpRequest {
        /**
         * Returns the value of the given response header.
         *
-        * @param $header String
-        * @return String
+        * @param string $header
+        * @return string
         */
        public function getResponseHeader( $header ) {
                if ( !$this->respHeaders ) {
@@ -574,7 +574,7 @@ class MWHttpRequest {
        /**
         * Tells the MWHttpRequest object to use this pre-loaded CookieJar.
         *
-        * @param $jar CookieJar
+        * @param CookieJar $jar
         */
        public function setCookieJar( $jar ) {
                $this->cookieJar = $jar;
@@ -598,9 +598,9 @@ class MWHttpRequest {
         * cookies. Used internally after a request to parse the
         * Set-Cookie headers.
         * @see Cookie::set
-        * @param $name
-        * @param $value null
-        * @param $attr null
+        * @param string $name
+        * @param mixed $value
+        * @param array $attr
         */
        public function setCookie( $name, $value = null, $attr = null ) {
                if ( !$this->cookieJar ) {
@@ -705,8 +705,8 @@ class CurlHttpRequest extends MWHttpRequest {
        protected $headerText = "";
 
        /**
-        * @param $fh
-        * @param $content
+        * @param resource $fh
+        * @param string $content
         * @return int
         */
        protected function readHeader( $fh, $content ) {
@@ -821,7 +821,7 @@ class CurlHttpRequest extends MWHttpRequest {
 class PhpHttpRequest extends MWHttpRequest {
 
        /**
-        * @param $url string
+        * @param string $url
         * @return string
         */
        protected function urlToTcp( $url ) {
index a83217d..5f385ac 100644 (file)
  * @ingroup Media
  */
 class ImagePage extends Article {
-
-       /**
-        * @var File
-        */
+       /** @var File */
        private $displayImg;
-       /**
-        * @var FileRepo
-        */
+
+       /** @var FileRepo */
        private $repo;
+
+       /** @var bool */
        private $fileLoaded;
 
-       var $mExtraDescription = false;
+       /** @var bool */
+       protected $mExtraDescription = false;
 
        /**
-        * @param $title Title
+        * @param Title $title
         * @return WikiFilePage
         */
        protected function newPage( Title $title ) {
@@ -50,7 +49,7 @@ class ImagePage extends Article {
 
        /**
         * Constructor from a page id
-        * @param int $id article ID to load
+        * @param int $id Article ID to load
         * @return ImagePage|null
         */
        public static function newFromID( $id ) {
@@ -61,7 +60,7 @@ class ImagePage extends Article {
        }
 
        /**
-        * @param $file File:
+        * @param File $file
         * @return void
         */
        public function setFile( $file ) {
@@ -106,7 +105,10 @@ class ImagePage extends Article {
                $out = $this->getContext()->getOutput();
                $request = $this->getContext()->getRequest();
                $diff = $request->getVal( 'diff' );
-               $diffOnly = $request->getBool( 'diffonly', $this->getContext()->getUser()->getOption( 'diffonly' ) );
+               $diffOnly = $request->getBool(
+                       'diffonly',
+                       $this->getContext()->getUser()->getOption( 'diffonly' )
+               );
 
                if ( $this->getTitle()->getNamespace() != NS_FILE || ( $diff !== null && $diffOnly ) ) {
                        parent::view();
@@ -126,8 +128,11 @@ class ImagePage extends Article {
                                // mTitle is not the same as the redirect target so it is
                                // probably the redirect page itself. Fake the redirect symbol
                                $out->setPageTitle( $this->getTitle()->getPrefixedText() );
-                               $out->addHTML( $this->viewRedirect( Title::makeTitle( NS_FILE, $this->mPage->getFile()->getName() ),
-                                       /* $appendSubtitle */ true, /* $forceKnown */ true ) );
+                               $out->addHTML( $this->viewRedirect(
+                                       Title::makeTitle( NS_FILE, $this->mPage->getFile()->getName() ),
+                                       /* $appendSubtitle */ true,
+                                       /* $forceKnown */ true )
+                               );
                                $this->mPage->doViewUpdates( $this->getContext()->getUser(), $this->getOldID() );
                                return;
                        }
@@ -227,8 +232,8 @@ class ImagePage extends Article {
        /**
         * Create the TOC
         *
-        * @param $metadata Boolean: whether or not to show the metadata link
-        * @return String
+        * @param bool $metadata Whether or not to show the metadata link
+        * @return string
         */
        protected function showTOC( $metadata ) {
                $r = array(
@@ -250,8 +255,8 @@ class ImagePage extends Article {
         *
         * @todo FIXME: Bad interface, see note on MediaHandler::formatMetadata().
         *
-        * @param array $metadata the array containing the Exif data
-        * @return String The metadata table. This is treated as Wikitext (!)
+        * @param array $metadata The array containing the Exif data
+        * @return string The metadata table. This is treated as Wikitext (!)
         */
        protected function makeMetadataTable( $metadata ) {
                $r = "<div class=\"mw-imagepage-section-metadata\">";
@@ -338,18 +343,23 @@ class ImagePage extends Article {
                                # image
 
                                # "Download high res version" link below the image
-                               # $msgsize = wfMessage( 'file-info-size', $width_orig, $height_orig, Linker::formatSize( $this->displayImg->getSize() ), $mime )->escaped();
+                               # $msgsize = wfMessage( 'file-info-size', $width_orig, $height_orig,
+                               #   Linker::formatSize( $this->displayImg->getSize() ), $mime )->escaped();
                                # We'll show a thumbnail of this image
                                if ( $width > $maxWidth || $height > $maxHeight ) {
                                        # Calculate the thumbnail size.
                                        # First case, the limiting factor is the width, not the height.
-                                       if ( $width / $height >= $maxWidth / $maxHeight ) { // FIXME: Possible division by 0. bug 36911
-                                               $height = round( $height * $maxWidth / $width ); // FIXME: Possible division by 0. bug 36911
+                                       /** @todo // FIXME: Possible division by 0. bug 36911 */
+                                       if ( $width / $height >= $maxWidth / $maxHeight ) {
+                                               /** @todo // FIXME: Possible division by 0. bug 36911 */
+                                               $height = round( $height * $maxWidth / $width );
                                                $width = $maxWidth;
                                                # Note that $height <= $maxHeight now.
                                        } else {
-                                               $newwidth = floor( $width * $maxHeight / $height ); // FIXME: Possible division by 0. bug 36911
-                                               $height = round( $height * $newwidth / $width ); // FIXME: Possible division by 0. bug 36911
+                                               /** @todo // FIXME: Possible division by 0. bug 36911 */
+                                               $newwidth = floor( $width * $maxHeight / $height );
+                                               /** @todo // FIXME: Possible division by 0. bug 36911 */
+                                               $height = round( $height * $newwidth / $width );
                                                $width = $newwidth;
                                                # Note that $height <= $maxHeight now, but might not be identical
                                                # because of rounding.
@@ -424,7 +434,11 @@ class ImagePage extends Article {
                                $thumbnail = $this->displayImg->transform( $params );
                                Linker::processResponsiveImages( $this->displayImg, $thumbnail, $params );
 
-                               $anchorclose = Html::rawElement( 'div', array( 'class' => 'mw-filepage-resolutioninfo' ), $msgsmall );
+                               $anchorclose = Html::rawElement(
+                                       'div',
+                                       array( 'class' => 'mw-filepage-resolutioninfo' ),
+                                       $msgsmall
+                               );
 
                                $isMulti = $this->displayImg->isMultipage() && $this->displayImg->pageCount() > 1;
                                if ( $isMulti ) {
@@ -453,8 +467,14 @@ class ImagePage extends Article {
                                                        array(),
                                                        array( 'page' => $page - 1 )
                                                );
-                                               $thumb1 = Linker::makeThumbLinkObj( $this->getTitle(), $this->displayImg, $link, $label, 'none',
-                                                       array( 'page' => $page - 1 ) );
+                                               $thumb1 = Linker::makeThumbLinkObj(
+                                                       $this->getTitle(),
+                                                       $this->displayImg,
+                                                       $link,
+                                                       $label,
+                                                       'none',
+                                                       array( 'page' => $page - 1 )
+                                               );
                                        } else {
                                                $thumb1 = '';
                                        }
@@ -467,8 +487,14 @@ class ImagePage extends Article {
                                                        array(),
                                                        array( 'page' => $page + 1 )
                                                );
-                                               $thumb2 = Linker::makeThumbLinkObj( $this->getTitle(), $this->displayImg, $link, $label, 'none',
-                                                       array( 'page' => $page + 1 ) );
+                                               $thumb2 = Linker::makeThumbLinkObj(
+                                                       $this->getTitle(),
+                                                       $this->displayImg,
+                                                       $link,
+                                                       $label,
+                                                       'none',
+                                                       array( 'page' => $page + 1 )
+                                               );
                                        } else {
                                                $thumb2 = '';
                                        }
@@ -519,11 +545,13 @@ class ImagePage extends Article {
                                // The dirmark, however, must not be immediately adjacent
                                // to the filename, because it can get copied with it.
                                // See bug 25277.
+                               // @codingStandardsIgnoreStart Ignore long line
                                $out->addWikiText( <<<EOT
 <div class="fullMedia"><span class="dangerousLink">{$medialink}</span> $dirmark<span class="fileInfo">$longDesc</span></div>
 <div class="mediaWarning">$warning</div>
 EOT
-                                       );
+                               );
+                               // @codingStandardsIgnoreEnd
                        } else {
                                $out->addWikiText( <<<EOT
 <div class="fullMedia">{$medialink} {$dirmark}<span class="fileInfo">$longDesc</span>
@@ -609,8 +637,8 @@ EOT
        /**
         * Creates an thumbnail of specified size and returns an HTML link to it
         * @param array $params Scaler parameters
-        * @param $width int
-        * @param $height int
+        * @param int $width
+        * @param int $height
         * @return string
         */
        private function makeSizeLink( $params, $width, $height ) {
@@ -690,17 +718,29 @@ EOT
 
                # "Upload a new version of this file" link
                $canUpload = $this->getTitle()->userCan( 'upload', $this->getContext()->getUser() );
-               if ( $canUpload && UploadBase::userCanReUpload( $this->getContext()->getUser(), $this->mPage->getFile()->name ) ) {
-                       $ulink = Linker::makeExternalLink( $this->getUploadUrl(), wfMessage( 'uploadnewversion-linktext' )->text() );
-                       $out->addHTML( "<li id=\"mw-imagepage-reupload-link\"><div class=\"plainlinks\">{$ulink}</div></li>\n" );
+               if ( $canUpload && UploadBase::userCanReUpload(
+                               $this->getContext()->getUser(),
+                               $this->mPage->getFile()->name )
+               ) {
+                       $ulink = Linker::makeExternalLink(
+                               $this->getUploadUrl(),
+                               wfMessage( 'uploadnewversion-linktext' )->text()
+                       );
+                       $out->addHTML( "<li id=\"mw-imagepage-reupload-link\">"
+                               . "<div class=\"plainlinks\">{$ulink}</div></li>\n" );
                } else {
-                       $out->addHTML( "<li id=\"mw-imagepage-upload-disallowed\">" . $this->getContext()->msg( 'upload-disallowed-here' )->escaped() . "</li>\n" );
+                       $out->addHTML( "<li id=\"mw-imagepage-upload-disallowed\">"
+                               . $this->getContext()->msg( 'upload-disallowed-here' )->escaped() . "</li>\n" );
                }
 
                $out->addHTML( "</ul>\n" );
        }
 
-       protected function closeShowImage() { } # For overloading
+       /**
+        * For overloading
+        */
+       protected function closeShowImage() {
+       }
 
        /**
         * If the page we've just displayed is in the "Image" namespace,
@@ -723,8 +763,8 @@ EOT
        }
 
        /**
-        * @param $target
-        * @param $limit
+        * @param string $target
+        * @param int $limit
         * @return ResultWrapper
         */
        protected function queryImageLinks( $target, $limit ) {
@@ -916,7 +956,7 @@ EOT
        /**
         * Display an error with a wikitext description
         *
-        * @param $description String
+        * @param string $description
         */
        function showError( $description ) {
                $out = $this->getContext()->getOutput();
@@ -931,9 +971,9 @@ EOT
         * Callback for usort() to do link sorts by (namespace, title)
         * Function copied from Title::compare()
         *
-        * @param $a object page to compare with
-        * @param $b object page to compare with
-        * @return Integer: result of string comparison, or namespace comparison
+        * @param object $a Object page to compare with
+        * @param object $b Object page to compare with
+        * @return int Result of string comparison, or namespace comparison
         */
        protected function compare( $a, $b ) {
                if ( $a->page_namespace == $b->page_namespace ) {
@@ -946,7 +986,7 @@ EOT
        /**
         * Returns the corresponding $wgImageLimits entry for the selected user option
         *
-        * @param $user User
+        * @param User $user
         * @param string $optionName Name of a option to check, typically imagesize or thumbsize
         * @return array
         * @since 1.21
@@ -974,10 +1014,10 @@ EOT
        /**
         * Output a drop-down box for language options for the file
         *
-        * @param Array $langChoices Array of string language codes
-        * @param String $curLang Language code file is being viewed in.
-        * @param String $defaultLang Language code that image is rendered in by default
-        * @return String HTML to insert underneath image.
+        * @param array $langChoices Array of string language codes
+        * @param string $curLang Language code file is being viewed in.
+        * @param string $defaultLang Language code that image is rendered in by default
+        * @return string HTML to insert underneath image.
         */
        protected function doRenderLangOpt( array $langChoices, $curLang, $defaultLang ) {
                global $wgScript;
@@ -1013,7 +1053,11 @@ EOT
                if ( !$haveDefaultLang ) {
                        // Its hard to know if the content is really in the default language, or
                        // if its just unmarked content that could be in any language.
-                       $opts = Xml::option( wfMessage( 'img-lang-default' )->text(), $defaultLang, $defaultLang === $curLang ) . $opts;
+                       $opts = Xml::option(
+                               wfMessage( 'img-lang-default' )->text(),
+                               $defaultLang,
+                               $defaultLang === $curLang
+                       ) . $opts;
                }
                if ( !$haveCurrentLang && $defaultLang !== $curLang ) {
                        $name = Language::fetchLanguageName( $curLang, $this->getContext()->getLanguage()->getCode() );
@@ -1025,7 +1069,11 @@ EOT
                        $opts = Xml::option( $display, $curLang, true ) . $opts;
                }
 
-               $select = Html::rawElement( 'select', array( 'id' => 'mw-imglangselector', 'name' => 'lang' ), $opts );
+               $select = Html::rawElement(
+                       'select',
+                       array( 'id' => 'mw-imglangselector', 'name' => 'lang' ),
+                       $opts
+               );
                $submit = Xml::submitButton( wfMessage( 'img-lang-go' )->text() );
 
                $formContents = wfMessage( 'img-lang-info' )->rawParams( $select, $submit )->parse()
@@ -1096,17 +1144,19 @@ class ImageHistoryList extends ContextSource {
        }
 
        /**
-        * @param $navLinks string
+        * @param string $navLinks
         * @return string
         */
        public function beginImageHistoryList( $navLinks = '' ) {
-               return Xml::element( 'h2', array( 'id' => 'filehistory' ), $this->msg( 'filehist' )->text() ) . "\n"
+               return Xml::element( 'h2', array( 'id' => 'filehistory' ), $this->msg( 'filehist' )->text() )
+                       . "\n"
                        . "<div id=\"mw-imagepage-section-filehistory\">\n"
                        . $this->msg( 'filehist-help' )->parseAsBlock()
                        . $navLinks . "\n"
                        . Xml::openElement( 'table', array( 'class' => 'wikitable filehistory' ) ) . "\n"
                        . '<tr><td></td>'
-                       . ( $this->current->isLocal() && ( $this->getUser()->isAllowedAny( 'delete', 'deletedhistory' ) ) ? '<td></td>' : '' )
+                       . ( $this->current->isLocal()
+                               && ( $this->getUser()->isAllowedAny( 'delete', 'deletedhistory' ) ) ? '<td></td>' : '' )
                        . '<th>' . $this->msg( 'filehist-datetime' )->escaped() . '</th>'
                        . ( $this->showThumb ? '<th>' . $this->msg( 'filehist-thumb' )->escaped() . '</th>' : '' )
                        . '<th>' . $this->msg( 'filehist-dimensions' )->escaped() . '</th>'
@@ -1116,7 +1166,7 @@ class ImageHistoryList extends ContextSource {
        }
 
        /**
-        * @param $navLinks string
+        * @param string $navLinks
         * @return string
         */
        public function endImageHistoryList( $navLinks = '' ) {
@@ -1124,8 +1174,8 @@ class ImageHistoryList extends ContextSource {
        }
 
        /**
-        * @param $iscur
-        * @param $file File
+        * @param bool $iscur
+        * @param File $file
         * @return string
         */
        public function imageHistoryLine( $iscur, $file ) {
@@ -1212,7 +1262,8 @@ class ImageHistoryList extends ContextSource {
                $row .= "<td $selected style='white-space: nowrap;'>";
                if ( !$file->userCan( File::DELETED_FILE, $user ) ) {
                        # Don't link to unviewable files
-                       $row .= '<span class="history-deleted">' . $lang->userTimeAndDate( $timestamp, $user ) . '</span>';
+                       $row .= '<span class="history-deleted">'
+                               . $lang->userTimeAndDate( $timestamp, $user ) . '</span>';
                } elseif ( $file->isDeleted( File::DELETED_FILE ) ) {
                        if ( $local ) {
                                $this->preventClickjacking();
@@ -1234,7 +1285,11 @@ class ImageHistoryList extends ContextSource {
                        $row .= '<span class="history-deleted">' . $url . '</span>';
                } else {
                        $url = $iscur ? $this->current->getUrl() : $this->current->getArchiveUrl( $img );
-                       $row .= Xml::element( 'a', array( 'href' => $url ), $lang->userTimeAndDate( $timestamp, $user ) );
+                       $row .= Xml::element(
+                               'a',
+                               array( 'href' => $url ),
+                               $lang->userTimeAndDate( $timestamp, $user )
+                       );
                }
                $row .= "</td>";
 
@@ -1248,7 +1303,7 @@ class ImageHistoryList extends ContextSource {
                $row .= htmlspecialchars( $file->getDimensionsString() );
                $row .= $this->msg( 'word-separator' )->plain();
                $row .= '<span style="white-space: nowrap;">';
-               $row .= $this->msg( 'parentheses' )->rawParams( Linker::formatSize( $file->getSize() ) )->plain();
+               $row .= $this->msg( 'parentheses' )->sizeParams( $file->getSize() )->plain();
                $row .= '</span>';
                $row .= '</td>';
 
@@ -1256,7 +1311,8 @@ class ImageHistoryList extends ContextSource {
                $row .= '<td>';
                // Hide deleted usernames
                if ( $file->isDeleted( File::DELETED_USER ) ) {
-                       $row .= '<span class="history-deleted">' . $this->msg( 'rev-deleted-user' )->escaped() . '</span>';
+                       $row .= '<span class="history-deleted">'
+                               . $this->msg( 'rev-deleted-user' )->escaped() . '</span>';
                } else {
                        if ( $local ) {
                                $row .= Linker::userLink( $userId, $userText );
@@ -1272,9 +1328,11 @@ class ImageHistoryList extends ContextSource {
 
                // Don't show deleted descriptions
                if ( $file->isDeleted( File::DELETED_COMMENT ) ) {
-                       $row .= '<td><span class="history-deleted">' . $this->msg( 'rev-deleted-comment' )->escaped() . '</span></td>';
+                       $row .= '<td><span class="history-deleted">' .
+                               $this->msg( 'rev-deleted-comment' )->escaped() . '</span></td>';
                } else {
-                       $row .= '<td dir="' . $wgContLang->getDir() . '">' . Linker::formatComment( $description, $this->title ) . '</td>';
+                       $row .= '<td dir="' . $wgContLang->getDir() . '">' .
+                               Linker::formatComment( $description, $this->title ) . '</td>';
                }
 
                $rowClass = null;
@@ -1285,7 +1343,7 @@ class ImageHistoryList extends ContextSource {
        }
 
        /**
-        * @param $file File
+        * @param File $file
         * @return string
         */
        protected function getThumbForLine( $file ) {
@@ -1320,7 +1378,7 @@ class ImageHistoryList extends ContextSource {
        }
 
        /**
-        * @param $enable bool
+        * @param bool $enable
         */
        protected function preventClickjacking( $enable = true ) {
                $this->preventClickjacking = $enable;
@@ -1379,7 +1437,7 @@ class ImageHistoryPseudoPager extends ReverseChronologicalPager {
        }
 
        /**
-        * @param $row object
+        * @param object $row
         * @return string
         */
        function formatRow( $row ) {
@@ -1493,7 +1551,7 @@ class ImageHistoryPseudoPager extends ReverseChronologicalPager {
        }
 
        /**
-        * @param $enable bool
+        * @param bool $enable
         */
        protected function preventClickjacking( $enable = true ) {
                $this->preventClickjacking = $enable;
index 75f7ba6..b0266cb 100644 (file)
@@ -47,12 +47,17 @@ abstract class ImageQueryPage extends QueryPage {
 
                        # $res might contain the whole 1,000 rows, so we read up to
                        # $num [should update this to use a Pager]
-                       for ( $i = 0; $i < $num && $row = $dbr->fetchObject( $res ); $i++ ) {
+                       $i = 0;
+                       foreach ( $res as $row ) {
+                               $i++;
                                $namespace = isset( $row->namespace ) ? $row->namespace : NS_FILE;
                                $title = Title::makeTitleSafe( $namespace, $row->title );
                                if ( $title instanceof Title && $title->getNamespace() == NS_FILE ) {
                                        $gallery->add( $title, $this->getCellHtml( $row ) );
                                }
+                               if ( $i === $num ) {
+                                       break;
+                               }
                        }
 
                        $out->addHTML( $gallery->toHtml() );
@@ -60,7 +65,8 @@ abstract class ImageQueryPage extends QueryPage {
        }
 
        // Gotta override this since it's abstract
-       function formatResult( $skin, $result ) { }
+       function formatResult( $skin, $result ) {
+       }
 
        /**
         * Get additional HTML to be shown in a results' cell
index b18e257..79df693 100644 (file)
@@ -40,12 +40,14 @@ class WikiImporter {
 
        /**
         * Creates an ImportXMLReader drawing from the source provided
-        * @param $source
+        * @param string $source
         */
        function __construct( $source ) {
                $this->reader = new XMLReader();
 
-               stream_wrapper_register( 'uploadsource', 'UploadSourceAdapter' );
+               if ( !in_array(  'uploadsource', stream_get_wrappers() ) ) {
+                       stream_wrapper_register( 'uploadsource', 'UploadSourceAdapter' );
+               }
                $id = UploadSourceAdapter::registerSource( $source );
                if ( defined( 'LIBXML_PARSEHUGE' ) ) {
                        $this->reader->open( "uploadsource://$id", null, LIBXML_PARSEHUGE );
@@ -60,22 +62,29 @@ class WikiImporter {
                $this->setPageOutCallback( array( $this, 'finishImportPage' ) );
        }
 
-       private function throwXmlError( $err ) {
+       /**
+        * @return null|XMLReader
+        */
+       public function getReader() {
+               return $this->reader;
+       }
+
+       public function throwXmlError( $err ) {
                $this->debug( "FAILURE: $err" );
                wfDebug( "WikiImporter XML error: $err\n" );
        }
 
-       private function debug( $data ) {
+       public function debug( $data ) {
                if ( $this->mDebug ) {
                        wfDebug( "IMPORT: $data\n" );
                }
        }
 
-       private function warn( $data ) {
+       public function warn( $data ) {
                wfDebug( "IMPORT: $data\n" );
        }
 
-       private function notice( $msg /*, $param, ...*/ ) {
+       public function notice( $msg /*, $param, ...*/ ) {
                $params = func_get_args();
                array_shift( $params );
 
@@ -88,7 +97,7 @@ class WikiImporter {
 
        /**
         * Set debug mode...
-        * @param $debug bool
+        * @param bool $debug
         */
        function setDebug( $debug ) {
                $this->mDebug = $debug;
@@ -96,7 +105,7 @@ class WikiImporter {
 
        /**
         * Set 'no updates' mode. In this mode, the link tables will not be updated by the importer
-        * @param $noupdates bool
+        * @param bool $noupdates
         */
        function setNoUpdates( $noupdates ) {
                $this->mNoUpdates = $noupdates;
@@ -105,8 +114,8 @@ class WikiImporter {
        /**
         * Set a callback that displays notice messages
         *
-        * @param $callback callback
-        * @return callback
+        * @param callable $callback
+        * @return callable
         */
        public function setNoticeCallback( $callback ) {
                return wfSetVar( $this->mNoticeCallback, $callback );
@@ -114,8 +123,8 @@ class WikiImporter {
 
        /**
         * Sets the action to perform as each new page in the stream is reached.
-        * @param $callback callback
-        * @return callback
+        * @param callable $callback
+        * @return callable
         */
        public function setPageCallback( $callback ) {
                $previous = $this->mPageCallback;
@@ -129,8 +138,8 @@ class WikiImporter {
         * with the original title form (in case it's been overridden into a
         * local namespace), and a count of revisions.
         *
-        * @param $callback callback
-        * @return callback
+        * @param callable $callback
+        * @return callable
         */
        public function setPageOutCallback( $callback ) {
                $previous = $this->mPageOutCallback;
@@ -140,8 +149,8 @@ class WikiImporter {
 
        /**
         * Sets the action to perform as each page revision is reached.
-        * @param $callback callback
-        * @return callback
+        * @param callable $callback
+        * @return callable
         */
        public function setRevisionCallback( $callback ) {
                $previous = $this->mRevisionCallback;
@@ -151,8 +160,8 @@ class WikiImporter {
 
        /**
         * Sets the action to perform as each file upload version is reached.
-        * @param $callback callback
-        * @return callback
+        * @param callable $callback
+        * @return callable
         */
        public function setUploadCallback( $callback ) {
                $previous = $this->mUploadCallback;
@@ -162,8 +171,8 @@ class WikiImporter {
 
        /**
         * Sets the action to perform as each log item reached.
-        * @param $callback callback
-        * @return callback
+        * @param callable $callback
+        * @return callable
         */
        public function setLogItemCallback( $callback ) {
                $previous = $this->mLogItemCallback;
@@ -173,8 +182,8 @@ class WikiImporter {
 
        /**
         * Sets the action to perform when site info is encountered
-        * @param $callback callback
-        * @return callback
+        * @param callable $callback
+        * @return callable
         */
        public function setSiteInfoCallback( $callback ) {
                $previous = $this->mSiteInfoCallback;
@@ -184,7 +193,7 @@ class WikiImporter {
 
        /**
         * Set a target namespace to override the defaults
-        * @param $namespace
+        * @param null|int $namespace
         * @return bool
         */
        public function setTargetNamespace( $namespace ) {
@@ -201,8 +210,8 @@ class WikiImporter {
 
        /**
         * Set a target root page under which all pages are imported
-        * @param $rootpage
-        * @return status object
+        * @param null|string $rootpage
+        * @return Status
         */
        public function setTargetRootPage( $rootpage ) {
                $status = Status::newGood();
@@ -211,7 +220,11 @@ class WikiImporter {
                        $this->mTargetRootPage = null;
                } elseif ( $rootpage !== '' ) {
                        $rootpage = rtrim( $rootpage, '/' ); //avoid double slashes
-                       $title = Title::newFromText( $rootpage, !is_null( $this->mTargetNamespace ) ? $this->mTargetNamespace : NS_MAIN );
+                       $title = Title::newFromText( $rootpage, !is_null( $this->mTargetNamespace )
+                               ? $this->mTargetNamespace
+                               : NS_MAIN
+                       );
+
                        if ( !$title || $title->isExternal() ) {
                                $status->fatal( 'import-rootpage-invalid' );
                        } else {
@@ -233,14 +246,14 @@ class WikiImporter {
        }
 
        /**
-        * @param $dir
+        * @param string $dir
         */
        public function setImageBasePath( $dir ) {
                $this->mImageBasePath = $dir;
        }
 
        /**
-        * @param $import
+        * @param bool $import
         */
        public function setImportUploads( $import ) {
                $this->mImportUploads = $import;
@@ -248,11 +261,11 @@ class WikiImporter {
 
        /**
         * Default per-revision callback, performs the import.
-        * @param $revision WikiRevision
+        * @param WikiRevision $revision
         * @return bool
         */
        public function importRevision( $revision ) {
-               if ( !$revision->getContent()->getContentHandler()->canBeUsedOn( $revision->getTitle() ) ) {
+               if ( !$revision->getContentHandler()->canBeUsedOn( $revision->getTitle() ) ) {
                        $this->notice( 'import-error-bad-location',
                                $revision->getTitle()->getPrefixedText(),
                                $revision->getID(),
@@ -278,17 +291,17 @@ class WikiImporter {
 
        /**
         * Default per-revision callback, performs the import.
-        * @param $rev WikiRevision
+        * @param WikiRevision $revision
         * @return bool
         */
-       public function importLogItem( $rev ) {
+       public function importLogItem( $revision ) {
                $dbw = wfGetDB( DB_MASTER );
-               return $dbw->deadlockLoop( array( $rev, 'importLogItem' ) );
+               return $dbw->deadlockLoop( array( $revision, 'importLogItem' ) );
        }
 
        /**
         * Dummy for now...
-        * @param $revision
+        * @param WikiRevision $revision
         * @return bool
         */
        public function importUpload( $revision ) {
@@ -298,12 +311,12 @@ class WikiImporter {
 
        /**
         * Mostly for hook use
-        * @param $title
-        * @param $origTitle
-        * @param $revCount
-        * @param $sRevCount
-        * @param $pageInfo
-        * @return
+        * @param Title $title
+        * @param string $origTitle
+        * @param int $revCount
+        * @param int $sRevCount
+        * @param array $pageInfo
+        * @return bool
         */
        public function finishImportPage( $title, $origTitle, $revCount, $sRevCount, $pageInfo ) {
                $args = func_get_args();
@@ -312,7 +325,7 @@ class WikiImporter {
 
        /**
         * Alternate per-revision callback, for debugging.
-        * @param $revision WikiRevision
+        * @param WikiRevision $revision
         */
        public function debugRevisionHandler( &$revision ) {
                $this->debug( "Got revision:" );
@@ -329,7 +342,7 @@ class WikiImporter {
 
        /**
         * Notify the callback function when a new "<page>" is reached.
-        * @param $title Title
+        * @param Title $title
         */
        function pageCallback( $title ) {
                if ( isset( $this->mPageCallback ) ) {
@@ -339,11 +352,11 @@ class WikiImporter {
 
        /**
         * Notify the callback function when a "</page>" is closed.
-        * @param $title Title
-        * @param $origTitle Title
-        * @param $revCount Integer
-        * @param int $sucCount number of revisions for which callback returned true
-        * @param array $pageInfo associative array of page information
+        * @param Title $title
+        * @param Title $origTitle
+        * @param int $revCount
+        * @param int $sucCount Number of revisions for which callback returned true
+        * @param array $pageInfo Associative array of page information
         */
        private function pageOutCallback( $title, $origTitle, $revCount, $sucCount, $pageInfo ) {
                if ( isset( $this->mPageOutCallback ) ) {
@@ -354,7 +367,7 @@ class WikiImporter {
 
        /**
         * Notify the callback function of a revision
-        * @param $revision WikiRevision object
+        * @param WikiRevision $revision
         * @return bool|mixed
         */
        private function revisionCallback( $revision ) {
@@ -368,7 +381,7 @@ class WikiImporter {
 
        /**
         * Notify the callback function of a new log item
-        * @param $revision WikiRevision object
+        * @param WikiRevision $revision
         * @return bool|mixed
         */
        private function logItemCallback( $revision ) {
@@ -380,6 +393,15 @@ class WikiImporter {
                }
        }
 
+       /**
+        * Retrieves the contents of the named attribute of the current element.
+        * @param string $attr the name of the attribute
+        * @return string the value of the attribute or an empty string if it is not set in the current element.
+        */
+       public function nodeAttribute( $attr ) {
+               return $this->reader->getAttribute( $attr );
+       }
+
        /**
         * Shouldn't something like this be built-in to XMLReader?
         * Fetches text contents of the current element, assuming
@@ -387,7 +409,7 @@ class WikiImporter {
         * @return string
         * @access private
         */
-       private function nodeContents() {
+       public function nodeContents() {
                if ( $this->reader->isEmptyElement ) {
                        return "";
                }
@@ -551,7 +573,7 @@ class WikiImporter {
        }
 
        /**
-        * @param $logInfo
+        * @param array $logInfo
         * @return bool|mixed
         */
        private function processLogItem( $logInfo ) {
@@ -605,17 +627,28 @@ class WikiImporter {
                                                &$pageInfo ) ) ) {
                                // Do nothing
                        } elseif ( in_array( $tag, $normalFields ) ) {
-                               $pageInfo[$tag] = $this->nodeContents();
-                               if ( $tag == 'title' ) {
-                                       $title = $this->processTitle( $pageInfo['title'] );
+                               // An XML snippet:
+                               // <page>
+                               //     <id>123</id>
+                               //     <title>Page</title>
+                               //     <redirect title="NewTitle"/>
+                               //     ...
+                               // Because the redirect tag is built differently, we need special handling for that case.
+                               if ( $tag == 'redirect' ) {
+                                       $pageInfo[$tag] = $this->nodeAttribute( 'title' );
+                               } else {
+                                       $pageInfo[$tag] = $this->nodeContents();
+                                       if ( $tag == 'title' ) {
+                                               $title = $this->processTitle( $pageInfo['title'] );
 
-                                       if ( !$title ) {
-                                               $badTitle = true;
-                                               $skip = true;
-                                       }
+                                               if ( !$title ) {
+                                                       $badTitle = true;
+                                                       $skip = true;
+                                               }
 
-                                       $this->pageCallback( $title );
-                                       list( $pageInfo['_title'], $origTitle ) = $title;
+                                               $this->pageCallback( $title );
+                                               list( $pageInfo['_title'], $origTitle ) = $title;
+                                       }
                                }
                        } elseif ( $tag == 'revision' ) {
                                $this->handleRevision( $pageInfo );
@@ -634,7 +667,7 @@ class WikiImporter {
        }
 
        /**
-        * @param $pageInfo array
+        * @param array $pageInfo
         */
        private function handleRevision( &$pageInfo ) {
                $this->debug( "Enter revision handler" );
@@ -673,8 +706,8 @@ class WikiImporter {
        }
 
        /**
-        * @param $pageInfo
-        * @param $revisionInfo
+        * @param array $pageInfo
+        * @param array $revisionInfo
         * @return bool|mixed
         */
        private function processRevision( $pageInfo, $revisionInfo ) {
@@ -683,9 +716,6 @@ class WikiImporter {
                if ( isset( $revisionInfo['id'] ) ) {
                        $revision->setID( $revisionInfo['id'] );
                }
-               if ( isset( $revisionInfo['text'] ) ) {
-                       $revision->setText( $revisionInfo['text'] );
-               }
                if ( isset( $revisionInfo['model'] ) ) {
                        $revision->setModel( $revisionInfo['model'] );
                }
@@ -694,6 +724,14 @@ class WikiImporter {
                }
                $revision->setTitle( $pageInfo['_title'] );
 
+               if ( isset( $revisionInfo['text'] ) ) {
+                       $handler = $revision->getContentHandler();
+                       $text = $handler->importTransform(
+                               $revisionInfo['text'],
+                               $revision->getFormat() );
+
+                       $revision->setText( $text );
+               }
                if ( isset( $revisionInfo['timestamp'] ) ) {
                        $revision->setTimestamp( $revisionInfo['timestamp'] );
                } else {
@@ -719,7 +757,7 @@ class WikiImporter {
        }
 
        /**
-        * @param $pageInfo
+        * @param array $pageInfo
         * @return mixed
         */
        private function handleUpload( &$pageInfo ) {
@@ -774,7 +812,7 @@ class WikiImporter {
        }
 
        /**
-        * @param $contents
+        * @param string $contents
         * @return string
         */
        private function dumpTemp( $contents ) {
@@ -784,8 +822,8 @@ class WikiImporter {
        }
 
        /**
-        * @param $pageInfo
-        * @param $uploadInfo
+        * @param array $pageInfo
+        * @param array $uploadInfo
         * @return mixed
         */
        private function processUpload( $pageInfo, $uploadInfo ) {
@@ -846,8 +884,8 @@ class WikiImporter {
        }
 
        /**
-        * @param $text string
-        * @return Array or false
+        * @param string $text
+        * @return array|bool
         */
        private function processTitle( $text ) {
                global $wgCommandLineMode;
@@ -893,14 +931,20 @@ class WikiImporter {
 
 /** This is a horrible hack used to keep source compatibility */
 class UploadSourceAdapter {
-       static $sourceRegistrations = array();
+       /** @var array */
+       private static $sourceRegistrations = array();
 
+       /** @var string */
        private $mSource;
+
+       /** @var string */
        private $mBuffer;
+
+       /** @var int */
        private $mPosition;
 
        /**
-        * @param $source
+        * @param string $source
         * @return string
         */
        static function registerSource( $source ) {
@@ -912,10 +956,10 @@ class UploadSourceAdapter {
        }
 
        /**
-        * @param $path
-        * @param $mode
-        * @param $options
-        * @param $opened_path
+        * @param string $path
+        * @param string $mode
+        * @param array $options
+        * @param string $opened_path
         * @return bool
         */
        function stream_open( $path, $mode, $options, &$opened_path ) {
@@ -932,7 +976,7 @@ class UploadSourceAdapter {
        }
 
        /**
-        * @param $count
+        * @param int $count
         * @return string
         */
        function stream_read( $count ) {
@@ -961,7 +1005,7 @@ class UploadSourceAdapter {
        }
 
        /**
-        * @param $data
+        * @param string $data
         * @return bool
         */
        function stream_write( $data ) {
@@ -1035,55 +1079,109 @@ class XMLReader2 extends XMLReader {
  * @ingroup SpecialPage
  */
 class WikiRevision {
-       var $importer = null;
-
-       /**
-        * @var Title
-        */
-       var $title = null;
-       var $id = 0;
-       var $timestamp = "20010115000000";
-       var $user = 0;
-       var $user_text = "";
-       var $model = null;
-       var $format = null;
-       var $text = "";
-       var $content = null;
-       var $comment = "";
-       var $minor = false;
-       var $type = "";
-       var $action = "";
-       var $params = "";
-       var $fileSrc = '';
-       var $sha1base36 = false;
-       var $isTemp = false;
-       var $archiveName = '';
-       var $fileIsTemp;
+       /** @todo Unused? */
+       private $importer = null;
+
+       /** @var Title */
+       public $title = null;
+
+       /** @var int */
+       private $id = 0;
+
+       /** @var string */
+       public $timestamp = "20010115000000";
+
+       /**
+        * @var int
+        * @todo Can't find any uses. Public, because that's suspicious. Get clarity. */
+       public $user = 0;
+
+       /** @var string */
+       public $user_text = "";
+
+       /** @var string */
+       protected $model = null;
+
+       /** @var string */
+       protected $format = null;
+
+       /** @var string */
+       public $text = "";
+
+       /** @var int */
+       protected $size;
+
+       /** @var Content */
+       protected $content = null;
+
+       /** @var ContentHandler */
+       protected $contentHandler = null;
+
+       /** @var string */
+       public $comment = "";
+
+       /** @var bool */
+       protected $minor = false;
+
+       /** @var string */
+       protected $type = "";
+
+       /** @var string */
+       protected $action = "";
+
+       /** @var string */
+       protected $params = "";
+
+       /** @var string */
+       protected $fileSrc = '';
+
+       /** @var bool|string */
+       protected $sha1base36 = false;
+
+       /**
+        * @var bool
+        * @todo Unused?
+        */
+       private $isTemp = false;
+
+       /** @var string */
+       protected $archiveName = '';
+
+       protected $filename;
+
+       /** @var mixed */
+       protected $src;
+
+       /** @todo Unused? */
+       private $fileIsTemp;
+
+       /** @var bool */
        private $mNoUpdates = false;
 
        /**
-        * @param $title
+        * @param Title $title
         * @throws MWException
         */
        function setTitle( $title ) {
                if ( is_object( $title ) ) {
                        $this->title = $title;
                } elseif ( is_null( $title ) ) {
-                       throw new MWException( "WikiRevision given a null title in import. You may need to adjust \$wgLegalTitleChars." );
+                       throw new MWException( "WikiRevision given a null title in import. "
+                               . "You may need to adjust \$wgLegalTitleChars." );
                } else {
                        throw new MWException( "WikiRevision given non-object title in import." );
                }
        }
 
        /**
-        * @param $id
+        * @param int $id
         */
        function setID( $id ) {
                $this->id = $id;
        }
 
        /**
-        * @param $ts
+        * @param string $ts
         */
        function setTimestamp( $ts ) {
                # 2003-08-05T18:30:02Z
@@ -1091,64 +1189,64 @@ class WikiRevision {
        }
 
        /**
-        * @param $user
+        * @param string $user
         */
        function setUsername( $user ) {
                $this->user_text = $user;
        }
 
        /**
-        * @param $ip
+        * @param string $ip
         */
        function setUserIP( $ip ) {
                $this->user_text = $ip;
        }
 
        /**
-        * @param $model
+        * @param string $model
         */
        function setModel( $model ) {
                $this->model = $model;
        }
 
        /**
-        * @param $format
+        * @param string $format
         */
        function setFormat( $format ) {
                $this->format = $format;
        }
 
        /**
-        * @param $text
+        * @param string $text
         */
        function setText( $text ) {
                $this->text = $text;
        }
 
        /**
-        * @param $text
+        * @param string $text
         */
        function setComment( $text ) {
                $this->comment = $text;
        }
 
        /**
-        * @param $minor
+        * @param bool $minor
         */
        function setMinor( $minor ) {
                $this->minor = (bool)$minor;
        }
 
        /**
-        * @param $src
+        * @param mixed $src
         */
        function setSrc( $src ) {
                $this->src = $src;
        }
 
        /**
-        * @param $src
-        * @param $isTemp
+        * @param string $src
+        * @param bool $isTemp
         */
        function setFileSrc( $src, $isTemp ) {
                $this->fileSrc = $src;
@@ -1156,56 +1254,56 @@ class WikiRevision {
        }
 
        /**
-        * @param $sha1base36
+        * @param string $sha1base36
         */
        function setSha1Base36( $sha1base36 ) {
                $this->sha1base36 = $sha1base36;
        }
 
        /**
-        * @param $filename
+        * @param string $filename
         */
        function setFilename( $filename ) {
                $this->filename = $filename;
        }
 
        /**
-        * @param $archiveName
+        * @param string $archiveName
         */
        function setArchiveName( $archiveName ) {
                $this->archiveName = $archiveName;
        }
 
        /**
-        * @param $size
+        * @param int $size
         */
        function setSize( $size ) {
                $this->size = intval( $size );
        }
 
        /**
-        * @param $type
+        * @param string $type
         */
        function setType( $type ) {
                $this->type = $type;
        }
 
        /**
-        * @param $action
+        * @param string $action
         */
        function setAction( $action ) {
                $this->action = $action;
        }
 
        /**
-        * @param $params
+        * @param array $params
         */
        function setParams( $params ) {
                $this->params = $params;
        }
 
        /**
-        * @param $noupdates
+        * @param bool $noupdates
         */
        public function setNoUpdates( $noupdates ) {
                $this->mNoUpdates = $noupdates;
@@ -1250,25 +1348,31 @@ class WikiRevision {
                return $this->text;
        }
 
+       /**
+        * @return ContentHandler
+        */
+       function getContentHandler() {
+               if ( is_null( $this->contentHandler ) ) {
+                       $this->contentHandler = ContentHandler::getForModelID( $this->getModel() );
+               }
+
+               return $this->contentHandler;
+       }
+
        /**
         * @return Content
         */
        function getContent() {
                if ( is_null( $this->content ) ) {
-                       $this->content =
-                               ContentHandler::makeContent(
-                                       $this->text,
-                                       $this->getTitle(),
-                                       $this->getModel(),
-                                       $this->getFormat()
-                               );
+                       $handler = $this->getContentHandler();
+                       $this->content = $handler->unserializeContent( $this->text, $this->getFormat() );
                }
 
                return $this->content;
        }
 
        /**
-        * @return String
+        * @return string
         */
        function getModel() {
                if ( is_null( $this->model ) ) {
@@ -1279,11 +1383,11 @@ class WikiRevision {
        }
 
        /**
-        * @return String
+        * @return string
         */
        function getFormat() {
-               if ( is_null( $this->model ) ) {
-                       $this->format = ContentHandler::getForTitle( $this->getTitle() )->getDefaultFormat();
+               if ( is_null( $this->format ) ) {
+                       $this->format = $this->getContentHandler()->getDefaultFormat();
                }
 
                return $this->format;
@@ -1311,7 +1415,7 @@ class WikiRevision {
        }
 
        /**
-        * @return bool|String
+        * @return bool|string
         */
        function getSha1() {
                if ( $this->sha1base36 ) {
@@ -1431,7 +1535,8 @@ class WikiRevision {
                        'page' => $pageId,
                        'content_model' => $this->getModel(),
                        'content_format' => $this->getFormat(),
-                       'text' => $this->getContent()->serialize( $this->getFormat() ), //XXX: just set 'content' => $this->getContent()?
+                       //XXX: just set 'content' => $this->getContent()?
+                       'text' => $this->getContent()->serialize( $this->getFormat() ),
                        'comment' => $this->getComment(),
                        'user' => $userId,
                        'user_text' => $userText,
@@ -1443,7 +1548,11 @@ class WikiRevision {
 
                if ( $changed !== false && !$this->mNoUpdates ) {
                        wfDebug( __METHOD__ . ": running updates\n" );
-                       $page->doEditUpdates( $revision, $userObj, array( 'created' => $created, 'oldcountable' => $oldcountable ) );
+                       $page->doEditUpdates(
+                               $revision,
+                               $userObj,
+                               array( 'created' => $created, 'oldcountable' => $oldcountable )
+                       );
                }
 
                return true;
@@ -1475,8 +1584,9 @@ class WikiRevision {
                );
                // @todo FIXME: This could fail slightly for multiple matches :P
                if ( $prior ) {
-                       wfDebug( __METHOD__ . ": skipping existing item for Log:{$this->type}/{$this->action}, timestamp " .
-                               $this->timestamp . "\n" );
+                       wfDebug( __METHOD__
+                               . ": skipping existing item for Log:{$this->type}/{$this->action}, timestamp "
+                               . $this->timestamp . "\n" );
                        return;
                }
                $log_id = $dbw->nextSequenceValue( 'logging_log_id_seq' );
@@ -1648,7 +1758,7 @@ class ImportStreamSource {
        }
 
        /**
-        * @param $filename string
+        * @param string $filename
         * @return Status
         */
        static function newFromFile( $filename ) {
@@ -1662,7 +1772,7 @@ class ImportStreamSource {
        }
 
        /**
-        * @param $fieldname string
+        * @param string $fieldname
         * @return Status
         */
        static function newFromUpload( $fieldname = "xmlimport" ) {
@@ -1673,13 +1783,18 @@ class ImportStreamSource {
                }
                if ( !empty( $upload['error'] ) ) {
                        switch ( $upload['error'] ) {
-                               case 1: # The uploaded file exceeds the upload_max_filesize directive in php.ini.
+                               case 1:
+                                       # The uploaded file exceeds the upload_max_filesize directive in php.ini.
                                        return Status::newFatal( 'importuploaderrorsize' );
-                               case 2: # The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.
+                               case 2:
+                                       # The uploaded file exceeds the MAX_FILE_SIZE directive that
+                                       # was specified in the HTML form.
                                        return Status::newFatal( 'importuploaderrorsize' );
-                               case 3: # The uploaded file was only partially uploaded
+                               case 3:
+                                       # The uploaded file was only partially uploaded
                                        return Status::newFatal( 'importuploaderrorpartial' );
-                               case 6: #Missing a temporary folder.
+                               case 6:
+                                       # Missing a temporary folder.
                                        return Status::newFatal( 'importuploaderrortemp' );
                                # case else: # Currently impossible
                        }
@@ -1694,8 +1809,8 @@ class ImportStreamSource {
        }
 
        /**
-        * @param $url
-        * @param $method string
+        * @param string $url
+        * @param string $method
         * @return Status
         */
        static function newFromURL( $url, $method = 'GET' ) {
@@ -1717,14 +1832,16 @@ class ImportStreamSource {
        }
 
        /**
-        * @param $interwiki
-        * @param $page
-        * @param $history bool
-        * @param $templates bool
-        * @param $pageLinkDepth int
+        * @param string $interwiki
+        * @param string $page
+        * @param bool $history
+        * @param bool $templates
+        * @param int $pageLinkDepth
         * @return Status
         */
-       public static function newFromInterwiki( $interwiki, $page, $history = false, $templates = false, $pageLinkDepth = 0 ) {
+       public static function newFromInterwiki( $interwiki, $page, $history = false,
+               $templates = false, $pageLinkDepth = 0
+       ) {
                if ( $page == '' ) {
                        return Status::newFatal( 'import-noarticle' );
                }
index dd5e2d7..d9aeb7b 100644 (file)
@@ -31,7 +31,7 @@
  * deprecated.
  */
 class MWInit {
-       static $compilerVersion;
+       private static $compilerVersion;
 
        /**
         * @deprecated since 1.22
@@ -55,7 +55,7 @@ class MWInit {
         * Get a fully-qualified path for a source file relative to $IP.
         * @deprecated since 1.22
         *
-        * @param $file string
+        * @param string $file
         *
         * @return string
         */
@@ -66,7 +66,7 @@ class MWInit {
 
        /**
         * @deprecated since 1.22
-        * @param $file string
+        * @param string $file
         * @return string
         */
        static function compiledPath( $file ) {
@@ -76,7 +76,7 @@ class MWInit {
 
        /**
         * @deprecated since 1.22
-        * @param $file string
+        * @param string $file
         * @return string
         */
        static function extCompiledPath( $file ) {
@@ -87,7 +87,7 @@ class MWInit {
         * Deprecated wrapper for class_exists()
         * @deprecated since 1.22
         *
-        * @param $class string
+        * @param string $class
         *
         * @return bool
         */
@@ -99,8 +99,8 @@ class MWInit {
         * Deprecated wrapper for method_exists()
         * @deprecated since 1.22
         *
-        * @param $class string
-        * @param $method string
+        * @param string $class
+        * @param string $method
         *
         * @return bool
         */
@@ -112,7 +112,7 @@ class MWInit {
         * Deprecated wrapper for function_exists()
         * @deprecated since 1.22
         *
-        * @param $function string
+        * @param string $function
         *
         * @return bool
         */
@@ -124,9 +124,9 @@ class MWInit {
         * Deprecated wrapper for call_user_func_array()
         * @deprecated since 1.22
         *
-        * @param $className string
-        * @param $methodName string
-        * @param $args array
+        * @param string $className
+        * @param string $methodName
+        * @param array $args
         *
         * @return mixed
         */
index 6c582aa..54b779e 100644 (file)
  * A License class for use on Special:Upload
  */
 class Licenses extends HTMLFormField {
-       /**
-        * @var string
-        */
+       /** @var string */
        protected $msg;
 
-       /**
-        * @var array
-        */
+       /** @var array */
        protected $licenses = array();
 
-       /**
-        * @var string
-        */
+       /** @var string */
        protected $html;
        /**#@-*/
 
        /**
-        * Constructor
-        *
-        * @param $params array
+        * @param array $params
         */
        public function __construct( $params ) {
                parent::__construct( $params );
 
-               $this->msg = empty( $params['licenses'] ) ? wfMessage( 'licenses' )->inContentLanguage()->plain() : $params['licenses'];
+               $this->msg = empty( $params['licenses'] )
+                       ? wfMessage( 'licenses' )->inContentLanguage()->plain()
+                       : $params['licenses'];
                $this->selected = null;
 
                $this->makeLicenses();
@@ -89,7 +83,7 @@ class Licenses extends HTMLFormField {
        }
 
        /**
-        * @param $str
+        * @param string $str
         * @return array
         */
        protected function trimStars( $str ) {
@@ -98,9 +92,9 @@ class Licenses extends HTMLFormField {
        }
 
        /**
-        * @param $list
-        * @param $path
-        * @param $item
+        * @param array $list
+        * @param array $path
+        * @param mixed $item
         */
        protected function stackItem( &$list, $path, $item ) {
                $position =& $list;
@@ -113,8 +107,8 @@ class Licenses extends HTMLFormField {
        }
 
        /**
-        * @param $tagset
-        * @param $depth int
+        * @param array $tagset
+        * @param int $depth
         */
        protected function makeHtml( $tagset, $depth = 0 ) {
                foreach ( $tagset as $key => $val ) {
@@ -139,10 +133,10 @@ class Licenses extends HTMLFormField {
        }
 
        /**
-        * @param $message
-        * @param $value
-        * @param $attribs null
-        * @param $depth int
+        * @param string $message
+        * @param string $value
+        * @param null|array $attribs
+        * @param int $depth
         * @return string
         */
        protected function outputOption( $message, $value, $attribs = null, $depth = 0 ) {
@@ -171,7 +165,7 @@ class Licenses extends HTMLFormField {
        /**
         * Accessor for $this->html
         *
-        * @param $value bool
+        * @param bool $value
         *
         * @return string
         */
@@ -198,19 +192,13 @@ class Licenses extends HTMLFormField {
  * A License class for use on Special:Upload (represents a single type of license).
  */
 class License {
-       /**
-        * @var string
-        */
-       var $template;
+       /** @var string */
+       public $template;
 
-       /**
-        * @var string
-        */
-       var $text;
+       /** @var string */
+       public $text;
 
        /**
-        * Constructor
-        *
         * @param string $str license name??
         */
        function __construct( $str ) {
index 48d5cd8..340ae8f 100644 (file)
@@ -35,9 +35,9 @@ class LinkFilter {
        /**
         * Check whether $content contains a link to $filterEntry
         *
-        * @param $content Content: content to check
-        * @param string $filterEntry domainparts, see makeRegex() for more details
-        * @return Integer: 0 if no match or 1 if there's at least one match
+        * @param Content $content Content to check
+        * @param string $filterEntry Domainparts, see makeRegex() for more details
+        * @return int 0 if no match or 1 if there's at least one match
         */
        static function matchEntry( Content $content, $filterEntry ) {
                if ( !( $content instanceof TextContent ) ) {
@@ -58,7 +58,7 @@ class LinkFilter {
         *
         * @param string $filterEntry URL, if it begins with "*.", it'll be
         *        replaced to match any subdomain
-        * @return String: regex pattern, for preg_match()
+        * @return string Regex pattern, for preg_match()
         */
        private static function makeRegex( $filterEntry ) {
                $regex = '!http://';
@@ -87,9 +87,9 @@ class LinkFilter {
         * This function does the same as wfMakeUrlIndexes(), except it also takes care
         * of adding wildcards
         *
-        * @param String $filterEntry domainparts
-        * @param String $protocol protocol (default http://)
-        * @return Array to be passed to DatabaseBase::buildLike() or false on error
+        * @param string $filterEntry Domainparts
+        * @param string $protocol Protocol (default http://)
+        * @return array Array to be passed to DatabaseBase::buildLike() or false on error
         */
        public static function makeLikeArray( $filterEntry, $protocol = 'http://' ) {
                $db = wfGetDB( DB_MASTER );
@@ -171,8 +171,8 @@ class LinkFilter {
         * Filters an array returned by makeLikeArray(), removing everything past first
         * pattern placeholder.
         *
-        * @param array $arr array to filter
-        * @return array filtered array
+        * @param array $arr Array to filter
+        * @return array Filtered array
         */
        public static function keepOneWildcard( $arr ) {
                if ( !is_array( $arr ) ) {
index 0805f70..7724548 100644 (file)
@@ -30,7 +30,6 @@
  * @ingroup Skins
  */
 class Linker {
-
        /**
         * Flags for userToolLinks()
         */
@@ -41,10 +40,11 @@ class Linker {
         * Get the appropriate HTML attributes to add to the "a" element of an
         * external link, as created by [wikisyntax].
         *
-        * @param string $class the contents of the class attribute; if an empty
+        * @param string $class The contents of the class attribute; if an empty
         *   string is passed, which is the default value, defaults to 'external'.
         * @return string
-        * @deprecated since 1.18 Just pass the external class directly to something using Html::expandAttributes
+        * @deprecated since 1.18 Just pass the external class directly to something
+        *   using Html::expandAttributes.
         */
        static function getExternalLinkAttributes( $class = 'external' ) {
                wfDeprecated( __METHOD__, '1.18' );
@@ -54,10 +54,10 @@ class Linker {
        /**
         * Get the appropriate HTML attributes to add to the "a" element of an interwiki link.
         *
-        * @param string $title the title text for the link, URL-encoded (???) but
+        * @param string $title The title text for the link, URL-encoded (???) but
         *   not HTML-escaped
-        * @param string $unused unused
-        * @param string $class the contents of the class attribute; if an empty
+        * @param string $unused Unused
+        * @param string $class The contents of the class attribute; if an empty
         *   string is passed, which is the default value, defaults to 'external'.
         * @return string
         */
@@ -76,10 +76,10 @@ class Linker {
        /**
         * Get the appropriate HTML attributes to add to the "a" element of an internal link.
         *
-        * @param string $title the title text for the link, URL-encoded (???) but
+        * @param string $title The title text for the link, URL-encoded (???) but
         *   not HTML-escaped
-        * @param string $unused unused
-        * @param string $class the contents of the class attribute, default none
+        * @param string $unused Unused
+        * @param string $class The contents of the class attribute, default none
         * @return string
         */
        static function getInternalLinkAttributes( $title, $unused = null, $class = '' ) {
@@ -92,7 +92,7 @@ class Linker {
         * Get the appropriate HTML attributes to add to the "a" element of an internal
         * link, given the Title object for the page we want to link to.
         *
-        * @param $nt Title
+        * @param Title $nt
         * @param string $unused Unused
         * @param string $class The contents of the class attribute, default none
         * @param string|bool $title Optional (unescaped) string to use in the title
@@ -109,8 +109,8 @@ class Linker {
        /**
         * Common code for getLinkAttributesX functions
         *
-        * @param $title string
-        * @param $class string
+        * @param string $title
+        * @param string $class
         *
         * @return string
         */
@@ -271,10 +271,10 @@ class Linker {
        /**
         * Returns the Url used to link to a Title
         *
-        * @param $target Title
+        * @param Title $target
         * @param array $query query parameters
-        * @param $options Array
-        * @return String
+        * @param array $options
+        * @return string
         */
        private static function linkUrl( $target, $query, $options ) {
                wfProfileIn( __METHOD__ );
@@ -310,9 +310,9 @@ class Linker {
        /**
         * Returns the array of attributes used when linking to the Title $target
         *
-        * @param $target Title
-        * @param $attribs
-        * @param $options
+        * @param Title $target
+        * @param array $attribs
+        * @param array $options
         *
         * @return array
         */
@@ -374,7 +374,7 @@ class Linker {
        /**
         * Default text of the links to the Title $target
         *
-        * @param $target Title
+        * @param Title $target
         *
         * @return string
         */
@@ -389,21 +389,22 @@ class Linker {
                if ( $target->getPrefixedText() === '' && $target->hasFragment() ) {
                        return htmlspecialchars( $target->getFragment() );
                }
+
                return htmlspecialchars( $target->getPrefixedText() );
        }
 
        /**
-        * Make appropriate markup for a link to the current article. This is currently rendered
-        * as the bold link text. The calling sequence is the same as the other make*LinkObj static functions,
-        * despite $query not being used.
+        * Make appropriate markup for a link to the current article. This is
+        * currently rendered as the bold link text. The calling sequence is the
+        * same as the other make*LinkObj static functions, despite $query not
+        * being used.
         *
-        * @param $nt Title
+        * @param Title $nt
         * @param string $html [optional]
         * @param string $query [optional]
         * @param string $trail [optional]
         * @param string $prefix [optional]
         *
-        *
         * @return string
         */
        public static function makeSelfLinkObj( $nt, $html = '', $query = '', $trail = '', $prefix = '' ) {
@@ -419,7 +420,7 @@ class Linker {
         * This should be called after a method like Title::makeTitleSafe() returned
         * a value indicating that the title object is invalid.
         *
-        * @param $context IContextSource context to use to get the messages
+        * @param IContextSource $context Context to use to get the messages
         * @param int $namespace Namespace number
         * @param string $title Text of the title, without the namespace part
         * @return string
@@ -441,7 +442,7 @@ class Linker {
        }
 
        /**
-        * @param $title Title
+        * @param Title $title
         * @return Title
         */
        static function normaliseSpecialPage( Title $title ) {
@@ -461,7 +462,7 @@ class Linker {
         * Returns the filename part of an url.
         * Used as alternative text for external images.
         *
-        * @param $url string
+        * @param string $url
         *
         * @return string
         */
@@ -479,8 +480,8 @@ class Linker {
         * Return the code for images which were added via external links,
         * via Parser::maybeMakeExternalImage().
         *
-        * @param $url
-        * @param $alt
+        * @param string $url
+        * @param string $alt
         *
         * @return string
         */
@@ -491,7 +492,8 @@ class Linker {
                $img = '';
                $success = wfRunHooks( 'LinkerMakeExternalImage', array( &$url, &$alt, &$img ) );
                if ( !$success ) {
-                       wfDebug( "Hook LinkerMakeExternalImage changed the output of external image with url {$url} and alt text {$alt} to {$img}\n", true );
+                       wfDebug( "Hook LinkerMakeExternalImage changed the output of external image "
+                               . "with url {$url} and alt text {$alt} to {$img}\n", true );
                        return $img;
                }
                return Html::element( 'img',
@@ -504,10 +506,10 @@ class Linker {
         * Given parameters derived from [[Image:Foo|options...]], generate the
         * HTML that that syntax inserts in the page.
         *
-        * @param $parser Parser object
-        * @param $title Title object of the file (not the currently viewed page)
-        * @param $file File object, or false if it doesn't exist
-        * @param array $frameParams associative array of parameters external to the media handler.
+        * @param Parser $parser
+        * @param Title $title Title object of the file (not the currently viewed page)
+        * @param File $file File object, or false if it doesn't exist
+        * @param array $frameParams Associative array of parameters external to the media handler.
         *     Boolean parameters are indicated by presence or absence, the value is arbitrary and
         *     will often be false.
         *          thumbnail       If present, downscale and frame
@@ -530,14 +532,15 @@ class Linker {
         *
         * @param array $handlerParams Associative array of media handler parameters, to be passed
         *       to transform(). Typical keys are "width" and "page".
-        * @param string $time Timestamp of the file, set as false for current
+        * @param string|bool $time Timestamp of the file, set as false for current
         * @param string $query Query params for desc url
         * @param int|null $widthOption Used by the parser to remember the user preference thumbnailsize
         * @since 1.20
         * @return string HTML for an image, with links, wrappers, etc.
         */
-       public static function makeImageLink( /*Parser*/ $parser, Title $title, $file, $frameParams = array(),
-               $handlerParams = array(), $time = false, $query = "", $widthOption = null
+       public static function makeImageLink( /*Parser*/ $parser, Title $title,
+               $file, $frameParams = array(), $handlerParams = array(), $time = false,
+               $query = "", $widthOption = null
        ) {
                $res = null;
                $dummy = new DummyLinker;
@@ -587,26 +590,41 @@ class Linker {
                                $hp['width'] = $file->getWidth( $page );
                        }
 
-                       if ( isset( $fp['thumbnail'] ) || isset( $fp['manualthumb'] ) || isset( $fp['framed'] ) || isset( $fp['frameless'] ) || !$hp['width'] ) {
+                       if ( isset( $fp['thumbnail'] )
+                               || isset( $fp['manualthumb'] )
+                               || isset( $fp['framed'] )
+                               || isset( $fp['frameless'] )
+                               || !$hp['width']
+                       ) {
                                global $wgThumbLimits, $wgThumbUpright;
+
                                if ( $widthOption === null || !isset( $wgThumbLimits[$widthOption] ) ) {
                                        $widthOption = User::getDefaultOption( 'thumbsize' );
                                }
 
                                // Reduce width for upright images when parameter 'upright' is used
+                               $useSquare = !isset( $fp['upright'] );
                                if ( isset( $fp['upright'] ) && $fp['upright'] == 0 ) {
                                        $fp['upright'] = $wgThumbUpright;
                                }
-                               // For caching health: If width scaled down due to upright parameter, round to full __0 pixel to avoid the creation of a lot of odd thumbs
+
+                               // For caching health: If width scaled down due to upright
+                               // parameter, round to full __0 pixel to avoid the creation of a
+                               // lot of odd thumbs.
                                $prefWidth = isset( $fp['upright'] ) ?
                                        round( $wgThumbLimits[$widthOption] * $fp['upright'], -1 ) :
                                        $wgThumbLimits[$widthOption];
 
-                               // Use width which is smaller: real image width or user preference width
+                               // Use whichever is smaller: real image width or user preference width
                                // Unless image is scalable vector.
                                if ( !isset( $hp['height'] ) && ( $hp['width'] <= 0 ||
-                                               $prefWidth < $hp['width'] || $file->isVectorized() ) ) {
+                                               $prefWidth < $hp['width'] ||
+                                               ( $useSquare && $prefWidth < $file->getHeight( $page ) ) ||
+                                               $file->isVectorized() ) ) {
                                        $hp['width'] = $prefWidth;
+                                       if ( $useSquare ) {
+                                               $hp['height'] = $prefWidth;
+                                       }
                                }
                        }
                }
@@ -632,8 +650,9 @@ class Linker {
 
                if ( $file && isset( $fp['frameless'] ) ) {
                        $srcWidth = $file->getWidth( $page );
-                       # For "frameless" option: do not present an image bigger than the source (for bitmap-style images)
-                       # This is the same behavior as the "thumb" option does it already.
+                       # For "frameless" option: do not present an image bigger than the
+                       # source (for bitmap-style images). This is the same behavior as the
+                       # "thumb" option does it already.
                        if ( $srcWidth && !$file->mustRender() && $hp['width'] > $srcWidth ) {
                                $hp['width'] = $srcWidth;
                        }
@@ -713,15 +732,15 @@ class Linker {
 
        /**
         * Make HTML for a thumbnail including image, border and caption
-        * @param $title Title object
-        * @param $file File object or false if it doesn't exist
-        * @param $label String
-        * @param $alt String
-        * @param $align String
-        * @param $params Array
-        * @param $framed Boolean
-        * @param $manualthumb String
-        * @return mixed
+        * @param Title $title
+        * @param File|bool $file File object or false if it doesn't exist
+        * @param string $label
+        * @param string $alt
+        * @param string $align
+        * @param array $params
+        * @param bool $framed
+        * @param string $manualthumb
+        * @return string
         */
        public static function makeThumbLinkObj( Title $title, $file, $label = '', $alt,
                $align = 'right', $params = array(), $framed = false, $manualthumb = ""
@@ -741,13 +760,13 @@ class Linker {
        }
 
        /**
-        * @param $title Title
-        * @param $file File
+        * @param Title $title
+        * @param File $file
         * @param array $frameParams
         * @param array $handlerParams
         * @param bool $time
         * @param string $query
-        * @return mixed
+        * @return string
         */
        public static function makeThumbLink2( Title $title, $file, $frameParams = array(),
                $handlerParams = array(), $time = false, $query = ""
@@ -831,7 +850,9 @@ class Linker {
                        $fp['link-url'] = $url;
                }
 
-               $s = "<div class=\"thumb t{$fp['align']}\"><div class=\"thumbinner\" style=\"width:{$outerWidth}px;\">";
+               $s = "<div class=\"thumb t{$fp['align']}\">"
+                       . "<div class=\"thumbinner\" style=\"width:{$outerWidth}px;\">";
+
                if ( !$exists ) {
                        $s .= self::makeBrokenImageLinkObj( $title, $fp['title'], '', '', '', $time == true );
                        $zoomIcon = '';
@@ -845,7 +866,9 @@ class Linker {
                        $params = array(
                                'alt' => $fp['alt'],
                                'title' => $fp['title'],
-                               'img-class' => ( isset( $fp['class'] ) && $fp['class'] !== '' ? $fp['class'] . ' ' : '' ) . 'thumbimage'
+                               'img-class' => ( isset( $fp['class'] ) && $fp['class'] !== ''
+                                       ? $fp['class'] . ' '
+                                       : '' ) . 'thumbimage'
                        );
                        $params = self::getImageLinkMTOParams( $fp, $query ) + $params;
                        $s .= $thumb->toHtml( $params );
@@ -858,7 +881,8 @@ class Linker {
                                                'class' => 'internal',
                                                'title' => wfMessage( 'thumbnail-more' )->text() ),
                                                Html::element( 'img', array(
-                                                       'src' => $wgStylePath . '/common/images/magnify-clip' . ( $wgContLang->isRTL() ? '-rtl' : '' ) . '.png',
+                                                       'src' => $wgStylePath . '/common/images/magnify-clip'
+                                                               . ( $wgContLang->isRTL() ? '-rtl' : '' ) . '.png',
                                                        'width' => 15,
                                                        'height' => 11,
                                                        'alt' => "" ) ) ) );
@@ -874,7 +898,7 @@ class Linker {
         *
         * @param File $file
         * @param MediaTransformOutput $thumb
-        * @param array $hp image parameters
+        * @param array $hp Image parameters
         */
        public static function processResponsiveImages( $file, $thumb, $hp ) {
                global $wgResponsiveImages;
@@ -903,14 +927,16 @@ class Linker {
         * Make a "broken" link to an image
         *
         * @param Title $title
-        * @param string $label link label (plain text)
-        * @param string $query query string
+        * @param string $label Link label (plain text)
+        * @param string $query Query string
         * @param string $unused1 Unused parameter kept for b/c
         * @param string $unused2 Unused parameter kept for b/c
-        * @param bool $time a file of a certain timestamp was requested
+        * @param bool $time A file of a certain timestamp was requested
         * @return string
         */
-       public static function makeBrokenImageLinkObj( $title, $label = '', $query = '', $unused1 = '', $unused2 = '', $time = false ) {
+       public static function makeBrokenImageLinkObj( $title, $label = '',
+               $query = '', $unused1 = '', $unused2 = '', $time = false
+       ) {
                global $wgEnableUploads, $wgUploadMissingFileUrl, $wgUploadNavigationUrl;
                if ( ! $title instanceof Title ) {
                        return "<!-- ERROR -->" . htmlspecialchars( $label );
@@ -922,7 +948,9 @@ class Linker {
                $encLabel = htmlspecialchars( $label );
                $currentExists = $time ? ( wfFindFile( $title ) != false ) : false;
 
-               if ( ( $wgUploadMissingFileUrl || $wgUploadNavigationUrl || $wgEnableUploads ) && !$currentExists ) {
+               if ( ( $wgUploadMissingFileUrl || $wgUploadNavigationUrl || $wgEnableUploads )
+                       && !$currentExists
+               ) {
                        $redir = RepoGroup::singleton()->getLocalRepo()->checkRedirect( $title );
 
                        if ( $redir ) {
@@ -1013,7 +1041,8 @@ class Linker {
 
                if ( !wfRunHooks( 'LinkerMakeMediaLinkFile',
                        array( $title, $file, &$html, &$attribs, &$ret ) ) ) {
-                       wfDebug( "Hook LinkerMakeMediaLinkFile changed the output of link with url {$url} and text {$html} to {$ret}\n", true );
+                       wfDebug( "Hook LinkerMakeMediaLinkFile changed the output of link "
+                               . "with url {$url} and text {$html} to {$ret}\n", true );
                        return $ret;
                }
 
@@ -1025,6 +1054,8 @@ class Linker {
         * a message key from the link text.
         * Usage example: Linker::specialLink( 'Recentchanges' )
         *
+        * @param string $name
+        * @param string $key
         * @return string
         */
        public static function specialLink( $name, $key = '' ) {
@@ -1045,7 +1076,9 @@ class Linker {
         * @param Title|null $title Title object used for title specific link attributes
         * @return string
         */
-       public static function makeExternalLink( $url, $text, $escape = true, $linktype = '', $attribs = array(), $title = null ) {
+       public static function makeExternalLink( $url, $text, $escape = true,
+               $linktype = '', $attribs = array(), $title = null
+       ) {
                global $wgTitle;
                $class = "external";
                if ( $linktype ) {
@@ -1068,7 +1101,8 @@ class Linker {
                $success = wfRunHooks( 'LinkerMakeExternalLink',
                        array( &$url, &$text, &$link, &$attribs, $linktype ) );
                if ( !$success ) {
-                       wfDebug( "Hook LinkerMakeExternalLink changed the output of link with url {$url} and text {$text} to {$link}\n", true );
+                       wfDebug( "Hook LinkerMakeExternalLink changed the output of link "
+                               . "with url {$url} and text {$text} to {$link}\n", true );
                        return $link;
                }
                $attribs['href'] = $url;
@@ -1109,7 +1143,8 @@ class Linker {
         * @param string $userText User name or IP address
         * @param bool $redContribsWhenNoEdits Should the contributions link be
         *   red if the user has no edits?
-        * @param int $flags Customisation flags (e.g. Linker::TOOL_LINKS_NOBLOCK and Linker::TOOL_LINKS_EMAIL)
+        * @param int $flags Customisation flags (e.g. Linker::TOOL_LINKS_NOBLOCK
+        *   and Linker::TOOL_LINKS_EMAIL).
         * @param int $edits User edit count (optional, for performance)
         * @return string HTML fragment
         */
@@ -1209,7 +1244,7 @@ class Linker {
         * Generate a user link if the current user is allowed to view it
         * @param Revision $rev
         * @param bool $isPublic Show only if all users can see it
-        * @return String HTML fragment
+        * @return string HTML fragment
         */
        public static function revUserLink( $rev, $isPublic = false ) {
                if ( $rev->isDeleted( Revision::DELETED_USER ) && $isPublic ) {
@@ -1265,7 +1300,7 @@ class Linker {
         * @param string $comment
         * @param Title|null $title Title object (to generate link to the section in autocomment) or null
         * @param bool $local Whether section links should refer to local page
-        * @return mixed|String
+        * @return mixed|string
         */
        public static function formatComment( $comment, $title = null, $local = false ) {
                wfProfileIn( __METHOD__ );
@@ -1283,11 +1318,11 @@ class Linker {
                return $comment;
        }
 
-       /**
-        * @var Title
-        */
-       static $autocommentTitle;
-       static $autocommentLocal;
+       /** @var Title */
+       private static $autocommentTitle;
+
+       /** @var bool Whether section links should refer to local page */
+       private static $autocommentLocal;
 
        /**
         * Converts autogenerated comments in edit summaries into section links.
@@ -1317,7 +1352,7 @@ class Linker {
 
        /**
         * Helper function for Linker::formatAutocomments
-        * @param $match
+        * @param array $match
         * @return string
         */
        private static function formatAutocommentsCallback( $match ) {
@@ -1365,16 +1400,17 @@ class Linker {
                                $auto .= wfMessage( 'colon-separator' )->inContentLanguage()->escaped();
                        }
                        $auto = '<span class="autocomment">' . $auto . '</span>';
-                       $comment = $pre . $link . $wgLang->getDirMark() . '<span dir="auto">' . $auto . $post . '</span>';
+                       $comment = $pre . $link . $wgLang->getDirMark()
+                               . '<span dir="auto">' . $auto . $post . '</span>';
                }
                return $comment;
        }
 
-       /**
-        * @var Title
-        */
-       static $commentContextTitle;
-       static $commentLocal;
+       /** @var Title */
+       private static $commentContextTitle;
+
+       /** @var bool Whether section links should refer to local page */
+       private static $commentLocal;
 
        /**
         * Formats wiki links and media links in text; all other wiki formatting
@@ -1410,7 +1446,7 @@ class Linker {
        }
 
        /**
-        * @param $match
+        * @param array $match
         * @return mixed
         */
        protected static function formatLinksInCommentCallback( $match ) {
@@ -1475,16 +1511,21 @@ class Linker {
                }
                if ( $thelink ) {
                        // If the link is still valid, go ahead and replace it in!
-                       $comment = preg_replace( $linkRegexp, StringUtils::escapeRegexReplacement( $thelink ), $comment, 1 );
+                       $comment = preg_replace(
+                               $linkRegexp,
+                               StringUtils::escapeRegexReplacement( $thelink ),
+                               $comment,
+                               1
+                       );
                }
 
                return $comment;
        }
 
        /**
-        * @param $contextTitle Title
-        * @param $target
-        * @param $text
+        * @param Title $contextTitle
+        * @param string $target
+        * @param string $text
         * @return string
         */
        public static function normalizeSubpageLink( $contextTitle, $target, &$text ) {
@@ -1610,7 +1651,7 @@ class Linker {
        }
 
        /**
-        * @param $size
+        * @param int $size
         * @return string
         */
        public static function formatRevisionSize( $size ) {
@@ -1635,6 +1676,7 @@ class Linker {
        /**
         * Finish one or more sublevels on the Table of Contents
         *
+        * @param int $level
         * @return string
         */
        public static function tocUnindent( $level ) {
@@ -1644,6 +1686,11 @@ class Linker {
        /**
         * parameter level defines if we are on an indentation level
         *
+        * @param string $anchor
+        * @param string $tocline
+        * @param string $tocnumber
+        * @param string $level
+        * @param string|bool $sectionIndex
         * @return string
         */
        public static function tocLine( $anchor, $tocline, $tocnumber, $level, $sectionIndex = false ) {
@@ -1671,7 +1718,7 @@ class Linker {
         * Wraps the TOC in a table and provides the hide/collapse javascript.
         *
         * @param string $toc Html of the Table Of Contents
-        * @param string|Language|false $lang Language for the toc title, defaults to user language
+        * @param string|Language|bool $lang Language for the toc title, defaults to user language
         * @return string Full html of the TOC
         */
        public static function tocList( $toc, $lang = false ) {
@@ -1720,15 +1767,17 @@ class Linker {
         * @param string $attribs Any attributes for the headline, starting with
         *   a space and ending with '>'
         *   This *must* be at least '>' for no attribs
-        * @param string $anchor the anchor to give the headline (the bit after the #)
-        * @param string $html html for the text of the header
+        * @param string $anchor The anchor to give the headline (the bit after the #)
+        * @param string $html Html for the text of the header
         * @param string $link HTML to add for the section edit link
-        * @param bool|string $legacyAnchor a second, optional anchor to give for
+        * @param bool|string $legacyAnchor A second, optional anchor to give for
         *   backward compatibility (false to omit)
         *
         * @return string HTML headline
         */
-       public static function makeHeadline( $level, $attribs, $anchor, $html, $link, $legacyAnchor = false ) {
+       public static function makeHeadline( $level, $attribs, $anchor, $html,
+               $link, $legacyAnchor = false
+       ) {
                $ret = "<h$level$attribs"
                        . "<span class=\"mw-headline\" id=\"$anchor\">$html</span>"
                        . $link
@@ -1742,6 +1791,7 @@ class Linker {
        /**
         * Split a link trail, return the "inside" portion and the remainder of the trail
         * as a two-element array
+        * @param string $trail
         * @return array
         */
        static function splitTrail( $trail ) {
@@ -1778,15 +1828,18 @@ class Linker {
         *
         * If the option noBrackets is set the rollback link wont be enclosed in []
         *
-        * @param $rev Revision object
-        * @param $context IContextSource context to use or null for the main context.
-        * @param $options array
+        * @param Revision $rev
+        * @param IContextSource $context Context to use or null for the main context.
+        * @param array $options
         * @return string
         */
-       public static function generateRollback( $rev, IContextSource $context = null, $options = array( 'verify' ) ) {
+       public static function generateRollback( $rev, IContextSource $context = null,
+               $options = array( 'verify' )
+       ) {
                if ( $context === null ) {
                        $context = RequestContext::getMain();
                }
+
                $editCount = false;
                if ( in_array( 'verify', $options ) ) {
                        $editCount = self::getRollbackEditCount( $rev, true );
@@ -1815,9 +1868,9 @@ class Linker {
         * Returns null if $wgShowRollbackEditCount is disabled or false if $verify
         * is set and the user is the only contributor of the page.
         *
-        * @param $rev Revision object
+        * @param Revision $rev
         * @param bool $verify Try to verify that this revision can really be rolled back
-        * @return integer|bool|null
+        * @return int|bool|null
         */
        public static function getRollbackEditCount( $rev, $verify ) {
                global $wgShowRollbackEditCount;
@@ -1846,9 +1899,13 @@ class Linker {
                $moreRevs = false;
                foreach ( $res as $row ) {
                        if ( $rev->getRawUserText() != $row->rev_user_text ) {
-                               if ( $verify && ( $row->rev_deleted & Revision::DELETED_TEXT || $row->rev_deleted & Revision::DELETED_USER ) ) {
-                                       // If the user or the text of the revision we might rollback to is deleted in some way we can't rollback
-                                       // Similar to the sanity checks in WikiPage::commitRollback
+                               if ( $verify &&
+                                       ( $row->rev_deleted & Revision::DELETED_TEXT
+                                               || $row->rev_deleted & Revision::DELETED_USER
+                               ) ) {
+                                       // If the user or the text of the revision we might rollback
+                                       // to is deleted in some way we can't rollback. Similar to
+                                       // the sanity checks in WikiPage::commitRollback.
                                        return false;
                                }
                                $moreRevs = true;
@@ -1874,7 +1931,9 @@ class Linker {
         * @param int $editCount Number of edits that would be reverted
         * @return string HTML fragment
         */
-       public static function buildRollbackLink( $rev, IContextSource $context = null, $editCount = false ) {
+       public static function buildRollbackLink( $rev, IContextSource $context = null,
+               $editCount = false
+       ) {
                global $wgShowRollbackEditCount, $wgMiserMode;
 
                // To config which pages are effected by miser mode
@@ -1888,7 +1947,10 @@ class Linker {
                $query = array(
                        'action' => 'rollback',
                        'from' => $rev->getUserText(),
-                       'token' => $context->getUser()->getEditToken( array( $title->getPrefixedText(), $rev->getUserText() ) ),
+                       'token' => $context->getUser()->getEditToken( array(
+                               $title->getPrefixedText(),
+                               $rev->getUserText()
+                       ) ),
                );
                if ( $context->getRequest()->getBool( 'bot' ) ) {
                        $query['bot'] = '1';
@@ -1905,13 +1967,17 @@ class Linker {
                        }
                }
 
-               if ( !$disableRollbackEditCount && is_int( $wgShowRollbackEditCount ) && $wgShowRollbackEditCount > 0 ) {
+               if ( !$disableRollbackEditCount
+                       && is_int( $wgShowRollbackEditCount )
+                       && $wgShowRollbackEditCount > 0
+               ) {
                        if ( !is_numeric( $editCount ) ) {
                                $editCount = self::getRollbackEditCount( $rev, false );
                        }
 
                        if ( $editCount > $wgShowRollbackEditCount ) {
-                               $editCount_output = $context->msg( 'rollbacklinkcount-morethan' )->numParams( $wgShowRollbackEditCount )->parse();
+                               $editCount_output = $context->msg( 'rollbacklinkcount-morethan' )
+                                       ->numParams( $wgShowRollbackEditCount )->parse();
                        } else {
                                $editCount_output = $context->msg( 'rollbacklinkcount' )->numParams( $editCount )->parse();
                        }
@@ -1949,7 +2015,9 @@ class Linker {
         * @param Title|Message|string|null $more An escaped link for "More..." of the templates
         * @return string HTML output
         */
-       public static function formatTemplates( $templates, $preview = false, $section = false, $more = null ) {
+       public static function formatTemplates( $templates, $preview = false,
+               $section = false, $more = null
+       ) {
                global $wgLang;
                wfProfileIn( __METHOD__ );
 
@@ -2040,7 +2108,7 @@ class Linker {
         *
         * @param array $hiddencats Array of hidden categories from Article::getHiddenCategories
         *   or similar
-        * @return String HTML output
+        * @return string HTML output
         */
        public static function formatHiddenCategories( $hiddencats ) {
                wfProfileIn( __METHOD__ );
@@ -2053,7 +2121,10 @@ class Linker {
                        $outText .= "</div><ul>\n";
 
                        foreach ( $hiddencats as $titleObj ) {
-                               $outText .= '<li>' . self::link( $titleObj, null, array(), array(), 'known' ) . "</li>\n"; # If it's hidden, it must exist - no need to check with a LinkBatch
+                               # If it's hidden, it must exist - no need to check with a LinkBatch
+                               $outText .= '<li>'
+                                       . self::link( $titleObj, null, array(), array(), 'known' )
+                                       . "</li>\n";
                        }
                        $outText .= '</ul>';
                }
@@ -2066,7 +2137,7 @@ class Linker {
         * unit (B, KB, MB or GB) according to the magnitude in question
         *
         * @param int $size Size to format
-        * @return String
+        * @return string
         */
        public static function formatSize( $size ) {
                global $wgLang;
@@ -2080,7 +2151,7 @@ class Linker {
         * element than the id, for reverse-compatibility, etc.)
         *
         * @param string $name Id of the element, minus prefixes.
-        * @param string|null $options null or the string 'withaccess' to add an access-
+        * @param string|null $options Null or the string 'withaccess' to add an access-
         *   key hint
         * @return string Contents of the title attribute (which you must HTML-
         *   escape), or false for no title attribute
@@ -2105,11 +2176,12 @@ class Linker {
                if ( $options == 'withaccess' ) {
                        $accesskey = self::accesskey( $name );
                        if ( $accesskey !== false ) {
+                               // Should be build the same as in jquery.accessKeyLabel.js
                                if ( $tooltip === false || $tooltip === '' ) {
-                                       $tooltip = wfMessage( 'brackets', $accesskey )->escaped();
+                                       $tooltip = wfMessage( 'brackets', $accesskey )->text();
                                } else {
-                                       $tooltip .= wfMessage( 'word-separator' )->escaped();
-                                       $tooltip .= wfMessage( 'brackets', $accesskey )->escaped();
+                                       $tooltip .= wfMessage( 'word-separator' )->text();
+                                       $tooltip .= wfMessage( 'brackets', $accesskey )->text();
                                }
                        }
                }
@@ -2118,7 +2190,7 @@ class Linker {
                return $tooltip;
        }
 
-       static $accesskeycache;
+       private static $accesskeycache;
 
        /**
         * Given the id of an interface element, constructs the appropriate
@@ -2215,7 +2287,11 @@ class Linker {
                $html = wfMessage( $msgKey )->escaped();
                $tag = $restricted ? 'strong' : 'span';
                $link = self::link( $sp, $html, array(), $query, array( 'known', 'noclasses' ) );
-               return Xml::tags( $tag, array( 'class' => 'mw-revdelundel-link' ), wfMessage( 'parentheses' )->rawParams( $link )->escaped() );
+               return Xml::tags(
+                       $tag,
+                       array( 'class' => 'mw-revdelundel-link' ),
+                       wfMessage( 'parentheses' )->rawParams( $link )->escaped()
+               );
        }
 
        /**
@@ -2244,11 +2320,11 @@ class Linker {
         *
         * @param Title $nt The title object to make the link from, e.g. from Title::newFromText.
         * @param string $text Link text
-        * @param string $query optional query part
-        * @param string $trail optional trail. Alphabetic characters at the start of this string will
+        * @param string $query Optional query part
+        * @param string $trail Optional trail. Alphabetic characters at the start of this string will
         *   be included in the link text. Other characters will be appended after
         *   the end of the link.
-        * @param string $prefix optional prefix. As trail, only before instead of after.
+        * @param string $prefix Optional prefix. As trail, only before instead of after.
         * @return string
         */
        static function makeLinkObj( $nt, $text = '', $query = '', $trail = '', $prefix = '' ) {
@@ -2309,6 +2385,7 @@ class Linker {
 
        /**
         * Returns the attributes for the tooltip and access key.
+        * @param string $name
         * @return array
         */
        public static function tooltipAndAccesskeyAttribs( $name ) {
@@ -2330,6 +2407,8 @@ class Linker {
 
        /**
         * Returns raw bits of HTML, use titleAttrib()
+        * @param string $name
+        * @param array|null $options
         * @return null|string
         */
        public static function tooltip( $name, $options = null ) {
index 9de2c0a..447dde3 100644 (file)
@@ -77,7 +77,8 @@ class MWTimestamp {
                $da = array();
                $strtime = '';
 
-               if ( !$ts || $ts === "\0\0\0\0\0\0\0\0\0\0\0\0\0\0" ) { // We want to catch 0, '', null... but not date strings starting with a letter.
+               // We want to catch 0, '', null... but not date strings starting with a letter.
+               if ( !$ts || $ts === "\0\0\0\0\0\0\0\0\0\0\0\0\0\0" ) {
                        $uts = time();
                        $strtime = "@$uts";
                } elseif ( preg_match( '/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)$/D', $ts, $da ) ) {
@@ -93,18 +94,41 @@ class MWTimestamp {
                        # TS_ORACLE // session altered to DD-MM-YYYY HH24:MI:SS.FF6
                        $strtime = preg_replace( '/(\d\d)\.(\d\d)\.(\d\d)(\.(\d+))?/', "$1:$2:$3",
                                        str_replace( '+00:00', 'UTC', $ts ) );
-               } elseif ( preg_match( '/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.*\d*)?Z?$/', $ts, $da ) ) {
+               } elseif ( preg_match(
+                       '/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.*\d*)?Z?$/',
+                       $ts,
+                       $da
+               ) ) {
                        # TS_ISO_8601
-               } elseif ( preg_match( '/^(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})(?:\.*\d*)?Z?$/', $ts, $da ) ) {
+               } elseif ( preg_match(
+                       '/^(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})(?:\.*\d*)?Z?$/',
+                       $ts,
+                       $da
+               ) ) {
                        #TS_ISO_8601_BASIC
-               } elseif ( preg_match( '/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)\.*\d*[\+\- ](\d\d)$/', $ts, $da ) ) {
+               } elseif ( preg_match(
+                       '/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)\.*\d*[\+\- ](\d\d)$/',
+                       $ts,
+                       $da
+               ) ) {
                        # TS_POSTGRES
-               } elseif ( preg_match( '/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)\.*\d* GMT$/', $ts, $da ) ) {
+               } elseif ( preg_match(
+                       '/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)\.*\d* GMT$/',
+                       $ts,
+                       $da
+               ) ) {
                        # TS_POSTGRES
-               } elseif ( preg_match( '/^[ \t\r\n]*([A-Z][a-z]{2},[ \t\r\n]*)?' . # Day of week
-                                                               '\d\d?[ \t\r\n]*[A-Z][a-z]{2}[ \t\r\n]*\d{2}(?:\d{2})?' .  # dd Mon yyyy
-                                                               '[ \t\r\n]*\d\d[ \t\r\n]*:[ \t\r\n]*\d\d[ \t\r\n]*:[ \t\r\n]*\d\d/S', $ts ) ) { # hh:mm:ss
-                       # TS_RFC2822, accepting a trailing comment. See http://www.squid-cache.org/mail-archive/squid-users/200307/0122.html / r77171
+               } elseif ( preg_match(
+                       # Day of week
+                       '/^[ \t\r\n]*([A-Z][a-z]{2},[ \t\r\n]*)?' .
+                       # dd Mon yyyy
+                       '\d\d?[ \t\r\n]*[A-Z][a-z]{2}[ \t\r\n]*\d{2}(?:\d{2})?' .
+                       # hh:mm:ss
+                       '[ \t\r\n]*\d\d[ \t\r\n]*:[ \t\r\n]*\d\d[ \t\r\n]*:[ \t\r\n]*\d\d/S',
+                       $ts
+               ) ) {
+                       # TS_RFC2822, accepting a trailing comment.
+                       # See http://www.squid-cache.org/mail-archive/squid-users/200307/0122.html / r77171
                        # The regex is a superset of rfc2822 for readability
                        $strtime = strtok( $ts, ';' );
                } elseif ( preg_match( '/^[A-Z][a-z]{5,8}, \d\d-[A-Z][a-z]{2}-\d{2} \d\d:\d\d:\d\d/', $ts ) ) {
@@ -171,12 +195,17 @@ class MWTimestamp {
         * @since 1.20
         * @since 1.22 Uses Language::getHumanTimestamp to produce the timestamp
         *
-        * @param MWTimestamp|null $relativeTo The base timestamp to compare to (defaults to now)
-        * @param User|null $user User the timestamp is being generated for (or null to use main context's user)
-        * @param Language|null $lang Language to use to make the human timestamp (or null to use main context's language)
+        * @param MWTimestamp|null $relativeTo The base timestamp to compare to
+        *   (defaults to now).
+        * @param User|null $user User the timestamp is being generated for (or null
+        *   to use main context's user).
+        * @param Language|null $lang Language to use to make the human timestamp
+        *   (or null to use main context's language).
         * @return string Formatted timestamp
         */
-       public function getHumanTimestamp( MWTimestamp $relativeTo = null, User $user = null, Language $lang = null ) {
+       public function getHumanTimestamp( MWTimestamp $relativeTo = null,
+               User $user = null, Language $lang = null
+       ) {
                if ( $relativeTo === null ) {
                        $relativeTo = new self();
                }
@@ -298,11 +327,13 @@ class MWTimestamp {
 
                $ts = '';
                $diff = $this->diff( $relativeTo );
-               if ( wfRunHooks( 'GetRelativeTimestamp', array( &$ts, &$diff, $this, $relativeTo, $user, $lang ) ) ) {
+               if ( wfRunHooks(
+                       'GetRelativeTimestamp',
+                       array( &$ts, &$diff, $this, $relativeTo, $user, $lang )
+               ) ) {
                        $seconds = ( ( ( $diff->days * 24 + $diff->h ) * 60 + $diff->i ) * 60 + $diff->s );
                        $ts = wfMessage( 'ago', $lang->formatDuration( $seconds, $chosenIntervals ) )
-                               ->inLanguage( $lang )
-                               ->text();
+                               ->inLanguage( $lang )->text();
                }
 
                return $ts;
@@ -322,7 +353,8 @@ class MWTimestamp {
         *
         * @since 1.22
         * @param MWTimestamp $relativeTo Base time to calculate difference from
-        * @return DateInterval|bool The DateInterval object representing the difference between the two dates or false on failure
+        * @return DateInterval|bool The DateInterval object representing the
+        *   difference between the two dates or false on failure
         */
        public function diff( MWTimestamp $relativeTo ) {
                return $this->timestamp->diff( $relativeTo->timestamp );
@@ -332,7 +364,7 @@ class MWTimestamp {
         * Set the timezone of this timestamp to the specified timezone.
         *
         * @since 1.22
-        * @param String $timezone Timezone to set
+        * @param string $timezone Timezone to set
         * @throws TimestampException
         */
        public function setTimezone( $timezone ) {
index e301cea..3e327c3 100644 (file)
  * @ingroup Parser
  */
 class MagicWord {
-       /**#@+
-        * @private
-        */
-       var $mId, $mSynonyms, $mCaseSensitive;
-       var $mRegex = '';
-       var $mRegexStart = '';
-       var $mRegexStartToEnd = '';
-       var $mBaseRegex = '';
-       var $mVariableRegex = '';
-       var $mVariableStartToEndRegex = '';
-       var $mModified = false;
-       var $mFound = false;
+       /**#@-*/
+
+       /** @var int */
+       public $mId;
+
+       /** @var array */
+       public $mSynonyms;
+
+       /** @var bool */
+       public $mCaseSensitive;
+
+       /** @var string */
+       private $mRegex = '';
+
+       /** @var string */
+       private $mRegexStart = '';
+
+       /** @var string */
+       private $mRegexStartToEnd = '';
+
+       /** @var string */
+       private $mBaseRegex = '';
+
+       /** @var string */
+       private $mVariableRegex = '';
+
+       /** @var string */
+       private $mVariableStartToEndRegex = '';
+
+       /** @var bool */
+       private $mModified = false;
+
+       /** @var bool */
+       private $mFound = false;
 
        static public $mVariableIDsInitialised = false;
        static public $mVariableIDs = array(
@@ -194,7 +216,7 @@ class MagicWord {
                'numberofadmins' => 3600,
                'numberofviews' => 3600,
                'numberingroup' => 3600,
-               );
+       );
 
        static public $mDoubleUnderscoreIDs = array(
                'notoc',
@@ -231,7 +253,7 @@ class MagicWord {
        /**
         * Factory: creates an object representing an ID
         *
-        * @param $id
+        * @param int $id
         *
         * @return MagicWord
         */
@@ -269,8 +291,8 @@ class MagicWord {
        /**
         * Allow external reads of TTL array
         *
-        * @param $id int
-        * @return array
+        * @param int $id
+        * @return int
         */
        static function getCacheTTL( $id ) {
                if ( array_key_exists( $id, self::$mCacheTTLs ) ) {
@@ -304,7 +326,7 @@ class MagicWord {
        /**
         * Initialises this object with an ID
         *
-        * @param $id
+        * @param int $id
         * @throws MWException
         */
        function load( $id ) {
@@ -351,8 +373,8 @@ class MagicWord {
         * first string is longer, the same length or shorter than the second
         * string.
         *
-        * @param $s1 string
-        * @param $s2 string
+        * @param string $s1
+        * @param string $s2
         *
         * @return int
         */
@@ -435,7 +457,7 @@ class MagicWord {
        /**
         * Returns true if the text contains the word
         *
-        * @param $text string
+        * @param string $text
         *
         * @return bool
         */
@@ -446,7 +468,7 @@ class MagicWord {
        /**
         * Returns true if the text starts with the word
         *
-        * @param $text string
+        * @param string $text
         *
         * @return bool
         */
@@ -457,7 +479,7 @@ class MagicWord {
        /**
         * Returns true if the text matched the word
         *
-        * @param $text string
+        * @param string $text
         *
         * @return bool
         * @since 1.23
@@ -472,7 +494,7 @@ class MagicWord {
         * part in the regex and the matched variable part ($1) if there
         * is one.
         *
-        * @param $text string
+        * @param string $text
         *
         * @return string
         */
@@ -501,23 +523,33 @@ class MagicWord {
         * Returns true if the text matches the word, and alters the
         * input string, removing all instances of the word
         *
-        * @param $text string
+        * @param string $text
         *
         * @return bool
         */
        function matchAndRemove( &$text ) {
                $this->mFound = false;
-               $text = preg_replace_callback( $this->getRegex(), array( &$this, 'pregRemoveAndRecord' ), $text );
+               $text = preg_replace_callback(
+                       $this->getRegex(),
+                       array( &$this, 'pregRemoveAndRecord' ),
+                       $text
+               );
+
                return $this->mFound;
        }
 
        /**
-        * @param $text
+        * @param string $text
         * @return bool
         */
        function matchStartAndRemove( &$text ) {
                $this->mFound = false;
-               $text = preg_replace_callback( $this->getRegexStart(), array( &$this, 'pregRemoveAndRecord' ), $text );
+               $text = preg_replace_callback(
+                       $this->getRegexStart(),
+                       array( &$this, 'pregRemoveAndRecord' ),
+                       $text
+               );
+
                return $this->mFound;
        }
 
@@ -534,14 +566,19 @@ class MagicWord {
        /**
         * Replaces the word with something else
         *
-        * @param $replacement
-        * @param $subject
-        * @param $limit int
+        * @param string $replacement
+        * @param string $subject
+        * @param int $limit
         *
         * @return string
         */
        function replace( $replacement, $subject, $limit = -1 ) {
-               $res = preg_replace( $this->getRegex(), StringUtils::escapeRegexReplacement( $replacement ), $subject, $limit );
+               $res = preg_replace(
+                       $this->getRegex(),
+                       StringUtils::escapeRegexReplacement( $replacement ),
+                       $subject,
+                       $limit
+               );
                $this->mModified = $res !== $subject;
                return $res;
        }
@@ -551,8 +588,8 @@ class MagicWord {
         * Calls back a function to determine what to replace xxx with
         * Input word must contain $1
         *
-        * @param $text string
-        * @param $callback
+        * @param string $text
+        * @param callable $callback
         *
         * @return string
         */
@@ -589,7 +626,7 @@ class MagicWord {
        /**
         * Accesses the synonym list directly
         *
-        * @param $i int
+        * @param int $i
         *
         * @return string
         */
@@ -621,9 +658,9 @@ class MagicWord {
         * $result. The return value is true if something was replaced.
         * @todo Should this be static? It doesn't seem to be used at all
         *
-        * @param $magicarr
-        * @param $subject
-        * @param $result
+        * @param array $magicarr
+        * @param string $subject
+        * @param string $result
         *
         * @return bool
         */
@@ -644,8 +681,8 @@ class MagicWord {
         * Adds all the synonyms of this MagicWord to an array, to allow quick
         * lookup in a list of magic words
         *
-        * @param $array
-        * @param $value
+        * @param array $array
+        * @param string $value
         */
        function addToArray( &$array, $value ) {
                global $wgContLang;
@@ -674,13 +711,21 @@ class MagicWord {
  * @ingroup Parser
  */
 class MagicWordArray {
-       var $names = array();
-       var $hash;
-       var $baseRegex, $regex;
-       var $matches;
+       /** @var array */
+       public $names = array();
+
+       /** @var array */
+       private $hash;
+
+       private $baseRegex;
+
+       private $regex;
+
+       /** @todo Unused? */
+       private $matches;
 
        /**
-        * @param $names array
+        * @param array $names
         */
        function __construct( $names = array() ) {
                $this->names = $names;
@@ -689,7 +734,7 @@ class MagicWordArray {
        /**
         * Add a magic word by name
         *
-        * @param $name string
+        * @param string $name
         */
        public function add( $name ) {
                $this->names[] = $name;
@@ -699,7 +744,7 @@ class MagicWordArray {
        /**
         * Add a number of magic words by name
         *
-        * @param $names array
+        * @param array $names
         */
        public function addArray( $names ) {
                $this->names = array_merge( $this->names, array_values( $names ) );
@@ -824,7 +869,7 @@ class MagicWordArray {
         * Returns array(magic word ID, parameter value)
         * If there is no parameter value, that element will be false.
         *
-        * @param $m array
+        * @param array $m
         *
         * @throws MWException
         * @return array
@@ -855,7 +900,7 @@ class MagicWordArray {
         * parameter in the second element.
         * Both elements are false if there was no match.
         *
-        * @param $text string
+        * @param string $text
         *
         * @return array
         */
@@ -876,7 +921,7 @@ class MagicWordArray {
         * Match some text, without parameter capture
         * Returns the magic word name, or false if there was no capture
         *
-        * @param $text string
+        * @param string $text
         *
         * @return string|bool False on failure
         */
@@ -897,7 +942,7 @@ class MagicWordArray {
         * Returns an associative array, ID => param value, for all items that match
         * Removes the matched items from the input string (passed by reference)
         *
-        * @param $text string
+        * @param string $text
         *
         * @return array
         */
@@ -924,7 +969,7 @@ class MagicWordArray {
         * Return false if no match found and $text is not modified.
         * Does not match parameters.
         *
-        * @param $text string
+        * @param string $text
         *
         * @return int|bool False on failure
         */
index f46c872..826d55b 100644 (file)
@@ -443,7 +443,7 @@ class Message {
         *
         * @since 1.22
         *
-        * @param number|number[] [$param,...] Time period parameters, or a single argument that is
+        * @param int|int[] [$param,...] Time period parameters, or a single argument that is
         * an array of time period parameters.
         *
         * @return Message $this
@@ -508,7 +508,7 @@ class Message {
         *
         * @since 1.19
         *
-        * @param $context IContextSource
+        * @param IContextSource $context
         *
         * @return Message $this
         */
@@ -604,7 +604,7 @@ class Message {
         *
         * @since 1.18
         *
-        * @param $title Title object
+        * @param Title $title
         *
         * @return Message $this
         */
@@ -659,10 +659,7 @@ class Message {
                # Maybe transform using the full parser
                if ( $this->format === 'parse' ) {
                        $string = $this->parseText( $string );
-                       $m = array();
-                       if ( preg_match( '/^<p>(.*)\n?<\/p>\n?$/sU', $string, $m ) ) {
-                               $string = $m[1];
-                       }
+                       $string = Parser::stripOuterParagraph( $string );
                } elseif ( $this->format === 'block-parse' ) {
                        $string = $this->parseText( $string );
                } elseif ( $this->format === 'text' ) {
@@ -890,7 +887,7 @@ class Message {
         * @param string $message The message text.
         * @param string $type Either "before" or "after".
         *
-        * @return String
+        * @return string
         */
        protected function replaceParameters( $message, $type = 'before' ) {
                $replacementKeys = array();
@@ -960,7 +957,14 @@ class Message {
         * @return string Wikitext parsed into HTML.
         */
        protected function parseText( $string ) {
-               $out = MessageCache::singleton()->parse( $string, $this->title, /*linestart*/true, $this->interface, $this->language );
+               $out = MessageCache::singleton()->parse(
+                       $string,
+                       $this->title,
+                       /*linestart*/true,
+                       $this->interface,
+                       $this->language
+               );
+
                return $out instanceof ParserOutput ? $out->getText() : $out;
        }
 
@@ -974,7 +978,12 @@ class Message {
         * @return string Wikitext with {{-constructs replaced with their values.
         */
        protected function transformText( $string ) {
-               return MessageCache::singleton()->transform( $string, $this->interface, $this->language, $this->title );
+               return MessageCache::singleton()->transform(
+                       $string,
+                       $this->interface,
+                       $this->language,
+                       $this->title
+               );
        }
 
        /**
index 7e1c745..5725898 100644 (file)
  * constituent messages or the resource itself is changed.
  */
 class MessageBlobStore {
-
        /**
         * Get the message blobs for a set of modules
         *
-        * @param $resourceLoader ResourceLoader object
+        * @param ResourceLoader $resourceLoader
         * @param array $modules Array of module objects keyed by module name
         * @param string $lang Language code
         * @return array An array mapping module names to message blobs
@@ -68,9 +67,9 @@ class MessageBlobStore {
         * present, it is not regenerated; instead, the preexisting blob
         * is fetched and returned.
         *
-        * @param string $name module name
-        * @param $module ResourceLoaderModule object
-        * @param string $lang language code
+        * @param string $name Module name
+        * @param ResourceLoaderModule $module
+        * @param string $lang Language code
         * @return mixed Message blob or false if the module has no messages
         */
        public static function insertMessageBlob( $name, ResourceLoaderModule $module, $lang ) {
@@ -125,10 +124,11 @@ class MessageBlobStore {
        /**
         * Update the message blob for a given module in a given language
         *
-        * @param string $name module name
-        * @param $module ResourceLoaderModule object
-        * @param string $lang language code
-        * @return String Regenerated message blob, or null if there was no blob for the given module/language pair
+        * @param string $name Module name
+        * @param ResourceLoaderModule $module
+        * @param string $lang Language code
+        * @return string Regenerated message blob, or null if there was no blob for
+        *   the given module/language pair.
         */
        public static function updateModule( $name, ResourceLoaderModule $module, $lang ) {
                $dbw = wfGetDB( DB_MASTER );
@@ -195,7 +195,7 @@ class MessageBlobStore {
        /**
         * Update a single message in all message blobs it occurs in.
         *
-        * @param string $key message key
+        * @param string $key Message key
         */
        public static function updateMessage( $key ) {
                try {
@@ -256,9 +256,9 @@ class MessageBlobStore {
        /**
         * Create an update queue for updateMessage()
         *
-        * @param string $key message key
-        * @param array $prevUpdates updates queue to refresh or null to build a fresh update queue
-        * @return Array: updates queue
+        * @param string $key Message key
+        * @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 ) {
                $dbw = wfGetDB( DB_MASTER );
@@ -307,10 +307,10 @@ class MessageBlobStore {
        /**
         * Reencode a message blob with the updated value for a message
         *
-        * @param string $blob message blob (JSON object)
-        * @param string $key message key
-        * @param string $lang language code
-        * @return Message blob with $key replaced with its new value
+        * @param string $blob Message blob (JSON object)
+        * @param string $key Message key
+        * @param string $lang Language code
+        * @return string Message blob with $key replaced with its new value
         */
        private static function reencodeBlob( $blob, $key, $lang ) {
                $decoded = FormatJson::decode( $blob, true );
@@ -323,14 +323,15 @@ class MessageBlobStore {
         * Get the message blobs for a set of modules from the database.
         * Modules whose blobs are not in the database are silently dropped.
         *
-        * @param $resourceLoader ResourceLoader object
-        * @param array $modules of module names
-        * @param string $lang language code
+        * @param ResourceLoader $resourceLoader
+        * @param array $modules Array of module names
+        * @param string $lang Language code
         * @throws MWException
         * @return array Array mapping module names to blobs
         */
        private static function getFromDB( ResourceLoader $resourceLoader, $modules, $lang ) {
                global $wgCacheEpoch;
+
                $retval = array();
                $dbr = wfGetDB( DB_SLAVE );
                $res = $dbr->select( 'msg_resource',
@@ -345,10 +346,14 @@ class MessageBlobStore {
                                // This shouldn't be possible
                                throw new MWException( __METHOD__ . ' passed an invalid module name' );
                        }
+
                        // Update the module's blobs if the set of messages changed or if the blob is
                        // older than $wgCacheEpoch
-                       if ( array_keys( FormatJson::decode( $row->mr_blob, true ) ) !== array_values( array_unique( $module->getMessages() ) ) ||
-                                       wfTimestamp( TS_MW, $row->mr_timestamp ) <= $wgCacheEpoch ) {
+                       $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
+                       ) {
                                $retval[$row->mr_resource] = self::updateModule( $row->mr_resource, $module, $lang );
                        } else {
                                $retval[$row->mr_resource] = $row->mr_blob;
@@ -361,9 +366,9 @@ class MessageBlobStore {
        /**
         * Generate the message blob for a given module in a given language.
         *
-        * @param $module ResourceLoaderModule object
-        * @param string $lang language code
-        * @return String: JSON object
+        * @param ResourceLoaderModule $module
+        * @param string $lang Language code
+        * @return string JSON object
         */
        private static function generateMessageBlob( ResourceLoaderModule $module, $lang ) {
                $messages = array();
index b5c0c7d..582ba60 100644 (file)
@@ -142,30 +142,29 @@ END_STRING
  * of MimeMagic. Please use MimeMagic::singleton() to get that instance.
  */
 class MimeMagic {
-
        /**
-        * Mapping of media types to arrays of mime types.
+        * @var array Mapping of media types to arrays of mime types.
         * This is used by findMediaType and getMediaType, respectively
         */
-       var $mMediaTypes = null;
+       protected $mMediaTypes = null;
 
-       /** Map of mime type aliases
+       /** @var array Map of mime type aliases
         */
-       var $mMimeTypeAliases = null;
+       protected $mMimeTypeAliases = null;
 
-       /** map of mime types to file extensions (as a space separated list)
+       /** @var array Map of mime types to file extensions (as a space separated list)
         */
-       var $mMimeToExt = null;
+       protected $mMimeToExt = null;
 
-       /** map of file extensions types to mime types (as a space separated list)
+       /** @var array Map of file extensions types to mime types (as a space separated list)
         */
-       var $mExtToMime = null;
+       public $mExtToMime = null;
 
-       /** IEContentAnalyzer instance
+       /** @var IEContentAnalyzer
         */
-       var $mIEAnalyzer;
+       protected $mIEAnalyzer;
 
-       /** The singleton instance
+       /** @var MimeMagic The singleton instance
         */
        private static $instance = null;
 
@@ -323,13 +322,13 @@ class MimeMagic {
 
                        if ( count( $m ) > 1 ) {
                                $main = $m[0];
-                               for ( $i = 1; $i < count( $m ); $i += 1 ) {
+                               $mCount = count( $m );
+                               for ( $i = 1; $i < $mCount; $i += 1 ) {
                                        $mime = $m[$i];
                                        $this->mMimeTypeAliases[$mime] = $main;
                                }
                        }
                }
-
        }
 
        /**
@@ -348,7 +347,7 @@ class MimeMagic {
         * separated string or null if the mime type was unrecognized. Resolves
         * mime type aliases.
         *
-        * @param $mime string
+        * @param string $mime
         * @return string|null
         */
        public function getExtensionsForType( $mime ) {
@@ -374,7 +373,7 @@ class MimeMagic {
         * Returns a list of mime types for a given file extension as a space
         * separated string or null if the extension was unrecognized.
         *
-        * @param $ext string
+        * @param string $ext
         * @return string|null
         */
        public function getTypesForExtension( $ext ) {
@@ -388,7 +387,7 @@ class MimeMagic {
         * Returns a single mime type for a given file extension or null if unknown.
         * This is always the first type from the list returned by getTypesForExtension($ext).
         *
-        * @param $ext string
+        * @param string $ext
         * @return string|null
         */
        public function guessTypesForExtension( $ext ) {
@@ -409,8 +408,8 @@ class MimeMagic {
         * match was found, null if the mime type is unknown, and false if the
         * mime type is known but no matches where found.
         *
-        * @param $extension string
-        * @param $mime string
+        * @param string $extension
+        * @param string $mime
         * @return bool|null
         */
        public function isMatchingExtension( $extension, $mime ) {
@@ -430,7 +429,7 @@ class MimeMagic {
         * Returns true if the mime type is known to represent an image format
         * supported by the PHP GD library.
         *
-        * @param $mime string
+        * @param string $mime
         *
         * @return bool
         */
@@ -458,6 +457,7 @@ class MimeMagic {
         *
         * @todo Be more accurate when using fancy mime detector plugins;
         *       right now this is the bare minimum getimagesize() list.
+        * @param string $extension
         * @return bool
         */
        function isRecognizableExtension( $extension ) {
@@ -493,10 +493,10 @@ class MimeMagic {
         * If $mime is "application/x-opc+zip" and isMatchingExtension( $ext, $mime )
         * gives true, return the result of guessTypesForExtension($ext).
         *
-        * @param string $mime the mime type, typically guessed from a file's content.
-        * @param string $ext the file extension, as taken from the file name
+        * @param string $mime The mime type, typically guessed from a file's content.
+        * @param string $ext The file extension, as taken from the file name
         *
-        * @return string the mime type
+        * @return string The mime type
         */
        public function improveTypeFromExtension( $mime, $ext ) {
                if ( $mime === 'unknown/unknown' ) {
@@ -535,12 +535,12 @@ class MimeMagic {
         * detection (namely XML based formats like XHTML or SVG, as well as ZIP
         * based formats like OPC/ODF files).
         *
-        * @param string $file the file to check
+        * @param string $file The file to check
         * @param string|bool $ext The file extension, or true (default) to extract it from the filename.
         *   Set it to false to ignore the extension. DEPRECATED! Set to false, use
         *   improveTypeFromExtension($mime, $ext) later to improve mime type.
         *
-        * @return string the mime type of $file
+        * @return string The mime type of $file
         */
        public function guessMimeType( $file, $ext = true ) {
                if ( $ext ) { // TODO: make $ext default to false. Or better, remove it.
@@ -855,13 +855,15 @@ class MimeMagic {
         *   Set it to false to ignore the extension. DEPRECATED! Set to false, use
         *   improveTypeFromExtension($mime, $ext) later to improve mime type.
         *
-        * @return string the mime type of $file
+        * @return string The mime type of $file
         */
        private function detectMimeType( $file, $ext = true ) {
                global $wgMimeDetectorCommand;
 
-               if ( $ext ) { # TODO:  make $ext default to false. Or better, remove it.
-                       wfDebug( __METHOD__ . ": WARNING: use of the \$ext parameter is deprecated. Use improveTypeFromExtension(\$mime, \$ext) instead.\n" );
+               /** @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" );
                }
 
                $m = null;
@@ -891,13 +893,16 @@ class MimeMagic {
                } 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.
+                       # 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 linus/unix.
+                       # 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.
+                       # 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 {
@@ -925,7 +930,8 @@ class MimeMagic {
                }
                if ( $ext ) {
                        if ( $this->isRecognizableExtension( $ext ) ) {
-                               wfDebug( __METHOD__ . ": refusing to guess mime type for .$ext file, we should have recognized it\n" );
+                               wfDebug( __METHOD__ . ": refusing to guess mime type for .$ext file, "
+                                       . "we should have recognized it\n" );
                        } else {
                                $m = $this->guessTypesForExtension( $ext );
                                if ( $m ) {
@@ -950,11 +956,11 @@ class MimeMagic {
         * @todo analyse file if need be
         * @todo look at multiple extension, separately and together.
         *
-        * @param string $path full path to the image file, in case we have to look at the contents
+        * @param string $path Full path to the image file, in case we have to look at the contents
         *        (if null, only the mime type is used to determine the media type code).
-        * @param string $mime mime type. If null it will be guessed using guessMimeType.
+        * @param string $mime Mime type. If null it will be guessed using guessMimeType.
         *
-        * @return (int?string?) a value to be used with the MEDIATYPE_xxx constants.
+        * @return string A value to be used with the MEDIATYPE_xxx constants.
         */
        function getMediaType( $path = null, $mime = null ) {
                if ( !$mime && !$path ) {
@@ -1040,6 +1046,7 @@ class MimeMagic {
         *
         * This function relies on the mapping defined by $this->mMediaTypes
         * @access private
+        * @param string $extMime
         * @return int|string
         */
        function findMediaType( $extMime ) {
@@ -1075,10 +1082,10 @@ class MimeMagic {
         * Get the MIME types that various versions of Internet Explorer would
         * detect from a chunk of the content.
         *
-        * @param string $fileName the file name (unused at present)
-        * @param string $chunk the first 256 bytes of the file
-        * @param string $proposed the MIME type proposed by the server
-        * @return Array
+        * @param string $fileName The file name (unused at present)
+        * @param string $chunk The first 256 bytes of the file
+        * @param string $proposed The MIME type proposed by the server
+        * @return array
         */
        public function getIEMimeTypes( $fileName, $chunk, $proposed ) {
                $ca = $this->getIEContentAnalyzer();
index ce585ce..4edddbc 100644 (file)
@@ -45,8 +45,8 @@ class MWNamespace {
         * Special namespaces are defined in includes/Defines.php and have
         * a value below 0 (ex: NS_SPECIAL = -1 , NS_MEDIA = -2)
         *
-        * @param $index
-        * @param $method
+        * @param int $index
+        * @param string $method
         *
         * @throws MWException
         * @return bool
@@ -61,13 +61,13 @@ class MWNamespace {
        /**
         * Can pages in the given namespace be moved?
         *
-        * @param int $index namespace index
+        * @param int $index Namespace index
         * @return bool
         */
        public static function isMovable( $index ) {
                global $wgAllowImageMoving;
 
-               $result = !( $index < NS_MAIN || ( $index == NS_FILE && !$wgAllowImageMoving ) || $index == NS_CATEGORY );
+               $result = !( $index < NS_MAIN || ( $index == NS_FILE && !$wgAllowImageMoving ) );
 
                /**
                 * @since 1.20
@@ -80,7 +80,7 @@ class MWNamespace {
        /**
         * Is the given namespace is a subject (non-talk) namespace?
         *
-        * @param int $index namespace index
+        * @param int $index Namespace index
         * @return bool
         * @since 1.19
         */
@@ -90,7 +90,7 @@ class MWNamespace {
 
        /**
         * @see self::isSubject
-        * @deprecated Please use the more consistently named isSubject (since 1.19)
+        * @deprecated since 1.19 Please use the more consistently named isSubject
         * @return bool
         */
        public static function isMain( $index ) {
@@ -101,7 +101,7 @@ class MWNamespace {
        /**
         * Is the given namespace a talk namespace?
         *
-        * @param int $index namespace index
+        * @param int $index Namespace index
         * @return bool
         */
        public static function isTalk( $index ) {
@@ -112,7 +112,7 @@ class MWNamespace {
        /**
         * Get the talk namespace index for a given namespace
         *
-        * @param int $index namespace index
+        * @param int $index Namespace index
         * @return int
         */
        public static function getTalk( $index ) {
@@ -145,8 +145,8 @@ class MWNamespace {
         * For talk namespaces, returns the subject (non-talk) namespace
         * For subject (non-talk) namespaces, returns the talk namespace
         *
-        * @param int $index namespace index
-        * @return int or null if no associated namespace could be found
+        * @param int $index Namespace index
+        * @return int|null If no associated namespace could be found
         */
        public static function getAssociated( $index ) {
                self::isMethodValidFor( $index, __METHOD__ );
@@ -163,7 +163,7 @@ class MWNamespace {
        /**
         * Returns whether the specified namespace exists
         *
-        * @param $index
+        * @param int $index
         *
         * @return bool
         * @since 1.19
@@ -210,7 +210,7 @@ class MWNamespace {
         * Returns array of all defined namespaces with their canonical
         * (English) names.
         *
-        * @param bool $rebuild rebuild namespace list (default = false). Used for testing.
+        * @param bool $rebuild Rebuild namespace list (default = false). Used for testing.
         *
         * @return array
         * @since 1.17
@@ -231,8 +231,8 @@ class MWNamespace {
        /**
         * Returns the canonical (English) name for a given index
         *
-        * @param int $index namespace index
-        * @return string or false if no canonical definition.
+        * @param int $index Namespace index
+        * @return string|bool If no canonical definition.
         */
        public static function getCanonicalName( $index ) {
                $nslist = self::getCanonicalNamespaces();
@@ -247,7 +247,7 @@ class MWNamespace {
         * Returns the index for a given canonical name, or NULL
         * The input *must* be converted to lower case first
         *
-        * @param string $name namespace name
+        * @param string $name Namespace name
         * @return int
         */
        public static function getCanonicalIndex( $name ) {
@@ -287,7 +287,7 @@ class MWNamespace {
        /**
         * Can this namespace ever have a talk namespace?
         *
-        * @param int $index namespace index
+        * @param int $index Namespace index
         * @return bool
         */
        public static function canTalk( $index ) {
@@ -298,7 +298,7 @@ class MWNamespace {
         * Does this namespace contain content, for the purposes of calculating
         * statistics, etc?
         *
-        * @param int $index index to check
+        * @param int $index Index to check
         * @return bool
         */
        public static function isContent( $index ) {
@@ -309,7 +309,7 @@ class MWNamespace {
        /**
         * Can pages in a namespace be watched?
         *
-        * @param $index Int
+        * @param int $index
         * @return bool
         */
        public static function isWatchable( $index ) {
@@ -329,7 +329,7 @@ class MWNamespace {
 
        /**
         * Get a list of all namespace indices which are considered to contain content
-        * @return array of namespace indices
+        * @return array Array of namespace indices
         */
        public static function getContentNamespaces() {
                global $wgContentNamespaces;
@@ -347,7 +347,7 @@ class MWNamespace {
         * List all namespace indices which are considered subject, aka not a talk
         * or special namespace. See also MWNamespace::isSubject
         *
-        * @return array of namespace indices
+        * @return array Array of namespace indices
         */
        public static function getSubjectNamespaces() {
                return array_filter(
@@ -360,7 +360,7 @@ class MWNamespace {
         * List all namespace indices which are considered talks, aka not a subject
         * or special namespace. See also MWNamespace::isTalk
         *
-        * @return array of namespace indices
+        * @return array Array of namespace indices
         */
        public static function getTalkNamespaces() {
                return array_filter(
@@ -425,7 +425,7 @@ class MWNamespace {
         *
         * @since 1.21
         * @param int $index Index to check
-        * @return null|string default model name for the given namespace, if set
+        * @return null|string Default model name for the given namespace, if set
         */
        public static function getNamespaceContentModel( $index ) {
                global $wgNamespaceContentModels;
index 3860b8e..b3b3b88 100644 (file)
@@ -23,7 +23,7 @@
 /**
  * Standard output handler for use with ob_start
  *
- * @param $s string
+ * @param string $s
  *
  * @return string
  */
@@ -94,7 +94,7 @@ function wfRequestExtension() {
  * Handler that compresses data with gzip if allowed by the Accept header.
  * Unlike ob_gzhandler, it works for HEAD requests too.
  *
- * @param $s string
+ * @param string $s
  *
  * @return string
  */
@@ -145,7 +145,7 @@ function wfGzipHandler( $s ) {
 /**
  * Mangle flash policy tags which open up the site to XSS attacks.
  *
- * @param $s string
+ * @param string $s
  *
  * @return string
  */
@@ -161,10 +161,13 @@ function wfMangleFlashPolicy( $s ) {
 /**
  * Add a Content-Length header if possible. This makes it cooperate with squid better.
  *
- * @param $length int
+ * @param int $length
  */
 function wfDoContentLength( $length ) {
-       if ( !headers_sent() && isset( $_SERVER['SERVER_PROTOCOL'] ) && $_SERVER['SERVER_PROTOCOL'] == 'HTTP/1.0' ) {
+       if ( !headers_sent()
+               && isset( $_SERVER['SERVER_PROTOCOL'] )
+               && $_SERVER['SERVER_PROTOCOL'] == 'HTTP/1.0'
+       ) {
                header( "Content-Length: $length" );
        }
 }
@@ -172,7 +175,7 @@ function wfDoContentLength( $length ) {
 /**
  * Replace the output with an error if the HTML is not valid
  *
- * @param $s string
+ * @param string $s
  *
  * @return string
  */
index f5dbfc6..0f3612a 100644 (file)
  * @todo document
  */
 class OutputPage extends ContextSource {
-       /// Should be private. Used with addMeta() which adds "<meta>"
-       var $mMetatags = array();
+       /** @var array Should be private. Used with addMeta() which adds "<meta>" */
+       protected $mMetatags = array();
 
-       var $mLinktags = array();
-       var $mCanonicalUrl = false;
+       /** @var array */
+       protected $mLinktags = array();
 
-       /// Additional stylesheets. Looks like this is for extensions. Might be replaced by resource loader.
-       var $mExtStyles = array();
+       /** @var bool */
+       protected $mCanonicalUrl = false;
 
-       /// Should be private - has getter and setter. Contains the HTML title
-       var $mPagetitle = '';
+       /**
+        * @var array Additional stylesheets. Looks like this is for extensions.
+        *   Might be replaced by resource loader.
+        */
+       protected $mExtStyles = array();
 
-       /// Contains all of the "<body>" content. Should be private we got set/get accessors and the append() method.
-       var $mBodytext = '';
+       /**
+        * @var string Should be private - has getter and setter. Contains
+        *   the HTML title */
+       public $mPagetitle = '';
+
+       /**
+        * @var string Contains all of the "<body>" content. Should be private we
+        *   got set/get accessors and the append() method.
+        */
+       public $mBodytext = '';
 
        /**
         * Holds the debug lines that will be output as comments in page source if
@@ -58,43 +69,43 @@ class OutputPage extends ContextSource {
         */
        public $mDebugtext = '';
 
-       /// Should be private. Stores contents of "<title>" tag
-       var $mHTMLtitle = '';
-
-       /// Should be private. Is the displayed content related to the source of the corresponding wiki article.
-       var $mIsarticle = false;
+       /** @var string Stores contents of "<title>" tag */
+       private $mHTMLtitle = '';
 
        /**
-        * Should be private. Has get/set methods properly documented.
-        * Stores "article flag" toggle.
+        * @var bool Is the displayed content related to the source of the
+        *   corresponding wiki article.
         */
-       var $mIsArticleRelated = true;
+       private $mIsarticle = false;
+
+       /** @var bool Stores "article flag" toggle. */
+       private $mIsArticleRelated = true;
 
        /**
-        * Should be private. We have to set isPrintable(). Some pages should
+        * @var bool We have to set isPrintable(). Some pages should
         * never be printed (ex: redirections).
         */
-       var $mPrintable = false;
+       private $mPrintable = false;
 
        /**
-        * Should be private. We have set/get/append methods.
-        *
-        * Contains the page subtitle. Special pages usually have some links here.
-        * Don't confuse with site subtitle added by skins.
+        * @var array Contains the page subtitle. Special pages usually have some
+        *   links here. Don't confuse with site subtitle added by skins.
         */
        private $mSubtitle = array();
 
-       var $mRedirect = '';
-       var $mStatusCode;
+       /** @var string */
+       public $mRedirect = '';
+
+       /** @var int */
+       protected $mStatusCode;
 
        /**
-        * mLastModified and mEtag are used for sending cache control.
-        * The whole caching system should probably be moved into its own class.
+        * @ var string mLastModified and mEtag are used for sending cache control.
+        *   The whole caching system should probably be moved into its own class.
         */
-       var $mLastModified = '';
+       protected $mLastModified = '';
 
        /**
-        * Should be private. No getter but used in sendCacheControl();
         * Contains an HTTP Entity Tags (see RFC 2616 section 3.13) which is used
         * as a unique identifier for the content. It is later used by the client
         * to compare its cached version with the server version. Client sends
@@ -103,70 +114,93 @@ class OutputPage extends ContextSource {
         * To get more information, you will have to look at HTTP/1.1 protocol which
         * is properly described in RFC 2616 : http://tools.ietf.org/html/rfc2616
         */
-       var $mETag = false;
+       private $mETag = false;
+
+       /** @var array */
+       protected $mCategoryLinks = array();
 
-       var $mCategoryLinks = array();
-       var $mCategories = array();
+       /** @var array */
+       protected $mCategories = array();
 
-       /// Should be private. Array of Interwiki Prefixed (non DB key) Titles (e.g. 'fr:Test page')
-       var $mLanguageLinks = array();
+       /** @var array Array of Interwiki Prefixed (non DB key) Titles (e.g. 'fr:Test page') */
+       private $mLanguageLinks = array();
 
        /**
-        * Should be private. Used for JavaScript (pre resource loader)
-        * We should split js / css.
+        * Used for JavaScript (pre resource loader)
+        * @todo We should split JS / CSS.
         * mScripts content is inserted as is in "<head>" by Skin. This might
-        * contains either a link to a stylesheet or inline css.
+        * contain either a link to a stylesheet or inline CSS.
         */
-       var $mScripts = '';
+       private $mScripts = '';
 
-       /**
-        * Inline CSS styles. Use addInlineStyle() sparingly
-        */
-       var $mInlineStyles = '';
+       /** @var string Inline CSS styles. Use addInlineStyle() sparingly */
+       protected $mInlineStyles = '';
 
-       //
-       var $mLinkColours;
+       /** @todo Unused? */
+       private $mLinkColours;
 
        /**
-        * Used by skin template.
+        * @var string Used by skin template.
         * Example: $tpl->set( 'displaytitle', $out->mPageLinkTitle );
         */
-       var $mPageLinkTitle = '';
+       public $mPageLinkTitle = '';
+
+       /** @var array Array of elements in "<head>". Parser might add its own headers! */
+       protected $mHeadItems = array();
 
-       /// Array of elements in "<head>". Parser might add its own headers!
-       var $mHeadItems = array();
+       // @todo FIXME: Next 5 variables probably come from the resource loader
 
-       // @todo FIXME: Next variables probably comes from the resource loader
-       var $mModules = array(), $mModuleScripts = array(), $mModuleStyles = array(), $mModuleMessages = array();
-       var $mResourceLoader;
-       var $mJsConfigVars = array();
+       /** @var array */
+       protected $mModules = array();
 
-       /** @todo FIXME: Is this still used ?*/
-       var $mInlineMsg = array();
+       /** @var array */
+       protected $mModuleScripts = array();
 
-       var $mTemplateIds = array();
-       var $mImageTimeKeys = array();
+       /** @var array */
+       protected $mModuleStyles = array();
 
-       var $mRedirectCode = '';
+       /** @var array */
+       protected $mModuleMessages = array();
 
-       var $mFeedLinksAppendQuery = null;
+       /** @var ResourceLoader */
+       protected $mResourceLoader;
 
-       # What level of 'untrustworthiness' is allowed in CSS/JS modules loaded on this page?
-       # @see ResourceLoaderModule::$origin
-       # ResourceLoaderModule::ORIGIN_ALL is assumed unless overridden;
+       /** @var array */
+       protected $mJsConfigVars = array();
+
+       /** @var array */
+       protected $mTemplateIds = array();
+
+       /** @var array */
+       protected $mImageTimeKeys = array();
+
+       /** @var string */
+       public $mRedirectCode = '';
+
+       protected $mFeedLinksAppendQuery = null;
+
+       /** @var array
+        * What level of 'untrustworthiness' is allowed in CSS/JS modules loaded on this page?
+        * @see ResourceLoaderModule::$origin
+        * ResourceLoaderModule::ORIGIN_ALL is assumed unless overridden;
+        */
        protected $mAllowedModules = array(
                ResourceLoaderModule::TYPE_COMBINED => ResourceLoaderModule::ORIGIN_ALL,
        );
 
+       /** @var bool Whether output is disabled.  If this is true, the 'output' method will do nothing. */
+       protected $mDoNothing = false;
+
+       // Parser related.
+
        /**
-        * Whether output is disabled.  If this is true, the 'output' method will do nothing.
-        *
-        * @var bool $mDoNothing
+        * @var int
+        * @todo Unused?
         */
-       var $mDoNothing = false;
+       private $mContainsOldMagic = 0;
 
-       // Parser related.
-       var $mContainsOldMagic = 0, $mContainsNewMagic = 0;
+       /** @var int */
+       protected $mContainsNewMagic = 0;
 
        /**
         * lazy initialised, use parserOptions()
@@ -175,57 +209,64 @@ class OutputPage extends ContextSource {
        protected $mParserOptions = null;
 
        /**
-        * Handles the atom / rss links.
-        * We probably only support atom in 2011.
-        * Looks like a private variable.
+        * Handles the Atom / RSS links.
+        * We probably only support Atom in 2011.
         * @see $wgAdvertisedFeedTypes
         */
-       var $mFeedLinks = array();
+       private $mFeedLinks = array();
 
        // Gwicke work on squid caching? Roughly from 2003.
-       var $mEnableClientCache = true;
+       protected $mEnableClientCache = true;
 
-       /**
-        * Flag if output should only contain the body of the article.
-        * Should be private.
-        */
-       var $mArticleBodyOnly = false;
+       /** @var bool Flag if output should only contain the body of the article. */
+       private $mArticleBodyOnly = false;
+
+       /** @var bool */
+       protected $mNewSectionLink = false;
 
-       var $mNewSectionLink = false;
-       var $mHideNewSectionLink = false;
+       /** @var bool */
+       protected $mHideNewSectionLink = false;
 
        /**
-        * Comes from the parser. This was probably made to load CSS/JS only
-        * if we had "<gallery>". Used directly in CategoryPage.php
+        * @var bool Comes from the parser. This was probably made to load CSS/JS
+        * only if we had "<gallery>". Used directly in CategoryPage.php.
         * Looks like resource loader can replace this.
         */
-       var $mNoGallery = false;
+       public $mNoGallery = false;
 
-       // should be private.
-       var $mPageTitleActionText = '';
-       var $mParseWarnings = array();
+       /** @var string */
+       private $mPageTitleActionText = '';
 
-       // Cache stuff. Looks like mEnableClientCache
-       var $mSquidMaxage = 0;
+       /** @var array */
+       private $mParseWarnings = array();
 
-       // @todo document
-       var $mPreventClickjacking = true;
+       /** @var int Cache stuff. Looks like mEnableClientCache */
+       protected $mSquidMaxage = 0;
 
-       /// should be private. To include the variable {{REVISIONID}}
-       var $mRevisionId = null;
+       /**
+        * @var bool
+        * @todo Document
+        */
+       protected $mPreventClickjacking = true;
+
+       /** @var int To include the variable {{REVISIONID}} */
+       private $mRevisionId = null;
+
+       /** @var string */
        private $mRevisionTimestamp = null;
 
-       var $mFileVersion = null;
+       /** @var array */
+       protected $mFileVersion = null;
 
        /**
-        * An array of stylesheet filenames (relative from skins path), with options
-        * for CSS media, IE conditions, and RTL/LTR direction.
+        * @var array An array of stylesheet filenames (relative from skins path),
+        * with options for CSS media, IE conditions, and RTL/LTR direction.
         * For internal use; add settings in the skin via $this->addStyle()
         *
         * Style again! This seems like a code duplication since we already have
-        * mStyles. This is what makes OpenSource amazing.
+        * mStyles. This is what makes Open Source amazing.
         */
-       var $styles = array();
+       protected $styles = array();
 
        /**
         * Whether jQuery is already handled.
@@ -445,7 +486,9 @@ class OutputPage extends ContextSource {
         * @param string $type
         * @return array
         */
-       protected function filterModules( $modules, $position = null, $type = ResourceLoaderModule::TYPE_COMBINED ) {
+       protected function filterModules( $modules, $position = null,
+               $type = ResourceLoaderModule::TYPE_COMBINED
+       ) {
                $resourceLoader = $this->getResourceLoader();
                $filteredModules = array();
                foreach ( $modules as $val ) {
@@ -724,7 +767,8 @@ class OutputPage extends ContextSource {
                $clientHeaderTime = strtotime( $clientHeader );
                wfRestoreWarnings();
                if ( !$clientHeaderTime ) {
-                       wfDebug( __METHOD__ . ": unable to parse the client's If-Modified-Since header: $clientHeader\n" );
+                       wfDebug( __METHOD__
+                               . ": unable to parse the client's If-Modified-Since header: $clientHeader\n" );
                        return false;
                }
                $clientHeaderTime = wfTimestamp( TS_MW, $clientHeaderTime );
@@ -875,10 +919,12 @@ class OutputPage extends ContextSource {
        }
 
        /**
-        * "Page title" means the contents of \<h1\>. It is stored as a valid HTML fragment.
-        * This function allows good tags like \<sup\> in the \<h1\> tag, but not bad tags like \<script\>.
-        * This function automatically sets \<title\> to the same content as \<h1\> but with all tags removed.
-        * Bad tags that were escaped in \<h1\> will still be escaped in \<title\>, and good tags like \<i\> will be dropped entirely.
+        * "Page title" means the contents of \<h1\>. It is stored as a valid HTML
+        * fragment. This function allows good tags like \<sup\> in the \<h1\> tag,
+        * but not bad tags like \<script\>. This function automatically sets
+        * \<title\> to the same content as \<h1\> but with all tags removed. Bad
+        * tags that were escaped in \<h1\> will still be escaped in \<title\>, and
+        * good tags like \<i\> will be dropped entirely.
         *
         * @param string|Message $name
         */
@@ -960,7 +1006,8 @@ class OutputPage extends ContextSource {
                if ( $title->isRedirect() ) {
                        $query['redirect'] = 'no';
                }
-               $this->addSubtitle( $this->msg( 'backlinksubtitle' )->rawParams( Linker::link( $title, null, array(), $query ) ) );
+               $this->addSubtitle( $this->msg( 'backlinksubtitle' )
+                       ->rawParams( Linker::link( $title, null, array(), $query ) ) );
        }
 
        /**
@@ -1203,11 +1250,15 @@ class OutputPage extends ContextSource {
                # Fetch existence plus the hiddencat property
                $dbr = wfGetDB( DB_SLAVE );
                $res = $dbr->select( array( 'page', 'page_props' ),
-                       array( 'page_id', 'page_namespace', 'page_title', 'page_len', 'page_is_redirect', 'page_latest', 'pp_value' ),
+                       array( 'page_id', 'page_namespace', 'page_title', 'page_len',
+                               'page_is_redirect', 'page_latest', 'pp_value' ),
                        $lb->constructSet( 'page', $dbr ),
                        __METHOD__,
                        array(),
-                       array( 'page_props' => array( 'LEFT JOIN', array( 'pp_propname' => 'hiddencat', 'pp_page = page_id' ) ) )
+                       array( 'page_props' => array( 'LEFT JOIN', array(
+                               'pp_propname' => 'hiddencat',
+                               'pp_page = page_id'
+                       ) ) )
                );
 
                # Add the results to the link cache
@@ -1227,7 +1278,10 @@ class OutputPage extends ContextSource {
                }
 
                # Add the remaining categories to the skin
-               if ( wfRunHooks( 'OutputPageMakeCategoryLinks', array( &$this, $categories, &$this->mCategoryLinks ) ) ) {
+               if ( wfRunHooks(
+                       'OutputPageMakeCategoryLinks',
+                       array( &$this, $categories, &$this->mCategoryLinks ) )
+               ) {
                        foreach ( $categories as $category => $type ) {
                                $origcategory = $category;
                                $title = Title::makeTitleSafe( NS_CATEGORY, $category );
@@ -1294,7 +1348,8 @@ class OutputPage extends ContextSource {
         */
        public function isUserJsAllowed() {
                wfDeprecated( __METHOD__, '1.18' );
-               return $this->getAllowedModules( ResourceLoaderModule::TYPE_SCRIPTS ) >= ResourceLoaderModule::ORIGIN_USER_INDIVIDUAL;
+               return $this->getAllowedModules( ResourceLoaderModule::TYPE_SCRIPTS ) >=
+                       ResourceLoaderModule::ORIGIN_USER_INDIVIDUAL;
        }
 
        /**
@@ -1537,7 +1592,9 @@ class OutputPage extends ContextSource {
         * @param bool $interface Whether it is an interface message
         *   (for example disables conversion)
         */
-       public function addWikiTextTitle( $text, Title $title, $linestart, $tidy = false, $interface = false ) {
+       public function addWikiTextTitle( $text, Title $title, $linestart,
+               $tidy = false, $interface = false
+       ) {
                global $wgParser;
 
                wfProfileIn( __METHOD__ );
@@ -1691,13 +1748,7 @@ class OutputPage extends ContextSource {
         */
        public function parseInline( $text, $linestart = true, $interface = false ) {
                $parsed = $this->parse( $text, $linestart, $interface );
-
-               $m = array();
-               if ( preg_match( '/^<p>(.*)\n?<\/p>\n?/sU', $parsed, $m ) ) {
-                       $parsed = $m[1];
-               }
-
-               return $parsed;
+               return Parser::stripOuterParagraph( $parsed );
        }
 
        /**
@@ -1931,7 +1982,8 @@ class OutputPage extends ContextSource {
                                        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 . '+' . $this->mSquidMaxage . ', content="ESI/1.0"' );
+                                       $response->header( 'Surrogate-Control: max-age=' . $wgSquidMaxage
+                                               . '+' . $this->mSquidMaxage . ', content="ESI/1.0"' );
                                        $response->header( 'Cache-Control: s-maxage=0, must-revalidate, max-age=0' );
                                } else {
                                        # We'll purge the proxy cache for anons explicitly, but require end user agents
@@ -1941,7 +1993,8 @@ class OutputPage extends ContextSource {
                                        wfDebug( __METHOD__ . ": local proxy caching; {$this->mLastModified} **\n", 'log' );
                                        # start with a shorter timeout for initial testing
                                        # header( "Cache-Control: s-maxage=2678400, must-revalidate, max-age=0" );
-                                       $response->header( 'Cache-Control: s-maxage=' . $this->mSquidMaxage . ', must-revalidate, max-age=0' );
+                                       $response->header( 'Cache-Control: s-maxage=' . $this->mSquidMaxage
+                                               . ', must-revalidate, max-age=0' );
                                }
                        } else {
                                # We do want clients to cache if they can, but they *must* check for updates
@@ -2039,6 +2092,10 @@ class OutputPage extends ContextSource {
                $response->header( "Content-type: $wgMimeType; charset=UTF-8" );
                $response->header( 'Content-language: ' . $wgLanguageCode );
 
+               // Avoid Internet Explorer "compatibility view" in IE 8-10, so that
+               // jQuery etc. can work correctly.
+               $response->header( 'X-UA-Compatible: IE=Edge' );
+
                // Prevent framing, if requested
                $frameOptions = $this->getFrameOptions();
                if ( $frameOptions ) {
@@ -2157,7 +2214,9 @@ class OutputPage extends ContextSource {
 
                if ( $msg instanceof Message ) {
                        if ( $params !== array() ) {
-                               trigger_error( 'Argument ignored: $params. The message parameters argument is discarded when the $msg argument is a Message object instead of a string.', E_USER_NOTICE );
+                               trigger_error( 'Argument ignored: $params. The message parameters argument '
+                                       . 'is discarded when the $msg argument is a Message object instead of '
+                                       . 'a string.', E_USER_NOTICE );
                        }
                        $this->addHTML( $msg->parseAsBlock() );
                } else {
@@ -2325,11 +2384,14 @@ class OutputPage extends ContextSource {
         *
         * @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 array $reasons List of reasons for this error, as returned by
+        *   Title::getUserPermissionsErrors().
         * @param string $action Action that was denied or null if unknown
         * @throws ReadOnlyError
         */
-       public function readOnlyPage( $source = null, $protected = false, $reasons = array(), $action = null ) {
+       public function readOnlyPage( $source = null, $protected = false,
+               $reasons = array(), $action = null
+       ) {
                $this->setRobotPolicy( 'noindex,nofollow' );
                $this->setArticleRelated( false );
 
@@ -2523,10 +2585,6 @@ $templates
 
                $ret .= Html::element( 'title', null, $this->getHTMLTitle() ) . "\n";
 
-               // Avoid Internet Explorer "compatibility view", so that
-               // jQuery can work correctly.
-               $ret .= Html::element( 'meta', array( 'http-equiv' => 'X-UA-Compatible', 'content' => 'IE=EDGE' ) ) . "\n";
-
                $ret .= (
                        $this->getHeadLinks() .
                        "\n" .
@@ -2556,7 +2614,8 @@ $templates
 
                $bodyClasses[] = $sk->getPageClasses( $this->getTitle() );
                $bodyClasses[] = 'skin-' . Sanitizer::escapeClass( $sk->getSkinName() );
-               $bodyClasses[] = 'action-' . Sanitizer::escapeClass( Action::getActionName( $this->getContext() ) );
+               $bodyClasses[] =
+                       'action-' . Sanitizer::escapeClass( Action::getActionName( $this->getContext() ) );
 
                $bodyAttrs = array();
                // While the implode() is not strictly needed, it's used for backwards compatibility
@@ -2585,15 +2644,19 @@ $templates
        }
 
        /**
-        * TODO: Document
+        * @todo Document
         * @param array|string $modules One or more module names
         * @param string $only ResourceLoaderModule TYPE_ class constant
         * @param bool $useESI
-        * @param array $extraQuery Array with extra query parameters to add to each request. array( param => value )
-        * @param bool $loadCall If true, output an (asynchronous) mw.loader.load() call rather than a "<script src='...'>" tag
+        * @param array $extraQuery Array with extra query parameters to add to each
+        *   request. array( param => value ).
+        * @param bool $loadCall If true, output an (asynchronous) mw.loader.load()
+        *   call rather than a "<script src='...'>" tag.
         * @return string The html "<script>", "<link>" and "<style>" tags
         */
-       protected function makeResourceLoaderLink( $modules, $only, $useESI = false, array $extraQuery = array(), $loadCall = false ) {
+       protected function makeResourceLoaderLink( $modules, $only, $useESI = false,
+               array $extraQuery = array(), $loadCall = false
+       ) {
                global $wgResourceLoaderUseESI;
 
                $modules = (array)$modules;
@@ -2607,7 +2670,6 @@ $templates
                        return $links;
                }
 
-
                if ( count( $modules ) > 1 ) {
                        // Remove duplicate module requests
                        $modules = array_unique( $modules );
@@ -2837,8 +2899,14 @@ $templates
 
                // Scripts and messages "only" requests marked for top inclusion
                // Messages should go first
-               $links[] = $this->makeResourceLoaderLink( $this->getModuleMessages( true, 'top' ), ResourceLoaderModule::TYPE_MESSAGES );
-               $links[] = $this->makeResourceLoaderLink( $this->getModuleScripts( true, 'top' ), ResourceLoaderModule::TYPE_SCRIPTS );
+               $links[] = $this->makeResourceLoaderLink(
+                       $this->getModuleMessages( true, 'top' ),
+                       ResourceLoaderModule::TYPE_MESSAGES
+               );
+               $links[] = $this->makeResourceLoaderLink(
+                       $this->getModuleScripts( true, 'top' ),
+                       ResourceLoaderModule::TYPE_SCRIPTS
+               );
 
                // Modules requests - let the client calculate dependencies and batch requests as it likes
                // Only load modules that have marked themselves for loading at the top
@@ -2859,12 +2927,14 @@ $templates
        }
 
        /**
-        * JS stuff to put at the 'bottom', which can either be the bottom of the "<body>"
-        * or the bottom of the "<head>" depending on $wgResourceLoaderExperimentalAsyncLoading:
-        * modules marked with position 'bottom', legacy scripts ($this->mScripts),
-        * user preferences, site JS and user JS.
+        * JS stuff to put at the 'bottom', which can either be the bottom of the
+        * "<body>" or the bottom of the "<head>" depending on
+        * $wgResourceLoaderExperimentalAsyncLoading: modules marked with position
+        * 'bottom', legacy scripts ($this->mScripts), user preferences, site JS
+        * and user JS.
         *
-        * @param bool $inHead If true, this HTML goes into the "<head>", if false it goes into the "<body>"
+        * @param bool $inHead If true, this HTML goes into the "<head>",
+        *   if false it goes into the "<body>".
         * @return string
         */
        function getScriptsForBottomQueue( $inHead ) {
@@ -2903,7 +2973,12 @@ $templates
                );
 
                // Add user JS if enabled
-               if ( $wgAllowUserJs && $this->getUser()->isLoggedIn() && $this->getTitle() && $this->getTitle()->isJsSubpage() && $this->userCanPreview() ) {
+               if ( $wgAllowUserJs
+                       && $this->getUser()->isLoggedIn()
+                       && $this->getTitle()
+                       && $this->getTitle()->isJsSubpage()
+                       && $this->userCanPreview()
+               ) {
                        # XXX: additional security check/prompt?
                        // We're on a preview of a JS subpage
                        // Exclude this page from the user module in case it's in there (bug 26283)
@@ -2911,7 +2986,8 @@ $templates
                                array( 'excludepage' => $this->getTitle()->getPrefixedDBkey() ), $inHead
                        );
                        // Load the previewed JS
-                       $links[] = Html::inlineScript( "\n" . $this->getRequest()->getText( 'wpTextbox1' ) . "\n" ) . "\n";
+                       $links[] = Html::inlineScript( "\n"
+                                       . $this->getRequest()->getText( 'wpTextbox1' ) . "\n" ) . "\n";
 
                        // FIXME: If the user is previewing, say, ./vector.js, his ./common.js will be loaded
                        // asynchronously and may arrive *after* the inline script here. So the previewed code
@@ -2999,7 +3075,9 @@ $templates
 
                $title = $this->getTitle();
                $ns = $title->getNamespace();
-               $canonicalNamespace = MWNamespace::exists( $ns ) ? MWNamespace::getCanonicalName( $ns ) : $title->getNsText();
+               $canonicalNamespace = MWNamespace::exists( $ns )
+                       ? MWNamespace::getCanonicalName( $ns )
+                       : $title->getNsText();
 
                $sk = $this->getSkin();
                // Get the relevant title so that AJAX features can use the correct page name
@@ -3008,7 +3086,8 @@ $templates
                $relevantUser = $sk->getRelevantUser();
 
                if ( $ns == NS_SPECIAL ) {
-                       list( $canonicalSpecialPageName, /*...*/ ) = SpecialPageFactory::resolveAlias( $title->getDBkey() );
+                       list( $canonicalSpecialPageName, /*...*/ ) =
+                               SpecialPageFactory::resolveAlias( $title->getDBkey() );
                } elseif ( $this->canUseWikiPage() ) {
                        $wikiPage = $this->getWikiPage();
                        $curRevisionId = $wikiPage->getLatest();
@@ -3058,6 +3137,7 @@ $templates
                        'wgMonthNamesShort' => $lang->getMonthAbbreviationsArray(),
                        'wgRelevantPageName' => $relevantTitle->getPrefixedDBkey(),
                );
+
                if ( $user->isLoggedIn() ) {
                        $vars['wgUserId'] = $user->getId();
                        $vars['wgUserEditCount'] = $user->getEditCount();
@@ -3068,20 +3148,26 @@ $templates
                        // the client side.
                        $vars['wgUserNewMsgRevisionId'] = $user->getNewMessageRevisionId();
                }
+
                if ( $wgContLang->hasVariants() ) {
                        $vars['wgUserVariant'] = $wgContLang->getPreferredVariant();
                }
                // Same test as SkinTemplate
-               $vars['wgIsProbablyEditable'] = $title->quickUserCan( 'edit', $user ) && ( $title->exists() || $title->quickUserCan( 'create', $user ) );
+               $vars['wgIsProbablyEditable'] = $title->quickUserCan( 'edit', $user )
+                       && ( $title->exists() || $title->quickUserCan( 'create', $user ) );
+
                foreach ( $title->getRestrictionTypes() as $type ) {
                        $vars['wgRestriction' . ucfirst( $type )] = $title->getRestrictions( $type );
                }
+
                if ( $title->isMainPage() ) {
                        $vars['wgIsMainPage'] = true;
                }
+
                if ( $this->mRedirectedFrom ) {
                        $vars['wgRedirectedFrom'] = $this->mRedirectedFrom->getPrefixedDBkey();
                }
+
                if ( $relevantUser ) {
                        $vars['wgRelevantUserName'] = $relevantUser->getName();
                }
@@ -3183,13 +3269,13 @@ $templates
                                        'rel' => 'alternate',
                                        'type' => 'application/x-wiki',
                                        'title' => $msg,
-                                       'href' => $this->getTitle()->getLocalURL( 'action=edit' )
+                                       'href' => $this->getTitle()->getEditURL(),
                                ) );
                                // Alternate edit link
                                $tags['alternative-edit'] = Html::element( 'link', array(
                                        'rel' => 'edit',
                                        'title' => $msg,
-                                       'href' => $this->getTitle()->getLocalURL( 'action=edit' )
+                                       'href' => $this->getTitle()->getEditURL(),
                                ) );
                        }
                }
@@ -3199,11 +3285,17 @@ $templates
                # uses whichever one appears later in the HTML source. Make sure
                # apple-touch-icon is specified first to avoid this.
                if ( $wgAppleTouchIcon !== false ) {
-                       $tags['apple-touch-icon'] = Html::element( 'link', array( 'rel' => 'apple-touch-icon', 'href' => $wgAppleTouchIcon ) );
+                       $tags['apple-touch-icon'] = Html::element( 'link', array(
+                               'rel' => 'apple-touch-icon',
+                               'href' => $wgAppleTouchIcon
+                       ) );
                }
 
                if ( $wgFavicon !== false ) {
-                       $tags['favicon'] = Html::element( 'link', array( 'rel' => 'shortcut icon', 'href' => $wgFavicon ) );
+                       $tags['favicon'] = Html::element( 'link', array(
+                               'rel' => 'shortcut icon',
+                               'href' => $wgFavicon
+                       ) );
                }
 
                # OpenSearch description link
@@ -3224,7 +3316,11 @@ $templates
                                'type' => 'application/rsd+xml',
                                // Output a protocol-relative URL here if $wgServer is protocol-relative
                                // Whether RSD accepts relative or protocol-relative URLs is completely undocumented, though
-                               'href' => wfExpandUrl( wfAppendQuery( wfScript( 'api' ), array( 'action' => 'rsd' ) ), PROTO_RELATIVE ),
+                               'href' => wfExpandUrl( wfAppendQuery(
+                                       wfScript( 'api' ),
+                                       array( 'action' => 'rsd' ) ),
+                                       PROTO_RELATIVE
+                               ),
                        ) );
                }
 
@@ -3309,7 +3405,8 @@ $templates
                                        $tags[] = $this->feedLink(
                                                $format,
                                                $rctitle->getLocalURL( array( 'feed' => $format ) ),
-                                               $this->msg( "site-{$format}-feed", $wgSitename )->text() # For grep: 'site-rss-feed', 'site-atom-feed'.
+                                               # For grep: 'site-rss-feed', 'site-atom-feed'
+                                               $this->msg( "site-{$format}-feed", $wgSitename )->text()
                                        );
                                }
                        }
@@ -3410,7 +3507,13 @@ $templates
 
                // Add ResourceLoader styles
                // Split the styles into these groups
-               $styles = array( 'other' => array(), 'user' => array(), 'site' => array(), 'private' => array(), 'noscript' => array() );
+               $styles = array(
+                       'other' => array(),
+                       'user' => array(),
+                       'site' => array(),
+                       'private' => array(),
+                       'noscript' => array()
+               );
                $links = array();
                $otherTags = ''; // Tags to append after the normal <link> tags
                $resourceLoader = $this->getResourceLoader();
@@ -3458,16 +3561,20 @@ $templates
                        $styles[ isset( $styles[$group] ) ? $group : 'other' ][] = $name;
                }
 
-               // We want site, private and user styles to override dynamically added styles from modules, but we want
-               // dynamically added styles to override statically added styles from other modules. So the order
-               // has to be other, dynamic, site, private, user
-               // Add statically added styles for other modules
+               // We want site, private and user styles to override dynamically added
+               // styles from modules, but we want dynamically added styles to override
+               // statically added styles from other modules. So the order has to be
+               // other, dynamic, site, private, user. Add statically added styles for
+               // other modules
                $links[] = $this->makeResourceLoaderLink( $styles['other'], ResourceLoaderModule::TYPE_STYLES );
                // Add normal styles added through addStyle()/addInlineStyle() here
                $links[] = implode( "\n", $this->buildCssLinksArray() ) . $this->mInlineStyles;
                // Add marker tag to mark the place where the client-side loader should inject dynamic styles
                // We use a <meta> tag with a made-up name for this because that's valid HTML
-               $links[] = Html::element( 'meta', array( 'name' => 'ResourceLoaderDynamicStyles', 'content' => '' ) ) . "\n";
+               $links[] = Html::element(
+                       'meta',
+                       array( 'name' => 'ResourceLoaderDynamicStyles', 'content' => '' )
+               ) . "\n";
 
                // Add site, private and user styles
                // 'private' at present only contains user.options, so put that before 'user'
@@ -3569,8 +3676,10 @@ $templates
                                } elseif ( preg_match( $screenMediaQueryRegex, $media ) === 1 ) {
                                        // This regex will not attempt to understand a comma-separated media_query_list
                                        //
-                                       // Example supported values for $media: 'screen', 'only screen', 'screen and (min-width: 982px)' ),
-                                       // Example NOT supported value for $media: '3d-glasses, screen, print and resolution > 90dpi'
+                                       // Example supported values for $media:
+                                       // 'screen', 'only screen', 'screen and (min-width: 982px)' ),
+                                       // Example NOT supported value for $media:
+                                       // '3d-glasses, screen, print and resolution > 90dpi'
                                        //
                                        // If it's a print request, we never want any kind of screen stylesheets
                                        // If it's a handheld request (currently the only other choice with a switch),
@@ -3628,7 +3737,8 @@ $templates
         *
         * Is equivalent to:
         *
-        *    $wgOut->addWikiText( "<div class='error'>\n" . wfMessage( 'some-error' )->plain() . "\n</div>" );
+        *    $wgOut->addWikiText( "<div class='error'>\n"
+        *        . wfMessage( 'some-error' )->plain() . "\n</div>" );
         *
         * The newline after opening div is needed in some wikitext. See bug 19226.
         *
index 9b5373b..0fb3952 100644 (file)
@@ -43,10 +43,13 @@ function wfPHPVersionError( $type ) {
 
        $phpVersion = phpversion();
        $protocol = isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0';
-       $message = "MediaWiki $mwVersion requires at least PHP version $minimumVersionPHP, you are using PHP $phpVersion.";
+       $message = "MediaWiki $mwVersion requires at least "
+               . "PHP version $minimumVersionPHP, you are using PHP $phpVersion.";
+
        if ( $type == 'cli' ) {
-               $finalOutput = "You are using PHP version $phpVersion but MediaWiki $mwVersion needs PHP $minimumVersionPHP or higher. ABORTING.\n" .
-               "Check if you have a newer php executable with a different name, such as php5.\n";
+               $finalOutput = "You are using PHP version $phpVersion "
+                       . "but MediaWiki $mwVersion needs PHP $minimumVersionPHP or higher. ABORTING.\n"
+                       . "Check if you have a newer php executable with a different name, such as php5.\n";
        } elseif ( $type == 'index.php' ) {
                $pathinfo = pathinfo( $_SERVER['SCRIPT_NAME'] );
                $encLogo = htmlspecialchars(
index 02a883a..afc0227 100644 (file)
@@ -32,7 +32,7 @@ abstract class PageQueryPage extends QueryPage {
         * like page existence and information for stub color and redirect hints.
         * This should be done for live data and cached data.
         *
-        * @param $db DatabaseBase connection
+        * @param DatabaseBase $db
         * @param ResultWrapper $res
         */
        public function preprocessResults( $db, $res ) {
index 747d2c1..5f05460 100644 (file)
@@ -244,7 +244,7 @@ abstract class IndexPager extends ContextSource implements Pager {
        /**
         * Set the offset from an other source than the request
         *
-        * @param $offset Int|String
+        * @param int|string $offset
         */
        function setOffset( $offset ) {
                $this->mOffset = $offset;
@@ -255,7 +255,7 @@ abstract class IndexPager extends ContextSource implements Pager {
         *
         * Verifies limit is between 1 and 5000
         *
-        * @param $limit Int|String
+        * @param int|string $limit
         */
        function setLimit( $limit ) {
                $limit = (int)$limit;
@@ -282,7 +282,7 @@ abstract class IndexPager extends ContextSource implements Pager {
         * in the result or not. By default this is not the case, but when the
         * offset is user-supplied this might be wanted.
         *
-        * @param $include bool
+        * @param bool $include
         */
        public function setIncludeOffset( $include ) {
                $this->mIncludeOffset = $include;
@@ -292,10 +292,10 @@ abstract class IndexPager extends ContextSource implements Pager {
         * Extract some useful data from the result object for use by
         * the navigation bar, put it into $this
         *
-        * @param $isFirst bool: False if there are rows before those fetched (i.e.
+        * @param bool $isFirst False if there are rows before those fetched (i.e.
         *     if a "previous" link would make sense)
-        * @param $limit Integer: exact query limit
-        * @param $res ResultWrapper
+        * @param int $limit Exact query limit
+        * @param ResultWrapper $res
         */
        function extractResultInfo( $isFirst, $limit, ResultWrapper $res ) {
                $numRows = $res->numRows();
@@ -349,7 +349,7 @@ abstract class IndexPager extends ContextSource implements Pager {
        /**
         * Get some text to go in brackets in the "function name" part of the SQL comment
         *
-        * @return String
+        * @return string
         */
        function getSqlComment() {
                return get_class( $this );
@@ -359,22 +359,24 @@ abstract class IndexPager extends ContextSource implements Pager {
         * Do a query with specified parameters, rather than using the object
         * context
         *
-        * @param string $offset index offset, inclusive
-        * @param $limit Integer: exact query limit
-        * @param $descending Boolean: query direction, false for ascending, true for descending
+        * @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 );
+               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 $limit Integer: exact query limit
-        * @param $descending Boolean: query direction, false for ascending, true for descending
+        * @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 ) {
@@ -407,15 +409,16 @@ abstract class IndexPager extends ContextSource implements Pager {
        /**
         * Pre-process results; useful for performing batch existence checks, etc.
         *
-        * @param $result ResultWrapper
+        * @param ResultWrapper $result
         */
-       protected function preprocessResults( $result ) {}
+       protected function preprocessResults( $result ) {
+       }
 
        /**
         * Get the formatted result list. Calls getStartBody(), formatRow() and
         * getEndBody(), concatenates the results and returns them.
         *
-        * @return String
+        * @return string
         */
        public function getBody() {
                if ( !$this->mQueryDone ) {
@@ -455,11 +458,11 @@ abstract class IndexPager extends ContextSource implements Pager {
        /**
         * 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
+        * @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
+        * @return string HTML fragment
         */
        function makeLink( $text, array $query = null, $type = null ) {
                if ( $query === null ) {
@@ -491,13 +494,14 @@ abstract class IndexPager extends ContextSource implements Pager {
         *
         * @return void
         */
-       protected function doBatchLookups() {}
+       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
+        * @return string
         */
        protected function getStartBody() {
                return '';
@@ -506,7 +510,7 @@ abstract class IndexPager extends ContextSource implements Pager {
        /**
         * Hook into getBody() for the end of the list
         *
-        * @return String
+        * @return string
         */
        protected function getEndBody() {
                return '';
@@ -516,7 +520,7 @@ abstract class IndexPager extends ContextSource implements Pager {
         * Hook into getBody(), for the bit between the start and the
         * end when there are no rows
         *
-        * @return String
+        * @return string
         */
        protected function getEmptyBody() {
                return '';
@@ -546,7 +550,7 @@ abstract class IndexPager extends ContextSource implements Pager {
        /**
         * Get the number of rows in the result set
         *
-        * @return Integer
+        * @return int
         */
        function getNumRows() {
                if ( !$this->mQueryDone ) {
@@ -558,7 +562,7 @@ abstract class IndexPager extends ContextSource implements Pager {
        /**
         * Get a URL query array for the prev, next, first and last links.
         *
-        * @return Array
+        * @return array
         */
        function getPagingQueries() {
                if ( !$this->mQueryDone ) {
@@ -597,7 +601,7 @@ abstract class IndexPager extends ContextSource implements Pager {
        /**
         * Returns whether to show the "navigation bar"
         *
-        * @return Boolean
+        * @return bool
         */
        function isNavigationBarShown() {
                if ( !$this->mQueryDone ) {
@@ -613,9 +617,9 @@ abstract class IndexPager extends ContextSource implements Pager {
         * $linkTexts will be used. Both $linkTexts and $disabledTexts are arrays
         * of HTML.
         *
-        * @param $linkTexts Array
-        * @param $disabledTexts Array
-        * @return Array
+        * @param array $linkTexts
+        * @param array $disabledTexts
+        * @return array
         */
        function getPagingLinks( $linkTexts, $disabledTexts = array() ) {
                $queries = $this->getPagingQueries();
@@ -675,7 +679,7 @@ abstract class IndexPager extends ContextSource implements Pager {
         *    options => option array
         *    join_conds => JOIN conditions
         *
-        * @return Array
+        * @return array
         */
        abstract function getQueryInfo();
 
@@ -689,7 +693,7 @@ abstract class IndexPager extends ContextSource implements Pager {
         * 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
+        * @return string|array
         */
        abstract function getIndexField();
 
@@ -707,7 +711,7 @@ abstract class IndexPager extends ContextSource implements Pager {
         * 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
+        * @return array
         */
        protected function getExtraSortFields() {
                return array();
@@ -730,7 +734,7 @@ abstract class IndexPager extends ContextSource implements Pager {
         * particular instantiation, which is a single value.  This is the set of
         * all defaults for the class.
         *
-        * @return Boolean
+        * @return bool
         */
        protected function getDefaultDirections() {
                return false;
@@ -747,7 +751,7 @@ 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
+        * @return string HTML
         */
        function getNavigationBar() {
                if ( !$this->isNavigationBarShown() ) {
@@ -816,7 +820,7 @@ abstract class AlphabeticPager extends IndexPager {
         * array whose keys must exactly match the keys of the array returned
         * by getIndexField(), and whose values are message keys.
         *
-        * @return Array
+        * @return array
         */
        protected function getOrderTypeMessages() {
                return null;
@@ -924,8 +928,9 @@ abstract class ReverseChronologicalPager extends IndexPager {
  * @ingroup Pager
  */
 abstract class TablePager extends IndexPager {
-       var $mSort;
-       var $mCurrentRow;
+       protected $mSort;
+
+       protected $mCurrentRow;
 
        public function __construct( IContextSource $context = null ) {
                if ( $context ) {
@@ -995,7 +1000,10 @@ abstract class TablePager extends IndexPager {
                }
 
                $tableClass = $this->getTableClass();
-               $ret = Html::openElement( 'table', array( 'style' => 'border:1px;', 'class' => "mw-datatable $tableClass" ) );
+               $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";
 
@@ -1024,7 +1032,7 @@ abstract class TablePager extends IndexPager {
        /**
         * @protected
         * @param stdClass $row
-        * @return String HTML
+        * @return string HTML
         */
        function formatRow( $row ) {
                $this->mCurrentRow = $row; // In case formatValue etc need to know
@@ -1052,8 +1060,8 @@ abstract class TablePager extends IndexPager {
         *
         * @protected
         *
-        * @param $row Object: the database result row
-        * @return String
+        * @param object $row The database result row
+        * @return string
         */
        function getRowClass( $row ) {
                return '';
@@ -1064,8 +1072,8 @@ abstract class TablePager extends IndexPager {
         *
         * @protected
         *
-        * @param $row Object: the database result row
-        * @return Array of attribute => value
+        * @param object $row The database result row
+        * @return array Array of attribute => value
         */
        function getRowAttrs( $row ) {
                $class = $this->getRowClass( $row );
@@ -1086,7 +1094,7 @@ abstract class TablePager extends IndexPager {
         *
         * @param string $field The column
         * @param string $value The cell contents
-        * @return Array of attr => value
+        * @return array Array of attr => value
         */
        function getCellAttrs( $field, $value ) {
                return array( 'class' => 'TablePager_col_' . $field );
@@ -1126,7 +1134,7 @@ abstract class TablePager extends IndexPager {
 
        /**
         * A navigation bar with images
-        * @return String HTML
+        * @return string HTML
         */
        public function getNavigationBar() {
                global $wgStylePath;
@@ -1184,8 +1192,8 @@ abstract class TablePager extends IndexPager {
        /**
         * Get a "<select>" element which has options for each of the allowed limits
         *
-        * @param $attribs String: Extra attributes to set
-        * @return String: HTML fragment
+        * @param string $attribs Extra attributes to set
+        * @return string HTML fragment
         */
        public function getLimitSelect( $attribs = array() ) {
                $select = new XmlSelect( 'limit', false, $this->mLimit );
@@ -1232,8 +1240,8 @@ abstract class TablePager extends IndexPager {
         * 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
+        * @param array $blacklist Parameters from the request query which should not be resubmitted
+        * @return string HTML fragment
         */
        function getHiddenFields( $blacklist = array() ) {
                $blacklist = (array)$blacklist;
@@ -1251,7 +1259,7 @@ abstract class TablePager extends IndexPager {
        /**
         * Get a form containing a limit selection dropdown
         *
-        * @return String: HTML fragment
+        * @return string HTML fragment
         */
        function getLimitForm() {
                global $wgScript;
@@ -1285,7 +1293,7 @@ abstract class TablePager extends IndexPager {
         * Return true if the named field should be sortable by the UI, false
         * otherwise
         *
-        * @param $field String
+        * @param string $field
         */
        abstract function isFieldSortable( $field );
 
@@ -1298,8 +1306,8 @@ abstract class TablePager extends IndexPager {
         *
         * @protected
         *
-        * @param string $name the database field name
-        * @param string $value the value retrieved from the database
+        * @param string $name The database field name
+        * @param string $value The value retrieved from the database
         */
        abstract function formatValue( $name, $value );
 
@@ -1317,7 +1325,7 @@ abstract class TablePager extends IndexPager {
         * field name, for use in the table header. The description should be plain
         * text, it will be HTML-escaped later.
         *
-        * @return Array
+        * @return array
         */
        abstract function getFieldNames();
 }
index d367e4d..e5979b8 100644 (file)
@@ -82,10 +82,10 @@ class PathRouter {
         * This is in a separate method so that add() can handle the difference between
         * a single string $path and an array() $path that contains multiple path
         * patterns each with an associated $key to pass on.
-        * @param $path string
-        * @param $params array
-        * @param $options array
-        * @param $key null|string
+        * @param string $path
+        * @param array $params
+        * @param array $options
+        * @param null|string $key
         */
        protected function doAdd( $path, $params, $options, $key = null ) {
                // Make sure all paths start with a /
@@ -170,9 +170,9 @@ class PathRouter {
        /**
         * Add a new path pattern to the path router with the strict option on
         * @see self::add
-        * @param $path string|array
-        * @param $params array
-        * @param $options array
+        * @param string|array $path
+        * @param array $params
+        * @param array $options
         */
        public function addStrict( $path, $params = array(), $options = array() ) {
                $options['strict'] = true;
@@ -192,7 +192,7 @@ class PathRouter {
        }
 
        /**
-        * @param $pattern object
+        * @param object $pattern
         * @return float|int
         */
        protected static function makeWeight( $pattern ) {
@@ -233,7 +233,7 @@ class PathRouter {
         * Parse a path and return the query matches for the path
         *
         * @param string $path The path to parse
-        * @return Array The array of matches for the path
+        * @return array The array of matches for the path
         */
        public function parse( $path ) {
                // Make sure our patterns are sorted by weight so the most specific
@@ -257,8 +257,8 @@ class PathRouter {
        }
 
        /**
-        * @param $path string
-        * @param $pattern string
+        * @param string $path
+        * @param string $pattern
         * @return array|null
         */
        protected static function extractTitle( $path, $pattern ) {
@@ -363,7 +363,7 @@ class PathRouterPatternReplacer {
         * We do this inside of a replacement callback because after replacement we can't tell the
         * difference between a $1 that was not replaced and a $1 that was part of
         * the content a $1 was replaced with.
-        * @param $value string
+        * @param string $value
         * @return string
         */
        public function replace( $value ) {
@@ -376,7 +376,7 @@ class PathRouterPatternReplacer {
        }
 
        /**
-        * @param $m array
+        * @param array $m
         * @return string
         */
        protected function callback( $m ) {
index 4b91386..1f1b7dd 100644 (file)
  * over to the tryUISubmit static method of this class.
  */
 class Preferences {
-       static $defaultPreferences = null;
-       static $saveFilters = array(
-                       'timecorrection' => array( 'Preferences', 'filterTimezoneInput' ),
-                       'cols' => array( 'Preferences', 'filterIntval' ),
-                       'rows' => array( 'Preferences', 'filterIntval' ),
-                       'rclimit' => array( 'Preferences', 'filterIntval' ),
-                       'wllimit' => array( 'Preferences', 'filterIntval' ),
-                       'searchlimit' => array( 'Preferences', 'filterIntval' ),
+       /** @var array */
+       protected static $defaultPreferences = null;
+
+       /** @var array */
+       protected static $saveFilters = array(
+               'timecorrection' => array( 'Preferences', 'filterTimezoneInput' ),
+               'cols' => array( 'Preferences', 'filterIntval' ),
+               'rows' => array( 'Preferences', 'filterIntval' ),
+               'rclimit' => array( 'Preferences', 'filterIntval' ),
+               'wllimit' => array( 'Preferences', 'filterIntval' ),
+               'searchlimit' => array( 'Preferences', 'filterIntval' ),
        );
 
        // Stuff that shouldn't be saved as a preference.
@@ -71,8 +74,8 @@ class Preferences {
 
        /**
         * @throws MWException
-        * @param $user User
-        * @param $context IContextSource
+        * @param User $user
+        * @param IContextSource $context
         * @return array|null
         */
        static function getPreferences( $user, IContextSource $context ) {
@@ -143,10 +146,10 @@ class Preferences {
        /**
         * Pull option from a user account. Handles stuff like array-type preferences.
         *
-        * @param $name
-        * @param $info
-        * @param $user User
-        * @return array|String
+        * @param string $name
+        * @param array $info
+        * @param User $user
+        * @return array|string
         */
        static function getOptionFromUser( $name, $info, $user ) {
                $val = $user->getOption( $name );
@@ -186,9 +189,9 @@ class Preferences {
        }
 
        /**
-        * @param $user User
-        * @param $context IContextSource
-        * @param $defaultPreferences
+        * @param User $user
+        * @param IContextSource $context
+        * @param array $defaultPreferences
         * @return void
         */
        static function profilePreferences( $user, IContextSource $context, &$defaultPreferences ) {
@@ -210,13 +213,6 @@ class Preferences {
                        'section' => 'personal/info',
                );
 
-               $defaultPreferences['userid'] = array(
-                       'type' => 'info',
-                       'label-message' => array( 'uid', $userName ),
-                       'default' => $user->getId(),
-                       'section' => 'personal/info',
-               );
-
                # Get groups to which the user belongs
                $userEffectiveGroups = $user->getEffectiveGroups();
                $userGroups = $userMembers = array();
@@ -562,9 +558,9 @@ class Preferences {
        }
 
        /**
-        * @param $user User
-        * @param $context IContextSource
-        * @param $defaultPreferences
+        * @param User $user
+        * @param IContextSource $context
+        * @param array $defaultPreferences
         * @return void
         */
        static function skinPreferences( $user, IContextSource $context, &$defaultPreferences ) {
@@ -606,9 +602,9 @@ class Preferences {
        }
 
        /**
-        * @param $user User
-        * @param $context IContextSource
-        * @param $defaultPreferences Array
+        * @param User $user
+        * @param IContextSource $context
+        * @param array $defaultPreferences
         */
        static function filesPreferences( $user, IContextSource $context, &$defaultPreferences ) {
                ## Files #####################################
@@ -627,9 +623,9 @@ class Preferences {
        }
 
        /**
-        * @param $user User
-        * @param $context IContextSource
-        * @param $defaultPreferences
+        * @param User $user
+        * @param IContextSource $context
+        * @param array $defaultPreferences
         * @return void
         */
        static function datetimePreferences( $user, IContextSource $context, &$defaultPreferences ) {
@@ -700,9 +696,9 @@ class Preferences {
        }
 
        /**
-        * @param $user User
-        * @param $context IContextSource
-        * @param $defaultPreferences Array
+        * @param User $user
+        * @param IContextSource $context
+        * @param array $defaultPreferences
         */
        static function renderingPreferences( $user, IContextSource $context, &$defaultPreferences ) {
                ## Diffs ####################################
@@ -760,9 +756,9 @@ class Preferences {
        }
 
        /**
-        * @param $user User
-        * @param $context IContextSource
-        * @param $defaultPreferences Array
+        * @param User $user
+        * @param IContextSource $context
+        * @param array $defaultPreferences
         */
        static function editingPreferences( $user, IContextSource $context, &$defaultPreferences ) {
                global $wgAllowUserCssPrefs;
@@ -848,9 +844,9 @@ class Preferences {
        }
 
        /**
-        * @param $user User
-        * @param $context IContextSource
-        * @param $defaultPreferences Array
+        * @param User $user
+        * @param IContextSource $context
+        * @param array $defaultPreferences
         */
        static function rcPreferences( $user, IContextSource $context, &$defaultPreferences ) {
                global $wgRCMaxAge, $wgRCShowWatchingUsers;
@@ -905,9 +901,9 @@ class Preferences {
        }
 
        /**
-        * @param $user User
-        * @param $context IContextSource
-        * @param $defaultPreferences
+        * @param User $user
+        * @param IContextSource $context
+        * @param array $defaultPreferences
         */
        static function watchlistPreferences( $user, IContextSource $context, &$defaultPreferences ) {
                global $wgUseRCPatrol, $wgEnableAPI, $wgRCMaxAge;
@@ -1009,9 +1005,9 @@ class Preferences {
        }
 
        /**
-        * @param $user User
-        * @param $context IContextSource
-        * @param $defaultPreferences Array
+        * @param User $user
+        * @param IContextSource $context
+        * @param array $defaultPreferences
         */
        static function searchPreferences( $user, IContextSource $context, &$defaultPreferences ) {
                global $wgContLang;
@@ -1046,9 +1042,9 @@ class Preferences {
        }
 
        /**
-        * @param $user User The User object
-        * @param $context IContextSource
-        * @return Array: text/links to display as key; $skinkey as value
+        * @param User $user The User object
+        * @param IContextSource $context
+        * @return array Text/links to display as key; $skinkey as value
         */
        static function generateSkinOptions( $user, IContextSource $context ) {
                global $wgDefaultSkin, $wgAllowUserCss, $wgAllowUserJs;
@@ -1104,7 +1100,7 @@ class Preferences {
        }
 
        /**
-        * @param $context IContextSource
+        * @param IContextSource $context
         * @return array
         */
        static function getDateOptions( IContextSource $context ) {
@@ -1139,7 +1135,7 @@ class Preferences {
        }
 
        /**
-        * @param $context IContextSource
+        * @param IContextSource $context
         * @return array
         */
        static function getImageSizes( IContextSource $context ) {
@@ -1157,7 +1153,7 @@ class Preferences {
        }
 
        /**
-        * @param $context IContextSource
+        * @param IContextSource $context
         * @return array
         */
        static function getThumbSizes( IContextSource $context ) {
@@ -1175,9 +1171,9 @@ class Preferences {
        }
 
        /**
-        * @param $signature string
-        * @param $alldata array
-        * @param $form HTMLForm
+        * @param string $signature
+        * @param array $alldata
+        * @param HTMLForm $form
         * @return bool|string
         */
        static function validateSignature( $signature, $alldata, $form ) {
@@ -1200,9 +1196,9 @@ class Preferences {
        }
 
        /**
-        * @param $signature string
-        * @param $alldata array
-        * @param $form HTMLForm
+        * @param string $signature
+        * @param array $alldata
+        * @param HTMLForm $form
         * @return string
         */
        static function cleanSignature( $signature, $alldata, $form ) {
@@ -1218,10 +1214,10 @@ class Preferences {
        }
 
        /**
-        * @param $user User
-        * @param $context IContextSource
-        * @param $formClass string
-        * @param array $remove array of items to remove
+        * @param User $user
+        * @param IContextSource $context
+        * @param string $formClass
+        * @param array $remove Array of items to remove
         * @return HtmlForm
         */
        static function getFormObject(
@@ -1260,7 +1256,7 @@ class Preferences {
        }
 
        /**
-        * @param $context IContextSource
+        * @param IContextSource $context
         * @return array
         */
        static function getTimezoneOptions( IContextSource $context ) {
@@ -1334,8 +1330,8 @@ class Preferences {
        }
 
        /**
-        * @param $value
-        * @param $alldata
+        * @param string $value
+        * @param array $alldata
         * @return int
         */
        static function filterIntval( $value, $alldata ) {
@@ -1343,8 +1339,8 @@ class Preferences {
        }
 
        /**
-        * @param $tz
-        * @param $alldata
+        * @param string $tz
+        * @param array $alldata
         * @return string
         */
        static function filterTimezoneInput( $tz, $alldata ) {
@@ -1377,8 +1373,8 @@ class Preferences {
        /**
         * Handle the form submission if everything validated properly
         *
-        * @param $formData
-        * @param $form PreferencesForm
+        * @param array $formData
+        * @param PreferencesForm $form
         * @return bool|Status|string
         */
        static function tryFormSubmit( $formData, $form ) {
@@ -1401,7 +1397,10 @@ 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 ) && $user->isAllowed( 'editmyprivateinfo' ) && array_key_exists( 'realname', $formData ) ) {
+               if ( !in_array( 'realname', $wgHiddenPrefs )
+                       && $user->isAllowed( 'editmyprivateinfo' )
+                       && array_key_exists( 'realname', $formData )
+               ) {
                        $realName = $formData['realname'];
                        $user->setRealName( $realName );
                }
@@ -1437,8 +1436,8 @@ class Preferences {
        }
 
        /**
-        * @param $formData
-        * @param $form PreferencesForm
+        * @param array $formData
+        * @param PreferencesForm $form
         * @return Status
         */
        public static function tryUISubmit( $formData, $form ) {
@@ -1468,9 +1467,9 @@ class Preferences {
         * right.
         *
         * @deprecated since 1.20; use User::setEmailWithConfirmation() instead.
-        * @param $user User
+        * @param User $user
         * @param string $newaddr New email address
-        * @return Array (true on success or Status on failure, info string)
+        * @return array (true on success or Status on failure, info string)
         */
        public static function trySetUserEmail( User $user, $newaddr ) {
                wfDeprecated( __METHOD__, '1.20' );
@@ -1485,7 +1484,7 @@ class Preferences {
 
        /**
         * @deprecated since 1.19
-        * @param $user User
+        * @param User $user
         * @return array
         */
        public static function loadOldSearchNs( $user ) {
@@ -1513,7 +1512,7 @@ class PreferencesForm extends HTMLForm {
        private $modifiedUser;
 
        /**
-        * @param $user User
+        * @param User $user
         */
        public function setModifiedUser( $user ) {
                $this->modifiedUser = $user;
@@ -1541,8 +1540,8 @@ class PreferencesForm extends HTMLForm {
        }
 
        /**
-        * @param $html string
-        * @return String
+        * @param string $html
+        * @return string
         */
        function wrapForm( $html ) {
                $html = Xml::tags( 'div', array( 'id' => 'preferences' ), $html );
@@ -1551,7 +1550,7 @@ class PreferencesForm extends HTMLForm {
        }
 
        /**
-        * @return String
+        * @return string
         */
        function getButtons() {
                if ( !$this->getModifiedUser()->isAllowedAny( 'editmyprivateinfo', 'editmyoptions' ) ) {
@@ -1574,7 +1573,7 @@ class PreferencesForm extends HTMLForm {
        /**
         * Separate multi-option preferences into multiple preferences, since we
         * have to store them separately
-        * @param $data array
+        * @param array $data
         * @return array
         */
        function filterDataForSubmit( $data ) {
@@ -1603,7 +1602,7 @@ class PreferencesForm extends HTMLForm {
        /**
         * Get the "<legend>" for a given section key. Normally this is the
         * prefs-$key message but we'll allow extensions to override it.
-        * @param $key string
+        * @param string $key
         * @return string
         */
        function getLegend( $key ) {
index a9179eb..a796d35 100644 (file)
@@ -31,10 +31,10 @@ abstract class PrefixSearch {
         * Do a prefix search of titles and return a list of matching page names.
         * @deprecated: Since 1.23, use TitlePrefixSearch or StringPrefixSearch classes
         *
-        * @param $search String
-        * @param $limit Integer
-        * @param array $namespaces used if query is not explicitly prefixed
-        * @return Array of strings
+        * @param string $search
+        * @param int $limit
+        * @param array $namespaces Used if query is not explicitly prefixed
+        * @return array Array of strings
         */
        public static function titleSearch( $search, $limit, $namespaces = array() ) {
                $prefixSearch = new StringPrefixSearch;
@@ -44,10 +44,10 @@ abstract class PrefixSearch {
        /**
         * Do a prefix search of titles and return a list of matching page names.
         *
-        * @param $search String
-        * @param $limit Integer
-        * @param array $namespaces used if query is not explicitly prefixed
-        * @return Array of strings or Title objects
+        * @param string $search
+        * @param int $limit
+        * @param array $namespaces Used if query is not explicitly prefixed
+        * @return array Array of strings or Title objects
         */
        public function search( $search, $limit, $namespaces = array() ) {
                $search = trim( $search );
@@ -82,8 +82,8 @@ abstract class PrefixSearch {
 
        /**
         * Do a prefix search for all possible variants of the prefix
-        * @param $search String
-        * @param $limit Integer
+        * @param string $search
+        * @param int $limit
         * @param array $namespaces
         *
         * @return array
@@ -121,7 +121,7 @@ abstract class PrefixSearch {
         * @param array $titles
         * @return array
         */
-       protected abstract function titles( array $titles );
+       abstract protected function titles( array $titles );
 
        /**
         * When implemented in a descendant class, receives an array of titles as strings and returns
@@ -131,14 +131,14 @@ abstract class PrefixSearch {
         *
         * @return array
         */
-       protected abstract function strings( array $strings );
+       abstract protected function strings( array $strings );
 
        /**
         * Do a prefix search of titles and return a list of matching page names.
-        * @param $namespaces Array
-        * @param $search String
-        * @param $limit Integer
-        * @return Array of strings
+        * @param array $namespaces
+        * @param string $search
+        * @param int $limit
+        * @return array Array of strings
         */
        protected function searchBackend( $namespaces, $search, $limit ) {
                if ( count( $namespaces ) == 1 ) {
@@ -159,9 +159,9 @@ abstract class PrefixSearch {
        /**
         * Prefix search special-case for Special: namespace.
         *
-        * @param string $search term
-        * @param $limit Integer: max number of items to return
-        * @return Array
+        * @param string $search Term
+        * @param int $limit Max number of items to return
+        * @return array
         */
        protected function specialSearch( $search, $limit ) {
                global $wgContLang;
@@ -213,10 +213,10 @@ abstract class PrefixSearch {
         * be automatically capitalized by Title::secureAndSpit()
         * later on depending on $wgCapitalLinks)
         *
-        * @param array $namespaces namespaces to search in
-        * @param string $search term
-        * @param $limit Integer: max number of items to return
-        * @return Array of Title objects
+        * @param array $namespaces Namespaces to search in
+        * @param string $search Term
+        * @param int $limit Max number of items to return
+        * @return array Array of Title objects
         */
        protected function defaultSearchBackend( $namespaces, $search, $limit ) {
                $ns = array_shift( $namespaces ); // support only one namespace
@@ -246,8 +246,8 @@ abstract class PrefixSearch {
        /**
         * Validate an array of numerical namespace indexes
         *
-        * @param $namespaces Array
-        * @return Array (default: contains only NS_MAIN)
+        * @param array $namespaces
+        * @return array (default: contains only NS_MAIN)
         */
        protected function validateNamespaces( $namespaces ) {
                global $wgContLang;
@@ -296,7 +296,9 @@ class TitlePrefixSearch extends PrefixSearch {
 class StringPrefixSearch extends PrefixSearch {
 
        protected function titles( array $titles ) {
-               return array_map( function( Title $t ) { return $t->getPrefixedText(); }, $titles );
+               return array_map( function ( Title $t ) {
+                       return $t->getPrefixedText();
+               }, $titles );
        }
 
        protected function strings( array $strings ) {
index bcb88e9..d34ee03 100644 (file)
  * Handles the page protection UI and backend
  */
 class ProtectionForm {
-       /** A map of action to restriction level, from request or default */
-       var $mRestrictions = array();
+       /** @var array A map of action to restriction level, from request or default */
+       protected $mRestrictions = array();
 
-       /** The custom/additional protection reason */
-       var $mReason = '';
+       /** @var string The custom/additional protection reason */
+       protected $mReason = '';
 
-       /** The reason selected from the list, blank for other/additional */
-       var $mReasonSelection = '';
+       /** @var string The reason selected from the list, blank for other/additional */
+       protected $mReasonSelection = '';
 
-       /** True if the restrictions are cascading, from request or existing protection */
-       var $mCascade = false;
+       /** @var bool True if the restrictions are cascading, from request or existing protection */
+       protected $mCascade = false;
 
-       /** Map of action to "other" expiry time. Used in preference to mExpirySelection. */
-       var $mExpiry = array();
+       /** @var array Map of action to "other" expiry time. Used in preference to mExpirySelection. */
+       protected $mExpiry = array();
 
        /**
-        * Map of action to value selected in expiry drop-down list.
+        * @var array Map of action to value selected in expiry drop-down list.
         * Will be set to 'othertime' whenever mExpiry is set.
         */
-       var $mExpirySelection = array();
+       protected $mExpirySelection = array();
 
-       /** Permissions errors for the protect action */
-       var $mPermErrors = array();
+       /** @var array Permissions errors for the protect action */
+       protected $mPermErrors = array();
 
-       /** Types (i.e. actions) for which levels can be selected */
-       var $mApplicableTypes = array();
+       /** @var array Types (i.e. actions) for which levels can be selected */
+       protected $mApplicableTypes = array();
 
-       /** Map of action to the expiry time of the existing protection */
-       var $mExistingExpiry = array();
+       /** @var array Map of action to the expiry time of the existing protection */
+       protected $mExistingExpiry = array();
 
        function __construct( Page $article ) {
                global $wgUser;
@@ -141,7 +141,7 @@ class ProtectionForm {
        /**
         * Get the expiry time for a given action, by combining the relevant inputs.
         *
-        * @param $action string
+        * @param string $action
         *
         * @return string 14-char timestamp or "infinity", or false if the input was invalid
         */
@@ -192,7 +192,7 @@ class ProtectionForm {
        /**
         * Show the input form with optional error message
         *
-        * @param string $err error message or null if there's no error
+        * @param string $err Error message or null if there's no error
         */
        function show( $err = null ) {
                global $wgOut;
@@ -209,7 +209,10 @@ class ProtectionForm {
                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( 'protect-norestrictiontypes-title', $this->mTitle->getPrefixedText() ) );
+                       $wgOut->setPageTitle( wfMessage(
+                               'protect-norestrictiontypes-title',
+                               $this->mTitle->getPrefixedText()
+                       ) );
                        $wgOut->addWikiText( wfMessage( 'protect-norestrictiontypes-text' )->text() );
 
                        // Show the log in case protection was possible once
@@ -226,13 +229,20 @@ class ProtectionForm {
                                $titles .= '* [[:' . $title->getPrefixedText() . "]]\n";
                        }
 
-                       $wgOut->wrapWikiMsg( "<div id=\"mw-protect-cascadeon\">\n$1\n" . $titles . "</div>", array( 'protect-cascadeon', count( $cascadeSources ) ) );
+                       /** @todo FIXME: i18n issue, should use formatted number. */
+                       $wgOut->wrapWikiMsg(
+                               "<div id=\"mw-protect-cascadeon\">\n$1\n" . $titles . "</div>",
+                               array( 'protect-cascadeon', count( $cascadeSources ) )
+                       );
                }
 
                # 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( wfMessage( 'protect-title-notallowed', $this->mTitle->getPrefixedText() ) );
+                       $wgOut->setPageTitle(
+                               wfMessage( 'protect-title-notallowed',
+                                       $this->mTitle->getPrefixedText() )
+                       );
                        $wgOut->addWikiText( $wgOut->formatPermissionsErrorMessage( $this->mPermErrors, 'protect' ) );
                } else {
                        $wgOut->setPageTitle( wfMessage( 'protect-title', $this->mTitle->getPrefixedText() ) );
@@ -247,7 +257,7 @@ class ProtectionForm {
        /**
         * Save submitted protection form
         *
-        * @return Boolean: success
+        * @return bool Success
         */
        function save() {
                global $wgRequest, $wgUser, $wgOut;
@@ -290,7 +300,13 @@ class ProtectionForm {
 
                $this->mCascade = $wgRequest->getBool( 'mwProtect-cascade' );
 
-               $status = $this->mArticle->doUpdateRestrictions( $this->mRestrictions, $expiry, $this->mCascade, $reasonstr, $wgUser );
+               $status = $this->mArticle->doUpdateRestrictions(
+                       $this->mRestrictions,
+                       $expiry,
+                       $this->mCascade,
+                       $reasonstr,
+                       $wgUser
+               );
 
                if ( !$status->isOK() ) {
                        $this->show( $wgOut->parseInline( $status->getWikiText() ) );
@@ -322,7 +338,7 @@ class ProtectionForm {
        /**
         * Build the input form
         *
-        * @return String: HTML form
+        * @return string HTML form
         */
        function buildForm() {
                global $wgUser, $wgLang, $wgOut;
@@ -403,7 +419,11 @@ class ProtectionForm {
                                }
                                $show = htmlspecialchars( $show );
                                $value = htmlspecialchars( $value );
-                               $expiryFormOptions .= Xml::option( $show, $value, $this->mExpirySelection[$action] === $value ) . "\n";
+                               $expiryFormOptions .= Xml::option(
+                                       $show,
+                                       $value,
+                                       $this->mExpirySelection[$action] === $value
+                               ) . "\n";
                        }
                        # Add expiry dropdown
                        if ( $showProtectOptions && !$this->disabled ) {
@@ -526,7 +546,10 @@ class ProtectionForm {
                }
 
                if ( !$this->disabled ) {
-                       $out .= Html::hidden( 'wpEditToken', $wgUser->getEditToken( array( 'protect', $this->mTitle->getPrefixedDBkey() ) ) );
+                       $out .= Html::hidden(
+                               'wpEditToken',
+                               $wgUser->getEditToken( array( 'protect', $this->mTitle->getPrefixedDBkey() ) )
+                       );
                        $out .= Xml::closeElement( 'form' );
                        $wgOut->addScript( $this->buildCleanupScript() );
                }
@@ -537,9 +560,9 @@ class ProtectionForm {
        /**
         * Build protection level selector
         *
-        * @param string $action action to protect
-        * @param string $selected current protection level
-        * @return String: HTML fragment
+        * @param string $action Action to protect
+        * @param string $selected Current protection level
+        * @return string HTML fragment
         */
        function buildSelector( $action, $selected ) {
                global $wgUser;
@@ -569,8 +592,8 @@ class ProtectionForm {
        /**
         * Prepare the label for a protection selector option
         *
-        * @param string $permission permission required
-        * @return String
+        * @param string $permission Permission required
+        * @return string
         */
        private function getOptionLabel( $permission ) {
                if ( $permission == '' ) {
@@ -604,7 +627,7 @@ class ProtectionForm {
        /**
         * Show protection long extracts for this page
         *
-        * @param $out OutputPage
+        * @param OutputPage $out
         * @access private
         */
        function showLogExtract( &$out ) {
index 29bbd52..82dea0d 100644 (file)
  * @ingroup SpecialPage
  */
 abstract class QueryPage extends SpecialPage {
-       /**
-        * Whether or not we want plain listoutput rather than an ordered list
-        *
-        * @var bool
-        */
-       var $listoutput = false;
+       /** @var bool Whether or not we want plain listoutput rather than an ordered list */
+       protected $listoutput = false;
 
-       /**
-        * The offset and limit in use, as passed to the query() function
-        *
-        * @var int
-        */
-       var $offset = 0;
-       var $limit = 0;
+       /** @var int The offset and limit in use, as passed to the query() function */
+       protected $offset = 0;
+
+       /** @var int */
+       protected $limit = 0;
 
        /**
         * The number of rows returned by the query. Reading this variable
@@ -53,7 +47,7 @@ abstract class QueryPage extends SpecialPage {
        protected $cachedTimestamp = null;
 
        /**
-        * Wheter to show prev/next links
+        * Whether to show prev/next links
         */
        protected $shownavigation = true;
 
@@ -359,6 +353,7 @@ abstract class QueryPage extends SpecialPage {
 
        /**
         * Get a DB connection to be used for slow recache queries
+        * @return DatabaseBase
         */
        function getRecacheDB() {
                return wfGetDB( DB_SLAVE, array( $this->getName(), 'QueryPage::recache', 'vslow' ) );
@@ -502,7 +497,7 @@ abstract class QueryPage extends SpecialPage {
                        list( $this->limit, $this->offset ) = $this->getRequest()->getLimitOffset();
                }
 
-               // TODO: Use doQuery()
+               // @todo Use doQuery()
                if ( !$this->isCached() ) {
                        # select one extra row for navigation
                        $res = $this->reallyDoQuery( $this->limit + 1, $this->offset );
@@ -594,7 +589,7 @@ abstract class QueryPage extends SpecialPage {
         * @param OutputPage $out OutputPage to print to
         * @param Skin $skin User skin to use
         * @param DatabaseBase $dbr Database (read) connection to use
-        * @param int $res Result pointer
+        * @param ResultWrapper $res Result pointer
         * @param int $num Number of available result rows
         * @param int $offset Paging offset
         */
@@ -609,7 +604,9 @@ abstract class QueryPage extends SpecialPage {
 
                        # $res might contain the whole 1,000 rows, so we read up to
                        # $num [should update this to use a Pager]
+                       // @codingStandardsIgnoreStart Generic.CodeAnalysis.ForLoopWithTestFunctionCall.NotAllowed
                        for ( $i = 0; $i < $num && $row = $res->fetchObject(); $i++ ) {
+                               // @codingStandardsIgnoreEnd
                                $line = $this->formatResult( $skin, $row );
                                if ( $line ) {
                                        $attr = ( isset( $row->usepatrol ) && $row->usepatrol && $row->patrolled == 0 )
@@ -648,7 +645,7 @@ abstract class QueryPage extends SpecialPage {
        }
 
        /**
-        * @param $offset
+        * @param int $offset
         * @return string
         */
        function openList( $offset ) {
@@ -667,7 +664,8 @@ abstract class QueryPage extends SpecialPage {
         * @param DatabaseBase $db
         * @param ResultWrapper $res
         */
-       function preprocessResults( $db, $res ) {}
+       function preprocessResults( $db, $res ) {
+       }
 
        /**
         * Similar to above, but packaging in a syndicated feed instead of a web page
@@ -686,6 +684,7 @@ abstract class QueryPage extends SpecialPage {
                $limit = min( $limit, $wgFeedLimit );
 
                if ( isset( $wgFeedClasses[$class] ) ) {
+                       /** @var RSSFeed|AtomFeed $feed */
                        $feed = new $wgFeedClasses[$class](
                                $this->feedTitle(),
                                $this->feedDesc(),
index 797980f..a403e37 100644 (file)
@@ -86,9 +86,9 @@ class Revision implements IDBAccessObject {
         *      Revision::READ_LATEST  : Select the data from the master
         *      Revision::READ_LOCKING : Select & lock the data from the master
         *
-        * @param $id Integer
-        * @param $flags Integer (optional)
-        * @return Revision or null
+        * @param int $id
+        * @param int $flags (optional)
+        * @return Revision|null
         */
        public static function newFromId( $id, $flags = 0 ) {
                return self::newFromConds( array( 'rev_id' => intval( $id ) ), $flags );
@@ -103,10 +103,10 @@ class Revision implements IDBAccessObject {
         *      Revision::READ_LATEST  : Select the data from the master
         *      Revision::READ_LOCKING : Select & lock the data from the master
         *
-        * @param $title Title
-        * @param $id Integer (optional)
-        * @param $flags Integer Bitfield (optional)
-        * @return Revision or null
+        * @param Title $title
+        * @param int $id (optional)
+        * @param int $flags Bitfield (optional)
+        * @return Revision|null
         */
        public static function newFromTitle( $title, $id = 0, $flags = 0 ) {
                $conds = array(
@@ -134,10 +134,10 @@ class Revision implements IDBAccessObject {
         *      Revision::READ_LATEST  : Select the data from the master (since 1.20)
         *      Revision::READ_LOCKING : Select & lock the data from the master
         *
-        * @param $revId Integer
-        * @param $pageId Integer (optional)
-        * @param $flags Integer Bitfield (optional)
-        * @return Revision or null
+        * @param int $pageId
+        * @param int $revId (optional)
+        * @param int $flags Bitfield (optional)
+        * @return Revision|null
         */
        public static function newFromPageId( $pageId, $revId = 0, $flags = 0 ) {
                $conds = array( 'page_id' => $pageId );
@@ -155,8 +155,8 @@ class Revision implements IDBAccessObject {
         * for permissions or even inserted (as in Special:Undelete)
         * @todo FIXME: Should be a subclass for RevisionDelete. [TS]
         *
-        * @param $row
-        * @param $overrides array
+        * @param object $row
+        * @param array $overrides
         *
         * @throws MWException
         * @return Revision
@@ -205,7 +205,7 @@ class Revision implements IDBAccessObject {
        /**
         * @since 1.19
         *
-        * @param $row
+        * @param object $row
         * @return Revision
         */
        public static function newFromRow( $row ) {
@@ -216,9 +216,9 @@ class Revision implements IDBAccessObject {
         * Load a page revision from a given revision ID number.
         * Returns null if no such revision can be found.
         *
-        * @param $db DatabaseBase
-        * @param $id Integer
-        * @return Revision or null
+        * @param DatabaseBase $db
+        * @param int $id
+        * @return Revision|null
         */
        public static function loadFromId( $db, $id ) {
                return self::loadFromConds( $db, array( 'rev_id' => intval( $id ) ) );
@@ -229,10 +229,10 @@ class Revision implements IDBAccessObject {
         * that's attached to a given page. If not attached
         * to that page, will return null.
         *
-        * @param $db DatabaseBase
-        * @param $pageid Integer
-        * @param $id Integer
-        * @return Revision or null
+        * @param DatabaseBase $db
+        * @param int $pageid
+        * @param int $id
+        * @return Revision|null
         */
        public static function loadFromPageId( $db, $pageid, $id = 0 ) {
                $conds = array( 'rev_page' => intval( $pageid ), 'page_id' => intval( $pageid ) );
@@ -249,10 +249,10 @@ class Revision implements IDBAccessObject {
         * that's attached to a given page. If not attached
         * to that page, will return null.
         *
-        * @param $db DatabaseBase
-        * @param $title Title
-        * @param $id Integer
-        * @return Revision or null
+        * @param DatabaseBase $db
+        * @param Title $title
+        * @param int $id
+        * @return Revision|null
         */
        public static function loadFromTitle( $db, $title, $id = 0 ) {
                if ( $id ) {
@@ -274,10 +274,10 @@ class Revision implements IDBAccessObject {
         * WARNING: Timestamps may in some circumstances not be unique,
         * so this isn't the best key to use.
         *
-        * @param $db DatabaseBase
-        * @param $title Title
-        * @param $timestamp String
-        * @return Revision or null
+        * @param DatabaseBase $db
+        * @param Title $title
+        * @param string $timestamp
+        * @return Revision|null
         */
        public static function loadFromTimestamp( $db, $title, $timestamp ) {
                return self::loadFromConds( $db,
@@ -292,9 +292,9 @@ class Revision implements IDBAccessObject {
        /**
         * Given a set of conditions, fetch a revision.
         *
-        * @param $conditions Array
-        * @param $flags integer (optional)
-        * @return Revision or null
+        * @param array $conditions
+        * @param int $flags (optional)
+        * @return Revision|null
         */
        private static function newFromConds( $conditions, $flags = 0 ) {
                $db = wfGetDB( ( $flags & self::READ_LATEST ) ? DB_MASTER : DB_SLAVE );
@@ -315,10 +315,10 @@ class Revision implements IDBAccessObject {
         * Given a set of conditions, fetch a revision from
         * the given database connection.
         *
-        * @param $db DatabaseBase
-        * @param $conditions Array
-        * @param $flags integer (optional)
-        * @return Revision or null
+        * @param DatabaseBase $db
+        * @param array $conditions
+        * @param int $flags (optional)
+        * @return Revision|null
         */
        private static function loadFromConds( $db, $conditions, $flags = 0 ) {
                $res = self::fetchFromConds( $db, $conditions, $flags );
@@ -338,7 +338,7 @@ class Revision implements IDBAccessObject {
         * fetch all of a given page's revisions in turn.
         * Each row can be fed to the constructor to get objects.
         *
-        * @param $title Title
+        * @param Title $title
         * @return ResultWrapper
         */
        public static function fetchRevision( $title ) {
@@ -357,9 +357,9 @@ class Revision implements IDBAccessObject {
         * which will return matching database rows with the
         * fields necessary to build Revision objects.
         *
-        * @param $db DatabaseBase
-        * @param $conditions Array
-        * @param $flags integer (optional)
+        * @param DatabaseBase $db
+        * @param array $conditions
+        * @param int $flags (optional)
         * @return ResultWrapper
         */
        private static function fetchFromConds( $db, $conditions, $flags = 0 ) {
@@ -386,7 +386,7 @@ class Revision implements IDBAccessObject {
         * Return the value of a select() JOIN conds array for the user table.
         * This will get user table rows for logged-in users.
         * @since 1.19
-        * @return Array
+        * @return array
         */
        public static function userJoinCond() {
                return array( 'LEFT JOIN', array( 'rev_user != 0', 'user_id = rev_user' ) );
@@ -396,7 +396,7 @@ class Revision implements IDBAccessObject {
         * Return the value of a select() page conds array for the page table.
         * This will assure that the revision(s) are not orphaned from live pages.
         * @since 1.19
-        * @return Array
+        * @return array
         */
        public static function pageJoinCond() {
                return array( 'INNER JOIN', array( 'page_id = rev_page' ) );
@@ -444,6 +444,7 @@ class Revision implements IDBAccessObject {
                        'ar_id',
                        'ar_page_id',
                        'ar_rev_id',
+                       'ar_text',
                        'ar_text_id',
                        'ar_timestamp',
                        'ar_comment',
@@ -500,8 +501,8 @@ class Revision implements IDBAccessObject {
 
        /**
         * Do a batched query to get the parent revision lengths
-        * @param $db DatabaseBase
-        * @param $revIds Array
+        * @param DatabaseBase $db
+        * @param array $revIds
         * @return array
         */
        public static function getParentLengths( $db, array $revIds ) {
@@ -524,7 +525,7 @@ class Revision implements IDBAccessObject {
        /**
         * Constructor
         *
-        * @param $row Mixed: either a database row or an array
+        * @param object|array $row Either a database row or an array
         * @throws MWException
         * @access private
         */
@@ -698,7 +699,7 @@ class Revision implements IDBAccessObject {
        /**
         * Get revision ID
         *
-        * @return Integer|null
+        * @return int|null
         */
        public function getId() {
                return $this->mId;
@@ -708,7 +709,7 @@ class Revision implements IDBAccessObject {
         * Set the revision ID
         *
         * @since 1.19
-        * @param $id Integer
+        * @param int $id
         */
        public function setId( $id ) {
                $this->mId = $id;
@@ -717,7 +718,7 @@ class Revision implements IDBAccessObject {
        /**
         * Get text row ID
         *
-        * @return Integer|null
+        * @return int|null
         */
        public function getTextId() {
                return $this->mTextId;
@@ -726,7 +727,7 @@ class Revision implements IDBAccessObject {
        /**
         * Get parent revision ID (the original previous page revision)
         *
-        * @return Integer|null
+        * @return int|null
         */
        public function getParentId() {
                return $this->mParentId;
@@ -735,7 +736,7 @@ class Revision implements IDBAccessObject {
        /**
         * Returns the length of the text in this revision, or null if unknown.
         *
-        * @return Integer|null
+        * @return int|null
         */
        public function getSize() {
                return $this->mSize;
@@ -744,7 +745,7 @@ class Revision implements IDBAccessObject {
        /**
         * Returns the base36 sha1 of the text in this revision, or null if unknown.
         *
-        * @return String|null
+        * @return string|null
         */
        public function getSha1() {
                return $this->mSha1;
@@ -785,7 +786,7 @@ class Revision implements IDBAccessObject {
        /**
         * Set the title of the revision
         *
-        * @param $title Title
+        * @param Title $title
         */
        public function setTitle( $title ) {
                $this->mTitle = $title;
@@ -794,7 +795,7 @@ class Revision implements IDBAccessObject {
        /**
         * Get the page ID
         *
-        * @return Integer|null
+        * @return int|null
         */
        public function getPage() {
                return $this->mPage;
@@ -805,13 +806,13 @@ class Revision implements IDBAccessObject {
         * If the specified audience does not have access to it, zero will be
         * returned.
         *
-        * @param $audience Integer: one of:
-        *      Revision::FOR_PUBLIC       to be displayed to all users
-        *      Revision::FOR_THIS_USER    to be displayed to the given user
-        *      Revision::RAW              get the ID regardless of permissions
-        * @param $user User object to check for, only if FOR_THIS_USER is passed
-        *              to the $audience parameter
-        * @return Integer
+        * @param int $audience One of:
+        *   Revision::FOR_PUBLIC       to be displayed to all users
+        *   Revision::FOR_THIS_USER    to be displayed to the given user
+        *   Revision::RAW              get the ID regardless of permissions
+        * @param User $user User object to check for, only if FOR_THIS_USER is passed
+        *   to the $audience parameter
+        * @return int
         */
        public function getUser( $audience = self::FOR_PUBLIC, User $user = null ) {
                if ( $audience == self::FOR_PUBLIC && $this->isDeleted( self::DELETED_USER ) ) {
@@ -826,7 +827,7 @@ class Revision implements IDBAccessObject {
        /**
         * Fetch revision's user id without regard for the current user's permissions
         *
-        * @return String
+        * @return string
         */
        public function getRawUser() {
                return $this->mUser;
@@ -837,12 +838,12 @@ class Revision implements IDBAccessObject {
         * If the specified audience does not have access to the username, an
         * empty string will be returned.
         *
-        * @param $audience Integer: one of:
-        *      Revision::FOR_PUBLIC       to be displayed to all users
-        *      Revision::FOR_THIS_USER    to be displayed to the given user
-        *      Revision::RAW              get the text regardless of permissions
-        * @param $user User object to check for, only if FOR_THIS_USER is passed
-        *              to the $audience parameter
+        * @param int $audience One of:
+        *   Revision::FOR_PUBLIC       to be displayed to all users
+        *   Revision::FOR_THIS_USER    to be displayed to the given user
+        *   Revision::RAW              get the text regardless of permissions
+        * @param User $user User object to check for, only if FOR_THIS_USER is passed
+        *   to the $audience parameter
         * @return string
         */
        public function getUserText( $audience = self::FOR_PUBLIC, User $user = null ) {
@@ -858,7 +859,7 @@ class Revision implements IDBAccessObject {
        /**
         * Fetch revision's username without regard for view restrictions
         *
-        * @return String
+        * @return string
         */
        public function getRawUserText() {
                if ( $this->mUserText === null ) {
@@ -877,13 +878,13 @@ class Revision implements IDBAccessObject {
         * If the specified audience does not have access to the comment, an
         * empty string will be returned.
         *
-        * @param $audience Integer: one of:
-        *      Revision::FOR_PUBLIC       to be displayed to all users
-        *      Revision::FOR_THIS_USER    to be displayed to the given user
-        *      Revision::RAW              get the text regardless of permissions
-        * @param $user User object to check for, only if FOR_THIS_USER is passed
-        *              to the $audience parameter
-        * @return String
+        * @param int $audience One of:
+        *   Revision::FOR_PUBLIC       to be displayed to all users
+        *   Revision::FOR_THIS_USER    to be displayed to the given user
+        *   Revision::RAW              get the text regardless of permissions
+        * @param User $user User object to check for, only if FOR_THIS_USER is passed
+        *   to the $audience parameter
+        * @return string
         */
        function getComment( $audience = self::FOR_PUBLIC, User $user = null ) {
                if ( $audience == self::FOR_PUBLIC && $this->isDeleted( self::DELETED_COMMENT ) ) {
@@ -898,21 +899,21 @@ class Revision implements IDBAccessObject {
        /**
         * Fetch revision comment without regard for the current user's permissions
         *
-        * @return String
+        * @return string
         */
        public function getRawComment() {
                return $this->mComment;
        }
 
        /**
-        * @return Boolean
+        * @return bool
         */
        public function isMinor() {
                return (bool)$this->mMinorEdit;
        }
 
        /**
-        * @return integer rcid of the unpatrolled row, zero if there isn't one
+        * @return int Rcid of the unpatrolled row, zero if there isn't one
         */
        public function isUnpatrolled() {
                if ( $this->mUnpatrolled !== null ) {
@@ -948,7 +949,7 @@ class Revision implements IDBAccessObject {
        /**
         * @param int $field one of DELETED_* bitfield constants
         *
-        * @return Boolean
+        * @return bool
         */
        public function isDeleted( $field ) {
                return ( $this->mDeleted & $field ) == $field;
@@ -968,16 +969,16 @@ class Revision implements IDBAccessObject {
         * If the specified audience does not have the ability to view this
         * revision, an empty string will be returned.
         *
-        * @param $audience Integer: one of:
-        *      Revision::FOR_PUBLIC       to be displayed to all users
-        *      Revision::FOR_THIS_USER    to be displayed to the given user
-        *      Revision::RAW              get the text regardless of permissions
-        * @param $user User object to check for, only if FOR_THIS_USER is passed
-        *              to the $audience parameter
+        * @param int $audience One of:
+        *   Revision::FOR_PUBLIC       to be displayed to all users
+        *   Revision::FOR_THIS_USER    to be displayed to the given user
+        *   Revision::RAW              get the text regardless of permissions
+        * @param User $user User object to check for, only if FOR_THIS_USER is passed
+        *   to the $audience parameter
         *
         * @deprecated since 1.21, use getContent() instead
         * @todo Replace usage in core
-        * @return String
+        * @return string
         */
        public function getText( $audience = self::FOR_PUBLIC, User $user = null ) {
                ContentHandler::deprecated( __METHOD__, '1.21' );
@@ -991,12 +992,12 @@ class Revision implements IDBAccessObject {
         * If the specified audience does not have the ability to view this
         * revision, null will be returned.
         *
-        * @param $audience Integer: one of:
-        *      Revision::FOR_PUBLIC       to be displayed to all users
-        *      Revision::FOR_THIS_USER    to be displayed to $wgUser
-        *      Revision::RAW              get the text regardless of permissions
-        * @param $user User object to check for, only if FOR_THIS_USER is passed
-        *              to the $audience parameter
+        * @param int $audience One of:
+        *   Revision::FOR_PUBLIC       to be displayed to all users
+        *   Revision::FOR_THIS_USER    to be displayed to $wgUser
+        *   Revision::RAW              get the text regardless of permissions
+        * @param User $user User object to check for, only if FOR_THIS_USER is passed
+        *   to the $audience parameter
         * @since 1.21
         * @return Content|null
         */
@@ -1013,7 +1014,7 @@ class Revision implements IDBAccessObject {
        /**
         * Fetch revision text without regard for view restrictions
         *
-        * @return String
+        * @return string
         *
         * @deprecated since 1.21. Instead, use Revision::getContent( Revision::RAW )
         *                         or Revision::getSerializedData() as appropriate.
@@ -1027,7 +1028,7 @@ class Revision implements IDBAccessObject {
         * Fetch original serialized data without regard for view restrictions
         *
         * @since 1.21
-        * @return String
+        * @return string
         */
        public function getSerializedData() {
                if ( is_null( $this->mText ) ) {
@@ -1044,7 +1045,7 @@ class Revision implements IDBAccessObject {
         * fresh clone.
         *
         * @since 1.21
-        * @return Content|null the Revision's content, or null on failure.
+        * @return Content|null The Revision's content, or null on failure.
         */
        protected function getContentInternal() {
                if ( is_null( $this->mContent ) ) {
@@ -1075,7 +1076,7 @@ class Revision implements IDBAccessObject {
         * used to determine the content model to use. If no title is know, CONTENT_MODEL_WIKITEXT
         * is used as a last resort.
         *
-        * @return String the content model id associated with this revision,
+        * @return string The content model id associated with this revision,
         *     see the CONTENT_MODEL_XXX constants.
         **/
        public function getContentModel() {
@@ -1095,7 +1096,7 @@ class Revision implements IDBAccessObject {
         * If no content format was stored in the database, the default format for this
         * revision's content model is returned.
         *
-        * @return String the content format id associated with this revision,
+        * @return string The content format id associated with this revision,
         *     see the CONTENT_FORMAT_XXX constants.
         **/
        public function getContentFormat() {
@@ -1132,14 +1133,14 @@ class Revision implements IDBAccessObject {
        }
 
        /**
-        * @return String
+        * @return string
         */
        public function getTimestamp() {
                return wfTimestamp( TS_MW, $this->mTimestamp );
        }
 
        /**
-        * @return Boolean
+        * @return bool
         */
        public function isCurrent() {
                return $this->mCurrent;
@@ -1163,7 +1164,7 @@ class Revision implements IDBAccessObject {
        /**
         * Get next revision for this title
         *
-        * @return Revision or null
+        * @return Revision|null
         */
        public function getNext() {
                if ( $this->getTitle() ) {
@@ -1179,8 +1180,8 @@ class Revision implements IDBAccessObject {
         * Get previous revision Id for this page_id
         * This is used to populate rev_parent_id on save
         *
-        * @param $db DatabaseBase
-        * @return Integer
+        * @param DatabaseBase $db
+        * @return int
         */
        private function getPreviousRevisionId( $db ) {
                if ( is_null( $this->mPage ) ) {
@@ -1201,18 +1202,18 @@ class Revision implements IDBAccessObject {
        }
 
        /**
-         * Get revision text associated with an old or archive row
-         * $row is usually an object from wfFetchRow(), both the flags and the text
-         * field must be included.
-         *
-         * @param stdClass $row The text data
-         * @param string $prefix Table prefix (default 'old_')
-         * @param string|bool $wiki The name of the wiki to load the revision text from
-         *   (same as the the wiki $row was loaded from) or false to indicate the local
-         *   wiki (this is the default). Otherwise, it must be a symbolic wiki database
-         *   identifier as understood by the LoadBalancer class.
-         * @return string Text the text requested or false on failure
-         */
+        * Get revision text associated with an old or archive row
+        * $row is usually an object from wfFetchRow(), both the flags and the text
+        * field must be included.
+        *
+        * @param stdClass $row The text data
+        * @param string $prefix Table prefix (default 'old_')
+        * @param string|bool $wiki The name of the wiki to load the revision text from
+        *   (same as the the wiki $row was loaded from) or false to indicate the local
+        *   wiki (this is the default). Otherwise, it must be a symbolic wiki database
+        *   identifier as understood by the LoadBalancer class.
+        * @return string Text the text requested or false on failure
+        */
        public static function getRevisionText( $row, $prefix = 'old_', $wiki = false ) {
                wfProfileIn( __METHOD__ );
 
@@ -1259,8 +1260,8 @@ class Revision implements IDBAccessObject {
         * data is compressed, and 'utf-8' if we're saving in UTF-8
         * mode.
         *
-        * @param $text Mixed: reference to a text
-        * @return String
+        * @param mixed $text Reference to a text
+        * @return string
         */
        public static function compressRevisionText( &$text ) {
                global $wgCompressRevisions;
@@ -1284,9 +1285,9 @@ class Revision implements IDBAccessObject {
        /**
         * Re-converts revision text according to it's flags.
         *
-        * @param $text Mixed: reference to a text
-        * @param $flags array: compression flags
-        * @return String|bool decompressed text, or false on failure
+        * @param mixed $text Reference to a text
+        * @param array $flags Compression flags
+        * @return string|bool Decompressed text, or false on failure
         */
        public static function decompressRevisionText( $text, $flags ) {
                if ( in_array( 'gzip', $flags ) ) {
@@ -1325,9 +1326,9 @@ class Revision implements IDBAccessObject {
         * Insert a new revision into the database, returning the new revision ID
         * number on success and dies horribly on failure.
         *
-        * @param $dbw DatabaseBase: (master connection)
+        * @param DatabaseBase $dbw (master connection)
         * @throws MWException
-        * @return Integer
+        * @return int
         */
        public function insertOn( $dbw ) {
                global $wgDefaultExternalStore, $wgContentHandlerUseDB;
@@ -1477,8 +1478,8 @@ class Revision implements IDBAccessObject {
 
        /**
         * Get the base 36 SHA-1 value for a string of text
-        * @param $text String
-        * @return String
+        * @param string $text
+        * @return string
         */
        public static function base36Sha1( $text ) {
                return wfBaseConvert( sha1( $text ), 16, 36, 31 );
@@ -1488,7 +1489,7 @@ class Revision implements IDBAccessObject {
         * Lazy-load the revision's text.
         * Currently hardcoded to the 'text' table storage engine.
         *
-        * @return String|bool the revision's text, or false on failure
+        * @return string|bool The revision's text, or false on failure
         */
        protected function loadText() {
                wfProfileIn( __METHOD__ );
@@ -1562,13 +1563,14 @@ class Revision implements IDBAccessObject {
         * Such revisions can for instance identify page rename
         * operations and other such meta-modifications.
         *
-        * @param $dbw DatabaseBase
-        * @param $pageId Integer: ID number of the page to read from
-        * @param string $summary revision's summary
-        * @param $minor Boolean: whether the revision should be considered as minor
-        * @return Revision|null on error
+        * @param DatabaseBase $dbw
+        * @param int $pageId: ID number of the page to read from
+        * @param string $summary Revision's summary
+        * @param bool $minor Whether the revision should be considered as minor
+        * @param User|null $user User object to use or null for $wgUser
+        * @return Revision|null Revision or null on error
         */
-       public static function newNullRevision( $dbw, $pageId, $summary, $minor ) {
+       public static function newNullRevision( $dbw, $pageId, $summary, $minor, $user = null ) {
                global $wgContentHandlerUseDB;
 
                wfProfileIn( __METHOD__ );
@@ -1591,8 +1593,15 @@ class Revision implements IDBAccessObject {
                        __METHOD__ );
 
                if ( $current ) {
+                       if ( !$user ) {
+                               global $wgUser;
+                               $user = $wgUser;
+                       }
+
                        $row = array(
                                'page'       => $pageId,
+                               'user_text'  => $user->getName(),
+                               'user'       => $user->getId(),
                                'comment'    => $summary,
                                'minor_edit' => $minor,
                                'text_id'    => $current->rev_text_id,
@@ -1620,11 +1629,11 @@ class Revision implements IDBAccessObject {
         * Determine if the current user is allowed to view a particular
         * field of this revision, if it's marked as deleted.
         *
-        * @param $field Integer:one of self::DELETED_TEXT,
+        * @param int $field One of self::DELETED_TEXT,
         *                              self::DELETED_COMMENT,
         *                              self::DELETED_USER
-        * @param $user User object to check, or null to use $wgUser
-        * @return Boolean
+        * @param User|null $user User object to check, or null to use $wgUser
+        * @return bool
         */
        public function userCan( $field, User $user = null ) {
                return self::userCanBitfield( $this->mDeleted, $field, $user );
@@ -1635,12 +1644,12 @@ class Revision implements IDBAccessObject {
         * field of this revision, if it's marked as deleted. This is used
         * by various classes to avoid duplication.
         *
-        * @param $bitfield Integer: current field
-        * @param $field Integer: one of self::DELETED_TEXT = File::DELETED_FILE,
+        * @param int $bitfield Current field
+        * @param int $field One of self::DELETED_TEXT = File::DELETED_FILE,
         *                               self::DELETED_COMMENT = File::DELETED_COMMENT,
         *                               self::DELETED_USER = File::DELETED_USER
-        * @param $user User object to check, or null to use $wgUser
-        * @return Boolean
+        * @param User|null $user User object to check, or null to use $wgUser
+        * @return bool
         */
        public static function userCanBitfield( $bitfield, $field, User $user = null ) {
                if ( $bitfield & $field ) { // aspect is deleted
@@ -1665,9 +1674,9 @@ class Revision implements IDBAccessObject {
        /**
         * Get rev_timestamp from rev_id, without loading the rest of the row
         *
-        * @param $title Title
-        * @param $id Integer
-        * @return String
+        * @param Title $title
+        * @param int $id
+        * @return string
         */
        static function getTimestampFromId( $title, $id ) {
                $dbr = wfGetDB( DB_SLAVE );
@@ -1689,9 +1698,9 @@ class Revision implements IDBAccessObject {
        /**
         * Get count of revisions per page...not very efficient
         *
-        * @param $db DatabaseBase
-        * @param $id Integer: page id
-        * @return Integer
+        * @param DatabaseBase $db
+        * @param int $id Page id
+        * @return int
         */
        static function countByPageId( $db, $id ) {
                $row = $db->selectRow( 'revision', array( 'revCount' => 'COUNT(*)' ),
@@ -1705,9 +1714,9 @@ class Revision implements IDBAccessObject {
        /**
         * Get count of revisions per page...not very efficient
         *
-        * @param $db DatabaseBase
-        * @param $title Title
-        * @return Integer
+        * @param DatabaseBase $db
+        * @param Title $title
+        * @return int
         */
        static function countByTitle( $db, $title ) {
                $id = $title->getArticleID();
@@ -1724,11 +1733,11 @@ class Revision implements IDBAccessObject {
         *
         * @since 1.20
         *
-        * @param DatabaseBase|int $db the Database to perform the check on. May be given as a
+        * @param DatabaseBase|int $db The Database to perform the check on. May be given as a
         *        Database object or a database identifier usable with wfGetDB.
-        * @param int $pageId the ID of the page in question
-        * @param int $userId the ID of the user in question
-        * @param string $since look at edits since this time
+        * @param int $pageId The ID of the page in question
+        * @param int $userId The ID of the user in question
+        * @param string $since Look at edits since this time
         *
         * @return bool True if the given user was the only one to edit since the given timestamp
         */
index 1b865bb..d10b541 100644 (file)
  * List for revision table items for a single page
  */
 abstract class RevisionListBase extends ContextSource {
-       /**
-        * @var Title
-        */
-       var $title;
+       /** @var Title */
+       public $title;
+
+       /** @var array */
+       protected $ids;
 
-       var $ids, $res, $current;
+       protected $res;
+
+       /** @var bool|object */
+       protected $current;
 
        /**
         * Construct a revision list for a given title
-        * @param $context IContextSource
-        * @param $title Title
+        * @param IContextSource $context
+        * @param Title $title
         */
        function __construct( IContextSource $context, Title $title ) {
                $this->setContext( $context );
@@ -43,7 +47,7 @@ abstract class RevisionListBase extends ContextSource {
 
        /**
         * Select items only where the ID is any of the specified values
-        * @param $ids Array
+        * @param array $ids
         */
        function filterByIds( array $ids ) {
                $this->ids = $ids;
@@ -72,7 +76,7 @@ abstract class RevisionListBase extends ContextSource {
 
        /**
         * Start iteration. This must be called before current() or next().
-        * @return First list item
+        * @return Revision First list item
         */
        public function reset() {
                if ( !$this->res ) {
@@ -86,6 +90,7 @@ abstract class RevisionListBase extends ContextSource {
 
        /**
         * Get the current list item, or false if we are at the end
+        * @return Revision
         */
        public function current() {
                return $this->current;
@@ -93,6 +98,7 @@ abstract class RevisionListBase extends ContextSource {
 
        /**
         * Move the iteration pointer to the next list item, and return it.
+        * @return Revision
         */
        public function next() {
                $this->res->next();
@@ -114,13 +120,13 @@ abstract class RevisionListBase extends ContextSource {
 
        /**
         * Do the DB query to iterate through the objects.
-        * @param $db DatabaseBase object to use for the query
+        * @param DatabaseBase $db DatabaseBase object to use for the query
         */
        abstract public function doQuery( $db );
 
        /**
         * Create an item object from a DB result row
-        * @param $row stdclass
+        * @param object $row
         */
        abstract public function newItem( $row );
 }
@@ -129,15 +135,15 @@ abstract class RevisionListBase extends ContextSource {
  * Abstract base class for revision items
  */
 abstract class RevisionItemBase {
-       /** The parent RevisionListBase */
-       var $list;
+       /** @var RevisionListBase The parent */
+       protected $list;
 
-       /** The DB result row */
-       var $row;
+       /** The database result row */
+       protected $row;
 
        /**
-        * @param $list RevisionListBase
-        * @param $row DB result row
+        * @param RevisionListBase $list
+        * @param object $row DB result row
         */
        public function __construct( $list, $row ) {
                $this->list = $list;
@@ -182,7 +188,7 @@ abstract class RevisionItemBase {
 
        /**
         * Get the ID, as it would appear in the ids URL parameter
-        * @return
+        * @return int
         */
        public function getId() {
                $field = $this->getIdField();
@@ -191,7 +197,7 @@ abstract class RevisionItemBase {
 
        /**
         * Get the date, formatted in user's language
-        * @return String
+        * @return string
         */
        public function formatDate() {
                return $this->list->getLanguage()->userDate( $this->getTimestamp(),
@@ -200,7 +206,7 @@ abstract class RevisionItemBase {
 
        /**
         * Get the time, formatted in user's language
-        * @return String
+        * @return string
         */
        public function formatTime() {
                return $this->list->getLanguage()->userTime( $this->getTimestamp(),
@@ -209,7 +215,7 @@ abstract class RevisionItemBase {
 
        /**
         * Get the timestamp in MW 14-char form
-        * @return Mixed
+        * @return mixed
         */
        public function getTimestamp() {
                $field = $this->getTimestampField();
@@ -257,7 +263,7 @@ class RevisionList extends RevisionListBase {
        }
 
        /**
-        * @param $db DatabaseBase
+        * @param DatabaseBase $db
         * @return mixed
         */
        public function doQuery( $db ) {
@@ -286,7 +292,11 @@ class RevisionList extends RevisionListBase {
  * Item class for a live revision table row
  */
 class RevisionItem extends RevisionItemBase {
-       var $revision, $context;
+       /** @var Revision */
+       protected $revision;
+
+       /** @var RequestContext */
+       protected $context;
 
        public function __construct( $list, $row ) {
                parent::__construct( $list, $row );
@@ -324,7 +334,7 @@ class RevisionItem extends RevisionItemBase {
 
        /**
         * Get the HTML link to the revision text.
-        * Overridden by RevDel_ArchiveItem.
+        * Overridden by RevDelArchiveItem.
         * @return string
         */
        protected function getRevisionLink() {
@@ -345,7 +355,7 @@ class RevisionItem extends RevisionItemBase {
 
        /**
         * Get the HTML link to the diff.
-        * Overridden by RevDel_ArchiveItem
+        * Overridden by RevDelArchiveItem
         * @return string
         */
        protected function getDiffLink() {
index 245714d..1ea6523 100644 (file)
@@ -358,7 +358,7 @@ class Sanitizer {
         * @param string $text
         * @param callable $processCallback Callback to do any variable or parameter
         *   replacements in HTML attribute values
-        * @param array $args Arguments for the processing callback
+        * @param array|bool $args Arguments for the processing callback
         * @param array $extratags For any extra tags to include
         * @param array $removetags For any tags (default or extra) to exclude
         * @return string
@@ -459,7 +459,10 @@ class Sanitizer {
                                                $badtag = true;
                                        } elseif ( $slash ) {
                                                # Closing a tag... is it the one we just opened?
-                                               $ot = @array_pop( $tagstack );
+                                               wfSuppressWarnings();
+                                               $ot = array_pop( $tagstack );
+                                               wfRestoreWarnings();
+
                                                if ( $ot != $t ) {
                                                        if ( isset( $htmlsingleallowed[$ot] ) ) {
                                                                # Pop all elements with an optional close tag
@@ -489,7 +492,10 @@ class Sanitizer {
                                                                        }
                                                                }
                                                        } else {
-                                                               @array_push( $tagstack, $ot );
+                                                               wfSuppressWarnings();
+                                                               array_push( $tagstack, $ot );
+                                                               wfRestoreWarnings();
+
                                                                # <li> can be nested in <ul> or <ol>, skip those cases:
                                                                if ( !isset( $htmllist[$ot] ) || !isset( $listtags[$t] ) ) {
                                                                        $badtag = true;
@@ -567,9 +573,16 @@ class Sanitizer {
                } else {
                        # this might be possible using tidy itself
                        foreach ( $bits as $x ) {
-                               preg_match( '/^(\\/?)(\\w+)([^>]*?)(\\/{0,1}>)([^<]*)$/',
-                               $x, $regs );
-                               @list( /* $qbar */, $slash, $t, $params, $brace, $rest ) = $regs;
+                               preg_match(
+                                       '/^(\\/?)(\\w+)([^>]*?)(\\/{0,1}>)([^<]*)$/',
+                                       $x,
+                                       $regs
+                               );
+
+                               wfSuppressWarnings();
+                               list( /* $qbar */, $slash, $t, $params, $brace, $rest ) = $regs;
+                               wfRestoreWarnings();
+
                                $badtag = false;
                                if ( isset( $htmlelements[$t = strtolower( $t )] ) ) {
                                        if ( is_callable( $processCallback ) ) {
@@ -1069,7 +1082,7 @@ class Sanitizer {
         *   HTML5 definition of id attribute
         *
         * @param string $id id to escape
-        * @param $options Mixed: string or array of strings (default is array()):
+        * @param string|array $options String or array of strings (default is array()):
         *   'noninitial': This is a non-initial fragment of an id, not a full id,
         *       so don't pay attention if the first character isn't valid at the
         *       beginning of an id.  Only matters if $wgExperimentalHtmlIds is
@@ -1136,7 +1149,7 @@ class Sanitizer {
         * This allows (generally harmless) entities like &#160; to survive.
         *
         * @param string $html HTML to escape
-        * @return string: escaped input
+        * @return string Escaped input
         */
        static function escapeHtmlAllowEntities( $html ) {
                $html = Sanitizer::decodeCharReferences( $html );
index b155f90..a1bca22 100644 (file)
@@ -43,6 +43,7 @@ if ( !isset( $wgVersion ) ) {
 }
 
 // Set various default paths sensibly...
+
 if ( $wgScript === false ) {
        $wgScript = "$wgScriptPath/index$wgScriptExtension";
 }
@@ -122,7 +123,8 @@ if ( isset( $wgFooterIcons['poweredby'] )
        && isset( $wgFooterIcons['poweredby']['mediawiki'] )
        && $wgFooterIcons['poweredby']['mediawiki']['src'] === null
 ) {
-       $wgFooterIcons['poweredby']['mediawiki']['src'] = "$wgStylePath/common/images/poweredby_mediawiki_88x31.png";
+       $wgFooterIcons['poweredby']['mediawiki']['src'] =
+               "$wgStylePath/common/images/poweredby_mediawiki_88x31.png";
 }
 
 /**
@@ -251,7 +253,10 @@ if ( $wgRCFilterByAge ) {
        // as determined by $wgRCMaxAge.
        // Note that we allow 1 link higher than the max for things like 56 days but a 60 day link.
        sort( $wgRCLinkDays );
+
+       // @codingStandardsIgnoreStart Generic.CodeAnalysis.ForLoopWithTestFunctionCall.NotAllowed
        for ( $i = 0; $i < count( $wgRCLinkDays ); $i++ ) {
+               // @codingStandardsIgnoreEnd
                if ( $wgRCLinkDays[$i] >= $wgRCMaxAge / ( 3600 * 24 ) ) {
                        $wgRCLinkDays = array_slice( $wgRCLinkDays, 0, $i + 1, false );
                        break;
@@ -366,7 +371,9 @@ if ( $wgArticleCountMethod === null ) {
 }
 
 if ( $wgInvalidateCacheOnLocalSettingsChange ) {
+       // @codingStandardsIgnoreStart Generic.PHP.NoSilencedErrors.Discouraged - No GlobalFunction here yet.
        $wgCacheEpoch = max( $wgCacheEpoch, gmdate( 'YmdHis', @filemtime( "$IP/LocalSettings.php" ) ) );
+       // @codingStandardsIgnoreEnd
 }
 
 if ( $wgNewUserLog ) {
@@ -420,9 +427,34 @@ require_once "$IP/includes/normal/UtfNormalDefines.php";
 wfProfileOut( $fname . '-includes' );
 
 wfProfileIn( $fname . '-defaults2' );
+
+if ( $wgCanonicalServer === false ) {
+       $wgCanonicalServer = wfExpandUrl( $wgServer, PROTO_HTTP );
+}
+
+// Set server name
+$serverParts = wfParseUrl( $wgCanonicalServer );
+if ( $wgServerName !== false ) {
+       wfWarn( '$wgServerName should be derived from $wgCanonicalServer, '
+               . 'not customized. Overwriting $wgServerName.' );
+}
+$wgServerName = $serverParts['host'];
+unset( $serverParts );
+
+// Set defaults for configuration variables
+// that are derived from the server name by default
+if ( $wgEmergencyContact === false ) {
+       $wgEmergencyContact = 'wikiadmin@' . $wgServerName;
+}
+
+if ( $wgPasswordSender === false ) {
+       $wgPasswordSender = 'apache@' . $wgServerName;
+}
+
 if ( $wgSecureLogin && substr( $wgServer, 0, 2 ) !== '//' ) {
        $wgSecureLogin = false;
-       wfWarn( 'Secure login was enabled on a server that only supports HTTP or HTTPS. Disabling secure login.' );
+       wfWarn( 'Secure login was enabled on a server that only supports '
+               . 'HTTP or HTTPS. Disabling secure login.' );
 }
 
 // Now that GlobalFunctions is loaded, set defaults that depend
@@ -433,10 +465,6 @@ if ( $wgTmpDirectory === false ) {
        wfProfileOut( $fname . '-tempDir' );
 }
 
-if ( $wgCanonicalServer === false ) {
-       $wgCanonicalServer = wfExpandUrl( $wgServer, PROTO_HTTP );
-}
-
 // $wgHTCPMulticastRouting got renamed to $wgHTCPRouting in MediaWiki 1.22
 // ensure back compatibility.
 if ( !$wgHTCPRouting && $wgHTCPMulticastRouting ) {
@@ -531,13 +559,10 @@ if ( !wfIniGetBool( 'session.auto_start' ) ) {
        session_name( $wgSessionName ? $wgSessionName : $wgCookiePrefix . '_session' );
 }
 
-if ( !defined( 'MW_NO_SESSION' ) && !$wgCommandLineMode ) {
-       if ( $wgRequest->checkSessionCookie() || isset( $_COOKIE[$wgCookiePrefix . 'Token'] ) ) {
-               wfSetupSession();
-               $wgSessionStarted = true;
-       } else {
-               $wgSessionStarted = false;
-       }
+if ( !defined( 'MW_NO_SESSION' ) && !$wgCommandLineMode &&
+       ( $wgRequest->checkSessionCookie() || isset( $_COOKIE[$wgCookiePrefix . 'Token'] ) )
+) {
+       wfSetupSession();
 }
 
 wfProfileOut( $fname . '-session' );
index fa871fe..b99840f 100644 (file)
  * extract( $globals );
  * @endcode
  *
- * TODO: give examples for,
+ * @todo Give examples for,
  * suffixes:
  * $conf->suffixes = array( 'wiki' );
  * localVHosts
@@ -174,9 +174,11 @@ class SiteConfiguration {
         * @param string $suffix The suffix of the wiki in question.
         * @param array $params List of parameters. $.'key' is replaced by $value in all returned data.
         * @param array $wikiTags The tags assigned to the wiki.
-        * @return Mixed the value of the setting requested.
+        * @return mixed The value of the setting requested.
         */
-       public function get( $settingName, $wiki, $suffix = null, $params = array(), $wikiTags = array() ) {
+       public function get( $settingName, $wiki, $suffix = null, $params = array(),
+               $wikiTags = array()
+       ) {
                $params = $this->mergeParams( $wiki, $suffix, $params, $wikiTags );
                return $this->getSetting( $settingName, $wiki, $params );
        }
@@ -186,8 +188,8 @@ class SiteConfiguration {
         *
         * @param string $settingName ID of the setting name to retrieve.
         * @param string $wiki Wiki ID of the wiki in question.
-        * @param array $params array of parameters.
-        * @return Mixed the value of the setting requested.
+        * @param array $params Array of parameters.
+        * @return mixed The value of the setting requested.
         */
        protected function getSetting( $settingName, $wiki, /*array*/ $params ) {
                $retval = null;
@@ -228,7 +230,9 @@ class SiteConfiguration {
                                                        $retval = $thisSetting[$suffix];
                                                }
                                                break;
-                                       } elseif ( array_key_exists( "+$suffix", $thisSetting ) && is_array( $thisSetting["+$suffix"] ) ) {
+                                       } elseif ( array_key_exists( "+$suffix", $thisSetting )
+                                               && is_array( $thisSetting["+$suffix"] )
+                                       ) {
                                                if ( !isset( $retval ) ) {
                                                        $retval = array();
                                                }
@@ -260,9 +264,9 @@ class SiteConfiguration {
         * Type-safe string replace; won't do replacements on non-strings
         * private?
         *
-        * @param $from
-        * @param $to
-        * @param $in
+        * @param string $from
+        * @param string $to
+        * @param string|array $in
         * @return string
         */
        function doReplace( $from, $to, $in ) {
@@ -284,7 +288,7 @@ class SiteConfiguration {
         * @param string $suffix The suffix of the wiki in question.
         * @param array $params List of parameters. $.'key' is replaced by $value in all returned data.
         * @param array $wikiTags The tags assigned to the wiki.
-        * @return Array Array of settings requested.
+        * @return array Array of settings requested.
         */
        public function getAll( $wiki, $suffix = null, $params = array(), $wikiTags = array() ) {
                $params = $this->mergeParams( $wiki, $suffix, $params, $wikiTags );
@@ -338,7 +342,9 @@ class SiteConfiguration {
         * @param array $params List of parameters. $.'key' is replaced by $value in all returned data.
         * @param array $wikiTags The tags assigned to the wiki.
         */
-       public function extractVar( $setting, $wiki, $suffix, &$var, $params = array(), $wikiTags = array() ) {
+       public function extractVar( $setting, $wiki, $suffix, &$var,
+               $params = array(), $wikiTags = array()
+       ) {
                $value = $this->get( $setting, $wiki, $suffix, $params, $wikiTags );
                if ( !is_null( $value ) ) {
                        $var = $value;
@@ -353,15 +359,17 @@ class SiteConfiguration {
         * @param array $params List of parameters. $.'key' is replaced by $value in all returned data.
         * @param array $wikiTags The tags assigned to the wiki.
         */
-       public function extractGlobal( $setting, $wiki, $suffix = null, $params = array(), $wikiTags = array() ) {
+       public function extractGlobal( $setting, $wiki, $suffix = null,
+               $params = array(), $wikiTags = array()
+       ) {
                $params = $this->mergeParams( $wiki, $suffix, $params, $wikiTags );
                $this->extractGlobalSetting( $setting, $wiki, $params );
        }
 
        /**
-        * @param $setting string
-        * @param $wiki string
-        * @param $params array
+        * @param string $setting
+        * @param string $wiki
+        * @param array $params
         */
        public function extractGlobalSetting( $setting, $wiki, $params ) {
                $value = $this->getSetting( $setting, $wiki, $params );
@@ -386,7 +394,9 @@ class SiteConfiguration {
         * @param array $params List of parameters. $.'key' is replaced by $value in all returned data.
         * @param array $wikiTags The tags assigned to the wiki.
         */
-       public function extractAllGlobals( $wiki, $suffix = null, $params = array(), $wikiTags = array() ) {
+       public function extractAllGlobals( $wiki, $suffix = null, $params = array(),
+               $wikiTags = array()
+       ) {
                $params = $this->mergeParams( $wiki, $suffix, $params, $wikiTags );
                foreach ( $this->settings as $varName => $setting ) {
                        $this->extractGlobalSetting( $varName, $wiki, $params );
@@ -398,7 +408,7 @@ class SiteConfiguration {
         * See the documentation of self::$siteParamsCallback for more in-depth
         * documentation about this function
         *
-        * @param $wiki String
+        * @param string $wiki
         * @return array
         */
        protected function getWikiParams( $wiki ) {
@@ -436,7 +446,7 @@ class SiteConfiguration {
         * @param string $wiki Wiki ID of the wiki in question.
         * @param string $suffix The suffix of the wiki in question.
         * @param array $params List of parameters. $.'key' is replaced by $value in
-        *                all returned data.
+        *   all returned data.
         * @param array $wikiTags The tags assigned to the wiki.
         * @return array
         */
@@ -464,7 +474,7 @@ class SiteConfiguration {
 
        /**
         * Work out the site and language name from a database name
-        * @param $db
+        * @param string $db
         *
         * @return array
         */
@@ -499,7 +509,7 @@ class SiteConfiguration {
         *
         * @param string $wiki
         * @param array|string $settings A setting name or array of setting names
-        * @return Array|mixed Array if $settings is an array, otherwise the value
+        * @return mixed|mixed[] Array if $settings is an array, otherwise the value
         * @throws MWException
         * @since 1.21
         */
@@ -555,7 +565,7 @@ class SiteConfiguration {
 
        /**
         * Returns true if the given vhost is handled locally.
-        * @param $vhost String
+        * @param string $vhost
         * @return bool
         */
        public function isLocalVHost( $vhost ) {
@@ -568,18 +578,20 @@ class SiteConfiguration {
         * PHP's array_merge_recursive() merges ANY duplicate values into arrays,
         * which is not fun
         *
-        * @param $array1 array
+        * @param array $array1
         *
         * @return array
         */
        static function arrayMerge( $array1/* ... */ ) {
                $out = $array1;
-               for ( $i = 1; $i < func_num_args(); $i++ ) {
+               $argsCount = func_num_args();
+               for ( $i = 1; $i < $argsCount; $i++ ) {
                        foreach ( func_get_arg( $i ) as $key => $value ) {
                                if ( isset( $out[$key] ) && is_array( $out[$key] ) && is_array( $value ) ) {
                                        $out[$key] = self::arrayMerge( $out[$key], $value );
                                } elseif ( !isset( $out[$key] ) || !$out[$key] && !is_numeric( $key ) ) {
-                                       // Values that evaluate to true given precedence, for the primary purpose of merging permissions arrays.
+                                       // Values that evaluate to true given precedence, for the
+                                       // primary purpose of merging permissions arrays.
                                        $out[$key] = $value;
                                } elseif ( is_numeric( $key ) ) {
                                        $out[] = $value;
index 7169b2e..4e737d1 100644 (file)
  * Static accessor class for site_stats and related things
  */
 class SiteStats {
-       static $row, $loaded = false;
-       static $jobs;
-       static $pageCount = array();
-       static $groupMemberCounts = array();
+       /** @var bool|ResultWrapper */
+       private static $row;
+
+       /** @var bool */
+       private static $loaded = false;
+
+       /** @var int */
+       private static $jobs;
+
+       /** @var int[] */
+       private static $pageCount = array();
+
+       /** @var int[] */
+       private static $groupMemberCounts = array();
 
        static function recache() {
                self::load( true );
        }
 
        /**
-        * @param $recache bool
+        * @param bool $recache
         */
        static function load( $recache = false ) {
                if ( self::$loaded && !$recache ) {
@@ -55,7 +65,7 @@ class SiteStats {
        }
 
        /**
-        * @return Bool|ResultWrapper
+        * @return bool|ResultWrapper
         */
        static function loadAndLazyInit() {
                wfDebug( __METHOD__ . ": reading site_stats from slave\n" );
@@ -86,8 +96,8 @@ class SiteStats {
        }
 
        /**
-        * @param $db DatabaseBase
-        * @return Bool|ResultWrapper
+        * @param DatabaseBase $db
+        * @return bool|ResultWrapper
         */
        static function doLoad( $db ) {
                return $db->selectRow( 'site_stats', array(
@@ -161,7 +171,7 @@ class SiteStats {
        /**
         * Find the number of users in a given user group.
         * @param string $group name of group
-        * @return Integer
+        * @return int
         */
        static function numberingroup( $group ) {
                if ( !isset( self::$groupMemberCounts[$group] ) ) {
@@ -190,7 +200,10 @@ class SiteStats {
                if ( !isset( self::$jobs ) ) {
                        $dbr = wfGetDB( DB_SLAVE );
                        self::$jobs = array_sum( JobQueueGroup::singleton()->getQueueSizes() );
-                       /* Zero rows still do single row read for row that doesn't exist, but people are annoyed by that */
+                       /**
+                        * Zero rows still do single row read for row that doesn't exist,
+                        * but people are annoyed by that
+                        */
                        if ( self::$jobs == 1 ) {
                                self::$jobs = 0;
                        }
@@ -199,7 +212,7 @@ class SiteStats {
        }
 
        /**
-        * @param $ns int
+        * @param int $ns
         *
         * @return int
         */
@@ -223,7 +236,7 @@ class SiteStats {
         *
         * Checks only fields which are filled by SiteStatsInit::refresh.
         *
-        * @param $row
+        * @param bool|object $row
         *
         * @return bool
         */
@@ -264,7 +277,7 @@ class SiteStatsInit {
 
        /**
         * Constructor
-        * @param $database Boolean or DatabaseBase:
+        * @param bool|DatabaseBase $database
         * - Boolean: whether to use the master DB
         * - DatabaseBase: database connection to use
         */
@@ -278,7 +291,7 @@ class SiteStatsInit {
 
        /**
         * Count the total number of edits
-        * @return Integer
+        * @return int
         */
        public function edits() {
                $this->mEdits = $this->db->selectField( 'revision', 'COUNT(*)', '', __METHOD__ );
@@ -288,7 +301,7 @@ class SiteStatsInit {
 
        /**
         * Count pages in article space(s)
-        * @return Integer
+        * @return int
         */
        public function articles() {
                global $wgArticleCountMethod;
@@ -318,7 +331,7 @@ class SiteStatsInit {
 
        /**
         * Count total pages
-        * @return Integer
+        * @return int
         */
        public function pages() {
                $this->mPages = $this->db->selectField( 'page', 'COUNT(*)', '', __METHOD__ );
@@ -327,7 +340,7 @@ class SiteStatsInit {
 
        /**
         * Count total users
-        * @return Integer
+        * @return int
         */
        public function users() {
                $this->mUsers = $this->db->selectField( 'user', 'COUNT(*)', '', __METHOD__ );
@@ -336,7 +349,7 @@ class SiteStatsInit {
 
        /**
         * Count views
-        * @return Integer
+        * @return int
         */
        public function views() {
                $this->mViews = $this->db->selectField( 'page', 'SUM(page_counter)', '', __METHOD__ );
@@ -345,7 +358,7 @@ class SiteStatsInit {
 
        /**
         * Count total files
-        * @return Integer
+        * @return int
         */
        public function files() {
                $this->mFiles = $this->db->selectField( 'image', 'COUNT(*)', '', __METHOD__ );
@@ -356,7 +369,7 @@ class SiteStatsInit {
         * Do all updates and commit them. More or less a replacement
         * for the original initStats, but without output.
         *
-        * @param $database DatabaseBase|bool
+        * @param DatabaseBase|bool $database
         * - Boolean: whether to use the master DB
         * - DatabaseBase: database connection to use
         * @param array $options of options, may contain the following values
index 59c2242..10502c2 100644 (file)
@@ -39,7 +39,7 @@ abstract class Skin extends ContextSource {
 
        /**
         * Fetch the set of available skins.
-        * @return array associative array of strings
+        * @return array Associative array of strings
         */
        static function getSkinNames() {
                global $wgValidSkinNames;
@@ -77,12 +77,12 @@ abstract class Skin extends ContextSource {
 
        /**
         * Fetch the skinname messages for available skins.
-        * @return array of strings
+        * @return string[]
         */
        static function getSkinNameMessages() {
                $messages = array();
                foreach ( self::getSkinNames() as $skinKey => $skinName ) {
-                       // Messages: skinname-cologneblue, skinname-monobook, skinname-modern, skinname-vector
+                       // Messages: skinname-vector, skinname-monobook
                        $messages[] = "skinname-$skinKey";
                }
                return $messages;
@@ -193,14 +193,14 @@ abstract class Skin extends ContextSource {
        }
 
        /**
-        * @return string skin name
+        * @return string Skin name
         */
        public function getSkinName() {
                return $this->skinname;
        }
 
        /**
-        * @param $out OutputPage
+        * @param OutputPage $out
         */
        function initPage( OutputPage $out ) {
                wfProfileIn( __METHOD__ );
@@ -214,7 +214,7 @@ abstract class Skin extends ContextSource {
         * Defines the ResourceLoader modules that should be added to the skin
         * It is recommended that skins wishing to override call parent::getDefaultModules()
         * and substitute out any modules they wish to change by using a key to look them up
-        * @return Array of modules with helper keys for easy overriding
+        * @return array Array of modules with helper keys for easy overriding
         */
        public function getDefaultModules() {
                global $wgIncludeLegacyJavaScript, $wgPreloadJavaScriptMwUtil, $wgUseAjax,
@@ -296,7 +296,7 @@ abstract class Skin extends ContextSource {
        /**
         * Get the current revision ID
         *
-        * @return Integer
+        * @return int
         */
        public function getRevisionId() {
                return $this->getOutput()->getRevisionId();
@@ -305,7 +305,7 @@ abstract class Skin extends ContextSource {
        /**
         * Whether the revision displayed is the latest revision of the page
         *
-        * @return Boolean
+        * @return bool
         */
        public function isRevisionCurrent() {
                $revID = $this->getRevisionId();
@@ -315,7 +315,7 @@ abstract class Skin extends ContextSource {
        /**
         * Set the "relevant" title
         * @see self::getRelevantTitle()
-        * @param $t Title object to use
+        * @param Title $t
         */
        public function setRelevantTitle( $t ) {
                $this->mRelevantTitle = $t;
@@ -341,7 +341,7 @@ abstract class Skin extends ContextSource {
        /**
         * Set the "relevant" user
         * @see self::getRelevantUser()
-        * @param $u User object to use
+        * @param User $u
         */
        public function setRelevantUser( $u ) {
                $this->mRelevantUser = $u;
@@ -377,12 +377,12 @@ abstract class Skin extends ContextSource {
 
        /**
         * Outputs the HTML generated by other functions.
-        * @param $out OutputPage
+        * @param OutputPage $out
         */
        abstract function outputPage( OutputPage $out = null );
 
        /**
-        * @param $data array
+        * @param array $data
         * @return string
         */
        static function makeVariablesScript( $data ) {
@@ -399,7 +399,7 @@ abstract class Skin extends ContextSource {
         * Make a "<script>" tag containing global variables
         *
         * @deprecated since 1.19
-        * @param $unused
+        * @param mixed $unused
         * @return string HTML fragment
         */
        public static function makeGlobalVariablesScript( $unused ) {
@@ -432,15 +432,15 @@ abstract class Skin extends ContextSource {
         * Calling this method with an $out of anything but the same OutputPage
         * inside ->getOutput() is deprecated. The $out arg is kept
         * for compatibility purposes with skins.
-        * @param $out OutputPage
+        * @param OutputPage $out
         * @todo delete
         */
        abstract function setupSkinUserCss( OutputPage $out );
 
        /**
         * TODO: document
-        * @param $title Title
-        * @return String
+        * @param Title $title
+        * @return string
         */
        function getPageClasses( $title ) {
                $numeric = 'ns-' . $title->getNamespace();
@@ -482,8 +482,8 @@ abstract class Skin extends ContextSource {
         * This will be called by OutputPage::headElement when it is creating the
         * "<body>" tag, skins can override it if they have a need to add in any
         * body attributes or classes of their own.
-        * @param $out OutputPage
-        * @param $bodyAttrs Array
+        * @param OutputPage $out
+        * @param array $bodyAttrs
         */
        function addToBodyAttributes( $out, &$bodyAttrs ) {
                // does nothing by default
@@ -491,7 +491,7 @@ abstract class Skin extends ContextSource {
 
        /**
         * URL to the logo
-        * @return String
+        * @return string
         */
        function getLogo() {
                global $wgLogo;
@@ -565,8 +565,8 @@ abstract class Skin extends ContextSource {
 
        /**
         * Render the array as a series of links.
-        * @param array $tree categories tree returned by Title::getParentCategoryTree
-        * @return String separated by &gt;, terminate with "\n"
+        * @param array $tree Categories tree returned by Title::getParentCategoryTree
+        * @return string Separated by &gt;, terminate with "\n"
         */
        function drawCategoryBrowser( $tree ) {
                $return = '';
@@ -622,7 +622,7 @@ abstract class Skin extends ContextSource {
         * The output of this function gets processed in SkinTemplate::outputPage() for
         * the SkinTemplate based skins, all other skins should directly echo it.
         *
-        * @return String, empty by default, if not changed by any hook function.
+        * @return string Empty by default, if not changed by any hook function.
         */
        protected function afterContentHook() {
                $data = '';
@@ -648,7 +648,7 @@ abstract class Skin extends ContextSource {
        /**
         * Generate debug data HTML for displaying at the bottom of the main content
         * area.
-        * @return String HTML containing debug data, if enabled (otherwise empty).
+        * @return string HTML containing debug data, if enabled (otherwise empty).
         */
        protected function generateDebugHTML() {
                return MWDebug::getHTMLDebugLog();
@@ -657,7 +657,7 @@ abstract class Skin extends ContextSource {
        /**
         * This gets called shortly before the "</body>" tag.
         *
-        * @return String HTML-wrapped JS code to be put before "</body>"
+        * @return string HTML-wrapped JS code to be put before "</body>"
         */
        function bottomScripts() {
                // TODO and the suckage continues. This function is really just a wrapper around
@@ -678,16 +678,19 @@ abstract class Skin extends ContextSource {
        function printSource() {
                $oldid = $this->getRevisionId();
                if ( $oldid ) {
-                       $url = htmlspecialchars( wfExpandIRI( $this->getTitle()->getCanonicalURL( 'oldid=' . $oldid ) ) );
+                       $canonicalUrl = $this->getTitle()->getCanonicalURL( 'oldid=' . $oldid );
+                       $url = htmlspecialchars( wfExpandIRI( $canonicalUrl ) );
                } else {
                        // oldid not available for non existing pages
                        $url = htmlspecialchars( wfExpandIRI( $this->getTitle()->getCanonicalURL() ) );
                }
-               return $this->msg( 'retrievedfrom', '<a href="' . $url . '">' . $url . '</a>' )->text();
+
+               return $this->msg( 'retrievedfrom', '<a dir="ltr" href="' . $url
+                       . '">' . $url . '</a>' )->text();
        }
 
        /**
-        * @return String
+        * @return string
         */
        function getUndeleteLink() {
                $action = $this->getRequest()->getVal( 'action', 'view' );
@@ -718,7 +721,6 @@ abstract class Skin extends ContextSource {
         * @return string
         */
        function subPageSubtitle() {
-               global $wgLang;
                $out = $this->getOutput();
                $subpages = '';
 
@@ -734,6 +736,7 @@ abstract class Skin extends ContextSource {
                                $c = 0;
                                $growinglink = '';
                                $display = '';
+                               $lang = $this->getLanguage();
 
                                foreach ( $links as $link ) {
                                        $growinglink .= $link;
@@ -749,7 +752,7 @@ abstract class Skin extends ContextSource {
                                                $c++;
 
                                                if ( $c > 1 ) {
-                                                       $subpages .= $wgLang->getDirMarkEntity() . $this->msg( 'pipe-separator' )->escaped();
+                                                       $subpages .= $lang->getDirMarkEntity() . $this->msg( 'pipe-separator' )->escaped();
                                                } else {
                                                        $subpages .= '&lt; ';
                                                }
@@ -769,7 +772,7 @@ abstract class Skin extends ContextSource {
 
        /**
         * Returns true if the IP should be shown in the header
-        * @return Bool
+        * @return bool
         */
        function showIPinHeader() {
                global $wgShowIPinHeader;
@@ -777,7 +780,7 @@ abstract class Skin extends ContextSource {
        }
 
        /**
-        * @return String
+        * @return string
         */
        function getSearchLink() {
                $searchPage = SpecialPage::getTitleFor( 'Search' );
@@ -792,14 +795,16 @@ abstract class Skin extends ContextSource {
        }
 
        /**
-        * @param $type string
+        * @param string $type
         * @return string
         */
        function getCopyright( $type = 'detect' ) {
                global $wgRightsPage, $wgRightsUrl, $wgRightsText, $wgContLang;
 
                if ( $type == 'detect' ) {
-                       if ( !$this->isRevisionCurrent() && !$this->msg( 'history_copyright' )->inContentLanguage()->isDisabled() ) {
+                       if ( !$this->isRevisionCurrent()
+                               && !$this->msg( 'history_copyright' )->inContentLanguage()->isDisabled()
+                       ) {
                                $type = 'history';
                        } else {
                                $type = 'normal';
@@ -825,20 +830,15 @@ abstract class Skin extends ContextSource {
                }
 
                // Allow for site and per-namespace customization of copyright notice.
+               // @todo Remove deprecated $forContent param from hook handlers and then remove here.
                $forContent = true;
 
-               wfRunHooks( 'SkinCopyrightFooter', array( $this->getTitle(), $type, &$msg, &$link, &$forContent ) );
+               wfRunHooks(
+                       'SkinCopyrightFooter',
+                       array( $this->getTitle(), $type, &$msg, &$link, &$forContent )
+               );
 
-               $msgObj = $this->msg( $msg )->rawParams( $link );
-               if ( $forContent ) {
-                       $msg = $msgObj->inContentLanguage()->text();
-                       if ( $this->getLanguage()->getCode() !== $wgContLang->getCode() ) {
-                               $msg = Html::rawElement( 'span', array( 'lang' => $wgContLang->getHtmlCode(), 'dir' => $wgContLang->getDir() ), $msg );
-                       }
-                       return $msg;
-               } else {
-                       return $msgObj->text();
-               }
+               return $this->msg( $msg )->rawParams( $link )->text();
        }
 
        /**
@@ -878,7 +878,8 @@ abstract class Skin extends ContextSource {
                global $wgStylePath;
 
                $url = htmlspecialchars( "$wgStylePath/common/images/poweredby_mediawiki_88x31.png" );
-               $text = '<a href="//www.mediawiki.org/"><img src="' . $url . '" height="31" width="88" alt="Powered by MediaWiki" /></a>';
+               $text = '<a href="//www.mediawiki.org/"><img src="' . $url
+                       . '" height="31" width="88" alt="Powered by MediaWiki" /></a>';
                wfRunHooks( 'SkinGetPoweredBy', array( &$text, $this ) );
                return $text;
        }
@@ -886,7 +887,7 @@ abstract class Skin extends ContextSource {
        /**
         * Get the timestamp of the latest revision, formatted in user language
         *
-        * @return String
+        * @return string
         */
        protected function lastModified() {
                $timestamp = $this->getOutput()->getRevisionTimestamp();
@@ -912,7 +913,7 @@ abstract class Skin extends ContextSource {
        }
 
        /**
-        * @param $align string
+        * @param string $align
         * @return string
         */
        function logoText( $align = '' ) {
@@ -934,9 +935,11 @@ abstract class Skin extends ContextSource {
 
        /**
         * Renders a $wgFooterIcons icon according to the method's arguments
-        * @param array $icon The icon to build the html for, see $wgFooterIcons for the format of this array
-        * @param bool|String $withImage Whether to use the icon's image or output a text-only footericon
-        * @return String HTML
+        * @param array $icon The icon to build the html for, see $wgFooterIcons
+        *   for the format of this array.
+        * @param bool|string $withImage Whether to use the icon's image or output
+        *   a text-only footericon.
+        * @return string HTML
         */
        function makeFooterIcon( $icon, $withImage = 'withImage' ) {
                if ( is_string( $icon ) ) {
@@ -945,7 +948,8 @@ abstract class Skin extends ContextSource {
                        $url = isset( $icon["url"] ) ? $icon["url"] : null;
                        unset( $icon["url"] );
                        if ( isset( $icon["src"] ) && $withImage === 'withImage' ) {
-                               $html = Html::element( 'img', $icon ); // do this the lazy way, just pass icon data as an attribute array
+                               // do this the lazy way, just pass icon data as an attribute array
+                               $html = Html::element( 'img', $icon );
                        } else {
                                $html = htmlspecialchars( $icon["alt"] );
                        }
@@ -995,7 +999,7 @@ abstract class Skin extends ContextSource {
 
        /**
         * Gets the link to the wiki's privacy policy page.
-        * @return String HTML
+        * @return string HTML
         */
        function privacyLink() {
                return $this->footerLink( 'privacy', 'privacypage' );
@@ -1003,7 +1007,7 @@ abstract class Skin extends ContextSource {
 
        /**
         * Gets the link to the wiki's about page.
-        * @return String HTML
+        * @return string HTML
         */
        function aboutLink() {
                return $this->footerLink( 'aboutsite', 'aboutpage' );
@@ -1011,7 +1015,7 @@ abstract class Skin extends ContextSource {
 
        /**
         * Gets the link to the wiki's general disclaimers page.
-        * @return String HTML
+        * @return string HTML
         */
        function disclaimerLink() {
                return $this->footerLink( 'disclaimers', 'disclaimerpage' );
@@ -1035,7 +1039,7 @@ abstract class Skin extends ContextSource {
        }
 
        /**
-        * @param $id User|int
+        * @param User|int $id
         * @return bool
         */
        function showEmailUser( $id ) {
@@ -1044,8 +1048,11 @@ abstract class Skin extends ContextSource {
                } else {
                        $targetUser = User::newFromId( $id );
                }
-               return $this->getUser()->canSendEmail() && # the sending user must have a confirmed email address
-                       $targetUser->canReceiveEmail(); # the target user must have a confirmed email address and allow emails from users
+
+               # The sending user must have a confirmed email address and the target
+               # user must have a confirmed email address and allow emails from users.
+               return $this->getUser()->canSendEmail() &&
+                       $targetUser->canReceiveEmail();
        }
 
        /**
@@ -1053,7 +1060,7 @@ abstract class Skin extends ContextSource {
         * This method returns a url resolved using the configured skin style path
         * and includes the style version inside of the url.
         * @param string $name The name or path of a skin resource file
-        * @return String The fully resolved style path url including styleversion
+        * @return string The fully resolved style path url including styleversion
         */
        function getCommonStylePath( $name ) {
                global $wgStylePath, $wgStyleVersion;
@@ -1065,7 +1072,7 @@ abstract class Skin extends ContextSource {
         * This method returns a url resolved using the configured skin style path
         * and includes the style version inside of the url.
         * @param string $name The name or path of a skin resource file
-        * @return String The fully resolved style path url including styleversion
+        * @return string The fully resolved style path url including styleversion
         */
        function getSkinStylePath( $name ) {
                global $wgStylePath, $wgStyleVersion;
@@ -1075,8 +1082,8 @@ abstract class Skin extends ContextSource {
        /* these are used extensively in SkinTemplate, but also some other places */
 
        /**
-        * @param $urlaction string
-        * @return String
+        * @param string $urlaction
+        * @return string
         */
        static function makeMainPageUrl( $urlaction = '' ) {
                $title = Title::newMainPage();
@@ -1093,8 +1100,8 @@ abstract class Skin extends ContextSource {
         *
         * @param string $name Name of the Special page
         * @param string $urlaction Query to append
-        * @param $proto Protocol to use or null for a local URL
-        * @return String
+        * @param string|null $proto Protocol to use or null for a local URL
+        * @return string
         */
        static function makeSpecialUrl( $name, $urlaction = '', $proto = null ) {
                $title = SpecialPage::getSafeTitleFor( $name );
@@ -1106,10 +1113,10 @@ abstract class Skin extends ContextSource {
        }
 
        /**
-        * @param $name string
-        * @param $subpage string
-        * @param $urlaction string
-        * @return String
+        * @param string $name
+        * @param string $subpage
+        * @param string $urlaction
+        * @return string
         */
        static function makeSpecialUrlSubpage( $name, $subpage, $urlaction = '' ) {
                $title = SpecialPage::getSafeTitleFor( $name, $subpage );
@@ -1117,9 +1124,9 @@ abstract class Skin extends ContextSource {
        }
 
        /**
-        * @param $name string
-        * @param $urlaction string
-        * @return String
+        * @param string $name
+        * @param string $urlaction
+        * @return string
         */
        static function makeI18nUrl( $name, $urlaction = '' ) {
                $title = Title::newFromText( wfMessage( $name )->inContentLanguage()->text() );
@@ -1128,9 +1135,9 @@ abstract class Skin extends ContextSource {
        }
 
        /**
-        * @param $name string
-        * @param $urlaction string
-        * @return String
+        * @param string $name
+        * @param string $urlaction
+        * @return string
         */
        static function makeUrl( $name, $urlaction = '' ) {
                $title = Title::newFromText( $name );
@@ -1142,8 +1149,8 @@ abstract class Skin extends ContextSource {
        /**
         * If url string starts with http, consider as external URL, else
         * internal
-        * @param $name String
-        * @return String URL
+        * @param string $name
+        * @return string URL
         */
        static function makeInternalOrExternalUrl( $name ) {
                if ( preg_match( '/^(?i:' . wfUrlProtocols() . ')/', $name ) ) {
@@ -1155,10 +1162,10 @@ abstract class Skin extends ContextSource {
 
        /**
         * this can be passed the NS number as defined in Language.php
-        * @param $name
-        * @param $urlaction string
-        * @param $namespace int
-        * @return String
+        * @param string $name
+        * @param string $urlaction
+        * @param int $namespace
+        * @return string
         */
        static function makeNSUrl( $name, $urlaction = '', $namespace = NS_MAIN ) {
                $title = Title::makeTitleSafe( $namespace, $name );
@@ -1169,8 +1176,8 @@ abstract class Skin extends ContextSource {
 
        /**
         * these return an array with the 'href' and boolean 'exists'
-        * @param $name
-        * @param $urlaction string
+        * @param string $name
+        * @param string $urlaction
         * @return array
         */
        static function makeUrlDetails( $name, $urlaction = '' ) {
@@ -1186,8 +1193,8 @@ abstract class Skin extends ContextSource {
        /**
         * Make URL details where the article exists (or at least it's convenient to think so)
         * @param string $name Article name
-        * @param $urlaction String
-        * @return Array
+        * @param string $urlaction
+        * @return array
         */
        static function makeKnownUrlDetails( $name, $urlaction = '' ) {
                $title = Title::newFromText( $name );
@@ -1202,8 +1209,8 @@ abstract class Skin extends ContextSource {
        /**
         * make sure we have some title to operate on
         *
-        * @param $title Title
-        * @param $name string
+        * @param Title $title
+        * @param string $name
         */
        static function checkTitle( &$title, $name ) {
                if ( !is_object( $title ) ) {
@@ -1244,6 +1251,8 @@ abstract class Skin extends ContextSource {
                if ( $wgEnableSidebarCache ) {
                        $cachedsidebar = $wgMemc->get( $key );
                        if ( $cachedsidebar ) {
+                               wfRunHooks( 'SidebarBeforeOutput', array( $this, &$cachedsidebar ) );
+
                                wfProfileOut( __METHOD__ );
                                return $cachedsidebar;
                        }
@@ -1257,6 +1266,8 @@ abstract class Skin extends ContextSource {
                        $wgMemc->set( $key, $bar, $wgSidebarCacheExpiry );
                }
 
+               wfRunHooks( 'SidebarBeforeOutput', array( $this, &$bar ) );
+
                wfProfileOut( __METHOD__ );
                return $bar;
        }
@@ -1267,8 +1278,8 @@ abstract class Skin extends ContextSource {
         *
         * This is just a wrapper around addToSidebarPlain() for backwards compatibility
         *
-        * @param $bar array
-        * @param $message String
+        * @param array $bar
+        * @param string $message
         */
        function addToSidebar( &$bar, $message ) {
                $this->addToSidebarPlain( $bar, wfMessage( $message )->inContentLanguage()->plain() );
@@ -1277,9 +1288,9 @@ abstract class Skin extends ContextSource {
        /**
         * Add content from plain text
         * @since 1.17
-        * @param $bar array
-        * @param $text string
-        * @return Array
+        * @param array $bar
+        * @param string $text
+        * @return array
         */
        function addToSidebarPlain( &$bar, $text ) {
                $lines = explode( "\n", $text );
@@ -1385,7 +1396,7 @@ abstract class Skin extends ContextSource {
        /**
         * Gets new talk page messages for the current user and returns an
         * appropriate alert message (or an empty string if there are no messages)
-        * @return String
+        * @return string
         */
        function getNewtalks() {
 
@@ -1477,8 +1488,8 @@ abstract class Skin extends ContextSource {
        /**
         * Get a cached notice
         *
-        * @param string $name message name, or 'default' for $wgSiteNotice
-        * @return String: HTML fragment
+        * @param string $name Message name, or 'default' for $wgSiteNotice
+        * @return string HTML fragment
         */
        private function getCachedNotice( $name ) {
                global $wgRenderHashAppend, $parserMemc, $wgContLang;
@@ -1532,7 +1543,7 @@ abstract class Skin extends ContextSource {
        /**
         * Get a notice based on page's namespace
         *
-        * @return String: HTML fragment
+        * @return string HTML fragment
         */
        function getNamespaceNotice() {
                wfProfileIn( __METHOD__ );
@@ -1552,7 +1563,7 @@ abstract class Skin extends ContextSource {
        /**
         * Get the site notice
         *
-        * @return String: HTML fragment
+        * @return string HTML fragment
         */
        function getSiteNotice() {
                wfProfileIn( __METHOD__ );
@@ -1583,13 +1594,13 @@ abstract class Skin extends ContextSource {
         * Create a section edit link.  This supersedes editSectionLink() and
         * editSectionLinkForOther().
         *
-        * @param $nt Title  The title being linked to (may not be the same as
+        * @param Title $nt The title being linked to (may not be the same as
         *   the current page, if the section is included from a template)
         * @param string $section The designation of the section being pointed to,
         *   to be included in the link, like "&section=$section"
         * @param string $tooltip The tooltip to use for the link: will be escaped
         *   and wrapped in the 'editsectionhint' message
-        * @param $lang string Language code
+        * @param string $lang Language code
         * @return string HTML to use for edit link
         */
        public function doEditSectionLink( Title $nt, $section, $tooltip = null, $lang = false ) {
index f359a1c..08816ad 100644 (file)
  * @private
  * @ingroup Skins
  */
-class MediaWiki_I18N {
-       var $_context = array();
+class MediaWikiI18N {
+       private $context = array();
 
        function set( $varName, $value ) {
-               $this->_context[$varName] = $value;
+               $this->context[$varName] = $value;
        }
 
        function translate( $value ) {
@@ -46,7 +46,7 @@ class MediaWiki_I18N {
                while ( preg_match( '/\$([0-9]*?)/sm', $value, $m ) ) {
                        list( $src, $var ) = $m;
                        wfSuppressWarnings();
-                       $varValue = $this->_context[$var];
+                       $varValue = $this->context[$var];
                        wfRestoreWarnings();
                        $value = str_replace( $src, $varValue, $value );
                }
@@ -68,40 +68,34 @@ class MediaWiki_I18N {
  * @ingroup Skins
  */
 class SkinTemplate extends Skin {
-       /**#@+
-        * @private
-        */
-
        /**
-        * Name of our skin, it probably needs to be all lower case.  Child classes
-        * should override the default.
+        * @var string Name of our skin, it probably needs to be all lower case.
+        *   Child classes should override the default.
         */
-       var $skinname = 'monobook';
+       public $skinname = 'monobook';
 
        /**
-        * Stylesheets set to use.  Subdirectory in skins/ where various stylesheets
-        * are located.  Child classes should override the default.
+        * @var string Stylesheets set to use. Subdirectory in skins/ where various
+        *   stylesheets are located.  Child classes should override the default.
         */
-       var $stylename = 'monobook';
+       public $stylename = 'monobook';
 
        /**
-        * For QuickTemplate, the name of the subclass which will actually fill the
-        * template.  Child classes should override the default.
+        * @var string For QuickTemplate, the name of the subclass which will
+        *   actually fill the template.  Child classes should override the default.
         */
-       var $template = 'QuickTemplate';
+       public $template = 'QuickTemplate';
 
        /**
-        * Whether this skin use OutputPage::headElement() to generate the "<head>"
-        * tag
+        * @var bool Whether this skin use OutputPage::headElement() to generate
+        *   the "<head>" tag.
         */
-       var $useHeadElement = false;
-
-       /**#@-*/
+       public $useHeadElement = false;
 
        /**
         * Add specific styles for this skin
         *
-        * @param $out OutputPage
+        * @param OutputPage $out
         */
        function setupSkinUserCss( OutputPage $out ) {
                $out->addModuleStyles( array(
@@ -116,9 +110,9 @@ class SkinTemplate extends Skin {
         * and eventually it spits out some HTML. Should have interface
         * roughly equivalent to PHPTAL 0.7.
         *
-        * @param $classname String
-        * @param string $repository subdirectory where we keep template files
-        * @param $cache_dir string
+        * @param string $classname
+        * @param bool|string $repository Subdirectory where we keep template files
+        * @param bool|string $cache_dir
         * @return QuickTemplate
         * @private
         */
@@ -187,7 +181,10 @@ class SkinTemplate extends Skin {
                                        'lang' => $ilInterwikiCodeBCP47,
                                        'hreflang' => $ilInterwikiCodeBCP47,
                                );
-                               wfRunHooks( 'SkinTemplateGetLanguageLink', array( &$languageLink, $languageLinkTitle, $this->getTitle() ) );
+                               wfRunHooks(
+                                       'SkinTemplateGetLanguageLink',
+                                       array( &$languageLink, $languageLinkTitle, $this->getTitle() )
+                               );
                                $languageLinks[] = $languageLink;
                        }
                }
@@ -239,7 +236,7 @@ class SkinTemplate extends Skin {
        /**
         * initialize various variables and generate the template
         *
-        * @param $out OutputPage
+        * @param OutputPage $out
         */
        function outputPage( OutputPage $out = null ) {
                wfProfileIn( __METHOD__ );
@@ -277,7 +274,7 @@ class SkinTemplate extends Skin {
         * initialize various variables and generate the template
         *
         * @since 1.23
-        * @return QuickTemplate the template to be executed by outputPage
+        * @return QuickTemplate The template to be executed by outputPage
         */
        protected function prepareQuickTemplate() {
                global $wgContLang, $wgScript, $wgStylePath,
@@ -402,7 +399,8 @@ class SkinTemplate extends Skin {
                // that interface elements are in a different language.
                $tpl->set( 'userlangattributes', '' );
                $tpl->set( 'specialpageattributes', '' ); # obsolete
-               // Used by VectorBeta to insert HTML before content but after the heading for the page title. Defaults to empty string.
+               // Used by VectorBeta to insert HTML before content but after the
+               // heading for the page title. Defaults to empty string.
                $tpl->set( 'prebodyhtml', '' );
 
                if ( $userLangCode !== $wgContLang->getHtmlCode() || $userLangDir !== $wgContLang->getDir() ) {
@@ -561,9 +559,14 @@ class SkinTemplate extends Skin {
                // and output printfooter and debughtml separately
                $tpl->set( 'bodycontent', $tpl->data['bodytext'] );
 
-               // Append printfooter and debughtml onto bodytext so that skins that were already
-               // using bodytext before they were split out don't suddenly start not outputting information
-               $tpl->data['bodytext'] .= Html::rawElement( 'div', array( 'class' => 'printfooter' ), "\n{$tpl->data['printfooter']}" ) . "\n";
+               // Append printfooter and debughtml onto bodytext so that skins that
+               // were already using bodytext before they were split out don't suddenly
+               // start not outputting information.
+               $tpl->data['bodytext'] .= Html::rawElement(
+                       'div',
+                       array( 'class' => 'printfooter' ),
+                       "\n{$tpl->data['printfooter']}"
+               ) . "\n";
                $tpl->data['bodytext'] .= $tpl->data['debughtml'];
 
                // allow extensions adding stuff after the page content.
@@ -606,7 +609,7 @@ class SkinTemplate extends Skin {
         * an error object of the appropriate type.
         * For the base class, assume strings all around.
         *
-        * @param $str Mixed
+        * @param string $str
         * @private
         */
        function printOrError( $str ) {
@@ -733,7 +736,8 @@ class SkinTemplate extends Skin {
                        $login_url = array(
                                'text' => $this->msg( $loginlink )->text(),
                                'href' => self::makeSpecialUrl( 'Userlogin', $returnto ),
-                               'active' => $title->isSpecial( 'Userlogin' ) && ( $loginlink == 'nav-login-createaccount' || !$is_signup ),
+                               'active' => $title->isSpecial( 'Userlogin' )
+                                       && ( $loginlink == 'nav-login-createaccount' || !$is_signup ),
                        );
                        $createaccount_url = array(
                                'text' => $this->msg( 'pt-createaccount' )->text(),
@@ -774,11 +778,11 @@ class SkinTemplate extends Skin {
        /**
         * Builds an array with tab definition
         *
-        * @param Title $title page where the tab links to
-        * @param string|array $message message key or an array of message keys (will fall back)
-        * @param boolean $selected display the tab as selected
-        * @param string $query query string attached to tab URL
-        * @param boolean $checkEdit check if $title exists and mark with .new if one doesn't
+        * @param Title $title page Where the tab links to
+        * @param string|array $message Message key or an array of message keys (will fall back)
+        * @param bool $selected Display the tab as selected
+        * @param string $query Query string attached to tab URL
+        * @param bool $checkEdit Check if $title exists and mark with .new if one doesn't
         *
         * @return array
         */
@@ -875,9 +879,10 @@ class SkinTemplate extends Skin {
         * links, however these are usually automatically generated by SkinTemplate
         * itself and are not necessary when using a hook. The only things these may
         * matter to are people modifying content_navigation after it's initial creation:
-        * - id: A "preferred" id, most skins are best off outputting this preferred id for best compatibility
+        * - id: A "preferred" id, most skins are best off outputting this preferred
+        *   id for best compatibility.
         * - tooltiponly: This is set to true for some tabs in cases where the system
-        *                believes that the accesskey should not be added to the tab.
+        *   believes that the accesskey should not be added to the tab.
         *
         * @return array
         */
@@ -974,7 +979,9 @@ class SkinTemplate extends Skin {
                                wfProfileIn( __METHOD__ . '-edit' );
 
                                // Checks if user can edit the current page if it exists or create it otherwise
-                               if ( $title->quickUserCan( 'edit', $user ) && ( $title->exists() || $title->quickUserCan( 'create', $user ) ) ) {
+                               if ( $title->quickUserCan( 'edit', $user )
+                                       && ( $title->exists() || $title->quickUserCan( 'create', $user ) )
+                               ) {
                                        // Builds CSS class for talk page links
                                        $isTalkClass = $isTalk ? ' istalk' : '';
                                        // Whether the user is editing the page
@@ -985,14 +992,22 @@ class SkinTemplate extends Skin {
                                                && ( ( $isTalk && $this->isRevisionCurrent() ) || $out->showNewSectionLink() );
                                        $section = $request->getVal( 'section' );
 
-                                       if ( $title->exists() || ( $title->getNamespace() == NS_MEDIAWIKI && $title->getDefaultMessageText() !== false ) ) {
+                                       if ( $title->exists()
+                                               || ( $title->getNamespace() == NS_MEDIAWIKI
+                                                       && $title->getDefaultMessageText() !== false
+                                               )
+                                       ) {
                                                $msgKey = $isForeignFile ? 'edit-local' : 'edit';
                                        } else {
                                                $msgKey = $isForeignFile ? 'create-local' : 'create';
                                        }
                                        $content_navigation['views']['edit'] = array(
-                                               'class' => ( $isEditing && ( $section !== 'new' || !$showNewSection ) ? 'selected' : '' ) . $isTalkClass,
-                                               'text' => wfMessageFallback( "$skname-view-$msgKey", $msgKey )->setContext( $this->getContext() )->text(),
+                                               'class' => ( $isEditing && ( $section !== 'new' || !$showNewSection )
+                                                       ? 'selected'
+                                                       : ''
+                                               ) . $isTalkClass,
+                                               'text' => wfMessageFallback( "$skname-view-$msgKey", $msgKey )
+                                                       ->setContext( $this->getContext() )->text(),
                                                'href' => $title->getLocalURL( $this->editUrlOptions() ),
                                                'primary' => !$isForeignFile, // don't collapse this in vector
                                        );
@@ -1003,7 +1018,8 @@ class SkinTemplate extends Skin {
                                                //$content_navigation['actions']['addsection']
                                                $content_navigation['views']['addsection'] = array(
                                                        'class' => ( $isEditing && $section == 'new' ) ? 'selected' : false,
-                                                       'text' => wfMessageFallback( "$skname-action-addsection", 'addsection' )->setContext( $this->getContext() )->text(),
+                                                       'text' => wfMessageFallback( "$skname-action-addsection", 'addsection' )
+                                                               ->setContext( $this->getContext() )->text(),
                                                        'href' => $title->getLocalURL( 'action=edit&section=new' )
                                                );
                                        }
@@ -1012,7 +1028,8 @@ class SkinTemplate extends Skin {
                                        // Adds view source view link
                                        $content_navigation['views']['viewsource'] = array(
                                                'class' => ( $onPage && $action == 'edit' ) ? 'selected' : false,
-                                               'text' => wfMessageFallback( "$skname-action-viewsource", 'viewsource' )->setContext( $this->getContext() )->text(),
+                                               'text' => wfMessageFallback( "$skname-action-viewsource", 'viewsource' )
+                                                       ->setContext( $this->getContext() )->text(),
                                                'href' => $title->getLocalURL( $this->editUrlOptions() ),
                                                'primary' => true, // don't collapse this in vector
                                        );
@@ -1025,7 +1042,8 @@ class SkinTemplate extends Skin {
                                        // Adds history view link
                                        $content_navigation['views']['history'] = array(
                                                'class' => ( $onPage && $action == 'history' ) ? 'selected' : false,
-                                               'text' => wfMessageFallback( "$skname-view-history", 'history_short' )->setContext( $this->getContext() )->text(),
+                                               'text' => wfMessageFallback( "$skname-view-history", 'history_short' )
+                                                       ->setContext( $this->getContext() )->text(),
                                                'href' => $title->getLocalURL( 'action=history' ),
                                                'rel' => 'archives',
                                        );
@@ -1033,7 +1051,8 @@ class SkinTemplate extends Skin {
                                        if ( $title->quickUserCan( 'delete', $user ) ) {
                                                $content_navigation['actions']['delete'] = array(
                                                        'class' => ( $onPage && $action == 'delete' ) ? 'selected' : false,
-                                                       'text' => wfMessageFallback( "$skname-action-delete", 'delete' )->setContext( $this->getContext() )->text(),
+                                                       'text' => wfMessageFallback( "$skname-action-delete", 'delete' )
+                                                               ->setContext( $this->getContext() )->text(),
                                                        'href' => $title->getLocalURL( 'action=delete' )
                                                );
                                        }
@@ -1042,7 +1061,8 @@ class SkinTemplate extends Skin {
                                                $moveTitle = SpecialPage::getTitleFor( 'Movepage', $title->getPrefixedDBkey() );
                                                $content_navigation['actions']['move'] = array(
                                                        'class' => $this->getTitle()->isSpecial( 'Movepage' ) ? 'selected' : false,
-                                                       'text' => wfMessageFallback( "$skname-action-move", 'move' )->setContext( $this->getContext() )->text(),
+                                                       'text' => wfMessageFallback( "$skname-action-move", 'move' )
+                                                               ->setContext( $this->getContext() )->text(),
                                                        'href' => $moveTitle->getLocalURL()
                                                );
                                        }
@@ -1052,7 +1072,8 @@ class SkinTemplate extends Skin {
                                                $n = $title->isDeleted();
                                                if ( $n ) {
                                                        $undelTitle = SpecialPage::getTitleFor( 'Undelete' );
-                                                       // If the user can't undelete but can view deleted history show them a "View .. deleted" tab instead
+                                                       // If the user can't undelete but can view deleted
+                                                       // history show them a "View .. deleted" tab instead.
                                                        $msgKey = $user->isAllowed( 'undelete' ) ? 'undelete' : 'viewdeleted';
                                                        $content_navigation['actions']['undelete'] = array(
                                                                'class' => $this->getTitle()->isSpecial( 'Undelete' ) ? 'selected' : false,
@@ -1070,7 +1091,8 @@ class SkinTemplate extends Skin {
                                        $mode = $title->isProtected() ? 'unprotect' : 'protect';
                                        $content_navigation['actions'][$mode] = array(
                                                'class' => ( $onPage && $action == $mode ) ? 'selected' : false,
-                                               'text' => wfMessageFallback( "$skname-action-$mode", $mode )->setContext( $this->getContext() )->text(),
+                                               'text' => wfMessageFallback( "$skname-action-$mode", $mode )
+                                                       ->setContext( $this->getContext() )->text(),
                                                'href' => $title->getLocalURL( "action=$mode" )
                                        );
                                }
@@ -1190,10 +1212,10 @@ class SkinTemplate extends Skin {
 
        /**
         * an array of edit links by default used for the tabs
+        * @param $content_navigation
         * @return array
-        * @private
         */
-       function buildContentActionUrls( $content_navigation ) {
+       private function buildContentActionUrls( $content_navigation ) {
 
                wfProfileIn( __METHOD__ );
 
@@ -1204,9 +1226,7 @@ class SkinTemplate extends Skin {
                $content_actions = array();
 
                foreach ( $content_navigation as $links ) {
-
                        foreach ( $links as $key => $value ) {
-
                                if ( isset( $value['redundant'] ) && $value['redundant'] ) {
                                        // Redundant tabs are dropped from content_actions
                                        continue;
@@ -1227,9 +1247,7 @@ class SkinTemplate extends Skin {
                                }
 
                                $content_actions[$key] = $value;
-
                        }
-
                }
 
                wfProfileOut( __METHOD__ );
@@ -1240,7 +1258,6 @@ class SkinTemplate extends Skin {
        /**
         * build array of common navigation links
         * @return array
-        * @private
         */
        protected function buildNavUrls() {
                global $wgUploadNavigationUrl;
@@ -1357,9 +1374,8 @@ class SkinTemplate extends Skin {
        /**
         * Generate strings used for xml 'id' names
         * @return string
-        * @private
         */
-       function getNameSpaceKey() {
+       protected function getNameSpaceKey() {
                return $this->getTitle()->getNamespaceKey();
        }
 }
@@ -1375,13 +1391,13 @@ abstract class QuickTemplate {
         */
        function __construct() {
                $this->data = array();
-               $this->translator = new MediaWiki_I18N();
+               $this->translator = new MediaWikiI18N();
        }
 
        /**
         * Sets the value $value to $name
-        * @param $name
-        * @param $value
+        * @param string $name
+        * @param mixed $value
         */
        public function set( $name, $value ) {
                $this->data[$name] = $value;
@@ -1403,15 +1419,15 @@ abstract class QuickTemplate {
        }
 
        /**
-        * @param $name
-        * @param $value
+        * @param string $name
+        * @param mixed $value
         */
        public function setRef( $name, &$value ) {
                $this->data[$name] =& $value;
        }
 
        /**
-        * @param $t
+        * @param MediaWikiI18N $t
         */
        public function setTranslator( &$t ) {
                $this->translator = &$t;
@@ -1425,6 +1441,8 @@ abstract class QuickTemplate {
 
        /**
         * @private
+        * @param string $str
+        * @return string
         */
        function text( $str ) {
                echo htmlspecialchars( $this->data[$str] );
@@ -1432,6 +1450,8 @@ abstract class QuickTemplate {
 
        /**
         * @private
+        * @param string $str
+        * @return string
         */
        function html( $str ) {
                echo $this->data[$str];
@@ -1439,6 +1459,8 @@ abstract class QuickTemplate {
 
        /**
         * @private
+        * @param string $str
+        * @return string
         */
        function msg( $str ) {
                echo htmlspecialchars( $this->translator->translate( $str ) );
@@ -1446,6 +1468,8 @@ abstract class QuickTemplate {
 
        /**
         * @private
+        * @param string $str
+        * @return string
         */
        function msgHtml( $str ) {
                echo $this->translator->translate( $str );
@@ -1454,6 +1478,8 @@ abstract class QuickTemplate {
        /**
         * An ugly, ugly hack.
         * @private
+        * @param string $str
+        * @return string
         */
        function msgWiki( $str ) {
                global $wgOut;
@@ -1464,6 +1490,7 @@ abstract class QuickTemplate {
 
        /**
         * @private
+        * @param string $str
         * @return bool
         */
        function haveData( $str ) {
@@ -1473,6 +1500,7 @@ abstract class QuickTemplate {
        /**
         * @private
         *
+        * @param string $str
         * @return bool
         */
        function haveMsg( $str ) {
@@ -1483,7 +1511,7 @@ abstract class QuickTemplate {
        /**
         * Get the Skin object related to this object
         *
-        * @return Skin object
+        * @return Skin
         */
        public function getSkin() {
                return $this->data['skin'];
@@ -1493,7 +1521,7 @@ abstract class QuickTemplate {
         * Fetch the output of a QuickTemplate and return it
         *
         * @since 1.23
-        * @return String
+        * @return string
         */
        public function getHTML() {
                ob_start();
@@ -1514,7 +1542,7 @@ abstract class BaseTemplate extends QuickTemplate {
        /**
         * Get a Message object with its context set
         *
-        * @param string $name message name
+        * @param string $name Message name
         * @return Message
         */
        public function getMsg( $name ) {
@@ -1544,11 +1572,15 @@ abstract class BaseTemplate extends QuickTemplate {
                wfProfileIn( __METHOD__ );
 
                $toolbox = array();
-               if ( isset( $this->data['nav_urls']['whatlinkshere'] ) && $this->data['nav_urls']['whatlinkshere'] ) {
+               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'] ) {
+               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';
@@ -1564,7 +1596,9 @@ abstract class BaseTemplate extends QuickTemplate {
                                $toolbox['feeds']['links'][$key]['class'] = 'feedlink';
                        }
                }
-               foreach ( array( 'contributions', 'log', 'blockip', 'emailuser', 'userrights', 'upload', 'specialpages' ) as $special ) {
+               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";
@@ -1832,7 +1866,9 @@ abstract class BaseTemplate extends QuickTemplate {
                        }
                        while ( count( $wrapper ) > 0 ) {
                                $element = array_pop( $wrapper );
-                               $html = Html::rawElement( $element['tag'], isset( $element['attributes'] ) ? $element['attributes'] : null, $html );
+                               $html = Html::rawElement( $element['tag'], isset( $element['attributes'] )
+                                       ? $element['attributes']
+                                       : null, $html );
                        }
                }
 
@@ -1868,7 +1904,9 @@ abstract class BaseTemplate extends QuickTemplate {
                                        $attrs['class'] = $options['link-class'];
                                }
                        }
-                       $html = Html::rawElement( isset( $attrs['href'] ) ? 'a' : $options['link-fallback'], $attrs, $html );
+                       $html = Html::rawElement( isset( $attrs['href'] )
+                               ? 'a'
+                               : $options['link-fallback'], $attrs, $html );
                }
 
                return $html;
@@ -1877,12 +1915,12 @@ abstract class BaseTemplate extends QuickTemplate {
        /**
         * Generates a list item for a navigation, portlet, portal, sidebar... list
         *
-        * @param $key string, usually a key from the list you are generating this link from.
-        * @param $item array, of list item data containing some of a specific set of keys.
+        * @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 $options array
+        * @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.
@@ -1904,10 +1942,11 @@ abstract class BaseTemplate extends QuickTemplate {
         */
        function makeListItem( $key, $item, $options = array() ) {
                if ( isset( $item['links'] ) ) {
-                       $html = '';
+                       $links = array();
                        foreach ( $item['links'] as $linkKey => $link ) {
-                               $html .= $this->makeLink( $linkKey, $link, $options );
+                               $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
@@ -2003,6 +2042,7 @@ abstract class BaseTemplate extends QuickTemplate {
         * 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 ) {
@@ -2042,7 +2082,8 @@ abstract class BaseTemplate extends QuickTemplate {
         * 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.
-        * @return
+        * @param string $option
+        * @return string
         */
        function getFooterIcons( $option = null ) {
                // Generate additional footer icons
@@ -2084,5 +2125,4 @@ abstract class BaseTemplate extends QuickTemplate {
 <?php $this->html( 'reporttime' ) ?>
 <?php
        }
-
 }
index eadf256..c790bb7 100644 (file)
  * Could be replaced by curl_multi_exec() or some such.
  */
 class SquidPurgeClient {
-       var $host, $port, $ip;
+       /** @var string */
+       protected $host;
 
-       var $readState = 'idle';
-       var $writeBuffer = '';
-       var $requests = array();
-       var $currentRequestIndex;
+       /** @var int */
+       protected $port;
+
+       /** @var string|bool */
+       protected $ip;
+
+       /** @var string */
+       protected $readState = 'idle';
+
+       /** @var string */
+       protected $writeBuffer = '';
+
+       /** @var array */
+       protected $requests = array();
+
+       /** @var mixed */
+       protected $currentRequestIndex;
 
        const EINTR = 4;
        const EAGAIN = 11;
@@ -41,17 +55,20 @@ class SquidPurgeClient {
        const BUFFER_SIZE = 8192;
 
        /**
-        * The socket resource, or null for unconnected, or false for disabled due to error
+        * @var resource|null The socket resource, or null for unconnected, or false
+        *   for disabled due to error.
         */
-       var $socket;
+       protected $socket;
 
-       var $readBuffer;
+       /** @var string */
+       protected $readBuffer;
 
-       var $bodyRemaining;
+       /** @var int */
+       protected $bodyRemaining;
 
        /**
-        * @param $server string
-        * @param $options array
+        * @param string $server
+        * @param array $options
         */
        public function __construct( $server, $options = array() ) {
                $parts = explode( ':', $server, 2 );
@@ -126,6 +143,8 @@ class SquidPurgeClient {
        /**
         * Get the host's IP address.
         * Does not support IPv6 at present due to the lack of a convenient interface in PHP.
+        * @throws MWException
+        * @return string
         */
        protected function getIP() {
                if ( $this->ip === null ) {
@@ -173,7 +192,7 @@ class SquidPurgeClient {
        /**
         * Queue a purge operation
         *
-        * @param $url string
+        * @param string $url
         */
        public function queuePurge( $url ) {
                global $wgSquidPurgeUseHostHeader;
@@ -323,7 +342,7 @@ class SquidPurgeClient {
        }
 
        /**
-        * @param $line
+        * @param string $line
         * @return
         */
        protected function processStatusLine( $line ) {
@@ -343,7 +362,7 @@ class SquidPurgeClient {
        }
 
        /**
-        * @param $line string
+        * @param string $line
         */
        protected function processHeaderLine( $line ) {
                if ( preg_match( '/^Content-Length: (\d+)$/i', $line, $m ) ) {
@@ -370,7 +389,7 @@ class SquidPurgeClient {
        }
 
        /**
-        * @param $msg string
+        * @param string $msg
         */
        protected function log( $msg ) {
                wfDebugLog( 'squid', __CLASS__ . " ($this->host): $msg" );
@@ -378,15 +397,14 @@ class SquidPurgeClient {
 }
 
 class SquidPurgeClientPool {
+       /** @var array of SquidPurgeClient */
+       protected $clients = array();
 
-       /**
-        * @var array of SquidPurgeClient
-        */
-       var $clients = array();
-       var $timeout = 5;
+       /** @var int */
+       protected $timeout = 5;
 
        /**
-        * @param $options array
+        * @param array $options
         */
        function __construct( $options = array() ) {
                if ( isset( $options['timeout'] ) ) {
@@ -395,7 +413,7 @@ class SquidPurgeClientPool {
        }
 
        /**
-        * @param $client SquidPurgeClient
+        * @param SquidPurgeClient $client
         * @return void
         */
        public function addClient( $client ) {
index 1373f3d..102fffd 100644 (file)
  * @ingroup StatCounter
  */
 class StatCounter {
-       /** @var Array */
+       /** @var array */
        protected $deltas = array(); // (key => count)
 
-       protected function __construct() {}
+       protected function __construct() {
+       }
 
        /**
         * @return StatCounter
@@ -56,7 +57,7 @@ class StatCounter {
         * Increment a key by delta $count
         *
         * @param string $key
-        * @param integer $count
+        * @param int $count
         * @return void
         */
        public function incr( $key, $count = 1 ) {
index 3573f4a..77bf4a8 100644 (file)
@@ -78,7 +78,7 @@ class Status {
        /**
         * Factory function for good results
         *
-        * @param $value Mixed
+        * @param mixed $value
         * @return Status
         */
        static function newGood( $value = null ) {
@@ -102,7 +102,7 @@ class Status {
         * Returns whether the operation completed and didn't have any error or
         * warnings
         *
-        * @return Boolean
+        * @return bool
         */
        public function isGood() {
                return $this->ok && !$this->errors;
@@ -111,7 +111,7 @@ class Status {
        /**
         * Returns whether the operation completed
         *
-        * @return Boolean
+        * @return bool
         */
        public function isOK() {
                return $this->ok;
@@ -120,7 +120,7 @@ class Status {
        /**
         * Add a new warning
         *
-        * @param string|Message $message message name or object
+        * @param string|Message $message Message name or object
         */
        public function warning( $message /*, parameters... */ ) {
                $params = array_slice( func_get_args(), 1 );
@@ -134,7 +134,7 @@ class Status {
         * Add an error, do not set fatal flag
         * This can be used for non-fatal errors
         *
-        * @param string|Message $message message name or object
+        * @param string|Message $message Message name or object
         */
        public function error( $message /*, parameters... */ ) {
                $params = array_slice( func_get_args(), 1 );
@@ -148,7 +148,7 @@ class Status {
         * Add an error and set OK to false, indicating that the operation
         * as a whole was fatal
         *
-        * @param string|Message $message message name or object
+        * @param string|Message $message Message name or object
         */
        public function fatal( $message /*, parameters... */ ) {
                $params = array_slice( func_get_args(), 1 );
@@ -167,7 +167,7 @@ class Status {
        }
 
        /**
-        * @param $params array
+        * @param array $params
         * @return array
         */
        protected function cleanParams( $params ) {
@@ -184,10 +184,10 @@ class Status {
        /**
         * Get the error list as a wikitext formatted list
         *
-        * @param string $shortContext a short enclosing context message name, to
+        * @param string $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
-        * @return String
+        * @param string $longContext A long enclosing context message name, for a list
+        * @return string
         */
        public function getWikiText( $shortContext = false, $longContext = false ) {
                if ( count( $this->errors ) == 0 ) {
@@ -275,12 +275,12 @@ class Status {
 
        /**
         * Return the message for a single error.
-        * @param $error Mixed With an array & two values keyed by
+        * @param mixed $error With an array & two values keyed by
         * 'message' and 'params', use those keys-value pairs.
         * Otherwise, if its an array, just use the first value as the
         * message and the remaining items as the params.
         *
-        * @return String
+        * @return string
         */
        protected function getErrorMessage( $error ) {
                if ( is_array( $error ) ) {
@@ -303,10 +303,10 @@ class Status {
        /**
         * Get the error message as HTML. This is done by parsing the wikitext error
         * message.
-        * @param string $shortContext a short enclosing context message name, to
+        * @param string $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
-        * @return String
+        * @param string $longContext A long enclosing context message name, for a list
+        * @return string
         */
        public function getHTML( $shortContext = false, $longContext = false ) {
                $text = $this->getWikiText( $shortContext, $longContext );
@@ -316,8 +316,8 @@ class Status {
 
        /**
         * Return an array with the wikitext for each item in the array.
-        * @param $errors Array
-        * @return Array
+        * @param array $errors
+        * @return array
         */
        protected function getErrorMessageArray( $errors ) {
                return array_map( array( $this, 'getErrorMessage' ), $errors );
@@ -361,8 +361,8 @@ class Status {
 
        /**
         * Returns a list of status messages of the given type
-        * @param $type String
-        * @return Array
+        * @param string $type
+        * @return array
         */
        protected function getStatusArray( $type ) {
                $result = array();
@@ -388,9 +388,9 @@ class Status {
         * Returns a list of status messages of the given type, with message and
         * params left untouched, like a sane version of getStatusArray
         *
-        * @param $type String
+        * @param string $type
         *
-        * @return Array
+        * @return array
         */
        public function getErrorsByType( $type ) {
                $result = array();
@@ -405,15 +405,20 @@ class Status {
        /**
         * Returns true if the specified message is present as a warning or error
         *
-        * Note, due to the lack of tools for comparing Message objects, this
-        * function will not work when using a Message object as a parameter.
+        * @param string|Message $message Message key or object to search for
         *
-        * @param string $msg message name
-        * @return Boolean
+        * @return bool
         */
-       public function hasMessage( $msg ) {
+       public function hasMessage( $message ) {
+               if ( $message instanceof Message ) {
+                       $message = $message->getKey();
+               }
                foreach ( $this->errors as $error ) {
-                       if ( $error['message'] === $msg ) {
+                       if ( $error['message'] instanceof Message
+                               && $error['message']->getKey() === $message
+                       ) {
+                               return true;
+                       } elseif ( $error['message'] === $message ) {
                                return true;
                        }
                }
index ef82705..2503150 100644 (file)
@@ -158,10 +158,14 @@ class StreamFile {
                # used for thumbnails (thumb.php)
                if ( $wgTrivialMimeDetection ) {
                        switch ( $ext ) {
-                               case 'gif': return 'image/gif';
-                               case 'png': return 'image/png';
-                               case 'jpg': return 'image/jpeg';
-                               case 'jpeg': return 'image/jpeg';
+                               case 'gif':
+                                       return 'image/gif';
+                               case 'png':
+                                       return 'image/png';
+                               case 'jpg':
+                                       return 'image/jpeg';
+                               case 'jpeg':
+                                       return 'image/jpeg';
                        }
 
                        return 'unknown/unknown';
index a3970f3..6508bce 100644 (file)
  * which refers to it should be kept to a minimum.
  */
 class StubObject {
-       var $mGlobal, $mClass, $mParams;
+       /** @var null|string */
+       protected $global;
+
+       /** @var null|string */
+       protected $class;
+
+       /** @var array */
+       protected $params;
 
        /**
         * Constructor.
         *
-        * @param string $global name of the global variable.
-        * @param string $class name of the class of the real object.
-        * @param array $params parameters to pass to constructor of the real
-        *               object.
+        * @param string $global Name of the global variable.
+        * @param string $class Name of the class of the real object.
+        * @param array $params Parameters to pass to constructor of the real object.
         */
        function __construct( $global = null, $class = null, $params = array() ) {
-               $this->mGlobal = $global;
-               $this->mClass = $class;
-               $this->mParams = $params;
+               $this->global = $global;
+               $this->class = $class;
+               $this->params = $params;
        }
 
        /**
         * Returns a bool value whenever $obj is a stub object. Can be used to break
         * a infinite loop when unstubbing an object.
         *
-        * @param $obj Object to check.
-        * @return Boolean: true if $obj is not an instance of StubObject class.
+        * @param object $obj Object to check.
+        * @return bool True if $obj is not an instance of StubObject class.
         */
        static function isRealObject( $obj ) {
                return is_object( $obj ) && !$obj instanceof StubObject;
@@ -74,7 +80,7 @@ class StubObject {
         * infinite loop when unstubbing an object or to avoid reference parameter
         * breakage.
         *
-        * @param $obj Object to check.
+        * @param object $obj Object to check.
         * @return void
         */
        static function unstub( $obj ) {
@@ -90,13 +96,13 @@ class StubObject {
         * This function will also call the function with the same name in the real
         * object.
         *
-        * @param string $name name of the function called
-        * @param array $args arguments
+        * @param string $name Name of the function called
+        * @param array $args Arguments
         * @return mixed
         */
        function _call( $name, $args ) {
                $this->_unstub( $name, 5 );
-               return call_user_func_array( array( $GLOBALS[$this->mGlobal], $name ), $args );
+               return call_user_func_array( array( $GLOBALS[$this->global], $name ), $args );
        }
 
        /**
@@ -104,15 +110,15 @@ class StubObject {
         * @return object
         */
        function _newObject() {
-               return MWFunction::newObj( $this->mClass, $this->mParams );
+               return MWFunction::newObj( $this->class, $this->params );
        }
 
        /**
         * Function called by PHP if no function with that name exists in this
         * object.
         *
-        * @param string $name name of the function called
-        * @param array $args arguments
+        * @param string $name Name of the function called
+        * @param array $args Arguments
         * @return mixed
         */
        function __call( $name, $args ) {
@@ -125,28 +131,30 @@ class StubObject {
         * This is public, for the convenience of external callers wishing to access
         * properties, e.g. eval.php
         *
-        * @param string $name name of the method called in this object.
-        * @param $level Integer: level to go in the stack trace to get the function
-        *               who called this function.
+        * @param string $name Name of the method called in this object.
+        * @param int $level Level to go in the stack trace to get the function
+        *   who called this function.
         * @throws MWException
         */
        function _unstub( $name = '_unstub', $level = 2 ) {
                static $recursionLevel = 0;
 
-               if ( !$GLOBALS[$this->mGlobal] instanceof StubObject ) {
-                       return $GLOBALS[$this->mGlobal]; // already unstubbed.
+               if ( !$GLOBALS[$this->global] instanceof StubObject ) {
+                       return $GLOBALS[$this->global]; // already unstubbed.
                }
 
-               if ( get_class( $GLOBALS[$this->mGlobal] ) != $this->mClass ) {
-                       $fname = __METHOD__ . '-' . $this->mGlobal;
+               if ( get_class( $GLOBALS[$this->global] ) != $this->class ) {
+                       $fname = __METHOD__ . '-' . $this->global;
                        wfProfileIn( $fname );
                        $caller = wfGetCaller( $level );
                        if ( ++$recursionLevel > 2 ) {
                                wfProfileOut( $fname );
-                               throw new MWException( "Unstub loop detected on call of \${$this->mGlobal}->$name from $caller\n" );
+                               throw new MWException( "Unstub loop detected on call of "
+                                       . "\${$this->global}->$name from $caller\n" );
                        }
-                       wfDebug( "Unstubbing \${$this->mGlobal} on call of \${$this->mGlobal}::$name from $caller\n" );
-                       $GLOBALS[$this->mGlobal] = $this->_newObject();
+                       wfDebug( "Unstubbing \${$this->global} on call of "
+                               . "\${$this->global}::$name from $caller\n" );
+                       $GLOBALS[$this->global] = $this->_newObject();
                        --$recursionLevel;
                        wfProfileOut( $fname );
                }
index 4345a73..b9c0c35 100644 (file)
@@ -3,4 +3,5 @@
 /**
  * @since 1.20
  */
-class TimestampException extends MWException {}
+class TimestampException extends MWException {
+}
index 54a0839..d8f6b75 100644 (file)
@@ -56,38 +56,102 @@ class Title {
         */
        // @{
 
-       var $mTextform = '';              // /< Text form (spaces not underscores) of the main part
-       var $mUrlform = '';               // /< URL-encoded form of the main part
-       var $mDbkeyform = '';             // /< Main part with underscores
-       var $mUserCaseDBKey;              // /< DB key with the initial letter in the case specified by the user
-       var $mNamespace = NS_MAIN;        // /< Namespace index, i.e. one of the NS_xxxx constants
-       var $mInterwiki = '';             // /< Interwiki prefix
-       var $mFragment = '';              // /< Title fragment (i.e. the bit after the #)
-       var $mArticleID = -1;             // /< Article ID, fetched from the link cache on demand
-       var $mLatestID = false;           // /< ID of most recent revision
-       var $mContentModel = false;       // /< ID of the page's content model, i.e. one of the CONTENT_MODEL_XXX constants
-       private $mEstimateRevisions;      // /< Estimated number of revisions; null of not loaded
-       var $mRestrictions = array();     // /< Array of groups allowed to edit this article
-       var $mOldRestrictions = false;
-       var $mCascadeRestriction;         ///< Cascade restrictions on this page to included templates and images?
-       var $mCascadingRestrictions;      // Caching the results of getCascadeProtectionSources
-       var $mRestrictionsExpiry = array(); ///< When do the restrictions on this page expire?
-       var $mHasCascadingRestrictions;   ///< Are cascading restrictions in effect on this page?
-       var $mCascadeSources;             ///< Where are the cascading restrictions coming from on this page?
-       var $mRestrictionsLoaded = false; ///< Boolean for initialisation on demand
-       var $mPrefixedText = null;        ///< Text form including namespace/interwiki, initialised on demand
-       var $mTitleProtection;            ///< Cached value for getTitleProtection (create protection)
-       # Don't change the following default, NS_MAIN is hardcoded in several
-       # places.  See bug 696.
-       # Zero except in {{transclusion}} tags
-       var $mDefaultNamespace = NS_MAIN; // /< Namespace index when there is no namespace
-       var $mWatched = null;             // /< Is $wgUser watching this page? null if unfilled, accessed through userIsWatching()
-       var $mLength = -1;                // /< The page length, 0 for special pages
-       var $mRedirect = null;            // /< Is the article at this title a redirect?
-       var $mNotificationTimestamp = array(); // /< Associative array of user ID -> timestamp/false
-       var $mHasSubpage;                 // /< Whether a page has any subpages
-       private $mPageLanguage = false;   // /< The (string) language code of the page's language and content code.
-       private $mTitleValue = null;      // /< A corresponding TitleValue object
+       /** @var string Text form (spaces not underscores) of the main part */
+       public $mTextform = '';
+
+       /** @var string URL-encoded form of the main part */
+       public $mUrlform = '';
+
+       /** @var string Main part with underscores */
+       public $mDbkeyform = '';
+
+       /** @var string Database key with the initial letter in the case specified by the user */
+       protected $mUserCaseDBKey;
+
+       /** @var int Namespace index, i.e. one of the NS_xxxx constants */
+       public $mNamespace = NS_MAIN;
+
+       /** @var string Interwiki prefix */
+       public $mInterwiki = '';
+
+       /** @var string Title fragment (i.e. the bit after the #) */
+       public $mFragment = '';
+
+       /** @var int Article ID, fetched from the link cache on demand */
+       public $mArticleID = -1;
+
+       /** @var bool|int ID of most recent revision */
+       protected $mLatestID = false;
+
+       /**
+        * @var bool|string ID of the page's content model, i.e. one of the
+        *   CONTENT_MODEL_XXX constants
+        */
+       public $mContentModel = false;
+
+       /** @var int Estimated number of revisions; null of not loaded */
+       private $mEstimateRevisions;
+
+       /** @var array Array of groups allowed to edit this article */
+       public $mRestrictions = array();
+
+       /** @var bool  */
+       protected $mOldRestrictions = false;
+
+       /** @var bool Cascade restrictions on this page to included templates and images? */
+       public $mCascadeRestriction;
+
+       /** Caching the results of getCascadeProtectionSources */
+       public $mCascadingRestrictions;
+
+       /** @var array When do the restrictions on this page expire? */
+       protected $mRestrictionsExpiry = array();
+
+       /** @var bool Are cascading restrictions in effect on this page? */
+       protected $mHasCascadingRestrictions;
+
+       /** @var array Where are the cascading restrictions coming from on this page? */
+       public $mCascadeSources;
+
+       /** @var bool Boolean for initialisation on demand */
+       public $mRestrictionsLoaded = false;
+
+       /** @var string Text form including namespace/interwiki, initialised on demand */
+       protected $mPrefixedText = null;
+
+       /** @var mixed Cached value for getTitleProtection (create protection) */
+       public $mTitleProtection;
+
+       /**
+        * @var int Namespace index when there is no namespace. Don't change the
+        *   following default, NS_MAIN is hardcoded in several places. See bug 696.
+        *   Zero except in {{transclusion}} tags.
+        */
+       public $mDefaultNamespace = NS_MAIN;
+
+       /**
+        * @var bool Is $wgUser watching this page? null if unfilled, accessed
+        * through userIsWatching()
+        */
+       protected $mWatched = null;
+
+       /** @var int The page length, 0 for special pages */
+       protected $mLength = -1;
+
+       /** @var null Is the article at this title a redirect? */
+       public $mRedirect = null;
+
+       /** @var array Associative array of user ID -> timestamp/false */
+       private $mNotificationTimestamp = array();
+
+       /** @var bool Whether a page has any subpages */
+       private $mHasSubpages;
+
+       /** @var bool The (string) language code of the page's language and content code. */
+       private $mPageLanguage = false;
+
+       /** @var TitleValue A corresponding TitleValue object */
+       private $mTitleValue = null;
        // @}
 
        /**
@@ -115,7 +179,11 @@ class Title {
                }
 
                if ( !$titleCodec ) {
-                       $titleCodec = new MediaWikiTitleCodec( $wgContLang, GenderCache::singleton(), $wgLocalInterwikis );
+                       $titleCodec = new MediaWikiTitleCodec(
+                               $wgContLang,
+                               GenderCache::singleton(),
+                               $wgLocalInterwikis
+                       );
                        $titleCodecFingerprint = $fingerprint;
                }
 
@@ -136,18 +204,16 @@ class Title {
                return self::getTitleParser();
        }
 
-       /**
-        * Constructor
-        */
-       /*protected*/ function __construct() { }
+       function __construct() {
+       }
 
        /**
         * Create a new Title from a prefixed DB key
         *
-        * @param string $key the database key, which has underscores
+        * @param string $key The database key, which has underscores
         *      instead of spaces, possibly including namespace and
         *      interwiki prefixes
-        * @return Title, or NULL on an error
+        * @return Title|null Title, or null on an error
         */
        public static function newFromDBkey( $key ) {
                $t = new Title();
@@ -162,7 +228,7 @@ class Title {
        /**
         * Create a new Title from a TitleValue
         *
-        * @param TitleValue $titleValue, assumed to be safe.
+        * @param TitleValue $titleValue Assumed to be safe.
         *
         * @return Title
         */
@@ -177,14 +243,14 @@ class Title {
         * Create a new Title from text, such as what one would find in a link. De-
         * codes any HTML entities in the text.
         *
-        * @param string $text the link text; spaces, prefixes, and an
+        * @param string $text The link text; spaces, prefixes, and an
         *   initial ':' indicating the main namespace are accepted.
-        * @param int $defaultNamespace the namespace to use if none is specified
+        * @param int $defaultNamespace The namespace to use if none is specified
         *   by a prefix.  If you want to force a specific namespace even if
         *   $text might begin with a namespace prefix, use makeTitle() or
         *   makeTitleSafe().
         * @throws MWException
-        * @return Title|null Title or null on an error.
+        * @return Title|null Title or null on an error.
         */
        public static function newFromText( $text, $defaultNamespace = NS_MAIN ) {
                if ( is_object( $text ) ) {
@@ -218,8 +284,7 @@ class Title {
                        }
                        return $t;
                } else {
-                       $ret = null;
-                       return $ret;
+                       return null;
                }
        }
 
@@ -235,8 +300,8 @@ class Title {
         * Create a new Title from URL-encoded text. Ensures that
         * the given title's length does not exceed the maximum.
         *
-        * @param string $url the title, as might be taken from a URL
-        * @return Title the new object, or NULL on an error
+        * @param string $url The title, as might be taken from a URL
+        * @return Title|null The new object, or null on an error
         */
        public static function newFromURL( $url ) {
                $t = new Title();
@@ -267,8 +332,9 @@ class Title {
        }
 
        /**
-        * Returns a list of fields that are to be selected for initializing Title objects or LinkCache entries.
-        * Uses $wgContentHandlerUseDB to determine whether to include page_content_model.
+        * Returns a list of fields that are to be selected for initializing Title
+        * objects or LinkCache entries. Uses $wgContentHandlerUseDB to determine
+        * whether to include page_content_model.
         *
         * @return array
         */
@@ -290,9 +356,9 @@ class Title {
        /**
         * Create a new Title from an article ID
         *
-        * @param int $id the page_id corresponding to the Title to create
-        * @param int $flags use Title::GAID_FOR_UPDATE to use master
-        * @return Title|null the new object, or NULL on an error
+        * @param int $id The page_id corresponding to the Title to create
+        * @param int $flags Use Title::GAID_FOR_UPDATE to use master
+        * @return Title|null The new object, or null on an error
         */
        public static function newFromID( $id, $flags = 0 ) {
                $db = ( $flags & self::GAID_FOR_UPDATE ) ? wfGetDB( DB_MASTER ) : wfGetDB( DB_SLAVE );
@@ -313,8 +379,8 @@ class Title {
        /**
         * Make an array of titles from an array of IDs
         *
-        * @param array $ids of Int Array of IDs
-        * @return Array of Titles
+        * @param int[] $ids Array of IDs
+        * @return Title[] Array of Titles
         */
        public static function newFromIDs( $ids ) {
                if ( !count( $ids ) ) {
@@ -340,7 +406,7 @@ class Title {
         * Make a Title object from a DB row
         *
         * @param stdClass $row Object database row (needs at least page_title,page_namespace)
-        * @return Title corresponding Title
+        * @return Title Corresponding Title
         */
        public static function newFromRow( $row ) {
                $t = self::makeTitle( $row->page_namespace, $row->page_title );
@@ -352,7 +418,7 @@ class Title {
         * Load Title object fields from a DB row.
         * If false is given, the title will be treated as non-existing.
         *
-        * @param $row stdClass|bool database row
+        * @param stdClass|bool $row Database row
         */
        public function loadFromRow( $row ) {
                if ( $row ) { // page found
@@ -389,11 +455,11 @@ class Title {
         * For convenience, spaces are converted to underscores so that
         * eg user_text fields can be used directly.
         *
-        * @param int $ns the namespace of the article
-        * @param string $title the unprefixed database key form
-        * @param string $fragment the link fragment (after the "#")
-        * @param string $interwiki the interwiki prefix
-        * @return Title the new object
+        * @param int $ns The namespace of the article
+        * @param string $title The unprefixed database key form
+        * @param string $fragment The link fragment (after the "#")
+        * @param string $interwiki The interwiki prefix
+        * @return Title The new object
         */
        public static function &makeTitle( $ns, $title, $fragment = '', $interwiki = '' ) {
                $t = new Title();
@@ -413,11 +479,11 @@ class Title {
         * The parameters will be checked for validity, which is a bit slower
         * than makeTitle() but safer for user-provided data.
         *
-        * @param int $ns the namespace of the article
-        * @param string $title database key form
-        * @param string $fragment the link fragment (after the "#")
-        * @param string $interwiki interwiki prefix
-        * @return Title the new object, or NULL on an error
+        * @param int $ns The namespace of the article
+        * @param string $title Database key form
+        * @param string $fragment The link fragment (after the "#")
+        * @param string $interwiki Interwiki prefix
+        * @return Title The new object, or null on an error
         */
        public static function makeTitleSafe( $ns, $title, $fragment = '', $interwiki = '' ) {
                if ( !MWNamespace::exists( $ns ) ) {
@@ -436,7 +502,7 @@ class Title {
        /**
         * Create a new Title for the Main Page
         *
-        * @return Title the new object
+        * @return Title The new object
         */
        public static function newMainPage() {
                $title = Title::newFromText( wfMessage( 'mainpage' )->inContentLanguage()->text() );
@@ -454,7 +520,7 @@ class Title {
         * the redirect table and other checks that don't need full recursion
         *
         * @param string $text Text with possible redirect
-        * @return Title: The corresponding Title
+        * @return Title The corresponding Title
         * @deprecated since 1.21, use Content::getRedirectTarget instead.
         */
        public static function newFromRedirect( $text ) {
@@ -488,7 +554,7 @@ class Title {
         * have been resolved (up to $wgMaxRedirects times)
         *
         * @param string $text Text with possible redirect
-        * @return Array of Titles, with the destination last
+        * @return Title[] Array of Titles, with the destination last
         * @deprecated since 1.21, use Content::getRedirectChain instead.
         */
        public static function newFromRedirectArray( $text ) {
@@ -501,8 +567,8 @@ class Title {
        /**
         * Get the prefixed DB key associated with an ID
         *
-        * @param int $id the page_id of the article
-        * @return Title an object representing the article, or NULL if no such article was found
+        * @param int $id The page_id of the article
+        * @return Title|null An object representing the article, or null if no such article was found
         */
        public static function nameOf( $id ) {
                $dbr = wfGetDB( DB_SLAVE );
@@ -524,7 +590,7 @@ class Title {
        /**
         * Get a regex character class describing the legal characters in a link
         *
-        * @return String the list of characters, not delimited
+        * @return string The list of characters, not delimited
         */
        public static function legalChars() {
                global $wgLegalTitleChars;
@@ -538,7 +604,7 @@ class Title {
         *
         * @todo: move this into MediaWikiTitleCodec
         *
-        * @return String regex string
+        * @return string Regex string
         */
        static function getTitleInvalidRegex() {
                static $rxTc = false;
@@ -665,11 +731,11 @@ class Title {
        /**
         * Make a prefixed DB key from a DB key and a namespace index
         *
-        * @param int $ns numerical representation of the namespace
-        * @param string $title the DB key form the title
+        * @param int $ns Numerical representation of the namespace
+        * @param string $title The DB key form the title
         * @param string $fragment The link fragment (after the "#")
         * @param string $interwiki The interwiki prefix
-        * @return String the prefixed form of the title
+        * @return string The prefixed form of the title
         */
        public static function makeName( $ns, $title, $fragment = '', $interwiki = '' ) {
                global $wgContLang;
@@ -688,8 +754,8 @@ class Title {
        /**
         * Escape a text fragment, say from a link, for a URL
         *
-        * @param string $fragment containing a URL or link fragment (after the "#")
-        * @return String: escaped string
+        * @param string $fragment Containing a URL or link fragment (after the "#")
+        * @return string Escaped string
         */
        static function escapeFragmentForURL( $fragment ) {
                # Note that we don't urlencode the fragment.  urlencoded Unicode
@@ -702,10 +768,10 @@ class Title {
        /**
         * Callback for usort() to do title sorts by (namespace, title)
         *
-        * @param $a Title
-        * @param $b Title
+        * @param Title $a
+        * @param Title $b
         *
-        * @return Integer: result of string comparison, or namespace comparison
+        * @return int Result of string comparison, or namespace comparison
         */
        public static function compare( $a, $b ) {
                if ( $a->getNamespace() == $b->getNamespace() ) {
@@ -719,7 +785,7 @@ class Title {
         * Determine whether the object refers to a page within
         * this project.
         *
-        * @return Bool TRUE if this is an in-project interwiki link or a wikilink, FALSE otherwise
+        * @return bool True if this is an in-project interwiki link or a wikilink, false otherwise
         */
        public function isLocal() {
                if ( $this->isExternal() ) {
@@ -734,7 +800,7 @@ class Title {
        /**
         * Is this Title interwiki?
         *
-        * @return Bool
+        * @return bool
         */
        public function isExternal() {
                return $this->mInterwiki !== '';
@@ -745,7 +811,7 @@ class Title {
         *
         * Use Title::isExternal to check if a interwiki is set
         *
-        * @return String Interwiki prefix
+        * @return string Interwiki prefix
         */
        public function getInterwiki() {
                return $this->mInterwiki;
@@ -755,7 +821,7 @@ class Title {
         * Determine whether the object refers to a page within
         * this project and is transcludable.
         *
-        * @return Bool TRUE if this is transcludable
+        * @return bool True if this is transcludable
         */
        public function isTrans() {
                if ( !$this->isExternal() ) {
@@ -768,7 +834,7 @@ class Title {
        /**
         * Returns the DB name of the distant wiki which owns the object.
         *
-        * @return String the DB name
+        * @return string The DB name
         */
        public function getTransWikiID() {
                if ( !$this->isExternal() ) {
@@ -806,7 +872,7 @@ class Title {
        /**
         * Get the text form (spaces not underscores) of the main part
         *
-        * @return String Main part of the title
+        * @return string Main part of the title
         */
        public function getText() {
                return $this->mTextform;
@@ -815,7 +881,7 @@ class Title {
        /**
         * Get the URL-encoded form of the main part
         *
-        * @return String Main part of the title, URL-encoded
+        * @return string Main part of the title, URL-encoded
         */
        public function getPartialURL() {
                return $this->mUrlform;
@@ -824,7 +890,7 @@ class Title {
        /**
         * Get the main part with underscores
         *
-        * @return String: Main part of the title, with underscores
+        * @return string Main part of the title, with underscores
         */
        public function getDBkey() {
                return $this->mDbkeyform;
@@ -833,7 +899,7 @@ class Title {
        /**
         * Get the DB key with the initial letter case as specified by the user
         *
-        * @return String DB key
+        * @return string DB key
         */
        function getUserCaseDBKey() {
                if ( !is_null( $this->mUserCaseDBKey ) ) {
@@ -847,7 +913,7 @@ class Title {
        /**
         * Get the namespace index, i.e. one of the NS_xxxx constants.
         *
-        * @return Integer: Namespace index
+        * @return int Namespace index
         */
        public function getNamespace() {
                return $this->mNamespace;
@@ -857,7 +923,7 @@ class Title {
         * Get the page's content model id, see the CONTENT_MODEL_XXX constants.
         *
         * @throws MWException
-        * @return String: Content model id
+        * @return string Content model id
         */
        public function getContentModel() {
                if ( !$this->mContentModel ) {
@@ -880,7 +946,7 @@ class Title {
         * Convenience method for checking a title's content model name
         *
         * @param string $id The content model ID (use the CONTENT_MODEL_XXX constants).
-        * @return Boolean true if $this->getContentModel() == $id
+        * @return bool True if $this->getContentModel() == $id
         */
        public function hasContentModel( $id ) {
                return $this->getContentModel() == $id;
@@ -889,7 +955,7 @@ class Title {
        /**
         * Get the namespace text
         *
-        * @return String: Namespace text
+        * @return string Namespace text
         */
        public function getNsText() {
                if ( $this->isExternal() ) {
@@ -916,7 +982,7 @@ class Title {
        /**
         * Get the namespace text of the subject (rather than talk) page
         *
-        * @return String Namespace text
+        * @return string Namespace text
         */
        public function getSubjectNsText() {
                global $wgContLang;
@@ -926,7 +992,7 @@ class Title {
        /**
         * Get the namespace text of the talk page
         *
-        * @return String Namespace text
+        * @return string Namespace text
         */
        public function getTalkNsText() {
                global $wgContLang;
@@ -936,7 +1002,7 @@ class Title {
        /**
         * Could this title have a corresponding talk page?
         *
-        * @return Bool TRUE or FALSE
+        * @return bool
         */
        public function canTalk() {
                return MWNamespace::canTalk( $this->mNamespace );
@@ -945,7 +1011,7 @@ class Title {
        /**
         * Is this in a namespace that allows actual pages?
         *
-        * @return Bool
+        * @return bool
         * @internal note -- uses hardcoded namespace index instead of constants
         */
        public function canExist() {
@@ -955,7 +1021,7 @@ class Title {
        /**
         * Can this title be added to a user's watchlist?
         *
-        * @return Bool TRUE or FALSE
+        * @return bool
         */
        public function isWatchable() {
                return !$this->isExternal() && MWNamespace::isWatchable( $this->getNamespace() );
@@ -964,7 +1030,7 @@ class Title {
        /**
         * Returns true if this is a special page.
         *
-        * @return boolean
+        * @return bool
         */
        public function isSpecialPage() {
                return $this->getNamespace() == NS_SPECIAL;
@@ -974,7 +1040,7 @@ class Title {
         * Returns true if this title resolves to the named special page
         *
         * @param string $name The special page name
-        * @return boolean
+        * @return bool
         */
        public function isSpecial( $name ) {
                if ( $this->isSpecialPage() ) {
@@ -1051,7 +1117,7 @@ class Title {
         * This is MUCH simpler than individually testing for equivalence
         * against both NS_USER and NS_USER_TALK, and is also forward compatible.
         * @since 1.19
-        * @param $ns int
+        * @param int $ns
         * @return bool
         */
        public function hasSubjectNamespace( $ns ) {
@@ -1063,7 +1129,7 @@ class Title {
         * In other words, is this a content page, for the purposes of calculating
         * statistics, etc?
         *
-        * @return Boolean
+        * @return bool
         */
        public function isContentPage() {
                return MWNamespace::isContent( $this->getNamespace() );
@@ -1073,7 +1139,7 @@ class Title {
         * Would anybody with sufficient privileges be able to move this page?
         * Some pages just aren't movable.
         *
-        * @return Bool TRUE or FALSE
+        * @return bool
         */
        public function isMovable() {
                if ( !MWNamespace::isMovable( $this->getNamespace() ) || $this->isExternal() ) {
@@ -1094,7 +1160,7 @@ class Title {
         * ends up reporting something differently than $title->isMainPage();
         *
         * @since 1.18
-        * @return Bool
+        * @return bool
         */
        public function isMainPage() {
                return $this->equals( Title::newMainPage() );
@@ -1103,7 +1169,7 @@ class Title {
        /**
         * Is this a subpage?
         *
-        * @return Bool
+        * @return bool
         */
        public function isSubpage() {
                return MWNamespace::hasSubpages( $this->mNamespace )
@@ -1114,7 +1180,7 @@ class Title {
        /**
         * Is this a conversion table for the LanguageConverter?
         *
-        * @return Bool
+        * @return bool
         */
        public function isConversionTable() {
                // @todo ConversionTable should become a separate content model.
@@ -1126,7 +1192,7 @@ class Title {
        /**
         * Does that page contain wikitext, or it is JS, CSS or whatever?
         *
-        * @return Bool
+        * @return bool
         */
        public function isWikitextPage() {
                return $this->hasContentModel( CONTENT_MODEL_WIKITEXT );
@@ -1137,19 +1203,22 @@ class Title {
         * This is generally true for pages in the MediaWiki namespace having CONTENT_MODEL_CSS
         * or CONTENT_MODEL_JAVASCRIPT.
         *
-        * This method does *not* return true for per-user JS/CSS. Use isCssJsSubpage() for that!
+        * This method does *not* return true for per-user JS/CSS. Use isCssJsSubpage()
+        * for that!
         *
-        * Note that this method should not return true for pages that contain and show "inactive" CSS or JS.
+        * Note that this method should not return true for pages that contain and
+        * show "inactive" CSS or JS.
         *
-        * @return Bool
+        * @return bool
         */
        public function isCssOrJsPage() {
                $isCssOrJsPage = NS_MEDIAWIKI == $this->mNamespace
                        && ( $this->hasContentModel( CONTENT_MODEL_CSS )
                                || $this->hasContentModel( CONTENT_MODEL_JAVASCRIPT ) );
 
-               #NOTE: this hook is also called in ContentHandler::getDefaultModel. It's called here again to make sure
-               #      hook functions can force this method to return true even outside the mediawiki namespace.
+               # @note This hook is also called in ContentHandler::getDefaultModel.
+               #   It's called here again to make sure hook functions can force this
+               #   method to return true even outside the mediawiki namespace.
 
                wfRunHooks( 'TitleIsCssOrJsPage', array( $this, &$isCssOrJsPage ) );
 
@@ -1158,7 +1227,7 @@ class Title {
 
        /**
         * Is this a .css or .js subpage of a user page?
-        * @return Bool
+        * @return bool
         */
        public function isCssJsSubpage() {
                return ( NS_USER == $this->mNamespace && $this->isSubpage()
@@ -1169,7 +1238,7 @@ class Title {
        /**
         * Trim down a .css or .js subpage title to get the corresponding skin name
         *
-        * @return string containing skin name from .css or .js subpage title
+        * @return string Containing skin name from .css or .js subpage title
         */
        public function getSkinFromCssJsSubpage() {
                $subpage = explode( '/', $this->mTextform );
@@ -1184,7 +1253,7 @@ class Title {
        /**
         * Is this a .css subpage of a user page?
         *
-        * @return Bool
+        * @return bool
         */
        public function isCssSubpage() {
                return ( NS_USER == $this->mNamespace && $this->isSubpage()
@@ -1194,7 +1263,7 @@ class Title {
        /**
         * Is this a .js subpage of a user page?
         *
-        * @return Bool
+        * @return bool
         */
        public function isJsSubpage() {
                return ( NS_USER == $this->mNamespace && $this->isSubpage()
@@ -1204,7 +1273,7 @@ class Title {
        /**
         * Is this a talk page of some sort?
         *
-        * @return Bool
+        * @return bool
         */
        public function isTalkPage() {
                return MWNamespace::isTalk( $this->getNamespace() );
@@ -1213,7 +1282,7 @@ class Title {
        /**
         * Get a Title object associated with the talk page of this article
         *
-        * @return Title the object for the talk page
+        * @return Title The object for the talk page
         */
        public function getTalkPage() {
                return Title::makeTitle( MWNamespace::getTalk( $this->getNamespace() ), $this->getDBkey() );
@@ -1223,7 +1292,7 @@ class Title {
         * Get a title object associated with the subject page of this
         * talk page
         *
-        * @return Title the object for the subject page
+        * @return Title The object for the subject page
         */
        public function getSubjectPage() {
                // Is this the same title?
@@ -1237,7 +1306,7 @@ class Title {
        /**
         * Get the default namespace index, for when there is no namespace
         *
-        * @return Int Default namespace index
+        * @return int Default namespace index
         */
        public function getDefaultNamespace() {
                return $this->mDefaultNamespace;
@@ -1248,7 +1317,7 @@ class Title {
         *
         * Use Title::hasFragment to check for a fragment
         *
-        * @return String Title fragment
+        * @return string Title fragment
         */
        public function getFragment() {
                return $this->mFragment;
@@ -1266,7 +1335,7 @@ class Title {
 
        /**
         * Get the fragment in URL form, including the "#" character if there is one
-        * @return String Fragment in URL form
+        * @return string Fragment in URL form
         */
        public function getFragmentForURL() {
                if ( !$this->hasFragment() ) {
@@ -1284,7 +1353,7 @@ class Title {
         * Deprecated for public use, use Title::makeTitle() with fragment parameter.
         * Still in active use privately.
         *
-        * @param string $fragment text
+        * @param string $fragment Text
         */
        public function setFragment( $fragment ) {
                $this->mFragment = str_replace( '_', ' ', substr( $fragment, 1 ) );
@@ -1294,8 +1363,8 @@ class Title {
         * Prefix some arbitrary text with the namespace or interwiki prefix
         * of this object
         *
-        * @param string $name the text
-        * @return String the prefixed text
+        * @param string $name The text
+        * @return string The prefixed text
         * @private
         */
        private function prefix( $name ) {
@@ -1313,7 +1382,7 @@ class Title {
        /**
         * Get the prefixed database key form
         *
-        * @return String the prefixed title, with underscores and
+        * @return string The prefixed title, with underscores and
         *  any interwiki and namespace prefixes
         */
        public function getPrefixedDBkey() {
@@ -1326,7 +1395,7 @@ class Title {
         * Get the prefixed title with spaces.
         * This is the form usually used for display
         *
-        * @return String the prefixed title, with spaces
+        * @return string The prefixed title, with spaces
         */
        public function getPrefixedText() {
                if ( $this->mPrefixedText === null ) {
@@ -1340,7 +1409,7 @@ class Title {
        /**
         * Return a string representation of this title
         *
-        * @return String representation of this title
+        * @return string Representation of this title
         */
        public function __toString() {
                return $this->getPrefixedText();
@@ -1350,7 +1419,7 @@ class Title {
         * Get the prefixed title with spaces, plus any fragment
         * (part beginning with '#')
         *
-        * @return String the prefixed title, with spaces and the fragment, including '#'
+        * @return string The prefixed title, with spaces and the fragment, including '#'
         */
        public function getFullText() {
                $text = $this->getPrefixedText();
@@ -1369,7 +1438,7 @@ class Title {
         * # returns: 'Foo'
         * @endcode
         *
-        * @return String Root name
+        * @return string Root name
         * @since 1.20
         */
        public function getRootText() {
@@ -1405,7 +1474,7 @@ class Title {
         * # returns: 'Foo/Bar'
         * @endcode
         *
-        * @return String Base name
+        * @return string Base name
         */
        public function getBaseText() {
                if ( !MWNamespace::hasSubpages( $this->mNamespace ) ) {
@@ -1445,7 +1514,7 @@ class Title {
         * # returns: "Baz"
         * @endcode
         *
-        * @return String Subpage name
+        * @return string Subpage name
         */
        public function getSubpageText() {
                if ( !MWNamespace::hasSubpages( $this->mNamespace ) ) {
@@ -1476,7 +1545,7 @@ class Title {
         * Get the HTML-escaped displayable text form.
         * Used for the title field in <a> tags.
         *
-        * @return String the text, including any prefixes
+        * @return string The text, including any prefixes
         * @deprecated since 1.19
         */
        public function getEscapedText() {
@@ -1487,7 +1556,7 @@ class Title {
        /**
         * Get a URL-encoded form of the subpage text
         *
-        * @return String URL-encoded subpage name
+        * @return string URL-encoded subpage name
         */
        public function getSubpageUrlForm() {
                $text = $this->getSubpageText();
@@ -1498,7 +1567,7 @@ class Title {
        /**
         * Get a URL-encoded title (not an actual URL) including interwiki
         *
-        * @return String the URL-encoded form
+        * @return string The URL-encoded form
         */
        public function getPrefixedURL() {
                $s = $this->prefix( $this->mDbkeyform );
@@ -1515,9 +1584,9 @@ class Title {
         * and the wfArrayToCgi moved to getLocalURL();
         *
         * @since 1.19 (r105919)
-        * @param $query
-        * @param $query2 bool
-        * @return String
+        * @param array|string $query
+        * @param bool $query2
+        * @return string
         */
        private static function fixUrlQueryArgs( $query, $query2 = false ) {
                if ( $query2 !== false ) {
@@ -1552,10 +1621,10 @@ class Title {
         *
         * @see self::getLocalURL for the arguments.
         * @see wfExpandUrl
-        * @param $query
-        * @param $query2 bool
-        * @param $proto Protocol type to use in URL
-        * @return String the URL
+        * @param array|string $query
+        * @param bool $query2
+        * @param string $proto Protocol type to use in URL
+        * @return string The URL
         */
        public function getFullURL( $query = '', $query2 = false, $proto = PROTO_RELATIVE ) {
                $query = self::fixUrlQueryArgs( $query, $query2 );
@@ -1587,14 +1656,14 @@ class Title {
         *   not used for interwiki links. Can be specified as an associative array as well,
         *   e.g., array( 'action' => 'edit' ) (keys and values will be URL-escaped).
         *   Some query patterns will trigger various shorturl path replacements.
-        * @param $query2 Mixed: An optional secondary query array. This one MUST
+        * @param array $query2 An optional secondary query array. This one MUST
         *   be an array. If a string is passed it will be interpreted as a deprecated
         *   variant argument and urlencoded into a variant= argument.
         *   This second query argument will be added to the $query
         *   The second parameter is deprecated since 1.19. Pass it as a key,value
         *   pair in the first parameter array instead.
         *
-        * @return String of the URL.
+        * @return string String of the URL.
         */
        public function getLocalURL( $query = '', $query2 = false ) {
                global $wgArticlePath, $wgScript, $wgServer, $wgRequest;
@@ -1682,11 +1751,11 @@ class Title {
         * The result obviously should not be URL-escaped, but does need to be
         * HTML-escaped if it's being output in HTML.
         *
-        * @param $query
-        * @param $query2 bool
-        * @param $proto Protocol to use; setting this will cause a full URL to be used
+        * @param array $query
+        * @param bool $query2
+        * @param string $proto Protocol to use; setting this will cause a full URL to be used
         * @see self::getLocalURL for the arguments.
-        * @return String the URL
+        * @return string The URL
         */
        public function getLinkURL( $query = '', $query2 = false, $proto = PROTO_RELATIVE ) {
                wfProfileIn( __METHOD__ );
@@ -1706,9 +1775,9 @@ class Title {
         * using in a link, without a server name or fragment
         *
         * @see self::getLocalURL for the arguments.
-        * @param $query string
-        * @param $query2 bool|string
-        * @return String the URL
+        * @param string $query
+        * @param bool|string $query2
+        * @return string The URL
         * @deprecated since 1.19
         */
        public function escapeLocalURL( $query = '', $query2 = false ) {
@@ -1721,7 +1790,7 @@ class Title {
         * using in a link, including the server name and fragment
         *
         * @see self::getLocalURL for the arguments.
-        * @return String the URL
+        * @return string The URL
         * @deprecated since 1.19
         */
        public function escapeFullURL( $query = '', $query2 = false ) {
@@ -1739,7 +1808,7 @@ class Title {
         * protocol-relative, the URL will be expanded to http://
         *
         * @see self::getLocalURL for the arguments.
-        * @return String the URL
+        * @return string The URL
         */
        public function getInternalURL( $query = '', $query2 = false ) {
                global $wgInternalServer, $wgServer;
@@ -1784,8 +1853,7 @@ class Title {
        /**
         * Get the edit URL for this Title
         *
-        * @return String the URL, or a null string if this is an
-        *  interwiki link
+        * @return string The URL, or a null string if this is an interwiki link
         */
        public function getEditURL() {
                if ( $this->isExternal() ) {
@@ -1800,7 +1868,7 @@ class Title {
         * Is $wgUser watching this page?
         *
         * @deprecated since 1.20; use User::isWatched() instead.
-        * @return Bool
+        * @return bool
         */
        public function userIsWatching() {
                global $wgUser;
@@ -1819,7 +1887,7 @@ class Title {
         * Can $wgUser read this page?
         *
         * @deprecated since 1.19; use userCan(), quickUserCan() or getUserPermissionsErrors() instead
-        * @return Bool
+        * @return bool
         */
        public function userCanRead() {
                wfDeprecated( __METHOD__, '1.19' );
@@ -1836,10 +1904,9 @@ class Title {
         *
         * May provide false positives, but should never provide a false negative.
         *
-        * @param string $action action that permission needs to be checked for
-        * @param $user User to check (since 1.19); $wgUser will be used if not
-        *              provided.
-        * @return Bool
+        * @param string $action Action that permission needs to be checked for
+        * @param User $user User to check (since 1.19); $wgUser will be used if not provided.
+        * @return bool
         */
        public function quickUserCan( $action, $user = null ) {
                return $this->userCan( $action, $user, false );
@@ -1848,19 +1915,21 @@ class Title {
        /**
         * Can $user perform $action on this page?
         *
-        * @param string $action action that permission needs to be checked for
-        * @param $user User to check (since 1.19); $wgUser will be used if not
+        * @param string $action Action that permission needs to be checked for
+        * @param User $user User to check (since 1.19); $wgUser will be used if not
         *   provided.
         * @param bool $doExpensiveQueries Set this to false to avoid doing
         *   unnecessary queries.
-        * @return Bool
+        * @return bool
         */
        public function userCan( $action, $user = null, $doExpensiveQueries = true ) {
                if ( !$user instanceof User ) {
                        global $wgUser;
                        $user = $wgUser;
                }
-               return !count( $this->getUserPermissionsErrorsInternal( $action, $user, $doExpensiveQueries, true ) );
+
+               return !count( $this->getUserPermissionsErrorsInternal(
+                       $action, $user, $doExpensiveQueries, true ) );
        }
 
        /**
@@ -1869,14 +1938,16 @@ class Title {
         * @todo FIXME: This *does not* check throttles (User::pingLimiter()).
         *
         * @param string $action action that permission needs to be checked for
-        * @param $user User to check
+        * @param User $user User to check
         * @param bool $doExpensiveQueries Set this to false to avoid doing unnecessary
         *   queries by skipping checks for cascading protections and user blocks.
         * @param array $ignoreErrors of Strings Set this to a list of message keys
         *   whose corresponding errors may be ignored.
-        * @return Array of arguments to wfMessage to explain permissions problems.
+        * @return array Array of arguments to wfMessage to explain permissions problems.
         */
-       public function getUserPermissionsErrors( $action, $user, $doExpensiveQueries = true, $ignoreErrors = array() ) {
+       public function getUserPermissionsErrors( $action, $user, $doExpensiveQueries = true,
+               $ignoreErrors = array()
+       ) {
                $errors = $this->getUserPermissionsErrorsInternal( $action, $user, $doExpensiveQueries );
 
                // Remove the errors being ignored.
@@ -1895,15 +1966,19 @@ class Title {
         * Permissions checks that fail most often, and which are easiest to test.
         *
         * @param string $action the action to check
-        * @param $user User user to check
-        * @param array $errors list of current errors
-        * @param $doExpensiveQueries Boolean whether or not to perform expensive queries
-        * @param $short Boolean short circuit on first error
+        * @param User $user User to check
+        * @param array $errors List of current errors
+        * @param bool $doExpensiveQueries Whether or not to perform expensive queries
+        * @param bool $short Short circuit on first error
         *
-        * @return Array list of errors
+        * @return array List of errors
         */
-       private function checkQuickPermissions( $action, $user, $errors, $doExpensiveQueries, $short ) {
-               if ( !wfRunHooks( 'TitleQuickPermissions', array( $this, $user, $action, &$errors, $doExpensiveQueries, $short ) ) ) {
+       private function checkQuickPermissions( $action, $user, $errors,
+               $doExpensiveQueries, $short
+       ) {
+               if ( !wfRunHooks( 'TitleQuickPermissions',
+                       array( $this, $user, $action, &$errors, $doExpensiveQueries, $short ) )
+               ) {
                        return $errors;
                }
 
@@ -1926,6 +2001,11 @@ class Title {
                                $errors[] = array( 'movenotallowedfile' );
                        }
 
+                       // Check if user is allowed to move category pages if it's a category page
+                       if ( $this->mNamespace == NS_CATEGORY && !$user->isAllowed( 'move-categorypages' ) ) {
+                               $errors[] = array( 'cant-move-category-page' );
+                       }
+
                        if ( !$user->isAllowed( 'move' ) ) {
                                // User can't move anything
                                $userCanMove = User::groupHasPermission( 'user', 'move' );
@@ -1945,6 +2025,10 @@ class Title {
                                        && $this->mNamespace == NS_USER && !$this->isSubpage() ) {
                                // Show user page-specific message only if the user can move other pages
                                $errors[] = array( 'cant-move-to-user-page' );
+                       } elseif ( !$user->isAllowed( 'move-categorypages' )
+                                       && $this->mNamespace == NS_CATEGORY ) {
+                               // Show category page-specific message only if the user can move other pages
+                               $errors[] = array( 'cant-move-to-category-page' );
                        }
                } elseif ( !$user->isAllowed( $action ) ) {
                        $errors[] = $this->missingPermissionError( $action, $short );
@@ -1956,10 +2040,10 @@ class Title {
        /**
         * Add the resulting error code to the errors array
         *
-        * @param array $errors list of current errors
-        * @param $result Mixed result of errors
+        * @param array $errors List of current errors
+        * @param array $result Result of errors
         *
-        * @return Array list of errors
+        * @return array List of errors
         */
        private function resultToError( $errors, $result ) {
                if ( is_array( $result ) && count( $result ) && !is_array( $result[0] ) ) {
@@ -1981,13 +2065,13 @@ class Title {
        /**
         * Check various permission hooks
         *
-        * @param string $action the action to check
-        * @param $user User user to check
-        * @param array $errors list of current errors
-        * @param $doExpensiveQueries Boolean whether or not to perform expensive queries
-        * @param $short Boolean short circuit on first error
+        * @param string $action The action to check
+        * @param User $user User to check
+        * @param array $errors List of current errors
+        * @param bool $doExpensiveQueries Whether or not to perform expensive queries
+        * @param bool $short Short circuit on first error
         *
-        * @return Array list of errors
+        * @return array List of errors
         */
        private function checkPermissionHooks( $action, $user, $errors, $doExpensiveQueries, $short ) {
                // Use getUserPermissionsErrors instead
@@ -2014,15 +2098,17 @@ class Title {
        /**
         * Check permissions on special pages & namespaces
         *
-        * @param string $action the action to check
-        * @param $user User user to check
-        * @param array $errors list of current errors
-        * @param $doExpensiveQueries Boolean whether or not to perform expensive queries
-        * @param $short Boolean short circuit on first error
+        * @param string $action The action to check
+        * @param User $user User to check
+        * @param array $errors List of current errors
+        * @param bool $doExpensiveQueries Whether or not to perform expensive queries
+        * @param bool $short Short circuit on first error
         *
-        * @return Array list of errors
+        * @return array List of errors
         */
-       private function checkSpecialsAndNSPermissions( $action, $user, $errors, $doExpensiveQueries, $short ) {
+       private function checkSpecialsAndNSPermissions( $action, $user, $errors,
+               $doExpensiveQueries, $short
+       ) {
                # Only 'createaccount' can be performed on special pages,
                # which don't actually exist in the DB.
                if ( NS_SPECIAL == $this->mNamespace && $action !== 'createaccount' ) {
@@ -2043,13 +2129,13 @@ class Title {
        /**
         * Check CSS/JS sub-page permissions
         *
-        * @param string $action the action to check
-        * @param $user User user to check
-        * @param array $errors list of current errors
-        * @param $doExpensiveQueries Boolean whether or not to perform expensive queries
-        * @param $short Boolean short circuit on first error
+        * @param string $action The action to check
+        * @param User $user User to check
+        * @param array $errors List of current errors
+        * @param bool $doExpensiveQueries Whether or not to perform expensive queries
+        * @param bool $short Short circuit on first error
         *
-        * @return Array list of errors
+        * @return array List of errors
         */
        private function checkCSSandJSPermissions( $action, $user, $errors, $doExpensiveQueries, $short ) {
                # Protect css/js subpages of user pages
@@ -2079,13 +2165,13 @@ class Title {
         * page. The user must possess all required rights for this
         * action.
         *
-        * @param string $action the action to check
-        * @param $user User user to check
-        * @param array $errors list of current errors
-        * @param $doExpensiveQueries Boolean whether or not to perform expensive queries
-        * @param $short Boolean short circuit on first error
+        * @param string $action The action to check
+        * @param User $user User to check
+        * @param array $errors List of current errors
+        * @param bool $doExpensiveQueries Whether or not to perform expensive queries
+        * @param bool $short Short circuit on first error
         *
-        * @return Array list of errors
+        * @return array List of errors
         */
        private function checkPageRestrictions( $action, $user, $errors, $doExpensiveQueries, $short ) {
                foreach ( $this->getRestrictions( $action ) as $right ) {
@@ -2113,15 +2199,17 @@ class Title {
        /**
         * Check restrictions on cascading pages.
         *
-        * @param string $action the action to check
-        * @param $user User to check
-        * @param array $errors list of current errors
-        * @param $doExpensiveQueries Boolean whether or not to perform expensive queries
-        * @param $short Boolean short circuit on first error
+        * @param string $action The action to check
+        * @param User $user User to check
+        * @param array $errors List of current errors
+        * @param bool $doExpensiveQueries Whether or not to perform expensive queries
+        * @param bool $short Short circuit on first error
         *
-        * @return Array list of errors
+        * @return array List of errors
         */
-       private function checkCascadingSourcesRestrictions( $action, $user, $errors, $doExpensiveQueries, $short ) {
+       private function checkCascadingSourcesRestrictions( $action, $user, $errors,
+               $doExpensiveQueries, $short
+       ) {
                if ( $doExpensiveQueries && !$this->isCssJsSubpage() ) {
                        # We /could/ use the protection level on the source page, but it's
                        # fairly ugly as we have to establish a precedence hierarchy for pages
@@ -2160,19 +2248,23 @@ class Title {
        /**
         * Check action permissions not already checked in checkQuickPermissions
         *
-        * @param string $action the action to check
-        * @param $user User to check
-        * @param array $errors list of current errors
-        * @param $doExpensiveQueries Boolean whether or not to perform expensive queries
-        * @param $short Boolean short circuit on first error
+        * @param string $action The action to check
+        * @param User $user User to check
+        * @param array $errors List of current errors
+        * @param bool $doExpensiveQueries Whether or not to perform expensive queries
+        * @param bool $short Short circuit on first error
         *
-        * @return Array list of errors
+        * @return array List of errors
         */
-       private function checkActionPermissions( $action, $user, $errors, $doExpensiveQueries, $short ) {
+       private function checkActionPermissions( $action, $user, $errors,
+               $doExpensiveQueries, $short
+       ) {
                global $wgDeleteRevisionsLimit, $wgLang;
 
                if ( $action == 'protect' ) {
-                       if ( count( $this->getUserPermissionsErrorsInternal( 'edit', $user, $doExpensiveQueries, true ) ) ) {
+                       if ( count( $this->getUserPermissionsErrorsInternal( 'edit',
+                               $user, $doExpensiveQueries, true ) )
+                       ) {
                                // If they can't edit, they shouldn't protect.
                                $errors[] = array( 'protect-cantedit' );
                        }
@@ -2188,7 +2280,11 @@ class Title {
                                if ( $title_protection['pt_create_perm'] == ''
                                        || !$user->isAllowed( $title_protection['pt_create_perm'] )
                                ) {
-                                       $errors[] = array( 'titleprotected', User::whoIs( $title_protection['pt_user'] ), $title_protection['pt_reason'] );
+                                       $errors[] = array(
+                                               'titleprotected',
+                                               User::whoIs( $title_protection['pt_user'] ),
+                                               $title_protection['pt_reason']
+                                       );
                                }
                        }
                } elseif ( $action == 'move' ) {
@@ -2219,13 +2315,13 @@ class Title {
        /**
         * Check that the user isn't blocked from editing.
         *
-        * @param string $action the action to check
-        * @param $user User to check
-        * @param array $errors list of current errors
-        * @param $doExpensiveQueries Boolean whether or not to perform expensive queries
-        * @param $short Boolean short circuit on first error
+        * @param string $action The action to check
+        * @param User $user User to check
+        * @param array $errors List of current errors
+        * @param bool $doExpensiveQueries Whether or not to perform expensive queries
+        * @param bool $short Short circuit on first error
         *
-        * @return Array list of errors
+        * @return array List of errors
         */
        private function checkUserBlock( $action, $user, $errors, $doExpensiveQueries, $short ) {
                // Account creation blocks handled at userlogin.
@@ -2254,13 +2350,13 @@ class Title {
        /**
         * Check that the user is allowed to read this page.
         *
-        * @param string $action the action to check
-        * @param $user User to check
-        * @param array $errors list of current errors
-        * @param $doExpensiveQueries Boolean whether or not to perform expensive queries
-        * @param $short Boolean short circuit on first error
+        * @param string $action The action to check
+        * @param User $user User to check
+        * @param array $errors List of current errors
+        * @param bool $doExpensiveQueries Whether or not to perform expensive queries
+        * @param bool $short Short circuit on first error
         *
-        * @return Array list of errors
+        * @return array List of errors
         */
        private function checkReadPermissions( $action, $user, $errors, $doExpensiveQueries, $short ) {
                global $wgWhitelistRead, $wgWhitelistReadRegexp;
@@ -2333,9 +2429,9 @@ class Title {
         * Get a description array when the user doesn't have the right to perform
         * $action (i.e. when User::isAllowed() returns false)
         *
-        * @param string $action the action to check
-        * @param $short Boolean short circuit on first error
-        * @return Array list of errors
+        * @param string $action The action to check
+        * @param bool $short Short circuit on first error
+        * @return array List of errors
         */
        private function missingPermissionError( $action, $short ) {
                // We avoid expensive display logic for quickUserCan's and such
@@ -2363,13 +2459,15 @@ class Title {
         * which checks ONLY that previously checked by userCan (i.e. it leaves out
         * checks on wfReadOnly() and blocks)
         *
-        * @param string $action action that permission needs to be checked for
-        * @param $user User to check
+        * @param string $action Action that permission needs to be checked for
+        * @param User $user User to check
         * @param bool $doExpensiveQueries Set this to false to avoid doing unnecessary queries.
         * @param bool $short Set this to true to stop after the first permission error.
-        * @return Array of arrays of the arguments to wfMessage to explain permissions problems.
+        * @return array Array of arrays of the arguments to wfMessage to explain permissions problems.
         */
-       protected function getUserPermissionsErrorsInternal( $action, $user, $doExpensiveQueries = true, $short = false ) {
+       protected function getUserPermissionsErrorsInternal( $action, $user,
+               $doExpensiveQueries = true, $short = false
+       ) {
                wfProfileIn( __METHOD__ );
 
                # Read has special handling
@@ -2425,7 +2523,7 @@ class Title {
        /**
         * Returns restriction types for the current Title
         *
-        * @return array applicable restriction types
+        * @return array Applicable restriction types
         */
        public function getRestrictionTypes() {
                if ( $this->isSpecialPage() ) {
@@ -2451,7 +2549,7 @@ class Title {
         * Is this title subject to title protection?
         * Title protection is the one applied against creation of such title.
         *
-        * @return Mixed An associative array representing any existent title
+        * @return array|bool An associative array representing any existent title
         *   protection, or false if there's none.
         */
        private function getTitleProtection() {
@@ -2484,10 +2582,10 @@ class Title {
         * Update the title protection status
         *
         * @deprecated since 1.19; use WikiPage::doUpdateRestrictions() instead.
-        * @param $create_perm String Permission required for creation
+        * @param string $create_perm Permission required for creation
         * @param string $reason Reason for protection
         * @param string $expiry Expiry timestamp
-        * @return boolean true
+        * @return bool
         */
        public function updateTitleProtection( $create_perm, $reason, $expiry ) {
                wfDeprecated( __METHOD__, '1.19' );
@@ -2523,7 +2621,7 @@ class Title {
         * in $wgSemiprotectedRestrictionLevels?
         *
         * @param string $action Action to check (default: edit)
-        * @return Bool
+        * @return bool
         */
        public function isSemiProtected( $action = 'edit' ) {
                global $wgSemiprotectedRestrictionLevels;
@@ -2551,7 +2649,7 @@ class Title {
         *
         * @param string $action the action the page is protected from,
         * by default checks all actions.
-        * @return Bool
+        * @return bool
         */
        public function isProtected( $action = '' ) {
                global $wgRestrictionLevels;
@@ -2582,8 +2680,8 @@ class Title {
         * Determines if $user is unable to edit this page because it has been protected
         * by $wgNamespaceProtection.
         *
-        * @param $user User object to check permissions
-        * @return Bool
+        * @param User $user User object to check permissions
+        * @return bool
         */
        public function isNamespaceProtected( User $user ) {
                global $wgNamespaceProtection;
@@ -2601,7 +2699,7 @@ class Title {
        /**
         * Cascading protection: Return true if cascading restrictions apply to this page, false if not.
         *
-        * @return Bool If the page is subject to cascading restrictions.
+        * @return bool If the page is subject to cascading restrictions.
         */
        public function isCascadeProtected() {
                list( $sources, /* $restrictions */ ) = $this->getCascadeProtectionSources( false );
@@ -2626,7 +2724,7 @@ class Title {
         *
         * @param bool $getPages Whether or not to retrieve the actual pages
         *        that the restrictions have come from.
-        * @return Mixed Array of Title objects of the pages from which cascading restrictions
+        * @return array|bool Array of Title objects of the pages from which cascading restrictions
         *     have come, false for none, or true if such restrictions exist, but $getPages
         *     was not set.  The restriction array is an array of each type, each of which
         *     contains a array of unique groups.
@@ -2735,8 +2833,8 @@ class Title {
        /**
         * Accessor/initialisation for mRestrictions
         *
-        * @param string $action action that permission needs to be checked for
-        * @return Array of Strings the array of groups allowed to edit this article
+        * @param string $action Action that permission needs to be checked for
+        * @return array Array of Strings the array of groups allowed to edit this article
         */
        public function getRestrictions( $action ) {
                if ( !$this->mRestrictionsLoaded ) {
@@ -2750,7 +2848,7 @@ class Title {
        /**
         * Accessor/initialisation for mRestrictions
         *
-        * @return Array of Arrays of Strings the first level indexed by
+        * @return array Array of Arrays of Strings the first level indexed by
         * action, the second level containing the names of the groups
         * allowed to perform each action
         * @since 1.23
@@ -2765,8 +2863,8 @@ class Title {
        /**
         * Get the expiry time for the restriction against a given action
         *
-        * @param $action
-        * @return String|Bool 14-char timestamp, or 'infinity' if the page is protected forever
+        * @param string $action
+        * @return string|bool 14-char timestamp, or 'infinity' if the page is protected forever
         *     or not protected at all, or false if the action is not recognised.
         */
        public function getRestrictionExpiry( $action ) {
@@ -2779,7 +2877,7 @@ class Title {
        /**
         * Returns cascading restrictions for the current article
         *
-        * @return Boolean
+        * @return bool
         */
        function areRestrictionsCascading() {
                if ( !$this->mRestrictionsLoaded ) {
@@ -2792,8 +2890,8 @@ class Title {
        /**
         * Loads a string into mRestrictions array
         *
-        * @param $res Resource restrictions as an SQL result.
-        * @param string $oldFashionedRestrictions comma-separated list of page
+        * @param ResultWrapper $res Resource restrictions as an SQL result.
+        * @param string $oldFashionedRestrictions Comma-separated list of page
         *        restrictions from page table (pre 1.10)
         */
        private function loadRestrictionsFromResultWrapper( $res, $oldFashionedRestrictions = null ) {
@@ -2811,9 +2909,9 @@ class Title {
         * and page_restrictions table for this existing page.
         * Public for usage by LiquidThreads.
         *
-        * @param array $rows of db result objects
-        * @param string $oldFashionedRestrictions comma-separated list of page
-        *        restrictions from page table (pre 1.10)
+        * @param array $rows Array of db result objects
+        * @param string $oldFashionedRestrictions Comma-separated list of page
+        *   restrictions from page table (pre 1.10)
         */
        public function loadRestrictionsFromRows( $rows, $oldFashionedRestrictions = null ) {
                global $wgContLang;
@@ -2895,8 +2993,8 @@ class Title {
        /**
         * Load restrictions from the page_restrictions table
         *
-        * @param string $oldFashionedRestrictions comma-separated list of page
-        *        restrictions from page table (pre 1.10)
+        * @param string $oldFashionedRestrictions Comma-separated list of page
+        *   restrictions from page table (pre 1.10)
         */
        public function loadRestrictions( $oldFashionedRestrictions = null ) {
                global $wgContLang;
@@ -2971,7 +3069,7 @@ class Title {
        /**
         * Does this have subpages?  (Warning, usually requires an extra DB query.)
         *
-        * @return Bool
+        * @return bool
         */
        public function hasSubpages() {
                if ( !MWNamespace::hasSubpages( $this->mNamespace ) ) {
@@ -2997,8 +3095,8 @@ class Title {
        /**
         * Get all subpages of this page.
         *
-        * @param int $limit maximum number of subpages to fetch; -1 for no limit
-        * @return mixed TitleArray, or empty array if this page's namespace
+        * @param int $limit Maximum number of subpages to fetch; -1 for no limit
+        * @return TitleArray|array TitleArray, or empty array if this page's namespace
         *  doesn't allow subpages
         */
        public function getSubpages( $limit = -1 ) {
@@ -3027,7 +3125,7 @@ class Title {
        /**
         * Is there a version of this page in the deletion archive?
         *
-        * @return Int the number of archived revisions
+        * @return int The number of archived revisions
         */
        public function isDeleted() {
                if ( $this->getNamespace() < 0 ) {
@@ -3052,7 +3150,7 @@ class Title {
        /**
         * Is there a version of this page in the deletion archive?
         *
-        * @return Boolean
+        * @return bool
         */
        public function isDeletedQuick() {
                if ( $this->getNamespace() < 0 ) {
@@ -3076,9 +3174,9 @@ class Title {
         * Get the article ID for this Title from the link cache,
         * adding it if necessary
         *
-        * @param int $flags a bit field; may be Title::GAID_FOR_UPDATE to select
+        * @param int $flags A bit field; may be Title::GAID_FOR_UPDATE to select
         *  for update
-        * @return Int the ID
+        * @return int The ID
         */
        public function getArticleID( $flags = 0 ) {
                if ( $this->getNamespace() < 0 ) {
@@ -3103,8 +3201,8 @@ class Title {
         * Is this an article that is a redirect page?
         * Uses link cache, adding it if necessary
         *
-        * @param int $flags a bit field; may be Title::GAID_FOR_UPDATE to select for update
-        * @return Bool
+        * @param int $flags A bit field; may be Title::GAID_FOR_UPDATE to select for update
+        * @return bool
         */
        public function isRedirect( $flags = 0 ) {
                if ( !is_null( $this->mRedirect ) ) {
@@ -3138,8 +3236,8 @@ class Title {
         * What is the length of this page?
         * Uses link cache, adding it if necessary
         *
-        * @param int $flags a bit field; may be Title::GAID_FOR_UPDATE to select for update
-        * @return Int
+        * @param int $flags A bit field; may be Title::GAID_FOR_UPDATE to select for update
+        * @return int
         */
        public function getLength( $flags = 0 ) {
                if ( $this->mLength != -1 ) {
@@ -3166,8 +3264,8 @@ class Title {
        /**
         * What is the page_latest field for this page?
         *
-        * @param int $flags a bit field; may be Title::GAID_FOR_UPDATE to select for update
-        * @return Int or 0 if the page doesn't exist
+        * @param int $flags A bit field; may be Title::GAID_FOR_UPDATE to select for update
+        * @return int Int or 0 if the page doesn't exist
         */
        public function getLatestRevID( $flags = 0 ) {
                if ( !( $flags & Title::GAID_FOR_UPDATE ) && $this->mLatestID !== false ) {
@@ -3200,7 +3298,7 @@ class Title {
         * loading of the new page_id. It's also called from
         * WikiPage::doDeleteArticleReal()
         *
-        * @param int $newid the new Article ID
+        * @param int $newid The new Article ID
         */
        public function resetArticleID( $newid ) {
                $linkCache = LinkCache::singleton();
@@ -3224,9 +3322,9 @@ class Title {
        /**
         * Capitalize a text string for a title if it belongs to a namespace that capitalizes
         *
-        * @param string $text containing title to capitalize
-        * @param int $ns namespace index, defaults to NS_MAIN
-        * @return String containing capitalized title
+        * @param string $text Containing title to capitalize
+        * @param int $ns Namespace index, defaults to NS_MAIN
+        * @return string Containing capitalized title
         */
        public static function capitalize( $text, $ns = NS_MAIN ) {
                global $wgContLang;
@@ -3247,7 +3345,7 @@ class Title {
         * namespace prefixes, sets the other forms, and canonicalizes
         * everything.
         *
-        * @return Bool true on success
+        * @return bool True on success
         */
        private function secureAndSplit() {
                # Initialisation
@@ -3292,10 +3390,10 @@ class Title {
         * WARNING: do not use this function on arbitrary user-supplied titles!
         * On heavily-used templates it will max out the memory.
         *
-        * @param array $options may be FOR UPDATE
-        * @param string $table table name
-        * @param string $prefix fields prefix
-        * @return Array of Title objects linking here
+        * @param array $options May be FOR UPDATE
+        * @param string $table Table name
+        * @param string $prefix Fields prefix
+        * @return Title[] Array of Title objects linking here
         */
        public function getLinksTo( $options = array(), $table = 'pagelinks', $prefix = 'pl' ) {
                if ( count( $options ) > 0 ) {
@@ -3336,8 +3434,8 @@ class Title {
         * WARNING: do not use this function on arbitrary user-supplied titles!
         * On heavily-used templates it will max out the memory.
         *
-        * @param array $options may be FOR UPDATE
-        * @return Array of Title the Title objects linking here
+        * @param array $options May be FOR UPDATE
+        * @return Title[] Array of Title the Title objects linking here
         */
        public function getTemplateLinksTo( $options = array() ) {
                return $this->getLinksTo( $options, 'templatelinks', 'tl' );
@@ -3350,10 +3448,10 @@ class Title {
         * WARNING: do not use this function on arbitrary user-supplied titles!
         * On heavily-used templates it will max out the memory.
         *
-        * @param array $options may be FOR UPDATE
-        * @param string $table table name
-        * @param string $prefix fields prefix
-        * @return Array of Title objects linking here
+        * @param array $options May be FOR UPDATE
+        * @param string $table Table name
+        * @param string $prefix Fields prefix
+        * @return array Array of Title objects linking here
         */
        public function getLinksFrom( $options = array(), $table = 'pagelinks', $prefix = 'pl' ) {
                global $wgContentHandlerUseDB;
@@ -3374,7 +3472,15 @@ class Title {
                $namespaceFiled = "{$prefix}_namespace";
                $titleField = "{$prefix}_title";
 
-               $fields = array( $namespaceFiled, $titleField, 'page_id', 'page_len', 'page_is_redirect', 'page_latest' );
+               $fields = array(
+                       $namespaceFiled,
+                       $titleField,
+                       'page_id',
+                       'page_len',
+                       'page_is_redirect',
+                       'page_latest'
+               );
+
                if ( $wgContentHandlerUseDB ) {
                        $fields[] = 'page_content_model';
                }
@@ -3385,7 +3491,10 @@ class Title {
                        array( "{$prefix}_from" => $id ),
                        __METHOD__,
                        $options,
-                       array( 'page' => array( 'LEFT JOIN', array( "page_namespace=$namespaceFiled", "page_title=$titleField" ) ) )
+                       array( 'page' => array(
+                               'LEFT JOIN',
+                               array( "page_namespace=$namespaceFiled", "page_title=$titleField" )
+                       ) )
                );
 
                $retVal = array();
@@ -3413,18 +3522,20 @@ class Title {
         * WARNING: do not use this function on arbitrary user-supplied titles!
         * On heavily-used templates it will max out the memory.
         *
-        * @param array $options may be FOR UPDATE
-        * @return Array of Title the Title objects used here
+        * @param array $options May be FOR UPDATE
+        * @return Title[] Array of Title the Title objects used here
         */
        public function getTemplateLinksFrom( $options = array() ) {
                return $this->getLinksFrom( $options, 'templatelinks', 'tl' );
        }
 
        /**
-        * Get an array of Title objects referring to non-existent articles linked from this page
+        * Get an array of Title objects referring to non-existent articles linked
+        * from this page.
         *
-        * @todo check if needed (used only in SpecialBrokenRedirects.php, and should use redirect table in this case)
-        * @return Array of Title the Title objects
+        * @todo check if needed (used only in SpecialBrokenRedirects.php, and
+        *   should use redirect table in this case).
+        * @return Title[] Array of Title the Title objects
         */
        public function getBrokenLinksFrom() {
                if ( $this->getArticleID() == 0 ) {
@@ -3460,7 +3571,7 @@ class Title {
         * Get a list of URLs to purge from the Squid cache when this
         * page changes
         *
-        * @return Array of String the URLs
+        * @return string[] Array of String the URLs
         */
        public function getSquidURLs() {
                $urls = array(
@@ -3502,8 +3613,8 @@ class Title {
        /**
         * Move this page without authentication
         *
-        * @param $nt Title the new page Title
-        * @return Mixed true on success, getUserPermissionsErrors()-like array on failure
+        * @param Title $nt The new page Title
+        * @return array|bool True on success, getUserPermissionsErrors()-like array on failure
         */
        public function moveNoAuth( &$nt ) {
                return $this->moveTo( $nt, false );
@@ -3513,11 +3624,11 @@ class Title {
         * Check whether a given move operation would be valid.
         * Returns true if ok, or a getUserPermissionsErrors()-like array otherwise
         *
-        * @param $nt Title the new title
-        * @param bool $auth indicates whether $wgUser's permissions
+        * @param Title $nt The new title
+        * @param bool $auth Indicates whether $wgUser's permissions
         *  should be checked
-        * @param string $reason is the log summary of the move, used for spam checking
-        * @return Mixed True on success, getUserPermissionsErrors()-like array on failure
+        * @param string $reason Is the log summary of the move, used for spam checking
+        * @return array|bool True on success, getUserPermissionsErrors()-like array on failure
         */
        public function isValidMoveOperation( &$nt, $auth = true, $reason = '' ) {
                global $wgUser, $wgContentHandlerUseDB;
@@ -3663,13 +3774,13 @@ class Title {
        /**
         * Move a title to a new location
         *
-        * @param $nt Title the new title
-        * @param bool $auth indicates whether $wgUser's permissions
+        * @param Title $nt The new title
+        * @param bool $auth Indicates whether $wgUser's permissions
         *  should be checked
-        * @param string $reason the reason for the move
+        * @param string $reason The reason for the move
         * @param bool $createRedirect Whether to create a redirect from the old title to the new title.
         *  Ignored if the user doesn't have the suppressredirect right.
-        * @return Mixed true on success, getUserPermissionsErrors()-like array on failure
+        * @return array|bool True on success, getUserPermissionsErrors()-like array on failure
         */
        public function moveTo( &$nt, $auth = true, $reason = '', $createRedirect = true ) {
                global $wgUser;
@@ -3760,7 +3871,13 @@ class Title {
                                $comment .= wfMessage( 'colon-separator' )->inContentLanguage()->text() . $reason;
                        }
                        // @todo FIXME: $params?
-                       $logId = $log->addEntry( 'move_prot', $nt, $comment, array( $this->getPrefixedText() ), $wgUser );
+                       $logId = $log->addEntry(
+                               'move_prot',
+                               $nt,
+                               $comment,
+                               array( $this->getPrefixedText() ),
+                               $wgUser
+                       );
 
                        // reread inserted pr_ids for log relation
                        $insertedPrIds = $dbw->select(
@@ -3796,7 +3913,7 @@ class Title {
         * Move page to a title which is either a redirect to the
         * source page or nonexistent
         *
-        * @param $nt Title the page to move to, which should be a redirect 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
@@ -3814,9 +3931,17 @@ class Title {
                }
 
                if ( $createRedirect ) {
-                       $contentHandler = ContentHandler::getForTitle( $this );
-                       $redirectContent = $contentHandler->makeRedirectContent( $nt,
-                               wfMessage( 'move-redirect-text' )->inContentLanguage()->plain() );
+                       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.
                } else {
@@ -3861,7 +3986,7 @@ class Title {
                }
 
                # Save a null revision in the page's history notifying of the move
-               $nullRevision = Revision::newNullRevision( $dbw, $oldid, $comment, true );
+               $nullRevision = Revision::newNullRevision( $dbw, $oldid, $comment, true, $wgUser );
                if ( !is_object( $nullRevision ) ) {
                        throw new MWException( 'No valid null revision produced in ' . __METHOD__ );
                }
@@ -3908,6 +4033,8 @@ class Title {
                                $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 );
@@ -3928,12 +4055,12 @@ class Title {
        /**
         * Move this page's subpages to be subpages of $nt
         *
-        * @param $nt Title Move target
+        * @param Title $nt Move target
         * @param bool $auth Whether $wgUser's permissions should be checked
         * @param string $reason The reason for the move
         * @param bool $createRedirect Whether to create redirects from the old subpages to
         *     the new ones Ignored if the user doesn't have the 'suppressredirect' right
-        * @return mixed array with old page titles as keys, and strings (new page titles) or
+        * @return array Array with old page titles as keys, and strings (new page titles) or
         *     arrays (errors) as values, or an error array with numeric indices if no pages
         *     were moved
         */
@@ -4002,7 +4129,7 @@ class Title {
         * Checks if this page is just a one-rev redirect.
         * Adds lock, so don't use just for light purposes.
         *
-        * @return Bool
+        * @return bool
         */
        public function isSingleRevRedirect() {
                global $wgContentHandlerUseDB;
@@ -4025,7 +4152,10 @@ class Title {
                $this->mArticleID = $row ? intval( $row->page_id ) : 0;
                $this->mRedirect = $row ? (bool)$row->page_is_redirect : false;
                $this->mLatestID = $row ? intval( $row->page_latest ) : false;
-               $this->mContentModel = $row && isset( $row->page_content_model ) ? strval( $row->page_content_model ) : false;
+               $this->mContentModel = $row && isset( $row->page_content_model )
+                       ? strval( $row->page_content_model )
+                       : false;
+
                if ( !$this->mRedirect ) {
                        return false;
                }
@@ -4048,8 +4178,8 @@ class Title {
         * Checks if $this can be moved to a given Title
         * - Selects for update, so don't call it unless you mean business
         *
-        * @param $nt Title the new title to check
-        * @return Bool
+        * @param Title $nt The new title to check
+        * @return bool
         */
        public function isValidMoveTarget( $nt ) {
                # Is it an existing file?
@@ -4095,7 +4225,7 @@ class Title {
         * Get categories to which this Title belongs and return an array of
         * categories' names.
         *
-        * @return Array of parents in the form:
+        * @return array Array of parents in the form:
         *        $parent => $currentarticle
         */
        public function getParentCategories() {
@@ -4130,8 +4260,8 @@ class Title {
        /**
         * Get a tree of parent categories
         *
-        * @param array $children with the children in the keys, to check for circular refs
-        * @return Array Tree of parent categories
+        * @param array $children Array with the children in the keys, to check for circular refs
+        * @return array Tree of parent categories
         */
        public function getParentCategoryTree( $children = array() ) {
                $stack = array();
@@ -4158,7 +4288,7 @@ class Title {
         * Get an associative array for selecting this title from
         * the "page" table
         *
-        * @return Array suitable for the $where parameter of DB::select()
+        * @return array Array suitable for the $where parameter of DB::select()
         */
        public function pageCond() {
                if ( $this->mArticleID > 0 ) {
@@ -4174,7 +4304,7 @@ class Title {
         *
         * @param int $revId Revision ID. Get the revision that was before this one.
         * @param int $flags Title::GAID_FOR_UPDATE
-        * @return Int|Bool Old revision ID, or FALSE if none exists
+        * @return int|bool Old revision ID, or false if none exists
         */
        public function getPreviousRevisionID( $revId, $flags = 0 ) {
                $db = ( $flags & self::GAID_FOR_UPDATE ) ? wfGetDB( DB_MASTER ) : wfGetDB( DB_SLAVE );
@@ -4199,7 +4329,7 @@ class Title {
         *
         * @param int $revId Revision ID. Get the revision that was after this one.
         * @param int $flags Title::GAID_FOR_UPDATE
-        * @return Int|Bool Next revision ID, or FALSE if none exists
+        * @return int|bool Next revision ID, or false if none exists
         */
        public function getNextRevisionID( $revId, $flags = 0 ) {
                $db = ( $flags & self::GAID_FOR_UPDATE ) ? wfGetDB( DB_MASTER ) : wfGetDB( DB_SLAVE );
@@ -4223,7 +4353,7 @@ class Title {
         * Get the first revision of the page
         *
         * @param int $flags Title::GAID_FOR_UPDATE
-        * @return Revision|Null if page doesn't exist
+        * @return Revision|null If page doesn't exist
         */
        public function getFirstRevision( $flags = 0 ) {
                $pageId = $this->getArticleID( $flags );
@@ -4245,7 +4375,7 @@ class Title {
         * Get the oldest revision timestamp of this page
         *
         * @param int $flags Title::GAID_FOR_UPDATE
-        * @return String: MW timestamp
+        * @return string MW timestamp
         */
        public function getEarliestRevTime( $flags = 0 ) {
                $rev = $this->getFirstRevision( $flags );
@@ -4304,7 +4434,7 @@ class Title {
         * @param int|Revision $old Old revision or rev ID (first before range)
         * @param int|Revision $new New revision or rev ID (first after range)
         * @param int|null $max Limit of Revisions to count, will be incremented to detect truncations
-        * @return Int Number of revisions between these revisions.
+        * @return int Number of revisions between these revisions.
         */
        public function countRevisionsBetween( $old, $new, $max = null ) {
                if ( !( $old instanceof Revision ) ) {
@@ -4430,8 +4560,8 @@ class Title {
        /**
         * Compare with another title.
         *
-        * @param $title Title
-        * @return Bool
+        * @param Title $title
+        * @return bool
         */
        public function equals( Title $title ) {
                // Note: === is necessary for proper matching of number-like titles.
@@ -4443,8 +4573,8 @@ class Title {
        /**
         * Check if this title is a subpage of another title
         *
-        * @param $title Title
-        * @return Bool
+        * @param Title $title
+        * @return bool
         */
        public function isSubpageOf( Title $title ) {
                return $this->getInterwiki() === $title->getInterwiki()
@@ -4459,7 +4589,7 @@ class Title {
         * If you want to know if a title can be meaningfully viewed, you should
         * probably call the isKnown() method instead.
         *
-        * @return Bool
+        * @return bool
         */
        public function exists() {
                return $this->getArticleID() != 0;
@@ -4479,7 +4609,7 @@ class Title {
         * existing code, but we might want to add an optional parameter to skip
         * it and any other expensive checks.)
         *
-        * @return Bool
+        * @return bool
         */
        public function isAlwaysKnown() {
                $isKnown = null;
@@ -4492,7 +4622,7 @@ class Title {
                 * @since 1.20
                 *
                 * @param Title $title
-                * @param boolean|null $isKnown
+                * @param bool|null $isKnown
                 */
                wfRunHooks( 'TitleIsAlwaysKnown', array( $this, &$isKnown ) );
 
@@ -4532,7 +4662,7 @@ class Title {
         * since LinkHolderArray calls isAlwaysKnown() and does its own
         * page existence check.
         *
-        * @return Bool
+        * @return bool
         */
        public function isKnown() {
                return $this->isAlwaysKnown() || $this->exists();
@@ -4541,7 +4671,7 @@ class Title {
        /**
         * Does this page have source text?
         *
-        * @return Boolean
+        * @return bool
         */
        public function hasSourceText() {
                if ( $this->exists() ) {
@@ -4554,7 +4684,9 @@ class Title {
                        // Use always content language to avoid loading hundreds of languages
                        // to get the link color.
                        global $wgContLang;
-                       list( $name, ) = MessageCache::singleton()->figureMessage( $wgContLang->lcfirst( $this->getText() ) );
+                       list( $name, ) = MessageCache::singleton()->figureMessage(
+                               $wgContLang->lcfirst( $this->getText() )
+                       );
                        $message = wfMessage( $name )->inLanguage( $wgContLang )->useDatabase( false );
                        return $message->exists();
                }
@@ -4565,7 +4697,7 @@ class Title {
        /**
         * Get the default message text or false if the message doesn't exist
         *
-        * @return String or false
+        * @return string|bool
         */
        public function getDefaultMessageText() {
                global $wgContLang;
@@ -4574,7 +4706,9 @@ class Title {
                        return false;
                }
 
-               list( $name, $lang ) = MessageCache::singleton()->figureMessage( $wgContLang->lcfirst( $this->getText() ) );
+               list( $name, $lang ) = MessageCache::singleton()->figureMessage(
+                       $wgContLang->lcfirst( $this->getText() )
+               );
                $message = wfMessage( $name )->inLanguage( $lang )->useDatabase( false );
 
                if ( $message->exists() ) {
@@ -4587,13 +4721,17 @@ class Title {
        /**
         * Updates page_touched for this page; called from LinksUpdate.php
         *
-        * @return Bool true if the update succeeded
+        * @return bool True if the update succeeded
         */
        public function invalidateCache() {
                if ( wfReadOnly() ) {
                        return false;
                }
 
+               if ( $this->mArticleID === 0 ) {
+                       return true; // avoid gap locking if we know it's not there
+               }
+
                $method = __METHOD__;
                $dbw = wfGetDB( DB_MASTER );
                $conds = $this->pageCond();
@@ -4627,8 +4765,8 @@ class Title {
        /**
         * Get the last touched timestamp
         *
-        * @param $db DatabaseBase: optional db
-        * @return String last-touched timestamp
+        * @param DatabaseBase $db Optional db
+        * @return string Last-touched timestamp
         */
        public function getTouched( $db = null ) {
                $db = isset( $db ) ? $db : wfGetDB( DB_SLAVE );
@@ -4639,8 +4777,8 @@ class Title {
        /**
         * Get the timestamp when this page was updated since the user last saw it.
         *
-        * @param $user User
-        * @return String|Null
+        * @param User $user
+        * @return string|null
         */
        public function getNotificationTimestamp( $user = null ) {
                global $wgUser, $wgShowUpdatedMarker;
@@ -4678,8 +4816,8 @@ class Title {
        /**
         * Generate strings used for xml 'id' names in monobook tabs
         *
-        * @param string $prepend defaults to 'nstab-'
-        * @return String XML 'id' name
+        * @param string $prepend Defaults to 'nstab-'
+        * @return string XML 'id' name
         */
        public function getNamespaceKey( $prepend = 'nstab-' ) {
                global $wgContLang;
@@ -4709,7 +4847,7 @@ class Title {
        /**
         * Get all extant redirects to this Title
         *
-        * @param int|Null $ns Single namespace to consider; NULL to consider all namespaces
+        * @param int|null $ns Single namespace to consider; null to consider all namespaces
         * @return Title[] Array of Title redirects to this title
         */
        public function getRedirectsHere( $ns = null ) {
@@ -4746,7 +4884,7 @@ class Title {
        /**
         * Check if this Title is a valid redirect target
         *
-        * @return Bool
+        * @return bool
         */
        public function isValidRedirectTarget() {
                global $wgInvalidRedirectTargets;
@@ -4777,7 +4915,7 @@ class Title {
        /**
         * Whether the magic words __INDEX__ and __NOINDEX__ function for  this page.
         *
-        * @return Boolean
+        * @return bool
         */
        public function canUseNoindex() {
                global $wgContentNamespaces, $wgExemptFromUserRobotsControl;
@@ -4837,9 +4975,12 @@ class Title {
                }
 
                if ( !$this->mPageLanguage || $this->mPageLanguage[1] !== $wgLanguageCode ) {
-                       // Note that this may depend on user settings, so the cache should be only per-request.
-                       // NOTE: ContentHandler::getPageLanguage() may need to load the content to determine the page language!
-                       // Checking $wgLanguageCode hasn't changed for the benefit of unit tests.
+                       // Note that this may depend on user settings, so the cache should
+                       // be only per-request.
+                       // NOTE: ContentHandler::getPageLanguage() may need to load the
+                       // content to determine the page language!
+                       // Checking $wgLanguageCode hasn't changed for the benefit of unit
+                       // tests.
                        $contentHandler = ContentHandler::getForTitle( $this );
                        $langObj = wfGetLangObj( $contentHandler->getPageLanguage( $this ) );
                        $this->mPageLanguage = array( $langObj->getCode(), $wgLanguageCode );
@@ -4872,8 +5013,9 @@ class Title {
                        return $wgLang;
                }
 
-               //NOTE: can't be cached persistently, depends on user settings
-               //NOTE: ContentHandler::getPageViewLanguage() may need to load the content to determine the page language!
+               // @note Can't be cached persistently, depends on user settings.
+               // @note ContentHandler::getPageViewLanguage() may need to load the
+               //   content to determine the page language!
                $contentHandler = ContentHandler::getForTitle( $this );
                $pageLang = $contentHandler->getPageViewLanguage( $this );
                return $pageLang;
@@ -4887,7 +5029,7 @@ class Title {
         *
         * @since 1.21
         * @param int $oldid Revision ID that's being edited
-        * @return Array
+        * @return array
         */
        public function getEditNotices( $oldid = 0 ) {
                $notices = array();
index 4fcb2eb..668ea54 100644 (file)
  */
 
 class TitleArrayFromResult extends TitleArray implements Countable {
+       /** @var ResultWrapper */
+       public $res;
 
-       /**
-        * @var ResultWrapper
-        */
-       var $res;
-       var $key, $current;
+       public $key;
+
+       public $current;
 
        function __construct( $res ) {
                $this->res = $res;
index 4aea69f..941a405 100644 (file)
@@ -76,7 +76,7 @@ class User {
         * corresponding database fields must call a cache-clearing function.
         * @showinitializer
         */
-       static $mCacheVars = array(
+       protected static $mCacheVars = array(
                // user table
                'mId',
                'mName',
@@ -105,7 +105,7 @@ class User {
         * "right-$right".
         * @showinitializer
         */
-       static $mCoreRights = array(
+       protected static $mCoreRights = array(
                'apihighlimits',
                'autoconfirmed',
                'autopatrol',
@@ -143,6 +143,7 @@ class User {
                'minoredit',
                'move',
                'movefile',
+               'move-categorypages',
                'move-rootuserpages',
                'move-subpages',
                'nominornewtalk',
@@ -175,17 +176,45 @@ class User {
                'viewmywatchlist',
                'writeapi',
        );
+
        /**
         * String Cached results of getAllRights()
         */
-       static $mAllRights = false;
+       protected static $mAllRights = false;
 
        /** @name Cache variables */
        //@{
-       var $mId, $mName, $mRealName, $mPassword, $mNewpassword, $mNewpassTime,
-               $mEmail, $mTouched, $mToken, $mEmailAuthenticated,
-               $mEmailToken, $mEmailTokenExpires, $mRegistration, $mEditCount,
-               $mGroups, $mOptionOverrides;
+       public $mId;
+
+       public $mName;
+
+       public $mRealName;
+
+       public $mPassword;
+
+       public $mNewpassword;
+
+       public $mNewpassTime;
+
+       public $mEmail;
+
+       public $mTouched;
+
+       protected $mToken;
+
+       public $mEmailAuthenticated;
+
+       protected $mEmailToken;
+
+       protected $mEmailTokenExpires;
+
+       protected $mRegistration;
+
+       protected $mEditCount;
+
+       public $mGroups;
+
+       protected $mOptionOverrides;
 
        protected $mPasswordExpires;
        //@}
@@ -194,12 +223,12 @@ class User {
         * Bool Whether the cache variables have been loaded.
         */
        //@{
-       var $mOptionsLoaded;
+       public $mOptionsLoaded;
 
        /**
         * Array with already loaded items or true if all items have been loaded.
         */
-       private $mLoadedItems = array();
+       protected $mLoadedItems = array();
        //@}
 
        /**
@@ -211,41 +240,55 @@ class User {
         *
         * Use the User::newFrom*() family of functions to set this.
         */
-       var $mFrom;
+       public $mFrom;
 
        /**
         * Lazy-initialized variables, invalidated with clearInstanceCache
         */
-       var $mNewtalk, $mDatePreference, $mBlockedby, $mHash, $mRights,
-               $mBlockreason, $mEffectiveGroups, $mImplicitGroups, $mFormerGroups, $mBlockedGlobally,
-               $mLocked, $mHideName, $mOptions;
+       protected $mNewtalk;
+
+       protected $mDatePreference;
+
+       public $mBlockedby;
+
+       protected $mHash;
+
+       public $mRights;
+
+       protected $mBlockreason;
+
+       protected $mEffectiveGroups;
+
+       protected $mImplicitGroups;
+
+       protected $mFormerGroups;
+
+       protected $mBlockedGlobally;
+
+       protected $mLocked;
+
+       public $mHideName;
+
+       public $mOptions;
 
        /**
         * @var WebRequest
         */
        private $mRequest;
 
-       /**
-        * @var Block
-        */
-       var $mBlock;
+       /** @var Block */
+       public $mBlock;
 
-       /**
-        * @var bool
-        */
-       var $mAllowUsertalk;
+       /** @var bool */
+       protected $mAllowUsertalk;
 
-       /**
-        * @var Block
-        */
+       /** @var Block */
        private $mBlockedFromCreateAccount = false;
 
-       /**
-        * @var Array
-        */
+       /** @var array */
        private $mWatchedItems = array();
 
-       static $idCacheByName = array();
+       public static $idCacheByName = array();
 
        /**
         * Lightweight constructor for an anonymous user.
@@ -448,8 +491,8 @@ class User {
         * Create a new user object using data from session or cookies. If the
         * login credentials are invalid, the result is an anonymous user.
         *
-        * @param WebRequest $request Object to use; $wgRequest will be used if omitted.
-        * @return User object
+        * @param WebRequest|null $request Object to use; $wgRequest will be used if omitted.
+        * @return User
         */
        public static function newFromSession( WebRequest $request = null ) {
                $user = new User;
@@ -516,7 +559,12 @@ class User {
                }
 
                $dbr = wfGetDB( DB_SLAVE );
-               $s = $dbr->selectRow( 'user', array( 'user_id' ), array( 'user_name' => $nt->getText() ), __METHOD__ );
+               $s = $dbr->selectRow(
+                       'user',
+                       array( 'user_id' ),
+                       array( 'user_name' => $nt->getText() ),
+                       __METHOD__
+               );
 
                if ( $s === false ) {
                        $result = null;
@@ -557,7 +605,8 @@ class User {
         * @return bool
         */
        public static function isIP( $name ) {
-               return preg_match( '/^\d{1,3}\.\d{1,3}\.\d{1,3}\.(?:xxx|\d{1,3})$/', $name ) || IP::isIPv6( $name );
+               return preg_match( '/^\d{1,3}\.\d{1,3}\.\d{1,3}\.(?:xxx|\d{1,3})$/', $name )
+                       || IP::isIPv6( $name );
        }
 
        /**
@@ -659,7 +708,7 @@ class User {
         * Additional blacklisting may be added here rather than in
         * isValidUserName() to avoid disrupting existing accounts.
         *
-        * @param string $name to match
+        * @param string $name String to match
         * @return bool
         */
        public static function isCreatableName( $name ) {
@@ -702,7 +751,7 @@ class User {
         * Given unvalidated password input, return error message on failure.
         *
         * @param string $password Desired password
-        * @return mixed: true on success, string or array of error message on failure
+        * @return bool|string|array true on success, string or array of error message on failure
         */
        public function getPasswordValidity( $password ) {
                $result = $this->checkPasswordValidity( $password );
@@ -755,7 +804,9 @@ class User {
                        } elseif ( $wgContLang->lc( $password ) == $wgContLang->lc( $this->mName ) ) {
                                $status->error( 'password-name-match' );
                                return $status;
-                       } elseif ( isset( $blockedLogins[$this->getName()] ) && $password == $blockedLogins[$this->getName()] ) {
+                       } elseif ( isset( $blockedLogins[$this->getName()] )
+                               && $password == $blockedLogins[$this->getName()]
+                       ) {
                                $status->error( 'password-login-forbidden' );
                                return $status;
                        } else {
@@ -776,7 +827,7 @@ class User {
        /**
         * Expire a user's password
         * @since 1.23
-        * @param $ts Mixed: optional timestamp to convert, default 0 for the current time
+        * @param int $ts Optional timestamp to convert, default 0 for the current time
         */
        public function expirePassword( $ts = 0 ) {
                $this->load();
@@ -788,7 +839,7 @@ class User {
        /**
         * Clear the password expiration for a user
         * @since 1.23
-        * @param bool $load ensure user object is loaded first
+        * @param bool $load Ensure user object is loaded first
         */
        public function resetPasswordExpiration( $load = true ) {
                global $wgPasswordExpirationDays;
@@ -833,7 +884,7 @@ class User {
         * the cached User object, we assume that whatever mechanism is setting
         * the expiration date is also expiring the User cache.
         * @since 1.23
-        * @return string|false the datestamp of the expiration, or null if not set
+        * @return string|bool The datestamp of the expiration, or null if not set
         */
        public function getPasswordExpireDate() {
                $this->load();
@@ -876,11 +927,11 @@ class User {
         * Given unvalidated user input, return a canonical username, or false if
         * the username is invalid.
         * @param string $name User input
-        * @param string|bool $validate type of validation to use:
-        *                - false        No validation
-        *                - 'valid'      Valid for batch processes
-        *                - 'usable'     Valid for batch processes and login
-        *                - 'creatable'  Valid for batch processes, login and account creation
+        * @param string|bool $validate Type of validation to use:
+        *   - false        No validation
+        *   - 'valid'      Valid for batch processes
+        *   - 'usable'     Valid for batch processes and login
+        *   - 'creatable'  Valid for batch processes, login and account creation
         *
         * @throws MWException
         * @return bool|string
@@ -954,7 +1005,8 @@ class User {
         */
        public static function randomPassword() {
                global $wgMinimalPasswordLength;
-               // Decide the final password length based on our min password length, stopping at a minimum of 10 chars
+               // Decide the final password length based on our min password length,
+               // stopping at a minimum of 10 chars.
                $length = max( 10, $wgMinimalPasswordLength );
                // Multiply by 1.25 to get the number of hex characters we need
                $length = $length * 1.25;
@@ -970,7 +1022,7 @@ class User {
         * @note This no longer clears uncached lazy-initialised properties;
         *       the constructor does that instead.
         *
-        * @param $name string|bool
+        * @param string|bool $name
         */
        public function loadDefaults( $name = false ) {
                wfProfileIn( __METHOD__ );
@@ -1008,14 +1060,14 @@ class User {
        /**
         * Return whether an item has been loaded.
         *
-        * @param string $item item to check. Current possibilities:
-        *              - id
-        *              - name
-        *              - realname
+        * @param string $item Item to check. Current possibilities:
+        *   - id
+        *   - name
+        *   - realname
         * @param string $all 'all' to check if the whole object has been loaded
-        *        or any other string to check if only the item is available (e.g.
-        *        for optimisation)
-        * @return boolean
+        *   or any other string to check if only the item is available (e.g.
+        *   for optimisation)
+        * @return bool
         */
        public function isItemLoaded( $item, $all = 'all' ) {
                return ( $this->mLoadedItems === true && $all === 'all' ) ||
@@ -1085,14 +1137,16 @@ class User {
                }
 
                if ( $request->getSessionData( 'wsToken' ) ) {
-                       $passwordCorrect = ( $proposedUser->getToken( false ) === $request->getSessionData( 'wsToken' ) );
+                       $passwordCorrect =
+                               ( $proposedUser->getToken( false ) === $request->getSessionData( 'wsToken' ) );
                        $from = 'session';
                } elseif ( $request->getCookie( 'Token' ) ) {
                        # Get the token from DB/cache and clean it up to remove garbage padding.
                        # This deals with historical problems with bugs and the default column value.
                        $token = rtrim( $proposedUser->getToken( false ) ); // correct token
                        // Make comparison in constant time (bug 61346)
-                       $passwordCorrect = strlen( $token ) && $this->compareSecrets( $token, $request->getCookie( 'Token' ) );
+                       $passwordCorrect = strlen( $token )
+                               && $this->compareSecrets( $token, $request->getCookie( 'Token' ) );
                        $from = 'cookie';
                } else {
                        // No session or persistent login cookie
@@ -1113,8 +1167,8 @@ class User {
 
        /**
         * A comparison of two strings, not vulnerable to timing attacks
-        * @param string $answer the secret string that you are comparing against.
-        * @param string $test compare this string to the $answer.
+        * @param string $answer The secret string that you are comparing against.
+        * @param string $test Compare this string to the $answer.
         * @return bool True if the strings are the same, false otherwise
         */
        protected function compareSecrets( $answer, $test ) {
@@ -1122,11 +1176,13 @@ class User {
                        $passwordCorrect = false;
                } else {
                        $result = 0;
-                       for ( $i = 0; $i < strlen( $answer ); $i++ ) {
+                       $answerLength = strlen( $answer );
+                       for ( $i = 0; $i < $answerLength; $i++ ) {
                                $result |= ord( $answer[$i] ) ^ ord( $test[$i] );
                        }
                        $passwordCorrect = ( $result == 0 );
                }
+
                return $passwordCorrect;
        }
 
@@ -1147,7 +1203,12 @@ class User {
                }
 
                $dbr = wfGetDB( DB_MASTER );
-               $s = $dbr->selectRow( 'user', self::selectFields(), array( 'user_id' => $this->mId ), __METHOD__ );
+               $s = $dbr->selectRow(
+                       'user',
+                       self::selectFields(),
+                       array( 'user_id' => $this->mId ),
+                       __METHOD__
+               );
 
                wfRunHooks( 'UserLoadFromDatabase', array( $this, &$s ) );
 
@@ -1247,7 +1308,7 @@ class User {
        /**
         * Load the data for this user object from another user object.
         *
-        * @param $user User
+        * @param User $user
         */
        protected function loadFromUserObject( $user ) {
                $user->load();
@@ -1283,7 +1344,7 @@ class User {
         *   will not be re-added automatically. The user will also not lose the
         *   group if they no longer meet the criteria.
         *
-        * @param string $event key in $wgAutopromoteOnce (each one has groups/criteria)
+        * @param string $event Key in $wgAutopromoteOnce (each one has groups/criteria)
         *
         * @return array Array of groups the user has been promoted to.
         *
@@ -1327,8 +1388,7 @@ class User {
         * data (i.e. self::$mCacheVars) is not cleared unless $reloadFrom is given.
         *
         * @param bool|string $reloadFrom Reload user and user_groups table data from a
-        *   given source. May be "name", "id", "defaults", "session", or false for
-        *   no reload.
+        *   given source. May be "name", "id", "defaults", "session", or false for no reload.
         */
        public function clearInstanceCache( $reloadFrom = false ) {
                $this->mNewtalk = -1;
@@ -1353,7 +1413,7 @@ class User {
         * Combine the language default options with any site-specific options
         * and add the default language variants.
         *
-        * @return Array of String options
+        * @return array Array of String options
         */
        public static function getDefaultOptions() {
                global $wgNamespacesToBeSearchedDefault, $wgDefaultUserOptions, $wgContLang, $wgDefaultSkin;
@@ -1399,10 +1459,9 @@ class User {
 
        /**
         * Get blocking information
-        * @param bool $bFromSlave Whether to check the slave database first. To
-        *                    improve performance, non-critical checks are done
-        *                    against slaves. Check when actually saving should be
-        *                    done against master.
+        * @param bool $bFromSlave Whether to check the slave database first.
+        *   To improve performance, non-critical checks are done against slaves.
+        *   Check when actually saving should be done against master.
         */
        private function getBlockedStatus( $bFromSlave = true ) {
                global $wgProxyWhitelist, $wgUser, $wgApplyIpBlocksToXff;
@@ -1493,7 +1552,7 @@ class User {
         * Whether the given IP is in a DNS blacklist.
         *
         * @param string $ip IP to check
-        * @param bool $checkWhitelist whether to check the whitelist first
+        * @param bool $checkWhitelist Whether to check the whitelist first
         * @return bool True if blacklisted.
         */
        public function isDnsBlacklisted( $ip, $checkWhitelist = false ) {
@@ -1516,7 +1575,7 @@ class User {
         * Whether the given IP is in a given DNS blacklist.
         *
         * @param string $ip IP to check
-        * @param string|array $bases of Strings: URL of the DNS blacklist
+        * @param string|array $bases Array of Strings: URL of the DNS blacklist
         * @return bool True if blacklisted.
         */
        public function inDnsBlacklist( $ip, $bases ) {
@@ -1562,7 +1621,7 @@ class User {
        /**
         * Check if an IP address is in the local proxy list
         *
-        * @param $ip string
+        * @param string $ip
         *
         * @return bool
         */
@@ -1613,11 +1672,14 @@ class User {
         * Primitive rate limits: enforce maximum actions per time period
         * to put a brake on flooding.
         *
+        * The method generates both a generic profiling point and a per action one
+        * (suffix being "-$action".
+        *
         * @note When using a shared cache like memcached, IP-address
         * last-hit counters will be shared across wikis.
         *
         * @param string $action Action to enforce; 'edit' if unspecified
-        * @param integer $incrBy Positive amount to increment counter by [defaults to 1]
+        * @param int $incrBy Positive amount to increment counter by [defaults to 1]
         * @return bool True if a rate limiter was tripped
         */
        public function pingLimiter( $action = 'edit', $incrBy = 1 ) {
@@ -1639,6 +1701,7 @@ class User {
 
                global $wgMemc;
                wfProfileIn( __METHOD__ );
+               wfProfileIn( __METHOD__ . '-' . $action );
 
                $limits = $wgRateLimits[$action];
                $keys = array();
@@ -1700,7 +1763,8 @@ class User {
                        // Already pinged?
                        if ( $count ) {
                                if ( $count >= $max ) {
-                                       wfDebugLog( 'ratelimit', $this->getName() . " tripped! $key at $count $summary" );
+                                       wfDebugLog( 'ratelimit', "User '{$this->getName()}' " .
+                                               "(IP {$this->getRequest()->getIP()}) tripped $key at $count $summary" );
                                        $triggered = true;
                                } else {
                                        wfDebug( __METHOD__ . ": ok. $key at $count $summary\n" );
@@ -1716,6 +1780,7 @@ class User {
                        }
                }
 
+               wfProfileOut( __METHOD__ . '-' . $action );
                wfProfileOut( __METHOD__ );
                return $triggered;
        }
@@ -1723,10 +1788,11 @@ class User {
        /**
         * Check if user is blocked
         *
-        * @param bool $bFromSlave Whether to check the slave database instead of the master
+        * @param bool $bFromSlave Whether to check the slave database instead of
+        *   the master. Hacked from false due to horrible probs on site.
         * @return bool True if blocked, false otherwise
         */
-       public function isBlocked( $bFromSlave = true ) { // hacked from false due to horrible probs on site
+       public function isBlocked( $bFromSlave = true ) {
                return $this->getBlock( $bFromSlave ) instanceof Block && $this->getBlock()->prevents( 'edit' );
        }
 
@@ -1745,7 +1811,7 @@ class User {
         * Check if user is blocked from editing a particular article
         *
         * @param Title $title Title to check
-        * @param bool $bFromSlave whether to check the slave database instead of the master
+        * @param bool $bFromSlave Whether to check the slave database instead of the master
         * @return bool
         */
        public function isBlockedFrom( $title, $bFromSlave = false ) {
@@ -1971,7 +2037,7 @@ class User {
         * If there are no new messages, it returns an empty array.
         * @note This function was designed to accomodate multiple talk pages, but
         * currently only returns a single link and revision.
-        * @return Array
+        * @return array
         */
        public function getNewMessageLinks() {
                $talks = array();
@@ -2038,7 +2104,7 @@ class User {
         * Add or update the new messages flag
         * @param string $field 'user_ip' for anonymous users, 'user_id' otherwise
         * @param string|int $id User's IP address for anonymous users, User ID otherwise
-        * @param $curRev Revision new, as yet unseen revision of the user talk page. Ignored if null.
+        * @param Revision|null $curRev New, as yet unseen revision of the user talk page. Ignored if null.
         * @return bool True if successful, false otherwise
         */
        protected function updateNewtalk( $field, $id, $curRev = null ) {
@@ -2083,7 +2149,8 @@ class User {
        /**
         * Update the 'You have new messages!' status.
         * @param bool $val Whether the user has new messages
-        * @param $curRev Revision new, as yet unseen revision of the user talk page. Ignored if null or !$val.
+        * @param Revision $curRev New, as yet unseen revision of the user talk
+        *   page. Ignored if null or !$val.
         */
        public function setNewtalk( $val, $curRev = null ) {
                if ( wfReadOnly() ) {
@@ -2190,7 +2257,7 @@ class User {
 
        /**
         * Get the user touched timestamp
-        * @return string timestamp
+        * @return string Timestamp
         */
        public function getTouched() {
                $this->load();
@@ -2267,7 +2334,8 @@ class User {
 
        /**
         * Get the user's current token.
-        * @param bool $forceCreation Force the generation of a new token if the user doesn't have one (default=true for backwards compatibility)
+        * @param bool $forceCreation Force the generation of a new token if the
+        *   user doesn't have one (default=true for backwards compatibility).
         * @return string Token
         */
        public function getToken( $forceCreation = true ) {
@@ -2296,7 +2364,7 @@ class User {
        /**
         * Set the password for a password reminder or new account email
         *
-        * @param $str New password to set or null to set an invalid
+        * @param string $str New password to set or null to set an invalid
         *  password hash meaning that the user will not be able to use it
         * @param bool $throttle If true, reset the throttle timestamp to the present
         */
@@ -2603,8 +2671,9 @@ class User {
         * See User::listOptionKinds for the list of valid option types that can be provided.
         *
         * @see User::listOptionKinds
-        * @param $context IContextSource
-        * @param array $options assoc. array with options keys to check as keys. Defaults to $this->mOptions.
+        * @param IContextSource $context
+        * @param array $options Assoc. array with options keys to check as keys.
+        *   Defaults to $this->mOptions.
         * @return array the key => kind mapping data
         */
        public function getOptionKinds( IContextSource $context, $options = null ) {
@@ -2684,10 +2753,10 @@ class User {
         * Supported values are everything that can be reported by getOptionKinds()
         * and 'all', which forces a reset of *all* preferences and overrides everything else.
         *
-        * @param array|string $resetKinds which kinds of preferences to reset. Defaults to
+        * @param array|string $resetKinds Which kinds of preferences to reset. Defaults to
         *  array( 'registered', 'registered-multiselect', 'registered-checkmatrix', 'unused' )
         *  for backwards-compatibility.
-        * @param $context IContextSource|null context source used when $resetKinds
+        * @param IContextSource|null $context Context source used when $resetKinds
         *  does not contain 'all', passed to getOptionKinds().
         *  Defaults to RequestContext::getMain() when null.
         */
@@ -2786,7 +2855,7 @@ class User {
 
        /**
         * Get the permissions this user has.
-        * @return Array of String permission names
+        * @return array Array of String permission names
         */
        public function getRights() {
                if ( is_null( $this->mRights ) ) {
@@ -2801,7 +2870,7 @@ class User {
        /**
         * Get the list of explicit group memberships this user has.
         * The implicit * and user groups are not included.
-        * @return Array of String internal group names
+        * @return array Array of String internal group names
         */
        public function getGroups() {
                $this->load();
@@ -2814,7 +2883,7 @@ class User {
         * This includes all explicit groups, plus 'user' if logged in,
         * '*' for all accounts, and autopromoted groups
         * @param bool $recache Whether to avoid the cache
-        * @return Array of String internal group names
+        * @return array Array of String internal group names
         */
        public function getEffectiveGroups( $recache = false ) {
                if ( $recache || is_null( $this->mEffectiveGroups ) ) {
@@ -2837,7 +2906,7 @@ class User {
         * This includes 'user' if logged in, '*' for all accounts,
         * and autopromoted groups
         * @param bool $recache Whether to avoid the cache
-        * @return Array of String internal group names
+        * @return array Array of String internal group names
         */
        public function getAutomaticGroups( $recache = false ) {
                if ( $recache || is_null( $this->mImplicitGroups ) ) {
@@ -2887,7 +2956,7 @@ class User {
 
        /**
         * Get the user's edit count.
-        * @return int, null for anonymous users
+        * @return int|null null for anonymous users
         */
        public function getEditCount() {
                if ( !$this->getId() ) {
@@ -3001,7 +3070,7 @@ class User {
         * Check if user is allowed to access a feature / make an action
         *
         * @internal param \String $varargs permissions to test
-        * @return boolean: True if user is allowed to perform *any* of the given actions
+        * @return bool True if user is allowed to perform *any* of the given actions
         *
         * @return bool
         */
@@ -3053,7 +3122,7 @@ class User {
 
        /**
         * Check whether to enable recent changes patrol features for this user
-        * @return boolean: True or false
+        * @return bool True or false
         */
        public function useRCPatrol() {
                global $wgUseRCPatrol;
@@ -3101,8 +3170,8 @@ class User {
         * Get a WatchedItem for this user and $title.
         *
         * @since 1.22 $checkRights parameter added
-        * @param $title Title
-        * @param $checkRights int Whether to check 'viewmywatchlist'/'editmywatchlist' rights.
+        * @param Title $title
+        * @param int $checkRights Whether to check 'viewmywatchlist'/'editmywatchlist' rights.
         *     Pass WatchedItem::CHECK_USER_RIGHTS or WatchedItem::IGNORE_USER_RIGHTS.
         * @return WatchedItem
         */
@@ -3124,8 +3193,8 @@ class User {
        /**
         * Check the watched status of an article.
         * @since 1.22 $checkRights parameter added
-        * @param $title Title of the article to look at
-        * @param $checkRights int Whether to check 'viewmywatchlist'/'editmywatchlist' rights.
+        * @param Title $title Title of the article to look at
+        * @param int $checkRights Whether to check 'viewmywatchlist'/'editmywatchlist' rights.
         *     Pass WatchedItem::CHECK_USER_RIGHTS or WatchedItem::IGNORE_USER_RIGHTS.
         * @return bool
         */
@@ -3136,8 +3205,8 @@ class User {
        /**
         * Watch an article.
         * @since 1.22 $checkRights parameter added
-        * @param $title Title of the article to look at
-        * @param $checkRights int Whether to check 'viewmywatchlist'/'editmywatchlist' rights.
+        * @param Title $title Title of the article to look at
+        * @param int $checkRights Whether to check 'viewmywatchlist'/'editmywatchlist' rights.
         *     Pass WatchedItem::CHECK_USER_RIGHTS or WatchedItem::IGNORE_USER_RIGHTS.
         */
        public function addWatch( $title, $checkRights = WatchedItem::CHECK_USER_RIGHTS ) {
@@ -3148,8 +3217,8 @@ class User {
        /**
         * Stop watching an article.
         * @since 1.22 $checkRights parameter added
-        * @param $title Title of the article to look at
-        * @param $checkRights int Whether to check 'viewmywatchlist'/'editmywatchlist' rights.
+        * @param Title $title Title of the article to look at
+        * @param int $checkRights Whether to check 'viewmywatchlist'/'editmywatchlist' rights.
         *     Pass WatchedItem::CHECK_USER_RIGHTS or WatchedItem::IGNORE_USER_RIGHTS.
         */
        public function removeWatch( $title, $checkRights = WatchedItem::CHECK_USER_RIGHTS ) {
@@ -3162,7 +3231,7 @@ class User {
         * If e-notif e-mails are on, they will receive notification mails on
         * the next change of the page if it's watched etc.
         * @note If the user doesn't have 'editmywatchlist', this will do nothing.
-        * @param $title Title of the article to look at
+        * @param Title $title Title of the article to look at
         * @param int $oldid The revision id being viewed. If not given or 0, latest revision is assumed.
         */
        public function clearNotification( &$title, $oldid = 0 ) {
@@ -3316,7 +3385,7 @@ class User {
        /**
         * Set the default cookies for this session on the user's client.
         *
-        * @param $request WebRequest object to use; $wgRequest will be used if null
+        * @param WebRequest|null $request WebRequest object to use; $wgRequest will be used if null
         *        is passed.
         * @param bool $secure Whether to force secure/insecure cookies or use default
         * @param bool $rememberMe Whether to add a Token cookie for elongated sessions
@@ -3479,17 +3548,20 @@ class User {
         * Add a user to the database, return the user object
         *
         * @param string $name Username to add
-        * @param array $params of Strings Non-default parameters to save to the database as user_* fields:
-        *   - password             The user's password hash. Password logins will be disabled if this is omitted.
-        *   - newpassword          Hash for a temporary password that has been mailed to the user
-        *   - email                The user's email address
-        *   - email_authenticated  The email authentication timestamp
-        *   - real_name            The user's real name
-        *   - options              An associative array of non-default options
-        *   - token                Random authentication token. Do not set.
-        *   - registration         Registration timestamp. Do not set.
-        *
-        * @return User object, or null if the username already exists
+        * @param array $params Array of Strings Non-default parameters to save to
+        *   the database as user_* fields:
+        *   - password: The user's password hash. Password logins will be disabled
+        *     if this is omitted.
+        *   - newpassword: Hash for a temporary password that has been mailed to
+        *     the user.
+        *   - email: The user's email address.
+        *   - email_authenticated: The email authentication timestamp.
+        *   - real_name: The user's real name.
+        *   - options: An associative array of non-default options.
+        *   - token: Random authentication token. Do not set.
+        *   - registration: Registration timestamp. Do not set.
+        *
+        * @return User|null User object, or null if the username already exists.
         */
        public static function createNew( $name, $params = array() ) {
                $user = new User;
@@ -3660,7 +3732,8 @@ class User {
                if ( $this->mBlockedFromCreateAccount === false && !$this->isAllowed( 'ipblock-exempt' ) ) {
                        $this->mBlockedFromCreateAccount = Block::newFromTarget( null, $this->getRequest()->getIP() );
                }
-               return $this->mBlockedFromCreateAccount instanceof Block && $this->mBlockedFromCreateAccount->prevents( 'createaccount' )
+               return $this->mBlockedFromCreateAccount instanceof Block
+                       && $this->mBlockedFromCreateAccount->prevents( 'createaccount' )
                        ? $this->mBlockedFromCreateAccount
                        : false;
        }
@@ -3685,7 +3758,7 @@ class User {
        /**
         * Get this user's personal page title.
         *
-        * @return Title: User's personal page title
+        * @return Title User's personal page title
         */
        public function getUserPage() {
                return Title::makeTitle( NS_USER, $this->getName() );
@@ -3694,7 +3767,7 @@ class User {
        /**
         * Get this user's talk page title.
         *
-        * @return Title: User's talk page title
+        * @return Title User's talk page title
         */
        public function getTalkPage() {
                $title = $this->getUserPage();
@@ -3713,7 +3786,7 @@ class User {
        /**
         * Check to see if the given clear-text password is one of the accepted passwords
         * @param string $password user password.
-        * @return boolean: True if the given password is correct, otherwise False.
+        * @return bool True if the given password is correct, otherwise False.
         */
        public function checkPassword( $password ) {
                global $wgAuth, $wgLegacyEncoding;
@@ -3751,9 +3824,9 @@ class User {
         * Check if the given clear-text password matches the temporary password
         * sent by e-mail for password reset operations.
         *
-        * @param $plaintext string
+        * @param string $plaintext
         *
-        * @return boolean: True if matches, false otherwise
+        * @return bool True if matches, false otherwise
         */
        public function checkTemporaryPassword( $plaintext ) {
                global $wgNewPasswordExpiry;
@@ -3775,7 +3848,7 @@ class User {
         * @deprecated since 1.19, use getEditToken instead.
         *
         * @param string|array $salt of Strings Optional function-specific data for hashing
-        * @param $request WebRequest object to use or null to use $wgRequest
+        * @param WebRequest|null $request WebRequest object to use or null to use $wgRequest
         * @return string The new edit token
         */
        public function editToken( $salt = '', $request = null ) {
@@ -3792,7 +3865,7 @@ class User {
         * @since 1.19
         *
         * @param string|array $salt of Strings Optional function-specific data for hashing
-        * @param $request WebRequest object to use or null to use $wgRequest
+        * @param WebRequest|null $request WebRequest object to use or null to use $wgRequest
         * @return string The new edit token
         */
        public function getEditToken( $salt = '', $request = null ) {
@@ -3819,7 +3892,8 @@ class User {
         * Generate a looking random token for various uses.
         *
         * @return string The new random token
-        * @deprecated since 1.20: Use MWCryptRand for secure purposes or wfRandomString for pseudo-randomness
+        * @deprecated since 1.20: Use MWCryptRand for secure purposes or
+        *   wfRandomString for pseudo-randomness.
         */
        public static function generateToken() {
                return MWCryptRand::generateHex( 32 );
@@ -3833,14 +3907,15 @@ class User {
         *
         * @param string $val Input value to compare
         * @param string $salt Optional function-specific data for hashing
-        * @param WebRequest $request Object to use or null to use $wgRequest
-        * @return boolean: Whether the token matches
+        * @param WebRequest|null $request Object to use or null to use $wgRequest
+        * @return bool Whether the token matches
         */
        public function matchEditToken( $val, $salt = '', $request = null ) {
                $sessionToken = $this->getEditToken( $salt, $request );
                if ( $val != $sessionToken ) {
                        wfDebug( "User::matchEditToken: broken session data\n" );
                }
+
                return $val == $sessionToken;
        }
 
@@ -3850,8 +3925,8 @@ class User {
         *
         * @param string $val Input value to compare
         * @param string $salt Optional function-specific data for hashing
-        * @param WebRequest $request object to use or null to use $wgRequest
-        * @return boolean: Whether the token matches
+        * @param WebRequest|null $request object to use or null to use $wgRequest
+        * @return bool Whether the token matches
         */
        public function matchEditTokenNoSuffix( $val, $salt = '', $request = null ) {
                $sessionToken = $this->getEditToken( $salt, $request );
@@ -3862,8 +3937,8 @@ class User {
         * Generate a new e-mail confirmation token and send a confirmation/invalidation
         * mail to the user's given address.
         *
-        * @param string $type message to send, either "created", "changed" or "set"
-        * @return Status object
+        * @param string $type Message to send, either "created", "changed" or "set"
+        * @return Status
         */
        public function sendConfirmationMail( $type = 'created' ) {
                global $wgLang;
@@ -3899,7 +3974,8 @@ class User {
         *
         * @param string $subject Message subject
         * @param string $body Message body
-        * @param string $from Optional From address; if unspecified, default $wgPasswordSender will be used
+        * @param string $from Optional From address; if unspecified, default
+        *   $wgPasswordSender will be used.
         * @param string $replyto Reply-To address
         * @return Status
         */
@@ -3923,7 +3999,7 @@ class User {
         * @note Call saveSettings() after calling this function to commit
         * this change to the database.
         *
-        * @param &$expiration \mixed Accepts the expiration time
+        * @param string &$expiration Accepts the expiration time
         * @return string New token
         */
        protected function confirmationToken( &$expiration ) {
@@ -4126,8 +4202,8 @@ class User {
        /**
         * Get the permissions associated with a given list of groups
         *
-        * @param array $groups of Strings List of internal group names
-        * @return Array of Strings List of permission key names for given groups combined
+        * @param array $groups Array of Strings List of internal group names
+        * @return array Array of Strings List of permission key names for given groups combined
         */
        public static function getGroupPermissions( $groups ) {
                global $wgGroupPermissions, $wgRevokePermissions;
@@ -4154,7 +4230,7 @@ class User {
         * Get all the groups who have a given permission
         *
         * @param string $role Role to check
-        * @return Array of Strings List of internal group names with the given permission
+        * @return array Array of Strings List of internal group names with the given permission
         */
        public static function getGroupsWithPermission( $role ) {
                global $wgGroupPermissions;
@@ -4252,7 +4328,7 @@ class User {
         * Return the set of defined explicit groups.
         * The implicit groups (by default *, 'user' and 'autoconfirmed')
         * are not included, as they are defined automatically, not in the database.
-        * @return Array of internal group names
+        * @return array Array of internal group names
         */
        public static function getAllGroups() {
                global $wgGroupPermissions, $wgRevokePermissions;
@@ -4264,7 +4340,7 @@ class User {
 
        /**
         * Get a list of all available permissions.
-        * @return Array of permission names
+        * @return array Array of permission names
         */
        public static function getAllRights() {
                if ( self::$mAllRights === false ) {
@@ -4281,12 +4357,15 @@ class User {
 
        /**
         * Get a list of implicit groups
-        * @return Array of Strings Array of internal group names
+        * @return array Array of Strings Array of internal group names
         */
        public static function getImplicitGroups() {
                global $wgImplicitGroups;
+
                $groups = $wgImplicitGroups;
-               wfRunHooks( 'UserGetImplicitGroups', array( &$groups ) );       #deprecated, use $wgImplictGroups instead
+               # Deprecated, use $wgImplictGroups instead
+               wfRunHooks( 'UserGetImplicitGroups', array( &$groups ) );
+
                return $groups;
        }
 
@@ -4351,8 +4430,8 @@ class User {
        /**
         * Returns an array of the groups that a particular group can add/remove.
         *
-        * @param string $group the group to check for whether it can add/remove
-        * @return Array array( 'add' => array( addablegroups ),
+        * @param string $group The group to check for whether it can add/remove
+        * @return array array( 'add' => array( addablegroups ),
         *     'remove' => array( removablegroups ),
         *     'add-self' => array( addablegroups to self),
         *     'remove-self' => array( removable groups from self) )
@@ -4360,7 +4439,13 @@ class User {
        public static function changeableByGroup( $group ) {
                global $wgAddGroups, $wgRemoveGroups, $wgGroupsAddToSelf, $wgGroupsRemoveFromSelf;
 
-               $groups = array( 'add' => array(), 'remove' => array(), 'add-self' => array(), 'remove-self' => array() );
+               $groups = array(
+                       'add' => array(),
+                       'remove' => array(),
+                       'add-self' => array(),
+                       'remove-self' => array()
+               );
+
                if ( empty( $wgAddGroups[$group] ) ) {
                        // Don't add anything to $groups
                } elseif ( $wgAddGroups[$group] === true ) {
@@ -4416,7 +4501,7 @@ class User {
 
        /**
         * Returns an array of groups that this user can add and remove
-        * @return Array array( 'add' => array( addablegroups ),
+        * @return array array( 'add' => array( addablegroups ),
         *  'remove' => array( removablegroups ),
         *  'add-self' => array( addablegroups to self),
         *  'remove-self' => array( removable groups from self) )
@@ -4495,8 +4580,8 @@ class User {
        /**
         * Initialize user_editcount from data out of the revision table
         *
-        * @param $add Integer Edits to add to the count from the revision table
-        * @return integer Number of edits
+        * @param int $add Edits to add to the count from the revision table
+        * @return int Number of edits
         */
        protected function initEditCount( $add = 0 ) {
                // Pull from a slave to be less cruel to servers
@@ -4583,7 +4668,7 @@ class User {
         * @param string $password Plain-text password to compare
         * @param string|bool $userId User ID for old-style password salt
         *
-        * @return boolean
+        * @return bool
         */
        public static function comparePasswords( $hash, $password, $userId = false ) {
                $type = substr( $hash, 0, 3 );
@@ -4610,7 +4695,7 @@ class User {
         * Add a newuser log entry for this user.
         * Before 1.19 the return value was always true.
         *
-        * @param string|bool $action account creation type.
+        * @param string|bool $action Account creation type.
         *   - String, one of the following values:
         *     - 'create' for an anonymous user creating an account for himself.
         *       This will force the action's performer to be the created user itself,
@@ -4623,7 +4708,7 @@ class User {
         *     - false will be converted to 'create' if this object is the same as
         *       $wgUser and to 'create2' otherwise
         *
-        * @param string $reason user supplied reason
+        * @param string $reason User supplied reason
         *
         * @return int|bool True if not $wgNewUserLog; otherwise ID of log item or 0 on failure
         */
index 0012b44..dd67acd 100644 (file)
  */
 
 class UserArrayFromResult extends UserArray implements Countable {
+       /** @var ResultWrapper */
+       public $res;
 
-       /**
-        * @var ResultWrapper
-        */
-       var $res;
-       var $key, $current;
+       /** @var int */
+       public $key;
+
+       /** @var  */
+       public $current;
 
        /**
         * @param ResultWrapper $res
index de4457d..d3e8cb8 100644 (file)
@@ -31,9 +31,9 @@
  */
 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
+        * @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 ) {
@@ -58,7 +58,7 @@ class MailAddress {
                if ( $this->address ) {
                        if ( $this->name != '' && !wfIsWindows() ) {
                                global $wgEnotifUseRealName;
-                               $name = ( $wgEnotifUseRealName && $this->realName ) ? $this->realName : $this->name;
+                               $name = ( $wgEnotifUseRealName && $this->realName !== '' ) ? $this->realName : $this->name;
                                $quoted = UserMailer::quotedPrintable( $name );
                                if ( strpos( $quoted, '.' ) !== false || strpos( $quoted, ',' ) !== false ) {
                                        $quoted = '"' . $quoted . '"';
@@ -81,15 +81,15 @@ class MailAddress {
  * Collection of static functions for sending mail
  */
 class UserMailer {
-       static $mErrorString;
+       private static $mErrorString;
 
        /**
         * Send mail using a PEAR mailer
         *
-        * @param $mailer
-        * @param $dest
-        * @param $headers
-        * @param $body
+        * @param UserMailer $mailer
+        * @param string $dest
+        * @param string $headers
+        * @param string $body
         *
         * @return Status
         */
@@ -115,7 +115,7 @@ class UserMailer {
         * 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
+        * @return string
         */
        static function arrayToHeaderString( $headers, $endl = "\n" ) {
                $strings = array();
@@ -130,7 +130,7 @@ class UserMailer {
        /**
         * Create a value suitable for the MessageId Header
         *
-        * @return String
+        * @return string
         */
        static function makeMsgId() {
                global $wgSMTP, $wgServer;
@@ -151,16 +151,18 @@ class UserMailer {
         * array of parameters. It requires PEAR:Mail to do that.
         * Otherwise it just uses the standard PHP 'mail' function.
         *
-        * @param $to MailAddress: recipient's email (or an array of them)
-        * @param $from MailAddress: 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 $replyto MailAddress: optional reply-to email (default: null).
-        * @param string $contentType optional custom Content-Type (default: text/plain; charset=UTF-8)
+        * @param 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
-        * @return Status object
+        * @return Status
         */
-       public static function send( $to, $from, $subject, $body, $replyto = null, $contentType = 'text/plain; charset=UTF-8' ) {
+       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 ) ) {
@@ -268,7 +270,11 @@ class UserMailer {
                                        $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 = 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()
@@ -360,7 +366,13 @@ class UserMailer {
                                        if ( $safeMode ) {
                                                $sent = mail( $recip, self::quotedPrintable( $subject ), $body, $headers );
                                        } else {
-                                               $sent = mail( $recip, self::quotedPrintable( $subject ), $body, $headers, $wgAdditionalMailParams );
+                                               $sent = mail(
+                                                       $recip,
+                                                       self::quotedPrintable( $subject ),
+                                                       $body,
+                                                       $headers,
+                                                       $wgAdditionalMailParams
+                                               );
                                        }
                                }
                        } catch ( Exception $e ) {
@@ -387,8 +399,8 @@ class UserMailer {
        /**
         * Set the mail error message in self::$mErrorString
         *
-        * @param $code Integer: error number
-        * @param string $string error message
+        * @param int $code Error number
+        * @param string $string Error message
         */
        static function errorHandler( $code, $string ) {
                self::$mErrorString = preg_replace( '/^mail\(\)(\s*\[.*?\])?: /', '', $string );
@@ -405,7 +417,7 @@ class UserMailer {
 
        /**
         * Converts a string into a valid RFC 822 "phrase", such as is used for the sender name
-        * @param $phrase string
+        * @param string $phrase
         * @return string
         */
        public static function rfc822Phrase( $phrase ) {
@@ -493,15 +505,17 @@ class EmailNotification {
         *
         * May be deferred via the job queue.
         *
-        * @param $editor User object
-        * @param $title Title object
-        * @param $timestamp
-        * @param $summary
-        * @param $minorEdit
-        * @param $oldid (default: false)
-        * @param $pageStatus (default: 'changed')
+        * @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' ) {
+       public function notifyOnPageChange( $editor, $title, $timestamp, $summary,
+               $minorEdit, $oldid = false, $pageStatus = 'changed'
+       ) {
                global $wgEnotifUseJobQ, $wgEnotifWatchlist, $wgShowUpdatedMarker, $wgEnotifMinorEdits,
                        $wgUsersNotifiedOnAllChanges, $wgEnotifUserTalk;
 
@@ -555,7 +569,10 @@ class EmailNotification {
                        // 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 ) ) {
+                               if ( $wgEnotifUserTalk
+                                       && $isUserTalkPage
+                                       && $this->canSendUserTalkEmail( $editor, $title, $minorEdit )
+                               ) {
                                        $sendEmail = true;
                                }
                        }
@@ -564,6 +581,7 @@ class EmailNotification {
                if ( !$sendEmail ) {
                        return;
                }
+
                if ( $wgEnotifUseJobQ ) {
                        $params = array(
                                'editor' => $editor->getName(),
@@ -578,7 +596,16 @@ class EmailNotification {
                        $job = new EnotifNotifyJob( $title, $params );
                        JobQueueGroup::singleton()->push( $job );
                } else {
-                       $this->actuallyNotifyOnPageChange( $editor, $title, $timestamp, $summary, $minorEdit, $oldid, $watchers, $pageStatus );
+                       $this->actuallyNotifyOnPageChange(
+                               $editor,
+                               $title,
+                               $timestamp,
+                               $summary,
+                               $minorEdit,
+                               $oldid,
+                               $watchers,
+                               $pageStatus
+                       );
                }
        }
 
@@ -588,13 +615,13 @@ class EmailNotification {
         * Send emails corresponding to the user $editor editing the page $title.
         * Also updates wl_notificationtimestamp.
         *
-        * @param $editor User object
-        * @param $title Title object
+        * @param User $editor
+        * @param Title $title
         * @param string $timestamp Edit timestamp
         * @param string $summary Edit summary
-        * @param $minorEdit bool
+        * @param bool $minorEdit
         * @param int $oldid Revision ID
-        * @param array $watchers of user IDs
+        * @param array $watchers Array of user IDs
         * @param string $pageStatus
         * @throws MWException
         */
@@ -632,8 +659,10 @@ class EmailNotification {
                $userTalkId = false;
 
                if ( !$minorEdit || ( $wgEnotifMinorEdits && !$editor->isAllowed( 'nominornewtalk' ) ) ) {
-
-                       if ( $wgEnotifUserTalk && $isUserTalkPage && $this->canSendUserTalkEmail( $editor, $title, $minorEdit ) ) {
+                       if ( $wgEnotifUserTalk
+                               && $isUserTalkPage
+                               && $this->canSendUserTalkEmail( $editor, $title, $minorEdit )
+                       ) {
                                $targetUser = User::newFromName( $title->getText() );
                                $this->compose( $targetUser );
                                $userTalkId = $targetUser->getId();
@@ -671,9 +700,9 @@ class EmailNotification {
        }
 
        /**
-        * @param $editor User
-        * @param $title Title bool
-        * @param $minorEdit
+        * @param User $editor
+        * @param Title $title
+        * @param bool $minorEdit
         * @return bool
         */
        private function canSendUserTalkEmail( $editor, $title, $minorEdit ) {
@@ -738,13 +767,13 @@ class EmailNotification {
                                        ->inContentLanguage()->text();
                        }
                        $keys['$OLDID'] = $this->oldid;
-                       // @deprecated Remove in MediaWiki 1.23.
+                       // 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 Remove in MediaWiki 1.23.
+                       // Deprecated since MediaWiki 1.21, not used by default. Kept for backwards-compatibility.
                        $keys['$CHANGEDORCREATED'] = wfMessage( 'created' )->inContentLanguage()->text();
                }
 
@@ -761,12 +790,16 @@ class EmailNotification {
                        $keys['$PAGEEDITOR_EMAIL'] = wfMessage( 'noemailtitle' )->inContentLanguage()->text();
 
                } else {
-                       $keys['$PAGEEDITOR'] = $wgEnotifUseRealName ? $this->editor->getRealName() : $this->editor->getName();
+                       $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;
@@ -818,7 +851,7 @@ class EmailNotification {
         * depending on settings.
         *
         * Call sendMails() to send any mails that were queued.
-        * @param $user User
+        * @param User $user
         */
        function compose( $user ) {
                global $wgEnotifImpersonal;
@@ -849,15 +882,16 @@ class EmailNotification {
         * timestamp in proper timezone, etc) and sends it out.
         * Returns true if the mail was sent successfully.
         *
-        * @param $watchingUser User object
-        * @return Boolean
+        * @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.
+               //   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
@@ -867,7 +901,8 @@ class EmailNotification {
                        array( '$WATCHINGUSERNAME',
                                '$PAGEEDITDATE',
                                '$PAGEEDITTIME' ),
-                       array( $wgEnotifUseRealName ? $watchingUser->getRealName() : $watchingUser->getName(),
+                       array( $wgEnotifUseRealName && $watchingUser->getRealName() !== ''
+                                       ? $watchingUser->getRealName() : $watchingUser->getName(),
                                $wgContLang->userDate( $this->timestamp, $watchingUser ),
                                $wgContLang->userTime( $this->timestamp, $watchingUser ) ),
                        $this->body );
@@ -878,7 +913,7 @@ class EmailNotification {
        /**
         * Same as sendPersonalised but does impersonal mail suitable for bulk
         * mailing.  Takes an array of MailAddress objects.
-        * @param $addresses array
+        * @param MailAddress[] $addresses
         * @return Status|null
         */
        function sendImpersonal( $addresses ) {
index a8a22be..e3655ce 100644 (file)
@@ -31,10 +31,10 @@ class UserRightsProxy {
         *
         * @see newFromId()
         * @see newFromName()
-        * @param $db DatabaseBase: db connection
-        * @param string $database database name
-        * @param string $name user name
-        * @param $id Integer: user ID
+        * @param DatabaseBase $db Db connection
+        * @param string $database Database name
+        * @param string $name User name
+        * @param int $id User ID
         */
        private function __construct( $db, $database, $name, $id ) {
                $this->db = $db;
@@ -47,7 +47,7 @@ class UserRightsProxy {
        /**
         * Accessor for $this->database
         *
-        * @return String: database name
+        * @return string Database name
         */
        public function getDBName() {
                return $this->database;
@@ -56,8 +56,8 @@ class UserRightsProxy {
        /**
         * Confirm the selected database name is a valid local interwiki database name.
         *
-        * @param string $database database name
-        * @return Boolean
+        * @param string $database Database name
+        * @return bool
         */
        public static function validDatabase( $database ) {
                global $wgLocalDatabases;
@@ -67,10 +67,10 @@ class UserRightsProxy {
        /**
         * Same as User::whoIs()
         *
-        * @param string $database database name
-        * @param $id Integer: user ID
-        * @param $ignoreInvalidDB Boolean: if true, don't check if $database is in $wgLocalDatabases
-        * @return String: user name or false if the user doesn't exist
+        * @param string $database Database name
+        * @param int $id User ID
+        * @param bool $ignoreInvalidDB If true, don't check if $database is in $wgLocalDatabases
+        * @return string User name or false if the user doesn't exist
         */
        public static function whoIs( $database, $id, $ignoreInvalidDB = false ) {
                $user = self::newFromId( $database, $id, $ignoreInvalidDB );
@@ -84,10 +84,10 @@ class UserRightsProxy {
        /**
         * Factory function; get a remote user entry by ID number.
         *
-        * @param string $database database name
-        * @param $id Integer: user ID
-        * @param $ignoreInvalidDB Boolean: if true, don't check if $database is in $wgLocalDatabases
-        * @return UserRightsProxy or null if doesn't exist
+        * @param string $database Database name
+        * @param int $id User ID
+        * @param bool $ignoreInvalidDB If true, don't check if $database is in $wgLocalDatabases
+        * @return UserRightsProxy|null If doesn't exist
         */
        public static function newFromId( $database, $id, $ignoreInvalidDB = false ) {
                return self::newFromLookup( $database, 'user_id', intval( $id ), $ignoreInvalidDB );
@@ -96,20 +96,20 @@ class UserRightsProxy {
        /**
         * Factory function; get a remote user entry by name.
         *
-        * @param string $database database name
-        * @param string $name user name
-        * @param $ignoreInvalidDB Boolean: if true, don't check if $database is in $wgLocalDatabases
-        * @return UserRightsProxy or null if doesn't exist
+        * @param string $database Database name
+        * @param string $name User name
+        * @param bool $ignoreInvalidDB If true, don't check if $database is in $wgLocalDatabases
+        * @return UserRightsProxy|null If doesn't exist
         */
        public static function newFromName( $database, $name, $ignoreInvalidDB = false ) {
                return self::newFromLookup( $database, 'user_name', $name, $ignoreInvalidDB );
        }
 
        /**
-        * @param $database
-        * @param $field
-        * @param $value
-        * @param $ignoreInvalidDB bool
+        * @param string $database
+        * @param string $field
+        * @param string $value
+        * @param bool $ignoreInvalidDB
         * @return null|UserRightsProxy
         */
        private static function newFromLookup( $database, $field, $value, $ignoreInvalidDB = false ) {
@@ -132,9 +132,9 @@ class UserRightsProxy {
         * Open a database connection to work on for the requested user.
         * This may be a new connection to another database for remote users.
         *
-        * @param $database String
-        * @param $ignoreInvalidDB Boolean: if true, don't check if $database is in $wgLocalDatabases
-        * @return DatabaseBase or null if invalid selection
+        * @param string $database
+        * @param bool $ignoreInvalidDB If true, don't check if $database is in $wgLocalDatabases
+        * @return DatabaseBase|null If invalid selection
         */
        public static function getDB( $database, $ignoreInvalidDB = false ) {
                global $wgDBname;
@@ -166,7 +166,7 @@ class UserRightsProxy {
        /**
         * Same as User::getName()
         *
-        * @return String
+        * @return string
         */
        public function getName() {
                return $this->name . '@' . $this->database;
@@ -175,7 +175,7 @@ class UserRightsProxy {
        /**
         * Same as User::getUserPage()
         *
-        * @return Title object
+        * @return Title
         */
        public function getUserPage() {
                return Title::makeTitle( NS_USER, $this->getName() );
@@ -199,6 +199,7 @@ class UserRightsProxy {
 
        /**
         * Replaces User::addUserGroup()
+        * @param string $group
         */
        function addGroup( $group ) {
                $this->db->insert( 'user_groups',
@@ -212,6 +213,7 @@ class UserRightsProxy {
 
        /**
         * Replaces User::removeUserGroup()
+        * @param string $group
         */
        function removeGroup( $group ) {
                $this->db->delete( 'user_groups',
@@ -224,6 +226,8 @@ class UserRightsProxy {
 
        /**
         * Replaces User::setOption()
+        * @param string $option
+        * @param mixed $value
         */
        public function setOption( $option, $value ) {
                $this->newOptions[$option] = $value;
index a6e7516..f69fe63 100644 (file)
@@ -41,19 +41,36 @@ class WatchedItem {
         */
        const CHECK_USER_RIGHTS = 1;
 
-       var $mTitle, $mUser, $mCheckRights;
-       private $loaded = false, $watched, $timestamp;
+       /** @var Title */
+       public $mTitle;
+
+       /** @var User */
+       public $mUser;
+
+       /** @var int */
+       public $mCheckRights;
+
+       /** @var bool */
+       private $loaded = false;
+
+       /** @var bool */
+       private $watched;
+
+       /** @var string */
+       private $timestamp;
 
        /**
         * Create a WatchedItem object with the given user and title
         * @since 1.22 $checkRights parameter added
-        * @param $user User: the user to use for (un)watching
-        * @param $title Title: the title we're going to (un)watch
-        * @param $checkRights int: Whether to check the 'viewmywatchlist' and 'editmywatchlist' rights.
+        * @param User $user The user to use for (un)watching
+        * @param Title $title The title we're going to (un)watch
+        * @param int $checkRights Whether to check the 'viewmywatchlist' and 'editmywatchlist' rights.
         *     Pass either WatchedItem::IGNORE_USER_RIGHTS or WatchedItem::CHECK_USER_RIGHTS.
-        * @return WatchedItem object
+        * @return WatchedItem
         */
-       public static function fromUserTitle( $user, $title, $checkRights = WatchedItem::CHECK_USER_RIGHTS ) {
+       public static function fromUserTitle( $user, $title,
+               $checkRights = WatchedItem::CHECK_USER_RIGHTS
+       ) {
                $wl = new WatchedItem;
                $wl->mUser = $user;
                $wl->mTitle = $title;
@@ -146,7 +163,7 @@ class WatchedItem {
 
        /**
         * Check permissions
-        * @param $what string: 'viewmywatchlist' or 'editmywatchlist'
+        * @param string $what 'viewmywatchlist' or 'editmywatchlist'
         */
        private function isAllowed( $what ) {
                return !$this->mCheckRights || $this->mUser->isAllowed( $what );
@@ -168,8 +185,8 @@ class WatchedItem {
        /**
         * Get the notification timestamp of this entry.
         *
-        * @return false|null|string: false if the page is not watched, the value of
-        *         the wl_notificationtimestamp field otherwise
+        * @return bool|null|string False if the page is not watched, the value of
+        *   the wl_notificationtimestamp field otherwise
         */
        public function getNotificationTimestamp() {
                if ( !$this->isAllowed( 'viewmywatchlist' ) ) {
@@ -187,8 +204,8 @@ class WatchedItem {
        /**
         * Reset the notification timestamp of this entry
         *
-        * @param $force Whether to force the write query to be executed even if the
-        *        page is not watched or the notification timestamp is already NULL.
+        * @param bool $force Whether to force the write query to be executed even if the
+        *    page is not watched or the notification timestamp is already NULL.
         * @param int $oldid The revision id being viewed. If not given or 0, latest revision is assumed.
         */
        public function resetNotificationTimestamp( $force = '', $oldid = 0 ) {
@@ -253,8 +270,7 @@ class WatchedItem {
        }
 
        /**
-        * Given a title and user (assumes the object is setup), add the watch to the
-        * database.
+        * Given a title and user (assumes the object is setup), add the watch to the database.
         * @return bool
         */
        public function addWatch() {
@@ -345,8 +361,8 @@ class WatchedItem {
         * Check if the given title already is watched by the user, and if so
         * add watches on a new title. To be used for page renames and such.
         *
-        * @param $ot Title: page title to duplicate entries from, if present
-        * @param $nt Title: page title to add watches on
+        * @param Title $ot Page title to duplicate entries from, if present
+        * @param Title $nt Page title to add watches on
         */
        public static function duplicateEntries( $ot, $nt ) {
                WatchedItem::doDuplicateEntries( $ot->getSubjectPage(), $nt->getSubjectPage() );
@@ -356,8 +372,8 @@ class WatchedItem {
        /**
         * Handle duplicate entries. Backend for duplicateEntries().
         *
-        * @param $ot Title
-        * @param $nt Title
+        * @param Title $ot
+        * @param Title $nt
         *
         * @return bool
         */
@@ -390,7 +406,13 @@ class WatchedItem {
                # Perform replace
                # Note that multi-row replace is very efficient for MySQL but may be inefficient for
                # some other DBMSes, mostly due to poor simulation by us
-               $dbw->replace( 'watchlist', array( array( 'wl_user', 'wl_namespace', 'wl_title' ) ), $values, __METHOD__ );
+               $dbw->replace(
+                       'watchlist',
+                       array( array( 'wl_user', 'wl_namespace', 'wl_title' ) ),
+                       $values,
+                       __METHOD__
+               );
+
                return true;
        }
 }
index 01366f4..ecc2372 100644 (file)
@@ -46,7 +46,7 @@ class WebRequest {
 
        /**
         * Cached client IP address
-        * @var String
+        * @var string
         */
        private $ip;
 
@@ -80,7 +80,7 @@ class WebRequest {
         * will return an empty array if it determines that the URL is
         * inside a rewrite path.
         *
-        * @return Array: Any query arguments found in path matches.
+        * @return array Any query arguments found in path matches.
         */
        public static function getPathInfo( $want = 'all' ) {
                global $wgUsePathInfo;
@@ -246,11 +246,11 @@ class WebRequest {
         * URL rewriting function; tries to extract page title and,
         * optionally, one other fixed parameter value from a URL path.
         *
-        * @param string $path the URL path given from the client
-        * @param array $bases one or more URLs, optionally with $1 at the end
-        * @param string $key if provided, the matching key in $bases will be
-        *             passed on as the value of this URL parameter
-        * @return array of URL variables to interpolate; empty if no match
+        * @param string $path The URL path given from the client
+        * @param array $bases One or more URLs, optionally with $1 at the end
+        * @param string $key If provided, the matching key in $bases will be
+        *    passed on as the value of this URL parameter
+        * @return array Array of URL variables to interpolate; empty if no match
         */
        static function extractTitle( $path, $bases, $key = false ) {
                foreach ( (array)$bases as $keyValue => $base ) {
@@ -279,7 +279,7 @@ class WebRequest {
         * @param bool $topLevel Specifies if the array passed is from the top
         * level of the source. In PHP5 magic_quotes only escapes the first level
         * of keys that belong to an array.
-        * @return array the original array
+        * @return array The original array
         * @see http://www.php.net/manual/en/function.get-magic-quotes-gpc.php#49612
         */
        private function &fix_magic_quotes( &$arr, $topLevel = true ) {
@@ -319,8 +319,8 @@ class WebRequest {
        /**
         * Recursively normalizes UTF-8 strings in the given array.
         *
-        * @param $data string|array
-        * @return array|string cleaned-up version of the given
+        * @param string|array $data
+        * @return array|string Cleaned-up version of the given
         * @private
         */
        function normalizeUnicode( $data ) {
@@ -338,9 +338,9 @@ class WebRequest {
        /**
         * Fetch a value from the given array or return $default if it's not set.
         *
-        * @param $arr Array
-        * @param $name String
-        * @param $default Mixed
+        * @param array $arr
+        * @param string $name
+        * @param mixed $default
         * @return mixed
         */
        private function getGPCVal( $arr, $name, $default ) {
@@ -370,9 +370,9 @@ class WebRequest {
         * non-freeform text inputs (e.g. predefined internal text keys
         * selected by a drop-down menu). For freeform input, see getText().
         *
-        * @param $name String
-        * @param string $default optional default (or NULL)
-        * @return String
+        * @param string $name
+        * @param string $default Optional default (or null)
+        * @return string
         */
        public function getVal( $name, $default = null ) {
                $val = $this->getGPCVal( $this->data, $name, $default );
@@ -389,9 +389,9 @@ class WebRequest {
        /**
         * Set an arbitrary value into our get/post data.
         *
-        * @param string $key key name to use
-        * @param $value Mixed: value to set
-        * @return Mixed: old value if one was present, null otherwise
+        * @param string $key Key name to use
+        * @param mixed $value Value to set
+        * @return mixed Old value if one was present, null otherwise
         */
        public function setVal( $key, $value ) {
                $ret = isset( $this->data[$key] ) ? $this->data[$key] : null;
@@ -402,8 +402,8 @@ class WebRequest {
        /**
         * Unset an arbitrary value from our get/post data.
         *
-        * @param string $key key name to use
-        * @return Mixed: old value if one was present, null otherwise
+        * @param string $key Key name to use
+        * @return mixed Old value if one was present, null otherwise
         */
        public function unsetVal( $key ) {
                if ( !isset( $this->data[$key] ) ) {
@@ -418,11 +418,11 @@ class WebRequest {
        /**
         * Fetch an array from the input or return $default if it's not set.
         * If source was scalar, will return an array with a single element.
-        * If no source and no default, returns NULL.
+        * If no source and no default, returns null.
         *
-        * @param $name String
-        * @param array $default optional default (or NULL)
-        * @return Array
+        * @param string $name
+        * @param array $default Optional default (or null)
+        * @return array
         */
        public function getArray( $name, $default = null ) {
                $val = $this->getGPCVal( $this->data, $name, $default );
@@ -436,12 +436,12 @@ class WebRequest {
        /**
         * Fetch an array of integers, or return $default if it's not set.
         * If source was scalar, will return an array with a single element.
-        * If no source and no default, returns NULL.
+        * If no source and no default, returns null.
         * If an array is returned, contents are guaranteed to be integers.
         *
-        * @param $name String
-        * @param array $default option default (or NULL)
-        * @return Array of ints
+        * @param string $name
+        * @param array $default Option default (or null)
+        * @return array Array of ints
         */
        public function getIntArray( $name, $default = null ) {
                $val = $this->getArray( $name, $default );
@@ -456,9 +456,9 @@ class WebRequest {
         * Guaranteed to return an integer; non-numeric input will typically
         * return 0.
         *
-        * @param $name String
-        * @param $default Integer
-        * @return Integer
+        * @param string $name
+        * @param int $default
+        * @return int
         */
        public function getInt( $name, $default = 0 ) {
                return intval( $this->getVal( $name, $default ) );
@@ -469,8 +469,8 @@ class WebRequest {
         * Guaranteed to return an integer or null; non-numeric input will
         * typically return null.
         *
-        * @param $name String
-        * @return Integer
+        * @param string $name
+        * @return int|null
         */
        public function getIntOrNull( $name ) {
                $val = $this->getVal( $name );
@@ -485,11 +485,11 @@ class WebRequest {
         * return 0.
         *
         * @since 1.23
-        * @param $name String
-        * @param $default Float
-        * @return Float
+        * @param string $name
+        * @param float $default
+        * @return float
         */
-       public function getFloat( $name, $default = 0 ) {
+       public function getFloat( $name, $default = 0.0 ) {
                return floatval( $this->getVal( $name, $default ) );
        }
 
@@ -498,9 +498,9 @@ class WebRequest {
         * Guaranteed to return true or false, with normal PHP semantics for
         * boolean interpretation of strings.
         *
-        * @param $name String
-        * @param $default Boolean
-        * @return Boolean
+        * @param string $name
+        * @param bool $default
+        * @return bool
         */
        public function getBool( $name, $default = false ) {
                return (bool)$this->getVal( $name, $default );
@@ -511,9 +511,9 @@ class WebRequest {
         * Unlike getBool, the string "false" will result in boolean false, which is
         * useful when interpreting information sent from JavaScript.
         *
-        * @param $name String
-        * @param $default Boolean
-        * @return Boolean
+        * @param string $name
+        * @param bool $default
+        * @return bool
         */
        public function getFuzzyBool( $name, $default = false ) {
                return $this->getBool( $name, $default ) && strcasecmp( $this->getVal( $name ), 'false' ) !== 0;
@@ -524,8 +524,8 @@ class WebRequest {
         * value is (even "0"). Return false if the named value is not set.
         * Example use is checking for the presence of check boxes in forms.
         *
-        * @param $name String
-        * @return Boolean
+        * @param string $name
+        * @return bool
         */
        public function getCheck( $name ) {
                # Checkboxes and buttons are only present when clicked
@@ -541,9 +541,9 @@ class WebRequest {
         * user-supplied freeform text input (for which input transformations may
         * be required - e.g.  Esperanto x-coding).
         *
-        * @param $name String
-        * @param string $default optional
-        * @return String
+        * @param string $name
+        * @param string $default Optional
+        * @return string
         */
        public function getText( $name, $default = '' ) {
                global $wgContLang;
@@ -578,7 +578,7 @@ class WebRequest {
        /**
         * Returns the names of all input values excluding those in $exclude.
         *
-        * @param $exclude Array
+        * @param array $exclude
         * @return array
         */
        public function getValueNames( $exclude = array() ) {
@@ -589,7 +589,7 @@ class WebRequest {
         * Get the values passed in the query string.
         * No transformation is performed on the values.
         *
-        * @return Array
+        * @return array
         */
        public function getQueryValues() {
                return $_GET;
@@ -599,7 +599,7 @@ class WebRequest {
         * Return the contents of the Query with no decoding. Use when you need to
         * know exactly what was sent, e.g. for an OAuth signature over the elements.
         *
-        * @return String
+        * @return string
         */
        public function getRawQueryString() {
                return $_SERVER['QUERY_STRING'];
@@ -609,7 +609,7 @@ class WebRequest {
         * Return the contents of the POST with no decoding. Use when you need to
         * know exactly what was sent, e.g. for an OAuth signature over the elements.
         *
-        * @return String
+        * @return string
         */
        public function getRawPostString() {
                if ( !$this->wasPosted() ) {
@@ -623,11 +623,11 @@ class WebRequest {
         * disallow reading the stream more than once. As stated in the php docs, this
         * does not work with enctype="multipart/form-data".
         *
-        * @return String
+        * @return string
         */
        public function getRawInput() {
-               static $input = false;
-               if ( $input === false ) {
+               static $input = null;
+               if ( $input === null ) {
                        $input = file_get_contents( 'php://input' );
                }
                return $input;
@@ -636,7 +636,7 @@ class WebRequest {
        /**
         * Get the HTTP method used for this request.
         *
-        * @return String
+        * @return string
         */
        public function getMethod() {
                return isset( $_SERVER['REQUEST_METHOD'] ) ? $_SERVER['REQUEST_METHOD'] : 'GET';
@@ -649,7 +649,7 @@ class WebRequest {
         * Note that values retrieved by the object may come from the
         * GET URL etc even on a POST request.
         *
-        * @return Boolean
+        * @return bool
         */
        public function wasPosted() {
                return $this->getMethod() == 'POST';
@@ -664,7 +664,7 @@ class WebRequest {
         * during the current request (in which case the cookie will
         * be sent back to the client at the end of the script run).
         *
-        * @return Boolean
+        * @return bool
         */
        public function checkSessionCookie() {
                return isset( $_COOKIE[session_name()] );
@@ -673,10 +673,10 @@ class WebRequest {
        /**
         * Get a cookie from the $_COOKIE jar
         *
-        * @param string $key the name of the cookie
-        * @param string $prefix a prefix to use for the cookie name, if not $wgCookiePrefix
-        * @param $default Mixed: what to return if the value isn't found
-        * @return Mixed: cookie value or $default if the cookie not set
+        * @param string $key The name of the cookie
+        * @param string $prefix A prefix to use for the cookie name, if not $wgCookiePrefix
+        * @param mixed $default What to return if the value isn't found
+        * @return mixed Cookie value or $default if the cookie not set
         */
        public function getCookie( $key, $prefix = null, $default = null ) {
                if ( $prefix === null ) {
@@ -691,12 +691,14 @@ class WebRequest {
         * This will be suitable for use as a relative link in HTML output.
         *
         * @throws MWException
-        * @return String
+        * @return string
         */
        public function getRequestURL() {
                if ( isset( $_SERVER['REQUEST_URI'] ) && strlen( $_SERVER['REQUEST_URI'] ) ) {
                        $base = $_SERVER['REQUEST_URI'];
-               } elseif ( isset( $_SERVER['HTTP_X_ORIGINAL_URL'] ) && strlen( $_SERVER['HTTP_X_ORIGINAL_URL'] ) ) {
+               } elseif ( isset( $_SERVER['HTTP_X_ORIGINAL_URL'] )
+                       && strlen( $_SERVER['HTTP_X_ORIGINAL_URL'] )
+               ) {
                        // Probably IIS; doesn't set REQUEST_URI
                        $base = $_SERVER['HTTP_X_ORIGINAL_URL'];
                } elseif ( isset( $_SERVER['SCRIPT_NAME'] ) ) {
@@ -736,7 +738,7 @@ class WebRequest {
         * If $wgServer is protocol-relative, this will return a fully
         * qualified URL with the protocol that was used for this request.
         *
-        * @return String
+        * @return string
         */
        public function getFullRequestURL() {
                return wfExpandUrl( $this->getRequestURL(), PROTO_CURRENT );
@@ -746,7 +748,7 @@ class WebRequest {
         * Take an arbitrary query and rewrite the present URL to include it
         * @param string $query query string fragment; do not include initial '?'
         *
-        * @return String
+        * @return string
         */
        public function appendQuery( $query ) {
                return $this->appendQueryArray( wfCgiToArray( $query ) );
@@ -756,18 +758,18 @@ class WebRequest {
         * HTML-safe version of appendQuery().
         * @deprecated: Deprecated in 1.20, warnings in 1.21, remove in 1.22.
         *
-        * @param string $query query string fragment; do not include initial '?'
-        * @return String
+        * @param string $query Query string fragment; do not include initial '?'
+        * @return string
         */
        public function escapeAppendQuery( $query ) {
                return htmlspecialchars( $this->appendQuery( $query ) );
        }
 
        /**
-        * @param $key
-        * @param $value
-        * @param $onlyquery bool
-        * @return String
+        * @param string $key
+        * @param string $value
+        * @param bool $onlyquery
+        * @return string
         */
        public function appendQueryValue( $key, $value, $onlyquery = false ) {
                return $this->appendQueryArray( array( $key => $value ), $onlyquery );
@@ -776,10 +778,9 @@ class WebRequest {
        /**
         * Appends or replaces value of query variables.
         *
-        * @param array $array of values to replace/add to query
-        * @param bool $onlyquery whether to only return the query string and not
-        *                   the complete URL
-        * @return String
+        * @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
+        * @return string
         */
        public function appendQueryArray( $array, $onlyquery = false ) {
                global $wgTitle;
@@ -795,9 +796,9 @@ class WebRequest {
         * defaults if not given. The limit must be positive and is capped at 5000.
         * Offset must be positive but is not capped.
         *
-        * @param $deflimit Integer: limit to use if no input and the user hasn't set the option.
-        * @param string $optionname to specify an option other than rclimit to pull from.
-        * @return array first element is limit, second is offset
+        * @param int $deflimit Limit to use if no input and the user hasn't set the option.
+        * @param string $optionname To specify an option other than rclimit to pull from.
+        * @return array First element is limit, second is offset
         */
        public function getLimitOffset( $deflimit = 50, $optionname = 'rclimit' ) {
                global $wgUser;
@@ -827,8 +828,8 @@ class WebRequest {
        /**
         * Return the path to the temporary file where PHP has stored the upload.
         *
-        * @param $key String:
-        * @return string or NULL if no such file.
+        * @param string $key
+        * @return string|null string or null if no such file.
         */
        public function getFileTempname( $key ) {
                $file = new WebRequestUpload( $this, $key );
@@ -838,8 +839,8 @@ class WebRequest {
        /**
         * Return the upload error or 0
         *
-        * @param $key String:
-        * @return integer
+        * @param string $key
+        * @return int
         */
        public function getUploadError( $key ) {
                $file = new WebRequestUpload( $this, $key );
@@ -854,8 +855,8 @@ class WebRequest {
         *
         * Other than this the name is not verified for being a safe filename.
         *
-        * @param $key String:
-        * @return string or NULL if no such file.
+        * @param string $key
+        * @return string|null string or null if no such file.
         */
        public function getFileName( $key ) {
                $file = new WebRequestUpload( $this, $key );
@@ -865,7 +866,7 @@ class WebRequest {
        /**
         * Return a WebRequestUpload object corresponding to the key
         *
-        * @param $key string
+        * @param string $key
         * @return WebRequestUpload
         */
        public function getUpload( $key ) {
@@ -915,7 +916,7 @@ class WebRequest {
        /**
         * Get an array containing all request headers
         *
-        * @return Array mapping header name to its value
+        * @return array Mapping header name to its value
         */
        public function getAllHeaders() {
                $this->initHeaders();
@@ -941,8 +942,8 @@ class WebRequest {
        /**
         * Get data from $_SESSION
         *
-        * @param string $key name of key in $_SESSION
-        * @return Mixed
+        * @param string $key Name of key in $_SESSION
+        * @return mixed
         */
        public function getSessionData( $key ) {
                if ( !isset( $_SESSION[$key] ) ) {
@@ -954,8 +955,8 @@ class WebRequest {
        /**
         * Set session data
         *
-        * @param string $key name of key in $_SESSION
-        * @param $data Mixed
+        * @param string $key Name of key in $_SESSION
+        * @param mixed $data
         */
        public function setSessionData( $key, $data ) {
                $_SESSION[$key] = $data;
@@ -967,7 +968,7 @@ class WebRequest {
         * message or redirect to a safer URL. Returns true if the URL is OK, and
         * false if an error message has been shown and the request should be aborted.
         *
-        * @param $extWhitelist array
+        * @param array $extWhitelist
         * @throws HttpError
         * @return bool
         */
@@ -993,7 +994,7 @@ class WebRequest {
         * Attempt to redirect to a URL with a QUERY_STRING that's not dangerous in
         * IE 6. Returns true if it was successful, false otherwise.
         *
-        * @param $url string
+        * @param string $url
         * @return bool
         */
        protected function doSecurityRedirect( $url ) {
@@ -1011,9 +1012,9 @@ class WebRequest {
 We can't serve non-HTML content from the URL you have requested, because
 Internet Explorer would interpret it as an incorrect and potentially dangerous
 content type.</p>
-<p>Instead, please use <a href="$encUrl">this URL</a>, which is the same as the URL you have requested, except that
-"&amp;*" is appended. This prevents Internet Explorer from seeing a bogus file
-extension.
+<p>Instead, please use <a href="$encUrl">this URL</a>, which is the same as the
+URL you have requested, except that "&amp;*" is appended. This prevents Internet
+Explorer from seeing a bogus file extension.
 </p>
 </body>
 </html>
@@ -1024,14 +1025,16 @@ HTML;
 
        /**
         * Parse the Accept-Language header sent by the client into an array
-        * @return array array( languageCode => q-value ) sorted by q-value in descending order then
-        *                                                appearing time in the header in ascending order.
+        *
+        * @return array array( languageCode => q-value ) sorted by q-value in
+        *   descending order then appearing time in the header in ascending order.
         * May contain the "language" '*', which applies to languages other than those explicitly listed.
         * This is aligned with rfc2616 section 14.4
         * Preference for earlier languages appears in rfc3282 as an extension to HTTP/1.1.
         */
        public function getAcceptLang() {
-               // Modified version of code found at http://www.thefutureoftheweb.com/blog/use-accept-language-header
+               // Modified version of code found at
+               // http://www.thefutureoftheweb.com/blog/use-accept-language-header
                $acceptLang = $this->getHeader( 'Accept-Language' );
                if ( !$acceptLang ) {
                        return array();
@@ -1042,8 +1045,11 @@ HTML;
 
                // Break up string into pieces (languages and q factors)
                $lang_parse = null;
-               preg_match_all( '/([a-z]{1,8}(-[a-z]{1,8})*|\*)\s*(;\s*q\s*=\s*(1(\.0{0,3})?|0(\.[0-9]{0,3})?)?)?/',
-                       $acceptLang, $lang_parse );
+               preg_match_all(
+                       '/([a-z]{1,8}(-[a-z]{1,8})*|\*)\s*(;\s*q\s*=\s*(1(\.0{0,3})?|0(\.[0-9]{0,3})?)?)?/',
+                       $acceptLang,
+                       $lang_parse
+               );
 
                if ( !count( $lang_parse[1] ) ) {
                        return array();
@@ -1077,7 +1083,7 @@ HTML;
         * @since 1.19
         *
         * @throws MWException
-        * @return String
+        * @return string
         */
        protected function getRawIP() {
                if ( !isset( $_SERVER['REMOTE_ADDR'] ) ) {
@@ -1085,7 +1091,8 @@ HTML;
                }
 
                if ( is_array( $_SERVER['REMOTE_ADDR'] ) || strpos( $_SERVER['REMOTE_ADDR'], ',' ) !== false ) {
-                       throw new MWException( __METHOD__ . " : Could not determine the remote IP address due to multiple values." );
+                       throw new MWException( __METHOD__
+                               . " : Could not determine the remote IP address due to multiple values." );
                } else {
                        $ipchain = $_SERVER['REMOTE_ADDR'];
                }
@@ -1116,6 +1123,7 @@ HTML;
                # Append XFF
                $forwardedFor = $this->getHeader( 'X-Forwarded-For' );
                if ( $forwardedFor !== false ) {
+                       $isConfigured = IP::isConfiguredProxy( $ip );
                        $ipchain = array_map( 'trim', explode( ',', $forwardedFor ) );
                        $ipchain = array_reverse( $ipchain );
                        if ( $ip ) {
@@ -1132,13 +1140,13 @@ HTML;
                                        continue;
                                }
                                $curIP = IP::sanitizeIP( IP::canonicalize( $curIP ) );
-                               if ( wfIsTrustedProxy( $curIP ) && isset( $ipchain[$i + 1] ) ) {
-                                       if ( wfIsConfiguredProxy( $curIP ) || // bug 48919; treat IP as sane
+                               if ( IP::isTrustedProxy( $curIP ) && isset( $ipchain[$i + 1] ) ) {
+                                       if ( IP::isConfiguredProxy( $curIP ) || // bug 48919; treat IP as sane
                                                IP::isPublic( $ipchain[$i + 1] ) ||
                                                $wgUsePrivateIPs
                                        ) {
                                                $nextIP = IP::canonicalize( $ipchain[$i + 1] );
-                                               if ( !$nextIP && wfIsConfiguredProxy( $ip ) ) {
+                                               if ( !$nextIP && $isConfigured ) {
                                                        // We have not yet made it past CDN/proxy servers of this site,
                                                        // so either they are misconfigured or there is some IP spoofing.
                                                        throw new MWException( "Invalid IP given in XFF '$forwardedFor'." );
@@ -1184,7 +1192,7 @@ class WebRequestUpload {
        /**
         * Constructor. Should only be called by WebRequest
         *
-        * @param $request WebRequest The associated request
+        * @param WebRequest $request The associated request
         * @param string $key Key in $_FILES array (name of form field)
         */
        public function __construct( $request, $key ) {
@@ -1207,7 +1215,7 @@ class WebRequestUpload {
        /**
         * Return the original filename of the uploaded file
         *
-        * @return mixed Filename or null if non-existent
+        * @return string|null Filename or null if non-existent
         */
        public function getName() {
                if ( !$this->exists() ) {
@@ -1241,7 +1249,7 @@ class WebRequestUpload {
        /**
         * Return the path to the temporary file
         *
-        * @return mixed Path or null if non-existent
+        * @return string|null Path or null if non-existent
         */
        public function getTempName() {
                if ( !$this->exists() ) {
@@ -1299,12 +1307,14 @@ class FauxRequest extends WebRequest {
        /**
         * @param array $data of *non*-urlencoded key => value pairs, the
         *   fake GET/POST values
-        * @param bool $wasPosted whether to treat the data as POST
-        * @param $session Mixed: session array or null
+        * @param bool $wasPosted Whether to treat the data as POST
+        * @param array|null $session Session array or null
         * @param string $protocol 'http' or 'https'
         * @throws MWException
         */
-       public function __construct( $data = array(), $wasPosted = false, $session = null, $protocol = 'http' ) {
+       public function __construct( $data = array(), $wasPosted = false,
+               $session = null, $protocol = 'http'
+       ) {
                if ( is_array( $data ) ) {
                        $this->data = $data;
                } else {
@@ -1318,7 +1328,7 @@ class FauxRequest extends WebRequest {
        }
 
        /**
-        * @param $method string
+        * @param string $method
         * @throws MWException
         */
        private function notImplemented( $method ) {
@@ -1326,8 +1336,8 @@ class FauxRequest extends WebRequest {
        }
 
        /**
-        * @param $name string
-        * @param $default string
+        * @param string $name
+        * @param string $default
         * @return string
         */
        public function getText( $name, $default = '' ) {
@@ -1336,7 +1346,7 @@ class FauxRequest extends WebRequest {
        }
 
        /**
-        * @return Array
+        * @return array
         */
        public function getValues() {
                return $this->data;
@@ -1390,8 +1400,8 @@ class FauxRequest extends WebRequest {
        }
 
        /**
-        * @param $name string
-        * @param $val string
+        * @param string $name
+        * @param string $val
         */
        public function setHeader( $name, $val ) {
                $name = strtoupper( $name );
@@ -1399,8 +1409,8 @@ class FauxRequest extends WebRequest {
        }
 
        /**
-        * @param $key
-        * @return mixed
+        * @param string $key
+        * @return array|null
         */
        public function getSessionData( $key ) {
                if ( isset( $this->session[$key] ) ) {
@@ -1410,15 +1420,15 @@ class FauxRequest extends WebRequest {
        }
 
        /**
-        * @param $key
-        * @param $data
+        * @param string $key
+        * @param array $data
         */
        public function setSessionData( $key, $data ) {
                $this->session[$key] = $data;
        }
 
        /**
-        * @return array|Mixed|null
+        * @return array|mixed|null
         */
        public function getSessionArray() {
                return $this->session;
@@ -1426,7 +1436,7 @@ class FauxRequest extends WebRequest {
 
        /**
         * FauxRequests shouldn't depend on raw request data (but that could be implemented here)
-        * @return String
+        * @return string
         */
        public function getRawQueryString() {
                return '';
@@ -1434,7 +1444,7 @@ class FauxRequest extends WebRequest {
 
        /**
         * FauxRequests shouldn't depend on raw request data (but that could be implemented here)
-        * @return String
+        * @return string
         */
        public function getRawPostString() {
                return '';
@@ -1442,7 +1452,7 @@ class FauxRequest extends WebRequest {
 
        /**
         * FauxRequests shouldn't depend on raw request data (but that could be implemented here)
-        * @return String
+        * @return string
         */
        public function getRawInput() {
                return '';
index 766b3bf..09f01c0 100644 (file)
 # This must be done before any globals are set by the code
 if ( ini_get( 'register_globals' ) ) {
        if ( isset( $_REQUEST['GLOBALS'] ) || isset( $_FILES['GLOBALS'] ) ) {
-               die( '<a href="http://www.hardened-php.net/globals-problem">$GLOBALS overwrite vulnerability</a>' );
+               die( '<a href="http://www.hardened-php.net/globals-problem">'
+                       . '$GLOBALS overwrite vulnerability</a>' );
        }
+
        $verboten = array(
                'GLOBALS',
                '_SERVER',
@@ -50,6 +52,7 @@ if ( ini_get( 'register_globals' ) ) {
                '_SESSION',
                'HTTP_SESSION_VARS'
        );
+
        foreach ( $_REQUEST as $name => $value ) {
                if ( in_array( $name, $verboten ) ) {
                        header( "HTTP/1.1 500 Internal Server Error" );
index 297041b..a8bafa3 100644 (file)
  * @internal documentation reviewed 15 Mar 2010
  */
 class MediaWiki {
-
        /**
-        * TODO: fold $output, etc, into this
+        * @todo Fold $output, etc, into this
         * @var IContextSource
         */
        private $context;
 
        /**
-        * @param $x null|WebRequest
+        * @param null|WebRequest $x
         * @return WebRequest
         */
        public function request( WebRequest $x = null ) {
@@ -44,7 +43,7 @@ class MediaWiki {
        }
 
        /**
-        * @param $x null|OutputPage
+        * @param null|OutputPage $x
         * @return OutputPage
         */
        public function output( OutputPage $x = null ) {
@@ -67,7 +66,7 @@ class MediaWiki {
        /**
         * Parse the request to get the Title object
         *
-        * @return Title object to be $wgTitle
+        * @return Title Title object to be $wgTitle
         */
        private function parseTitle() {
                global $wgContLang;
@@ -117,7 +116,11 @@ class MediaWiki {
                }
 
                // Use the main page as default title if nothing else has been provided
-               if ( $ret === null && strval( $title ) === '' && !$request->getCheck( 'curid' ) && $action !== 'delete' ) {
+               if ( $ret === null
+                       && strval( $title ) === ''
+                       && !$request->getCheck( 'curid' )
+                       && $action !== 'delete'
+               ) {
                        $ret = Title::newMainPage();
                }
 
@@ -142,7 +145,7 @@ class MediaWiki {
        /**
         * Returns the name of the action that will be executed.
         *
-        * @return string: action
+        * @return string Action
         */
        public function getAction() {
                static $action = null;
@@ -311,7 +314,7 @@ class MediaWiki {
         * Initialize the main Article object for "standard" actions (view, etc)
         * Create an Article object for the page, following redirects if needed.
         *
-        * @return mixed an Article, or a string to redirect to another URL
+        * @return mixed An Article, or a string to redirect to another URL
         */
        private function initializeArticle() {
                global $wgDisableHardRedirects;
@@ -393,8 +396,8 @@ class MediaWiki {
        /**
         * Perform one of the "standard" actions
         *
-        * @param $page Page
-        * @param $requestTitle The original title, before any redirects were applied
+        * @param Page $page
+        * @param Title $requestTitle The original title, before any redirects were applied
         */
        private function performAction( Page $page, Title $requestTitle ) {
                global $wgUseSquid, $wgSquidMaxage;
@@ -431,6 +434,7 @@ class MediaWiki {
                }
 
                if ( wfRunHooks( 'UnknownAction', array( $request->getVal( 'action', 'view' ), $page ) ) ) {
+                       $output->setStatusCode( 404 );
                        $output->showErrorPage( 'nosuchaction', 'nosuchactiontext' );
                }
 
@@ -529,6 +533,7 @@ class MediaWiki {
                // Note: Do this after $wgTitle is setup, otherwise the hooks run from
                // isLoggedIn() will do all sorts of weird stuff.
                if (
+                       $request->getProtocol() == 'http' &&
                        (
                                $request->getCookie( 'forceHTTPS', '' ) ||
                                // check for prefixed version for currently logged in users
@@ -538,34 +543,36 @@ class MediaWiki {
                                        $this->context->getUser()->isLoggedIn()
                                        && $this->context->getUser()->requiresHTTPS()
                                )
-                       ) &&
-                       $request->getProtocol() == 'http'
+                       )
                ) {
                        $oldUrl = $request->getFullRequestURL();
-                       $redirUrl = str_replace( 'http://', 'https://', $oldUrl );
-
-                       if ( $request->wasPosted() ) {
-                               // This is weird and we'd hope it almost never happens. This
-                               // means that a POST came in via HTTP and policy requires us
-                               // redirecting to HTTPS. It's likely such a request is going
-                               // to fail due to post data being lost, but let's try anyway
-                               // and just log the instance.
-                               //
-                               // @todo @fixme See if we could issue a 307 or 308 here, need
-                               // to see how clients (automated & browser) behave when we do
-                               wfDebugLog( 'RedirectedPosts', "Redirected from HTTP to HTTPS: $oldUrl" );
+                       $redirUrl = preg_replace( '#^http://#', 'https://', $oldUrl );
+
+                       // ATTENTION: This hook is likely to be removed soon due to overall design of the system.
+                       if ( wfRunHooks( 'BeforeHttpsRedirect', array( $this->context, &$redirUrl ) ) ) {
+
+                               if ( $request->wasPosted() ) {
+                                       // This is weird and we'd hope it almost never happens. This
+                                       // means that a POST came in via HTTP and policy requires us
+                                       // redirecting to HTTPS. It's likely such a request is going
+                                       // to fail due to post data being lost, but let's try anyway
+                                       // and just log the instance.
+                                       //
+                                       // @todo @fixme See if we could issue a 307 or 308 here, need
+                                       // to see how clients (automated & browser) behave when we do
+                                       wfDebugLog( 'RedirectedPosts', "Redirected from HTTP to HTTPS: $oldUrl" );
+                               }
+                               // Setup dummy Title, otherwise OutputPage::redirect will fail
+                               $title = Title::newFromText( NS_MAIN, 'REDIR' );
+                               $this->context->setTitle( $title );
+                               $output = $this->context->getOutput();
+                               // Since we only do this redir to change proto, always send a vary header
+                               $output->addVaryHeader( 'X-Forwarded-Proto' );
+                               $output->redirect( $redirUrl );
+                               $output->output();
+                               wfProfileOut( __METHOD__ );
+                               return;
                        }
-
-                       // Setup dummy Title, otherwise OutputPage::redirect will fail
-                       $title = Title::newFromText( NS_MAIN, 'REDIR' );
-                       $this->context->setTitle( $title );
-                       $output = $this->context->getOutput();
-                       // Since we only do this redir to change proto, always send a vary header
-                       $output->addVaryHeader( 'X-Forwarded-Proto' );
-                       $output->redirect( $redirUrl );
-                       $output->output();
-                       wfProfileOut( __METHOD__ );
-                       return;
                }
 
                if ( $wgUseFileCache && $title->getNamespace() >= 0 ) {
index 44f0599..34f15c3 100644 (file)
@@ -180,7 +180,8 @@ class WikiFilePage extends WikiPage {
                        $this->mFile->upgradeRow();
                        $this->mFile->purgeCache( array( 'forThumbRefresh' => true ) );
                } else {
-                       wfDebug( 'ImagePage::doPurge no image for ' . $this->mFile->getName() . "; limiting purge to cache only\n" );
+                       wfDebug( 'ImagePage::doPurge no image for '
+                               . $this->mFile->getName() . "; limiting purge to cache only\n" );
                        // even if the file supposedly doesn't exist, force any cached information
                        // to be updated (in case the cached information is wrong)
                        $this->mFile->purgeCache( array( 'forThumbRefresh' => true ) );
index 4739753..34cd48d 100644 (file)
@@ -28,8 +28,8 @@ class WikiMap {
        /**
         * Get a WikiReference object for $wikiID
         *
-        * @param string $wikiID wiki'd id (generally database name)
-        * @return WikiReference object or null if the wiki was not found
+        * @param string $wikiID Wiki'd id (generally database name)
+        * @return WikiReference|null WikiReference object or null if the wiki was not found
         */
        public static function getWiki( $wikiID ) {
                global $wgConf;
@@ -58,7 +58,7 @@ class WikiMap {
         * Convenience to get the wiki's display name
         *
         * @todo We can give more info than just the wiki id!
-        * @param string $wikiID wiki'd id (generally database name)
+        * @param string $wikiID Wiki'd id (generally database name)
         * @return string|int Wiki's name or $wiki_id if the wiki was not found
         */
        public static function getWikiName( $wikiID ) {
@@ -73,10 +73,10 @@ class WikiMap {
        /**
         * Convenience to get a link to a user page on a foreign wiki
         *
-        * @param string $wikiID wiki'd id (generally database name)
-        * @param string $user user name (must be normalised before calling this function!)
-        * @param string $text link's text; optional, default to "User:$user"
-        * @return String: HTML link or false if the wiki was not found
+        * @param string $wikiID Wiki'd id (generally database name)
+        * @param string $user User name (must be normalised before calling this function!)
+        * @param string $text Link's text; optional, default to "User:$user"
+        * @return string HTML link or false if the wiki was not found
         */
        public static function foreignUserLink( $wikiID, $user, $text = null ) {
                return self::makeForeignLink( $wikiID, "User:$user", $text );
@@ -85,10 +85,10 @@ class WikiMap {
        /**
         * Convenience to get a link to a page on a foreign wiki
         *
-        * @param string $wikiID wiki'd id (generally database name)
-        * @param string $page page name (must be normalised before calling this function!)
-        * @param string $text link's text; optional, default to $page
-        * @return String: HTML link or false if the wiki was not found
+        * @param string $wikiID Wiki'd id (generally database name)
+        * @param string $page Page name (must be normalised before calling this function!)
+        * @param string $text Link's text; optional, default to $page
+        * @return string HTML link or false if the wiki was not found
         */
        public static function makeForeignLink( $wikiID, $page, $text = null ) {
                if ( !$text ) {
@@ -106,9 +106,9 @@ class WikiMap {
        /**
         * Convenience to get a url to a page on a foreign wiki
         *
-        * @param string $wikiID wiki'd id (generally database name)
-        * @param string $page page name (must be normalised before calling this function!)
-        * @return String: URL or false if the wiki was not found
+        * @param string $wikiID Wiki'd id (generally database name)
+        * @param string $page Page name (must be normalised before calling this function!)
+        * @return string|bool URL or false if the wiki was not found
         */
        public static function getForeignURL( $wikiID, $page ) {
                $wiki = WikiMap::getWiki( $wikiID );
@@ -132,11 +132,11 @@ class WikiReference {
        private $mPath;   ///< path, '/wiki/$1'
 
        /**
-        * @param $major string
-        * @param $minor string
-        * @param $canonicalServer string
-        * @param $path string
-        * @param $server null|string
+        * @param string $major
+        * @param string $minor
+        * @param string $canonicalServer
+        * @param string $path
+        * @param null|string $server
         */
        public function __construct( $major, $minor, $canonicalServer, $path, $server = null ) {
                $this->mMajor = $major;
@@ -164,7 +164,7 @@ class WikiReference {
         * Get the the URL in a way to de displayed to the user
         * More or less Wikimedia specific
         *
-        * @return String
+        * @return string
         */
        public function getDisplayName() {
                $url = $this->getUrl( '' );
@@ -181,8 +181,8 @@ class WikiReference {
         * Helper function for getUrl()
         *
         * @todo FIXME: This may be generalized...
-        * @param string $page page name (must be normalised before calling this function!)
-        * @return String: Url fragment
+        * @param string $page Page name (must be normalised before calling this function!)
+        * @return string Url fragment
         */
        private function getLocalUrl( $page ) {
                return str_replace( '$1', wfUrlEncode( str_replace( ' ', '_', $page ) ), $this->mPath );
@@ -191,8 +191,8 @@ class WikiReference {
        /**
         * Get a canonical (i.e. based on $wgCanonicalServer) URL to a page on this foreign wiki
         *
-        * @param string $page page name (must be normalised before calling this function!)
-        * @return String: Url
+        * @param string $page Page name (must be normalised before calling this function!)
+        * @return string Url
         */
        public function getCanonicalUrl( $page ) {
                return $this->mCanonicalServer . $this->getLocalUrl( $page );
@@ -208,8 +208,8 @@ class WikiReference {
 
        /**
         * Alias for getCanonicalUrl(), for backwards compatibility.
-        * @param $page string
-        * @return String
+        * @param string $page
+        * @return string
         */
        public function getUrl( $page ) {
                return $this->getCanonicalUrl( $page );
@@ -219,8 +219,8 @@ class WikiReference {
         * Get a URL based on $wgServer, like Title::getFullURL() would produce
         * when called locally on the wiki.
         *
-        * @param string $page page name (must be normalized before calling this function!)
-        * @return String: URL
+        * @param string $page Page name (must be normalized before calling this function!)
+        * @return string URL
         */
        public function getFullUrl( $page ) {
                return $this->mServer .
index 0dec766..8fe948b 100644 (file)
@@ -59,7 +59,7 @@ class WikiPage implements Page, IDBAccessObject {
        protected $mId = null;
 
        /**
-        * @var int; one of the READ_* constants
+        * @var int One of the READ_* constants
         */
        protected $mDataLoadedFrom = self::READ_NONE;
 
@@ -74,7 +74,7 @@ class WikiPage implements Page, IDBAccessObject {
        protected $mLastRevision = null;
 
        /**
-        * @var string; timestamp of the current revision or empty string if not loaded
+        * @var string Timestamp of the current revision or empty string if not loaded
         */
        protected $mTimestamp = '';
 
@@ -95,7 +95,7 @@ class WikiPage implements Page, IDBAccessObject {
 
        /**
         * Constructor and clear the article
-        * @param $title Title Reference to a Title object.
+        * @param Title $title Reference to a Title object.
         */
        public function __construct( Title $title ) {
                $this->mTitle = $title;
@@ -135,8 +135,8 @@ class WikiPage implements Page, IDBAccessObject {
        /**
         * Constructor from a page id
         *
-        * @param int $id article ID to load
-        * @param string|int $from one of the following values:
+        * @param int $id Article ID to load
+        * @param string|int $from One of the following values:
         *        - "fromdb" or WikiPage::READ_NORMAL to select from a slave database
         *        - "fromdbmaster" or WikiPage::READ_LATEST to select from the master database
         *
@@ -161,9 +161,8 @@ class WikiPage implements Page, IDBAccessObject {
         * Constructor from a database row
         *
         * @since 1.20
-        * @param $row object: database row containing at least fields returned
-        *        by selectFields().
-        * @param string|int $from source of $data:
+        * @param object $row Database row containing at least fields returned by selectFields().
+        * @param string|int $from Source of $data:
         *        - "fromdb" or WikiPage::READ_NORMAL: from a slave DB
         *        - "fromdbmaster" or WikiPage::READ_LATEST: from the master DB
         *        - "forupdate" or WikiPage::READ_LOCKING: from the master DB using SELECT FOR UPDATE
@@ -178,7 +177,7 @@ class WikiPage implements Page, IDBAccessObject {
        /**
         * Convert 'fromdb', 'fromdbmaster' and 'forupdate' to READ_* constants.
         *
-        * @param $type object|string|int
+        * @param object|string|int $type
         * @return mixed
         */
        private static function convertSelectType( $type ) {
@@ -203,7 +202,7 @@ class WikiPage implements Page, IDBAccessObject {
         *
         * @todo Move this UI stuff somewhere else
         *
-        * @return Array
+        * @return array
         */
        public function getActionOverrides() {
                $content_handler = $this->getContentHandler();
@@ -225,7 +224,7 @@ class WikiPage implements Page, IDBAccessObject {
 
        /**
         * Get the title object of the article
-        * @return Title object of this page
+        * @return Title Title object of this page
         */
        public function getTitle() {
                return $this->mTitle;
@@ -304,10 +303,10 @@ class WikiPage implements Page, IDBAccessObject {
 
        /**
         * Fetch a page record with the given conditions
-        * @param $dbr DatabaseBase object
-        * @param $conditions Array
-        * @param $options Array
-        * @return mixed Database result resource, or false on failure
+        * @param DatabaseBase $dbr
+        * @param array $conditions
+        * @param array $options
+        * @return object|bool Database result resource, or false on failure
         */
        protected function pageData( $dbr, $conditions, $options = array() ) {
                $fields = self::selectFields();
@@ -325,10 +324,10 @@ class WikiPage implements Page, IDBAccessObject {
         * Fetch a page record matching the Title object's namespace and title
         * using a sanitized title string
         *
-        * @param $dbr DatabaseBase object
-        * @param $title Title object
-        * @param $options Array
-        * @return mixed Database result resource, or false on failure
+        * @param DatabaseBase $dbr
+        * @param Title $title
+        * @param array $options
+        * @return object|bool Database result resource, or false on failure
         */
        public function pageDataFromTitle( $dbr, $title, $options = array() ) {
                return $this->pageData( $dbr, array(
@@ -339,10 +338,10 @@ class WikiPage implements Page, IDBAccessObject {
        /**
         * Fetch a page record matching the requested ID
         *
-        * @param $dbr DatabaseBase
-        * @param $id Integer
-        * @param $options Array
-        * @return mixed Database result resource, or false on failure
+        * @param DatabaseBase $dbr
+        * @param int $id
+        * @param array $options
+        * @return object|bool Database result resource, or false on failure
         */
        public function pageDataFromId( $dbr, $id, $options = array() ) {
                return $this->pageData( $dbr, array( 'page_id' => $id ), $options );
@@ -352,11 +351,12 @@ class WikiPage implements Page, IDBAccessObject {
         * Set the general counter, title etc data loaded from
         * some source.
         *
-        * @param $from object|string|int One of the following:
-        *        - A DB query result object
-        *        - "fromdb" or WikiPage::READ_NORMAL to get from a slave DB
-        *        - "fromdbmaster" or WikiPage::READ_LATEST to get from the master DB
-        *        - "forupdate"  or WikiPage::READ_LOCKING to get from the master DB using SELECT FOR UPDATE
+        * @param object|string|int $from One of the following:
+        *   - A DB query result object.
+        *   - "fromdb" or WikiPage::READ_NORMAL to get from a slave DB.
+        *   - "fromdbmaster" or WikiPage::READ_LATEST to get from the master DB.
+        *   - "forupdate"  or WikiPage::READ_LOCKING to get from the master DB
+        *     using SELECT FOR UPDATE.
         *
         * @return void
         */
@@ -395,8 +395,7 @@ class WikiPage implements Page, IDBAccessObject {
         * Load the object from a database row
         *
         * @since 1.20
-        * @param $data object: database row containing at least fields returned
-        *        by selectFields()
+        * @param object $data Database row containing at least fields returned by selectFields()
         * @param string|int $from One of the following:
         *        - "fromdb" or WikiPage::READ_NORMAL if the data comes from a slave DB
         *        - "fromdbmaster" or WikiPage::READ_LATEST if the data comes from the master DB
@@ -504,7 +503,7 @@ class WikiPage implements Page, IDBAccessObject {
         * Will use the revisions actual content model if the page exists,
         * and the page's default if the page doesn't exist yet.
         *
-        * @return String
+        * @return string
         *
         * @since 1.21
         */
@@ -527,7 +526,7 @@ class WikiPage implements Page, IDBAccessObject {
 
        /**
         * Loads page_touched and returns a value indicating if it should be used
-        * @return boolean true if not a redirect
+        * @return bool true if not a redirect
         */
        public function checkTouched() {
                if ( !$this->mDataLoaded ) {
@@ -538,7 +537,7 @@ class WikiPage implements Page, IDBAccessObject {
 
        /**
         * Get the page_touched field
-        * @return string containing GMT timestamp
+        * @return string Containing GMT timestamp
         */
        public function getTouched() {
                if ( !$this->mDataLoaded ) {
@@ -549,7 +548,7 @@ class WikiPage implements Page, IDBAccessObject {
 
        /**
         * Get the page_links_updated field
-        * @return string|null containing GMT timestamp
+        * @return string|null Containing GMT timestamp
         */
        public function getLinksTimestamp() {
                if ( !$this->mDataLoaded ) {
@@ -560,7 +559,7 @@ class WikiPage implements Page, IDBAccessObject {
 
        /**
         * Get the page_latest field
-        * @return integer rev_id of current revision
+        * @return int rev_id of current revision
         */
        public function getLatest() {
                if ( !$this->mDataLoaded ) {
@@ -638,6 +637,7 @@ class WikiPage implements Page, IDBAccessObject {
 
        /**
         * Set the latest revision
+        * @param Revision $revision
         */
        protected function setLastEdit( Revision $revision ) {
                $this->mLastRevision = $revision;
@@ -659,12 +659,12 @@ class WikiPage implements Page, IDBAccessObject {
        /**
         * Get the content of the current revision. No side-effects...
         *
-        * @param $audience Integer: one of:
-        *      Revision::FOR_PUBLIC       to be displayed to all users
-        *      Revision::FOR_THIS_USER    to be displayed to $wgUser
-        *      Revision::RAW              get the text regardless of permissions
-        * @param $user User object to check for, only if FOR_THIS_USER is passed
-        *              to the $audience parameter
+        * @param int $audience int One of:
+        *   Revision::FOR_PUBLIC       to be displayed to all users
+        *   Revision::FOR_THIS_USER    to be displayed to $wgUser
+        *   Revision::RAW              get the text regardless of permissions
+        * @param User $user User object to check for, only if FOR_THIS_USER is passed
+        *   to the $audience parameter
         * @return Content|null The content of the current revision
         *
         * @since 1.21
@@ -680,16 +680,16 @@ class WikiPage implements Page, IDBAccessObject {
        /**
         * Get the text of the current revision. No side-effects...
         *
-        * @param $audience Integer: one of:
-        *      Revision::FOR_PUBLIC       to be displayed to all users
-        *      Revision::FOR_THIS_USER    to be displayed to the given user
-        *      Revision::RAW              get the text regardless of permissions
-        * @param $user User object to check for, only if FOR_THIS_USER is passed
-        *              to the $audience parameter
-        * @return String|false The text of the current revision
+        * @param int $audience One of:
+        *   Revision::FOR_PUBLIC       to be displayed to all users
+        *   Revision::FOR_THIS_USER    to be displayed to the given user
+        *   Revision::RAW              get the text regardless of permissions
+        * @param User $user User object to check for, only if FOR_THIS_USER is passed
+        *   to the $audience parameter
+        * @return string|bool The text of the current revision
         * @deprecated since 1.21, getContent() should be used instead.
         */
-       public function getText( $audience = Revision::FOR_PUBLIC, User $user = null ) { // @todo deprecated, replace usage!
+       public function getText( $audience = Revision::FOR_PUBLIC, User $user = null ) {
                ContentHandler::deprecated( __METHOD__, '1.21' );
 
                $this->loadLastEdit();
@@ -702,7 +702,7 @@ class WikiPage implements Page, IDBAccessObject {
        /**
         * Get the text of the current revision. No side-effects...
         *
-        * @return String|bool The text of the current revision. False on failure
+        * @return string|bool The text of the current revision. False on failure
         * @deprecated since 1.21, getContent() should be used instead.
         */
        public function getRawText() {
@@ -733,12 +733,12 @@ class WikiPage implements Page, IDBAccessObject {
        }
 
        /**
-        * @param $audience Integer: one of:
-        *      Revision::FOR_PUBLIC       to be displayed to all users
-        *      Revision::FOR_THIS_USER    to be displayed to the given user
-        *      Revision::RAW              get the text regardless of permissions
-        * @param $user User object to check for, only if FOR_THIS_USER is passed
-        *              to the $audience parameter
+        * @param int $audience One of:
+        *   Revision::FOR_PUBLIC       to be displayed to all users
+        *   Revision::FOR_THIS_USER    to be displayed to the given user
+        *   Revision::RAW              get the text regardless of permissions
+        * @param User $user User object to check for, only if FOR_THIS_USER is passed
+        *   to the $audience parameter
         * @return int user ID for the user that made the last article revision
         */
        public function getUser( $audience = Revision::FOR_PUBLIC, User $user = null ) {
@@ -752,12 +752,12 @@ class WikiPage implements Page, IDBAccessObject {
 
        /**
         * Get the User object of the user who created the page
-        * @param $audience Integer: one of:
-        *      Revision::FOR_PUBLIC       to be displayed to all users
-        *      Revision::FOR_THIS_USER    to be displayed to the given user
-        *      Revision::RAW              get the text regardless of permissions
-        * @param $user User object to check for, only if FOR_THIS_USER is passed
-        *              to the $audience parameter
+        * @param int $audience One of:
+        *   Revision::FOR_PUBLIC       to be displayed to all users
+        *   Revision::FOR_THIS_USER    to be displayed to the given user
+        *   Revision::RAW              get the text regardless of permissions
+        * @param User $user User object to check for, only if FOR_THIS_USER is passed
+        *   to the $audience parameter
         * @return User|null
         */
        public function getCreator( $audience = Revision::FOR_PUBLIC, User $user = null ) {
@@ -771,12 +771,12 @@ class WikiPage implements Page, IDBAccessObject {
        }
 
        /**
-        * @param $audience Integer: one of:
-        *      Revision::FOR_PUBLIC       to be displayed to all users
-        *      Revision::FOR_THIS_USER    to be displayed to the given user
-        *      Revision::RAW              get the text regardless of permissions
-        * @param $user User object to check for, only if FOR_THIS_USER is passed
-        *              to the $audience parameter
+        * @param int $audience One of:
+        *   Revision::FOR_PUBLIC       to be displayed to all users
+        *   Revision::FOR_THIS_USER    to be displayed to the given user
+        *   Revision::RAW              get the text regardless of permissions
+        * @param User $user User object to check for, only if FOR_THIS_USER is passed
+        *   to the $audience parameter
         * @return string username of the user that made the last article revision
         */
        public function getUserText( $audience = Revision::FOR_PUBLIC, User $user = null ) {
@@ -789,12 +789,12 @@ class WikiPage implements Page, IDBAccessObject {
        }
 
        /**
-        * @param $audience Integer: one of:
-        *      Revision::FOR_PUBLIC       to be displayed to all users
-        *      Revision::FOR_THIS_USER    to be displayed to the given user
-        *      Revision::RAW              get the text regardless of permissions
-        * @param $user User object to check for, only if FOR_THIS_USER is passed
-        *              to the $audience parameter
+        * @param int $audience One of:
+        *   Revision::FOR_PUBLIC       to be displayed to all users
+        *   Revision::FOR_THIS_USER    to be displayed to the given user
+        *   Revision::RAW              get the text regardless of permissions
+        * @param User $user User object to check for, only if FOR_THIS_USER is passed
+        *   to the $audience parameter
         * @return string Comment stored for the last article revision
         */
        public function getComment( $audience = Revision::FOR_PUBLIC, User $user = null ) {
@@ -809,7 +809,7 @@ class WikiPage implements Page, IDBAccessObject {
        /**
         * Returns true if last revision was marked as "minor edit"
         *
-        * @return boolean Minor edit indicator for the last article revision.
+        * @return bool Minor edit indicator for the last article revision.
         */
        public function getMinorEdit() {
                $this->loadLastEdit();
@@ -834,7 +834,7 @@ class WikiPage implements Page, IDBAccessObject {
        /**
         * Set the cached timestamp for the last time the page changed.
         * This is only used to help handle slave lag by comparing to page_touched.
-        * @param $timestamp string
+        * @param string $timestamp
         * @return void
         */
        public function setCachedLastEditTime( $timestamp ) {
@@ -847,9 +847,9 @@ class WikiPage implements Page, IDBAccessObject {
         * Determine whether a page would be suitable for being counted as an
         * article in the site_stats table based on the title & its content
         *
-        * @param $editInfo Object|bool (false): object returned by prepareTextForEdit(),
-        *        if false, the current database state will be used
-        * @return Boolean
+        * @param object|bool $editInfo (false): object returned by prepareTextForEdit(),
+        *   if false, the current database state will be used
+        * @return bool
         */
        public function isCountable( $editInfo = false ) {
                global $wgArticleCountMethod;
@@ -893,7 +893,7 @@ class WikiPage implements Page, IDBAccessObject {
         *
         * The target will be fetched from the redirect table if possible.
         * If this page doesn't have an entry there, call insertRedirect()
-        * @return Title|mixed object, or null if this page is not a redirect
+        * @return Title|null Title object, or null if this page is not a redirect
         */
        public function getRedirectTarget() {
                if ( !$this->mTitle->isRedirect() ) {
@@ -929,7 +929,7 @@ class WikiPage implements Page, IDBAccessObject {
         * Insert an entry for this page into the redirect table.
         *
         * Don't call this function directly unless you know what you're doing.
-        * @return Title object or null if not a redirect
+        * @return Title|null Title object or null if not a redirect
         */
        public function insertRedirect() {
                // recurse through to only get the final target
@@ -945,7 +945,7 @@ class WikiPage implements Page, IDBAccessObject {
        /**
         * Insert or update the redirect table entry for this page to indicate
         * it redirects to $rt .
-        * @param $rt Title redirect target
+        * @param Title $rt Redirect target
         */
        public function insertRedirectEntry( $rt ) {
                $dbw = wfGetDB( DB_MASTER );
@@ -964,7 +964,7 @@ class WikiPage implements Page, IDBAccessObject {
        /**
         * Get the Title object or URL this page redirects to
         *
-        * @return mixed false, Title of in-wiki target, or string with URL
+        * @return bool|Title|string false, Title of in-wiki target, or string with URL
         */
        public function followRedirect() {
                return $this->getRedirectURL( $this->getRedirectTarget() );
@@ -974,8 +974,8 @@ class WikiPage implements Page, IDBAccessObject {
         * Get the Title object or URL to use for a redirect. We use Title
         * objects for same-wiki, non-special redirects and URLs for everything
         * else.
-        * @param $rt Title Redirect target
-        * @return mixed false, Title object of local target, or string with URL
+        * @param Title $rt Redirect target
+        * @return bool|Title|string false, Title object of local target, or string with URL
         */
        public function getRedirectURL( $rt ) {
                if ( !$rt ) {
@@ -1067,7 +1067,7 @@ class WikiPage implements Page, IDBAccessObject {
        /**
         * Get the last N authors
         * @param int $num Number of revisions to get
-        * @param int|string $revLatest the latest rev_id, selected from the master (optional)
+        * @param int|string $revLatest The latest rev_id, selected from the master (optional)
         * @return array Array of authors, duplicates not removed
         */
        public function getLastNAuthors( $num, $revLatest = 0 ) {
@@ -1119,9 +1119,9 @@ class WikiPage implements Page, IDBAccessObject {
        /**
         * Should the parser cache be used?
         *
-        * @param $parserOptions ParserOptions to check
-        * @param $oldid int
-        * @return boolean
+        * @param ParserOptions $parserOptions ParserOptions to check
+        * @param int $oldid
+        * @return bool
         */
        public function isParserCacheUsed( ParserOptions $parserOptions, $oldid ) {
                global $wgEnableParserCache;
@@ -1140,9 +1140,9 @@ class WikiPage implements Page, IDBAccessObject {
         * @since 1.19
         * @param ParserOptions $parserOptions ParserOptions to use for the parse operation
         * @param null|int $oldid Revision ID to get the text from, passing null or 0 will
-        *               get the current revision (default value)
+        *   get the current revision (default value)
         *
-        * @return ParserOutput or false if the revision was not found
+        * @return ParserOutput|bool ParserOutput or false if the revision was not found
         */
        public function getParserOutput( ParserOptions $parserOptions, $oldid = null ) {
                wfProfileIn( __METHOD__ );
@@ -1247,7 +1247,7 @@ class WikiPage implements Page, IDBAccessObject {
         * or else the record will be left in a funky state.
         * Best if all done inside a transaction.
         *
-        * @param $dbw DatabaseBase
+        * @param DatabaseBase $dbw
         * @return int The newly created page_id key, or false if the title already existed
         */
        public function insertOn( $dbw ) {
@@ -1283,19 +1283,19 @@ class WikiPage implements Page, IDBAccessObject {
        /**
         * Update the page record to point to a newly saved revision.
         *
-        * @param $dbw DatabaseBase: object
-        * @param $revision Revision: For ID number, and text used to set
-        *                  length and redirect status fields
-        * @param $lastRevision Integer: if given, will not overwrite the page field
-        *                      when different from the currently set value.
-        *                      Giving 0 indicates the new page flag should be set
-        *                      on.
-        * @param $lastRevIsRedirect Boolean: if given, will optimize adding and
-        *                           removing rows in redirect table.
+        * @param DatabaseBase $dbw
+        * @param Revision $revision For ID number, and text used to set
+        *   length and redirect status fields
+        * @param int $lastRevision If given, will not overwrite the page field
+        *   when different from the currently set value.
+        *   Giving 0 indicates the new page flag should be set on.
+        * @param bool $lastRevIsRedirect If given, will optimize adding and
+        *   removing rows in redirect table.
         * @return bool true on success, false on failure
-        * @private
         */
-       public function updateRevisionOn( $dbw, $revision, $lastRevision = null, $lastRevIsRedirect = null ) {
+       public function updateRevisionOn( $dbw, $revision, $lastRevision = null,
+               $lastRevIsRedirect = null
+       ) {
                global $wgContentHandlerUseDB;
 
                wfProfileIn( __METHOD__ );
@@ -1348,11 +1348,11 @@ class WikiPage implements Page, IDBAccessObject {
        /**
         * Add row to the redirect table if this is a redirect, remove otherwise.
         *
-        * @param $dbw DatabaseBase
-        * @param $redirectTitle Title object pointing to the redirect target,
-        *                       or NULL if this is not a redirect
-        * @param $lastRevIsRedirect null|bool If given, will optimize adding and
-        *                           removing rows in redirect table.
+        * @param DatabaseBase $dbw
+        * @param Title $redirectTitle Title object pointing to the redirect target,
+        *   or NULL if this is not a redirect
+        * @param null|bool $lastRevIsRedirect If given, will optimize adding and
+        *   removing rows in redirect table.
         * @return bool true on success, false on failure
         * @private
         */
@@ -1387,9 +1387,9 @@ class WikiPage implements Page, IDBAccessObject {
         * If the given revision is newer than the currently set page_latest,
         * update the page record. Otherwise, do nothing.
         *
-        * @param $dbw DatabaseBase object
-        * @param $revision Revision object
-        * @return mixed
+        * @param DatabaseBase $dbw
+        * @param Revision $revision
+        * @return bool
         */
        public function updateIfNewerOn( $dbw, $revision ) {
                wfProfileIn( __METHOD__ );
@@ -1425,8 +1425,8 @@ class WikiPage implements Page, IDBAccessObject {
         * Get the content that needs to be saved in order to undo all revisions
         * between $undo and $undoafter. Revisions must belong to the same page,
         * must exist and must not be deleted
-        * @param $undo Revision
-        * @param $undoafter Revision Must be an earlier revision than $undo
+        * @param Revision $undo
+        * @param Revision $undoafter Must be an earlier revision than $undo
         * @return mixed string on success, false on failure
         * @since 1.21
         * Before we had the Content object, this was done in getUndoText
@@ -1440,9 +1440,9 @@ class WikiPage implements Page, IDBAccessObject {
         * Get the text that needs to be saved in order to undo all revisions
         * between $undo and $undoafter. Revisions must belong to the same page,
         * must exist and must not be deleted
-        * @param $undo Revision
-        * @param $undoafter Revision Must be an earlier revision than $undo
-        * @return mixed string on success, false on failure
+        * @param Revision $undo
+        * @param Revision $undoafter Must be an earlier revision than $undo
+        * @return string|bool string on success, false on failure
         * @deprecated since 1.21: use ContentHandler::getUndoContent() instead.
         */
        public function getUndoText( Revision $undo, Revision $undoafter = null ) {
@@ -1469,7 +1469,7 @@ class WikiPage implements Page, IDBAccessObject {
        }
 
        /**
-        * @param mixed $section Null/false, a section number (0, 1, 2, T1, T2, ...) or "new".
+        * @param string|null|bool $section Null/false, a section number (0, 1, 2, T1, T2, ...) or "new".
         * @param string $text New text of the section.
         * @param string $sectionTitle New section's subject, only if $section is "new".
         * @param string $edittime Revision timestamp or null to use the current revision.
@@ -1479,10 +1479,13 @@ class WikiPage implements Page, IDBAccessObject {
         *
         * @deprecated since 1.21, use replaceSectionContent() instead
         */
-       public function replaceSection( $section, $text, $sectionTitle = '', $edittime = null ) {
+       public function replaceSection( $section, $text, $sectionTitle = '',
+               $edittime = null
+       ) {
                ContentHandler::deprecated( __METHOD__, '1.21' );
 
-               if ( strval( $section ) == '' ) { //NOTE: keep condition in sync with condition in replaceSectionContent!
+               //NOTE: keep condition in sync with condition in replaceSectionContent!
+               if ( strval( $section ) == '' ) {
                        // Whole-page edit; let the whole text through
                        return $text;
                }
@@ -1506,15 +1509,17 @@ class WikiPage implements Page, IDBAccessObject {
         *
         * @return bool
         *
-        * @todo The skin should check this and not offer section functionality if sections are not supported.
-        * @todo The EditPage should check this and not offer section functionality if sections are not supported.
+        * @todo The skin should check this and not offer section functionality if
+        *   sections are not supported.
+        * @todo The EditPage should check this and not offer section functionality
+        *   if sections are not supported.
         */
        public function supportsSections() {
                return $this->getContentHandler()->supportsSections();
        }
 
        /**
-        * @param mixed $section Null/false, a section number (0, 1, 2, T1, T2, ...) or "new".
+        * @param string|null|bool $section Null/false, a section number (0, 1, 2, T1, T2, ...) or "new".
         * @param Content $sectionContent New content of the section.
         * @param string $sectionTitle New section's subject, only if $section is "new".
         * @param string $edittime Revision timestamp or null to use the current revision.
@@ -1571,8 +1576,8 @@ class WikiPage implements Page, IDBAccessObject {
 
        /**
         * Check flags and add EDIT_NEW or EDIT_UPDATE to them as needed.
-        * @param $flags Int
-        * @return Int updated $flags
+        * @param int $flags
+        * @return int Updated $flags
         */
        public function checkFlags( $flags ) {
                if ( !( $flags & EDIT_NEW ) && !( $flags & EDIT_UPDATE ) ) {
@@ -1590,9 +1595,9 @@ class WikiPage implements Page, IDBAccessObject {
         * Change an existing article or create a new article. Updates RC and all necessary caches,
         * optionally via the deferred update array.
         *
-        * @param string $text new text
-        * @param string $summary edit summary
-        * @param $flags Integer bitfield:
+        * @param string $text New text
+        * @param string $summary Edit summary
+        * @param int $flags Bitfield:
         *      EDIT_NEW
         *          Article is known or assumed to be non-existent, create a new one
         *      EDIT_UPDATE
@@ -1608,30 +1613,33 @@ class WikiPage implements Page, IDBAccessObject {
         *      EDIT_AUTOSUMMARY
         *          Fill in blank summaries with generated text where possible
         *
-        * If neither EDIT_NEW nor EDIT_UPDATE is specified, the status of the article will be detected.
-        * If EDIT_UPDATE is specified and the article doesn't exist, the function will return an
-        * edit-gone-missing error. If EDIT_NEW is specified and the article does exist, an
-        * edit-already-exists error will be returned. These two conditions are also possible with
+        * If neither EDIT_NEW nor EDIT_UPDATE is specified, the status of the
+        * article will be detected. If EDIT_UPDATE is specified and the article
+        * doesn't exist, the function will return an edit-gone-missing error. If
+        * EDIT_NEW is specified and the article does exist, an edit-already-exists
+        * error will be returned. These two conditions are also possible with
         * auto-detection due to MediaWiki's performance-optimised locking strategy.
         *
-        * @param bool|int $baseRevId int the revision ID this edit was based off, if any
-        * @param $user User the user doing the edit
+        * @param bool|int $baseRevId The revision ID this edit was based off, if any
+        * @param User $user The user doing the edit
         *
         * @throws MWException
         * @return Status object. Possible errors:
-        *     edit-hook-aborted:       The ArticleSave hook aborted the edit but didn't set the fatal flag of $status
-        *     edit-gone-missing:       In update mode, but the article didn't exist
-        *     edit-conflict:           In update mode, the article changed unexpectedly
-        *     edit-no-change:          Warning that the text was the same as before
-        *     edit-already-exists:     In creation mode, but the article already exists
+        *   edit-hook-aborted: The ArticleSave hook aborted the edit but didn't
+        *     set the fatal flag of $status
+        *   edit-gone-missing: In update mode, but the article didn't exist.
+        *   edit-conflict: In update mode, the article changed unexpectedly.
+        *   edit-no-change: Warning that the text was the same as before.
+        *   edit-already-exists: In creation mode, but the article already exists.
         *
-        *  Extensions may define additional errors.
+        * Extensions may define additional errors.
         *
-        *  $return->value will contain an associative array with members as follows:
-        *     new:                     Boolean indicating if the function attempted to create a new article
-        *     revision:                The revision object for the inserted revision, or null
+        * $return->value will contain an associative array with members as follows:
+        *     new: Boolean indicating if the function attempted to create a new article.
+        *     revision: The revision object for the inserted revision, or null.
         *
-        *  Compatibility note: this function previously returned a boolean value indicating success/failure
+        * Compatibility note: this function previously returned a boolean value
+        * indicating success/failure
         *
         * @deprecated since 1.21: use doEditContent() instead.
         */
@@ -1647,9 +1655,9 @@ class WikiPage implements Page, IDBAccessObject {
         * Change an existing article or create a new article. Updates RC and all necessary caches,
         * optionally via the deferred update array.
         *
-        * @param $content Content: new content
-        * @param string $summary edit summary
-        * @param $flags Integer bitfield:
+        * @param Content $content New content
+        * @param string $summary Edit summary
+        * @param int $flags Bitfield:
         *      EDIT_NEW
         *          Article is known or assumed to be non-existent, create a new one
         *      EDIT_UPDATE
@@ -1665,29 +1673,32 @@ class WikiPage implements Page, IDBAccessObject {
         *      EDIT_AUTOSUMMARY
         *          Fill in blank summaries with generated text where possible
         *
-        * If neither EDIT_NEW nor EDIT_UPDATE is specified, the status of the article will be detected.
-        * If EDIT_UPDATE is specified and the article doesn't exist, the function will return an
-        * edit-gone-missing error. If EDIT_NEW is specified and the article does exist, an
-        * edit-already-exists error will be returned. These two conditions are also possible with
+        * If neither EDIT_NEW nor EDIT_UPDATE is specified, the status of the
+        * article will be detected. If EDIT_UPDATE is specified and the article
+        * doesn't exist, the function will return an edit-gone-missing error. If
+        * EDIT_NEW is specified and the article does exist, an edit-already-exists
+        * error will be returned. These two conditions are also possible with
         * auto-detection due to MediaWiki's performance-optimised locking strategy.
         *
-        * @param bool|int $baseRevId the revision ID this edit was based off, if any
-        * @param $user User the user doing the edit
-        * @param $serialisation_format String: format for storing the content in the database
+        * @param bool|int $baseRevId The revision ID this edit was based off, if any
+        * @param User $user The user doing the edit
+        * @param string $serialisation_format Format for storing the content in the
+        *   database.
         *
         * @throws MWException
         * @return Status object. Possible errors:
-        *     edit-hook-aborted:       The ArticleSave hook aborted the edit but didn't set the fatal flag of $status
-        *     edit-gone-missing:       In update mode, but the article didn't exist
-        *     edit-conflict:           In update mode, the article changed unexpectedly
-        *     edit-no-change:          Warning that the text was the same as before
-        *     edit-already-exists:     In creation mode, but the article already exists
+        *     edit-hook-aborted: The ArticleSave hook aborted the edit but didn't
+        *       set the fatal flag of $status.
+        *     edit-gone-missing: In update mode, but the article didn't exist.
+        *     edit-conflict: In update mode, the article changed unexpectedly.
+        *     edit-no-change: Warning that the text was the same as before.
+        *     edit-already-exists: In creation mode, but the article already exists.
         *
         *  Extensions may define additional errors.
         *
         *  $return->value will contain an associative array with members as follows:
-        *     new:                     Boolean indicating if the function attempted to create a new article
-        *     revision:                The revision object for the inserted revision, or null
+        *     new: Boolean indicating if the function attempted to create a new article.
+        *     revision: The revision object for the inserted revision, or null.
         *
         * @since 1.21
         */
@@ -1827,11 +1838,7 @@ class WikiPage implements Page, IDBAccessObject {
 
                                        // Update page
                                        //
-                                       // Note that we use $this->mLatest instead of fetching a value from the master DB
-                                       // during the course of this function. This makes sure that EditPage can detect
-                                       // edit conflicts reliably, either by $ok here, or by $article->getTimestamp()
-                                       // before this function is called. A previous function used a separate query, this
-                                       // creates a window where concurrent edits can cause an ignored edit conflict.
+                                       // We check for conflicts by comparing $oldid with the current latest revision ID.
                                        $ok = $this->updateRevisionOn( $dbw, $revision, $oldid, $oldIsRedirect );
 
                                        if ( !$ok ) {
@@ -2022,7 +2029,8 @@ class WikiPage implements Page, IDBAccessObject {
                $options = $this->getContentHandler()->makeParserOptions( $context );
 
                if ( $this->getTitle()->isConversionTable() ) {
-                       // @todo ConversionTable should become a separate content model, so we don't need special cases like this one.
+                       // @todo ConversionTable should become a separate content model, so
+                       // we don't need special cases like this one.
                        $options->disableContentConversion();
                }
 
@@ -2034,6 +2042,7 @@ class WikiPage implements Page, IDBAccessObject {
         * Returns a stdclass with source, pst and output members
         *
         * @deprecated since 1.21: use prepareContentForEdit instead.
+        * @return object
         */
        public function prepareTextForEdit( $text, $revid = null, User $user = null ) {
                ContentHandler::deprecated( __METHOD__, '1.21' );
@@ -2088,7 +2097,9 @@ class WikiPage implements Page, IDBAccessObject {
 
                $edit->format = $serialization_format;
                $edit->popts = $this->makeParserOptions( 'canonical' );
-               $edit->output = $edit->pstContent ? $edit->pstContent->getParserOutput( $this->mTitle, $revid, $edit->popts ) : null;
+               $edit->output = $edit->pstContent
+                       ? $edit->pstContent->getParserOutput( $this->mTitle, $revid, $edit->popts )
+                       : null;
 
                $edit->newContent = $content;
                $edit->oldContent = $this->getContent( Revision::RAW );
@@ -2108,9 +2119,9 @@ class WikiPage implements Page, IDBAccessObject {
         * Purges pages that include this page if the text was changed here.
         * Every 100th edit, prune the recent changes table.
         *
-        * @param $revision Revision object
-        * @param $user User object that did the revision
-        * @param array $options of options, following indexes are used:
+        * @param Revision $revision
+        * @param User $user User object that did the revision
+        * @param array $options Array of options, following indexes are used:
         * - changed: boolean, whether the revision changed the content (default true)
         * - created: boolean, whether the revision created the page (default false)
         * - oldcountable: boolean or null (default null):
@@ -2174,19 +2185,17 @@ class WikiPage implements Page, IDBAccessObject {
 
                if ( !$options['changed'] ) {
                        $good = 0;
-                       $total = 0;
                } elseif ( $options['created'] ) {
                        $good = (int)$this->isCountable( $editInfo );
-                       $total = 1;
                } elseif ( $options['oldcountable'] !== null ) {
                        $good = (int)$this->isCountable( $editInfo ) - (int)$options['oldcountable'];
-                       $total = 0;
                } else {
                        $good = 0;
-                       $total = 0;
                }
+               $edits = $options['changed'] ? 1 : 0;
+               $total = $options['created'] ? 1 : 0;
 
-               DeferredUpdates::addUpdate( new SiteStatsUpdate( 0, 1, $good, $total ) );
+               DeferredUpdates::addUpdate( new SiteStatsUpdate( 0, $edits, $good, $total ) );
                DeferredUpdates::addUpdate( new SearchUpdate( $id, $title, $content ) );
 
                // If this is another user's talk page, update newtalk.
@@ -2227,7 +2236,7 @@ class WikiPage implements Page, IDBAccessObject {
 
                if ( $options['created'] ) {
                        self::onArticleCreate( $this->mTitle );
-               } else {
+               } elseif ( $options['changed'] ) { // bug 50785
                        self::onArticleEdit( $this->mTitle );
                }
 
@@ -2239,10 +2248,10 @@ class WikiPage implements Page, IDBAccessObject {
         * The article must already exist; link tables etc
         * are not updated, caches are not flushed.
         *
-        * @param string $text text submitted
-        * @param $user User The relevant user
-        * @param string $comment comment submitted
-        * @param $minor Boolean: whereas it's a minor modification
+        * @param string $text Text submitted
+        * @param User $user The relevant user
+        * @param string $comment Comment submitted
+        * @param bool $minor Whereas it's a minor modification
         *
         * @deprecated since 1.21, use doEditContent() instead.
         */
@@ -2275,6 +2284,8 @@ class WikiPage implements Page, IDBAccessObject {
                $revision = new Revision( array(
                        'title'      => $this->getTitle(), // for determining the default content model
                        'page'       => $this->getId(),
+                       'user_text'  => $user->getName(),
+                       'user'       => $user->getId(),
                        'text'       => $serialized,
                        'length'     => $content->getSize(),
                        'comment'    => $comment,
@@ -2292,14 +2303,16 @@ class WikiPage implements Page, IDBAccessObject {
         * Update the article's restriction field, and leave a log entry.
         * This works for protection both existing and non-existing pages.
         *
-        * @param array $limit set of restriction keys
-        * @param array $expiry per restriction type expiration
+        * @param array $limit Set of restriction keys
+        * @param array $expiry Per restriction type expiration
         * @param int &$cascade Set to false if cascading protection isn't allowed.
         * @param string $reason
         * @param User $user The user updating the restrictions
         * @return Status
         */
-       public function doUpdateRestrictions( array $limit, array $expiry, &$cascade, $reason, User $user ) {
+       public function doUpdateRestrictions( array $limit, array $expiry,
+               &$cascade, $reason, User $user
+       ) {
                global $wgCascadingRestrictionLevels, $wgContLang;
 
                if ( wfReadOnly() ) {
@@ -2385,7 +2398,9 @@ class WikiPage implements Page, IDBAccessObject {
                        }
 
                        // Only certain restrictions can cascade...
-                       $editrestriction = isset( $limit['edit'] ) ? array( $limit['edit'] ) : $this->mTitle->getRestrictions( 'edit' );
+                       $editrestriction = isset( $limit['edit'] )
+                               ? array( $limit['edit'] )
+                               : $this->mTitle->getRestrictions( 'edit' );
                        foreach ( array_keys( $editrestriction, 'sysop' ) as $key ) {
                                $editrestriction[$key] = 'editprotected'; // backwards compatibility
                        }
@@ -2408,7 +2423,15 @@ class WikiPage implements Page, IDBAccessObject {
 
                        // insert null revision to identify the page protection change as edit summary
                        $latest = $this->getLatest();
-                       $nullRevision = $this->insertProtectNullRevision( $revCommentMsg, $limit, $expiry, $cascade, $reason );
+                       $nullRevision = $this->insertProtectNullRevision(
+                               $revCommentMsg,
+                               $limit,
+                               $expiry,
+                               $cascade,
+                               $reason,
+                               $user
+                       );
+
                        if ( $nullRevision === null ) {
                                return Status::newFatal( 'no-null-revision', $this->mTitle->getPrefixedText() );
                        }
@@ -2502,14 +2525,17 @@ class WikiPage implements Page, IDBAccessObject {
        /**
         * Insert a new null revision for this page.
         *
-        * @param string $revCommentMsg comment message key for the revision
-        * @param array $limit set of restriction keys
-        * @param array $expiry per restriction type expiration
+        * @param string $revCommentMsg Comment message key for the revision
+        * @param array $limit Set of restriction keys
+        * @param array $expiry Per restriction type expiration
         * @param int $cascade Set to false if cascading protection isn't allowed.
         * @param string $reason
-        * @return Revision|null on error
+        * @param User|null $user
+        * @return Revision|null Null on error
         */
-       public function insertProtectNullRevision( $revCommentMsg, array $limit, array $expiry, $cascade, $reason ) {
+       public function insertProtectNullRevision( $revCommentMsg, array $limit,
+               array $expiry, $cascade, $reason, $user = null
+       ) {
                global $wgContLang;
                $dbw = wfGetDB( DB_MASTER );
 
@@ -2526,7 +2552,8 @@ class WikiPage implements Page, IDBAccessObject {
                $protectDescription = $this->protectDescription( $limit, $expiry );
                if ( $protectDescription ) {
                        $editComment .= wfMessage( 'word-separator' )->inContentLanguage()->text();
-                       $editComment .= wfMessage( 'parentheses' )->params( $protectDescription )->inContentLanguage()->text();
+                       $editComment .= wfMessage( 'parentheses' )->params( $protectDescription )
+                               ->inContentLanguage()->text();
                }
                if ( $cascade ) {
                        $editComment .= wfMessage( 'word-separator' )->inContentLanguage()->text();
@@ -2535,7 +2562,7 @@ class WikiPage implements Page, IDBAccessObject {
                        )->inContentLanguage()->text();
                }
 
-               $nullRev = Revision::newNullRevision( $dbw, $this->getId(), $editComment, true );
+               $nullRev = Revision::newNullRevision( $dbw, $this->getId(), $editComment, true, $user );
                if ( $nullRev ) {
                        $nullRev->insertOn( $dbw );
 
@@ -2572,8 +2599,8 @@ class WikiPage implements Page, IDBAccessObject {
        /**
         * Builds the description to serve as comment for the edit.
         *
-        * @param array $limit set of restriction keys
-        * @param array $expiry per restriction type expiration
+        * @param array $limit Set of restriction keys
+        * @param array $expiry Per restriction type expiration
         * @return string
         */
        public function protectDescription( array $limit, array $expiry ) {
@@ -2613,8 +2640,8 @@ class WikiPage implements Page, IDBAccessObject {
         * protect description text. Keep them in old format to avoid breaking compatibility.
         * TODO: Fix protection log to store structured description and format it on-the-fly.
         *
-        * @param array $limit set of restriction keys
-        * @param array $expiry per restriction type expiration
+        * @param array $limit Set of restriction keys
+        * @param array $expiry Per restriction type expiration
         * @return string
         */
        public function protectDescriptionLog( array $limit, array $expiry ) {
@@ -2661,14 +2688,14 @@ class WikiPage implements Page, IDBAccessObject {
         *
         * Deletes the article with database consistency, writes logs, purges caches
         *
-        * @param string $reason delete reason for deletion log
-        * @param $suppress boolean suppress all revisions and log the deletion in
+        * @param string $reason Delete reason for deletion log
+        * @param bool $suppress Suppress all revisions and log the deletion in
         *        the suppression log instead of the deletion log
-        * @param int $id article ID
-        * @param $commit boolean defaults to true, triggers transaction end
-        * @param &$error Array of errors to append to
-        * @param $user User The deleting user
-        * @return boolean true if successful
+        * @param int $id Article ID
+        * @param bool $commit Defaults to true, triggers transaction end
+        * @param array &$error Array of errors to append to
+        * @param User $user The deleting user
+        * @return bool true if successful
         */
        public function doDeleteArticle(
                $reason, $suppress = false, $id = 0, $commit = true, &$error = '', User $user = null
@@ -2683,16 +2710,16 @@ class WikiPage implements Page, IDBAccessObject {
         *
         * @since 1.19
         *
-        * @param string $reason delete reason for deletion log
-        * @param $suppress boolean suppress all revisions and log the deletion in
-        *        the suppression log instead of the deletion log
-        * @param int $id article ID
-        * @param $commit boolean defaults to true, triggers transaction end
-        * @param &$error Array of errors to append to
-        * @param $user User The deleting user
-        * @return Status: Status object; if successful, $status->value is the log_id of the
-        *                 deletion log entry. If the page couldn't be deleted because it wasn't
-        *                 found, $status is a non-fatal 'cannotdelete' error
+        * @param string $reason Delete reason for deletion log
+        * @param bool $suppress Suppress all revisions and log the deletion in
+        *   the suppression log instead of the deletion log
+        * @param int $id Article ID
+        * @param bool $commit Defaults to true, triggers transaction end
+        * @param array &$error Array of errors to append to
+        * @param User $user The deleting user
+        * @return Status Status object; if successful, $status->value is the log_id of the
+        *   deletion log entry. If the page couldn't be deleted because it wasn't
+        *   found, $status is a non-fatal 'cannotdelete' error
         */
        public function doDeleteArticleReal(
                $reason, $suppress = false, $id = 0, $commit = true, &$error = '', User $user = null
@@ -2800,6 +2827,9 @@ class WikiPage implements Page, IDBAccessObject {
                        $dbw->delete( 'revision', array( 'rev_page' => $id ), __METHOD__ );
                }
 
+               // 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
@@ -2807,7 +2837,7 @@ class WikiPage implements Page, IDBAccessObject {
 
                $logEntry = new ManualLogEntry( $logtype, 'delete' );
                $logEntry->setPerformer( $user );
-               $logEntry->setTarget( $this->mTitle );
+               $logEntry->setTarget( $logTitle );
                $logEntry->setComment( $reason );
                $logid = $logEntry->insert();
                $logEntry->publish( $logid );
@@ -2825,8 +2855,9 @@ class WikiPage implements Page, IDBAccessObject {
         * Do some database updates after deletion
         *
         * @param int $id page_id value of the page being deleted
-        * @param $content Content: optional page content to be used when determining the required updates.
-        *        This may be needed because $this->getContent() may already return null when the page proper was deleted.
+        * @param Content $content Optional page content to be used when determining
+        *   the required updates. This may be needed because $this->getContent()
+        *   may already return null when the page proper was deleted.
         */
        public function doDeleteUpdates( $id, Content $content = null ) {
                // update site status
@@ -2866,14 +2897,14 @@ class WikiPage implements Page, IDBAccessObject {
         * @param string $fromP Name of the user whose edits to rollback.
         * @param string $summary Custom summary. Set to default summary if empty.
         * @param string $token Rollback token.
-        * @param $bot Boolean: If true, mark all reverted edits as bot.
+        * @param bool $bot If true, mark all reverted edits as bot.
         *
         * @param array $resultDetails contains result-specific array of additional values
         *    'alreadyrolled' : 'current' (rev)
         *    success        : 'summary' (str), 'current' (rev), 'target' (rev)
         *
-        * @param $user User The user performing the rollback
-        * @return array of errors, each error formatted as
+        * @param User $user The user performing the rollback
+        * @return array Array of errors, each error formatted as
         *   array(messagekey, param1, param2, ...).
         * On success, the array is empty.  This array can also be passed to
         * OutputPage::showPermissionsErrorPage().
@@ -2914,10 +2945,10 @@ class WikiPage implements Page, IDBAccessObject {
         * doRollback() instead.
         * @param string $fromP Name of the user whose edits to rollback.
         * @param string $summary Custom summary. Set to default summary if empty.
-        * @param $bot Boolean: If true, mark all reverted edits as bot.
+        * @param bool $bot If true, mark all reverted edits as bot.
         *
-        * @param array $resultDetails contains result-specific array of additional values
-        * @param $guser User The user performing the rollback
+        * @param array $resultDetails Contains result-specific array of additional values
+        * @param User $guser The user performing the rollback
         * @return array
         */
        public function commitRollback( $fromP, $summary, $bot, &$resultDetails, User $guser ) {
@@ -2963,7 +2994,9 @@ class WikiPage implements Page, IDBAccessObject {
                if ( $s === false ) {
                        // No one else ever edited this page
                        return array( array( 'cantrollback' ) );
-               } elseif ( $s->rev_deleted & Revision::DELETED_TEXT || $s->rev_deleted & Revision::DELETED_USER ) {
+               } elseif ( $s->rev_deleted & Revision::DELETED_TEXT
+                       || $s->rev_deleted & Revision::DELETED_USER
+               ) {
                        // Only admins can see this text
                        return array( array( 'notvisiblerev' ) );
                }
@@ -3031,7 +3064,13 @@ class WikiPage implements Page, IDBAccessObject {
                }
 
                // Actually store the edit
-               $status = $this->doEditContent( $target->getContent(), $summary, $flags, $target->getId(), $guser );
+               $status = $this->doEditContent(
+                       $target->getContent(),
+                       $summary,
+                       $flags,
+                       $target->getId(),
+                       $guser
+               );
 
                if ( !$status->isOK() ) {
                        return $status->getErrorsArray();
@@ -3070,7 +3109,7 @@ class WikiPage implements Page, IDBAccessObject {
         *
         * This is called on page move and undelete, as well as edit
         *
-        * @param $title Title object
+        * @param Title $title
         */
        public static function onArticleCreate( $title ) {
                // Update existence markers on article/talk tabs...
@@ -3091,7 +3130,7 @@ class WikiPage implements Page, IDBAccessObject {
        /**
         * Clears caches when article is deleted
         *
-        * @param $title Title
+        * @param Title $title
         */
        public static function onArticleDelete( $title ) {
                // Update existence markers on article/talk tabs...
@@ -3137,8 +3176,9 @@ class WikiPage implements Page, IDBAccessObject {
        /**
         * Purge caches on page update etc
         *
-        * @param $title Title object
-        * @todo Verify that $title is always a Title object (and never false or null), add Title hint to parameter $title
+        * @param Title $title
+        * @todo Verify that $title is always a Title object (and never false or
+        *   null), add Title hint to parameter $title.
         */
        public static function onArticleEdit( $title ) {
                // Invalidate caches of articles which include this page
@@ -3184,7 +3224,7 @@ class WikiPage implements Page, IDBAccessObject {
         * Returns a list of hidden categories this page is a member of.
         * Uses the page_props and categorylinks tables.
         *
-        * @return Array of Title objects
+        * @return array Array of Title objects
         */
        public function getHiddenCategories() {
                $result = array();
@@ -3212,15 +3252,16 @@ class WikiPage implements Page, IDBAccessObject {
 
        /**
         * Return an applicable autosummary if one exists for the given edit.
-        * @param string|null $oldtext the previous text of the page.
+        * @param string|null $oldtext The previous text of the page.
         * @param string|null $newtext The submitted text of the page.
-        * @param int $flags bitmask: a bitmask of flags submitted for the edit.
+        * @param int $flags Bitmask: a bitmask of flags submitted for the edit.
         * @return string An appropriate autosummary, or an empty string.
         *
         * @deprecated since 1.21, use ContentHandler::getAutosummary() instead
         */
        public static function getAutosummary( $oldtext, $newtext, $flags ) {
-               // NOTE: stub for backwards-compatibility. assumes the given text is wikitext. will break horribly if it isn't.
+               // NOTE: stub for backwards-compatibility. assumes the given text is
+               // wikitext. will break horribly if it isn't.
 
                ContentHandler::deprecated( __METHOD__, '1.21' );
 
@@ -3234,8 +3275,8 @@ class WikiPage implements Page, IDBAccessObject {
        /**
         * Auto-generates a deletion reason
         *
-        * @param &$hasHistory Boolean: whether the page has a history
-        * @return mixed String containing deletion reason or empty string, or boolean false
+        * @param bool &$hasHistory Whether the page has a history
+        * @return string|bool String containing deletion reason or empty string, or boolean false
         *    if no revision occurred
         */
        public function getAutoDeleteReason( &$hasHistory ) {
@@ -3246,7 +3287,7 @@ class WikiPage implements Page, IDBAccessObject {
         * Update all the appropriate counts in the category table, given that
         * we've added the categories $added and deleted the categories $deleted.
         *
-        * @param array $added   The names of categories that were added
+        * @param array $added The names of categories that were added
         * @param array $deleted The names of categories that were deleted
         */
        public function updateCategoryCounts( array $added, array $deleted ) {
@@ -3313,7 +3354,7 @@ class WikiPage implements Page, IDBAccessObject {
        /**
         * Updates cascading protections
         *
-        * @param $parserOutput ParserOutput object for the current version
+        * @param ParserOutput $parserOutput ParserOutput object for the current version
         */
        public function doCascadeProtectionUpdates( ParserOutput $parserOutput ) {
                if ( wfReadOnly() || !$this->mTitle->areRestrictionsCascading() ) {
@@ -3370,7 +3411,8 @@ class WikiPage implements Page, IDBAccessObject {
 
                if ( count( $links_diff ) > 0 ) {
                        // Whee, link updates time.
-                       // Note: we are only interested in links here. We don't need to get other DataUpdate items from the parser output.
+                       // Note: we are only interested in links here. We don't need to get
+                       // other DataUpdate items from the parser output.
                        $u = new LinksUpdate( $this->mTitle, $parserOutput, false );
                        $u->doUpdate();
                }
@@ -3381,7 +3423,7 @@ class WikiPage implements Page, IDBAccessObject {
         * Uses the templatelinks table
         *
         * @deprecated since 1.19; use Title::getTemplateLinksFrom()
-        * @return Array of Title objects
+        * @return array Array of Title objects
         */
        public function getUsedTemplates() {
                return $this->mTitle->getTemplateLinksFrom();
@@ -3392,11 +3434,11 @@ class WikiPage implements Page, IDBAccessObject {
         * so we can do things like signatures and links-in-context.
         *
         * @deprecated since 1.19; use Parser::preSaveTransform() instead
-        * @param string $text article contents
-        * @param $user User object: user doing the edit
-        * @param $popts ParserOptions object: parser options, default options for
-        *               the user loaded if null given
-        * @return string article contents with altered wikitext markup (signatures
+        * @param string $text Article contents
+        * @param User $user User doing the edit
+        * @param ParserOptions $popts Parser options, default options for
+        *   the user loaded if null given
+        * @return string Article contents with altered wikitext markup (signatures
         *      converted, {{subst:}}, templates, etc.)
         */
        public function preSaveTransform( $text, User $user = null, ParserOptions $popts = null ) {
@@ -3439,11 +3481,11 @@ class WikiPage implements Page, IDBAccessObject {
         * Update the article's restriction field, and leave a log entry.
         *
         * @deprecated since 1.19
-        * @param array $limit set of restriction keys
-        * @param $reason String
-        * @param &$cascade Integer. Set to false if cascading protection isn't allowed.
-        * @param array $expiry per restriction type expiration
-        * @param $user User The user updating the restrictions
+        * @param array $limit Set of restriction keys
+        * @param string $reason
+        * @param int &$cascade Set to false if cascading protection isn't allowed.
+        * @param array $expiry Per restriction type expiration
+        * @param User $user The user updating the restrictions
         * @return bool true on success
         */
        public function updateRestrictions(
@@ -3457,11 +3499,13 @@ class WikiPage implements Page, IDBAccessObject {
        }
 
        /**
-        * Returns a list of updates to be performed when this page is deleted. The updates should remove any information
-        * about this page from secondary data stores such as links tables.
+        * Returns a list of updates to be performed when this page is deleted. The
+        * updates should remove any information about this page from secondary data
+        * stores such as links tables.
         *
-        * @param Content|null $content optional Content object for determining the necessary updates
-        * @return Array an array of DataUpdates objects
+        * @param Content|null $content Optional Content object for determining the
+        *   necessary updates.
+        * @return array An array of DataUpdates objects
         */
        public function getDeletionUpdates( Content $content = null ) {
                if ( !$content ) {
@@ -3483,57 +3527,42 @@ class WikiPage implements Page, IDBAccessObject {
 }
 
 class PoolWorkArticleView extends PoolCounterWork {
-
-       /**
-        * @var Page
-        */
+       /** @var Page */
        private $page;
 
-       /**
-        * @var string
-        */
+       /** @var string */
        private $cacheKey;
 
-       /**
-        * @var integer
-        */
+       /** @var int */
        private $revid;
 
-       /**
-        * @var ParserOptions
-        */
+       /** @var ParserOptions */
        private $parserOptions;
 
-       /**
-        * @var Content|null
-        */
+       /** @var Content|null */
        private $content = null;
 
-       /**
-        * @var ParserOutput|bool
-        */
+       /** @var ParserOutput|bool */
        private $parserOutput = false;
 
-       /**
-        * @var bool
-        */
+       /** @var bool */
        private $isDirty = false;
 
-       /**
-        * @var Status|bool
-        */
+       /** @var Status|bool */
        private $error = false;
 
        /**
-        * Constructor
-        *
-        * @param $page Page|WikiPage
-        * @param $revid Integer: ID of the revision being parsed
-        * @param $useParserCache Boolean: whether to use the parser cache
-        * @param $parserOptions parserOptions to use for the parse operation
-        * @param $content Content|String: content to parse or null to load it; may also be given as a wikitext string, for BC
+        * @param Page $page
+        * @param int $revid ID of the revision being parsed.
+        * @param bool $useParserCache Whether to use the parser cache.
+        * @param ParserOptions $parserOptions ParserOptions to use for the parse
+        *   operation.
+        * @param Content|string $content Content to parse or null to load it; may
+        *   also be given as a wikitext string, for BC.
         */
-       public function __construct( Page $page, ParserOptions $parserOptions, $revid, $useParserCache, $content = null ) {
+       public function __construct( Page $page, ParserOptions $parserOptions,
+               $revid, $useParserCache, $content = null
+       ) {
                if ( is_string( $content ) ) { // BC: old style call
                        $modelId = $page->getRevision()->getContentModel();
                        $format = $page->getRevision()->getContentFormat();
@@ -3611,7 +3640,11 @@ class PoolWorkArticleView extends PoolCounterWork {
                $cacheTime = wfTimestampNow();
 
                $time = - microtime( true );
-               $this->parserOutput = $content->getParserOutput( $this->page->getTitle(), $this->revid, $this->parserOptions );
+               $this->parserOutput = $content->getParserOutput(
+                       $this->page->getTitle(),
+                       $this->revid,
+                       $this->parserOptions
+               );
                $time += microtime( true );
 
                // Timing hack
@@ -3673,7 +3706,7 @@ class PoolWorkArticleView extends PoolCounterWork {
        }
 
        /**
-        * @param $status Status
+        * @param Status $status
         * @return bool
         */
        public function error( $status ) {
index 3b82c64..6fb5380 100644 (file)
@@ -30,13 +30,15 @@ class Xml {
         * Strings are assumed to not contain XML-illegal characters; special
         * characters (<, >, &) are escaped but illegals are not touched.
         *
-        * @param string $element element name
+        * @param string $element Element name
         * @param array $attribs Name=>value pairs. Values will be escaped.
-        * @param string $contents NULL to make an open tag only; '' for a contentless closed tag (default)
-        * @param bool $allowShortTag whether '' in $contents will result in a contentless closed tag
+        * @param string $contents Null to make an open tag only; '' for a contentless closed tag (default)
+        * @param bool $allowShortTag Whether '' in $contents will result in a contentless closed tag
         * @return string
         */
-       public static function element( $element, $attribs = null, $contents = '', $allowShortTag = true ) {
+       public static function element( $element, $attribs = null, $contents = '',
+               $allowShortTag = true
+       ) {
                $out = '<' . $element;
                if ( !is_null( $attribs ) ) {
                        $out .= self::expandAttributes( $attribs );
@@ -58,7 +60,7 @@ class Xml {
         * to set the XML attributes : attributename="value".
         * The values are passed to Sanitizer::encodeAttribute.
         * Return null if no attributes given.
-        * @param array $attribs of attributes for an XML element
+        * @param array $attribs Array of attributes for an XML element
         * @throws MWException
         * @return null|string
         */
@@ -81,9 +83,9 @@ class Xml {
         * $wgContLang->normalize() validator first to ensure that no invalid UTF-8
         * is passed.
         *
-        * @param $element String:
+        * @param string $element
         * @param array $attribs Name=>value pairs. Values will be escaped.
-        * @param string $contents NULL to make an open tag only; '' for a contentless closed tag (default)
+        * @param string $contents Null to make an open tag only; '' for a contentless closed tag (default)
         * @return string
         */
        public static function elementClean( $element, $attribs = array(), $contents = '' ) {
@@ -102,8 +104,8 @@ class Xml {
        /**
         * This opens an XML element
         *
-        * @param string $element name of the element
-        * @param array $attribs of attributes, see Xml::expandAttributes()
+        * @param string $element Name of the element
+        * @param array $attribs Array of attributes, see Xml::expandAttributes()
         * @return string
         */
        public static function openElement( $element, $attribs = null ) {
@@ -112,7 +114,7 @@ class Xml {
 
        /**
         * Shortcut to close an XML element
-        * @param string $element element name
+        * @param string $element Element name
         * @return string
         */
        public static function closeElement( $element ) {
@@ -123,9 +125,9 @@ class Xml {
         * Same as Xml::element(), but does not escape contents. Handy when the
         * content you have is already valid xml.
         *
-        * @param string $element element name
-        * @param array $attribs of attributes
-        * @param string $contents content of the element
+        * @param string $element Element name
+        * @param array $attribs Array of attributes
+        * @param string $contents Content of the element
         * @return string
         */
        public static function tags( $element, $attribs = null, $contents ) {
@@ -135,14 +137,16 @@ class Xml {
        /**
         * Build a drop-down box for selecting a namespace
         *
-        * @param $selected Mixed: Namespace which should be pre-selected
-        * @param $all Mixed: Value of an item denoting all namespaces, or null to omit
-        * @param $element_name String: value of the "name" attribute of the select tag
-        * @param string $label optional label to add to the field
+        * @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 ) {
+       public static function namespaceSelector( $selected = '', $all = null,
+               $element_name = 'namespace', $label = null
+       ) {
                wfDeprecated( __METHOD__, '1.19' );
                return Html::namespaceSelector( array(
                        'selected' => $selected,
@@ -158,10 +162,11 @@ class Xml {
        /**
         * Create a date selector
         *
-        * @param $selected Mixed: the month which should be selected, default ''
-        * @param string $allmonths value of a special item denoting all month. Null to not include (default)
+        * @param string $selected The month which should be selected, default ''.
+        * @param string $allmonths Value of a special item denoting all month.
+        *   Null to not include (default).
         * @param string $id Element identifier
-        * @return String: Html string containing the month selector
+        * @return string Html string containing the month selector
         */
        public static function monthSelector( $selected = '', $allmonths = null, $id = 'month' ) {
                global $wgLang;
@@ -170,19 +175,27 @@ class Xml {
                        $selected = '';
                }
                if ( !is_null( $allmonths ) ) {
-                       $options[] = self::option( wfMessage( 'monthsall' )->text(), $allmonths, $selected === $allmonths );
+                       $options[] = self::option(
+                               wfMessage( 'monthsall' )->text(),
+                               $allmonths,
+                               $selected === $allmonths
+                       );
                }
                for ( $i = 1; $i < 13; $i++ ) {
                        $options[] = self::option( $wgLang->getMonthName( $i ), $i, $selected === $i );
                }
-               return self::openElement( 'select', array( 'id' => $id, 'name' => 'month', 'class' => 'mw-month-selector' ) )
+               return self::openElement( 'select', array(
+                       'id' => $id,
+                       'name' => 'month',
+                       'class' => 'mw-month-selector'
+               ) )
                        . implode( "\n", $options )
                        . self::closeElement( 'select' );
        }
 
        /**
-        * @param $year Integer
-        * @param $month Integer
+        * @param int $year
+        * @param int $month
         * @return string Formatted HTML
         */
        public static function dateMenu( $year, $month ) {
@@ -216,13 +229,15 @@ class Xml {
         * Construct a language selector appropriate for use in a form or preferences
         *
         * @param string $selected The language code of the selected language
-        * @param boolean $customisedOnly If true only languages which have some content are listed
+        * @param bool $customisedOnly If true only languages which have some content are listed
         * @param string $inLanguage The ISO code of the language to display the select list in (optional)
         * @param array $overrideAttrs Override the attributes of the select tag (since 1.20)
         * @param Message|null $msg Label message key (since 1.20)
         * @return array containing 2 items: label HTML and select list HTML
         */
-       public static function languageSelector( $selected, $customisedOnly = true, $inLanguage = null, $overrideAttrs = array(), Message $msg = null ) {
+       public static function languageSelector( $selected, $customisedOnly = true,
+               $inLanguage = null, $overrideAttrs = array(), Message $msg = null
+       ) {
                global $wgLanguageCode;
 
                $include = $customisedOnly ? 'mwfile' : 'mw';
@@ -262,9 +277,9 @@ class Xml {
 
        /**
         * Shortcut to make a span element
-        * @param string $text content of the element, will be escaped
-        * @param string $class class name of the span element
-        * @param array $attribs other attributes
+        * @param string $text Content of the element, will be escaped
+        * @param string $class Class name of the span element
+        * @param array $attribs Other attributes
         * @return string
         */
        public static function span( $text, $class, $attribs = array() ) {
@@ -273,10 +288,10 @@ class Xml {
 
        /**
         * Shortcut to make a specific element with a class attribute
-        * @param string $text content of the element, will be escaped
-        * @param string $class class name of the span element
-        * @param string $tag element name
-        * @param array $attribs other attributes
+        * @param string $text Content of the element, will be escaped
+        * @param string $class Class name of the span element
+        * @param string $tag Element name
+        * @param array $attribs Other attributes
         * @return string
         */
        public static function wrapClass( $text, $class, $tag = 'span', $attribs = array() ) {
@@ -285,10 +300,10 @@ class Xml {
 
        /**
         * Convenience function to build an HTML text input field
-        * @param string $name value of the name attribute
-        * @param int $size value of the size attribute
-        * @param $value mixed value of the value attribute
-        * @param array $attribs other attributes
+        * @param string $name Value of the name attribute
+        * @param int $size Value of the size attribute
+        * @param mixed $value Value of the value attribute
+        * @param array $attribs Other attributes
         * @return string HTML
         */
        public static function input( $name, $size = false, $value = false, $attribs = array() ) {
@@ -307,21 +322,24 @@ class Xml {
 
        /**
         * Convenience function to build an HTML password input field
-        * @param string $name value of the name attribute
-        * @param int $size value of the size attribute
-        * @param $value mixed value of the value attribute
-        * @param array $attribs other attributes
+        * @param string $name Value of the name attribute
+        * @param int $size Value of the size attribute
+        * @param mixed $value Value of the value attribute
+        * @param array $attribs Other attributes
         * @return string HTML
         */
-       public static function password( $name, $size = false, $value = false, $attribs = array() ) {
-               return self::input( $name, $size, $value, array_merge( $attribs, array( 'type' => 'password' ) ) );
+       public static function password( $name, $size = false, $value = false,
+               $attribs = array()
+       ) {
+               return self::input( $name, $size, $value,
+                       array_merge( $attribs, array( 'type' => 'password' ) ) );
        }
 
        /**
         * Internal function for use in checkboxes and radio buttons and such.
         *
-        * @param $name string
-        * @param $present bool
+        * @param string $name
+        * @param bool $present
         *
         * @return array
         */
@@ -331,9 +349,9 @@ class Xml {
 
        /**
         * Convenience function to build an HTML checkbox
-        * @param string $name value of the name attribute
+        * @param string $name Value of the name attribute
         * @param bool $checked Whether the checkbox is checked or not
-        * @param array $attribs other attributes
+        * @param array $attribs Array other attributes
         * @return string HTML
         */
        public static function check( $name, $checked = false, $attribs = array() ) {
@@ -348,10 +366,10 @@ class Xml {
 
        /**
         * Convenience function to build an HTML radio button
-        * @param string $name value of the name attribute
-        * @param string $value value of the value attribute
+        * @param string $name Value of the name attribute
+        * @param string $value Value of the value attribute
         * @param bool $checked Whether the checkbox is checked or not
-        * @param array $attribs other attributes
+        * @param array $attribs Other attributes
         * @return string HTML
         */
        public static function radio( $name, $value, $checked = false, $attribs = array() ) {
@@ -363,9 +381,9 @@ class Xml {
 
        /**
         * Convenience function to build an HTML form label
-        * @param string $label text of the label
-        * @param $id
-        * @param array $attribs an attribute array.  This will usually be
+        * @param string $label Text of the label
+        * @param string $id
+        * @param array $attribs An attribute array.  This will usually be
         *     the same array as is passed to the corresponding input element,
         *     so this function will cherry-pick appropriate attributes to
         *     apply to the label as well; only class and title are applied.
@@ -387,15 +405,17 @@ class Xml {
 
        /**
         * Convenience function to build an HTML text input field with a label
-        * @param string $label text of the label
-        * @param string $name value of the name attribute
-        * @param string $id id of the input
-        * @param int|Bool $size value of the size attribute
-        * @param string|Bool $value value of the value attribute
-        * @param array $attribs other attributes
+        * @param string $label Text of the label
+        * @param string $name Value of the name attribute
+        * @param string $id Id of the input
+        * @param int|bool $size Value of the size attribute
+        * @param string|bool $value Value of the value attribute
+        * @param array $attribs Other attributes
         * @return string HTML
         */
-       public static function inputLabel( $label, $name, $id, $size = false, $value = false, $attribs = array() ) {
+       public static function inputLabel( $label, $name, $id, $size = false,
+               $value = false, $attribs = array()
+       ) {
                list( $label, $input ) = self::inputLabelSep( $label, $name, $id, $size, $value, $attribs );
                return $label . '&#160;' . $input;
        }
@@ -403,16 +423,18 @@ class Xml {
        /**
         * Same as Xml::inputLabel() but return input and label in an array
         *
-        * @param $label String
-        * @param $name String
-        * @param $id String
-        * @param $size Int|Bool
-        * @param $value String|Bool
-        * @param $attribs array
+        * @param string $label
+        * @param string $name
+        * @param string $id
+        * @param int|bool $size
+        * @param string|bool $value
+        * @param array $attribs
         *
         * @return array
         */
-       public static function inputLabelSep( $label, $name, $id, $size = false, $value = false, $attribs = array() ) {
+       public static function inputLabelSep( $label, $name, $id, $size = false,
+               $value = false, $attribs = array()
+       ) {
                return array(
                        Xml::label( $label, $id, $attribs ),
                        self::input( $name, $size, $value, array( 'id' => $id ) + $attribs )
@@ -422,11 +444,11 @@ class Xml {
        /**
         * Convenience function to build an HTML checkbox with a label
         *
-        * @param $label
-        * @param $name
-        * @param $id
-        * @param $checked bool
-        * @param $attribs array
+        * @param string $label
+        * @param string $name
+        * @param string $id
+        * @param bool $checked
+        * @param array $attribs
         *
         * @return string HTML
         */
@@ -439,16 +461,18 @@ class Xml {
        /**
         * Convenience function to build an HTML radio button with a label
         *
-        * @param $label
-        * @param $name
-        * @param $value
-        * @param $id
-        * @param $checked bool
-        * @param $attribs array
+        * @param string $label
+        * @param string $name
+        * @param string $value
+        * @param string $id
+        * @param bool $checked
+        * @param array $attribs
         *
         * @return string HTML
         */
-       public static function radioLabel( $label, $name, $value, $id, $checked = false, $attribs = array() ) {
+       public static function radioLabel( $label, $name, $value, $id,
+               $checked = false, $attribs = array()
+       ) {
                return self::radio( $name, $value, $checked, array( 'id' => $id ) + $attribs ) .
                        '&#160;' .
                        self::label( $label, $id, $attribs );
@@ -456,8 +480,8 @@ class Xml {
 
        /**
         * Convenience function to build an HTML submit button
-        * @param string $value label text for the button
-        * @param array $attribs optional custom attributes
+        * @param string $value Label text for the button
+        * @param array $attribs Optional custom attributes
         * @return string HTML
         */
        public static function submitButton( $value, $attribs = array() ) {
@@ -466,10 +490,10 @@ class Xml {
 
        /**
         * Convenience function to build an HTML drop-down list item.
-        * @param string $text text for this item. Will be HTML escaped
-        * @param string $value form submission value; if empty, use text
-        * @param $selected boolean: if true, will be the default selected item
-        * @param array $attribs optional additional HTML attributes
+        * @param string $text Text for this item. Will be HTML escaped
+        * @param string $value Form submission value; if empty, use text
+        * @param bool $selected If true, will be the default selected item
+        * @param array $attribs Optional additional HTML attributes
         * @return string HTML
         */
        public static function option( $text, $value = null, $selected = false,
@@ -486,15 +510,18 @@ class Xml {
        /**
         * Build a drop-down box from a textual list.
         *
-        * @param $name Mixed: Name and id for the drop-down
-        * @param $list Mixed: Correctly formatted text (newline delimited) to be used to generate the options
-        * @param $other Mixed: Text for the "Other reasons" option
-        * @param $selected Mixed: Option which should be pre-selected
-        * @param $class Mixed: CSS classes for the drop-down
-        * @param $tabindex Mixed: Value of the tabindex attribute
+        * @param string $name Name and id for the drop-down
+        * @param string $list Correctly formatted text (newline delimited) to be
+        *   used to generate the options.
+        * @param string $other Text for the "Other reasons" option
+        * @param string $selected Option which should be pre-selected
+        * @param string $class CSS classes for the drop-down
+        * @param int $tabindex Value of the tabindex attribute
         * @return string
         */
-       public static function listDropDown( $name = '', $list = '', $other = '', $selected = '', $class = '', $tabindex = null ) {
+       public static function listDropDown( $name = '', $list = '', $other = '',
+               $selected = '', $class = '', $tabindex = null
+       ) {
                $optgroup = false;
 
                $options = self::option( $other, 'other', $selected === 'other' );
@@ -554,8 +581,10 @@ class Xml {
        /**
         * Shortcut for creating fieldsets.
         *
-        * @param string|bool $legend Legend of the fieldset. If evaluates to false, legend is not added.
-        * @param string $content Pre-escaped content for the fieldset. If false, only open fieldset is returned.
+        * @param string|bool $legend Legend of the fieldset. If evaluates to false,
+        *   legend is not added.
+        * @param string $content Pre-escaped content for the fieldset. If false,
+        *   only open fieldset is returned.
         * @param array $attribs Any attributes to fieldset-element.
         *
         * @return string
@@ -603,8 +632,8 @@ class Xml {
         * Illegal control characters are assumed not to be present.
         *
         * @deprecated since 1.21; use Xml::encodeJsVar() or Xml::encodeJsCall() instead
-        * @param string $string to escape
-        * @return String
+        * @param string $string String to escape
+        * @return string
         */
        public static function escapeJsString( $string ) {
                // See ECMA 262 section 7.8.4 for string literal format
@@ -642,7 +671,7 @@ class Xml {
         *
         * @param mixed $value The value being encoded. Can be any type except a resource.
         * @param bool $pretty If true, add non-significant whitespace to improve readability.
-        * @return string|bool: String if successful; false upon failure
+        * @return string|bool String if successful; false upon failure
         */
        public static function encodeJsVar( $value, $pretty = false ) {
                if ( $value instanceof XmlJsCode ) {
@@ -660,7 +689,7 @@ class Xml {
         *    which evaluates to a function object which is called.
         * @param array $args The arguments to pass to the function.
         * @param bool $pretty If true, add non-significant whitespace to improve readability.
-        * @return string|bool: String if successful; false upon failure
+        * @return string|bool String if successful; false upon failure
         */
        public static function encodeJsCall( $name, $args, $pretty = false ) {
                foreach ( $args as &$arg ) {
@@ -680,7 +709,7 @@ class Xml {
         * Check if a string is well-formed XML.
         * Must include the surrounding tag.
         *
-        * @param string $text string to test.
+        * @param string $text String to test.
         * @return bool
         *
         * @todo Error position reporting return
@@ -710,7 +739,7 @@ class Xml {
         * Wraps fragment in an \<html\> bit and doctype, so it can be a fragment
         * and can use HTML named entities.
         *
-        * @param $text String:
+        * @param string $text
         * @return bool
         */
        public static function isWellFormedXmlFragment( $text ) {
@@ -727,7 +756,7 @@ class Xml {
         * Replace " > and < with their respective HTML entities ( &quot;,
         * &gt;, &lt;)
         *
-        * @param string $in text that might contain HTML tags.
+        * @param string $in Text that might contain HTML tags.
         * @return string Escaped string
         */
        public static function escapeTagsOnly( $in ) {
@@ -740,8 +769,11 @@ class Xml {
        /**
         * Generate a form (without the opening form element).
         * Output optionally includes a submit button.
-        * @param array $fields Associative array, key is the name of a message that contains a description for the field, value is an HTML string containing the appropriate input.
-        * @param string $submitLabel The name of a message containing a label for the submit button.
+        * @param array $fields Associative array, key is the name of a message that
+        *   contains a description for the field, value is an HTML string
+        *   containing the appropriate input.
+        * @param string $submitLabel The name of a message containing a label for
+        *   the submit button.
         * @param array $submitAttribs The attributes to add to the submit button
         * @return string HTML form.
         */
@@ -758,14 +790,17 @@ class Xml {
                        // the input somehow.
 
                        $form .= Xml::tags( 'td', array( 'class' => 'mw-label' ), wfMessage( $labelmsg )->parse() );
-                       $form .= Xml::openElement( 'td', array( 'class' => 'mw-input' ) ) . $input . Xml::closeElement( 'td' );
+                       $form .= Xml::openElement( 'td', array( 'class' => 'mw-input' ) )
+                               . $input . Xml::closeElement( 'td' );
                        $form .= Xml::closeElement( 'tr' );
                }
 
                if ( $submitLabel ) {
                        $form .= Xml::openElement( 'tr' );
                        $form .= Xml::tags( 'td', array(), '' );
-                       $form .= Xml::openElement( 'td', array( 'class' => 'mw-submit' ) ) . Xml::submitButton( wfMessage( $submitLabel )->text(), $submitAttribs ) . Xml::closeElement( 'td' );
+                       $form .= Xml::openElement( 'td', array( 'class' => 'mw-submit' ) )
+                               . Xml::submitButton( wfMessage( $submitLabel )->text(), $submitAttribs )
+                               . Xml::closeElement( 'td' );
                        $form .= Xml::closeElement( 'tr' );
                }
 
@@ -859,22 +894,22 @@ class XmlSelect {
        }
 
        /**
-        * @param $default
+        * @param string $default
         */
        public function setDefault( $default ) {
                $this->default = $default;
        }
 
        /**
-        * @param $name string
-        * @param $value
+        * @param string $name
+        * @param array $value
         */
        public function setAttribute( $name, $value ) {
                $this->attributes[$name] = $value;
        }
 
        /**
-        * @param $name
+        * @param string $name
         * @return array|null
         */
        public function getAttribute( $name ) {
@@ -886,8 +921,8 @@ class XmlSelect {
        }
 
        /**
-        * @param $name
-        * @param $value bool
+        * @param string $name
+        * @param bool $value
         */
        public function addOption( $name, $value = false ) {
                // Stab stab stab
@@ -901,7 +936,7 @@ class XmlSelect {
         * label => value
         * label => ( label => value, label => value )
         *
-        * @param $options
+        * @param array $options
         */
        public function addOptions( $options ) {
                $this->options[] = $options;
@@ -912,7 +947,7 @@ class XmlSelect {
         * label => value
         * label => ( label => value, label => value )
         *
-        * @param $options
+        * @param array $options
         * @param bool $default
         * @return string
         */
index 06e3667..6b25460 100644 (file)
@@ -262,6 +262,7 @@ class InfoAction extends FormlessAction {
                        $sortKey = $pageProperties['defaultsort'];
                }
 
+               $sortKey = htmlspecialchars( $sortKey );
                $pageInfo['header-basic'][] = array( $this->msg( 'pageinfo-default-sort' ), $sortKey );
 
                // Page length (in bytes)
index fc1bfd1..cfd4d01 100644 (file)
@@ -93,7 +93,7 @@ abstract class ApiBase extends ContextSource {
 
        /**
         * Constructor
-        * @param $mainModule ApiMain object
+        * @param ApiMain $mainModule
         * @param string $moduleName Name of this module
         * @param string $modulePrefix Prefix to use for parameter names
         */
@@ -170,7 +170,7 @@ abstract class ApiBase extends ContextSource {
        /**
         * Get the name of the module as shown in the profiler log
         *
-        * @param $db DatabaseBase|bool
+        * @param DatabaseBase|bool $db
         *
         * @return string
         */
@@ -184,7 +184,7 @@ abstract class ApiBase extends ContextSource {
 
        /**
         * Get the main module
-        * @return ApiMain object
+        * @return ApiMain
         */
        public function getMain() {
                return $this->mMainModule;
@@ -274,7 +274,7 @@ abstract class ApiBase extends ContextSource {
         * 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
+        * @return mixed Instance of a derived class of ApiFormatBase, or null
         */
        public function getCustomPrinter() {
                return null;
@@ -282,7 +282,7 @@ abstract class ApiBase extends ContextSource {
 
        /**
         * Generates help message for this module, or false if there is no description
-        * @return mixed string or false
+        * @return string|bool
         */
        public function makeHelpMsg() {
                static $lnPrfx = "\n  ";
@@ -349,7 +349,7 @@ abstract class ApiBase extends ContextSource {
        }
 
        /**
-        * @param $item string
+        * @param string $item
         * @return string
         */
        private function indentExampleText( $item ) {
@@ -359,7 +359,7 @@ abstract class ApiBase extends ContextSource {
        /**
         * @param string $prefix Text to split output items
         * @param string $title What is being output
-        * @param $input string|array
+        * @param string|array $input
         * @return string
         */
        protected function makeHelpArrayToString( $prefix, $title, $input ) {
@@ -387,7 +387,7 @@ abstract class ApiBase extends ContextSource {
        /**
         * Generates the parameter descriptions for this module, to be displayed in the
         * module's help.
-        * @return string or false
+        * @return string|bool
         */
        public function makeHelpMsgParameters() {
                $params = $this->getFinalParams( ApiBase::GET_VALUES_FOR_HELP );
@@ -537,7 +537,7 @@ abstract class ApiBase extends ContextSource {
 
        /**
         * Returns the description string for this module
-        * @return mixed string or array of strings
+        * @return string|array
         */
        protected function getDescription() {
                return false;
@@ -584,7 +584,7 @@ abstract class ApiBase extends ContextSource {
         * tweak it as needed.
         *
         * @param int $flags Zero or more flags like GET_VALUES_FOR_HELP
-        * @return array|Bool False on no parameters
+        * @return array|bool False on no parameters
         * @since 1.21 $flags param added
         */
        public function getFinalParams( $flags = 0 ) {
@@ -643,6 +643,8 @@ abstract class ApiBase extends ContextSource {
        /**
         * Add token properties to the array used by getResultProperties,
         * based on a token functions mapping.
+        * @param array $props
+        * @param array $tokenFunctions
         */
        protected static function addTokenProperties( &$props, $tokenFunctions ) {
                foreach ( array_keys( $tokenFunctions ) as $token ) {
@@ -682,7 +684,7 @@ abstract class ApiBase extends ContextSource {
         * 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 $parseLimit Boolean: true by default
+        * @param bool $parseLimit True by default
         * @return array
         */
        public function extractRequestParams( $parseLimit = true ) {
@@ -706,7 +708,7 @@ abstract class ApiBase extends ContextSource {
        /**
         * Get a value for the given parameter
         * @param string $paramName Parameter name
-        * @param bool $parseLimit see extractRequestParams()
+        * @param bool $parseLimit See extractRequestParams()
         * @return mixed Parameter value
         */
        protected function getParameter( $paramName, $parseLimit = true ) {
@@ -718,9 +720,13 @@ abstract class ApiBase extends ContextSource {
 
        /**
         * Die if none or more than one of a certain set of parameters is set and not false.
-        * @param array $params of parameter names
+        *
+        * Call getRequireOnlyOneParameterErrorMessages() to get a list of possible errors.
+        *
+        * @param array $params User provided set of parameters, as from $this->extractRequestParams()
+        * @param string $required,... Names of parameters of which exactly one must be set
         */
-       public function requireOnlyOneParameter( $params ) {
+       public function requireOnlyOneParameter( $params, $required /*...*/ ) {
                $required = func_get_args();
                array_shift( $required );
                $p = $this->getModulePrefix();
@@ -743,7 +749,7 @@ abstract class ApiBase extends ContextSource {
        /**
         * Generates the possible errors requireOnlyOneParameter() can die with
         *
-        * @param $params array
+        * @param array $params
         * @return array
         */
        public function getRequireOnlyOneParameterErrorMessages( $params ) {
@@ -765,9 +771,12 @@ abstract class ApiBase extends ContextSource {
        /**
         * Die if more than one of a certain set of parameters is set and not false.
         *
-        * @param $params array
+        * Call getRequireMaxOneParameterErrorMessages() to get a list of possible errors.
+        *
+        * @param array $params User provided set of parameters, as from $this->extractRequestParams()
+        * @param string $required,... Names of parameters of which at most one must be set
         */
-       public function requireMaxOneParameter( $params ) {
+       public function requireMaxOneParameter( $params, $required /*...*/ ) {
                $required = func_get_args();
                array_shift( $required );
                $p = $this->getModulePrefix();
@@ -786,7 +795,7 @@ abstract class ApiBase extends ContextSource {
        /**
         * Generates the possible error requireMaxOneParameter() can die with
         *
-        * @param $params array
+        * @param array $params
         * @return array
         */
        public function getRequireMaxOneParameterErrorMessages( $params ) {
@@ -804,11 +813,13 @@ abstract class ApiBase extends ContextSource {
        /**
         * Die if none of a certain set of parameters is set and not false.
         *
+        * Call getRequireAtLeastOneParameterErrorMessages() to get a list of possible errors.
+        *
         * @since 1.23
-        * @param array $params User provided set of parameters
-        * @param string ... List of parameter names to check
+        * @param array $params User provided set of parameters, as from $this->extractRequestParams()
+        * @param string $required,... Names of parameters of which at least one must be set
         */
-       public function requireAtLeastOneParameter( $params ) {
+       public function requireAtLeastOneParameter( $params, $required /*...*/ ) {
                $required = func_get_args();
                array_shift( $required );
                $p = $this->getModulePrefix();
@@ -828,7 +839,7 @@ abstract class ApiBase extends ContextSource {
         * Generates the possible errors requireAtLeastOneParameter() can die with
         *
         * @since 1.23
-        * @param $params array Array of parameter key names
+        * @param array $params Array of parameter key names
         * @return array
         */
        public function getRequireAtLeastOneParameterErrorMessages( $params ) {
@@ -844,7 +855,12 @@ abstract class ApiBase extends ContextSource {
        }
 
        /**
-        * @param $params array
+        * Get a WikiPage object from a title or pageid param, if possible.
+        * Can die, if no param is set or if the title or page id is not valid.
+        *
+        * Call getTitleOrPageIdErrorMessage() to get a list of possible errors.
+        *
+        * @param array $params
         * @param bool|string $load Whether load the object's state from the database:
         *        - false: don't load (if the pageid is given, it will still be loaded)
         *        - 'fromdb': load from a slave database
@@ -881,6 +897,8 @@ abstract class ApiBase extends ContextSource {
        }
 
        /**
+        * Generates the possible error getTitleOrPageId() can die with
+        *
         * @return array
         */
        public function getTitleOrPageIdErrorMessage() {
@@ -896,7 +914,7 @@ abstract class ApiBase extends ContextSource {
        /**
         * Callback function used in requireOnlyOneParameter to check whether required parameters are set
         *
-        * @param $x object Parameter to check is not null/false
+        * @param object $x Parameter to check is not null/false
         * @return bool
         */
        private function parameterNotEmpty( $x ) {
@@ -906,7 +924,7 @@ abstract class ApiBase extends ContextSource {
        /**
         * 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'
-        * @param $titleObj Title the page under consideration
+        * @param Title $titleObj The page under consideration
         * @param string $userOption The user option to consider when $watchlist=preferences.
         *    If not set will use watchdefault always and watchcreations if $titleObj doesn't exist.
         * @return bool
@@ -947,7 +965,7 @@ 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 $titleObj Title the article's title to change
+        * @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 ) {
@@ -962,10 +980,10 @@ abstract class ApiBase extends ContextSource {
        /**
         * Using the settings determine the value for the given parameter
         *
-        * @param string $paramName parameter name
-        * @param array|mixed $paramSettings default value or an array of settings
+        * @param string $paramName Parameter name
+        * @param array|mixed $paramSettings Default value or an array of settings
         *  using PARAM_* constants.
-        * @param $parseLimit Boolean: parse limit?
+        * @param bool $parseLimit Parse limit?
         * @return mixed Parameter value
         */
        protected function getParameterFromSettings( $paramName, $paramSettings, $parseLimit ) {
@@ -1180,10 +1198,10 @@ abstract class ApiBase extends ContextSource {
         *
         * @param string $valueName The name of the parameter (for error
         *  reporting)
-        * @param $value mixed The value being parsed
+        * @param mixed $value The value being parsed
         * @param bool $allowMultiple Can $value contain more than one value
         *  separated by '|'?
-        * @param $allowedValues mixed An array of values to check against. If
+        * @param mixed $allowedValues An array of values to check against. If
         *  null, all values are accepted.
         * @return mixed (allowMultiple ? an_array_of_values : a_single_value)
         */
@@ -1249,7 +1267,7 @@ abstract class ApiBase extends ContextSource {
         * @param int|null $min Minimum value
         * @param int|null $max Maximum value for users
         * @param int $botMax Maximum value for sysops/bots
-        * @param $enforceLimits Boolean Whether to enforce (die) if value is outside limits
+        * @param bool $enforceLimits Whether to enforce (die) if value is outside limits
         */
        function validateLimit( $paramName, &$value, $min, $max, $botMax = null, $enforceLimits = false ) {
                if ( !is_null( $min ) && $value < $min ) {
@@ -1322,8 +1340,8 @@ abstract class ApiBase extends ContextSource {
        /**
         * Adds a warning to the output, else dies
         *
-        * @param $msg String Message to show as a warning, or error message if dying
-        * @param $enforceLimits Boolean Whether this is an enforce (die)
+        * @param string $msg Message to show as a warning, or error message if dying
+        * @param bool $enforceLimits Whether this is an enforce (die)
         */
        private function warnOrDie( $msg, $enforceLimits = false ) {
                if ( $enforceLimits ) {
@@ -1375,8 +1393,8 @@ abstract class ApiBase extends ContextSource {
         * Get error (as code, string) from a Status object.
         *
         * @since 1.23
-        * @param Status $status Status object
-        * @return array of code and error string
+        * @param Status $status
+        * @return array Array of code and error string
         */
        public function getErrorFromStatus( $status ) {
                if ( $status->isGood() ) {
@@ -1414,7 +1432,7 @@ abstract class ApiBase extends ContextSource {
         * Throw a UsageException based on the errors in the Status object.
         *
         * @since 1.22
-        * @param Status $status Status object
+        * @param Status $status
         * @throws MWException
         */
        public function dieStatus( $status ) {
@@ -1925,7 +1943,7 @@ abstract class ApiBase extends ContextSource {
 
        /**
         * Output the error message related to a certain array
-        * @param $error (array|string) Element of a getUserPermissionsErrors()-style array
+        * @param array|string $error Element of a getUserPermissionsErrors()-style array
         */
        public function dieUsageMsg( $error ) {
                # most of the time we send a 1 element, so we might as well send it as
@@ -1940,7 +1958,7 @@ abstract class ApiBase extends ContextSource {
        /**
         * Will only set a warning instead of failing if the global $wgDebugAPI
         * is set to true. Otherwise behaves exactly as dieUsageMsg().
-        * @param $error (array|string) Element of a getUserPermissionsErrors()-style array
+        * @param array|string $error Element of a getUserPermissionsErrors()-style array
         * @since 1.21
         */
        public function dieUsageMsgOrDebug( $error ) {
@@ -1960,7 +1978,7 @@ abstract class ApiBase extends ContextSource {
        /**
         * Die with the $prefix.'badcontinue' error. This call is common enough to
         * make it into the base method.
-        * @param $condition boolean will only die if this value is true
+        * @param bool $condition Will only die if this value is true
         * @since 1.21
         */
        protected function dieContinueUsageIf( $condition ) {
@@ -2065,7 +2083,7 @@ abstract class ApiBase extends ContextSource {
        /**
         * Gets the user for whom to get the watchlist
         *
-        * @param $params array
+        * @param array $params
         * @return User
         */
        public function getWatchlistUser( $params ) {
@@ -2108,7 +2126,7 @@ abstract class ApiBase extends ContextSource {
         * Don't call this function directly: use getFinalPossibleErrors() to allow
         * hooks to modify parameters as needed.
         *
-        * @return array in the format of array( key, param1, param2, ... )
+        * @return array Array in the format of array( key, param1, param2, ... )
         *   or array( 'code' => ..., 'info' => ... )
         */
        public function getPossibleErrors() {
@@ -2322,7 +2340,7 @@ abstract class ApiBase extends ContextSource {
 
        /**
         * Debugging function that prints a value and an optional backtrace
-        * @param $value mixed Value to print
+        * @param mixed $value Value to print
         * @param string $name Description of the printed value
         * @param bool $backtrace If true, print a backtrace
         */
index c1bbea7..6b12a7d 100644 (file)
@@ -78,9 +78,9 @@ class ApiComparePages extends ApiBase {
        }
 
        /**
-        * @param $revision int
-        * @param $titleText string
-        * @param $titleId int
+        * @param int $revision
+        * @param string $titleText
+        * @param int $titleId
         * @return int
         */
        private function revisionOrTitleOrId( $revision, $titleText, $titleId ) {
index acc2eb8..2fa4518 100644 (file)
@@ -89,9 +89,9 @@ class ApiDelete extends ApiBase {
        }
 
        /**
-        * @param $title Title
-        * @param $user User doing the action
-        * @param $token String
+        * @param Title $title
+        * @param User $user User doing the action
+        * @param string $token
         * @return array
         */
        private static function getPermissionsError( $title, $user, $token ) {
@@ -102,10 +102,10 @@ class ApiDelete extends ApiBase {
        /**
         * We have our own delete() function, since Article.php's implementation is split in two phases
         *
-        * @param $page Page|WikiPage object to work on
-        * @param $user User doing the action
+        * @param Page|WikiPage $page Page or WikiPage object to work on
+        * @param User $user User doing the action
         * @param string $token delete token (same as edit token)
-        * @param string|null $reason reason for the deletion. Autogenerated if NULL
+        * @param string|null $reason reason for the deletion. Autogenerated if null
         * @return Status|array
         */
        public static function delete( Page $page, User $user, $token, &$reason = null ) {
index 73eebca..cb0f8c2 100644 (file)
@@ -48,6 +48,9 @@ class ApiEditPage extends ApiBase {
                $apiResult = $this->getResult();
 
                if ( $params['redirect'] ) {
+                       if ( $params['prependtext'] === null && $params['appendtext'] === null && $params['section'] !== 'new' ) {
+                               $this->dieUsage( 'You have attempted to edit using the "redirect"-following mode, which must be used in conjuction with section=new, prependtext, or appendtext.', 'redirect-appendonly' );
+                       }
                        if ( $titleObj->isRedirect() ) {
                                $oldTitle = $titleObj;
 
@@ -167,7 +170,7 @@ class ApiEditPage extends ApiBase {
                                        $content = null;
                                } else {
                                        // Process the content for section edits
-                                       $section = intval( $params['section'] );
+                                       $section = $params['section'];
                                        $content = $content->getSection( $section );
 
                                        if ( !$content ) {
@@ -288,12 +291,12 @@ class ApiEditPage extends ApiBase {
                }
 
                if ( !is_null( $params['section'] ) ) {
-                       $section = intval( $params['section'] );
-                       if ( $section == 0 && $params['section'] != '0' && $params['section'] != 'new' ) {
-                               $this->dieUsage( "The section parameter must be set to an integer or 'new'", "invalidsection" );
+                       $section = $params['section'];
+                       if ( !preg_match( '/^((T-)?\d+|new)$/', $section ) ) {
+                               $this->dieUsage( "The section parameter must be a valid section id or 'new'", "invalidsection" );
                        }
                        $content = $pageObj->getContent();
-                       if ( $section !== 0 && ( !$content || !$content->getSection( $section ) ) ) {
+                       if ( $section !== '0' && $section != 'new' && ( !$content || !$content->getSection( $section ) ) ) {
                                $this->dieUsage( "There is no section {$section}.", 'nosuchsection' );
                        }
                        $requestArray['wpSection'] = $params['section'];
@@ -526,10 +529,10 @@ class ApiEditPage extends ApiBase {
                                array( 'editconflict' ),
                                array( 'emptynewsection' ),
                                array( 'unknownerror', 'retval' ),
-                               array( 'code' => 'nosuchsection', 'info' => 'There is no section section.' ),
+                               array( 'code' => 'nosuchsection', 'info' => 'There is no such section.' ),
                                array(
                                        'code' => 'invalidsection',
-                                       'info' => 'The section parameter must be set to an integer or \'new\''
+                                       'info' => 'The section parameter must be a valid section id or \'new\''
                                ),
                                array(
                                        'code' => 'sectionsnotsupported',
@@ -542,6 +545,10 @@ class ApiEditPage extends ApiBase {
                                array(
                                        'code' => 'appendnotsupported',
                                        'info' => 'This type of page can not be edited by appending or prepending text.' ),
+                               array(
+                                       'code' => 'redirect-appendonly',
+                                       'info' => 'You have attempted to edit using the "redirect"-following mode, which must be used in conjuction with section=new, prependtext, or appendtext.',
+                               ),
                                array(
                                        'code' => 'badformat',
                                        'info' => 'The requested serialization format can not be applied to the page\'s content model'
index 4173402..afd5a13 100644 (file)
@@ -112,7 +112,7 @@ class ApiFeedContributions extends ApiBase {
                        return new FeedItem(
                                $title->getPrefixedText(),
                                $this->feedItemDesc( $revision ),
-                               $title->getFullURL(),
+                               $title->getFullURL( array( 'diff' => $revision->getId() ) ),
                                $date,
                                $this->feedItemAuthor( $revision ),
                                $comments
@@ -123,7 +123,7 @@ class ApiFeedContributions extends ApiBase {
        }
 
        /**
-        * @param $revision Revision
+        * @param Revision $revision
         * @return string
         */
        protected function feedItemAuthor( $revision ) {
@@ -131,7 +131,7 @@ class ApiFeedContributions extends ApiBase {
        }
 
        /**
-        * @param $revision Revision
+        * @param Revision $revision
         * @return string
         */
        protected function feedItemDesc( $revision ) {
index 4770365..64c3eec 100644 (file)
@@ -34,7 +34,6 @@
 class ApiFeedWatchlist extends ApiBase {
 
        private $watchlistModule = null;
-       private $linkToDiffs = false;
        private $linkToSections = false;
 
        /**
@@ -73,7 +72,7 @@ class ApiFeedWatchlist extends ApiBase {
                                'meta' => 'siteinfo',
                                'siprop' => 'general',
                                'list' => 'watchlist',
-                               'wlprop' => 'title|user|comment|timestamp',
+                               'wlprop' => 'title|user|comment|timestamp|ids',
                                'wldir' => 'older', // reverse order - from newest to oldest
                                'wlend' => $endTime, // stop at this time
                                'wllimit' => min( 50, $wgFeedLimit )
@@ -95,12 +94,6 @@ class ApiFeedWatchlist extends ApiBase {
                                $fauxReqArr['wltype'] = $params['wltype'];
                        }
 
-                       // Support linking to diffs instead of article
-                       if ( $params['linktodiffs'] ) {
-                               $this->linkToDiffs = true;
-                               $fauxReqArr['wlprop'] .= '|ids';
-                       }
-
                        // Support linking directly to sections when possible
                        // (possible only if section name is present in comment)
                        if ( $params['linktosections'] ) {
@@ -167,13 +160,13 @@ class ApiFeedWatchlist extends ApiBase {
        }
 
        /**
-        * @param $info array
+        * @param array $info
         * @return FeedItem
         */
        private function createFeedItem( $info ) {
                $titleStr = $info['title'];
                $title = Title::newFromText( $titleStr );
-               if ( $this->linkToDiffs && isset( $info['revid'] ) ) {
+               if ( isset( $info['revid'] ) ) {
                        $titleUrl = $title->getFullURL( array( 'diff' => $info['revid'] ) );
                } else {
                        $titleUrl = $title->getFullURL();
@@ -225,7 +218,6 @@ class ApiFeedWatchlist extends ApiBase {
                                ApiBase::PARAM_MIN => 1,
                                ApiBase::PARAM_MAX => 72,
                        ),
-                       'linktodiffs' => false,
                        'linktosections' => false,
                );
                if ( $flags ) {
@@ -254,7 +246,6 @@ class ApiFeedWatchlist extends ApiBase {
                return array(
                        'feedformat' => 'The format of the feed',
                        'hours' => 'List pages modified within this many hours from now',
-                       'linktodiffs' => 'Link to change differences instead of article pages',
                        'linktosections' => 'Link directly to changed sections if possible',
                        'allrev' => $wldescr['allrev'],
                        'wlowner' => $wldescr['owner'],
@@ -279,7 +270,7 @@ class ApiFeedWatchlist extends ApiBase {
        public function getExamples() {
                return array(
                        'api.php?action=feedwatchlist',
-                       'api.php?action=feedwatchlist&allrev=&linktodiffs=&hours=6'
+                       'api.php?action=feedwatchlist&allrev=&hours=6'
                );
        }
 
index 1941fbd..fab8b5a 100644 (file)
@@ -71,7 +71,7 @@ class ApiFileRevert extends ApiBase {
        /**
         * Checks that the user has permissions to perform this revert.
         * Dies with usage message on inadequate permissions.
-        * @param $user User The user to check.
+        * @param User $user The user to check.
         */
        protected function checkPermissions( $user ) {
                $title = $this->file->getTitle();
index d43259d..8954abc 100644 (file)
@@ -34,12 +34,11 @@ abstract class ApiFormatBase extends ApiBase {
        private $mBufferResult = false, $mBuffer, $mDisabled = false;
 
        /**
-        * Constructor
         * If $format ends with 'fm', pretty-print the output in HTML.
-        * @param $main ApiMain
+        * @param ApiMain $main
         * @param string $format Format name
         */
-       public function __construct( $main, $format ) {
+       public function __construct( ApiMain $main, $format ) {
                parent::__construct( $main, $format );
 
                $this->mIsHtml = ( substr( $format, -2, 2 ) === 'fm' ); // ends with 'fm'
@@ -224,7 +223,7 @@ See the <a href='https://www.mediawiki.org/wiki/API'>complete documentation</a>,
         * 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'.
-        * @param $text string
+        * @param string $text
         */
        public function printText( $text ) {
                if ( $this->mDisabled ) {
@@ -255,7 +254,7 @@ See the <a href='https://www.mediawiki.org/wiki/API'>complete documentation</a>,
 
        /**
         * Set the flag to buffer the result instead of printing it.
-        * @param $value bool
+        * @param bool $value
         */
        public function setBufferResult( $value ) {
                $this->mBufferResult = $value;
@@ -263,7 +262,7 @@ See the <a href='https://www.mediawiki.org/wiki/API'>complete documentation</a>,
 
        /**
         * Sets whether the pretty-printer should format *bold*
-        * @param $help bool
+        * @param bool $help
         */
        public function setHelp( $help = true ) {
                $this->mHelp = $help;
@@ -272,7 +271,7 @@ See the <a href='https://www.mediawiki.org/wiki/API'>complete documentation</a>,
        /**
         * Pretty-print various elements in HTML format, such as xml tags and
         * URLs. This method also escapes characters like <
-        * @param $text string
+        * @param string $text
         * @return string
         */
        protected function formatHTML( $text ) {
@@ -347,14 +346,14 @@ See the <a href='https://www.mediawiki.org/wiki/API'>complete documentation</a>,
  */
 class ApiFormatFeedWrapper extends ApiFormatBase {
 
-       public function __construct( $main ) {
+       public function __construct( ApiMain $main ) {
                parent::__construct( $main, 'feed' );
        }
 
        /**
         * Call this method to initialize output data. See execute()
-        * @param $result ApiResult
-        * @param $feed object an instance of one of the $wgFeedClasses classes
+        * @param ApiResult $result
+        * @param object $feed An instance of one of the $wgFeedClasses classes
         * @param array $feedItems of FeedItem objects
         */
        public static function setResult( $result, $feed, $feedItems ) {
@@ -390,7 +389,7 @@ class ApiFormatFeedWrapper extends ApiFormatBase {
        /**
         * ChannelFeed doesn't give us a method to print errors in a friendly
         * manner, so just punt errors to the default printer.
-        * @return false
+        * @return bool
         */
        public function canPrintErrors() {
                return false;
index be0b58b..e2c6b9a 100644 (file)
@@ -32,7 +32,7 @@ class ApiFormatJson extends ApiFormatBase {
 
        private $mIsRaw;
 
-       public function __construct( $main, $format ) {
+       public function __construct( ApiMain $main, $format ) {
                parent::__construct( $main, $format );
                $this->mIsRaw = ( $format === 'rawfm' );
        }
index 45003e9..3f5c8b7 100644 (file)
 class ApiFormatRaw extends ApiFormatBase {
 
        /**
-        * Constructor
-        * @param $main ApiMain object
-        * @param $errorFallback ApiFormatBase object to fall back on for errors
+        * @param ApiMain $main
+        * @param ApiFormatBase $errorFallback Object to fall back on for errors
         */
-       public function __construct( $main, $errorFallback ) {
+       public function __construct( ApiMain $main, ApiFormatBase $errorFallback ) {
                parent::__construct( $main, 'raw' );
                $this->mErrorFallback = $errorFallback;
        }
index df8e745..2e58c72 100644 (file)
@@ -62,8 +62,8 @@ class ApiFormatWddx extends ApiFormatBase {
 
        /**
         * Recursively go through the object and output its data in WDDX format.
-        * @param $elemValue
-        * @param $indent int
+        * @param mixed $elemValue
+        * @param int $indent
         */
        function slowWddxPrinter( $elemValue, $indent = 0 ) {
                $indstr = ( $this->getIsHtml() ? str_repeat( ' ', $indent ) : '' );
index 764e609..8e1d39d 100644 (file)
@@ -111,9 +111,9 @@ class ApiFormatXml extends ApiFormatBase {
         * @note The method is recursive, so the same rules apply to any
         * sub-arrays.
         *
-        * @param $elemName
-        * @param $elemValue
-        * @param $indent
+        * @param string $elemName
+        * @param mixed $elemValue
+        * @param int $indent
         *
         * @return string
         */
index ed64cd5..b0b8328 100644 (file)
@@ -107,8 +107,8 @@ class ApiHelp extends ApiBase {
        }
 
        /**
-        * @param $module ApiBase
-        * @param $type String What type of request is this? e.g. action, query, list, prop, meta, format
+        * @param ApiBase $module
+        * @param string $type What type of request is this? e.g. action, query, list, prop, meta, format
         * @return string
         */
        private function buildModuleHelp( $module, $type ) {
index 295f16e..1d960c9 100644 (file)
@@ -196,11 +196,11 @@ class ApiImportReporter extends ImportReporter {
        private $mResultArr = array();
 
        /**
-        * @param $title Title
-        * @param $origTitle Title
-        * @param $revisionCount int
-        * @param $successCount int
-        * @param $pageInfo
+        * @param Title $title
+        * @param Title $origTitle
+        * @param int $revisionCount
+        * @param int $successCount
+        * @param array $pageInfo
         * @return void
         */
        function reportPage( $title, $origTitle, $revisionCount, $successCount, $pageInfo ) {
index f2a9d1a..6336e81 100644 (file)
@@ -32,7 +32,7 @@
  */
 class ApiLogin extends ApiBase {
 
-       public function __construct( $main, $action ) {
+       public function __construct( ApiMain $main, $action ) {
                parent::__construct( $main, $action, 'lg' );
        }
 
@@ -86,7 +86,7 @@ class ApiLogin extends ApiBase {
                        case LoginForm::SUCCESS:
                                $user = $context->getUser();
                                $this->getContext()->setUser( $user );
-                               $user->setCookies( $this->getRequest() );
+                               $user->setCookies( $this->getRequest(), null, true );
 
                                ApiQueryInfo::resetTokenCache();
 
index 2e16312..df56735 100644 (file)
@@ -147,9 +147,9 @@ class ApiMain extends ApiBase {
        /**
         * Constructs an instance of ApiMain that utilizes the module and format specified by $request.
         *
-        * @param $context IContextSource|WebRequest - if this is an instance of
+        * @param IContextSource|WebRequest $context If this is an instance of
         *    FauxRequest, errors are thrown and no printing occurs
-        * @param bool $enableWrite should be set to true if the api may modify data
+        * @param bool $enableWrite Should be set to true if the api may modify data
         */
        public function __construct( $context = null, $enableWrite = false ) {
                if ( $context === null ) {
@@ -238,7 +238,7 @@ class ApiMain extends ApiBase {
        /**
         * Set how long the response should be cached.
         *
-        * @param $maxage
+        * @param int $maxage
         */
        public function setCacheMaxAge( $maxage ) {
                $this->setCacheControl( array(
@@ -301,7 +301,7 @@ class ApiMain extends ApiBase {
         * Cache control values set here will only be used if the cache mode is not
         * private, see setCacheMode().
         *
-        * @param $directives array
+        * @param array $directives
         */
        public function setCacheControl( $directives ) {
                $this->mCacheControl = $directives + $this->mCacheControl;
@@ -310,7 +310,7 @@ class ApiMain extends ApiBase {
        /**
         * Create an instance of an output formatter by its name
         *
-        * @param $format string
+        * @param string $format
         *
         * @return ApiFormatBase
         */
@@ -387,7 +387,10 @@ class ApiMain extends ApiBase {
         */
        protected function handleException( Exception $e ) {
                // Bug 63145: Rollback any open database transactions
-               MWExceptionHandler::rollbackMasterChangesAndLog( $e );
+               if ( !( $e instanceof UsageException ) ) {
+                       // UsageExceptions are intentional, so don't rollback if that's the case
+                       MWExceptionHandler::rollbackMasterChangesAndLog( $e );
+               }
 
                // Allow extra cleanup and logging
                wfRunHooks( 'ApiMain::onException', array( $this, $e ) );
@@ -637,7 +640,7 @@ class ApiMain extends ApiBase {
        /**
         * Replace the result data with the information about an exception.
         * Returns the error code
-        * @param $e Exception
+        * @param Exception $e
         * @return string
         */
        protected function substituteResultWithError( $e ) {
@@ -782,9 +785,9 @@ class ApiMain extends ApiBase {
 
        /**
         * Check the max lag if necessary
-        * @param $module ApiBase object: Api module being used
-        * @param array $params an array containing the request parameters.
-        * @return boolean True on success, false should exit immediately
+        * @param ApiBase $module Api module being used
+        * @param array $params Array an array containing the request parameters.
+        * @return bool True on success, false should exit immediately
         */
        protected function checkMaxLag( $module, $params ) {
                if ( $module->shouldCheckMaxlag() && isset( $params['maxlag'] ) ) {
@@ -811,7 +814,7 @@ class ApiMain extends ApiBase {
 
        /**
         * Check for sufficient permissions to execute
-        * @param $module ApiBase An Api module
+        * @param ApiBase $module An Api module
         */
        protected function checkExecutePermissions( $module ) {
                $user = $this->getUser();
@@ -841,7 +844,7 @@ class ApiMain extends ApiBase {
 
        /**
         * Check asserts of the user's rights
-        * @param $params array
+        * @param array $params
         */
        protected function checkAsserts( $params ) {
                if ( isset( $params['assert'] ) ) {
@@ -863,7 +866,7 @@ class ApiMain extends ApiBase {
 
        /**
         * Check POST for external response and setup result printer
-        * @param $module ApiBase An Api module
+        * @param ApiBase $module An Api module
         * @param array $params an array with the request parameters
         */
        protected function setupExternalResponse( $module, $params ) {
@@ -953,6 +956,8 @@ class ApiMain extends ApiBase {
 
        /**
         * Encode a value in a format suitable for a space-separated log line.
+        * @param string $s
+        * @return string
         */
        protected function encodeRequestLogValue( $s ) {
                static $table;
@@ -969,6 +974,7 @@ class ApiMain extends ApiBase {
 
        /**
         * Get the request parameters used in the course of the preceding execute() request
+        * @return array
         */
        protected function getParamsUsed() {
                return array_keys( $this->mParamsUsed );
@@ -976,21 +982,35 @@ class ApiMain extends ApiBase {
 
        /**
         * Get a request value, and register the fact that it was used, for logging.
+        * @param string $name
+        * @param mixed $default
+        * @return mixed
         */
        public function getVal( $name, $default = null ) {
                $this->mParamsUsed[$name] = true;
 
-               return $this->getRequest()->getVal( $name, $default );
+               $ret = $this->getRequest()->getVal( $name );
+               if ( $ret === null ) {
+                       if ( $this->getRequest()->getArray( $name ) !== null ) {
+                               // See bug 10262 for why we don't just join( '|', ... ) the
+                               // array.
+                               $this->setWarning(
+                                       "Parameter '$name' uses unsupported PHP array syntax"
+                               );
+                       }
+                       $ret = $default;
+               }
+               return $ret;
        }
 
        /**
         * Get a boolean request value, and register the fact that the parameter
         * was used, for logging.
+        * @param string $name
+        * @return bool
         */
        public function getCheck( $name ) {
-               $this->mParamsUsed[$name] = true;
-
-               return $this->getRequest()->getCheck( $name );
+               return $this->getVal( $name, null ) !== null;
        }
 
        /**
@@ -1034,7 +1054,7 @@ class ApiMain extends ApiBase {
        /**
         * Print results using the current printer
         *
-        * @param $isError bool
+        * @param bool $isError
         */
        protected function printResult( $isError ) {
                global $wgDebugAPI;
@@ -1214,7 +1234,8 @@ class ApiMain extends ApiBase {
                        '    Victor Vasiliev',
                        '    Bryan Tong Minh',
                        '    Sam Reed',
-                       '    Yuri Astrakhan (creator, lead developer Sep 2006-Sep 2007, 2012-present)',
+                       '    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/'
@@ -1224,7 +1245,7 @@ class ApiMain extends ApiBase {
        /**
         * Sets whether the pretty-printer should format *bold* and $italics$
         *
-        * @param $help bool
+        * @param bool $help
         */
        public function setHelp( $help = true ) {
                $this->mPrinter->setHelp( $help );
@@ -1302,7 +1323,7 @@ class ApiMain extends ApiBase {
        }
 
        /**
-        * @param $module ApiBase
+        * @param ApiBase $module
         * @param string $paramName What type of request is this? e.g. action,
         *    query, list, prop, meta, format
         * @return string
@@ -1356,7 +1377,7 @@ class ApiMain extends ApiBase {
         *
         * @deprecated since 1.21, Use getModuleManager()->addModule() instead.
         * @param string $name The identifier for this module.
-        * @param $class ApiBase The class where this module is implemented.
+        * @param ApiBase $class The class where this module is implemented.
         */
        protected function addModule( $name, $class ) {
                $this->getModuleManager()->addModule( $name, 'action', $class );
@@ -1368,7 +1389,7 @@ class ApiMain extends ApiBase {
         *
         * @deprecated since 1.21, Use getModuleManager()->addModule() instead.
         * @param string $name The identifier for this format.
-        * @param $class ApiFormatBase The class implementing this format.
+        * @param ApiFormatBase $class The class implementing this format.
         */
        protected function addFormat( $name, $class ) {
                $this->getModuleManager()->addModule( $name, 'format', $class );
@@ -1411,10 +1432,10 @@ class UsageException extends MWException {
        private $mExtraData;
 
        /**
-        * @param $message string
-        * @param $codestr string
-        * @param $code int
-        * @param $extradata array|null
+        * @param string $message
+        * @param string $codestr
+        * @param int $code
+        * @param array|null $extradata
         */
        public function __construct( $message, $codestr, $code = 0, $extradata = null ) {
                parent::__construct( $message, $code );
index c33e18c..8226529 100644 (file)
  */
 class ApiModuleManager extends ContextSource {
 
+       /**
+        * @var ApiBase
+        */
        private $mParent;
+       /**
+        * @var ApiBase[]
+        */
        private $mInstances = array();
+       /**
+        * @var null[]
+        */
        private $mGroups = array();
+       /**
+        * @var array[]
+        */
        private $mModules = array();
 
        /**
@@ -73,10 +85,10 @@ class ApiModuleManager extends ContextSource {
 
        /**
         * Get module instance by name, or instantiate it if it does not exist
-        * @param string $moduleName module name
-        * @param string $group optionally validate that the module is in a specific group
-        * @param bool $ignoreCache if true, force-creates a new instance and does not cache it
-        * @return mixed the new module instance, or null if failed
+        * @param string $moduleName Module name
+        * @param string $group Optionally validate that the module is in a specific group
+        * @param bool $ignoreCache If true, force-creates a new instance and does not cache it
+        * @return mixed The new module instance, or null if failed
         */
        public function getModule( $moduleName, $group = null, $ignoreCache = false ) {
                if ( !isset( $this->mModules[$moduleName] ) ) {
@@ -104,8 +116,8 @@ class ApiModuleManager extends ContextSource {
 
        /**
         * Get an array of modules in a specific group or all if no group is set.
-        * @param string $group optional group filter
-        * @return array list of module names
+        * @param string $group Optional group filter
+        * @return array List of module names
         */
        public function getNames( $group = null ) {
                if ( $group === null ) {
@@ -123,8 +135,8 @@ class ApiModuleManager extends ContextSource {
 
        /**
         * Create an array of (moduleName => moduleClass) for a specific group or for all.
-        * @param string $group name of the group to get or null for all
-        * @return array name=>class map
+        * @param string $group Name of the group to get or null for all
+        * @return array Name=>class map
         */
        public function getNamesWithClasses( $group = null ) {
                $result = array();
@@ -139,9 +151,9 @@ class ApiModuleManager extends ContextSource {
 
        /**
         * Returns true if the specific module is defined at all or in a specific group.
-        * @param string $moduleName module name
-        * @param string $group group name to check against, or null to check all groups,
-        * @return boolean true if defined
+        * @param string $moduleName Module name
+        * @param string $group Group name to check against, or null to check all groups,
+        * @return bool True if defined
         */
        public function isDefined( $moduleName, $group = null ) {
                if ( isset( $this->mModules[$moduleName] ) ) {
@@ -154,7 +166,7 @@ class ApiModuleManager extends ContextSource {
        /**
         * Returns the group name for the given module
         * @param string $moduleName
-        * @return string group name or null if missing
+        * @return string Group name or null if missing
         */
        public function getModuleGroup( $moduleName ) {
                if ( isset( $this->mModules[$moduleName] ) ) {
index 1190781..2cfc251 100644 (file)
@@ -148,8 +148,8 @@ class ApiMove extends ApiBase {
        /**
         * @param Title $fromTitle
         * @param Title $toTitle
-        * @param $reason
-        * @param $noredirect
+        * @param string $reason
+        * @param bool $noredirect
         * @return array
         */
        public function moveSubpages( $fromTitle, $toTitle, $reason, $noredirect ) {
index c712539..20444d0 100644 (file)
@@ -75,10 +75,10 @@ class ApiPageSet extends ApiBase {
 
        /**
         * Add all items from $values into the result
-        * @param array $result output
-        * @param array $values values to add
-        * @param string $flag the name of the boolean flag to mark this element
-        * @param string $name if given, name of the value
+        * @param array $result Output
+        * @param array $values Values to add
+        * @param string $flag The name of the boolean flag to mark this element
+        * @param string $name If given, name of the value
         */
        private static function addValues( array &$result, $values, $flag = null, $name = null ) {
                foreach ( $values as $val ) {
@@ -98,11 +98,10 @@ class ApiPageSet extends ApiBase {
        }
 
        /**
-        * Constructor
-        * @param $dbSource ApiBase Module implementing getDB().
+        * @param ApiBase $dbSource Module implementing getDB().
         *        Allows PageSet to reuse existing db connection from the shared state like ApiQuery.
         * @param int $flags Zero or more flags like DISABLE_GENERATORS
-        * @param int $defaultNamespace the namespace to use if none is specified by a prefix.
+        * @param int $defaultNamespace The namespace to use if none is specified by a prefix.
         * @since 1.21 accepts $flags instead of two boolean values
         */
        public function __construct( ApiBase $dbSource, $flags = 0, $defaultNamespace = NS_MAIN ) {
@@ -296,7 +295,7 @@ class ApiPageSet extends ApiBase {
         * Get the fields that have to be queried from the page table:
         * the ones requested through requestField() and a few basic ones
         * we always need
-        * @return array of field names
+        * @return array Array of field names
         */
        public function getPageTableFields() {
                // Ensure we get minimum required fields
@@ -381,7 +380,7 @@ class ApiPageSet extends ApiBase {
 
        /**
         * Page IDs that were not found in the database
-        * @return array of page IDs
+        * @return array Array of page IDs
         */
        public function getMissingPageIDs() {
                return $this->mMissingPageIDs;
@@ -399,8 +398,8 @@ class ApiPageSet extends ApiBase {
        /**
         * Get a list of redirect resolutions - maps a title to its redirect
         * target.
-        * @param $result ApiResult
-        * @return array of prefixed_title (string) => Title object
+        * @param ApiResult $result
+        * @return array Array of prefixed_title (string) => Title object
         * @since 1.21
         */
        public function getRedirectTitlesAsResult( $result = null ) {
@@ -425,7 +424,7 @@ class ApiPageSet extends ApiBase {
        /**
         * Get a list of title normalizations - maps a title to its normalized
         * version.
-        * @return array raw_prefixed_title (string) => prefixed_title (string)
+        * @return array Array of raw_prefixed_title (string) => prefixed_title (string)
         */
        public function getNormalizedTitles() {
                return $this->mNormalizedTitles;
@@ -434,8 +433,8 @@ class ApiPageSet extends ApiBase {
        /**
         * Get a list of title normalizations - maps a title to its normalized
         * version in the form of result array.
-        * @param $result ApiResult
-        * @return array of raw_prefixed_title (string) => prefixed_title (string)
+        * @param ApiResult $result
+        * @return array Array of raw_prefixed_title (string) => prefixed_title (string)
         * @since 1.21
         */
        public function getNormalizedTitlesAsResult( $result = null ) {
@@ -456,7 +455,7 @@ class ApiPageSet extends ApiBase {
        /**
         * Get a list of title conversions - maps a title to its converted
         * version.
-        * @return array raw_prefixed_title (string) => prefixed_title (string)
+        * @return array Array of raw_prefixed_title (string) => prefixed_title (string)
         */
        public function getConvertedTitles() {
                return $this->mConvertedTitles;
@@ -465,8 +464,8 @@ class ApiPageSet extends ApiBase {
        /**
         * Get a list of title conversions - maps a title to its converted
         * version as a result array.
-        * @param $result ApiResult
-        * @return array of (from, to) strings
+        * @param ApiResult $result
+        * @return array Array of (from, to) strings
         * @since 1.21
         */
        public function getConvertedTitlesAsResult( $result = null ) {
@@ -487,7 +486,7 @@ class ApiPageSet extends ApiBase {
        /**
         * Get a list of interwiki titles - maps a title to its interwiki
         * prefix.
-        * @return array raw_prefixed_title (string) => interwiki_prefix (string)
+        * @return array Array of raw_prefixed_title (string) => interwiki_prefix (string)
         */
        public function getInterwikiTitles() {
                return $this->mInterwikiTitles;
@@ -496,9 +495,9 @@ class ApiPageSet extends ApiBase {
        /**
         * Get a list of interwiki titles - maps a title to its interwiki
         * prefix as result.
-        * @param $result ApiResult
-        * @param $iwUrl boolean
-        * @return array raw_prefixed_title (string) => interwiki_prefix (string)
+        * @param ApiResult $result
+        * @param bool $iwUrl
+        * @return array Array of raw_prefixed_title (string) => interwiki_prefix (string)
         * @since 1.21
         */
        public function getInterwikiTitlesAsResult( $result = null, $iwUrl = false ) {
@@ -524,7 +523,7 @@ class ApiPageSet extends ApiBase {
        /**
         * Get an array of invalid/special/missing titles.
         *
-        * @param $invalidChecks List of types of invalid titles to include.
+        * @param array $invalidChecks List of types of invalid titles to include.
         *   Recognized values are:
         *   - invalidTitles: Titles from $this->getInvalidTitles()
         *   - special: Titles from $this->getSpecialTitles()
@@ -563,7 +562,7 @@ class ApiPageSet extends ApiBase {
 
        /**
         * Get the list of revision IDs (requested with the revids= parameter)
-        * @return array revID (int) => pageID (int)
+        * @return array Array of revID (int) => pageID (int)
         */
        public function getRevisionIDs() {
                return $this->mGoodRevIDs;
@@ -571,7 +570,7 @@ class ApiPageSet extends ApiBase {
 
        /**
         * Revision IDs that were not found in the database
-        * @return array of revision IDs
+        * @return array Array of revision IDs
         */
        public function getMissingRevisionIDs() {
                return $this->mMissingRevIDs;
@@ -579,8 +578,8 @@ class ApiPageSet extends ApiBase {
 
        /**
         * Revision IDs that were not found in the database as result array.
-        * @param $result ApiResult
-        * @return array of revision IDs
+        * @param ApiResult $result
+        * @return array Array of revision IDs
         * @since 1.21
         */
        public function getMissingRevisionIDsAsResult( $result = null ) {
@@ -615,7 +614,7 @@ class ApiPageSet extends ApiBase {
 
        /**
         * Populate this PageSet from a list of Titles
-        * @param array $titles of Title objects
+        * @param array $titles Array of Title objects
         */
        public function populateFromTitles( $titles ) {
                $this->profileIn();
@@ -625,7 +624,7 @@ class ApiPageSet extends ApiBase {
 
        /**
         * Populate this PageSet from a list of page IDs
-        * @param array $pageIDs of page IDs
+        * @param array $pageIDs Array of page IDs
         */
        public function populateFromPageIDs( $pageIDs ) {
                $this->profileIn();
@@ -635,8 +634,8 @@ class ApiPageSet extends ApiBase {
 
        /**
         * Populate this PageSet from a rowset returned from the database
-        * @param $db DatabaseBase object
-        * @param $queryResult ResultWrapper Query result object
+        * @param DatabaseBase $db
+        * @param ResultWrapper $queryResult Query result object
         */
        public function populateFromQueryResult( $db, $queryResult ) {
                $this->profileIn();
@@ -646,7 +645,7 @@ class ApiPageSet extends ApiBase {
 
        /**
         * Populate this PageSet from a list of revision IDs
-        * @param array $revIDs of revision IDs
+        * @param array $revIDs Array of revision IDs
         */
        public function populateFromRevisionIDs( $revIDs ) {
                $this->profileIn();
@@ -699,7 +698,7 @@ class ApiPageSet extends ApiBase {
         * #5 Substitute the original LinkBatch object with the new list
         * #6 Repeat from step #1
         *
-        * @param array $titles of Title objects or strings
+        * @param array $titles Array of Title objects or strings
         */
        private function initFromTitles( $titles ) {
                // Get validated and normalized title objects
@@ -726,7 +725,7 @@ class ApiPageSet extends ApiBase {
 
        /**
         * Does the same as initFromTitles(), but is based on page IDs instead
-        * @param array $pageids of page IDs
+        * @param array $pageids Array of page IDs
         */
        private function initFromPageIds( $pageids ) {
                if ( !$pageids ) {
@@ -761,8 +760,8 @@ class ApiPageSet extends ApiBase {
        /**
         * Iterate through the result of the query on 'page' table,
         * and for each row create and store title object and save any extra fields requested.
-        * @param $res ResultWrapper DB Query result
-        * @param array $remaining of either pageID or ns/title elements (optional).
+        * @param ResultWrapper $res DB Query result
+        * @param array $remaining Array of either pageID or ns/title elements (optional).
         *        If given, any missing items will go to $mMissingPageIDs and $mMissingTitles
         * @param bool $processTitles Must be provided together with $remaining.
         *        If true, treat $remaining as an array of [ns][title]
@@ -833,7 +832,7 @@ class ApiPageSet extends ApiBase {
        /**
         * Does the same as initFromTitles(), but is based on revision IDs
         * instead
-        * @param array $revids of revision IDs
+        * @param array $revids Array of revision IDs
         */
        private function initFromRevIDs( $revids ) {
                if ( !$revids ) {
@@ -976,7 +975,7 @@ class ApiPageSet extends ApiBase {
         * Public caching will only be allowed if *all* the modules that supply
         * data for a given request return a cache mode of public.
         *
-        * @param $params
+        * @param array|null $params
         * @return string
         * @since 1.21
         */
@@ -990,7 +989,7 @@ class ApiPageSet extends ApiBase {
         * This method validates access rights for the title,
         * and appends normalization values to the output.
         *
-        * @param array $titles of Title objects or strings
+        * @param array $titles Array of Title objects or strings
         * @return LinkBatch
         */
        private function processTitlesArray( $titles ) {
@@ -1078,7 +1077,7 @@ class ApiPageSet extends ApiBase {
        /**
         * Returns the input array of integers with all values < 0 removed
         *
-        * @param $array array
+        * @param array $array
         * @return array
         */
        private static function getPositiveIntegers( $array ) {
index 5092af0..622e3a6 100644 (file)
@@ -34,7 +34,7 @@ class ApiParamInfo extends ApiBase {
         */
        protected $queryObj;
 
-       public function __construct( $main, $action ) {
+       public function __construct( ApiMain $main, $action ) {
                parent::__construct( $main, $action );
                $this->queryObj = new ApiQuery( $this->getMain(), 'query' );
        }
@@ -66,10 +66,10 @@ class ApiParamInfo extends ApiBase {
 
        /**
         * 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 $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.
         */
        private function addModulesInfo( $params, $type, &$res, $resultObj ) {
                if ( !is_array( $params[$type] ) ) {
@@ -99,7 +99,7 @@ class ApiParamInfo extends ApiBase {
        }
 
        /**
-        * @param $obj ApiBase
+        * @param ApiBase $obj
         * @return ApiResult
         */
        private function getClassInfo( $obj ) {
index ce52565..fcba5b5 100644 (file)
@@ -27,7 +27,7 @@
  */
 class ApiParse extends ApiBase {
 
-       /** @var String $section */
+       /** @var string $section */
        private $section = null;
 
        /** @var Content $content */
@@ -346,6 +346,13 @@ class ApiParse extends ApiBase {
                        }
                }
 
+               if ( isset( $prop['modules'] ) ) {
+                       $result_array['modules'] = array_values( array_unique( $p_result->getModules() ) );
+                       $result_array['modulescripts'] = array_values( array_unique( $p_result->getModuleScripts() ) );
+                       $result_array['modulestyles'] = array_values( array_unique( $p_result->getModuleStyles() ) );
+                       $result_array['modulemessages'] = array_values( array_unique( $p_result->getModuleMessages() ) );
+               }
+
                if ( isset( $prop['iwlinks'] ) ) {
                        $result_array['iwlinks'] = $this->formatIWLinks( $p_result->getInterwikiLinks() );
                }
@@ -363,7 +370,8 @@ class ApiParse extends ApiBase {
                }
 
                if ( isset( $prop['limitreportdata'] ) ) {
-                       $result_array['limitreportdata'] = $this->formatLimitReportData( $p_result->getLimitReportData() );
+                       $result_array['limitreportdata'] =
+                               $this->formatLimitReportData( $p_result->getLimitReportData() );
                }
                if ( isset( $prop['limitreporthtml'] ) ) {
                        $limitreportHtml = EditPage::getPreviewLimitReport( $p_result );
@@ -398,6 +406,10 @@ class ApiParse extends ApiBase {
                        'iwlinks' => 'iw',
                        'sections' => 's',
                        'headitems' => 'hi',
+                       'modules' => 'm',
+                       'modulescripts' => 'm',
+                       'modulestyles' => 'm',
+                       'modulemessages' => 'm',
                        'properties' => 'pp',
                        'limitreportdata' => 'lr',
                );
@@ -431,10 +443,10 @@ class ApiParse extends ApiBase {
        }
 
        /**
-        * @param $page WikiPage
-        * @param $popts ParserOptions
-        * @param $pageId Int
-        * @param $getWikitext Bool
+        * @param WikiPage $page
+        * @param ParserOptions $popts
+        * @param int $pageId
+        * @param bool $getWikitext
         * @return ParserOutput
         */
        private function getParsedContent( WikiPage $page, $popts, $pageId = null, $getWikitext = false ) {
@@ -488,7 +500,11 @@ class ApiParse extends ApiBase {
                        if ( $title ) {
                                $entry['url'] = wfExpandUrl( $title->getFullURL(), PROTO_CURRENT );
                                // localised language name in user language (maybe set by uselang=)
-                               $entry['langname'] = Language::fetchLanguageName( $title->getInterwiki(), $this->getLanguage()->getCode() );
+                               $entry['langname'] = Language::fetchLanguageName(
+                                       $title->getInterwiki(),
+                                       $this->getLanguage()->getCode()
+                               );
+
                                // native language name
                                $entry['autonym'] = Language::fetchLanguageName( $title->getInterwiki() );
                        }
@@ -549,7 +565,7 @@ class ApiParse extends ApiBase {
        /**
         * @deprecated since 1.18 No modern skin generates language links this way,
         * please use language links data to generate your own HTML.
-        * @param $languages array
+        * @param array $languages
         * @return string
         */
        private function languagesHtml( $languages ) {
@@ -718,6 +734,7 @@ class ApiParse extends ApiBase {
                                        'displaytitle',
                                        'headitems',
                                        'headhtml',
+                                       'modules',
                                        'iwlinks',
                                        'wikitext',
                                        'properties',
@@ -774,6 +791,7 @@ class ApiParse extends ApiBase {
                                ' displaytitle   - Adds the title of the parsed wikitext',
                                ' headitems      - Gives items to put in the <head> of the page',
                                ' headhtml       - Gives parsed <head> of the page',
+                               ' modules        - Gives the ResourceLoader modules used on the page',
                                ' iwlinks        - Gives interwiki links in the parsed wikitext',
                                ' wikitext       - Gives the original wikitext that was parsed',
                                ' properties     - Gives various properties defined in the parsed wikitext',
index 0a95fba..fc115b8 100644 (file)
@@ -122,10 +122,10 @@ class ApiQuery extends ApiBase {
        private $mUseLegacyContinue;
 
        /**
-        * @param $main ApiMain
-        * @param $action string
+        * @param ApiMain $main
+        * @param string $action
         */
-       public function __construct( $main, $action ) {
+       public function __construct( ApiMain $main, $action ) {
                parent::__construct( $main, $action );
 
                $this->mModuleMgr = new ApiModuleManager( $this );
@@ -211,7 +211,7 @@ class ApiQuery extends ApiBase {
         * Get whether the specified module is a prop, list or a meta query module
         * @deprecated since 1.21, use getModuleManager()->getModuleGroup()
         * @param string $moduleName Name of the module to find type for
-        * @return mixed string or null
+        * @return string|null
         */
        function getModuleType( $moduleName ) {
                return $this->getModuleManager()->getModuleGroup( $moduleName );
@@ -348,8 +348,8 @@ class ApiQuery extends ApiBase {
 
        /**
         * Parse 'continue' parameter into the list of complete modules and a list of generator parameters
-        * @param array|null $pagesetParams returns list of generator params or null if pageset is done
-        * @param array|null $completeModules returns list of finished modules (as keys), or null if legacy
+        * @param array|null $pagesetParams Returns list of generator params or null if pageset is done
+        * @param array|null $completeModules Returns list of finished modules (as keys), or null if legacy
         */
        private function initContinue( &$pagesetParams, &$completeModules ) {
                $pagesetParams = array();
@@ -383,9 +383,9 @@ class ApiQuery extends ApiBase {
        /**
         * Validate sub-modules, filter out completed ones, and do requestExtraData()
         * @param array $allModules An dict of name=>instance of all modules requested by the client
-        * @param array|null $completeModules list of finished modules, or null if legacy continue
+        * @param array|null $completeModules List of finished modules, or null if legacy continue
         * @param bool $usePageset True if pageset will be executed
-        * @return array of modules to be processed during this execution
+        * @return array Array of modules to be processed during this execution
         */
        private function initModules( $allModules, $completeModules, $usePageset ) {
                $modules = $allModules;
@@ -423,8 +423,8 @@ class ApiQuery extends ApiBase {
         * The cache mode may increase in the level of privacy, but public modules
         * added to private data do not decrease the level of privacy.
         *
-        * @param $cacheMode string
-        * @param $modCacheMode string
+        * @param string $cacheMode
+        * @param string $modCacheMode
         * @return string
         */
        protected function mergeCacheMode( $cacheMode, $modCacheMode ) {
@@ -443,7 +443,7 @@ class ApiQuery extends ApiBase {
 
        /**
         * Create instances of all modules requested by the client
-        * @param array $modules to append instantiated modules to
+        * @param array $modules To append instantiated modules to
         * @param string $param Parameter name to read modules from
         */
        private function instantiateModules( &$modules, $param ) {
@@ -563,10 +563,10 @@ class ApiQuery extends ApiBase {
         * This method is called by the generator base when generator in the smart-continue
         * mode tries to set 'query-continue' value. ApiQuery stores those values separately
         * until the post-processing when it is known if the generation should continue or repeat.
-        * @param ApiQueryGeneratorBase $module generator module
+        * @param ApiQueryGeneratorBase $module Generator module
         * @param string $paramName
         * @param mixed $paramValue
-        * @return bool true if processed, false if this is a legacy continue
+        * @return bool True if processed, false if this is a legacy continue
         */
        public function setGeneratorContinue( $module, $paramName, $paramValue ) {
                if ( $this->mUseLegacyContinue ) {
@@ -582,8 +582,8 @@ class ApiQuery extends ApiBase {
        }
 
        /**
-        * @param $pageSet ApiPageSet Pages to be exported
-        * @param $result ApiResult Result to output to
+        * @param ApiPageSet $pageSet Pages to be exported
+        * @param ApiResult $result Result to output to
         */
        private function doExport( $pageSet, $result ) {
                $exportTitles = array();
index 8a1810b..1b65097 100644 (file)
@@ -32,7 +32,7 @@
  */
 class ApiQueryAllCategories extends ApiQueryGeneratorBase {
 
-       public function __construct( $query, $moduleName ) {
+       public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'ac' );
        }
 
@@ -49,7 +49,7 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase {
        }
 
        /**
-        * @param $resultPageSet ApiPageSet
+        * @param ApiPageSet $resultPageSet
         */
        private function run( $resultPageSet = null ) {
                $db = $this->getDB();
index 229c07e..4266a8e 100644 (file)
@@ -34,7 +34,7 @@
 class ApiQueryAllImages extends ApiQueryGeneratorBase {
        protected $mRepo;
 
-       public function __construct( $query, $moduleName ) {
+       public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'ai' );
                $this->mRepo = RepoGroup::singleton()->getLocalRepo();
        }
@@ -59,7 +59,7 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
        }
 
        /**
-        * @param $resultPageSet ApiPageSet
+        * @param ApiPageSet $resultPageSet
         * @return void
         */
        public function executeGenerator( $resultPageSet ) {
@@ -75,7 +75,7 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
        }
 
        /**
-        * @param $resultPageSet ApiPageSet
+        * @param ApiPageSet $resultPageSet
         * @return void
         */
        private function run( $resultPageSet = null ) {
index 7b5123d..61bc90e 100644 (file)
@@ -39,7 +39,7 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
        private $useIndex = null;
        private $props = array(), $propHelp = array();
 
-       public function __construct( $query, $moduleName ) {
+       public function __construct( ApiQuery $query, $moduleName ) {
                switch ( $moduleName ) {
                        case 'alllinks':
                                $prefix = 'al';
@@ -116,7 +116,7 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
        }
 
        /**
-        * @param $resultPageSet ApiPageSet
+        * @param ApiPageSet $resultPageSet
         * @return void
         */
        private function run( $resultPageSet = null ) {
index 09f40fd..8d4af0b 100644 (file)
@@ -31,7 +31,7 @@
  */
 class ApiQueryAllMessages extends ApiQueryBase {
 
-       public function __construct( $query, $moduleName ) {
+       public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'am' );
        }
 
index 8ae8f3e..b283177 100644 (file)
@@ -31,7 +31,7 @@
  */
 class ApiQueryAllPages extends ApiQueryGeneratorBase {
 
-       public function __construct( $query, $moduleName ) {
+       public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'ap' );
        }
 
@@ -44,7 +44,7 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
        }
 
        /**
-        * @param $resultPageSet ApiPageSet
+        * @param ApiPageSet $resultPageSet
         * @return void
         */
        public function executeGenerator( $resultPageSet ) {
@@ -60,7 +60,7 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
        }
 
        /**
-        * @param $resultPageSet ApiPageSet
+        * @param ApiPageSet $resultPageSet
         * @return void
         */
        private function run( $resultPageSet = null ) {
index 7915118..42464ef 100644 (file)
@@ -30,7 +30,7 @@
  * @ingroup API
  */
 class ApiQueryAllUsers extends ApiQueryBase {
-       public function __construct( $query, $moduleName ) {
+       public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'au' );
        }
 
@@ -38,7 +38,7 @@ class ApiQueryAllUsers extends ApiQueryBase {
         * This function converts the user name to a canonical form
         * which is stored in the database.
         * @param string $name
-        * @return String
+        * @return string
         */
        private function getCanonicalUserName( $name ) {
                return str_replace( '_', ' ', $name );
index 9502d11..8dc2a65 100644 (file)
@@ -75,7 +75,7 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                )
        );
 
-       public function __construct( $query, $moduleName ) {
+       public function __construct( ApiQuery $query, $moduleName ) {
                $settings = $this->backlinksSettings[$moduleName];
                $prefix = $settings['prefix'];
                $code = $settings['code'];
@@ -116,7 +116,7 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
        }
 
        /**
-        * @param $resultPageSet ApiPageSet
+        * @param ApiPageSet $resultPageSet
         * @return void
         */
        private function prepareFirstQuery( $resultPageSet = null ) {
@@ -161,7 +161,7 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
        }
 
        /**
-        * @param $resultPageSet ApiPageSet
+        * @param ApiPageSet $resultPageSet
         * @return void
         */
        private function prepareSecondQuery( $resultPageSet = null ) {
@@ -242,7 +242,7 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
        }
 
        /**
-        * @param $resultPageSet ApiPageSet
+        * @param ApiPageSet $resultPageSet
         * @return void
         */
        private function run( $resultPageSet = null ) {
index 9d9f7c3..01384c0 100644 (file)
@@ -36,13 +36,13 @@ abstract class ApiQueryBase extends ApiBase {
        private $mQueryModule, $mDb, $tables, $where, $fields, $options, $join_conds;
 
        /**
-        * @param $query ApiBase
-        * @param $moduleName string
-        * @param $paramPrefix string
+        * @param ApiQuery $queryModule
+        * @param string $moduleName
+        * @param string $paramPrefix
         */
-       public function __construct( ApiBase $query, $moduleName, $paramPrefix = '' ) {
-               parent::__construct( $query->getMain(), $moduleName, $paramPrefix );
-               $this->mQueryModule = $query;
+       public function __construct( ApiQuery $queryModule, $moduleName, $paramPrefix = '' ) {
+               parent::__construct( $queryModule->getMain(), $moduleName, $paramPrefix );
+               $this->mQueryModule = $queryModule;
                $this->mDb = null;
                $this->resetQueryParams();
        }
@@ -55,7 +55,7 @@ abstract class ApiQueryBase extends ApiBase {
         * Public caching will only be allowed if *all* the modules that supply
         * data for a given request return a cache mode of public.
         *
-        * @param $params
+        * @param array $params
         * @return string
         */
        public function getCacheMode( $params ) {
@@ -75,8 +75,8 @@ abstract class ApiQueryBase extends ApiBase {
 
        /**
         * Add a set of tables to the internal array
-        * @param $tables mixed Table name or array of table names
-        * @param $alias mixed Table alias, or null for no alias. Cannot be
+        * @param mixed $tables Table name or array of table names
+        * @param mixed $alias Table alias, or null for no alias. Cannot be
         *  used with multiple tables
         */
        protected function addTables( $tables, $alias = null ) {
@@ -101,7 +101,7 @@ abstract class ApiQueryBase extends ApiBase {
         * conditions) e.g. array('page' => array('LEFT JOIN',
         * 'page_id=rev_page')) . conditions may be a string or an
         * addWhere()-style array
-        * @param $join_conds array JOIN conditions
+        * @param array $join_conds JOIN conditions
         */
        protected function addJoinConds( $join_conds ) {
                if ( !is_array( $join_conds ) ) {
@@ -147,7 +147,7 @@ abstract class ApiQueryBase extends ApiBase {
         *
         * For example, array('foo=bar', 'baz' => 3, 'bla' => 'foo') translates
         * to "foo=bar AND baz='3' AND bla='foo'"
-        * @param $value mixed String or array
+        * @param string|array $value
         */
        protected function addWhere( $value ) {
                if ( is_array( $value ) ) {
@@ -163,7 +163,7 @@ abstract class ApiQueryBase extends ApiBase {
 
        /**
         * Same as addWhere(), but add the WHERE clauses only if a condition is met
-        * @param $value mixed See addWhere()
+        * @param string|array $value
         * @param bool $condition If false, do nothing
         * @return bool $condition
         */
@@ -231,11 +231,11 @@ abstract class ApiQueryBase extends ApiBase {
         * Add a WHERE clause corresponding to a range, similar to addWhereRange,
         * but converts $start and $end to database timestamps.
         * @see addWhereRange
-        * @param $field
-        * @param $dir
-        * @param $start
-        * @param $end
-        * @param $sort bool
+        * @param string $field
+        * @param string $dir
+        * @param string $start
+        * @param string $end
+        * @param bool $sort
         */
        protected function addTimestampWhereRange( $field, $dir, $start, $end, $sort = true ) {
                $db = $this->getDb();
@@ -307,7 +307,7 @@ 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
+        * @return bool True if acceptable, false otherwise
         */
        protected function checkRowCount() {
                $db = $this->getDB();
@@ -333,7 +333,7 @@ abstract class ApiQueryBase extends ApiBase {
         * Add information (title and namespace) about a Title object to a
         * result array
         * @param array $arr Result array à la ApiResult
-        * @param $title Title
+        * @param Title $title
         * @param string $prefix Module prefix
         */
        public static function addTitleInfo( &$arr, $title, $prefix = '' ) {
@@ -344,7 +344,7 @@ abstract class ApiQueryBase extends ApiBase {
        /**
         * Override this method to request extra fields from the pageSet
         * using $pageSet->requestField('fieldName')
-        * @param $pageSet ApiPageSet
+        * @param ApiPageSet $pageSet
         */
        public function requestExtraData( $pageSet ) {
        }
@@ -485,7 +485,7 @@ abstract class ApiQueryBase extends ApiBase {
         * 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 $defaultNamespace int Namespace to assume
+        * @param int $defaultNamespace Namespace to assume
         * @return string Title part with underscores
         */
        public function titlePartToKey( $titlePart, $defaultNamespace = NS_MAIN ) {
@@ -530,8 +530,8 @@ abstract class ApiQueryBase extends ApiBase {
        }
 
        /**
-        * @param $query String
-        * @param $protocol String
+        * @param string $query
+        * @param string $protocol
         * @return null|string
         */
        public function prepareUrlQuerySearchString( $query = null, $protocol = null ) {
@@ -582,7 +582,7 @@ abstract class ApiQueryBase extends ApiBase {
        }
 
        /**
-        * @param $hash string
+        * @param string $hash
         * @return bool
         */
        public function validateSha1Hash( $hash ) {
@@ -590,7 +590,7 @@ abstract class ApiQueryBase extends ApiBase {
        }
 
        /**
-        * @param $hash string
+        * @param string $hash
         * @return bool
         */
        public function validateSha1Base36Hash( $hash ) {
@@ -631,7 +631,7 @@ abstract class ApiQueryGeneratorBase extends ApiQueryBase {
         * Switch this module to generator mode. By default, generator mode is
         * switched off and the module acts like a normal query module.
         * @since 1.21 requires pageset parameter
-        * @param $generatorPageSet ApiPageSet object that the module will get
+        * @param ApiPageSet $generatorPageSet ApiPageSet object that the module will get
         *        by calling getPageSet() when in generator mode.
         */
        public function setGeneratorMode( ApiPageSet $generatorPageSet ) {
@@ -684,8 +684,7 @@ abstract class ApiQueryGeneratorBase extends ApiQueryBase {
 
        /**
         * Execute this module as a generator
-        * @param $resultPageSet ApiPageSet: All output should be appended to
-        *  this object
+        * @param ApiPageSet $resultPageSet All output should be appended to this object
         */
        abstract public function executeGenerator( $resultPageSet );
 }
index cfca140..7d27a64 100644 (file)
 class ApiQueryBlocks extends ApiQueryBase {
 
        /**
-        * @var Array
+        * @var array
         */
        protected $usernames;
 
-       public function __construct( $query, $moduleName ) {
+       public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'bk' );
        }
 
index 30d7449..cfc76e6 100644 (file)
@@ -31,7 +31,7 @@
  */
 class ApiQueryCategories extends ApiQueryGeneratorBase {
 
-       public function __construct( $query, $moduleName ) {
+       public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'cl' );
        }
 
@@ -48,7 +48,7 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
        }
 
        /**
-        * @param $resultPageSet ApiPageSet
+        * @param ApiPageSet $resultPageSet
         */
        private function run( $resultPageSet = null ) {
                if ( $this->getPageSet()->getGoodTitleCount() == 0 ) {
index d0e3a36..8097b7b 100644 (file)
@@ -32,7 +32,7 @@
  */
 class ApiQueryCategoryInfo extends ApiQueryBase {
 
-       public function __construct( $query, $moduleName ) {
+       public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'ci' );
        }
 
index 424770f..a3bc3b9 100644 (file)
@@ -31,7 +31,7 @@
  */
 class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
 
-       public function __construct( $query, $moduleName ) {
+       public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'cm' );
        }
 
@@ -48,7 +48,7 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
        }
 
        /**
-        * @param $resultPageSet ApiPageSet
+        * @param ApiPageSet $resultPageSet
         * @return void
         */
        private function run( $resultPageSet = null ) {
index 912ac02..b90283f 100644 (file)
@@ -38,7 +38,7 @@ class ApiQueryContributors extends ApiQueryBase {
         */
        const MAX_PAGES = 100;
 
-       public function __construct( $query, $moduleName ) {
+       public function __construct( ApiQuery $query, $moduleName ) {
                // "pc" is short for "page contributors", "co" was already taken by the
                // GeoData extension's prop=coordinates.
                parent::__construct( $query, $moduleName, 'pc' );
index 2ca93f5..af0d938 100644 (file)
@@ -31,7 +31,7 @@
  */
 class ApiQueryDeletedrevs extends ApiQueryBase {
 
-       public function __construct( $query, $moduleName ) {
+       public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'dr' );
        }
 
index 3105f91..4645402 100644 (file)
@@ -31,7 +31,7 @@
  */
 class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
 
-       public function __construct( $query, $moduleName ) {
+       public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'df' );
        }
 
index f09fbd5..070681c 100644 (file)
@@ -29,7 +29,7 @@
  */
 class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
 
-       public function __construct( $query, $moduleName ) {
+       public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'eu' );
        }
 
@@ -46,7 +46,7 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
        }
 
        /**
-        * @param $resultPageSet ApiPageSet
+        * @param ApiPageSet $resultPageSet
         * @return void
         */
        private function run( $resultPageSet = null ) {
index f7a0958..e3a7be3 100644 (file)
@@ -31,7 +31,7 @@
  */
 class ApiQueryExternalLinks extends ApiQueryBase {
 
-       public function __construct( $query, $moduleName ) {
+       public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'el' );
        }
 
index d9579a1..d1600ef 100644 (file)
@@ -29,7 +29,7 @@
  */
 class ApiQueryFileRepoInfo extends ApiQueryBase {
 
-       public function __construct( $query, $moduleName ) {
+       public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'fri' );
        }
 
index e12d927..97918e3 100644 (file)
@@ -33,7 +33,7 @@
  */
 class ApiQueryFilearchive extends ApiQueryBase {
 
-       public function __construct( $query, $moduleName ) {
+       public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'fa' );
        }
 
index e4cecd5..35b2b40 100644 (file)
@@ -31,7 +31,7 @@
  */
 class ApiQueryIWBacklinks extends ApiQueryGeneratorBase {
 
-       public function __construct( $query, $moduleName ) {
+       public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'iwbl' );
        }
 
@@ -44,7 +44,7 @@ class ApiQueryIWBacklinks extends ApiQueryGeneratorBase {
        }
 
        /**
-        * @param $resultPageSet ApiPageSet
+        * @param ApiPageSet $resultPageSet
         * @return void
         */
        public function run( $resultPageSet = null ) {
index a7b69a0..f38a7b1 100644 (file)
@@ -32,7 +32,7 @@
  */
 class ApiQueryIWLinks extends ApiQueryBase {
 
-       public function __construct( $query, $moduleName ) {
+       public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'iw' );
        }
 
index 369d4c9..5a82f19 100644 (file)
@@ -33,7 +33,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
        const TRANSFORM_LIMIT = 50;
        private static $transformCount = 0;
 
-       public function __construct( $query, $moduleName, $prefix = 'ii' ) {
+       public function __construct( ApiQuery $query, $moduleName, $prefix = 'ii' ) {
                // We allow a subclass to override the prefix, to create a related API
                // module. Some other parts of MediaWiki construct this with a null
                // $prefix, which used to be ignored when this only took two arguments
@@ -222,7 +222,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
        /**
         * From parameters, construct a 'scale' array
         * @param array $params Parameters passed to api.
-        * @return Array or Null: key-val array of 'width' and 'height', or null
+        * @return array|null Key-val array of 'width' and 'height', or null
         */
        public function getScale( $params ) {
                $p = $this->getModulePrefix();
@@ -251,9 +251,9 @@ class ApiQueryImageInfo extends ApiQueryBase {
         * We do this later than getScale, since we need the image
         * to know which handler, since handlers can make their own parameters.
         * @param File $image Image that params are for.
-        * @param array $thumbParams thumbnail parameters from getScale
-        * @param string $otherParams of otherParams (iiurlparam).
-        * @return Array of parameters for transform.
+        * @param array $thumbParams Thumbnail parameters from getScale
+        * @param string $otherParams String of otherParams (iiurlparam).
+        * @return array Array of parameters for transform.
         */
        protected function mergeThumbParams( $image, $thumbParams, $otherParams ) {
                global $wgThumbLimits;
@@ -315,17 +315,17 @@ class ApiQueryImageInfo extends ApiQueryBase {
        /**
         * Get result information for an image revision
         *
-        * @param $file File object
-        * @param array $prop of properties to get (in the keys)
-        * @param $result ApiResult object
-        * @param array $thumbParams containing 'width' and 'height' items, or null
+        * @param File $file
+        * @param array $prop Array of properties to get (in the keys)
+        * @param ApiResult $result
+        * @param array $thumbParams Containing 'width' and 'height' items, or null
         * @param array|bool|string $opts Options for data fetching.
         *   This is an array consisting of the keys:
         *    'version': The metadata version for the metadata option
         *    'language': The language for extmetadata property
         *    'multilang': Return all translations in extmetadata property
         *    'revdelUser': User to use when checking whether to show revision-deleted fields.
-        * @return Array: result array
+        * @return array Result array
         */
        static function getInfo( $file, $prop, $result, $thumbParams = null, $opts = false ) {
                global $wgContLang;
@@ -536,7 +536,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
         *
         * If this is >= TRANSFORM_LIMIT, you should probably stop processing images.
         *
-        * @return integer count
+        * @return int count
         */
        static function getTransformCount() {
                return self::$transformCount;
@@ -544,9 +544,9 @@ class ApiQueryImageInfo extends ApiQueryBase {
 
        /**
         *
-        * @param $metadata Array
-        * @param $result ApiResult
-        * @return Array
+        * @param array $metadata
+        * @param ApiResult $result
+        * @return array
         */
        public static function processMetaData( $metadata, $result ) {
                $retval = array();
@@ -575,7 +575,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
        }
 
        /**
-        * @param $img File
+        * @param File $img
         * @param null|string $start
         * @return string
         */
@@ -647,7 +647,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
         *
         * @param array $filter List of properties to filter out
         *
-        * @return Array
+        * @return array
         */
        public static function getPropertyNames( $filter = array() ) {
                return array_diff( array_keys( self::getProperties() ), $filter );
@@ -705,7 +705,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
 
        /**
         * Return the API documentation for the parameters.
-        * @return Array parameter documentation.
+        * @return array Parameter documentation.
         */
        public function getParamDescription() {
                $p = $this->getModulePrefix();
index a66ad40..87b0778 100644 (file)
@@ -32,7 +32,7 @@
  */
 class ApiQueryImages extends ApiQueryGeneratorBase {
 
-       public function __construct( $query, $moduleName ) {
+       public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'im' );
        }
 
@@ -45,7 +45,7 @@ class ApiQueryImages extends ApiQueryGeneratorBase {
        }
 
        /**
-        * @param $resultPageSet ApiPageSet
+        * @param ApiPageSet $resultPageSet
         */
        private function run( $resultPageSet = null ) {
                if ( $this->getPageSet()->getGoodTitleCount() == 0 ) {
index 43b8c0c..f160791 100644 (file)
@@ -48,12 +48,12 @@ class ApiQueryInfo extends ApiQueryBase {
 
        private $tokenFunctions;
 
-       public function __construct( $query, $moduleName ) {
+       public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'in' );
        }
 
        /**
-        * @param $pageSet ApiPageSet
+        * @param ApiPageSet $pageSet
         * @return void
         */
        public function requestExtraData( $pageSet ) {
@@ -80,7 +80,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)
-        * @return array array(tokenname => function)
+        * @return array Array(tokenname => function)
         */
        protected function getTokenFunctions() {
                // Don't call the hooks twice
@@ -345,7 +345,7 @@ class ApiQueryInfo extends ApiQueryBase {
        /**
         * Get a result array with information about a title
         * @param int $pageid Page ID (negative for missing titles)
-        * @param $title Title object
+        * @param Title $title
         * @return array
         */
        private function extractPageInfo( $pageid, $title ) {
index e6280c8..13711e6 100644 (file)
@@ -31,7 +31,7 @@
  */
 class ApiQueryLangBacklinks extends ApiQueryGeneratorBase {
 
-       public function __construct( $query, $moduleName ) {
+       public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'lbl' );
        }
 
@@ -44,7 +44,7 @@ class ApiQueryLangBacklinks extends ApiQueryGeneratorBase {
        }
 
        /**
-        * @param $resultPageSet ApiPageSet
+        * @param ApiPageSet $resultPageSet
         * @return void
         */
        public function run( $resultPageSet = null ) {
index 8e155f2..53cfba1 100644 (file)
@@ -31,7 +31,7 @@
  */
 class ApiQueryLangLinks extends ApiQueryBase {
 
-       public function __construct( $query, $moduleName ) {
+       public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'll' );
        }
 
index dd816cf..7c17938 100644 (file)
@@ -36,7 +36,7 @@ class ApiQueryLinks extends ApiQueryGeneratorBase {
 
        private $table, $prefix, $description, $helpUrl;
 
-       public function __construct( $query, $moduleName ) {
+       public function __construct( ApiQuery $query, $moduleName ) {
                switch ( $moduleName ) {
                        case self::LINKS:
                                $this->table = 'pagelinks';
index ee7fbc0..2d9d710 100644 (file)
@@ -31,7 +31,7 @@
  */
 class ApiQueryLogEvents extends ApiQueryBase {
 
-       public function __construct( $query, $moduleName ) {
+       public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'le' );
        }
 
@@ -43,6 +43,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
        public function execute() {
                $params = $this->extractRequestParams();
                $db = $this->getDB();
+               $this->requireMaxOneParameter( $params, 'title', 'prefix', 'namespace' );
 
                $prop = array_flip( $params['prop'] );
 
@@ -81,6 +82,10 @@ class ApiQueryLogEvents extends ApiQueryBase {
                ) );
 
                $this->addFieldsIf( 'page_id', $this->fld_ids );
+               // log_page is the page_id saved at log time, whereas page_id is from a
+               // join at query time.  This leads to different results in various
+               // scenarios, e.g. deletion, recreation.
+               $this->addFieldsIf( 'log_page', $this->fld_ids );
                $this->addFieldsIf( array( 'log_user', 'log_user_text', 'user_name' ), $this->fld_user );
                $this->addFieldsIf( 'log_user', $this->fld_userid );
                $this->addFieldsIf(
@@ -175,6 +180,10 @@ class ApiQueryLogEvents extends ApiQueryBase {
                        $this->addWhereFld( 'log_title', $titleObj->getDBkey() );
                }
 
+               if ( $params['namespace'] !== null ) {
+                       $this->addWhereFld( 'log_namespace', $params['namespace'] );
+               }
+
                $prefix = $params['prefix'];
 
                if ( !is_null( $prefix ) ) {
@@ -192,7 +201,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
                }
 
                // Paranoia: avoid brute force searches (bug 17342)
-               if ( !is_null( $title ) || !is_null( $user ) ) {
+               if ( $params['namespace'] !== null || !is_null( $title ) || !is_null( $user ) ) {
                        if ( !$this->getUser()->isAllowed( 'deletedhistory' ) ) {
                                $titleBits = LogPage::DELETED_ACTION;
                                $userBits = LogPage::DELETED_USER;
@@ -203,7 +212,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
                                $titleBits = 0;
                                $userBits = 0;
                        }
-                       if ( !is_null( $title ) && $titleBits ) {
+                       if ( ( $params['namespace'] !== null || !is_null( $title ) ) && $titleBits ) {
                                $this->addWhere( $db->bitAnd( 'log_deleted', $titleBits ) . " != $titleBits" );
                        }
                        if ( !is_null( $user ) && $userBits ) {
@@ -236,13 +245,13 @@ class ApiQueryLogEvents extends ApiQueryBase {
        }
 
        /**
-        * @param $result ApiResult
-        * @param $vals array
-        * @param $params string
-        * @param $type string
-        * @param $action string
-        * @param $ts
-        * @param $legacy bool
+        * @param ApiResult $result
+        * @param array $vals
+        * @param string $params
+        * @param string $type
+        * @param string $action
+        * @param string $ts
+        * @param bool $legacy
         * @return array
         */
        public static function addLogParams( $result, &$vals, $params, $type,
@@ -364,6 +373,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
                                }
                                if ( $this->fld_ids ) {
                                        $vals['pageid'] = intval( $row->page_id );
+                                       $vals['logpage'] = intval( $row->log_page );
                                }
                                if ( $this->fld_details && $row->log_params !== '' ) {
                                        self::addLogParams(
@@ -505,6 +515,9 @@ class ApiQueryLogEvents extends ApiQueryBase {
                        ),
                        'user' => null,
                        'title' => null,
+                       'namespace' => array(
+                               ApiBase::PARAM_TYPE => 'namespace'
+                       ),
                        'prefix' => null,
                        'tag' => null,
                        'limit' => array(
@@ -545,6 +558,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
                        'dir' => $this->getDirectionDescription( $p ),
                        'user' => 'Filter entries to those made by the given user',
                        'title' => 'Filter entries to those related to a page',
+                       'namespace' => 'Filter entries to those in the given namespace',
                        'prefix' => 'Filter entries that start with this prefix. Disabled in Miser Mode',
                        'limit' => 'How many total event entries to return',
                        'tag' => 'Only list event entries tagged with this tag',
index c387475..8cd9c6c 100644 (file)
@@ -32,7 +32,7 @@
  */
 class ApiQueryPagePropNames extends ApiQueryBase {
 
-       public function __construct( $query, $moduleName ) {
+       public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'ppn' );
        }
 
index 52be5ca..e370c39 100644 (file)
@@ -33,7 +33,7 @@ class ApiQueryPageProps extends ApiQueryBase {
 
        private $params;
 
-       public function __construct( $query, $moduleName ) {
+       public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'pp' );
        }
 
@@ -104,9 +104,9 @@ class ApiQueryPageProps extends ApiQueryBase {
         * Add page properties to an ApiResult, adding a continue
         * parameter if it doesn't fit.
         *
-        * @param $result ApiResult
-        * @param $page int
-        * @param $props array
+        * @param ApiResult $result
+        * @param int $page
+        * @param array $props
         * @return bool True if it fits in the result
         */
        private function addPageProps( $result, $page, $props ) {
index df07249..b6c8525 100644 (file)
@@ -32,7 +32,7 @@
  */
 class ApiQueryPagesWithProp extends ApiQueryGeneratorBase {
 
-       public function __construct( $query, $moduleName ) {
+       public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'pwp' );
        }
 
@@ -49,7 +49,7 @@ class ApiQueryPagesWithProp extends ApiQueryGeneratorBase {
        }
 
        /**
-        * @param $resultPageSet ApiPageSet
+        * @param ApiPageSet $resultPageSet
         * @return void
         */
        private function run( $resultPageSet = null ) {
index dfe0eec..4abd7f0 100644 (file)
@@ -36,7 +36,7 @@ class ApiQueryPrefixSearch extends ApiQueryGeneratorBase {
        }
 
        /**
-        * @param $resultPageSet ApiPageSet
+        * @param ApiPageSet $resultPageSet
         */
        private function run( $resultPageSet = null ) {
                $params = $this->extractRequestParams();
@@ -93,8 +93,8 @@ class ApiQueryPrefixSearch extends ApiQueryGeneratorBase {
                                        ApiBase::PARAM_DFLT => 10,
                                        ApiBase::PARAM_TYPE => 'limit',
                                        ApiBase::PARAM_MIN => 1,
-                                       ApiBase::PARAM_MAX => 100, // Non-standard value for compatibility
-                                                                  // with action=opensearch
+                                       // Non-standard value for compatibility with action=opensearch
+                                       ApiBase::PARAM_MAX => 100,
                                        ApiBase::PARAM_MAX2 => 200,
                                ),
                        );
index 6cf7ff3..8f120c6 100644 (file)
@@ -31,7 +31,7 @@
  */
 class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
 
-       public function __construct( $query, $moduleName ) {
+       public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'pt' );
        }
 
@@ -44,7 +44,7 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
        }
 
        /**
-        * @param $resultPageSet ApiPageSet
+        * @param ApiPageSet $resultPageSet
         * @return void
         */
        private function run( $resultPageSet = null ) {
index b13f797..45950e7 100644 (file)
@@ -32,7 +32,7 @@
 class ApiQueryQueryPage extends ApiQueryGeneratorBase {
        private $qpMap;
 
-       public function __construct( $query, $moduleName ) {
+       public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'qp' );
                // Build mapping from special page names to QueryPage classes
                global $wgAPIUselessQueryPages;
@@ -53,7 +53,7 @@ class ApiQueryQueryPage extends ApiQueryGeneratorBase {
        }
 
        /**
-        * @param $resultPageSet ApiPageSet
+        * @param ApiPageSet $resultPageSet
         */
        public function run( $resultPageSet = null ) {
                global $wgQueryCacheLimit;
index ad26cce..07f8a0e 100644 (file)
@@ -33,7 +33,7 @@
 class ApiQueryRandom extends ApiQueryGeneratorBase {
        private $pageIDs;
 
-       public function __construct( $query, $moduleName ) {
+       public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'rn' );
        }
 
@@ -46,11 +46,11 @@ class ApiQueryRandom extends ApiQueryGeneratorBase {
        }
 
        /**
-        * @param $randstr
-        * @param $limit
-        * @param $namespace
-        * @param $resultPageSet ApiPageSet
-        * @param $redirect
+        * @param string $randstr
+        * @param int $limit
+        * @param int $namespace
+        * @param ApiPageSet $resultPageSet
+        * @param bool $redirect
         * @return void
         */
        protected function prepareQuery( $randstr, $limit, $namespace, &$resultPageSet, $redirect ) {
@@ -68,7 +68,7 @@ class ApiQueryRandom extends ApiQueryGeneratorBase {
        }
 
        /**
-        * @param $resultPageSet ApiPageSet
+        * @param ApiPageSet $resultPageSet
         * @return int
         */
        protected function runQuery( $resultPageSet = null ) {
@@ -99,7 +99,7 @@ class ApiQueryRandom extends ApiQueryGeneratorBase {
        }
 
        /**
-        * @param $resultPageSet ApiPageSet
+        * @param ApiPageSet $resultPageSet
         * @return void
         */
        public function run( $resultPageSet = null ) {
index 80352f2..1fb2a69 100644 (file)
@@ -32,7 +32,7 @@
  */
 class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
 
-       public function __construct( $query, $moduleName ) {
+       public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'rc' );
        }
 
@@ -69,9 +69,9 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
        }
 
        /**
-        * @param $pageid
-        * @param $title
-        * @param $rc RecentChange (optional)
+        * @param int $pageid
+        * @param Title $title
+        * @param RecentChange|null $rc
         * @return bool|string
         */
        public static function getPatrolToken( $pageid, $title, $rc = null ) {
@@ -135,7 +135,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
        /**
         * Generates and outputs the result of this query based upon the provided parameters.
         *
-        * @param $resultPageSet ApiPageSet
+        * @param ApiPageSet $resultPageSet
         */
        public function run( $resultPageSet = null ) {
                $user = $this->getUser();
@@ -174,7 +174,11 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                $this->addWhereFld( 'rc_namespace', $params['namespace'] );
 
                if ( !is_null( $params['type'] ) ) {
-                       $this->addWhereFld( 'rc_type', $this->parseRCType( $params['type'] ) );
+                       try {
+                               $this->addWhereFld( 'rc_type', RecentChange::parseToRCType( $params['type'] ) );
+                       } catch ( MWException $e ) {
+                               ApiBase::dieDebug( __METHOD__, $e->getMessage() );
+                       }
                }
 
                if ( !is_null( $params['show'] ) ) {
@@ -414,30 +418,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                $vals = array();
 
                $type = intval( $row->rc_type );
-
-               /* Determine what kind of change this was. */
-               switch ( $type ) {
-                       case RC_EDIT:
-                               $vals['type'] = 'edit';
-                               break;
-                       case RC_NEW:
-                               $vals['type'] = 'new';
-                               break;
-                       case RC_MOVE:
-                               $vals['type'] = 'move';
-                               break;
-                       case RC_LOG:
-                               $vals['type'] = 'log';
-                               break;
-                       case RC_EXTERNAL:
-                               $vals['type'] = 'external';
-                               break;
-                       case RC_MOVE_OVER_REDIRECT:
-                               $vals['type'] = 'move over redirect';
-                               break;
-                       default:
-                               $vals['type'] = $type;
-               }
+               $vals['type'] = RecentChange::parseFromRCType( $type );
 
                $anyHidden = false;
 
@@ -607,30 +588,6 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                return $vals;
        }
 
-       private function parseRCType( $type ) {
-               if ( is_array( $type ) ) {
-                       $retval = array();
-                       foreach ( $type as $t ) {
-                               $retval[] = $this->parseRCType( $t );
-                       }
-
-                       return $retval;
-               }
-
-               switch ( $type ) {
-                       case 'edit':
-                               return RC_EDIT;
-                       case 'new':
-                               return RC_NEW;
-                       case 'log':
-                               return RC_LOG;
-                       case 'external':
-                               return RC_EXTERNAL;
-                       default:
-                               ApiBase::dieDebug( __METHOD__, "Unknown type '$type'" );
-               }
-       }
-
        public function getCacheMode( $params ) {
                if ( isset( $params['show'] ) ) {
                        foreach ( $params['show'] as $show ) {
index 1deb1f8..afb2c56 100644 (file)
@@ -32,7 +32,7 @@
  */
 class ApiQueryRedirects extends ApiQueryGeneratorBase {
 
-       public function __construct( $query, $moduleName ) {
+       public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'rd' );
        }
 
@@ -45,7 +45,7 @@ class ApiQueryRedirects extends ApiQueryGeneratorBase {
        }
 
        /**
-        * @param $resultPageSet ApiPageSet
+        * @param ApiPageSet $resultPageSet
         */
        private function run( ApiPageSet $resultPageSet = null ) {
                $db = $this->getDB();
@@ -116,7 +116,10 @@ class ApiQueryRedirects extends ApiQueryGeneratorBase {
                                $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(
+                               "rd_fragment = $emptyString OR rd_fragment IS NULL",
+                               isset( $show['!fragment'] )
+                       );
                }
 
                $map = $pageSet->getAllTitlesByNamespace();
index 033976f..50c3c7b 100644 (file)
@@ -37,7 +37,7 @@ class ApiQueryRevisions extends ApiQueryBase {
        private $diffto, $difftotext, $expandTemplates, $generateXML, $section,
                $token, $parseContent, $contentFormat;
 
-       public function __construct( $query, $moduleName ) {
+       public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'rv' );
        }
 
@@ -72,10 +72,10 @@ class ApiQueryRevisions extends ApiQueryBase {
        }
 
        /**
-        * @param $pageid
-        * @param $title Title
-        * @param $rev Revision
-        * @return bool|String
+        * @param int $pageid
+        * @param Title $title
+        * @param Revision $rev
+        * @return bool|string
         */
        public static function getRollbackToken( $pageid, $title, $rev ) {
                global $wgUser;
@@ -209,7 +209,7 @@ class ApiQueryRevisions extends ApiQueryBase {
                        $this->addWhereFld( 'ct_tag', $params['tag'] );
                }
 
-               if ( isset( $prop['content'] ) || !is_null( $this->difftotext ) ) {
+               if ( isset( $prop['content'] ) || !is_null( $this->diffto ) || !is_null( $this->difftotext ) ) {
                        // For each page we will request, the user must have read rights for that page
                        $user = $this->getUser();
                        /** @var $title Title */
index a2a15e0..d67fac2 100644 (file)
@@ -39,7 +39,7 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
         */
        const BACKEND_NULL_PARAM = 'database-backed';
 
-       public function __construct( $query, $moduleName ) {
+       public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'sr' );
        }
 
@@ -52,7 +52,7 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
        }
 
        /**
-        * @param $resultPageSet ApiPageSet
+        * @param ApiPageSet $resultPageSet
         * @return void
         */
        private function run( $resultPageSet = null ) {
@@ -222,8 +222,12 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                                );
 
                                // Add item to results and see whether it fits
-                               $fit = $apiResult->addValue( array( 'query', 'interwiki' . $this->getModuleName(), $result->getInterwikiPrefix()  ),
-                                       null, $vals );
+                               $fit = $apiResult->addValue(
+                                       array( 'query', 'interwiki' . $this->getModuleName(), $result->getInterwikiPrefix()  ),
+                                       null,
+                                       $vals
+                               );
+
                                if ( !$fit ) {
                                        // We hit the limit. We can't really provide any meaningful
                                        // pagination info so just bail out
index b7796ee..0a97d04 100644 (file)
@@ -31,7 +31,7 @@
  */
 class ApiQuerySiteinfo extends ApiQueryBase {
 
-       public function __construct( $query, $moduleName ) {
+       public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'si' );
        }
 
@@ -180,6 +180,8 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                $git = SpecialVersion::getGitHeadSha1( $GLOBALS['IP'] );
                if ( $git ) {
                        $data['git-hash'] = $git;
+                       $data['git-branch'] =
+                               SpecialVersion::getGitCurrentBranch( $GLOBALS['IP'] );
                } else {
                        $svn = SpecialVersion::getSvnRevision( $GLOBALS['IP'] );
                        if ( $svn ) {
@@ -239,6 +241,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                $data['script'] = $GLOBALS['wgScript'];
                $data['variantarticlepath'] = $GLOBALS['wgVariantArticlePath'];
                $data['server'] = $GLOBALS['wgServer'];
+               $data['servername'] = $GLOBALS['wgServerName'];
                $data['wikiid'] = wfWikiID();
                $data['time'] = wfTimestamp( TS_ISO_8601, time() );
 
@@ -393,6 +396,9 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                                $val['language'] = $langNames[$prefix];
                        }
                        $val['url'] = wfExpandUrl( $row['iw_url'], PROTO_CURRENT );
+                       if (substr( $row['iw_url'], 0, 2) == '//') {
+                               $val['protorel'] = true;
+                       }
                        if ( isset( $row['iw_wikiid'] ) ) {
                                $val['wikiid'] = $row['iw_wikiid'];
                        }
@@ -567,7 +573,10 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                                                $ret['vcs-system'] = 'git';
                                                $ret['vcs-version'] = $vcsVersion;
                                                $ret['vcs-url'] = $gitInfo->getHeadViewUrl();
-                                               $ret['vcs-date'] = wfTimestamp( TS_ISO_8601, $gitInfo->getHeadCommitDate() );
+                                               $vcsDate = $gitInfo->getHeadCommitDate();
+                                               if ( $vcsDate !== false ) {
+                                                       $ret['vcs-date'] = wfTimestamp( TS_ISO_8601, $vcsDate );
+                                               }
                                        } else {
                                                $svnInfo = SpecialVersion::getSvnInfo( $extensionPath );
                                                if ( $svnInfo !== false ) {
index 6a49e60..d9409ec 100644 (file)
@@ -27,7 +27,7 @@
  */
 class ApiQueryStashImageInfo extends ApiQueryImageInfo {
 
-       public function __construct( $query, $moduleName ) {
+       public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'sii' );
        }
 
@@ -108,7 +108,7 @@ class ApiQueryStashImageInfo extends ApiQueryImageInfo {
 
        /**
         * Return the API documentation for the parameters.
-        * @return Array parameter documentation.
+        * @return array Parameter documentation.
         */
        public function getParamDescription() {
                $p = $this->getModulePrefix();
index 9e2559f..77c105a 100644 (file)
@@ -40,7 +40,7 @@ class ApiQueryTags extends ApiQueryBase {
        private $fld_displayname = false, $fld_description = false,
                $fld_hitcount = false;
 
-       public function __construct( $query, $moduleName ) {
+       public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'tg' );
        }
 
index e9fec43..568ccb5 100644 (file)
@@ -31,7 +31,7 @@
  */
 class ApiQueryContributions extends ApiQueryBase {
 
-       public function __construct( $query, $moduleName ) {
+       public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'uc' );
        }
 
@@ -130,7 +130,7 @@ class ApiQueryContributions extends ApiQueryBase {
         * Validate the 'user' parameter and set the value to compare
         * against `revision`.`rev_user_text`
         *
-        * @param $user string
+        * @param string $user
         */
        private function prepareUsername( $user ) {
                if ( !is_null( $user ) && $user !== '' ) {
@@ -326,7 +326,7 @@ class ApiQueryContributions extends ApiQueryBase {
        /**
         * Extract fields from the database row and append them to a result array
         *
-        * @param $row
+        * @param mixed $row
         * @return array
         */
        private function extractRowInfo( $row ) {
index 200b03b..ee5e458 100644 (file)
@@ -33,7 +33,7 @@ class ApiQueryUserInfo extends ApiQueryBase {
 
        private $prop = array();
 
-       public function __construct( $query, $moduleName ) {
+       public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'ui' );
        }
 
index d98cc39..d0d0f08 100644 (file)
@@ -33,7 +33,24 @@ class ApiQueryUsers extends ApiQueryBase {
 
        private $tokenFunctions, $prop;
 
-       public function __construct( $query, $moduleName ) {
+       /**
+        * Properties whose contents does not depend on who is looking at them. If the usprops field
+        * contains anything not listed here, the cache mode will never be public for logged-in users.
+        * @var array
+        */
+       protected static $publicProps = array(
+               // everything except 'blockinfo' which might show hidden records if the user
+               // making the request has the appropriate permissions
+               'groups',
+               'implicitgroups',
+               'rights',
+               'editcount',
+               'registration',
+               'emailable',
+               'gender',
+       );
+
+       public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'us' );
        }
 
@@ -41,7 +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)
-        * @return Array tokenname => function
+        * @return array Array of tokenname => function
         */
        protected function getTokenFunctions() {
                // Don't call the hooks twice
@@ -63,8 +80,8 @@ class ApiQueryUsers extends ApiQueryBase {
        }
 
        /**
-        * @param $user User
-        * @return String
+        * @param User $user
+        * @return string
         */
        public static function getUserrightsToken( $user ) {
                global $wgUser;
@@ -261,7 +278,7 @@ class ApiQueryUsers extends ApiQueryBase {
         * 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
+        * @param User $user
         * @return array
         */
        public static function getAutoGroups( $user ) {
@@ -271,7 +288,13 @@ class ApiQueryUsers extends ApiQueryBase {
        }
 
        public function getCacheMode( $params ) {
-               return isset( $params['token'] ) ? 'private' : 'anon-public-user-private';
+               if ( isset( $params['token'] ) ) {
+                       return 'private';
+               } elseif ( array_diff( (array)$params['prop'], static::$publicProps ) ) {
+                       return 'anon-public-user-private';
+               } else {
+                       return 'public';
+               }
        }
 
        public function getAllowedParams() {
index 2e1ce6c..9a4dd82 100644 (file)
@@ -32,7 +32,7 @@
  */
 class ApiQueryWatchlist extends ApiQueryGeneratorBase {
 
-       public function __construct( $query, $moduleName ) {
+       public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'wl' );
        }
 
@@ -51,7 +51,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                $fld_loginfo = false;
 
        /**
-        * @param $resultPageSet ApiPageSet
+        * @param ApiPageSet $resultPageSet
         * @return void
         */
        private function run( $resultPageSet = null ) {
@@ -194,7 +194,11 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                }
 
                if ( !is_null( $params['type'] ) ) {
-                       $this->addWhereFld( 'rc_type', $this->parseRCType( $params['type'] ) );
+                       try {
+                               $this->addWhereFld( 'rc_type', RecentChange::parseToRCType( $params['type'] ) );
+                       } catch ( MWException $e ) {
+                               ApiBase::dieDebug( __METHOD__, $e->getMessage() );
+                       }
                }
 
                if ( !is_null( $params['user'] ) && !is_null( $params['excludeuser'] ) ) {
@@ -292,33 +296,8 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
 
                /* Our output data. */
                $vals = array();
-
                $type = intval( $row->rc_type );
-
-               /* Determine what kind of change this was. */
-               switch ( $type ) {
-                       case RC_EDIT:
-                               $vals['type'] = 'edit';
-                               break;
-                       case RC_NEW:
-                               $vals['type'] = 'new';
-                               break;
-                       case RC_MOVE:
-                               $vals['type'] = 'move';
-                               break;
-                       case RC_LOG:
-                               $vals['type'] = 'log';
-                               break;
-                       case RC_EXTERNAL:
-                               $vals['type'] = 'external';
-                               break;
-                       case RC_MOVE_OVER_REDIRECT:
-                               $vals['type'] = 'move over redirect';
-                               break;
-                       default:
-                               $vals['type'] = $type;
-               }
-
+               $vals['type'] = RecentChange::parseFromRCType( $type );
                $anyHidden = false;
 
                /* Create a new entry in the result for the title. */
@@ -449,35 +428,6 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                return $vals;
        }
 
-       /** Copied from ApiQueryRecentChanges.
-        *
-        * @param string $type
-        * @return string
-        */
-       private function parseRCType( $type ) {
-               if ( is_array( $type ) ) {
-                       $retval = array();
-                       foreach ( $type as $t ) {
-                               $retval[] = $this->parseRCType( $t );
-                       }
-
-                       return $retval;
-               }
-
-               switch ( $type ) {
-                       case 'edit':
-                               return RC_EDIT;
-                       case 'new':
-                               return RC_NEW;
-                       case 'log':
-                               return RC_LOG;
-                       case 'external':
-                               return RC_EXTERNAL;
-                       default:
-                               ApiBase::dieDebug( __METHOD__, "Unknown type '$type'" );
-               }
-       }
-
        public function getAllowedParams() {
                return array(
                        'allrev' => false,
index f45d0e4..6aae6dc 100644 (file)
@@ -32,7 +32,7 @@
  */
 class ApiQueryWatchlistRaw extends ApiQueryGeneratorBase {
 
-       public function __construct( $query, $moduleName ) {
+       public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'wr' );
        }
 
@@ -45,7 +45,7 @@ class ApiQueryWatchlistRaw extends ApiQueryGeneratorBase {
        }
 
        /**
-        * @param $resultPageSet ApiPageSet
+        * @param ApiPageSet $resultPageSet
         * @return void
         */
        private function run( $resultPageSet = null ) {
index 0cbfcc8..c351561 100644 (file)
@@ -59,10 +59,9 @@ class ApiResult extends ApiBase {
        private $mData, $mIsRawMode, $mSize, $mCheckingSize;
 
        /**
-        * Constructor
-        * @param $main ApiMain object
+        * @param ApiMain $main
         */
-       public function __construct( $main ) {
+       public function __construct( ApiMain $main ) {
                parent::__construct( $main, 'result' );
                $this->mIsRawMode = false;
                $this->mCheckingSize = true;
@@ -106,7 +105,7 @@ class ApiResult extends ApiBase {
        /**
         * Get the 'real' size of a result item. This means the strlen() of the item,
         * or the sum of the strlen()s of the elements if the item is an array.
-        * @param $value mixed
+        * @param mixed $value
         * @return int
         */
        public static function size( $value ) {
@@ -150,9 +149,9 @@ class ApiResult extends ApiBase {
        /**
         * Add an output value to the array by name.
         * Verifies that value with the same name has not been added before.
-        * @param array $arr to add $value to
+        * @param array $arr To add $value to
         * @param string $name Index of $arr to add $value at
-        * @param $value mixed
+        * @param mixed $value
         * @param int $flags Zero or more OR-ed flags like OVERRIDE | ADD_ON_TOP.
         *    This parameter used to be boolean, and the value of OVERRIDE=1 was
         *    specifically chosen so that it would be backwards compatible with the
@@ -192,9 +191,9 @@ class ApiResult extends ApiBase {
        /**
         * Adds a content element to an array.
         * Use this function instead of hardcoding the '*' element.
-        * @param array $arr to add the content element to
-        * @param $value Mixed
-        * @param string $subElemName when present, content element is created
+        * @param array $arr To add the content element to
+        * @param mixed $value
+        * @param string $subElemName When present, content element is created
         *  as a sub item of $arr. Use this parameter to create elements in
         *  format "<elem>text</elem>" without attributes.
         */
@@ -216,7 +215,7 @@ class ApiResult extends ApiBase {
         * In case the array contains indexed values (in addition to named),
         * give all indexed values the given tag name. This function MUST be
         * called on every array that has numerical indexes.
-        * @param $arr array
+        * @param array $arr
         * @param string $tag Tag name
         */
        public function setIndexedTagName( &$arr, $tag ) {
@@ -233,7 +232,7 @@ class ApiResult extends ApiBase {
 
        /**
         * Calls setIndexedTagName() on each sub-array of $arr
-        * @param $arr array
+        * @param array $arr
         * @param string $tag Tag name
         */
        public function setIndexedTagName_recursive( &$arr, $tag ) {
@@ -254,7 +253,7 @@ class ApiResult extends ApiBase {
         * Don't specify a path to a value that's not in the result, or
         * you'll get nasty errors.
         * @param array $path Path to the array, like addValue()'s $path
-        * @param $tag string
+        * @param string $tag
         */
        public function setIndexedTagName_internal( $path, $tag ) {
                $data = &$this->mData;
@@ -277,9 +276,9 @@ class ApiResult extends ApiBase {
         * If $path is null, the value will be inserted at the data root.
         * If $name is empty, the $value is added as a next list element data[] = $value.
         *
-        * @param $path array|string|null
-        * @param $name string
-        * @param $value mixed
+        * @param array|string|null $path
+        * @param string $name
+        * @param mixed $value
         * @param int $flags Zero or more OR-ed flags like OVERRIDE | ADD_ON_TOP. This
         *    parameter used to be boolean, and the value of OVERRIDE=1 was specifically
         *    chosen so that it would be backwards compatible with the new method
@@ -340,8 +339,8 @@ class ApiResult extends ApiBase {
        /**
         * Add a parsed limit=max to the result.
         *
-        * @param $moduleName string
-        * @param $limit int
+        * @param string $moduleName
+        * @param int $limit
         */
        public function setParsedLimit( $moduleName, $limit ) {
                // Add value, allowing overwriting
@@ -352,8 +351,8 @@ class ApiResult extends ApiBase {
         * Unset a value previously added to the result set.
         * Fails silently if the value isn't found.
         * For parameters, see addValue()
-        * @param $path array|null
-        * @param $name string
+        * @param array|null $path
+        * @param string $name
         */
        public function unsetValue( $path, $name ) {
                $data = &$this->mData;
@@ -379,7 +378,7 @@ class ApiResult extends ApiBase {
        /**
         * Callback function for cleanUpUTF8()
         *
-        * @param $s string
+        * @param string $s
         */
        private static function cleanUp_helper( &$s ) {
                if ( !is_string( $s ) ) {
index 70a2fec..d0ce6d7 100644 (file)
@@ -43,12 +43,12 @@ class ApiRollback extends ApiBase {
                $params = $this->extractRequestParams();
 
                // User and title already validated in call to getTokenSalt from Main
-               $titleObj = $this->getRbTitle();
+               $titleObj = $this->getRbTitle( $params );
                $pageObj = WikiPage::factory( $titleObj );
                $summary = $params['summary'];
                $details = array();
                $retval = $pageObj->doRollback(
-                       $this->getRbUser(),
+                       $this->getRbUser( $params ),
                        $summary,
                        $params['token'],
                        $params['markbot'],
@@ -85,9 +85,9 @@ class ApiRollback extends ApiBase {
 
        public function getAllowedParams() {
                return array(
-                       'title' => array(
-                               ApiBase::PARAM_TYPE => 'string',
-                               ApiBase::PARAM_REQUIRED => true
+                       'title' => null,
+                       'pageid' => array(
+                               ApiBase::PARAM_TYPE => 'integer'
                        ),
                        'user' => array(
                                ApiBase::PARAM_TYPE => 'string',
@@ -112,8 +112,11 @@ class ApiRollback extends ApiBase {
        }
 
        public function getParamDescription() {
+               $p = $this->getModulePrefix();
+
                return array(
-                       'title' => 'Title of the page you want to rollback.',
+                       '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",
                        '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 ' .
@@ -146,11 +149,16 @@ class ApiRollback extends ApiBase {
        }
 
        public function getPossibleErrors() {
-               return array_merge( parent::getPossibleErrors(), array(
-                       array( 'invalidtitle', 'title' ),
-                       array( 'notanarticle' ),
-                       array( 'invaliduser', 'user' ),
-               ) );
+               return array_merge(
+                       parent::getPossibleErrors(),
+                       $this->getRequireOnlyOneParameterErrorMessages( array( 'title', 'pageid' ) ),
+                       array(
+                               array( 'invalidtitle', 'title' ),
+                               array( 'notanarticle' ),
+                               array( 'nosuchpageid', 'pageid' ),
+                               array( 'invaliduser', 'user' ),
+                       )
+               );
        }
 
        public function needsToken() {
@@ -158,16 +166,24 @@ class ApiRollback extends ApiBase {
        }
 
        public function getTokenSalt() {
-               return array( $this->getRbTitle()->getPrefixedText(), $this->getRbUser() );
+               $params = $this->extractRequestParams();
+
+               return array(
+                       $this->getRbTitle( $params )->getPrefixedText(),
+                       $this->getRbUser( $params )
+               );
        }
 
-       private function getRbUser() {
+       /**
+        * @param array $params
+        *
+        * @return string
+        */
+       private function getRbUser( array $params ) {
                if ( $this->mUser !== null ) {
                        return $this->mUser;
                }
 
-               $params = $this->extractRequestParams();
-
                // We need to be able to revert IPs, but getCanonicalName rejects them
                $this->mUser = User::isIP( $params['user'] )
                        ? $params['user']
@@ -180,20 +196,29 @@ class ApiRollback extends ApiBase {
        }
 
        /**
+        * @param array $params
+        *
         * @return Title
         */
-       private function getRbTitle() {
+       private function getRbTitle( array $params ) {
                if ( $this->mTitleObj !== null ) {
                        return $this->mTitleObj;
                }
 
-               $params = $this->extractRequestParams();
-
-               $this->mTitleObj = Title::newFromText( $params['title'] );
-
-               if ( !$this->mTitleObj || $this->mTitleObj->isExternal() ) {
-                       $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
+               $this->requireOnlyOneParameter( $params, 'title', 'pageid' );
+
+               if ( isset( $params['title'] ) ) {
+                       $this->mTitleObj = Title::newFromText( $params['title'] );
+                       if ( !$this->mTitleObj || $this->mTitleObj->isExternal() ) {
+                               $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
+                       }
+               } elseif ( isset( $params['pageid'] ) ) {
+                       $this->mTitleObj = Title::newFromID( $params['pageid'] );
+                       if ( !$this->mTitleObj ) {
+                               $this->dieUsageMsg( array( 'nosuchpageid', $params['pageid'] ) );
+                       }
                }
+
                if ( !$this->mTitleObj->exists() ) {
                        $this->dieUsageMsg( 'notanarticle' );
                }
@@ -204,6 +229,7 @@ class ApiRollback extends ApiBase {
        public function getExamples() {
                return array(
                        'api.php?action=rollback&title=Main%20Page&user=Catrope&token=123ABC',
+                       'api.php?action=rollback&pageid=122&user=Catrope&token=123ABC',
                        'api.php?action=rollback&title=Main%20Page&user=217.121.114.116&' .
                                'token=123ABC&summary=Reverting%20vandalism&markbot=1'
                );
index 7a0f0c6..a2771a0 100644 (file)
@@ -160,7 +160,7 @@ class ApiRsd extends ApiBase {
 }
 
 class ApiFormatXmlRsd extends ApiFormatXml {
-       public function __construct( $main, $format ) {
+       public function __construct( ApiMain $main, $format ) {
                parent::__construct( $main, $format );
                $this->setRootElement( 'rsd' );
        }
index 30f8adb..49306d7 100644 (file)
@@ -234,7 +234,7 @@ class ApiUpload extends ApiBase {
                                        array( 'result' => 'Poll',
                                                'stage' => 'queued', 'status' => Status::newGood() )
                                );
-                               $ok = JobQueueGroup::singleton()->push( new AssembleUploadChunksJob(
+                               JobQueueGroup::singleton()->push( new AssembleUploadChunksJob(
                                        Title::makeTitle( NS_FILE, $filekey ),
                                        array(
                                                'filename' => $this->mParams['filename'],
@@ -242,13 +242,7 @@ class ApiUpload extends ApiBase {
                                                'session' => $this->getContext()->exportSession()
                                        )
                                ) );
-                               if ( $ok ) {
-                                       $result['result'] = 'Poll';
-                               } else {
-                                       UploadBase::setSessionStatus( $filekey, false );
-                                       $this->dieUsage(
-                                               "Failed to start AssembleUploadChunks.php", 'stashfailed' );
-                               }
+                               $result['result'] = 'Poll';
                        } else {
                                $status = $this->mUpload->concatenateChunks();
                                if ( !$status->isGood() ) {
@@ -275,7 +269,7 @@ class ApiUpload extends ApiBase {
         * Stash the file and return the file key
         * Also re-raises exceptions with slightly more informative message strings (useful for API)
         * @throws MWException
-        * @return String file key
+        * @return string File key
         */
        private function performStash() {
                try {
@@ -446,7 +440,7 @@ class ApiUpload extends ApiBase {
        /**
         * Checks that the user has permissions to perform this upload.
         * Dies with usage message on inadequate permissions.
-        * @param $user User The user to check.
+        * @param User $user The user to check.
         */
        protected function checkPermissions( $user ) {
                // Check whether the user has the appropriate permissions to upload anyway
@@ -625,7 +619,7 @@ class ApiUpload extends ApiBase {
                                $this->mParams['filekey'],
                                array( 'result' => 'Poll', 'stage' => 'queued', 'status' => Status::newGood() )
                        );
-                       $ok = JobQueueGroup::singleton()->push( new PublishStashedFileJob(
+                       JobQueueGroup::singleton()->push( new PublishStashedFileJob(
                                Title::makeTitle( NS_FILE, $this->mParams['filename'] ),
                                array(
                                        'filename' => $this->mParams['filename'],
@@ -636,13 +630,7 @@ class ApiUpload extends ApiBase {
                                        'session' => $this->getContext()->exportSession()
                                )
                        ) );
-                       if ( $ok ) {
-                               $result['result'] = 'Poll';
-                       } else {
-                               UploadBase::setSessionStatus( $this->mParams['filekey'], false );
-                               $this->dieUsage(
-                                       "Failed to start PublishStashedFile.php", 'publishfailed' );
-                       }
+                       $result['result'] = 'Poll';
                } else {
                        /** @var $status Status */
                        $status = $this->mUpload->performUpload( $this->mParams['comment'],
index d2ec26e..ed62bba 100644 (file)
@@ -97,7 +97,7 @@ class BacklinkCache {
         * Currently, only one cache instance can exist; callers that
         * need multiple backlink cache objects should keep them in scope.
         *
-        * @param Title $title Title object to get a backlink cache for
+        * @param Title $title Title object to get a backlink cache for
         * @return BacklinkCache
         */
        public static function get( Title $title ) {
@@ -135,7 +135,7 @@ class BacklinkCache {
        /**
         * Set the Database object to use
         *
-        * @param $db DatabaseBase
+        * @param DatabaseBase $db
         */
        public function setDB( $db ) {
                $this->db = $db;
@@ -144,7 +144,7 @@ class BacklinkCache {
        /**
         * Get the slave connection to the database
         * When non existing, will initialize the connection.
-        * @return DatabaseBase object
+        * @return DatabaseBase
         */
        protected function getDB() {
                if ( !isset( $this->db ) ) {
@@ -168,11 +168,11 @@ class BacklinkCache {
 
        /**
         * Get the backlinks for a given table. Cached in process memory only.
-        * @param $table String
-        * @param $startId Integer|false
-        * @param $endId Integer|false
-        * @param $max Integer|INF
-        * @param $select string 'all' or 'ids'
+        * @param string $table
+        * @param int|bool $startId
+        * @param int|bool $endId
+        * @param int|INF $max
+        * @param string $select 'all' or 'ids'
         * @return ResultWrapper
         */
        protected function queryLinks( $table, $startId, $endId, $max, $select = 'all' ) {
@@ -238,7 +238,7 @@ class BacklinkCache {
 
        /**
         * Get the field name prefix for a given table
-        * @param $table String
+        * @param string $table
         * @throws MWException
         * @return null|string
         */
@@ -267,7 +267,7 @@ class BacklinkCache {
        /**
         * Get the SQL condition array for selecting backlinks, with a join
         * on the page table.
-        * @param $table String
+        * @param string $table
         * @throws MWException
         * @return array|null
         */
@@ -314,7 +314,7 @@ class BacklinkCache {
 
        /**
         * Check if there are any backlinks
-        * @param $table String
+        * @param string $table
         * @return bool
         */
        public function hasLinks( $table ) {
@@ -323,9 +323,9 @@ class BacklinkCache {
 
        /**
         * Get the approximate number of backlinks
-        * @param $table String
-        * @param $max integer|INF Only count up to this many backlinks
-        * @return integer
+        * @param string $table
+        * @param int|INF $max Only count up to this many backlinks
+        * @return int
         */
        public function getNumLinks( $table, $max = INF ) {
                global $wgMemc, $wgUpdateRowsPerJob;
@@ -372,9 +372,9 @@ class BacklinkCache {
         * Returns an array giving the start and end of each range. The first
         * batch has a start of false, and the last batch has an end of false.
         *
-        * @param string $table the links table name
-        * @param $batchSize Integer
-        * @return Array
+        * @param string $table The links table name
+        * @param int $batchSize
+        * @return array
         */
        public function partition( $table, $batchSize ) {
                global $wgMemc;
@@ -450,9 +450,9 @@ class BacklinkCache {
 
        /**
         * Partition a DB result with backlinks in it into batches
-        * @param $res ResultWrapper database result
-        * @param $batchSize integer
-        * @param $isComplete bool Whether $res includes all the backlinks
+        * @param ResultWrapper $res Database result
+        * @param int $batchSize
+        * @param bool $isComplete Whether $res includes all the backlinks
         * @throws MWException
         * @return array
         */
index 28889b5..7b83990 100644 (file)
@@ -34,7 +34,7 @@ class DependencyWrapper {
 
        /**
         * Create an instance.
-        * @param $value Mixed: the user-supplied value
+        * @param mixed $value The user-supplied value
         * @param CacheDependency|CacheDependency[] $deps A dependency or dependency
         *   array. All dependencies must be objects implementing CacheDependency.
         */
@@ -75,7 +75,7 @@ class DependencyWrapper {
 
        /**
         * Get the user-defined value
-        * @return bool|Mixed
+        * @return bool|mixed
         */
        function getValue() {
                return $this->value;
@@ -84,9 +84,9 @@ class DependencyWrapper {
        /**
         * Store the wrapper to a cache
         *
-        * @param $cache BagOStuff
-        * @param $key
-        * @param $expiry
+        * @param BagOStuff $cache
+        * @param string $key
+        * @param int $expiry
         */
        function storeToCache( $cache, $key, $expiry = 0 ) {
                $this->initialiseDeps();
@@ -98,12 +98,12 @@ class DependencyWrapper {
         * it will be generated with the callback function (if present), and the newly
         * calculated value will be stored to the cache in a wrapper.
         *
-        * @param $cache BagOStuff a cache object such as $wgMemc
-        * @param string $key the cache key
-        * @param $expiry Integer: the expiry timestamp or interval in seconds
-        * @param $callback Mixed: the callback for generating the value, or false
-        * @param array $callbackParams the function parameters for the callback
-        * @param array $deps the dependencies to store on a cache miss. Note: these
+        * @param BagOStuff $cache A cache object such as $wgMemc
+        * @param string $key The cache key
+        * @param int $expiry The expiry timestamp or interval in seconds
+        * @param bool|array $callback The callback for generating the value, or false
+        * @param array $callbackParams The function parameters for the callback
+        * @param array $deps The dependencies to store on a cache miss. Note: these
         *    are not the dependencies used on a cache hit! Cache hits use the stored
         *    dependency array.
         *
@@ -157,7 +157,7 @@ class FileDependency extends CacheDependency {
         * Create a file dependency
         *
         * @param string $filename the name of the file, preferably fully qualified
-        * @param $timestamp Mixed: the unix last modified timestamp, or false if the
+        * @param null|bool|int $timestamp The unix last modified timestamp, or false if the
         *        file does not exist. If omitted, the timestamp will be loaded from
         *        the file.
         *
index 0c00c6b..4bf3611 100644 (file)
@@ -154,7 +154,7 @@ abstract class FileCacheBase {
        /**
         * Save and compress text to the cache
         * @param string $text
-        * @return string compressed text
+        * @return string Compressed text
         */
        public function saveText( $text ) {
                global $wgUseFileCache;
@@ -231,7 +231,7 @@ abstract class FileCacheBase {
 
        /**
         * Roughly increments the cache misses in the last hour by unique visitors
-        * @param $request WebRequest
+        * @param WebRequest $request
         * @return void
         */
        public function incrMissesRecent( WebRequest $request ) {
index 285675d..63e7bfd 100644 (file)
@@ -50,7 +50,7 @@ class GenderCache {
 
        /**
         * Returns the default gender option in this wiki.
-        * @return String
+        * @return string
         */
        protected function getDefault() {
                if ( $this->default === null ) {
@@ -62,9 +62,9 @@ class GenderCache {
 
        /**
         * Returns the gender for given username.
-        * @param string $username or User: username
-        * @param string $caller the calling method
-        * @return String
+        * @param string|User $username Username
+        * @param string $caller The calling method
+        * @return string
         */
        public function getGenderOf( $username, $caller = '' ) {
                global $wgUser;
@@ -97,8 +97,8 @@ class GenderCache {
        /**
         * Wrapper for doQuery that processes raw LinkBatch data.
         *
-        * @param $data
-        * @param $caller
+        * @param array $data
+        * @param string $caller
         */
        public function doLinkBatch( $data, $caller = '' ) {
                $users = array();
@@ -118,8 +118,8 @@ class GenderCache {
         * Wrapper for doQuery that processes a title or string array.
         *
         * @since 1.20
-        * @param $titles List: array of Title objects or strings
-        * @param string $caller the calling method
+        * @param array $titles Array of Title objects or strings
+        * @param string $caller The calling method
         */
        public function doTitlesArray( $titles, $caller = '' ) {
                $users = array();
@@ -139,8 +139,8 @@ class GenderCache {
 
        /**
         * Preloads genders for given list of users.
-        * @param $users List|String: usernames
-        * @param string $caller the calling method
+        * @param array|string $users Usernames
+        * @param string $caller The calling method
         */
        public function doQuery( $users, $caller = '' ) {
                $default = $this->getDefault();
index 3690b70..91580f9 100644 (file)
@@ -31,8 +31,8 @@
 class HTMLFileCache extends FileCacheBase {
        /**
         * Construct an ObjectFileCache from a Title and an action
-        * @param $title Title|string Title object or prefixed DB key string
-        * @param $action string
+        * @param Title|string $title Title object or prefixed DB key string
+        * @param string $action
         * @throws MWException
         * @return HTMLFileCache
         */
@@ -84,7 +84,7 @@ class HTMLFileCache extends FileCacheBase {
 
        /**
         * Check if pages can be cached for this request/user
-        * @param $context IContextSource
+        * @param IContextSource $context
         * @return bool
         */
        public static function useFileCache( IContextSource $context ) {
@@ -125,7 +125,7 @@ class HTMLFileCache extends FileCacheBase {
 
        /**
         * Read from cache to context output
-        * @param $context IContextSource
+        * @param IContextSource $context
         * @return void
         */
        public function loadFromFileCache( IContextSource $context ) {
@@ -155,7 +155,7 @@ class HTMLFileCache extends FileCacheBase {
        /**
         * Save this cache object with the given text.
         * Use this as an ob_start() handler.
-        * @param $text string
+        * @param string $text
         * @return bool Whether $wgUseFileCache is enabled
         */
        public function saveToFileCache( $text ) {
@@ -200,7 +200,7 @@ class HTMLFileCache extends FileCacheBase {
 
        /**
         * Clear the file caches for a page for all actions
-        * @param $title Title
+        * @param Title $title
         * @return bool Whether $wgUseFileCache is enabled
         */
        public static function clearFileCache( Title $title ) {
index 1a20ab4..76cc583 100644 (file)
@@ -49,14 +49,14 @@ class LinkBatch {
         * class. Only used in debugging output.
         * @since 1.17
         *
-        * @param $caller
+        * @param string $caller
         */
        public function setCaller( $caller ) {
                $this->caller = $caller;
        }
 
        /**
-        * @param $title Title
+        * @param Title $title
         */
        public function addObj( $title ) {
                if ( is_object( $title ) ) {
@@ -67,9 +67,8 @@ class LinkBatch {
        }
 
        /**
-        * @param $ns int
-        * @param $dbkey string
-        * @return mixed
+        * @param int $ns
+        * @param string $dbkey
         */
        public function add( $ns, $dbkey ) {
                if ( $ns < 0 ) {
@@ -86,7 +85,7 @@ class LinkBatch {
         * Set the link list to a given 2-d array
         * First key is the namespace, second is the DB key, value arbitrary
         *
-        * @param $array array
+        * @param array $array
         */
        public function setArray( $array ) {
                $this->data = $array;
@@ -113,7 +112,7 @@ class LinkBatch {
        /**
         * Do the query and add the results to the LinkCache object
         *
-        * @return Array mapping PDBK to ID
+        * @return array Mapping PDBK to ID
         */
        public function execute() {
                $linkCache = LinkCache::singleton();
@@ -125,8 +124,8 @@ class LinkBatch {
         * Do the query and add the results to a given LinkCache object
         * Return an array mapping PDBK to ID
         *
-        * @param $cache LinkCache
-        * @return Array remaining IDs
+        * @param LinkCache $cache
+        * @return array Remaining IDs
         */
        protected function executeInto( &$cache ) {
                wfProfileIn( __METHOD__ );
@@ -144,9 +143,9 @@ class LinkBatch {
         * This function *also* stores extra fields of the title used for link
         * parsing to avoid extra DB queries.
         *
-        * @param $cache LinkCache
-        * @param $res
-        * @return Array of remaining titles
+        * @param LinkCache $cache
+        * @param ResultWrapper $res
+        * @return array Array of remaining titles
         */
        public function addResultToCache( $cache, $res ) {
                if ( !$res ) {
@@ -178,7 +177,7 @@ class LinkBatch {
 
        /**
         * Perform the existence test query, return a ResultWrapper with page_id fields
-        * @return Bool|ResultWrapper
+        * @return bool|ResultWrapper
         */
        public function doQuery() {
                if ( $this->isEmpty() ) {
@@ -207,7 +206,7 @@ class LinkBatch {
        /**
         * Do (and cache) {{GENDER:...}} information for userpages in this LinkBatch
         *
-        * @return bool whether the query was successful
+        * @return bool Whether the query was successful
         */
        public function doGenderQuery() {
                if ( $this->isEmpty() ) {
@@ -228,9 +227,9 @@ class LinkBatch {
        /**
         * Construct a WHERE clause which will match all the given titles.
         *
-        * @param string $prefix the appropriate table's field name prefix ('page', 'pl', etc)
-        * @param $db DatabaseBase object to use
-        * @return mixed string with SQL where clause fragment, or false if no items.
+        * @param string $prefix The appropriate table's field name prefix ('page', 'pl', etc)
+        * @param DatabaseBase $db DatabaseBase object to use
+        * @return string|bool String with SQL where clause fragment, or false if no items.
         */
        public function constructSet( $prefix, $db ) {
                return $db->makeWhereFrom2d( $this->data, "{$prefix}_namespace", "{$prefix}_title" );
index de2a728..e80dfb3 100644 (file)
@@ -78,7 +78,7 @@ class LinkCache {
        /**
         * General accessor to get/set whether SELECT FOR UPDATE should be used
         *
-        * @param $update
+        * @param bool $update
         * @return bool
         */
        public function forUpdate( $update = null ) {
@@ -86,8 +86,8 @@ class LinkCache {
        }
 
        /**
-        * @param $title
-        * @return array|int
+        * @param string $title
+        * @return int
         */
        public function getGoodLinkID( $title ) {
                if ( array_key_exists( $title, $this->mGoodLinks ) ) {
@@ -100,9 +100,9 @@ class LinkCache {
        /**
         * Get a field of a title object from cache.
         * If this link is not good, it will return NULL.
-        * @param $title Title
+        * @param Title $title
         * @param string $field ('length','redirect','revision','model')
-        * @return mixed
+        * @return string|null
         */
        public function getGoodLinkFieldObj( $title, $field ) {
                $dbkey = $title->getPrefixedDBkey();
@@ -114,7 +114,7 @@ class LinkCache {
        }
 
        /**
-        * @param $title
+        * @param string $title
         * @return bool
         */
        public function isBadLink( $title ) {
@@ -147,8 +147,8 @@ class LinkCache {
        /**
         * Same as above with better interface.
         * @since 1.19
-        * @param $title Title
-        * @param $row object which has the fields page_id, page_is_redirect,
+        * @param Title $title
+        * @param stdClass $row Object which has the fields page_id, page_is_redirect,
         *  page_latest and page_content_model
         */
        public function addGoodLinkObjFromRow( $title, $row ) {
@@ -163,7 +163,7 @@ class LinkCache {
        }
 
        /**
-        * @param $title Title
+        * @param Title $title
         */
        public function addBadLinkObj( $title ) {
                $dbkey = $title->getPrefixedDBkey();
@@ -177,7 +177,7 @@ class LinkCache {
        }
 
        /**
-        * @param $title Title
+        * @param Title $title
         */
        public function clearLink( $title ) {
                $dbkey = $title->getPrefixedDBkey();
@@ -197,8 +197,8 @@ class LinkCache {
        /**
         * Add a title to the link cache, return the page_id or zero if non-existent
         *
-        * @param string $title title to add
-        * @return Integer
+        * @param string $title Title to add
+        * @return int
         */
        public function addLink( $title ) {
                $nt = Title::newFromDBkey( $title );
@@ -212,8 +212,8 @@ class LinkCache {
        /**
         * Add a title to the link cache, return the page_id or zero if non-existent
         *
-        * @param $nt Title object to add
-        * @return Integer
+        * @param Title $nt Title object to add
+        * @return int
         */
        public function addLinkObj( $nt ) {
                global $wgAntiLockFlags, $wgContentHandlerUseDB;
index 9cee321..1153fd2 100644 (file)
@@ -181,7 +181,7 @@ class LocalisationCache {
         * For constructor parameters, see the documentation in DefaultSettings.php
         * for $wgLocalisationCacheConf.
         *
-        * @param $conf Array
+        * @param array $conf
         * @throws MWException
         */
        function __construct( $conf ) {
@@ -228,7 +228,7 @@ class LocalisationCache {
        /**
         * Returns true if the given key is mergeable, that is, if it is an associative
         * array which can be merged through a fallback sequence.
-        * @param $key
+        * @param string $key
         * @return bool
         */
        public function isMergeableKey( $key ) {
@@ -250,8 +250,8 @@ class LocalisationCache {
         *
         * Warning: this may be slow for split items (messages), since it will
         * need to fetch all of the subitems from the cache individually.
-        * @param $code
-        * @param $key
+        * @param string $code
+        * @param string $key
         * @return mixed
         */
        public function getItem( $code, $key ) {
@@ -270,10 +270,10 @@ class LocalisationCache {
 
        /**
         * Get a subitem, for instance a single message for a given language.
-        * @param $code
-        * @param $key
-        * @param $subkey
-        * @return null
+        * @param string $code
+        * @param string $key
+        * @param string $subkey
+        * @return mixed|null
         */
        public function getSubitem( $code, $key, $subkey ) {
                if ( !isset( $this->loadedSubitems[$code][$key][$subkey] ) &&
@@ -299,8 +299,8 @@ class LocalisationCache {
         *
         * Will return null if the item is not found, or false if the item is not an
         * array.
-        * @param $code
-        * @param $key
+        * @param string $code
+        * @param string $key
         * @return bool|null|string
         */
        public function getSubitemList( $code, $key ) {
@@ -318,8 +318,8 @@ class LocalisationCache {
 
        /**
         * Load an item into the cache.
-        * @param $code
-        * @param $key
+        * @param string $code
+        * @param string $key
         */
        protected function loadItem( $code, $key ) {
                if ( !isset( $this->initialisedLangs[$code] ) ) {
@@ -354,9 +354,9 @@ class LocalisationCache {
 
        /**
         * Load a subitem into the cache
-        * @param $code
-        * @param $key
-        * @param $subkey
+        * @param string $code
+        * @param string $key
+        * @param string $subkey
         */
        protected function loadSubitem( $code, $key, $subkey ) {
                if ( !in_array( $key, self::$splitKeys ) ) {
@@ -429,7 +429,7 @@ class LocalisationCache {
 
        /**
         * Initialise a language in this object. Rebuild the cache if necessary.
-        * @param $code
+        * @param string $code
         * @throws MWException
         */
        protected function initLanguage( $code ) {
@@ -490,8 +490,8 @@ class LocalisationCache {
        /**
         * Create a fallback from one language to another, without creating a
         * complete persistent cache.
-        * @param $primaryCode
-        * @param $fallbackCode
+        * @param string $primaryCode
+        * @param string $fallbackCode
         */
        public function initShallowFallback( $primaryCode, $fallbackCode ) {
                $this->data[$primaryCode] =& $this->data[$fallbackCode];
@@ -502,8 +502,8 @@ class LocalisationCache {
 
        /**
         * Read a PHP file containing localisation data.
-        * @param $_fileName
-        * @param $_fileType
+        * @param string $_fileName
+        * @param string $_fileType
         * @throws MWException
         * @return array
         */
@@ -537,7 +537,7 @@ class LocalisationCache {
         * Read a JSON file containing localisation messages.
         * @param string $fileName Name of file to read
         * @throws MWException if there is a syntax error in the JSON file
-        * @return array with a 'messages' key, or empty array if the file doesn't exist
+        * @return array Array with a 'messages' key, or empty array if the file doesn't exist
         */
        public function readJSONFile( $fileName ) {
                wfProfileIn( __METHOD__ );
@@ -578,6 +578,8 @@ class LocalisationCache {
        /**
         * Get the compiled plural rules for a given language from the XML files.
         * @since 1.20
+        * @param string $code
+        * @return array|null
         */
        public function getCompiledPluralRules( $code ) {
                $rules = $this->getPluralRules( $code );
@@ -599,6 +601,8 @@ class LocalisationCache {
         * Get the plural rules for a given language from the XML files.
         * Cached.
         * @since 1.20
+        * @param string $code
+        * @return array|null
         */
        public function getPluralRules( $code ) {
                if ( $this->pluralRules === null ) {
@@ -615,6 +619,8 @@ class LocalisationCache {
         * Get the plural rule types for a given language from the XML files.
         * Cached.
         * @since 1.22
+        * @param string $code
+        * @return array|null
         */
        public function getPluralRuleTypes( $code ) {
                if ( $this->pluralRuleTypes === null ) {
@@ -645,6 +651,8 @@ class LocalisationCache {
        /**
         * Load a plural XML file with the given filename, compile the relevant
         * rules, and save the compiled rules in a process-local cache.
+        *
+        * @param string $fileName
         */
        protected function loadPluralFile( $fileName ) {
                $doc = new DOMDocument;
@@ -675,12 +683,14 @@ class LocalisationCache {
         * Read the data from the source files for a given language, and register
         * the relevant dependencies in the $deps array. If the localisation
         * exists, the data array is returned, otherwise false is returned.
+        *
+        * @param string $code
+        * @param array $deps
         */
        protected function readSourceFilesAndRegisterDeps( $code, &$deps ) {
                global $IP;
                wfProfileIn( __METHOD__ );
 
-
                // This reads in the PHP i18n file with non-messages l10n data
                $fileName = Language::getMessagesFileName( $code );
                if ( !file_exists( $fileName ) ) {
@@ -708,9 +718,9 @@ class LocalisationCache {
        /**
         * Merge two localisation values, a primary and a fallback, overwriting the
         * primary value in place.
-        * @param $key
-        * @param $value
-        * @param $fallbackValue
+        * @param string $key
+        * @param mixed $value
+        * @param mixed $fallbackValue
         */
        protected function mergeItem( $key, &$value, $fallbackValue ) {
                if ( !is_null( $value ) ) {
@@ -739,8 +749,8 @@ class LocalisationCache {
        }
 
        /**
-        * @param $value
-        * @param $fallbackValue
+        * @param mixed $value
+        * @param mixed $fallbackValue
         */
        protected function mergeMagicWords( &$value, $fallbackValue ) {
                foreach ( $fallbackValue as $magicName => $fallbackInfo ) {
@@ -763,10 +773,10 @@ class LocalisationCache {
         *
         * Returns true if any data from the extension array was used, false
         * otherwise.
-        * @param $codeSequence
-        * @param $key
-        * @param $value
-        * @param $fallbackValue
+        * @param string $codeSequence
+        * @param string $key
+        * @param mixed $value
+        * @param mixed $fallbackValue
         * @return bool
         */
        protected function mergeExtensionItem( $codeSequence, $key, &$value, $fallbackValue ) {
@@ -784,7 +794,7 @@ class LocalisationCache {
        /**
         * Load localisation data for a given language for both core and extensions
         * and save it to the persistent cache store and the process cache
-        * @param $code
+        * @param string $code
         * @throws MWException
         */
        public function recache( $code ) {
@@ -984,7 +994,7 @@ class LocalisationCache {
         *
         * The preload item will be loaded automatically, improving performance
         * for the commonly-requested items it contains.
-        * @param $data
+        * @param array $data
         * @return array
         */
        protected function buildPreload( $data ) {
@@ -1008,7 +1018,7 @@ class LocalisationCache {
        /**
         * Unload the data for a given language from the object cache.
         * Reduces memory usage.
-        * @param $code
+        * @param string $code
         */
        public function unload( $code ) {
                unset( $this->data[$code] );
@@ -1161,7 +1171,7 @@ class LCStoreDB implements LCStore {
                $row = $db->selectRow( 'l10n_cache', array( 'lc_value' ),
                        array( 'lc_lang' => $code, 'lc_key' => $key ), __METHOD__ );
                if ( $row ) {
-                       return unserialize( $row->lc_value );
+                       return unserialize( $db->decodeBlob( $row->lc_value ) );
                } else {
                        return null;
                }
@@ -1223,7 +1233,7 @@ class LCStoreDB implements LCStore {
                $this->batch[] = array(
                        'lc_lang' => $this->currentLang,
                        'lc_key' => $key,
-                       'lc_value' => serialize( $value ) );
+                       'lc_value' => $this->dbw->encodeBlob( serialize( $value ) ) );
 
                if ( count( $this->batch ) >= 100 ) {
                        $this->dbw->insert( 'l10n_cache', $this->batch, __METHOD__ );
@@ -1394,8 +1404,8 @@ class LocalisationCacheBulkLoad extends LocalisationCache {
        private $maxLoadedLangs = 10;
 
        /**
-        * @param $fileName
-        * @param $fileType
+        * @param string $fileName
+        * @param string $fileType
         * @return array|mixed
         */
        protected function readPHPFile( $fileName, $fileType ) {
@@ -1420,8 +1430,8 @@ class LocalisationCacheBulkLoad extends LocalisationCache {
        }
 
        /**
-        * @param $code
-        * @param $key
+        * @param string $code
+        * @param string $key
         * @return mixed
         */
        public function getItem( $code, $key ) {
@@ -1432,10 +1442,10 @@ class LocalisationCacheBulkLoad extends LocalisationCache {
        }
 
        /**
-        * @param $code
-        * @param $key
-        * @param $subkey
-        * @return
+        * @param string $code
+        * @param string $key
+        * @param string $subkey
+        * @return mixed
         */
        public function getSubitem( $code, $key, $subkey ) {
                unset( $this->mruLangs[$code] );
@@ -1445,7 +1455,7 @@ class LocalisationCacheBulkLoad extends LocalisationCache {
        }
 
        /**
-        * @param $code
+        * @param string $code
         */
        public function recache( $code ) {
                parent::recache( $code );
@@ -1455,7 +1465,7 @@ class LocalisationCacheBulkLoad extends LocalisationCache {
        }
 
        /**
-        * @param $code
+        * @param string $code
         */
        public function unload( $code ) {
                unset( $this->mruLangs[$code] );
index 8349f88..a22d802 100644 (file)
  * @since 1.23
  */
 class MapCacheLRU {
-       /** @var Array */
+       /** @var array */
        protected $cache = array(); // (key => value)
 
        protected $maxCacheKeys; // integer; max entries
 
        /**
-        * @param $maxKeys integer Maximum number of entries allowed (min 1).
+        * @param int $maxKeys Maximum number of entries allowed (min 1).
         * @throws MWException When $maxCacheKeys is not an int or =< 0.
         */
        public function __construct( $maxKeys ) {
@@ -52,8 +52,8 @@ class MapCacheLRU {
         * This will prune the cache if it gets too large based on LRU.
         * If the item is already set, it will be pushed to the top of the cache.
         *
-        * @param $key string
-        * @param $value mixed
+        * @param string $key
+        * @param mixed $value
         * @return void
         */
        public function set( $key, $value ) {
@@ -70,7 +70,7 @@ class MapCacheLRU {
        /**
         * Check if a key exists
         *
-        * @param $key string
+        * @param string $key
         * @return bool
         */
        public function has( $key ) {
@@ -82,7 +82,7 @@ class MapCacheLRU {
         * This returns null if the key is not set.
         * If the item is already set, it will be pushed to the top of the cache.
         *
-        * @param $key string
+        * @param string $key
         * @return mixed
         */
        public function get( $key ) {
@@ -97,7 +97,7 @@ class MapCacheLRU {
        /**
         * Clear one or several cache entries, or all cache entries
         *
-        * @param $keys string|Array
+        * @param string|array $keys
         * @return void
         */
        public function clear( $keys = null ) {
@@ -113,7 +113,7 @@ class MapCacheLRU {
        /**
         * Push an entry to the top of the cache
         *
-        * @param $key string
+        * @param string $key
         */
        protected function ping( $key ) {
                $item = $this->cache[$key];
index daaa915..a3cf87e 100644 (file)
@@ -155,8 +155,8 @@ class MessageCache {
        /**
         * Try to load the cache from a local file.
         *
-        * @param string $hash the hash of contents, to check validity.
-        * @param Mixed $code Optional language code, see documenation of load().
+        * @param string $hash The hash of contents, to check validity.
+        * @param string $code Optional language code, see documenation of load().
         * @return array The cache array
         */
        function getLocalCache( $hash, $code ) {
@@ -192,6 +192,9 @@ class MessageCache {
 
        /**
         * Save the cache to a local file.
+        * @param string $serialized
+        * @param string $hash
+        * @param string $code
         */
        function saveToLocal( $serialized, $hash, $code ) {
                global $wgCacheDirectory;
@@ -232,7 +235,7 @@ class MessageCache {
         * or false if populating empty cache fails. Also returns true if MessageCache
         * is disabled.
         *
-        * @param bool|String $code Language to which load messages
+        * @param bool|string $code Language to which load messages
         * @throws MWException
         * @return bool
         */
@@ -580,7 +583,7 @@ class MessageCache {
        /**
         * Is the given cache array expired due to time passing or a version change?
         *
-        * @param $cache
+        * @param array $cache
         * @return bool
         */
        protected function isCacheExpired( $cache ) {
@@ -638,7 +641,7 @@ class MessageCache {
         * a timeout of MessageCache::MSG_LOCK_TIMEOUT.
         *
         * @param string $key
-        * @return Boolean: success
+        * @return bool Success
         */
        function lock( $key ) {
                $lockKey = $key . ':lock';
@@ -687,17 +690,16 @@ class MessageCache {
         *  * Fallbacks will be just that: fallbacks. A fallback language will never be reached if
         *    the message is available *anywhere* in the language for which it is a fallback.
         *
-        * @param string $key the message key
+        * @param string $key The message key
         * @param bool $useDB If true, look for the message in the DB, false
-        *                    to use only the compiled l10n cache.
+        *   to use only the compiled l10n cache.
         * @param bool|string|object $langcode Code of the language to get the message for.
-        *        - If string and a valid code, will create a standard language object
-        *        - If string but not a valid code, will create a basic language object
-        *        - If boolean and false, create object from the current users language
-        *        - If boolean and true, create object from the wikis content language
-        *        - If language object, use it as given
-        * @param bool $isFullKey specifies whether $key is a two part key
-        *                   "msg/lang".
+        *   - If string and a valid code, will create a standard language object
+        *   - If string but not a valid code, will create a basic language object
+        *   - If boolean and false, create object from the current users language
+        *   - If boolean and true, create object from the wikis content language
+        *   - If language object, use it as given
+        * @param bool $isFullKey specifies whether $key is a two part key "msg/lang".
         *
         * @throws MWException when given an invalid key
         * @return string|bool False if the message doesn't exist, otherwise the
@@ -1098,7 +1100,7 @@ class MessageCache {
        }
 
        /**
-        * @param $key
+        * @param string $key
         * @return array
         */
        public function figureMessage( $key ) {
@@ -1124,7 +1126,7 @@ class MessageCache {
         * for which MediaWiki:msgkey exists. If $code is another language code, this
         * will ONLY return message keys for which MediaWiki:msgkey/$code exists.
         * @param string $code Language code
-        * @return array of message keys (strings)
+        * @return array Array of message keys (strings)
         */
        public function getAllMessageKeys( $code ) {
                global $wgContLang;
index ed1e49a..c7ef044 100644 (file)
@@ -29,8 +29,8 @@
 class ObjectFileCache extends FileCacheBase {
        /**
         * Construct an ObjectFileCache from a key and a type
-        * @param $key string
-        * @param $type string
+        * @param string $key
+        * @param string $type
         * @return ObjectFileCache
         */
        public static function newFromKey( $key, $type ) {
index 3ace396..55da52c 100644 (file)
@@ -34,7 +34,7 @@ class ResourceFileCache extends FileCacheBase {
 
        /**
         * Construct an ResourceFileCache from a context
-        * @param $context ResourceLoaderContext
+        * @param ResourceLoaderContext $context
         * @return ResourceFileCache
         */
        public static function newFromContext( ResourceLoaderContext $context ) {
@@ -58,7 +58,7 @@ class ResourceFileCache extends FileCacheBase {
        /**
         * Check if an RL request can be cached.
         * Caller is responsible for checking if any modules are private.
-        * @param $context ResourceLoaderContext
+        * @param ResourceLoaderContext $context
         * @return bool
         */
        public static function useFileCache( ResourceLoaderContext $context ) {
index cea3bf2..7f36f5a 100644 (file)
@@ -46,9 +46,9 @@ class UserCache {
        /**
         * Get a property of a user based on their user ID
         *
-        * @param $userId integer User ID
+        * @param int $userId User ID
         * @param string $prop User property
-        * @return mixed The property or false if the user does not exist
+        * @return mixed|bool The property or false if the user does not exist
         */
        public function getProp( $userId, $prop ) {
                if ( !isset( $this->cache[$userId][$prop] ) ) {
@@ -64,7 +64,7 @@ class UserCache {
        /**
         * Get the name of a user or return $ip if the user ID is 0
         *
-        * @param integer $userId
+        * @param int $userId
         * @param string $ip
         * @return string
         * @since 1.22
@@ -77,7 +77,7 @@ class UserCache {
         * Preloads user names for given list of users.
         * @param array $userIds List of user IDs
         * @param array $options Option flags; include 'userpage' and 'usertalk'
-        * @param string $caller the calling method
+        * @param string $caller The calling method
         */
        public function doQuery( array $userIds, $options = array(), $caller = '' ) {
                wfProfileIn( __METHOD__ );
@@ -140,7 +140,7 @@ class UserCache {
        /**
         * Check if a cache type is in $options and was not loaded for this user
         *
-        * @param $uid integer user ID
+        * @param int $uid User ID
         * @param string $type Cache type
         * @param array $options Requested cache types
         * @return bool
index 69e1e9e..246f95d 100644 (file)
@@ -344,6 +344,9 @@ class ChangesList extends ContextSource {
         */
        public function insertArticleLink( &$s, &$rc, $unpatrolled, $watched ) {
                $params = array();
+               if ( $rc->getTitle()->isRedirect() ) {
+                       $params = array( 'redirect' => 'no' );
+               }
 
                $articlelink = Linker::linkKnown(
                        $rc->getTitle(),
index 6c42601..7307c69 100644 (file)
@@ -90,7 +90,6 @@ class EnhancedChangesList extends ChangesList {
        public function recentChangesLine( &$baseRC, $watched = false ) {
                wfProfileIn( __METHOD__ );
 
-               # If it's a new day, add the headline and flush the cache
                $date = $this->getLanguage()->userDate(
                        $baseRC->mAttribs['rc_timestamp'],
                        $this->getUser()
@@ -98,6 +97,7 @@ class EnhancedChangesList extends ChangesList {
 
                $ret = '';
 
+               # If it's a new day, add the headline and flush the cache
                if ( $date != $this->lastdate ) {
                        # Process current cache
                        $ret = $this->recentChangesBlock();
@@ -121,28 +121,41 @@ class EnhancedChangesList extends ChangesList {
         * @param RCCacheEntry $cacheEntry
         */
        protected function addCacheEntry( RCCacheEntry $cacheEntry ) {
+               $cacheGroupingKey = $this->makeCacheGroupingKey( $cacheEntry );
+
+               if ( !isset( $this->rc_cache[$cacheGroupingKey] ) ) {
+                       $this->rc_cache[$cacheGroupingKey] = array();
+               }
+
+               array_push( $this->rc_cache[$cacheGroupingKey], $cacheEntry );
+       }
+
+       /**
+        * @todo use rc_source to group, if set; fallback to rc_type
+        *
+        * @param RCCacheEntry $cacheEntry
+        *
+        * @return string
+        */
+       protected function makeCacheGroupingKey( RCCacheEntry $cacheEntry ) {
                $title = $cacheEntry->getTitle();
-               $secureName = $title->getPrefixedDBkey();
+               $cacheGroupingKey = $title->getPrefixedDBkey();
 
                $type = $cacheEntry->mAttribs['rc_type'];
 
+               // @todo remove handling for RC_MOVE and RC_MOVE_OVER_REDIRECT (bug 63755)
                if ( $type == RC_MOVE || $type == RC_MOVE_OVER_REDIRECT ) {
-                       # Use an @ character to prevent collision with page names
-                       $this->rc_cache['@@' . ( $this->rcMoveIndex++ )] = array( $cacheEntry );
-               } else {
-                       # Logs are grouped by type
-                       if ( $type == RC_LOG ) {
-                               $secureName = SpecialPage::getTitleFor(
-                                       'Log',
-                                       $cacheEntry->mAttribs['rc_log_type']
-                               )->getPrefixedDBkey();
-                       }
-                       if ( !isset( $this->rc_cache[$secureName] ) ) {
-                               $this->rc_cache[$secureName] = array();
-                       }
-
-                       array_push( $this->rc_cache[$secureName], $cacheEntry );
+                       // Use an # character to prevent collision with page names
+                       $cacheGroupingKey = '##' . ( $this->rcMoveIndex++ );
+               } elseif ( $type == RC_LOG ) {
+                       // Group by log type
+                       $cacheGroupingKey = SpecialPage::getTitleFor(
+                               'Log',
+                               $cacheEntry->mAttribs['rc_log_type']
+                       )->getPrefixedDBkey();
                }
+
+               return $cacheGroupingKey;
        }
 
        /**
index bbf4ab6..370e109 100644 (file)
@@ -102,6 +102,70 @@ class RecentChange {
                return $rc;
        }
 
+       /**
+        * Parsing text to RC_* constants
+        * @since 1.24
+        * @param string|array $type
+        * @throws MWException
+        * @return int|array RC_TYPE
+        */
+       public static function parseToRCType( $type ) {
+               if ( is_array( $type ) ) {
+                       $retval = array();
+                       foreach ( $type as $t ) {
+                               $retval[] = RecentChange::parseToRCType( $t );
+                       }
+
+                       return $retval;
+               }
+
+               switch ( $type ) {
+                       case 'edit':
+                               return RC_EDIT;
+                       case 'new':
+                               return RC_NEW;
+                       case 'log':
+                               return RC_LOG;
+                       case 'external':
+                               return RC_EXTERNAL;
+                       default:
+                               throw new MWException( "Unknown type '$type'" );
+               }
+       }
+
+       /**
+        * Parsing RC_* constants to human-readable test
+        * @since 1.24
+        * @param int $rc_type
+        * @return string $type
+        */
+       public static function parseFromRCType( $rcType ) {
+               switch ( $rcType ) {
+                       case RC_EDIT:
+                               $type = 'edit';
+                               break;
+                       case RC_NEW:
+                               $type = 'new';
+                               break;
+                       case RC_MOVE:
+                               $type = 'move';
+                               break;
+                       case RC_LOG:
+                               $type = 'log';
+                               break;
+                       case RC_EXTERNAL:
+                               $type = 'external';
+                               break;
+                       case RC_MOVE_OVER_REDIRECT:
+                               $type = 'move over redirect';
+                               break;
+                       default:
+                               $type = "$rcType";
+               }
+
+               return $type;
+       }
+
        /**
         * No uses left in Gerrit on 2013-11-19.
         * @deprecated since 1.22
@@ -279,7 +343,7 @@ class RecentChange {
                        $editor = $this->getPerformer();
                        $title = $this->getTitle();
 
-                       if ( wfRunHooks( 'AbortEmailNotification', array( $editor, $title ) ) ) {
+                       if ( wfRunHooks( 'AbortEmailNotification', array( $editor, $title, $this ) ) ) {
                                # @todo FIXME: This would be better as an extension hook
                                $enotif = new EmailNotification();
                                $enotif->notifyOnPageChange( $editor, $title,
@@ -326,13 +390,17 @@ class RecentChange {
 
        /**
         * Notify all the feeds about the change.
+        * @param array $feeds Optional feeds to send to, defaults to $wgRCFeeds
         */
-       public function notifyRCFeeds() {
+       public function notifyRCFeeds( array $feeds = null ) {
                global $wgRCFeeds;
+               if ( $feeds === null ) {
+                       $feeds = $wgRCFeeds;
+               }
 
                $performer = $this->getPerformer();
 
-               foreach ( $wgRCFeeds as $feed ) {
+               foreach ( $feeds as $feed ) {
                        $feed += array(
                                'omit_bots' => false,
                                'omit_anon' => false,
@@ -361,7 +429,7 @@ class RecentChange {
                        }
 
                        /** @var $formatter RCFeedFormatter */
-                       $formatter = new $feed['formatter']();
+                       $formatter = is_object( $feed['formatter'] ) ? $feed['formatter'] : new $feed['formatter']();
                        $line = $formatter->getLine( $feed, $this, $actionComment );
 
                        $engine->send( $feed, $line );
index 15f0a47..36d2731 100644 (file)
@@ -44,6 +44,8 @@ class RedisConnectionPool {
         */
        /** @var string Connection timeout in seconds */
        protected $connectTimeout;
+       /** @var string Read timeout in seconds */
+       protected $readTimeout;
        /** @var string Plaintext auth password */
        protected $password;
        /** @var bool Whether connections persist */
@@ -76,6 +78,7 @@ class RedisConnectionPool {
                                'See https://www.mediawiki.org/wiki/Redis#Setup' );
                }
                $this->connectTimeout = $options['connectTimeout'];
+               $this->readTimeout = $options['readTimeout'];
                $this->persistent = $options['persistent'];
                $this->password = $options['password'];
                if ( !isset( $options['serializer'] ) || $options['serializer'] === 'php' ) {
@@ -97,6 +100,9 @@ class RedisConnectionPool {
                if ( !isset( $options['connectTimeout'] ) ) {
                        $options['connectTimeout'] = 1;
                }
+               if ( !isset( $options['readTimeout'] ) ) {
+                       $options['readTimeout'] = 31; // handles up to 30 second blocking commands
+               }
                if ( !isset( $options['persistent'] ) ) {
                        $options['persistent'] = false;
                }
@@ -112,6 +118,9 @@ class RedisConnectionPool {
         * $options include:
         *   - connectTimeout : The timeout for new connections, in seconds.
         *                      Optional, default is 1 second.
+        *   - readTimeout    : The timeout for operation reads, in seconds.
+        *                      Commands like BLPOP can fail if told to wait longer than this.
+        *                      Optional, default is 60 seconds.
         *   - persistent     : Set this to true to allow connections to persist across
         *                      multiple web requests. False by default.
         *   - password       : The authentication password, will be sent to Redis in clear text.
@@ -216,6 +225,7 @@ class RedisConnectionPool {
                }
 
                if ( $conn ) {
+                       $conn->setOption( Redis::OPT_READ_TIMEOUT, $this->readTimeout );
                        $conn->setOption( Redis::OPT_SERIALIZER, $this->serializer );
                        $this->connections[$server][] = array( 'conn' => $conn, 'free' => false );
 
index ae8baf2..64c69ef 100644 (file)
@@ -16,7 +16,9 @@ class ComposerPackageModifier {
        protected $versionNormalizer;
        protected $versionFetcher;
 
-       public function __construct( Package $package, ComposerVersionNormalizer $versionNormalizer, MediaWikiVersionFetcher $versionFetcher ) {
+       public function __construct( Package $package,
+               ComposerVersionNormalizer $versionNormalizer, MediaWikiVersionFetcher $versionFetcher
+       ) {
                $this->package = $package;
                $this->versionNormalizer = $versionNormalizer;
                $this->versionFetcher = $versionFetcher;
@@ -48,7 +50,10 @@ class ComposerPackageModifier {
                $mvVersion = $this->versionFetcher->fetchVersion();
                $mvVersion = $this->versionNormalizer->normalizeSuffix( $mvVersion );
 
-               $version = new VersionConstraint( '==', $this->versionNormalizer->normalizeLevelCount( $mvVersion ) );
+               $version = new VersionConstraint(
+                       '==',
+                       $this->versionNormalizer->normalizeLevelCount( $mvVersion )
+               );
                $version->setPrettyString( $mvVersion );
 
                return $version;
index 04afdda..68e90b4 100644 (file)
  */
 
 /**
- * Abstract class for get settings for
+ * Interface for configuration instances
  *
  * @since 1.23
  */
-abstract class Config {
-       /**
-        * @param string $name configuration variable name without prefix
-        * @param string $prefix of the variable name
-        * @return mixed
-        */
-       abstract public function get( $name, $prefix = 'wg' );
+interface Config {
 
        /**
-        * @param string $name configuration variable name without prefix
-        * @param mixed $value to set
-        * @param string $prefix of the variable name
-        * @return Status object indicating success or failure
+        * Get a configuration variable such as "Sitename" or "UploadMaintenance."
+        *
+        * @param string $name Name of configuration option
+        * @return mixed Value configured
+        * @throws ConfigException
         */
-       abstract public function set( $name, $value, $prefix = 'wg' );
+       public function get( $name );
 
        /**
-        * @param string|null $type class name for Config object,
-        *        uses $wgConfigClass if not provided
-        * @return Config
+        * 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 static function factory( $type = null ) {
-               if ( !$type ) {
-                       global $wgConfigClass;
-                       $type = $wgConfigClass;
-               }
-
-               return new $type;
-       }
+       public function set( $name, $value );
 }
diff --git a/includes/config/ConfigException.php b/includes/config/ConfigException.php
new file mode 100644 (file)
index 0000000..368ca5a
--- /dev/null
@@ -0,0 +1,28 @@
+<?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
+ */
+
+/**
+ * Exceptions for config failures
+ *
+ * @since 1.23
+ */
+class ConfigException extends MWException {}
diff --git a/includes/config/ConfigFactory.php b/includes/config/ConfigFactory.php
new file mode 100644 (file)
index 0000000..b09316b
--- /dev/null
@@ -0,0 +1,94 @@
+<?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
+ */
+
+/**
+ * Factory class to create Config objects
+ *
+ * @since 1.23
+ */
+class ConfigFactory {
+
+       /**
+        * Map of config name => callback
+        * @var array
+        */
+       protected $factoryFunctions = array();
+
+       /**
+        * Config objects that have already been created
+        * name => Config object
+        * @var array
+        */
+       protected $configs = array();
+
+       public static function getDefaultInstance() {
+               static $self = null;
+               if ( !$self ) {
+                       $self = new self;
+                       global $wgConfigRegistry;
+                       foreach ( $wgConfigRegistry as $name => $callback ) {
+                               $self->register( $name, $callback );
+                       }
+               }
+               return $self;
+       }
+
+       /**
+        * Register a new config factory function
+        * Will override if it's already registered
+        * @param string $name
+        * @param callable $callback that takes this ConfigFactory as an argument
+        * @throws InvalidArgumentException if an invalid callback is provided
+        */
+       public function register( $name, $callback ) {
+               if ( !is_callable( $callback ) ) {
+                       throw new InvalidArgumentException( 'Invalid callback provided' );
+               }
+               $this->factoryFunctions[$name] = $callback;
+       }
+
+       /**
+        * Create a given Config using the registered callback for $name.
+        * If an object was already created, the same Config object is returned.
+        * @param string $name of the extension/component you want a Config object for
+        *                     'main' is used for core
+        * @throws ConfigException if a factory function isn't registered for $name
+        * @throws UnexpectedValueException if the factory function returns a non-Config object
+        * @return Config
+        */
+       public function makeConfig( $name ) {
+               if ( !isset( $this->configs[$name] ) ) {
+                       if ( !isset( $this->factoryFunctions[$name] ) ) {
+                               throw new ConfigException( "No registered builder available for $name." );
+                       }
+                       $conf = call_user_func( $this->factoryFunctions[$name], $this );
+                       if ( $conf instanceof Config ) {
+                               $this->configs[$name] = $conf;
+                       } else {
+                               throw new UnexpectedValueException( "The builder for $name returned a non-Config object." );
+                       }
+               }
+
+               return $this->configs[$name];
+       }
+}
diff --git a/includes/config/GlobalConfig.php b/includes/config/GlobalConfig.php
deleted file mode 100644 (file)
index e16a9ee..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-<?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
- */
-
-/**
- * Accesses configuration settings from $GLOBALS
- *
- * @since 1.23
- */
-class GlobalConfig extends Config {
-
-       /**
-        * @see Config::get
-        */
-       public function get( $name, $prefix = 'wg' ) {
-               return $GLOBALS[$prefix . $name];
-       }
-
-       /**
-        * @see Config::set
-        */
-       public function set( $name, $value, $prefix = 'wg' ) {
-               $GLOBALS[$prefix . $name] = $value;
-
-               return Status::newGood();
-       }
-}
diff --git a/includes/config/GlobalVarConfig.php b/includes/config/GlobalVarConfig.php
new file mode 100644 (file)
index 0000000..61a76b7
--- /dev/null
@@ -0,0 +1,88 @@
+<?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
+ */
+
+/**
+ * Accesses configuration settings from $GLOBALS
+ *
+ * @since 1.23
+ */
+class GlobalVarConfig implements Config {
+
+       /**
+        * Prefix to use for configuration variables
+        * @var string
+        */
+       private $prefix;
+
+       /**
+        * Default builder function
+        * @return GlobalVarConfig
+        */
+       public static function newInstance() {
+               return new GlobalVarConfig();
+       }
+
+       public function __construct( $prefix = 'wg' ) {
+               $this->prefix = $prefix;
+       }
+
+       /**
+        * @see Config::get
+        */
+       public function get( $name ) {
+               return $this->getWithPrefix( $this->prefix, $name );
+       }
+
+       /**
+        * @see Config::set
+        */
+       public function set( $name, $value ) {
+               $this->setWithPrefix( $this->prefix, $name, $value );
+       }
+
+       /**
+        * Get a variable with a given prefix, if not the defaults.
+        *
+        * @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 ) {
+               $var = $prefix . $name;
+               if ( !isset( $GLOBALS[ $var ] ) ) {
+                       throw new ConfigException( __METHOD__ . ": undefined variable: '$var'" );
+               }
+               return $GLOBALS[ $var ];
+       }
+
+       /**
+        * Get a variable with a given prefix, if not the defaults.
+        *
+        * @param string $prefix Prefix to use on the variable
+        * @param string $name Variable name without prefix
+        * @param mixed $value value to set
+        */
+       protected function setWithPrefix( $prefix, $name, $value ) {
+               $GLOBALS[ $prefix . $name ] = $value;
+       }
+}
index 77d3542..8ba43f6 100644 (file)
@@ -450,4 +450,69 @@ abstract class AbstractContent implements Content {
 
                return $result;
        }
+
+       /**
+        * Returns a ParserOutput object containing information derived from this content.
+        * Most importantly, unless $generateHtml was false, the return value contains an
+        * HTML representation of the content.
+        *
+        * Subclasses that want to control the parser output may override this, but it is
+        * preferred to override fillParserOutput() instead.
+        *
+        * Subclasses that override getParserOutput() itself should take care to call the
+        * ContentGetParserOutput hook.
+        *
+        * @since 1.24
+        *
+        * @param Title $title Context title for parsing
+        * @param int|null $revId Revision ID (for {{REVISIONID}})
+        * @param ParserOptions|null $options Parser options
+        * @param bool $generateHtml Whether or not to generate HTML
+        *
+        * @return ParserOutput Containing information derived from this content.
+        */
+       public function getParserOutput( Title $title, $revId = null,
+               ParserOptions $options = null, $generateHtml = true
+       ) {
+               if ( $options === null ) {
+                       $options = $this->getContentHandler()->makeParserOptions( 'canonical' );
+               }
+
+               $po = new ParserOutput();
+
+               if ( wfRunHooks( 'ContentGetParserOutput',
+                       array( $this, $title, $revId, $options, $generateHtml, &$po ) ) ) {
+
+                       $this->fillParserOutput( $title, $revId, $options, $generateHtml, $po );
+               }
+
+               return $po;
+       }
+
+       /**
+        * Fills the provided ParserOutput with information derived from the content.
+        * Unless $generateHtml was false, this includes an HTML representation of the content.
+        *
+        * This is called by getParserOutput() after consulting the ContentGetParserOutput hook.
+        * Subclasses are expected to override this method (or getParserOutput(), if need be).
+        * Subclasses of TextContent should generally override getHtml() instead.
+        *
+        * This placeholder implementation always throws an exception.
+        *
+        * @since 1.24
+        *
+        * @param Title $title Context title for parsing
+        * @param int|null $revId Revision ID (for {{REVISIONID}})
+        * @param ParserOptions|null $options Parser options
+        * @param bool $generateHtml Whether or not to generate HTML
+        * @param ParserOutput &$output The output object to fill (reference).
+        *
+        * @throws MWException
+        */
+       protected function fillParserOutput( Title $title, $revId,
+               ParserOptions $options, $generateHtml, ParserOutput &$output
+       ) {
+               // Don't make abstract, so subclasses that override getParserOutput() directly don't fail.
+               throw new MWException( 'Subclasses of AbstractContent must override fillParserOutput!' );
+       }
 }
index 18110ef..3286c0a 100644 (file)
@@ -48,7 +48,7 @@ interface Content {
        /**
         * @since 1.21
         *
-        * @return string|false The wikitext to include when another page includes this
+        * @return string|bool The wikitext to include when another page includes this
         * content, or false if the content is not includable in a wikitext page.
         *
         * @todo Allow native handling, bypassing wikitext representation, like
@@ -86,7 +86,7 @@ interface Content {
        public function getNativeData();
 
        /**
-        * Returns the content's nominal size in bogo-bytes.
+        * Returns the content's nominal size in "bogo-bytes".
         *
         * @return int
         */
index defa7da..b5b4d13 100644 (file)
@@ -430,6 +430,20 @@ abstract class ContentHandler {
         */
        abstract public function serializeContent( Content $content, $format = null );
 
+       /**
+        * Applies transformations on export (returns the blob unchanged per default).
+        * Subclasses may override this to perform transformations such as conversion
+        * of legacy formats or filtering of internal meta-data.
+        *
+        * @param string $blob The blob to be exported
+        * @param string|null $format The blob's serialization format
+        *
+        * @return string
+        */
+       public function exportTransform( $blob, $format = null ) {
+               return $blob;
+       }
+
        /**
         * Unserializes a Content object of the type supported by this ContentHandler.
         *
@@ -442,6 +456,21 @@ abstract class ContentHandler {
         */
        abstract public function unserializeContent( $blob, $format = null );
 
+       /**
+        * Apply import transformation (per default, returns $blob unchanged).
+        * This gives subclasses an opportunity to transform data blobs on import.
+        *
+        * @singe 1.24
+        *
+        * @param string $blob
+        * @param string|null $format
+        *
+        * @return string
+        */
+       public function importTransform( $blob, $format = null ) {
+               return $blob;
+       }
+
        /**
         * Creates an empty Content object of the type supported by this
         * ContentHandler.
@@ -454,7 +483,7 @@ abstract class ContentHandler {
 
        /**
         * Creates a new Content object that acts as a redirect to the given page,
-        * or null of redirects are not supported by this content model.
+        * or null if redirects are not supported by this content model.
         *
         * This default implementation always returns null. Subclasses supporting redirects
         * must override this method.
index 5fc2c9f..2673084 100644 (file)
@@ -67,7 +67,7 @@ class CssContent extends TextContent {
        protected function getHtml() {
                $html = "";
                $html .= "<pre class=\"mw-code mw-css\" dir=\"ltr\">\n";
-               $html .= $this->getHighlightHtml();
+               $html .= htmlspecialchars( $this->getNativeData() );
                $html .= "\n</pre>\n";
 
                return $html;
index 11a470e..442b705 100644 (file)
@@ -66,7 +66,7 @@ class JavaScriptContent extends TextContent {
        protected function getHtml() {
                $html = "";
                $html .= "<pre class=\"mw-code mw-js\" dir=\"ltr\">\n";
-               $html .= $this->getHighlightHtml();
+               $html .= htmlspecialchars( $this->getNativeData() );
                $html .= "\n</pre>\n";
 
                return $html;
index b0da62d..c3daf83 100644 (file)
@@ -77,9 +77,9 @@ class TextContent extends AbstractContent {
        }
 
        /**
-        * returns the text's size in bytes.
+        * Returns the text's size in bytes.
         *
-        * @return int The size
+        * @return int
         */
        public function getSize() {
                $text = $this->getNativeData();
@@ -116,9 +116,7 @@ class TextContent extends AbstractContent {
         * @return string The raw text.
         */
        public function getNativeData() {
-               $text = $this->mText;
-
-               return $text;
+               return $this->mText;
        }
 
        /**
@@ -136,7 +134,7 @@ class TextContent extends AbstractContent {
         *
         * @note: this allows any text-based content to be transcluded as if it was wikitext.
         *
-        * @return string|false The raw text, or false if the conversion failed.
+        * @return string|bool The raw text, or false if the conversion failed.
         */
        public function getWikitextForTransclusion() {
                $wikitext = $this->convert( CONTENT_MODEL_WIKITEXT, 'lossy' );
@@ -170,8 +168,7 @@ class TextContent extends AbstractContent {
         *
         * @since 1.21
         *
-        * @param Content $that The other content object to compare this content
-        * object to.
+        * @param Content $that The other content object to compare this content object to.
         * @param Language $lang The language object to use for text segmentation.
         *    If not given, $wgContentLang is used.
         *
@@ -202,30 +199,30 @@ class TextContent extends AbstractContent {
        }
 
        /**
-        * Returns a generic ParserOutput object, wrapping the HTML returned by
-        * getHtml().
+        * Fills the provided ParserOutput object with information derived from the content.
+        * Unless $generateHtml was false, this includes an HTML representation of the content
+        * provided by getHtml().
+        *
+        * For content models listed in $wgTextModelsToParse, this method will call the MediaWiki
+        * wikitext parser on the text to extract any (wikitext) links, magic words, etc.
+        *
+        * Subclasses may override this to provide custom content processing.
+        * For custom HTML generation alone, it is sufficient to override getHtml().
         *
         * @param Title $title Context title for parsing
         * @param int $revId Revision ID (for {{REVISIONID}})
         * @param ParserOptions $options Parser options
         * @param bool $generateHtml Whether or not to generate HTML
-        *
-        * @return ParserOutput Representing the HTML form of the text.
+        * @param ParserOutput $output The output object to fill (reference).
         */
-       public function getParserOutput( Title $title, $revId = null,
-               ParserOptions $options = null, $generateHtml = true ) {
+       protected function fillParserOutput( Title $title, $revId,
+               ParserOptions $options, $generateHtml, ParserOutput &$output
+       ) {
                global $wgParser, $wgTextModelsToParse;
 
-               if ( !$options ) {
-                       //NOTE: use canonical options per default to produce cacheable output
-                       $options = $this->getContentHandler()->makeParserOptions( 'canonical' );
-               }
-
                if ( in_array( $this->getModel(), $wgTextModelsToParse ) ) {
-                       // parse just to get links etc into the database
-                       $po = $wgParser->parse( $this->getNativeData(), $title, $options, true, true, $revId );
-               } else {
-                       $po = new ParserOutput();
+                       // parse just to get links etc into the database, HTML is replaced below.
+                       $output = $wgParser->parse( $this->getNativeData(), $title, $options, true, true, $revId );
                }
 
                if ( $generateHtml ) {
@@ -234,19 +231,19 @@ class TextContent extends AbstractContent {
                        $html = '';
                }
 
-               $po->setText( $html );
-
-               return $po;
+               $output->setText( $html );
        }
 
        /**
         * Generates an HTML version of the content, for display. Used by
-        * getParserOutput() to construct a ParserOutput object.
+        * fillParserOutput() to provide HTML for the ParserOutput object.
+        *
+        * Subclasses may override this to provide a custom HTML rendering.
+        * If further information is to be derived from the content (such as
+        * categories), the fillParserOutput() method can be overridden instead.
         *
-        * This default implementation just calls getHighlightHtml(). Content
-        * models that have another mapping to HTML (as is the case for markup
-        * languages like wikitext) should override this method to generate the
-        * appropriate HTML.
+        * For backwards-compatibility, this default implementation just calls
+        * getHighlightHtml().
         *
         * @return string An HTML representation of the content
         */
@@ -255,13 +252,22 @@ class TextContent extends AbstractContent {
        }
 
        /**
-        * Generates a syntax-highlighted version of the content, as HTML.
-        * Used by the default implementation of getHtml().
+        * Generates an HTML version of the content, for display.
+        *
+        * This default implementation returns an HTML-escaped version
+        * of the raw text content.
         *
-        * @return string A HTML representation of the content's markup
+        * @note: The functionality of this method should really be implemented
+        * in getHtml(), and subclasses should override getHtml() if needed.
+        * getHighlightHtml() is kept around for backward compatibility with
+        * extensions that already override it.
+        *
+        * @deprecated since 1.24. Use getHtml() instead. In particular, subclasses overriding
+        *     getHighlightHtml() should override getHtml() instead.
+        *
+        * @return string An HTML representation of the content
         */
        protected function getHighlightHtml() {
-               # TODO: make Highlighter interface, use highlighter here, if available
                return htmlspecialchars( $this->getNativeData() );
        }
 
@@ -269,10 +275,12 @@ class TextContent extends AbstractContent {
         * This implementation provides lossless conversion between content models based
         * on TextContent.
         *
-        * @param string $toModel
-        * @param string $lossy
+        * @param string $toModel The desired content model, use the CONTENT_MODEL_XXX flags.
+        * @param string $lossy Flag, set to "lossy" to allow lossy conversion. If lossy conversion is not
+        *     allowed, full round-trip conversion is expected to work without losing information.
         *
-        * @return Content|bool
+        * @return Content|bool A content object with the content model $toModel, or false if that
+        *     conversion is not supported.
         *
         * @see Content::convert()
         */
@@ -286,7 +294,7 @@ class TextContent extends AbstractContent {
                $toHandler = ContentHandler::getForModelID( $toModel );
 
                if ( $toHandler instanceof TextContentHandler ) {
-                       //NOTE: ignore content serialization format - it's just text anyway.
+                       // NOTE: ignore content serialization format - it's just text anyway.
                        $text = $this->getNativeData();
                        $converted = $toHandler->unserializeContent( $text );
                }
index 13ef1b9..ccea916 100644 (file)
@@ -258,8 +258,6 @@ class WikitextContent extends TextContent {
         *    find out (default: null).
         * @param Title $title Optional title, defaults to the title from the current main request.
         *
-        * @internal param \IContextSource $context context for parsing if necessary
-        *
         * @return bool
         */
        public function isCountable( $hasLinks = null, Title $title = null ) {
@@ -313,41 +311,33 @@ class WikitextContent extends TextContent {
         * Returns a ParserOutput object resulting from parsing the content's text
         * using $wgParser.
         *
-        * @since 1.21
-        *
-        * @param Title $title * @param int $revId Revision to pass to the parser (default: null)
+        * @param Title $title
+        * @param int $revId Revision to pass to the parser (default: null)
         * @param ParserOptions $options (default: null)
-        * @param bool $generateHtml (default: false)
-        * @internal param \IContextSource|null $context
-        *
-        * @return ParserOutput Representing the HTML form of the text
+        * @param bool $generateHtml (default: true)
+        * @param &$output ParserOutput representing the HTML form of the text,
+        *           may be manipulated or replaced.
         */
-       public function getParserOutput( Title $title, $revId = null,
-               ParserOptions $options = null, $generateHtml = true ) {
+       protected function fillParserOutput( Title $title, $revId,
+                       ParserOptions $options, $generateHtml, ParserOutput &$output
+       ) {
                global $wgParser;
 
-               if ( !$options ) {
-                       //NOTE: use canonical options per default to produce cacheable output
-                       $options = $this->getContentHandler()->makeParserOptions( 'canonical' );
-               }
-
                list( $redir, $text ) = $this->getRedirectTargetAndText();
-               $po = $wgParser->parse( $text, $title, $options, true, true, $revId );
+               $output = $wgParser->parse( $text, $title, $options, true, true, $revId );
 
                // Add redirect indicator at the top
                if ( $redir ) {
                        // Make sure to include the redirect link in pagelinks
-                       $po->addLink( $redir );
+                       $output->addLink( $redir );
                        if ( $generateHtml ) {
                                $chain = $this->getRedirectChain();
-                               $po->setText(
+                               $output->setText(
                                        Article::getRedirectHeaderHtml( $title->getPageLanguage(), $chain, false ) .
-                                       $po->getText()
+                                       $output->getText()
                                );
                        }
                }
-
-               return $po;
        }
 
        /**
index 9e55059..4a3c2cb 100644 (file)
@@ -83,7 +83,7 @@ abstract class ContextSource implements IContextSource {
         * Get the Title object
         *
         * @since 1.18
-        * @return Title
+        * @return Title|null
         */
        public function getTitle() {
                return $this->getContext()->getTitle();
index f5616e0..4a7b466 100644 (file)
@@ -66,7 +66,7 @@ class DerivativeContext extends ContextSource {
        private $skin;
 
        /**
-        * @var SiteConfiguration
+        * @var Config
         */
        private $config;
 
@@ -81,9 +81,9 @@ class DerivativeContext extends ContextSource {
        /**
         * Set the SiteConfiguration object
         *
-        * @param SiteConfiguration $s
+        * @param Config $s
         */
-       public function setConfig( SiteConfiguration $s ) {
+       public function setConfig( Config $s ) {
                $this->config = $s;
        }
 
@@ -138,7 +138,7 @@ class DerivativeContext extends ContextSource {
        /**
         * Get the Title object
         *
-        * @return Title
+        * @return Title|null
         */
        public function getTitle() {
                if ( !is_null( $this->title ) ) {
index f892b02..5534ee3 100644 (file)
@@ -37,7 +37,7 @@ interface IContextSource {
        /**
         * Get the Title object
         *
-        * @return Title
+        * @return Title|null
         */
        public function getTitle();
 
index 6f27a7a..c87bfc0 100644 (file)
@@ -84,7 +84,9 @@ class RequestContext implements IContextSource {
         */
        public function getConfig() {
                if ( $this->config === null ) {
-                       $this->config = Config::factory();
+                       // @todo In the future, we could move this to WebStart.php so
+                       // the Config object is ready for when initialization happens
+                       $this->config = ConfigFactory::getDefaultInstance()->makeConfig( 'main' );
                }
 
                return $this->config;
@@ -131,7 +133,7 @@ class RequestContext implements IContextSource {
        /**
         * Get the Title object
         *
-        * @return Title
+        * @return Title|null
         */
        public function getTitle() {
                if ( $this->title === null ) {
index 9254bb4..16e1ef2 100644 (file)
@@ -43,10 +43,10 @@ interface DatabaseType {
        /**
         * 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
+        * @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
         */
@@ -336,7 +336,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        }
 
        /**
-        * @return string command delimiter used by this database engine
+        * @return string Command delimiter used by this database engine
         */
        public function getDelimiter() {
                return $this->delimiter;
@@ -349,7 +349,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         *   - false to disable debugging
         *   - omitted or null to do nothing
         *
-        * @return bool|null previous value of the flag
+        * @return bool|null Previous value of the flag
         */
        public function debug( $debug = null ) {
                return wfSetBit( $this->mFlags, DBO_DEBUG, $debug );
@@ -475,7 +475,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * parameters, the member with the given name is set to the given value.
         *
         * @param string $name
-        * @param $value
+        * @param array $value
         */
        public function setLBInfo( $name, $value = null ) {
                if ( is_null( $value ) ) {
@@ -806,7 +806,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * database. Example uses in core:
         * @see LoadBalancer::reallyOpenConnection()
         * @see ForeignDBRepo::getMasterDB()
-        * @see WebInstaller_DBConnect::execute()
+        * @see WebInstallerDBConnect::execute()
         *
         * @since 1.18
         *
@@ -908,7 +908,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        }
 
        /**
-        * @param $errno
+        * @param int $errno
         * @param string $errstr
         */
        public function connectionErrorHandler( $errno, $errstr ) {
@@ -926,7 +926,6 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                if ( count( $this->mTrxIdleCallbacks ) ) { // sanity
                        throw new MWException( "Transaction idle callbacks still pending." );
                }
-               $this->mOpened = false;
                if ( $this->mConn ) {
                        if ( $this->trxLevel() ) {
                                if ( !$this->mTrxAutomatic ) {
@@ -937,13 +936,14 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                                $this->commit( __METHOD__, 'flush' );
                        }
 
-                       $ret = $this->closeConnection();
+                       $closed = $this->closeConnection();
                        $this->mConn = false;
-
-                       return $ret;
                } else {
-                       return true;
+                       $closed = true;
                }
+               $this->mOpened = false;
+
+               return $closed;
        }
 
        /**
@@ -1054,7 +1054,8 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                # Keep track of whether the transaction has write queries pending
                if ( $this->mTrxLevel && !$this->mTrxDoneWrites && $this->isWriteQuery( $sql ) ) {
                        $this->mTrxDoneWrites = true;
-                       Profiler::instance()->transactionWritingIn( $this->mServer, $this->mDBname );
+                       $id = spl_object_hash( $this );
+                       Profiler::instance()->transactionWritingIn( $this->mServer, $this->mDBname, $id );
                }
 
                $queryProf = '';
@@ -1088,6 +1089,11 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
 
                $queryId = MWDebug::query( $sql, $fname, $isMaster );
 
+               # Avoid fatals if close() was called
+               if ( !$this->isOpen() ) {
+                       throw new DBUnexpectedError( $this, "DB connection was already closed." );
+               }
+
                # Do the query and handle errors
                $ret = $this->doQuery( $commentedSql );
 
@@ -1098,20 +1104,25 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                        # Transaction is gone, like it or not
                        $hadTrx = $this->mTrxLevel; // possible lost transaction
                        $this->mTrxLevel = 0;
+                       $this->mTrxIdleCallbacks = array(); // bug 65263
+                       $this->mTrxPreCommitCallbacks = array(); // bug 65263
                        wfDebug( "Connection lost, reconnecting...\n" );
 
                        if ( $this->ping() ) {
+                               global $wgRequestTime;
                                wfDebug( "Reconnected\n" );
                                $sqlx = substr( $commentedSql, 0, 500 );
                                $sqlx = strtr( $sqlx, "\t\n", '  ' );
-                               global $wgRequestTime;
                                $elapsed = round( microtime( true ) - $wgRequestTime, 3 );
                                if ( $elapsed < 300 ) {
                                        # Not a database error to lose a transaction after a minute or two
                                        wfLogDBError( "Connection lost and reconnected after {$elapsed}s, query: $sqlx" );
                                }
-                               if ( !$hadTrx ) {
-                                       # Should be safe to silently retry
+                               if ( $hadTrx ) {
+                                       # Leave $ret as false and let an error be reported.
+                                       # Callers may catch the exception and continue to use the DB.
+                               } else {
+                                       # Should be safe to silently retry (no trx and thus no callbacks)
                                        $ret = $this->doQuery( $commentedSql );
                                }
                        } else {
@@ -1190,7 +1201,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
 
        /**
         * Execute a prepared query with the various arguments
-        * @param string $prepared the prepared sql
+        * @param string $prepared The prepared sql
         * @param mixed $args Either an array here, or put scalars as varargs
         *
         * @return ResultWrapper
@@ -1211,7 +1222,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * For faking prepared SQL statements on DBs that don't support it directly.
         *
         * @param string $preparedQuery A 'preparable' SQL statement
-        * @param array $args of Arguments to fill it with
+        * @param array $args Array of Arguments to fill it with
         * @return string Executable SQL
         */
        public function fillPrepared( $preparedQuery, $args ) {
@@ -2063,7 +2074,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         *    array(baseKeyVal => array(subKeyVal => [ignored], ...), ...)
         * @param string $baseKey Field name to match the base-level keys to (eg 'pl_namespace')
         * @param string $subKey Field name to match the sub-level keys to (eg 'pl_title')
-        * @return Mixed: string SQL fragment, or false if no items in array.
+        * @return string|bool string SQL fragment, or false if no items in array.
         */
        public function makeWhereFrom2d( $data, $baseKey, $subKey ) {
                $conds = array();
@@ -2087,7 +2098,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Return aggregated value alias
         *
-        * @param $valuedata
+        * @param array $valuedata
         * @param string $valuename
         *
         * @return string
@@ -2161,7 +2172,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         *
         * @todo Explain what exactly will fail if this is not overridden.
         *
-        * @param $db
+        * @param string $db
         *
         * @return bool Success or failure
         */
@@ -2176,6 +2187,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
 
        /**
         * Get the current DB name
+        * @return string
         */
        public function getDBname() {
                return $this->mDBname;
@@ -2183,6 +2195,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
 
        /**
         * Get the server hostname or IP address
+        * @return string
         */
        public function getServer() {
                return $this->mServer;
@@ -3008,7 +3021,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Returns true if current database backend supports ORDER BY or LIMIT for separate subqueries
         * within the UNION construct.
-        * @return Boolean
+        * @return bool
         */
        public function unionSupportsOrderAndLimit() {
                return true; // True for almost every DB supported
@@ -3403,11 +3416,17 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                        $this->runOnTransactionPreCommitCallbacks();
                        $this->doCommit( $fname );
                        if ( $this->mTrxDoneWrites ) {
-                               Profiler::instance()->transactionWritingOut( $this->mServer, $this->mDBname );
+                               $id = spl_object_hash( $this );
+                               Profiler::instance()->transactionWritingOut( $this->mServer, $this->mDBname, $id );
                        }
                        $this->runOnTransactionIdleCallbacks();
                }
 
+               # Avoid fatals if close() was called
+               if ( !$this->isOpen() ) {
+                       throw new DBUnexpectedError( $this, "DB connection was already closed." );
+               }
+
                $this->doBegin( $fname );
                $this->mTrxFname = $fname;
                $this->mTrxDoneWrites = false;
@@ -3466,10 +3485,16 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                        }
                }
 
+               # Avoid fatals if close() was called
+               if ( !$this->isOpen() ) {
+                       throw new DBUnexpectedError( $this, "DB connection was already closed." );
+               }
+
                $this->runOnTransactionPreCommitCallbacks();
                $this->doCommit( $fname );
                if ( $this->mTrxDoneWrites ) {
-                       Profiler::instance()->transactionWritingOut( $this->mServer, $this->mDBname );
+                       $id = spl_object_hash( $this );
+                       Profiler::instance()->transactionWritingOut( $this->mServer, $this->mDBname, $id );
                }
                $this->runOnTransactionIdleCallbacks();
        }
@@ -3515,12 +3540,18 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                        }
                }
 
+               # Avoid fatals if close() was called
+               if ( !$this->isOpen() ) {
+                       throw new DBUnexpectedError( $this, "DB connection was already closed." );
+               }
+
                $this->doRollback( $fname );
                $this->mTrxIdleCallbacks = array(); // cancel
                $this->mTrxPreCommitCallbacks = array(); // cancel
                $this->mTrxAtomicLevels = new SplStack;
                if ( $this->mTrxDoneWrites ) {
-                       Profiler::instance()->transactionWritingOut( $this->mServer, $this->mDBname );
+                       $id = spl_object_hash( $this );
+                       Profiler::instance()->transactionWritingOut( $this->mServer, $this->mDBname, $id );
                }
        }
 
index 377aca1..8229c99 100644 (file)
@@ -133,21 +133,17 @@ class DBConnectionError extends DBExpectedError {
         * @return string Unprocessed plain error text with parameters replaced
         */
        function msg( $key, $fallback /*[, params...] */ ) {
-               global $wgLang;
-
                $args = array_slice( func_get_args(), 2 );
 
                if ( $this->useMessageCache() ) {
-                       $message = $wgLang->getMessage( $key );
+                       return wfMessage( $key, $args )->useDatabase( false )->text();
                } else {
-                       $message = $fallback;
+                       return wfMsgReplaceArgs( $fallback, $args );
                }
-
-               return wfMsgReplaceArgs( $message, $args );
        }
 
        /**
-        * @return boolean
+        * @return bool
         */
        function isLoggable() {
                // Don't send to the exception log, already in dberror log
@@ -347,14 +343,6 @@ class DBQueryError extends DBExpectedError {
                $this->fname = $fname;
        }
 
-       /**
-        * @return bool
-        */
-       function isLoggable() {
-               // Don't send to the exception log, already in dberror log
-               return false;
-       }
-
        /**
         * @return string
         */
index faed996..1d05bf6 100644 (file)
@@ -215,7 +215,9 @@ class DatabaseMssql extends DatabaseBase {
 
                                foreach ( $errors as $err ) {
                                        if ( $err['SQLSTATE'] == '23000' && $err['code'] == '2601' ) {
-                                               continue; // duplicate key error
+                                               continue; // duplicate key error caused by unique index
+                                       } elseif ( $err['SQLSTATE'] == '23000' && $err['code'] == '2627' ) {
+                                               continue; // duplicate key error caused by primary key
                                        } elseif ( $err['SQLSTATE'] == '01000' && $err['code'] == '3621' ) {
                                                continue; // generic "the statement has been terminated" error
                                        }
@@ -991,18 +993,22 @@ class DatabaseMssql extends DatabaseBase {
        /**
         * @param string $table
         * @param string $fname
-        * @param bool $schema
         * @return bool
         */
-       public function tableExists( $table, $fname = __METHOD__, $schema = false ) {
-               $res = sqlsrv_query( $this->mConn, "SELECT * FROM information_schema.tables
-                       WHERE table_type='BASE TABLE' AND table_name = '$table'" );
-               if ( $res === false ) {
-                       print "Error in tableExists query: " . $this->lastError();
+       public function tableExists( $table, $fname = __METHOD__ ) {
+               list( $db, $schema, $table ) = $this->tableName( $table, 'split' );
 
+               if ( $db !== false ) {
+                       // remote database
+                       wfDebug( "Attempting to call tableExists on a remote table" );
                        return false;
                }
-               if ( sqlsrv_fetch( $res ) ) {
+
+               $res = $this->query( "SELECT 1 FROM INFORMATION_SCHEMA.TABLES
+                       WHERE TABLE_TYPE = 'BASE TABLE'
+                       AND TABLE_SCHEMA = '$schema' AND TABLE_NAME = '$table'" );
+
+               if ( $res->numRows() ) {
                        return true;
                } else {
                        return false;
@@ -1017,15 +1023,18 @@ class DatabaseMssql extends DatabaseBase {
         * @return bool
         */
        public function fieldExists( $table, $field, $fname = __METHOD__ ) {
-               $table = $this->tableName( $table );
-               $res = sqlsrv_query( $this->mConn, "SELECT DATA_TYPE FROM INFORMATION_SCHEMA.Columns
-                       WHERE TABLE_NAME = '$table' AND COLUMN_NAME = '$field'" );
-               if ( $res === false ) {
-                       print "Error in fieldExists query: " . $this->lastError();
+               list( $db, $schema, $table ) = $this->tableName( $table, 'split' );
 
+               if ( $db !== false ) {
+                       // remote database
+                       wfDebug( "Attempting to call fieldExists on a remote table" );
                        return false;
                }
-               if ( sqlsrv_fetch( $res ) ) {
+
+               $res = $this->query( "SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS
+                       WHERE TABLE_SCHEMA = '$schema' AND TABLE_NAME = '$table' AND COLUMN_NAME = '$field'" );
+
+               if ( $res->numRows() ) {
                        return true;
                } else {
                        return false;
@@ -1033,15 +1042,18 @@ class DatabaseMssql extends DatabaseBase {
        }
 
        public function fieldInfo( $table, $field ) {
-               $table = $this->tableName( $table );
-               $res = sqlsrv_query( $this->mConn, "SELECT * FROM INFORMATION_SCHEMA.Columns
-                       WHERE TABLE_NAME = '$table' AND COLUMN_NAME = '$field'" );
-               if ( $res === false ) {
-                       print "Error in fieldInfo query: " . $this->lastError();
+               list( $db, $schema, $table ) = $this->tableName( $table, 'split' );
 
+               if ( $db !== false ) {
+                       // remote database
+                       wfDebug( "Attempting to call fieldInfo on a remote table" );
                        return false;
                }
-               $meta = $this->fetchRow( $res );
+
+               $res = $this->query( "SELECT * FROM INFORMATION_SCHEMA.COLUMNS
+                       WHERE TABLE_SCHEMA = '$schema' AND TABLE_NAME = '$table' AND COLUMN_NAME = '$field'" );
+
+               $meta = $res->fetchRow();
                if ( $meta ) {
                        return new MssqlField( $meta );
                }
@@ -1222,7 +1234,7 @@ class DatabaseMssql extends DatabaseBase {
         * @param string $field Field name
         * @param string|array $conds Conditions
         * @param string|array $join_conds Join conditions
-        * @return String SQL text
+        * @return string SQL text
         * @since 1.23
         */
        public function buildGroupConcatField( $delim, $table, $field, $conds = '',
@@ -1323,11 +1335,20 @@ class DatabaseMssql extends DatabaseBase {
        /**
         * call this instead of tableName() in the updater when renaming tables
         * @param string $name
-        * @param string $format
+        * @param string $format One of quoted, raw, or split
         * @return string
         */
        function realTableName( $name, $format = 'quoted' ) {
-               return parent::tableName( $name, $format );
+               $table = parent::tableName( $name, $format );
+               if ( $format == 'split' ) {
+                       // Used internally, we want the schema split off from the table name and returned
+                       // as a list with 3 elements (database, schema, table)
+                       $table = explode( '.', $table );
+                       if ( count( $table ) == 2 ) {
+                               array_unshift( $table, false );
+                       }
+               }
+               return $table;
        }
 
        /**
index d437c4c..837d094 100644 (file)
@@ -321,7 +321,7 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
 
        /**
         * @param ResultWrapper|resource $res
-        * @param $n int
+        * @param int $n
         * @return string
         */
        function fieldName( $res, $n ) {
@@ -336,7 +336,7 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
         * Get the name of the specified field in a result
         *
         * @param ResultWrapper|resource $res
-        * @param $n int
+        * @param int $n
         * @return string
         */
        abstract protected function mysqlFieldName( $res, $n );
@@ -344,7 +344,7 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        /**
         * mysql_field_type() wrapper
         * @param ResultWrapper|resource $res
-        * @param $n int
+        * @param int $n
         * @return string
         */
        public function fieldType( $res, $n ) {
@@ -961,12 +961,12 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
 
        /**
         * DELETE where the condition is a join. MySql uses multi-table deletes.
-        * @param $delTable string
-        * @param $joinTable string
-        * @param $delVar string
-        * @param $joinVar string
-        * @param $conds array|string
-        * @param bool|string $fname bool
+        * @param string $delTable
+        * @param string $joinTable
+        * @param string $delVar
+        * @param string $joinVar
+        * @param array|string $conds
+        * @param bool|string $fname
         * @throws DBUnexpectedError
         * @return bool|ResultWrapper
         */
@@ -1109,8 +1109,8 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        }
 
        /**
-        * @param $tableName
-        * @param $fName string
+        * @param string $tableName
+        * @param string $fName
         * @return bool|ResultWrapper
         */
        public function dropTable( $tableName, $fName = __METHOD__ ) {
@@ -1296,7 +1296,7 @@ class MySQLMasterPos implements DBMasterPos {
        }
 
        /**
-        * @return array|false (int, int)
+        * @return array|bool (int, int)
         */
        protected function getCoordinates() {
                $m = array();
index 0d13433..396de4f 100644 (file)
@@ -621,7 +621,7 @@ class DatabaseOracle extends DatabaseBase {
 
        /**
         * @param string $table
-        * @param $row
+        * @param array $row
         * @param string $fname
         * @return bool
         * @throws DBUnexpectedError
@@ -977,7 +977,7 @@ class DatabaseOracle extends DatabaseBase {
        /**
         * Return aggregated value function call
         *
-        * @param $valuedata
+        * @param array $valuedata
         * @param string $valuename
         * @return mixed
         */
index 6aee528..131b758 100644 (file)
@@ -223,7 +223,7 @@ class SavepointPostgres {
 
        /**
         * @param DatabaseBase $dbw
-        * @param $id
+        * @param int $id
         */
        public function __construct( $dbw, $id ) {
                $this->dbw = $dbw;
@@ -831,7 +831,7 @@ __INDEXATTR__;
                $options = array(), $join_conds = array()
        ) {
                if ( is_array( $options ) ) {
-                       $forUpdateKey = array_search( 'FOR UPDATE', $options );
+                       $forUpdateKey = array_search( 'FOR UPDATE', $options, true );
                        if ( $forUpdateKey !== false && $join_conds ) {
                                unset( $options[$forUpdateKey] );
 
@@ -1263,7 +1263,7 @@ __INDEXATTR__;
         * Values may contain magic keywords like "$user"
         * @since 1.19
         *
-        * @param $search_path array list of schemas to be searched by default
+        * @param array $search_path List of schemas to be searched by default
         */
        function setSearchPath( $search_path ) {
                $this->query( "SET search_path = " . implode( ", ", $search_path ) );
index 3313d25..3e063c6 100644 (file)
@@ -240,7 +240,7 @@ class DatabaseSqlite extends DatabaseBase {
        /**
         * @see DatabaseBase::isWriteQuery()
         *
-        * @param $sql string
+        * @param string $sql
         * @return bool
         */
        function isWriteQuery( $sql ) {
@@ -342,13 +342,18 @@ class DatabaseSqlite extends DatabaseBase {
         */
        function numFields( $res ) {
                $r = $res instanceof ResultWrapper ? $res->result : $res;
-
-               return is_array( $r ) ? count( $r[0] ) : 0;
+               if ( is_array($r) && count( $r ) > 0 ){
+                       // The size of the result array is twice the number of fields. (Bug: 65578)
+                       return count( $r[0] ) / 2 ;
+               } else {
+                       // If the result is empty return 0
+                       return 0;
+               }
        }
 
        /**
         * @param ResultWrapper $res
-        * @param $n
+        * @param int $n
         * @return bool
         */
        function fieldName( $res, $n ) {
@@ -747,7 +752,7 @@ class DatabaseSqlite extends DatabaseBase {
        }
 
        /**
-        * @param $b
+        * @param string $b
         * @return Blob
         */
        function encodeBlob( $b ) {
@@ -755,7 +760,7 @@ class DatabaseSqlite extends DatabaseBase {
        }
 
        /**
-        * @param $b Blob|string
+        * @param Blob|string $b
         * @return string
         */
        function decodeBlob( $b ) {
index 21ae808..c66cddf 100644 (file)
@@ -39,8 +39,8 @@ interface IORMRow {
         * @deprecated since 1.22
         *
         * @param array|null $fields
-        * @param boolean $override
-        * @param boolean $skipLoaded
+        * @param bool $override
+        * @param bool $skipLoaded
         *
         * @return bool Success indicator
         */
@@ -85,7 +85,7 @@ interface IORMRow {
         *
         * @since 1.20
         *
-        * @return integer|null
+        * @return int|null
         */
        public function getId();
 
@@ -94,7 +94,7 @@ interface IORMRow {
         *
         * @since 1.20
         *
-        * @param integer|null $id
+        * @param int|null $id
         */
        public function setId( $id );
 
@@ -105,7 +105,7 @@ interface IORMRow {
         *
         * @param string $name
         *
-        * @return boolean
+        * @return bool
         */
        public function hasField( $name );
 
@@ -114,7 +114,7 @@ interface IORMRow {
         *
         * @since 1.20
         *
-        * @return boolean
+        * @return bool
         */
        public function hasIdField();
 
@@ -124,7 +124,7 @@ interface IORMRow {
         * @since 1.20
         *
         * @param array $fields The fields to set
-        * @param boolean $override Override already set fields with the provided values?
+        * @param bool $override Override already set fields with the provided values?
         */
        public function setFields( array $fields, $override = true );
 
@@ -135,7 +135,7 @@ interface IORMRow {
         * @since 1.20
         *
         * @param null|array $fields
-        * @param boolean $incNullId
+        * @param bool $incNullId
         *
         * @return array
         */
@@ -147,7 +147,7 @@ interface IORMRow {
         * @since 1.20
         * @deprecated since 1.22
         *
-        * @param boolean $override
+        * @param bool $override
         */
        public function loadDefaults( $override = true );
 
@@ -160,7 +160,7 @@ interface IORMRow {
         * @param string|null $functionName
         * @deprecated since 1.22
         *
-        * @return boolean Success indicator
+        * @return bool Success indicator
         */
        public function save( $functionName = null );
 
@@ -170,7 +170,7 @@ interface IORMRow {
         * @since 1.20
         * @deprecated since 1.22
         *
-        * @return boolean Success indicator
+        * @return bool Success indicator
         */
        public function remove();
 
@@ -213,9 +213,9 @@ interface IORMRow {
         * @deprecated since 1.22
         *
         * @param string $field
-        * @param integer $amount
+        * @param int $amount
         *
-        * @return boolean Success indicator
+        * @return bool Success indicator
         */
        public function addToField( $field, $amount );
 
@@ -244,7 +244,7 @@ interface IORMRow {
         * @since 1.20
         * @deprecated since 1.22
         *
-        * @param boolean $update
+        * @param bool $update
         */
        public function setUpdateSummaries( $update );
 
@@ -254,7 +254,7 @@ interface IORMRow {
         * @since 1.20
         * @deprecated since 1.22
         *
-        * @param boolean $summaryMode
+        * @param bool $summaryMode
         */
        public function setSummaryMode( $summaryMode );
 
index 9e9c526..ab1ab79 100644 (file)
@@ -161,7 +161,7 @@ interface IORMTable {
         * @param array|string|null $fields
         * @param array $conditions
         * @param array $options
-        * @param boolean $collapse Set to false to always return each result row as associative array.
+        * @param bool $collapse Set to false to always return each result row as associative array.
         * @param string|null $functionName
         *
         * @return array of array
@@ -213,7 +213,7 @@ interface IORMTable {
         * @param array|string|null $fields
         * @param array $conditions
         * @param array $options
-        * @param boolean $collapse Set to false to always return each result row as associative array.
+        * @param bool $collapse Set to false to always return each result row as associative array.
         * @param string|null $functionName
         *
         * @return mixed|array|bool False on failure
@@ -229,7 +229,7 @@ interface IORMTable {
         *
         * @param array $conditions
         *
-        * @return boolean
+        * @return bool
         */
        public function has( array $conditions = array() );
 
@@ -238,7 +238,7 @@ interface IORMTable {
         *
         * @since 1.21
         *
-        * @return boolean
+        * @return bool
         */
        public function exists();
 
@@ -254,7 +254,7 @@ interface IORMTable {
         * @param array $conditions
         * @param array $options
         *
-        * @return integer
+        * @return int
         */
        public function count( array $conditions = array(), array $options = array() );
 
@@ -266,7 +266,7 @@ interface IORMTable {
         * @param array $conditions
         * @param string|null $functionName
         *
-        * @return boolean Success indicator
+        * @return bool Success indicator
         */
        public function delete( array $conditions, $functionName = null );
 
@@ -275,8 +275,8 @@ interface IORMTable {
         *
         * @since 1.20
         *
-        * @param boolean $requireParams
-        * @param boolean $setDefaults
+        * @param bool $requireParams
+        * @param bool $setDefaults
         *
         * @return array
         */
@@ -298,14 +298,14 @@ interface IORMTable {
         *
         * @since 1.20
         *
-        * @return integer DB_ enum
+        * @return int DB_ enum
         */
        public function getReadDb();
 
        /**
         * Set the database type to use for read operations.
         *
-        * @param integer $db
+        * @param int $db
         *
         * @since 1.20
         */
@@ -316,7 +316,7 @@ interface IORMTable {
         *
         * @since 1.20
         *
-        * @return String|bool The target wiki, in a form that LBFactory
+        * @return string|bool The target wiki, in a form that LBFactory
         *   understands (or false if the local wiki is used)
         */
        public function getTargetWiki();
@@ -372,7 +372,7 @@ interface IORMTable {
         *
         * @see LoadBalancer::reuseConnection
         *
-        * @param DatabaseBase $db the database
+        * @param DatabaseBase $db The database
         *
         * @since 1.20
         */
@@ -388,7 +388,7 @@ interface IORMTable {
         * @param array $values
         * @param array $conditions
         *
-        * @return boolean Success indicator
+        * @return bool Success indicator
         */
        public function update( array $values, array $conditions = array() );
 
@@ -490,7 +490,7 @@ interface IORMTable {
         * @since 1.20
         *
         * @param array $data
-        * @param boolean $loadDefaults
+        * @param bool $loadDefaults
         *
         * @return IORMRow
         */
@@ -512,7 +512,7 @@ interface IORMTable {
         *
         * @param string $name
         *
-        * @return boolean
+        * @return bool
         */
        public function canHaveField( $name );
 }
index eca9564..bea195b 100644 (file)
@@ -179,7 +179,7 @@ abstract class LBFactory {
         * Private helper for forEachLBCallMethod
         * @param LoadBalancer $loadBalancer
         * @param string $methodName
-        * @param $args
+        * @param array $args
         */
        function callMethod( $loadBalancer, $methodName, $args ) {
                call_user_func_array( array( $loadBalancer, $methodName ), $args );
index 66e9d12..6219573 100644 (file)
@@ -62,7 +62,7 @@ class LBFactorySingle extends LBFactory {
        }
 
        /**
-        * @param string $cluster external storage cluster, or false for core
+        * @param string $cluster External storage cluster, or false for core
         * @param bool|string $wiki Wiki ID, or false for the current wiki
         * @return LoadBalancerSingle
         */
@@ -87,7 +87,7 @@ class LoadBalancerSingle extends LoadBalancer {
        protected $db;
 
        /**
-        * @param $params array
+        * @param array $params
         */
        function __construct( $params ) {
                $this->db = $params['connection'];
index aab0486..38c3d2d 100644 (file)
@@ -113,7 +113,7 @@ class LoadBalancer {
 
        /**
         * Get or set arbitrary data used by the parent object, usually an LBFactory
-        * @param $x
+        * @param mixed $x
         * @return mixed
         */
        function parentInfo( $x = null ) {
@@ -369,8 +369,8 @@ class LoadBalancer {
 
        /**
         * Wait for a given slave to catch up to the master pos stored in $this
-        * @param $index
-        * @param $open bool
+        * @param int $index
+        * @param bool $open
         * @return bool
         */
        protected function doWait( $index, $open = false ) {
@@ -410,8 +410,8 @@ class LoadBalancer {
         * Get a connection by index
         * This is the main entry point for this class.
         *
-        * @param $i Integer: server index
-        * @param array $groups query groups
+        * @param int $i Server index
+        * @param array $groups Query groups
         * @param bool|string $wiki Wiki ID
         *
         * @throws MWException
@@ -538,7 +538,7 @@ class LoadBalancer {
         *
         * @see LoadBalancer::getConnection() for parameter information
         *
-        * @param integer $db
+        * @param int $db
         * @param mixed $groups
         * @param bool|string $wiki
         * @return DBConnRef
@@ -554,7 +554,7 @@ class LoadBalancer {
         *
         * @see LoadBalancer::getConnection() for parameter information
         *
-        * @param integer $db
+        * @param int $db
         * @param mixed $groups
         * @param bool|string $wiki
         * @return DBConnRef
@@ -571,8 +571,8 @@ class LoadBalancer {
         * On error, returns false, and the connection which caused the
         * error will be available via $this->mErrorConnection.
         *
-        * @param $i Integer server index
-        * @param bool|string $wiki wiki ID to open
+        * @param int $i Server index
+        * @param bool|string $wiki Wiki ID to open
         * @return DatabaseBase
         *
         * @access private
@@ -619,8 +619,8 @@ class LoadBalancer {
         * On error, returns false, and the connection which caused the
         * error will be available via $this->mErrorConnection.
         *
-        * @param $i Integer: server index
-        * @param string $wiki wiki ID to open
+        * @param int $i Server index
+        * @param string $wiki Wiki ID to open
         * @return DatabaseBase
         */
        function openForeignConnection( $i, $wiki ) {
@@ -683,7 +683,7 @@ class LoadBalancer {
        /**
         * Test if the specified index represents an open connection
         *
-        * @param $index Integer: server index
+        * @param int $index Server index
         * @access private
         * @return bool
         */
@@ -700,8 +700,8 @@ class LoadBalancer {
         * Returns a Database object whether or not the connection was successful.
         * @access private
         *
-        * @param $server
-        * @param $dbNameOverride bool
+        * @param array $server
+        * @param bool $dbNameOverride
         * @throws MWException
         * @return DatabaseBase
         */
@@ -811,8 +811,8 @@ class LoadBalancer {
 
        /**
         * Return the server info structure for a given index, or false if the index is invalid.
-        * @param $i
-        * @return bool
+        * @param int $i
+        * @return array|bool
         */
        function getServerInfo( $i ) {
                if ( isset( $this->mServers[$i] ) ) {
@@ -825,8 +825,8 @@ class LoadBalancer {
        /**
         * Sets the server info structure for the given index. Entry at index $i
         * is created if it doesn't exist
-        * @param $i
-        * @param $serverInfo
+        * @param int $i
+        * @param array $serverInfo
         */
        function setServerInfo( $i, $serverInfo ) {
                $this->mServers[$i] = $serverInfo;
@@ -993,8 +993,8 @@ class LoadBalancer {
        }
 
        /**
-        * @param $value null
-        * @return Mixed
+        * @param mixed $value
+        * @return mixed
         */
        function waitTimeout( $value = null ) {
                return wfSetVar( $this->mWaitTimeout, $value );
index e4efc01..327d20d 100644 (file)
@@ -36,7 +36,7 @@ class ORMResult implements ORMIterator {
        protected $res;
 
        /**
-        * @var integer
+        * @var int
         */
        protected $key;
 
@@ -62,7 +62,7 @@ class ORMResult implements ORMIterator {
        }
 
        /**
-        * @param $row
+        * @param bool|object $row
         */
        protected function setCurrent( $row ) {
                if ( $row === false ) {
@@ -73,14 +73,14 @@ class ORMResult implements ORMIterator {
        }
 
        /**
-        * @return integer
+        * @return int
         */
        public function count() {
                return $this->res->numRows();
        }
 
        /**
-        * @return boolean
+        * @return bool
         */
        public function isEmpty() {
                return $this->res->numRows() === 0;
@@ -94,7 +94,7 @@ class ORMResult implements ORMIterator {
        }
 
        /**
-        * @return integer
+        * @return int
         */
        public function key() {
                return $this->key;
@@ -113,7 +113,7 @@ class ORMResult implements ORMIterator {
        }
 
        /**
-        * @return boolean
+        * @return bool
         */
        public function valid() {
                return $this->current !== false;
index 1d11202..b0bade3 100644 (file)
@@ -78,7 +78,7 @@ class ORMRow implements IORMRow {
         *
         * @param IORMTable|null $table Deprecated since 1.22
         * @param array|null $fields
-        * @param boolean $loadDefaults Deprecated since 1.22
+        * @param bool $loadDefaults Deprecated since 1.22
         */
        public function __construct( IORMTable $table = null, $fields = null, $loadDefaults = false ) {
                $this->table = $table;
@@ -101,8 +101,8 @@ class ORMRow implements IORMRow {
         * @deprecated since 1.22
         *
         * @param array|null $fields
-        * @param boolean $override
-        * @param boolean $skipLoaded
+        * @param bool $override
+        * @param bool $skipLoaded
         *
         * @return bool Success indicator
         */
@@ -145,7 +145,7 @@ class ORMRow implements IORMRow {
         * @since 1.20
         *
         * @param string $name Field name
-        * @param $default mixed: Default value to return when none is found
+        * @param mixed $default Default value to return when none is found
         * (default: null)
         *
         * @throws MWException
@@ -167,7 +167,7 @@ class ORMRow implements IORMRow {
         * @since 1.20
         * @deprecated since 1.22
         *
-        * @param $name string
+        * @param string $name
         *
         * @return mixed
         */
@@ -195,7 +195,7 @@ class ORMRow implements IORMRow {
         *
         * @since 1.20
         *
-        * @return integer|null
+        * @return int|null
         */
        public function getId() {
                return $this->getField( 'id' );
@@ -206,7 +206,7 @@ class ORMRow implements IORMRow {
         *
         * @since 1.20
         *
-        * @param integer|null $id
+        * @param int|null $id
         */
        public function setId( $id ) {
                $this->setField( 'id', $id );
@@ -219,7 +219,7 @@ class ORMRow implements IORMRow {
         *
         * @param string $name
         *
-        * @return boolean
+        * @return bool
         */
        public function hasField( $name ) {
                return array_key_exists( $name, $this->fields );
@@ -230,7 +230,7 @@ class ORMRow implements IORMRow {
         *
         * @since 1.20
         *
-        * @return boolean
+        * @return bool
         */
        public function hasIdField() {
                return $this->hasField( 'id' ) && !is_null( $this->getField( 'id' ) );
@@ -278,7 +278,7 @@ class ORMRow implements IORMRow {
         * @since 1.20
         *
         * @param array $fields The fields to set
-        * @param boolean $override Override already set fields with the provided values?
+        * @param bool $override Override already set fields with the provided values?
         */
        public function setFields( array $fields, $override = true ) {
                foreach ( $fields as $name => $value ) {
@@ -295,7 +295,7 @@ class ORMRow implements IORMRow {
         * @since 1.20
         *
         * @param null|array $fields
-        * @param boolean $incNullId
+        * @param bool $incNullId
         *
         * @return array
         */
@@ -328,7 +328,7 @@ class ORMRow implements IORMRow {
         * @since 1.20
         * @deprecated since 1.22
         *
-        * @param boolean $override
+        * @param bool $override
         */
        public function loadDefaults( $override = true ) {
                $this->setFields( $this->table->getDefaults(), $override );
@@ -343,7 +343,7 @@ class ORMRow implements IORMRow {
         *
         * @param string|null $functionName
         *
-        * @return boolean Success indicator
+        * @return bool Success indicator
         */
        public function save( $functionName = null ) {
                if ( $this->hasIdField() ) {
@@ -361,7 +361,7 @@ class ORMRow implements IORMRow {
         *
         * @param string|null $functionName
         *
-        * @return boolean Success indicator
+        * @return bool Success indicator
         */
        protected function saveExisting( $functionName = null ) {
                $dbw = $this->table->getWriteDbConnection();
@@ -400,7 +400,7 @@ class ORMRow implements IORMRow {
         * @param string|null $functionName
         * @param array|null $options
         *
-        * @return boolean Success indicator
+        * @return bool Success indicator
         */
        protected function insert( $functionName = null, array $options = null ) {
                $dbw = $this->table->getWriteDbConnection();
@@ -430,7 +430,7 @@ class ORMRow implements IORMRow {
         * @since 1.20
         * @deprecated since 1.22, use IORMTable->removeRow
         *
-        * @return boolean Success indicator
+        * @return bool Success indicator
         */
        public function remove() {
                $this->beforeRemove();
@@ -524,9 +524,9 @@ class ORMRow implements IORMRow {
         * @deprecated since 1.22, use IORMTable->addToField
         *
         * @param string $field
-        * @param integer $amount
+        * @param int $amount
         *
-        * @return boolean Success indicator
+        * @return bool Success indicator
         */
        public function addToField( $field, $amount ) {
                return $this->table->addToField( $this->getUpdateConditions(), $field, $amount );
@@ -561,7 +561,7 @@ class ORMRow implements IORMRow {
         * @since 1.20
         * @deprecated since 1.22
         *
-        * @param boolean $update
+        * @param bool $update
         */
        public function setUpdateSummaries( $update ) {
                $this->updateSummaries = $update;
@@ -573,7 +573,7 @@ class ORMRow implements IORMRow {
         * @since 1.20
         * @deprecated since 1.22
         *
-        * @param boolean $summaryMode
+        * @param bool $summaryMode
         */
        public function setSummaryMode( $summaryMode ) {
                $this->inSummaryMode = $summaryMode;
index 3f91e0a..51b81da 100644 (file)
@@ -80,7 +80,7 @@ class ORMTable extends DBAccessBase implements IORMTable {
         *
         * @since 1.20
         *
-        * @var integer DB_ enum
+        * @var int DB_ enum
         */
        protected $readDb = DB_SLAVE;
 
@@ -311,7 +311,7 @@ class ORMTable extends DBAccessBase implements IORMTable {
         * @param array|string|null $fields
         * @param array $conditions
         * @param array $options
-        * @param boolean $collapse Set to false to always return each result row as associative array.
+        * @param bool $collapse Set to false to always return each result row as associative array.
         * @param string|null $functionName
         *
         * @return array of array
@@ -410,7 +410,7 @@ class ORMTable extends DBAccessBase implements IORMTable {
         * @param array|string|null $fields
         * @param array $conditions
         * @param array $options
-        * @param boolean $collapse Set to false to always return each result row as associative array.
+        * @param bool $collapse Set to false to always return each result row as associative array.
         * @param string|null $functionName
         *
         * @return mixed|array|bool False on failure
@@ -433,7 +433,7 @@ class ORMTable extends DBAccessBase implements IORMTable {
         *
         * @param array $conditions
         *
-        * @return boolean
+        * @return bool
         */
        public function has( array $conditions = array() ) {
                return $this->selectRow( array( 'id' ), $conditions ) !== false;
@@ -444,7 +444,7 @@ class ORMTable extends DBAccessBase implements IORMTable {
         *
         * @since 1.21
         *
-        * @return boolean
+        * @return bool
         */
        public function exists() {
                $dbr = $this->getReadDbConnection();
@@ -466,7 +466,7 @@ class ORMTable extends DBAccessBase implements IORMTable {
         * @param array $conditions
         * @param array $options
         *
-        * @return integer
+        * @return int
         */
        public function count( array $conditions = array(), array $options = array() ) {
                $res = $this->rawSelectRow(
@@ -487,7 +487,7 @@ class ORMTable extends DBAccessBase implements IORMTable {
         * @param array $conditions
         * @param string|null $functionName
         *
-        * @return boolean Success indicator
+        * @return bool Success indicator
         */
        public function delete( array $conditions, $functionName = null ) {
                $dbw = $this->getWriteDbConnection();
@@ -508,8 +508,8 @@ class ORMTable extends DBAccessBase implements IORMTable {
         *
         * @since 1.20
         *
-        * @param boolean $requireParams
-        * @param boolean $setDefaults
+        * @param bool $requireParams
+        * @param bool $setDefaults
         *
         * @return array
         */
@@ -572,7 +572,7 @@ class ORMTable extends DBAccessBase implements IORMTable {
         *
         * @since 1.20
         *
-        * @return integer DB_ enum
+        * @return int DB_ enum
         */
        public function getReadDb() {
                return $this->readDb;
@@ -582,7 +582,7 @@ class ORMTable extends DBAccessBase implements IORMTable {
         * Set the database ID to use for read operations, use DB_XXX constants or
         *   an index to the load balancer setup.
         *
-        * @param integer $db
+        * @param int $db
         *
         * @since 1.20
         */
@@ -595,7 +595,7 @@ class ORMTable extends DBAccessBase implements IORMTable {
         *
         * @since 1.20
         *
-        * @return String|bool The target wiki, in a form that LBFactory understands
+        * @return string|bool The target wiki, in a form that LBFactory understands
         *   (or false if the local wiki is used)
         */
        public function getTargetWiki() {
@@ -668,7 +668,7 @@ class ORMTable extends DBAccessBase implements IORMTable {
         * @param array $values
         * @param array $conditions
         *
-        * @return boolean Success indicator
+        * @return bool Success indicator
         */
        public function update( array $values, array $conditions = array() ) {
                $dbw = $this->getWriteDbConnection();
@@ -888,7 +888,7 @@ class ORMTable extends DBAccessBase implements IORMTable {
        /**
         * @see ORMTable::newRowFromFromDBResult
         *
-        * @deprecated use newRowFromDBResult instead
+        * @deprecated since 1.20 use newRowFromDBResult instead
         * @since 1.20
         *
         * @param stdClass $result
@@ -915,11 +915,11 @@ class ORMTable extends DBAccessBase implements IORMTable {
        /**
         * @see ORMTable::newRow
         *
-        * @deprecated use newRow instead
+        * @deprecated since 1.20 use newRow instead
         * @since 1.20
         *
         * @param array $data
-        * @param boolean $loadDefaults
+        * @param bool $loadDefaults
         *
         * @return IORMRow
         */
@@ -933,7 +933,7 @@ class ORMTable extends DBAccessBase implements IORMTable {
         * @since 1.20
         *
         * @param array $fields
-        * @param boolean $loadDefaults
+        * @param bool $loadDefaults
         *
         * @return IORMRow
         */
@@ -961,7 +961,7 @@ class ORMTable extends DBAccessBase implements IORMTable {
         *
         * @param string $name
         *
-        * @return boolean
+        * @return bool
         */
        public function canHaveField( $name ) {
                return array_key_exists( $name, $this->getFields() );
@@ -975,7 +975,7 @@ class ORMTable extends DBAccessBase implements IORMTable {
         * @param IORMRow $row The row to save
         * @param string|null $functionName
         *
-        * @return boolean Success indicator
+        * @return bool Success indicator
         */
        public function updateRow( IORMRow $row, $functionName = null ) {
                $dbw = $this->getWriteDbConnection();
@@ -1002,7 +1002,7 @@ class ORMTable extends DBAccessBase implements IORMTable {
         * @param string|null $functionName
         * @param array|null $options
         *
-        * @return boolean Success indicator
+        * @return bool Success indicator
         */
        public function insertRow( IORMRow $row, $functionName = null, array $options = null ) {
                $dbw = $this->getWriteDbConnection();
@@ -1068,7 +1068,7 @@ class ORMTable extends DBAccessBase implements IORMTable {
         * @param IORMRow $row
         * @param string|null $functionName
         *
-        * @return boolean Success indicator
+        * @return bool Success indicator
         */
        public function removeRow( IORMRow $row, $functionName = null ) {
                $success = $this->delete(
@@ -1087,9 +1087,9 @@ class ORMTable extends DBAccessBase implements IORMTable {
         *
         * @param array $conditions
         * @param string $field
-        * @param integer $amount
+        * @param int $amount
         *
-        * @return boolean Success indicator
+        * @return bool Success indicator
         * @throws MWException
         */
        public function addToField( array $conditions, $field, $amount ) {
index 86f3dda..2117010 100644 (file)
@@ -82,7 +82,7 @@ class MWDebug {
         * enabled.
         *
         * @since 1.19
-        * @param $out OutputPage
+        * @param OutputPage $out
         */
        public static function addModules( OutputPage $out ) {
                if ( self::$enabled ) {
@@ -96,7 +96,7 @@ class MWDebug {
         * @todo Add support for passing objects
         *
         * @since 1.19
-        * @param $str string
+        * @param string $str
         */
        public static function log( $str ) {
                if ( !self::$enabled ) {
@@ -132,12 +132,12 @@ class MWDebug {
         * Adds a warning entry to the log
         *
         * @since 1.19
-        * @param $msg string
-        * @param $callerOffset int
-        * @param $level int A PHP error level. See sendMessage()
-        * @param $log string: 'production' will always trigger a php error, 'auto'
-        *        will trigger an error if $wgDevelopmentWarnings is true, and 'debug'
-        *        will only write to the debug log(s).
+        * @param string $msg
+        * @param int $callerOffset
+        * @param int $level A PHP error level. See sendMessage()
+        * @param string $log 'production' will always trigger a php error, 'auto'
+        *    will trigger an error if $wgDevelopmentWarnings is true, and 'debug'
+        *    will only write to the debug log(s).
         *
         * @return mixed
         */
@@ -178,8 +178,8 @@ class MWDebug {
         * @param string $function Function that is deprecated.
         * @param string|bool $version Version in which the function was deprecated.
         * @param string|bool $component Component to which the function belongs.
-        *     If false, it is assumbed the function is in MediaWiki core.
-        * @param $callerOffset integer: How far up the callstack is the original
+        *    If false, it is assumbed the function is in MediaWiki core.
+        * @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
@@ -253,9 +253,9 @@ class MWDebug {
        /**
         * Get an array describing the calling function at a specified offset.
         *
-        * @param $callerOffset integer: How far up the callstack is the original
+        * @param int $callerOffset How far up the callstack is the original
         *    caller. 0 = function that called getCallerDescription()
-        * @return array with two keys: 'file' and 'func'
+        * @return array Array with two keys: 'file' and 'func'
         */
        private static function getCallerDescription( $callerOffset ) {
                $callers = wfDebugBacktrace();
@@ -291,10 +291,10 @@ class MWDebug {
         * Send a message to the debug log and optionally also trigger a PHP
         * error, depending on the $level argument.
         *
-        * @param $msg string Message to send
-        * @param $caller array caller description get from getCallerDescription()
-        * @param $group string log group on which to send the message
-        * @param $level int|bool error level to use; set to false to not trigger an error
+        * @param string $msg Message to send
+        * @param array $caller Caller description get from getCallerDescription()
+        * @param string $group Log group on which to send the message
+        * @param int|bool $level Error level to use; set to false to not trigger an error
         */
        private static function sendMessage( $msg, $caller, $group, $level ) {
                $msg .= ' [Called from ' . $caller['func'] . ' in ' . $caller['file'] . ']';
@@ -311,7 +311,7 @@ class MWDebug {
         * Do NOT use this method, use MWDebug::log or wfDebug()
         *
         * @since 1.19
-        * @param $str string
+        * @param string $str
         */
        public static function debugMsg( $str ) {
                global $wgDebugComments, $wgShowDebug;
@@ -325,9 +325,9 @@ class MWDebug {
         * Begins profiling on a database query
         *
         * @since 1.19
-        * @param $sql string
-        * @param $function string
-        * @param $isMaster bool
+        * @param string $sql
+        * @param string $function
+        * @param bool $isMaster
         * @return int ID number of the query to pass to queryTime or -1 if the
         *  debugger is disabled
         */
@@ -351,7 +351,7 @@ class MWDebug {
         * Calculates how long a query took.
         *
         * @since 1.19
-        * @param $id int
+        * @param int $id
         */
        public static function queryTime( $id ) {
                if ( $id === -1 || !self::$enabled ) {
@@ -365,7 +365,7 @@ class MWDebug {
        /**
         * Returns a list of files included, along with their size
         *
-        * @param $context IContextSource
+        * @param IContextSource $context
         * @return array
         */
        protected static function getFilesIncluded( IContextSource $context ) {
@@ -386,7 +386,7 @@ class MWDebug {
         * Returns the HTML to add to the page for the toolbar
         *
         * @since 1.19
-        * @param $context IContextSource
+        * @param IContextSource $context
         * @return string
         */
        public static function getDebugHTML( IContextSource $context ) {
@@ -485,8 +485,8 @@ class MWDebug {
        /**
         * Append the debug info to given ApiResult
         *
-        * @param $context IContextSource
-        * @param $result ApiResult
+        * @param IContextSource $context
+        * @param ApiResult $result
         */
        public static function appendDebugInfoToApiResult( IContextSource $context, ApiResult $result ) {
                if ( !self::$enabled ) {
@@ -519,7 +519,7 @@ class MWDebug {
        /**
         * Returns the HTML to add to the page for the toolbar
         *
-        * @param $context IContextSource
+        * @param IContextSource $context
         * @return array
         */
        public static function getDebugInfo( IContextSource $context ) {
index f0569dd..808626d 100644 (file)
@@ -5,7 +5,7 @@
  */
 class MWCallableUpdate implements DeferrableUpdate {
        /**
-        * @var closure/callback
+        * @var Closure|callable
         */
        private $callback;
 
index 0713a05..54fa594 100644 (file)
@@ -54,8 +54,8 @@ class HTMLCacheUpdate implements DeferrableUpdate {
                        )
                );
 
-               $count = $this->mTitle->getBacklinkCache()->getNumLinks( $this->mTable, 200 );
-               if ( $count >= 200 ) { // many backlinks
+               $count = $this->mTitle->getBacklinkCache()->getNumLinks( $this->mTable, 100 );
+               if ( $count >= 100 ) { // many backlinks
                        JobQueueGroup::singleton()->push( $job );
                        JobQueueGroup::singleton()->deduplicateRootJob( $job );
                } else { // few backlinks ($count might be off even if 0)
index abd44fd..0789b21 100644 (file)
@@ -502,18 +502,69 @@ class LinksUpdate extends SqlDataUpdate {
         */
        function getPropertyInsertions( $existing = array() ) {
                $diffs = array_diff_assoc( $this->mProperties, $existing );
+
                $arr = array();
-               foreach ( $diffs as $name => $value ) {
-                       $arr[] = array(
-                               'pp_page' => $this->mId,
-                               'pp_propname' => $name,
-                               'pp_value' => $value,
-                       );
+               foreach ( array_keys( $diffs ) as $name ) {
+                       $arr[] = $this->getPagePropRowData( $name );
                }
 
                return $arr;
        }
 
+       /**
+        * Returns an associative array to be used for inserting a row into
+        * the page_props table. Besides the given property name, this will
+        * include the page id from $this->mId and any property value from
+        * $this->mProperties.
+        *
+        * The array returned will include the pp_sortkey field if this
+        * is present in the database (as indicated by $wgPagePropsHaveSortkey).
+        * The sortkey value is currently determined by getPropertySortKeyValue().
+        *
+        * @note: this assumes that $this->mProperties[$prop] is defined.
+        *
+        * @param string $prop The name of the property.
+        *
+        * @return array
+        */
+       private function getPagePropRowData( $prop ) {
+               global $wgPagePropsHaveSortkey;
+
+               $value = $this->mProperties[$prop];
+
+               $row = array(
+                       'pp_page' => $this->mId,
+                       'pp_propname' => $prop,
+                       'pp_value' => $value,
+               );
+
+               if ( $wgPagePropsHaveSortkey ) {
+                       $row['pp_sortkey'] = $this->getPropertySortKeyValue( $value );
+               }
+
+               return $row;
+       }
+
+       /**
+        * Determines the sort key for the given property value.
+        * This will return $value if it is a float or int,
+        * 1 or resp. 0 if it is a bool, and null otherwise.
+        *
+        * @note: In the future, we may allow the sortkey to be specified explicitly
+        *        in ParserOutput::setProperty.
+        *
+        * @param mixed $value
+        *
+        * @return float|null
+        */
+       private function getPropertySortKeyValue( $value ) {
+               if ( is_int( $value ) || is_float( $value ) || is_bool( $value ) ) {
+                       return floatval( $value );
+               }
+
+               return null;
+       }
+
        /**
         * Get an array of interwiki insertions for passing to the DB
         * Skips the titles specified by the 2-D array $existing
index 06df440..9ae9034 100644 (file)
@@ -35,7 +35,7 @@ class SearchUpdate implements DeferrableUpdate {
        /** @var Title Title we're updating */
        private $title;
 
-       /** @var Content|false Content of the page (not text) */
+       /** @var Content|bool Content of the page (not text) */
        private $content;
 
        /**
@@ -179,7 +179,7 @@ class SearchUpdate implements DeferrableUpdate {
         * Get a string representation of a title suitable for
         * including in a search index
         *
-        * @return String a stripped-down title string ready for the search index
+        * @return string A stripped-down title string ready for the search index
         */
        private function indexTitle() {
                global $wgContLang;
index 0e38d68..a4c0168 100644 (file)
@@ -424,7 +424,9 @@ class DiffEngine {
                        }
 
                        $x1 = $xoff + (int)( ( $numer + ( $xlim - $xoff ) * $chunk ) / $nchunks );
+                       // @codingStandardsIgnoreFile Ignore Squiz.WhiteSpace.SemicolonSpacing.Incorrect
                        for ( ; $x < $x1; $x++ ) {
+                               // @codingStandardsIgnoreEnd
                                $line = $flip ? $this->yv[$x] : $this->xv[$x];
                                if ( empty( $ymatches[$line] ) ) {
                                        continue;
index 2b8cb00..58b07f5 100644 (file)
@@ -135,7 +135,8 @@ class MWException extends Exception {
 
                if ( $wgShowExceptionDetails ) {
                        return '<p>' . nl2br( htmlspecialchars( MWExceptionHandler::getLogMessage( $this ) ) ) .
-                       '</p><p>Backtrace:</p><p>' . nl2br( htmlspecialchars( MWExceptionHandler::getRedactedTraceAsString( $this ) ) ) .
+                       '</p><p>Backtrace:</p><p>' .
+                       nl2br( htmlspecialchars( MWExceptionHandler::getRedactedTraceAsString( $this ) ) ) .
                        "</p>\n";
                } else {
                        return "<div class=\"errorbox\">" .
@@ -176,31 +177,6 @@ class MWException extends Exception {
                return $this->msg( 'internalerror', 'Internal error' );
        }
 
-       /**
-        * Get a the ID for this error.
-        *
-        * @since 1.20
-        * @deprecated since 1.22 Use MWExceptionHandler::getLogId instead.
-        * @return string
-        */
-       public function getLogId() {
-               wfDeprecated( __METHOD__, '1.22' );
-               return MWExceptionHandler::getLogId( $this );
-       }
-
-       /**
-        * Return the requested URL and point to file and line number from which the
-        * exception occurred
-        *
-        * @since 1.8
-        * @deprecated since 1.22 Use MWExceptionHandler::getLogMessage instead.
-        * @return string
-        */
-       public function getLogMessage() {
-               wfDeprecated( __METHOD__, '1.22' );
-               return MWExceptionHandler::getLogMessage( $this );
-       }
-
        /**
         * Output the exception report using HTML.
         */
@@ -218,11 +194,13 @@ class MWException extends Exception {
 
                        $wgOut->output();
                } else {
-                       header( 'Content-Type: text/html; charset=utf-8' );
+                       self::header( 'Content-Type: text/html; charset=utf-8' );
                        echo "<!DOCTYPE html>\n" .
                                '<html><head>' .
                                // Mimick OutputPage::setPageTitle behaviour
-                               '<title>' . htmlspecialchars( $this->msg( 'pagetitle', "$1 - $wgSitename", $this->getPageTitle() ) ) . '</title>' .
+                               '<title>' .
+                               htmlspecialchars( $this->msg( 'pagetitle', "$1 - $wgSitename", $this->getPageTitle() ) ) .
+                               '</title>' .
                                '<style>body { font-family: sans-serif; margin: 0; padding: 0.5em 2em; }</style>' .
                                "</head><body>\n";
 
@@ -248,14 +226,14 @@ class MWException extends Exception {
 
                if ( defined( 'MW_API' ) ) {
                        // Unhandled API exception, we can't be sure that format printer is alive
-                       header( 'MediaWiki-API-Error: internal_api_error_' . get_class( $this ) );
+                       self::header( 'MediaWiki-API-Error: internal_api_error_' . get_class( $this ) );
                        wfHttpError( 500, 'Internal Server Error', $this->getText() );
                } elseif ( self::isCommandLine() ) {
                        MWExceptionHandler::printError( $this->getText() );
                } else {
-                       header( 'HTTP/1.1 500 MediaWiki exception' );
-                       header( 'Status: 500 MediaWiki exception', true );
-                       header( "Content-Type: $wgMimeType; charset=utf-8", true );
+                       self::header( 'HTTP/1.1 500 MediaWiki exception' );
+                       self::header( 'Status: 500 MediaWiki exception' );
+                       self::header( "Content-Type: $wgMimeType; charset=utf-8" );
 
                        $this->reportHTML();
                }
@@ -270,4 +248,14 @@ class MWException extends Exception {
        public static function isCommandLine() {
                return !empty( $GLOBALS['wgCommandLineMode'] );
        }
+
+       /**
+        * Send a header, if we haven't already sent them. We shouldn't,
+        * but sometimes we might in a weird case like Export
+        */
+       private static function header( $header ) {
+               if ( !headers_sent() ) {
+                       header( $header );
+               }
+       }
 }
index 34f6b51..4575e7c 100644 (file)
@@ -45,7 +45,7 @@ class FSFile {
        /**
         * Returns the file system path
         *
-        * @return String
+        * @return string
         */
        public function getPath() {
                return $this->path;
index 8438919..9586657 100644 (file)
@@ -90,6 +90,10 @@ class FSFileBackend extends FileBackendStore {
                }
        }
 
+       public function getFeatures() {
+               return !wfIsWindows() ? FileBackend::ATTR_UNICODE_PATHS : 0;
+       }
+
        protected function resolveContainerPath( $container, $relStoragePath ) {
                // Check that container has a root directory
                if ( isset( $this->containerPaths[$container] ) || isset( $this->basePath ) ) {
@@ -454,7 +458,7 @@ class FSFileBackend extends FileBackendStore {
 
        /**
         * @param string $fullCont
-        * @param $dirRel
+        * @param string $dirRel
         * @param array $params
         * @return Status
         */
index c759725..2820be2 100644 (file)
@@ -104,9 +104,10 @@ abstract class FileBackend {
        /** @var FileJournal */
        protected $fileJournal;
 
-       /** Flags for supported features */
-       const ATTR_HEADERS = 1;
-       const ATTR_METADATA = 2;
+       /** Bitfield flags for supported features */
+       const ATTR_HEADERS = 1; // files can be tagged with standard HTTP headers
+       const ATTR_METADATA = 2; // files can be stored with metadata key/values
+       const ATTR_UNICODE_PATHS = 4; // files can have Unicode paths (not just ASCII)
 
        /**
         * Create a new backend instance from configuration.
@@ -207,17 +208,17 @@ abstract class FileBackend {
        /**
         * Get the a bitfield of extra features supported by the backend medium
         *
-        * @return integer Bitfield of FileBackend::ATTR_* flags
+        * @return int Bitfield of FileBackend::ATTR_* flags
         * @since 1.23
         */
        public function getFeatures() {
-               return 0;
+               return self::ATTR_UNICODE_PATHS;
        }
 
        /**
         * Check if the backend medium supports a field of extra features
         *
-        * @return integer Bitfield of FileBackend::ATTR_* flags
+        * @return int Bitfield of FileBackend::ATTR_* flags
         * @return bool
         * @since 1.23
         */
@@ -941,7 +942,7 @@ abstract class FileBackend {
         * $params include:
         *   - src    : source storage path
         *   - latest : use the latest available data
-        * @return Array|bool Returns false on failure
+        * @return array|bool Returns false on failure
         * @since 1.23
         */
        abstract public function getFileXAttributes( array $params );
@@ -1128,7 +1129,7 @@ abstract class FileBackend {
         * @param array $params Parameters include:
         *   - dir     : storage directory
         *   - topOnly : only return direct child dirs of the directory
-        * @return Traversable|Array|null Returns null on failure
+        * @return Traversable|array|null Returns null on failure
         * @since 1.20
         */
        abstract public function getDirectoryList( array $params );
@@ -1143,7 +1144,7 @@ abstract class FileBackend {
         *
         * @param array $params Parameters include:
         *   - dir : storage directory
-        * @return Traversable|Array|null Returns null on failure
+        * @return Traversable|array|null Returns null on failure
         * @since 1.20
         */
        final public function getTopDirectoryList( array $params ) {
@@ -1166,7 +1167,7 @@ abstract class FileBackend {
         *   - dir        : storage directory
         *   - topOnly    : only return direct child files of the directory (since 1.20)
         *   - adviseStat : set to true if stat requests will be made on the files (since 1.22)
-        * @return Traversable|Array|null Returns null on failure
+        * @return Traversable|array|null Returns null on failure
         */
        abstract public function getFileList( array $params );
 
@@ -1181,7 +1182,7 @@ abstract class FileBackend {
         * @param array $params Parameters include:
         *   - dir        : storage directory
         *   - adviseStat : set to true if stat requests will be made on the files (since 1.22)
-        * @return Traversable|Array|null Returns null on failure
+        * @return Traversable|array|null Returns null on failure
         * @since 1.20
         */
        final public function getTopFileList( array $params ) {
@@ -1217,10 +1218,10 @@ abstract class FileBackend {
         * @param array $params Parameters include:
         *   - srcs        : list of source storage paths
         *   - latest      : use the latest available data
+        * @return bool All requests proceeded without I/O errors (since 1.24)
         * @since 1.23
         */
-       public function preloadFileStat( array $params ) {
-       }
+       abstract public function preloadFileStat( array $params );
 
        /**
         * Lock the files at the given storage paths in the backend.
@@ -1230,12 +1231,13 @@ abstract class FileBackend {
         *
         * @param array $paths Storage paths
         * @param int $type LockManager::LOCK_* constant
+        * @param int $timeout Timeout in seconds (0 means non-blocking) (since 1.24)
         * @return Status
         */
-       final public function lockFiles( array $paths, $type ) {
+       final public function lockFiles( array $paths, $type, $timeout = 0 ) {
                $paths = array_map( 'FileBackend::normalizeStoragePath', $paths );
 
-               return $this->lockManager->lock( $paths, $type );
+               return $this->lockManager->lock( $paths, $type, $timeout );
        }
 
        /**
@@ -1264,9 +1266,10 @@ abstract class FileBackend {
         * @param array $paths List of storage paths or map of lock types to path lists
         * @param int|string $type LockManager::LOCK_* constant or "mixed"
         * @param Status $status Status to update on lock/unlock
+        * @param int $timeout Timeout in seconds (0 means non-blocking) (since 1.24)
         * @return ScopedLock|null Returns null on failure
         */
-       final public function getScopedFileLocks( array $paths, $type, Status $status ) {
+       final public function getScopedFileLocks( array $paths, $type, Status $status, $timeout = 0 ) {
                if ( $type === 'mixed' ) {
                        foreach ( $paths as &$typePaths ) {
                                $typePaths = array_map( 'FileBackend::normalizeStoragePath', $typePaths );
@@ -1275,7 +1278,7 @@ abstract class FileBackend {
                        $paths = array_map( 'FileBackend::normalizeStoragePath', $paths );
                }
 
-               return ScopedLock::factory( $this->lockManager, $paths, $type, $status );
+               return ScopedLock::factory( $this->lockManager, $paths, $type, $status, $timeout );
        }
 
        /**
@@ -1402,12 +1405,20 @@ abstract class FileBackend {
         * Get the final extension from a storage or FS path
         *
         * @param string $path
+        * @param string $case One of (rawcase, uppercase, lowercase) (since 1.24)
         * @return string
         */
-       final public static function extensionFromPath( $path ) {
+       final public static function extensionFromPath( $path, $case = 'lowercase' ) {
                $i = strrpos( $path, '.' );
+               $ext = $i ? substr( $path, $i + 1 ) : '';
+
+               if ( $case === 'lowercase' ) {
+                       $ext = strtolower( $ext );
+               } elseif ( $case === 'uppercase' ) {
+                       $ext = strtoupper( $ext );
+               }
 
-               return strtolower( $i ? substr( $path, $i + 1 ) : '' );
+               return $ext;
        }
 
        /**
index c39bbaf..bfffcc0 100644 (file)
@@ -669,7 +669,7 @@ class FileBackendMultiWrite extends FileBackend {
 
        public function preloadFileStat( array $params ) {
                $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
-               $this->backends[$this->masterIndex]->preloadFileStat( $realParams );
+               return $this->backends[$this->masterIndex]->preloadFileStat( $realParams );
        }
 
        public function getScopedLocksForOps( array $ops, Status $status ) {
index 2fd1bf6..340c315 100644 (file)
@@ -46,7 +46,7 @@ abstract class FileBackendStore extends FileBackend {
        /** @var array Map of container names to sharding config */
        protected $shardViaHashLevels = array();
 
-       /** @var callback Method to get the MIME type of files */
+       /** @var callable Method to get the MIME type of files */
        protected $mimeCallback;
 
        protected $maxFileSize = 4294967296; // integer bytes (4GiB)
@@ -357,8 +357,8 @@ abstract class FileBackendStore extends FileBackend {
                        $status->merge( $this->doConcatenate( $params ) );
                        $sec = microtime( true ) - $start_time;
                        if ( !$status->isOK() ) {
-                               wfDebugLog( 'FileOperation', get_class( $this ) . " failed to concatenate " .
-                                       count( $params['srcs'] ) . " file(s) [$sec sec]" );
+                               wfDebugLog( 'FileOperation', get_class( $this ) . "-{$this->name}" .
+                                       " failed to concatenate " . count( $params['srcs'] ) . " file(s) [$sec sec]" );
                        }
                }
 
@@ -464,7 +464,7 @@ abstract class FileBackendStore extends FileBackend {
 
        /**
         * @see FileBackendStore::doPrepare()
-        * @param $container
+        * @param string $container
         * @param string $dir
         * @param array $params
         * @return Status
@@ -499,7 +499,7 @@ abstract class FileBackendStore extends FileBackend {
 
        /**
         * @see FileBackendStore::doSecure()
-        * @param $container
+        * @param string $container
         * @param string $dir
         * @param array $params
         * @return Status
@@ -534,7 +534,7 @@ abstract class FileBackendStore extends FileBackend {
 
        /**
         * @see FileBackendStore::doPublish()
-        * @param $container
+        * @param string $container
         * @param string $dir
         * @param array $params
         * @return Status
@@ -590,7 +590,7 @@ abstract class FileBackendStore extends FileBackend {
 
        /**
         * @see FileBackendStore::doClean()
-        * @param $container
+        * @param string $container
         * @param string $dir
         * @param array $params
         * @return Status
@@ -962,7 +962,7 @@ abstract class FileBackendStore extends FileBackend {
         * @param string $container Resolved container name
         * @param string $dir Resolved path relative to container
         * @param array $params
-        * @return Traversable|Array|null Returns null on failure
+        * @return Traversable|array|null Returns null on failure
         */
        abstract public function getDirectoryListInternal( $container, $dir, array $params );
 
@@ -992,7 +992,7 @@ abstract class FileBackendStore extends FileBackend {
         * @param string $container Resolved container name
         * @param string $dir Resolved path relative to container
         * @param array $params
-        * @return Traversable|Array|null Returns null on failure
+        * @return Traversable|array|null Returns null on failure
         */
        abstract public function getFileListInternal( $container, $dir, array $params );
 
@@ -1102,19 +1102,37 @@ abstract class FileBackendStore extends FileBackend {
                        $paths = array_merge( $paths, $op->storagePathsRead() );
                        $paths = array_merge( $paths, $op->storagePathsChanged() );
                }
+
+               // Enlarge the cache to fit the stat entries of these files
+               $this->cheapCache->resize( max( 2 * count( $paths ), self::CACHE_CHEAP_SIZE ) );
+
                // Load from the persistent container caches
                $this->primeContainerCache( $paths );
                // Get the latest stat info for all the files (having locked them)
-               $this->preloadFileStat( array( 'srcs' => $paths, 'latest' => true ) );
+               $ok = $this->preloadFileStat( array( 'srcs' => $paths, 'latest' => true ) );
 
-               // Actually attempt the operation batch...
-               $opts = $this->setConcurrencyFlags( $opts );
-               $subStatus = FileOpBatch::attempt( $performOps, $opts, $this->fileJournal );
+               if ( $ok ) {
+                       // Actually attempt the operation batch...
+                       $opts = $this->setConcurrencyFlags( $opts );
+                       $subStatus = FileOpBatch::attempt( $performOps, $opts, $this->fileJournal );
+               } else {
+                       // If we could not even stat some files, then bail out...
+                       $subStatus = Status::newFatal( 'backend-fail-internal', $this->name );
+                       foreach ( $ops as $i => $op ) { // mark each op as failed
+                               $subStatus->success[$i] = false;
+                               ++$subStatus->failCount;
+                       }
+                       wfDebugLog( 'FileOperation', get_class( $this ) . "-{$this->name} " .
+                               " stat failure; aborted operations: " . FormatJson::encode( $ops ) );
+               }
 
                // Merge errors into status fields
                $status->merge( $subStatus );
                $status->success = $subStatus->success; // not done in merge()
 
+               // Shrink the stat cache back to normal size
+               $this->cheapCache->resize( self::CACHE_CHEAP_SIZE );
+
                return $status;
        }
 
@@ -1282,11 +1300,12 @@ abstract class FileBackendStore extends FileBackend {
 
        final public function preloadFileStat( array $params ) {
                $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
+               $success = true; // no network errors
 
                $params['concurrency'] = ( $this->parallelize !== 'off' ) ? $this->concurrency : 1;
                $stats = $this->doGetFileStatMulti( $params );
                if ( $stats === null ) {
-                       return; // not supported
+                       return true; // not supported
                }
 
                $latest = !empty( $params['latest'] ); // use latest data?
@@ -1318,9 +1337,12 @@ abstract class FileBackendStore extends FileBackend {
                                        array( 'hash' => false, 'latest' => $latest ) );
                                wfDebug( __METHOD__ . ": File $path does not exist.\n" );
                        } else { // an error occurred
+                               $success = false;
                                wfDebug( __METHOD__ . ": Could not stat file $path.\n" );
                        }
                }
+
+               return $success;
        }
 
        /**
index 4e03675..66d8794 100644 (file)
@@ -178,7 +178,7 @@ abstract class FileOp {
         * Check if this operation changes files listed in $paths
         *
         * @param array $deps Prior path reads/writes; format of FileOp::newPredicates()
-        * @return boolean
+        * @return bool
         */
        final public function dependsOn( array $deps ) {
                foreach ( $this->storagePathsChanged() as $path ) {
index 174f9f3..9249a09 100644 (file)
@@ -146,7 +146,8 @@ class SwiftFileBackend extends FileBackendStore {
        }
 
        public function getFeatures() {
-               return ( FileBackend::ATTR_HEADERS | FileBackend::ATTR_METADATA );
+               return ( FileBackend::ATTR_UNICODE_PATHS |
+                       FileBackend::ATTR_HEADERS | FileBackend::ATTR_METADATA );
        }
 
        protected function resolveContainerPath( $container, $relStoragePath ) {
@@ -1064,11 +1065,14 @@ class SwiftFileBackend extends FileBackendStore {
                foreach ( $reqs as $path => $op ) {
                        list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $op['response'];
                        fclose( $op['stream'] ); // close open handle
-                       if ( $rcode >= 200 && $rcode <= 299
-                               // double check that the disk is not full/broken
-                               && $tmpFiles[$path]->getSize() == $rhdrs['content-length']
-                       ) {
-                               // good
+                       if ( $rcode >= 200 && $rcode <= 299 ) {
+                               // Double check that the disk is not full/broken
+                               if ( $tmpFiles[$path]->getSize() != $rhdrs['content-length'] ) {
+                                       $tmpFiles[$path] = null;
+                                       $rerr = "Got {$tmpFiles[$path]->getSize()}/{$rhdrs['content-length']} bytes";
+                                       $this->onError( null, __METHOD__,
+                                               array( 'src' => $path ) + $ep, $rerr, $rcode, $rdesc );
+                               }
                        } elseif ( $rcode === 404 ) {
                                $tmpFiles[$path] = false;
                        } else {
@@ -1394,7 +1398,7 @@ class SwiftFileBackend extends FileBackendStore {
         *
         * @param string $fullCont
         * @param string $type ('info' for a list of object detail maps, 'names' for names only)
-        * @param integer $limit
+        * @param int $limit
         * @param string|null $after
         * @param string|null $prefix
         * @param string|null $delim
@@ -1641,7 +1645,7 @@ class SwiftFileBackend extends FileBackendStore {
         * @param string $func
         * @param array $params
         * @param string $err Error string
-        * @param integer $code HTTP status
+        * @param int $code HTTP status
         * @param string $desc HTTP status description
         */
        public function onError( $status, $func, array $params, $err = '', $code = 0, $desc = '' ) {
index 611fab9..1b68130 100644 (file)
@@ -34,6 +34,18 @@ class TempFSFile extends FSFile {
        /** @var array Active temp files to purge on shutdown */
        protected static $instances = array();
 
+       /** @var array Map of (path => 1) for paths to delete on shutdown */
+       protected static $pathsCollect = null;
+
+       public function __construct( $path ) {
+               parent::__construct( $path );
+
+               if ( self::$pathsCollect === null ) {
+                       self::$pathsCollect = array();
+                       register_shutdown_function( array( __CLASS__, 'purgeAllOnShutdown' ) );
+               }
+       }
+
        /**
         * Make a new temporary file on the file system.
         * Temporary files may be purged when the file object falls out of scope.
@@ -62,7 +74,7 @@ class TempFSFile extends FSFile {
                        }
                }
                $tmpFile = new self( $path );
-               $tmpFile->canDelete = true; // safely instantiated
+               $tmpFile->autocollect(); // safely instantiated
                wfProfileOut( __METHOD__ );
 
                return $tmpFile;
@@ -79,6 +91,8 @@ class TempFSFile extends FSFile {
                $ok = unlink( $this->path );
                wfRestoreWarnings();
 
+               unset( self::$pathsCollect[$this->path] );
+
                return $ok;
        }
 
@@ -108,6 +122,8 @@ class TempFSFile extends FSFile {
        public function preserve() {
                $this->canDelete = false;
 
+               unset( self::$pathsCollect[$this->path] );
+
                return $this;
        }
 
@@ -119,17 +135,30 @@ class TempFSFile extends FSFile {
        public function autocollect() {
                $this->canDelete = true;
 
+               self::$pathsCollect[$this->path] = 1;
+
                return $this;
        }
 
+       /**
+        * Try to make sure that all files are purged on error
+        *
+        * This method should only be called internally
+        */
+       public static function purgeAllOnShutdown() {
+               foreach ( self::$pathsCollect as $path ) {
+                       wfSuppressWarnings();
+                       unlink( $path );
+                       wfRestoreWarnings();
+               }
+       }
+
        /**
         * Cleans up after the temporary file by deleting it
         */
        function __destruct() {
                if ( $this->canDelete ) {
-                       wfSuppressWarnings();
-                       unlink( $this->path );
-                       wfRestoreWarnings();
+                       $this->purge();
                }
        }
 }
index 0464e03..20c7c35 100644 (file)
@@ -150,9 +150,9 @@ abstract class FileJournal {
         * Get an array of file change log entries.
         * A starting change ID and/or limit can be specified.
         *
-        * @param $start integer Starting change ID or null
-        * @param $limit integer Maximum number of items to return
-        * @param &$next string Updated to the ID of the next entry.
+        * @param int $start Starting change ID or null
+        * @param int $limit Maximum number of items to return
+        * @param string &$next Updated to the ID of the next entry.
         * @return array List of associative arrays, each having:
         *     id         : unique, monotonic, ID for this change
         *     batch_uuid : UUID for an operation batch
index 4418a83..b58e901 100644 (file)
@@ -195,7 +195,7 @@ abstract class DBLockManager extends QuorumLockManager {
         * Checks if the DB has not recently had connection/query errors.
         * This just avoids wasting time on doomed connection attempts.
         *
-        * @param $lockDb string
+        * @param string $lockDb
         * @return bool
         */
        protected function cacheCheckFailures( $lockDb ) {
index 888af37..4c250ba 100644 (file)
@@ -52,7 +52,7 @@ class FileRepo {
        /** @var FileBackend */
        protected $backend;
 
-       /** @var Array Map of zones to config */
+       /** @var array Map of zones to config */
        protected $zones = array();
 
        /** @var string URL of thumb.php */
@@ -296,26 +296,10 @@ class FileRepo {
        }
 
        /**
-        * Get the thumb zone URL configured to be handled by scripts like thumb_handler.php.
-        * This is probably only useful for internal requests, such as from a fast frontend server
-        * to a slower backend server.
-        *
-        * Large sites may use a different host name for uploads than for wikis. In any case, the
-        * wiki configuration is needed in order to use thumb.php. To avoid extracting the wiki ID
-        * from the URL path, one can configure thumb_handler.php to recognize a special path on the
-        * same host name as the wiki that is used for viewing thumbnails.
-        *
-        * @param string $zone one of: public, deleted, temp, thumb
-        * @return string|bool String or false
+        * @return bool Whether non-ASCII path characters are allowed
         */
-       public function getZoneHandlerUrl( $zone ) {
-               if ( isset( $this->zones[$zone]['handlerUrl'] )
-                       && in_array( $zone, array( 'public', 'temp', 'thumb', 'transcoded' ) )
-               ) {
-                       return $this->zones[$zone]['handlerUrl'];
-               }
-
-               return false;
+       public function backendSupportsUnicodePaths() {
+               return ( $this->getBackend()->getFeatures() & FileBackend::ATTR_UNICODE_PATHS );
        }
 
        /**
@@ -966,7 +950,7 @@ class FileRepo {
         *
         * @param string $src Source file system path, storage path, or virtual URL
         * @param string $dst Virtual URL or storage path
-        * @param Array|string|null $options An array consisting of a key named headers
+        * @param array|string|null $options An array consisting of a key named headers
         *   listing extra headers. If a string, taken as content-disposition header.
         *   (Support for array of options new in 1.23)
         * @return FileRepoStatus
@@ -1244,7 +1228,7 @@ class FileRepo {
                        // This will check if the archive file also exists and fail if does.
                        // This is a sanity check to avoid data loss. On Windows and Linux,
                        // copy() will overwrite, so the existence check is vulnerable to
-                       // race conditions unless an functioning LockManager is used.
+                       // race conditions unless a functioning LockManager is used.
                        // LocalFile also uses SELECT FOR UPDATE for synchronization.
                        $operations[] = array(
                                'op' => 'copy',
@@ -1381,7 +1365,7 @@ class FileRepo {
         * @param mixed $srcRel Relative path for the file to be deleted
         * @param mixed $archiveRel Relative path for the archive location.
         *   Relative to a private archive directory.
-        * @return FileRepoStatus object
+        * @return FileRepoStatus
         */
        public function delete( $srcRel, $archiveRel ) {
                $this->assertWritableRepo(); // fail out if read-only
@@ -1536,7 +1520,7 @@ class FileRepo {
         * Properties should ultimately be obtained via FSFile::getProps().
         *
         * @param string $virtualUrl
-        * @return Array
+        * @return array
         */
        public function getFileProps( $virtualUrl ) {
                $path = $this->resolveToStoragePath( $virtualUrl );
@@ -1560,7 +1544,7 @@ class FileRepo {
         * Get the size of a file with a given virtual URL/storage path
         *
         * @param string $virtualUrl
-        * @return integer|bool False on failure
+        * @return int|bool False on failure
         */
        public function getFileSize( $virtualUrl ) {
                $path = $this->resolveToStoragePath( $virtualUrl );
@@ -1635,7 +1619,7 @@ class FileRepo {
        /**
         * Determine if a relative path is valid, i.e. not blank or involving directory traveral
         *
-        * @param $filename string
+        * @param string $filename
         * @return bool
         */
        public function validateFilename( $filename ) {
@@ -1686,7 +1670,7 @@ class FileRepo {
        /**
         * Create a new fatal error
         *
-        * @param $message
+        * @param string $message
         * @return FileRepoStatus
         */
        public function newFatal( $message /*, parameters...*/ ) {
@@ -1734,9 +1718,10 @@ class FileRepo {
         * @return string
         */
        public function getDisplayName() {
-               // We don't name our own repo, return nothing
+               global $wgSitename;
+
                if ( $this->isLocal() ) {
-                       return null;
+                       return $wgSitename;
                }
 
                // 'shared-repo-name-wikimediacommons' is used when $wgUseInstantCommons = true
@@ -1747,7 +1732,7 @@ class FileRepo {
         * Get the portion of the file that contains the origin file name.
         * If that name is too long, then the name "thumbnail.<ext>" will be given.
         *
-        * @param $name string
+        * @param string $name
         * @return string
         */
        public function nameForThumb( $name ) {
index 4be38bf..56848df 100644 (file)
@@ -43,7 +43,7 @@ class FileRepoStatus extends Status {
 
        /**
         * @param FileRepo|bool $repo Default: false
-        * @param $value
+        * @param mixed $value
         * @return FileRepoStatus
         */
        static function newGood( $repo = false, $value = null ) {
index 35ac60f..7f25a00 100644 (file)
@@ -66,7 +66,7 @@ class ForeignAPIRepo extends FileRepo {
        private $mQueryCache = array();
 
        /**
-        * @param $info array|null
+        * @param array|null $info
         */
        function __construct( $info ) {
                global $wgLocalFileRepo;
@@ -319,7 +319,7 @@ class ForeignAPIRepo extends FileRepo {
         * If the url has been requested today, get it from cache
         * Otherwise retrieve remote thumb url, check for local file.
         *
-        * @param string $name is a dbkey form of a title
+        * @param string $name Is a dbkey form of a title
         * @param int $width
         * @param int $height
         * @param string $params Other rendering parameters (page number, etc)
@@ -418,7 +418,7 @@ class ForeignAPIRepo extends FileRepo {
         * @see FileRepo::getZoneUrl()
         * @param string $zone
         * @param string|null $ext Optional file extension
-        * @return String
+        * @return string
         */
        function getZoneUrl( $zone, $ext = null ) {
                switch ( $zone ) {
@@ -501,7 +501,7 @@ class ForeignAPIRepo extends FileRepo {
         * @param string $url
         * @param string $timeout
         * @param array $options
-        * @return bool|String
+        * @return bool|string
         */
        public static function httpGet( $url, $timeout = 'default', $options = array() ) {
                $options['timeout'] = $timeout;
index 18432a1..103e78e 100644 (file)
@@ -90,7 +90,7 @@ class RepoGroup {
         * Construct a group of file repositories.
         *
         * @param array $localInfo Associative array for local repo's info
-        * @param array $foreignInfo of repository info arrays.
+        * @param array $foreignInfo Array of repository info arrays.
         *   Each info array is an associative array with the 'class' member
         *   giving the class name. The entire array is passed to the repository
         *   constructor as the first parameter.
@@ -105,7 +105,7 @@ class RepoGroup {
         * Search repositories for an image.
         * You can also use wfFindFile() to do this.
         *
-        * @param $title Title|string Title object or string
+        * @param Title|string $title Title object or string
         * @param array $options Associative array of options:
         *   time:           requested time for an archived image, or false for the
         *                   current version. An image object will be returned which was
@@ -185,7 +185,7 @@ class RepoGroup {
         * @return array Map of (file name => File objects) for matches
         *
         * @param array $inputItems
-        * @param integer $flags
+        * @param int $flags
         * @return array
         */
        function findFiles( array $inputItems, $flags = 0 ) {
@@ -220,7 +220,7 @@ class RepoGroup {
 
        /**
         * Interface for FileRepo::checkRedirect()
-        * @param $title Title
+        * @param Title $title
         * @return bool
         */
        function checkRedirect( Title $title ) {
@@ -247,9 +247,9 @@ class RepoGroup {
         * Find an instance of the file with this key, created at the specified time
         * Returns false if the file does not exist.
         *
-        * @param string $hash base 36 SHA-1 hash
+        * @param string $hash Base 36 SHA-1 hash
         * @param array $options Option array, same as findFile()
-        * @return File object or false if it is not found
+        * @return File|bool File object or false if it is not found
         */
        function findFileFromKey( $hash, $options = array() ) {
                if ( !$this->reposInitialised ) {
@@ -273,7 +273,7 @@ class RepoGroup {
         * Find all instances of files with this key
         *
         * @param string $hash base 36 SHA-1 hash
-        * @return Array of File objects
+        * @return array Array of File objects
         */
        function findBySha1( $hash ) {
                if ( !$this->reposInitialised ) {
@@ -293,7 +293,7 @@ class RepoGroup {
         * Find all instances of files with this keys
         *
         * @param array $hashes base 36 SHA-1 hashes
-        * @return array of array of File objects
+        * @return array Array of array of File objects
         */
        function findBySha1s( array $hashes ) {
                if ( !$this->reposInitialised ) {
index 845fd71..1eee6a2 100644 (file)
@@ -281,6 +281,10 @@ class ArchivedFile {
         * @return string
         */
        public function getName() {
+               if ( $this->name === false ) {
+                       $this->load();
+               }
+
                return $this->name;
        }
 
index 21ff65c..a45cd72 100644 (file)
@@ -503,7 +503,7 @@ abstract class File {
         * format does not support that sort of thing, returns
         * an empty array.
         *
-        * @return Array
+        * @return array
         * @since 1.23
         */
        public function getAvailableLanguages() {
@@ -519,7 +519,7 @@ abstract class File {
         * In files that support multiple language, what is the default language
         * to use if none specified.
         *
-        * @return String lang code, or null if filetype doesn't support multiple languages.
+        * @return string Lang code, or null if filetype doesn't support multiple languages.
         * @since 1.23
         */
        public function getDefaultRenderLanguage() {
@@ -853,7 +853,7 @@ abstract class File {
         * Use File::THUMB_FULL_NAME to always get a name like "<params>-<source>".
         * Otherwise, the format may be "<params>-<source>" or "<params>-thumbnail.<ext>".
         *
-        * @param array $params handler-specific parameters
+        * @param array $params Handler-specific parameters
         * @param int $flags Bitfield that supports THUMB_* constants
         * @return string
         */
@@ -941,7 +941,7 @@ abstract class File {
        /**
         * Transform a media file
         *
-        * @param array $params an associative array of handler-specific parameters.
+        * @param array $params An associative array of handler-specific parameters.
         *   Typical keys are width, height and page.
         * @param int $flags A bitfield, may contain self::RENDER_NOW to force rendering
         * @return MediaTransformOutput|bool False on failure
@@ -989,8 +989,6 @@ abstract class File {
                                        $thumb = $handler->getTransform( $this, $thumbPath, $thumbUrl, $params );
                                        break;
                                }
-                               // Clean up broken thumbnails as needed
-                               $this->migrateThumbFile( $thumbName );
                                // Check if an up-to-date thumbnail already exists...
                                wfDebug( __METHOD__ . ": Doing stat for $thumbPath\n" );
                                if ( !( $flags & self::RENDER_FORCE ) && $this->repo->fileExists( $thumbPath ) ) {
@@ -1031,7 +1029,7 @@ abstract class File {
                        $tmpFile->bind( $thumb ); // keep alive with $thumb
 
                        if ( !$thumb ) { // bad params?
-                               $thumb = null;
+                               $thumb = false;
                        } elseif ( $thumb->isError() ) { // transform error
                                $this->lastError = $thumb->toText();
                                // Ignore errors if requested
@@ -1188,8 +1186,8 @@ abstract class File {
         *
         * STUB
         * @param int $limit Limit of rows to return
-        * @param string $start timestamp Only revisions older than $start will be returned
-        * @param string $end timestamp Only revisions newer than $end will be returned
+        * @param string $start Only revisions older than $start will be returned
+        * @param string $end Only revisions newer than $end will be returned
         * @param bool $inc Include the endpoints of the time range
         *
         * @return array
@@ -1249,7 +1247,7 @@ abstract class File {
        /**
         * Get the path of an archived file relative to the public zone root
         *
-        * @param bool|string $suffix if not false, the name of an archived thumbnail file
+        * @param bool|string $suffix If not false, the name of an archived thumbnail file
         *
         * @return string
         */
@@ -1268,7 +1266,7 @@ abstract class File {
         * Get the path, relative to the thumbnail zone root, of the
         * thumbnail directory or a particular file if $suffix is specified
         *
-        * @param bool|string $suffix if not false, the name of a thumbnail file
+        * @param bool|string $suffix If not false, the name of a thumbnail file
         * @return string
         */
        function getThumbRel( $suffix = false ) {
@@ -1294,8 +1292,8 @@ abstract class File {
         * Get the path, relative to the thumbnail zone root, for an archived file's thumbs directory
         * or a specific thumb if the $suffix is given.
         *
-        * @param string $archiveName the timestamped name of an archived image
-        * @param bool|string $suffix if not false, the name of a thumbnail file
+        * @param string $archiveName The timestamped name of an archived image
+        * @param bool|string $suffix If not false, the name of a thumbnail file
         * @return string
         */
        function getArchiveThumbRel( $archiveName, $suffix = false ) {
@@ -1312,7 +1310,7 @@ abstract class File {
        /**
         * Get the path of the archived file.
         *
-        * @param bool|string $suffix if not false, the name of an archived file.
+        * @param bool|string $suffix If not false, the name of an archived file.
         * @return string
         */
        function getArchivePath( $suffix = false ) {
@@ -1324,8 +1322,8 @@ abstract class File {
        /**
         * Get the path of an archived file's thumbs, or a particular thumb if $suffix is specified
         *
-        * @param string $archiveName the timestamped name of an archived image
-        * @param bool|string $suffix if not false, the name of a thumbnail file
+        * @param string $archiveName The timestamped name of an archived image
+        * @param bool|string $suffix If not false, the name of a thumbnail file
         * @return string
         */
        function getArchiveThumbPath( $archiveName, $suffix = false ) {
@@ -1381,7 +1379,7 @@ abstract class File {
        /**
         * Get the URL of the archived file's thumbs, or a particular thumb if $suffix is specified
         *
-        * @param string $archiveName the timestamped name of an archived image
+        * @param string $archiveName The timestamped name of an archived image
         * @param bool|string $suffix If not false, the name of a thumbnail file
         * @return string
         */
@@ -1402,7 +1400,7 @@ abstract class File {
        /**
         * Get the URL of the zone directory, or a particular file if $suffix is specified
         *
-        * @param string $zone name of requested zone
+        * @param string $zone Name of requested zone
         * @param bool|string $suffix If not false, the name of a file in zone
         * @return string path
         */
@@ -1420,7 +1418,7 @@ abstract class File {
        /**
         * Get the URL of the thumbnail directory, or a particular file if $suffix is specified
         *
-        * @param bool|string $suffix if not false, the name of a thumbnail file
+        * @param bool|string $suffix If not false, the name of a thumbnail file
         * @return string path
         */
        function getThumbUrl( $suffix = false ) {
@@ -1507,8 +1505,8 @@ abstract class File {
         * Record a file upload in the upload log and the image table
         * STUB
         * Overridden by LocalFile
-        * @param $oldver
-        * @param $desc
+        * @param string $oldver
+        * @param string $desc
         * @param string $license
         * @param string $copyStatus
         * @param string $source
@@ -1535,7 +1533,7 @@ abstract class File {
         * Options to $options include:
         *   - headers : name/value map of HTTP headers to use in response to GET/HEAD requests
         *
-        * @param string $srcPath local filesystem path to the source image
+        * @param string $srcPath Local filesystem path to the source image
         * @param int $flags A bitwise combination of:
         *   File::DELETE_SOURCE    Delete the source file, i.e. move rather than copy
         * @param array $options Optional additional parameters
@@ -1601,7 +1599,7 @@ abstract class File {
         * Is this file a "deleted" file in a private archive?
         * STUB
         *
-        * @param int $field one of DELETED_* bitfield constants
+        * @param int $field One of DELETED_* bitfield constants
         * @return bool
         */
        function isDeleted( $field ) {
@@ -1638,7 +1636,7 @@ abstract class File {
         * and logging are caller's responsibility
         *
         * @param Title $target New file name
-        * @return FileRepoStatus object.
+        * @return FileRepoStatus
         */
        function move( $target ) {
                $this->readOnlyError();
@@ -1654,11 +1652,12 @@ abstract class File {
         *
         * @param string $reason
         * @param bool $suppress Hide content from sysops?
-        * @return bool on success, false on some kind of failure
+        * @param User|null $user
+        * @return bool Boolean on success, false on some kind of failure
         * STUB
         * Overridden by LocalFile
         */
-       function delete( $reason, $suppress = false ) {
+       function delete( $reason, $suppress = false, $user = null ) {
                $this->readOnlyError();
        }
 
@@ -1668,10 +1667,10 @@ abstract class File {
         *
         * May throw database exceptions on error.
         *
-        * @param array $versions set of record ids of deleted items to restore,
+        * @param array $versions Set of record ids of deleted items to restore,
         *   or empty to restore all revisions.
-        * @param bool $unsuppress remove restrictions on content upon restoration?
-        * @return int|bool the number of file revisions restored if successful,
+        * @param bool $unsuppress Remove restrictions on content upon restoration?
+        * @return int|bool The number of file revisions restored if successful,
         *   or false on failure
         * STUB
         * Overridden by LocalFile
@@ -1729,17 +1728,20 @@ abstract class File {
 
        /**
         * Get an image size array like that returned by getImageSize(), or false if it
-        * can't be determined.
+        * can't be determined. Loads the image size directly from the file ignoring caches.
         *
-        * @param string $fileName The filename
-        * @return array
+        * @note Use getWidth()/getHeight() instead of this method unless you have a
+        *  a good reason. This method skips all caches.
+        *
+        * @param string $fileName The path to the file (e.g. From getLocalPathRef() )
+        * @return array The width, followed by height, with optionally more things after
         */
-       function getImageSize( $fileName ) {
+       function getImageSize( $filePath ) {
                if ( !$this->getHandler() ) {
                        return false;
                }
 
-               return $this->handler->getImageSize( $this, $fileName );
+               return $this->handler->getImageSize( $this, $filePath );
        }
 
        /**
@@ -1869,7 +1871,7 @@ abstract class File {
        /**
         * Get an associative array containing information about a file in the local filesystem.
         *
-        * @param string $path absolute local filesystem path
+        * @param string $path Absolute local filesystem path
         * @param string|bool $ext The file extension, or true to extract it from
         *   the filename. Set it to false to ignore the extension.
         *
@@ -1892,7 +1894,7 @@ abstract class File {
         * 160 log 2 / log 36 = 30.95, so the 160-bit hash fills 31 digits in base 36
         * fairly neatly.
         *
-        * @param $path string
+        * @param string $path
         * @return bool|string False on failure
         * @deprecated since 1.19
         */
index 690d1b8..3d5d5d6 100644 (file)
@@ -33,9 +33,9 @@ class ForeignAPIFile extends File {
        protected $repoClass = 'ForeignApiRepo';
 
        /**
-        * @param $title
+        * @param Title|string|bool $title
         * @param ForeignApiRepo $repo
-        * @param $info
+        * @param array $info
         * @param bool $exists
         */
        function __construct( $title, $repo, $info, $exists = false ) {
@@ -236,7 +236,7 @@ class ForeignAPIFile extends File {
        }
 
        /**
-        * @return null|String
+        * @return null|string
         */
        function getSha1() {
                return isset( $this->mInfo['sha1'] )
index 36558c4..561ead7 100644 (file)
@@ -65,14 +65,14 @@ class ForeignDBFile extends LocalFile {
        }
 
        /**
-        * @param $oldver
-        * @param $desc string
-        * @param $license string
-        * @param $copyStatus string
-        * @param $source string
-        * @param $watch bool
-        * @param $timestamp bool|string
-        * @param $user User object or null to use $wgUser
+        * @param string $oldver
+        * @param string $desc
+        * @param string $license
+        * @param string $copyStatus
+        * @param string $source
+        * @param bool $watch
+        * @param bool|string $timestamp
+        * @param User $user User object or null to use $wgUser
         * @return bool
         * @throws MWException
         */
@@ -94,10 +94,11 @@ class ForeignDBFile extends LocalFile {
        /**
         * @param string $reason
         * @param bool $suppress
+        * @param User|null $user
         * @return FileRepoStatus
         * @throws MWException
         */
-       function delete( $reason, $suppress = false ) {
+       function delete( $reason, $suppress = false, $user = null ) {
                $this->readOnlyError();
        }
 
index eb55e82..300e68e 100644 (file)
@@ -121,7 +121,13 @@ class LocalFile extends File {
        /** @var bool True if file is not present in file system. Not to be cached in memcached */
        private $missing;
 
+       /** @var int UNIX timestamp of last markVolatile() call */
+       private $lastMarkedVolatile = 0;
+
        const LOAD_ALL = 1; // integer; load all the lazy fields too (like metadata)
+       const LOAD_VIA_SLAVE = 2; // integer; use a slave to load the data
+
+       const VOLATILE_TTL = 300; // integer; seconds
 
        /**
         * Create a LocalFile from a title
@@ -131,7 +137,7 @@ class LocalFile extends File {
         *
         * @param Title $title
         * @param FileRepo $repo
-        * @param $unused
+        * @param null $unused
         *
         * @return LocalFile
         */
@@ -207,6 +213,8 @@ class LocalFile extends File {
        /**
         * Constructor.
         * Do not call this except from inside a repo class.
+        * @param Title $title
+        * @param FileRepo $repo
         */
        function __construct( $title, $repo ) {
                parent::__construct( $title, $repo );
@@ -224,7 +232,7 @@ class LocalFile extends File {
        /**
         * Get the memcached key for the main data for this file, or false if
         * there is no access to the shared cache.
-        * @return bool
+        * @return string|bool
         */
        function getCacheKey() {
                $hashedName = md5( $this->getName() );
@@ -322,7 +330,7 @@ class LocalFile extends File {
        }
 
        /**
-        * @param $prefix string
+        * @param string $prefix
         * @return array
         */
        function getCacheFields( $prefix = 'img_' ) {
@@ -372,7 +380,7 @@ class LocalFile extends File {
        /**
         * Load file metadata from the DB
         */
-       function loadFromDB() {
+       function loadFromDB( $flags = 0 ) {
                # Polymorphic function name to distinguish foreign and local fetches
                $fname = get_class( $this ) . '::' . __FUNCTION__;
                wfProfileIn( $fname );
@@ -381,7 +389,10 @@ class LocalFile extends File {
                $this->dataLoaded = true;
                $this->extraDataLoaded = true;
 
-               $dbr = $this->repo->getMasterDB();
+               $dbr = ( $flags & self::LOAD_VIA_SLAVE )
+                       ? $this->repo->getSlaveDB()
+                       : $this->repo->getMasterDB();
+
                $row = $dbr->selectRow( 'image', $this->getCacheFields( 'img_' ),
                        array( 'img_name' => $this->getName() ), $fname );
 
@@ -406,19 +417,13 @@ class LocalFile extends File {
                # Unconditionally set loaded=true, we don't want the accessors constantly rechecking
                $this->extraDataLoaded = true;
 
-               $dbr = $this->repo->getSlaveDB();
-               // In theory the file could have just been renamed/deleted...oh well
-               $row = $dbr->selectRow( 'image', $this->getLazyCacheFields( 'img_' ),
-                       array( 'img_name' => $this->getName() ), $fname );
-
-               if ( !$row ) { // fallback to master
-                       $dbr = $this->repo->getMasterDB();
-                       $row = $dbr->selectRow( 'image', $this->getLazyCacheFields( 'img_' ),
-                               array( 'img_name' => $this->getName() ), $fname );
+               $fieldMap = $this->loadFieldsWithTimestamp( $this->repo->getSlaveDB(), $fname );
+               if ( !$fieldMap ) {
+                       $fieldMap = $this->loadFieldsWithTimestamp( $this->repo->getMasterDB(), $fname );
                }
 
-               if ( $row ) {
-                       foreach ( $this->unprefixRow( $row, 'img_' ) as $name => $value ) {
+               if ( $fieldMap ) {
+                       foreach ( $fieldMap as $name => $value ) {
                                $this->$name = $value;
                        }
                } else {
@@ -429,6 +434,32 @@ class LocalFile extends File {
                wfProfileOut( $fname );
        }
 
+       /**
+        * @param DatabaseBase $dbr
+        * @param string $fname
+        * @return array|false
+        */
+       private function loadFieldsWithTimestamp( $dbr, $fname ) {
+               $fieldMap = false;
+
+               $row = $dbr->selectRow( 'image', $this->getLazyCacheFields( 'img_' ),
+                       array( 'img_name' => $this->getName(), 'img_timestamp' => $this->getTimestamp() ),
+                       $fname );
+               if ( $row ) {
+                       $fieldMap = $this->unprefixRow( $row, 'img_' );
+               } else {
+                       # File may have been uploaded over in the meantime; check the old versions
+                       $row = $dbr->selectRow( 'oldimage', $this->getLazyCacheFields( 'oi_' ),
+                               array( 'oi_name' => $this->getName(), 'oi_timestamp' => $this->getTimestamp() ),
+                               $fname );
+                       if ( $row ) {
+                               $fieldMap = $this->unprefixRow( $row, 'oi_' );
+                       }
+               }
+
+               return $fieldMap;
+       }
+
        /**
         * @param array $row Row
         * @param string $prefix
@@ -455,8 +486,8 @@ class LocalFile extends File {
        /**
         * Decode a row from the database (either object or array) to an array
         * with timestamps and MIME types decoded, and the field prefix removed.
-        * @param $row
-        * @param $prefix string
+        * @param object $row
+        * @param string $prefix
         * @throws MWException
         * @return array
         */
@@ -465,6 +496,8 @@ class LocalFile extends File {
 
                $decoded['timestamp'] = wfTimestamp( TS_MW, $decoded['timestamp'] );
 
+               $decoded['metadata'] = $this->repo->getSlaveDB()->decodeBlob( $decoded['metadata'] );
+
                if ( empty( $decoded['major_mime'] ) ) {
                        $decoded['mime'] = 'unknown/unknown';
                } else {
@@ -482,6 +515,9 @@ class LocalFile extends File {
 
        /**
         * Load file metadata from a DB result row
+        *
+        * @param object $row
+        * @param string $prefix
         */
        function loadFromRow( $row, $prefix = 'img_' ) {
                $this->dataLoaded = true;
@@ -499,12 +535,12 @@ class LocalFile extends File {
 
        /**
         * Load file metadata from cache or DB, unless already loaded
-        * @param integer $flags
+        * @param int $flags
         */
        function load( $flags = 0 ) {
                if ( !$this->dataLoaded ) {
                        if ( !$this->loadFromCache() ) {
-                               $this->loadFromDB();
+                               $this->loadFromDB( $this->isVolatile() ? 0 : self::LOAD_VIA_SLAVE );
                                $this->saveToCache();
                        }
                        $this->dataLoaded = true;
@@ -604,6 +640,8 @@ class LocalFile extends File {
         *
         * If 'mime' is given, it will be split into major_mime/minor_mime.
         * If major_mime/minor_mime are given, $this->mime will also be set.
+        *
+        * @param array $info
         */
        function setProps( $info ) {
                $this->dataLoaded = true;
@@ -786,39 +824,6 @@ class LocalFile extends File {
        /** createThumb inherited */
        /** transform inherited */
 
-       /**
-        * Fix thumbnail files from 1.4 or before, with extreme prejudice
-        * @todo Do we still care about this? Perhaps a maintenance script
-        *   can be made instead. Enabling this code results in a serious
-        *   RTT regression for wikis without 404 handling.
-        */
-       function migrateThumbFile( $thumbName ) {
-               /* Old code for bug 2532
-               $thumbDir = $this->getThumbPath();
-               $thumbPath = "$thumbDir/$thumbName";
-               if ( is_dir( $thumbPath ) ) {
-                       // Directory where file should be
-                       // This happened occasionally due to broken migration code in 1.5
-                       // Rename to broken-*
-                       for ( $i = 0; $i < 100; $i++ ) {
-                               $broken = $this->repo->getZonePath( 'public' ) . "/broken-$i-$thumbName";
-                               if ( !file_exists( $broken ) ) {
-                                       rename( $thumbPath, $broken );
-                                       break;
-                               }
-                       }
-                       // Doesn't exist anymore
-                       clearstatcache();
-               }
-               */
-               /*
-               if ( $this->repo->fileExists( $thumbDir ) ) {
-                       // Delete file where directory should be
-                       $this->repo->cleanupBatch( array( $thumbDir ) );
-               }
-               */
-       }
-
        /** getHandler inherited */
        /** iconThumb inherited */
        /** getLastError inherited */
@@ -1124,7 +1129,7 @@ class LocalFile extends File {
         *   current time
         * @param User|null $user User object or null to use $wgUser
         *
-        * @return FileRepoStatus object. On success, the value member contains the
+        * @return FileRepoStatus On success, the value member contains the
         *     archive name, or an empty string if it was a new file.
         */
        function upload( $srcPath, $comment, $pageText, $flags = 0, $props = false,
@@ -1159,16 +1164,19 @@ class LocalFile extends File {
                // Trim spaces on user supplied text
                $comment = trim( $comment );
 
-               // truncate nicely or the DB will do it for us
+               // Truncate nicely or the DB will do it for us
                // non-nicely (dangling multi-byte chars, non-truncated version in cache).
                $comment = $wgContLang->truncate( $comment, 255 );
                $this->lock(); // begin
                $status = $this->publish( $srcPath, $flags, $options );
 
-               if ( $status->successCount > 0 ) {
-                       # Essentially we are displacing any existing current file and saving
-                       # a new current file at the old location. If just the first succeeded,
-                       # we still need to displace the current DB entry and put in a new one.
+               if ( $status->successCount >= 2 ) {
+                       // There will be a copy+(one of move,copy,store).
+                       // The first succeeding does not commit us to updating the DB
+                       // since it simply copied the current version to a timestamped file name.
+                       // It is only *preferable* to avoid leaving such files orphaned.
+                       // Once the second operation goes through, then the current version was
+                       // updated and we must therefore update the DB too.
                        if ( !$this->recordUpload2( $status->value, $comment, $pageText, $props, $timestamp, $user ) ) {
                                $status->fatal( 'filenotfound', $srcPath );
                        }
@@ -1240,8 +1248,13 @@ class LocalFile extends File {
                        wfProfileOut( __METHOD__ . '-getProps' );
                }
 
+               # Imports or such might force a certain timestamp; otherwise we generate
+               # it and can fudge it slightly to keep (name,timestamp) unique on re-upload.
                if ( $timestamp === false ) {
                        $timestamp = $dbw->timestamp();
+                       $allowTimeKludge = true;
+               } else {
+                       $allowTimeKludge = false;
                }
 
                $props['description'] = $comment;
@@ -1284,6 +1297,20 @@ class LocalFile extends File {
                        'IGNORE'
                );
                if ( $dbw->affectedRows() == 0 ) {
+                       if ( $allowTimeKludge ) {
+                               # Use FOR UPDATE to ignore any transaction snapshotting
+                               $ltimestamp = $dbw->selectField( 'image', 'img_timestamp',
+                                       array( 'img_name' => $this->getName() ), __METHOD__, array( 'FOR UPDATE' ) );
+                               $lUnixtime = $ltimestamp ? wfTimestamp( TS_UNIX, $ltimestamp ) : false;
+                               # Avoid a timestamp that is not newer than the last version
+                               # TODO: the image/oldimage tables should be like page/revision with an ID field
+                               if ( $lUnixtime && wfTimestamp( TS_UNIX, $timestamp ) <= $lUnixtime ) {
+                                       sleep( 1 ); // fast enough re-uploads would go far in the future otherwise
+                                       $timestamp = $dbw->timestamp( $lUnixtime + 1 );
+                                       $this->timestamp = wfTimestamp( TS_MW, $timestamp ); // DB -> TS_MW
+                               }
+                       }
+
                        # (bug 34993) Note: $oldver can be empty here, if the previous
                        # version of the file was broken. Allow registration of the new
                        # version to continue anyway, because that's better than having
@@ -1383,7 +1410,8 @@ class LocalFile extends File {
                                $dbw,
                                $descTitle->getArticleID(),
                                $editSummary,
-                               false
+                               false,
+                               $user
                        );
                        if ( !is_null( $nullRevision ) ) {
                                $nullRevision->insertOn( $dbw );
@@ -1437,7 +1465,6 @@ class LocalFile extends File {
 
                wfProfileOut( __METHOD__ . '-edit' );
 
-
                if ( $reupload ) {
                        # Delete old thumbnails
                        wfProfileIn( __METHOD__ . '-purge' );
@@ -1591,14 +1618,15 @@ class LocalFile extends File {
         *
         * @param string $reason
         * @param bool $suppress
+        * @param User|null $user
         * @return FileRepoStatus
         */
-       function delete( $reason, $suppress = false ) {
+       function delete( $reason, $suppress = false, $user = null ) {
                if ( $this->getRepo()->getReadOnlyReason() !== false ) {
                        return $this->readOnlyFatalStatus();
                }
 
-               $batch = new LocalFileDeleteBatch( $this, $reason, $suppress );
+               $batch = new LocalFileDeleteBatch( $this, $reason, $suppress, $user );
 
                $this->lock(); // begin
                $batch->addCurrent();
@@ -1648,16 +1676,17 @@ class LocalFile extends File {
         * @param string $archiveName
         * @param string $reason
         * @param bool $suppress
+        * @param User|null $user
         * @throws MWException Exception on database or file store failure
         * @return FileRepoStatus
         */
-       function deleteOld( $archiveName, $reason, $suppress = false ) {
+       function deleteOld( $archiveName, $reason, $suppress = false, $user = null ) {
                global $wgUseSquid;
                if ( $this->getRepo()->getReadOnlyReason() !== false ) {
                        return $this->readOnlyFatalStatus();
                }
 
-               $batch = new LocalFileDeleteBatch( $this, $reason, $suppress );
+               $batch = new LocalFileDeleteBatch( $this, $reason, $suppress, $user );
 
                $this->lock(); // begin
                $batch->addOld( $archiveName );
@@ -1684,7 +1713,7 @@ class LocalFile extends File {
         *
         * May throw database exceptions on error.
         *
-        * @param array $versions set of record ids of deleted items to restore,
+        * @param array $versions Set of record ids of deleted items to restore,
         *   or empty to restore all revisions.
         * @param bool $unsuppress
         * @return FileRepoStatus
@@ -1815,8 +1844,8 @@ class LocalFile extends File {
        /**
         * Start a transaction and lock the image for update
         * Increments a reference counter if the lock is already held
-        * @throws MWException
-        * @return bool True if the image exists, false otherwise
+        * @throws MWException Throws an error if the lock was not acquired
+        * @return bool success
         */
        function lock() {
                $dbw = $this->repo->getMasterDB();
@@ -1828,19 +1857,22 @@ class LocalFile extends File {
                        }
                        $this->locked++;
                        // Bug 54736: use simple lock to handle when the file does not exist.
-                       // SELECT FOR UPDATE only locks records not the gaps where there are none.
-                       $cache = wfGetMainCache();
-                       $key = $this->getCacheKey();
-                       if ( !$cache->lock( $key, 5 ) ) {
+                       // SELECT FOR UPDATE prevents changes, not other SELECTs with FOR UPDATE.
+                       // Also, that would cause contention on INSERT of similarly named rows.
+                       $backend = $this->getRepo()->getBackend();
+                       $lockPaths = array( $this->getPath() ); // represents all versions of the file
+                       $status = $backend->lockFiles( $lockPaths, LockManager::LOCK_EX, 5 );
+                       if ( !$status->isGood() ) {
                                throw new MWException( "Could not acquire lock for '{$this->getName()}.'" );
                        }
-                       $dbw->onTransactionIdle( function () use ( $cache, $key ) {
-                               $cache->unlock( $key ); // release on commit
+                       $dbw->onTransactionIdle( function () use ( $backend, $lockPaths ) {
+                               $backend->unlockFiles( $lockPaths, LockManager::LOCK_EX ); // release on commit
                        } );
                }
 
-               return $dbw->selectField( 'image', '1',
-                       array( 'img_name' => $this->getName() ), __METHOD__, array( 'FOR UPDATE' ) );
+               $this->markVolatile(); // file may change soon
+
+               return true;
        }
 
        /**
@@ -1858,6 +1890,48 @@ class LocalFile extends File {
                }
        }
 
+       /**
+        * Mark a file as about to be changed
+        *
+        * This sets a cache key that alters master/slave DB loading behavior
+        *
+        * @return bool Success
+        */
+       protected function markVolatile() {
+               global $wgMemc;
+
+               $key = $this->repo->getSharedCacheKey( 'file-volatile', md5( $this->getName() ) );
+               if ( $key ) {
+                       $this->lastMarkedVolatile = time();
+                       return $wgMemc->set( $key, $this->lastMarkedVolatile, self::VOLATILE_TTL );
+               }
+
+               return true;
+       }
+
+       /**
+        * Check if a file is about to be changed or has been changed recently
+        *
+        * @see LocalFile::isVolatile()
+        * @return bool Whether the file is volatile
+        */
+       protected function isVolatile() {
+               global $wgMemc;
+
+               $key = $this->repo->getSharedCacheKey( 'file-volatile', md5( $this->getName() ) );
+               if ( !$key ) {
+                       // repo unavailable; bail.
+                       return false;
+               }
+
+               if ( $this->lastMarkedVolatile === 0 ) {
+                       $this->lastMarkedVolatile = $wgMemc->get( $key ) ?: 0;
+               }
+
+               $volatileDuration = time() - $this->lastMarkedVolatile;
+               return $volatileDuration <= self::VOLATILE_TTL;
+       }
+
        /**
         * Roll back the DB transaction and mark the image unlocked
         */
@@ -1912,15 +1986,25 @@ class LocalFileDeleteBatch {
        /** @var FileRepoStatus */
        private $status;
 
+       /** @var User */
+       private $user;
+
        /**
         * @param File $file
         * @param string $reason
         * @param bool $suppress
+        * @param User|null $user
         */
-       function __construct( File $file, $reason = '', $suppress = false ) {
+       function __construct( File $file, $reason = '', $suppress = false, $user = null ) {
                $this->file = $file;
                $this->reason = $reason;
                $this->suppress = $suppress;
+               if ( $user ) {
+                       $this->user = $user;
+               } else {
+                       global $wgUser;
+                       $this->user = $wgUser;
+               }
                $this->status = $file->repo->newGood();
        }
 
@@ -1990,7 +2074,8 @@ class LocalFileDeleteBatch {
                        $res = $dbw->select(
                                'oldimage',
                                array( 'oi_archive_name', 'oi_sha1' ),
-                               array( 'oi_archive_name' => array_keys( $oldRels ) ),
+                               array( 'oi_archive_name' => array_keys( $oldRels ),
+                                       'oi_name' => $this->file->getName() ), // performance
                                __METHOD__
                        );
 
@@ -2033,11 +2118,9 @@ class LocalFileDeleteBatch {
        }
 
        function doDBInserts() {
-               global $wgUser;
-
                $dbw = $this->file->repo->getMasterDB();
                $encTimestamp = $dbw->addQuotes( $dbw->timestamp() );
-               $encUserId = $dbw->addQuotes( $wgUser->getId() );
+               $encUserId = $dbw->addQuotes( $this->user->getId() );
                $encReason = $dbw->addQuotes( $this->reason );
                $encGroup = $dbw->addQuotes( 'deleted' );
                $ext = $this->file->getExtension();
@@ -2063,7 +2146,11 @@ class LocalFileDeleteBatch {
                        $dbw->insertSelect( 'filearchive', 'image',
                                array(
                                        'fa_storage_group' => $encGroup,
-                                       'fa_storage_key' => "CASE WHEN img_sha1='' THEN '' ELSE $concat END",
+                                       'fa_storage_key' => $dbw->conditional(
+                                               array( 'img_sha1' => '' ),
+                                               $dbw->addQuotes( '' ),
+                                               $concat
+                                       ),
                                        'fa_deleted_user' => $encUserId,
                                        'fa_deleted_timestamp' => $encTimestamp,
                                        'fa_deleted_reason' => $encReason,
@@ -2095,7 +2182,11 @@ class LocalFileDeleteBatch {
                        $dbw->insertSelect( 'filearchive', 'oldimage',
                                array(
                                        'fa_storage_group' => $encGroup,
-                                       'fa_storage_key' => "CASE WHEN oi_sha1='' THEN '' ELSE $concat END",
+                                       'fa_storage_key' => $dbw->conditional(
+                                               array( 'oi_sha1' => '' ),
+                                               $dbw->addQuotes( '' ),
+                                               $concat
+                                       ),
                                        'fa_deleted_user' => $encUserId,
                                        'fa_deleted_timestamp' => $encTimestamp,
                                        'fa_deleted_reason' => $encReason,
@@ -2219,7 +2310,7 @@ class LocalFileDeleteBatch {
 
        /**
         * Removes non-existent files from a deletion batch.
-        * @param $batch array
+        * @param array $batch
         * @return array
         */
        function removeNonexistentFiles( $batch ) {
@@ -2312,10 +2403,14 @@ class LocalFileRestoreBatch {
                        return $this->file->repo->newGood();
                }
 
-               $exists = $this->file->lock();
+               $this->file->lock();
+
                $dbw = $this->file->repo->getMasterDB();
                $status = $this->file->repo->newGood();
 
+               $exists = (bool)$dbw->selectField( 'image', '1',
+                       array( 'img_name' => $this->file->getName() ), __METHOD__, array( 'FOR UPDATE' ) );
+
                // Fetch all or selected archived revisions for the file,
                // sorted from the most recent to the oldest.
                $conditions = array( 'fa_name' => $this->file->getName() );
@@ -2676,7 +2771,8 @@ class LocalFileMoveBatch {
                $result = $this->db->select( 'oldimage',
                        array( 'oi_archive_name', 'oi_deleted' ),
                        array( 'oi_name' => $this->oldName ),
-                       __METHOD__
+                       __METHOD__,
+                       array( 'FOR UPDATE' ) // ignore snapshot
                );
 
                foreach ( $result as $row ) {
index d6c6a3c..ca92496 100644 (file)
@@ -174,10 +174,11 @@ class OldLocalFile extends LocalFile {
                return $this->exists() && !$this->isDeleted( File::DELETED_FILE );
        }
 
-       function loadFromDB() {
+       function loadFromDB( $flags = 0 ) {
                wfProfileIn( __METHOD__ );
 
                $this->dataLoaded = true;
+
                $dbr = $this->repo->getSlaveDB();
                $conds = array( 'oi_name' => $this->getName() );
                if ( is_null( $this->requestedTime ) ) {
index 42e8c03..39da597 100644 (file)
  * @ingroup Media
  */
 abstract class ImageGalleryBase extends ContextSource {
-       /** @var array Gallery images */
-       protected $mImages;
+       /**
+        * @var array Gallery images
+        * @deprecated in 1.23 (was declared "var") and will be removed in 1.24
+        */
+       public $mImages;
 
-       /** @var bool Whether to show the filesize in bytes in categories */
-       protected $mShowBytes;
+       /**
+        * @var bool Whether to show the filesize in bytes in categories
+        * @deprecated in 1.23 (was declared "var") and will be removed in 1.24
+        */
+       public $mShowBytes;
 
-       /** @var bool Whether to show the filename. Default: true */
-       protected $mShowFilename;
+       /**
+        * @var bool Whether to show the filename. Default: true
+        * @deprecated in 1.23 (was declared "var") and will be removed in 1.24
+        */
+       public $mShowFilename;
 
-       /** @var string Gallery mode. Default: traditional */
-       protected $mMode;
+       /**
+        * @var string Gallery mode. Default: traditional
+        * @deprecated in 1.23 (was declared "var") and will be removed in 1.24
+        */
+       public $mMode;
 
-       /** @var bool|string Gallery caption. Default: false */
-       protected $mCaption = false;
+       /**
+        * @var bool|string Gallery caption. Default: false
+        * @deprecated in 1.23 (was declared "var") and will be removed in 1.24
+        */
+       public $mCaption = false;
 
        /**
         * @var bool Hide blacklisted images?
+        * @deprecated in 1.23 (was declared "var") and will be removed in 1.24
         */
-       protected $mHideBadImages;
+       public $mHideBadImages;
 
        /**
         * @var Parser Registered parser object for output callbacks
         */
-       protected $mParser;
+       public $mParser;
 
        /**
         * @var Title Contextual title, used when images are being screened against
index f8d017c..09c0ad9 100644 (file)
@@ -31,10 +31,10 @@ class HTMLButtonField extends HTMLFormField {
        /**
         * Button cannot be invalid
         *
-        * @param $value String
-        * @param $alldata Array
+        * @param string $value
+        * @param array $alldata
         *
-        * @return Bool
+        * @return bool
         */
        public function validate( $value, $alldata ) {
                return true;
old mode 100644 (file)
new mode 100755 (executable)
index 7baab66..a0dd370
@@ -24,8 +24,7 @@ class HTMLCheckField extends HTMLFormField {
                                array(
                                        'class' => 'mw-ui-checkbox-label'
                                ),
-                               Xml::check( $this->mName, $value, $attr ) . // Html:rawElement doesn't escape contents.
-                               htmlspecialchars( $this->mLabel ) );
+                               Xml::check( $this->mName, $value, $attr ) . $this->mLabel );
                } else {
                        return Xml::check( $this->mName, $value, $attr )
                        . '&#160;'
@@ -36,7 +35,7 @@ class HTMLCheckField extends HTMLFormField {
        /**
         * For a checkbox, the label goes on the right hand side, and is
         * added in getInputHTML(), rather than HTMLFormField::getRow()
-        * @return String
+        * @return string
         */
        function getLabel() {
                return '&#160;';
@@ -44,15 +43,16 @@ class HTMLCheckField extends HTMLFormField {
 
        /**
         * checkboxes don't need a label.
+        * @return bool
         */
        protected function needsLabel() {
                return false;
        }
 
        /**
-        * @param $request WebRequest
+        * @param WebRequest $request
         *
-        * @return String
+        * @return string
         */
        function loadDataFromRequest( $request ) {
                $invert = false;
index 2fc170c..606523b 100644 (file)
@@ -75,9 +75,9 @@ class HTMLCheckMatrix extends HTMLFormField implements HTMLNestedFilterable {
         * mParams['rows'] is an array with row labels as keys and row tags as values.
         * mParams['columns'] is an array with column labels as keys and column tags as values.
         *
-        * @param array $value of the options that should be checked
+        * @param array $value Array of the options that should be checked
         *
-        * @return String
+        * @return string
         */
        function getInputHTML( $value ) {
                $html = '';
@@ -159,9 +159,9 @@ class HTMLCheckMatrix extends HTMLFormField implements HTMLNestedFilterable {
         * line above the options in the case of a checkbox matrix, i.e. it's always
         * a "vertical-label".
         *
-        * @param string $value the value to set the input to
+        * @param string $value The value to set the input to
         *
-        * @return String complete HTML table row
+        * @return string Complete HTML table row
         */
        function getTableRow( $value ) {
                list( $errors, $errorClass ) = $this->getErrorsAndErrorClass( $value );
@@ -187,9 +187,9 @@ class HTMLCheckMatrix extends HTMLFormField implements HTMLNestedFilterable {
        }
 
        /**
-        * @param $request WebRequest
+        * @param WebRequest $request
         *
-        * @return Array
+        * @return array
         */
        function loadDataFromRequest( $request ) {
                if ( $this->mParent->getMethod() == 'post' ) {
index 21505a8..01f3ab7 100644 (file)
@@ -117,6 +117,7 @@ class HTMLForm extends ContextSource {
                'hidden' => 'HTMLHiddenField',
                'edittools' => 'HTMLEditTools',
                'checkmatrix' => 'HTMLCheckMatrix',
+               'cloner' => 'HTMLFormFieldCloner',
                // 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.
@@ -155,6 +156,7 @@ class HTMLForm extends ContextSource {
 
        protected $mTitle;
        protected $mMethod = 'post';
+       protected $mWasSubmitted = false;
 
        /**
         * Form action URL. false means we will use the URL to set Title
@@ -181,13 +183,13 @@ class HTMLForm extends ContextSource {
        /**
         * Format in which to display form. For viable options,
         * @see $availableDisplayFormats
-        * @var String
+        * @var string
         */
        protected $displayFormat = 'table';
 
        /**
         * Available formats in which to display the form
-        * @var Array
+        * @var array
         */
        protected $availableDisplayFormats = array(
                'table',
@@ -199,10 +201,10 @@ class HTMLForm extends ContextSource {
        /**
         * Build a new HTMLForm from an array of field attributes
         *
-        * @param array $descriptor of Field constructs, as described above
-        * @param $context IContextSource available since 1.18, will become compulsory in 1.18.
+        * @param array $descriptor Array of Field constructs, as described above
+        * @param IContextSource $context Available since 1.18, will become compulsory in 1.18.
         *     Obviates the need to call $form->setTitle()
-        * @param string $messagePrefix a prefix to go in front of default messages
+        * @param string $messagePrefix A prefix to go in front of default messages
         */
        public function __construct( $descriptor, /*IContextSource*/ $context = null,
                $messagePrefix = ''
@@ -267,8 +269,8 @@ class HTMLForm extends ContextSource {
        /**
         * Set format in which to display the form
         *
-        * @param string $format the name of the format to use, must be one of
-        *        $this->availableDisplayFormats
+        * @param string $format The name of the format to use, must be one of
+        *   $this->availableDisplayFormats
         *
         * @throws MWException
         * @since 1.20
@@ -287,7 +289,7 @@ class HTMLForm extends ContextSource {
        /**
         * Getter for displayFormat
         * @since 1.20
-        * @return String
+        * @return string
         */
        public function getDisplayFormat() {
                return $this->displayFormat;
@@ -296,7 +298,7 @@ class HTMLForm extends ContextSource {
        /**
         * Test if displayFormat is 'vform'
         * @since 1.22
-        * @return Bool
+        * @return bool
         */
        public function isVForm() {
                return $this->displayFormat === 'vform';
@@ -338,8 +340,10 @@ class HTMLForm extends ContextSource {
                }
 
                if ( !$class ) {
-                       throw new MWException( "Descriptor with no class for $fieldname: " . print_r( $descriptor, true ) );
+                       throw new MWException( "Descriptor with no class for $fieldname: "
+                               . print_r( $descriptor, true ) );
                }
+
                return $class;
        }
 
@@ -388,7 +392,7 @@ class HTMLForm extends ContextSource {
 
        /**
         * Try submitting, with edit token check first
-        * @return Status|boolean
+        * @return Status|bool
         */
        function tryAuthorizedSubmit() {
                $result = false;
@@ -409,6 +413,7 @@ class HTMLForm extends ContextSource {
                }
 
                if ( $submit ) {
+                       $this->mWasSubmitted = true;
                        $result = $this->trySubmit();
                }
 
@@ -419,7 +424,7 @@ class HTMLForm extends ContextSource {
         * The here's-one-I-made-earlier option: do the submission if
         * posted, or display the form with or without funky validation
         * errors
-        * @return Bool or Status whether submission was successful.
+        * @return bool|Status Whether submission was successful.
         */
        function show() {
                $this->prepareForm();
@@ -438,11 +443,24 @@ class HTMLForm extends ContextSource {
         * Validate all the fields, and call the submission callback
         * function if everything is kosher.
         * @throws MWException
-        * @return Mixed Bool true == Successful submission, Bool false
+        * @return mixed Bool true == Successful submission, Bool false
         *     == No submission attempted, anything else == Error to
         *     display.
         */
        function trySubmit() {
+               $this->mWasSubmitted = true;
+
+               # Check for cancelled submission
+               foreach ( $this->mFlatFields as $fieldname => $field ) {
+                       if ( !empty( $field->mParams['nodata'] ) ) {
+                               continue;
+                       }
+                       if ( $field->cancelSubmit( $this->mFieldData[$fieldname], $this->mFieldData ) ) {
+                               $this->mWasSubmitted = false;
+                               return false;
+                       }
+               }
+
                # Check for validation
                foreach ( $this->mFlatFields as $fieldname => $field ) {
                        if ( !empty( $field->mParams['nodata'] ) ) {
@@ -468,15 +486,33 @@ class HTMLForm extends ContextSource {
                $data = $this->filterDataForSubmit( $this->mFieldData );
 
                $res = call_user_func( $callback, $data, $this );
+               if ( $res === false ) {
+                       $this->mWasSubmitted = false;
+               }
 
                return $res;
        }
 
+       /**
+        * Test whether the form was considered to have been submitted or not, i.e.
+        * whether the last call to tryAuthorizedSubmit or trySubmit returned
+        * non-false.
+        *
+        * This will return false until HTMLForm::tryAuthorizedSubmit or
+        * HTMLForm::trySubmit is called.
+        *
+        * @since 1.23
+        * @return bool
+        */
+       function wasSubmitted() {
+               return $this->mWasSubmitted;
+       }
+
        /**
         * Set a callback to a function to do something with the form
         * once it's been successfully validated.
         *
-        * @param string $cb function name.  The function will be passed
+        * @param string $cb Function name.  The function will be passed
         *     the output from HTMLForm::filterDataForSubmit, and must
         *     return Bool true on success, Bool false if no submission
         *     was attempted, or String HTML output to display on error.
@@ -492,7 +528,7 @@ class HTMLForm extends ContextSource {
        /**
         * Set a message to display on a validation error.
         *
-        * @param $msg Mixed String or Array of valid inputs to wfMessage()
+        * @param string|array $msg String or Array of valid inputs to wfMessage()
         *     (so each entry can be either a String or Array)
         *
         * @return HTMLForm $this for chaining calls (since 1.20)
@@ -506,7 +542,7 @@ class HTMLForm extends ContextSource {
        /**
         * Set the introductory message, overwriting any existing message.
         *
-        * @param string $msg complete text of message to display
+        * @param string $msg Complete text of message to display
         *
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
@@ -520,7 +556,7 @@ class HTMLForm extends ContextSource {
         * Set the introductory message, overwriting any existing message.
         * @since 1.19
         *
-        * @param string $msg complete text of message to display
+        * @param string $msg Complete text of message to display
         *
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
@@ -533,7 +569,7 @@ class HTMLForm extends ContextSource {
        /**
         * Add introductory text.
         *
-        * @param string $msg complete text of message to display
+        * @param string $msg Complete text of message to display
         *
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
@@ -546,7 +582,7 @@ class HTMLForm extends ContextSource {
        /**
         * Add header text, inside the form.
         *
-        * @param string $msg complete text of message to display
+        * @param string $msg Complete text of message to display
         * @param string $section The section to add the header to
         *
         * @return HTMLForm $this for chaining calls (since 1.20)
@@ -568,8 +604,8 @@ class HTMLForm extends ContextSource {
         * Set header text, inside the form.
         * @since 1.19
         *
-        * @param string $msg complete text of message to display
-        * @param $section The section to add the header to
+        * @param string $msg Complete text of message to display
+        * @param string $section The section to add the header to
         *
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
@@ -608,7 +644,7 @@ class HTMLForm extends ContextSource {
         * Set footer text, inside the form.
         * @since 1.19
         *
-        * @param string $msg complete text of message to display
+        * @param string $msg Complete text of message to display
         * @param string $section The section to add the footer text to
         *
         * @return HTMLForm $this for chaining calls (since 1.20)
@@ -626,7 +662,7 @@ class HTMLForm extends ContextSource {
        /**
         * Add text to the end of the display.
         *
-        * @param string $msg complete text of message to display
+        * @param string $msg Complete text of message to display
         *
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
@@ -639,7 +675,7 @@ class HTMLForm extends ContextSource {
        /**
         * Set text at the end of the display.
         *
-        * @param string $msg complete text of message to display
+        * @param string $msg Complete text of message to display
         *
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
@@ -652,9 +688,9 @@ class HTMLForm extends ContextSource {
        /**
         * Add a hidden field to the output
         *
-        * @param string $name field name.  This will be used exactly as entered
-        * @param string $value field value
-        * @param $attribs Array
+        * @param string $name Field name.  This will be used exactly as entered
+        * @param string $value Field value
+        * @param array $attribs
         *
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
@@ -686,10 +722,10 @@ class HTMLForm extends ContextSource {
        /**
         * Add a button to the form
         *
-        * @param string $name field name.
-        * @param string $value field value
+        * @param string $name Field name.
+        * @param string $value Field value
         * @param string $id DOM id for the button (default: null)
-        * @param $attribs Array
+        * @param array $attribs
         *
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
@@ -707,7 +743,7 @@ class HTMLForm extends ContextSource {
         * Moreover, when doing method chaining this should be the very last method
         * call just after prepareForm().
         *
-        * @param $submitResult Mixed output from HTMLForm::trySubmit()
+        * @param mixed $submitResult Mixed output from HTMLForm::trySubmit()
         *
         * @return Nothing, should be last call
         */
@@ -718,7 +754,7 @@ class HTMLForm extends ContextSource {
        /**
         * Returns the raw HTML generated by the form
         *
-        * @param $submitResult Mixed output from HTMLForm::trySubmit()
+        * @param mixed $submitResult Mixed output from HTMLForm::trySubmit()
         *
         * @return string
         */
@@ -753,7 +789,7 @@ class HTMLForm extends ContextSource {
         *
         * @param string $html HTML contents to wrap.
         *
-        * @return String wrapped HTML.
+        * @return string Wrapped HTML.
         */
        function wrapForm( $html ) {
 
@@ -785,7 +821,7 @@ class HTMLForm extends ContextSource {
 
        /**
         * Get the hidden fields that should go inside the form.
-        * @return String HTML.
+        * @return string HTML.
         */
        function getHiddenFields() {
                global $wgArticlePath;
@@ -814,7 +850,7 @@ class HTMLForm extends ContextSource {
 
        /**
         * Get the submit and (potentially) reset buttons.
-        * @return String HTML.
+        * @return string HTML.
         */
        function getButtons() {
                $buttons = '';
@@ -895,7 +931,7 @@ class HTMLForm extends ContextSource {
 
        /**
         * Get the whole body of the form.
-        * @return String
+        * @return string
         */
        function getBody() {
                return $this->displaySection( $this->mFieldTree, $this->mTableId );
@@ -904,9 +940,9 @@ class HTMLForm extends ContextSource {
        /**
         * Format and display an error message stack.
         *
-        * @param $errors String|Array|Status
+        * @param string|array|Status $errors
         *
-        * @return String
+        * @return string
         */
        function getErrors( $errors ) {
                if ( $errors instanceof Status ) {
@@ -931,7 +967,7 @@ class HTMLForm extends ContextSource {
         *
         * @param array $errors of message keys/values
         *
-        * @return String HTML, a "<ul>" list of errors
+        * @return string HTML, a "<ul>" list of errors
         */
        public static function formatErrors( $errors ) {
                $errorstr = '';
@@ -973,7 +1009,7 @@ class HTMLForm extends ContextSource {
         * Set the text for the submit button to a message
         * @since 1.19
         *
-        * @param string $msg message key
+        * @param string $msg Message key
         *
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
@@ -1018,7 +1054,7 @@ class HTMLForm extends ContextSource {
        /**
         * Set the id for the submit button.
         *
-        * @param $t String.
+        * @param string $t
         *
         * @todo FIXME: Integrity of $t is *not* validated
         * @return HTMLForm $this for chaining calls (since 1.20)
@@ -1050,7 +1086,7 @@ class HTMLForm extends ContextSource {
         *
         * @since 1.22
         *
-        * @param string $id new value of the id attribute, or "" to remove
+        * @param string $id New value of the id attribute, or "" to remove
         *
         * @return HTMLForm $this for chaining calls
         */
@@ -1075,7 +1111,7 @@ class HTMLForm extends ContextSource {
         * Prompt the whole form to be wrapped in a "<fieldset>", with
         * this text as its "<legend>" element.
         *
-        * @param string|false $legend HTML to go inside the "<legend>" element, or
+        * @param string|bool $legend HTML to go inside the "<legend>" element, or
         * false for no <legend>
         *     Will be escaped
         *
@@ -1092,7 +1128,7 @@ class HTMLForm extends ContextSource {
         * this message as its "<legend>" element.
         * @since 1.19
         *
-        * @param string $msg message key
+        * @param string $msg Message key
         *
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
@@ -1107,7 +1143,7 @@ class HTMLForm extends ContextSource {
         * @todo Currently only used for the "<fieldset>" legend on forms
         * with multiple sections; should be used elsewhere?
         *
-        * @param $p String
+        * @param string $p
         *
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
@@ -1120,7 +1156,7 @@ class HTMLForm extends ContextSource {
        /**
         * Set the title for form submission
         *
-        * @param $t Title of page the form is on/should be posted to
+        * @param Title $t Title of page the form is on/should be posted to
         *
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
@@ -1143,7 +1179,7 @@ class HTMLForm extends ContextSource {
        /**
         * Set the method used to submit the form
         *
-        * @param $method String
+        * @param string $method
         *
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
@@ -1166,9 +1202,9 @@ class HTMLForm extends ContextSource {
         *   section, ignored if empty.
         * @param string $fieldsetIDPrefix ID prefix for the "<fieldset>" tag of
         *   each subsection, ignored if empty.
-        * @param boolean &$hasUserVisibleFields Whether the section had user-visible fields.
+        * @param bool &$hasUserVisibleFields Whether the section had user-visible fields.
         *
-        * @return String
+        * @return string
         */
        public function displaySection( $fields,
                $sectionName = '',
@@ -1302,8 +1338,7 @@ class HTMLForm extends ContextSource {
        /**
         * Stop a reset button being shown for this form
         *
-        * @param bool $suppressReset set to false to re-enable the
-        *     button again
+        * @param bool $suppressReset Set to false to re-enable the button again
         *
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
@@ -1318,7 +1353,7 @@ class HTMLForm extends ContextSource {
         * to the form as a whole, after it's submitted but before it's
         * processed.
         *
-        * @param $data
+        * @param array $data
         *
         * @return
         */
@@ -1330,9 +1365,9 @@ class HTMLForm extends ContextSource {
         * Get a string to go in the "<legend>" of a section fieldset.
         * Override this if you want something more complicated.
         *
-        * @param $key String
+        * @param string $key
         *
-        * @return String
+        * @return string
         */
        public function getLegend( $key ) {
                return $this->msg( "{$this->mMessagePrefix}-$key" )->text();
index e6d316c..0e1860b 100644 (file)
@@ -16,6 +16,7 @@ abstract class HTMLFormField {
        protected $mDefault;
        protected $mOptions = false;
        protected $mOptionsLabelsNotFromMessage = false;
+       protected $mHideIf = null;
 
        /**
         * @var bool If true will generate an empty div element with no label
@@ -48,7 +49,7 @@ abstract class HTMLFormField {
         *
         * Parameters are the same as wfMessage().
         *
-        * @return Message object
+        * @return Message
         */
        function msg() {
                $args = func_get_args();
@@ -62,17 +63,214 @@ abstract class HTMLFormField {
                return call_user_func_array( $callback, $args );
        }
 
+
+       /**
+        * Fetch a field value from $alldata for the closest field matching a given
+        * name.
+        *
+        * This is complex because it needs to handle array fields like the user
+        * would expect. The general algorithm is to look for $name as a sibling
+        * of $this, then a sibling of $this's parent, and so on. Keeping in mind
+        * that $name itself might be referencing an array.
+        *
+        * @param array $alldata
+        * @param string $name
+        * @return string
+        */
+       protected function getNearestFieldByName( $alldata, $name ) {
+               $tmp = $this->mName;
+               $thisKeys = array();
+               while ( preg_match( '/^(.+)\[([^\]]+)\]$/', $tmp, $m ) ) {
+                       array_unshift( $thisKeys, $m[2] );
+                       $tmp = $m[1];
+               }
+               if ( substr( $tmp, 0, 2 ) == 'wp' &&
+                       !isset( $alldata[$tmp] ) &&
+                       isset( $alldata[substr( $tmp, 2 )] )
+               ) {
+                       // Adjust for name mangling.
+                       $tmp = substr( $tmp, 2 );
+               }
+               array_unshift( $thisKeys, $tmp );
+
+               $tmp = $name;
+               $nameKeys = array();
+               while ( preg_match( '/^(.+)\[([^\]]+)\]$/', $tmp, $m ) ) {
+                       array_unshift( $nameKeys, $m[2] );
+                       $tmp = $m[1];
+               }
+               array_unshift( $nameKeys, $tmp );
+
+               $testValue = '';
+               for ( $i = count( $thisKeys ) - 1; $i >= 0; $i-- ) {
+                       $keys = array_merge( array_slice( $thisKeys, 0, $i ), $nameKeys );
+                       $data = $alldata;
+                       while ( $keys ) {
+                               $key = array_shift( $keys );
+                               if ( !is_array( $data ) || !isset( $data[$key] ) ) {
+                                       continue 2;
+                               }
+                               $data = $data[$key];
+                       }
+                       $testValue = $data;
+                       break;
+               }
+
+               return $testValue;
+       }
+
+       /**
+        * Helper function for isHidden to handle recursive data structures.
+        *
+        * @param array $alldata
+        * @param array $params
+        * @return boolean
+        */
+       protected function isHiddenRecurse( array $alldata, array $params ) {
+               $origParams = $params;
+               $op = array_shift( $params );
+
+               try {
+                       switch ( $op ) {
+                               case 'AND':
+                                       foreach ( $params as $i => $p ) {
+                                               if ( !is_array( $p ) ) {
+                                                       throw new MWException(
+                                                               "Expected array, found " . gettype( $p ) . " at index $i"
+                                                       );
+                                               }
+                                               if ( !$this->isHiddenRecurse( $alldata, $p ) ) {
+                                                       return false;
+                                               }
+                                       }
+                                       return true;
+
+                               case 'OR':
+                                       foreach ( $params as $p ) {
+                                               if ( !is_array( $p ) ) {
+                                                       throw new MWException(
+                                                               "Expected array, found " . gettype( $p ) . " at index $i"
+                                                       );
+                                               }
+                                               if ( $this->isHiddenRecurse( $alldata, $p ) ) {
+                                                       return true;
+                                               }
+                                       }
+                                       return false;
+
+                               case 'NAND':
+                                       foreach ( $params as $i => $p ) {
+                                               if ( !is_array( $p ) ) {
+                                                       throw new MWException(
+                                                               "Expected array, found " . gettype( $p ) . " at index $i"
+                                                       );
+                                               }
+                                               if ( !$this->isHiddenRecurse( $alldata, $p ) ) {
+                                                       return true;
+                                               }
+                                       }
+                                       return false;
+
+                               case 'NOR':
+                                       foreach ( $params as $p ) {
+                                               if ( !is_array( $p ) ) {
+                                                       throw new MWException(
+                                                               "Expected array, found " . gettype( $p ) . " at index $i"
+                                                       );
+                                               }
+                                               if ( $this->isHiddenRecurse( $alldata, $p ) ) {
+                                                       return false;
+                                               }
+                                       }
+                                       return true;
+
+                               case 'NOT':
+                                       if ( count( $params ) !== 1 ) {
+                                               throw new MWException( "NOT takes exactly one parameter" );
+                                       }
+                                       $p = $params[0];
+                                       if ( !is_array( $p ) ) {
+                                               throw new MWException(
+                                                       "Expected array, found " . gettype( $p ) . " at index 0"
+                                               );
+                                       }
+                                       return !$this->isHiddenRecurse( $alldata, $p );
+
+                               case '===':
+                               case '!==':
+                                       if ( count( $params ) !== 2 ) {
+                                               throw new MWException( "$op takes exactly two parameters" );
+                                       }
+                                       list( $field, $value ) = $params;
+                                       if ( !is_string( $field ) || !is_string( $value ) ) {
+                                               throw new MWException( "Parameters for $op must be strings" );
+                                       }
+                                       $testValue = $this->getNearestFieldByName( $alldata, $field );
+                                       switch ( $op ) {
+                                               case '===':
+                                                       return ( $value === $testValue );
+                                               case '!==':
+                                                       return ( $value !== $testValue );
+                                       }
+
+                               default:
+                                       throw new MWException( "Unknown operation" );
+                       }
+               } catch ( MWException $ex ) {
+                       throw new MWException(
+                               "Invalid hide-if specification for $this->mName: " .
+                               $ex->getMessage() . " in " . var_export( $origParams, true ),
+                               0, $ex
+                       );
+               }
+       }
+
+       /**
+        * Test whether this field is supposed to be hidden, based on the values of
+        * the other form fields.
+        *
+        * @since 1.23
+        * @param array $alldata The data collected from the form
+        * @return bool
+        */
+       function isHidden( $alldata ) {
+               if ( !$this->mHideIf ) {
+                       return false;
+               }
+
+               return $this->isHiddenRecurse( $alldata, $this->mHideIf );
+       }
+
+       /**
+        * Override this function if the control can somehow trigger a form
+        * submission that shouldn't actually submit the HTMLForm.
+        *
+        * @since 1.23
+        * @param string|array $value The value the field was submitted with
+        * @param array $alldata The data collected from the form
+        *
+        * @return bool true to cancel the submission
+        */
+       function cancelSubmit( $value, $alldata ) {
+               return false;
+       }
+
        /**
         * Override this function to add specific validation checks on the
         * field input.  Don't forget to call parent::validate() to ensure
         * that the user-defined callback mValidationCallback is still run
         *
-        * @param string $value The value the field was submitted with
+        * @param string|array $value The value the field was submitted with
         * @param array $alldata The data collected from the form
         *
-        * @return Mixed Bool true on success, or String error to display.
+        * @return bool|string true on success, or String error to display, or
+        *   false to fail validation without displaying an error.
         */
        function validate( $value, $alldata ) {
+               if ( $this->isHidden( $alldata ) ) {
+                       return true;
+               }
+
                if ( isset( $this->mParams['required'] )
                        && $this->mParams['required'] !== false
                        && $value === ''
@@ -123,7 +321,7 @@ abstract class HTMLFormField {
         * or the input's default value if it has not been set.
         *
         * @param WebRequest $request
-        * @return String the value
+        * @return string The value
         */
        function loadDataFromRequest( $request ) {
                if ( $request->getCheck( $this->mName ) ) {
@@ -173,6 +371,7 @@ abstract class HTMLFormField {
                }
 
                $validName = Sanitizer::escapeId( $this->mName );
+               $validName = str_replace( array( '.5B', '.5D' ), array( '[', ']' ), $validName );
                if ( $this->mName != $validName && !isset( $params['nodata'] ) ) {
                        throw new MWException( "Invalid name '{$this->mName}' passed to " . __METHOD__ );
                }
@@ -213,6 +412,10 @@ abstract class HTMLFormField {
                if ( isset( $params['hidelabel'] ) ) {
                        $this->mShowEmptyLabels = false;
                }
+
+               if ( isset( $params['hide-if'] ) ) {
+                       $this->mHideIf = $params['hide-if'];
+               }
        }
 
        /**
@@ -229,6 +432,8 @@ abstract class HTMLFormField {
                $fieldType = get_class( $this );
                $helptext = $this->getHelpTextHtmlTable( $this->getHelpText() );
                $cellAttributes = array();
+               $rowAttributes = array();
+               $rowClasses = '';
 
                if ( !empty( $this->mParams['vertical-label'] ) ) {
                        $cellAttributes['colspan'] = 2;
@@ -245,15 +450,25 @@ abstract class HTMLFormField {
                        $inputHtml . "\n$errors"
                );
 
+               if ( $this->mHideIf ) {
+                       $rowAttributes['data-hide-if'] = FormatJson::encode( $this->mHideIf );
+                       $rowClasses .= ' mw-htmlform-hide-if';
+               }
+
                if ( $verticalLabel ) {
-                       $html = Html::rawElement( 'tr', array( 'class' => 'mw-htmlform-vertical-label' ), $label );
+                       $html = Html::rawElement( 'tr',
+                               $rowAttributes + array( 'class' => "mw-htmlform-vertical-label $rowClasses" ), $label );
                        $html .= Html::rawElement( 'tr',
-                               array( 'class' => "mw-htmlform-field-$fieldType {$this->mClass} $errorClass" ),
+                               $rowAttributes + array(
+                                       'class' => "mw-htmlform-field-$fieldType {$this->mClass} $errorClass $rowClasses"
+                               ),
                                $field );
                } else {
                        $html =
                                Html::rawElement( 'tr',
-                                       array( 'class' => "mw-htmlform-field-$fieldType {$this->mClass} $errorClass" ),
+                                       $rowAttributes + array(
+                                               'class' => "mw-htmlform-field-$fieldType {$this->mClass} $errorClass $rowClasses"
+                                       ),
                                        $label . $field );
                }
 
@@ -291,7 +506,15 @@ abstract class HTMLFormField {
                if ( $this->mParent->isVForm() ) {
                        $divCssClasses[] = 'mw-ui-vform-div';
                }
-               $html = Html::rawElement( 'div', array( 'class' => $divCssClasses ), $label . $field );
+
+               $wrapperAttributes = array(
+                       'class' => $divCssClasses,
+               );
+               if ( $this->mHideIf ) {
+                       $wrapperAttributes['data-hide-if'] = FormatJson::encode( $this->mHideIf );
+                       $wrapperAttributes['class'][] = ' mw-htmlform-hide-if';
+               }
+               $html = Html::rawElement( 'div', $wrapperAttributes, $label . $field );
                $html .= $helptext;
 
                return $html;
@@ -333,8 +556,14 @@ abstract class HTMLFormField {
                        return '';
                }
 
+               $rowAttributes = array();
+               if ( $this->mHideIf ) {
+                       $rowAttributes['data-hide-if'] = FormatJson::encode( $this->mHideIf );
+                       $rowAttributes['class'] = 'mw-htmlform-hide-if';
+               }
+
                $row = Html::rawElement( 'td', array( 'colspan' => 2, 'class' => 'htmlform-tip' ), $helptext );
-               $row = Html::rawElement( 'tr', array(), $row );
+               $row = Html::rawElement( 'tr', $rowAttributes, $row );
 
                return $row;
        }
@@ -345,14 +574,21 @@ abstract class HTMLFormField {
         *
         * @param string|null $helptext
         *
-        * @return String
+        * @return string
         */
        public function getHelpTextHtmlDiv( $helptext ) {
                if ( is_null( $helptext ) ) {
                        return '';
                }
 
-               $div = Html::rawElement( 'div', array( 'class' => 'htmlform-tip' ), $helptext );
+               $wrapperAttributes = array(
+                       'class' => 'htmlform-tip',
+               );
+               if ( $this->mHideIf ) {
+                       $wrapperAttributes['data-hide-if'] = FormatJson::encode( $this->mHideIf );
+                       $wrapperAttributes['class'] .= ' mw-htmlform-hide-if';
+               }
+               $div = Html::rawElement( 'div', $wrapperAttributes, $helptext );
 
                return $div;
        }
@@ -362,7 +598,7 @@ abstract class HTMLFormField {
         * @since 1.20
         *
         * @param string|null $helptext
-        * @return String
+        * @return string
         */
        public function getHelpTextHtmlRaw( $helptext ) {
                return $this->getHelpTextHtmlDiv( $helptext );
@@ -411,9 +647,7 @@ abstract class HTMLFormField {
        public function getErrorsAndErrorClass( $value ) {
                $errors = $this->validate( $value, $this->mParent->mFieldData );
 
-               if ( $errors === true ||
-                       ( !$this->mParent->getRequest()->wasPosted() && $this->mParent->getMethod() === 'post' )
-               ) {
+               if ( is_bool( $errors ) || !$this->mParent->wasSubmitted() ) {
                        $errors = '';
                        $errorClass = '';
                } else {
@@ -596,8 +830,7 @@ abstract class HTMLFormField {
         * flatten an array of options to a single array, for instance,
         * a set of "<options>" inside "<optgroups>".
         *
-        * @param array $options Associative Array with values either Strings
-        *     or Arrays
+        * @param array $options Associative Array with values either Strings or Arrays
         * @return array Flattened input
         */
        public static function flattenOptions( $options ) {
@@ -617,7 +850,7 @@ abstract class HTMLFormField {
        /**
         * Formats one or more errors as accepted by field validation-callback.
         *
-        * @param string|Message|array $errors String|Message|Array of strings or Message instances
+        * @param string|Message|array $errors Array of strings or Message instances
         * @return string HTML
         * @since 1.18
         */
diff --git a/includes/htmlform/HTMLFormFieldCloner.php b/includes/htmlform/HTMLFormFieldCloner.php
new file mode 100644 (file)
index 0000000..597a03f
--- /dev/null
@@ -0,0 +1,380 @@
+<?php
+
+/**
+ * A container for HTMLFormFields that allows for multiple copies of the set of
+ * fields to be displayed to and entered by the user.
+ *
+ * Recognized parameters, besides the general ones, include:
+ *   fields - HTMLFormField descriptors for the subfields this cloner manages.
+ *     The format is just like for the HTMLForm. A field with key 'delete' is
+ *     special: it must have type = submit and will serve to delete the group
+ *     of fields.
+ *   required - If specified, at least one group of fields must be submitted.
+ *   format - HTMLForm display format to use when displaying the subfields:
+ *     'table', 'div', or 'raw'.
+ *   row-legend - If non-empty, each group of subfields will be enclosed in a
+ *     fieldset. The value is the name of a message key to use as the legend.
+ *   create-button-message - Message key to use as the text of the button to
+ *     add an additional group of fields.
+ *   delete-button-message - Message key to use as the text of automatically-
+ *     generated 'delete' button. Ignored if 'delete' is included in 'fields'.
+ *
+ * In the generated HTML, the subfields will be named along the lines of
+ * "clonerName[index][fieldname]", with ids "clonerId--index--fieldid". 'index'
+ * may be a number or an arbitrary string, and may likely change when the page
+ * is resubmitted. Cloners may be nested, resulting in field names along the
+ * lines of "cloner1Name[index1][cloner2Name][index2][fieldname]" and
+ * corresponding ids.
+ *
+ * Use of cloner may result in submissions of the page that are not submissions
+ * of the HTMLForm, when non-JavaScript clients use the create or remove buttons.
+ *
+ * The result is an array, with values being arrays mapping subfield names to
+ * their values. On non-HTMLForm-submission page loads, there may also be
+ * additional (string) keys present with other types of values.
+ *
+ * @since 1.23
+ */
+class HTMLFormFieldCloner extends HTMLFormField {
+       private static $counter = 0;
+
+       /**
+        * @var string String uniquely identifying this cloner instance and
+        * unlikely to exist otherwise in the generated HTML, while still being
+        * valid as part of an HTML id.
+        */
+       protected $uniqueId;
+
+       public function __construct( $params ) {
+               $this->uniqueId = get_class( $this ) . ++self::$counter . 'x';
+               parent::__construct( $params );
+
+               if ( empty( $this->mParams['fields'] ) || !is_array( $this->mParams['fields'] ) ) {
+                       throw new MWException( 'HTMLFormFieldCloner called without any fields' );
+               }
+
+               // Make sure the delete button, if explicitly specified, is sane
+               if ( isset( $this->mParams['fields']['delete'] ) ) {
+                       $class = 'mw-htmlform-cloner-delete-button';
+                       $info = $this->mParams['fields']['delete'] + array(
+                               'cssclass' => $class
+                       );
+                       unset( $info['name'], $info['class'] );
+
+                       if ( !isset( $info['type'] ) || $info['type'] !== 'submit' ) {
+                               throw new MWException(
+                                       'HTMLFormFieldCloner delete field, if specified, must be of type "submit"'
+                               );
+                       }
+
+                       if ( !in_array( $class, explode( ' ', $info['cssclass'] ) ) ) {
+                               $info['cssclass'] .= " $class";
+                       }
+
+                       $this->mParams['fields']['delete'] = $info;
+               }
+       }
+
+       /**
+        * Create the HTMLFormFields that go inside this element, using the
+        * specified key.
+        *
+        * @param string $key Array key under which these fields should be named
+        * @return HTMLFormFields[]
+        */
+       protected function createFieldsForKey( $key ) {
+               $fields = array();
+               foreach ( $this->mParams['fields'] as $fieldname => $info ) {
+                       $name = "{$this->mName}[$key][$fieldname]";
+                       if ( isset( $info['name'] ) ) {
+                               $info['name'] = "{$this->mName}[$key][{$info['name']}]";
+                       } else {
+                               $info['name'] = $name;
+                       }
+                       if ( isset( $info['id'] ) ) {
+                               $info['id'] = Sanitizer::escapeId( "{$this->mID}--$key--{$info['id']}" );
+                       } else {
+                               $info['id'] = Sanitizer::escapeId( "{$this->mID}--$key--$fieldname" );
+                       }
+                       $field = HTMLForm::loadInputFromParameters( $name, $info );
+                       $field->mParent = $this->mParent;
+                       $fields[$fieldname] = $field;
+               }
+               return $fields;
+       }
+
+       /**
+        * Re-key the specified values array to match the names applied by
+        * createFieldsForKey().
+        *
+        * @param string $key Array key under which these fields should be named
+        * @param array $values Values array from the request
+        * @return array
+        */
+       protected function rekeyValuesArray( $key, $values ) {
+               $data = array();
+               foreach ( $values as $fieldname => $value ) {
+                       $name = "{$this->mName}[$key][$fieldname]";
+                       $data[$name] = $value;
+               }
+               return $data;
+       }
+
+       protected function needsLabel() {
+               return false;
+       }
+
+       public function loadDataFromRequest( $request ) {
+               // It's possible that this might be posted with no fields. Detect that
+               // by looking for an edit token.
+               if ( !$request->getCheck( 'wpEditToken' ) && $request->getArray( $this->mName ) === null ) {
+                       return $this->getDefault();
+               }
+
+               $values = $request->getArray( $this->mName );
+               if ( $values === null ) {
+                       $values = array();
+               }
+
+               $ret = array();
+               foreach ( $values as $key => $value ) {
+                       if ( $key === 'create' || isset( $value['delete'] ) ) {
+                               $ret['nonjs'] = 1;
+                               continue;
+                       }
+
+                       // Add back in $request->getValues() so things that look for e.g.
+                       // wpEditToken don't fail.
+                       $data = $this->rekeyValuesArray( $key, $value ) + $request->getValues();
+
+                       $fields = $this->createFieldsForKey( $key );
+                       $subrequest = new DerivativeRequest( $request, $data, $request->wasPosted() );
+                       $row = array();
+                       foreach ( $fields as $fieldname => $field ) {
+                               if ( !empty( $field->mParams['nodata'] ) ) {
+                                       continue;
+                               } elseif ( !empty( $field->mParams['disabled'] ) ) {
+                                       $row[$fieldname] = $field->getDefault();
+                               } else {
+                                       $row[$fieldname] = $field->loadDataFromRequest( $subrequest );
+                               }
+                       }
+                       $ret[] = $row;
+               }
+
+               if ( isset( $values['create'] ) ) {
+                       // Non-JS client clicked the "create" button.
+                       $fields = $this->createFieldsForKey( $this->uniqueId );
+                       $row = array();
+                       foreach ( $fields as $fieldname => $field ) {
+                               if ( !empty( $field->mParams['nodata'] ) ) {
+                                       continue;
+                               } else {
+                                       $row[$fieldname] = $field->getDefault();
+                               }
+                       }
+                       $ret[] = $row;
+               }
+
+               return $ret;
+       }
+
+       public function getDefault() {
+               $ret = parent::getDefault();
+
+               // The default default is one entry with all subfields at their
+               // defaults.
+               if ( $ret === null ) {
+                       $fields = $this->createFieldsForKey( $this->uniqueId );
+                       $row = array();
+                       foreach ( $fields as $fieldname => $field ) {
+                               if ( !empty( $field->mParams['nodata'] ) ) {
+                                       continue;
+                               } else {
+                                       $row[$fieldname] = $field->getDefault();
+                               }
+                       }
+                       $ret = array( $row );
+               }
+
+               return $ret;
+       }
+
+       public function cancelSubmit( $values, $alldata ) {
+               if ( isset( $values['nonjs'] ) ) {
+                       return true;
+               }
+
+               foreach ( $values as $key => $value ) {
+                       $fields = $this->createFieldsForKey( $key );
+                       foreach ( $fields as $fieldname => $field ) {
+                               if ( !empty( $field->mParams['nodata'] ) ) {
+                                       continue;
+                               }
+                               if ( $field->cancelSubmit( $value[$fieldname], $alldata ) ) {
+                                       return true;
+                               }
+                       }
+               }
+
+               return parent::cancelSubmit( $values, $alldata );
+       }
+
+       public function validate( $values, $alldata ) {
+               if ( isset( $this->mParams['required'] )
+                       && $this->mParams['required'] !== false
+                       && !$values
+               ) {
+                       return $this->msg( 'htmlform-cloner-required' )->parseAsBlock();
+               }
+
+               if ( isset( $values['nonjs'] ) ) {
+                       // The submission was a non-JS create/delete click, so fail
+                       // validation in case cancelSubmit() somehow didn't already handle
+                       // it.
+                       return false;
+               }
+
+               foreach ( $values as $key => $value ) {
+                       $fields = $this->createFieldsForKey( $key );
+                       foreach ( $fields as $fieldname => $field ) {
+                               if ( !empty( $field->mParams['nodata'] ) ) {
+                                       continue;
+                               }
+                               $ok = $field->validate( $value[$fieldname], $alldata );
+                               if ( $ok !== true ) {
+                                       return false;
+                               }
+                       }
+               }
+
+               return parent::validate( $values, $alldata );
+       }
+
+       /**
+        * Get the input HTML for the specified key.
+        *
+        * @param string $key Array key under which the fields should be named
+        * @param array $values
+        * @return string
+        */
+       protected function getInputHTMLForKey( $key, $values ) {
+               $displayFormat = isset( $this->mParams['format'] )
+                       ? $this->mParams['format']
+                       : $this->mParent->getDisplayFormat();
+
+               switch ( $displayFormat ) {
+                       case 'table':
+                               $getFieldHtmlMethod = 'getTableRow';
+                               break;
+                       case 'vform':
+                               // Close enough to a div.
+                               $getFieldHtmlMethod = 'getDiv';
+                               break;
+                       default:
+                               $getFieldHtmlMethod = 'get' . ucfirst( $displayFormat );
+               }
+
+               $html = '';
+               $hasLabel = false;
+
+               $fields = $this->createFieldsForKey( $key );
+               foreach ( $fields as $fieldname => $field ) {
+                       $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 ( !isset( $fields['delete'] ) ) {
+                       $name = "{$this->mName}[$key][delete]";
+                       $label = isset( $this->mParams['delete-button-message'] )
+                               ? $this->mParams['delete-button-message']
+                               : 'htmlform-cloner-delete';
+                       $field = HTMLForm::loadInputFromParameters( $name, array(
+                               'type' => 'submit',
+                               'name' => $name,
+                               'id' => Sanitizer::escapeId( "{$this->mID}--$key--delete" ),
+                               'cssclass' => 'mw-htmlform-cloner-delete-button',
+                               'default' => $this->msg( $label )->text(),
+                       ) );
+                       $v = $field->getDefault();
+
+                       if ( $displayFormat === 'table' ) {
+                               $html .= $field->$getFieldHtmlMethod( $v );
+                       } else {
+                               $html .= $field->getInputHTML( $v );
+                       }
+               }
+
+               if ( $displayFormat !== 'raw' ) {
+                       $classes = array(
+                               'mw-htmlform-cloner-row',
+                       );
+
+                       if ( !$hasLabel ) { // Avoid strange spacing when no labels exist
+                               $classes[] = 'mw-htmlform-nolabel';
+                       }
+
+                       $attribs = array(
+                               'class' => implode( ' ', $classes ),
+                       );
+
+                       if ( $displayFormat === 'table' ) {
+                               $html = Html::rawElement( 'table',
+                                       $attribs,
+                                       Html::rawElement( 'tbody', array(), "\n$html\n" ) ) . "\n";
+                       } elseif ( $displayFormat === 'div' || $displayFormat === 'vform' ) {
+                               $html = Html::rawElement( 'div', $attribs, "\n$html\n" );
+                       }
+               }
+
+               if ( !empty( $this->mParams['row-legend'] ) ) {
+                       $legend = $this->msg( $this->mParams['row-legend'] )->text();
+                       $html = Xml::fieldset( $legend, $html );
+               }
+
+               return $html;
+       }
+
+       public function getInputHTML( $values ) {
+               $html = '';
+
+               foreach ( (array)$values as $key => $value ) {
+                       if ( $key === 'nonjs' ) {
+                               continue;
+                       }
+                       $html .= Html::rawElement( 'li', array( 'class' => 'mw-htmlform-cloner-li' ),
+                               $this->getInputHTMLForKey( $key, $value )
+                       );
+               }
+
+               $template = $this->getInputHTMLForKey( $this->uniqueId, null );
+               $html = Html::rawElement( 'ul', array(
+                       'id' => "mw-htmlform-cloner-list-{$this->mID}",
+                       'class' => 'mw-htmlform-cloner-ul',
+                       'data-template' => $template,
+                       'data-unique-id' => $this->uniqueId,
+               ), $html );
+
+               $name = "{$this->mName}[create]";
+               $label = isset( $this->mParams['create-button-message'] )
+                       ? $this->mParams['create-button-message']
+                       : 'htmlform-cloner-create';
+               $field = HTMLForm::loadInputFromParameters( $name, array(
+                       'type' => 'submit',
+                       'name' => $name,
+                       'id' => Sanitizer::escapeId( "{$this->mID}--create" ),
+                       'cssclass' => 'mw-htmlform-cloner-create-button',
+                       'default' => $this->msg( $label )->text(),
+               ) );
+               $html .= $field->getInputHTML( $field->getDefault() );
+
+               return $html;
+       }
+}
index 003ccfe..6ea95ed 100644 (file)
@@ -5,7 +5,7 @@ class HTMLHiddenField extends HTMLFormField {
                parent::__construct( $params );
 
                # Per HTML5 spec, hidden fields cannot be 'required'
-               # http://dev.w3.org/html5/spec/states-of-the-type-attribute.html#hidden-state
+               # http://www.w3.org/TR/html5/forms.html#hidden-state-%28type=hidden%29
                unset( $this->mParams['required'] );
        }
 
index f802771..576f5cd 100644 (file)
@@ -70,9 +70,9 @@ class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable
        }
 
        /**
-        * @param $request WebRequest
+        * @param WebRequest $request
         *
-        * @return String
+        * @return string
         */
        function loadDataFromRequest( $request ) {
                if ( $this->mParent->getMethod() == 'post' ) {
index f6f3ad5..2c09ea4 100644 (file)
@@ -5,7 +5,7 @@ interface HTMLNestedFilterable {
         * Support for seperating multi-option preferences into multiple preferences
         * Due to lack of array support.
         *
-        * @param $data array
+        * @param array $data
         */
        function filterDataForSubmit( $data );
 }
index c52f0a8..8765407 100644 (file)
@@ -28,9 +28,9 @@ class HTMLRadioField extends HTMLFormField {
         * This returns a block of all the radio options, in one cell.
         * @see includes/HTMLFormField#getInputHTML()
         *
-        * @param $value String
+        * @param string $value
         *
-        * @return String
+        * @return string
         */
        function getInputHTML( $value ) {
                $html = $this->formatOptions( $this->getOptions(), strval( $value ) );
index bb42d53..19b2f7c 100644 (file)
@@ -60,9 +60,9 @@ class HTMLSelectAndOtherField extends HTMLSelectField {
        }
 
        /**
-        * @param $request WebRequest
+        * @param WebRequest $request
         *
-        * @return Array("<overall message>","<select value>","<text field value>")
+        * @return array("<overall message>","<select value>","<text field value>")
         */
        function loadDataFromRequest( $request ) {
                if ( $request->getCheck( $this->mName ) ) {
index 21f3b77..a001c43 100644 (file)
@@ -62,9 +62,9 @@ class HTMLSelectOrOtherField extends HTMLTextField {
        }
 
        /**
-        * @param $request WebRequest
+        * @param WebRequest $request
         *
-        * @return String
+        * @return string
         */
        function loadDataFromRequest( $request ) {
                if ( $request->getCheck( $this->mName ) ) {
index 2eaf1fb..1c7762b 100644 (file)
@@ -49,9 +49,9 @@ class CliInstaller extends Installer {
        /**
         * Constructor.
         *
-        * @param $siteName
-        * @param $admin
-        * @param $option Array
+        * @param string $siteName
+        * @param string $admin
+        * @param array $option
         */
        function __construct( $siteName, $admin = null, array $option = array() ) {
                global $wgContLang;
@@ -159,7 +159,7 @@ class CliInstaller extends Installer {
        }
 
        /**
-        * @param $params array
+        * @param array $params
         *
         * @return string
         */
index 321884b..8a01b32 100644 (file)
@@ -219,7 +219,7 @@ abstract class DatabaseInstaller {
        /**
         * Get the DBMS-specific options for LocalSettings.php generation.
         *
-        * @return String
+        * @return string
         */
        abstract public function getLocalSettings();
 
@@ -267,7 +267,7 @@ abstract class DatabaseInstaller {
        /**
         * Perform database upgrades
         *
-        * @return Boolean
+        * @return bool
         */
        public function doUpgrade() {
                $this->setupSchemaVars();
@@ -314,7 +314,7 @@ abstract class DatabaseInstaller {
        /**
         * Construct and initialise parent.
         * This is typically only called from Installer::getDBInstaller()
-        * @param $parent
+        * @param WebInstaller $parent
         */
        public function __construct( $parent ) {
                $this->parent = $parent;
@@ -324,7 +324,7 @@ abstract class DatabaseInstaller {
         * Convenience function.
         * Check if a named extension is present.
         *
-        * @param $name
+        * @param string $name
         * @return bool
         */
        protected static function checkExtension( $name ) {
@@ -333,7 +333,7 @@ abstract class DatabaseInstaller {
 
        /**
         * Get the internationalised name for this DBMS.
-        * @return String
+        * @return string
         */
        public function getReadableName() {
                // Messages: config-type-mysql, config-type-postgres, config-type-sqlite,
@@ -360,8 +360,8 @@ abstract class DatabaseInstaller {
 
        /**
         * Get a variable, taking local defaults into account.
-        * @param $var string
-        * @param $default null
+        * @param string $var
+        * @param mixed|null $default
         * @return mixed
         */
        public function getVar( $var, $default = null ) {
@@ -378,8 +378,8 @@ abstract class DatabaseInstaller {
 
        /**
         * Convenience alias for $this->parent->setVar()
-        * @param $name string
-        * @param $value mixed
+        * @param string $name
+        * @param mixed $value
         */
        public function setVar( $name, $value ) {
                $this->parent->setVar( $name, $value );
@@ -388,10 +388,10 @@ abstract class DatabaseInstaller {
        /**
         * Get a labelled text box to configure a local variable.
         *
-        * @param $var string
-        * @param $label string
-        * @param $attribs array
-        * @param $helpData string
+        * @param string $var
+        * @param string $label
+        * @param array $attribs
+        * @param string $helpData
         * @return string
         */
        public function getTextBox( $var, $label, $attribs = array(), $helpData = "" ) {
@@ -415,10 +415,10 @@ abstract class DatabaseInstaller {
         * Get a labelled password box to configure a local variable.
         * Implements password hiding.
         *
-        * @param $var string
-        * @param $label string
-        * @param $attribs array
-        * @param $helpData string
+        * @param string $var
+        * @param string $label
+        * @param array $attribs
+        * @param string $helpData
         * @return string
         */
        public function getPasswordBox( $var, $label, $attribs = array(), $helpData = "" ) {
@@ -464,8 +464,7 @@ abstract class DatabaseInstaller {
        /**
         * Get a set of labelled radio buttons.
         *
-        * @param $params Array:
-        *    Parameters are:
+        * @param array $params Parameters are:
         *      var:            The variable to be configured (required)
         *      label:          The message name for the label (required)
         *      itemLabelPrefix: The message name prefix for the item labels (required)
@@ -485,7 +484,7 @@ abstract class DatabaseInstaller {
         * Convenience function to set variables based on form data.
         * Assumes that variables containing "password" in the name are (potentially
         * fake) passwords.
-        * @param $varNames Array
+        * @param array $varNames
         * @return array
         */
        public function setVarsFromRequest( $varNames ) {
@@ -500,7 +499,7 @@ abstract class DatabaseInstaller {
         * Traditionally, this is done by testing for the existence of either
         * the revision table or the cur table.
         *
-        * @return Boolean
+        * @return bool
         */
        public function needsUpgrade() {
                $status = $this->getConnection();
@@ -519,7 +518,7 @@ abstract class DatabaseInstaller {
        /**
         * Get a standard install-user fieldset.
         *
-        * @return String
+        * @return string
         */
        public function getInstallUserBox() {
                return Html::openElement( 'fieldset' ) .
@@ -554,7 +553,7 @@ abstract class DatabaseInstaller {
         * @param string|bool $noCreateMsg Message to display instead of the creation checkbox.
         *   Set this to false to show a creation checkbox (default).
         *
-        * @return String
+        * @return string
         */
        public function getWebUserBox( $noCreateMsg = false ) {
                $wrapperStyle = $this->getVar( '_SameAccount' ) ? 'display: none' : '';
index b7a718f..82a358e 100644 (file)
@@ -232,9 +232,9 @@ abstract class DatabaseUpdater {
        /**
         * @since 1.19
         *
-        * @param $tableName string
-        * @param $indexName string
-        * @param $sqlPath string
+        * @param string $tableName
+        * @param string $indexName
+        * @param string $sqlPath
         */
        public function addExtensionIndex( $tableName, $indexName, $sqlPath ) {
                $this->extensionUpdates[] = array( 'addIndex', $tableName, $indexName, $sqlPath, true );
@@ -244,9 +244,9 @@ abstract class DatabaseUpdater {
         *
         * @since 1.19
         *
-        * @param $tableName string
-        * @param $columnName string
-        * @param $sqlPath string
+        * @param string $tableName
+        * @param string $columnName
+        * @param string $sqlPath
         */
        public function addExtensionField( $tableName, $columnName, $sqlPath ) {
                $this->extensionUpdates[] = array( 'addField', $tableName, $columnName, $sqlPath, true );
@@ -256,9 +256,9 @@ abstract class DatabaseUpdater {
         *
         * @since 1.20
         *
-        * @param $tableName string
-        * @param $columnName string
-        * @param $sqlPath string
+        * @param string $tableName
+        * @param string $columnName
+        * @param string $sqlPath
         */
        public function dropExtensionField( $tableName, $columnName, $sqlPath ) {
                $this->extensionUpdates[] = array( 'dropField', $tableName, $columnName, $sqlPath, true );
@@ -281,8 +281,8 @@ abstract class DatabaseUpdater {
         *
         * @since 1.20
         *
-        * @param $tableName string
-        * @param $sqlPath string
+        * @param string $tableName
+        * @param string $sqlPath
         */
        public function dropExtensionTable( $tableName, $sqlPath ) {
                $this->extensionUpdates[] = array( 'dropTable', $tableName, $sqlPath, true );
@@ -296,7 +296,7 @@ abstract class DatabaseUpdater {
         * @param string $tableName The table name
         * @param string $oldIndexName The old index name
         * @param string $newIndexName The new index name
-        * @param $skipBothIndexExistWarning Boolean: Whether to warn if both the old
+        * @param bool $skipBothIndexExistWarning Whether to warn if both the old
         * and the new indexes exist. [facultative; by default, false]
         * @param string $sqlPath The path to the SQL change path
         */
@@ -329,7 +329,7 @@ abstract class DatabaseUpdater {
         *
         * @since 1.20
         *
-        * @param $tableName string
+        * @param string $tableName
         * @return bool
         */
        public function tableExists( $tableName ) {
@@ -352,7 +352,7 @@ abstract class DatabaseUpdater {
        /**
         * Get the list of extension-defined updates
         *
-        * @return Array
+        * @return array
         */
        protected function getExtensionUpdates() {
                return $this->extensionUpdates;
@@ -371,6 +371,7 @@ abstract class DatabaseUpdater {
         * @since 1.21
         *
         * Writes the schema updates desired to a file for the DB Admin to run.
+        * @param array $schemaUpdate
         */
        private function writeSchemaUpdateFile( $schemaUpdate = array() ) {
                $updates = $this->updatesSkipped;
@@ -423,9 +424,8 @@ abstract class DatabaseUpdater {
        /**
         * Helper function for doUpdates()
         *
-        * @param array $updates of updates to run
-        * @param bool $passSelf Whether to pass this object we calling external
-        *                  functions
+        * @param array $updates Array of updates to run
+        * @param bool $passSelf Whether to pass this object we calling external functions
         */
        private function runUpdates( array $updates, $passSelf ) {
                $updatesDone = array();
@@ -507,7 +507,7 @@ abstract class DatabaseUpdater {
         * class does). Pre-1.17 wikis won't have this column, and really old wikis
         * might not even have updatelog at all
         *
-        * @return boolean
+        * @return bool
         */
        protected function canUseNewUpdatelog() {
                return $this->db->tableExists( 'updatelog', __METHOD__ ) &&
@@ -627,7 +627,7 @@ abstract class DatabaseUpdater {
         * Applies a SQL patch
         *
         * @param string $path Path to the patch file
-        * @param $isFullPath Boolean Whether to treat $path as a relative or not
+        * @param bool $isFullPath Whether to treat $path as a relative or not
         * @param string $msg Description of the patch
         * @return bool False if patch is skipped.
         */
@@ -780,7 +780,7 @@ abstract class DatabaseUpdater {
         * @param string $table Name of the table to modify
         * @param string $oldIndex Old name of the index
         * @param string $newIndex New name of the index
-        * @param $skipBothIndexExistWarning Boolean: Whether to warn if both the
+        * @param bool $skipBothIndexExistWarning Whether to warn if both the
         * old and the new indexes exist.
         * @param string $patch Path to the patch file
         * @param bool $fullpath Whether to treat $patch path as a relative or not
index 48f850f..17c5ab2 100644 (file)
@@ -71,7 +71,7 @@ abstract class Installer {
        /**
         * Minimum memory size in MB.
         *
-        * @var integer
+        * @var int
         */
        protected $minMemorySize = 50;
 
@@ -170,7 +170,6 @@ abstract class Installer {
                'wgMetaNamespace',
                'wgDeletedDirectory',
                'wgEnableUploads',
-               'wgLogo',
                'wgShellLocale',
                'wgSecretKey',
                'wgUseInstantCommons',
@@ -200,7 +199,7 @@ abstract class Installer {
                '_NamespaceType' => 'site-name',
                '_AdminName' => '', // will be set later, when the user selects language
                '_AdminPassword' => '',
-               '_AdminPassword2' => '',
+               '_AdminPasswordConfirm' => '',
                '_AdminEmail' => '',
                '_Subscribe' => false,
                '_SkipOptional' => 'continue',
@@ -211,6 +210,10 @@ abstract class Installer {
                '_MemCachedServers' => '',
                '_UpgradeKeySupplied' => false,
                '_ExistingDBSettings' => false,
+
+               // $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',
        );
 
        /**
@@ -326,19 +329,19 @@ abstract class Installer {
         * The parameters are like parameters to wfMessage().
         * The messages will be in wikitext format, which will be converted to an
         * output format such as HTML or text before being sent to the user.
-        * @param $msg
+        * @param string $msg
         */
        abstract public function showMessage( $msg /*, ... */ );
 
        /**
         * Same as showMessage(), but for displaying errors
-        * @param $msg
+        * @param string $msg
         */
        abstract public function showError( $msg /*, ... */ );
 
        /**
         * Show a message to the installing user by using a Status object
-        * @param $status Status
+        * @param Status $status
         */
        abstract public function showStatusMessage( Status $status );
 
@@ -448,8 +451,8 @@ abstract class Installer {
        /**
         * Set a MW configuration variable, or internal installer configuration variable.
         *
-        * @param $name String
-        * @param $value Mixed
+        * @param string $name
+        * @param mixed $value
         */
        public function setVar( $name, $value ) {
                $this->settings[$name] = $value;
@@ -460,8 +463,8 @@ abstract class Installer {
         * The defaults come from $GLOBALS (ultimately DefaultSettings.php).
         * Installer variables are typically prefixed by an underscore.
         *
-        * @param $name String
-        * @param $default Mixed
+        * @param string $name
+        * @param mixed $default
         *
         * @return mixed
         */
@@ -485,7 +488,7 @@ abstract class Installer {
        /**
         * Get an instance of DatabaseInstaller for the specified DB type.
         *
-        * @param $type Mixed: DB installer for which is needed, false to use default.
+        * @param mixed $type DB installer for which is needed, false to use default.
         *
         * @return DatabaseInstaller
         */
@@ -507,7 +510,7 @@ abstract class Installer {
        /**
         * Determine if LocalSettings.php exists. If it does, return its variables.
         *
-        * @return Array
+        * @return array
         */
        public static function getExistingLocalSettings() {
                global $IP;
@@ -532,7 +535,7 @@ abstract class Installer {
         * This is a security mechanism to avoid compromise of the password in the
         * event of session ID compromise.
         *
-        * @param $realPassword String
+        * @param string $realPassword
         *
         * @return string
         */
@@ -544,8 +547,8 @@ abstract class Installer {
         * Set a variable which stores a password, except if the new value is a
         * fake password in which case leave it as it is.
         *
-        * @param $name String
-        * @param $value Mixed
+        * @param string $name
+        * @param mixed $value
         */
        public function setPassword( $name, $value ) {
                if ( !preg_match( '/^\*+$/', $value ) ) {
@@ -591,9 +594,9 @@ abstract class Installer {
         * whatever, this function is guarded to catch the attempted DB access and to present
         * some fallback text.
         *
-        * @param $text String
-        * @param $lineStart Boolean
-        * @return String
+        * @param string $text
+        * @param bool $lineStart
+        * @return string
         */
        public function parse( $text, $lineStart = false ) {
                global $wgParser;
@@ -632,7 +635,7 @@ abstract class Installer {
         * Install step which adds a row to the site_stats table with appropriate
         * initial values.
         *
-        * @param $installer DatabaseInstaller
+        * @param DatabaseInstaller $installer
         *
         * @return Status
         */
@@ -969,7 +972,7 @@ abstract class Installer {
 
        /**
         * Helper function to be called from envCheckServer()
-        * @return String
+        * @return string
         */
        abstract protected function envGetDefaultServer();
 
@@ -1120,7 +1123,7 @@ abstract class Installer {
 
        /**
         * Convert a hex string representing a Unicode code point to that code point.
-        * @param $c String
+        * @param string $c
         * @return string
         */
        protected function unicodeChar( $c ) {
@@ -1223,7 +1226,7 @@ abstract class Installer {
         * of known Unix-like defaults, as well as the PATH environment variable
         * (which should maybe make it work for Windows?)
         *
-        * @return Array
+        * @return array
         */
        protected static function getPossibleBinPaths() {
                return array_merge(
@@ -1242,9 +1245,9 @@ abstract class Installer {
         *
         * @param string $path path to search
         * @param array $names of executable names
-        * @param $versionInfo Boolean false or array with two members:
-        *         0 => Command to run for version check, with $1 for the full executable name
-        *         1 => String to compare the output with
+        * @param array|bool $versionInfo False or array with two members:
+        *   0 => Command to run for version check, with $1 for the full executable name
+        *   1 => String to compare the output with
         *
         * If $versionInfo is not false, only executables with a version
         * matching $versionInfo[1] will be returned.
@@ -1282,8 +1285,8 @@ abstract class Installer {
         * @see locateExecutable()
         * @param array $names Array of possible names.
         * @param array|bool $versionInfo Default: false or array with two members:
-        *         0 => Command to run for version check, with $1 for the full executable name
-        *         1 => String to compare the output with
+        *   0 => Command to run for version check, with $1 for the full executable name
+        *   1 => String to compare the output with
         *
         * If $versionInfo is not false, only executables with a version
         * matching $versionInfo[1] will be returned.
@@ -1304,8 +1307,8 @@ abstract class Installer {
         * Checks if scripts located in the given directory can be executed via the given URL.
         *
         * Used only by environment checks.
-        * @param $dir string
-        * @param $url string
+        * @param string $dir
+        * @param string $url
         * @return bool|int|string
         */
        public function dirIsExecutable( $dir, $url ) {
@@ -1370,7 +1373,7 @@ abstract class Installer {
        /**
         * ParserOptions are constructed before we determined the language, so fix it
         *
-        * @param $lang Language
+        * @param Language $lang
         */
        public function setParserLanguage( $lang ) {
                $this->parserOptions->setTargetLanguage( $lang );
@@ -1379,7 +1382,7 @@ abstract class Installer {
 
        /**
         * Overridden by WebInstaller to provide lastPage parameters.
-        * @param $page string
+        * @param string $page
         * @return string
         */
        protected function getDocUrl( $page ) {
@@ -1464,7 +1467,7 @@ abstract class Installer {
         * There must be a config-install-$name message defined per step, which will
         * be shown on install.
         *
-        * @param $installer DatabaseInstaller so we can make callbacks
+        * @param DatabaseInstaller $installer DatabaseInstaller so we can make callbacks
         * @return array
         */
        protected function getInstallSteps( DatabaseInstaller $installer ) {
@@ -1518,7 +1521,7 @@ abstract class Installer {
         * @param array $startCB A callback array for the beginning of each step
         * @param array $endCB A callback array for the end of each step
         *
-        * @return Array of Status objects
+        * @return array Array of Status objects
         */
        public function performInstallation( $startCB, $endCB ) {
                $installResults = array();
@@ -1567,7 +1570,7 @@ abstract class Installer {
         * Generate a secret value for variables using our CryptRand generator.
         * Produce a warning if the random source was insecure.
         *
-        * @param $keys Array
+        * @param array $keys
         * @return Status
         */
        protected function doGenerateKeys( $keys ) {
@@ -1637,7 +1640,7 @@ abstract class Installer {
        }
 
        /**
-        * @param $s Status
+        * @param Status $s
         */
        private function subscribeToMediaWikiAnnounce( Status $s ) {
                $params = array(
@@ -1668,7 +1671,7 @@ abstract class Installer {
        /**
         * Insert Main Page with default content.
         *
-        * @param $installer DatabaseInstaller
+        * @param DatabaseInstaller $installer
         * @return Status
         */
        protected function createMainpage( DatabaseInstaller $installer ) {
@@ -1733,7 +1736,7 @@ abstract class Installer {
         *
         * @param array $callback A valid installation callback array, in this form:
         *    array( 'name' => 'some-unique-name', 'callback' => array( $obj, 'function' ) );
-        * @param string $findStep the step to find. Omit to put the step at the beginning
+        * @param string $findStep The step to find. Omit to put the step at the beginning
         */
        public function addInstallStep( $callback, $findStep = 'BEGINNING' ) {
                $this->extraInstallSteps[$findStep][] = $callback;
index fe036ad..5e89ca4 100644 (file)
@@ -43,7 +43,7 @@ class LocalSettingsGenerator {
        /**
         * Constructor.
         *
-        * @param $installer Installer subclass
+        * @param Installer $installer
         */
        public function __construct( Installer $installer ) {
                $this->installer = $installer;
@@ -105,9 +105,9 @@ class LocalSettingsGenerator {
        /**
         * Returns the escaped version of a string of php code.
         *
-        * @param $string String
+        * @param string $string
         *
-        * @return String
+        * @return string
         */
        public static function escapePhpString( $string ) {
                if ( is_array( $string ) || is_object( $string ) ) {
@@ -131,7 +131,7 @@ class LocalSettingsGenerator {
         * Return the full text of the generated LocalSettings.php file,
         * including the extensions
         *
-        * @return String
+        * @return string
         */
        public function getText() {
                $localSettings = $this->getDefaultText();
@@ -164,7 +164,7 @@ class LocalSettingsGenerator {
        }
 
        /**
-        * @return String
+        * @return string
         */
        protected function buildMemcachedServerList() {
                $servers = $this->values['_MemCachedServers'];
@@ -185,7 +185,7 @@ class LocalSettingsGenerator {
        }
 
        /**
-        * @return String
+        * @return string
         */
        protected function getDefaultText() {
                if ( !$this->values['wgImageMagickConvertCommand'] ) {
@@ -351,7 +351,7 @@ ${serverSetting}
 \$wgUpgradeKey = \"{$this->values['wgUpgradeKey']}\";
 
 ## Default skin: you can change the default skin. Use the internal symbolic
-## names, ie 'cologneblue', 'monobook', 'vector':
+## names, ie 'vector', 'monobook':
 \$wgDefaultSkin = \"{$this->values['wgDefaultSkin']}\";
 
 ## For attaching licensing metadata to pages, and displaying an
index d6c84eb..51db148 100644 (file)
@@ -45,7 +45,9 @@ class MssqlInstaller extends DatabaseInstaller {
                '_WebWindowsAuthentication' => 'sqlauth',
        );
 
-       public $minimumVersion = '9.00.1399'; // SQL Server 2005 RTM (TODO: are SQL Express version numbers different?)
+       // SQL Server 2005 RTM
+       // @todo Are SQL Express version numbers different?)
+       public $minimumVersion = '9.00.1399';
 
        // These are schema-level privs
        // Note: the web user will be created will full permissions if possible, this permission
@@ -66,7 +68,7 @@ class MssqlInstaller extends DatabaseInstaller {
        }
 
        /**
-        * @return Bool
+        * @return bool
         */
        public function isCompiled() {
                return self::checkExtension( 'sqlsrv' );
@@ -135,7 +137,12 @@ class MssqlInstaller extends DatabaseInstaller {
 
        public function submitConnectForm() {
                // Get variables from the request.
-               $newValues = $this->setVarsFromRequest( array( 'wgDBserver', 'wgDBname', 'wgDBmwschema', 'wgDBprefix' ) );
+               $newValues = $this->setVarsFromRequest( array(
+                       'wgDBserver',
+                       'wgDBname',
+                       'wgDBmwschema',
+                       'wgDBprefix'
+               ) );
 
                // Validate them.
                $status = Status::newGood();
@@ -163,7 +170,11 @@ class MssqlInstaller extends DatabaseInstaller {
                }
 
                // User box
-               $this->setVarsFromRequest( array( '_InstallUser', '_InstallPassword', '_InstallWindowsAuthentication' ) );
+               $this->setVarsFromRequest( array(
+                       '_InstallUser',
+                       '_InstallPassword',
+                       '_InstallWindowsAuthentication'
+               ) );
 
                // Try to connect
                $status = $this->getConnection();
@@ -309,7 +320,8 @@ class MssqlInstaller extends DatabaseInstaller {
 
                        if ( $this->schemaExists( $this->getVar( 'wgDBmwschema' ) ) ) {
                                // wgDBmwschema is validated to only contain alphanumeric + underscore, so this is safe
-                               $res = $conn->query( "SELECT permission_name FROM sys.fn_my_permissions( '{$this->getVar( 'wgDBmwschema' )}', 'SCHEMA' )" );
+                               $res = $conn->query( "SELECT permission_name FROM sys.fn_my_permissions( "
+                                       . "'{$this->getVar( 'wgDBmwschema' )}', 'SCHEMA' )" );
 
                                foreach ( $res as $row ) {
                                        $schemaPrivs[$row->permission_name] = true;
@@ -320,9 +332,11 @@ class MssqlInstaller extends DatabaseInstaller {
                // Now check all the grants we'll need to be doing to see if we can
                foreach ( $this->webUserPrivs as $permission ) {
                        if ( ( isset( $schemaPrivs[$permission] ) && $schemaPrivs[$permission] )
-                                       || ( isset( $dbPrivs[$implied[$permission][0]] ) && $dbPrivs[$implied[$permission][0]] )
-                                       || ( isset( $serverPrivs[$implied[$permission][1]] ) && $serverPrivs[$implied[$permission][1]] ) ) {
-
+                                       || ( isset( $dbPrivs[$implied[$permission][0]] )
+                                               && $dbPrivs[$implied[$permission][0]] )
+                                       || ( isset( $serverPrivs[$implied[$permission][1]] )
+                                               && $serverPrivs[$implied[$permission][1]] )
+                       ) {
                                unset( $grantOptions[$permission] );
                        }
                }
@@ -344,8 +358,11 @@ class MssqlInstaller extends DatabaseInstaller {
                } else {
                        $noCreateMsg = 'config-db-web-no-create-privs';
                }
+
                $wrapperStyle = $this->getVar( '_SameAccount' ) ? 'display: none' : '';
-               $displayStyle = $this->getVar( '_WebWindowsAuthentication' ) == 'windowsauth' ? 'display: none' : '';
+               $displayStyle = $this->getVar( '_WebWindowsAuthentication' ) == 'windowsauth'
+                       ? 'display: none'
+                       : '';
                $s = Html::openElement( 'fieldset' ) .
                        Html::element( 'legend', array(), wfMessage( 'config-db-web-account' )->text() ) .
                        $this->getCheckBox(
@@ -390,9 +407,13 @@ class MssqlInstaller extends DatabaseInstaller {
         * @return Status
         */
        public function submitSettingsForm() {
-               $this->setVarsFromRequest(
-                       array( 'wgDBuser', 'wgDBpassword', '_SameAccount', '_CreateDBAccount', '_WebWindowsAuthentication' )
-               );
+               $this->setVarsFromRequest( array(
+                               'wgDBuser',
+                               'wgDBpassword',
+                               '_SameAccount',
+                               '_CreateDBAccount',
+                               '_WebWindowsAuthentication'
+               ) );
 
                if ( $this->getVar( '_SameAccount' ) ) {
                        $this->setVar( '_WebWindowsAuthentication', $this->getVar( '_InstallWindowsAuthentication' ) );
@@ -408,7 +429,10 @@ class MssqlInstaller extends DatabaseInstaller {
                        $this->setVar( 'wgDBWindowsAuthentication', false );
                }
 
-               if ( $this->getVar( '_CreateDBAccount' ) && $this->getVar( '_WebWindowsAuthentication' ) == 'sqlauth' && strval( $this->getVar( 'wgDBpassword' ) ) == '' ) {
+               if ( $this->getVar( '_CreateDBAccount' )
+                       && $this->getVar( '_WebWindowsAuthentication' ) == 'sqlauth'
+                       && strval( $this->getVar( 'wgDBpassword' ) ) == ''
+               ) {
                        return Status::newFatal( 'config-db-password-empty', $this->getVar( 'wgDBuser' ) );
                }
 
@@ -471,13 +495,22 @@ class MssqlInstaller extends DatabaseInstaller {
                $dbName = $this->getVar( 'wgDBname' );
                $schemaName = $this->getVar( 'wgDBmwschema' );
                if ( !$this->databaseExists( $dbName ) ) {
-                       $conn->query( "CREATE DATABASE " . $conn->addIdentifierQuotes( $dbName ), __METHOD__ );
+                       $conn->query(
+                               "CREATE DATABASE " . $conn->addIdentifierQuotes( $dbName ),
+                               __METHOD__
+                       );
                        $conn->selectDB( $dbName );
                        if ( !$this->schemaExists( $schemaName ) ) {
-                               $conn->query( "CREATE SCHEMA " . $conn->addIdentifierQuotes( $schemaName ), __METHOD__ );
+                               $conn->query(
+                                       "CREATE SCHEMA " . $conn->addIdentifierQuotes( $schemaName ),
+                                       __METHOD__
+                               );
                        }
                        if ( !$this->catalogExists( $schemaName ) ) {
-                               $conn->query( "CREATE FULLTEXT CATALOG " . $conn->addIdentifierQuotes( $schemaName ), __METHOD__ );
+                               $conn->query(
+                                       "CREATE FULLTEXT CATALOG " . $conn->addIdentifierQuotes( $schemaName ),
+                                       __METHOD__
+                               );
                        }
                }
                $this->setupSchemaVars();
@@ -529,7 +562,9 @@ class MssqlInstaller extends DatabaseInstaller {
                                try {
                                        $this->db->begin();
                                        $this->db->selectDB( 'master' );
-                                       $logintype = $this->getVar( '_WebWindowsAuthentication' ) == 'windowsauth' ? 'FROM WINDOWS' : "WITH PASSWORD = $escPass";
+                                       $logintype = $this->getVar( '_WebWindowsAuthentication' ) == 'windowsauth'
+                                               ? 'FROM WINDOWS'
+                                               : "WITH PASSWORD = $escPass";
                                        $this->db->query( "CREATE LOGIN $escUser $logintype" );
                                        $this->db->selectDB( $dbName );
                                        $this->db->query( "CREATE USER $escUser FOR LOGIN $escUser WITH DEFAULT_SCHEMA = $escSchema" );
@@ -603,7 +638,8 @@ class MssqlInstaller extends DatabaseInstaller {
                        $searchindex = $this->db->tableName( 'searchindex' );
                        $schema = $this->db->addIdentifierQuotes( $this->getVar( 'wgDBmwschema' ) );
                        try {
-                               $this->db->query( "CREATE FULLTEXT INDEX ON $searchindex (si_title, si_text) KEY INDEX si_page ON $schema" );
+                               $this->db->query( "CREATE FULLTEXT INDEX ON $searchindex (si_title, si_text) "
+                                       . "KEY INDEX si_page ON $schema" );
                        } catch ( DBQueryError $dqe ) {
                                $status->fatal( 'config-install-tables-failed', $dqe->getText() );
                        }
@@ -615,7 +651,7 @@ class MssqlInstaller extends DatabaseInstaller {
        /**
         * Try to see if the login exists
         * @param string $user Username to check
-        * @return boolean
+        * @return bool
         */
        private function loginExists( $user ) {
                $res = $this->db->selectField( 'sys.sql_logins', 1, array( 'name' => $user ) );
@@ -626,7 +662,7 @@ class MssqlInstaller extends DatabaseInstaller {
         * Try to see if the user account exists
         * We assume we already have the appropriate database selected
         * @param string $user Username to check
-        * @return boolean
+        * @return bool
         */
        private function userExists( $user ) {
                $res = $this->db->selectField( 'sys.sysusers', 1, array( 'name' => $user ) );
@@ -636,7 +672,7 @@ class MssqlInstaller extends DatabaseInstaller {
        /**
         * Try to see if a given database exists
         * @param string $dbName Database name to check
-        * @return boolean
+        * @return bool
         */
        private function databaseExists( $dbName ) {
                $res = $this->db->selectField( 'sys.databases', 1, array( 'name' => $dbName ) );
@@ -647,7 +683,7 @@ class MssqlInstaller extends DatabaseInstaller {
         * Try to see if a given schema exists
         * We assume we already have the appropriate database selected
         * @param string $schemaName Schema name to check
-        * @return boolean
+        * @return bool
         */
        private function schemaExists( $schemaName ) {
                $res = $this->db->selectField( 'sys.schemas', 1, array( 'name' => $schemaName ) );
@@ -658,7 +694,7 @@ class MssqlInstaller extends DatabaseInstaller {
         * Try to see if a given fulltext catalog exists
         * We assume we already have the appropriate database selected
         * @param string $schemaName Catalog name to check
-        * @return boolean
+        * @return bool
         */
        private function catalogExists( $catalogName ) {
                $res = $this->db->selectField( 'sys.fulltext_catalogs', 1, array( 'name' => $catalogName ) );
index 7d3833b..f9c4287 100644 (file)
@@ -37,10 +37,10 @@ class MssqlUpdater extends DatabaseUpdater {
 
        protected function getCoreUpdateList() {
                return array(
-                       array( 'disableContentHandlerUseDB' ),
-
                        // 1.23
+                       array( 'addField', 'mwuser', 'user_password_expires', 'patch-user_password_expires.sql' ),
 
+                       // 1.24
                );
        }
 }
index 4c72528..10f6692 100644 (file)
@@ -65,7 +65,7 @@ class MysqlInstaller extends DatabaseInstaller {
        }
 
        /**
-        * @return Bool
+        * @return bool
         */
        public function isCompiled() {
                return self::checkExtension( 'mysql' ) || self::checkExtension( 'mysqli' );
@@ -603,7 +603,7 @@ class MysqlInstaller extends DatabaseInstaller {
         * Return a formal 'User'@'Host' username for use in queries
         * @param string $name Username, quotes will be added
         * @param string $host Hostname, quotes will be added
-        * @return String
+        * @return string
         */
        private function buildFullUserName( $name, $host ) {
                return $this->db->addQuotes( $name ) . '@' . $this->db->addQuotes( $host );
@@ -614,7 +614,7 @@ class MysqlInstaller extends DatabaseInstaller {
         * access to mysql.user, so false means "no" or "maybe"
         * @param string $host Hostname to check
         * @param string $user Username to check
-        * @return boolean
+        * @return bool
         */
        private function userDefinitelyExists( $host, $user ) {
                try {
@@ -631,7 +631,7 @@ class MysqlInstaller extends DatabaseInstaller {
         * Return any table options to be applied to all tables that don't
         * override them.
         *
-        * @return String
+        * @return string
         */
        protected function getTableOptions() {
                $options = array();
index bcd50b3..8b77cb1 100644 (file)
@@ -250,6 +250,10 @@ class MysqlUpdater extends DatabaseUpdater {
                        array( 'addIndex', 'logging', 'log_user_text_time', 'patch-logging_user_text_time_index.sql' ),
                        array( 'addField', 'page', 'page_links_updated', 'patch-page_links_updated.sql' ),
                        array( 'addField', 'user', 'user_password_expires', 'patch-user_password_expire.sql' ),
+
+                       // 1.24
+                       array( 'addField', 'page_props', 'pp_sortkey', 'patch-pp_sortkey.sql' ),
+                       array( 'dropField', 'recentchanges', 'rc_cur_time', 'patch-drop-rc_cur_time.sql' ),
                );
        }
 
index 02116ea..0ef41fa 100644 (file)
@@ -97,6 +97,10 @@ class OracleUpdater extends DatabaseUpdater {
                        array( 'addIndex', 'logging', 'i06', 'patch-logging_user_text_type_time_index.sql' ),
                        array( 'addIndex', 'logging', 'i07', 'patch-logging_user_text_time_index.sql' ),
                        array( 'addField', 'user', 'user_password_expires', 'patch-user_password_expire.sql' ),
+                       array( 'addField', 'page', 'page_links_updated', 'patch-page_links_updated.sql' ),
+                       array( 'addField', 'recentchanges', 'rc_source', 'patch-rc_source.sql' ),
+
+                       //1.24
 
                        // KEEP THIS AT THE BOTTOM!!
                        array( 'doRebuildDuplicateFunction' ),
@@ -259,7 +263,7 @@ class OracleUpdater extends DatabaseUpdater {
        /**
         * Overload: after this action field info table has to be rebuilt
         *
-        * @param $what array
+        * @param array $what
         */
        public function doUpdates( $what = array( 'core', 'extensions', 'purge', 'stats' ) ) {
                parent::doUpdates( $what );
index 780431a..9e25f47 100644 (file)
@@ -218,8 +218,7 @@ class PostgresInstaller extends DatabaseInstaller {
         *    - create-tables: A connection with a role suitable for creating tables.
         *
         * @throws MWException
-        * @return Status object. On success, a connection object will be in the
-        *   value member.
+        * @return Status On success, a connection object will be in the value member.
         */
        protected function openPgConnection( $type ) {
                switch ( $type ) {
@@ -414,7 +413,7 @@ class PostgresInstaller extends DatabaseInstaller {
 
        /**
         * Recursive helper for canCreateObjectsForWebUser().
-        * @param $conn DatabaseBase object
+        * @param DatabaseBase $conn
         * @param int $targetMember Role ID of the member to look for
         * @param int $group Role ID of the group to look for
         * @param int $maxDepth Maximum recursive search depth
index c5c10b3..8c81080 100644 (file)
@@ -234,6 +234,7 @@ class PostgresUpdater extends DatabaseUpdater {
                        array( 'changeNullableField', 'image', 'img_metadata', 'NOT NULL' ),
                        array( 'changeNullableField', 'filearchive', 'fa_metadata', 'NOT NULL' ),
                        array( 'changeNullableField', 'recentchanges', 'rc_cur_id', 'NULL' ),
+                       array( 'changeNullableField', 'recentchanges', 'rc_cur_time', 'NULL' ),
 
                        array( 'checkOiDeleted' ),
 
@@ -405,6 +406,13 @@ class PostgresUpdater extends DatabaseUpdater {
                        array( 'addPgField', 'recentchanges', 'rc_source', "TEXT NOT NULL DEFAULT ''" ),
                        array( 'addPgField', 'page', 'page_links_updated', "TIMESTAMPTZ NULL" ),
                        array( 'addPgField', 'mwuser', 'user_password_expires', 'TIMESTAMPTZ NULL' ),
+                       array( 'changeFieldPurgeTable', 'l10n_cache', 'lc_value', 'bytea',
+                               "replace(lc_value,'\','\\\\')::bytea" ),
+
+                       // 1.24
+                       array( 'addPgField', 'page_props', 'pp_sortkey', 'float NULL' ),
+                       array( 'addPgIndex', 'page_props', 'pp_propname_sortkey_page',
+                                       '( pp_propname, pp_sortkey, pp_page ) WHERE ( pp_sortkey IS NOT NULL )' ),
                );
        }
 
@@ -671,6 +679,35 @@ END;
                }
        }
 
+       protected function changeFieldPurgeTable( $table, $field, $newtype, $default ) {
+               ## For a cache table, empty it if the field needs to be changed, because the old contents
+               ## may be corrupted.  If the column is already the desired type, refrain from purging.
+               $fi = $this->db->fieldInfo( $table, $field );
+               if ( is_null( $fi ) ) {
+                       $this->output( "...ERROR: expected column $table.$field to exist\n" );
+                       exit( 1 );
+               }
+
+               if ( $fi->type() === $newtype ) {
+                       $this->output( "...column '$table.$field' is already of type '$newtype'\n" );
+               } else {
+                       $this->output( "Purging data from cache table '$table'\n" );
+                       $this->db->query("DELETE from $table" );
+                       $this->output( "Changing column type of '$table.$field' from '{$fi->type()}' to '$newtype'\n" );
+                       $sql = "ALTER TABLE $table ALTER $field TYPE $newtype";
+                       if ( strlen( $default ) ) {
+                               $res = array();
+                               if ( preg_match( '/DEFAULT (.+)/', $default, $res ) ) {
+                                       $sqldef = "ALTER TABLE $table ALTER $field SET DEFAULT $res[1]";
+                                       $this->db->query( $sqldef );
+                                       $default = preg_replace( '/\s*DEFAULT .+/', '', $default );
+                               }
+                               $sql .= " USING $default";
+                       }
+                       $this->db->query( $sql );
+               }
+       }
+
        protected function setDefault( $table, $field, $default ) {
 
                $info = $this->db->fieldInfo( $table, $field );
index 19218c6..351b022 100644 (file)
@@ -50,7 +50,7 @@ class SqliteInstaller extends DatabaseInstaller {
 
        /**
         *
-        * @return Status:
+        * @return Status
         */
        public function checkPrerequisites() {
                $result = Status::newGood();
@@ -98,7 +98,7 @@ class SqliteInstaller extends DatabaseInstaller {
        /**
         * Safe wrapper for PHP's realpath() that fails gracefully if it's unable to canonicalize the path.
         *
-        * @param $path string
+        * @param string $path
         *
         * @return string
         */
@@ -132,8 +132,8 @@ class SqliteInstaller extends DatabaseInstaller {
        }
 
        /**
-        * @param $dir
-        * @param $create bool
+        * @param string $dir
+        * @param bool $create
         * @return Status
         */
        private static function dataDirOKmaybeCreate( $dir, $create = false ) {
@@ -255,7 +255,7 @@ class SqliteInstaller extends DatabaseInstaller {
        }
 
        /**
-        * @param $status Status
+        * @param Status $status
         * @return Status
         */
        public function setupSearchIndex( &$status ) {
index ea19efa..7813115 100644 (file)
@@ -128,6 +128,10 @@ class SqliteUpdater extends DatabaseUpdater {
                        array( 'addIndex', 'logging', 'log_user_text_time', 'patch-logging_user_text_time_index.sql' ),
                        array( 'addField', 'page', 'page_links_updated', 'patch-page_links_updated.sql' ),
                        array( 'addField', 'user', 'user_password_expires', 'patch-user_password_expire.sql' ),
+
+                       // 1.24
+                       array( 'addField', 'page_props', 'pp_sortkey', 'patch-pp_sortkey.sql' ),
+                       array( 'dropField', 'recentchanges', 'rc_cur_time', 'patch-drop-rc_cur_time.sql' ),
                );
        }
 
index 42672ca..66e8bd9 100644 (file)
@@ -61,7 +61,7 @@ class WebInstaller extends Installer {
         * To add a new installer page:
         *    * Add it to this WebInstaller::$pageSequence property
         *    * Add a "config-page-<name>" message
-        *    * Add a "WebInstaller_<name>" class
+        *    * Add a "WebInstaller<name>" class
         *
         * @var string[]
         */
@@ -182,10 +182,7 @@ class WebInstaller extends Installer {
 
                $cssDir = $this->request->getVal( 'css' );
                if ( $cssDir ) {
-                       $cssDir = ( $cssDir == 'rtl' ? 'rtl' : 'ltr' );
-                       $this->request->response()->header( 'Content-type: text/css' );
-                       echo $this->output->getCSS( $cssDir );
-
+                       $this->outputCss( $cssDir );
                        return $this->session;
                }
 
@@ -354,8 +351,6 @@ class WebInstaller extends Installer {
                restore_error_handler();
 
                if ( $this->phpErrors ) {
-                       $this->showError( 'config-session-error', $this->phpErrors[0] );
-
                        return false;
                }
 
@@ -392,7 +387,7 @@ class WebInstaller extends Installer {
 
        /**
         * Show an error message in a box. Parameters are like wfMessage().
-        * @param $msg
+        * @param string $msg
         */
        public function showError( $msg /*...*/ ) {
                $args = func_get_args();
@@ -462,7 +457,7 @@ class WebInstaller extends Installer {
         * @return WebInstallerPage
         */
        public function getPageByName( $pageName ) {
-               $pageClass = 'WebInstaller_' . $pageName;
+               $pageClass = 'WebInstaller' . $pageName;
 
                return new $pageClass( $this );
        }
@@ -691,7 +686,7 @@ class WebInstaller extends Installer {
         * Get small text indented help for a preceding form field.
         * Parameters like wfMessage().
         *
-        * @param $msg
+        * @param string $msg
         * @return string
         */
        public function getHelpBox( $msg /*, ... */ ) {
@@ -702,8 +697,9 @@ class WebInstaller extends Installer {
                $html = $this->parse( $text, true );
 
                return "<div class=\"mw-help-field-container\">\n" .
-                       "<span class=\"mw-help-field-hint\">" . wfMessage( 'config-help' )->escaped() .
-                       "</span>\n" .
+                       "<span class=\"mw-help-field-hint\" title=\"" .
+                       wfMessage( 'config-help-tooltip' )->escaped() . "\">" .
+                       wfMessage( 'config-help' )->escaped() . "</span>\n" .
                        "<span class=\"mw-help-field-data\">" . $html . "</span>\n" .
                        "</div>\n";
        }
@@ -747,9 +743,9 @@ class WebInstaller extends Installer {
         * Label a control by wrapping a config-input div around it and putting a
         * label before it.
         *
-        * @param $msg
-        * @param $forId
-        * @param $contents
+        * @param string $msg
+        * @param string $forId
+        * @param string $contents
         * @param string $helpData
         * @return string
         */
@@ -1117,14 +1113,10 @@ class WebInstaller extends Installer {
         * @return string Html for download link
         */
        public function downloadLinkHook( $text, $attribs, $parser ) {
-               $img = Html::element( 'img', array(
-                       'src' => '../skins/common/images/download-32.png',
-                       'width' => '32',
-                       'height' => '32',
-               ) );
                $anchor = Html::rawElement( 'a',
                        array( 'href' => $this->getURL( array( 'localsettings' => 1 ) ) ),
-                       $img . ' ' . wfMessage( 'config-download-localsettings' )->parse() );
+                       wfMessage( 'config-download-localsettings' )->parse()
+               );
 
                return Html::rawElement( 'div', array( 'class' => 'config-download-link' ), $anchor );
        }
@@ -1155,10 +1147,26 @@ class WebInstaller extends Installer {
        }
 
        /**
-        * @return String
+        * @return string
         */
        protected function envGetDefaultServer() {
                return WebRequest::detectServer();
        }
 
+       /**
+        * @param string $dir CSS direction ( rtl or ltr )
+        */
+       public function outputCss( $dir ) {
+               $dir = ( $dir == 'rtl' ? 'rtl' : 'ltr' );
+               $this->request->response()->header( 'Content-type: text/css' );
+               echo $this->output->getCSS( $dir );
+       }
+
+       /**
+        * @return string[]
+        */
+       public function getPhpErrors() {
+               return $this->phpErrors;
+       }
+
 }
index 7a7f125..c3fd51d 100644 (file)
@@ -43,7 +43,7 @@ class WebInstallerOutput {
 
        /**
         * Buffered contents that haven't been output yet
-        * @var String
+        * @var string
         */
        private $contents = '';
 
@@ -127,14 +127,14 @@ class WebInstallerOutput {
         *
         * @param string $dir 'ltr' or 'rtl'
         *
-        * @return String
+        * @return string
         */
        public function getCSS( $dir ) {
                // All CSS files these modules reference will be concatenated in sequence
                // and loaded as one file.
                $moduleNames = array(
                        'mediawiki.legacy.shared',
-                       'skins.common.interface',
+                       'mediawiki.skinning.interface',
                        'skins.vector.styles',
                        'mediawiki.legacy.config',
                );
@@ -210,7 +210,7 @@ class WebInstallerOutput {
        /**
         * "<link>" to index.php?css=foobar for the "<head>"
         *
-        * @return String
+        * @return string
         */
        private function getCssUrl() {
                return Html::linkedStyle( $_SERVER['PHP_SELF'] . '?css=' . $this->getDir() );
@@ -364,7 +364,7 @@ class WebInstallerOutput {
         * @return string
         */
        public function getJQuery() {
-               return Html::linkedScript( "../resources/src/jquery/jquery.js" );
+               return Html::linkedScript( "../resources/lib/jquery/jquery.js" );
        }
 
 }
index 3b3473b..06b561b 100644 (file)
@@ -133,7 +133,7 @@ abstract class WebInstallerPage {
         * @return string
         */
        public function getName() {
-               return str_replace( 'WebInstaller_', '', get_class( $this ) );
+               return str_replace( 'WebInstaller', '', get_class( $this ) );
        }
 
        /**
@@ -205,7 +205,7 @@ abstract class WebInstallerPage {
 
 }
 
-class WebInstaller_Language extends WebInstallerPage {
+class WebInstallerLanguage extends WebInstallerPage {
 
        /**
         * @return string|null
@@ -306,7 +306,7 @@ class WebInstaller_Language extends WebInstallerPage {
 
 }
 
-class WebInstaller_ExistingWiki extends WebInstallerPage {
+class WebInstallerExistingWiki extends WebInstallerPage {
 
        /**
         * @return string
@@ -470,7 +470,7 @@ class WebInstaller_ExistingWiki extends WebInstallerPage {
 
 }
 
-class WebInstaller_Welcome extends WebInstallerPage {
+class WebInstallerWelcome extends WebInstallerPage {
 
        /**
         * @return string
@@ -499,7 +499,7 @@ class WebInstaller_Welcome extends WebInstallerPage {
 
 }
 
-class WebInstaller_DBConnect extends WebInstallerPage {
+class WebInstallerDBConnect extends WebInstallerPage {
 
        /**
         * @return string|null When string, "skip" or "continue"
@@ -600,7 +600,7 @@ class WebInstaller_DBConnect extends WebInstallerPage {
 
 }
 
-class WebInstaller_Upgrade extends WebInstallerPage {
+class WebInstallerUpgrade extends WebInstallerPage {
 
        /**
         * @return bool Always true.
@@ -691,7 +691,7 @@ class WebInstaller_Upgrade extends WebInstallerPage {
 
 }
 
-class WebInstaller_DBSettings extends WebInstallerPage {
+class WebInstallerDBSettings extends WebInstallerPage {
 
        /**
         * @return string|null
@@ -725,7 +725,7 @@ class WebInstaller_DBSettings extends WebInstallerPage {
 
 }
 
-class WebInstaller_Name extends WebInstallerPage {
+class WebInstallerName extends WebInstallerPage {
 
        /**
         * @return string
@@ -790,7 +790,7 @@ class WebInstaller_Name extends WebInstallerPage {
                                'label' => 'config-admin-password',
                        ) ) .
                        $this->parent->getPasswordBox( array(
-                               'var' => '_AdminPassword2',
+                               'var' => '_AdminPasswordConfirm',
                                'label' => 'config-admin-password-confirm'
                        ) ) .
                        $this->parent->getTextBox( array(
@@ -829,7 +829,7 @@ class WebInstaller_Name extends WebInstallerPage {
        public function submit() {
                $retVal = true;
                $this->parent->setVarsFromRequest( array( 'wgSitename', '_NamespaceType',
-                       '_AdminName', '_AdminPassword', '_AdminPassword2', '_AdminEmail',
+                       '_AdminName', '_AdminPassword', '_AdminPasswordConfirm', '_AdminEmail',
                        '_Subscribe', '_SkipOptional', 'wgMetaNamespace' ) );
 
                // Validate site name
@@ -911,7 +911,7 @@ class WebInstaller_Name extends WebInstallerPage {
                        # $user->getPasswordValidity just checks for $wgMinimalPasswordLength.
                        # This message is more specific and helpful.
                        $msg = 'config-admin-password-blank';
-               } elseif ( $pwd !== $this->getVar( '_AdminPassword2' ) ) {
+               } elseif ( $pwd !== $this->getVar( '_AdminPasswordConfirm' ) ) {
                        $msg = 'config-admin-password-mismatch';
                } elseif ( $valid !== true ) {
                        $msg = $valid;
@@ -919,7 +919,7 @@ class WebInstaller_Name extends WebInstallerPage {
                if ( $msg !== false ) {
                        call_user_func_array( array( $this->parent, 'showError' ), (array)$msg );
                        $this->setVar( '_AdminPassword', '' );
-                       $this->setVar( '_AdminPassword2', '' );
+                       $this->setVar( '_AdminPasswordConfirm', '' );
                        $retVal = false;
                }
 
@@ -941,7 +941,7 @@ class WebInstaller_Name extends WebInstallerPage {
 
 }
 
-class WebInstaller_Options extends WebInstallerPage {
+class WebInstallerOptions extends WebInstallerPage {
 
        /**
         * @return string|null
@@ -1049,10 +1049,6 @@ class WebInstaller_Options extends WebInstallerPage {
                                $this->getVar( 'wgDeletedDirectory' )
                        )
                );
-               // If we're using the default, let the user set it relative to $wgScriptPath
-               $curLogo = $this->getVar( 'wgLogo' );
-               $logoString = ( $curLogo == "/wiki/skins/common/images/wiki.png" ) ?
-                       '$wgStylePath/common/images/wiki.png' : $curLogo;
 
                $uploadwrapperStyle = $this->getVar( 'wgEnableUploads' ) ? '' : 'display: none';
                $this->addHTML(
@@ -1074,7 +1070,6 @@ class WebInstaller_Options extends WebInstallerPage {
                        '</div>' .
                        $this->parent->getTextBox( array(
                                'var' => 'wgLogo',
-                               'value' => $logoString,
                                'label' => 'config-logo',
                                'attribs' => array( 'dir' => 'ltr' ),
                                'help' => $this->parent->getHelpBox( 'config-logo-help' )
@@ -1310,7 +1305,7 @@ class WebInstaller_Options extends WebInstallerPage {
 
 }
 
-class WebInstaller_Install extends WebInstallerPage {
+class WebInstallerInstall extends WebInstallerPage {
 
        /**
         * @return bool Always true.
@@ -1385,7 +1380,7 @@ class WebInstaller_Install extends WebInstallerPage {
 
 }
 
-class WebInstaller_Complete extends WebInstallerPage {
+class WebInstallerComplete extends WebInstallerPage {
 
        public function execute() {
                // Pop up a dialog box, to make it difficult for the user to forget
@@ -1423,7 +1418,7 @@ class WebInstaller_Complete extends WebInstallerPage {
 
 }
 
-class WebInstaller_Restart extends WebInstallerPage {
+class WebInstallerRestart extends WebInstallerPage {
 
        /**
         * @return string|null
@@ -1449,7 +1444,7 @@ class WebInstaller_Restart extends WebInstallerPage {
 
 }
 
-abstract class WebInstaller_Document extends WebInstallerPage {
+abstract class WebInstallerDocument extends WebInstallerPage {
 
        /**
         * @return string
@@ -1478,7 +1473,7 @@ abstract class WebInstaller_Document extends WebInstallerPage {
 
 }
 
-class WebInstaller_Readme extends WebInstaller_Document {
+class WebInstallerReadme extends WebInstallerDocument {
 
        /**
         * @return string
@@ -1489,7 +1484,7 @@ class WebInstaller_Readme extends WebInstaller_Document {
 
 }
 
-class WebInstaller_ReleaseNotes extends WebInstaller_Document {
+class WebInstallerReleaseNotes extends WebInstallerDocument {
 
        /**
         * @throws MWException
@@ -1507,7 +1502,7 @@ class WebInstaller_ReleaseNotes extends WebInstaller_Document {
 
 }
 
-class WebInstaller_UpgradeDoc extends WebInstaller_Document {
+class WebInstallerUpgradeDoc extends WebInstallerDocument {
 
        /**
         * @return string
@@ -1518,7 +1513,7 @@ class WebInstaller_UpgradeDoc extends WebInstaller_Document {
 
 }
 
-class WebInstaller_Copying extends WebInstaller_Document {
+class WebInstallerCopying extends WebInstallerDocument {
 
        /**
         * @return string
index 57d3253..9240982 100644 (file)
@@ -34,7 +34,7 @@
        "config-page-upgradedoc": "Besig met opgradering",
        "config-page-existingwiki": "Bestaande wiki",
        "config-restart": "Ja, herbegin dit",
-       "config-sidebar": "* [//www.mediawiki.org MediaWiki tuisblad]\n* [//www.mediawiki.org/wiki/Help:Contents Gebruikershandleiding] (Engelstalig)\n* [//www.mediawiki.org/wiki/Manual:Contents Administrateurshandleiding] (Engelstalig)\n* [//www.mediawiki.org/wiki/Manual:FAQ Algemene vrae] (Engelstalig)\n----\n* <doclink href=Readme>Lees my</doclink>\n* <doclink href=ReleaseNotes>Vrystellingsnotas</doclink>\n* <doclink href=Copying>Kopiëring</doclink>\n* <doclink href=UpgradeDoc>Opgradering</doclink>",
+       "config-sidebar": "* [//www.mediawiki.org MediaWiki tuisblad]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Gebruikershandleiding] (Engelstalig)\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Administrateurshandleiding] (Engelstalig)\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Algemene vrae] (Engelstalig)\n----\n* <doclink href=Readme>Lees my</doclink>\n* <doclink href=ReleaseNotes>Vrystellingsnotas</doclink>\n* <doclink href=Copying>Kopiëring</doclink>\n* <doclink href=UpgradeDoc>Opgradering</doclink>",
        "config-env-good": "Die omgewing is gekontroleer.\nU kan MediaWiki installeer.",
        "config-env-bad": "Die omgewing is gekontroleer.\nU kan nie MediaWiki installeer nie.</span>",
        "config-env-php": "PHP $1 is tans geïnstalleer.",
        "config-download-localsettings": "Laai <code>LocalSettings.php</code> af",
        "config-help": "hulp",
        "mainpagetext": "'''MediaWiki is suksesvol geïnstalleer.'''",
-       "mainpagedocfooter": "Konsulteer '''[//meta.wikimedia.org/wiki/Help:Contents User's Guide]''' vir inligting oor hoe om die wikisagteware te gebruik.\n\n== Hoe om te Begin ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]"
+       "mainpagedocfooter": "Konsulteer '''[//meta.wikimedia.org/wiki/Help:Contents User's Guide]''' vir inligting oor hoe om die wikisagteware te gebruik.\n\n== Hoe om te Begin ==\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 bb850f3..613778e 100644 (file)
@@ -1,5 +1,5 @@
 {
        "@metadata": [],
        "mainpagetext": "'''MediaWiki በትክክል ማስገባቱ ተከናወነ።'''",
-       "mainpagedocfooter": "ስለ ዊኪ ሶፍትዌር ጥቅም ለመረዳት፣ [//meta.wikimedia.org/wiki/Help:Contents User's Guide] ያንብቡ።\n\n== ለመጀመር ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]"
+       "mainpagedocfooter": "ስለ ዊኪ ሶፍትዌር ጥቅም ለመረዳት፣ [//meta.wikimedia.org/wiki/Help:Contents User's Guide] ያንብቡ።\n\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 dece45a..6f2642d 100644 (file)
@@ -5,5 +5,5 @@
                ]
        },
        "mainpagetext": "'''O programa MediaWiki s'ha instalato correctament.'''",
-       "mainpagedocfooter": "Consulta a [//meta.wikimedia.org/wiki/Help:Contents Guía d'usuario] ta mirar información sobre cómo usar o software wiki.\n\n== Ta prencipiar ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista de caracteristicas confegurables]\n* [//www.mediawiki.org/wiki/Manual:FAQ Preguntas cutianas sobre MediaWiki (FAQ)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correu sobre ta anuncios de MediaWiki]"
+       "mainpagedocfooter": "Consulta a [//meta.wikimedia.org/wiki/Help:Contents Guía d'usuario] ta mirar información sobre cómo usar o software wiki.\n\n== Ta prencipiar ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista de caracteristicas confegurables]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Preguntas cutianas sobre MediaWiki (FAQ)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correu sobre ta anuncios de MediaWiki]"
 }
index 1048562..82cf370 100644 (file)
@@ -5,5 +5,5 @@
                ]
        },
        "mainpagetext": "'''MediaWiki hafaþ geworden spēdige inseted.'''",
-       "mainpagedocfooter": "Þeahta þone [//meta.wikimedia.org/wiki/Help:Contents Brūcenda Lǣdend]  on helpe mid þǣre nytte of ƿikisōftƿare.\n\n== Beȝinnunȝ ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Onfæstnunȝa ȝesetednessa ȝetæl]\n* [//www.mediawiki.org/wiki/Manual:FAQ Ȝetæl oft ascodra ascunȝa ymb MediaǷiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Ǣrendunȝȝetæl nīƿra MediaǷiki forþsendnessa]"
+       "mainpagedocfooter": "Þeahta þone [//meta.wikimedia.org/wiki/Help:Contents Brūcenda Lǣdend]  on helpe mid þǣre nytte of ƿikisōftƿare.\n\n== Beȝinnunȝ ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Onfæstnunȝa ȝesetednessa ȝetæl]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Ȝetæl oft ascodra ascunȝa ymb MediaǷiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Ǣrendunȝȝetæl nīƿra MediaǷiki forþsendnessa]"
 }
index ac19e2a..1c0af17 100644 (file)
@@ -5,7 +5,8 @@
                        "Mido",
                        "OsamaK",
                        "روخو",
-                       "Claw eg"
+                       "Claw eg",
+                       "Kuwaity26"
                ]
        },
        "config-desc": "مثبت لميدياويكي",
@@ -46,6 +47,8 @@
        "config-restart": "نعم، إعادة التشغيل",
        "config-env-php": "بي إتش بي $1 مثبت.",
        "config-env-php-toolow": "بي إتش بي $1 مثبت.\nومع ذلك، يتطلب ميدياويكي بي إتش بي $2 أو أعلى.",
+       "config-db-type": "نوع قاعدة البيانات:",
+       "config-db-wiki-settings": "حدِّد هذا الويكي",
        "config-db-username": "اسم مستخدم قاعدة البيانات:",
        "config-db-password": "كلمة سر قاعدة البيانات:",
        "config-db-port": "منفذ قاعدة البيانات:",
        "config-type-postgres": "بوستجر إس كيو إل",
        "config-type-sqlite": "إس كيو لايت",
        "config-type-oracle": "أوراكل",
+       "config-site-name": "اسم الويكي:",
+       "config-admin-name": "اسم المستخدم:",
+       "config-admin-password": "كلمة السر:",
+       "config-admin-password-confirm": "كلمة المرور مرة أخرى:",
        "config-admin-email": "عنوان البريد الإلكتروني:",
+       "config-optional-continue": "اسألني المزيد من الأسئلة",
+       "config-optional-skip": "إنني أشعر بالملل بالفعل، فقط قم بتثبيت الويكي",
+       "config-profile-wiki": "افتح ويكي",
+       "config-profile-private": "ويكي خاص",
+       "config-license-pd": "ملكية عامة",
+       "config-email-settings": "إعدادات البريد الإلكتروني",
+       "config-email-watchlist": "تمكين إشعارات قائمة المراقبة",
+       "config-upload-enable": "تمكين تحميل الملفات",
+       "config-cc-again": "اختر مجددًا",
+       "config-extensions": "امتدادات",
+       "config-install-step-done": "نفذ",
+       "config-install-step-failed": "فشل",
+       "config-help": "مساعدة",
        "mainpagetext": "'''تم تثبيت ميدياويكي بنجاح.'''",
-       "mainpagedocfooter": "استشر [//meta.wikimedia.org/wiki/Help:Contents دليل المستخدم] لمعلومات حول استخدام برنامج الويكي.\n\n== البداية ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings قائمة إعدادات الضبط]\n* [//www.mediawiki.org/wiki/Manual:FAQ أسئلة متكررة حول ميدياويكي]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce القائمة البريدية الخاصة بإصدار ميدياويكي]"
+       "mainpagedocfooter": "استشر [//meta.wikimedia.org/wiki/Help:Contents دليل المستخدم] لمعلومات حول استخدام برنامج الويكي.\n\n== البداية ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings قائمة إعدادات الضبط]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ أسئلة متكررة حول ميدياويكي]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce القائمة البريدية الخاصة بإصدار ميدياويكي]"
 }
index 295547f..48aa2d6 100644 (file)
@@ -1,9 +1,10 @@
 {
        "@metadata": {
                "authors": [
-                       "Enzoreg"
+                       "Enzoreg",
+                       "Seb35"
                ]
        },
        "mainpagetext": "'''MediaWiki ṫ'instala be najaḫ.'''",
-       "mainpagedocfooter": "Ila bġiṫiw meĝlomaṫ ĥrin baċ ṫesṫeĝmlo had l-lojisyél siro ċofo [//meta.wikimedia.org/wiki/Aide:Contenu Gid dyal l-mosṫeĥdim]\n\n== L-bdaya mĝa MediaWiki ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista dyal l-paramétraṫ dyal l-konfigurasyon]\n* [//www.mediawiki.org/wiki/Manual:FAQ/fr FAQ fe MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista dyal l-modakaraṫ ĝla versyonaṫ jdad dyal MediaWiki]"
+       "mainpagedocfooter": "Ila bġiṫiw meĝlomaṫ ĥrin baċ ṫesṫeĝmlo had l-lojisyél siro ċofo [//meta.wikimedia.org/wiki/Help:Contents/fr Gid dyal l-mosṫeĥdim]\n\n== L-bdaya mĝa MediaWiki ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista dyal l-paramétraṫ dyal l-konfigurasyon]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/fr FAQ fe MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista dyal l-modakaraṫ ĝla versyonaṫ jdad dyal MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]"
 }
index b42437e..b6815b4 100644 (file)
@@ -14,5 +14,5 @@
        "config-page-name": "الاسم:",
        "config-page-install": "تركيب",
        "mainpagetext": "''' ميدياويكى اتنزلت بنجاح.'''",
-       "mainpagedocfooter": "اسال [//meta.wikimedia.org/wiki/Help:Contents دليل اليوزر] للمعلومات حوالين استخدام برنامج الويكى.\n\n== البداية ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings لستة اعدادات الضبط]\n* [//www.mediawiki.org/wiki/Manual:FAQ أسئلة بتكرر حوالين الميدياويكى]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce لستة الايميلات بتاعة اعلانات الميدياويكى]"
+       "mainpagedocfooter": "اسال [//meta.wikimedia.org/wiki/Help:Contents دليل اليوزر] للمعلومات حوالين استخدام برنامج الويكى.\n\n== البداية ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings لستة اعدادات الضبط]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ أسئلة بتكرر حوالين الميدياويكى]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce لستة الايميلات بتاعة اعلانات الميدياويكى]"
 }
index c050ea9..142bdc8 100644 (file)
@@ -6,5 +6,5 @@
                ]
        },
        "mainpagetext": "'''মিডিয়াৱিকি সফলভাবে ইন্সটল কৰা হ'ল ।'''",
-       "mainpagedocfooter": "ৱিকি চ'ফটৱেৰ কেনেকৈ ব্যৱহাৰ কৰিব [//meta.wikimedia.org/wiki/Help:Contents সদস্যৰ সহায়িকা] চাওঁক ।\n\n== আৰম্ভণি কৰিবলৈ ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]"
+       "mainpagedocfooter": "ৱিকি চ'ফটৱেৰ কেনেকৈ ব্যৱহাৰ কৰিব [//meta.wikimedia.org/wiki/Help:Contents সদস্যৰ সহায়িকা] চাওঁক ।\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 aa34d79..df7184f 100644 (file)
        "config-restart": "Sí, reanicialu",
        "config-welcome": "=== Comprobaciones del entornu ===\nAgora van facese unes comprobaciones básiques para ver si l'entornu ye afayadizu pa la instalación de MediaWiki.\nAlcuérdese d'incluir esta información si necesita encontu pa completar la instalación.",
        "config-copyright": "=== Drechos d'autor y condiciones d'usu ===\n\n$1\n\nEsti programa ye software llibre; pue redistribuilu y/o camudalu baxo les condiciones de la llicencia pública xeneral GNU tal como la publica la Free Software Foundation; versión 2 o (como prefiera) cualquier versión posterior.\n\nEsti programa distribúise cola esperanza de que pueda ser útil, pero '''ensin garantía denguna'''; nin siquiera la garantía implícita de '''comercialidá''' o '''adautación a un fin determináu'''.\nVea la Llicencia pública xeneral GNU pa más detalles.\n\nHabría de tener recibío <doclink href=Copying>una copia de la llicencia pública xeneral GNU</doclink> xunto con esti programa; sinón, escriba a la Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, o [http://www.gnu.org/copyleft/gpl.html lléala en llinia].",
-       "config-sidebar": "* [//www.mediawiki.org/wiki/MediaWiki/gl Páxina principal de MediaWiki]\n* [//www.mediawiki.org/wiki/Help:Contents Guía del usuariu]\n* [//www.mediawiki.org/wiki/Manual:Contents Guía del alministrador]\n* [//www.mediawiki.org/wiki/Manual:FAQ Entrugues frecuentes]\n----\n* <doclink href=Readme>Lléame</doclink>\n* <doclink href=ReleaseNotes>Notes de llanzamientu</doclink>\n* <doclink href=Copying>Copia</doclink>\n* <doclink href=UpgradeDoc>Anovamientu</doclink>",
+       "config-sidebar": "* [//www.mediawiki.org/wiki/MediaWiki/gl Páxina principal de MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Guía del usuariu]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Guía del alministrador]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Entrugues frecuentes]\n----\n* <doclink href=Readme>Lléame</doclink>\n* <doclink href=ReleaseNotes>Notes de llanzamientu</doclink>\n* <doclink href=Copying>Copia</doclink>\n* <doclink href=UpgradeDoc>Anovamientu</doclink>",
        "config-env-good": "Comprobóse l'entornu.\nPue instalar MediaWiki.",
        "config-env-bad": "Comprobóse l'entornu.\nNun pue instalar MediaWiki.",
        "config-env-php": "PHP $1 ta instaláu.",
        "config-env-php-toolow": "PHP $1 ta instaláu.\nSicasí, MediaWiki necesita PHP $2 o superior.",
        "config-unicode-using-utf8": "Usando utf8_normalize.so de Brion Vibber pa la normalización Unicode.",
        "config-unicode-using-intl": "Usando la [http://pecl.php.net/intl estensión intl PECL] pa la normalización Unicode.",
-       "config-unicode-pure-php-warning": "'''Avisu:''' La [http://pecl.php.net/intl estensión intl PECL] nun ta disponible pa xestionar la normalización Unicode; volviendo a la implementación lenta en PHP puru.\nSi xestiona un sitiu con un tráficu altu, tendría de lleer una migaya sobro la [//www.mediawiki.org/wiki/Unicode_normalization_considerations normalización Unicode].",
-       "config-unicode-update-warning": "'''Avisu:''' La versión instalada del envoltoriu de normalización Unicode usa una versión antigua de la biblioteca [http://site.icu-project.org/ de los proyeutos ICU].\nTendría [//www.mediawiki.org/wiki/Unicode_normalization_considerations d'anovala] si ye importante pa vusté usar Unicode.",
+       "config-unicode-pure-php-warning": "'''Avisu:''' La [http://pecl.php.net/intl estensión intl PECL] nun ta disponible pa xestionar la normalización Unicode; volviendo a la implementación lenta en PHP puru.\nSi xestiona un sitiu con un tráficu altu, tendría de lleer una migaya sobro la [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalización Unicode].",
+       "config-unicode-update-warning": "'''Avisu:''' La versión instalada del envoltoriu de normalización Unicode usa una versión antigua de la biblioteca [http://site.icu-project.org/ de los proyeutos ICU].\nTendría [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations d'anovala] si ye importante pa vusté usar Unicode.",
        "config-no-db": "¡Nun pudo alcontrase un controlador de base de datos afayadizu! Necesita instalar un controlador de base de datos pa PHP.\nTienen sofitu los tipos de base de datos siguientes: $1.\n\nSi compiló PHP vusté mesmu, reconfigúrelu con un cliente de base de datos activáu, por exemplu, usando <code>./configure --with-mysqli</code>.\nSi instaló PHP dende un paquete de Debian o Ubuntu, necesita instalar tamién,por exemplu, el paquete <code>php5-mysql</code>.",
        "config-outdated-sqlite": "'''Avisu:''' tien SQLite $1, que ye inferior a la versión mínima necesaria $2. SQLite nun tará disponible.",
        "config-no-fts3": "'''Avisu:''' SQLite ta compiláu ensin el [//sqlite.org/fts3.html módulu FTS3]; les funciones de gueta nun tarán disponibles nesti sistema.",
@@ -67,5 +67,5 @@
        "config-help": "Ayuda",
        "config-nofile": "Nun pudo atopase'l ficheru \"$1\". ¿Desaniciose?",
        "mainpagetext": "'''MediaWiki instalóse correchamente.'''",
-       "mainpagedocfooter": "Visita la [//meta.wikimedia.org/wiki/Help:Contents Guía del usuariu] pa saber cómo usar esti software wiki.\n\n== Empecipiando ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Llista de les opciones de configuración]\n* [//www.mediawiki.org/wiki/Manual:FAQ FAQ de MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Llista de corréu de les ediciones de MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Llocaliza MediaWiki na to llingua]"
+       "mainpagedocfooter": "Visita la [//meta.wikimedia.org/wiki/Help:Contents Guía del usuariu] pa saber cómo usar esti software wiki.\n\n== Empecipiando ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Llista de les opciones de configuración]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ de MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Llista de corréu de les ediciones de MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Llocaliza MediaWiki na to llingua]"
 }
index f449594..8688fe4 100644 (file)
@@ -29,5 +29,5 @@
        "config-license-pd": "İctimai istifadə",
        "config-help": "kömək",
        "mainpagetext": "'''MediaWiki müvəffəqiyyətlə quraşdırıldı.'''",
-       "mainpagedocfooter": "Bu vikinin istifadəsi ilə bağlı məlumat almaq üçün [//meta.wikimedia.org/wiki/Help:Contents İstifadəçi məlumat səhifəsinə] baxın.\n\n== Faydalı keçidlər ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Tənzimləmələrin siyahısı]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki haqqında tez-tez soruşulan suallar]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-poçt siyahısı]"
+       "mainpagedocfooter": "Bu vikinin istifadəsi ilə bağlı məlumat almaq üçün [//meta.wikimedia.org/wiki/Help:Contents İstifadəçi məlumat səhifəsinə] baxın.\n\n== Faydalı keçidlər ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Tənzimləmələrin siyahısı]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki haqqında tez-tez soruşulan suallar]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-poçt siyahısı]"
 }
index 0e7b915..cca993a 100644 (file)
@@ -1,9 +1,10 @@
 {
        "@metadata": {
                "authors": [
-                       "Haqmar"
+                       "Haqmar",
+                       "Seb35"
                ]
        },
        "mainpagetext": "«MediaWiki» уңышлы рәүештә ҡоролдо.",
-       "mainpagedocfooter": "Был вики менән эшләү тураһында мәғлүмәтте [//meta.wikimedia.org/wiki/Ярҙам:Белешмә ошонда] табып була.\n\n== Файҙалы сығанаҡтар ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Көйләүҙәр исемлеге (инг.)];\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki тураһында йыш бирелгән һорауҙар һәм яуаптар (инг.)];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-ның яңы версиялары тураһында хәбәрҙәр алып тороу]."
+       "mainpagedocfooter": "Был вики менән эшләү тураһында мәғлүмәтте [//meta.wikimedia.org/wiki/Help:Contents ошонда] табып була.\n\n== Файҙалы сығанаҡтар ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Көйләүҙәр исемлеге (инг.)];\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki тураһында йыш бирелгән һорауҙар һәм яуаптар (инг.)];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-ның яңы версиялары тураһында хәбәрҙәр алып тороу].\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]"
 }
index 03a06bd..86db20f 100644 (file)
@@ -5,5 +5,5 @@
                ]
        },
        "mainpagetext": "'''MediaWiki is erfoigreich installird worn.'''",
-       "mainpagedocfooter": "A Hüf zur da Benützung und Konfigurazion voh da Wiki-Software findst auf [//meta.wikimedia.org/wiki/Help:Contents Benützerhåndbuach].\n\n== Starthüfe ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Listen voh de Konfigurazionsvariaablen]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki-FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglisten voh de neichen MediaWiki-Versionen]"
+       "mainpagedocfooter": "A Hüf zur da Benützung und Konfigurazion voh da Wiki-Software findst auf [//meta.wikimedia.org/wiki/Help:Contents Benützerhåndbuach].\n\n== Starthüfe ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Listen voh de Konfigurazionsvariaablen]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki-FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglisten voh de neichen MediaWiki-Versionen]"
 }
index aa30069..e97d7ac 100644 (file)
@@ -1,5 +1,5 @@
 {
        "@metadata": [],
        "mainpagetext": "'''مدیا وی کی گون موفقیت نصب بوت.'''",
-       "mainpagedocfooter": "مشورت کنیت گون  [//meta.wikimedia.org/wiki/Help:Contents User's Guide] په گشیترین اطلاعات په استفاده چه برنامه ویکی.\n\n== شروع بیت ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]"
+       "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 60cac19..533035c 100644 (file)
@@ -33,5 +33,5 @@
        "config-db-password": "Pasa-taramon nin datos-sarayan:",
        "config-db-password-empty": "Pakilaog nin sarong pasa-taramon para sa baguhong paragamit nin datos-sarayan: $1.\nMantang ini posibleng makamukna nin mga paragamit na mayong mga pasa-taramon, bako po ining segurado.",
        "mainpagetext": "'''Instalado na an MediaWiki.'''",
-       "mainpagedocfooter": "Konsultarón tabì an [//meta.wikimedia.org/wiki/Help:Contents User's Guide] para sa impormasyon sa paggamit nin progama kaining wiki.\n\n== Pagpopoon ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]"
+       "mainpagedocfooter": "Konsultarón tabì an [//meta.wikimedia.org/wiki/Help:Contents User's Guide] para sa impormasyon sa paggamit nin progama kaining wiki.\n\n== Pagpopoon ==\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 6a6f8d1..376a227 100644 (file)
        "config-restart": "Так, пачаць зноў",
        "config-welcome": "== Праверка асяродзьдзя ==\nЗараз будуць праведзеныя праверкі для запэўніваньня, што гэтае асяродзьдзе адпаведнае для ўсталяваньня MediaWiki.\nНе забудзьце далучыць гэтую інфармацыю, калі вам спатрэбіцца дапамога для завяршэньня ўсталяваньня.",
        "config-copyright": "== Аўтарскае права і ўмовы ==\n\n$1\n\nThis program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but '''without any warranty'''; without even the implied warranty of '''merchantability''' or '''fitness for a particular purpose'''.\nSee the GNU General Public License for more details.\n\nYou should have received <doclink href=Copying>a copy of the GNU General Public License</doclink> along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. or [http://www.gnu.org/copyleft/gpl.html read it online].",
-       "config-sidebar": "* [//www.mediawiki.org Хатняя старонка MediaWiki]\n* [//www.mediawiki.org/wiki/Help:Contents Даведка для ўдзельнікаў]\n* [//www.mediawiki.org/wiki/Manual:Contents Даведка для адміністратараў]\n* [//www.mediawiki.org/wiki/Manual:FAQ Адказы на частыя пытаньні]\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 Хатняя старонка MediaWiki]\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Вы можаце ўсталёўваць MediaWiki.",
        "config-env-bad": "Асяродзьдзе было праверанае.\nУсталяваньне MediaWiki немагчымае.",
        "config-env-php": "Усталяваны PHP $1.",
        "config-env-php-toolow": "Усталяваны PHP $1.\nАле MediaWiki патрабуе PHP вэрсіі $2 ці навейшай.",
        "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/Unicode_normalization_considerations Unicode-нармалізацыю].",
-       "config-unicode-update-warning": "'''Папярэджаньне''': усталяваная вэрсія бібліятэкі для Unicode-нармалізацыі выкарыстоўвае састарэлую вэрсію бібліятэкі з [http://site.icu-project.org/ праекту ICU].\nРаім [//www.mediawiki.org/wiki/Unicode_normalization_considerations абнавіць], калі ваш сайт будзе працаваць зь 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-unicode-update-warning": "'''Папярэджаньне''': усталяваная вэрсія бібліятэкі для Unicode-нармалізацыі выкарыстоўвае састарэлую вэрсію бібліятэкі з [http://site.icu-project.org/ праекту ICU].\nРаім [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations абнавіць], калі ваш сайт будзе працаваць зь Unicode.",
        "config-no-db": "Немагчыма знайсьці адпаведны драйвэр базы зьвестак. Вам неабходна ўсталяваць драйвэр базы зьвестак для PHP.\nПадтрымліваюцца наступныя тыпы базаў зьвестак: $1.\n\nКалі вы скампілявалі PHP самастойна, зьмяніце канфігурацыю, каб уключыць кліента базы зьвестак, напрыклад, з дапамогай <code>./configure --with-mysqli</code>.\nКалі вы ўсталявалі PHP з пакунку Debian або Ubuntu, тады вам трэба таксама ўсталяваць, напрыклад, пакунак <code>php5-mysql</code>.",
        "config-outdated-sqlite": "'''Папярэджаньне''': усталяваны SQLite $1, у той час, калі мінімальная сумяшчальная вэрсія — $2. SQLite ня будзе даступны.",
        "config-no-fts3": "'''Папярэджаньне''': SQLite створаны без модуля [//sqlite.org/fts3.html FTS3], для гэтага ўнутранага інтэрфэйсу ня будзе даступная магчымасьць пошуку.",
@@ -86,7 +86,7 @@
        "config-no-cli-uri": "'''Папярэджаньне''': Не пазначаны <code>--scriptpath</code>, па змоўчваньні выкарыстоўваецца: <code>$1</code>.",
        "config-using-server": "Выкарыстоўваецца назва сэрвэра «<nowiki>$1</nowiki>».",
        "config-using-uri": "Выкарыстоўваецца URL-спасылка сэрвэра «<nowiki>$1$2</nowiki>».",
-       "config-uploads-not-safe": "'''Папярэджаньне:''' дырэкторыя для загрузак па змоўчваньні <code>$1</code> уразьлівая да выкананьня адвольнага коду.\nХоць MediaWiki і правярае ўсе файлы перад захаваньнем, вельмі рэкамэндуецца [//www.mediawiki.org/wiki/Manual:Security#Upload_security закрыць гэтую ўразьлівасьць] перад уключэньнем магчымасьці загрузкі файлаў.",
+       "config-uploads-not-safe": "'''Папярэджаньне:''' дырэкторыя для загрузак па змоўчваньні <code>$1</code> уразьлівая да выкананьня адвольнага коду.\nХоць MediaWiki і правярае ўсе файлы перад захаваньнем, вельмі рэкамэндуецца [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security закрыць гэтую ўразьлівасьць] перад уключэньнем магчымасьці загрузкі файлаў.",
        "config-no-cli-uploads-check": "'''Папярэджаньне:''' Вашая дырэкторыя для загрузак па змоўчваньні (<code>$1</code>), не правераная на ўразьлівасьць да выкананьня адвольных скрыптоў падчас усталяваньня CLI.\n.",
        "config-brokenlibxml": "У Вашай сыстэме ўсталяваныя PHP і libxml2 зь несумяшчальнымі вэрсіямі, што можа прывесьці да пашкоджаньня зьвестак MediaWiki і іншых вэб-дастасаваньняў.\nАбнавіце libxml2 да вэрсіі 2.7.3 ці больш позьняй ([https://bugs.php.net/bug.php?id=45996 паведамленьне пра памылку на сайце PHP]).\nУсталяваньне перарванае.",
        "config-suhosin-max-value-length": "Suhosin усталяваны і абмяжоўвае <code>даўжыню</code> парамэтру GET да $1 {{PLURAL:$1|1=байта|байтаў}}.\nResourceLoader, складнік MediaWiki, будзе абходзіць гэтае абмежаваньне, што адаб’ецца на прадукцыйнасьці.\nКалі магчыма, варта ўсталяваць у <code>php.ini</code> значэньне <code>suhosin.get.max_value_length</code> роўным 1024 ці больш, а таксама вызначыць тое ж значэньне для <code>$wgResourceLoaderMaxQueryLength</code> у <code>LocalSettings.php</code>.",
        "config-mssql-auth": "Тып аўтэнтыфікацыі:",
        "config-mssql-install-auth": "Абярыце тып аўтэнтыфікацыі, які будзе выкарыстаны для злучэньня з базай зьвестак падчас працэсу ўсталяваньня.\nКалі вы абярэце «{{int:config-mssql-windowsauth}}», будуць выкарыстаныя ўліковыя зьвесткі карыстальніка, пад якім працуе вэб-сэрвэр.",
        "config-mssql-web-auth": "Абярыце тып аўтэнтыфікацыі, які вэб-сэрвэр будзе выкарыстоўваць для злучэньня з базай зьвестак падчас звычайнага функцыянаваньня вікі.\nКалі вы абярэце «{{int:config-mssql-windowsauth}}», будуць выкарыстаныя ўліковыя зьвесткі карыстальніка, пад якім працуе вэб-сэрвэр.",
+       "config-mssql-sqlauth": "Аўтэнтыфікацыя SQL-сэрвэра",
+       "config-mssql-windowsauth": "Windows-аўтэнтыфікацыя",
        "config-site-name": "Назва вікі:",
        "config-site-name-help": "Назва будзе паказвацца ў загалоўку браўзэра і ў некаторых іншых месцах.",
        "config-site-name-blank": "Увядзіце назву сайта.",
        "config-profile-no-anon": "Патрэбнае стварэньне рахунку",
        "config-profile-fishbowl": "Толькі для аўтарызаваных рэдактараў",
        "config-profile-private": "Прыватная вікі",
-       "config-profile-help": "Вікі працуюць лепей, калі Вы дазваляеце як мага большай колькасьці людзей рэдагаваць яе.\nУ MediaWiki вельмі лёгка праглядаць апошнія зьмены і выпраўляць любыя памылкі зробленыя недасьведчанымі ўдзельнікамі альбо вандаламі.\n\nТым ня менш, многія лічаць, што MediaWiki можа быць карыснай у шматлікіх іншых ролях, і часта вельмі нялёгка растлумачыць усім перавагі выкарыстаньня тэхналёгіяў вікі.\nТаму Вы маеце выбар.\n\n<strong>{{int:config-profile-wiki}}</strong> дазваляе рэдагаваць усім, нават без уваходу ў сыстэму.\nВікі з <strong>{{int:config-profile-no-anon}}</strong> дазваляе дадатковую адказнасьць, але можа адштурхнуць некаторых патэнцыйных удзельнікаў.\n\nСцэнар <strong>{{int:config-profile-fishbowl}}</strong> дазваляе рэдагаваць зацьверджаным удзельнікам, але ўсе могуць праглядаць старонкі іх гісторыю.\n<strong>{{int:config-profile-private}}</strong> дазваляе праглядаць і рэдагаваць старонкі толькі зацьверджаным удзельнікам.\n\nБольш складаныя правы ўдзельнікаў даступныя пасьля ўсталяваньня, глядзіце [//www.mediawiki.org/wiki/Manual:User_rights адпаведную старонку дакумэнтацыі].",
+       "config-profile-help": "Вікі працуюць лепей, калі Вы дазваляеце як мага большай колькасьці людзей рэдагаваць яе.\nУ MediaWiki вельмі лёгка праглядаць апошнія зьмены і выпраўляць любыя памылкі зробленыя недасьведчанымі ўдзельнікамі альбо вандаламі.\n\nТым ня менш, многія лічаць, што MediaWiki можа быць карыснай у шматлікіх іншых ролях, і часта вельмі нялёгка растлумачыць усім перавагі выкарыстаньня тэхналёгіяў вікі.\nТаму Вы маеце выбар.\n\n<strong>{{int:config-profile-wiki}}</strong> дазваляе рэдагаваць усім, нават без уваходу ў сыстэму.\nВікі з <strong>{{int:config-profile-no-anon}}</strong> дазваляе дадатковую адказнасьць, але можа адштурхнуць некаторых патэнцыйных удзельнікаў.\n\nСцэнар <strong>{{int:config-profile-fishbowl}}</strong> дазваляе рэдагаваць зацьверджаным удзельнікам, але ўсе могуць праглядаць старонкі іх гісторыю.\n<strong>{{int:config-profile-private}}</strong> дазваляе праглядаць і рэдагаваць старонкі толькі зацьверджаным удзельнікам.\n\nБольш складаныя правы ўдзельнікаў даступныя пасьля ўсталяваньня, глядзіце [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights адпаведную старонку дакумэнтацыі].",
        "config-license": "Аўтарскія правы і ліцэнзія:",
        "config-license-none": "Без інфармацыі пра ліцэнзію",
        "config-license-cc-by-sa": "Creative Commons Attribution Share Alike",
        "config-email-sender-help": "Увядзіце адрас электроннай пошты для вяртаньня ў якасьці адрасу дасылаемых электронных лістоў.\nСюды будуць дасылацца неатрыманыя электронныя лісты.\nШматлікія паштовыя сэрвэры патрабуюць, каб хаця б назва дамэну была слушнай.",
        "config-upload-settings": "Загрузкі выяваў і файлаў",
        "config-upload-enable": "Дазволіць загрузку файлаў",
-       "config-upload-help": "Дазвол загрузкі файлаў можа патэнцыйна пагражаць бясьпекі сэрвэра.\nДадатковую інфармацыю можна атрымаць ў [//www.mediawiki.org/wiki/Manual:Security разьдзеле бясьпекі].\n\nКаб дазволіць загрузку файлаў, зьмяніце рэжым падкаталёга <code>images</code> у карэннай дырэкторыі MediaWiki так, каб ўэб-сэрвэр меў доступ на запіс.\nПотым дазвольце гэтую магчымасьць.",
+       "config-upload-help": "Дазвол загрузкі файлаў можа патэнцыйна пагражаць бясьпекі сэрвэра.\nДадатковую інфармацыю можна атрымаць ў [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security разьдзеле бясьпекі].\n\nКаб дазволіць загрузку файлаў, зьмяніце рэжым падкаталёга <code>images</code> у карэннай дырэкторыі MediaWiki так, каб ўэб-сэрвэр меў доступ на запіс.\nПотым дазвольце гэтую магчымасьць.",
        "config-upload-deleted": "Дырэкторыя для выдаленых файлаў:",
        "config-upload-deleted-help": "Выберыце дырэкторыю, у якой будуць захоўвацца выдаленыя файлы.\nУ ідэальным выпадку, яна не павінна мець доступу з Інтэрнэту.",
        "config-logo": "URL-адрас лягатыпу:",
        "config-logo-help": "Афармленьне MediaWiki па змоўчваньні ўключае прастору для лягатыпу памерам 135×160 піксэляў у верхнім левым куце.\nЗагрузіце выяву адпаведнага памеру і ўвядзіце тут URL-адрас.\n\nВы можаце ўжыць <code>$wgStylePath</code> або <code>$wgScriptPath</code>, калі ваш лягатып знаходзіцца адносна гэтых шляхоў.\n\nКалі Вы не жадаеце мець ніякага лягатыпу, пакіньце поле пустым.",
        "config-instantcommons": "Дазволіць Instant Commons",
-       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] — магчымасьць, якая дазваляе вікі выкарыстоўваць выявы, гукі і іншыя мэдыя, якія знаходзяцца на сайце [//commons.wikimedia.org/ Wikimedia Commons].\nКаб гэта зрабіць, MediaWiki патрабуе доступу да Інтэрнэту.\n\nКаб даведацца болей пра гэтую магчымасьць, уключаючы інструкцыю пра тое, як яе ўстанавіць ў любой вікі, акрамя Wikimedia Commons, глядзіце [//mediawiki.org/wiki/Manual:$wgForeignFileRepos дакумэнтацыю].",
+       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] — магчымасьць, якая дазваляе вікі выкарыстоўваць выявы, гукі і іншыя мэдыя, якія знаходзяцца на сайце [//commons.wikimedia.org/ Wikimedia Commons].\nКаб гэта зрабіць, MediaWiki патрабуе доступу да Інтэрнэту.\n\nКаб даведацца болей пра гэтую магчымасьць, уключаючы інструкцыю пра тое, як яе ўстанавіць ў любой вікі, акрамя Wikimedia Commons, глядзіце [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos дакумэнтацыю].",
        "config-cc-error": "Выбар ліцэнзіі Creative Commons ня даў вынікаў.\nУвядзіце назву ліцэнзіі ўручную.",
        "config-cc-again": "Выберыце яшчэ раз…",
        "config-cc-not-chosen": "Выберыце, якую ліцэнзію Creative Commons Вы жадаеце выкарыстоўваць і націсьніце «працягваць».",
        "config-insecure-keys": "<strong>Папярэджаньне:</strong> {{PLURAL:$2|1=Ключ бясьпекі $1 створаны|Ключы бясьпекі $1 створаныя}} падчас усталяваньня, {{PLURAL:$2|1=не зьяўляецца паўнасьцю бясьпечным|не зьяўляюцца поўнасьцю бясьпечнымі}}. Рэкамэндуецца зьмяніць {{PLURAL:$2|1=яго ўручную|іх уручную}}.",
        "config-install-sysop": "Стварэньне рахунку адміністратара",
        "config-install-subscribe-fail": "Немагчыма падпісацца на «mediawiki-announce»: $1",
-       "config-install-subscribe-notpossible": "cURL не ўсталяваны, allow_url_fopen недаступны.",
+       "config-install-subscribe-notpossible": "cURL не ўсталяваны, <code>allow_url_fopen</code> недаступны.",
        "config-install-mainpage": "Стварэньне галоўнай старонкі са зьместам па змоўчваньні",
        "config-install-extension-tables": "Стварэньне табліцаў для ўключаных пашырэньняў",
        "config-install-mainpage-failed": "Немагчыма ўставіць галоўную старонку: $1",
        "config-install-done": "'''Віншуем!'''\nВы пасьпяхова ўсталявалі MediaWiki.\n\nПраграма ўсталяваньня стварыла файл <code>LocalSettings.php</code>.\nЁн утрымлівае ўсе Вашыя налады.\n\nВам неабходна загрузіць яго і захаваць у карэнную дырэкторыю Вашай вікі (у тую ж самую дырэкторыю, дзе знаходзіцца index.php). Загрузка павінна пачацца аўтаматычна.\n\nКалі загрузка не пачалася, ці Вы яе адмянілі, Вы можаце перазапусьціць яе націснуўшы на спасылку ніжэй:\n\n$3\n\n'''Заўвага''': калі Вы гэтага ня зробіце зараз, то створаны файл ня будзе даступны Вам потым, калі Вы выйдзеце з праграмы ўсталяваньня  без яго загрузкі.\n\nКалі Вы гэта зробіце, Вы можаце '''[$2 ўвайсьці ў Вашую вікі]'''.",
        "config-download-localsettings": "Загрузіць <code>LocalSettings.php</code>",
        "config-help": "дапамога",
+       "config-help-tooltip": "націсьніце, каб разгарнуць",
        "config-nofile": "Файл «$1» ня знойдзены. Ці быў ён выдалены?",
+       "config-extension-link": "Ці ведаеце вы, што вашая вікі падтрымлівае [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions пашырэньні]?\n\nВы можаце праглядзець [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category пашырэньні паводле катэгорыяў].",
        "mainpagetext": "'''MediaWiki пасьпяхова ўсталяваная.'''",
-       "mainpagedocfooter": "Глядзіце [//meta.wikimedia.org/wiki/Help:Contents дапаможнік карыстальніка] для атрыманьня інфармацыі па карыстаньні вікі-праграмамі.\n\n== З чаго пачаць ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Сьпіс парамэтраў канфігурацыі]\n* [//www.mediawiki.org/wiki/Manual:FAQ Частыя пытаньні MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Рассылка паведамленьняў пра зьяўленьне новых вэрсіяў MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Пераклад MediaWiki на вашую мову]"
+       "mainpagedocfooter": "Глядзіце [//meta.wikimedia.org/wiki/Help:Contents дапаможнік карыстальніка] для атрыманьня інфармацыі па карыстаньні вікі-праграмамі.\n\n== З чаго пачаць ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Сьпіс парамэтраў канфігурацыі]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Частыя пытаньні MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Рассылка паведамленьняў пра зьяўленьне новых вэрсіяў MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Пераклад MediaWiki на вашую мову]"
 }
index ce4da7d..7f353ec 100644 (file)
@@ -1,5 +1,5 @@
 {
        "@metadata": [],
        "mainpagetext": "'''MediaWiki паспяхова ўсталяваная.'''",
-       "mainpagedocfooter": "Гл. [//meta.wikimedia.org/wiki/Help:Contents Дапаможнік карыстальніка (англ.)] па далейшыя звесткі аб карыстанні вікі-праграмамі.\n\n== З чаго пачаць ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Пералік параметраў канфігурацыі (англ.)]\n* [//www.mediawiki.org/wiki/Manual:FAQ ЧАПЫ MediaWiki (англ.)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Ліставанне аб выпусках 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 964de36..b59a628 100644 (file)
        "config-restart": "Да, започване отначало",
        "config-welcome": "=== Проверка на средата ===\nЩе бъдат извършени основни проверки, които да установят дали средата е подходяща за инсталиране на МедияУики.\nАко е необходима помощ по време на инсталацията, резултатите от направените проверки трябва също да бъдат предоставени.",
        "config-copyright": "=== Авторски права и Условия ===\n\n$1\n\nТази програма е свободен софтуер, който може да се променя и/или разпространява според Общия публичен лиценз на GNU, както е публикуван от Free Software Foundation във версия на Лиценза 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/Help:Contents Наръчник на потребителя]\n* [//www.mediawiki.org/wiki/Manual:Contents Наръчник на администратора]\n* [//www.mediawiki.org/wiki/Manual:FAQ ЧЗВ]\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 Сайт на МедияУики]\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": "Инсталирана е версия на 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/Unicode_normalization_considerations нормализацията на Уникод].",
-       "config-unicode-update-warning": "'''Предупреждение''': Инсталираната версия на Обвивката за нормализация на Unicode използва по-старата версия на библиотеката на [http://site.icu-project.org/ проекта ICU].\nНеобходимо е да [//www.mediawiki.org/wiki/Unicode_normalization_considerations инсталирате по-нова верия], в случай че сте загрижени за използването на Unicode.",
+       "config-unicode-pure-php-warning": "'''Предупреждение''': [http://pecl.php.net/intl Разширението intl PECL] не е налично за справяне с нормализацията на Уникод, превключване към по-бавното изпълнение на чист PHP.\nАко сайтът е с голям трафик, препоръчително е запознаването с [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations нормализацията на Уникод].",
+       "config-unicode-update-warning": "'''Предупреждение''': Инсталираната версия на Обвивката за нормализация на Unicode използва по-старата версия на библиотеката на [http://site.icu-project.org/ проекта ICU].\nНеобходимо е да [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations инсталирате по-нова верия], в случай че сте загрижени за използването на Unicode.",
        "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], затова възможностите за търсене няма да са достъпни.",
@@ -76,7 +76,7 @@
        "config-no-uri": "'''Грешка:''' Не може да се определи текущия адрес.\nИнсталация беше прекратена.",
        "config-using-server": "Използване на сървърното име \"<nowiki>$1</nowiki>\".",
        "config-using-uri": "Използване на сървърния адрес (URL) \"<nowiki>$1$2</nowiki>\".",
-       "config-uploads-not-safe": "'''Предупреждение:''' Папката по подразбиране за качване <code>$1</code> е уязвима от изпълнение на зловредни скриптове.\nВъпреки че МедияУики извършва проверка за заплахи в сигурността на всички качени файлове, силно препоръчително е да се [//www.mediawiki.org/wiki/Manual:Security#Upload_security затвори тази уязвимост в сигурността] преди разрешаване за качване на файлове.",
+       "config-uploads-not-safe": "'''Предупреждение:''' Папката по подразбиране за качване <code>$1</code> е уязвима от изпълнение на зловредни скриптове.\nВъпреки че МедияУики извършва проверка за заплахи в сигурността на всички качени файлове, силно препоръчително е да се [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security затвори тази уязвимост в сигурността] преди разрешаване за качване на файлове.",
        "config-brokenlibxml": "Вашата система използа комбинация от версии на PHP и libxml2, които са с много грешки и могат да причинят скрити повреди на данните в МедияУики или други уеб приложения.\nНеобходимо е обновяване до PHP 5.2.9 или по-нова версия и libxml2 2.7.3 или по-нова версия ([//bugs.php.net/bug.php?id=45996 докладвана грешка при PHP]).\nИнсталацията беше прекратена.",
        "config-suhosin-max-value-length": "Suhosin е инсталиран и ограничава дължината на параметъра GET на $1 байта. Компонентът на МедияУики ResourceLoader ще може да пренебрегне частично това ограничение, но това ще намали производителността. По възможност е препоръчително да се настрои <code>suhosin.get.max_value_length</code> на 1024 или по-голяма стойност в <code>php.ini</code> и в LocalSettings.php да се настрои <code>$wgResourceLoaderMaxQueryLength</code> със същата стойност.",
        "config-db-type": "Тип на базата от данни:",
        "config-profile-no-anon": "Необходимо е създаване на сметка",
        "config-profile-fishbowl": "Само одобрени редактори",
        "config-profile-private": "Затворено уики",
-       "config-profile-help": "Уикитата функционират най-добре, когато позволяват на възможно най-много хора да ги редактират.\nВ МедияУики лесно се преглеждат последните промени и се възстановяват поражения от недобронамерени потребители.\n\nВъпреки това мнозина смятат МедияУики за полезен софтуер по различни начини и често е трудно да се убедят всички от предимствата на уики модела.\nЗатова се предоставя възможност за избор.\n\nУикитата от типа '''{{int:config-profile-wiki}}''' позволяват на всички потребители да редактират, дори и без регистрация.\nУикитата от типа '''{{int:config-profile-no-anon}}''' позволяват достъп до страниците и редактирането им само след създаване на потребителска сметка.\n\nУики, което е '''{{int:config-profile-fishbowl}}''' позволява на всички да преглеждат страниците, но само предварително одобрени редактори могат да редактират съдържанието.\nВ '''{{int:config-profile-private}}''' само предварително одобрени потребители могат да четат и редактират съдържанието.\n\nДетайлно обяснение на конфигурациите на потребителските права е достъпно след инсталацията в [//www.mediawiki.org/wiki/Manual:User_rights Наръчника за потребителски права].",
+       "config-profile-help": "Уикитата функционират най-добре, когато позволяват на възможно най-много хора да ги редактират.\nВ МедияУики лесно се преглеждат последните промени и се възстановяват поражения от недобронамерени потребители.\n\nВъпреки това мнозина смятат МедияУики за полезен софтуер по различни начини и често е трудно да се убедят всички от предимствата на уики модела.\nЗатова се предоставя възможност за избор.\n\nУикитата от типа '''{{int:config-profile-wiki}}''' позволяват на всички потребители да редактират, дори и без регистрация.\nУикитата от типа '''{{int:config-profile-no-anon}}''' позволяват достъп до страниците и редактирането им само след създаване на потребителска сметка.\n\nУики, което е '''{{int:config-profile-fishbowl}}''' позволява на всички да преглеждат страниците, но само предварително одобрени редактори могат да редактират съдържанието.\nВ '''{{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-email-sender-help": "Въвежда се адрес за електронна поща, който ще се използва за обратен адрес при изходящи е-писма.\nТова е адресът, на който ще се получават върнатите и неполучени писма.\nМного е-пощенски сървъри изискват поне домейн името да е валидно.",
        "config-upload-settings": "Картинки и качване на файлове",
        "config-upload-enable": "Позволяне качването на файлове",
-       "config-upload-help": "Качването на файлове е възможно да доведе до пробели със сигурността на сървъра.\nПовече информация по темата има в [//www.mediawiki.org/wiki/Manual:Security раздела за сигурност] в Наръчника.\n\nЗа позволяване качването на файлове, необходимо е уебсървърът да може да записва в поддиректорията на МедияУики <code>images</code>.\nСлед като това условие е изпълнено, функционалността може да бъде активирана.",
+       "config-upload-help": "Качването на файлове е възможно да доведе до пробели със сигурността на сървъра.\nПовече информация по темата има в [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security раздела за сигурност] в Наръчника.\n\nЗа позволяване качването на файлове, необходимо е уебсървърът да може да записва в поддиректорията на МедияУики <code>images</code>.\nСлед като това условие е изпълнено, функционалността може да бъде активирана.",
        "config-upload-deleted": "Директория за изтритите файлове:",
        "config-upload-deleted-help": "Избиране на директория, в която ще се складират изтритите файлове.\nВ най-добрия случай тя не трябва да е достъпна през уеб.",
        "config-logo": "Адрес на логото:",
        "config-logo-help": "Обликът по подразбиране на МедияУики вклчва място с размери 135х160 пиксела за лого над страничното меню.\nАко има наличен файл с подходящ размер, неговият адрес може да бъде посочен тук.\n\nМоже да се използва <code>$wgStylePath</code> или <code>$wgScriptPath</code> ако логото е относително към тези пътища.\n\nАко не е необходимо лого, полето може да се остави празно.",
        "config-instantcommons": "Включване на Instant Commons",
-       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] е функционалност, която позволява на уикитата да използват картинки, звуци и друга медиа от сайта на Уикимедия [//commons.wikimedia.org/ Общомедия].\nЗа да е възможно това, МедияУики изисква достъп до Интернет.\n\nПовече информация за тази функционалност, както и инструкции за настройване за други уикита, различни от Общомедия, е налична в [//mediawiki.org/wiki/Manual:$wgForeignFileRepos наръчника].",
+       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] е функционалност, която позволява на уикитата да използват картинки, звуци и друга медиа от сайта на Уикимедия [//commons.wikimedia.org/ Общомедия].\nЗа да е възможно това, МедияУики изисква достъп до Интернет.\n\nПовече информация за тази функционалност, както и инструкции за настройване за други уикита, различни от Общомедия, е налична в [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos наръчника].",
        "config-cc-error": "Избирането на лиценз на Криейтив Комънс не даде резултат.\nНеобходимо е името на лиценза да бъде въведено ръчно.",
        "config-cc-again": "Повторно избиране...",
        "config-cc-not-chosen": "Изберете кой лиценз на Криейтив Комънс желаете и щракнете \"proceed\".",
        "config-insecure-keys": "'''Предупреждение:''' {{PLURAL:$2|Сигурният ключ, създаден по време на инсталацията, не е напълно надежден|Сигурните ключове, създадени по време на инсталацията, не са напълно надеждни}} $1 . Обмислете да {{PLURAL:$2|го|ги}} смените ръчно.",
        "config-install-sysop": "Създаване на администраторска сметка",
        "config-install-subscribe-fail": "Невъзможно беше абонирането за mediawiki-announce: $1",
-       "config-install-subscribe-notpossible": "не е инсталиран cURL и allow_url_fopen не е налична.",
+       "config-install-subscribe-notpossible": "не е инсталиран cURL и <code>allow_url_fopen</code> не е налична.",
        "config-install-mainpage": "Създаване на Началната страница със съдържание по подразбиране",
        "config-install-extension-tables": "Създаване на таблици за включените разширения",
        "config-install-mainpage-failed": "Вмъкването на Началната страница беше невъзможно: $1",
        "config-download-localsettings": "Изтегляне на <code>LocalSettings.php</code>",
        "config-help": "помощ",
        "config-nofile": "Файлът „$1“ не може да бъде открит. Да не е бил изтрит?",
-       "config-extension-link": "Знаете ли, че това уики поддържа [//www.mediawiki.org/wiki/Manual:Extensions разширения]?\n\nМожете да разгледате [//www.mediawiki.org/wiki/Category:Extensions_by_category разширенията по категория] или [//www.mediawiki.org/wiki/Extension_Matrix Матрицата на разширенията] за пълен списък на разширенията.",
+       "config-extension-link": "Знаете ли, че това уики поддържа [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions разширения]?\n\nМожете да разгледате [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category разширенията по категория] или [//www.mediawiki.org/wiki/Extension_Matrix Матрицата на разширенията] за пълен списък на разширенията.",
        "mainpagetext": "'''Уикито беше успешно инсталирано.'''",
-       "mainpagedocfooter": "Разгледайте [//meta.wikimedia.org/wiki/Help:Contents ръководството] за подробна информация относно използването на уики софтуера.\n\n== Първи стъпки ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Настройки за конфигуриране]\n* [//www.mediawiki.org/wiki/Manual:FAQ ЧЗВ за МедияУики]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Пощенски списък относно нови версии на МедияУики]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Локализиране на МедияУики]"
+       "mainpagedocfooter": "Разгледайте [//meta.wikimedia.org/wiki/Help:Contents ръководството] за подробна информация относно използването на уики софтуера.\n\n== Първи стъпки ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Настройки за конфигуриране]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ ЧЗВ за МедияУики]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Пощенски списък относно нови версии на МедияУики]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Локализиране на МедияУики]"
 }
index ed1e410..f123a10 100644 (file)
@@ -6,5 +6,5 @@
                ]
        },
        "mainpagetext": "'''MediaWiki sudah tapasang awan sukses'''.",
-       "mainpagedocfooter": "Carii panjalasan [//meta.wikimedia.org/wiki/Help:Contents Panduan Pamuruk] gasan mamuruk parangkat lunak wiki\n\n== Gasan bamula ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Daptar konpigurasi setélan]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki nang rancak ditakunakan]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki rilis milis]"
+       "mainpagedocfooter": "Carii panjalasan [//meta.wikimedia.org/wiki/Help:Contents Panduan Pamuruk] gasan mamuruk parangkat lunak wiki\n\n== Gasan bamula ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Daptar konpigurasi setélan]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki nang rancak ditakunakan]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki rilis milis]"
 }
index 0ad55b9..ce8f95c 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Bellayet",
                        "Wikitanvir",
-                       "Aftab1995"
+                       "Aftab1995",
+                       "Tauhid16"
                ]
        },
        "config-desc": "মিডিয়াউইকির জন্য ইন্সটলার",
        "config-page-existingwiki": "ইতিমধ্যেই থাকা উইকি",
        "config-restart": "হ্যাঁ, পুনরায় চালু করুন",
        "config-env-php": "পিএইচপি $1 ইন্সটল করা হয়েছে।",
+       "config-apc": "[http://www.php.net/apc এপিসি] ইনস্টল হয়েছে",
        "config-db-type": "ডেটাবেজের ধরন:",
        "config-db-host": "ডেটাবেজের হোস্ট:",
+       "config-db-wiki-settings": "এই উইকি সনাক্ত করুন",
+       "config-db-name": "উপাত্তসংগ্রহশালা নামঃ",
        "config-db-install-account": "ইন্সটলের জন্য ব্যবহারকারী অ্যাকাউন্ট",
        "config-db-username": "ডেটাবেজের ব্যবহারকারী নাম:",
        "config-db-password": "ডেটাবেজের শব্দচাবি:",
        "config-install-keys": "গোপন কি তৈরি",
        "config-help": "সাহায্য",
        "mainpagetext": "'''মিডিয়াউইকি সফলভাবে ইন্সটল করা হয়েছে।'''",
-       "mainpagedocfooter": "কী ভাবে উইকি সফটওয়্যারটি ব্যবহারকার করবেন, তা জানতে [//meta.wikimedia.org/wiki/Help:Contents ব্যবহারকারী সহায়িকা] দেখুন।\n\n== কোথা থেকে শুরু করবেন ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings কনফিগারেশন সেটিংস তালিকা]\n* [//www.mediawiki.org/wiki/Manual:FAQ প্রশ্নোত্তরে মিডিয়াউইকি]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce মিডিয়াউইকি রিলিজের মেইলিং লিস্ট]"
+       "mainpagedocfooter": "কী ভাবে উইকি সফটওয়্যারটি ব্যবহারকার করবেন, তা জানতে [//meta.wikimedia.org/wiki/Help:Contents ব্যবহারকারী সহায়িকা] দেখুন।\n\n== কোথা থেকে শুরু করবেন ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings কনফিগারেশন সেটিংস তালিকা]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ প্রশ্নোত্তরে মিডিয়াউইকি]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce মিডিয়াউইকি রিলিজের মেইলিং লিস্ট]"
 }
index 05d6eb3..eac6da3 100644 (file)
@@ -1,5 +1,5 @@
 {
        "@metadata": [],
        "mainpagetext": "'''মিডিয়াউইকি হবাবালা ইয়া ইন্সটল ইল.'''",
-       "mainpagedocfooter": "উইকি সফটৱ্যার এহান আতানির বারে দরকার ইলে [//meta.wikimedia.org/wiki/Help:Contents আতাকুরার গাইড]হানর পাঙলাক নেগা।\n\n== অকরানিহান ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings কনফিগারেশন সেটিংর তালিকাহান]\n* [//www.mediawiki.org/wiki/Manual:FAQ মিডিয়া উইকি আঙলাক]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce মিডিয়া উইকির ফঙপার বারে মেইলর তালিকাহান]"
+       "mainpagedocfooter": "উইকি সফটৱ্যার এহান আতানির বারে দরকার ইলে [//meta.wikimedia.org/wiki/Help:Contents আতাকুরার গাইড]হানর পাঙলাক নেগা।\n\n== অকরানিহান ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings কনফিগারেশন সেটিংর তালিকাহান]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ মিডিয়া উইকি আঙলাক]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce মিডিয়া উইকির ফঙপার বারে মেইলর তালিকাহান]"
 }
index 26f189a..de69e20 100644 (file)
        "config-restart": "Ya, adloc'hañ anezhañ",
        "config-welcome": "=== Gwiriadennoù a denn d'an endro ===\nRekis eo un nebeud gwiriadennoù diazez da welet hag azas eo an endro evit gallout staliañ MediaWiki.\nHo pet soñj merkañ disoc'hoù ar gwiriadennoù-se m'ho pez ezhomm skoazell e-pad ar staliadenn.",
        "config-copyright": "=== Gwiriañ aozer ha Termenoù implijout ===\n\n$1\n\nUr meziant frank eo ar programm-mañ; gallout a rit skignañ anezhañ ha/pe kemmañ anezhañ dindan termenoù ar GNU Aotre-implijout Foran Hollek evel m'emañ embannet gant Diazezadur ar Meziantoù Frank; pe diouzh stumm 2 an aotre-implijout, pe (evel mar karit) diouzh ne vern pe stumm nevesoc'h.\n\nIngalet eo ar programm gant ar spi e vo talvoudus met n'eus '''tamm gwarant ebet'''; hep zoken gwarant empleg ar '''varc'hadusted''' pe an '''azaster ouzh ur pal bennak'''. Gwelet ar GNU Aotre-Implijout Foran Hollek evit muioc'h a ditouroù.\n\nSañset oc'h bezañ resevet <doclink href=Copying>un eilskrid eus ar GNU Aotre-implijout Foran Hollek</doclink> a-gevret gant ar programm-mañ; ma n'hoc'h eus ket, skrivit da Diazezadur ar Meziantoù Frank/Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, SUA pe [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html lennit anezhañ enlinenn].",
-       "config-sidebar": "* [//www.mediawiki.org MediaWiki degemer]\n* [//www.mediawiki.org/wiki/Help:Contents Sturlevr an implijerien]\n* [//www.mediawiki.org/wiki/Manual:Contents Sturlevr ar verourien]\n* [//www.mediawiki.org/wiki/Manual:FAQ FAG]\n----\n* <doclink href=Readme>Lennit-me</doclink>\n* <doclink href=ReleaseNotes>Notennoù embann</doclink>\n* <doclink href=Copying>Oc'h eilañ</doclink>\n* <doclink href=UpgradeDoc>O hizivaat</doclink>",
+       "config-sidebar": "* [//www.mediawiki.org MediaWiki degemer]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Sturlevr an implijerien]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Sturlevr ar verourien]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAG]\n----\n* <doclink href=Readme>Lennit-me</doclink>\n* <doclink href=ReleaseNotes>Notennoù embann</doclink>\n* <doclink href=Copying>Oc'h eilañ</doclink>\n* <doclink href=UpgradeDoc>O hizivaat</doclink>",
        "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-php-toolow": "Staliet eo PHP $1.\nNemet eo rekis PHP $2 pe nevesoc'h evit MediaWiki.",
        "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/Unicode_normalization_considerations Unicode normalization]. (e saozneg)",
-       "config-unicode-update-warning": "'''Diwallit''': ober a ra stumm staliet endalc'her skoueriekaat Unicode gant ur stumm kozh eus [http://site.icu-project.org/ levraoueg meziantoù ar raktres ICU].\nDleout a rafec'h [//www.mediawiki.org/wiki/Unicode_normalization_considerations hizivaat] ma seblant deoc'h bezañ pouezus ober gant 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-unicode-update-warning": "'''Diwallit''': ober a ra stumm staliet endalc'her skoueriekaat Unicode gant ur stumm kozh eus [http://site.icu-project.org/ levraoueg meziantoù ar raktres ICU].\nDleout a rafec'h [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations hizivaat] ma seblant deoc'h bezañ pouezus ober gant Unicode.",
        "config-no-db": "N'eus ket bet gallet kavout ur sturier diazoù roadennoù a zere ! Ret eo deoc'h staliañ ur sturier diazoù roadennoù evit PHP.\nSkoret eo an diazoù roadennoù da-heul : $1.\n\nMa rit gant un herberc'hiañ kenrannet, goulennit digant ho herberc'hier staliañ ur sturier diaz roadennoù azas.\nMa kempunit PHP c'hwi hoc'h-unan, adkeflugnit-eñ en ur weredekaat un arval diaz roadennoù, da skouer en ur ober gant <code>./configure --mysql</code>.\nM'hoc'h eus staliet PHP adalek ur pakad Debian pe Ubuntu, eo ret deoc'h staliañ ar vodulenn php5-mysql ivez.",
        "config-no-fts3": "'''Diwallit ''': Kempunet eo SQLite hep ar [//sqlite.org/fts3.html vodulenn FTS3]; ne vo ket posupl ober gant an arc'hwelioù klask er staliadur-mañ",
        "config-register-globals": "'''Diwallit : Gweredekaet eo dibarzh <code>[http://php.net/register_globals register_globals]</code> PHP.'''\n'''Diweredekait anezhañ ma c'hallit.'''\nMont a raio MediaWiki en-dro met fazioù surentez a c'hallo c'hoari war ho servijer",
@@ -78,7 +78,7 @@
        "config-no-uri": "'''Fazi :''' N'eus ket tu da anavezout URI ar skript red.\nStaliadur nullet.",
        "config-using-server": "Oc'h implijout an anv servijer \"<nowiki>$1</nowiki>\".",
        "config-using-uri": "Oc'h implijout ar servijour URL \"<nowiki>$1$2</nowiki>\".",
-       "config-uploads-not-safe": "'''Diwallit :'''Bresk eo ho kavlec'h pellgargañ dre ziouer <code>$1</code> rak gallout a ra erounit ne vern pe skript.\nha pa vefe gwiriet gant MediaWiki an holl restroù pellgarget eo erbedet-groñs da [//www.mediawiki.org/wiki/Manual:Security#Upload_security serriñ ar breskter surentez-mañ] a-rao gweredekaat ar pellgargañ.",
+       "config-uploads-not-safe": "'''Diwallit :'''Bresk eo ho kavlec'h pellgargañ dre ziouer <code>$1</code> rak gallout a ra erounit ne vern pe skript.\nha pa vefe gwiriet gant MediaWiki an holl restroù pellgarget eo erbedet-groñs da [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security serriñ ar breskter surentez-mañ] a-rao gweredekaat ar pellgargañ.",
        "config-brokenlibxml": "Ur meskad stummoù PHP ha libxml2 dreinek a vez implijet gant ho reizhiad. Gallout a ra breinañ ar roadennoù e MediaWiki hag en arloadoù web all.\nHizivait da libxml2 2.7.3 pe nevesoc'h ([//bugs.php.net/bug.php?id=45996 draen renablet gant PHP]).\nStaliadur c'hwitet.",
        "config-db-type": "Doare an diaz roadennoù :",
        "config-db-host": "Anv implijer an diaz roadennoù :",
        "config-install-keys": "Genel an alc'hwezioù kuzh",
        "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 allow_url_fopen.",
+       "config-install-subscribe-notpossible": "cURL n'eo ket staliet ha ne c'haller ket ober gant <code>allow_url_fopen</code>.",
        "config-install-mainpage": "O krouiñ ar bajenn bennañ gant un endalc'had dre ziouer",
        "config-install-extension-tables": "O krouiñ taolennoù evit an astennoù gweredekaet",
        "config-install-mainpage-failed": "Ne c'haller ket ensoc'hañ ar bajenn bennañ: $1",
        "config-help": "skoazell",
        "config-nofile": "N'eus ket bet gallet kavout ar restr \"$1\". Daoust ha dilamet eo bet ?",
        "mainpagetext": "'''Meziant MediaWiki staliet.'''",
-       "mainpagedocfooter": "Sellit ouzh [//meta.wikimedia.org/wiki/Help:Contents Sturlevr an implijerien] evit gouzout hiroc'h war an doare da implijout ar meziant wiki.\n\n== Kregiñ ganti ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Roll an arventennoù kefluniañ]\n* [//www.mediawiki.org/wiki/Manual:FAQ FAG MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Roll ar c'haozeadennoù diwar-benn dasparzhoù MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Lec'hiañ MediaWiki en ho yezh"
+       "mainpagedocfooter": "Sellit ouzh [//meta.wikimedia.org/wiki/Help:Contents Sturlevr an implijerien] evit gouzout hiroc'h war an doare da implijout ar meziant wiki.\n\n== Kregiñ ganti ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Roll an arventennoù kefluniañ]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAG MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Roll ar c'haozeadennoù diwar-benn dasparzhoù MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Lec'hiañ MediaWiki en ho yezh"
 }
index 572ce54..28b14fa 100644 (file)
@@ -33,7 +33,7 @@
        "config-page-upgradedoc": "Nadograđujem",
        "config-help-restart": "Da li želite očistiti sve spremljene podatke koje ste unijeli i da započnete ponovo proces instalacije?",
        "config-restart": "Da, pokreni ponovo",
-       "config-sidebar": "* [//www.mediawiki.org MediaWiki Početna strana]\n* [//www.mediawiki.org/wiki/Help:Contents Vodič za korisnike]\n* [//www.mediawiki.org/wiki/Manual:Contents Vodič za administratore]\n* [//www.mediawiki.org/wiki/Manual:FAQ NPP]\n----\n* <doclink href=Readme>Pročitaj me</doclink>\n* <doclink href=ReleaseNotes>Napomene izdanja</doclink>\n* <doclink href=Copying>Kopiranje</doclink>\n* <doclink href=UpgradeDoc>Poboljšavanje</doclink>",
+       "config-sidebar": "* [//www.mediawiki.org MediaWiki Početna strana]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Vodič za korisnike]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Vodič za administratore]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ NPP]\n----\n* <doclink href=Readme>Pročitaj me</doclink>\n* <doclink href=ReleaseNotes>Napomene izdanja</doclink>\n* <doclink href=Copying>Kopiranje</doclink>\n* <doclink href=UpgradeDoc>Poboljšavanje</doclink>",
        "config-env-good": "Okruženje je provjereno.\nMožete instalirati MediaWiki.",
        "config-env-php": "PHP $1 je instaliran.",
        "config-no-db": "Nije mogao biti pronađen pogodan driver za bazu podataka! Morate instalirati driver baze podataka za PHP.\nSlijedeće vrste baza podataka su podržane: $1.\n\nAko se na dijeljenom serveru, tražite od vašeg pružaoca usluga da instalira pogodan driver za bazu podataka.\nAko se sami kompajlirali PHP, podesite ga sa omogućenim klijentom baze podataka, koristeći naprimjer <code>./configure --with-mysql</code>.\nAko ste instalirali PHP iz Debian ili Ubuntu paketa, možda morate instalirati i modul php5-mysql.",
@@ -55,5 +55,5 @@
        "config-admin-name": "Vaše ime:",
        "config-admin-password": "Šifra:",
        "mainpagetext": "'''MediaViki softver is uspješno instaliran.'''",
-       "mainpagedocfooter": "Kontaktirajte [//meta.wikimedia.org/wiki/Help:Contents uputstva za korisnike] za informacije o upotrebi wiki programa.\n\n== Početak ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista postavki]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki najčešće postavljana pitanja]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista E-Mail adresa MediaWiki]"
+       "mainpagedocfooter": "Kontaktirajte [//meta.wikimedia.org/wiki/Help:Contents uputstva za korisnike] za informacije o upotrebi wiki programa.\n\n== Početak ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista postavki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki najčešće postavljana pitanja]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista E-Mail adresa MediaWiki]"
 }
index 6967ed1..8d678e0 100644 (file)
@@ -16,7 +16,7 @@
        "config-localsettings-badkey": "La clau que heu proporcionat no és correcta.",
        "config-upgrade-key-missing": "S'ha detectat una instal·lació ja existent del MediaWiki.\nPer actualitzar-la, poseu la línia següent al final de <code>LocalSettings.php</code>:\n\n$1",
        "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> o <code>AdminSettings.php</code>. Corregiu aquests paràmetres i torneu-ho a provar.\n\n$1",
+       "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-your-language": "La vostra llengua:",
        "config-your-language-help": "Seleccioneu la llengua que s'utilitzarà durant el procés d'instal·lació.",
@@ -46,6 +46,8 @@
        "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-php-toolow": "El PHP $1 està instal·lat.\nMalauradament, el MediaWiki necessita el PHP $2 o superior.",
+       "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-diff3-bad": "No s'ha trobat el GNU diff3.",
        "config-git": "S'ha trobat el programari de control de versions Git: <code>$1</code>.",
        "config-git-bad": "No s'ha trobat el programari de control de versions Git.",
        "config-install-user": "S'està creant l'usuari de la base de dades",
        "config-install-user-alreadyexists": "L'usuari «$1» ja existeix",
        "config-install-user-create-failed": "La creació de l'usuari «$1» ha fallat: $2",
+       "config-install-user-grant-failed": "Ha fallat la concessió de permisos a l'usuari «$1»: $2",
        "config-install-user-missing": "L'usuari «$1» especificat no existeix.",
        "config-install-user-missing-create": "L'usuari «$1» especificat no existeix.\nFeu clic a la casella «Crea un compte» a continuació si voleu crear-lo.",
        "config-install-tables": "S'estan creant les taules",
        "config-install-keys": "S'estan generant les claus secretes",
        "config-install-sysop": "S'està creant un compte d'usuari d'administrador",
        "config-install-subscribe-fail": "No s'ha pogut subscriure a mediawiki-announce: $1",
+       "config-install-subscribe-notpossible": "El cURL no està instal·lat i <code>allow_url_fopen</code> no està disponible.",
        "config-install-mainpage": "S'està creant la pàgina principal amb el contingut per defecte",
        "config-install-extension-tables": "S'estan creant taules de les extensions habilitades",
        "config-install-mainpage-failed": "No s'ha pogut inserir la pàgina principal: $1",
        "config-help": "ajuda",
        "config-nofile": "No s'ha pogut trobar el fitxer «$1». S'ha suprimit?",
        "mainpagetext": "'''El MediaWiki s'ha instal·lat correctament.'''",
-       "mainpagedocfooter": "Consulteu la [//meta.wikimedia.org/wiki/Help:Contents Guia d'Usuari] per a més informació sobre com utilitzar-lo.\n\n== Per a començar ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Llista de característiques configurables]\n* [//www.mediawiki.org/wiki/Manual:FAQ PMF del MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Llista de correu (''listserv'') per a anuncis del MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Traduïu MediaWiki en la vostra llengua]"
+       "mainpagedocfooter": "Consulteu la [//meta.wikimedia.org/wiki/Help:Contents Guia d'Usuari] per a més informació sobre com utilitzar-lo.\n\n== Per a començar ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Llista de característiques configurables]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ PMF del MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Llista de correu (''listserv'') per a anuncis del MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Traduïu MediaWiki en la vostra llengua]"
 }
index 80b6e3a..ebd94ec 100644 (file)
@@ -2,7 +2,8 @@
        "@metadata": {
                "authors": [
                        "Sasan700",
-                       "Умар"
+                       "Умар",
+                       "Seb35"
                ]
        },
        "config-desc": "MediaWiki инсталлятор",
        "config-no-fts3": "'''Тергам бе''': SQLite гулйина хуттург йоцуш [//sqlite.org/fts3.html FTS3] — лахар болхбеш хир дац оцу бухца.",
        "config-no-cli-uri": "'''ДӀахьедар''': <code>--scriptpath</code> параметр язйина яц, иза Ӏад йитарца лелош ю: <code>$1</code> .",
        "config-db-name": "Хаамийн базан цӀе:",
+       "config-db-username-empty": "Ахьа «{{int:config-db-username}}» параметран маьӀна даздан дезаш ду.",
        "config-db-charset": "Базан хаамийн символийн гулам",
        "config-charset-mysql5-binary": "MySQL 4.1/5.0 бинаран",
        "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
        "config-type-mssql": "Microsoft SQL Server",
        "config-header-mssql": "Microsoft SQL Server параметраш",
        "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 ЦӀераш техкаран кеп Oracle])",
+       "config-sqlite-fts3-downgrade": "PHPн  гӀо до FTS3 яц — кхуссу таблицаш",
        "config-mysql-utf8": "UTF-8",
        "config-mssql-auth": "Аутентификацин тайп:",
        "config-site-name": "Викин цӀе:",
        "config-install-stats": "Инициализацин статистика",
        "config-install-keys": "Къайлаха долу догӀанаш кхоллар",
        "config-install-sysop": "Куьйгалхочун дӀаяздар кхоллар",
-       "config-install-subscribe-notpossible": "cURL дӀахӀоттийна яц я тӀекхочехь яц опци allow_url_fopen.",
+       "config-install-subscribe-notpossible": "cURL дӀахӀоттийна яц я тӀекхочехь яц опци <code>allow_url_fopen</code>.",
        "config-install-mainpage-failed": "Коьрта агӀо йилла цатарло: $1",
        "config-download-localsettings": "Чуяккха <code>LocalSettings.php</code>",
        "config-help": "гӀо",
        "config-nofile": "Файл \"$1\" каро цаелира. И дӀаяьккхина ярий?",
        "mainpagetext": "'''Вики-белха гlирс «MediaWiki» кхочуш дика дlахlоттийна.'''",
-       "mainpagedocfooter": "Викийца болх бан хаамаш карор бу хlокху чохь [//meta.wikimedia.org/wiki/%D0%9F%D0%BE%D0%BC%D0%BE%D1%89%D1%8C:%D0%A1%D0%BE%D0%B4%D0%B5%D1%80%D0%B6%D0%B0%D0%BD%D0%B8%D0%B5 нисвохааман куьйгаллица].\n\n== Цхьаболу пайде гlирсаш ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Гlирс нисбан тарлушболу могlам];\n* [//www.mediawiki.org/wiki/Manual:FAQ Сих сиха лушдолу хаттарш а жоьпаш оцу MediaWiki];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Хаам бохьуьйту араяларца башхонца керла MediaWiki]."
+       "mainpagedocfooter": "Викийца болх бан хаамаш карор бу хlокху чохь [//meta.wikimedia.org/wiki/Help:Contents нисвохааман куьйгаллица].\n\n== Цхьаболу пайде гlирсаш ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Гlирс нисбан тарлушболу могlам];\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Сих сиха лушдолу хаттарш а жоьпаш оцу MediaWiki];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Хаам бохьуьйту араяларца башхонца керла MediaWiki].\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]"
 }
index e43488a..3bdbf05 100644 (file)
@@ -1,5 +1,5 @@
 {
        "@metadata": [],
        "mainpagetext": "'''Malamposon ang pag-instalar sa MediaWiki.'''",
-       "mainpagedocfooter": "Konsultaha ang [//meta.wikimedia.org/wiki/Help:Contents Giya sa mga gumagamit] alang sa impormasyon unsaon paggamit niining wiki nga software.\n\n== Pagsugod ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Listahan sa mga setting sa kompigurasyon]\n* [//www.mediawiki.org/wiki/Manual:FAQ FAQ sa MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce  Mailing list sa mga release sa MediaWiki]"
+       "mainpagedocfooter": "Konsultaha ang [//meta.wikimedia.org/wiki/Help:Contents Giya sa mga gumagamit] alang sa impormasyon unsaon paggamit niining wiki nga software.\n\n== Pagsugod ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Listahan sa mga setting sa kompigurasyon]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ sa MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce  Mailing list sa mga release sa MediaWiki]"
 }
index 97ae4c3..d0db084 100644 (file)
@@ -38,5 +38,5 @@
        "config-install-step-done": "کرا",
        "config-help": "یارمەتی",
        "mainpagetext": "'''میدیاویکی بە سەرکەوتوویی دامەزرا.'''",
-       "mainpagedocfooter": "لە [//meta.wikimedia.org/wiki/Help:Contents ڕێنوێنیی بەکارھێنەران] بۆ زانیاری سەبارەت بە بەکارھێنانی نەرمامێری ویکی کەڵک وەربگرە.\n\n== دەستپێکردن ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings پێرستی ڕێکخستنەکانی شێوەپێدان]\n* [//www.mediawiki.org/wiki/Manual:FAQ پرسیارە دووپاتکراوەکانی میدیاویکی (MediaWiki FAQ)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce پێرستی ئیمەیلی وەشانەکانی میدیاویکی]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources خۆماڵیکردنی ویکیمیدیا بۆ زمانەکەت]"
+       "mainpagedocfooter": "لە [//meta.wikimedia.org/wiki/Help:Contents ڕێنوێنیی بەکارھێنەران] بۆ زانیاری سەبارەت بە بەکارھێنانی نەرمامێری ویکی کەڵک وەربگرە.\n\n== دەستپێکردن ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings پێرستی ڕێکخستنەکانی شێوەپێدان]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ پرسیارە دووپاتکراوەکانی میدیاویکی (MediaWiki FAQ)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce پێرستی ئیمەیلی وەشانەکانی میدیاویکی]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources خۆماڵیکردنی ویکیمیدیا بۆ زمانەکەت]"
 }
index fa3edb9..38dbab1 100644 (file)
@@ -1,9 +1,10 @@
 {
        "@metadata": {
                "authors": [
-                       "Oxyzen"
+                       "Oxyzen",
+                       "Seb35"
                ]
        },
        "mainpagetext": "'''Madalag-on nga na-install ang MediaWiki.'''",
-       "mainpagedocfooter": "Kunsultahon ang [//meta.wikimedia.org/wiki/Help:Pagtuytoy sa Manug-usar] para sa impormasyon sa paggamit sang wiki nga \"software\".\n\n==Pag-umpisa==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista sang mga setting sang konpigurayon]\n* [//www.mediawiki.org/wiki/Manual:FAQ Mga perme napangkot sa MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista sang mga ginapadal-an sang sulat sang MediaWiki]"
+       "mainpagedocfooter": "Kunsultahon ang [//meta.wikimedia.org/wiki/Help:Contents sa Manug-usar] para sa impormasyon sa paggamit sang wiki nga \"software\".\n\n==Pag-umpisa==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista sang mga setting sang konpigurayon]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Mga perme napangkot sa MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista sang mga ginapadal-an sang sulat sang MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]"
 }
index 6d766c4..75bc85b 100644 (file)
@@ -1,5 +1,5 @@
 {
        "@metadata": [],
        "mainpagetext": "'''MediaWiki мувафакъиетнен къурулды.'''",
-       "mainpagedocfooter": "Бу викининъ ёл-ёругъыны [//meta.wikimedia.org/wiki/Help:Contents User's Guide къулланыджы къылавузындан] огренип оласынъыз.\n\n== Базы файдалы сайтлар ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Олуджы сазламалар джедвели];\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki боюнджа сыкъ берильген суаллернен джеваплар];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-нинъ янъы версияларынынъ чыкъувындан хабер йиберюв]."
+       "mainpagedocfooter": "Бу викининъ ёл-ёругъыны [//meta.wikimedia.org/wiki/Help:Contents User's Guide къулланыджы къылавузындан] огренип оласынъыз.\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 df109ea..9142168 100644 (file)
@@ -1,5 +1,5 @@
 {
        "@metadata": [],
        "mainpagetext": "'''MediaWiki muvafaqiyetnen quruldı.'''",
-       "mainpagedocfooter": "Bu vikiniñ yol-yoruğını [//meta.wikimedia.org/wiki/Help:Contents User's Guide qullanıcı qılavuzından] ögrenip olasıñız.\n\n== Bazı faydalı saytlar ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Olucı sazlamalar cedveli];\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki boyunca sıq berilgen suallernen cevaplar];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-niñ yañı versiyalarınıñ çıquvından haber yiberüv]."
+       "mainpagedocfooter": "Bu vikiniñ yol-yoruğını [//meta.wikimedia.org/wiki/Help:Contents User's Guide qullanıcı qılavuzından] ögrenip olasıñız.\n\n== Bazı faydalı saytlar ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Olucı sazlamalar cedveli];\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki boyunca sıq berilgen suallernen cevaplar];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-niñ yañı versiyalarınıñ çıquvından haber yiberüv]."
 }
index 1387731..dbfef20 100644 (file)
@@ -6,7 +6,8 @@
                        "Mormegil",
                        "아라",
                        "Matěj Grabovský",
-                       "Paxt"
+                       "Paxt",
+                       "Matěj Suchánek"
                ]
        },
        "config-desc": "Instalační program pro MediaWiki",
        "config-restart": "Ano, restartovat",
        "config-welcome": "=== Kontrola prostředí ===\nNyní se provedou základní kontroly, aby se zjistilo, zda je toto prostředí použitelné k instalaci MediaWiki.\nPokud budete potřebovat k dokončení instalace pomoc, nezapomeňte sdělit výsledky těchto testů.",
        "config-copyright": "=== Licence a podmínky ===\n$1\n\nTento program je svobodný software; můžete jej šířit nebo modifikovat podle podmínek GNU General Public License, vydávané Free Software Foundation; buď verze 2 této licence anebo (podle vašeho uvážení) kterékoli pozdější verze.\n\nTento program je distribuován v naději, že bude užitečný, avšak '''bez jakékoli záruky'''; neposkytují se ani odvozené záruky '''prodejnosti''' anebo '''vhodnosti pro určitý účel'''.\nPodrobnosti se dočtete v textu GNU General Public License.\n\n<doclink href=Copying>Kopii GNU General Public License</doclink> jste měli obdržet spolu s tímto programem; pokud ne, napište na Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA nebo [http://www.gnu.org/copyleft/gpl.html si ji přečtěte online].",
-       "config-sidebar": "* [//www.mediawiki.org Oficiální web MediaWiki]\n* [//www.mediawiki.org/wiki/Help:Contents Uživatelská příručka]\n* [//www.mediawiki.org/wiki/Manual:Contents Administrátorská příručka]\n* [//www.mediawiki.org/wiki/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>Čti mě</doclink>\n* <doclink href=ReleaseNotes>Poznámky k vydání</doclink>\n* <doclink href=Copying>Licence</doclink>\n* <doclink href=UpgradeDoc>Upgrade</doclink>",
+       "config-sidebar": "* [//www.mediawiki.org Oficiální web MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Uživatelská příručka]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Administrátorská příručka]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>Čti mě</doclink>\n* <doclink href=ReleaseNotes>Poznámky k vydání</doclink>\n* <doclink href=Copying>Licence</doclink>\n* <doclink href=UpgradeDoc>Upgrade</doclink>",
        "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-php-toolow": "Je nainstalováno PHP $1.\nMediaWiki ale vyžaduje PHP $2 nebo vyšší.",
        "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 velkým provozem, měli byste si přečíst něco o [//www.mediawiki.org/wiki/Unicode_normalization_considerations normalizaci Unicode].",
-       "config-unicode-update-warning": "'''Upozornění''': Nainstalovaná verze vrstvy pro normalizaci Unicode používá starší verzi knihovny [http://site.icu-project.org/ projektu ICU].\nPokud vám aspoň trochu záleží na používání Unicode, měli byste [//www.mediawiki.org/wiki/Unicode_normalization_considerations ji aktualizovat].",
+       "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-unicode-update-warning": "'''Upozornění''': Nainstalovaná verze vrstvy pro normalizaci Unicode používá starší verzi knihovny [http://site.icu-project.org/ projektu ICU].\nPokud vám aspoň trochu záleží na používání Unicode, měli byste [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations ji aktualizovat].",
        "config-no-db": "Nepodařilo se nalézt vhodný databázový ovladač! Musíte do PHP nainstalovat databázový ovladač.\nJsou podporovány následující typy databází: $1.\n\nPokud jste si PHP přeložili sami, překonfigurujte ho se zapnutým databázovým klientem, například pomocí <code>./configure --with-mysql</code>.\nPokud jste PHP nainstalovali z balíčku Debian či Ubuntu, potřebujete nainstalovat také modul php5-mysql.",
        "config-outdated-sqlite": "'''Upozornění''': Máte SQLite $1, které je starší než minimálně vyžadovaná verze $2. SQLite nebude dostupné.",
        "config-no-fts3": "'''Upozornění''': SQLite bylo přeloženo bez [//sqlite.org/fts3.html modulu FTS3], funkce pro vyhledávání zde nebudou dostupné.",
@@ -86,8 +87,8 @@
        "config-no-cli-uri": "<strong>Upozornění</strong>: Nebylo uvedeno <code>--scriptpath</code>, používá se implicitní hodnota: <code>$1</code>.",
        "config-using-server": "Použito jméno serveru „<nowiki>$1</nowiki>“.",
        "config-using-uri": "Použito URL serveru „<nowiki>$1$2</nowiki>“.",
-       "config-uploads-not-safe": "'''Upozornění:''' Váš implicitní adresář pro načítání souborů <code>$1</code> umožňuje provádění libovolných skriptů.\nPřestože MediaWiki všechny načítané soubory kontroluje proti bezpečnostním hrozbám, je důrazně doporučeno [//www.mediawiki.org/wiki/Manual:Security#Upload_security tuto bezpečnostní díru zacelit] před povolením načítání souborů.",
-       "config-no-cli-uploads-check": "'''Upozornění:''' Váš implicitní adresář pro načítané soubory (<code>$1</code>) se při instalaci z příkazového řádku nekontroluje na bezpečnostní hrozbu provádění libovolných skriptů.",
+       "config-uploads-not-safe": "'''Upozornění:''' Váš výchozí adresář pro načítání souborů <code>$1</code> umožňuje spouštění libovolných skriptů.\nPřestože MediaWiki všechny načítané soubory kontroluje proti bezpečnostním hrozbám, je důrazně doporučeno [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security tuto bezpečnostní díru zacelit] před povolením načítání souborů.",
+       "config-no-cli-uploads-check": "'''Upozornění:''' Váš výchozí adresář pro načítané soubory (<code>$1</code>) se při instalaci z příkazového řádku nekontroluje na bezpečnostní hrozbu provádění libovolných skriptů.",
        "config-brokenlibxml": "Váš systém obsahuje kombinaci verzí PHP a libxml2, která je chybná a může v MediaWiki a dalších webových aplikacích způsobovat skryté poškozování dat.\nAktualizujte na libxml2 2.7.3 nebo novější ([https://bugs.php.net/bug.php?id=45996 chyba evidovaná u PHP]).\nInstalace přerušena.",
        "config-suhosin-max-value-length": "Je nainstalován Suhosin, který omezuje délku parametrů GET na $1 bajtů.\nKomponenta ResourceLoader z MediaWiki dokáže s tímto omezením pracovat, ale sníží to výkon.\nPokud to je alespoň trochu možné, měli byste v <code>php.ini</code> nastavit <code>suhosin.get.max_value_length</code> na 1024 nebo vyšší a na stejnou hodnotu nastavit v <code>LocalSettings.php</code> proměnnou <code>$wgResourceLoaderMaxQueryLength</code>.",
        "config-db-type": "Typ databáze:",
        "config-db-username": "Databázové uživatelské jméno:",
        "config-db-password": "Databázové heslo:",
        "config-db-password-empty": "Zadejte heslo pro nového databázového uživatele: $1.\nPřestože může jít zakládat nové uživatele i bez hesel, není to bezpečné.",
-       "config-db-username-empty": "Musíte zadat hodnotu pro „{{int:config-db-username}}“",
+       "config-db-username-empty": "Musíte zadat hodnotu pro „{{int:config-db-username}}“.",
        "config-db-install-username": "Zadejte uživatelské jméno, které se použije pro připojení k databázi v průběhu instalace.\nToto není jméno uživatelského účtu MediaWiki; toto je uživatelské jméno k vaší databázi.",
        "config-db-install-password": "Zadejte heslo, které se použije pro připojení k databázi v průběhu instalace.\nToto není heslo uživatelského účtu MediaWiki; toto je heslo k vaší databázi.",
        "config-db-install-help": "Zadejte uživatelské jméno a heslo, které se použijí pro připojení k databázi v průběhu instalace.",
        "config-type-mysql": "MySQL (nebo kompatibilní)",
        "config-type-postgres": "PostgreSQL",
        "config-type-sqlite": "SQLite",
-       "config-type-oracle": "Věštba",
+       "config-type-oracle": "Oracle",
        "config-type-mssql": "Microsoft SQL Server",
        "config-support-info": "MediaWiki podporuje následující databázové systémy:\n\n$1\n\nPokud v nabídce níže nevidíte databázový systém, který chcete použít, musíte pro zapnutí podpory následovat instrukce odkázané výše.",
        "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] je pro MediaWiki hlavní platformou a je podporováno nejlépe. MediaWiki pracuje také s [{{int:version-db-mariadb-url}} MariaDB] a [{{int:version-db-percona-url}} Percona Server], které jsou s MySQL kompatibilní. ([http://www.php.net/manual/en/mysql.installation.php Jak zkompilovat PHP s podporou MySQL])",
        "config-header-oracle": "Nastavení Oracle",
        "config-header-mssql": "Nastavení Microsoft SQL Serveru",
        "config-invalid-db-type": "Chybný typ databáze",
-       "config-missing-db-name": "Musíte zadat hodnotu pro „{{int:config-db-name}}“",
-       "config-missing-db-host": "Musíte zadat hodnotu pro „{{int:config-db-host}}“",
-       "config-missing-db-server-oracle": "Musíte zadat hodnotu pro „{{int:config-db-host-oracle}}“",
+       "config-missing-db-name": "Musíte zadat hodnotu pro „{{int:config-db-name}}“.",
+       "config-missing-db-host": "Musíte zadat hodnotu pro „{{int:config-db-host}}“.",
+       "config-missing-db-server-oracle": "Musíte zadat hodnotu pro „{{int:config-db-host-oracle}}“.",
        "config-invalid-db-server-oracle": "Chybné databázové TNS „$1“.\nPoužívejte buď „TNS Name“ nebo „Easy Connect“ (vizte [http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle Naming Methods]).",
        "config-invalid-db-name": "Chybné jméno databáze „$1“.\nPoužívejte pouze ASCII písmena (a-z, A-Z), čísla (0-9), podtržítko (_) a spojovník (-).",
        "config-invalid-db-prefix": "Chybný databázový prefix „$1“.\nPoužívejte pouze ASCII písmena (a-z, A-Z), čísla (0-9), podtržítko (_) a spojovník (-).",
        "config-profile-no-anon": "Vyžadována registrace uživatelů",
        "config-profile-fishbowl": "Editace jen pro vybrané",
        "config-profile-private": "Soukromá wiki",
-       "config-profile-help": "Wiki fungují nejlépe, když je necháte editovat co největším možným počtem lidí.\nV MediaWiki můžete snadno kontrolovat poslední změny a vracet zpět libovolnou škodu způsobenou hloupými nebo zlými uživateli.\n\nMnoho lidí však zjistilo, že je MediaWiki užitečné v širokém spektru rolí a někdy není snadné všechny přesvědčit o výhodách wikizvyklostí.\nTakže si můžete vybrat.\n\nModel '''{{int:config-profile-wiki}}''' dovoluje editovat všem, aniž by se museli přihlašovat.\nNa wiki, kde je '''{{int:config-profile-no-anon}}''', se lépe řídí zodpovědnost, ale může to odradit náhodné přispěvatele.\n\nProfil '''{{int:config-profile-fishbowl}}''' umožňuje schváleným uživatelům editovat, ale veřejnost si může stránky prohlížet včetně jejich historie.\n'''{{int:config-profile-private}}''' dovoluje stránky prohlížet jen schváleným uživatelům, kteří je i mohou editovat.\n\nPo instalaci je možná komplexní konfigurace uživatelských práv; vizte [//www.mediawiki.org/wiki/Manual:User_rights odpovídající stránku příručky].",
+       "config-profile-help": "Wiki fungují nejlépe, když je necháte editovat co největším možným počtem lidí.\nV MediaWiki můžete snadno kontrolovat poslední změny a vracet zpět libovolnou škodu způsobenou hloupými nebo zlými uživateli.\n\nMnoho lidí však zjistilo, že je MediaWiki užitečné v širokém spektru rolí a někdy není snadné všechny přesvědčit o výhodách wikizvyklostí.\nTakže si můžete vybrat.\n\nModel '''{{int:config-profile-wiki}}''' dovoluje editovat všem, aniž by se museli přihlašovat.\nNa wiki, kde je '''{{int:config-profile-no-anon}}''', se lépe řídí zodpovědnost, ale může to odradit náhodné přispěvatele.\n\nProfil '''{{int:config-profile-fishbowl}}''' umožňuje schváleným uživatelům editovat, ale veřejnost si může stránky prohlížet včetně jejich historie.\n'''{{int:config-profile-private}}''' dovoluje stránky prohlížet jen schváleným uživatelům, kteří je i mohou editovat.\n\nPo instalaci je možná komplexní konfigurace uživatelských práv; vizte [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights odpovídající stránku příručky].",
        "config-license": "Autorská práva a licence:",
        "config-license-none": "Bez patičky s licencí",
        "config-license-cc-by-sa": "Creative Commons Uveďte autora-Zachovejte licenci",
        "config-email-sender-help": "Zadejte e-mailovou adresu, která se má použít jako návratová na odchozích e-mailech.\nSem budou zasílány nedoručitelné zprávy.\nMnoho mailových serverů vyžaduje, aby byla přinejmenším část s doménovým jménem platná.",
        "config-upload-settings": "Obrázky a načítání souborů",
        "config-upload-enable": "Povolit načítání souborů",
-       "config-upload-help": "Načítání souborů potenciálně vystavuje váš server bezpečnostním rizikům.\nVíce informací naleznete v [//www.mediawiki.org/wiki/Manual:Security části o bezpečnosti] v příručce.\n\nPro umožnění načítání souborů změňte práva na podadresáři <code>images</code> pod kořenovým adresářem MediaWiki, aby do něj mohl webový server zapisovat.\nPoté zapněte tuto volbu.",
+       "config-upload-help": "Načítání souborů potenciálně vystavuje váš server bezpečnostním rizikům.\nVíce informací naleznete v [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security části o bezpečnosti] v příručce.\n\nPro umožnění načítání souborů změňte práva na podadresáři <code>images</code> pod kořenovým adresářem MediaWiki, aby do něj mohl webový server zapisovat.\nPoté zapněte tuto volbu.",
        "config-upload-deleted": "Adresář pro smazané soubory:",
        "config-upload-deleted-help": "Zvolte adresář, do kterého se mají archivovat smazané soubory.\nTento adresář by ideálně neměl být dostupný z webu.",
        "config-logo": "URL loga:",
        "config-logo-help": "Základní vzhled MediaWiki zahrnuje místo pro logo o velikosti 135×160 pixelů nad bočním menu.\nNačtěte obrázek odpovídající velikosti a zadejte sem jeho URL.\n\nPokud je vaše logo umístěno relativně vůči <code>$wgStylePath</code> nebo <code>$wgScriptPath</code>, můžete zde tyto proměnné použít.\n\nPokud logo nechcete, ponechte toto pole prázdné.",
        "config-instantcommons": "Zapnout Instant Commons",
-       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] je funkce, která umožňuje wiki používat obrázky, zvuky a další mediální soubory ze serveru [//commons.wikimedia.org/wiki/Hlavn%C3%AD_strana Wikimedia Commons].\nAby to bylo možné, potřebuje mít MediaWiki přístup k internetu.\n\nVíce informací o této funkci, včetně instrukcí, jak ji nastavit pro jiné wiki než Wikimedia Commons, najdete v [//mediawiki.org/wiki/Manual:$wgForeignFileRepos příručce].",
+       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] je funkce, která umožňuje wiki používat obrázky, zvuky a další mediální soubory ze serveru [//commons.wikimedia.org/wiki/Hlavn%C3%AD_strana Wikimedia Commons].\nAby to bylo možné, potřebuje mít MediaWiki přístup k internetu.\n\nVíce informací o této funkci, včetně instrukcí, jak ji nastavit pro jiné wiki než Wikimedia Commons, najdete v [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos příručce].",
        "config-cc-error": "Volič licence Creative Commons nevrátil žádný výsledek.\nZadejte název licence ručně.",
        "config-cc-again": "Zvolit znovu…",
        "config-cc-not-chosen": "Zvolte si požadovanou licenci Creative Commons a klikněte na tlačítko.",
        "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-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é allow_url_fopen.",
+       "config-install-subscribe-notpossible": "Není nainstalován cURL a není dostupné <code>allow_url_fopen</code>.",
        "config-install-mainpage": "Vytváří se počáteční obsah hlavní strany",
        "config-install-extension-tables": "Vytvářejí se tabulky pro zapnutá rozšíření",
        "config-install-mainpage-failed": "Nepodařilo se vložit hlavní stranu: $1",
        "config-install-done": "'''Gratulujeme!'''\nÚspěšně jste nainstalovali MediaWiki.\n\nInstalátor vytvořil soubor <code>LocalSettings.php</code>.\nTen obsahuje veškerou vaši konfiguraci.\n\nBudete si ho muset stáhnout a uložit do základního adresáře vaší instalace wiki (do stejného adresáře jako soubor index.php). Stažení souboru se mělo spustit automaticky.\n\nPokud se vám stažení nenabídlo nebo jste ho zrušili, můžete ho spustit znovu kliknutím na následující odkaz:\n\n$3\n\n'''Poznámka''': Pokud to neuděláte hned, tento vygenerovaný konfigurační soubor nebude později dostupný, pokud instalaci opustíte, aniž byste si ho stáhli.\n\nAž to dokončíte, můžete '''[$2 vstoupit do své wiki]'''.",
        "config-download-localsettings": "Stáhnout <code>LocalSettings.php</code>",
        "config-help": "nápověda",
+       "config-help-tooltip": "rozbalíte kliknutím",
        "config-nofile": "Soubor „$1“ nelze nalézt. Byl smazán?",
-       "config-extension-link": "Věděli jste, že vaše wiki podporuje [//www.mediawiki.org/wiki/Manual:Extensions rozšíření]?\n\nMůžete procházet [//www.mediawiki.org/wiki/Category:Extensions_by_category rozšíření po kategoriích] nebo si prohlédnout [//www.mediawiki.org/wiki/Extension_Matrix Matici rozšíření] obsahující úplný seznam.",
+       "config-extension-link": "Věděli jste, že vaše wiki podporuje [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions rozšíření]?\n\nMůžete si prohlédnout [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category seznam rozšíření po kategoriích].",
        "mainpagetext": "'''MediaWiki byla úspěšně nainstalována.'''",
-       "mainpagedocfooter": "[//meta.wikimedia.org/wiki/Help:Contents Uživatelská příručka] vám napoví, jak MediaWiki používat.\n\n== Začínáme ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Nastavení konfigurace]\n* [//www.mediawiki.org/wiki/Manual:FAQ Často kladené otázky o MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-mailová konference oznámení MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Překlad MediaWiki do vašeho jazyka]"
+       "mainpagedocfooter": "[//meta.wikimedia.org/wiki/Help:Contents Uživatelská příručka] vám napoví, jak MediaWiki používat.\n\n== Začínáme ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Nastavení konfigurace]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Často kladené otázky o MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-mailová konference oznámení MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Překlad MediaWiki do vašeho jazyka]"
 }
index 157cb21..adf128e 100644 (file)
@@ -1,5 +1,9 @@
 {
-       "@metadata": [],
+       "@metadata": {
+               "authors": [
+                       "Seb35"
+               ]
+       },
        "mainpagetext": "'''«MediaWiki» вики-движока лартасси ăнăçлă вĕçленчĕ.'''",
-       "mainpagedocfooter": "Ку википе ĕçлеме пулăшакан информацине [//meta.wikimedia.org/wiki/%D0%9F%D0%BE%D0%BC%D0%BE%D1%89%D1%8C:%D0%A1%D0%BE%D0%B4%D0%B5%D1%80%D0%B6%D0%B0%D0%BD%D0%B8%D0%B5 усăç руководствинче] тупма пултаратăр.\n\n== Пулăшма пултарĕç ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Ĕнерлевсен списокĕ];\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki тăрăх час-часах ыйтакан ыйтусемпе хуравсем];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki çĕнĕ верси тухнине пĕлтерекен рассылка]."
+       "mainpagedocfooter": "Ку википе ĕçлеме пулăшакан информацине [//meta.wikimedia.org/wiki/Help:Contents/ru усăç руководствинче] тупма пултаратăр.\n\n== Пулăшма пултарĕç ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Ĕнерлевсен списокĕ];\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki тăрăх час-часах ыйтакан ыйтусемпе хуравсем];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki çĕнĕ верси тухнине пĕлтерекен рассылка].\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]"
 }
index 37d254f..5ead1dc 100644 (file)
@@ -8,5 +8,5 @@
        },
        "config-desc": "Y gosodwr ar gyfer MediaWiki",
        "mainpagetext": "'''Wedi llwyddo gosod meddalwedd MediaWiki yma'''",
-       "mainpagedocfooter": "Ceir cymorth (yn Saesneg) ar ddefnyddio meddalwedd wici yn y [//meta.wikimedia.org/wiki/Help:Contents Canllaw Defnyddwyr] ar wefan Wikimedia.\n\n==Cychwyn arni==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Rhestr osodiadau wrth gyflunio]\n* [//www.mediawiki.org/wiki/Manual:FAQ Cwestiynau poblogaidd ar MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Rhestr postio datganiadau MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Cyfieithu MediaWici i'ch iaith chi]"
+       "mainpagedocfooter": "Ceir cymorth (yn Saesneg) ar ddefnyddio meddalwedd wici yn y [//meta.wikimedia.org/wiki/Help:Contents Canllaw Defnyddwyr] ar wefan Wikimedia.\n\n==Cychwyn arni==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Rhestr osodiadau wrth gyflunio]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Cwestiynau poblogaidd ar MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Rhestr postio datganiadau MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Cyfieithu MediaWici i'ch iaith chi]"
 }
index 681ecd4..59eec45 100644 (file)
@@ -20,5 +20,5 @@
        "config-header-oracle": "Oracle-indstillinger",
        "config-invalid-db-type": "Ugyldig databasetype",
        "mainpagetext": "'''MediaWiki er nu installeret.'''",
-       "mainpagedocfooter": "Se [//meta.wikimedia.org/wiki/Help:Contents brugervejledningen] for oplysninger om brugen af wikiprogrammellet.\n\n== At komme i gang ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Listen over opsætningsmuligheder]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki ofte stillede spørgsmål]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Postliste angående udgivelser af MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Oversæt MediaWiki til dit sprog]"
+       "mainpagedocfooter": "Se [//meta.wikimedia.org/wiki/Help:Contents brugervejledningen] for oplysninger om brugen af wikiprogrammellet.\n\n== At komme i gang ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Listen over opsætningsmuligheder]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki ofte stillede spørgsmål]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Postliste angående udgivelser af MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Oversæt MediaWiki til dit sprog]"
 }
index 88c9737..944ed61 100644 (file)
@@ -7,6 +7,6 @@
                ]
        },
        "config-welcome": "=== Prüfung der Installationsumgebung ===\nDie Basisprüfungen werden jetzt durchgeführt, um festzustellen, ob die Installationsumgebung für MediaWiki geeignet ist.\nNotieren Sie diese Informationen und geben Sie sie an, sofern Sie Hilfe beim Installieren benötigen.",
-       "config-extension-link": "Wussten Sie, dass Ihr Wiki die Nutzung von [//www.mediawiki.org/wiki/Manual:Extensions Erweiterungen] unterstützt?\n\nSie können [//www.mediawiki.org/wiki/Category:Extensions_by_category Erweiterungen nach Kategorie] durchsuchen oder die [//www.mediawiki.org/wiki/Extension_Matrix Matrix der Erweiterungen] ansehen, um eine Übersicht zu verfügbaren Erweiterungen zu erhalten.",
-       "mainpagedocfooter": "Hilfe zur Benutzung und Konfiguration der Wiki-Software finden Sie im [//meta.wikimedia.org/wiki/Help:Contents Benutzerhandbuch].\n\n== Starthilfen ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Liste der Konfigurationsvariablen]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki-FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Lokalisieren Sie MediaWiki für Ihre Sprache]"
+       "config-extension-link": "Wussten Sie, dass Ihr Wiki die Nutzung von [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions Erweiterungen] unterstützt?\n\nSie können [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category Erweiterungen nach Kategorie] durchsuchen oder die [//www.mediawiki.org/wiki/Extension_Matrix Matrix der Erweiterungen] ansehen, um eine Übersicht zu verfügbaren Erweiterungen zu erhalten.",
+       "mainpagedocfooter": "Hilfe zur Benutzung und Konfiguration der Wiki-Software finden Sie im [//meta.wikimedia.org/wiki/Help:Contents Benutzerhandbuch].\n\n== Starthilfen ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Liste der Konfigurationsvariablen]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki-FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Lokalisieren Sie MediaWiki für Ihre Sprache]"
 }
index 8f160d6..837cc0f 100644 (file)
@@ -12,7 +12,8 @@
                        "Wikinaut",
                        "아라",
                        "Se4598",
-                       "Suriyaa Kudo"
+                       "Suriyaa Kudo",
+                       "Das Schäfchen"
                ]
        },
        "config-desc": "Das MediaWiki-Installationsprogramm",
        "config-restart": "Ja, erneut starten",
        "config-welcome": "=== Prüfung der Installationsumgebung ===\nDie Basisprüfungen werden jetzt durchgeführt, um festzustellen, ob die Installationsumgebung für MediaWiki geeignet ist.\nNotiere diese Informationen und gib sie an, sofern du Hilfe beim Installieren benötigst.",
        "config-copyright": "=== Lizenz und Nutzungsbedingungen ===\n\n$1\n\nDieses Programm ist freie Software, d. h. es kann, gemäß den Bedingungen der von der Free Software Foundation veröffentlichten ''GNU General Public License'', weiterverteilt und/oder modifiziert werden. Dabei kann die Version 2, oder nach eigenem Ermessen, jede neuere Version der Lizenz verwendet werden.\n\nDieses Programm wird in der Hoffnung verteilt, dass es nützlich sein wird, allerdings '''ohne jegliche Garantie''' und sogar ohne die implizierte Garantie einer '''Marktgängigkeit''' oder '''Eignung für einen bestimmten Zweck'''. Hierzu sind weitere Hinweise in der ''GNU General Public License'' enthalten.\n\nEine <doclink href=Copying>Kopie der GNU General Public License</doclink> sollte zusammen mit diesem Programm verteilt worden sein. Sofern dies nicht der Fall war, kann eine Kopie bei der Free Software Foundation Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, schriftlich angefordert oder auf deren Website [http://www.gnu.org/copyleft/gpl.html online gelesen] werden.",
-       "config-sidebar": "* [//www.mediawiki.org/wiki/MediaWiki/de Website von MediaWiki]\n* [//www.mediawiki.org/wiki/Help:Contents/de Benutzeranleitung]\n* [//www.mediawiki.org/wiki/Manual:Contents/de Administratorenanleitung]\n* [//www.mediawiki.org/wiki/Manual:FAQ/de Häufig gestellte Fragen]\n----\n* <doclink href=Readme>Lies mich</doclink>\n* <doclink href=ReleaseNotes>Versionsinformationen</doclink>\n* <doclink href=Copying>Lizenzbestimmungen</doclink>\n* <doclink href=UpgradeDoc>Aktualisierung</doclink>",
+       "config-sidebar": "* [//www.mediawiki.org/wiki/MediaWiki/de Website von MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents/de Benutzeranleitung]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents/de Administratorenanleitung]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/de Häufig gestellte Fragen]\n----\n* <doclink href=Readme>Lies mich</doclink>\n* <doclink href=ReleaseNotes>Versionsinformationen</doclink>\n* <doclink href=Copying>Lizenzbestimmungen</doclink>\n* <doclink href=UpgradeDoc>Aktualisierung</doclink>",
        "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-php-toolow": "PHP $1 ist installiert.\nAllerdings benötigt MediaWiki PHP $2 oder höher.",
        "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/Unicode_normalization_considerations Unicode-Normalisierung (en)] gelesen werden.",
-       "config-unicode-update-warning": "'''Warnung:''' Die installierte Version des Unicode-Normalisierungswrappers nutzt einer ältere Version der Bibliothek des [http://site.icu-project.org/ ICU-Projekts].\nDiese sollte [//www.mediawiki.org/wiki/Unicode_normalization_considerations aktualisiert] werden, sofern auf die Verwendung von Unicode Wert gelegt wird.",
+       "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-unicode-update-warning": "'''Warnung:''' Die installierte Version des Unicode-Normalisierungswrappers nutzt einer ältere Version der Bibliothek des [http://site.icu-project.org/ ICU-Projekts].\nDiese sollte [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations aktualisiert] werden, sofern auf die Verwendung von Unicode Wert gelegt wird.",
        "config-no-db": "Es konnte kein adäquater Datenbanktreiber gefunden werden. Es muss daher ein Datenbanktreiber für PHP installiert werden.\nDie folgenden Datenbanksysteme werden unterstützt: $1\n\nWenn du PHP selbst kompiliert hast, konfiguriere es erneut mit einem aktivierten Datenbankclient, zum Beispiel durch Verwendung von <code>./configure --with-mysqli</code>.\nWenn du PHP von einem Debian- oder Ubuntu-Paket installiert hast, dann musst du auch beispielsweise das <code>php5-mysql</code>-Paket installieren.",
        "config-outdated-sqlite": "'''Warnung:''' SQLite $1 ist installiert. Allerdings benötigt MediaWiki SQLite $2 oder höher. SQLite wird daher nicht verfügbar sein.",
-       "config-no-fts3": "'''Warnung:''' SQLite wurde ohne das [//sqlite.org/fts3.html FTS3-Modul] kompiliert, so dass keine Suchfunktionen für dieses Datenbanksystem zur Verfügung stehen werden.",
+       "config-no-fts3": "'''Warnung:''' SQLite wurde ohne das [//sqlite.org/fts3.html FTS3-Modul] kompiliert, sodass keine Suchfunktionen für dieses Datenbanksystem zur Verfügung stehen werden.",
        "config-register-globals": "'''Warnung: Der Parameter <code>[http://php.net/register_globals register_globals]</code> von PHP ist aktiviert.'''\n'''Sie sollte deaktiviert werden, sofern dies möglich ist.'''\nDie MediaWiki-Installation wird zwar laufen, wobei aber der Server für potentielle Sicherheitsprobleme anfällig ist.",
        "config-magic-quotes-runtime": "'''Fataler Fehler: Der Parameter <code>[http://www.php.net/manual/de/function.set-magic-quotes-runtime.php set_magic_quotes_runtime]</code> von PHP ist aktiviert!'''\nDiese Einstellung führt zu unvorhersehbaren Problemen bei der Dateneingabe.\nMediaWiki kann nicht installiert werden, solange dieser Parameter nicht deaktiviert wurde.",
        "config-magic-quotes-sybase": "<strong>Fataler Fehler: Der Parameter <code>[http://www.php.net/manual/de/sybase.configuration.php#ini.magic-quotes-sybase magic_quotes_sybase]</code> von PHP ist aktiviert!</strong>\nDiese Einstellung führt zu unvorhersehbaren Problemen bei der Dateneingabe.\nMediaWiki kann nicht installiert werden, solange dieser Parameter nicht deaktiviert wurde.",
        "config-pcre-old": "<strong>Fataler Fehler:</strong> PCRE $1 oder neuer ist erforderlich!\nDie vorhandene PHP-Binärdatei ist mit PCRE $2 verknüpft.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Weitere Informationen].",
        "config-pcre-no-utf8": "'''Fataler Fehler:''' Das PHP-Modul PCRE scheint ohne PCRE_UTF8-Unterstützung kompiliert worden zu sein.\nMediaWiki benötigt die UTF-8-Unterstützung, um fehlerfrei lauffähig zu sein.",
        "config-memory-raised": "Der PHP-Parameter <code>memory_limit</code> betrug $1 und wurde auf $2 erhöht.",
-       "config-memory-bad": "'''Warnung:''' Der PHP-Parameter <code>memory_limit</code> beträgt $1.\nDieser Wert ist wahrscheinlich zu niedrig.\nDer Installationsvorgang könnte daher scheitern!",
+       "config-memory-bad": "'''Warnung:''' Der PHP-Parameter <code>memory_limit</code> beträgt $1.\nDieser Wert ist wahrscheinlich zu niedrig.\nDer Installationsvorgang könnte eventuell scheitern!",
        "config-ctype": "'''Fataler Fehler:''' PHP muss mit Unterstützung für das [http://www.php.net/manual/de/ctype.installation.php Modul ctype] kompiliert werden.",
        "config-json": "<strong>Fataler Fehler:</strong> PHP wurde ohne Unterstützung für JSON kompiliert.\nVor der Installation von MediaWiki muss entweder die PHP-JSON- oder die [http://pecl.php.net/package/jsonc PECL-jsonc]-Erweiterung installieren werden.\n* Die PHP-Erweiterung ist in Red Hat Enterprise Linux (CentOS) 5 und 6 enthalten, muss jedoch in <code>/etc/php.ini</code> oder <code>/etc/php.d/json.ini</code> aktiviert werden.\n* Einige Linux-Distributionen, die nach Mai 2013 veröffentlicht wurden, nutzen nicht mehr die PHP-Erweiterung, sondern stattdessen die PECL-Erweiterung als <code>php5-json</code> oder <code>php-pecl-jsonc</code>.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] ist installiert",
        "config-apc": "[http://www.php.net/apc APC] ist installiert",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] ist installiert",
        "config-no-cache": "'''Warnung:''' [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] oder [http://www.iis.net/download/WinCacheForPhp WinCache] wurden nicht gefunden.\nDas Objektcaching kann daher nicht aktiviert werden.",
-       "config-mod-security": "'''Warnung:''' Auf dem Webserver wurde [http://modsecurity.org/ ModSecurity] aktiviert. Sofern falsch konfiguriert, kann dies zu Problemen mit MediaWiki sowie anderer Software auf dem Server führen und es Benutzern ermöglichen beliebige Inhalte im Wiki einzustellen.\nFür weitere Informationen empfehlen wir die [http://modsecurity.org/documentation/ Dokumentation zu ModSecurity] oder den Kontakt zum Hoster, sofern Fehler auftreten.",
+       "config-mod-security": "'''Warnung:''' Auf dem Webserver wurde [http://modsecurity.org/ ModSecurity] aktiviert. Sofern falsch konfiguriert, kann dies zu Problemen mit MediaWiki sowie anderer Software auf dem Server führen und es Benutzern ermöglichen, beliebige Inhalte im Wiki einzustellen.\nFür weitere Informationen empfehlen wir die [http://modsecurity.org/documentation/ Dokumentation zu ModSecurity] oder den Kontakt zum Hoster, sofern Fehler auftreten.",
        "config-diff3-bad": "GNU diff3 wurde nicht gefunden.",
        "config-git": "Die Versionsverwaltungssoftware „Git“ wurde gefunden: <code>$1</code>.",
        "config-git-bad": "Die Versionsverwaltungssoftware „Git“ wurde nicht gefunden.",
        "config-no-cli-uri": "'''Warnung''': Es wurde kein Pfad zum Skipt (<code>--scriptpath</code>) angegeben. Daher wird der Standardpfad genutzt: <code>$1</code>.",
        "config-using-server": "Der Servername „<nowiki>$1</nowiki>“ wird verwendet.",
        "config-using-uri": "Die Server-URL „<nowiki>$1$2</nowiki>“ wird verwendet.",
-       "config-uploads-not-safe": "'''Warnung:''' Das Standardverzeichnis für hochgeladene Dateien <code>$1</code> ist für die willkürliche Ausführung von Skripten anfällig.\nObwohl MediaWiki die hochgeladenen Dateien auf Sicherheitsrisiken überprüft, wird dennoch dringend empfohlen diese [//www.mediawiki.org/wiki/Manual:Security#Upload_security Sicherheitslücke] zu schließen, bevor das Hochladen von Dateien aktiviert wird.",
+       "config-uploads-not-safe": "'''Warnung:''' Das Standardverzeichnis für hochgeladene Dateien <code>$1</code> ist für die willkürliche Ausführung von Skripten anfällig.\nObwohl MediaWiki die hochgeladenen Dateien auf Sicherheitsrisiken überprüft, wird dennoch dringend empfohlen, diese [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security Sicherheitslücke] zu schließen, bevor das Hochladen von Dateien aktiviert wird.",
        "config-no-cli-uploads-check": "'''Warnung''': Das Standardverzeichnis für hochgeladene Dateien (<code>$1</code>) wird, während der Installation über die Kommandozeile, nicht auf Sicherheitsanfälligkeiten hinsichtlich willkürlicher Skriptausführungen geprüft.",
        "config-brokenlibxml": "Das System nutzt eine Kombination aus PHP- und libxml2-Versionen, die fehleranfällig ist und versteckte Datenfehler bei MediaWiki und anderen Webanwendungen verursachen kann.\nAktualisiere auf libxml2 2.7.3 oder später, um das Problem zu lösen. Installationsabbruch ([https://bugs.php.net/bug.php?id=45996 siehe hierzu die Fehlermeldung bei PHP]).",
-       "config-suhosin-max-value-length": "Suhosin ist installiert und beschränkt die Länge des GET-Parameters auf $1 Bytes.\nDer ResouceLoader von MediaWiki wird zwar unter diesen Bedingungen funktionieren, allerdings nur mit verminderter Leistungsfähigkeit.\nSofern möglich sollte der Parameter <code>suhosin.get.max_value_length</code> in der Datei <code>php.ini</code> auf 1024 oder höher festgelegt werden.\nGleichzeitig muss der Parameter <code>$wgResourceLoaderMaxQueryLength</code> in der Datei <code>LocalSettings.php</code> auf den selben Wert eingestellt werden.",
+       "config-suhosin-max-value-length": "Suhosin ist installiert und beschränkt die Länge des GET-Parameters auf $1 Bytes.\nDer ResouceLoader von MediaWiki wird zwar unter diesen Bedingungen funktionieren, allerdings nur mit verminderter Leistungsfähigkeit.\nSofern möglich, sollte der Parameter <code>suhosin.get.max_value_length</code> in der Datei <code>php.ini</code> auf 1024 oder höher festgelegt werden.\nGleichzeitig muss der Parameter <code>$wgResourceLoaderMaxQueryLength</code> in der Datei <code>LocalSettings.php</code> auf den selben Wert eingestellt werden.",
        "config-db-type": "Datenbanksystem:",
        "config-db-host": "Datenbankserver:",
        "config-db-host-help": "Sofern sich die Datenbank auf einem anderen Server befindet, ist hier der Servername oder die entsprechende IP-Adresse anzugeben.\n\nSofern ein gemeinschaftlich genutzter Server verwendet wird, sollte der Hoster den zutreffenden Servernamen in seiner Dokumentation angegeben haben.\n\nSofern auf einem Windows-Server installiert und MySQL genutzt wird, funktioniert der Servername „localhost“ voraussichtlich nicht. Wenn nicht, sollte  „127.0.0.1“ oder die lokale IP-Adresse angegeben werden.\n\nSofern PostgresQL genutzt wird, muss dieses Feld leer gelassen werden, um über ein Unix-Socket zu verbinden.",
        "config-db-name": "Datenbankname:",
        "config-db-name-help": "Bitte einen Namen angeben, mit dem das Wiki identifiziert werden kann.\nDabei sollten keine Leerzeichen verwendet werden.\n\nSofern ein gemeinschaftlich genutzter Server verwendet wird, sollte der Hoster den Datenbanknamen angegeben oder aber die Erstellung einer Datenbank über ein entsprechendes Interface gestattet haben.",
        "config-db-name-oracle": "Datenbankschema:",
-       "config-db-account-oracle-warn": "Es gibt drei von MediaWiki unterstützte Möglichkeiten Oracle als Datenbank einzurichten:\n\nSofern das Datenbankbenutzerkonto während des Installationsvorgangs erstellt werden soll, muss ein Datenbankbenutzerkonto mit der SYSDBA-Berechtigung zusammen mit den entsprechenden Anmeldeinformationen angegeben werden, mit dem dann über das Web auf die Datenbank zugegriffen werden kann. Alternativ kann man auch lediglich ein einzelnes manuell angelegtes Datenbankbenutzerkonto angeben, mit dem über das Web auf die Datenbank zugegriffen werden kann, sofern dieses über die Berechtigung zur Erstellung von Datenbankschemen verfügt. Zudem ist es möglich zwei Datenbankbenutzerkonten anzugeben von denen eines die Berechtigung zur Erstellung von Datenbankschemen hat und das andere, um mit ihm über das Web auf die Datenbank zuzugreifen.\n\nEin Skript zum Anlegen eines Datenbankbenutzerkontos mit den notwendigen Berechtigungen findet man unter dem Pfad „…/maintenance/oracle/“ dieser MediaWiki-Installation. Es ist dabei zu bedenken, dass die Verwendung eines Datenbankbenutzerkontos mit beschränkten Berechtigungen die Nutzung der Wartungsfunktionen für das Standarddatenbankbenutzerkonto deaktiviert.",
+       "config-db-account-oracle-warn": "Es gibt drei von MediaWiki unterstützte Möglichkeiten, Oracle als Datenbank einzurichten:\n\nSofern das Datenbankbenutzerkonto während des Installationsvorgangs erstellt werden soll, muss ein Datenbankbenutzerkonto mit der SYSDBA-Berechtigung zusammen mit den entsprechenden Anmeldeinformationen angegeben werden, mit dem dann über das Web auf die Datenbank zugegriffen werden kann. Alternativ kann man auch lediglich ein einzelnes manuell angelegtes Datenbankbenutzerkonto angeben, mit dem über das Web auf die Datenbank zugegriffen werden kann, sofern dieses über die Berechtigung zur Erstellung von Datenbankschemen verfügt. Zudem ist es möglich, zwei Datenbankbenutzerkonten anzugeben, von denen eines die Berechtigung zur Erstellung von Datenbankschemen hat und das andere, um mit ihm über das Web auf die Datenbank zuzugreifen.\n\nEin Skript zum Anlegen eines Datenbankbenutzerkontos mit den notwendigen Berechtigungen findet man unter dem Pfad „…/maintenance/oracle/“ dieser MediaWiki-Installation. Es ist dabei zu bedenken, dass die Verwendung eines Datenbankbenutzerkontos mit beschränkten Berechtigungen die Nutzung der Wartungsfunktionen für das Standarddatenbankbenutzerkonto deaktiviert.",
        "config-db-install-account": "Benutzerkonto für die Installation",
        "config-db-username": "Name des Datenbankbenutzers:",
        "config-db-password": "Passwort des Datenbankbenutzers:",
-       "config-db-password-empty": "Bitte ein Passwort für den neuen Datenbankbenutzer angeben: $1\nObzwar es möglich ist Datenbankbenutzer ohne Passwort anzulegen, so ist dies aber nicht sicher.",
+       "config-db-password-empty": "Bitte ein Passwort für den neuen Datenbankbenutzer angeben: $1\nObzwar es möglich ist, Datenbankbenutzer ohne Passwort anzulegen, so ist dies aber nicht sicher.",
        "config-db-username-empty": "Du musst einen Wert für „{{int:config-db-username}}“ eingeben",
        "config-db-install-username": "Den Benutzernamen angeben, der für die Verbindung mit der Datenbank während des Installationsvorgangs genutzt werden soll. Es handelt sich dabei nicht um den Benutzernamen für das MediaWiki-Konto, sondern um den Benutzernamen der vorgesehenen Datenbank.",
        "config-db-install-password": "Das Passwort angeben, das für die Verbindung mit der Datenbank während des Installationsvorgangs genutzt werden soll. Es handelt sich dabei nicht um das Passwort für das MediaWiki-Konto, sondern um das Passwort der vorgesehenen Datenbank.",
        "config-db-wiki-account": "Benutzerkonto für den normalen Betrieb",
        "config-db-wiki-help": "Bitte Benutzernamen und Passwort angeben, die der Webserver während des Normalbetriebes dazu verwenden soll, eine Verbindung zum Datenbankserver herzustellen.\nSofern ein entsprechendes Benutzerkonto nicht vorhanden ist und das Benutzerkonto für den Installationsvorgang über ausreichende Berechtigungen verfügt, wird dieses Benutzerkonto automatisch mit den Mindestberechtigungen zum Normalbetrieb des Wikis angelegt.",
        "config-db-prefix": "Datenbanktabellenpräfix:",
-       "config-db-prefix-help": "Sofern eine Datenbank für mehrere Wikiinstallationen oder eine Wikiinstallation und eine andere Programminstallation genutzt werden soll, muss ein Datenbanktabellenpräfix angegeben werden, um Datenbankprobleme zu vermeiden.\nEs können keine Leerzeichen verwendet werden.\n\nGewöhnlich bleibt dieses Datenfeld leer.",
+       "config-db-prefix-help": "Sofern eine Datenbank für mehrere Wikiinstallationen oder eine Wikiinstallation und eine andere Programminstallation genutzt werden soll, muss ein Datenbanktabellenpräfix angegeben werden, um Datenbankprobleme zu vermeiden.\nEs können keine Leerzeichen verwendet werden.\n\nGewöhnlich bleibt dieses Feld leer.",
        "config-db-charset": "Datenbankzeichensatz",
        "config-charset-mysql5-binary": "MySQL 4.1/5.0 binär",
        "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
        "config-profile-no-anon": "Erstellung eines Benutzerkontos erforderlich",
        "config-profile-fishbowl": "ausschließlich berechtigte Bearbeiter",
        "config-profile-private": "geschlossenes Wiki",
-       "config-profile-help": "Wikis sind am nützlichsten, wenn so viele Menschen als möglich Bearbeitungen vornehmen können.\nMit MediaWiki ist es einfach die letzten Änderungen nachzuvollziehen und unbrauchbare Bearbeitungen, beispielsweise von unbedarften oder böswilligen Benutzern, rückgängig zu machen.\n\nAllerdings finden etliche Menschen Wikis auch mit anderen Bearbeitungskonzepten sinnvoll. Manchmal ist es zudem nicht einfach alle Beteiligten von den Vorteilen des „Wiki-Prinzips” zu überzeugen. Darum ist diese Auswahl möglich.\n\nDas Modell „'''{{int:config-profile-wiki}}'''“ ermöglicht es jedermann, sogar ohne über ein Benutzerkonto zu verfügen, Bearbeitungen vorzunehmen.\nEin Wiki bei dem die '''{{int:config-profile-no-anon}}''' ist, fordert von den Benutzern eine höhere Verantwortung für ihre Bearbeitungen ein, könnte allerdings Personen abschrecken, die nur gelegentlich Bearbeitungen vornehmen wollen. Ein Wiki für '''{{int:config-profile-fishbowl}}''' gestattet es nur bestimmten Benutzern, Bearbeitungen vorzunehmen. Allerdings kann dabei die Allgemeinheit die Seiten immer noch betrachten und Änderungen nachvollziehen. Ein '''{{int:config-profile-private}}''' gestattet es nur ausgewählten Benutzern, Seiten zu betrachten sowie zu bearbeiten.\n\nKomplexere Konzepte zur Zugriffssteuerung können erst nach abgeschlossenem Installationsvorgang eingerichtet werden. Hierzu gibt es weitere Informationen auf der Website mit der [//www.mediawiki.org/wiki/Manual:User_rights entsprechenden Anleitung].",
+       "config-profile-help": "Wikis sind am nützlichsten, wenn so viele Menschen als möglich Bearbeitungen vornehmen können.\nMit MediaWiki ist es einfach die letzten Änderungen nachzuvollziehen und unbrauchbare Bearbeitungen, beispielsweise von unbedarften oder böswilligen Benutzern, rückgängig zu machen.\n\nAllerdings finden etliche Menschen Wikis auch mit anderen Bearbeitungskonzepten sinnvoll. Manchmal ist es zudem nicht einfach alle Beteiligten von den Vorteilen des „Wiki-Prinzips” zu überzeugen. Darum ist diese Auswahl möglich.\n\nDas Modell „'''{{int:config-profile-wiki}}'''“ ermöglicht es jedermann, sogar ohne über ein Benutzerkonto zu verfügen, Bearbeitungen vorzunehmen.\nEin Wiki bei dem die '''{{int:config-profile-no-anon}}''' ist, fordert von den Benutzern eine höhere Verantwortung für ihre Bearbeitungen ein, könnte allerdings Personen abschrecken, die nur gelegentlich Bearbeitungen vornehmen wollen. Ein Wiki für '''{{int:config-profile-fishbowl}}''' gestattet es nur bestimmten Benutzern, Bearbeitungen vorzunehmen. Allerdings kann dabei die Allgemeinheit die Seiten immer noch betrachten und Änderungen nachvollziehen. Ein '''{{int:config-profile-private}}''' gestattet es nur ausgewählten Benutzern, Seiten zu betrachten sowie zu bearbeiten.\n\nKomplexere Konzepte zur Zugriffssteuerung können erst nach abgeschlossenem Installationsvorgang eingerichtet werden. Hierzu gibt es weitere Informationen auf der Website mit der [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights entsprechenden Anleitung].",
        "config-license": "Lizenz:",
        "config-license-none": "Keine Lizenzangabe in der Fußzeile",
        "config-license-cc-by-sa": "''Creative Commons'' „Namensnennung – Weitergabe unter gleichen Bedingungen“",
        "config-email-sender-help": "Bitte hier die E-Mail-Adresse angeben, die als Absenderadresse bei ausgehenden E-Mails eingesetzt werden soll.\nRücklaufende E-Mails werden an diese E-Mail-Adresse gesandt.\nBei vielen E-Mail-Servern muss der Teil der E-Mail-Adresse mit der Domainangabe korrekt sein.",
        "config-upload-settings": "Hochladen von Bildern und Dateien",
        "config-upload-enable": "Das Hochladen von Dateien ermöglichen",
-       "config-upload-help": "Das Hochladen von Dateien macht den Server für potentielle Sicherheitsprobleme anfällig.\nWeitere Informationen hierzu können im [//www.mediawiki.org/wiki/Manual:Security Abschnitt Sicherheit] der Anleitung nachgelesen werden.\n\nUm das Hochladen von Dateien zu ermöglichen, muss der Zugriff auf das Unterverzeichnis <code>./images</code> so geändert werden, das dieses für den Webserver beschreibbar ist.\nHernach kann diese Option aktiviert werden.",
+       "config-upload-help": "Das Hochladen von Dateien macht den Server für potentielle Sicherheitsprobleme anfällig.\nWeitere Informationen hierzu können im [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security Abschnitt Sicherheit] der Anleitung nachgelesen werden.\n\nUm das Hochladen von Dateien zu ermöglichen, muss der Zugriff auf das Unterverzeichnis <code>./images</code> so geändert werden, das dieses für den Webserver beschreibbar ist.\nHernach kann diese Option aktiviert werden.",
        "config-upload-deleted": "Verzeichnis für gelöschte Dateien:",
        "config-upload-deleted-help": "Bitte ein Verzeichnis auswählen, in dem gelöschte Dateien archiviert werden sollen.\nIdealerweise sollte es nicht über das Internet zugänglich sein.",
        "config-logo": "URL des Logos:",
        "config-logo-help": "Die Standardoberfläche von MediaWiki verfügt links oberhalb der Seitenleiste über Platz für ein Logo mit den Maßen 135x160 Pixel.\nBitte ein Logo in entsprechender Größe hochladen und die zugehörige URL an dieser Stelle angeben.\n\nDu kannst <code>$wgStylePath</code> oder <code>$wgScriptPath</code> verwenden, falls dein Logo relativ zu diesen Pfaden ist.\n\nSofern kein Logo benötigt wird, kann dieses Datenfeld leer bleiben.",
        "config-instantcommons": "„InstantCommons“ aktivieren",
-       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons InstantCommons] ist eine Funktion, die es Wikis ermöglicht, Bild-, Klang- und andere Mediendateien zu nutzen, die auf der Website [//commons.wikimedia.org/ Wikimedia Commons] verfügbar sind.\nUm diese Funktion nutzen zu können, muss das Wiki über eine Verbindung zum Internet verfügen.\n\nWeitere Informationen zu dieser Funktion, einschließlich der Anleitung, wie hierfür andere Wikis als Wikimedia Commons eingerichtet werden können, gibt es im [//mediawiki.org/wiki/Manual:$wgForeignFileRepos Handbuch].",
+       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons InstantCommons] ist eine Funktion, die es Wikis ermöglicht, Bild-, Klang- und andere Mediendateien zu nutzen, die auf der Website [//commons.wikimedia.org/ Wikimedia Commons] verfügbar sind.\nUm diese Funktion nutzen zu können, muss das Wiki über eine Verbindung zum Internet verfügen.\n\nWeitere Informationen zu dieser Funktion, einschließlich der Anleitung, wie hierfür andere Wikis als Wikimedia Commons eingerichtet werden können, gibt es im [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos Handbuch].",
        "config-cc-error": "Der Creativ-Commons-Lizenzassistent konnte keine Lizenz ermitteln.\nDie Lizenz ist daher jetzt manuell einzugeben.",
        "config-cc-again": "Erneut auswählen …",
        "config-cc-not-chosen": "Die gewünschte Creative-Commons-Lizenz auswählen und dann auf „weiter“ klicken.",
        "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-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-accel": "Objektcaching von PHP (APC, XCache oder WinCache)",
        "config-cache-memcached": "Memcached Cacheserver nutzen (erfordert einen zusätzlichen Installationsvorgang mitsamt Konfiguration)",
        "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-sysop": "Administratorkonto wird erstellt",
        "config-install-subscribe-fail": "Abonnieren von „mediawiki-announce“ ist gescheitert: $1",
-       "config-install-subscribe-notpossible": "cURL ist nicht installiert und allow_url_fopen ist nicht verfügbar.",
+       "config-install-subscribe-notpossible": "cURL ist nicht installiert und <code>allow_url_fopen</code> ist nicht verfügbar.",
        "config-install-mainpage": "Erstellung der Hauptseite mit Standardinhalten",
        "config-install-extension-tables": "Erstellung der Tabellen für die aktivierten Erweiterungen",
        "config-install-mainpage-failed": "Die Hauptseite konnte nicht erstellt werden: $1",
        "config-install-done": "'''Herzlichen Glückwunsch!'''\nMediaWiki wurde erfolgreich installiert.\n\nDas Installationsprogramm hat die Datei <code>LocalSettings.php</code> erzeugt.\nSie enthält alle vorgenommenen Konfigurationseinstellungen.\n\nDiese Datei muss nun heruntergeladen und anschließend in das Stammverzeichnis der MediaWiki-Installation hochgeladen werden. Dies ist dasselbe Verzeichnis, in dem sich auch die Datei <code>index.php</code> befindet. Das Herunterladen sollte inzwischen automatisch gestartet worden sein.\n\nSofern dies nicht der Fall war, oder das Herunterladen unterbrochen wurde, kann der Vorgang durch einen Klick auf den folgenden Link erneut gestartet werden:\n\n$3\n\n'''Hinweis:''' Die Konfigurationsdatei sollte jetzt unbedingt heruntergeladen werden. Sie wird nach Beenden des Installationsprogramms, nicht mehr zur Verfügung stehen.\n\nSobald alles erledigt wurde, kann auf das '''[$2 Wiki zugegriffen werden]'''. Wir wünschen viel Spaß und Erfolg mit dem Wiki.",
        "config-download-localsettings": "<code>LocalSettings.php</code> herunterladen",
        "config-help": "Hilfe",
+       "config-help-tooltip": "Zum Expandieren klicken",
        "config-nofile": "Die Datei „$1“ konnte nicht gefunden werden. Wurde sie gelöscht?",
-       "config-extension-link": "Wusstest du, dass dein Wiki die Nutzung von [//www.mediawiki.org/wiki/Manual:Extensions Erweiterungen] unterstützt?\n\nDu kannst [//www.mediawiki.org/wiki/Category:Extensions_by_category Erweiterungen nach Kategorie] durchsuchen oder die [//www.mediawiki.org/wiki/Extension_Matrix Matrix der Erweiterungen] ansehen, um eine Übersicht zu verfügbaren Erweiterungen zu erhalten.",
+       "config-extension-link": "Wusstest du, dass dein Wiki die Nutzung von [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions Erweiterungen] unterstützt?\n\nDu kannst [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category Erweiterungen nach Kategorie] durchsuchen.",
        "mainpagetext": "'''MediaWiki wurde erfolgreich installiert.'''",
-       "mainpagedocfooter": "Hilfe zur Benutzung und Konfiguration der Wiki-Software findest du im [//meta.wikimedia.org/wiki/Help:Contents Benutzerhandbuch].\n\n== Starthilfen ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Liste der Konfigurationsvariablen]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki-FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Lokalisiere MediaWiki für deine Sprache]"
+       "mainpagedocfooter": "Hilfe zur Benutzung und Konfiguration der Wiki-Software findest du im [//meta.wikimedia.org/wiki/Help:Contents Benutzerhandbuch].\n\n== Starthilfen ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Liste der Konfigurationsvariablen]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki-FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Lokalisiere MediaWiki für deine Sprache]"
 }
index b2d8ce4..843fe2f 100644 (file)
@@ -25,7 +25,7 @@
        "config-page-copying": "Kopyayeno",
        "config-page-upgradedoc": "Berzkerdış",
        "config-restart": "E, fına dest pekê",
-       "config-sidebar": "* [//www.mediawiki.org MediaWiki keye]\n* [//www.mediawiki.org/wiki/Help:Contents User's Şınasiye]\n* [//www.mediawiki.org/wiki/Manual:Contents Xizmetkara şınasiye]\n* [//www.mediawiki.org/wiki/Manual:FAQ Peşti]\n----\n* <doclink href=Readme>Mı buwanê</doclink>\n* <doclink href=ReleaseNotes>Notê elekeyıni</doclink>\n* <doclink href=Copying>Telifiye</doclink>\n* <doclink href=UpgradeDoc>Weşkerdış</doclink>",
+       "config-sidebar": "* [//www.mediawiki.org MediaWiki keye]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Şınasiya Karberi]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Şınasiya İdarekaran]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Peşti]\n----\n* <doclink href=Readme>Mı buwanê</doclink>\n* <doclink href=ReleaseNotes>Notê elaqeyıni</doclink>\n* <doclink href=Copying>Kopyakerdış</doclink>\n* <doclink href=UpgradeDoc>Zêdekerdış</doclink>",
        "config-env-php": "PHP $1 i biyo saz.",
        "config-charset-mysql5-binary": "MySQL 4.1/5.0 dılet",
        "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
@@ -63,5 +63,5 @@
        "config-install-tables": "Tabloy dek",
        "config-help": "peşti",
        "mainpagetext": "'''MediaWiki vıst ra ser, vıraziya.'''",
-       "mainpagedocfooter": "Qandé ğebtiyayışi u sazkerdeışi Wiki-Softwarey [//meta.wikimedia.org/wiki/Help:Contents İdarê karberi] de mıracaet ke.\n\n== Destega sergendi ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista eyaranê vıraştışi]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki de ÇZP]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki ra lista serbest-dayışê postey]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Zıwandé şıma de Lokal MediaWiki]"
+       "mainpagedocfooter": "Qandé ğebtiyayışi u sazkerdeışi Wiki-Softwarey [//meta.wikimedia.org/wiki/Help:Contents İdarê karberi] de mıracaet ke.\n\n== Destega sergendi ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista eyaranê vıraştışi]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki de ÇZP]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki ra lista serbest-dayışê postey]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Zıwandé şıma de Lokal MediaWiki]"
 }
index 14cac7c..0b2e1a8 100644 (file)
@@ -5,5 +5,5 @@
                ]
        },
        "mainpagetext": "'''MediaWiki jo se wuspěšnje instalěrowało.'''",
-       "mainpagedocfooter": "Pomoc pśi wužywanju softwary wiki namakajoš pód [//meta.wikimedia.org/wiki/Help:Contents User's Guide].\n\nPomoc pśi wužywanju softwary wiki namakajoš pód [//meta.wikimedia.org/wiki/Help:Contents User's Guide].\n\n== Na zachopjenje ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Konfiguracija lisćiny połoženjow]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ (pšašanja a wótegrona)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lisćina e-mailowych nakładow MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources MediaWiki za twóju rěc lokalizěrowaś]"
+       "mainpagedocfooter": "Pomoc pśi wužywanju softwary wiki namakajoš pód [//meta.wikimedia.org/wiki/Help:Contents User's Guide].\n\nPomoc pśi wužywanju softwary wiki namakajoš pód [//meta.wikimedia.org/wiki/Help:Contents User's Guide].\n\n== Na zachopjenje ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Konfiguracija lisćiny połoženjow]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ (pšašanja a wótegrona)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lisćina e-mailowych nakładow MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources MediaWiki za twóju rěc lokalizěrowaś]"
 }
index b93ab1b..da75bd6 100644 (file)
@@ -5,5 +5,5 @@
                ]
        },
        "mainpagetext": "'''Nopongo no do popodokot ot ModiaWiki.'''",
-       "mainpagedocfooter": "Rujuko hilo [//meta.wikimedia.org/wiki/Help:Contents Ponudukan Momomoguno] kokomoi koilaan do momoguno posusuang-suangon wiki.\n\n== Kopotimpuunan ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lis papatantu nuludan]\n* [//www.mediawiki.org/wiki/Manual:FAQ Ponguhatan Koinsoruan om Simbar ModiaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lis pininsuratan pinolabus do ModiaWiki]"
+       "mainpagedocfooter": "Rujuko hilo [//meta.wikimedia.org/wiki/Help:Contents Ponudukan Momomoguno] kokomoi koilaan do momoguno posusuang-suangon wiki.\n\n== Kopotimpuunan ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lis papatantu nuludan]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Ponguhatan Koinsoruan om Simbar ModiaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lis pininsuratan pinolabus do ModiaWiki]"
 }
index 9fe36fe..7d782d5 100644 (file)
@@ -7,8 +7,8 @@
        "config-copyright": "=== Copyright and Terms ===\n\n$1\n\nThis program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public Licence as published by the Free Software Foundation; either version 2 of the Licence, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but '''without any warranty'''; without even the implied warranty of '''merchantability''' or '''fitness for a particular purpose'''.\nSee the GNU General Public Licence for more details.\n\nYou should have received <doclink href=Copying>a copy of the GNU General Public Licence</doclink> along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. or [http://www.gnu.org/copyleft/gpl.html read it online].",
        "config-unicode-using-utf8": "Using Brion Vibber's utf8_normalize.so for Unicode normalisation.",
        "config-unicode-using-intl": "Using the [http://pecl.php.net/intl intl PECL extension] for Unicode normalisation.",
-       "config-unicode-pure-php-warning": "'''Warning:''' The [http://pecl.php.net/intl intl PECL extension] is not available to handle Unicode normalisation, falling back to slow pure-PHP implementation.\nIf you run a high-traffic site, you should read a little on [//www.mediawiki.org/wiki/Unicode_normalization_considerations Unicode normalisation].",
-       "config-unicode-update-warning": "'''Warning:''' The installed version of the Unicode normalisation wrapper uses an older version of [http://site.icu-project.org/ the ICU project's] library.\nYou should [//www.mediawiki.org/wiki/Unicode_normalization_considerations upgrade] if you are at all concerned about using Unicode.",
+       "config-unicode-pure-php-warning": "'''Warning:''' The [http://pecl.php.net/intl intl PECL extension] is not available to handle Unicode normalisation, 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 normalisation].",
+       "config-unicode-update-warning": "'''Warning:''' The installed version of the Unicode normalisation wrapper uses an older version of [http://site.icu-project.org/ the ICU project's] library.\nYou should [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations upgrade] if you are at all concerned about using Unicode.",
        "config-unknown-collation": "'''Warning:''' Database is using unrecognised collation.",
        "config-profile-fishbowl": "Authorised editors only",
        "config-license": "Copyright and licence:",
index de27766..b19bdc0 100644 (file)
 {
-    "@metadata": {
-        "authors": []
-    },
-    "config-desc": "The installer for MediaWiki",
-    "config-title": "MediaWiki $1 installation",
-    "config-information": "Information",
-    "config-localsettings-upgrade": "A <code>LocalSettings.php</code> file has been detected.\nTo upgrade this installation, please enter the value of <code>$wgUpgradeKey</code> in the box below.\nYou will find it in <code>LocalSettings.php</code>.",
-    "config-localsettings-cli-upgrade": "A <code>LocalSettings.php</code> file has been detected.\nTo upgrade this installation, please run <code>update.php</code> instead",
-    "config-localsettings-key": "Upgrade key:",
-    "config-localsettings-badkey": "The key you provided is incorrect.",
-    "config-upgrade-key-missing": "An existing installation of MediaWiki has been detected.\nTo upgrade this installation, please put the following line at the bottom of your <code>LocalSettings.php</code>:\n\n$1",
-    "config-localsettings-incomplete": "The existing <code>LocalSettings.php</code> appears to be incomplete.\nThe $1 variable is not set.\nPlease change <code>LocalSettings.php</code> so that this variable is set, and click \"{{int:Config-continue}}\".",
-    "config-localsettings-connection-error": "An error was encountered when connecting to the database using the settings specified in <code>LocalSettings.php</code>. Please fix these settings and try again.\n\n$1",
-    "config-session-error": "Error starting session: $1",
-    "config-session-expired": "Your session data seems to have expired.\nSessions are configured for a lifetime of $1.\nYou can increase this by setting <code>session.gc_maxlifetime</code> in php.ini.\nRestart the installation process.",
-    "config-no-session": "Your session data was lost!\nCheck your php.ini and make sure <code>session.save_path</code> is set to an appropriate directory.",
-    "config-your-language": "Your language:",
-    "config-your-language-help": "Select a language to use during the installation process.",
-    "config-wiki-language": "Wiki language:",
-    "config-wiki-language-help": "Select the language that the wiki will predominantly be written in.",
-    "config-back": "← Back",
-    "config-continue": "Continue →",
-    "config-page-language": "Language",
-    "config-page-welcome": "Welcome to MediaWiki!",
-    "config-page-dbconnect": "Connect to database",
-    "config-page-upgrade": "Upgrade existing installation",
-    "config-page-dbsettings": "Database settings",
-    "config-page-name": "Name",
-    "config-page-options": "Options",
-    "config-page-install": "Install",
-    "config-page-complete": "Complete!",
-    "config-page-restart": "Restart installation",
-    "config-page-readme": "Read me",
-    "config-page-releasenotes": "Release notes",
-    "config-page-copying": "Copying",
-    "config-page-upgradedoc": "Upgrading",
-    "config-page-existingwiki": "Existing wiki",
-    "config-help-restart": "Do you want to clear all saved data that you have entered and restart the installation process?",
-    "config-restart": "Yes, restart it",
-    "config-welcome": "=== Environmental checks ===\nBasic checks will now be performed to see if this environment is suitable for MediaWiki installation.\nRemember to include this information if you seek support on how to complete the installation.",
-    "config-copyright": "=== Copyright and Terms ===\n\n$1\n\nThis program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but <strong>without any warranty</strong>; without even the implied warranty of <strong>merchantability</strong> or <strong>fitness for a particular purpose</strong>.\nSee the GNU General Public License for more details.\n\nYou should have received <doclink href=Copying>a copy of the GNU General Public License</doclink> along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, or [http://www.gnu.org/copyleft/gpl.html read it online].",
-    "config-sidebar": "* [//www.mediawiki.org MediaWiki home]\n* [//www.mediawiki.org/wiki/Help:Contents User's Guide]\n* [//www.mediawiki.org/wiki/Manual:Contents Administrator's Guide]\n* [//www.mediawiki.org/wiki/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>Read me</doclink>\n* <doclink href=ReleaseNotes>Release notes</doclink>\n* <doclink href=Copying>Copying</doclink>\n* <doclink href=UpgradeDoc>Upgrading</doclink>",
-    "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-php-toolow": "PHP $1 is installed.\nHowever, MediaWiki requires PHP $2 or higher.",
-    "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/Unicode_normalization_considerations Unicode normalization].",
-    "config-unicode-update-warning": "<strong>Warning:</strong> The installed version of the Unicode normalization wrapper uses an older version of [http://site.icu-project.org/ the ICU project's] library.\nYou should [//www.mediawiki.org/wiki/Unicode_normalization_considerations upgrade] if you are at all concerned about using Unicode.",
-    "config-no-db": "Could not find a suitable database driver! You need to install a database driver for PHP.\nThe following database types are supported: $1.\n\nIf you compiled PHP yourself, reconfigure it with a database client enabled, for example, using <code>./configure --with-mysqli</code>.\nIf you installed PHP from a Debian or Ubuntu package, then you also need to install, for example, the <code>php5-mysql</code> package.",
-    "config-outdated-sqlite": "<strong>Warning:</strong> you have SQLite $1, which is lower than minimum required version $2. SQLite will be unavailable.",
-    "config-no-fts3": "<strong>Warning:</strong> SQLite is compiled without the [//sqlite.org/fts3.html FTS3 module], search features will be unavailable on this backend.",
-    "config-register-globals": "<strong>Warning: PHP's <code>[http://php.net/register_globals register_globals]</code> option is enabled.\nDisable it if you can.</strong>\nMediaWiki will work, but your server is exposed to potential security vulnerabilities.",
-    "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 option corrupts data input unpredictably.\nYou cannot install or use MediaWiki unless this option 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 option corrupts data input unpredictably.\nYou cannot install or use MediaWiki unless this option is disabled.",
-    "config-mbstring": "<strong>Fatal: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] is active!</strong>\nThis option causes errors and may corrupt data unpredictably.\nYou cannot install or use MediaWiki unless this option is disabled.",
-    "config-safe-mode": "<strong>Warning:</strong> PHP's [http://www.php.net/features.safe-mode safe mode] is active.\nIt may cause problems, particularly if using file uploads and <code>math</code> support.",
-    "config-xml-bad": "PHP's XML module is missing.\nMediaWiki requires functions in this module and will not work in this configuration.\nIf you're running Mandrake, install the php-xml package.",
-    "config-pcre-old": "<strong>Fatal:</strong> PCRE $1 or later is required.\nYour PHP binary is linked with PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE More information].",
-    "config-pcre-no-utf8": "<strong>Fatal:</strong> PHP's PCRE module seems to be compiled without PCRE_UTF8 support.\nMediaWiki requires UTF-8 support to function correctly.",
-    "config-memory-raised": "PHP's <code>memory_limit</code> is $1, raised to $2.",
-    "config-memory-bad": "<strong>Warning:</strong> PHP's <code>memory_limit</code> is $1.\nThis is probably too low.\nThe installation may fail!",
-    "config-ctype": "<strong>Fatal:</strong> PHP must be compiled with support for the [http://www.php.net/manual/en/ctype.installation.php Ctype extension].",
-    "config-json": "<strong>Fatal:</strong> PHP was compiled without JSON support.\nYou must install either the PHP JSON extension or the [http://pecl.php.net/package/jsonc PECL jsonc] extension before installing MediaWiki.\n* The PHP extension is included in Red Hat Enterprise Linux (CentOS) 5 and 6, though must be enabled in <code>/etc/php.ini</code> or <code>/etc/php.d/json.ini</code>.\n* Some Linux distributions released after May 2013 omit the PHP extension, instead packaging the PECL extension as <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-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-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-imagemagick": "Found ImageMagick: <code>$1</code>.\nImage thumbnailing will be enabled if you enable uploads.",
-    "config-gd": "Found GD graphics library built-in.\nImage thumbnailing will be enabled if you enable uploads.",
-    "config-no-scaling": "Could not find GD library or ImageMagick.\nImage thumbnailing will be disabled.",
-    "config-no-uri": "<strong>Error:</strong> Could not determine the current URI.\nInstallation aborted.",
-    "config-no-cli-uri": "<strong>Warning:</strong> No <code>--scriptpath</code> specified, using default: <code>$1</code>.",
-    "config-using-server": "Using server name \"<nowiki>$1</nowiki>\".",
-    "config-using-uri": "Using server URL \"<nowiki>$1$2</nowiki>\".",
-    "config-uploads-not-safe": "<strong>Warning:</strong> Your default directory for uploads <code>$1</code> is vulnerable to arbitrary scripts execution.\nAlthough MediaWiki checks all uploaded files for security threats, it is highly recommended to [//www.mediawiki.org/wiki/Manual:Security#Upload_security close this security vulnerability] before enabling uploads.",
-    "config-no-cli-uploads-check": "<strong>Warning:</strong> Your default directory for uploads (<code>$1</code>) is not checked for vulnerability\nto arbitrary script execution during the CLI install.",
-    "config-brokenlibxml": "Your system has a combination of PHP and libxml2 versions that is buggy and can cause hidden data corruption in MediaWiki and other web applications.\nUpgrade to libxml2 2.7.3 or later ([https://bugs.php.net/bug.php?id=45996 bug filed with PHP]).\nInstallation aborted.",
-    "config-suhosin-max-value-length": "Suhosin is installed and limits the GET parameter <code>length</code> to $1 bytes.\nMediaWiki's ResourceLoader component will work around this limit, but that will degrade performance.\nIf at all possible, you should set <code>suhosin.get.max_value_length</code> to 1024 or higher in <code>php.ini</code>, and set <code>$wgResourceLoaderMaxQueryLength</code> to the same value in <code>LocalSettings.php</code>.",
-    "config-db-type": "Database type:",
-    "config-db-host": "Database host:",
-    "config-db-host-help": "If your database server is on different server, enter the host name or IP address here.\n\nIf you are using shared web hosting, your hosting provider should give you the correct host name in their documentation.\n\nIf you are installing on a Windows server and using MySQL, using \"localhost\" may not work for the server name. If it does not, try \"127.0.0.1\" for the local IP address.\n\nIf you are using PostgreSQL, leave this field blank to connect via a Unix socket.",
-    "config-db-host-oracle": "Database TNS:",
-    "config-db-host-oracle-help": "Enter a valid [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Local Connect Name]; a tnsnames.ora file must be visible to this installation.<br />If you are using client libraries 10g or newer you can also use the [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect] naming method.",
-    "config-db-wiki-settings": "Identify this wiki",
-    "config-db-name": "Database name:",
-    "config-db-name-help": "Choose a name that identifies your wiki.\nIt should not contain spaces.\n\nIf you are using shared web hosting, your hosting provider will either give you a specific database name to use or let you create databases via a control panel.",
-    "config-db-name-oracle": "Database schema:",
-    "config-db-account-oracle-warn": "There are three supported scenarios for installing Oracle as database backend:\n\nIf you wish to create database account as part of the installation process, please supply an account with SYSDBA role as database account for installation and specify the desired credentials for the web-access account, otherwise you can either create the web-access account manually and supply only that account (if it has required permissions to create the schema objects) or supply two different accounts, one with create privileges and a restricted one for web access.\n\nScript for creating an account with required privileges can be found in \"maintenance/oracle/\" directory of this installation. Keep in mind that using a restricted account will disable all maintenance capabilities with the default account.",
-    "config-db-install-account": "User account for installation",
-    "config-db-username": "Database username:",
-    "config-db-password": "Database password:",
-    "config-db-password-empty": "Please enter a password for the new database user: $1.\nWhile it may be possible to create users with no passwords, it is not secure.",
-    "config-db-username-empty": "You must enter a value for \"{{int:config-db-username}}\"",
-    "config-db-install-username": "Enter the username that will be used to connect to the database during the installation process.\nThis is not the username of the MediaWiki account; this is the username for your database.",
-    "config-db-install-password": "Enter the password that will be used to connect to the database during the installation process.\nThis is not the password for the MediaWiki account; this is the password for your database.",
-    "config-db-install-help": "Enter the username and password that will be used to connect to the database during the installation process.",
-    "config-db-account-lock": "Use the same username and password during normal operation",
-    "config-db-wiki-account": "User account for normal operation",
-    "config-db-wiki-help": "Enter the username and password that will be used to connect to the database during normal wiki operation.\nIf the account does not exist, and the installation account has sufficient privileges, this user account will be created with the minimum privileges required to operate the wiki.",
-    "config-db-prefix": "Database table prefix:",
-    "config-db-prefix-help": "If you need to share one database between multiple wikis, or between MediaWiki and another web application, you may choose to add a prefix to all the table names to avoid conflicts.\nDo not use spaces.\n\nThis field is usually left empty.",
-    "config-db-charset": "Database character set",
-    "config-charset-mysql5-binary": "MySQL 4.1/5.0 binary",
-    "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
-    "config-charset-mysql4": "MySQL 4.0 backwards-compatible UTF-8",
-    "config-charset-help": "<strong>Warning:</strong> If you use <strong>backwards-compatible UTF-8</strong> on MySQL 4.1+, and subsequently back up the database with <code>mysqldump</code>, it may destroy all non-ASCII characters, irreversibly corrupting your backups!\n\nIn <strong>binary mode</strong>, MediaWiki stores UTF-8 text to the database in binary fields.\nThis is more efficient than MySQL's UTF-8 mode, and allows you to use the full range of Unicode characters.\nIn <strong>UTF-8 mode</strong>, MySQL will know what character set your data is in, and can present and convert it appropriately,\nbut it will not let you store characters above the [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
-    "config-mysql-old": "MySQL $1 or later is required. You have $2.",
-    "config-db-port": "Database port:",
-    "config-db-schema": "Schema for MediaWiki:",
-    "config-db-schema-help": "This schema will usually be fine.\nOnly change it if you know you need to.",
-    "config-pg-test-error": "Cannot connect to database <strong>$1</strong>: $2",
-    "config-sqlite-dir": "SQLite data directory:",
-    "config-sqlite-dir-help": "SQLite stores all data in a single file.\n\nThe directory you provide must be writable by the webserver during installation.\n\nIt should <strong>not</strong> be accessible via the web, this is why we're not putting it where your PHP files are.\n\nThe installer will write a <code>.htaccess</code> file along with it, but if that fails someone can gain access to your raw database.\nThat includes raw user data (email addresses, hashed passwords) as well as deleted revisions and other restricted data on the wiki.\n\nConsider putting the database somewhere else altogether, for example in <code>/var/lib/mediawiki/yourwiki</code>.",
-    "config-oracle-def-ts": "Default tablespace:",
-    "config-oracle-temp-ts": "Temporary tablespace:",
-    "config-type-mysql": "MySQL (or compatible)",
-    "config-type-postgres": "PostgreSQL",
-    "config-type-sqlite": "SQLite",
-    "config-type-oracle": "Oracle",
-    "config-type-mssql": "Microsoft SQL Server",
-    "config-support-info": "MediaWiki supports the following database systems:\n\n$1\n\nIf you do not see the database system you are trying to use listed below, then follow the instructions linked above to enable support.",
-    "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] is the primary target for MediaWiki and is best supported. MediaWiki also works with [{{int:version-db-mariadb-url}} MariaDB] and [{{int:version-db-percona-url}} Percona Server], which are MySQL compatible. ([http://www.php.net/manual/en/mysqli.installation.php How to compile PHP with MySQL support])",
-    "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] is a popular open source database system as an alternative to MySQL. There may be some minor outstanding bugs, and it is not recommended for use in a production environment. ([http://www.php.net/manual/en/pgsql.installation.php How to compile PHP with PostgreSQL support])",
-    "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] is a lightweight database system that is very well supported. ([http://www.php.net/manual/en/pdo.installation.php How to compile PHP with SQLite support], uses PDO)",
-    "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] is a commercial enterprise database. ([http://www.php.net/manual/en/oci8.installation.php How to compile PHP with OCI8 support])",
-    "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] is a commercial enterprise database for Windows. ([http://www.php.net/manual/en/sqlsrv.installation.php How to compile PHP with SQLSRV support])",
-    "config-header-mysql": "MySQL settings",
-    "config-header-postgres": "PostgreSQL settings",
-    "config-header-sqlite": "SQLite settings",
-    "config-header-oracle": "Oracle settings",
-    "config-header-mssql": "Microsoft SQL Server settings",
-    "config-invalid-db-type": "Invalid database type.",
-    "config-missing-db-name": "You must enter a value for \"{{int:config-db-name}}\".",
-    "config-missing-db-host": "You must enter a value for \"{{int:config-db-host}}\".",
-    "config-missing-db-server-oracle": "You must enter a value for \"{{int:config-db-host-oracle}}\".",
-    "config-invalid-db-server-oracle": "Invalid database TNS \"$1\".\nUse either \"TNS Name\" or an \"Easy Connect\" string ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle Naming Methods]).",
-    "config-invalid-db-name": "Invalid database name \"$1\".\nUse only ASCII letters (a-z, A-Z), numbers (0-9), underscores (_) and hyphens (-).",
-    "config-invalid-db-prefix": "Invalid database prefix \"$1\".\nUse only ASCII letters (a-z, A-Z), numbers (0-9), underscores (_) and hyphens (-).",
-    "config-connection-error": "$1.\n\nCheck the host, username and password and try again.",
-    "config-invalid-schema": "Invalid schema for MediaWiki \"$1\".\nUse only ASCII letters (a-z, A-Z), numbers (0-9) and underscores (_).",
-    "config-db-sys-create-oracle": "Installer only supports using a SYSDBA account for creating a new account.",
-    "config-db-sys-user-exists-oracle": "User account \"$1\" already exists. SYSDBA can only be used for creating of a new account!",
-    "config-postgres-old": "PostgreSQL $1 or later is required. You have $2.",
-    "config-mssql-old": "Microsoft SQL Server $1 or later is required. You have $2.",
-    "config-sqlite-name-help": "Choose a name that identifies your wiki.\nDo not use spaces or hyphens.\nThis will be used for the SQLite data file name.",
-    "config-sqlite-parent-unwritable-group": "Cannot create the data directory <code><nowiki>$1</nowiki></code>, because the parent directory <code><nowiki>$2</nowiki></code> is not writable by the webserver.\n\nThe installer has determined the user your webserver is running as.\nMake the <code><nowiki>$3</nowiki></code> directory writable by it to continue.\nOn a Unix/Linux system do:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
-    "config-sqlite-parent-unwritable-nogroup": "Cannot create the data directory <code><nowiki>$1</nowiki></code>, because the parent directory <code><nowiki>$2</nowiki></code> is not writable by the webserver.\n\nThe installer could not determine the user your webserver is running as.\nMake the <code><nowiki>$3</nowiki></code> directory globally writable by it (and others!) to continue.\nOn a Unix/Linux system do:\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
-    "config-sqlite-mkdir-error": "Error creating the data directory \"$1\".\nCheck the location and try again.",
-    "config-sqlite-dir-unwritable": "Unable to write to the directory \"$1\".\nChange its permissions so that the webserver can write to it, and try again.",
-    "config-sqlite-connection-error": "$1.\n\nCheck the data directory and database name below and try again.",
-    "config-sqlite-readonly": "The file <code>$1</code> is not writeable.",
-    "config-sqlite-cant-create-db": "Could not create database file <code>$1</code>.",
-    "config-sqlite-fts3-downgrade": "PHP is missing FTS3 support, downgrading tables",
-    "config-can-upgrade": "There are MediaWiki tables in this database.\nTo upgrade them to MediaWiki $1, click <strong>Continue</strong>.",
-    "config-upgrade-done": "Upgrade complete.\n\nYou can now [$1 start using your wiki].\n\nIf you want to regenerate your <code>LocalSettings.php</code> file, click the button below.\nThis is <strong>not recommended</strong> unless you are having problems with your wiki.",
-    "config-upgrade-done-no-regenerate": "Upgrade complete.\n\nYou can now [$1 start using your wiki].",
-    "config-regenerate": "Regenerate LocalSettings.php →",
-    "config-show-table-status": "<code>SHOW TABLE STATUS</code> query failed!",
-    "config-unknown-collation": "<strong>Warning:</strong> Database is using unrecognized collation.",
-    "config-db-web-account": "Database account for web access",
-    "config-db-web-help": "Select the username and password that the web server will use to connect to the database server, during ordinary operation of the wiki.",
-    "config-db-web-account-same": "Use the same account as for installation",
-    "config-db-web-create": "Create the account if it does not already exist",
-    "config-db-web-no-create-privs": "The account you specified for installation does not have enough privileges to create an account.\nThe account you specify here must already exist.",
-    "config-mysql-engine": "Storage engine:",
-    "config-mysql-innodb": "InnoDB",
-    "config-mysql-myisam": "MyISAM",
-    "config-mysql-myisam-dep": "<strong>Warning:</strong> You have selected MyISAM as storage engine for MySQL, which is not recommended for use with MediaWiki, because:\n* it barely supports concurrency due to table locking\n* it is more prone to corruption than other engines\n* the MediaWiki codebase does not always handle MyISAM as it should\n\nIf your MySQL installation supports InnoDB, it is highly recommended that you choose that instead.\nIf your MySQL installation does not support InnoDB, maybe it's time for an upgrade.",
-    "config-mysql-only-myisam-dep": "<strong>Warning:</strong> MyISAM is the only available storage engine for MySQL on this machine, and this is not recommended for use with MediaWiki, because:\n* it barely supports concurrency due to table locking\n* it is more prone to corruption than other engines\n* the MediaWiki codebase does not always handle MyISAM as it should\n\nYour MySQL installation does not support InnoDB, maybe it's time for an upgrade.",
-    "config-mysql-engine-help": "<strong>InnoDB</strong> is almost always the best option, since it has good concurrency support.\n\n<strong>MyISAM</strong> may be faster in single-user or read-only installations.\nMyISAM databases tend to get corrupted more often than InnoDB databases.",
-    "config-mysql-charset": "Database character set:",
-    "config-mysql-binary": "Binary",
-    "config-mysql-utf8": "UTF-8",
-    "config-mysql-charset-help": "In <strong>binary mode</strong>, MediaWiki stores UTF-8 text to the database in binary fields.\nThis is more efficient than MySQL's UTF-8 mode, and allows you to use the full range of Unicode characters.\n\nIn <strong>UTF-8 mode</strong>, MySQL will know what character set your data is in, and can present and convert it appropriately, but it will not let you store characters above the [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
-    "config-mssql-auth": "Authentication type:",
-    "config-mssql-install-auth": "Select the authentication type that will be used to connect to the database during the installation process.\nIf you select \"{{int:config-mssql-windowsauth}}\", the credentials of whatever user the webserver is running as will be used.",
-    "config-mssql-web-auth": "Select the authentication type that the web server will use to connect to the database server, during ordinary operation of the wiki.\nIf you select \"{{int:config-mssql-windowsauth}}\", the credentials of whatever user the webserver is running as will be used.",
-    "config-mssql-sqlauth": "SQL Server Authentication",
-    "config-mssql-windowsauth": "Windows Authentication",
-    "config-site-name": "Name of wiki:",
-    "config-site-name-help": "This will appear in the title bar of the browser and in various other places.",
-    "config-site-name-blank": "Enter a site name.",
-    "config-project-namespace": "Project namespace:",
-    "config-ns-generic": "Project",
-    "config-ns-site-name": "Same as the wiki name: $1",
-    "config-ns-other": "Other (specify)",
-    "config-ns-other-default": "MyWiki",
-    "config-project-namespace-help": "Following Wikipedia's example, many wikis keep their policy pages separate from their content pages, in a \"'''project namespace'''\".\nAll page titles in this namespace start with a certain prefix, which you can specify here.\nUsually, this prefix is derived from the name of the wiki, but it cannot contain punctuation characters such as \"#\" or \":\".",
-    "config-ns-invalid": "The specified namespace \"<nowiki>$1</nowiki>\" is invalid.\nSpecify a different project namespace.",
-    "config-ns-conflict": "The specified namespace \"<nowiki>$1</nowiki>\" conflicts with a default MediaWiki namespace.\nSpecify a different project namespace.",
-    "config-admin-box": "Administrator account",
-    "config-admin-name": "Your username:",
-    "config-admin-password": "Password:",
-    "config-admin-password-confirm": "Password again:",
-    "config-admin-help": "Enter your preferred username here, for example \"Joe Bloggs\".\nThis is the name you will use to log in to the wiki.",
-    "config-admin-name-blank": "Enter an administrator username.",
-    "config-admin-name-invalid": "The specified username \"<nowiki>$1</nowiki>\" is invalid.\nSpecify a different username.",
-    "config-admin-password-blank": "Enter a password for the administrator account.",
-    "config-admin-password-mismatch": "The two passwords you entered do not match.",
-    "config-admin-email": "Email address:",
-    "config-admin-email-help": "Enter an email address here to allow you to receive email from other users on the wiki, reset your password, and be notified of changes to pages on your watchlist. You can leave this field empty.",
-    "config-admin-error-user": "Internal error when creating an admin with the name \"<nowiki>$1</nowiki>\".",
-    "config-admin-error-password": "Internal error when setting a password for the admin \"<nowiki>$1</nowiki>\": <pre>$2</pre>",
-    "config-admin-error-bademail": "You have entered an invalid email address.",
-    "config-subscribe": "Subscribe to the [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce release announcements mailing list].",
-    "config-subscribe-help": "This is a low-volume mailing list used for release announcements, including important security announcements.\nYou should subscribe to it and update your MediaWiki installation when new versions come out.",
-    "config-subscribe-noemail": "You tried to subscribe to the release announcements mailing list without providing an email address.\nPlease provide an email address if you wish to subscribe to the mailing list.",
-    "config-almost-done": "You are almost done!\nYou can now skip the remaining configuration and install the wiki right now.",
-    "config-optional-continue": "Ask me more questions.",
-    "config-optional-skip": "I'm bored already, just install the wiki.",
-    "config-profile": "User rights profile:",
-    "config-profile-wiki": "Open wiki",
-    "config-profile-no-anon": "Account creation required",
-    "config-profile-fishbowl": "Authorized editors only",
-    "config-profile-private": "Private wiki",
-    "config-profile-help": "Wikis work best when you let as many people edit them as possible.\nIn MediaWiki, it is easy to review the recent changes, and to revert any damage that is done by naive or malicious users.\n\nHowever, many have found MediaWiki to be useful in a wide variety of roles, and sometimes it is not easy to convince everyone of the benefits of the wiki way.\nSo you have the choice.\n\nThe <strong>{{int:config-profile-wiki}}</strong> model allows anyone to edit, without even logging in.\nA wiki with <strong>{{int:config-profile-no-anon}}</strong> provides extra accountability, but may deter casual contributors.\n\nThe <strong>{{int:config-profile-fishbowl}}</strong> scenario allows approved users to edit, but the public can view the pages, including history.\nA <strong>{{int:config-profile-private}}</strong> only allows approved users to view pages, with the same group allowed to edit.\n\nMore complex user rights configurations are available after installation, see the [//www.mediawiki.org/wiki/Manual:User_rights relevant manual entry].",
-    "config-license": "Copyright and license:",
-    "config-license-none": "No license footer",
-    "config-license-cc-by-sa": "Creative Commons Attribution Share Alike",
-    "config-license-cc-by": "Creative Commons Attribution",
-    "config-license-cc-by-nc-sa": "Creative Commons Attribution Non-Commercial Share Alike",
-    "config-license-cc-0": "Creative Commons Zero (Public Domain)",
-    "config-license-gfdl": "GNU Free Documentation License 1.3 or later",
-    "config-license-pd": "Public Domain",
-    "config-license-cc-choose": "Select a custom Creative Commons license",
-    "config-license-help": "Many public wikis put all contributions under a [http://freedomdefined.org/Definition free license].\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>Creative Commons Attribution Share Alike</strong>.\n\nWikipedia previously used the GNU Free Documentation License.\nThe GFDL is a valid license, but it is difficult to understand.\nIt is also difficult to reuse content licensed under the GFDL.",
-    "config-email-settings": "Email settings",
-    "config-enable-email": "Enable outbound email",
-    "config-enable-email-help": "If you want email to work, [http://www.php.net/manual/en/mail.configuration.php PHP's mail settings] need to be configured correctly.\nIf you do not want any email features, you can disable them here.",
-    "config-email-user": "Enable user-to-user email",
-    "config-email-user-help": "Allow all users to send each other email if they have enabled it in their preferences.",
-    "config-email-usertalk": "Enable user talk page notification",
-    "config-email-usertalk-help": "Allow users to receive notifications on user talk page changes, if they have enabled it in their preferences.",
-    "config-email-watchlist": "Enable watchlist notification",
-    "config-email-watchlist-help": "Allow users to receive notifications about their watched pages if they have enabled it in their preferences.",
-    "config-email-auth": "Enable email authentication",
-    "config-email-auth-help": "If this option is enabled, users have to confirm their email address using a link sent to them whenever they set or change it.\nOnly authenticated email addresses can receive emails from other users or change notification emails.\nSetting this option is <strong>recommended</strong> for public wikis because of potential abuse of the email features.",
-    "config-email-sender": "Return email address:",
-    "config-email-sender-help": "Enter the email address to use as the return address on outbound email.\nThis is where bounces will be sent.\nMany mail servers require at least the domain name part to be valid.",
-    "config-upload-settings": "Images and file uploads",
-    "config-upload-enable": "Enable file uploads",
-    "config-upload-help": "File uploads potentially expose your server to security risks.\nFor more information, read the [//www.mediawiki.org/wiki/Manual:Security security section] in the manual.\n\nTo enable file uploads, change the mode on the <code>images</code> subdirectory under MediaWiki's root directory so that the web server can write to it.\nThen enable this option.",
-    "config-upload-deleted": "Directory for deleted files:",
-    "config-upload-deleted-help": "Choose a directory in which to archive deleted files.\nIdeally, this should not be accessible from the web.",
-    "config-logo": "Logo URL:",
-    "config-logo-help": "MediaWiki's default skin includes space for a 135x160 pixel logo above the sidebar menu.\nUpload an image of the appropriate size, and enter the URL here.\n\nYou can use <code>$wgStylePath</code> or <code>$wgScriptPath</code> if your logo is relative to those paths.\n\nIf you do not want a logo, leave this box blank.",
-    "config-instantcommons": "Enable Instant Commons",
-    "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] is a feature that allows wikis to use images, sounds and other media found on the [//commons.wikimedia.org/ Wikimedia Commons] site.\nIn order to do this, MediaWiki requires access to the Internet.\n\nFor more information on this feature, including instructions on how to set it up for wikis other than the Wikimedia Commons, consult [//mediawiki.org/wiki/Manual:$wgForeignFileRepos the manual].",
-    "config-cc-error": "The Creative Commons license chooser gave no result.\nEnter the license name manually.",
-    "config-cc-again": "Pick again...",
-    "config-cc-not-chosen": "Choose which Creative Commons license you want and click \"proceed\".",
-    "config-advanced-settings": "Advanced configuration",
-    "config-cache-options": "Settings for object caching:",
-    "config-cache-help": "Object caching is used to improve the speed of MediaWiki by caching frequently used data.\nMedium to large sites are highly encouraged to enable this, and small sites will see benefits as well.",
-    "config-cache-none": "No caching (no functionality is removed, but speed may be impacted on larger wiki sites)",
-    "config-cache-accel": "PHP object caching (APC, XCache or WinCache)",
-    "config-cache-memcached": "Use Memcached (requires additional setup and configuration)",
-    "config-memcached-servers": "Memcached servers:",
-    "config-memcached-help": "List of IP addresses to use for Memcached.\nShould specify one per line and specify the port to be used. For example:\n 127.0.0.1:11211\n 192.168.1.25:1234",
-    "config-memcache-needservers": "You selected Memcached as your cache type but did not specify any servers.",
-    "config-memcache-badip": "You have entered an invalid IP address for Memcached: $1.",
-    "config-memcache-noport": "You did not specify a port to use for Memcached server: $1.\nIf you do not know the port, the default is 11211.",
-    "config-memcache-badport": "Memcached port numbers should be between $1 and $2.",
-    "config-extensions": "Extensions",
-    "config-extensions-help": "The extensions listed above were detected in your <code>./extensions</code> directory.\n\nThey may require additional configuration, but you can enable them now.",
-    "config-install-alreadydone": "<strong>Warning:</strong> You seem to have already installed MediaWiki and are trying to install it again.\nPlease proceed to the next page.",
-    "config-install-begin": "By pressing \"{{int:config-continue}}\", you will begin the installation of MediaWiki.\nIf you still want to make changes, press \"{{int:config-back}}\".",
-    "config-install-step-done": "done",
-    "config-install-step-failed": "failed",
-    "config-install-extensions": "Including extensions",
-    "config-install-database": "Setting up database",
-    "config-install-schema": "Creating schema",
-    "config-install-pg-schema-not-exist": "PostgreSQL schema does not exist.",
-    "config-install-pg-schema-failed": "Tables creation failed.\nMake sure that the user \"$1\" can write to the schema \"$2\".",
-    "config-install-pg-commit": "Committing changes",
-    "config-install-pg-plpgsql": "Checking for language PL/pgSQL",
-    "config-pg-no-plpgsql": "You need to install the language PL/pgSQL in the database $1",
-    "config-pg-no-create-privs": "The account you specified for installation does not have enough privileges to create an account.",
-    "config-pg-not-in-role": "The account you specified for the web user already exists.\nThe account you specified for installation is not a superuser and is not a member of the web user's role, so it is unable to create objects owned by the web user.\n\nMediaWiki currently requires that the tables be owned by the web user. Please specify another web account name, or click \"back\" and specify a suitably privileged install user.",
-    "config-install-user": "Creating database user",
-    "config-install-user-alreadyexists": "User \"$1\" already exists",
-    "config-install-user-create-failed": "Creating user \"$1\" failed: $2",
-    "config-install-user-grant-failed": "Granting permission to user \"$1\" failed: $2",
-    "config-install-user-missing": "The specified user \"$1\" does not exist.",
-    "config-install-user-missing-create": "The specified user \"$1\" does not exist.\nPlease click the \"create account\" checkbox below if you want to create it.",
-    "config-install-tables": "Creating tables",
-    "config-install-tables-exist": "<strong>Warning:</strong> MediaWiki tables seem to already exist.\nSkipping creation.",
-    "config-install-tables-failed": "<strong>Error:</strong> Table creation failed with the following error: $1",
-    "config-install-interwiki": "Populating default interwiki table",
-    "config-install-interwiki-list": "Could not read file <code>interwiki.list</code>.",
-    "config-install-interwiki-exists": "<strong>Warning:</strong> The interwiki table seems to already have entries.\nSkipping default list.",
-    "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-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 allow_url_fopen is not available.",
-    "config-install-mainpage": "Creating main page with default content",
-    "config-install-extension-tables": "Creating tables for enabled extensions",
-    "config-install-mainpage-failed": "Could not insert main page: $1",
-    "config-install-done": "<strong>Congratulations!</strong>\nYou have successfully installed MediaWiki.\n\nThe installer has generated a <code>LocalSettings.php</code> file.\nIt contains all your configuration.\n\nYou will need to download it and put it in the base of your wiki installation (the same directory as index.php). The download should have started automatically.\n\nIf the download was not offered, or if you cancelled it, you can restart the download by clicking the link below:\n\n$3\n\n<strong>Note:</strong> If you do not do this now, this generated configuration file will not be available to you later if you exit the installation without downloading it.\n\nWhen that has been done, you can <strong>[$2 enter your wiki]</strong>.",
-    "config-download-localsettings": "Download <code>LocalSettings.php</code>",
-    "config-help": "help",
-    "config-nofile": "File \"$1\" could not be found. Has it been deleted?",
-    "config-extension-link": "Did you know that your wiki supports [//www.mediawiki.org/wiki/Manual:Extensions extensions]?\n\nYou can browse [//www.mediawiki.org/wiki/Category:Extensions_by_category extensions by category] or the [//www.mediawiki.org/wiki/Extension_Matrix Extension Matrix] to see the full list of extensions.",
-    "mainpagetext": "<strong>MediaWiki has been successfully installed.</strong>",
-    "mainpagedocfooter": "Consult the [//meta.wikimedia.org/wiki/Help:Contents User's Guide] for information on using the wiki software.\n\n== Getting started ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Localise MediaWiki for your language]"
+       "@metadata": {
+               "authors": []
+       },
+       "config-desc": "The installer for MediaWiki",
+       "config-title": "MediaWiki $1 installation",
+       "config-information": "Information",
+       "config-localsettings-upgrade": "A <code>LocalSettings.php</code> file has been detected.\nTo upgrade this installation, please enter the value of <code>$wgUpgradeKey</code> in the box below.\nYou will find it in <code>LocalSettings.php</code>.",
+       "config-localsettings-cli-upgrade": "A <code>LocalSettings.php</code> file has been detected.\nTo upgrade this installation, please run <code>update.php</code> instead",
+       "config-localsettings-key": "Upgrade key:",
+       "config-localsettings-badkey": "The key you provided is incorrect.",
+       "config-upgrade-key-missing": "An existing installation of MediaWiki has been detected.\nTo upgrade this installation, please put the following line at the bottom of your <code>LocalSettings.php</code>:\n\n$1",
+       "config-localsettings-incomplete": "The existing <code>LocalSettings.php</code> appears to be incomplete.\nThe $1 variable is not set.\nPlease change <code>LocalSettings.php</code> so that this variable is set, and click \"{{int:Config-continue}}\".",
+       "config-localsettings-connection-error": "An error was encountered when connecting to the database using the settings specified in <code>LocalSettings.php</code>. Please fix these settings and try again.\n\n$1",
+       "config-session-error": "Error starting session: $1",
+       "config-session-expired": "Your session data seems to have expired.\nSessions are configured for a lifetime of $1.\nYou can increase this by setting <code>session.gc_maxlifetime</code> in php.ini.\nRestart the installation process.",
+       "config-no-session": "Your session data was lost!\nCheck your php.ini and make sure <code>session.save_path</code> is set to an appropriate directory.",
+       "config-your-language": "Your language:",
+       "config-your-language-help": "Select a language to use during the installation process.",
+       "config-wiki-language": "Wiki language:",
+       "config-wiki-language-help": "Select the language that the wiki will predominantly be written in.",
+       "config-back": "← Back",
+       "config-continue": "Continue →",
+       "config-page-language": "Language",
+       "config-page-welcome": "Welcome to MediaWiki!",
+       "config-page-dbconnect": "Connect to database",
+       "config-page-upgrade": "Upgrade existing installation",
+       "config-page-dbsettings": "Database settings",
+       "config-page-name": "Name",
+       "config-page-options": "Options",
+       "config-page-install": "Install",
+       "config-page-complete": "Complete!",
+       "config-page-restart": "Restart installation",
+       "config-page-readme": "Read me",
+       "config-page-releasenotes": "Release notes",
+       "config-page-copying": "Copying",
+       "config-page-upgradedoc": "Upgrading",
+       "config-page-existingwiki": "Existing wiki",
+       "config-help-restart": "Do you want to clear all saved data that you have entered and restart the installation process?",
+       "config-restart": "Yes, restart it",
+       "config-welcome": "=== Environmental checks ===\nBasic checks will now be performed to see if this environment is suitable for MediaWiki installation.\nRemember to include this information if you seek support on how to complete the installation.",
+       "config-copyright": "=== Copyright and Terms ===\n\n$1\n\nThis program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but <strong>without any warranty</strong>; without even the implied warranty of <strong>merchantability</strong> or <strong>fitness for a particular purpose</strong>.\nSee the GNU General Public License for more details.\n\nYou should have received <doclink href=Copying>a copy of the GNU General Public License</doclink> along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, or [http://www.gnu.org/copyleft/gpl.html read it online].",
+       "config-sidebar": "* [//www.mediawiki.org MediaWiki home]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents User's Guide]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Administrator's Guide]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>Read me</doclink>\n* <doclink href=ReleaseNotes>Release notes</doclink>\n* <doclink href=Copying>Copying</doclink>\n* <doclink href=UpgradeDoc>Upgrading</doclink>",
+       "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-php-toolow": "PHP $1 is installed.\nHowever, MediaWiki requires PHP $2 or higher.",
+       "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].",
+       "config-unicode-update-warning": "<strong>Warning:</strong> The installed version of the Unicode normalization wrapper uses an older version of [http://site.icu-project.org/ the ICU project's] library.\nYou should [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations upgrade] if you are at all concerned about using Unicode.",
+       "config-no-db": "Could not find a suitable database driver! You need to install a database driver for PHP.\nThe following database types are supported: $1.\n\nIf you compiled PHP yourself, reconfigure it with a database client enabled, for example, using <code>./configure --with-mysqli</code>.\nIf you installed PHP from a Debian or Ubuntu package, then you also need to install, for example, the <code>php5-mysql</code> package.",
+       "config-outdated-sqlite": "<strong>Warning:</strong> you have SQLite $1, which is lower than minimum required version $2. SQLite will be unavailable.",
+       "config-no-fts3": "<strong>Warning:</strong> SQLite is compiled without the [//sqlite.org/fts3.html FTS3 module], search features will be unavailable on this backend.",
+       "config-register-globals": "<strong>Warning: PHP's <code>[http://php.net/register_globals register_globals]</code> option is enabled.\nDisable it if you can.</strong>\nMediaWiki will work, but your server is exposed to potential security vulnerabilities.",
+       "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 option corrupts data input unpredictably.\nYou cannot install or use MediaWiki unless this option 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 option corrupts data input unpredictably.\nYou cannot install or use MediaWiki unless this option is disabled.",
+       "config-mbstring": "<strong>Fatal: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] is active!</strong>\nThis option causes errors and may corrupt data unpredictably.\nYou cannot install or use MediaWiki unless this option is disabled.",
+       "config-safe-mode": "<strong>Warning:</strong> PHP's [http://www.php.net/features.safe-mode safe mode] is active.\nIt may cause problems, particularly if using file uploads and <code>math</code> support.",
+       "config-xml-bad": "PHP's XML module is missing.\nMediaWiki requires functions in this module and will not work in this configuration.\nIf you're running Mandrake, install the php-xml package.",
+       "config-pcre-old": "<strong>Fatal:</strong> PCRE $1 or later is required.\nYour PHP binary is linked with PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE More information].",
+       "config-pcre-no-utf8": "<strong>Fatal:</strong> PHP's PCRE module seems to be compiled without PCRE_UTF8 support.\nMediaWiki requires UTF-8 support to function correctly.",
+       "config-memory-raised": "PHP's <code>memory_limit</code> is $1, raised to $2.",
+       "config-memory-bad": "<strong>Warning:</strong> PHP's <code>memory_limit</code> is $1.\nThis is probably too low.\nThe installation may fail!",
+       "config-ctype": "<strong>Fatal:</strong> PHP must be compiled with support for the [http://www.php.net/manual/en/ctype.installation.php Ctype extension].",
+       "config-json": "<strong>Fatal:</strong> PHP was compiled without JSON support.\nYou must install either the PHP JSON extension or the [http://pecl.php.net/package/jsonc PECL jsonc] extension before installing MediaWiki.\n* The PHP extension is included in Red Hat Enterprise Linux (CentOS) 5 and 6, though must be enabled in <code>/etc/php.ini</code> or <code>/etc/php.d/json.ini</code>.\n* Some Linux distributions released after May 2013 omit the PHP extension, instead packaging the PECL extension as <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-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-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-imagemagick": "Found ImageMagick: <code>$1</code>.\nImage thumbnailing will be enabled if you enable uploads.",
+       "config-gd": "Found GD graphics library built-in.\nImage thumbnailing will be enabled if you enable uploads.",
+       "config-no-scaling": "Could not find GD library or ImageMagick.\nImage thumbnailing will be disabled.",
+       "config-no-uri": "<strong>Error:</strong> Could not determine the current URI.\nInstallation aborted.",
+       "config-no-cli-uri": "<strong>Warning:</strong> No <code>--scriptpath</code> specified, using default: <code>$1</code>.",
+       "config-using-server": "Using server name \"<nowiki>$1</nowiki>\".",
+       "config-using-uri": "Using server URL \"<nowiki>$1$2</nowiki>\".",
+       "config-uploads-not-safe": "<strong>Warning:</strong> Your default directory for uploads <code>$1</code> is vulnerable to arbitrary scripts execution.\nAlthough MediaWiki checks all uploaded files for security threats, it is highly recommended to [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security close this security vulnerability] before enabling uploads.",
+       "config-no-cli-uploads-check": "<strong>Warning:</strong> Your default directory for uploads (<code>$1</code>) is not checked for vulnerability\nto arbitrary script execution during the CLI install.",
+       "config-brokenlibxml": "Your system has a combination of PHP and libxml2 versions that is buggy and can cause hidden data corruption in MediaWiki and other web applications.\nUpgrade to libxml2 2.7.3 or later ([https://bugs.php.net/bug.php?id=45996 bug filed with PHP]).\nInstallation aborted.",
+       "config-suhosin-max-value-length": "Suhosin is installed and limits the GET parameter <code>length</code> to $1 bytes.\nMediaWiki's ResourceLoader component will work around this limit, but that will degrade performance.\nIf at all possible, you should set <code>suhosin.get.max_value_length</code> to 1024 or higher in <code>php.ini</code>, and set <code>$wgResourceLoaderMaxQueryLength</code> to the same value in <code>LocalSettings.php</code>.",
+       "config-db-type": "Database type:",
+       "config-db-host": "Database host:",
+       "config-db-host-help": "If your database server is on different server, enter the host name or IP address here.\n\nIf you are using shared web hosting, your hosting provider should give you the correct host name in their documentation.\n\nIf you are installing on a Windows server and using MySQL, using \"localhost\" may not work for the server name. If it does not, try \"127.0.0.1\" for the local IP address.\n\nIf you are using PostgreSQL, leave this field blank to connect via a Unix socket.",
+       "config-db-host-oracle": "Database TNS:",
+       "config-db-host-oracle-help": "Enter a valid [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Local Connect Name]; a tnsnames.ora file must be visible to this installation.<br />If you are using client libraries 10g or newer you can also use the [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect] naming method.",
+       "config-db-wiki-settings": "Identify this wiki",
+       "config-db-name": "Database name:",
+       "config-db-name-help": "Choose a name that identifies your wiki.\nIt should not contain spaces.\n\nIf you are using shared web hosting, your hosting provider will either give you a specific database name to use or let you create databases via a control panel.",
+       "config-db-name-oracle": "Database schema:",
+       "config-db-account-oracle-warn": "There are three supported scenarios for installing Oracle as database backend:\n\nIf you wish to create database account as part of the installation process, please supply an account with SYSDBA role as database account for installation and specify the desired credentials for the web-access account, otherwise you can either create the web-access account manually and supply only that account (if it has required permissions to create the schema objects) or supply two different accounts, one with create privileges and a restricted one for web access.\n\nScript for creating an account with required privileges can be found in \"maintenance/oracle/\" directory of this installation. Keep in mind that using a restricted account will disable all maintenance capabilities with the default account.",
+       "config-db-install-account": "User account for installation",
+       "config-db-username": "Database username:",
+       "config-db-password": "Database password:",
+       "config-db-password-empty": "Please enter a password for the new database user: $1.\nWhile it may be possible to create users with no passwords, it is not secure.",
+       "config-db-username-empty": "You must enter a value for \"{{int:config-db-username}}\".",
+       "config-db-install-username": "Enter the username that will be used to connect to the database during the installation process.\nThis is not the username of the MediaWiki account; this is the username for your database.",
+       "config-db-install-password": "Enter the password that will be used to connect to the database during the installation process.\nThis is not the password for the MediaWiki account; this is the password for your database.",
+       "config-db-install-help": "Enter the username and password that will be used to connect to the database during the installation process.",
+       "config-db-account-lock": "Use the same username and password during normal operation",
+       "config-db-wiki-account": "User account for normal operation",
+       "config-db-wiki-help": "Enter the username and password that will be used to connect to the database during normal wiki operation.\nIf the account does not exist, and the installation account has sufficient privileges, this user account will be created with the minimum privileges required to operate the wiki.",
+       "config-db-prefix": "Database table prefix:",
+       "config-db-prefix-help": "If you need to share one database between multiple wikis, or between MediaWiki and another web application, you may choose to add a prefix to all the table names to avoid conflicts.\nDo not use spaces.\n\nThis field is usually left empty.",
+       "config-db-charset": "Database character set",
+       "config-charset-mysql5-binary": "MySQL 4.1/5.0 binary",
+       "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
+       "config-charset-mysql4": "MySQL 4.0 backwards-compatible UTF-8",
+       "config-charset-help": "<strong>Warning:</strong> If you use <strong>backwards-compatible UTF-8</strong> on MySQL 4.1+, and subsequently back up the database with <code>mysqldump</code>, it may destroy all non-ASCII characters, irreversibly corrupting your backups!\n\nIn <strong>binary mode</strong>, MediaWiki stores UTF-8 text to the database in binary fields.\nThis is more efficient than MySQL's UTF-8 mode, and allows you to use the full range of Unicode characters.\nIn <strong>UTF-8 mode</strong>, MySQL will know what character set your data is in, and can present and convert it appropriately,\nbut it will not let you store characters above the [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
+       "config-mysql-old": "MySQL $1 or later is required. You have $2.",
+       "config-db-port": "Database port:",
+       "config-db-schema": "Schema for MediaWiki:",
+       "config-db-schema-help": "This schema will usually be fine.\nOnly change it if you know you need to.",
+       "config-pg-test-error": "Cannot connect to database <strong>$1</strong>: $2",
+       "config-sqlite-dir": "SQLite data directory:",
+       "config-sqlite-dir-help": "SQLite stores all data in a single file.\n\nThe directory you provide must be writable by the webserver during installation.\n\nIt should <strong>not</strong> be accessible via the web; this is why we're not putting it where your PHP files are.\n\nThe installer will write a <code>.htaccess</code> file along with it, but if that fails someone can gain access to your raw database.\nThat includes raw user data (email addresses, hashed passwords) as well as deleted revisions and other restricted data on the wiki.\n\nConsider putting the database somewhere else altogether, for example in <code>/var/lib/mediawiki/yourwiki</code>.",
+       "config-oracle-def-ts": "Default tablespace:",
+       "config-oracle-temp-ts": "Temporary tablespace:",
+       "config-type-mysql": "MySQL (or compatible)",
+       "config-type-postgres": "PostgreSQL",
+       "config-type-sqlite": "SQLite",
+       "config-type-oracle": "Oracle",
+       "config-type-mssql": "Microsoft SQL Server",
+       "config-support-info": "MediaWiki supports the following database systems:\n\n$1\n\nIf you do not see the database system you are trying to use listed below, then follow the instructions linked above to enable support.",
+       "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] is the primary target for MediaWiki and is best supported. MediaWiki also works with [{{int:version-db-mariadb-url}} MariaDB] and [{{int:version-db-percona-url}} Percona Server], which are MySQL compatible. ([http://www.php.net/manual/en/mysqli.installation.php How to compile PHP with MySQL support])",
+       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] is a popular open source database system as an alternative to MySQL. There may be some minor outstanding bugs, and it is not recommended for use in a production environment. ([http://www.php.net/manual/en/pgsql.installation.php How to compile PHP with PostgreSQL support])",
+       "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] is a lightweight database system that is very well supported. ([http://www.php.net/manual/en/pdo.installation.php How to compile PHP with SQLite support], uses PDO)",
+       "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] is a commercial enterprise database. ([http://www.php.net/manual/en/oci8.installation.php How to compile PHP with OCI8 support])",
+       "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] is a commercial enterprise database for Windows. ([http://www.php.net/manual/en/sqlsrv.installation.php How to compile PHP with SQLSRV support])",
+       "config-header-mysql": "MySQL settings",
+       "config-header-postgres": "PostgreSQL settings",
+       "config-header-sqlite": "SQLite settings",
+       "config-header-oracle": "Oracle settings",
+       "config-header-mssql": "Microsoft SQL Server settings",
+       "config-invalid-db-type": "Invalid database type.",
+       "config-missing-db-name": "You must enter a value for \"{{int:config-db-name}}\".",
+       "config-missing-db-host": "You must enter a value for \"{{int:config-db-host}}\".",
+       "config-missing-db-server-oracle": "You must enter a value for \"{{int:config-db-host-oracle}}\".",
+       "config-invalid-db-server-oracle": "Invalid database TNS \"$1\".\nUse either \"TNS Name\" or an \"Easy Connect\" string ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle Naming Methods]).",
+       "config-invalid-db-name": "Invalid database name \"$1\".\nUse only ASCII letters (a-z, A-Z), numbers (0-9), underscores (_) and hyphens (-).",
+       "config-invalid-db-prefix": "Invalid database prefix \"$1\".\nUse only ASCII letters (a-z, A-Z), numbers (0-9), underscores (_) and hyphens (-).",
+       "config-connection-error": "$1.\n\nCheck the host, username and password and try again.",
+       "config-invalid-schema": "Invalid schema for MediaWiki \"$1\".\nUse only ASCII letters (a-z, A-Z), numbers (0-9) and underscores (_).",
+       "config-db-sys-create-oracle": "Installer only supports using a SYSDBA account for creating a new account.",
+       "config-db-sys-user-exists-oracle": "User account \"$1\" already exists. SYSDBA can only be used for creating of a new account!",
+       "config-postgres-old": "PostgreSQL $1 or later is required. You have $2.",
+       "config-mssql-old": "Microsoft SQL Server $1 or later is required. You have $2.",
+       "config-sqlite-name-help": "Choose a name that identifies your wiki.\nDo not use spaces or hyphens.\nThis will be used for the SQLite data file name.",
+       "config-sqlite-parent-unwritable-group": "Cannot create the data directory <code><nowiki>$1</nowiki></code>, because the parent directory <code><nowiki>$2</nowiki></code> is not writable by the webserver.\n\nThe installer has determined the user your webserver is running as.\nMake the <code><nowiki>$3</nowiki></code> directory writable by it to continue.\nOn a Unix/Linux system do:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
+       "config-sqlite-parent-unwritable-nogroup": "Cannot create the data directory <code><nowiki>$1</nowiki></code>, because the parent directory <code><nowiki>$2</nowiki></code> is not writable by the webserver.\n\nThe installer could not determine the user your webserver is running as.\nMake the <code><nowiki>$3</nowiki></code> directory globally writable by it (and others!) to continue.\nOn a Unix/Linux system do:\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
+       "config-sqlite-mkdir-error": "Error creating the data directory \"$1\".\nCheck the location and try again.",
+       "config-sqlite-dir-unwritable": "Unable to write to the directory \"$1\".\nChange its permissions so that the webserver can write to it, and try again.",
+       "config-sqlite-connection-error": "$1.\n\nCheck the data directory and database name below and try again.",
+       "config-sqlite-readonly": "The file <code>$1</code> is not writeable.",
+       "config-sqlite-cant-create-db": "Could not create database file <code>$1</code>.",
+       "config-sqlite-fts3-downgrade": "PHP is missing FTS3 support, downgrading tables.",
+       "config-can-upgrade": "There are MediaWiki tables in this database.\nTo upgrade them to MediaWiki $1, click <strong>Continue</strong>.",
+       "config-upgrade-done": "Upgrade complete.\n\nYou can now [$1 start using your wiki].\n\nIf you want to regenerate your <code>LocalSettings.php</code> file, click the button below.\nThis is <strong>not recommended</strong> unless you are having problems with your wiki.",
+       "config-upgrade-done-no-regenerate": "Upgrade complete.\n\nYou can now [$1 start using your wiki].",
+       "config-regenerate": "Regenerate LocalSettings.php →",
+       "config-show-table-status": "<code>SHOW TABLE STATUS</code> query failed!",
+       "config-unknown-collation": "<strong>Warning:</strong> Database is using unrecognized collation.",
+       "config-db-web-account": "Database account for web access",
+       "config-db-web-help": "Select the username and password that the web server will use to connect to the database server, during ordinary operation of the wiki.",
+       "config-db-web-account-same": "Use the same account as for installation",
+       "config-db-web-create": "Create the account if it does not already exist",
+       "config-db-web-no-create-privs": "The account you specified for installation does not have enough privileges to create an account.\nThe account you specify here must already exist.",
+       "config-mysql-engine": "Storage engine:",
+       "config-mysql-innodb": "InnoDB",
+       "config-mysql-myisam": "MyISAM",
+       "config-mysql-myisam-dep": "<strong>Warning:</strong> You have selected MyISAM as storage engine for MySQL, which is not recommended for use with MediaWiki, because:\n* it barely supports concurrency due to table locking\n* it is more prone to corruption than other engines\n* the MediaWiki codebase does not always handle MyISAM as it should\n\nIf your MySQL installation supports InnoDB, it is highly recommended that you choose that instead.\nIf your MySQL installation does not support InnoDB, maybe it's time for an upgrade.",
+       "config-mysql-only-myisam-dep": "<strong>Warning:</strong> MyISAM is the only available storage engine for MySQL on this machine, and this is not recommended for use with MediaWiki, because:\n* it barely supports concurrency due to table locking\n* it is more prone to corruption than other engines\n* the MediaWiki codebase does not always handle MyISAM as it should\n\nYour MySQL installation does not support InnoDB, maybe it's time for an upgrade.",
+       "config-mysql-engine-help": "<strong>InnoDB</strong> is almost always the best option, since it has good concurrency support.\n\n<strong>MyISAM</strong> may be faster in single-user or read-only installations.\nMyISAM databases tend to get corrupted more often than InnoDB databases.",
+       "config-mysql-charset": "Database character set:",
+       "config-mysql-binary": "Binary",
+       "config-mysql-utf8": "UTF-8",
+       "config-mysql-charset-help": "In <strong>binary mode</strong>, MediaWiki stores UTF-8 text to the database in binary fields.\nThis is more efficient than MySQL's UTF-8 mode, and allows you to use the full range of Unicode characters.\n\nIn <strong>UTF-8 mode</strong>, MySQL will know what character set your data is in, and can present and convert it appropriately, but it will not let you store characters above the [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
+       "config-mssql-auth": "Authentication type:",
+       "config-mssql-install-auth": "Select the authentication type that will be used to connect to the database during the installation process.\nIf you select \"{{int:config-mssql-windowsauth}}\", the credentials of whatever user the webserver is running as will be used.",
+       "config-mssql-web-auth": "Select the authentication type that the web server will use to connect to the database server, during ordinary operation of the wiki.\nIf you select \"{{int:config-mssql-windowsauth}}\", the credentials of whatever user the webserver is running as will be used.",
+       "config-mssql-sqlauth": "SQL Server Authentication",
+       "config-mssql-windowsauth": "Windows Authentication",
+       "config-site-name": "Name of wiki:",
+       "config-site-name-help": "This will appear in the title bar of the browser and in various other places.",
+       "config-site-name-blank": "Enter a site name.",
+       "config-project-namespace": "Project namespace:",
+       "config-ns-generic": "Project",
+       "config-ns-site-name": "Same as the wiki name: $1",
+       "config-ns-other": "Other (specify)",
+       "config-ns-other-default": "MyWiki",
+       "config-project-namespace-help": "Following Wikipedia's example, many wikis keep their policy pages separate from their content pages, in a \"'''project namespace'''\".\nAll page titles in this namespace start with a certain prefix, which you can specify here.\nUsually, this prefix is derived from the name of the wiki, but it cannot contain punctuation characters such as \"#\" or \":\".",
+       "config-ns-invalid": "The specified namespace \"<nowiki>$1</nowiki>\" is invalid.\nSpecify a different project namespace.",
+       "config-ns-conflict": "The specified namespace \"<nowiki>$1</nowiki>\" conflicts with a default MediaWiki namespace.\nSpecify a different project namespace.",
+       "config-admin-box": "Administrator account",
+       "config-admin-name": "Your username:",
+       "config-admin-password": "Password:",
+       "config-admin-password-confirm": "Password again:",
+       "config-admin-help": "Enter your preferred username here, for example \"Joe Bloggs\".\nThis is the name you will use to log in to the wiki.",
+       "config-admin-name-blank": "Enter an administrator username.",
+       "config-admin-name-invalid": "The specified username \"<nowiki>$1</nowiki>\" is invalid.\nSpecify a different username.",
+       "config-admin-password-blank": "Enter a password for the administrator account.",
+       "config-admin-password-mismatch": "The two passwords you entered do not match.",
+       "config-admin-email": "Email address:",
+       "config-admin-email-help": "Enter an email address here to allow you to receive email from other users on the wiki, reset your password, and be notified of changes to pages on your watchlist. You can leave this field empty.",
+       "config-admin-error-user": "Internal error when creating an admin with the name \"<nowiki>$1</nowiki>\".",
+       "config-admin-error-password": "Internal error when setting a password for the admin \"<nowiki>$1</nowiki>\": <pre>$2</pre>",
+       "config-admin-error-bademail": "You have entered an invalid email address.",
+       "config-subscribe": "Subscribe to the [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce release announcements mailing list].",
+       "config-subscribe-help": "This is a low-volume mailing list used for release announcements, including important security announcements.\nYou should subscribe to it and update your MediaWiki installation when new versions come out.",
+       "config-subscribe-noemail": "You tried to subscribe to the release announcements mailing list without providing an email address.\nPlease provide an email address if you wish to subscribe to the mailing list.",
+       "config-almost-done": "You are almost done!\nYou can now skip the remaining configuration and install the wiki right now.",
+       "config-optional-continue": "Ask me more questions.",
+       "config-optional-skip": "I'm bored already, just install the wiki.",
+       "config-profile": "User rights profile:",
+       "config-profile-wiki": "Open wiki",
+       "config-profile-no-anon": "Account creation required",
+       "config-profile-fishbowl": "Authorized editors only",
+       "config-profile-private": "Private wiki",
+       "config-profile-help": "Wikis work best when you let as many people edit them as possible.\nIn MediaWiki, it is easy to review the recent changes, and to revert any damage that is done by naive or malicious users.\n\nHowever, many have found MediaWiki to be useful in a wide variety of roles, and sometimes it is not easy to convince everyone of the benefits of the wiki way.\nSo you have the choice.\n\nThe <strong>{{int:config-profile-wiki}}</strong> model allows anyone to edit, without even logging in.\nA wiki with <strong>{{int:config-profile-no-anon}}</strong> provides extra accountability, but may deter casual contributors.\n\nThe <strong>{{int:config-profile-fishbowl}}</strong> scenario allows approved users to edit, but the public can view the pages, including history.\nA <strong>{{int:config-profile-private}}</strong> only allows approved users to view pages, with the same group allowed to edit.\n\nMore complex user rights configurations are available after installation, see the [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights relevant manual entry].",
+       "config-license": "Copyright and license:",
+       "config-license-none": "No license footer",
+       "config-license-cc-by-sa": "Creative Commons Attribution-ShareAlike",
+       "config-license-cc-by": "Creative Commons Attribution",
+       "config-license-cc-by-nc-sa": "Creative Commons Attribution-NonCommercial-ShareAlike",
+       "config-license-cc-0": "Creative Commons Zero (Public Domain)",
+       "config-license-gfdl": "GNU Free Documentation License 1.3 or later",
+       "config-license-pd": "Public Domain",
+       "config-license-cc-choose": "Select a custom Creative Commons license",
+       "config-license-help": "Many public wikis put all contributions under a [http://freedomdefined.org/Definition free license].\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>Creative Commons Attribution Share Alike</strong>.\n\nWikipedia previously used the GNU Free Documentation License.\nThe GFDL is a valid license, but it is difficult to understand.\nIt is also difficult to reuse content licensed under the GFDL.",
+       "config-email-settings": "Email settings",
+       "config-enable-email": "Enable outbound email",
+       "config-enable-email-help": "If you want email to work, [http://www.php.net/manual/en/mail.configuration.php PHP's mail settings] need to be configured correctly.\nIf you do not want any email features, you can disable them here.",
+       "config-email-user": "Enable user-to-user email",
+       "config-email-user-help": "Allow all users to send each other email if they have enabled it in their preferences.",
+       "config-email-usertalk": "Enable user talk page notification",
+       "config-email-usertalk-help": "Allow users to receive notifications on user talk page changes, if they have enabled it in their preferences.",
+       "config-email-watchlist": "Enable watchlist notification",
+       "config-email-watchlist-help": "Allow users to receive notifications about their watched pages if they have enabled it in their preferences.",
+       "config-email-auth": "Enable email authentication",
+       "config-email-auth-help": "If this option is enabled, users have to confirm their email address using a link sent to them whenever they set or change it.\nOnly authenticated email addresses can receive emails from other users or change notification emails.\nSetting this option is <strong>recommended</strong> for public wikis because of potential abuse of the email features.",
+       "config-email-sender": "Return email address:",
+       "config-email-sender-help": "Enter the email address to use as the return address on outbound email.\nThis is where bounces will be sent.\nMany mail servers require at least the domain name part to be valid.",
+       "config-upload-settings": "Images and file uploads",
+       "config-upload-enable": "Enable file uploads",
+       "config-upload-help": "File uploads potentially expose your server to security risks.\nFor more information, read the [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security security section] in the manual.\n\nTo enable file uploads, change the mode on the <code>images</code> subdirectory under MediaWiki's root directory so that the web server can write to it.\nThen enable this option.",
+       "config-upload-deleted": "Directory for deleted files:",
+       "config-upload-deleted-help": "Choose a directory in which to archive deleted files.\nIdeally, this should not be accessible from the web.",
+       "config-logo": "Logo URL:",
+       "config-logo-help": "MediaWiki's default skin includes space for a 135x160 pixel logo above the sidebar menu.\nUpload an image of the appropriate size, and enter the URL here.\n\nYou can use <code>$wgStylePath</code> or <code>$wgScriptPath</code> if your logo is relative to those paths.\n\nIf you do not want a logo, leave this box blank.",
+       "config-instantcommons": "Enable Instant Commons",
+       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] is a feature that allows wikis to use images, sounds and other media found on the [//commons.wikimedia.org/ Wikimedia Commons] site.\nIn order to do this, MediaWiki requires access to the Internet.\n\nFor more information on this feature, including instructions on how to set it up for wikis other than the Wikimedia Commons, consult [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos the manual].",
+       "config-cc-error": "The Creative Commons license chooser gave no result.\nEnter the license name manually.",
+       "config-cc-again": "Pick again...",
+       "config-cc-not-chosen": "Choose which Creative Commons license you want and click \"proceed\".",
+       "config-advanced-settings": "Advanced configuration",
+       "config-cache-options": "Settings for object caching:",
+       "config-cache-help": "Object caching is used to improve the speed of MediaWiki by caching frequently used data.\nMedium to large sites are highly encouraged to enable this, and small sites will see benefits as well.",
+       "config-cache-none": "No caching (no functionality is removed, but speed may be impacted on larger wiki sites)",
+       "config-cache-accel": "PHP object caching (APC, XCache or WinCache)",
+       "config-cache-memcached": "Use Memcached (requires additional setup and configuration)",
+       "config-memcached-servers": "Memcached servers:",
+       "config-memcached-help": "List of IP addresses to use for Memcached.\nShould specify one per line and specify the port to be used. For example:\n 127.0.0.1:11211\n 192.168.1.25:1234",
+       "config-memcache-needservers": "You selected Memcached as your cache type but did not specify any servers.",
+       "config-memcache-badip": "You have entered an invalid IP address for Memcached: $1.",
+       "config-memcache-noport": "You did not specify a port to use for Memcached server: $1.\nIf you do not know the port, the default is 11211.",
+       "config-memcache-badport": "Memcached port numbers should be between $1 and $2.",
+       "config-extensions": "Extensions",
+       "config-extensions-help": "The extensions listed above were detected in your <code>./extensions</code> directory.\n\nThey may require additional configuration, but you can enable them now.",
+       "config-install-alreadydone": "<strong>Warning:</strong> You seem to have already installed MediaWiki and are trying to install it again.\nPlease proceed to the next page.",
+       "config-install-begin": "By pressing \"{{int:config-continue}}\", you will begin the installation of MediaWiki.\nIf you still want to make changes, press \"{{int:config-back}}\".",
+       "config-install-step-done": "done",
+       "config-install-step-failed": "failed",
+       "config-install-extensions": "Including extensions",
+       "config-install-database": "Setting up database",
+       "config-install-schema": "Creating schema",
+       "config-install-pg-schema-not-exist": "PostgreSQL schema does not exist.",
+       "config-install-pg-schema-failed": "Tables creation failed.\nMake sure that the user \"$1\" can write to the schema \"$2\".",
+       "config-install-pg-commit": "Committing changes",
+       "config-install-pg-plpgsql": "Checking for language PL/pgSQL",
+       "config-pg-no-plpgsql": "You need to install the language PL/pgSQL in the database $1",
+       "config-pg-no-create-privs": "The account you specified for installation does not have enough privileges to create an account.",
+       "config-pg-not-in-role": "The account you specified for the web user already exists.\nThe account you specified for installation is not a superuser and is not a member of the web user's role, so it is unable to create objects owned by the web user.\n\nMediaWiki currently requires that the tables be owned by the web user. Please specify another web account name, or click \"back\" and specify a suitably privileged install user.",
+       "config-install-user": "Creating database user",
+       "config-install-user-alreadyexists": "User \"$1\" already exists",
+       "config-install-user-create-failed": "Creating user \"$1\" failed: $2",
+       "config-install-user-grant-failed": "Granting permission to user \"$1\" failed: $2",
+       "config-install-user-missing": "The specified user \"$1\" does not exist.",
+       "config-install-user-missing-create": "The specified user \"$1\" does not exist.\nPlease click the \"create account\" checkbox below if you want to create it.",
+       "config-install-tables": "Creating tables",
+       "config-install-tables-exist": "<strong>Warning:</strong> MediaWiki tables seem to already exist.\nSkipping creation.",
+       "config-install-tables-failed": "<strong>Error:</strong> Table creation failed with the following error: $1",
+       "config-install-interwiki": "Populating default interwiki table",
+       "config-install-interwiki-list": "Could not read file <code>interwiki.list</code>.",
+       "config-install-interwiki-exists": "<strong>Warning:</strong> The interwiki table seems to already have entries.\nSkipping default list.",
+       "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-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.",
+       "config-install-mainpage": "Creating main page with default content",
+       "config-install-extension-tables": "Creating tables for enabled extensions",
+       "config-install-mainpage-failed": "Could not insert main page: $1",
+       "config-install-done": "<strong>Congratulations!</strong>\nYou have successfully installed MediaWiki.\n\nThe installer has generated a <code>LocalSettings.php</code> file.\nIt contains all your configuration.\n\nYou will need to download it and put it in the base of your wiki installation (the same directory as index.php). The download should have started automatically.\n\nIf the download was not offered, or if you cancelled it, you can restart the download by clicking the link below:\n\n$3\n\n<strong>Note:</strong> If you do not do this now, this generated configuration file will not be available to you later if you exit the installation without downloading it.\n\nWhen that has been done, you can <strong>[$2 enter your wiki]</strong>.",
+       "config-download-localsettings": "Download <code>LocalSettings.php</code>",
+       "config-help": "help",
+       "config-help-tooltip": "click to expand",
+       "config-nofile": "File \"$1\" could not be found. Has it been deleted?",
+       "config-extension-link": "Did you know that your wiki supports [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensions]?\n\nYou can browse [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensions by category] or the [//www.mediawiki.org/wiki/Extension_Matrix Extension Matrix] to see the full list of extensions.",
+       "mainpagetext": "<strong>MediaWiki has been successfully installed.</strong>",
+       "mainpagedocfooter": "Consult the [//meta.wikimedia.org/wiki/Help:Contents User's Guide] for information on using the wiki software.\n\n== Getting started ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]"
 }
index 3e8792d..71da7f2 100644 (file)
@@ -41,5 +41,5 @@
        "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
        "config-type-mysql": "MySQL (aŭ kongrua)",
        "mainpagetext": "'''MediaWiki estis sukcese instalita.'''",
-       "mainpagedocfooter": "Konsultu la [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Gvidilon por uzantoj de MediaWiki] por informoj pri uzado de vikia programaro.\n\n==Kiel komenci==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Listo de konfiguraĵoj] (angle)\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki Oftaj Demandoj] (angle)\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Anonco-dissendolisto pri MediaWiki] (angle)\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Preklad MediaWiki do tvojho jazyka]"
+       "mainpagedocfooter": "Konsultu la [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Gvidilon por uzantoj de MediaWiki] por informoj pri uzado de vikia programaro.\n\n==Kiel komenci==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Listo de konfiguraĵoj] (angle)\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki Oftaj Demandoj] (angle)\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Anonco-dissendolisto pri MediaWiki] (angle)\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Preklad MediaWiki do tvojho jazyka]"
 }
index cb9ed47..3e8c7e5 100644 (file)
@@ -1,8 +1,9 @@
 {
        "@metadata": {
                "authors": [
-                       "Dferg"
+                       "Dferg",
+                       "Seb35"
                ]
        },
-       "mainpagedocfooter": "Consulte usted la [//meta.wikimedia.org/wiki/Ayuda:Contenido Guía de usuario] para obtener información sobre el uso del software wiki.\n\n== Empezando ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista de ajustes de configuración]\n* [//www.mediawiki.org/wiki/Manual:FAQ/es FAQ de MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo de anuncios de distribución de MediaWiki]"
+       "mainpagedocfooter": "Consulte usted la [//meta.wikimedia.org/wiki/Help:Contents/es Guía de usuario] para obtener información sobre el uso del software wiki.\n\n== Empezando ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista de ajustes de configuración]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/es FAQ de MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo de anuncios de distribución de MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Regionalizar MediaWiki para su idioma]"
 }
index 8ee1c9d..80ef1a7 100644 (file)
@@ -18,7 +18,9 @@
                        "Carlitosag",
                        "Chocolate con galleta",
                        "Csbotero",
-                       "Sporeunai"
+                       "Sporeunai",
+                       "Ihojose",
+                       "Seb35"
                ]
        },
        "config-desc": "El instalador de MediaWiki",
        "config-restart": "Sí, reiniciarlo",
        "config-welcome": "=== Comprobación del entorno ===\nAhora se van a realizar comprobaciones básicas para ver si el entorno es adecuado para la instalación de MediaWiki.\nRecuerda suministrar los resultados de tales comprobaciones si necesitas ayuda para completar la instalación.",
        "config-copyright": "=== Derechos de autor y Términos de uso ===\n\n$1\n\nEste programa es software libre; puedes redistribuirlo y/o modificarlo en los términos de la Licencia Pública General de GNU, tal como aparece publicada por la Fundación para el Software Libre, tanto la versión 2 de la Licencia, como cualquier versión posterior (según prefiera).\n\nEste programa es distribuido en la esperanza de que sea útil, pero '''sin cualquier garantía'''; inclusive, sin la garantía implícita de la '''posibilidad de ser comercializado''' o de '''idoneidad para cualquier finalidad específica'''.\nConsulte la licencia *GNU General *Public *License para más detalles.\n\nEn conjunto con este programa debe haber recibido <doclink href=Copying>una copia de la Licencia Pública General de GNU</doclink>; si no la recibió, pídala por escrito a Fundación para el Software Libre, Inc., 51 Franklin Street, Fifth Floor, Boston, ME La 02110-1301, USA o [http://www.gnu.org/copyleft/gpl.html léala en internet].",
-       "config-sidebar": "* [//www.mediawiki.org Página principal de MediaWiki]\n* [//www.mediawiki.org/wiki/Help:Contents Guía del usuario]\n* [//www.mediawiki.org/wiki/Manual:Contents Guía del administrador]\n* [//www.mediawiki.org/wiki/Manual:FAQ Preguntas frecuentes]\n----\n* <doclink href=Readme>Léeme</doclink>\n* <doclink href=ReleaseNotes>Notas de la versión</doclink>\n* <doclink href=Copying>Copia</doclink>\n* <doclink href=UpgradeDoc>Actualización</doclink>",
+       "config-sidebar": "* [//www.mediawiki.org Página principal de MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Guía del usuario]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Guía del administrador]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Preguntas frecuentes]\n----\n* <doclink href=Readme>Léeme</doclink>\n* <doclink href=ReleaseNotes>Notas de la versión</doclink>\n* <doclink href=Copying>Copia</doclink>\n* <doclink href=UpgradeDoc>Actualización</doclink>",
        "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-php-toolow": "PHP $1 está instalado.\nSin embargo, MediaWiki requiere PHP $2 o superior.",
        "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/Unicode_normalization_considerations normalización Unicode].",
-       "config-unicode-update-warning": "'''Warning''': La versión instalada del contenedor de normalización Unicode usa una versión anterior de la biblioteca del [http://site.icu-project.org/ proyecto ICU].\nDeberás [//www.mediawiki.org/wiki/Unicode_normalization_considerations actualizar] si realmente deseas usar 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-unicode-update-warning": "'''Warning''': La versión instalada del contenedor de normalización Unicode usa una versión anterior de la biblioteca del [http://site.icu-project.org/ proyecto ICU].\nDeberás [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations actualizar] si realmente deseas usar Unicode.",
        "config-no-db": "¡No fue posible encontrar un controlador adecuado para la base de datos! Necesitas instalar un controlador de base de datos para PHP.\nLos siguientes sistemas gestores de bases de datos están soportados: $1.\n\nSi compilaste PHP tú mismo, debes reconfigurarlo habilitando un cliente de base de datos, por ejemplo, usando <code>./configure --with-mysqli</code>.\nSi instalaste PHP desde un paquete Debian o Ubuntu, entonces también necesitas instalar, por ejemplo, el paquete <code>php5-mysql</code>.",
        "config-outdated-sqlite": "''' Advertencia ''': tiene la versión SQLite $1, que es inferior a la mínima versión requerida: $2 . SQLite no estará disponible.",
        "config-no-fts3": "'''Advertencia''': SQLite está compilado sin el [//sqlite.org/fts3.html módulo FTS3]. Las funcionalidades de búsqueda no estarán disponibles en esta instalación.",
        "config-no-cli-uri": "''' Advertencia ''': No se ha especificado ningún <code>--scriptpath</code>, por defecto se usará: <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-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/Manual:Security#Upload_security cerrar esta vulnerabilidad de seguridad] antes de activar las cargas.",
+       "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-profile-no-anon": "Creación de cuenta requerida",
        "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/Manual:User_rights esta entrada en el manual].",
+       "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-none": "Pie sin licencia",
        "config-license-cc-by-sa": "Creative Commons Reconocimiento Compartir Igual",
        "config-email-sender-help": "Introduce la dirección de correo electrónico que será usada como dirección de retorno en los mensajes electrónicos de salida.\nAquí llegarán los correos electrónicos que no lleguen a su destino.\nMuchos servidores de correo electrónico exigen que por lo menos la parte del nombre del dominio sea válida.",
        "config-upload-settings": "Cargas de imágenes y archivos",
        "config-upload-enable": "Habilitar la subida de archivos",
-       "config-upload-help": "La carga de archivos expone potencialmente su servidor a riesgos de seguridad.\nPara obtener más información, lea la [//www.mediawiki.org/wiki/Manual:Security sección de seguridad] en el manual.\n\nPara habilitar la carga de archivos, cambie el modo en el subdirectorio <code>images</code> bajo el directorio raíz de MediaWiki para que el servidor web pueda escribir en él.\nA continuación, habilite esta opción.",
+       "config-upload-help": "La carga de archivos expone potencialmente su servidor a riesgos de seguridad.\nPara obtener más información, lea la [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security sección de seguridad] en el manual.\n\nPara habilitar la carga de archivos, cambie el modo en el subdirectorio <code>images</code> bajo el directorio raíz de MediaWiki para que el servidor web pueda escribir en él.\nA continuación, habilite esta opción.",
        "config-upload-deleted": "*Directorio para los archivos eliminados:",
        "config-upload-deleted-help": "Elige un directorio en el que guardar los archivos eliminados.\nLo ideal es una carpeta no accesible desde la red.",
        "config-logo": "URL del logo :",
        "config-logo-help": "La apariencia por defecto de MediaWiki incluye espacio para un logotipo de 135x160 píxeles encima del menú de la barra lateral.\nCargua una imagen de tamaño adecuado e introduce la dirección URL aquí.\n\nPuedes usar <code>$wgStylePath</code> o <code>$wgScriptPath</code> si tu logotipo es relativo a esas rutas.\n\nSi no deseas un logotipo, deja esta casilla en blanco.",
        "config-instantcommons": "Habilitar Instant Commons",
-       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] es una característica que permite que los wikis puedan utilizar imágenes, sonidos y otros archivos multimedia que se encuentran en el sitio [//commons.wikimedia.org/ Wikimedia Commons].\nPara ello, MediaWiki requiere acceso a Internet.\n\nPara obtener más información sobre esta función, incluidas las instrucciones sobre cómo configurarlo para otras wikis distintas de Wikimedia Commons, consulte [//mediawiki.org/wiki/Manual:$wgForeignFileRepos el manual].",
+       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] es una característica que permite que los wikis puedan utilizar imágenes, sonidos y otros archivos multimedia que se encuentran en el sitio [//commons.wikimedia.org/ Wikimedia Commons].\nPara ello, MediaWiki requiere acceso a Internet.\n\nPara obtener más información sobre esta función, incluidas las instrucciones sobre cómo configurarlo para otras wikis distintas de Wikimedia Commons, consulte [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos el manual].",
        "config-cc-error": "El selector de licencia de Creative Commons no dio resultado.\nEscribe el nombre de la licencia manualmente.",
        "config-cc-again": "Elegir otra vez...",
        "config-cc-not-chosen": "Elige la licencia Creative Commons que desees y haz clic en \"continuar\".",
        "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-subscribe-fail": "No se ha podido suscribir a mediawiki-announce: $1",
-       "config-install-subscribe-notpossible": "cURL no está instalado y allow_url_fopen no está disponible.",
+       "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-extension-tables": "Creando las tablas para las extensiones habilitadas",
        "config-install-mainpage-failed": "No se pudo insertar la página principal: $1",
-       "config-install-done": "''' Felicidades!'''\nHa instalado MediaWiki correctamente.\n\nEl instalador ha generado un  archivo<code>LocalSettings.php</code>.\nContiene toda su configuración.\n\nDeberá descargarlo y ponerlo en la base de la instalación de wiki (el mismo directorio que index.php). Debería haber comenzado automáticamente la descarga.\n\nSi no comenzó la descarga, o si se ha cancelado, puede reiniciar la descarga haciendo clic en el enlace siguiente:\n$3\n\n'''Nota''': Si no haces esto ahora, este archivo de configuración generado no estará disponible para usted más tarde si sale de la instalación sin descargarlo.\n\nCuando lo haya hecho, usted puede '''[$2  entrar en su wiki]'''.",
+       "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-nofile": "El archivo \"$1\" no se pudo encontrar. ¿Se ha eliminado?",
-       "config-extension-link": "¿Sabías que tu wiki soporta [//www.mediawiki.org/wiki/Manual:Extensions extensiones]?\n\nPuedes navegar las [//www.mediawiki.org/wiki/Category:Extensions_by_category extensiones por categoría] o la [//www.mediawiki.org/wiki/Extension_Matrix matriz de extensiones] para ver la lista completa de extensiones.",
+       "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.'''",
-       "mainpagedocfooter": "Consulta la [//meta.wikimedia.org/wiki/Ayuda:Guía del usuario de contenidos] para obtener información sobre el uso del software wiki.\n\n== Empezando ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista de ajustes de configuración]\n* [//www.mediawiki.org/wiki/Manual:FAQ/es FAQ de MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo de anuncios de distribución de MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Regionalizar MediaWiki para tu idioma]"
+       "mainpagedocfooter": "Consulta la [//meta.wikimedia.org/wiki/Help:Contents/es Guía del usuario] para obtener información sobre el uso del software wiki.\n\n== Empezando ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista de ajustes de configuración]\n* [//www.mediawiki.org/wiki/Manual:FAQ/es FAQ de MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo de anuncios de distribución de MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Regionalizar MediaWiki para tu idioma]"
 }
index 1376909..1c46557 100644 (file)
@@ -62,5 +62,5 @@
        "config-install-tables": "Tabelite loomine",
        "config-help": "abi",
        "mainpagetext": "'''MediaWiki tarkvara on edukalt paigaldatud.'''",
-       "mainpagedocfooter": "Vikitarkvara kasutamise kohta leiad lisateavet [//meta.wikimedia.org/wiki/Help:Contents juhendist].\n\n== Alustamine ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Häälestussätete loend]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki KKK]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki versiooniuuenduste postiloend]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources MediaWiki lokaliseerimine]"
+       "mainpagedocfooter": "Vikitarkvara kasutamise kohta leiad lisateavet [//meta.wikimedia.org/wiki/Help:Contents juhendist].\n\n== Alustamine ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Häälestussätete loend]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki KKK]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki versiooniuuenduste postiloend]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources MediaWiki lokaliseerimine]"
 }
index 6621886..4b32743 100644 (file)
@@ -28,7 +28,7 @@
        "config-page-copying": "Kopiatzea",
        "config-page-upgradedoc": "Eguneratu",
        "config-restart": "Bai, berriz hasi",
-       "config-sidebar": "* [//www.mediawiki.org MediaWiki nagusia]\n* [//www.mediawiki.org/wiki/Help:Contents Erabiltzaileentzako Gida]\n* [//www.mediawiki.org/wiki/Manual:Contents Administratzaileentzako Gida]\n* [//www.mediawiki.org/wiki/Manual:FAQ MEG]\n----\n* <doclink href=Readme>Irakur nazazu</doclink>\n* <doclink href=ReleaseNotes>Oharren argitalpena</doclink>\n* <doclink href=Copying>Kopiaketa</doclink>\n* <doclink href=UpgradeDoc>Eguneratzea</doclink>",
+       "config-sidebar": "* [//www.mediawiki.org MediaWiki nagusia]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Erabiltzaileentzako Gida]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Administratzaileentzako Gida]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MEG]\n----\n* <doclink href=Readme>Irakur nazazu</doclink>\n* <doclink href=ReleaseNotes>Oharren argitalpena</doclink>\n* <doclink href=Copying>Kopiaketa</doclink>\n* <doclink href=UpgradeDoc>Eguneratzea</doclink>",
        "config-env-php": "PHP $1 instalatuta dago.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] instalatuta dago",
        "config-apc": "[http://www.php.net/apc APC] instalatuta dago",
@@ -74,5 +74,5 @@
        "config-install-step-done": "egina",
        "config-help": "Laguntza",
        "mainpagetext": "'''MediaWiki arrakastaz instalatu da.'''",
-       "mainpagedocfooter": "Ikus [//meta.wikimedia.org/wiki/Help:Contents Erabiltzaile Gida] wiki softwarea erabiltzen hasteko informazio gehiagorako.\n\n== Nola hasi ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Konfigurazio balioen zerrenda]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ (Maiz egindako galderak)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWikiren argitalpenen posta zerrenda]"
+       "mainpagedocfooter": "Ikus [//meta.wikimedia.org/wiki/Help:Contents Erabiltzaile Gida] wiki softwarea erabiltzen hasteko informazio gehiagorako.\n\n== Nola hasi ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Konfigurazio balioen zerrenda]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ (Maiz egindako galderak)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWikiren argitalpenen posta zerrenda]"
 }
index 434a4ee..5259ea1 100644 (file)
@@ -1,5 +1,5 @@
 {
        "@metadata": [],
        "mainpagetext": "'''MeyaGüiqui s'á istalau satihatoriamenti.'''",
-       "mainpagedocfooter": "Consurta la [//meta.wikimedia.org/wiki/Help:Contents User's Guide] pa sabel mas al tentu el huncionamientu el software güiqui.\n\n== Esminciandu ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]"
+       "mainpagedocfooter": "Consurta la [//meta.wikimedia.org/wiki/Help:Contents User's Guide] pa sabel mas al tentu el huncionamientu el software güiqui.\n\n== Esminciandu ==\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 04d2ea9..23fe457 100644 (file)
        "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/Help:Contents راهنمای کاربر]\n* [//www.mediawiki.org/wiki/Manual:Contents راهنمای مدیر]\n* [//www.mediawiki.org/wiki/Manual:FAQ پرسش‌های رایج]\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 صفحهٔ اصلی مدیاویکی]\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-php-toolow": "پی‌اچ‌پی $1 نصب شده است.\nدر هر صورت، مدیاویکی نیاز به پی‌اچ‌پی نسخهٔ $2 یا بالاتر دارد.",
        "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/Unicode_normalization_considerations Unicode normalization] را بخوانید.",
-       "config-unicode-update-warning": "'''هشدار:''' نسخهٔ نصب شدهٔ پوشهٔ یونیکد عادی از ورژن قدیمی‌تر کتابخانه [http://site.icu-project.org/ the ICU project's] استفاده می‌کند.\nاگر کلاً علاقه‌مند به استفاده از یونیکد هستید باید [//www.mediawiki.org/wiki/Unicode_normalization_considerations upgrade].",
+       "config-unicode-pure-php-warning": "'''هشدار:''' [http://pecl.php.net/intl intl PECL extension] برای کنترل یونیکد عادی در دسترس نیست،اجرای کاملاً آهسته به تعویق می‌افتد.\nاگر شما یک سایت پر‌ ترافیک را اجرا می‌کنید، باید کمی [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode normalization] را بخوانید.",
+       "config-unicode-update-warning": "'''هشدار:''' نسخهٔ نصب شدهٔ پوشهٔ یونیکد عادی از ورژن قدیمی‌تر کتابخانه [http://site.icu-project.org/ the ICU project's] استفاده می‌کند.\nاگر کلاً علاقه‌مند به استفاده از یونیکد هستید باید [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations upgrade].",
        "config-no-db": "درایور پایگاه اطلاعاتی مناسب پیدا نشد! شما لازم دارید یک درایور پایگاه اطلاعاتی  برای پی‌اچ‌پی نصب کنید.انواع پایگاه اطلاعاتی زیر پشتیبانی شده‌اند:$1.\nاگر شما در گروه اشتراک‌گذاری هستید، از تهیه کنندهٔ گروه خود برای نصب یک درایور پایگاه اطلاعاتی مناسب سوأل کنید.\nاگر خود، پی‌اچ‌پی را تهیه کرده‌اید، با یک پردازشگر فعال دوباره پیکربندی کنید، برای مثال از <code>./configure --with-mysql</code> استفاده کنید.\nاگر پی‌اچ‌پی را از یک بستهٔ دبیان یا آبونتو نصب کرده‌اید، بنابراین لازم دارید بخش php5-mysql را نصب کنید.",
        "config-outdated-sqlite": "''' هشدار:''' شما اس‌کیولایت $1 دارید، که پایین‌تر از حداقل نسخهٔ $2 مورد نیاز است.اس‌کیولایت در دسترس نخواهد بود.",
        "config-no-fts3": "'''هشدار:''' اس‌کیولایت بدون [//sqlite.org/fts3.html FTS3 module] تهیه شده‌است ، جستجوی ویژگی‌ها در این بخش پیشین در دسترس نخواهد‌بود.",
@@ -86,7 +86,7 @@
        "config-no-cli-uri": "<strong>هشدار:</strong> هیچ اسکریپت‌پتی تعیین نشده، از پیش‌فرض استفاده کنید:\n<code>$1</code>.",
        "config-using-server": "از اسم سرور \"<nowiki>$1</nowiki>\" استفاده کنید.",
        "config-using-uri": "از اسم سرور \"<nowiki>$1$2</nowiki>\" استفاده کنید.",
-       "config-uploads-not-safe": "'''هشدار:''' فهرست پیش‌فرض ارسال‌های <code>$1</code> شما برای اجرای متون دلخواه آسیب‌پذیر است.\nاگرچه مدیاویکی همهٔ پوشه‌های ارسال‌ شده را برای خطرات امنیتی بررسی می‌کند، پیش از فعال‌سازی ارسال‌ها، بسیار به [//www.mediawiki.org/wiki/Manual:Security#Upload_security close this security vulnerability] توصیه شده‌است.",
+       "config-uploads-not-safe": "'''هشدار:''' فهرست پیش‌فرض ارسال‌های <code>$1</code> شما برای اجرای متون دلخواه آسیب‌پذیر است.\nاگرچه مدیاویکی همهٔ پوشه‌های ارسال‌ شده را برای خطرات امنیتی بررسی می‌کند، پیش از فعال‌سازی ارسال‌ها، بسیار به [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security close this security vulnerability] توصیه شده‌است.",
        "config-no-cli-uploads-check": "'''هشدار:''' فهرست پیش‌فرض ارسال‌های شما (<code>$1</code>) برای آسیب‌پذیری اجرای متن دلخواه در طول نصب سی‌ال آی بررسی نشده‌است.",
        "config-brokenlibxml": "دستگاه شما دارای تلفیقی از نسخه‌های پی‌اچ‌پی و لیبکسمل۲ است که ناقص است و می‌تواند دلیل از بین رفتن اطلاعات مخفی در مدیاویکی و دیگر برنامه‌های کاربردی شبکه باشد.\nارتقاء به لیبکسمل۲  ۲.۷.۳ یا بالاتر ([//bugs.php.net/bug.php?id=45996 bug filed with PHP]) ارتفاء دهید.\nنصب نافرجام ماند.",
        "config-suhosin-max-value-length": "سوهُسین نصب شده‌است و پارامتر جت <code>length</code> را به $1 بایت محدود می‌کند.\n قسمت بارکنندهٔ منبع مدیاویکی پیرامون این محدوده کار خواهد‌کرد، اما عملکرد آن را پایین می‌آورد. اگر به هیچ وجه ممکن نیست، باید <code>suhosin.get.max_value_length</code> را به ۱۰۲۴ یا بالاتر در <code>php.ini</code> تنظیم کنید، و \n<code>$wgResourceLoaderMaxQueryLength</code> را به مقدار مشابه در <code>LocalSettings.php</code> تنظیم کنید.",
        "config-db-username": "نام کاربری پایگاه اطلاعات:",
        "config-db-password": "گذرواژه پایگاه داده‌ها:",
        "config-db-password-empty": "لطفاً یک رمز عبور برای کاربر جدید پایگاه اطلا‌عاتی وارد کنید: $1\nدر صورتی که ممکن است کاربران بدون رمز عبور به وجود آیند،امن نیست.",
-       "config-db-username-empty": "شما باید یک مقدار برای \"نام کاربری پایگاه اطلاعاتی\" وارد کنید",
+       "config-db-username-empty": "شما باید یک مقدار برای \"نام کاربری {{int:config-db-username}}\" وارد کنید",
        "config-db-install-username": "نام کاربری را وارد کنید که برای اتصال به پایگاه اطلاعاتی در طول روند نصب استفاده خواهد‌شد.\nاین نام کاربری حساب مدیاویکی نیست; نام کاربری برای پایگاه اطلاعاتی شما است.",
        "config-db-install-password": "رمز عبوری را وارد کنید که برای اتصال به پایگاه اطلاعاتی در طول روند نصب استفاده خواهد‌شد.\nاین رمز عبور برای حساب مدیاویکی نیست;رمز عبور برای پایگاه اطلاعاتی شما است.",
        "config-db-install-help": "نام کاربری و رمز عبوری را وارد کنید که برای اتصال به پایگاه اطلاعاتی در طول روند نصب استفاده خواهد‌ٰشد.",
        "config-header-oracle": "تنظیمات اوراکل",
        "config-header-mssql": "تنظیمات سرور مایکرپسافت اس‌کیو‌ال",
        "config-invalid-db-type": "نوع پایگاه اطلاعاتی نامعتبر",
-       "config-missing-db-name": "شما باید یک مقدار برای \"نام پایگاه اطلاعاتی\" وارد کنید",
-       "config-missing-db-host": "شما باید یک مقدار برای \"گروه پایگاه اطلاعاتی\" وارد کنید",
-       "config-missing-db-server-oracle": "شما باید یک مقدار برای \"تی‌ان‌اس پایگاه اطلاعاتی\" وارد کنید",
+       "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 نامعتبر.\nیا از \"نام تی‌ان‌اس\" یا یک سلسله \"ارتباط آسان\" ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle Naming Methods]) استفاده کنید.",
        "config-invalid-db-name": "نام پایگاه اطلاعاتی نامعتبر \"$1\".\nفقط حروف اِی‌اس‌سی‌آی‌آی بزرگ (اِی-زدکوچک،اِی-زد بزرگ)،اعداد (۰-۹)،آندرلاین (_) و خط تیره کوتاه (-) استفاده کنید.",
        "config-invalid-db-prefix": "پیشوند پایگاه اطلاعاتی نامعتبر \"$1\".\nفقط حروف اِی‌اس‌سی‌آی‌آی بزرگ (اِی-زدکوچک،اِی-زد بزرگ)،اعداد (۰-۹)،آندرلاین (_) و خط تیره کوتاه (-) استفاده کنید.",
        "config-profile-no-anon": "ساخت کاربری مورد نیاز است",
        "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/Manual:User_rights راهنماهای مرتبط] موجود است.",
+       "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-license-none": "بدون پاورقی مجوز",
        "config-license-cc-by-sa": "اشتراک گذاری یکجور استناد رایج سازنده",
        "config-email-sender-help": "آدرس رایانامه‌ای را وارد کنید که هنگام مراجعت آدرس به رایانامهٔ خارجی استفاده می‌شود.\nبه جایی که پیام‌ها برگشت داده می‌شوند، فرستاده خواهد‌شد.\nبسیاری از سرورهای پستی حداقل به بخش نام عمومی معتبر نیاز دارند.",
        "config-upload-settings": "بارگذاری‌های پرونده و تصویر",
        "config-upload-enable": "فعال‌سازی بارگذاری پرونده",
-       "config-upload-help": "بارگذاری پرونده بصورت بالقوه می‌تواند کارساز شما در معرض خطرات امنیتی قرار بدهد. برای کسب اطلاعات بیشتر لطفاً [//www.mediawiki.org/wiki/Manual:Security قسمت امنیتی] را مطالعه کنید.\n\nبرای اجازه‌دادن به بارگذاری پرونده‌ها٬ حالت زیر مجموعه <code>images</code> در پوشه ریشه مدیاویکی را تغییر دهید که کارسازهای وب قادر به نوشتن بر روی آن باشند. سپس این قابلیت را فعال کنید.",
+       "config-upload-help": "بارگذاری پرونده بصورت بالقوه می‌تواند کارساز شما در معرض خطرات امنیتی قرار بدهد. برای کسب اطلاعات بیشتر لطفاً [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security قسمت امنیتی] را مطالعه کنید.\n\nبرای اجازه‌دادن به بارگذاری پرونده‌ها٬ حالت زیر مجموعه <code>images</code> در پوشه ریشه مدیاویکی را تغییر دهید که کارسازهای وب قادر به نوشتن بر روی آن باشند. سپس این قابلیت را فعال کنید.",
        "config-upload-deleted": "فهرست برای پوشه‌های حذف شده:",
        "config-upload-deleted-help": "فهرستی برای بایگانی کردن پوشه‌های حذف شده انتخاب کنید.\nبه طور مطلوب،از شبکه نباید در دسترس باشد.",
        "config-logo": "نشانی نامواره:",
        "config-logo-help": "پوستهٔ پیش‌فرض مدیاویکی شامل مکانی برای یک آرم ۱۳۵x۱۶۰ پیکسلی بالای منوی نوارکناری است.\nیک عکس با اندازهٔ مناسب ارسال کنید، و یوآرال را اینجا وارد کنید.\nاگر آرم شما با آن راه‌ها مزتبط است،می‌توانید از <code>$wgStylePath</code> یا <code>$wgScriptPath</code> استفاده کنید.\nاگر آرم نمی‌خواهید، این جعبه را خالی رها کنید.",
        "config-instantcommons": "فعال‌کردن فوری کامنز",
-       "config-instantcommons-help": "[//www.mediawiki.org/ ویکی و InstantCommons ویکی‌انبار فوری] یک ویژگی‌است که به شما اجازه می‌دهد تا تصاویر، صداها یا سایر رسانه‌های یافته شده بر روی [//commons.wikimedia.org/ انبار ویکی مدیا] را استفاده کنید.\n\nبرای استفاده از این ویژگی مدیاویکی نیازمند دسترسی به اینترنت است.\n\nبرای کسب اطلاعات بیشتر درباره این ویژگی٬ شامل دستورالعمل‌های برای چگونگی نصب آن برای سایر ویکی‌های بجز ویکی‌انبار لطفاً از  [//mediawiki.org/wiki/Manual:$wgForeignFileRepos the نصب دستی] استفاده کنید.",
+       "config-instantcommons-help": "[//www.mediawiki.org/ ویکی و InstantCommons ویکی‌انبار فوری] یک ویژگی‌است که به شما اجازه می‌دهد تا تصاویر، صداها یا سایر رسانه‌های یافته شده بر روی [//commons.wikimedia.org/ انبار ویکی مدیا] را استفاده کنید.\n\nبرای استفاده از این ویژگی مدیاویکی نیازمند دسترسی به اینترنت است.\n\nبرای کسب اطلاعات بیشتر درباره این ویژگی٬ شامل دستورالعمل‌های برای چگونگی نصب آن برای سایر ویکی‌های بجز ویکی‌انبار لطفاً از  [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos the نصب دستی] استفاده کنید.",
        "config-cc-error": "مجوز چوزر عوام سازنده بی‌نتیجه ماند.\nنام مجوز را دستی وارد کنید.",
        "config-cc-again": "انتخاب دوباره...",
        "config-cc-not-chosen": "مجوز عوام سازنده‌ای را که می‌خواهید انتخاب کنید و \"ادامه\" را کلیک کنید.",
        "config-insecure-keys": "'''هشدار:''' {{PLURAL:$2|کلید امن|کلیدهای امن}} ($1) در طی نصب  کاملاً ایمن {{PLURAL:$2|نیست|نیستند}}. تغییر دستی {{PLURAL:$2|آن|آنها}} را در نظر بگیرید.",
        "config-install-sysop": "ایجاد حساب کاربری مدیر",
        "config-install-subscribe-fail": "قادر تصدیق اعلام مدیاویکی نیست:$1",
-       "config-install-subscribe-notpossible": "سی‌یوآر‌ال نصب نشده‌است و allow_url_fopen در دسترس نیست.",
+       "config-install-subscribe-notpossible": "سی‌یوآر‌ال نصب نشده‌است و <code>allow_url_fopen</code> در دسترس نیست.",
        "config-install-mainpage": "ایجاد صفحهٔ اصلی با محتوای پیش‌فرض",
        "config-install-extension-tables": "ایجاد جداول برای افزونه‌های فعال",
        "config-install-mainpage-failed": "قادر به درج صفحهٔ اصلی نمی‌باشد:$1",
        "config-install-done": "'''تبریک!'''\nبا موفقیت مدیاویکی را نصب کردید.\nبرنامه نصب‌کننده پرونده <code>LocalSettings.php</code> را درست کرد.\nکه شامل تمام تنظیمات می‌باشد.\n\nشما نیاز به دریافت آن دارید و آن را در پایهٔ نصب ویکی قرار دهید (همان پوشهٔ index.php). دریافت باید به صورت خودکار شروع شده‌باشد.\n\nاگر دریافت شروع نشد یا اگر آن را لغو کردید با کلیک روی پیوند زیر می‌توانید آن را دریافت کنید:\n\n$3\n\n'''توجه داشته باشید:''' اگر این را الآن انجام ندهید، این پرونده تولیدشده در صورتی که نصب را بدون دریافت آن تمام کردید بعداً در اختیار شما قرار نخواهد گرفت.\n\nوقتی انجام شد شما می‌توانید '''[$2 وارد ویکی شوید]'''.",
        "config-download-localsettings": "دریافت <code>LocalSettings.php</code>",
        "config-help": "راهنما",
+       "config-help-tooltip": "برای گسترش کلیک کنید",
        "config-nofile": "پروندهٔ «$1» یافت نشد. آیا حذف شده‌است؟",
-       "config-extension-link": "آیا می‌دانستید که ویکی شما [//www.mediawiki.org/wiki/Manual:Extensions extensions] را پشتیبانی می‌کند؟\nشما می‌توانید [//www.mediawiki.org/wiki/Category:Extensions_by_category extensions by category] یا [//www.mediawiki.org/wiki/Extension_Matrix Extension Matrix] را برای دیدن همهٔ فهرست وسیع،جسته‌وگریخته بخوانید.",
+       "config-extension-link": "آیا می‌دانستید که ویکی شما [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensions] را پشتیبانی می‌کند؟\nشما می‌توانید [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensions by category]",
        "mainpagetext": "'''نرم‌افزار ویکی با موفقیت نصب شد.'''",
-       "mainpagedocfooter": "از [//meta.wikimedia.org/wiki/Help:Contents راهنمای کاربران]\nبرای استفاده از نرم‌افزار ویکی کمک بگیرید.\n\n== آغاز به کار ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings تنظیم پیکربندی]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki پرسش‌های متداول]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce فهرست ارسال نسخه‌های مدیاویکی]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Localise مدیاویکی برای زبان شما]"
+       "mainpagedocfooter": "از [//meta.wikimedia.org/wiki/Help:Contents راهنمای کاربران]\nبرای استفاده از نرم‌افزار ویکی کمک بگیرید.\n\n== آغاز به کار ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings تنظیم پیکربندی]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki پرسش‌های متداول]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce فهرست ارسال نسخه‌های مدیاویکی]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise مدیاویکی برای زبان شما]"
 }
index fb5cfbb..3aa0e84 100644 (file)
@@ -11,7 +11,8 @@
                        "VezonThunder",
                        "아라",
                        "Elseweyr",
-                       "Lliehu"
+                       "Lliehu",
+                       "Syreeni"
                ]
        },
        "config-desc": "MediaWiki-asennin",
        "config-help-restart": "Haluatko poistaa kaikki annetut tiedot ja aloittaa asennuksen alusta?",
        "config-restart": "Kyllä",
        "config-welcome": "=== Ympäristön tarkistukset ===\nVarmistetaan MediaWikin asennettavuus tähän ympäristöön.\nMuista antaa nämä tiedot, jos tarvitset apua asennuksen aikana.",
-       "config-sidebar": "* [//www.mediawiki.org MediaWikin kotisivu]\n* [//www.mediawiki.org/wiki/Help:Contents Käyttöopas]\n* [//www.mediawiki.org/wiki/Manual:Contents Hallintaopas]\n* [//www.mediawiki.org/wiki/Manual:FAQ UKK]\n----\n* <doclink href=Readme>Lue minut</doclink>\n* <doclink href=ReleaseNotes>Julkaisutiedot</doclink>\n* <doclink href=Copying>Kopiointi</doclink>\n* <doclink href=UpgradeDoc>Päivittäminen</doclink>",
+       "config-sidebar": "* [//www.mediawiki.org MediaWikin kotisivu]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Käyttöopas]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Hallintaopas]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ UKK]\n----\n* <doclink href=Readme>Lue minut</doclink>\n* <doclink href=ReleaseNotes>Julkaisutiedot</doclink>\n* <doclink href=Copying>Kopiointi</doclink>\n* <doclink href=UpgradeDoc>Päivittäminen</doclink>",
        "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-php-toolow": "PHP $1 on asennettu.\nMediaWiki vaatii PHP:n version $2 tai uudemman.",
        "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.",
+       "config-xml-bad": "PHP:n XML-moduulia ei löydy.\nMediaWiki käyttää tämän moduulin funktioita, eikä toimi tässä kokoonpanossa.\nJos käytät Mandrakea, asenna php-xml paketti.",
+       "config-memory-raised": "PHP:n <code>memory_limit</code> on $1, nostetaan arvoon $2.",
        "config-memory-bad": "'''Varoitus:''' PHP:n <code>memory_limit</code> on $1.\nTämä on luultavasti liian alhainen.\nAsennus saattaa epäonnistua!",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] on asennettu",
        "config-apc": "[http://www.php.net/apc APC] on asennettu.",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] on asennettu",
        "config-diff3-bad": "GNU diff3:a ei löytynyt.",
+       "config-imagemagick": "Löydettiin ImageMagick: <code>$1</code>.\nKuvien esikatselukuvat otetaan samalla käyttöön jos otetaan tiedostojen tallennus.",
+       "config-using-server": "Palvelimen nimenä käytetään \"<nowiki>$1</nowiki>\".",
+       "config-using-uri": "Palvelinen URL-osoitteena käytetään \"<nowiki>$1$2</nowiki>\".",
        "config-db-type": "Tietokannan tyyppi",
        "config-db-host": "Tietokantapalvelin",
        "config-db-wiki-settings": "Identifioi tämä wiki",
        "config-db-name": "Tietokannan nimi",
+       "config-db-install-account": "Asennuksessa käytettävä käyttäjätili",
        "config-db-username": "Tietokannan käyttäjätunnus",
        "config-db-password": "Tietokannan salasana",
+       "config-db-password-empty": "Syötä salasana uudelle tietokannan käyttäjälle: $1.\nVaikka käyttäjä voidaan luoda ilman salasanaa, se ei ole turvallista.",
+       "config-db-install-username": "Syötä käyttäjänimi jota käytetään muodostettaessa yhteys tietokantaan asennuksen aikana.\nTämä ei ole MediaWiki tilin käyttäjänimi; tämä on tietokannan käyttäjänimi.",
+       "config-db-install-password": "Syötä salasana jota käytetään muodostettaessa yhteys tietokantaan asennuksen aikana.\nTämä ei ole MediaWiki tilin salasana; tämä on tietokannan salasana.",
        "config-db-install-help": "Anna käyttäjätunnus ja salasana, joita käytetään asennuksen aikana.",
        "config-db-account-lock": "Käytä samaa tunnusta ja salasanaa myös asennuksen jälkeen",
+       "config-db-wiki-account": "Käyttäjätili normaaliin käyttöön",
+       "config-db-wiki-help": "Syötä käyttäjänimi ja salasana joita käytetään muodostettaessa yhteys tietokantaan käytettäessä wikiä normaalisti.\nJos tiliä ei ole olemassa ja asennuksessa käytettävällä tilillä on riittävät käyttöoikeudet, tämä käyttäjätili luodaan käyttöoikeuksilla jotka vähintään tarvitaan wikiä varten.",
        "config-db-prefix": "Tietokantataulujen etuliite",
+       "config-db-prefix-help": "Jos tietokantaa käytetään useammalle wikille tai MediaWikille ja muille sovelluksille, suositellaan käytettäväksi tauluissa etuliitettä, joilla ne erotetaan toisistaan ja vältetään näin virheitä.\nÄlä käytä välilyöntejä.\n\nYleensä tämä kenttä jätetään tyhjäksi.",
        "config-db-charset": "Tietokannan merkistö",
        "config-charset-mysql5-binary": "MySQL 4.1/5.0, binääri",
        "config-charset-mysql5": "MySQL 4.1/5.0, UTF-8",
        "config-charset-mysql4": "MySQL 4.0, taaksepäin yhteensopiva UTF-8",
        "config-mysql-old": "MediaWiki tarvitsee MySQL:n version $1 tai uudemman. Nykyinen versio on $2.",
+       "config-db-port": "Tietokannan portti:",
+       "config-pg-test-error": "Tietokantaan <strong>$1 ei voida muodostaa yhteyttä</strong>: $2",
        "config-type-mysql": "MySQL (tai yhteensopiva)",
        "config-type-postgres": "PostgreSQL",
        "config-type-sqlite": "SQLite",
        "config-header-postgres": "PostgreSQL-asetukset",
        "config-header-sqlite": "SQLite-asetukset",
        "config-header-oracle": "Oracle-asetukset",
+       "config-header-mssql": "Microsoft SQL Server asetukset",
        "config-invalid-db-type": "Virheellinen tietokantatyyppi",
-       "config-missing-db-name": "Kenttä »Tietokannan nimi» on pakollinen",
+       "config-missing-db-name": "\"{{int:config-db-name}}\" on pakollinen.",
+       "config-missing-db-host": "\"{{int:config-db-host}}\" on pakollinen.",
+       "config-missing-db-server-oracle": "\"{{int:config-db-host-oracle}}\" on pakollinen.",
        "config-invalid-db-name": "”$1” ei kelpaa tietokannan nimeksi.\nKäytä ainoastaan kirjaimia (a-z, A-Z), numeroita (0-9), alaviivoja (_) ja tavuviivoja (-).",
        "config-invalid-db-prefix": "”$1” ei kelpaa tietokannan etuliitteeksi.\nKäytä ainoastaan kirjaimia (a-z, A-Z), numeroita (0-9), alaviivoja (_) ja tavuviivoja (-).",
+       "config-connection-error": "$1.\n\nTarkista isäntä, käyttäjänimi, salasana ja yritä uudestaan.",
        "config-postgres-old": "MediaWiki tarvitsee PostgreSQL:n version $1 tai uudemman. Nykyinen versio on $2.",
+       "config-mssql-old": "Vaaditaan Microsoft SQL Server $1 tai uudempi. Sinulla on käytössä $2.",
        "config-sqlite-name-help": "Valitse nimi, joka yksilöi tämän wikin.\nÄlä käytä välilyöntejä tai viivoja.\nNimeä käytetään SQLite-tietokannan tiedostonimessä.",
        "config-sqlite-dir-unwritable": "Hakemistoon ”$1” kirjoittaminen epäonnistui.\nMuuta hakemiston käyttöoikeuksia siten, että palvelinohjelmisto voi kirjoittaa siihen ja yritä uudelleen.",
        "config-sqlite-readonly": "Tiedostoon <code>$1</code> ei voi kirjoittaa.",
        "config-sqlite-fts3-downgrade": "PHP:stä puuttuu FTS3-tuki. Poistetaan ominaisuus käytöstä tietokantatauluista.",
+       "config-can-upgrade": "Tietokanta sisältää jo MediaWiki tauluja.\nPäivitä ne MediaWiki-versioon $1 painamalla <strong>Jatka</strong>.",
        "config-upgrade-done": "Päivitys valmis.\n\nVoit [$1 aloittaa wikin käytön].\n\nNapsauta alla olevaa painiketta, jos haluat luoda uudelleen <code>LocalSettings.php</code>-tiedoston.\nTämä '''ei ole suositeltavaa''', jos wikissäsi ei ole ongelmia.",
        "config-upgrade-done-no-regenerate": "Päivitys valmis.\n\nVoit [$1 aloittaa wikin käytön].",
        "config-regenerate": "Luo LocalSettings.php uudelleen →",
        "config-show-table-status": "Kysely <code>SHOW TABLE STATUS</code> epäonnistui!",
+       "config-db-web-help": "Valitse käyttäjänimi ja salasana joita palvelin käyttää muodostaessaan yhteyttä tietokantapalvelimeen wikin normaalin toiminnan aikana.",
+       "config-db-web-account-same": "Käytä samaa tiliä kuin asennuksessa",
+       "config-db-web-create": "Lisää tili, jos sitä ei ole jo olemassa",
+       "config-db-web-no-create-privs": "Tilillä jota käytetään asennuksessa ei ole oikeuksia luoda uutta tiliä.\nTähän määriteltävä tili täytyy olla jo olemassa.",
        "config-mysql-engine": "Tallennusmoottori",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
+       "config-mysql-charset": "Tietokannan merkistökoodaus:",
        "config-mysql-binary": "Binääri",
        "config-mysql-utf8": "UTF-8",
        "config-site-name": "Wikin nimi",
+       "config-site-name-help": "Tämä näkyy selaimen otsikkona ja muissa kohdissa.",
        "config-site-name-blank": "Kirjoita sivuston nimi.",
        "config-project-namespace": "Projektinimiavaruus",
        "config-ns-generic": "Projekti",
        "config-ns-site-name": "Sama kuin wikin nimi: $1",
        "config-ns-other": "Muu (määritä)",
+       "config-ns-other-default": "MinunWiki",
+       "config-ns-invalid": "Määritelty nimiavaruus \"<nowiki>$1</nowiki>\" on virheellinen.\nSyötä joku muu nimiavaruus.",
+       "config-ns-conflict": "Määritelty nimiavaruus \"<nowiki>$1</nowiki>\" on ristiriidassa MediaWikin oletusnimiavaruuksien kanssa.\nSyötä joku muu nimiavaruus.",
+       "config-admin-box": "Ylläpitäjän tili",
        "config-admin-name": "Käyttäjänimesi:",
        "config-admin-password": "Salasana",
        "config-admin-password-confirm": "Salasana uudelleen",
+       "config-admin-help": "Syötä käyttäjänimi tähän, esimerkiksi \"Matti Meikäläinen\".\nTätä nimeä käytetään kirjauduttaessa wikiin.",
        "config-admin-name-blank": "Anna ylläpitäjän käyttäjänimi.",
+       "config-admin-name-invalid": "Annettu nimi \"<nowiki>$1</nowiki>\" on virheellinen.\nSyötä toinen nimi.",
+       "config-admin-password-blank": "Syötä ylläpitäjän salasana.",
+       "config-admin-password-mismatch": "Antamasi salasanat eivät täsmää.",
        "config-admin-email": "Sähköpostiosoite",
+       "config-admin-email-help": "Syötä sähköpostiosoite johon vastaanotetaan viestit muilta wikin käyttäjiltä, nollataan salasana ja ilmoitetaan tarkkailulistalla olevista sivuista. Kenttä voidaan jättää myös tyhjäksi.",
        "config-admin-error-bademail": "Annoit virheellisen sähköpostiosoitteen.",
+       "config-subscribe": "Liity [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce päivityssähköpostilistalle].",
+       "config-subscribe-help": "Tällä harvoin käytettävällä sähköpostilistalla julkaistaan päivitysilmoituksia ja turvallisuuspäivityksiä.\nLiittymistä listalle suositellaan samoin kuin päivittämään MediaWiki kun uusi versio julkaistaan.",
+       "config-subscribe-noemail": "Yritit liittyä päivityssähköpostilistalle antamatta sähköpostiosoitetta.\nSyötä sähköpostiosoite jos haluat liittyä listalle.",
        "config-almost-done": "Olet jo lähes valmis!\nVoit ohittaa jäljellä olevat määritykset ja asentaa wikin juuri nyt.",
+       "config-optional-continue": "Säädä lisää asetuksia.",
+       "config-optional-skip": "Nyt riittää, asenna wiki näillä tiedoilla.",
+       "config-profile": "Käyttäjäprofiilin oikeudet:",
        "config-profile-wiki": "Avoin wiki",
        "config-profile-no-anon": "Tunnuksen luonti vaaditaan",
+       "config-profile-fishbowl": "Vain hyväksytyt muokkaajat",
        "config-profile-private": "Yksityinen wiki",
        "config-license": "Tekijänoikeus ja lisenssi:",
        "config-license-pd": "Public domain",
        "config-email-settings": "Sähköpostiasetukset",
+       "config-enable-email": "Ota käyttöön sähköpostien lähetys",
+       "config-enable-email-help": "Jotta sähköposti toimii, [http://www.php.net/manual/en/mail.configuration.php PHP:n sähköpostiasetukset] täytyy asettaa oikein.\nJos et halua käyttää sähköpostiominaisuuksia, ne voi kytkeä pois päältä tästä.",
+       "config-email-user": "Ota käyttöön käyttäjältä käyttäjälle sähköpostit",
+       "config-email-user-help": "Salli käyttäjien lähettää sähköpostia toisilleen jos he ovat ottaneet käyttöön toiminnon asetuksissaan.",
+       "config-email-usertalk": "Ota käyttöön käyttäjien keskustelusivusta ilmoittaminen",
+       "config-email-usertalk-help": "Salli käyttäjien vastaanottaa ilmoituksia käyttäjän keskustelusivulla tapahtuneista muutoksista jos he ovat ottaneet käyttöön toiminnon asetuksissaan.",
+       "config-email-watchlist": "Ota käyttöön tarkkailulistasta ilmoittaminen",
+       "config-email-watchlist-help": "Salli käyttäjien vastaanottaa ilmoituksia tarkkailulistalla olevilla sivuilla tapahtuneista muutoksista jos he ovat ottaneet käyttöön toiminnon asetuksissaan.",
+       "config-email-auth": "Ota käyttöön sähköpostin vahvistaminen",
+       "config-email-auth-help": "Kun tämä valinta otetaan käyttöön, käyttäjien tulee vahvistaa sähköpostiosoitteensa linkistä, joka lähetetään heille kun he asettavat tai muuttavat sähköpostiaan.\nVain vahvistettuihin sähköpostiosoitteisiin voidaan lähettää sähköposteja muilta käyttäjiltä tai ilmoituksia muutoksista.\nTämän valinnan käyttöönottoa <strong>suositellaan</strong> julkisissa wikeissä, koska se vähentää mahdollista sähköpostien väärinkäyttöä.",
+       "config-email-sender": "Palautusähköpostiosoite:",
+       "config-upload-settings": "Kuvien ja tiedostojen lataaminen",
+       "config-upload-enable": "Ota käyttöön tiedostojen lataaminen",
+       "config-upload-deleted": "Poistettujen tiedostojen hakemisto:",
+       "config-upload-deleted-help": "Valitse hakemisto johon poistetut tiedostot arkistoidaan.\nHakemiston ei tulisi olla käytettävissä internetverkosta.",
        "config-logo": "Logon URL-osoite",
        "config-cc-again": "Valitse uudelleen...",
        "config-extensions": "Laajennukset",
+       "config-extensions-help": "Yllä luetellut laajennukset löytyvät <code>./extensions</code> hakemistosta.\n\nNe saattavat vaatia lisäasetuksia, mutta voit ottaa ne käyttöön nyt.",
+       "config-install-alreadydone": "<strong>Varoitus:</strong> MediaWiki on jo asennettu ja yrität asentaa sitä uudestaan.\nSiirry seuraavalle sivulle.",
+       "config-install-begin": "Painamalla \"{{int:config-continue}}\", aloitetaan MediaWikin asentaminen. \nJos haluat vielä tehdä muutoksia, paina \"{{int:config-back}}\".",
        "config-install-step-done": "valmis",
        "config-install-step-failed": "epäonnistui",
+       "config-install-extensions": "Sisällytetään laajennukset",
+       "config-install-database": "Asennetaan tietokantaa",
+       "config-pg-no-create-privs": "Määrittelemälläsi tilillä ei ole riittävästi oikeuksia luoda tiliä.",
+       "config-install-user": "Luodaan tietokannalle käyttäjää",
        "config-install-user-alreadyexists": "Käyttäjä $1 on jo olemassa",
+       "config-install-user-create-failed": "Käyttäjän \"$1\" luonti epäonnistui: $2",
+       "config-install-user-grant-failed": "Käyttöoikeuksien myöntäminen käyttäjälle \"$1\" epäonnistui: $2",
+       "config-install-user-missing": "Määriteltyä käyttäjää \"$1\" ei ole olemassa.",
+       "config-install-user-missing-create": "Määriteltyä käyttäjää \"$1\" ei ole olemassa.\nValitse alapuolelta \"lisää tili\" jos haluat että se luodaan.",
+       "config-install-tables": "Luodaan tauluja",
+       "config-install-tables-exist": "<strong>Varoitus:</strong> MediaWiki taulut ovat jo olemassa.\nOhitetaan taulujen luonti.",
+       "config-install-tables-failed": "<strong>Virhe:</strong> Taulujen luominen epäonnistui seuraavaan virheen takia: $1",
        "config-install-interwiki-list": "Tiedostoa <code>interwiki.list</code> ei voitu lukea.",
+       "config-install-keys": "Muodostetaan salausavaimia",
+       "config-install-sysop": "Luodaan ylläpitäjän tiliä",
+       "config-install-subscribe-fail": "Liittyminen mediawiki-announce listalle epäonnistui: $1",
+       "config-install-mainpage": "Luodaan etusivu oletussisällöllä",
+       "config-install-extension-tables": "Luodaan tauluja käyttöönotetuille laajuennuksille",
+       "config-install-mainpage-failed": "Etusivun lisääminen ei onnistunut: $1",
        "config-download-localsettings": "Lataa <code>LocalSettings.php</code>",
        "config-help": "ohje",
+       "config-nofile": "Tiedostoa \"$1\" ei löytynyt. Onko se poistettu?",
+       "config-extension-link": "Tiesitkö että wiki tukee [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions laajennuksia]?\n\nLaajennuksia voi hakea myös [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category luokittain].",
        "mainpagetext": "'''MediaWiki on onnistuneesti asennettu.'''",
-       "mainpagedocfooter": "Lisätietoja käytöstä on sivulla [//meta.wikimedia.org/wiki/Help:Contents User's Guide].\n\n=== Lisäohjeita ===\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Asetusten teko-ohjeita]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWikin FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Sähköpostilista, jolla tiedotetaan MediaWikin uusista versioista]\n\n=== Asetukset ===\n\nTarkista, että alla olevat taivutusmuodot ovat oikein. Jos eivät, tee tarvittavat muutokset tiedostoon LocalSettings.php seuraavasti:\n $wgGrammarForms['fi']['genitive']['{{SITENAME}}'] = '...';\n $wgGrammarForms['fi']['partitive']['{{SITENAME}}'] = '...';\n $wgGrammarForms['fi']['elative']['{{SITENAME}}'] = '...';\n $wgGrammarForms['fi']['inessive']['{{SITENAME}}'] = '...';\n $wgGrammarForms['fi']['illative']['{{SITENAME}}'] = '...';\nTaivutusmuodot: {{GRAMMAR:genitive|{{SITENAME}}}} (yön) – {{GRAMMAR:partitive|{{SITENAME}}}} (yötä) – {{GRAMMAR:elative|{{SITENAME}}}} (yöstä) – {{GRAMMAR:inessive|{{SITENAME}}}} (yössä) – {{GRAMMAR:illative|{{SITENAME}}}} (yöhön)."
+       "mainpagedocfooter": "Lisätietoja käytöstä on sivulla [//meta.wikimedia.org/wiki/Help:Contents User's Guide].\n\n=== Lisäohjeita ===\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Asetusten teko-ohjeita]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWikin FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Sähköpostilista, jolla tiedotetaan MediaWikin uusista versioista]\n\n=== Asetukset ===\n\nTarkista, että alla olevat taivutusmuodot ovat oikein. Jos eivät, tee tarvittavat muutokset tiedostoon LocalSettings.php seuraavasti:\n $wgGrammarForms['fi']['genitive']['{{SITENAME}}'] = '...';\n $wgGrammarForms['fi']['partitive']['{{SITENAME}}'] = '...';\n $wgGrammarForms['fi']['elative']['{{SITENAME}}'] = '...';\n $wgGrammarForms['fi']['inessive']['{{SITENAME}}'] = '...';\n $wgGrammarForms['fi']['illative']['{{SITENAME}}'] = '...';\nTaivutusmuodot: {{GRAMMAR:genitive|{{SITENAME}}}} (yön) – {{GRAMMAR:partitive|{{SITENAME}}}} (yötä) – {{GRAMMAR:elative|{{SITENAME}}}} (yöstä) – {{GRAMMAR:inessive|{{SITENAME}}}} (yössä) – {{GRAMMAR:illative|{{SITENAME}}}} (yöhön)."
 }
index ead9317..d9ef1ef 100644 (file)
                        "Wyz",
                        "Yumeki",
                        "아라",
-                       "Maxim21"
+                       "Maxim21",
+                       "Wladek92",
+                       "Scoopfinder",
+                       "Seb35"
                ]
        },
        "config-desc": "Le programme d’installation de MediaWiki",
        "config-title": "Installation de MediaWiki $1",
        "config-information": "Informations",
        "config-localsettings-upgrade": "Un fichier <code>LocalSettings.php</code> a été détecté.\nPour mettre à jour cette installation, veuillez saisir la valeur de <code>$wgUpgradeKey</code> dans le champ ci-dessous.\nVous la trouverez dans <code>LocalSettings.php</code>.",
-       "config-localsettings-cli-upgrade": "Un fichier <code>LocalSettings.php</code> a été détecté.\nPour mettre à niveau cette installation, veuillez exécuter <code>update.php</code>",
+       "config-localsettings-cli-upgrade": "Un fichier <code>LocalSettings.php</code> a été détecté.\nPour mettre à niveau cette installation, veuillez exécuter <code>update.php</code> à la place",
        "config-localsettings-key": "Clé de mise à jour :",
        "config-localsettings-badkey": "La clé que vous avez fournie est incorrecte.",
        "config-upgrade-key-missing": "Une installation existante de MediaWiki a été détectée.\n\nPour mettre à jour cette installation, veuillez ajouter la ligne suivante à la fin de votre fichier <code>LocalSettings.php</code>\n\n$1",
        "config-restart": "Oui, le relancer",
        "config-welcome": "=== Vérifications liées à l’environnement ===\nDes vérifications de base vont maintenant être effectuées pour voir si cet environnement est adapté à l’installation de MediaWiki.\nRappelez-vous d’inclure ces informations si vous recherchez de l’aide sur la manière de terminer l’installation.",
        "config-copyright": "=== Droit d'auteur et conditions ===\n\n$1\n\nCe programme est un logiciel libre : vous pouvez le redistribuer et/ou le modifier selon les termes de la Licence Publique Générale GNU telle que publiée par la Free Software Foundation (version 2 de la Licence, ou, à votre choix, toute version ultérieure).\n\nCe programme est distribué dans l’espoir qu’il sera utile, mais '''sans aucune garantie''' : sans même les garanties implicites de '''commerciabilité''' ou d’'''adéquation à un usage particulier'''.\nVoir la Licence Publique Générale GNU pour plus de détails.\n\nVous devriez avoir reçu <doclink href=Copying>une copie de la Licence Publique Générale GNU</doclink> avec ce programme ; dans le cas contraire, écrivez à la Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ou [http://www.gnu.org/copyleft/gpl.html lisez-la en ligne].",
-       "config-sidebar": "* [//www.mediawiki.org Accueil MediaWiki]\n* [//www.mediawiki.org/wiki/Help:Contents Guide de l’utilisateur]\n* [//www.mediawiki.org/wiki/Manual:Contents Guide de l’administrateur]\n* [//www.mediawiki.org/wiki/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>Lisez-moi</doclink>\n* <doclink href=ReleaseNotes>Notes de publication</doclink>\n* <doclink href=Copying>Copie</doclink>\n* <doclink href=UpgradeDoc>Mise à jour</doclink>",
+       "config-sidebar": "* [//www.mediawiki.org Accueil MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Guide de l’utilisateur]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Guide de l’administrateur]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>Lisez-moi</doclink>\n* <doclink href=ReleaseNotes>Notes de publication</doclink>\n* <doclink href=Copying>Copie</doclink>\n* <doclink href=UpgradeDoc>Mise à jour</doclink>",
        "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-php-toolow": "PHP $1 est installé.\nCependant, MediaWiki requiert PHP $2 ou supérieur.",
        "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/Unicode_normalization_considerations ''Unicode normalization''] (en anglais).",
-       "config-unicode-update-warning": "'''Attention''': La version installée du ''wrapper'' de normalisation Unicode utilise une vieille version de la [http://site.icu-project.org/ bibliothèque logicielle ''ICU Project''].\nVous devriez faire une [//www.mediawiki.org/wiki/Unicode_normalization_considerations mise à jour] (texte en anglais) si l'usage d'Unicode vous semble important.",
+       "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-unicode-update-warning": "'''Attention''': La version installée du ''wrapper'' de normalisation Unicode utilise une vieille version de la [http://site.icu-project.org/ bibliothèque logicielle ''ICU Project''].\nVous devriez faire une [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations mise à jour] si vous êtes tout à fait concerné par l'usage d'Unicode.",
        "config-no-db": "Impossible de trouver un pilote de base de données approprié ! Vous devez installer un pilote de base de données pour PHP. Les types de bases de données suivants sont reconnus : $1.\n\nSi vous avez compilé PHP vous-même, reconfigurez-le avec un client de base de données activé, par exemple en utilisant <code>./configure --with-mysqli</code>. Si vous avez installé PHP depuis un paquet Debian ou Ubuntu, alors vous devrez aussi installer, par exemple, le paquet <code>php5-mysql</code>.",
        "config-outdated-sqlite": "'''Attention''': vous avez SQLite $1, qui est inférieur à la version minimale requise $2. SQLite sera indisponible.",
        "config-no-fts3": "'''Attention :''' SQLite est compilé sans le module [//sqlite.org/fts3.html FTS3] ; les fonctions de recherche ne seront pas disponibles sur ce moteur.",
        "config-memory-raised": "Le paramètre <code>memory_limit</code> de PHP était à $1, porté à $2.",
        "config-memory-bad": "'''Attention :''' Le paramètre <code>memory_limit</code> de PHP est à $1.\nCette valeur est probablement trop faible.\nIl est possible que l’installation échoue !",
        "config-ctype": "'''Fatal ''': PHP doit être compilé avec le support pour l'[http://www.php.net/manual/en/ctype.installation.php extension Ctype].",
-       "config-json": "'''Erreur fatale :''' PHP a été compilé sans le support de JSON.\nVous devez soit installez l’extension JSON de PHP ou l’extension [http://pecl.php.net/package/jsonc PECL jsonc] avant d’installer MediaWiki.\n* L’extension PHP est comprise dans Red Hat Enterprise Linux (CentOS) 5 et 6, mais doit être activée dans <code>/etc/php.ini</code> ou <code>/etc/php.d/json.ini</code>.\n* Certaines distributions Linux après mai 2013 ne comprennent pas l’extension PHP, mais oint mis à la place l’extension PECL sous al forme <code>php5-json</code> ou <code>php-pecl-jsonc</code>.",
+       "config-json": "'''Erreur fatale :''' PHP a été compilé sans le support de JSON.\nVous devez soit installez l’extension JSON de PHP ou l’extension [http://pecl.php.net/package/jsonc PECL jsonc] avant d’installer MediaWiki.\n* L’extension PHP est comprise dans Red Hat Enterprise Linux (CentOS) 5 et 6, mais doit être activée dans <code>/etc/php.ini</code> ou <code>/etc/php.d/json.ini</code>.\n* Certaines distributions Linux après mai 2013 ne comprennent pas l’extension PHP, mais ont mis à la place l’extension PECL sous la forme <code>php5-json</code> ou <code>php-pecl-jsonc</code>.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] est installé",
        "config-apc": "[http://www.php.net/apc APC] est installé",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] est installé",
        "config-no-cache": "'''Attention :''' Impossible de trouver [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] ou [http://www.iis.net/download/WinCacheForPhp WinCache].\nLa mise en cache d'objets n'est pas activée.",
-       "config-mod-security": "'''Attention''': Votre serveur web a [http://modsecurity.org/ mod_security] activé. S&il est mal configuré, cela peut poser des problèmes à MediaWiki ou à d'autres applications qui permettent aux utilisateurs de publier un contenu quelconque.\nReportez-vous à [http://modsecurity.org/documentation/ la documentation de mod_security] ou contactez le support de votre hébergeur si vous rencontrez des erreurs aléatoires.",
+       "config-mod-security": "'''Attention''': Votre serveur web a [http://modsecurity.org/ mod_security] activé. S'il est mal configuré, cela peut poser des problèmes à MediaWiki ou à d'autres applications qui permettent aux utilisateurs de publier un contenu quelconque.\nReportez-vous à [http://modsecurity.org/documentation/ la documentation de mod_security] ou contactez le support de votre hébergeur si vous rencontrez des erreurs aléatoires.",
        "config-diff3-bad": "GNU diff3 introuvable.",
        "config-git": "Logiciel de contrôle de version Git trouvé : <code>$1</code>.",
        "config-git-bad": "Logiciel de contrôle de version Git non trouvé.",
        "config-imagemagick": "ImageMagick trouvé : <code>$1</code>.\nLa miniaturisation d'images sera activée si vous activez le téléversement de fichiers.",
        "config-gd": "La bibliothèque graphique GD intégrée a été trouvée.\nLa miniaturisation d'images sera activée si vous activez le téléversement de fichiers.",
-       "config-no-scaling": "Impossible de trouver la bibliothèque GD ou ImageMagick.\nLa miniaturisation d'images sera désactivé.",
-       "config-no-uri": "'''Erreur :''' Impossible de déterminer l'URI du script actuel.\nInstallation avortée.",
+       "config-no-scaling": "Impossible de trouver la bibliothèque GD ou ImageMagick.\nLa miniaturisation d'images sera désactivée.",
+       "config-no-uri": "'''Erreur :''' Impossible de déterminer l'URI du script actuel.\nInstallation interrompue.",
        "config-no-cli-uri": "'''Attention''': Aucun <code>--scriptpath</code> n'a été spécifié; <code>$1</code> sera utilisé par défaut",
        "config-using-server": "Utilisation du nom de serveur \"<nowiki>$1</nowiki>\".",
        "config-using-uri": "Utilisation de l'URL de serveur \"<nowiki>$1$2</nowiki>\".",
-       "config-uploads-not-safe": "'''Attention:''' Votre répertoire par défaut pour les téléchargements, <code>$1</code>, est vulnérable, car il peut exécuter n'importe quel script.\nBien que MediaWiki vérifie tous les fichiers téléchargés, il est fortement recommandé de [//www.mediawiki.org/wiki/Manual:Security#Upload_security fermer cette vulnérabilité de sécurité] (texte en anglais) avant d'activer les téléchargements.",
+       "config-uploads-not-safe": "'''Attention:''' Votre répertoire par défaut pour les téléchargements, <code>$1</code>, est vulnérable, car il peut exécuter n'importe quel script.\nBien que MediaWiki vérifie tous les fichiers téléchargés, il est fortement recommandé de [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security fermer cette vulnérabilité de sécurité] (texte en anglais) avant d'activer les téléchargements.",
        "config-no-cli-uploads-check": "'''Attention:''' Votre répertoire par défaut pour les imports(<code>$1</code>) n'est pas contrôlé concernant la vulnérabilité d'exécution de scripts arbitraires lors de l'installation CLI.",
        "config-brokenlibxml": "Votre système utilise une combinaison de versions de PHP et libxml2 qui est boguée et peut engendrer des corruptions cachées de données dans MediaWiki et d’autres applications web.\nVeuillez mettre à jour votre système vers libxml2 2.7.3 ou plus récent ([https://bugs.php.net/bug.php?id=45996 bogue déposé auprès de PHP]).\nInstallation interrompue.",
        "config-suhosin-max-value-length": "Suhosin est installé et limite la <code>longueur</code> du paramètre GET à $1 octets.\nLe composant ResourceLoader de MediaWiki va répondre en respectant cette limite, mais ses performances seront dégradées. Si possible, vous devriez définir <code>suhosin.get.max_value_length</code> à 1024 ou plus dans le fichier <code>php.ini</code>, et fixer <code>$wgResourceLoaderMaxQueryLength</code> à la même valeur dans <code>LocalSettings.php</code>.",
        "config-db-name": "Nom de la base de données :",
        "config-db-name-help": "Choisissez un nom qui identifie votre wiki.\nIl ne doit pas contenir d'espaces.\n\nSi vous utilisez un hébergement web partagé, votre hébergeur vous fournira un nom spécifique de base de données à utiliser, ou bien vous permet de créer des bases de données via un panneau de contrôle.",
        "config-db-name-oracle": "Schéma de base de données :",
-       "config-db-account-oracle-warn": "Il existe trois scénarios pris en charge pour l’installation d'Oracle comme backend de base :\n\nSi vous souhaitez créer un compte de base de données dans le cadre de la procédure d’installation, veuillez fournir un compte avec le rôle de SYSDBA comme compte de base de données pour l’installation et spécifiez les informations d’identification souhaitées pour le compte d'accès au web, sinon vous pouvez créer le compte d’accès web manuellement et fournir uniquement ce compte (si elle a exigé des autorisations nécessaires pour créer les objets de schéma) ou fournir deux comptes différents, l’un avec les privilèges de créer et une restreinte pour l’accès web.\n\nUn script pour créer un compte avec des privilèges requis peut être trouvé dans le répertoire « entretien/oracle/ » de cette installation. N’oubliez pas que le fait de l’utilisation d’un compte limité désactive toutes les fonctionnalités d’entretien avec le compte par défaut.",
+       "config-db-account-oracle-warn": "Il existe trois scénarios pris en charge pour l’installation d'Oracle comme backend de base de données:\n\nSi vous souhaitez créer un compte de base de données dans le cadre de la procédure d’installation, veuillez fournir un compte avec le rôle de SYSDBA comme compte de base de données pour l’installation et spécifier les informations d’identification souhaitées pour le compte d'accès au web, sinon vous pouvez créer le compte d’accès web manuellement et fournir uniquement ce compte (si elle a exigé des autorisations nécessaires pour créer les objets de schéma) ou fournir deux comptes différents, l’un avec les privilèges pour créer et l'autre restreint, pour l’accès web.\n\nUn script pour créer un compte avec des privilèges requis peut être trouvé dans le répertoire « entretien/oracle/ » de cette installation. N’oubliez pas que le fait de l’utilisation d’un compte limité désactive toutes les fonctionnalités d’entretien avec le compte par défaut.",
        "config-db-install-account": "Compte d'utilisateur pour l'installation",
        "config-db-username": "Nom d’utilisateur de la base de données :",
        "config-db-password": "Mot de passe de la base de données :",
-       "config-db-password-empty": "Veuillez entrer un mot de passe pour le nouvel compte de la base de données : $1.\nBien qu'il soit possible de créer un compte sans mot de passe, ce n'est pas recommandé pour des questions de sécurité.",
+       "config-db-password-empty": "Veuillez entrer un mot de passe pour le nouveau compte de la base de données : $1.\nBien qu'il soit possible de créer un compte sans mot de passe, ce n'est pas recommandé pour des questions de sécurité.",
        "config-db-username-empty": "Vous devez entrer une valeur pour « {{int:config-db-username}} ».",
        "config-db-install-username": "Entrez le nom d’utilisateur qui sera utilisé pour se connecter à la base de données pendant le processus d'installation. Il ne s’agit pas du nom d’utilisateur du compte MediaWiki, mais du nom d’utilisateur pour votre base de données.",
        "config-db-install-password": "Entrez le mot de passe qui sera utilisé pour se connecter à la base de données pendant le processus d'installation. Il ne s’agit pas du mot de passe du compte MediaWiki, mais du mot de passe pour votre base de données.",
        "config-db-wiki-account": "Compte d'utilisateur pour le fonctionnement habituel",
        "config-db-wiki-help": "Entrez le nom d'utilisateur et le mot de passe qui seront utilisés pour se connecter à la base de données pendant le fonctionnement habituel du wiki.\nSi le compte n'existe pas, et le compte d'installation dispose de privilèges suffisants, ce compte d'utilisateur sera créé avec les privilèges minimum requis pour faire fonctionner le wiki.",
        "config-db-prefix": "Préfixe des tables de la base de données :",
-       "config-db-prefix-help": "Si vous avez besoin de partager une base de données entre plusieurs wikis, ou entre MediaWiki et une autre application Web, vous pouvez choisir d'ajouter un préfixe à tous les noms de table pour éviter les conflits.\nNe pas utiliser des espaces.\n\nCe champ est généralement laissé vide.",
+       "config-db-prefix-help": "Si vous avez besoin de partager une base de données entre plusieurs wikis, ou entre MediaWiki et une autre application Web, vous pouvez choisir d'ajouter un préfixe à tous les noms de table pour éviter les conflits.\nNe pas utiliser d'espaces.\n\nCe champ est généralement laissé vide.",
        "config-db-charset": "Jeu de caractères de la base de données",
-       "config-charset-mysql5-binary": "MySQL 4.1/5.0 binaire",
+       "config-charset-mysql5-binary": "binaire MySQL 4.1/5.0",
        "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
        "config-charset-mysql4": "MySQL 4.0 rétrocompatible UTF-8",
        "config-charset-help": "'''Attention:''' Si vous utilisez ''backwards-compatible UTF-8'' sur MySQL 4.1+, et ensuite sauvegardez la base de données avec <code>mysqldump</code>, cela peut détruire tous les caractères non-ASCII, ce qui rend inutilisable vos copies de sauvegarde de façon irréversible !\n\nEn ''mode binaire'', MediaWiki stocke le texte UTF-8 dans des champs binaires de la base de données. C'est plus efficace que le ''mode UTF-8'' de MySQL, et vous permet d'utiliser toute la gamme des caractères Unicode.\nEn ''mode UTF-8'', MySQL connaîtra le jeu de caractères de vos données et pourra présenter et convertir les données de manière appropriée, mais il ne vous laissera pas stocker les caractères au-dessus du [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes plan multilingue de base] (en anglais).",
-       "config-mysql-old": "MySQL $1 ou version ultérieure est requis, vous avez $2.",
+       "config-mysql-old": "MySQL $1 ou version ultérieure est requis. Vous avez $2.",
        "config-db-port": "Port de la base de données :",
        "config-db-schema": "Schéma pour MediaWiki :",
-       "config-db-schema-help": "Les schémas ci-dessus sont généralement corrects.\nNe les changez que si vous êtes sûr que c'est nécessaire.",
+       "config-db-schema-help": "Ce schéma est généralement correct.\nNe le changez que si vous êtes sûr que c'est nécessaire.",
        "config-pg-test-error": "Impossible de se connecter à la base de données '''$1''' : $2",
        "config-sqlite-dir": "Dossier des données SQLite :",
-       "config-sqlite-dir-help": "SQLite stocke toutes les données dans un fichier unique.\n\nLe répertoire que vous inscrivez doit être accessible en écriture par le serveur lors de l'installation.\n\nIl '''ne faut pas''' qu'il soit accessible via le web, c'est pourquoi il n'est pas à l'endroit où vos fichiers PHP sont.\n\nL'installateur écrira un fichier <code>.htaccess</code> en même temps, mais s'il y a échec, quelqu'un peut accéder à votre base de données.\nCela comprend les données des utilisateurs (adresses de courriel, mots de passe hachés) ainsi que des révisions supprimées et d'autres données confidentielles du wiki.\n\nEnvisagez de placer la base de données ailleurs, par exemple dans <code>/var/lib/mediawiki/yourwiki</code>.",
+       "config-sqlite-dir-help": "SQLite stocke toutes les données dans un fichier unique.\n\nLe répertoire que vous fournissez doit être accessible en écriture par le serveur lors de l'installation.\n\nIl '''ne faut pas''' qu'il soit accessible via le web, c'est pourquoi il n'est pas à l'endroit où sont vos fichiers PHP.\n\nL'installateur écrira un fichier <code>.htaccess</code> en même temps, mais s'il y a échec, quelqu'un peut accéder à votre base de données.\nCela comprend les données des utilisateurs (adresses de courriel, mots de passe hachés) ainsi que des révisions supprimées et d'autres données confidentielles du wiki.\n\nEnvisagez de placer la base de données ailleurs, par exemple dans <code>/var/lib/mediawiki/yourwiki</code>.",
        "config-oracle-def-ts": "Espace de stockage (''tablespace'') par défaut :",
        "config-oracle-temp-ts": "Espace de stockage (''tablespace'') temporaire :",
        "config-type-mysql": "MySQL (ou compatible)",
        "config-missing-db-host": "Vous devez entrer une valeur pour « {{int:config-db-host}} ».",
        "config-missing-db-server-oracle": "Vous devez entrer une valeur pour « {{int:config-db-host-oracle}} ».",
        "config-invalid-db-server-oracle": "Le nom TNS de la base de données (« $1 ») est invalide.\nUtilisez uniquement la chaîne \"TNS Name\" ou \"Easy Connect\" ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Méthodes de nommage Oracle])",
-       "config-invalid-db-name": "Nom de la base de données invalide (« $1 »).\nIl ne peut contenir que des lettres latines (a-z, A-Z), des chiffres (0-9), des caractères de soulignement (_) et des tirets (-).",
-       "config-invalid-db-prefix": "Préfixe de la base de données non valide « $1 ».\nIl ne peut contenir que des lettres latines (a-z, A-Z), des chiffres (0-9), des caractères de soulignement (_) et des tirets (-).",
+       "config-invalid-db-name": "Nom de la base de données invalide (« $1 »).\nUtiliser seulement les lettres ASCII (a-z, A-Z), les chiffres (0-9), les caractères de soulignement (_) et les tirets (-).",
+       "config-invalid-db-prefix": "Préfixe de la base de données non valide « $1 ».\nUtiliser seulement les lettres ASCII (a-z, A-Z), les chiffres (0-9), les caractères de soulignement (_) et les tirets (-).",
        "config-connection-error": "$1.\n\nVérifier le nom d’hôte, le nom d’utilisateur et le mot de passe ci-dessous puis réessayer.",
-       "config-invalid-schema": "Schéma invalide pour MediaWiki « $1 ».\nUtilisez seulement des lettres latines (a-z, A-Z), des chiffres (0-9) et des caractères de soulignement (_).",
-       "config-db-sys-create-oracle": "L'installateur ne reconnaît que les compte SYSDBA lors de la création d'un nouveau compte.",
-       "config-db-sys-user-exists-oracle": "Le compte « $1 » existe déjà. Un SYSDBA peut seulement servir à créer un nouveau compte.",
-       "config-postgres-old": "PostgreSQL $1 ou version ultérieure est requis, vous avez $2.",
+       "config-invalid-schema": "Schéma invalide pour MediaWiki « $1 ».\nUtiliser seulement les lettres ASCII (a-z, A-Z), les chiffres (0-9) et les caractères de soulignement (_).",
+       "config-db-sys-create-oracle": "L'installateur ne reconnaît que le compte SYSDBA lors de la création d'un nouveau compte.",
+       "config-db-sys-user-exists-oracle": "Le compte « $1 » existe déjà. Seul SYSDBA peut être utilisé pour créer un nouveau compte.",
+       "config-postgres-old": "PostgreSQL $1 ou version ultérieure est requis. Vous avez $2.",
        "config-mssql-old": "Microsoft SQL Server version $1 ou supérieur est requis. Vous avez la version $2.",
-       "config-sqlite-name-help": "Choisir un nom qui identifie votre wiki.\nNe pas utiliser des espaces ou des traits d'union.\nIl sera utilisé pour le fichier de données SQLite.",
-       "config-sqlite-parent-unwritable-group": "Impossible de créer le répertoire de données <nowiki><code>$1</code></nowiki>, parce que le répertoire parent <nowiki><code>$2</code></nowiki> n'est pas accessible en écriture par le serveur Web.\n\nL'utilisateur du serveur web est connu.\nRendre le répertoire <nowiki><code>$3</code></nowiki> accessible en écriture pour continuer.\nSur un système UNIX/Linux, saisir :\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
-       "config-sqlite-parent-unwritable-nogroup": "Impossible de créer le répertoire de données <nowiki><code>$1</code></nowiki>, parce que le répertoire parent <nowiki><code>$2</code></nowiki> n'est pas accessible en écriture par le serveur Web.\n\nL'utilisateur du serveur web est inconnu.\nRendre le répertoire <nowiki><code>$3</code></nowiki> globalement accessible en écriture pour continuer.\nSur un système UNIX/Linux, saisir :\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
+       "config-sqlite-name-help": "Choisir un nom qui identifie votre wiki.\nNe pas utiliser d'espaces ni de traits d'union.\nIl sera utilisé pour le fichier de données SQLite.",
+       "config-sqlite-parent-unwritable-group": "Impossible de créer le répertoire de données <nowiki><code>$1</code></nowiki>, parce que le répertoire parent <nowiki><code>$2</code></nowiki> n'est pas accessible en écriture par le serveur Web.\n\nL'installateur a détecté sous quel nom d'utilisateur, le serveur web est actif.\nRendre le répertoire <nowiki><code>$3</code></nowiki> accessible en écriture pour continuer.\nSur un système UNIX/Linux, saisir :\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
+       "config-sqlite-parent-unwritable-nogroup": "Impossible de créer le répertoire de données <nowiki><code>$1</code></nowiki>, parce que le répertoire parent <nowiki><code>$2</code></nowiki> n'est pas accessible en écriture par le serveur Web.\n\nL'installateur n'a pas pu déterminer le nom de l'utilisateur sous lequel le serveur s'exécute.\nRendre le répertoire <nowiki><code>$3</code></nowiki> globalement accessible en écriture pour continuer.\nSur un système UNIX/Linux, saisir :\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
        "config-sqlite-mkdir-error": "Erreur de création du répertoire de données « $1 ».\nVérifiez l'emplacement et essayez à nouveau.",
-       "config-sqlite-dir-unwritable": "Impossible d'écrire dans le répertoire « $1 ».\nChanger les permissions de sorte que le serveur peut y écrire et essayez à nouveau.",
+       "config-sqlite-dir-unwritable": "Impossible d'écrire dans le répertoire « $1 ».\nChanger les permissions de sorte que le serveur puisse y écrire et essayez à nouveau.",
        "config-sqlite-connection-error": "$1.\n\nVérifier le répertoire des données et le nom de la base de données ci-dessous et réessayer.",
        "config-sqlite-readonly": "Le fichier <code>$1</code> n'est pas accessible en écriture.",
        "config-sqlite-cant-create-db": "Impossible de créer le fichier de base de données <code>$1</code>.",
-       "config-sqlite-fts3-downgrade": "PHP ne vient pas avec FTS3, les tables sont diminuées.",
+       "config-sqlite-fts3-downgrade": "PHP n'a pas trouvé le support FTS3, les tables sont restreintes.",
        "config-can-upgrade": "Il y a des tables MediaWiki dans cette base de données.\nPour les mettre au niveau de MediaWiki $1, cliquez sur '''Continuer'''.",
-       "config-upgrade-done": "Mise à jour complétée.\n\nVous pouvez maintenant [$1 commencer à utiliser votre wiki].\n\nSi vous souhaitez régénérer votre fichier <code>LocalSettings.php</code>, cliquez sur le bouton ci-dessous.\nCe '''n'est pas recommandé''' sauf si vous rencontrez des problèmes avec votre wiki.",
+       "config-upgrade-done": "Mise à jour terminée.\n\nVous pouvez maintenant [$1 commencer à utiliser votre wiki].\n\nSi vous souhaitez régénérer votre fichier <code>LocalSettings.php</code>, cliquez sur le bouton ci-dessous.\nCeci '''n'est pas recommandé''' sauf si vous rencontrez des problèmes avec votre wiki.",
        "config-upgrade-done-no-regenerate": "Mise à jour terminée.\n\nVous pouvez maintenant [$1 commencer à utiliser votre wiki].",
        "config-regenerate": "Regénérer LocalSettings.php →",
        "config-show-table-status": "Échec de la requête <code>SHOW TABLE STATUS</code> !",
-       "config-unknown-collation": "'''Attention:''' La base de données effectue un classement alphabétique (''collation'') inconnu.",
+       "config-unknown-collation": "'''Attention:''' La base de données utilise un classement alphabétique (''collation'') inconnu.",
        "config-db-web-account": "Compte de la base de données pour l'accès Web",
        "config-db-web-help": "Sélectionnez le nom d'utilisateur et le mot de passe que le serveur web utilisera pour se connecter au serveur de base de données pendant le fonctionnement habituel du wiki.",
        "config-db-web-account-same": "Utilisez le même compte que pour l'installation",
        "config-mysql-engine": "Moteur de stockage :",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
-       "config-mysql-myisam-dep": "''' Avertissement ''': vous avez sélectionné MyISAM comme moteur de stockage pour MySQL, ce qui n'est pas recommandé pour une utilisation avec MediaWiki, parce que:\n * il supporte à peine la simultanéité en raison de verrouillage de table\n * il est plus sujet à la corruption que les autres moteurs\n * le codebase MediaWiki ne gère pas toujours MyISAM comme il se doit\nSi votre installation MySQL supporte InnoDB, il est fortement recommandé que vous le choisissez plutôt. Si votre installation MySQL ne supporte pas les tables InnoDB, il est peut-être temps de faire une mise à niveau.",
+       "config-mysql-myisam-dep": "''' Avertissement ''': vous avez sélectionné MyISAM comme moteur de stockage pour MySQL, ce qui n'est pas recommandé pour une utilisation avec MediaWiki, parce que:\n * il supporte à peine la simultanéité en raison de verrouillage de table\n * il est plus sujet à la corruption que les autres moteurs\n * le codebase MediaWiki ne gère pas toujours MyISAM comme il se doit\n\nSi votre installation MySQL supporte InnoDB, il est fortement recommandé que vous le choisissiez plutôt. \nSi votre installation MySQL ne supporte pas les tables InnoDB, il est peut-être temps de faire une mise à niveau.",
        "config-mysql-only-myisam-dep": "'''Attention :''' MyISAM est le seul moteur de stockage disponible pour MySQL sur cette machine, et cela n’est pas recommandé pour une utilisation avec MédiaWiki, car :\n* il supporte très peu les accès concurrents à cause du verrouillage des tables\n* il est plus sujet à corruption que les autres moteurs\n* le code de base de MédiaWiki ne gère pas toujours MyISAM comme il faudrait\n\nVotre installation MySQL ne supporte pas InnoDB ; il est peut-être temps de la mettre à jour.",
-       "config-mysql-engine-help": "'''InnoDB''' est presque toujours la meilleure option, car il supporte bien l'[http://fr.wikipedia.org/wiki/Ordonnancement_dans_les_syst%C3%A8mes_d%27exploitation ordonnancement].\n\n'''MyISAM''' peut être plus rapide dans les installations monoposte ou en lecture seule. Les bases de données MyISAM ont tendance à se corrompre plus souvent que celles d'InnoDB.",
+       "config-mysql-engine-help": "'''InnoDB''' est presque toujours la meilleure option, car il supporte bien les accès concurrents.\n\n'''MyISAM''' peut être plus rapide dans les installations monoposte ou en lecture seule. \nLes bases de données MyISAM ont tendance à se corrompre plus souvent que les bases d'InnoDB.",
        "config-mysql-charset": "Jeu de caractères de la base de données :",
        "config-mysql-binary": "Binaire",
        "config-mysql-utf8": "UTF-8",
-       "config-mysql-charset-help": "En ''mode binaire'', MediaWiki stocke le texte au format UTF-8 dans la base de données. C'est plus efficace que le ''UTF-8 mode'' de MySQL, et vous permet d'utiliser toute la gamme des caractères Unicode.\n\nEn ''mode binaire'', MediaWiki stocke le texte UTF-8 dans des champs binaires de la base de données. C'est plus efficace que le ''mode UTF-8'' de MySQL, et vous permet d'utiliser toute la gamme des caractères Unicode.\nEn ''mode UTF-8'', MySQL connaîtra le jeu de caractères de vos données et pourra présenter et convertir les données de manière appropriée, mais il ne vous laissera pas stocker les caractères au-dessus du [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes plan multilingue de base] (en anglais).",
+       "config-mysql-charset-help": "En ''mode binaire'', MediaWiki stocke le texte au format UTF-8 dans la base de données dans des champs binaires.\nC'est plus efficace que le ''UTF-8 mode'' de MySQL, et vous permet d'utiliser toute la gamme des caractères Unicode.\n\nEn ''mode UTF-8'', MySQL reconnaîtra le jeu de caractères dans lequel sont vos données et pourra les présenter et les convertir de manière appropriée, mais il ne vous laissera pas stocker les caractères au-dessus du [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes plan multilingue de base] (en anglais).",
        "config-mssql-auth": "Type d’authentification :",
        "config-mssql-install-auth": "Sélectionner le type d’authentification qui sera utilisé pour se connecter à la base de données pendant le processus d’installation.\nSi vous sélectionnez « {{int:config-mssql-windowsauth}} », les informations d’identification de l’utilisateur faisant tourner le serveur seront utilisées.",
        "config-mssql-web-auth": "Sélectionner le type d’authentification que le serveur web utilisera pour se connecter au serveur de base de données lors des opérations habituelles du wiki.\nSi vous sélectionnez « {{int:config-mssql-windowsauth}} », les informations d’identification de l’utilisateur sous lequel tourne le serveur web seront utilisées.",
        "config-mssql-sqlauth": "Authentification de SQL Server",
        "config-mssql-windowsauth": "Authentification Windows",
        "config-site-name": "Nom du wiki :",
-       "config-site-name-help": "Il apparaîtra dans la barre de titre du navigateur et en divers autres endroits.",
+       "config-site-name-help": "Ceci apparaîtra dans la barre de titre du navigateur et en divers autres endroits.",
        "config-site-name-blank": "Entrez un nom de site.",
        "config-project-namespace": "Espace de noms du projet :",
        "config-ns-generic": "Projet",
        "config-ns-site-name": "Même nom que le wiki : $1",
        "config-ns-other": "Autre (préciser)",
        "config-ns-other-default": "MonWiki",
-       "config-project-namespace-help": "Suivant l'exemple de Wikipédia, plusieurs wikis gardent leurs pages de politique séparées de leurs pages de contenu, dans un ''espace de noms'' propre.\nTous les titres de page de cet espace de noms commence par un préfixe défini, que vous pouvez spécifier ici.\nTraditionnellement, ce préfixe est dérivé du nom du wiki, mais il ne peut contenir des caractères de ponctuation tels que « # » ou « : ».",
-       "config-ns-invalid": "L'espace de noms spécifié « <nowiki>$1</nowiki> » n'est pas valide.\nSpécifiez un espace de noms pour le projet.",
-       "config-ns-conflict": "L'espace de noms spécifié « <nowiki>$1</nowiki> » est en conflit avec un espace de noms par défaut de MediaWiki.\nChoisir un autre espace de noms.",
+       "config-project-namespace-help": "Suivant l'exemple de Wikipédia, plusieurs wikis gardent leurs pages de politique séparées de leurs pages de contenu, dans un ''espace de noms de niveau projet'' propre.\nTous les titres de page de cet espace de noms commence par un préfixe défini, que vous pouvez spécifier ici.\nTraditionnellement, ce préfixe est dérivé du nom du wiki, et ne peut contenir de caractères de ponctuation tels que « # » ou « : ».",
+       "config-ns-invalid": "L'espace de noms spécifié « <nowiki>$1</nowiki> » n'est pas valide.\nSpécifiez un espace de noms différent pour le projet.",
+       "config-ns-conflict": "L'espace de noms spécifié « <nowiki>$1</nowiki> » est en conflit avec un espace de noms par défaut de MediaWiki.\nChoisir un autre espace de noms pour le projet.",
        "config-admin-box": "Compte administrateur",
        "config-admin-name": "Votre nom d’utilisateur :",
        "config-admin-password": "Mot de passe :",
        "config-admin-error-user": "Erreur interne lors de la création d'un administrateur avec le nom « <nowiki>$1</nowiki> ».",
        "config-admin-error-password": "Erreur interne lors de l'inscription d'un mot de passe pour l'administrateur « <nowiki>$1</nowiki> » : <pre>$2</pre>",
        "config-admin-error-bademail": "Vous avez entré une adresse de courriel invalide",
-       "config-subscribe": "Abonnez-vous à la [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce liste d'annonce des nouvelles versions] (la page peut afficher le texte en français).",
+       "config-subscribe": "Abonnez-vous à la [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce liste d'annonce des nouvelles versions]",
        "config-subscribe-help": "Il s'agit d'une liste de diffusion à faible volume utilisée servant à annoncer les nouvelles versions, y compris les versions améliorant la sécurité du logiciel.\nVous devriez y souscrire et mettre à jour votre version de MediaWiki lorsque de nouvelles versions sont publiées.",
        "config-subscribe-noemail": "Vous avez essayé de vous abonner à la liste de diffusion des communiqués, sans fournir une adresse courriel ! S'il vous plaît, fournir une adresse électronique si vous souhaitez vous abonner à la liste de diffusion.",
        "config-almost-done": "Vous avez presque fini !\nVous pouvez passer la configuration restante et installer immédiatement le wiki.",
        "config-profile-no-anon": "Création de compte requise",
        "config-profile-fishbowl": "Éditeurs autorisés seulement",
        "config-profile-private": "Wiki privé",
-       "config-profile-help": "Les wikis fonctionnent mieux lorsque vous laissez le plus de personnes possible le modifier.\nAvec MediaWiki, il est facile de vérifier les modifications récentes et de révoquer tout dommage créé par des utilisateurs débutants ou mal intentionnés.\n\nCependant, de nombreuses autres utilisations ont été trouvées au logiciel et il n’est pas toujours facile de convaincre tout le monde des bénéfices de l’esprit wiki.\nVous avez donc le choix.\n\nLe modèle '''{{int:config-profile-wiki}}''' autorise toute personne à modifier, y compris sans s’identifier.\n'''{{int:config-profile-no-anon}}''' fournit plus de contrôle, par l’identification, mais peut rebuter les contributeurs occasionnels.\n\n'''{{int:config-profile-fishbowl}}''' autorise la modification par les utilisateurs approuvés, mais le public peut toujours lire les pages et leur historique.\n'''{{int:config-profile-private}}''' n’autorise que les utilisateurs approuvés à voir et modifier les pages.\n\nDes configurations de droits d’utilisateurs plus complexes sont disponibles après l'installation, voir la [//www.mediawiki.org/wiki/Manual:User_rights page correspondante du manuel].",
+       "config-profile-help": "Les wikis fonctionnent mieux lorsque vous laissez le plus de personnes possible les modifier.\nAvec MediaWiki, il est facile de vérifier les modifications récentes et de révoquer tout dommage créé par des utilisateurs débutants ou mal intentionnés.\n\nCependant, de nombreuses autres utilisations ont été trouvées au logiciel et il n’est pas toujours facile de convaincre tout le monde des bénéfices de l’esprit wiki.\nVous avez donc le choix.\n\nLe modèle '''{{int:config-profile-wiki}}''' autorise toute personne à modifier, y compris sans s’identifier.\n'''{{int:config-profile-no-anon}}''' fournit plus de contrôle, mais peut rebuter les contributeurs occasionnels.\n\n'''{{int:config-profile-fishbowl}}''' autorise la modification par les utilisateurs approuvés, mais le public peut toujours lire les pages et leur historique.\n'''{{int:config-profile-private}}''' n’autorise que les utilisateurs approuvés à voir les pages dans le même groupe que les utilisateurs autorisés à y écrire.\n\nDes configurations de droits d’utilisateurs plus complexes sont disponibles après l'installation, voir la [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights page correspondante du manuel].",
        "config-license": "Droits d'auteur et licence :",
        "config-license-none": "Aucune licence en bas de page",
        "config-license-cc-by-sa": "Creative Commons attribution partage à l'identique",
        "config-license-gfdl": "GNU Free Documentation License 1.3 ou ultérieure",
        "config-license-pd": "Domaine public",
        "config-license-cc-choose": "Sélectionner une licence Creative Commons personnalisée",
-       "config-license-help": "Beaucoup de wikis publics mettent l'ensemble des contributions sous [http://freedomdefined.org/Definition/Fr licence libre].\nCela contribue à créer un sentiment d'appartenance dans leur communauté et encourage les contributions sur le long terme.\nCe n'est généralement pas nécessaire pour un wiki privé ou d'entreprise.\n\nSi vous souhaitez utiliser des textes de Wikipédia, et souhaitez que Wikipédia réutilise des textes de votre wiki, vous devriez choisir la [http://creativecommons.org/licenses/by-sa/3.0/deed.fr licence ''Creative Commons Attribution Share Alike''] (CC-by-sa).\n\nWikipédia a déjà été publié selon les termes de la [http://fr.wikipedia.org/wiki/Licence_de_documentation_libre_GNU ''GNU Free Documentation License''] (GFDL).\nC'est une licence valide, mais elle est difficile à comprendre. De plus, elle possède des caractéristiques qui rendent difficiles la réutilisation.",
+       "config-license-help": "Beaucoup de wikis publics mettent l'ensemble des contributions sous [http://freedomdefined.org/Definition/Fr licence libre].\nCela contribue à créer un sentiment d'appartenance dans leur communauté et encourage les contributions sur le long terme.\nCe n'est généralement pas nécessaire pour un wiki privé ou d'entreprise.\n\nSi vous souhaitez utiliser des textes de Wikipédia, et souhaitez que Wikipédia réutilise des textes de votre wiki, vous devriez choisir la licence ''Creative Commons Attribution Share Alike''].\n\nWikipédia utilisait auparavent la ''GNU Free Documentation License'' (GFDL).\nC'est une licence valide, mais elle est difficile à comprendre. \nDe plus, elle possède des caractéristiques qui rendent difficile la réutilisation.sour GFDL des contenus.",
        "config-email-settings": "Paramètres de courriel",
        "config-enable-email": "Activer les courriels sortants",
        "config-enable-email-help": "Si vous souhaitez utiliser le courriel, vous devez [http://www.php.net/manual/en/mail.configuration.php configurer des paramètres PHP] (texte en anglais).\nSi vous ne voulez pas du service de courriel, vous pouvez le désactiver ici.",
        "config-email-sender-help": "Entrez l'adresse de courriel à utiliser comme adresse de retour des courriels sortant.\nLes courriels rejetés y seront envoyés.\nDe nombreux serveurs de courriels exigent au moins un [http://fr.wikipedia.org/wiki/Nom_de_domaine nom de domaine] valide.",
        "config-upload-settings": "Téléchargement des images et des fichiers",
        "config-upload-enable": "Activer le téléchargement des fichiers",
-       "config-upload-help": "Le téléchargement des fichiers expose votre serveur à des risques de sécurité.\nPour plus d'informations, lire la section [//www.mediawiki.org/wiki/Manual:Security ''Security''] du manuel d'installation (en anglais).\n\nPour autoriser le téléchargement des fichiers, modifier le mode du sous-répertoire <code>images</code> qui se situe sous le répertoire racine de MediaWiki.\nEnsuite, activez cette option.",
+       "config-upload-help": "Le téléchargement des fichiers expose votre serveur à des risques de sécurité.\nPour plus d'informations, lire la section [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security ''Security''] du manuel d'installation (en anglais).\n\nPour autoriser le téléchargement des fichiers, modifier le mode du sous-répertoire <code>images</code> qui se situe sous le répertoire racine de MediaWiki de sorte à ce que le serveur web puisse écrire dedans.\nEnsuite, activez cette option.",
        "config-upload-deleted": "Répertoire pour les fichiers supprimés :",
        "config-upload-deleted-help": "Choisissez un répertoire qui servira à archiver les fichiers supprimés.\nIdéalement, il ne devrait pas être accessible depuis le web.",
        "config-logo": "URL du logo :",
        "config-logo-help": "L’habillage par défaut de MediaWiki comprend l’espace pour un logo de 135x160 pixels au-dessus de la barre de menu latérale.\nTéléchargez une image de la taille appropriée, et entrez son URL ici.\n\nVous pouvez utiliser <code>$wgStylePath</code> ou <code>$wgScriptPath</code> si votre logo est relatif à ces chemins.\n\nSi vous ne voulez pas de logo, laissez cette case vide.",
        "config-instantcommons": "Activer ''InstantCommons''",
-       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons InstantCommons] est un service qui permet d'utiliser les images, les sons et les autres médias disponibles sur le site [//commons.wikimedia.org/ Wikimedia Commons].\nPour se faire, il faut que MediaWiki accède à Internet.\n\nPour plus d'informations sur ce service, y compris les instructions sur la façon de le configurer pour d'autres wikis que Wikimedia Commons, consultez le [//mediawiki.org/wiki/Manual:$wgForeignFileRepos manuel] (en anglais).",
+       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons InstantCommons] est un service qui permet d'utiliser les images, les sons et les autres médias disponibles sur le site [//commons.wikimedia.org/ Wikimedia Commons].\nPour se faire, il faut que MediaWiki accède à Internet.\n\nPour plus d'informations sur ce service, y compris les instructions sur la façon de le configurer pour d'autres wikis que Wikimedia Commons, consultez le [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos manuel] (en anglais).",
        "config-cc-error": "Le sélection d'une licence ''Creative Commons'' n'a donné aucun résultat.\nEntrez le nom de la licence manuellement.",
        "config-cc-again": "Choisissez à nouveau...",
        "config-cc-not-chosen": "Choisissez une licence ''Creative Commons'' et cliquez sur « Continuer ».",
        "config-advanced-settings": "Configuration avancée",
        "config-cache-options": "Paramètres pour la mise en cache des objets:",
        "config-cache-help": "La mise en cache des objets améliore la vitesse de MediaWiki en mettant en cache les données fréquemment utilisées.\nLes sites de taille moyenne à grande sont fortement encouragés à l'activer. Les petits sites y verront également des avantages.",
-       "config-cache-none": "Aucune mise en cache (aucune fonctionnalité supprimée, mais la vitesse peut changer sur les wikis importants)",
+       "config-cache-none": "Pas de mise en cache (aucune fonctionnalité n'a été supprimée, mais la vitesse peut changer sur les wikis importants)",
        "config-cache-accel": "Mise en cache des objets PHP (APC, XCache ou WinCache)",
        "config-cache-memcached": "Utiliser Memcached (nécessite une installation et une configuration supplémentaires)",
        "config-memcached-servers": "serveurs pour Memcached :",
-       "config-memcached-help": "Liste des adresses IP à utiliser pour Memcached.\nElles doivent être séparés par des virgules et vous devez spécifier le port à utiliser. Par exemple :\n  127.0.0.1:11211\n  192.168.1.25:1234",
-       "config-memcache-needservers": "Vous avez sélectionné Memcached comme type de cache, mais ne précisez pas de serveur.",
+       "config-memcached-help": "Liste des adresses IP à utiliser pour Memcached.\nUne par ligne, en indiquant le port à utiliser. Par exemple :\n  127.0.0.1:11211\n  192.168.1.25:1234",
+       "config-memcache-needservers": "Vous avez sélectionné Memcached comme type de cache, mais n'avez pas précisé de serveurs.",
        "config-memcache-badip": "Vous avez entré une adresse IP invalide pour Memcached: $1.",
        "config-memcache-noport": "Vous n'avez pas entré un port pour le serveur Memcached : $1.\nSi vous ne le connaissez pas, la valeur par défaut est 11211.",
        "config-memcache-badport": "Les numéros de port de Memcached sont situés entre $1 et $2.",
        "config-extensions": "Extensions",
        "config-extensions-help": "Les extensions énumérées ci-dessus ont été détectées dans votre répertoire <code>./extensions</code>.\n\nElles peuvent nécessiter une configuration supplémentaire, mais vous pouvez les activer maintenant",
        "config-install-alreadydone": "'''Attention''': Vous semblez avoir déjà installé MediaWiki et tentez de l'installer à nouveau.\nS'il vous plaît, allez à la page suivante.",
-       "config-install-begin": "En appuyant sur {{int:config-continue}}, vous commencerez l'installation de MediaWiki.\nSi vous voulez apporter des modifications, appuyez sur \"{{int:config-back}}\".",
+       "config-install-begin": "En appuyant sur {{int:config-continue}}, vous commencerez l'installation de MediaWiki.\nSi vous voulez encore apporter des modifications, appuyez sur \"{{int:config-back}}\".",
        "config-install-step-done": "fait",
        "config-install-step-failed": "échec",
        "config-install-extensions": "Inclusion des extensions",
        "config-install-pg-plpgsql": "Vérification du langage PL/pgSQL",
        "config-pg-no-plpgsql": "Vous devez installer le langage PL/pgSQL dans la base de données $1",
        "config-pg-no-create-privs": "Le compte que vous avez spécifié pour l'installation n'a pas suffisamment de privilèges pour créer un compte.",
-       "config-pg-not-in-role": "Le compte que vous avez spécifié pour l'utilisateur web existe déjà !\nLe compte que vous avez spécifié pour l'installation n'est pas un super-utilisateur et n'est pas membre du rôle de l'internaute, il est donc incapable de créer des objets appartenant à l'utilisateur web.!\n\nMediaWiki exige actuellement que les tableaux soient possédés par un utilisateur web. S'il vous plaît, spécifier un autre nom de compte web, ou cliquez sur \"retour\" et spécifier un utilisateur avec les privilèges suffisants.",
+       "config-pg-not-in-role": "Le compte que vous avez spécifié pour l'utilisateur web existe déjà.\nLe compte que vous avez spécifié pour l'installation n'est pas un super-utilisateur et n'est pas un membre du rôle de l'internaute, il est donc incapable de créer des objets appartenant à l'utilisateur web.\n\nMediaWiki exige actuellement que les tables soient possédés par un utilisateur web. S'il vous plaît, spécifiez un autre nom de compte web, ou cliquez sur \"retour\" et spécifiez un utilisateur ayant les privilèges suffisants pour installer.",
        "config-install-user": "Création d'un utilisateur de la base de données",
        "config-install-user-alreadyexists": "L'utilisateur « $1 » existe déjà.",
        "config-install-user-create-failed": "Échec lors de la création de l'utilisateur « $1 » : $2",
        "config-install-user-grant-failed": "Échec lors de l'ajout de permissions à l'utilisateur « $1 » : $2",
        "config-install-user-missing": "L'utilisateur \"$1\" n'existe pas.",
-       "config-install-user-missing-create": "L'utilisateur \"$1\" n'existe pas !\nS'il vous plaît, cocher \"Compte de créer\" dans la case ci-dessous si vous voulez le créer.",
+       "config-install-user-missing-create": "L'utilisateur \"$1\" n'existe pas.\nS'il vous plaît, cocher \"Compte de créer\" dans la case ci-dessous si vous voulez le créer.",
        "config-install-tables": "Création des tables",
        "config-install-tables-exist": "'''Avertissement:''' Les tables MediaWiki semblent déjà exister.\nCréation omise.",
-       "config-install-tables-failed": "'''Erreur:''' échec lors de la création de la table avec l'erreur suivante: $1",
+       "config-install-tables-failed": "'''Erreur:''' échec lors de la création de table avec l'erreur suivante: $1",
        "config-install-interwiki": "Remplissage par défaut de la table des interwikis",
-       "config-install-interwiki-list": "Impossible de trouver le fichier <code>interwiki.list</code>.",
+       "config-install-interwiki-list": "Impossible de lire le fichier <code>interwiki.list</code>.",
        "config-install-interwiki-exists": "'''Attention:''' La table des interwikis semble déjà contenir des entrées.\nLa liste par défaut ne sera pas inscrite.",
        "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-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 allow_url_fopen n’est pas disponible.",
+       "config-install-subscribe-notpossible": "cURL n’est pas installé et <code>allow_url_fopen</code> n’est pas disponible.",
        "config-install-mainpage": "Création de la page principale avec un contenu par défaut",
        "config-install-extension-tables": "Création de tables pour les extensions activées",
        "config-install-mainpage-failed": "Impossible d’insérer la page principale : $1",
-       "config-install-done": "'''Félicitations!'''\nVous avez réussi à installer MediaWiki.\n\nLe programme d'installation a généré <code>LocalSettings.php</code>, un fichier qui contient tous les paramètres de configuration.\n\nSi le téléchargement n'a pas été offert, ou que vous l'avez annulé, vous pouvez démarrer à nouveau le téléchargement en cliquant ce lien :\n\n$3\n\n'''Note''': Si vous ne le faites pas maintenant, ce fichier de configuration généré ne sera pas disponible plus tard si vous quittez l'installation sans le télécharger.\n\nLorsque c'est fait, vous pouvez '''[$2 accéder à votre wiki]'''.",
+       "config-install-done": "'''Félicitations!'''\nVous avez réussi à installer MediaWiki.\n\nLe programme d'installation a généré un fichier <code>LocalSettings.php</code>. Il contient tous les paramètres de votre configuration.\n\nVous devrez le télécharger et le mettre à la racine de votre installation wiki (dans le même répertoire que index.php). Le téléchargement démarre automatiquement.\n\nSi le téléchargement n'a pas été offert, ou que vous l'avez annulé, vous pouvez démarrer à nouveau le téléchargement en cliquant ce lien :\n\n$3\n\n'''Note''': Si vous ne le faites pas maintenant, ce fichier de configuration généré ne sera pas disponible plus tard si vous quittez l'installation sans le télécharger.\n\nLorsque c'est fait, vous pouvez '''[$2 accéder à votre wiki]'''.",
        "config-download-localsettings": "Télécharger <code>LocalSettings.php</code>",
        "config-help": "aide",
+       "config-help-tooltip": "cliquer pour agrandir",
        "config-nofile": "Le fichier « $1 » est introuvable. A-t-il été supprimé ?",
-       "config-extension-link": "Saviez-vous que votre wiki supporte [//www.mediawiki.org/wiki/Manual:Extensions des extensions] ?\n\nVous pouvez consulter les [//www.mediawiki.org/wiki/Category:Extensions_by_category extensions par catégorie] ou la [//www.mediawiki.org/wiki/Extension_Matrix Matrice des extensions] pourvoir la liste complète des extensions.",
+       "config-extension-link": "Saviez-vous que votre wiki supporte [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions des extensions] ?\n\nVous pouvez consulter les [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensions par catégorie].",
        "mainpagetext": "<strong>MediaWiki a été installé avec succès.</strong>",
-       "mainpagedocfooter": "Consultez le [//meta.wikimedia.org/wiki/Aide:Contenu Guide de l’utilisateur] pour plus d’informations sur l’utilisation de ce logiciel de wiki.\n\n== Pour démarrer ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Liste des paramètres de configuration]\n* [//www.mediawiki.org/wiki/Manual:FAQ/fr FAQ sur MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Liste de discussion sur les distributions de MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Adaptez MediaWiki dans votre langue]"
+       "mainpagedocfooter": "Consultez le [//meta.wikimedia.org/wiki/Help:Contents/fr Guide de l’utilisateur] pour plus d’informations sur l’utilisation de ce logiciel de wiki.\n\n== Pour démarrer ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Liste des paramètres de configuration]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/fr Questions courantes sur MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Liste de discussion sur les distributions de MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Adaptez MediaWiki dans votre langue]"
 }
index d9ed33a..e05cd25 100644 (file)
@@ -1,5 +1,5 @@
 {
        "@metadata": [],
        "mainpagetext": "'''Vous avez bien installé MediaWiki.'''",
-       "mainpagedocfooter": "Lisez la [//meta.wikimedia.org/wiki/Help:Contents Guide des Useurs] pour apprendre à user le wiki software.\n\n== Pour Commencer ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Réglage]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki: Questions Souvent Posées]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki Liste à Malle]"
+       "mainpagedocfooter": "Lisez la [//meta.wikimedia.org/wiki/Help:Contents Guide des Useurs] pour apprendre à user le wiki software.\n\n== Pour Commencer ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Réglage]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki: Questions Souvent Posées]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki Liste à Malle]"
 }
index ad5fa7d..fe0999f 100644 (file)
        "config-download-localsettings": "Tèlèchargiér <code>LocalSettings.php</code>",
        "config-help": "éde",
        "mainpagetext": "'''MediaWiki at étâ enstalâ avouéc reusséta.'''",
-       "mainpagedocfooter": "Vêde lo [//meta.wikimedia.org/wiki/Aide:Contenu guido d’usanciér] por més d’enformacions sur l’usâjo de la programeria vouiqui.\n\n== Emmodar avouéc MediaWiki ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista des paramètres de configuracion]\n* [//www.mediawiki.org/wiki/Manual:FAQ/fr FDQ sur MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de discussion sur les distribucions de MediaWiki]"
+       "mainpagedocfooter": "Vêde lo [//meta.wikimedia.org/wiki/Aide:Contenu guido d’usanciér] por més d’enformacions sur l’usâjo de la programeria vouiqui.\n\n== Emmodar avouéc MediaWiki ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista des paramètres de configuracion]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/fr FDQ sur MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de discussion sur les distribucions de MediaWiki]"
 }
index 5dc4cbe..b5d7d26 100644 (file)
@@ -6,5 +6,5 @@
                ]
        },
        "mainpagetext": "'''Det instaliarin faan MediaWiki hää loket.'''",
-       "mainpagedocfooter": "Consult the [//meta.wikimedia.org/wiki/Help:Contents User's Guide] for information on using the wiki software.\n\n== Getting started ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Localise MediaWiki for your language]"
+       "mainpagedocfooter": "Consult the [//meta.wikimedia.org/wiki/Help:Contents User's Guide] for information on using the wiki software.\n\n== Getting started ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]"
 }
index b790c94..1eb0d89 100644 (file)
@@ -1,5 +1,9 @@
 {
-       "@metadata": [],
+       "@metadata": {
+               "authors": [
+                       "Seb35"
+               ]
+       },
        "mainpagetext": "'''MediaWiki-program goed ynstallearre.'''",
-       "mainpagedocfooter": "Rieplachtsje de [//meta.wikimedia.org/wiki/Help:Ynhâldsopjefte hantlieding] foar ynformaasje oer it gebrûk fan 'e wikisoftware.\n\n== Mear help oer Mediawiki ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings List mei ynstellings]\n* [//www.mediawiki.org/wiki/Manual:FAQ Faak stelde fragen (FAQ)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglist foar oankundigings fan nije ferzjes]"
+       "mainpagedocfooter": "Rieplachtsje de [//meta.wikimedia.org/wiki/Help:Contents Ynhâldsopjefte hantlieding] foar ynformaasje oer it gebrûk fan 'e wikisoftware.\n\n== Mear help oer Mediawiki ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings List mei ynstellings]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Faak stelde fragen (FAQ)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglist foar oankundigings fan nije ferzjes]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]"
 }
index 9cdf796..1db31e9 100644 (file)
@@ -1,5 +1,5 @@
 {
        "@metadata": [],
        "mainpagetext": "'''MediaWiki başarılan kuruldu.'''",
-       "mainpagedocfooter": "Vikilän iş uurunda bilgi almaa için [//meta.wikimedia.org/wiki/Help:Contents User's Guide] sayfasına bakınız\n\n== Eni başlayanlar için ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]"
+       "mainpagedocfooter": "Vikilän iş uurunda bilgi almaa için [//meta.wikimedia.org/wiki/Help:Contents User's Guide] sayfasına bakınız\n\n== Eni başlayanlar için ==\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 6ffabdb..a798772 100644 (file)
@@ -1,5 +1,5 @@
 {
        "@metadata": [],
        "mainpagetext": "'''安装正MediaWiki喽。'''",
-       "mainpagedocfooter": "参看[//meta.wikimedia.org/wiki/Help:Contents 用户指南]里头会话到啷用wiki软件\n\n== 开始使用 ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings MediaWiki 配置设定列表]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki 平常问题解答]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 发布email清单]"
+       "mainpagedocfooter": "参看[//meta.wikimedia.org/wiki/Help:Contents 用户指南]里头会话到啷用wiki软件\n\n== 开始使用 ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings MediaWiki 配置设定列表]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki 平常问题解答]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 发布email清单]"
 }
index 262f189..87f1df5 100644 (file)
@@ -5,5 +5,5 @@
                ]
        },
        "mainpagetext": "'''安裝正MediaWiki哩。'''",
-       "mainpagedocfooter": "參看[//meta.wikimedia.org/wiki/Help:Contents 用戶指南]裡頭會話到啷用wiki軟件\n\n== 開始使用 ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings MediaWiki 配置設定列表]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki 平常問題解答]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 發佈email清單]"
+       "mainpagedocfooter": "參看[//meta.wikimedia.org/wiki/Help:Contents 用戶指南]裡頭會話到啷用wiki軟件\n\n== 開始使用 ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings MediaWiki 配置設定列表]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki 平常問題解答]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 發佈email清單]"
 }
index cf75e3f..1a01d1f 100644 (file)
@@ -5,5 +5,5 @@
                ]
        },
        "mainpagetext": "'''Chaidh MediaWiki a stàladh gu soirbheachail.'''",
-       "mainpagedocfooter": "Cuir sùil air [//meta.wikimedia.org/wiki/Help:Contents treòir nan cleachdaichean] airson fiosrachadh mu chleachdadh a' bhathar-bhog wiki.\n\n== Toiseach tòiseachaidh ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Liosta suidheachadh nan roghainnean]\n* [//www.mediawiki.org/wiki/Manual:FAQ CÀBHA MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Liosta puist nan sgaoilidhean MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Cuir do chànan air MediaWiki]"
+       "mainpagedocfooter": "Cuir sùil air [//meta.wikimedia.org/wiki/Help:Contents treòir nan cleachdaichean] airson fiosrachadh mu chleachdadh a' bhathar-bhog wiki.\n\n== Toiseach tòiseachaidh ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Liosta suidheachadh nan roghainnean]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ CÀBHA MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Liosta puist nan sgaoilidhean MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Cuir do chànan air MediaWiki]"
 }
index c27c6e1..c18cb2e 100644 (file)
        "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-sidebar": "* [//www.mediawiki.org/wiki/MediaWiki/gl Páxina principal de MediaWiki]\n* [//www.mediawiki.org/wiki/Help:Contents Guía de usuario]\n* [//www.mediawiki.org/wiki/Manual:Contents Guía de administrador]\n* [//www.mediawiki.org/wiki/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-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-php-toolow": "Está instalado o PHP $1.\nPorén, MediaWiki necesita o PHP $2 ou superior.",
        "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/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/Unicode_normalization_considerations actualizar] se o uso de Unicode é importante para vostede.",
+       "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-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.",
@@ -84,7 +84,7 @@
        "config-no-cli-uri": "'''Aviso:''' 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/Manual:Security#Upload_security pechar esta vulnerabilidade de seguridade] antes de activar as cargas.",
+       "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-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-username": "Nome de usuario da base de datos:",
        "config-db-password": "Contrasinal da base de datos:",
        "config-db-password-empty": "Introduza un contrasinal para o novo usuario da base de datos: $1.\nMalia que é posible crear usuarios sen contrasinal, esta práctica non é segura.",
-       "config-db-username-empty": "Debe escribir un valor \"Nome de usuario da base de datos\"",
+       "config-db-username-empty": "Debe introducir un valor para \"{{int:config-db-username}}\"",
        "config-db-install-username": "Escriba o nome de usuario que empregará para conectarse á base de datos durante o proceso de instalación. Este non é o nome de usuario da conta de MediaWiki, trátase do nome de usuario para a súa base de datos.",
        "config-db-install-password": "Escriba o contrasinal que empregará para conectarse á base de datos durante o proceso de instalación. Este non é o contrasinal da conta de MediaWiki, trátase do contrasinal para a súa base de datos.",
        "config-db-install-help": "Introduza o nome de usuario e contrasinal que se usará para conectar á base de datos durante o proceso de instalación.",
        "config-header-oracle": "Configuración do Oracle",
        "config-header-mssql": "Configuración de Microsoft SQL Server",
        "config-invalid-db-type": "Tipo de base de datos incorrecto",
-       "config-missing-db-name": "Debe escribir un valor \"Nome da base de datos\"",
-       "config-missing-db-host": "Debe escribir un valor \"Servidor da base de datos\"",
-       "config-missing-db-server-oracle": "Debe escribir un valor \"TNS da base de datos\"",
+       "config-missing-db-name": "Debe introducir un valor para \"{{int:config-db-name}}\".",
+       "config-missing-db-host": "Debe introducir un valor para \"{{int:config-db-host}}\".",
+       "config-missing-db-server-oracle": "Debe introducir un valor para \"{{int:config-db-host-oracle}}\".",
        "config-invalid-db-server-oracle": "O TNS da base de datos, \"$1\", é incorrecto.\nUtilice só \"TNS Name\" ou unha cadea de texto \"Easy Connect\" ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm métodos de nomeamento de Oracle])",
        "config-invalid-db-name": "O nome da base de datos, \"$1\", é incorrecto.\nSó pode conter letras ASCII (a-z, A-Z), números (0-9), guións baixos (_) e guións (-).",
        "config-invalid-db-prefix": "O prefixo da base de datos, \"$1\", é incorrecto.\nSó pode conter letras ASCII (a-z, A-Z), números (0-9), guións baixos (_) e guións (-).",
        "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/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 '''{{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-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-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-upload-enable": "Activar a carga de ficheiros",
-       "config-upload-help": "A subida de ficheiros expón potencialmente o servidor a riscos de seguridade.\nPara obter máis información, lea a [//www.mediawiki.org/wiki/Manual:Security sección de seguridade] no manual.\n\nPara activar a carga de ficheiros, cambie o modo no subdirectorio <code>images</code> que está baixo o directorio raíz de MediaWiki, de xeito que o servidor web poida escribir nel.\nA continuación, active esta opción.",
+       "config-upload-help": "A subida de ficheiros expón potencialmente o servidor a riscos de seguridade.\nPara obter máis información, lea a [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security sección de seguridade] no manual.\n\nPara activar a carga de ficheiros, cambie o modo no subdirectorio <code>images</code> que está baixo o directorio raíz de MediaWiki, de xeito que o servidor web poida escribir nel.\nA continuación, active esta opción.",
        "config-upload-deleted": "Directorio para os ficheiros borrados:",
        "config-upload-deleted-help": "Escolla un directorio no que arquivar os ficheiros borrados.\nO ideal é que non sexa accesible desde a web.",
        "config-logo": "URL do logo:",
        "config-logo-help": "A aparencia de MediaWiki por defecto inclúe espazo para un logo de 135x160 píxeles por riba do menú lateral.\nCargue unha imaxe do tamaño axeitado e introduza o enderezo URL aquí.\n\nPode utilizar <code>$wgStylePath</code> ou <code>$wgScriptPath</code> se o seu logo está relacionado con esas rutas.\n\nSe non quere un logo, deixe esta caixa en branco.",
        "config-instantcommons": "Activar Instant Commons",
-       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons InstantCommons] é unha característica que permite aos wikis usar imaxes, sons e outros ficheiros multimedia atopados no sitio da [//commons.wikimedia.org/wiki/Portada_galega Wikimedia Commons].\nPara facer isto, MediaWiki necesita acceso á internet.\n\nPara obter máis información sobre esta característica, incluíndo as instrucións sobre como configuralo para outros wikis que non sexan a Wikimedia Commons, consulte [//mediawiki.org/wiki/Manual:$wgForeignFileRepos o manual].",
+       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons InstantCommons] é unha característica que permite aos wikis usar imaxes, sons e outros ficheiros multimedia atopados no sitio da [//commons.wikimedia.org/wiki/Portada_galega Wikimedia Commons].\nPara facer isto, MediaWiki necesita acceso á internet.\n\nPara obter máis información sobre esta característica, incluíndo as instrucións sobre como configuralo para outros wikis que non sexan a Wikimedia Commons, consulte [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos o manual].",
        "config-cc-error": "A escolla da licenza Creative Commons non deu resultados.\nEscriba o nome da licenza manualmente.",
        "config-cc-again": "Escolla outra vez...",
        "config-cc-not-chosen": "Escolla a licenza Creative Commons que desexe e prema en \"continuar\".",
        "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-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 allow_url_fopen non está dispoñible.",
+       "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-download-localsettings": "Descargar o <code>LocalSettings.php</code>",
        "config-help": "axuda",
        "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/Manual:Extensions extensións]?\n\nPode explorar as [//www.mediawiki.org/wiki/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.",
+       "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.'''",
-       "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/Manual:Configuration_settings Lista das opcións de configuración]\n* [//www.mediawiki.org/wiki/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/Localisation#Translation_resources Localice MediaWiki á súa lingua]"
+       "mainpagedocfooter": "Consulte a [//meta.wikimedia.org/wiki/Help:Contents guía de usuario] para obter máis información sobre como usar o software wiki.\n\n== Primeiros pasos ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista das opcións de configuración]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Preguntas máis frecuentes sobre MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo dos lanzamentos de MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localice MediaWiki á súa lingua]"
 }
index 74e9da2..eb1395c 100644 (file)
@@ -5,5 +5,5 @@
                ]
        },
        "config-page-language": "Bhas",
-       "mainpagedocfooter": "Wiki software uzar korpache mahiti khatir [//meta.wikimedia.org/wiki/Help:Contents Vapurpeanchi Hath-pustok] polloi\n\n== Suru kortana ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuracaoanchi suchi]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki babtint zaite pavtti vicharlele proxn]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki che novem ank bhair sorta tedna email dhadpachi suchi]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources MediaWiki tujea bhasen toiar kor]"
+       "mainpagedocfooter": "Wiki software uzar korpache mahiti khatir [//meta.wikimedia.org/wiki/Help:Contents Vapurpeanchi Hath-pustok] polloi\n\n== Suru kortana ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuracaoanchi suchi]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki babtint zaite pavtti vicharlele proxn]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki che novem ank bhair sorta tedna email dhadpachi suchi]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources MediaWiki tujea bhasen toiar kor]"
 }
index 332b819..44a894b 100644 (file)
@@ -7,5 +7,5 @@
        },
        "config-page-language": "Γλῶττα",
        "mainpagetext": "'''Ἡ ἐγκατάστασις τῆς MediaWiki ἦν ἐπιτυχής'''",
-       "mainpagedocfooter": "Βουλευθήσεσθε τὰς [//meta.wikimedia.org/wiki/Help:Contents βουλὰς τοῖς Χρωμένοις] ἵνα πληροφορηθῇτε περὶ τοῦ βίκιλογισμικοῦ.\n\n== Ἄρξασθε ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Διαλογή παραμέτρων διαμορφώσεως]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki: τὰ πολλάκις αἰτηθέντα]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Διαλογή διαλέξεων ἐπὶ τῶν διανομῶν τῆς MediaWiki]"
+       "mainpagedocfooter": "Βουλευθήσεσθε τὰς [//meta.wikimedia.org/wiki/Help:Contents βουλὰς τοῖς Χρωμένοις] ἵνα πληροφορηθῇτε περὶ τοῦ βίκιλογισμικοῦ.\n\n== Ἄρξασθε ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Διαλογή παραμέτρων διαμορφώσεως]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki: τὰ πολλάκις αἰτηθέντα]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Διαλογή διαλέξεων ἐπὶ τῶν διανομῶν τῆς MediaWiki]"
 }
index d499815..f653ca2 100644 (file)
        "config-restart": "Jo, nomol aafange",
        "config-welcome": "=== Priefig vu dr Inschtallationsumgäbig ===\nBasispriefige wäre durgfiert zum Feschtstelle, eb d Inschtallationsumgäbig fir d Inschtallation vu MediaWiki geignet isch.\nDu sottsch d Ergebnis vu däre Priefig aagee, wänn Du bi dr Inschtallation Hilf bruchsch.",
        "config-copyright": "=== Copyright un Nutzigsbedingige ===\n\n$1\n\nDes Programm isch e freji Software, d. h. s cha, no dr Bedingige vu dr GNU General Public-Lizänz, wu vu dr Free Software Foundation vereffentligt woren isch, wyterverteilt un/oder modifiziert wäre. Doderbyy cha d Version 2, oder no eigenem Ermässe, jedi nejeri Version vu dr Lizänz brucht wäre.\n\nDes Programm wird in dr Hoffnig verteilt, ass es nitzli isch, aber '''ohni jedi Garanti''' un sogar ohni di impliziert Garanti vun ere '''Märtgängigkeit''' oder '''Eignig fir e bstimmte Zwäck'''. Doderzue git meh Hiiwys in dr GNU General Public-Lizänz.\n\nE <doclink href=Copying>Kopi vu dr GNU General Public-Lizänz</doclink> sott zämme mit däm Programm verteilt wore syy. Wänn des nit eso isch, cha ne Kopi bi dr Free Software Foundation Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, schriftli aagforderet oder [http://www.gnu.org/copyleft/gpl.html online gläse] wäre.",
-       "config-sidebar": "* [//www.mediawiki.org MediaWiki Websyte vu MediaWiki]\n* [//www.mediawiki.org/wiki/Help:Contents Nutzeraaleitig zue MediaWiki]\n* [//www.mediawiki.org/wiki/Manual:Contents Adminischtratoreaaleitig zue MediaWiki]\n* [//www.mediawiki.org/wiki/Manual:FAQ Vilmol gstellti Froge zue MediaWiki]",
+       "config-sidebar": "* [//www.mediawiki.org MediaWiki Websyte vu MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Nutzeraaleitig zue MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Adminischtratoreaaleitig zue MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Vilmol gstellti Froge zue MediaWiki]",
        "config-env-good": "D Inschtallationsumgäbig isch prieft wore.\nDu chasch MediaWiki inschtalliere.",
        "config-env-bad": "D Inschtallationsumgäbigisch prieft wore.\nDu chasch MediaWiki nit inschtalliere.",
        "config-env-php": "PHP $1 isch inschtalliert.",
        "config-unicode-using-utf8": "Fir d Unicode-Normalisierig wird em Brion Vibber syy utf8_normalize.so yygsetzt.",
        "config-unicode-using-intl": "For d Unicode-Normalisierig wird d [http://pecl.php.net/intl PECL-Erwyterig intl] yygsetzt.",
-       "config-unicode-pure-php-warning": "'''Warnig:''' D [http://pecl.php.net/intl PECL-Erwyterig intl] isch fir d Unicode-Normalisierig nit verfiegbar. Wäge däm wird di langsam pure-PHP-Implementierig brucht.\nWänn Du ne Websyte mit ere große Bsuechrzahl bedrybsch, sottsch e weng ebis läse iber [//www.mediawiki.org/wiki/Unicode_normalization_considerations Unicode-Normalisierig (en)].",
-       "config-unicode-update-warning": "'''Warnig:''' Di inschtalliert Version vum Unicode-Normalisierigswrapper verwändet e elteri Version vu dr Bibliothek vum [http://site.icu-project.org/ ICU-Projäkt].\nDu sottsch si [//www.mediawiki.org/wiki/Unicode_normalization_considerations aktualisiere], wänn Dor d Verwändig vu Unicode wichtig isch.",
+       "config-unicode-pure-php-warning": "'''Warnig:''' D [http://pecl.php.net/intl PECL-Erwyterig intl] isch fir d Unicode-Normalisierig nit verfiegbar. Wäge däm wird di langsam pure-PHP-Implementierig brucht.\nWänn Du ne Websyte mit ere große Bsuechrzahl bedrybsch, sottsch e weng ebis läse iber [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode-Normalisierig (en)].",
+       "config-unicode-update-warning": "'''Warnig:''' Di inschtalliert Version vum Unicode-Normalisierigswrapper verwändet e elteri Version vu dr Bibliothek vum [http://site.icu-project.org/ ICU-Projäkt].\nDu sottsch si [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations aktualisiere], wänn Dor d Verwändig vu Unicode wichtig isch.",
        "config-no-db": "S isch kei adäquate Datebanktryyber gfunde wore!",
        "config-no-fts3": "'''Warnig:''' SQLite isch ohni s [//sqlite.org/fts3.html FTS3-Modul] kumpiliert wore, s stehn kei Suechfunktione z Verfiegig.",
        "config-register-globals": "'''Warnig: Dr Parameter <code>[http://php.net/register_globals register_globals]</code> vu PHP isch aktiviert.'''\n'''Är sott deaktiviert wäre, wänn des megli isch.'''\nD MediaWiki-Inschtallation lauft einwäg, aber dr Server isch aafällig fi megligi Sicherheitsprobläm.",
index 27cdbdd..83a241c 100644 (file)
@@ -41,5 +41,5 @@
        "config-install-step-failed": "નિષ્ફળ",
        "config-help": "મદદ",
        "mainpagetext": "'''મિડીયાવિકિ સફળતાપૂર્વક ઇન્સટોલ થયું છે.'''",
-       "mainpagedocfooter": "વિકિ સોફ્ટવેર વાપરવાની માહીતિ માટે [//meta.wikimedia.org/wiki/Help:Contents સભ્ય માર્ગદર્શિકા] જુઓ.\n\n== શરૂઆતના તબક્કે ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings કોનફીગ્યુરેશન સેટીંગ્સની યાદી]\n* [//www.mediawiki.org/wiki/Manual:FAQ વારંવાર પુછાતા પ્રશ્નો]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce મિડીયાવિકિ રીલીઝ મેઇલીંગ લીસ્ટ]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Localise MediaWiki for your language]"
+       "mainpagedocfooter": "વિકિ સોફ્ટવેર વાપરવાની માહીતિ માટે [//meta.wikimedia.org/wiki/Help:Contents સભ્ય માર્ગદર્શિકા] જુઓ.\n\n== શરૂઆતના તબક્કે ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings કોનફીગ્યુરેશન સેટીંગ્સની યાદી]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ વારંવાર પુછાતા પ્રશ્નો]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce મિડીયાવિકિ રીલીઝ મેઇલીંગ લીસ્ટ]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]"
 }
index 504c2ca..b211b86 100644 (file)
@@ -1,5 +1,5 @@
 {
        "@metadata": [],
        "mainpagetext": "'''Yí-kîn sṳ̀n-kûng ôn-chông MediaWiki.'''",
-       "mainpagedocfooter": "chhiáng fóng-mun [//meta.wikimedia.org/wiki/Help:Contents Yung-fu sú-chhak] yî-khi̍p sṳ́-yung chhṳ́ wiki ngiôn-khien ke sin-sit!\n\n== Ngi̍p-mùn  ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings MediaWiki Phi-chṳ sat-thin chhîn-tân]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki Phìn-sòng mun-thì kié-tap]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki fat-phu email chhîn-tân]"
+       "mainpagedocfooter": "chhiáng fóng-mun [//meta.wikimedia.org/wiki/Help:Contents Yung-fu sú-chhak] yî-khi̍p sṳ́-yung chhṳ́ wiki ngiôn-khien ke sin-sit!\n\n== Ngi̍p-mùn  ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings MediaWiki Phi-chṳ sat-thin chhîn-tân]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki Phìn-sòng mun-thì kié-tap]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki fat-phu email chhîn-tân]"
 }
index f2e085c..5d4ba21 100644 (file)
        "config-restart": "כן, להפעיל מחדש",
        "config-welcome": "=== בדיקות סביבה ===\nבדיקות בסיסיות תתבצענה עכשיו כדי לראות אם הסביבה הזאת מתאימה להתקנת מדיה־ויקי.\nנא לזכור לכלול את המידע הזה בעת בקשת תמיכה עם השלמת ההתקנה.",
        "config-copyright": "=== זכויות יוצרים ותנאים ===\n\n$1\n\nתכנית זו היא תכנה חופשית; באפשרותך להפיצה מחדש ו/או לשנות אותה על פי תנאי הרישיון הציבורי הכללי של GNU כפי שפורסם על ידי קרן התכנה החופשית; בין אם גרסה 2 של הרישיון, ובין אם (לפי בחירתך) כל גרסה מאוחרת שלו.\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/Help:Contents המדריך למשתמש]\n* [//www.mediawiki.org/wiki/Manual:Contents המדריך למנהל]\n* [//www.mediawiki.org/wiki/Manual:FAQ שו״ת]\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 אתר הבית של מדיה־ויקי]\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": "מותקנת <span dir=\"ltr\">PHP $1</span>.",
        "config-env-php-toolow": "מותקנת <span dir=\"ltr\">PHP $1</span>.\nלמדיה־ויקי נדרשת <span dir=\"ltr\">PHP $2</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/Unicode_normalization_considerations Unicode normalization].",
-       "config-unicode-update-warning": "'''אזהרה''': הגרסה המותקנת של מעטפת נרמול יוניקוד משתמשת בגרסה ישנה של הספרייה של [http://site.icu-project.org/ פרויקט ICU].\nכדאי [//www.mediawiki.org/wiki/Unicode_normalization_considerations לעדכן] אם הטיפול ביוניקוד חשוב לך.",
+       "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-unicode-update-warning": "'''אזהרה''': הגרסה המותקנת של מעטפת נרמול יוניקוד משתמשת בגרסה ישנה של הספרייה של [http://site.icu-project.org/ פרויקט ICU].\nכדאי [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations לעדכן] אם הטיפול ביוניקוד חשוב לך.",
        "config-no-db": "לא נמצא דרייבר מסד נתונים מתאים. יש להתקין דרייבר מסד נתונים ל־PHP.\nנתמכים הסוגים הבאים של מסדי נתונים: $1.\n\nאם קִמפלת את PHP בעצמך, יש להגדיר אותו מחדש ולהפעיל את לקוח מסד נתונים, למשל באמצעות <code dir=\"ltr\">./configure --with-mysqli</code>.\nאם התקנת את PHP מחבילה של דביאן או של אובונטו, יש להתקין, למשל, גם את המודול <code dir=\"ltr\">php5-mysql</code>.",
        "config-outdated-sqlite": "'''אזהרה''': במערכת מתוקן SQLite $1. גרסה זו לא נתמכת ולשימוש ב־SQLite נדרשת גרסה $2 לפחות. SQLlite לא יהיה זמין.",
        "config-no-fts3": "'''אזהרה''': SQLite מקומפל ללא [//sqlite.org/fts3.html מודול FTS]. יכולות חיפוש לא יהיו זמינות בהתקנה הזאת.",
@@ -86,7 +86,7 @@
        "config-no-cli-uri": "אזהרה: לא הוגדר <span dir=\"ltr\"><code>--scriptpath</code></span>, משתמש בבררת המחדל: <code dir=\"ltr\">$1</code>.",
        "config-using-server": "שם השרת בשימוש: \"<nowiki>$1</nowiki>\".",
        "config-using-uri": "נעשה שימוש בכתובת השרת \"<nowiki>$1$2</nowiki>\".",
-       "config-uploads-not-safe": "'''אזהרה:''' תיקיית ההעלאות ההתחלתית <code>$1</code> חשופה להרצת סקריפטים שרירותיים.\nאף שמדיה־ויקי בודקת את כל הקבצים המוּעלים לאיומי אבטחה, מומלץ מאוד למנוע את [//www.mediawiki.org/wiki/Manual:Security#Upload_security פרצת האבטחה] הזאת לפני הפעלת ההעלאות.",
+       "config-uploads-not-safe": "'''אזהרה:''' תיקיית ההעלאות ההתחלתית <code>$1</code> חשופה להרצת סקריפטים שרירותיים.\nאף שמדיה־ויקי בודקת את כל הקבצים המוּעלים לאיומי אבטחה, מומלץ מאוד למנוע את [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security פרצת האבטחה] הזאת לפני הפעלת ההעלאות.",
        "config-no-cli-uploads-check": "'''אזהרה:''' תיקיית בררת המחדל להעלאות (<code>$1</code>) לא נבדקת לפגיעוּת להרצת תסריטים אקראיים בזמן התקנה דרך CLI.",
        "config-brokenlibxml": "במערכת שלך יש שילוב של גרסאות של PHP ושל libxml2 שחשוף לבאגים ויכול לגרום לעיוות נתונים נסתר במדיה־ויקי וביישומי רשת אחרים.\nיש לשדרג ל־libxml2 2.7.3 או גרסה חדשה יותר ([https://bugs.php.net/bug.php?id=45996 באג מתויק ב־PHP]).\nההתקנה נעצרה.",
        "config-suhosin-max-value-length": "מותקן פה Suhosin והוא מגביל את אורך פרמטר GET ל־$1 בתים. רכיב ResourceLoader של מדיה־ויקי יעקוף את המגלבה הזאת, אבל זה יפגע בביצועים. אם זה בכלל אפשרי, כדאי לתקן את הערך של <code>suhosin.get.max_value_length</code> ל־1024 או יותר בקובץ <code>php.ini</code> ולהגדיר את ‎<code>$wgResourceLoaderMaxQueryLength</code> לאותו הערך בקובץ LocalSettings.php.",
        "config-profile-no-anon": "נדרשת יצירת חשבון",
        "config-profile-fishbowl": "עורכים מורשים בלבד",
        "config-profile-private": "ויקי פרטי",
-       "config-profile-help": "אתרי ויקי עובדים הכי טוב כאשר הם מאפשרים לכמה שיותר אנשים לערוך אותם.\nבמדיה־ויקי קל לסקור את השינויים האחרונים ולשחזר כל נזק שעושים משתמשים תמימים או משחיתים.\n\nעם זאת, אנשים שונים מצאו למדיה־ויקי שימושים מגוּונים ולעתים לא קל לשכנע את כולם ביתרונות של \"דרך הוויקי\" המסורתית. ולכן יש לך בררה.\n\nבאתר מסוג '''{{int:config-profile-wiki}}''' – לכולם יש הרשאה לערוך, אפילו בלי להיכנס לחשבון.\nבאתר וויקי מסוג '''{{int:config-profile-no-anon}}''' יש ביטחון גדול יותר, אבל הגדרה כזאת יכולה להרתיע תורמים מזדמנים.\n\nבתסריט '''{{int:config-profile-fishbowl}}''' רק משתמשים שקיבלו אישור יכולים לערוך, אבל כל הגולשים יכולים לקרוא את הדפים ואת גרסאותיהם הקודמות.\nב'''{{int:config-profile-private}}''' רק משתמשים שקיבלו אישור יכולים לקרוא ולערוך דפים.\n\nהגדרות מורכבות של הרשאות אפשריות אחרי ההתקנה, ר׳ את [//www.mediawiki.org/wiki/Manual:User_rights הפרק על הנושא הזה בספר ההדרכה].",
+       "config-profile-help": "אתרי ויקי עובדים הכי טוב כאשר הם מאפשרים לכמה שיותר אנשים לערוך אותם.\nבמדיה־ויקי קל לסקור את השינויים האחרונים ולשחזר כל נזק שעושים משתמשים תמימים או משחיתים.\n\nעם זאת, אנשים שונים מצאו למדיה־ויקי שימושים מגוּונים ולעתים לא קל לשכנע את כולם ביתרונות של \"דרך הוויקי\" המסורתית. ולכן יש לך בררה.\n\nבאתר מסוג '''{{int:config-profile-wiki}}''' – לכולם יש הרשאה לערוך, אפילו בלי להיכנס לחשבון.\nבאתר וויקי מסוג '''{{int:config-profile-no-anon}}''' יש ביטחון גדול יותר, אבל הגדרה כזאת יכולה להרתיע תורמים מזדמנים.\n\nבתסריט '''{{int:config-profile-fishbowl}}''' רק משתמשים שקיבלו אישור יכולים לערוך, אבל כל הגולשים יכולים לקרוא את הדפים ואת גרסאותיהם הקודמות.\nב'''{{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-email-sender-help": "הכניסו את כתובת הדוא״ל שתשמש ככתובת לתשובה לכל הדואר היוצא.\nלשם יישלחו תגובות שגיאה (bounce).\nשרתי דוא״ל רבים דורשים שלפחות החלק של המתחם יהיה תקין.",
        "config-upload-settings": "העלאת קבצים ותמונות",
        "config-upload-enable": "להפעיל העלאת קבצים",
-       "config-upload-help": "העלאות קבצים חושפות את השרת שלכם לסיכוני אבטחה.\nלמידע נוסף, קִראו את [//www.mediawiki.org/wiki/Manual:Security חלק האבטחה] בספר ההדרכה.\n\nכדי להפעיל העלאת קבצים שנו את ההרשאות של התיקייה <code>images</code> תחת תיקיית השורש של מדיה־ויקי כך ששרת הווב יוכל לכתוב אליה.\nזה מפעיל את האפשרות הזאת.",
+       "config-upload-help": "העלאות קבצים חושפות את השרת שלכם לסיכוני אבטחה.\nלמידע נוסף, קִראו את [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security חלק האבטחה] בספר ההדרכה.\n\nכדי להפעיל העלאת קבצים שנו את ההרשאות של התיקייה <code>images</code> תחת תיקיית השורש של מדיה־ויקי כך ששרת הווב יוכל לכתוב אליה.\nזה מפעיל את האפשרות הזאת.",
        "config-upload-deleted": "תיקיית לקבצים שנמחקו:",
        "config-upload-deleted-help": "בחרו את התיקייה לארכוב קבצים מחוקים.\nכדאי שזה לא יהיה נגיש לכל העולם דרך הרשת.",
        "config-logo": "כתובת הסמל:",
        "config-logo-help": "המראה ההתחלתי של מדיה־ויקי מכיל מקום לסמל של 135 על 160 פיקסלים בפינה העליונה מעל תפריט הצד.\nיש להעלות תמונה בגודל מתאים ולהכניס את הכתובת כאן.\n\nבאפשרותך להשתמש ב־<code dir=\"ltr\">$wgStylePath</code> או ב־<code dir=\"ltr\">$wgScriptPath</code> אם הסמל שלך נמצא במקום יחסי לנתיבים האלה.\n\nאם אינכם רוצים סמל, השאירו את התיבה הזאת ריקה.",
        "config-instantcommons": "להפעיל את Instant Commons",
-       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] היא תכונה שמאפשרת לאתרי ויקי להשתמש בתמונות, בצלילים ובמדיה אחרת שנמצאת באתר [//commons.wikimedia.org/ ויקישיתוף] (Wikimedia Commons).\nכדי לעשות את זה, מדיה־ויקי צריך לגשת לאינטרנט.\n\nלמידע נוסף על התכונה הזאת, כולל הוראות איך להפעיל את זה לאתרי ויקי שאינם ויקישיתוף, ר׳ [//mediawiki.org/wiki/Manual:$wgForeignFileRepos את ספר ההדרכה].",
+       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] היא תכונה שמאפשרת לאתרי ויקי להשתמש בתמונות, בצלילים ובמדיה אחרת שנמצאת באתר [//commons.wikimedia.org/ ויקישיתוף] (Wikimedia Commons).\nכדי לעשות את זה, מדיה־ויקי צריך לגשת לאינטרנט.\n\nלמידע נוסף על התכונה הזאת, כולל הוראות איך להפעיל את זה לאתרי ויקי שאינם ויקישיתוף, ר׳ [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos את ספר ההדרכה].",
        "config-cc-error": "בורר רישיונות קריאייטיב קומונז לא החזיר שום תוצאה.\nהקלידו את שם הרישיון ידנית.",
        "config-cc-again": "נא לבחור שוב...",
        "config-cc-not-chosen": "בחרו באיזה רישיון קריאייטיב קומונז להשתמש ולחצו \"המשך\".",
        "config-insecure-keys": "'''אזהרה''': {{PLURAL:$2|מפתח|מפתחות}} אבטחה ($1) {{PLURAL:$2|שנוצר|שנוצרו}} במהלך ההתקנה {{PLURAL:$2|אינו בטוח|אינם בטוחים}} מספיק. מומלץ לשקול לשנות {{PLURAL:$2|אותו|אותם}} ידנית.",
        "config-install-sysop": "יצירת חשבון מפעיל",
        "config-install-subscribe-fail": "הרישום ל־mediawiki-announce לא הצליח: $1",
-       "config-install-subscribe-notpossible": "cURL אינה מותקנת ו־allow_url_fopen אינה זמינה.",
+       "config-install-subscribe-notpossible": "cURL אינה מותקנת ו־<code>allow_url_fopen</code> אינה זמינה.",
        "config-install-mainpage": "יצירת דף ראשי עם תוכן התחלתי",
        "config-install-extension-tables": "יצירת טבלאות להרחבות מופעלות",
        "config-install-mainpage-failed": "לא הצליחה הכנסת דף ראשי: $1.",
        "config-install-done": "'''מזל טוב!'''\nהתקנתם בהצלחה את מדיה־ויקי.\n\nתוכנת ההתקנה יצרה את הקובץ <code>LocalSettings.php</code>.\nהוא מכיל את כל ההגדרות שלכם.\n\nתצטרכו להוריד אותו ולשים אותו בבסיס ההתקנה של הוויקי שלכם (אותה התיקייה שבה נמצא הקובץ index.php). ההורדה הייתה אמורה להתחיל באופן אוטומטי.\n\nאם ההורדה לא התחילה, או אם ביטלתם אותה, אפשר להתחיל אותה מחדש בלחיצה על הקישור הבא:\n\n$3\n\n'''שימו לב''': אם לא תעשו זאת עכשיו, קובץ ההגדרות המחוּלל לא יהיה זמין לכם שוב.\n\nאחרי שתעשו את זה, תוכלו '''[$2 להיכנס לוויקי שלכם]'''.",
        "config-download-localsettings": "הורדת <code>LocalSettings.php</code>",
        "config-help": "עזרה",
+       "config-help-tooltip": "להרחיב",
        "config-nofile": "הקובץ \"$1\" לא נמצא. האם הוא נמחק?",
-       "config-extension-link": "הידעת שמדיה־ויקי תומכת ב־[//www.mediawiki.org/wiki/Manual:Extensions הרחבות]?\n\nבאפשרותך לעיין ב־[//www.mediawiki.org/wiki/Category:Extensions_by_category הרחבות לפי קטגוריה] או ב־[//www.mediawiki.org/wiki/Extension_Matrix מטריצת ההרחבות] לרשימה מלאה של הרחבות.",
+       "config-extension-link": "הידעת שמדיה־ויקי תומכת ב־[//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions הרחבות]?\n\nבאפשרותך לעיין ב־[//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category הרחבות לפי קטגוריה].",
        "mainpagetext": "'''תוכנת מדיה־ויקי הותקנה בהצלחה.'''",
-       "mainpagedocfooter": "היעזרו ב[//meta.wikimedia.org/wiki/Help:Contents מדריך למשתמש] למידע על שימוש בתוכנת הוויקי.\n\n== קישורים שימושיים ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings רשימת ההגדרות]\n* [//www.mediawiki.org/wiki/Manual:FAQ שאלות ותשובות על מדיה־ויקי]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce רשימת התפוצה על השקת גרסאות]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources תרגום מדיה־ויקי לשפה שלך]"
+       "mainpagedocfooter": "היעזרו ב[//meta.wikimedia.org/wiki/Help:Contents מדריך למשתמש] למידע על שימוש בתוכנת הוויקי.\n\n== קישורים שימושיים ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings רשימת ההגדרות]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ שאלות ותשובות על מדיה־ויקי]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce רשימת התפוצה על השקת גרסאות]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources תרגום מדיה־ויקי לשפה שלך]"
 }
index 527d83a..b3779e4 100644 (file)
@@ -45,5 +45,5 @@
        "config-help": "सहायता",
        "config-nofile": "फ़ाइल \"$1\" नहीं पाई जा सकी। क्या इसे हटा दिया गया है?",
        "mainpagetext": "'''मीडियाविकिका इन्स्टॉलेशन पूरा हो गया हैं ।'''",
-       "mainpagedocfooter": "विकि सॉफ्टवेयरके इस्तेमाल के लिये [//meta.wikimedia.org/wiki/Help:Contents उपयोगकर्ता गाईड] देखें ।\n\n== शुरुवात करें ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings कॉन्फिगरेशन सेटींगकी सूची]\n* [//www.mediawiki.org/wiki/Manual:FAQ मीडियाविकिके बारे में प्राय: पूछे जाने वाले सवाल]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce मीडियाविकि मेलिंग लिस्ट]"
+       "mainpagedocfooter": "विकि सॉफ्टवेयरके इस्तेमाल के लिये [//meta.wikimedia.org/wiki/Help:Contents उपयोगकर्ता गाईड] देखें ।\n\n== शुरुवात करें ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings कॉन्फिगरेशन सेटींगकी सूची]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ मीडियाविकिके बारे में प्राय: पूछे जाने वाले सवाल]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce मीडियाविकि मेलिंग लिस्ट]"
 }
index bafc18f..d5d46ce 100644 (file)
@@ -5,5 +5,5 @@
                ]
        },
        "mainpagetext": "'''MediaWiki ke safalta se install kar dewa gais hai.'''",
-       "mainpagedocfooter": "Wiki software ke use kare ke aur jaankari ke khatir [//meta.wikimedia.org/wiki/Help:Contents User's Guide] ke dekho.\n\n== Getting started ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]"
+       "mainpagedocfooter": "Wiki software ke use kare ke aur jaankari ke khatir [//meta.wikimedia.org/wiki/Help:Contents User's Guide] ke dekho.\n\n== Getting started ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]"
 }
index 629d42b..f3f54c9 100644 (file)
@@ -5,5 +5,5 @@
                ]
        },
        "mainpagetext": "'''Ang MediaWiki madinalag-on nga na-instala.'''",
-       "mainpagedocfooter": " Magkonsulta sa [//meta.wikimedia.org/wiki/Help:Contents User's Guide] para sa mga impormasyon sa paggamit sang wiki nga software.\n\n== Pag-umpisa ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista sang mga konpigorasyon sang pagkay-o]\n* [//www.mediawiki.org/wiki/Manual:FAQ Mga Masami Pamangkoton sa MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista sang mga ginapadal-an sang sulat kon may paguha-on nga MediaWiki]"
+       "mainpagedocfooter": " Magkonsulta sa [//meta.wikimedia.org/wiki/Help:Contents User's Guide] para sa mga impormasyon sa paggamit sang wiki nga software.\n\n== Pag-umpisa ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista sang mga konpigorasyon sang pagkay-o]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Mga Masami Pamangkoton sa MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista sang mga ginapadal-an sang sulat kon may paguha-on nga MediaWiki]"
 }
index 97c3325..83c373a 100644 (file)
        "config-restart": "Jo, erneit oonfänge",
        "config-welcome": "=== Prüfung von die Installationsumgebung ===\nDie Basisprüfunge were jetzt doorrichgefüahrt, um festzustelle, ob die Installationsumgebung für MediaWiki geeichnet ist.\nNotier die Informatione und geb se an, sofern du Hellf beim Installiere  benötichst.",
        "config-copyright": "=== Lizenz und Nutzungsbedingunge ===\n\n$1\n\nDas Programm ist freie Software, d. h. es kann, gemäss den Bedingunge der von der Free Software Foundation veröffentlichte ''GNU General Public License'', weiterverteilt und/oder modifiziert sin. Dabei kann die Version 2, orrer noh eichnem Ermess, jede neuire Version von der Lizenz verwennet sin.\n\nDas Programm weard in der Hoffnung verteilt, dass das nützlich sein weard, dennoch '''ohne jechliche Garantie''' und sogoor ohne die implizierte Garantie von ener '''Marrektgängigkeit''' orrer '''Eichnung für en bestimmte Zweck'''. Hierzu sind weitre Hinweise in der ''GNU General Public License'' enthalt.\n\nEn <doclink href=Copying>Kopie von der GNU General Public License</doclink> sollt zusammer mit dem Programm verteilt woard sin. Sofern das net der Fall woar, kann en Kopie bei der Free Software Foundation Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, schriftlich verlangt sin orrer uff ehre Website [http://www.gnu.org/copyleft/gpl.html online gelesen] sin.",
-       "config-sidebar": "* [//www.mediawiki.org/wiki/MediaWiki/de Website von MediaWiki]\n* [//www.mediawiki.org/wiki/Help:Contents/de Benutzeroonleitung]\n* [//www.mediawiki.org/wiki/Manual:Contents/de Administratorenoonleitung]\n* [//www.mediawiki.org/wiki/Manual:FAQ/de Häifig gestellte Frache]\n----\n* <doclink href=Readme>Lies mich</doclink>\n* <doclink href=ReleaseNotes>Versionsinformatione</doclink>\n* <doclink href=Copying>Lizenzbestimmunge</doclink>\n* <doclink href=UpgradeDoc>Aktualisierung</doclink>",
+       "config-sidebar": "* [//www.mediawiki.org/wiki/MediaWiki/de Website von MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents/de Benutzeroonleitung]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents/de Administratorenoonleitung]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/de Häifig gestellte Frache]\n----\n* <doclink href=Readme>Lies mich</doclink>\n* <doclink href=ReleaseNotes>Versionsinformatione</doclink>\n* <doclink href=Copying>Lizenzbestimmunge</doclink>\n* <doclink href=UpgradeDoc>Aktualisierung</doclink>",
        "config-env-good": "Die Installationsumgebung woard geprüft.\nMediaWiki kann installiert sin.",
        "config-env-bad": "Die Installationsumgebung woard geprüft.\nMediaWiki kann net installiert sin.",
        "config-env-php": "Die Skriptsproch „PHP“ ($1) ist installiert.",
        "config-env-php-toolow": "PHP $1 ist installiert.\nJedoch benöticht MediaWiki PHP $2 oder höcher.",
        "config-unicode-using-utf8": "Zur Unicode-Normalisierung weard Brion Vibbers <code>utf8_normalize.so</code> ingesetzt.",
        "config-unicode-using-intl": "Zur  Unicode-Normalisierung weard die [http://pecl.php.net/intl PECL-Erweiterung intl] ingesetzt.",
-       "config-unicode-pure-php-warning": "'''Warnung:''' Die [http://pecl.php.net/intl PECL-Erweiterung intl] ist für die Unicode-Normalisierung net verfüchbar, so dass stattdessen die langsame pure-PHP-Implementierung genutzt weard.\nSofern en Webseit mit grosser Benutzeranzoohl betrieb weard, sollte weitre Informatione uff der Webseite [//www.mediawiki.org/wiki/Unicode_normalization_considerations Unicode-Normalisierung (en)] geles sin.",
-       "config-unicode-update-warning": "'''Warnung:''' Die installierte Version von der Unicode-Normalisierungswrappers nutzt en ältre Version von der [http://site.icu-project.org/ ICU-Projekts] sein Bibliothek.\nDie sollte [//www.mediawiki.org/wiki/Unicode_normalization_considerations aktualisiert] sin, sofern uff die Verwennung von Unicode Wert geleht weard.",
+       "config-unicode-pure-php-warning": "'''Warnung:''' Die [http://pecl.php.net/intl PECL-Erweiterung intl] ist für die Unicode-Normalisierung net verfüchbar, so dass stattdessen die langsame pure-PHP-Implementierung genutzt weard.\nSofern en Webseit mit grosser Benutzeranzoohl betrieb weard, sollte weitre Informatione uff der Webseite [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode-Normalisierung (en)] geles sin.",
+       "config-unicode-update-warning": "'''Warnung:''' Die installierte Version von der Unicode-Normalisierungswrappers nutzt en ältre Version von der [http://site.icu-project.org/ ICU-Projekts] sein Bibliothek.\nDie sollte [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations aktualisiert] sin, sofern uff die Verwennung von Unicode Wert geleht weard.",
        "config-no-db": "Es konnt ken adäquater Datenbanktreiwer gefund sin. Es muss doher en Datenbanktreiwer für PHP installiert sin.\nDie folchende Datebanksysteme werre unnerstützt: $1\n\nWenn du PHP sellebst kompiliert host, konfigurier es erneit mit en aktiviert Datebankclient, zum Beispiel dorrich Verwennung von <code>./configure --with-mysqli</code>.\nWenn du PHP von en Debian- orrer Ubuntu-Paket installiert host, dann musst du ooch beispielsweis das <code>php5-mysql</code>-Paket installiere.",
        "config-outdated-sqlite": "'''Warnung:''' SQLite $1 ist installiert. Allerdings benöticht MediaWiki SQLite $2 orrer höcher. SQLite weard doher net verfüchbar sin.",
        "config-no-fts3": "'''Warnung:''' SQLite woard ohne das [//sqlite.org/fts3.html FTS3-Modul] kompiliert, so dass ken Suchfunktione für das Datenbanksystem zur Verfüchung stehn werre.",
@@ -81,7 +81,7 @@
        "config-no-cli-uri": "'''Warnung''': Es woard ken Pad zum Skipt (<code>--scriptpath</code>) oongeb. Doher weard der Standardpad benutzt: <code>$1</code>.",
        "config-using-server": "Der Servernoome „<nowiki>$1</nowiki>“ weard verwennet.",
        "config-using-uri": "Der Server URL \"<nowiki>$1$2</nowiki>\" weard benutz.",
-       "config-uploads-not-safe": "'''Warnung:''' Das Standardverzeichnis für hochgeloodne Dateie <code>$1</code> ist für die willkürliche/arbiträer Ausführung von Skripte oonfällich.\nObwohl MediaWiki die hochgeloodne Dateie uff Sicherheitsrisike üwerprüft, weard dennoch dringend empfohl die [//www.mediawiki.org/wiki/Manual:Security#Upload_security Sicherheitslücke] zu schliesse, bevor das Hochloode von Dateie aktiviert weard.",
+       "config-uploads-not-safe": "'''Warnung:''' Das Standardverzeichnis für hochgeloodne Dateie <code>$1</code> ist für die willkürliche/arbiträer Ausführung von Skripte oonfällich.\nObwohl MediaWiki die hochgeloodne Dateie uff Sicherheitsrisike üwerprüft, weard dennoch dringend empfohl die [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security Sicherheitslücke] zu schliesse, bevor das Hochloode von Dateie aktiviert weard.",
        "config-no-cli-uploads-check": "'''Warnung''': Das Standardverzeichnis für hochgeloodene Dateie (<code>$1</code>) weard, während der Installation üwer die Kommandozeile, net auf Sicherheitsoonfälligkeite hinsichtlich willkürlicher/arbiträr Skriptausführunge geprüft.",
        "config-brokenlibxml": "Das System nutzt en Kombination aus PHP- und libxml2-Versione, die fehleroonfällich ist und versteckte Datefehler bei MediaWiki und annere Weboonwennunge verursache kann.\nAktualisier uff libxml2 2.7.3 orrer später, um das Problem zu löse. Installationsabbruch ([https://bugs.php.net/bug.php?id=45996 sieh hierzu die Fehlermeldung bei PHP]).",
        "config-suhosin-max-value-length": "Suhosin ist installiert und beschränkt die Läng von der GET-Parameters auf $1 Bytes.\nDer ResouceLoader von MediaWiki weard zwoor unner den Bedingunge funktioniere, allerdings nuer mit verminnerter Leistungsfähigkeit.\nSoweit möchlich sollt der Parameter <code>suhosin.get.max_value_length</code> in der Datei <code>php.ini</code> uff 1024 oreer höcher festgeleht werre.\nGleichzeitich muss der Parameter <code>$wgResourceLoaderMaxQueryLength</code> in der Datei <code>LocalSettings.php</code> uff den selwer Weart rengestellt sin.",
        "config-profile-no-anon": "Erstellung von en Benutzerkonto erforderlich",
        "config-profile-fishbowl": "ausschliesslich berechtichte Beoorbeiter",
        "config-profile-private": "geschlossnes Wiki",
-       "config-profile-help": "Wikis sind am nützlichste, wenn so viele Mensche wie möchlich droon Bearbeitunge voarnehme könne.\nMit MediaWiki ist das enfach die letzte Ännrunge nohzuvollziehe und unbrauchbare Bearbeitunge, beispielsweise von unbedärfte orrer böswilliche Benutzer, rückgängich zu mache.\n\nAwer finne etliche Mensche Wikis ooch mit annere Beoorbeitungskonzepte sinnvoll. Manchmol ist das zudem net enfach alle Beteilichte von den Voarteile des „Wiki-Prinzips” zu üwerzeiche. Dodrum ist die Auswoohl möchlich.\n\nDas Modell „'''{{int:config-profile-wiki}}'''“ ermöchlicht es jederene, sogoor ohne üwer en Benutzerkonto zu verfüche, Bearbeitunge voarzunehme.\nEn Wiki bei dem die '''{{int:config-profile-no-anon}}''' ist, verlang von den Benutzer en höchre Verantwortung für ehre Beoorbeitunge en, könnt awer Persone abschrecke, die nuar gelechentlich Beoorbeitunge voarnehme wolle. En Wiki für '''{{int:config-profile-fishbowl}}''' gestattet (permitiert) es nuar bestimmte Benutzer, Beoorbeitunge voarzunehme. Awer kann dobei die Allgemeinheit die Seite immer noch betrachte und Ändrunge nohvollziehe. En '''{{int:config-profile-private}}''' gestattet es nur ausgewählte Benutzer, Seite zu betrachte sowie zu beoorbeite.\n\nKomplexre Konzepte zur Zugriffssteierung könne earst noh abgeschlossne Installationsvoargang ingerichtet sin. Hierzu gebts weitre Informatione uff der Website mit der [//www.mediawiki.org/wiki/Manual:User_rights entsprechende Oonleitung].",
+       "config-profile-help": "Wikis sind am nützlichste, wenn so viele Mensche wie möchlich droon Bearbeitunge voarnehme könne.\nMit MediaWiki ist das enfach die letzte Ännrunge nohzuvollziehe und unbrauchbare Bearbeitunge, beispielsweise von unbedärfte orrer böswilliche Benutzer, rückgängich zu mache.\n\nAwer finne etliche Mensche Wikis ooch mit annere Beoorbeitungskonzepte sinnvoll. Manchmol ist das zudem net enfach alle Beteilichte von den Voarteile des „Wiki-Prinzips” zu üwerzeiche. Dodrum ist die Auswoohl möchlich.\n\nDas Modell „'''{{int:config-profile-wiki}}'''“ ermöchlicht es jederene, sogoor ohne üwer en Benutzerkonto zu verfüche, Bearbeitunge voarzunehme.\nEn Wiki bei dem die '''{{int:config-profile-no-anon}}''' ist, verlang von den Benutzer en höchre Verantwortung für ehre Beoorbeitunge en, könnt awer Persone abschrecke, die nuar gelechentlich Beoorbeitunge voarnehme wolle. En Wiki für '''{{int:config-profile-fishbowl}}''' gestattet (permitiert) es nuar bestimmte Benutzer, Beoorbeitunge voarzunehme. Awer kann dobei die Allgemeinheit die Seite immer noch betrachte und Ändrunge nohvollziehe. En '''{{int:config-profile-private}}''' gestattet es nur ausgewählte Benutzer, Seite zu betrachte sowie zu beoorbeite.\n\nKomplexre Konzepte zur Zugriffssteierung könne earst noh abgeschlossne Installationsvoargang ingerichtet sin. Hierzu gebts weitre Informatione uff der Website mit der [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights entsprechende Oonleitung].",
        "config-license": "Lizenz:",
        "config-license-none": "Ken Lizenzoongäb in der Fusszeile",
        "config-license-cc-by-sa": "Creative Commons \"Noomenennung, Weitergäb unner gleiche Bedingunge“",
        "config-email-sender-help": "Bitte hier die E-Mail-Adress oongewe, die als Absenderadress bei ausgehende E-Mails ingesetzt werre soll.\nRückloofende E-Mails werre an die E-Mail-Adress gesandt.\nBei viele E-Mail-Server muss der Tel der E-Mail-Adress mit der Domainoongäb korrekt sin.",
        "config-upload-settings": "Hochloode von Bilder und Dateie",
        "config-upload-enable": "Das Hochloode von Dateie ermöchliche",
-       "config-upload-help": "Das Hochloode von Dateie macht den Server für potentielle Sicherheitsprobleme oonfällich.\nWeitre Informatione hierzu könne im [//www.mediawiki.org/wiki/Manual:Security Abschnitt Sicherheit] von der Anleitung nohgeles sin.\n\nUm das Hochloode von Dateie zu ermöglichen, muss der Zugriff uff das Unnerverzeichnis <code>./images</code> so geännert sin, das das für den Webserver beschreibbar ist.\nHernoh kann die Option aktiviert sin.",
+       "config-upload-help": "Das Hochloode von Dateie macht den Server für potentielle Sicherheitsprobleme oonfällich.\nWeitre Informatione hierzu könne im [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security Abschnitt Sicherheit] von der Anleitung nohgeles sin.\n\nUm das Hochloode von Dateie zu ermöglichen, muss der Zugriff uff das Unnerverzeichnis <code>./images</code> so geännert sin, das das für den Webserver beschreibbar ist.\nHernoh kann die Option aktiviert sin.",
        "config-upload-deleted": "Verzeichnis für gelöschte Dateie:",
        "config-upload-deleted-help": "Bitte en Verzeichnis auswähle, in dem gelöschte Dateie archiviert werre solle.\nIdealerweise sollt es net üwer das Internet zugänglich sin.",
        "config-logo": "Das Logo sein URL:",
        "config-logo-help": "Die Standardoberfläche von MediaWiki verfücht links owerhalleb von der Seiteleiste üwer Platz für en Logo mit den Moaa 135x160 Pixel.\nBitte en Logo in entsprechender Gröss hochloode und die zugehöriche URL an der Stell oongewe.\n\nDu kannst <code>$wgStylePath</code> orrer <code>$wgScriptPath</code> verwenne, falls dein Logo relativ zu den Pade ist.\n\nSofern ken Logo benöticht weard, kann das Datefeld leer bleiwe.",
        "config-instantcommons": "\"InstantCommons\" aktiviere",
-       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons InstantCommons] ist en Funktion, wos Wikis ermöchlicht, Bild-, Klang- und annre Mediendateie zu nutze, wo uff der Website [//commons.wikimedia.org/ Wikimedia Commons] verfüchbar sind.\nUm die Funktion nutze zu könne, muss das Wiki üwer en Verbinnung zum Internet verfüche.\n\nWeitre Informatione zu der Funktion, inschliesslich von der Oonleitung, wie hierfür annre Wikis als Wikimedia Commons ingerichtet werre könne, gebts im [//mediawiki.org/wiki/Manual:$wgForeignFileRepos Handbuch].",
+       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons InstantCommons] ist en Funktion, wos Wikis ermöchlicht, Bild-, Klang- und annre Mediendateie zu nutze, wo uff der Website [//commons.wikimedia.org/ Wikimedia Commons] verfüchbar sind.\nUm die Funktion nutze zu könne, muss das Wiki üwer en Verbinnung zum Internet verfüche.\n\nWeitre Informatione zu der Funktion, inschliesslich von der Oonleitung, wie hierfür annre Wikis als Wikimedia Commons ingerichtet werre könne, gebts im [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos Handbuch].",
        "config-cc-error": "Der Creativ-Commons-Lizenzassistent konnt ken Lizenz ermittle.\nDie Lizenz ist doher jetzt manuell inzugewe.",
        "config-cc-again": "Erneit auswähle …",
        "config-cc-not-chosen": "Die gewünschte Creative-Commons-Lizenz auswähle und dann uff \"weiter\" klicke.",
        "config-insecure-keys": "'''Warnung:''' {{PLURAL:$2|Der Geheimschlüssel|Die Geheimschlüssel}} $1, {{PLURAL:$2|der|die}} (während) im Verloof von der Installationsvoargang generiert {{PLURAL:$2|woard, ist|woare, sind}} net seahr sicher. {{PLURAL:$2|Er sollt|Sie sollte}} manuell geännert sin.",
        "config-install-sysop": "Administratorkonto weard erstellt",
        "config-install-subscribe-fail": "Abonniere von „mediawiki-announce“ ist gescheitert: $1",
-       "config-install-subscribe-notpossible": "cURL ist net installiert und allow_url_fopen ist niet verfüchbar.",
+       "config-install-subscribe-notpossible": "cURL ist net installiert und <code>allow_url_fopen</code> ist niet verfüchbar.",
        "config-install-mainpage": "Erstellung von der Hauptseit mit Standardinhalte (padronisierte Inhalte)",
        "config-install-extension-tables": "Erstellung von der Tabelle für die aktivierte Erweitrunge",
        "config-install-mainpage-failed": "Die Hauptseite konnt net erstellt sin: $1",
        "config-download-localsettings": "<code>LocalSettings.php</code> herunnterlade",
        "config-help": "Hellef",
        "config-nofile": "Die Datei „$1“ konnt net gefund sin. Woor sie gelöscht?",
-       "config-extension-link": "Wusst du, dass dein Wiki die Nutzung von [//www.mediawiki.org/wiki/Manual:Extensions Erweiterungen] unnerstützt?\n\nDu kannst [//www.mediawiki.org/wiki/Category:Extensions_by_category Erweitrunge noh Kategorie] doorrichsuche orrer die [//www.mediawiki.org/wiki/Extension_Matrix Matrix der Erweiterungen] oonsiehn, um en Üwersicht zu verfüchbare Erweitrunge zu erhalten.",
+       "config-extension-link": "Wusst du, dass dein Wiki die Nutzung von [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions Erweiterungen] unnerstützt?\n\nDu kannst [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category Erweitrunge noh Kategorie] doorrichsuche orrer die [//www.mediawiki.org/wiki/Extension_Matrix Matrix der Erweiterungen] oonsiehn, um en Üwersicht zu verfüchbare Erweitrunge zu erhalten.",
        "mainpagetext": "'''MediaWiki woor erfollichreich installiert.'''",
-       "mainpagedocfooter": "Hellef zur Benutzung und Konfiguration von der Wiki-Software finnst du im [//meta.wikimedia.org/wiki/Help:Contents Benutzerhandbuch].\n\n== Oonfänghellef ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings List von der Konfigurationsvariable]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki-FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglist neier MediaWiki-Versione]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Lokalisier MediaWiki für dein Sproch]"
+       "mainpagedocfooter": "Hellef zur Benutzung und Konfiguration von der Wiki-Software finnst du im [//meta.wikimedia.org/wiki/Help:Contents Benutzerhandbuch].\n\n== Oonfänghellef ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings List von der Konfigurationsvariable]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki-FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglist neier MediaWiki-Versione]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Lokalisier MediaWiki für dein Sproch]"
 }
index 6b89265..deae95b 100644 (file)
@@ -41,7 +41,7 @@
        "config-page-existingwiki": "Eksistowacy wiki",
        "config-help-restart": "Chceš wšě składowane daty hašeć, kotrež sy zapodał a instalaciski proces znowa startować?",
        "config-restart": "Haj, znowa startować",
-       "config-sidebar": "* [//www.mediawiki.org MediaWiki Startowa strona MediaWiki]\n* [//www.mediawiki.org/wiki/Help:Contents Nawod za wužiwarjow]\n* [//www.mediawiki.org/wiki/Manual:Contents Nawod za administratorow]\n* [//www.mediawiki.org/wiki/Manual:FAQ Huste prašenja]\n----\n* <doclink href=Readme>Čitaj mje</doclink>\n* <doclink href=ReleaseNotes>Wersijowe informacije</doclink>\n* <doclink href=Copying>Licencne postajenja</doclink>\n* <doclink href=UpgradeDoc>Aktualizacija</doclink>",
+       "config-sidebar": "* [//www.mediawiki.org MediaWiki Startowa strona MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Nawod za wužiwarjow]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Nawod za administratorow]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Huste prašenja]\n----\n* <doclink href=Readme>Čitaj mje</doclink>\n* <doclink href=ReleaseNotes>Wersijowe informacije</doclink>\n* <doclink href=Copying>Licencne postajenja</doclink>\n* <doclink href=UpgradeDoc>Aktualizacija</doclink>",
        "config-env-good": "Wokolina je so skontrolowała.\nMóžeš MediaWiki instalować.",
        "config-env-bad": "Wokolina je so skontrolowała.\nNjemóžeš MediaWiki instalować.",
        "config-env-php": "PHP $1 je instalowany.",
        "config-install-keys": "Tajne kluče so tworja",
        "config-install-sysop": "Tworjenje administratoroweho wužiwarskeho konta",
        "config-install-subscribe-fail": "Abonowanje \"mediawiki-announce\" njemóžno: $1",
-       "config-install-subscribe-notpossible": "cURL njeje instalowany a allow_url_fopen k dispoziciji njesteji.",
+       "config-install-subscribe-notpossible": "cURL njeje instalowany a <code>allow_url_fopen</code> k dispoziciji njesteji.",
        "config-install-mainpage": "Hłowna strona so ze standardnym wobsahom wutworja",
        "config-install-extension-tables": "Tabele za zmóžnjene rozšěrjenja so tworja",
        "config-install-mainpage-failed": "Powěsć njeda so zasunyć: $1",
        "config-help": "pomoc",
        "config-nofile": "Dataja \"$1\" njeje so namakała. Je so zhašała?",
        "mainpagetext": "'''MediaWiki bu wuspěšnje instalowany.'''",
-       "mainpagedocfooter": "Prošu hlej [//meta.wikimedia.org/wiki/Help:Contents dokumentaciju] za informacije wo wužiwanju softwary.\n\n== Za nowačkow ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Wo nastajenjach]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources MediaWiki za twoju rěč lokalizować]"
+       "mainpagedocfooter": "Prošu hlej [//meta.wikimedia.org/wiki/Help:Contents dokumentaciju] za informacije wo wužiwanju softwary.\n\n== Za nowačkow ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Wo nastajenjach]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources MediaWiki za twoju rěč lokalizować]"
 }
index e0c166f..f56f0ad 100644 (file)
@@ -1,9 +1,10 @@
 {
        "@metadata": {
                "authors": [
-                       "Boukman"
+                       "Boukman",
+                       "Seb35"
                ]
        },
        "mainpagetext": "'''MedyaWiki byen enstale l.'''",
-       "mainpagedocfooter": "Konsilte [//meta.wikimedia.org/wiki/Help:Konteni Gid Itilizatè] pou enfòmasyon sou kijan pou w itilize logisyèl wiki a.\n\n== Kijan pou kòmanse ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lis paramèt yo pou konfigirasyon]\n* [//www.mediawiki.org/wiki/Manyèl:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lis diskisyon ki parèt sou MediaWiki]"
+       "mainpagedocfooter": "Konsilte [//meta.wikimedia.org/wiki/Help:Contents Gid Itilizatè] pou enfòmasyon sou kijan pou w itilize logisyèl wiki a.\n\n== Kijan pou kòmanse ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lis paramèt yo pou konfigirasyon]\n* [//www.mediawiki.org/wiki/Manyèl:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lis diskisyon ki parèt sou MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]"
 }
index db8e463..88779b1 100644 (file)
@@ -14,7 +14,7 @@
        "config-page-welcome": "Üdvözli a MediaWiki!",
        "config-help-restart": "Szeretné törölni az eddig megadott összes adatot és újraindítani a telepítési folyamatot?",
        "config-welcome": "=== Környezet ellenőrzése ===\nAlapvető ellenőrzés, ami megmondja, hogy a környezet alkalmas-e a MediaWiki számára.\nHa probléma merülne fel a telepítés során, meg kell adnia mások számára az alább megjelenő információkat.",
-       "config-unicode-pure-php-warning": "<strong>Figyelmeztetés:</strong> Az [http://pecl.php.net/intl intl PECL kiterjesztés] nem érhető el Unicode normalizáláshoz, helyette a lassú, PHP alapú implementáció lesz használva.\nHa nagy látogatottságú oldalt üzemeltet, itt találhat információkat [http://www.mediawiki.org/wiki/Unicode_normalization_considerations a témáról].",
+       "config-unicode-pure-php-warning": "<strong>Figyelmeztetés:</strong> Az [http://pecl.php.net/intl intl PECL kiterjesztés] nem érhető el Unicode normalizáláshoz, helyette a lassú, PHP alapú implementáció lesz használva.\nHa nagy látogatottságú oldalt üzemeltet, itt találhat információkat [http://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations a témáról].",
        "config-register-globals": "'''Figyelmeztetés: A PHP <code>[http://php.net/register_globals register_globals]</code> beállítása engedélyezve van.'''\n'''Tiltsa le, ha van rá lehetősége.'''\nA MediaWiki működőképes a beállítás használata mellett, de a szerver biztonsági kockázatnak lesz kitéve.",
        "config-imagemagick": "Az ImageMagick megtalálható a rendszeren: <code>$1</code>.\nA bélyegképek készítése engedélyezve lesz, ha engedélyezi a feltöltéseket.",
        "config-db-name-help": "Válassza ki a wikije azonosítására használt nevet.\nNem tartalmazhat szóközt.\n\nHa megosztott webtárhelyet használ, a szolgáltatója vagy egy konkrét adatbázisnevet ad önnek használatra, vagy létrehozhat egyet a vezérlőpulton keresztül.",
@@ -27,7 +27,7 @@
        "config-admin-name-blank": "Adja meg az adminisztrátor felhasználónevét!",
        "config-admin-name-invalid": "A megadott felhasználónév (<nowiki>$1</nowiki>) érvénytelen.\nAdjon meg egy másik felhasználónevet.",
        "config-admin-password-blank": "Adja meg az adminisztrátori fiók jelszavát!",
-       "config-instantcommons-help": "Az [//www.mediawiki.org/wiki/InstantCommons Instant Commons] lehetővé teszi, hogy a wikin használhassák a [//commons.wikimedia.org/ Wikimedia Commons] oldalon található képeket, hangokat és más médiafájlokat.\nA használatához a MediaWikinek internethozzáférésre van szüksége.\n\nA funkcióról és hogy hogyan állítható be más wikik esetén [//mediawiki.org/wiki/Manual:$wgForeignFileRepos a kézikönyvben] találhat további információkat.",
+       "config-instantcommons-help": "Az [//www.mediawiki.org/wiki/InstantCommons Instant Commons] lehetővé teszi, hogy a wikin használhassák a [//commons.wikimedia.org/ Wikimedia Commons] oldalon található képeket, hangokat és más médiafájlokat.\nA használatához a MediaWikinek internethozzáférésre van szüksége.\n\nA funkcióról és hogy hogyan állítható be más wikik esetén [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos a kézikönyvben] találhat további információkat.",
        "config-install-done": "'''Gratulálunk!'''\nSikeresen telepítette a MediaWikit.\n\nA telepítő készített egy <code>LocalSettings.php</code> fájlt.\nEz tartalmazza az összes beállítást.\n\n[$1 Le kell töltenie], és el kell helyeznie a MediaWiki telepítési könyvtárába (az a könyvtár, ahol az index.php van).\n'''Megjegyzés''': Ha ezt most nem teszi meg, és kilép, a generált fájl nem lesz elérhető a későbbiekben.\n\nHa ezzel készen van, '''[$2 beléphet a wikibe]'''.",
-       "mainpagedocfooter": "Ha segítségre van szüksége a wikiszoftver használatához, akkor keresse fel a [//meta.wikimedia.org/wiki/Help:Contents User's Guide] oldalt.\n\n== Alapok (angol nyelven) ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Beállítások listája]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki GyIK]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-kiadások levelezőlistája]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources A MediaWiki fordítása a saját nyelvére]"
+       "mainpagedocfooter": "Ha segítségre van szüksége a wikiszoftver használatához, akkor keresse fel a [//meta.wikimedia.org/wiki/Help:Contents User's Guide] oldalt.\n\n== Alapok (angol nyelven) ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Beállítások listája]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki GyIK]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-kiadások levelezőlistája]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources A MediaWiki fordítása a saját nyelvére]"
 }
index 6d9700b..a150fbc 100644 (file)
        "config-restart": "Igen, újraindítás",
        "config-welcome": "=== A környezet ellenőrzése ===\nNéhány alapvető ellenőrzés kerül végrehajtásra, hogy kiderüljön ,hogy ez a környezet alkalmas-e a MediaWiki telepítésére.\nHa telepítéssel kapcsolatos segítségre van szükséged, add meg ezen ellenőrzések eredményét.",
        "config-copyright": "=== Licenc és feltételek ===\n\n$1\n\nEz a program szabad szoftver; terjeszthető illetve módosítható a Free Software Foundation által kiadott GNU General Public License dokumentumában leírtak; akár a licenc 2-es, akár (tetszőleges) későbbi változata szerint.\n\nEz a program abban a reményben kerül közreadásra, hogy hasznos lesz, de minden egyéb '''garancia nélkül''', az '''eladhatóságra''' vagy '''valamely célra való alkalmazhatóságra''' való származtatott garanciát is beleértve. További részleteket a GNU General Public License tartalmaz.\n\nA felhasználónak a programmal együtt meg kell kapnia a <doclink href=Copying>GNU General Public License egy példányát</doclink>; ha mégsem kapta meg, akkor írjon a Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. címre, vagy [http://www.gnu.org/copyleft/gpl.html tekintse meg online].",
-       "config-sidebar": "* [//www.mediawiki.org A MediaWiki honlapja]\n* [//www.mediawiki.org/wiki/Help:Contents Felhasználói kézikönyv]\n* [//www.mediawiki.org/wiki/Manual:Contents Útmutató adminisztrátoroknak]\n* [//www.mediawiki.org/wiki/Manual:FAQ GyIK]\n----\n* <doclink href=Readme>Ismertető</doclink>\n* <doclink href=ReleaseNotes>Kiadási megjegyzések</doclink>\n* <doclink href=Copying>Másolás</doclink>\n* <doclink href=UpgradeDoc>Frissítés</doclink>",
+       "config-sidebar": "* [//www.mediawiki.org A MediaWiki honlapja]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Felhasználói kézikönyv]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Útmutató adminisztrátoroknak]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ GyIK]\n----\n* <doclink href=Readme>Ismertető</doclink>\n* <doclink href=ReleaseNotes>Kiadási megjegyzések</doclink>\n* <doclink href=Copying>Másolás</doclink>\n* <doclink href=UpgradeDoc>Frissítés</doclink>",
        "config-env-good": "A környezet ellenőrzése befejeződött.\nA MediaWiki telepíthető.",
        "config-env-bad": "A környezet ellenőrzése befejeződött.\nA MediaWiki nem telepíthető.",
        "config-env-php": "A PHP verziója: $1",
        "config-env-php-toolow": "PHP $1 van telepítve,\nazonban a MediaWikinek PHP $2, vagy újabb szükséges.",
        "config-unicode-using-utf8": "A rendszer Unicode normalizálására Brion Vibber utf8_normalize.so könyvtárát használja.",
        "config-unicode-using-intl": "A rendszer Unicode normalizálására az [http://pecl.php.net/intl intl PECL kiterjesztést] használja.",
-       "config-unicode-pure-php-warning": "'''Figyelmeztetés''': Az Unicode normalizáláshoz szükséges [http://pecl.php.net/intl intl PECL kiterjesztés] nem érhető el, helyette a lassú, PHP alapú implementáció lesz használva.\nHa nagy látogatottságú oldalt üzemeltetsz, itt találhatsz további információkat [//www.mediawiki.org/wiki/Unicode_normalization_considerations a témáról].",
-       "config-unicode-update-warning": "'''Figyelmeztetés''': Az Unicode normalizáláshoz szükséges burkolókönyvtár [http://site.icu-project.org/ ICU projekt] függvénykönyvtárának régebbi változatát használja.\nHa ügyelni kívánsz a Unicode használatára, fontold meg a [//www.mediawiki.org/wiki/Unicode_normalization_considerations frissítését].",
+       "config-unicode-pure-php-warning": "'''Figyelmeztetés''': Az Unicode normalizáláshoz szükséges [http://pecl.php.net/intl intl PECL kiterjesztés] nem érhető el, helyette a lassú, PHP alapú implementáció lesz használva.\nHa nagy látogatottságú oldalt üzemeltetsz, itt találhatsz további információkat [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations a témáról].",
+       "config-unicode-update-warning": "'''Figyelmeztetés''': Az Unicode normalizáláshoz szükséges burkolókönyvtár [http://site.icu-project.org/ ICU projekt] függvénykönyvtárának régebbi változatát használja.\nHa ügyelni kívánsz a Unicode használatára, fontold meg a [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations frissítését].",
        "config-no-db": "Nem sikerült egyetlen használható adatbázis-illesztőprogramot sem találni.  Telepítened kell egyet a PHP-hez.\nA következő adatbázistípusok támogatottak: $1.\n\nHa a PHP-t magad fordítottad, konfiguráld újra úgy, hogy engedélyezve legyen egy adatbáziskliens, pl. a <code>./configure --with-mysql</code> parancs használatával.\nHa a PHP-t Debian vagy Ubuntu csomaggal telepítetted, akkor szükséged lesz a php5-mysql modulra is.",
        "config-no-fts3": "'''Figyelmeztetés''': Az SQLite [//sqlite.org/fts3.html FTS3 modul] nélkül lett fordítva, a keresési funkciók nem fognak működni ezen a rendszeren.",
        "config-register-globals": "'''Figyelmeztetés: A PHP <code>[http://php.net/register_globals register_globals]</code> beállítása engedélyezve van.'''\n'''Tiltsd le, ha van rá lehetőséged.'''\nA MediaWiki működőképes a beállítás használata mellett, de a szerver biztonsági kockázatnak lesz kitéve.",
@@ -80,7 +80,7 @@
        "config-no-uri": "'''Hiba:''' Nem sikerült megállapítani a jelenlegi URI-t.\nTelepítés megszakítva.",
        "config-using-server": "A következő szervernév használata: „<nowiki>$1</nowiki>”.",
        "config-using-uri": "A következő szerver URL-cím használata: „<nowiki>$1$2</nowiki>”.",
-       "config-uploads-not-safe": "'''Figyelmeztetés:''' a feltöltésekhez használt alapértelmezett könyvtárban (<code>$1</code>) tetszőleges külső szkript futtatható.\nHabár a MediaWiki ellenőrzi a feltöltött fájlokat az efféle biztonsági veszélyek megtalálása érdekében, a feltöltés engedélyezése előtt erősen ajánlott a [//www.mediawiki.org/wiki/Manual:Security#Upload_security a sérülékenység megszüntetése].",
+       "config-uploads-not-safe": "'''Figyelmeztetés:''' a feltöltésekhez használt alapértelmezett könyvtárban (<code>$1</code>) tetszőleges külső szkript futtatható.\nHabár a MediaWiki ellenőrzi a feltöltött fájlokat az efféle biztonsági veszélyek megtalálása érdekében, a feltöltés engedélyezése előtt erősen ajánlott a [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security a sérülékenység megszüntetése].",
        "config-brokenlibxml": "A rendszereden a PHP és libxml2 verziók olyan kombinációja található meg, ami hibásan működik, és észrevehetetlen adatkárosodást okoz a MediaWikiben és más webalkalmazásokban.\nFrissíts a libxml2 2.7.3 vgy újabb verziójára ([https://bugs.php.net/bug.php?id=45996 A hiba bejelentése a PHP-nél]).\nTelepítés megszakítva.",
        "config-suhosin-max-value-length": "A Suhosin telepítve van, és a GET paraméter hosszát $1 bájtra korlátozza. A MediaWiki erőforrásbetöltő összetevője megkerüli a problémát, de így csökkenni fog a teljesítmény. Ha lehetséges, állítsd be a <code>suhosin.get.max_value_length</code> értékét legalább 1024-re a <code>php.ini</code>ben, és állítsd be a <code>$wgResourceLoaderMaxQueryLength</code> változót ugyanerre az értékre a LocalSettings.php-ben.",
        "config-db-type": "Adatbázis típusa:",
        "config-profile-no-anon": "Felhasználói fiók létrehozása szükséges",
        "config-profile-fishbowl": "Csak engedélyezett szerkesztők",
        "config-profile-private": "Privát wiki",
-       "config-profile-help": "A wikik akkor működnek a legjobban, ha minél több felhasználó számára engedélyezett a szerkesztés.\nA MediaWikiben könnyű ellenőrizni a legutóbbi változtatásokat,és visszaállítani a naiv vagy káros felhasználók által okozott károkat.\n\nA MediaWiki azonban számos helyzetben hasznos lehet, és néha nem könnyű mindenkit meggyőzni a wiki előnyeiről.\nVálaszthatsz!\n\n<strong>{{int:config-profile-wiki}}kben</strong> bárki szerkeszthet, akár bejelentkezés nélkül is. A <strong>{{int:config-profile-no-anon}}</strong> beállítás további biztonságot nyújt, azonban elijesztheti az alkalmi szerkesztőket.\n\nLehetőség van arra is, hogy <strong>{{lc:{{int:config-profile-fishbowl}}}}</strong> módosíthassák a lapokat, de a nyilvánosság ekkor megtekintheti a lapokat és azok laptörténetét is. <strong>{{int:config-profile-private}}</strong> esetén csak az engedélyezett szerkesztők tekinthetik meg a lapokat, és ugyanez a csoport szerkeszthet.\n\nTelepítés után jóval összetettebb jogosultságrendszer állítható össze, további információ a [//www.mediawiki.org/wiki/Manual:User_rights kézikönyv kapcsolódó bejegyzésében].",
+       "config-profile-help": "A wikik akkor működnek a legjobban, ha minél több felhasználó számára engedélyezett a szerkesztés.\nA MediaWikiben könnyű ellenőrizni a legutóbbi változtatásokat,és visszaállítani a naiv vagy káros felhasználók által okozott károkat.\n\nA MediaWiki azonban számos helyzetben hasznos lehet, és néha nem könnyű mindenkit meggyőzni a wiki előnyeiről.\nVálaszthatsz!\n\n<strong>{{int:config-profile-wiki}}kben</strong> bárki szerkeszthet, akár bejelentkezés nélkül is. A <strong>{{int:config-profile-no-anon}}</strong> beállítás további biztonságot nyújt, azonban elijesztheti az alkalmi szerkesztőket.\n\nLehetőség van arra is, hogy <strong>{{lc:{{int:config-profile-fishbowl}}}}</strong> módosíthassák a lapokat, de a nyilvánosság ekkor megtekintheti a lapokat és azok laptörténetét is. <strong>{{int:config-profile-private}}</strong> esetén csak az engedélyezett szerkesztők tekinthetik meg a lapokat, és ugyanez a csoport szerkeszthet.\n\nTelepítés után jóval összetettebb jogosultságrendszer állítható össze, további információ a [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights kézikönyv kapcsolódó bejegyzésében].",
        "config-license": "Szerzői jog és licenc:",
        "config-license-none": "Nincs licencjelzés",
        "config-license-cc-by-sa": "Creative Commons Nevezd meg! - Így add tovább!",
        "config-email-sender-help": "Add meg a kimenő e-mail-üzenetek válaszcímét.\nIde lesznek küldve a visszapattant üzenetek is.\nSzámos levelezőszerver számára a cím domainrészének érvényesnek kell lennie.",
        "config-upload-settings": "Képek és fájlok feltöltése",
        "config-upload-enable": "Fájlfeltöltés engedélyezése",
-       "config-upload-help": "A fájlfeltöltés lehetséges biztonsági kockázatoknak teszi ki a szerveredet.\nTovábbi információért olvasd el a [//www.mediawiki.org/wiki/Manual:Security biztonságról szóló szakaszt] a kézikönyvben.\n\nA fájlfeltöltés engedélyezéséhez változtasd meg a MediaWiki gyökérkönyvtárában található <code>images</code> alkönyvtár jogosultságát úgy, hogy a szerver írhasson oda, majd engedélyezd itt a beállítást.",
+       "config-upload-help": "A fájlfeltöltés lehetséges biztonsági kockázatoknak teszi ki a szerveredet.\nTovábbi információért olvasd el a [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security biztonságról szóló szakaszt] a kézikönyvben.\n\nA fájlfeltöltés engedélyezéséhez változtasd meg a MediaWiki gyökérkönyvtárában található <code>images</code> alkönyvtár jogosultságát úgy, hogy a szerver írhasson oda, majd engedélyezd itt a beállítást.",
        "config-upload-deleted": "Törölt fájlok könyvtára:",
        "config-upload-deleted-help": "Válaszd ki azt a könyvtárat, ahol a törölt fájlok lesznek archiválva.\nNormális esetben ennek nem szabad elérhetőnek lennie az internetről.",
        "config-logo": "A logó URL-címe:",
        "config-logo-help": "A MediaWiki alapértelmezett felülete helyet ad egy 135×160 pixeles logónak a bal felső sarokban.\nTölts fel egy megfelelő méretű képet, majd írd be ide az URL-címét!\n\nHasználhatsz  <code>$wgStylePath</code>-t vagy <code>$wgScriptPath</code>-t, ha más méretű a logód.\n\nHa nem szeretnél logót használni, egyszerűen hagyd üresen a mezőt.",
        "config-instantcommons": "Instant Commons engedélyezése",
-       "config-instantcommons-help": "Az [//www.mediawiki.org/wiki/InstantCommons Instant Commons] lehetővé teszi, hogy a wikin használhassák a [//commons.wikimedia.org/ Wikimedia Commons] oldalon található képeket, hangokat és más médiafájlokat.\nA használatához a MediaWikinek internethozzáférésre van szüksége.\n\nA funkcióról és hogy hogyan állítható be más wikik esetén [//mediawiki.org/wiki/Manual:$wgForeignFileRepos a kézikönyvben] találhatsz további információkat.",
+       "config-instantcommons-help": "Az [//www.mediawiki.org/wiki/InstantCommons Instant Commons] lehetővé teszi, hogy a wikin használhassák a [//commons.wikimedia.org/ Wikimedia Commons] oldalon található képeket, hangokat és más médiafájlokat.\nA használatához a MediaWikinek internethozzáférésre van szüksége.\n\nA funkcióról és hogy hogyan állítható be más wikik esetén [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos a kézikönyvben] találhatsz további információkat.",
        "config-cc-error": "A Creative Commons-licencválasztó nem tért vissza eredménnyel.\nAdd meg kézzel a licencet.",
        "config-cc-again": "Válassz újra…",
        "config-cc-not-chosen": "Válaszd ki a kívánt Creative Commons licencet, majd kattints a „Folytatás gombra”!",
        "config-insecure-keys": "'''Figyelmeztetés:''' A telepítés során generált $1 {{PLURAL:$2|biztonsági kulcs|biztonsági kulcsok}} nem teljesen $1 {{PLURAL:$2|biztonságos|biztonságosak}}. Érdemes {{PLURAL:$2||őket}} manuálisan megváltoztatni.",
        "config-install-sysop": "Az adminisztrátor felhasználói fiókjának létrehozása",
        "config-install-subscribe-fail": "Nem sikerült feliratkozni a mediawiki-announce levelezőlistára: $1",
-       "config-install-subscribe-notpossible": "A cURL nincs telepítve és az allow_url_fopen nem érhető el.",
+       "config-install-subscribe-notpossible": "A cURL nincs telepítve és az <code>allow_url_fopen</code> nem érhető el.",
        "config-install-mainpage": "Kezdőlap létrehozása az alapértelmezett tartalommal",
        "config-install-extension-tables": "Táblák létrehozása az engedélyezett kiterjesztésekhez",
        "config-install-mainpage-failed": "Nemsikerült létrehozni a kezdőlapot: $1",
        "config-help": "segítség",
        "config-nofile": "\"$1\" fájl nem található. Törölve lett?",
        "mainpagetext": "'''A MediaWiki telepítése sikeresen befejeződött.'''",
-       "mainpagedocfooter": "Ha segítségre van szükséged a wikiszoftver használatához, akkor keresd fel a [//meta.wikimedia.org/wiki/Help:Contents User's Guide] oldalt.\n\n== Alapok (angol nyelven) ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Beállítások listája]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki GyIK]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-kiadások levelezőlistája]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources A MediaWiki fordítása a saját nyelvedre]"
+       "mainpagedocfooter": "Ha segítségre van szükséged a wikiszoftver használatához, akkor keresd fel a [//meta.wikimedia.org/wiki/Help:Contents User's Guide] oldalt.\n\n== Alapok (angol nyelven) ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Beállítások listája]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki GyIK]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-kiadások levelezőlistája]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources A MediaWiki fordítása a saját nyelvedre]"
 }
index 91e1c83..7617942 100644 (file)
@@ -1,5 +1,5 @@
 {
        "@metadata": [],
        "mainpagetext": "'''«MediaWiki» ծրագիրը հաջողությամբ տեղադրվեց։'''",
-       "mainpagedocfooter": "Այցելեք [//meta.wikimedia.org/wiki/Help:Contents User's Guide]՝ վիքի ծրագրային ապահովման օգտագործման մասին տեղեկությունների համար։\n\n== Որոշ օգտակար ռեսուրսներ ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]"
+       "mainpagedocfooter": "Այցելեք [//meta.wikimedia.org/wiki/Help:Contents User's Guide]՝ վիքի ծրագրային ապահովման օգտագործման մասին տեղեկությունների համար։\n\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 f0e11c3..59c4e89 100644 (file)
        "config-restart": "Si, reinitia lo",
        "config-welcome": "=== Verificationes del ambiente ===\nVerificationes de base essera ora exequite pro determinar si iste ambiente es apte pro le installation de MediaWiki.\nNon oblida de includer iste information si tu cerca adjuta pro completar le installation.",
        "config-copyright": "=== Copyright and Terms ===\n\n$1\n\nIste programma es software libere; vos pote redistribuer lo e/o modificar lo sub le conditiones del Licentia Public General de GNU publicate per le Free Software Foundation; version 2 del Licentia, o (a vostre option) qualcunque version posterior.\n\nIste programma es distribuite in le sperantia que illo sia utile, ma '''sin garantia''', sin mesmo le implicite garantia de '''commercialisation''' o '''aptitude pro un proposito particular'''.\nVide le Licentia Public General de GNU pro plus detalios.\n\nVos deberea haber recipite <doclink href=Copying>un exemplar del Licentia Public General de GNU</doclink> con iste programma; si non, scribe al Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, o [http://www.gnu.org/copyleft/gpl.html lege lo in linea].",
-       "config-sidebar": "* [//www.mediawiki.org Pagina principal de MediaWiki]\n* [//www.mediawiki.org/wiki/Help:Contents Guida pro usatores]\n* [//www.mediawiki.org/wiki/Manual:Contents Guida pro administratores]\n* [//www.mediawiki.org/wiki/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>Lege me</doclink>\n* <doclink href=ReleaseNotes>Notas de iste version</doclink>\n* <doclink href=Copying>Conditiones de copia</doclink>\n* <doclink href=UpgradeDoc>Actualisation</doclink>",
+       "config-sidebar": "* [//www.mediawiki.org Pagina principal de MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Guida pro usatores]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Guida pro administratores]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>Lege me</doclink>\n* <doclink href=ReleaseNotes>Notas de iste version</doclink>\n* <doclink href=Copying>Conditiones de copia</doclink>\n* <doclink href=UpgradeDoc>Actualisation</doclink>",
        "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-php-toolow": "PHP $1 es installate.\nNonobstante, MediaWiki require PHP $2 o plus recente.",
        "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/Unicode_normalization_considerations normalisation Unicode].",
-       "config-unicode-update-warning": "'''Aviso''': Le version installate del bibliotheca inveloppante pro normalisation Unicode usa un version ancian del bibliotheca del [http://site.icu-project.org/ projecto ICU].\nTu deberea [//www.mediawiki.org/wiki/Unicode_normalization_considerations actualisar lo] si le uso de Unicode importa a te.",
+       "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].",
+       "config-unicode-update-warning": "'''Aviso''': Le version installate del bibliotheca inveloppante pro normalisation Unicode usa un version ancian del bibliotheca del [http://site.icu-project.org/ projecto ICU].\nTu deberea [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations actualisar lo] si le uso de Unicode importa a te.",
        "config-no-db": "Non poteva trovar un driver appropriate pro le base de datos! Es necessari installar un driver de base de datos pro PHP.\nLe sequente typos de base de datos es supportate: $1.\n\nSi tu compilava PHP tu mesme, reconfigura lo con un cliente de base de datos activate, per exemplo usante <code>./configure --with-mysqli</code>.\nSi tu installava PHP ex un pacchetto Debian o Ubuntu, tu debe installar equalmente, per exemplo, le modulo <code>php5-mysql</code>.",
        "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.",
@@ -82,7 +82,7 @@
        "config-no-cli-uri": "'''Attention''': Cammino al script (<code>--scriptpath</code>) non specificate. Le predefinition es usate: <code>$1</code>.",
        "config-using-server": "Es usate le nomine de servitor \"<nowiki>$1</nowiki>\".",
        "config-using-uri": "Le URL de servitor \"<nowiki>$1$2</nowiki>\" es usate.",
-       "config-uploads-not-safe": "'''Aviso:''' Le directorio predefinite pro files incargate <code>$1</code> es vulnerabile al execution arbitrari de scripts.\nBen que MediaWiki verifica tote le files incargate contra le menacias de securitate, il es altemente recommendate [//www.mediawiki.org/wiki/Manual:Security#Upload_security remediar iste vulnerabilitate de securitate] ante de activar le incargamento de files.",
+       "config-uploads-not-safe": "'''Aviso:''' Le directorio predefinite pro files incargate <code>$1</code> es vulnerabile al execution arbitrari de scripts.\nBen que MediaWiki verifica tote le files incargate contra le menacias de securitate, il es altemente recommendate [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security remediar iste vulnerabilitate de securitate] ante de activar le incargamento de files.",
        "config-no-cli-uploads-check": "'''Attention:''' Le directorio predefinite pro files incargate (<code>$1</code>) non es verificate contra le vulnerabilitate\nal execution arbitrari de scripts durante le installation de CLI.",
        "config-brokenlibxml": "Vostre systema ha un combination de versiones de PHP e libxml2 que es defectuose e pote causar corruption celate de datos in MediaWiki e altere applicationes web.\nActualisa a libxml2 2.7.3 o plus recente ([https://bugs.php.net/bug.php?id=45996 problema reportate presso PHP]).\nInstallation abortate.",
        "config-suhosin-max-value-length": "Suhosin es installate e limita parametro <code>length</code> de GET a $1 bytes.\nLe componente ResourceLoader de MediaWiki va contornar iste limite, ma isto prejudicara le rendimento.\nSi possibile, tu deberea mitter <code>suhosin.get.max_value_length</code> a 1024 o superior in <code>php.ini</code>, e mitter <code>$wgResourceLoaderMaxQueryLength</code> al mesme valor in <code>LocalSettings.php</code>.",
        "config-profile-no-anon": "Creation de conto obligatori",
        "config-profile-fishbowl": "Modificatores autorisate solmente",
        "config-profile-private": "Wiki private",
-       "config-profile-help": "Le wikis functiona melio si tu permitte a tante personas como possibile de modificar los.\nIn MediaWiki, il es facile revider le modificationes recente, e reverter omne damno facite per usatores naive o malitiose.\n\nNonobstante, multes ha trovate MediaWiki utile in un grande varietate de rolos, e alcun vices il non es facile convincer omnes del beneficios del principio wiki.\nDunque, a te le option.\n\nLe modello '''{{int:config-profile-wiki}}''' permitte a omnes de modificar, sin mesmo aperir un session.\nUn wiki con '''{{int:config-profile-no-anon}}''' attribue additional responsabilitate, ma pote dissuader contributores occasional.\n\nLe scenario '''{{int:config-profile-fishbowl}}''' permitte al usatores approbate de modificar, ma le publico pote vider le paginas, includente lor historia.\nUn '''{{int:config-profile-private}}''' permitte solmente al usatores approbate de vider le paginas e de modificar los.\n\nConfigurationes de derectos de usator plus complexe es disponibile post installation, vide le [//www.mediawiki.org/wiki/Manual:User_rights pertinente section del manual].",
+       "config-profile-help": "Le wikis functiona melio si tu permitte a tante personas como possibile de modificar los.\nIn MediaWiki, il es facile revider le modificationes recente, e reverter omne damno facite per usatores naive o malitiose.\n\nNonobstante, multes ha trovate MediaWiki utile in un grande varietate de rolos, e alcun vices il non es facile convincer omnes del beneficios del principio wiki.\nDunque, a te le option.\n\nLe modello '''{{int:config-profile-wiki}}''' permitte a omnes de modificar, sin mesmo aperir un session.\nUn wiki con '''{{int:config-profile-no-anon}}''' attribue additional responsabilitate, ma pote dissuader contributores occasional.\n\nLe scenario '''{{int:config-profile-fishbowl}}''' permitte al usatores approbate de modificar, ma le publico pote vider le paginas, includente lor historia.\nUn '''{{int:config-profile-private}}''' permitte solmente al usatores approbate de vider le paginas e de modificar los.\n\nConfigurationes de derectos de usator plus complexe es disponibile post installation, vide le [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights pertinente section del manual].",
        "config-license": "Copyright e licentia:",
        "config-license-none": "Nulle licentia in pede de paginas",
        "config-license-cc-by-sa": "Creative Commons Attribution Share Alike",
        "config-email-sender-help": "Entra le adresse de e-mail a usar como adresse de retorno in e-mail sortiente.\nHic es recipite le notificationes de non-livration.\nMulte servitores de e-mail require que al minus le parte de nomine de dominio sia valide.",
        "config-upload-settings": "Incargamento de imagines e files",
        "config-upload-enable": "Activar le incargamento de files",
-       "config-upload-help": "Le incargamento de files potentialmente expone tu servitor a riscos de securitate.\nPro plus information, lege le [//www.mediawiki.org/wiki/Manual:Security section de securitate] in le manual.\n\nPro activar le incargamento de files, cambia le modo in le subdirectorio <code>images</code> sub le directorio-radice de MediaWiki de sorta que le servitor web pote scriber in illo.\nPostea activa iste option.",
+       "config-upload-help": "Le incargamento de files potentialmente expone tu servitor a riscos de securitate.\nPro plus information, lege le [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security section de securitate] in le manual.\n\nPro activar le incargamento de files, cambia le modo in le subdirectorio <code>images</code> sub le directorio-radice de MediaWiki de sorta que le servitor web pote scriber in illo.\nPostea activa iste option.",
        "config-upload-deleted": "Directorio pro files delite:",
        "config-upload-deleted-help": "Selige un directorio in le qual archivar le files delite.\nIdealmente, isto non debe esser accessibile ab le web.",
        "config-logo": "URL del logotypo:",
        "config-logo-help": "Le apparentia predefinite de MediaWiki include spatio pro un logotypo de 135×160 pixels supra le menu del barra lateral.\nIncarga un imagine con le dimensiones appropriate, e entra le URL hic.\n\nTu pote usar <code>$wgStylePath</code> o <code>$wgScriptPath</code> si le loco de tu logotypo es relative a iste camminos.\n\nSi tu non vole un logotypo, lassa iste quadro vacue.",
        "config-instantcommons": "Activar \"Instant Commons\"",
-       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] es un function que permitte a wikis de usar imagines, sonos e altere multimedia trovate in le sito [//commons.wikimedia.org/ Wikimedia Commons].\nPro poter facer isto, MediaWiki require accesso a Internet.\n\nPro plus information super iste function, includente instructiones super como configurar lo pro wikis altere que Wikimedia Commons, consulta [//mediawiki.org/wiki/Manual:$wgForeignFileRepos le manual].",
+       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] es un function que permitte a wikis de usar imagines, sonos e altere multimedia trovate in le sito [//commons.wikimedia.org/ Wikimedia Commons].\nPro poter facer isto, MediaWiki require accesso a Internet.\n\nPro plus information super iste function, includente instructiones super como configurar lo pro wikis altere que Wikimedia Commons, consulta [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos le manual].",
        "config-cc-error": "Le selector de licentia Creative Commons non dava un resultato.\nEntra le nomine del licentia manualmente.",
        "config-cc-again": "Selige de novo…",
        "config-cc-not-chosen": "Selige le licentia Creative Commons que tu prefere e clicca \"proceder\".",
        "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-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 allow_url_fopen non es disponibile.",
+       "config-install-subscribe-notpossible": "cURL non es installate e <code>allow_url_fopen</code> non es disponibile.",
        "config-install-mainpage": "Crea pagina principal con contento predefinite",
        "config-install-extension-tables": "Creation de tabellas pro le extensiones activate",
        "config-install-mainpage-failed": "Non poteva inserer le pagina principal: $1",
        "config-download-localsettings": "Discargar <code>LocalSettings.php</code>",
        "config-help": "adjuta",
        "config-nofile": "Le file \"$1\" non poteva esser trovate. Ha illo essite delite?",
-       "config-extension-link": "Sapeva tu que tu wiki supporta [//www.mediawiki.org/wiki/Manual:Extensions extensiones]?\n\nTu pote explorar le [//www.mediawiki.org/wiki/Category:Extensions_by_category extensiones per category] o le [//www.mediawiki.org/wiki/Extension_Matrix matrice de extensiones] pro vider le lista complete de extensiones.",
+       "config-extension-link": "Sapeva tu que tu wiki supporta [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensiones]?\n\nTu pote explorar le [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensiones per category] o le [//www.mediawiki.org/wiki/Extension_Matrix matrice de extensiones] pro vider le lista complete de extensiones.",
        "mainpagetext": "'''MediaWiki ha essite installate con successo.'''",
-       "mainpagedocfooter": "Consulta le [//meta.wikimedia.org/wiki/Help:Contents Guida del usator] pro informationes super le uso del software wiki.\n\n== Pro initiar ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista de configurationes]\n* [//www.mediawiki.org/wiki/Manual:FAQ FAQ a proposito de MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de diffusion pro annuncios de nove versiones de MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Traducer MediaWiki in tu lingua]"
+       "mainpagedocfooter": "Consulta le [//meta.wikimedia.org/wiki/Help:Contents Guida del usator] pro informationes super le uso del software wiki.\n\n== Pro initiar ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista de configurationes]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ a proposito de MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de diffusion pro annuncios de nove versiones de MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Traducer MediaWiki in tu lingua]"
 }
index 0b2d9eb..5f01e6d 100644 (file)
@@ -5,7 +5,9 @@
                        "IvanLanin",
                        "Kenrick95",
                        "Reedy",
-                       "아라"
+                       "아라",
+                       "C5st4wr6ch",
+                       "Seb35"
                ]
        },
        "config-desc": "Penginstal untuk MediaWiki",
@@ -17,7 +19,7 @@
        "config-localsettings-badkey": "Kunci yang Anda berikan tidak benar",
        "config-upgrade-key-missing": "Suatu instalasi MediaWiki telah terdeteksi.\nUntuk memutakhirkan instalasi ini, silakan masukkan baris berikut di bagian bawah <code>LocalSettings.php</code> Anda:\n\n$1",
        "config-localsettings-incomplete": "<code>LocalSettings.php</code> yang ada tampaknya tidak lengkap.\nVariabel $1 tidak diatur.\nSilakan ubah <code>LocalSettings.php</code> untuk mengatur variabel ini dan klik \"{{int:Config-continue}}\".",
-       "config-localsettings-connection-error": "Timbul galat saat menghubungkan ke basis data dengan menggunakan setelan yang ditentukan di <code>LocalSettings.php</code> atau <code>AdminSettings.php</code>. Harap perbaiki setelan ini dan coba lagi.\n\n$1",
+       "config-localsettings-connection-error": "Ditemukan galat saat menghubungkan ke basis data dengan menggunakan setelan yang ditentukan di <code>LocalSettings.php</code>. Harap perbaiki setelan ini dan coba lagi.\n\n$1",
        "config-session-error": "Kesalahan sesi mulai: $1",
        "config-session-expired": "Data sesi tampaknya telah kedaluwarsa.\nSesi dikonfigurasi untuk berlaku selama $1.\nAnda dapat menaikkannya dengan menetapkan <code>session.gc_maxlifetime</code> dalam php.ini.\nUlangi proses instalasi.",
        "config-no-session": "Data sesi Anda hilang!\nCek php.ini Anda dan pastikan bahwa <code>session.save_path</code> diatur ke direktori yang sesuai.",
        "config-page-existingwiki": "Wiki yang ada",
        "config-help-restart": "Apakah Anda ingin menghapus semua data tersimpan yang telah Anda masukkan dan mengulang proses instalasi?",
        "config-restart": "Ya, nyalakan ulang",
-       "config-welcome": "=== Pengecekan lingkungan ===\nPengecekan dasar dilakukan untuk melihat apakah lingkungan ini memadai untuk instalasi MediaWiki.\nAnda harus memberikan hasil pemeriksaan ini jika Anda memerlukan bantuan selama instalasi.",
+       "config-welcome": "=== Pengecekan lingkungan ===\nPengecekan dasar kini akan dilakukan untuk melihat apakah lingkungan ini memadai untuk instalasi MediaWiki.\nIngatlah untuk menyertakan informasi ini jika Anda mencari bantuan tentang cara menyelesaikan instalasi.",
        "config-copyright": "=== Hak cipta dan persyaratan ===\n\n$1\n\nProgram ini adalah perangkat lunak bebas; Anda dapat mendistribusikan dan/atau memodifikasi di bawah persyaratan GNU General Public License seperti yang diterbitkan oleh Free Software Foundation; baik versi 2 lisensi, atau (sesuai pilihan Anda) versi yang lebih baru.\n\nProgram ini didistribusikan dengan harapan bahwa itu akan berguna, tetapi '''tanpa jaminan apa pun'''; bahkan tanpa jaminan tersirat untuk '''dapat diperjualbelikan ''' atau '''sesuai untuk tujuan tertentu'''.\nLihat GNU General Public License untuk lebih jelasnya.\n\nAnda seharusnya telah menerima <doclink href=\"Copying\">salinan dari GNU General Public License</doclink> bersama dengan program ini; jika tidak, kirimkan surat untuk Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. atau [http://www.gnu.org/copyleft/gpl.html baca versi daring].",
-       "config-sidebar": "* [//www.mediawiki.org/wiki/MediaWiki/id Situs MediaWiki]\n* [//www.mediawiki.org/wiki/Help:Contents/id Pedoman Pengguna]\n* [//www.mediawiki.org/wiki/Manual:Contents/id Pedoman Administrator]\n* [//www.mediawiki.org/wiki/Manual:FAQ/id FAQ]\n----\n* <doclink href=Readme>Read me</doclink>\n* <doclink href=ReleaseNotes>Release notes</doclink>\n* <doclink href=Copying>Copying</doclink>\n* <doclink href=UpgradeDoc>Upgrading</doclink>",
+       "config-sidebar": "* [//www.mediawiki.org/wiki/MediaWiki/id Situs MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents/id Pedoman Pengguna]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents/id Pedoman Administrator]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/id FAQ]\n----\n* <doclink href=Readme>Read me</doclink>\n* <doclink href=ReleaseNotes>Release notes</doclink>\n* <doclink href=Copying>Copying</doclink>\n* <doclink href=UpgradeDoc>Upgrading</doclink>",
        "config-env-good": "Kondisi telah diperiksa.\nAnda dapat menginstal MediaWiki.",
        "config-env-bad": "Kondisi telah diperiksa.\nAnda tidak dapat menginstal MediaWiki.",
        "config-env-php": "PHP $1 diinstal.",
        "config-env-php-toolow": "PHP $1 telah terinstal.\nNamun, MediaWiki memerlukan PHP $2 atau lebih tinggi.",
        "config-unicode-using-utf8": "Menggunakan utf8_normalize.so Brion Vibber untuk normalisasi Unicode.",
        "config-unicode-using-intl": "Menggunakan [http://pecl.php.net/intl ekstensi PECL intl] untuk normalisasi Unicode.",
-       "config-unicode-pure-php-warning": "'''Peringatan''': [http://pecl.php.net/intl Ekstensi intl PECL] untuk menangani normalisasi Unicode tidak tersedia, kembali menggunakan implementasi murni PHP yang lambat.\nJika Anda menjalankan situs berlalu lintas tinggi, Anda harus sedikit membaca [//www.mediawiki.org/wiki/Unicode_normalization_considerations normalisasi Unicode].",
-       "config-unicode-update-warning": "'''Peringatan''': Versi terinstal dari pembungkus normalisasi Unicode menggunakan versi lama pustaka [http://site.icu-project.org/ proyek ICU].\nAnda harus [//www.mediawiki.org/wiki/Unicode_normalization_considerations memutakhirkannya] jika Anda ingin menggunakan Unicode.",
+       "config-unicode-pure-php-warning": "'''Peringatan''': [http://pecl.php.net/intl Ekstensi intl PECL] untuk menangani normalisasi Unicode tidak tersedia, kembali menggunakan implementasi murni PHP yang lambat.\nJika Anda menjalankan situs berlalu lintas tinggi, Anda harus sedikit membaca [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalisasi Unicode].",
+       "config-unicode-update-warning": "'''Peringatan''': Versi terinstal dari pembungkus normalisasi Unicode menggunakan versi lama pustaka [http://site.icu-project.org/ proyek ICU].\nAnda harus [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations memutakhirkannya] jika Anda ingin menggunakan Unicode.",
        "config-no-db": "Pengandar basis data yang sesuai tidak ditemukan! Anda perlu menginstal pengandar basis data untuk PHP.\nJenis basis data yang didukung: $1.\n\nJika Anda menggunakan inang bersama, mintalah penyedia inang Anda untuk menginstal pengandar basis data yang sesuai.\nJika Anda mengompilasi sendiri PHP, ubahlah konfigurasinya dengan mengaktifkan klien basis data, misalnya menggunakan <code>./configure --with-mysql</code>.\nJika Anda menginstal PHP dari paket Debian atau Ubuntu, maka Anda juga perlu menginstal modul php5-mysql.",
+       "config-outdated-sqlite": "<strong>Peringatan:</strong> Anda menggunakan SQLite $1, yang lebih rendah dari versi minimum yang diperlukan $2. SQLite akan tidak tersedia.",
        "config-no-fts3": "'''Peringatan''': SQLite dikompilasi tanpa [//sqlite.org/fts3.html modul FTS3], fitur pencarian tidak akan tersedia pada konfigurasi ini.",
        "config-register-globals": "'''Peringatan: Opsi <code>[http://php.net/register_globals register_globals]</code> PHP diaktifkan.'''\n'''Nonaktifkan kalau bisa.'''\nMediaWiki akan bekerja, tetapi server Anda memiliki potensi kerentanan keamanan.",
        "config-magic-quotes-runtime": "'''Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] aktif!'''\nPilihan ini dapat merusak masukan data secara tidak terduga.\nAnda tidak dapat menginstal atau menggunakan MediaWiki kecuali pilihan ini dinonaktifkan.",
        "config-apc": "[http://www.php.net/apc APC] telah diinstal",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] telah diinstal",
        "config-no-cache": "'''Peringatan:''' Tidak dapat menemukan [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache], atau [http://www.iis.net/download/WinCacheForPhp WinCache]. Pinggahan obyek tidak dinonaktifkan.",
+       "config-mod-security": "<strong>Peringatan:</strong> Server web Anda memiliki [http://modsecurity.org/ mod_security] yang diaktifkan. Jika salah dalam mengkonfigurasi, ini dapat menyebabkan masalah untuk MediaWiki atau perangkat lunak lain yang memungkinkan pengguna untuk mengirim sembarang konten.\nLihat [http://modsecurity.org/documentation/ dokumentasi mod_security] atau hubungi layanan host Anda jika Anda mengalami kesalahan acak.",
        "config-diff3-bad": "GNU diff3 tidak ditemukan.",
        "config-imagemagick": "ImageMagick ditemukan: <code>$1</code> .\nPembuatan gambar mini akan diaktifkan jika Anda mengaktifkan pengunggahan.",
        "config-gd": "Pustaka grafis GD terpasang ditemukan.\nPembuatan gambar mini akan diaktifkan jika Anda mengaktifkan pengunggahan.",
        "config-no-scaling": "Pustaka GD atau ImageMagick tidak ditemukan.\nPembuatan gambar mini dinonaktifkan.",
        "config-no-uri": "'''Kesalahan:''' URI saat ini tidak dapat ditentukan.\nInstalasi dibatalkan.",
-       "config-uploads-not-safe": "'''Peringatan:''' Direktori bawaan pengunggahan <code>$1</code> Anda rentan terhadap eksekusi skrip yang sewenang-wenang.\nMeskipun MediaWiki memeriksa semua berkas unggahan untuk ancaman keamanan, sangat dianjurkan untuk [//www.mediawiki.org/wiki/Manual:Security#Upload_security menutup kerentanan keamanan ini] sebelum mengaktifkan pengunggahan.",
-       "config-brokenlibxml": "Sistem Anda memiliki kombinasi versi PHP dan libxml2 yang memiliki bug dan dapat menyebabkan kerusakan data tersembunyi pada MediaWiki dan aplikasi web lain.\nMutakhirkan ke PHP 5.2.9 atau yang lebih baru dan libxml2 2.7.3 atau yang lebih baru ([//bugs.php.net/bug.php?id=45996 arsip bug di PHP]).\nInstalasi dibatalkan.",
-       "config-suhosin-max-value-length": "Suhosin terpasang dan membatasi panjang parameter GET sebesar $1 bita. Komponen ResourceLoader MediaWiki akan mengatasi batasan ini, tapi penanganannya akan menurunkan kinerja. Jika memungkinkan, Anda sebaiknya menetapkan nilai <code>suhosin.get.max_value_length</code> menjadi 1024 atau lebih tinggi dalam <code>php.ini</code> dan menyetel <code>$wgResourceLoaderMaxQueryLength</code> dengan nilai yang sama dalam LocalSettings.php.",
+       "config-uploads-not-safe": "'''Peringatan:''' Direktori bawaan pengunggahan <code>$1</code> Anda rentan terhadap eksekusi skrip yang sewenang-wenang.\nMeskipun MediaWiki memeriksa semua berkas unggahan untuk ancaman keamanan, sangat dianjurkan untuk [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security menutup kerentanan keamanan ini] sebelum mengaktifkan pengunggahan.",
+       "config-brokenlibxml": "Sistem Anda memiliki kombinasi versi PHP dan libxml2 yang memiliki bug dan dapat menyebabkan kerusakan data tersembunyi pada MediaWiki dan aplikasi web lain.\nMutakhirkan ke PHP 5.2.9 atau yang lebih baru dan libxml2 2.7.3 atau yang lebih baru ([https://bugs.php.net/bug.php?id=45996 arsip bug di PHP]).\nInstalasi dibatalkan.",
+       "config-suhosin-max-value-length": "Suhosin terpasang dan membatasi parameter GET <code>length</code> sebesar $1 bita. Komponen ResourceLoader MediaWiki akan berjalan dalam batasan ini, tetapi penanganannya akan menurunkan kinerja. Jika memungkinkan, Anda sebaiknya menetapkan nilai <code>suhosin.get.max_value_length</code> menjadi 1024 atau lebih tinggi dalam <code>php.ini</code> dan menyetel <code>$wgResourceLoaderMaxQueryLength</code> dengan nilai yang sama dalam <code>LocalSettings.php</code>.",
        "config-db-type": "Jenis basis data:",
        "config-db-host": "Inang basis data:",
-       "config-db-host-help": "Jika server basis data Anda berada di server yang berbeda, masukkan nama inang atau alamat IP di sini.\n\nJika Anda menggunakan inang web bersama, penyedia inang Anda harus memberikan nama inang yang benar di dokumentasi mereka.\n\nJika Anda menginstal pada server Windows dan menggunakan MySQL, \"localhost\" mungkin tidak dapat digunakan sebagai nama server. Jika demikian, coba \"127.0.0.1\" untuk alamat IP lokal.",
+       "config-db-host-help": "Jika server basis data Anda berada di server yang berbeda, masukkan nama inang atau alamat IP di sini.\n\nJika Anda menggunakan inang web bersama, penyedia inang Anda harus memberikan nama inang yang benar di dokumentasi mereka.\n\nJika Anda menginstal pada server Windows dan menggunakan MySQL, \"localhost\" mungkin tidak dapat digunakan sebagai nama server. Jika demikian, coba \"127.0.0.1\" untuk alamat IP lokal.\n\nJika Anda menggunakan PostgreSQL, biarkan field ini kosong untuk menghubungkan lewat soket Unix.",
        "config-db-host-oracle": "TNS basis data:",
        "config-db-host-oracle-help": "Masukkan [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Local Connect Name] yang sah; berkas tnsnames.ora harus dapat diakses oleh instalasi ini.<br />Jika Anda menggunakan pustaka klien 10g atau lebih baru, Anda juga dapat menggunakan metode penamaan [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].",
        "config-db-wiki-settings": "Identifikasi wiki ini",
        "config-db-port": "Porta basis data:",
        "config-db-schema": "Skema untuk MediaWiki",
        "config-db-schema-help": "Skema ini biasanya berjalan baik.\nUbah hanya jika Anda tahu Anda perlu mengubahnya.",
+       "config-pg-test-error": "Tidak dapat terhubung ke basis data <strong>$1</strong>: $2",
        "config-sqlite-dir": "Direktori data SQLite:",
        "config-sqlite-dir-help": "SQLite menyimpan semua data dalam satu berkas.\n\nDirektori yang Anda berikan harus dapat ditulisi oleh server web selama instalasi.\n\nDirektori itu '''tidak''' boleh dapat diakses melalui web, inilah sebabnya kami tidak menempatkannya bersama dengan berkas PHP lain.\n\nPenginstal akan membuat berkas <code>.htaccess</code> bersamaan dengan itu, tetapi jika gagal, orang dapat memperoleh akses ke basis data mentah Anda.\nItu termasuk data mentah pengguna (alamat surel, hash sandi) serta revisi yang dihapus dan data lainnya yang dibatasi pada wiki.\n\nPertimbangkan untuk menempatkan basis data di tempat lain, misalnya di <code>/var/lib/mediawiki/yourwiki</code>.",
        "config-oracle-def-ts": "Tablespace bawaan:",
        "config-oracle-temp-ts": "Tablespace sementara:",
-       "config-type-mysql": "MySQL",
+       "config-type-mysql": "MySQL (atau yang kompatibel)",
        "config-type-postgres": "PostgreSQL",
        "config-type-sqlite": "SQLite",
        "config-type-oracle": "Oracle",
        "config-support-info": "MediaWiki mendukung sistem basis data berikut:\n\n$1\n\nJika Anda tidak melihat sistem basis data yang Anda gunakan tercantum di bawah ini, ikuti petunjuk terkait di atas untuk mengaktifkan dukungan.",
-       "config-dbsupport-mysql": "* $1 adalah target utama MediaWiki dan memiliki dukungan terbaik ([http://www.php.net/manual/en/mysql.installation.php cara mengompilasi PHP dengan dukungan MySQL])",
+       "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] adalah target utama MediaWiki dan memiliki dukungan terbaik. MediaWiki juga berjalan dengan [{{int:version-db-mariadb-url}} MariaDB] dan [{{int:version-db-percona-url}} Server Percona], yang kompatibel dengan MySQL. ([http://www.php.net/manual/en/mysql.installation.php Cara mengompilasi PHP dengan dukungan MySQL])",
        "config-dbsupport-postgres": "* $1 adalah sistem basis data sumber terbuka populer sebagai alternatif untuk MySQL ([http://www.php.net/manual/en/pgsql.installation.php cara mengompilasi PHP dengan dukungan PostgreSQL]). Mungkin ada beberapa bug terbuka dan alternatif ini tidak direkomendasikan untuk dipakai dalam lingkungan produksi.",
        "config-dbsupport-sqlite": "* $1 adalah sistem basis data yang ringan yang sangat baik dukungannya. ([http://www.php.net/manual/en/pdo.installation.php cara mengompilasi PHP dengan dukungan SQLite], menggunakan PDO)",
        "config-dbsupport-oracle": "* $1 adalah basis data komersial untuka perusahaan. ([http://www.php.net/manual/en/oci8.installation.php cara mengompilasi PHP dengan dukungan OCI8])",
        "config-header-postgres": "Pengaturan PostgreSQL",
        "config-header-sqlite": "Pengaturan SQLite",
        "config-header-oracle": "Pengaturan Oracle",
+       "config-header-mssql": "Setelan Microsoft SQL Server",
        "config-invalid-db-type": "Jenis basis data tidak sah",
        "config-missing-db-name": "Anda harus memasukkan nilai untuk \"Nama basis data\"",
        "config-missing-db-host": "Anda harus memasukkan nilai untuk \"Inang basis data\"",
        "config-db-sys-create-oracle": "Penginstal hanya mendukung penggunaan akun SYSDBA untuk membuat akun baru.",
        "config-db-sys-user-exists-oracle": "Akun pengguna \"$1\"sudah ada. SYSDBA hanya dapat digunakan untuk membuat akun baru!",
        "config-postgres-old": "PostgreSQL $1 atau versi terbaru diperlukan, Anda menggunakan $2.",
+       "config-mssql-old": "Microsoft SQL Server $1 atau yang lebih baru dibutuhkan. Anda memiliki versi $2.",
        "config-sqlite-name-help": "Pilih nama yang mengidentifikasi wiki Anda.\nJangan gunakan spasi atau tanda hubung.\nNama ini akan digunakan untuk nama berkas data SQLite.",
        "config-sqlite-parent-unwritable-group": "Tidak dapat membuat direktori data <code><nowiki>$1</nowiki></code>, karena direktori induk <code><nowiki>$2</nowiki></code> tidak bisa ditulisi oleh server web.\n\nPenginstal telah menentukan pengguna yang menjalankan server web Anda.\nBuat direktori <code><nowiki>$3</nowiki></code> menjadi dapat ditulisi olehnya.\nPada sistem Unix/Linux lakukan hal berikut:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
        "config-sqlite-parent-unwritable-nogroup": "Tidak dapat membuat direktori data <code><nowiki>$1</nowiki></code>, karena direktori induk <code><nowiki>$2</nowiki></code> tidak bisa ditulisi oleh server web.\n\nPenginstal tidak dapat menentukan pengguna yang menjalankan server web Anda.\nBuat direktori <code><nowiki>$3</nowiki></code> menjadi dapat ditulisi oleh semua orang.\nPada sistem Unix/Linux lakukan hal berikut:\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
        "config-mysql-engine": "Mesin penyimpanan:",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
+       "config-mysql-myisam-dep": "<strong>Peringatan:</strong> Anda telah memilih MyISAM sebagai mesin penyimpanan MySQL, yang tidak dianjurkan untuk digunakan dengan MediaWiki, karena:\n * nyaris tidak mendukung operasi bersamaan karena penguncian tabel\n * lebih rentan terhadap korupsi daripada mesin lain\n * basis kode MediaWiki tidak selalu menangani MyISAM sebagaimana mestinya\n\nJika instalasi MySQL Anda mendukung InnoDB, sangat disarankan bagi Anda memilih itu.\nJika instalasi MySQL tidak mendukung InnoDB, mungkin sudah waktunya untuk pemutakhiran.",
        "config-mysql-engine-help": "'''InnoDB''' hampir selalu merupakan pilihan terbaik karena memiliki dukungan konkurensi yang baik.\n\n'''MyISAM''' mungkin lebih cepat dalam instalasi pengguna-tunggal atau hanya-baca.\nBasis data MyISAM cenderung lebih sering rusak daripada basis data InnoDB.",
        "config-mysql-charset": "Set karakter basis data:",
        "config-mysql-binary": "Biner",
        "config-mysql-utf8": "UTF-8",
        "config-mysql-charset-help": "Dalam '''modus biner''', MediaWiki menyimpan teks UTF-8 untuk basis data dalam bidang biner.\nIni lebih efisien daripada modus UTF-8 MySQL dan memungkinkan Anda untuk menggunakan ragam penuh karakter Unicode.\n\nDalam '''modus UTF-8''', MySQL akan tahu apa set karakter data dan dapat menampilkan dan mengubahnya sesuai keperluan, tetapi tidak akan mengizinkan Anda menyimpan karakter di atas [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
+       "config-mssql-auth": "Jenis otentikasi:",
+       "config-mssql-install-auth": "Pilih jenis otentikasi yang akan digunakan untuk menyambung ke database selama proses instalasi.\nJika Anda memilih \"{{int:config-mssql-windowsauth}}\", kredensial dari pengguna apapun pada server web yang berjalan akan digunakan.",
+       "config-mssql-web-auth": "Pilih jenis otentikasi yang akan digunakan oleh server web untuk menyambung ke server basis data, selama operasi biasa dari wiki.\nJika Anda memilih \"{{int:config-mssql-windowsauth}}\", kredensial dari pengguna apapun pada server web yang berjalan akan digunakan.",
+       "config-mssql-windowsauth": "Otentikasi Windows",
        "config-site-name": "Nama wiki:",
        "config-site-name-help": "Ini akan muncul di bilah judul peramban dan di berbagai tempat lainnya.",
        "config-site-name-blank": "Masukkan nama situs.",
        "config-ns-invalid": "Ruang nama \"<nowiki>$1</nowiki>\" yang ditentukan tidak sah.\nBerikan ruang nama proyek lain.",
        "config-ns-conflict": "Ruang nama \"<nowiki>$1</nowiki>\" yang diberikan berkonflik dengan ruang nama bawaan MediaWiki.\nTentukan ruang nama proyek yang berbeda.",
        "config-admin-box": "Akun pengurus",
-       "config-admin-name": "Nama Anda:",
+       "config-admin-name": "Nama pengguna:",
        "config-admin-password": "Kata sandi:",
        "config-admin-password-confirm": "Kata sandi lagi:",
        "config-admin-help": "Masukkan nama pengguna pilihan Anda di sini, misalnya \"Udin Wiki\".\nIni adalah nama yang akan Anda gunakan untuk masuk ke wiki.",
        "config-admin-error-bademail": "Anda memasukkan alamat surel yang tidak sah",
        "config-subscribe": "Berlangganan ke [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce milis pengumuman rilis].",
        "config-subscribe-help": "Ini adalah milis bervolume rendah yang digunakan untuk pengumuman rilis, termasuk pengumuman keamanan penting.\nAnda sebaiknya berlangganan dan memperbarui instalasi MediaWiki saat versi baru keluar.",
+       "config-subscribe-noemail": "Anda mencoba untuk berlangganan milis pengumuman rilis tanpa menyediakan alamat email.\nHarap berikan alamat surel jika Anda ingin berlangganan ke milis.",
        "config-almost-done": "Anda hampir selesai!\nAnda sekarang dapat melewati sisa konfigurasi dan menginstal wiki sekarang.",
        "config-optional-continue": "Berikan saya pertanyaan lagi.",
        "config-optional-skip": "Saya sudah bosan, instal saja wikinya.",
        "config-profile": "Profil hak pengguna:",
-       "config-profile-wiki": "Wiki tradisional",
+       "config-profile-wiki": "Wiki terbuka",
        "config-profile-no-anon": "Pembuatan akun diperlukan",
        "config-profile-fishbowl": "Khusus penyunting terdaftar",
        "config-profile-private": "Wiki pribadi",
-       "config-profile-help": "Wiki paling baik bekerja jika Anda membiarkan sebanyak mungkin orang untuk menyunting. Dengan MediaWiki, sangat mudah meninjau perubahan terbaru dan mengembalikan kerusakan yang dilakukan oleh pengguna naif atau berbahaya.\n\nNamun, berbagai kegunaan lain dari MediaWiki telah ditemukan, dan kadang tidak mudah untuk meyakinkan semua orang manfaat dari cara wiki. Jadi, Anda yang menentukan.\n\n'''{{int:config-profile-wiki}}''' memungkinkan setiap orang untuk menyunting, bahkan tanpa masuk.\n'''{{int:config-profile-no-anon}}''' menyediakan akuntabilitas tambahan, tetapi dapat mencegah kontributor biasa.\n\n'''{{int:config-profile-fishbowl}}''' memungkinkan pengguna yang disetujui untuk menyunting, tetapi publik dapat melihat halaman, termasuk riwayatnya.\n'''{{int:config-profile-private}}''' hanya memungkinkan pengguna yang disetujui untuk melihat dan menyunting halaman.\n\nKonfigurasi hak pengguna yang lebih kompleks tersedia setelah instalasi. Lihat [//www.mediawiki.org/wiki/Manual:User_rights/id entri manual terkait].",
+       "config-profile-help": "Wiki paling baik bekerja jika Anda membiarkan sebanyak mungkin orang untuk menyunting. Dengan MediaWiki, sangat mudah meninjau perubahan terbaru dan mengembalikan kerusakan yang dilakukan oleh pengguna naif atau berbahaya.\n\nNamun, berbagai kegunaan lain dari MediaWiki telah ditemukan, dan kadang tidak mudah untuk meyakinkan semua orang manfaat dari cara wiki. Jadi, Anda yang menentukan.\n\n'''{{int:config-profile-wiki}}''' memungkinkan setiap orang untuk menyunting, bahkan tanpa masuk.\n'''{{int:config-profile-no-anon}}''' menyediakan akuntabilitas tambahan, tetapi dapat mencegah kontributor biasa.\n\n'''{{int:config-profile-fishbowl}}''' memungkinkan pengguna yang disetujui untuk menyunting, tetapi publik dapat melihat halaman, termasuk riwayatnya.\n'''{{int:config-profile-private}}''' hanya memungkinkan pengguna yang disetujui untuk melihat dan menyunting halaman.\n\nKonfigurasi hak pengguna yang lebih kompleks tersedia setelah instalasi. Lihat [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights/id entri manual terkait].",
        "config-license": "Hak cipta dan lisensi:",
        "config-license-none": "Tidak ada lisensi",
        "config-license-cc-by-sa": "Creative Commons Atribusi Berbagi Serupa",
        "config-email-sender-help": "Masukkan alamat surel untuk digunakan sebagai alamat pengirim pada surel keluar.\nAlamat ini akan menerima pentalan.\nBanyak server surel mensyaratkan paling tidak bagian nama domain yang sah.",
        "config-upload-settings": "Pengunggahan gambar dan berkas",
        "config-upload-enable": "Aktifkan pengunggahan berkas",
-       "config-upload-help": "Pengunggahan berkas berpotensi memaparkan server Anda dengan risiko keamanan.\nUntuk informasi lebih lanjut, baca [//www.mediawiki.org/wiki/Manual:Security/id manual keamanan].\n\nUntuk mengaktifkan pengunggahan berkas, ubah modus subdirektori <code>images</code> di bawah direktori akar MediaWiki agar server web dapat menulis ke sana.\nKemudian aktifkan opsi ini.",
+       "config-upload-help": "Pengunggahan berkas berpotensi memaparkan server Anda dengan risiko keamanan.\nUntuk informasi lebih lanjut, baca [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security/id manual keamanan].\n\nUntuk mengaktifkan pengunggahan berkas, ubah modus subdirektori <code>images</code> di bawah direktori akar MediaWiki agar server web dapat menulis ke sana.\nKemudian aktifkan opsi ini.",
        "config-upload-deleted": "Direktori untuk berkas terhapus:",
        "config-upload-deleted-help": "Pilih direktori tempat mengarsipkan berkas yang dihapus.\nIdealnya, direktori ini tidak boleh dapat diakses dari web.",
        "config-logo": "URL logo:",
-       "config-logo-help": "Kulit bawaan MediaWiki memberikan ruang untuk logo berukuran 135x160 piksel di atas menu bilah samping.\nUnggah gambar dengan ukuran yang sesuai, lalu masukkan URL di sini.\n\nJika Anda tidak ingin menyertakan logo, biarkan kotak ini kosong.",
+       "config-logo-help": "Kulit bawaan MediaWiki memberikan ruang untuk logo berukuran 135x160 piksel di atas menu bilah samping.\nUnggah gambar dengan ukuran yang sesuai, lalu masukkan URL di sini.\n\nAnda dapat menggunakan <code>$wgStylePath</code> atau <code>$wgScriptPath</code> jika logo Anda relatif terhadap jalur (path) ini.\n\nJika Anda tidak ingin menyertakan logo, biarkan kotak ini kosong.",
        "config-instantcommons": "Aktifkan Instant Commons",
-       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] adalah fitur yang memungkinkan wiki untuk menggunakan gambar, suara, dan media lain dari [//commons.wikimedia.org/ Wikimedia Commons].\nUntuk melakukannya, MediaWiki memerlukan akses ke Internet.\n\nUntuk informasi lebih lanjut tentang fitur ini, termasuk petunjuk tentang cara untuk mengatur untuk wiki selain Wikimedia Commons, baca [//mediawiki.org/wiki/Manual:$wgForeignFileRepos manual].",
+       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] adalah fitur yang memungkinkan wiki untuk menggunakan gambar, suara, dan media lain dari [//commons.wikimedia.org/ Wikimedia Commons].\nUntuk melakukannya, MediaWiki memerlukan akses ke Internet.\n\nUntuk informasi lebih lanjut tentang fitur ini, termasuk petunjuk tentang cara untuk mengatur untuk wiki selain Wikimedia Commons, baca [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos manual].",
        "config-cc-error": "Pemilih lisensi Creative Commons tidak memberikan hasil.\nMasukkan nama lisensi secara manual.",
        "config-cc-again": "Pilih lagi...",
        "config-cc-not-chosen": "Pilih lisensi Creative Commons yang Anda inginkan dan klik \"lanjutkan\".",
        "config-install-step-failed": "gagal",
        "config-install-extensions": "Termasuk ekstensi",
        "config-install-database": "Menyiapkan basis data",
+       "config-install-schema": "Membuat skema",
        "config-install-pg-schema-not-exist": "Skema PostgreSQL tidak tersedia.",
        "config-install-pg-schema-failed": "Pembuatan tabel gagal.\nPastikan bahwa pengguna \"$1\" dapat menulis ke skema \"$2\".",
        "config-install-pg-commit": "Melakukan perubahan",
        "config-install-user-alreadyexists": "Pengguna \"$1\" sudah ada",
        "config-install-user-create-failed": "Pembuatan pengguna \"$1\" gagal: $2",
        "config-install-user-grant-failed": "Memberikan izin untuk pengguna \"$1\" gagal: $2",
+       "config-install-user-missing": "Pengguna \"$1\" yang dimaksud tidak ditemukan.",
        "config-install-tables": "Membuat tabel",
        "config-install-tables-exist": "'''Peringatan''': Tabel MediaWiki sepertinya sudah ada.\nMelompati pembuatan.",
        "config-install-tables-failed": "'''Kesalahan''': Pembuatan tabel gagal dengan kesalahan berikut: $1",
        "config-insecure-keys": "'''Peringatan:''' {{PLURAL:$2|Suatu|Beberapa}} kunci aman ($1) yang dibuat selama instalasi {{PLURAL:$2|tidak|tidak}} benar-benar aman. Pertimbangkan untuk mengubah {{PLURAL:$2|kunci|kunci-kunci}} tersebut secara manual.",
        "config-install-sysop": "Membuat akun pengguna pengurus",
        "config-install-subscribe-fail": "Tidak dapat berlangganan mediawiki-announce: $1",
-       "config-install-subscribe-notpossible": "cURL tidak diinstal dan allow_url_fopen tidak tersedia.",
+       "config-install-subscribe-notpossible": "cURL tidak diinstal dan <code>allow_url_fopen</code> tidak tersedia.",
        "config-install-mainpage": "Membuat halaman utama dengan konten bawaan",
        "config-install-extension-tables": "Pembuatan tabel untuk ekstensi yang diaktifkan",
        "config-install-mainpage-failed": "Tidak dapat membuat halaman utama: $1",
        "config-help": "bantuan",
        "config-nofile": "Berkas \"$1\" tidak dapat ditemukan. Mungkin sudah dihapus?",
        "mainpagetext": "'''MediaWiki telah terpasang dengan sukses'''.",
-       "mainpagedocfooter": "Silakan baca [//www.mediawiki.org/wiki/Help:Contents/id Panduan Pengguna] untuk cara penggunaan perangkat lunak wiki ini.\n\n== Memulai penggunaan ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings/id Daftar pengaturan konfigurasi]\n* [//www.mediawiki.org/wiki/Manual:FAQ/id Daftar pertanyaan yang sering diajukan mengenai MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Milis rilis MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Terjemahkan MediaWiki ke bahasa Anda]"
+       "mainpagedocfooter": "Silakan baca [//www.mediawiki.org/wiki/Help:Contents Panduan Pengguna] untuk cara penggunaan perangkat lunak wiki ini.\n\n== Memulai penggunaan ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings/id Daftar pengaturan konfigurasi]\n* [//www.mediawiki.org/wiki/Manual:FAQ/id Daftar pertanyaan yang sering diajukan mengenai MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Milis rilis MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Terjemahkan MediaWiki ke bahasa Anda]"
 }
index a36d716..15385d2 100644 (file)
@@ -13,5 +13,5 @@
        "config-admin-password": "Okwúngáfè:",
        "config-admin-password-confirm": "Okwúngáfè mgbe ozor:",
        "mainpagetext": "'''MediaWiki a banyélé nke oma.'''",
-       "mainpagedocfooter": "Gbàkpó [//meta.wikimedia.org/wiki/Help:Contents Ǹdù Ọ'bànifé] màkà ụmá màkà Í jí ngwa nsónùsòrò bu wiki.\n\n== I bídó ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Ndétu ndósé ihe]\n* [//www.mediawiki.org/wiki/Manual:FAQ FAQ MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce wéfù ndétu nke ozi MediaWiki]"
+       "mainpagedocfooter": "Gbàkpó [//meta.wikimedia.org/wiki/Help:Contents Ǹdù Ọ'bànifé] màkà ụmá màkà Í jí ngwa nsónùsòrò bu wiki.\n\n== I bídó ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Ndétu ndósé ihe]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce wéfù ndétu nke ozi MediaWiki]"
 }
index 7fa1869..97c275c 100644 (file)
@@ -5,5 +5,5 @@
                ]
        },
        "mainpagetext": "'''MediaWiki instalesis sucese.'''",
-       "mainpagedocfooter": "Videz la [//meta.wikimedia.org/wiki/Help:Contents Guidilo por Uzanti] por informo pri uzar la wiki programo.\n\n== Komencar ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Listo di ''Configuration setting'']\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki OQQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki nova versioni posto-listo]"
+       "mainpagedocfooter": "Videz la [//meta.wikimedia.org/wiki/Help:Contents Guidilo por Uzanti] por informo pri uzar la wiki programo.\n\n== Komencar ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Listo di ''Configuration setting'']\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki OQQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki nova versioni posto-listo]"
 }
index 35aea1e..ce15eac 100644 (file)
@@ -1,5 +1,5 @@
 {
        "@metadata": [],
        "mainpagetext": "'''Uppsetning á MediaWiki heppnaðist.'''",
-       "mainpagedocfooter": "Ráðfærðu þig við [//meta.wikimedia.org/wiki/Help:Contents Notandahandbókina] fyrir frekari upplýsingar um notkun wiki-hugbúnaðarins.\n\n== Fyrir byrjendur ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Listi yfir uppsetningarstillingar]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki Algengar spurningar MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Póstlisti MediaWiki-útgáfa]"
+       "mainpagedocfooter": "Ráðfærðu þig við [//meta.wikimedia.org/wiki/Help:Contents Notandahandbókina] fyrir frekari upplýsingar um notkun wiki-hugbúnaðarins.\n\n== Fyrir byrjendur ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Listi yfir uppsetningarstillingar]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki Algengar spurningar MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Póstlisti MediaWiki-útgáfa]"
 }
index 0064dce..e0b9c11 100644 (file)
@@ -7,7 +7,10 @@
                        "Gianfranco",
                        "Karika",
                        "아라",
-                       "Lucas2"
+                       "Lucas2",
+                       "Ontsed",
+                       "Seb35",
+                       "Nemo bis"
                ]
        },
        "config-desc": "Il programma di installazione per MediaWiki",
@@ -55,8 +58,8 @@
        "config-env-php-toolow": "PHP $1 è installato.\nTuttavia, MediaWiki richiede PHP $2 o superiore.",
        "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/Unicode_normalization_considerations normalizzazione Unicode].",
-       "config-unicode-update-warning": "'''Attenzione:''' La versione installata del gestore per la normalizzazione Unicode usa una vecchia versione della libreria [http://site.icu-project.org/ del progetto ICU].\nDovresti [//www.mediawiki.org/wiki/Unicode_normalization_considerations aggiornare] se ti interessa usare l'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].",
+       "config-unicode-update-warning": "'''Attenzione:''' La versione installata del gestore per la normalizzazione Unicode usa una vecchia versione della libreria [http://site.icu-project.org/ del progetto ICU].\nDovresti [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations aggiornare] se ti interessa usare l'Unicode.",
        "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.",
@@ -87,6 +90,8 @@
        "config-no-cli-uri": "'''Attenzione''': <code>--scriptpath</code> non specificato, si utilizza il valore predefinito: <code>$1</code>.",
        "config-using-server": "Nome server in uso \"<nowiki>$1</nowiki>\".",
        "config-using-uri": "URL del server in uso \"<nowiki>$1$2</nowiki>\".",
+       "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-db-type": "Tipo di database:",
        "config-db-host": "Host del database:",
        "config-db-username": "Nome utente del database:",
        "config-db-password": "Password del database:",
        "config-db-password-empty": "Inserire una password per il nuovo utente del database: $1.\nAnche se può essere possibile creare utenti senza password, questo non è sicuro.",
-       "config-db-username-empty": "È necessario immettere un valore per \"Nome utente del database\"",
+       "config-db-username-empty": "È necessario immettere un valore per \"{{int:config-db-username}}\"",
        "config-db-install-username": "Inserisci il nome utente che verrà utilizzato per connettersi al database durante il processo di installazione.\nQuesto non è il nome utente dell'account MediaWiki; ma quello per il tuo database.",
        "config-db-install-password": "Inserisci la password che verrà utilizzato per connettersi al database durante il processo di installazione.\nQuesta non è la password dell'account MediaWiki; ma quella per il tuo database.",
        "config-db-install-help": "Inserire il nome utente e la password che verranno usate per la connessione al database durante il processo d'installazione.",
        "config-db-schema-help": "Questo schema in genere andrà bene.\nDa cambiare solamente se si è sicuri di averne bisogno.",
        "config-pg-test-error": "Impossibile connettersi al database '''$1''': $2",
        "config-sqlite-dir": "Directory data di SQLite:",
-       "config-sqlite-dir-help": "SQLite memorizza tutti i dati in un unico file.\n\nLa directory che indicherai deve essere scrivibile dal server web durante l'installazione.\n\nDovrebbe essere <strong>non accessibile via web</strong>, è per questo che non la stiamo mettendo dove ci sono i file PHP.\n\nL'installatore scriverà insieme ad essa un file <code>.htaccess</code>, ma se il tentativo fallisse qualcuno potrebbe avere accesso al database grezzo.\nQuesto include dati utente grezzi (indirizzi, password cifrate) così come revisioni eliminate e altri dati ad accesso limitato del wiki.\n\nConsidera l'opportunità di sistemare allo stesso tempo il database da qualche altra parte, per esempio in <code>/var/lib/mediawiki/tuowiki</code>.",
+       "config-sqlite-dir-help": "SQLite memorizza tutti i dati in un unico file.\n\nLa directory che indicherai deve essere scrivibile dal server web durante l'installazione.\n\nDovrebbe essere <strong>non accessibile via web</strong>, è per questo che non la stiamo mettendo dove ci sono i file PHP.\n\nL'installatore scriverà insieme ad essa un file <code>.htaccess</code>, ma se il tentativo fallisse qualcuno potrebbe avere accesso al database grezzo.\nQuesto include dati utente grezzi (indirizzi, password cifrate) così come versioni eliminate e altri dati ad accesso limitato del wiki.\n\nConsidera l'opportunità di sistemare allo stesso tempo il database da qualche altra parte, per esempio in <code>/var/lib/mediawiki/tuowiki</code>.",
        "config-oracle-def-ts": "Tablespace di default:",
        "config-oracle-temp-ts": "Tablespace temporaneo:",
        "config-type-mysql": "MySQL (o compatibile)",
        "config-header-oracle": "Impostazioni Oracle",
        "config-header-mssql": "Impostazioni di Microsoft SQL Server",
        "config-invalid-db-type": "Tipo di database non valido",
-       "config-missing-db-name": "È necessario immettere un valore per \"Nome del database\"",
-       "config-missing-db-host": "È necessario immettere un valore per \"Host del database\"",
-       "config-missing-db-server-oracle": "È necessario immettere un valore per \"TNS del database\"",
+       "config-missing-db-name": "È necessario immettere un valore per \"{{int:config-db-name}}\".",
+       "config-missing-db-host": "È necessario immettere un valore per \"{{int:config-db-host}}\".",
+       "config-missing-db-server-oracle": "È necessario immettere un valore per \"{{int:config-db-host-oracle}}\".",
+       "config-invalid-db-server-oracle": "TNS database \"$1\" non valido.\nUsa \"TNS Name\" o una stringa \"Easy Connect\" ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle Naming Methods]).",
        "config-invalid-db-name": "Nome di database \"$1\" non valido.\nUtilizza soltanto caratteri ASCII come lettere (a-z, A-Z), numeri (0-9), sottolineatura (_) e trattini (-).",
        "config-invalid-db-prefix": "Prefisso database \"$1\" non valido.\nUtilizza soltanto caratteri ASCII come lettere (a-z, A-Z), numeri (0-9), sottolineatura (_) e trattini (-).",
        "config-connection-error": "$1.\n\nControlla host, nome utente e password e prova ancora.",
        "config-install-user-create-failed": "Creazione dell'utente \"$1\" non riuscita: $2",
        "config-install-user-grant-failed": "Errore durante la concessione delle autorizzazione all'utente \"$1\": $2",
        "config-install-user-missing": "L'utente indicato \"$1\" non esiste.",
+       "config-install-user-missing-create": "L'utente indicato \"$1\" non esiste.\nSeleziona la casella \"crea utenza\" qui sotto se vuoi crearla.",
        "config-install-tables": "Creazione tabelle",
        "config-install-tables-exist": "'''Attenzione:''' sembra che le tabelle di MediaWiki esistono già.\nSalto la creazione.",
        "config-install-tables-failed": "'''Errore''': La creazione della tabella non è riuscita: $1",
        "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-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 allow_url_fopen non è disponibile.",
+       "config-install-subscribe-notpossible": "cURL non è installato e <code>allow_url_fopen</code> non è disponibile.",
        "config-install-mainpage": "Creazione della pagina principale con contenuto predefinito",
        "config-install-extension-tables": "Creazione delle tabelle per le estensioni attivate",
        "config-install-mainpage-failed": "Impossibile inserire la pagina principale: $1",
+       "config-install-done": "<strong>Complimenti!</strong>\nHai installato correttamente MediaWiki.\n\nIl programma di installazione ha generato un file <code>LocalSettings.php</code> che contiene tutte le impostazioni.\n\nDevi scaricarlo ed inserirlo nella directory base del tuo wiki (la stessa dove è presente index.php). Il download dovrebbe partire automaticamente.\n\nSe il download non si avvia, o se è stato annullato, puoi riavviarlo cliccando sul collegamento di seguito:\n\n$3\n\n<strong>Nota:</strong> se esci ora dall'installazione senza scaricare il file di configurazione che è stato generato, questo poi non sarà più disponibile in seguito.\n\nQuando hai fatto, puoi <strong>[$2 entrare nel tuo wiki]</strong>.",
        "config-download-localsettings": "Scarica <code>LocalSettings.php</code>",
        "config-help": "aiuto",
        "config-nofile": "Il file \"$1\" non può essere trovato. È stato eliminato?",
+       "config-extension-link": "Sapevi che il tuo wiki supporta le  [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions estensioni]?\n\nPuoi navigare tra le [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category estensioni per categoria].",
        "mainpagetext": "'''Installazione di MediaWiki completata correttamente.'''",
-       "mainpagedocfooter": "Consultare la [//meta.wikimedia.org/wiki/Aiuto:Sommario Guida utente] per maggiori informazioni sull'uso di questo software wiki.\n\n== Per iniziare ==\nI seguenti collegamenti sono in lingua inglese:\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Impostazioni di configurazione]\n* [//www.mediawiki.org/wiki/Manual:FAQ Domande frequenti su MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list annunci MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Localizza MediaWiki nella tua lingua]"
+       "mainpagedocfooter": "Consulta la [//meta.wikimedia.org/wiki/Special:MyLanguage/Help:Contents Guida utente] per maggiori informazioni sull'uso di questo software wiki.\n\n== Per iniziare ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Impostazioni di configurazione]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Domande frequenti su MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list annunci MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localizza MediaWiki nella tua lingua]"
 }
index 0275547..02ff624 100644 (file)
        "config-restart": "はい、再起動します",
        "config-welcome": "=== 環境の確認 ===\n基本的な確認では、現在の環境が MediaWiki のインストールに適しているかを確認します。\nインストール方法について助けが必要になった場合は、必ずこの確認結果を添えてください。",
        "config-copyright": "=== 著作権および規約 ===\n$1\n\nこの作品はフリーソフトウェアです。あなたは、フリーソフトウェア財団の発行する GNU 一般公衆利用許諾書 (GNU General Public License) (バージョン 2、またはそれ以降のライセンス) の規約に基づき、このライブラリを再配布および改変できます。\n\nこの作品は、有用であることを期待して配布されていますが、<strong>商用または特定の目的に適するかどうか</strong>も含めて、暗黙的にも、<strong>一切保証されません</strong>。\n詳しくは、 GNU 一般公衆利用許諾書をご覧ください。\n\nあなたはこのプログラムと共に、<doclink href=Copying>GNU 一般公衆利用許諾契約書の複製</doclink>を受け取ったはずです。受け取っていない場合は、フリーソフトウェア財団 (宛先は the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA) まで請求するか、または[http://www.gnu.org/copyleft/gpl.html オンラインでお読みください]。",
-       "config-sidebar": "* [//www.mediawiki.org MediaWikiのホーム]\n* [//www.mediawiki.org/wiki/Help:Contents 利用者向け案内]\n* [//www.mediawiki.org/wiki/Manual:Contents 管理者向け案内]\n* [//www.mediawiki.org/wiki/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-sidebar": "* [//www.mediawiki.org MediaWikiのホーム]\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": "環境を確認しました。\nMediaWiki をインストールできます。",
        "config-env-bad": "環境を確認しました。\nMediaWiki のインストールはできません。",
        "config-env-php": "PHP $1がインストールされています。",
        "config-env-php-toolow": "PHP $1 がインストールされています。\nしかし、MediaWikiには PHP $2 以上が必要です。",
        "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/Unicode_normalization_considerations Unicode 正規化]をお読みください。",
-       "config-unicode-update-warning": "<strong>警告:</strong> インストールされているバージョンの Unicode 正規化ラッパーは、[http://site.icu-project.org/ ICU プロジェクト]のライブラリの古いバージョンを使用しています。\nUnicode を少しでも利用する可能性がある場合は、[//www.mediawiki.org/wiki/Unicode_normalization_considerations アップグレード]してください。",
+       "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-unicode-update-warning": "<strong>警告:</strong> インストールされているバージョンの Unicode 正規化ラッパーは、[http://site.icu-project.org/ ICU プロジェクト]のライブラリの古いバージョンを使用しています。\nUnicode を少しでも利用する可能性がある場合は、[//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations アップグレード]してください。",
        "config-no-db": "適切なデータベース ドライバーが見つかりませんでした! PHP にデータベース ドライバーをインストールする必要があります。\n以下の種類のデータベースに対応しています: $1\n\nPHP を自分でコンパイルした場合は、例えば <code>./configure --with-mysqli</code> を実行して、データベース クライアントを使用できるように再設定してください。\nDebian または Ubuntu のパッケージから PHP をインストールした場合は、モジュール (例: <code>php5-mysql</code>) もインストールする必要があります。",
        "config-outdated-sqlite": "<strong>警告:</strong> あなたは SQLite $1 を使用していますが、最低限必要なバージョン $2 より古いバージョンです。SQLite は利用できません。",
        "config-no-fts3": "<strong>警告:</strong> SQLite は [//sqlite.org/fts3.html FTS3] モジュールなしでコンパイルされており、このバックエンドでは検索機能は利用できなくなります。",
@@ -91,7 +91,7 @@
        "config-no-cli-uri": "<strong>警告:</strong> <code>--scriptpath</code> が指定されていないため、既定値 <code>$1</code> を使用します。",
        "config-using-server": "サーバー名「<nowiki>$1</nowiki>」を使用しています。",
        "config-using-uri": "サーバー URL「<nowiki>$1$2</nowiki>」を使用しています。",
-       "config-uploads-not-safe": "<strong>警告:</strong> アップロードの既定ディレクトリ <code>$1</code> に、任意のスクリプト実行に関する脆弱性があります。\nMediaWiki はアップロードされたファイルのセキュリティ上の脅威を確認しますが、アップロードを有効化する前に、[//www.mediawiki.org/wiki/Manual:Security#Upload_security このセキュリティ上の脆弱性を解決する]ことを強く推奨します。",
+       "config-uploads-not-safe": "<strong>警告:</strong> アップロードの既定ディレクトリ <code>$1</code> に、任意のスクリプト実行に関する脆弱性があります。\nMediaWiki はアップロードされたファイルのセキュリティ上の脅威を確認しますが、アップロードを有効化する前に、[//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security このセキュリティ上の脆弱性を解決する]ことを強く推奨します。",
        "config-brokenlibxml": "このシステムで使われているPHPとlibxml2のバージョンのこの組み合わせにはバグがあります。具体的には、MediaWikiやその他のウェブアプリケーションでhiddenデータが破損する可能性があります。\nlibxml2を2.7.3以降のバージョンにアップグレードしてください([//bugs.php.net/bug.php?id=45996 PHPでのバグ情報])。\nインストールを終了します。",
        "config-suhosin-max-value-length": "Suhosin がインストールされており、GET パラメーターの <code>length</code> を $1 バイトに制限しています。\nMediaWiki の 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-username": "データベースのユーザー名:",
        "config-db-password": "データベースのパスワード:",
        "config-db-password-empty": "新しいデータベースの利用者名 $1 のパスワードを入力してください。\nパスワードを設定せずにユーザーを作成できる場合もありますが、安全ではありません。",
-       "config-db-username-empty": "「{{int:config-db-username}}」を入力してください",
+       "config-db-username-empty": "「{{int:config-db-username}}」を入力してください",
        "config-db-install-username": "インストール中にデータベースへの接続で使用するユーザー名を入力してください。\nこれは MediaWiki アカウントの利用者名のことではありません。あなたのデータベースでのユーザー名です。",
        "config-db-install-password": "インストール中にデータベースへの接続で使用するパスワードを入力してください。\nこれは MediaWiki アカウントのパスワードのことではありません。あなたのデータベースでのパスワードです。",
        "config-db-install-help": "インストール作業中にデータベースに接続するための利用者名とパスワードを入力してください。",
        "config-sqlite-connection-error": "$1。\n\nデータ ディレクトリおよびデータベース名を確認してから、再度試してください。",
        "config-sqlite-readonly": "ファイル <code>$1</code> に書き込めません。",
        "config-sqlite-cant-create-db": "データベース ファイル <code>$1</code> を作成できませんでした。",
-       "config-sqlite-fts3-downgrade": "PHP が FTS3 に対応していないため、テーブルをダウングレードしています",
+       "config-sqlite-fts3-downgrade": "PHP が FTS3 に対応していないため、テーブルをダウングレードしています",
        "config-can-upgrade": "このデータベースには MediaWiki テーブルがあります。\nこれらのテーブルを MediaWiki $1 にアップグレードするには、<strong>続行</strong>をクリックしてください。",
        "config-upgrade-done": "更新は完了しました。\n\n[$1 ウィキを使い始める]ことができます。\n\n<code>LocalSettings.php</code> ファイルを再生成したい場合は、下のボタンを押してください。\nウィキに問題がある場合を除き、再生成は<strong>推奨されません</strong>。",
        "config-upgrade-done-no-regenerate": "アップグレードが完了しました。\n\n[$1 ウィキの使用を開始]することができます。",
        "config-profile-no-anon": "アカウントの作成が必要",
        "config-profile-fishbowl": "承認された編集者のみ",
        "config-profile-private": "非公開ウィキ",
-       "config-profile-help": "ウィキは、できるだけ多くの人が編集できるようにすると最も優れた働きをします。\nMediaWikiでは、最近の更新を確認しやすく、神経質な、または悪意を持った利用者からの損害を簡単に差し戻せます。\n\nしかし一方で、MediaWikiは、さらにさまざまな形態での利用も優れていると言われています。また、時には、すべての人にウィキ手法の利点を説得させるのは容易ではないかもしれません。\nそこで、選択肢があります。\n\n「<strong>{{int:config-profile-wiki}}</strong>」モデルでは、ログインしなくても、誰でも編集できます。\n「<strong>{{int:config-profile-no-anon}}</strong>」なウィキでは、各編集に対してより強い説明責任を付与しますが、気軽な投稿を阻害するかもしれません。\n\n「<strong>{{int:config-profile-fishbowl}}</strong>」シナリオでは、承認された利用者のみが編集でき、一般の人はページ (とその履歴) を閲覧できます。\n「<strong>{{int:config-profile-private}}</strong>」では、承認された利用者のみがページを閲覧でき、そのグループが編集できます。\n\nより複雑な利用者権限の設定は、インストール後に設定できます。詳細は[//www.mediawiki.org/wiki/Manual:User_rights 関連するマニュアル]をご覧ください。",
+       "config-profile-help": "ウィキは、できるだけ多くの人が編集できるようにすると最も優れた働きをします。\nMediaWikiでは、最近の更新を確認しやすく、神経質な、または悪意を持った利用者からの損害を簡単に差し戻せます。\n\nしかし一方で、MediaWikiは、さらにさまざまな形態での利用も優れていると言われています。また、時には、すべての人にウィキ手法の利点を説得させるのは容易ではないかもしれません。\nそこで、選択肢があります。\n\n「<strong>{{int:config-profile-wiki}}</strong>」モデルでは、ログインしなくても、誰でも編集できます。\n「<strong>{{int:config-profile-no-anon}}</strong>」なウィキでは、各編集に対してより強い説明責任を付与しますが、気軽な投稿を阻害するかもしれません。\n\n「<strong>{{int:config-profile-fishbowl}}</strong>」シナリオでは、承認された利用者のみが編集でき、一般の人はページ (とその履歴) を閲覧できます。\n「<strong>{{int:config-profile-private}}</strong>」では、承認された利用者のみがページを閲覧でき、そのグループが編集できます。\n\nより複雑な利用者権限の設定は、インストール後に設定できます。詳細は[//www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights 関連するマニュアル]をご覧ください。",
        "config-license": "著作権とライセンス:",
        "config-license-none": "ライセンスのフッターを付けない",
        "config-license-cc-by-sa": "クリエイティブ・コモンズ 表示-継承",
        "config-email-sender-help": "送信メールで返信先として使用するメールアドレスを入力してください。\nこのアドレスは、宛先不明の場合の通知の宛先になります。\n多くのメールサーバーでは、少なくともドメイン名部分は有効である必要があります。",
        "config-upload-settings": "画像およびファイルのアップロード",
        "config-upload-enable": "ファイルのアップロードを有効にする",
-       "config-upload-help": "ファイルのアップロードは、あなたのサーバーをセキュリティ上の潜在的な危険に晒します。\nこの詳細は、マニュアルの [//www.mediawiki.org/wiki/Manual:Security security section] をお読みください。\n\nファイルのアップロードを有効にするには、MediaWiki のルート ディレクトリ内の <code>images</code> サブ ディレクトリのモードを変更します。これにより、ウェブ サーバーがそこに書き込めるようになります。\nそして、このオプションを有効にしてください。",
+       "config-upload-help": "ファイルのアップロードは、あなたのサーバーをセキュリティ上の潜在的な危険に晒します。\nこの詳細は、マニュアルの [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security security section] をお読みください。\n\nファイルのアップロードを有効にするには、MediaWiki のルート ディレクトリ内の <code>images</code> サブ ディレクトリのモードを変更します。これにより、ウェブ サーバーがそこに書き込めるようになります。\nそして、このオプションを有効にしてください。",
        "config-upload-deleted": "削除されたファイルのためのディレクトリ:",
        "config-upload-deleted-help": "削除されるファイルを保存するためのディレクトリを選択してください。\nこれがウェブからアクセスできないことが理想です。",
        "config-logo": "ロゴ のURL:",
        "config-logo-help": "MediaWiki の既定の外装では、サイドバー上部に135x160ピクセルのロゴ用の余白があります。\n適切なサイズの画像をアップロードして、その URL をここに入力してください。\n\nロゴが相対パスの場合は、<code>$wgStylePath</code> や <code>$wgScriptPath</code> を使用できます。\n\nロゴが不要の場合は、この欄を空白のままにしてください。",
        "config-instantcommons": "Instant Commons 機能を有効にする",
-       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] は、[//commons.wikimedia.org/ ウィキメディア・コモンズ]のサイトにある画像、音声、その他のメディアをウィキ上で利用できるようにする機能です。\nこれを使用するには、MediaWiki がインターネットに接続できる必要があります。\n\nウィキメディア・コモンズ以外のウィキを同様に設定する手順など、この機能に関する詳細な情報は、[//mediawiki.org/wiki/Manual:$wgForeignFileRepos マニュアル]をご覧ください。",
+       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] は、[//commons.wikimedia.org/ ウィキメディア・コモンズ]のサイトにある画像、音声、その他のメディアをウィキ上で利用できるようにする機能です。\nこれを使用するには、MediaWiki がインターネットに接続できる必要があります。\n\nウィキメディア・コモンズ以外のウィキを同様に設定する手順など、この機能に関する詳細な情報は、[//www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos マニュアル]をご覧ください。",
        "config-cc-error": "クリエイティブ・コモンズ・ライセンスの選択器から結果が得られませんでした。\nライセンスの名前を手動で入力してください。",
        "config-cc-again": "もう一度選択してください...",
        "config-cc-not-chosen": "希望するクリエイティブ・コモンズのライセンスを選択して、「続行」をクリックしてください。",
        "config-install-stats": "統計情報の初期化",
        "config-install-keys": "秘密鍵の生成",
        "config-install-sysop": "管理者のアカウントの作成",
+       "config-install-subscribe-notpossible": "cURL がインストールされていないため、<code>allow_url_fopen</code> を利用できません。",
        "config-install-mainpage": "メインページを既定の内容で作成",
        "config-install-mainpage-failed": "メインページを挿入できませんでした: $1",
        "config-install-done": "<strong>おめでとうございます!</strong>\nMediaWikiのインストールに成功しました。\n\n<code>LocalSettings.php</code>ファイルが生成されました。\nこのファイルはすべての設定を含んでいます。\n\nこれをダウンロードして、ウィキをインストールした基準ディレクトリ (index.phpと同じディレクトリ) に設置する必要があります。ダウンロードは自動的に開始されるはずです。\n\nダウンロードが開始されていない場合、またはダウンロードをキャンセルした場合は、下記のリンクをクリックしてダウンロードを再開できます:\n\n$3\n\n<strong>注意:</strong> この生成された設定ファイルをダウンロードせずにインストールを終了すると、このファイルは利用できなくなります。\n\n上記の作業が完了すると、<strong>[$2 ウィキに入る]</strong>ことができます。",
        "config-download-localsettings": "<code>LocalSettings.php</code> をダウンロード",
        "config-help": "ヘルプ",
+       "config-help-tooltip": "クリックで展開",
        "config-nofile": "ファイル「$1」が見つかりませんでした。削除された可能性があります。",
        "mainpagetext": "<strong>MediaWiki のインストールに成功しました。</strong>",
-       "mainpagedocfooter": "ウィキソフトウェアの使い方に関する情報は[//meta.wikimedia.org/wiki/Help:Contents 利用者案内]を参照してください。\n\n== はじめましょう ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings/ja 設定の一覧]\n* [//www.mediawiki.org/wiki/Manual:FAQ/ja MediaWiki よくある質問と回答]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki リリース情報メーリングリスト]\n* [//www.mediawiki.org/wiki/Localisation/ja MediaWiki のあなたの言語へのローカライズ]"
+       "mainpagedocfooter": "ウィキソフトウェアの使い方に関する情報は[//meta.wikimedia.org/wiki/Help:Contents 利用者案内]を参照してください。\n\n== はじめましょう ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings/ja 設定の一覧]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/ja MediaWiki よくある質問と回答]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki リリース情報メーリングリスト]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation/ja MediaWiki のあなたの言語へのローカライズ]"
 }
index a57ece1..c885092 100644 (file)
@@ -5,5 +5,5 @@
                ]
        },
        "mainpagetext": "'''MediaWiki don instaal soksesful.'''",
-       "mainpagedocfooter": "Kansolt di [//meta.wikimedia.org/wiki/Help:Contents User's Guide] fi infamieshan ou fi yuuz di wiki saafwier.\n\n== Taatop ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]"
+       "mainpagedocfooter": "Kansolt di [//meta.wikimedia.org/wiki/Help:Contents User's Guide] fi infamieshan ou fi yuuz di wiki saafwier.\n\n== Taatop ==\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 0625064..4f53087 100644 (file)
@@ -1,5 +1,5 @@
 {
        "@metadata": [],
        "mainpagetext": "'''Prangkat empuk wiki wis suksès dipasang.'''",
-       "mainpagedocfooter": "Mangga maca [//meta.wikimedia.org/wiki/Help:Contents User's Guide] kanggo katrangan luwih langkung prakara panggunan prangkat empuk wiki\n== Miwiti panggunan  ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Daftar pangaturan préférènsi]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Milis rilis MediaWiki]"
+       "mainpagedocfooter": "Mangga maca [//meta.wikimedia.org/wiki/Help:Contents User's Guide] kanggo katrangan luwih langkung prakara panggunan prangkat empuk wiki\n== Miwiti panggunan  ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Daftar pangaturan préférènsi]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Milis rilis MediaWiki]"
 }
index 017f439..08d4462 100644 (file)
@@ -22,7 +22,7 @@
        "config-page-copying": "ლიცენზია",
        "config-page-upgradedoc": "განახლება",
        "config-restart": "დიახ, თავიდან დაიწყეთ",
-       "config-sidebar": "* [//www.mediawiki.org მედიავიკის ვებ-გვერდი]\n* [//www.mediawiki.org/wiki/Help:Contents/ka მომხმარებლების დახმარება]\n* [//www.mediawiki.org/wiki/Manual:Contents/ka ადმინისტრატორების დახმარება]\n* [//www.mediawiki.org/wiki/Manual:FAQ/ka FAQ]\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 მედიავიკის ვებ-გვერდი]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents/ka მომხმარებლების დახმარება]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents/ka ადმინისტრატორების დახმარება]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/ka FAQ]\n----\n* <doclink href=Readme>წამიკითხე</doclink>\n* <doclink href=ReleaseNotes>ინფორმაცია გამოშვებაზე</doclink>\n* <doclink href=Copying>ლიცენზია</doclink>\n* <doclink href=UpgradeDoc>განახლება</doclink>",
        "config-db-type": "მონაცემთა ბაზის ტიპი:",
        "config-db-host-oracle": "მონაცემთა ბაზის TNS:",
        "config-db-name": "მონაცემთა ბაზის სახელი:",
@@ -78,5 +78,5 @@
        "config-download-localsettings": "<code>LocalSettings.php</code>-ის გადმოწერა",
        "config-help": "დახმარება",
        "mainpagetext": "'''მედიავიკი წარმატებით ჩაიტვირთა.'''",
-       "mainpagedocfooter": "ვიკი პროგრამის გამოყენების ინფორმაციისთვის იხილეთ [//meta.wikimedia.org/wiki/Help:Contents მომხმარებლის მეგზური].\n\n== დაწყება ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings კონფიგურაციის მაჩვენებლების სია]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce მედიავიკის გამოცემის დაგზავნის სია]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources მედიავიკის ლოკალიზება თქვენ ენაზე]"
+       "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 FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce მედიავიკის გამოცემის დაგზავნის სია]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources მედიავიკის ლოკალიზება თქვენ ენაზე]"
 }
index 3bda7bf..a2052c2 100644 (file)
@@ -1,5 +1,5 @@
 {
        "@metadata": [],
        "mainpagetext": "'''MediaWiki tabıslı ornatıldı.'''",
-       "mainpagedocfooter": "Wiki bag'darlamasın qollanıw haqqındag'i mag'lıwmat usın [//meta.wikimedia.org/wiki/Help:Contents Paydalanıwshılar qollanbasınan] ken'es alın'.\n\n== Baslaw ushın ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Konfiguratsiya sazlaw dizimi]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWikidin' Ko'p Soralatug'ın Sorawları]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki haqqında xat tarqatıw dizimi]"
+       "mainpagedocfooter": "Wiki bag'darlamasın qollanıw haqqındag'i mag'lıwmat usın [//meta.wikimedia.org/wiki/Help:Contents Paydalanıwshılar qollanbasınan] ken'es alın'.\n\n== Baslaw ushın ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Konfiguratsiya sazlaw dizimi]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWikidin' Ko'p Soralatug'ın Sorawları]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki haqqında xat tarqatıw dizimi]"
 }
index 1529aa0..b08674f 100644 (file)
@@ -1,9 +1,10 @@
 {
        "@metadata": {
                "authors": [
-                       "Bogups"
+                       "Bogups",
+                       "Seb35"
                ]
        },
        "mainpagetext": "'''«MediaWiki» узыншу хэгъува.'''",
-       "mainpagedocfooter": "Мы виким и лэжьыгъэ хъыбархэр здэбгъуэтыфынур [//meta.wikimedia.org/wiki/%D0%9F%D0%BE%D0%BC%D0%BE%D1%89%D1%8C:%D0%A1%D0%BE%D0%B4%D0%B5%D1%80%D0%B6%D0%B0%D0%BD%D0%B8%D0%B5 дэӀэпыкъуэгъу тхылъым].\n\n\n== Къыщхьэпэгъуэ хъуфынухэр ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Зэгъэзэхуэгъуэ гуэрэхэм я тхылъ];\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki-м упщӀэ нахъыбу ятхэмрэ я жэуапхэмрэ];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-м и версиэ щӀэуэ къэжахэм я къэӀохугъуэ]."
+       "mainpagedocfooter": "Мы виким и лэжьыгъэ хъыбархэр здэбгъуэтыфынур [//meta.wikimedia.org/wiki/Help:Contents/ru дэӀэпыкъуэгъу тхылъым].\n\n== Къыщхьэпэгъуэ хъуфынухэр ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Зэгъэзэхуэгъуэ гуэрэхэм я тхылъ];\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki-м упщӀэ нахъыбу ятхэмрэ я жэуапхэмрэ];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-м и версиэ щӀэуэ къэжахэм я къэӀохугъуэ].\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]"
 }
index 9d3f143..f322db5 100644 (file)
@@ -5,5 +5,5 @@
                ]
        },
        "mainpagetext": "'''MediaWiki fist ra ser, vıraziya.'''",
-       "mainpagedocfooter": "Serba melumatê gurenaena ''wiki software''i [//meta.wikimedia.org/wiki/Help:Contents İdarê karberi] de mıracaet ke.\n\n== Gamê verêni ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista ayarunê vırastene]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki de ÇZP]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki ra lista serbest-daena postey]"
+       "mainpagedocfooter": "Serba melumatê gurenaena ''wiki software''i [//meta.wikimedia.org/wiki/Help:Contents İdarê karberi] de mıracaet ke.\n\n== Gamê verêni ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista ayarunê vırastene]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki de ÇZP]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki ra lista serbest-daena postey]"
 }
index 5f81bbd..15cb54a 100644 (file)
@@ -1,5 +1,5 @@
 {
        "@metadata": [],
        "mainpagetext": "'''مەدىياۋىيكىي بۋماسى ٴساتتى ورناتىلدى.'''",
-       "mainpagedocfooter": "ۋىيكىي باعدارلامالىق جاساقتاماسىن قالاي قولداناتىن اقپاراتى ٴۇشىن [//meta.wikimedia.org/wiki/Help:Contents پايدالانۋشىلىق نۇسقاۋلارىنان] كەڭەس الىڭىز.\n\n== باستاۋ ٴۇشىن ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings باپتالىم قالاۋلارىنىڭ ٴتىزىمى]\n* [//www.mediawiki.org/wiki/Manual:FAQ مەدىياۋىيكىيدىڭ جىيى قويىلعان ساۋالدارى]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce مەدىياۋىيكىي شىعۋ تۋرالى حات تاراتۋ ٴتىزىمى]"
+       "mainpagedocfooter": "ۋىيكىي باعدارلامالىق جاساقتاماسىن قالاي قولداناتىن اقپاراتى ٴۇشىن [//meta.wikimedia.org/wiki/Help:Contents پايدالانۋشىلىق نۇسقاۋلارىنان] كەڭەس الىڭىز.\n\n== باستاۋ ٴۇشىن ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings باپتالىم قالاۋلارىنىڭ ٴتىزىمى]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ مەدىياۋىيكىيدىڭ جىيى قويىلعان ساۋالدارى]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce مەدىياۋىيكىي شىعۋ تۋرالى حات تاراتۋ ٴتىزىمى]"
 }
index 92849d7..08ff57f 100644 (file)
@@ -1,5 +1,5 @@
 {
        "@metadata": [],
        "mainpagetext": "'''МедиаУики бумасы сәтті орнатылды.'''",
-       "mainpagedocfooter": "Уики бағдарламалық жасақтамасын қалай қолданатын ақпараты үшін [//meta.wikimedia.org/wiki/Help:Contents Пайдаланушылық нұсқауларынан] кеңес алыңыз.\n\n== Бастау үшін ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Бапталым қалауларының тізімі]\n* [//www.mediawiki.org/wiki/Manual:FAQ МедиаУикидің Жиы Қойылған Сауалдары]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce МедиаУики шығу туралы хат тарату тізімі]"
+       "mainpagedocfooter": "Уики бағдарламалық жасақтамасын қалай қолданатын ақпараты үшін [//meta.wikimedia.org/wiki/Help:Contents Пайдаланушылық нұсқауларынан] кеңес алыңыз.\n\n== Бастау үшін ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Бапталым қалауларының тізімі]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ МедиаУикидің Жиы Қойылған Сауалдары]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce МедиаУики шығу туралы хат тарату тізімі]"
 }
index 349c14d..fb261bd 100644 (file)
@@ -1,5 +1,5 @@
 {
        "@metadata": [],
        "mainpagetext": "'''MedïaWïkï bwması sätti ornatıldı.'''",
-       "mainpagedocfooter": "Wïkï bağdarlamalıq jasaqtamasın qalaý qoldanatın aqparatı üşin [//meta.wikimedia.org/wiki/Help:Contents Paýdalanwşılıq nusqawlarınan] keñes alıñız.\n\n== Bastaw üşin ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Baptalım qalawlarınıñ tizimi]\n* [//www.mediawiki.org/wiki/Manual:FAQ MedïaWïkïdiñ Jïı Qoýılğan Sawaldarı]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MedïaWïkï şığw twralı xat taratw tizimi]"
+       "mainpagedocfooter": "Wïkï bağdarlamalıq jasaqtamasın qalaý qoldanatın aqparatı üşin [//meta.wikimedia.org/wiki/Help:Contents Paýdalanwşılıq nusqawlarınan] keñes alıñız.\n\n== Bastaw üşin ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Baptalım qalawlarınıñ tizimi]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MedïaWïkïdiñ Jïı Qoýılğan Sawaldarı]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MedïaWïkï şığw twralı xat taratw tizimi]"
 }
index 0396a17..8318e9c 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Thearith",
                        "គីមស៊្រុន",
-                       "Sovichet"
+                       "Sovichet",
+                       "Seb35"
                ]
        },
        "config-desc": "កម្មវិធី​ដំឡើង​សម្រាប់ MediaWiki",
@@ -27,5 +28,5 @@
        "config-page-restart": "តំលើងឡើងវិញ",
        "config-help": "ជំនួយ",
        "mainpagetext": "'''មេឌាវិគីត្រូវបានដំឡើងសំរេចហើយ​។'''",
-       "mainpagedocfooter": "សូមពិនិត្យមើល [//meta.wikimedia.org/wiki/ជំនួយ​៖ ខ្លឹមសារ​ណែនាំ​ប្រើប្រាស់]សម្រាប់​ព័ត៌មាន​​បន្ថែមអំពី​ការប្រើប្រាស់សូហ្វវែរវិគី​។\n\n== ការចាប់ផ្ដើម ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings បញ្ជីការកំណត់នានា]\n* [//www.mediawiki.org/wiki/Manual:FAQ/km សំណួរញឹកញាប់​ក្នុងមេឌាវិគី]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce បញ្ជី​អ៊ីមែលផ្សព្វផ្សាយ​របស់​មេឌាវិគី]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources ការប្រែសម្រួលមេឌាវិគីសម្រាប់ភាសារបស់អ្នក]"
+       "mainpagedocfooter": "សូមពិនិត្យមើល [//meta.wikimedia.org/wiki/Help:Contents ខ្លឹមសារ​ណែនាំ​ប្រើប្រាស់]សម្រាប់​ព័ត៌មាន​​បន្ថែមអំពី​ការប្រើប្រាស់សូហ្វវែរវិគី​។\n\n== ការចាប់ផ្ដើម ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings បញ្ជីការកំណត់នានា]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/km សំណួរញឹកញាប់​ក្នុងមេឌាវិគី]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce បញ្ជី​អ៊ីមែលផ្សព្វផ្សាយ​របស់​មេឌាវិគី]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources ការប្រែសម្រួលមេឌាវិគីសម្រាប់ភាសារបស់អ្នក]"
 }
index 96d0a96..2c84dc3 100644 (file)
@@ -1,5 +1,46 @@
 {
-       "@metadata": [],
+       "@metadata": {
+               "authors": [
+                       "VASANTH S.N."
+               ]
+       },
+       "config-information": "ಮಾಹಿತಿ",
+       "config-localsettings-key": "ಉನ್ನತೀಕರಣ ಕೀಲಿ",
+       "config-localsettings-badkey": "ನೀವು ನೀಡಿದ ಕೀಲಿ ಸರಿಯಾಗಿಲ್ಲ",
+       "config-session-error": "ಅವಧಿ ಪ್ರಾರಂಭ ದೋಷ: $1",
+       "config-your-language": "ನಿಮ್ಮ ಭಾಷೆ:",
+       "config-wiki-language": "ವಿಕಿ ಭಾಷೆ:",
+       "config-back": "← ವಾಪಸು",
+       "config-continue": "ಮುಂದುವರೆಸಿ →",
+       "config-page-language": "ಭಾಷೆ",
+       "config-page-welcome": "ಮಾಧ್ಯಮವಿಕಿಗೆ ಸ್ವಾಗತ",
+       "config-page-dbconnect": "ದತ್ತಾಂಶಸಂಚಯಕ್ಕೆ ಸಂಪರ್ಕನೀಡಿ",
+       "config-page-name": "ಹೆಸರು",
+       "config-page-options": "ಆಯ್ಕೆಗಳು",
+       "config-page-install": "ಸ್ಥಾಪಿಸು",
+       "config-page-complete": "ಪೂರ್ಣ!",
+       "config-page-readme": "ನನ್ನನ್ನು ಓದಿ",
+       "config-page-copying": "ನಕಲಿಸುತ್ತಿದೆ..",
+       "config-page-upgradedoc": "ಪರಿಷ್ಕರಿಸಲ್ಪಡುತ್ತಿದೆ",
+       "config-page-existingwiki": "ಪ್ರಸ್ತುತ ವಿಕಿ",
+       "config-restart": "ಸರಿ,ಪುನಃ ಪ್ರಾರಂಭಿಸಿ",
+       "config-db-type": "ದತ್ತಾಂಶಸಂಚಯ ಮಾದರಿ:",
+       "config-db-host-oracle": "ದತ್ತಾಂಶಸಂಚಯ TNS:",
+       "config-db-wiki-settings": "ಈ ವಿಕಿಯನ್ನು ಗುರುತಿಸಿ",
+       "config-db-name": "ದತ್ತಾಂಶಸಂಚಯ ಹೆಸರು:",
+       "config-db-username": "ದತ್ತಾಂಶಸಂಚಯ ಬಳಕೆದಾರಹೆಸರು:",
+       "config-db-password": "ದತ್ತಾಂಶಸಂಚಯ ಪ್ರವೇಶಪದ:",
+       "config-ns-generic": "ಯೋಜನೆ",
+       "config-admin-name": "ನಿಮ್ಮ ಬಳಕೆದಾರಹೆಸರು:",
+       "config-admin-password": "ಪ್ರವೇಶಪದ:",
+       "config-admin-password-confirm": "ಪುನಃ ಪ್ರವೇಶಪದ:",
+       "config-admin-password-mismatch": "ನೀವು ಕೊಟ್ಟ ಪ್ರವೇಶಪದಗಳು ಬೇರೆಬೇರೆಯಾಗಿವೆ.",
+       "config-admin-email": "ಮಿಂಚಂಚೆ ವಿಳಾಸ:",
+       "config-optional-continue": "ನನ್ನಲ್ಲಿ ಹೆಚ್ಚಿನ ಪ್ರಶ್ನೆಗಳನ್ನು ಕೇಳಿ.",
+       "config-license": "ಕೃತಿಸ್ವಾಮ್ಯ ಮತ್ತು ಪರವಾನಗಿ:",
+       "config-extensions": "ವಿಸ್ತರಣೆಗಳು",
+       "config-install-step-failed": "ವಿಫಲವಾಗಿದೆ",
+       "config-help": "ಸಹಾಯ",
        "mainpagetext": "'''ವಿಕಿ ತಂತ್ರಾಂಶವನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಅನುಸ್ಥಾಪಿಸಲಾಯಿತು.'''",
-       "mainpagedocfooter": "ವಿಕಿ ತಂತ್ರಾಂಶವನ್ನು ಬಳಸುವ ಬಗ್ಗೆ ಮಾಹಿತಿಗೆ [//meta.wikimedia.org/wiki/Help:Contents ಬಳಕೆದಾರರಿಗೆ ನಿರ್ದೇಶನ ಪುಟ] ನೋಡಿ.\n\n== ಪ್ರಾರಂಭಿಸುವುದು ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Manual:FAQ ಮೀಡಿಯವಿಕಿ FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]"
+       "mainpagedocfooter": "ವಿಕಿ ತಂತ್ರಾಂಶವನ್ನು ಬಳಸುವ ಬಗ್ಗೆ ಮಾಹಿತಿಗೆ [//meta.wikimedia.org/wiki/Help:Contents ಬಳಕೆದಾರರಿಗೆ ನಿರ್ದೇಶನ ಪುಟ] ನೋಡಿ.\n\n== ಪ್ರಾರಂಭಿಸುವುದು ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ ಮೀಡಿಯವಿಕಿ FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]"
 }
index 68be0b2..0638452 100644 (file)
@@ -4,7 +4,8 @@
                        "Kwj2772",
                        "아라",
                        "Hym411",
-                       "Priviet"
+                       "Priviet",
+                       "Namoroka"
                ]
        },
        "config-desc": "미디어위키 설치 프로그램",
        "config-restart": "예, 다시 시작합니다",
        "config-welcome": "=== 사용 환경 검사 ===\n기본 검사는 지금 이 환경이 미디어위키 설치에 적합한지 수행합니다.\n설치를 완료하는 방법에 대한 지원을 찾는다면 이 정보를 포함해야 하는 것을 기억하세요.",
        "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/Help:Contents 사용자 가이드]\n* [//www.mediawiki.org/wiki/Manual:Contents 관리자 가이드]\n* [//www.mediawiki.org/wiki/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-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-toolow": "PHP $1(이)가 설치되었습니다.\n하지만 미디어위키는 PHP $2 이상이 필요합니다.",
        "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/Unicode_normalization_considerations 유니코드 정규화]를 읽어보시기 바랍니다.",
-       "config-unicode-update-warning": "'''경고''': 유니코드 정규화 래퍼의 설치된 버전은 [http://site.icu-project.org/ ICU 프로젝트]의 라이브러리의 이전 버전을 사용합니다.\n만약 유니코드를 사용하는 것에 대해 우려가 된다면 [//www.mediawiki.org/wiki/Unicode_normalization_considerations 업그레이드]해야합니다.",
+       "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-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-gd": "내장된 GD 그래픽 라이브러리를 찾았습니다.\n올리기를 활성화할 경우 그림 섬네일이 활성화됩니다.",
        "config-no-scaling": "GD 라이브러리나 ImageMagick를 찾을 수 없습니다.\n그림 섬네일이 비활성화됩니다.",
        "config-no-uri": "'''오류:''' 현재 URI를 확인할 수 없습니다.\n설치가 중단되었습니다.",
-       "config-no-cli-uri": "'''경고''': 기본 값을 사용하여 <code>--scriptpath</code>를 지정하지 않았습니다: <code>$1</code>.",
+       "config-no-cli-uri": "'''경고''': 기본값을 사용하여 <code>--scriptpath</code>를 지정하지 않았습니다: <code>$1</code>.",
        "config-using-server": "\"<nowiki>$1</nowiki>\"(을)를 서버 이름으로 사용합니다.",
        "config-using-uri": "\"<nowiki>$1$2</nowiki>\"(을)를 서버 URL로 사용합니다.",
-       "config-uploads-not-safe": "'''경고:''' 올리기에 대한 기본 디렉터리(<code>$1</code>)는 임의의 스크립트 실행에 취약합니다.\n미디어위키는 보안 위협 때문에 모든 올려진 파일을 검사하지만, 올리기를 활성화하기 전에 [//www.mediawiki.org/wiki/Manual:Security#Upload_security 이 보안 취약점을 해결할 것]을 매우 권장합니다.",
+       "config-uploads-not-safe": "'''경고:''' 올리기에 대한 기본 디렉터리(<code>$1</code>)는 임의의 스크립트 실행에 취약합니다.\n미디어위키는 보안 위협 때문에 모든 올려진 파일을 검사하지만, 올리기를 활성화하기 전에 [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security 이 보안 취약점을 해결할 것]을 매우 권장합니다.",
        "config-no-cli-uploads-check": "'''경고:''' 올리기를 위한 기본 디렉터리(<code>$1</code>)는 CLI를 설치하는 동안 임의의 스크립트 실행에 대한 취약점에 대해 검사되지 않습니다.",
        "config-brokenlibxml": "시스템에 버그가 있는 PHP와 libxml2의 조합이 있으며 미디어위키나 다른 웹 어플리케이션에 숨겨진 데이터 손상을 일으킬 수 있습니다.\nlibxml2 2.7.3 이후 버전으로 업그레이드하세요. ([https://bugs.php.net/bug.php?id=45996 PHP에 제기한 버그])\n설치가 중단되었습니다.",
        "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-username": "데이터베이스 사용자 이름:",
        "config-db-password": "데이터베이스 비밀번호:",
        "config-db-password-empty": "새 데이터베이스 사용자의 비밀번호를 입력하세요: $1.\n비밀번호 없이 사용자를 만들 수도 있지만 안전하지 않습니다.",
+       "config-db-username-empty": "\"{{int:config-db-username}}\"에 대한 값을 입력해야 합니다.",
        "config-db-install-username": "설치 과정 도중 데이터베이스에 연결할 때 사용할 사용자 이름을 입력하세요.\n미디어위키 계정의 사용자 이름이 아닌 데이터베이스의 사용자 이름입니다.",
        "config-db-install-password": "설치 과정 도중 데이터베이스에 연결할 때 사용할 비밀번호을 입력하세요.\n미디어위키 계정의 비밀번호가 아닌 데이터베이스의 비밀번호입니다.",
        "config-db-install-help": "설치 과정 중에 데이터베이스에 연결할 때 사용할 사용자 이름과 비밀번호를 입력하세요.",
        "config-header-oracle": "Oracle 설정",
        "config-header-mssql": "마이크로소프트 SQL 서버 설정",
        "config-invalid-db-type": "잘못된 데이터베이스 종류",
-       "config-missing-db-name": "\"데이터베이스 이름\"에 대한 값을 입력해야 합니다",
-       "config-missing-db-host": "\"데이터베이스 호스트\"에 대한 값을 입력해야 합니다",
-       "config-missing-db-server-oracle": "\"데이터베이스 TNS\"에 대한 값을 입력해야 합니다",
+       "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-name": "\"$1\" 데이터베이스 이름이 잘못되었습니다.\nASCII 글자 (a-z, A-Z), 숫자 (0-9), 밑줄 (_)과 하이픈 (-)만 사용하세요.",
        "config-invalid-db-prefix": "\"$1\" 데이터베이스 접두어가 잘못됐습니다.\nASCII 글자 (a-z, A-Z), 숫자 (0-9), 밑줄 (_)과 하이픈 (-)만 사용하세요.",
        "config-profile-no-anon": "계정 만들기 필요",
        "config-profile-fishbowl": "승인된 편집자만",
        "config-profile-private": "비공개 위키",
-       "config-profile-help": "위키는 가능한 많은 사람들이 편집할 수 있도록 할 때 가장 뛰어난 역할을 합니다.\n미디어위키에서는 최근 바뀜을 검토하기 쉽고, 미숙하거나 악의적인 사용자의 어떠한 손실을 되돌리는 것이 쉽습니다.\n\n그러나 많은 사람이 미디어위키가 다양한 역할을 수행하는 데 유용하다는 것을 알고 있지만, 때로는 모든 사람에게 위키 방식의 장점을 설득하기 쉽지 않을 지도 모릅니다.\n그래서 선택할 수 있습니다.\n\n'''{{int:config-profile-wiki}}''' 모델은 로그인하지 않고도 누구나 편집할 수 있습니다.\n'''{{int:config-profile-no-anon}}'''인 위키에서는 편집자에게 추가적인 책임을 부여하지만, 부담 없는 기여를 저해할 수도 있습니다.\n\n'''{{int:config-profile-fishbowl}}''' 시나리오에서는 승인된 사용자만 편집할 수 있지만, 일반 사용자도 문서(문서 역사 포함)는 볼 수 있습니다.\n'''{{int:config-profile-private}}'''는 승인된 사용자만 문서를 볼 수 있으며, 승인된 사용자 그룹이 편집할 수 있습니다.\n\n더 복잡한 사용자 권한 설정은 설치한 후 사용할 수 있으며 [//www.mediawiki.org/wiki/Manual:User_rights 관련 설명서 항목]을 참고하세요.",
+       "config-profile-help": "위키는 가능한 많은 사람들이 편집할 수 있도록 할 때 가장 뛰어난 역할을 합니다.\n미디어위키에서는 최근 바뀜을 검토하기 쉽고, 미숙하거나 악의적인 사용자의 어떠한 손실을 되돌리는 것이 쉽습니다.\n\n그러나 많은 사람이 미디어위키가 다양한 역할을 수행하는 데 유용하다는 것을 알고 있지만, 때로는 모든 사람에게 위키 방식의 장점을 설득하기 쉽지 않을 지도 모릅니다.\n그래서 선택할 수 있습니다.\n\n'''{{int:config-profile-wiki}}''' 모델은 로그인하지 않고도 누구나 편집할 수 있습니다.\n'''{{int:config-profile-no-anon}}'''인 위키에서는 편집자에게 추가적인 책임을 부여하지만, 부담 없는 기여를 저해할 수도 있습니다.\n\n'''{{int:config-profile-fishbowl}}''' 시나리오에서는 승인된 사용자만 편집할 수 있지만, 일반 사용자도 문서(문서 역사 포함)는 볼 수 있습니다.\n'''{{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-email-sender-help": "발신한 이메일에 대한 반송 주소로 사용할 이메일 주소를 입력하세요.\n반송할 때 보내는 주소입니다.\n대부분의 메일 서버는 적어도 도메인 이름 부분은 유효합니다.",
        "config-upload-settings": "그림과 파일 올리기",
        "config-upload-enable": "파일 올리기 활성화",
-       "config-upload-help": "파일 올리기는 서버에 잠재적인 보안 위험에 쉽게 노출될 수 있습니다.\n자세한 내용은 매뉴얼의 [//www.mediawiki.org/wiki/Manual:Security 보안 문단]을 참고하세요.\n\n파일 올리기를 활성화하려면 미디어위키의 루트 디렉토리에 있는 <code>images</code> 하위 디렉토리에서 웹 서버가 기록할 수 있도록 모드를 바꿉니다.\n그 다음 이 옵션을 활성화합니다.",
+       "config-upload-help": "파일 올리기는 서버에 잠재적인 보안 위험에 쉽게 노출될 수 있습니다.\n자세한 내용은 매뉴얼의 [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security 보안 문단]을 참고하세요.\n\n파일 올리기를 활성화하려면 미디어위키의 루트 디렉토리에 있는 <code>images</code> 하위 디렉토리에서 웹 서버가 기록할 수 있도록 모드를 바꿉니다.\n그 다음 이 옵션을 활성화합니다.",
        "config-upload-deleted": "삭제된 파일에 대한 디렉터리:",
        "config-upload-deleted-help": "삭제된 파일을 보관할 디렉토리를 선택하세요.\n이상적으로 웹에서 접근할 수 없게 해야 합니다.",
        "config-logo": "로고 URL:",
        "config-logo-help": "미디어위키의 기본 스킨은 사이드바 메뉴 위에 135×160 픽셀의 로고의 공간을 포함하고 있습니다.\n적당한 크기로 그림을 올리고 여기에 URL을 입력하세요.\n\n로고가 상대적인 경로에 있으면 <code>$wgStylePath</code>나 <code>$wgScriptPath</code>를 사용할 수 있습니다.\n\n로고 사용을 원하지 않으면 이 상자를 비우세요.",
        "config-instantcommons": "인스턴트 공용 기능 활성화",
-       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons 인스턴트 공용]은 [//commons.wikimedia.org/ 위키미디어 공용] 사이트에서 찾을 수 있는 그림, 소리 및 다른 미디어를 위키에서 사용할 수 있도록 하는 기능입니다.\n이렇게 하려면 미디어위키가 인터넷에 접근해야합니다.\n\n위키미디어 공용 외에 기타 위키를 설정하는 방법에 대한 지침을 포함한, 기능에 대한 자세한 내용은 [//mediawiki.org/wiki/Manual:$wgForeignFileRepos 매뉴얼]을 참고하세요.",
+       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons 인스턴트 공용]은 [//commons.wikimedia.org/ 위키미디어 공용] 사이트에서 찾을 수 있는 그림, 소리 및 다른 미디어를 위키에서 사용할 수 있도록 하는 기능입니다.\n이렇게 하려면 미디어위키가 인터넷에 접근해야합니다.\n\n위키미디어 공용 외에 기타 위키를 설정하는 방법에 대한 지침을 포함한, 기능에 대한 자세한 내용은 [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos 매뉴얼]을 참고하세요.",
        "config-cc-error": "크리에이티브 커먼즈 라이선스 선택기에 결과가 없습니다.\n수동으로 라이선스 이름을 입력하세요.",
        "config-cc-again": "다시 선택...",
        "config-cc-not-chosen": "원하는 크리에이티브 커먼즈 라이선스를 선택하고 \"진행\"을 클릭하세요.",
        "config-insecure-keys": "'''경고:''' 설치 중에 생성한 {{PLURAL:$2|보안 키}} ($1)는 완전히 안전하지 {{PLURAL:$2|않습니다}}. 직접 바꾸는 것을 고려하세요.",
        "config-install-sysop": "관리자 사용자 계정을 만드는 중",
        "config-install-subscribe-fail": "미디어위키 알림을 구독할 수 없습니다: $1",
-       "config-install-subscribe-notpossible": "cURLì\9d´ ì\84¤ì¹\98ë\90\98ì§\80 ì\95\8aì\95\98ê³  allow_url_fopen를 사용할 수 없습니다.",
+       "config-install-subscribe-notpossible": "cURLì\9d´ ì\84¤ì¹\98ë\90\98ì\96´ ì\9e\88ì§\80 ì\95\8aê³  <code>allow_url_fopen</code>ì\9d\84 사용할 수 없습니다.",
        "config-install-mainpage": "기본 내용으로 대문을 만드는 중",
        "config-install-extension-tables": "활성화된 확장 기능을 위한 테이블을 만드는 중",
        "config-install-mainpage-failed": "대문을 삽입할 수 없습니다: $1",
        "config-install-done": "'''축하합니다!'''\n미디어위키가 성공적으로 설치되었습니다.\n\n설치 프로그램이 <code>LocalSettings.php</code> 파일을 만들었습니다.\n모든 설정이 포함되어 있습니다.\n\n파일을 다운로드하여 위키 설치의 거점에 넣어야 합니다. (index.php와 같은 디렉터리) 다운로드가 자동으로 시작됩니다.\n\n다운로드가 제공되지 않을 경우나 그것을 취소한 경우에는 아래의 링크를 클릭하여 다운로드를 다시 시작할 수 있습니다:\n\n$3\n\n'''참고:''' 이 생성한 설정 파일을 다운로드하지 않고 설치를 끝내면 이 파일은 나중에 사용할 수 없습니다.\n\n완료되었으면 '''[$2 위키에 들어갈 수 있습니다]'''.",
        "config-download-localsettings": "<code>LocalSettings.php</code> 다운로드",
        "config-help": "도움말",
+       "config-help-tooltip": "확장하려면 클릭",
        "config-nofile": "\"$1\" 파일을 찾을 수 없습니다. 이미 삭제되었나요?",
-       "config-extension-link": "당신의 위키가 [//www.mediawiki.org/wiki/Manual:Extensions 확장 기능]을 지원한다는 것을 알고 계십니까?\n\n전체 확장 기능의 목록을 확인하려면 [//www.mediawiki.org/wiki/Category:Extensions_by_category 분류별 확장 기능]이나 [//www.mediawiki.org/wiki/Extension_Matrix 확장 기능 표]를 찾아보실 수 있습니다.",
+       "config-extension-link": "당신의 위키가 [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions 확장 기능]을 지원한다는 것을 알고 계십니까?\n\n[//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category 분류별 확장 기능]을 찾아보실 수 있습니다.",
        "mainpagetext": "'''미디어위키가 성공적으로 설치되었습니다.'''",
-       "mainpagedocfooter": "[//meta.wikimedia.org/wiki/Help:Contents 이곳]에서 위키 소프트웨어에 대한 정보를 얻을 수 있습니다.\n\n== 시작하기 ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings 설정하기 목록]\n* [//www.mediawiki.org/wiki/Manual:FAQ 미디어위키 FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce 미디어위키 릴리스 메일링 리스트]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources 내 언어로 미디어위키 지역화]"
+       "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 미디어위키 FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce 미디어위키 릴리스 메일링 리스트]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources 내 언어로 미디어위키 지역화]"
 }
index 2a43547..d1d7d4c 100644 (file)
@@ -25,5 +25,5 @@
        "config-ns-other-default": "MyWiki",
        "config-profile-private": "Джабыкъ вики",
        "mainpagetext": "'''«MediaWiki» тыйыншлы салынды.'''",
-       "mainpagedocfooter": "Бу вики бла къалай ишлерге ангылатхан информацияны [//meta.wikimedia.org/wiki/Help:Contents_User's_Guide къошулуучугъа юретиуде] табаргъа боллукъду.\n\n== Файдалы ресурсла ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings тюрлендириулени списогу (ингил.)];\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki-ни юсюнден кёб берилген соруула];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-ни джангы версиясыны чыкъгъанын билдириу письмола]."
+       "mainpagedocfooter": "Бу вики бла къалай ишлерге ангылатхан информацияны [//meta.wikimedia.org/wiki/Help:Contents_User's_Guide къошулуучугъа юретиуде] табаргъа боллукъду.\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 eff34ac..785b2b5 100644 (file)
@@ -15,7 +15,7 @@
        "config-localsettings-badkey": "Dinge Schlößel paß nit.",
        "config-upgrade-key-missing": "Mer han jefonge, dat MediaWiki ald enschtalleed es.\nÜm de Projramme un Daate o der neue Schtand bränge ze künne, dunn aan et Engk vun dä Dattei <code lang=\"en\"><code>LocalSettings.php</code></code> op dämm ẞööver:\n\n$1\n\naanhange.",
        "config-localsettings-incomplete": "Mer han en Dattei <code lang=\"en\"><code>LocalSettings.php</code>:</code> jefonge, ävver di schingk nit kumplätt ze sin.\nDe Varijable <code lang=\"en\">$1</code> es nit jesatz.\nBes esu joot, un donn di Dattei esu aanpaße, dat se jesaz ea, un dann donn op „{{int:config-continue}}“ klecke.",
-       "config-localsettings-connection-error": "Ene Fähler es opjetrodde wi mer en Verbendung noh de Datebangk opmaache wullte met dä Enshtellunge uß dä Dattei <code lang=\"en\">LocalSettings</code> udder uß dä Dattei <code lang=\"en\">LocalSettings</code> un et hät nit jeflupp. Bes esu joot un dat repareere un versöhg et dann norr_ens.\n\n$1",
+       "config-localsettings-connection-error": "Ene Fähler es opjetrodde wi mer en Verbendong noh de Datebangk opmaache wullte met dä Enschtällonge uß dä Dattei <code lang=\"en\">LocalSettings</code> un et hät nit jeflupp. Bes esu joot un don dat repareere un versöhg et dann norr_ens.\n\n$1\n\n$1",
        "config-session-error": "Ene Fähler es opjetrodde beim Aanmelde för en Sezung: $1",
        "config-session-expired": "De Daate för Ding Setzung sinn wall övverholld of afjeloufe.\nDe Setzungunge sin esu enjeshtallt, nit mieh wi $1 ze doore.\nDat kanns De verlängere, endämm dat De de <code lang=\"en\">session.gc_maxlifetime</code> en dä Dattei <code>php.ini</code> jrüüßer määß.\nDon dat Projramm för et Opsäze norr_ens aanschmiiße.",
        "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-restart": "Joh, neu aanfange!",
        "config-welcome": "=== Ömjevong Pröhfe ===\nMer maache en Aanzahl jrundlääje Pröhvunge, öm erus ze fenge, ov di Ömjävvong heh paß för Mediawiki opzesäze.\nWann de Hölp bem Opsäze hölls, saach wigger, wat heh erus kohm, alsu wat heh schteiht.",
        "config-copyright": "=== Urhävverrääsch un Lizänzbedengunge ===\n\n$1\n\nDat  Projramm heh es frei, mer kann et wiggerjävve un verdeijle un och verändere onger dä Bedengunge vun de  GNU <i lang=\"en\">General Public License</i> (Alljemeine öffentlesche Lizänz) wi se vun de <i lang=\"en\">Free Software Foundation</i> (de Schteftung för frei Projramme) veröffentlesch woode es. Dobei kanns De Der de Version 2 vun dä Lizanz ußsöhke, udder jeede Version donoh, wi et Der jefällt.\n\nDat Projramm weed wigger jejovve met dä Hoffnung, dat et jät nöz, ävver <strong>der ohne Jarrantie</strong>, sujaa der ohne de onußjeshproche Jarantie, <strong>verkoufbaa</strong> ze sin, udder <strong>för öhnds_ene beshtemmpte Zweck ze bruche</strong> ze sin.\nLiß de GNU <i lang=\"en\">General Public License</i> sellver, öm mieh ze erfahre.\n\nDo sullts en <doclink href=Copying>Kopie vun dä alljemene öffentlesche Lizänz vun dä GNU</doclink> (<i lang=\"en\">GNU General Public License</i>) zosamme met heh däm Projramm krääje han. Wann dat nit esu es, schrief aan de <i lang=\"en\">Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA</i>, udder [http://www.gnu.org/copyleft/gpl.html liß se online övver et Internet].",
-       "config-sidebar": "* [//www.mediawiki.org MediaWiki sing Hompäjdsch]\n* [//www.mediawiki.org/wiki/Help:Contents Handbooch för Aanwender]\n* [//www.mediawiki.org/wiki/Manual:Contents Handbooch för Administratore un Wiki_Köbesse]\n* [//www.mediawiki.org/wiki/Manual:FAQ Öff jeshtallte Froore met Antwoote]\n----\n* <doclink href=Readme>Liß Mesch! (<i lang=\"en\">Read me</i>)</doclink>\n* <doclink href=ReleaseNotes><i lang=\"en\">Release notes</i> Övver heh di Projrammversion</doclink>\n* <doclink href=Copying><i lang=\"en\">Copying</i> — Lizänzbeshtemmunge</doclink>\n* <doclink href=UpgradeDoc><i lang=\"en\">Upgrading</i> — Ob en neu Projrammversion jonn</doclink>",
+       "config-sidebar": "* [//www.mediawiki.org MediaWiki sing Hompäjdsch]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Handbooch för Aanwender]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Handbooch för Administratore un Wiki_Köbesse]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Öff jeshtallte Froore met Antwoote]\n----\n* <doclink href=Readme>Liß Mesch! (<i lang=\"en\">Read me</i>)</doclink>\n* <doclink href=ReleaseNotes><i lang=\"en\">Release notes</i> Övver heh di Projrammversion</doclink>\n* <doclink href=Copying><i lang=\"en\">Copying</i> — Lizänzbeshtemmunge</doclink>\n* <doclink href=UpgradeDoc><i lang=\"en\">Upgrading</i> — Ob en neu Projrammversion jonn</doclink>",
        "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-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/Unicode_normalization_considerations <i lang=\"en\">Unicode</i>-Nommaliseere] (es op Änglesch) aanloore.",
-       "config-unicode-update-warning": "'''Opjepaß:''' Dat Projramm för der <i lang=\"en\">Unicode</i> zo normaliseere boud em Momang op en  ählter Version vun dä Bibliothek vum [http://site.icu-project.org/ ICU-Projäk] op.\nDoht di [//www.mediawiki.org/wiki/Unicode_normalization_considerations op der neuste Shtand bränge], wann auf dat Wiki em Äänz <i lang=\"en\">Unicode</i> bruche sull.",
+       "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.",
+       "config-unicode-update-warning": "'''Opjepaß:''' Dat Projramm för der <i lang=\"en\">Unicode</i> zo normaliseere boud em Momang op en  ählter Version vun dä Bibliothek vum [http://site.icu-project.org/ ICU-Projäk] op.\nDoht di [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations op der neuste Shtand bränge], wann auf dat Wiki em Äänz <i lang=\"en\">Unicode</i> bruche sull.",
        "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.",
@@ -83,7 +83,7 @@
        "config-no-cli-uri": "'''Opjepaß''': <code lang=\"en\"><code>--scriptpath</code></code> es nit aanjejovve, mer nämme der Schtandatt: <code>$1</code>.",
        "config-using-server": "Mer nämmen dem ẞööver singe Name: „<nowiki>$1</nowiki>“.",
        "config-using-uri": "Mer nämmen dem ẞööver singe <i lang=\"en\">URL</i>: „<nowiki>$1$2</nowiki>“.",
-       "config-uploads-not-safe": "'''Opjepaß:''' Uß däm jewöhnlijje Verzeichnes för de huhjelaade Datteie, dat es <code>$1</code>, künnte öhnzwällsche Skrepte un Projramme ußjeföhrt wääde. Och wann MediaWiki de huhjelaade Datteie prööf, dat kein bekannte Risike dren sin, sullt mer doch dat [//www.mediawiki.org/wiki/Manual:Security#Upload_security Sesherheitsloch] zoh maache, ih dat mer et Dattei Huhlaade zohlöht.",
+       "config-uploads-not-safe": "'''Opjepaß:''' Uß däm jewöhnlijje Verzeichnes för de huhjelaade Datteie, dat es <code>$1</code>, künnte öhnzwällsche Skrepte un Projramme ußjeföhrt wääde. Och wann MediaWiki de huhjelaade Datteie prööf, dat kein bekannte Risike dren sin, sullt mer doch dat [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security Sesherheitsloch] zoh maache, ih dat mer et Dattei Huhlaade zohlöht.",
        "config-no-cli-uploads-check": "'''Opjepaß''': <code>$1</code> es dat Schtandatt-Verzeijschneß för et Datteije-Huhlaade. Beim Opsäze met <abbr lang=\"en\" title=\"Call Level Interface\">CLI</abbr> donn mer ävver nit övverpröhve, dat dat jeschöz es dojääje, dat Skrepte vun doh loufe künne, di mer nit loufe han well.",
        "config-brokenlibxml": "Op Dingem Rääschner loufe Versione vun PHP un <code lang=\"en\">libxml2</code> zosamme, di ävver nit zosamme paßße, un onbimärk de Daate em MediaWiki un ander Web_Aanwändunge [//bugs.php.net/bug.php?id=45996 bug kapott maache].\nJangk op <code lang=\"en\">libxml2</code> 2.7.3 udder dohnoh.\nHeh jeihd et nit wigger.",
        "config-suhosin-max-value-length": "<i lang=\"en\">Suhosin</i> es enschtalleet. Dröm kann ene <code lang=\"en\">GET</code>-Parrameeter nit övver {{PLURAL:$1|ei Byte|$1 Bytes|noll Byte}} lang wääde. Dem MediaWiki singe <i lang=\"en\">ResourceLoader</i> kütt doh zwa drömeröm, ävver dat bräms. Wann müjelesch, doht <code lang=\"en\">suhosin.get.max_value_length</code> en dä Dattei <code lang=\"en\">php.ini</code> op 1024 Bytes udder drövver enschtälle, un dann moß <code lang=\"en\">$wgResourceLoaderMaxQueryLength</code> en dä Dattei <code lang=\"en\">LocalSettings.php</code> op däsälve Wäät jesaz wääde.",
        "config-db-username": "Dä Name vun däm Aanwender för dä Zohjref op de Daatebangk:",
        "config-db-password": "Et Paßwoot vun däm Aanwender för dä Zohjref op de Daatebangk:",
        "config-db-password-empty": "Jiv e Paßwoot aan, för dä neue Aanwender för dä Zohjref op de Daatebangk, $1.\nEd es zwa müjjelesch, Aanwender för dä Zohjref op de Daatebangk der ohne e Paßwoot aanzelääje,\nävver dat wöhr en schwere Jevah för de Sescherheit vum Wiki.",
+       "config-db-username-empty": "Do moß jäd aanjävve för \"{{int:config-db-username}}\".",
        "config-db-install-username": "Jiv ene Name aan för dä Aanwender för dä Zohjref op de Daatebangk beim Enshtalleere.\nDat es keine Metmaacher_Name em Wiki — heh dä Name es alleins en der Daatebangk bikannt.",
        "config-db-install-password": "Jiv e Paßwoot aan för dä Aanwender för dä Zohjref op de Daatebangk beim Enshtalleere.\nDat es kei Paßwoot för ene Metmaacher em Wiki — et es alleins en der Daatebangk bikannt.",
        "config-db-install-help": "Donn dä Name un et Paßwoot vun däm Aanwänder för der Zohjreff op de Daatebangk jäz för et Enreeshte aanjävve.",
        "config-header-oracle": "De Enshtällunge för de <i lang=\"en\">Oracle</i> Daatebangk",
        "config-header-mssql": "Enschtällonge för der <i lang=\"en\" xml:lang=\"en\">SQL</i>-ẞööver vun <i lang=\"en\" xml:lang=\"en\">Microsoft</i>",
        "config-invalid-db-type": "Dat es en onjöltijje Zoot Daatebangk.",
-       "config-missing-db-name": "Do moß jät enjävve för dä Name vun dä Daatebangk.",
-       "config-missing-db-host": "Do moß jät enjävve för dä Name vun däm Rääschner met dä Daatebangk.",
-       "config-missing-db-server-oracle": "Do moß jät enjävve för dä Daatebangk ier <i lang=\"en\" title=\"Transparent Network Substrate\">TNS</i>.",
+       "config-missing-db-name": "Do moß jäd enjävve för \"{{int:config-db-name}}\".",
+       "config-missing-db-host": "Do moß jät enjävve för \"{{int:config-db-host}}\".",
+       "config-missing-db-server-oracle": "Do moß jät enjävve för \"{{int:config-db-host-oracle}}\".",
        "config-invalid-db-server-oracle": "Dä Daatebangk ier <i lang=\"en\" title=\"Transparent Network Substrate\">TNS</i> kann nit „$1“ sin, dat es esu nit jöltesch.\nNemm en „TNS-Nahme“ udder ene „<i lang=\"en\" xml:lang=\"en\">Easy-Connect</i>“-<i lang=\"en\" xml:lang=\"en\">Easy-Connect</i>String</i>(Lor noh dädohwähje noh de <i lang=\"en\" xml:lang=\"en\">[http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle Naming Methods]</i>)",
        "config-invalid-db-name": "Dä Daatebangk iere Name kann nit „$1“ sin, dä es esu nit jöltesch.\nDöh dörve bloß <i lang=\"en\" title=\"American Standard Code for Information Interchange\">ASCII</i> Boochshtaabe (a-z, A-Z), Zahle (0-9), Ongerstresh (_), un Bendeshtresh (-) dren vörkumme.",
        "config-invalid-db-prefix": "Dä Vörsaz för de Name vun de Tabälle en de Daatebangk kann nit „$1“ sin, dä es esu nit jöltesch.\nDöh dörve bloß <i lang=\"en\" title=\"American Standard Code for Information Interchange\">ASCII</i> Boochshtaabe (a-z, A-Z), Zahle (0-9), Ongerstreshe (_), un Bendeshtreshe (-) dren vörkumme.",
        "config-mysql-charset-help": "Beim Schpeishere em <strong>binäre Fomaat</strong> deiht MediaWiki Täxt, dä em UTF-8 Fommaat kütt, en dä Daatebangk en binär kodeerte Daatefälder faßhallde.\nDat es flöcker un spaasaamer wi et UTF-8 Fommaat vum <i lang=\"en\">MySQL</i> un määd et müjjelesch, all un jeedes <i lang=\"en\">Unicode</i>-Zeische met faßzehallde.\n\nBeim Schpeishere em <strong>UTF-8 Fomaat<strong> deiht et <i lang=\"en\">MySQL</i> der Zeischesaz un de Kodeerung vun dä Daate känne, un kann se akeraat aanzeije un ömwandelle,\nallerdengs künne kein Zeische ußerhalv vum [//de.wikipedia.org/wiki/Basic_Multilingual_Plane#Gliederung_in_Ebenen_und_Bl.C3.B6cke jrundlääje Knubbel för vill Schprooche (<i lang=\"en\">Basic Multilingual Plane — BMP</i>)] afjeschpeischert wääde.",
        "config-mssql-auth": "De Zoot Aanmäldong:",
        "config-mssql-install-auth": "Söhk us, wi dat Aanmälde aan dä Daatebangk vor sesch jonn sull för de Enschtallazjuhn.\nWann De <em>{{int:Config-mssql-windowsauth}}</em> nemms, weed jenumme, met wat emmer dä Wäbßööver aam loufe es.",
-       "config-mssql-web-auth": "Söhk us, wi dat Aanmälde aan dä Daatebangk vor sesch jonn sull för de nommaale Ärbeid vum Wiki.\nWann De <em>{{int:Config-mssql-windowsauth}}</em> nemms, weed jenumme, met wat emmer dä Wäbßööver aam loufe es.",
+       "config-mssql-web-auth": "Söhk us, wi dat Aanmälde aan dä Daatebangk vör sesch jonn sull för de nommaale Ärbeid vum Wiki.\nWann De <em>{{int:Config-mssql-windowsauth}}</em> nemms, weed dat jenumme, wohmet dä Wäbßööver aam loufe es.",
        "config-mssql-sqlauth": "De Aanmäldong bemm <i lang=\"en\" xml:lang=\"en\">SQL</i>-ẞööver vun <i lang=\"en\" xml:lang=\"en\">Microsoft</i>",
        "config-mssql-windowsauth": "De Annmäldong bemm <i lang=\"en\" xml:lang=\"en\">Windows</i>",
        "config-site-name": "Däm Wiki singe Name:",
        "config-profile-no-anon": "Schriever möße enlogge",
        "config-profile-fishbowl": "Bloß ußdröcklesch zohjelohße Schriever",
        "config-profile-private": "E jeschloße Privat_Wiki",
-       "config-profile-help": "Wikis loufe et bäß, wam_mer esu vill Lück wi möjjelesch draan metmaache un schrieve löht.\nMet MediaWiki es et ejfach, de neuste Änderonge ze beloore un wat ahnungslose udder fiese Lück kapott jemaat han wider retuur ze maache.\n\nBloß, mänsch eine häd_eruß jefonge, dat mer MediaWiki jood en en jruuße Zahl ongerscheidlijje Rolle bruche kann, un nit emmer es et leisch, ene vum onverfälschte Wiki_Wääsch ze övverzeuje.\nEsu häß De de Wahl:\n\n'''{{int:config-profile-wiki}}''' löht jeder_ein metschrieve, och ohne sesch enzelogge.\n\n'''{{int:config-profile-no-anon}}''', dat sorsch för mieh seeschbaa Verantwootlischkeite, künnt ävver zohfällije Methellefer verschrecke.\n\n'''{{int:config-profile-fishbowl}}''' löht nor de ußjesöhk Metmaacher schrieve, ävver de janze Öffentleshkeit kann et lässe un süht och de ällder Versione, un wat wää wann draan jedonn hät.\n\n'''{{int:config-profile-private}}''' kann nur lässe, wäh en et Wiki zohjelohße es, un desellve Jropp kann uch schrieve.\n\nNoch ander un un opwändijere Enschtellunge för de Rääschte sin möjjelesch, wann et Wiki ens aam Loufe es. Loor Der doför de [//www.mediawiki.org/wiki/Manual:User_rights zopaß Hölp em Handbooch] aan.",
+       "config-profile-help": "Wikis loufe et bäß, wam_mer esu vill Lück wi möjjelesch draan metmaache un schrieve löht.\nMet MediaWiki es et ejfach, de neuste Änderonge ze beloore un wat ahnungslose udder fiese Lück kapott jemaat han wider retuur ze maache.\n\nBloß, mänsch eine häd_eruß jefonge, dat mer MediaWiki jood en en jruuße Zahl ongerscheidlijje Rolle bruche kann, un nit emmer es et leisch, ene vum onverfälschte Wiki_Wääsch ze övverzeuje.\nEsu häß De de Wahl:\n\n'''{{int:config-profile-wiki}}''' löht jeder_ein metschrieve, och ohne sesch enzelogge.\n\n'''{{int:config-profile-no-anon}}''', dat sorsch för mieh seeschbaa Verantwootlischkeite, künnt ävver zohfällije Methellefer verschrecke.\n\n'''{{int:config-profile-fishbowl}}''' löht nor de ußjesöhk Metmaacher schrieve, ävver de janze Öffentleshkeit kann et lässe un süht och de ällder Versione, un wat wää wann draan jedonn hät.\n\n'''{{int:config-profile-private}}''' kann nur lässe, wäh en et Wiki zohjelohße es, un desellve Jropp kann uch schrieve.\n\nNoch ander un un opwändijere Enschtellunge för de Rääschte sin möjjelesch, wann et Wiki ens aam Loufe es. Loor Der doför de [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights zopaß Hölp em Handbooch] aan.",
        "config-license": "Urhävverrääsch un Lizänz:",
        "config-license-none": "Kein Fooßreih övver de Lizänz",
        "config-license-cc-by-sa": "<i lang=\"en\">Creative Commons</i> Der Name moß jenannt sin, et Wiggerjävve es zohjelohße onger dersellve Bedengunge",
        "config-email-sender-help": "Jiff de Adräß för de <i lang=\"en\">e-mail</i> en, woh Antwoote ob em Wiki singe <i lang=\"en\">e-mails</i> hen jonn sulle.\nDat es och de Adräß, woh de <i lang=\"en\">e-mails</i> met Fählermäldonge hen jon.\nVill ẞöövere för de <i lang=\"en\">e-mail</i> welle winnischßdens ene jöltijje Domain en dä Adräß han.",
        "config-upload-settings": "Belder un Datteie huh laade",
        "config-upload-enable": "Belder un Datteie huh laade zohlohße",
-       "config-upload-help": "Datteije huh ze laade künnt e Risiko för dem ẞööver singe Sescherheit sin.\nMieh doh drövver kam_mer em [//www.mediawiki.org/wiki/Manual:Security Kapitel övver de Sescherheit] em Handbooch lässe.\n\nÖm et Huhlaade zohzelohße donn de Rääschde för der Zohjreff op dat Ongerverzeischneß <code lang=\"en\">images</code> em MediaWiki singem Houpverzeischneß esu enshtälle, dat et Webßööverprojramm doh Datteije un Verzeischneße eren schrieve kann.\nDonoh donn heh di Saach zohlohße.",
+       "config-upload-help": "Datteije huh ze laade künnt e Risiko för dem ẞööver singe Sescherheit sin.\nMieh doh drövver kam_mer em [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security Kapitel övver de Sescherheit] em Handbooch lässe.\n\nÖm et Huhlaade zohzelohße donn de Rääschde för der Zohjreff op dat Ongerverzeischneß <code lang=\"en\">images</code> em MediaWiki singem Houpverzeischneß esu enshtälle, dat et Webßööverprojramm doh Datteije un Verzeischneße eren schrieve kann.\nDonoh donn heh di Saach zohlohße.",
        "config-upload-deleted": "Dat Verzeishneß för fottjeschmeße Datteije:",
        "config-upload-deleted-help": "Söhk e Verzeijschneß uß för de fottjeschmeße Datteije vum Wiki dren afzelääje.\nEt bäß es, wam_mer vum <i lang=\"en\">world wide web</i> doh nit drahn kumme kann.",
        "config-logo": "Dem Wiki singem Logo sing <i lang=\"en\">URL</i>:",
        "config-logo-help": "De Schtandart_Bedeen_Bovverfläsch vum MediaWiki hät e Logo bovve en der Eck met 135x160 Pixele.\nDonn e zopaß Logo huh laade, un donn däm sing URL heh endraare.\n\nDo kanns <code lang=\"en\">$wgStylePath</code> udder <code lang=\"en\">$wgScriptPath</code> nämme, wann Ding Logo en einem vun dänne Pahde litt.\n\nWells De kei Logo han, draach heh nix en.",
        "config-instantcommons": "Donn <i lang=\"en\">InstantCommons</i> zohlohße.",
-       "config-instantcommons-help": "<i lang=\"en\">[//www.mediawiki.org/wiki/InstantCommons InstantCommons]</i> es en Eijeschaff, di et för Wikis müjjelesch määt, Belder, Tondatteie un ander Meedijedatteie enzebenge, di op dä Webßait vun de <i lang=\"en\">[//commons.wikimedia.org/ Wikimedia Commons]</i> ongerjebraat sin. Öm dat noze ze künne, moß dä ẞööver vum MediaWiki en Verbendung nohm Internet opnämme künne.\n\nMieh Aanjaabe doh drövver un en Aanleidung, wi mer och ander Wikis ußer de <i lang=\"en\">Wikimedia Commons</i> doför enreeschte kann, fengk mer em [//mediawiki.org/wiki/Manual:$wgForeignFileRepos Handbooch].",
+       "config-instantcommons-help": "<i lang=\"en\">[//www.mediawiki.org/wiki/InstantCommons InstantCommons]</i> es en Eijeschaff, di et för Wikis müjjelesch määt, Belder, Tondatteie un ander Meedijedatteie enzebenge, di op dä Webßait vun de <i lang=\"en\">[//commons.wikimedia.org/ Wikimedia Commons]</i> ongerjebraat sin. Öm dat noze ze künne, moß dä ẞööver vum MediaWiki en Verbendung nohm Internet opnämme künne.\n\nMieh Aanjaabe doh drövver un en Aanleidung, wi mer och ander Wikis ußer de <i lang=\"en\">Wikimedia Commons</i> doför enreeschte kann, fengk mer em [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos Handbooch].",
        "config-cc-error": "Et Ußsöhke övver de <i lang=\"en\">Creative Commons</i> iehr Projramm zum Lizänzbeshtemme hät nix jebraat.\nDonn de Lizänz sellver beshtemme.",
        "config-cc-again": "Noch ens neu ußsöhke&nbsp;…",
        "config-cc-not-chosen": "Söhk uß, wat för en Lizänz vun de <i lang=\"en\">Creative Commons</i> De han wells, un donn dann op „<i lang=\"en\">proceed</i>“ klecke.",
        "config-download-localsettings": "Donn di Dattei <code lang=\"en\">LocalSettings.php</code> eronger laade",
        "config-help": "Hölp",
        "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/Manual:Extensions Zohsazprojramme] hann kann?\n\nDo kanns [//www.mediawiki.org/wiki/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.",
+       "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.'''",
-       "mainpagedocfooter": "Luur en et (änglesche) [//meta.wikimedia.org/wiki/Help:Contents Handbooch] wann De wesse wells wie de Wiki-Soffwär jebruch un bedeent wääde moß.\n\nLuur en et (änglesche) [//meta.wikimedia.org/wiki/Help:Contents Handbooch] wann De weße wells wi de Wiki-Soffwähr jebruch un bedehnt wääde moß.\n\n== För der Aanfang ==\nDat es och all op Änglesch:\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Donn MediaWiki op Ding Schprohch aanpaße]"
+       "mainpagedocfooter": "Luur en et (änglesche) [//meta.wikimedia.org/wiki/Help:Contents Handbooch] wann De wesse wells wie de Wiki-Soffwär jebruch un bedeent wääde moß.\n\nLuur en et (änglesche) [//meta.wikimedia.org/wiki/Help:Contents Handbooch] wann De weße wells wi de Wiki-Soffwähr jebruch un bedehnt wääde moß.\n\n== För der Aanfang ==\nDat es och all op Änglesch:\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Donn MediaWiki op Ding Schprohch aanpaße]"
 }
index 7140124..a08c83a 100644 (file)
@@ -13,5 +13,5 @@
        "config-install-step-done": "çêbû",
        "config-help": "alîkarî",
        "mainpagetext": "'''MediaWiki serketî hate çêkirin.'''",
-       "mainpagedocfooter": "Alîkarî ji bo bikaranîn û guherandin yê datayê Wîkî tu di bin [//meta.wikimedia.org/wiki/Help:Contents pirtûka alîkarîyê ji bikarhêneran] da dikarê bibînê.\n\n== Alîkarî ji bo destpêkê ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lîsteya varîyablên konfîgûrasîyonê]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lîsteya e-nameyên versyonên nuh yê MediaWiki]"
+       "mainpagedocfooter": "Alîkarî ji bo bikaranîn û guherandin yê datayê Wîkî tu di bin [//meta.wikimedia.org/wiki/Help:Contents pirtûka alîkarîyê ji bikarhêneran] da dikarê bibînê.\n\n== Alîkarî ji bo destpêkê ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lîsteya varîyablên konfîgûrasîyonê]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lîsteya e-nameyên versyonên nuh yê MediaWiki]"
 }
index d641d50..d8708c4 100644 (file)
@@ -1,9 +1,10 @@
 {
        "@metadata": {
                "authors": [
-                       "Universal Life"
+                       "Universal Life",
+                       "Seb35"
                ]
        },
        "mainpagetext": "'''MedyaViki ya se kureó con reuxitá.'''",
-       "mainpagedocfooter": "Konsulta la [//meta.wikimedia.org/wiki/Ayudo:Contenido Guía de usador] para tomar enformasyones encima de como usar el lojikal viki.\n\n== En Empeçando ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings La lista de los arreglamientos de la konfiggurasyón]\n* [//www.mediawiki.org/wiki/Manual:FAQ/lad DDS de MedyaViki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce La lista de las letrales (e-mail) de MedyaViki]"
+       "mainpagedocfooter": "Konsulta la [//meta.wikimedia.org/wiki/Help:Contents/es Guía de usador] para tomar enformasyones encima de como usar el lojikal viki.\n\n== En Empeçando ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings La lista de los arreglamientos de la konfiggurasyón]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/lad DDS de MedyaViki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce La lista de las letrales (e-mail) de MedyaViki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]"
 }
index 28ba1f2..08526f4 100644 (file)
@@ -40,7 +40,7 @@
        "config-help-restart": "Wëllt dir all gespäichert Donnéeë läschen déi dir bis elo aginn hutt an den Installatiounsprozess nei starten?",
        "config-restart": "Jo, neistarten",
        "config-welcome": "=== Iwwerpréifung vum Installatiounsenvironnement ===\nEt gi grondsätzlech Iwwerpréifunge gemaach fir ze kucken ob den Environnment gëeegent ass fir MediaWiki z'installéieren.\nDir sollt d'Resultater vun dëser Iwwerpréifung ugi wann Dir während der Installatioun Hëllef frot wéi Dir D'Installatioun ofschléisse kënnt.",
-       "config-sidebar": "* [//www.mediawiki.org MediaWiki Haaptsäit]\n* [//www.mediawiki.org/wiki/Help:Contents Benotzerguide]\n* [//www.mediawiki.org/wiki/Manual:Contents Guide fir Administrateuren]\n* [//www.mediawiki.org/wiki/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>Liest dëst</doclink>\n* <doclink href=ReleaseNotes>Informatioune vun der aktueller Versioun</doclink>\n* <doclink href=Copying>Lizenzbedingungen</doclink>\n* <doclink href=UpgradeDoc>Aktualisatioun</doclink>",
+       "config-sidebar": "* [//www.mediawiki.org MediaWiki Haaptsäit]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Benotzerguide]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Guide fir Administrateuren]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>Liest dëst</doclink>\n* <doclink href=ReleaseNotes>Informatioune vun der aktueller Versioun</doclink>\n* <doclink href=Copying>Lizenzbedingungen</doclink>\n* <doclink href=UpgradeDoc>Aktualisatioun</doclink>",
        "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-upload-deleted": "Repertoire fir geläscht Fichieren:",
        "config-logo": "URL vum Logo:",
        "config-instantcommons": "\"Instant Commons\" aktivéieren",
+       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] ass eng Funktioun déi et Wikien erlaabt fir Biller, Téin an aner Medien vu [//commons.wikimedia.org/ Wikimedia Commons] ze benotzen.\nFir datt dat funktionéiert brauch MediaWiki Zougang zum Internet.\n\nFir méi Informatiounen iwwer dës Funktioun, inklusiv Instruktioune wéi Dir se fir aner Wikie wéi Wikimedia Commons astelle musst, kuckt [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos d'Handbuch].",
        "config-cc-again": "Nach eng kéier eraussichen...",
        "config-advanced-settings": "Erweidert Astellungen",
        "config-extensions": "Erweiderungen",
        "config-install-mainpage-failed": "D'Haaptsäit konnt net dragesat ginn: $1",
        "config-download-localsettings": "<code>LocalSettings.php</code> eroflueden",
        "config-help": "Hëllef",
+       "config-help-tooltip": "klickt fir opzeklappen",
        "config-nofile": "De Fichier \"$1\" gouf net fonnt. Gouf e geläscht?",
        "mainpagetext": "<strong>MediaWiki gouf installéiert.</strong>",
-       "mainpagedocfooter": "Kuckt w.e.g. [//meta.wikimedia.org/wiki/Help:Contents d'Benotzerhandbuch] fir Informatiounen iwwer de Gebruach vun der Wiki Software.\n\n== Fir  unzefänken ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Hëllef bei der Konfiguratioun]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki-FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglëscht vun neie MediaWiki-Versiounen]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Lokaliséiert MediaWiki fir Är Sprooch]"
+       "mainpagedocfooter": "Kuckt w.e.g. [//meta.wikimedia.org/wiki/Help:Contents d'Benotzerhandbuch] fir Informatiounen iwwer de Gebruach vun der Wiki Software.\n\n== Fir  unzefänken ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Hëllef bei der Konfiguratioun]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki-FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglëscht vun neie MediaWiki-Versiounen]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Lokaliséiert MediaWiki fir Är Sprooch]"
 }
index 9216bfa..b4ed71b 100644 (file)
@@ -1,5 +1,5 @@
 {
        "@metadata": [],
        "mainpagetext": "'''MediaWiki es aora instalada.'''",
-       "mainpagedocfooter": "Atenda la [//meta.wikimedia.org/wiki/Help:Contents Gida per Usores] per informa supra la usa de la programa de vici.\n\n== Comensa ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista de ajustas de la desinia]\n* [//www.mediawiki.org/wiki/Manual:FAQ Demandas comun de MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista per receta anunsias de novas supra MediaWiki]"
+       "mainpagedocfooter": "Atenda la [//meta.wikimedia.org/wiki/Help:Contents Gida per Usores] per informa supra la usa de la programa de vici.\n\n== Comensa ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista de ajustas de la desinia]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Demandas comun de MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista per receta anunsias de novas supra MediaWiki]"
 }
index 107951a..27b4389 100644 (file)
@@ -5,5 +5,5 @@
                ]
        },
        "mainpagetext": "MediaWiki kati ewangidwa ku sisitemu yo",
-       "mainpagedocfooter": "Okuyiga ku nkozesa ya sofutiweya owa wiki, kebera [//meta.wikimedia.org/wiki/Help:Contents Okulagirira Abakozesa].\n\n== Amagezi agakuyamba okutandika ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lukalala lw'eby'enteekateeka yo]\n* [//www.mediawiki.org/wiki/Manual:FAQ Ebiter'okubuuzibwa ku MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Wewandise ofunenga amawulire aga email ag'ebifa ku MediaWiki]"
+       "mainpagedocfooter": "Okuyiga ku nkozesa ya sofutiweya owa wiki, kebera [//meta.wikimedia.org/wiki/Help:Contents Okulagirira Abakozesa].\n\n== Amagezi agakuyamba okutandika ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lukalala lw'eby'enteekateeka yo]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Ebiter'okubuuzibwa ku MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Wewandise ofunenga amawulire aga email ag'ebifa ku MediaWiki]"
 }
index 13a77f8..ab9c0b8 100644 (file)
@@ -1,5 +1,9 @@
 {
-       "@metadata": [],
+       "@metadata": {
+               "authors": [
+                       "Seb35"
+               ]
+       },
        "mainpagetext": "'''MediaWiki software succesvol geïnsjtalleerd.'''",
-       "mainpagedocfooter": "Raodpleeg de [//meta.wikimedia.org/wiki/NL_Help:Inhoudsopgave handjleiding] veur informatie euver 't gebroek van de wikisoftware.\n\n== Mieë hölp ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lies mit instellinge]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki VGV (FAQ)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki mailinglies veur nuuj versies]"
+       "mainpagedocfooter": "Raodpleeg de [//meta.wikimedia.org/wiki/Help:Contents Inhoudsopgave handjleiding] veur informatie euver 't gebroek van de wikisoftware.\n\n== Mieë hölp ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lies mit instellinge]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki VGV (FAQ)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki mailinglies veur nuuj versies]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]"
 }
index 112b4b5..607fc40 100644 (file)
@@ -1,11 +1,24 @@
 {
        "@metadata": {
                "authors": [
-                       "Bonevarluri"
+                       "Bonevarluri",
+                       "Mogoeilor"
                ]
        },
+       "config-information": "دونسمنيا",
        "config-your-language": "زون شما:",
        "config-wiki-language": "زون ویکی:",
        "config-page-language": "زون",
+       "config-page-welcome": "د ویکی رسانه خوش اومایت!",
+       "config-page-name": "نوم",
+       "config-page-options": "گزينه يا هنی:",
+       "config-page-install": "پورنیئن",
+       "config-page-complete": "تموم بيه!",
+       "config-page-readme": "منه بحون",
+       "config-page-copying": "د حال ورداشتن",
+       "config-page-upgradedoc": "د حالت نو کردن",
+       "config-page-existingwiki": "ویکی یایی که هئن",
+       "config-restart": "هری، دواره رئش بون",
+       "config-env-php": "پی اچ پی $1  پورسته.",
        "config-install-pg-plpgsql": "وارسی سی زون پی ال/پی جی اس کیو ال"
 }
index 07e9789..f7e4e67 100644 (file)
@@ -85,5 +85,5 @@
        "config-download-localsettings": "Atsisiųsti <code>LocalSettings.php</code>",
        "config-help": "pagalba",
        "mainpagetext": "'''MediaWiki sėkmingai įdiegta.'''",
-       "mainpagedocfooter": "Informacijos apie wiki programinės įrangos naudojimą, ieškokite [//meta.wikimedia.org/wiki/Help:Contents žinyne].\n\n== Pradžiai ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Konfigūracijos nustatymų sąrašas]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki DUK]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki pranešimai paštu apie naujas versijas]"
+       "mainpagedocfooter": "Informacijos apie wiki programinės įrangos naudojimą, ieškokite [//meta.wikimedia.org/wiki/Help:Contents žinyne].\n\n== Pradžiai ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Konfigūracijos nustatymų sąrašas]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki DUK]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki pranešimai paštu apie naujas versijas]"
 }
index 2fca7b2..4e3e31c 100644 (file)
@@ -38,5 +38,5 @@
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
        "mainpagetext": "'''MediaWiki veiksmīgi ieinstalēts'''",
-       "mainpagedocfooter": "Izlasi [//meta.wikimedia.org/wiki/Help:Contents Lietotāja pamācību], lai iegūtu vairāk informācijas par Wiki programmatūras lietošanu.\n\n== Pirmie soļi ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Konfigurācijas iespēju saraksts]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki J&A]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Parakstīties uz paziņojumiem par jaunām MediaWiki versijām]"
+       "mainpagedocfooter": "Izlasi [//meta.wikimedia.org/wiki/Help:Contents Lietotāja pamācību], lai iegūtu vairāk informācijas par Wiki programmatūras lietošanu.\n\n== Pirmie soļi ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Konfigurācijas iespēju saraksts]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki J&A]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Parakstīties uz paziņojumiem par jaunām MediaWiki versijām]"
 }
index e8eea45..4b0c692 100644 (file)
@@ -1,5 +1,5 @@
 {
        "@metadata": [],
        "mainpagetext": "'''共筆臺已立'''",
-       "mainpagedocfooter": "欲識維基,見[//meta.wikimedia.org/wiki/Help:Contents User's Guide]\n\n== 始 ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]"
+       "mainpagedocfooter": "欲識維基,見[//meta.wikimedia.org/wiki/Help:Contents User's Guide]\n\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 f9b196c..9de6ff9 100644 (file)
@@ -5,5 +5,5 @@
                ]
        },
        "mainpagetext": "'''Mediawiki dido k'ai ik'idu.'''",
-       "mainpagedocfooter": "Vik'i şeni muç'o ixmarinen ya mutxanepe oguru şeni [//meta.wikimedia.org/wiki/Help:Contents oxmaruşi rexberis] o3'k'edit.\n\n== Ağani na gyoç’k’u maxmarepe ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Ok'iduşi ayarepeşi liste]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki P'anda Na-k'itxu K'itxalape]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-mailepeşiş liste]"
+       "mainpagedocfooter": "Vik'i şeni muç'o ixmarinen ya mutxanepe oguru şeni [//meta.wikimedia.org/wiki/Help:Contents oxmaruşi rexberis] o3'k'edit.\n\n== Ağani na gyoç’k’u maxmarepe ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Ok'iduşi ayarepeşi liste]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki P'anda Na-k'itxu K'itxalape]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-mailepeşiş liste]"
 }
index 72d4d51..b52cef7 100644 (file)
@@ -5,5 +5,5 @@
                ]
        },
        "mainpagetext": "'''मीडियाविकी नीक जकाँ प्रस्थापित भेल।'''",
-       "mainpagedocfooter": "सम्पर्क करू [//meta.wikimedia.org/wiki/Help:Contents User's Guide] विकी तंत्रांशक प्रयोगक जानकारी लेल।\n\n==प्रारम्भ कोना करी==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]"
+       "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 63a8191..c6f4067 100644 (file)
@@ -1,5 +1,5 @@
 {
        "@metadata": [],
        "mainpagetext": "'''МедиаВикить арафтозь лац.'''",
-       "mainpagedocfooter": "Ванк [//meta.wikimedia.org/wiki/Help:Contents Ветямовал Тиинди] тяса ули кода содамс Вики програпнень эрявикснень колга.\n\n== Эрявикс сюлмафксне ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Васьфневи арафнематнень кярькссь]\n* [//www.mediawiki.org/wiki/Manual:FAQ МедиаВикить Сидеста Кеподеви Кизефксне]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce МедиаВикить од верзиятнень колга кулянь пачфтема]"
+       "mainpagedocfooter": "Ванк [//meta.wikimedia.org/wiki/Help:Contents Ветямовал Тиинди] тяса ули кода содамс Вики програпнень эрявикснень колга.\n\n== Эрявикс сюлмафксне ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Васьфневи арафнематнень кярькссь]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ МедиаВикить Сидеста Кеподеви Кизефксне]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce МедиаВикить од верзиятнень колга кулянь пачфтема]"
 }
index 7530ddd..53324c6 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "Jagwar"
+                       "Jagwar",
+                       "Seb35"
                ]
        },
        "config-desc": "Fandaharana mametraka an'i MediaWiki",
@@ -60,5 +61,5 @@
        "config-install-keys": "Fanamboarana lakile miafina",
        "config-help": "fanoroana",
        "mainpagetext": "'''Tafajoro soa aman-tsara ny rindrankajy Wiki.'''",
-       "mainpagedocfooter": "Vangio ny [//meta.wikimedia.org/wiki/Aide:Contenu Fanoroana ho an'ny mpampiasa] ra te hitady fanoroana momba ny fampiasan'ity rindrankajy ity.\n\n== Hanomboka amin'ny MediaWiki ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lisitra ny paramètre de configuration]\n* [//www.mediawiki.org/wiki/Manual:FAQ/fr FAQ momba ny MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Resaka momba ny fizaràn'ny MediaWiki]"
+       "mainpagedocfooter": "Vangio ny [//meta.wikimedia.org/wiki/Help:Contents/fr Fanoroana ho an'ny mpampiasa] ra te hitady fanoroana momba ny fampiasan'ity rindrankajy ity.\n\n== Hanomboka amin'ny MediaWiki ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lisitra ny paramètre de configuration]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/fr FAQ momba ny MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Resaka momba ny fizaràn'ny MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]"
 }
index 235a1bf..9af4911 100644 (file)
@@ -2,9 +2,10 @@
        "@metadata": {
                "authors": [
                        "Iwan Novirion",
-                       "Luthfi94"
+                       "Luthfi94",
+                       "Seb35"
                ]
        },
        "mainpagetext": "'''MediaWiki alah tapasang jo sukses'''.",
-       "mainpagedocfooter": "Konsultasian [//meta.wikimedia.org/wiki/Help:Contents/min Panduan Panggunoan] untuak informasi caro panggunoan parangkaik lunak wiki.\n\n== Mamulai panggunoan ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings/id Daftar pangaturan konfigurasi]\n* [//www.mediawiki.org/wiki/Manual:FAQ/id Daftar patanyoan nan acok diajukan manganai MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Milis rilis MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Palokalan MediaWiki untuak bahaso Sanak]"
+       "mainpagedocfooter": "Konsultasian [//meta.wikimedia.org/wiki/Help:Contents Panduan Panggunoan] untuak informasi caro panggunoan parangkaik lunak wiki.\n\n== Mamulai panggunoan ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings/id Daftar pangaturan konfigurasi]\n* [//www.mediawiki.org/wiki/Manual:FAQ/id Daftar patanyoan nan acok diajukan manganai MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Milis rilis MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Palokalan MediaWiki untuak bahaso Sanak]"
 }
index a824241..e236af5 100644 (file)
@@ -15,9 +15,9 @@
        "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-session-expired": "Вашите сесиски податоци истекоа.\nПоставките на сесиите траат $1.\nНивниот рок можете да го зголемите со задавање на <code>session.gc_maxlifetime</code> во php.ini.\nПочнете ја воспоставката одново.",
-       "config-no-session": "Ð\92аÑ\88иÑ\82е Ñ\81еÑ\81иÑ\81ки Ð¿Ð¾Ð´Ð°Ñ\82оÑ\86и се изгубени!\nПогледајте во php.ini дали <code>session.save_path</code> е поставен во правилна папка.",
+       "config-session-error": "Грешка при започнување на седницата: $1",
+       "config-session-expired": "Вашите податоци од седницата истекоа.\nПоставките на седниците траат $1.\nНивниот рок можете да го зголемите со задавање на <code>session.gc_maxlifetime</code> во php.ini.\nПочнете ја воспоставката одново.",
+       "config-no-session": "Ð\9fодаÑ\82оÑ\86иÑ\82е Ð¾Ð´ Ñ\81едниÑ\86аÑ\82а се изгубени!\nПогледајте во php.ini дали <code>session.save_path</code> е поставен во правилна папка.",
        "config-your-language": "Вашиот јазик:",
        "config-your-language-help": "Одберете на кој јазик да се одвива воспоставката.",
        "config-wiki-language": "Јазик на викито:",
        "config-restart": "Да, почни одново",
        "config-welcome": "=== Проверки на околината ===\nСега ќе се извршиме основни проверки за да се востанови дали околината е погодна за воспоставкa на МедијаВики. Не заборавајте да ги приложите овие информации ако барате помош со довршување на воспоставката.",
        "config-copyright": "=== Авторски права и услови ===\n\n$1\n\nОва е слободна програмска опрема (free software); можете да го редистрибуирате и/или менувате согласно условите на ГНУ-овата општа јавна лиценца (GNU General Public License) на Фондацијата за слободна програмска опрема (Free Software Foundation); верзија 2 или било која понова верзија на лиценцата (по ваш избор).\n\nОвој програм се нуди со надеж дека ќе биде корисен, но '''без никаква гаранција'''; дури ни подразбраната гаранција за '''продажна способност''' или '''погодност за определена цел'''.\nПовеќе информации ќе најдете во текстот на ГНУ-овата општа јавна лиценца.\n\nБи требало да имате добиено <doclink href=Copying>примерок од ГНУ-овата општа јавна лиценца</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/Help:Contents Водич за корисници]\n* [//www.mediawiki.org/wiki/Manual:Contents Водич за администратори]\n* [//www.mediawiki.org/wiki/Manual:FAQ ЧПП]\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 Домашна страница на МедијаВики]\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": "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\nАко имате високопрометно мрежно место, тогаш ќе треба да прочитате повеќе за [//www.mediawiki.org/wiki/Unicode_normalization_considerations уникодната нормализација].",
-       "config-unicode-update-warning": "'''Предупредување:''' Воспоставената верзија на обвивката за уникодна нормализација користи постара верзија на библиотеката на [http://site.icu-project.org/ проектот ICU].\nЗа да користите Уникод, ќе треба да направите [//www.mediawiki.org/wiki/Unicode_normalization_considerations надградба].",
+       "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-unicode-update-warning": "'''Предупредување:''' Воспоставената верзија на обвивката за уникодна нормализација користи постара верзија на библиотеката на [http://site.icu-project.org/ проектот ICU].\nЗа да користите Уникод, ќе треба да направите [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations надградба].",
        "config-no-db": "Не можев да најдам соодветен двигател за базата на податоци! Ќе треба да воспоставите двигател за PHP-база.\nПоддржани се следниве видови бази: $1.\n\nДоколку самите го срочивте овој PHP, овозможете го базниот клиент во поставките — на пр. со <code>./configure --with-mysqli</code>.\nАко овој PHP го воспоставите од пакет на Debian или Ubuntu, тогаш ќе треба исто така да го воспоставите, на пр., пакетот <code>php5-mysql</code>.",
        "config-outdated-sqlite": "'''Предупредување''': имате SQLite $1. Најстарата допуштена верзија е $2. Затоа, SQLite ќе биде недостапен.",
        "config-no-fts3": "'''Предупредување''': SQLite iе составен без модулот [//sqlite.org/fts3.html FTS3] - за оваа база нема да има можност за пребарување.",
@@ -82,7 +82,7 @@
        "config-no-cli-uri": "'''Предупредување''': Нема наведено <code>--scriptpath</code>. Ќе се користи основниот: <code>$1</code>.",
        "config-using-server": "Користите опслужувач под името „<nowiki>$1</nowiki>“.",
        "config-using-uri": "Користите опслужувач со URL-адреса „<nowiki>$1$2</nowiki>“.",
-       "config-uploads-not-safe": "'''Предупредување:''' Вашата матична папка за подигање <code>$1</code> е подложна на извршување (пуштање) на произволни скрипти.\nИако МедијаВики врши безбедносни проверки на сите подигнати податотеки, ве советуваме [//www.mediawiki.org/wiki/Manual:Security#Upload_security да ја затворите оваа безбедносна дупка] пред да овозможите подигање.",
+       "config-uploads-not-safe": "'''Предупредување:''' Вашата матична папка за подигање <code>$1</code> е подложна на извршување (пуштање) на произволни скрипти.\nИако МедијаВики врши безбедносни проверки на сите подигнати податотеки, ве советуваме [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security да ја затворите оваа безбедносна дупка] пред да овозможите подигање.",
        "config-no-cli-uploads-check": "'''Предупредување:''' Вашата основна папка за подигања (<code>$1</code>) не е проверена дали е подложна\nпроизволно извршување на скрипти во текот на воспоставката на посредникот на повикувачко ниво (CLI).",
        "config-brokenlibxml": "Вашиот систем има комбинација од PHP и libxml2 верзии и затоа има грешки и може да предизвика скриено расипување на податоците кај МедијаВики и други мрежни програми.\nНадградете го на libxml2 2.7.3 или нивни понови верзии! ([https://bugs.php.net/bug.php?id=45996 грешката е заведена во PHP]). Воспоставката е откажана.",
        "config-suhosin-max-value-length": "Suhosin е воспоставен и ја ограничува должината на параметарот GET на $1 бајти. Делот ResourceLoader на МедијаВики ќе ја заобиколува ова граница, но со тоа ќе се влоши делотворноста. Ако е воопшто можно, на <code>suhosin.get.max_value_length</code> треба да го наместите на 1024 или повеќе во <code>php.ini</code>, и да му ја зададете истата вредност на <code>$wgResourceLoaderMaxQueryLength</code> во <code>LocalSettings.php</code>.",
        "config-profile-no-anon": "Задолжително отворање сметка",
        "config-profile-fishbowl": "Само овластени уредници",
        "config-profile-private": "Лично вики",
-       "config-profile-help": "Викијата функционираат најдобро кога имаат што повеќе уредници.\nВо МедијаВики лесно се проверуваат скорешните промени, и лесно се исправа (технички: „враќа“) штетата направена од неупатени или злонамерни корисници.\n\nМногумина имаат најдено најразлични полезни примени за МедијаВики, но понекогаш не е лесно да убедите некого во предностите на вики-концептот.\nЗначи имате избор.\n\n'''{{int:config-profile-wiki}}''' — модел според кој секој може да уредува, дури и без најавување.\nАко имате вики со '''задолжително отворање на сметка''', тогаш добивате повеќе контрола, но ова може даги одврати спонтаните учесници.\n\n'''{{int:config-profile-fishbowl}}''' — може да уредуваат само уредници што имаат добиено дозвола за тоа, но јавноста може да ги гледа страниците, вклучувајќи ја нивната историја.\n'''{{int:config-profile-private}}''' — страниците се видливи и уредливи само за овластени корисници.\n\nПо воспоставката имате на избор и посложени кориснички права и поставки. Погледајте во [//www.mediawiki.org/wiki/Manual:User_rights прирачникот].",
+       "config-profile-help": "Викијата функционираат најдобро кога имаат што повеќе уредници.\nВо МедијаВики лесно се проверуваат скорешните промени, и лесно се исправа (технички: „враќа“) штетата направена од неупатени или злонамерни корисници.\n\nМногумина имаат најдено најразлични полезни примени за МедијаВики, но понекогаш не е лесно да убедите некого во предностите на вики-концептот.\nЗначи имате избор.\n\n'''{{int:config-profile-wiki}}''' — модел според кој секој може да уредува, дури и без најавување.\nАко имате вики со '''задолжително отворање на сметка''', тогаш добивате повеќе контрола, но ова може даги одврати спонтаните учесници.\n\n'''{{int:config-profile-fishbowl}}''' — може да уредуваат само уредници што имаат добиено дозвола за тоа, но јавноста може да ги гледа страниците, вклучувајќи ја нивната историја.\n'''{{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-email-sender-help": "Внесете ја е-поштенската адреса што ќе се користи како повратна адреса за излезна е-пошта.\nТаму ќе се испраќаат вратените (непримени) писма.\nМногу поштенски опслужувачи бараат барем делот за доменско име да биде важечки.",
        "config-upload-settings": "Подигање на слики и податотеки",
        "config-upload-enable": "Овозможи подигање на податотеки",
-       "config-upload-help": "Подигањето на податотеки потенцијално го изложуваат вашиот опслужувач на безбедносни ризици.\nЗа повеќе информации, прочитајте го [//www.mediawiki.org/wiki/Manual:Security поглавието за безбедност] во прирачникот.\n\nЗа да овозможите подигање на податотеки, сменете го режимот на потпапката <code>images</code> во основната папка на МедијаВики, за да му овозможите на мрежниот опслужувач да запишува во неа.\nПотоа овозможете ја оваа функција.",
+       "config-upload-help": "Подигањето на податотеки потенцијално го изложуваат вашиот опслужувач на безбедносни ризици.\nЗа повеќе информации, прочитајте го [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security поглавието за безбедност] во прирачникот.\n\nЗа да овозможите подигање на податотеки, сменете го режимот на потпапката <code>images</code> во основната папка на МедијаВики, за да му овозможите на мрежниот опслужувач да запишува во неа.\nПотоа овозможете ја оваа функција.",
        "config-upload-deleted": "Папка за избришаните податотеки:",
        "config-upload-deleted-help": "Одберете во која папка да се архивираат избришаните податотеки.\nНајдобро би било ако таа не е достапна преку семрежјето.",
        "config-logo": "URL за логото:",
        "config-logo-help": "Матичното руво на МедијаВики има простор за лого од 135x160 пиксели над страничната лента.\n\nМожете да употребите <code>$wgStylePath</code> или <code>$wgScriptPath</code> ако вашето лого е релативно на тие патеки.\n\nАко не сакате да имате лого, тогаш оставете го ова поле празно.",
        "config-instantcommons": "Овозможи Instant Commons",
-       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] е функција која им овозможува на викијата да користат слики, звучни записи и други мултимедијални содржини од [//commons.wikimedia.org/ Ризницата].\nЗа да може ова да работи, МедијаВики бара пристап до семрежјето.\n\nЗа повеќе информации за оваа функција и напатствија за нејзино поставување на вики (сите други освен Ризницата), коносултирајте го [//mediawiki.org/wiki/Manual:$wgForeignFileRepos прирачникот].",
+       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] е функција која им овозможува на викијата да користат слики, звучни записи и други мултимедијални содржини од [//commons.wikimedia.org/ Ризницата].\nЗа да може ова да работи, МедијаВики бара пристап до семрежјето.\n\nЗа повеќе информации за оваа функција и напатствија за нејзино поставување на вики (сите други освен Ризницата), коносултирајте го [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos прирачникот].",
        "config-cc-error": "Изборникот на лиценци од Криејтив комонс не даде резултати.\nВнесете го името на лиценцата рачно.",
        "config-cc-again": "Одберете повторно...",
        "config-cc-not-chosen": "Одберете ја саканата лиценца од Криејтив комонс и стиснете на „продолжи“.",
        "config-insecure-keys": "'''Предупредување:''' {{PLURAL:$2|Безбедносниот клуч $1 создаден во текот на воспоставката не е сосем безбеден|Безбедносните клучеви $1 создадени во текот на воспоставката не се сосем безбедни}}. Ви препорачуваме да {{PLURAL:$2|го|ги}} смените рачно.",
        "config-install-sysop": "Создавање на администраторска корисничка сметка",
        "config-install-subscribe-fail": "Не можам да ве претплатам на известувањето mediawiki-announce: $1",
-       "config-install-subscribe-notpossible": "cURL не е воспоставен, а allow_url_fopen не е достапно.",
+       "config-install-subscribe-notpossible": "cURL не е воспоставен, а <code>allow_url_fopen</code> не е достапно.",
        "config-install-mainpage": "Создавам главна страница со стандардна содржина",
        "config-install-extension-tables": "Изработка на табели за овозможени додатоци",
        "config-install-mainpage-failed": "Не можев да вметнам главна страница: $1",
        "config-install-done": "'''Честитаме!'''\nУспешно го воспоставивте МедијаВики.\n\nВоспоставувачот создаде податотека <code>LocalSettings.php</code>.\nТаму се содржат сите ваши нагодувања.\n\nЌе треба да ја преземете и да ја ставите во основата на воспоставката (истата папка во која се наоѓа index.php). Преземањето треба да е започнато автоматски.\n\nАко не ви е понудено преземање, или пак ако сте го откажале, можете да го почнете одново стискајќи на следнава врска:\n\n$3\n\n'''Напомена''': Ако ова не го направите сега, податотеката со поставки повеќе нема да биде на достапна.\n\nОткога ќе завршите со тоа, можете да '''[$2 влезете на вашето вики]'''.",
        "config-download-localsettings": "Преземи го <code>LocalSettings.php</code>",
        "config-help": "помош",
+       "config-help-tooltip": "стиснете да расклопите",
        "config-nofile": "Податотеката „$1“ не е пронајдена. Да не е избришана?",
-       "config-extension-link": "Дали сте знаеле дека вашето вики поддржува [//www.mediawiki.org/wiki/Manual:Extensions додатоци]?\n\nМожете да ги прелистате [//www.mediawiki.org/wiki/Category:Extensions_by_category по категории] или да ја посетите [//www.mediawiki.org/wiki/Extension_Matrix матрицата], каде ќе најдете полн список на додатоци.",
+       "config-extension-link": "Дали сте знаеле дека вашето вики поддржува [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions додатоци]?\n\nМожете да ги прелистате [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category по категории]",
        "mainpagetext": "'''МедијаВики е успешно воспоставен.'''",
-       "mainpagedocfooter": "Погледнете го [//meta.wikimedia.org/wiki/Help:Contents Упатството за корисници] за подетални иформации како се користи вики-програмот.\n\n==Од каде да почнете==\n* [//meta.wikimedia.org/wiki/Manual:Configuration_settings Список на нагодувања]\n* [//meta.wikimedia.org/wiki/Manual:FAQ ЧПП (често поставувани прашања) за МедијаВики].\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Поштенски список на МедијаВики за нови верзии]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Локализирајте го МедијаВики на вашиот јазик]"
+       "mainpagedocfooter": "Погледнете го [//meta.wikimedia.org/wiki/Help:Contents Упатството за корисници] за подетални иформации како се користи вики-програмот.\n\n==Од каде да почнете==\n* [//meta.wikimedia.org/wiki/Manual:Configuration_settings Список на нагодувања]\n* [//meta.wikimedia.org/wiki/Manual:FAQ ЧПП (често поставувани прашања) за МедијаВики].\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Поштенски список на МедијаВики за нови верзии]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Локализирајте го МедијаВики на вашиот јазик]"
 }
index 6602113..04c2890 100644 (file)
@@ -34,7 +34,7 @@
        "config-page-upgradedoc": "അപ്‌ഗ്രേഡിങ്",
        "config-help-restart": "ഇതുവരെ ഉൾപ്പെടുത്തിയ എല്ലാവിവരങ്ങളും ഒഴിവാക്കാനും ഇൻസ്റ്റലേഷൻ പ്രക്രിയ നിർത്തി-വീണ്ടുമാരംഭിക്കാനും താങ്കളാഗ്രഹിക്കുന്നുണ്ടോ?",
        "config-restart": "അതെ, പുനർപ്രവർത്തിപ്പിക്കുക",
-       "config-sidebar": "* [//www.mediawiki.org മീഡിയവിക്കി പ്രധാനതാൾ]\n* [//www.mediawiki.org/wiki/Help:Contents ഉപയോക്തൃസഹായി]\n* [//www.mediawiki.org/wiki/Manual:Contents കാര്യനിർവഹണസഹായി]\n* [//www.mediawiki.org/wiki/Manual:FAQ പതിവുചോദ്യങ്ങൾ]",
+       "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 പതിവുചോദ്യങ്ങൾ]",
        "config-env-php": "പി.എച്ച്.പി. $1 ഇൻസ്റ്റോൾ ചെയ്തിട്ടുണ്ട്.",
        "config-no-db": "അനുയോജ്യമായ ഡേറ്റാബേസ് ഡ്രൈവർ കണ്ടെത്താനായില്ല!",
        "config-memory-raised": "പി.എച്ച്.പി.യുടെ <code>memory_limit</code> $1 ആണ്, $2 ആയി ഉയർത്തിയിരിക്കുന്നു.",
        "config-install-mainpage-failed": "പ്രധാന താൾ ഉൾപ്പെടുത്താൻ കഴിഞ്ഞില്ല: $1",
        "config-install-done": "'''അഭിനന്ദനങ്ങൾ!'''\nതാങ്കൾ വിജയകരമായി മീഡിയവിക്കി സജ്ജീകരിച്ചിരിക്കുന്നു.\n\nഇൻസ്റ്റോളർ താങ്കളുടെ എല്ലാ ക്രമീകരണങ്ങളുമടങ്ങുന്ന <code>LocalSettings.php</code> ഫയൽ സൃഷ്ടിച്ചിട്ടുണ്ട്.\n\nപ്രസ്തുത പ്രമാണം ഡൗൺലോഡ് ചെയ്ത് താങ്കളുടെ വിക്കി സജ്ജീകരണത്തിന്റെ അടിസ്ഥാന ഡയറക്റ്ററിയിൽ ഇടേണ്ടതാണ് (index.php കിടക്കുന്ന അതേ ഡയറക്റ്ററിയിൽ). ഡൗൺലോഡിങ്ങ് സ്വയം ആരംഭിക്കുന്നതാണ്. ഡൗൺലോഡിങ്ങ് സ്വയം തുടങ്ങാതിരിക്കുകയോ, താങ്കൾ റദ്ദാക്കുകയോ ചെയ്ത പക്ഷം താഴെ കാണുന്ന കണ്ണിയിൽ ഞെക്കുക:\n$3\n\n'''ശ്രദ്ധിക്കുക''': താങ്കൾ ഇപ്പോൾ ചെയ്തില്ലെങ്കിൽ, ഫയൽ എടുക്കാതെ ഇൻസ്റ്റലേഷൻ പ്രക്രിയയിൽ നിന്ന് പുറത്തിറങ്ങിയാൽ, സൃഷ്ടിക്കപ്പെട്ട ക്രമീകരണങ്ങളടങ്ങുന്ന പ്രമാണം പിന്നീട് ലഭ്യമായിരിക്കില്ല.\n\nമുകളിൽ പറഞ്ഞ പ്രകാരം ചെയ്തു കഴിഞ്ഞാൽ, താങ്കൾക്ക് '''[$2 വിക്കിയിൽ പ്രവേശിക്കാവുന്നതാണ്]'''.",
        "mainpagetext": "'''മീഡിയവിക്കി വിജയകരമായി സജ്ജീകരിച്ചിരിക്കുന്നു.'''",
-       "mainpagedocfooter": "വിക്കി സോഫ്റ്റ്‌വെയർ ഉപയോഗിക്കുന്നതിനെ കുറിച്ചുള്ള വിശദാംശങ്ങൾക്ക്  [//meta.wikimedia.org/wiki/Help:Contents സോഫ്റ്റ്‌വെയർ സഹായി] കാണുക.\n\n== പ്രാരംഭസഹായികൾ ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings ക്രമീകരണങ്ങളുടെ പട്ടിക]\n* [//www.mediawiki.org/wiki/Manual:FAQ മീഡിയവിക്കി പതിവുചോദ്യങ്ങൾ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce മീഡിയവിക്കി പ്രകാശന മെയിലിങ് ലിസ്റ്റ്]"
+       "mainpagedocfooter": "വിക്കി സോഫ്റ്റ്‌വെയർ ഉപയോഗിക്കുന്നതിനെ കുറിച്ചുള്ള വിശദാംശങ്ങൾക്ക്  [//meta.wikimedia.org/wiki/Help:Contents സോഫ്റ്റ്‌വെയർ സഹായി] കാണുക.\n\n== പ്രാരംഭസഹായികൾ ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings ക്രമീകരണങ്ങളുടെ പട്ടിക]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ മീഡിയവിക്കി പതിവുചോദ്യങ്ങൾ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce മീഡിയവിക്കി പ്രകാശന മെയിലിങ് ലിസ്റ്റ്]"
 }
index 2ce7534..c3a7289 100644 (file)
@@ -6,5 +6,5 @@
        },
        "config-page-language": "Хэл",
        "mainpagetext": "'''МедиаВики амжилттай суулаа.'''",
-       "mainpagedocfooter": "Вики программыг хэрэглэх талаар заавар авахын тулд [//meta.wikimedia.org/wiki/Help:Contents хэрэглэгчийн гарын авлага]-г үзнэ үү.\n\n== Эхлэх ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Тохиргоо]\n* [//www.mediawiki.org/wiki/Manual:FAQ МедиаВикигийн тогтмол тавигддаг асуултууд]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce МедиаВикигийн мэдээний мэйл явуулах жагсаалт]"
+       "mainpagedocfooter": "Вики программыг хэрэглэх талаар заавар авахын тулд [//meta.wikimedia.org/wiki/Help:Contents хэрэглэгчийн гарын авлага]-г үзнэ үү.\n\n== Эхлэх ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Тохиргоо]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ МедиаВикигийн тогтмол тавигддаг асуултууд]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce МедиаВикигийн мэдээний мэйл явуулах жагсаалт]"
 }
index e84cec0..632951b 100644 (file)
@@ -58,5 +58,5 @@
        "config-install-tables-failed": "<strong>त्रूटी:</strong>खालील त्रूटीमुळे सारणी बनविणे अयशस्वी:$1",
        "config-help": "साहाय्य",
        "mainpagetext": "'''मीडियाविकीचे इन्स्टॉलेशन पूर्ण.'''",
-       "mainpagedocfooter": "विकी सॉफ्टवेअर वापरण्याकरिता [//meta.wikimedia.org/wiki/Help:Contents यूजर गाईड] पहा.\n\n== सुरुवात ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings कॉन्फिगरेशन सेटींगची यादी]\n* [//www.mediawiki.org/wiki/Manual:FAQ मीडियाविकी नेहमी विचारले जाणारे प्रश्न]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce मीडियाविकि मेलिंग लिस्ट]"
+       "mainpagedocfooter": "विकी सॉफ्टवेअर वापरण्याकरिता [//meta.wikimedia.org/wiki/Help:Contents यूजर गाईड] पहा.\n\n== सुरुवात ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings कॉन्फिगरेशन सेटींगची यादी]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ मीडियाविकी नेहमी विचारले जाणारे प्रश्न]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce मीडियाविकि मेलिंग लिस्ट]"
 }
index f50fa03..33817c2 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Anakmalaysia",
                        "Pizza1016",
-                       "SNN95"
+                       "SNN95",
+                       "MaxSem"
                ]
        },
        "config-desc": "Pemasang MediaWiki",
        "config-help-restart": "Adakah anda ingin untuk membersihkan semua data yang disimpan yang anda telah masukkan dan memulakan semula proses pemasangan?",
        "config-restart": "Ya, mula semula",
        "config-welcome": "=== Pemeriksaan persekitaran ===\nPemeriksaan asas kini boleh dilakukan untuk melihat jika persekitaran ini adalah sesuai untuk pemasangan MediaWiki.\nIngat untuk memasukkan maklumat ini jika anda mahukan sokongan tentang bagaimana untuk menyelesaikan pemasangan.",
-       "config-copyright": "=== Hakcipta dan terma ===\n\n$1\n\nProgram ini merupakan perisian bebas; anda boleh mengedarkannya semula dan/atau mengubahsuainya di bawah syarat-syarat Lesen Awam GNU seperti yang diterbitkan oleh Yayasan Perisian Bebas; sama ada versi 2 Lesen ini atau (mengikut pilihan anda) mana-mana versi selepas ini.\n\nProgram ini diedarkan dengan harapan bahawa ia akan menjadi berguna, tetapi '''tanpa sebarang waranti'''; tanpa jaminan yang tersirat '''kebolehdagangan''' atau '''kesesuaian untuk tujuan tertentu'''.\nLihat Lesen Awam GNU untuk maklumat lanjut.\n\nAnda perlu terima <doclink href=Copying> satu salinan Lesen Awam GNU </ doclink> bersama-sama dengan program ini, jika tidak, menulis surat kepada Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, atau [http://www.gnu.org/copyleft/gpl.html membacanya dalam talian].",
-       "config-sidebar": "* [//www.mediawiki.org Laman utama MediaWiki]\n* [//www.mediawiki.org/wiki/Help:Contents Panduan Pengguna]\n* [//www.mediawiki.org/wiki/Manual:Contents Panduan Pentadbir]\n* [//www.mediawiki.org/wiki/Manual:FAQ Soalan lazim]\n----\n* <doclink href=Readme>Baca saya</doclink>\n* <doclink href=ReleaseNotes>Nota keluaran</doclink>\n* <doclink href=Copying>Menyalin</doclink>\n* <doclink href=UpgradeDoc>Menaik taraf</doclink>",
+       "config-copyright": "=== Hakcipta dan Syarat-Syarat ===\n\n$1\n\nProgram ini merupakan perisian bebas; anda boleh mengedarkannya semula dan/atau mengubahsuainya di bawah syarat-syarat Lesen Awam GNU seperti yang diterbitkan oleh Yayasan Perisian Bebas; sama ada versi 2 Lesen ini atau (mengikut pilihan anda) mana-mana versi selepas ini.\n\nProgram ini diedarkan dengan harapan bahawa ia akan menjadi berguna, tetapi '''tanpa sebarang waranti'''; tanpa jaminan yang tersirat '''kebolehdagangan''' atau '''kesesuaian untuk tujuan tertentu'''.\nLihat Lesen Awam GNU untuk maklumat lanjut.\n\nAnda sepatutnya telah menerima <doclink href=Copying> satu salinan Lesen Awam GNU </doclink> bersama-sama dengan program ini, jika tidak, menulis surat kepada Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, atau [http://www.gnu.org/copyleft/gpl.html membacanya dalam talian].",
+       "config-sidebar": "* [//www.mediawiki.org Laman utama MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Panduan Pengguna]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Panduan Pentadbir]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Soalan lazim]\n----\n* <doclink href=Readme>Baca saya</doclink>\n* <doclink href=ReleaseNotes>Nota keluaran</doclink>\n* <doclink href=Copying>Menyalin</doclink>\n* <doclink href=UpgradeDoc>Menaik taraf</doclink>",
        "config-env-good": "Persekitaran telah diperiksa.\nAnda boleh memasang MediaWiki.",
        "config-env-bad": "Persekitaran telah diperiksa. \nAnda tidak boleh memasang MediaWiki.",
        "config-env-php": "PHP $1 dipasang.",
        "config-env-php-toolow": "PHP $1 dipasang.\nBagaimanapun, MediaWiki memerlukan PHP $2 ke atas.",
        "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/Unicode_normalization_considerations menaik taraf] jika Unicode penting bagi anda.",
+       "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-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-register-globals": "<strong>Amaran: Pilihan <code>[http://php.net/register_globals register_globals]</code> PHP dihidupkan.\nMatikannya jika boleh.</strong>\nMediaWiki boleh digunakan, tetapi pelayan anda akan terdedah kepada kemungkinan kerentanan keselamatan.",
        "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-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-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/Manual:Configuration_settings Senarai tetapan konfigurasi]\n* [//www.mediawiki.org/wiki/Manual:FAQ Soalan Lazim MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Senarai surat keluaran MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Terjemahkan MediaWiki ke dalam bahasa anda]"
+       "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 07269e5..0a84d87 100644 (file)
@@ -84,5 +84,5 @@
        "config-help": "għajnuna",
        "config-nofile": "Il-fajl \"$1\" ma setax jinstab. Dan ġie mħassar?",
        "mainpagetext": "'''MediaWiki ġie installat b'suċċess.'''",
-       "mainpagedocfooter": "Ikkonsulta l-[//meta.wikimedia.org/wiki/Help:Contents Gwida għall-utenti] sabiex tikseb iktar informazzjoni dwar kif tuża' s-softwer tal-wiki.\n\n== Biex tibda ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista ta' preferenzi għall-konfigurazzjoni]\n* [//www.mediawiki.org/wiki/Manual:FAQ Mistoqsijiet rikorrenti fuq il-MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Il-lista tal-posta tħabbar 'l MediaWiki]"
+       "mainpagedocfooter": "Ikkonsulta l-[//meta.wikimedia.org/wiki/Help:Contents Gwida għall-utenti] sabiex tikseb iktar informazzjoni dwar kif tuża' s-softwer tal-wiki.\n\n== Biex tibda ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista ta' preferenzi għall-konfigurazzjoni]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Mistoqsijiet rikorrenti fuq il-MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Il-lista tal-posta tħabbar 'l MediaWiki]"
 }
index 0860a68..2b80e15 100644 (file)
@@ -42,5 +42,5 @@
        "config-restart": "是,重來",
        "config-welcome": "=== 環境檢測 ===\n這馬欲做基本的檢測,看環境是毋是適合裝 MediaWiki。\n若你愛有支援,才裝會起來,請共遮的資訊記起來。",
        "mainpagetext": "'''MediaWiki已經裝好矣。'''",
-       "mainpagedocfooter": "請查看[//meta.wikimedia.org/wiki/Help:Contents 用者說明書]的資料通使用wiki 軟體\n\n== 入門 ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings 配置的設定]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki時常問答]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki的公布列單]"
+       "mainpagedocfooter": "請查看[//meta.wikimedia.org/wiki/Help:Contents 用者說明書]的資料通使用wiki 軟體\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 9a7d659..c95e9df 100644 (file)
@@ -4,7 +4,8 @@
                        "Event",
                        "Nghtwlkr",
                        "아라",
-                       "Danmichaelo"
+                       "Danmichaelo",
+                       "Jeblad"
                ]
        },
        "config-desc": "Installasjonsprogrammet for MediaWiki",
        "config-restart": "Ja, start på nytt",
        "config-welcome": "=== Miljøsjekker ===\nGrunnleggende sjekker utføres for å se om dette miljøet er egnet for en MediaWiki-installasjon.\nDu bør oppgi resultatene fra disse sjekkene om du trenger hjelp under installasjonen.",
        "config-copyright": "=== Opphavsrett og vilkår ===\n\n$1\n\nMediaWiki er fri programvare; du kan redistribuere det og/eller modifisere det under betingelsene i GNU General Public License som publisert av Free Software Foundation; enten versjon 2 av lisensen, eller (etter eget valg) enhver senere versjon.\n\nDette programmet er distribuert i håp om at det vil være nyttig, men '''uten noen garanti'''; ikke engang implisitt garanti av '''salgbarhet''' eller '''egnethet for et bestemt formål'''.\nSe GNU General Public License for flere detaljer.\n\nDu skal ha mottatt <doclink href=Copying>en kopi av GNU General Public License</doclink> sammen med dette programmet; hvis ikke, skriv til Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA eller [http://www.gnu.org/copyleft/gpl.html les det på nettet].",
-       "config-sidebar": "* [//www.mediawiki.org MediaWiki hjem]\n* [//www.mediawiki.org/wiki/Help:Contents Brukerguide]\n* [//www.mediawiki.org/wiki/Manual:Contents Administratorguide]\n* [//www.mediawiki.org/wiki/Manual:FAQ OSS]\n----\n* <doclink href=Readme>Les meg</doclink>\n* <doclink href=ReleaseNotes>Utgivelsesnotater</doclink>\n* <doclink href=Copying>Kopiering</doclink>\n* <doclink href=UpgradeDoc>Oppgradering</doclink>",
+       "config-sidebar": "* [//www.mediawiki.org MediaWiki hjem]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Brukerguide]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Administratorguide]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ OSS]\n----\n* <doclink href=Readme>Les meg</doclink>\n* <doclink href=ReleaseNotes>Utgivelsesnotater</doclink>\n* <doclink href=Copying>Kopiering</doclink>\n* <doclink href=UpgradeDoc>Oppgradering</doclink>",
        "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-php-toolow": "PHP $1 er installert.\nMediaWiki krever imidlertid PHP $2 eller høyere.",
        "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/Unicode_normalization_considerations Unicode-normalisering].",
-       "config-unicode-update-warning": "'''Advarsel''': Den installerte versjonen av Unicode-normalisereren bruker en eldre versjon av [http://site.icu-project.org/ ICU-prosjektets] bibliotek.\nDu bør [//www.mediawiki.org/wiki/Unicode_normalization_considerations oppgradere] om du er bekymret for å bruke Unicode.",
+       "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].",
+       "config-unicode-update-warning": "'''Advarsel''': Den installerte versjonen av Unicode-normalisereren bruker en eldre versjon av [http://site.icu-project.org/ ICU-prosjektets] bibliotek.\nDu bør [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations oppgradere] om du er bekymret for å bruke Unicode.",
        "config-no-db": "Fant ingen passende databasedriver! Du må installere en databasedriver for PHP.\nFølgende databasetyper støttes: $1\n\nOm du kompilerte PHP selv, rekonfigurer den med en aktivert databaseklient, for eksempel ved å bruke <code>./configure --with-mysql</code>.\nOm du installerte PHP fra en Debian- eller Ubuntu-pakke, må du også installere for eksempel <code>php5-mysql</code>-pakken.",
        "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.",
@@ -84,7 +85,7 @@
        "config-no-cli-uri": "'''Advarsel''': Ingen <code>--scriptpath</code> er angitt; bruker standard: <code>$1</code>.",
        "config-using-server": "Bruker servernavnet  \"<nowiki>$1</nowiki>\".",
        "config-using-uri": "Bruker server-URL \"<nowiki>$1$2</nowiki>\".",
-       "config-uploads-not-safe": "'''Advarsel:''' Din standardmappe for opplastinger <code>$1</code> er sårbar for kjøring av vilkårlige skript.\nSelv om MediaWiki sjekker alle opplastede filer for sikkerhetstrusler er det sterkt anbefalt å [//www.mediawiki.org/wiki/Manual:Security#Upload_security lukke denne sikkerhetssårbarheten] før du aktiverer opplastinger.",
+       "config-uploads-not-safe": "'''Advarsel:''' Din standardmappe for opplastinger <code>$1</code> er sårbar for kjøring av vilkårlige skript.\nSelv om MediaWiki sjekker alle opplastede filer for sikkerhetstrusler er det sterkt anbefalt å [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security lukke denne sikkerhetssårbarheten] før du aktiverer opplastinger.",
        "config-no-cli-uploads-check": "'''Advarsel:''' Din standard-katalog for opplastinger (<code>$1</code>) er ikke kontrollert for sårbarhet overfor vilkårlig skript-kjøring under CLI-installasjonen.",
        "config-brokenlibxml": "Ditt system bruker en kombinasjon av PHP- og libxml2-versjoner som har feil og kan forårsake skjult dataødeleggelse i MediaWiki og andre web-applikasjoner.\nOppgrader til libxml2 2.7.3 eller nyere ([https://bugs.php.net/bug.php?id=45996 Feil-liste for PHP]).\nInstalleringen ble abortert.",
        "config-suhosin-max-value-length": "Suhosin er installert og begrenser GET-parameterlengder til $1 bytes. MediaWiki sin ResourceLoader-komponent klarer å komme rundt denne begrensningen, men med redusert ytelse. Om mulig bør du sette <code>suhosin.get.max_value_length</code> til minst 1024 i <code>php.ini</code>, og sette <code>$wgResourceLoaderMaxQueryLength</code> til samme verdi i <code>LocalSettings.php</code>.",
        "config-db-username": "Databasebrukernavn:",
        "config-db-password": "Databasepassord:",
        "config-db-password-empty": "Skriv inn et passord for den nye databasebrukeren: $1.\nDet er mulig å opprette brukere uten passord, men dette er ikke sikkert.",
+       "config-db-username-empty": "Du må skrive inn en verdi for «{{int:config-db-username}}»",
        "config-db-install-username": "Skriv inn brukernavnet som vil bli brukt til å koble til databasen under installasjonsprosessen.\nDette er ikke brukernavnet på MediaWiki-kontoen; dette er brukernavnet for databasen din.",
        "config-db-install-password": "Skriv inn passordet som vil bli brukt til å koble til databasen under installasjonsprosessen.\nDette er ikke passordet på MediaWiki-kontoen; dette er passordet for databasen din.",
        "config-db-install-help": "Skriv inn brukernavnet og passordet som vil bli brukt for å koble til databasen under installasjonsprosessen.",
        "config-header-oracle": "Oracle-innstillinger",
        "config-header-mssql": "Microsoft SQLServer-innstillinger",
        "config-invalid-db-type": "Ugyldig databasetype",
-       "config-missing-db-name": "Du må skrive inn en verdi for «Databasenavn»",
-       "config-missing-db-host": "Du må skrive inn en verdi for «Databasevert»",
-       "config-missing-db-server-oracle": "Du må skrive inn en verdi for «Database TNS»",
+       "config-missing-db-name": "Du må skrive inn en verdi for «{{int:config-db-name}}»",
+       "config-missing-db-host": "Du må skrive inn en verdi for «{{int:config-db-host}}»",
+       "config-missing-db-server-oracle": "Du må skrive inn en verdi for «{{int:config-db-host-oracle}}»",
        "config-invalid-db-server-oracle": "Ugyldig database-TNS «$1».\nBruk enten \"TNS Name\" eller en \"Easy Connect\"-streng ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle Naming Methods])",
        "config-invalid-db-name": "Ugyldig databasenavn «$1».\nBruk bare ASCII-bokstaver (a-z, A-Z), tall (0-9), undestreker (_) og bindestreker (-).",
        "config-invalid-db-prefix": "Ugyldig databaseprefiks «$1».\nBruk bare ASCII-bokstaver (a-z, A-Z), tall (0-9), undestreker (_) og bindestreker (-).",
        "config-profile-no-anon": "Kontoopprettelse påkrevd",
        "config-profile-fishbowl": "Kun autoriserte bidragsytere",
        "config-profile-private": "Privat 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/Manual:User_rights relevant avsnitt i brukerbeskrivelsen].",
+       "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-email-sender-help": "Skriv inn e-postadressen som skal brukes som svar-adresse ved utgående e-post.\nDet er hit returmeldinger vil bli sendt.\nMange e-posttjenere krever at minst domenenavnet må være gyldig.",
        "config-upload-settings": "Bilde- og filopplastinger",
        "config-upload-enable": "Aktiver filopplastinger",
-       "config-upload-help": "Filopplastinger kan potensielt utsette tjeneren din for sikkerhetsrisikoer.\nFor mer informasjon, les [//www.mediawiki.org/wiki/Manual:Security sikkerhetsseksjonen] i manualen.\n\nFor å aktivere filopplastinger, endre modusen i <code>images</code>-undermappen i MediaWikis rotmappe slik at nettjeneren kan skrive til den.\nAktiver så dette alternativet.",
+       "config-upload-help": "Filopplastinger kan potensielt utsette tjeneren din for sikkerhetsrisikoer.\nFor mer informasjon, les [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security sikkerhetsseksjonen] i manualen.\n\nFor å aktivere filopplastinger, endre modusen i <code>images</code>-undermappen i MediaWikis rotmappe slik at nettjeneren kan skrive til den.\nAktiver så dette alternativet.",
        "config-upload-deleted": "Mappe for slettede filer:",
        "config-upload-deleted-help": "Velg en mappe for å arkivere slettede filer.\nIdeelt burde ikke denne være tilgjengelig for nettet.",
        "config-logo": "Logo-URL:",
        "config-logo-help": "MediaWikis standarddrakt har satt av plass til en 135x160 pikslers logo i øvre venstre hjørne av sidepanelet.\nLast opp et bilde i passende størrelse og skriv inn nettadressen her.\n\nDu kan bruke code>$wgStylePath</code> eller <code>$wgScriptPath</code> hvis logoen er relativ til disse stiene.\n\nHvis du ikke ønsker noen logo, la boksen være tom.",
        "config-instantcommons": "Aktiver Instant Commons",
-       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] er en funksjon som gjør det mulig for wikier å bruke bilder, lyder og andre media funnet på nettstedet [//commons.wikimedia.org/ Wikimedia Commons].\nFor å gjøre dette krever MediaWiki tilgang til internett.\n\nFor mer informasjon om denne funksjonen, inklusive instruksjoner om hvordan man setter opp dette for andre wikier enn Wikimedia Commons, konsulter [//mediawiki.org/wiki/Manual:$wgForeignFileRepos manualen].",
+       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] er en funksjon som gjør det mulig for wikier å bruke bilder, lyder og andre media funnet på nettstedet [//commons.wikimedia.org/ Wikimedia Commons].\nFor å gjøre dette krever MediaWiki tilgang til internett.\n\nFor mer informasjon om denne funksjonen, inklusive instruksjoner om hvordan man setter opp dette for andre wikier enn Wikimedia Commons, konsulter [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos manualen].",
        "config-cc-error": "Lisensvelgeren for Creative Commons ga ikke noe resultat.\nLegg inn lisensnavnet manuelt.",
        "config-cc-again": "Velg igjen...",
        "config-cc-not-chosen": "Velg hvilken Creative Commons-lisens du ønsker og klikk «fortsett».",
        "config-insecure-keys": "<strong>Advarsel:</strong> {{PLURAL:$2|En sikker nøkkel|Sikre nøkler}} ($1) generert under installeringen er ikke helt {{PLURAL:$2|trygg|trygge}}. Vurder å endre {{PLURAL:$2|den|dem}} manuelt.",
        "config-install-sysop": "Oppretter brukerkonto for administrator",
        "config-install-subscribe-fail": "Ikke mulig å abonnere på mediawiki-announce: $1",
-       "config-install-subscribe-notpossible": "cURL er ikke installert og allow_url_fopen er ikke tilgjengelig.",
+       "config-install-subscribe-notpossible": "cURL er ikke installert og <code>allow_url_fopen</code> er ikke tilgjengelig.",
        "config-install-mainpage": "Oppretter hovedside med standard innhold",
        "config-install-extension-tables": "Oppretter tabeller for aktiviserte utvidelser",
        "config-install-mainpage-failed": "Kunne ikke sette inn hovedside: $1",
        "config-install-done": "<strong>Gratulrerer!</strong>\nDu har lykkes i å installere MediaWiki.\n\nInstallasjonsprogrammet har generert en <code>LocalSettings.php</code>-fil.\nDen inneholder alle dine konfigureringer.\n\nDu må laste den ned og legge den på hovedfolderen for din wiki-installasjon (der index.php ligger). Nedlastingen skulle ha startet automatisk.\n\nHvis ingen nedlasting ble tilbudt, eller du avbrøt den, kan du få den i gang ved å klikke på lenken under:\n\n$3\n\n<strong>OBS:</strong> Hvis du ikke gjør dette nå, vil den genererte konfigurasjonsfilen ikke være tilgjengelig for deg senere.\n\nNår dette er gjort, kan du <strong>[$2 gå inn i wikien]</strong>.",
        "config-download-localsettings": "Last ned <code>LocalSettings.php</code>",
        "config-help": "hjelp",
+       "config-help-tooltip": "klikk for å utvide",
        "config-nofile": "Filen \"$1\" ble ikke funnet. Kan den være blitt slettet?",
-       "config-extension-link": "Visste du at wikien din kan brukes sammen med en mengde [//www.mediawiki.org/wiki/Manual:Extensions utvidelser]?\n\nDu kan sjekke gjennom [//www.mediawiki.org/wiki/Category:Extensions_by_category utvidelser per kategori] eller [//www.mediawiki.org/wiki/Extension_Matrix utvidelsesmatrisen] for å se den komplette listen av utvidelser.",
+       "config-extension-link": "Visste du at wikien din kan brukes sammen med en mengde [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions utvidelser]?\n\nDu kan sjekke gjennom [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category utvidelser per kategori] eller [//www.mediawiki.org/wiki/Extension_Matrix utvidelsesmatrisen] for å se den komplette listen av utvidelser.",
        "mainpagetext": "'''MediaWiki-programvaren er nå installert.'''",
-       "mainpagedocfooter": "Sjekk [//meta.wikimedia.org/wiki/Help:Contents brukerveiledningen] for å få informasjon om hvordan du bruker wiki-programvaren.\n\n==Hvordan komme igang==\n*[//www.mediawiki.org/wiki/Manual:Configuration_settings Innstillingsliste]\n*[//www.mediawiki.org/wiki/Manual:FAQ Ofte stilte spørsmål om MediaWiki]\n*[https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-postliste]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Tilpass MediaWiki for ditt språk]"
+       "mainpagedocfooter": "Sjekk [//meta.wikimedia.org/wiki/Help:Contents brukerveiledningen] for å få informasjon om hvordan du bruker wiki-programvaren.\n\n==Hvordan komme igang==\n*[//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Innstillingsliste]\n*[//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Ofte stilte spørsmål om MediaWiki]\n*[https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-postliste]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Tilpass MediaWiki for ditt språk]"
 }
index 9bb2469..c33ae7b 100644 (file)
@@ -5,5 +5,5 @@
                ]
        },
        "mainpagetext": "'''’t Installeren van de MediaWiki programmatuur is succesvol.'''",
-       "mainpagedocfooter": "Bekiek de [//meta.wikimedia.org/wiki/Help:Contents haandleiding] veur informasie over t gebruuk van de wikiprogrammatuur.\n\n== Meer hulpe ==\n* [//www.mediawiki.org/wiki/Help:Configuration_settings Lieste mit instellingen]\n* [//www.mediawiki.org/wiki/Help:FAQ MediaWiki-vragen die vake esteld wörden]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-postlieste veur nieje versies]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Maak MediaWiki beschikbaor in joew taal]"
+       "mainpagedocfooter": "Bekiek de [//meta.wikimedia.org/wiki/Help:Contents haandleiding] veur informasie over t gebruuk van de wikiprogrammatuur.\n\n== Meer hulpe ==\n* [//www.mediawiki.org/wiki/Help:Configuration_settings Lieste mit instellingen]\n* [//www.mediawiki.org/wiki/Help:FAQ MediaWiki-vragen die vake esteld wörden]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-postlieste veur nieje versies]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Maak MediaWiki beschikbaor in joew taal]"
 }
index d33d6d3..998389b 100644 (file)
@@ -14,5 +14,5 @@
        "config-page-readme": "पढ्नुहोस्",
        "config-page-releasenotes": "प्रकाशन टिप्पणी",
        "mainpagetext": "'''मीडिया सफलतापूर्वक कम्प्यूटरमा स्थापित भयो ।'''",
-       "mainpagedocfooter": " विकी अनुप्रयोग कसरी प्रयोग गर्ने भन्ने जानकारीको लागि  [//meta.wikimedia.org/wiki/Help:Contents प्रयोगकर्ता सहायता] हेर्नुहोस्\n\n== सुरू गर्नको लागि  ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings विन्यास सेटिङ्ग सूची]\n* [//www.mediawiki.org/wiki/Manual:FAQ मेडियाविकि सामान्य प्रश्नका उत्तरहरु]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce मेडियाविकि सुचना मेलिङ्ग सूची]"
+       "mainpagedocfooter": " विकी अनुप्रयोग कसरी प्रयोग गर्ने भन्ने जानकारीको लागि  [//meta.wikimedia.org/wiki/Help:Contents प्रयोगकर्ता सहायता] हेर्नुहोस्\n\n== सुरू गर्नको लागि  ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings विन्यास सेटिङ्ग सूची]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ मेडियाविकि सामान्य प्रश्नका उत्तरहरु]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce मेडियाविकि सुचना मेलिङ्ग सूची]"
 }
index bb5bdaa..e2bef3f 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "Siebrand"
+                       "Siebrand",
+                       "Seb35"
                ]
        },
        "config-localsettings-badkey": "De sleutel die je hebt opgegeven is onjuist",
@@ -14,8 +15,8 @@
        "config-copyright": "=== Auteursrechten en voorwaarden ===\n\n$1\n\nDit programma is vrije software. Je mag het verder verspreiden en/of aanpassen in overeenstemming met de voorwaarden van de GNU General Public License zoals uitgegeven door de Free Software Foundation; ofwel versie 2 van de Licentie of - naar eigen keuze - enige latere versie.\n\nDit programma wordt verspreid in de hoop dat het nuttig is, maar '''zonder enige garantie''', zelfs zonder de impliciete garantie van '''verkoopbaarheid''' of '''geschiktheid voor een bepaald doel'''.\nZie de GNU General Public License voor meer informatie.\n\nSamen met dit programma hoor je een <doclink href=Copying>exemplaar van de GNU General Public License</doclink> ontvangen te hebben; zo niet, schrijf dan aan de Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, Verenigde Staten. Of [http://www.gnu.org/copyleft/gpl.html lees de licentie online].",
        "config-env-good": "De omgeving is gecontroleerd.\nJe kunt MediaWiki installeren.",
        "config-env-bad": "De omgeving is gecontroleerd.\nJe kunt MediaWiki niet installeren.",
-       "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 je MediaWiki voor een website met veel verkeer installeert, lees je dan in over [//www.mediawiki.org/wiki/Unicode_normalization_considerations Unicodenormalisatie].",
-       "config-unicode-update-warning": "'''Waarschuwing''': de geïnstalleerde versie van de Unicodenormalisatiewrapper maakt gebruik van een oudere versie van [http://site.icu-project.org/ de bibliotheek van het ICU-project].\nJe moet [//www.mediawiki.org/wiki/Unicode_normalization_considerations bijwerken] als Unicode voor jou van belang is.",
+       "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 je MediaWiki voor een website met veel verkeer installeert, lees je dan in over [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicodenormalisatie].",
+       "config-unicode-update-warning": "'''Waarschuwing''': de geïnstalleerde versie van de Unicodenormalisatiewrapper maakt gebruik van een oudere versie van [http://site.icu-project.org/ de bibliotheek van het ICU-project].\nJe moet [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations bijwerken] als Unicode voor jou van belang is.",
        "config-no-db": "Het was niet mogelijk een geschikte databasedriver te vinden voor PHP.\nJe moet een databasedriver installeren voor PHP.\nDe volgende databases worden ondersteund: $1.\n\nAls je op een gedeelde omgeving zit, vraag dan aan je hostingprovider een geschikte databasedriver te installeren.\nAls je PHP zelf hebt gecompileerd, wijzig dan je instellingen zodat een databasedriver wordt geactiveerd, bijvoorbeeld via <code>./configure --with-mysql</code>.\nAls je PHP hebt geïnstalleerd via een Debian- of Ubuntu-package, installeer dan ook de module php5-mysql.",
        "config-outdated-sqlite": "''' Waarschuwing:''' je gebruikt SQLite $1. SQLite is niet beschikbaar omdat de minimaal vereiste versie $2 is.",
        "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 je server is dan meer kwetsbaar voor beveiligingslekken.",
@@ -26,7 +27,7 @@
        "config-mod-security": "'''Waarschuwing:''' je webserver heeft de module [http://modsecurity.org/ mod_security] ingeschakeld. Als deze onjuist is ingesteld, kan dit problemen geven in combinatie met MediaWiki of andere software die gebruikers in staat stelt willekeurige inhoud te posten.\nLees de [http://modsecurity.org/documentation/ documentatie over mod_security] of neem contact op met de helpdesk van je provider als je tegen problemen aanloopt.",
        "config-imagemagick": "ImageMagick aangetroffen: <code>$1</code>.\nHet aanmaken van miniaturen van afbeeldingen wordt ingeschakeld als je uploaden inschakelt.",
        "config-gd": "Ingebouwde GD grafische bibliotheek aangetroffen.\nHet aanmaken van miniaturen van afbeeldingen wordt ingeschakeld als je uploaden inschakelt.",
-       "config-uploads-not-safe": "'''Waarschuwing:''' je uploadmap <code>$1</code> kan gebruikt worden voor het arbitrair uitvoeren van scripts.\nHoewel MediaWiki alle toegevoegde bestanden controleert op bedreigingen, is het zeer aan te bevelen het [//www.mediawiki.org/wiki/Manual:Security#Upload_security beveiligingslek te verhelpen] alvorens uploads in te schakelen.",
+       "config-uploads-not-safe": "'''Waarschuwing:''' je uploadmap <code>$1</code> kan gebruikt worden voor het arbitrair uitvoeren van scripts.\nHoewel MediaWiki alle toegevoegde bestanden controleert op bedreigingen, is het zeer aan te bevelen het [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security beveiligingslek te verhelpen] alvorens uploads in te schakelen.",
        "config-no-cli-uploads-check": "''Waarschuwing:'' je standaardmap voor uploads (<code>$1</code>) wordt niet gecontroleerd op kwetsbaarheden voor het uitvoeren van willekeurige scripts gedurende de CLI-installatie.",
        "config-brokenlibxml": "Je systeem heeft een combinatie van PHP- en libxml2-versies geïnstalleerd die is foutgevoelig is en kan leiden tot onzichtbare beschadiging van gegevens in MediaWiki en andere webapplicaties.\nUpgrade naar PHP 5.2.9 of hoger en libxml2 2.7.3 of hoger([//bugs.php.net/bug.php?id=45996 bij PHP gerapporteerde fout]).\nDe installatie wordt afgebroken.",
        "config-db-host-help": "Als je databaseserver een andere server is, voer dan de hostnaam of het IP-adres hier in.\n\nAls je gebruik maakt van gedeelde webhosting, hoort je provider je de juiste hostnaam te hebben verstrekt.\n\nAls je MediaWiki op een Windowsserver installeert en MySQL gebruikt, dan werkt \"localhost\" mogelijk niet als servernaam.\nAls het inderdaad niet werkt, probeer dan \"127.0.0.1\" te gebruiken als lokaal IP-adres.\n\nAls je PostgreSQL gebruikt, laat dit veld dan leeg om via een Unix-socket te verbinden.",
        "config-subscribe-help": "Dit is een mailinglijst met een laag volume voor aankondigingen van nieuwe versies, inclusief belangrijke aankondigingen met betrekking tot beveiliging.\nAbonneer jezelf erop en werk je MediaWiki-installatie bij als er nieuwe versies uitkomen.",
        "config-subscribe-noemail": "Je hebt geprobeerd je te abonneren op de mailinglijst voor release-aankondigingen zonder een e-mailadres op te geven.\nGeef een e-mailadres op als je je wilt abonneren op de mailinglijst.",
        "config-almost-done": "Je bent bijna klaar!\nAls je wilt kan je de overige instellingen overslaan en de wiki nu installeren.",
-       "config-profile-help": "Wiki's werken het beste als ze door zoveel mogelijk gebruikers worden bewerkt.\nIn MediaWiki is het eenvoudig om de recente wijzigingen te controleren en eventuele foutieve of kwaadwillende bewerkingen terug te draaien.\n\nDaarnaast vinden velen MediaWiki goed inzetbaar in vele andere rollen, en soms is het niet handig om helemaal \"op de wikimanier\" te werken.\nDaarom biedt dit installatieprogramma je de volgende keuzes voor de basisinstelling van gebruikersvrijheden:\n\nEen '''{{int:config-profile-wiki}}''' staat iedereen toe te bewerken, zonder zelfs aan te melden.\nEen wiki met '''{{int:config-profile-no-anon}}\" biedt extra verantwoordelijkheid, maar kan afschrikken toevallige gebruikers afschrikken.\n\nHet scenario '''{{int:config-profile-fishbowl}}''' laat gebruikers waarvoor dat is ingesteld bewerkt, maar andere gebruikers kunnen alleen pagina's bekijken, inclusief de bewerkingsgeschiedenis.\nIn een '''{{int:config-profile-private}}''' kunnen alleen goedgekeurde gebruikers pagina's bekijken en bewerken.\n\nMeer complexe instellingen voor gebruikersrechten zijn te maken na de installatie; hierover is meer te lezen in de [//www.mediawiki.org/wiki/Manual:User_rights handleiding].",
+       "config-profile-help": "Wiki's werken het beste als ze door zoveel mogelijk gebruikers worden bewerkt.\nIn MediaWiki is het eenvoudig om de recente wijzigingen te controleren en eventuele foutieve of kwaadwillende bewerkingen terug te draaien.\n\nDaarnaast vinden velen MediaWiki goed inzetbaar in vele andere rollen, en soms is het niet handig om helemaal \"op de wikimanier\" te werken.\nDaarom biedt dit installatieprogramma je de volgende keuzes voor de basisinstelling van gebruikersvrijheden:\n\nEen '''{{int:config-profile-wiki}}''' staat iedereen toe te bewerken, zonder zelfs aan te melden.\nEen wiki met '''{{int:config-profile-no-anon}}\" biedt extra verantwoordelijkheid, maar kan afschrikken toevallige gebruikers afschrikken.\n\nHet scenario '''{{int:config-profile-fishbowl}}''' laat gebruikers waarvoor dat is ingesteld bewerkt, maar andere gebruikers kunnen alleen pagina's bekijken, inclusief de bewerkingsgeschiedenis.\nIn een '''{{int:config-profile-private}}''' kunnen alleen goedgekeurde gebruikers pagina's bekijken en bewerken.\n\nMeer complexe instellingen voor gebruikersrechten zijn te maken na de installatie; hierover is meer te lezen in de [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights handleiding].",
        "config-license-help": "In veel openbare wiki's zijn alle bijdragen beschikbaar onder een [http://freedomdefined.org/Definition vrije licentie].\nDit helpt bij het creëren van een gevoel van gemeenschappelijk eigendom en stimuleert bijdragen op lange termijn.\nDit is over het algemeen niet nodig is voor een particuliere of zakelijke wiki.\n\nAls je teksten uit Wikipedia wilt kunnen gebruiken en je wilt het mogelijk maken teksten uit je wiki naar Wikipedia te kopiëren, kies dan de licentie '''Creative Commons Naamsvermelding-Gelijk delen'''.\n\nDe GNU Free Documentation License is de oude licentie voor inhoud uit Wikipedia.\nDit is nog steeds een geldige licentie, maar deze licentie is lastig te begrijpen.\nHet is ook lastig inhoud te hergebruiken onder de GFDL.",
        "config-enable-email-help": "Als je wilt dat e-mailen mogelijk is, dan moeten de [http://www.php.net/manual/en/mail.configuration.php e-mailinstellingen van PHP] correct zijn.\nAls je niet wilt dat e-mailen mogelijk is, dan kan je de instellingen hier uitschakelen.",
-       "config-upload-help": "Het toestaan van het uploaden van bestanden stelt je server mogelijk bloot aan beveiligingsrisico's.\nEr is meer [//www.mediawiki.org/wiki/Manual:Security informatie over beveiliging] beschikbaar in de handleiding.\n\nOm het bestandsuploads mogelijk te maken kan je de rechten op de submap <code>images</code> onder de hoofdmap van MediaWiki aanpassen, zodat de webserver erin kan schrijven.\nDaarmee wordt deze functie ingeschakeld.",
+       "config-upload-help": "Het toestaan van het uploaden van bestanden stelt je server mogelijk bloot aan beveiligingsrisico's.\nEr is meer [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security informatie over beveiliging] beschikbaar in de handleiding.\n\nOm het bestandsuploads mogelijk te maken kan je de rechten op de submap <code>images</code> onder de hoofdmap van MediaWiki aanpassen, zodat de webserver erin kan schrijven.\nDaarmee wordt deze functie ingeschakeld.",
        "config-logo-help": "Het standaarduiterlijk van MediaWiki bevat ruimte voor een logo van 135x160 pixels boven het menu.\nUpload een afbeelding met de juiste afmetingen en voer de URL hier in.\n\nAls je geen logo wilt gebruiken, kan je dit veld leeg laten.",
        "config-cc-not-chosen": "Kies de Creative Commonslicentie die je wilt gebruiken en klik op \"doorgaan\".",
        "config-memcache-needservers": "Je hebt Memcached geselecteerd als je cache, maar je hebt geen servers opgegeven.",
@@ -74,5 +75,5 @@
        "config-pg-not-in-role": "De gebruiker die je hebt opgegeven voor de webgebruiker bestaat al.\nDe gebruiker die je hebt opgegeven voor installatie is geen superuser en geen lid van de rol van de webgebruiker, en kan het dus geen objecten aanmaken die van de webgebruiker zijn.\n\nMediaWiki vereist momenteel dat de tabellen van de webgebruiker zijn. Geef een andere webgebruikersnaam op, of klik op \"terug\" en geef een gebruiker op die voldoende installatierechten heeft.",
        "config-install-user-missing-create": "De opgegeven gebruiker \"$1\" bestaat niet.\nKlik op \"registreren\" onderaan als je de gebruiker wilt aanmaken.",
        "config-install-done": "'''Gefeliciteerd!'''\nJe hebt MediaWiki met geïnstalleerd.\n\nHet installatieprogramma heeft het bestand <code>LocalSettings.php</code> aangemaakt.\nDit bevat al je instellingen.\n\nJe moet het bestand downloaden en in de hoofdmap van uw wikiinstallatie plaatsten; in dezelfde map als index.php.\nDe download moet je automatisch zijn aangeboden.\n\nAls de download niet is aangeboden of als je de download hebt geannuleerd, dan kan je de download opnieuw starten door op de onderstaande koppeling te klikken:\n\n$3\n\n'''Let op''': als je dit niet nu doet, dan het is bestand als u later de installatieprocedure afsluit zonder het bestand te downloaden niet meer beschikbaar.\n\nNa het plaatsen van het bestand met instellingen kan je '''[$2 je wiki betreden]'''.",
-       "mainpagedocfooter": "Raadpleeg de [//meta.wikimedia.org/wiki/NL_Help:Inhoudsopgave handleiding] voor informatie over het gebruik van de wikisoftware.\n\n== Meer hulp over MediaWiki ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lijst met instellingen]\n* [//www.mediawiki.org/wiki/Manual:FAQ Veelgestelde vragen (FAQ)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglijst voor aankondigingen van nieuwe versies]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Maak MediaWiki beschikbaar in jouw taal]"
+       "mainpagedocfooter": "Raadpleeg de [//meta.wikimedia.org/wiki/Help:Contents Inhoudsopgave handleiding] voor informatie over het gebruik van de wikisoftware.\n\n== Meer hulp over MediaWiki ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lijst met instellingen]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Veelgestelde vragen (FAQ)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglijst voor aankondigingen van nieuwe versies]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Maak MediaWiki beschikbaar in jouw taal]"
 }
index e09549b..dda3d41 100644 (file)
@@ -10,7 +10,9 @@
                        "아라",
                        "Arent",
                        "JurgenNL",
-                       "Southparkfan"
+                       "Southparkfan",
+                       "Seb35",
+                       "Mar(c)"
                ]
        },
        "config-desc": "Het installatieprogramma voor MediaWiki",
        "config-restart": "Ja, opnieuw starten",
        "config-welcome": "=== Controle omgeving ===\nEr worden een aantal basiscontroles uitgevoerd met als doel vast te stellen of deze omgeving geschikt is voor een installatie van MediaWiki.\nLever deze gegevens dan ook aan indien u support vraagt bij de installatie.",
        "config-copyright": "=== Auteursrechten en voorwaarden ===\n\n$1\n\nDit programma is vrije software. U mag het verder verspreiden en/of aanpassen in overeenstemming met de voorwaarden van de GNU General Public License zoals uitgegeven door de Free Software Foundation; ofwel versie 2 van de Licentie of - naar uw keuze - enige latere versie.\n\nDit programma wordt verspreid in de hoop dat het nuttig is, maar '''zonder enige garantie''', zelfs zonder de impliciete garantie van '''verkoopbaarheid''' of '''geschiktheid voor een bepaald doel'''.\nZie de GNU General Public License voor meer informatie.\n\nSamen met dit programma hoort u een <doclink href=Copying>exemplaar van de GNU General Public License</doclink> ontvangen te hebben; zo niet, schrijf dan aan de Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, Verenigde Staten. Of [http://www.gnu.org/copyleft/gpl.html lees de licentie online].",
-       "config-sidebar": "* [//www.mediawiki.org MediaWiki thuispagina]\n* [//www.mediawiki.org/wiki/Help:Contents Gebruikershandleiding] (Engelstalig)\n* [//www.mediawiki.org/wiki/Manual:Contents Beheerdershandleiding] (Engelstalig)\n* [//www.mediawiki.org/wiki/Manual:FAQ Veel gestelde vragen] (Engelstalig)\n----\n* <doclink href=Readme>Leesmij</doclink> (Engelstalig)\n* <doclink href=ReleaseNotes>Release notes</doclink> (Engelstalig)\n* <doclink href=Copying>Kopiëren</doclink> (Engelstalig)\n* <doclink href=UpgradeDoc>Versie bijwerken</doclink> (Engelstalig)",
+       "config-sidebar": "* [//www.mediawiki.org MediaWiki thuispagina]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Gebruikershandleiding] (Engelstalig)\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Beheerdershandleiding] (Engelstalig)\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Veel gestelde vragen] (Engelstalig)\n----\n* <doclink href=Readme>Leesmij</doclink> (Engelstalig)\n* <doclink href=ReleaseNotes>Release notes</doclink> (Engelstalig)\n* <doclink href=Copying>Kopiëren</doclink> (Engelstalig)\n* <doclink href=UpgradeDoc>Versie bijwerken</doclink> (Engelstalig)",
        "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/Unicode_normalization_considerations Unicodenormalisatie].",
-       "config-unicode-update-warning": "'''Waarschuwing''': de geïnstalleerde versie van de Unicodenormalisatiewrapper maakt gebruik van een oudere versie van [http://site.icu-project.org/ de bibliotheek van het ICU-project].\nU moet [//www.mediawiki.org/wiki/Unicode_normalization_considerations bijwerken] als Unicode voor u van belang is.",
+       "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].",
+       "config-unicode-update-warning": "'''Waarschuwing''': de geïnstalleerde versie van de Unicodenormalisatiewrapper maakt gebruik van een oudere versie van [http://site.icu-project.org/ de bibliotheek van het ICU-project].\nU moet [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations bijwerken] als Unicode voor u van belang is.",
        "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.",
@@ -90,7 +92,7 @@
        "config-no-cli-uri": "'''Waarschuwing:''' de parameter <code>--scriptpath</code> is niet opgegeven. De standaardwaarde wordt gebruikt: <code>$1</code>.",
        "config-using-server": "De servernaam \"<nowiki>$1</nowiki>\" wordt gebruikt.",
        "config-using-uri": "De server-URL \"<nowiki>$1$2</nowiki>\" wordt gebruikt.",
-       "config-uploads-not-safe": "'''Waarschuwing:''' uw uploadmap <code>$1</code> kan gebruikt worden voor het arbitrair uitvoeren van scripts.\nHoewel MediaWiki alle toegevoegde bestanden controleert op bedreigingen, is het zeer aan te bevelen het [//www.mediawiki.org/wiki/Manual:Security#Upload_security beveiligingslek te verhelpen] alvorens uploads in te schakelen.",
+       "config-uploads-not-safe": "'''Waarschuwing:''' uw uploadmap <code>$1</code> kan gebruikt worden voor het arbitrair uitvoeren van scripts.\nHoewel MediaWiki alle toegevoegde bestanden controleert op bedreigingen, is het zeer aan te bevelen het [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security beveiligingslek te verhelpen] alvorens uploads in te schakelen.",
        "config-no-cli-uploads-check": "''Waarschuwing:'' uw standaardmap voor uploads (<code>$1</code>) wordt niet gecontroleerd op kwetsbaarheden voor het uitvoeren van willekeurige scripts gedurende de CLI-installatie.",
        "config-brokenlibxml": "Uw systeem heeft een combinatie van PHP- en libxml2-versies geïnstalleerd die is foutgevoelig is en kan leiden tot onzichtbare beschadiging van gegevens in MediaWiki en andere webapplicaties.\nUpgrade naar libxml2 2.7.3 of hoger([https://bugs.php.net/bug.php?id=45996 bij PHP gerapporteerde fout]).\nDe installatie wordt afgebroken.",
        "config-suhosin-max-value-length": "Suhosin is geïnstalleerd en beperkt de GET-parameter <code>length</code> tot $1 bytes.\nDe ResourceLoader van MediaWiki omzeilt deze beperking, maar dat is slecht voor de prestaties.\nAls het mogelijk is, moet u de waarde \"<code>suhosin.get.max_value_length</code>\" in <code>php.ini</code> instellen op 1024 of hoger en <code>$wgResourceLoaderMaxQueryLength</code> in LocalSettings.php op dezelfde waarde instellen.",
        "config-profile-no-anon": "Gebruiker aanmaken verplicht",
        "config-profile-fishbowl": "Alleen voor geautoriseerde bewerkers",
        "config-profile-private": "Privéwiki",
-       "config-profile-help": "Wiki's werken het beste als ze door zoveel mogelijk gebruikers worden bewerkt.\nIn MediaWiki is het eenvoudig om de recente wijzigingen te controleren en eventuele foutieve of kwaadwillende bewerkingen terug te draaien.\n\nDaarnaast vinden velen MediaWiki goed inzetbaar in vele andere rollen, en soms is het niet handig om helemaal \"op de wikimanier\" te werken.\nDaarom biedt dit installatieprogramma u de volgende keuzes voor de basisinstelling van gebruikersvrijheden:\n\nHet profiel '''{{int:config-profile-wiki}}''' staat iedereen toe te bewerken, zonder zelfs aan te melden.\nEen wiki met '''{{int:config-profile-no-anon}}\" biedt extra verantwoordelijkheid, maar kan afschrikken toevallige gebruikers afschrikken.\n\nHet scenario '''{{int:config-profile-fishbowl}}''' laat gebruikers waarvoor dat is ingesteld bewerkt, maar andere gebruikers kunnen alleen pagina's bekijken, inclusief de bewerkingsgeschiedenis.\nIn een '''{{int:config-profile-private}}''' kunnen alleen goedgekeurde gebruikers pagina's bekijken en bewerken.\n\nMeer complexe instellingen voor gebruikersrechten zijn te maken na de installatie; hierover is meer te lezen in de [//www.mediawiki.org/wiki/Manual:User_rights handleiding].",
+       "config-profile-help": "Wiki's werken het beste als ze door zoveel mogelijk gebruikers worden bewerkt.\nIn MediaWiki is het eenvoudig om de recente wijzigingen te controleren en eventuele foutieve of kwaadwillende bewerkingen terug te draaien.\n\nDaarnaast vinden velen MediaWiki goed inzetbaar in vele andere rollen, en soms is het niet handig om helemaal \"op de wikimanier\" te werken.\nDaarom biedt dit installatieprogramma u de volgende keuzes voor de basisinstelling van gebruikersvrijheden:\n\nHet profiel '''{{int:config-profile-wiki}}''' staat iedereen toe te bewerken, zonder zelfs aan te melden.\nEen wiki met '''{{int:config-profile-no-anon}}\" biedt extra verantwoordelijkheid, maar kan afschrikken toevallige gebruikers afschrikken.\n\nHet scenario '''{{int:config-profile-fishbowl}}''' laat gebruikers waarvoor dat is ingesteld bewerkt, maar andere gebruikers kunnen alleen pagina's bekijken, inclusief de bewerkingsgeschiedenis.\nIn een '''{{int:config-profile-private}}''' kunnen alleen goedgekeurde gebruikers pagina's bekijken en bewerken.\n\nMeer complexe instellingen voor gebruikersrechten zijn te maken na de installatie; hierover is meer te lezen in de [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights handleiding].",
        "config-license": "Auteursrechten en licentie:",
        "config-license-none": "Geen licentie in de voettekst",
        "config-license-cc-by-sa": "Creative Commons Naamsvermelding-Gelijk delen",
        "config-email-sender-help": "Voer het e-mailadres in dat u wilt gebruiken als antwoordadres voor uitgaande e-mail.\nAls een e-mail niet bezorgd kan worden, wordt dat op dit e-mailadres gemeld.\nVeel mailservers vereisen dat tenminste het domein bestaat.",
        "config-upload-settings": "Afbeeldingen en bestanden uploaden",
        "config-upload-enable": "Uploaden van bestanden inschakelen",
-       "config-upload-help": "Het toestaan van het uploaden van bestanden stelt uw server mogelijk bloot aan beveiligingsrisico's.\nEr is meer [//www.mediawiki.org/wiki/Manual:Security informatie over beveiliging] beschikbaar in de handleiding.\n\nOm het bestandsuploads mogelijk te maken kunt u de rechten op de submap <code>images</code> onder de hoofdmap van MediaWiki aanpassen, zodat de webserver erin kan schrijven.\nDaarmee wordt deze functie ingeschakeld.",
+       "config-upload-help": "Het toestaan van het uploaden van bestanden stelt uw server mogelijk bloot aan beveiligingsrisico's.\nEr is meer [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security informatie over beveiliging] beschikbaar in de handleiding.\n\nOm het bestandsuploads mogelijk te maken kunt u de rechten op de submap <code>images</code> onder de hoofdmap van MediaWiki aanpassen, zodat de webserver erin kan schrijven.\nDaarmee wordt deze functie ingeschakeld.",
        "config-upload-deleted": "Map voor verwijderde bestanden:",
        "config-upload-deleted-help": "Kies een map waarin verwijderde bestanden gearchiveerd kunnen worden.\nIdealiter is deze map niet via het web te benaderen.",
        "config-logo": "URL voor logo:",
        "config-logo-help": "Het standaarduiterlijk van MediaWiki bevat ruimte voor een logo van 135x160 pixels boven het menu.\nUpload een afbeelding met de juiste afmetingen en voer de URL hier in.\n\nU kunt <code>$wgStylePath</code> of <code>$wgScriptPath</code> gebruiken als uw logo relatief is aan een van deze paden.\n\nAls u geen logo wilt gebruiken, kunt u dit veld leeg laten.",
        "config-instantcommons": "Instant Commons inschakelen",
-       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] is functie die het mogelijk maakt om afbeeldingen, geluidsbestanden en andere mediabestanden te gebruiken van de website [//commons.wikimedia.org/ Wikimedia Commons].\nHiervoor heeft MediaWiki toegang nodig tot Internet.\n\nMeer informatie over deze functie en hoe deze in te stellen voor andere wiki's dan Wikimedia Commons is te vinden in de [//mediawiki.org/wiki/Manual:$wgForeignFileRepos handleiding].",
+       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] is functie die het mogelijk maakt om afbeeldingen, geluidsbestanden en andere mediabestanden te gebruiken van de website [//commons.wikimedia.org/ Wikimedia Commons].\nHiervoor heeft MediaWiki toegang nodig tot Internet.\n\nMeer informatie over deze functie en hoe deze in te stellen voor andere wiki's dan Wikimedia Commons is te vinden in de [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos handleiding].",
        "config-cc-error": "De licentiekiezer van Creative Commons heeft geen resultaat opgeleverd.\nVoer de licentie handmatig in.",
        "config-cc-again": "Opnieuw kiezen...",
        "config-cc-not-chosen": "Kies de Creative Commonslicentie die u wilt gebruiken en klik op \"doorgaan\".",
        "config-install-done": "'''Gefeliciteerd!'''\nU hebt MediaWiki met succes geïnstalleerd.\n\nHet installatieprogramma heeft het bestand <code>LocalSettings.php</code> aangemaakt.\nDit bevat al uw instellingen.\n\nU moet het bestand downloaden en in de hoofdmap van uw wiki-installatie plaatsten, in dezelfde map als index.php.\nDe download moet u automatisch zijn aangeboden.\n\nAls de download niet is aangeboden of als u de download hebt geannuleerd, dan kunt u de download opnieuw starten door op de onderstaande koppeling te klikken:\n\n$3\n\n'''Let op''': als u dit niet nu doet, dan is het bestand als u later de installatieprocedure afsluit zonder het bestand te downloaden niet meer beschikbaar.\n\nNa het plaatsen van het bestand met instellingen kunt u '''[$2 uw wiki gebruiken]'''.",
        "config-download-localsettings": "<code>LocalSettings.php</code> downloaden",
        "config-help": "hulp",
+       "config-help-tooltip": "klik om uit te klappen",
        "config-nofile": "Het bestand \"$1\" is niet gevonden. Is het verwijderd?",
-       "config-extension-link": "Weet u dat u [//www.mediawiki.org/wiki/Manual:Extensions uitbreidingen] kunt gebruiken voor uw wiki?\nU kunt [//www.mediawiki.org/wiki/Category:Extensions_by_category uitbreidingen op categorie] bekijken of ga naar de [//www.mediawiki.org/wiki/Extension_Matrix uitbreidingenmatrix] om de volledige lijst met uitbreidingen te bekijken.",
+       "config-extension-link": "Weet u dat u [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions uitbreidingen] kunt gebruiken voor uw wiki?\nU kunt [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category uitbreidingen op categorie] bekijken of ga naar de [//www.mediawiki.org/wiki/Extension_Matrix uitbreidingenmatrix] om de volledige lijst met uitbreidingen te bekijken.",
        "mainpagetext": "'''De installatie van MediaWiki is geslaagd.'''",
-       "mainpagedocfooter": "Raadpleeg de [//meta.wikimedia.org/wiki/NL_Help:Inhoudsopgave handleiding] voor informatie over het gebruik van de wikisoftware.\n\n== Meer hulp over MediaWiki ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lijst met instellingen]\n* [//www.mediawiki.org/wiki/Manual:FAQ Veelgestelde vragen (FAQ)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglijst voor aankondigingen van nieuwe versies]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Maak MediaWiki beschikbaar in uw taal]"
+       "mainpagedocfooter": "Raadpleeg de [//meta.wikimedia.org/wiki/Special:MyLanguage/Help:Contents handleiding] voor informatie over het gebruik van de wikisoftware.\n\n== Meer hulp over MediaWiki ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lijst met instellingen]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Veelgestelde vragen (FAQ)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglijst voor aankondigingen van nieuwe versies]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Maak MediaWiki beschikbaar in uw taal]"
 }
index e767dfe..5d75be7 100644 (file)
@@ -37,5 +37,5 @@
        "config-email-settings": "E-postinnstillingar",
        "config-logo": "Logo-URL:",
        "mainpagetext": "'''MediaWiki er no installert.'''",
-       "mainpagedocfooter": "Sjå [//meta.wikimedia.org/wiki/Help:Contents brukarmanualen] for informasjon om bruk og oppsettshjelp for wikiprogramvara.\n\n==Kome i gang==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Liste over oppsettsinnstillingar]\n* [//www.mediawiki.org/wiki/Manual:FAQ Spørsmål og svar om MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-postliste med informasjon om nye MediaWiki-versjonar]"
+       "mainpagedocfooter": "Sjå [//meta.wikimedia.org/wiki/Help:Contents brukarmanualen] for informasjon om bruk og oppsettshjelp for wikiprogramvara.\n\n==Kome i gang==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Liste over oppsettsinnstillingar]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Spørsmål og svar om MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-postliste med informasjon om nye MediaWiki-versjonar]"
 }
index b12e584..e4bcb6e 100644 (file)
@@ -2,7 +2,8 @@
        "@metadata": {
                "authors": [
                        "Cedric31",
-                       "Jfblanc"
+                       "Jfblanc",
+                       "Seb35"
                ]
        },
        "config-desc": "Lo programa d’installacion de MediaWiki",
        "config-download-localsettings": "Telecargar <code>LocalSettings.php</code>",
        "config-help": "ajuda",
        "mainpagetext": "'''MediaWiki es estat installat amb succès.'''",
-       "mainpagedocfooter": "Consultatz lo [//meta.wikimedia.org/wiki/Ajuda:Contengut Guida de l'utilizaire] per mai d'entresenhas sus l'utilizacion d'aqueste logicial de wiki.\n\n== Per començar ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista dels paramètres de configuracion]\n* [//www.mediawiki.org/wiki/Manual:FAQ/fr FAQ MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de discussions de las distribucions de MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Adaptatz MediaWiki dins vòstra lenga]"
+       "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 9a628b6..83fb3d8 100644 (file)
@@ -1,13 +1,33 @@
 {
        "@metadata": {
                "authors": [
-                       "Jnanaranjan Sahu"
+                       "Jnanaranjan Sahu",
+                       "Psubhashish"
                ]
        },
+       "config-session-error": "ଅଧିବେଶନ ଆରମ୍ଭରେ ଅସୁବିଧା: $1",
+       "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-options": "ପସନ୍ଦସମୂହ",
+       "config-page-install": "ଇନଷ୍ଟଲ",
+       "config-page-complete": "ଶେଷ ହେଲା!",
+       "config-page-restart": "ଇନଷ୍ଟଲେସନ ପୁନଃଆରମ୍ଭ କରନ୍ତୁ",
+       "config-page-readme": "ପଢ଼ନ୍ତୁ",
+       "config-page-releasenotes": "ପ୍ରକାଶନ ସୂଚନା",
+       "config-page-copying": "ନକଲ କରୁଛି",
+       "config-page-upgradedoc": "ଅପଗ୍ରେଡ଼ କରୁଛି",
+       "config-page-existingwiki": "ଏବେକାର ଉଇକି",
+       "config-restart": "ହଁ, ଏହାକୁ ପୁନରାରମ୍ଭ କରନ୍ତୁ",
+       "config-env-php": "PHP $1 ଇନଷ୍ଟଲ ହେଲା ।",
+       "config-license-cc-by-sa": "କ୍ରିଏଟିଭ କମନ୍ସ ଆଟ୍ରିବ୍ୟୁସନ-ସେଆର ଏଲାଇକ",
+       "config-license-cc-by-nc-sa": "କ୍ରିଏଟିଭ କମନ୍ସ ଆଟ୍ରିବ୍ୟୁସନ-ନନକମର୍ସିଆଲ ସେଆର ଏଲାଇକ"
 }
index f29fa85..c04a510 100644 (file)
@@ -1,5 +1,5 @@
 {
        "@metadata": [],
        "mainpagetext": "'''Melaus ing pamipalyari ning MediaWiki.'''",
-       "mainpagedocfooter": "Basan me ing [//meta.wikimedia.org/wiki/Help:Contents User's Guide] para king impormasiun keng pamangamit ning wiki software.\n\n== Pamagumpisa ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]"
+       "mainpagedocfooter": "Basan me ing [//meta.wikimedia.org/wiki/Help:Contents User's Guide] para king impormasiun keng pamangamit ning wiki software.\n\n== Pamagumpisa ==\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 d9132d2..2a05223 100644 (file)
@@ -9,5 +9,5 @@
        "config-admin-password": "Paesswatt:",
        "config-install-step-done": "geduh",
        "config-help": "Hilf",
-       "mainpagedocfooter": "Hilf fer's Yuuse unn Konfiguriere vun de Wiki-Software kansch finne im [//meta.wikimedia.org/wiki/Help:Contents Handbuch fer Yuuser].\n\n== Hilf zum Schtaerte ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lischt vun Gnepp zum Konfiguriere]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki-FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Eposchde-Lischt fer neie MediaWiki-Versione]"
+       "mainpagedocfooter": "Hilf fer's Yuuse unn Konfiguriere vun de Wiki-Software kansch finne im [//meta.wikimedia.org/wiki/Help:Contents Handbuch fer Yuuser].\n\n== Hilf zum Schtaerte ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lischt vun Gnepp zum Konfiguriere]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki-FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Eposchde-Lischt fer neie MediaWiki-Versione]"
 }
index 883608f..1a3e7ae 100644 (file)
@@ -14,7 +14,9 @@
                        "Amire80",
                        "Jacenty359",
                        "Pan Cube",
-                       "WTM"
+                       "WTM",
+                       "Alan ffm",
+                       "Matik7"
                ]
        },
        "config-desc": "Instalator MediaWiki",
        "config-restart": "Tak, zacznij od nowa",
        "config-welcome": "=== Sprawdzenie środowiska instalacji ===\nTeraz zostaną wykonane podstawowe testy sprawdzające czy to środowisko jest odpowiednie dla instalacji MediaWiki.\nJeśli potrzebujesz pomocy podczas instalacji, załącz wyniki tych testów.",
        "config-copyright": "=== Prawa autorskie i warunki użytkowania ===\n\n$1\n\nTo oprogramowanie jest wolne; możesz je rozprowadzać dalej i modyfikować zgodnie z warunkami licencji GNU General Public License opublikowanej przez Free Software Foundation w wersji 2 tej licencji lub (według Twojego wyboru) którejś z późniejszych jej wersji.\n\nNiniejsze oprogramowanie jest rozpowszechniane w nadziei, że będzie użyteczne, ale '''bez żadnej gwarancji'''; nawet bez domniemanej gwarancji '''handlowej''' lub '''przydatności do określonego celu'''.\nZobacz treść licencji GNU General Public License, aby uzyskać więcej szczegółów.\n\nRazem z oprogramowaniem powinieneś otrzymać <doclink href=Copying>kopię licencji GNU General Public License</doclink>. Jeśli jej nie otrzymałeś, napisz do Free Software Foundation, Inc, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. lub [http://www.gnu.org/copyleft/gpl.html przeczytaj ją online].",
-       "config-sidebar": "* [//www.mediawiki.org Strona domowa MediaWiki]\n* [//www.mediawiki.org/wiki/Help:Contents Podręcznik użytkownika]\n* [//www.mediawiki.org/wiki/Manual:Contents Podręcznik administratora]\n* [//www.mediawiki.org/wiki/Manual:FAQ Odpowiedzi na często zadawane pytania]\n----\n* <doclink href=Readme>Przeczytaj to</doclink>\n* <doclink href=ReleaseNotes>Informacje o tej wersji</doclink>\n* <doclink href=Copying>Kopiowanie</doclink>\n* <doclink href=UpgradeDoc>Aktualizacja</doclink>",
+       "config-sidebar": "* [//www.mediawiki.org Strona domowa MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Podręcznik użytkownika]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Podręcznik administratora]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Odpowiedzi na często zadawane pytania]\n----\n* <doclink href=Readme>Przeczytaj to</doclink>\n* <doclink href=ReleaseNotes>Informacje o tej wersji</doclink>\n* <doclink href=Copying>Kopiowanie</doclink>\n* <doclink href=UpgradeDoc>Aktualizacja</doclink>",
        "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-php-toolow": "Zainstalowane jest PHP $1.\nJednak MediaWiki wymaga PHP $2 lub nowszego.",
        "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/Unicode_normalization_considerations normalizacji Unicode].",
-       "config-unicode-update-warning": "'''Uwaga''' – zainstalowana wersja normalizacji Unicode korzysta z nieaktualnej biblioteki [http://site.icu-project.org/ projektu ICU].\nPowinieneś [//www.mediawiki.org/wiki/Unicode_normalization_considerations zrobić aktualizację] jeśli chcesz korzystać w pełni z 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].",
+       "config-unicode-update-warning": "'''Uwaga''' – zainstalowana wersja normalizacji Unicode korzysta z nieaktualnej biblioteki [http://site.icu-project.org/ projektu ICU].\nPowinieneś [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations zrobić aktualizację] jeśli chcesz korzystać w pełni z Unicode.",
        "config-no-db": "Nie można odnaleźć właściwego sterownika bazy danych! Musisz zainstalować sterownik bazy danych dla PHP.\nMożna użyć następujących typów baz danych: $1.\n\nJeśli skompilowałeś PHP samodzielnie, skonfiguruj je ponownie z włączonym klientem bazy danych, na przykład za pomocą polecenia <code>./configure --with-mysqli</code>.\nJeśli zainstalowałeś PHP jako pakiet Debiana lub Ubuntu, musisz również zainstalować np. moduł <code>php5-mysql</code>.",
        "config-outdated-sqlite": "'''Ostrzeżenie''': masz SQLite  $1, która jest niższa od minimalnej wymaganej wersji  $2 . SQLite będzie niedostępne.",
        "config-no-fts3": "'''Uwaga''' – SQLite został skompilowany bez [//sqlite.org/fts3.html modułu FTS3] – funkcje wyszukiwania nie będą dostępne.",
@@ -94,7 +96,7 @@
        "config-no-cli-uri": "<strong>Ostrzeżenie:</strong> Nie wskazano <code>--scriptpath</code>, użycie wartości domyślnej: <code>$1</code>.",
        "config-using-server": "„<nowiki>$1</nowiki>“ jest adresem serwera, na którym instalowana jest wiki.",
        "config-using-uri": "Wiki będzie zainstalowana pod adresem \"<nowiki>$1$2</nowiki>\".",
-       "config-uploads-not-safe": "'''Uwaga''' – domyślny katalog do którego zapisywane są przesyłane pliki <code>$1</code> jest podatny na wykonanie dowolnego skryptu.\nChociaż MediaWiki sprawdza wszystkie przesłane pliki pod kątem bezpieczeństwa, zaleca się jednak, aby [//www.mediawiki.org/wiki/Manual:Security#Upload_security zamknąć tę lukę w zabezpieczeniach] przed włączeniem przesyłania plików.",
+       "config-uploads-not-safe": "'''Uwaga''' – domyślny katalog do którego zapisywane są przesyłane pliki <code>$1</code> jest podatny na wykonanie dowolnego skryptu.\nChociaż MediaWiki sprawdza wszystkie przesłane pliki pod kątem bezpieczeństwa, zaleca się jednak, aby [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security zamknąć tę lukę w zabezpieczeniach] przed włączeniem przesyłania plików.",
        "config-no-cli-uploads-check": "'''Ostrzeżenie:''' Katalog domyślny przesyłanych plików ( <code>$1</code> ) nie jest sprawdzona względem luki\n wykonania dowolnego skryptu podczas instalacji CLI w zabezpieczeniach.",
        "config-brokenlibxml": "Twój system jest kombinacją wersji PHP i libxml2, która zawiera błędy mogące powodować ukryte uszkodzenia danych w MediaWiki i innych aplikacjach sieci web.\nWykonaj aktualizację libxml2 do wersji 2.7.3 lub późniejszej ([https://bugs.php.net/bug.php?id=45996 bug filed with PHP]).\nInstalacja została przerwana.",
        "config-suhosin-max-value-length": "Jest zainstalowany Suhosin i ogranicza długość parametru GET <code>length</code> do $1 bajtów. Komponent ResourceLoader w MediaWiki wykona obejście tego ograniczenia, ale kosztem wydajności.\nJeśli to możliwe, należy ustawić <code>suhosin.get.max_value_length</code> na 1024 lub więcej w <code>php.ini</code> oraz ustawić <code>$wgResourceLoaderMaxQueryLength</code> w <code>LocalSettings.php</code> na tę samą wartość.",
        "config-db-username": "Nazwa użytkownika bazy danych:",
        "config-db-password": "Hasło bazy danych:",
        "config-db-password-empty": "Wprowadź hasło dla nowego użytkownika bazy danych: $1.\nChoć istnieje możliwość tworzenia użytkowników bez hasła, nie jest to bezpieczne.",
-       "config-db-username-empty": "Należy podać wartość parametru „Nazwa użytkownika bazy danych”",
+       "config-db-username-empty": "Należy podać wartość parametru \"{{int:config-db-username}}\".",
        "config-db-install-username": "Wprowadź nazwę użytkownika, który będzie używany do łączenia się z bazą danych podczas procesu instalacji.\nNie jest to nazwa konta MediaWiki, a użytkownika bazy danych.",
        "config-db-install-password": "Wprowadź hasło, które będzie wykorzystywane do łączenia się z bazą danych w procesie instalacji.\nTo nie jest hasło konta MediaWiki, lecz hasło do bazy danych.",
        "config-db-install-help": "Podaj nazwę użytkownika i jego hasło, które zostaną użyte do połączenia z bazą danych w czasie procesu instalacji.",
        "config-header-oracle": "Ustawienia Oracle",
        "config-header-mssql": "Ustawienia Microsoft SQL Server",
        "config-invalid-db-type": "Nieprawidłowy typ bazy danych",
-       "config-missing-db-name": "Należy wpisać wartość w polu „Nazwa bazy danych”",
-       "config-missing-db-host": "Musisz wpisać wartość w polu „Serwer bazy danych”",
-       "config-missing-db-server-oracle": "Należy wpisać wartość w polu „Nazwa instancji bazy danych (TNS)”",
+       "config-missing-db-name": "Należy wpisać wartość w polu „{{int:config-db-name}}”.",
+       "config-missing-db-host": "Należy wpisać wartość w polu „{{int:config-db-host}}”.",
+       "config-missing-db-server-oracle": "Należy wpisać wartość w polu „{{int:config-db-host-oracle}}”.",
        "config-invalid-db-server-oracle": "Nieprawidłowa nazwa instancji bazy danych (TNS) „$1”.\nUżyj \"TNS Name\" lub \"Easy Connect\" ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle Naming Methods])",
        "config-invalid-db-name": "Nieprawidłowa nazwa bazy danych „$1”.\nUżywaj wyłącznie liter ASCII (a-z, A-Z), cyfr (0-9), podkreślenia (_) lub znaku odejmowania (-).",
        "config-invalid-db-prefix": "Nieprawidłowy prefiks bazy danych „$1”.\nUżywaj wyłącznie liter ASCII (a-z, A-Z), cyfr (0-9), podkreślenia (_) lub znaku odejmowania (-).",
        "config-mysql-utf8": "UTF‐8",
        "config-mysql-charset-help": "W '''trybie binarnym''', MediaWiki zapisuje tekst UTF-8 do bazy danych w polach binarnych.\nJest on bardziej wydajny niż tryb UTF-8 w MySQL i pozwala na używanie znaków pełnego zakresu Unicode.\n\nW '''trybie UTF-8''', MySQL będzie znać zestaw znaków w jakim zakodowano dane, można też przedstawić i przekonwertuj je odpowiednio, ale nie pozwoli Ci przechowywać znaków spoza [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes podstawowej płaszczyzny wielojęzyczności].",
        "config-mssql-auth": "Typ uwierzytelniania:",
+       "config-mssql-install-auth": "Wybierz typ uwierzytelniania, który będzie używany do łączenia się z bazą danych w trakcie procesu instalacji.\nJeśli wybierzesz „{{int:config-mssql-windowsauth}}”, będą wykorzystywane dane konta użytkownika, pod którym działa serwer www.",
+       "config-mssql-web-auth": "Wybierz typ uwierzytelniania, który będzie używany przez serwer www do łączenia się z bazą danych podczas normalnego funkcjonowania wiki.\nJeśli wybierzesz „{{int:config-mssql-windowsauth}}”, użyte zostaną dane konta użytkownika, pod którym działa serwer www.",
        "config-mssql-sqlauth": "Uwierzytelnianie serwera SQL",
        "config-mssql-windowsauth": "Autoryzacja Windows",
        "config-site-name": "Nazwa wiki:",
        "config-profile-no-anon": "Wymagane utworzenie konta",
        "config-profile-fishbowl": "Wyłącznie zatwierdzeni edytorzy",
        "config-profile-private": "Prywatna wiki",
-       "config-profile-help": "Strony typu wiki działają najlepiej, gdy pozwolisz je edytować tak wielu osobom, jak to możliwie.\nW MediaWiki, można łatwo sprawdzić ostatnie zmiany i wycofać szkody, które są spowodowane przez naiwnych lub złośliwych użytkowników.\n\nJednakże wielu uznało MediaWiki użytecznym w różnorodnych rolach, a czasami nie jest łatwo przekonać wszystkich do korzyści ze sposobu działania wiki. Masz więc wybór.\n\nUstawienie '''{{int:config-profile-wiki}}''' pozwala każdemu na edycję, nawet bez logowania się.\nWiki z '''{{int:config-profile-no-anon}}''' zawiera dodatkowe możliwości ale może powstrzymywać potencjalnych edytorów.\n\nScenariusz '''{{int:config-profile-fishbowl}}''' umożliwia zatwierdzonym użytkownikom edycję, ale wyświetlanie stron jest powszechnie dostępne, włącznie z historią.\nUstawienie '''{{int:config-profile-private}}'' ' pozwala na wyświetlanie stron tylko zatwierdzonym użytkownikom, ta sama grupa może je edytować.\n\nBardziej skomplikowane konfiguracje uprawnień użytkowników są dostępne po zakończeniu instalacji, zobacz [//www.mediawiki.org/wiki/Manual:User_rights odpowiednią część podręcznika].",
+       "config-profile-help": "Strony typu wiki działają najlepiej, gdy pozwolisz je edytować tak wielu osobom, jak to możliwie.\nW MediaWiki, można łatwo sprawdzić ostatnie zmiany i wycofać szkody, które są spowodowane przez naiwnych lub złośliwych użytkowników.\n\nJednakże wielu uznało MediaWiki użytecznym w różnorodnych rolach, a czasami nie jest łatwo przekonać wszystkich do korzyści ze sposobu działania wiki. Masz więc wybór.\n\nUstawienie '''{{int:config-profile-wiki}}''' pozwala każdemu na edycję, nawet bez logowania się.\nWiki z '''{{int:config-profile-no-anon}}''' zawiera dodatkowe możliwości ale może powstrzymywać potencjalnych edytorów.\n\nScenariusz '''{{int:config-profile-fishbowl}}''' umożliwia zatwierdzonym użytkownikom edycję, ale wyświetlanie stron jest powszechnie dostępne, włącznie z historią.\nUstawienie '''{{int:config-profile-private}}'' ' pozwala na wyświetlanie stron tylko zatwierdzonym użytkownikom, ta sama grupa może je edytować.\n\nBardziej skomplikowane konfiguracje uprawnień użytkowników są dostępne po zakończeniu instalacji, zobacz [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights odpowiednią część podręcznika].",
        "config-license": "Prawa autorskie i licencja:",
        "config-license-none": "Brak stopki z licencją",
        "config-license-cc-by-sa": "Creative Commons – za uznaniem autora, na tych samych zasadach",
        "config-email-sender-help": "Wprowadź adres e-mail używany jako adres zwrotny wiadomości wychodzących.\nTo tam będą wysyłane szturchnięcia.\nWiele serwerów poczty wymaga, by co najmniej część nazwy domeny była prawidłowa.",
        "config-upload-settings": "Przesyłanie obrazków i plików",
        "config-upload-enable": "Włącz przesyłanie plików na serwer",
-       "config-upload-help": "Przesyłanie plików potencjalnie wystawia serwer na zagrożenia.\nWięcej informacji na ten temat można znaleźć w [//www.mediawiki.org/wiki/Manual:Security sekcji zabezpieczeń] podręcznika.\n\nAby włączyć przesyłanie plików, zmień właściwości podkatalogu <code>images</code> katalogu głównego MediaWiki tak, aby serwer sieci web mógł zapisywać do niego.\nNastępnie włącz tę opcję.",
+       "config-upload-help": "Przesyłanie plików potencjalnie wystawia serwer na zagrożenia.\nWięcej informacji na ten temat można znaleźć w [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security sekcji zabezpieczeń] podręcznika.\n\nAby włączyć przesyłanie plików, zmień właściwości podkatalogu <code>images</code> katalogu głównego MediaWiki tak, aby serwer sieci web mógł zapisywać do niego.\nNastępnie włącz tę opcję.",
        "config-upload-deleted": "Katalog dla usuniętych plików",
        "config-upload-deleted-help": "Wybierz katalog, w którym będzie archiwum usuniętych plików.\nNajlepiej, aby nie był on dostępny z internetu.",
        "config-logo": "Adres URL logo:",
        "config-logo-help": "Domyślny motyw MediaWiki zawiera miejsce na logo wielkości 135 x 160 pikseli powyżej menu na pasku bocznym.\nPrześlij obrazek o odpowiednim rozmiarze, a następnie wpisz jego URL tutaj.\n\nMożesz użyć <code>$wgStylePath</code> lub <code>$wgScriptPath</code> jeżeli twoje logo jest relatywne do tych ścieżek.\n\nJeśli nie chcesz logo, pozostaw to pole puste.",
        "config-instantcommons": "Włącz Instant Commons",
-       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] jest funkcją, która pozwala wiki używać obrazów, dźwięków i innych mediów znalezionych na  witrynie [//commons.wikimedia.org/ Wikimedia Commons].\nAby to zrobić, MediaWiki wymaga dostępu do internetu.\n\nAby uzyskać więcej informacji na temat tej funkcji, w tym instrukcje dotyczące sposobu ustawiania go na wiki innych niż Wikimedia Commons, sprawdź w [//mediawiki.org/wiki/Manual:$wgForeignFileRepos podręczniku].",
+       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] jest funkcją, która pozwala wiki używać obrazów, dźwięków i innych mediów znalezionych na  witrynie [//commons.wikimedia.org/ Wikimedia Commons].\nAby to zrobić, MediaWiki wymaga dostępu do internetu.\n\nAby uzyskać więcej informacji na temat tej funkcji, w tym instrukcje dotyczące sposobu ustawiania go na wiki innych niż Wikimedia Commons, sprawdź w [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos podręczniku].",
        "config-cc-error": "Wybieranie licencji Creative Commons nie dało wyniku.\nWpisz nazwę licencji ręcznie.",
        "config-cc-again": "Wybierz jeszcze raz...",
        "config-cc-not-chosen": "Wybierz którą chcesz licencję Creative Commons i kliknij „Dalej”.",
        "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-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 allow_url_fopen nie jest dostępne.",
+       "config-install-subscribe-notpossible": "cURL nie jest zainstalowany, więc <code>allow_url_fopen</code> nie jest dostępne.",
        "config-install-mainpage": "Tworzenie strony głównej z domyślną zawartością",
        "config-install-extension-tables": "Tworzenie tabel dla aktywnych rozszerzeń",
        "config-install-mainpage-failed": "Nie udało się wstawić strony głównej: $1",
        "config-install-done": "'''Gratulacje!'''\nUdało Ci się zainstalować MediaWiki.\n\nInstalator wygenerował plik konfiguracyjny <code>LocalSettings.php</code>.\n\nMusisz go pobrać i umieścić w katalogu głównym Twojej instalacji wiki (tym samym katalogu co index.php). Pobieranie powinno zacząć się automatycznie.\n\nJeżeli pobieranie nie zostało zaproponowane lub jeśli użytkownik je anulował, można ponownie uruchomić pobranie klikając poniższe łącze:\n\n$3\n\n'''Uwaga''': Jeśli nie zrobisz tego teraz, wygenerowany plik konfiguracyjny nie będzie już dostępny po zakończeniu instalacji.\n\nPo załadowaniu pliku konfiguracyjnego możesz '''[$2 wejść na wiki]'''.",
        "config-download-localsettings": "Pobierz <code>LocalSettings.php</code>",
        "config-help": "pomoc",
+       "config-help-tooltip": "kliknij, aby rozwinąć",
        "config-nofile": "Nie udało się odnaleźć pliku \"$1\". Czy nie został usunięty?",
-       "config-extension-link": "Czy wiesz, że twoja wiki obsługuje [//www.mediawiki.org/wiki/Manual:Extensions/pl rozszerzenia]?\n\nMożesz przejrzeć [//www.mediawiki.org/wiki/Category:Extensions_by_category rozszerzenia według kategorii] lub [//www.mediawiki.org/wiki/Extension_Matrix Extension Matrix] aby zobaczyć pełną listę rozszerzeń.",
+       "config-extension-link": "Czy wiesz, że twoja wiki obsługuje [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions/pl rozszerzenia]?\n\nMożesz przejrzeć [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category rozszerzenia według kategorii] lub [//www.mediawiki.org/wiki/Extension_Matrix Extension Matrix] aby zobaczyć pełną listę rozszerzeń.",
        "mainpagetext": "'''Instalacja MediaWiki powiodła się.'''",
-       "mainpagedocfooter": "Zobacz [//meta.wikimedia.org/wiki/Help:Contents przewodnik użytkownika] w celu uzyskania informacji o działaniu oprogramowania wiki.\n\n== Na początek ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings/pl Lista ustawień konfiguracyjnych]\n* [//www.mediawiki.org/wiki/Manual:FAQ/pl MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Komunikaty o nowych wersjach MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Przetłumacz MediaWiki na swój język]"
+       "mainpagedocfooter": "Zobacz [//meta.wikimedia.org/wiki/Help:Contents przewodnik użytkownika] w celu uzyskania informacji o działaniu oprogramowania wiki.\n\n== Na początek ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings/pl Lista ustawień konfiguracyjnych]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/pl MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Komunikaty o nowych wersjach MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Przetłumacz MediaWiki na swój język]"
 }
index 6ee8216..671671b 100644 (file)
        "config-restart": "É!, felo torna parte",
        "config-welcome": "=== Contròj d'ambient ===\nDle verìfiche ëd base a son fàite për vëdde se st'ambient a va bin për l'instalassion ëd MediaWiki.\nS'a l'ha da manca d'agiut durant l'anstalassion, a dovrìa fornì j'arzultà dë sti contròj.",
        "config-copyright": "=== Drit d'Autor e Condission ===\n\n$1\n\nCost-sì a l'é un programa lìber e a gràtis: a peul ridistribuilo e/o modifichelo sota le condission dla licensa pùblica general GNU com publicà da la Free Software Foundation; la version 2 dla Licensa, o (a toa sèrnìa) qualsëssìa version pi recenta.\n\nCost programa a l'é distribuì ant la speransa ch'a sia ùtil, ma '''sensa gnun-e garansìe'''; sensa gnanca la garansia implìssita ëd '''comersiabilità''' o '''d'esse adat a un but particolar'''.\n\nA dovrìa avèj arseivù <doclink href=Copying>na còpia ëd la licensa pùblica general GNU</doclink> ansema a sto programa; dësnò, ch'a scriva a la Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA opura [http://www.gnu.org/copyleft/gpl.html ch'a la lesa an linia].",
-       "config-sidebar": "* [//www.mediawiki.org Intrada MediaWiki]\n* [//www.mediawiki.org/wiki/Help:Contents Guida dl'Utent]\n* [//www.mediawiki.org/wiki/Manual:Contents Guida dl'Aministrator]\n* [//www.mediawiki.org/wiki/Manual:FAQ Soens an ciamo]\n----\n* <doclink href=Readme>Ch'am lesa</doclink>\n* <doclink href=ReleaseNotes>Nòte ëd publicassion</doclink>\n* <doclink href=Copying>Còpia</doclink>\n* <doclink href=UpgradeDoc>Agiornament</doclink>",
+       "config-sidebar": "* [//www.mediawiki.org Intrada MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Guida dl'Utent]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Guida dl'Aministrator]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Soens an ciamo]\n----\n* <doclink href=Readme>Ch'am lesa</doclink>\n* <doclink href=ReleaseNotes>Nòte ëd publicassion</doclink>\n* <doclink href=Copying>Còpia</doclink>\n* <doclink href=UpgradeDoc>Agiornament</doclink>",
        "config-env-good": "L'ambient a l'é stàit controlà.\nIt peule instalé MediaWiki.",
        "config-env-bad": "L'ambient a l'é stàit controlà.\nIt peule pa instalé MediaWiki.",
        "config-env-php": "PHP $1 a l'é instalà.",
        "config-env-php-toolow": "PHP $1 a l'é instalà.\nAnt tùit ij cas, MediaWiki a ciama PHP $2 o pi neuv.",
        "config-unicode-using-utf8": "As deuvra utf8_normalize.so ëd Brion Vibber për la normalisassion Unicode.",
        "config-unicode-using-intl": "As deuvra l'[http://pecl.php.net/intl estension intl PECL] për la normalisassion Unicode.",
-       "config-unicode-pure-php-warning": "'''Avis:''' L'[http://pecl.php.net/intl estension intl PECL] a l'é pa disponìbil për gestì la normalisassion Unicode, da già che l'implementassion an PHP pur a faliss për lentëssa.\nS'a gestiss un sit a àut tràfich, a dovrìa lese cheicòs an sla [//www.mediawiki.org/wiki/Unicode_normalization_considerations normalisassion Unicode].",
-       "config-unicode-update-warning": "'''Avis:''' La version instalà dlë spassiador ëd normalisassion Unicode a deuvra na version veja ëd la librarìa dël [http://site.icu-project.org/ proget ICU].\nA dovrìa fé n'[//www.mediawiki.org/wiki/Unicode_normalization_considerations agiornament] s'a l'é anteressà a dovré Unicode.",
+       "config-unicode-pure-php-warning": "'''Avis:''' L'[http://pecl.php.net/intl estension intl PECL] a l'é pa disponìbil për gestì la normalisassion Unicode, da già che l'implementassion an PHP pur a faliss për lentëssa.\nS'a gestiss un sit a àut tràfich, a dovrìa lese cheicòs an sla [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalisassion Unicode].",
+       "config-unicode-update-warning": "'''Avis:''' La version instalà dlë spassiador ëd normalisassion Unicode a deuvra na version veja ëd la librarìa dël [http://site.icu-project.org/ proget ICU].\nA dovrìa fé n'[//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations agiornament] s'a l'é anteressà a dovré Unicode.",
        "config-no-db": "Impossìbil trové un pilòta ëd base ëd dàit bon! A dev instalé un pilòta ëd base ëd dàit për PHP.\nLe sòrt ëd database ch'a ven-o a son apogià: $1.\n\nS'a l'é ansima a 'n servissi partagià, ch'a ciama a sò fornidor ëd servissi d'instalé un pilòta ëd base ëd dàit compatìbil.\nS'a l'é compilasse PHP chiel-midem, ch'a lo configura torna con un client ëd base ëd dàit abilità, për esempi an dovrand <code>./configure --with-mysql</code>.\nS'a l'ha instalà PHP dai pachèt Debian o Ubuntu, antlora a dev ëdcò istalé ël mòdul php5-mysql.",
        "config-outdated-sqlite": "'''Avis''': chiel a l'ha SQLite $1, che a l'é pi vej che la version mìnima dont a-i é damanca $2. SQLite a sarà pa disponìbil.",
        "config-no-fts3": "'''Avis''': SQLite a l'é compilà sensa ël mòdul [//sqlite.org/fts3.html FTS3], le funsion d'arserca a saran pa disponìbij su cost motor.",
@@ -81,7 +81,7 @@
        "config-no-cli-uri": "'''Avis''': pa gnun <code>--scriptpath</code> specificà, a sarà dovrà ël predefinì: <code>$1</code>.",
        "config-using-server": "Utilisassion dël nòm ëd servent \"<nowiki>$1</nowiki>\".",
        "config-using-uri": "Utilisassion ëd l'anliura ëd servent «<nowiki>$1$2</nowiki>».",
-       "config-uploads-not-safe": "'''Avis:''' Sò dossié stàndard për carié <code>$1</code> a l'é vulneràbil a l'esecussion ëd qualsëssìa senari.\nBele che MediaWiki a contròla j'aspet ëd sicurëssa ëd tùit j'archivi carià, a l'é motobin arcomandà ëd [//www.mediawiki.org/wiki/Manual:Security#Upload_security saré ës përtus ëd sicurëssa] prima d'abilité ij cariament.",
+       "config-uploads-not-safe": "'''Avis:''' Sò dossié stàndard për carié <code>$1</code> a l'é vulneràbil a l'esecussion ëd qualsëssìa senari.\nBele che MediaWiki a contròla j'aspet ëd sicurëssa ëd tùit j'archivi carià, a l'é motobin arcomandà ëd [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security saré ës përtus ëd sicurëssa] prima d'abilité ij cariament.",
        "config-no-cli-uploads-check": "'''Avis:''' Toa cartela predefinìa për j-amportassion (<code>$1</code>) a l'é nen controlà a propòsit ëd la vulnerabilità\nd'esecussion ëd senari arbitrari durant l'istalassion CLI.",
        "config-brokenlibxml": "Sò sistema a l'ha na combinassion ëd version PHP e libxml2 che a l'ha dij bigat e a peul provoché la corussion ëd dat ëstërmà an MediaWiki e d'àutre aplicassion për l'aragnà.\nCh'a agiorna a PHP 5.2.9 o pi neuv e libxml2 2.7.3 o pi neuv ([//bugs.php.net/bug.php?id=45996 bug filed with PHP]).\nIstalassion abortìa.",
        "config-suhosin-max-value-length": "Suhosin a l'é instalà e a lìmita la longheur dël paràmetr GET a $1 byte. Ël component ResourceLoader ëd MediaWiki a travajerà an rispetand ës lìmit, ma sòn a degraderà le prestassion. Se possìbil, a dovrìa amposté suhosin.get.max_value_lenght a 1024 o pi àut an <code>php.ini</code>, e amposté <code>$wgResourceLoaderMaxQueryLength</code> al midem valor an LocalSettings.php .",
        "config-profile-no-anon": "A venta creé un cont",
        "config-profile-fishbowl": "Mach editor autorisà",
        "config-profile-private": "Wiki privà",
-       "config-profile-help": "Le wiki a marcio mej quand ch'a lassa che pì përsone possìbij a-j modìfico.\nAn MediaWiki, a l'é bel fé revisioné j'ùltime modìfiche, e buté andré qualsëssìa dann che a sia fàit da dj'utent noviss o malissios.\n\nAn tùit ij cas, an tanti a l'han trovà che MediaWiki a sia ùtil ant na gran varietà ëd manere, e dle vire a l'é pa bel fé convince cheidun dij vantagi dla wiki.\nParèj a l'ha doe possibilità.\n\nËl model '''{{int:config-profile-wiki}}''' a përmët a chicassìa ëd modifiché, bele sensa intré ant ël sistema.\nNa wiki con  '''{{int:config-profile-no-anon}}''' a dà pì 'd contròl, ma a peul slontané dij contributor ocasionaj.\n\nËl senari '''{{int:config-profile-fishbowl}}''' a përmët a j'utent aprovà ëd modifiché, ma ël pùblich a peul vëdde le pàgine, comprèisa la stòria.\nUn '''{{int:config-profile-private}}''' a përmët mach a j'utent aprovà ëd vëdde le pàgine, con la midema partìa ch'a peul modifiché.\n\nConfigurassion ëd drit d'utent pi complicà a son disponìbij apress l'instalassion, vëdde la [//www.mediawiki.org/wiki/Manual:User_rights pàgina a pòsta dël manual].",
+       "config-profile-help": "Le wiki a marcio mej quand ch'a lassa che pì përsone possìbij a-j modìfico.\nAn MediaWiki, a l'é bel fé revisioné j'ùltime modìfiche, e buté andré qualsëssìa dann che a sia fàit da dj'utent noviss o malissios.\n\nAn tùit ij cas, an tanti a l'han trovà che MediaWiki a sia ùtil ant na gran varietà ëd manere, e dle vire a l'é pa bel fé convince cheidun dij vantagi dla wiki.\nParèj a l'ha doe possibilità.\n\nËl model '''{{int:config-profile-wiki}}''' a përmët a chicassìa ëd modifiché, bele sensa intré ant ël sistema.\nNa wiki con  '''{{int:config-profile-no-anon}}''' a dà pì 'd contròl, ma a peul slontané dij contributor ocasionaj.\n\nËl senari '''{{int:config-profile-fishbowl}}''' a përmët a j'utent aprovà ëd modifiché, ma ël pùblich a peul vëdde le pàgine, comprèisa la stòria.\nUn '''{{int:config-profile-private}}''' a përmët mach a j'utent aprovà ëd vëdde le pàgine, con la midema partìa ch'a peul modifiché.\n\nConfigurassion ëd drit d'utent pi complicà a son disponìbij apress l'instalassion, vëdde la [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights pàgina a pòsta dël manual].",
        "config-license": "Drit d'autor e licensa",
        "config-license-none": "Gnun-a licensa an nòta an bass",
        "config-license-cc-by-sa": "Creative Commons atribussion an part uguaj",
        "config-email-sender-help": "Ch'a anserissa l'adrëssa ëd pòsta eletrònica da dovré com adrëssa d'artorn dij mëssagi an surtìa.\nAmbelessì a l'é andova j'arspòste a saran mandà.\nMotobin ëd servent ëd pòsta a ciamo che almanch la part dël nòm ëd domini a sia bon-a.",
        "config-upload-settings": "Cariament ëd figure e archivi",
        "config-upload-enable": "Abilité ël cariament d'archivi",
-       "config-upload-help": "Carié d'archivi potensialment a espon sò servent a d'arzigh ëd sicurëssa.\nPer pi d'anformassion, ch'a lesa la [//www.mediawiki.org/wiki/Manual:Security session ëd sicurëssa] d'ës manual.\n\nPër abilité ël cariament d'archivi, ch'a modìfica la manera dël sot-dossié dle <code>figure</code> sota al dossié rèis ëd MediaWiki an manera che ël servent dl'aragnà a peussa scrivlo.\nPeui ch'a abìlita costa opsion.",
+       "config-upload-help": "Carié d'archivi potensialment a espon sò servent a d'arzigh ëd sicurëssa.\nPer pi d'anformassion, ch'a lesa la [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security session ëd sicurëssa] d'ës manual.\n\nPër abilité ël cariament d'archivi, ch'a modìfica la manera dël sot-dossié dle <code>figure</code> sota al dossié rèis ëd MediaWiki an manera che ël servent dl'aragnà a peussa scrivlo.\nPeui ch'a abìlita costa opsion.",
        "config-upload-deleted": "Dossié për j'archivi scancelà:",
        "config-upload-deleted-help": "ch'a serna un dossié andova goerné j'archivi scancelà.\nIdealment, sòn a dovrìa pa esse acessìbil an sl'aragnà.",
        "config-logo": "Anliura dla marca:",
        "config-logo-help": "La pel dë stàndard ëd MediaWiki a comprend lë spassi për na marca ëd 135x160 pontin dzora la lista dla bara lateral.\nCh'a dëscaria na figura ëd la dimension aproprià, e ch'a anserissa l'anliura ambelessì.\n\nS'a veul gnun-e marche, ch'a lassa ës camp bianch.",
        "config-instantcommons": "Abìlita Instant Commons",
-       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] a l'é na funsion ch'a përmët a le wiki ëd dovré dle figure, dij son e d'àutri mojen trovà an sël sit [//commons.wikimedia.org/ Wikimedia Commons].\nPër dovré sossì, MediaWiki a l'ha da manca dl'acess a la ragnà.\n\nPër pi d'anformassion su sta funsion, comprèise j'istrussion ëd com ampostela për wiki diferente da Wikimedia Commons, ch'a consulta [//mediawiki.org/wiki/Manual:$wgForeignFileRepos ël manual].",
+       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] a l'é na funsion ch'a përmët a le wiki ëd dovré dle figure, dij son e d'àutri mojen trovà an sël sit [//commons.wikimedia.org/ Wikimedia Commons].\nPër dovré sossì, MediaWiki a l'ha da manca dl'acess a la ragnà.\n\nPër pi d'anformassion su sta funsion, comprèise j'istrussion ëd com ampostela për wiki diferente da Wikimedia Commons, ch'a consulta [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos ël manual].",
        "config-cc-error": "La selession ëd la licensa Creative Commons a l'ha dàit gnun arzultà.\nCh'a anserissa ël nòm dla licensa a man.",
        "config-cc-again": "Torna cheuje...",
        "config-cc-not-chosen": "Sern che licensa Creative Commons it veule e sgnaca \"anans\".",
        "config-insecure-keys": "'''Avis:''' {{PLURAL:$2|Na ciav sigura|Dle ciav sigure}} ($1) generà durant l'istalassion {{PLURAL:$2|a l'é|a son}} pa completament sigure. Ch'a consìdera ëd modifiche{{PLURAL:$2|la|je}} manualment.",
        "config-install-sysop": "Creassion dël cont ëd l'utent aministrator",
        "config-install-subscribe-fail": "As peul pa sot-scrivse mediawiki-announce: $1",
-       "config-install-subscribe-notpossible": "cURL a l'é pa istalà e allow_url_fopen a l'é pa disponìbil.",
+       "config-install-subscribe-notpossible": "cURL a l'é pa istalà e <code>allow_url_fopen</code> a l'é pa disponìbil.",
        "config-install-mainpage": "Creassion ëd la pàgina prinsipal con un contnù predefinì",
        "config-install-extension-tables": "Creassion ëd tàule për j'estension abilità",
        "config-install-mainpage-failed": "As peul pa inserisse la pàgina prinsipal: $1",
        "config-help": "agiut",
        "config-nofile": "L'archivi «$1» as treuva nen. A l'é stàit ëscancelà?",
        "mainpagetext": "'''MediaWiki a l'é staita anstalà a la përfession.'''",
-       "mainpagedocfooter": "Che a varda la [//meta.wikimedia.org/wiki/Help:Contents User's Guide] për avèj dj'anformassion ant sël coma dovré ël programa dla wiki.\n\n== Për anandiesse a travajé ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista dij paràmeter ëd configurassion]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki Chestion frequente]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista ëd discussion an sla distribussion ëd MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Localisa MediaWiki për toa lenga]"
+       "mainpagedocfooter": "Che a varda la [//meta.wikimedia.org/wiki/Help:Contents User's Guide] për avèj dj'anformassion ant sël coma dovré ël programa dla wiki.\n\n== Për anandiesse a travajé ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista dij paràmeter ëd configurassion]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki Chestion frequente]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista ëd discussion an sla distribussion ëd MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localisa MediaWiki për toa lenga]"
 }
index b168a3f..cd9a3f9 100644 (file)
@@ -5,5 +5,5 @@
                ]
        },
        "mainpagetext": "'''MediaWiki's instalaciōni izpalla.'''",
-       "mainpagedocfooter": "Wīdais [//meta.wikimedia.org/wiki/Help:Contents przewodnik użytkownika] kāi gaūlai infōrmaciōnei ezze wiki prōgramijas tērpausnan.\n\n== En pagaūseņu ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]"
+       "mainpagedocfooter": "Wīdais [//meta.wikimedia.org/wiki/Help:Contents przewodnik użytkownika] kāi gaūlai infōrmaciōnei ezze wiki prōgramijas tērpausnan.\n\n== En pagaūseņu ==\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 7b2e4ea..23d3027 100644 (file)
@@ -61,5 +61,5 @@
        "config-download-localsettings": "ښکته کول <code>LocalSettings.php</code>",
        "config-help": "لارښود",
        "mainpagetext": "'''MediaWiki په برياليتوب سره نصب شو.'''",
-       "mainpagedocfooter": "د ويکي ساوترې د کارولو د  مالوماتو په اړه [//meta.wikimedia.org/wiki/Help:Contents د کارن لارښود] سره سلا وکړۍ.\n\n== پيلول ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings د امستنو د سازونې لړليک]\n* [//www.mediawiki.org/wiki/Manual:FAQ د ميډياويکي ډېرځليزې پوښتنې]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce د مېډياويکي د برېښليکونو لړليک]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources خپلې ژبې لپاره MediaWiki ځايتابول]"
+       "mainpagedocfooter": "د ويکي ساوترې د کارولو د  مالوماتو په اړه [//meta.wikimedia.org/wiki/Help:Contents د کارن لارښود] سره سلا وکړۍ.\n\n== پيلول ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings د امستنو د سازونې لړليک]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ د ميډياويکي ډېرځليزې پوښتنې]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce د مېډياويکي د برېښليکونو لړليک]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources خپلې ژبې لپاره MediaWiki ځايتابول]"
 }
index b0eebeb..6da4caf 100644 (file)
                        "Anaclaudiaml",
                        "Cybermandrake",
                        "Fabsouza1",
-                       "Rodrigo codignoli"
+                       "Rodrigo codignoli",
+                       "Tuliouel"
                ]
        },
        "config-desc": "O instalador do MediaWiki",
        "config-title": "Instalação do MediaWiki $1",
        "config-information": "Informações",
-       "config-localsettings-upgrade": "Foi detectada a existência do arquivo <code>LocalSettings.php</code>.\nPara atualizar esta instalação, insira no box abaixo o valor de <code>$wgUpgradeKey</code>.\nEssa informação pode ser encontrada no arquivo <code>LocalSettings.php</code>",
+       "config-localsettings-upgrade": "Foi detectada a existência do arquivo <code>LocalSettings.php</code>.\nPara atualizar esta instalação, insira na caixa abaixo o valor de <code>$wgUpgradeKey</code>.\nEssa informação pode ser encontrada no arquivo <code>LocalSettings.php</code>",
        "config-localsettings-cli-upgrade": "Foi detectada a existência do arquivo <code><code>LocalSettings.php</code></code>.\nAtualize esta instalação executando o arquivo <code>update.php</code>",
        "config-localsettings-key": "Chave de atualização:",
        "config-localsettings-badkey": "A chave fornecida está incorreta.",
-       "config-upgrade-key-missing": "Foi detectada uma instalação existente do MediaWiki.\nPara atualizar esta instalação, insira a seguinte linha na parte inferior do seu <code>LocalSettings.php</code>:\n\n$1",
-       "config-localsettings-incomplete": "O arquivo <code>LocalSettings.php</code> parece incompleto.\nA variável $1 não está definida.\nAltere seu <code>LocalSettings.php</code> com a definição dessa variável e clique em \"{{int:Config-continue}}\".",
+       "config-upgrade-key-missing": "Foi detectada uma instalação existente do MediaWiki.\nPara atualizar esta instalação, insira a seguinte linha ao final do seu <code>LocalSettings.php</code>:\n\n$1",
+       "config-localsettings-incomplete": "O arquivo <code>LocalSettings.php</code> parece incompleto.\nA variável $1 não está definida.\nPor favor, altere seu <code>LocalSettings.php</code> e defina esta variável e clique em \"{{int:Config-continue}}\".",
        "config-localsettings-connection-error": "Ocorreu um erro ao conectar ao banco de dados através das configurações presentes no arquivo <code>LocalSettings.php</code>. Por favor, corrija essas configurações e tente novamente.\n\n$1",
        "config-session-error": "Erro ao iniciar a sessão: $1",
-       "config-session-expired": "Os seus dados de sessão parecem ter expirado.\nAs sessões estão configuradas para uma duração de $1.\nVocê pode aumentar esta duração configurando <code>session.gc_maxlifetime</code> no php.ini.\nReinicie o processo de instalação.",
-       "config-no-session": "Os seus dados de sessão foram perdidos!\nVerifique o seu php.ini e certifique-se de que em <code>session.save_path</code> está definido um diretório apropriado.",
+       "config-session-expired": "Os dados da sua sessão parecem ter expirado.\nAs sessões estão configuradas para uma duração de $1.\nVocê pode aumentar esta duração configurando <code>session.gc_maxlifetime</code> no php.ini.\nReinicie o processo de instalação.",
+       "config-no-session": "Os dados da sua sessão foram perdidos!\nVerifique o seu php.ini e certifique-se de que em <code>session.save_path</code> está definido um diretório apropriado.",
        "config-your-language": "Seu idioma:",
        "config-your-language-help": "Selecione o idioma que será usado durante o processo de instalação.",
-       "config-wiki-language": "Idioma do wiki:",
-       "config-wiki-language-help": "Selecione o idioma em que o wiki será predominantemente escrito.",
+       "config-wiki-language": "Idioma da wiki:",
+       "config-wiki-language-help": "Selecione o idioma no qual a wiki será predominantemente escrita.",
        "config-back": "← Voltar",
        "config-continue": "Continuar →",
        "config-page-language": "Idioma",
        "config-page-existingwiki": "Wiki existente",
        "config-help-restart": "Deseja limpar todos os dados salvos que você introduziu e reiniciar o processo de instalação?",
        "config-restart": "Sim, reiniciar",
-       "config-welcome": "=== Verificações de ambiente ===\nSão realizadas verificações básicas para determinar se este ambiente é apropriado para a instalação do MediaWiki.\nLembre-se de incluir estas informações se for procurar por suporte para a conclusão da instalação.",
-       "config-copyright": "=== Direitos autorais e Termos de uso ===\n\n$1\n\nEste programa é software livre; você pode redistribuí-lo e/ou modificá-lo nos termos da licença GNU General Public License, tal como publicada pela Free Software Foundation; tanto a versão 2 da Licença, como (por opção sua) qualquer versão posterior.\n\nEste programa é distribuído na esperança de que seja útil, mas '''sem qualquer garantia'''; inclusive, sem a garantia implícita da '''possibilidade de ser comercializado''' ou de '''adequação para qualquer finalidade específica'''.\nConsulte a licença GNU General Public License para mais detalhes.\n\nEm conjunto com este programa você deve ter recebido <doclink href=Copying>uma cópia da licença GNU General Public License</doclink>; se não a recebeu, peça-a por escrito para Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ou [http://www.gnu.org/copyleft/gpl.html leia-a na internet].",
-       "config-sidebar": "* [//www.mediawiki.org/wiki/MediaWiki Página principal do MediaWiki]\n* [//www.mediawiki.org/wiki/Help:Contents Manual de uso]\n* [//www.mediawiki.org/wiki/Manual:Contents Manual administrativo]\n* [//www.mediawiki.org/wiki/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>Leia-me</doclink>\n* <doclink href=ReleaseNotes>Notas de lançamento</doclink>\n* <doclink href=Copying>Licença</doclink>\n* <doclink href=UpgradeDoc>Como fazer upgrade</doclink>",
+       "config-welcome": "=== Verificações de ambiente ===\nSerão realizadas verificações básicas para determinar se este ambiente é apropriado para a instalação do MediaWiki.\nLembre-se de incluir estas informações se for procurar por suporte para como concluir a instalação.",
+       "config-copyright": "=== Direitos autorais e Termos de uso ===\n\n$1\n\nEste programa é software livre; você pode redistribuí-lo e/ou modificá-lo nos termos da licença GNU General Public License tal como publicada pela Free Software Foundation; tanto a versão 2 da Licença, como (por opção sua) qualquer versão posterior.\n\nEste programa é distribuído na esperança de que seja útil, mas <strong>sem qualquer garantia</strong>; inclusive, sem a garantia implícita da <strong>possibilidade de ser comercializado</strong> ou de <strong>adequação para qualquer finalidade específica</strong>.\nConsulte a licença GNU General Public License para mais detalhes.\n\nEm conjunto com este programa você deve ter recebido <doclink href=Copying>uma cópia da licença GNU General Public License</doclink>; se não a recebeu, peça-a por escrito para Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ou [http://www.gnu.org/copyleft/gpl.html leia-a na internet].",
+       "config-sidebar": "* [//www.mediawiki.org/wiki/MediaWiki Página principal do MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Manual do usuário]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Manual do administrador]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>Leia-me</doclink>\n* <doclink href=ReleaseNotes>Notas de lançamento</doclink>\n* <doclink href=Copying>Licença</doclink>\n* <doclink href=UpgradeDoc>Atualizando</doclink>",
        "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-php-toolow": "PHP $1 está instalado.\nNo entanto, o MediaWiki requer PHP $2 ou superior.",
        "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": "'''Aviso''': A [http://pecl.php.net/intl extensão intl PECL] não está disponível para efetuar a normalização Unicode sendo usada, em seu lugar, 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/Unicode_normalization_considerations normalização Unicode].",
-       "config-unicode-update-warning": "\"Aviso:\" A versão instalada do wrapper Unicode usa uma versão mais antiga da biblioteca do : [//www.site.icu-project.org/projeto ICU].\nVocê devia [//www.mediawiki.org/wiki/Unicode_normalization_considerations upgrade] se você tem quaisquer procupações com o uso do Unicode",
+       "config-unicode-pure-php-warning": "<strong>Aviso</strong>: A [http://pecl.php.net/intl extensão intl PECL] não está disponível para efetuar a normalização Unicode, abortando e passando para a lenta implementação de PHP puro.\nSe o seu site tem um alto volume de tráfego, informe-se sobre a [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalização Unicode].",
+       "config-unicode-update-warning": "<strong>Aviso:</strong> A versão instalada do wrapper de normalização Unicode usa uma versão mais antiga da biblioteca do [//www.site.icu-project.org/projeto ICU].\nVocê deve [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations atualizar] se você tem quaisquer preocupações com o uso do Unicode.",
        "config-no-db": "Não foi possível encontrar um driver de banco de dados adequado! É necessário instalar um driver de banco de dados para o PHP.\nSão suportados os seguintes tipos de bancos de dados: $1.\n\nSe você mesmo tiver compilado o PHP, reconfigure-o com um cliente de banco de dados ativado usando, por exemplo <code>./configure --with-mysqli</code>.\nSe você instalou o PHP a partir de um pacote do Debian ou do Ubuntu, então será também necessário instalar, por exemplo, o pacote <code>php5-mysql</code>.",
-       "config-outdated-sqlite": "<strong>AVISO:</strong> você tem SQLite  $1 , que é menor do que a versão mínima necessária  $2 . SQLite não estará disponível.",
-       "config-no-fts3": "' ' 'Aviso' ' ': O SQLite foi compilado sem o módulo [//sqlite.org/fts3.html FTS3]; as funcionalidades de pesquisa não estarão disponíveis nesta instalação.",
-       "config-register-globals": "' ' 'Aviso: A opção <code>[http://php.net/register_globals register_globals]</code> do PHP está ativada.'''\n' ' 'Desative-a, se puder.'''\nO MediaWiki funcionará mesmo assim, mas o seu servidor ficará exposto a potenciais vulnerabilidades de segurança.",
-       "config-magic-quotes-runtime": "'''Fatal: A opção [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] está ativada!'''\nEsta opção causa corrupção dos dados de entrada, de uma forma imprevisível.\nNão pode instalar ou usar o MediaWiki a menos que esta opção seja desativada.",
-       "config-magic-quotes-sybase": "<strong>Fatal: A opção [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] está ativada!</strong>\nEsta opção corrompe os dados de entrada de forma imprevisível.\nNão pode instalar ou usar o MediaWiki a menos que esta opção seja desativada.",
-       "config-mbstring": "<strong>Fatal: A opção [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] está ativada!</strong>\nEsta opção causa erros e pode corromper os dados de forma imprevisível.\nNão pode instalar ou usar o MediaWiki a menos que esta opção seja desativada.",
-       "config-safe-mode": "<strong>Aviso:</strong> O [http://www.php.net/features.safe-mode safe mode] do PHP está ativo.\nEste modo pode causar problemas, especialmente no upload de arquivos e no suporte a <code>math</code>.",
-       "config-xml-bad": "O módulo XML do PHP está ausente.\nO MediaWiki necessita de funções deste módulo e não funcionará com esta configuração.\nSe está executando o Mandrake, instale o pacote php-xml.",
-       "config-pcre-old": "<strong>Fatal:</strong> É necessário o PCRE $1 ou versão posterior.\nO binário do seu PHP foi vinculado com o PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Mais informações].",
-       "config-pcre-no-utf8": "<strong>Fatal:</strong> O módulo PCRE do PHP parece ser compilado sem suporte PCRE_UTF8.\nO MediaWiki requer suporte a UTF-8 para funcionar corretamente.",
+       "config-outdated-sqlite": "<strong>Aviso:</strong> você tem o SQLite versão $1, que é menor do que a versão mínima necessária $2. O SQLite não estará disponível.",
+       "config-no-fts3": "<strong>Aviso</strong> O SQLite foi compilado sem o [//sqlite.org/fts3.html módulo FTS3], as funcionalidades de pesquisa não estarão disponíveis nesta instalação.",
+       "config-register-globals": "<strong>Aviso: A opção <code>[http://php.net/register_globals register_globals]</code> do PHP está ativada.\nDesative-a se puder.</strong>\nO MediaWiki funcionará mesmo assim, mas o seu servidor ficará exposto a potenciais vulnerabilidades de segurança.",
+       "config-magic-quotes-runtime": "<strong>Erro fatal: A opção [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] está ativada!</strong>\nEsta opção causa corrupção dos dados de entrada de forma imprevisível.\nVocê não pode instalar ou utilizar o MediaWiki a menos que esta opção seja desativada.",
+       "config-magic-quotes-sybase": "<strong>Erro fatal: A opção [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] está ativada!</strong>\nEsta opção corrompe os dados de entrada de forma imprevisível.\nVocê não pode instalar ou utilizar o MediaWiki a menos que esta opção seja desativada.",
+       "config-mbstring": "<strong>Erro fatal: A opção [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] está ativada!</strong>\nEsta opção causa erros e pode corromper os dados de forma imprevisível.\nVocê não pode instalar ou utilizar o MediaWiki a menos que esta opção seja desativada.",
+       "config-safe-mode": "<strong>Aviso:</strong> O [http://www.php.net/features.safe-mode safe mode] do PHP está ativado.\nEste modo pode causar problemas, especialmente no upload de arquivos e no suporte a <code>math</code>.",
+       "config-xml-bad": "O módulo XML do PHP está ausente.\nO MediaWiki necessita de funções deste módulo e não funcionará com esta configuração.\nSe está utilizando o Mandrake, instale o pacote php-xml.",
+       "config-pcre-old": "<strong>Erro fatal:</strong> É necessário o PCRE $1 ou versão posterior.\nO binário do seu PHP foi vinculado com o PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Mais informações].",
+       "config-pcre-no-utf8": "<strong>Erro fatal:</strong> O módulo PCRE do PHP parece ser compilado sem suporte a PCRE_UTF8.\nO MediaWiki requer suporte a UTF-8 para funcionar corretamente.",
        "config-memory-raised": "A configuração <code>memory_limit</code> do PHP era $1; foi aumentada para $2.",
-       "config-memory-bad": "<strong>AVISO:</strong> A configuração <code>memory_limit</code> do PHP é $1.\nIsso provavelmente é muito baixo.\nA instalação pode falhar!",
-       "config-ctype": "<strong>Fatal:</strong> O PHP deve ser compilado com suporte para o [http://www.php.net/manual/en/ctype.installation.php extensão Ctype].",
-       "config-json": "<strong>Fatal:</strong> O PHP foi compilado sem suporte a JSON.\nVocê deve instalar a extensão PHP JSON ou a extensão [http://pecl.php.net/package/jsonc PECL jsonc] antes de instalar o MediaWiki.!N.* A extensão JSON do PHP já está incluída no Red Hat Enterprise Linux (CentOS) 5 e 6, mas deve ser habilitado no <code>/etc/php.ini</code> ou no <code>/etc/php.d/json.ini</code> .!N. * Algumas distribuições Linux lançadas após maio de 2013 omitem a extensão PHP, oferecendo em seu lugar a extensão PECL como parte do pacote <code>php5-json</code> ou do <code>php-pecl-jsonc</code> .",
+       "config-memory-bad": "<strong>Aviso:</strong> A configuração <code>memory_limit</code> do PHP é $1.\nIsso provavelmente é muito baixo.\nA instalação pode falhar!",
+       "config-ctype": "<strong>Erro fatal:</strong> O PHP deve ser compilado com suporte para a [http://www.php.net/manual/en/ctype.installation.php extensão Ctype].",
+       "config-json": "<strong>Erro fatal:</strong> O PHP foi compilado sem suporte a JSON.\nVocê deve instalar a extensão PHP JSON ou a extensão [http://pecl.php.net/package/jsonc PECL jsonc] antes de instalar o MediaWiki.\n* A extensão JSON do PHP já está incluída no Red Hat Enterprise Linux (CentOS) 5 e 6, mas deve ser habilitado no <code>/etc/php.ini</code> ou no <code>/etc/php.d/json.ini</code>.\n* Algumas distribuições Linux lançadas após maio de 2013 omitem a extensão PHP, oferecendo em seu lugar a extensão PECL como parte do pacote <code>php5-json</code> ou do <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": "<strong>AVISO:</strong> Não foi possível encontrar o [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] ou [http://www.iis.net/download/WinCacheForPhp WinCache].\nO cache de objetos não está habilitado.",
-       "config-mod-security": "<strong>AVISO:</strong> Seu servidor web tem [http://modsecurity.org/ mod_security] habilitado. Se configurado incorretamente, pode causar problemas para o MediaWiki ou outro software que permite aos usuários postar conteúdo arbitrário.\nConsulte a [http://modsecurity.org/documentation/ documentação do mod_security] ou entre em contato com o suporte do seu host se você encontrar erros aleatórios.",
+       "config-no-cache": "<strong>Aviso:</strong> Não foi possível encontrar o [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] ou [http://www.iis.net/download/WinCacheForPhp WinCache].\nO cache de objetos não está habilitado.",
+       "config-mod-security": "<strong>Aviso:</strong> Seu servidor web tem [http://modsecurity.org/ mod_security] habilitado. Se configurado incorretamente, pode causar problemas para o MediaWiki ou outro software que permite aos usuários postar conteúdo arbitrário.\nConsulte a [http://modsecurity.org/documentation/ documentação do mod_security] ou entre em contato com o suporte do seu host se você encontrar erros aleatórios.",
        "config-diff3-bad": "O GNU diff3 não foi encontrado.",
-       "config-git": "Foi encontrado o software de controle de versão Git <code>$1</code>.",
+       "config-git": "Foi encontrado o software de controle de versão Git: <code>$1</code>.",
        "config-git-bad": "Não foi encontrado o software de controle de versão Git.",
        "config-imagemagick": "ImageMagick encontrado: <code>$1</code> .\nRedimensionamento de imagem será ativado se você permitir uploads.",
-       "config-no-uri": "<strong>Error:</strong> Não foi possível determinar a URI atual. A instalação foi abortada.",
+       "config-no-uri": "<strong>Erro:</strong> Não foi possível determinar a URI atual. A instalação foi abortada.",
        "config-using-server": "Utilizando o nome do servidor \"<nowiki>$1</nowiki>\".",
        "config-using-uri": "Usando URL do servidor \"<nowiki>$1$2</nowiki>\".",
        "config-db-type": "Tipo de base de dados:",
        "config-db-host": "Servidor da base de dados:",
-       "config-db-host-help": "Se a sua base de dados está em um servidor diferente, digite o nome do hospedeiro ou o endereço IP aqui.\n\nSe você está utilizando um hospedeiro web compartilhado, o seu provedor de hospedagem deverá fornecer o nome do hospedeiro correto e a sua documentação.\n\nSe você está instalando em um servidor Windows e usando o MySQL, usar \"localhost\" não deverá funcionar para o nome de servidor. Se não funcionar, tente \"127.0.01\" para o endereço de IP local.\n\nSe você está usando PostgreSQL, deixe este campo em branco para se conectar através de um socket Unix.",
+       "config-db-host-help": "Se a base de dados do seu servidor está em um servidor diferente, digite o nome do hospedeiro ou o endereço IP aqui.\n\nSe você está utilizando um hospedeiro web compartilhado, o seu provedor de hospedagem deverá fornecer o nome do hospedeiro correto na sua documentação.\n\nSe você está instalando em um servidor Windows e usando o MySQL, usar \"localhost\" pode não funcionar para o nome de servidor. Se não funcionar, tente \"127.0.01\" para o endereço de IP local.\n\nSe você está usando PostgreSQl, deixe este campo em branco para se conectar através de um socket Unix.",
        "config-db-host-oracle": "TNS da base de dados:",
        "config-db-wiki-settings": "Identifique esta wiki",
        "config-db-name": "Nome da base de dados:",
        "config-db-name-help": "Escolha um nome que identifique a sua wiki.\nEle não deve conter espaços.\n\nSe você está utilizando um hospedeiro web compartilhado, o provedor de hospedagem lhe dará um nome especifico de base de dados para usar ou o deixará criar a partir do painel de controle.",
        "config-db-name-oracle": "Esquema de base de dados:",
        "config-db-install-account": "Conta de usuário para instalação",
-       "config-db-username": "Usuário de base de dados:",
-       "config-db-password": "Senha da base de dados:",
-       "config-db-password-empty": "Por favor digite uma senha para o novo usuário da base de dados: $1. Embora seja possível criar usuários sem senha, isto não é seguro.",
-       "config-db-install-username": "Digite o nome de usuário que será utilizado para conectar com a base de dados durante o processo de instalação.\nEste não é a conta de usuário do MediaWiki; este é o usuário da sua base de dados.",
-       "config-db-install-password": "Digite a senha que será utilizada para conectar com a base de dados durante o processo de instalação.\nEsta não é a senha de usuário da conta do MediaWiki; esta será a senha da sua base de dados.",
-       "config-db-install-help": "Digite o nome de usuário e a senha que será utilizada para conectar com a base de dados durante o processo de instalação.",
+       "config-db-username": "Nome de usuário do banco de dados:",
+       "config-db-password": "Senha do banco de dados:",
+       "config-db-password-empty": "Por favor digite uma senha para o novo usuário do banco de dados: $1. Embora seja possível criar usuários sem senha, isto não é seguro.",
+       "config-db-install-username": "Digite o nome de usuário que será utilizado para conectar com o banco de dados durante o processo de instalação.\nEste não é a conta de usuário do MediaWiki; este é o nome de usuário para sua base de dados.",
+       "config-db-install-password": "Digite a senha que será utilizada para conectar com o banco de dados durante o processo de instalação.\nEsta não é a senha de usuário da conta do MediaWiki; esta será a senha para seu banco de dados.",
+       "config-db-install-help": "Digite o nome de usuário e a senha que serão utilizados para conectar com o banco de dados durante o processo de instalação.",
        "config-db-prefix": "Prefixo da tabela de banco de dados:",
-       "config-db-prefix-help": "Se você precisar compartilhar a base de dados entre várias wikis, ou entre MediaWiki e uma outra aplicação web, você deve escolher adicionar um prefixo para todas as tabelas para evitar conflitos.\nNão utilize espaços.\n\nEste campo é habitualmente deixado em branco.",
-       "config-db-charset": "Conjunto de caracteres da base de dados",
+       "config-db-prefix-help": "Se você precisar compartilhar a base de dados entre várias wikis, ou entre o MediaWiki e uma outra aplicação web, você pode deve escolher adicionar um prefixo ao nome de todas as tabelas para evitar conflitos.\nNão utilize espaços.\n\nEste campo é habitualmente deixado em branco.",
+       "config-db-charset": "Conjunto de caracteres do banco de dados",
        "config-charset-mysql5-binary": "MySQL 4.1/5.0 binary",
        "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
        "config-mysql-old": "MySQL $1 ou posterior é necessário. Você tem $2.",
        "config-db-port": "Porta da base de dados:",
        "config-db-schema": "Esquema para MediaWiki",
-       "config-db-schema-help": "Este esquema geralmente estará correto.\nSomente modifique se você souber que precisa disso.",
+       "config-db-schema-help": "Este esquema geralmente estará correto.\nSó o modifique se você tiver certeza que precisa.",
        "config-pg-test-error": "Não foi possível se conectar com a base de dados <strong>$1</strong>: $2",
        "config-sqlite-dir": "Diretório de dados do SQLite:",
-       "config-sqlite-dir-help": "SQLite armazena todos os dados em um único arquivo.\n\nO diretório que você forneceu deve permitir a escrita do servidor web durante a instalação.\n\nO diretório <strong>não</strong> deve ser acessível pela web, por isso não estamos colocando onde estão os seus arquivos PHP.\n\nO instalador escreverá um <code>.htaccess</code> arquivo, mas se isso falhar alguém poderá ganhar acesso em toda sua base de dados.\nIsso inclui dados dos usuários (endereço de email, senhas criptografadas) assim como todas revisões deletadas e outros dados restritos na wiki.\n\nConsidere colocar a base de dados em algum outro lugar, por exemplo <code>/var/lib/mediawiki/yourwiki</code>.",
+       "config-sqlite-dir-help": "O SQLite armazena todos os dados em um único arquivo.\n\nO diretório que você fornecer deve permitir a sua escrita pelo servidor web durante a instalação.\n\nO diretório <strong>não</strong> deve ser acessível pela web, por isso não estamos colocando onde estão os seus arquivos PHP.\n\nO instalador escreverá um arquivo <code>.htaccess</code>, mas se isso falhar alguém poderá ganhar acesso a toda sua base de dados.\nIsso inclui dados brutos dos usuários (endereços de email, senhas criptografadas) assim como todas revisões deletadas e outros dados restritos na wiki.\n\nConsidere colocar a base de dados em algum outro lugar, por exemplo <code>/var/lib/mediawiki/yourwiki</code>.",
        "config-oracle-def-ts": "Espaço de tabela padrão:",
-       "config-oracle-temp-ts": "Espaço de tabela temporário:",
+       "config-oracle-temp-ts": "Tablespace temporário:",
        "config-type-mysql": "MySQL (ou compatível)",
        "config-type-mssql": "Microsoft SQL Server",
        "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] é um sistema de banco de dados leve que é muito bem suportado. ([http://www.php.net/manual/en/pdo.installation.php como compilar o PHP com suporte a SQLite], usa DOP)",
        "config-header-sqlite": "Configurações SQLite",
        "config-header-oracle": "Configurações Oracle",
        "config-header-mssql": "Configurações Microsoft SQL Server",
-       "config-invalid-db-type": "Tipo de base de dados inválido",
-       "config-missing-db-name": "Você deve inserir um valor para \"Nome da base de dados\"",
-       "config-missing-db-host": "Você deve inserir um valor para \"Hospedeiro da base de dados\"",
-       "config-missing-db-server-oracle": "Você deve inserir um valor para \"Database TNS\"",
-       "config-connection-error": "$1\n\nVerifique o servidor hospedeiro, nome de usuário e senha e tente novamente.",
-       "config-db-sys-user-exists-oracle": "Conta de usuário $1 já existe. SYSDBA somente será utilizado para criação de uma nova conta!",
+       "config-invalid-db-type": "Tipo de base de dados inválido.",
+       "config-missing-db-name": "Você deve inserir um valor para \"{{int:config-db-name}}\".",
+       "config-missing-db-host": "Você deve inserir um valor para \"{{int:config-db-host}}\".",
+       "config-missing-db-server-oracle": "Você deve inserir um valor para \"{{int:config-db-host-oracle}}\".",
+       "config-connection-error": "$1\n\nVerifique o servidor, nome de usuário e senha e tente novamente.",
+       "config-db-sys-user-exists-oracle": "A conta de usuário $1 já existe. SYSDBA somente pode ser utilizado na criação de uma nova conta!",
        "config-postgres-old": "PostgreSQL $1 ou posterior é necessário. Você tem $2.",
        "config-mssql-old": "Microsoft SQL Server $1 ou posterior é necessário.Você tem $2.",
-       "config-sqlite-name-help": "Escolha um nome que identifique a sua wiki.\nNão utilize espaços ou hifens.\nIsto será utilizado como nome de arquivo SQLite.",
+       "config-sqlite-name-help": "Escolha um nome que identifique a sua wiki.\nNão utilize espaços ou hifens.\nIsto será utilizado como nome do arquivo de dados do SQLite.",
        "config-sqlite-mkdir-error": "Ocorreu um erro na criação do diretório de dados \"$1\".\nVerifique a localização e tente de novo.",
-       "config-sqlite-dir-unwritable": "Não foi possível escrever no diretório \"$1\".\nModifique as permissões então o servidor web poderá escrever no diretório, e tente novamente.",
+       "config-sqlite-dir-unwritable": "Não foi possível escrever no diretório \"$1\".\nModifique as permissões de modo que o servidor web possa escrever no diretório e tente novamente.",
        "config-sqlite-connection-error": "$1\n\nVerifique o diretório de dados e nome da base de dados abaixo e tente novamente.",
        "config-sqlite-readonly": "Não é possível escrever no arquivo <code>$1</code>.",
        "config-sqlite-cant-create-db": "Não foi possível criar o arquivo da base de dados <code>$1</code>.",
        "config-db-web-account": "Conta da base de dados para acesso web",
-       "config-db-web-help": "Escolha um nome de usuário e uma senha para que o servidor web use, para se conectar ao servidor da base de dados, durante o funcionamento normal da Wiki.",
+       "config-db-web-help": "Escolha um nome de usuário e uma senha que o servidor web irá utilizar para se conectar ao servidor da base de dados durante o funcionamento normal da wiki.",
        "config-db-web-account-same": "Use a mesma conta usada na instalação",
-       "config-db-web-create": "Crie uma conta, se esta não existir ainda.",
-       "config-db-web-no-create-privs": "A conta que você especificou para a instalação não possui privilégios o bastante para criar uma conta.\nA conta que você especificou aqui já deve existir.",
+       "config-db-web-create": "Crie a conta se esta ainda não existir.",
+       "config-db-web-no-create-privs": "A conta que você especificou para a instalação não possui privilégios suficientes para criar uma conta.\nA conta que especificar aqui deve já existir.",
        "config-mysql-engine": "Mecanismo de armazenamento:",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
        "config-mssql-auth": "Tipo de autenticação:",
        "config-mssql-sqlauth": "Autenticação do SQL Server",
        "config-mssql-windowsauth": "Autenticação do Windows",
-       "config-site-name": "Nome da Wiki:",
+       "config-site-name": "Nome da wiki:",
        "config-site-name-help": "Isto aparecerá na barra de títulos do navegador e em vários outros lugares.",
        "config-site-name-blank": "Digite o nome do site.",
+       "config-project-namespace": "Domínio do projeto:",
        "config-ns-generic": "Projeto",
        "config-ns-site-name": "O mesmo que o nome da wiki: $1",
        "config-ns-other": "Outro (especifique)",
-       "config-ns-other-default": "MinhaWiki",
-       "config-ns-invalid": "O nome de espaços especificados \"<nowiki>$1</nowiki>\" é inválido. Especifique um nome de espaços de projeto diferente.",
+       "config-ns-other-default": "AMinhaWiki",
+       "config-ns-invalid": "O domínio especificado \"<nowiki>$1</nowiki>\" é inválido. Especifique um domínio do projeto diferente.",
+       "config-ns-conflict": "O domínio especificado \"<nowiki>$1</nowiki>\" conflita com um domínio padrão do MediaWiki.\nEspecifique um domínio do projeto diferente.",
        "config-admin-box": "Conta de administrador",
        "config-admin-name": "Seu nome de usuário:",
        "config-admin-password": "Senha:",
        "config-admin-error-bademail": "Você digitou um endereço de email inválido.",
        "config-almost-done": "Você está quase terminando!\nVocê agora pode pular as configurações restantes e instalar a wiki agora mesmo.",
        "config-optional-continue": "Faça-me mais perguntas.",
-       "config-optional-skip": "Já estou aborrecido, somente instale a wiki.",
+       "config-optional-skip": "Já estou aborrecido, apenas instale a wiki.",
        "config-profile": "Perfil de permissões do usuário:",
        "config-profile-wiki": "Wiki aberta",
        "config-profile-no-anon": "Criação de conta exigida",
        "config-profile-fishbowl": "Somente editores autorizados",
        "config-profile-private": "Wiki privada",
        "config-license": "Direitos autorais e licenças:",
-       "config-license-none": "Sem rodapé de licença",
-       "config-license-gfdl": "GNU documentação de licença livre 1.3 ou posterior",
+       "config-license-none": "Sem rodapé com a licença",
+       "config-license-gfdl": "GNU Free Documentation License 1.3 ou posterior",
        "config-license-pd": "Domínio público",
-       "config-license-cc-choose": "Selecione uma licença personalizada do Creative Commons",
+       "config-license-cc-choose": "Selecionar uma licença personalizada da organização Creative Commons",
        "config-email-settings": "Configurações de email",
        "config-enable-email-help": "Se você quer que o email funcione, estas  [http://www.php.net/manual/en/mail.configuration.php configurações de email PHP] precisam ser configuradas corretamente. \nSe você não quiser usar nenhuma das funcionalidades, você pode desabilitá-las aqui.",
-       "config-email-user": "Habilitação de email de usuário para usuário",
-       "config-email-user-help": "Permite que todos os usuários mandem email uns aos outros, se eles tiverem habilitado o envio em suas preferências.",
-       "config-email-usertalk": "Habilitação das notificações da página de discussão dos usuários",
-       "config-email-usertalk-help": "Permite que os usuários recebam as notificações quando suas páginas de discussão se modificarem, se eles tiverem habilitado as notificações em suas preferências.",
-       "config-email-watchlist": "Habilitação das notificações de vigilância",
-       "config-email-watchlist-help": "Permite que os usuários recebam as notificações sobre suas páginas vigiadas, se eles tiverem habilitado isto em suas preferências.",
-       "config-email-auth": "Autenticação de email habilitada",
-       "config-email-sender": "Endereço de email de resposta:",
-       "config-upload-settings": "Imagens e arquivos carregados",
-       "config-upload-enable": "Habilite o carregamento de arquivos",
+       "config-email-user": "Ativar emails entre usuários",
+       "config-email-user-help": "Permitir que todos os usuários enviem email entre si se eles tiverem habilitado este recurso em suas preferências.",
+       "config-email-usertalk": "Ativar notificações de alterações à página de discussão de usuário",
+       "config-email-usertalk-help": "Permitir que os usuários recebam notificações quando suas páginas de discussão forem modificadas se eles tiverem habilitado as notificações em suas preferências.",
+       "config-email-watchlist": "Ativar notificação de alterações às páginas vigiadas",
+       "config-email-watchlist-help": "Permitir que os usuários recebam notificações sobre suas páginas vigiadas se eles tiverem habilitado as notificações em suas preferências.",
+       "config-email-auth": "Ativar autenticação de email",
+       "config-email-sender": "Endereço de email para resposta:",
+       "config-upload-settings": "Carregamento de imagens e arquivos",
+       "config-upload-enable": "Permitir o carregamento de arquivos",
        "config-upload-deleted": "Diretório para arquivos excluídos:",
        "config-upload-deleted-help": "Escolha um diretório no qual serão armazenados os arquivos excluídos. \nIdealmente, este não deveria ser acessível pela web.",
        "config-logo": "URL do logotipo:",
-       "config-logo-help": "Faça o upload de uma imagem de tamanho adequado e insira seu URL aqui.\n\nVocê pode usar <code>$wgStylePath</code> ou <code>$wgScriptPath</code> se o seu logotipo for associado a esses diretórios.",
-       "config-instantcommons": "Habilite o Instant Commons",
+       "config-logo-help": "O tema padrão do MediaWiki inclui espaço para um logotipo de 135x160 acima do menu lateral. Carregue uma imagem do tamanho apropriado e insira o URL aqui.\n\nVocê pode utilizar <code>$wgStylePath</code> ou <code>$wgScriptPath</code> se seu logotipo esta relacionado a estes caminhos.\n\nSe não pretende usar um logótipo, deixe esta caixa em branco.",
+       "config-instantcommons": "Ativar o Instant Commons",
        "config-cc-again": "Escolha novamente...",
        "config-advanced-settings": "Configuração avançada",
        "config-extensions": "Extensões",
        "config-install-tables-exist": "'''Aviso''': As tabelas do MediaWiki parecem já existir.\nA criação das tabelas será pulada.",
        "config-install-keys": "Gerando senhas secretas",
        "config-install-sysop": "Criando conta de usuário administrador",
-       "config-install-subscribe-notpossible": "cURL não está instalada e allow_url_fopen não está disponível.",
+       "config-install-subscribe-notpossible": "cURL não está instalada e <code>allow_url_fopen</code> não está disponível.",
        "config-install-mainpage": "Criando página principal com o conteúdo padrão",
        "config-install-extension-tables": "Criando tabelas para extensões habilitadas",
        "config-install-mainpage-failed": "Não foi possível inserir a página principal: $1",
-       "config-install-done": "'''Parabéns!'''\nVocê concluiu a instalação do MediaWiki.\n\nO instalador gerou um arquivo <code>LocalSettings.php</code>.\nEste arquivo contém todas as configurações que você fez.\n\nVocê precisa fazer o download desse arquivo e colocá-lo no diretório de raiz da sua instalação (o mesmo diretório onde está o arquivo <code>index.php</code>). Este download deve ter sido iniciado automaticamente.\n\nSe o download não foi iniciado, ou se ele foi cancelado, pode recomeçá-lo clicando o link abaixo:\n\n$3\n\n'''Nota''': Se não fizer isto agora, o arquivo que foi gerado não estará disponível depois que você sair do processo de instalação sem salvá-lo.\n\nDepois de terminar o passo anterior, pode '''[$2 entrar no wiki]'''.",
-       "config-download-localsettings": "Download <code>LocalSettings.php</code>",
+       "config-install-done": "<strong>Parabéns!</strong>\nVocê concluiu a instalação do MediaWiki.\n\nO instalador gerou um arquivo <code>LocalSettings.php</code>.\nEste arquivo contém todas as suas configurações.\n\nVocê precisa fazer o download desse arquivo e colocá-lo na raiz da sua instalação (o mesmo diretório onde está o arquivo <code>index.php</code>). Este download deve ter sido iniciado automaticamente.\n\nSe o download não foi iniciado, ou se ele foi cancelado, pode recomeçá-lo clicando no link abaixo:\n\n$3\n\n<strong>Nota</strong>: Se não fizer isto agora, o arquivo que foi gerado não estará disponível depois que você sair do processo de instalação sem baixá-lo.\n\nQuando isso tiver sido feito, pode <strong>[$2 entrar na sua wiki]</strong>.",
+       "config-download-localsettings": "Baixar <code>LocalSettings.php</code>",
        "config-help": "ajuda",
-       "config-nofile": "O arquivo \"$1\" não pode ser encontrado. Este arquivo foi apagado?",
-       "config-extension-link": "Você sabia que seu wiki suporta [//www.mediawiki.org/wiki/Manual:Extensions extensões]?\n\nVocê pode explorar as  [//www.mediawiki.org/wiki/Category:Extensions_by_category extensões por categoria] ou visitar a [//www.mediawiki.org/wiki/Extension_Matrix Matriz de Extensões] para ver a lista completa.",
-       "mainpagetext": "'''MediaWiki instalado com sucesso.'''",
-       "mainpagedocfooter": "Consulte o [//meta.wikimedia.org/wiki/Help:Contents Manual de Usuário] para informações de como usar o software wiki.\n\n== Começando ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista de opções de configuração]\n* [//www.mediawiki.org/wiki/Manual:FAQ FAQ do MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de discussão com avisos de novas versões do MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Traduza o MediaWiki para seu idioma]"
+       "config-nofile": "O arquivo \"$1\" não foi encontrado. Ele foi apagado?",
+       "config-extension-link": "Você sabia que sua wiki suporta [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensões]?\n\nVocê pode explorar as  [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensões por categoria] ou visitar a [//www.mediawiki.org/wiki/Extension_Matrix Matriz de Extensões] para ver a lista completa.",
+       "mainpagetext": "<strong>O MediaWiki foi instalado com sucesso.</strong>",
+       "mainpagedocfooter": "Consulte o [//meta.wikimedia.org/wiki/Help:Contents Manual de Usuário] para informações de como usar o software wiki.\n\n== Começando ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista de opções de configuração]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ do MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de discussão com avisos de novas versões do MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Traduza o MediaWiki para seu idioma]"
 }
index 52e09ee..a547edc 100644 (file)
                        "555",
                        "Fúlvio",
                        "Giro720",
-                       "Imperadeiro98"
+                       "Imperadeiro98",
+                       "Cainamarques",
+                       "Vitorvicentevalente"
                ]
        },
        "config-desc": "O instalador do MediaWiki",
-       "config-title": "Instalação do MediaWiki $1",
+       "config-title": "Instalação da MediaWiki $1",
        "config-information": "Informação",
        "config-localsettings-upgrade": "Foi detectado um ficheiro <code>LocalSettings.php</code>.\nPara atualizar esta instalação, por favor introduza o valor de <code>$wgUpgradeKey</code> na caixa abaixo.\nEncontra este valor em <code>LocalSettings.php</code>.",
        "config-localsettings-cli-upgrade": "Foi detectado um ficheiro <code>LocalSettings.php</code>.\nPara atualizar esta instalação, execute o <code>update.php</code>, por favor",
        "config-localsettings-key": "Chave de atualização:",
        "config-localsettings-badkey": "A chave que forneceu está incorreta.",
        "config-upgrade-key-missing": "Foi detectada uma instalação existente do MediaWiki.\nPara atualizar esta instalação, por favor coloque a seguinte linha no final do seu <code>LocalSettings.php</code>:\n\n$1",
-       "config-localsettings-incomplete": "O ficheiro <code>LocalSettings.php</code> existente parece estar incompleto.\nA variável $1 não está definida.\nPor favor defina esta variável no <code>LocalSettings.php</code> e clique \"{{int:Config-continue}}\".",
+       "config-localsettings-incomplete": "O ficheiro <code>LocalSettings.php</code> existente parece estar incompleto.\nA variável $1 não está definida.\nPor favor, defina esta variável no <code>LocalSettings.php</code> e clique \"{{int:Config-continue}}\".",
        "config-localsettings-connection-error": "Ocorreu um erro ao ligar à base de dados usando as configurações especificadas no <code>LocalSettings.php</code>. Por favor corrija essas configurações e tente novamente.\n\n$1",
        "config-session-error": "Erro ao iniciar a sessão: $1",
        "config-session-expired": "Os seus dados de sessão parecem ter expirado.\nAs sessões estão configuradas para uma duração de $1.\nPode aumentar esta duração configurando <code>session.gc_maxlifetime</code> no php.ini.\nReinicie o processo de instalação.",
        "config-no-session": "Os seus dados de sessão foram perdidos!\nVerifique o seu php.ini e certifique-se de que em <code>session.save_path</code> está definido um diretório apropriado.",
        "config-your-language": "O seu idioma:",
-       "config-your-language-help": "Selecione a língua que será usada durante o processo de instalação.",
-       "config-wiki-language": "Língua da wiki:",
-       "config-wiki-language-help": "Selecione a língua que será predominante na wiki.",
+       "config-your-language-help": "Selecione o idioma que será usado durante o processo de instalação.",
+       "config-wiki-language": "Idioma da wiki:",
+       "config-wiki-language-help": "Selecione o idioma que será predominante na wiki.",
        "config-back": "← Voltar",
        "config-continue": "Continuar →",
-       "config-page-language": "Língua",
+       "config-page-language": "Idioma",
        "config-page-welcome": "Bem-vindo(a) ao MediaWiki!",
        "config-page-dbconnect": "Ligar à base de dados",
        "config-page-upgrade": "Atualizar a instalação existente",
        "config-page-readme": "Leia-me",
        "config-page-releasenotes": "Notas de lançamento",
        "config-page-copying": "A copiar",
-       "config-page-upgradedoc": "Atualizando",
+       "config-page-upgradedoc": "A atualizar",
        "config-page-existingwiki": "Wiki existente",
        "config-help-restart": "Deseja limpar todos os dados gravados que introduziu e reiniciar o processo de instalação?",
        "config-restart": "Sim, reiniciar",
        "config-welcome": "=== Verificações do ambiente ===\nSão realizadas verificações básicas para determinar se este ambiente é apropriado para instalação do MediaWiki.\nSe necessitar de pedir ajuda durante a instalação, deve fornecer os resultados destas verificações.",
        "config-copyright": "=== Direitos de autor e Condições de uso ===\n\n$1\n\nEste programa é software livre; pode redistribuí-lo e/ou modificá-lo nos termos da licença GNU General Public License, tal como publicada pela Free Software Foundation; tanto a versão 2 da Licença, como (por opção sua) qualquer versão posterior.\n\nEste programa é distribuído na esperança de que seja útil, mas '''sem qualquer garantia'''; inclusive, sem a garantia implícita da '''possibilidade de ser comercializado''' ou de '''adequação para qualquer finalidade específica'''.\nConsulte a licença GNU General Public License para mais detalhes.\n\nEm conjunto com este programa deve ter recebido <doclink href=Copying>uma cópia da licença GNU General Public License</doclink>; se não a recebeu, peça-a por escrito a Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ou [http://www.gnu.org/copyleft/gpl.html leia-a na internet].",
-       "config-sidebar": "* [//www.mediawiki.org/wiki/MediaWiki/pt Página principal do MediaWiki]\n* [//www.mediawiki.org/wiki/Help:Contents/pt Ajuda]\n* [//www.mediawiki.org/wiki/Manual:Contents/pt Manual técnico]\n* [//www.mediawiki.org/wiki/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>Leia-me</doclink>\n* <doclink href=ReleaseNotes>Notas de lançamento</doclink>\n* <doclink href=Copying>Cópia</doclink>\n* <doclink href=UpgradeDoc>Atualização</doclink>",
+       "config-sidebar": "* [//www.mediawiki.org/wiki/MediaWiki/pt Página principal do MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents/pt Ajuda]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents/pt Manual técnico]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>Leia-me</doclink>\n* <doclink href=ReleaseNotes>Notas de lançamento</doclink>\n* <doclink href=Copying>Cópia</doclink>\n* <doclink href=UpgradeDoc>Atualização</doclink>",
        "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-php-toolow": "O PHP $1 está instalado.\nNo entanto, o MediaWiki requer o PHP $2 ou superior.",
        "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/Unicode_normalization_considerations/pt normalização Unicode].",
-       "config-unicode-update-warning": "'''Aviso''': A versão instalada do wrapper de normalização Unicode usa uma versão mais antiga da biblioteca do [http://site.icu-project.org/ projeto ICU].\nDevia [//www.mediawiki.org/wiki/Unicode_normalization_considerations atualizá-la] se tem quaisquer preocupações sobre o uso do 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].",
+       "config-unicode-update-warning": "'''Aviso''': A versão instalada do wrapper de normalização Unicode usa uma versão mais antiga da biblioteca do [http://site.icu-project.org/ projeto ICU].\nDevia [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations atualizá-la] se tem quaisquer preocupações sobre o uso do Unicode.",
        "config-no-db": "Não foi possível encontrar um controlador ''(driver)'' apropriado da base de dados! Precisa de instalar um controlador da base de dados para o PHP. São aceites os seguintes tipos de base de dados: $1.\n\nSe fez a compilação do PHP, reconfigure-o com um cliente de base de dados ativado; por exemplo, usando <code>./configure --with-mysql</code>.\nSe instalou o PHP a partir de um pacote Debian ou Ubuntu, então precisa de instalar também, por exemplo, o pacote <code>php5-mysql</code>.",
        "config-outdated-sqlite": "'''Aviso''': Tem a versão $1 do SQLite, que é anterior à versão mínima necessária, a $2. O SQLite não estará disponível.",
        "config-no-fts3": "'''Aviso''': O SQLite foi compilado sem o módulo [//sqlite.org/fts3.html FTS3]; as funcionalidades de pesquisa não estarão disponíveis nesta instalação.",
        "config-register-globals": "'''Aviso: A opção <code>[http://php.net/register_globals register_globals]</code> do PHP está ativada.'''\n'''Desative-a, se puder.'''\nO MediaWiki funciona mesmo assim, mas o seu servidor está exposto a potenciais vulnerabilidades de segurança.",
-       "config-magic-quotes-runtime": "'''Fatal: A opção [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] está ativada!'''\nEsta opção causa corrupção dos dados de entrada, de uma forma imprevisível.\nNão pode instalar ou usar o MediaWiki a menos que esta opção seja desativada.",
-       "config-magic-quotes-sybase": "'''Fatal: A opção [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] está ativada!'''\nEsta opção causa corrupção dos dados de entrada, de uma forma imprevisível.\nNão pode instalar ou usar o MediaWiki a menos que esta opção seja desativada.",
-       "config-mbstring": "'''Fatal: A opção [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] está ativada!'''\nEsta opção causa erros e pode corromper os dados de uma forma imprevisível.\nNão pode instalar ou usar o MediaWiki a menos que esta opção seja desativada.",
+       "config-magic-quotes-runtime": "'''Erro fatal: A opção [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] está ativa!'''\nEsta opção causa corrupção dos dados de entrada, de uma forma imprevisível.\nNão pode instalar ou usar o MediaWiki a menos que esta opção seja desativada.",
+       "config-magic-quotes-sybase": "'''Erro fatal: A opção [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] está ativa!'''\nEsta opção causa corrupção dos dados de entrada, de uma forma imprevisível.\nNão pode instalar ou usar o MediaWiki a menos que esta opção seja desativada.",
+       "config-mbstring": "'''Erro fatal: A opção [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] está ativa!'''\nEsta opção causa erros e pode corromper os dados de uma forma imprevisível.\nNão pode instalar ou usar o MediaWiki a menos que esta opção seja desativada.",
        "config-safe-mode": "'''Aviso:''' O [http://www.php.net/features.safe-mode safe mode] do PHP está ativo.\nEste modo pode causar problemas, especialmente no upload de ficheiros e no suporte a <code>math</code>.",
        "config-xml-bad": "Falta o módulo XML do PHP.\nO MediaWiki necessita de funções deste módulo e não funcionará com esta configuração.\nSe está a executar o Mandrake, instale o pacote php-xml.",
-       "config-pcre-old": "<strong>Fatal:</strong> É necessário o PCRE $1 ou versão posterior.\nO <i>link</i> do seu binário PHP foi feito com o PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Mais informações].",
-       "config-pcre-no-utf8": "'''Fatal''': O módulo PCRE do PHP parece ter sido compilado sem suporte PCRE_UTF8.\nO MediaWiki necessita do suporte UTF-8 para funcionar corretamente.",
+       "config-pcre-old": "<strong>Erro fatal:</strong> É necessário o PCRE $1 ou versão posterior.\nO <i>link</i> do seu binário PHP foi feito com o PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Mais informações].",
+       "config-pcre-no-utf8": "'''Erro fatal''': O módulo PCRE do PHP parece ter sido compilado sem suporte PCRE_UTF8.\nO MediaWiki necessita do suporte UTF-8 para funcionar corretamente.",
        "config-memory-raised": "A configuração <code>memory_limit</code> do PHP era $1; foi aumentada para $2.",
        "config-memory-bad": "'''Aviso:''' A configuração <code>memory_limit</code> do PHP é $1.\nIsto é provavelmente demasiado baixo.\nA instalação poderá falhar!",
-       "config-ctype": "'''Fatal''': O PHP tem de ser compilado com suporte para a [http://www.php.net/manual/en/ctype.installation.php extensão Ctype].",
-       "config-json": "<strong>Fatal:</strong> O PHP foi compilado sem suporte de JSON.\nTem de instalar a extensão JSON do PHP (incluída no PHP 5.2 ou posterior) ou a extensão [http://pecl.php.net/package/jsonc PECL jsonc] antes de instalar o MediaWiki.\n* A extensão JSON do PHP está incluída nas distribuções 5 e 6 do Red Hat Enterprise Linux (CentOS), mas tem de ser ativada nos ficheiros <code>/etc/php.ini</code> ou <code>/etc/php.d/json.ini</code>.\n* Algumas distribuições do Linux posteriores a maio de 2013 omitem a extensão JSON do PHP e substituem-na pela extensão PECL chamando-lhe <code>php5-json</code> ou <code>php-pecl-jsonc</code>.",
+       "config-ctype": "'''Erro fatal''': O PHP tem de ser compilado com suporte para a [http://www.php.net/manual/en/ctype.installation.php extensão Ctype].",
+       "config-json": "<strong>Erro fatal:</strong> O PHP foi compilado sem suporte de JSON.\nTem de instalar a extensão JSON do PHP (incluída no PHP 5.2 ou posterior) ou a extensão [http://pecl.php.net/package/jsonc PECL jsonc] antes de instalar o MediaWiki.\n* A extensão JSON do PHP está incluída nas distribuções 5 e 6 do Red Hat Enterprise Linux (CentOS), mas tem de estar ativa nos ficheiros <code>/etc/php.ini</code> ou <code>/etc/php.d/json.ini</code>.\n* Algumas distribuições do Linux posteriores a maio de 2013 omitem a extensão JSON do PHP e substituem-na pela extensão PECL chamando-lhe <code>php5-json</code> ou <code>php-pecl-jsonc</code>.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] instalada",
        "config-apc": "[http://www.php.net/apc APC] instalada",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] instalada",
@@ -92,8 +94,8 @@
        "config-no-cli-uri": "'''Aviso''':  Não foi especificado um <code>--scriptpath</code>; por omissão, será usado: <code>$1</code>.",
        "config-using-server": "Será usado o nome do servidor \"<nowiki>$1</nowiki>\".",
        "config-using-uri": "Será usada a URL do servidor \"<nowiki>$1$2</nowiki>\".",
-       "config-uploads-not-safe": "'''Aviso:''' O diretório por omissão para uploads <code>$1</code>, está vulnerável à execução arbitrária de scripts.\nEmbora o MediaWiki verifique a existência de ameaças de segurança em todos os ficheiros enviados, é altamente recomendado que [//www.mediawiki.org/wiki/Manual:Security#Upload_security vede esta vulnerabilidade de segurança] antes de possibilitar uploads.",
-       "config-no-cli-uploads-check": "'''Aviso:''' O diretório por omissão para uploads, <code>$1</code>, não é verificado para determinar se é vulnerável à execução de código arbitrário durante a instalação por CLI (\"Command-line Interface\").",
+       "config-uploads-not-safe": "'''Aviso:''' O diretório por omissão para carregamentos <code>$1</code>, está vulnerável à execução arbitrária de scripts.\nEmbora o MediaWiki verifique a existência de ameaças de segurança em todos os ficheiros enviados, é altamente recomendado que [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security vede esta vulnerabilidade de segurança] antes de possibilitar uploads.",
+       "config-no-cli-uploads-check": "'''Aviso:''' O diretório por omissão para carregamentos, <code>$1</code>, não é verificado para determinar se é vulnerável à execução de código arbitrário durante a instalação por CLI (\"Command-line Interface\").",
        "config-brokenlibxml": "O seu sistema tem uma combinação de versões do PHP e do libxml2 conhecida por ser problemática, podendo causar corrupção de dados no MediaWiki e noutras aplicações da internet.\nAtualize para a versão 2.7.3 ou posterior do libxml2 ([https://bugs.php.net/bug.php?id=45996 incidência reportada no PHP]).\nInstalação cancelada.",
        "config-suhosin-max-value-length": "O Suhosin está instalado e limita o parâmetro GET <code>length</code> a $1 bytes.\nO componente ResourceLoader do MediaWiki consegue exceder este limite, mas prejudicando o desempenho.\nSe lhe for possível, deve atribuir ao parâmetro <code>suhosin.get.max_value_length</code> o valor 1024 ou maior no ficheiro <code>php.ini</code>, e definir o mesmo valor para <code>$wgResourceLoaderMaxQueryLength</code> no ficheiro LocalSettings.php.",
        "config-db-type": "Tipo da base de dados:",
        "config-mysql-only-myisam-dep": "<strong>Aviso:</strong> O único motor de armazenamento para MySQL nesta máquina é o MyISAM e o seu uso com o MediaWiki não é recomendado porque:\n* praticamente não suporta acessos simultâneos, porque bloqueia tabelas\n* o MyISAM é mais suscetível a perdas da integridade dos dados do que outros motores\n* o código do MediaWiki não trabalha devidamente com o MyISAM\n\nA sua instalação MySQL não suporta InnoDB, talvez seja uma boa altura para atualizá-la para a versão mais recente.",
        "config-mysql-engine-help": "<strong>InnoDB</strong> é quase sempre a melhor opção, porque suporta bem acessos simultâneos <i>(concurrency)</i>.\n\n<strong>MyISAM</strong> pode ser mais rápido no modo de utilizador único ou em instalações somente para leitura.\nAs bases de dados MyISAM tendem a perder integridade de dados com mais frequência do que as bases de dados InnoDB.",
        "config-mysql-charset": "Conjunto de caracteres da base de dados:",
-       "config-mysql-binary": "Binary",
+       "config-mysql-binary": "Binário",
        "config-mysql-utf8": "UTF-8",
        "config-mysql-charset-help": "No modo '''binary''' (\"binário\"), o MediaWiki armazena o texto UTF-8 na base de dados em campos binários.\nIsto é mais eficiente do que o modo UTF-8 do MySQL e permite que sejam usados todos os caracteres Unicode.\n\nNo modo '''UTF-8''', o MySQL saberá em que conjunto de caracteres os seus dados estão e pode apresentá-los e convertê-los da forma mais adequada,\nmas não lhe permitirá armazenar caracteres acima do [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Plano Multilingue Básico].",
        "config-mssql-auth": "Tipo de autenticação:",
        "config-mssql-sqlauth": "Autenticação do SQL Server",
        "config-mssql-windowsauth": "Autenticação do Windows",
        "config-site-name": "Nome da wiki:",
-       "config-site-name-help": "Este nome aparecerá no título da janela do seu browser e em vários outros sítios.",
-       "config-site-name-blank": "Introduza o nome do site.",
+       "config-site-name-help": "Este nome aparecerá no título da janela do seu navegador e em vários outros sítios.",
+       "config-site-name-blank": "Introduza o nome do sítio.",
        "config-project-namespace": "Espaço nominal do projeto:",
        "config-ns-generic": "Projeto",
        "config-ns-site-name": "O mesmo que o nome da wiki: $1",
        "config-profile-no-anon": "Criação de conta exigida",
        "config-profile-fishbowl": "Somente utilizadores autorizados",
        "config-profile-private": "Wiki privada",
-       "config-profile-help": "As wikis funcionam melhor quando se deixa tantas pessoas editá-las quanto possível.\nNo MediaWiki, é fácil rever as alterações recentes e reverter quaisquer estragos causados por utilizadores novatos ou maliciosos.\n\nNo entanto, muitas pessoas consideram o MediaWiki útil de variadas formas e nem sempre é fácil convencer todas as pessoas dos benefícios desta filosofia wiki.\nPor isso pode optar.\n\nUma '''{{int:config-profile-wiki}}''' permite que todos a editem, sem sequer necessitar de autenticação.\nUma wiki com '''{{int:config-profile-no-anon}}''' atribui mais responsabilidade, mas pode afastar os colaboradores ocasionais.\n\nUm cenário '''{{int:config-profile-fishbowl}}''' permite que os utilizadores aprovados editem, mas que o público visione as páginas, incluindo o historial das mesmas.\nUma '''{{int:config-profile-private}}''' só permite que os utilizadores aprovados visionem as páginas e as editem.\n\nApós a instalação, estarão disponíveis mais configurações de privilégios. Consulte [//www.mediawiki.org/wiki/Manual:User_rights a entrada relevante no Manual].",
+       "config-profile-help": "As wikis funcionam melhor quando se deixa tantas pessoas editá-las quanto possível.\nNo MediaWiki, é fácil rever as alterações recentes e reverter quaisquer estragos causados por utilizadores novatos ou maliciosos.\n\nNo entanto, muitas pessoas consideram o MediaWiki útil de variadas formas e nem sempre é fácil convencer todas as pessoas dos benefícios desta filosofia wiki.\nPor isso pode optar.\n\nUma '''{{int:config-profile-wiki}}''' permite que todos a editem, sem sequer necessitar de autenticação.\nUma wiki com '''{{int:config-profile-no-anon}}''' atribui mais responsabilidade, mas pode afastar os colaboradores ocasionais.\n\nUm cenário '''{{int:config-profile-fishbowl}}''' permite que os utilizadores aprovados editem, mas que o público visione as páginas, incluindo o historial das mesmas.\nUma '''{{int:config-profile-private}}''' só permite que os utilizadores aprovados visionem as páginas e as editem.\n\nApós a instalação, estarão disponíveis mais configurações de privilégios. Consulte [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights a entrada relevante no Manual].",
        "config-license": "Direitos de autor e licença:",
        "config-license-none": "Sem rodapé com a licença",
        "config-license-cc-by-sa": "Creative Commons - Atribuição - Partilha nos Mesmos Termos",
        "config-license-cc-0": "Creative Commons Zero (Domínio Público)",
        "config-license-gfdl": "GNU Free Documentation License 1.3 ou posterior",
        "config-license-pd": "Domínio Público",
-       "config-license-cc-choose": "Selecione uma licença personalizada Creative Commons",
+       "config-license-cc-choose": "Selecionar uma licença personalizada Creative Commons",
        "config-license-help": "Muitas wikis de acesso público licenciam todas as colaborações com uma [http://freedomdefined.org/Definition licença livre].\nIsto ajuda a criar um sentido de propriedade da comunidade e encoraja as colaborações a longo prazo.\nTal não é geralmente necessário nas wikis privadas ou corporativas.\n\nSe pretende que seja possível usar textos da Wikipédia na sua wiki e que seja possível a Wikipédia aceitar textos copiados da sua wiki, deve escolher a licença Creative Commons - Atribuição - Partilha nos Mesmos Termos.\n\nA licença anterior da Wikipédia era a licença GNU Free Documentation License.\nA GFDL é uma licença válida, mas de difícil compreensão.\nTambém é difícil reutilizar conteúdos licenciados com a GFDL.",
        "config-email-settings": "Definições do correio electrónico",
        "config-enable-email": "Ativar mensagens eletrónicas de saída",
        "config-email-auth-help": "Se esta opção for ativada, os utilizadores têm de confirmar o seu endereço de correio eletrónico usando um link que lhes é enviado sempre que o definirem ou alterarem.\nSó os endereços de correio eletrónico autenticados podem receber mensagens eletrónicas dos outros utilizadores ou alterar as mensagens de notificação.\nÉ '''recomendado''' que esta opção seja ativada nas wikis de acesso público para impedir o uso abusivo das funcionalidades de correio eletrónico.",
        "config-email-sender": "Endereço de correio electrónico de retorno:",
        "config-email-sender-help": "Introduza o endereço de correio electrónico que será usado como endereço de retorno nas mensagens electrónicas de saída.\nÉ para este endereço que serão enviadas as mensagens que não podem ser entregues.\nMuitos servidores de correio electrónico exigem que pelo menos a parte do nome do domínio seja válida. \\",
-       "config-upload-settings": "Upload de imagens e ficheiros",
-       "config-upload-enable": "Possibilitar o upload de ficheiros",
-       "config-upload-help": "O upload de ficheiros expõe o seu servidor a riscos de segurança.\nPara mais informações, leia a [//www.mediawiki.org/wiki/Manual:Security seção sobre segurança] do Manual Técnico.\n\nPara permitir o upload de ficheiros, altere as permissões do subdiretório <code>images</code> no diretório de raiz do MediaWiki para que o servidor de internet possa escrever nele.\nDepois ative esta opção.",
+       "config-upload-settings": "Carregamento de imagens e ficheiros",
+       "config-upload-enable": "Possibilitar o carregamento de ficheiros",
+       "config-upload-help": "O carregamento de ficheiros expõe o seu servidor a riscos de segurança.\nPara mais informações, leia a [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security seção sobre segurança] do Manual Técnico.\n\nPara permitir o carregamento de ficheiros, altere as permissões do subdiretório <code>images</code> no diretório de raiz do MediaWiki para que o servidor de internet possa escrever nele.\nDepois ative esta opção.",
        "config-upload-deleted": "Diretório para os ficheiros apagados:",
        "config-upload-deleted-help": "Escolha um diretório onde serão arquivados os ficheiros apagados.\nO ideal é que este diretório não possa ser diretamente acedido a partir da internet.",
        "config-logo": "URL do logótipo:",
        "config-logo-help": "O tema padrão do MediaWiki inclui espaço para um logótipo de 135x160 pixels acima do menu da barra lateral.\nColoque na wiki uma imagem com estas dimensões e introduza aqui a URL dessa imagem.\n\nSe não pretende usar um logótipo, deixe este campo em branco.",
        "config-instantcommons": "Ativar Instant Commons",
-       "config-instantcommons-help": "O [//www.mediawiki.org/wiki/InstantCommons Instant Commons] é uma funcionalidade que permite que as wikis usem imagens, áudio e outros ficheiros multimédia disponíveis no site [//commons.wikimedia.org/ Wikimedia Commons].\nPara poder usá-los, o MediaWiki necessita de acesso à internet.\n\nPara mais informações sobre esta funcionalidade, incluindo instruções sobre como configurá-la para usar outras wikis em vez da Wikimedia Commons, consulte o [//mediawiki.org/wiki/Manual:$wgForeignFileRepos Manual Técnico].",
+       "config-instantcommons-help": "O [//www.mediawiki.org/wiki/InstantCommons Instant Commons] é uma funcionalidade que permite que as wikis usem imagens, áudio e outros ficheiros multimédia disponíveis no site [//commons.wikimedia.org/ Wikimedia Commons].\nPara poder usá-los, o MediaWiki necessita de acesso à internet.\n\nPara mais informações sobre esta funcionalidade, incluindo instruções sobre como configurá-la para usar outras wikis em vez da Wikimedia Commons, consulte o [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos Manual Técnico].",
        "config-cc-error": "O auxiliar de escolha de licenças da Creative Commons não produziu resultados.\nIntroduza o nome da licença manualmente.",
        "config-cc-again": "Escolha outra vez...",
        "config-cc-not-chosen": "Escolha a licença da Creative Commons que pretende e clique \"continuar\".",
        "config-install-tables": "A criar as tabelas",
        "config-install-tables-exist": "'''Aviso''': As tabelas do MediaWiki parecem já existir.\nA criação das tabelas será saltada.",
        "config-install-tables-failed": "'''Erro''': A criação das tabelas falhou com o seguinte erro: $1",
-       "config-install-interwiki": "A preencher a tabela padrão de interwikis",
+       "config-install-interwiki": "A preencher a tabela padrão de interlínguas",
        "config-install-interwiki-list": "Não foi possível encontrar o ficheiro <code>interwiki.list</code>.",
        "config-install-interwiki-exists": "'''Aviso''': A tabela de interwikis parece já conter entradas.\nO preenchimento padrão desta tabela será saltado.",
        "config-install-stats": "A inicializar as estatísticas",
        "config-install-keys": "A gerar as chaves secretas",
-       "config-insecure-keys": "'''Warning:''' {{PLURAL:$2|A chave segura|As chaves seguras}} ($1) {{PLURAL:$2|gerada durante a instalação não é completamente segura|geradas durante a instalação não são completamente seguras}}. Considere a possibilidade de {{PLURAL:$2|alterá-la|alterá-las}} manualmente.",
+       "config-insecure-keys": "'''Aviso:''' {{PLURAL:$2|A chave segura|As chaves seguras}} ($1) {{PLURAL:$2|gerada durante a instalação não é completamente segura|geradas durante a instalação não são completamente seguras}}. Considere a possibilidade de {{PLURAL:$2|alterá-la|alterá-las}} manualmente.",
        "config-install-sysop": "A criar a conta de administrador",
        "config-install-subscribe-fail": "Não foi possível subscrever a lista mediawiki-announce: $1",
-       "config-install-subscribe-notpossible": "cURL não está instalado e allow_url_fopen não está disponível.",
+       "config-install-subscribe-notpossible": "cURL não está instalado e <code>allow_url_fopen</code> não está disponível.",
        "config-install-mainpage": "A criar a página principal com o conteúdo padrão.",
        "config-install-extension-tables": "A criar as tabelas das extensões ativadas",
        "config-install-mainpage-failed": "Não foi possível inserir a página principal: $1",
        "config-install-done": "'''Parabéns!'''\nTerminou a instalação do MediaWiki.\n\nO instalador gerou um ficheiro <code>LocalSettings.php</code>.\nEste ficheiro contém todas as configurações.\n\nPrecisa de fazer o download do ficheiro e colocá-lo no diretório de raiz da sua instalação (o mesmo diretório onde está o ficheiro index.php). Este download deverá ter sido iniciado automaticamente.\n\nSe o download não foi iniciado, ou se o cancelou, pode recomeçá-lo clicando o link abaixo:\n\n$3\n\n'''Nota''': Se não fizer isto agora, o ficheiro que foi gerado deixará de estar disponível quando sair do processo de instalação.\n\nDepois de terminar o passo anterior, pode '''[$2 entrar na wiki]'''.",
-       "config-download-localsettings": "Download do <code>LocalSettings.php</code>",
+       "config-download-localsettings": "Descarga do <code>LocalSettings.php</code>",
        "config-help": "ajuda",
+       "config-help-tooltip": "clique para expandir",
        "config-nofile": "Não foi possível encontrar o ficheiro \"$1\". Terá sido apagado?",
-       "config-extension-link": "Sabia que a sua wiki suporta [//www.mediawiki.org/wiki/Manual:Extensions extensões]?\n\nPode navegar as [//www.mediawiki.org/wiki/Category:Extensions_by_category extensões por categoria] ou a [//www.mediawiki.org/wiki/Extension_Matrix Matriz de Extensões] para ver a lista completa.",
+       "config-extension-link": "Sabia que a sua wiki suporta [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensões]?\n\nPode procurar [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensões por categoria].",
        "mainpagetext": "'''MediaWiki instalado com sucesso.'''",
-       "mainpagedocfooter": "Consulte o [//meta.wikimedia.org/wiki/Help:Contents Guia de Utilizadores] para informações sobre o uso do software wiki.\n\n== Onde começar ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista de opções de configuração]\n* [//www.mediawiki.org/wiki/Manual:FAQ Perguntas e respostas frequentes sobre o MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Subscreva a lista de divulgação de novas versões do MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Regionalize MediaWiki para seu idioma]"
+       "mainpagedocfooter": "Consulte o [//meta.wikimedia.org/wiki/Help:Contents Guia de Utilizadores] para informações sobre o uso do software wiki.\n\n== Onde começar ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista de opções de configuração]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Perguntas e respostas frequentes sobre o MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Subscreva a lista de divulgação de novas versões do MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Regionalize MediaWiki para seu idioma]"
 }
index 67bc5af..3a16079 100644 (file)
        "config-install-done": "Parameters:\n* $1 is the URL to LocalSettings download\n* $2 is a link to the wiki.\n* $3 is a download link with attached download icon. The config-download-localsettings message will be used as the link text.",
        "config-download-localsettings": "The link text used in the download link in config-install-done.",
        "config-help": "This is used in help boxes.\n{{Identical|Help}}",
+       "config-help-tooltip": "Tooltip for the 'help' links ({{msg-mw|config-help}}), to make it clear they'll expand in place rather than open a new page",
        "config-nofile": "Used as failure message. Parameters:\n* $1 - filename",
        "config-extension-link": "Shown on last page of installation to inform about possible extensions.",
        "mainpagetext": "Along with {{msg-mw|mainpagedocfooter}}, the text you will see on the Main Page when your wiki is installed.",
index 8462a66..2cdf74d 100644 (file)
@@ -16,5 +16,5 @@
        "config-help": "yanapay",
        "config-nofile": "\"$1\" sutiyuq willañiqiqa manam tarisqachu. Qullusqachu?",
        "mainpagetext": "'''MediaWiki nisqa llamp'u kaqqa aypaylla takyachisqañam.'''",
-       "mainpagedocfooter": "Wiki llamp'u kaqmanta willasunaykipaqqa [//meta.wikimedia.org/wiki/Help:Contents Ruraqpaq yanapana] ''(User's Guide)'' sutiyuq p'anqata qhaway.\n\n== Qallarichkaspa ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Kunphigurasyun churanamanta sutisuyu]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki nisqamanta pasaq tapuykuna]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki kachaykuy e-chaski sutisuyu]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources MediaWiki nisqata qampa rimaykiman t'ikray]"
+       "mainpagedocfooter": "Wiki llamp'u kaqmanta willasunaykipaqqa [//meta.wikimedia.org/wiki/Help:Contents Ruraqpaq yanapana] ''(User's Guide)'' sutiyuq p'anqata qhaway.\n\n== Qallarichkaspa ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Kunphigurasyun churanamanta sutisuyu]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki nisqamanta pasaq tapuykuna]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki kachaykuy e-chaski sutisuyu]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources MediaWiki nisqata qampa rimaykiman t'ikray]"
 }
index 9e95d96..debfaf1 100644 (file)
@@ -5,5 +5,5 @@
                ]
        },
        "mainpagetext": "'''MediaWiki è vegnì installà cun success.'''",
-       "mainpagedocfooter": "Consultai il [//meta.wikimedia.org/wiki/Help:Contents manual per utilisaders] per infurmaziuns davart l'utilisaziun da questa software da wiki.\n\n== Cumenzar ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Glista da las opziuns per la configuraziun]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Glista da mail da MediaWiki cun annunzias da novas versiuns]"
+       "mainpagedocfooter": "Consultai il [//meta.wikimedia.org/wiki/Help:Contents manual per utilisaders] per infurmaziuns davart l'utilisaziun da questa software da wiki.\n\n== Cumenzar ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Glista da las opziuns per la configuraziun]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Glista da mail da MediaWiki cun annunzias da novas versiuns]"
 }
index d2711c6..2fcf9a5 100644 (file)
        "config-information": "Informații",
        "config-localsettings-key": "Cheie de actualizare:",
        "config-localsettings-badkey": "Cheia furnizată este incorectă.",
+       "config-upgrade-key-missing": "S-a detectat o instalare existentă de MediaWiki.\nPentru a efectua un upgrade în cazul acestei instalări, vă rugăm să introduceți următorul rând în partea de jos a fișierului <code>LocalSettings.php</code>:\n\n$1",
+       "config-localsettings-incomplete": "Fișierul <code>LocalSettings.php</code> deja existent pare a fi incomplet.\nVariabila $1 nu este definită.\nModificați fișierul <code>LocalSettings.php</code> astfel încât această variabilă să fie definită, după care apăsați pe „{{int:Config-continue}}”.",
+       "config-localsettings-connection-error": "A apărut o eroare în timpul conectării la baza de date utilizând setările specificate în <code>LocalSettings.php</code>. Vă rugăm să ajustați aceste setări și încercați din nou.\n\n$1",
        "config-session-error": "Eroare la pornirea sesiunii: $1",
+       "config-session-expired": "Este posibil ca datele sesiunii dumnevoastră să fi expirat.\nSesiunile sunt configurate pentru o durată de viață de $1.\nO puteți mări configurând parametrul <code>session.gc_maxlifetime</code> din fișierul php.ini.\nReporniți procesul de instalare.",
+       "config-no-session": "Datele sesiunii dumneavoastră s-au pierdut!\nVerificați-vă fișierul php.ini și asigurați-vă că <code>session.save_path</code> conține calea către un director corespunzător.",
        "config-your-language": "Limba ta:",
        "config-your-language-help": "Alege o limbă pentru a o utiliza în timpul procesului de instalare.",
        "config-wiki-language": "Limbă wiki:",
        "config-download-localsettings": "Descarcă <code>LocalSettings.php</code>",
        "config-help": "ajutor",
        "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/Manual:Configuration_settings Lista parametrilor configurabili (en)]\n* [//www.mediawiki.org/wiki/Manual:FAQ Întrebări frecvente despre MediaWiki (en)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de discuții a MediaWiki (en)]"
+       "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 82f5fda..8220337 100644 (file)
@@ -52,5 +52,5 @@
        "config-install-pg-schema-not-exist": "'U scheme PostgreSQL non g'esiste.",
        "config-help": "ajute",
        "mainpagetext": "'''MediaUicchi ha state 'nstallete.'''",
-       "mainpagedocfooter": "Vè vide [//meta.wikimedia.org/wiki/Help:Contents User's Guide] pe l'mbormaziune sus a cumme s'ause 'u softuer wiki.\n\n== Pe accumenzà ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Liste pe le configuraziune]\n* [//www.mediawiki.org/wiki/Manual:FAQ FAQ de MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Elenghe d'a poste de MediaUicchi]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Localizzazzione de MediaUicchi pa lènga toje]"
+       "mainpagedocfooter": "Vè vide [//meta.wikimedia.org/wiki/Help:Contents User's Guide] pe l'mbormaziune sus a cumme s'ause 'u softuer wiki.\n\n== Pe accumenzà ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Liste pe le configuraziune]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ de MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Elenghe d'a poste de MediaUicchi]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localizzazzione de MediaUicchi pa lènga toje]"
 }
index c0550d4..17f5fbc 100644 (file)
                        "Yuriy Apostol",
                        "Александр Сигачёв",
                        "Сrower",
-                       "아라"
+                       "아라",
+                       "Meshkov.a",
+                       "Eroha",
+                       "Seb35"
                ]
        },
        "config-desc": "Инсталлятор MediaWiki",
        "config-restart": "Да, начать заново",
        "config-welcome": "=== Проверка окружения ===\nБудут проведены базовые проверки с целью определить, подходит ли данная система для установки MediaWiki.\nНе забудьте включить эту информацию, если вам потребуется помощь для завершения установки.",
        "config-copyright": "=== Авторские права и условия ===\n\n$1\n\nMediaWiki является свободным программным обеспечением, которое вы можете распространять и/или изменять в соответствии с условиями лицензии GNU General Public License, опубликованной фондом свободного программного обеспечения; второй версии, либо любой более поздней версии.\n\nMediaWiki распространяется в надежде, что она будет полезной, но '''без каких-либо гарантий''', даже без подразумеваемых гарантий '''коммерческой ценности''' или '''пригодности для определённой цели'''. См. лицензию GNU General Public License для более подробной информации.\n\nВы должны были получить <doclink href=Copying>копию GNU General Public License</doclink> вместе с этой программой, если нет, то напишите Free Software Foundation, Inc., по адресу: 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA или [http://www.gnu.org/licenses/old-licenses/gpl-2.0.html прочтите её онлайн].",
-       "config-sidebar": "* [//www.mediawiki.org Сайт MediaWiki]\n* [//www.mediawiki.org/wiki/Help:Contents/ru Справка для пользователей]\n* [//www.mediawiki.org/wiki/Manual:Contents/ru Справка для администраторов]\n* [//www.mediawiki.org/wiki/Manual:FAQ/ru FAQ]\n----\n* <doclink href=Readme>Readme-файл</doclink>\n* <doclink href=ReleaseNotes>Информация о выпуске</doclink>\n* <doclink href=Copying>Лицензия</doclink>\n* <doclink href=UpgradeDoc>Обновление</doclink>",
+       "config-sidebar": "* [//www.mediawiki.org Сайт MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents/ru Справка для пользователей]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents/ru Справка для администраторов]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/ru FAQ]\n----\n* <doclink href=Readme>Readme-файл</doclink>\n* <doclink href=ReleaseNotes>Информация о выпуске</doclink>\n* <doclink href=Copying>Лицензия</doclink>\n* <doclink href=UpgradeDoc>Обновление</doclink>",
        "config-env-good": "Проверка внешней среды была успешно проведена.\nВы можете установить MediaWiki.",
        "config-env-bad": "Была проведена проверка внешней среды.\nВы не можете установить MediaWiki.",
        "config-env-php": "Установленная версия PHP: $1.",
        "config-env-php-toolow": "Найден PHP $1, тогда как MediaWiki требуется PHP версии $2 или выше.",
        "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/Unicode_normalization_considerations нормализации Юникода].",
-       "config-unicode-update-warning": "'''Предупреждение''': установленная версия обёртки нормализации Юникода использует старую версию библиотеки [http://site.icu-project.org/ проекта ICU].\nВы должны [//www.mediawiki.org/wiki/Unicode_normalization_considerations обновить версию], если хотите полноценно использовать Юникод.",
+       "config-unicode-pure-php-warning": "'''Внимание!''': [http://pecl.php.net/intl расширение intl из PECL] недоступно для нормализации Юникода, будет использоваться медленная реализация на чистом 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-no-db": "Не удалось найти подходящие драйвера баз данных! Вам необходимо установить драйвера базы данных для PHP.\nПоддерживаются следующие типы баз данных: $1.\nЕсли вы скомпилировали PHP сами, перенастройте его с включением клиента баз данных, например, с помощью <code>./configure --with-mysqli</code>.\nЕсли вы скомпилировали PHP сами, сконфигурируйте его снова с включенным клиентом базы данных, например, с помощью <code>./configure --with-mysql</code>.\nЕсли вы установили PHP из пакетов Debian или Ubuntu, то вам также необходимо установить, например, пакет <code>php5-mysql</code>.",
        "config-outdated-sqlite": "'''Предупреждение''': у Вас установлен SQLite  $1, версия которого ниже требуемой $2 . SQLite будет недоступен.",
        "config-no-fts3": "'''Внимание''': SQLite собран без модуля [//sqlite.org/fts3.html FTS3] — поиск не будет работать для этой базы данных.",
@@ -94,7 +97,7 @@
        "config-no-cli-uri": "'''Предупреждение''': нет задан параметр <code>--scriptpath</code>, используется по умолчанию: <code>$1</code> .",
        "config-using-server": "Используется имя сервера «<nowiki>$1</nowiki>».",
        "config-using-uri": "Используется имя сервера \"<nowiki>$1$2</nowiki>\".",
-       "config-uploads-not-safe": "'''Внимание:''' директория, используемая по умолчанию для загрузок (<code>$1</code>) уязвима к выполнению произвольных скриптов.\nХотя MediaWiki проверяет все загружаемые файлы на наличие угроз, настоятельно рекомендуется [//www.mediawiki.org/wiki/Manual:Security#Upload_security закрыть данную уязвимость] перед включением загрузки файлов.",
+       "config-uploads-not-safe": "'''Внимание:''' директория, используемая по умолчанию для загрузок (<code>$1</code>) уязвима к выполнению произвольных скриптов.\nХотя MediaWiki проверяет все загружаемые файлы на наличие угроз, настоятельно рекомендуется [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security закрыть данную уязвимость] перед включением загрузки файлов.",
        "config-no-cli-uploads-check": "'''Предупреждение:''' каталог для загрузки по умолчанию ( <code>$1</code> ) не проверялся на уязвимости\n на выполнение произвольного сценария во время установки CLI.",
        "config-brokenlibxml": "В вашей системе имеется сочетание версий PHP и libxml2, которое может привести к скрытым повреждениям данных в MediaWiki и других веб-приложениях.\nОбновите libxml2 до версии 2.7.3 или старше ([https://bugs.php.net/bug.php?id=45996 сведения об ошибке]).\nУстановка прервана.",
        "config-suhosin-max-value-length": "Suhosin установлен и ограничивает параметр GET <code>length</code> до $1 байт. Компонент MediaWiki ResourceLoader будет обходить это ограничение, но это снизит производительность. Если это возможно, следует установить <code>suhosin.get.max_value_length</code> в значение 1024 или выше в <code>php.ini</code>, а также установить для <code>$wgResourceLoaderMaxQueryLength</code> такое же значение в LocalSettings.php.",
        "config-db-wiki-help": "Введите имя пользователя и пароль, которые будут использоваться для подключения к базе данных во время обычной работы вики.\nЕсли такой учётной записи не существует, а установочная учётная запись имеет достаточно привилегий, то обычная учётная запись будет создана с минимально необходимыми для работы вики привилегиями.",
        "config-db-prefix": "Префикс таблиц базы данных:",
        "config-db-prefix-help": "Если вам нужно делить одну базу данных между несколькими вики, или между MediaWiki и другими веб-приложениями, вы можете добавить префикс для всех имён таблиц.\nНе используйте пробелы.\n\nЭто поле обычно остаётся пустым.",
-       "config-db-charset": "Ð\9dабоÑ\80 Ñ\81имволов базы данных",
+       "config-db-charset": "Ð\9aодиÑ\80овка базы данных",
        "config-charset-mysql5-binary": "MySQL 4.1/5.0 бинарная",
        "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
        "config-charset-mysql4": "MySQL 4.0 обратно совместимая с UTF-8",
        "config-mysql-old": "Необходим MySQL $1 или более поздняя версия. У вас установлен MySQL $2.",
        "config-db-port": "Порт базы данных:",
        "config-db-schema": "Схема для MediaWiki",
-       "config-db-schema-help": "Эта схема обычно работают хорошо.\nИзменяйте её только если знаете, что вам это нужно.",
-       "config-pg-test-error": "Не удаётся подключиться к базе данных '''$1''': $2",
+       "config-db-schema-help": "Эта схема обычно работает хорошо.\nИзменяйте её только если знаете, что Вам это нужно.",
+       "config-pg-test-error": "Не удаётся подключиться к базе данных <strong>$1</strong>: $2",
        "config-sqlite-dir": "Директория данных SQLite:",
-       "config-sqlite-dir-help": "SQLite хранит все данные в одном файле.\n\nДиректория, которую вы должны указать, должна быть доступна для записи веб-сервером во время установки.\n\nОна '''не должна''' быть доступна через Интернет, поэтому не должна совпадать с той, где хранятся PHP файлы.\n\nУстановщик запишет в эту директорию файл <code>.htaccess</code>, но если это не сработает, кто-нибудь может получить доступ ко всей базе данных.\nВ этой базе находится в том числе и информация о пользователях (адреса электронной почты, хэши паролей), а также удалённые страницы и другие секретные данные о вики.\n\nПо возможности, расположите базу данных где-нибудь в стороне, например, в <code>/var/lib/mediawiki/yourwiki</code>.",
+       "config-sqlite-dir-help": "SQLite хранит все данные в одном файле.\n\nДиректория, указываемая вами, должна быть доступна для записи веб-сервером во время установки.\n\nОна '''не должна''' быть доступна через Интернет, поэтому не должна совпадать с той, где хранятся PHP файлы.\n\nУстановщик запишет в эту директорию файл <code>.htaccess</code>, но если это не сработает, кто-нибудь может получить доступ ко всей базе данных.\nВ этой базе находится в том числе и информация о пользователях (адреса электронной почты, хэши паролей), а также удалённые страницы и другие секретные данные о вики.\n\nПо возможности, расположите базу данных где-нибудь в стороне, например, в <code>/var/lib/mediawiki/yourwiki</code>.",
        "config-oracle-def-ts": "Пространство таблиц по умолчанию:",
        "config-oracle-temp-ts": "Временное пространство таблиц:",
        "config-type-mysql": "MySQL (или совместимая)",
        "config-mysql-myisam-dep": "''' Внимание.''' Вы выбрали механизм MyISAM для хранения данных MySQL. Он не рекомендуется к использованию по следующим причинам:\n* он слабо поддерживает параллелизм из-за табличных блокировок;\n* более склонен к потере данных, по сравнению с другими механизмами;\n* код MediaWiki не всегда учитывает особенности MyISAM должным образом.\n\nЕсли ваша установка MySQL поддерживает InnoDB, настоятельно рекомендуется выбрать этот механизм.\nЕсли ваша установка MySQL не поддерживает InnoDB, возможно, настало время обновиться.",
        "config-mysql-only-myisam-dep": "'''Предупреждение:''' MyISAM является единственной доступной системой хранения данных для MySQL на этом компьютере, и она не рекомендуется для использования с MediaWiki, потому что:\n * он слабо поддерживает параллелизм из-за блокировки таблиц\n * она больше других систем подвержена повреждению\n * кодовая база MediaWiki не всегда обрабатывает MyISAM так, как следует\n\nВаша MySQL не поддерживает InnoDB, так что, возможно, настало время для обновления.",
        "config-mysql-engine-help": "'''InnoDB''' почти всегда предпочтительнее, так как он лучше справляется с параллельным доступом.\n\n'''MyISAM''' может оказаться быстрее для вики с одним пользователем или с минимальным количеством поступающих правок, однако базы данных на нём портятся чаще, чем на InnoDB.",
-       "config-mysql-charset": "Ð\9dабоÑ\80 Ñ\81имволов (кодоваÑ\8f Ñ\82аблиÑ\86а) базы данных:",
+       "config-mysql-charset": "Ð\9aодиÑ\80овка базы данных:",
        "config-mysql-binary": "Двоичный",
        "config-mysql-utf8": "UTF-8",
        "config-mysql-charset-help": "В '''двоичном режиме''' MediaWiki хранит UTF-8 текст в бинарных полях базы данных.\nЭто более эффективно, чем ''UTF-8 режим'' MySQL, и позволяет использовать полный набор символов Unicode.\n\nВ '''режиме UTF-8''' MySQL будет знать в какой кодировке находятся Ваши данные и может отображать и преобразовывать их соответствующим образом, но это не позволит вам хранить символы выше [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Базовой Многоязыковой Плоскости].",
        "config-profile-no-anon": "Требуется создание учётной записи",
        "config-profile-fishbowl": "Только для авторизованных редакторов",
        "config-profile-private": "Закрытая вики",
-       "config-profile-help": "Вики-технология лучше всего работает, когда вы позволяете редактировать сайт максимально широкому кругу лиц.\nВ MediaWiki легко просмотреть последних изменений и, при необходимости, откатить любой ущерб сделанный злоумышленниками или наивными пользователями.\n\nОднако, движок MediaWiki можно использовать и иными способами, и не далеко не всех удаётся убедить в преимуществах открытой вики-работы.\nТак что в вас есть выбор.\n\nМодель '''«{{int:config-profile-wiki}}»''' позволяет всем править страницы даже не регистрируясь на сайте. Конфигурация '''{{int:config-profile-no-anon}}''' обеспечивает дополнительный учёт, но может отсечь случайных участников.\n\nСценарий '''«{{int:config-profile-fishbowl}}»''' разрешает редактирование только определённым участникам, но общедоступным остаётся просмотр страниц, в том числе просмотр истории изменения. В режиме '''«{{int:config-profile-private}}»''' просмотр страниц разрешён только определённым пользователям, какая-то их часть может иметь также права на редактирование.\n\nБолее сложные схемы разграничения прав можно настроить после установки, см. [//www.mediawiki.org/wiki/Manual:User_rights соответствующее руководство].",
+       "config-profile-help": "Вики-технология лучше всего работает, когда вы позволяете редактировать сайт максимально широкому кругу лиц.\nВ MediaWiki легко просмотреть последних изменений и, при необходимости, откатить любой ущерб сделанный злоумышленниками или наивными пользователями.\n\nОднако, движок MediaWiki можно использовать и иными способами, и не далеко не всех удаётся убедить в преимуществах открытой вики-работы.\nТак что в вас есть выбор.\n\nМодель '''«{{int:config-profile-wiki}}»''' позволяет всем править страницы даже не регистрируясь на сайте. Конфигурация '''{{int:config-profile-no-anon}}''' обеспечивает дополнительный учёт, но может отсечь случайных участников.\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": "Creative Commons Attribution Share Alike",
        "config-email-sender-help": "Введите адрес электронной почты для использования в качестве обратного адреса исходящей электронной почты.\nНа него будут отправляться отказы.\nМногие почтовые серверы требуют, чтобы по крайней мере доменное имя в нём было правильным.",
        "config-upload-settings": "Загрузка изображений и файлов",
        "config-upload-enable": "Разрешить загрузку файлов",
-       "config-upload-help": "Разрешение загрузки файлов, потенциально, может привести к угрозе безопасности сервера.\nДля получения дополнительной информации, прочтите в руководстве [//www.mediawiki.org/wiki/Manual:Security раздел, посвящённый безопасности].\n\nЧтобы разрешить загрузку файлов, необходимо изменить права на каталог <code>images</code>, в корневой директории MediaWiki так, чтобы веб-сервер мог записывать в него файлы.\nЗатем включите эту опцию.",
+       "config-upload-help": "Разрешение загрузки файлов, потенциально, может привести к угрозе безопасности сервера.\nДля получения дополнительной информации, прочтите в руководстве [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security раздел, посвящённый безопасности].\n\nЧтобы разрешить загрузку файлов, необходимо изменить права на каталог <code>images</code>, в корневой директории MediaWiki так, чтобы веб-сервер мог записывать в него файлы.\nЗатем включите эту опцию.",
        "config-upload-deleted": "Директория для удалённых файлов:",
        "config-upload-deleted-help": "Выберите каталог, в котором будут храниться архивы удалённых файлов.\nВ идеальном случае, в этот каталог не должно быть доступа из сети Интернет.",
        "config-logo": "URL логотипа:",
        "config-logo-help": "Стандартная тема оформления MediaWiki содержит над боковой панелью пространство для логотипа размером 135x160 пикселей.\nЗагрузите изображение соответствующего размера, и введите его URL здесь.\n\nВы можете использовать <code>$wgStylePath</code> или <code>$wgScriptPath</code>, если ваш логотип находится относительно к этим путям.\n\nЕсли вам не нужен логотип, оставьте это поле пустым.",
        "config-instantcommons": "Включить Instant Commons",
-       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] — это функция, позволяющая использовать изображения, звуки и другие медиафайлы с Викисклада ([//commons.wikimedia.org/ Wikimedia Commons]).\nДля работы этой функции MediaWiki необходим доступ к Интернету.\n\nДополнительную информацию об Instant Commons, в том числе указания о том, как её настроить для других вики, отличных от Викисклада, можно найти в [//mediawiki.org/wiki/Manual:$wgForeignFileRepos руководстве].",
+       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] — это функция, позволяющая использовать изображения, звуки и другие медиафайлы с Викисклада ([//commons.wikimedia.org/ Wikimedia Commons]).\nДля работы этой функции MediaWiki необходим доступ к Интернету.\n\nДополнительную информацию об Instant Commons, в том числе указания о том, как её настроить для других вики, отличных от Викисклада, можно найти в [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos руководстве].",
        "config-cc-error": "Механизм выбора лицензии Creative Commons не вернул результата.\nВведите название лицензии вручную.",
        "config-cc-again": "Выберите ещё раз…",
        "config-cc-not-chosen": "Выберите, какую лицензию Creative Commons Вы хотите использовать, и нажмите кнопку \"Продолжить\".",
        "config-insecure-keys": "'''Предупреждение.''' {{PLURAL:$2|1=Ключ безопасности $1, созданный во время установки, недостаточно надёжен|Ключи безопасности $1, созданные во время установки, недостаточно надёжны}}. Рассмотрите возможность {{PLURAL:$2|1=его|их}} изменения вручную.",
        "config-install-sysop": "Создание учётной записи администратора",
        "config-install-subscribe-fail": "Не удаётся подписаться на mediawiki-announce: $1",
-       "config-install-subscribe-notpossible": "cURL не установлен и не доступна опция allow_url_fopen.",
+       "config-install-subscribe-notpossible": "cURL не установлен и не доступна опция <code>allow_url_fopen</code>.",
        "config-install-mainpage": "Создание главной страницы с содержимым по умолчанию",
        "config-install-extension-tables": "Создание таблиц для включённых расширений",
        "config-install-mainpage-failed": "Не удаётся вставить главную страницу: $1",
        "config-install-done": "'''Поздравляем!'''\nВы успешно установили MediaWiki.\n\nВо время установки был создан файл <code>LocalSettings.php</code>.\nОн содержит всю конфигурации вики.\n\nВам необходимо скачать его и положить в корневую директорию вашей вики (ту же директорию, где находится файл index.php). Его загрузка должна начаться автоматически.\n\nЕсли автоматическая загрузка не началась или вы её отменили, вы можете скачать по ссылке ниже:\n\n$3\n\n'''Примечание''': Если вы не сделаете этого сейчас, то сгенерированный файл конфигурации не будет доступен вам в дальнейшем, если вы выйдете из установки, не скачивая его.\n\nПо окончании действий, описанных выше, вы сможете '''[$2 войти в вашу вики]'''.",
        "config-download-localsettings": "Загрузить <code>LocalSettings.php</code>",
        "config-help": "справка",
+       "config-help-tooltip": "нажмите, чтобы развернуть",
        "config-nofile": "Файл \"$1\" не удается найти. Он был удален?",
-       "config-extension-link": "Знаете ли вы, что ваш вики-проект поддерживает [//www.mediawiki.org/wiki/Manual:Extensions расширения]?\n\nВы можете просмотреть [//www.mediawiki.org/wiki/Category:Extensions_by_category расширения по категориям] или [//www.mediawiki.org/wiki/Extension_Matrix матрицу расширений], чтобы увидеть их полный список.",
+       "config-extension-link": "Знаете ли вы, что ваш вики-проект поддерживает [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions расширения]?\n\nВы можете просмотреть [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category расширения по категориям] или [//www.mediawiki.org/wiki/Extension_Matrix матрицу расширений], чтобы увидеть их полный список.",
        "mainpagetext": "'''Вики-движок «MediaWiki» успешно установлен.'''",
-       "mainpagedocfooter": "Информацию по работе с этой вики можно найти в [//meta.wikimedia.org/wiki/%D0%9F%D0%BE%D0%BC%D0%BE%D1%89%D1%8C:%D0%A1%D0%BE%D0%B4%D0%B5%D1%80%D0%B6%D0%B0%D0%BD%D0%B8%D0%B5 справочном руководстве].\n\n== Некоторые полезные ресурсы ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Список возможных настроек];\n* [//www.mediawiki.org/wiki/Manual:FAQ Часто задаваемые вопросы и ответы по MediaWiki];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Рассылка уведомлений о выходе новых версий MediaWiki].\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Перевод MediaWiki на свой язык]"
+       "mainpagedocfooter": "Информацию по работе с этой вики можно найти в [//meta.wikimedia.org/wiki/Help:Contents/ru справочном руководстве].\n\n== Некоторые полезные ресурсы ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Список возможных настроек];\n* [//www.mediawiki.org/wiki/Manual:FAQ/ru Часто задаваемые вопросы и ответы по MediaWiki];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Рассылка уведомлений о выходе новых версий MediaWiki].\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Перевод MediaWiki на свой язык]"
 }
index 8a0fcf2..787175f 100644 (file)
@@ -5,5 +5,5 @@
                ]
        },
        "mainpagetext": "'''MediaWiki была успішно наіншталована.'''",
-       "mainpagedocfooter": "[//meta.wikimedia.org/wiki/Help:Contents Мануял хоснователя] Вам порадить, як хосновати MediaWiki.\n\n== Про початок ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Наставлїня конфіґурації]\n* [//www.mediawiki.org/wiki/Manual:FAQ Часты вопросы о MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Розосыланя повідомлїнь про новы верзії MediaWiki]"
+       "mainpagedocfooter": "[//meta.wikimedia.org/wiki/Help:Contents Мануял хоснователя] Вам порадить, як хосновати MediaWiki.\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 223eadd..14233aa 100644 (file)
@@ -1,5 +1,5 @@
 {
        "@metadata": [],
        "mainpagetext": "'''«MediaWiki» сөпкө туруорулунна.'''",
-       "mainpagedocfooter": "Биики программатын туһунан [//meta.wikimedia.org/wiki/Help:Contents справочникка] көрүөххүн сөп.\n\n== Саҕаланыыта ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Конфигурация уларытыытын параметрдара]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce 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 FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki релизтарын почтовай испииһэгэ]"
 }
index 473ca99..31deb71 100644 (file)
@@ -1,5 +1,5 @@
 {
        "@metadata": [],
        "mainpagetext": "'''Nstallazzioni di MediaWiki cumplitata currettamenti.'''",
-       "mainpagedocfooter": "Pi favuri taliari [//meta.wikimedia.org/wiki/Help:Contents Guida utenti] pi aiutu supra l'usu e la cunfigurazzioni di stu software wiki.\n\n== P'accuminzari ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Alencu di mpustazzioni di cunfigurazzioni]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list dî rilassi di MediaWiki]"
+       "mainpagedocfooter": "Pi favuri taliari [//meta.wikimedia.org/wiki/Help:Contents Guida utenti] pi aiutu supra l'usu e la cunfigurazzioni di stu software wiki.\n\n== P'accuminzari ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Alencu di mpustazzioni di cunfigurazzioni]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list dî rilassi di MediaWiki]"
 }
index db4fbff..40d0876 100644 (file)
@@ -2,7 +2,8 @@
        "@metadata": {
                "authors": [
                        "AmaryllisGardener",
-                       "John Reid"
+                       "John Reid",
+                       "Seb35"
                ]
        },
        "config-desc": "The installer fer MediaWiki",
        "config-restart": "Ai, restart it",
        "config-welcome": "=== Environmêntal checks ===\nBasic checks will nou be performed tae see gif this environment is suitable fer MediaWiki installâtion.\nMynd tae inclæde this information gif ye seek heelp oan hou tae complete the installâtion.",
        "config-copyright": "=== Copiericht n Terms ===\n\n$1\n\nThis program is free saffware; ye can redistreebute it n/or modifie it unner the terms o the GNU General Public License aes published bi the Free Software Foundation; either version 2 o the License, or (yer optie) onie later version.\n\nThis program is distributed in the hope that it will be uiseful, but <strong>wioot onie warrantie</strong>; wioot even the implied warrantie o <strong>merchantabeelity</strong> or <strong>fitness fer ae parteecular purpose</strong>.\nSee the GNU General Public License fer mair details.\n\nYe shid hae receeved <doclink href=Copying> ae copie o the GNU General Publeec License</doclink> alang wi this program; gif naw, write til the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, or [http://www.gnu.org/copyleft/gpl.html read it online].",
-       "config-sidebar": "* [//www.mediawiki.org MediaWiki home]\n* [//www.mediawiki.org/wiki/Help:Contents User's Guide]\n* [//www.mediawiki.org/wiki/Manual:Contents Administrator's Guide]\n* [//www.mediawiki.org/wiki/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>Read me</doclink>\n* <doclink href=ReleaseNotes>Release notes</doclink>\n* <doclink href=Copying>Copiein</doclink>\n* <doclink href=UpgradeDoc>Upgradin</doclink>",
+       "config-sidebar": "* [//www.mediawiki.org MediaWiki home]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents User's Guide]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Administrator's Guide]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>Read me</doclink>\n* <doclink href=ReleaseNotes>Release notes</doclink>\n* <doclink href=Copying>Copiein</doclink>\n* <doclink href=UpgradeDoc>Upgradin</doclink>",
        "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-php-toolow": "PHP $1 is instâlled.\nHoue'er, MediaWiki requires PHP $2 or heier.",
        "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] isna available tae handle Unicode normalization, fawin back tae slow pure-PHP implementation.\nGif ye rin ae high-traffic site, ye shid read ae wee bit oan [//www.mediawiki.org/wiki/Unicode_normalization_considerations Unicode normalization].",
-       "config-unicode-update-warning": "<strong>Warnishment:</strong> The instawed version o the Unicode normalization wrapper uises aen aulder version o [http://site.icu-project.org/ the ICU project's] librie.\nYe shid [//www.mediawiki.org/wiki/Unicode_normalization_considerations upgrade] gif ye'r concerned aneat uisin Unicode.",
+       "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].",
+       "config-unicode-update-warning": "<strong>Warnishment:</strong> The instawed version o the Unicode normalization wrapper uises aen aulder version o [http://site.icu-project.org/ the ICU project's] librie.\nYe shid [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations upgrade] gif ye'r concerned aneat uisin Unicode.",
        "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-git": "Foond the Git version control saffware: <code>$1</code>.",
        "config-git-bad": "Git version control saffware no foond.",
        "config-imagemagick": "Foond ImageMagick: <code>$1</code>.\nEemage thummnailin will be enabled gif ye enable uplaids.",
-       "config-gd": "Foond GD graphics librie biggit-in.\nEimage thumbnailing will be enabled gif ye enable uplaids.",
-       "config-no-scaling": "Coudna fynd GD librie or ImageMagick.\nEimage thumbnailing will be disabled.",
+       "config-gd": "Foond GD graphics librie biggit-in.\nEemage thummnailin will be enabled gif ye enable uplaids.",
+       "config-no-scaling": "Coudna fynd GD librie or ImageMagick.\nEemage thummnailin will be disabled.",
        "config-no-uri": "<strong>Mistak:</strong> Coudna determine the current URI.\nInstallâtion aborted.",
-       "config-no-cli-uri": "<strong>Warnishment:</strong> Naw <code>--scriptpath</code> speceefied, uising defaut: <code>$1</code>.",
+       "config-no-cli-uri": "<strong>Warnishment:</strong> Naw <code>--scriptpath</code> speceefied, uisin defaut: <code>$1</code>.",
        "config-using-server": "Uisin server name \"<nowiki>$1</nowiki>\".",
        "config-using-uri": "Uisin server URL \"<nowiki>$1$2</nowiki>\".",
-       "config-uploads-not-safe": "<strong>Warnishment:</strong> Yer defaut directerie fer uplaids <code>$1</code> is vulnerable til arbitrie scripts execution.\nAathough MediaWiki checks aw uplaided files fer securitie threats, it is heily recommended tae [//www.mediawiki.org/wiki/Manual:Security#Upload_security close this security vulnerabeelitie] afore enablin uplaids.",
+       "config-uploads-not-safe": "<strong>Warnishment:</strong> Yer defaut directerie fer uplaids <code>$1</code> is vulnerable til arbitrie scripts execution.\nAathough MediaWiki checks aw uplaided files fer securitie threats, it is heily recommended tae [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security close this security vulnerabeelitie] afore enablin uplaids.",
        "config-no-cli-uploads-check": "<strong>Warnishment:</strong> Yer defaut directerie fer uplaids (<code>$1</code>) isna checkit fer vulnerabeelitie\ntae arbitrie script execution durin the CLI install.",
        "config-brokenlibxml": "Yer system haes ae combinâtion o PHP n libxml2 versions that's buggie n can cause skauk't data rottin in MediaWiki n ither wab applicâtions.\nUpgrade til libxml2 2.7.3 or later ([https://bugs.php.net/bug.php?id=45996 bug filed with PHP]).\nInstallâtion aborted.",
        "config-suhosin-max-value-length": "Suhosin is installed n limits the GET parameter <code>length</code> til $1 bytes.\nMediaWiki's ResoorceLaider component will wark aroonn this limit, but that will lawer performance.\nGif at aw possible, ye shid set <code>suhosin.get.max_value_length</code> til 1024 or heier in <code>php.ini</code>, n set <code>$wgResourceLoaderMaxQueryLength</code> til the same value in <code>LocalSettings.php</code>.",
        "config-header-oracle": "Oracle settins",
        "config-header-mssql": "Microsoft SQL Server settings",
        "config-invalid-db-type": "Onvalid database type",
-       "config-missing-db-name": "Ye maun enter ae value fer \"Database name\"",
-       "config-missing-db-host": "Ye maun enter ae value fer \"Database host\"",
-       "config-missing-db-server-oracle": "Ye mau enter ae value fer \"Database TNS\"",
+       "config-missing-db-name": "Ye maun enter ae value fer \"{{int:config-db-name}}\".",
+       "config-missing-db-host": "Ye maun enter ae value fer \"{{int:config-db-host}}\".",
+       "config-missing-db-server-oracle": "Ye maun enter ae value fer \"{{int:config-db-host-oracle}}\".",
        "config-invalid-db-server-oracle": "Onvalid database TNS \"$1\".\nUise either \"TNS Name\" or aen \"Easy Connect\" string ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle Naming Methods])",
        "config-invalid-db-name": "Onvalid database name \"$1\".\nUise yinly ASCII letters (a-z, A-Z), nummers (0-9), unnerscores (_) an hyphens (-).",
        "config-invalid-db-prefix": "Onvalid database prefix \"$1\".\nUise yinly ASCII letters (a-z, A-Z), nummers (0-9), unnerscores (_) an hyphens (-).",
        "config-profile-no-anon": "Please mak aen accoont",
        "config-profile-fishbowl": "Permited eiditors yinly",
        "config-profile-private": "Private wiki",
-       "config-profile-help": "Wikis wark best whan ye lat aes monie fawk eedit thaim aes possible.\nIn MediaWiki, it's easie tae luik ower the recent chynges, n tae revert onie damage that's dun bi naeeve or maleecioos uisers.\n\nHouever, monie hae foond MediaWiki tae be uissful in ae wide varietie o roles, n sometimes it isna easie tae conveence awbodie o the beneefits o the wiki wa.\nSae ye hae the choice.\n\nThe <strong>{{int:config-profile-wiki}}</strong> model permits oniebdie tae eedit, wioot even loggin in.\nAe wiki wi <strong>{{int:config-profile-no-anon}}</strong> provides eextra accoontabeelitie, but micht deter casual contreebuters.\n\nThe <strong>{{int:config-profile-fishbowl}}</strong> scenario permits appruived uisers tae eedit, but the publeec can see the pages, incluidin histerie.\nA <strong>{{int:config-profile-private}}</strong> yinlie permits appruived uisers tae see pages, wi the same groop permited tae eedit.\n\nMair complex uiser richts confeegurations ar available efter instawation, see the [//www.mediawiki.org/wiki/Manual:User_rights relevant manual entrie].",
+       "config-profile-help": "Wikis wark best whan ye lat aes monie fawk eedit thaim aes possible.\nIn MediaWiki, it's easie tae luik ower the recent chynges, n tae revert onie damage that's dun bi naeeve or maleecioos uisers.\n\nHouever, monie hae foond MediaWiki tae be uissful in ae wide varietie o roles, n sometimes it's na easie tae conveence awbodie o the beneefits o the wiki wa.\nSae ye hae the choice.\n\nThe <strong>{{int:config-profile-wiki}}</strong> model allous oniebdie tae eedit, wioot even loggin in.\nAe wiki wi <strong>{{int:config-profile-no-anon}}</strong> provides eextra accoontabeelitie, but micht deter casual contreebuters.\n\nThe <strong>{{int:config-profile-fishbowl}}</strong> scenario allous appruived uisers tae eedit, but the publeec can see the pages, incluidin histerie.\nA <strong>{{int:config-profile-private}}</strong> yinlie permits appruived uisers tae see pages, wi the same groop permited tae eedit.\n\nMair complex uiser richts confeegurations ar available efter instawation, see the [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights relevant manual entrie].",
        "config-license": "Copiericht n license:",
        "config-license-none": "Nae license fiter",
        "config-license-cc-by-sa": "Creative Commyns Attribution Share Alike",
        "config-email-sender-help": "Enter the wab-mail address tae uise aes the return address oan ootboond wab-mail.\nThis is whaur boonces will be sent.\nMonie mail servers need at least the domain name pairt tae be valid.",
        "config-upload-settings": "Eemages n file uplaids",
        "config-upload-enable": "Enable file uplaids",
-       "config-upload-help": "File uplaids potentiallie expose yer server til securitie risks.\nFer mair information, read the [//www.mediawiki.org/wiki/Manual:Security securitie section] in the manual.\n\nTae enable file uplaids, chynge the mode oan the <code>eemages</code> subdirecterie unner MediaWiki's ruit directerie sae that the wab server can write til it.\nThan enable this optie.",
+       "config-upload-help": "File uplaids potentiallie expose yer server til securitie risks.\nFer mair information, read the [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security securitie section] in the manual.\n\nTae enable file uplaids, chynge the mode oan the <code>eemages</code> subdirecterie unner MediaWiki's ruit directerie sae that the wab server can write til it.\nThan enable this optie.",
        "config-upload-deleted": "Directerie fer delytit files:",
        "config-upload-deleted-help": "Chuise ae directerie tae archive delytit files in.\nIdeally, this shidna be accessible fae the wab.",
        "config-logo": "Logo URL:",
        "config-logo-help": "MediaWiki's defaut skin inclædes space fer ae 135x160 pixel logo abuin the sidebaur menu.\nUplaid aen eemage o the appropriate size, n enter the URL here.\n\nYe can uise <code>$wgStylePath</code> or <code>$wgScriptPath</code> gif yer logo is relative til thae paths.\n\nGif ye dinna want ae logo, lea this kist blank.",
        "config-instantcommons": "Enable Instant Commyns",
-       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commyns] is ae featur that permits wikis tae uise eemages, soonds n ither media foond oan the [//commons.wikimedia.org/ Wikimedia Commyns] site.\nIn order tae dae this, MediaWiki needs access til the Internet.\n\nFer mair information oan this featur, incluidin instructions oan hou tae set it up fer wikis ither than the Wikimedia Commyns, consult [//mediawiki.org/wiki/Manual:$wgForeignFileRepos the manual].",
+       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commyns] is ae featur that allous wikis tae uise eemages, soonds n ither media foond oan the [//commons.wikimedia.org/ Wikimedia Commons] steid.\nIn order tae dae this, MediaWiki needs access til the Internet.\n\nFer mair information oan this featur, incluidin instructions oan hou tae set it up fer wikis ither than the Wikimedia Commons, consult [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos the manual].",
        "config-cc-error": "The Creative Commyns license chuiser gae naw result.\nEnter the license name manually.",
        "config-cc-again": "Pick again...",
        "config-cc-not-chosen": "Chuise whit Creative Commyns license ye want an clap oan \"proceed\".",
        "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-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 allow_url_fopen isna available.",
+       "config-install-subscribe-notpossible": "cURL isna instawed n <code>allow_url_fopen</code> is na available.",
        "config-install-mainpage": "Cræftin main page wi defaut content",
        "config-install-extension-tables": "Makin buirds fer enabled extensions",
        "config-install-mainpage-failed": "Coudna insert main page: $1",
        "config-download-localsettings": "Dounlaid <code>LocalSettings.php</code>",
        "config-help": "heelp",
        "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/Manual:Extensions extensions]?\n\nYe can brouse [//www.mediawiki.org/wiki/Category:Extensions_by_category extensions bi categorie] or the [//www.mediawiki.org/wiki/Extension_Matrix Extension Matrix] tae see the full leet o extensions.",
+       "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>",
-       "mainpagedocfooter": "Consult the [//meta.wikimedia.org/wiki/Help:Contents Uiser's Guide] fer informâtion oan uising the wiki saffware.\n\n== Gettin stairted ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Confeegurâtion settins leet]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailin leet]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Localise MediaWiki fer yer leid]"
+       "mainpagedocfooter": "Consult the [//meta.wikimedia.org/wiki/Help:Contents/sco Uiser's Guide] fer information oan uisin the wiki saffware.\n\n== Gettin stairtit ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Confeeguration settins leet]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailin leet]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki fer yer leid]"
 }
index 5483ffb..9d7835a 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "Jun Misugi"
+                       "Jun Misugi",
+                       "Seb35"
                ]
        },
        "config-title": "Isthallazioni di MediaWiki $1",
@@ -14,5 +15,5 @@
        "config-page-language": "Linga",
        "config-page-welcome": "Binvinuddi in MediaWiki!",
        "mainpagetext": "'''Isthallazioni di MediaWiki accabadda currentementi.'''",
-       "mainpagedocfooter": "Cunsultha la [//meta.wikimedia.org/wiki/Aggiuddu:Summàriu Ghia utenti] pa maggiori infuimmazioni i l'usu di chisthu software wiki.\n\n== Pa ischuminzà ==\nLi sighenti cullegamenti so in linga ingrese:\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Impusthazioni di cunfigurazioni]\n* [//www.mediawiki.org/wiki/Manual:FAQ Prigonti friquenti i MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list annùnzii MediaWiki]"
+       "mainpagedocfooter": "Cunsultha la [//meta.wikimedia.org/wiki/Help:Contents Ghia utenti] pa maggiori infuimmazioni i l'usu di chisthu software wiki.\n\n== Pa ischuminzà ==\nLi sighenti cullegamenti so in linga ingrese:\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Impusthazioni di cunfigurazioni]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Prigonti friquenti i MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list annùnzii MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]"
 }
index a53e77c..da8a16e 100644 (file)
@@ -1,9 +1,10 @@
 {
        "@metadata": {
                "authors": [
-                       "OC Ripper"
+                       "OC Ripper",
+                       "Seb35"
                ]
        },
        "mainpagetext": "'''MediaWiki softver is uspješno instaliran.'''",
-       "mainpagedocfooter": "Kontaktirajte [//meta.wikimedia.org/wiki/Help:Contents uputstva za korisnike] za informacije o upotrebi wiki programa.\n\n== Početak ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista postavki]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki najčešće postavljana pitanja]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista E-Mail adresa MediaWiki]"
+       "mainpagedocfooter": "Kontaktirajte [//meta.wikimedia.org/wiki/Help:Contents uputstva za korisnike] za informacije o upotrebi wiki programa.\n\n== Početak ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista postavki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki najčešće postavljana pitanja]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista E-Mail adresa MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]"
 }
index ce9c73f..beecd24 100644 (file)
@@ -1,9 +1,10 @@
 {
        "@metadata": {
                "authors": [
-                       "Dalinanir"
+                       "Dalinanir",
+                       "Seb35"
                ]
        },
        "mainpagetext": "'''MediaWiki tǧizn (tsrbk) bla tamukrist.'''",
-       "mainpagedocfooter": "Ẓr taǧttnn  [//meta.wikimedia.org/wiki/Aide:Contenu Guide de l’utilisateur] bac ad tawit inɣmisn yaḍn f manik sa tswwurt asɣẓan ad.\n\n== Izwir d MediaWiki ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Umuɣ n iɣwwarn n usgadda ]\n* [//www.mediawiki.org/wiki/Manual:FAQ/fr Isqqsitn f MidyWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Umuɣ n imsgdaln f imbḍitn n MidyaWiki]"
+       "mainpagedocfooter": "Ẓr taǧttnn  [//meta.wikimedia.org/wiki/Help:Contents/fr Guide de l’utilisateur] bac ad tawit inɣmisn yaḍn f manik sa tswwurt asɣẓan ad.\n\n== Izwir d MediaWiki ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Umuɣ n iɣwwarn n usgadda ]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/fr Isqqsitn f MidyWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Umuɣ n imsgdaln f imbḍitn n MidyaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]"
 }
index 80cd5b1..7dd0baa 100644 (file)
        "config-help": "උදව්",
        "config-nofile": "\"$1\" ගොනුව සොයාගත නොහැක. එක මැකිලා ගියාවත්ද?",
        "mainpagetext": "'''මීඩියාවිකි සාර්ථක ලෙස ස්ථාපනය කරන ලදි.'''",
-       "mainpagedocfooter": "විකි මෘදුකාංග භාවිතා කිරීම පිළිබඳ තොරතුරු සඳහා  [//meta.wikimedia.org/wiki/Help:Contents පරිශීලකයන් සඳහා නියමුව] හදාරන්න.\n\n== ඇරඹුම ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings වින්‍යාස සැකසුම්]\n* [//www.mediawiki.org/wiki/Manual:FAQ මීඩියාවිකි නිති-විමසන-පැන]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce මීඩියාවිකි නිකුතුව තැපැල් ලැයිස්තුව]"
+       "mainpagedocfooter": "විකි මෘදුකාංග භාවිතා කිරීම පිළිබඳ තොරතුරු සඳහා  [//meta.wikimedia.org/wiki/Help:Contents පරිශීලකයන් සඳහා නියමුව] හදාරන්න.\n\n== ඇරඹුම ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings වින්‍යාස සැකසුම්]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ මීඩියාවිකි නිති-විමසන-පැන]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce මීඩියාවිකි නිකුතුව තැපැල් ලැයිස්තුව]"
 }
index 9452e0d..ad6bca7 100644 (file)
@@ -2,7 +2,8 @@
        "@metadata": {
                "authors": [
                        "Kusavica",
-                       "KuboF"
+                       "KuboF",
+                       "Sudo77(new)"
                ]
        },
        "config-desc": "Inštalátor pre MediaWiki",
        "config-page-restart": "Reštartovať inštaláciu",
        "config-page-readme": "Čítaj ma",
        "config-page-releasenotes": "Poznámky k vydaniu",
+       "config-page-copying": "Licencia",
+       "config-page-upgradedoc": "Aktualizácia",
+       "config-page-existingwiki": "Existujúca wiki",
        "config-help-restart": "Chcete vymazať všetky uložené dáta, ktoré ste zadali a reštartovať proces inštalácie?",
        "config-restart": "Áno, reštartovať",
+       "config-env-good": "Prostredie bolo skontrolované.\nMôžete nainštalovať MediaWiki.",
+       "config-env-bad": "Prostredie bolo skontrolované.\nNemôžete nainštalovať MediaWiki.",
        "config-env-php": "PHP $1 je nainštalované.",
        "config-env-php-toolow": "PHP $1 je nainštalované. Avšak, MediaWiki vyžaduje PHP $2 alebo vyššie.",
+       "config-db-type": "Typ databázy:",
+       "config-db-host": "Databázový server:",
+       "config-db-host-oracle": "Databázové TNS:",
+       "config-db-wiki-settings": "Identifikácia tejto wiki",
+       "config-db-name": "Názov databázy:",
+       "config-db-name-oracle": "Databázová schéma:",
+       "config-db-install-account": "Používateľský účet pre inštaláciu",
+       "config-db-username": "Databázové používateľské meno:",
+       "config-db-password": "Databázové heslo:",
        "config-missing-db-name": "Musíte zadať hodnotu pre \"{{int:config-db-name}}\".",
        "config-missing-db-host": "Musíte zadať hodnotu pre \"{{int:config-db-host}}\".",
        "config-missing-db-server-oracle": "Musíte zadať hodnotu pre \"{{int:config-db-host-oracle}}\".",
        "config-profile-wiki": "Otvorená wiki",
        "config-profile-private": "Súkromná wiki",
        "config-email-settings": "Nastavenia e-mailu",
+       "config-install-step-done": "hotovo",
+       "config-install-step-failed": "zlyhalo",
+       "config-install-extensions": "Inštalujú sa rozšírenia",
        "config-install-user-alreadyexists": "Používateľ \"$1\" už existuje",
        "config-install-tables-failed": "<strong>Chyba:</strong> Vytvorenie tabuľky zlyhalo s nasledujúcou chybou: $1",
        "config-download-localsettings": "Stiahnuť <code>LocalSettings.php</code>",
        "config-help": "nápoveda",
        "config-nofile": "Súbor \"$1\" sa nenašiel. Bol zmazaný?",
-       "config-extension-link": "Vedeli ste, že vaša wiki podporuje [//www.mediawiki.org/wiki/Manual:Extensions rozšírenia]?\nMôžete hľadať rozšírenia [//www.mediawiki.org/wiki/Category:Extensions_by_category podľa kategórie] alebo si pozrite [//www.mediawiki.org/wiki/Extension_Matrix Extension Matrix] -  kompletný zoznam rozšírení.",
+       "config-extension-link": "Vedeli ste, že vaša wiki podporuje [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions rozšírenia]?\nMôžete hľadať rozšírenia [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category podľa kategórie] alebo si pozrite [//www.mediawiki.org/wiki/Extension_Matrix Extension Matrix] -  kompletný zoznam rozšírení.",
        "mainpagetext": "'''Softvér MediaWiki bol úspešne nainštalovaný.'''",
-       "mainpagedocfooter": "Informácie ako používať wiki softvér nájdete v [//meta.wikimedia.org/wiki/Help:Contents Používateľskej príručke].\n\n== Začíname ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Zoznam konfiguračných nastavení]\n* [//www.mediawiki.org/wiki/Manual:FAQ Časté otázky o MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-poštová konferencia oznámení o MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Preklad MediaWiki do vášho jazyka]"
+       "mainpagedocfooter": "Informácie ako používať wiki softvér nájdete v [//meta.wikimedia.org/wiki/Help:Contents Používateľskej príručke].\n\n== Začíname ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Zoznam konfiguračných nastavení]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Časté otázky o MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-poštová konferencia oznámení o MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Preklad MediaWiki do vášho jazyka]"
 }
index f6df9b7..961264d 100644 (file)
@@ -39,7 +39,7 @@
        "config-help-restart": "Želite počistiti vse shranjene podatke, ki ste jih vnesti, in ponovno začeti s postopkom namestitve?",
        "config-restart": "Da, ponovno zaženi",
        "config-welcome": "=== Pregledi okolja ===\nIzvedli bomo osnovne preglede, da vidimo, če je okolje primerno za namestitev MediaWiki.\nPosredujte rezultate teh pregledov, če med namestitvijo potrebujete pomoč.",
-       "config-sidebar": "* [//www.mediawiki.org Domača stran MediaWiki]\n* [//www.mediawiki.org/wiki/Help:Contents Vodnik za uporabnike]\n* [//www.mediawiki.org/wiki/Manual:Contents Vodnik za administratorje]\n* [//www.mediawiki.org/wiki/Manual:FAQ Pogosto zastavljena vprašanja]\n----\n* <doclink href=Readme>Beri me</doclink>\n* <doclink href=ReleaseNotes>Opombe ob izidu</doclink>\n* <doclink href=Copying>Kopiranje</doclink>\n* <doclink href=UpgradeDoc>Nadgrajevanje</doclink>",
+       "config-sidebar": "* [//www.mediawiki.org Domača stran MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Vodnik za uporabnike]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Vodnik za administratorje]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Pogosto zastavljena vprašanja]\n----\n* <doclink href=Readme>Beri me</doclink>\n* <doclink href=ReleaseNotes>Opombe ob izidu</doclink>\n* <doclink href=Copying>Kopiranje</doclink>\n* <doclink href=UpgradeDoc>Nadgrajevanje</doclink>",
        "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.",
@@ -75,9 +75,9 @@
        "config-header-sqlite": "Nastavitve SQLite",
        "config-header-oracle": "Nastavitve Oracle",
        "config-invalid-db-type": "Neveljavna vrsta zbirke podatkov",
-       "config-missing-db-name": "Vnesti morate vrednost za »Ime zbirke podatkov«",
-       "config-missing-db-host": "Vnesti morate vrednost za »Gostitelj zbirke podatkov«",
-       "config-missing-db-server-oracle": "Vnesti morate vrednost za »TNS 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-missing-db-server-oracle": "Vnesti morate vrednost za »{{int:config-db-host-oracle}}«.",
        "config-invalid-db-server-oracle": "Neveljaven TNS zbirke podatkov »$1«.\nUporabite ali \"ime TNS\" ali niz \"Easy Connect\" ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Načini poimenovanja Oracle])",
        "config-invalid-db-name": "Neveljavno ime zbirke podatkov »$1«.\nUporabljajte samo črke ASCII (a-z, A-Z), številke (0-9), podčrtaje (_) in vezaje (-).",
        "config-invalid-db-prefix": "Neveljavna predpona zbirke podatkov »$1«.\nUporabljajte samo črke ASCII (a-z, A-Z), številke (0-9), podčrtaje (_) in vezaje (-).",
        "config-download-localsettings": "Prenesi <code>LocalSettings.php</code>",
        "config-help": "pomoč",
        "mainpagetext": "'''Programje MediaWiki je bilo uspešno nameščeno.'''",
-       "mainpagedocfooter": "Oglejte si [//meta.wikimedia.org/wiki/Help:Contents Uporabniški priročnik] za informacije o uporabi programja wiki.\n\n== Kako začeti ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Seznam konfiguracijskih nastavitev]\n* [//www.mediawiki.org/wiki/Manual:FAQ Poogsto zastavljena vprašanja MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Poštni seznam izdaj MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Prevedite MediaWiki v svoj jezik]"
+       "mainpagedocfooter": "Oglejte si [//meta.wikimedia.org/wiki/Help:Contents Uporabniški priročnik] za informacije o uporabi programja wiki.\n\n== Kako začeti ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Seznam konfiguracijskih nastavitev]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Poogsto zastavljena vprašanja MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Poštni seznam izdaj MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Prevedite MediaWiki v svoj jezik]"
 }
index 1444f6e..c8fc25f 100644 (file)
@@ -5,5 +5,5 @@
                ]
        },
        "mainpagetext": "'''MediaWiki wourde erfolgreich installiert.'''",
-       "mainpagedocfooter": "Hilfe zur Benutzung und Konfiguration der Wiki-Software fendest du eim [//meta.wikimedia.org/wiki/Help:Contents Benutzerhandbichl].\n\n== Stoarthilfa ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Liste der Konfigurationsvariablen]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki-FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]"
+       "mainpagedocfooter": "Hilfe zur Benutzung und Konfiguration der Wiki-Software fendest du eim [//meta.wikimedia.org/wiki/Help:Contents Benutzerhandbichl].\n\n== Stoarthilfa ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Liste der Konfigurationsvariablen]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki-FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]"
 }
index d4ba4d0..95e3687 100644 (file)
@@ -5,5 +5,5 @@
                ]
        },
        "mainpagetext": "'''MediaWiki Si fiican oo kuugu install gareeyay.'''",
-       "mainpagedocfooter": "Meeshaan ka akhriso sidii aad u isticmaali leheed brogramka wiki [//meta.wikimedia.org/wiki/Help:Contents User's Guide]  .\n== Bilaaw ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]"
+       "mainpagedocfooter": "Meeshaan ka akhriso sidii aad u isticmaali leheed brogramka wiki [//meta.wikimedia.org/wiki/Help:Contents User's Guide]  .\n== Bilaaw ==\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 bc1e93c..bee8498 100644 (file)
@@ -67,5 +67,5 @@
        "config-license-gfdl": "ГНУ-ова лиценца за слободну документацију верзија 1.3 или новија верзија",
        "config-license-pd": "Јавно власништво",
        "mainpagetext": "'''Медијавики је успешно инсталиран.'''",
-       "mainpagedocfooter": "Погледајте [//meta.wikimedia.org/wiki/Help:Contents кориснички водич] за коришћење програма.\n\n== Увод ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Помоћ у вези са подешавањима]\n* [//www.mediawiki.org/wiki/Manual:FAQ Често постављена питања]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Дописна листа о издањима Медијавикија]"
+       "mainpagedocfooter": "Погледајте [//meta.wikimedia.org/wiki/Help:Contents кориснички водич] за коришћење програма.\n\n== Увод ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Помоћ у вези са подешавањима]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Често постављена питања]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Дописна листа о издањима Медијавикија]"
 }
index fdb5265..9ef85db 100644 (file)
@@ -29,5 +29,5 @@
        "config-type-sqlite": "SQLite",
        "config-type-oracle": "Oracle",
        "mainpagetext": "'''MedijaViki je uspešno instaliran.'''",
-       "mainpagedocfooter": "Molimo vidite [//meta.wikimedia.org/wiki/Help:Contents korisnički vodič] za informacije o upotrebi viki softvera.\n\n== Za početak ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Pomoć u vezi sa podešavanjima]\n* [//www.mediawiki.org/wiki/Manual:FAQ Najčešće postavljena pitanja]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mejling lista o izdanjima MedijaVikija]"
+       "mainpagedocfooter": "Molimo vidite [//meta.wikimedia.org/wiki/Help:Contents korisnički vodič] za informacije o upotrebi viki softvera.\n\n== Za početak ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Pomoć u vezi sa podešavanjima]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Najčešće postavljena pitanja]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mejling lista o izdanjima MedijaVikija]"
 }
index b5d5876..5081d2a 100644 (file)
@@ -1,5 +1,9 @@
 {
-       "@metadata": [],
+       "@metadata": {
+               "authors": [
+                       "Seb35"
+               ]
+       },
        "mainpagetext": "'''MediaWiki seti kon bun.'''",
-       "mainpagedocfooter": "Luku na ini a [//meta.wikimedia.org/wiki/Help:Yepi yepibuku] fu si fa fu kebrouki a wikisoftware.\n\n== Moro yepi ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Den seti]\n* [//www.mediawiki.org/wiki/Manual:FAQ Sani di ben aksi furu (FAQ)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Boskopu grupu gi nyun meki]"
+       "mainpagedocfooter": "Luku na ini a [//meta.wikimedia.org/wiki/Help:Contents yepibuku] fu si fa fu kebrouki a wikisoftware.\n\n== Moro yepi ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Den seti]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Sani di ben aksi furu (FAQ)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Boskopu grupu gi nyun meki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]"
 }
index 11becc5..b53706d 100644 (file)
        "config-restart": "Ja, starta om",
        "config-welcome": "=== Miljökontroller ===\nGrundläggande kontroller kommer nu att utföras för att se om denna miljö är lämplig för installation av MediaWiki.\nKom ihåg att ta med denna information om du söker stöd för hur du skall slutföra installationen.",
        "config-copyright": "=== Upphovsrätt och Villkor ===\n\n$1\n\nDetta program är fri programvara; du kan vidaredistribuera den och/eller modifiera det enligt villkoren i GNU General Public License som publicerats av Free Software Foundation; antingen genom version 2 av licensen, eller (på ditt initiativ) någon senare version.\n\nDetta program är distribuerat i hopp om att det kommer att vara användbart, men '''utan någon garanti'''; utan att ens ha en underförstådd garanti om '''säljbarhet''' eller '''lämplighet för ett särskilt ändamål'''.\nSe GNU General Public License för mer detaljer.\n\nDu bör ha fått <doclink href=Copying>en kopia av GNU General Public License</doclink> tillsammans med detta program; om inte, skriv till Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, eller [http://www.gnu.org/copyleft/gpl.html läs den online].",
-       "config-sidebar": "* [//www.mediawiki.org MediaWikis webbplats]\n* [//www.mediawiki.org/wiki/Help:Contents Användarguide]\n* [//www.mediawiki.org/wiki/Manual:Contents Administratörguide]\n* [//www.mediawiki.org/wiki/Manual:FAQ Frågor och svar]\n----\n* <doclink href=Readme>Läs mig</doclink>\n* <doclink href=ReleaseNotes>Utgivningsanteckningar</doclink>\n* <doclink href=Copying>Kopiering</doclink>\n* <doclink href=UpgradeDoc>Uppgradering</doclink>",
+       "config-sidebar": "* [//www.mediawiki.org MediaWikis webbplats]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Användarguide]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Administratörguide]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Frågor och svar]\n----\n* <doclink href=Readme>Läs mig</doclink>\n* <doclink href=ReleaseNotes>Utgivningsanteckningar</doclink>\n* <doclink href=Copying>Kopiering</doclink>\n* <doclink href=UpgradeDoc>Uppgradering</doclink>",
        "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-php-toolow": "PHP $1 är installerat.\nMediaWiki kräver PHP $2 eller högre.",
        "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/Unicode_normalization_considerations Unicode-normalisering].",
-       "config-unicode-update-warning": "'''Varning:''' Den installerade versionen av Unicode-normaliserings \"wrappern\" använder en äldre version av [http://site.icu-project.org/ ICU projektets] bibliotek.\nDu bör [//www.mediawiki.org/wiki/Unicode_normalization_considerations uppgradera] om är intresserad av att använda Unicode.",
+       "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-unicode-update-warning": "'''Varning:''' Den installerade versionen av Unicode-normaliserings \"wrappern\" använder en äldre version av [http://site.icu-project.org/ ICU projektets] bibliotek.\nDu bör [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations uppgradera] om är intresserad av att använda Unicode.",
        "config-no-db": "Kunde inte hitta en lämplig databasdrivrutin! Du måste installera en databasdrivrutin för PHP.\nFöljande databastyper stöds: $1.\n\nI du själv kompilerat din PHP, konfigurera den med en databasklient aktiverad genom att t.ex. använda <code>./configure --with-mysqli</code>.\nOm du installerade PHP från ett Debian- eller Ubuntupaket måste du även installera, t.ex. <code>php5-mysql</code>-paketet.",
        "config-outdated-sqlite": "'''Varning:''' du har SQLite $1, vilket är lägre än minimikravet version $2. SQLite kommer inte att vara tillgänglig.",
        "config-no-fts3": "'''Varning:''' SQLite kompileras utan [//sqlite.org/fts3.html FTS3-modulen], sökfunktioner kommer att vara otillgängliga på denna backend.",
@@ -85,7 +85,7 @@
        "config-no-cli-uri": "'''Varning:''' Ingen <code>--scriptpath</code> är angiven, använder standarden: <code>$1</code> .",
        "config-using-server": "Använder servernamn \"<nowiki>$1</nowiki>\".",
        "config-using-uri": "Använder server-URL \"<nowiki>$1$2</nowiki>\".",
-       "config-uploads-not-safe": "'''Varning:''' Din standardkatalog för uppladdningar <code>$1</code> är sårbar för körning av godtyckliga skript.\nÄven om MediaWiki kontrollerar alla uppladdade filer för säkerhetshot är det ändå starkt rekommenderat att [//www.mediawiki.org/wiki/Manual:Security#Upload_security stänga detta säkerhetshål] innan du aktiverar uppladdningar.",
+       "config-uploads-not-safe": "'''Varning:''' Din standardkatalog för uppladdningar <code>$1</code> är sårbar för körning av godtyckliga skript.\nÄven om MediaWiki kontrollerar alla uppladdade filer för säkerhetshot är det ändå starkt rekommenderat att [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security stänga detta säkerhetshål] innan du aktiverar uppladdningar.",
        "config-no-cli-uploads-check": "'''Varning:''' Din standardkatalog för uppladdningar (<code>$1</code>) har inte kontrollerats för sårbarhet från körning av godtyckliga skript under CLI-installationen.",
        "config-brokenlibxml": "Ditt system har en kombination av PHP och libxml2 som är buggigt och kan orsaka datakorruption i MediaWiki och andra webbprogram.\nUppgradera till libxml2 2.7.3 eller senare ([https//bugs.php.net/bug.php?id=45996 buggfil med PHP]).\nInstallationen avbröts.",
        "config-suhosin-max-value-length": "Suhosin är installerat och begränsar GET-parametern <code>length</code> till $1 bytes.\nMediaWikis ResourceLoader-komponent kommer att arbeta runt denna begränsning, men det kommer att försämra prestandan.\nOm möjligt bör du sätta <code>suhosin.get.max_value_length</code> till 1024 eller högre i <code>php.ini</code>, och sätta <code>$wgResourceLoaderMaxQueryLength</code> till samma värde som i <code>LocalSettings.php</code>.",
        "config-mysql-binary": "Binär",
        "config-mysql-utf8": "UTF-8",
        "config-mysql-charset-help": "I '''binärt läge''' lagrar MediaWiki UTF-8 text till databasen i binära fält.\nDetta är mer effektivt än MySQLs UTF-8-läge, och den tillåter dig att använda den fulla uppsättningen av Unicode-tecken.\n\nI '''UTF-8-läge''' vet MySQL vilket teckenuppsättning din data är i och kan presentera och konvertera den på ett lämpligt sätt, men den tillåter dig inte att lagra tecken över [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
+       "config-mssql-auth": "Autentiseringstyp:",
        "config-mssql-sqlauth": "SQL Server-autentisering",
        "config-mssql-windowsauth": "Windows-autentisering",
        "config-site-name": "Namnet på wikin:",
        "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-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 allow_url_fopen är inte tillgänglig.",
+       "config-install-subscribe-notpossible": "cURL är inte installerad och <code>allow_url_fopen</code> är inte tillgänglig.",
        "config-install-mainpage": "Skapa huvudsida med standardinnehåll",
        "config-install-extension-tables": "Skapar tabeller för aktiverade tillägg",
        "config-install-mainpage-failed": "Kunde inte infoga huvudsidan: $1",
        "config-install-done": "'''Grattis!'''\nDu har installerat MediaWiki.\n\nInstallationsprogrammet har genererat filen <code>LocalSettings.php</code>.\nDet innehåller alla dina konfigurationer.\n\nDu kommer att behöva ladda ner den och placera den i roten för din wiki-installation (samma katalog som index.php). Nedladdningen borde ha startats automatiskt.\n\nOm ingen nedladdning erbjöds, eller om du har avbrutit det kan du starta om nedladdningen genom att klicka på länken nedan:\n\n$3\n\n'''OBS''': Om du inte gör detta nu, kommer denna genererade konfigurationsfil inte vara tillgänglig för dig senare om du avslutar installationen utan att ladda ned den.\n\nNär det är klart, kan du '''[$2 gå in på din wiki]'''.",
        "config-download-localsettings": "Ladda ner <code>LocalSettings.php</code>",
        "config-help": "hjälp",
+       "config-help-tooltip": "klicka för att expandera",
        "config-nofile": "Filen \"$1\" kunde inte hittas. Har den raderats?",
-       "config-extension-link": "Visste du att din wiki stödjer [//www.mediawiki.org/wiki/Manual:Extensions tillägg]?\n\nDu kan bläddra i [//www.mediawiki.org/wiki/Category:Extensions_by_category tillägg efter kategori] eller i [//www.mediawiki.org/wiki/Extension_Matrix tilläggsmatrisen] för att se hela listan över tillägg.",
+       "config-extension-link": "Visste du att din wiki stödjer [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions tillägg]?\n\nDu kan bläddra [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category tillägg efter kategori].",
        "mainpagetext": "'''MediaWiki har installerats utan problem.'''",
-       "mainpagedocfooter": "Information om hur wiki-programvaran används finns i [//meta.wikimedia.org/wiki/Help:Contents användarguiden].\n\n== Att komma igång ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista över konfigurationsinställningar]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-postlista för nya versioner av MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Lokalisera MediaWiki för ditt språk]"
+       "mainpagedocfooter": "Information om hur wiki-programvaran används finns i [//meta.wikimedia.org/wiki/Help:Contents användarguiden].\n\n== Att komma igång ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista över konfigurationsinställningar]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-postlista för nya versioner av MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Lokalisera MediaWiki för ditt språk]"
 }
index 2652b70..aac7a0f 100644 (file)
@@ -5,5 +5,5 @@
                ]
        },
        "mainpagetext": "'''MediaWiki imefanikiwa kuingizwa.'''",
-       "mainpagedocfooter": "Shauriana na [//meta.wikimedia.org/wiki/Help:Contents Mwongozo wa Mtumiaji] kwa habari juu ya utumiaji wa bidhaa pepe ya wiki.\n\n== Msaada wa kianzio ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Orodha ya mipangilio ya msingi]\n* [//www.mediawiki.org/wiki/Manual:FAQ FAQ ya MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Orodha ya utoaji wa habari za MediaWiki]"
+       "mainpagedocfooter": "Shauriana na [//meta.wikimedia.org/wiki/Help:Contents Mwongozo wa Mtumiaji] kwa habari juu ya utumiaji wa bidhaa pepe ya wiki.\n\n== Msaada wa kianzio ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Orodha ya mipangilio ya msingi]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ ya MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Orodha ya utoaji wa habari za MediaWiki]"
 }
index 721a73b..68c13cc 100644 (file)
@@ -5,5 +5,5 @@
                ]
        },
        "mainpagetext": "'''Sztalowańy MediaWiki śe udoło.'''",
-       "mainpagedocfooter": "Uobezdrzij [//meta.wikimedia.org/wiki/Help:Contents przewodńik sprowjacza], kaj sům informacyje uo dźołańu uoprogramowańo MediaWiki.\n\n== Na sztart ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista sztalowań konfiguracyje]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Komuńikaty uo nowych wersyjach MediaWiki]"
+       "mainpagedocfooter": "Uobezdrzij [//meta.wikimedia.org/wiki/Help:Contents przewodńik sprowjacza], kaj sům informacyje uo dźołańu uoprogramowańo MediaWiki.\n\n== Na sztart ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista sztalowań konfiguracyje]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Komuńikaty uo nowych wersyjach MediaWiki]"
 }
index 9ac53dd..361cde9 100644 (file)
@@ -31,7 +31,7 @@
        "config-page-upgradedoc": "தரமுயர்த்தப்படுகிறது",
        "config-page-existingwiki": "இருக்கின்ற விக்கி",
        "config-restart": "ஆம், மறுமுறை துவங்கு",
-       "config-sidebar": "* [//www.mediawiki.org மீடியாவிக்கி முகப்பு]\n* [//www.mediawiki.org/wiki/Help:Contents பயனரின் கையேடு]\n* [//www.mediawiki.org/wiki/Manual:Contents மேலாளரின் கையேடு]\n* [//www.mediawiki.org/wiki/Manual:FAQ அகேகே]\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 மீடியாவிக்கி முகப்பு]\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-db-type": "தரவுத்தள வகை:",
        "config-db-wiki-settings": "இந்த விக்கியைக் கண்டுபிடி",
        "config-db-name": "தரவுதளப் பெயர்:",
@@ -86,5 +86,5 @@
        "config-download-localsettings": "<code>LocalSettings.php</code>ஐத் தரவிறக்கவும்",
        "config-help": "உதவி",
        "mainpagetext": "'''விக்கி மென்பொருள் வெற்றிகரமாக உள்ளிடப்பட்டது.'''",
-       "mainpagedocfooter": "விக்கி மென்பொருளைப் பயன்படுத்துவது தொடர்பாக [//meta.wikimedia.org/wiki/Help:Contents பயனர் வழிகாட்டியைப்] பார்க்க.\n\n== தொடக்கப்படிகள் ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings அமைப்புக்களை மாற்றம் செய்தல்]\n* [//www.mediawiki.org/wiki/Manual:FAQ மிடியாவிக்கி பொதுவான கேள்விகள்]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce மீடியாவிக்கி வெளியீடு மின்னஞ்சல் பட்டியல்]"
+       "mainpagedocfooter": "விக்கி மென்பொருளைப் பயன்படுத்துவது தொடர்பாக [//meta.wikimedia.org/wiki/Help:Contents பயனர் வழிகாட்டியைப்] பார்க்க.\n\n== தொடக்கப்படிகள் ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings அமைப்புக்களை மாற்றம் செய்தல்]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ மிடியாவிக்கி பொதுவான கேள்விகள்]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce மீடியாவிக்கி வெளியீடு மின்னஞ்சல் பட்டியல்]"
 }
index 8328af4..a899133 100644 (file)
@@ -1,5 +1,5 @@
 {
        "@metadata": [],
        "mainpagetext": "'''ಮೀಡಿಯವಿಕಿ ಯಶಸ್ವಿಯಾದ್ ಇನ್’ಸ್ಟಾಲ್ ಆಂಡ್.'''",
-       "mainpagedocfooter": "ವಿಕಿ ತಂತ್ರಾಂಶನ್ ಉಪಗೋಗ ಮನ್ಪುನ ಬಗ್ಗೆ ಮಾಹಿತಿಗ್ [//meta.wikimedia.org/wiki/Help:Contents ಸದಸ್ಯೆರ್ನ ನಿರ್ದೇಶನ ಪುಟ] ತೂಲೆ.\n\n== ಎಂಚ ಶುರು ಮಲ್ಪುನಿ ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Manual:FAQ ಮೀಡಿಯವಿಕಿ FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]"
+       "mainpagedocfooter": "ವಿಕಿ ತಂತ್ರಾಂಶನ್ ಉಪಗೋಗ ಮನ್ಪುನ ಬಗ್ಗೆ ಮಾಹಿತಿಗ್ [//meta.wikimedia.org/wiki/Help:Contents ಸದಸ್ಯೆರ್ನ ನಿರ್ದೇಶನ ಪುಟ] ತೂಲೆ.\n\n== ಎಂಚ ಶುರು ಮಲ್ಪುನಿ ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ ಮೀಡಿಯವಿಕಿ FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]"
 }
index 6752b7d..86b760c 100644 (file)
@@ -44,7 +44,7 @@
        "config-restart": "ఔను, తిరిగి ప్రారంభించు",
        "config-welcome": "=== పర్యావరణ పరీక్షలు ===\nఈ పర్యావరణం MediaWiki స్థాపనకు అనుకూలంగా ఉందో లేదో చూసే ప్రాథమిక పరీక్షలు ఇపుడు చేస్తాం.\nస్థాపనను ఎలా పూర్తి చెయ్యాలనే విషయమై మీకు సహాయం అడిగేటపుడు, ఈ సమాచారాన్ని ఇవ్వాలని గుర్తుంచుకోండి.",
        "config-copyright": "=== కాపీహక్కు, నిబంధనలు===\n\n$1\n\nఇది ఉచిత సాఫ్ట్‌వేరు; ఫ్రీ సాఫ్ట్‌వేర్ ఫౌండేషన్ వారు ప్రచురించిన GNU జనరల్ పబ్లిక్ లైసెన్సును (2వ లేదా తరువాతి వర్షన్) అనుసరించి దీన్ని పంపిణీ చెయ్యవచ్చు లేదా మార్చుకోనూవచ్చు.\n\nదీని వలన ఉపయోగం ఉంటుందనే నమ్మకంతో ప్రచురింపబడింది. కానీ <strong>ఎటువంటి వారంటీ లేదు</strong>; <strong> వర్తకం చేయదగ్గ </strong>  లేదా <strong> ఒక అవసరానికి సరిపడే సామర్థ్యం</strong> ఉన్నదనే అంతరార్థ వారంటీ కూడా లేదు.\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 MediaWiki మొదటిపేజీ]\n* [//www.mediawiki.org/wiki/Help:Contents వాడుకరుల మార్గదర్శి]\n* [//www.mediawiki.org/wiki/Manual:Contents అధికారుల మార్గదర్శి]\n* [//www.mediawiki.org/wiki/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-sidebar": "* [//www.mediawiki.org MediaWiki మొదటిపేజీ]\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ఇక మీరు MediaWiki ని స్థాపించుకోవచ్చు.",
        "config-env-bad": "పర్యావరణాన్ని పరీక్షించాం.\nమీరు MediaWiki ని స్థాపించలేరు.",
        "config-env-php": "PHP $1 స్థాపించబడింది.",
@@ -73,6 +73,7 @@
        "config-db-username": "డేటాబేసు వాడుకరిపేరు:",
        "config-db-password": "డేటాబేసు సంకేతపదం:",
        "config-db-password-empty": "కొత్త డేటాబేసు వాడుకరి $1 కి ఓ సంకేతపదం ఇవ్వండి. \nసంకేతపదాలేమీ లేకుండా వాడుకరులను సృష్టించేవీలున్నప్పటికీ, అది సురక్షితం కాదు.",
+       "config-db-username-empty": "\"{{int:config-db-username}}\" కి మీరు తప్పకుండా ఏదో ఒక విలువ ఇవ్వాలి.",
        "config-db-install-username": "స్థాపన దశలో డేటాబేసుకు కనెక్టయ్యేందుకు వాడే వాడుకరిపేరును ఇవ్వండి.\nఇది MediaWiki ఖాతా యొక్క వాడుకరిపేరు కాదు; మీ డేటాబేసు కోసం వాడుకరిపేరు.",
        "config-db-install-password": "స్థాపన దశలో డేటాబేసుకు కనెక్టయ్యేందుకు వాడే సంకేతపదాన్ని ఇవ్వండి.\nఇది MediaWiki ఖాతా యొక్క సంకేతపదం కాదు; మీ డేటాబేసు కోసం సంకేతపదం.",
        "config-db-install-help": "స్థాపన దశలో డేటాబేసుకు కనెక్టయ్యేందుకు వాడే వాడుకరిపేరు, సంకేతపదం ఇవ్వండి.",
        "config-help": "సహాయం",
        "config-nofile": "\"$1\" ఫైలు దొరకలేదు. దాన్ని గానీ తొలగించారా?",
        "mainpagetext": "'''మీడియా వికీని విజయవంతంగా ప్రతిష్టించాం.'''",
-       "mainpagedocfooter": "వికీ సాఫ్టువేరును వాడటనికి కావలిసిన సమాచారం కోసం [//meta.wikimedia.org/wiki/Help:Contents వాడుకరుల గైడు]ను సందర్శించండి.\n\n== మొదలు పెట్టండి ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings మీడియావికీ పనితీరు, అమరిక మార్చుకునేందుకు వీలుకల్పించే చిహ్నాల జాబితా]\n* [//www.mediawiki.org/wiki/Manual:FAQ మీడియావికీపై తరుచుగా అడిగే ప్రశ్నలు]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce మీడియావికీ సాఫ్టువేరు కొత్త వెర్షను విడుదలల గురించి తెలిపే మెయిలింగు లిస్టు]"
+       "mainpagedocfooter": "వికీ సాఫ్టువేరును వాడటనికి కావలిసిన సమాచారం కోసం [//meta.wikimedia.org/wiki/Help:Contents వాడుకరుల గైడు]ను సందర్శించండి.\n\n== మొదలు పెట్టండి ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings మీడియావికీ పనితీరు, అమరిక మార్చుకునేందుకు వీలుకల్పించే చిహ్నాల జాబితా]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ మీడియావికీపై తరుచుగా అడిగే ప్రశ్నలు]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce మీడియావికీ సాఫ్టువేరు కొత్త వెర్షను విడుదలల గురించి తెలిపే మెయిలింగు లిస్టు]"
 }
index ef2503c..98ac19c 100644 (file)
@@ -5,5 +5,5 @@
                ]
        },
        "mainpagetext": "'''Нармафзори МедиаВики бо муваффақият насб шуд.'''",
-       "mainpagedocfooter": "Барои иттилоот дар бораи истифода нармафзори вики аз //meta.wikimedia.org/wiki/Help:Contents User's Guide] истифода баред.\n\n== Оғоз ба кор ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Феҳристи танзимоти пайгирбандӣ]\n* [//www.mediawiki.org/wiki/Manual:FAQ Пурсишҳои МедиаВики]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Феҳристи роҳнамои МедиаВики]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Маҳалликунонии МедиаВики ба забони шумо]"
+       "mainpagedocfooter": "Барои иттилоот дар бораи истифода нармафзори вики аз //meta.wikimedia.org/wiki/Help:Contents User's Guide] истифода баред.\n\n== Оғоз ба кор ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Феҳристи танзимоти пайгирбандӣ]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Пурсишҳои МедиаВики]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Феҳристи роҳнамои МедиаВики]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Маҳалликунонии МедиаВики ба забони шумо]"
 }
index 244bda2..41d148a 100644 (file)
@@ -5,5 +5,5 @@
                ]
        },
        "mainpagetext": "'''Narmafzori MediaViki bo muvaffaqijat nasb şud.'''",
-       "mainpagedocfooter": "Az [//meta.wikimedia.org/wiki/Help:Contents Rohnamoi Korbaron] baroi istifodai narmafzori viki kūmak bigired.\n\n== Oƣoz ba kor ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Fehristi tanzimoti pajgirbandī]\n* [//www.mediawiki.org/wiki/Manual:FAQ Pursişhoi MediaViki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Fehristi rojnomahoi nusxahoi MediaViki]"
+       "mainpagedocfooter": "Az [//meta.wikimedia.org/wiki/Help:Contents Rohnamoi Korbaron] baroi istifodai narmafzori viki kūmak bigired.\n\n== Oƣoz ba kor ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Fehristi tanzimoti pajgirbandī]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Pursişhoi MediaViki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Fehristi rojnomahoi nusxahoi MediaViki]"
 }
index 406f09d..ec6526b 100644 (file)
@@ -6,5 +6,5 @@
                ]
        },
        "mainpagetext": "<strong>ติดตั้งมีเดียวิกิสำเร็จ</strong>",
-       "mainpagedocfooter": "ศึกษา[//meta.wikimedia.org/wiki/Help:Contents คู่มือการใช้งาน] สำหรับเริ่มต้นใช้งานซอฟต์แวร์วิกิ\n\n== เริ่มต้น ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings รายการการปรับแต่งระบบ] (ภาษาอังกฤษ)\n* [//www.mediawiki.org/wiki/Manual:FAQ คำถามที่ถามบ่อยในมีเดียวิกิ] (ภาษาอังกฤษ)\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce เมลลิงลิสต์ของมีเดียวิกิ]"
+       "mainpagedocfooter": "ศึกษา[//meta.wikimedia.org/wiki/Help:Contents คู่มือการใช้งาน] สำหรับเริ่มต้นใช้งานซอฟต์แวร์วิกิ\n\n== เริ่มต้น ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings รายการการปรับแต่งระบบ] (ภาษาอังกฤษ)\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ คำถามที่ถามบ่อยในมีเดียวิกิ] (ภาษาอังกฤษ)\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce เมลลิงลิสต์ของมีเดียวิกิ]"
 }
index ce7d582..0292276 100644 (file)
@@ -5,5 +5,5 @@
                ]
        },
        "mainpagetext": "'''MediaWiki şowlulyk bilen guruldy.'''",
-       "mainpagedocfooter": "Wiki programmasynyň ulanylyşy hakynda maglumat almak üçin [//meta.wikimedia.org/wiki/Help:Contents ulanyjy gollanmasyna] serediň.\n\n== Öwrenjeler ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Konfigurasiýa sazlamalary]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki SSS]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-poçta sanawy]"
+       "mainpagedocfooter": "Wiki programmasynyň ulanylyşy hakynda maglumat almak üçin [//meta.wikimedia.org/wiki/Help:Contents ulanyjy gollanmasyna] serediň.\n\n== Öwrenjeler ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Konfigurasiýa sazlamalary]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki SSS]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-poçta sanawy]"
 }
index ce76620..5d795e7 100644 (file)
        "config-restart": "Oo, muling simulan ito",
        "config-welcome": "=== Pagsusuring pangkapaligiran ===\nIsinasagawa ang payak na mga pagsusuri upang makita kung ang kapaligirang ito ay angkop para sa pagluluklok ng MediaWiki.\nDapat mong ibigay ang mga kinalabasan ng mga pagsusuring ito kung kailangan mo ng tulong habang nagluluklok.",
        "config-copyright": "=== Karapatang-ari at Tadhana ===\n\n$1\n\nAng programang ito ay malayang software; maaari mo itong ipamahagi at/o baguhin sa ilalim ng mga tadhana ng Pangkalahatang Pampublikong Lisensiyang GNU ayon sa pagkakalathala ng Free Software Foundation; na maaaring bersyong 2 ng Lisensiya, o (kung nais mo) anumang susunod na bersyon.\n\nIpinamamahagi ang programang ito na umaasang magiging gamitin, subaliut '''walang anumang katiyakan'''; na walang pahiwatig ng '''pagiging mabenta''' o '''kaangkupan para sa isang tiyak na layunin'''.\nTingnan ang Pangkalahatang Pampublikong Lisensiyang GNU para sa mas maraming detalye.\n\nDapat nakatanggap ka ng <doclink href=Copying>isang sipi ng Pangkalahatang Pampublikong Lisensiyang GNU</doclink> kasama ng programang ito; kung hindi, sumulat sa Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, o [http://www.gnu.org/licenses//gpl.html basahin ito sa Internet].",
-       "config-sidebar": "* [//www.mediawiki.org Tahanan ng MediaWiki]\n* [//www.mediawiki.org/wiki/Help:Contents Gabay ng Tagagamit]\n* [//www.mediawiki.org/wiki/Manual:Contents Gabay ng Tagapangasiwa]\n* [//www.mediawiki.org/wiki/Manual:FAQ Mga Malimit Itanong]\n----\n* <doclink href=Readme>Basahin ako</doclink>\n* <doclink href=ReleaseNotes>Mga tala ng paglalabas</doclink>\n* <doclink href=Copying>Pagkopya</doclink>\n* <doclink href=UpgradeDoc>Pagsasapanahon</doclink>",
+       "config-sidebar": "* [//www.mediawiki.org Tahanan ng MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Gabay ng Tagagamit]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Gabay ng Tagapangasiwa]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Mga Malimit Itanong]\n----\n* <doclink href=Readme>Basahin ako</doclink>\n* <doclink href=ReleaseNotes>Mga tala ng paglalabas</doclink>\n* <doclink href=Copying>Pagkopya</doclink>\n* <doclink href=UpgradeDoc>Pagsasapanahon</doclink>",
        "config-env-good": "Nasuri na ang kapaligiran.\nMailuluklok mo ang MediaWiki.",
        "config-env-bad": "Nasuri na ang kapaligiran.\nHindi mo mailuklok ang MediaWiki.",
        "config-env-php": "Naitalaga ang PHP na $1.",
        "config-env-php-toolow": "Naitalaga ang PHP $1.\nSubalit, nangangailangan ang MediaWiki ng PHP $2 o mas mataas pa.",
        "config-unicode-using-utf8": "Ginagamit ang utf8_normalize.so ni Brion Vibber para sa pagpapanormal ng Unikodigo.",
        "config-unicode-using-intl": "Ginagamit ang [http://pecl.php.net/intl intl dugtong na PECL] para sa pagsasanormal ng Unikodigo.",
-       "config-unicode-pure-php-warning": "'''Babala''': Ang [http://pecl.php.net/intl dugtong ng internasyunal na PECL] ay hindi makukuha upang makapanghawak ng pagpapanormal ng Unikodigo, na babagsak na pabalik sa mabagal na pagsasakatuparan ng dalisay na PHP.\nKapag nagpapatakbo ka ng isang pook na mataas ang trapiko, dapat kang bumasa ng kaunti hinggil sa [//www.mediawiki.org/wiki/Unicode_normalization_considerations pagpapanormal ng Unikodigo].",
-       "config-unicode-update-warning": "'''Babala''': Ang nakaluklok na bersiyon ng pambalot ng pagpapanormal ng Unikodigo ay gumagamit ng isang mas matandang bersiyon ng aklatan ng [http://site.icu-project.org/ proyekto ng ICU].\nDapat kang [//www.mediawiki.org/wiki/Unicode_normalization_considerations magtaas ng uri] kung may pag-aalala ka hinggil sa paggamit ng Unikodigo.",
+       "config-unicode-pure-php-warning": "'''Babala''': Ang [http://pecl.php.net/intl dugtong ng internasyunal na PECL] ay hindi makukuha upang makapanghawak ng pagpapanormal ng Unikodigo, na babagsak na pabalik sa mabagal na pagsasakatuparan ng dalisay na PHP.\nKapag nagpapatakbo ka ng isang pook na mataas ang trapiko, dapat kang bumasa ng kaunti hinggil sa [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations pagpapanormal ng Unikodigo].",
+       "config-unicode-update-warning": "'''Babala''': Ang nakaluklok na bersiyon ng pambalot ng pagpapanormal ng Unikodigo ay gumagamit ng isang mas matandang bersiyon ng aklatan ng [http://site.icu-project.org/ proyekto ng ICU].\nDapat kang [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations magtaas ng uri] kung may pag-aalala ka hinggil sa paggamit ng Unikodigo.",
        "config-no-db": "Hindi matagpuan ang isang angkop na tagapagmaneho ng kalipunan ng datos! Kailangan mong magluklok ng isang tagapagmaneho ng kalipunan ng dato para sa PHP.\nTinatangkilik ang sumusunod na mga uri ng kalipunan ng dato: $1.\n\nKung ikaw ay nasa isang pinagsasaluhang pagpapasinaya, hilingin sa iyong tagapagbigay ng pagpapasinaya na iluklok ang isang angkop na tagapagmaneho ng kalipunan ng dato.\nKung ikaw mismo ang nangalap ng PHP, muling isaayos ito na pinagagana ang isang kliyente ng kalipunan ng dato, halimbawa na ang paggamit ng <code>./configure --with-mysql</code>.\nKung iniluklok mo ang PHP mula sa isang pakete ng Debian o Ubuntu, kung gayon kailangan mo ring magluklok ng modyul na php5-mysql.",
        "config-outdated-sqlite": "'''Babala''': mayroong kang $1 ng SQLite, na mas mababa kaysa sa pinaka mababang kailangang bersiyon na $2. Magiging hindi makukuha ang SQLite.",
        "config-no-fts3": "'''Warning''': Ang SQLite ay hindi itinala at tinipon na wala ang [//sqlite.org/fts3.html modulong FTS3], ang mga tampok na panghanap ay magiging hindi makukuha sa ibabaw ng panlikod na dulong ito.",
@@ -81,7 +81,7 @@
        "config-no-cli-uri": "'''Babala''': Walang tinukoy na --landas ng panitik, ginagamit ang likas na katakdaan: <code>$1</code>.",
        "config-using-server": "Ginagamit ang pangalan ng tagapaghain na \"<nowiki>$1</nowiki>\".",
        "config-using-uri": "Ginagamit ang URL ng tagapaghain na \"<nowiki>$1$2</nowiki>\".",
-       "config-uploads-not-safe": "'''Babala:''' Ang iyong likas na nakatakdang direktoryo para sa paitaas na mga pagkakarga na <code>$1</code> ay may kahinaan laban sa pagsasagawa ng mga panitiki na hindi makatwiran. Bagaman sinisiyasat ng MediaWiki ang lahat ng paitaas na naikargang mga talaksan para sa mga panganib na pangkatiwasayan, mataas na iminumungkahi na [//www.mediawiki.org/wiki/Manual:Security#Upload_security isara ang kahinaang ito na pangkatiwasayan] bago paganahin ang paitaas na mga pagkakarga.",
+       "config-uploads-not-safe": "'''Babala:''' Ang iyong likas na nakatakdang direktoryo para sa paitaas na mga pagkakarga na <code>$1</code> ay may kahinaan laban sa pagsasagawa ng mga panitiki na hindi makatwiran. Bagaman sinisiyasat ng MediaWiki ang lahat ng paitaas na naikargang mga talaksan para sa mga panganib na pangkatiwasayan, mataas na iminumungkahi na [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security isara ang kahinaang ito na pangkatiwasayan] bago paganahin ang paitaas na mga pagkakarga.",
        "config-no-cli-uploads-check": "'''Babala:''' Ang iyong likas na nakatakdang direktoryo para sa paitaas na mga pagkakarga (<code>$1</code>) ay hindi nasuri para sa kahinaan laban sa pagsasagawa ng panitik na hindi makatwiran habang iniluluklok ang Ugnayang Mukha ng Guhit ng Kaataasan o Command-Line Interface (CLI).",
        "config-brokenlibxml": "Ang sistema mo ay mayroong isang pagsasama ng mga bersiyon ng PHP at libxml2 na maaaring masurot at maaaring makapagsanhi ng pagkasira ng datong nakakubli sa loob ng MediaWiki at iba pang mga aplikasyon ng sangkasaputan.\nMagtaas ng uri upang maging PHP 5.2.9 o mas lalong huli at libxml2 2.7.3 o mas lalong huli ([//bugs.php.net/bug.php?id=45996 isinalansan ang surot o ''bug'' na mayroong PHP]). Binigo ang pagluluklok.",
        "config-suhosin-max-value-length": "Nakaluklok ang Suhosin at hinahanggahan ang haba ng parametro ng GET sa $1 mga byte. Ang sangkap na ResourceLoader ng MediaWiki ay gagana sa paligid ng hangganang ito, subalit pasasamain nito ang pagganap. Kung talagang maaari, dapat mong itakda ang <code>suhosin.get.max_value_length</code> upang maging 1024 o mas mataas sa loob ng <code>php.ini</code>, at itakda ang <code>$wgResourceLoaderMaxQueryLength</code> sa katulad na halaga sa loob ng LocalSettings.php.",
        "config-db-name": "Pangalan ng kalipunan ng dato:",
        "config-db-name-help": "Pumili ng isang pangalan na pangkilala sa wiki mo.\nHindi ito dapat maglaman ng mga patlang.\n\nKung gumagamit ka ng pinagsasaluhang pagpapasinaya ng sangkasaputan, ang iyong tagapagbigay ng pagpapasinaya ay maaaring bigyan ka ng isang tiyak na pangalan ng kalipunan ng datong gagamitin o papayagan kang lumikha ng mga kalipunan ng dato sa pamamagitan ng isang entrepanyong pantaban.",
        "config-db-name-oracle": "Balangkas ng kalipunan ng dato:",
-       "config-db-account-oracle-warn": "Mayroong tatlong tinatangkilik na tagpo para sa pagluluklok ng Oracle bilang panlikurang hulihan ng kalipunan ng dato:\n\nKung nais mong lumikha ng akawnt ng kalipunan ng dato bilang bahagi ng proseso ng pagluluklok, paki magbigay ng isang akawnt na mayroong gampanin ng SYSDBA bilang akawnt ng kalipunan ng dato para sa pagluluklok at tukuyin ang ninanais na mga kredensiyal para sa akawnt ng pagpunta sa sangkasaputan, o di kaya ay maaaring kinakamay na lumikha ng akawnt ng pagpunta sa sangkasaputan at ibigay lamang ang akawnt na iyan (kung mayroong ito ng kinakailangang mga pahintulot upang malikha ang mga bagay na pampagpapanukala) o magbigay ng dalawang magkaibang mga akawnt, isang mayroong pribilehiyo ng paglikha at isang may pagbabawal para sa pagpunta sa sangkasaputan.\n\nAng panitik sa paglikha ng isang akawnt na mayroon ng kinakailangang mga pribilehiyo ay matatagpuan sa loob ng direktoryong \"maintenance/oracle/\" ng pagluluklok na ito. Pakatandaan na ang paggamit ng isang akawnt na may pagbabawal ay hindi magpapagana isa lahat ng mga kakayahang pampananatili sa piling ng likas na nakatakdang akawnt.",
-       "config-db-install-account": "Akawnt ng tagagamit para sa pagluluklok",
+       "config-db-account-oracle-warn": "Mayroong tatlong suportadong senaryo para sa pag-install ng Oracle bilang database backend:\n\nKung nais mong lumikha ng account ng database bilang bahagi ng proseso ng pag-install, paki magbigay ng isang account na mayroong gampanin ng SYSDBA bilang account ng database para sa pag-install at tukuyin ang ninanais na mga kredensiyal para sa account ng web-access, o di kaya ay maaaring gawing manu-mano ang paglikha ng account ng web access at ibigay lamang ang account na iyan (kung mayroong ito ng kinakailangang mga pahintulot upang malikha ang mga schema object) o magbigay ng dalawang magkaibang mga account, isang mayroong pribilehiyo ng paglikha at isang may pagbabawal para sa web access.\n\nAng script sa paglikha ng isang account na mayroon ng kinakailangang mga pribilehiyo ay matatagpuan sa loob ng directory na \"maintenance/oracle/\" ng pag-install na ito. Pakatandaan na ang paggamit ng isang account na may pagbabawal ay hindi magpapagana sa lahat ng mga kakayahang pampananatili kasama ang nakatakdang account.",
+       "config-db-install-account": "Account ng tagagamit para sa pagluluklok",
        "config-db-username": "Pangalang pangtagagamit ng kalipunan ng dato:",
        "config-db-password": "Password sa kalipunan ng dato:",
        "config-db-password-empty": "Paki magpasok ng isang hudyat para sa bagong tagagamit ng kalipunan ng dato: $1.\nHabang maging maaari na makalikha ng mga tagagamit na walang mga hudyat, hindi ito ligtas.",
-       "config-db-install-username": "Ipasok ang pangalan ng tagagamit na gagamitin upang kumabit sa kalipunan ng dato habang isinasagawa ang pagluluklok.\nHindi ito ang pangalan ng tagagamit ng akawnt ng MediaWiki; ito ang pangalan ng tagagamit para sa iyong kalipunan ng dato.",
-       "config-db-install-password": "Ipasok ang password na gagamitin upang maka-connect sa database habang isinasagawa ang pag-install.\nHindi ito ang password para sa akawnt ng MediaWiki; ito ang password para sa iyong database.",
+       "config-db-install-username": "Ipasok ang pangalan ng tagagamit na gagamitin upang kumabit sa database habang isinasagawa ang pag-install.\nHindi ito ang pangalan ng tagagamit ng account ng MediaWiki; ito ang pangalan ng tagagamit para sa iyong database.",
+       "config-db-install-password": "Ipasok ang password na gagamitin upang maka-connect sa database habang isinasagawa ang pag-install.\nHindi ito ang password para sa account ng MediaWiki; ito ang password para sa iyong database.",
        "config-db-install-help": "Ipasok ang pangalan ng tagagamit at hudyat na gagamitin upang umugnay sa kalipunan ng dato habang isinasagawa ang pagluluklok.",
        "config-db-account-lock": "Gamitin ang kaparehong pangalan at password habang nasa normal na operasyon",
-       "config-db-wiki-account": "Akawnt ng tagagamit para sa pangkaraniwang pagpapaandar",
-       "config-db-wiki-help": "Ipasok ang pangalan ng tagagamit at hudyat na gagamitin upang kumabit sa kalipunan ng dato habang nasa karaniwang pagtakbo ng wiki.\nKung hindi umiiral ang akawnt, at ang akawnt ng pagluluklok ay mayroong sapat na mga pribilehiyo, ang akawnt na ito ng tagagamit ay lilikhain na mayroong pinaka mababang mga pribilehiyo na kailangan upang mapatakbo ang wiki.",
+       "config-db-wiki-account": "Account ng tagagamit para sa pangkaraniwang pagpapaandar",
+       "config-db-wiki-help": "Ipasok ang pangalan ng tagagamit at password na gagamitin upang kumabit sa database habang nasa karaniwang pagtakbo ng wiki.\nKung hindi umiiral ang account, at ang pag-install ng account ay mayroong sapat na mga pribilehiyo, ang account na ito ng tagagamit ay lilikhain na mayroong pinaka mababang mga pribilehiyo na kailangan upang mapatakbo ang wiki.",
        "config-db-prefix": "Unlapi ng talahanayan ng kalipunan ng dato:",
        "config-db-prefix-help": "Kung kailangan mong ibahagi ang isang kalipunan ng dato sa pagitan ng maramihang mga wiki, o sa pagitan ng MediaWiki at ibang aplikasyon ng kasaputan, maaaring piliin mo na magdagdag ng isang unlapi sa lahat ng mga pangalan ng talahanayan upang maiwasan ang mga salungatan.\nHuwag gumamit ng mga patlang.\n\nAng hanay na ito ay karaniwang iniiwanang walang laman.",
        "config-db-charset": "Pangkat ng panitik ng kalipunan ng dato",
        "config-invalid-db-prefix": "Hindi tanggap na unlapi ng kalipunan ng dato na \"$1\".\nGamitin lamang ang mga titik na ASCII (a-z, A-Z), mga bilang (0-9), mga salungguhit (_) at mga gitling (-).",
        "config-connection-error": "$1.\n\nSuriin ang host, pangalan at password na nasa ibaba at subukan ulit.",
        "config-invalid-schema": "Hindi katanggap-tanggap na panukala para sa \"$1\" ng MediaWiki.\nGumamit lamang ng mga titik ng ASCII (a-z, A-Z), mga bilang (0-9), at mga salungguhit (_).",
-       "config-db-sys-create-oracle": "Ang panluklok ay tumatangkilik lamang sa paggamit ng isang akawnt ng SYSDBA para sa paglikha ng isang bagong akawnt.",
-       "config-db-sys-user-exists-oracle": "Umiiral na ang akawnt ng tagagamit na \"$1\". Magagamit lamang ang SYSDBA para sa paglikha ng isang bagong akawnt!",
+       "config-db-sys-create-oracle": "Ang installer ay sumusuporta lamang sa paggamit ng isang account ng SYSDBA para sa paglikha ng isang bagong account.",
+       "config-db-sys-user-exists-oracle": "Umiiral na ang account ng tagagamit na \"$1\". Magagamit lamang ang SYSDBA para sa paglikha ng isang bagong account!",
        "config-postgres-old": "Kailangan ang PostgreSQL $1 o mas bago, mayroon kang $2.",
        "config-sqlite-name-help": "Pumili ng isang pangalan na pangkilala na wiki mo.\nHuwag gumamit ng mga puwang o mga gitling.\nGagamitin ito para sa pangalan ng talaksan ng dato ng SQLite.",
        "config-sqlite-parent-unwritable-group": "Hindi malikha ang direktoryo ng dato na <code><nowiki>$1</nowiki></code>, sapagkat ang magulang na direktoryong <code><nowiki>$2</nowiki></code> ay hindi masulatan ng tagapaghain ng kasaputan.\n\nNapag-alaman ng tagapagluklok kung sinong tagagamit ang kinatatakbuhan ng iyong tagapaghain ng kasaputan.\nGawing nasusulatan nito ang <code><nowiki>$3</nowiki></code> ng direktoryo upang makapagpatuloy.\nIto ang gawin sa ibabaw ng isang sistema ng Unix/Linux:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
        "config-regenerate": "Muling likhain ang LocalSettings.php →",
        "config-show-table-status": "Nabigo ang pagtatanong na IPAKITA ANG KALAGAYAN NG TALAHANAYAN!",
        "config-unknown-collation": "'''Babala:''' Ang kalipunan ng dato ay gumagagamit ng hindi nakikilalang pag-iipon.",
-       "config-db-web-account": "Akawnt ng kalipunan ng dato para sa pagpunta sa web",
+       "config-db-web-account": "Account ng kalipunan ng dato para sa pagpunta sa web",
        "config-db-web-help": "Piliin ang pangalan ng tagagamit at hudyat na gagamitin ng tagapaghain ng web upang umugnay sa tagapaghain ng kalipunan ng dato, habang nasa pangkaraniwang pagtakbo ng wiki.",
-       "config-db-web-account-same": "Gamitin ang gayun din akawnt katulad ng sa pagluluklok",
-       "config-db-web-create": "Likhain ang akawnt kung hindi pa ito umiiral",
-       "config-db-web-no-create-privs": "Ang tinukoy mong akawnt na iluluklok ay walang sapat na mga pribilehiyo upang makalikha ng isang akawnt.\nAng akawnt na tutukuyin mo rito ay umiiral na dapat.",
+       "config-db-web-account-same": "Gamitin ang gayun din account katulad ng sa pag-install",
+       "config-db-web-create": "Likhain ang account kung hindi pa ito umiiral",
+       "config-db-web-no-create-privs": "Ang tinukoy mong account na iluluklok ay walang sapat na mga pribilehiyo upang makalikha ng isang account.\nAng account na tutukuyin mo rito ay umiiral na dapat.",
        "config-mysql-engine": "Makinang imbakan:",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
        "config-project-namespace-help": "Bilang pagsunod sa halimbawa ng Wikipedia, maraming mga wiki ang nagpapanatili ng kanilang mga pahina ng patakaran na nakahiwalay magmula sa kanilang mga pahina ng nilalaman, na nasa loob ng isang \"'''puwang na pampangalan ng proyekto'''\".\nAng lahat ng mga pamagat ng pahina na nasa loob ng puwang ng pangalang ito ay nagsisimula na mayroong isang partikular na unlapi, na maaari mong tukuyin dito.\nSa nakaugalian, ang unlaping ito ay hinango mula sa pangalan ng wiki, subalit hindi ito maaaring maglaman ng mga panitik ng palabantasan na katulad ng \"#\" o \":\".",
        "config-ns-invalid": "Ang tinukoy na puwang ng pangalan na \"<nowiki>$1</nowiki>\" ay hindi katanggap-tanggap.\nTumukoy ng isang ibang puwang ng pangalan ng proyekto.",
        "config-ns-conflict": "Ang tinukoy na puwang ng pangalan na \"<nowiki>$1</nowiki>\" ay sumasalungat sa isang likas na nakatakdang puwang ng pangalan ng MediaWiki.\nTumukoy ng isang ibang puwang ng pangalan ng proyekto.",
-       "config-admin-box": "Akawnt ng tagapangasiwa",
+       "config-admin-box": "Account ng tagapangasiwa",
        "config-admin-name": "Pangalan mo:",
        "config-admin-password": "Password:",
        "config-admin-password-confirm": "Password uli:",
        "config-admin-help": "Ipasok dito ang mas ninanais mong pangalan ng tagagamit, bilang halimbawa na ang \"Joe Bloggs\".\nIto ang pangalang gagamitin mo upang lumagdang papasok sa wiki.",
        "config-admin-name-blank": "Magpasok ng isang pangalan ng tagagamit na tagapangasiwa.",
        "config-admin-name-invalid": "Ang tinukoy na pangalan ng tagagamit na \"<nowiki>$1</nowiki>\" ay hindi tanggap.\nTumukoy ng ibang pangalan ng tagagamit.",
-       "config-admin-password-blank": "Magpasok ng isang password para sa akawnt ng tagapangasiwa.",
+       "config-admin-password-blank": "Magpasok ng isang password para sa account ng tagapangasiwa.",
        "config-admin-password-mismatch": "Hindi magkatugma ang ipinasok mong dalawang mga password.",
        "config-admin-email": "Tirahan ng e-liham:",
        "config-admin-email-help": "Magpasok dito ng isang tirahan ng e-liham upang mapahintulutan kang makatanggap ng e-liham mula sa iba pang mga tagagamit sa ibabaw ng wiki, itakdang muli ang hudyat mo, at mapabatiran ng mga pagbabago sa mga pahinang nasa ibabaw ng iyong tala ng mga binabantayan. Maiiwanan mo na walang laman ang hanay na ito.",
        "config-optional-skip": "Naiinip na ako, basta iluklok na lang ang wiki.",
        "config-profile": "Balangkas ng mga karapatan ng tagagamit:",
        "config-profile-wiki": "Tradisyonal na wiki",
-       "config-profile-no-anon": "Kailangan ang paglikha ng akawnt",
+       "config-profile-no-anon": "Kailangan ang paglikha ng account",
        "config-profile-fishbowl": "Pinahintulutang mga patnugot lamang",
        "config-profile-private": "Pribadong wiki",
-       "config-profile-help": "Pinaka mahusay ang pagtakbo ng mga Wiki kapag pinapahintulutan mo ang pinaka maraming mga tao na makapamatnugot ng mga ito hanggang sa maaari.\nSa loob ng MediaWiki, maginhawang masusuring muli ang kamakailang mga pagbabago, at mapanauli sa dati ang anumang nasira na nagawa ng isang walang muwang o may masamang hangarin na mga tagagamit.\n\nSubalit, marami ang nakatagpo na nagagamit ang MediaWiki sa loob ng malawak na sari-saring mga gampanin, at kung minsan ay hindi madaling makumbinsi ang lahat ng mga tao hinggil sa kapakinabangan ng kaparaanan ng wiki.\nKung kaya't nasa iyo ang pagpili.\n\nAng isang '''{{int:config-profile-wiki}}''' ay nagpapahintulot sa sinuman upang makapagbago, na hindi kailangan ang paglagdang papasok.\nAng isang wiki na mayroong '''{{int:config-profile-no-anon}}''' ay nagbibigay ng karagdagang pananagutan, subalit maaaring pumigil sa nagkataon lamang na mga tagapag-ambag.\n\nAng tagpo na '''{{int:config-profile-fishbowl}}''' ay nagpapahintulot lamang sa pinayagang mga tagagamit na makatingin ng mga pahina, na kapiling ang pangkat na pinayagang  makapamatnugot.\nAng isang '''{{int:config-profile-private}}''' ay nagpapahintulot lamang sa pinayagang mga tagagamit na makatingin ng mga pahina, na kapiling ang pangkat na pinayagang makapamatnugot.\n\nAng mas masasalimuot na mga kaayusan ng mga karapatan ng tagagamit ay makukuha pagkaraan ng pagluluklok, tingnan ang [//www.mediawiki.org/wiki/Manual:User_rights may kaugnayang kinamay na lahok].",
+       "config-profile-help": "Pinaka mahusay ang pagtakbo ng mga Wiki kapag pinapahintulutan mo ang pinaka maraming mga tao na makapamatnugot ng mga ito hanggang sa maaari.\nSa loob ng MediaWiki, maginhawang masusuring muli ang kamakailang mga pagbabago, at mapanauli sa dati ang anumang nasira na nagawa ng isang walang muwang o may masamang hangarin na mga tagagamit.\n\nSubalit, marami ang nakatagpo na nagagamit ang MediaWiki sa loob ng malawak na sari-saring mga gampanin, at kung minsan ay hindi madaling makumbinsi ang lahat ng mga tao hinggil sa kapakinabangan ng kaparaanan ng wiki.\nKung kaya't nasa iyo ang pagpili.\n\nAng isang '''{{int:config-profile-wiki}}''' ay nagpapahintulot sa sinuman upang makapagbago, na hindi kailangan ang paglagdang papasok.\nAng isang wiki na mayroong '''{{int:config-profile-no-anon}}''' ay nagbibigay ng karagdagang pananagutan, subalit maaaring pumigil sa nagkataon lamang na mga tagapag-ambag.\n\nAng tagpo na '''{{int:config-profile-fishbowl}}''' ay nagpapahintulot lamang sa pinayagang mga tagagamit na makatingin ng mga pahina, na kapiling ang pangkat na pinayagang  makapamatnugot.\nAng isang '''{{int:config-profile-private}}''' ay nagpapahintulot lamang sa pinayagang mga tagagamit na makatingin ng mga pahina, na kapiling ang pangkat na pinayagang makapamatnugot.\n\nAng mas masasalimuot na mga kaayusan ng mga karapatan ng tagagamit ay makukuha pagkaraan ng pagluluklok, tingnan ang [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights may kaugnayang kinamay na lahok].",
        "config-license": "Karapatang-ari at lisensiya:",
        "config-license-none": "Walang talababa ng lisensiya",
        "config-license-cc-by-sa": "Malikhaing Pangkaraniwang Pagtukoy Pamamahaging Magkatulad",
        "config-email-sender-help": "Ipasok ang tirahan ng e-liham na gagamitin bilang tirahang pagsasaulian ng e-liham na papalabas.\nDito ang kung saan ipapadala ang mga pagtalbog.\nMaraming mga tagapaghain ng liham ang nangangailangan ng kahit na bahagi lamang ng pangalan ng nasasakupan upang maging katanggap-tanggap.",
        "config-upload-settings": "Mga pagkakarga ng mga larawan at talaksan",
        "config-upload-enable": "Paganahin ang pagkakarga ng talaksan",
-       "config-upload-help": "Ang paitaas na mga pagkakarga ng mga talaksan ay maaaring makapaglantad ng iyong tagapaghain sa mga panganib na pangkatiwasayan.\nPara sa mas marami pang kabatiran, basahin ang [//www.mediawiki.org/wiki/Manual:Security seksiyon ng katiwasayan] sa loob ng gabay.\n\nUpang mapagana ang paitaas na mga pagkakarga ng talaksan, baguhin ang gawi roon sa subdirektoryo ng <code>mga imahe</code> sa ilalim ng ugat na direktoryo ng MediaWiki upang ang tagapaghain ng kasaputan ay makapagsulat dito.\nPagkaraan ay paganahin ang pipiliing ito.",
+       "config-upload-help": "Ang paitaas na mga pagkakarga ng mga talaksan ay maaaring makapaglantad ng iyong tagapaghain sa mga panganib na pangkatiwasayan.\nPara sa mas marami pang kabatiran, basahin ang [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security seksiyon ng katiwasayan] sa loob ng gabay.\n\nUpang mapagana ang paitaas na mga pagkakarga ng talaksan, baguhin ang gawi roon sa subdirektoryo ng <code>mga imahe</code> sa ilalim ng ugat na direktoryo ng MediaWiki upang ang tagapaghain ng kasaputan ay makapagsulat dito.\nPagkaraan ay paganahin ang pipiliing ito.",
        "config-upload-deleted": "Direktoryo para sa binurang mga talaksan:",
        "config-upload-deleted-help": "Pumili ng isang direktoryong pagsusupnayan ng naburang mga talaksan.\nIdeyal na dapat itong  hindi mapupuntahan mula sa web.",
        "config-logo": "URL ng logo:",
        "config-logo-help": "Ang likas na nakatakdang pabalat ng MediaWiki ay nagsasama ng puwang para sa isang logong 135x160 ang piksel na nasa itaas ng menu ng panggilid na bareta.\nMagkargang papaitaas ng isang imahe na mayroong naaangkop na sukat, at ipasok dito ang URL.\n\nKung ayaw mo ng isang logo, iwanang walang laman ang kahong ito.",
        "config-instantcommons": "Paganahin ang Mga Pangkaraniwang Biglaan",
-       "config-instantcommons-help": "Ang [//www.mediawiki.org/wiki/InstantCommons Instant Commons] ay isang tampok na nagpapahintulot sa mga wiki upang gumamit ng mga imahe, mga tunog at iba pang mga midyang matatagpuan sa pook ng [//commons.wikimedia.org/ Wikimedia Commons].\nUpang magawa ito, nangangailangan ang MediaWiki ng pagka nakakapunta sa Internet.\n\nPara sa mas marami pang kabatiran hinggil sa tampok na ito, kabilang na ang mga tagubilin sa kung paano ito itakda para sa mga wiki na bukod pa kaysa sa Wikimedia Commons, sumangguni sa [//mediawiki.org/wiki/Manual:$wgForeignFileRepos gabay].",
+       "config-instantcommons-help": "Ang [//www.mediawiki.org/wiki/InstantCommons Instant Commons] ay isang tampok na nagpapahintulot sa mga wiki upang gumamit ng mga imahe, mga tunog at iba pang mga midyang matatagpuan sa pook ng [//commons.wikimedia.org/ Wikimedia Commons].\nUpang magawa ito, nangangailangan ang MediaWiki ng pagka nakakapunta sa Internet.\n\nPara sa mas marami pang kabatiran hinggil sa tampok na ito, kabilang na ang mga tagubilin sa kung paano ito itakda para sa mga wiki na bukod pa kaysa sa Wikimedia Commons, sumangguni sa [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos gabay].",
        "config-cc-error": "Hindi nagbigay ng resulta ang pampili ng lisensiya ng Malikhaing Pangkaraniwan.\nIpasok na kinakamay ang pangalan ng lisensiya.",
        "config-cc-again": "Pumili uli...",
        "config-cc-not-chosen": "Piliin kung anong lisensiya ng Malikhaing mga Pangkaraniwan ang nais mo at pindutin ang \"magpatuloy\".",
        "config-install-pg-commit": "Isinasagawa ang mga pagbabago",
        "config-install-pg-plpgsql": "Sumusuri ng wikang PL/pgSQL",
        "config-pg-no-plpgsql": "Kailangan mong magtalaga ng wikang PL/pgSQL sa loob ng kalipunan ng datong $1",
-       "config-pg-no-create-privs": "Ang tinukoy mong akawnt para sa pagtatalaga ay walang sapat na mga pribilehiyo upang makalikha ng isang akawnt.",
-       "config-pg-not-in-role": "Umiiral na ang akawnt na tinukoy mo para sa tagagamit ng sangkasaputan.\nAng tinukoy mong akawnt para sa pagluluklok ay hindi isang tagagamit na super at hindi isang kasapi sa gampanin ng tagagamit ng sangkasaputan, kung kaya't hindi nito nagawang makalikha ng mga bagay na pag-aari ng tagagamit ng sangkasaputan.\n\nSa kasalukuyan, nangangailangan ang MediaWiki na ang mga talahanayan ay maging pag-aari ng tagagamit ng sangkasaputan. Paki tumukoy ng isa pang pangalan ng akawnt na pangsangkasaputan, o pindutin ang \"bumalik\" at tumukoy ng isang tagagamit na may kaangkupang pribilehiyo ng pagluluklok.",
+       "config-pg-no-create-privs": "Ang tinukoy mong accountpara sa pagtatalaga ay walang sapat na mga pribilehiyo upang makalikha ng isang account.",
+       "config-pg-not-in-role": "Umiiral na ang account na tinukoy mo para sa tagagamit ng web.\nAng tinukoy mong account para sa pag-install ay hindi isang tagagamit na super at hindi isang kasapi sa gampanin ng tagagamit ng web, kung kaya't hindi nito nagawang makalikha ng mga bagay na pag-aari ng tagagamit ng web.\n\nSa kasalukuyan, nangangailangan ang MediaWiki na ang mga table ay maging pag-aari ng tagagamit ng web. Pakitukoy ng isa pang pangalan ng account na web, o pindutin ang \"bumalik\" at tumukoy ng isang tagagamit na may kaangkupang pribilehiyo ng pag-install.",
        "config-install-user": "Nililikha ang tagagamit ng kalipunan ng dato",
        "config-install-user-alreadyexists": "Umiiral na ang tagagamit na \"$1\"",
        "config-install-user-create-failed": "Nabigo ang paglikha ng tagagamit na \"$1\": $2",
        "config-install-user-grant-failed": "Nabigo ang pagbibigay ng pahintulot sa tagagamit na \"$1\": $2",
        "config-install-user-missing": "Hindi umiiral ang tinukoy na tagagamit na si \"$1\".",
-       "config-install-user-missing-create": "Hindi umiiral ang tinukoy na tagagamit na si \"$1\".\nPaki lagitikin ang nasa ibabang kahong natsetsekan na \"likhain ang akawnt\" kung nais mong likhain ito.",
+       "config-install-user-missing-create": "Hindi umiiral ang tinukoy na tagagamit na si \"$1\".\nPaki-klik ang nasa ibabang kahong natsetsekan na \"likhain ang account\" kung nais mong likhain ito.",
        "config-install-tables": "Nililikha ang mga talahanayan",
        "config-install-tables-exist": "'''Babala''': Tila umiiral na ang mga talahanayan ng MediaWiki.\nNilalaktawan ang paglikha.",
        "config-install-tables-failed": "'''Kamalian''': Nabigo ang paglikha ng talahanayan na may sumusunod na kamalian: $1",
        "config-install-stats": "Sinisimulan ang estadistika",
        "config-install-keys": "Ginagawa ang lihim na mga susi",
        "config-insecure-keys": "'''Babala:''' Nalikha ang {{PLURAL:$2|A secure key|ligtas na mga susi}} ($1) habang ang pagluluklok {{PLURAL:$2|ay|ay}} hindi pa lubos na ligtas. Isaalang-alang ang kinakamay na pagbago {{PLURAL:$2|nito|ng mga ito}}.",
-       "config-install-sysop": "Nililikha ang akawnt ng tagagamit na tagapangasiwa",
+       "config-install-sysop": "Nililikha ang account ng tagagamit na tagapangasiwa",
        "config-install-subscribe-fail": "Hindi nagawang magpasipi mula sa mediawiki-announce: $1",
-       "config-install-subscribe-notpossible": "Hindi nakalagak ang cURL at hindi makukuha ang allow_url_fopen",
+       "config-install-subscribe-notpossible": "Hindi nakalagak ang cURL at hindi makukuha ang <code>allow_url_fopen</code>",
        "config-install-mainpage": "Nililikha ang pangunahing pahina na may likas na nakatakdang nilalaman",
        "config-install-extension-tables": "Nililikha ang mga talahanayan para sa pinagaganang mga dugtong",
        "config-install-mainpage-failed": "Hindi maisingit ang pangunahing pahina: $1",
        "config-help": "saklolo",
        "config-nofile": "Hindi matagpuan ang talaksang \"$1\". Binura na ba ito?",
        "mainpagetext": "'''Matagumpay na ininstala ang MediaWiki.'''",
-       "mainpagedocfooter": "Silipin ang [//meta.wikimedia.org/wiki/Help:Contents Patnubay sa Tagagamit] (''\"User's Guide\"'') para sa kaalaman sa paggamit ng wiking ''software''.\n\n== Pagsisimula ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Tala ng mga nakatakdang kumpigurasyon]\n* [//www.mediawiki.org/wiki/Manual:FAQ Mga malimit itanong sa MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Tala ng mga pinadadalhan ng liham ng MediaWiki]"
+       "mainpagedocfooter": "Silipin ang [//meta.wikimedia.org/wiki/Help:Contents Patnubay sa Tagagamit] (''\"User's Guide\"'') para sa kaalaman sa paggamit ng wiking ''software''.\n\n== Pagsisimula ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Tala ng mga nakatakdang kumpigurasyon]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Mga malimit itanong sa MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Tala ng mga pinadadalhan ng liham ng MediaWiki]"
 }
index 69db215..d4f7e18 100644 (file)
        "config-install-interwiki-exists": "''' Uyarı:'' ' interwiki Tablo girdileri zaten görünüyor.\nVarsayılan liste atlanıyor.",
        "config-install-stats": "İstatistik başlatılıyor",
        "config-install-keys": "Gizli anahtar oluşturma",
-       "config-install-subscribe-notpossible": "cURL yüklü değil ve allow_url_fopen kullanılamaz.",
+       "config-install-subscribe-notpossible": "cURL yüklü değil ve <code>allow_url_fopen</code> kullanılamaz.",
        "config-install-mainpage": "Varsayılan içerik ile ana sayfa oluşturma",
        "config-install-extension-tables": "Uzantılar için etkinleştirilmiş tablolar oluşturma",
        "config-install-mainpage-failed": "Ana sayfa eklenemedi:$1",
        "config-download-localsettings": "İndir <code>LocalSettings.php</code>",
        "config-help": "Yardım",
        "config-nofile": "\"$1\" dosyası bulunamadı. Silindi mi?",
-       "config-extension-link": "Vikinizin [//www.mediawiki.org/wiki/Manual:Extensions eklentileri] desteklediğini biliyor musunuz?\n\n[//www.mediawiki.org/wiki/Category:Extensions_by_category Eklentileri kategorilerine göre] inceleyebilir ya da tüm eklentilerin listesini görmek için [//www.mediawiki.org/wiki/Extension_Matrix Eklenti Matrisine] bakabilirsiniz.",
+       "config-extension-link": "Vikinizin [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions eklentileri] desteklediğini biliyor musunuz?\n\n[//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category Eklentileri kategorilerine göre] inceleyebilir ya da tüm eklentilerin listesini görmek için [//www.mediawiki.org/wiki/Extension_Matrix Eklenti Matrisine] bakabilirsiniz.",
        "mainpagetext": "'''MediaWiki başarı ile kuruldu.'''",
-       "mainpagedocfooter": "Viki yazılımının kullanımı hakkında bilgi almak için [//meta.wikimedia.org/wiki/Help:Contents kullanıcı rehberine] bakınız.\n\n== Yeni Başlayanlar ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Yapılandırma ayarlarının listesi]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki SSS]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-posta listesi]"
+       "mainpagedocfooter": "Viki yazılımının kullanımı hakkında bilgi almak için [//meta.wikimedia.org/wiki/Help:Contents kullanıcı rehberine] bakınız.\n\n== Yeni Başlayanlar ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Yapılandırma ayarlarının listesi]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki SSS]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-posta listesi]"
 }
index ab48b96..16f2e54 100644 (file)
@@ -1,9 +1,10 @@
 {
        "@metadata": {
                "authors": [
-                       "KhayR"
+                       "KhayR",
+                       "Seb35"
                ]
        },
        "mainpagetext": "«MediaWiki» уңышлы куелды.",
-       "mainpagedocfooter": "Бу вики турында мәгълүматны [//meta.wikimedia.org/wiki/Ярдәм:Эчтәлек биредә] табып була.\n\n== Кайбер файдалы ресурслар ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Көйләнмәләр исемлеге (инг.)];\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki турында еш бирелгән сораулар һәм җаваплар (инг.)];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki'ның яңа версияләре турында хәбәрләр яздырып алу]."
+       "mainpagedocfooter": "Бу вики турында мәгълүматны [//meta.wikimedia.org/wiki/Help:Contents биредә] табып була.\n\n== Кайбер файдалы ресурслар ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Көйләнмәләр исемлеге (инг.)];\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki турында еш бирелгән сораулар һәм җаваплар (инг.)];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki'ның яңа версияләре турында хәбәрләр яздырып алу];\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]."
 }
index aba5c38..b0ee3d4 100644 (file)
@@ -1,9 +1,10 @@
 {
        "@metadata": {
                "authors": [
-                       "Don Alessandro"
+                       "Don Alessandro",
+                       "Seb35"
                ]
        },
        "mainpagetext": "«MediaWiki» uñışlı quyıldı.",
-       "mainpagedocfooter": "Bu wiki turında mäğlümatnı [//meta.wikimedia.org/wiki/Yärdäm:Eçtälek biredä] tabıp bula.\n\n== Qayber faydalı resurslar ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Köylänmälär isemlege (ing.)];\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki turında yış birelgän sorawlar häm cawaplar (ing.)];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki'nıñ yaña versiäläre turında xäbärlär yazdırıp alu]."
+       "mainpagedocfooter": "Bu wiki turında mäğlümatnı [//meta.wikimedia.org/wiki/Help:Contents biredä] tabıp bula.\n\n== Qayber faydalı resurslar ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Köylänmälär isemlege (ing.)];\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki turında yış birelgän sorawlar häm cawaplar (ing.)];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki'nıñ yaña versiäläre turında xäbärlär yazdırıp alu];\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]."
 }
index 7eb34ac..b8d708f 100644 (file)
@@ -5,5 +5,5 @@
                ]
        },
        "mainpagetext": "'''MediaWiki مۇۋەپپەقىيەتلىك قاچىلاندى.'''",
-       "mainpagedocfooter": "[//meta.wikimedia.org/wiki/Help:Contents ئىشلەتكۈچى قوللانمىسى] نى زىيارەت قىلىپ wiki يۇمشاق دېتالىنى ئىشلىتىش ئۇچۇرىغا ئېرىشىڭ.\n\n== دەسلەپكى ساۋات ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings سەپلىمە تەڭشەك تىزىملىكى]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki كۆپ ئۇچرايدىغان مەسىلىلەرگە جاۋاب]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki تارقاتقان ئېلخەت تىزىملىكى]"
+       "mainpagedocfooter": "[//meta.wikimedia.org/wiki/Help:Contents ئىشلەتكۈچى قوللانمىسى] نى زىيارەت قىلىپ wiki يۇمشاق دېتالىنى ئىشلىتىش ئۇچۇرىغا ئېرىشىڭ.\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 b2771dd..2065352 100644 (file)
        "config-restart": "Так, перезапустити установку",
        "config-welcome": "=== Перевірка оточення ===\nБудуть проведені базові перевірки, щоб виявити, чи можлива установка MediaWiki у даній системі.\nНе забудьте включити цю інформацію, якщо ви звернетеся по підтримку, як завершити установку.",
        "config-copyright": "=== Авторське право і умови ===\n\n$1\n\nЦя програма є вільним програмним забезпеченням; Ви можете розповсюджувати та/або змінювати її під ліцензією GNU General Public License, опублікованою Фондом вільного програмного забезпечення; версією 2 цієї ліцензії або будь-якою пізнішою на Ваш вибір.\n\nЦя програма поширюється з надією на те, що вона буде корисною, однак '''без жодних гарантій'''; навіть без неявної гарантії '''комерційної цінності''' або '''придатності для певних цілей'''.\nДив. GNU General Public License для детальної інформації.\n\nВи повинні були отримати <doclink href=Copying>копію GNU General Public License</doclink> разом із цією програмою; якщо ж ні, зверніться до Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. або [http://www.gnu.org/copyleft/gpl.html ознайомтесь з нею онлайн].",
-       "config-sidebar": "* [//www.mediawiki.org Сайт MediaWiki]\n* [//www.mediawiki.org/wiki/Help:Contents Посібник користувача]\n* [//www.mediawiki.org/wiki/Manual:Contents Посібник адміністратора]\n* [//www.mediawiki.org/wiki/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>Read me</doclink>\n* <doclink href=ReleaseNotes>Інформація про випуск</doclink>\n* <doclink href=Copying>Ліцензія</doclink>\n* <doclink href=UpgradeDoc>Оновлення</doclink>",
+       "config-sidebar": "* [//www.mediawiki.org Сайт MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Посібник користувача]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Посібник адміністратора]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>Read me</doclink>\n* <doclink href=ReleaseNotes>Інформація про випуск</doclink>\n* <doclink href=Copying>Ліцензія</doclink>\n* <doclink href=UpgradeDoc>Оновлення</doclink>",
        "config-env-good": "Перевірку середовища успішно завершено.\nВи можете встановити MediaWiki.",
        "config-env-bad": "Було проведено перевірку середовища. Ви не можете встановити MediaWiki.",
        "config-env-php": "Встановлено версію PHP: $1.",
        "config-env-php-toolow": "Встановлено PHP $1.\nНатомість MediaWiki вимагає PHP $2 і вище.",
        "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/Unicode_normalization_considerations нормалізацію Юнікоду].",
-       "config-unicode-update-warning": "'''Увага''': Встановлена версія обгортки нормалізації Юнікоду використовує стару версію бібліотеки [http://site.icu-project.org/ проекту ICU].\nВи маєте [//www.mediawiki.org/wiki/Unicode_normalization_considerations оновити версію], якщо плануєте повноцінно використовувати Юнікод.",
+       "config-unicode-pure-php-warning": "'''Увага''': [http://pecl.php.net/intl міжнародне розширення PECL] не може провести нормалізацію Юнікоду.\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-no-db": "Не вдалося знайти відповідний драйвер бази даних! Вам необхідно встановити драйвер бази даних для PHP. Підтримуються такі типи баз даних: $1.\n\nЯкщо ви скомпілювали PHP самостійно, переналаштуйте його з включенням клієнта бази даних, наприклад за допомогою <code>./configure --with-mysqli</code>.\n\nЯкщо установлено PHP з пакетів Debian або Ubuntu, тоді ви також повинні встановити, наприклад, пакунок <code>php5-mysql</code>.",
        "config-outdated-sqlite": "'''Увага''': у Вас встановлена версія SQLite $1, а це нижче, ніж мінімально необхідна версія $2. SQLite буде недоступним.",
        "config-no-fts3": "'''Увага''': SQLite зібраний без [//sqlite.org/fts3.html модуля FTS3], функції пошуку не будуть працювати у цій системі.",
@@ -90,7 +90,7 @@
        "config-no-cli-uri": "'''Увага''': Не задано параметр <code>--scriptpath</code>, використовується за замовчуванням: <code>$1</code>.",
        "config-using-server": "Використовується ім'я сервера \"<nowiki>$1</nowiki>\".",
        "config-using-uri": "Використовується URL сервера \"<nowiki>$1$2</nowiki>\".",
-       "config-uploads-not-safe": "'''Увага:''' Ваша типова папка для завантажень <code>$1</code> вразлива до виконання довільних скриптів.\nХоча MediaWiki перевіряє усі завантажені файли на наявність загроз, наполегливо рекомендується [//www.mediawiki.org/wiki/Manual:Security#Upload_security закрити дану вразливість] перед тим, як дозволяти завантаження файлів.",
+       "config-uploads-not-safe": "'''Увага:''' Ваша типова папка для завантажень <code>$1</code> вразлива до виконання довільних скриптів.\nХоча MediaWiki перевіряє усі завантажені файли на наявність загроз, наполегливо рекомендується [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security закрити дану вразливість] перед тим, як дозволяти завантаження файлів.",
        "config-no-cli-uploads-check": "'''Увага:''' Ваша типова папка для завантажень (<code>$1</code>) не перевірялась на вразливість до виконання довільних скриптів під час встановлення CLI.",
        "config-brokenlibxml": "У Вашій системі невдале поєднання версій PHP і libxml2, яке може спричинити пошкодження прихованих даних у MediaWiki та інших веб-застосунках.\nОновіть libxml2 до версії 2.7.3 або пізнішої  ([https://bugs.php.net/bug.php?id=45996 відомості про помилку]).\nВстановлення перервано.",
        "config-suhosin-max-value-length": "Suhosin встановлено і обмежує параметра GET  <code>length</code> до $1 байта. Компонент MediaWiki ResourceLoader буде обходити це обмеження, однак це зменшить продуктивність. Якщо це можливо, Вам варто встановити значення <code>suhosin.get.max_value_length</code> як 1024 і більше у <code>php.ini</code> і встановити таке ж значення <code>$wgResourceLoaderMaxQueryLength</code> у LocalSettings.php .",
        "config-profile-no-anon": "Необхідно створити обліковий запис",
        "config-profile-fishbowl": "Тільки для авторизованих редакторів",
        "config-profile-private": "Приватна вікі",
-       "config-profile-help": "Вікі краще працюють, коли Ви дозволяєте їх редагувати якомога ширшому колу людей.\nУ MediaWiki легко переглядати останні зміни і відкочувати будь-яку шкоду, спричинену недосвідченими або зловмисними користувачами.\n\nОдначе, MediaWiki може бути корисна по-різному, й інколи важко переконати у вигідності відкритої вікі-роботи.\nТож у Вас є вибір.\n\nМодель '''{{int:config-profile-wiki}}''' дозволяє редагувати будь-кому, навіть без входження в систему.\nВікі з вимогою \"'''{{int:config-profile-no-anon}}'''\" дає певний облік, але може відвернути випадкових дописувачів.\nСпосіб \"'''{{int:config-profile-fishbowl}}'''\" дозволяє редагувати підтвердженим користувачам, а переглядати сторінки і історію можуть усі.\n'''{{int:config-profile-private}}''' дозволяє переглядати сторінки і редагувати лише підтвердженим користувачам.\n\nДетальніші конфігурації прав користувачів доступні після встановлення, див. [//www.mediawiki.org/wiki/Manual:User_rights відповідний розділ посібника].",
+       "config-profile-help": "Вікі краще працюють, коли Ви дозволяєте їх редагувати якомога ширшому колу людей.\nУ MediaWiki легко переглядати останні зміни і відкочувати будь-яку шкоду, спричинену недосвідченими або зловмисними користувачами.\n\nОдначе, MediaWiki може бути корисна по-різному, й інколи важко переконати у вигідності відкритої вікі-роботи.\nТож у Вас є вибір.\n\nМодель '''{{int:config-profile-wiki}}''' дозволяє редагувати будь-кому, навіть без входження в систему.\nВікі з вимогою \"'''{{int:config-profile-no-anon}}'''\" дає певний облік, але може відвернути випадкових дописувачів.\nСпосіб \"'''{{int:config-profile-fishbowl}}'''\" дозволяє редагувати підтвердженим користувачам, а переглядати сторінки і історію можуть усі.\n'''{{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": "Creative Commons Attribution Share Alike",
        "config-email-sender-help": "Введіть адресу електронної пошти, що буде використовуватись як зворотна адреса для вихідної пошти.\nНа неї будуть надсилатись відмови.\nЧимало поштових серверів вимагають, щоб принаймні доменне ім'я було допустимим.",
        "config-upload-settings": "Завантаження зображень і файлів",
        "config-upload-enable": "Дозволити завантаження файлів",
-       "config-upload-help": "Завантаження файлів підставляє Ваш сервер під потенційні загрози.\nДетальнішу інформацію можна почитати у посібнику, [//www.mediawiki.org/wiki/Manual:Security розділ про безпеку].\n\nЩоб дозволити завантаження файлів, змініть режим підпапки <code>images</code> у кореневій папці MediaWiki так, щоб сервер міг у неї записувати.\nПотім увімкніть цю опцію.",
+       "config-upload-help": "Завантаження файлів підставляє Ваш сервер під потенційні загрози.\nДетальнішу інформацію можна почитати у посібнику, [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security розділ про безпеку].\n\nЩоб дозволити завантаження файлів, змініть режим підпапки <code>images</code> у кореневій папці MediaWiki так, щоб сервер міг у неї записувати.\nПотім увімкніть цю опцію.",
        "config-upload-deleted": "Каталог для вилучених файлів:",
        "config-upload-deleted-help": "Оберіть папку для архівації видалених файлів.\nВ ідеалі, вона не має бути доступною через інтернет.",
        "config-logo": "URL логотипу:",
        "config-logo-help": "Стандартна схема оформлення MediaWiki містить вільне для логотипу місце над бічною панеллю розміром 135x160 пікселів.\n\nЗавантажте зображення відповідного розміру і введіть тут його URL.\n\nВи можете використати <code>$wgStylePath</code> або <code>$wgScriptPath</code>, якщо ваш логотип пов'язаний з цими шляхами.\n\nЯкщо Вам не потрібен логотип, залиште це поле пустим.",
        "config-instantcommons": "Увімкнути Instant Commons",
-       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] це функція, що дозволяє вікі використовувати зображення, звуки та інші медіа, розміщені на [//commons.wikimedia.org/ Вікісховищі].\nДля цього MediaWiki необхідний доступ до інтернету.\n\nДодаткову інформацію стосовно цієї функції, включаючи інструкції, як її увімкнути у вікі, відмінних від Вікісховища, дивіться у [//mediawiki.org/wiki/Manual:$wgForeignFileRepos посібнику].",
+       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] це функція, що дозволяє вікі використовувати зображення, звуки та інші медіа, розміщені на [//commons.wikimedia.org/ Вікісховищі].\nДля цього MediaWiki необхідний доступ до інтернету.\n\nДодаткову інформацію стосовно цієї функції, включаючи інструкції, як її увімкнути у вікі, відмінних від Вікісховища, дивіться у [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos посібнику].",
        "config-cc-error": "Механізм вибору ліцензії Creative Commons не дав результатів.\nВведіть назву ліцензії вручну.",
        "config-cc-again": "Виберіть знову ...",
        "config-cc-not-chosen": "Оберіть, яку ліцензію Creative Commons Ви хочете використовувати, і натисніть \"продовжити\".",
        "config-insecure-keys": "'''Увага:''' {{PLURAL:$2|1=Секретний ключ|Секретні ключі}} ($1), {{PLURAL:$2|1=згенерований в процесі встановлення, недостатньо надійний|згенеровані в процесі встановлення, недостатньо надійні}}. Розгляньте можливість {{PLURAL:$2|1=його|їх}} заміни вручну.",
        "config-install-sysop": "Створення облікового запису адміністратора",
        "config-install-subscribe-fail": "Не можливо підписатись на mediawiki-announce: $1",
-       "config-install-subscribe-notpossible": "cURL не встановлено і опція allow_url_fopen не доступна.",
+       "config-install-subscribe-notpossible": "cURL не встановлено і опція <code>allow_url_fopen</code> не доступна.",
        "config-install-mainpage": "Створення головної сторінки із вмістом за замовчуванням",
        "config-install-extension-tables": "Створення таблиць для увімкнених розширень",
        "config-install-mainpage-failed": "Не вдається вставити головну сторінку: $1",
        "config-install-done": "'''Вітаємо!'''\nВи успішно встановили MediaWiki.\n\nІнсталятор згенерував файл <code>LocalSettings.php</code>, який містить усі Ваші налаштування.\n\nВам необхідно завантажити його і помістити у кореневу папку Вашої вікі (туди ж, де index.php). Завантаження мало початись автоматично.\n\nЯкщо завантаження не почалось або Ви його скасували, можете заново його почати, натиснувши на посилання внизу:\n\n$3\n\n'''Примітка''': Якщо Ви не зробите цього зараз, цей файл не буде доступним пізніше, коли Ви вийдете з встановлення, не скачавши його.\n\nПісля виконання дій, описаних вище, Ви зможете '''[$2 увійти у свою вікі]'''.",
        "config-download-localsettings": "Завантажити <code>LocalSettings.php</code>",
        "config-help": "допомога",
+       "config-help-tooltip": "натисніть, щоб розгорнути",
        "config-nofile": "Файл \"$1\" не знайдено. Його видалено?",
-       "config-extension-link": "Чи знаєте ви, що ваше вікі підтримує [//www.mediawiki.org/wiki/Manual:Extensions розширення]?\n\nВи можете переглядати [//www.mediawiki.org/wiki/Category:Extensions_by_category розширення по категорії] або в [//www.mediawiki.org/wiki/Extension_Matrix матрицю розширень] щоб побачити повний список розширень.",
+       "config-extension-link": "Чи знаєте ви, що ваше вікі підтримує [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions розширення]?\n\nВи можете переглядати [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category розширення по категорії] або в [//www.mediawiki.org/wiki/Extension_Matrix матрицю розширень] щоб побачити повний список розширень.",
        "mainpagetext": "Програмне забезпечення «MediaWiki» успішно встановлене.",
-       "mainpagedocfooter": "Інформацію про роботу з цією вікі можна знайти в [//meta.wikimedia.org/wiki/Help:Contents посібнику користувача].\n\n== Деякі корисні ресурси ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Список налаштувань];\n* [//www.mediawiki.org/wiki/Manual:FAQ Часті питання з приводу MediaWiki];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Розсилка повідомлень про появу нових версій MediaWiki];\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Локалізуйте MediaWiki своєю мовою]"
+       "mainpagedocfooter": "Інформацію про роботу з цією вікі можна знайти в [//meta.wikimedia.org/wiki/Help:Contents посібнику користувача].\n\n== Деякі корисні ресурси ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Список налаштувань];\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Часті питання з приводу MediaWiki];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Розсилка повідомлень про появу нових версій MediaWiki];\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Локалізуйте MediaWiki своєю мовою]"
 }
index 496f032..d040fde 100644 (file)
@@ -6,5 +6,5 @@
        },
        "config-admin-password-blank": "Administrator hisob yozuvi uchun maxfiy soʻz kiriting.",
        "mainpagetext": "'''MediaWiki muvaffaqiyatli o'rnatildi.'''",
-       "mainpagedocfooter": "Wiki dasturini ishlatish haqida ma'lumot olish uchun  [//meta.wikimedia.org/wiki/Help:Contents Foydalanuvchi qo'llanmasi] sahifasiga murojaat qiling.\n\n== Dastlabki qadamlar ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Moslamalar ro'yxati]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki haqida ko'p so'raladigan savollar]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki yangi versiyasi chiqqanda xabar berish ro'yxati]"
+       "mainpagedocfooter": "Wiki dasturini ishlatish haqida ma'lumot olish uchun  [//meta.wikimedia.org/wiki/Help:Contents Foydalanuvchi qo'llanmasi] sahifasiga murojaat qiling.\n\n== Dastlabki qadamlar ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Moslamalar ro'yxati]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki haqida ko'p so'raladigan savollar]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki yangi versiyasi chiqqanda xabar berish ro'yxati]"
 }
index 237ebd3..dd65180 100644 (file)
@@ -1,9 +1,10 @@
 {
        "@metadata": {
                "authors": [
-                       "Vajotwo"
+                       "Vajotwo",
+                       "Seb35"
                ]
        },
        "mainpagetext": "'''Instałasion de MediaWiki conpletà coretamente.'''",
-       "mainpagedocfooter": "Varda ła [//meta.wikimedia.org/wiki/Aiuto:Sommario Guida utente] par majori informasion so l'uso de sto software wiki.\n\n== Par scumisiar ==\n\nI seguenti cołegamenti i xé en łengua inglese:\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Inpostasion de configurasion]\n* [//www.mediawiki.org/wiki/Manual:FAQ Domande frequenti so MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list anunsi MediaWiki]"
+       "mainpagedocfooter": "Varda ła [//meta.wikimedia.org/wiki/Help:Contents Guida utente] par majori informasion so l'uso de sto software wiki.\n\n== Par scumisiar ==\n\nI seguenti cołegamenti i xé en łengua inglese:\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Inpostasion de configurasion]\n* [//www.mediawiki.org/wiki/Manual:FAQ/it Domande frequenti so MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list anunsi MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]"
 }
index fe57803..78c3b7b 100644 (file)
@@ -1,9 +1,10 @@
 {
        "@metadata": {
                "authors": [
-                       "Игорь Бродский"
+                       "Игорь Бродский",
+                       "Seb35"
                ]
        },
        "mainpagetext": "'''MediaWiki-likutim om seižutadud jügedusita.'''",
-       "mainpagedocfooter": "Kc. [//meta.wikimedia.org/wiki/Help:Kävutajan abukirj], miše sada informacijad wikin kävutamižes.\n\n== Erased tarbhaižed resursad ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Järgendusiden nimikirjutez]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce počtnimikirjutez]"
+       "mainpagedocfooter": "Kc. [//meta.wikimedia.org/wiki/Help:Contents Kävutajan kirj], miše sada informacijad wikin kävutamižes.\n\n== Erased tarbhaižed resursad ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Järgendusiden nimikirjutez]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce počtnimikirjutez]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]"
 }
index 009ab9e..1f3f89e 100644 (file)
@@ -57,6 +57,7 @@
        "config-db-install-account": "Tài khoản người dùng để cài đặt",
        "config-db-username": "Tên người dùng cơ sở dữ liệu:",
        "config-db-password": "Mật khẩu cơ sở dữ liệu:",
+       "config-db-username-empty": "Bạn phải nhập một giá trị cho “{{int:config-db-username}}”",
        "config-db-wiki-account": "Tài khoản người dùng để hoạt động bình thường",
        "config-db-prefix": "Tiền tố bảng cơ sở dữ liệu:",
        "config-db-charset": "Bảng mã cơ sở dữ liệu",
        "config-header-oracle": "Thiết lập Oracle",
        "config-header-mssql": "Thiết lập Microsoft SQL Server",
        "config-invalid-db-type": "Loại cơ sở dữ liệu không hợp lệ",
-       "config-missing-db-name": "Bạn phải nhập một giá trị cho “Tên cơ sở dữ liệu”",
-       "config-missing-db-host": "Bạn phải nhập một giá trị cho “Máy chủ cơ sở dữ liệu”",
-       "config-missing-db-server-oracle": "Bạn phải nhập một giá trị cho “TNS cơ sở dữ liệu”",
+       "config-missing-db-name": "Bạn phải nhập một giá trị cho “{{int:config-db-name}}”",
+       "config-missing-db-host": "Bạn phải nhập một giá trị cho “{{int:config-db-host}}”",
+       "config-missing-db-server-oracle": "Bạn phải nhập một giá trị cho “{{int:config-db-host-oracle}}”",
        "config-invalid-schema": "Giản đồ “$1” không hợp lệ cho MediaWiki.\nHãy chỉ sử dụng các chữ cái ASCII (a–z, A–Z), chữ số (0–9), và dấu gạch dưới (_).",
        "config-postgres-old": "Cần PostgreSQL $1 trở lên; bạn có $2.",
        "config-mssql-old": "Cần Microsoft SQL Server $1 trở lên. Bạn có $2.",
        "config-sqlite-readonly": "Không thể ghi vào tập tin <code>$1</code>.",
        "config-sqlite-cant-create-db": "Không thể tạo ra tập tin cơ sở dữ liệu <code>$1</code>.",
+       "config-sqlite-fts3-downgrade": "PHP thiếu sự hỗ trợ cho FTS3; đang giáng cấp các bảng",
+       "config-can-upgrade": "Cơ sở dữ liệu này có bảng MediaWiki.\nĐể nâng cấp các bảng đến MediaWiki $1, bấm <strong>Tiếp tục</strong>.",
        "config-regenerate": "Tạo lại LocalSettings.php →",
        "config-show-table-status": "Truy vấn <code>SHOW TABLE STATUS</code> bị thất bại!",
        "config-db-web-account": "Tài khoản cơ sở dữ liệu để truy cập Web",
        "config-install-keys": "Tạo ra các chìa khóa bí mật",
        "config-install-sysop": "Đang mở tài khoản người dùng bảo quản viên",
        "config-install-subscribe-fail": "Không thể theo dõi mediawiki-announce: $1",
-       "config-install-subscribe-notpossible": "cURL không được cài đặt và allow_url_fopen không có sẵn.",
+       "config-install-subscribe-notpossible": "cURL không được cài đặt và <code>allow_url_fopen</code> không có sẵn.",
        "config-install-mainpage": "Đang tạo trang đầu với nội dung mặc định",
        "config-install-extension-tables": "Đang tạo bảng cho các phần mở rộng được kích hoạt",
        "config-install-mainpage-failed": "Không thể chèn trang đầu: $1",
        "config-help": "Trợ giúp",
        "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/Manual:Configuration_settings Danh sách các thiết lập cấu hình]\n* [//www.mediawiki.org/wiki/Manual:FAQ Các câu hỏi thường gặp MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Danh sách gửi thư về việc phát hành MediaWiki]"
+       "mainpagedocfooter": "Xin đọc [//meta.wikimedia.org/wiki/Help:Contents Hướng dẫn sử dụng] để biết thêm thông tin về cách sử dụng phần mềm wiki.\n\n== Để bắt đầu ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Danh sách các thiết lập cấu hình]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Các câu hỏi thường gặp MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Danh sách gửi thư về việc phát hành MediaWiki]"
 }
index 27b7e42..62d5040 100644 (file)
@@ -1,5 +1,5 @@
 {
        "@metadata": [],
        "mainpagetext": "'''El MediaWiki pestiton benosekiko.'''",
-       "mainpagedocfooter": "Konsultolös [//meta.wikimedia.org/wiki/Help:Contents Gebanageidian] ad tuvön nünis dö geb programema vükik.\n\n== Nüdugot ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Parametalised]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki: SSP]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Potalised tefü fomams nulik ela MediaWiki]"
+       "mainpagedocfooter": "Konsultolös [//meta.wikimedia.org/wiki/Help:Contents Gebanageidian] ad tuvön nünis dö geb programema vükik.\n\n== Nüdugot ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Parametalised]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki: SSP]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Potalised tefü fomams nulik ela MediaWiki]"
 }
index c4b6741..39acc02 100644 (file)
@@ -1,5 +1,5 @@
 {
        "@metadata": [],
        "mainpagetext": "'''MediaWiki tarkvara paika säet.'''",
-       "mainpagedocfooter": "Vikitarkvara pruukmisõ kotsilõ loeq mano:\n* [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide MediaWiki pruukmisoppus (inglüse keelen)].\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Säädmiisi oppus (inglüse keelen)]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki kõgõ küsütümbäq küsümiseq (inglüse keelen)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-postilist, minka andas teedäq MediaWiki vahtsist kujõst]."
+       "mainpagedocfooter": "Vikitarkvara pruukmisõ kotsilõ loeq mano:\n* [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide MediaWiki pruukmisoppus (inglüse keelen)].\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Säädmiisi oppus (inglüse keelen)]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki kõgõ küsütümbäq küsümiseq (inglüse keelen)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-postilist, minka andas teedäq MediaWiki vahtsist kujõst]."
 }
index a62b1d3..6cde1d8 100644 (file)
@@ -68,5 +68,5 @@
        "config-help": "buligi",
        "config-nofile": "An paypay nga \"$1\" in diri nabibilngan. Ginpara na ini?",
        "mainpagetext": "'''Malinamposon an pag-instalar han MediaWiki.'''",
-       "mainpagedocfooter": "Kitaa an [//meta.wikimedia.org/wiki/Help:Contents User's Guide] para hin impormasyon ha paggamit han wiki nga softweyr.\n\n== Ha pagtikang==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Localise MediaWiki for your language]"
+       "mainpagedocfooter": "Kitaa an [//meta.wikimedia.org/wiki/Help:Contents User's Guide] para hin impormasyon ha paggamit han wiki nga softweyr.\n\n== Ha pagtikang==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]"
 }
index a699503..5cee276 100644 (file)
@@ -1,5 +1,9 @@
 {
-       "@metadata": [],
+       "@metadata": {
+               "authors": [
+                       "Seb35"
+               ]
+       },
        "mainpagetext": "'''Campug MediaWiki gi sotti na . '''",
-       "mainpagedocfooter": "Saytul [//meta.wikimedia.org/wiki/Ndimbal:Ndefu Gindikaayu jëfandikukat bi] ngir yeneeni xibaar ci jëfandiku gu tëriin gi.\n\n== Tambali ak MediaWiki ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Limu jumtukaayi kocc-koccal gi]\n* [//www.mediawiki.org/wiki/Manual:FAQ FAQ MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Limu waxtaan ci liy-génn ci MediaWiki]"
+       "mainpagedocfooter": "Saytul [//meta.wikimedia.org/wiki/Help:Contents Gindikaayu jëfandikukat bi] ngir yeneeni xibaar ci jëfandiku gu tëriin gi.\n\n== Tambali ak MediaWiki ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Limu jumtukaayi kocc-koccal gi]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Limu waxtaan ci liy-génn ci MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]"
 }
index 01bbf17..01052d3 100644 (file)
@@ -5,5 +5,5 @@
                ]
        },
        "mainpagetext": "'''MediaWiki安装成功哉!'''",
-       "mainpagedocfooter": "请访问[//meta.wikimedia.org/wiki/Help:Contents 用户手册]以获得使用此维基软件个信息!\n\n== 入门 ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings MediaWiki 配置设置列表]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki 常见问题解答]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 发布邮件列表]"
+       "mainpagedocfooter": "请访问[//meta.wikimedia.org/wiki/Help:Contents 用户手册]以获得使用此维基软件个信息!\n\n== 入门 ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings MediaWiki 配置设置列表]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki 常见问题解答]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 发布邮件列表]"
 }
index 241efaa..14ea95b 100644 (file)
@@ -5,5 +5,5 @@
                ]
        },
        "mainpagetext": "Йовудта Mediawiki гүүлһүдә тәвллһн.'''",
-       "mainpagedocfooter": "Тер бики закллһна теткүл ю кеһәд олзлх туск [//meta.wikimedia.org/wiki/Help:Contents көтлвр] дастн.\n\n== Туста заавр ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Көгүдә бүрткл]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki туск ЮмБи]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki шинҗллһнә бүрткл]"
+       "mainpagedocfooter": "Тер бики закллһна теткүл ю кеһәд олзлх туск [//meta.wikimedia.org/wiki/Help:Contents көтлвр] дастн.\n\n== Туста заавр ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Көгүдә бүрткл]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki туск ЮмБи]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki шинҗллһнә бүрткл]"
 }
index 01ccd83..f04fd5d 100644 (file)
@@ -50,5 +50,5 @@
        "config-help": "הילף",
        "config-nofile": "מ'האט נישט געקענט טרעפן די טעקע \"$1\". צי האט מען זי אויסגעמעקט?",
        "mainpagetext": "'''מעדיעוויקי אינסטאלירט מיט דערפאלג.'''",
-       "mainpagedocfooter": "גיט זיך אן עצה מיט [//meta.wikimedia.org/wiki/Help:Contents באניצער'ס וועגווײַזער] פֿאר אינפֿארמאציע וויאזוי זיך באנוצן מיט וויקי ווייכוואַרג.\n\n== נוצליכע וועבלינקען פֿאַר אנהייבערס ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings רשימה פון קאנפֿיגוראציעס]\n* [//www.mediawiki.org/wiki/Manual:FAQ אפֿט געפֿרעגטע שאלות]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce מעדיעוויקי באפֿרײַאונג פאסטליסטע]* [//www.mediawiki.org/wiki/Localisation#Translation_resources איבערזעצן מעדיעוויקי אין אײַער שפראך]"
+       "mainpagedocfooter": "גיט זיך אן עצה מיט [//meta.wikimedia.org/wiki/Help:Contents באניצער'ס וועגווײַזער] פֿאר אינפֿארמאציע וויאזוי זיך באנוצן מיט וויקי ווייכוואַרג.\n\n== נוצליכע וועבלינקען פֿאַר אנהייבערס ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings רשימה פון קאנפֿיגוראציעס]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ אפֿט געפֿרעגטע שאלות]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce מעדיעוויקי באפֿרײַאונג פאסטליסטע]* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources איבערזעצן מעדיעוויקי אין אײַער שפראך]"
 }
index 15a1ca4..84f3848 100644 (file)
@@ -15,5 +15,5 @@
        "config-db-type": "Irú ibùdó dátà:",
        "config-db-host": "Agbàlejò ibùdó dátà:",
        "mainpagetext": "'''MediaWiki ti jẹ́ gbígbékọ́sínú láyọrísírere.'''",
-       "mainpagedocfooter": "Ẹ ṣàbẹ̀wò sí [//meta.wikimedia.org/wiki/Help:Contents User's Guide] fún ìfitólétí nípa líló atòlànà wíkì.\n\n== Láti bẹ̀rẹ̀ ==\n*  [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]"
+       "mainpagedocfooter": "Ẹ ṣàbẹ̀wò sí [//meta.wikimedia.org/wiki/Help:Contents User's Guide] fún ìfitólétí nípa líló atòlànà wíkì.\n\n== Láti bẹ̀rẹ̀ ==\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 6ec6cf1..bc8df1a 100644 (file)
@@ -1,5 +1,5 @@
 {
        "@metadata": [],
        "mainpagetext": "'''MediaWiki已經裝好。'''",
-       "mainpagedocfooter": "參閱[//meta.wikimedia.org/wiki/Help:Contents 用戶指引](英),裏面有資料講點用wiki軟件。\n\n==開始使用==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings 配置設定清單](英)\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki 常見問題](英)\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 發佈郵件名單](英)"
+       "mainpagedocfooter": "參閱[//meta.wikimedia.org/wiki/Help:Contents 用戶指引](英),裏面有資料講點用wiki軟件。\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 09a9a64..d545ed6 100644 (file)
@@ -1,5 +1,9 @@
 {
-       "@metadata": [],
+       "@metadata": {
+               "authors": [
+                       "Seb35"
+               ]
+       },
        "mainpagetext": "'''De installaotie van MediaWiki is geslaegd.'''",
-       "mainpagedocfooter": "Raedpleeg de [//meta.wikimedia.org/wiki/ZEA_Ulpe:Inhoudsopgaeve andleidieng] voe informatie over 't gebruuk van de wikisoftware.\n\n== Meer ulpe over MediaWiki ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lieste mie instelliengen]\n* [//www.mediawiki.org/wiki/Manual:FAQ Veehestelde vraehen (FAQ)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailienglieste voe ankondigiengen van nieuwe versies]"
+       "mainpagedocfooter": "Raedpleeg de [//meta.wikimedia.org/wiki/Help:Contents Inhoudsopgaeve andleidieng] voe informatie over 't gebruuk van de wikisoftware.\n\n== Meer ulpe over MediaWiki ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lieste mie instelliengen]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Veehestelde vraehen (FAQ)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailienglieste voe ankondigiengen van nieuwe versies]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]"
 }
index a01ab18..d5f06a0 100644 (file)
@@ -16,7 +16,9 @@
                        "Byfserag",
                        "Hudafu",
                        "Liuxinyu970226",
-                       "Qiyue2001"
+                       "Qiyue2001",
+                       "Kuailong",
+                       "Zjzengdongyang"
                ]
        },
        "config-desc": "MediaWiki安装程序",
        "config-restart": "是的,重启吧",
        "config-welcome": "=== 环境检查 ===\n将简单检查当前环境是否适合安装MediaWiki。如果您要寻求安装过程的支持,请记得附上此信息。",
        "config-copyright": "=== 版权和条款 ===\n\n$1\n\n本程序为自由软件;您可依据自由软件基金会所发表的GNU通用公共授权条款规定,就本程序再为发布与/或修改;无论您依据的是本授权的第二版或(您自行选择的)任一日后发行的版本。\n\n本程序是基于使用目的而加以发布,然而'''不负任何担保责任''';亦无对'''适售性'''或'''特定目的适用性'''所为的默示性担保。详情请参照GNU通用公共授权。\n\n您应已收到附随于本程序的<doclink href=\"Copying\">GNU通用公共授权的副本</doclink>;如果没有,请写信至自由软件基金会:59 Temple Place - Suite 330, Boston, Ma 02111-1307, USA,或[http://www.gnu.org/copyleft/gpl.html 在线阅读]。",
-       "config-sidebar": "* [//www.mediawiki.org/wiki/MediaWiki/zh-hans MediaWiki首页]\n* [//www.mediawiki.org/wiki/Help:Contents/zh-hans 用户指南]\n* [//www.mediawiki.org/wiki/Manual:Contents 管理员指南]\n* [//www.mediawiki.org/wiki/Manual:FAQ/zh-hans 常见问题解答]\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-hans MediaWiki首页]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents/zh-hans 用户指南]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents 管理员指南]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/zh-hans 常见问题解答]\n----\n* <doclink href=Readme>自述文件</doclink>\n* <doclink href=ReleaseNotes>发行说明</doclink>\n* <doclink href=Copying>协议副本</doclink>\n* <doclink href=UpgradeDoc>升级</doclink>",
        "config-env-good": "环境检查已经完成。您可以安装MediaWiki。",
        "config-env-bad": "环境检查已经完成。您不能安装MediaWiki。",
        "config-env-php": "PHP $1已安装。",
        "config-env-php-toolow": "已安装PHP $1;但是,MediaWiki需要PHP $2或更高版本。",
        "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如果您运行着一个高流量的站点,请参阅 [//www.mediawiki.org/wiki/Unicode_normalization_considerations Unicode 正常化]一文。",
-       "config-unicode-update-warning": "'''警告''':Unicode正常化封装器的已安装版本使用了旧版本的[http://site.icu-project.org/ ICU项目]库。如果您需要使用Unicode,请将其[//www.mediawiki.org/wiki/Unicode_normalization_considerations 升级]。",
+       "config-unicode-pure-php-warning": "<strong>警告:</strong>因为尚未安装 [http://pecl.php.net/intl intl PECL 扩展]以处理 Unicode 正常化,故只能退而采用运行较慢的纯 PHP 实现的方法。\n如果您运行着一个高流量的站点,请参阅 [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode 正常化]一文。",
+       "config-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-no-fts3": "'''警告''':已编译的SQLite不包含[//sqlite.org/fts3.html FTS3模块],后台搜索功能将不可用。",
@@ -96,7 +98,7 @@
        "config-no-cli-uri": "<strong>警告:</strong>未指定<code>--scriptpath</code>参数,使用默认值:<code>$1</code>。",
        "config-using-server": "使用服务器名“<nowiki>$1</nowiki>”。",
        "config-using-uri": "使用服务器URL“<nowiki>$1$2</nowiki>”。",
-       "config-uploads-not-safe": "'''警告:'''您的默认上传目录<code>$1</code>存在允许执行任意脚本的漏洞。尽管MediaWiki会对所有已上传的文件进行安全检查,但我们仍然强烈建议您在启用上传功能前[//www.mediawiki.org/wiki/Manual:Security#Upload_security 关闭该安全漏洞]。",
+       "config-uploads-not-safe": "'''警告:'''您的默认上传目录<code>$1</code>存在允许执行任意脚本的漏洞。尽管MediaWiki会对所有已上传的文件进行安全检查,但我们仍然强烈建议您在启用上传功能前[//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security 关闭该安全漏洞]。",
        "config-no-cli-uploads-check": "'''警告''':在CLI安装过程中,没有对您的默认上传目录(<code>$1</code>)进行执行任意脚本的漏洞检查。",
        "config-brokenlibxml": "您的系统安装的PHP和libxml2版本组合存在故障,并可能在MediaWiki和其他web应用程序中造成隐藏的数据损坏。请将libxml2升级到2.7.3或以上([https://bugs.php.net/bug.php?id=45996 PHP的故障报告])。安装已中断。",
        "config-suhosin-max-value-length": "Suhosin已经安装并将GET请求的参数长度限制在$1字节。MediaWiki的ResourceLoader部件可以在此限制下正常工作,但其性能会被降低。如果可能,请在<code>php.ini</code>中将<code>suhosin.get.max_value_length</code>设为1024或更高值,并在LocalSettings.php中将<code>$wgResourceLoaderMaxQueryLength</code>设为同一值。",
        "config-mysql-utf8": "UTF-8",
        "config-mysql-charset-help": "在'''二进制模式'''下,MediaWiki会将UTF-8编码的文本存于数据库的二进制字段中。相对于MySQL的UTF-8模式,这种方法效率更高,并允许您使用全范围的Unicode字符。\n\n在'''UTF-8模式'''下,MySQL将知道您数据使用的字符集,并能适当地提供和转换内容。但这样做您将无法在数据库中存储[//zh.wikipedia.org/wiki/基本多文种平面 基本多文种平面]以外的字符。",
        "config-mssql-auth": "身份验证类型:",
+       "config-mssql-install-auth": "选择安装过程中链接数据库时将采用的身份验证方式。\n如果您选择“{{int:config-mssql-windowsauth}}”,将使用运行服务器的用户的身份凭据。",
        "config-mssql-web-auth": "选择Web服务器在通常wiki操作期间用来连接数据库服务器的身份验证方式。\n如果您选择“{{int:config-mssql-windowsauth}}”,将使用运行Web服务器的用户的凭据。",
        "config-mssql-sqlauth": "SQL Server 身份验证",
        "config-mssql-windowsauth": "Windows 身份验证",
        "config-profile-no-anon": "需要注册帐号",
        "config-profile-fishbowl": "编辑受限",
        "config-profile-private": "非公开wiki",
-       "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/Manual:User_rights 相关的使用手册]。",
+       "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-enable-email-help": "如果您希望使用电子邮件功能,请正确配置[http://www.php.net/manual/en/mail.configuration.php PHP的邮件设定]。如果您不需要任何电子邮件功能,请在此处禁用它。",
        "config-email-user": "启用用户到用户的电子邮件",
        "config-email-user-help": "允许所有用户互发邮件,假若他们启用了该功能。",
-       "config-email-usertalk": "启用用户讨论页通知",
+       "config-email-usertalk": "å\90¯ç\94¨ç\94¨æ\88·è®¨è®ºé¡µé\9d¢é\80\9aç\9f¥",
        "config-email-usertalk-help": "允许用户收到用户讨论页被修改的通知,假若他们启用了该功能。",
        "config-email-watchlist": "启用监视列表通知",
        "config-email-watchlist-help": "允许用户收到与其监视列表有关的通知,假若他们启用了该功能。",
        "config-email-sender-help": "输入要用来发送出站电子邮件的地址,该地址将会收到被拒收的邮件。许多邮件服务器要求域名部分必须有效。",
        "config-upload-settings": "图像和文件上传",
        "config-upload-enable": "启用文件上传",
-       "config-upload-help": "文件上传可能会将您的服务器暴露在安全风险下。有关更多的信息,请参阅手册的[//www.mediawiki.org/wiki/Manual:Security 安全部分]。\n\n要启用文件上传,请先将MediaWiki根目录下的<code>images</code>子目录更改为对web服务器可写,然后再启用此选项。",
+       "config-upload-help": "文件上传可能会将您的服务器暴露在安全风险下。有关更多的信息,请参阅手册的[//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security 安全部分]。\n\n要启用文件上传,请先将MediaWiki根目录下的<code>images</code>子目录更改为对web服务器可写,然后再启用此选项。",
        "config-upload-deleted": "已删除文件的目录:",
        "config-upload-deleted-help": "指定用于存放被删除文件的目录。理想情况下,该目录不应能通过web访问。",
        "config-logo": "标志URL:",
        "config-logo-help": "在MediaWiki的默认外观中,左侧栏菜单之上有一块135x160像素的标志区。请上传一幅相应大小的图像,并在此输入URL。\n\n你可以用<code>$wgStylePath</code>或<code>$wgScriptPath</code>来表示相对于这些位置的路径。\n\n如果您不希望使用标志,请将本处留空。",
        "config-instantcommons": "启用即时共享资源",
-       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons 即时共享资源]可以让wiki使用来自[//commons.wikimedia.org/ 维基共享资源]网站的图像、音频和其他媒体文件。要启用该功能,MediaWiki必须能够访问互联网。\n\n有关此功能的详细信息,包括如何将其他wiki网站设为具有类似共享功能的方法,请参考[//mediawiki.org/wiki/Manual:$wgForeignFileRepos 手册]。",
+       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons 即时共享资源]可以让wiki使用来自[//commons.wikimedia.org/ 维基共享资源]网站的图像、音频和其他媒体文件。要启用该功能,MediaWiki必须能够访问互联网。\n\n有关此功能的详细信息,包括如何将其他wiki网站设为具有类似共享功能的方法,请参考[//www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos 手册]。",
        "config-cc-error": "知识共享许可证挑选器无法找到结果,请手动输入许可证的名称。",
        "config-cc-again": "重新挑选……",
        "config-cc-not-chosen": "选择您希望使用的知识共享许可证,并点击“继续”。",
        "config-insecure-keys": "'''警告''':在安装过程中生成的{{PLURAL:$2|安全密钥|安全密钥}}($1){{PLURAL:$2|并|并}}不一定安全。请考虑手动更改{{PLURAL:$2|它|它们}}。",
        "config-install-sysop": "正在创建管理员用户帐号",
        "config-install-subscribe-fail": "无法订阅mediawiki-announce:$1",
-       "config-install-subscribe-notpossible": "没有安装cURL,allow_url_fopen也不可用。",
+       "config-install-subscribe-notpossible": "没有安装cURL,<code>allow_url_fopen</code>也不可用。",
        "config-install-mainpage": "正在创建显示默认内容的首页",
        "config-install-extension-tables": "正在创建已启用扩展程序表",
        "config-install-mainpage-failed": "无法插入首页:$1",
        "config-install-done": "'''恭喜!'''\n您已经成功地安装了MediaWiki。\n\n安装程序已经生成了<code>LocalSettings.php</code>文件,其中包含了您所有的配置。\n\n您需要下载该文件,并将其放在您wiki的根目录(index.php的同级目录)中。稍后下载将自动开始。\n\n如果浏览器没有提示您下载,或者您取消了下载,您可以点击下面的链接重新开始下载:\n\n$3\n\n'''注意''':如果您现在不完成本步骤,而是没有下载便退出了安装过程,此后您将无法获得自动生成的配置文件。\n\n当本步骤完成后,您可以 '''[$2 进入您的wiki]'''。",
        "config-download-localsettings": "下载<code>LocalSettings.php</code>",
        "config-help": "帮助",
+       "config-help-tooltip": "单击展开",
        "config-nofile": "找不到文件“$1”。它是否已被删除?",
-       "config-extension-link": "您是否知道您的wiki支持[//www.mediawiki.org/wiki/Manual:Extensions 拓展]?\n\n您可浏览[//www.mediawiki.org/wiki/Category:Extensions_by_category 拓展分类]或[//www.mediawiki.org/wiki/Extension_Matrix 拓展矩阵]以查找完整的拓展列表。",
+       "config-extension-link": "您是否知道您的wiki支持[//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions 拓展]?\n您可浏览[//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category 拓展分类]。",
        "mainpagetext": "'''已成功安装MediaWiki。'''",
-       "mainpagedocfooter": "请查阅[//meta.wikimedia.org/wiki/Help:Contents 用户指南]以获取使用本wiki软件的信息!\n\n== 入门 ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings MediaWiki配置设置列表]\n* [//www.mediawiki.org/wiki/Manual:FAQ/zh-hans MediaWiki常见问题]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki发布邮件列表]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources 本地化MediaWiki到您的语言]"
+       "mainpagedocfooter": "请查阅[//meta.wikimedia.org/wiki/Help:Contents 用户指南]以获取使用本wiki软件的信息!\n\n== 入门 ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings MediaWiki配置设置列表]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/zh-hans MediaWiki常见问题]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki发布邮件列表]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources 本地化MediaWiki到您的语言]"
 }
index 536fd8b..a6e87cf 100644 (file)
                        "Mark85296341",
                        "Simon Shek",
                        "아라",
-                       "Liuxinyu970226"
+                       "Liuxinyu970226",
+                       "Xiaomingyan",
+                       "Cwlin0416"
                ]
        },
-       "config-desc": "MediaWiki安裝程式",
-       "config-title": "MediaWiki $1配置",
+       "config-desc": "MediaWiki 安裝程式",
+       "config-title": "MediaWiki $1 安裝",
        "config-information": "資訊",
-       "config-localsettings-upgrade": "已檢測到<code>LocalSettings.php</code>文件。要升級該配置,請在下面的框中輸入<code>$wgUpgradeKey</code>的值。您可以在<code>LocalSettings.php</code>中找到它。",
-       "config-localsettings-cli-upgrade": "已檢測到<code>LocalSettings.php</code>文件。要升級該配置,請直接執行<code>update.php</code>。",
-       "config-localsettings-key": "升級鑰:",
-       "config-localsettings-badkey": "您提供的密鑰不正確。",
-       "config-upgrade-key-missing": "檢測到MediaWiki的配置已經存在。若要升級該配置,請將下面一行文本添加到<code>LocalSettings.php</code>的底部:\n\n$1",
-       "config-localsettings-incomplete": "ç\95¶å\89\8dç\9a\84<code>LocalSettings.php</code>å\8f¯è\83½ä¸¦ä¸\8då®\8cæ\95´ï¼\8cå\9b ç\82ºè®\8aé\87\8f$1æ²\92æ\9c\89設置ã\80\82è«\8bå\9c¨<code>LocalSettings.php</code>設置該è®\8aé\87\8fï¼\8c並å\96®æ\93\8aã\80\8c{{int:Config-continue}}ã\80\8d。",
-       "config-localsettings-connection-error": "在使用<code>LocalSettings.php</code>或<code>AdminSettings.php</code>中指定的設置連接數據庫時發生錯誤。請修復相應設置並重試。\n\n$1",
-       "config-session-error": "啟動會話出錯:$1",
-       "config-session-expired": "您的會話數據可能已經過期,當前會話的使用期限被設定為$1。您可以在php.ini中設置<code>session.gc_maxlifetime</code>來延長此期限,並重新啟動本配置程序。",
-       "config-no-session": "您的會話數據丟失了!請檢查php.ini並確保<code>session.save_path</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": "你提供的金鑰不正確。",
+       "config-upgrade-key-missing": "已偵測到先前安裝的 MediaWiki。\n要升級目前安裝的版本,請將下列文字附加到 <code>LocalSettings.php</code> 的檔案最下方:\n\n$1",
+       "config-localsettings-incomplete": "ç\9b®å\89\8dç\9a\84 <code>LocalSettings.php</code> æª\94æ¡\88ä¸\8då®\8cæ\95´ã\80\82\næ\9cªè¨­å®\9aå\8f\83æ\95¸ $1ã\80\82\nè«\8bå°\87æ­¤å\8f\83æ\95¸è¨­å®\9aè\87³ <code>LocalSettings.php</code> ä¸­ï¼\8c並é»\9eé\81¸ \"{{int:Config-continue}}\"。",
+       "config-localsettings-connection-error": "使用 <code>LocalSettings.php</code> 中所指定的資料庫設定連線發生錯誤。 請修復相關設定並再試一次。\n\n$1",
+       "config-session-error": "開始工作階段錯誤:$1",
+       "config-session-expired": "您的工作階段已過期。\n目前設定的工作階段期限為 $1。\n您可以在 php.ini 設定檔中設定 <code>session.gc_maxlifetime</code> 的參數來延長此期限。\n重新開始安裝程序。",
+       "config-no-session": "您的工作階段資料遺失!\n請檢查 php.ini 設定檔並確認 <code>session.save_path</code> 所設定的目錄是否合適。",
        "config-your-language": "您的語言:",
-       "config-your-language-help": "選擇一個要使用的語言在安裝過程中。",
-       "config-wiki-language": "Wiki語言:",
-       "config-wiki-language-help": "選擇將要安裝的wiki在多數情況下使用的語言。",
-       "config-back": "←返回",
-       "config-continue": "繼續→",
+       "config-your-language-help": "請選擇接下來安裝程序中要使用的語言。",
+       "config-wiki-language": "Wiki 語言:",
+       "config-wiki-language-help": "選擇將要安裝的 Wiki 多數情況主要使用的語言。",
+       "config-back": "← 返回",
+       "config-continue": "繼續 →",
        "config-page-language": "語言",
-       "config-page-welcome": "歡迎您來到MediaWiki!",
-       "config-page-dbconnect": "連接到數據庫",
-       "config-page-upgrade": "å\8d\87ç´\9aç\8f¾æ\9c\89ç\9a\84å®\89è£\9d",
-       "config-page-dbsettings": "數據庫設定",
+       "config-page-welcome": "歡迎您來到 MediaWiki!",
+       "config-page-dbconnect": "連線到資料庫",
+       "config-page-upgrade": "å\8d\87ç´\9aç\9b®å\89\8då®\89è£\9dç\9a\84ç\89\88æ\9c¬",
+       "config-page-dbsettings": "資料庫設定",
        "config-page-name": "名稱",
        "config-page-options": "選項",
        "config-page-install": "安裝",
        "config-page-complete": "完成!",
        "config-page-restart": "重新安裝",
-       "config-page-readme": "讀我",
-       "config-page-releasenotes": "發說明",
+       "config-page-readme": "讀我說明",
+       "config-page-releasenotes": "發說明",
        "config-page-copying": "複製",
        "config-page-upgradedoc": "升級",
-       "config-page-existingwiki": "已有wiki",
-       "config-help-restart": "是否要清除所有已輸入且保存的數據,並重新啟動安裝過程嗎?",
-       "config-restart": "是的,重新啟動",
-       "config-welcome": "=== 環境檢查 ===\n對當前環境是否適合安裝MediaWiki作基本的檢查。如果您在安裝過程中需要幫助,請提供這些檢查的結果。",
-       "config-copyright": "=== 版權和條款 ===\n\n$1\n\n本程序為自由軟件;您可依據自由軟件基金會所發表的GNU通用公共授權條款規定,就本程序再為發布與/或修改;無論您依據的是本授權的第二版或(您自行選擇的)任一日後發行的版本。\n\n本程序是基於使用目的而加以發布,然而'''不負任何擔保責任''';亦無對'''適售性'''或'''特定目的適用性'''所為的默示性擔保。詳情請參照GNU通用公共授權。\n\n您應已收到附隨於本程序的<doclink href=\"Copying\">GNU通用公共授權的副本</doclink>;如果沒有,請寫信至自由軟件基金會:59 Temple Place - Suite 330, Boston, Ma 02111-1307, USA,或[http://www.gnu.org/copyleft/gpl.html 在線閱讀]。",
-       "config-sidebar": "* [www.mediawiki.org/wiki/MediaWiki/zh-hant MediaWiki首頁]\n* [www.mediawiki.org/wiki/Help:Contents/zh 用戶指南]\n* [//www.mediawiki.org/wiki/Manual:Contents/zh 管理員指南]\n* [//www.mediawiki.org/wiki/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-env-good": "環境檢查已經完成。您可以安裝MediaWiki。",
-       "config-env-bad": "環境檢查已經完成。您不能安裝MediaWiki。",
-       "config-env-php": "PHP $1已安裝。",
-       "config-env-php-toolow": "已安裝PHP $1;然而,MediaWiki要求PHP $2或更高版本。",
-       "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實作。如果您運行着一個高流量的網站,您應當閱讀[//www.mediawiki.org/wiki/Unicode_normalization_considerations/zh Unicode正規化]一文。",
-       "config-unicode-update-warning": "'''警告''':Unicode正常化封裝器的已安裝版本使用了舊版本的[http://site.icu-project.org/ ICU項目]庫。如果您需要使用Unicode,請將其[//www.mediawiki.org/wiki/Unicode_normalization_considerations 升級]。",
-       "config-no-db": "找不到合適的數據庫驅動!您需要為PHP安裝數據庫驅動。目前支持以下數據庫:$1。\n\n如果您通過自行編譯安裝的PHP,請對其進行重新配置以啟用數據庫客戶端,例如使用<code>./configure --with-mysqli</code>。如果您通過Debian或Ubuntu包安裝PHP,您仍需安裝諸如<code>php5-mysql</code>等模塊。",
-       "config-outdated-sqlite": "'''警告''':您已安裝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'''如果可以請將之禁用。'''\nMediaWiki仍將運行,但您的服務器會被暴露給潛在的安全漏洞。",
-       "config-magic-quotes-runtime": "'''致命錯誤:[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime]被啟用!'''\n此選項會無法預測地破壞輸入的數據,請將其禁用,否則您將不能安裝或使用MediaWiki。",
-       "config-magic-quotes-sybase": "'''致命錯誤:[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_sybase]被啟用!'''\n此選項會無法預測地破壞輸入的數據,請將其禁用,否則您將不能安裝或使用MediaWiki。",
-       "config-mbstring": "'''致命錯誤:[http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]被啟用!'''\n此選項會導致錯誤並不可預測地破壞數據,請將其禁用,否則您將不能安裝或使用MediaWiki。",
-       "config-safe-mode": "'''警告:'''PHP的[http://www.php.net/features.safe-mode 安全模式]已啟用。它可能會導致一些問題,尤其在對文件上傳和數學公式<code>math</code>的支持方面。",
-       "config-xml-bad": "缺少PHP的XML模塊。MediaWiki需要使用該模塊提供的函數,在當前配置下將無法工作。如果您正在使用Mandrake Linux,請安裝php-xml包。",
-       "config-pcre-no-utf8": "'''致命錯誤''':PHP的PCRE模塊在編譯時可能沒有包含PCRE_UTF8支持。MediaWiki需要UTF-8支持才能正常工作。",
-       "config-memory-raised": "PHP的內存使用上限<code>memory_limit</code>為$1,自動提升到$2。",
-       "config-memory-bad": "'''警告:'''PHP的內存使用上限<code>memory_limit</code>為$1。該設定可能過低,並導致安裝失敗!",
-       "config-ctype": "'''毀滅性錯誤''':PHP必須有[http://www.php.net/manual/en/ctype.installation.php Ctype 擴展]來支持編譯。",
-       "config-json": "'''致命錯誤:'''PHP編譯程式並無法支援JSON。於MediaWiki繼續安裝之前您必須安裝PHP JSON拓展或[http://pecl.php.net/package/jsonc PECL jsonc]拓展。\n* PHP拓展包含於紅帽Linux(CentOS)5版至6版,這些用戶必須於<code>/etc/php.ini</code>或<code>/etc/php.d/json.ini</code>啟用之。\n* 部分於2013年5月后發佈Linux缺少PHP拓展,於PECL<code>php5-json</code>或<code>php-pecl-jsonc</code>拓展安裝后即可啟用。",
-       "config-xcache": "[http://xcache.lighttpd.net/ XCache]已安裝",
-       "config-apc": "[http://www.php.net/apc APC]已安裝",
-       "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache]已安裝",
-       "config-no-cache": "'''警告:'''找不到[http://www.php.net/apc APC]、[http://xcache.lighttpd.net/ XCache]或[http://www.iis.net/download/WinCacheForPhp WinCache],無法啟用對象緩存。計劃緩存未啟用。",
-       "config-mod-security": "'''警告''':您的服務器已啟動[http://modsecurity.org/ mod_security]。若其配置錯誤, 會導致MediaWiki和其他軟件的錯誤並允許用戶任意發布內容。如果您遇到任何錯誤,請查閱[http://modsecurity.org/documentation/ mod_security文檔]或聯繫您的客服。",
-       "config-diff3-bad": "找不到GNU diff3。",
-       "config-git": "發現Git版本控制軟件:<code>$1</code>。",
-       "config-git-bad": "無法找到Git版本控制軟件。",
-       "config-imagemagick": "已找到ImageMagick:<code>$1</code>。如果你啟用了上傳功能,縮略圖功能也將被啟用。",
-       "config-gd": "已找到內建的GD圖形庫。如果你啟用了上傳功能,縮略圖功能也將被啟用。",
-       "config-no-scaling": "找不到GD庫或ImageMagick。縮略圖功能將不可用。",
-       "config-no-uri": "'''錯誤:'''無法確定當前的URI。安裝已中斷。",
-       "config-no-cli-uri": "'''警告''':未指定<code>--scriptpath</code>參數,使用默認值:<code>$1</code>。",
-       "config-using-server": "使用伺服器名「<nowiki>$1</nowiki>」。",
-       "config-using-uri": "使用伺服器名「<nowiki>$1$2</nowiki>」。",
-       "config-uploads-not-safe": "'''警告:'''您的默認上傳目錄<code>$1</code>存在允許執行任意腳本的漏洞。儘管MediaWiki會對所有已上傳的文件進行安全檢查,但我們仍然強烈建議您在啟用上傳功能前[//www.mediawiki.org/wiki/Manual:Security#Upload_security 關閉該安全漏洞]。",
-       "config-no-cli-uploads-check": "'''警告''':在CLI安裝過程中,沒有對您的默認上傳目錄(<code>$1</code>)進行執行任意腳本的漏洞檢查。",
-       "config-brokenlibxml": "您的系統安裝的PHP和libxml2版本組合存在故障,並可能在MediaWiki和其他web應用程序中造成隱藏的數據損壞。請將PHP升級到5.2.9或以上,libxml2升級到2.7.3或以上([//bugs.php.net/bug.php?id=45996 PHP的故障報告])。安裝已中斷。",
-       "config-suhosin-max-value-length": "Suhosin已經安裝並將GET請求的參數長度限制在$1字節。MediaWiki的ResourceLoader部件可以在此限制下正常工作,但其性能會被降低。如果可能,請在<code>php.ini</code>中將<code>suhosin.get.max_value_length</code>設為1024或更高值,並在LocalSettings.php中將<code>$wgResourceLoaderMaxQueryLength</code>設為同一值。",
+       "config-page-existingwiki": "現有 Wiki",
+       "config-help-restart": "是否要清除所有已輸入且儲存的資料,並重新開始安裝程序嗎?",
+       "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-env-good": "環境檢查已完成。\n您可以安裝 MediaWiki。",
+       "config-env-bad": "環境檢查已完成。\n您無法安裝 MediaWiki。",
+       "config-env-php": "PHP $1 已安裝。",
+       "config-env-php-toolow": "已安裝 PHP $1。\n但 MediaWiki 需要 PHP $2 或更新的版本。",
+       "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-unicode-update-warning": "<strong>警告</strong>:目前安裝的 Unicode 正規化包裝程式使用了舊版 [http://site.icu-project.org/ ICU 計劃] 的程式庫。\n若您需要使用 Unicode,您應先進行 [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations 升級]。",
+       "config-no-db": "找不到合適的資料庫驅動程式!您需要安裝 PHP 資料庫驅動程式。\n目前支援以下類型的資料庫: $1 。\n\n如果您是自行編譯 PHP,您必須重新設定並開啟資料庫客戶端,例:使用 <code>./configure --with-mysqli</code> 指令參數。\n如果您是使用 Debian 或 Ubuntu 的套件安裝,您則需要額外安裝,例:<code>php5-mysql</code> 套件。",
+       "config-outdated-sqlite": "<strong>警告:</strong>您已安裝 SQLite $1,但是它的版本低於最低需求版本 $2。 因此您無法使用 SQLite。",
+       "config-no-fts3": "<strong>警告:</strong> SQLite 編譯時未包含 [//sqlite.org/fts3.html FTS3 模組],後台搜尋功能將無法使用。",
+       "config-register-globals": "<strong>警告:PHP 的<code>[http://php.net/register_globals register_globals]</code>選項已開啟,如果可以請關閉該選項。</strong>\nMediaWiki 仍可正常執行,但您的伺服器將會有潛藏的安全性問題。",
+       "config-magic-quotes-runtime": "<strong>嚴重:[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] 選項被開啟!</strong>\n此選項會導致資料在無法預測的情況下損壞。\n您必須將開選項關閉方可繼續安裝 MediaWiki。",
+       "config-magic-quotes-sybase": "<strong>嚴重:[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] 選項被開啟!</strong>\n此選項會導致資料在無法預測的情況下損壞。\n您必須將開選項關閉方可繼續安裝 MediaWiki。",
+       "config-mbstring": "<strong>嚴重:[http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] 選項被開啟!</strong>\n此選項會導致資料在無法預測的情況下損壞。\n您必須將開選項關閉方可繼續安裝 MediaWiki。",
+       "config-safe-mode": "<strong>警告:</strong>PHP 的 [http://www.php.net/features.safe-mode 安全模式] 選項被開啟。它可能會導致檔案上傳與數學函數 <code>math</code> 的問題。",
+       "config-xml-bad": "PHP 缺少的 XML 模組。\nMediaWiki 需要使用此模組中所提供的函數,且在目前的設定下將無法繼續作業。\n如果您使用的是 Mandrake Linux,請安裝 php-xml 套件。",
+       "config-pcre-old": "<strong>嚴重:</strong> 需要使用 PCRE $1 或更新的版本。\n您的 PHP 執行檔使用的是 PCRE $2。\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE 詳細資訊]。",
+       "config-pcre-no-utf8": "<strong>嚴重:</strong> PHP 的 PCRE 模組在編譯時未包含 PCRE_UTF8 支援。\nMediaWiki 需要支援 UTF-8 才可正常運作。",
+       "config-memory-raised": "PHP 的記憶體使用上限 <code>memory_limit</code> 目前為 $1,自動提高到 $2。",
+       "config-memory-bad": "<strong>警告:</strong>PHP 的記憶體使用上限 <code>memory_limit</code> 為 $1。\n該設定值可能過低。\n這可能導致後續的安裝失敗!",
+       "config-ctype": "<strong>嚴重:</strong> PHP 編譯時必須包含 [http://www.php.net/manual/en/ctype.installation.php Ctype 擴充套件]。",
+       "config-json": "<strong>嚴重:</strong> PHP 編譯時並未包含 JSON 擴充套件。\n在 MediaWiki 繼續安裝之前您必須先安裝 PHP JSON 擴充套件或 [http://pecl.php.net/package/jsonc PECL jsonc] 擴充套件。\n* 此 PHP 擴充套件在 Red Hat Enterprice Linux (CentOS) 5 版與 6 版以有內含,須於 <code>/etc/php.ini</code> 或 <code>/etc/php.d/json.ini</code> 設定檔將該項目開啟。\n* 部分於 2013 年 5 月以後發佈的 Linux 並沒有此 PHP 擴充套件,可透過安裝 PECL 擴充套件 <code>php5-json</code> 或 <code>php-pecl-jsonc</code> 替代。",
+       "config-xcache": "[http://xcache.lighttpd.net/ XCache] 已安裝",
+       "config-apc": "[http://www.php.net/apc APC] 已安裝",
+       "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] 已安裝",
+       "config-no-cache": "<strong>警告:</strong> 找不到 [http://www.php.net/apc APC]、[http://xcache.lighttpd.net/ XCache] 或 [http://www.iis.net/download/WinCacheForPhp WinCache]。\n無法開啟物件快取功能。",
+       "config-mod-security": "<strong>警告:</strong>您的網頁伺服器已開啟 [http://modsecurity.org/ mod_security] 模組,如果設定不恰當會導致使用者可在 MediaWiki 或其他應用程式發佈任意的內容。\n若您遇到任何問題,請參考 [http://modsecurity.org/documentation/ mod_security 文件] 或聯繫您的伺服器技術支援人員。",
+       "config-diff3-bad": "找不到 GNU diff3。",
+       "config-git": "找到 Git 版本控制軟體:<code>$1</code>。",
+       "config-git-bad": "查無 Git 版本控制軟體。",
+       "config-imagemagick": "找到 ImageMagick:<code>$1</code>。\n若您開啟了檔案上傳功能,將可啟用縮圖功能。",
+       "config-gd": "找到內建 GD 圖形程式庫。\n若您開啟了檔案上傳功能,將可啟用縮圖功能。",
+       "config-no-scaling": "找不到 GD 程式庫或 ImageMagick。\n無法使用縮圖功能。",
+       "config-no-uri": "<strong>錯誤:</strong>無法辨識目前的 URI 位置。\n安裝已中止。",
+       "config-no-cli-uri": "<strong>警告:</strong>:未指定 <code>--scriptpath</code> 指令參數,使用預設值:<code>$1</code>。",
+       "config-using-server": "使用伺服器名稱 \"<nowiki>$1</nowiki>\"。",
+       "config-using-uri": "使用伺服器 URL 位置 \"<nowiki>$1$2</nowiki>\"。",
+       "config-uploads-not-safe": "<strong>警告:</strong>您預設的上傳目錄 <code>$1</code> 有可被任意執行 Script 的漏洞。\n雖然 MediaWiki 會對所有上傳的檔案進行安全檢查,但我們仍強烈建議您在開啟上傳功能前了解如何 [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security 關閉此安全漏洞]。",
+       "config-no-cli-uploads-check": "<strong>警告:</strong>透過指令介面安不會檢查您預設的上傳目錄 (<code>$1</code>) 是否有可任意執行 Script 的安全性漏洞。",
+       "config-brokenlibxml": "您的系統使用了可能造成 MediaWiki 或其他網頁應用程式資料損毀問題的 PHP 與 limbxml2 版本。\n請升級 libxml2 2.7.3 或更新的版本 ([https://bugs.php.net/bug.php?id=45996 PHP 問題報告])。\n安裝已中止。",
+       "config-suhosin-max-value-length": "Suhosin 已安裝並且限制 GET 參數的長度 <code>length</code> 為 $1 位元組。\nMediaWiki 的 ResourceLoader 元件可以在此限制下正常運作,但仍會降低執行的效能。\n如果可能的情況下,您應該設定 <code>php.ini</code> 設定檔中的項目  <code>suhosin.get.max_value_length</code> 為 1024 或者更高的數值,並且將\n<code>LocalSettings.php</code> 中的設定項目  <code>$wgResourceLoaderMaxQueryLength</code> 設為相同的數值。",
        "config-db-type": "資料庫類型:",
        "config-db-host": "資料庫主機:",
-       "config-db-host-help": "如果您的數據庫在別的服務器上,請在這裡輸入它的域名或IP地址。\n\n如果您在使用共享網站套餐,您的網站商應該已在他們的控制面板中給您數據庫信息了。\n\n如果您在Windows中安裝並且使用MySQL,“localhost”可能無效。如果確實無效,請輸入“127.0.0.1”作為IP地址。\n\n如果您在使用PostgreSQL,並且要用Unix socket來連接,請留空。",
+       "config-db-host-help": "如果您的資料庫安裝在其他伺服器上,請在此輸入該主機的名稱或 IP 位址。\n\n如果您使用共用的網頁主機,您的主機提供商應會在說明文件上告訴您正確的主機名稱。\n\n如果您安裝在 Windows 伺服器並且使用 MySQL,伺服器名稱可能無法使用使用 \"localhost\"。若確實無法使用,請改嘗試使用本機的 IP 位址 \"127.0.0.1\"。\n\n如果您使用 PostgreSQL,將此欄位空白以使用 Unix socket 來連線。",
        "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 簡單連接名方法](easy connect naming method)。",
-       "config-db-wiki-settings": "識別這個 Wiki",
+       "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": "此 Wiki 的 ID",
        "config-db-name": "資料庫名稱:",
-       "config-db-name-help": "請輸入一個可以標識您的wiki的名稱。請勿使用空格。\n\n如果您正在使用共享web主機,您的主機提供商或會給您指定一個數據庫名稱,或會讓您通過控制面板創建數據庫。",
-       "config-db-name-oracle": "資料庫架構:",
-       "config-db-account-oracle-warn": "ç\8f¾æ\9c\89ä¸\89種已æ\94¯æ\8c\81æ\96¹æ¡\88å\8f¯ä»¥å°\87Oracle設置ç\82ºå¾\8c端æ\95¸æ\93\9a庫ï¼\9a\n\nå¦\82æ\9e\9cæ\82¨å¸\8cæ\9c\9bå\9c¨å®\89è£\9dé\81\8eç¨\8b中å\89µå»ºæ\95¸æ\93\9a庫帳æ\88¶ï¼\8cè«\8bç\82ºå®\89è£\9dç¨\8båº\8fæ\8f\90ä¾\9bå\85·æ\9c\89SYSDBAè§\92è\89²ç\9a\84æ\95¸æ\93\9a庫帳æ\88¶ï¼\8c並ç\82ºweb訪å\95\8f帳æ\88¶æ\8c\87å®\9aæ\89\80é\9c\80身份è­\89æ\98\8eï¼\9bå\90¦å\89\87æ\82¨å\8f¯ä»¥æ\89\8bå\8b\95å\89µå»ºweb訪å\95\8fç\9a\84賬æ\88¶ä¸¦å\83\85é \88æ\8f\90ä¾\9b該帳æ\88¶ï¼\88確ä¿\9d帳æ\88¶å·²æ\9c\89å\89µå»ºæ\96¹æ¡\88å°\8d象ï¼\88schema objectï¼\89ç\9a\84æ\89\80é\9c\80æ¬\8aé\99\90ï¼\89ï¼\9bæ\88\96æ\8f\90ä¾\9bå\85©å\80\8bä¸\8då\90\8cç\9a\84帳æ\88¶ï¼\8cå\85¶ä¸\80å\85·æ\9c\89å\89µå»ºæ¬\8aé\99\90ï¼\8cå\8f¦ä¸\80å\89\87被é\99\90å\88¶ç\82ºweb訪å\95\8fã\80\82\n\nå\85·æ\9c\89æ\89\80é\9c\80æ¬\8aé\99\90賬æ\88¶ç\9a\84å\89µå»ºè\85³æ\9c¬å­\98æ\94¾æ\96¼æ\9c¬ç¨\8båº\8fç\9a\84â\80\9cmaintenance/oracle/â\80\9dç\9b®é\8c\84ä¸\8bã\80\82è«\8b注æ\84\8fï¼\8c使ç\94¨å\8f\97é\99\90å\88¶ç\9a\84帳æ\88¶å°\87ç¦\81ç\94¨é»\98èª\8d帳æ\88¶ç\9a\84所有維護性功能。",
-       "config-db-install-account": "用於安裝的用戶帳號",
+       "config-db-name-help": "請輸入一個可以辨識您的 Wiki 的名稱,\n請勿包含空格。\n\n如果您使用的是共用的網頁主機,您的主機提供商會給您一個指定的資料庫名稱,或者讓您透過管理介面建立資料庫。",
+       "config-db-name-oracle": "資料庫 Schema:",
+       "config-db-account-oracle-warn": "ç\9b®å\89\8dæ\9c\89ä¸\89種æ\94¯æ\8f´ Oracle å\81\9aç\82ºå¾\8c端è³\87æ\96\99庫ç\9a\84æ\96¹æ¡\88ï¼\9a\n\nå¦\82æ\9e\9cæ\82¨å¸\8cæ\9c\9bå\9c¨å®\89è£\9dç\9a\84é\81\8eç¨\8b中è\87ªå\8b\95建ç«\8bæ\96°ç\9a\84è³\87æ\96\99庫ï¼\8cè«\8bæ\8f\90ä¾\9bå\85·æ\9c\89 SYSDBA æ¬\8aé\99\90ç\9a\84帳è\99\9f並ä¸\94æ\8f\90ä¾\9bæ\9cªä¾\86è¦\81給網é \81å­\98å\8f\96使ç\94¨ç\9a\84è³\87æ\96\99庫帳è\99\9få\8f\8aå¯\86碼ã\80\82æ\88\96è\80\85æ\82¨å\8f¯ä»¥æ\89\8bå\8b\95建ç«\8b給網é \81å­\98å\8f\96使ç\94¨ç\9a\84è³\87æ\96\99庫帳è\99\9f (è«\8b確ä¿\9d該帳è\99\9fæ\9c\89建ç«\8b Schema Object ç\9a\84æ¬\8aé\99\90)ï¼\8cå\86\8dä¸\8dç\84¶æ\82¨å\8f¯ä»¥æ\8f\90ä¾\9bå\85©çµ\84ä¸\8då\90\8cç\9a\84帳è\99\9fï¼\8cä¸\80çµ\84ç\94¨ä¾\86建ç«\8bæ¬\8aé\99\90ï¼\8cè\80\8cå\8f¦ä¸\80çµ\84ç\94¨ä¾\86å\81\9aç\82ºç¶²é \81å­\98å\8f\96使ç\94¨ã\80\82\n\næ\9c¬æ¬¡å®\89è£\9d建ç«\8bç\9a\84帳è\99\9f以å\8f\8aæ¬\8aé\99\90æ\89\80é\9c\80è¦\81ç\9a\84 Scriptï¼\8cå\8f¯ä»¥å\9c¨ \"maintenance/oracle/\" ä¸­æ\89¾å\88°ã\80\82\nè«\8b注æ\84\8fï¼\8cè\8b¥æ\82¨ä½¿ç\94¨æ\9c\89é\99\90å\88¶ç\9a\84帳è\99\9få°\87æ\9c\83é \90設é\97\9cé\96\89所有維護性功能。",
+       "config-db-install-account": "安裝程序使用的使用者帳號",
        "config-db-username": "資料庫使用者名稱:",
        "config-db-password": "資料庫密碼:",
-       "config-db-password-empty": "請為新數據庫用戶$1輸入密碼。儘管您可以創建不使用密碼的用戶,但這樣做並不安全。",
-       "config-db-install-username": "請輸入在安裝過程中用於連接數據庫的用戶名。請勿輸入MediaWiki帳號的用戶名,請輸入您數據庫的用戶名。",
-       "config-db-install-password": "請輸入在安裝過程中用於連接數據庫的密碼。請勿輸入MediaWiki帳號的密碼,請輸入您數據庫的密碼。",
-       "config-db-install-help": "請輸入在安裝過程中用於連接數據庫的用戶名和密碼。",
-       "config-db-account-lock": "在普通操作中使用相同的用戶名和密碼",
-       "config-db-wiki-account": "用於普通操作的用戶帳號",
-       "config-db-wiki-help": "輸入在普通的wiki操作中(安裝完成後)將用於連接數據庫的用戶名和密碼。如果該帳號並不存在,而安裝帳號具有足夠的權限,該用戶帳號會被自動創建,並被賦予足以運行此wiki的最低權限。",
-       "config-db-prefix": "數據庫表前綴:",
-       "config-db-prefix-help": "如果您需要在多個wiki之間(或在MediaWiki與其他web應用程序之間)共享一個數據庫,您可以通過添加前綴的方式來避免出現表名稱的衝突。請勿使用空格。\n\n此字段通常可留空。",
-       "config-db-charset": "數據庫字符集",
-       "config-charset-mysql5-binary": "MySQL 4.1/5.0 二進制",
-       "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
-       "config-charset-mysql4": "MySQL 4.0 UTF-8(向後兼容)",
-       "config-charset-help": "'''警告:'''如果您在MySQL 4.1+中使用'''向後兼容的UTF-8'''字符集,並在之後使用<code>mysqldump</code>備份了數據庫,則可能損壞所有的非ASCII字符,從而不可逆地破壞您的備份!\n\n在'''二進制模式'''下,MediaWiki會將UTF-8編碼的文本存於數據庫的二進制字段中。相對於MySQL的UTF-8模式,這種方法效率更高,並允許您使用全範圍的Unicode字符。\n\n在'''UTF-8模式'''下,MySQL將知道您數據使用的字符集,並能適當地提供和轉換內容。但這樣做您將無法在數據庫中存儲[//zh.wikipedia.org/wiki/基本多文種平面 基本多文種平面]以外的字符。",
-       "config-mysql-old": "需要MySQL $1或更新的版本,您的版本為$2。",
-       "config-db-port": "數據庫端口:",
-       "config-db-schema": "MediaWiki的數據庫模式",
-       "config-db-schema-help": "此數據庫模式通常是正確的,請在有明確需求時才改動之。",
-       "config-pg-test-error": "無法連接到數據庫'''$1''':$2",
+       "config-db-password-empty": "請輸入新增資料庫使用者 $1 的密碼。\n雖然您可以不設定任何密碼,但這樣做並不安全。",
+       "config-db-username-empty": "您必須輸入 \"{{int:config-db-username}}\" 欄位的內容。",
+       "config-db-install-username": "請輸入在安裝過程中用來連線資料庫的使用者名稱。\n請注意,這不是 MediaWiki 帳號的使用者名稱,這是您資料庫的使用者名稱。",
+       "config-db-install-password": "請輸入在安裝過程中用來連線資料庫的密碼。\n請注意,這不是 MediaWiki 帳號的密碼,這是您資料庫的密碼。",
+       "config-db-install-help": "請輸入在安裝過程中用來連線資料庫的使用者名稱及密碼。",
+       "config-db-account-lock": "在一般操作時使用同樣的使用者名稱及密碼。",
+       "config-db-wiki-account": "用於一般操作的使用者帳號",
+       "config-db-wiki-help": "請輸入一般操作用來連線資料庫的使用者名稱及密碼。\n若您安裝使用的資料庫帳號有足夠的權限,您可以輸入新的帳號,系統會自動幫您以最低權限建立一組專門做為 Wiki 一般操作的帳號。",
+       "config-db-prefix": "資料庫資料表名稱的字首:",
+       "config-db-prefix-help": "如果您需要讓多個 Wiki 共用同一個資料庫,或者與其他網頁應用程式共用一個資料庫,您也許會需要在所有資料表的名稱前面加上字首,可以避免資料表名稱的衝突。\n請勿使用空格。\n\n此欄位可不填。",
+       "config-db-charset": "資料庫字元集",
+       "config-charset-mysql5-binary": "MySQL 4.1/5.0 可用的二進制",
+       "config-charset-mysql5": "MySQL 4.1/5.0 可用的 UTF-8",
+       "config-charset-mysql4": "向下相容 MySQL 4.0 的 UTF-8",
+       "config-charset-help": "<strong>警告:</strong>如果您在 MySQL 4.1+ 使用了<strong>可向下相容的 UTF-8</strong>,並且透過 <code>mysqldump</code> 指令備份資料庫,可能會破壞所有非 ASCII 字元集的文字,這會導致不可還原的資料破壞!\n\n在 <strong>二進制模式</strong> 下,MediaWiki 將 UTF-8 的文字儲存在二進位型態的欄位。\n這個模式比 MySQL 的 UTF-8 模式還要更有效,並且可以讓您使用完整的 Unicode 字元集。\n在 <storng>UTF-8 模式</strong> 下,MySQL 可以知道您的資料使用何種編碼儲存,您可以正常的取得與轉換內容,但此個模式只支援到 Unicode 中的  [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes 基本多文種平面] 字元。",
+       "config-mysql-old": "需要使用 MySQL $1 或更新的版本,您的版本為 $2。",
+       "config-db-port": "資料庫埠號:",
+       "config-db-schema": "MediaWiki 的 Schema:",
+       "config-db-schema-help": "資料庫 Schema 通常不需更動。\n只在有特殊需求時才需修改。",
+       "config-pg-test-error": "無法連線到資料庫 <strong>$1</strong>:$2",
        "config-sqlite-dir": "SQLite 的資料目錄:",
-       "config-sqlite-dir-help": "SQLite會將所有的數據存儲於單一文件中。\n\n您所提供的目錄必須在安裝過程中對網頁服務器可寫。\n\n該目錄'''不應'''允許通過web訪問,因此我們不會將數據文件和PHP文件放在一起。\n\n安裝程序在創建數據文件時,亦會在相同目錄下創建<code>.htaccess</code>以控制權限。假若此等控制失效,則可能會將您的數據文件暴露於公共空間,讓他人可以獲取用戶數據(電子郵件地址、雜湊後的密碼)、被刪除的版本以及其他在wiki上被限制訪問的數據。\n\n請考慮將數據庫統一放置在某處,如<code>/var/lib/mediawiki/yourwiki</code>下。",
-       "config-oracle-def-ts": "默認表空間:",
-       "config-oracle-temp-ts": "臨時表空間:",
-       "config-type-mysql": "MySQL(或兼容程式)",
-       "config-support-info": "MediaWiki支持以下數據庫系統:\n\n$1\n\n如果您在下面列出的數據庫系統中沒有找到您希望使用的系統,請根據上方鏈向的指引啟用支持。",
-       "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL]是用於MediaWiki的主要目標和最佳支援。MediaWiki也可工作於[{{int:version-db-mariadb-url}} MariaDB]和[{{int:version-db-percona-url}} Percona伺服器],當然是兼容MySQL的程式。([http://www.php.net/manual/en/mysqli.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 Server]是一種用於商業企業的資料庫。([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": "甲骨文設定",
-       "config-invalid-db-type": "無效的資料庫類型",
-       "config-missing-db-name": "您必須為“數據庫名稱”輸入內容",
-       "config-missing-db-host": "您必須為“數據庫主機”輸入內容",
-       "config-missing-db-server-oracle": "您必須為“數據庫透明網絡底層(TNS)”輸入內容",
-       "config-invalid-db-server-oracle": "無效的數據庫TNS「$1」。\n請只使用「TNS Name」或「Easy Connect」 字串([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle命名法])",
-       "config-invalid-db-name": "無效的數據庫名稱“$1”。請只使用ASCII字母(a-z、A-Z)、數字(0-9)、下劃線(_)和連字號(-)。",
-       "config-invalid-db-prefix": "無效的數據庫前綴“$1”。請只使用ASCII字母(a-z、A-Z)、數字(0-9)、下劃線(_)和連字號(-)。",
-       "config-connection-error": "$1。\n\n請檢查下列的主機、用戶名和密碼設置後重試。",
-       "config-invalid-schema": "無效的MediaWiki數據庫模式“$1”。請只使用ASCII字母(a-z、A-Z)、數字(0-9)和下劃線(_)。",
-       "config-db-sys-create-oracle": "安裝程序僅支持使用SYSDBA帳戶創建新帳戶。",
-       "config-db-sys-user-exists-oracle": "用戶帳戶“$1”已經存在。SYSDBA僅可用於創建新帳戶!",
-       "config-postgres-old": "需要PostgreSQL $1或更新的版本,您的版本為$2。",
-       "config-sqlite-name-help": "請為您的wiki指定一個用於標識的名稱。請勿使用空格或連字號,該名稱將被用作SQLite的數據文件名。",
-       "config-sqlite-parent-unwritable-group": "由於父目錄<code><nowiki>$2</nowiki></code>對網頁服務器不可寫,無法創建數據目錄<code><nowiki>$1</nowiki></code>。\n\n安裝程序已確定您網頁伺服器所使用的用戶。請將<code><nowiki>$3</nowiki></code>目錄設為對該用戶可寫以繼續安裝過程。在Unix/Linux系統中,您可以逐行輸入下列命令:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
-       "config-sqlite-parent-unwritable-nogroup": "由於父目錄<code><nowiki>$2</nowiki></code>對網頁服務器不可寫,無法創建數據目錄<code><nowiki>$1</nowiki></code>。\n\n安裝程序無法確定您網頁服務器所使用的用戶。請將<code><nowiki>$3</nowiki></code>目錄設為全局可寫(對所有用戶)以繼續安裝過程。在Unix/Linux系統中,您可以逐行輸入下列命令:\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
-       "config-sqlite-mkdir-error": "創建數據目錄“$1”時發生錯誤。請檢查路徑後重試。",
-       "config-sqlite-dir-unwritable": "無法寫入目錄“$1”。請修改該目錄的權限,使其對網頁服務器可寫後重試。",
-       "config-sqlite-connection-error": "$1。\n\n請檢查下列的數據目錄和數據庫名稱後重試。",
-       "config-sqlite-readonly": "文件<code>$1</code>不可寫。",
-       "config-sqlite-cant-create-db": "無法創建數據文件<code>$1</code>。",
-       "config-sqlite-fts3-downgrade": "PHP缺少FTS3支持,正在降級數據表",
-       "config-can-upgrade": "在數據庫中發現了MediaWiki的數據表。要將它們升級至MediaWiki $1,請點擊'''繼續'''。",
-       "config-upgrade-done": "升級完成。\n\n現在您可以[$1 開始使用您的wiki]了。\n\n如果您需要重新生成<code>LocalSettings.php</code>文件,請點擊下面的按鈕。除非您的wiki出現了問題,我們'''不推薦'''您執行此操作。",
-       "config-upgrade-done-no-regenerate": "升級完成。\n\n現在您可以[$1 開始使用您的wiki]了。",
-       "config-regenerate": "重新生成LocalSettings.php →",
-       "config-show-table-status": "查詢<code>SHOW TABLE STATUS</code>失敗!",
-       "config-unknown-collation": "'''警告:'''數據庫使用了無法識別的整理。",
-       "config-db-web-account": "供網頁訪問使用的數據庫帳號",
-       "config-db-web-help": "請指定在wiki執行普通操作時,網頁服務器用於連接數據庫服務器的用戶名和密碼。",
-       "config-db-web-account-same": "使用和安裝程序相同的帳號",
-       "config-db-web-create": "建立帳號,如果它不存在",
-       "config-db-web-no-create-privs": "您指定給安裝程序的帳號缺少創建帳號的權限,因此您指定的帳號必須已經存在。",
-       "config-mysql-engine": "存儲引擎:",
+       "config-sqlite-dir-help": "SQLite 會將所有的資料存儲於單一檔案中。\n\n您所提供的目錄在安裝過程中必須開啟給網頁伺服器的寫入權限。\n\n該目錄 <strong>不應</strong> 可以被透過網頁所開啟,這也是為什麼我們不將資料與 PHP 檔案放在一起。\n\n安裝程式在建立資料庫檔案時,會同時在目錄下建立 <code>.htaccess</code> 以控制網頁伺服器權限。若此設定失效,則會導致任何人可以直接存取您的原始資料檔案,而資料庫的內容包含原始的使用者資料 (電子郵件地址、加密後的密碼)、刪除後的修訂及其他在 Wiki 上被限制存取的資料。\n\n請考慮將資料庫統一放置在某處,如 <code>/var/lib/mediawiki/yourwiki</code> 底下。",
+       "config-oracle-def-ts": "預設資料表空間:",
+       "config-oracle-temp-ts": "臨時資料表空間:",
+       "config-type-mysql": "MySQL (或與其相容的程式)",
+       "config-type-mssql": "Microsoft SQL Server",
+       "config-support-info": "MediaWiki 支援以下資料庫系統:\n\n$1\n\n如果您下方沒有看到您要使用的資料庫系統,請根據上方連結指示開啟資料庫的支援。",
+       "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] 是 MediaWiki 主要支援的資料庫系統。MediaWiki 也同時可運作與於 [{{int:version-db-mariadb-url}} MariaDB] 和[{{int:version-db-percona-url}} Percona 伺服器],上述這些與 MySQL 相容的資料庫系統。([http://www.php.net/manual/en/mysqli.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] 是一套輕量級的資料庫系統,MediaWiki 可在此資料庫系統上良好的運作。([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 Server] 是一套 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": "Microsoft SQL Server 設定",
+       "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": "無效的資料庫 TNS \"$1\"。\n請使用符合 \"TNS 名稱\" 或 \"簡易連線\" 規則的字串([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle命名規則])",
+       "config-invalid-db-name": "無效的資料庫名稱 \"$1\"。\n僅允許使用 ASCII 字母(a-z、A-Z)、數字(0-9)、底線(_)與連字號(-)。",
+       "config-invalid-db-prefix": "無效的資料庫字首 \"$1\"。\n僅允許使用 ASCII 字母(a-z、A-Z)、數字(0-9)、底線(_)與連字號(-)。",
+       "config-connection-error": "$1。\n\n請檢查主機、使用者名稱和密碼設定,然後重試。",
+       "config-invalid-schema": "無效的資料庫 Schema \"$1\"。\n僅允許使用 ASCII 字母(a-z、A-Z)、數字(0-9)、底線(_)與連字號(-)。",
+       "config-db-sys-create-oracle": "安裝程式只支援使用 SYSDBA 帳號建立新帳號。",
+       "config-db-sys-user-exists-oracle": "使用者帳號 \"$1\" 已存在。 SYSDBA 只可用來建立新的帳號!",
+       "config-postgres-old": "需要使用 PostgreSQL $1 或更新的版本,您的版本為 $2。",
+       "config-mssql-old": "需要使用 Microsoft SQL Server $1 或更新的版本,您的版本為 $2。",
+       "config-sqlite-name-help": "請為您的 Wiki 設定一個用來辨識的名稱。\n請勿使用空格或連字號,\n該名稱會被用來做為 SQLite 資料檔的名稱。",
+       "config-sqlite-parent-unwritable-group": "無法建立資料目錄 <nowiki>$1</nowiki></code>,因網頁伺服器對該目錄所在的上層目錄 <code><nowiki>$2</nowiki></code> 沒有寫入權限。\n\n安裝程序所使用的身份依據您用來執行網頁伺服器的身份而定,\n請開啟網頁伺服器對 <code><nowiki>$3</nowiki></code> 的寫入權以繼續安裝,\n在 Unix/Linux 系統可以執行以下指令:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
+       "config-sqlite-parent-unwritable-nogroup": "無法建立資料目錄 <nowiki>$1</nowiki></code>,因網頁伺服器對該目錄所在的上層目錄 <code><nowiki>$2</nowiki></code> 沒有寫入權限。\n\n安裝程序所使用的身份依據您用來執行網頁伺服器的身份而定,\n請開啟全部人對 <code><nowiki>$3</nowiki></code> 的寫入權以繼續安裝,\n在 Unix/Linux 系統可以執行以下指令:\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
+       "config-sqlite-mkdir-error": "建立資料目錄 \"$1\" 時發生錯誤。\n請檢查路徑後再試一次。",
+       "config-sqlite-dir-unwritable": "無法寫入目錄 \"$1\"。\n請修改該目錄的權限,請開啟網頁伺服器的寫入權限後,再試一次。",
+       "config-sqlite-connection-error": "$1。\n\n請檢查下方資料目錄與資料庫名稱,再試一次。",
+       "config-sqlite-readonly": "檔案 <code>$1</code> 無寫入權限。",
+       "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-no-regenerate": "升級完成。\n\n現在您可以 [$1 開始使用您的 Wiki] 了。",
+       "config-regenerate": "重新產生 LocalSettings.php →",
+       "config-show-table-status": "<code>SHOW TABLE STATUS</code> 查詢失敗!",
+       "config-unknown-collation": "<strong>警告:</strong>資料庫使用了無法辨識的字元與排序規則。",
+       "config-db-web-account": "供網頁存取使用的資料庫帳號",
+       "config-db-web-help": "請設定網頁伺服器在一般操作時連線到資料庫使用的使用者名稱及密碼。",
+       "config-db-web-account-same": "使用與安裝程序相同的帳號",
+       "config-db-web-create": "如果帳號不存在則建立新帳號",
+       "config-db-web-no-create-privs": "您指定給安裝程序使用的帳號沒有足夠的權限建立新帳號。\n在此處必須指定已經存在的帳號。",
+       "config-mysql-engine": "儲存引擎:",
        "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貌似於此伺服器為唯一可用存儲程式,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-myisam-dep": "<strong>警告:</strong>您選擇用來做為 MySQL 的儲存引撆 MyISAM 並不建議使用在 MediaWiki,主要原因為:\n* MyISAM 使用的資料表鎖定較無法承受多人同時連線\n* 比起其他儲存引擎相,它較容易損壞\n* MediaWiki 程式碼並沒有針對 MyISAM 做特別的處理\n\n若您安裝的 MySQL 支援 InnoDB,我們強烈建議您改用 InnoDB。\n若您安裝的 MySQL 不支援 InnoDB,則應考慮升級 MySQL。",
+       "config-mysql-only-myisam-dep": "<strong>警告:</strong>您的伺服器上的 MySQL 唯一可用的儲存引擎是 MyISAM,但並不建議使用,主要原因為:\n* MyISAM 使用的資料表鎖定較無法承受多人同時連線\n* 比起其他儲存引擎相,它較容易損壞\n* MediaWiki 程式碼並沒有針對 MyISAM 做特別的處理\n\n若您安裝的 MySQL 不支援 InnoDB,則應考慮升級 MySQL。",
+       "config-mysql-engine-help": "由於對同時連線有較好的處理能力,<strong>InnoDB</strong> 通常是最佳的選項。\n\n<strong>MyISAM</strong> 只在單人使用或者唯讀作業的情況之下才可能有較快的處理能力。\n相較於 InnoDB,MyISAM 也較容易出現資料損毀的情況。",
+       "config-mysql-charset": "資料庫字集:",
        "config-mysql-binary": "二進制",
        "config-mysql-utf8": "UTF-8",
-       "config-mysql-charset-help": "在'''二進制模式'''下,MediaWiki會將UTF-8編碼的文本存於數據庫的二進制字段中。相對於MySQL的UTF-8模式,這種方法效率更高,並允許您使用全範圍的Unicode字符。\n\n在'''UTF-8模式'''下,MySQL將知道您數據使用的字符集,並能適當地提供和轉換內容。但這樣做您將無法在數據庫中存儲[//zh.wikipedia.org/wiki/基本多文種平面 基本多文種平面]以外的字符。",
-       "config-site-name": "Wiki的名稱:",
-       "config-site-name-help": "填入的內容會出現在瀏覽器的標題欄以及其他多處位置中。",
-       "config-site-name-blank": "輸入站點名稱。",
-       "config-project-namespace": "項目名字空間:",
-       "config-ns-generic": "項目",
-       "config-ns-site-name": "與wiki名稱相同:$1",
-       "config-ns-other": "其他(請註明)",
-       "config-ns-other-default": "我的Wiki",
-       "config-project-namespace-help": "依循維基百科形成的慣例,許多wiki將他們的方針頁面存放在與內容頁面不同的“'''項目名字空間'''”中。所有位於該名字空間下的頁面標題都會被冠以固定的前綴,您可以在此處指定這一前綴。傳統上,這一前綴應與wiki的命名保持一致,但請勿在其中使用標點符號,如“#”或“:”。",
-       "config-ns-invalid": "指定的名字空間“<nowiki>$1</nowiki>”無效,請為項目名字空間指定其他名稱。",
-       "config-ns-conflict": "指定的名字空間“<nowiki>$1</nowiki>”與默認的MediaWiki名字空間衝突。請指定一個不同的項目名字空間。",
+       "config-mysql-charset-help": "在 <strong>二進制模式</strong> 下,MediaWiki 將 UTF-8 的文字儲存在二進位型態的欄位。\n這個模式比 MySQL 的 UTF-8 模式還要更有效,並且可以讓您使用完整的 Unicode 字元集。\n\n在 <storng>UTF-8 模式</strong> 下,MySQL 可以知道您的資料使用何種編碼儲存,您可以正常的取得與轉換內容,但此個模式只支援到 Unicode 中的  [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes 基本多文種平面] 字元。",
+       "config-mssql-auth": "身份驗證類型:",
+       "config-mssql-install-auth": "請選擇安裝程序中要用來連線資料庫使用的身份驗證類型。\n若您選擇 \"{{int:config-mssql-windowsauth}}\",不論網頁伺服器是使用何種身份執行都會使用這組驗證資料。",
+       "config-mssql-web-auth": "請選擇一般操作中要用來連線資料庫使用的身份驗證類型。\n若您選擇 \"{{int:config-mssql-windowsauth}}\",不論網頁伺服器是使用何種身份執行都會使用這組驗證資料。",
+       "config-mssql-sqlauth": "SQL Server 身份驗證",
+       "config-mssql-windowsauth": "Windows 身份驗證",
+       "config-site-name": "Wiki 的名稱:",
+       "config-site-name-help": "您所填入的內容會出現在瀏覽器的標題列以及各種其他地方。",
+       "config-site-name-blank": "請輸入網站名稱。",
+       "config-project-namespace": "專案命名空間:",
+       "config-ns-generic": "專案",
+       "config-ns-site-name": "同 Wiki 名稱:$1",
+       "config-ns-other": "其他 (請註明)",
+       "config-ns-other-default": "我的 Wiki",
+       "config-project-namespace-help": "許多 Wiki 以維基百科(Wikipedia)做為範例將政策頁面從內容頁面抽離,放置在 \"'''專案命名空間'''\" 中。\n所有在此命名空間裡的頁面都會有特定的字首,您可以在此處設定。\n通常這些字首是由該 Wiki 的名稱所衍伸出來,但無法使用標點符號,如 \"#\" 或 \":\"。",
+       "config-ns-invalid": "您指定的命名空間 \"<nowiki>$1</nowiki>\" 無效,\n請指定另一個專案命名空間。",
+       "config-ns-conflict": "您指定的命名空間 \"<nowiki>$1</nowiki>\" 與 MediaWiki 預設的命名空間衝突。\n請指定另一個專案命名空間。",
        "config-admin-box": "管理員帳號",
-       "config-admin-name": "您的用戶名:",
+       "config-admin-name": "您的使用者名稱:",
        "config-admin-password": "密碼:",
        "config-admin-password-confirm": "再次輸入密碼:",
-       "config-admin-help": "在此輸入您想使用的用戶名,例如“喬幫主”。您將使用該名稱登錄本wiki。",
+       "config-admin-help": "在此輸入您想使用的使用者名稱,例如 \"Joe Bloggs\"。\n此名稱將用來登入 Wiki。",
        "config-admin-name-blank": "輸入管理員的使用者名稱。",
-       "config-admin-name-invalid": "指定的用戶名“<nowiki>$1</nowiki>”無效,請指定其他用戶名。",
+       "config-admin-name-invalid": "指定的使用者名稱 \"<nowiki>$1</nowiki>\" 無效,請改用其他使用者名稱。",
        "config-admin-password-blank": "輸入管理員帳號密碼。",
        "config-admin-password-mismatch": "兩次輸入的密碼並不相同。",
-       "config-admin-email": "電郵地址:",
-       "config-admin-email-help": "輸入電子郵件地址後,您可以收到此wiki上其他用戶發來的電子郵件,並能重置您的密碼,還可在監視列表中頁面被更改時收到郵件通知。您可以將此字段留空。",
-       "config-admin-error-user": "å\9c¨å\89µå»ºç\94¨æ\88¶å\90\8dç\82ºâ\80\9c<nowiki>$1</nowiki>â\80\9dç\9a\84管ç\90\86å\93¡å¸³è\99\9fæ\99\82ç\99¼ç\94\9f內部錯誤。",
-       "config-admin-error-password": "在為管理員“<nowiki>$1</nowiki>”設置密碼時發生內部錯誤:<pre>$2</pre>",
-       "config-admin-error-bademail": "你輸入了一個無效的電子郵件地址。",
-       "config-subscribe": "訂閱[https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce 發行公告郵件列表]。",
-       "config-subscribe-help": "此低流量的郵件列表僅用於發行公告,其中包括重要安全公告。請訂閱該列表以便在新的版本推出時升級您的MediaWiki。",
-       "config-subscribe-noemail": "您選擇了訂閱發行公告郵件列表,但沒有提供電子郵件地址。請提供一個電子郵件地址以訂閱郵件列表。",
-       "config-almost-done": "æ\82¨å¹¾ä¹\8eå·²ç¶\93å®\8cæ\88\90äº\86ï¼\81ç\8f¾å\9c¨æ\82¨å\8f¯ä»¥è·³é\81\8eå\89©ä¸\8bç\9a\84é\85\8dç½®æµ\81ç¨\8b並ç«\8bå\8d³å®\89è£\9dwiki。",
+       "config-admin-email": "電子郵件位址:",
+       "config-admin-email-help": "在此輸入的電子郵件信箱可用來接收 Wiki 上其他使用者所發送的訊息、重設您的密碼與通知監視列表中頁面更動。您可將此欄位留空。",
+       "config-admin-error-user": "建ç«\8b管ç\90\86å\93¡å¸³è\99\9f \"<nowiki>$1</nowiki>\" æ\99\82ç\99¼é\80\81內部錯誤。",
+       "config-admin-error-password": "設定管理員 \"<nowiki>$1</nowiki>\" 的密碼時發送內部錯誤:<pre>$2</pre>",
+       "config-admin-error-bademail": "您輸入了不正確的電子郵件地址。",
+       "config-subscribe": "訂閱 [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce 發佈公告郵寄清單]。",
+       "config-subscribe-help": "這是一個用於發佈公告的低郵件量郵寄清單,內容包括重要的安全公告。\n您應該訂閱它並在 MediaWiki 發佈新版的時候更新系統。",
+       "config-subscribe-noemail": "您正嘗試不填寫電子郵件地址訂閱發佈公告郵寄清單。 \n請如果您希望訂閱郵寄清單,請提供一個有效的電子郵件地址。",
+       "config-almost-done": "æ\82¨å¿«è¦\81å®\8cæ\88\90äº\86!\næ\82¨ç\8f¾å\9c¨å\8f¯ä»¥è·³é\81\8eå\85¶é¤\98ç\9a\84設å®\9aé \85ç\9b®ä¸¦ä¸\94ç«\8bå\8d³å®\89è£\9d Wiki。",
        "config-optional-continue": "多問我一些問題吧。",
-       "config-optional-skip": "æ\88\91å·²ç¶\93ä¸\8dè\80\90ç\85©äº\86ï¼\8cè\95ç·\8aå®\89è£\9dæ\88\91ç\9a\84wiki。",
-       "config-profile": "用戶權限配置:",
-       "config-profile-wiki": "開放的wiki",
+       "config-optional-skip": "æ\88\91å·²ç¶\93ä¸\8dè\80\90ç\85©äº\86ï¼\8cè«\8bè¶\95ç·\8aå®\89è£\9d Wiki。",
+       "config-profile": "使用者權限基本資料:",
+       "config-profile-wiki": "開放式 Wiki",
        "config-profile-no-anon": "需要註冊帳號",
-       "config-profile-fishbowl": "編輯受限",
-       "config-profile-private": "非公開wiki",
-       "config-profile-help": "如果您允許盡量多的人編寫維基,網站上的內容會更加豐富。在MediaWiki中,您可以輕鬆地審查最近更改,並輕易回退掉新手或破壞者造成的損害。\n\n然而,許多人覺得讓MediaWiki存在多種角色將更加好用;同時,要說服所有人都願以維基方式作貢獻並非一件易事。因此,您有以下選擇:\n\n'''{{int:config-profile-wiki}}'''允許包括未登錄用戶在內的所有人編輯。'''{{int:config-profile-no-anon}}'''的維基需要額外的註冊流程,這有可能會阻礙隨意貢獻者。\n\n'''{{int:config-profile-fishbowl}}'''模式只允許獲批准的用戶編輯,但對公眾開放頁面瀏覽(包括歷史記錄)。'''{{int:config-profile-private}}'''則只允許獲批准的用戶瀏覽、編輯頁面。\n\n安裝完成後,您還可以對用戶權限進行更多、更複雜的配置,參見[//www.mediawiki.org/wiki/Manual:User_rights 相關的使用手冊]。",
-       "config-license": "版權和許可證:",
-       "config-license-none": "頁腳無許可證",
-       "config-license-cc-by-sa": "知識共享署名-相同方式分享",
-       "config-license-cc-by": "知識共享署名",
-       "config-license-cc-by-nc-sa": "知識共享署名-非商業性使用-相同方式共享",
-       "config-license-cc-0": "知識共享Zero(公有領域)",
-       "config-license-gfdl": "GNU自由文檔許可證1.3或更高版本",
+       "config-profile-fishbowl": "僅授權的編輯者",
+       "config-profile-private": "封閉式 Wiki",
+       "config-profile-help": "Wiki 最佳的運作方式是盡可能讓大家都可以編輯文件。\n在 MediaWiki,可以很輕易的審查最近做的所有變更動作,並且可以還原由新手或惡意使用者造成的損害。\n\n不論如何,很多人發現 MediaWiki 可以廣泛的運用在各種地方,但並不是很容易可以說服每個人都遵守對 Wiki 有益的方式。\n所以您必須做出以下選擇。\n\n使用 <strong>{{int:config-profile-wiki}}</strong> 模式,允許所有人編輯文章,包含未匿名使用者。\n使用 <strong>{{int:config-profile-no-anon}}</strong> 模式,允許所有人編輯文章,不包含未登入的使用者。此模式較能管理所有使用者的言論,但會扼殺臨時使用者的貢獻機會。\n\n使用 <strong>{{int:config-profile-fishbowl}}</strong> 模式,僅經核准的使用者可以編輯,所有人可以檢視頁面,包含修訂的記錄。\n使用 <strong>{{int:config-profile-private}}</strong> 模式,僅經核准的使用者可以編輯、檢視頁面。\n\n有關更多複雜的使用者權限設定可在安裝程序結束後設定,請參考 [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights 相關文件說明]。",
+       "config-license": "版權聲明與授權條款:",
+       "config-license-none": "無授權條款頁腳",
+       "config-license-cc-by-sa": "創作共用 姓名標示-相同方式分享",
+       "config-license-cc-by": "創作共用 Attribution",
+       "config-license-cc-by-nc-sa": "創作共用 Attribution-NonCommercial-ShareAlike",
+       "config-license-cc-0": "創作共用 Zero (公共領域)",
+       "config-license-gfdl": "GNU 自由文件授權條款 1.3 或更高版本",
        "config-license-pd": "公共領域",
-       "config-license-cc-choose": "選擇自定義的知識共享許可證",
-       "config-license-help": "許多公共wiki會以[http://freedomdefined.org/Definition 自由許可證]的方式釋放出編者的所有貢獻。這有助於構建社區的主人翁意識,並能鼓勵長期貢獻。對於非公共wiki或公司wiki,這並非必要條件。\n\n如果您希望使用來自維基百科的內容,並希望維基百科能接受複製自您的wiki的內容,請選擇'''知識共享署名-相同方式共享'''。\n\nGNU自由文檔許可證是維基百科曾經使用過的許可證,並迄今有效。然而,該許可證難以理解,並會增加重用內容的難度。",
+       "config-license-cc-choose": "請選擇一個自訂的創作共用授權條款",
+       "config-license-help": "許多開放式 Wiki 會以 [http://freedomdefined.org/Definition 自由授權條款] 的方式釋放出編者的所有貢獻,這有助於構建社群的所有權,並且能鼓勵長期貢獻。對於封閉式的 Wiki 或公司 Wiki,則是非必要的。\n\n如果您希望使用來自維基百科(Wikipedia)的內容,並希望維基百科能接受您的 Wiki 內容,請應選擇 <strong>創作共用 Attribution Share Alike</strong> 授權條款。\n\n維基百科̽(Wikipedia)先前是使用 GNU 自由文件授權條款,\n但該授權條款的內容較難理解,因此較難再利用在該條款底下的內容。",
        "config-email-settings": "E-mail 設定",
-       "config-enable-email": "啟用出站電子郵件",
-       "config-enable-email-help": "如果您希望使用電子郵件功能,請正確配置[http://www.php.net/manual/en/mail.configuration.php PHP的郵件設定]。如果您不需要任何電子郵件功能,請在此處禁用它。",
-       "config-email-user": "啟用用戶到用戶的電子郵件",
-       "config-email-user-help": "允許所有用戶互發郵件,假若他們啟用了該功能。",
-       "config-email-usertalk": "啟用用戶討論頁通知",
-       "config-email-usertalk-help": "允許用戶收到用戶討論頁被修改的通知,假若他們啟用了該功能。",
-       "config-email-watchlist": "啟用監視列表通知",
-       "config-email-watchlist-help": "允許用戶收到與其監視列表有關的通知,假若他們啟用了該功能。",
-       "config-email-auth": "啟用電子郵件認證",
-       "config-email-auth-help": "如果啟用此選項,在用戶設置或修改電子郵件地址時,就會收到一封郵件,內含確認電子地址的鏈接。只有經過身份驗證的電子郵件地址,才能收到來自其他用戶的電子郵件,或任何修改通知的郵件。'''建議'''公開wiki啟用本選項,以防對電子郵件功能的濫用。",
-       "config-email-sender": "返回電子郵件地址:",
-       "config-email-sender-help": "輸å\85¥è¦\81ç\94¨ä¾\86ç\99¼é\80\81å\87ºç«\99é\9b»å­\90é\83µä»¶ç\9a\84å\9c°å\9d\80ï¼\8c該å\9c°å\9d\80å°\87æ\9c\83æ\94¶å\88°è¢«æ\8b\92æ\94¶ç\9a\84é\83µä»¶ã\80\82許å¤\9aé\83µä»¶æ\9c\8då\8b\99å\99¨è¦\81æ±\82å\9f\9få\90\8dé\83¨å\88\86å¿\85é \88æ\9c\89æ\95\88。",
+       "config-enable-email": "開啟外寄電子郵件",
+       "config-enable-email-help": "如果您要使用電子郵件功能,請正確設定 [http://www.php.net/manual/en/mail.configuration.php PHP 的郵件設定]。\n如果您不需要使用電子郵件功能,請在此處關閉。",
+       "config-email-user": "開啟使用者對使用者間的電子郵件互通",
+       "config-email-user-help": "若使用者在個人偏好開啟了此功能,則可允許使用者間相互發送郵件。",
+       "config-email-usertalk": "開啟使用者討論頁面通知",
+       "config-email-usertalk-help": "若使用者在個人偏好開啟了此功能,則可收到使用者討論頁面被修改的通知。",
+       "config-email-watchlist": "開啟監視列表通知",
+       "config-email-watchlist-help": "若使用者在個人偏好開啟了此功能,允許使用者收到與其監視列表有關的通知。",
+       "config-email-auth": "開啟電子郵件身份認證",
+       "config-email-auth-help": "若開啟此選項,使用者不論設定或者更改電子郵件地址,都必須透過收信的方式確認沒有問題。\n只有驗證過的電子郵件地址可以收到來自其他使用者或修改通知的信件。\n公開的 Wiki 會 <strong>建議</strong> 設定此選項,以防使用者濫用電子郵件功能。",
+       "config-email-sender": "電子郵件回覆地址:",
+       "config-email-sender-help": "è«\8b輸å\85¥è¦\81ç\94¨ä¾\86å\81\9aç\82ºå¤\96å¯\84é\83µä»¶ç\9a\84é\9b»å­\90é\83µä»¶å\9b\9eè¦\86å\9c°å\9d\80ã\80\82\n該é\83µä»¶å\9c°å\9d\80æ\9c\83æ\94¶å\88°è¢«æ\8b\92æ\94¶ç\9a\84信件ã\80\82\n許å¤\9aé\83µä»¶ä¼ºæ\9c\8då\99¨æ\9c\83è¦\81æ±\82使ç\94¨æ\9c\89æ\95\88ç\9a\84網å\9f\9få\90\8d稱。",
        "config-upload-settings": "圖片和檔案上傳",
-       "config-upload-enable": "啟用檔案上傳",
-       "config-upload-help": "æ\96\87件ä¸\8aå\82³å\8f¯è\83½æ\9c\83å°\87æ\82¨ç\9a\84æ\9c\8då\8b\99å\99¨æ\9a´é\9c²å\9c¨å®\89å\85¨é¢¨é\9aªä¸\8bã\80\82æ\9c\89é\97\9cæ\9b´å¤\9aç\9a\84ä¿¡æ\81¯ï¼\8cè«\8bå\8f\83é\96±æ\89\8bå\86\8aç\9a\84[//www.mediawiki.org/wiki/Manual:Security å®\89å\85¨é\83¨å\88\86\80\82\n\nè¦\81å\95\9fç\94¨æ\96\87件ä¸\8aå\82³ï¼\8cè«\8bå\85\88å°\87MediaWikiæ ¹ç\9b®é\8c\84ä¸\8bç\9a\84<code>images</code>å­\90ç\9b®é\8c\84æ\9b´æ\94¹ç\82ºå°\8dwebæ\9c\8då\8b\99å\99¨å\8f¯å¯«ï¼\8cç\84¶å¾\8cå\86\8då\95\9fç\94¨æ­¤選項。",
-       "config-upload-deleted": "å·²å\88ªé\99¤æ\96\87件的目錄:",
-       "config-upload-deleted-help": "指定用於存放被刪除文件的目錄。理想情況下,該目錄不應能通過web訪問。",
-       "config-logo": "標誌URL:",
-       "config-logo-help": "在MediaWiki的默認外觀中,左側欄菜單之上有一塊135x160像素的標誌區。請上傳一幅相應大小的圖像,並在此輸入URL。\n\n你可以用<code>$wgStylePath</code>或<code>$wgScriptPath</code>來表示相對於這些位置的路徑。\n\n如果您不希望使用標誌,請將本處留空。",
-       "config-instantcommons": "啟用即時共享資源",
-       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons 即時共享資源]可以讓wiki使用來自[//commons.wikimedia.org/ 維基共享資源]網站的圖像、音頻和其他媒體文件。要啟用該功能,MediaWiki必須能夠訪問互聯網。\n\n有關此功能的詳細信息,包括如何將其他wiki網站設為具有類似共享功能的方法,請參考[//mediawiki.org/wiki/Manual:$wgForeignFileRepos 手冊]。",
-       "config-cc-error": "知識共享許可證挑選器無法找到結果,請手動輸入許可證的名稱。",
-       "config-cc-again": "重新選取......",
-       "config-cc-not-chosen": "選擇您希望使用的知識共享許可證,並點擊“繼續”。",
-       "config-advanced-settings": "進階配置",
-       "config-cache-options": "對象緩存設置:",
-       "config-cache-help": "對象緩存可通過緩存頻繁使用的數據來提高MediaWiki的速度。高度推薦中到大型的網站啟用該功能,小型網站亦能從其中受益。",
-       "config-cache-none": "無緩存(不影響功能,但對較大型的wiki網站會有速度影響)",
-       "config-cache-accel": "PHP對象緩存(APC、XCache或WinCache)",
-       "config-cache-memcached": "使用Memcached(需要另外安裝並配置)",
-       "config-memcached-servers": "Memcached服務器:",
-       "config-memcached-help": "用於Memcached的IP地址列表。請保持每行一條,並指定要使用的端口。例如:\n127.0.0.1:11211\n192.168.1.25:1234",
-       "config-memcache-needservers": "您選擇了Memcached作為您的緩存,但並未指定任何服務器。",
-       "config-memcache-badip": "您為Memcached輸入了無效的IP地址:$1。",
-       "config-memcache-noport": "您沒有指定Memcached服務器的端口:$1。如果您不清楚端口是多少,默認值為11211。",
-       "config-memcache-badport": "Memcached的端口號應該在$1到$2之間。",
+       "config-upload-enable": "開啟檔案上傳",
+       "config-upload-help": "æª\94æ¡\88ä¸\8aå\82³å\8a\9fè\83½æ\9c\83è®\93æ\82¨ç\9a\84伺æ\9c\8då\99¨æ\9a´é\9c²å\9c¨æ½\9bè\97\8fç\9a\84å®\89å\85¨æ\80§é¢¨é\9aªä¹\8bä¸\8bã\80\82\nè¦\81å\8f\96å¾\97æ\9b´å¤\9aç\9b¸é\97\9cç\9a\84è³\87è¨\8aï¼\8cè«\8bå\8f\83è\80\83 [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security å®\89å\85¨æ\80§ç« ç¯\80\80\82\n\nè¦\81é\96\8bå\95\9fæª\94æ¡\88ä¸\8aå\82³é\9c\80è¦\81å°\87 MediaWiki æ ¹ç\9b®é\8c\84åº\95ä¸\8bç\9a\84 <code>images</code> ç\9b®é\8c\84é\96\8bå\95\9f網é \81伺æ\9c\8då\99¨ç\9a\84寫å\85¥æ¬\8aï¼\8c\nç\84¶å¾\8cå\86\8då\95\9få\8b\95選項。",
+       "config-upload-deleted": "å·²å\88ªé\99¤æª\94æ¡\88的目錄:",
+       "config-upload-deleted-help": "請選擇用來存放已刪除檔案的目錄。\n理想情況下,此目錄不可被網頁直接存取。",
+       "config-logo": "標誌 URL 位置:",
+       "config-logo-help": "在 MediaWiki 的預設介面,側欄選單上方有一塊 135x160 像素用來放置標誌的區域。\n請上傳合適大小的圖片並在此輸入 URL 網址。\n\n您可以透過 <code>$wgStylePath</code> 或者 <code>$wgScriptPath</code> 來表示您的圖片與這些路徑的相對位置。\n\n如果您不想使用標誌,可略過此欄位。",
+       "config-instantcommons": "開啟即時共享資源",
+       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons 即時共享資源] 是允許 Wiki 使用來自 [//commons.wikimedia.org/ Wikimedia Commons] 網站上的圖片、聲音以及其他媒體的一項功能。\n若要開啟此功能,您的 MediaWiki 必須能夠連線網際網路。\n更多有關此功能的訊息,包含如何存除了 Wikimedia Commons 之外其他網站的說明,請參考 \n[//www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos 操作手冊]。",
+       "config-cc-error": "查無該創作共用授權條款,\n請手動輸入您的授權條款名稱。",
+       "config-cc-again": "請重新選取...",
+       "config-cc-not-chosen": "請選擇您要使用的創作共享授權條款,然後點選 \"繼續\"。",
+       "config-advanced-settings": "進階設定",
+       "config-cache-options": "物件快取設定:",
+       "config-cache-help": "物件快取是用來增進 MediaWiki 速度的一項功能,透過快取經常使用的資料。\n中型到大型的網站我們會建議開啟這個選項,對小型的網站也有一定程度的效果。",
+       "config-cache-none": "不快取 (不會影響功能,但在大型 Wiki 網站可能會有處理速度的問題)",
+       "config-cache-accel": "使用 PHP 物件快取 (APC、XCache 或 WinCache)",
+       "config-cache-memcached": "使用 Memcached (需要額外安裝與設定)",
+       "config-memcached-servers": "Memcached 伺服器:",
+       "config-memcached-help": "請列出 Memcached 伺服器的 IP 位址。\n每一行只指定一個位置並且要註明使用的埠號,例如:\n 127.0.0.1:11211\n 192.168.1.25:1234",
+       "config-memcache-needservers": "您的快取類型選擇使用 Memcached,但並未設定任何的伺服器。",
+       "config-memcache-badip": "您輸入了一筆無效的 Memcached IP 位置:$1。",
+       "config-memcache-noport": "您沒有輸入 Memcached 伺服器的埠號:$1。\n如果您不曉得埠號為多少,預設為 11211。",
+       "config-memcache-badport": "Memcached 埠號應介於 $1 到 $2 之間。",
        "config-extensions": "擴充套件",
-       "config-extensions-help": "已在您的<code>./extensions</code>目錄中發現下列擴展。\n\n您可能要對它們進行額外的配置,但您現在可以啟用它們。",
-       "config-install-alreadydone": "'''警告:'''您似乎已經安裝了MediaWiki,並試圖重新安裝它。請前往下一個頁面。",
-       "config-install-begin": "點擊「{{int:config-continue}}」後,您將開始安裝MediaWiki。如果您還想對配置作一些修改,請點擊「{{int:config-back}}」。",
+       "config-extensions-help": "已在您的 <code>./extensions</code> 目錄中發現下列擴充套件。\n\n這些擴充套件可能需要做額外的設定,但您可以現在先開啟功能。",
+       "config-install-alreadydone": "<strong>警告:</strong>您已經安裝 MediaWiki,並且試圖重新安裝。\n請點繼續前往下一個頁面。",
+       "config-install-begin": "請點選 \"{{int:config-continue}}\" 開始安裝 MediaWiki。\n若您還想要修改設定,請點選 \"{{int:config-back}}\"。",
        "config-install-step-done": "完成",
        "config-install-step-failed": "失敗",
-       "config-install-extensions": "正在啟用擴展",
-       "config-install-database": "正在配置數據庫",
-       "config-install-schema": "å\89µå»ºæ\9e¶æ§\8b",
-       "config-install-pg-schema-not-exist": "PostgreSQL 架構不存在",
-       "config-install-pg-schema-failed": "創建數據表失敗。請確保用戶“$1”擁有寫入模式“$2”的權限。",
+       "config-install-extensions": "正在開啟擴充套件",
+       "config-install-database": "正在設定資料庫",
+       "config-install-schema": "建ç«\8b Schema",
+       "config-install-pg-schema-not-exist": "PostgreSQL Schema 不存在",
+       "config-install-pg-schema-failed": "資料表建立失敗。\n請確認使用者 \"$1\" 可以寫入 Schema \"$2\"。",
        "config-install-pg-commit": "提交更改",
-       "config-install-pg-plpgsql": "正在檢查PL/pgSQL語言",
-       "config-pg-no-plpgsql": "您需要為數據庫$1安裝PL/pgSQL語言",
-       "config-pg-no-create-privs": "為安裝程序指定的帳號缺少創建帳號的權限。",
-       "config-pg-not-in-role": "æ\82¨æ\8c\87å®\9aç\82ºwebç\94¨æ\88¶ç\9a\84帳æ\88¶å·²ç¶\93å­\98å\9c¨ã\80\82\næ\82¨çµ¦æ\9c¬ç¨\8båº\8fæ\8c\87å®\9aç\9a\84帳æ\88¶ä¸\8dæ\98¯è¶\85ç´\9aç\94¨æ\88¶ï¼\8cä¹\9fä¸\8dæ\98¯webç\94¨æ\88¶è§\92è\89²ç\9a\84æ\88\90å\93¡ï¼\8cæ\89\80以å®\83ä¸\8dè\83½å\89µå»ºwebç\94¨æ\88¶æ\89\80æ\93\81æ\9c\89ç\9a\84å°\8d象ã\80\82\n\nMediaWikiç\95¶å\89\8dé\9c\80è¦\81使ç\94¨ç\94±webç\94¨æ\88¶æ\89\80æ\9c\89ç\9a\84表ã\80\82è«\8bæ\8c\87å®\9aå\8f¦ä¸\80å\80\8bweb帳æ\88¶å\90\8d稱ï¼\8cæ\88\96é»\9eæ\93\8aâ\80\9cå¾\8cé\80\80â\80\9d並æ\8c\87å®\9aå\85·æ\9c\89é\81©ç\95¶æ¬\8aé\99\90ç\9a\84å®\89è£\9dç\94¨æ\88。",
-       "config-install-user": "æ­£å\9c¨å\89µå»ºæ\95¸æ\93\9a庫ç\94¨æ\88",
-       "config-install-user-alreadyexists": "用戶“$1”已存在",
-       "config-install-user-create-failed": "å\89µå»ºç\94¨æ\88¶â\80\9c$1â\80\9d失敗:$2",
-       "config-install-user-grant-failed": "授予用戶“$1”權限失敗:$2",
-       "config-install-user-missing": "指定的用戶“$1”不存在。",
-       "config-install-user-missing-create": "指定的用戶“$1”不存在。如果您想要創建一名,請點選“創建帳戶”下面的複選框。",
-       "config-install-tables": "æ­£å\9c¨å\89µå»ºæ\95¸æ\93\9a表",
-       "config-install-tables-exist": "'''警告''':MediaWiki的數據表似乎已經存在,跳過創建。",
-       "config-install-tables-failed": "'''錯誤''':創建數據表出錯,下為錯誤信息:$1",
-       "config-install-interwiki": "æ­£å\9c¨å¡«å\85\85é»\98èª\8dç\9a\84è·¨wikiæ\95¸æ\93\9a表",
-       "config-install-interwiki-list": "æ\89¾ä¸\8då\88°æ\96\87件<code>interwiki.list</code>。",
-       "config-install-interwiki-exists": "'''警告''':跨wiki數據表似乎已有內容,跳過默認列表。",
-       "config-install-stats": "初始化統計",
-       "config-install-keys": "ç\94\9fæ\88\90å¯\86鑰中",
-       "config-insecure-keys": "'''警告''':在安裝過程中生成的$2個安全密鑰($1)不一定安全。請考慮手動更改之。",
-       "config-install-sysop": "æ­£å\9c¨å\89µå»ºç®¡ç\90\86å\93¡ç\94¨æ\88帳號",
-       "config-install-subscribe-fail": "無法訂閱mediawiki-announce:$1",
-       "config-install-subscribe-notpossible": "æ²\92æ\9c\89å®\89è£\9dcURLï¼\8callow_url_fopenä¹\9fä¸\8då\8f¯ç\94¨。",
-       "config-install-mainpage": "正在創建顯示默認內容的首頁",
-       "config-install-extension-tables": "正在為已啟用擴展創建數據表",
-       "config-install-mainpage-failed": "無法插入首頁:$1",
-       "config-install-done": "'''恭喜!'''\n您已經成功地安裝了MediaWiki。\n\n安裝程序已經生成了<code>LocalSettings.php</code>文件,其中包含了您所有的配置。\n\n您需要下載該文件,並將其放在您wiki的根目錄(index.php的同級目錄)中。稍後下載將自動開始。\n\n如果瀏覽器沒有提示您下載,或者您取消了下載,您可以點擊下面的鏈接重新開始下載:\n\n$3\n\n'''注意''':如果您現在不完成本步驟,而是沒有下載便退出了安裝過程,此後您將無法獲得自動生成的配置文件。\n\n當本步驟完成後,您可以 '''[$2 進入您的wiki]'''。",
-       "config-download-localsettings": "下載<code>LocalSettings.php</code>",
+       "config-install-pg-plpgsql": "正在檢查 PL/pgSQL 語言",
+       "config-pg-no-plpgsql": "您需要安裝 PL/pgSQL 到資料庫 $1",
+       "config-pg-no-create-privs": "您所指定用來給安裝程序使用的帳號沒有足夠的權限可以建立新帳號。",
+       "config-pg-not-in-role": "æ\82¨æ\8c\87å®\9aç\94¨ä¾\86給網é \81å­\98å\8f\96ç\9a\84帳è\99\9få·²å­\98å\9c¨ã\80\82\næ\82¨æ\8c\87å®\9aç\94¨ä¾\86給å®\89è£\9dç¨\8båº\8f使ç\94¨ç\9a\84ç\9a\84帳è\99\9fæ\97¢ä¸\8dæ\98¯ç®¡ç\90\86è\80\85ï¼\8cä¹\9fä¸\8dæ\98¯çµ¦ç¶²é \81å­\98å\8f\96使ç\94¨è\80\85ï¼\8cå\9b æ­¤ç\84¡æ³\95使ç\94¨ç¶²é \81å­\98å\8f\96使ç\94¨è\80\85ç\9a\84æ¬\8aé\99\90建ç«\8bç\89©ä»¶ã\80\82\n\nMediaWiki ç\9b®å\89\8dé\9c\80è¦\81使ç\94¨ç\94±ç¶²é \81使ç\94¨è\80\85æ\89\80建ç«\8bç\9a\84è³\87æ\96\99表ã\80\82è«\8bæ\8c\87å®\9aå\8f¦ä¸\80å\80\8b網é \81使ç\94¨è\80\85ç\9a\84帳è\99\9få\90\8d稱ï¼\8cæ\88\96é»\9eé\81¸ \"è¿\94å\9b\9e\" æ\8c\87å®\9aå\85·æ\9c\89é\81©ç\95¶æ¬\8aé\99\90使ç\94¨è\80\85給å®\89è£\9dç¨\8båº\8f使ç\94¨。",
+       "config-install-user": "æ­£å\9c¨å»ºç«\8bè³\87æ\96\99庫使ç\94¨è\80\85",
+       "config-install-user-alreadyexists": "使用者 \"$1\" 已存在",
+       "config-install-user-create-failed": "建ç«\8b使ç\94¨è\80\85 \"$1\" 失敗:$2",
+       "config-install-user-grant-failed": "授序權限給使用者 \"$1\" 失敗:$2",
+       "config-install-user-missing": "指定的使用者 \"$1\" 不存在。",
+       "config-install-user-missing-create": "指定的使用者 \"$1\" 不存在。\n若您想建立帳號,請勾選下方 \"建立帳號\" 核選方塊。",
+       "config-install-tables": "æ­£å\9c¨å»ºç«\8bè³\87æ\96\99表",
+       "config-install-tables-exist": "<strong>警告:</strong> MediaWiki 資料表已存在,略過建立資料表。",
+       "config-install-tables-failed": "<strong>錯誤:</strong>建立資料表失敗,以下為錯誤訊息:$1",
+       "config-install-interwiki": "æ­£å\9c¨å\8c¯å\85¥é \90設ç\9a\84 interwiki è³\87æ\96\99表",
+       "config-install-interwiki-list": "æ\9f¥ç\84¡æª\94æ¡\88 <code>interwiki.list</code>。",
+       "config-install-interwiki-exists": "<strong>警告:</strong> interwiki 資料表內已有資料,略過建立預設資料。",
+       "config-install-stats": "初始化統計資訊",
+       "config-install-keys": "ç\94¢ç\94\9fç§\98å¯\86é\87\91鑰中",
+       "config-insecure-keys": "<strong>警告:</strong>在安裝過程中所產生的 $2 組安全金鑰($1)並不完全安全。請考慮手動更改。",
+       "config-install-sysop": "æ­£å\9c¨å»ºç«\8b管ç\90\86å\93¡ä½¿ç\94¨è\80\85帳號",
+       "config-install-subscribe-fail": "無法訂閱 mediawiki-announce:$1",
+       "config-install-subscribe-notpossible": "æ\9cªå®\89è£\9d cURLï¼\8cå\9b æ­¤ç\84¡æ³\95使ç\94¨ <code>allow_url_fopen</code> è¨­å®\9aé \85ç\9b®。",
+       "config-install-mainpage": "正在使用預設的內容建立首頁",
+       "config-install-extension-tables": "正在建立已啟動的擴充套件的資料表",
+       "config-install-mainpage-failed": "無法插入首頁$1",
+       "config-install-done": "<strong>恭喜!</strong>\n您已經成功地安裝了 MediaWiki。\n\n安裝程式已自動產生 <code>LocalSettings.php</code> 檔案,\n該檔案中包含了您所有的設定項目。\n\n您需要下載該檔案,並將其放置在您的 Wiki 的根目錄 (index.php 所在的目錄) 中,下載稍後會自動開始。\n\n若瀏覽器沒有提示您下載,或者您取消了下載,您可以點選下方連結重新下載:\n\n$3\n\n<strong>注意:</strong>若您現在未下載檔案,稍後結束安裝程式之後將無法下載設定檔。\n\n當您完成本步驟後,您可以 <strong>[$2 進入您的 Wiki]</strong>。",
+       "config-download-localsettings": "下載 <code>LocalSettings.php</code>",
        "config-help": "說明",
-       "config-nofile": "檔案「$1」無法找尋。難道它被刪除?",
-       "config-extension-link": "您是否了解您的wiki支援[//www.mediawiki.org/wiki/Manual:Extensions 拓展]?您可瀏覽[//www.mediawiki.org/wiki/Category:Extensions_by_category 包含所有拓展的分類]或[//www.mediawiki.org/wiki/Extension_Matrix 拓展矩陣]以顯示拓展的完整列表。",
-       "mainpagetext": "'''已成功安裝MediaWiki。'''",
-       "mainpagedocfooter": "請參閱[//meta.wikimedia.org/wiki/Help:Contents 用戶手冊]以獲得使用此wiki軟體的訊息!\n\n== 入門 ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings MediaWiki配置設定清單]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki常見問題解答]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki發佈郵件清單]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources MediaWiki界面本地化]"
+       "config-help-tooltip": "按一下以展開",
+       "config-nofile": "查無檔案 \"$1\",是否已被刪除?",
+       "config-extension-link": "您是否了解您的 Wiki 支援 [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions 擴充套件]?\n\n\n您可以瀏覽 [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category 擴充套件分類] 或 [//www.mediawiki.org/wiki/Extension_Matrix 擴充套件資料表] 以取得相關的資訊。",
+       "mainpagetext": "<strong>已成功安裝 MediaWiki。</strong>",
+       "mainpagedocfooter": "請參閱 [//meta.wikimedia.org/wiki/Help:Contents 使用者手冊] 以取得使用 Wiki 的相關訊息!\n\n== 新手入門 ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings MediaWiki 系統設定]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki 常見問答集]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 發佈郵寄清單]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources MediaWiki 介面在地化]"
 }
index 5fc1e06..35b4f13 100644 (file)
@@ -87,12 +87,13 @@ 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 of Job objects
+        * @param array $jobs Array of Job objects
         * @return bool
         * @deprecated since 1.21
         */
        public static function batchInsert( $jobs ) {
-               return JobQueueGroup::singleton()->push( $jobs );
+               JobQueueGroup::singleton()->push( $jobs );
+               return true;
        }
 
        /**
@@ -102,12 +103,13 @@ 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 of Job objects
+        * @param array $jobs Array of Job objects
         * @return bool
         * @deprecated since 1.21
         */
        public static function safeBatchInsert( $jobs ) {
-               return JobQueueGroup::singleton()->push( $jobs, JobQueue::QOS_ATOMIC );
+               JobQueueGroup::singleton()->push( $jobs, JobQueue::QOS_ATOMIC );
+               return true;
        }
 
        /**
@@ -115,7 +117,7 @@ abstract class Job implements IJobSpecification {
         * actually find a job; it may be adversely affected by concurrent job
         * runners.
         *
-        * @param $type string
+        * @param string $type
         * @return Job|bool Returns false if there are no jobs
         * @deprecated since 1.21
         */
@@ -139,9 +141,9 @@ abstract class Job implements IJobSpecification {
         *------------------------------------------------------------------------*/
 
        /**
-        * @param $command
-        * @param $title
-        * @param $params array|bool
+        * @param string $command
+        * @param Title $title
+        * @param array|bool $params
         */
        public function __construct( $command, $title, $params = false ) {
                $this->command = $command;
@@ -199,7 +201,7 @@ abstract class Job implements IJobSpecification {
        }
 
        /**
-        * @return integer Number of actually "work items" handled in this job
+        * @return int Number of actually "work items" handled in this job
         * @see $wgJobBackoffThrottling
         * @since 1.23
         */
@@ -281,13 +283,22 @@ abstract class Job implements IJobSpecification {
         * @deprecated since 1.21
         */
        public function insert() {
-               return JobQueueGroup::singleton()->push( $this );
+               JobQueueGroup::singleton()->push( $this );
+               return true;
        }
 
        /**
         * @return string
         */
        public function toString() {
+               $truncFunc = function( $value ) {
+                       $value = (string)$value;
+                       if ( mb_strlen( $value ) > 1024 ) {
+                               $value = "string(" . mb_strlen( $value ) . ")";
+                       }
+                       return $value;
+               };
+
                $paramString = '';
                if ( $this->params ) {
                        foreach ( $this->params as $key => $value ) {
@@ -295,16 +306,25 @@ abstract class Job implements IJobSpecification {
                                        $paramString .= ' ';
                                }
                                if ( is_array( $value ) ) {
-                                       $value = "array(" . count( $value ) . ")";
+                                       $filteredValue = array();
+                                       foreach ( $value as $k => $v ) {
+                                               if ( is_scalar( $v ) ) {
+                                                       $filteredValue[$k] = $truncFunc( $v );
+                                               } else {
+                                                       $filteredValue = null;
+                                                       break;
+                                               }
+                                       }
+                                       if ( $filteredValue ) {
+                                               $value = FormatJson::encode( $filteredValue );
+                                       } else {
+                                               $value = "array(" . count( $value ) . ")";
+                                       }
                                } elseif ( is_object( $value ) && !method_exists( $value, '__toString' ) ) {
                                        $value = "object(" . get_class( $value ) . ")";
                                }
-                               $value = (string)$value;
-                               if ( mb_strlen( $value ) > 1024 ) {
-                                       $value = "string(" . mb_strlen( $value ) . ")";
-                               }
 
-                               $paramString .= "$key=$value";
+                               $paramString .= "$key={$truncFunc( $value )}";
                        }
                }
 
index 9b13aea..c00d22e 100644 (file)
@@ -323,7 +323,7 @@ abstract class JobQueue {
         */
        final public function batchPush( array $jobs, $flags = 0 ) {
                if ( !count( $jobs ) ) {
-                       return true; // nothing to do
+                       return; // nothing to do
                }
 
                foreach ( $jobs as $job ) {
@@ -344,7 +344,7 @@ abstract class JobQueue {
        /**
         * @see JobQueue::batchPush()
         * @param array $jobs
-        * @param $flags
+        * @param int $flags
         */
        abstract protected function doBatchPush( array $jobs, $flags );
 
index 5f1ca14..08873cc 100644 (file)
@@ -189,9 +189,9 @@ class JobQueueDB extends JobQueue {
        /**
         * @see JobQueue::doBatchPush()
         * @param array $jobs
-        * @param $flags
+        * @param int $flags
         * @throws DBError|Exception
-        * @return bool
+        * @return void
         */
        protected function doBatchPush( array $jobs, $flags ) {
                $dbw = $this->getMasterDB();
@@ -203,8 +203,6 @@ class JobQueueDB extends JobQueue {
                                $that->doBatchPushInternal( $dbw, $jobs, $flags, $method );
                        }
                );
-
-               return true;
        }
 
        /**
@@ -215,11 +213,11 @@ class JobQueueDB extends JobQueue {
         * @param int $flags
         * @param string $method
         * @throws DBError
-        * @return bool
+        * @return void
         */
        public function doBatchPushInternal( IDatabase $dbw, array $jobs, $flags, $method ) {
                if ( !count( $jobs ) ) {
-                       return true;
+                       return;
                }
 
                $rowSet = array(); // (sha1 => job) map for jobs that are de-duplicated
@@ -277,7 +275,7 @@ class JobQueueDB extends JobQueue {
 
                $this->cache->set( $this->getCacheKey( 'empty' ), 'false', JobQueueDB::CACHE_TTL_LONG );
 
-               return true;
+               return;
        }
 
        /**
@@ -338,7 +336,7 @@ class JobQueueDB extends JobQueue {
         * Reserve a row with a single UPDATE without holding row locks over RTTs...
         *
         * @param string $uuid 32 char hex string
-        * @param $rand integer Random unsigned integer (31 bits)
+        * @param int $rand Random unsigned integer (31 bits)
         * @param bool $gte Search for job_random >= $random (otherwise job_random <= $random)
         * @return stdClass|bool Row|false
         */
@@ -774,7 +772,7 @@ class JobQueueDB extends JobQueue {
        }
 
        /**
-        * @param $index integer (DB_SLAVE/DB_MASTER)
+        * @param int $index (DB_SLAVE/DB_MASTER)
         * @return DBConnRef
         */
        protected function getDB( $index ) {
@@ -786,7 +784,7 @@ class JobQueueDB extends JobQueue {
        }
 
        /**
-        * @param $property
+        * @param string $property
         * @return string
         */
        private function getCacheKey( $property ) {
@@ -797,7 +795,7 @@ class JobQueueDB extends JobQueue {
        }
 
        /**
-        * @param $params
+        * @param array|bool $params
         * @return string
         */
        protected static function makeBlob( $params ) {
@@ -809,7 +807,7 @@ class JobQueueDB extends JobQueue {
        }
 
        /**
-        * @param $blob
+        * @param string $blob
         * @return bool|mixed
         */
        protected static function extractBlob( $blob ) {
index f2599ae..d6f9560 100644 (file)
  * @since 1.22
  */
 class JobQueueFederated extends JobQueue {
-       /** @var array (partition name => weight) reverse sorted by weight */
-       protected $partitionMap = array();
-
-       /** @var array (partition name => JobQueue) reverse sorted by weight */
-       protected $partitionQueues = array();
-
+       /** @var HashRing */
+       protected $partitionRing;
        /** @var HashRing */
        protected $partitionPushRing;
+       /** @var array (partition name => JobQueue) reverse sorted by weight */
+       protected $partitionQueues = array();
 
        /** @var BagOStuff */
        protected $cache;
@@ -97,10 +95,10 @@ class JobQueueFederated extends JobQueue {
                        ? $params['maxPartitionsTry']
                        : 2;
                // Get the full partition map
-               $this->partitionMap = $params['partitionsBySection'][$section];
-               arsort( $this->partitionMap, SORT_NUMERIC );
+               $partitionMap = $params['partitionsBySection'][$section];
+               arsort( $partitionMap, SORT_NUMERIC );
                // Get the partitions jobs can actually be pushed to
-               $partitionPushMap = $this->partitionMap;
+               $partitionPushMap = $partitionMap;
                if ( isset( $params['partitionsNoPush'] ) ) {
                        foreach ( $params['partitionsNoPush'] as $partition ) {
                                unset( $partitionPushMap[$partition] );
@@ -114,17 +112,23 @@ class JobQueueFederated extends JobQueue {
                        unset( $baseConfig[$o] ); // partition queue doesn't care about this
                }
                // Get the partition queue objects
-               foreach ( $this->partitionMap as $partition => $w ) {
+               foreach ( $partitionMap as $partition => $w ) {
                        if ( !isset( $params['configByPartition'][$partition] ) ) {
                                throw new MWException( "No configuration for partition '$partition'." );
                        }
                        $this->partitionQueues[$partition] = JobQueue::factory(
                                $baseConfig + $params['configByPartition'][$partition] );
                }
+               // Ring of all partitions
+               $this->partitionRing = new HashRing( $partitionMap );
                // Get the ring of partitions to push jobs into
-               $this->partitionPushRing = new HashRing( $partitionPushMap );
+               if ( count( $partitionPushMap ) === count( $partitionMap ) ) {
+                       $this->partitionPushRing = clone $this->partitionRing; // faster
+               } else {
+                       $this->partitionPushRing = new HashRing( $partitionPushMap );
+               }
                // Aggregate cache some per-queue values if there are multiple partition queues
-               $this->cache = count( $this->partitionMap ) > 1 ? wfGetMainCache() : new EmptyBagOStuff();
+               $this->cache = count( $partitionMap ) > 1 ? wfGetMainCache() : new EmptyBagOStuff();
        }
 
        protected function supportedOrders() {
@@ -191,7 +195,7 @@ class JobQueueFederated extends JobQueue {
                $key = $this->getCacheKey( $type );
 
                $count = $this->cache->get( $key );
-               if ( is_int( $count ) ) {
+               if ( $count !== false ) {
                        return $count;
                }
 
@@ -217,15 +221,20 @@ class JobQueueFederated extends JobQueue {
                // Try to insert the jobs and update $partitionsTry on any failures.
                // Retry to insert any remaning jobs again, ignoring the bad partitions.
                $jobsLeft = $jobs;
+               // @codingStandardsIgnoreStart Generic.CodeAnalysis.ForLoopWithTestFunctionCall.NotAllowed
                for ( $i = $this->maxPartitionsTry; $i > 0 && count( $jobsLeft ); --$i ) {
+                       // @codingStandardsIgnoreEnd
+                       try {
+                               $partitionRing->getLiveRing();
+                       } catch ( UnexpectedValueException $e ) {
+                               break; // all servers down; nothing to insert to
+                       }
                        $jobsLeft = $this->tryJobInsertions( $jobsLeft, $partitionRing, $flags );
                }
                if ( count( $jobsLeft ) ) {
                        throw new JobQueueError(
                                "Could not insert job(s), {$this->maxPartitionsTry} partitions tried." );
                }
-
-               return true;
        }
 
        /**
@@ -246,7 +255,7 @@ class JobQueueFederated extends JobQueue {
                foreach ( $jobs as $key => $job ) {
                        if ( $job->ignoreDuplicates() ) {
                                $sha1 = sha1( serialize( $job->getDeduplicationInfo() ) );
-                               $uJobsByPartition[$partitionRing->getLocation( $sha1 )][] = $job;
+                               $uJobsByPartition[$partitionRing->getLiveLocation( $sha1 )][] = $job;
                                unset( $jobs[$key] );
                        }
                }
@@ -275,8 +284,7 @@ class JobQueueFederated extends JobQueue {
                                $key = $this->getCacheKey( 'empty' );
                                $this->cache->set( $key, 'false', JobQueueDB::CACHE_TTL_LONG );
                        } else {
-                               $partitionRing = $partitionRing->newWithoutLocation( $partition ); // blacklist
-                               if ( !$partitionRing ) {
+                               if ( !$partitionRing->ejectFromLiveRing( $partition, 5 ) ) { // blacklist
                                        throw new JobQueueError( "Could not insert job(s), no partitions available." );
                                }
                                $jobsLeft = array_merge( $jobsLeft, $jobBatch ); // not inserted
@@ -285,7 +293,7 @@ class JobQueueFederated extends JobQueue {
 
                // Insert the jobs that are not de-duplicated into the queues...
                foreach ( $nuJobBatches as $jobBatch ) {
-                       $partition = ArrayUtils::pickRandom( $partitionRing->getLocationWeights() );
+                       $partition = ArrayUtils::pickRandom( $partitionRing->getLiveLocationWeights() );
                        $queue = $this->partitionQueues[$partition];
                        try {
                                $ok = true;
@@ -298,8 +306,7 @@ class JobQueueFederated extends JobQueue {
                                $key = $this->getCacheKey( 'empty' );
                                $this->cache->set( $key, 'false', JobQueueDB::CACHE_TTL_LONG );
                        } else {
-                               $partitionRing = $partitionRing->newWithoutLocation( $partition ); // blacklist
-                               if ( !$partitionRing ) {
+                               if ( !$partitionRing->ejectFromLiveRing( $partition, 5 ) ) { // blacklist
                                        throw new JobQueueError( "Could not insert job(s), no partitions available." );
                                }
                                $jobsLeft = array_merge( $jobsLeft, $jobBatch ); // not inserted
@@ -317,7 +324,7 @@ class JobQueueFederated extends JobQueue {
                        return false;
                }
 
-               $partitionsTry = $this->partitionMap; // (partition => weight)
+               $partitionsTry = $this->partitionRing->getLiveLocationWeights(); // (partition => weight)
 
                $failed = 0;
                while ( count( $partitionsTry ) ) {
@@ -360,12 +367,14 @@ class JobQueueFederated extends JobQueue {
 
        protected function doIsRootJobOldDuplicate( Job $job ) {
                $params = $job->getRootJobParams();
-               $partitions = $this->partitionPushRing->getLocations( $params['rootJobSignature'], 2 );
+               $sigature = $params['rootJobSignature'];
+               $partition = $this->partitionPushRing->getLiveLocation( $sigature );
                try {
-                       return $this->partitionQueues[$partitions[0]]->doIsRootJobOldDuplicate( $job );
+                       return $this->partitionQueues[$partition]->doIsRootJobOldDuplicate( $job );
                } catch ( JobQueueError $e ) {
-                       if ( isset( $partitions[1] ) ) { // check fallback partition
-                               return $this->partitionQueues[$partitions[1]]->doIsRootJobOldDuplicate( $job );
+                       if ( $this->partitionPushRing->ejectFromLiveRing( $partition, 5 ) ) {
+                               $partition = $this->partitionPushRing->getLiveLocation( $sigature );
+                               return $this->partitionQueues[$partition]->doIsRootJobOldDuplicate( $job );
                        }
                }
 
@@ -374,12 +383,14 @@ class JobQueueFederated extends JobQueue {
 
        protected function doDeduplicateRootJob( Job $job ) {
                $params = $job->getRootJobParams();
-               $partitions = $this->partitionPushRing->getLocations( $params['rootJobSignature'], 2 );
+               $sigature = $params['rootJobSignature'];
+               $partition = $this->partitionPushRing->getLiveLocation( $sigature );
                try {
-                       return $this->partitionQueues[$partitions[0]]->doDeduplicateRootJob( $job );
+                       return $this->partitionQueues[$partition]->doDeduplicateRootJob( $job );
                } catch ( JobQueueError $e ) {
-                       if ( isset( $partitions[1] ) ) { // check fallback partition
-                               return $this->partitionQueues[$partitions[1]]->doDeduplicateRootJob( $job );
+                       if ( $this->partitionPushRing->ejectFromLiveRing( $partition, 5 ) ) {
+                               $partition = $this->partitionPushRing->getLiveLocation( $sigature );
+                               return $this->partitionQueues[$partition]->doDeduplicateRootJob( $job );
                        }
                }
 
@@ -470,7 +481,7 @@ class JobQueueFederated extends JobQueue {
 
        public function getCoalesceLocationInternal() {
                return "JobQueueFederated:wiki:{$this->wiki}" .
-                       sha1( serialize( array_keys( $this->partitionMap ) ) );
+                       sha1( serialize( array_keys( $this->partitionQueues ) ) );
        }
 
        protected function doGetSiblingQueuesWithJobs( array $types ) {
@@ -544,7 +555,7 @@ class JobQueueFederated extends JobQueue {
        }
 
        /**
-        * @param $property
+        * @param string $property
         * @return string
         */
        private function getCacheKey( $property ) {
index 6591282..16908a7 100644 (file)
@@ -106,13 +106,12 @@ class JobQueueGroup {
         *
         * @param Job|array $jobs A single Job or a list of Jobs
         * @throws MWException
-        * @return bool
-        * @todo Return value here is not useful
+        * @return void
         */
        public function push( $jobs ) {
                $jobs = is_array( $jobs ) ? $jobs : array( $jobs );
                if ( !count( $jobs ) ) {
-                       return true;
+                       return;
                }
 
                $jobsByType = array(); // (job type => list of jobs)
@@ -135,8 +134,6 @@ class JobQueueGroup {
                                $this->cache->clear( 'queues-ready' );
                        }
                }
-
-               return true;
        }
 
        /**
@@ -254,7 +251,7 @@ class JobQueueGroup {
        /**
         * Check if there are any queues with jobs (this is cached)
         *
-        * @param integer $type JobQueueGroup::TYPE_* constant
+        * @param int $type JobQueueGroup::TYPE_* constant
         * @return bool
         * @since 1.23
         */
@@ -414,7 +411,7 @@ class JobQueueGroup {
        }
 
        /**
-        * @param $name string
+        * @param string $name
         * @return mixed
         */
        private function getCachedConfigVar( $name ) {
index 135a61d..6739a84 100644 (file)
@@ -71,12 +71,6 @@ class JobQueueRedis extends JobQueue {
        /** @var string Key to prefix the queue keys with (used for testing) */
        protected $key;
 
-       /**
-        * @var null|int maximum seconds between execution of periodic tasks.  Used to speed up
-        * testing but should otherwise be left unset.
-        */
-       protected $maximumPeriodicTaskSeconds;
-
        /**
         * @params include:
         *   - redisConfig : An array of parameters to RedisConnectionPool::__construct().
@@ -85,10 +79,6 @@ class JobQueueRedis extends JobQueue {
         *                   If a hostname is specified but no port, the standard port number
         *                   6379 will be used. Required.
         *   - compression : The type of compression to use; one of (none,gzip).
-        *   - maximumPeriodicTaskSeconds : Maximum seconds between check periodic tasks.  Set to
-        *                   force faster execution of periodic tasks for inegration tests that
-        *                   rely on checkDelay.  Without this the integration tests are very very
-        *                   slow.  This really shouldn't be set in production.
         * @param array $params
         */
        public function __construct( array $params ) {
@@ -97,8 +87,6 @@ class JobQueueRedis extends JobQueue {
                $this->server = $params['redisServer'];
                $this->compression = isset( $params['compression'] ) ? $params['compression'] : 'none';
                $this->redisPool = RedisConnectionPool::singleton( $params['redisConfig'] );
-               $this->maximumPeriodicTaskSeconds = isset( $params['maximumPeriodicTaskSeconds'] ) ?
-                       $params['maximumPeriodicTaskSeconds'] : null;
        }
 
        protected function supportedOrders() {
@@ -194,8 +182,8 @@ class JobQueueRedis extends JobQueue {
        /**
         * @see JobQueue::doBatchPush()
         * @param array $jobs
-        * @param $flags
-        * @return bool
+        * @param int $flags
+        * @return void
         * @throws JobQueueError
         */
        protected function doBatchPush( array $jobs, $flags ) {
@@ -211,7 +199,7 @@ class JobQueueRedis extends JobQueue {
                }
 
                if ( !count( $items ) ) {
-                       return true; // nothing to do
+                       return; // nothing to do
                }
 
                $conn = $this->getConnection();
@@ -235,7 +223,7 @@ class JobQueueRedis extends JobQueue {
                        if ( $failed > 0 ) {
                                wfDebugLog( 'JobQueueRedis', "Could not insert {$failed} {$this->type} job(s)." );
 
-                               return false;
+                               throw new RedisException( "Could not insert {$failed} {$this->type} job(s)." );
                        }
                        JobQueue::incrStats( 'job-insert', $this->type, count( $items ), $this->wiki );
                        JobQueue::incrStats( 'job-insert-duplicate', $this->type,
@@ -243,8 +231,6 @@ class JobQueueRedis extends JobQueue {
                } catch ( RedisException $e ) {
                        $this->throwRedisException( $conn, $e );
                }
-
-               return true;
        }
 
        /**
@@ -350,7 +336,7 @@ LUA;
 
        /**
         * @param RedisConnRef $conn
-        * @return array serialized string or false
+        * @return array Serialized string or false
         * @throws RedisException
         */
        protected function popAndDeleteBlob( RedisConnRef $conn ) {
@@ -383,7 +369,7 @@ LUA;
 
        /**
         * @param RedisConnRef $conn
-        * @return array serialized string or false
+        * @return array Serialized string or false
         * @throws RedisException
         */
        protected function popAndAcquireBlob( RedisConnRef $conn ) {
@@ -614,8 +600,8 @@ LUA;
        /**
         * This function should not be called outside JobQueueRedis
         *
-        * @param $uid string
-        * @param $conn RedisConnRef
+        * @param string $uid
+        * @param RedisConnRef $conn
         * @return Job|bool Returns false if the job does not exist
         * @throws MWException|JobQueueError
         */
@@ -738,10 +724,7 @@ LUA;
                }
                $period = min( $periods );
                $period = max( $period, 30 ); // sanity
-               // Support override for faster testing
-               if ( $this->maximumPeriodicTaskSeconds !== null ) {
-                       $period = min( $period, $this->maximumPeriodicTaskSeconds );
-               }
+
                return array(
                        'recyclePruneAndUndelayJobs' => array(
                                'callback' => array( $this, 'recyclePruneAndUndelayJobs' ),
@@ -773,7 +756,7 @@ LUA;
        }
 
        /**
-        * @param $fields array
+        * @param array $fields
         * @return Job|bool
         */
        protected function getJobFromFields( array $fields ) {
@@ -840,8 +823,8 @@ LUA;
        }
 
        /**
-        * @param $conn RedisConnRef
-        * @param $e RedisException
+        * @param RedisConnRef $conn
+        * @param RedisException $e
         * @throws JobQueueError
         */
        protected function throwRedisException( RedisConnRef $conn, $e ) {
@@ -850,8 +833,8 @@ LUA;
        }
 
        /**
-        * @param $prop string
-        * @param $type string|null
+        * @param string $prop
+        * @param string|null $type
         * @return string
         */
        private function getQueueKey( $prop, $type = null ) {
@@ -865,7 +848,7 @@ LUA;
        }
 
        /**
-        * @param $key string
+        * @param string $key
         * @return void
         */
        public function setTestingPrefix( $key ) {
index 94b56ef..34c302e 100644 (file)
@@ -42,9 +42,9 @@ class DoubleRedirectJob extends Job {
 
        /**
         * Insert jobs into the job queue to fix redirects to the given title
-        * @param string $reason the reason for the fix, see message
+        * @param string $reason The reason for the fix, see message
         *   "double-redirect-fixed-<reason>"
-        * @param $redirTitle Title: the title which has changed, redirects
+        * @param Title $redirTitle The title which has changed, redirects
         *   pointing to this title are fixed
         * @param bool $destTitle Not used
         */
@@ -177,9 +177,9 @@ class DoubleRedirectJob extends Job {
        /**
         * Get the final destination of a redirect
         *
-        * @param $title Title
+        * @param Title $title
         *
-        * @return bool if the specified title is not a redirect, or if it is a circular redirect
+        * @return bool If the specified title is not a redirect, or if it is a circular redirect
         */
        public static function getFinalDestination( $title ) {
                $dbw = wfGetDB( DB_MASTER );
index 1a27e1f..97405ae 100644 (file)
@@ -37,7 +37,7 @@ class RefreshLinksJob2 extends Job {
 
        /**
         * Run a refreshLinks2 job
-        * @return boolean success
+        * @return bool Success
         */
        function run() {
                global $wgUpdateRowsPerJob;
@@ -101,9 +101,9 @@ class RefreshLinksJob2 extends Job {
        }
 
        /**
-        * @param $table string
-        * @param $masterPos mixed
-        * @return Array
+        * @param string $table
+        * @param mixed $masterPos
+        * @return array
         */
        protected function getSingleTitleJobs( $table, $masterPos ) {
                # The "start"/"end" fields are not set for the base jobs
@@ -128,7 +128,7 @@ class RefreshLinksJob2 extends Job {
        }
 
        /**
-        * @return Array
+        * @return array
         */
        public function getDeduplicationInfo() {
                $info = parent::getDeduplicationInfo();
index 2cdac57..480246b 100644 (file)
@@ -174,7 +174,7 @@ class UploadFromUrlJob extends Job {
        }
 
        /**
-        * @param $key
+        * @param string $key
         * @return mixed
         */
        public static function &getSessionData( $key ) {
index 97d98a4..e45dd3a 100644 (file)
@@ -136,6 +136,11 @@ class FormatJson {
         * @return string|bool
         */
        private static function encode54( $value, $pretty, $escaping ) {
+               static $bug66021;
+               if ( $pretty !== false && $bug66021 === null ) {
+                       $bug66021 = json_encode( array(), JSON_PRETTY_PRINT ) !== '[]';
+               }
+
                // PHP escapes '/' to prevent breaking out of inline script blocks using '</script>',
                // which is hardly useful when '<' and '>' are escaped (and inadequate), and such
                // escaping negatively impacts the human readability of URLs and similar strings.
@@ -149,9 +154,10 @@ class FormatJson {
                }
 
                if ( $pretty !== false ) {
-                       // Remove whitespace inside empty arrays/objects; different JSON encoders
-                       // vary on this, and we want our output to be consistent across implementations.
-                       $json = preg_replace( self::WS_CLEANUP_REGEX, '', $json );
+                       // Workaround for <https://bugs.php.net/bug.php?id=66021>
+                       if ( $bug66021 ) {
+                               $json = preg_replace( self::WS_CLEANUP_REGEX, '', $json );
+                       }
                        if ( $pretty !== '    ' ) {
                                // Change the four-space indent to a tab indent
                                $json = str_replace( "\n    ", "\n\t", $json );
index 0063a9b..4f0651d 100644 (file)
@@ -93,6 +93,7 @@ class CSSJanus {
                        return;
                }
 
+               // @codingStandardsIgnoreStart Generic.Files.LineLength.TooLong
                $patterns =& self::$patterns;
                $patterns['escape'] = "(?:{$patterns['unicode']}|\\[^\r\n\f0-9a-f])";
                $patterns['nmstart'] = "(?:[_a-z]|{$patterns['nonAscii']}|{$patterns['escape']})";
@@ -127,6 +128,7 @@ class CSSJanus {
                // 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']})(%)/";
+               // @codingStandardsIgnoreEnd
        }
 
        /**
@@ -145,15 +147,15 @@ class CSSJanus {
                self::buildPatterns();
 
                // Tokenize single line rules with /* @noflip */
-               $noFlipSingle = new CSSJanus_Tokenizer( self::$patterns['noflip_single'], '`NOFLIP_SINGLE`' );
+               $noFlipSingle = new CSSJanusTokenizer( self::$patterns['noflip_single'], '`NOFLIP_SINGLE`' );
                $css = $noFlipSingle->tokenize( $css );
 
                // Tokenize class rules with /* @noflip */
-               $noFlipClass = new CSSJanus_Tokenizer( self::$patterns['noflip_class'], '`NOFLIP_CLASS`' );
+               $noFlipClass = new CSSJanusTokenizer( self::$patterns['noflip_class'], '`NOFLIP_CLASS`' );
                $css = $noFlipClass->tokenize( $css );
 
                // Tokenize comments
-               $comments = new CSSJanus_Tokenizer( self::$patterns['comment'], '`C`' );
+               $comments = new CSSJanusTokenizer( self::$patterns['comment'], '`C`' );
                $css = $comments->tokenize( $css );
 
                // LTR->RTL fixes start here
@@ -308,17 +310,28 @@ class CSSJanus {
                        }
                };
 
-               $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_shadow2'], 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_shadow2'],
+                       function ( $matches ) use ( $flipSign ) {
+                               return $matches[1] . $flipSign( $matches[2] );
+                       },
+                       $css
+               );
 
                return $css;
        }
@@ -359,7 +372,7 @@ class CSSJanus {
  * to protect from being janused.
  * @author Roan Kattouw
  */
-class CSSJanus_Tokenizer {
+class CSSJanusTokenizer {
        private $regex, $token;
        private $originals;
 
index e3a3e2c..10277e6 100644 (file)
@@ -112,7 +112,9 @@ class CSSMin {
         *     instead. If $sizeLimit is false, no limit is enforced.
         * @return string|bool: Image contents encoded as a data URI or false.
         */
-       public static function encodeImageAsDataURI( $file, $type = null, $sizeLimit = self::EMBED_SIZE_LIMIT ) {
+       public static function encodeImageAsDataURI( $file, $type = null,
+               $sizeLimit = self::EMBED_SIZE_LIMIT
+       ) {
                if ( $sizeLimit !== false && filesize( $file ) >= $sizeLimit ) {
                        return false;
                }
@@ -175,13 +177,14 @@ class CSSMin {
        }
 
        /**
-        * Remaps CSS URL paths and automatically embeds data URIs for CSS rules or url() values
-        * preceded by an / * @embed * / comment.
+        * Remaps CSS URL paths and automatically embeds data URIs for CSS rules
+        * or url() values preceded by an / * @embed * / comment.
         *
         * @param string $source CSS data to remap
         * @param string $local File path where the source was read from
         * @param string $remote URL path to the file
-        * @param bool $embedData If false, never do any data URI embedding, even if / * @embed * / is found
+        * @param bool $embedData If false, never do any data URI embedding,
+        *   even if / * @embed * / is found.
         * @return string Remapped CSS data
         */
        public static function remap( $source, $local, $remote, $embedData = true ) {
@@ -200,44 +203,65 @@ class CSSMin {
                        $remote = substr( $remote, 0, -1 );
                }
 
-               // Note: This will not correctly handle cases where ';', '{' or '}' appears in the rule itself,
-               // e.g. in a quoted string. You are advised not to use such characters in file names.
-               // We also match start/end of the string to be consistent in edge-cases ('@import url(…)').
+               // Note: This will not correctly handle cases where ';', '{' or '}'
+               // appears in the rule itself, e.g. in a quoted string. You are advised
+               // not to use such characters in file names. We also match start/end of
+               // the string to be consistent in edge-cases ('@import url(…)').
                $pattern = '/(?:^|[;{])\K[^;{}]*' . CSSMin::URL_REGEX . '[^;}]*(?=[;}]|$)/';
-               return preg_replace_callback( $pattern, function ( $matchOuter ) use ( $local, $remote, $embedData ) {
-                       $rule = $matchOuter[0];
 
-                       // Check for global @embed comment and remove it
-                       $embedAll = false;
-                       $rule = preg_replace( '/^(\s*)' . CSSMin::EMBED_REGEX . '\s*/', '$1', $rule, 1, $embedAll );
+               return preg_replace_callback(
+                       $pattern,
+                       function ( $matchOuter ) use ( $local, $remote, $embedData ) {
+                               $rule = $matchOuter[0];
 
-                       // Build two versions of current rule: with remapped URLs and with embedded data: URIs (where possible)
-                       $pattern = '/(?P<embed>' . CSSMin::EMBED_REGEX . '\s*|)' . CSSMin::URL_REGEX . '/';
+                               // Check for global @embed comment and remove it
+                               $embedAll = false;
+                               $rule = preg_replace( '/^(\s*)' . CSSMin::EMBED_REGEX . '\s*/', '$1', $rule, 1, $embedAll );
 
-                       $ruleWithRemapped = preg_replace_callback( $pattern, function ( $match ) use ( $local, $remote ) {
-                               $remapped = CSSMin::remapOne( $match['file'], $match['query'], $local, $remote, false );
-                               return CSSMin::buildUrlValue( $remapped );
-                       }, $rule );
+                               // Build two versions of current rule: with remapped URLs
+                               // and with embedded data: URIs (where possible).
+                               $pattern = '/(?P<embed>' . CSSMin::EMBED_REGEX . '\s*|)' . CSSMin::URL_REGEX . '/';
 
-                       if ( $embedData ) {
-                               $ruleWithEmbedded = preg_replace_callback( $pattern, function ( $match ) use ( $embedAll, $local, $remote ) {
-                                       $embed = $embedAll || $match['embed'];
-                                       $embedded = CSSMin::remapOne( $match['file'], $match['query'], $local, $remote, $embed );
-                                       return CSSMin::buildUrlValue( $embedded );
-                               }, $rule );
-                       }
+                               $ruleWithRemapped = preg_replace_callback(
+                                       $pattern,
+                                       function ( $match ) use ( $local, $remote ) {
+                                               $remapped = CSSMin::remapOne( $match['file'], $match['query'], $local, $remote, false );
 
-                       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
-                               // making it ignored in all browsers that support data URIs
-                               return "$ruleWithEmbedded;$ruleWithRemapped!ie";
-                       } else {
-                               // No reason to repeat twice
-                               return $ruleWithRemapped;
-                       }
-               }, $source );
+                                               return CSSMin::buildUrlValue( $remapped );
+                                       },
+                                       $rule
+                               );
+
+                               if ( $embedData ) {
+                                       $ruleWithEmbedded = preg_replace_callback(
+                                               $pattern,
+                                               function ( $match ) use ( $embedAll, $local, $remote ) {
+                                                       $embed = $embedAll || $match['embed'];
+                                                       $embedded = CSSMin::remapOne(
+                                                               $match['file'],
+                                                               $match['query'],
+                                                               $local,
+                                                               $remote,
+                                                               $embed
+                                                       );
+
+                                                       return CSSMin::buildUrlValue( $embedded );
+                                               },
+                                               $rule
+                                       );
+                               }
+
+                               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
+                                       // making it ignored in all browsers that support data URIs
+                                       return "$ruleWithEmbedded;$ruleWithRemapped!ie";
+                               } else {
+                                       // No reason to repeat twice
+                                       return $ruleWithRemapped;
+                               }
+                       }, $source );
        }
 
        /**
index d77d8ad..db8a7ec 100644 (file)
@@ -33,7 +33,6 @@
  * @author Jeroen De Dauw < jeroendedauw@gmail.com >
  */
 abstract class GenericArrayObject extends ArrayObject {
-
        /**
         * Returns the name of an interface/class that the element should implement/extend.
         *
@@ -144,7 +143,8 @@ abstract class GenericArrayObject extends ArrayObject {
        protected function setElement( $index, $value ) {
                if ( !$this->hasValidType( $value ) ) {
                        throw new InvalidArgumentException(
-                               'Can only add ' . $this->getObjectType() . ' implementing objects to ' . get_called_class() . '.'
+                               'Can only add ' . $this->getObjectType() . ' implementing objects to '
+                               . get_called_class() . '.'
                        );
                }
 
@@ -237,5 +237,4 @@ abstract class GenericArrayObject extends ArrayObject {
        public function isEmpty() {
                return $this->count() === 0;
        }
-
 }
index 6925c7f..df99098 100644 (file)
@@ -32,6 +32,13 @@ class HashRing {
        /** @var Array (location => (start, end)) */
        protected $ring = array();
 
+       /** @var Array (location => (start, end)) */
+       protected $liveRing;
+       /** @var Array (location => UNIX timestamp) */
+       protected $ejectionExpiries = array();
+       /** @var integer UNIX timestamp */
+       protected $ejectionNextExpiry = INF;
+
        const RING_SIZE = 268435456; // 2^28
 
        /**
@@ -84,7 +91,7 @@ class HashRing {
        }
 
        /**
-        * Get the location of an item on the ring, as well as the next clockwise locations
+        * Get the location of an item on the ring, as well as the next locations
         *
         * @param string $item
         * @param integer $limit Maximum number of locations to return
@@ -138,10 +145,95 @@ class HashRing {
        public function newWithoutLocation( $location ) {
                $map = $this->sourceMap;
                unset( $map[$location] );
-               if ( count( $map ) ) {
-                       return new self( $map );
+
+               return count( $map ) ? new self( $map ) : false;
+       }
+
+       /**
+        * Remove a location from the "live" hash ring
+        *
+        * @param string $location
+        * @param integer $ttl Seconds
+        * @return bool Whether some non-ejected locations are left
+        */
+       public function ejectFromLiveRing( $location, $ttl ) {
+               if ( !isset( $this->sourceMap[$location] ) ) {
+                       throw new UnexpectedValueException( "No location '$location' in the ring." );
+               }
+               $expiry = time() + $ttl;
+               $this->liveRing = null; // stale
+               $this->ejectionExpiries[$location] = $expiry;
+               $this->ejectionNextExpiry = min( $expiry, $this->ejectionNextExpiry );
+
+               return ( count( $this->ejectionExpiries ) < count( $this->sourceMap ) );
+       }
+
+       /**
+        * Get the "live" hash ring (which does not include ejected locations)
+        *
+        * @return HashRing
+        * @throws UnexpectedValueException
+        */
+       public function getLiveRing() {
+               $now = time();
+               if ( $this->liveRing === null || $this->ejectionNextExpiry <= $now ) {
+                       $this->ejectionExpiries = array_filter(
+                               $this->ejectionExpiries,
+                               function( $expiry ) use ( $now ) {
+                                       return ( $expiry > $now );
+                               }
+                       );
+                       if ( count( $this->ejectionExpiries ) ) {
+                               $map = array_diff_key( $this->sourceMap, $this->ejectionExpiries );
+                               $this->liveRing = count( $map ) ? new self( $map ) : false;
+
+                               $this->ejectionNextExpiry = min( $this->ejectionExpiries );
+                       } else { // common case; avoid recalculating ring
+                               $this->liveRing = clone $this;
+                               $this->liveRing->ejectionExpiries = array();
+                               $this->liveRing->ejectionNextExpiry = INF;
+                               $this->liveRing->liveRing = null;
+
+                               $this->ejectionNextExpiry = INF;
+                       }
+               }
+               if ( !$this->liveRing ) {
+                       throw UnexpectedValueException( "The live ring is currently empty." );
                }
 
-               return false;
+               return $this->liveRing;
+       }
+
+       /**
+        * Get the location of an item on the "live" ring
+        *
+        * @param string $item
+        * @return string Location
+        * @throws UnexpectedValueException
+        */
+       public function getLiveLocation( $item ) {
+               return $this->getLiveRing()->getLocation( $item );
+       }
+
+       /**
+        * Get the location of an item on the "live" ring, as well as the next locations
+        *
+        * @param string $item
+        * @param integer $limit Maximum number of locations to return
+        * @return array List of locations
+        * @throws UnexpectedValueException
+        */
+       public function getLiveLocations( $item ) {
+               return $this->getLiveRing()->getLocations( $item );
+       }
+
+       /**
+        * Get the map of "live" locations to weight (ignores 0-weight items)
+        *
+        * @return array
+        * @throws UnexpectedValueException
+        */
+       public function getLiveLocationWeights() {
+               return $this->getLiveRing()->getLocationWeights();
        }
 }
index 7f461a0..a80f6d9 100644 (file)
@@ -712,8 +712,9 @@ class IEContentAnalyzer {
                $xbmMagic2 = '_width';
                $xbmMagic3 = '_bits';
                $binhexMagic = 'converted with BinHex';
+               $chunkLength = strlen( $chunk );
 
-               for ( $offset = 0; $offset < strlen( $chunk ); $offset++ ) {
+               for ( $offset = 0; $offset < $chunkLength; $offset++ ) {
                        $curChar = $chunk[$offset];
                        if ( $curChar == "\x0a" ) {
                                $counters['lf']++;
diff --git a/includes/libs/IPSet.php b/includes/libs/IPSet.php
new file mode 100644 (file)
index 0000000..ae59378
--- /dev/null
@@ -0,0 +1,277 @@
+<?php
+/**
+ * @section LICENSE
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write 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 Brandon Black <blblack@gmail.com>
+ */
+
+/**
+ * Matches IP addresses against a set of CIDR specifications
+ *
+ * Usage:
+ *   // At startup, calculate the optimized data structure for the set:
+ *   $ipset = new IPSet( $wgSquidServersNoPurge );
+ *   // runtime check against cached set (returns bool):
+ *   $allowme = $ipset->match( $ip );
+ *
+ * In rough benchmarking, this takes about 80% more time than
+ * in_array() checks on a short (a couple hundred at most) array
+ * of addresses.  It's fast either way at those levels, though,
+ * and IPSet would scale better than in_array if the array were
+ * much larger.
+ *
+ * For mixed-family CIDR sets, however, this code gives well over
+ * 100x speedup vs iterating IP::isInRange() over an array
+ * of CIDR specs.
+ *
+ * The basic implementation is two separate binary trees
+ * (IPv4 and IPv6) as nested php arrays with keys named 0 and 1.
+ * The values false and true are terminal match-fail and match-success,
+ * otherwise the value is a deeper node in the tree.
+ *
+ * A simple depth-compression scheme is also implemented: whole-byte
+ * tree compression at whole-byte boundaries only, where no branching
+ * occurs during that whole byte of depth.  A compressed node has
+ * keys 'comp' (the byte to compare) and 'next' (the next node to
+ * recurse into if 'comp' matched successfully).
+ *
+ * For example, given these inputs:
+ * 25.0.0.0/9
+ * 25.192.0.0/10
+ *
+ * The v4 tree would look like:
+ * root4 => array(
+ *     'comp' => 25,
+ *     'next' => array(
+ *         0 => true,
+ *         1 => array(
+ *             0 => false,
+ *             1 => true,
+ *         ),
+ *     ),
+ * );
+ *
+ * (multi-byte compression nodes were attempted as well, but were
+ * a net loss in my test scenarios due to additional match complexity)
+ *
+ * @since 1.24
+ */
+class IPSet {
+       /** @var array $root4: the root of the IPv4 matching tree */
+       private $root4 = array( false, false );
+
+       /** @var array $root6: the root of the IPv6 matching tree */
+       private $root6 = array( false, false );
+
+       /**
+        * __construct() instantiate the object from an array of CIDR specs
+        *
+        * @param array $cfg array of IPv[46] CIDR specs as strings
+        * @return IPSet new IPSet object
+        *
+        * Invalid input network/mask values in $cfg will result in issuing
+        * E_WARNING and/or E_USER_WARNING and the bad values being ignored.
+        */
+       public function __construct( array $cfg ) {
+               foreach ( $cfg as $cidr ) {
+                       $this->addCidr( $cidr );
+               }
+
+               self::recOptimize( $this->root4 );
+               self::recCompress( $this->root4, 0, 24 );
+               self::recOptimize( $this->root6 );
+               self::recCompress( $this->root6, 0, 120 );
+       }
+
+       /**
+        * Add a single CIDR spec to the internal matching trees
+        *
+        * @param string $cidr string CIDR spec, IPv[46], optional /mask (def all-1's)
+        */
+       private function addCidr( $cidr ) {
+               // v4 or v6 check
+               if ( strpos( $cidr, ':' ) === false ) {
+                       $node =& $this->root4;
+                       $defMask = '32';
+               } else {
+                       $node =& $this->root6;
+                       $defMask = '128';
+               }
+
+               // Default to all-1's mask if no netmask in the input
+               if ( strpos( $cidr, '/' ) === false ) {
+                       $net = $cidr;
+                       $mask = $defMask;
+               } else {
+                       list( $net, $mask ) = explode( '/', $cidr, 2 );
+                       if ( !ctype_digit( $mask ) || intval( $mask ) > $defMask ) {
+                               trigger_error( "IPSet: Bad mask '$mask' from '$cidr', ignored", E_USER_WARNING );
+                               return;
+                       }
+               }
+               $mask = intval( $mask ); // explicit integer convert, checked above
+
+               // convert $net to an array of integer bytes, length 4 or 16:
+               $raw = inet_pton( $net );
+               if ( $raw === false ) {
+                       return; // inet_pton() sends an E_WARNING for us
+               }
+               $rawOrd = array_map( 'ord', str_split( $raw ) );
+
+               // special-case: zero mask overwrites the whole tree with a pair of terminal successes
+               if ( $mask == 0 ) {
+                       $node = array( true, true );
+                       return;
+               }
+
+               // iterate the bits of the address while walking the tree structure for inserts
+               $curBit = 0;
+               while ( 1 ) {
+                       $maskShift = 7 - ( $curBit & 7 );
+                       $node =& $node[( $rawOrd[$curBit >> 3] & ( 1 << $maskShift ) ) >> $maskShift];
+                       ++$curBit;
+                       if ( $node === true ) {
+                               // already added a larger supernet, no need to go deeper
+                               return;
+                       } elseif ( $curBit == $mask ) {
+                               // this may wipe out deeper subnets from earlier
+                               $node = true;
+                               return;
+                       } elseif ( $node === false ) {
+                               // create new subarray to go deeper
+                               $node = array( false, false );
+                       }
+               }
+       }
+
+       /**
+        * Match an IP address against the set
+        *
+        * @param string $ip string IPv[46] address
+        * @return boolean true is match success, false is match failure
+        *
+        * If $ip is unparseable, inet_pton may issue an E_WARNING to that effect
+        */
+       public function match( $ip ) {
+               $raw = inet_pton( $ip );
+               if ( $raw === false ) {
+                       return false; // inet_pton() sends an E_WARNING for us
+               }
+
+               $rawOrd = array_map( 'ord', str_split( $raw ) );
+               if ( count( $rawOrd ) == 4 ) {
+                       $node =& $this->root4;
+               } else {
+                       $node =& $this->root6;
+               }
+
+               $curBit = 0;
+               while ( 1 ) {
+                       if ( isset( $node['comp'] ) ) {
+                               // compressed node, matches 1 whole byte on a byte boundary
+                               if ( $rawOrd[$curBit >> 3] != $node['comp'] ) {
+                                       return false;
+                               }
+                               $curBit += 8;
+                               $node =& $node['next'];
+                       } else {
+                               // uncompressed node, walk in the correct direction for the current bit-value
+                               $maskShift = 7 - ( $curBit & 7 );
+                               $node =& $node[( $rawOrd[$curBit >> 3] & ( 1 << $maskShift ) ) >> $maskShift];
+                               ++$curBit;
+                       }
+
+                       if ( $node === true || $node === false ) {
+                               return $node;
+                       }
+               }
+       }
+
+       /**
+        * Recursively merges adjacent nets into larger supernets
+        *
+        * @param array &$node Tree node to optimize, by-reference
+        *
+        *  e.g.: 8.0.0.0/8 + 9.0.0.0/8 -> 8.0.0.0/7
+        */
+       private static function recOptimize( &$node ) {
+               if ( $node[0] !== false && $node[0] !== true && self::recOptimize( $node[0] ) ) {
+                       $node[0] = true;
+               }
+               if ( $node[1] !== false && $node[1] !== true && self::recOptimize( $node[1] ) ) {
+                       $node[1] = true;
+               }
+               if ( $node[0] === true && $node[1] === true ) {
+                       return true;
+               }
+               return false;
+       }
+
+       /**
+        * Recursively compresses a tree
+        *
+        * @param array &$node Tree node to compress, by-reference
+        * @param integer $curBit current depth in the tree
+        * @param integer $maxCompStart maximum depth at which compression can start, family-specific
+        *
+        * This is a very simplistic compression scheme: if we go through a whole
+        * byte of address starting at a byte boundary with no real branching
+        * other than immediate false-vs-(node|true), compress that subtree down to a single
+        * byte-matching node.
+        * The $maxCompStart check elides recursing the final 7 levels of depth (family-dependent)
+        */
+       private static function recCompress( &$node, $curBit, $maxCompStart ) {
+               if ( !( $curBit & 7 ) ) { // byte boundary, check for depth-8 single path(s)
+                       $byte = 0;
+                       $cnode =& $node;
+                       $i = 8;
+                       while ( $i-- ) {
+                               if ( $cnode[0] === false ) {
+                                       $byte |= 1 << $i;
+                                       $cnode =& $cnode[1];
+                               } elseif ( $cnode[1] === false ) {
+                                       $cnode =& $cnode[0];
+                               } else {
+                                       // partial-byte branching, give up
+                                       break;
+                               }
+                       }
+                       if ( $i == -1 ) { // means we did not exit the while() via break
+                               $node = array(
+                                       'comp' => $byte,
+                                       'next' => &$cnode,
+                               );
+                               $curBit += 8;
+                               if ( $cnode !== true ) {
+                                       self::recCompress( $cnode, $curBit, $maxCompStart );
+                               }
+                               return;
+                       }
+               }
+
+               ++$curBit;
+               if ( $curBit <= $maxCompStart ) {
+                       if ( $node[0] !== false && $node[0] !== true ) {
+                               self::recCompress( $node[0], $curBit, $maxCompStart );
+                       }
+                       if ( $node[1] !== false && $node[1] !== true ) {
+                               self::recCompress( $node[1], $curBit, $maxCompStart );
+                       }
+               }
+       }
+}
index 998805a..2990782 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+// @codingStandardsIgnoreFile File external to MediaWiki. Ignore coding conventions checks.
 /**
  * JavaScript Minifier
  *
index c61e8f8..cd9aad8 100644 (file)
@@ -33,7 +33,6 @@
  * @file
  */
 class MWMessagePack {
-
        /** @var boolean|null Whether current system is bigendian. **/
        public static $bigendian = null;
 
@@ -75,7 +74,8 @@ class MWMessagePack {
                        } elseif ( $length <= 0xFFFFFFFF ) {
                                return pack( 'CNa*', 0xDB, $length, $value );
                        }
-                       throw new InvalidArgumentException( __METHOD__ . ": string too long (length: $length; max: 4294967295)" );
+                       throw new InvalidArgumentException( __METHOD__
+                               . ": string too long (length: $length; max: 4294967295)" );
 
                case 'integer':
                        if ( $value >= 0 ) {
@@ -142,7 +142,8 @@ class MWMessagePack {
                        $buffer = '';
                        $length = count( $value );
                        if ( $length > 0xFFFFFFFF ) {
-                               throw new InvalidArgumentException( __METHOD__ . ": array too long (length: $length, max: 4294967295)" );
+                               throw new InvalidArgumentException( __METHOD__
+                                       . ": array too long (length: $length, max: 4294967295)" );
                        }
 
                        $index = 0;
index 340e7f4..671e812 100644 (file)
@@ -86,7 +86,7 @@ class MultiHttpClient {
         *   - err     : Any cURL error string
         * The map also stores integer-indexed copies of these values. This lets callers do:
         *      <code>
-        *              list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $req;
+        *              list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $http->run( $req );
         *  </code>
         * @param array $req HTTP request array
         * @param array $opts
@@ -110,7 +110,7 @@ class MultiHttpClient {
         *   - err     : Any cURL error string
         * The map also stores integer-indexed copies of these values. This lets callers do:
         *      <code>
-        *              list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $req;
+        *              list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $req['response'];
         *  </code>
         * All headers in the 'headers' field are normalized to use lower case names.
         * This is true for the request headers and the response headers. Integer-indexed
index f2d9f42..f988207 100644 (file)
@@ -38,10 +38,7 @@ class ProcessCacheLRU {
         * @throws UnexpectedValueException When $maxCacheKeys is not an int or =< 0.
         */
        public function __construct( $maxKeys ) {
-               if ( !is_int( $maxKeys ) || $maxKeys < 1 ) {
-                       throw new UnexpectedValueException( __METHOD__ . " must be given an integer >= 1" );
-               }
-               $this->maxCacheKeys = $maxKeys;
+               $this->resize( $maxKeys );
        }
 
        /**
@@ -119,6 +116,25 @@ class ProcessCacheLRU {
                }
        }
 
+       /**
+        * Resize the maximum number of cache entries, removing older entries as needed
+        *
+        * @param $maxKeys integer
+        * @return void
+        */
+       public function resize( $maxKeys ) {
+               if ( !is_int( $maxKeys ) || $maxKeys < 1 ) {
+                       throw new UnexpectedValueException( __METHOD__ . " must be given an integer >= 1" );
+               }
+               $this->maxCacheKeys = $maxKeys;
+               while ( count( $this->cache ) > $this->maxCacheKeys ) {
+                       reset( $this->cache );
+                       $evictKey = key( $this->cache );
+                       unset( $this->cache[$evictKey] );
+                       unset( $this->cacheTimes[$evictKey] );
+               }
+       }
+
        /**
         * Push an entry to the top of the cache
         *
index f250217..ed0382c 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+// @codingStandardsIgnoreFile File external to MediaWiki. Ignore coding conventions checks.
 /**
  * JSMinPlus version 1.4
  *
index 57d45ed..37723d5 100644 (file)
@@ -1,7 +1,7 @@
 <?php
-
+// @codingStandardsIgnoreFile File external to MediaWiki. Ignore coding conventions checks.
 /**
- * lessphp v0.4.0@b7cd5c79e8
+ * lessphp v0.4.0@2cc77e3c7b
  * http://leafo.net/lessphp
  *
  * LESS CSS compiler, adapted from http://lesscss.org
@@ -847,7 +847,7 @@ class lessc {
         * The input is expected to be reduced. This function will not work on
         * things like expressions and variables.
         */
-       protected function compileValue($value) {
+       public function compileValue($value) {
                switch ($value[0]) {
                case 'list':
                        // [1] - delimiter
diff --git a/includes/libs/virtualrest/SwiftVirtualRESTService.php b/includes/libs/virtualrest/SwiftVirtualRESTService.php
new file mode 100644 (file)
index 0000000..011dabe
--- /dev/null
@@ -0,0 +1,175 @@
+<?php
+/**
+ * Virtual HTTP service client for Swift
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Example virtual rest service for OpenStack Swift
+ * @TODO: caching support (APC/memcached)
+ * @since 1.23
+ */
+class SwiftVirtualRESTService extends VirtualRESTService {
+       /** @var array */
+       protected $authCreds;
+       /** @var int UNIX timestamp */
+       protected $authSessionTimestamp = 0;
+       /** @var int UNIX timestamp */
+       protected $authErrorTimestamp = null;
+       /** @var int */
+       protected $authCachedStatus = null;
+       /** @var string */
+       protected $authCachedReason = null;
+
+       /**
+        * @param array $params Key/value map
+        *   - swiftAuthUrl       : Swift authentication server URL
+        *   - swiftUser          : Swift user used by MediaWiki (account:username)
+        *   - swiftKey           : Swift authentication key for the above user
+        *   - swiftAuthTTL       : Swift authentication TTL (seconds)
+        */
+       public function __construct( array $params ) {
+               parent::__construct( $params );
+       }
+
+       /**
+        * @return int|bool HTTP status on cached failure
+        */
+       protected function needsAuthRequest() {
+               if ( !$this->authCreds ) {
+                       return true;
+               }
+               if ( $this->authErrorTimestamp !== null ) {
+                       if ( ( time() - $this->authErrorTimestamp ) < 60 ) {
+                               return $this->authCachedStatus; // failed last attempt; don't bother
+                       } else { // actually retry this time
+                               $this->authErrorTimestamp = null;
+                       }
+               }
+               // Session keys expire after a while, so we renew them periodically
+               return ( ( time() - $this->authSessionTimestamp ) > $this->params['swiftAuthTTL'] );
+       }
+
+       protected function applyAuthResponse( array $req ) {
+               $this->authSessionTimestamp = 0;
+               list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $req['response'];
+               if ( $rcode >= 200 && $rcode <= 299 ) { // OK
+                       $this->authCreds = array(
+                               'auth_token'  => $rhdrs['x-auth-token'],
+                               'storage_url' => $rhdrs['x-storage-url']
+                       );
+                       $this->authSessionTimestamp = time();
+                       return true;
+               } elseif ( $rcode === 403 ) {
+                       $this->authCachedStatus = 401;
+                       $this->authCachedReason = 'Authorization Required';
+                       $this->authErrorTimestamp = time();
+                       return false;
+               } else {
+                       $this->authCachedStatus = $rcode;
+                       $this->authCachedReason = $rdesc;
+                       $this->authErrorTimestamp = time();
+                       return null;
+               }
+       }
+
+       public function onRequests( array $reqs, Closure $idGeneratorFunc ) {
+               $result = array();
+               $firstReq = reset( $reqs );
+               if ( $firstReq && count( $reqs ) == 1 && isset( $firstReq['isAuth'] ) ) {
+                       // This was an authentication request for work requests...
+                       $result = $reqs; // no change
+               } else {
+                       // These are actual work requests...
+                       $needsAuth = $this->needsAuthRequest();
+                       if ( $needsAuth === true ) {
+                               // These are work requests and we don't have any token to use.
+                               // Replace the work requests with an authentication request.
+                               $result = array(
+                                       $idGeneratorFunc() => array(
+                                               'method'  => 'GET',
+                                               'url'     => $this->params['swiftAuthUrl'] . "/v1.0",
+                                               'headers' => array(
+                                                       'x-auth-user' => $this->params['swiftUser'],
+                                                       'x-auth-key'  => $this->params['swiftKey'] ),
+                                               'isAuth'  => true,
+                                               'chain'   => $reqs
+                                       )
+                               );
+                       } elseif ( $needsAuth !== false ) {
+                               // These are work requests and authentication has previously failed.
+                               // It is most efficient to just give failed pseudo responses back for
+                               // the original work requests.
+                               foreach ( $reqs as $key => $req ) {
+                                       $req['response'] = array(
+                                               'code'     => $this->authCachedStatus,
+                                               'reason'   => $this->authCachedReason,
+                                               'headers'  => array(),
+                                               'body'     => '',
+                                               'error'    => ''
+                                       );
+                                       $result[$key] = $req;
+                               }
+                       } else {
+                               // These are work requests and we have a token already.
+                               // Go through and mangle each request to include a token.
+                               foreach ( $reqs as $key => $req ) {
+                                       // The default encoding treats the URL as a REST style path that uses
+                                       // forward slash as a hierarchical delimiter (and never otherwise).
+                                       // Subclasses can override this, and should be documented in any case.
+                                       $parts = array_map( 'rawurlencode', explode( '/', $req['url'] ) );
+                                       $req['url'] = $this->authCreds['storage_url'] . '/' . implode( '/', $parts );
+                                       $req['headers']['x-auth-token'] = $this->authCreds['auth_token'];
+                                       $result[$key] = $req;
+                                       // @TODO: add ETag/Content-Length and such as needed
+                               }
+                       }
+               }
+               return $result;
+       }
+
+       public function onResponses( array $reqs, Closure $idGeneratorFunc ) {
+               $firstReq = reset( $reqs );
+               if ( $firstReq && count( $reqs ) == 1 && isset( $firstReq['isAuth'] ) ) {
+                       $result = array();
+                       // This was an authentication request for work requests...
+                       if ( $this->applyAuthResponse( $firstReq ) ) {
+                               // If it succeeded, we can subsitute the work requests back.
+                               // Call this recursively in order to munge and add headers.
+                               $result = $this->onRequests( $firstReq['chain'], $idGeneratorFunc );
+                       } else {
+                               // If it failed, it is most efficient to just give failing
+                               // pseudo-responses back for the actual work requests.
+                               foreach ( $firstReq['chain'] as $key => $req ) {
+                                       $req['response'] = array(
+                                               'code'     => $this->authCachedStatus,
+                                               'reason'   => $this->authCachedReason,
+                                               'headers'  => array(),
+                                               'body'     => '',
+                                               'error'    => ''
+                                       );
+                                       $result[$key] = $req;
+                               }
+                       }
+               } else {
+                       $result = $reqs; // no change
+               }
+               return $result;
+       }
+}
diff --git a/includes/libs/virtualrest/VirtualRESTService.php b/includes/libs/virtualrest/VirtualRESTService.php
new file mode 100644 (file)
index 0000000..05c2afc
--- /dev/null
@@ -0,0 +1,107 @@
+<?php
+/**
+ * Virtual HTTP service client
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Virtual HTTP service instance that can be mounted on to a VirtualRESTService
+ *
+ * Sub-classes manage the logic of either:
+ *   - a) Munging virtual HTTP request arrays to have qualified URLs and auth headers
+ *   - b) Emulating the execution of virtual HTTP requests (e.g. brokering)
+ *
+ * Authentication information can be cached in instances of the class for performance.
+ * Such information should also be cached locally on the server and auth requests should
+ * have reasonable timeouts.
+ *
+ * @since 1.23
+ */
+abstract class VirtualRESTService {
+       /** @var array Key/value map */
+       protected $params = array();
+
+       /**
+        * @param array $params Key/value map
+        */
+       public function __construct( array $params ) {
+               $this->params = $params;
+       }
+
+       /**
+        * Prepare virtual HTTP(S) requests (for this service) for execution
+        *
+        * This method should mangle any of the $reqs entry fields as needed:
+        *   - url      : munge the URL to have an absolute URL with a protocol
+        *                and encode path components as needed by the backend [required]
+        *   - query    : include any authentication signatures/parameters [as needed]
+        *   - headers  : include any authentication tokens/headers [as needed]
+        *
+        * The incoming URL parameter will be relative to the service mount point.
+        *
+        * This method can also remove some of the requests as well as add new ones
+        * (using $idGenerator to set each of the entries' array keys). For any existing
+        * or added request, the 'response' array can be filled in, which will prevent the
+        * client from executing it. If an original request is removed, at some point it
+        * must be added back (with the same key) in onRequests() or onResponses();
+        * it's reponse may be filled in as with other requests.
+        *
+        * @param array $reqs Map of Virtual HTTP request arrays
+        * @param Closure $idGeneratorFunc Method to generate unique keys for new requests
+        * @return array Modified HTTP request array map
+        */
+       public function onRequests( array $reqs, Closure $idGeneratorFunc ) {
+               $result = array();
+               foreach ( $reqs as $key => $req ) {
+                       // The default encoding treats the URL as a REST style path that uses
+                       // forward slash as a hierarchical delimiter (and never otherwise).
+                       // Subclasses can override this, and should be documented in any case.
+                       $parts = array_map( 'rawurlencode', explode( '/', $req['url'] ) );
+                       $req['url'] = $this->params['baseUrl'] . '/' . implode( '/', $parts );
+                       $result[$key] = $req;
+               }
+               return $result;
+       }
+
+       /**
+        * Mangle or replace virtual HTTP(S) requests which have been responded to
+        *
+        * This method may mangle any of the $reqs entry 'response' fields as needed:
+        *   - code    : perform any code normalization [as needed]
+        *   - reason  : perform any reason normalization [as needed]
+        *   - headers : perform any header normalization [as needed]
+        *
+        * This method can also remove some of the requests as well as add new ones
+        * (using $idGenerator to set each of the entries' array keys). For any existing
+        * or added request, the 'response' array can be filled in, which will prevent the
+        * client from executing it. If an original request is removed, at some point it
+        * must be added back (with the same key) in onRequests() or onResponses();
+        * it's reponse may be filled in as with other requests. All requests added to $reqs
+        * will be passed through onRequests() to handle any munging required as normal.
+        *
+        * The incoming URL parameter will be relative to the service mount point.
+        *
+        * @param array $reqs Map of Virtual HTTP request arrays with 'response' set
+        * @param Closure $idGeneratorFunc Method to generate unique keys for new requests
+        * @return array Modified HTTP request array map
+        */
+       public function onResponses( array $reqs, Closure $idGeneratorFunc ) {
+               return $reqs;
+       }
+}
diff --git a/includes/libs/virtualrest/VirtualRESTServiceClient.php b/includes/libs/virtualrest/VirtualRESTServiceClient.php
new file mode 100644 (file)
index 0000000..2d21d3c
--- /dev/null
@@ -0,0 +1,289 @@
+<?php
+/**
+ * Virtual HTTP service client
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Virtual HTTP service client loosely styled after a Virtual File System
+ *
+ * Services can be mounted on path prefixes so that virtual HTTP operations
+ * against sub-paths will map to those services. Operations can actually be
+ * done using HTTP messages over the wire or may simple be emulated locally.
+ *
+ * Virtual HTTP request maps are arrays that use the following format:
+ *   - method   : GET/HEAD/PUT/POST/DELETE
+ *   - url      : HTTP/HTTPS URL or virtual service path with a registered prefix
+ *   - query    : <query parameter field/value associative array> (uses RFC 3986)
+ *   - headers  : <header name/value associative array>
+ *   - body     : source to get the HTTP request body from;
+ *                this can simply be a string (always), a resource for
+ *                PUT requests, and a field/value array for POST request;
+ *                array bodies are encoded as multipart/form-data and strings
+ *                use application/x-www-form-urlencoded (headers sent automatically)
+ *   - stream   : resource to stream the HTTP response body to
+ * Request maps can use integer index 0 instead of 'method' and 1 instead of 'url'.
+ *
+ * @author Aaron Schulz
+ * @since 1.23
+ */
+class VirtualRESTServiceClient {
+       /** @var MultiHttpClient */
+       protected $http;
+       /** @var Array Map of (prefix => VirtualRESTService) */
+       protected $instances = array();
+
+       const VALID_MOUNT_REGEX = '#^/[0-9a-z]+/([0-9a-z]+/)*$#';
+
+       /**
+        * @param MultiHttpClient $http
+        */
+       public function __construct( MultiHttpClient $http ) {
+               $this->http = $http;
+       }
+
+       /**
+        * Map a prefix to service handler
+        *
+        * @param string $prefix Virtual path
+        * @param VirtualRESTService $instance
+        */
+       public function mount( $prefix, VirtualRESTService $instance ) {
+               if ( !preg_match( self::VALID_MOUNT_REGEX, $prefix ) ) {
+                       throw new UnexpectedValueException( "Invalid service mount point '$prefix'." );
+               } elseif ( isset( $this->instances[$prefix] ) ) {
+                       throw new UnexpectedValueException( "A service is already mounted on '$prefix'." );
+               }
+               $this->instances[$prefix] = $instance;
+       }
+
+       /**
+        * Unmap a prefix to service handler
+        *
+        * @param string $prefix Virtual path
+        */
+       public function unmount( $prefix ) {
+               if ( !preg_match( self::VALID_MOUNT_REGEX, $prefix ) ) {
+                       throw new UnexpectedValueException( "Invalid service mount point '$prefix'." );
+               } elseif ( !isset( $this->instances[$prefix] ) ) {
+                       throw new UnexpectedValueException( "No service is mounted on '$prefix'." );
+               }
+               unset( $this->instances[$prefix] );
+       }
+
+       /**
+        * Get the prefix and service that a virtual path is serviced by
+        *
+        * @param string $path
+        * @return array (prefix,VirtualRESTService) or (null,null) if none found
+        */
+       public function getMountAndService( $path ) {
+               $cmpFunc = function( $a, $b ) {
+                       $al = substr_count( $a, '/' );
+                       $bl = substr_count( $b, '/' );
+                       if ( $al === $bl ) {
+                               return 0; // should not actually happen
+                       }
+                       return ( $al < $bl ) ? 1 : -1; // largest prefix first
+               };
+
+               $matches = array(); // matching prefixes (mount points)
+               foreach ( $this->instances as $prefix => $service ) {
+                       if ( strpos( $path, $prefix ) === 0 ) {
+                               $matches[] = $prefix;
+                       }
+               }
+               usort( $matches, $cmpFunc );
+
+               // Return the most specific prefix and corresponding service
+               return isset( $matches[0] )
+                       ? array( $matches[0], $this->instances[$matches[0]] )
+                       : array( null, null );
+       }
+
+       /**
+        * Execute a virtual HTTP(S) request
+        *
+        * This method returns a response map of:
+        *   - code    : HTTP response code or 0 if there was a serious cURL error
+        *   - reason  : HTTP response reason (empty if there was a serious cURL error)
+        *   - headers : <header name/value associative array>
+        *   - body    : HTTP response body or resource (if "stream" was set)
+        *   - err     : Any cURL error string
+        * The map also stores integer-indexed copies of these values. This lets callers do:
+        *      <code>
+        *              list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $client->run( $req );
+        *  </code>
+        * @param array $req Virtual HTTP request array
+        * @return array Response array for request
+        */
+       public function run( array $req ) {
+               $req = $this->runMulti( array( $req ) );
+               return $req[0]['response'];
+       }
+
+       /**
+        * Execute a set of virtual HTTP(S) requests concurrently
+        *
+        * A map of requests keys to response maps is returned. Each response map has:
+        *   - code    : HTTP response code or 0 if there was a serious cURL error
+        *   - reason  : HTTP response reason (empty if there was a serious cURL error)
+        *   - headers : <header name/value associative array>
+        *   - body    : HTTP response body or resource (if "stream" was set)
+        *   - err     : Any cURL error string
+        * The map also stores integer-indexed copies of these values. This lets callers do:
+        *      <code>
+        *              list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $responses[0];
+        *  </code>
+        *
+        * @param array $req Map of Virtual HTTP request arrays
+        * @return array $reqs Map of corresponding response values with the same keys/order
+        */
+       public function runMulti( array $reqs ) {
+               foreach ( $reqs as $index => &$req ) {
+                       if ( isset( $req[0] ) ) {
+                               $req['method'] = $req[0]; // short-form
+                               unset( $req[0] );
+                       }
+                       if ( isset( $req[1] ) ) {
+                               $req['url'] = $req[1]; // short-form
+                               unset( $req[1] );
+                       }
+                       $req['chain'] = array(); // chain or list of replaced requests
+               }
+               unset( $req ); // don't assign over this by accident
+
+               $curUniqueId = 0;
+               $armoredIndexMap = array(); // (original index => new index)
+
+               $doneReqs = array(); // (index => request)
+               $executeReqs = array(); // (index => request)
+               $replaceReqsByService = array(); // (prefix => index => request)
+               $origPending = array(); // (index => 1) for original requests
+
+               foreach ( $reqs as $origIndex => $req ) {
+                       // Re-index keys to consecutive integers (they will be swapped back later)
+                       $index = $curUniqueId++;
+                       $armoredIndexMap[$origIndex] = $index;
+                       $origPending[$index] = 1;
+                       if ( preg_match( '#^(http|ftp)s?://#', $req['url'] ) ) {
+                               // Absolute FTP/HTTP(S) URL, run it as normal
+                               $executeReqs[$index] = $req;
+                       } else {
+                               // Must be a virtual HTTP URL; resolve it
+                               list( $prefix, $service ) = $this->getMountAndService( $req['url'] );
+                               if ( !$service ) {
+                                       throw new UnexpectedValueException( "Path '{$req['url']}' has no service." );
+                               }
+                               // Set the URL to the mount-relative portion
+                               $req['url'] = substr( $req['url'], strlen( $prefix ) );
+                               $replaceReqsByService[$prefix][$index] = $req;
+                       }
+               }
+
+               // Function to get IDs that won't collide with keys in $armoredIndexMap
+               $idFunc = function() use ( &$curUniqueId ) {
+                       return $curUniqueId++;
+               };
+
+               $rounds = 0;
+               do {
+                       if ( ++$rounds > 5 ) { // sanity
+                               throw new Exception( "Too many replacement rounds detected. Aborting." );
+                       }
+                       // Resolve the virtual URLs valid and qualified HTTP(S) URLs
+                       // and add any required authentication headers for the backend.
+                       // Services can also replace requests with new ones, either to
+                       // defer the original or to set a proxy response to the original.
+                       $newReplaceReqsByService = array();
+                       foreach ( $replaceReqsByService as $prefix => $servReqs ) {
+                               $service = $this->instances[$prefix];
+                               foreach ( $service->onRequests( $servReqs, $idFunc ) as $index => $req ) {
+                                       // Services use unique IDs for replacement requests
+                                       if ( isset( $servReqs[$index] ) || isset( $origPending[$index] ) ) {
+                                               // A current or original request which was not modified
+                                       } else {
+                                               // Replacement requests with pre-set responses should not execute
+                                               $newReplaceReqsByService[$prefix][$index] = $req;
+                                       }
+                                       if ( isset( $req['response'] ) ) {
+                                               // Replacement requests with pre-set responses should not execute
+                                               unset( $executeReqs[$index] );
+                                               unset( $origPending[$index] );
+                                               $doneReqs[$index] = $req;
+                                       } else {
+                                               // Original or mangled request included
+                                               $executeReqs[$index] = $req;
+                                       }
+                               }
+                       }
+                       // Update index of requests to inspect for replacement
+                       $replaceReqsByService = $newReplaceReqsByService;
+                       // Run the actual work HTTP requests
+                       foreach ( $this->http->runMulti( $executeReqs ) as $index => $ranReq ) {
+                               $doneReqs[$index] = $ranReq;
+                               unset( $origPending[$index] );
+                       }
+                       $executeReqs = array();
+                       // Services can also replace requests with new ones, either to
+                       // defer the original or to set a proxy response to the original.
+                       // Any replacement requests executed above will need to be replaced
+                       // with new requests (eventually the original). The responses can be
+                       // forced instead of having the request sent over the wire.
+                       $newReplaceReqsByService = array();
+                       foreach ( $replaceReqsByService as $prefix => $servReqs ) {
+                               $service = $this->instances[$prefix];
+                               // Only the request copies stored in $doneReqs actually have the response
+                               $servReqs = array_intersect_key( $doneReqs, $servReqs );
+                               foreach ( $service->onResponses( $servReqs, $idFunc ) as $index => $req ) {
+                                       // Services use unique IDs for replacement requests
+                                       if ( isset( $servReqs[$index] ) || isset( $origPending[$index] ) ) {
+                                               // A current or original request which was not modified
+                                       } else {
+                                               // Replacement requests with pre-set responses should not execute
+                                               $newReplaceReqsByService[$prefix][$index] = $req;
+                                       }
+                                       if ( isset( $req['response'] ) ) {
+                                               // Replacement requests with pre-set responses should not execute
+                                               unset( $origPending[$index] );
+                                               $doneReqs[$index] = $req;
+                                       } else {
+                                               // Update the request in case it was mangled
+                                               $executeReqs[$index] = $req;
+                                       }
+                               }
+                       }
+                       // Update index of requests to inspect for replacement
+                       $replaceReqsByService = $newReplaceReqsByService;
+               } while ( count( $origPending ) );
+
+               $responses = array();
+               // Update $reqs to include 'response' and normalized request 'headers'.
+               // This maintains the original order of $reqs.
+               foreach ( $reqs as $origIndex => $req ) {
+                       $index = $armoredIndexMap[$origIndex];
+                       if ( !isset( $doneReqs[$index] ) ) {
+                               throw new UnexpectedValueException( "Response for request '$index' is NULL." );
+                       }
+                       $responses[$origIndex] = $doneReqs[$index]['response'];
+               }
+
+               return $responses;
+       }
+}
index 82197b5..d71e660 100644 (file)
@@ -76,7 +76,10 @@ if [ "$MW_MEM_LIMIT" -gt 0 ]; then
                # Memory
                echo $(($MW_MEM_LIMIT*1024)) > "$MW_CGROUP"/$$/memory.limit_in_bytes
                # Memory+swap
-               echo $(($MW_MEM_LIMIT*1024)) > "$MW_CGROUP"/$$/memory.memsw.limit_in_bytes
+               # This will be missing if there is no swap
+               if [ -e "$MW_CGROUP"/$$/memory.memsw.limit_in_bytes ]; then
+                       echo $(($MW_MEM_LIMIT*1024)) > "$MW_CGROUP"/$$/memory.memsw.limit_in_bytes
+               fi
        else
                ulimit -v "$MW_MEM_LIMIT"
        fi
index 71b4fc2..d893be5 100644 (file)
@@ -88,8 +88,8 @@ interface LogEntry {
        public function getDeleted();
 
        /**
-        * @param $field Integer: one of LogPage::DELETED_* bitfield constants
-        * @return Boolean
+        * @param int $field One of LogPage::DELETED_* bitfield constants
+        * @return bool
         */
        public function isDeleted( $field );
 }
@@ -407,7 +407,7 @@ class ManualLogEntry extends LogEntryBase {
         * Declare arbitrary tag/value relations to this log entry.
         * These can be used to filter log entries later on.
         *
-        * @param array $relations Map of (tag => (list of values))
+        * @param array $relations Map of (tag => (list of values|value))
         * @since 1.22
         */
        public function setRelations( array $relations ) {
@@ -463,7 +463,7 @@ class ManualLogEntry extends LogEntryBase {
         *
         * @since 1.19
         *
-        * @param integer $deleted
+        * @param int $deleted
         */
        public function setDeleted( $deleted ) {
                $this->deleted = $deleted;
@@ -512,6 +512,11 @@ class ManualLogEntry extends LogEntryBase {
                        if ( !strlen( $tag ) ) {
                                throw new MWException( "Got empty log search tag." );
                        }
+
+                       if ( !is_array( $values ) ) {
+                               $values = array( $values );
+                       }
+
                        foreach ( $values as $value ) {
                                $rows[] = array(
                                        'ls_field' => $tag,
@@ -569,8 +574,8 @@ class ManualLogEntry extends LogEntryBase {
 
        /**
         * Publishes the log entry.
-        * @param int $newId id of the log entry.
-        * @param string $to rcandudp (default), rc, udp
+        * @param int $newId Id of the log entry.
+        * @param string $to One of: rcandudp (default), rc, udp
         */
        public function publish( $newId, $to = 'rcandudp' ) {
                $log = new LogPage( $this->getType() );
index cce902f..fda9a20 100644 (file)
@@ -31,7 +31,7 @@ class LogEventsList extends ContextSource {
        public $flags;
 
        /**
-        * @var Array
+        * @var array
         */
        protected $mDefaultQuery;
 
@@ -276,7 +276,7 @@ class LogEventsList extends ContextSource {
        }
 
        /**
-        * @param $pattern
+        * @param string $pattern
         * @return string Checkbox
         */
        private function getTitlePattern( $pattern ) {
index ed3a8da..0139c4a 100644 (file)
@@ -64,7 +64,7 @@ class LogFormatter {
        /**
         * Handy shortcut for constructing a formatter directly from
         * database row.
-        * @param $row
+        * @param object $row
         * @see DatabaseLogEntry::getSelectQueryData
         * @return LogFormatter
         */
@@ -77,7 +77,7 @@ class LogFormatter {
        /** @var LogEntryBase */
        protected $entry;
 
-       /** @var Integer Constant for handling log_deleted */
+       /** @var int Constant for handling log_deleted */
        protected $audience = self::FOR_PUBLIC;
 
        /** @var bool Whether to output user tool links */
index d33fc91..399c799 100644 (file)
@@ -50,13 +50,13 @@ class LogPager extends ReverseChronologicalPager {
         *
         * @param LogEventsList $list
         * @param string|array $types Log types to show
-        * @param string $performer the user who made the log entries
-        * @param string|Title $title the page title the log entries are for
-        * @param string $pattern do a prefix search rather than an exact title match
-        * @param array $conds extra conditions for the query
+        * @param string $performer The user who made the log entries
+        * @param string|Title $title The page title the log entries are for
+        * @param string $pattern Do a prefix search rather than an exact title match
+        * @param array $conds Extra conditions for the query
         * @param int|bool $year The year to start from. Default: false
         * @param int|bool $month The month to start from. Default: false
-        * @param string $tagFilter tag
+        * @param string $tagFilter Tag
         */
        public function __construct( $list, $types = array(), $performer = '', $title = '', $pattern = '',
                $conds = array(), $year = false, $month = false, $tagFilter = '' ) {
@@ -289,7 +289,7 @@ class LogPager extends ReverseChronologicalPager {
 
        /**
         * Checks if $this->mConds has $field matched to a *single* value
-        * @param $field
+        * @param string $field
         * @return bool
         */
        protected function hasEqualsClause( $field ) {
index 967b017..d8b0ba6 100644 (file)
@@ -51,7 +51,7 @@ class BmpHandler extends BitmapHandler {
        /**
         * Get width and height from the bmp header.
         *
-        * @param $image
+        * @param File $image
         * @param string $filename
         * @return array
         */
index 607c4e5..44be178 100644 (file)
@@ -138,6 +138,10 @@ class BitmapHandler extends ImageHandler {
                        'dstUrl' => $dstUrl,
                );
 
+               if ( isset( $params['quality'] ) && $params['quality'] === 'low' ) {
+                       $scalerParams['quality'] = 30;
+               }
+
                # Determine scaler type
                $scaler = self::getScalerType( $dstPath );
 
@@ -147,6 +151,7 @@ class BitmapHandler extends ImageHandler {
                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
@@ -163,12 +168,14 @@ class BitmapHandler extends ImageHandler {
 
                if ( $flags & self::TRANSFORM_LATER ) {
                        wfDebug( __METHOD__ . ": Transforming later per flags.\n" );
-                       $params = array(
+                       $newParams = array(
                                'width' => $scalerParams['clientWidth'],
                                'height' => $scalerParams['clientHeight']
                        );
-
-                       return new ThumbnailImage( $image, $dstUrl, false, $params );
+                       if ( isset( $params['quality'] ) ) {
+                               $newParams['quality'] = $params['quality'];
+                       }
+                       return new ThumbnailImage( $image, $dstUrl, false, $newParams );
                }
 
                # Try to make a target path for the thumbnail
@@ -235,12 +242,14 @@ class BitmapHandler extends ImageHandler {
                } elseif ( $mto ) {
                        return $mto;
                } else {
-                       $params = array(
+                       $newParams = array(
                                'width' => $scalerParams['clientWidth'],
                                'height' => $scalerParams['clientHeight']
                        );
-
-                       return new ThumbnailImage( $image, $dstUrl, $dstPath, $params );
+                       if ( isset( $params['quality'] ) ) {
+                               $newParams['quality'] = $params['quality'];
+                       }
+                       return new ThumbnailImage( $image, $dstUrl, $dstPath, $newParams );
                }
        }
 
@@ -314,7 +323,8 @@ class BitmapHandler extends ImageHandler {
                $animation_post = array();
                $decoderHint = array();
                if ( $params['mimeType'] == 'image/jpeg' ) {
-                       $quality = array( '-quality', '80' ); // 80%
+                       $qualityVal = isset( $params['quality'] ) ? (string) $params['quality'] : null;
+                       $quality = array( '-quality', $qualityVal ?: '80' ); // 80%
                        # Sharpening, see bug 6193
                        if ( ( $params['physicalWidth'] + $params['physicalHeight'] )
                                / ( $params['srcWidth'] + $params['srcHeight'] )
@@ -419,7 +429,8 @@ class BitmapHandler extends ImageHandler {
                                        list( $radius, $sigma ) = explode( 'x', $wgSharpenParameter );
                                        $im->sharpenImage( $radius, $sigma );
                                }
-                               $im->setCompressionQuality( 80 );
+                               $qualityVal = isset( $params['quality'] ) ? (string) $params['quality'] : null;
+                               $im->setCompressionQuality( $qualityVal ?: 80 );
                        } elseif ( $params['mimeType'] == 'image/png' ) {
                                $im->setCompressionQuality( 95 );
                        } elseif ( $params['mimeType'] == 'image/gif' ) {
@@ -531,13 +542,14 @@ class BitmapHandler extends ImageHandler {
                # input routine for this.
 
                $typemap = array(
-                       'image/gif' => array( 'imagecreatefromgif', 'palette', 'imagegif' ),
-                       'image/jpeg' => array( 'imagecreatefromjpeg', 'truecolor',
+                       'image/gif' => array( 'imagecreatefromgif', 'palette', false, 'imagegif' ),
+                       'image/jpeg' => array( 'imagecreatefromjpeg', 'truecolor', true,
                                array( __CLASS__, 'imageJpegWrapper' ) ),
-                       'image/png' => array( 'imagecreatefrompng', 'bits', 'imagepng' ),
-                       'image/vnd.wap.wbmp' => array( 'imagecreatefromwbmp', 'palette', 'imagewbmp' ),
-                       'image/xbm' => array( 'imagecreatefromxbm', 'palette', 'imagexbm' ),
+                       'image/png' => array( 'imagecreatefrompng', 'bits', false, 'imagepng' ),
+                       'image/vnd.wap.wbmp' => array( 'imagecreatefromwbmp', 'palette', false, 'imagewbmp' ),
+                       'image/xbm' => array( 'imagecreatefromxbm', 'palette', false, 'imagexbm' ),
                );
+
                if ( !isset( $typemap[$params['mimeType']] ) ) {
                        $err = 'Image type not supported';
                        wfDebug( "$err\n" );
@@ -545,7 +557,7 @@ class BitmapHandler extends ImageHandler {
 
                        return $this->getMediaTransformError( $params, $errMsg );
                }
-               list( $loader, $colorStyle, $saveType ) = $typemap[$params['mimeType']];
+               list( $loader, $colorStyle, $useQuality, $saveType ) = $typemap[$params['mimeType']];
 
                if ( !function_exists( $loader ) ) {
                        $err = "Incomplete GD library configuration: missing function $loader";
@@ -597,7 +609,12 @@ class BitmapHandler extends ImageHandler {
 
                imagesavealpha( $dst_image, true );
 
-               call_user_func( $saveType, $dst_image, $params['dstPath'] );
+               $funcParams = array( $dst_image, $params['dstPath'] );
+               if ( $useQuality && isset( $params['quality'] ) ) {
+                       $funcParams[] = $params['quality'];
+               }
+               call_user_func_array( $saveType, $funcParams );
+
                imagedestroy( $dst_image );
                imagedestroy( $src_image );
 
@@ -730,9 +747,10 @@ class BitmapHandler extends ImageHandler {
                return $cache;
        }
 
-       static function imageJpegWrapper( $dst_image, $thumbPath ) {
+       // FIXME: transformImageMagick() & transformImageMagickExt() uses JPEG quality 80, here it's 95?
+       static function imageJpegWrapper( $dst_image, $thumbPath, $quality = 95 ) {
                imageinterlace( $dst_image );
-               imagejpeg( $dst_image, $thumbPath, 95 );
+               imagejpeg( $dst_image, $thumbPath, $quality );
        }
 
        /**
index d296269..b91fb8a 100644 (file)
  *
  * @ingroup Media
  */
+// @codingStandardsIgnoreStart Squiz.Classes.ValidClassName.NotCamelCaps
 class BitmapHandler_ClientOnly extends BitmapHandler {
+       // @codingStandardsIgnoreEnd
+
        /**
-        * @param $image File
-        * @param $params
+        * @param File $image
+        * @param array $params
         * @return bool
         */
        function normaliseParams( $image, &$params ) {
index 2aeb35d..200d526 100644 (file)
@@ -73,6 +73,11 @@ class DjVuHandler extends ImageHandler {
         * @return bool
         */
        function validateParam( $name, $value ) {
+               if ( $name === 'page' && trim( $value ) !== (string) intval( $value ) ) {
+                       // Extra junk on the end of page, probably actually a caption
+                       // e.g. [[File:Foo.djvu|thumb|Page 3 of the document shows foo]]
+                       return false;
+               }
                if ( in_array( $name, array( 'width', 'height', 'page' ) ) ) {
                        if ( $value <= 0 ) {
                                return false;
@@ -260,7 +265,7 @@ class DjVuHandler extends ImageHandler {
         * Get metadata, unserializing it if neccessary.
         *
         * @param File $file The DjVu file in question
-        * @return String XML metadata as a string.
+        * @return string XML metadata as a string.
         */
        private function getUnserializedMetadata( File $file ) {
                $metadata = $file->getMetadata();
@@ -273,7 +278,14 @@ class DjVuHandler extends ImageHandler {
                $unser = unserialize( $metadata );
                wfRestoreWarnings();
                if ( is_array( $unser ) ) {
-                       return $unser['xml'];
+                       if ( isset( $unser['error'] ) ) {
+                               return false;
+                       } elseif ( isset( $unser['xml'] ) ) {
+                               return $unser['xml'];
+                       } else {
+                               // Should never ever reach here.
+                               throw new MWException( "Error unserializing DjVu metadata." );
+                       }
                }
 
                // unserialize failed. Guess it wasn't really serialized after all,
@@ -359,7 +371,8 @@ class DjVuHandler extends ImageHandler {
 
                $xml = $this->getDjVuImage( $image, $path )->retrieveMetaData();
                if ( $xml === false ) {
-                       return false;
+                       // Special value so that we don't repetitively try and decode a broken file.
+                       return serialize( array( 'error' => 'Error extracting metadata' ) );
                } else {
                        return serialize( array( 'xml' => $xml ) );
                }
index e1e7992..099375b 100644 (file)
@@ -60,7 +60,7 @@ class DjVuImage {
 
        /**
         * Return data in the style of getimagesize()
-        * @return array or false on failure
+        * @return array|bool Array or false on failure
         */
        public function getImageSize() {
                $data = $this->getInfo();
@@ -330,7 +330,7 @@ EOR;
 
        /**
         * Hack to temporarily work around djvutoxml bug
-        * @param $dump
+        * @param string $dump
         * @return string
         */
        function convertDumpToXML( $dump ) {
index 4bbafc1..ae1ff9d 100644 (file)
@@ -80,7 +80,7 @@ class ExifBitmapHandler extends BitmapHandler {
        }
 
        /**
-        * @param $image
+        * @param File $image
         * @param array $metadata
         * @return bool|int
         */
@@ -198,7 +198,7 @@ class ExifBitmapHandler extends BitmapHandler {
         * the width and height we normally work with is logical, and will match
         * any produced output views.
         *
-        * @param $file File
+        * @param File $file
         * @return int 0, 90, 180 or 270
         */
        public function getRotation( $file ) {
index adaba76..fca1c6d 100644 (file)
@@ -985,7 +985,7 @@ class FormatMetadata extends ContextSource {
         * @param bool $noHtml If to avoid returning anything resembling HTML.
         *   (Ugly hack for backwards compatibility with old MediaWiki).
         * @param bool|IContextSource $context
-        * @return String single value (in wiki-syntax).
+        * @return string Single value (in wiki-syntax).
         * @since 1.23
         */
        public static function flattenArrayContentLang( $vals, $type = 'ul',
@@ -1036,9 +1036,9 @@ class FormatMetadata extends ContextSource {
         *     lang = language assoc array with keys being the lang code
         *     ul = unordered list, ol = ordered list
         *     type can also come from the '_type' member of $vals.
-        * @param $noHtml Boolean If to avoid returning anything resembling HTML.
+        * @param bool $noHtml If to avoid returning anything resembling HTML.
         *   (Ugly hack for backwards compatibility with old mediawiki).
-        * @return String single value (in wiki-syntax).
+        * @return string Single value (in wiki-syntax).
         * @since 1.23
         */
        public function flattenArrayReal( $vals, $type = 'ul', $noHtml = false ) {
@@ -1156,8 +1156,8 @@ class FormatMetadata extends ContextSource {
 
        /** Helper function for creating lists of translations.
         *
-        * @param string $value value (this is not escaped)
-        * @param string $lang lang code of item or false
+        * @param string $value Value (this is not escaped)
+        * @param string $lang Lang code of item or false
         * @param bool $default If it is default value.
         * @param bool $noHtml If to avoid html (for back-compat)
         * @throws MWException
index 9ed626f..a0f7acb 100644 (file)
  * @ingroup Media
  */
 class JpegHandler extends ExifBitmapHandler {
+
+       function normaliseParams( $image, &$params ) {
+               if ( !parent::normaliseParams( $image, $params ) ) {
+                       return false;
+               }
+               if ( isset( $params['quality'] ) && !self::validateQuality( $params['quality'] ) ) {
+                       return false;
+               }
+               return true;
+       }
+
+       function validateParam( $name, $value ) {
+               if ( $name === 'quality' ) {
+                       return self::validateQuality( $value );
+               } else {
+                       return parent::validateParam( $name, $value );
+               }
+       }
+
+       /** Validate and normalize quality value to be between 1 and 100 (inclusive).
+        * @param int $value quality value, will be converted to integer or 0 if invalid
+        * @return bool true if the value is valid
+        */
+       private static function validateQuality( $value ) {
+               return $value === 'low';
+       }
+
+       function makeParamString( $params ) {
+               // Prepend quality as "qValue-". This has to match parseParamString() below
+               $res = parent::makeParamString( $params );
+               if ( $res && isset( $params['quality'] ) ) {
+                       $res = "q{$params['quality']}-$res";
+               }
+               return $res;
+       }
+
+       function parseParamString( $str ) {
+               // $str contains "qlow-200px" or "200px" strings because thumb.php would strip the filename
+               // first - check if the string begins with "qlow-", and if so, treat it as quality.
+               // Pass the first portion, or the whole string if "qlow-" not found, to the parent
+               // The parsing must match the makeParamString() above
+               $res = false;
+               $m = false;
+               if ( preg_match( '/q([^-]+)-(.*)$/', $str, $m ) ) {
+                       $v = $m[1];
+                       if ( self::validateQuality( $v ) ) {
+                               $res = parent::parseParamString( $m[2] );
+                               if ( $res ) {
+                                       $res['quality'] = $v;
+                               }
+                       }
+               } else {
+                       $res = parent::parseParamString( $str );
+               }
+               return $res;
+       }
+
+       function getScriptParams( $params ) {
+               $res = parent::getScriptParams( $params );
+               if ( isset( $params['quality'] ) ) {
+                       $res['quality'] = $params['quality'];
+               }
+               return $res;
+       }
+
        function getMetadata( $image, $filename ) {
                try {
                        $meta = BitmapMetadataHandler::Jpeg( $filename );
index e4caf35..f131af4 100644 (file)
@@ -495,7 +495,7 @@ abstract class MediaHandler {
         * This is used by the media handlers that use the FormatMetadata class
         *
         * @param array $metadataArray Metadata array
-        * @return array for use displaying metadata.
+        * @return array Array for use displaying metadata.
         */
        function formatMetadataHelper( $metadataArray ) {
                $result = array(
@@ -523,7 +523,7 @@ abstract class MediaHandler {
         * Get a list of metadata items which should be displayed when
         * the metadata table is collapsed.
         *
-        * @return array of strings
+        * @return array Array of strings
         */
        protected function visibleMetadataFields() {
                return FormatMetadata::getVisibleFields();
@@ -573,7 +573,7 @@ abstract class MediaHandler {
        }
 
        /**
-        * Used instead of getLongDesc if there is no handler registered for file.
+        * Short description. Shown on Special:Search results.
         *
         * @param File $file
         * @return string
@@ -585,7 +585,7 @@ abstract class MediaHandler {
        }
 
        /**
-        * Short description. Shown on Special:Search results.
+        * Long description. Shown under image on image description page surounded by ().
         *
         * @param File $file
         * @return string
@@ -598,7 +598,7 @@ abstract class MediaHandler {
        }
 
        /**
-        * Long description. Shown under image on image description page surounded by ().
+        * Used instead of getShortDesc if there is no handler registered for file.
         *
         * @param File $file
         * @return string
@@ -610,7 +610,7 @@ abstract class MediaHandler {
        }
 
        /**
-        * Used instead of getShortDesc if there is no handler registered for file.
+        * Used instead of getLongDesc if there is no handler registered for file.
         *
         * @param File $file
         * @return string
@@ -644,7 +644,7 @@ abstract class MediaHandler {
         * Shown in file history box on image description page.
         *
         * @param File $file
-        * @return String Dimensions
+        * @return string Dimensions
         */
        function getDimensionsString( $file ) {
                return '';
@@ -776,7 +776,7 @@ abstract class MediaHandler {
         * Get list of languages file can be viewed in.
         *
         * @param File $file
-        * @return Array Array of language codes, or empty array if unsupported.
+        * @return string[] Array of language codes, or empty array if unsupported.
         * @since 1.23
         */
        public function getAvailableLanguages( File $file ) {
@@ -792,7 +792,7 @@ abstract class MediaHandler {
         * type do not support alternative language renderings.
         *
         * @param File $file
-        * @return String language code or null if multi-language not supported for filetype.
+        * @return string|null Language code or null if multi-language not supported for filetype.
         * @since 1.23
         */
        public function getDefaultRenderLanguage( File $file ) {
index 05feb30..d8d56a4 100644 (file)
@@ -80,14 +80,14 @@ abstract class MediaTransformOutput {
        /**
         * Get the final extension of the thumbnail.
         * Returns false for scripted transformations.
-        * @return string|false
+        * @return string|bool
         */
        public function getExtension() {
                return $this->path ? FileBackend::extensionFromPath( $this->path ) : false;
        }
 
        /**
-        * @return string|false The thumbnail URL
+        * @return string|bool The thumbnail URL
         */
        public function getUrl() {
                return $this->url;
@@ -106,6 +106,9 @@ abstract class MediaTransformOutput {
         */
        public function setStoragePath( $storagePath ) {
                $this->storagePath = $storagePath;
+               if ( $this->path === false ) {
+                       $this->path = $storagePath;
+               }
        }
 
        /**
@@ -140,9 +143,12 @@ abstract class MediaTransformOutput {
 
        /**
         * Check if an output thumbnail file actually exists.
+        *
         * This will return false if there was an error, the
         * thumbnail is to be handled client-side only, or if
         * transformation was deferred via TRANSFORM_LATER.
+        * This file may exist as a new file in /tmp, a file
+        * in permanent storage, or even refer to the original.
         *
         * @return bool
         */
@@ -218,7 +224,7 @@ abstract class MediaTransformOutput {
        }
 
        /**
-        * @param $title string
+        * @param string $title
         * @param string|array $params Query parameters to add
         * @return array
         */
index ce7fcbb..5a10741 100644 (file)
@@ -86,7 +86,7 @@ class SvgHandler extends ImageHandler {
         * this list.
         *
         * @param File $file
-        * @return Array of language codes, or empty if no language switching supported.
+        * @return array Array of language codes, or empty if no language switching supported.
         */
        public function getAvailableLanguages( File $file ) {
                $metadata = $file->getMetadata();
@@ -107,7 +107,7 @@ class SvgHandler extends ImageHandler {
        /**
         * What language to render file in if none selected.
         *
-        * @return String language code.
+        * @return string Language code.
         */
        public function getDefaultRenderLanguage( File $file ) {
                return 'en';
index 361eb94..2a1091d 100644 (file)
@@ -123,7 +123,7 @@ class SVGReader {
        }
 
        /**
-        * @return Array with the known metadata
+        * @return array Array with the known metadata
         */
        public function getMetadata() {
                return $this->metadata;
index 08d416a..55d5319 100644 (file)
@@ -159,7 +159,7 @@ class XMPReader {
        /** Get the result array. Do some post-processing before returning
         * the array, and transform any metadata that is special-cased.
         *
-        * @return Array array of results as an array of arrays suitable for
+        * @return array Array of results as an array of arrays suitable for
         *    FormatMetadata::getFormattedData().
         */
        public function getResults() {
@@ -851,8 +851,8 @@ class XMPReader {
         * This is generally where most properties start.
         *
         * @param string $ns Namespace
-        * @param string $tag tag name (without namespace prefix)
-        * @param array $attribs array of attributes
+        * @param string $tag Tag name (without namespace prefix)
+        * @param array $attribs Array of attributes
         * @throws MWException
         */
        private function startElementModeInitial( $ns, $tag, $attribs ) {
@@ -1041,7 +1041,7 @@ class XMPReader {
         * Generally just calls a helper based on what MODE we're in.
         * Also does some initial set up for the wrapper element
         *
-        * @param $parser XMLParser
+        * @param XMLParser $parser
         * @param string $elm Namespace "<space>" element
         * @param array $attribs Attribute name => value
         * @throws MWException
index 4362217..0fa6011 100644 (file)
@@ -142,7 +142,7 @@ class XMPValidate {
         * choices. (closed choice)
         *
         * @param array $info Information about current property
-        * @param &$val Mixed current value to validate
+        * @param mixed &$val Current value to validate
         * @param bool $standalone If this is a simple property or array
         */
        public static function validateClosed( $info, &$val, $standalone ) {
@@ -172,7 +172,7 @@ class XMPValidate {
         * function to validate and modify flash structure
         *
         * @param array $info Information about current property
-        * @param &$val Mixed current value to validate
+        * @param mixed &$val Current value to validate
         * @param bool $standalone If this is a simple property or array
         */
        public static function validateFlash( $info, &$val, $standalone ) {
@@ -206,7 +206,7 @@ class XMPValidate {
         * @see http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart1.pdf page 30 (section 8.2.2.5)
         *
         * @param array $info Information about current property
-        * @param &$val Mixed current value to validate
+        * @param mixed &$val Current value to validate
         * @param bool $standalone If this is a simple property or array
         */
        public static function validateLangCode( $info, &$val, $standalone ) {
index 5dc9590..0604d7b 100644 (file)
@@ -26,7 +26,7 @@
  * @ingroup UtfNormal
  */
 
-if( PHP_SAPI != 'cli' ) {
+if ( PHP_SAPI != 'cli' ) {
        die( "Run me from the command line please.\n" );
 }
 
@@ -40,8 +40,9 @@ dl( 'php_utfnormal.so' );
 
 function randomString( $length, $nullOk, $ascii = false ) {
        $out = '';
-       for( $i = 0; $i < $length; $i++ )
+       for ( $i = 0; $i < $length; $i++ )
                $out .= chr( mt_rand( $nullOk ? 0 : 1, $ascii ? 127 : 255 ) );
+
        return $out;
 }
 
@@ -66,7 +67,7 @@ function showDiffs( $a, $b ) {
        $funky = $formatter->format( $diffs );
        $matches = array();
        preg_match_all( '/<(?:ins|del) class="diffchange">(.*?)<\/(?:ins|del)>/', $funky, $matches );
-       foreach( $matches[1] as $bit ) {
+       foreach ( $matches[1] as $bit ) {
                $hex = bin2hex( $bit );
                echo "\t$hex\n";
        }
@@ -74,28 +75,27 @@ function showDiffs( $a, $b ) {
 
 $size = 16;
 $n = 0;
-while( true ) {
+while ( true ) {
        $n++;
        echo "$n\n";
 
-       $str = randomString( $size, true);
+       $str = randomString( $size, true );
        $clean = UtfNormal::cleanUp( $str );
        $norm = donorm( $str );
 
        echo strlen( $clean ) . ", " . strlen( $norm );
-       if( $clean == $norm ) {
+       if ( $clean == $norm ) {
                echo " (match)\n";
        } else {
                echo " (FAIL)\n";
                echo "\traw: " . bin2hex( $str ) . "\n" .
-                        "\tphp: " . bin2hex( $clean ) . "\n" .
-                        "\ticu: " . bin2hex( $norm ) . "\n";
+                       "\tphp: " . bin2hex( $clean ) . "\n" .
+                       "\ticu: " . bin2hex( $norm ) . "\n";
                echo "\n\tdiffs:\n";
                showDiffs( $clean, $norm );
                die();
        }
 
-
        $str = '';
        $clean = '';
        $norm = '';
index 61c315f..f4acc1e 100644 (file)
@@ -40,27 +40,27 @@ $verbose = false;
 #$verbose = true;
 
 $in = fopen( "UTF-8-test.txt", "rt" );
-if( !$in ) {
+if ( !$in ) {
        print "Couldn't open UTF-8-test.txt -- can't run tests.\n";
        print "If necessary, manually download this file. It can be obtained at\n";
        print "http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt\n";
-       exit(-1);
+       exit( -1 );
 }
 
 $columns = 0;
-while( false !== ( $line = fgets( $in ) ) ) {
+while ( false !== ( $line = fgets( $in ) ) ) {
        $matches = array();
-       if( preg_match( '/^(Here come the tests:\s*)\|$/', $line, $matches ) ) {
+       if ( preg_match( '/^(Here come the tests:\s*)\|$/', $line, $matches ) ) {
                $columns = strpos( $line, '|' );
                break;
        }
 }
 
-if( !$columns ) {
+if ( !$columns ) {
        print "Something seems to be wrong; couldn't extract line length.\n";
        print "Check that UTF-8-test.txt was downloaded correctly from\n";
        print "http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt\n";
-       exit(-1);
+       exit( -1 );
 }
 
 # print "$columns\n";
@@ -90,22 +90,26 @@ $test = '';
 $failed = 0;
 $success = 0;
 $total = 0;
-while( false !== ( $line = fgets( $in ) ) ) {
+while ( false !== ( $line = fgets( $in ) ) ) {
        $matches = array();
-       if( preg_match( '/^(\d+)\s+(.*?)\s*\|/', $line, $matches ) ) {
+       if ( preg_match( '/^(\d+)\s+(.*?)\s*\|/', $line, $matches ) ) {
                $section = $matches[1];
                print $line;
                continue;
        }
-       if( preg_match( '/^(\d+\.\d+\.\d+)\s*/', $line, $matches ) ) {
+       if ( preg_match( '/^(\d+\.\d+\.\d+)\s*/', $line, $matches ) ) {
                $test = $matches[1];
 
-               if( in_array( $test, $ignore ) ) {
+               if ( in_array( $test, $ignore ) ) {
                        continue;
                }
-               if( in_array( $test, $longTests ) ) {
+               if ( in_array( $test, $longTests ) ) {
                        $line = fgets( $in );
-                       for( $line = fgets( $in ); !preg_match( '/^\s+\|/', $line ); $line = fgets( $in ) ) {
+
+                       // @codingStandardsIgnoreStart Generic.CodeAnalysis.ForLoopWithTestFunctionCall.NotAllowed
+                       for ( $line = fgets( $in ); !preg_match( '/^\s+\|/', $line ); $line = fgets( $in ) ) {
+                               // @codingStandardsIgnoreEnd
+
                                testLine( $test, $line, $total, $success, $failed, $columns, $exceptions, $verbose );
                        }
                } else {
@@ -114,15 +118,14 @@ while( false !== ( $line = fgets( $in ) ) ) {
        }
 }
 
-if( $failed ) {
+if ( $failed ) {
        echo "\nFailed $failed tests.\n";
        echo "UTF-8 DECODER TEST FAILED\n";
-       exit (-1);
+       exit ( -1 );
 }
 
 echo "UTF-8 DECODER TEST SUCCESS!\n";
-exit (0);
-
+exit ( 0 );
 
 function testLine( $test, $line, &$total, &$success, &$failed, $columns, $exceptions, $verbose ) {
        $stripped = $line;
@@ -130,24 +133,24 @@ function testLine( $test, $line, &$total, &$success, &$failed, $columns, $except
 
        $same = ( $line == $stripped );
        $len = mb_strlen( substr( $stripped, 0, strpos( $stripped, '|' ) ) );
-       if( $len == 0 ) {
+       if ( $len == 0 ) {
                $len = strlen( substr( $stripped, 0, strpos( $stripped, '|' ) ) );
        }
 
-       $ok = $same ^ ($test >= 3 );
+       $ok = $same ^ ( $test >= 3 );
 
        $ok ^= in_array( $test, $exceptions );
 
-       $ok &= ($columns == $len);
+       $ok &= ( $columns == $len );
 
        $total++;
-       if( $ok ) {
+       if ( $ok ) {
                $success++;
        } else {
                $failed++;
        }
 
-       if( $verbose || !$ok ) {
+       if ( $verbose || !$ok ) {
                print str_replace( "\n", "$len\n", $stripped );
        }
 }
index f6f7dbb..8204f97 100644 (file)
@@ -50,21 +50,20 @@ class UtfNormal {
         * For using the ICU wrapper
         */
        const UNORM_NONE = 1;
-       const UNORM_NFD  = 2;
+       const UNORM_NFD = 2;
        const UNORM_NFKD = 3;
-       const UNORM_NFC  = 4;
+       const UNORM_NFC = 4;
        const UNORM_NFKC = 5;
-       const UNORM_FCD  = 6;
+       const UNORM_FCD = 6;
        const UNORM_DEFAULT = self::UNORM_NFC;
 
-       static $utfCombiningClass = null;
-       static $utfCanonicalComp = null;
-       static $utfCanonicalDecomp = null;
+       public static $utfCombiningClass = null;
+       public static $utfCanonicalComp = null;
+       public static $utfCanonicalDecomp = null;
 
        # Load compatibility decompositions on demand if they are needed.
-       static $utfCompatibilityDecomp = null;
-
-       static $utfCheckNFC;
+       public static $utfCompatibilityDecomp = null;
+       public static $utfCheckNFC;
 
        /**
         * The ultimate convenience function! Clean up invalid UTF-8 sequences,
@@ -77,21 +76,21 @@ class UtfNormal {
         * @return string a clean, shiny, normalized UTF-8 string
         */
        static function cleanUp( $string ) {
-               if( NORMALIZE_ICU ) {
+               if ( NORMALIZE_ICU ) {
                        $string = self::replaceForNativeNormalize( $string );
 
                        # UnicodeString constructor fails if the string ends with a
                        # head byte. Add a junk char at the end, we'll strip it off.
                        return rtrim( utf8_normalize( $string . "\x01", self::UNORM_NFC ), "\x01" );
-               } elseif( NORMALIZE_INTL ) {
+               } elseif ( NORMALIZE_INTL ) {
                        $string = self::replaceForNativeNormalize( $string );
                        $norm = normalizer_normalize( $string, Normalizer::FORM_C );
-                       if( $norm === null || $norm === false ) {
+                       if ( $norm === null || $norm === false ) {
                                # normalizer_normalize will either return false or null
                                # (depending on which doc you read) if invalid utf8 string.
                                # quickIsNFCVerify cleans up invalid sequences.
 
-                               if( UtfNormal::quickIsNFCVerify( $string ) ) {
+                               if ( UtfNormal::quickIsNFCVerify( $string ) ) {
                                        # if that's true, the string is actually already normal.
                                        return $string;
                                } else {
@@ -101,7 +100,7 @@ class UtfNormal {
                        } else {
                                return $norm;
                        }
-               } elseif( UtfNormal::quickIsNFCVerify( $string ) ) {
+               } elseif ( UtfNormal::quickIsNFCVerify( $string ) ) {
                        # Side effect -- $string has had UTF-8 errors cleaned up.
                        return $string;
                } else {
@@ -118,11 +117,11 @@ class UtfNormal {
         * @return string a UTF-8 string in normal form C
         */
        static function toNFC( $string ) {
-               if( NORMALIZE_INTL )
+               if ( NORMALIZE_INTL )
                        return normalizer_normalize( $string, Normalizer::FORM_C );
-               elseif( NORMALIZE_ICU )
+               elseif ( NORMALIZE_ICU )
                        return utf8_normalize( $string, self::UNORM_NFC );
-               elseif( UtfNormal::quickIsNFC( $string ) )
+               elseif ( UtfNormal::quickIsNFC( $string ) )
                        return $string;
                else
                        return UtfNormal::NFC( $string );
@@ -136,11 +135,11 @@ class UtfNormal {
         * @return string a UTF-8 string in normal form D
         */
        static function toNFD( $string ) {
-               if( NORMALIZE_INTL )
+               if ( NORMALIZE_INTL )
                        return normalizer_normalize( $string, Normalizer::FORM_D );
-               elseif( NORMALIZE_ICU )
+               elseif ( NORMALIZE_ICU )
                        return utf8_normalize( $string, self::UNORM_NFD );
-               elseif( preg_match( '/[\x80-\xff]/', $string ) )
+               elseif ( preg_match( '/[\x80-\xff]/', $string ) )
                        return UtfNormal::NFD( $string );
                else
                        return $string;
@@ -155,11 +154,11 @@ class UtfNormal {
         * @return string a UTF-8 string in normal form KC
         */
        static function toNFKC( $string ) {
-               if( NORMALIZE_INTL )
+               if ( NORMALIZE_INTL )
                        return normalizer_normalize( $string, Normalizer::FORM_KC );
-               elseif( NORMALIZE_ICU )
+               elseif ( NORMALIZE_ICU )
                        return utf8_normalize( $string, self::UNORM_NFKC );
-               elseif( preg_match( '/[\x80-\xff]/', $string ) )
+               elseif ( preg_match( '/[\x80-\xff]/', $string ) )
                        return UtfNormal::NFKC( $string );
                else
                        return $string;
@@ -174,11 +173,11 @@ class UtfNormal {
         * @return string a UTF-8 string in normal form KD
         */
        static function toNFKD( $string ) {
-               if( NORMALIZE_INTL )
+               if ( NORMALIZE_INTL )
                        return normalizer_normalize( $string, Normalizer::FORM_KD );
-               elseif( NORMALIZE_ICU )
+               elseif ( NORMALIZE_ICU )
                        return utf8_normalize( $string, self::UNORM_NFKD );
-               elseif( preg_match( '/[\x80-\xff]/', $string ) )
+               elseif ( preg_match( '/[\x80-\xff]/', $string ) )
                        return UtfNormal::NFKD( $string );
                else
                        return $string;
@@ -189,7 +188,7 @@ class UtfNormal {
         * @private
         */
        static function loadData() {
-               if( !isset( self::$utfCombiningClass ) ) {
+               if ( !isset( self::$utfCombiningClass ) ) {
                        require_once __DIR__ . '/UtfNormalData.inc';
                }
        }
@@ -203,34 +202,35 @@ class UtfNormal {
        static function quickIsNFC( $string ) {
                # ASCII is always valid NFC!
                # If it's pure ASCII, let it through.
-               if( !preg_match( '/[\x80-\xff]/', $string ) ) return true;
+               if ( !preg_match( '/[\x80-\xff]/', $string ) ) return true;
 
                UtfNormal::loadData();
                $len = strlen( $string );
-               for( $i = 0; $i < $len; $i++ ) {
+               for ( $i = 0; $i < $len; $i++ ) {
                        $c = $string[$i];
                        $n = ord( $c );
-                       if( $n < 0x80 ) {
+                       if ( $n < 0x80 ) {
                                continue;
-                       } elseif( $n >= 0xf0 ) {
+                       } elseif ( $n >= 0xf0 ) {
                                $c = substr( $string, $i, 4 );
                                $i += 3;
-                       } elseif( $n >= 0xe0 ) {
+                       } elseif ( $n >= 0xe0 ) {
                                $c = substr( $string, $i, 3 );
                                $i += 2;
-                       } elseif( $n >= 0xc0 ) {
+                       } elseif ( $n >= 0xc0 ) {
                                $c = substr( $string, $i, 2 );
                                $i++;
                        }
-                       if( isset( self::$utfCheckNFC[$c] ) ) {
+                       if ( isset( self::$utfCheckNFC[$c] ) ) {
                                # If it's NO or MAYBE, bail and do the slow check.
                                return false;
                        }
-                       if( isset( self::$utfCombiningClass[$c] ) ) {
+                       if ( isset( self::$utfCombiningClass[$c] ) ) {
                                # Combining character? We might have to do sorting, at least.
                                return false;
                        }
                }
+
                return true;
        }
 
@@ -247,10 +247,10 @@ class UtfNormal {
                # ASCII is always valid NFC!
                # If we're only ever given plain ASCII, we can avoid the overhead
                # of initializing the decomposition tables by skipping out early.
-               if( !preg_match( '/[\x80-\xff]/', $string ) ) return true;
+               if ( !preg_match( '/[\x80-\xff]/', $string ) ) return true;
 
                static $checkit = null, $tailBytes = null, $utfCheckOrCombining = null;
-               if( !isset( $checkit ) ) {
+               if ( !isset( $checkit ) ) {
                        # Load/build some scary lookup tables...
                        UtfNormal::loadData();
 
@@ -258,30 +258,30 @@ class UtfNormal {
 
                        # Head bytes for sequences which we should do further validity checks
                        $checkit = array_flip( array_map( 'chr',
-                                       array( 0xc0, 0xc1, 0xe0, 0xed, 0xef,
-                                                  0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
-                                                  0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff ) ) );
+                               array( 0xc0, 0xc1, 0xe0, 0xed, 0xef,
+                                       0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
+                                       0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff ) ) );
 
                        # Each UTF-8 head byte is followed by a certain
                        # number of tail bytes.
                        $tailBytes = array();
-                       for( $n = 0; $n < 256; $n++ ) {
-                               if( $n < 0xc0 ) {
+                       for ( $n = 0; $n < 256; $n++ ) {
+                               if ( $n < 0xc0 ) {
                                        $remaining = 0;
-                               } elseif( $n < 0xe0 ) {
+                               } elseif ( $n < 0xe0 ) {
                                        $remaining = 1;
-                               } elseif( $n < 0xf0 ) {
+                               } elseif ( $n < 0xf0 ) {
                                        $remaining = 2;
-                               } elseif( $n < 0xf8 ) {
+                               } elseif ( $n < 0xf8 ) {
                                        $remaining = 3;
-                               } elseif( $n < 0xfc ) {
+                               } elseif ( $n < 0xfc ) {
                                        $remaining = 4;
-                               } elseif( $n < 0xfe ) {
+                               } elseif ( $n < 0xfe ) {
                                        $remaining = 5;
                                } else {
                                        $remaining = 0;
                                }
-                               $tailBytes[chr($n)] = $remaining;
+                               $tailBytes[chr( $n )] = $remaining;
                        }
                }
 
@@ -297,10 +297,10 @@ class UtfNormal {
                $looksNormal = true;
                $base = 0;
                $replace = array();
-               foreach( $matches[1] as $str ) {
+               foreach ( $matches[1] as $str ) {
                        $chunk = strlen( $str );
 
-                       if( $str[0] < "\x80" ) {
+                       if ( $str[0] < "\x80" ) {
                                # ASCII chunk: guaranteed to be valid UTF-8
                                # and in normal form C, so skip over it.
                                $base += $chunk;
@@ -317,30 +317,30 @@ class UtfNormal {
                        $head = '';
                        $len = $chunk + 1; # Counting down is faster. I'm *so* sorry.
 
-                       for( $i = -1; --$len; ) {
+                       for ( $i = -1; --$len; ) {
                                $remaining = $tailBytes[$c = $str[++$i]];
-                               if( $remaining ) {
+                               if ( $remaining ) {
                                        # UTF-8 head byte!
                                        $sequence = $head = $c;
                                        do {
                                                # Look for the defined number of tail bytes...
-                                               if( --$len && ( $c = $str[++$i] ) >= "\x80" && $c < "\xc0" ) {
+                                               if ( --$len && ( $c = $str[++$i] ) >= "\x80" && $c < "\xc0" ) {
                                                        # Legal tail bytes are nice.
                                                        $sequence .= $c;
                                                } else {
-                                                       if( 0 == $len ) {
+                                                       if ( 0 == $len ) {
                                                                # Premature end of string!
                                                                # Drop a replacement character into output to
                                                                # represent the invalid UTF-8 sequence.
                                                                $replace[] = array( UTF8_REPLACEMENT,
-                                                                                                       $base + $i + 1 - strlen( $sequence ),
-                                                                                                       strlen( $sequence ) );
+                                                                       $base + $i + 1 - strlen( $sequence ),
+                                                                       strlen( $sequence ) );
                                                                break 2;
                                                        } else {
                                                                # Illegal tail byte; abandon the sequence.
                                                                $replace[] = array( UTF8_REPLACEMENT,
-                                                                                                       $base + $i - strlen( $sequence ),
-                                                                                                       strlen( $sequence ) );
+                                                                       $base + $i - strlen( $sequence ),
+                                                                       strlen( $sequence ) );
                                                                # Back up and reprocess this byte; it may itself
                                                                # be a legal ASCII or UTF-8 sequence head.
                                                                --$i;
@@ -348,59 +348,60 @@ class UtfNormal {
                                                                continue 2;
                                                        }
                                                }
-                                       } while( --$remaining );
+                                       } while ( --$remaining );
 
-                                       if( isset( $checkit[$head] ) ) {
+                                       if ( isset( $checkit[$head] ) ) {
                                                # Do some more detailed validity checks, for
                                                # invalid characters and illegal sequences.
-                                               if( $head == "\xed" ) {
+                                               if ( $head == "\xed" ) {
                                                        # 0xed is relatively frequent in Korean, which
                                                        # abuts the surrogate area, so we're doing
                                                        # this check separately to speed things up.
 
-                                                       if( $sequence >= UTF8_SURROGATE_FIRST ) {
+                                                       if ( $sequence >= UTF8_SURROGATE_FIRST ) {
                                                                # Surrogates are legal only in UTF-16 code.
                                                                # They are totally forbidden here in UTF-8
                                                                # utopia.
                                                                $replace[] = array( UTF8_REPLACEMENT,
-                                                                            $base + $i + 1 - strlen( $sequence ),
-                                                                            strlen( $sequence ) );
+                                                                       $base + $i + 1 - strlen( $sequence ),
+                                                                       strlen( $sequence ) );
                                                                $head = '';
                                                                continue;
                                                        }
                                                } else {
                                                        # Slower, but rarer checks...
                                                        $n = ord( $head );
-                                                       if(
+                                                       if (
                                                                # "Overlong sequences" are those that are syntactically
                                                                # correct but use more UTF-8 bytes than are necessary to
                                                                # encode a character. Naïve string comparisons can be
                                                                # tricked into failing to see a match for an ASCII
                                                                # character, for instance, which can be a security hole
                                                                # if blacklist checks are being used.
-                                                              ($n  < 0xc2 && $sequence <= UTF8_OVERLONG_A)
-                                                               || ($n == 0xe0 && $sequence <= UTF8_OVERLONG_B)
-                                                               || ($n == 0xf0 && $sequence <= UTF8_OVERLONG_C)
+                                                               ( $n < 0xc2 && $sequence <= UTF8_OVERLONG_A )
+                                                               || ( $n == 0xe0 && $sequence <= UTF8_OVERLONG_B )
+                                                               || ( $n == 0xf0 && $sequence <= UTF8_OVERLONG_C )
 
                                                                # U+FFFE and U+FFFF are explicitly forbidden in Unicode.
-                                                               || ($n == 0xef &&
-                                                                          ($sequence == UTF8_FFFE)
-                                                                       || ($sequence == UTF8_FFFF) )
+                                                               || ( $n == 0xef &&
+                                                                       ( $sequence == UTF8_FFFE )
+                                                                       || ( $sequence == UTF8_FFFF ) )
 
                                                                # Unicode has been limited to 21 bits; longer
                                                                # sequences are not allowed.
-                                                               || ($n >= 0xf0 && $sequence > UTF8_MAX) ) {
+                                                               || ( $n >= 0xf0 && $sequence > UTF8_MAX )
+                                                       ) {
 
                                                                $replace[] = array( UTF8_REPLACEMENT,
-                                                                                   $base + $i + 1 - strlen( $sequence ),
-                                                                                   strlen( $sequence ) );
+                                                                       $base + $i + 1 - strlen( $sequence ),
+                                                                       strlen( $sequence ) );
                                                                $head = '';
                                                                continue;
                                                        }
                                                }
                                        }
 
-                                       if( isset( $utfCheckOrCombining[$sequence] ) ) {
+                                       if ( isset( $utfCheckOrCombining[$sequence] ) ) {
                                                # If it's NO or MAYBE, we'll have to rip
                                                # the string apart and put it back together.
                                                # That's going to be mighty slow.
@@ -409,12 +410,12 @@ class UtfNormal {
 
                                        # The sequence is legal!
                                        $head = '';
-                               } elseif( $c < "\x80" ) {
+                               } elseif ( $c < "\x80" ) {
                                        # ASCII byte.
                                        $head = '';
-                               } elseif( $c < "\xc0" ) {
+                               } elseif ( $c < "\xc0" ) {
                                        # Illegal tail bytes
-                                       if( $head == '' ) {
+                                       if ( $head == '' ) {
                                                # Out of the blue!
                                                $replace[] = array( UTF8_REPLACEMENT, $base + $i, 1 );
                                        } else {
@@ -431,23 +432,24 @@ class UtfNormal {
                        }
                        $base += $chunk;
                }
-               if( count( $replace ) ) {
+               if ( count( $replace ) ) {
                        # There were illegal UTF-8 sequences we need to fix up.
                        $out = '';
                        $last = 0;
-                       foreach( $replace as $rep ) {
+                       foreach ( $replace as $rep ) {
                                list( $replacement, $start, $length ) = $rep;
-                               if( $last < $start ) {
+                               if ( $last < $start ) {
                                        $out .= substr( $string, $last, $start - $last );
                                }
                                $out .= $replacement;
                                $last = $start + $length;
                        }
-                       if( $last < strlen( $string ) ) {
+                       if ( $last < strlen( $string ) ) {
                                $out .= substr( $string, $last );
                        }
                        $string = $out;
                }
+
                return $looksNormal;
        }
 
@@ -490,14 +492,14 @@ class UtfNormal {
         * @private
         */
        static function NFKD( $string ) {
-               if( !isset( self::$utfCompatibilityDecomp ) ) {
+               if ( !isset( self::$utfCompatibilityDecomp ) ) {
                        require_once 'UtfNormalDataK.inc';
                }
+
                return self::fastCombiningSort(
                        self::fastDecompose( $string, self::$utfCompatibilityDecomp ) );
        }
 
-
        /**
         * Perform decomposition of a UTF-8 string into either D or KD form
         * (depending on which decomposition map is passed to us).
@@ -511,45 +513,45 @@ class UtfNormal {
                UtfNormal::loadData();
                $len = strlen( $string );
                $out = '';
-               for( $i = 0; $i < $len; $i++ ) {
+               for ( $i = 0; $i < $len; $i++ ) {
                        $c = $string[$i];
                        $n = ord( $c );
-                       if( $n < 0x80 ) {
+                       if ( $n < 0x80 ) {
                                # ASCII chars never decompose
                                # THEY ARE IMMORTAL
                                $out .= $c;
                                continue;
-                       } elseif( $n >= 0xf0 ) {
+                       } elseif ( $n >= 0xf0 ) {
                                $c = substr( $string, $i, 4 );
                                $i += 3;
-                       } elseif( $n >= 0xe0 ) {
+                       } elseif ( $n >= 0xe0 ) {
                                $c = substr( $string, $i, 3 );
                                $i += 2;
-                       } elseif( $n >= 0xc0 ) {
+                       } elseif ( $n >= 0xc0 ) {
                                $c = substr( $string, $i, 2 );
                                $i++;
                        }
-                       if( isset( $map[$c] ) ) {
+                       if ( isset( $map[$c] ) ) {
                                $out .= $map[$c];
                                continue;
                        } else {
-                               if( $c >= UTF8_HANGUL_FIRST && $c <= UTF8_HANGUL_LAST ) {
+                               if ( $c >= UTF8_HANGUL_FIRST && $c <= UTF8_HANGUL_LAST ) {
                                        # Decompose a hangul syllable into jamo;
                                        # hardcoded for three-byte UTF-8 sequence.
                                        # A lookup table would be slightly faster,
                                        # but adds a lot of memory & disk needs.
                                        #
-                                       $index = ( (ord( $c[0] ) & 0x0f) << 12
-                                                | (ord( $c[1] ) & 0x3f) <<  6
-                                                | (ord( $c[2] ) & 0x3f) )
-                                              - UNICODE_HANGUL_FIRST;
+                                       $index = ( ( ord( $c[0] ) & 0x0f ) << 12
+                                                       | ( ord( $c[1] ) & 0x3f ) << 6
+                                                       | ( ord( $c[2] ) & 0x3f ) )
+                                               - UNICODE_HANGUL_FIRST;
                                        $l = intval( $index / UNICODE_HANGUL_NCOUNT );
-                                       $v = intval( ($index % UNICODE_HANGUL_NCOUNT) / UNICODE_HANGUL_TCOUNT);
+                                       $v = intval( ( $index % UNICODE_HANGUL_NCOUNT ) / UNICODE_HANGUL_TCOUNT );
                                        $t = $index % UNICODE_HANGUL_TCOUNT;
                                        $out .= "\xe1\x84" . chr( 0x80 + $l ) . "\xe1\x85" . chr( 0xa1 + $v );
-                                       if( $t >= 25 ) {
+                                       if ( $t >= 25 ) {
                                                $out .= "\xe1\x87" . chr( 0x80 + $t - 25 );
-                                       } elseif( $t ) {
+                                       } elseif ( $t ) {
                                                $out .= "\xe1\x86" . chr( 0xa7 + $t );
                                        }
                                        continue;
@@ -557,6 +559,7 @@ class UtfNormal {
                        }
                        $out .= $c;
                }
+
                return $out;
        }
 
@@ -573,23 +576,23 @@ class UtfNormal {
                $out = '';
                $combiners = array();
                $lastClass = -1;
-               for( $i = 0; $i < $len; $i++ ) {
+               for ( $i = 0; $i < $len; $i++ ) {
                        $c = $string[$i];
                        $n = ord( $c );
-                       if( $n >= 0x80 ) {
-                               if( $n >= 0xf0 ) {
+                       if ( $n >= 0x80 ) {
+                               if ( $n >= 0xf0 ) {
                                        $c = substr( $string, $i, 4 );
                                        $i += 3;
-                               } elseif( $n >= 0xe0 ) {
+                               } elseif ( $n >= 0xe0 ) {
                                        $c = substr( $string, $i, 3 );
                                        $i += 2;
-                               } elseif( $n >= 0xc0 ) {
+                               } elseif ( $n >= 0xc0 ) {
                                        $c = substr( $string, $i, 2 );
                                        $i++;
                                }
-                               if( isset( self::$utfCombiningClass[$c] ) ) {
+                               if ( isset( self::$utfCombiningClass[$c] ) ) {
                                        $lastClass = self::$utfCombiningClass[$c];
-                                       if( isset( $combiners[$lastClass] ) ) {
+                                       if ( isset( $combiners[$lastClass] ) ) {
                                                $combiners[$lastClass] .= $c;
                                        } else {
                                                $combiners[$lastClass] = $c;
@@ -597,7 +600,7 @@ class UtfNormal {
                                        continue;
                                }
                        }
-                       if( $lastClass ) {
+                       if ( $lastClass ) {
                                ksort( $combiners );
                                $out .= implode( '', $combiners );
                                $combiners = array();
@@ -605,10 +608,11 @@ class UtfNormal {
                        $out .= $c;
                        $lastClass = 0;
                }
-               if( $lastClass ) {
+               if ( $lastClass ) {
                        ksort( $combiners );
                        $out .= implode( '', $combiners );
                }
+
                return $out;
        }
 
@@ -616,8 +620,10 @@ class UtfNormal {
         * Produces canonically composed sequences, i.e. normal form C or KC.
         *
         * @private
-        * @param string $string a valid UTF-8 string in sorted normal form D or KD. Input is not validated.
-        * @return string a UTF-8 string with canonical precomposed characters used where possible
+        * @param string $string a valid UTF-8 string in sorted normal form D or KD.
+        *   Input is not validated.
+        * @return string a UTF-8 string with canonical precomposed characters used
+        *   where possible.
         */
        static function fastCompose( $string ) {
                UtfNormal::loadData();
@@ -627,12 +633,12 @@ class UtfNormal {
                $lastHangul = 0;
                $startChar = '';
                $combining = '';
-               $x1 = ord(substr(UTF8_HANGUL_VBASE, 0, 1));
-               $x2 = ord(substr(UTF8_HANGUL_TEND, 0, 1));
-               for( $i = 0; $i < $len; $i++ ) {
+               $x1 = ord( substr( UTF8_HANGUL_VBASE, 0, 1 ) );
+               $x2 = ord( substr( UTF8_HANGUL_TEND, 0, 1 ) );
+               for ( $i = 0; $i < $len; $i++ ) {
                        $c = $string[$i];
                        $n = ord( $c );
-                       if( $n < 0x80 ) {
+                       if ( $n < 0x80 ) {
                                # No combining characters here...
                                $out .= $startChar;
                                $out .= $combining;
@@ -640,25 +646,26 @@ class UtfNormal {
                                $combining = '';
                                $lastClass = 0;
                                continue;
-                       } elseif( $n >= 0xf0 ) {
+                       } elseif ( $n >= 0xf0 ) {
                                $c = substr( $string, $i, 4 );
                                $i += 3;
-                       } elseif( $n >= 0xe0 ) {
+                       } elseif ( $n >= 0xe0 ) {
                                $c = substr( $string, $i, 3 );
                                $i += 2;
-                       } elseif( $n >= 0xc0 ) {
+                       } elseif ( $n >= 0xc0 ) {
                                $c = substr( $string, $i, 2 );
                                $i++;
                        }
                        $pair = $startChar . $c;
-                       if( $n > 0x80 ) {
-                               if( isset( self::$utfCombiningClass[$c] ) ) {
+                       if ( $n > 0x80 ) {
+                               if ( isset( self::$utfCombiningClass[$c] ) ) {
                                        # A combining char; see what we can do with it
                                        $class = self::$utfCombiningClass[$c];
-                                       if( !empty( $startChar ) &&
+                                       if ( !empty( $startChar ) &&
                                                $lastClass < $class &&
                                                $class > 0 &&
-                                               isset( self::$utfCanonicalComp[$pair] ) ) {
+                                               isset( self::$utfCanonicalComp[$pair] )
+                                       ) {
                                                $startChar = self::$utfCanonicalComp[$pair];
                                                $class = 0;
                                        } else {
@@ -670,56 +677,58 @@ class UtfNormal {
                                }
                        }
                        # New start char
-                       if( $lastClass == 0 ) {
-                               if( isset( self::$utfCanonicalComp[$pair] ) ) {
+                       if ( $lastClass == 0 ) {
+                               if ( isset( self::$utfCanonicalComp[$pair] ) ) {
                                        $startChar = self::$utfCanonicalComp[$pair];
                                        $lastHangul = 0;
                                        continue;
                                }
-                               if( $n >= $x1 && $n <= $x2 ) {
+                               if ( $n >= $x1 && $n <= $x2 ) {
                                        # WARNING: Hangul code is painfully slow.
                                        # I apologize for this ugly, ugly code; however
                                        # performance is even more teh suck if we call
                                        # out to nice clean functions. Lookup tables are
                                        # marginally faster, but require a lot of space.
                                        #
-                                       if( $c >= UTF8_HANGUL_VBASE &&
+                                       if ( $c >= UTF8_HANGUL_VBASE &&
                                                $c <= UTF8_HANGUL_VEND &&
                                                $startChar >= UTF8_HANGUL_LBASE &&
-                                               $startChar <= UTF8_HANGUL_LEND ) {
+                                               $startChar <= UTF8_HANGUL_LEND
+                                       ) {
                                                #
                                                #$lIndex = utf8ToCodepoint( $startChar ) - UNICODE_HANGUL_LBASE;
                                                #$vIndex = utf8ToCodepoint( $c ) - UNICODE_HANGUL_VBASE;
                                                $lIndex = ord( $startChar[2] ) - 0x80;
-                                               $vIndex = ord( $c[2]         ) - 0xa1;
+                                               $vIndex = ord( $c[2] ) - 0xa1;
 
                                                $hangulPoint = UNICODE_HANGUL_FIRST +
                                                        UNICODE_HANGUL_TCOUNT *
-                                                       (UNICODE_HANGUL_VCOUNT * $lIndex + $vIndex);
+                                                       ( UNICODE_HANGUL_VCOUNT * $lIndex + $vIndex );
 
                                                # Hardcode the limited-range UTF-8 conversion:
                                                $startChar = chr( $hangulPoint >> 12 & 0x0f | 0xe0 ) .
-                                                                        chr( $hangulPoint >>  6 & 0x3f | 0x80 ) .
-                                                                        chr( $hangulPoint       & 0x3f | 0x80 );
+                                                       chr( $hangulPoint >> 6 & 0x3f | 0x80 ) .
+                                                       chr( $hangulPoint & 0x3f | 0x80 );
                                                $lastHangul = 0;
                                                continue;
-                                       } elseif( $c >= UTF8_HANGUL_TBASE &&
-                                                         $c <= UTF8_HANGUL_TEND &&
-                                                         $startChar >= UTF8_HANGUL_FIRST &&
-                                                         $startChar <= UTF8_HANGUL_LAST &&
-                                                         !$lastHangul ) {
+                                       } elseif ( $c >= UTF8_HANGUL_TBASE &&
+                                               $c <= UTF8_HANGUL_TEND &&
+                                               $startChar >= UTF8_HANGUL_FIRST &&
+                                               $startChar <= UTF8_HANGUL_LAST &&
+                                               !$lastHangul
+                                       ) {
                                                # $tIndex = utf8ToCodepoint( $c ) - UNICODE_HANGUL_TBASE;
                                                $tIndex = ord( $c[2] ) - 0xa7;
-                                               if( $tIndex < 0 ) $tIndex = ord( $c[2] ) - 0x80 + (0x11c0 - 0x11a7);
+                                               if ( $tIndex < 0 ) $tIndex = ord( $c[2] ) - 0x80 + ( 0x11c0 - 0x11a7 );
 
                                                # Increment the code point by $tIndex, without
                                                # the function overhead of decoding and recoding UTF-8
                                                #
                                                $tail = ord( $startChar[2] ) + $tIndex;
-                                               if( $tail > 0xbf ) {
+                                               if ( $tail > 0xbf ) {
                                                        $tail -= 0x40;
                                                        $mid = ord( $startChar[1] ) + 1;
-                                                       if( $mid > 0xbf ) {
+                                                       if ( $mid > 0xbf ) {
                                                                $startChar[0] = chr( ord( $startChar[0] ) + 1 );
                                                                $mid -= 0x40;
                                                        }
@@ -741,6 +750,7 @@ class UtfNormal {
                        $lastHangul = 0;
                }
                $out .= $startChar . $combining;
+
                return $out;
        }
 
@@ -753,11 +763,13 @@ class UtfNormal {
        static function placebo( $string ) {
                $len = strlen( $string );
                $out = '';
-               for( $i = 0; $i < $len; $i++ ) {
+               for ( $i = 0; $i < $len; $i++ ) {
                        $out .= $string[$i];
                }
+
                return $out;
        }
+
        /**
         * Function to replace some characters that we don't want
         * but most of the native normalize functions keep.
@@ -772,6 +784,7 @@ class UtfNormal {
                        $string );
                $string = str_replace( UTF8_FFFE, UTF8_REPLACEMENT, $string );
                $string = str_replace( UTF8_FFFF, UTF8_REPLACEMENT, $string );
+
                return $string;
        }
 }
index 59a64a3..bd4cf05 100644 (file)
  * @ingroup UtfNormal
  */
 
-if( PHP_SAPI != 'cli' ) {
+if ( PHP_SAPI != 'cli' ) {
        die( "Run me from the command line please.\n" );
 }
 
-if( isset( $_SERVER['argv'] ) && in_array( '--icu', $_SERVER['argv'] ) ) {
+if ( isset( $_SERVER['argv'] ) && in_array( '--icu', $_SERVER['argv'] ) ) {
        dl( 'php_utfnormal.so' );
 }
 
@@ -47,7 +47,7 @@ $testfiles = array(
 );
 $normalizer = new UtfNormal;
 UtfNormal::loadData();
-foreach( $testfiles as $file => $desc ) {
+foreach ( $testfiles as $file => $desc ) {
        benchmarkTest( $normalizer, $file, $desc );
 }
 
@@ -67,11 +67,12 @@ function benchmarkTest( &$u, $filename, $desc ) {
 #              'NFD', 'NFKD',
                array( 'fastDecompose', 'fastCombiningSort', 'fastCompose' ),
 #              'quickIsNFC', 'quickIsNFCVerify',
-               );
-       foreach( $forms as $form ) {
-               if( is_array( $form ) ) {
+       );
+
+       foreach ( $forms as $form ) {
+               if ( is_array( $form ) ) {
                        $str = $data;
-                       foreach( $form as $step ) {
+                       foreach ( $form as $step ) {
                                $str = benchmarkForm( $u, $str, $step );
                        }
                } else {
@@ -82,27 +83,29 @@ function benchmarkTest( &$u, $filename, $desc ) {
 
 function benchTime() {
        $st = explode( ' ', microtime() );
+
        return (float)$st[0] + (float)$st[1];
 }
 
 function benchmarkForm( &$u, &$data, $form ) {
        #$start = benchTime();
-       for( $i = 0; $i < BENCH_CYCLES; $i++ ) {
+       for ( $i = 0; $i < BENCH_CYCLES; $i++ ) {
                $start = benchTime();
                $out = $u->$form( $data, UtfNormal::$utfCanonicalDecomp );
-               $deltas[] = (benchTime() - $start);
+               $deltas[] = ( benchTime() - $start );
        }
        #$delta = (benchTime() - $start) / BENCH_CYCLES;
        sort( $deltas );
        $delta = $deltas[0]; # Take shortest time
 
        $rate = intval( strlen( $data ) / $delta );
-       $same = (0 == strcmp( $data, $out ) );
+       $same = ( 0 == strcmp( $data, $out ) );
 
        printf( " %20s %6.1fms %12s bytes/s (%s)\n",
                $form,
-               $delta*1000.0,
+               $delta * 1000.0,
                number_format( $rate ),
-               ($same ? 'no change' : 'changed' ) );
+               ( $same ? 'no change' : 'changed' ) );
+
        return $out;
 }
index 68cc1ef..5755f6b 100644 (file)
@@ -5,7 +5,8 @@
  *
  * @file
  */
+// @codingStandardsIgnoreFile
+
 UtfNormal::$utfCombiningClass = unserialize( 'a:606:{s:2:"̀";i:230;s:2:"́";i:230;s:2:"̂";i:230;s:2:"̃";i:230;s:2:"̄";i:230;s:2:"̅";i:230;s:2:"̆";i:230;s:2:"̇";i:230;s:2:"̈";i:230;s:2:"̉";i:230;s:2:"̊";i:230;s:2:"̋";i:230;s:2:"̌";i:230;s:2:"̍";i:230;s:2:"̎";i:230;s:2:"̏";i:230;s:2:"̐";i:230;s:2:"̑";i:230;s:2:"̒";i:230;s:2:"̓";i:230;s:2:"̔";i:230;s:2:"̕";i:232;s:2:"̖";i:220;s:2:"̗";i:220;s:2:"̘";i:220;s:2:"̙";i:220;s:2:"̚";i:232;s:2:"̛";i:216;s:2:"̜";i:220;s:2:"̝";i:220;s:2:"̞";i:220;s:2:"̟";i:220;s:2:"̠";i:220;s:2:"̡";i:202;s:2:"̢";i:202;s:2:"̣";i:220;s:2:"̤";i:220;s:2:"̥";i:220;s:2:"̦";i:220;s:2:"̧";i:202;s:2:"̨";i:202;s:2:"̩";i:220;s:2:"̪";i:220;s:2:"̫";i:220;s:2:"̬";i:220;s:2:"̭";i:220;s:2:"̮";i:220;s:2:"̯";i:220;s:2:"̰";i:220;s:2:"̱";i:220;s:2:"̲";i:220;s:2:"̳";i:220;s:2:"̴";i:1;s:2:"̵";i:1;s:2:"̶";i:1;s:2:"̷";i:1;s:2:"̸";i:1;s:2:"̹";i:220;s:2:"̺";i:220;s:2:"̻";i:220;s:2:"̼";i:220;s:2:"̽";i:230;s:2:"̾";i:230;s:2:"̿";i:230;s:2:"̀";i:230;s:2:"́";i:230;s:2:"͂";i:230;s:2:"̓";i:230;s:2:"̈́";i:230;s:2:"ͅ";i:240;s:2:"͆";i:230;s:2:"͇";i:220;s:2:"͈";i:220;s:2:"͉";i:220;s:2:"͊";i:230;s:2:"͋";i:230;s:2:"͌";i:230;s:2:"͍";i:220;s:2:"͎";i:220;s:2:"͐";i:230;s:2:"͑";i:230;s:2:"͒";i:230;s:2:"͓";i:220;s:2:"͔";i:220;s:2:"͕";i:220;s:2:"͖";i:220;s:2:"͗";i:230;s:2:"͘";i:232;s:2:"͙";i:220;s:2:"͚";i:220;s:2:"͛";i:230;s:2:"͜";i:233;s:2:"͝";i:234;s:2:"͞";i:234;s:2:"͟";i:233;s:2:"͠";i:234;s:2:"͡";i:234;s:2:"͢";i:233;s:2:"ͣ";i:230;s:2:"ͤ";i:230;s:2:"ͥ";i:230;s:2:"ͦ";i:230;s:2:"ͧ";i:230;s:2:"ͨ";i:230;s:2:"ͩ";i:230;s:2:"ͪ";i:230;s:2:"ͫ";i:230;s:2:"ͬ";i:230;s:2:"ͭ";i:230;s:2:"ͮ";i:230;s:2:"ͯ";i:230;s:2:"҃";i:230;s:2:"҄";i:230;s:2:"҅";i:230;s:2:"҆";i:230;s:2:"҇";i:230;s:2:"֑";i:220;s:2:"֒";i:230;s:2:"֓";i:230;s:2:"֔";i:230;s:2:"֕";i:230;s:2:"֖";i:220;s:2:"֗";i:230;s:2:"֘";i:230;s:2:"֙";i:230;s:2:"֚";i:222;s:2:"֛";i:220;s:2:"֜";i:230;s:2:"֝";i:230;s:2:"֞";i:230;s:2:"֟";i:230;s:2:"֠";i:230;s:2:"֡";i:230;s:2:"֢";i:220;s:2:"֣";i:220;s:2:"֤";i:220;s:2:"֥";i:220;s:2:"֦";i:220;s:2:"֧";i:220;s:2:"֨";i:230;s:2:"֩";i:230;s:2:"֪";i:220;s:2:"֫";i:230;s:2:"֬";i:230;s:2:"֭";i:222;s:2:"֮";i:228;s:2:"֯";i:230;s:2:"ְ";i:10;s:2:"ֱ";i:11;s:2:"ֲ";i:12;s:2:"ֳ";i:13;s:2:"ִ";i:14;s:2:"ֵ";i:15;s:2:"ֶ";i:16;s:2:"ַ";i:17;s:2:"ָ";i:18;s:2:"ֹ";i:19;s:2:"ֺ";i:19;s:2:"ֻ";i:20;s:2:"ּ";i:21;s:2:"ֽ";i:22;s:2:"ֿ";i:23;s:2:"ׁ";i:24;s:2:"ׂ";i:25;s:2:"ׄ";i:230;s:2:"ׅ";i:220;s:2:"ׇ";i:18;s:2:"ؐ";i:230;s:2:"ؑ";i:230;s:2:"ؒ";i:230;s:2:"ؓ";i:230;s:2:"ؔ";i:230;s:2:"ؕ";i:230;s:2:"ؖ";i:230;s:2:"ؗ";i:230;s:2:"ؘ";i:30;s:2:"ؙ";i:31;s:2:"ؚ";i:32;s:2:"ً";i:27;s:2:"ٌ";i:28;s:2:"ٍ";i:29;s:2:"َ";i:30;s:2:"ُ";i:31;s:2:"ِ";i:32;s:2:"ّ";i:33;s:2:"ْ";i:34;s:2:"ٓ";i:230;s:2:"ٔ";i:230;s:2:"ٕ";i:220;s:2:"ٖ";i:220;s:2:"ٗ";i:230;s:2:"٘";i:230;s:2:"ٙ";i:230;s:2:"ٚ";i:230;s:2:"ٛ";i:230;s:2:"ٜ";i:220;s:2:"ٝ";i:230;s:2:"ٞ";i:230;s:2:"ٟ";i:220;s:2:"ٰ";i:35;s:2:"ۖ";i:230;s:2:"ۗ";i:230;s:2:"ۘ";i:230;s:2:"ۙ";i:230;s:2:"ۚ";i:230;s:2:"ۛ";i:230;s:2:"ۜ";i:230;s:2:"۟";i:230;s:2:"۠";i:230;s:2:"ۡ";i:230;s:2:"ۢ";i:230;s:2:"ۣ";i:220;s:2:"ۤ";i:230;s:2:"ۧ";i:230;s:2:"ۨ";i:230;s:2:"۪";i:220;s:2:"۫";i:230;s:2:"۬";i:230;s:2:"ۭ";i:220;s:2:"ܑ";i:36;s:2:"ܰ";i:230;s:2:"ܱ";i:220;s:2:"ܲ";i:230;s:2:"ܳ";i:230;s:2:"ܴ";i:220;s:2:"ܵ";i:230;s:2:"ܶ";i:230;s:2:"ܷ";i:220;s:2:"ܸ";i:220;s:2:"ܹ";i:220;s:2:"ܺ";i:230;s:2:"ܻ";i:220;s:2:"ܼ";i:220;s:2:"ܽ";i:230;s:2:"ܾ";i:220;s:2:"ܿ";i:230;s:2:"݀";i:230;s:2:"݁";i:230;s:2:"݂";i:220;s:2:"݃";i:230;s:2:"݄";i:220;s:2:"݅";i:230;s:2:"݆";i:220;s:2:"݇";i:230;s:2:"݈";i:220;s:2:"݉";i:230;s:2:"݊";i:230;s:2:"߫";i:230;s:2:"߬";i:230;s:2:"߭";i:230;s:2:"߮";i:230;s:2:"߯";i:230;s:2:"߰";i:230;s:2:"߱";i:230;s:2:"߲";i:220;s:2:"߳";i:230;s:3:"ࠖ";i:230;s:3:"ࠗ";i:230;s:3:"࠘";i:230;s:3:"࠙";i:230;s:3:"ࠛ";i:230;s:3:"ࠜ";i:230;s:3:"ࠝ";i:230;s:3:"ࠞ";i:230;s:3:"ࠟ";i:230;s:3:"ࠠ";i:230;s:3:"ࠡ";i:230;s:3:"ࠢ";i:230;s:3:"ࠣ";i:230;s:3:"ࠥ";i:230;s:3:"ࠦ";i:230;s:3:"ࠧ";i:230;s:3:"ࠩ";i:230;s:3:"ࠪ";i:230;s:3:"ࠫ";i:230;s:3:"ࠬ";i:230;s:3:"࠭";i:230;s:3:"࡙";i:220;s:3:"࡚";i:220;s:3:"࡛";i:220;s:3:"़";i:7;s:3:"्";i:9;s:3:"॑";i:230;s:3:"॒";i:220;s:3:"॓";i:230;s:3:"॔";i:230;s:3:"়";i:7;s:3:"্";i:9;s:3:"਼";i:7;s:3:"੍";i:9;s:3:"઼";i:7;s:3:"્";i:9;s:3:"଼";i:7;s:3:"୍";i:9;s:3:"்";i:9;s:3:"్";i:9;s:3:"ౕ";i:84;s:3:"ౖ";i:91;s:3:"಼";i:7;s:3:"್";i:9;s:3:"്";i:9;s:3:"්";i:9;s:3:"ุ";i:103;s:3:"ู";i:103;s:3:"ฺ";i:9;s:3:"่";i:107;s:3:"้";i:107;s:3:"๊";i:107;s:3:"๋";i:107;s:3:"ຸ";i:118;s:3:"ູ";i:118;s:3:"່";i:122;s:3:"້";i:122;s:3:"໊";i:122;s:3:"໋";i:122;s:3:"༘";i:220;s:3:"༙";i:220;s:3:"༵";i:220;s:3:"༷";i:220;s:3:"༹";i:216;s:3:"ཱ";i:129;s:3:"ི";i:130;s:3:"ུ";i:132;s:3:"ེ";i:130;s:3:"ཻ";i:130;s:3:"ོ";i:130;s:3:"ཽ";i:130;s:3:"ྀ";i:130;s:3:"ྂ";i:230;s:3:"ྃ";i:230;s:3:"྄";i:9;s:3:"྆";i:230;s:3:"྇";i:230;s:3:"࿆";i:220;s:3:"့";i:7;s:3:"္";i:9;s:3:"်";i:9;s:3:"ႍ";i:220;s:3:"፝";i:230;s:3:"፞";i:230;s:3:"፟";i:230;s:3:"᜔";i:9;s:3:"᜴";i:9;s:3:"្";i:9;s:3:"៝";i:230;s:3:"ᢩ";i:228;s:3:"᤹";i:222;s:3:"᤺";i:230;s:3:"᤻";i:220;s:3:"ᨗ";i:230;s:3:"ᨘ";i:220;s:3:"᩠";i:9;s:3:"᩵";i:230;s:3:"᩶";i:230;s:3:"᩷";i:230;s:3:"᩸";i:230;s:3:"᩹";i:230;s:3:"᩺";i:230;s:3:"᩻";i:230;s:3:"᩼";i:230;s:3:"᩿";i:220;s:3:"᬴";i:7;s:3:"᭄";i:9;s:3:"᭫";i:230;s:3:"᭬";i:220;s:3:"᭭";i:230;s:3:"᭮";i:230;s:3:"᭯";i:230;s:3:"᭰";i:230;s:3:"᭱";i:230;s:3:"᭲";i:230;s:3:"᭳";i:230;s:3:"᮪";i:9;s:3:"᯦";i:7;s:3:"᯲";i:9;s:3:"᯳";i:9;s:3:"᰷";i:7;s:3:"᳐";i:230;s:3:"᳑";i:230;s:3:"᳒";i:230;s:3:"᳔";i:1;s:3:"᳕";i:220;s:3:"᳖";i:220;s:3:"᳗";i:220;s:3:"᳘";i:220;s:3:"᳙";i:220;s:3:"᳚";i:230;s:3:"᳛";i:230;s:3:"᳜";i:220;s:3:"᳝";i:220;s:3:"᳞";i:220;s:3:"᳟";i:220;s:3:"᳠";i:230;s:3:"᳢";i:1;s:3:"᳣";i:1;s:3:"᳤";i:1;s:3:"᳥";i:1;s:3:"᳦";i:1;s:3:"᳧";i:1;s:3:"᳨";i:1;s:3:"᳭";i:220;s:3:"᷀";i:230;s:3:"᷁";i:230;s:3:"᷂";i:220;s:3:"᷃";i:230;s:3:"᷄";i:230;s:3:"᷅";i:230;s:3:"᷆";i:230;s:3:"᷇";i:230;s:3:"᷈";i:230;s:3:"᷉";i:230;s:3:"᷊";i:220;s:3:"᷋";i:230;s:3:"᷌";i:230;s:3:"᷍";i:234;s:3:"᷎";i:214;s:3:"᷏";i:220;s:3:"᷐";i:202;s:3:"᷑";i:230;s:3:"᷒";i:230;s:3:"ᷓ";i:230;s:3:"ᷔ";i:230;s:3:"ᷕ";i:230;s:3:"ᷖ";i:230;s:3:"ᷗ";i:230;s:3:"ᷘ";i:230;s:3:"ᷙ";i:230;s:3:"ᷚ";i:230;s:3:"ᷛ";i:230;s:3:"ᷜ";i:230;s:3:"ᷝ";i:230;s:3:"ᷞ";i:230;s:3:"ᷟ";i:230;s:3:"ᷠ";i:230;s:3:"ᷡ";i:230;s:3:"ᷢ";i:230;s:3:"ᷣ";i:230;s:3:"ᷤ";i:230;s:3:"ᷥ";i:230;s:3:"ᷦ";i:230;s:3:"᷼";i:233;s:3:"᷽";i:220;s:3:"᷾";i:230;s:3:"᷿";i:220;s:3:"⃐";i:230;s:3:"⃑";i:230;s:3:"⃒";i:1;s:3:"⃓";i:1;s:3:"⃔";i:230;s:3:"⃕";i:230;s:3:"⃖";i:230;s:3:"⃗";i:230;s:3:"⃘";i:1;s:3:"⃙";i:1;s:3:"⃚";i:1;s:3:"⃛";i:230;s:3:"⃜";i:230;s:3:"⃡";i:230;s:3:"⃥";i:1;s:3:"⃦";i:1;s:3:"⃧";i:230;s:3:"⃨";i:220;s:3:"⃩";i:230;s:3:"⃪";i:1;s:3:"⃫";i:1;s:3:"⃬";i:220;s:3:"⃭";i:220;s:3:"⃮";i:220;s:3:"⃯";i:220;s:3:"⃰";i:230;s:3:"⳯";i:230;s:3:"⳰";i:230;s:3:"⳱";i:230;s:3:"⵿";i:9;s:3:"ⷠ";i:230;s:3:"ⷡ";i:230;s:3:"ⷢ";i:230;s:3:"ⷣ";i:230;s:3:"ⷤ";i:230;s:3:"ⷥ";i:230;s:3:"ⷦ";i:230;s:3:"ⷧ";i:230;s:3:"ⷨ";i:230;s:3:"ⷩ";i:230;s:3:"ⷪ";i:230;s:3:"ⷫ";i:230;s:3:"ⷬ";i:230;s:3:"ⷭ";i:230;s:3:"ⷮ";i:230;s:3:"ⷯ";i:230;s:3:"ⷰ";i:230;s:3:"ⷱ";i:230;s:3:"ⷲ";i:230;s:3:"ⷳ";i:230;s:3:"ⷴ";i:230;s:3:"ⷵ";i:230;s:3:"ⷶ";i:230;s:3:"ⷷ";i:230;s:3:"ⷸ";i:230;s:3:"ⷹ";i:230;s:3:"ⷺ";i:230;s:3:"ⷻ";i:230;s:3:"ⷼ";i:230;s:3:"ⷽ";i:230;s:3:"ⷾ";i:230;s:3:"ⷿ";i:230;s:3:"〪";i:218;s:3:"〫";i:228;s:3:"〬";i:232;s:3:"〭";i:222;s:3:"〮";i:224;s:3:"〯";i:224;s:3:"゙";i:8;s:3:"゚";i:8;s:3:"꙯";i:230;s:3:"꙼";i:230;s:3:"꙽";i:230;s:3:"꛰";i:230;s:3:"꛱";i:230;s:3:"꠆";i:9;s:3:"꣄";i:9;s:3:"꣠";i:230;s:3:"꣡";i:230;s:3:"꣢";i:230;s:3:"꣣";i:230;s:3:"꣤";i:230;s:3:"꣥";i:230;s:3:"꣦";i:230;s:3:"꣧";i:230;s:3:"꣨";i:230;s:3:"꣩";i:230;s:3:"꣪";i:230;s:3:"꣫";i:230;s:3:"꣬";i:230;s:3:"꣭";i:230;s:3:"꣮";i:230;s:3:"꣯";i:230;s:3:"꣰";i:230;s:3:"꣱";i:230;s:3:"꤫";i:220;s:3:"꤬";i:220;s:3:"꤭";i:220;s:3:"꥓";i:9;s:3:"꦳";i:7;s:3:"꧀";i:9;s:3:"ꪰ";i:230;s:3:"ꪲ";i:230;s:3:"ꪳ";i:230;s:3:"ꪴ";i:220;s:3:"ꪷ";i:230;s:3:"ꪸ";i:230;s:3:"ꪾ";i:230;s:3:"꪿";i:230;s:3:"꫁";i:230;s:3:"꯭";i:9;s:3:"ﬞ";i:26;s:3:"︠";i:230;s:3:"︡";i:230;s:3:"︢";i:230;s:3:"︣";i:230;s:3:"︤";i:230;s:3:"︥";i:230;s:3:"︦";i:230;s:4:"𐇽";i:220;s:4:"𐨍";i:220;s:4:"𐨏";i:230;s:4:"𐨸";i:230;s:4:"𐨹";i:1;s:4:"𐨺";i:220;s:4:"𐨿";i:9;s:4:"𑁆";i:9;s:4:"𑂹";i:9;s:4:"𑂺";i:7;s:4:"𝅥";i:216;s:4:"𝅦";i:216;s:4:"𝅧";i:1;s:4:"𝅨";i:1;s:4:"𝅩";i:1;s:4:"𝅭";i:226;s:4:"𝅮";i:216;s:4:"𝅯";i:216;s:4:"𝅰";i:216;s:4:"𝅱";i:216;s:4:"𝅲";i:216;s:4:"𝅻";i:220;s:4:"𝅼";i:220;s:4:"𝅽";i:220;s:4:"𝅾";i:220;s:4:"𝅿";i:220;s:4:"𝆀";i:220;s:4:"𝆁";i:220;s:4:"𝆂";i:220;s:4:"𝆅";i:230;s:4:"𝆆";i:230;s:4:"𝆇";i:230;s:4:"𝆈";i:230;s:4:"𝆉";i:230;s:4:"𝆊";i:220;s:4:"𝆋";i:220;s:4:"𝆪";i:230;s:4:"𝆫";i:230;s:4:"𝆬";i:230;s:4:"𝆭";i:230;s:4:"𝉂";i:230;s:4:"𝉃";i:230;s:4:"𝉄";i:230;}' );
 UtfNormal::$utfCanonicalComp = unserialize( 'a:1868:{s:3:"À";s:2:"À";s:3:"Á";s:2:"Á";s:3:"Â";s:2:"Â";s:3:"Ã";s:2:"Ã";s:3:"Ä";s:2:"Ä";s:3:"Å";s:2:"Å";s:3:"Ç";s:2:"Ç";s:3:"È";s:2:"È";s:3:"É";s:2:"É";s:3:"Ê";s:2:"Ê";s:3:"Ë";s:2:"Ë";s:3:"Ì";s:2:"Ì";s:3:"Í";s:2:"Í";s:3:"Î";s:2:"Î";s:3:"Ï";s:2:"Ï";s:3:"Ñ";s:2:"Ñ";s:3:"Ò";s:2:"Ò";s:3:"Ó";s:2:"Ó";s:3:"Ô";s:2:"Ô";s:3:"Õ";s:2:"Õ";s:3:"Ö";s:2:"Ö";s:3:"Ù";s:2:"Ù";s:3:"Ú";s:2:"Ú";s:3:"Û";s:2:"Û";s:3:"Ü";s:2:"Ü";s:3:"Ý";s:2:"Ý";s:3:"à";s:2:"à";s:3:"á";s:2:"á";s:3:"â";s:2:"â";s:3:"ã";s:2:"ã";s:3:"ä";s:2:"ä";s:3:"å";s:2:"å";s:3:"ç";s:2:"ç";s:3:"è";s:2:"è";s:3:"é";s:2:"é";s:3:"ê";s:2:"ê";s:3:"ë";s:2:"ë";s:3:"ì";s:2:"ì";s:3:"í";s:2:"í";s:3:"î";s:2:"î";s:3:"ï";s:2:"ï";s:3:"ñ";s:2:"ñ";s:3:"ò";s:2:"ò";s:3:"ó";s:2:"ó";s:3:"ô";s:2:"ô";s:3:"õ";s:2:"õ";s:3:"ö";s:2:"ö";s:3:"ù";s:2:"ù";s:3:"ú";s:2:"ú";s:3:"û";s:2:"û";s:3:"ü";s:2:"ü";s:3:"ý";s:2:"ý";s:3:"ÿ";s:2:"ÿ";s:3:"Ā";s:2:"Ā";s:3:"ā";s:2:"ā";s:3:"Ă";s:2:"Ă";s:3:"ă";s:2:"ă";s:3:"Ą";s:2:"Ą";s:3:"ą";s:2:"ą";s:3:"Ć";s:2:"Ć";s:3:"ć";s:2:"ć";s:3:"Ĉ";s:2:"Ĉ";s:3:"ĉ";s:2:"ĉ";s:3:"Ċ";s:2:"Ċ";s:3:"ċ";s:2:"ċ";s:3:"Č";s:2:"Č";s:3:"č";s:2:"č";s:3:"Ď";s:2:"Ď";s:3:"ď";s:2:"ď";s:3:"Ē";s:2:"Ē";s:3:"ē";s:2:"ē";s:3:"Ĕ";s:2:"Ĕ";s:3:"ĕ";s:2:"ĕ";s:3:"Ė";s:2:"Ė";s:3:"ė";s:2:"ė";s:3:"Ę";s:2:"Ę";s:3:"ę";s:2:"ę";s:3:"Ě";s:2:"Ě";s:3:"ě";s:2:"ě";s:3:"Ĝ";s:2:"Ĝ";s:3:"ĝ";s:2:"ĝ";s:3:"Ğ";s:2:"Ğ";s:3:"ğ";s:2:"ğ";s:3:"Ġ";s:2:"Ġ";s:3:"ġ";s:2:"ġ";s:3:"Ģ";s:2:"Ģ";s:3:"ģ";s:2:"ģ";s:3:"Ĥ";s:2:"Ĥ";s:3:"ĥ";s:2:"ĥ";s:3:"Ĩ";s:2:"Ĩ";s:3:"ĩ";s:2:"ĩ";s:3:"Ī";s:2:"Ī";s:3:"ī";s:2:"ī";s:3:"Ĭ";s:2:"Ĭ";s:3:"ĭ";s:2:"ĭ";s:3:"Į";s:2:"Į";s:3:"į";s:2:"į";s:3:"İ";s:2:"İ";s:3:"Ĵ";s:2:"Ĵ";s:3:"ĵ";s:2:"ĵ";s:3:"Ķ";s:2:"Ķ";s:3:"ķ";s:2:"ķ";s:3:"Ĺ";s:2:"Ĺ";s:3:"ĺ";s:2:"ĺ";s:3:"Ļ";s:2:"Ļ";s:3:"ļ";s:2:"ļ";s:3:"Ľ";s:2:"Ľ";s:3:"ľ";s:2:"ľ";s:3:"Ń";s:2:"Ń";s:3:"ń";s:2:"ń";s:3:"Ņ";s:2:"Ņ";s:3:"ņ";s:2:"ņ";s:3:"Ň";s:2:"Ň";s:3:"ň";s:2:"ň";s:3:"Ō";s:2:"Ō";s:3:"ō";s:2:"ō";s:3:"Ŏ";s:2:"Ŏ";s:3:"ŏ";s:2:"ŏ";s:3:"Ő";s:2:"Ő";s:3:"ő";s:2:"ő";s:3:"Ŕ";s:2:"Ŕ";s:3:"ŕ";s:2:"ŕ";s:3:"Ŗ";s:2:"Ŗ";s:3:"ŗ";s:2:"ŗ";s:3:"Ř";s:2:"Ř";s:3:"ř";s:2:"ř";s:3:"Ś";s:2:"Ś";s:3:"ś";s:2:"ś";s:3:"Ŝ";s:2:"Ŝ";s:3:"ŝ";s:2:"ŝ";s:3:"Ş";s:2:"Ş";s:3:"ş";s:2:"ş";s:3:"Š";s:2:"Š";s:3:"š";s:2:"š";s:3:"Ţ";s:2:"Ţ";s:3:"ţ";s:2:"ţ";s:3:"Ť";s:2:"Ť";s:3:"ť";s:2:"ť";s:3:"Ũ";s:2:"Ũ";s:3:"ũ";s:2:"ũ";s:3:"Ū";s:2:"Ū";s:3:"ū";s:2:"ū";s:3:"Ŭ";s:2:"Ŭ";s:3:"ŭ";s:2:"ŭ";s:3:"Ů";s:2:"Ů";s:3:"ů";s:2:"ů";s:3:"Ű";s:2:"Ű";s:3:"ű";s:2:"ű";s:3:"Ų";s:2:"Ų";s:3:"ų";s:2:"ų";s:3:"Ŵ";s:2:"Ŵ";s:3:"ŵ";s:2:"ŵ";s:3:"Ŷ";s:2:"Ŷ";s:3:"ŷ";s:2:"ŷ";s:3:"Ÿ";s:2:"Ÿ";s:3:"Ź";s:2:"Ź";s:3:"ź";s:2:"ź";s:3:"Ż";s:2:"Ż";s:3:"ż";s:2:"ż";s:3:"Ž";s:2:"Ž";s:3:"ž";s:2:"ž";s:3:"Ơ";s:2:"Ơ";s:3:"ơ";s:2:"ơ";s:3:"Ư";s:2:"Ư";s:3:"ư";s:2:"ư";s:3:"Ǎ";s:2:"Ǎ";s:3:"ǎ";s:2:"ǎ";s:3:"Ǐ";s:2:"Ǐ";s:3:"ǐ";s:2:"ǐ";s:3:"Ǒ";s:2:"Ǒ";s:3:"ǒ";s:2:"ǒ";s:3:"Ǔ";s:2:"Ǔ";s:3:"ǔ";s:2:"ǔ";s:4:"Ǖ";s:2:"Ǖ";s:4:"ǖ";s:2:"ǖ";s:4:"Ǘ";s:2:"Ǘ";s:4:"ǘ";s:2:"ǘ";s:4:"Ǚ";s:2:"Ǚ";s:4:"ǚ";s:2:"ǚ";s:4:"Ǜ";s:2:"Ǜ";s:4:"ǜ";s:2:"ǜ";s:4:"Ǟ";s:2:"Ǟ";s:4:"ǟ";s:2:"ǟ";s:4:"Ǡ";s:2:"Ǡ";s:4:"ǡ";s:2:"ǡ";s:4:"Ǣ";s:2:"Ǣ";s:4:"ǣ";s:2:"ǣ";s:3:"Ǧ";s:2:"Ǧ";s:3:"ǧ";s:2:"ǧ";s:3:"Ǩ";s:2:"Ǩ";s:3:"ǩ";s:2:"ǩ";s:3:"Ǫ";s:2:"Ǫ";s:3:"ǫ";s:2:"ǫ";s:4:"Ǭ";s:2:"Ǭ";s:4:"ǭ";s:2:"ǭ";s:4:"Ǯ";s:2:"Ǯ";s:4:"ǯ";s:2:"ǯ";s:3:"ǰ";s:2:"ǰ";s:3:"Ǵ";s:2:"Ǵ";s:3:"ǵ";s:2:"ǵ";s:3:"Ǹ";s:2:"Ǹ";s:3:"ǹ";s:2:"ǹ";s:4:"Ǻ";s:2:"Ǻ";s:4:"ǻ";s:2:"ǻ";s:4:"Ǽ";s:2:"Ǽ";s:4:"ǽ";s:2:"ǽ";s:4:"Ǿ";s:2:"Ǿ";s:4:"ǿ";s:2:"ǿ";s:3:"Ȁ";s:2:"Ȁ";s:3:"ȁ";s:2:"ȁ";s:3:"Ȃ";s:2:"Ȃ";s:3:"ȃ";s:2:"ȃ";s:3:"Ȅ";s:2:"Ȅ";s:3:"ȅ";s:2:"ȅ";s:3:"Ȇ";s:2:"Ȇ";s:3:"ȇ";s:2:"ȇ";s:3:"Ȉ";s:2:"Ȉ";s:3:"ȉ";s:2:"ȉ";s:3:"Ȋ";s:2:"Ȋ";s:3:"ȋ";s:2:"ȋ";s:3:"Ȍ";s:2:"Ȍ";s:3:"ȍ";s:2:"ȍ";s:3:"Ȏ";s:2:"Ȏ";s:3:"ȏ";s:2:"ȏ";s:3:"Ȑ";s:2:"Ȑ";s:3:"ȑ";s:2:"ȑ";s:3:"Ȓ";s:2:"Ȓ";s:3:"ȓ";s:2:"ȓ";s:3:"Ȕ";s:2:"Ȕ";s:3:"ȕ";s:2:"ȕ";s:3:"Ȗ";s:2:"Ȗ";s:3:"ȗ";s:2:"ȗ";s:3:"Ș";s:2:"Ș";s:3:"ș";s:2:"ș";s:3:"Ț";s:2:"Ț";s:3:"ț";s:2:"ț";s:3:"Ȟ";s:2:"Ȟ";s:3:"ȟ";s:2:"ȟ";s:3:"Ȧ";s:2:"Ȧ";s:3:"ȧ";s:2:"ȧ";s:3:"Ȩ";s:2:"Ȩ";s:3:"ȩ";s:2:"ȩ";s:4:"Ȫ";s:2:"Ȫ";s:4:"ȫ";s:2:"ȫ";s:4:"Ȭ";s:2:"Ȭ";s:4:"ȭ";s:2:"ȭ";s:3:"Ȯ";s:2:"Ȯ";s:3:"ȯ";s:2:"ȯ";s:4:"Ȱ";s:2:"Ȱ";s:4:"ȱ";s:2:"ȱ";s:3:"Ȳ";s:2:"Ȳ";s:3:"ȳ";s:2:"ȳ";s:2:"̀";s:2:"̀";s:2:"́";s:2:"́";s:2:"̓";s:2:"̓";s:4:"̈́";s:2:"̈́";s:2:"ʹ";s:2:"ʹ";s:1:";";s:2:";";s:4:"΅";s:2:"΅";s:4:"Ά";s:2:"Ά";s:2:"·";s:2:"·";s:4:"Έ";s:2:"Έ";s:4:"Ή";s:2:"Ή";s:4:"Ί";s:2:"Ί";s:4:"Ό";s:2:"Ό";s:4:"Ύ";s:2:"Ύ";s:4:"Ώ";s:2:"Ώ";s:4:"ΐ";s:2:"ΐ";s:4:"Ϊ";s:2:"Ϊ";s:4:"Ϋ";s:2:"Ϋ";s:4:"ά";s:2:"ά";s:4:"έ";s:2:"έ";s:4:"ή";s:2:"ή";s:4:"ί";s:2:"ί";s:4:"ΰ";s:2:"ΰ";s:4:"ϊ";s:2:"ϊ";s:4:"ϋ";s:2:"ϋ";s:4:"ό";s:2:"ό";s:4:"ύ";s:2:"ύ";s:4:"ώ";s:2:"ώ";s:4:"ϓ";s:2:"ϓ";s:4:"ϔ";s:2:"ϔ";s:4:"Ѐ";s:2:"Ѐ";s:4:"Ё";s:2:"Ё";s:4:"Ѓ";s:2:"Ѓ";s:4:"Ї";s:2:"Ї";s:4:"Ќ";s:2:"Ќ";s:4:"Ѝ";s:2:"Ѝ";s:4:"Ў";s:2:"Ў";s:4:"Й";s:2:"Й";s:4:"й";s:2:"й";s:4:"ѐ";s:2:"ѐ";s:4:"ё";s:2:"ё";s:4:"ѓ";s:2:"ѓ";s:4:"ї";s:2:"ї";s:4:"ќ";s:2:"ќ";s:4:"ѝ";s:2:"ѝ";s:4:"ў";s:2:"ў";s:4:"Ѷ";s:2:"Ѷ";s:4:"ѷ";s:2:"ѷ";s:4:"Ӂ";s:2:"Ӂ";s:4:"ӂ";s:2:"ӂ";s:4:"Ӑ";s:2:"Ӑ";s:4:"ӑ";s:2:"ӑ";s:4:"Ӓ";s:2:"Ӓ";s:4:"ӓ";s:2:"ӓ";s:4:"Ӗ";s:2:"Ӗ";s:4:"ӗ";s:2:"ӗ";s:4:"Ӛ";s:2:"Ӛ";s:4:"ӛ";s:2:"ӛ";s:4:"Ӝ";s:2:"Ӝ";s:4:"ӝ";s:2:"ӝ";s:4:"Ӟ";s:2:"Ӟ";s:4:"ӟ";s:2:"ӟ";s:4:"Ӣ";s:2:"Ӣ";s:4:"ӣ";s:2:"ӣ";s:4:"Ӥ";s:2:"Ӥ";s:4:"ӥ";s:2:"ӥ";s:4:"Ӧ";s:2:"Ӧ";s:4:"ӧ";s:2:"ӧ";s:4:"Ӫ";s:2:"Ӫ";s:4:"ӫ";s:2:"ӫ";s:4:"Ӭ";s:2:"Ӭ";s:4:"ӭ";s:2:"ӭ";s:4:"Ӯ";s:2:"Ӯ";s:4:"ӯ";s:2:"ӯ";s:4:"Ӱ";s:2:"Ӱ";s:4:"ӱ";s:2:"ӱ";s:4:"Ӳ";s:2:"Ӳ";s:4:"ӳ";s:2:"ӳ";s:4:"Ӵ";s:2:"Ӵ";s:4:"ӵ";s:2:"ӵ";s:4:"Ӹ";s:2:"Ӹ";s:4:"ӹ";s:2:"ӹ";s:4:"آ";s:2:"آ";s:4:"أ";s:2:"أ";s:4:"ؤ";s:2:"ؤ";s:4:"إ";s:2:"إ";s:4:"ئ";s:2:"ئ";s:4:"ۀ";s:2:"ۀ";s:4:"ۂ";s:2:"ۂ";s:4:"ۓ";s:2:"ۓ";s:6:"ऩ";s:3:"ऩ";s:6:"ऱ";s:3:"ऱ";s:6:"ऴ";s:3:"ऴ";s:6:"ো";s:3:"ো";s:6:"ৌ";s:3:"ৌ";s:6:"ୈ";s:3:"ୈ";s:6:"ୋ";s:3:"ୋ";s:6:"ୌ";s:3:"ୌ";s:6:"ஔ";s:3:"ஔ";s:6:"ொ";s:3:"ொ";s:6:"ோ";s:3:"ோ";s:6:"ௌ";s:3:"ௌ";s:6:"ై";s:3:"ై";s:6:"ೀ";s:3:"ೀ";s:6:"ೇ";s:3:"ೇ";s:6:"ೈ";s:3:"ೈ";s:6:"ೊ";s:3:"ೊ";s:6:"ೋ";s:3:"ೋ";s:6:"ൊ";s:3:"ൊ";s:6:"ോ";s:3:"ോ";s:6:"ൌ";s:3:"ൌ";s:6:"ේ";s:3:"ේ";s:6:"ො";s:3:"ො";s:6:"ෝ";s:3:"ෝ";s:6:"ෞ";s:3:"ෞ";s:6:"ཱི";s:3:"ཱི";s:6:"ཱུ";s:3:"ཱུ";s:6:"ཱྀ";s:3:"ཱྀ";s:6:"ဦ";s:3:"ဦ";s:6:"ᬆ";s:3:"ᬆ";s:6:"ᬈ";s:3:"ᬈ";s:6:"ᬊ";s:3:"ᬊ";s:6:"ᬌ";s:3:"ᬌ";s:6:"ᬎ";s:3:"ᬎ";s:6:"ᬒ";s:3:"ᬒ";s:6:"ᬻ";s:3:"ᬻ";s:6:"ᬽ";s:3:"ᬽ";s:6:"ᭀ";s:3:"ᭀ";s:6:"ᭁ";s:3:"ᭁ";s:6:"ᭃ";s:3:"ᭃ";s:3:"Ḁ";s:3:"Ḁ";s:3:"ḁ";s:3:"ḁ";s:3:"Ḃ";s:3:"Ḃ";s:3:"ḃ";s:3:"ḃ";s:3:"Ḅ";s:3:"Ḅ";s:3:"ḅ";s:3:"ḅ";s:3:"Ḇ";s:3:"Ḇ";s:3:"ḇ";s:3:"ḇ";s:4:"Ḉ";s:3:"Ḉ";s:4:"ḉ";s:3:"ḉ";s:3:"Ḋ";s:3:"Ḋ";s:3:"ḋ";s:3:"ḋ";s:3:"Ḍ";s:3:"Ḍ";s:3:"ḍ";s:3:"ḍ";s:3:"Ḏ";s:3:"Ḏ";s:3:"ḏ";s:3:"ḏ";s:3:"Ḑ";s:3:"Ḑ";s:3:"ḑ";s:3:"ḑ";s:3:"Ḓ";s:3:"Ḓ";s:3:"ḓ";s:3:"ḓ";s:4:"Ḕ";s:3:"Ḕ";s:4:"ḕ";s:3:"ḕ";s:4:"Ḗ";s:3:"Ḗ";s:4:"ḗ";s:3:"ḗ";s:3:"Ḙ";s:3:"Ḙ";s:3:"ḙ";s:3:"ḙ";s:3:"Ḛ";s:3:"Ḛ";s:3:"ḛ";s:3:"ḛ";s:4:"Ḝ";s:3:"Ḝ";s:4:"ḝ";s:3:"ḝ";s:3:"Ḟ";s:3:"Ḟ";s:3:"ḟ";s:3:"ḟ";s:3:"Ḡ";s:3:"Ḡ";s:3:"ḡ";s:3:"ḡ";s:3:"Ḣ";s:3:"Ḣ";s:3:"ḣ";s:3:"ḣ";s:3:"Ḥ";s:3:"Ḥ";s:3:"ḥ";s:3:"ḥ";s:3:"Ḧ";s:3:"Ḧ";s:3:"ḧ";s:3:"ḧ";s:3:"Ḩ";s:3:"Ḩ";s:3:"ḩ";s:3:"ḩ";s:3:"Ḫ";s:3:"Ḫ";s:3:"ḫ";s:3:"ḫ";s:3:"Ḭ";s:3:"Ḭ";s:3:"ḭ";s:3:"ḭ";s:4:"Ḯ";s:3:"Ḯ";s:4:"ḯ";s:3:"ḯ";s:3:"Ḱ";s:3:"Ḱ";s:3:"ḱ";s:3:"ḱ";s:3:"Ḳ";s:3:"Ḳ";s:3:"ḳ";s:3:"ḳ";s:3:"Ḵ";s:3:"Ḵ";s:3:"ḵ";s:3:"ḵ";s:3:"Ḷ";s:3:"Ḷ";s:3:"ḷ";s:3:"ḷ";s:5:"Ḹ";s:3:"Ḹ";s:5:"ḹ";s:3:"ḹ";s:3:"Ḻ";s:3:"Ḻ";s:3:"ḻ";s:3:"ḻ";s:3:"Ḽ";s:3:"Ḽ";s:3:"ḽ";s:3:"ḽ";s:3:"Ḿ";s:3:"Ḿ";s:3:"ḿ";s:3:"ḿ";s:3:"Ṁ";s:3:"Ṁ";s:3:"ṁ";s:3:"ṁ";s:3:"Ṃ";s:3:"Ṃ";s:3:"ṃ";s:3:"ṃ";s:3:"Ṅ";s:3:"Ṅ";s:3:"ṅ";s:3:"ṅ";s:3:"Ṇ";s:3:"Ṇ";s:3:"ṇ";s:3:"ṇ";s:3:"Ṉ";s:3:"Ṉ";s:3:"ṉ";s:3:"ṉ";s:3:"Ṋ";s:3:"Ṋ";s:3:"ṋ";s:3:"ṋ";s:4:"Ṍ";s:3:"Ṍ";s:4:"ṍ";s:3:"ṍ";s:4:"Ṏ";s:3:"Ṏ";s:4:"ṏ";s:3:"ṏ";s:4:"Ṑ";s:3:"Ṑ";s:4:"ṑ";s:3:"ṑ";s:4:"Ṓ";s:3:"Ṓ";s:4:"ṓ";s:3:"ṓ";s:3:"Ṕ";s:3:"Ṕ";s:3:"ṕ";s:3:"ṕ";s:3:"Ṗ";s:3:"Ṗ";s:3:"ṗ";s:3:"ṗ";s:3:"Ṙ";s:3:"Ṙ";s:3:"ṙ";s:3:"ṙ";s:3:"Ṛ";s:3:"Ṛ";s:3:"ṛ";s:3:"ṛ";s:5:"Ṝ";s:3:"Ṝ";s:5:"ṝ";s:3:"ṝ";s:3:"Ṟ";s:3:"Ṟ";s:3:"ṟ";s:3:"ṟ";s:3:"Ṡ";s:3:"Ṡ";s:3:"ṡ";s:3:"ṡ";s:3:"Ṣ";s:3:"Ṣ";s:3:"ṣ";s:3:"ṣ";s:4:"Ṥ";s:3:"Ṥ";s:4:"ṥ";s:3:"ṥ";s:4:"Ṧ";s:3:"Ṧ";s:4:"ṧ";s:3:"ṧ";s:5:"Ṩ";s:3:"Ṩ";s:5:"ṩ";s:3:"ṩ";s:3:"Ṫ";s:3:"Ṫ";s:3:"ṫ";s:3:"ṫ";s:3:"Ṭ";s:3:"Ṭ";s:3:"ṭ";s:3:"ṭ";s:3:"Ṯ";s:3:"Ṯ";s:3:"ṯ";s:3:"ṯ";s:3:"Ṱ";s:3:"Ṱ";s:3:"ṱ";s:3:"ṱ";s:3:"Ṳ";s:3:"Ṳ";s:3:"ṳ";s:3:"ṳ";s:3:"Ṵ";s:3:"Ṵ";s:3:"ṵ";s:3:"ṵ";s:3:"Ṷ";s:3:"Ṷ";s:3:"ṷ";s:3:"ṷ";s:4:"Ṹ";s:3:"Ṹ";s:4:"ṹ";s:3:"ṹ";s:4:"Ṻ";s:3:"Ṻ";s:4:"ṻ";s:3:"ṻ";s:3:"Ṽ";s:3:"Ṽ";s:3:"ṽ";s:3:"ṽ";s:3:"Ṿ";s:3:"Ṿ";s:3:"ṿ";s:3:"ṿ";s:3:"Ẁ";s:3:"Ẁ";s:3:"ẁ";s:3:"ẁ";s:3:"Ẃ";s:3:"Ẃ";s:3:"ẃ";s:3:"ẃ";s:3:"Ẅ";s:3:"Ẅ";s:3:"ẅ";s:3:"ẅ";s:3:"Ẇ";s:3:"Ẇ";s:3:"ẇ";s:3:"ẇ";s:3:"Ẉ";s:3:"Ẉ";s:3:"ẉ";s:3:"ẉ";s:3:"Ẋ";s:3:"Ẋ";s:3:"ẋ";s:3:"ẋ";s:3:"Ẍ";s:3:"Ẍ";s:3:"ẍ";s:3:"ẍ";s:3:"Ẏ";s:3:"Ẏ";s:3:"ẏ";s:3:"ẏ";s:3:"Ẑ";s:3:"Ẑ";s:3:"ẑ";s:3:"ẑ";s:3:"Ẓ";s:3:"Ẓ";s:3:"ẓ";s:3:"ẓ";s:3:"Ẕ";s:3:"Ẕ";s:3:"ẕ";s:3:"ẕ";s:3:"ẖ";s:3:"ẖ";s:3:"ẗ";s:3:"ẗ";s:3:"ẘ";s:3:"ẘ";s:3:"ẙ";s:3:"ẙ";s:4:"ẛ";s:3:"ẛ";s:3:"Ạ";s:3:"Ạ";s:3:"ạ";s:3:"ạ";s:3:"Ả";s:3:"Ả";s:3:"ả";s:3:"ả";s:4:"Ấ";s:3:"Ấ";s:4:"ấ";s:3:"ấ";s:4:"Ầ";s:3:"Ầ";s:4:"ầ";s:3:"ầ";s:4:"Ẩ";s:3:"Ẩ";s:4:"ẩ";s:3:"ẩ";s:4:"Ẫ";s:3:"Ẫ";s:4:"ẫ";s:3:"ẫ";s:5:"Ậ";s:3:"Ậ";s:5:"ậ";s:3:"ậ";s:4:"Ắ";s:3:"Ắ";s:4:"ắ";s:3:"ắ";s:4:"Ằ";s:3:"Ằ";s:4:"ằ";s:3:"ằ";s:4:"Ẳ";s:3:"Ẳ";s:4:"ẳ";s:3:"ẳ";s:4:"Ẵ";s:3:"Ẵ";s:4:"ẵ";s:3:"ẵ";s:5:"Ặ";s:3:"Ặ";s:5:"ặ";s:3:"ặ";s:3:"Ẹ";s:3:"Ẹ";s:3:"ẹ";s:3:"ẹ";s:3:"Ẻ";s:3:"Ẻ";s:3:"ẻ";s:3:"ẻ";s:3:"Ẽ";s:3:"Ẽ";s:3:"ẽ";s:3:"ẽ";s:4:"Ế";s:3:"Ế";s:4:"ế";s:3:"ế";s:4:"Ề";s:3:"Ề";s:4:"ề";s:3:"ề";s:4:"Ể";s:3:"Ể";s:4:"ể";s:3:"ể";s:4:"Ễ";s:3:"Ễ";s:4:"ễ";s:3:"ễ";s:5:"Ệ";s:3:"Ệ";s:5:"ệ";s:3:"ệ";s:3:"Ỉ";s:3:"Ỉ";s:3:"ỉ";s:3:"ỉ";s:3:"Ị";s:3:"Ị";s:3:"ị";s:3:"ị";s:3:"Ọ";s:3:"Ọ";s:3:"ọ";s:3:"ọ";s:3:"Ỏ";s:3:"Ỏ";s:3:"ỏ";s:3:"ỏ";s:4:"Ố";s:3:"Ố";s:4:"ố";s:3:"ố";s:4:"Ồ";s:3:"Ồ";s:4:"ồ";s:3:"ồ";s:4:"Ổ";s:3:"Ổ";s:4:"ổ";s:3:"ổ";s:4:"Ỗ";s:3:"Ỗ";s:4:"ỗ";s:3:"ỗ";s:5:"Ộ";s:3:"Ộ";s:5:"ộ";s:3:"ộ";s:4:"Ớ";s:3:"Ớ";s:4:"ớ";s:3:"ớ";s:4:"Ờ";s:3:"Ờ";s:4:"ờ";s:3:"ờ";s:4:"Ở";s:3:"Ở";s:4:"ở";s:3:"ở";s:4:"Ỡ";s:3:"Ỡ";s:4:"ỡ";s:3:"ỡ";s:4:"Ợ";s:3:"Ợ";s:4:"ợ";s:3:"ợ";s:3:"Ụ";s:3:"Ụ";s:3:"ụ";s:3:"ụ";s:3:"Ủ";s:3:"Ủ";s:3:"ủ";s:3:"ủ";s:4:"Ứ";s:3:"Ứ";s:4:"ứ";s:3:"ứ";s:4:"Ừ";s:3:"Ừ";s:4:"ừ";s:3:"ừ";s:4:"Ử";s:3:"Ử";s:4:"ử";s:3:"ử";s:4:"Ữ";s:3:"Ữ";s:4:"ữ";s:3:"ữ";s:4:"Ự";s:3:"Ự";s:4:"ự";s:3:"ự";s:3:"Ỳ";s:3:"Ỳ";s:3:"ỳ";s:3:"ỳ";s:3:"Ỵ";s:3:"Ỵ";s:3:"ỵ";s:3:"ỵ";s:3:"Ỷ";s:3:"Ỷ";s:3:"ỷ";s:3:"ỷ";s:3:"Ỹ";s:3:"Ỹ";s:3:"ỹ";s:3:"ỹ";s:4:"ἀ";s:3:"ἀ";s:4:"ἁ";s:3:"ἁ";s:5:"ἂ";s:3:"ἂ";s:5:"ἃ";s:3:"ἃ";s:5:"ἄ";s:3:"ἄ";s:5:"ἅ";s:3:"ἅ";s:5:"ἆ";s:3:"ἆ";s:5:"ἇ";s:3:"ἇ";s:4:"Ἀ";s:3:"Ἀ";s:4:"Ἁ";s:3:"Ἁ";s:5:"Ἂ";s:3:"Ἂ";s:5:"Ἃ";s:3:"Ἃ";s:5:"Ἄ";s:3:"Ἄ";s:5:"Ἅ";s:3:"Ἅ";s:5:"Ἆ";s:3:"Ἆ";s:5:"Ἇ";s:3:"Ἇ";s:4:"ἐ";s:3:"ἐ";s:4:"ἑ";s:3:"ἑ";s:5:"ἒ";s:3:"ἒ";s:5:"ἓ";s:3:"ἓ";s:5:"ἔ";s:3:"ἔ";s:5:"ἕ";s:3:"ἕ";s:4:"Ἐ";s:3:"Ἐ";s:4:"Ἑ";s:3:"Ἑ";s:5:"Ἒ";s:3:"Ἒ";s:5:"Ἓ";s:3:"Ἓ";s:5:"Ἔ";s:3:"Ἔ";s:5:"Ἕ";s:3:"Ἕ";s:4:"ἠ";s:3:"ἠ";s:4:"ἡ";s:3:"ἡ";s:5:"ἢ";s:3:"ἢ";s:5:"ἣ";s:3:"ἣ";s:5:"ἤ";s:3:"ἤ";s:5:"ἥ";s:3:"ἥ";s:5:"ἦ";s:3:"ἦ";s:5:"ἧ";s:3:"ἧ";s:4:"Ἠ";s:3:"Ἠ";s:4:"Ἡ";s:3:"Ἡ";s:5:"Ἢ";s:3:"Ἢ";s:5:"Ἣ";s:3:"Ἣ";s:5:"Ἤ";s:3:"Ἤ";s:5:"Ἥ";s:3:"Ἥ";s:5:"Ἦ";s:3:"Ἦ";s:5:"Ἧ";s:3:"Ἧ";s:4:"ἰ";s:3:"ἰ";s:4:"ἱ";s:3:"ἱ";s:5:"ἲ";s:3:"ἲ";s:5:"ἳ";s:3:"ἳ";s:5:"ἴ";s:3:"ἴ";s:5:"ἵ";s:3:"ἵ";s:5:"ἶ";s:3:"ἶ";s:5:"ἷ";s:3:"ἷ";s:4:"Ἰ";s:3:"Ἰ";s:4:"Ἱ";s:3:"Ἱ";s:5:"Ἲ";s:3:"Ἲ";s:5:"Ἳ";s:3:"Ἳ";s:5:"Ἴ";s:3:"Ἴ";s:5:"Ἵ";s:3:"Ἵ";s:5:"Ἶ";s:3:"Ἶ";s:5:"Ἷ";s:3:"Ἷ";s:4:"ὀ";s:3:"ὀ";s:4:"ὁ";s:3:"ὁ";s:5:"ὂ";s:3:"ὂ";s:5:"ὃ";s:3:"ὃ";s:5:"ὄ";s:3:"ὄ";s:5:"ὅ";s:3:"ὅ";s:4:"Ὀ";s:3:"Ὀ";s:4:"Ὁ";s:3:"Ὁ";s:5:"Ὂ";s:3:"Ὂ";s:5:"Ὃ";s:3:"Ὃ";s:5:"Ὄ";s:3:"Ὄ";s:5:"Ὅ";s:3:"Ὅ";s:4:"ὐ";s:3:"ὐ";s:4:"ὑ";s:3:"ὑ";s:5:"ὒ";s:3:"ὒ";s:5:"ὓ";s:3:"ὓ";s:5:"ὔ";s:3:"ὔ";s:5:"ὕ";s:3:"ὕ";s:5:"ὖ";s:3:"ὖ";s:5:"ὗ";s:3:"ὗ";s:4:"Ὑ";s:3:"Ὑ";s:5:"Ὓ";s:3:"Ὓ";s:5:"Ὕ";s:3:"Ὕ";s:5:"Ὗ";s:3:"Ὗ";s:4:"ὠ";s:3:"ὠ";s:4:"ὡ";s:3:"ὡ";s:5:"ὢ";s:3:"ὢ";s:5:"ὣ";s:3:"ὣ";s:5:"ὤ";s:3:"ὤ";s:5:"ὥ";s:3:"ὥ";s:5:"ὦ";s:3:"ὦ";s:5:"ὧ";s:3:"ὧ";s:4:"Ὠ";s:3:"Ὠ";s:4:"Ὡ";s:3:"Ὡ";s:5:"Ὢ";s:3:"Ὢ";s:5:"Ὣ";s:3:"Ὣ";s:5:"Ὤ";s:3:"Ὤ";s:5:"Ὥ";s:3:"Ὥ";s:5:"Ὦ";s:3:"Ὦ";s:5:"Ὧ";s:3:"Ὧ";s:4:"ὰ";s:3:"ὰ";s:2:"ά";s:3:"ά";s:4:"ὲ";s:3:"ὲ";s:2:"έ";s:3:"έ";s:4:"ὴ";s:3:"ὴ";s:2:"ή";s:3:"ή";s:4:"ὶ";s:3:"ὶ";s:2:"ί";s:3:"ί";s:4:"ὸ";s:3:"ὸ";s:2:"ό";s:3:"ό";s:4:"ὺ";s:3:"ὺ";s:2:"ύ";s:3:"ύ";s:4:"ὼ";s:3:"ὼ";s:2:"ώ";s:3:"ώ";s:5:"ᾀ";s:3:"ᾀ";s:5:"ᾁ";s:3:"ᾁ";s:5:"ᾂ";s:3:"ᾂ";s:5:"ᾃ";s:3:"ᾃ";s:5:"ᾄ";s:3:"ᾄ";s:5:"ᾅ";s:3:"ᾅ";s:5:"ᾆ";s:3:"ᾆ";s:5:"ᾇ";s:3:"ᾇ";s:5:"ᾈ";s:3:"ᾈ";s:5:"ᾉ";s:3:"ᾉ";s:5:"ᾊ";s:3:"ᾊ";s:5:"ᾋ";s:3:"ᾋ";s:5:"ᾌ";s:3:"ᾌ";s:5:"ᾍ";s:3:"ᾍ";s:5:"ᾎ";s:3:"ᾎ";s:5:"ᾏ";s:3:"ᾏ";s:5:"ᾐ";s:3:"ᾐ";s:5:"ᾑ";s:3:"ᾑ";s:5:"ᾒ";s:3:"ᾒ";s:5:"ᾓ";s:3:"ᾓ";s:5:"ᾔ";s:3:"ᾔ";s:5:"ᾕ";s:3:"ᾕ";s:5:"ᾖ";s:3:"ᾖ";s:5:"ᾗ";s:3:"ᾗ";s:5:"ᾘ";s:3:"ᾘ";s:5:"ᾙ";s:3:"ᾙ";s:5:"ᾚ";s:3:"ᾚ";s:5:"ᾛ";s:3:"ᾛ";s:5:"ᾜ";s:3:"ᾜ";s:5:"ᾝ";s:3:"ᾝ";s:5:"ᾞ";s:3:"ᾞ";s:5:"ᾟ";s:3:"ᾟ";s:5:"ᾠ";s:3:"ᾠ";s:5:"ᾡ";s:3:"ᾡ";s:5:"ᾢ";s:3:"ᾢ";s:5:"ᾣ";s:3:"ᾣ";s:5:"ᾤ";s:3:"ᾤ";s:5:"ᾥ";s:3:"ᾥ";s:5:"ᾦ";s:3:"ᾦ";s:5:"ᾧ";s:3:"ᾧ";s:5:"ᾨ";s:3:"ᾨ";s:5:"ᾩ";s:3:"ᾩ";s:5:"ᾪ";s:3:"ᾪ";s:5:"ᾫ";s:3:"ᾫ";s:5:"ᾬ";s:3:"ᾬ";s:5:"ᾭ";s:3:"ᾭ";s:5:"ᾮ";s:3:"ᾮ";s:5:"ᾯ";s:3:"ᾯ";s:4:"ᾰ";s:3:"ᾰ";s:4:"ᾱ";s:3:"ᾱ";s:5:"ᾲ";s:3:"ᾲ";s:4:"ᾳ";s:3:"ᾳ";s:4:"ᾴ";s:3:"ᾴ";s:4:"ᾶ";s:3:"ᾶ";s:5:"ᾷ";s:3:"ᾷ";s:4:"Ᾰ";s:3:"Ᾰ";s:4:"Ᾱ";s:3:"Ᾱ";s:4:"Ὰ";s:3:"Ὰ";s:2:"Ά";s:3:"Ά";s:4:"ᾼ";s:3:"ᾼ";s:2:"ι";s:3:"ι";s:4:"῁";s:3:"῁";s:5:"ῂ";s:3:"ῂ";s:4:"ῃ";s:3:"ῃ";s:4:"ῄ";s:3:"ῄ";s:4:"ῆ";s:3:"ῆ";s:5:"ῇ";s:3:"ῇ";s:4:"Ὲ";s:3:"Ὲ";s:2:"Έ";s:3:"Έ";s:4:"Ὴ";s:3:"Ὴ";s:2:"Ή";s:3:"Ή";s:4:"ῌ";s:3:"ῌ";s:5:"῍";s:3:"῍";s:5:"῎";s:3:"῎";s:5:"῏";s:3:"῏";s:4:"ῐ";s:3:"ῐ";s:4:"ῑ";s:3:"ῑ";s:4:"ῒ";s:3:"ῒ";s:2:"ΐ";s:3:"ΐ";s:4:"ῖ";s:3:"ῖ";s:4:"ῗ";s:3:"ῗ";s:4:"Ῐ";s:3:"Ῐ";s:4:"Ῑ";s:3:"Ῑ";s:4:"Ὶ";s:3:"Ὶ";s:2:"Ί";s:3:"Ί";s:5:"῝";s:3:"῝";s:5:"῞";s:3:"῞";s:5:"῟";s:3:"῟";s:4:"ῠ";s:3:"ῠ";s:4:"ῡ";s:3:"ῡ";s:4:"ῢ";s:3:"ῢ";s:2:"ΰ";s:3:"ΰ";s:4:"ῤ";s:3:"ῤ";s:4:"ῥ";s:3:"ῥ";s:4:"ῦ";s:3:"ῦ";s:4:"ῧ";s:3:"ῧ";s:4:"Ῠ";s:3:"Ῠ";s:4:"Ῡ";s:3:"Ῡ";s:4:"Ὺ";s:3:"Ὺ";s:2:"Ύ";s:3:"Ύ";s:4:"Ῥ";s:3:"Ῥ";s:4:"῭";s:3:"῭";s:2:"΅";s:3:"΅";s:1:"`";s:3:"`";s:5:"ῲ";s:3:"ῲ";s:4:"ῳ";s:3:"ῳ";s:4:"ῴ";s:3:"ῴ";s:4:"ῶ";s:3:"ῶ";s:5:"ῷ";s:3:"ῷ";s:4:"Ὸ";s:3:"Ὸ";s:2:"Ό";s:3:"Ό";s:4:"Ὼ";s:3:"Ὼ";s:2:"Ώ";s:3:"Ώ";s:4:"ῼ";s:3:"ῼ";s:2:"´";s:3:"´";s:3:" ";s:3:" ";s:3:" ";s:3:" ";s:2:"Ω";s:3:"Ω";s:1:"K";s:3:"K";s:2:"Å";s:3:"Å";s:5:"↚";s:3:"↚";s:5:"↛";s:3:"↛";s:5:"↮";s:3:"↮";s:5:"⇍";s:3:"⇍";s:5:"⇎";s:3:"⇎";s:5:"⇏";s:3:"⇏";s:5:"∄";s:3:"∄";s:5:"∉";s:3:"∉";s:5:"∌";s:3:"∌";s:5:"∤";s:3:"∤";s:5:"∦";s:3:"∦";s:5:"≁";s:3:"≁";s:5:"≄";s:3:"≄";s:5:"≇";s:3:"≇";s:5:"≉";s:3:"≉";s:3:"≠";s:3:"≠";s:5:"≢";s:3:"≢";s:5:"≭";s:3:"≭";s:3:"≮";s:3:"≮";s:3:"≯";s:3:"≯";s:5:"≰";s:3:"≰";s:5:"≱";s:3:"≱";s:5:"≴";s:3:"≴";s:5:"≵";s:3:"≵";s:5:"≸";s:3:"≸";s:5:"≹";s:3:"≹";s:5:"⊀";s:3:"⊀";s:5:"⊁";s:3:"⊁";s:5:"⊄";s:3:"⊄";s:5:"⊅";s:3:"⊅";s:5:"⊈";s:3:"⊈";s:5:"⊉";s:3:"⊉";s:5:"⊬";s:3:"⊬";s:5:"⊭";s:3:"⊭";s:5:"⊮";s:3:"⊮";s:5:"⊯";s:3:"⊯";s:5:"⋠";s:3:"⋠";s:5:"⋡";s:3:"⋡";s:5:"⋢";s:3:"⋢";s:5:"⋣";s:3:"⋣";s:5:"⋪";s:3:"⋪";s:5:"⋫";s:3:"⋫";s:5:"⋬";s:3:"⋬";s:5:"⋭";s:3:"⋭";s:3:"〈";s:3:"〈";s:3:"〉";s:3:"〉";s:6:"が";s:3:"が";s:6:"ぎ";s:3:"ぎ";s:6:"ぐ";s:3:"ぐ";s:6:"げ";s:3:"げ";s:6:"ご";s:3:"ご";s:6:"ざ";s:3:"ざ";s:6:"じ";s:3:"じ";s:6:"ず";s:3:"ず";s:6:"ぜ";s:3:"ぜ";s:6:"ぞ";s:3:"ぞ";s:6:"だ";s:3:"だ";s:6:"ぢ";s:3:"ぢ";s:6:"づ";s:3:"づ";s:6:"で";s:3:"で";s:6:"ど";s:3:"ど";s:6:"ば";s:3:"ば";s:6:"ぱ";s:3:"ぱ";s:6:"び";s:3:"び";s:6:"ぴ";s:3:"ぴ";s:6:"ぶ";s:3:"ぶ";s:6:"ぷ";s:3:"ぷ";s:6:"べ";s:3:"べ";s:6:"ぺ";s:3:"ぺ";s:6:"ぼ";s:3:"ぼ";s:6:"ぽ";s:3:"ぽ";s:6:"ゔ";s:3:"ゔ";s:6:"ゞ";s:3:"ゞ";s:6:"ガ";s:3:"ガ";s:6:"ギ";s:3:"ギ";s:6:"グ";s:3:"グ";s:6:"ゲ";s:3:"ゲ";s:6:"ゴ";s:3:"ゴ";s:6:"ザ";s:3:"ザ";s:6:"ジ";s:3:"ジ";s:6:"ズ";s:3:"ズ";s:6:"ゼ";s:3:"ゼ";s:6:"ゾ";s:3:"ゾ";s:6:"ダ";s:3:"ダ";s:6:"ヂ";s:3:"ヂ";s:6:"ヅ";s:3:"ヅ";s:6:"デ";s:3:"デ";s:6:"ド";s:3:"ド";s:6:"バ";s:3:"バ";s:6:"パ";s:3:"パ";s:6:"ビ";s:3:"ビ";s:6:"ピ";s:3:"ピ";s:6:"ブ";s:3:"ブ";s:6:"プ";s:3:"プ";s:6:"ベ";s:3:"ベ";s:6:"ペ";s:3:"ペ";s:6:"ボ";s:3:"ボ";s:6:"ポ";s:3:"ポ";s:6:"ヴ";s:3:"ヴ";s:6:"ヷ";s:3:"ヷ";s:6:"ヸ";s:3:"ヸ";s:6:"ヹ";s:3:"ヹ";s:6:"ヺ";s:3:"ヺ";s:6:"ヾ";s:3:"ヾ";s:3:"豈";s:3:"豈";s:3:"更";s:3:"更";s:3:"車";s:3:"車";s:3:"賈";s:3:"賈";s:3:"滑";s:3:"滑";s:3:"串";s:3:"串";s:3:"句";s:3:"句";s:3:"龜";s:3:"龜";s:3:"契";s:3:"契";s:3:"金";s:3:"金";s:3:"喇";s:3:"喇";s:3:"奈";s:3:"奈";s:3:"懶";s:4:"懶";s:3:"癩";s:3:"癩";s:3:"羅";s:3:"羅";s:3:"蘿";s:3:"蘿";s:3:"螺";s:3:"螺";s:3:"裸";s:3:"裸";s:3:"邏";s:3:"邏";s:3:"樂";s:3:"樂";s:3:"洛";s:3:"洛";s:3:"烙";s:3:"烙";s:3:"珞";s:3:"珞";s:3:"落";s:3:"落";s:3:"酪";s:3:"酪";s:3:"駱";s:3:"駱";s:3:"亂";s:3:"亂";s:3:"卵";s:3:"卵";s:3:"欄";s:3:"欄";s:3:"爛";s:3:"爛";s:3:"蘭";s:3:"蘭";s:3:"鸞";s:3:"鸞";s:3:"嵐";s:3:"嵐";s:3:"濫";s:3:"濫";s:3:"藍";s:3:"藍";s:3:"襤";s:3:"襤";s:3:"拉";s:3:"拉";s:3:"臘";s:3:"臘";s:3:"蠟";s:3:"蠟";s:3:"廊";s:4:"廊";s:3:"朗";s:4:"朗";s:3:"浪";s:3:"浪";s:3:"狼";s:3:"狼";s:3:"郎";s:3:"郎";s:3:"來";s:3:"來";s:3:"冷";s:3:"冷";s:3:"勞";s:3:"勞";s:3:"擄";s:3:"擄";s:3:"櫓";s:3:"櫓";s:3:"爐";s:3:"爐";s:3:"盧";s:3:"盧";s:3:"老";s:3:"老";s:3:"蘆";s:3:"蘆";s:3:"虜";s:4:"虜";s:3:"路";s:3:"路";s:3:"露";s:3:"露";s:3:"魯";s:3:"魯";s:3:"鷺";s:3:"鷺";s:3:"碌";s:4:"碌";s:3:"祿";s:3:"祿";s:3:"綠";s:3:"綠";s:3:"菉";s:3:"菉";s:3:"錄";s:3:"錄";s:3:"鹿";s:3:"鹿";s:3:"論";s:3:"論";s:3:"壟";s:3:"壟";s:3:"弄";s:3:"弄";s:3:"籠";s:3:"籠";s:3:"聾";s:3:"聾";s:3:"牢";s:3:"牢";s:3:"磊";s:3:"磊";s:3:"賂";s:3:"賂";s:3:"雷";s:3:"雷";s:3:"壘";s:3:"壘";s:3:"屢";s:3:"屢";s:3:"樓";s:3:"樓";s:3:"淚";s:3:"淚";s:3:"漏";s:3:"漏";s:3:"累";s:3:"累";s:3:"縷";s:3:"縷";s:3:"陋";s:3:"陋";s:3:"勒";s:3:"勒";s:3:"肋";s:3:"肋";s:3:"凜";s:3:"凜";s:3:"凌";s:3:"凌";s:3:"稜";s:3:"稜";s:3:"綾";s:3:"綾";s:3:"菱";s:3:"菱";s:3:"陵";s:3:"陵";s:3:"讀";s:3:"讀";s:3:"拏";s:3:"拏";s:3:"諾";s:3:"諾";s:3:"丹";s:3:"丹";s:3:"寧";s:4:"寧";s:3:"怒";s:3:"怒";s:3:"率";s:3:"率";s:3:"異";s:4:"異";s:3:"北";s:4:"北";s:3:"磻";s:3:"磻";s:3:"便";s:3:"便";s:3:"復";s:3:"復";s:3:"不";s:3:"不";s:3:"泌";s:3:"泌";s:3:"數";s:3:"數";s:3:"索";s:3:"索";s:3:"參";s:3:"參";s:3:"塞";s:3:"塞";s:3:"省";s:3:"省";s:3:"葉";s:3:"葉";s:3:"說";s:3:"說";s:3:"殺";s:4:"殺";s:3:"辰";s:3:"辰";s:3:"沈";s:3:"沈";s:3:"拾";s:3:"拾";s:3:"若";s:4:"若";s:3:"掠";s:3:"掠";s:3:"略";s:3:"略";s:3:"亮";s:3:"亮";s:3:"兩";s:3:"兩";s:3:"凉";s:3:"凉";s:3:"梁";s:3:"梁";s:3:"糧";s:3:"糧";s:3:"良";s:3:"良";s:3:"諒";s:3:"諒";s:3:"量";s:3:"量";s:3:"勵";s:3:"勵";s:3:"呂";s:3:"呂";s:3:"女";s:3:"女";s:3:"廬";s:3:"廬";s:3:"旅";s:3:"旅";s:3:"濾";s:3:"濾";s:3:"礪";s:3:"礪";s:3:"閭";s:3:"閭";s:3:"驪";s:3:"驪";s:3:"麗";s:3:"麗";s:3:"黎";s:3:"黎";s:3:"力";s:3:"力";s:3:"曆";s:3:"曆";s:3:"歷";s:3:"歷";s:3:"轢";s:3:"轢";s:3:"年";s:3:"年";s:3:"憐";s:3:"憐";s:3:"戀";s:3:"戀";s:3:"撚";s:3:"撚";s:3:"漣";s:3:"漣";s:3:"煉";s:3:"煉";s:3:"璉";s:3:"璉";s:3:"秊";s:3:"秊";s:3:"練";s:3:"練";s:3:"聯";s:3:"聯";s:3:"輦";s:3:"輦";s:3:"蓮";s:3:"蓮";s:3:"連";s:3:"連";s:3:"鍊";s:3:"鍊";s:3:"列";s:3:"列";s:3:"劣";s:3:"劣";s:3:"咽";s:3:"咽";s:3:"烈";s:3:"烈";s:3:"裂";s:3:"裂";s:3:"廉";s:3:"廉";s:3:"念";s:3:"念";s:3:"捻";s:3:"捻";s:3:"殮";s:3:"殮";s:3:"簾";s:3:"簾";s:3:"獵";s:3:"獵";s:3:"令";s:3:"令";s:3:"囹";s:3:"囹";s:3:"嶺";s:3:"嶺";s:3:"怜";s:3:"怜";s:3:"玲";s:3:"玲";s:3:"瑩";s:3:"瑩";s:3:"羚";s:3:"羚";s:3:"聆";s:3:"聆";s:3:"鈴";s:3:"鈴";s:3:"零";s:3:"零";s:3:"靈";s:3:"靈";s:3:"領";s:3:"領";s:3:"例";s:3:"例";s:3:"禮";s:3:"禮";s:3:"醴";s:3:"醴";s:3:"隸";s:3:"隸";s:3:"惡";s:3:"惡";s:3:"了";s:3:"了";s:3:"僚";s:3:"僚";s:3:"寮";s:3:"寮";s:3:"尿";s:3:"尿";s:3:"料";s:3:"料";s:3:"燎";s:3:"燎";s:3:"療";s:3:"療";s:3:"蓼";s:3:"蓼";s:3:"遼";s:3:"遼";s:3:"龍";s:3:"龍";s:3:"暈";s:3:"暈";s:3:"阮";s:3:"阮";s:3:"劉";s:3:"劉";s:3:"杻";s:3:"杻";s:3:"柳";s:3:"柳";s:3:"流";s:4:"流";s:3:"溜";s:3:"溜";s:3:"琉";s:3:"琉";s:3:"留";s:3:"留";s:3:"硫";s:3:"硫";s:3:"紐";s:3:"紐";s:3:"類";s:3:"類";s:3:"六";s:3:"六";s:3:"戮";s:3:"戮";s:3:"陸";s:3:"陸";s:3:"倫";s:3:"倫";s:3:"崙";s:3:"崙";s:3:"淪";s:3:"淪";s:3:"輪";s:3:"輪";s:3:"律";s:3:"律";s:3:"慄";s:3:"慄";s:3:"栗";s:3:"栗";s:3:"隆";s:3:"隆";s:3:"利";s:3:"利";s:3:"吏";s:3:"吏";s:3:"履";s:3:"履";s:3:"易";s:3:"易";s:3:"李";s:3:"李";s:3:"梨";s:3:"梨";s:3:"泥";s:3:"泥";s:3:"理";s:3:"理";s:3:"痢";s:3:"痢";s:3:"罹";s:3:"罹";s:3:"裏";s:3:"裏";s:3:"裡";s:3:"裡";s:3:"里";s:3:"里";s:3:"離";s:3:"離";s:3:"匿";s:3:"匿";s:3:"溺";s:3:"溺";s:3:"吝";s:3:"吝";s:3:"燐";s:3:"燐";s:3:"璘";s:3:"璘";s:3:"藺";s:3:"藺";s:3:"隣";s:3:"隣";s:3:"鱗";s:3:"鱗";s:3:"麟";s:3:"麟";s:3:"林";s:3:"林";s:3:"淋";s:3:"淋";s:3:"臨";s:3:"臨";s:3:"立";s:3:"立";s:3:"笠";s:3:"笠";s:3:"粒";s:3:"粒";s:3:"狀";s:3:"狀";s:3:"炙";s:3:"炙";s:3:"識";s:3:"識";s:3:"什";s:3:"什";s:3:"茶";s:3:"茶";s:3:"刺";s:3:"刺";s:3:"切";s:4:"切";s:3:"度";s:3:"度";s:3:"拓";s:3:"拓";s:3:"糖";s:3:"糖";s:3:"宅";s:3:"宅";s:3:"洞";s:3:"洞";s:3:"暴";s:3:"暴";s:3:"輻";s:3:"輻";s:3:"行";s:3:"行";s:3:"降";s:3:"降";s:3:"見";s:3:"見";s:3:"廓";s:3:"廓";s:3:"兀";s:3:"兀";s:3:"嗀";s:3:"嗀";s:3:"塚";s:3:"塚";s:3:"晴";s:3:"晴";s:3:"凞";s:3:"凞";s:3:"猪";s:3:"猪";s:3:"益";s:3:"益";s:3:"礼";s:3:"礼";s:3:"神";s:3:"神";s:3:"祥";s:3:"祥";s:3:"福";s:4:"福";s:3:"靖";s:3:"靖";s:3:"精";s:3:"精";s:3:"羽";s:3:"羽";s:3:"蘒";s:3:"蘒";s:3:"諸";s:3:"諸";s:3:"逸";s:3:"逸";s:3:"都";s:3:"都";s:3:"飯";s:3:"飯";s:3:"飼";s:3:"飼";s:3:"館";s:3:"館";s:3:"鶴";s:3:"鶴";s:3:"侮";s:4:"侮";s:3:"僧";s:4:"僧";s:3:"免";s:4:"免";s:3:"勉";s:4:"勉";s:3:"勤";s:4:"勤";s:3:"卑";s:4:"卑";s:3:"喝";s:3:"喝";s:3:"嘆";s:4:"嘆";s:3:"器";s:3:"器";s:3:"塀";s:3:"塀";s:3:"墨";s:3:"墨";s:3:"層";s:3:"層";s:3:"屮";s:4:"屮";s:3:"悔";s:4:"悔";s:3:"慨";s:3:"慨";s:3:"憎";s:4:"憎";s:3:"懲";s:4:"懲";s:3:"敏";s:4:"敏";s:3:"既";s:3:"既";s:3:"暑";s:4:"暑";s:3:"梅";s:4:"梅";s:3:"海";s:4:"海";s:3:"渚";s:3:"渚";s:3:"漢";s:3:"漢";s:3:"煮";s:3:"煮";s:3:"爫";s:3:"爫";s:3:"琢";s:3:"琢";s:3:"碑";s:3:"碑";s:3:"社";s:3:"社";s:3:"祉";s:3:"祉";s:3:"祈";s:3:"祈";s:3:"祐";s:3:"祐";s:3:"祖";s:4:"祖";s:3:"祝";s:3:"祝";s:3:"禍";s:3:"禍";s:3:"禎";s:3:"禎";s:3:"穀";s:4:"穀";s:3:"突";s:3:"突";s:3:"節";s:3:"節";s:3:"縉";s:3:"縉";s:3:"繁";s:3:"繁";s:3:"署";s:3:"署";s:3:"者";s:4:"者";s:3:"臭";s:3:"臭";s:3:"艹";s:3:"艹";s:3:"著";s:4:"著";s:3:"褐";s:3:"褐";s:3:"視";s:3:"視";s:3:"謁";s:3:"謁";s:3:"謹";s:3:"謹";s:3:"賓";s:3:"賓";s:3:"贈";s:3:"贈";s:3:"辶";s:3:"辶";s:3:"難";s:3:"難";s:3:"響";s:3:"響";s:3:"頻";s:3:"頻";s:3:"恵";s:3:"恵";s:4:"𤋮";s:3:"𤋮";s:3:"舘";s:3:"舘";s:3:"並";s:3:"並";s:3:"况";s:4:"况";s:3:"全";s:3:"全";s:3:"侀";s:3:"侀";s:3:"充";s:3:"充";s:3:"冀";s:3:"冀";s:3:"勇";s:4:"勇";s:3:"勺";s:4:"勺";s:3:"啕";s:3:"啕";s:3:"喙";s:4:"喙";s:3:"嗢";s:3:"嗢";s:3:"墳";s:3:"墳";s:3:"奄";s:3:"奄";s:3:"奔";s:3:"奔";s:3:"婢";s:3:"婢";s:3:"嬨";s:3:"嬨";s:3:"廒";s:3:"廒";s:3:"廙";s:3:"廙";s:3:"彩";s:3:"彩";s:3:"徭";s:3:"徭";s:3:"惘";s:3:"惘";s:3:"慎";s:4:"慎";s:3:"愈";s:3:"愈";s:3:"慠";s:3:"慠";s:3:"戴";s:3:"戴";s:3:"揄";s:3:"揄";s:3:"搜";s:3:"搜";s:3:"摒";s:3:"摒";s:3:"敖";s:3:"敖";s:3:"望";s:4:"望";s:3:"杖";s:3:"杖";s:3:"歹";s:3:"歹";s:3:"滛";s:3:"滛";s:3:"滋";s:4:"滋";s:3:"瀞";s:4:"瀞";s:3:"瞧";s:3:"瞧";s:3:"爵";s:4:"爵";s:3:"犯";s:3:"犯";s:3:"瑱";s:4:"瑱";s:3:"甆";s:3:"甆";s:3:"画";s:3:"画";s:3:"瘝";s:3:"瘝";s:3:"瘟";s:3:"瘟";s:3:"盛";s:3:"盛";s:3:"直";s:4:"直";s:3:"睊";s:4:"睊";s:3:"着";s:3:"着";s:3:"磌";s:4:"磌";s:3:"窱";s:3:"窱";s:3:"类";s:3:"类";s:3:"絛";s:3:"絛";s:3:"缾";s:3:"缾";s:3:"荒";s:3:"荒";s:3:"華";s:3:"華";s:3:"蝹";s:4:"蝹";s:3:"襁";s:3:"襁";s:3:"覆";s:3:"覆";s:3:"調";s:3:"調";s:3:"請";s:3:"請";s:3:"諭";s:4:"諭";s:3:"變";s:4:"變";s:3:"輸";s:4:"輸";s:3:"遲";s:3:"遲";s:3:"醙";s:3:"醙";s:3:"鉶";s:3:"鉶";s:3:"陼";s:3:"陼";s:3:"韛";s:3:"韛";s:3:"頋";s:4:"頋";s:3:"鬒";s:4:"鬒";s:4:"𢡊";s:3:"𢡊";s:4:"𢡄";s:3:"𢡄";s:4:"𣏕";s:3:"𣏕";s:3:"㮝";s:4:"㮝";s:3:"䀘";s:3:"䀘";s:3:"䀹";s:4:"䀹";s:4:"𥉉";s:3:"𥉉";s:4:"𥳐";s:3:"𥳐";s:4:"𧻓";s:3:"𧻓";s:3:"齃";s:3:"齃";s:3:"龎";s:3:"龎";s:8:"𑂚";s:4:"𑂚";s:8:"𑂜";s:4:"𑂜";s:8:"𑂫";s:4:"𑂫";s:3:"丽";s:4:"丽";s:3:"丸";s:4:"丸";s:3:"乁";s:4:"乁";s:4:"𠄢";s:4:"𠄢";s:3:"你";s:4:"你";s:3:"侻";s:4:"侻";s:3:"倂";s:4:"倂";s:3:"偺";s:4:"偺";s:3:"備";s:4:"備";s:3:"像";s:4:"像";s:3:"㒞";s:4:"㒞";s:4:"𠘺";s:4:"𠘺";s:3:"兔";s:4:"兔";s:3:"兤";s:4:"兤";s:3:"具";s:4:"具";s:4:"𠔜";s:4:"𠔜";s:3:"㒹";s:4:"㒹";s:3:"內";s:4:"內";s:3:"再";s:4:"再";s:4:"𠕋";s:4:"𠕋";s:3:"冗";s:4:"冗";s:3:"冤";s:4:"冤";s:3:"仌";s:4:"仌";s:3:"冬";s:4:"冬";s:4:"𩇟";s:4:"𩇟";s:3:"凵";s:4:"凵";s:3:"刃";s:4:"刃";s:3:"㓟";s:4:"㓟";s:3:"刻";s:4:"刻";s:3:"剆";s:4:"剆";s:3:"割";s:4:"割";s:3:"剷";s:4:"剷";s:3:"㔕";s:4:"㔕";s:3:"包";s:4:"包";s:3:"匆";s:4:"匆";s:3:"卉";s:4:"卉";s:3:"博";s:4:"博";s:3:"即";s:4:"即";s:3:"卽";s:4:"卽";s:3:"卿";s:4:"卿";s:4:"𠨬";s:4:"𠨬";s:3:"灰";s:4:"灰";s:3:"及";s:4:"及";s:3:"叟";s:4:"叟";s:4:"𠭣";s:4:"𠭣";s:3:"叫";s:4:"叫";s:3:"叱";s:4:"叱";s:3:"吆";s:4:"吆";s:3:"咞";s:4:"咞";s:3:"吸";s:4:"吸";s:3:"呈";s:4:"呈";s:3:"周";s:4:"周";s:3:"咢";s:4:"咢";s:3:"哶";s:4:"哶";s:3:"唐";s:4:"唐";s:3:"啓";s:4:"啓";s:3:"啣";s:4:"啣";s:3:"善";s:4:"善";s:3:"喫";s:4:"喫";s:3:"喳";s:4:"喳";s:3:"嗂";s:4:"嗂";s:3:"圖";s:4:"圖";s:3:"圗";s:4:"圗";s:3:"噑";s:4:"噑";s:3:"噴";s:4:"噴";s:3:"壮";s:4:"壮";s:3:"城";s:4:"城";s:3:"埴";s:4:"埴";s:3:"堍";s:4:"堍";s:3:"型";s:4:"型";s:3:"堲";s:4:"堲";s:3:"報";s:4:"報";s:3:"墬";s:4:"墬";s:4:"𡓤";s:4:"𡓤";s:3:"売";s:4:"売";s:3:"壷";s:4:"壷";s:3:"夆";s:4:"夆";s:3:"多";s:4:"多";s:3:"夢";s:4:"夢";s:3:"奢";s:4:"奢";s:4:"𡚨";s:4:"𡚨";s:4:"𡛪";s:4:"𡛪";s:3:"姬";s:4:"姬";s:3:"娛";s:4:"娛";s:3:"娧";s:4:"娧";s:3:"姘";s:4:"姘";s:3:"婦";s:4:"婦";s:3:"㛮";s:4:"㛮";s:3:"㛼";s:4:"㛼";s:3:"嬈";s:4:"嬈";s:3:"嬾";s:4:"嬾";s:4:"𡧈";s:4:"𡧈";s:3:"寃";s:4:"寃";s:3:"寘";s:4:"寘";s:3:"寳";s:4:"寳";s:4:"𡬘";s:4:"𡬘";s:3:"寿";s:4:"寿";s:3:"将";s:4:"将";s:3:"当";s:4:"当";s:3:"尢";s:4:"尢";s:3:"㞁";s:4:"㞁";s:3:"屠";s:4:"屠";s:3:"峀";s:4:"峀";s:3:"岍";s:4:"岍";s:4:"𡷤";s:4:"𡷤";s:3:"嵃";s:4:"嵃";s:4:"𡷦";s:4:"𡷦";s:3:"嵮";s:4:"嵮";s:3:"嵫";s:4:"嵫";s:3:"嵼";s:4:"嵼";s:3:"巡";s:4:"巡";s:3:"巢";s:4:"巢";s:3:"㠯";s:4:"㠯";s:3:"巽";s:4:"巽";s:3:"帨";s:4:"帨";s:3:"帽";s:4:"帽";s:3:"幩";s:4:"幩";s:3:"㡢";s:4:"㡢";s:4:"𢆃";s:4:"𢆃";s:3:"㡼";s:4:"㡼";s:3:"庰";s:4:"庰";s:3:"庳";s:4:"庳";s:3:"庶";s:4:"庶";s:4:"𪎒";s:4:"𪎒";s:3:"廾";s:4:"廾";s:4:"𢌱";s:4:"𢌱";s:3:"舁";s:4:"舁";s:3:"弢";s:4:"弢";s:3:"㣇";s:4:"㣇";s:4:"𣊸";s:4:"𣊸";s:4:"𦇚";s:4:"𦇚";s:3:"形";s:4:"形";s:3:"彫";s:4:"彫";s:3:"㣣";s:4:"㣣";s:3:"徚";s:4:"徚";s:3:"忍";s:4:"忍";s:3:"志";s:4:"志";s:3:"忹";s:4:"忹";s:3:"悁";s:4:"悁";s:3:"㤺";s:4:"㤺";s:3:"㤜";s:4:"㤜";s:4:"𢛔";s:4:"𢛔";s:3:"惇";s:4:"惇";s:3:"慈";s:4:"慈";s:3:"慌";s:4:"慌";s:3:"慺";s:4:"慺";s:3:"憲";s:4:"憲";s:3:"憤";s:4:"憤";s:3:"憯";s:4:"憯";s:3:"懞";s:4:"懞";s:3:"成";s:4:"成";s:3:"戛";s:4:"戛";s:3:"扝";s:4:"扝";s:3:"抱";s:4:"抱";s:3:"拔";s:4:"拔";s:3:"捐";s:4:"捐";s:4:"𢬌";s:4:"𢬌";s:3:"挽";s:4:"挽";s:3:"拼";s:4:"拼";s:3:"捨";s:4:"捨";s:3:"掃";s:4:"掃";s:3:"揤";s:4:"揤";s:4:"𢯱";s:4:"𢯱";s:3:"搢";s:4:"搢";s:3:"揅";s:4:"揅";s:3:"掩";s:4:"掩";s:3:"㨮";s:4:"㨮";s:3:"摩";s:4:"摩";s:3:"摾";s:4:"摾";s:3:"撝";s:4:"撝";s:3:"摷";s:4:"摷";s:3:"㩬";s:4:"㩬";s:3:"敬";s:4:"敬";s:4:"𣀊";s:4:"𣀊";s:3:"旣";s:4:"旣";s:3:"書";s:4:"書";s:3:"晉";s:4:"晉";s:3:"㬙";s:4:"㬙";s:3:"㬈";s:4:"㬈";s:3:"㫤";s:4:"㫤";s:3:"冒";s:4:"冒";s:3:"冕";s:4:"冕";s:3:"最";s:4:"最";s:3:"暜";s:4:"暜";s:3:"肭";s:4:"肭";s:3:"䏙";s:4:"䏙";s:3:"朡";s:4:"朡";s:3:"杞";s:4:"杞";s:3:"杓";s:4:"杓";s:4:"𣏃";s:4:"𣏃";s:3:"㭉";s:4:"㭉";s:3:"柺";s:4:"柺";s:3:"枅";s:4:"枅";s:3:"桒";s:4:"桒";s:4:"𣑭";s:4:"𣑭";s:3:"梎";s:4:"梎";s:3:"栟";s:4:"栟";s:3:"椔";s:4:"椔";s:3:"楂";s:4:"楂";s:3:"榣";s:4:"榣";s:3:"槪";s:4:"槪";s:3:"檨";s:4:"檨";s:4:"𣚣";s:4:"𣚣";s:3:"櫛";s:4:"櫛";s:3:"㰘";s:4:"㰘";s:3:"次";s:4:"次";s:4:"𣢧";s:4:"𣢧";s:3:"歔";s:4:"歔";s:3:"㱎";s:4:"㱎";s:3:"歲";s:4:"歲";s:3:"殟";s:4:"殟";s:3:"殻";s:4:"殻";s:4:"𣪍";s:4:"𣪍";s:4:"𡴋";s:4:"𡴋";s:4:"𣫺";s:4:"𣫺";s:3:"汎";s:4:"汎";s:4:"𣲼";s:4:"𣲼";s:3:"沿";s:4:"沿";s:3:"泍";s:4:"泍";s:3:"汧";s:4:"汧";s:3:"洖";s:4:"洖";s:3:"派";s:4:"派";s:3:"浩";s:4:"浩";s:3:"浸";s:4:"浸";s:3:"涅";s:4:"涅";s:4:"𣴞";s:4:"𣴞";s:3:"洴";s:4:"洴";s:3:"港";s:4:"港";s:3:"湮";s:4:"湮";s:3:"㴳";s:4:"㴳";s:3:"滇";s:4:"滇";s:4:"𣻑";s:4:"𣻑";s:3:"淹";s:4:"淹";s:3:"潮";s:4:"潮";s:4:"𣽞";s:4:"𣽞";s:4:"𣾎";s:4:"𣾎";s:3:"濆";s:4:"濆";s:3:"瀹";s:4:"瀹";s:3:"瀛";s:4:"瀛";s:3:"㶖";s:4:"㶖";s:3:"灊";s:4:"灊";s:3:"災";s:4:"災";s:3:"灷";s:4:"灷";s:3:"炭";s:4:"炭";s:4:"𠔥";s:4:"𠔥";s:3:"煅";s:4:"煅";s:4:"𤉣";s:4:"𤉣";s:3:"熜";s:4:"熜";s:4:"𤎫";s:4:"𤎫";s:3:"爨";s:4:"爨";s:3:"牐";s:4:"牐";s:4:"𤘈";s:4:"𤘈";s:3:"犀";s:4:"犀";s:3:"犕";s:4:"犕";s:4:"𤜵";s:4:"𤜵";s:4:"𤠔";s:4:"𤠔";s:3:"獺";s:4:"獺";s:3:"王";s:4:"王";s:3:"㺬";s:4:"㺬";s:3:"玥";s:4:"玥";s:3:"㺸";s:4:"㺸";s:3:"瑇";s:4:"瑇";s:3:"瑜";s:4:"瑜";s:3:"璅";s:4:"璅";s:3:"瓊";s:4:"瓊";s:3:"㼛";s:4:"㼛";s:3:"甤";s:4:"甤";s:4:"𤰶";s:4:"𤰶";s:3:"甾";s:4:"甾";s:4:"𤲒";s:4:"𤲒";s:4:"𢆟";s:4:"𢆟";s:3:"瘐";s:4:"瘐";s:4:"𤾡";s:4:"𤾡";s:4:"𤾸";s:4:"𤾸";s:4:"𥁄";s:4:"𥁄";s:3:"㿼";s:4:"㿼";s:3:"䀈";s:4:"䀈";s:4:"𥃳";s:4:"𥃳";s:4:"𥃲";s:4:"𥃲";s:4:"𥄙";s:4:"𥄙";s:4:"𥄳";s:4:"𥄳";s:3:"眞";s:4:"眞";s:3:"真";s:4:"真";s:3:"瞋";s:4:"瞋";s:3:"䁆";s:4:"䁆";s:3:"䂖";s:4:"䂖";s:4:"𥐝";s:4:"𥐝";s:3:"硎";s:4:"硎";s:3:"䃣";s:4:"䃣";s:4:"𥘦";s:4:"𥘦";s:4:"𥚚";s:4:"𥚚";s:4:"𥛅";s:4:"𥛅";s:3:"秫";s:4:"秫";s:3:"䄯";s:4:"䄯";s:3:"穊";s:4:"穊";s:3:"穏";s:4:"穏";s:4:"𥥼";s:4:"𥥼";s:4:"𥪧";s:4:"𥪧";s:3:"竮";s:4:"竮";s:3:"䈂";s:4:"䈂";s:4:"𥮫";s:4:"𥮫";s:3:"篆";s:4:"篆";s:3:"築";s:4:"築";s:3:"䈧";s:4:"䈧";s:4:"𥲀";s:4:"𥲀";s:3:"糒";s:4:"糒";s:3:"䊠";s:4:"䊠";s:3:"糨";s:4:"糨";s:3:"糣";s:4:"糣";s:3:"紀";s:4:"紀";s:4:"𥾆";s:4:"𥾆";s:3:"絣";s:4:"絣";s:3:"䌁";s:4:"䌁";s:3:"緇";s:4:"緇";s:3:"縂";s:4:"縂";s:3:"繅";s:4:"繅";s:3:"䌴";s:4:"䌴";s:4:"𦈨";s:4:"𦈨";s:4:"𦉇";s:4:"𦉇";s:3:"䍙";s:4:"䍙";s:4:"𦋙";s:4:"𦋙";s:3:"罺";s:4:"罺";s:4:"𦌾";s:4:"𦌾";s:3:"羕";s:4:"羕";s:3:"翺";s:4:"翺";s:4:"𦓚";s:4:"𦓚";s:4:"𦔣";s:4:"𦔣";s:3:"聠";s:4:"聠";s:4:"𦖨";s:4:"𦖨";s:3:"聰";s:4:"聰";s:4:"𣍟";s:4:"𣍟";s:3:"䏕";s:4:"䏕";s:3:"育";s:4:"育";s:3:"脃";s:4:"脃";s:3:"䐋";s:4:"䐋";s:3:"脾";s:4:"脾";s:3:"媵";s:4:"媵";s:4:"𦞧";s:4:"𦞧";s:4:"𦞵";s:4:"𦞵";s:4:"𣎓";s:4:"𣎓";s:4:"𣎜";s:4:"𣎜";s:3:"舄";s:4:"舄";s:3:"辞";s:4:"辞";s:3:"䑫";s:4:"䑫";s:3:"芑";s:4:"芑";s:3:"芋";s:4:"芋";s:3:"芝";s:4:"芝";s:3:"劳";s:4:"劳";s:3:"花";s:4:"花";s:3:"芳";s:4:"芳";s:3:"芽";s:4:"芽";s:3:"苦";s:4:"苦";s:4:"𦬼";s:4:"𦬼";s:3:"茝";s:4:"茝";s:3:"荣";s:4:"荣";s:3:"莭";s:4:"莭";s:3:"茣";s:4:"茣";s:3:"莽";s:4:"莽";s:3:"菧";s:4:"菧";s:3:"荓";s:4:"荓";s:3:"菊";s:4:"菊";s:3:"菌";s:4:"菌";s:3:"菜";s:4:"菜";s:4:"𦰶";s:4:"𦰶";s:4:"𦵫";s:4:"𦵫";s:4:"𦳕";s:4:"𦳕";s:3:"䔫";s:4:"䔫";s:3:"蓱";s:4:"蓱";s:3:"蓳";s:4:"蓳";s:3:"蔖";s:4:"蔖";s:4:"𧏊";s:4:"𧏊";s:3:"蕤";s:4:"蕤";s:4:"𦼬";s:4:"𦼬";s:3:"䕝";s:4:"䕝";s:3:"䕡";s:4:"䕡";s:4:"𦾱";s:4:"𦾱";s:4:"𧃒";s:4:"𧃒";s:3:"䕫";s:4:"䕫";s:3:"虐";s:4:"虐";s:3:"虧";s:4:"虧";s:3:"虩";s:4:"虩";s:3:"蚩";s:4:"蚩";s:3:"蚈";s:4:"蚈";s:3:"蜎";s:4:"蜎";s:3:"蛢";s:4:"蛢";s:3:"蜨";s:4:"蜨";s:3:"蝫";s:4:"蝫";s:3:"螆";s:4:"螆";s:3:"䗗";s:4:"䗗";s:3:"蟡";s:4:"蟡";s:3:"蠁";s:4:"蠁";s:3:"䗹";s:4:"䗹";s:3:"衠";s:4:"衠";s:3:"衣";s:4:"衣";s:4:"𧙧";s:4:"𧙧";s:3:"裗";s:4:"裗";s:3:"裞";s:4:"裞";s:3:"䘵";s:4:"䘵";s:3:"裺";s:4:"裺";s:3:"㒻";s:4:"㒻";s:4:"𧢮";s:4:"𧢮";s:4:"𧥦";s:4:"𧥦";s:3:"䚾";s:4:"䚾";s:3:"䛇";s:4:"䛇";s:3:"誠";s:4:"誠";s:3:"豕";s:4:"豕";s:4:"𧲨";s:4:"𧲨";s:3:"貫";s:4:"貫";s:3:"賁";s:4:"賁";s:3:"贛";s:4:"贛";s:3:"起";s:4:"起";s:4:"𧼯";s:4:"𧼯";s:4:"𠠄";s:4:"𠠄";s:3:"跋";s:4:"跋";s:3:"趼";s:4:"趼";s:3:"跰";s:4:"跰";s:4:"𠣞";s:4:"𠣞";s:3:"軔";s:4:"軔";s:4:"𨗒";s:4:"𨗒";s:4:"𨗭";s:4:"𨗭";s:3:"邔";s:4:"邔";s:3:"郱";s:4:"郱";s:3:"鄑";s:4:"鄑";s:4:"𨜮";s:4:"𨜮";s:3:"鄛";s:4:"鄛";s:3:"鈸";s:4:"鈸";s:3:"鋗";s:4:"鋗";s:3:"鋘";s:4:"鋘";s:3:"鉼";s:4:"鉼";s:3:"鏹";s:4:"鏹";s:3:"鐕";s:4:"鐕";s:4:"𨯺";s:4:"𨯺";s:3:"開";s:4:"開";s:3:"䦕";s:4:"䦕";s:3:"閷";s:4:"閷";s:4:"𨵷";s:4:"𨵷";s:3:"䧦";s:4:"䧦";s:3:"雃";s:4:"雃";s:3:"嶲";s:4:"嶲";s:3:"霣";s:4:"霣";s:4:"𩅅";s:4:"𩅅";s:4:"𩈚";s:4:"𩈚";s:3:"䩮";s:4:"䩮";s:3:"䩶";s:4:"䩶";s:3:"韠";s:4:"韠";s:4:"𩐊";s:4:"𩐊";s:3:"䪲";s:4:"䪲";s:4:"𩒖";s:4:"𩒖";s:3:"頩";s:4:"頩";s:4:"𩖶";s:4:"𩖶";s:3:"飢";s:4:"飢";s:3:"䬳";s:4:"䬳";s:3:"餩";s:4:"餩";s:3:"馧";s:4:"馧";s:3:"駂";s:4:"駂";s:3:"駾";s:4:"駾";s:3:"䯎";s:4:"䯎";s:4:"𩬰";s:4:"𩬰";s:3:"鱀";s:4:"鱀";s:3:"鳽";s:4:"鳽";s:3:"䳎";s:4:"䳎";s:3:"䳭";s:4:"䳭";s:3:"鵧";s:4:"鵧";s:4:"𪃎";s:4:"𪃎";s:3:"䳸";s:4:"䳸";s:4:"𪄅";s:4:"𪄅";s:4:"𪈎";s:4:"𪈎";s:4:"𪊑";s:4:"𪊑";s:3:"麻";s:4:"麻";s:3:"䵖";s:4:"䵖";s:3:"黹";s:4:"黹";s:3:"黾";s:4:"黾";s:3:"鼅";s:4:"鼅";s:3:"鼏";s:4:"鼏";s:3:"鼖";s:4:"鼖";s:3:"鼻";s:4:"鼻";s:4:"𪘀";s:4:"𪘀";}' );
 UtfNormal::$utfCanonicalDecomp = unserialize( 'a:2049:{s:2:"À";s:3:"À";s:2:"Á";s:3:"Á";s:2:"Â";s:3:"Â";s:2:"Ã";s:3:"Ã";s:2:"Ä";s:3:"Ä";s:2:"Å";s:3:"Å";s:2:"Ç";s:3:"Ç";s:2:"È";s:3:"È";s:2:"É";s:3:"É";s:2:"Ê";s:3:"Ê";s:2:"Ë";s:3:"Ë";s:2:"Ì";s:3:"Ì";s:2:"Í";s:3:"Í";s:2:"Î";s:3:"Î";s:2:"Ï";s:3:"Ï";s:2:"Ñ";s:3:"Ñ";s:2:"Ò";s:3:"Ò";s:2:"Ó";s:3:"Ó";s:2:"Ô";s:3:"Ô";s:2:"Õ";s:3:"Õ";s:2:"Ö";s:3:"Ö";s:2:"Ù";s:3:"Ù";s:2:"Ú";s:3:"Ú";s:2:"Û";s:3:"Û";s:2:"Ü";s:3:"Ü";s:2:"Ý";s:3:"Ý";s:2:"à";s:3:"à";s:2:"á";s:3:"á";s:2:"â";s:3:"â";s:2:"ã";s:3:"ã";s:2:"ä";s:3:"ä";s:2:"å";s:3:"å";s:2:"ç";s:3:"ç";s:2:"è";s:3:"è";s:2:"é";s:3:"é";s:2:"ê";s:3:"ê";s:2:"ë";s:3:"ë";s:2:"ì";s:3:"ì";s:2:"í";s:3:"í";s:2:"î";s:3:"î";s:2:"ï";s:3:"ï";s:2:"ñ";s:3:"ñ";s:2:"ò";s:3:"ò";s:2:"ó";s:3:"ó";s:2:"ô";s:3:"ô";s:2:"õ";s:3:"õ";s:2:"ö";s:3:"ö";s:2:"ù";s:3:"ù";s:2:"ú";s:3:"ú";s:2:"û";s:3:"û";s:2:"ü";s:3:"ü";s:2:"ý";s:3:"ý";s:2:"ÿ";s:3:"ÿ";s:2:"Ā";s:3:"Ā";s:2:"ā";s:3:"ā";s:2:"Ă";s:3:"Ă";s:2:"ă";s:3:"ă";s:2:"Ą";s:3:"Ą";s:2:"ą";s:3:"ą";s:2:"Ć";s:3:"Ć";s:2:"ć";s:3:"ć";s:2:"Ĉ";s:3:"Ĉ";s:2:"ĉ";s:3:"ĉ";s:2:"Ċ";s:3:"Ċ";s:2:"ċ";s:3:"ċ";s:2:"Č";s:3:"Č";s:2:"č";s:3:"č";s:2:"Ď";s:3:"Ď";s:2:"ď";s:3:"ď";s:2:"Ē";s:3:"Ē";s:2:"ē";s:3:"ē";s:2:"Ĕ";s:3:"Ĕ";s:2:"ĕ";s:3:"ĕ";s:2:"Ė";s:3:"Ė";s:2:"ė";s:3:"ė";s:2:"Ę";s:3:"Ę";s:2:"ę";s:3:"ę";s:2:"Ě";s:3:"Ě";s:2:"ě";s:3:"ě";s:2:"Ĝ";s:3:"Ĝ";s:2:"ĝ";s:3:"ĝ";s:2:"Ğ";s:3:"Ğ";s:2:"ğ";s:3:"ğ";s:2:"Ġ";s:3:"Ġ";s:2:"ġ";s:3:"ġ";s:2:"Ģ";s:3:"Ģ";s:2:"ģ";s:3:"ģ";s:2:"Ĥ";s:3:"Ĥ";s:2:"ĥ";s:3:"ĥ";s:2:"Ĩ";s:3:"Ĩ";s:2:"ĩ";s:3:"ĩ";s:2:"Ī";s:3:"Ī";s:2:"ī";s:3:"ī";s:2:"Ĭ";s:3:"Ĭ";s:2:"ĭ";s:3:"ĭ";s:2:"Į";s:3:"Į";s:2:"į";s:3:"į";s:2:"İ";s:3:"İ";s:2:"Ĵ";s:3:"Ĵ";s:2:"ĵ";s:3:"ĵ";s:2:"Ķ";s:3:"Ķ";s:2:"ķ";s:3:"ķ";s:2:"Ĺ";s:3:"Ĺ";s:2:"ĺ";s:3:"ĺ";s:2:"Ļ";s:3:"Ļ";s:2:"ļ";s:3:"ļ";s:2:"Ľ";s:3:"Ľ";s:2:"ľ";s:3:"ľ";s:2:"Ń";s:3:"Ń";s:2:"ń";s:3:"ń";s:2:"Ņ";s:3:"Ņ";s:2:"ņ";s:3:"ņ";s:2:"Ň";s:3:"Ň";s:2:"ň";s:3:"ň";s:2:"Ō";s:3:"Ō";s:2:"ō";s:3:"ō";s:2:"Ŏ";s:3:"Ŏ";s:2:"ŏ";s:3:"ŏ";s:2:"Ő";s:3:"Ő";s:2:"ő";s:3:"ő";s:2:"Ŕ";s:3:"Ŕ";s:2:"ŕ";s:3:"ŕ";s:2:"Ŗ";s:3:"Ŗ";s:2:"ŗ";s:3:"ŗ";s:2:"Ř";s:3:"Ř";s:2:"ř";s:3:"ř";s:2:"Ś";s:3:"Ś";s:2:"ś";s:3:"ś";s:2:"Ŝ";s:3:"Ŝ";s:2:"ŝ";s:3:"ŝ";s:2:"Ş";s:3:"Ş";s:2:"ş";s:3:"ş";s:2:"Š";s:3:"Š";s:2:"š";s:3:"š";s:2:"Ţ";s:3:"Ţ";s:2:"ţ";s:3:"ţ";s:2:"Ť";s:3:"Ť";s:2:"ť";s:3:"ť";s:2:"Ũ";s:3:"Ũ";s:2:"ũ";s:3:"ũ";s:2:"Ū";s:3:"Ū";s:2:"ū";s:3:"ū";s:2:"Ŭ";s:3:"Ŭ";s:2:"ŭ";s:3:"ŭ";s:2:"Ů";s:3:"Ů";s:2:"ů";s:3:"ů";s:2:"Ű";s:3:"Ű";s:2:"ű";s:3:"ű";s:2:"Ų";s:3:"Ų";s:2:"ų";s:3:"ų";s:2:"Ŵ";s:3:"Ŵ";s:2:"ŵ";s:3:"ŵ";s:2:"Ŷ";s:3:"Ŷ";s:2:"ŷ";s:3:"ŷ";s:2:"Ÿ";s:3:"Ÿ";s:2:"Ź";s:3:"Ź";s:2:"ź";s:3:"ź";s:2:"Ż";s:3:"Ż";s:2:"ż";s:3:"ż";s:2:"Ž";s:3:"Ž";s:2:"ž";s:3:"ž";s:2:"Ơ";s:3:"Ơ";s:2:"ơ";s:3:"ơ";s:2:"Ư";s:3:"Ư";s:2:"ư";s:3:"ư";s:2:"Ǎ";s:3:"Ǎ";s:2:"ǎ";s:3:"ǎ";s:2:"Ǐ";s:3:"Ǐ";s:2:"ǐ";s:3:"ǐ";s:2:"Ǒ";s:3:"Ǒ";s:2:"ǒ";s:3:"ǒ";s:2:"Ǔ";s:3:"Ǔ";s:2:"ǔ";s:3:"ǔ";s:2:"Ǖ";s:5:"Ǖ";s:2:"ǖ";s:5:"ǖ";s:2:"Ǘ";s:5:"Ǘ";s:2:"ǘ";s:5:"ǘ";s:2:"Ǚ";s:5:"Ǚ";s:2:"ǚ";s:5:"ǚ";s:2:"Ǜ";s:5:"Ǜ";s:2:"ǜ";s:5:"ǜ";s:2:"Ǟ";s:5:"Ǟ";s:2:"ǟ";s:5:"ǟ";s:2:"Ǡ";s:5:"Ǡ";s:2:"ǡ";s:5:"ǡ";s:2:"Ǣ";s:4:"Ǣ";s:2:"ǣ";s:4:"ǣ";s:2:"Ǧ";s:3:"Ǧ";s:2:"ǧ";s:3:"ǧ";s:2:"Ǩ";s:3:"Ǩ";s:2:"ǩ";s:3:"ǩ";s:2:"Ǫ";s:3:"Ǫ";s:2:"ǫ";s:3:"ǫ";s:2:"Ǭ";s:5:"Ǭ";s:2:"ǭ";s:5:"ǭ";s:2:"Ǯ";s:4:"Ǯ";s:2:"ǯ";s:4:"ǯ";s:2:"ǰ";s:3:"ǰ";s:2:"Ǵ";s:3:"Ǵ";s:2:"ǵ";s:3:"ǵ";s:2:"Ǹ";s:3:"Ǹ";s:2:"ǹ";s:3:"ǹ";s:2:"Ǻ";s:5:"Ǻ";s:2:"ǻ";s:5:"ǻ";s:2:"Ǽ";s:4:"Ǽ";s:2:"ǽ";s:4:"ǽ";s:2:"Ǿ";s:4:"Ǿ";s:2:"ǿ";s:4:"ǿ";s:2:"Ȁ";s:3:"Ȁ";s:2:"ȁ";s:3:"ȁ";s:2:"Ȃ";s:3:"Ȃ";s:2:"ȃ";s:3:"ȃ";s:2:"Ȅ";s:3:"Ȅ";s:2:"ȅ";s:3:"ȅ";s:2:"Ȇ";s:3:"Ȇ";s:2:"ȇ";s:3:"ȇ";s:2:"Ȉ";s:3:"Ȉ";s:2:"ȉ";s:3:"ȉ";s:2:"Ȋ";s:3:"Ȋ";s:2:"ȋ";s:3:"ȋ";s:2:"Ȍ";s:3:"Ȍ";s:2:"ȍ";s:3:"ȍ";s:2:"Ȏ";s:3:"Ȏ";s:2:"ȏ";s:3:"ȏ";s:2:"Ȑ";s:3:"Ȑ";s:2:"ȑ";s:3:"ȑ";s:2:"Ȓ";s:3:"Ȓ";s:2:"ȓ";s:3:"ȓ";s:2:"Ȕ";s:3:"Ȕ";s:2:"ȕ";s:3:"ȕ";s:2:"Ȗ";s:3:"Ȗ";s:2:"ȗ";s:3:"ȗ";s:2:"Ș";s:3:"Ș";s:2:"ș";s:3:"ș";s:2:"Ț";s:3:"Ț";s:2:"ț";s:3:"ț";s:2:"Ȟ";s:3:"Ȟ";s:2:"ȟ";s:3:"ȟ";s:2:"Ȧ";s:3:"Ȧ";s:2:"ȧ";s:3:"ȧ";s:2:"Ȩ";s:3:"Ȩ";s:2:"ȩ";s:3:"ȩ";s:2:"Ȫ";s:5:"Ȫ";s:2:"ȫ";s:5:"ȫ";s:2:"Ȭ";s:5:"Ȭ";s:2:"ȭ";s:5:"ȭ";s:2:"Ȯ";s:3:"Ȯ";s:2:"ȯ";s:3:"ȯ";s:2:"Ȱ";s:5:"Ȱ";s:2:"ȱ";s:5:"ȱ";s:2:"Ȳ";s:3:"Ȳ";s:2:"ȳ";s:3:"ȳ";s:2:"̀";s:2:"̀";s:2:"́";s:2:"́";s:2:"̓";s:2:"̓";s:2:"̈́";s:4:"̈́";s:2:"ʹ";s:2:"ʹ";s:2:";";s:1:";";s:2:"΅";s:4:"΅";s:2:"Ά";s:4:"Ά";s:2:"·";s:2:"·";s:2:"Έ";s:4:"Έ";s:2:"Ή";s:4:"Ή";s:2:"Ί";s:4:"Ί";s:2:"Ό";s:4:"Ό";s:2:"Ύ";s:4:"Ύ";s:2:"Ώ";s:4:"Ώ";s:2:"ΐ";s:6:"ΐ";s:2:"Ϊ";s:4:"Ϊ";s:2:"Ϋ";s:4:"Ϋ";s:2:"ά";s:4:"ά";s:2:"έ";s:4:"έ";s:2:"ή";s:4:"ή";s:2:"ί";s:4:"ί";s:2:"ΰ";s:6:"ΰ";s:2:"ϊ";s:4:"ϊ";s:2:"ϋ";s:4:"ϋ";s:2:"ό";s:4:"ό";s:2:"ύ";s:4:"ύ";s:2:"ώ";s:4:"ώ";s:2:"ϓ";s:4:"ϓ";s:2:"ϔ";s:4:"ϔ";s:2:"Ѐ";s:4:"Ѐ";s:2:"Ё";s:4:"Ё";s:2:"Ѓ";s:4:"Ѓ";s:2:"Ї";s:4:"Ї";s:2:"Ќ";s:4:"Ќ";s:2:"Ѝ";s:4:"Ѝ";s:2:"Ў";s:4:"Ў";s:2:"Й";s:4:"Й";s:2:"й";s:4:"й";s:2:"ѐ";s:4:"ѐ";s:2:"ё";s:4:"ё";s:2:"ѓ";s:4:"ѓ";s:2:"ї";s:4:"ї";s:2:"ќ";s:4:"ќ";s:2:"ѝ";s:4:"ѝ";s:2:"ў";s:4:"ў";s:2:"Ѷ";s:4:"Ѷ";s:2:"ѷ";s:4:"ѷ";s:2:"Ӂ";s:4:"Ӂ";s:2:"ӂ";s:4:"ӂ";s:2:"Ӑ";s:4:"Ӑ";s:2:"ӑ";s:4:"ӑ";s:2:"Ӓ";s:4:"Ӓ";s:2:"ӓ";s:4:"ӓ";s:2:"Ӗ";s:4:"Ӗ";s:2:"ӗ";s:4:"ӗ";s:2:"Ӛ";s:4:"Ӛ";s:2:"ӛ";s:4:"ӛ";s:2:"Ӝ";s:4:"Ӝ";s:2:"ӝ";s:4:"ӝ";s:2:"Ӟ";s:4:"Ӟ";s:2:"ӟ";s:4:"ӟ";s:2:"Ӣ";s:4:"Ӣ";s:2:"ӣ";s:4:"ӣ";s:2:"Ӥ";s:4:"Ӥ";s:2:"ӥ";s:4:"ӥ";s:2:"Ӧ";s:4:"Ӧ";s:2:"ӧ";s:4:"ӧ";s:2:"Ӫ";s:4:"Ӫ";s:2:"ӫ";s:4:"ӫ";s:2:"Ӭ";s:4:"Ӭ";s:2:"ӭ";s:4:"ӭ";s:2:"Ӯ";s:4:"Ӯ";s:2:"ӯ";s:4:"ӯ";s:2:"Ӱ";s:4:"Ӱ";s:2:"ӱ";s:4:"ӱ";s:2:"Ӳ";s:4:"Ӳ";s:2:"ӳ";s:4:"ӳ";s:2:"Ӵ";s:4:"Ӵ";s:2:"ӵ";s:4:"ӵ";s:2:"Ӹ";s:4:"Ӹ";s:2:"ӹ";s:4:"ӹ";s:2:"آ";s:4:"آ";s:2:"أ";s:4:"أ";s:2:"ؤ";s:4:"ؤ";s:2:"إ";s:4:"إ";s:2:"ئ";s:4:"ئ";s:2:"ۀ";s:4:"ۀ";s:2:"ۂ";s:4:"ۂ";s:2:"ۓ";s:4:"ۓ";s:3:"ऩ";s:6:"ऩ";s:3:"ऱ";s:6:"ऱ";s:3:"ऴ";s:6:"ऴ";s:3:"क़";s:6:"क़";s:3:"ख़";s:6:"ख़";s:3:"ग़";s:6:"ग़";s:3:"ज़";s:6:"ज़";s:3:"ड़";s:6:"ड़";s:3:"ढ़";s:6:"ढ़";s:3:"फ़";s:6:"फ़";s:3:"य़";s:6:"य़";s:3:"ো";s:6:"ো";s:3:"ৌ";s:6:"ৌ";s:3:"ড়";s:6:"ড়";s:3:"ঢ়";s:6:"ঢ়";s:3:"য়";s:6:"য়";s:3:"ਲ਼";s:6:"ਲ਼";s:3:"ਸ਼";s:6:"ਸ਼";s:3:"ਖ਼";s:6:"ਖ਼";s:3:"ਗ਼";s:6:"ਗ਼";s:3:"ਜ਼";s:6:"ਜ਼";s:3:"ਫ਼";s:6:"ਫ਼";s:3:"ୈ";s:6:"ୈ";s:3:"ୋ";s:6:"ୋ";s:3:"ୌ";s:6:"ୌ";s:3:"ଡ଼";s:6:"ଡ଼";s:3:"ଢ଼";s:6:"ଢ଼";s:3:"ஔ";s:6:"ஔ";s:3:"ொ";s:6:"ொ";s:3:"ோ";s:6:"ோ";s:3:"ௌ";s:6:"ௌ";s:3:"ై";s:6:"ై";s:3:"ೀ";s:6:"ೀ";s:3:"ೇ";s:6:"ೇ";s:3:"ೈ";s:6:"ೈ";s:3:"ೊ";s:6:"ೊ";s:3:"ೋ";s:9:"ೋ";s:3:"ൊ";s:6:"ൊ";s:3:"ോ";s:6:"ോ";s:3:"ൌ";s:6:"ൌ";s:3:"ේ";s:6:"ේ";s:3:"ො";s:6:"ො";s:3:"ෝ";s:9:"ෝ";s:3:"ෞ";s:6:"ෞ";s:3:"གྷ";s:6:"གྷ";s:3:"ཌྷ";s:6:"ཌྷ";s:3:"དྷ";s:6:"དྷ";s:3:"བྷ";s:6:"བྷ";s:3:"ཛྷ";s:6:"ཛྷ";s:3:"ཀྵ";s:6:"ཀྵ";s:3:"ཱི";s:6:"ཱི";s:3:"ཱུ";s:6:"ཱུ";s:3:"ྲྀ";s:6:"ྲྀ";s:3:"ླྀ";s:6:"ླྀ";s:3:"ཱྀ";s:6:"ཱྀ";s:3:"ྒྷ";s:6:"ྒྷ";s:3:"ྜྷ";s:6:"ྜྷ";s:3:"ྡྷ";s:6:"ྡྷ";s:3:"ྦྷ";s:6:"ྦྷ";s:3:"ྫྷ";s:6:"ྫྷ";s:3:"ྐྵ";s:6:"ྐྵ";s:3:"ဦ";s:6:"ဦ";s:3:"ᬆ";s:6:"ᬆ";s:3:"ᬈ";s:6:"ᬈ";s:3:"ᬊ";s:6:"ᬊ";s:3:"ᬌ";s:6:"ᬌ";s:3:"ᬎ";s:6:"ᬎ";s:3:"ᬒ";s:6:"ᬒ";s:3:"ᬻ";s:6:"ᬻ";s:3:"ᬽ";s:6:"ᬽ";s:3:"ᭀ";s:6:"ᭀ";s:3:"ᭁ";s:6:"ᭁ";s:3:"ᭃ";s:6:"ᭃ";s:3:"Ḁ";s:3:"Ḁ";s:3:"ḁ";s:3:"ḁ";s:3:"Ḃ";s:3:"Ḃ";s:3:"ḃ";s:3:"ḃ";s:3:"Ḅ";s:3:"Ḅ";s:3:"ḅ";s:3:"ḅ";s:3:"Ḇ";s:3:"Ḇ";s:3:"ḇ";s:3:"ḇ";s:3:"Ḉ";s:5:"Ḉ";s:3:"ḉ";s:5:"ḉ";s:3:"Ḋ";s:3:"Ḋ";s:3:"ḋ";s:3:"ḋ";s:3:"Ḍ";s:3:"Ḍ";s:3:"ḍ";s:3:"ḍ";s:3:"Ḏ";s:3:"Ḏ";s:3:"ḏ";s:3:"ḏ";s:3:"Ḑ";s:3:"Ḑ";s:3:"ḑ";s:3:"ḑ";s:3:"Ḓ";s:3:"Ḓ";s:3:"ḓ";s:3:"ḓ";s:3:"Ḕ";s:5:"Ḕ";s:3:"ḕ";s:5:"ḕ";s:3:"Ḗ";s:5:"Ḗ";s:3:"ḗ";s:5:"ḗ";s:3:"Ḙ";s:3:"Ḙ";s:3:"ḙ";s:3:"ḙ";s:3:"Ḛ";s:3:"Ḛ";s:3:"ḛ";s:3:"ḛ";s:3:"Ḝ";s:5:"Ḝ";s:3:"ḝ";s:5:"ḝ";s:3:"Ḟ";s:3:"Ḟ";s:3:"ḟ";s:3:"ḟ";s:3:"Ḡ";s:3:"Ḡ";s:3:"ḡ";s:3:"ḡ";s:3:"Ḣ";s:3:"Ḣ";s:3:"ḣ";s:3:"ḣ";s:3:"Ḥ";s:3:"Ḥ";s:3:"ḥ";s:3:"ḥ";s:3:"Ḧ";s:3:"Ḧ";s:3:"ḧ";s:3:"ḧ";s:3:"Ḩ";s:3:"Ḩ";s:3:"ḩ";s:3:"ḩ";s:3:"Ḫ";s:3:"Ḫ";s:3:"ḫ";s:3:"ḫ";s:3:"Ḭ";s:3:"Ḭ";s:3:"ḭ";s:3:"ḭ";s:3:"Ḯ";s:5:"Ḯ";s:3:"ḯ";s:5:"ḯ";s:3:"Ḱ";s:3:"Ḱ";s:3:"ḱ";s:3:"ḱ";s:3:"Ḳ";s:3:"Ḳ";s:3:"ḳ";s:3:"ḳ";s:3:"Ḵ";s:3:"Ḵ";s:3:"ḵ";s:3:"ḵ";s:3:"Ḷ";s:3:"Ḷ";s:3:"ḷ";s:3:"ḷ";s:3:"Ḹ";s:5:"Ḹ";s:3:"ḹ";s:5:"ḹ";s:3:"Ḻ";s:3:"Ḻ";s:3:"ḻ";s:3:"ḻ";s:3:"Ḽ";s:3:"Ḽ";s:3:"ḽ";s:3:"ḽ";s:3:"Ḿ";s:3:"Ḿ";s:3:"ḿ";s:3:"ḿ";s:3:"Ṁ";s:3:"Ṁ";s:3:"ṁ";s:3:"ṁ";s:3:"Ṃ";s:3:"Ṃ";s:3:"ṃ";s:3:"ṃ";s:3:"Ṅ";s:3:"Ṅ";s:3:"ṅ";s:3:"ṅ";s:3:"Ṇ";s:3:"Ṇ";s:3:"ṇ";s:3:"ṇ";s:3:"Ṉ";s:3:"Ṉ";s:3:"ṉ";s:3:"ṉ";s:3:"Ṋ";s:3:"Ṋ";s:3:"ṋ";s:3:"ṋ";s:3:"Ṍ";s:5:"Ṍ";s:3:"ṍ";s:5:"ṍ";s:3:"Ṏ";s:5:"Ṏ";s:3:"ṏ";s:5:"ṏ";s:3:"Ṑ";s:5:"Ṑ";s:3:"ṑ";s:5:"ṑ";s:3:"Ṓ";s:5:"Ṓ";s:3:"ṓ";s:5:"ṓ";s:3:"Ṕ";s:3:"Ṕ";s:3:"ṕ";s:3:"ṕ";s:3:"Ṗ";s:3:"Ṗ";s:3:"ṗ";s:3:"ṗ";s:3:"Ṙ";s:3:"Ṙ";s:3:"ṙ";s:3:"ṙ";s:3:"Ṛ";s:3:"Ṛ";s:3:"ṛ";s:3:"ṛ";s:3:"Ṝ";s:5:"Ṝ";s:3:"ṝ";s:5:"ṝ";s:3:"Ṟ";s:3:"Ṟ";s:3:"ṟ";s:3:"ṟ";s:3:"Ṡ";s:3:"Ṡ";s:3:"ṡ";s:3:"ṡ";s:3:"Ṣ";s:3:"Ṣ";s:3:"ṣ";s:3:"ṣ";s:3:"Ṥ";s:5:"Ṥ";s:3:"ṥ";s:5:"ṥ";s:3:"Ṧ";s:5:"Ṧ";s:3:"ṧ";s:5:"ṧ";s:3:"Ṩ";s:5:"Ṩ";s:3:"ṩ";s:5:"ṩ";s:3:"Ṫ";s:3:"Ṫ";s:3:"ṫ";s:3:"ṫ";s:3:"Ṭ";s:3:"Ṭ";s:3:"ṭ";s:3:"ṭ";s:3:"Ṯ";s:3:"Ṯ";s:3:"ṯ";s:3:"ṯ";s:3:"Ṱ";s:3:"Ṱ";s:3:"ṱ";s:3:"ṱ";s:3:"Ṳ";s:3:"Ṳ";s:3:"ṳ";s:3:"ṳ";s:3:"Ṵ";s:3:"Ṵ";s:3:"ṵ";s:3:"ṵ";s:3:"Ṷ";s:3:"Ṷ";s:3:"ṷ";s:3:"ṷ";s:3:"Ṹ";s:5:"Ṹ";s:3:"ṹ";s:5:"ṹ";s:3:"Ṻ";s:5:"Ṻ";s:3:"ṻ";s:5:"ṻ";s:3:"Ṽ";s:3:"Ṽ";s:3:"ṽ";s:3:"ṽ";s:3:"Ṿ";s:3:"Ṿ";s:3:"ṿ";s:3:"ṿ";s:3:"Ẁ";s:3:"Ẁ";s:3:"ẁ";s:3:"ẁ";s:3:"Ẃ";s:3:"Ẃ";s:3:"ẃ";s:3:"ẃ";s:3:"Ẅ";s:3:"Ẅ";s:3:"ẅ";s:3:"ẅ";s:3:"Ẇ";s:3:"Ẇ";s:3:"ẇ";s:3:"ẇ";s:3:"Ẉ";s:3:"Ẉ";s:3:"ẉ";s:3:"ẉ";s:3:"Ẋ";s:3:"Ẋ";s:3:"ẋ";s:3:"ẋ";s:3:"Ẍ";s:3:"Ẍ";s:3:"ẍ";s:3:"ẍ";s:3:"Ẏ";s:3:"Ẏ";s:3:"ẏ";s:3:"ẏ";s:3:"Ẑ";s:3:"Ẑ";s:3:"ẑ";s:3:"ẑ";s:3:"Ẓ";s:3:"Ẓ";s:3:"ẓ";s:3:"ẓ";s:3:"Ẕ";s:3:"Ẕ";s:3:"ẕ";s:3:"ẕ";s:3:"ẖ";s:3:"ẖ";s:3:"ẗ";s:3:"ẗ";s:3:"ẘ";s:3:"ẘ";s:3:"ẙ";s:3:"ẙ";s:3:"ẛ";s:4:"ẛ";s:3:"Ạ";s:3:"Ạ";s:3:"ạ";s:3:"ạ";s:3:"Ả";s:3:"Ả";s:3:"ả";s:3:"ả";s:3:"Ấ";s:5:"Ấ";s:3:"ấ";s:5:"ấ";s:3:"Ầ";s:5:"Ầ";s:3:"ầ";s:5:"ầ";s:3:"Ẩ";s:5:"Ẩ";s:3:"ẩ";s:5:"ẩ";s:3:"Ẫ";s:5:"Ẫ";s:3:"ẫ";s:5:"ẫ";s:3:"Ậ";s:5:"Ậ";s:3:"ậ";s:5:"ậ";s:3:"Ắ";s:5:"Ắ";s:3:"ắ";s:5:"ắ";s:3:"Ằ";s:5:"Ằ";s:3:"ằ";s:5:"ằ";s:3:"Ẳ";s:5:"Ẳ";s:3:"ẳ";s:5:"ẳ";s:3:"Ẵ";s:5:"Ẵ";s:3:"ẵ";s:5:"ẵ";s:3:"Ặ";s:5:"Ặ";s:3:"ặ";s:5:"ặ";s:3:"Ẹ";s:3:"Ẹ";s:3:"ẹ";s:3:"ẹ";s:3:"Ẻ";s:3:"Ẻ";s:3:"ẻ";s:3:"ẻ";s:3:"Ẽ";s:3:"Ẽ";s:3:"ẽ";s:3:"ẽ";s:3:"Ế";s:5:"Ế";s:3:"ế";s:5:"ế";s:3:"Ề";s:5:"Ề";s:3:"ề";s:5:"ề";s:3:"Ể";s:5:"Ể";s:3:"ể";s:5:"ể";s:3:"Ễ";s:5:"Ễ";s:3:"ễ";s:5:"ễ";s:3:"Ệ";s:5:"Ệ";s:3:"ệ";s:5:"ệ";s:3:"Ỉ";s:3:"Ỉ";s:3:"ỉ";s:3:"ỉ";s:3:"Ị";s:3:"Ị";s:3:"ị";s:3:"ị";s:3:"Ọ";s:3:"Ọ";s:3:"ọ";s:3:"ọ";s:3:"Ỏ";s:3:"Ỏ";s:3:"ỏ";s:3:"ỏ";s:3:"Ố";s:5:"Ố";s:3:"ố";s:5:"ố";s:3:"Ồ";s:5:"Ồ";s:3:"ồ";s:5:"ồ";s:3:"Ổ";s:5:"Ổ";s:3:"ổ";s:5:"ổ";s:3:"Ỗ";s:5:"Ỗ";s:3:"ỗ";s:5:"ỗ";s:3:"Ộ";s:5:"Ộ";s:3:"ộ";s:5:"ộ";s:3:"Ớ";s:5:"Ớ";s:3:"ớ";s:5:"ớ";s:3:"Ờ";s:5:"Ờ";s:3:"ờ";s:5:"ờ";s:3:"Ở";s:5:"Ở";s:3:"ở";s:5:"ở";s:3:"Ỡ";s:5:"Ỡ";s:3:"ỡ";s:5:"ỡ";s:3:"Ợ";s:5:"Ợ";s:3:"ợ";s:5:"ợ";s:3:"Ụ";s:3:"Ụ";s:3:"ụ";s:3:"ụ";s:3:"Ủ";s:3:"Ủ";s:3:"ủ";s:3:"ủ";s:3:"Ứ";s:5:"Ứ";s:3:"ứ";s:5:"ứ";s:3:"Ừ";s:5:"Ừ";s:3:"ừ";s:5:"ừ";s:3:"Ử";s:5:"Ử";s:3:"ử";s:5:"ử";s:3:"Ữ";s:5:"Ữ";s:3:"ữ";s:5:"ữ";s:3:"Ự";s:5:"Ự";s:3:"ự";s:5:"ự";s:3:"Ỳ";s:3:"Ỳ";s:3:"ỳ";s:3:"ỳ";s:3:"Ỵ";s:3:"Ỵ";s:3:"ỵ";s:3:"ỵ";s:3:"Ỷ";s:3:"Ỷ";s:3:"ỷ";s:3:"ỷ";s:3:"Ỹ";s:3:"Ỹ";s:3:"ỹ";s:3:"ỹ";s:3:"ἀ";s:4:"ἀ";s:3:"ἁ";s:4:"ἁ";s:3:"ἂ";s:6:"ἂ";s:3:"ἃ";s:6:"ἃ";s:3:"ἄ";s:6:"ἄ";s:3:"ἅ";s:6:"ἅ";s:3:"ἆ";s:6:"ἆ";s:3:"ἇ";s:6:"ἇ";s:3:"Ἀ";s:4:"Ἀ";s:3:"Ἁ";s:4:"Ἁ";s:3:"Ἂ";s:6:"Ἂ";s:3:"Ἃ";s:6:"Ἃ";s:3:"Ἄ";s:6:"Ἄ";s:3:"Ἅ";s:6:"Ἅ";s:3:"Ἆ";s:6:"Ἆ";s:3:"Ἇ";s:6:"Ἇ";s:3:"ἐ";s:4:"ἐ";s:3:"ἑ";s:4:"ἑ";s:3:"ἒ";s:6:"ἒ";s:3:"ἓ";s:6:"ἓ";s:3:"ἔ";s:6:"ἔ";s:3:"ἕ";s:6:"ἕ";s:3:"Ἐ";s:4:"Ἐ";s:3:"Ἑ";s:4:"Ἑ";s:3:"Ἒ";s:6:"Ἒ";s:3:"Ἓ";s:6:"Ἓ";s:3:"Ἔ";s:6:"Ἔ";s:3:"Ἕ";s:6:"Ἕ";s:3:"ἠ";s:4:"ἠ";s:3:"ἡ";s:4:"ἡ";s:3:"ἢ";s:6:"ἢ";s:3:"ἣ";s:6:"ἣ";s:3:"ἤ";s:6:"ἤ";s:3:"ἥ";s:6:"ἥ";s:3:"ἦ";s:6:"ἦ";s:3:"ἧ";s:6:"ἧ";s:3:"Ἠ";s:4:"Ἠ";s:3:"Ἡ";s:4:"Ἡ";s:3:"Ἢ";s:6:"Ἢ";s:3:"Ἣ";s:6:"Ἣ";s:3:"Ἤ";s:6:"Ἤ";s:3:"Ἥ";s:6:"Ἥ";s:3:"Ἦ";s:6:"Ἦ";s:3:"Ἧ";s:6:"Ἧ";s:3:"ἰ";s:4:"ἰ";s:3:"ἱ";s:4:"ἱ";s:3:"ἲ";s:6:"ἲ";s:3:"ἳ";s:6:"ἳ";s:3:"ἴ";s:6:"ἴ";s:3:"ἵ";s:6:"ἵ";s:3:"ἶ";s:6:"ἶ";s:3:"ἷ";s:6:"ἷ";s:3:"Ἰ";s:4:"Ἰ";s:3:"Ἱ";s:4:"Ἱ";s:3:"Ἲ";s:6:"Ἲ";s:3:"Ἳ";s:6:"Ἳ";s:3:"Ἴ";s:6:"Ἴ";s:3:"Ἵ";s:6:"Ἵ";s:3:"Ἶ";s:6:"Ἶ";s:3:"Ἷ";s:6:"Ἷ";s:3:"ὀ";s:4:"ὀ";s:3:"ὁ";s:4:"ὁ";s:3:"ὂ";s:6:"ὂ";s:3:"ὃ";s:6:"ὃ";s:3:"ὄ";s:6:"ὄ";s:3:"ὅ";s:6:"ὅ";s:3:"Ὀ";s:4:"Ὀ";s:3:"Ὁ";s:4:"Ὁ";s:3:"Ὂ";s:6:"Ὂ";s:3:"Ὃ";s:6:"Ὃ";s:3:"Ὄ";s:6:"Ὄ";s:3:"Ὅ";s:6:"Ὅ";s:3:"ὐ";s:4:"ὐ";s:3:"ὑ";s:4:"ὑ";s:3:"ὒ";s:6:"ὒ";s:3:"ὓ";s:6:"ὓ";s:3:"ὔ";s:6:"ὔ";s:3:"ὕ";s:6:"ὕ";s:3:"ὖ";s:6:"ὖ";s:3:"ὗ";s:6:"ὗ";s:3:"Ὑ";s:4:"Ὑ";s:3:"Ὓ";s:6:"Ὓ";s:3:"Ὕ";s:6:"Ὕ";s:3:"Ὗ";s:6:"Ὗ";s:3:"ὠ";s:4:"ὠ";s:3:"ὡ";s:4:"ὡ";s:3:"ὢ";s:6:"ὢ";s:3:"ὣ";s:6:"ὣ";s:3:"ὤ";s:6:"ὤ";s:3:"ὥ";s:6:"ὥ";s:3:"ὦ";s:6:"ὦ";s:3:"ὧ";s:6:"ὧ";s:3:"Ὠ";s:4:"Ὠ";s:3:"Ὡ";s:4:"Ὡ";s:3:"Ὢ";s:6:"Ὢ";s:3:"Ὣ";s:6:"Ὣ";s:3:"Ὤ";s:6:"Ὤ";s:3:"Ὥ";s:6:"Ὥ";s:3:"Ὦ";s:6:"Ὦ";s:3:"Ὧ";s:6:"Ὧ";s:3:"ὰ";s:4:"ὰ";s:3:"ά";s:4:"ά";s:3:"ὲ";s:4:"ὲ";s:3:"έ";s:4:"έ";s:3:"ὴ";s:4:"ὴ";s:3:"ή";s:4:"ή";s:3:"ὶ";s:4:"ὶ";s:3:"ί";s:4:"ί";s:3:"ὸ";s:4:"ὸ";s:3:"ό";s:4:"ό";s:3:"ὺ";s:4:"ὺ";s:3:"ύ";s:4:"ύ";s:3:"ὼ";s:4:"ὼ";s:3:"ώ";s:4:"ώ";s:3:"ᾀ";s:6:"ᾀ";s:3:"ᾁ";s:6:"ᾁ";s:3:"ᾂ";s:8:"ᾂ";s:3:"ᾃ";s:8:"ᾃ";s:3:"ᾄ";s:8:"ᾄ";s:3:"ᾅ";s:8:"ᾅ";s:3:"ᾆ";s:8:"ᾆ";s:3:"ᾇ";s:8:"ᾇ";s:3:"ᾈ";s:6:"ᾈ";s:3:"ᾉ";s:6:"ᾉ";s:3:"ᾊ";s:8:"ᾊ";s:3:"ᾋ";s:8:"ᾋ";s:3:"ᾌ";s:8:"ᾌ";s:3:"ᾍ";s:8:"ᾍ";s:3:"ᾎ";s:8:"ᾎ";s:3:"ᾏ";s:8:"ᾏ";s:3:"ᾐ";s:6:"ᾐ";s:3:"ᾑ";s:6:"ᾑ";s:3:"ᾒ";s:8:"ᾒ";s:3:"ᾓ";s:8:"ᾓ";s:3:"ᾔ";s:8:"ᾔ";s:3:"ᾕ";s:8:"ᾕ";s:3:"ᾖ";s:8:"ᾖ";s:3:"ᾗ";s:8:"ᾗ";s:3:"ᾘ";s:6:"ᾘ";s:3:"ᾙ";s:6:"ᾙ";s:3:"ᾚ";s:8:"ᾚ";s:3:"ᾛ";s:8:"ᾛ";s:3:"ᾜ";s:8:"ᾜ";s:3:"ᾝ";s:8:"ᾝ";s:3:"ᾞ";s:8:"ᾞ";s:3:"ᾟ";s:8:"ᾟ";s:3:"ᾠ";s:6:"ᾠ";s:3:"ᾡ";s:6:"ᾡ";s:3:"ᾢ";s:8:"ᾢ";s:3:"ᾣ";s:8:"ᾣ";s:3:"ᾤ";s:8:"ᾤ";s:3:"ᾥ";s:8:"ᾥ";s:3:"ᾦ";s:8:"ᾦ";s:3:"ᾧ";s:8:"ᾧ";s:3:"ᾨ";s:6:"ᾨ";s:3:"ᾩ";s:6:"ᾩ";s:3:"ᾪ";s:8:"ᾪ";s:3:"ᾫ";s:8:"ᾫ";s:3:"ᾬ";s:8:"ᾬ";s:3:"ᾭ";s:8:"ᾭ";s:3:"ᾮ";s:8:"ᾮ";s:3:"ᾯ";s:8:"ᾯ";s:3:"ᾰ";s:4:"ᾰ";s:3:"ᾱ";s:4:"ᾱ";s:3:"ᾲ";s:6:"ᾲ";s:3:"ᾳ";s:4:"ᾳ";s:3:"ᾴ";s:6:"ᾴ";s:3:"ᾶ";s:4:"ᾶ";s:3:"ᾷ";s:6:"ᾷ";s:3:"Ᾰ";s:4:"Ᾰ";s:3:"Ᾱ";s:4:"Ᾱ";s:3:"Ὰ";s:4:"Ὰ";s:3:"Ά";s:4:"Ά";s:3:"ᾼ";s:4:"ᾼ";s:3:"ι";s:2:"ι";s:3:"῁";s:4:"῁";s:3:"ῂ";s:6:"ῂ";s:3:"ῃ";s:4:"ῃ";s:3:"ῄ";s:6:"ῄ";s:3:"ῆ";s:4:"ῆ";s:3:"ῇ";s:6:"ῇ";s:3:"Ὲ";s:4:"Ὲ";s:3:"Έ";s:4:"Έ";s:3:"Ὴ";s:4:"Ὴ";s:3:"Ή";s:4:"Ή";s:3:"ῌ";s:4:"ῌ";s:3:"῍";s:5:"῍";s:3:"῎";s:5:"῎";s:3:"῏";s:5:"῏";s:3:"ῐ";s:4:"ῐ";s:3:"ῑ";s:4:"ῑ";s:3:"ῒ";s:6:"ῒ";s:3:"ΐ";s:6:"ΐ";s:3:"ῖ";s:4:"ῖ";s:3:"ῗ";s:6:"ῗ";s:3:"Ῐ";s:4:"Ῐ";s:3:"Ῑ";s:4:"Ῑ";s:3:"Ὶ";s:4:"Ὶ";s:3:"Ί";s:4:"Ί";s:3:"῝";s:5:"῝";s:3:"῞";s:5:"῞";s:3:"῟";s:5:"῟";s:3:"ῠ";s:4:"ῠ";s:3:"ῡ";s:4:"ῡ";s:3:"ῢ";s:6:"ῢ";s:3:"ΰ";s:6:"ΰ";s:3:"ῤ";s:4:"ῤ";s:3:"ῥ";s:4:"ῥ";s:3:"ῦ";s:4:"ῦ";s:3:"ῧ";s:6:"ῧ";s:3:"Ῠ";s:4:"Ῠ";s:3:"Ῡ";s:4:"Ῡ";s:3:"Ὺ";s:4:"Ὺ";s:3:"Ύ";s:4:"Ύ";s:3:"Ῥ";s:4:"Ῥ";s:3:"῭";s:4:"῭";s:3:"΅";s:4:"΅";s:3:"`";s:1:"`";s:3:"ῲ";s:6:"ῲ";s:3:"ῳ";s:4:"ῳ";s:3:"ῴ";s:6:"ῴ";s:3:"ῶ";s:4:"ῶ";s:3:"ῷ";s:6:"ῷ";s:3:"Ὸ";s:4:"Ὸ";s:3:"Ό";s:4:"Ό";s:3:"Ὼ";s:4:"Ὼ";s:3:"Ώ";s:4:"Ώ";s:3:"ῼ";s:4:"ῼ";s:3:"´";s:2:"´";s:3:" ";s:3:" ";s:3:" ";s:3:" ";s:3:"Ω";s:2:"Ω";s:3:"K";s:1:"K";s:3:"Å";s:3:"Å";s:3:"↚";s:5:"↚";s:3:"↛";s:5:"↛";s:3:"↮";s:5:"↮";s:3:"⇍";s:5:"⇍";s:3:"⇎";s:5:"⇎";s:3:"⇏";s:5:"⇏";s:3:"∄";s:5:"∄";s:3:"∉";s:5:"∉";s:3:"∌";s:5:"∌";s:3:"∤";s:5:"∤";s:3:"∦";s:5:"∦";s:3:"≁";s:5:"≁";s:3:"≄";s:5:"≄";s:3:"≇";s:5:"≇";s:3:"≉";s:5:"≉";s:3:"≠";s:3:"≠";s:3:"≢";s:5:"≢";s:3:"≭";s:5:"≭";s:3:"≮";s:3:"≮";s:3:"≯";s:3:"≯";s:3:"≰";s:5:"≰";s:3:"≱";s:5:"≱";s:3:"≴";s:5:"≴";s:3:"≵";s:5:"≵";s:3:"≸";s:5:"≸";s:3:"≹";s:5:"≹";s:3:"⊀";s:5:"⊀";s:3:"⊁";s:5:"⊁";s:3:"⊄";s:5:"⊄";s:3:"⊅";s:5:"⊅";s:3:"⊈";s:5:"⊈";s:3:"⊉";s:5:"⊉";s:3:"⊬";s:5:"⊬";s:3:"⊭";s:5:"⊭";s:3:"⊮";s:5:"⊮";s:3:"⊯";s:5:"⊯";s:3:"⋠";s:5:"⋠";s:3:"⋡";s:5:"⋡";s:3:"⋢";s:5:"⋢";s:3:"⋣";s:5:"⋣";s:3:"⋪";s:5:"⋪";s:3:"⋫";s:5:"⋫";s:3:"⋬";s:5:"⋬";s:3:"⋭";s:5:"⋭";s:3:"〈";s:3:"〈";s:3:"〉";s:3:"〉";s:3:"⫝̸";s:5:"⫝̸";s:3:"が";s:6:"が";s:3:"ぎ";s:6:"ぎ";s:3:"ぐ";s:6:"ぐ";s:3:"げ";s:6:"げ";s:3:"ご";s:6:"ご";s:3:"ざ";s:6:"ざ";s:3:"じ";s:6:"じ";s:3:"ず";s:6:"ず";s:3:"ぜ";s:6:"ぜ";s:3:"ぞ";s:6:"ぞ";s:3:"だ";s:6:"だ";s:3:"ぢ";s:6:"ぢ";s:3:"づ";s:6:"づ";s:3:"で";s:6:"で";s:3:"ど";s:6:"ど";s:3:"ば";s:6:"ば";s:3:"ぱ";s:6:"ぱ";s:3:"び";s:6:"び";s:3:"ぴ";s:6:"ぴ";s:3:"ぶ";s:6:"ぶ";s:3:"ぷ";s:6:"ぷ";s:3:"べ";s:6:"べ";s:3:"ぺ";s:6:"ぺ";s:3:"ぼ";s:6:"ぼ";s:3:"ぽ";s:6:"ぽ";s:3:"ゔ";s:6:"ゔ";s:3:"ゞ";s:6:"ゞ";s:3:"ガ";s:6:"ガ";s:3:"ギ";s:6:"ギ";s:3:"グ";s:6:"グ";s:3:"ゲ";s:6:"ゲ";s:3:"ゴ";s:6:"ゴ";s:3:"ザ";s:6:"ザ";s:3:"ジ";s:6:"ジ";s:3:"ズ";s:6:"ズ";s:3:"ゼ";s:6:"ゼ";s:3:"ゾ";s:6:"ゾ";s:3:"ダ";s:6:"ダ";s:3:"ヂ";s:6:"ヂ";s:3:"ヅ";s:6:"ヅ";s:3:"デ";s:6:"デ";s:3:"ド";s:6:"ド";s:3:"バ";s:6:"バ";s:3:"パ";s:6:"パ";s:3:"ビ";s:6:"ビ";s:3:"ピ";s:6:"ピ";s:3:"ブ";s:6:"ブ";s:3:"プ";s:6:"プ";s:3:"ベ";s:6:"ベ";s:3:"ペ";s:6:"ペ";s:3:"ボ";s:6:"ボ";s:3:"ポ";s:6:"ポ";s:3:"ヴ";s:6:"ヴ";s:3:"ヷ";s:6:"ヷ";s:3:"ヸ";s:6:"ヸ";s:3:"ヹ";s:6:"ヹ";s:3:"ヺ";s:6:"ヺ";s:3:"ヾ";s:6:"ヾ";s:3:"豈";s:3:"豈";s:3:"更";s:3:"更";s:3:"車";s:3:"車";s:3:"賈";s:3:"賈";s:3:"滑";s:3:"滑";s:3:"串";s:3:"串";s:3:"句";s:3:"句";s:3:"龜";s:3:"龜";s:3:"龜";s:3:"龜";s:3:"契";s:3:"契";s:3:"金";s:3:"金";s:3:"喇";s:3:"喇";s:3:"奈";s:3:"奈";s:3:"懶";s:3:"懶";s:3:"癩";s:3:"癩";s:3:"羅";s:3:"羅";s:3:"蘿";s:3:"蘿";s:3:"螺";s:3:"螺";s:3:"裸";s:3:"裸";s:3:"邏";s:3:"邏";s:3:"樂";s:3:"樂";s:3:"洛";s:3:"洛";s:3:"烙";s:3:"烙";s:3:"珞";s:3:"珞";s:3:"落";s:3:"落";s:3:"酪";s:3:"酪";s:3:"駱";s:3:"駱";s:3:"亂";s:3:"亂";s:3:"卵";s:3:"卵";s:3:"欄";s:3:"欄";s:3:"爛";s:3:"爛";s:3:"蘭";s:3:"蘭";s:3:"鸞";s:3:"鸞";s:3:"嵐";s:3:"嵐";s:3:"濫";s:3:"濫";s:3:"藍";s:3:"藍";s:3:"襤";s:3:"襤";s:3:"拉";s:3:"拉";s:3:"臘";s:3:"臘";s:3:"蠟";s:3:"蠟";s:3:"廊";s:3:"廊";s:3:"朗";s:3:"朗";s:3:"浪";s:3:"浪";s:3:"狼";s:3:"狼";s:3:"郎";s:3:"郎";s:3:"來";s:3:"來";s:3:"冷";s:3:"冷";s:3:"勞";s:3:"勞";s:3:"擄";s:3:"擄";s:3:"櫓";s:3:"櫓";s:3:"爐";s:3:"爐";s:3:"盧";s:3:"盧";s:3:"老";s:3:"老";s:3:"蘆";s:3:"蘆";s:3:"虜";s:3:"虜";s:3:"路";s:3:"路";s:3:"露";s:3:"露";s:3:"魯";s:3:"魯";s:3:"鷺";s:3:"鷺";s:3:"碌";s:3:"碌";s:3:"祿";s:3:"祿";s:3:"綠";s:3:"綠";s:3:"菉";s:3:"菉";s:3:"錄";s:3:"錄";s:3:"鹿";s:3:"鹿";s:3:"論";s:3:"論";s:3:"壟";s:3:"壟";s:3:"弄";s:3:"弄";s:3:"籠";s:3:"籠";s:3:"聾";s:3:"聾";s:3:"牢";s:3:"牢";s:3:"磊";s:3:"磊";s:3:"賂";s:3:"賂";s:3:"雷";s:3:"雷";s:3:"壘";s:3:"壘";s:3:"屢";s:3:"屢";s:3:"樓";s:3:"樓";s:3:"淚";s:3:"淚";s:3:"漏";s:3:"漏";s:3:"累";s:3:"累";s:3:"縷";s:3:"縷";s:3:"陋";s:3:"陋";s:3:"勒";s:3:"勒";s:3:"肋";s:3:"肋";s:3:"凜";s:3:"凜";s:3:"凌";s:3:"凌";s:3:"稜";s:3:"稜";s:3:"綾";s:3:"綾";s:3:"菱";s:3:"菱";s:3:"陵";s:3:"陵";s:3:"讀";s:3:"讀";s:3:"拏";s:3:"拏";s:3:"樂";s:3:"樂";s:3:"諾";s:3:"諾";s:3:"丹";s:3:"丹";s:3:"寧";s:3:"寧";s:3:"怒";s:3:"怒";s:3:"率";s:3:"率";s:3:"異";s:3:"異";s:3:"北";s:3:"北";s:3:"磻";s:3:"磻";s:3:"便";s:3:"便";s:3:"復";s:3:"復";s:3:"不";s:3:"不";s:3:"泌";s:3:"泌";s:3:"數";s:3:"數";s:3:"索";s:3:"索";s:3:"參";s:3:"參";s:3:"塞";s:3:"塞";s:3:"省";s:3:"省";s:3:"葉";s:3:"葉";s:3:"說";s:3:"說";s:3:"殺";s:3:"殺";s:3:"辰";s:3:"辰";s:3:"沈";s:3:"沈";s:3:"拾";s:3:"拾";s:3:"若";s:3:"若";s:3:"掠";s:3:"掠";s:3:"略";s:3:"略";s:3:"亮";s:3:"亮";s:3:"兩";s:3:"兩";s:3:"凉";s:3:"凉";s:3:"梁";s:3:"梁";s:3:"糧";s:3:"糧";s:3:"良";s:3:"良";s:3:"諒";s:3:"諒";s:3:"量";s:3:"量";s:3:"勵";s:3:"勵";s:3:"呂";s:3:"呂";s:3:"女";s:3:"女";s:3:"廬";s:3:"廬";s:3:"旅";s:3:"旅";s:3:"濾";s:3:"濾";s:3:"礪";s:3:"礪";s:3:"閭";s:3:"閭";s:3:"驪";s:3:"驪";s:3:"麗";s:3:"麗";s:3:"黎";s:3:"黎";s:3:"力";s:3:"力";s:3:"曆";s:3:"曆";s:3:"歷";s:3:"歷";s:3:"轢";s:3:"轢";s:3:"年";s:3:"年";s:3:"憐";s:3:"憐";s:3:"戀";s:3:"戀";s:3:"撚";s:3:"撚";s:3:"漣";s:3:"漣";s:3:"煉";s:3:"煉";s:3:"璉";s:3:"璉";s:3:"秊";s:3:"秊";s:3:"練";s:3:"練";s:3:"聯";s:3:"聯";s:3:"輦";s:3:"輦";s:3:"蓮";s:3:"蓮";s:3:"連";s:3:"連";s:3:"鍊";s:3:"鍊";s:3:"列";s:3:"列";s:3:"劣";s:3:"劣";s:3:"咽";s:3:"咽";s:3:"烈";s:3:"烈";s:3:"裂";s:3:"裂";s:3:"說";s:3:"說";s:3:"廉";s:3:"廉";s:3:"念";s:3:"念";s:3:"捻";s:3:"捻";s:3:"殮";s:3:"殮";s:3:"簾";s:3:"簾";s:3:"獵";s:3:"獵";s:3:"令";s:3:"令";s:3:"囹";s:3:"囹";s:3:"寧";s:3:"寧";s:3:"嶺";s:3:"嶺";s:3:"怜";s:3:"怜";s:3:"玲";s:3:"玲";s:3:"瑩";s:3:"瑩";s:3:"羚";s:3:"羚";s:3:"聆";s:3:"聆";s:3:"鈴";s:3:"鈴";s:3:"零";s:3:"零";s:3:"靈";s:3:"靈";s:3:"領";s:3:"領";s:3:"例";s:3:"例";s:3:"禮";s:3:"禮";s:3:"醴";s:3:"醴";s:3:"隸";s:3:"隸";s:3:"惡";s:3:"惡";s:3:"了";s:3:"了";s:3:"僚";s:3:"僚";s:3:"寮";s:3:"寮";s:3:"尿";s:3:"尿";s:3:"料";s:3:"料";s:3:"樂";s:3:"樂";s:3:"燎";s:3:"燎";s:3:"療";s:3:"療";s:3:"蓼";s:3:"蓼";s:3:"遼";s:3:"遼";s:3:"龍";s:3:"龍";s:3:"暈";s:3:"暈";s:3:"阮";s:3:"阮";s:3:"劉";s:3:"劉";s:3:"杻";s:3:"杻";s:3:"柳";s:3:"柳";s:3:"流";s:3:"流";s:3:"溜";s:3:"溜";s:3:"琉";s:3:"琉";s:3:"留";s:3:"留";s:3:"硫";s:3:"硫";s:3:"紐";s:3:"紐";s:3:"類";s:3:"類";s:3:"六";s:3:"六";s:3:"戮";s:3:"戮";s:3:"陸";s:3:"陸";s:3:"倫";s:3:"倫";s:3:"崙";s:3:"崙";s:3:"淪";s:3:"淪";s:3:"輪";s:3:"輪";s:3:"律";s:3:"律";s:3:"慄";s:3:"慄";s:3:"栗";s:3:"栗";s:3:"率";s:3:"率";s:3:"隆";s:3:"隆";s:3:"利";s:3:"利";s:3:"吏";s:3:"吏";s:3:"履";s:3:"履";s:3:"易";s:3:"易";s:3:"李";s:3:"李";s:3:"梨";s:3:"梨";s:3:"泥";s:3:"泥";s:3:"理";s:3:"理";s:3:"痢";s:3:"痢";s:3:"罹";s:3:"罹";s:3:"裏";s:3:"裏";s:3:"裡";s:3:"裡";s:3:"里";s:3:"里";s:3:"離";s:3:"離";s:3:"匿";s:3:"匿";s:3:"溺";s:3:"溺";s:3:"吝";s:3:"吝";s:3:"燐";s:3:"燐";s:3:"璘";s:3:"璘";s:3:"藺";s:3:"藺";s:3:"隣";s:3:"隣";s:3:"鱗";s:3:"鱗";s:3:"麟";s:3:"麟";s:3:"林";s:3:"林";s:3:"淋";s:3:"淋";s:3:"臨";s:3:"臨";s:3:"立";s:3:"立";s:3:"笠";s:3:"笠";s:3:"粒";s:3:"粒";s:3:"狀";s:3:"狀";s:3:"炙";s:3:"炙";s:3:"識";s:3:"識";s:3:"什";s:3:"什";s:3:"茶";s:3:"茶";s:3:"刺";s:3:"刺";s:3:"切";s:3:"切";s:3:"度";s:3:"度";s:3:"拓";s:3:"拓";s:3:"糖";s:3:"糖";s:3:"宅";s:3:"宅";s:3:"洞";s:3:"洞";s:3:"暴";s:3:"暴";s:3:"輻";s:3:"輻";s:3:"行";s:3:"行";s:3:"降";s:3:"降";s:3:"見";s:3:"見";s:3:"廓";s:3:"廓";s:3:"兀";s:3:"兀";s:3:"嗀";s:3:"嗀";s:3:"塚";s:3:"塚";s:3:"晴";s:3:"晴";s:3:"凞";s:3:"凞";s:3:"猪";s:3:"猪";s:3:"益";s:3:"益";s:3:"礼";s:3:"礼";s:3:"神";s:3:"神";s:3:"祥";s:3:"祥";s:3:"福";s:3:"福";s:3:"靖";s:3:"靖";s:3:"精";s:3:"精";s:3:"羽";s:3:"羽";s:3:"蘒";s:3:"蘒";s:3:"諸";s:3:"諸";s:3:"逸";s:3:"逸";s:3:"都";s:3:"都";s:3:"飯";s:3:"飯";s:3:"飼";s:3:"飼";s:3:"館";s:3:"館";s:3:"鶴";s:3:"鶴";s:3:"侮";s:3:"侮";s:3:"僧";s:3:"僧";s:3:"免";s:3:"免";s:3:"勉";s:3:"勉";s:3:"勤";s:3:"勤";s:3:"卑";s:3:"卑";s:3:"喝";s:3:"喝";s:3:"嘆";s:3:"嘆";s:3:"器";s:3:"器";s:3:"塀";s:3:"塀";s:3:"墨";s:3:"墨";s:3:"層";s:3:"層";s:3:"屮";s:3:"屮";s:3:"悔";s:3:"悔";s:3:"慨";s:3:"慨";s:3:"憎";s:3:"憎";s:3:"懲";s:3:"懲";s:3:"敏";s:3:"敏";s:3:"既";s:3:"既";s:3:"暑";s:3:"暑";s:3:"梅";s:3:"梅";s:3:"海";s:3:"海";s:3:"渚";s:3:"渚";s:3:"漢";s:3:"漢";s:3:"煮";s:3:"煮";s:3:"爫";s:3:"爫";s:3:"琢";s:3:"琢";s:3:"碑";s:3:"碑";s:3:"社";s:3:"社";s:3:"祉";s:3:"祉";s:3:"祈";s:3:"祈";s:3:"祐";s:3:"祐";s:3:"祖";s:3:"祖";s:3:"祝";s:3:"祝";s:3:"禍";s:3:"禍";s:3:"禎";s:3:"禎";s:3:"穀";s:3:"穀";s:3:"突";s:3:"突";s:3:"節";s:3:"節";s:3:"練";s:3:"練";s:3:"縉";s:3:"縉";s:3:"繁";s:3:"繁";s:3:"署";s:3:"署";s:3:"者";s:3:"者";s:3:"臭";s:3:"臭";s:3:"艹";s:3:"艹";s:3:"艹";s:3:"艹";s:3:"著";s:3:"著";s:3:"褐";s:3:"褐";s:3:"視";s:3:"視";s:3:"謁";s:3:"謁";s:3:"謹";s:3:"謹";s:3:"賓";s:3:"賓";s:3:"贈";s:3:"贈";s:3:"辶";s:3:"辶";s:3:"逸";s:3:"逸";s:3:"難";s:3:"難";s:3:"響";s:3:"響";s:3:"頻";s:3:"頻";s:3:"恵";s:3:"恵";s:3:"𤋮";s:4:"𤋮";s:3:"舘";s:3:"舘";s:3:"並";s:3:"並";s:3:"况";s:3:"况";s:3:"全";s:3:"全";s:3:"侀";s:3:"侀";s:3:"充";s:3:"充";s:3:"冀";s:3:"冀";s:3:"勇";s:3:"勇";s:3:"勺";s:3:"勺";s:3:"喝";s:3:"喝";s:3:"啕";s:3:"啕";s:3:"喙";s:3:"喙";s:3:"嗢";s:3:"嗢";s:3:"塚";s:3:"塚";s:3:"墳";s:3:"墳";s:3:"奄";s:3:"奄";s:3:"奔";s:3:"奔";s:3:"婢";s:3:"婢";s:3:"嬨";s:3:"嬨";s:3:"廒";s:3:"廒";s:3:"廙";s:3:"廙";s:3:"彩";s:3:"彩";s:3:"徭";s:3:"徭";s:3:"惘";s:3:"惘";s:3:"慎";s:3:"慎";s:3:"愈";s:3:"愈";s:3:"憎";s:3:"憎";s:3:"慠";s:3:"慠";s:3:"懲";s:3:"懲";s:3:"戴";s:3:"戴";s:3:"揄";s:3:"揄";s:3:"搜";s:3:"搜";s:3:"摒";s:3:"摒";s:3:"敖";s:3:"敖";s:3:"晴";s:3:"晴";s:3:"朗";s:3:"朗";s:3:"望";s:3:"望";s:3:"杖";s:3:"杖";s:3:"歹";s:3:"歹";s:3:"殺";s:3:"殺";s:3:"流";s:3:"流";s:3:"滛";s:3:"滛";s:3:"滋";s:3:"滋";s:3:"漢";s:3:"漢";s:3:"瀞";s:3:"瀞";s:3:"煮";s:3:"煮";s:3:"瞧";s:3:"瞧";s:3:"爵";s:3:"爵";s:3:"犯";s:3:"犯";s:3:"猪";s:3:"猪";s:3:"瑱";s:3:"瑱";s:3:"甆";s:3:"甆";s:3:"画";s:3:"画";s:3:"瘝";s:3:"瘝";s:3:"瘟";s:3:"瘟";s:3:"益";s:3:"益";s:3:"盛";s:3:"盛";s:3:"直";s:3:"直";s:3:"睊";s:3:"睊";s:3:"着";s:3:"着";s:3:"磌";s:3:"磌";s:3:"窱";s:3:"窱";s:3:"節";s:3:"節";s:3:"类";s:3:"类";s:3:"絛";s:3:"絛";s:3:"練";s:3:"練";s:3:"缾";s:3:"缾";s:3:"者";s:3:"者";s:3:"荒";s:3:"荒";s:3:"華";s:3:"華";s:3:"蝹";s:3:"蝹";s:3:"襁";s:3:"襁";s:3:"覆";s:3:"覆";s:3:"視";s:3:"視";s:3:"調";s:3:"調";s:3:"諸";s:3:"諸";s:3:"請";s:3:"請";s:3:"謁";s:3:"謁";s:3:"諾";s:3:"諾";s:3:"諭";s:3:"諭";s:3:"謹";s:3:"謹";s:3:"變";s:3:"變";s:3:"贈";s:3:"贈";s:3:"輸";s:3:"輸";s:3:"遲";s:3:"遲";s:3:"醙";s:3:"醙";s:3:"鉶";s:3:"鉶";s:3:"陼";s:3:"陼";s:3:"難";s:3:"難";s:3:"靖";s:3:"靖";s:3:"韛";s:3:"韛";s:3:"響";s:3:"響";s:3:"頋";s:3:"頋";s:3:"頻";s:3:"頻";s:3:"鬒";s:3:"鬒";s:3:"龜";s:3:"龜";s:3:"𢡊";s:4:"𢡊";s:3:"𢡄";s:4:"𢡄";s:3:"𣏕";s:4:"𣏕";s:3:"㮝";s:3:"㮝";s:3:"䀘";s:3:"䀘";s:3:"䀹";s:3:"䀹";s:3:"𥉉";s:4:"𥉉";s:3:"𥳐";s:4:"𥳐";s:3:"𧻓";s:4:"𧻓";s:3:"齃";s:3:"齃";s:3:"龎";s:3:"龎";s:3:"יִ";s:4:"יִ";s:3:"ײַ";s:4:"ײַ";s:3:"שׁ";s:4:"שׁ";s:3:"שׂ";s:4:"שׂ";s:3:"שּׁ";s:6:"שּׁ";s:3:"שּׂ";s:6:"שּׂ";s:3:"אַ";s:4:"אַ";s:3:"אָ";s:4:"אָ";s:3:"אּ";s:4:"אּ";s:3:"בּ";s:4:"בּ";s:3:"גּ";s:4:"גּ";s:3:"דּ";s:4:"דּ";s:3:"הּ";s:4:"הּ";s:3:"וּ";s:4:"וּ";s:3:"זּ";s:4:"זּ";s:3:"טּ";s:4:"טּ";s:3:"יּ";s:4:"יּ";s:3:"ךּ";s:4:"ךּ";s:3:"כּ";s:4:"כּ";s:3:"לּ";s:4:"לּ";s:3:"מּ";s:4:"מּ";s:3:"נּ";s:4:"נּ";s:3:"סּ";s:4:"סּ";s:3:"ףּ";s:4:"ףּ";s:3:"פּ";s:4:"פּ";s:3:"צּ";s:4:"צּ";s:3:"קּ";s:4:"קּ";s:3:"רּ";s:4:"רּ";s:3:"שּ";s:4:"שּ";s:3:"תּ";s:4:"תּ";s:3:"וֹ";s:4:"וֹ";s:3:"בֿ";s:4:"בֿ";s:3:"כֿ";s:4:"כֿ";s:3:"פֿ";s:4:"פֿ";s:4:"𑂚";s:8:"𑂚";s:4:"𑂜";s:8:"𑂜";s:4:"𑂫";s:8:"𑂫";s:4:"𝅗𝅥";s:8:"𝅗𝅥";s:4:"𝅘𝅥";s:8:"𝅘𝅥";s:4:"𝅘𝅥𝅮";s:12:"𝅘𝅥𝅮";s:4:"𝅘𝅥𝅯";s:12:"𝅘𝅥𝅯";s:4:"𝅘𝅥𝅰";s:12:"𝅘𝅥𝅰";s:4:"𝅘𝅥𝅱";s:12:"𝅘𝅥𝅱";s:4:"𝅘𝅥𝅲";s:12:"𝅘𝅥𝅲";s:4:"𝆹𝅥";s:8:"𝆹𝅥";s:4:"𝆺𝅥";s:8:"𝆺𝅥";s:4:"𝆹𝅥𝅮";s:12:"𝆹𝅥𝅮";s:4:"𝆺𝅥𝅮";s:12:"𝆺𝅥𝅮";s:4:"𝆹𝅥𝅯";s:12:"𝆹𝅥𝅯";s:4:"𝆺𝅥𝅯";s:12:"𝆺𝅥𝅯";s:4:"丽";s:3:"丽";s:4:"丸";s:3:"丸";s:4:"乁";s:3:"乁";s:4:"𠄢";s:4:"𠄢";s:4:"你";s:3:"你";s:4:"侮";s:3:"侮";s:4:"侻";s:3:"侻";s:4:"倂";s:3:"倂";s:4:"偺";s:3:"偺";s:4:"備";s:3:"備";s:4:"僧";s:3:"僧";s:4:"像";s:3:"像";s:4:"㒞";s:3:"㒞";s:4:"𠘺";s:4:"𠘺";s:4:"免";s:3:"免";s:4:"兔";s:3:"兔";s:4:"兤";s:3:"兤";s:4:"具";s:3:"具";s:4:"𠔜";s:4:"𠔜";s:4:"㒹";s:3:"㒹";s:4:"內";s:3:"內";s:4:"再";s:3:"再";s:4:"𠕋";s:4:"𠕋";s:4:"冗";s:3:"冗";s:4:"冤";s:3:"冤";s:4:"仌";s:3:"仌";s:4:"冬";s:3:"冬";s:4:"况";s:3:"况";s:4:"𩇟";s:4:"𩇟";s:4:"凵";s:3:"凵";s:4:"刃";s:3:"刃";s:4:"㓟";s:3:"㓟";s:4:"刻";s:3:"刻";s:4:"剆";s:3:"剆";s:4:"割";s:3:"割";s:4:"剷";s:3:"剷";s:4:"㔕";s:3:"㔕";s:4:"勇";s:3:"勇";s:4:"勉";s:3:"勉";s:4:"勤";s:3:"勤";s:4:"勺";s:3:"勺";s:4:"包";s:3:"包";s:4:"匆";s:3:"匆";s:4:"北";s:3:"北";s:4:"卉";s:3:"卉";s:4:"卑";s:3:"卑";s:4:"博";s:3:"博";s:4:"即";s:3:"即";s:4:"卽";s:3:"卽";s:4:"卿";s:3:"卿";s:4:"卿";s:3:"卿";s:4:"卿";s:3:"卿";s:4:"𠨬";s:4:"𠨬";s:4:"灰";s:3:"灰";s:4:"及";s:3:"及";s:4:"叟";s:3:"叟";s:4:"𠭣";s:4:"𠭣";s:4:"叫";s:3:"叫";s:4:"叱";s:3:"叱";s:4:"吆";s:3:"吆";s:4:"咞";s:3:"咞";s:4:"吸";s:3:"吸";s:4:"呈";s:3:"呈";s:4:"周";s:3:"周";s:4:"咢";s:3:"咢";s:4:"哶";s:3:"哶";s:4:"唐";s:3:"唐";s:4:"啓";s:3:"啓";s:4:"啣";s:3:"啣";s:4:"善";s:3:"善";s:4:"善";s:3:"善";s:4:"喙";s:3:"喙";s:4:"喫";s:3:"喫";s:4:"喳";s:3:"喳";s:4:"嗂";s:3:"嗂";s:4:"圖";s:3:"圖";s:4:"嘆";s:3:"嘆";s:4:"圗";s:3:"圗";s:4:"噑";s:3:"噑";s:4:"噴";s:3:"噴";s:4:"切";s:3:"切";s:4:"壮";s:3:"壮";s:4:"城";s:3:"城";s:4:"埴";s:3:"埴";s:4:"堍";s:3:"堍";s:4:"型";s:3:"型";s:4:"堲";s:3:"堲";s:4:"報";s:3:"報";s:4:"墬";s:3:"墬";s:4:"𡓤";s:4:"𡓤";s:4:"売";s:3:"売";s:4:"壷";s:3:"壷";s:4:"夆";s:3:"夆";s:4:"多";s:3:"多";s:4:"夢";s:3:"夢";s:4:"奢";s:3:"奢";s:4:"𡚨";s:4:"𡚨";s:4:"𡛪";s:4:"𡛪";s:4:"姬";s:3:"姬";s:4:"娛";s:3:"娛";s:4:"娧";s:3:"娧";s:4:"姘";s:3:"姘";s:4:"婦";s:3:"婦";s:4:"㛮";s:3:"㛮";s:4:"㛼";s:3:"㛼";s:4:"嬈";s:3:"嬈";s:4:"嬾";s:3:"嬾";s:4:"嬾";s:3:"嬾";s:4:"𡧈";s:4:"𡧈";s:4:"寃";s:3:"寃";s:4:"寘";s:3:"寘";s:4:"寧";s:3:"寧";s:4:"寳";s:3:"寳";s:4:"𡬘";s:4:"𡬘";s:4:"寿";s:3:"寿";s:4:"将";s:3:"将";s:4:"当";s:3:"当";s:4:"尢";s:3:"尢";s:4:"㞁";s:3:"㞁";s:4:"屠";s:3:"屠";s:4:"屮";s:3:"屮";s:4:"峀";s:3:"峀";s:4:"岍";s:3:"岍";s:4:"𡷤";s:4:"𡷤";s:4:"嵃";s:3:"嵃";s:4:"𡷦";s:4:"𡷦";s:4:"嵮";s:3:"嵮";s:4:"嵫";s:3:"嵫";s:4:"嵼";s:3:"嵼";s:4:"巡";s:3:"巡";s:4:"巢";s:3:"巢";s:4:"㠯";s:3:"㠯";s:4:"巽";s:3:"巽";s:4:"帨";s:3:"帨";s:4:"帽";s:3:"帽";s:4:"幩";s:3:"幩";s:4:"㡢";s:3:"㡢";s:4:"𢆃";s:4:"𢆃";s:4:"㡼";s:3:"㡼";s:4:"庰";s:3:"庰";s:4:"庳";s:3:"庳";s:4:"庶";s:3:"庶";s:4:"廊";s:3:"廊";s:4:"𪎒";s:4:"𪎒";s:4:"廾";s:3:"廾";s:4:"𢌱";s:4:"𢌱";s:4:"𢌱";s:4:"𢌱";s:4:"舁";s:3:"舁";s:4:"弢";s:3:"弢";s:4:"弢";s:3:"弢";s:4:"㣇";s:3:"㣇";s:4:"𣊸";s:4:"𣊸";s:4:"𦇚";s:4:"𦇚";s:4:"形";s:3:"形";s:4:"彫";s:3:"彫";s:4:"㣣";s:3:"㣣";s:4:"徚";s:3:"徚";s:4:"忍";s:3:"忍";s:4:"志";s:3:"志";s:4:"忹";s:3:"忹";s:4:"悁";s:3:"悁";s:4:"㤺";s:3:"㤺";s:4:"㤜";s:3:"㤜";s:4:"悔";s:3:"悔";s:4:"𢛔";s:4:"𢛔";s:4:"惇";s:3:"惇";s:4:"慈";s:3:"慈";s:4:"慌";s:3:"慌";s:4:"慎";s:3:"慎";s:4:"慌";s:3:"慌";s:4:"慺";s:3:"慺";s:4:"憎";s:3:"憎";s:4:"憲";s:3:"憲";s:4:"憤";s:3:"憤";s:4:"憯";s:3:"憯";s:4:"懞";s:3:"懞";s:4:"懲";s:3:"懲";s:4:"懶";s:3:"懶";s:4:"成";s:3:"成";s:4:"戛";s:3:"戛";s:4:"扝";s:3:"扝";s:4:"抱";s:3:"抱";s:4:"拔";s:3:"拔";s:4:"捐";s:3:"捐";s:4:"𢬌";s:4:"𢬌";s:4:"挽";s:3:"挽";s:4:"拼";s:3:"拼";s:4:"捨";s:3:"捨";s:4:"掃";s:3:"掃";s:4:"揤";s:3:"揤";s:4:"𢯱";s:4:"𢯱";s:4:"搢";s:3:"搢";s:4:"揅";s:3:"揅";s:4:"掩";s:3:"掩";s:4:"㨮";s:3:"㨮";s:4:"摩";s:3:"摩";s:4:"摾";s:3:"摾";s:4:"撝";s:3:"撝";s:4:"摷";s:3:"摷";s:4:"㩬";s:3:"㩬";s:4:"敏";s:3:"敏";s:4:"敬";s:3:"敬";s:4:"𣀊";s:4:"𣀊";s:4:"旣";s:3:"旣";s:4:"書";s:3:"書";s:4:"晉";s:3:"晉";s:4:"㬙";s:3:"㬙";s:4:"暑";s:3:"暑";s:4:"㬈";s:3:"㬈";s:4:"㫤";s:3:"㫤";s:4:"冒";s:3:"冒";s:4:"冕";s:3:"冕";s:4:"最";s:3:"最";s:4:"暜";s:3:"暜";s:4:"肭";s:3:"肭";s:4:"䏙";s:3:"䏙";s:4:"朗";s:3:"朗";s:4:"望";s:3:"望";s:4:"朡";s:3:"朡";s:4:"杞";s:3:"杞";s:4:"杓";s:3:"杓";s:4:"𣏃";s:4:"𣏃";s:4:"㭉";s:3:"㭉";s:4:"柺";s:3:"柺";s:4:"枅";s:3:"枅";s:4:"桒";s:3:"桒";s:4:"梅";s:3:"梅";s:4:"𣑭";s:4:"𣑭";s:4:"梎";s:3:"梎";s:4:"栟";s:3:"栟";s:4:"椔";s:3:"椔";s:4:"㮝";s:3:"㮝";s:4:"楂";s:3:"楂";s:4:"榣";s:3:"榣";s:4:"槪";s:3:"槪";s:4:"檨";s:3:"檨";s:4:"𣚣";s:4:"𣚣";s:4:"櫛";s:3:"櫛";s:4:"㰘";s:3:"㰘";s:4:"次";s:3:"次";s:4:"𣢧";s:4:"𣢧";s:4:"歔";s:3:"歔";s:4:"㱎";s:3:"㱎";s:4:"歲";s:3:"歲";s:4:"殟";s:3:"殟";s:4:"殺";s:3:"殺";s:4:"殻";s:3:"殻";s:4:"𣪍";s:4:"𣪍";s:4:"𡴋";s:4:"𡴋";s:4:"𣫺";s:4:"𣫺";s:4:"汎";s:3:"汎";s:4:"𣲼";s:4:"𣲼";s:4:"沿";s:3:"沿";s:4:"泍";s:3:"泍";s:4:"汧";s:3:"汧";s:4:"洖";s:3:"洖";s:4:"派";s:3:"派";s:4:"海";s:3:"海";s:4:"流";s:3:"流";s:4:"浩";s:3:"浩";s:4:"浸";s:3:"浸";s:4:"涅";s:3:"涅";s:4:"𣴞";s:4:"𣴞";s:4:"洴";s:3:"洴";s:4:"港";s:3:"港";s:4:"湮";s:3:"湮";s:4:"㴳";s:3:"㴳";s:4:"滋";s:3:"滋";s:4:"滇";s:3:"滇";s:4:"𣻑";s:4:"𣻑";s:4:"淹";s:3:"淹";s:4:"潮";s:3:"潮";s:4:"𣽞";s:4:"𣽞";s:4:"𣾎";s:4:"𣾎";s:4:"濆";s:3:"濆";s:4:"瀹";s:3:"瀹";s:4:"瀞";s:3:"瀞";s:4:"瀛";s:3:"瀛";s:4:"㶖";s:3:"㶖";s:4:"灊";s:3:"灊";s:4:"災";s:3:"災";s:4:"灷";s:3:"灷";s:4:"炭";s:3:"炭";s:4:"𠔥";s:4:"𠔥";s:4:"煅";s:3:"煅";s:4:"𤉣";s:4:"𤉣";s:4:"熜";s:3:"熜";s:4:"𤎫";s:4:"𤎫";s:4:"爨";s:3:"爨";s:4:"爵";s:3:"爵";s:4:"牐";s:3:"牐";s:4:"𤘈";s:4:"𤘈";s:4:"犀";s:3:"犀";s:4:"犕";s:3:"犕";s:4:"𤜵";s:4:"𤜵";s:4:"𤠔";s:4:"𤠔";s:4:"獺";s:3:"獺";s:4:"王";s:3:"王";s:4:"㺬";s:3:"㺬";s:4:"玥";s:3:"玥";s:4:"㺸";s:3:"㺸";s:4:"㺸";s:3:"㺸";s:4:"瑇";s:3:"瑇";s:4:"瑜";s:3:"瑜";s:4:"瑱";s:3:"瑱";s:4:"璅";s:3:"璅";s:4:"瓊";s:3:"瓊";s:4:"㼛";s:3:"㼛";s:4:"甤";s:3:"甤";s:4:"𤰶";s:4:"𤰶";s:4:"甾";s:3:"甾";s:4:"𤲒";s:4:"𤲒";s:4:"異";s:3:"異";s:4:"𢆟";s:4:"𢆟";s:4:"瘐";s:3:"瘐";s:4:"𤾡";s:4:"𤾡";s:4:"𤾸";s:4:"𤾸";s:4:"𥁄";s:4:"𥁄";s:4:"㿼";s:3:"㿼";s:4:"䀈";s:3:"䀈";s:4:"直";s:3:"直";s:4:"𥃳";s:4:"𥃳";s:4:"𥃲";s:4:"𥃲";s:4:"𥄙";s:4:"𥄙";s:4:"𥄳";s:4:"𥄳";s:4:"眞";s:3:"眞";s:4:"真";s:3:"真";s:4:"真";s:3:"真";s:4:"睊";s:3:"睊";s:4:"䀹";s:3:"䀹";s:4:"瞋";s:3:"瞋";s:4:"䁆";s:3:"䁆";s:4:"䂖";s:3:"䂖";s:4:"𥐝";s:4:"𥐝";s:4:"硎";s:3:"硎";s:4:"碌";s:3:"碌";s:4:"磌";s:3:"磌";s:4:"䃣";s:3:"䃣";s:4:"𥘦";s:4:"𥘦";s:4:"祖";s:3:"祖";s:4:"𥚚";s:4:"𥚚";s:4:"𥛅";s:4:"𥛅";s:4:"福";s:3:"福";s:4:"秫";s:3:"秫";s:4:"䄯";s:3:"䄯";s:4:"穀";s:3:"穀";s:4:"穊";s:3:"穊";s:4:"穏";s:3:"穏";s:4:"𥥼";s:4:"𥥼";s:4:"𥪧";s:4:"𥪧";s:4:"𥪧";s:4:"𥪧";s:4:"竮";s:3:"竮";s:4:"䈂";s:3:"䈂";s:4:"𥮫";s:4:"𥮫";s:4:"篆";s:3:"篆";s:4:"築";s:3:"築";s:4:"䈧";s:3:"䈧";s:4:"𥲀";s:4:"𥲀";s:4:"糒";s:3:"糒";s:4:"䊠";s:3:"䊠";s:4:"糨";s:3:"糨";s:4:"糣";s:3:"糣";s:4:"紀";s:3:"紀";s:4:"𥾆";s:4:"𥾆";s:4:"絣";s:3:"絣";s:4:"䌁";s:3:"䌁";s:4:"緇";s:3:"緇";s:4:"縂";s:3:"縂";s:4:"繅";s:3:"繅";s:4:"䌴";s:3:"䌴";s:4:"𦈨";s:4:"𦈨";s:4:"𦉇";s:4:"𦉇";s:4:"䍙";s:3:"䍙";s:4:"𦋙";s:4:"𦋙";s:4:"罺";s:3:"罺";s:4:"𦌾";s:4:"𦌾";s:4:"羕";s:3:"羕";s:4:"翺";s:3:"翺";s:4:"者";s:3:"者";s:4:"𦓚";s:4:"𦓚";s:4:"𦔣";s:4:"𦔣";s:4:"聠";s:3:"聠";s:4:"𦖨";s:4:"𦖨";s:4:"聰";s:3:"聰";s:4:"𣍟";s:4:"𣍟";s:4:"䏕";s:3:"䏕";s:4:"育";s:3:"育";s:4:"脃";s:3:"脃";s:4:"䐋";s:3:"䐋";s:4:"脾";s:3:"脾";s:4:"媵";s:3:"媵";s:4:"𦞧";s:4:"𦞧";s:4:"𦞵";s:4:"𦞵";s:4:"𣎓";s:4:"𣎓";s:4:"𣎜";s:4:"𣎜";s:4:"舁";s:3:"舁";s:4:"舄";s:3:"舄";s:4:"辞";s:3:"辞";s:4:"䑫";s:3:"䑫";s:4:"芑";s:3:"芑";s:4:"芋";s:3:"芋";s:4:"芝";s:3:"芝";s:4:"劳";s:3:"劳";s:4:"花";s:3:"花";s:4:"芳";s:3:"芳";s:4:"芽";s:3:"芽";s:4:"苦";s:3:"苦";s:4:"𦬼";s:4:"𦬼";s:4:"若";s:3:"若";s:4:"茝";s:3:"茝";s:4:"荣";s:3:"荣";s:4:"莭";s:3:"莭";s:4:"茣";s:3:"茣";s:4:"莽";s:3:"莽";s:4:"菧";s:3:"菧";s:4:"著";s:3:"著";s:4:"荓";s:3:"荓";s:4:"菊";s:3:"菊";s:4:"菌";s:3:"菌";s:4:"菜";s:3:"菜";s:4:"𦰶";s:4:"𦰶";s:4:"𦵫";s:4:"𦵫";s:4:"𦳕";s:4:"𦳕";s:4:"䔫";s:3:"䔫";s:4:"蓱";s:3:"蓱";s:4:"蓳";s:3:"蓳";s:4:"蔖";s:3:"蔖";s:4:"𧏊";s:4:"𧏊";s:4:"蕤";s:3:"蕤";s:4:"𦼬";s:4:"𦼬";s:4:"䕝";s:3:"䕝";s:4:"䕡";s:3:"䕡";s:4:"𦾱";s:4:"𦾱";s:4:"𧃒";s:4:"𧃒";s:4:"䕫";s:3:"䕫";s:4:"虐";s:3:"虐";s:4:"虜";s:3:"虜";s:4:"虧";s:3:"虧";s:4:"虩";s:3:"虩";s:4:"蚩";s:3:"蚩";s:4:"蚈";s:3:"蚈";s:4:"蜎";s:3:"蜎";s:4:"蛢";s:3:"蛢";s:4:"蝹";s:3:"蝹";s:4:"蜨";s:3:"蜨";s:4:"蝫";s:3:"蝫";s:4:"螆";s:3:"螆";s:4:"䗗";s:3:"䗗";s:4:"蟡";s:3:"蟡";s:4:"蠁";s:3:"蠁";s:4:"䗹";s:3:"䗹";s:4:"衠";s:3:"衠";s:4:"衣";s:3:"衣";s:4:"𧙧";s:4:"𧙧";s:4:"裗";s:3:"裗";s:4:"裞";s:3:"裞";s:4:"䘵";s:3:"䘵";s:4:"裺";s:3:"裺";s:4:"㒻";s:3:"㒻";s:4:"𧢮";s:4:"𧢮";s:4:"𧥦";s:4:"𧥦";s:4:"䚾";s:3:"䚾";s:4:"䛇";s:3:"䛇";s:4:"誠";s:3:"誠";s:4:"諭";s:3:"諭";s:4:"變";s:3:"變";s:4:"豕";s:3:"豕";s:4:"𧲨";s:4:"𧲨";s:4:"貫";s:3:"貫";s:4:"賁";s:3:"賁";s:4:"贛";s:3:"贛";s:4:"起";s:3:"起";s:4:"𧼯";s:4:"𧼯";s:4:"𠠄";s:4:"𠠄";s:4:"跋";s:3:"跋";s:4:"趼";s:3:"趼";s:4:"跰";s:3:"跰";s:4:"𠣞";s:4:"𠣞";s:4:"軔";s:3:"軔";s:4:"輸";s:3:"輸";s:4:"𨗒";s:4:"𨗒";s:4:"𨗭";s:4:"𨗭";s:4:"邔";s:3:"邔";s:4:"郱";s:3:"郱";s:4:"鄑";s:3:"鄑";s:4:"𨜮";s:4:"𨜮";s:4:"鄛";s:3:"鄛";s:4:"鈸";s:3:"鈸";s:4:"鋗";s:3:"鋗";s:4:"鋘";s:3:"鋘";s:4:"鉼";s:3:"鉼";s:4:"鏹";s:3:"鏹";s:4:"鐕";s:3:"鐕";s:4:"𨯺";s:4:"𨯺";s:4:"開";s:3:"開";s:4:"䦕";s:3:"䦕";s:4:"閷";s:3:"閷";s:4:"𨵷";s:4:"𨵷";s:4:"䧦";s:3:"䧦";s:4:"雃";s:3:"雃";s:4:"嶲";s:3:"嶲";s:4:"霣";s:3:"霣";s:4:"𩅅";s:4:"𩅅";s:4:"𩈚";s:4:"𩈚";s:4:"䩮";s:3:"䩮";s:4:"䩶";s:3:"䩶";s:4:"韠";s:3:"韠";s:4:"𩐊";s:4:"𩐊";s:4:"䪲";s:3:"䪲";s:4:"𩒖";s:4:"𩒖";s:4:"頋";s:3:"頋";s:4:"頋";s:3:"頋";s:4:"頩";s:3:"頩";s:4:"𩖶";s:4:"𩖶";s:4:"飢";s:3:"飢";s:4:"䬳";s:3:"䬳";s:4:"餩";s:3:"餩";s:4:"馧";s:3:"馧";s:4:"駂";s:3:"駂";s:4:"駾";s:3:"駾";s:4:"䯎";s:3:"䯎";s:4:"𩬰";s:4:"𩬰";s:4:"鬒";s:3:"鬒";s:4:"鱀";s:3:"鱀";s:4:"鳽";s:3:"鳽";s:4:"䳎";s:3:"䳎";s:4:"䳭";s:3:"䳭";s:4:"鵧";s:3:"鵧";s:4:"𪃎";s:4:"𪃎";s:4:"䳸";s:3:"䳸";s:4:"𪄅";s:4:"𪄅";s:4:"𪈎";s:4:"𪈎";s:4:"𪊑";s:4:"𪊑";s:4:"麻";s:3:"麻";s:4:"䵖";s:3:"䵖";s:4:"黹";s:3:"黹";s:4:"黾";s:3:"黾";s:4:"鼅";s:3:"鼅";s:4:"鼏";s:3:"鼏";s:4:"鼖";s:3:"鼖";s:4:"鼻";s:3:"鼻";s:4:"𪘀";s:4:"𪘀";}' );
index 661d2cd..dde3eff 100644 (file)
@@ -5,6 +5,7 @@
  *
  * @file
  */
+// @codingStandardsIgnoreFile
 
 UtfNormal::$utfCompatibilityDecomp = unserialize( 'a:5559:{s:2:" ";s:1:" ";s:2:"¨";s:3:" ̈";s:2:"ª";s:1:"a";s:2:"¯";s:3:" ̄";s:2:"²";s:1:"2";s:2:"³";s:1:"3";s:2:"´";s:3:" ́";s:2:"µ";s:2:"μ";s:2:"¸";s:3:" ̧";s:2:"¹";s:1:"1";s:2:"º";s:1:"o";s:2:"¼";s:5:"1⁄4";s:2:"½";s:5:"1⁄2";s:2:"¾";s:5:"3⁄4";s:2:"À";s:3:"À";s:2:"Á";s:3:"Á";s:2:"Â";s:3:"Â";s:2:"Ã";s:3:"Ã";s:2:"Ä";s:3:"Ä";s:2:"Å";s:3:"Å";s:2:"Ç";s:3:"Ç";s:2:"È";s:3:"È";s:2:"É";s:3:"É";s:2:"Ê";s:3:"Ê";s:2:"Ë";s:3:"Ë";s:2:"Ì";s:3:"Ì";s:2:"Í";s:3:"Í";s:2:"Î";s:3:"Î";s:2:"Ï";s:3:"Ï";s:2:"Ñ";s:3:"Ñ";s:2:"Ò";s:3:"Ò";s:2:"Ó";s:3:"Ó";s:2:"Ô";s:3:"Ô";s:2:"Õ";s:3:"Õ";s:2:"Ö";s:3:"Ö";s:2:"Ù";s:3:"Ù";s:2:"Ú";s:3:"Ú";s:2:"Û";s:3:"Û";s:2:"Ü";s:3:"Ü";s:2:"Ý";s:3:"Ý";s:2:"à";s:3:"à";s:2:"á";s:3:"á";s:2:"â";s:3:"â";s:2:"ã";s:3:"ã";s:2:"ä";s:3:"ä";s:2:"å";s:3:"å";s:2:"ç";s:3:"ç";s:2:"è";s:3:"è";s:2:"é";s:3:"é";s:2:"ê";s:3:"ê";s:2:"ë";s:3:"ë";s:2:"ì";s:3:"ì";s:2:"í";s:3:"í";s:2:"î";s:3:"î";s:2:"ï";s:3:"ï";s:2:"ñ";s:3:"ñ";s:2:"ò";s:3:"ò";s:2:"ó";s:3:"ó";s:2:"ô";s:3:"ô";s:2:"õ";s:3:"õ";s:2:"ö";s:3:"ö";s:2:"ù";s:3:"ù";s:2:"ú";s:3:"ú";s:2:"û";s:3:"û";s:2:"ü";s:3:"ü";s:2:"ý";s:3:"ý";s:2:"ÿ";s:3:"ÿ";s:2:"Ā";s:3:"Ā";s:2:"ā";s:3:"ā";s:2:"Ă";s:3:"Ă";s:2:"ă";s:3:"ă";s:2:"Ą";s:3:"Ą";s:2:"ą";s:3:"ą";s:2:"Ć";s:3:"Ć";s:2:"ć";s:3:"ć";s:2:"Ĉ";s:3:"Ĉ";s:2:"ĉ";s:3:"ĉ";s:2:"Ċ";s:3:"Ċ";s:2:"ċ";s:3:"ċ";s:2:"Č";s:3:"Č";s:2:"č";s:3:"č";s:2:"Ď";s:3:"Ď";s:2:"ď";s:3:"ď";s:2:"Ē";s:3:"Ē";s:2:"ē";s:3:"ē";s:2:"Ĕ";s:3:"Ĕ";s:2:"ĕ";s:3:"ĕ";s:2:"Ė";s:3:"Ė";s:2:"ė";s:3:"ė";s:2:"Ę";s:3:"Ę";s:2:"ę";s:3:"ę";s:2:"Ě";s:3:"Ě";s:2:"ě";s:3:"ě";s:2:"Ĝ";s:3:"Ĝ";s:2:"ĝ";s:3:"ĝ";s:2:"Ğ";s:3:"Ğ";s:2:"ğ";s:3:"ğ";s:2:"Ġ";s:3:"Ġ";s:2:"ġ";s:3:"ġ";s:2:"Ģ";s:3:"Ģ";s:2:"ģ";s:3:"ģ";s:2:"Ĥ";s:3:"Ĥ";s:2:"ĥ";s:3:"ĥ";s:2:"Ĩ";s:3:"Ĩ";s:2:"ĩ";s:3:"ĩ";s:2:"Ī";s:3:"Ī";s:2:"ī";s:3:"ī";s:2:"Ĭ";s:3:"Ĭ";s:2:"ĭ";s:3:"ĭ";s:2:"Į";s:3:"Į";s:2:"į";s:3:"į";s:2:"İ";s:3:"İ";s:2:"IJ";s:2:"IJ";s:2:"ij";s:2:"ij";s:2:"Ĵ";s:3:"Ĵ";s:2:"ĵ";s:3:"ĵ";s:2:"Ķ";s:3:"Ķ";s:2:"ķ";s:3:"ķ";s:2:"Ĺ";s:3:"Ĺ";s:2:"ĺ";s:3:"ĺ";s:2:"Ļ";s:3:"Ļ";s:2:"ļ";s:3:"ļ";s:2:"Ľ";s:3:"Ľ";s:2:"ľ";s:3:"ľ";s:2:"Ŀ";s:3:"L·";s:2:"ŀ";s:3:"l·";s:2:"Ń";s:3:"Ń";s:2:"ń";s:3:"ń";s:2:"Ņ";s:3:"Ņ";s:2:"ņ";s:3:"ņ";s:2:"Ň";s:3:"Ň";s:2:"ň";s:3:"ň";s:2:"ʼn";s:3:"ʼn";s:2:"Ō";s:3:"Ō";s:2:"ō";s:3:"ō";s:2:"Ŏ";s:3:"Ŏ";s:2:"ŏ";s:3:"ŏ";s:2:"Ő";s:3:"Ő";s:2:"ő";s:3:"ő";s:2:"Ŕ";s:3:"Ŕ";s:2:"ŕ";s:3:"ŕ";s:2:"Ŗ";s:3:"Ŗ";s:2:"ŗ";s:3:"ŗ";s:2:"Ř";s:3:"Ř";s:2:"ř";s:3:"ř";s:2:"Ś";s:3:"Ś";s:2:"ś";s:3:"ś";s:2:"Ŝ";s:3:"Ŝ";s:2:"ŝ";s:3:"ŝ";s:2:"Ş";s:3:"Ş";s:2:"ş";s:3:"ş";s:2:"Š";s:3:"Š";s:2:"š";s:3:"š";s:2:"Ţ";s:3:"Ţ";s:2:"ţ";s:3:"ţ";s:2:"Ť";s:3:"Ť";s:2:"ť";s:3:"ť";s:2:"Ũ";s:3:"Ũ";s:2:"ũ";s:3:"ũ";s:2:"Ū";s:3:"Ū";s:2:"ū";s:3:"ū";s:2:"Ŭ";s:3:"Ŭ";s:2:"ŭ";s:3:"ŭ";s:2:"Ů";s:3:"Ů";s:2:"ů";s:3:"ů";s:2:"Ű";s:3:"Ű";s:2:"ű";s:3:"ű";s:2:"Ų";s:3:"Ų";s:2:"ų";s:3:"ų";s:2:"Ŵ";s:3:"Ŵ";s:2:"ŵ";s:3:"ŵ";s:2:"Ŷ";s:3:"Ŷ";s:2:"ŷ";s:3:"ŷ";s:2:"Ÿ";s:3:"Ÿ";s:2:"Ź";s:3:"Ź";s:2:"ź";s:3:"ź";s:2:"Ż";s:3:"Ż";s:2:"ż";s:3:"ż";s:2:"Ž";s:3:"Ž";s:2:"ž";s:3:"ž";s:2:"ſ";s:1:"s";s:2:"Ơ";s:3:"Ơ";s:2:"ơ";s:3:"ơ";s:2:"Ư";s:3:"Ư";s:2:"ư";s:3:"ư";s:2:"DŽ";s:4:"DŽ";s:2:"Dž";s:4:"Dž";s:2:"dž";s:4:"dž";s:2:"LJ";s:2:"LJ";s:2:"Lj";s:2:"Lj";s:2:"lj";s:2:"lj";s:2:"NJ";s:2:"NJ";s:2:"Nj";s:2:"Nj";s:2:"nj";s:2:"nj";s:2:"Ǎ";s:3:"Ǎ";s:2:"ǎ";s:3:"ǎ";s:2:"Ǐ";s:3:"Ǐ";s:2:"ǐ";s:3:"ǐ";s:2:"Ǒ";s:3:"Ǒ";s:2:"ǒ";s:3:"ǒ";s:2:"Ǔ";s:3:"Ǔ";s:2:"ǔ";s:3:"ǔ";s:2:"Ǖ";s:5:"Ǖ";s:2:"ǖ";s:5:"ǖ";s:2:"Ǘ";s:5:"Ǘ";s:2:"ǘ";s:5:"ǘ";s:2:"Ǚ";s:5:"Ǚ";s:2:"ǚ";s:5:"ǚ";s:2:"Ǜ";s:5:"Ǜ";s:2:"ǜ";s:5:"ǜ";s:2:"Ǟ";s:5:"Ǟ";s:2:"ǟ";s:5:"ǟ";s:2:"Ǡ";s:5:"Ǡ";s:2:"ǡ";s:5:"ǡ";s:2:"Ǣ";s:4:"Ǣ";s:2:"ǣ";s:4:"ǣ";s:2:"Ǧ";s:3:"Ǧ";s:2:"ǧ";s:3:"ǧ";s:2:"Ǩ";s:3:"Ǩ";s:2:"ǩ";s:3:"ǩ";s:2:"Ǫ";s:3:"Ǫ";s:2:"ǫ";s:3:"ǫ";s:2:"Ǭ";s:5:"Ǭ";s:2:"ǭ";s:5:"ǭ";s:2:"Ǯ";s:4:"Ǯ";s:2:"ǯ";s:4:"ǯ";s:2:"ǰ";s:3:"ǰ";s:2:"DZ";s:2:"DZ";s:2:"Dz";s:2:"Dz";s:2:"dz";s:2:"dz";s:2:"Ǵ";s:3:"Ǵ";s:2:"ǵ";s:3:"ǵ";s:2:"Ǹ";s:3:"Ǹ";s:2:"ǹ";s:3:"ǹ";s:2:"Ǻ";s:5:"Ǻ";s:2:"ǻ";s:5:"ǻ";s:2:"Ǽ";s:4:"Ǽ";s:2:"ǽ";s:4:"ǽ";s:2:"Ǿ";s:4:"Ǿ";s:2:"ǿ";s:4:"ǿ";s:2:"Ȁ";s:3:"Ȁ";s:2:"ȁ";s:3:"ȁ";s:2:"Ȃ";s:3:"Ȃ";s:2:"ȃ";s:3:"ȃ";s:2:"Ȅ";s:3:"Ȅ";s:2:"ȅ";s:3:"ȅ";s:2:"Ȇ";s:3:"Ȇ";s:2:"ȇ";s:3:"ȇ";s:2:"Ȉ";s:3:"Ȉ";s:2:"ȉ";s:3:"ȉ";s:2:"Ȋ";s:3:"Ȋ";s:2:"ȋ";s:3:"ȋ";s:2:"Ȍ";s:3:"Ȍ";s:2:"ȍ";s:3:"ȍ";s:2:"Ȏ";s:3:"Ȏ";s:2:"ȏ";s:3:"ȏ";s:2:"Ȑ";s:3:"Ȑ";s:2:"ȑ";s:3:"ȑ";s:2:"Ȓ";s:3:"Ȓ";s:2:"ȓ";s:3:"ȓ";s:2:"Ȕ";s:3:"Ȕ";s:2:"ȕ";s:3:"ȕ";s:2:"Ȗ";s:3:"Ȗ";s:2:"ȗ";s:3:"ȗ";s:2:"Ș";s:3:"Ș";s:2:"ș";s:3:"ș";s:2:"Ț";s:3:"Ț";s:2:"ț";s:3:"ț";s:2:"Ȟ";s:3:"Ȟ";s:2:"ȟ";s:3:"ȟ";s:2:"Ȧ";s:3:"Ȧ";s:2:"ȧ";s:3:"ȧ";s:2:"Ȩ";s:3:"Ȩ";s:2:"ȩ";s:3:"ȩ";s:2:"Ȫ";s:5:"Ȫ";s:2:"ȫ";s:5:"ȫ";s:2:"Ȭ";s:5:"Ȭ";s:2:"ȭ";s:5:"ȭ";s:2:"Ȯ";s:3:"Ȯ";s:2:"ȯ";s:3:"ȯ";s:2:"Ȱ";s:5:"Ȱ";s:2:"ȱ";s:5:"ȱ";s:2:"Ȳ";s:3:"Ȳ";s:2:"ȳ";s:3:"ȳ";s:2:"ʰ";s:1:"h";s:2:"ʱ";s:2:"ɦ";s:2:"ʲ";s:1:"j";s:2:"ʳ";s:1:"r";s:2:"ʴ";s:2:"ɹ";s:2:"ʵ";s:2:"ɻ";s:2:"ʶ";s:2:"ʁ";s:2:"ʷ";s:1:"w";s:2:"ʸ";s:1:"y";s:2:"˘";s:3:" ̆";s:2:"˙";s:3:" ̇";s:2:"˚";s:3:" ̊";s:2:"˛";s:3:" ̨";s:2:"˜";s:3:" ̃";s:2:"˝";s:3:" ̋";s:2:"ˠ";s:2:"ɣ";s:2:"ˡ";s:1:"l";s:2:"ˢ";s:1:"s";s:2:"ˣ";s:1:"x";s:2:"ˤ";s:2:"ʕ";s:2:"̀";s:2:"̀";s:2:"́";s:2:"́";s:2:"̓";s:2:"̓";s:2:"̈́";s:4:"̈́";s:2:"ʹ";s:2:"ʹ";s:2:"ͺ";s:3:" ͅ";s:2:";";s:1:";";s:2:"΄";s:3:" ́";s:2:"΅";s:5:" ̈́";s:2:"Ά";s:4:"Ά";s:2:"·";s:2:"·";s:2:"Έ";s:4:"Έ";s:2:"Ή";s:4:"Ή";s:2:"Ί";s:4:"Ί";s:2:"Ό";s:4:"Ό";s:2:"Ύ";s:4:"Ύ";s:2:"Ώ";s:4:"Ώ";s:2:"ΐ";s:6:"ΐ";s:2:"Ϊ";s:4:"Ϊ";s:2:"Ϋ";s:4:"Ϋ";s:2:"ά";s:4:"ά";s:2:"έ";s:4:"έ";s:2:"ή";s:4:"ή";s:2:"ί";s:4:"ί";s:2:"ΰ";s:6:"ΰ";s:2:"ϊ";s:4:"ϊ";s:2:"ϋ";s:4:"ϋ";s:2:"ό";s:4:"ό";s:2:"ύ";s:4:"ύ";s:2:"ώ";s:4:"ώ";s:2:"ϐ";s:2:"β";s:2:"ϑ";s:2:"θ";s:2:"ϒ";s:2:"Υ";s:2:"ϓ";s:4:"Ύ";s:2:"ϔ";s:4:"Ϋ";s:2:"ϕ";s:2:"φ";s:2:"ϖ";s:2:"π";s:2:"ϰ";s:2:"κ";s:2:"ϱ";s:2:"ρ";s:2:"ϲ";s:2:"ς";s:2:"ϴ";s:2:"Θ";s:2:"ϵ";s:2:"ε";s:2:"Ϲ";s:2:"Σ";s:2:"Ѐ";s:4:"Ѐ";s:2:"Ё";s:4:"Ё";s:2:"Ѓ";s:4:"Ѓ";s:2:"Ї";s:4:"Ї";s:2:"Ќ";s:4:"Ќ";s:2:"Ѝ";s:4:"Ѝ";s:2:"Ў";s:4:"Ў";s:2:"Й";s:4:"Й";s:2:"й";s:4:"й";s:2:"ѐ";s:4:"ѐ";s:2:"ё";s:4:"ё";s:2:"ѓ";s:4:"ѓ";s:2:"ї";s:4:"ї";s:2:"ќ";s:4:"ќ";s:2:"ѝ";s:4:"ѝ";s:2:"ў";s:4:"ў";s:2:"Ѷ";s:4:"Ѷ";s:2:"ѷ";s:4:"ѷ";s:2:"Ӂ";s:4:"Ӂ";s:2:"ӂ";s:4:"ӂ";s:2:"Ӑ";s:4:"Ӑ";s:2:"ӑ";s:4:"ӑ";s:2:"Ӓ";s:4:"Ӓ";s:2:"ӓ";s:4:"ӓ";s:2:"Ӗ";s:4:"Ӗ";s:2:"ӗ";s:4:"ӗ";s:2:"Ӛ";s:4:"Ӛ";s:2:"ӛ";s:4:"ӛ";s:2:"Ӝ";s:4:"Ӝ";s:2:"ӝ";s:4:"ӝ";s:2:"Ӟ";s:4:"Ӟ";s:2:"ӟ";s:4:"ӟ";s:2:"Ӣ";s:4:"Ӣ";s:2:"ӣ";s:4:"ӣ";s:2:"Ӥ";s:4:"Ӥ";s:2:"ӥ";s:4:"ӥ";s:2:"Ӧ";s:4:"Ӧ";s:2:"ӧ";s:4:"ӧ";s:2:"Ӫ";s:4:"Ӫ";s:2:"ӫ";s:4:"ӫ";s:2:"Ӭ";s:4:"Ӭ";s:2:"ӭ";s:4:"ӭ";s:2:"Ӯ";s:4:"Ӯ";s:2:"ӯ";s:4:"ӯ";s:2:"Ӱ";s:4:"Ӱ";s:2:"ӱ";s:4:"ӱ";s:2:"Ӳ";s:4:"Ӳ";s:2:"ӳ";s:4:"ӳ";s:2:"Ӵ";s:4:"Ӵ";s:2:"ӵ";s:4:"ӵ";s:2:"Ӹ";s:4:"Ӹ";s:2:"ӹ";s:4:"ӹ";s:2:"և";s:4:"եւ";s:2:"آ";s:4:"آ";s:2:"أ";s:4:"أ";s:2:"ؤ";s:4:"ؤ";s:2:"إ";s:4:"إ";s:2:"ئ";s:4:"ئ";s:2:"ٵ";s:4:"اٴ";s:2:"ٶ";s:4:"وٴ";s:2:"ٷ";s:4:"ۇٴ";s:2:"ٸ";s:4:"يٴ";s:2:"ۀ";s:4:"ۀ";s:2:"ۂ";s:4:"ۂ";s:2:"ۓ";s:4:"ۓ";s:3:"ऩ";s:6:"ऩ";s:3:"ऱ";s:6:"ऱ";s:3:"ऴ";s:6:"ऴ";s:3:"क़";s:6:"क़";s:3:"ख़";s:6:"ख़";s:3:"ग़";s:6:"ग़";s:3:"ज़";s:6:"ज़";s:3:"ड़";s:6:"ड़";s:3:"ढ़";s:6:"ढ़";s:3:"फ़";s:6:"फ़";s:3:"य़";s:6:"य़";s:3:"ো";s:6:"ো";s:3:"ৌ";s:6:"ৌ";s:3:"ড়";s:6:"ড়";s:3:"ঢ়";s:6:"ঢ়";s:3:"য়";s:6:"য়";s:3:"ਲ਼";s:6:"ਲ਼";s:3:"ਸ਼";s:6:"ਸ਼";s:3:"ਖ਼";s:6:"ਖ਼";s:3:"ਗ਼";s:6:"ਗ਼";s:3:"ਜ਼";s:6:"ਜ਼";s:3:"ਫ਼";s:6:"ਫ਼";s:3:"ୈ";s:6:"ୈ";s:3:"ୋ";s:6:"ୋ";s:3:"ୌ";s:6:"ୌ";s:3:"ଡ଼";s:6:"ଡ଼";s:3:"ଢ଼";s:6:"ଢ଼";s:3:"ஔ";s:6:"ஔ";s:3:"ொ";s:6:"ொ";s:3:"ோ";s:6:"ோ";s:3:"ௌ";s:6:"ௌ";s:3:"ై";s:6:"ై";s:3:"ೀ";s:6:"ೀ";s:3:"ೇ";s:6:"ೇ";s:3:"ೈ";s:6:"ೈ";s:3:"ೊ";s:6:"ೊ";s:3:"ೋ";s:9:"ೋ";s:3:"ൊ";s:6:"ൊ";s:3:"ോ";s:6:"ോ";s:3:"ൌ";s:6:"ൌ";s:3:"ේ";s:6:"ේ";s:3:"ො";s:6:"ො";s:3:"ෝ";s:9:"ෝ";s:3:"ෞ";s:6:"ෞ";s:3:"ำ";s:6:"ํา";s:3:"ຳ";s:6:"ໍາ";s:3:"ໜ";s:6:"ຫນ";s:3:"ໝ";s:6:"ຫມ";s:3:"༌";s:3:"་";s:3:"གྷ";s:6:"གྷ";s:3:"ཌྷ";s:6:"ཌྷ";s:3:"དྷ";s:6:"དྷ";s:3:"བྷ";s:6:"བྷ";s:3:"ཛྷ";s:6:"ཛྷ";s:3:"ཀྵ";s:6:"ཀྵ";s:3:"ཱི";s:6:"ཱི";s:3:"ཱུ";s:6:"ཱུ";s:3:"ྲྀ";s:6:"ྲྀ";s:3:"ཷ";s:9:"ྲཱྀ";s:3:"ླྀ";s:6:"ླྀ";s:3:"ཹ";s:9:"ླཱྀ";s:3:"ཱྀ";s:6:"ཱྀ";s:3:"ྒྷ";s:6:"ྒྷ";s:3:"ྜྷ";s:6:"ྜྷ";s:3:"ྡྷ";s:6:"ྡྷ";s:3:"ྦྷ";s:6:"ྦྷ";s:3:"ྫྷ";s:6:"ྫྷ";s:3:"ྐྵ";s:6:"ྐྵ";s:3:"ဦ";s:6:"ဦ";s:3:"ჼ";s:3:"ნ";s:3:"ᬆ";s:6:"ᬆ";s:3:"ᬈ";s:6:"ᬈ";s:3:"ᬊ";s:6:"ᬊ";s:3:"ᬌ";s:6:"ᬌ";s:3:"ᬎ";s:6:"ᬎ";s:3:"ᬒ";s:6:"ᬒ";s:3:"ᬻ";s:6:"ᬻ";s:3:"ᬽ";s:6:"ᬽ";s:3:"ᭀ";s:6:"ᭀ";s:3:"ᭁ";s:6:"ᭁ";s:3:"ᭃ";s:6:"ᭃ";s:3:"ᴬ";s:1:"A";s:3:"ᴭ";s:2:"Æ";s:3:"ᴮ";s:1:"B";s:3:"ᴰ";s:1:"D";s:3:"ᴱ";s:1:"E";s:3:"ᴲ";s:2:"Ǝ";s:3:"ᴳ";s:1:"G";s:3:"ᴴ";s:1:"H";s:3:"ᴵ";s:1:"I";s:3:"ᴶ";s:1:"J";s:3:"ᴷ";s:1:"K";s:3:"ᴸ";s:1:"L";s:3:"ᴹ";s:1:"M";s:3:"ᴺ";s:1:"N";s:3:"ᴼ";s:1:"O";s:3:"ᴽ";s:2:"Ȣ";s:3:"ᴾ";s:1:"P";s:3:"ᴿ";s:1:"R";s:3:"ᵀ";s:1:"T";s:3:"ᵁ";s:1:"U";s:3:"ᵂ";s:1:"W";s:3:"ᵃ";s:1:"a";s:3:"ᵄ";s:2:"ɐ";s:3:"ᵅ";s:2:"ɑ";s:3:"ᵆ";s:3:"ᴂ";s:3:"ᵇ";s:1:"b";s:3:"ᵈ";s:1:"d";s:3:"ᵉ";s:1:"e";s:3:"ᵊ";s:2:"ə";s:3:"ᵋ";s:2:"ɛ";s:3:"ᵌ";s:2:"ɜ";s:3:"ᵍ";s:1:"g";s:3:"ᵏ";s:1:"k";s:3:"ᵐ";s:1:"m";s:3:"ᵑ";s:2:"ŋ";s:3:"ᵒ";s:1:"o";s:3:"ᵓ";s:2:"ɔ";s:3:"ᵔ";s:3:"ᴖ";s:3:"ᵕ";s:3:"ᴗ";s:3:"ᵖ";s:1:"p";s:3:"ᵗ";s:1:"t";s:3:"ᵘ";s:1:"u";s:3:"ᵙ";s:3:"ᴝ";s:3:"ᵚ";s:2:"ɯ";s:3:"ᵛ";s:1:"v";s:3:"ᵜ";s:3:"ᴥ";s:3:"ᵝ";s:2:"β";s:3:"ᵞ";s:2:"γ";s:3:"ᵟ";s:2:"δ";s:3:"ᵠ";s:2:"φ";s:3:"ᵡ";s:2:"χ";s:3:"ᵢ";s:1:"i";s:3:"ᵣ";s:1:"r";s:3:"ᵤ";s:1:"u";s:3:"ᵥ";s:1:"v";s:3:"ᵦ";s:2:"β";s:3:"ᵧ";s:2:"γ";s:3:"ᵨ";s:2:"ρ";s:3:"ᵩ";s:2:"φ";s:3:"ᵪ";s:2:"χ";s:3:"ᵸ";s:2:"н";s:3:"ᶛ";s:2:"ɒ";s:3:"ᶜ";s:1:"c";s:3:"ᶝ";s:2:"ɕ";s:3:"ᶞ";s:2:"ð";s:3:"ᶟ";s:2:"ɜ";s:3:"ᶠ";s:1:"f";s:3:"ᶡ";s:2:"ɟ";s:3:"ᶢ";s:2:"ɡ";s:3:"ᶣ";s:2:"ɥ";s:3:"ᶤ";s:2:"ɨ";s:3:"ᶥ";s:2:"ɩ";s:3:"ᶦ";s:2:"ɪ";s:3:"ᶧ";s:3:"ᵻ";s:3:"ᶨ";s:2:"ʝ";s:3:"ᶩ";s:2:"ɭ";s:3:"ᶪ";s:3:"ᶅ";s:3:"ᶫ";s:2:"ʟ";s:3:"ᶬ";s:2:"ɱ";s:3:"ᶭ";s:2:"ɰ";s:3:"ᶮ";s:2:"ɲ";s:3:"ᶯ";s:2:"ɳ";s:3:"ᶰ";s:2:"ɴ";s:3:"ᶱ";s:2:"ɵ";s:3:"ᶲ";s:2:"ɸ";s:3:"ᶳ";s:2:"ʂ";s:3:"ᶴ";s:2:"ʃ";s:3:"ᶵ";s:2:"ƫ";s:3:"ᶶ";s:2:"ʉ";s:3:"ᶷ";s:2:"ʊ";s:3:"ᶸ";s:3:"ᴜ";s:3:"ᶹ";s:2:"ʋ";s:3:"ᶺ";s:2:"ʌ";s:3:"ᶻ";s:1:"z";s:3:"ᶼ";s:2:"ʐ";s:3:"ᶽ";s:2:"ʑ";s:3:"ᶾ";s:2:"ʒ";s:3:"ᶿ";s:2:"θ";s:3:"Ḁ";s:3:"Ḁ";s:3:"ḁ";s:3:"ḁ";s:3:"Ḃ";s:3:"Ḃ";s:3:"ḃ";s:3:"ḃ";s:3:"Ḅ";s:3:"Ḅ";s:3:"ḅ";s:3:"ḅ";s:3:"Ḇ";s:3:"Ḇ";s:3:"ḇ";s:3:"ḇ";s:3:"Ḉ";s:5:"Ḉ";s:3:"ḉ";s:5:"ḉ";s:3:"Ḋ";s:3:"Ḋ";s:3:"ḋ";s:3:"ḋ";s:3:"Ḍ";s:3:"Ḍ";s:3:"ḍ";s:3:"ḍ";s:3:"Ḏ";s:3:"Ḏ";s:3:"ḏ";s:3:"ḏ";s:3:"Ḑ";s:3:"Ḑ";s:3:"ḑ";s:3:"ḑ";s:3:"Ḓ";s:3:"Ḓ";s:3:"ḓ";s:3:"ḓ";s:3:"Ḕ";s:5:"Ḕ";s:3:"ḕ";s:5:"ḕ";s:3:"Ḗ";s:5:"Ḗ";s:3:"ḗ";s:5:"ḗ";s:3:"Ḙ";s:3:"Ḙ";s:3:"ḙ";s:3:"ḙ";s:3:"Ḛ";s:3:"Ḛ";s:3:"ḛ";s:3:"ḛ";s:3:"Ḝ";s:5:"Ḝ";s:3:"ḝ";s:5:"ḝ";s:3:"Ḟ";s:3:"Ḟ";s:3:"ḟ";s:3:"ḟ";s:3:"Ḡ";s:3:"Ḡ";s:3:"ḡ";s:3:"ḡ";s:3:"Ḣ";s:3:"Ḣ";s:3:"ḣ";s:3:"ḣ";s:3:"Ḥ";s:3:"Ḥ";s:3:"ḥ";s:3:"ḥ";s:3:"Ḧ";s:3:"Ḧ";s:3:"ḧ";s:3:"ḧ";s:3:"Ḩ";s:3:"Ḩ";s:3:"ḩ";s:3:"ḩ";s:3:"Ḫ";s:3:"Ḫ";s:3:"ḫ";s:3:"ḫ";s:3:"Ḭ";s:3:"Ḭ";s:3:"ḭ";s:3:"ḭ";s:3:"Ḯ";s:5:"Ḯ";s:3:"ḯ";s:5:"ḯ";s:3:"Ḱ";s:3:"Ḱ";s:3:"ḱ";s:3:"ḱ";s:3:"Ḳ";s:3:"Ḳ";s:3:"ḳ";s:3:"ḳ";s:3:"Ḵ";s:3:"Ḵ";s:3:"ḵ";s:3:"ḵ";s:3:"Ḷ";s:3:"Ḷ";s:3:"ḷ";s:3:"ḷ";s:3:"Ḹ";s:5:"Ḹ";s:3:"ḹ";s:5:"ḹ";s:3:"Ḻ";s:3:"Ḻ";s:3:"ḻ";s:3:"ḻ";s:3:"Ḽ";s:3:"Ḽ";s:3:"ḽ";s:3:"ḽ";s:3:"Ḿ";s:3:"Ḿ";s:3:"ḿ";s:3:"ḿ";s:3:"Ṁ";s:3:"Ṁ";s:3:"ṁ";s:3:"ṁ";s:3:"Ṃ";s:3:"Ṃ";s:3:"ṃ";s:3:"ṃ";s:3:"Ṅ";s:3:"Ṅ";s:3:"ṅ";s:3:"ṅ";s:3:"Ṇ";s:3:"Ṇ";s:3:"ṇ";s:3:"ṇ";s:3:"Ṉ";s:3:"Ṉ";s:3:"ṉ";s:3:"ṉ";s:3:"Ṋ";s:3:"Ṋ";s:3:"ṋ";s:3:"ṋ";s:3:"Ṍ";s:5:"Ṍ";s:3:"ṍ";s:5:"ṍ";s:3:"Ṏ";s:5:"Ṏ";s:3:"ṏ";s:5:"ṏ";s:3:"Ṑ";s:5:"Ṑ";s:3:"ṑ";s:5:"ṑ";s:3:"Ṓ";s:5:"Ṓ";s:3:"ṓ";s:5:"ṓ";s:3:"Ṕ";s:3:"Ṕ";s:3:"ṕ";s:3:"ṕ";s:3:"Ṗ";s:3:"Ṗ";s:3:"ṗ";s:3:"ṗ";s:3:"Ṙ";s:3:"Ṙ";s:3:"ṙ";s:3:"ṙ";s:3:"Ṛ";s:3:"Ṛ";s:3:"ṛ";s:3:"ṛ";s:3:"Ṝ";s:5:"Ṝ";s:3:"ṝ";s:5:"ṝ";s:3:"Ṟ";s:3:"Ṟ";s:3:"ṟ";s:3:"ṟ";s:3:"Ṡ";s:3:"Ṡ";s:3:"ṡ";s:3:"ṡ";s:3:"Ṣ";s:3:"Ṣ";s:3:"ṣ";s:3:"ṣ";s:3:"Ṥ";s:5:"Ṥ";s:3:"ṥ";s:5:"ṥ";s:3:"Ṧ";s:5:"Ṧ";s:3:"ṧ";s:5:"ṧ";s:3:"Ṩ";s:5:"Ṩ";s:3:"ṩ";s:5:"ṩ";s:3:"Ṫ";s:3:"Ṫ";s:3:"ṫ";s:3:"ṫ";s:3:"Ṭ";s:3:"Ṭ";s:3:"ṭ";s:3:"ṭ";s:3:"Ṯ";s:3:"Ṯ";s:3:"ṯ";s:3:"ṯ";s:3:"Ṱ";s:3:"Ṱ";s:3:"ṱ";s:3:"ṱ";s:3:"Ṳ";s:3:"Ṳ";s:3:"ṳ";s:3:"ṳ";s:3:"Ṵ";s:3:"Ṵ";s:3:"ṵ";s:3:"ṵ";s:3:"Ṷ";s:3:"Ṷ";s:3:"ṷ";s:3:"ṷ";s:3:"Ṹ";s:5:"Ṹ";s:3:"ṹ";s:5:"ṹ";s:3:"Ṻ";s:5:"Ṻ";s:3:"ṻ";s:5:"ṻ";s:3:"Ṽ";s:3:"Ṽ";s:3:"ṽ";s:3:"ṽ";s:3:"Ṿ";s:3:"Ṿ";s:3:"ṿ";s:3:"ṿ";s:3:"Ẁ";s:3:"Ẁ";s:3:"ẁ";s:3:"ẁ";s:3:"Ẃ";s:3:"Ẃ";s:3:"ẃ";s:3:"ẃ";s:3:"Ẅ";s:3:"Ẅ";s:3:"ẅ";s:3:"ẅ";s:3:"Ẇ";s:3:"Ẇ";s:3:"ẇ";s:3:"ẇ";s:3:"Ẉ";s:3:"Ẉ";s:3:"ẉ";s:3:"ẉ";s:3:"Ẋ";s:3:"Ẋ";s:3:"ẋ";s:3:"ẋ";s:3:"Ẍ";s:3:"Ẍ";s:3:"ẍ";s:3:"ẍ";s:3:"Ẏ";s:3:"Ẏ";s:3:"ẏ";s:3:"ẏ";s:3:"Ẑ";s:3:"Ẑ";s:3:"ẑ";s:3:"ẑ";s:3:"Ẓ";s:3:"Ẓ";s:3:"ẓ";s:3:"ẓ";s:3:"Ẕ";s:3:"Ẕ";s:3:"ẕ";s:3:"ẕ";s:3:"ẖ";s:3:"ẖ";s:3:"ẗ";s:3:"ẗ";s:3:"ẘ";s:3:"ẘ";s:3:"ẙ";s:3:"ẙ";s:3:"ẚ";s:3:"aʾ";s:3:"ẛ";s:3:"ṡ";s:3:"Ạ";s:3:"Ạ";s:3:"ạ";s:3:"ạ";s:3:"Ả";s:3:"Ả";s:3:"ả";s:3:"ả";s:3:"Ấ";s:5:"Ấ";s:3:"ấ";s:5:"ấ";s:3:"Ầ";s:5:"Ầ";s:3:"ầ";s:5:"ầ";s:3:"Ẩ";s:5:"Ẩ";s:3:"ẩ";s:5:"ẩ";s:3:"Ẫ";s:5:"Ẫ";s:3:"ẫ";s:5:"ẫ";s:3:"Ậ";s:5:"Ậ";s:3:"ậ";s:5:"ậ";s:3:"Ắ";s:5:"Ắ";s:3:"ắ";s:5:"ắ";s:3:"Ằ";s:5:"Ằ";s:3:"ằ";s:5:"ằ";s:3:"Ẳ";s:5:"Ẳ";s:3:"ẳ";s:5:"ẳ";s:3:"Ẵ";s:5:"Ẵ";s:3:"ẵ";s:5:"ẵ";s:3:"Ặ";s:5:"Ặ";s:3:"ặ";s:5:"ặ";s:3:"Ẹ";s:3:"Ẹ";s:3:"ẹ";s:3:"ẹ";s:3:"Ẻ";s:3:"Ẻ";s:3:"ẻ";s:3:"ẻ";s:3:"Ẽ";s:3:"Ẽ";s:3:"ẽ";s:3:"ẽ";s:3:"Ế";s:5:"Ế";s:3:"ế";s:5:"ế";s:3:"Ề";s:5:"Ề";s:3:"ề";s:5:"ề";s:3:"Ể";s:5:"Ể";s:3:"ể";s:5:"ể";s:3:"Ễ";s:5:"Ễ";s:3:"ễ";s:5:"ễ";s:3:"Ệ";s:5:"Ệ";s:3:"ệ";s:5:"ệ";s:3:"Ỉ";s:3:"Ỉ";s:3:"ỉ";s:3:"ỉ";s:3:"Ị";s:3:"Ị";s:3:"ị";s:3:"ị";s:3:"Ọ";s:3:"Ọ";s:3:"ọ";s:3:"ọ";s:3:"Ỏ";s:3:"Ỏ";s:3:"ỏ";s:3:"ỏ";s:3:"Ố";s:5:"Ố";s:3:"ố";s:5:"ố";s:3:"Ồ";s:5:"Ồ";s:3:"ồ";s:5:"ồ";s:3:"Ổ";s:5:"Ổ";s:3:"ổ";s:5:"ổ";s:3:"Ỗ";s:5:"Ỗ";s:3:"ỗ";s:5:"ỗ";s:3:"Ộ";s:5:"Ộ";s:3:"ộ";s:5:"ộ";s:3:"Ớ";s:5:"Ớ";s:3:"ớ";s:5:"ớ";s:3:"Ờ";s:5:"Ờ";s:3:"ờ";s:5:"ờ";s:3:"Ở";s:5:"Ở";s:3:"ở";s:5:"ở";s:3:"Ỡ";s:5:"Ỡ";s:3:"ỡ";s:5:"ỡ";s:3:"Ợ";s:5:"Ợ";s:3:"ợ";s:5:"ợ";s:3:"Ụ";s:3:"Ụ";s:3:"ụ";s:3:"ụ";s:3:"Ủ";s:3:"Ủ";s:3:"ủ";s:3:"ủ";s:3:"Ứ";s:5:"Ứ";s:3:"ứ";s:5:"ứ";s:3:"Ừ";s:5:"Ừ";s:3:"ừ";s:5:"ừ";s:3:"Ử";s:5:"Ử";s:3:"ử";s:5:"ử";s:3:"Ữ";s:5:"Ữ";s:3:"ữ";s:5:"ữ";s:3:"Ự";s:5:"Ự";s:3:"ự";s:5:"ự";s:3:"Ỳ";s:3:"Ỳ";s:3:"ỳ";s:3:"ỳ";s:3:"Ỵ";s:3:"Ỵ";s:3:"ỵ";s:3:"ỵ";s:3:"Ỷ";s:3:"Ỷ";s:3:"ỷ";s:3:"ỷ";s:3:"Ỹ";s:3:"Ỹ";s:3:"ỹ";s:3:"ỹ";s:3:"ἀ";s:4:"ἀ";s:3:"ἁ";s:4:"ἁ";s:3:"ἂ";s:6:"ἂ";s:3:"ἃ";s:6:"ἃ";s:3:"ἄ";s:6:"ἄ";s:3:"ἅ";s:6:"ἅ";s:3:"ἆ";s:6:"ἆ";s:3:"ἇ";s:6:"ἇ";s:3:"Ἀ";s:4:"Ἀ";s:3:"Ἁ";s:4:"Ἁ";s:3:"Ἂ";s:6:"Ἂ";s:3:"Ἃ";s:6:"Ἃ";s:3:"Ἄ";s:6:"Ἄ";s:3:"Ἅ";s:6:"Ἅ";s:3:"Ἆ";s:6:"Ἆ";s:3:"Ἇ";s:6:"Ἇ";s:3:"ἐ";s:4:"ἐ";s:3:"ἑ";s:4:"ἑ";s:3:"ἒ";s:6:"ἒ";s:3:"ἓ";s:6:"ἓ";s:3:"ἔ";s:6:"ἔ";s:3:"ἕ";s:6:"ἕ";s:3:"Ἐ";s:4:"Ἐ";s:3:"Ἑ";s:4:"Ἑ";s:3:"Ἒ";s:6:"Ἒ";s:3:"Ἓ";s:6:"Ἓ";s:3:"Ἔ";s:6:"Ἔ";s:3:"Ἕ";s:6:"Ἕ";s:3:"ἠ";s:4:"ἠ";s:3:"ἡ";s:4:"ἡ";s:3:"ἢ";s:6:"ἢ";s:3:"ἣ";s:6:"ἣ";s:3:"ἤ";s:6:"ἤ";s:3:"ἥ";s:6:"ἥ";s:3:"ἦ";s:6:"ἦ";s:3:"ἧ";s:6:"ἧ";s:3:"Ἠ";s:4:"Ἠ";s:3:"Ἡ";s:4:"Ἡ";s:3:"Ἢ";s:6:"Ἢ";s:3:"Ἣ";s:6:"Ἣ";s:3:"Ἤ";s:6:"Ἤ";s:3:"Ἥ";s:6:"Ἥ";s:3:"Ἦ";s:6:"Ἦ";s:3:"Ἧ";s:6:"Ἧ";s:3:"ἰ";s:4:"ἰ";s:3:"ἱ";s:4:"ἱ";s:3:"ἲ";s:6:"ἲ";s:3:"ἳ";s:6:"ἳ";s:3:"ἴ";s:6:"ἴ";s:3:"ἵ";s:6:"ἵ";s:3:"ἶ";s:6:"ἶ";s:3:"ἷ";s:6:"ἷ";s:3:"Ἰ";s:4:"Ἰ";s:3:"Ἱ";s:4:"Ἱ";s:3:"Ἲ";s:6:"Ἲ";s:3:"Ἳ";s:6:"Ἳ";s:3:"Ἴ";s:6:"Ἴ";s:3:"Ἵ";s:6:"Ἵ";s:3:"Ἶ";s:6:"Ἶ";s:3:"Ἷ";s:6:"Ἷ";s:3:"ὀ";s:4:"ὀ";s:3:"ὁ";s:4:"ὁ";s:3:"ὂ";s:6:"ὂ";s:3:"ὃ";s:6:"ὃ";s:3:"ὄ";s:6:"ὄ";s:3:"ὅ";s:6:"ὅ";s:3:"Ὀ";s:4:"Ὀ";s:3:"Ὁ";s:4:"Ὁ";s:3:"Ὂ";s:6:"Ὂ";s:3:"Ὃ";s:6:"Ὃ";s:3:"Ὄ";s:6:"Ὄ";s:3:"Ὅ";s:6:"Ὅ";s:3:"ὐ";s:4:"ὐ";s:3:"ὑ";s:4:"ὑ";s:3:"ὒ";s:6:"ὒ";s:3:"ὓ";s:6:"ὓ";s:3:"ὔ";s:6:"ὔ";s:3:"ὕ";s:6:"ὕ";s:3:"ὖ";s:6:"ὖ";s:3:"ὗ";s:6:"ὗ";s:3:"Ὑ";s:4:"Ὑ";s:3:"Ὓ";s:6:"Ὓ";s:3:"Ὕ";s:6:"Ὕ";s:3:"Ὗ";s:6:"Ὗ";s:3:"ὠ";s:4:"ὠ";s:3:"ὡ";s:4:"ὡ";s:3:"ὢ";s:6:"ὢ";s:3:"ὣ";s:6:"ὣ";s:3:"ὤ";s:6:"ὤ";s:3:"ὥ";s:6:"ὥ";s:3:"ὦ";s:6:"ὦ";s:3:"ὧ";s:6:"ὧ";s:3:"Ὠ";s:4:"Ὠ";s:3:"Ὡ";s:4:"Ὡ";s:3:"Ὢ";s:6:"Ὢ";s:3:"Ὣ";s:6:"Ὣ";s:3:"Ὤ";s:6:"Ὤ";s:3:"Ὥ";s:6:"Ὥ";s:3:"Ὦ";s:6:"Ὦ";s:3:"Ὧ";s:6:"Ὧ";s:3:"ὰ";s:4:"ὰ";s:3:"ά";s:4:"ά";s:3:"ὲ";s:4:"ὲ";s:3:"έ";s:4:"έ";s:3:"ὴ";s:4:"ὴ";s:3:"ή";s:4:"ή";s:3:"ὶ";s:4:"ὶ";s:3:"ί";s:4:"ί";s:3:"ὸ";s:4:"ὸ";s:3:"ό";s:4:"ό";s:3:"ὺ";s:4:"ὺ";s:3:"ύ";s:4:"ύ";s:3:"ὼ";s:4:"ὼ";s:3:"ώ";s:4:"ώ";s:3:"ᾀ";s:6:"ᾀ";s:3:"ᾁ";s:6:"ᾁ";s:3:"ᾂ";s:8:"ᾂ";s:3:"ᾃ";s:8:"ᾃ";s:3:"ᾄ";s:8:"ᾄ";s:3:"ᾅ";s:8:"ᾅ";s:3:"ᾆ";s:8:"ᾆ";s:3:"ᾇ";s:8:"ᾇ";s:3:"ᾈ";s:6:"ᾈ";s:3:"ᾉ";s:6:"ᾉ";s:3:"ᾊ";s:8:"ᾊ";s:3:"ᾋ";s:8:"ᾋ";s:3:"ᾌ";s:8:"ᾌ";s:3:"ᾍ";s:8:"ᾍ";s:3:"ᾎ";s:8:"ᾎ";s:3:"ᾏ";s:8:"ᾏ";s:3:"ᾐ";s:6:"ᾐ";s:3:"ᾑ";s:6:"ᾑ";s:3:"ᾒ";s:8:"ᾒ";s:3:"ᾓ";s:8:"ᾓ";s:3:"ᾔ";s:8:"ᾔ";s:3:"ᾕ";s:8:"ᾕ";s:3:"ᾖ";s:8:"ᾖ";s:3:"ᾗ";s:8:"ᾗ";s:3:"ᾘ";s:6:"ᾘ";s:3:"ᾙ";s:6:"ᾙ";s:3:"ᾚ";s:8:"ᾚ";s:3:"ᾛ";s:8:"ᾛ";s:3:"ᾜ";s:8:"ᾜ";s:3:"ᾝ";s:8:"ᾝ";s:3:"ᾞ";s:8:"ᾞ";s:3:"ᾟ";s:8:"ᾟ";s:3:"ᾠ";s:6:"ᾠ";s:3:"ᾡ";s:6:"ᾡ";s:3:"ᾢ";s:8:"ᾢ";s:3:"ᾣ";s:8:"ᾣ";s:3:"ᾤ";s:8:"ᾤ";s:3:"ᾥ";s:8:"ᾥ";s:3:"ᾦ";s:8:"ᾦ";s:3:"ᾧ";s:8:"ᾧ";s:3:"ᾨ";s:6:"ᾨ";s:3:"ᾩ";s:6:"ᾩ";s:3:"ᾪ";s:8:"ᾪ";s:3:"ᾫ";s:8:"ᾫ";s:3:"ᾬ";s:8:"ᾬ";s:3:"ᾭ";s:8:"ᾭ";s:3:"ᾮ";s:8:"ᾮ";s:3:"ᾯ";s:8:"ᾯ";s:3:"ᾰ";s:4:"ᾰ";s:3:"ᾱ";s:4:"ᾱ";s:3:"ᾲ";s:6:"ᾲ";s:3:"ᾳ";s:4:"ᾳ";s:3:"ᾴ";s:6:"ᾴ";s:3:"ᾶ";s:4:"ᾶ";s:3:"ᾷ";s:6:"ᾷ";s:3:"Ᾰ";s:4:"Ᾰ";s:3:"Ᾱ";s:4:"Ᾱ";s:3:"Ὰ";s:4:"Ὰ";s:3:"Ά";s:4:"Ά";s:3:"ᾼ";s:4:"ᾼ";s:3:"᾽";s:3:" ̓";s:3:"ι";s:2:"ι";s:3:"᾿";s:3:" ̓";s:3:"῀";s:3:" ͂";s:3:"῁";s:5:" ̈͂";s:3:"ῂ";s:6:"ῂ";s:3:"ῃ";s:4:"ῃ";s:3:"ῄ";s:6:"ῄ";s:3:"ῆ";s:4:"ῆ";s:3:"ῇ";s:6:"ῇ";s:3:"Ὲ";s:4:"Ὲ";s:3:"Έ";s:4:"Έ";s:3:"Ὴ";s:4:"Ὴ";s:3:"Ή";s:4:"Ή";s:3:"ῌ";s:4:"ῌ";s:3:"῍";s:5:" ̓̀";s:3:"῎";s:5:" ̓́";s:3:"῏";s:5:" ̓͂";s:3:"ῐ";s:4:"ῐ";s:3:"ῑ";s:4:"ῑ";s:3:"ῒ";s:6:"ῒ";s:3:"ΐ";s:6:"ΐ";s:3:"ῖ";s:4:"ῖ";s:3:"ῗ";s:6:"ῗ";s:3:"Ῐ";s:4:"Ῐ";s:3:"Ῑ";s:4:"Ῑ";s:3:"Ὶ";s:4:"Ὶ";s:3:"Ί";s:4:"Ί";s:3:"῝";s:5:" ̔̀";s:3:"῞";s:5:" ̔́";s:3:"῟";s:5:" ̔͂";s:3:"ῠ";s:4:"ῠ";s:3:"ῡ";s:4:"ῡ";s:3:"ῢ";s:6:"ῢ";s:3:"ΰ";s:6:"ΰ";s:3:"ῤ";s:4:"ῤ";s:3:"ῥ";s:4:"ῥ";s:3:"ῦ";s:4:"ῦ";s:3:"ῧ";s:6:"ῧ";s:3:"Ῠ";s:4:"Ῠ";s:3:"Ῡ";s:4:"Ῡ";s:3:"Ὺ";s:4:"Ὺ";s:3:"Ύ";s:4:"Ύ";s:3:"Ῥ";s:4:"Ῥ";s:3:"῭";s:5:" ̈̀";s:3:"΅";s:5:" ̈́";s:3:"`";s:1:"`";s:3:"ῲ";s:6:"ῲ";s:3:"ῳ";s:4:"ῳ";s:3:"ῴ";s:6:"ῴ";s:3:"ῶ";s:4:"ῶ";s:3:"ῷ";s:6:"ῷ";s:3:"Ὸ";s:4:"Ὸ";s:3:"Ό";s:4:"Ό";s:3:"Ὼ";s:4:"Ὼ";s:3:"Ώ";s:4:"Ώ";s:3:"ῼ";s:4:"ῼ";s:3:"´";s:3:" ́";s:3:"῾";s:3:" ̔";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:"‑";s:3:"‐";s:3:"‗";s:3:" ̳";s:3:"․";s:1:".";s:3:"‥";s:2:"..";s:3:"…";s:3:"...";s:3:" ";s:1:" ";s:3:"″";s:6:"′′";s:3:"‴";s:9:"′′′";s:3:"‶";s:6:"‵‵";s:3:"‷";s:9:"‵‵‵";s:3:"‼";s:2:"!!";s:3:"‾";s:3:" ̅";s:3:"⁇";s:2:"??";s:3:"⁈";s:2:"?!";s:3:"⁉";s:2:"!?";s:3:"⁗";s:12:"′′′′";s:3:" ";s:1:" ";s:3:"⁰";s:1:"0";s:3:"ⁱ";s:1:"i";s:3:"⁴";s:1:"4";s:3:"⁵";s:1:"5";s:3:"⁶";s:1:"6";s:3:"⁷";s:1:"7";s:3:"⁸";s:1:"8";s:3:"⁹";s:1:"9";s:3:"⁺";s:1:"+";s:3:"⁻";s:3:"−";s:3:"⁼";s:1:"=";s:3:"⁽";s:1:"(";s:3:"⁾";s:1:")";s:3:"ⁿ";s:1:"n";s:3:"₀";s:1:"0";s:3:"₁";s:1:"1";s:3:"₂";s:1:"2";s:3:"₃";s:1:"3";s:3:"₄";s:1:"4";s:3:"₅";s:1:"5";s:3:"₆";s:1:"6";s:3:"₇";s:1:"7";s:3:"₈";s:1:"8";s:3:"₉";s:1:"9";s:3:"₊";s:1:"+";s:3:"₋";s:3:"−";s:3:"₌";s:1:"=";s:3:"₍";s:1:"(";s:3:"₎";s:1:")";s:3:"ₐ";s:1:"a";s:3:"ₑ";s:1:"e";s:3:"ₒ";s:1:"o";s:3:"ₓ";s:1:"x";s:3:"ₔ";s:2:"ə";s:3:"ₕ";s:1:"h";s:3:"ₖ";s:1:"k";s:3:"ₗ";s:1:"l";s:3:"ₘ";s:1:"m";s:3:"ₙ";s:1:"n";s:3:"ₚ";s:1:"p";s:3:"ₛ";s:1:"s";s:3:"ₜ";s:1:"t";s:3:"₨";s:2:"Rs";s:3:"℀";s:3:"a/c";s:3:"℁";s:3:"a/s";s:3:"ℂ";s:1:"C";s:3:"℃";s:3:"°C";s:3:"℅";s:3:"c/o";s:3:"℆";s:3:"c/u";s:3:"ℇ";s:2:"Ɛ";s:3:"℉";s:3:"°F";s:3:"ℊ";s:1:"g";s:3:"ℋ";s:1:"H";s:3:"ℌ";s:1:"H";s:3:"ℍ";s:1:"H";s:3:"ℎ";s:1:"h";s:3:"ℏ";s:2:"ħ";s:3:"ℐ";s:1:"I";s:3:"ℑ";s:1:"I";s:3:"ℒ";s:1:"L";s:3:"ℓ";s:1:"l";s:3:"ℕ";s:1:"N";s:3:"№";s:2:"No";s:3:"ℙ";s:1:"P";s:3:"ℚ";s:1:"Q";s:3:"ℛ";s:1:"R";s:3:"ℜ";s:1:"R";s:3:"ℝ";s:1:"R";s:3:"℠";s:2:"SM";s:3:"℡";s:3:"TEL";s:3:"™";s:2:"TM";s:3:"ℤ";s:1:"Z";s:3:"Ω";s:2:"Ω";s:3:"ℨ";s:1:"Z";s:3:"K";s:1:"K";s:3:"Å";s:3:"Å";s:3:"ℬ";s:1:"B";s:3:"ℭ";s:1:"C";s:3:"ℯ";s:1:"e";s:3:"ℰ";s:1:"E";s:3:"ℱ";s:1:"F";s:3:"ℳ";s:1:"M";s:3:"ℴ";s:1:"o";s:3:"ℵ";s:2:"א";s:3:"ℶ";s:2:"ב";s:3:"ℷ";s:2:"ג";s:3:"ℸ";s:2:"ד";s:3:"ℹ";s:1:"i";s:3:"℻";s:3:"FAX";s:3:"ℼ";s:2:"π";s:3:"ℽ";s:2:"γ";s:3:"ℾ";s:2:"Γ";s:3:"ℿ";s:2:"Π";s:3:"⅀";s:3:"∑";s:3:"ⅅ";s:1:"D";s:3:"ⅆ";s:1:"d";s:3:"ⅇ";s:1:"e";s:3:"ⅈ";s:1:"i";s:3:"ⅉ";s:1:"j";s:3:"⅐";s:5:"1⁄7";s:3:"⅑";s:5:"1⁄9";s:3:"⅒";s:6:"1⁄10";s:3:"⅓";s:5:"1⁄3";s:3:"⅔";s:5:"2⁄3";s:3:"⅕";s:5:"1⁄5";s:3:"⅖";s:5:"2⁄5";s:3:"⅗";s:5:"3⁄5";s:3:"⅘";s:5:"4⁄5";s:3:"⅙";s:5:"1⁄6";s:3:"⅚";s:5:"5⁄6";s:3:"⅛";s:5:"1⁄8";s:3:"⅜";s:5:"3⁄8";s:3:"⅝";s:5:"5⁄8";s:3:"⅞";s:5:"7⁄8";s:3:"⅟";s:4:"1⁄";s:3:"Ⅰ";s:1:"I";s:3:"Ⅱ";s:2:"II";s:3:"Ⅲ";s:3:"III";s:3:"Ⅳ";s:2:"IV";s:3:"Ⅴ";s:1:"V";s:3:"Ⅵ";s:2:"VI";s:3:"Ⅶ";s:3:"VII";s:3:"Ⅷ";s:4:"VIII";s:3:"Ⅸ";s:2:"IX";s:3:"Ⅹ";s:1:"X";s:3:"Ⅺ";s:2:"XI";s:3:"Ⅻ";s:3:"XII";s:3:"Ⅼ";s:1:"L";s:3:"Ⅽ";s:1:"C";s:3:"Ⅾ";s:1:"D";s:3:"Ⅿ";s:1:"M";s:3:"ⅰ";s:1:"i";s:3:"ⅱ";s:2:"ii";s:3:"ⅲ";s:3:"iii";s:3:"ⅳ";s:2:"iv";s:3:"ⅴ";s:1:"v";s:3:"ⅵ";s:2:"vi";s:3:"ⅶ";s:3:"vii";s:3:"ⅷ";s:4:"viii";s:3:"ⅸ";s:2:"ix";s:3:"ⅹ";s:1:"x";s:3:"ⅺ";s:2:"xi";s:3:"ⅻ";s:3:"xii";s:3:"ⅼ";s:1:"l";s:3:"ⅽ";s:1:"c";s:3:"ⅾ";s:1:"d";s:3:"ⅿ";s:1:"m";s:3:"↉";s:5:"0⁄3";s:3:"↚";s:5:"↚";s:3:"↛";s:5:"↛";s:3:"↮";s:5:"↮";s:3:"⇍";s:5:"⇍";s:3:"⇎";s:5:"⇎";s:3:"⇏";s:5:"⇏";s:3:"∄";s:5:"∄";s:3:"∉";s:5:"∉";s:3:"∌";s:5:"∌";s:3:"∤";s:5:"∤";s:3:"∦";s:5:"∦";s:3:"∬";s:6:"∫∫";s:3:"∭";s:9:"∫∫∫";s:3:"∯";s:6:"∮∮";s:3:"∰";s:9:"∮∮∮";s:3:"≁";s:5:"≁";s:3:"≄";s:5:"≄";s:3:"≇";s:5:"≇";s:3:"≉";s:5:"≉";s:3:"≠";s:3:"≠";s:3:"≢";s:5:"≢";s:3:"≭";s:5:"≭";s:3:"≮";s:3:"≮";s:3:"≯";s:3:"≯";s:3:"≰";s:5:"≰";s:3:"≱";s:5:"≱";s:3:"≴";s:5:"≴";s:3:"≵";s:5:"≵";s:3:"≸";s:5:"≸";s:3:"≹";s:5:"≹";s:3:"⊀";s:5:"⊀";s:3:"⊁";s:5:"⊁";s:3:"⊄";s:5:"⊄";s:3:"⊅";s:5:"⊅";s:3:"⊈";s:5:"⊈";s:3:"⊉";s:5:"⊉";s:3:"⊬";s:5:"⊬";s:3:"⊭";s:5:"⊭";s:3:"⊮";s:5:"⊮";s:3:"⊯";s:5:"⊯";s:3:"⋠";s:5:"⋠";s:3:"⋡";s:5:"⋡";s:3:"⋢";s:5:"⋢";s:3:"⋣";s:5:"⋣";s:3:"⋪";s:5:"⋪";s:3:"⋫";s:5:"⋫";s:3:"⋬";s:5:"⋬";s:3:"⋭";s:5:"⋭";s:3:"〈";s:3:"〈";s:3:"〉";s:3:"〉";s:3:"①";s:1:"1";s:3:"②";s:1:"2";s:3:"③";s:1:"3";s:3:"④";s:1:"4";s:3:"⑤";s:1:"5";s:3:"⑥";s:1:"6";s:3:"⑦";s:1:"7";s:3:"⑧";s:1:"8";s:3:"⑨";s:1:"9";s:3:"⑩";s:2:"10";s:3:"⑪";s:2:"11";s:3:"⑫";s:2:"12";s:3:"⑬";s:2:"13";s:3:"⑭";s:2:"14";s:3:"⑮";s:2:"15";s:3:"⑯";s:2:"16";s:3:"⑰";s:2:"17";s:3:"⑱";s:2:"18";s:3:"⑲";s:2:"19";s:3:"⑳";s:2:"20";s:3:"⑴";s:3:"(1)";s:3:"⑵";s:3:"(2)";s:3:"⑶";s:3:"(3)";s:3:"⑷";s:3:"(4)";s:3:"⑸";s:3:"(5)";s:3:"⑹";s:3:"(6)";s:3:"⑺";s:3:"(7)";s:3:"⑻";s:3:"(8)";s:3:"⑼";s:3:"(9)";s:3:"⑽";s:4:"(10)";s:3:"⑾";s:4:"(11)";s:3:"⑿";s:4:"(12)";s:3:"⒀";s:4:"(13)";s:3:"⒁";s:4:"(14)";s:3:"⒂";s:4:"(15)";s:3:"⒃";s:4:"(16)";s:3:"⒄";s:4:"(17)";s:3:"⒅";s:4:"(18)";s:3:"⒆";s:4:"(19)";s:3:"⒇";s:4:"(20)";s:3:"⒈";s:2:"1.";s:3:"⒉";s:2:"2.";s:3:"⒊";s:2:"3.";s:3:"⒋";s:2:"4.";s:3:"⒌";s:2:"5.";s:3:"⒍";s:2:"6.";s:3:"⒎";s:2:"7.";s:3:"⒏";s:2:"8.";s:3:"⒐";s:2:"9.";s:3:"⒑";s:3:"10.";s:3:"⒒";s:3:"11.";s:3:"⒓";s:3:"12.";s:3:"⒔";s:3:"13.";s:3:"⒕";s:3:"14.";s:3:"⒖";s:3:"15.";s:3:"⒗";s:3:"16.";s:3:"⒘";s:3:"17.";s:3:"⒙";s:3:"18.";s:3:"⒚";s:3:"19.";s:3:"⒛";s:3:"20.";s:3:"⒜";s:3:"(a)";s:3:"⒝";s:3:"(b)";s:3:"⒞";s:3:"(c)";s:3:"⒟";s:3:"(d)";s:3:"⒠";s:3:"(e)";s:3:"⒡";s:3:"(f)";s:3:"⒢";s:3:"(g)";s:3:"⒣";s:3:"(h)";s:3:"⒤";s:3:"(i)";s:3:"⒥";s:3:"(j)";s:3:"⒦";s:3:"(k)";s:3:"⒧";s:3:"(l)";s:3:"⒨";s:3:"(m)";s:3:"⒩";s:3:"(n)";s:3:"⒪";s:3:"(o)";s:3:"⒫";s:3:"(p)";s:3:"⒬";s:3:"(q)";s:3:"⒭";s:3:"(r)";s:3:"⒮";s:3:"(s)";s:3:"⒯";s:3:"(t)";s:3:"⒰";s:3:"(u)";s:3:"⒱";s:3:"(v)";s:3:"⒲";s:3:"(w)";s:3:"⒳";s:3:"(x)";s:3:"⒴";s:3:"(y)";s:3:"⒵";s:3:"(z)";s:3:"Ⓐ";s:1:"A";s:3:"Ⓑ";s:1:"B";s:3:"Ⓒ";s:1:"C";s:3:"Ⓓ";s:1:"D";s:3:"Ⓔ";s:1:"E";s:3:"Ⓕ";s:1:"F";s:3:"Ⓖ";s:1:"G";s:3:"Ⓗ";s:1:"H";s:3:"Ⓘ";s:1:"I";s:3:"Ⓙ";s:1:"J";s:3:"Ⓚ";s:1:"K";s:3:"Ⓛ";s:1:"L";s:3:"Ⓜ";s:1:"M";s:3:"Ⓝ";s:1:"N";s:3:"Ⓞ";s:1:"O";s:3:"Ⓟ";s:1:"P";s:3:"Ⓠ";s:1:"Q";s:3:"Ⓡ";s:1:"R";s:3:"Ⓢ";s:1:"S";s:3:"Ⓣ";s:1:"T";s:3:"Ⓤ";s:1:"U";s:3:"Ⓥ";s:1:"V";s:3:"Ⓦ";s:1:"W";s:3:"Ⓧ";s:1:"X";s:3:"Ⓨ";s:1:"Y";s:3:"Ⓩ";s:1:"Z";s:3:"ⓐ";s:1:"a";s:3:"ⓑ";s:1:"b";s:3:"ⓒ";s:1:"c";s:3:"ⓓ";s:1:"d";s:3:"ⓔ";s:1:"e";s:3:"ⓕ";s:1:"f";s:3:"ⓖ";s:1:"g";s:3:"ⓗ";s:1:"h";s:3:"ⓘ";s:1:"i";s:3:"ⓙ";s:1:"j";s:3:"ⓚ";s:1:"k";s:3:"ⓛ";s:1:"l";s:3:"ⓜ";s:1:"m";s:3:"ⓝ";s:1:"n";s:3:"ⓞ";s:1:"o";s:3:"ⓟ";s:1:"p";s:3:"ⓠ";s:1:"q";s:3:"ⓡ";s:1:"r";s:3:"ⓢ";s:1:"s";s:3:"ⓣ";s:1:"t";s:3:"ⓤ";s:1:"u";s:3:"ⓥ";s:1:"v";s:3:"ⓦ";s:1:"w";s:3:"ⓧ";s:1:"x";s:3:"ⓨ";s:1:"y";s:3:"ⓩ";s:1:"z";s:3:"⓪";s:1:"0";s:3:"⨌";s:12:"∫∫∫∫";s:3:"⩴";s:3:"::=";s:3:"⩵";s:2:"==";s:3:"⩶";s:3:"===";s:3:"⫝̸";s:5:"⫝̸";s:3:"ⱼ";s:1:"j";s:3:"ⱽ";s:1:"V";s:3:"ⵯ";s:3:"ⵡ";s:3:"⺟";s:3:"母";s:3:"⻳";s:3:"龟";s:3:"⼀";s:3:"一";s:3:"⼁";s:3:"丨";s:3:"⼂";s:3:"丶";s:3:"⼃";s:3:"丿";s:3:"⼄";s:3:"乙";s:3:"⼅";s:3:"亅";s:3:"⼆";s:3:"二";s:3:"⼇";s:3:"亠";s:3:"⼈";s:3:"人";s:3:"⼉";s:3:"儿";s:3:"⼊";s:3:"入";s:3:"⼋";s:3:"八";s:3:"⼌";s:3:"冂";s:3:"⼍";s:3:"冖";s:3:"⼎";s:3:"冫";s:3:"⼏";s:3:"几";s:3:"⼐";s:3:"凵";s:3:"⼑";s:3:"刀";s:3:"⼒";s:3:"力";s:3:"⼓";s:3:"勹";s:3:"⼔";s:3:"匕";s:3:"⼕";s:3:"匚";s:3:"⼖";s:3:"匸";s:3:"⼗";s:3:"十";s:3:"⼘";s:3:"卜";s:3:"⼙";s:3:"卩";s:3:"⼚";s:3:"厂";s:3:"⼛";s:3:"厶";s:3:"⼜";s:3:"又";s:3:"⼝";s:3:"口";s:3:"⼞";s:3:"囗";s:3:"⼟";s:3:"土";s:3:"⼠";s:3:"士";s:3:"⼡";s:3:"夂";s:3:"⼢";s:3:"夊";s:3:"⼣";s:3:"夕";s:3:"⼤";s:3:"大";s:3:"⼥";s:3:"女";s:3:"⼦";s:3:"子";s:3:"⼧";s:3:"宀";s:3:"⼨";s:3:"寸";s:3:"⼩";s:3:"小";s:3:"⼪";s:3:"尢";s:3:"⼫";s:3:"尸";s:3:"⼬";s:3:"屮";s:3:"⼭";s:3:"山";s:3:"⼮";s:3:"巛";s:3:"⼯";s:3:"工";s:3:"⼰";s:3:"己";s:3:"⼱";s:3:"巾";s:3:"⼲";s:3:"干";s:3:"⼳";s:3:"幺";s:3:"⼴";s:3:"广";s:3:"⼵";s:3:"廴";s:3:"⼶";s:3:"廾";s:3:"⼷";s:3:"弋";s:3:"⼸";s:3:"弓";s:3:"⼹";s:3:"彐";s:3:"⼺";s:3:"彡";s:3:"⼻";s:3:"彳";s:3:"⼼";s:3:"心";s:3:"⼽";s:3:"戈";s:3:"⼾";s:3:"戶";s:3:"⼿";s:3:"手";s:3:"⽀";s:3:"支";s:3:"⽁";s:3:"攴";s:3:"⽂";s:3:"文";s:3:"⽃";s:3:"斗";s:3:"⽄";s:3:"斤";s:3:"⽅";s:3:"方";s:3:"⽆";s:3:"无";s:3:"⽇";s:3:"日";s:3:"⽈";s:3:"曰";s:3:"⽉";s:3:"月";s:3:"⽊";s:3:"木";s:3:"⽋";s:3:"欠";s:3:"⽌";s:3:"止";s:3:"⽍";s:3:"歹";s:3:"⽎";s:3:"殳";s:3:"⽏";s:3:"毋";s:3:"⽐";s:3:"比";s:3:"⽑";s:3:"毛";s:3:"⽒";s:3:"氏";s:3:"⽓";s:3:"气";s:3:"⽔";s:3:"水";s:3:"⽕";s:3:"火";s:3:"⽖";s:3:"爪";s:3:"⽗";s:3:"父";s:3:"⽘";s:3:"爻";s:3:"⽙";s:3:"爿";s:3:"⽚";s:3:"片";s:3:"⽛";s:3:"牙";s:3:"⽜";s:3:"牛";s:3:"⽝";s:3:"犬";s:3:"⽞";s:3:"玄";s:3:"⽟";s:3:"玉";s:3:"⽠";s:3:"瓜";s:3:"⽡";s:3:"瓦";s:3:"⽢";s:3:"甘";s:3:"⽣";s:3:"生";s:3:"⽤";s:3:"用";s:3:"⽥";s:3:"田";s:3:"⽦";s:3:"疋";s:3:"⽧";s:3:"疒";s:3:"⽨";s:3:"癶";s:3:"⽩";s:3:"白";s:3:"⽪";s:3:"皮";s:3:"⽫";s:3:"皿";s:3:"⽬";s:3:"目";s:3:"⽭";s:3:"矛";s:3:"⽮";s:3:"矢";s:3:"⽯";s:3:"石";s:3:"⽰";s:3:"示";s:3:"⽱";s:3:"禸";s:3:"⽲";s:3:"禾";s:3:"⽳";s:3:"穴";s:3:"⽴";s:3:"立";s:3:"⽵";s:3:"竹";s:3:"⽶";s:3:"米";s:3:"⽷";s:3:"糸";s:3:"⽸";s:3:"缶";s:3:"⽹";s:3:"网";s:3:"⽺";s:3:"羊";s:3:"⽻";s:3:"羽";s:3:"⽼";s:3:"老";s:3:"⽽";s:3:"而";s:3:"⽾";s:3:"耒";s:3:"⽿";s:3:"耳";s:3:"⾀";s:3:"聿";s:3:"⾁";s:3:"肉";s:3:"⾂";s:3:"臣";s:3:"⾃";s:3:"自";s:3:"⾄";s:3:"至";s:3:"⾅";s:3:"臼";s:3:"⾆";s:3:"舌";s:3:"⾇";s:3:"舛";s:3:"⾈";s:3:"舟";s:3:"⾉";s:3:"艮";s:3:"⾊";s:3:"色";s:3:"⾋";s:3:"艸";s:3:"⾌";s:3:"虍";s:3:"⾍";s:3:"虫";s:3:"⾎";s:3:"血";s:3:"⾏";s:3:"行";s:3:"⾐";s:3:"衣";s:3:"⾑";s:3:"襾";s:3:"⾒";s:3:"見";s:3:"⾓";s:3:"角";s:3:"⾔";s:3:"言";s:3:"⾕";s:3:"谷";s:3:"⾖";s:3:"豆";s:3:"⾗";s:3:"豕";s:3:"⾘";s:3:"豸";s:3:"⾙";s:3:"貝";s:3:"⾚";s:3:"赤";s:3:"⾛";s:3:"走";s:3:"⾜";s:3:"足";s:3:"⾝";s:3:"身";s:3:"⾞";s:3:"車";s:3:"⾟";s:3:"辛";s:3:"⾠";s:3:"辰";s:3:"⾡";s:3:"辵";s:3:"⾢";s:3:"邑";s:3:"⾣";s:3:"酉";s:3:"⾤";s:3:"釆";s:3:"⾥";s:3:"里";s:3:"⾦";s:3:"金";s:3:"⾧";s:3:"長";s:3:"⾨";s:3:"門";s:3:"⾩";s:3:"阜";s:3:"⾪";s:3:"隶";s:3:"⾫";s:3:"隹";s:3:"⾬";s:3:"雨";s:3:"⾭";s:3:"靑";s:3:"⾮";s:3:"非";s:3:"⾯";s:3:"面";s:3:"⾰";s:3:"革";s:3:"⾱";s:3:"韋";s:3:"⾲";s:3:"韭";s:3:"⾳";s:3:"音";s:3:"⾴";s:3:"頁";s:3:"⾵";s:3:"風";s:3:"⾶";s:3:"飛";s:3:"⾷";s:3:"食";s:3:"⾸";s:3:"首";s:3:"⾹";s:3:"香";s:3:"⾺";s:3:"馬";s:3:"⾻";s:3:"骨";s:3:"⾼";s:3:"高";s:3:"⾽";s:3:"髟";s:3:"⾾";s:3:"鬥";s:3:"⾿";s:3:"鬯";s:3:"⿀";s:3:"鬲";s:3:"⿁";s:3:"鬼";s:3:"⿂";s:3:"魚";s:3:"⿃";s:3:"鳥";s:3:"⿄";s:3:"鹵";s:3:"⿅";s:3:"鹿";s:3:"⿆";s:3:"麥";s:3:"⿇";s:3:"麻";s:3:"⿈";s:3:"黃";s:3:"⿉";s:3:"黍";s:3:"⿊";s:3:"黑";s:3:"⿋";s:3:"黹";s:3:"⿌";s:3:"黽";s:3:"⿍";s:3:"鼎";s:3:"⿎";s:3:"鼓";s:3:"⿏";s:3:"鼠";s:3:"⿐";s:3:"鼻";s:3:"⿑";s:3:"齊";s:3:"⿒";s:3:"齒";s:3:"⿓";s:3:"龍";s:3:"⿔";s:3:"龜";s:3:"⿕";s:3:"龠";s:3:" ";s:1:" ";s:3:"〶";s:3:"〒";s:3:"〸";s:3:"十";s:3:"〹";s:3:"卄";s:3:"〺";s:3:"卅";s:3:"が";s:6:"が";s:3:"ぎ";s:6:"ぎ";s:3:"ぐ";s:6:"ぐ";s:3:"げ";s:6:"げ";s:3:"ご";s:6:"ご";s:3:"ざ";s:6:"ざ";s:3:"じ";s:6:"じ";s:3:"ず";s:6:"ず";s:3:"ぜ";s:6:"ぜ";s:3:"ぞ";s:6:"ぞ";s:3:"だ";s:6:"だ";s:3:"ぢ";s:6:"ぢ";s:3:"づ";s:6:"づ";s:3:"で";s:6:"で";s:3:"ど";s:6:"ど";s:3:"ば";s:6:"ば";s:3:"ぱ";s:6:"ぱ";s:3:"び";s:6:"び";s:3:"ぴ";s:6:"ぴ";s:3:"ぶ";s:6:"ぶ";s:3:"ぷ";s:6:"ぷ";s:3:"べ";s:6:"べ";s:3:"ぺ";s:6:"ぺ";s:3:"ぼ";s:6:"ぼ";s:3:"ぽ";s:6:"ぽ";s:3:"ゔ";s:6:"ゔ";s:3:"゛";s:4:" ゙";s:3:"゜";s:4:" ゚";s:3:"ゞ";s:6:"ゞ";s:3:"ゟ";s:6:"より";s:3:"ガ";s:6:"ガ";s:3:"ギ";s:6:"ギ";s:3:"グ";s:6:"グ";s:3:"ゲ";s:6:"ゲ";s:3:"ゴ";s:6:"ゴ";s:3:"ザ";s:6:"ザ";s:3:"ジ";s:6:"ジ";s:3:"ズ";s:6:"ズ";s:3:"ゼ";s:6:"ゼ";s:3:"ゾ";s:6:"ゾ";s:3:"ダ";s:6:"ダ";s:3:"ヂ";s:6:"ヂ";s:3:"ヅ";s:6:"ヅ";s:3:"デ";s:6:"デ";s:3:"ド";s:6:"ド";s:3:"バ";s:6:"バ";s:3:"パ";s:6:"パ";s:3:"ビ";s:6:"ビ";s:3:"ピ";s:6:"ピ";s:3:"ブ";s:6:"ブ";s:3:"プ";s:6:"プ";s:3:"ベ";s:6:"ベ";s:3:"ペ";s:6:"ペ";s:3:"ボ";s:6:"ボ";s:3:"ポ";s:6:"ポ";s:3:"ヴ";s:6:"ヴ";s:3:"ヷ";s:6:"ヷ";s:3:"ヸ";s:6:"ヸ";s:3:"ヹ";s:6:"ヹ";s:3:"ヺ";s:6:"ヺ";s:3:"ヾ";s:6:"ヾ";s:3:"ヿ";s:6:"コト";s:3:"ㄱ";s:3:"ᄀ";s:3:"ㄲ";s:3:"ᄁ";s:3:"ㄳ";s:3:"ᆪ";s:3:"ㄴ";s:3:"ᄂ";s:3:"ㄵ";s:3:"ᆬ";s:3:"ㄶ";s:3:"ᆭ";s:3:"ㄷ";s:3:"ᄃ";s:3:"ㄸ";s:3:"ᄄ";s:3:"ㄹ";s:3:"ᄅ";s:3:"ㄺ";s:3:"ᆰ";s:3:"ㄻ";s:3:"ᆱ";s:3:"ㄼ";s:3:"ᆲ";s:3:"ㄽ";s:3:"ᆳ";s:3:"ㄾ";s:3:"ᆴ";s:3:"ㄿ";s:3:"ᆵ";s:3:"ㅀ";s:3:"ᄚ";s:3:"ㅁ";s:3:"ᄆ";s:3:"ㅂ";s:3:"ᄇ";s:3:"ㅃ";s:3:"ᄈ";s:3:"ㅄ";s:3:"ᄡ";s:3:"ㅅ";s:3:"ᄉ";s:3:"ㅆ";s:3:"ᄊ";s:3:"ㅇ";s:3:"ᄋ";s:3:"ㅈ";s:3:"ᄌ";s:3:"ㅉ";s:3:"ᄍ";s:3:"ㅊ";s:3:"ᄎ";s:3:"ㅋ";s:3:"ᄏ";s:3:"ㅌ";s:3:"ᄐ";s:3:"ㅍ";s:3:"ᄑ";s:3:"ㅎ";s:3:"ᄒ";s:3:"ㅏ";s:3:"ᅡ";s:3:"ㅐ";s:3:"ᅢ";s:3:"ㅑ";s:3:"ᅣ";s:3:"ㅒ";s:3:"ᅤ";s:3:"ㅓ";s:3:"ᅥ";s:3:"ㅔ";s:3:"ᅦ";s:3:"ㅕ";s:3:"ᅧ";s:3:"ㅖ";s:3:"ᅨ";s:3:"ㅗ";s:3:"ᅩ";s:3:"ㅘ";s:3:"ᅪ";s:3:"ㅙ";s:3:"ᅫ";s:3:"ㅚ";s:3:"ᅬ";s:3:"ㅛ";s:3:"ᅭ";s:3:"ㅜ";s:3:"ᅮ";s:3:"ㅝ";s:3:"ᅯ";s:3:"ㅞ";s:3:"ᅰ";s:3:"ㅟ";s:3:"ᅱ";s:3:"ㅠ";s:3:"ᅲ";s:3:"ㅡ";s:3:"ᅳ";s:3:"ㅢ";s:3:"ᅴ";s:3:"ㅣ";s:3:"ᅵ";s:3:"ㅤ";s:3:"ᅠ";s:3:"ㅥ";s:3:"ᄔ";s:3:"ㅦ";s:3:"ᄕ";s:3:"ㅧ";s:3:"ᇇ";s:3:"ㅨ";s:3:"ᇈ";s:3:"ㅩ";s:3:"ᇌ";s:3:"ㅪ";s:3:"ᇎ";s:3:"ㅫ";s:3:"ᇓ";s:3:"ㅬ";s:3:"ᇗ";s:3:"ㅭ";s:3:"ᇙ";s:3:"ㅮ";s:3:"ᄜ";s:3:"ㅯ";s:3:"ᇝ";s:3:"ㅰ";s:3:"ᇟ";s:3:"ㅱ";s:3:"ᄝ";s:3:"ㅲ";s:3:"ᄞ";s:3:"ㅳ";s:3:"ᄠ";s:3:"ㅴ";s:3:"ᄢ";s:3:"ㅵ";s:3:"ᄣ";s:3:"ㅶ";s:3:"ᄧ";s:3:"ㅷ";s:3:"ᄩ";s:3:"ㅸ";s:3:"ᄫ";s:3:"ㅹ";s:3:"ᄬ";s:3:"ㅺ";s:3:"ᄭ";s:3:"ㅻ";s:3:"ᄮ";s:3:"ㅼ";s:3:"ᄯ";s:3:"ㅽ";s:3:"ᄲ";s:3:"ㅾ";s:3:"ᄶ";s:3:"ㅿ";s:3:"ᅀ";s:3:"ㆀ";s:3:"ᅇ";s:3:"ㆁ";s:3:"ᅌ";s:3:"ㆂ";s:3:"ᇱ";s:3:"ㆃ";s:3:"ᇲ";s:3:"ㆄ";s:3:"ᅗ";s:3:"ㆅ";s:3:"ᅘ";s:3:"ㆆ";s:3:"ᅙ";s:3:"ㆇ";s:3:"ᆄ";s:3:"ㆈ";s:3:"ᆅ";s:3:"ㆉ";s:3:"ᆈ";s:3:"ㆊ";s:3:"ᆑ";s:3:"ㆋ";s:3:"ᆒ";s:3:"ㆌ";s:3:"ᆔ";s:3:"ㆍ";s:3:"ᆞ";s:3:"ㆎ";s:3:"ᆡ";s:3:"㆒";s:3:"一";s:3:"㆓";s:3:"二";s:3:"㆔";s:3:"三";s:3:"㆕";s:3:"四";s:3:"㆖";s:3:"上";s:3:"㆗";s:3:"中";s:3:"㆘";s:3:"下";s:3:"㆙";s:3:"甲";s:3:"㆚";s:3:"乙";s:3:"㆛";s:3:"丙";s:3:"㆜";s:3:"丁";s:3:"㆝";s:3:"天";s:3:"㆞";s:3:"地";s:3:"㆟";s:3:"人";s:3:"㈀";s:5:"(ᄀ)";s:3:"㈁";s:5:"(ᄂ)";s:3:"㈂";s:5:"(ᄃ)";s:3:"㈃";s:5:"(ᄅ)";s:3:"㈄";s:5:"(ᄆ)";s:3:"㈅";s:5:"(ᄇ)";s:3:"㈆";s:5:"(ᄉ)";s:3:"㈇";s:5:"(ᄋ)";s:3:"㈈";s:5:"(ᄌ)";s:3:"㈉";s:5:"(ᄎ)";s:3:"㈊";s:5:"(ᄏ)";s:3:"㈋";s:5:"(ᄐ)";s:3:"㈌";s:5:"(ᄑ)";s:3:"㈍";s:5:"(ᄒ)";s:3:"㈎";s:8:"(가)";s:3:"㈏";s:8:"(나)";s:3:"㈐";s:8:"(다)";s:3:"㈑";s:8:"(라)";s:3:"㈒";s:8:"(마)";s:3:"㈓";s:8:"(바)";s:3:"㈔";s:8:"(사)";s:3:"㈕";s:8:"(아)";s:3:"㈖";s:8:"(자)";s:3:"㈗";s:8:"(차)";s:3:"㈘";s:8:"(카)";s:3:"㈙";s:8:"(타)";s:3:"㈚";s:8:"(파)";s:3:"㈛";s:8:"(하)";s:3:"㈜";s:8:"(주)";s:3:"㈝";s:17:"(오전)";s:3:"㈞";s:14:"(오후)";s:3:"㈠";s:5:"(一)";s:3:"㈡";s:5:"(二)";s:3:"㈢";s:5:"(三)";s:3:"㈣";s:5:"(四)";s:3:"㈤";s:5:"(五)";s:3:"㈥";s:5:"(六)";s:3:"㈦";s:5:"(七)";s:3:"㈧";s:5:"(八)";s:3:"㈨";s:5:"(九)";s:3:"㈩";s:5:"(十)";s:3:"㈪";s:5:"(月)";s:3:"㈫";s:5:"(火)";s:3:"㈬";s:5:"(水)";s:3:"㈭";s:5:"(木)";s:3:"㈮";s:5:"(金)";s:3:"㈯";s:5:"(土)";s:3:"㈰";s:5:"(日)";s:3:"㈱";s:5:"(株)";s:3:"㈲";s:5:"(有)";s:3:"㈳";s:5:"(社)";s:3:"㈴";s:5:"(名)";s:3:"㈵";s:5:"(特)";s:3:"㈶";s:5:"(財)";s:3:"㈷";s:5:"(祝)";s:3:"㈸";s:5:"(労)";s:3:"㈹";s:5:"(代)";s:3:"㈺";s:5:"(呼)";s:3:"㈻";s:5:"(学)";s:3:"㈼";s:5:"(監)";s:3:"㈽";s:5:"(企)";s:3:"㈾";s:5:"(資)";s:3:"㈿";s:5:"(協)";s:3:"㉀";s:5:"(祭)";s:3:"㉁";s:5:"(休)";s:3:"㉂";s:5:"(自)";s:3:"㉃";s:5:"(至)";s:3:"㉄";s:3:"問";s:3:"㉅";s:3:"幼";s:3:"㉆";s:3:"文";s:3:"㉇";s:3:"箏";s:3:"㉐";s:3:"PTE";s:3:"㉑";s:2:"21";s:3:"㉒";s:2:"22";s:3:"㉓";s:2:"23";s:3:"㉔";s:2:"24";s:3:"㉕";s:2:"25";s:3:"㉖";s:2:"26";s:3:"㉗";s:2:"27";s:3:"㉘";s:2:"28";s:3:"㉙";s:2:"29";s:3:"㉚";s:2:"30";s:3:"㉛";s:2:"31";s:3:"㉜";s:2:"32";s:3:"㉝";s:2:"33";s:3:"㉞";s:2:"34";s:3:"㉟";s:2:"35";s:3:"㉠";s:3:"ᄀ";s:3:"㉡";s:3:"ᄂ";s:3:"㉢";s:3:"ᄃ";s:3:"㉣";s:3:"ᄅ";s:3:"㉤";s:3:"ᄆ";s:3:"㉥";s:3:"ᄇ";s:3:"㉦";s:3:"ᄉ";s:3:"㉧";s:3:"ᄋ";s:3:"㉨";s:3:"ᄌ";s:3:"㉩";s:3:"ᄎ";s:3:"㉪";s:3:"ᄏ";s:3:"㉫";s:3:"ᄐ";s:3:"㉬";s:3:"ᄑ";s:3:"㉭";s:3:"ᄒ";s:3:"㉮";s:6:"가";s:3:"㉯";s:6:"나";s:3:"㉰";s:6:"다";s:3:"㉱";s:6:"라";s:3:"㉲";s:6:"마";s:3:"㉳";s:6:"바";s:3:"㉴";s:6:"사";s:3:"㉵";s:6:"아";s:3:"㉶";s:6:"자";s:3:"㉷";s:6:"차";s:3:"㉸";s:6:"카";s:3:"㉹";s:6:"타";s:3:"㉺";s:6:"파";s:3:"㉻";s:6:"하";s:3:"㉼";s:15:"참고";s:3:"㉽";s:12:"주의";s:3:"㉾";s:6:"우";s:3:"㊀";s:3:"一";s:3:"㊁";s:3:"二";s:3:"㊂";s:3:"三";s:3:"㊃";s:3:"四";s:3:"㊄";s:3:"五";s:3:"㊅";s:3:"六";s:3:"㊆";s:3:"七";s:3:"㊇";s:3:"八";s:3:"㊈";s:3:"九";s:3:"㊉";s:3:"十";s:3:"㊊";s:3:"月";s:3:"㊋";s:3:"火";s:3:"㊌";s:3:"水";s:3:"㊍";s:3:"木";s:3:"㊎";s:3:"金";s:3:"㊏";s:3:"土";s:3:"㊐";s:3:"日";s:3:"㊑";s:3:"株";s:3:"㊒";s:3:"有";s:3:"㊓";s:3:"社";s:3:"㊔";s:3:"名";s:3:"㊕";s:3:"特";s:3:"㊖";s:3:"財";s:3:"㊗";s:3:"祝";s:3:"㊘";s:3:"労";s:3:"㊙";s:3:"秘";s:3:"㊚";s:3:"男";s:3:"㊛";s:3:"女";s:3:"㊜";s:3:"適";s:3:"㊝";s:3:"優";s:3:"㊞";s:3:"印";s:3:"㊟";s:3:"注";s:3:"㊠";s:3:"項";s:3:"㊡";s:3:"休";s:3:"㊢";s:3:"写";s:3:"㊣";s:3:"正";s:3:"㊤";s:3:"上";s:3:"㊥";s:3:"中";s:3:"㊦";s:3:"下";s:3:"㊧";s:3:"左";s:3:"㊨";s:3:"右";s:3:"㊩";s:3:"医";s:3:"㊪";s:3:"宗";s:3:"㊫";s:3:"学";s:3:"㊬";s:3:"監";s:3:"㊭";s:3:"企";s:3:"㊮";s:3:"資";s:3:"㊯";s:3:"協";s:3:"㊰";s:3:"夜";s:3:"㊱";s:2:"36";s:3:"㊲";s:2:"37";s:3:"㊳";s:2:"38";s:3:"㊴";s:2:"39";s:3:"㊵";s:2:"40";s:3:"㊶";s:2:"41";s:3:"㊷";s:2:"42";s:3:"㊸";s:2:"43";s:3:"㊹";s:2:"44";s:3:"㊺";s:2:"45";s:3:"㊻";s:2:"46";s:3:"㊼";s:2:"47";s:3:"㊽";s:2:"48";s:3:"㊾";s:2:"49";s:3:"㊿";s:2:"50";s:3:"㋀";s:4:"1月";s:3:"㋁";s:4:"2月";s:3:"㋂";s:4:"3月";s:3:"㋃";s:4:"4月";s:3:"㋄";s:4:"5月";s:3:"㋅";s:4:"6月";s:3:"㋆";s:4:"7月";s:3:"㋇";s:4:"8月";s:3:"㋈";s:4:"9月";s:3:"㋉";s:5:"10月";s:3:"㋊";s:5:"11月";s:3:"㋋";s:5:"12月";s:3:"㋌";s:2:"Hg";s:3:"㋍";s:3:"erg";s:3:"㋎";s:2:"eV";s:3:"㋏";s:3:"LTD";s:3:"㋐";s:3:"ア";s:3:"㋑";s:3:"イ";s:3:"㋒";s:3:"ウ";s:3:"㋓";s:3:"エ";s:3:"㋔";s:3:"オ";s:3:"㋕";s:3:"カ";s:3:"㋖";s:3:"キ";s:3:"㋗";s:3:"ク";s:3:"㋘";s:3:"ケ";s:3:"㋙";s:3:"コ";s:3:"㋚";s:3:"サ";s:3:"㋛";s:3:"シ";s:3:"㋜";s:3:"ス";s:3:"㋝";s:3:"セ";s:3:"㋞";s:3:"ソ";s:3:"㋟";s:3:"タ";s:3:"㋠";s:3:"チ";s:3:"㋡";s:3:"ツ";s:3:"㋢";s:3:"テ";s:3:"㋣";s:3:"ト";s:3:"㋤";s:3:"ナ";s:3:"㋥";s:3:"ニ";s:3:"㋦";s:3:"ヌ";s:3:"㋧";s:3:"ネ";s:3:"㋨";s:3:"ノ";s:3:"㋩";s:3:"ハ";s:3:"㋪";s:3:"ヒ";s:3:"㋫";s:3:"フ";s:3:"㋬";s:3:"ヘ";s:3:"㋭";s:3:"ホ";s:3:"㋮";s:3:"マ";s:3:"㋯";s:3:"ミ";s:3:"㋰";s:3:"ム";s:3:"㋱";s:3:"メ";s:3:"㋲";s:3:"モ";s:3:"㋳";s:3:"ヤ";s:3:"㋴";s:3:"ユ";s:3:"㋵";s:3:"ヨ";s:3:"㋶";s:3:"ラ";s:3:"㋷";s:3:"リ";s:3:"㋸";s:3:"ル";s:3:"㋹";s:3:"レ";s:3:"㋺";s:3:"ロ";s:3:"㋻";s:3:"ワ";s:3:"㋼";s:3:"ヰ";s:3:"㋽";s:3:"ヱ";s:3:"㋾";s:3:"ヲ";s:3:"㌀";s:15:"アパート";s:3:"㌁";s:12:"アルファ";s:3:"㌂";s:15:"アンペア";s:3:"㌃";s:9:"アール";s:3:"㌄";s:15:"イニング";s:3:"㌅";s:9:"インチ";s:3:"㌆";s:9:"ウォン";s:3:"㌇";s:18:"エスクード";s:3:"㌈";s:12:"エーカー";s:3:"㌉";s:9:"オンス";s:3:"㌊";s:9:"オーム";s:3:"㌋";s:9:"カイリ";s:3:"㌌";s:12:"カラット";s:3:"㌍";s:12:"カロリー";s:3:"㌎";s:12:"ガロン";s:3:"㌏";s:12:"ガンマ";s:3:"㌐";s:12:"ギガ";s:3:"㌑";s:12:"ギニー";s:3:"㌒";s:12:"キュリー";s:3:"㌓";s:18:"ギルダー";s:3:"㌔";s:6:"キロ";s:3:"㌕";s:18:"キログラム";s:3:"㌖";s:18:"キロメートル";s:3:"㌗";s:15:"キロワット";s:3:"㌘";s:12:"グラム";s:3:"㌙";s:18:"グラムトン";s:3:"㌚";s:18:"クルゼイロ";s:3:"㌛";s:12:"クローネ";s:3:"㌜";s:9:"ケース";s:3:"㌝";s:9:"コルナ";s:3:"㌞";s:12:"コーポ";s:3:"㌟";s:12:"サイクル";s:3:"㌠";s:15:"サンチーム";s:3:"㌡";s:15:"シリング";s:3:"㌢";s:9:"センチ";s:3:"㌣";s:9:"セント";s:3:"㌤";s:12:"ダース";s:3:"㌥";s:9:"デシ";s:3:"㌦";s:9:"ドル";s:3:"㌧";s:6:"トン";s:3:"㌨";s:6:"ナノ";s:3:"㌩";s:9:"ノット";s:3:"㌪";s:9:"ハイツ";s:3:"㌫";s:18:"パーセント";s:3:"㌬";s:12:"パーツ";s:3:"㌭";s:15:"バーレル";s:3:"㌮";s:18:"ピアストル";s:3:"㌯";s:12:"ピクル";s:3:"㌰";s:9:"ピコ";s:3:"㌱";s:9:"ビル";s:3:"㌲";s:18:"ファラッド";s:3:"㌳";s:12:"フィート";s:3:"㌴";s:18:"ブッシェル";s:3:"㌵";s:9:"フラン";s:3:"㌶";s:15:"ヘクタール";s:3:"㌷";s:9:"ペソ";s:3:"㌸";s:12:"ペニヒ";s:3:"㌹";s:9:"ヘルツ";s:3:"㌺";s:12:"ペンス";s:3:"㌻";s:15:"ページ";s:3:"㌼";s:12:"ベータ";s:3:"㌽";s:15:"ポイント";s:3:"㌾";s:12:"ボルト";s:3:"㌿";s:6:"ホン";s:3:"㍀";s:15:"ポンド";s:3:"㍁";s:9:"ホール";s:3:"㍂";s:9:"ホーン";s:3:"㍃";s:12:"マイクロ";s:3:"㍄";s:9:"マイル";s:3:"㍅";s:9:"マッハ";s:3:"㍆";s:9:"マルク";s:3:"㍇";s:15:"マンション";s:3:"㍈";s:12:"ミクロン";s:3:"㍉";s:6:"ミリ";s:3:"㍊";s:18:"ミリバール";s:3:"㍋";s:9:"メガ";s:3:"㍌";s:15:"メガトン";s:3:"㍍";s:12:"メートル";s:3:"㍎";s:12:"ヤード";s:3:"㍏";s:9:"ヤール";s:3:"㍐";s:9:"ユアン";s:3:"㍑";s:12:"リットル";s:3:"㍒";s:6:"リラ";s:3:"㍓";s:12:"ルピー";s:3:"㍔";s:15:"ルーブル";s:3:"㍕";s:6:"レム";s:3:"㍖";s:18:"レントゲン";s:3:"㍗";s:9:"ワット";s:3:"㍘";s:4:"0点";s:3:"㍙";s:4:"1点";s:3:"㍚";s:4:"2点";s:3:"㍛";s:4:"3点";s:3:"㍜";s:4:"4点";s:3:"㍝";s:4:"5点";s:3:"㍞";s:4:"6点";s:3:"㍟";s:4:"7点";s:3:"㍠";s:4:"8点";s:3:"㍡";s:4:"9点";s:3:"㍢";s:5:"10点";s:3:"㍣";s:5:"11点";s:3:"㍤";s:5:"12点";s:3:"㍥";s:5:"13点";s:3:"㍦";s:5:"14点";s:3:"㍧";s:5:"15点";s:3:"㍨";s:5:"16点";s:3:"㍩";s:5:"17点";s:3:"㍪";s:5:"18点";s:3:"㍫";s:5:"19点";s:3:"㍬";s:5:"20点";s:3:"㍭";s:5:"21点";s:3:"㍮";s:5:"22点";s:3:"㍯";s:5:"23点";s:3:"㍰";s:5:"24点";s:3:"㍱";s:3:"hPa";s:3:"㍲";s:2:"da";s:3:"㍳";s:2:"AU";s:3:"㍴";s:3:"bar";s:3:"㍵";s:2:"oV";s:3:"㍶";s:2:"pc";s:3:"㍷";s:2:"dm";s:3:"㍸";s:3:"dm2";s:3:"㍹";s:3:"dm3";s:3:"㍺";s:2:"IU";s:3:"㍻";s:6:"平成";s:3:"㍼";s:6:"昭和";s:3:"㍽";s:6:"大正";s:3:"㍾";s:6:"明治";s:3:"㍿";s:12:"株式会社";s:3:"㎀";s:2:"pA";s:3:"㎁";s:2:"nA";s:3:"㎂";s:3:"μA";s:3:"㎃";s:2:"mA";s:3:"㎄";s:2:"kA";s:3:"㎅";s:2:"KB";s:3:"㎆";s:2:"MB";s:3:"㎇";s:2:"GB";s:3:"㎈";s:3:"cal";s:3:"㎉";s:4:"kcal";s:3:"㎊";s:2:"pF";s:3:"㎋";s:2:"nF";s:3:"㎌";s:3:"μF";s:3:"㎍";s:3:"μg";s:3:"㎎";s:2:"mg";s:3:"㎏";s:2:"kg";s:3:"㎐";s:2:"Hz";s:3:"㎑";s:3:"kHz";s:3:"㎒";s:3:"MHz";s:3:"㎓";s:3:"GHz";s:3:"㎔";s:3:"THz";s:3:"㎕";s:3:"μl";s:3:"㎖";s:2:"ml";s:3:"㎗";s:2:"dl";s:3:"㎘";s:2:"kl";s:3:"㎙";s:2:"fm";s:3:"㎚";s:2:"nm";s:3:"㎛";s:3:"μm";s:3:"㎜";s:2:"mm";s:3:"㎝";s:2:"cm";s:3:"㎞";s:2:"km";s:3:"㎟";s:3:"mm2";s:3:"㎠";s:3:"cm2";s:3:"㎡";s:2:"m2";s:3:"㎢";s:3:"km2";s:3:"㎣";s:3:"mm3";s:3:"㎤";s:3:"cm3";s:3:"㎥";s:2:"m3";s:3:"㎦";s:3:"km3";s:3:"㎧";s:5:"m∕s";s:3:"㎨";s:6:"m∕s2";s:3:"㎩";s:2:"Pa";s:3:"㎪";s:3:"kPa";s:3:"㎫";s:3:"MPa";s:3:"㎬";s:3:"GPa";s:3:"㎭";s:3:"rad";s:3:"㎮";s:7:"rad∕s";s:3:"㎯";s:8:"rad∕s2";s:3:"㎰";s:2:"ps";s:3:"㎱";s:2:"ns";s:3:"㎲";s:3:"μs";s:3:"㎳";s:2:"ms";s:3:"㎴";s:2:"pV";s:3:"㎵";s:2:"nV";s:3:"㎶";s:3:"μV";s:3:"㎷";s:2:"mV";s:3:"㎸";s:2:"kV";s:3:"㎹";s:2:"MV";s:3:"㎺";s:2:"pW";s:3:"㎻";s:2:"nW";s:3:"㎼";s:3:"μW";s:3:"㎽";s:2:"mW";s:3:"㎾";s:2:"kW";s:3:"㎿";s:2:"MW";s:3:"㏀";s:3:"kΩ";s:3:"㏁";s:3:"MΩ";s:3:"㏂";s:4:"a.m.";s:3:"㏃";s:2:"Bq";s:3:"㏄";s:2:"cc";s:3:"㏅";s:2:"cd";s:3:"㏆";s:6:"C∕kg";s:3:"㏇";s:3:"Co.";s:3:"㏈";s:2:"dB";s:3:"㏉";s:2:"Gy";s:3:"㏊";s:2:"ha";s:3:"㏋";s:2:"HP";s:3:"㏌";s:2:"in";s:3:"㏍";s:2:"KK";s:3:"㏎";s:2:"KM";s:3:"㏏";s:2:"kt";s:3:"㏐";s:2:"lm";s:3:"㏑";s:2:"ln";s:3:"㏒";s:3:"log";s:3:"㏓";s:2:"lx";s:3:"㏔";s:2:"mb";s:3:"㏕";s:3:"mil";s:3:"㏖";s:3:"mol";s:3:"㏗";s:2:"PH";s:3:"㏘";s:4:"p.m.";s:3:"㏙";s:3:"PPM";s:3:"㏚";s:2:"PR";s:3:"㏛";s:2:"sr";s:3:"㏜";s:2:"Sv";s:3:"㏝";s:2:"Wb";s:3:"㏞";s:5:"V∕m";s:3:"㏟";s:5:"A∕m";s:3:"㏠";s:4:"1日";s:3:"㏡";s:4:"2日";s:3:"㏢";s:4:"3日";s:3:"㏣";s:4:"4日";s:3:"㏤";s:4:"5日";s:3:"㏥";s:4:"6日";s:3:"㏦";s:4:"7日";s:3:"㏧";s:4:"8日";s:3:"㏨";s:4:"9日";s:3:"㏩";s:5:"10日";s:3:"㏪";s:5:"11日";s:3:"㏫";s:5:"12日";s:3:"㏬";s:5:"13日";s:3:"㏭";s:5:"14日";s:3:"㏮";s:5:"15日";s:3:"㏯";s:5:"16日";s:3:"㏰";s:5:"17日";s:3:"㏱";s:5:"18日";s:3:"㏲";s:5:"19日";s:3:"㏳";s:5:"20日";s:3:"㏴";s:5:"21日";s:3:"㏵";s:5:"22日";s:3:"㏶";s:5:"23日";s:3:"㏷";s:5:"24日";s:3:"㏸";s:5:"25日";s:3:"㏹";s:5:"26日";s:3:"㏺";s:5:"27日";s:3:"㏻";s:5:"28日";s:3:"㏼";s:5:"29日";s:3:"㏽";s:5:"30日";s:3:"㏾";s:5:"31日";s:3:"㏿";s:3:"gal";s:3:"ꝰ";s:3:"ꝯ";s:3:"豈";s:3:"豈";s:3:"更";s:3:"更";s:3:"車";s:3:"車";s:3:"賈";s:3:"賈";s:3:"滑";s:3:"滑";s:3:"串";s:3:"串";s:3:"句";s:3:"句";s:3:"龜";s:3:"龜";s:3:"龜";s:3:"龜";s:3:"契";s:3:"契";s:3:"金";s:3:"金";s:3:"喇";s:3:"喇";s:3:"奈";s:3:"奈";s:3:"懶";s:3:"懶";s:3:"癩";s:3:"癩";s:3:"羅";s:3:"羅";s:3:"蘿";s:3:"蘿";s:3:"螺";s:3:"螺";s:3:"裸";s:3:"裸";s:3:"邏";s:3:"邏";s:3:"樂";s:3:"樂";s:3:"洛";s:3:"洛";s:3:"烙";s:3:"烙";s:3:"珞";s:3:"珞";s:3:"落";s:3:"落";s:3:"酪";s:3:"酪";s:3:"駱";s:3:"駱";s:3:"亂";s:3:"亂";s:3:"卵";s:3:"卵";s:3:"欄";s:3:"欄";s:3:"爛";s:3:"爛";s:3:"蘭";s:3:"蘭";s:3:"鸞";s:3:"鸞";s:3:"嵐";s:3:"嵐";s:3:"濫";s:3:"濫";s:3:"藍";s:3:"藍";s:3:"襤";s:3:"襤";s:3:"拉";s:3:"拉";s:3:"臘";s:3:"臘";s:3:"蠟";s:3:"蠟";s:3:"廊";s:3:"廊";s:3:"朗";s:3:"朗";s:3:"浪";s:3:"浪";s:3:"狼";s:3:"狼";s:3:"郎";s:3:"郎";s:3:"來";s:3:"來";s:3:"冷";s:3:"冷";s:3:"勞";s:3:"勞";s:3:"擄";s:3:"擄";s:3:"櫓";s:3:"櫓";s:3:"爐";s:3:"爐";s:3:"盧";s:3:"盧";s:3:"老";s:3:"老";s:3:"蘆";s:3:"蘆";s:3:"虜";s:3:"虜";s:3:"路";s:3:"路";s:3:"露";s:3:"露";s:3:"魯";s:3:"魯";s:3:"鷺";s:3:"鷺";s:3:"碌";s:3:"碌";s:3:"祿";s:3:"祿";s:3:"綠";s:3:"綠";s:3:"菉";s:3:"菉";s:3:"錄";s:3:"錄";s:3:"鹿";s:3:"鹿";s:3:"論";s:3:"論";s:3:"壟";s:3:"壟";s:3:"弄";s:3:"弄";s:3:"籠";s:3:"籠";s:3:"聾";s:3:"聾";s:3:"牢";s:3:"牢";s:3:"磊";s:3:"磊";s:3:"賂";s:3:"賂";s:3:"雷";s:3:"雷";s:3:"壘";s:3:"壘";s:3:"屢";s:3:"屢";s:3:"樓";s:3:"樓";s:3:"淚";s:3:"淚";s:3:"漏";s:3:"漏";s:3:"累";s:3:"累";s:3:"縷";s:3:"縷";s:3:"陋";s:3:"陋";s:3:"勒";s:3:"勒";s:3:"肋";s:3:"肋";s:3:"凜";s:3:"凜";s:3:"凌";s:3:"凌";s:3:"稜";s:3:"稜";s:3:"綾";s:3:"綾";s:3:"菱";s:3:"菱";s:3:"陵";s:3:"陵";s:3:"讀";s:3:"讀";s:3:"拏";s:3:"拏";s:3:"樂";s:3:"樂";s:3:"諾";s:3:"諾";s:3:"丹";s:3:"丹";s:3:"寧";s:3:"寧";s:3:"怒";s:3:"怒";s:3:"率";s:3:"率";s:3:"異";s:3:"異";s:3:"北";s:3:"北";s:3:"磻";s:3:"磻";s:3:"便";s:3:"便";s:3:"復";s:3:"復";s:3:"不";s:3:"不";s:3:"泌";s:3:"泌";s:3:"數";s:3:"數";s:3:"索";s:3:"索";s:3:"參";s:3:"參";s:3:"塞";s:3:"塞";s:3:"省";s:3:"省";s:3:"葉";s:3:"葉";s:3:"說";s:3:"說";s:3:"殺";s:3:"殺";s:3:"辰";s:3:"辰";s:3:"沈";s:3:"沈";s:3:"拾";s:3:"拾";s:3:"若";s:3:"若";s:3:"掠";s:3:"掠";s:3:"略";s:3:"略";s:3:"亮";s:3:"亮";s:3:"兩";s:3:"兩";s:3:"凉";s:3:"凉";s:3:"梁";s:3:"梁";s:3:"糧";s:3:"糧";s:3:"良";s:3:"良";s:3:"諒";s:3:"諒";s:3:"量";s:3:"量";s:3:"勵";s:3:"勵";s:3:"呂";s:3:"呂";s:3:"女";s:3:"女";s:3:"廬";s:3:"廬";s:3:"旅";s:3:"旅";s:3:"濾";s:3:"濾";s:3:"礪";s:3:"礪";s:3:"閭";s:3:"閭";s:3:"驪";s:3:"驪";s:3:"麗";s:3:"麗";s:3:"黎";s:3:"黎";s:3:"力";s:3:"力";s:3:"曆";s:3:"曆";s:3:"歷";s:3:"歷";s:3:"轢";s:3:"轢";s:3:"年";s:3:"年";s:3:"憐";s:3:"憐";s:3:"戀";s:3:"戀";s:3:"撚";s:3:"撚";s:3:"漣";s:3:"漣";s:3:"煉";s:3:"煉";s:3:"璉";s:3:"璉";s:3:"秊";s:3:"秊";s:3:"練";s:3:"練";s:3:"聯";s:3:"聯";s:3:"輦";s:3:"輦";s:3:"蓮";s:3:"蓮";s:3:"連";s:3:"連";s:3:"鍊";s:3:"鍊";s:3:"列";s:3:"列";s:3:"劣";s:3:"劣";s:3:"咽";s:3:"咽";s:3:"烈";s:3:"烈";s:3:"裂";s:3:"裂";s:3:"說";s:3:"說";s:3:"廉";s:3:"廉";s:3:"念";s:3:"念";s:3:"捻";s:3:"捻";s:3:"殮";s:3:"殮";s:3:"簾";s:3:"簾";s:3:"獵";s:3:"獵";s:3:"令";s:3:"令";s:3:"囹";s:3:"囹";s:3:"寧";s:3:"寧";s:3:"嶺";s:3:"嶺";s:3:"怜";s:3:"怜";s:3:"玲";s:3:"玲";s:3:"瑩";s:3:"瑩";s:3:"羚";s:3:"羚";s:3:"聆";s:3:"聆";s:3:"鈴";s:3:"鈴";s:3:"零";s:3:"零";s:3:"靈";s:3:"靈";s:3:"領";s:3:"領";s:3:"例";s:3:"例";s:3:"禮";s:3:"禮";s:3:"醴";s:3:"醴";s:3:"隸";s:3:"隸";s:3:"惡";s:3:"惡";s:3:"了";s:3:"了";s:3:"僚";s:3:"僚";s:3:"寮";s:3:"寮";s:3:"尿";s:3:"尿";s:3:"料";s:3:"料";s:3:"樂";s:3:"樂";s:3:"燎";s:3:"燎";s:3:"療";s:3:"療";s:3:"蓼";s:3:"蓼";s:3:"遼";s:3:"遼";s:3:"龍";s:3:"龍";s:3:"暈";s:3:"暈";s:3:"阮";s:3:"阮";s:3:"劉";s:3:"劉";s:3:"杻";s:3:"杻";s:3:"柳";s:3:"柳";s:3:"流";s:3:"流";s:3:"溜";s:3:"溜";s:3:"琉";s:3:"琉";s:3:"留";s:3:"留";s:3:"硫";s:3:"硫";s:3:"紐";s:3:"紐";s:3:"類";s:3:"類";s:3:"六";s:3:"六";s:3:"戮";s:3:"戮";s:3:"陸";s:3:"陸";s:3:"倫";s:3:"倫";s:3:"崙";s:3:"崙";s:3:"淪";s:3:"淪";s:3:"輪";s:3:"輪";s:3:"律";s:3:"律";s:3:"慄";s:3:"慄";s:3:"栗";s:3:"栗";s:3:"率";s:3:"率";s:3:"隆";s:3:"隆";s:3:"利";s:3:"利";s:3:"吏";s:3:"吏";s:3:"履";s:3:"履";s:3:"易";s:3:"易";s:3:"李";s:3:"李";s:3:"梨";s:3:"梨";s:3:"泥";s:3:"泥";s:3:"理";s:3:"理";s:3:"痢";s:3:"痢";s:3:"罹";s:3:"罹";s:3:"裏";s:3:"裏";s:3:"裡";s:3:"裡";s:3:"里";s:3:"里";s:3:"離";s:3:"離";s:3:"匿";s:3:"匿";s:3:"溺";s:3:"溺";s:3:"吝";s:3:"吝";s:3:"燐";s:3:"燐";s:3:"璘";s:3:"璘";s:3:"藺";s:3:"藺";s:3:"隣";s:3:"隣";s:3:"鱗";s:3:"鱗";s:3:"麟";s:3:"麟";s:3:"林";s:3:"林";s:3:"淋";s:3:"淋";s:3:"臨";s:3:"臨";s:3:"立";s:3:"立";s:3:"笠";s:3:"笠";s:3:"粒";s:3:"粒";s:3:"狀";s:3:"狀";s:3:"炙";s:3:"炙";s:3:"識";s:3:"識";s:3:"什";s:3:"什";s:3:"茶";s:3:"茶";s:3:"刺";s:3:"刺";s:3:"切";s:3:"切";s:3:"度";s:3:"度";s:3:"拓";s:3:"拓";s:3:"糖";s:3:"糖";s:3:"宅";s:3:"宅";s:3:"洞";s:3:"洞";s:3:"暴";s:3:"暴";s:3:"輻";s:3:"輻";s:3:"行";s:3:"行";s:3:"降";s:3:"降";s:3:"見";s:3:"見";s:3:"廓";s:3:"廓";s:3:"兀";s:3:"兀";s:3:"嗀";s:3:"嗀";s:3:"塚";s:3:"塚";s:3:"晴";s:3:"晴";s:3:"凞";s:3:"凞";s:3:"猪";s:3:"猪";s:3:"益";s:3:"益";s:3:"礼";s:3:"礼";s:3:"神";s:3:"神";s:3:"祥";s:3:"祥";s:3:"福";s:3:"福";s:3:"靖";s:3:"靖";s:3:"精";s:3:"精";s:3:"羽";s:3:"羽";s:3:"蘒";s:3:"蘒";s:3:"諸";s:3:"諸";s:3:"逸";s:3:"逸";s:3:"都";s:3:"都";s:3:"飯";s:3:"飯";s:3:"飼";s:3:"飼";s:3:"館";s:3:"館";s:3:"鶴";s:3:"鶴";s:3:"侮";s:3:"侮";s:3:"僧";s:3:"僧";s:3:"免";s:3:"免";s:3:"勉";s:3:"勉";s:3:"勤";s:3:"勤";s:3:"卑";s:3:"卑";s:3:"喝";s:3:"喝";s:3:"嘆";s:3:"嘆";s:3:"器";s:3:"器";s:3:"塀";s:3:"塀";s:3:"墨";s:3:"墨";s:3:"層";s:3:"層";s:3:"屮";s:3:"屮";s:3:"悔";s:3:"悔";s:3:"慨";s:3:"慨";s:3:"憎";s:3:"憎";s:3:"懲";s:3:"懲";s:3:"敏";s:3:"敏";s:3:"既";s:3:"既";s:3:"暑";s:3:"暑";s:3:"梅";s:3:"梅";s:3:"海";s:3:"海";s:3:"渚";s:3:"渚";s:3:"漢";s:3:"漢";s:3:"煮";s:3:"煮";s:3:"爫";s:3:"爫";s:3:"琢";s:3:"琢";s:3:"碑";s:3:"碑";s:3:"社";s:3:"社";s:3:"祉";s:3:"祉";s:3:"祈";s:3:"祈";s:3:"祐";s:3:"祐";s:3:"祖";s:3:"祖";s:3:"祝";s:3:"祝";s:3:"禍";s:3:"禍";s:3:"禎";s:3:"禎";s:3:"穀";s:3:"穀";s:3:"突";s:3:"突";s:3:"節";s:3:"節";s:3:"練";s:3:"練";s:3:"縉";s:3:"縉";s:3:"繁";s:3:"繁";s:3:"署";s:3:"署";s:3:"者";s:3:"者";s:3:"臭";s:3:"臭";s:3:"艹";s:3:"艹";s:3:"艹";s:3:"艹";s:3:"著";s:3:"著";s:3:"褐";s:3:"褐";s:3:"視";s:3:"視";s:3:"謁";s:3:"謁";s:3:"謹";s:3:"謹";s:3:"賓";s:3:"賓";s:3:"贈";s:3:"贈";s:3:"辶";s:3:"辶";s:3:"逸";s:3:"逸";s:3:"難";s:3:"難";s:3:"響";s:3:"響";s:3:"頻";s:3:"頻";s:3:"恵";s:3:"恵";s:3:"𤋮";s:4:"𤋮";s:3:"舘";s:3:"舘";s:3:"並";s:3:"並";s:3:"况";s:3:"况";s:3:"全";s:3:"全";s:3:"侀";s:3:"侀";s:3:"充";s:3:"充";s:3:"冀";s:3:"冀";s:3:"勇";s:3:"勇";s:3:"勺";s:3:"勺";s:3:"喝";s:3:"喝";s:3:"啕";s:3:"啕";s:3:"喙";s:3:"喙";s:3:"嗢";s:3:"嗢";s:3:"塚";s:3:"塚";s:3:"墳";s:3:"墳";s:3:"奄";s:3:"奄";s:3:"奔";s:3:"奔";s:3:"婢";s:3:"婢";s:3:"嬨";s:3:"嬨";s:3:"廒";s:3:"廒";s:3:"廙";s:3:"廙";s:3:"彩";s:3:"彩";s:3:"徭";s:3:"徭";s:3:"惘";s:3:"惘";s:3:"慎";s:3:"慎";s:3:"愈";s:3:"愈";s:3:"憎";s:3:"憎";s:3:"慠";s:3:"慠";s:3:"懲";s:3:"懲";s:3:"戴";s:3:"戴";s:3:"揄";s:3:"揄";s:3:"搜";s:3:"搜";s:3:"摒";s:3:"摒";s:3:"敖";s:3:"敖";s:3:"晴";s:3:"晴";s:3:"朗";s:3:"朗";s:3:"望";s:3:"望";s:3:"杖";s:3:"杖";s:3:"歹";s:3:"歹";s:3:"殺";s:3:"殺";s:3:"流";s:3:"流";s:3:"滛";s:3:"滛";s:3:"滋";s:3:"滋";s:3:"漢";s:3:"漢";s:3:"瀞";s:3:"瀞";s:3:"煮";s:3:"煮";s:3:"瞧";s:3:"瞧";s:3:"爵";s:3:"爵";s:3:"犯";s:3:"犯";s:3:"猪";s:3:"猪";s:3:"瑱";s:3:"瑱";s:3:"甆";s:3:"甆";s:3:"画";s:3:"画";s:3:"瘝";s:3:"瘝";s:3:"瘟";s:3:"瘟";s:3:"益";s:3:"益";s:3:"盛";s:3:"盛";s:3:"直";s:3:"直";s:3:"睊";s:3:"睊";s:3:"着";s:3:"着";s:3:"磌";s:3:"磌";s:3:"窱";s:3:"窱";s:3:"節";s:3:"節";s:3:"类";s:3:"类";s:3:"絛";s:3:"絛";s:3:"練";s:3:"練";s:3:"缾";s:3:"缾";s:3:"者";s:3:"者";s:3:"荒";s:3:"荒";s:3:"華";s:3:"華";s:3:"蝹";s:3:"蝹";s:3:"襁";s:3:"襁";s:3:"覆";s:3:"覆";s:3:"視";s:3:"視";s:3:"調";s:3:"調";s:3:"諸";s:3:"諸";s:3:"請";s:3:"請";s:3:"謁";s:3:"謁";s:3:"諾";s:3:"諾";s:3:"諭";s:3:"諭";s:3:"謹";s:3:"謹";s:3:"變";s:3:"變";s:3:"贈";s:3:"贈";s:3:"輸";s:3:"輸";s:3:"遲";s:3:"遲";s:3:"醙";s:3:"醙";s:3:"鉶";s:3:"鉶";s:3:"陼";s:3:"陼";s:3:"難";s:3:"難";s:3:"靖";s:3:"靖";s:3:"韛";s:3:"韛";s:3:"響";s:3:"響";s:3:"頋";s:3:"頋";s:3:"頻";s:3:"頻";s:3:"鬒";s:3:"鬒";s:3:"龜";s:3:"龜";s:3:"𢡊";s:4:"𢡊";s:3:"𢡄";s:4:"𢡄";s:3:"𣏕";s:4:"𣏕";s:3:"㮝";s:3:"㮝";s:3:"䀘";s:3:"䀘";s:3:"䀹";s:3:"䀹";s:3:"𥉉";s:4:"𥉉";s:3:"𥳐";s:4:"𥳐";s:3:"𧻓";s:4:"𧻓";s:3:"齃";s:3:"齃";s:3:"龎";s:3:"龎";s:3:"ff";s:2:"ff";s:3:"fi";s:2:"fi";s:3:"fl";s:2:"fl";s:3:"ffi";s:3:"ffi";s:3:"ffl";s:3:"ffl";s:3:"ſt";s:2:"st";s:3:"st";s:2:"st";s:3:"ﬓ";s:4:"մն";s:3:"ﬔ";s:4:"մե";s:3:"ﬕ";s:4:"մի";s:3:"ﬖ";s:4:"վն";s:3:"ﬗ";s:4:"մխ";s:3:"יִ";s:4:"יִ";s:3:"ײַ";s:4:"ײַ";s:3:"ﬠ";s:2:"ע";s:3:"ﬡ";s:2:"א";s:3:"ﬢ";s:2:"ד";s:3:"ﬣ";s:2:"ה";s:3:"ﬤ";s:2:"כ";s:3:"ﬥ";s:2:"ל";s:3:"ﬦ";s:2:"ם";s:3:"ﬧ";s:2:"ר";s:3:"ﬨ";s:2:"ת";s:3:"﬩";s:1:"+";s:3:"שׁ";s:4:"שׁ";s:3:"שׂ";s:4:"שׂ";s:3:"שּׁ";s:6:"שּׁ";s:3:"שּׂ";s:6:"שּׂ";s:3:"אַ";s:4:"אַ";s:3:"אָ";s:4:"אָ";s:3:"אּ";s:4:"אּ";s:3:"בּ";s:4:"בּ";s:3:"גּ";s:4:"גּ";s:3:"דּ";s:4:"דּ";s:3:"הּ";s:4:"הּ";s:3:"וּ";s:4:"וּ";s:3:"זּ";s:4:"זּ";s:3:"טּ";s:4:"טּ";s:3:"יּ";s:4:"יּ";s:3:"ךּ";s:4:"ךּ";s:3:"כּ";s:4:"כּ";s:3:"לּ";s:4:"לּ";s:3:"מּ";s:4:"מּ";s:3:"נּ";s:4:"נּ";s:3:"סּ";s:4:"סּ";s:3:"ףּ";s:4:"ףּ";s:3:"פּ";s:4:"פּ";s:3:"צּ";s:4:"צּ";s:3:"קּ";s:4:"קּ";s:3:"רּ";s:4:"רּ";s:3:"שּ";s:4:"שּ";s:3:"תּ";s:4:"תּ";s:3:"וֹ";s:4:"וֹ";s:3:"בֿ";s:4:"בֿ";s:3:"כֿ";s:4:"כֿ";s:3:"פֿ";s:4:"פֿ";s:3:"ﭏ";s:4:"אל";s:3:"ﭐ";s:2:"ٱ";s:3:"ﭑ";s:2:"ٱ";s:3:"ﭒ";s:2:"ٻ";s:3:"ﭓ";s:2:"ٻ";s:3:"ﭔ";s:2:"ٻ";s:3:"ﭕ";s:2:"ٻ";s:3:"ﭖ";s:2:"پ";s:3:"ﭗ";s:2:"پ";s:3:"ﭘ";s:2:"پ";s:3:"ﭙ";s:2:"پ";s:3:"ﭚ";s:2:"ڀ";s:3:"ﭛ";s:2:"ڀ";s:3:"ﭜ";s:2:"ڀ";s:3:"ﭝ";s:2:"ڀ";s:3:"ﭞ";s:2:"ٺ";s:3:"ﭟ";s:2:"ٺ";s:3:"ﭠ";s:2:"ٺ";s:3:"ﭡ";s:2:"ٺ";s:3:"ﭢ";s:2:"ٿ";s:3:"ﭣ";s:2:"ٿ";s:3:"ﭤ";s:2:"ٿ";s:3:"ﭥ";s:2:"ٿ";s:3:"ﭦ";s:2:"ٹ";s:3:"ﭧ";s:2:"ٹ";s:3:"ﭨ";s:2:"ٹ";s:3:"ﭩ";s:2:"ٹ";s:3:"ﭪ";s:2:"ڤ";s:3:"ﭫ";s:2:"ڤ";s:3:"ﭬ";s:2:"ڤ";s:3:"ﭭ";s:2:"ڤ";s:3:"ﭮ";s:2:"ڦ";s:3:"ﭯ";s:2:"ڦ";s:3:"ﭰ";s:2:"ڦ";s:3:"ﭱ";s:2:"ڦ";s:3:"ﭲ";s:2:"ڄ";s:3:"ﭳ";s:2:"ڄ";s:3:"ﭴ";s:2:"ڄ";s:3:"ﭵ";s:2:"ڄ";s:3:"ﭶ";s:2:"ڃ";s:3:"ﭷ";s:2:"ڃ";s:3:"ﭸ";s:2:"ڃ";s:3:"ﭹ";s:2:"ڃ";s:3:"ﭺ";s:2:"چ";s:3:"ﭻ";s:2:"چ";s:3:"ﭼ";s:2:"چ";s:3:"ﭽ";s:2:"چ";s:3:"ﭾ";s:2:"ڇ";s:3:"ﭿ";s:2:"ڇ";s:3:"ﮀ";s:2:"ڇ";s:3:"ﮁ";s:2:"ڇ";s:3:"ﮂ";s:2:"ڍ";s:3:"ﮃ";s:2:"ڍ";s:3:"ﮄ";s:2:"ڌ";s:3:"ﮅ";s:2:"ڌ";s:3:"ﮆ";s:2:"ڎ";s:3:"ﮇ";s:2:"ڎ";s:3:"ﮈ";s:2:"ڈ";s:3:"ﮉ";s:2:"ڈ";s:3:"ﮊ";s:2:"ژ";s:3:"ﮋ";s:2:"ژ";s:3:"ﮌ";s:2:"ڑ";s:3:"ﮍ";s:2:"ڑ";s:3:"ﮎ";s:2:"ک";s:3:"ﮏ";s:2:"ک";s:3:"ﮐ";s:2:"ک";s:3:"ﮑ";s:2:"ک";s:3:"ﮒ";s:2:"گ";s:3:"ﮓ";s:2:"گ";s:3:"ﮔ";s:2:"گ";s:3:"ﮕ";s:2:"گ";s:3:"ﮖ";s:2:"ڳ";s:3:"ﮗ";s:2:"ڳ";s:3:"ﮘ";s:2:"ڳ";s:3:"ﮙ";s:2:"ڳ";s:3:"ﮚ";s:2:"ڱ";s:3:"ﮛ";s:2:"ڱ";s:3:"ﮜ";s:2:"ڱ";s:3:"ﮝ";s:2:"ڱ";s:3:"ﮞ";s:2:"ں";s:3:"ﮟ";s:2:"ں";s:3:"ﮠ";s:2:"ڻ";s:3:"ﮡ";s:2:"ڻ";s:3:"ﮢ";s:2:"ڻ";s:3:"ﮣ";s:2:"ڻ";s:3:"ﮤ";s:4:"ۀ";s:3:"ﮥ";s:4:"ۀ";s:3:"ﮦ";s:2:"ہ";s:3:"ﮧ";s:2:"ہ";s:3:"ﮨ";s:2:"ہ";s:3:"ﮩ";s:2:"ہ";s:3:"ﮪ";s:2:"ھ";s:3:"ﮫ";s:2:"ھ";s:3:"ﮬ";s:2:"ھ";s:3:"ﮭ";s:2:"ھ";s:3:"ﮮ";s:2:"ے";s:3:"ﮯ";s:2:"ے";s:3:"ﮰ";s:4:"ۓ";s:3:"ﮱ";s:4:"ۓ";s:3:"ﯓ";s:2:"ڭ";s:3:"ﯔ";s:2:"ڭ";s:3:"ﯕ";s:2:"ڭ";s:3:"ﯖ";s:2:"ڭ";s:3:"ﯗ";s:2:"ۇ";s:3:"ﯘ";s:2:"ۇ";s:3:"ﯙ";s:2:"ۆ";s:3:"ﯚ";s:2:"ۆ";s:3:"ﯛ";s:2:"ۈ";s:3:"ﯜ";s:2:"ۈ";s:3:"ﯝ";s:4:"ۇٴ";s:3:"ﯞ";s:2:"ۋ";s:3:"ﯟ";s:2:"ۋ";s:3:"ﯠ";s:2:"ۅ";s:3:"ﯡ";s:2:"ۅ";s:3:"ﯢ";s:2:"ۉ";s:3:"ﯣ";s:2:"ۉ";s:3:"ﯤ";s:2:"ې";s:3:"ﯥ";s:2:"ې";s:3:"ﯦ";s:2:"ې";s:3:"ﯧ";s:2:"ې";s:3:"ﯨ";s:2:"ى";s:3:"ﯩ";s:2:"ى";s:3:"ﯪ";s:6:"ئا";s:3:"ﯫ";s:6:"ئا";s:3:"ﯬ";s:6:"ئە";s:3:"ﯭ";s:6:"ئە";s:3:"ﯮ";s:6:"ئو";s:3:"ﯯ";s:6:"ئو";s:3:"ﯰ";s:6:"ئۇ";s:3:"ﯱ";s:6:"ئۇ";s:3:"ﯲ";s:6:"ئۆ";s:3:"ﯳ";s:6:"ئۆ";s:3:"ﯴ";s:6:"ئۈ";s:3:"ﯵ";s:6:"ئۈ";s:3:"ﯶ";s:6:"ئې";s:3:"ﯷ";s:6:"ئې";s:3:"ﯸ";s:6:"ئې";s:3:"ﯹ";s:6:"ئى";s:3:"ﯺ";s:6:"ئى";s:3:"ﯻ";s:6:"ئى";s:3:"ﯼ";s:2:"ی";s:3:"ﯽ";s:2:"ی";s:3:"ﯾ";s:2:"ی";s:3:"ﯿ";s:2:"ی";s:3:"ﰀ";s:6:"ئج";s:3:"ﰁ";s:6:"ئح";s:3:"ﰂ";s:6:"ئم";s:3:"ﰃ";s:6:"ئى";s:3:"ﰄ";s:6:"ئي";s:3:"ﰅ";s:4:"بج";s:3:"ﰆ";s:4:"بح";s:3:"ﰇ";s:4:"بخ";s:3:"ﰈ";s:4:"بم";s:3:"ﰉ";s:4:"بى";s:3:"ﰊ";s:4:"بي";s:3:"ﰋ";s:4:"تج";s:3:"ﰌ";s:4:"تح";s:3:"ﰍ";s:4:"تخ";s:3:"ﰎ";s:4:"تم";s:3:"ﰏ";s:4:"تى";s:3:"ﰐ";s:4:"تي";s:3:"ﰑ";s:4:"ثج";s:3:"ﰒ";s:4:"ثم";s:3:"ﰓ";s:4:"ثى";s:3:"ﰔ";s:4:"ثي";s:3:"ﰕ";s:4:"جح";s:3:"ﰖ";s:4:"جم";s:3:"ﰗ";s:4:"حج";s:3:"ﰘ";s:4:"حم";s:3:"ﰙ";s:4:"خج";s:3:"ﰚ";s:4:"خح";s:3:"ﰛ";s:4:"خم";s:3:"ﰜ";s:4:"سج";s:3:"ﰝ";s:4:"سح";s:3:"ﰞ";s:4:"سخ";s:3:"ﰟ";s:4:"سم";s:3:"ﰠ";s:4:"صح";s:3:"ﰡ";s:4:"صم";s:3:"ﰢ";s:4:"ضج";s:3:"ﰣ";s:4:"ضح";s:3:"ﰤ";s:4:"ضخ";s:3:"ﰥ";s:4:"ضم";s:3:"ﰦ";s:4:"طح";s:3:"ﰧ";s:4:"طم";s:3:"ﰨ";s:4:"ظم";s:3:"ﰩ";s:4:"عج";s:3:"ﰪ";s:4:"عم";s:3:"ﰫ";s:4:"غج";s:3:"ﰬ";s:4:"غم";s:3:"ﰭ";s:4:"فج";s:3:"ﰮ";s:4:"فح";s:3:"ﰯ";s:4:"فخ";s:3:"ﰰ";s:4:"فم";s:3:"ﰱ";s:4:"فى";s:3:"ﰲ";s:4:"في";s:3:"ﰳ";s:4:"قح";s:3:"ﰴ";s:4:"قم";s:3:"ﰵ";s:4:"قى";s:3:"ﰶ";s:4:"قي";s:3:"ﰷ";s:4:"كا";s:3:"ﰸ";s:4:"كج";s:3:"ﰹ";s:4:"كح";s:3:"ﰺ";s:4:"كخ";s:3:"ﰻ";s:4:"كل";s:3:"ﰼ";s:4:"كم";s:3:"ﰽ";s:4:"كى";s:3:"ﰾ";s:4:"كي";s:3:"ﰿ";s:4:"لج";s:3:"ﱀ";s:4:"لح";s:3:"ﱁ";s:4:"لخ";s:3:"ﱂ";s:4:"لم";s:3:"ﱃ";s:4:"لى";s:3:"ﱄ";s:4:"لي";s:3:"ﱅ";s:4:"مج";s:3:"ﱆ";s:4:"مح";s:3:"ﱇ";s:4:"مخ";s:3:"ﱈ";s:4:"مم";s:3:"ﱉ";s:4:"مى";s:3:"ﱊ";s:4:"مي";s:3:"ﱋ";s:4:"نج";s:3:"ﱌ";s:4:"نح";s:3:"ﱍ";s:4:"نخ";s:3:"ﱎ";s:4:"نم";s:3:"ﱏ";s:4:"نى";s:3:"ﱐ";s:4:"ني";s:3:"ﱑ";s:4:"هج";s:3:"ﱒ";s:4:"هم";s:3:"ﱓ";s:4:"هى";s:3:"ﱔ";s:4:"هي";s:3:"ﱕ";s:4:"يج";s:3:"ﱖ";s:4:"يح";s:3:"ﱗ";s:4:"يخ";s:3:"ﱘ";s:4:"يم";s:3:"ﱙ";s:4:"يى";s:3:"ﱚ";s:4:"يي";s:3:"ﱛ";s:4:"ذٰ";s:3:"ﱜ";s:4:"رٰ";s:3:"ﱝ";s:4:"ىٰ";s:3:"ﱞ";s:5:" ٌّ";s:3:"ﱟ";s:5:" ٍّ";s:3:"ﱠ";s:5:" َّ";s:3:"ﱡ";s:5:" ُّ";s:3:"ﱢ";s:5:" ِّ";s:3:"ﱣ";s:5:" ّٰ";s:3:"ﱤ";s:6:"ئر";s:3:"ﱥ";s:6:"ئز";s:3:"ﱦ";s:6:"ئم";s:3:"ﱧ";s:6:"ئن";s:3:"ﱨ";s:6:"ئى";s:3:"ﱩ";s:6:"ئي";s:3:"ﱪ";s:4:"بر";s:3:"ﱫ";s:4:"بز";s:3:"ﱬ";s:4:"بم";s:3:"ﱭ";s:4:"بن";s:3:"ﱮ";s:4:"بى";s:3:"ﱯ";s:4:"بي";s:3:"ﱰ";s:4:"تر";s:3:"ﱱ";s:4:"تز";s:3:"ﱲ";s:4:"تم";s:3:"ﱳ";s:4:"تن";s:3:"ﱴ";s:4:"تى";s:3:"ﱵ";s:4:"تي";s:3:"ﱶ";s:4:"ثر";s:3:"ﱷ";s:4:"ثز";s:3:"ﱸ";s:4:"ثم";s:3:"ﱹ";s:4:"ثن";s:3:"ﱺ";s:4:"ثى";s:3:"ﱻ";s:4:"ثي";s:3:"ﱼ";s:4:"فى";s:3:"ﱽ";s:4:"في";s:3:"ﱾ";s:4:"قى";s:3:"ﱿ";s:4:"قي";s:3:"ﲀ";s:4:"كا";s:3:"ﲁ";s:4:"كل";s:3:"ﲂ";s:4:"كم";s:3:"ﲃ";s:4:"كى";s:3:"ﲄ";s:4:"كي";s:3:"ﲅ";s:4:"لم";s:3:"ﲆ";s:4:"لى";s:3:"ﲇ";s:4:"لي";s:3:"ﲈ";s:4:"ما";s:3:"ﲉ";s:4:"مم";s:3:"ﲊ";s:4:"نر";s:3:"ﲋ";s:4:"نز";s:3:"ﲌ";s:4:"نم";s:3:"ﲍ";s:4:"نن";s:3:"ﲎ";s:4:"نى";s:3:"ﲏ";s:4:"ني";s:3:"ﲐ";s:4:"ىٰ";s:3:"ﲑ";s:4:"ير";s:3:"ﲒ";s:4:"يز";s:3:"ﲓ";s:4:"يم";s:3:"ﲔ";s:4:"ين";s:3:"ﲕ";s:4:"يى";s:3:"ﲖ";s:4:"يي";s:3:"ﲗ";s:6:"ئج";s:3:"ﲘ";s:6:"ئح";s:3:"ﲙ";s:6:"ئخ";s:3:"ﲚ";s:6:"ئم";s:3:"ﲛ";s:6:"ئه";s:3:"ﲜ";s:4:"بج";s:3:"ﲝ";s:4:"بح";s:3:"ﲞ";s:4:"بخ";s:3:"ﲟ";s:4:"بم";s:3:"ﲠ";s:4:"به";s:3:"ﲡ";s:4:"تج";s:3:"ﲢ";s:4:"تح";s:3:"ﲣ";s:4:"تخ";s:3:"ﲤ";s:4:"تم";s:3:"ﲥ";s:4:"ته";s:3:"ﲦ";s:4:"ثم";s:3:"ﲧ";s:4:"جح";s:3:"ﲨ";s:4:"جم";s:3:"ﲩ";s:4:"حج";s:3:"ﲪ";s:4:"حم";s:3:"ﲫ";s:4:"خج";s:3:"ﲬ";s:4:"خم";s:3:"ﲭ";s:4:"سج";s:3:"ﲮ";s:4:"سح";s:3:"ﲯ";s:4:"سخ";s:3:"ﲰ";s:4:"سم";s:3:"ﲱ";s:4:"صح";s:3:"ﲲ";s:4:"صخ";s:3:"ﲳ";s:4:"صم";s:3:"ﲴ";s:4:"ضج";s:3:"ﲵ";s:4:"ضح";s:3:"ﲶ";s:4:"ضخ";s:3:"ﲷ";s:4:"ضم";s:3:"ﲸ";s:4:"طح";s:3:"ﲹ";s:4:"ظم";s:3:"ﲺ";s:4:"عج";s:3:"ﲻ";s:4:"عم";s:3:"ﲼ";s:4:"غج";s:3:"ﲽ";s:4:"غم";s:3:"ﲾ";s:4:"فج";s:3:"ﲿ";s:4:"فح";s:3:"ﳀ";s:4:"فخ";s:3:"ﳁ";s:4:"فم";s:3:"ﳂ";s:4:"قح";s:3:"ﳃ";s:4:"قم";s:3:"ﳄ";s:4:"كج";s:3:"ﳅ";s:4:"كح";s:3:"ﳆ";s:4:"كخ";s:3:"ﳇ";s:4:"كل";s:3:"ﳈ";s:4:"كم";s:3:"ﳉ";s:4:"لج";s:3:"ﳊ";s:4:"لح";s:3:"ﳋ";s:4:"لخ";s:3:"ﳌ";s:4:"لم";s:3:"ﳍ";s:4:"له";s:3:"ﳎ";s:4:"مج";s:3:"ﳏ";s:4:"مح";s:3:"ﳐ";s:4:"مخ";s:3:"ﳑ";s:4:"مم";s:3:"ﳒ";s:4:"نج";s:3:"ﳓ";s:4:"نح";s:3:"ﳔ";s:4:"نخ";s:3:"ﳕ";s:4:"نم";s:3:"ﳖ";s:4:"نه";s:3:"ﳗ";s:4:"هج";s:3:"ﳘ";s:4:"هم";s:3:"ﳙ";s:4:"هٰ";s:3:"ﳚ";s:4:"يج";s:3:"ﳛ";s:4:"يح";s:3:"ﳜ";s:4:"يخ";s:3:"ﳝ";s:4:"يم";s:3:"ﳞ";s:4:"يه";s:3:"ﳟ";s:6:"ئم";s:3:"ﳠ";s:6:"ئه";s:3:"ﳡ";s:4:"بم";s:3:"ﳢ";s:4:"به";s:3:"ﳣ";s:4:"تم";s:3:"ﳤ";s:4:"ته";s:3:"ﳥ";s:4:"ثم";s:3:"ﳦ";s:4:"ثه";s:3:"ﳧ";s:4:"سم";s:3:"ﳨ";s:4:"سه";s:3:"ﳩ";s:4:"شم";s:3:"ﳪ";s:4:"شه";s:3:"ﳫ";s:4:"كل";s:3:"ﳬ";s:4:"كم";s:3:"ﳭ";s:4:"لم";s:3:"ﳮ";s:4:"نم";s:3:"ﳯ";s:4:"نه";s:3:"ﳰ";s:4:"يم";s:3:"ﳱ";s:4:"يه";s:3:"ﳲ";s:6:"ـَّ";s:3:"ﳳ";s:6:"ـُّ";s:3:"ﳴ";s:6:"ـِّ";s:3:"ﳵ";s:4:"طى";s:3:"ﳶ";s:4:"طي";s:3:"ﳷ";s:4:"عى";s:3:"ﳸ";s:4:"عي";s:3:"ﳹ";s:4:"غى";s:3:"ﳺ";s:4:"غي";s:3:"ﳻ";s:4:"سى";s:3:"ﳼ";s:4:"سي";s:3:"ﳽ";s:4:"شى";s:3:"ﳾ";s:4:"شي";s:3:"ﳿ";s:4:"حى";s:3:"ﴀ";s:4:"حي";s:3:"ﴁ";s:4:"جى";s:3:"ﴂ";s:4:"جي";s:3:"ﴃ";s:4:"خى";s:3:"ﴄ";s:4:"خي";s:3:"ﴅ";s:4:"صى";s:3:"ﴆ";s:4:"صي";s:3:"ﴇ";s:4:"ضى";s:3:"ﴈ";s:4:"ضي";s:3:"ﴉ";s:4:"شج";s:3:"ﴊ";s:4:"شح";s:3:"ﴋ";s:4:"شخ";s:3:"ﴌ";s:4:"شم";s:3:"ﴍ";s:4:"شر";s:3:"ﴎ";s:4:"سر";s:3:"ﴏ";s:4:"صر";s:3:"ﴐ";s:4:"ضر";s:3:"ﴑ";s:4:"طى";s:3:"ﴒ";s:4:"طي";s:3:"ﴓ";s:4:"عى";s:3:"ﴔ";s:4:"عي";s:3:"ﴕ";s:4:"غى";s:3:"ﴖ";s:4:"غي";s:3:"ﴗ";s:4:"سى";s:3:"ﴘ";s:4:"سي";s:3:"ﴙ";s:4:"شى";s:3:"ﴚ";s:4:"شي";s:3:"ﴛ";s:4:"حى";s:3:"ﴜ";s:4:"حي";s:3:"ﴝ";s:4:"جى";s:3:"ﴞ";s:4:"جي";s:3:"ﴟ";s:4:"خى";s:3:"ﴠ";s:4:"خي";s:3:"ﴡ";s:4:"صى";s:3:"ﴢ";s:4:"صي";s:3:"ﴣ";s:4:"ضى";s:3:"ﴤ";s:4:"ضي";s:3:"ﴥ";s:4:"شج";s:3:"ﴦ";s:4:"شح";s:3:"ﴧ";s:4:"شخ";s:3:"ﴨ";s:4:"شم";s:3:"ﴩ";s:4:"شر";s:3:"ﴪ";s:4:"سر";s:3:"ﴫ";s:4:"صر";s:3:"ﴬ";s:4:"ضر";s:3:"ﴭ";s:4:"شج";s:3:"ﴮ";s:4:"شح";s:3:"ﴯ";s:4:"شخ";s:3:"ﴰ";s:4:"شم";s:3:"ﴱ";s:4:"سه";s:3:"ﴲ";s:4:"شه";s:3:"ﴳ";s:4:"طم";s:3:"ﴴ";s:4:"سج";s:3:"ﴵ";s:4:"سح";s:3:"ﴶ";s:4:"سخ";s:3:"ﴷ";s:4:"شج";s:3:"ﴸ";s:4:"شح";s:3:"ﴹ";s:4:"شخ";s:3:"ﴺ";s:4:"طم";s:3:"ﴻ";s:4:"ظم";s:3:"ﴼ";s:4:"اً";s:3:"ﴽ";s:4:"اً";s:3:"ﵐ";s:6:"تجم";s:3:"ﵑ";s:6:"تحج";s:3:"ﵒ";s:6:"تحج";s:3:"ﵓ";s:6:"تحم";s:3:"ﵔ";s:6:"تخم";s:3:"ﵕ";s:6:"تمج";s:3:"ﵖ";s:6:"تمح";s:3:"ﵗ";s:6:"تمخ";s:3:"ﵘ";s:6:"جمح";s:3:"ﵙ";s:6:"جمح";s:3:"ﵚ";s:6:"حمي";s:3:"ﵛ";s:6:"حمى";s:3:"ﵜ";s:6:"سحج";s:3:"ﵝ";s:6:"سجح";s:3:"ﵞ";s:6:"سجى";s:3:"ﵟ";s:6:"سمح";s:3:"ﵠ";s:6:"سمح";s:3:"ﵡ";s:6:"سمج";s:3:"ﵢ";s:6:"سمم";s:3:"ﵣ";s:6:"سمم";s:3:"ﵤ";s:6:"صحح";s:3:"ﵥ";s:6:"صحح";s:3:"ﵦ";s:6:"صمم";s:3:"ﵧ";s:6:"شحم";s:3:"ﵨ";s:6:"شحم";s:3:"ﵩ";s:6:"شجي";s:3:"ﵪ";s:6:"شمخ";s:3:"ﵫ";s:6:"شمخ";s:3:"ﵬ";s:6:"شمم";s:3:"ﵭ";s:6:"شمم";s:3:"ﵮ";s:6:"ضحى";s:3:"ﵯ";s:6:"ضخم";s:3:"ﵰ";s:6:"ضخم";s:3:"ﵱ";s:6:"طمح";s:3:"ﵲ";s:6:"طمح";s:3:"ﵳ";s:6:"طمم";s:3:"ﵴ";s:6:"طمي";s:3:"ﵵ";s:6:"عجم";s:3:"ﵶ";s:6:"عمم";s:3:"ﵷ";s:6:"عمم";s:3:"ﵸ";s:6:"عمى";s:3:"ﵹ";s:6:"غمم";s:3:"ﵺ";s:6:"غمي";s:3:"ﵻ";s:6:"غمى";s:3:"ﵼ";s:6:"فخم";s:3:"ﵽ";s:6:"فخم";s:3:"ﵾ";s:6:"قمح";s:3:"ﵿ";s:6:"قمم";s:3:"ﶀ";s:6:"لحم";s:3:"ﶁ";s:6:"لحي";s:3:"ﶂ";s:6:"لحى";s:3:"ﶃ";s:6:"لجج";s:3:"ﶄ";s:6:"لجج";s:3:"ﶅ";s:6:"لخم";s:3:"ﶆ";s:6:"لخم";s:3:"ﶇ";s:6:"لمح";s:3:"ﶈ";s:6:"لمح";s:3:"ﶉ";s:6:"محج";s:3:"ﶊ";s:6:"محم";s:3:"ﶋ";s:6:"محي";s:3:"ﶌ";s:6:"مجح";s:3:"ﶍ";s:6:"مجم";s:3:"ﶎ";s:6:"مخج";s:3:"ﶏ";s:6:"مخم";s:3:"ﶒ";s:6:"مجخ";s:3:"ﶓ";s:6:"همج";s:3:"ﶔ";s:6:"همم";s:3:"ﶕ";s:6:"نحم";s:3:"ﶖ";s:6:"نحى";s:3:"ﶗ";s:6:"نجم";s:3:"ﶘ";s:6:"نجم";s:3:"ﶙ";s:6:"نجى";s:3:"ﶚ";s:6:"نمي";s:3:"ﶛ";s:6:"نمى";s:3:"ﶜ";s:6:"يمم";s:3:"ﶝ";s:6:"يمم";s:3:"ﶞ";s:6:"بخي";s:3:"ﶟ";s:6:"تجي";s:3:"ﶠ";s:6:"تجى";s:3:"ﶡ";s:6:"تخي";s:3:"ﶢ";s:6:"تخى";s:3:"ﶣ";s:6:"تمي";s:3:"ﶤ";s:6:"تمى";s:3:"ﶥ";s:6:"جمي";s:3:"ﶦ";s:6:"جحى";s:3:"ﶧ";s:6:"جمى";s:3:"ﶨ";s:6:"سخى";s:3:"ﶩ";s:6:"صحي";s:3:"ﶪ";s:6:"شحي";s:3:"ﶫ";s:6:"ضحي";s:3:"ﶬ";s:6:"لجي";s:3:"ﶭ";s:6:"لمي";s:3:"ﶮ";s:6:"يحي";s:3:"ﶯ";s:6:"يجي";s:3:"ﶰ";s:6:"يمي";s:3:"ﶱ";s:6:"ممي";s:3:"ﶲ";s:6:"قمي";s:3:"ﶳ";s:6:"نحي";s:3:"ﶴ";s:6:"قمح";s:3:"ﶵ";s:6:"لحم";s:3:"ﶶ";s:6:"عمي";s:3:"ﶷ";s:6:"كمي";s:3:"ﶸ";s:6:"نجح";s:3:"ﶹ";s:6:"مخي";s:3:"ﶺ";s:6:"لجم";s:3:"ﶻ";s:6:"كمم";s:3:"ﶼ";s:6:"لجم";s:3:"ﶽ";s:6:"نجح";s:3:"ﶾ";s:6:"جحي";s:3:"ﶿ";s:6:"حجي";s:3:"ﷀ";s:6:"مجي";s:3:"ﷁ";s:6:"فمي";s:3:"ﷂ";s:6:"بحي";s:3:"ﷃ";s:6:"كمم";s:3:"ﷄ";s:6:"عجم";s:3:"ﷅ";s:6:"صمم";s:3:"ﷆ";s:6:"سخي";s:3:"ﷇ";s:6:"نجي";s:3:"ﷰ";s:6:"صلے";s:3:"ﷱ";s:6:"قلے";s:3:"ﷲ";s:8:"الله";s:3:"ﷳ";s:8:"اكبر";s:3:"ﷴ";s:8:"محمد";s:3:"ﷵ";s:8:"صلعم";s:3:"ﷶ";s:8:"رسول";s:3:"ﷷ";s:8:"عليه";s:3:"ﷸ";s:8:"وسلم";s:3:"ﷹ";s:6:"صلى";s:3:"ﷺ";s:33:"صلى الله عليه وسلم";s:3:"ﷻ";s:15:"جل جلاله";s:3:"﷼";s:8:"ریال";s:3:"︐";s:1:",";s:3:"︑";s:3:"、";s:3:"︒";s:3:"。";s:3:"︓";s:1:":";s:3:"︔";s:1:";";s:3:"︕";s:1:"!";s:3:"︖";s:1:"?";s:3:"︗";s:3:"〖";s:3:"︘";s:3:"〗";s:3:"︙";s:3:"...";s:3:"︰";s:2:"..";s:3:"︱";s:3:"—";s:3:"︲";s:3:"–";s:3:"︳";s:1:"_";s:3:"︴";s:1:"_";s:3:"︵";s:1:"(";s:3:"︶";s:1:")";s:3:"︷";s:1:"{";s:3:"︸";s:1:"}";s:3:"︹";s:3:"〔";s:3:"︺";s:3:"〕";s:3:"︻";s:3:"【";s:3:"︼";s:3:"】";s:3:"︽";s:3:"《";s:3:"︾";s:3:"》";s:3:"︿";s:3:"〈";s:3:"﹀";s:3:"〉";s:3:"﹁";s:3:"「";s:3:"﹂";s:3:"」";s:3:"﹃";s:3:"『";s:3:"﹄";s:3:"』";s:3:"﹇";s:1:"[";s:3:"﹈";s:1:"]";s:3:"﹉";s:3:" ̅";s:3:"﹊";s:3:" ̅";s:3:"﹋";s:3:" ̅";s:3:"﹌";s:3:" ̅";s:3:"﹍";s:1:"_";s:3:"﹎";s:1:"_";s:3:"﹏";s:1:"_";s:3:"﹐";s:1:",";s:3:"﹑";s:3:"、";s:3:"﹒";s:1:".";s:3:"﹔";s:1:";";s:3:"﹕";s:1:":";s:3:"﹖";s:1:"?";s:3:"﹗";s:1:"!";s:3:"﹘";s:3:"—";s:3:"﹙";s:1:"(";s:3:"﹚";s:1:")";s:3:"﹛";s:1:"{";s:3:"﹜";s:1:"}";s:3:"﹝";s:3:"〔";s:3:"﹞";s:3:"〕";s:3:"﹟";s:1:"#";s:3:"﹠";s:1:"&";s:3:"﹡";s:1:"*";s:3:"﹢";s:1:"+";s:3:"﹣";s:1:"-";s:3:"﹤";s:1:"<";s:3:"﹥";s:1:">";s:3:"﹦";s:1:"=";s:3:"﹨";s:1:"\\";s:3:"﹩";s:1:"$";s:3:"﹪";s:1:"%";s:3:"﹫";s:1:"@";s:3:"ﹰ";s:3:" ً";s:3:"ﹱ";s:4:"ـً";s:3:"ﹲ";s:3:" ٌ";s:3:"ﹴ";s:3:" ٍ";s:3:"ﹶ";s:3:" َ";s:3:"ﹷ";s:4:"ـَ";s:3:"ﹸ";s:3:" ُ";s:3:"ﹹ";s:4:"ـُ";s:3:"ﹺ";s:3:" ِ";s:3:"ﹻ";s:4:"ـِ";s:3:"ﹼ";s:3:" ّ";s:3:"ﹽ";s:4:"ـّ";s:3:"ﹾ";s:3:" ْ";s:3:"ﹿ";s:4:"ـْ";s:3:"ﺀ";s:2:"ء";s:3:"ﺁ";s:4:"آ";s:3:"ﺂ";s:4:"آ";s:3:"ﺃ";s:4:"أ";s:3:"ﺄ";s:4:"أ";s:3:"ﺅ";s:4:"ؤ";s:3:"ﺆ";s:4:"ؤ";s:3:"ﺇ";s:4:"إ";s:3:"ﺈ";s:4:"إ";s:3:"ﺉ";s:4:"ئ";s:3:"ﺊ";s:4:"ئ";s:3:"ﺋ";s:4:"ئ";s:3:"ﺌ";s:4:"ئ";s:3:"ﺍ";s:2:"ا";s:3:"ﺎ";s:2:"ا";s:3:"ﺏ";s:2:"ب";s:3:"ﺐ";s:2:"ب";s:3:"ﺑ";s:2:"ب";s:3:"ﺒ";s:2:"ب";s:3:"ﺓ";s:2:"ة";s:3:"ﺔ";s:2:"ة";s:3:"ﺕ";s:2:"ت";s:3:"ﺖ";s:2:"ت";s:3:"ﺗ";s:2:"ت";s:3:"ﺘ";s:2:"ت";s:3:"ﺙ";s:2:"ث";s:3:"ﺚ";s:2:"ث";s:3:"ﺛ";s:2:"ث";s:3:"ﺜ";s:2:"ث";s:3:"ﺝ";s:2:"ج";s:3:"ﺞ";s:2:"ج";s:3:"ﺟ";s:2:"ج";s:3:"ﺠ";s:2:"ج";s:3:"ﺡ";s:2:"ح";s:3:"ﺢ";s:2:"ح";s:3:"ﺣ";s:2:"ح";s:3:"ﺤ";s:2:"ح";s:3:"ﺥ";s:2:"خ";s:3:"ﺦ";s:2:"خ";s:3:"ﺧ";s:2:"خ";s:3:"ﺨ";s:2:"خ";s:3:"ﺩ";s:2:"د";s:3:"ﺪ";s:2:"د";s:3:"ﺫ";s:2:"ذ";s:3:"ﺬ";s:2:"ذ";s:3:"ﺭ";s:2:"ر";s:3:"ﺮ";s:2:"ر";s:3:"ﺯ";s:2:"ز";s:3:"ﺰ";s:2:"ز";s:3:"ﺱ";s:2:"س";s:3:"ﺲ";s:2:"س";s:3:"ﺳ";s:2:"س";s:3:"ﺴ";s:2:"س";s:3:"ﺵ";s:2:"ش";s:3:"ﺶ";s:2:"ش";s:3:"ﺷ";s:2:"ش";s:3:"ﺸ";s:2:"ش";s:3:"ﺹ";s:2:"ص";s:3:"ﺺ";s:2:"ص";s:3:"ﺻ";s:2:"ص";s:3:"ﺼ";s:2:"ص";s:3:"ﺽ";s:2:"ض";s:3:"ﺾ";s:2:"ض";s:3:"ﺿ";s:2:"ض";s:3:"ﻀ";s:2:"ض";s:3:"ﻁ";s:2:"ط";s:3:"ﻂ";s:2:"ط";s:3:"ﻃ";s:2:"ط";s:3:"ﻄ";s:2:"ط";s:3:"ﻅ";s:2:"ظ";s:3:"ﻆ";s:2:"ظ";s:3:"ﻇ";s:2:"ظ";s:3:"ﻈ";s:2:"ظ";s:3:"ﻉ";s:2:"ع";s:3:"ﻊ";s:2:"ع";s:3:"ﻋ";s:2:"ع";s:3:"ﻌ";s:2:"ع";s:3:"ﻍ";s:2:"غ";s:3:"ﻎ";s:2:"غ";s:3:"ﻏ";s:2:"غ";s:3:"ﻐ";s:2:"غ";s:3:"ﻑ";s:2:"ف";s:3:"ﻒ";s:2:"ف";s:3:"ﻓ";s:2:"ف";s:3:"ﻔ";s:2:"ف";s:3:"ﻕ";s:2:"ق";s:3:"ﻖ";s:2:"ق";s:3:"ﻗ";s:2:"ق";s:3:"ﻘ";s:2:"ق";s:3:"ﻙ";s:2:"ك";s:3:"ﻚ";s:2:"ك";s:3:"ﻛ";s:2:"ك";s:3:"ﻜ";s:2:"ك";s:3:"ﻝ";s:2:"ل";s:3:"ﻞ";s:2:"ل";s:3:"ﻟ";s:2:"ل";s:3:"ﻠ";s:2:"ل";s:3:"ﻡ";s:2:"م";s:3:"ﻢ";s:2:"م";s:3:"ﻣ";s:2:"م";s:3:"ﻤ";s:2:"م";s:3:"ﻥ";s:2:"ن";s:3:"ﻦ";s:2:"ن";s:3:"ﻧ";s:2:"ن";s:3:"ﻨ";s:2:"ن";s:3:"ﻩ";s:2:"ه";s:3:"ﻪ";s:2:"ه";s:3:"ﻫ";s:2:"ه";s:3:"ﻬ";s:2:"ه";s:3:"ﻭ";s:2:"و";s:3:"ﻮ";s:2:"و";s:3:"ﻯ";s:2:"ى";s:3:"ﻰ";s:2:"ى";s:3:"ﻱ";s:2:"ي";s:3:"ﻲ";s:2:"ي";s:3:"ﻳ";s:2:"ي";s:3:"ﻴ";s:2:"ي";s:3:"ﻵ";s:6:"لآ";s:3:"ﻶ";s:6:"لآ";s:3:"ﻷ";s:6:"لأ";s:3:"ﻸ";s:6:"لأ";s:3:"ﻹ";s:6:"لإ";s:3:"ﻺ";s:6:"لإ";s:3:"ﻻ";s:4:"لا";s:3:"ﻼ";s:4:"لا";s:3:"!";s:1:"!";s:3:""";s:1:""";s:3:"#";s:1:"#";s:3:"$";s:1:"$";s:3:"%";s:1:"%";s:3:"&";s:1:"&";s:3:"'";s:1:"\'";s:3:"(";s:1:"(";s:3:")";s:1:")";s:3:"*";s:1:"*";s:3:"+";s:1:"+";s:3:",";s:1:",";s:3:"-";s:1:"-";s:3:".";s:1:".";s:3:"/";s:1:"/";s:3:"0";s:1:"0";s:3:"1";s:1:"1";s:3:"2";s:1:"2";s:3:"3";s:1:"3";s:3:"4";s:1:"4";s:3:"5";s:1:"5";s:3:"6";s:1:"6";s:3:"7";s:1:"7";s:3:"8";s:1:"8";s:3:"9";s:1:"9";s:3:":";s:1:":";s:3:";";s:1:";";s:3:"<";s:1:"<";s:3:"=";s:1:"=";s:3:">";s:1:">";s:3:"?";s:1:"?";s:3:"@";s:1:"@";s:3:"A";s:1:"A";s:3:"B";s:1:"B";s:3:"C";s:1:"C";s:3:"D";s:1:"D";s:3:"E";s:1:"E";s:3:"F";s:1:"F";s:3:"G";s:1:"G";s:3:"H";s:1:"H";s:3:"I";s:1:"I";s:3:"J";s:1:"J";s:3:"K";s:1:"K";s:3:"L";s:1:"L";s:3:"M";s:1:"M";s:3:"N";s:1:"N";s:3:"O";s:1:"O";s:3:"P";s:1:"P";s:3:"Q";s:1:"Q";s:3:"R";s:1:"R";s:3:"S";s:1:"S";s:3:"T";s:1:"T";s:3:"U";s:1:"U";s:3:"V";s:1:"V";s:3:"W";s:1:"W";s:3:"X";s:1:"X";s:3:"Y";s:1:"Y";s:3:"Z";s:1:"Z";s:3:"[";s:1:"[";s:3:"\";s:1:"\\";s:3:"]";s:1:"]";s:3:"^";s:1:"^";s:3:"_";s:1:"_";s:3:"`";s:1:"`";s:3:"a";s:1:"a";s:3:"b";s:1:"b";s:3:"c";s:1:"c";s:3:"d";s:1:"d";s:3:"e";s:1:"e";s:3:"f";s:1:"f";s:3:"g";s:1:"g";s:3:"h";s:1:"h";s:3:"i";s:1:"i";s:3:"j";s:1:"j";s:3:"k";s:1:"k";s:3:"l";s:1:"l";s:3:"m";s:1:"m";s:3:"n";s:1:"n";s:3:"o";s:1:"o";s:3:"p";s:1:"p";s:3:"q";s:1:"q";s:3:"r";s:1:"r";s:3:"s";s:1:"s";s:3:"t";s:1:"t";s:3:"u";s:1:"u";s:3:"v";s:1:"v";s:3:"w";s:1:"w";s:3:"x";s:1:"x";s:3:"y";s:1:"y";s:3:"z";s:1:"z";s:3:"{";s:1:"{";s:3:"|";s:1:"|";s:3:"}";s:1:"}";s:3:"~";s:1:"~";s:3:"⦅";s:3:"⦅";s:3:"⦆";s:3:"⦆";s:3:"。";s:3:"。";s:3:"「";s:3:"「";s:3:"」";s:3:"」";s:3:"、";s:3:"、";s:3:"・";s:3:"・";s:3:"ヲ";s:3:"ヲ";s:3:"ァ";s:3:"ァ";s:3:"ィ";s:3:"ィ";s:3:"ゥ";s:3:"ゥ";s:3:"ェ";s:3:"ェ";s:3:"ォ";s:3:"ォ";s:3:"ャ";s:3:"ャ";s:3:"ュ";s:3:"ュ";s:3:"ョ";s:3:"ョ";s:3:"ッ";s:3:"ッ";s:3:"ー";s:3:"ー";s:3:"ア";s:3:"ア";s:3:"イ";s:3:"イ";s:3:"ウ";s:3:"ウ";s:3:"エ";s:3:"エ";s:3:"オ";s:3:"オ";s:3:"カ";s:3:"カ";s:3:"キ";s:3:"キ";s:3:"ク";s:3:"ク";s:3:"ケ";s:3:"ケ";s:3:"コ";s:3:"コ";s:3:"サ";s:3:"サ";s:3:"シ";s:3:"シ";s:3:"ス";s:3:"ス";s:3:"セ";s:3:"セ";s:3:"ソ";s:3:"ソ";s:3:"タ";s:3:"タ";s:3:"チ";s:3:"チ";s:3:"ツ";s:3:"ツ";s:3:"テ";s:3:"テ";s:3:"ト";s:3:"ト";s:3:"ナ";s:3:"ナ";s:3:"ニ";s:3:"ニ";s:3:"ヌ";s:3:"ヌ";s:3:"ネ";s:3:"ネ";s:3:"ノ";s:3:"ノ";s:3:"ハ";s:3:"ハ";s:3:"ヒ";s:3:"ヒ";s:3:"フ";s:3:"フ";s:3:"ヘ";s:3:"ヘ";s:3:"ホ";s:3:"ホ";s:3:"マ";s:3:"マ";s:3:"ミ";s:3:"ミ";s:3:"ム";s:3:"ム";s:3:"メ";s:3:"メ";s:3:"モ";s:3:"モ";s:3:"ヤ";s:3:"ヤ";s:3:"ユ";s:3:"ユ";s:3:"ヨ";s:3:"ヨ";s:3:"ラ";s:3:"ラ";s:3:"リ";s:3:"リ";s:3:"ル";s:3:"ル";s:3:"レ";s:3:"レ";s:3:"ロ";s:3:"ロ";s:3:"ワ";s:3:"ワ";s:3:"ン";s:3:"ン";s:3:"゙";s:3:"゙";s:3:"゚";s:3:"゚";s:3:"ᅠ";s:3:"ᅠ";s:3:"ᄀ";s:3:"ᄀ";s:3:"ᄁ";s:3:"ᄁ";s:3:"ᆪ";s:3:"ᆪ";s:3:"ᄂ";s:3:"ᄂ";s:3:"ᆬ";s:3:"ᆬ";s:3:"ᆭ";s:3:"ᆭ";s:3:"ᄃ";s:3:"ᄃ";s:3:"ᄄ";s:3:"ᄄ";s:3:"ᄅ";s:3:"ᄅ";s:3:"ᆰ";s:3:"ᆰ";s:3:"ᆱ";s:3:"ᆱ";s:3:"ᆲ";s:3:"ᆲ";s:3:"ᆳ";s:3:"ᆳ";s:3:"ᆴ";s:3:"ᆴ";s:3:"ᆵ";s:3:"ᆵ";s:3:"ᄚ";s:3:"ᄚ";s:3:"ᄆ";s:3:"ᄆ";s:3:"ᄇ";s:3:"ᄇ";s:3:"ᄈ";s:3:"ᄈ";s:3:"ᄡ";s:3:"ᄡ";s:3:"ᄉ";s:3:"ᄉ";s:3:"ᄊ";s:3:"ᄊ";s:3:"ᄋ";s:3:"ᄋ";s:3:"ᄌ";s:3:"ᄌ";s:3:"ᄍ";s:3:"ᄍ";s:3:"ᄎ";s:3:"ᄎ";s:3:"ᄏ";s:3:"ᄏ";s:3:"ᄐ";s:3:"ᄐ";s:3:"ᄑ";s:3:"ᄑ";s:3:"ᄒ";s:3:"ᄒ";s:3:"ᅡ";s:3:"ᅡ";s:3:"ᅢ";s:3:"ᅢ";s:3:"ᅣ";s:3:"ᅣ";s:3:"ᅤ";s:3:"ᅤ";s:3:"ᅥ";s:3:"ᅥ";s:3:"ᅦ";s:3:"ᅦ";s:3:"ᅧ";s:3:"ᅧ";s:3:"ᅨ";s:3:"ᅨ";s:3:"ᅩ";s:3:"ᅩ";s:3:"ᅪ";s:3:"ᅪ";s:3:"ᅫ";s:3:"ᅫ";s:3:"ᅬ";s:3:"ᅬ";s:3:"ᅭ";s:3:"ᅭ";s:3:"ᅮ";s:3:"ᅮ";s:3:"ᅯ";s:3:"ᅯ";s:3:"ᅰ";s:3:"ᅰ";s:3:"ᅱ";s:3:"ᅱ";s:3:"ᅲ";s:3:"ᅲ";s:3:"ᅳ";s:3:"ᅳ";s:3:"ᅴ";s:3:"ᅴ";s:3:"ᅵ";s:3:"ᅵ";s:3:"¢";s:2:"¢";s:3:"£";s:2:"£";s:3:"¬";s:2:"¬";s:3:" ̄";s:3:" ̄";s:3:"¦";s:2:"¦";s:3:"¥";s:2:"¥";s:3:"₩";s:3:"₩";s:3:"│";s:3:"│";s:3:"←";s:3:"←";s:3:"↑";s:3:"↑";s:3:"→";s:3:"→";s:3:"↓";s:3:"↓";s:3:"■";s:3:"■";s:3:"○";s:3:"○";s:4:"𑂚";s:8:"𑂚";s:4:"𑂜";s:8:"𑂜";s:4:"𑂫";s:8:"𑂫";s:4:"𝅗𝅥";s:8:"𝅗𝅥";s:4:"𝅘𝅥";s:8:"𝅘𝅥";s:4:"𝅘𝅥𝅮";s:12:"𝅘𝅥𝅮";s:4:"𝅘𝅥𝅯";s:12:"𝅘𝅥𝅯";s:4:"𝅘𝅥𝅰";s:12:"𝅘𝅥𝅰";s:4:"𝅘𝅥𝅱";s:12:"𝅘𝅥𝅱";s:4:"𝅘𝅥𝅲";s:12:"𝅘𝅥𝅲";s:4:"𝆹𝅥";s:8:"𝆹𝅥";s:4:"𝆺𝅥";s:8:"𝆺𝅥";s:4:"𝆹𝅥𝅮";s:12:"𝆹𝅥𝅮";s:4:"𝆺𝅥𝅮";s:12:"𝆺𝅥𝅮";s:4:"𝆹𝅥𝅯";s:12:"𝆹𝅥𝅯";s:4:"𝆺𝅥𝅯";s:12:"𝆺𝅥𝅯";s:4:"𝐀";s:1:"A";s:4:"𝐁";s:1:"B";s:4:"𝐂";s:1:"C";s:4:"𝐃";s:1:"D";s:4:"𝐄";s:1:"E";s:4:"𝐅";s:1:"F";s:4:"𝐆";s:1:"G";s:4:"𝐇";s:1:"H";s:4:"𝐈";s:1:"I";s:4:"𝐉";s:1:"J";s:4:"𝐊";s:1:"K";s:4:"𝐋";s:1:"L";s:4:"𝐌";s:1:"M";s:4:"𝐍";s:1:"N";s:4:"𝐎";s:1:"O";s:4:"𝐏";s:1:"P";s:4:"𝐐";s:1:"Q";s:4:"𝐑";s:1:"R";s:4:"𝐒";s:1:"S";s:4:"𝐓";s:1:"T";s:4:"𝐔";s:1:"U";s:4:"𝐕";s:1:"V";s:4:"𝐖";s:1:"W";s:4:"𝐗";s:1:"X";s:4:"𝐘";s:1:"Y";s:4:"𝐙";s:1:"Z";s:4:"𝐚";s:1:"a";s:4:"𝐛";s:1:"b";s:4:"𝐜";s:1:"c";s:4:"𝐝";s:1:"d";s:4:"𝐞";s:1:"e";s:4:"𝐟";s:1:"f";s:4:"𝐠";s:1:"g";s:4:"𝐡";s:1:"h";s:4:"𝐢";s:1:"i";s:4:"𝐣";s:1:"j";s:4:"𝐤";s:1:"k";s:4:"𝐥";s:1:"l";s:4:"𝐦";s:1:"m";s:4:"𝐧";s:1:"n";s:4:"𝐨";s:1:"o";s:4:"𝐩";s:1:"p";s:4:"𝐪";s:1:"q";s:4:"𝐫";s:1:"r";s:4:"𝐬";s:1:"s";s:4:"𝐭";s:1:"t";s:4:"𝐮";s:1:"u";s:4:"𝐯";s:1:"v";s:4:"𝐰";s:1:"w";s:4:"𝐱";s:1:"x";s:4:"𝐲";s:1:"y";s:4:"𝐳";s:1:"z";s:4:"𝐴";s:1:"A";s:4:"𝐵";s:1:"B";s:4:"𝐶";s:1:"C";s:4:"𝐷";s:1:"D";s:4:"𝐸";s:1:"E";s:4:"𝐹";s:1:"F";s:4:"𝐺";s:1:"G";s:4:"𝐻";s:1:"H";s:4:"𝐼";s:1:"I";s:4:"𝐽";s:1:"J";s:4:"𝐾";s:1:"K";s:4:"𝐿";s:1:"L";s:4:"𝑀";s:1:"M";s:4:"𝑁";s:1:"N";s:4:"𝑂";s:1:"O";s:4:"𝑃";s:1:"P";s:4:"𝑄";s:1:"Q";s:4:"𝑅";s:1:"R";s:4:"𝑆";s:1:"S";s:4:"𝑇";s:1:"T";s:4:"𝑈";s:1:"U";s:4:"𝑉";s:1:"V";s:4:"𝑊";s:1:"W";s:4:"𝑋";s:1:"X";s:4:"𝑌";s:1:"Y";s:4:"𝑍";s:1:"Z";s:4:"𝑎";s:1:"a";s:4:"𝑏";s:1:"b";s:4:"𝑐";s:1:"c";s:4:"𝑑";s:1:"d";s:4:"𝑒";s:1:"e";s:4:"𝑓";s:1:"f";s:4:"𝑔";s:1:"g";s:4:"𝑖";s:1:"i";s:4:"𝑗";s:1:"j";s:4:"𝑘";s:1:"k";s:4:"𝑙";s:1:"l";s:4:"𝑚";s:1:"m";s:4:"𝑛";s:1:"n";s:4:"𝑜";s:1:"o";s:4:"𝑝";s:1:"p";s:4:"𝑞";s:1:"q";s:4:"𝑟";s:1:"r";s:4:"𝑠";s:1:"s";s:4:"𝑡";s:1:"t";s:4:"𝑢";s:1:"u";s:4:"𝑣";s:1:"v";s:4:"𝑤";s:1:"w";s:4:"𝑥";s:1:"x";s:4:"𝑦";s:1:"y";s:4:"𝑧";s:1:"z";s:4:"𝑨";s:1:"A";s:4:"𝑩";s:1:"B";s:4:"𝑪";s:1:"C";s:4:"𝑫";s:1:"D";s:4:"𝑬";s:1:"E";s:4:"𝑭";s:1:"F";s:4:"𝑮";s:1:"G";s:4:"𝑯";s:1:"H";s:4:"𝑰";s:1:"I";s:4:"𝑱";s:1:"J";s:4:"𝑲";s:1:"K";s:4:"𝑳";s:1:"L";s:4:"𝑴";s:1:"M";s:4:"𝑵";s:1:"N";s:4:"𝑶";s:1:"O";s:4:"𝑷";s:1:"P";s:4:"𝑸";s:1:"Q";s:4:"𝑹";s:1:"R";s:4:"𝑺";s:1:"S";s:4:"𝑻";s:1:"T";s:4:"𝑼";s:1:"U";s:4:"𝑽";s:1:"V";s:4:"𝑾";s:1:"W";s:4:"𝑿";s:1:"X";s:4:"𝒀";s:1:"Y";s:4:"𝒁";s:1:"Z";s:4:"𝒂";s:1:"a";s:4:"𝒃";s:1:"b";s:4:"𝒄";s:1:"c";s:4:"𝒅";s:1:"d";s:4:"𝒆";s:1:"e";s:4:"𝒇";s:1:"f";s:4:"𝒈";s:1:"g";s:4:"𝒉";s:1:"h";s:4:"𝒊";s:1:"i";s:4:"𝒋";s:1:"j";s:4:"𝒌";s:1:"k";s:4:"𝒍";s:1:"l";s:4:"𝒎";s:1:"m";s:4:"𝒏";s:1:"n";s:4:"𝒐";s:1:"o";s:4:"𝒑";s:1:"p";s:4:"𝒒";s:1:"q";s:4:"𝒓";s:1:"r";s:4:"𝒔";s:1:"s";s:4:"𝒕";s:1:"t";s:4:"𝒖";s:1:"u";s:4:"𝒗";s:1:"v";s:4:"𝒘";s:1:"w";s:4:"𝒙";s:1:"x";s:4:"𝒚";s:1:"y";s:4:"𝒛";s:1:"z";s:4:"𝒜";s:1:"A";s:4:"𝒞";s:1:"C";s:4:"𝒟";s:1:"D";s:4:"𝒢";s:1:"G";s:4:"𝒥";s:1:"J";s:4:"𝒦";s:1:"K";s:4:"𝒩";s:1:"N";s:4:"𝒪";s:1:"O";s:4:"𝒫";s:1:"P";s:4:"𝒬";s:1:"Q";s:4:"𝒮";s:1:"S";s:4:"𝒯";s:1:"T";s:4:"𝒰";s:1:"U";s:4:"𝒱";s:1:"V";s:4:"𝒲";s:1:"W";s:4:"𝒳";s:1:"X";s:4:"𝒴";s:1:"Y";s:4:"𝒵";s:1:"Z";s:4:"𝒶";s:1:"a";s:4:"𝒷";s:1:"b";s:4:"𝒸";s:1:"c";s:4:"𝒹";s:1:"d";s:4:"𝒻";s:1:"f";s:4:"𝒽";s:1:"h";s:4:"𝒾";s:1:"i";s:4:"𝒿";s:1:"j";s:4:"𝓀";s:1:"k";s:4:"𝓁";s:1:"l";s:4:"𝓂";s:1:"m";s:4:"𝓃";s:1:"n";s:4:"𝓅";s:1:"p";s:4:"𝓆";s:1:"q";s:4:"𝓇";s:1:"r";s:4:"𝓈";s:1:"s";s:4:"𝓉";s:1:"t";s:4:"𝓊";s:1:"u";s:4:"𝓋";s:1:"v";s:4:"𝓌";s:1:"w";s:4:"𝓍";s:1:"x";s:4:"𝓎";s:1:"y";s:4:"𝓏";s:1:"z";s:4:"𝓐";s:1:"A";s:4:"𝓑";s:1:"B";s:4:"𝓒";s:1:"C";s:4:"𝓓";s:1:"D";s:4:"𝓔";s:1:"E";s:4:"𝓕";s:1:"F";s:4:"𝓖";s:1:"G";s:4:"𝓗";s:1:"H";s:4:"𝓘";s:1:"I";s:4:"𝓙";s:1:"J";s:4:"𝓚";s:1:"K";s:4:"𝓛";s:1:"L";s:4:"𝓜";s:1:"M";s:4:"𝓝";s:1:"N";s:4:"𝓞";s:1:"O";s:4:"𝓟";s:1:"P";s:4:"𝓠";s:1:"Q";s:4:"𝓡";s:1:"R";s:4:"𝓢";s:1:"S";s:4:"𝓣";s:1:"T";s:4:"𝓤";s:1:"U";s:4:"𝓥";s:1:"V";s:4:"𝓦";s:1:"W";s:4:"𝓧";s:1:"X";s:4:"𝓨";s:1:"Y";s:4:"𝓩";s:1:"Z";s:4:"𝓪";s:1:"a";s:4:"𝓫";s:1:"b";s:4:"𝓬";s:1:"c";s:4:"𝓭";s:1:"d";s:4:"𝓮";s:1:"e";s:4:"𝓯";s:1:"f";s:4:"𝓰";s:1:"g";s:4:"𝓱";s:1:"h";s:4:"𝓲";s:1:"i";s:4:"𝓳";s:1:"j";s:4:"𝓴";s:1:"k";s:4:"𝓵";s:1:"l";s:4:"𝓶";s:1:"m";s:4:"𝓷";s:1:"n";s:4:"𝓸";s:1:"o";s:4:"𝓹";s:1:"p";s:4:"𝓺";s:1:"q";s:4:"𝓻";s:1:"r";s:4:"𝓼";s:1:"s";s:4:"𝓽";s:1:"t";s:4:"𝓾";s:1:"u";s:4:"𝓿";s:1:"v";s:4:"𝔀";s:1:"w";s:4:"𝔁";s:1:"x";s:4:"𝔂";s:1:"y";s:4:"𝔃";s:1:"z";s:4:"𝔄";s:1:"A";s:4:"𝔅";s:1:"B";s:4:"𝔇";s:1:"D";s:4:"𝔈";s:1:"E";s:4:"𝔉";s:1:"F";s:4:"𝔊";s:1:"G";s:4:"𝔍";s:1:"J";s:4:"𝔎";s:1:"K";s:4:"𝔏";s:1:"L";s:4:"𝔐";s:1:"M";s:4:"𝔑";s:1:"N";s:4:"𝔒";s:1:"O";s:4:"𝔓";s:1:"P";s:4:"𝔔";s:1:"Q";s:4:"𝔖";s:1:"S";s:4:"𝔗";s:1:"T";s:4:"𝔘";s:1:"U";s:4:"𝔙";s:1:"V";s:4:"𝔚";s:1:"W";s:4:"𝔛";s:1:"X";s:4:"𝔜";s:1:"Y";s:4:"𝔞";s:1:"a";s:4:"𝔟";s:1:"b";s:4:"𝔠";s:1:"c";s:4:"𝔡";s:1:"d";s:4:"𝔢";s:1:"e";s:4:"𝔣";s:1:"f";s:4:"𝔤";s:1:"g";s:4:"𝔥";s:1:"h";s:4:"𝔦";s:1:"i";s:4:"𝔧";s:1:"j";s:4:"𝔨";s:1:"k";s:4:"𝔩";s:1:"l";s:4:"𝔪";s:1:"m";s:4:"𝔫";s:1:"n";s:4:"𝔬";s:1:"o";s:4:"𝔭";s:1:"p";s:4:"𝔮";s:1:"q";s:4:"𝔯";s:1:"r";s:4:"𝔰";s:1:"s";s:4:"𝔱";s:1:"t";s:4:"𝔲";s:1:"u";s:4:"𝔳";s:1:"v";s:4:"𝔴";s:1:"w";s:4:"𝔵";s:1:"x";s:4:"𝔶";s:1:"y";s:4:"𝔷";s:1:"z";s:4:"𝔸";s:1:"A";s:4:"𝔹";s:1:"B";s:4:"𝔻";s:1:"D";s:4:"𝔼";s:1:"E";s:4:"𝔽";s:1:"F";s:4:"𝔾";s:1:"G";s:4:"𝕀";s:1:"I";s:4:"𝕁";s:1:"J";s:4:"𝕂";s:1:"K";s:4:"𝕃";s:1:"L";s:4:"𝕄";s:1:"M";s:4:"𝕆";s:1:"O";s:4:"𝕊";s:1:"S";s:4:"𝕋";s:1:"T";s:4:"𝕌";s:1:"U";s:4:"𝕍";s:1:"V";s:4:"𝕎";s:1:"W";s:4:"𝕏";s:1:"X";s:4:"𝕐";s:1:"Y";s:4:"𝕒";s:1:"a";s:4:"𝕓";s:1:"b";s:4:"𝕔";s:1:"c";s:4:"𝕕";s:1:"d";s:4:"𝕖";s:1:"e";s:4:"𝕗";s:1:"f";s:4:"𝕘";s:1:"g";s:4:"𝕙";s:1:"h";s:4:"𝕚";s:1:"i";s:4:"𝕛";s:1:"j";s:4:"𝕜";s:1:"k";s:4:"𝕝";s:1:"l";s:4:"𝕞";s:1:"m";s:4:"𝕟";s:1:"n";s:4:"𝕠";s:1:"o";s:4:"𝕡";s:1:"p";s:4:"𝕢";s:1:"q";s:4:"𝕣";s:1:"r";s:4:"𝕤";s:1:"s";s:4:"𝕥";s:1:"t";s:4:"𝕦";s:1:"u";s:4:"𝕧";s:1:"v";s:4:"𝕨";s:1:"w";s:4:"𝕩";s:1:"x";s:4:"𝕪";s:1:"y";s:4:"𝕫";s:1:"z";s:4:"𝕬";s:1:"A";s:4:"𝕭";s:1:"B";s:4:"𝕮";s:1:"C";s:4:"𝕯";s:1:"D";s:4:"𝕰";s:1:"E";s:4:"𝕱";s:1:"F";s:4:"𝕲";s:1:"G";s:4:"𝕳";s:1:"H";s:4:"𝕴";s:1:"I";s:4:"𝕵";s:1:"J";s:4:"𝕶";s:1:"K";s:4:"𝕷";s:1:"L";s:4:"𝕸";s:1:"M";s:4:"𝕹";s:1:"N";s:4:"𝕺";s:1:"O";s:4:"𝕻";s:1:"P";s:4:"𝕼";s:1:"Q";s:4:"𝕽";s:1:"R";s:4:"𝕾";s:1:"S";s:4:"𝕿";s:1:"T";s:4:"𝖀";s:1:"U";s:4:"𝖁";s:1:"V";s:4:"𝖂";s:1:"W";s:4:"𝖃";s:1:"X";s:4:"𝖄";s:1:"Y";s:4:"𝖅";s:1:"Z";s:4:"𝖆";s:1:"a";s:4:"𝖇";s:1:"b";s:4:"𝖈";s:1:"c";s:4:"𝖉";s:1:"d";s:4:"𝖊";s:1:"e";s:4:"𝖋";s:1:"f";s:4:"𝖌";s:1:"g";s:4:"𝖍";s:1:"h";s:4:"𝖎";s:1:"i";s:4:"𝖏";s:1:"j";s:4:"𝖐";s:1:"k";s:4:"𝖑";s:1:"l";s:4:"𝖒";s:1:"m";s:4:"𝖓";s:1:"n";s:4:"𝖔";s:1:"o";s:4:"𝖕";s:1:"p";s:4:"𝖖";s:1:"q";s:4:"𝖗";s:1:"r";s:4:"𝖘";s:1:"s";s:4:"𝖙";s:1:"t";s:4:"𝖚";s:1:"u";s:4:"𝖛";s:1:"v";s:4:"𝖜";s:1:"w";s:4:"𝖝";s:1:"x";s:4:"𝖞";s:1:"y";s:4:"𝖟";s:1:"z";s:4:"𝖠";s:1:"A";s:4:"𝖡";s:1:"B";s:4:"𝖢";s:1:"C";s:4:"𝖣";s:1:"D";s:4:"𝖤";s:1:"E";s:4:"𝖥";s:1:"F";s:4:"𝖦";s:1:"G";s:4:"𝖧";s:1:"H";s:4:"𝖨";s:1:"I";s:4:"𝖩";s:1:"J";s:4:"𝖪";s:1:"K";s:4:"𝖫";s:1:"L";s:4:"𝖬";s:1:"M";s:4:"𝖭";s:1:"N";s:4:"𝖮";s:1:"O";s:4:"𝖯";s:1:"P";s:4:"𝖰";s:1:"Q";s:4:"𝖱";s:1:"R";s:4:"𝖲";s:1:"S";s:4:"𝖳";s:1:"T";s:4:"𝖴";s:1:"U";s:4:"𝖵";s:1:"V";s:4:"𝖶";s:1:"W";s:4:"𝖷";s:1:"X";s:4:"𝖸";s:1:"Y";s:4:"𝖹";s:1:"Z";s:4:"𝖺";s:1:"a";s:4:"𝖻";s:1:"b";s:4:"𝖼";s:1:"c";s:4:"𝖽";s:1:"d";s:4:"𝖾";s:1:"e";s:4:"𝖿";s:1:"f";s:4:"𝗀";s:1:"g";s:4:"𝗁";s:1:"h";s:4:"𝗂";s:1:"i";s:4:"𝗃";s:1:"j";s:4:"𝗄";s:1:"k";s:4:"𝗅";s:1:"l";s:4:"𝗆";s:1:"m";s:4:"𝗇";s:1:"n";s:4:"𝗈";s:1:"o";s:4:"𝗉";s:1:"p";s:4:"𝗊";s:1:"q";s:4:"𝗋";s:1:"r";s:4:"𝗌";s:1:"s";s:4:"𝗍";s:1:"t";s:4:"𝗎";s:1:"u";s:4:"𝗏";s:1:"v";s:4:"𝗐";s:1:"w";s:4:"𝗑";s:1:"x";s:4:"𝗒";s:1:"y";s:4:"𝗓";s:1:"z";s:4:"𝗔";s:1:"A";s:4:"𝗕";s:1:"B";s:4:"𝗖";s:1:"C";s:4:"𝗗";s:1:"D";s:4:"𝗘";s:1:"E";s:4:"𝗙";s:1:"F";s:4:"𝗚";s:1:"G";s:4:"𝗛";s:1:"H";s:4:"𝗜";s:1:"I";s:4:"𝗝";s:1:"J";s:4:"𝗞";s:1:"K";s:4:"𝗟";s:1:"L";s:4:"𝗠";s:1:"M";s:4:"𝗡";s:1:"N";s:4:"𝗢";s:1:"O";s:4:"𝗣";s:1:"P";s:4:"𝗤";s:1:"Q";s:4:"𝗥";s:1:"R";s:4:"𝗦";s:1:"S";s:4:"𝗧";s:1:"T";s:4:"𝗨";s:1:"U";s:4:"𝗩";s:1:"V";s:4:"𝗪";s:1:"W";s:4:"𝗫";s:1:"X";s:4:"𝗬";s:1:"Y";s:4:"𝗭";s:1:"Z";s:4:"𝗮";s:1:"a";s:4:"𝗯";s:1:"b";s:4:"𝗰";s:1:"c";s:4:"𝗱";s:1:"d";s:4:"𝗲";s:1:"e";s:4:"𝗳";s:1:"f";s:4:"𝗴";s:1:"g";s:4:"𝗵";s:1:"h";s:4:"𝗶";s:1:"i";s:4:"𝗷";s:1:"j";s:4:"𝗸";s:1:"k";s:4:"𝗹";s:1:"l";s:4:"𝗺";s:1:"m";s:4:"𝗻";s:1:"n";s:4:"𝗼";s:1:"o";s:4:"𝗽";s:1:"p";s:4:"𝗾";s:1:"q";s:4:"𝗿";s:1:"r";s:4:"𝘀";s:1:"s";s:4:"𝘁";s:1:"t";s:4:"𝘂";s:1:"u";s:4:"𝘃";s:1:"v";s:4:"𝘄";s:1:"w";s:4:"𝘅";s:1:"x";s:4:"𝘆";s:1:"y";s:4:"𝘇";s:1:"z";s:4:"𝘈";s:1:"A";s:4:"𝘉";s:1:"B";s:4:"𝘊";s:1:"C";s:4:"𝘋";s:1:"D";s:4:"𝘌";s:1:"E";s:4:"𝘍";s:1:"F";s:4:"𝘎";s:1:"G";s:4:"𝘏";s:1:"H";s:4:"𝘐";s:1:"I";s:4:"𝘑";s:1:"J";s:4:"𝘒";s:1:"K";s:4:"𝘓";s:1:"L";s:4:"𝘔";s:1:"M";s:4:"𝘕";s:1:"N";s:4:"𝘖";s:1:"O";s:4:"𝘗";s:1:"P";s:4:"𝘘";s:1:"Q";s:4:"𝘙";s:1:"R";s:4:"𝘚";s:1:"S";s:4:"𝘛";s:1:"T";s:4:"𝘜";s:1:"U";s:4:"𝘝";s:1:"V";s:4:"𝘞";s:1:"W";s:4:"𝘟";s:1:"X";s:4:"𝘠";s:1:"Y";s:4:"𝘡";s:1:"Z";s:4:"𝘢";s:1:"a";s:4:"𝘣";s:1:"b";s:4:"𝘤";s:1:"c";s:4:"𝘥";s:1:"d";s:4:"𝘦";s:1:"e";s:4:"𝘧";s:1:"f";s:4:"𝘨";s:1:"g";s:4:"𝘩";s:1:"h";s:4:"𝘪";s:1:"i";s:4:"𝘫";s:1:"j";s:4:"𝘬";s:1:"k";s:4:"𝘭";s:1:"l";s:4:"𝘮";s:1:"m";s:4:"𝘯";s:1:"n";s:4:"𝘰";s:1:"o";s:4:"𝘱";s:1:"p";s:4:"𝘲";s:1:"q";s:4:"𝘳";s:1:"r";s:4:"𝘴";s:1:"s";s:4:"𝘵";s:1:"t";s:4:"𝘶";s:1:"u";s:4:"𝘷";s:1:"v";s:4:"𝘸";s:1:"w";s:4:"𝘹";s:1:"x";s:4:"𝘺";s:1:"y";s:4:"𝘻";s:1:"z";s:4:"𝘼";s:1:"A";s:4:"𝘽";s:1:"B";s:4:"𝘾";s:1:"C";s:4:"𝘿";s:1:"D";s:4:"𝙀";s:1:"E";s:4:"𝙁";s:1:"F";s:4:"𝙂";s:1:"G";s:4:"𝙃";s:1:"H";s:4:"𝙄";s:1:"I";s:4:"𝙅";s:1:"J";s:4:"𝙆";s:1:"K";s:4:"𝙇";s:1:"L";s:4:"𝙈";s:1:"M";s:4:"𝙉";s:1:"N";s:4:"𝙊";s:1:"O";s:4:"𝙋";s:1:"P";s:4:"𝙌";s:1:"Q";s:4:"𝙍";s:1:"R";s:4:"𝙎";s:1:"S";s:4:"𝙏";s:1:"T";s:4:"𝙐";s:1:"U";s:4:"𝙑";s:1:"V";s:4:"𝙒";s:1:"W";s:4:"𝙓";s:1:"X";s:4:"𝙔";s:1:"Y";s:4:"𝙕";s:1:"Z";s:4:"𝙖";s:1:"a";s:4:"𝙗";s:1:"b";s:4:"𝙘";s:1:"c";s:4:"𝙙";s:1:"d";s:4:"𝙚";s:1:"e";s:4:"𝙛";s:1:"f";s:4:"𝙜";s:1:"g";s:4:"𝙝";s:1:"h";s:4:"𝙞";s:1:"i";s:4:"𝙟";s:1:"j";s:4:"𝙠";s:1:"k";s:4:"𝙡";s:1:"l";s:4:"𝙢";s:1:"m";s:4:"𝙣";s:1:"n";s:4:"𝙤";s:1:"o";s:4:"𝙥";s:1:"p";s:4:"𝙦";s:1:"q";s:4:"𝙧";s:1:"r";s:4:"𝙨";s:1:"s";s:4:"𝙩";s:1:"t";s:4:"𝙪";s:1:"u";s:4:"𝙫";s:1:"v";s:4:"𝙬";s:1:"w";s:4:"𝙭";s:1:"x";s:4:"𝙮";s:1:"y";s:4:"𝙯";s:1:"z";s:4:"𝙰";s:1:"A";s:4:"𝙱";s:1:"B";s:4:"𝙲";s:1:"C";s:4:"𝙳";s:1:"D";s:4:"𝙴";s:1:"E";s:4:"𝙵";s:1:"F";s:4:"𝙶";s:1:"G";s:4:"𝙷";s:1:"H";s:4:"𝙸";s:1:"I";s:4:"𝙹";s:1:"J";s:4:"𝙺";s:1:"K";s:4:"𝙻";s:1:"L";s:4:"𝙼";s:1:"M";s:4:"𝙽";s:1:"N";s:4:"𝙾";s:1:"O";s:4:"𝙿";s:1:"P";s:4:"𝚀";s:1:"Q";s:4:"𝚁";s:1:"R";s:4:"𝚂";s:1:"S";s:4:"𝚃";s:1:"T";s:4:"𝚄";s:1:"U";s:4:"𝚅";s:1:"V";s:4:"𝚆";s:1:"W";s:4:"𝚇";s:1:"X";s:4:"𝚈";s:1:"Y";s:4:"𝚉";s:1:"Z";s:4:"𝚊";s:1:"a";s:4:"𝚋";s:1:"b";s:4:"𝚌";s:1:"c";s:4:"𝚍";s:1:"d";s:4:"𝚎";s:1:"e";s:4:"𝚏";s:1:"f";s:4:"𝚐";s:1:"g";s:4:"𝚑";s:1:"h";s:4:"𝚒";s:1:"i";s:4:"𝚓";s:1:"j";s:4:"𝚔";s:1:"k";s:4:"𝚕";s:1:"l";s:4:"𝚖";s:1:"m";s:4:"𝚗";s:1:"n";s:4:"𝚘";s:1:"o";s:4:"𝚙";s:1:"p";s:4:"𝚚";s:1:"q";s:4:"𝚛";s:1:"r";s:4:"𝚜";s:1:"s";s:4:"𝚝";s:1:"t";s:4:"𝚞";s:1:"u";s:4:"𝚟";s:1:"v";s:4:"𝚠";s:1:"w";s:4:"𝚡";s:1:"x";s:4:"𝚢";s:1:"y";s:4:"𝚣";s:1:"z";s:4:"𝚤";s:2:"ı";s:4:"𝚥";s:2:"ȷ";s:4:"𝚨";s:2:"Α";s:4:"𝚩";s:2:"Β";s:4:"𝚪";s:2:"Γ";s:4:"𝚫";s:2:"Δ";s:4:"𝚬";s:2:"Ε";s:4:"𝚭";s:2:"Ζ";s:4:"𝚮";s:2:"Η";s:4:"𝚯";s:2:"Θ";s:4:"𝚰";s:2:"Ι";s:4:"𝚱";s:2:"Κ";s:4:"𝚲";s:2:"Λ";s:4:"𝚳";s:2:"Μ";s:4:"𝚴";s:2:"Ν";s:4:"𝚵";s:2:"Ξ";s:4:"𝚶";s:2:"Ο";s:4:"𝚷";s:2:"Π";s:4:"𝚸";s:2:"Ρ";s:4:"𝚹";s:2:"Θ";s:4:"𝚺";s:2:"Σ";s:4:"𝚻";s:2:"Τ";s:4:"𝚼";s:2:"Υ";s:4:"𝚽";s:2:"Φ";s:4:"𝚾";s:2:"Χ";s:4:"𝚿";s:2:"Ψ";s:4:"𝛀";s:2:"Ω";s:4:"𝛁";s:3:"∇";s:4:"𝛂";s:2:"α";s:4:"𝛃";s:2:"β";s:4:"𝛄";s:2:"γ";s:4:"𝛅";s:2:"δ";s:4:"𝛆";s:2:"ε";s:4:"𝛇";s:2:"ζ";s:4:"𝛈";s:2:"η";s:4:"𝛉";s:2:"θ";s:4:"𝛊";s:2:"ι";s:4:"𝛋";s:2:"κ";s:4:"𝛌";s:2:"λ";s:4:"𝛍";s:2:"μ";s:4:"𝛎";s:2:"ν";s:4:"𝛏";s:2:"ξ";s:4:"𝛐";s:2:"ο";s:4:"𝛑";s:2:"π";s:4:"𝛒";s:2:"ρ";s:4:"𝛓";s:2:"ς";s:4:"𝛔";s:2:"σ";s:4:"𝛕";s:2:"τ";s:4:"𝛖";s:2:"υ";s:4:"𝛗";s:2:"φ";s:4:"𝛘";s:2:"χ";s:4:"𝛙";s:2:"ψ";s:4:"𝛚";s:2:"ω";s:4:"𝛛";s:3:"∂";s:4:"𝛜";s:2:"ε";s:4:"𝛝";s:2:"θ";s:4:"𝛞";s:2:"κ";s:4:"𝛟";s:2:"φ";s:4:"𝛠";s:2:"ρ";s:4:"𝛡";s:2:"π";s:4:"𝛢";s:2:"Α";s:4:"𝛣";s:2:"Β";s:4:"𝛤";s:2:"Γ";s:4:"𝛥";s:2:"Δ";s:4:"𝛦";s:2:"Ε";s:4:"𝛧";s:2:"Ζ";s:4:"𝛨";s:2:"Η";s:4:"𝛩";s:2:"Θ";s:4:"𝛪";s:2:"Ι";s:4:"𝛫";s:2:"Κ";s:4:"𝛬";s:2:"Λ";s:4:"𝛭";s:2:"Μ";s:4:"𝛮";s:2:"Ν";s:4:"𝛯";s:2:"Ξ";s:4:"𝛰";s:2:"Ο";s:4:"𝛱";s:2:"Π";s:4:"𝛲";s:2:"Ρ";s:4:"𝛳";s:2:"Θ";s:4:"𝛴";s:2:"Σ";s:4:"𝛵";s:2:"Τ";s:4:"𝛶";s:2:"Υ";s:4:"𝛷";s:2:"Φ";s:4:"𝛸";s:2:"Χ";s:4:"𝛹";s:2:"Ψ";s:4:"𝛺";s:2:"Ω";s:4:"𝛻";s:3:"∇";s:4:"𝛼";s:2:"α";s:4:"𝛽";s:2:"β";s:4:"𝛾";s:2:"γ";s:4:"𝛿";s:2:"δ";s:4:"𝜀";s:2:"ε";s:4:"𝜁";s:2:"ζ";s:4:"𝜂";s:2:"η";s:4:"𝜃";s:2:"θ";s:4:"𝜄";s:2:"ι";s:4:"𝜅";s:2:"κ";s:4:"𝜆";s:2:"λ";s:4:"𝜇";s:2:"μ";s:4:"𝜈";s:2:"ν";s:4:"𝜉";s:2:"ξ";s:4:"𝜊";s:2:"ο";s:4:"𝜋";s:2:"π";s:4:"𝜌";s:2:"ρ";s:4:"𝜍";s:2:"ς";s:4:"𝜎";s:2:"σ";s:4:"𝜏";s:2:"τ";s:4:"𝜐";s:2:"υ";s:4:"𝜑";s:2:"φ";s:4:"𝜒";s:2:"χ";s:4:"𝜓";s:2:"ψ";s:4:"𝜔";s:2:"ω";s:4:"𝜕";s:3:"∂";s:4:"𝜖";s:2:"ε";s:4:"𝜗";s:2:"θ";s:4:"𝜘";s:2:"κ";s:4:"𝜙";s:2:"φ";s:4:"𝜚";s:2:"ρ";s:4:"𝜛";s:2:"π";s:4:"𝜜";s:2:"Α";s:4:"𝜝";s:2:"Β";s:4:"𝜞";s:2:"Γ";s:4:"𝜟";s:2:"Δ";s:4:"𝜠";s:2:"Ε";s:4:"𝜡";s:2:"Ζ";s:4:"𝜢";s:2:"Η";s:4:"𝜣";s:2:"Θ";s:4:"𝜤";s:2:"Ι";s:4:"𝜥";s:2:"Κ";s:4:"𝜦";s:2:"Λ";s:4:"𝜧";s:2:"Μ";s:4:"𝜨";s:2:"Ν";s:4:"𝜩";s:2:"Ξ";s:4:"𝜪";s:2:"Ο";s:4:"𝜫";s:2:"Π";s:4:"𝜬";s:2:"Ρ";s:4:"𝜭";s:2:"Θ";s:4:"𝜮";s:2:"Σ";s:4:"𝜯";s:2:"Τ";s:4:"𝜰";s:2:"Υ";s:4:"𝜱";s:2:"Φ";s:4:"𝜲";s:2:"Χ";s:4:"𝜳";s:2:"Ψ";s:4:"𝜴";s:2:"Ω";s:4:"𝜵";s:3:"∇";s:4:"𝜶";s:2:"α";s:4:"𝜷";s:2:"β";s:4:"𝜸";s:2:"γ";s:4:"𝜹";s:2:"δ";s:4:"𝜺";s:2:"ε";s:4:"𝜻";s:2:"ζ";s:4:"𝜼";s:2:"η";s:4:"𝜽";s:2:"θ";s:4:"𝜾";s:2:"ι";s:4:"𝜿";s:2:"κ";s:4:"𝝀";s:2:"λ";s:4:"𝝁";s:2:"μ";s:4:"𝝂";s:2:"ν";s:4:"𝝃";s:2:"ξ";s:4:"𝝄";s:2:"ο";s:4:"𝝅";s:2:"π";s:4:"𝝆";s:2:"ρ";s:4:"𝝇";s:2:"ς";s:4:"𝝈";s:2:"σ";s:4:"𝝉";s:2:"τ";s:4:"𝝊";s:2:"υ";s:4:"𝝋";s:2:"φ";s:4:"𝝌";s:2:"χ";s:4:"𝝍";s:2:"ψ";s:4:"𝝎";s:2:"ω";s:4:"𝝏";s:3:"∂";s:4:"𝝐";s:2:"ε";s:4:"𝝑";s:2:"θ";s:4:"𝝒";s:2:"κ";s:4:"𝝓";s:2:"φ";s:4:"𝝔";s:2:"ρ";s:4:"𝝕";s:2:"π";s:4:"𝝖";s:2:"Α";s:4:"𝝗";s:2:"Β";s:4:"𝝘";s:2:"Γ";s:4:"𝝙";s:2:"Δ";s:4:"𝝚";s:2:"Ε";s:4:"𝝛";s:2:"Ζ";s:4:"𝝜";s:2:"Η";s:4:"𝝝";s:2:"Θ";s:4:"𝝞";s:2:"Ι";s:4:"𝝟";s:2:"Κ";s:4:"𝝠";s:2:"Λ";s:4:"𝝡";s:2:"Μ";s:4:"𝝢";s:2:"Ν";s:4:"𝝣";s:2:"Ξ";s:4:"𝝤";s:2:"Ο";s:4:"𝝥";s:2:"Π";s:4:"𝝦";s:2:"Ρ";s:4:"𝝧";s:2:"Θ";s:4:"𝝨";s:2:"Σ";s:4:"𝝩";s:2:"Τ";s:4:"𝝪";s:2:"Υ";s:4:"𝝫";s:2:"Φ";s:4:"𝝬";s:2:"Χ";s:4:"𝝭";s:2:"Ψ";s:4:"𝝮";s:2:"Ω";s:4:"𝝯";s:3:"∇";s:4:"𝝰";s:2:"α";s:4:"𝝱";s:2:"β";s:4:"𝝲";s:2:"γ";s:4:"𝝳";s:2:"δ";s:4:"𝝴";s:2:"ε";s:4:"𝝵";s:2:"ζ";s:4:"𝝶";s:2:"η";s:4:"𝝷";s:2:"θ";s:4:"𝝸";s:2:"ι";s:4:"𝝹";s:2:"κ";s:4:"𝝺";s:2:"λ";s:4:"𝝻";s:2:"μ";s:4:"𝝼";s:2:"ν";s:4:"𝝽";s:2:"ξ";s:4:"𝝾";s:2:"ο";s:4:"𝝿";s:2:"π";s:4:"𝞀";s:2:"ρ";s:4:"𝞁";s:2:"ς";s:4:"𝞂";s:2:"σ";s:4:"𝞃";s:2:"τ";s:4:"𝞄";s:2:"υ";s:4:"𝞅";s:2:"φ";s:4:"𝞆";s:2:"χ";s:4:"𝞇";s:2:"ψ";s:4:"𝞈";s:2:"ω";s:4:"𝞉";s:3:"∂";s:4:"𝞊";s:2:"ε";s:4:"𝞋";s:2:"θ";s:4:"𝞌";s:2:"κ";s:4:"𝞍";s:2:"φ";s:4:"𝞎";s:2:"ρ";s:4:"𝞏";s:2:"π";s:4:"𝞐";s:2:"Α";s:4:"𝞑";s:2:"Β";s:4:"𝞒";s:2:"Γ";s:4:"𝞓";s:2:"Δ";s:4:"𝞔";s:2:"Ε";s:4:"𝞕";s:2:"Ζ";s:4:"𝞖";s:2:"Η";s:4:"𝞗";s:2:"Θ";s:4:"𝞘";s:2:"Ι";s:4:"𝞙";s:2:"Κ";s:4:"𝞚";s:2:"Λ";s:4:"𝞛";s:2:"Μ";s:4:"𝞜";s:2:"Ν";s:4:"𝞝";s:2:"Ξ";s:4:"𝞞";s:2:"Ο";s:4:"𝞟";s:2:"Π";s:4:"𝞠";s:2:"Ρ";s:4:"𝞡";s:2:"Θ";s:4:"𝞢";s:2:"Σ";s:4:"𝞣";s:2:"Τ";s:4:"𝞤";s:2:"Υ";s:4:"𝞥";s:2:"Φ";s:4:"𝞦";s:2:"Χ";s:4:"𝞧";s:2:"Ψ";s:4:"𝞨";s:2:"Ω";s:4:"𝞩";s:3:"∇";s:4:"𝞪";s:2:"α";s:4:"𝞫";s:2:"β";s:4:"𝞬";s:2:"γ";s:4:"𝞭";s:2:"δ";s:4:"𝞮";s:2:"ε";s:4:"𝞯";s:2:"ζ";s:4:"𝞰";s:2:"η";s:4:"𝞱";s:2:"θ";s:4:"𝞲";s:2:"ι";s:4:"𝞳";s:2:"κ";s:4:"𝞴";s:2:"λ";s:4:"𝞵";s:2:"μ";s:4:"𝞶";s:2:"ν";s:4:"𝞷";s:2:"ξ";s:4:"𝞸";s:2:"ο";s:4:"𝞹";s:2:"π";s:4:"𝞺";s:2:"ρ";s:4:"𝞻";s:2:"ς";s:4:"𝞼";s:2:"σ";s:4:"𝞽";s:2:"τ";s:4:"𝞾";s:2:"υ";s:4:"𝞿";s:2:"φ";s:4:"𝟀";s:2:"χ";s:4:"𝟁";s:2:"ψ";s:4:"𝟂";s:2:"ω";s:4:"𝟃";s:3:"∂";s:4:"𝟄";s:2:"ε";s:4:"𝟅";s:2:"θ";s:4:"𝟆";s:2:"κ";s:4:"𝟇";s:2:"φ";s:4:"𝟈";s:2:"ρ";s:4:"𝟉";s:2:"π";s:4:"𝟊";s:2:"Ϝ";s:4:"𝟋";s:2:"ϝ";s:4:"𝟎";s:1:"0";s:4:"𝟏";s:1:"1";s:4:"𝟐";s:1:"2";s:4:"𝟑";s:1:"3";s:4:"𝟒";s:1:"4";s:4:"𝟓";s:1:"5";s:4:"𝟔";s:1:"6";s:4:"𝟕";s:1:"7";s:4:"𝟖";s:1:"8";s:4:"𝟗";s:1:"9";s:4:"𝟘";s:1:"0";s:4:"𝟙";s:1:"1";s:4:"𝟚";s:1:"2";s:4:"𝟛";s:1:"3";s:4:"𝟜";s:1:"4";s:4:"𝟝";s:1:"5";s:4:"𝟞";s:1:"6";s:4:"𝟟";s:1:"7";s:4:"𝟠";s:1:"8";s:4:"𝟡";s:1:"9";s:4:"𝟢";s:1:"0";s:4:"𝟣";s:1:"1";s:4:"𝟤";s:1:"2";s:4:"𝟥";s:1:"3";s:4:"𝟦";s:1:"4";s:4:"𝟧";s:1:"5";s:4:"𝟨";s:1:"6";s:4:"𝟩";s:1:"7";s:4:"𝟪";s:1:"8";s:4:"𝟫";s:1:"9";s:4:"𝟬";s:1:"0";s:4:"𝟭";s:1:"1";s:4:"𝟮";s:1:"2";s:4:"𝟯";s:1:"3";s:4:"𝟰";s:1:"4";s:4:"𝟱";s:1:"5";s:4:"𝟲";s:1:"6";s:4:"𝟳";s:1:"7";s:4:"𝟴";s:1:"8";s:4:"𝟵";s:1:"9";s:4:"𝟶";s:1:"0";s:4:"𝟷";s:1:"1";s:4:"𝟸";s:1:"2";s:4:"𝟹";s:1:"3";s:4:"𝟺";s:1:"4";s:4:"𝟻";s:1:"5";s:4:"𝟼";s:1:"6";s:4:"𝟽";s:1:"7";s:4:"𝟾";s:1:"8";s:4:"𝟿";s:1:"9";s:4:"🄀";s:2:"0.";s:4:"🄁";s:2:"0,";s:4:"🄂";s:2:"1,";s:4:"🄃";s:2:"2,";s:4:"🄄";s:2:"3,";s:4:"🄅";s:2:"4,";s:4:"🄆";s:2:"5,";s:4:"🄇";s:2:"6,";s:4:"🄈";s:2:"7,";s:4:"🄉";s:2:"8,";s:4:"🄊";s:2:"9,";s:4:"🄐";s:3:"(A)";s:4:"🄑";s:3:"(B)";s:4:"🄒";s:3:"(C)";s:4:"🄓";s:3:"(D)";s:4:"🄔";s:3:"(E)";s:4:"🄕";s:3:"(F)";s:4:"🄖";s:3:"(G)";s:4:"🄗";s:3:"(H)";s:4:"🄘";s:3:"(I)";s:4:"🄙";s:3:"(J)";s:4:"🄚";s:3:"(K)";s:4:"🄛";s:3:"(L)";s:4:"🄜";s:3:"(M)";s:4:"🄝";s:3:"(N)";s:4:"🄞";s:3:"(O)";s:4:"🄟";s:3:"(P)";s:4:"🄠";s:3:"(Q)";s:4:"🄡";s:3:"(R)";s:4:"🄢";s:3:"(S)";s:4:"🄣";s:3:"(T)";s:4:"🄤";s:3:"(U)";s:4:"🄥";s:3:"(V)";s:4:"🄦";s:3:"(W)";s:4:"🄧";s:3:"(X)";s:4:"🄨";s:3:"(Y)";s:4:"🄩";s:3:"(Z)";s:4:"🄪";s:7:"〔S〕";s:4:"🄫";s:1:"C";s:4:"🄬";s:1:"R";s:4:"🄭";s:2:"CD";s:4:"🄮";s:2:"WZ";s:4:"🄰";s:1:"A";s:4:"🄱";s:1:"B";s:4:"🄲";s:1:"C";s:4:"🄳";s:1:"D";s:4:"🄴";s:1:"E";s:4:"🄵";s:1:"F";s:4:"🄶";s:1:"G";s:4:"🄷";s:1:"H";s:4:"🄸";s:1:"I";s:4:"🄹";s:1:"J";s:4:"🄺";s:1:"K";s:4:"🄻";s:1:"L";s:4:"🄼";s:1:"M";s:4:"🄽";s:1:"N";s:4:"🄾";s:1:"O";s:4:"🄿";s:1:"P";s:4:"🅀";s:1:"Q";s:4:"🅁";s:1:"R";s:4:"🅂";s:1:"S";s:4:"🅃";s:1:"T";s:4:"🅄";s:1:"U";s:4:"🅅";s:1:"V";s:4:"🅆";s:1:"W";s:4:"🅇";s:1:"X";s:4:"🅈";s:1:"Y";s:4:"🅉";s:1:"Z";s:4:"🅊";s:2:"HV";s:4:"🅋";s:2:"MV";s:4:"🅌";s:2:"SD";s:4:"🅍";s:2:"SS";s:4:"🅎";s:3:"PPV";s:4:"🅏";s:2:"WC";s:4:"🆐";s:2:"DJ";s:4:"🈀";s:6:"ほか";s:4:"🈁";s:6:"ココ";s:4:"🈂";s:3:"サ";s:4:"🈐";s:3:"手";s:4:"🈑";s:3:"字";s:4:"🈒";s:3:"双";s:4:"🈓";s:6:"デ";s:4:"🈔";s:3:"二";s:4:"🈕";s:3:"多";s:4:"🈖";s:3:"解";s:4:"🈗";s:3:"天";s:4:"🈘";s:3:"交";s:4:"🈙";s:3:"映";s:4:"🈚";s:3:"無";s:4:"🈛";s:3:"料";s:4:"🈜";s:3:"前";s:4:"🈝";s:3:"後";s:4:"🈞";s:3:"再";s:4:"🈟";s:3:"新";s:4:"🈠";s:3:"初";s:4:"🈡";s:3:"終";s:4:"🈢";s:3:"生";s:4:"🈣";s:3:"販";s:4:"🈤";s:3:"声";s:4:"🈥";s:3:"吹";s:4:"🈦";s:3:"演";s:4:"🈧";s:3:"投";s:4:"🈨";s:3:"捕";s:4:"🈩";s:3:"一";s:4:"🈪";s:3:"三";s:4:"🈫";s:3:"遊";s:4:"🈬";s:3:"左";s:4:"🈭";s:3:"中";s:4:"🈮";s:3:"右";s:4:"🈯";s:3:"指";s:4:"🈰";s:3:"走";s:4:"🈱";s:3:"打";s:4:"🈲";s:3:"禁";s:4:"🈳";s:3:"空";s:4:"🈴";s:3:"合";s:4:"🈵";s:3:"満";s:4:"🈶";s:3:"有";s:4:"🈷";s:3:"月";s:4:"🈸";s:3:"申";s:4:"🈹";s:3:"割";s:4:"🈺";s:3:"営";s:4:"🉀";s:9:"〔本〕";s:4:"🉁";s:9:"〔三〕";s:4:"🉂";s:9:"〔二〕";s:4:"🉃";s:9:"〔安〕";s:4:"🉄";s:9:"〔点〕";s:4:"🉅";s:9:"〔打〕";s:4:"🉆";s:9:"〔盗〕";s:4:"🉇";s:9:"〔勝〕";s:4:"🉈";s:9:"〔敗〕";s:4:"🉐";s:3:"得";s:4:"🉑";s:3:"可";s:4:"丽";s:3:"丽";s:4:"丸";s:3:"丸";s:4:"乁";s:3:"乁";s:4:"𠄢";s:4:"𠄢";s:4:"你";s:3:"你";s:4:"侮";s:3:"侮";s:4:"侻";s:3:"侻";s:4:"倂";s:3:"倂";s:4:"偺";s:3:"偺";s:4:"備";s:3:"備";s:4:"僧";s:3:"僧";s:4:"像";s:3:"像";s:4:"㒞";s:3:"㒞";s:4:"𠘺";s:4:"𠘺";s:4:"免";s:3:"免";s:4:"兔";s:3:"兔";s:4:"兤";s:3:"兤";s:4:"具";s:3:"具";s:4:"𠔜";s:4:"𠔜";s:4:"㒹";s:3:"㒹";s:4:"內";s:3:"內";s:4:"再";s:3:"再";s:4:"𠕋";s:4:"𠕋";s:4:"冗";s:3:"冗";s:4:"冤";s:3:"冤";s:4:"仌";s:3:"仌";s:4:"冬";s:3:"冬";s:4:"况";s:3:"况";s:4:"𩇟";s:4:"𩇟";s:4:"凵";s:3:"凵";s:4:"刃";s:3:"刃";s:4:"㓟";s:3:"㓟";s:4:"刻";s:3:"刻";s:4:"剆";s:3:"剆";s:4:"割";s:3:"割";s:4:"剷";s:3:"剷";s:4:"㔕";s:3:"㔕";s:4:"勇";s:3:"勇";s:4:"勉";s:3:"勉";s:4:"勤";s:3:"勤";s:4:"勺";s:3:"勺";s:4:"包";s:3:"包";s:4:"匆";s:3:"匆";s:4:"北";s:3:"北";s:4:"卉";s:3:"卉";s:4:"卑";s:3:"卑";s:4:"博";s:3:"博";s:4:"即";s:3:"即";s:4:"卽";s:3:"卽";s:4:"卿";s:3:"卿";s:4:"卿";s:3:"卿";s:4:"卿";s:3:"卿";s:4:"𠨬";s:4:"𠨬";s:4:"灰";s:3:"灰";s:4:"及";s:3:"及";s:4:"叟";s:3:"叟";s:4:"𠭣";s:4:"𠭣";s:4:"叫";s:3:"叫";s:4:"叱";s:3:"叱";s:4:"吆";s:3:"吆";s:4:"咞";s:3:"咞";s:4:"吸";s:3:"吸";s:4:"呈";s:3:"呈";s:4:"周";s:3:"周";s:4:"咢";s:3:"咢";s:4:"哶";s:3:"哶";s:4:"唐";s:3:"唐";s:4:"啓";s:3:"啓";s:4:"啣";s:3:"啣";s:4:"善";s:3:"善";s:4:"善";s:3:"善";s:4:"喙";s:3:"喙";s:4:"喫";s:3:"喫";s:4:"喳";s:3:"喳";s:4:"嗂";s:3:"嗂";s:4:"圖";s:3:"圖";s:4:"嘆";s:3:"嘆";s:4:"圗";s:3:"圗";s:4:"噑";s:3:"噑";s:4:"噴";s:3:"噴";s:4:"切";s:3:"切";s:4:"壮";s:3:"壮";s:4:"城";s:3:"城";s:4:"埴";s:3:"埴";s:4:"堍";s:3:"堍";s:4:"型";s:3:"型";s:4:"堲";s:3:"堲";s:4:"報";s:3:"報";s:4:"墬";s:3:"墬";s:4:"𡓤";s:4:"𡓤";s:4:"売";s:3:"売";s:4:"壷";s:3:"壷";s:4:"夆";s:3:"夆";s:4:"多";s:3:"多";s:4:"夢";s:3:"夢";s:4:"奢";s:3:"奢";s:4:"𡚨";s:4:"𡚨";s:4:"𡛪";s:4:"𡛪";s:4:"姬";s:3:"姬";s:4:"娛";s:3:"娛";s:4:"娧";s:3:"娧";s:4:"姘";s:3:"姘";s:4:"婦";s:3:"婦";s:4:"㛮";s:3:"㛮";s:4:"㛼";s:3:"㛼";s:4:"嬈";s:3:"嬈";s:4:"嬾";s:3:"嬾";s:4:"嬾";s:3:"嬾";s:4:"𡧈";s:4:"𡧈";s:4:"寃";s:3:"寃";s:4:"寘";s:3:"寘";s:4:"寧";s:3:"寧";s:4:"寳";s:3:"寳";s:4:"𡬘";s:4:"𡬘";s:4:"寿";s:3:"寿";s:4:"将";s:3:"将";s:4:"当";s:3:"当";s:4:"尢";s:3:"尢";s:4:"㞁";s:3:"㞁";s:4:"屠";s:3:"屠";s:4:"屮";s:3:"屮";s:4:"峀";s:3:"峀";s:4:"岍";s:3:"岍";s:4:"𡷤";s:4:"𡷤";s:4:"嵃";s:3:"嵃";s:4:"𡷦";s:4:"𡷦";s:4:"嵮";s:3:"嵮";s:4:"嵫";s:3:"嵫";s:4:"嵼";s:3:"嵼";s:4:"巡";s:3:"巡";s:4:"巢";s:3:"巢";s:4:"㠯";s:3:"㠯";s:4:"巽";s:3:"巽";s:4:"帨";s:3:"帨";s:4:"帽";s:3:"帽";s:4:"幩";s:3:"幩";s:4:"㡢";s:3:"㡢";s:4:"𢆃";s:4:"𢆃";s:4:"㡼";s:3:"㡼";s:4:"庰";s:3:"庰";s:4:"庳";s:3:"庳";s:4:"庶";s:3:"庶";s:4:"廊";s:3:"廊";s:4:"𪎒";s:4:"𪎒";s:4:"廾";s:3:"廾";s:4:"𢌱";s:4:"𢌱";s:4:"𢌱";s:4:"𢌱";s:4:"舁";s:3:"舁";s:4:"弢";s:3:"弢";s:4:"弢";s:3:"弢";s:4:"㣇";s:3:"㣇";s:4:"𣊸";s:4:"𣊸";s:4:"𦇚";s:4:"𦇚";s:4:"形";s:3:"形";s:4:"彫";s:3:"彫";s:4:"㣣";s:3:"㣣";s:4:"徚";s:3:"徚";s:4:"忍";s:3:"忍";s:4:"志";s:3:"志";s:4:"忹";s:3:"忹";s:4:"悁";s:3:"悁";s:4:"㤺";s:3:"㤺";s:4:"㤜";s:3:"㤜";s:4:"悔";s:3:"悔";s:4:"𢛔";s:4:"𢛔";s:4:"惇";s:3:"惇";s:4:"慈";s:3:"慈";s:4:"慌";s:3:"慌";s:4:"慎";s:3:"慎";s:4:"慌";s:3:"慌";s:4:"慺";s:3:"慺";s:4:"憎";s:3:"憎";s:4:"憲";s:3:"憲";s:4:"憤";s:3:"憤";s:4:"憯";s:3:"憯";s:4:"懞";s:3:"懞";s:4:"懲";s:3:"懲";s:4:"懶";s:3:"懶";s:4:"成";s:3:"成";s:4:"戛";s:3:"戛";s:4:"扝";s:3:"扝";s:4:"抱";s:3:"抱";s:4:"拔";s:3:"拔";s:4:"捐";s:3:"捐";s:4:"𢬌";s:4:"𢬌";s:4:"挽";s:3:"挽";s:4:"拼";s:3:"拼";s:4:"捨";s:3:"捨";s:4:"掃";s:3:"掃";s:4:"揤";s:3:"揤";s:4:"𢯱";s:4:"𢯱";s:4:"搢";s:3:"搢";s:4:"揅";s:3:"揅";s:4:"掩";s:3:"掩";s:4:"㨮";s:3:"㨮";s:4:"摩";s:3:"摩";s:4:"摾";s:3:"摾";s:4:"撝";s:3:"撝";s:4:"摷";s:3:"摷";s:4:"㩬";s:3:"㩬";s:4:"敏";s:3:"敏";s:4:"敬";s:3:"敬";s:4:"𣀊";s:4:"𣀊";s:4:"旣";s:3:"旣";s:4:"書";s:3:"書";s:4:"晉";s:3:"晉";s:4:"㬙";s:3:"㬙";s:4:"暑";s:3:"暑";s:4:"㬈";s:3:"㬈";s:4:"㫤";s:3:"㫤";s:4:"冒";s:3:"冒";s:4:"冕";s:3:"冕";s:4:"最";s:3:"最";s:4:"暜";s:3:"暜";s:4:"肭";s:3:"肭";s:4:"䏙";s:3:"䏙";s:4:"朗";s:3:"朗";s:4:"望";s:3:"望";s:4:"朡";s:3:"朡";s:4:"杞";s:3:"杞";s:4:"杓";s:3:"杓";s:4:"𣏃";s:4:"𣏃";s:4:"㭉";s:3:"㭉";s:4:"柺";s:3:"柺";s:4:"枅";s:3:"枅";s:4:"桒";s:3:"桒";s:4:"梅";s:3:"梅";s:4:"𣑭";s:4:"𣑭";s:4:"梎";s:3:"梎";s:4:"栟";s:3:"栟";s:4:"椔";s:3:"椔";s:4:"㮝";s:3:"㮝";s:4:"楂";s:3:"楂";s:4:"榣";s:3:"榣";s:4:"槪";s:3:"槪";s:4:"檨";s:3:"檨";s:4:"𣚣";s:4:"𣚣";s:4:"櫛";s:3:"櫛";s:4:"㰘";s:3:"㰘";s:4:"次";s:3:"次";s:4:"𣢧";s:4:"𣢧";s:4:"歔";s:3:"歔";s:4:"㱎";s:3:"㱎";s:4:"歲";s:3:"歲";s:4:"殟";s:3:"殟";s:4:"殺";s:3:"殺";s:4:"殻";s:3:"殻";s:4:"𣪍";s:4:"𣪍";s:4:"𡴋";s:4:"𡴋";s:4:"𣫺";s:4:"𣫺";s:4:"汎";s:3:"汎";s:4:"𣲼";s:4:"𣲼";s:4:"沿";s:3:"沿";s:4:"泍";s:3:"泍";s:4:"汧";s:3:"汧";s:4:"洖";s:3:"洖";s:4:"派";s:3:"派";s:4:"海";s:3:"海";s:4:"流";s:3:"流";s:4:"浩";s:3:"浩";s:4:"浸";s:3:"浸";s:4:"涅";s:3:"涅";s:4:"𣴞";s:4:"𣴞";s:4:"洴";s:3:"洴";s:4:"港";s:3:"港";s:4:"湮";s:3:"湮";s:4:"㴳";s:3:"㴳";s:4:"滋";s:3:"滋";s:4:"滇";s:3:"滇";s:4:"𣻑";s:4:"𣻑";s:4:"淹";s:3:"淹";s:4:"潮";s:3:"潮";s:4:"𣽞";s:4:"𣽞";s:4:"𣾎";s:4:"𣾎";s:4:"濆";s:3:"濆";s:4:"瀹";s:3:"瀹";s:4:"瀞";s:3:"瀞";s:4:"瀛";s:3:"瀛";s:4:"㶖";s:3:"㶖";s:4:"灊";s:3:"灊";s:4:"災";s:3:"災";s:4:"灷";s:3:"灷";s:4:"炭";s:3:"炭";s:4:"𠔥";s:4:"𠔥";s:4:"煅";s:3:"煅";s:4:"𤉣";s:4:"𤉣";s:4:"熜";s:3:"熜";s:4:"𤎫";s:4:"𤎫";s:4:"爨";s:3:"爨";s:4:"爵";s:3:"爵";s:4:"牐";s:3:"牐";s:4:"𤘈";s:4:"𤘈";s:4:"犀";s:3:"犀";s:4:"犕";s:3:"犕";s:4:"𤜵";s:4:"𤜵";s:4:"𤠔";s:4:"𤠔";s:4:"獺";s:3:"獺";s:4:"王";s:3:"王";s:4:"㺬";s:3:"㺬";s:4:"玥";s:3:"玥";s:4:"㺸";s:3:"㺸";s:4:"㺸";s:3:"㺸";s:4:"瑇";s:3:"瑇";s:4:"瑜";s:3:"瑜";s:4:"瑱";s:3:"瑱";s:4:"璅";s:3:"璅";s:4:"瓊";s:3:"瓊";s:4:"㼛";s:3:"㼛";s:4:"甤";s:3:"甤";s:4:"𤰶";s:4:"𤰶";s:4:"甾";s:3:"甾";s:4:"𤲒";s:4:"𤲒";s:4:"異";s:3:"異";s:4:"𢆟";s:4:"𢆟";s:4:"瘐";s:3:"瘐";s:4:"𤾡";s:4:"𤾡";s:4:"𤾸";s:4:"𤾸";s:4:"𥁄";s:4:"𥁄";s:4:"㿼";s:3:"㿼";s:4:"䀈";s:3:"䀈";s:4:"直";s:3:"直";s:4:"𥃳";s:4:"𥃳";s:4:"𥃲";s:4:"𥃲";s:4:"𥄙";s:4:"𥄙";s:4:"𥄳";s:4:"𥄳";s:4:"眞";s:3:"眞";s:4:"真";s:3:"真";s:4:"真";s:3:"真";s:4:"睊";s:3:"睊";s:4:"䀹";s:3:"䀹";s:4:"瞋";s:3:"瞋";s:4:"䁆";s:3:"䁆";s:4:"䂖";s:3:"䂖";s:4:"𥐝";s:4:"𥐝";s:4:"硎";s:3:"硎";s:4:"碌";s:3:"碌";s:4:"磌";s:3:"磌";s:4:"䃣";s:3:"䃣";s:4:"𥘦";s:4:"𥘦";s:4:"祖";s:3:"祖";s:4:"𥚚";s:4:"𥚚";s:4:"𥛅";s:4:"𥛅";s:4:"福";s:3:"福";s:4:"秫";s:3:"秫";s:4:"䄯";s:3:"䄯";s:4:"穀";s:3:"穀";s:4:"穊";s:3:"穊";s:4:"穏";s:3:"穏";s:4:"𥥼";s:4:"𥥼";s:4:"𥪧";s:4:"𥪧";s:4:"𥪧";s:4:"𥪧";s:4:"竮";s:3:"竮";s:4:"䈂";s:3:"䈂";s:4:"𥮫";s:4:"𥮫";s:4:"篆";s:3:"篆";s:4:"築";s:3:"築";s:4:"䈧";s:3:"䈧";s:4:"𥲀";s:4:"𥲀";s:4:"糒";s:3:"糒";s:4:"䊠";s:3:"䊠";s:4:"糨";s:3:"糨";s:4:"糣";s:3:"糣";s:4:"紀";s:3:"紀";s:4:"𥾆";s:4:"𥾆";s:4:"絣";s:3:"絣";s:4:"䌁";s:3:"䌁";s:4:"緇";s:3:"緇";s:4:"縂";s:3:"縂";s:4:"繅";s:3:"繅";s:4:"䌴";s:3:"䌴";s:4:"𦈨";s:4:"𦈨";s:4:"𦉇";s:4:"𦉇";s:4:"䍙";s:3:"䍙";s:4:"𦋙";s:4:"𦋙";s:4:"罺";s:3:"罺";s:4:"𦌾";s:4:"𦌾";s:4:"羕";s:3:"羕";s:4:"翺";s:3:"翺";s:4:"者";s:3:"者";s:4:"𦓚";s:4:"𦓚";s:4:"𦔣";s:4:"𦔣";s:4:"聠";s:3:"聠";s:4:"𦖨";s:4:"𦖨";s:4:"聰";s:3:"聰";s:4:"𣍟";s:4:"𣍟";s:4:"䏕";s:3:"䏕";s:4:"育";s:3:"育";s:4:"脃";s:3:"脃";s:4:"䐋";s:3:"䐋";s:4:"脾";s:3:"脾";s:4:"媵";s:3:"媵";s:4:"𦞧";s:4:"𦞧";s:4:"𦞵";s:4:"𦞵";s:4:"𣎓";s:4:"𣎓";s:4:"𣎜";s:4:"𣎜";s:4:"舁";s:3:"舁";s:4:"舄";s:3:"舄";s:4:"辞";s:3:"辞";s:4:"䑫";s:3:"䑫";s:4:"芑";s:3:"芑";s:4:"芋";s:3:"芋";s:4:"芝";s:3:"芝";s:4:"劳";s:3:"劳";s:4:"花";s:3:"花";s:4:"芳";s:3:"芳";s:4:"芽";s:3:"芽";s:4:"苦";s:3:"苦";s:4:"𦬼";s:4:"𦬼";s:4:"若";s:3:"若";s:4:"茝";s:3:"茝";s:4:"荣";s:3:"荣";s:4:"莭";s:3:"莭";s:4:"茣";s:3:"茣";s:4:"莽";s:3:"莽";s:4:"菧";s:3:"菧";s:4:"著";s:3:"著";s:4:"荓";s:3:"荓";s:4:"菊";s:3:"菊";s:4:"菌";s:3:"菌";s:4:"菜";s:3:"菜";s:4:"𦰶";s:4:"𦰶";s:4:"𦵫";s:4:"𦵫";s:4:"𦳕";s:4:"𦳕";s:4:"䔫";s:3:"䔫";s:4:"蓱";s:3:"蓱";s:4:"蓳";s:3:"蓳";s:4:"蔖";s:3:"蔖";s:4:"𧏊";s:4:"𧏊";s:4:"蕤";s:3:"蕤";s:4:"𦼬";s:4:"𦼬";s:4:"䕝";s:3:"䕝";s:4:"䕡";s:3:"䕡";s:4:"𦾱";s:4:"𦾱";s:4:"𧃒";s:4:"𧃒";s:4:"䕫";s:3:"䕫";s:4:"虐";s:3:"虐";s:4:"虜";s:3:"虜";s:4:"虧";s:3:"虧";s:4:"虩";s:3:"虩";s:4:"蚩";s:3:"蚩";s:4:"蚈";s:3:"蚈";s:4:"蜎";s:3:"蜎";s:4:"蛢";s:3:"蛢";s:4:"蝹";s:3:"蝹";s:4:"蜨";s:3:"蜨";s:4:"蝫";s:3:"蝫";s:4:"螆";s:3:"螆";s:4:"䗗";s:3:"䗗";s:4:"蟡";s:3:"蟡";s:4:"蠁";s:3:"蠁";s:4:"䗹";s:3:"䗹";s:4:"衠";s:3:"衠";s:4:"衣";s:3:"衣";s:4:"𧙧";s:4:"𧙧";s:4:"裗";s:3:"裗";s:4:"裞";s:3:"裞";s:4:"䘵";s:3:"䘵";s:4:"裺";s:3:"裺";s:4:"㒻";s:3:"㒻";s:4:"𧢮";s:4:"𧢮";s:4:"𧥦";s:4:"𧥦";s:4:"䚾";s:3:"䚾";s:4:"䛇";s:3:"䛇";s:4:"誠";s:3:"誠";s:4:"諭";s:3:"諭";s:4:"變";s:3:"變";s:4:"豕";s:3:"豕";s:4:"𧲨";s:4:"𧲨";s:4:"貫";s:3:"貫";s:4:"賁";s:3:"賁";s:4:"贛";s:3:"贛";s:4:"起";s:3:"起";s:4:"𧼯";s:4:"𧼯";s:4:"𠠄";s:4:"𠠄";s:4:"跋";s:3:"跋";s:4:"趼";s:3:"趼";s:4:"跰";s:3:"跰";s:4:"𠣞";s:4:"𠣞";s:4:"軔";s:3:"軔";s:4:"輸";s:3:"輸";s:4:"𨗒";s:4:"𨗒";s:4:"𨗭";s:4:"𨗭";s:4:"邔";s:3:"邔";s:4:"郱";s:3:"郱";s:4:"鄑";s:3:"鄑";s:4:"𨜮";s:4:"𨜮";s:4:"鄛";s:3:"鄛";s:4:"鈸";s:3:"鈸";s:4:"鋗";s:3:"鋗";s:4:"鋘";s:3:"鋘";s:4:"鉼";s:3:"鉼";s:4:"鏹";s:3:"鏹";s:4:"鐕";s:3:"鐕";s:4:"𨯺";s:4:"𨯺";s:4:"開";s:3:"開";s:4:"䦕";s:3:"䦕";s:4:"閷";s:3:"閷";s:4:"𨵷";s:4:"𨵷";s:4:"䧦";s:3:"䧦";s:4:"雃";s:3:"雃";s:4:"嶲";s:3:"嶲";s:4:"霣";s:3:"霣";s:4:"𩅅";s:4:"𩅅";s:4:"𩈚";s:4:"𩈚";s:4:"䩮";s:3:"䩮";s:4:"䩶";s:3:"䩶";s:4:"韠";s:3:"韠";s:4:"𩐊";s:4:"𩐊";s:4:"䪲";s:3:"䪲";s:4:"𩒖";s:4:"𩒖";s:4:"頋";s:3:"頋";s:4:"頋";s:3:"頋";s:4:"頩";s:3:"頩";s:4:"𩖶";s:4:"𩖶";s:4:"飢";s:3:"飢";s:4:"䬳";s:3:"䬳";s:4:"餩";s:3:"餩";s:4:"馧";s:3:"馧";s:4:"駂";s:3:"駂";s:4:"駾";s:3:"駾";s:4:"䯎";s:3:"䯎";s:4:"𩬰";s:4:"𩬰";s:4:"鬒";s:3:"鬒";s:4:"鱀";s:3:"鱀";s:4:"鳽";s:3:"鳽";s:4:"䳎";s:3:"䳎";s:4:"䳭";s:3:"䳭";s:4:"鵧";s:3:"鵧";s:4:"𪃎";s:4:"𪃎";s:4:"䳸";s:3:"䳸";s:4:"𪄅";s:4:"𪄅";s:4:"𪈎";s:4:"𪈎";s:4:"𪊑";s:4:"𪊑";s:4:"麻";s:3:"麻";s:4:"䵖";s:3:"䵖";s:4:"黹";s:3:"黹";s:4:"黾";s:3:"黾";s:4:"鼅";s:3:"鼅";s:4:"鼏";s:3:"鼏";s:4:"鼖";s:3:"鼖";s:4:"鼻";s:3:"鼻";s:4:"𪘀";s:4:"𪘀";}' );
 
index b07e339..18d89f6 100644 (file)
@@ -46,7 +46,6 @@ define( 'UNICODE_SURROGATE_LAST', 0xdfff );
 define( 'UNICODE_MAX', 0x10ffff );
 define( 'UNICODE_REPLACEMENT', 0xfffd );
 
-
 define( 'UTF8_HANGUL_FIRST', "\xea\xb0\x80" /*codepointToUtf8( UNICODE_HANGUL_FIRST )*/ );
 define( 'UTF8_HANGUL_LAST', "\xed\x9e\xa3" /*codepointToUtf8( UNICODE_HANGUL_LAST )*/ );
 
index 676f8f7..f57aa6c 100644 (file)
  * @ingroup UtfNormal
  */
 
-if( PHP_SAPI != 'cli' ) {
+if ( PHP_SAPI != 'cli' ) {
        die( "Run me from the command line please.\n" );
 }
 
 require_once 'UtfNormalDefines.php';
 require_once 'UtfNormalUtil.php';
 
-$in = fopen("DerivedNormalizationProps.txt", "rt" );
-if( !$in ) {
+$in = fopen( "DerivedNormalizationProps.txt", "rt" );
+if ( !$in ) {
        print "Can't open DerivedNormalizationProps.txt for reading.\n";
        print "If necessary, fetch this file from the internet:\n";
        print "http://www.unicode.org/Public/UNIDATA/DerivedNormalizationProps.txt\n";
-       exit(-1);
+       exit( -1 );
 }
 print "Initializing normalization quick check tables...\n";
 $checkNFC = array();
-while( false !== ($line = fgets( $in ) ) ) {
+while ( false !== ( $line = fgets( $in ) ) ) {
        $matches = array();
-       if( preg_match( '/^([0-9A-F]+)(?:..([0-9A-F]+))?\s*;\s*(NFC_QC)\s*;\s*([MN])/', $line, $matches ) ) {
+       if ( preg_match(
+               '/^([0-9A-F]+)(?:..([0-9A-F]+))?\s*;\s*(NFC_QC)\s*;\s*([MN])/',
+               $line,
+               $matches )
+       ) {
                list( $junk, $first, $last, $prop, $value ) = $matches;
                #print "$first $last $prop $value\n";
-               if( !$last ) $last = $first;
-               for( $i = hexdec( $first ); $i <= hexdec( $last ); $i++) {
+               if ( !$last ) {
+                       $last = $first;
+               }
+
+               $lastInDecimal = hexdec( $last );
+               for ( $i = hexdec( $first ); $i <= $lastInDecimal; $i++ ) {
                        $char = codepointToUtf8( $i );
                        $checkNFC[$char] = $value;
                }
@@ -55,29 +63,29 @@ while( false !== ($line = fgets( $in ) ) ) {
 }
 fclose( $in );
 
-$in = fopen("CompositionExclusions.txt", "rt" );
-if( !$in ) {
+$in = fopen( "CompositionExclusions.txt", "rt" );
+if ( !$in ) {
        print "Can't open CompositionExclusions.txt for reading.\n";
        print "If necessary, fetch this file from the internet:\n";
        print "http://www.unicode.org/Public/UNIDATA/CompositionExclusions.txt\n";
-       exit(-1);
+       exit( -1 );
 }
 $exclude = array();
-while( false !== ($line = fgets( $in ) ) ) {
-       if( preg_match( '/^([0-9A-F]+)/i', $line, $matches ) ) {
+while ( false !== ( $line = fgets( $in ) ) ) {
+       if ( preg_match( '/^([0-9A-F]+)/i', $line, $matches ) ) {
                $codepoint = $matches[1];
                $source = codepointToUtf8( hexdec( $codepoint ) );
                $exclude[$source] = true;
        }
 }
-fclose($in);
+fclose( $in );
 
-$in = fopen("UnicodeData.txt", "rt" );
-if( !$in ) {
+$in = fopen( "UnicodeData.txt", "rt" );
+if ( !$in ) {
        print "Can't open UnicodeData.txt for reading.\n";
        print "If necessary, fetch this file from the internet:\n";
        print "http://www.unicode.org/Public/UNIDATA/UnicodeData.txt\n";
-       exit(-1);
+       exit( -1 );
 }
 
 $compatibilityDecomp = array();
@@ -89,8 +97,8 @@ $compat = 0;
 $canon = 0;
 
 print "Reading character definitions...\n";
-while( false !== ($line = fgets( $in ) ) ) {
-       $columns = explode(';', $line);
+while ( false !== ( $line = fgets( $in ) ) ) {
+       $columns = explode( ';', $line );
        $codepoint = $columns[0];
        $name = $columns[1];
        $canonicalCombiningClass = $columns[3];
@@ -98,12 +106,12 @@ while( false !== ($line = fgets( $in ) ) ) {
 
        $source = codepointToUtf8( hexdec( $codepoint ) );
 
-       if( $canonicalCombiningClass != 0 ) {
+       if ( $canonicalCombiningClass != 0 ) {
                $combiningClass[$source] = intval( $canonicalCombiningClass );
        }
 
-       if( $decompositionMapping === '' ) continue;
-       if( preg_match( '/^<(.+)> (.*)$/', $decompositionMapping, $matches ) ) {
+       if ( $decompositionMapping === '' ) continue;
+       if ( preg_match( '/^<(.+)> (.*)$/', $decompositionMapping, $matches ) ) {
                # Compatibility decomposition
                $canonical = false;
                $decompositionMapping = $matches[2];
@@ -116,9 +124,9 @@ while( false !== ($line = fgets( $in ) ) ) {
        $dest = hexSequenceToUtf8( $decompositionMapping );
 
        $compatibilityDecomp[$source] = $dest;
-       if( $canonical ) {
+       if ( $canonical ) {
                $canonicalDecomp[$source] = $dest;
-               if( empty( $exclude[$source] ) ) {
+               if ( empty( $exclude[$source] ) ) {
                        $canonicalComp[$dest] = $source;
                }
        }
@@ -129,15 +137,15 @@ fclose( $in );
 print "Recursively expanding canonical mappings...\n";
 $changed = 42;
 $pass = 1;
-while( $changed > 0 ) {
+while ( $changed > 0 ) {
        print "pass $pass\n";
        $changed = 0;
-       foreach( $canonicalDecomp as $source => $dest ) {
+       foreach ( $canonicalDecomp as $source => $dest ) {
                $newDest = preg_replace_callback(
                        '/([\xc0-\xff][\x80-\xbf]+)/',
                        'callbackCanonical',
-                       $dest);
-               if( $newDest === $dest ) continue;
+                       $dest );
+               if ( $newDest === $dest ) continue;
                $changed++;
                $canonicalDecomp[$source] = $newDest;
        }
@@ -147,15 +155,15 @@ while( $changed > 0 ) {
 print "Recursively expanding compatibility mappings...\n";
 $changed = 42;
 $pass = 1;
-while( $changed > 0 ) {
+while ( $changed > 0 ) {
        print "pass $pass\n";
        $changed = 0;
-       foreach( $compatibilityDecomp as $source => $dest ) {
+       foreach ( $compatibilityDecomp as $source => $dest ) {
                $newDest = preg_replace_callback(
                        '/([\xc0-\xff][\x80-\xbf]+)/',
                        'callbackCompat',
-                       $dest);
-               if( $newDest === $dest ) continue;
+                       $dest );
+               if ( $newDest === $dest ) continue;
                $changed++;
                $compatibilityDecomp[$source] = $newDest;
        }
@@ -164,8 +172,8 @@ while( $changed > 0 ) {
 
 print "$total decomposition mappings ($canon canonical, $compat compatibility)\n";
 
-$out = fopen("UtfNormalData.inc", "wt");
-if( $out ) {
+$out = fopen( "UtfNormalData.inc", "wt" );
+if ( $out ) {
        $serCombining = escapeSingleString( serialize( $combiningClass ) );
        $serComp = escapeSingleString( serialize( $canonicalComp ) );
        $serCanon = escapeSingleString( serialize( $canonicalDecomp ) );
@@ -177,6 +185,7 @@ if( $out ) {
  *
  * @file
  */
+// @codingStandardsIgnoreFile
 
 UtfNormal::\$utfCombiningClass = unserialize( '$serCombining' );
 UtfNormal::\$utfCanonicalComp = unserialize( '$serComp' );
@@ -188,12 +197,11 @@ UtfNormal::\$utfCheckNFC = unserialize( '$serCheckNFC' );
        print "Wrote out UtfNormalData.inc\n";
 } else {
        print "Can't create file UtfNormalData.inc\n";
-       exit(-1);
+       exit( -1 );
 }
 
-
-$out = fopen("UtfNormalDataK.inc", "wt");
-if( $out ) {
+$out = fopen( "UtfNormalDataK.inc", "wt" );
+if ( $out ) {
        $serCompat = escapeSingleString( serialize( $compatibilityDecomp ) );
        $outdata = "<" . "?php
 /**
@@ -202,32 +210,41 @@ if( $out ) {
  *
  * @file
  */
+// @codingStandardsIgnoreFile
 
 UtfNormal::\$utfCompatibilityDecomp = unserialize( '$serCompat' );
 \n";
        fputs( $out, $outdata );
        fclose( $out );
        print "Wrote out UtfNormalDataK.inc\n";
-       exit(0);
+       exit( 0 );
 } else {
        print "Can't create file UtfNormalDataK.inc\n";
-       exit(-1);
+       exit( -1 );
 }
 
 # ---------------
 
 function callbackCanonical( $matches ) {
+       // @codingStandardsIgnoreStart MediaWiki.NamingConventions.ValidGlobalName.wgPrefix
        global $canonicalDecomp;
-       if( isset( $canonicalDecomp[$matches[1]] ) ) {
+       // @codingStandardsIgnoreEnd
+
+       if ( isset( $canonicalDecomp[$matches[1]] ) ) {
                return $canonicalDecomp[$matches[1]];
        }
+
        return $matches[1];
 }
 
 function callbackCompat( $matches ) {
+       // @codingStandardsIgnoreStart MediaWiki.NamingConventions.ValidGlobalName.wgPrefix
        global $compatibilityDecomp;
-       if( isset( $compatibilityDecomp[$matches[1]] ) ) {
+       // @codingStandardsIgnoreEnd
+
+       if ( isset( $compatibilityDecomp[$matches[1]] ) ) {
                return $compatibilityDecomp[$matches[1]];
        }
+
        return $matches[1];
 }
index 9ae6f23..14abf93 100644 (file)
  * @ingroup UtfNormal
  */
 
-if( PHP_SAPI != 'cli' ) {
+if ( PHP_SAPI != 'cli' ) {
        die( "Run me from the command line please.\n" );
 }
 
-if( isset( $_SERVER['argv'] ) && in_array( '--icu', $_SERVER['argv'] ) ) {
+if ( isset( $_SERVER['argv'] ) && in_array( '--icu', $_SERVER['argv'] ) ) {
        dl( 'php_utfnormal.so' );
 }
 
@@ -39,8 +39,8 @@ require_once 'UtfNormalUtil.php';
 require_once 'UtfNormal.php';
 
 define( 'BENCH_CYCLES', 1 );
-define( 'BIGSIZE', 1024 * 1024 * 10); // 10m
-ini_set('memory_limit', BIGSIZE + 120 * 1024 * 1024);
+define( 'BIGSIZE', 1024 * 1024 * 10 ); // 10m
+ini_set( 'memory_limit', BIGSIZE + 120 * 1024 * 1024 );
 
 $testfiles = array(
        'testdata/washington.txt' => 'English text',
@@ -51,7 +51,7 @@ $testfiles = array(
 );
 $normalizer = new UtfNormal;
 UtfNormal::loadData();
-foreach( $testfiles as $file => $desc ) {
+foreach ( $testfiles as $file => $desc ) {
        benchmarkTest( $normalizer, $file, $desc );
 }
 
@@ -61,19 +61,20 @@ function benchmarkTest( &$u, $filename, $desc ) {
        print "Testing $filename ($desc)...\n";
        $data = file_get_contents( $filename );
        $all = $data;
-       while (strlen($all) < BIGSIZE) {
+       while ( strlen( $all ) < BIGSIZE ) {
                $all .= $all;
        }
        $data = $all;
-       echo "Data is " . strlen($data) . " bytes.\n";
+       echo "Data is " . strlen( $data ) . " bytes.\n";
        $forms = array(
-        'quickIsNFCVerify',
+               'quickIsNFCVerify',
                'cleanUp',
-               );
-       foreach( $forms as $form ) {
-               if( is_array( $form ) ) {
+       );
+
+       foreach ( $forms as $form ) {
+               if ( is_array( $form ) ) {
                        $str = $data;
-                       foreach( $form as $step ) {
+                       foreach ( $form as $step ) {
                                $str = benchmarkForm( $u, $str, $step );
                        }
                } else {
@@ -84,27 +85,29 @@ function benchmarkTest( &$u, $filename, $desc ) {
 
 function benchTime() {
        $st = explode( ' ', microtime() );
+
        return (float)$st[0] + (float)$st[1];
 }
 
 function benchmarkForm( &$u, &$data, $form ) {
        #$start = benchTime();
-       for( $i = 0; $i < BENCH_CYCLES; $i++ ) {
+       for ( $i = 0; $i < BENCH_CYCLES; $i++ ) {
                $start = benchTime();
                $out = $u->$form( $data, UtfNormal::$utfCanonicalDecomp );
-               $deltas[] = (benchTime() - $start);
+               $deltas[] = ( benchTime() - $start );
        }
        #$delta = (benchTime() - $start) / BENCH_CYCLES;
        sort( $deltas );
        $delta = $deltas[0]; # Take shortest time
 
        $rate = intval( strlen( $data ) / $delta );
-       $same = (0 == strcmp( $data, $out ) );
+       $same = ( 0 == strcmp( $data, $out ) );
 
        printf( " %20s %6.1fms %12s bytes/s (%s)\n",
                $form,
-               $delta*1000.0,
+               $delta * 1000.0,
                number_format( $rate ),
-               ($same ? 'no change' : 'changed' ) );
+               ( $same ? 'no change' : 'changed' ) );
+
        return $out;
 }
index 7be5251..10cd0f0 100644 (file)
  * @ingroup UtfNormal
  */
 
-if( PHP_SAPI != 'cli' ) {
+if ( PHP_SAPI != 'cli' ) {
        die( "Run me from the command line please.\n" );
 }
 
 $verbose = true;
 #define( 'PRETTY_UTF8', true );
 
-if( defined( 'PRETTY_UTF8' ) ) {
+if ( defined( 'PRETTY_UTF8' ) ) {
        function pretty( $string ) {
                return strtoupper( bin2hex( $string ) );
        }
@@ -47,7 +47,7 @@ if( defined( 'PRETTY_UTF8' ) ) {
        }
 }
 
-if( isset( $_SERVER['argv'] ) && in_array( '--icu', $_SERVER['argv'] ) ) {
+if ( isset( $_SERVER['argv'] ) && in_array( '--icu', $_SERVER['argv'] ) ) {
        dl( 'php_utfnormal.so' );
 }
 
@@ -55,12 +55,12 @@ require_once 'UtfNormalDefines.php';
 require_once 'UtfNormalUtil.php';
 require_once 'UtfNormal.php';
 
-$in = fopen("NormalizationTest.txt", "rt");
-if( !$in ) {
+$in = fopen( "NormalizationTest.txt", "rt" );
+if ( !$in ) {
        print "Couldn't open NormalizationTest.txt -- can't run tests.\n";
        print "If necessary, manually download this file. It can be obtained at\n";
        print "http://www.unicode.org/Public/UNIDATA/NormalizationTest.txt";
-       exit(-1);
+       exit( -1 );
 }
 
 $normalizer = new UtfNormal;
@@ -70,12 +70,13 @@ $success = 0;
 $failure = 0;
 $ok = true;
 $testedChars = array();
-while( false !== ( $line = fgets( $in ) ) ) {
+
+while ( false !== ( $line = fgets( $in ) ) ) {
        list( $data, $comment ) = explode( '#', $line );
-       if( $data === '' ) continue;
+       if ( $data === '' ) continue;
        $matches = array();
-       if( preg_match( '/@Part([\d])/', $data, $matches ) ) {
-               if( $matches[1] > 0 ) {
+       if ( preg_match( '/@Part([\d])/', $data, $matches ) ) {
+               if ( $matches[1] > 0 ) {
                        $ok = reportResults( $total, $success, $failure ) && $ok;
                }
                print "Part {$matches[1]}: $comment";
@@ -87,56 +88,57 @@ while( false !== ( $line = fgets( $in ) ) ) {
 
        $testedChars[$columns[1]] = true;
        $total++;
-       if( testNormals( $normalizer, $columns, $comment, $verbose ) ) {
+       if ( testNormals( $normalizer, $columns, $comment, $verbose ) ) {
                $success++;
        } else {
                $failure++;
                # print "FAILED: $comment";
        }
-       if( $total % 100 == 0 ) print "$total ";
+       if ( $total % 100 == 0 ) print "$total ";
 }
 fclose( $in );
 
 $ok = reportResults( $total, $success, $failure ) && $ok;
 
-$in = fopen("UnicodeData.txt", "rt" );
-if( !$in ) {
+$in = fopen( "UnicodeData.txt", "rt" );
+if ( !$in ) {
        print "Can't open UnicodeData.txt for reading.\n";
        print "If necessary, fetch this file from the internet:\n";
        print "http://www.unicode.org/Public/UNIDATA/UnicodeData.txt\n";
-       exit(-1);
+       exit( -1 );
 }
 print "Now testing invariants...\n";
-while( false !== ($line = fgets( $in ) ) ) {
+
+while ( false !== ( $line = fgets( $in ) ) ) {
        $cols = explode( ';', $line );
        $char = codepointToUtf8( hexdec( $cols[0] ) );
        $desc = $cols[0] . ": " . $cols[1];
-       if( $char < "\x20" || $char >= UTF8_SURROGATE_FIRST && $char <= UTF8_SURROGATE_LAST ) {
+       if ( $char < "\x20" || $char >= UTF8_SURROGATE_FIRST && $char <= UTF8_SURROGATE_LAST ) {
                # Can't check NULL with the ICU plugin, as null bytes fail in C land.
                # Skip other control characters, as we strip them for XML safety.
                # Surrogates are illegal on their own or in UTF-8, ignore.
                continue;
        }
-       if( empty( $testedChars[$char] ) ) {
+       if ( empty( $testedChars[$char] ) ) {
                $total++;
-               if( testInvariant( $normalizer, $char, $desc, $verbose ) ) {
+               if ( testInvariant( $normalizer, $char, $desc, $verbose ) ) {
                        $success++;
                } else {
                        $failure++;
                }
-               if( $total % 100 == 0 ) print "$total ";
+               if ( $total % 100 == 0 ) print "$total ";
        }
 }
 fclose( $in );
 
 $ok = reportResults( $total, $success, $failure ) && $ok;
 
-if( $ok ) {
+if ( $ok ) {
        print "TEST SUCCEEDED!\n";
-       exit(0);
+       exit( 0 );
 } else {
        print "TEST FAILED!\n";
-       exit(-1);
+       exit( -1 );
 }
 
 ## ------
@@ -147,10 +149,11 @@ function reportResults( &$total, &$success, &$failure ) {
        print "\n";
        print "$success tests successful ($percSucc%)\n";
        print "$failure tests failed ($percFail%)\n\n";
-       $ok = ($success > 0 && $failure == 0);
+       $ok = ( $success > 0 && $failure == 0 );
        $total = 0;
        $success = 0;
        $failure = 0;
+
        return $ok;
 }
 
@@ -161,23 +164,25 @@ function testNormals( &$u, $c, $comment, $verbose, $reportFailure = false ) {
        $result = testNFKD( $u, $c, $comment, $reportFailure ) && $result;
        $result = testCleanUp( $u, $c, $comment, $reportFailure ) && $result;
 
-       if( $verbose && !$result && !$reportFailure ) {
+       if ( $verbose && !$result && !$reportFailure ) {
                print $comment;
                testNormals( $u, $c, $comment, $verbose, true );
        }
+
        return $result;
 }
 
 function verbosify( $a, $b, $col, $form, $verbose ) {
        #$result = ($a === $b);
-       $result = (strcmp( $a, $b ) == 0);
-       if( $verbose ) {
+       $result = ( strcmp( $a, $b ) == 0 );
+       if ( $verbose ) {
                $aa = pretty( $a );
                $bb = pretty( $b );
                $ok = $result ? "succeed" : " failed";
                $eq = $result ? "==" : "!=";
                print "  $ok $form c$col '$aa' $eq '$bb'\n";
        }
+
        return $result;
 }
 
@@ -187,6 +192,7 @@ function testNFC( &$u, $c, $comment, $verbose ) {
        $result = verbosify( $c[2], $u->toNFC( $c[3] ), 3, 'NFC', $verbose ) && $result;
        $result = verbosify( $c[4], $u->toNFC( $c[4] ), 4, 'NFC', $verbose ) && $result;
        $result = verbosify( $c[4], $u->toNFC( $c[5] ), 5, 'NFC', $verbose ) && $result;
+
        return $result;
 }
 
@@ -201,6 +207,7 @@ function testCleanUp( &$u, $c, $comment, $verbose ) {
        $result = verbosify( $c[4], $u->cleanUp( $x ), 4, 'cleanUp', $verbose ) && $result;
        $x = $c[5];
        $result = verbosify( $c[4], $u->cleanUp( $x ), 5, 'cleanUp', $verbose ) && $result;
+
        return $result;
 }
 
@@ -210,6 +217,7 @@ function testNFD( &$u, $c, $comment, $verbose ) {
        $result = verbosify( $c[3], $u->toNFD( $c[3] ), 3, 'NFD', $verbose ) && $result;
        $result = verbosify( $c[5], $u->toNFD( $c[4] ), 4, 'NFD', $verbose ) && $result;
        $result = verbosify( $c[5], $u->toNFD( $c[5] ), 5, 'NFD', $verbose ) && $result;
+
        return $result;
 }
 
@@ -219,6 +227,7 @@ function testNFKC( &$u, $c, $comment, $verbose ) {
        $result = verbosify( $c[4], $u->toNFKC( $c[3] ), 3, 'NFKC', $verbose ) && $result;
        $result = verbosify( $c[4], $u->toNFKC( $c[4] ), 4, 'NFKC', $verbose ) && $result;
        $result = verbosify( $c[4], $u->toNFKC( $c[5] ), 5, 'NFKC', $verbose ) && $result;
+
        return $result;
 }
 
@@ -228,6 +237,7 @@ function testNFKD( &$u, $c, $comment, $verbose ) {
        $result = verbosify( $c[5], $u->toNFKD( $c[3] ), 3, 'NFKD', $verbose ) && $result;
        $result = verbosify( $c[5], $u->toNFKD( $c[4] ), 4, 'NFKD', $verbose ) && $result;
        $result = verbosify( $c[5], $u->toNFKD( $c[5] ), 5, 'NFKD', $verbose ) && $result;
+
        return $result;
 }
 
@@ -238,9 +248,10 @@ function testInvariant( &$u, $char, $desc, $verbose, $reportFailure = false ) {
        $result = verbosify( $char, $u->toNFKD( $char ), 1, 'NFKD', $reportFailure ) && $result;
        $result = verbosify( $char, $u->cleanUp( $char ), 1, 'cleanUp', $reportFailure ) && $result;
 
-       if( $verbose && !$result && !$reportFailure ) {
+       if ( $verbose && !$result && !$reportFailure ) {
                print $desc;
                testInvariant( $u, $char, $desc, $verbose, true );
        }
+
        return $result;
 }
index 750c009..53e68c2 100644 (file)
@@ -22,7 +22,7 @@
  * @ingroup UtfNormal
  */
 
-if( PHP_SAPI != 'cli' ) {
+if ( PHP_SAPI != 'cli' ) {
        die( "Run me from the command line please.\n" );
 }
 
@@ -35,41 +35,47 @@ define ( 'COMMENT', '#' );
 // Semicolons are used to separate the columns
 define ( 'SEPARATOR', ';' );
 
-$f = fopen($file, "r");
+$f = fopen( $file, "r" );
 
 /**
  * The following section will be used for testing different normalization methods.
  * - Pure PHP
-     ~ no assertion errors
-     ~ 6.25 minutes
-
+ * ~ no assertion errors
+ * ~ 6.25 minutes
  * - php_utfnormal.so or intl extension: both are wrappers around
-     libicu so we list the version of libicu when making the
-     comparison
-
+ * libicu so we list the version of libicu when making the
+ * comparison
  * - libicu Ubuntu 3.8.1-3ubuntu1.1 php 5.2.6-3ubuntu4.5
-     ~ 2200 assertion errors
-     ~ 5 seconds
-        ~ output: http://paste2.org/p/921566
-
+ * ~ 2200 assertion errors
+ * ~ 5 seconds
+ * ~ output: http://paste2.org/p/921566
  * - libicu Ubuntu 4.2.1-3 php 5.3.2-1ubuntu4.2
-     ~ 1384 assertion errors
-        ~ 15 seconds
-        ~ output: http://paste2.org/p/921435
-
+ * ~ 1384 assertion errors
+ * ~ 15 seconds
+ * ~ output: http://paste2.org/p/921435
  * - libicu Debian 4.4.1-5 php 5.3.2-1ubuntu4.2
-     ~ no assertion errors
-        ~ 13 seconds
-
+ * ~ no assertion errors
+ * ~ 13 seconds
  * - Tests comparing pure PHP output with libicu output were added
    later and slow down the runtime.
* later and slow down the runtime.
  */
 
 require_once './UtfNormal.php';
-function normalize_form_c($c)      { return UtfNormal::toNFC($c);  }
-function normalize_form_d($c)      { return UtfNormal::toNFD($c);  }
-function normalize_form_kc($c)     { return UtfNormal::toNFKC($c); }
-function normalize_form_kd($c)     { return UtfNormal::toNFKD($c); }
+function normalize_form_c( $c ) {
+       return UtfNormal::toNFC( $c );
+}
+
+function normalize_form_d( $c ) {
+       return UtfNormal::toNFD( $c );
+}
+
+function normalize_form_kc( $c ) {
+       return UtfNormal::toNFKC( $c );
+}
+
+function normalize_form_kd( $c ) {
+       return UtfNormal::toNFKD( $c );
+}
 
 /**
  * This set of functions is only useful if youve added a param to the
@@ -78,175 +84,189 @@ function normalize_form_kd($c)     { return UtfNormal::toNFKD($c); }
  * normalization code just for the sake of these tests. -- hexmode
  * @return string
  */
-function normalize_form_c_php($c)  { return UtfNormal::toNFC($c, "php");  }
-function normalize_form_d_php($c)  { return UtfNormal::toNFD($c, "php");  }
-function normalize_form_kc_php($c) { return UtfNormal::toNFKC($c, "php"); }
-function normalize_form_kd_php($c) { return UtfNormal::toNFKD($c, "php"); }
+function normalize_form_c_php( $c ) {
+       return UtfNormal::toNFC( $c, "php" );
+}
+
+function normalize_form_d_php( $c ) {
+       return UtfNormal::toNFD( $c, "php" );
+}
 
-assert_options(ASSERT_ACTIVE, 1);
-assert_options(ASSERT_WARNING, 0);
-assert_options(ASSERT_QUIET_EVAL, 1);
-assert_options(ASSERT_CALLBACK, 'my_assert');
+function normalize_form_kc_php( $c ) {
+       return UtfNormal::toNFKC( $c, "php" );
+}
+
+function normalize_form_kd_php( $c ) {
+       return UtfNormal::toNFKD( $c, "php" );
+}
+
+assert_options( ASSERT_ACTIVE, 1 );
+assert_options( ASSERT_WARNING, 0 );
+assert_options( ASSERT_QUIET_EVAL, 1 );
+assert_options( ASSERT_CALLBACK, 'my_assert' );
 
 function my_assert( $file, $line, $code ) {
+       // @codingStandardsIgnoreStart MediaWiki.NamingConventions.ValidGlobalName.wgPrefix
        global $col, $lineNo;
+       // @codingStandardsIgnoreEnd
+
        echo "Assertion that '$code' failed on line $lineNo ($col[5])\n";
 }
 
 $count = 0;
 $lineNo = 0;
-if( $f !== false ) {
-       while( ( $col = getRow( $f ) ) !== false ) {
+if ( $f !== false ) {
+       while ( ( $col = getRow( $f ) ) !== false ) {
                $lineNo++;
 
-               if(count($col) == 6) {
+               if ( count( $col ) == 6 ) {
                        $count++;
-                       if( $count % 100 === 0 ) echo "Count: $count\n";
+                       if ( $count % 100 === 0 ) echo "Count: $count\n";
                } else {
                        continue;
                }
 
                # verify that the pure PHP version is correct
-               $NFCc1  = normalize_form_c($col[0]);
-               $NFCc1p = normalize_form_c_php($col[0]);
-               assert('$NFCc1 === $NFCc1p');
-               $NFCc2  = normalize_form_c($col[1]);
-               $NFCc2p = normalize_form_c_php($col[1]);
-               assert('$NFCc2 === $NFCc2p');
-               $NFCc3  = normalize_form_c($col[2]);
-               $NFCc3p = normalize_form_c_php($col[2]);
-               assert('$NFCc3 === $NFCc3p');
-               $NFCc4  = normalize_form_c($col[3]);
-               $NFCc4p = normalize_form_c_php($col[3]);
-               assert('$NFCc4 === $NFCc4p');
-               $NFCc5  = normalize_form_c($col[4]);
-               $NFCc5p = normalize_form_c_php($col[4]);
-               assert('$NFCc5 === $NFCc5p');
-
-               $NFDc1  = normalize_form_d($col[0]);
-               $NFDc1p = normalize_form_d_php($col[0]);
-               assert('$NFDc1 === $NFDc1p');
-               $NFDc2  = normalize_form_d($col[1]);
-               $NFDc2p = normalize_form_d_php($col[1]);
-               assert('$NFDc2 === $NFDc2p');
-               $NFDc3  = normalize_form_d($col[2]);
-               $NFDc3p = normalize_form_d_php($col[2]);
-               assert('$NFDc3 === $NFDc3p');
-               $NFDc4  = normalize_form_d($col[3]);
-               $NFDc4p = normalize_form_d_php($col[3]);
-               assert('$NFDc4 === $NFDc4p');
-               $NFDc5  = normalize_form_d($col[4]);
-               $NFDc5p = normalize_form_d_php($col[4]);
-               assert('$NFDc5 === $NFDc5p');
-
-               $NFKDc1  = normalize_form_kd($col[0]);
-               $NFKDc1p = normalize_form_kd_php($col[0]);
-               assert('$NFKDc1 === $NFKDc1p');
-               $NFKDc2  = normalize_form_kd($col[1]);
-               $NFKDc2p = normalize_form_kd_php($col[1]);
-               assert('$NFKDc2 === $NFKDc2p');
-               $NFKDc3  = normalize_form_kd($col[2]);
-               $NFKDc3p = normalize_form_kd_php($col[2]);
-               assert('$NFKDc3 === $NFKDc3p');
-               $NFKDc4  = normalize_form_kd($col[3]);
-               $NFKDc4p = normalize_form_kd_php($col[3]);
-               assert('$NFKDc4 === $NFKDc4p');
-               $NFKDc5  = normalize_form_kd($col[4]);
-               $NFKDc5p = normalize_form_kd_php($col[4]);
-               assert('$NFKDc5 === $NFKDc5p');
-
-               $NFKCc1  = normalize_form_kc($col[0]);
-               $NFKCc1p = normalize_form_kc_php($col[0]);
-               assert('$NFKCc1 === $NFKCc1p');
-               $NFKCc2  = normalize_form_kc($col[1]);
-               $NFKCc2p = normalize_form_kc_php($col[1]);
-               assert('$NFKCc2 === $NFKCc2p');
-               $NFKCc3  = normalize_form_kc($col[2]);
-               $NFKCc3p = normalize_form_kc_php($col[2]);
-               assert('$NFKCc3 === $NFKCc3p');
-               $NFKCc4  = normalize_form_kc($col[3]);
-               $NFKCc4p = normalize_form_kc_php($col[3]);
-               assert('$NFKCc4 === $NFKCc4p');
-               $NFKCc5  = normalize_form_kc($col[4]);
-               $NFKCc5p = normalize_form_kc_php($col[4]);
-               assert('$NFKCc5 === $NFKCc5p');
+               $NFCc1 = normalize_form_c( $col[0] );
+               $NFCc1p = normalize_form_c_php( $col[0] );
+               assert( '$NFCc1 === $NFCc1p' );
+               $NFCc2 = normalize_form_c( $col[1] );
+               $NFCc2p = normalize_form_c_php( $col[1] );
+               assert( '$NFCc2 === $NFCc2p' );
+               $NFCc3 = normalize_form_c( $col[2] );
+               $NFCc3p = normalize_form_c_php( $col[2] );
+               assert( '$NFCc3 === $NFCc3p' );
+               $NFCc4 = normalize_form_c( $col[3] );
+               $NFCc4p = normalize_form_c_php( $col[3] );
+               assert( '$NFCc4 === $NFCc4p' );
+               $NFCc5 = normalize_form_c( $col[4] );
+               $NFCc5p = normalize_form_c_php( $col[4] );
+               assert( '$NFCc5 === $NFCc5p' );
+
+               $NFDc1 = normalize_form_d( $col[0] );
+               $NFDc1p = normalize_form_d_php( $col[0] );
+               assert( '$NFDc1 === $NFDc1p' );
+               $NFDc2 = normalize_form_d( $col[1] );
+               $NFDc2p = normalize_form_d_php( $col[1] );
+               assert( '$NFDc2 === $NFDc2p' );
+               $NFDc3 = normalize_form_d( $col[2] );
+               $NFDc3p = normalize_form_d_php( $col[2] );
+               assert( '$NFDc3 === $NFDc3p' );
+               $NFDc4 = normalize_form_d( $col[3] );
+               $NFDc4p = normalize_form_d_php( $col[3] );
+               assert( '$NFDc4 === $NFDc4p' );
+               $NFDc5 = normalize_form_d( $col[4] );
+               $NFDc5p = normalize_form_d_php( $col[4] );
+               assert( '$NFDc5 === $NFDc5p' );
+
+               $NFKDc1 = normalize_form_kd( $col[0] );
+               $NFKDc1p = normalize_form_kd_php( $col[0] );
+               assert( '$NFKDc1 === $NFKDc1p' );
+               $NFKDc2 = normalize_form_kd( $col[1] );
+               $NFKDc2p = normalize_form_kd_php( $col[1] );
+               assert( '$NFKDc2 === $NFKDc2p' );
+               $NFKDc3 = normalize_form_kd( $col[2] );
+               $NFKDc3p = normalize_form_kd_php( $col[2] );
+               assert( '$NFKDc3 === $NFKDc3p' );
+               $NFKDc4 = normalize_form_kd( $col[3] );
+               $NFKDc4p = normalize_form_kd_php( $col[3] );
+               assert( '$NFKDc4 === $NFKDc4p' );
+               $NFKDc5 = normalize_form_kd( $col[4] );
+               $NFKDc5p = normalize_form_kd_php( $col[4] );
+               assert( '$NFKDc5 === $NFKDc5p' );
+
+               $NFKCc1 = normalize_form_kc( $col[0] );
+               $NFKCc1p = normalize_form_kc_php( $col[0] );
+               assert( '$NFKCc1 === $NFKCc1p' );
+               $NFKCc2 = normalize_form_kc( $col[1] );
+               $NFKCc2p = normalize_form_kc_php( $col[1] );
+               assert( '$NFKCc2 === $NFKCc2p' );
+               $NFKCc3 = normalize_form_kc( $col[2] );
+               $NFKCc3p = normalize_form_kc_php( $col[2] );
+               assert( '$NFKCc3 === $NFKCc3p' );
+               $NFKCc4 = normalize_form_kc( $col[3] );
+               $NFKCc4p = normalize_form_kc_php( $col[3] );
+               assert( '$NFKCc4 === $NFKCc4p' );
+               $NFKCc5 = normalize_form_kc( $col[4] );
+               $NFKCc5p = normalize_form_kc_php( $col[4] );
+               assert( '$NFKCc5 === $NFKCc5p' );
 
                # c2 ==  NFC(c1) ==      NFC(c2) ==      NFC(c3)
-               assert('$col[1] === $NFCc1');
-               assert('$col[1] === $NFCc2');
-               assert('$col[1] === $NFCc3');
+               assert( '$col[1] === $NFCc1' );
+               assert( '$col[1] === $NFCc2' );
+               assert( '$col[1] === $NFCc3' );
 
                # c4 ==  NFC(c4) ==      NFC(c5)
-               assert('$col[3] === $NFCc4');
-               assert('$col[3] === $NFCc5');
+               assert( '$col[3] === $NFCc4' );
+               assert( '$col[3] === $NFCc5' );
 
                # c3 ==  NFD(c1) ==      NFD(c2) ==      NFD(c3)
-               assert('$col[2] === $NFDc1');
-               assert('$col[2] === $NFDc2');
-               assert('$col[2] === $NFDc3');
+               assert( '$col[2] === $NFDc1' );
+               assert( '$col[2] === $NFDc2' );
+               assert( '$col[2] === $NFDc3' );
 
                # c5 ==  NFD(c4) ==      NFD(c5)
-               assert('$col[4] === $NFDc4');
-               assert('$col[4] === $NFDc5');
+               assert( '$col[4] === $NFDc4' );
+               assert( '$col[4] === $NFDc5' );
 
                # c4 == NFKC(c1) == NFKC(c2) == NFKC(c3) == NFKC(c4) == NFKC(c5)
-               assert('$col[3] === $NFKCc1');
-               assert('$col[3] === $NFKCc2');
-               assert('$col[3] === $NFKCc3');
-               assert('$col[3] === $NFKCc4');
-               assert('$col[3] === $NFKCc5');
+               assert( '$col[3] === $NFKCc1' );
+               assert( '$col[3] === $NFKCc2' );
+               assert( '$col[3] === $NFKCc3' );
+               assert( '$col[3] === $NFKCc4' );
+               assert( '$col[3] === $NFKCc5' );
 
                # c5 == NFKD(c1) == NFKD(c2) == NFKD(c3) == NFKD(c4) == NFKD(c5)
-               assert('$col[4] === $NFKDc1');
-               assert('$col[4] === $NFKDc2');
-               assert('$col[4] === $NFKDc3');
-               assert('$col[4] === $NFKDc4');
-               assert('$col[4] === $NFKDc5');
+               assert( '$col[4] === $NFKDc1' );
+               assert( '$col[4] === $NFKDc2' );
+               assert( '$col[4] === $NFKDc3' );
+               assert( '$col[4] === $NFKDc4' );
+               assert( '$col[4] === $NFKDc5' );
        }
 }
 echo "done.\n";
 
 // Compare against http://en.wikipedia.org/wiki/UTF-8#Description
-function unichr($c) {
-       if ($c <= 0x7F) {
-               return chr($c);
-       } elseif ($c <= 0x7FF) {
-               return chr(0xC0 | $c >> 6) . chr(0x80 | $c & 0x3F);
-       } elseif ($c <= 0xFFFF) {
-               return chr(0xE0 | $c >> 12) . chr(0x80 | $c >> 6 & 0x3F)
-                       . chr(0x80 | $c & 0x3F);
-       } elseif ($c <= 0x10FFFF) {
-               return chr(0xF0 | $c >> 18) . chr(0x80 | $c >> 12 & 0x3F)
-                       . chr(0x80 | $c >> 6 & 0x3F)
-                       . chr(0x80 | $c & 0x3F);
+function unichr( $c ) {
+       if ( $c <= 0x7F ) {
+               return chr( $c );
+       } elseif ( $c <= 0x7FF ) {
+               return chr( 0xC0 | $c >> 6 ) . chr( 0x80 | $c & 0x3F );
+       } elseif ( $c <= 0xFFFF ) {
+               return chr( 0xE0 | $c >> 12 ) . chr( 0x80 | $c >> 6 & 0x3F )
+               . chr( 0x80 | $c & 0x3F );
+       } elseif ( $c <= 0x10FFFF ) {
+               return chr( 0xF0 | $c >> 18 ) . chr( 0x80 | $c >> 12 & 0x3F )
+               . chr( 0x80 | $c >> 6 & 0x3F )
+               . chr( 0x80 | $c & 0x3F );
        } else {
                return false;
        }
 }
 
-function unistr($c) {
-       return implode("", array_map("unichr", array_map("hexdec", explode(" ", $c))));
+function unistr( $c ) {
+       return implode( "", array_map( "unichr", array_map( "hexdec", explode( " ", $c ) ) ) );
 }
 
 function getRow( $f ) {
        $row = fgets( $f );
-       if( $row === false ) return false;
-       $row = rtrim($row);
+       if ( $row === false ) return false;
+       $row = rtrim( $row );
        $pos = strpos( $row, COMMENT );
        $pos2 = strpos( $row, ")" );
-       if( $pos === 0 ) return array($row);
+       if ( $pos === 0 ) return array( $row );
        $c = "";
 
-       if( $pos ) {
-               if($pos2) $c = substr( $row, $pos2 + 2 );
-               else      $c = substr( $row, $pos );
+       if ( $pos ) {
+               if ( $pos2 ) $c = substr( $row, $pos2 + 2 );
+               else      $c = substr( $row, $pos );
                $row = substr( $row, 0, $pos );
        }
 
        $ret = array();
-       foreach( explode( SEPARATOR, $row ) as $ent ) {
-               if( trim( $ent ) !== "" ) {
-                       $ret[] = unistr($ent);
+       foreach ( explode( SEPARATOR, $row ) as $ent ) {
+               if ( trim( $ent ) !== "" ) {
+                       $ret[] = unistr( $ent );
                }
        }
        $ret[] = $c;
index 443516b..6c925df 100644 (file)
  * @public
  */
 function codepointToUtf8( $codepoint ) {
-       if($codepoint <         0x80) return chr($codepoint);
-       if($codepoint <    0x800) return chr($codepoint >>      6 & 0x3f | 0xc0) .
-                                                                        chr($codepoint           & 0x3f | 0x80);
-       if($codepoint <  0x10000) return chr($codepoint >> 12 & 0x0f | 0xe0) .
-                                                                        chr($codepoint >>      6 & 0x3f | 0x80) .
-                                                                        chr($codepoint           & 0x3f | 0x80);
-       if($codepoint < 0x110000) return chr($codepoint >> 18 & 0x07 | 0xf0) .
-                                                                        chr($codepoint >> 12 & 0x3f | 0x80) .
-                                                                        chr($codepoint >>      6 & 0x3f | 0x80) .
-                                                                        chr($codepoint           & 0x3f | 0x80);
+       if ( $codepoint < 0x80 ) {
+               return chr( $codepoint );
+       }
+
+       if ( $codepoint < 0x800 ) {
+               return chr( $codepoint >> 6 & 0x3f | 0xc0 ) .
+                       chr( $codepoint & 0x3f | 0x80 );
+       }
+
+       if ( $codepoint < 0x10000 ) {
+               return chr( $codepoint >> 12 & 0x0f | 0xe0 ) .
+                       chr( $codepoint >> 6 & 0x3f | 0x80 ) .
+                       chr( $codepoint & 0x3f | 0x80 );
+       }
+
+       if ( $codepoint < 0x110000 ) {
+               return chr( $codepoint >> 18 & 0x07 | 0xf0 ) .
+                       chr( $codepoint >> 12 & 0x3f | 0x80 ) .
+                       chr( $codepoint >> 6 & 0x3f | 0x80 ) .
+                       chr( $codepoint & 0x3f | 0x80 );
+       }
 
        echo "Asked for code outside of range ($codepoint)\n";
        die( -1 );
@@ -60,10 +71,11 @@ function codepointToUtf8( $codepoint ) {
  */
 function hexSequenceToUtf8( $sequence ) {
        $utf = '';
-       foreach( explode( ' ', $sequence ) as $hex ) {
+       foreach ( explode( ' ', $sequence ) as $hex ) {
                $n = hexdec( $hex );
                $utf .= codepointToUtf8( $n );
        }
+
        return $utf;
 }
 
@@ -80,6 +92,7 @@ function utf8ToHexSequence( $str ) {
        foreach ( preg_split( '//u', $str, -1, PREG_SPLIT_NO_EMPTY ) as $cp ) {
                $buf .= sprintf( '%04x ', utf8ToCodepoint( $cp ) );
        }
+
        return rtrim( $buf );
 }
 
@@ -107,6 +120,7 @@ function utf8ToCodepoint( $char ) {
        if ( $length != strlen( $char ) ) {
                return false;
        }
+
        if ( $length == 1 ) {
                return ord( $char );
        }
@@ -116,7 +130,7 @@ function utf8ToCodepoint( $char ) {
        $z >>= $length;
 
        # Add in the free bits from subsequent bytes
-       for ( $i=1; $i < $length; $i++ ) {
+       for ( $i = 1; $i < $length; $i++ ) {
                $z <<= 6;
                $z |= ord( $char[$i] ) & 0x3f;
        }
@@ -136,5 +150,5 @@ function escapeSingleString( $string ) {
                array(
                        '\\' => '\\\\',
                        '\'' => '\\\''
-               ));
+               ) );
 }
index 3fb8083..4cbb32d 100644 (file)
@@ -28,8 +28,8 @@
  */
 class APCBagOStuff extends BagOStuff {
        /**
-        * @param $key string
-        * @param $casToken[optional] int
+        * @param string $key
+        * @param int $casToken [optional]
         * @return mixed
         */
        public function get( $key, &$casToken = null ) {
@@ -49,9 +49,9 @@ class APCBagOStuff extends BagOStuff {
        }
 
        /**
-        * @param $key string
-        * @param $value mixed
-        * @param $exptime int
+        * @param string $key
+        * @param mixed $value
+        * @param int $exptime
         * @return bool
         */
        public function set( $key, $value, $exptime = 0 ) {
@@ -65,10 +65,10 @@ class APCBagOStuff extends BagOStuff {
        }
 
        /**
-        * @param $casToken mixed
-        * @param $key string
-        * @param $value mixed
-        * @param $exptime int
+        * @param mixed $casToken
+        * @param string $key
+        * @param mixed $value
+        * @param int $exptime
         * @return bool
         */
        public function cas( $casToken, $key, $value, $exptime = 0 ) {
@@ -77,8 +77,8 @@ class APCBagOStuff extends BagOStuff {
        }
 
        /**
-        * @param $key string
-        * @param $time int
+        * @param string $key
+        * @param int $time
         * @return bool
         */
        public function delete( $key, $time = 0 ) {
@@ -88,13 +88,13 @@ class APCBagOStuff extends BagOStuff {
        }
 
        /**
-        * @param $key string
-        * @param $callback closure Callback method to be executed
+        * @param string $key
+        * @param Closure $callback Callback method to be executed
         * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
         * @param int $attempts The amount of times to attempt a merge in case of failure
-        * @return bool success
+        * @return bool Success
         */
-       public function merge( $key, closure $callback, $exptime = 0, $attempts = 10 ) {
+       public function merge( $key, Closure $callback, $exptime = 0, $attempts = 10 ) {
                return $this->mergeViaLock( $key, $callback, $exptime, $attempts );
        }
 
index 1b3e4bc..56f1be2 100644 (file)
@@ -52,7 +52,7 @@ abstract class BagOStuff {
        const ERR_UNEXPECTED  = 3; // response gave some error
 
        /**
-        * @param $bool bool
+        * @param bool $bool
         */
        public function setDebug( $bool ) {
                $this->debugMode = $bool;
@@ -63,34 +63,34 @@ abstract class BagOStuff {
 
        /**
         * Get an item with the given key. Returns false if it does not exist.
-        * @param $key string
-        * @param $casToken[optional] mixed
+        * @param string $key
+        * @param mixed $casToken [optional]
         * @return mixed Returns false on failure
         */
        abstract public function get( $key, &$casToken = null );
 
        /**
         * Set an item.
-        * @param $key string
-        * @param $value mixed
+        * @param string $key
+        * @param mixed $value
         * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
-        * @return bool success
+        * @return bool Success
         */
        abstract public function set( $key, $value, $exptime = 0 );
 
        /**
         * Check and set an item.
-        * @param $casToken mixed
-        * @param $key string
-        * @param $value mixed
+        * @param mixed $casToken
+        * @param string $key
+        * @param mixed $value
         * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
-        * @return bool success
+        * @return bool Success
         */
        abstract public function cas( $casToken, $key, $value, $exptime = 0 );
 
        /**
         * Delete an item.
-        * @param $key string
+        * @param string $key
         * @param int $time Amount of time to delay the operation (mostly memcached-specific)
         * @return bool True if the item was deleted or not found, false on failure
         */
@@ -101,26 +101,26 @@ abstract class BagOStuff {
         * The callback function returns the new value given the current value (possibly false),
         * and takes the arguments: (this BagOStuff object, cache key, current value).
         *
-        * @param $key string
-        * @param $callback closure Callback method to be executed
+        * @param string $key
+        * @param Closure $callback Callback method to be executed
         * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
         * @param int $attempts The amount of times to attempt a merge in case of failure
-        * @return bool success
+        * @return bool Success
         */
-       public function merge( $key, closure $callback, $exptime = 0, $attempts = 10 ) {
+       public function merge( $key, Closure $callback, $exptime = 0, $attempts = 10 ) {
                return $this->mergeViaCas( $key, $callback, $exptime, $attempts );
        }
 
        /**
         * @see BagOStuff::merge()
         *
-        * @param $key string
-        * @param $callback closure Callback method to be executed
+        * @param string $key
+        * @param Closure $callback Callback method to be executed
         * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
         * @param int $attempts The amount of times to attempt a merge in case of failure
-        * @return bool success
+        * @return bool Success
         */
-       protected function mergeViaCas( $key, closure $callback, $exptime = 0, $attempts = 10 ) {
+       protected function mergeViaCas( $key, Closure $callback, $exptime = 0, $attempts = 10 ) {
                do {
                        $casToken = null; // passed by reference
                        $currentValue = $this->get( $key, $casToken ); // get the old value
@@ -143,13 +143,13 @@ abstract class BagOStuff {
        /**
         * @see BagOStuff::merge()
         *
-        * @param $key string
-        * @param $callback closure Callback method to be executed
+        * @param string $key
+        * @param Closure $callback Callback method to be executed
         * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
         * @param int $attempts The amount of times to attempt a merge in case of failure
-        * @return bool success
+        * @return bool Success
         */
-       protected function mergeViaLock( $key, closure $callback, $exptime = 0, $attempts = 10 ) {
+       protected function mergeViaLock( $key, Closure $callback, $exptime = 0, $attempts = 10 ) {
                if ( !$this->lock( $key, 6 ) ) {
                        return false;
                }
@@ -172,9 +172,9 @@ abstract class BagOStuff {
        }
 
        /**
-        * @param $key string
-        * @param $timeout integer [optional]
-        * @return bool success
+        * @param string $key
+        * @param int $timeout [optional]
+        * @return bool Success
         */
        public function lock( $key, $timeout = 6 ) {
                $this->clearLastError();
@@ -208,8 +208,8 @@ abstract class BagOStuff {
        }
 
        /**
-        * @param $key string
-        * @return bool success
+        * @param string $key
+        * @return bool Success
         */
        public function unlock( $key ) {
                return $this->delete( "{$key}:lock" );
@@ -218,11 +218,11 @@ abstract class BagOStuff {
        /**
         * Delete all objects expiring before a certain date.
         * @param string $date The reference date in MW format
-        * @param $progressCallback callback|bool Optional, a function which will be called
+        * @param callable|bool $progressCallback Optional, a function which will be called
         *     regularly during long-running operations with the percentage progress
         *     as the first parameter.
         *
-        * @return bool on success, false if unimplemented
+        * @return bool Success, false if unimplemented
         */
        public function deleteObjectsExpiringBefore( $date, $progressCallback = false ) {
                // stub
@@ -234,7 +234,7 @@ abstract class BagOStuff {
        /**
         * Get an associative array containing the item for each of the keys that have items.
         * @param array $keys List of strings
-        * @return Array
+        * @return array
         */
        public function getMulti( array $keys ) {
                $res = array();
@@ -248,10 +248,27 @@ abstract class BagOStuff {
        }
 
        /**
-        * @param $key string
-        * @param $value mixed
-        * @param $exptime integer
+        * Batch insertion
+        * @param array $data $key => $value assoc array
+        * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
         * @return bool success
+        * @since 1.24
+        */
+       public function setMulti( array $data, $exptime = 0 ) {
+               $res = true;
+               foreach ( $data as $key => $value ) {
+                       if ( !$this->set( $key, $value, $exptime ) ) {
+                               $res = false;
+                       }
+               }
+               return $res;
+       }
+
+       /**
+        * @param string $key
+        * @param mixed $value
+        * @param int $exptime
+        * @return bool Success
         */
        public function add( $key, $value, $exptime = 0 ) {
                if ( $this->get( $key ) === false ) {
@@ -261,10 +278,10 @@ abstract class BagOStuff {
        }
 
        /**
-        * @param $key string
-        * @param $value mixed
-        * @param $exptime int
-        * @return bool success
+        * @param string $key
+        * @param mixed $value
+        * @param int $exptime
+        * @return bool Success
         * @deprecated since 1.23
         */
        public function replace( $key, $value, $exptime = 0 ) {
@@ -278,8 +295,8 @@ abstract class BagOStuff {
        /**
         * Increase stored value of $key by $value while preserving its TTL
         * @param string $key Key to increase
-        * @param $value Integer: Value to add to $key (Default 1)
-        * @return integer|bool New value or false on failure
+        * @param int $value Value to add to $key (Default 1)
+        * @return int|bool New value or false on failure
         */
        public function incr( $key, $value = 1 ) {
                if ( !$this->lock( $key ) ) {
@@ -299,17 +316,34 @@ abstract class BagOStuff {
 
        /**
         * Decrease stored value of $key by $value while preserving its TTL
-        * @param $key String
-        * @param $value Integer
-        * @return integer
+        * @param string $key
+        * @param int $value
+        * @return int
         */
        public function decr( $key, $value = 1 ) {
                return $this->incr( $key, - $value );
        }
 
+       /**
+        * Increase stored value of $key by $value while preserving its TTL
+        *
+        * This will create the key with value $init and TTL $ttl if not present
+        *
+        * @param string $key
+        * @param integer $ttl
+        * @param integer $value
+        * @param integer $init
+        * @return bool
+        * @since 1.24
+        */
+       public function incrWithInit( $key, $ttl, $value = 1, $init = 1 ) {
+               return $this->incr( $key, $value ) ||
+                       $this->add( $key, $init, $ttl ) || $this->incr( $key, $value );
+       }
+
        /**
         * Get the "last error" registered; clearLastError() should be called manually
-        * @return integer ERR_* constant for the "last error" registry
+        * @return int ERR_* constant for the "last error" registry
         * @since 1.23
         */
        public function getLastError() {
@@ -326,7 +360,7 @@ abstract class BagOStuff {
 
        /**
         * Set the "last error" registry
-        * @param $err integer ERR_* constant
+        * @param int $err ERR_* constant
         * @since 1.23
         */
        protected function setLastError( $err ) {
@@ -334,7 +368,7 @@ abstract class BagOStuff {
        }
 
        /**
-        * @param $text string
+        * @param string $text
         */
        public function debug( $text ) {
                if ( $this->debugMode ) {
@@ -345,7 +379,7 @@ abstract class BagOStuff {
 
        /**
         * Convert an optionally relative time to an absolute time
-        * @param $exptime integer
+        * @param int $exptime
         * @return int
         */
        protected function convertExpiry( $exptime ) {
@@ -360,8 +394,8 @@ abstract class BagOStuff {
         * Convert an optionally absolute expiry time to a relative time. If an
         * absolute time is specified which is in the past, use a short expiry time.
         *
-        * @param $exptime integer
-        * @return integer
+        * @param int $exptime
+        * @return int
         */
        protected function convertToRelative( $exptime ) {
                if ( $exptime >= 86400 * 3650 /* 10 years */ ) {
@@ -378,7 +412,7 @@ abstract class BagOStuff {
        /**
         * Check if a value is an integer
         *
-        * @param $value mixed
+        * @param mixed $value
         * @return bool
         */
        protected function isInteger( $value ) {
index 0a945a9..9595b83 100644 (file)
@@ -29,8 +29,8 @@
 class EmptyBagOStuff extends BagOStuff {
 
        /**
-        * @param $key string
-        * @param $casToken[optional] mixed
+        * @param string $key
+        * @param mixed $casToken [optional]
         * @return bool
         */
        function get( $key, &$casToken = null ) {
@@ -38,9 +38,9 @@ class EmptyBagOStuff extends BagOStuff {
        }
 
        /**
-        * @param $key string
-        * @param $value mixed
-        * @param $exp int
+        * @param string $key
+        * @param mixed $value
+        * @param int $exp
         * @return bool
         */
        function set( $key, $value, $exp = 0 ) {
@@ -48,10 +48,10 @@ class EmptyBagOStuff extends BagOStuff {
        }
 
        /**
-        * @param $casToken mixed
-        * @param $key string
-        * @param $value mixed
-        * @param $exp int
+        * @param mixed $casToken
+        * @param string $key
+        * @param mixed $value
+        * @param int $exp
         * @return bool
         */
        function cas( $casToken, $key, $value, $exp = 0 ) {
@@ -59,8 +59,8 @@ class EmptyBagOStuff extends BagOStuff {
        }
 
        /**
-        * @param $key string
-        * @param $time int
+        * @param string $key
+        * @param int $time
         * @return bool
         */
        function delete( $key, $time = 0 ) {
@@ -68,13 +68,13 @@ class EmptyBagOStuff extends BagOStuff {
        }
 
        /**
-        * @param $key string
-        * @param $callback closure Callback method to be executed
+        * @param string $key
+        * @param Closure $callback Callback method to be executed
         * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
         * @param int $attempts The amount of times to attempt a merge in case of failure
-        * @return bool success
+        * @return bool Success
         */
-       public function merge( $key, closure $callback, $exptime = 0, $attempts = 10 ) {
+       public function merge( $key, Closure $callback, $exptime = 0, $attempts = 10 ) {
                return true;
        }
 }
index bc5167d..6e50a8c 100644 (file)
  * @ingroup Cache
  */
 class HashBagOStuff extends BagOStuff {
-       var $bag;
+       /** @var array */
+       protected $bag;
 
        function __construct() {
                $this->bag = array();
        }
 
        /**
-        * @param $key string
+        * @param string $key
         * @return bool
         */
        protected function expire( $key ) {
@@ -51,8 +52,8 @@ class HashBagOStuff extends BagOStuff {
        }
 
        /**
-        * @param $key string
-        * @param $casToken[optional] mixed
+        * @param string $key
+        * @param mixed $casToken [optional]
         * @return bool|mixed
         */
        function get( $key, &$casToken = null ) {
@@ -70,9 +71,9 @@ class HashBagOStuff extends BagOStuff {
        }
 
        /**
-        * @param $key string
-        * @param $value mixed
-        * @param $exptime int
+        * @param string $key
+        * @param mixed $value
+        * @param int $exptime
         * @return bool
         */
        function set( $key, $value, $exptime = 0 ) {
@@ -81,10 +82,10 @@ class HashBagOStuff extends BagOStuff {
        }
 
        /**
-        * @param $casToken mixed
-        * @param $key string
-        * @param $value mixed
-        * @param $exptime int
+        * @param mixed $casToken
+        * @param string $key
+        * @param mixed $value
+        * @param int $exptime
         * @return bool
         */
        function cas( $casToken, $key, $value, $exptime = 0 ) {
@@ -96,8 +97,8 @@ class HashBagOStuff extends BagOStuff {
        }
 
        /**
-        * @param $key string
-        * @param $time int
+        * @param string $key
+        * @param int $time
         * @return bool
         */
        function delete( $key, $time = 0 ) {
index e4bbb43..79a6841 100644 (file)
@@ -32,6 +32,8 @@ class MemcachedBagOStuff extends BagOStuff {
        /**
         * Fill in the defaults for any parameters missing from $params, using the
         * backwards-compatible global variables
+        * @param array $params
+        * @return array
         */
        protected function applyDefaultParams( $params ) {
                if ( !isset( $params['servers'] ) ) {
@@ -56,18 +58,18 @@ class MemcachedBagOStuff extends BagOStuff {
        }
 
        /**
-        * @param $key string
-        * @param $casToken[optional] mixed
-        * @return Mixed
+        * @param string $key
+        * @param mixed $casToken [optional]
+        * @return mixed
         */
        public function get( $key, &$casToken = null ) {
                return $this->client->get( $this->encodeKey( $key ), $casToken );
        }
 
        /**
-        * @param $key string
-        * @param $value
-        * @param $exptime int
+        * @param string $key
+        * @param mixed $value
+        * @param int $exptime
         * @return bool
         */
        public function set( $key, $value, $exptime = 0 ) {
@@ -76,10 +78,10 @@ class MemcachedBagOStuff extends BagOStuff {
        }
 
        /**
-        * @param $key string
-        * @param $casToken mixed
-        * @param $value
-        * @param $exptime int
+        * @param string $key
+        * @param mixed $casToken
+        * @param mixed $value
+        * @param int $exptime
         * @return bool
         */
        public function cas( $casToken, $key, $value, $exptime = 0 ) {
@@ -88,8 +90,8 @@ class MemcachedBagOStuff extends BagOStuff {
        }
 
        /**
-        * @param $key string
-        * @param $time int
+        * @param string $key
+        * @param int $time
         * @return bool
         */
        public function delete( $key, $time = 0 ) {
@@ -97,10 +99,10 @@ class MemcachedBagOStuff extends BagOStuff {
        }
 
        /**
-        * @param $key string
-        * @param $value int
+        * @param string $key
+        * @param int $value
         * @param int $exptime (default 0)
-        * @return Mixed
+        * @return mixed
         */
        public function add( $key, $value, $exptime = 0 ) {
                return $this->client->add( $this->encodeKey( $key ), $value,
@@ -110,6 +112,7 @@ class MemcachedBagOStuff extends BagOStuff {
        /**
         * Get the underlying client object. This is provided for debugging
         * purposes.
+        * @return BagOStuff
         */
        public function getClient() {
                return $this->client;
@@ -122,7 +125,7 @@ class MemcachedBagOStuff extends BagOStuff {
         * the other control characters for compatibility with libmemcached
         * verify_key. We leave other punctuation alone, to maximise backwards
         * compatibility.
-        * @param $key string
+        * @param string $key
         * @return string
         */
        public function encodeKey( $key ) {
@@ -131,7 +134,7 @@ class MemcachedBagOStuff extends BagOStuff {
        }
 
        /**
-        * @param $m array
+        * @param array $m
         * @return string
         */
        protected function encodeKeyCallback( $m ) {
@@ -144,6 +147,8 @@ class MemcachedBagOStuff extends BagOStuff {
         * discarded immediately because the expiry is in the past.
         * Clamp expiries >30d at 30d, unless they're >=1e9 in which
         * case they are likely to really be absolute (1e9 = 2011-09-09)
+        * @param int $expiry
+        * @return int
         */
        function fixExpiry( $expiry ) {
                if ( $expiry > 2592000 && $expiry < 1000000000 ) {
@@ -156,7 +161,7 @@ class MemcachedBagOStuff extends BagOStuff {
         * Decode a key encoded with encodeKey(). This is provided as a convenience
         * function for debugging.
         *
-        * @param $key string
+        * @param string $key
         *
         * @return string
         */
@@ -166,6 +171,7 @@ class MemcachedBagOStuff extends BagOStuff {
 
        /**
         * Send a debug message to the log
+        * @param string $text
         */
        protected function debugLog( $text ) {
                wfDebugLog( 'memcached', $text );
index d39b288..9de840b 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+// @codingStandardsIgnoreFile It's an external lib and it isn't. Let's not bother.
 /**
  * Memcached client for PHP.
  *
@@ -121,7 +122,7 @@ class MWMemcached {
        /**
         * Current debug status; 0 - none to 9 - profiling
         *
-        * @var boolean
+        * @var bool
         * @access private
         */
        var $_debug;
@@ -137,7 +138,7 @@ class MWMemcached {
        /**
         * Is compression available?
         *
-        * @var boolean
+        * @var bool
         * @access private
         */
        var $_have_zlib;
@@ -145,7 +146,7 @@ class MWMemcached {
        /**
         * Do we want to use compression?
         *
-        * @var boolean
+        * @var bool
         * @access private
         */
        var $_compress_enable;
@@ -153,7 +154,7 @@ class MWMemcached {
        /**
         * At how many bytes should we compress?
         *
-        * @var integer
+        * @var int
         * @access private
         */
        var $_compress_threshold;
@@ -161,7 +162,7 @@ class MWMemcached {
        /**
         * Are we using persistent links?
         *
-        * @var boolean
+        * @var bool
         * @access private
         */
        var $_persistent;
@@ -193,7 +194,7 @@ class MWMemcached {
        /**
         * Total # of bit buckets we have
         *
-        * @var integer
+        * @var int
         * @access private
         */
        var $_bucketcount;
@@ -201,7 +202,7 @@ class MWMemcached {
        /**
         * # of total servers we have
         *
-        * @var integer
+        * @var int
         * @access private
         */
        var $_active;
@@ -209,7 +210,7 @@ class MWMemcached {
        /**
         * Stream timeout in seconds. Applies for example to fread()
         *
-        * @var integer
+        * @var int
         * @access private
         */
        var $_timeout_seconds;
@@ -217,7 +218,7 @@ class MWMemcached {
        /**
         * Stream timeout in microseconds
         *
-        * @var integer
+        * @var int
         * @access private
         */
        var $_timeout_microseconds;
@@ -271,15 +272,15 @@ class MWMemcached {
         * Adds a key/value to the memcache server if one isn't already set with
         * that key
         *
-        * @param string $key key to set with data
-        * @param $val Mixed: value to store
-        * @param $exp Integer: (optional) Expiration time. This can be a number of seconds
+        * @param string $key Key to set with data
+        * @param mixed $val Value to store
+        * @param int $exp (optional) Expiration time. This can be a number of seconds
         * to cache for (up to 30 days inclusive).  Any timespans of 30 days + 1 second or
         * longer must be the timestamp of the time at which the mapping should expire. It
         * is safe to use timestamps in all cases, regardless of expiration
         * eg: strtotime("+3 hour")
         *
-        * @return Boolean
+        * @return bool
         */
        public function add( $key, $val, $exp = 0 ) {
                return $this->_set( 'add', $key, $val, $exp );
@@ -291,10 +292,10 @@ class MWMemcached {
        /**
         * Decrease a value stored on the memcache server
         *
-        * @param string $key key to decrease
-        * @param $amt Integer: (optional) amount to decrease
+        * @param string $key Key to decrease
+        * @param int $amt (optional) amount to decrease
         *
-        * @return Mixed: FALSE on failure, value on success
+        * @return mixed False on failure, value on success
         */
        public function decr( $key, $amt = 1 ) {
                return $this->_incrdecr( 'decr', $key, $amt );
@@ -306,10 +307,10 @@ class MWMemcached {
        /**
         * Deletes a key from the server, optionally after $time
         *
-        * @param string $key key to delete
-        * @param $time Integer: (optional) how long to wait before deleting
+        * @param string $key Key to delete
+        * @param int $time (optional) how long to wait before deleting
         *
-        * @return Boolean: TRUE on success, FALSE on failure
+        * @return bool True on success, false on failure
         */
        public function delete( $key, $time = 0 ) {
                if ( !$this->_active ) {
@@ -346,8 +347,8 @@ class MWMemcached {
        }
 
        /**
-        * @param $key
-        * @param $timeout int
+        * @param string $key
+        * @param int $timeout
         * @return bool
         */
        public function lock( $key, $timeout = 0 ) {
@@ -356,7 +357,7 @@ class MWMemcached {
        }
 
        /**
-        * @param $key
+        * @param string $key
         * @return bool
         */
        public function unlock( $key ) {
@@ -384,7 +385,7 @@ class MWMemcached {
        /**
         * Enable / Disable compression
         *
-        * @param $enable Boolean: TRUE to enable, FALSE to disable
+        * @param bool $enable True to enable, false to disable
         */
        public function enable_compress( $enable ) {
                $this->_compress_enable = $enable;
@@ -407,9 +408,9 @@ class MWMemcached {
         * Retrieves the value associated with the key from the memcache server
         *
         * @param array|string $key key to retrieve
-        * @param $casToken[optional] Float
+        * @param float $casToken [optional]
         *
-        * @return Mixed
+        * @return mixed
         */
        public function get( $key, &$casToken = null ) {
                wfProfileIn( __METHOD__ );
@@ -466,9 +467,9 @@ class MWMemcached {
        /**
         * Get multiple keys from the server(s)
         *
-        * @param array $keys keys to retrieve
+        * @param array $keys Keys to retrieve
         *
-        * @return Array
+        * @return array
         */
        public function get_multi( $keys ) {
                if ( !$this->_active ) {
@@ -530,10 +531,10 @@ class MWMemcached {
        /**
         * Increments $key (optionally) by $amt
         *
-        * @param string $key key to increment
-        * @param $amt Integer: (optional) amount to increment
+        * @param string $key Key to increment
+        * @param int $amt (optional) amount to increment
         *
-        * @return Integer: null if the key does not exist yet (this does NOT
+        * @return int|null Null if the key does not exist yet (this does NOT
         * create new mappings if the key does not exist). If the key does
         * exist, this returns the new value for that key.
         */
@@ -547,15 +548,15 @@ class MWMemcached {
        /**
         * Overwrites an existing value for key; only works if key is already set
         *
-        * @param string $key key to set value as
-        * @param $value Mixed: value to store
-        * @param $exp Integer: (optional) Expiration time. This can be a number of seconds
+        * @param string $key Key to set value as
+        * @param mixed $value Value to store
+        * @param int $exp (optional) Expiration time. This can be a number of seconds
         * to cache for (up to 30 days inclusive).  Any timespans of 30 days + 1 second or
         * longer must be the timestamp of the time at which the mapping should expire. It
         * is safe to use timestamps in all cases, regardless of exipration
         * eg: strtotime("+3 hour")
         *
-        * @return Boolean
+        * @return bool
         */
        public function replace( $key, $value, $exp = 0 ) {
                return $this->_set( 'replace', $key, $value, $exp );
@@ -568,10 +569,10 @@ class MWMemcached {
         * Passes through $cmd to the memcache server connected by $sock; returns
         * output as an array (null array if no output)
         *
-        * @param $sock Resource: socket to send command on
-        * @param string $cmd command to run
+        * @param Resource $sock Socket to send command on
+        * @param string $cmd Command to run
         *
-        * @return Array: output array
+        * @return array Output array
         */
        public function run_command( $sock, $cmd ) {
                if ( !is_resource( $sock ) ) {
@@ -603,15 +604,15 @@ class MWMemcached {
         * Unconditionally sets a key to a given value in the memcache.  Returns true
         * if set successfully.
         *
-        * @param string $key key to set value as
-        * @param $value Mixed: value to set
-        * @param $exp Integer: (optional) Expiration time. This can be a number of seconds
+        * @param string $key Key to set value as
+        * @param mixed $value Value to set
+        * @param int $exp (optional) Expiration time. This can be a number of seconds
         * to cache for (up to 30 days inclusive).  Any timespans of 30 days + 1 second or
         * longer must be the timestamp of the time at which the mapping should expire. It
         * is safe to use timestamps in all cases, regardless of exipration
         * eg: strtotime("+3 hour")
         *
-        * @return Boolean: TRUE on success
+        * @return bool True on success
         */
        public function set( $key, $value, $exp = 0 ) {
                return $this->_set( 'set', $key, $value, $exp );
@@ -624,16 +625,16 @@ class MWMemcached {
         * Sets a key to a given value in the memcache if the current value still corresponds
         * to a known, given value.  Returns true if set successfully.
         *
-        * @param $casToken Float: current known value
-        * @param string $key key to set value as
-        * @param $value Mixed: value to set
-        * @param $exp Integer: (optional) Expiration time. This can be a number of seconds
+        * @param float $casToken Current known value
+        * @param string $key Key to set value as
+        * @param mixed $value Value to set
+        * @param int $exp (optional) Expiration time. This can be a number of seconds
         * to cache for (up to 30 days inclusive).  Any timespans of 30 days + 1 second or
         * longer must be the timestamp of the time at which the mapping should expire. It
         * is safe to use timestamps in all cases, regardless of exipration
         * eg: strtotime("+3 hour")
         *
-        * @return Boolean: TRUE on success
+        * @return bool True on success
         */
        public function cas( $casToken, $key, $value, $exp = 0 ) {
                return $this->_set( 'cas', $key, $value, $exp, $casToken );
@@ -645,7 +646,7 @@ class MWMemcached {
        /**
         * Sets the compression threshold
         *
-        * @param $thresh Integer: threshold to compress if larger than
+        * @param int $thresh Threshold to compress if larger than
         */
        public function set_compress_threshold( $thresh ) {
                $this->_compress_threshold = $thresh;
@@ -657,9 +658,9 @@ class MWMemcached {
        /**
         * Sets the debug flag
         *
-        * @param $dbg Boolean: TRUE for debugging, FALSE otherwise
+        * @param bool $dbg True for debugging, false otherwise
         *
-        * @see     MWMemcached::__construct
+        * @see MWMemcached::__construct
         */
        public function set_debug( $dbg ) {
                $this->_debug = $dbg;
@@ -671,9 +672,9 @@ class MWMemcached {
        /**
         * Sets the server list to distribute key gets and puts between
         *
-        * @param array $list of servers to connect to
+        * @param array $list Array of servers to connect to
         *
-        * @see     MWMemcached::__construct()
+        * @see MWMemcached::__construct()
         */
        public function set_servers( $list ) {
                $this->_servers = $list;
@@ -690,8 +691,8 @@ class MWMemcached {
        /**
         * Sets the timeout for new connections
         *
-        * @param $seconds Integer: number of seconds
-        * @param $microseconds Integer: number of microseconds
+        * @param int $seconds Number of seconds
+        * @param int $microseconds Number of microseconds
         */
        public function set_timeout( $seconds, $microseconds ) {
                $this->_timeout_seconds = $seconds;
@@ -706,7 +707,7 @@ class MWMemcached {
        /**
         * Close the specified socket
         *
-        * @param string $sock socket to close
+        * @param string $sock Socket to close
         *
         * @access private
         */
@@ -722,10 +723,10 @@ class MWMemcached {
        /**
         * Connects $sock to $host, timing out after $timeout
         *
-        * @param $sock Integer: socket to connect
+        * @param int $sock Socket to connect
         * @param string $host Host:IP to connect to
         *
-        * @return boolean
+        * @return bool
         * @access private
         */
        function _connect_sock( &$sock, $host ) {
@@ -765,7 +766,7 @@ class MWMemcached {
        /**
         * Marks a host as dead until 30-40 seconds in the future
         *
-        * @param string $sock socket to mark as dead
+        * @param string $sock Socket to mark as dead
         *
         * @access private
         */
@@ -775,7 +776,7 @@ class MWMemcached {
        }
 
        /**
-        * @param $host
+        * @param string $host
         */
        function _dead_host( $host ) {
                $parts = explode( ':', $host );
@@ -791,9 +792,9 @@ class MWMemcached {
        /**
         * get_sock
         *
-        * @param string $key key to retrieve value for;
+        * @param string $key Key to retrieve value for;
         *
-        * @return Mixed: resource on success, false on failure
+        * @return Resource|bool Resource on success, false on failure
         * @access private
         */
        function get_sock( $key ) {
@@ -840,9 +841,9 @@ class MWMemcached {
        /**
         * Creates a hash integer based on the $key
         *
-        * @param string $key key to hash
+        * @param string $key Key to hash
         *
-        * @return Integer: hash value
+        * @return int Hash value
         * @access private
         */
        function _hashfunc( $key ) {
@@ -858,11 +859,11 @@ class MWMemcached {
        /**
         * Perform increment/decriment on $key
         *
-        * @param string $cmd command to perform
-        * @param string|array $key key to perform it on
-        * @param $amt Integer amount to adjust
+        * @param string $cmd Command to perform
+        * @param string|array $key Key to perform it on
+        * @param int $amt Amount to adjust
         *
-        * @return Integer: new value of $key
+        * @return int New value of $key
         * @access private
         */
        function _incrdecr( $cmd, $key, $amt = 1 ) {
@@ -899,10 +900,10 @@ class MWMemcached {
        /**
         * Load items into $ret from $sock
         *
-        * @param $sock Resource: socket to read from
+        * @param Resource $sock Socket to read from
         * @param array $ret returned values
-        * @param $casToken[optional] Float
-        * @return boolean True for success, false for failure
+        * @param float $casToken [optional]
+        * @return bool True for success, false for failure
         *
         * @access private
         */
@@ -985,17 +986,17 @@ class MWMemcached {
        /**
         * Performs the requested storage operation to the memcache server
         *
-        * @param string $cmd command to perform
-        * @param string $key key to act on
-        * @param $val Mixed: what we need to store
-        * @param $exp Integer: (optional) Expiration time. This can be a number of seconds
+        * @param string $cmd Command to perform
+        * @param string $key Key to act on
+        * @param mixed $val What we need to store
+        * @param int $exp (optional) Expiration time. This can be a number of seconds
         * to cache for (up to 30 days inclusive).  Any timespans of 30 days + 1 second or
         * longer must be the timestamp of the time at which the mapping should expire. It
         * is safe to use timestamps in all cases, regardless of exipration
         * eg: strtotime("+3 hour")
-        * @param $casToken[optional] Float
+        * @param float $casToken [optional]
         *
-        * @return Boolean
+        * @return bool
         * @access private
         */
        function _set( $cmd, $key, $val, $exp, $casToken = null ) {
@@ -1070,7 +1071,7 @@ class MWMemcached {
         *
         * @param string $host Host:IP to get socket for
         *
-        * @return Mixed: IO Stream or false
+        * @return Resource|bool IO Stream or false
         * @access private
         */
        function sock_to_host( $host ) {
@@ -1100,14 +1101,14 @@ class MWMemcached {
        }
 
        /**
-        * @param $text string
+        * @param string $text
         */
        function _debugprint( $text ) {
                wfDebugLog( 'memcached', $text );
        }
 
        /**
-        * @param $text string
+        * @param string $text
         */
        function _error_log( $text ) {
                wfDebugLog( 'memcached-serious', "Memcached error: $text" );
@@ -1116,8 +1117,8 @@ class MWMemcached {
        /**
         * Write to a stream. If there is an error, mark the socket dead.
         *
-        * @param $sock The socket
-        * @param $buf The string to write
+        * @param Resource $sock The socket
+        * @param string $buf The string to write
         * @return bool True on success, false on failure
         */
        function _fwrite( $sock, $buf ) {
@@ -1143,6 +1144,9 @@ class MWMemcached {
 
        /**
         * Handle an I/O error. Mark the socket dead and log an error.
+        *
+        * @param Resource $sock
+        * @param string $msg
         */
        function _handle_error( $sock, $msg ) {
                $peer = stream_socket_get_name( $sock, true /** remote **/ );
@@ -1161,9 +1165,9 @@ class MWMemcached {
         * Read the specified number of bytes from a stream. If there is an error,
         * mark the socket dead.
         *
-        * @param $sock The socket
-        * @param $len The number of bytes to read
-        * @return The string on success, false on failure.
+        * @param Resource $sock The socket
+        * @param int $len The number of bytes to read
+        * @return string|bool The string on success, false on failure.
         */
        function _fread( $sock, $len ) {
                $buf = '';
@@ -1193,8 +1197,8 @@ class MWMemcached {
         * Read a line from a stream. If there is an error, mark the socket dead.
         * The \r\n line ending is stripped from the response.
         *
-        * @param $sock The socket
-        * @return The string on success, false on failure
+        * @param Resource $sock The socket
+        * @return string|bool The string on success, false on failure
         */
        function _fgets( $sock ) {
                $result = fgets( $sock );
@@ -1223,7 +1227,7 @@ class MWMemcached {
 
        /**
         * Flush the read buffer of a stream
-        * @param $f Resource
+        * @param Resource $f
         */
        function _flush_read_buffer( $f ) {
                if ( !is_resource( $f ) ) {
index 1c780b4..f7dfe46 100644 (file)
@@ -42,6 +42,7 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
         *   - serializer:          May be either "php" or "igbinary". Igbinary produces more compact
         *                          values, but serialization is much slower unless the php.ini option
         *                          igbinary.compact_strings is off.
+        * @param array $params
         */
        function __construct( $params ) {
                $params = $this->applyDefaultParams( $params );
@@ -113,9 +114,9 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
        }
 
        /**
-        * @param $key string
-        * @param $casToken[optional] float
-        * @return Mixed
+        * @param string $key
+        * @param float $casToken [optional]
+        * @return mixed
         */
        public function get( $key, &$casToken = null ) {
                wfProfileIn( __METHOD__ );
@@ -127,9 +128,9 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
        }
 
        /**
-        * @param $key string
-        * @param $value
-        * @param $exptime int
+        * @param string $key
+        * @param mixed $value
+        * @param int $exptime
         * @return bool
         */
        public function set( $key, $value, $exptime = 0 ) {
@@ -138,10 +139,10 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
        }
 
        /**
-        * @param $casToken float
-        * @param $key string
-        * @param $value
-        * @param $exptime int
+        * @param float $casToken
+        * @param string $key
+        * @param mixed $value
+        * @param int $exptime
         * @return bool
         */
        public function cas( $casToken, $key, $value, $exptime = 0 ) {
@@ -150,8 +151,8 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
        }
 
        /**
-        * @param $key string
-        * @param $time int
+        * @param string $key
+        * @param int $time
         * @return bool
         */
        public function delete( $key, $time = 0 ) {
@@ -166,10 +167,10 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
        }
 
        /**
-        * @param $key string
-        * @param $value int
-        * @param $exptime int
-        * @return Mixed
+        * @param string $key
+        * @param int $value
+        * @param int $exptime
+        * @return mixed
         */
        public function add( $key, $value, $exptime = 0 ) {
                $this->debugLog( "add($key)" );
@@ -177,9 +178,9 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
        }
 
        /**
-        * @param $key string
-        * @param $value int
-        * @return Mixed
+        * @param string $key
+        * @param int $value
+        * @return mixed
         */
        public function incr( $key, $value = 1 ) {
                $this->debugLog( "incr($key)" );
@@ -188,9 +189,9 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
        }
 
        /**
-        * @param $key string
-        * @param $value int
-        * @return Mixed
+        * @param string $key
+        * @param int $value
+        * @return mixed
         */
        public function decr( $key, $value = 1 ) {
                $this->debugLog( "decr($key)" );
@@ -206,8 +207,8 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
         * different.
         *
         * @param string $key The key used by the caller, or false if there wasn't one.
-        * @param $result Mixed The return value
-        * @return Mixed
+        * @param mixed $result The return value
+        * @return mixed
         */
        protected function checkResult( $key, $result ) {
                if ( $result !== false ) {
@@ -237,8 +238,8 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
        }
 
        /**
-        * @param $keys Array
-        * @return Array
+        * @param array $keys
+        * @return array
         */
        public function getMulti( array $keys ) {
                wfProfileIn( __METHOD__ );
@@ -249,6 +250,27 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
                return $this->checkResult( false, $result );
        }
 
+       /**
+        * @param array $data
+        * @param int $exptime
+        * @return bool
+        */
+       public function setMulti( array $data, $exptime = 0 ) {
+               wfProfileIn( __METHOD__ );
+               foreach ( $data as $key => $value ) {
+                       $encKey = $this->encodeKey( $key );
+                       if ( $encKey !== $key ) {
+                               $data[$encKey] = $value;
+                               unset( $data[$key] );
+                       }
+               }
+               $this->debugLog( 'setMulti(' . implode( ', ', array_keys( $data ) ) . ')' );
+               $result = $this->client->setMulti( $data, $this->fixExpiry( $exptime ) );
+               wfProfileOut( __METHOD__ );
+               return $this->checkResult( false, $result );
+       }
+
+
        /* NOTE: there is no cas() method here because it is currently not supported
         * by the BagOStuff interface and other BagOStuff subclasses, such as
         * SqlBagOStuff.
index 33a134c..330d2b5 100644 (file)
@@ -39,7 +39,7 @@ class MemcachedPhpBagOStuff extends MemcachedBagOStuff {
         *   - timeout:             The read timeout in microseconds
         *   - connect_timeout:     The connect timeout in seconds
         *
-        * @param $params array
+        * @param array $params
         */
        function __construct( $params ) {
                $params = $this->applyDefaultParams( $params );
@@ -50,15 +50,15 @@ class MemcachedPhpBagOStuff extends MemcachedBagOStuff {
        }
 
        /**
-        * @param $debug bool
+        * @param bool $debug
         */
        public function setDebug( $debug ) {
                $this->client->set_debug( $debug );
        }
 
        /**
-        * @param $keys Array
-        * @return Array
+        * @param array $keys
+        * @return array
         */
        public function getMulti( array $keys ) {
                $callback = array( $this, 'encodeKey' );
@@ -66,8 +66,8 @@ class MemcachedPhpBagOStuff extends MemcachedBagOStuff {
        }
 
        /**
-        * @param $key
-        * @param $timeout int
+        * @param string $key
+        * @param int $timeout
         * @return bool
         */
        public function lock( $key, $timeout = 0 ) {
@@ -75,26 +75,26 @@ class MemcachedPhpBagOStuff extends MemcachedBagOStuff {
        }
 
        /**
-        * @param $key string
-        * @return Mixed
+        * @param string $key
+        * @return mixed
         */
        public function unlock( $key ) {
                return $this->client->unlock( $this->encodeKey( $key ) );
        }
 
        /**
-        * @param $key string
-        * @param $value int
-        * @return Mixed
+        * @param string $key
+        * @param int $value
+        * @return mixed
         */
        public function incr( $key, $value = 1 ) {
                return $this->client->incr( $this->encodeKey( $key ), $value );
        }
 
        /**
-        * @param $key string
-        * @param $value int
-        * @return Mixed
+        * @param string $key
+        * @param int $value
+        * @return mixed
         */
        public function decr( $key, $value = 1 ) {
                return $this->client->decr( $this->encodeKey( $key ), $value );
index b97410a..497f75d 100644 (file)
@@ -29,7 +29,8 @@
  * @ingroup Cache
  */
 class MultiWriteBagOStuff extends BagOStuff {
-       var $caches;
+       /** @var array BagOStuff[] */
+       protected $caches;
 
        /**
         * Constructor. Parameters are:
@@ -38,7 +39,7 @@ class MultiWriteBagOStuff extends BagOStuff {
         *               structures, in the style required by $wgObjectCaches. See
         *               the documentation of $wgObjectCaches for more detail.
         *
-        * @param $params array
+        * @param array $params
         * @throws MWException
         */
        public function __construct( $params ) {
@@ -53,15 +54,15 @@ class MultiWriteBagOStuff extends BagOStuff {
        }
 
        /**
-        * @param $debug bool
+        * @param bool $debug
         */
        public function setDebug( $debug ) {
                $this->doWrite( 'setDebug', $debug );
        }
 
        /**
-        * @param $key string
-        * @param $casToken[optional] mixed
+        * @param string $key
+        * @param mixed $casToken [optional]
         * @return bool|mixed
         */
        public function get( $key, &$casToken = null ) {
@@ -75,10 +76,10 @@ class MultiWriteBagOStuff extends BagOStuff {
        }
 
        /**
-        * @param $casToken mixed
-        * @param $key string
-        * @param $value mixed
-        * @param $exptime int
+        * @param mixed $casToken
+        * @param string $key
+        * @param mixed $value
+        * @param mixed $exptime
         * @return bool
         */
        public function cas( $casToken, $key, $value, $exptime = 0 ) {
@@ -86,9 +87,9 @@ class MultiWriteBagOStuff extends BagOStuff {
        }
 
        /**
-        * @param $key string
-        * @param $value mixed
-        * @param $exptime int
+        * @param string $key
+        * @param mixed $value
+        * @param int $exptime
         * @return bool
         */
        public function set( $key, $value, $exptime = 0 ) {
@@ -96,8 +97,8 @@ class MultiWriteBagOStuff extends BagOStuff {
        }
 
        /**
-        * @param $key string
-        * @param $time int
+        * @param string $key
+        * @param int $time
         * @return bool
         */
        public function delete( $key, $time = 0 ) {
@@ -105,9 +106,9 @@ class MultiWriteBagOStuff extends BagOStuff {
        }
 
        /**
-        * @param $key string
-        * @param $value mixed
-        * @param $exptime int
+        * @param string $key
+        * @param mixed $value
+        * @param int $exptime
         * @return bool
         */
        public function add( $key, $value, $exptime = 0 ) {
@@ -115,9 +116,9 @@ class MultiWriteBagOStuff extends BagOStuff {
        }
 
        /**
-        * @param $key string
-        * @param $value mixed
-        * @param $exptime int
+        * @param string $key
+        * @param mixed $value
+        * @param int $exptime
         * @return bool
         */
        public function replace( $key, $value, $exptime = 0 ) {
@@ -125,8 +126,8 @@ class MultiWriteBagOStuff extends BagOStuff {
        }
 
        /**
-        * @param $key string
-        * @param $value int
+        * @param string $key
+        * @param int $value
         * @return bool|null
         */
        public function incr( $key, $value = 1 ) {
@@ -134,8 +135,8 @@ class MultiWriteBagOStuff extends BagOStuff {
        }
 
        /**
-        * @param $key string
-        * @param $value int
+        * @param string $key
+        * @param int $value
         * @return bool
         */
        public function decr( $key, $value = 1 ) {
@@ -143,8 +144,8 @@ class MultiWriteBagOStuff extends BagOStuff {
        }
 
        /**
-        * @param $key string
-        * @param $timeout int
+        * @param string $key
+        * @param int $timeout
         * @return bool
         */
        public function lock( $key, $timeout = 0 ) {
@@ -157,7 +158,7 @@ class MultiWriteBagOStuff extends BagOStuff {
        }
 
        /**
-        * @param $key string
+        * @param string $key
         * @return bool
         */
        public function unlock( $key ) {
@@ -169,13 +170,13 @@ class MultiWriteBagOStuff extends BagOStuff {
        }
 
        /**
-        * @param $key string
-        * @param $callback closure Callback method to be executed
+        * @param string $key
+        * @param Closure $callback Callback method to be executed
         * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
         * @param int $attempts The amount of times to attempt a merge in case of failure
-        * @return bool success
+        * @return bool Success
         */
-       public function merge( $key, closure $callback, $exptime = 0, $attempts = 10 ) {
+       public function merge( $key, Closure $callback, $exptime = 0, $attempts = 10 ) {
                return $this->doWrite( 'merge', $key, $callback, $exptime );
        }
 
@@ -190,7 +191,7 @@ class MultiWriteBagOStuff extends BagOStuff {
        }
 
        /**
-        * @param $method string
+        * @param string $method
         * @return bool
         */
        protected function doWrite( $method /*, ... */ ) {
@@ -210,8 +211,8 @@ class MultiWriteBagOStuff extends BagOStuff {
         * Delete objects expiring before a certain date.
         *
         * Succeed if any of the child caches succeed.
-        * @param $date string
-        * @param $progressCallback bool|callback
+        * @param string $date
+        * @param bool|callable $progressCallback
         * @return bool
         */
        public function deleteObjectsExpiringBefore( $date, $progressCallback = false ) {
index 6c1433a..0009999 100644 (file)
  * @ingroup Cache
  */
 class ObjectCache {
-       static $instances = array();
+       public static $instances = array();
 
        /**
         * Get a cached instance of the specified type of cache object.
         *
-        * @param $id string
+        * @param string $id
         *
         * @return BagOStuff
         */
@@ -56,7 +56,7 @@ class ObjectCache {
        /**
         * Create a new cache object of the specified type.
         *
-        * @param $id string
+        * @param string $id
         *
         * @throws MWException
         * @return BagOStuff
@@ -75,7 +75,7 @@ class ObjectCache {
        /**
         * Create a new cache object from parameters
         *
-        * @param $params array
+        * @param array $params
         *
         * @throws MWException
         * @return BagOStuff
@@ -87,8 +87,9 @@ class ObjectCache {
                        $class = $params['class'];
                        return new $class( $params );
                } else {
-                       throw new MWException( "The definition of cache type \"" . print_r( $params, true ) . "\" lacks both " .
-                               "factory and class parameters." );
+                       throw new MWException( "The definition of cache type \""
+                               . print_r( $params, true ) . "\" lacks both "
+                               . "factory and class parameters." );
                }
        }
 
@@ -101,7 +102,7 @@ class ObjectCache {
         * be an alias to the configured cache choice for that.
         * If no cache choice is configured (by default $wgMainCacheType is CACHE_NONE),
         * then CACHE_ANYTHING will forward to CACHE_DB.
-        * @param $params array
+        * @param array $params
         * @return BagOStuff
         */
        static function newAnything( $params ) {
@@ -118,7 +119,7 @@ class ObjectCache {
        /**
         * Factory function referenced from DefaultSettings.php for CACHE_ACCEL.
         *
-        * @param $params array
+        * @param array $params
         * @throws MWException
         * @return BagOStuff
         */
@@ -143,7 +144,7 @@ class ObjectCache {
         * hashing scheme and a different interpretation of the flags bitfield, so
         * switching between the two clients randomly would be disastrous.
         *
-        * @param $params array
+        * @param array $params
         *
         * @return MemcachedPhpBagOStuff
         */
index 7cf960e..cdf8da1 100644 (file)
@@ -49,6 +49,7 @@ class ObjectCacheSessionHandler {
 
        /**
         * Get the cache storage object to use for session storage
+        * @return ObjectCache
         */
        static function getCache() {
                global $wgSessionCacheType;
@@ -58,8 +59,8 @@ class ObjectCacheSessionHandler {
        /**
         * Get a cache key for the given session id.
         *
-        * @param string $id session id
-        * @return String: cache key
+        * @param string $id Session id
+        * @return string Cache key
         */
        static function getKey( $id ) {
                return wfMemcKey( 'session', $id );
@@ -68,9 +69,9 @@ class ObjectCacheSessionHandler {
        /**
         * Callback when opening a session.
         *
-        * @param $save_path String: path used to store session files, unused
-        * @param $session_name String: session name
-        * @return Boolean: success
+        * @param string $save_path Path used to store session files, unused
+        * @param string $session_name Session name
+        * @return bool Success
         */
        static function open( $save_path, $session_name ) {
                return true;
@@ -80,7 +81,7 @@ class ObjectCacheSessionHandler {
         * Callback when closing a session.
         * NOP.
         *
-        * @return Boolean: success
+        * @return bool Success
         */
        static function close() {
                return true;
@@ -89,8 +90,8 @@ class ObjectCacheSessionHandler {
        /**
         * Callback when reading session data.
         *
-        * @param string $id session id
-        * @return Mixed: session data
+        * @param string $id Session id
+        * @return mixed Session data
         */
        static function read( $id ) {
                $data = self::getCache()->get( self::getKey( $id ) );
@@ -103,9 +104,9 @@ class ObjectCacheSessionHandler {
        /**
         * Callback when writing session data.
         *
-        * @param string $id session id
-        * @param $data Mixed: session data
-        * @return Boolean: success
+        * @param string $id Session id
+        * @param mixed $data Session data
+        * @return bool Success
         */
        static function write( $id, $data ) {
                global $wgObjectCacheSessionExpiry;
@@ -116,8 +117,8 @@ class ObjectCacheSessionHandler {
        /**
         * Callback to destroy a session when calling session_destroy().
         *
-        * @param string $id session id
-        * @return Boolean: success
+        * @param string $id Session id
+        * @return bool Success
         */
        static function destroy( $id ) {
                self::getCache()->delete( self::getKey( $id ) );
@@ -128,8 +129,8 @@ class ObjectCacheSessionHandler {
         * Callback to execute garbage collection.
         * NOP: Object caches perform garbage collection implicitly
         *
-        * @param $maxlifetime Integer: maximum session life time
-        * @return Boolean: success
+        * @param int $maxlifetime Maximum session life time
+        * @return bool Success
         */
        static function gc( $maxlifetime ) {
                return true;
index 872af63..e770b73 100644 (file)
@@ -23,7 +23,7 @@
 class RedisBagOStuff extends BagOStuff {
        /** @var RedisConnectionPool */
        protected $redisPool;
-       /** @var Array List of server names */
+       /** @var array List of server names */
        protected $servers;
        /** @var bool */
        protected $automaticFailover;
@@ -53,6 +53,7 @@ class RedisBagOStuff extends BagOStuff {
         *     consistent hashing algorithm). True by default. This has the
         *     potential to create consistency issues if a server is slow enough to
         *     flap, for example if it is in swap death.
+        * @param array $params
         */
        function __construct( $params ) {
                $redisConf = array( 'serializer' => 'none' ); // manage that in this class
@@ -210,6 +211,59 @@ class RedisBagOStuff extends BagOStuff {
                return $result;
        }
 
+       /**
+        * @param array $data
+        * @param int $expiry
+        * @return bool
+        */
+       public function setMulti( array $data, $expiry = 0 ) {
+               $section = new ProfileSection( __METHOD__ );
+
+               $batches = array();
+               $conns = array();
+               foreach ( $data as $key => $value ) {
+                       list( $server, $conn ) = $this->getConnection( $key );
+                       if ( !$conn ) {
+                               continue;
+                       }
+                       $conns[$server] = $conn;
+                       $batches[$server][] = $key;
+               }
+
+               $expiry = $this->convertToRelative( $expiry );
+               $result = true;
+               foreach ( $batches as $server => $batchKeys ) {
+                       $conn = $conns[$server];
+                       try {
+                               $conn->multi( Redis::PIPELINE );
+                               foreach ( $batchKeys as $key ) {
+                                       if ( $expiry ) {
+                                               $conn->setex( $key, $expiry, $this->serialize( $data[$key] ) );
+                                       } else {
+                                               $conn->set( $key, $this->serialize( $data[$key] ) );
+                                       }
+                               }
+                               $batchResult = $conn->exec();
+                               if ( $batchResult === false ) {
+                                       $this->debug( "setMulti request to $server failed" );
+                                       continue;
+                               }
+                               foreach ( $batchResult as $value ) {
+                                       if ( $value === false ) {
+                                               $result = false;
+                                       }
+                               }
+                       } catch ( RedisException $e ) {
+                               $this->handleException( $server, $conn, $e );
+                               $result = false;
+                       }
+               }
+
+               return $result;
+       }
+
+
+
        public function add( $key, $value, $expiry = 0 ) {
                $section = new ProfileSection( __METHOD__ );
 
@@ -244,6 +298,9 @@ class RedisBagOStuff extends BagOStuff {
         * command. But we are constrained by the memcached-like interface to
         * return null in that case. Once the key exists, further increments are
         * atomic.
+        * @param string $key
+        * @param int $value
+        * @param bool|mixed
         */
        public function incr( $key, $value = 1 ) {
                $section = new ProfileSection( __METHOD__ );
@@ -286,7 +343,7 @@ class RedisBagOStuff extends BagOStuff {
 
        /**
         * Get a Redis object with a connection suitable for fetching the specified key
-        * @return Array (server, RedisConnRef) or (false, false)
+        * @return array (server, RedisConnRef) or (false, false)
         */
        protected function getConnection( $key ) {
                if ( count( $this->servers ) === 1 ) {
@@ -311,6 +368,7 @@ class RedisBagOStuff extends BagOStuff {
 
        /**
         * Log a fatal error
+        * @param string $msg
         */
        protected function logError( $msg ) {
                wfDebugLog( 'redis', "Redis error: $msg" );
@@ -321,6 +379,8 @@ class RedisBagOStuff extends BagOStuff {
         * and protocol errors. Sometimes it also closes the connection, sometimes
         * not. The safest response for us is to explicitly destroy the connection
         * object and let it be reopened during the next request.
+        * @param RedisConnRef $conn
+        * @param Exception $e
         */
        protected function handleException( RedisConnRef $conn, $e ) {
                $this->setLastError( BagOStuff::ERR_UNEXPECTED );
@@ -329,6 +389,10 @@ class RedisBagOStuff extends BagOStuff {
 
        /**
         * Send information about a single request to the debug log
+        * @param string $method
+        * @param string $key
+        * @param string $server
+        * @param bool $result
         */
        public function logRequest( $method, $key, $server, $result ) {
                $this->debug( "$method $key on $server: " .
index 74b5de2..483f8b9 100644 (file)
  * @ingroup Cache
  */
 class SqlBagOStuff extends BagOStuff {
-       /**
-        * @var LoadBalancer
-        */
-       var $lb;
+       /** @var LoadBalancer */
+       protected $lb;
+
+       protected $serverInfos;
+
+       /** @var array */
+       protected $serverNames;
+
+       /** @var int */
+       protected $numServers;
+
+       /** @var array */
+       protected $conns;
+
+       /** @var int */
+       protected $lastExpireAll = 0;
+
+       /** @var int */
+       protected $purgePeriod = 100;
 
-       var $serverInfos;
-       var $serverNames;
-       var $numServers;
-       var $conns;
-       var $lastExpireAll = 0;
-       var $purgePeriod = 100;
-       var $shards = 1;
-       var $tableName = 'objectcache';
+       /** @var int */
+       protected $shards = 1;
 
-       protected $connFailureTimes = array(); // UNIX timestamps
-       protected $connFailureErrors = array(); // exceptions
+       /** @var string */
+       protected $tableName = 'objectcache';
+
+       /** @var array UNIX timestamps */
+       protected $connFailureTimes = array();
+
+       /** @var array Exceptions */
+       protected $connFailureErrors = array();
 
        /**
         * Constructor. Parameters are:
@@ -70,7 +85,7 @@ class SqlBagOStuff extends BagOStuff {
         *                  distributed across all tables by key hash. This is for
         *                  MySQL bugs 61735 and 61736.
         *
-        * @param $params array
+        * @param array $params
         */
        public function __construct( $params ) {
                if ( isset( $params['servers'] ) ) {
@@ -101,7 +116,7 @@ class SqlBagOStuff extends BagOStuff {
        /**
         * Get a connection to the specified database
         *
-        * @param $serverIndex integer
+        * @param int $serverIndex
         * @return DatabaseBase
         */
        protected function getDB( $serverIndex ) {
@@ -155,8 +170,8 @@ class SqlBagOStuff extends BagOStuff {
 
        /**
         * Get the server index and table name for a given key
-        * @param $key string
-        * @return Array: server index and table name
+        * @param string $key
+        * @return array Server index and table name
         */
        protected function getTableByKey( $key ) {
                if ( $this->shards > 1 ) {
@@ -178,7 +193,7 @@ class SqlBagOStuff extends BagOStuff {
 
        /**
         * Get the table name for a given shard index
-        * @param $index int
+        * @param int $index
         * @return string
         */
        protected function getTableNameByShard( $index ) {
@@ -192,8 +207,8 @@ class SqlBagOStuff extends BagOStuff {
        }
 
        /**
-        * @param $key string
-        * @param $casToken[optional] mixed
+        * @param string $key
+        * @param mixed $casToken [optional]
         * @return mixed
         */
        public function get( $key, &$casToken = null ) {
@@ -206,8 +221,8 @@ class SqlBagOStuff extends BagOStuff {
        }
 
        /**
-        * @param $keys array
-        * @return Array
+        * @param array $keys
+        * @return array
         */
        public function getMulti( array $keys ) {
                $values = array(); // array of (key => value)
@@ -255,7 +270,6 @@ class SqlBagOStuff extends BagOStuff {
                                                        array( 'keyname' => $key, 'exptime' => $row->exptime ),
                                                        __METHOD__ );
                                                $db->commit( __METHOD__, 'flush' );
-                                               $values[$key] = false;
                                        } else { // HIT
                                                $values[$key] = $this->unserialize( $db->decodeBlob( $row->value ) );
                                        }
@@ -263,7 +277,6 @@ class SqlBagOStuff extends BagOStuff {
                                        $this->handleWriteError( $e, $row->serverIndex );
                                }
                        } else { // MISS
-                               $values[$key] = false;
                                $this->debug( 'get: no matching rows' );
                        }
                }
@@ -272,9 +285,79 @@ class SqlBagOStuff extends BagOStuff {
        }
 
        /**
-        * @param $key string
-        * @param $value mixed
-        * @param $exptime int
+        * @param array $data
+        * @param int $expiry
+        * @return bool
+        */
+       public function setMulti( array $data, $expiry = 0 ) {
+               $keysByTable = array();
+               foreach ( $data as $key => $value ) {
+                       list( $serverIndex, $tableName ) = $this->getTableByKey( $key );
+                       $keysByTable[$serverIndex][$tableName][] = $key;
+               }
+
+               $this->garbageCollect(); // expire old entries if any
+
+               $result = true;
+               $exptime = (int)$expiry;
+               foreach ( $keysByTable as $serverIndex => $serverKeys ) {
+                       try {
+                               $db = $this->getDB( $serverIndex );
+                       } catch ( DBError $e ) {
+                               $this->handleWriteError( $e, $serverIndex );
+                               $result = false;
+                               continue;
+                       }
+
+                       if ( $exptime < 0 ) {
+                               $exptime = 0;
+                       }
+
+                       if ( $exptime == 0 ) {
+                               $encExpiry = $this->getMaxDateTime( $db );
+                       } else {
+                               if ( $exptime < 3.16e8 ) { # ~10 years
+                                       $exptime += time();
+                               }
+                               $encExpiry = $db->timestamp( $exptime );
+                       }
+                       foreach ( $serverKeys as $tableName => $tableKeys ) {
+                               $rows = array();
+                               foreach ( $tableKeys as $key ) {
+                                       $rows[] = array(
+                                               'keyname' => $key,
+                                               'value' => $db->encodeBlob( $this->serialize( $data[$key] ) ),
+                                               'exptime' => $encExpiry,
+                                       );
+                               }
+
+                               try {
+                                       $db->commit( __METHOD__, 'flush' );
+                                       $db->replace(
+                                               $tableName,
+                                               array( 'keyname' ),
+                                               $rows,
+                                               __METHOD__
+                                       );
+                                       $db->commit( __METHOD__, 'flush' );
+                               } catch ( DBError $e ) {
+                                       $this->handleWriteError( $e, $serverIndex );
+                                       $result = false;
+                               }
+
+                       }
+
+               }
+
+               return $result;
+       }
+
+
+
+       /**
+        * @param string $key
+        * @param mixed $value
+        * @param int $exptime
         * @return bool
         */
        public function set( $key, $value, $exptime = 0 ) {
@@ -317,10 +400,10 @@ class SqlBagOStuff extends BagOStuff {
        }
 
        /**
-        * @param $casToken mixed
-        * @param $key string
-        * @param $value mixed
-        * @param $exptime int
+        * @param mixed $casToken
+        * @param string $key
+        * @param mixed $value
+        * @param int $exptime
         * @return bool
         */
        public function cas( $casToken, $key, $value, $exptime = 0 ) {
@@ -368,8 +451,8 @@ class SqlBagOStuff extends BagOStuff {
        }
 
        /**
-        * @param $key string
-        * @param $time int
+        * @param string $key
+        * @param int $time
         * @return bool
         */
        public function delete( $key, $time = 0 ) {
@@ -391,8 +474,8 @@ class SqlBagOStuff extends BagOStuff {
        }
 
        /**
-        * @param $key string
-        * @param $step int
+        * @param string $key
+        * @param int $step
         * @return int|null
         */
        public function incr( $key, $step = 1 ) {
@@ -444,7 +527,7 @@ class SqlBagOStuff extends BagOStuff {
        }
 
        /**
-        * @param $exptime string
+        * @param string $exptime
         * @return bool
         */
        protected function isExpired( $db, $exptime ) {
@@ -452,6 +535,7 @@ class SqlBagOStuff extends BagOStuff {
        }
 
        /**
+        * @param DatabaseBase $db
         * @return string
         */
        protected function getMaxDateTime( $db ) {
@@ -485,8 +569,8 @@ class SqlBagOStuff extends BagOStuff {
 
        /**
         * Delete objects from the database which expire before a certain date.
-        * @param $timestamp string
-        * @param $progressCallback bool|callback
+        * @param string $timestamp
+        * @param bool|callable $progressCallback
         * @return bool
         */
        public function deleteObjectsExpiringBefore( $timestamp, $progressCallback = false ) {
@@ -583,7 +667,7 @@ class SqlBagOStuff extends BagOStuff {
         * On typical message and page data, this can provide a 3X decrease
         * in storage requirements.
         *
-        * @param $data mixed
+        * @param mixed $data
         * @return string
         */
        protected function serialize( &$data ) {
@@ -598,7 +682,7 @@ class SqlBagOStuff extends BagOStuff {
 
        /**
         * Unserialize and, if necessary, decompress an object.
-        * @param $serial string
+        * @param string $serial
         * @return mixed
         */
        protected function unserialize( $serial ) {
@@ -619,6 +703,9 @@ class SqlBagOStuff extends BagOStuff {
 
        /**
         * Handle a DBError which occurred during a read operation.
+        *
+        * @param DBError $exception
+        * @param int $serverIndex
         */
        protected function handleReadError( DBError $exception, $serverIndex ) {
                if ( $exception instanceof DBConnectionError ) {
@@ -636,6 +723,9 @@ class SqlBagOStuff extends BagOStuff {
 
        /**
         * Handle a DBQueryError which occurred during a write operation.
+        *
+        * @param DBError $exception
+        * @param int $serverIndex
         */
        protected function handleWriteError( DBError $exception, $serverIndex ) {
                if ( $exception instanceof DBConnectionError ) {
@@ -644,7 +734,8 @@ class SqlBagOStuff extends BagOStuff {
                if ( $exception->db && $exception->db->wasReadOnlyError() ) {
                        try {
                                $exception->db->rollback( __METHOD__ );
-                       } catch ( DBError $e ) {}
+                       } catch ( DBError $e ) {
+                       }
                }
                wfDebugLog( 'SQLBagOStuff', "DBError: {$exception->getMessage()}" );
                if ( $exception instanceof DBConnectionError ) {
@@ -658,6 +749,9 @@ class SqlBagOStuff extends BagOStuff {
 
        /**
         * Mark a server down due to a DBConnectionError exception
+        *
+        * @param DBError $exception
+        * @param int $serverIndex
         */
        protected function markServerDown( $exception, $serverIndex ) {
                if ( isset( $this->connFailureTimes[$serverIndex] ) ) {
@@ -700,4 +794,5 @@ class SqlBagOStuff extends BagOStuff {
 /**
  * Backwards compatibility alias
  */
-class MediaWikiBagOStuff extends SqlBagOStuff { }
+class MediaWikiBagOStuff extends SqlBagOStuff {
+}
index 6d9b47a..a6c7d9c 100644 (file)
@@ -32,8 +32,8 @@ class WinCacheBagOStuff extends BagOStuff {
        /**
         * Get a value from the WinCache object cache
         *
-        * @param string $key cache key
-        * @param $casToken[optional] int: cas token
+        * @param string $key Cache key
+        * @param int $casToken [optional] Cas token
         * @return mixed
         */
        public function get( $key, &$casToken = null ) {
@@ -51,9 +51,9 @@ class WinCacheBagOStuff extends BagOStuff {
        /**
         * Store a value in the WinCache object cache
         *
-        * @param string $key cache key
-        * @param $value Mixed: object to store
-        * @param int $expire expiration time
+        * @param string $key Cache key
+        * @param mixed $valueObject to store
+        * @param int $expire Expiration time
         * @return bool
         */
        public function set( $key, $value, $expire = 0 ) {
@@ -67,10 +67,10 @@ class WinCacheBagOStuff extends BagOStuff {
        /**
         * Store a value in the WinCache object cache, race condition-safe
         *
-        * @param int $casToken cas token
-        * @param string $key cache key
-        * @param int $value object to store
-        * @param int $exptime expiration time
+        * @param int $casToken Cas token
+        * @param string $key Cache key
+        * @param int $value Object to store
+        * @param int $exptime Expiration time
         * @return bool
         */
        public function cas( $casToken, $key, $value, $exptime = 0 ) {
@@ -80,8 +80,8 @@ class WinCacheBagOStuff extends BagOStuff {
        /**
         * Remove a value from the WinCache object cache
         *
-        * @param string $key cache key
-        * @param int $time not used in this implementation
+        * @param string $key Cache key
+        * @param int $time Not used in this implementation
         * @return bool
         */
        public function delete( $key, $time = 0 ) {
index 0f45db7..8e2a160 100644 (file)
@@ -31,8 +31,8 @@ class XCacheBagOStuff extends BagOStuff {
        /**
         * Get a value from the XCache object cache
         *
-        * @param string $key cache key
-        * @param $casToken mixed: cas token
+        * @param string $key Cache key
+        * @param mixed $casToken Cas token
         * @return mixed
         */
        public function get( $key, &$casToken = null ) {
@@ -54,9 +54,9 @@ class XCacheBagOStuff extends BagOStuff {
        /**
         * Store a value in the XCache object cache
         *
-        * @param string $key cache key
-        * @param $value Mixed: object to store
-        * @param int $expire expiration time
+        * @param string $key Cache key
+        * @param mixed $value Object to store
+        * @param int $expire Expiration time
         * @return bool
         */
        public function set( $key, $value, $expire = 0 ) {
@@ -69,10 +69,10 @@ class XCacheBagOStuff extends BagOStuff {
        }
 
        /**
-        * @param $casToken mixed
-        * @param $key string
-        * @param $value mixed
-        * @param $exptime int
+        * @param mixed $casToken
+        * @param string $key
+        * @param mixed $value
+        * @param int $exptime
         * @return bool
         */
        public function cas( $casToken, $key, $value, $exptime = 0 ) {
@@ -83,8 +83,8 @@ class XCacheBagOStuff extends BagOStuff {
        /**
         * Remove a value from the XCache object cache
         *
-        * @param string $key cache key
-        * @param int $time not used in this implementation
+        * @param string $key Cache key
+        * @param int $time Not used in this implementation
         * @return bool
         */
        public function delete( $key, $time = 0 ) {
@@ -97,13 +97,13 @@ class XCacheBagOStuff extends BagOStuff {
         * XCache does not seem to support any way of performing CAS - this however will
         * provide a way to perform CAS-like functionality.
         *
-        * @param $key string
-        * @param $callback closure Callback method to be executed
+        * @param string $key
+        * @param Closure $callback Callback method to be executed
         * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
         * @param int $attempts The amount of times to attempt a merge in case of failure
-        * @return bool success
+        * @return bool Success
         */
-       public function merge( $key, closure $callback, $exptime = 0, $attempts = 10 ) {
+       public function merge( $key, Closure $callback, $exptime = 0, $attempts = 10 ) {
                return $this->mergeViaLock( $key, $callback, $exptime, $attempts );
        }
 
index dfe3c80..6fb3e0a 100644 (file)
@@ -53,7 +53,7 @@ class CacheTime {
        }
 
        /**
-        * @param $com bool
+        * @param bool $com
         * @return bool
         */
        function setContainsOldMagic( $com ) {
@@ -63,7 +63,7 @@ class CacheTime {
        /**
         * setCacheTime() sets the timestamp expressing when the page has been rendered.
         * This does not control expiry, see updateCacheExpiry() for that!
-        * @param $t string
+        * @param string $t
         * @return string
         */
        function setCacheTime( $t ) {
@@ -80,7 +80,7 @@ class CacheTime {
 
        /**
         * @since 1.23
-        * @param $id int Revision id
+        * @param int $id Revision id
         */
        function setCacheRevisionId( $id ) {
                $this->mCacheRevisionId = $id;
@@ -94,7 +94,7 @@ class CacheTime {
         * or equal to the smallest number that was provided as an argument to
         * updateCacheExpiry().
         *
-        * @param $seconds number
+        * @param int $seconds
         */
        function updateCacheExpiry( $seconds ) {
                $seconds = (int)$seconds;
@@ -156,17 +156,19 @@ class CacheTime {
         * per-article cache invalidation timestamps, or if it comes from
         * an incompatible older version.
         *
-        * @param string $touched the affected article's last touched timestamp
-        * @return Boolean
+        * @param string $touched The affected article's last touched timestamp
+        * @return bool
         */
        public function expired( $touched ) {
                global $wgCacheEpoch;
-               return !$this->isCacheable() || // parser says it's uncacheable
-                       $this->getCacheTime() < $touched ||
-                       $this->getCacheTime() <= $wgCacheEpoch ||
-                       $this->getCacheTime() < wfTimestamp( TS_MW, time() - $this->getCacheExpiry() ) || // expiry period has passed
-                       !isset( $this->mVersion ) ||
-                       version_compare( $this->mVersion, Parser::VERSION, "lt" );
+
+               return !$this->isCacheable() // parser says it's uncacheable
+                       || $this->getCacheTime() < $touched
+                       || $this->getCacheTime() <= $wgCacheEpoch
+                       || $this->getCacheTime() <
+                               wfTimestamp( TS_MW, time() - $this->getCacheExpiry() ) // expiry period has passed
+                       || !isset( $this->mVersion )
+                       || version_compare( $this->mVersion, Parser::VERSION, "lt" );
        }
 
        /**
@@ -178,8 +180,8 @@ class CacheTime {
         * deployed. Someday that should probably be changed.
         *
         * @since 1.23
-        * @param int $id the affected article's current revision id
-        * @return Boolean
+        * @param int $id The affected article's current revision id
+        * @return bool
         */
        public function isDifferentRevision( $id ) {
                $cached = $this->getCacheRevisionId();
index 02f2438..3425b6b 100644 (file)
@@ -27,7 +27,7 @@
  */
 class CoreParserFunctions {
        /**
-        * @param $parser Parser
+        * @param Parser $parser
         * @return void
         */
        static function register( $parser ) {
@@ -71,19 +71,25 @@ class CoreParserFunctions {
                        $parser->setFunctionHook( 'displaytitle', array( __CLASS__, 'displaytitle' ), SFH_NO_HASH );
                }
                if ( $wgAllowSlowParserFunctions ) {
-                       $parser->setFunctionHook( 'pagesinnamespace', array( __CLASS__, 'pagesinnamespace' ), SFH_NO_HASH );
+                       $parser->setFunctionHook(
+                               'pagesinnamespace',
+                               array( __CLASS__, 'pagesinnamespace' ),
+                               SFH_NO_HASH
+                       );
                }
        }
 
        /**
-        * @param $parser Parser
+        * @param Parser $parser
         * @param string $part1
         * @return array
         */
        static function intFunction( $parser, $part1 = '' /*, ... */ ) {
                if ( strval( $part1 ) !== '' ) {
                        $args = array_slice( func_get_args(), 2 );
-                       $message = wfMessage( $part1, $args )->inLanguage( $parser->getOptions()->getUserLangObj() )->plain();
+                       $message = wfMessage( $part1, $args )
+                               ->inLanguage( $parser->getOptions()->getUserLangObj() )->plain();
+
                        return array( $message, 'noparse' => false );
                } else {
                        return array( 'found' => false );
@@ -144,7 +150,7 @@ class CoreParserFunctions {
         * Or to encode a value for the HTTP "path", spaces are encoded as '%20'.
         * For links to "wiki"s, or similar software, spaces are encoded as '_',
         *
-        * @param $parser Parser object
+        * @param Parser $parser
         * @param string $s The text to encode.
         * @param string $arg (optional): The type of encoding.
         * @return string
@@ -186,9 +192,9 @@ class CoreParserFunctions {
        }
 
        /**
-        * @param $parser Parser
+        * @param Parser $parser
         * @param string $s
-        * @return
+        * @return string
         */
        static function lc( $parser, $s = '' ) {
                global $wgContLang;
@@ -196,9 +202,9 @@ class CoreParserFunctions {
        }
 
        /**
-        * @param $parser Parser
+        * @param Parser $parser
         * @param string $s
-        * @return
+        * @return string
         */
        static function uc( $parser, $s = '' ) {
                global $wgContLang;
@@ -265,7 +271,7 @@ class CoreParserFunctions {
        }
 
        /**
-        * @param $parser Parser
+        * @param Parser $parser
         * @param string $num
         * @param string $arg
         * @return string
@@ -282,10 +288,10 @@ class CoreParserFunctions {
        }
 
        /**
-        * @param $parser Parser
+        * @param Parser $parser
         * @param string $case
         * @param string $word
-        * @return
+        * @return string
         */
        static function grammar( $parser, $case = '', $word = '' ) {
                $word = $parser->killMarkers( $word );
@@ -293,9 +299,9 @@ class CoreParserFunctions {
        }
 
        /**
-        * @param $parser Parser
-        * @param $username string
-        * @return
+        * @param Parser $parser
+        * @param string $username
+        * @return string
         */
        static function gender( $parser, $username ) {
                wfProfileIn( __METHOD__ );
@@ -335,9 +341,9 @@ class CoreParserFunctions {
        }
 
        /**
-        * @param $parser Parser
+        * @param Parser $parser
         * @param string $text
-        * @return
+        * @return string
         */
        static function plural( $parser, $text = '' ) {
                $forms = array_slice( func_get_args(), 2 );
@@ -350,9 +356,9 @@ class CoreParserFunctions {
         * Override the title of the page when viewed, provided we've been given a
         * title which will normalise to the canonical title
         *
-        * @param $parser Parser: parent parser
-        * @param string $text desired title text
-        * @return String
+        * @param Parser $parser Parent parser
+        * @param string $text Desired title text
+        * @return string
         */
        static function displaytitle( $parser, $text = '' ) {
                global $wgRestrictDisplayTitle;
@@ -393,12 +399,21 @@ class CoreParserFunctions {
                // only requested titles that normalize to the actual title are allowed through
                // if $wgRestrictDisplayTitle is true (it is by default)
                // mimic the escaping process that occurs in OutputPage::setPageTitle
-               $text = Sanitizer::normalizeCharReferences( Sanitizer::removeHTMLtags( $text, $htmlTagsCallback, array(), array(), $bad ) );
+               $text = Sanitizer::normalizeCharReferences( Sanitizer::removeHTMLtags(
+                       $text,
+                       $htmlTagsCallback,
+                       array(),
+                       array(),
+                       $bad
+               ) );
                $title = Title::newFromText( Sanitizer::stripAllTags( $text ) );
 
                if ( !$wgRestrictDisplayTitle ) {
                        $parser->mOutput->setDisplayTitle( $text );
-               } elseif ( $title instanceof Title && !$title->hasFragment() && $title->equals( $parser->mTitle ) ) {
+               } elseif ( $title instanceof Title
+                       && !$title->hasFragment()
+                       && $title->equals( $parser->mTitle )
+               ) {
                        $parser->mOutput->setDisplayTitle( $text );
                }
 
@@ -408,9 +423,9 @@ class CoreParserFunctions {
        /**
         * Matches the given value against the value of given magic word
         *
-        * @param string $magicword magic word key
-        * @param mixed $value value to match
-        * @return boolean true on successful match
+        * @param string $magicword Magic word key
+        * @param string $value Value to match
+        * @return bool True on successful match
         */
        private static function matchAgainstMagicword( $magicword, $value ) {
                $value = trim( strval( $value ) );
@@ -466,6 +481,8 @@ class CoreParserFunctions {
         * corresponding magic word
         * Note: function name changed to "mwnamespace" rather than "namespace"
         * to not break PHP 5.3
+        * @param Parser $parser
+        * @param string $title
         * @return mixed|string
         */
        static function mwnamespace( $parser, $title = null ) {
@@ -521,7 +538,9 @@ class CoreParserFunctions {
        /**
         * Functions to get and normalize pagenames, corresponding to the magic words
         * of the same names
-        * @return String
+        * @param Parser $parser
+        * @param string $title
+        * @return string
         */
        static function pagename( $parser, $title = null ) {
                $t = Title::newFromText( $title );
@@ -626,6 +645,10 @@ class CoreParserFunctions {
         * Return the number of pages, files or subcats in the given category,
         * or 0 if it's nonexistent. This is an expensive parser function and
         * can't be called too many times per page.
+        * @param Parser $parser
+        * @param string $name
+        * @param string $arg1
+        * @param string $arg2
         * @return string
         */
        static function pagesincategory( $parser, $name = '', $arg1 = null, $arg2 = null ) {
@@ -690,9 +713,9 @@ class CoreParserFunctions {
         * Return the size of the given page, or 0 if it's nonexistent.  This is an
         * expensive parser function and can't be called too many times per page.
         *
-        * @param $parser Parser
-        * @param $page String Name of page to check (Default: empty string)
-        * @param $raw String Should number be human readable with commas or just number
+        * @param Parser $parser
+        * @param string $page Name of page to check (Default: empty string)
+        * @param string $raw Should number be human readable with commas or just number
         * @return string
         */
        static function pagesize( $parser, $page = '', $raw = null ) {
@@ -736,10 +759,10 @@ class CoreParserFunctions {
 
        /**
         * Gives language names.
-        * @param $parser Parser
-        * @param string $code  Language code (of which to get name)
-        * @param string $inLanguage  Language code (in which to get name)
-        * @return String
+        * @param Parser $parser
+        * @param string $code Language code (of which to get name)
+        * @param string $inLanguage Language code (in which to get name)
+        * @return string
         */
        static function language( $parser, $code = '', $inLanguage = '' ) {
                $code = strtolower( $code );
@@ -750,6 +773,11 @@ class CoreParserFunctions {
 
        /**
         * Unicode-safe str_pad with the restriction that $length is forced to be <= 500
+        * @param Parser $parser
+        * @param string $string
+        * @param int $length
+        * @param string $padding
+        * @param int $direction
         * @return string
         */
        static function pad( $parser, $string, $length, $padding = '0', $direction = STR_PAD_RIGHT ) {
@@ -787,8 +815,8 @@ class CoreParserFunctions {
        }
 
        /**
-        * @param $parser Parser
-        * @param $text
+        * @param Parser $parser
+        * @param string $text
         * @return string
         */
        static function anchorencode( $parser, $text ) {
@@ -813,7 +841,7 @@ class CoreParserFunctions {
        }
 
        /**
-        * @param $parser Parser
+        * @param Parser $parser
         * @param string $text The sortkey to use
         * @param string $uarg Either "noreplace" or "noerror" (in en)
         *   both suppress errors, and noreplace does nothing if
@@ -850,8 +878,9 @@ class CoreParserFunctions {
                }
        }
 
-       // Usage {{filepath|300}}, {{filepath|nowiki}}, {{filepath|nowiki|300}} or {{filepath|300|nowiki}}
-       // or {{filepath|300px}}, {{filepath|200x300px}}, {{filepath|nowiki|200x300px}}, {{filepath|200x300px|nowiki}}
+       // Usage {{filepath|300}}, {{filepath|nowiki}}, {{filepath|nowiki|300}}
+       // or {{filepath|300|nowiki}} or {{filepath|300px}}, {{filepath|200x300px}},
+       // {{filepath|nowiki|200x300px}}, {{filepath|200x300px|nowiki}}.
        public static function filepath( $parser, $name = '', $argA = '', $argB = '' ) {
                $file = wfFindFile( $name );
 
@@ -888,6 +917,9 @@ class CoreParserFunctions {
 
        /**
         * Parser function to extension tag adaptor
+        * @param Parser $parser
+        * @param PPFrame $frame
+        * @param array $args
         * @return string
         */
        public static function tagObj( $parser, $frame, $args ) {
@@ -938,8 +970,8 @@ class CoreParserFunctions {
         * For a given title, which is equal to the current parser title,
         * the revision object from the parser is used, when that is the current one
         *
-        * @param $parser Parser
-        * @param $title Title
+        * @param Parser $parser
+        * @param Title $title
         * @return Revision
         * @since 1.23
         */
@@ -985,8 +1017,9 @@ class CoreParserFunctions {
 
        /**
         * Get the pageid of a specified page
-        * @param $parser Parser
-        * @param $title string Title to get the pageid from
+        * @param Parser $parser
+        * @param string $title Title to get the pageid from
+        * @return int|null|string
         * @since 1.23
         */
        public static function pageid( $parser, $title = null ) {
@@ -1029,8 +1062,9 @@ class CoreParserFunctions {
 
        /**
         * Get the id from the last revision of a specified page.
-        * @param $parser Parser
-        * @param $title string Title to get the id from
+        * @param Parser $parser
+        * @param string $title Title to get the id from
+        * @return int|null|string
         * @since 1.23
         */
        public static function revisionid( $parser, $title = null ) {
@@ -1045,8 +1079,9 @@ class CoreParserFunctions {
 
        /**
         * Get the day from the last revision of a specified page.
-        * @param $parser Parser
-        * @param $title string Title to get the day from
+        * @param Parser $parser
+        * @param string $title Title to get the day from
+        * @return string
         * @since 1.23
         */
        public static function revisionday( $parser, $title = null ) {
@@ -1061,8 +1096,9 @@ class CoreParserFunctions {
 
        /**
         * Get the day with leading zeros from the last revision of a specified page.
-        * @param $parser Parser
-        * @param $title string Title to get the day from
+        * @param Parser $parser
+        * @param string $title Title to get the day from
+        * @return string
         * @since 1.23
         */
        public static function revisionday2( $parser, $title = null ) {
@@ -1077,8 +1113,9 @@ class CoreParserFunctions {
 
        /**
         * Get the month with leading zeros from the last revision of a specified page.
-        * @param $parser Parser
-        * @param $title string Title to get the month from
+        * @param Parser $parser
+        * @param string $title Title to get the month from
+        * @return string
         * @since 1.23
         */
        public static function revisionmonth( $parser, $title = null ) {
@@ -1093,8 +1130,9 @@ class CoreParserFunctions {
 
        /**
         * Get the month from the last revision of a specified page.
-        * @param $parser Parser
-        * @param $title string Title to get the month from
+        * @param Parser $parser
+        * @param string $title Title to get the month from
+        * @return string
         * @since 1.23
         */
        public static function revisionmonth1( $parser, $title = null ) {
@@ -1109,8 +1147,9 @@ class CoreParserFunctions {
 
        /**
         * Get the year from the last revision of a specified page.
-        * @param $parser Parser
-        * @param $title string Title to get the year from
+        * @param Parser $parser
+        * @param string $title Title to get the year from
+        * @return string
         * @since 1.23
         */
        public static function revisionyear( $parser, $title = null ) {
@@ -1125,8 +1164,9 @@ class CoreParserFunctions {
 
        /**
         * Get the timestamp from the last revision of a specified page.
-        * @param $parser Parser
-        * @param $title string Title to get the timestamp from
+        * @param Parser $parser
+        * @param string $title Title to get the timestamp from
+        * @return string
         * @since 1.23
         */
        public static function revisiontimestamp( $parser, $title = null ) {
@@ -1141,8 +1181,9 @@ class CoreParserFunctions {
 
        /**
         * Get the user from the last revision of a specified page.
-        * @param $parser Parser
-        * @param $title string Title to get the user from
+        * @param Parser $parser
+        * @param string $title Title to get the user from
+        * @return string
         * @since 1.23
         */
        public static function revisionuser( $parser, $title = null ) {
index cbc060a..01ad97c 100644 (file)
@@ -27,7 +27,7 @@
  */
 class CoreTagHooks {
        /**
-        * @param $parser Parser
+        * @param Parser $parser
         * @return void
         */
        static function register( $parser ) {
@@ -69,9 +69,9 @@ class CoreTagHooks {
         *
         * Uses undocumented extended tag hook return values, introduced in r61913.
         *
-        * @param $content string
-        * @param $attributes array
-        * @param $parser Parser
+        * @param string $content
+        * @param array $attributes
+        * @param Parser $parser
         * @throws MWException
         * @return array
         */
@@ -91,9 +91,9 @@ class CoreTagHooks {
         *
         * Uses undocumented extended tag hook return values, introduced in r61913.
         *
-        * @param $content string
-        * @param $attributes array
-        * @param $parser Parser
+        * @param string $content
+        * @param array $attributes
+        * @param Parser $parser
         * @return array
         */
        static function nowiki( $content, $attributes, $parser ) {
index d10841f..cfd5370 100644 (file)
@@ -49,7 +49,7 @@ class DateFormatter {
        const LAST = 8;
 
        /**
-        * @param $lang Language In which language to format the date
+        * @param Language $lang In which language to format the date
         */
        function __construct( Language $lang ) {
                $this->lang = $lang;
@@ -120,7 +120,7 @@ class DateFormatter {
        /**
         * Get a DateFormatter object
         *
-        * @param $lang Language|string|null In which language to format the date
+        * @param Language|string|null $lang In which language to format the date
         *              Defaults to the site content language
         * @return DateFormatter object
         */
@@ -142,7 +142,7 @@ class DateFormatter {
        /**
         * @param string $preference User preference
         * @param string $text Text to reformat
-        * @param array $options can contain 'linked' and/or 'match-whole'
+        * @param array $options Array can contain 'linked' and/or 'match-whole'
         *
         * @return string
         */
@@ -193,7 +193,7 @@ class DateFormatter {
        }
 
        /**
-        * @param $matches
+        * @param array $matches
         * @return string
         */
        function replace( $matches ) {
@@ -205,7 +205,8 @@ class DateFormatter {
 
                $bits = array();
                $key = $this->keys[$this->mSource];
-               for ( $p = 0; $p < strlen( $key ); $p++ ) {
+               $keyLength = strlen( $key );
+               for ( $p = 0; $p < $keyLength; $p++ ) {
                        if ( $key[$p] != ' ' ) {
                                $bits[$key[$p]] = $matches[$p + 1];
                        }
@@ -215,8 +216,8 @@ class DateFormatter {
        }
 
        /**
-        * @param $bits array
-        * @param $link bool
+        * @param array $bits
+        * @param bool $link
         * @return string
         */
        function formatDate( $bits, $link = true ) {
@@ -254,7 +255,8 @@ class DateFormatter {
                        $bits['d'] = sprintf( '%02d', $bits['j'] );
                }
 
-               for ( $p = 0; $p < strlen( $format ); $p++ ) {
+               $formatLength = strlen( $format );
+               for ( $p = 0; $p < $formatLength; $p++ ) {
                        $char = $format[$p];
                        switch ( $char ) {
                                case 'd': # ISO day of month
@@ -293,6 +295,7 @@ class DateFormatter {
                        }
                }
                if ( $fail ) {
+                       /** @todo FIXME: $matches doesn't exist here, what's expected? */
                        $text = $matches[0];
                }
 
@@ -326,7 +329,7 @@ class DateFormatter {
 
        /**
         * Makes an ISO month, e.g. 02, from a month name
-        * @param string $monthName month name
+        * @param string $monthName Month name
         * @return string ISO month name
         */
        function makeIsoMonth( $monthName ) {
@@ -354,6 +357,7 @@ class DateFormatter {
 
        /**
         * @todo document
+        * @param string $iso
         * @return int|string
         */
        function makeNormalYear( $iso ) {
index 0e7c76f..8546348 100644 (file)
@@ -49,8 +49,8 @@ class LinkHolderArray {
         * serializing at present.
         *
         * Compact the titles, only serialize the text form.
-         * @return array
-         */
+        * @return array
+        */
        function __sleep() {
                foreach ( $this->internals as &$nsLinks ) {
                        foreach ( $nsLinks as &$entry ) {
@@ -88,7 +88,7 @@ class LinkHolderArray {
 
        /**
         * Merge another LinkHolderArray into this one
-        * @param $other LinkHolderArray
+        * @param LinkHolderArray $other
         */
        function merge( $other ) {
                foreach ( $other->internals as $ns => $entries ) {
@@ -110,9 +110,9 @@ class LinkHolderArray {
         * converted for use in the destination link holder. The resulting array of
         * strings will be returned.
         *
-        * @param $other LinkHolderArray
-        * @param array $texts of strings
-        * @return Array
+        * @param LinkHolderArray $other
+        * @param array $texts Array of strings
+        * @return array
         */
        function mergeForeign( $other, $texts ) {
                $this->tempIdOffset = $idOffset = $this->parent->nextLinkID();
@@ -151,6 +151,7 @@ class LinkHolderArray {
        /**
         * Get a subset of the current LinkHolderArray which is sufficient to
         * interpret the given text.
+        * @param string $text
         * @return LinkHolderArray
         */
        function getSubArray( $text ) {
@@ -208,8 +209,8 @@ class LinkHolderArray {
         * parsing of interwiki links, and secondly to allow all existence checks and
         * article length checks (for stub links) to be bundled into a single query.
         *
-        * @param $nt Title
-        * @param $text String
+        * @param Title $nt
+        * @param string $text
         * @param array $query [optional]
         * @param string $trail [optional]
         * @param string $prefix [optional]
@@ -253,12 +254,14 @@ class LinkHolderArray {
        /**
         * Replace <!--LINK--> link placeholders with actual links, in the buffer
         *
-        * @return array of link CSS classes, indexed by PDBK.
+        * @param $text
+        * @return array Array of link CSS classes, indexed by PDBK.
         */
        function replace( &$text ) {
                wfProfileIn( __METHOD__ );
 
-               $colours = $this->replaceInternal( $text ); // FIXME: replaceInternal doesn't return a value
+               /** @todo FIXME: replaceInternal doesn't return a value */
+               $colours = $this->replaceInternal( $text );
                $this->replaceInterwiki( $text );
 
                wfProfileOut( __METHOD__ );
@@ -267,6 +270,7 @@ class LinkHolderArray {
 
        /**
         * Replace internal links
+        * @param string $text
         */
        protected function replaceInternal( &$text ) {
                if ( !$this->internals ) {
@@ -333,7 +337,8 @@ class LinkHolderArray {
 
                        $res = $dbr->select(
                                'page',
-                               array( 'page_id', 'page_namespace', 'page_title', 'page_is_redirect', 'page_len', 'page_latest' ),
+                               array( 'page_id', 'page_namespace', 'page_title',
+                                       'page_is_redirect', 'page_len', 'page_latest' ),
                                $dbr->makeList( $where, LIST_OR ),
                                __METHOD__
                        );
@@ -418,6 +423,7 @@ class LinkHolderArray {
 
        /**
         * Replace interwiki links
+        * @param string $text
         */
        protected function replaceInterwiki( &$text ) {
                if ( empty( $this->interwikis ) ) {
@@ -443,6 +449,7 @@ class LinkHolderArray {
 
        /**
         * Modify $this->internals and $colours according to language variant linking rules
+        * @param array $colours
         */
        protected function doVariants( &$colours ) {
                global $wgContLang;
@@ -534,7 +541,8 @@ class LinkHolderArray {
                        // construct query
                        $dbr = wfGetDB( DB_SLAVE );
                        $varRes = $dbr->select( 'page',
-                               array( 'page_id', 'page_namespace', 'page_title', 'page_is_redirect', 'page_len', 'page_latest' ),
+                               array( 'page_id', 'page_namespace', 'page_title',
+                                       'page_is_redirect', 'page_len', 'page_latest' ),
                                $linkBatch->constructSet( 'page', $dbr ),
                                __METHOD__
                        );
@@ -606,8 +614,8 @@ class LinkHolderArray {
         * Replace <!--LINK--> link placeholders with plain text of links
         * (not HTML-formatted).
         *
-        * @param $text String
-        * @return String
+        * @param string $text
+        * @return string
         */
        function replaceText( $text ) {
                wfProfileIn( __METHOD__ );
@@ -624,7 +632,7 @@ class LinkHolderArray {
        /**
         * Callback for replaceText()
         *
-        * @param $matches Array
+        * @param array $matches
         * @return string
         * @private
         */
index 1a1ef38..d2a20df 100644 (file)
@@ -205,16 +205,20 @@ class Parser {
        var $mUniqPrefix;
 
        /**
-        * @var Array with the language name of each language link (i.e. the
+        * @var array Array with the language name of each language link (i.e. the
         * interwiki prefix) in the key, value arbitrary. Used to avoid sending
         * duplicate language links to the ParserOutput.
         */
        var $mLangLinkLanguages;
 
        /**
-        * Constructor
-        *
-        * @param $conf array
+        * @var boolean Recursive call protection.
+        * This variable should be treated as if it were private.
+        */
+       public $mInParse = false;
+
+       /**
+        * @param array $conf
         */
        public function __construct( $conf = array() ) {
                $this->mConf = $conf;
@@ -254,6 +258,7 @@ class Parser {
         * Allow extensions to clean up when the parser is cloned
         */
        function __clone() {
+               $this->mInParse = false;
                wfRunHooks( 'ParserCloned', array( $this ) );
        }
 
@@ -346,14 +351,16 @@ class Parser {
         * Do not call this function recursively.
         *
         * @param string $text text we want to parse
-        * @param $title Title object
-        * @param $options ParserOptions
-        * @param $linestart boolean
-        * @param $clearState boolean
-        * @param int $revid number to pass in {{REVISIONID}}
-        * @return ParserOutput a ParserOutput
-        */
-       public function parse( $text, Title $title, ParserOptions $options, $linestart = true, $clearState = true, $revid = null ) {
+        * @param Title $title
+        * @param ParserOptions $options
+        * @param bool $linestart
+        * @param bool $clearState
+        * @param int $revid Number to pass in {{REVISIONID}}
+        * @return ParserOutput A ParserOutput
+        */
+       public function parse( $text, Title $title, ParserOptions $options,
+               $linestart = true, $clearState = true, $revid = null
+       ) {
                /**
                 * First pass--just handle <nowiki> sections, pass the rest off
                 * to internalParse() which does all the real work.
@@ -364,6 +371,10 @@ class Parser {
                wfProfileIn( __METHOD__ );
                wfProfileIn( $fname );
 
+               if ( $clearState ) {
+                       $magicScopeVariable = $this->lock();
+               }
+
                $this->startParse( $title, $options, self::OT_HTML, $clearState );
 
                $this->mInputSize = strlen( $text );
@@ -590,8 +601,8 @@ class Parser {
         *
         * If $frame is not provided, then template variables (e.g., {{{1}}}) within $text are not expanded
         *
-        * @param string $text text extension wants to have parsed
-        * @param PPFrame $frame The frame to use for expanding any template variables
+        * @param string $text Text extension wants to have parsed
+        * @param bool|PPFrame $frame The frame to use for expanding any template variables
         *
         * @return string
         */
@@ -607,10 +618,15 @@ class Parser {
        /**
         * Expand templates and variables in the text, producing valid, static wikitext.
         * Also removes comments.
+        * @param string $text
+        * @param Title $title
+        * @param ParserOptions $options
+        * @param int|null $revid
         * @return mixed|string
         */
        function preprocess( $text, Title $title = null, ParserOptions $options, $revid = null ) {
                wfProfileIn( __METHOD__ );
+               $magicScopeVariable = $this->lock();
                $this->startParse( $title, $options, self::OT_PREPROCESS, true );
                if ( $revid !== null ) {
                        $this->mRevisionId = $revid;
@@ -627,8 +643,8 @@ class Parser {
         * Recursive parser entry point that can be called from an extension tag
         * hook.
         *
-        * @param string $text text to be expanded
-        * @param PPFrame $frame The frame to use for expanding any template variables
+        * @param string $text Text to be expanded
+        * @param bool|PPFrame $frame The frame to use for expanding any template variables
         * @return string
         * @since 1.19
         */
@@ -647,17 +663,18 @@ class Parser {
         * transclusion, comments, templates, arguments, tags hooks and parser
         * functions are untouched.
         *
-        * @param $text String
-        * @param $title Title
-        * @param $options ParserOptions
-        * @param $params Array
-        * @return String
+        * @param string $text
+        * @param Title $title
+        * @param ParserOptions $options
+        * @param array $params
+        * @return string
         */
        public function getPreloadText( $text, Title $title, ParserOptions $options, $params = array() ) {
                $msg = new RawMessage( $text );
                $text = $msg->params( $params )->plain();
 
                # Parser (re)initialisation
+               $magicScopeVariable = $this->lock();
                $this->startParse( $title, $options, self::OT_PLAIN, true );
 
                $flags = PPFrame::NO_ARGS | PPFrame::NO_TEMPLATES;
@@ -689,7 +706,7 @@ class Parser {
        /**
         * Accessor for mUniqPrefix.
         *
-        * @return String
+        * @return string
         */
        public function uniqPrefix() {
                if ( !isset( $this->mUniqPrefix ) ) {
@@ -707,7 +724,7 @@ class Parser {
        /**
         * Set the context title
         *
-        * @param $t Title
+        * @param Title $t
         */
        function setTitle( $t ) {
                if ( !$t ) {
@@ -726,7 +743,7 @@ class Parser {
        /**
         * Accessor for the Title object
         *
-        * @return Title object
+        * @return Title
         */
        function getTitle() {
                return $this->mTitle;
@@ -735,8 +752,8 @@ class Parser {
        /**
         * Accessor/mutator for the Title object
         *
-        * @param $x Title object or null to just get the current one
-        * @return Title object
+        * @param Title $x Title object or null to just get the current one
+        * @return Title
         */
        function Title( $x = null ) {
                return wfSetVar( $this->mTitle, $x );
@@ -745,7 +762,7 @@ class Parser {
        /**
         * Set the output type
         *
-        * @param int $ot new value
+        * @param int $ot New value
         */
        function setOutputType( $ot ) {
                $this->mOutputType = $ot;
@@ -762,7 +779,7 @@ class Parser {
         * Accessor/mutator for the output type
         *
         * @param int|null $x New value or null to just get the current one
-        * @return Integer
+        * @return int
         */
        function OutputType( $x = null ) {
                return wfSetVar( $this->mOutputType, $x );
@@ -771,7 +788,7 @@ class Parser {
        /**
         * Get the ParserOutput object
         *
-        * @return ParserOutput object
+        * @return ParserOutput
         */
        function getOutput() {
                return $this->mOutput;
@@ -789,7 +806,7 @@ class Parser {
        /**
         * Accessor/mutator for the ParserOptions object
         *
-        * @param $x ParserOptions New value or null to just get the current one
+        * @param ParserOptions $x New value or null to just get the current one
         * @return ParserOptions Current ParserOptions object
         */
        function Options( $x = null ) {
@@ -804,7 +821,7 @@ class Parser {
        }
 
        /**
-        * @param $id int
+        * @param int $id
         */
        function setLinkID( $id ) {
                $this->mLinkID = $id;
@@ -843,6 +860,7 @@ class Parser {
 
        /**
         * Get the language object for language conversion
+        * @return Language|null
         */
        function getConverterLanguage() {
                return $this->getTargetLanguage();
@@ -852,7 +870,7 @@ class Parser {
         * Get a User object either from $this->mUser, if set, or from the
         * ParserOptions object otherwise
         *
-        * @return User object
+        * @return User
         */
        function getUser() {
                if ( !is_null( $this->mUser ) ) {
@@ -864,7 +882,7 @@ class Parser {
        /**
         * Get a preprocessor object
         *
-        * @return Preprocessor instance
+        * @return Preprocessor
         */
        function getPreprocessor() {
                if ( !isset( $this->mPreprocessor ) ) {
@@ -970,7 +988,7 @@ class Parser {
         * Returns the unique tag which must be inserted into the stripped text
         * The tag will be replaced with the original text in unstrip()
         *
-        * @param $text string
+        * @param string $text
         *
         * @return string
         */
@@ -985,6 +1003,7 @@ class Parser {
         * parse the wiki syntax used to render tables
         *
         * @private
+        * @param string $text
         * @return string
         */
        function doTableStuff( $text ) {
@@ -1072,7 +1091,10 @@ class Parser {
                                array_push( $tr_history, false );
                                array_push( $td_history, false );
                                array_push( $last_tag_history, '' );
-                       } elseif ( $first_character === '|' || $first_character === '!' || substr( $line, 0, 2 ) === '|+' ) {
+                       } elseif ( $first_character === '|'
+                               || $first_character === '!'
+                               || substr( $line, 0, 2 ) === '|+'
+                       ) {
                                # This might be cell elements, td, th or captions
                                if ( substr( $line, 0, 2 ) === '|+' ) {
                                        $first_character = '+';
@@ -1183,9 +1205,9 @@ class Parser {
         *
         * @private
         *
-        * @param $text string
-        * @param $isMain bool
-        * @param $frame bool
+        * @param string $text
+        * @param bool $isMain
+        * @param bool $frame
         *
         * @return string
         */
@@ -1217,7 +1239,12 @@ class Parser {
                }
 
                wfRunHooks( 'InternalParseBeforeSanitize', array( &$this, &$text, &$this->mStripState ) );
-               $text = Sanitizer::removeHTMLtags( $text, array( &$this, 'attributeStripCallback' ), false, array_keys( $this->mTransparentTagHooks ) );
+               $text = Sanitizer::removeHTMLtags(
+                       $text,
+                       array( &$this, 'attributeStripCallback' ),
+                       false,
+                       array_keys( $this->mTransparentTagHooks )
+               );
                wfRunHooks( 'InternalParseBeforeLinks', array( &$this, &$text, &$this->mStripState ) );
 
                # Tables need to come after variable replacement for things to work
@@ -1253,7 +1280,7 @@ class Parser {
         * DML
         * @private
         *
-        * @param $text string
+        * @param string $text
         *
         * @return string
         */
@@ -1279,7 +1306,7 @@ class Parser {
 
        /**
         * @throws MWException
-        * @param $m array
+        * @param array $m
         * @return HTML|string
         */
        function magicLinkCallback( $m ) {
@@ -1330,7 +1357,7 @@ class Parser {
        /**
         * Make a free external link, given a user-supplied URL
         *
-        * @param $url string
+        * @param string $url
         *
         * @return string HTML
         * @private
@@ -1386,7 +1413,7 @@ class Parser {
         *
         * @private
         *
-        * @param $text string
+        * @param string $text
         *
         * @return string
         */
@@ -1404,7 +1431,7 @@ class Parser {
         * Replace single quotes with HTML markup
         * @private
         *
-        * @param $text string
+        * @param string $text
         *
         * @return string the altered text
         */
@@ -1423,7 +1450,7 @@ class Parser {
        /**
         * Helper function for doAllQuotes()
         *
-        * @param $text string
+        * @param string $text
         *
         * @return string
         */
@@ -1612,7 +1639,7 @@ class Parser {
         *
         * @private
         *
-        * @param $text string
+        * @param string $text
         *
         * @throws MWException
         * @return string
@@ -1623,7 +1650,8 @@ class Parser {
                $bits = preg_split( $this->mExtLinkBracketedRegex, $text, -1, PREG_SPLIT_DELIM_CAPTURE );
                if ( $bits === false ) {
                        wfProfileOut( __METHOD__ );
-                       throw new MWException( "PCRE needs to be compiled with --enable-unicode-properties in order for MediaWiki to function" );
+                       throw new MWException( "PCRE needs to be compiled with "
+                               . "--enable-unicode-properties in order for MediaWiki to function" );
                }
                $s = array_shift( $bits );
 
@@ -1693,10 +1721,10 @@ class Parser {
         * Get the rel attribute for a particular external link.
         *
         * @since 1.21
-        * @param string|bool $url optional URL, to extract the domain from for rel =>
+        * @param string|bool $url Optional URL, to extract the domain from for rel =>
         *   nofollow if appropriate
-        * @param $title Title optional Title, for wgNoFollowNsExceptions lookups
-        * @return string|null rel attribute for $url
+        * @param Title $title Optional Title, for wgNoFollowNsExceptions lookups
+        * @return string|null Rel attribute for $url
         */
        public static function getExternalLinkRel( $url = false, $title = null ) {
                global $wgNoFollowLinks, $wgNoFollowNsExceptions, $wgNoFollowDomainExceptions;
@@ -1715,9 +1743,9 @@ class Parser {
         * (depending on configuration, namespace, and the URL's domain) and/or a
         * target attribute (depending on configuration).
         *
-        * @param string|bool $url optional URL, to extract the domain from for rel =>
+        * @param string|bool $url Optional URL, to extract the domain from for rel =>
         *   nofollow if appropriate
-        * @return Array associative array of HTML attributes
+        * @return array Associative array of HTML attributes
         */
        function getExternalLinkAttribs( $url = false ) {
                $attribs = array();
@@ -1732,8 +1760,8 @@ class Parser {
        /**
         * Replace unusual URL escape codes with their equivalent characters
         *
-        * @param $url String
-        * @return String
+        * @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
@@ -1749,7 +1777,7 @@ class Parser {
         * Callback function used in replaceUnusualEscapes().
         * Replaces unusual URL escape codes with their equivalent character
         *
-        * @param $matches array
+        * @param array $matches
         *
         * @return string
         */
@@ -1769,13 +1797,12 @@ class Parser {
        /**
         * make an image if it's allowed, either through the global
         * option, through the exception, or through the on-wiki whitelist
-        * @private
         *
-        * $param $url string
+        * @param string $url
         *
         * @return string
         */
-       function maybeMakeExternalImage( $url ) {
+       private function maybeMakeExternalImage( $url ) {
                $imagesfrom = $this->mOptions->getAllowExternalImagesFrom();
                $imagesexception = !empty( $imagesfrom );
                $text = false;
@@ -1793,16 +1820,23 @@ class Parser {
                } else {
                        $imagematch = false;
                }
+
                if ( $this->mOptions->getAllowExternalImages()
-                       || ( $imagesexception && $imagematch ) ) {
+                       || ( $imagesexception && $imagematch )
+               ) {
                        if ( preg_match( self::EXT_IMAGE_REGEX, $url ) ) {
                                # Image found
                                $text = Linker::makeExternalImage( $url );
                        }
                }
                if ( !$text && $this->mOptions->getEnableImageWhitelist()
-                       && preg_match( self::EXT_IMAGE_REGEX, $url ) ) {
-                       $whitelist = explode( "\n", wfMessage( 'external_image_whitelist' )->inContentLanguage()->text() );
+                       && preg_match( self::EXT_IMAGE_REGEX, $url )
+               ) {
+                       $whitelist = explode(
+                               "\n",
+                               wfMessage( 'external_image_whitelist' )->inContentLanguage()->text()
+                       );
+
                        foreach ( $whitelist as $entry ) {
                                # Sanitize the regex fragment, make it case-insensitive, ignore blank entries/comments
                                if ( strpos( $entry, '#' ) === 0 || $entry === '' ) {
@@ -1834,7 +1868,7 @@ class Parser {
 
        /**
         * Process [[ ]] wikilinks (RIL)
-        * @param $s
+        * @param string $s
         * @throws MWException
         * @return LinkHolderArray
         *
@@ -1895,8 +1929,11 @@ class Parser {
                $useSubpages = $this->areSubpagesAllowed();
                wfProfileOut( __METHOD__ . '-setup' );
 
+               // @codingStandardsIgnoreStart Squiz.WhiteSpace.SemicolonSpacing.Incorrect
                # Loop for each link
                for ( ; $line !== false && $line !== null; $a->next(), $line = $a->current() ) {
+                       // @codingStandardsIgnoreStart
+
                        # Check for excessive memory usage
                        if ( $holders->isBig() ) {
                                # Too big
@@ -1947,7 +1984,8 @@ class Parser {
                                        $m[1] = str_replace( array( '<', '>' ), array( '&lt;', '&gt;' ), rawurldecode( $m[1] ) );
                                }
                                $trail = $m[3];
-                       } elseif ( preg_match( $e1_img, $line, $m ) ) { # Invalid, but might be an image with a link in its caption
+                       } elseif ( preg_match( $e1_img, $line, $m ) ) {
+                               # Invalid, but might be an image with a link in its caption
                                $might_be_img = true;
                                $text = $m[2];
                                if ( strpos( $m[1], '%' ) !== false ) {
@@ -2057,7 +2095,9 @@ class Parser {
                        if ( $noforce ) {
                                # Interwikis
                                wfProfileIn( __METHOD__ . "-interwiki" );
-                               if ( $iw && $this->mOptions->getInterwikiMagic() && $nottalk && Language::fetchLanguageName( $iw, null, 'mw' ) ) {
+                               if ( $iw && $this->mOptions->getInterwikiMagic()
+                                       && $nottalk && Language::fetchLanguageName( $iw, null, 'mw' )
+                               ) {
                                        // XXX: the above check prevents links to sites with identifiers that are not language codes
 
                                        # Bug 24502: filter duplicates
@@ -2214,7 +2254,7 @@ class Parser {
 
        /**
         * Return true if subpage links should be expanded on this page.
-        * @return Boolean
+        * @return bool
         */
        function areSubpagesAllowed() {
                # Some namespaces don't allow subpages
@@ -2254,8 +2294,8 @@ class Parser {
         * of both arguments, starting at the beginning of both.
         * @private
         *
-        * @param $st1 string
-        * @param $st2 string
+        * @param string $st1
+        * @param string $st2
         *
         * @return int
         */
@@ -2279,7 +2319,7 @@ class Parser {
         * element appropriate to the prefix character passed into them.
         * @private
         *
-        * @param $char string
+        * @param string $char
         *
         * @return string
         */
@@ -2304,7 +2344,7 @@ class Parser {
 
        /**
         * TODO: document
-        * @param $char String
+        * @param string $char
         * @private
         *
         * @return string
@@ -2329,8 +2369,8 @@ class Parser {
        }
 
        /**
-        * TODO: document
-        * @param $char String
+        * @todo Document
+        * @param string $char
         * @private
         *
         * @return string
@@ -2469,13 +2509,22 @@ class Parser {
                                wfProfileIn( __METHOD__ . "-paragraph" );
                                # No prefix (not in list)--go to paragraph mode
                                # XXX: use a stack for nestable elements like span, table and div
-                               $openmatch = preg_match( '/(?:<table|<h1|<h2|<h3|<h4|<h5|<h6|<pre|<tr|<p|<ul|<ol|<dl|<li|<\\/tr|<\\/td|<\\/th)/iS', $t );
+                               $openmatch = preg_match(
+                                       '/(?:<table|<h1|<h2|<h3|<h4|<h5|<h6|<pre|<tr|'
+                                               . '<p|<ul|<ol|<dl|<li|<\\/tr|<\\/td|<\\/th)/iS',
+                                       $t
+                               );
                                $closematch = preg_match(
-                                       '/(?:<\\/table|<\\/h1|<\\/h2|<\\/h3|<\\/h4|<\\/h5|<\\/h6|' .
-                                       '<td|<th|<\\/?blockquote|<\\/?div|<hr|<\\/pre|<\\/p|<\\/mw:|' . $this->mUniqPrefix . '-pre|<\\/li|<\\/ul|<\\/ol|<\\/dl|<\\/?center)/iS', $t );
+                                       '/(?:<\\/table|<\\/h1|<\\/h2|<\\/h3|<\\/h4|<\\/h5|<\\/h6|'
+                                               . '<td|<th|<\\/?blockquote|<\\/?div|<hr|<\\/pre|<\\/p|<\\/mw:|'
+                                               . $this->mUniqPrefix
+                                               . '-pre|<\\/li|<\\/ul|<\\/ol|<\\/dl|<\\/?center)/iS',
+                                       $t
+                               );
+
                                if ( $openmatch or $closematch ) {
                                        $paragraphStack = false;
-                                       # TODO bug 5718: paragraph closed
+                                       # @todo bug 5718: paragraph closed
                                        $output .= $this->closeParagraph();
                                        if ( $preOpenMatch and !$preCloseMatch ) {
                                                $this->mInPre = true;
@@ -2487,7 +2536,10 @@ class Parser {
                                        }
                                        $inBlockElem = !$closematch;
                                } elseif ( !$inBlockElem && !$this->mInPre ) {
-                                       if ( ' ' == substr( $t, 0, 1 ) and ( $this->mLastSection === 'pre' || trim( $t ) != '' ) and !$inBlockquote ) {
+                                       if ( ' ' == substr( $t, 0, 1 )
+                                               && ( $this->mLastSection === 'pre' || trim( $t ) != '' )
+                                               && !$inBlockquote
+                                       ) {
                                                # pre
                                                if ( $this->mLastSection !== 'pre' ) {
                                                        $paragraphStack = false;
@@ -2550,11 +2602,11 @@ class Parser {
         * Split up a string on ':', ignoring any occurrences inside tags
         * to prevent illegal overlapping.
         *
-        * @param string $str the string to split
-        * @param &$before String set to everything before the ':'
-        * @param &$after String set to everything after the ':'
+        * @param string $str The string to split
+        * @param string &$before Set to everything before the ':'
+        * @param string &$after Set to everything after the ':'
         * @throws MWException
-        * @return String the position of the ':', or false if none found
+        * @return string The position of the ':', or false if none found
         */
        function findColonNoLinks( $str, &$before, &$after ) {
                wfProfileIn( __METHOD__ );
@@ -2718,14 +2770,14 @@ class Parser {
         *
         * @private
         *
-        * @param $index integer
-        * @param bool|\PPFrame $frame
+        * @param int $index
+        * @param bool|PPFrame $frame
         *
         * @throws MWException
         * @return string
         */
        function getVariableValue( $index, $frame = false ) {
-               global $wgContLang, $wgSitename, $wgServer;
+               global $wgContLang, $wgSitename, $wgServer, $wgServerName;
                global $wgArticlePath, $wgScriptPath, $wgStylePath;
 
                if ( is_null( $this->mTitle ) ) {
@@ -2817,13 +2869,21 @@ class Parser {
                                $value = wfEscapeWikiText( $this->mTitle->getRootText() );
                                break;
                        case 'rootpagenamee':
-                               $value = wfEscapeWikiText( wfUrlEncode( str_replace( ' ', '_', $this->mTitle->getRootText() ) ) );
+                               $value = wfEscapeWikiText( wfUrlEncode( str_replace(
+                                       ' ',
+                                       '_',
+                                       $this->mTitle->getRootText()
+                               ) ) );
                                break;
                        case 'basepagename':
                                $value = wfEscapeWikiText( $this->mTitle->getBaseText() );
                                break;
                        case 'basepagenamee':
-                               $value = wfEscapeWikiText( wfUrlEncode( str_replace( ' ', '_', $this->mTitle->getBaseText() ) ) );
+                               $value = wfEscapeWikiText( wfUrlEncode( str_replace(
+                                       ' ',
+                                       '_',
+                                       $this->mTitle->getBaseText()
+                               ) ) );
                                break;
                        case 'talkpagename':
                                if ( $this->mTitle->canTalk() ) {
@@ -2934,7 +2994,9 @@ class Parser {
                                $value = $this->mTitle->getNamespace();
                                break;
                        case 'talkspace':
-                               $value = $this->mTitle->canTalk() ? str_replace( '_', ' ', $this->mTitle->getTalkNsText() ) : '';
+                               $value = $this->mTitle->canTalk()
+                                       ? str_replace( '_', ' ', $this->mTitle->getTalkNsText() )
+                                       : '';
                                break;
                        case 'talkspacee':
                                $value = $this->mTitle->canTalk() ? wfUrlencode( $this->mTitle->getTalkNsText() ) : '';
@@ -2966,13 +3028,19 @@ class Parser {
                                $value = $pageLang->formatNum( MWTimestamp::getInstance( $ts )->format( 'w' ) );
                                break;
                        case 'localdayname':
-                               $value = $pageLang->getWeekdayName( (int)MWTimestamp::getLocalInstance( $ts )->format( 'w' ) + 1 );
+                               $value = $pageLang->getWeekdayName(
+                                       (int)MWTimestamp::getLocalInstance( $ts )->format( 'w' ) + 1
+                               );
                                break;
                        case 'localyear':
                                $value = $pageLang->formatNum( MWTimestamp::getLocalInstance( $ts )->format( 'Y' ), true );
                                break;
                        case 'localtime':
-                               $value = $pageLang->time( MWTimestamp::getLocalInstance( $ts )->format( 'YmdHis' ), false, false );
+                               $value = $pageLang->time(
+                                       MWTimestamp::getLocalInstance( $ts )->format( 'YmdHis' ),
+                                       false,
+                                       false
+                               );
                                break;
                        case 'localhour':
                                $value = $pageLang->formatNum( MWTimestamp::getLocalInstance( $ts )->format( 'H' ), true );
@@ -3026,8 +3094,7 @@ class Parser {
                        case 'server':
                                return $wgServer;
                        case 'servername':
-                               $serverParts = wfParseUrl( $wgServer );
-                               return $serverParts && isset( $serverParts['host'] ) ? $serverParts['host'] : $wgServer;
+                               return $wgServerName;
                        case 'scriptpath':
                                return $wgScriptPath;
                        case 'stylepath':
@@ -3042,7 +3109,11 @@ class Parser {
                                break;
                        default:
                                $ret = null;
-                               wfRunHooks( 'ParserGetVariableValueSwitch', array( &$this, &$this->mVarCache, &$index, &$ret, &$frame ) );
+                               wfRunHooks(
+                                       'ParserGetVariableValueSwitch',
+                                       array( &$this, &$this->mVarCache, &$index, &$ret, &$frame )
+                               );
+
                                return $ret;
                }
 
@@ -3098,7 +3169,7 @@ class Parser {
        /**
         * Return a three-element array: leading whitespace, string contents, trailing whitespace
         *
-        * @param $s string
+        * @param string $s
         *
         * @return array
         */
@@ -3125,16 +3196,17 @@ class Parser {
         *  self::OT_PREPROCESS: templates but not extension tags
         *  self::OT_HTML: all templates and extension tags
         *
-        * @param string $text the text to transform
-        * @param $frame PPFrame Object describing the arguments passed to the template.
-        *        Arguments may also be provided as an associative array, as was the usual case before MW1.12.
-        *        Providing arguments this way may be useful for extensions wishing to perform variable replacement explicitly.
-        * @param $argsOnly Boolean only do argument (triple-brace) expansion, not double-brace expansion
-        * @private
-        *
+        * @param string $text The text to transform
+        * @param bool|PPFrame $frame Object describing the arguments passed to the
+        *   template. Arguments may also be provided as an associative array, as
+        *   was the usual case before MW1.12. Providing arguments this way may be
+        *   useful for extensions wishing to perform variable replacement
+        *   explicitly.
+        * @param bool $argsOnly Only do argument (triple-brace) expansion, not
+        *   double-brace expansion.
         * @return string
         */
-       function replaceVariables( $text, $frame = false, $argsOnly = false ) {
+       public function replaceVariables( $text, $frame = false, $argsOnly = false ) {
                # Is there any text? Also, Prevent too big inclusions!
                if ( strlen( $text ) < 1 || strlen( $text ) > $this->mOptions->getMaxIncludeSize() ) {
                        return $text;
@@ -3144,7 +3216,8 @@ class Parser {
                if ( $frame === false ) {
                        $frame = $this->getPreprocessor()->newFrame();
                } elseif ( !( $frame instanceof PPFrame ) ) {
-                       wfDebug( __METHOD__ . " called using plain parameters instead of a PPFrame instance. Creating custom frame.\n" );
+                       wfDebug( __METHOD__ . " called using plain parameters instead of "
+                               . "a PPFrame instance. Creating custom frame.\n" );
                        $frame = $this->getPreprocessor()->newCustomFrame( $frame );
                }
 
@@ -3159,7 +3232,7 @@ class Parser {
        /**
         * Clean up argument array - refactored in 1.9 so parserfunctions can use it, too.
         *
-        * @param $args array
+        * @param array $args
         *
         * @return array
         */
@@ -3189,7 +3262,7 @@ class Parser {
         * Warn the user when a parser limitation is reached
         * Will warn at most once the user per limitation type
         *
-        * @param string $limitationType should be one of:
+        * @param string $limitationType Should be one of:
         *   'expensive-parserfunction' (corresponding messages:
         *       'expensive-parserfunction-warning',
         *       'expensive-parserfunction-category')
@@ -3205,8 +3278,8 @@ class Parser {
         *   'expansion-depth-exceeded' (corresponding messages:
         *       'expansion-depth-exceeded-warning',
         *       'expansion-depth-exceeded-category')
-        * @param int|null $current Current value
-        * @param int|null $max Maximum allowed, when an explicit limit has been
+        * @param string|int|null $current Current value
+        * @param string|int|null $max Maximum allowed, when an explicit limit has been
         *       exceeded, provide the values (optional)
         */
        function limitationWarn( $limitationType, $current = '', $max = '' ) {
@@ -3222,25 +3295,31 @@ class Parser {
         * replacing any variables or templates within the template.
         *
         * @param array $piece The parts of the template
-        *  $piece['title']: the title, i.e. the part before the |
-        *  $piece['parts']: the parameter array
-        *  $piece['lineStart']: whether the brace was at the start of a line
+        *   $piece['title']: the title, i.e. the part before the |
+        *   $piece['parts']: the parameter array
+        *   $piece['lineStart']: whether the brace was at the start of a line
         * @param PPFrame $frame The current frame, contains template arguments
-        * @throws MWException
+        * @throws Exception
         * @return string The text of the template
-        * @private
         */
-       function braceSubstitution( $piece, $frame ) {
+       public function braceSubstitution( $piece, $frame ) {
                wfProfileIn( __METHOD__ );
                wfProfileIn( __METHOD__ . '-setup' );
 
-               # Flags
-               $found = false;             # $text has been filled
-               $nowiki = false;            # wiki markup in $text should be escaped
-               $isHTML = false;            # $text is HTML, armour it against wikitext transformation
-               $forceRawInterwiki = false; # Force interwiki transclusion to be done in raw mode not rendered
-               $isChildObj = false;        # $text is a DOM node needing expansion in a child frame
-               $isLocalObj = false;        # $text is a DOM node needing expansion in the current frame
+               // Flags
+
+               // $text has been filled
+               $found = false;
+               // wiki markup in $text should be escaped
+               $nowiki = false;
+               // $text is HTML, armour it against wikitext transformation
+               $isHTML = false;
+               // Force interwiki transclusion to be done in raw mode not rendered
+               $forceRawInterwiki = false;
+               // $text is a DOM node needing expansion in a child frame
+               $isChildObj = false;
+               // $text is a DOM node needing expansion in the current frame
+               $isLocalObj = false;
 
                # Title object, where $text came from
                $title = false;
@@ -3255,7 +3334,8 @@ class Parser {
                $originalTitle = $part1;
 
                # $args is a list of argument nodes, starting from index 0, not including $part1
-               # @todo FIXME: If piece['parts'] is null then the call to getLength() below won't work b/c this $args isn't an object
+               # @todo FIXME: If piece['parts'] is null then the call to getLength()
+               # below won't work b/c this $args isn't an object
                $args = ( null == $piece['parts'] ) ? array() : $piece['parts'];
                wfProfileOut( __METHOD__ . '-setup' );
 
@@ -3395,7 +3475,8 @@ class Parser {
                                        // "uselang" will have no effect since the Language object
                                        // is forced to the one defined in ParserOptions.
                                        $pageArgs = array();
-                                       for ( $i = 0; $i < $args->getLength(); $i++ ) {
+                                       $argsLength = $args->getLength();
+                                       for ( $i = 0; $i < $argsLength; $i++ ) {
                                                $bits = $args->item( $i )->splitArg();
                                                if ( strval( $bits['index'] ) === '' ) {
                                                        $name = trim( $frame->expand( $bits['name'], PPFrame::STRIP_COMMENTS ) );
@@ -3528,7 +3609,8 @@ class Parser {
                                preg_replace( '/^:/', '', $originalTitle );
                                $text = "[[:$originalTitle]]";
                        }
-                       $text .= $this->insertStripItem( '<!-- WARNING: template omitted, post-expand include size too large -->' );
+                       $text .= $this->insertStripItem( '<!-- WARNING: template omitted, '
+                               . 'post-expand include size too large -->' );
                        $this->limitationWarn( 'post-expand-template-inclusion' );
                }
 
@@ -3555,9 +3637,10 @@ class Parser {
         *  nowiki: bool, wiki markup in $text should be escaped
         *
         * @since 1.21
-        * @param $frame PPFrame The current frame, contains template arguments
-        * @param $function string Function name
-        * @param $args array Arguments to the function
+        * @param PPFrame $frame The current frame, contains template arguments
+        * @param string $function Function name
+        * @param array $args Arguments to the function
+        * @throws MWException
         * @return array
         */
        public function callParserFunction( $frame, $function, array $args = array() ) {
@@ -3660,7 +3743,7 @@ class Parser {
         * Get the semi-parsed DOM representation of a template with a given title,
         * and its redirect destination title. Cached.
         *
-        * @param $title Title
+        * @param Title $title
         *
         * @return array
         */
@@ -3699,10 +3782,11 @@ class Parser {
        /**
         * Fetch the unparsed text of a template and register a reference to it.
         * @param Title $title
-        * @return Array ( string or false, Title )
+        * @return array ( string or false, Title )
         */
        function fetchTemplateAndTitle( $title ) {
-               $templateCb = $this->mOptions->getTemplateCallback(); # Defaults to Parser::statelessFetchTemplate()
+               // Defaults to Parser::statelessFetchTemplate()
+               $templateCb = $this->mOptions->getTemplateCallback();
                $stuff = call_user_func( $templateCb, $title, $this );
                $text = $stuff['text'];
                $finalTitle = isset( $stuff['finalTitle'] ) ? $stuff['finalTitle'] : $title;
@@ -3722,7 +3806,7 @@ class Parser {
        /**
         * Fetch the unparsed text of a template and register a reference to it.
         * @param Title $title
-        * @return mixed string or false
+        * @return string|bool
         */
        function fetchTemplate( $title ) {
                $rv = $this->fetchTemplateAndTitle( $title );
@@ -3734,7 +3818,7 @@ class Parser {
         * Can be overridden via ParserOptions::setTemplateCallback().
         *
         * @param Title $title
-        * @param Parser $parser
+        * @param bool|Parser $parser
         *
         * @return array
         */
@@ -3832,7 +3916,7 @@ class Parser {
         * If 'broken' is a key in $options then the file will appear as a broken thumbnail.
         * @param Title $title
         * @param array $options Array of options to RepoGroup::findFile
-        * @return Array ( File or false, Title of file )
+        * @return array ( File or false, Title of file )
         */
        function fetchFileAndTitle( $title, $options = array() ) {
                $file = $this->fetchFileNoRegister( $title, $options );
@@ -3857,7 +3941,7 @@ class Parser {
         *
         * @param Title $title
         * @param array $options Array of options to RepoGroup::findFile
-        * @return File or false
+        * @return File|bool
         */
        protected function fetchFileNoRegister( $title, $options = array() ) {
                if ( isset( $options['broken'] ) ) {
@@ -3873,8 +3957,8 @@ class Parser {
        /**
         * Transclude an interwiki link.
         *
-        * @param $title Title
-        * @param $action
+        * @param Title $title
+        * @param string $action
         *
         * @return string
         */
@@ -3894,8 +3978,8 @@ class Parser {
        }
 
        /**
-        * @param $url string
-        * @return Mixed|String
+        * @param string $url
+        * @return mixed|string
         */
        function fetchScaryTemplateMaybeFromCache( $url ) {
                global $wgTranscludeCacheExpiry;
@@ -3911,8 +3995,10 @@ class Parser {
                $status = $req->execute(); // Status object
                if ( $status->isOK() ) {
                        $text = $req->getContent();
-               } elseif ( $req->getStatus() != 200 ) { // Though we failed to fetch the content, this status is useless.
-                       return wfMessage( 'scarytranscludefailed-httpstatus', $url, $req->getStatus() /* HTTP status */ )->inContentLanguage()->text();
+               } elseif ( $req->getStatus() != 200 ) {
+                       // Though we failed to fetch the content, this status is useless.
+                       return wfMessage( 'scarytranscludefailed-httpstatus' )
+                               ->params( $url, $req->getStatus() /* HTTP status */ )->inContentLanguage()->text();
                } else {
                        return wfMessage( 'scarytranscludefailed', $url )->inContentLanguage()->text();
                }
@@ -3930,8 +4016,8 @@ class Parser {
         * Triple brace replacement -- used for template arguments
         * @private
         *
-        * @param $piece array
-        * @param $frame PPFrame
+        * @param array $piece
+        * @param PPFrame $frame
         *
         * @return array
         */
@@ -3985,7 +4071,7 @@ class Parser {
         *     attributes Optional associative array of parsed attributes
         *     inner      Contents of extension element
         *     noClose    Original text did not have a close tag
-        * @param $frame PPFrame
+        * @param PPFrame $frame
         *
         * @throws MWException
         * @return string
@@ -3994,7 +4080,8 @@ class Parser {
                $name = $frame->expand( $params['name'] );
                $attrText = !isset( $params['attr'] ) ? null : $frame->expand( $params['attr'] );
                $content = !isset( $params['inner'] ) ? null : $frame->expand( $params['inner'] );
-               $marker = "{$this->mUniqPrefix}-$name-" . sprintf( '%08X', $this->mMarkerIndex++ ) . self::MARKER_SUFFIX;
+               $marker = "{$this->mUniqPrefix}-$name-"
+                       . sprintf( '%08X', $this->mMarkerIndex++ ) . self::MARKER_SUFFIX;
 
                $isFunctionTag = isset( $this->mFunctionTagHooks[strtolower( $name )] ) &&
                        ( $this->ot['html'] || $this->ot['pre'] );
@@ -4071,7 +4158,7 @@ class Parser {
         *
         * @param string $type The type of expansion
         * @param int $size The size of the text
-        * @return bool false if this inclusion would take it over the maximum, true otherwise
+        * @return bool False if this inclusion would take it over the maximum, true otherwise
         */
        function incrementIncludeSize( $type, $size ) {
                if ( $this->mIncludeSizes[$type] + $size > $this->mOptions->getMaxIncludeSize() ) {
@@ -4085,7 +4172,7 @@ class Parser {
        /**
         * Increment the expensive function count
         *
-        * @return bool false if the limit has been exceeded
+        * @return bool False if the limit has been exceeded
         */
        function incrementExpensiveFunctionCount() {
                $this->mExpensiveFunctionCount++;
@@ -4096,7 +4183,7 @@ class Parser {
         * Strip double-underscore items like __NOGALLERY__ and __NOTOC__
         * Fills $this->mDoubleUnderscores, returns the modified text
         *
-        * @param $text string
+        * @param string $text
         *
         * @return string
         */
@@ -4126,7 +4213,9 @@ class Parser {
                if ( isset( $this->mDoubleUnderscores['notoc'] ) && !$this->mForceTocPosition ) {
                        $this->mShowToc = false;
                }
-               if ( isset( $this->mDoubleUnderscores['hiddencat'] ) && $this->mTitle->getNamespace() == NS_CATEGORY ) {
+               if ( isset( $this->mDoubleUnderscores['hiddencat'] )
+                       && $this->mTitle->getNamespace() == NS_CATEGORY
+               ) {
                        $this->addTrackingCategory( 'hidden-category-category' );
                }
                # (bug 8068) Allow control over whether robots index a page.
@@ -4198,9 +4287,9 @@ class Parser {
         * It loops through all headlines, collects the necessary data, then splits up the
         * string and re-inserts the newly formatted headlines.
         *
-        * @param $text String
-        * @param string $origText original, untouched wikitext
-        * @param $isMain Boolean
+        * @param string $text
+        * @param string $origText Original, untouched wikitext
+        * @param bool $isMain
         * @return mixed|string
         * @private
         */
@@ -4221,7 +4310,11 @@ class Parser {
                # Get all headlines for numbering them and adding funky stuff like [edit]
                # links - this is for later, but we need the number of headlines right now
                $matches = array();
-               $numMatches = preg_match_all( '/<H(?P<level>[1-6])(?P<attrib>.*?' . '>)\s*(?P<header>[\s\S]*?)\s*<\/H[1-6] *>/i', $text, $matches );
+               $numMatches = preg_match_all(
+                       '/<H(?P<level>[1-6])(?P<attrib>.*?' . '>)\s*(?P<header>[\s\S]*?)\s*<\/H[1-6] *>/i',
+                       $text,
+                       $matches
+               );
 
                # if there are fewer than 4 headlines in the article, do not show TOC
                # unless it's been explicitly enabled.
@@ -4370,7 +4463,10 @@ class Parser {
                        # We strip any parameter from accepted tags (second regex), except dir="rtl|ltr" from <span>,
                        # to allow setting directionality in toc items.
                        $tocline = preg_replace(
-                               array( '#<(?!/?(span|sup|sub|i|b)(?: [^>]*)?>).*?' . '>#', '#<(/?(?:span(?: dir="(?:rtl|ltr)")?|sup|sub|i|b))(?: .*?)?' . '>#' ),
+                               array(
+                                       '#<(?!/?(span|sup|sub|i|b)(?: [^>]*)?>).*?' . '>#',
+                                       '#<(/?(?:span(?: dir="(?:rtl|ltr)")?|sup|sub|i|b))(?: .*?)?' . '>#'
+                               ),
                                array( '', '<$1>' ),
                                $safeHeadline
                        );
@@ -4434,7 +4530,11 @@ class Parser {
                        # Don't number the heading if it is the only one (looks silly)
                        if ( count( $matches[3] ) > 1 && $this->mOptions->getNumberHeadings() ) {
                                # the two are different if the line contains a link
-                               $headline = Html::element( 'span', array( 'class' => 'mw-headline-number' ), $numbering ) . ' ' . $headline;
+                               $headline = Html::element(
+                                       'span',
+                                       array( 'class' => 'mw-headline-number' ),
+                                       $numbering
+                               ) . ' ' . $headline;
                        }
 
                        # Create the anchor for linking from the TOC to the section
@@ -4484,14 +4584,22 @@ class Parser {
                                        # that sections inside <includeonly> should be counted.
                                        $editlinkArgs = array( $titleText, "T-$sectionIndex"/*, null */ );
                                } else {
-                                       $editlinkArgs = array( $this->mTitle->getPrefixedText(), $sectionIndex, $headlineHint );
+                                       $editlinkArgs = array(
+                                               $this->mTitle->getPrefixedText(),
+                                               $sectionIndex,
+                                               $headlineHint
+                                       );
                                }
-                               // We use a bit of pesudo-xml for editsection markers. The language converter is run later on
-                               // Using a UNIQ style marker leads to the converter screwing up the tokens when it converts stuff
-                               // And trying to insert strip tags fails too. At this point all real inputted tags have already been escaped
-                               // so we don't have to worry about a user trying to input one of these markers directly.
-                               // We use a page and section attribute to stop the language converter from converting these important bits
-                               // of data, but put the headline hint inside a content block because the language converter is supposed to
+                               // We use a bit of pesudo-xml for editsection markers. The
+                               // language converter is run later on. Using a UNIQ style marker
+                               // leads to the converter screwing up the tokens when it
+                               // converts stuff. And trying to insert strip tags fails too. At
+                               // this point all real inputted tags have already been escaped,
+                               // so we don't have to worry about a user trying to input one of
+                               // these markers directly. We use a page and section attribute
+                               // to stop the language converter from converting these
+                               // 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] ) . '"';
@@ -4586,7 +4694,12 @@ class Parser {
         * @param bool $clearState Whether to clear the parser state first
         * @return string The altered wiki markup
         */
-       public function preSaveTransform( $text, Title $title, User $user, ParserOptions $options, $clearState = true ) {
+       public function preSaveTransform( $text, Title $title, User $user,
+               ParserOptions $options, $clearState = true
+       ) {
+               if ( $clearState ) {
+                       $magicScopeVariable = $this->lock();
+               }
                $this->startParse( $title, $options, self::OT_WIKI, $clearState );
                $this->setUser( $user );
 
@@ -4607,8 +4720,8 @@ class Parser {
        /**
         * Pre-save transform helper function
         *
-        * @param $text string
-        * @param $user User
+        * @param string $text
+        * @param User $user
         *
         * @return string
         */
@@ -4655,10 +4768,14 @@ class Parser {
                $tc = '[' . Title::legalChars() . ']';
                $nc = '[ _0-9A-Za-z\x80-\xff-]'; # Namespaces can use non-ascii!
 
-               $p1 = "/\[\[(:?$nc+:|:|)($tc+?)( ?\\($tc+\\))\\|]]/";                   # [[ns:page (context)|]]
-               $p4 = "/\[\[(:?$nc+:|:|)($tc+?)( ?($tc+))\\|]]/";                           # [[ns:page(context)|]] (double-width brackets, added in r40257)
-               $p3 = "/\[\[(:?$nc+:|:|)($tc+?)( ?\\($tc+\\)|)((?:, |,)$tc+|)\\|]]/";         # [[ns:page (context), context|]] (using either single or double-width comma)
-               $p2 = "/\[\[\\|($tc+)]]/";                                              # [[|page]] (reverse pipe trick: add context from page title)
+               // [[ns:page (context)|]]
+               $p1 = "/\[\[(:?$nc+:|:|)($tc+?)( ?\\($tc+\\))\\|]]/";
+               // [[ns:page(context)|]] (double-width brackets, added in r40257)
+               $p4 = "/\[\[(:?$nc+:|:|)($tc+?)( ?($tc+))\\|]]/";
+               // [[ns:page (context), context|]] (using either single or double-width comma)
+               $p3 = "/\[\[(:?$nc+:|:|)($tc+?)( ?\\($tc+\\)|)((?:, |,)$tc+|)\\|]]/";
+               // [[|page]] (reverse pipe trick: add context from page title)
+               $p2 = "/\[\[\\|($tc+)]]/";
 
                # try $p1 first, to turn "[[A, B (C)|]]" into "[[A, B (C)|A, B]]"
                $text = preg_replace( $p1, '[[\\1\\2\\3|\\2]]', $text );
@@ -4690,10 +4807,10 @@ class Parser {
         * Do not reuse this parser instance after calling getUserSig(),
         * as it may have changed if it's the $wgParser.
         *
-        * @param $user User
-        * @param string|bool $nickname nickname to use or false to use user's default nickname
-        * @param $fancySig Boolean|null whether the nicknname is the complete signature
-        *                  or null to use default value
+        * @param User $user
+        * @param string|bool $nickname Nickname to use or false to use user's default nickname
+        * @param bool|null $fancySig whether the nicknname is the complete signature
+        *    or null to use default value
         * @return string
         */
        function getUserSig( &$user, $nickname = false, $fancySig = null ) {
@@ -4735,14 +4852,15 @@ class Parser {
                $nickText = wfEscapeWikiText( $nickname );
                $msgName = $user->isAnon() ? 'signature-anon' : 'signature';
 
-               return wfMessage( $msgName, $userText, $nickText )->inContentLanguage()->title( $this->getTitle() )->text();
+               return wfMessage( $msgName, $userText, $nickText )->inContentLanguage()
+                       ->title( $this->getTitle() )->text();
        }
 
        /**
         * Check that the user's signature contains no bad XML
         *
-        * @param $text String
-        * @return mixed An expanded string, or false if invalid.
+        * @param string $text
+        * @return string|bool An expanded string, or false if invalid.
         */
        function validateSig( $text ) {
                return Xml::isWellFormedXmlFragment( $text ) ? $text : false;
@@ -4761,6 +4879,7 @@ class Parser {
        public function cleanSig( $text, $parsing = false ) {
                if ( !$parsing ) {
                        global $wgTitle;
+                       $magicScopeVariable = $this->lock();
                        $this->startParse( $wgTitle, new ParserOptions, self::OT_PREPROCESS, true );
                }
 
@@ -4803,22 +4922,26 @@ class Parser {
         * Set up some variables which are usually set up in parse()
         * so that an external function can call some class members with confidence
         *
-        * @param $title Title|null
-        * @param $options ParserOptions
-        * @param $outputType
-        * @param $clearState bool
+        * @param Title|null $title
+        * @param ParserOptions $options
+        * @param int $outputType
+        * @param bool $clearState
         */
-       public function startExternalParse( Title $title = null, ParserOptions $options, $outputType, $clearState = true ) {
+       public function startExternalParse( Title $title = null, ParserOptions $options,
+               $outputType, $clearState = true
+       ) {
                $this->startParse( $title, $options, $outputType, $clearState );
        }
 
        /**
-        * @param $title Title|null
-        * @param $options ParserOptions
-        * @param $outputType
-        * @param $clearState bool
+        * @param Title|null $title
+        * @param ParserOptions $options
+        * @param int $outputType
+        * @param bool $clearState
         */
-       private function startParse( Title $title = null, ParserOptions $options, $outputType, $clearState = true ) {
+       private function startParse( Title $title = null, ParserOptions $options,
+               $outputType, $clearState = true
+       ) {
                $this->setTitle( $title );
                $this->mOptions = $options;
                $this->setOutputType( $outputType );
@@ -4973,7 +5096,7 @@ class Parser {
         *     about the methods available in PPFrame and PPNode.
         *
         * @throws MWException
-        * @return string|callback The old callback function for this name, if any
+        * @return string|callable The old callback function for this name, if any
         */
        public function setFunctionHook( $id, $callback, $flags = 0 ) {
                global $wgContLang;
@@ -5011,7 +5134,7 @@ class Parser {
        /**
         * Get all registered function hook identifiers
         *
-        * @return Array
+        * @return array
         */
        function getFunctionHooks() {
                return array_keys( $this->mFunctionHooks );
@@ -5021,9 +5144,9 @@ class Parser {
         * Create a tag function, e.g. "<test>some stuff</test>".
         * Unlike tag hooks, tag functions are parsed at preprocessor level.
         * Unlike parser functions, their content is not preprocessed.
-        * @param $tag
-        * @param $callback
-        * @param $flags
+        * @param string $tag
+        * @param callable $callback
+        * @param int $flags
         * @throws MWException
         * @return null
         */
@@ -5048,10 +5171,10 @@ class Parser {
         * Replace "<!--LINK-->" link placeholders with actual links, in the buffer
         * Placeholders created in Skin::makeLinkObj()
         *
-        * @param $text string
-        * @param $options int
+        * @param string $text
+        * @param int $options
         *
-        * @return array of link CSS classes, indexed by PDBK.
+        * @return array Array of link CSS classes, indexed by PDBK.
         */
        function replaceLinkHolders( &$text, $options = 0 ) {
                return $this->mLinkHolders->replace( $text );
@@ -5061,8 +5184,8 @@ class Parser {
         * Replace "<!--LINK-->" link placeholders with plain text of links
         * (not HTML-formatted).
         *
-        * @param $text String
-        * @return String
+        * @param string $text
+        * @return string
         */
        function replaceLinkHoldersText( $text ) {
                return $this->mLinkHolders->replaceText( $text );
@@ -5238,7 +5361,7 @@ class Parser {
        }
 
        /**
-        * @param $handler
+        * @param string $handler
         * @return array
         */
        function getImageParams( $handler ) {
@@ -5284,9 +5407,9 @@ class Parser {
        /**
         * Parse image options text and use it to make an image
         *
-        * @param $title Title
-        * @param $options String
-        * @param $holders LinkHolderArray|bool
+        * @param Title $title
+        * @param string $options
+        * @param LinkHolderArray|bool $holders
         * @return string HTML
         */
        function makeImage( $title, $options, $holders = false ) {
@@ -5501,9 +5624,9 @@ class Parser {
        }
 
        /**
-        * @param $caption
-        * @param $holders LinkHolderArray
-        * @return mixed|String
+        * @param string $caption
+        * @param LinkHolderArray|bool $holders
+        * @return mixed|string
         */
        protected function stripAltText( $caption, $holders ) {
                # Strip bad stuff out of the title (tooltip).  We can't just use
@@ -5542,9 +5665,9 @@ class Parser {
         * Callback from the Sanitizer for expanding items found in HTML attribute
         * values, so they can be safely tested and escaped.
         *
-        * @param $text String
-        * @param $frame PPFrame
-        * @return String
+        * @param string $text
+        * @param bool|PPFrame $frame
+        * @return string
         */
        function attributeStripCallback( &$text, $frame = false ) {
                $text = $this->replaceVariables( $text, $frame );
@@ -5558,7 +5681,11 @@ class Parser {
         * @return array
         */
        function getTags() {
-               return array_merge( array_keys( $this->mTransparentTagHooks ), array_keys( $this->mTagHooks ), array_keys( $this->mFunctionTagHooks ) );
+               return array_merge(
+                       array_keys( $this->mTransparentTagHooks ),
+                       array_keys( $this->mTagHooks ),
+                       array_keys( $this->mFunctionTagHooks )
+               );
        }
 
        /**
@@ -5567,7 +5694,7 @@ class Parser {
         * Transparent tag hooks are like regular XML-style tag hooks, except they
         * operate late in the transformation sequence, on HTML instead of wikitext.
         *
-        * @param $text string
+        * @param string $text
         *
         * @return string
         */
@@ -5581,7 +5708,10 @@ class Parser {
                        list( $element, $content, $params, $tag ) = $data;
                        $tagName = strtolower( $element );
                        if ( isset( $this->mTransparentTagHooks[$tagName] ) ) {
-                               $output = call_user_func_array( $this->mTransparentTagHooks[$tagName], array( $content, $params, $this ) );
+                               $output = call_user_func_array(
+                                       $this->mTransparentTagHooks[$tagName],
+                                       array( $content, $params, $this )
+                               );
                        } else {
                                $output = $tag;
                        }
@@ -5597,7 +5727,7 @@ class Parser {
         * External callers should use the getSection and replaceSection methods.
         *
         * @param string $text Page wikitext
-        * @param string $section a section identifier string of the form:
+        * @param string $section A section identifier string of the form:
         *   "<flag1> - <flag2> - ... - <section number>"
         *
         * Currently the only recognised flag is "T", which means the target section number
@@ -5621,6 +5751,8 @@ class Parser {
         */
        private function extractSections( $text, $section, $mode, $newText = '' ) {
                global $wgTitle; # not generally used but removes an ugly failure mode
+
+               $magicScopeVariable = $this->lock();
                $this->startParse( $wgTitle, new ParserOptions, self::OT_PLAIN, true );
                $outText = '';
                $frame = $this->getPreprocessor()->newFrame();
@@ -5735,10 +5867,10 @@ class Parser {
         *
         * If a section contains subsections, these are also returned.
         *
-        * @param string $text text to look in
-        * @param string $section section identifier
-        * @param string $deftext default to return if section is not found
-        * @return string text of the requested section
+        * @param string $text Text to look in
+        * @param string $section Section identifier
+        * @param string $deftext Default to return if section is not found
+        * @return string Text of the requested section
         */
        public function getSection( $text, $section, $deftext = '' ) {
                return $this->extractSections( $text, $section, "get", $deftext );
@@ -5770,7 +5902,7 @@ class Parser {
        /**
         * Get the revision object for $this->mRevisionId
         *
-        * @return Revision|null either a Revision object or null
+        * @return Revision|null Either a Revision object or null
         * @since 1.23 (public since 1.23)
         */
        public function getRevisionObject() {
@@ -5788,6 +5920,7 @@ class Parser {
        /**
         * Get the timestamp associated with the current revision, adjusted for
         * the default server-local timestamp
+        * @return string
         */
        function getRevisionTimestamp() {
                if ( is_null( $this->mRevisionTimestamp ) ) {
@@ -5834,7 +5967,7 @@ class Parser {
        /**
         * Get the size of the revision
         *
-        * @return int|null revision size
+        * @return int|null Revision size
         */
        function getRevisionSize() {
                if ( is_null( $this->mRevisionSize ) ) {
@@ -5884,7 +6017,7 @@ class Parser {
         * Accessor for $mDefaultSort
         * Unlike getDefaultSort(), will return false if none is set
         *
-        * @return string or false
+        * @return string|bool
         */
        public function getCustomDefaultSort() {
                return $this->mDefaultSort;
@@ -5895,7 +6028,7 @@ class Parser {
         * presumably extracted from a heading, for example "Header" from
         * "== Header ==".
         *
-        * @param $text string
+        * @param string $text
         *
         * @return string
         */
@@ -5931,7 +6064,7 @@ class Parser {
         * to create valid section anchors by mimicing the output of the
         * parser when headings are parsed.
         *
-        * @param string $text text string to be stripped of wikitext
+        * @param string $text Text string to be stripped of wikitext
         * for use in a Section anchor
         * @return string Filtered text string
         */
@@ -5957,14 +6090,15 @@ class Parser {
        /**
         * strip/replaceVariables/unstrip for preprocessor regression testing
         *
-        * @param $text string
-        * @param $title Title
-        * @param $options ParserOptions
-        * @param $outputType int
+        * @param string $text
+        * @param Title $title
+        * @param ParserOptions $options
+        * @param int $outputType
         *
         * @return string
         */
        function testSrvus( $text, Title $title, ParserOptions $options, $outputType = self::OT_HTML ) {
+               $magicScopeVariable = $this->lock();
                $this->startParse( $title, $options, $outputType, true );
 
                $text = $this->replaceVariables( $text );
@@ -5974,9 +6108,9 @@ class Parser {
        }
 
        /**
-        * @param $text string
-        * @param $title Title
-        * @param $options ParserOptions
+        * @param string $text
+        * @param Title $title
+        * @param ParserOptions $options
         * @return string
         */
        function testPst( $text, Title $title, ParserOptions $options ) {
@@ -5984,9 +6118,9 @@ class Parser {
        }
 
        /**
-        * @param $text
-        * @param $title Title
-        * @param $options ParserOptions
+        * @param string $text
+        * @param Title $title
+        * @param ParserOptions $options
         * @return string
         */
        function testPreprocess( $text, Title $title, ParserOptions $options ) {
@@ -6004,8 +6138,8 @@ class Parser {
         * two strings will be replaced with the value returned by the callback in
         * each case.
         *
-        * @param $s string
-        * @param $callback
+        * @param string $s
+        * @param callable $callback
         *
         * @return string
         */
@@ -6036,7 +6170,7 @@ class Parser {
        /**
         * Remove any strip markers found in the given text.
         *
-        * @param $text Input string
+        * @param string $text Input string
         * @return string
         */
        function killMarkers( $text ) {
@@ -6055,7 +6189,7 @@ class Parser {
         * unserializeHalfParsedText(). The text can then be safely incorporated into
         * the return value of a parser hook.
         *
-        * @param $text string
+        * @param string $text
         *
         * @return array
         */
@@ -6084,7 +6218,7 @@ class Parser {
         *
         * @param array $data Serialized data
         * @throws MWException
-        * @return String
+        * @return string
         */
        function unserializeHalfParsedText( $data ) {
                if ( !isset( $data['version'] ) || $data['version'] != self::HALF_PARSED_VERSION ) {
@@ -6107,7 +6241,7 @@ class Parser {
         * serializeHalfParsedText(), is compatible with the current version of the
         * parser.
         *
-        * @param $data Array
+        * @param array $data
         *
         * @return bool
         */
@@ -6118,7 +6252,7 @@ class Parser {
        /**
         * Parsed a width param of imagelink like 300px or 200x300px
         *
-        * @param $value String
+        * @param string $value
         *
         * @return array
         * @since 1.20
@@ -6142,4 +6276,49 @@ class Parser {
                }
                return $parsedWidthParam;
        }
+
+       /**
+        * Lock the current instance of the parser.
+        *
+        * This is meant to stop someone from calling the parser
+        * recursively and messing up all the strip state.
+        *
+        * @throws MWException If parser is in a parse
+        * @return ScopedCallback The lock will be released once the return value goes out of scope.
+        */
+       protected function lock() {
+               if ( $this->mInParse ) {
+                       throw new MWException( "Parser state cleared while parsing. "
+                               . "Did you call Parser::parse recursively?" );
+               }
+               $this->mInParse = true;
+
+               $that = $this;
+               $recursiveCheck = new ScopedCallback( function() use ( $that ) {
+                       $that->mInParse = false;
+               } );
+
+               return $recursiveCheck;
+       }
+
+       /**
+        * Strip outer <p></p> tag from the HTML source of a single paragraph.
+        *
+        * Returns original HTML if the <p/> tag has any attributes, if there's no wrapping <p/> tag,
+        * or if there is more than one <p/> tag in the input HTML.
+        *
+        * @param string $html
+        * @return string
+        * @since 1.24
+        */
+       public static function stripOuterParagraph( $html ) {
+               $m = array();
+               if ( preg_match( '/^<p>(.*)\n?<\/p>\n?$/sU', $html, $m ) ) {
+                       if ( strpos( $m[1], '</p>' ) === false ) {
+                               $html = $m[1];
+                       }
+               }
+
+               return $html;
+       }
 }
index ff74f2a..33f0f96 100644 (file)
@@ -26,6 +26,7 @@
  * @todo document
  */
 class ParserCache {
+       /** @var MWMemcached  */
        private $mMemc;
        /**
         * Get an instance of this object
@@ -45,7 +46,7 @@ class ParserCache {
         * Setup a cache pathway with a given back-end storage mechanism.
         * May be a memcached client or a BagOStuff derivative.
         *
-        * @param $memCached Object
+        * @param MWMemcached $memCached
         * @throws MWException
         */
        protected function __construct( $memCached ) {
@@ -56,8 +57,8 @@ class ParserCache {
        }
 
        /**
-        * @param $article Article
-        * @param $hash string
+        * @param Article $article
+        * @param string $hash
         * @return mixed|string
         */
        protected function getParserOutputKey( $article, $hash ) {
@@ -72,7 +73,7 @@ class ParserCache {
        }
 
        /**
-        * @param $article Article
+        * @param Article $article
         * @return mixed|string
         */
        protected function getOptionsKey( $article ) {
@@ -90,8 +91,8 @@ class ParserCache {
         * English preferences. That's why we take into account *all* user
         * options. (r70809 CR)
         *
-        * @param $article Article
-        * @param $popts ParserOptions
+        * @param Article $article
+        * @param ParserOptions $popts
         * @return string
         */
        function getETag( $article, $popts ) {
@@ -102,8 +103,8 @@ class ParserCache {
 
        /**
         * Retrieve the ParserOutput from ParserCache, even if it's outdated.
-        * @param $article Article
-        * @param $popts ParserOptions
+        * @param Article $article
+        * @param ParserOptions $popts
         * @return ParserOutput|bool False on failure
         */
        public function getDirty( $article, $popts ) {
@@ -144,7 +145,8 @@ class ParserCache {
                        if ( !$useOutdated && $optionsKey->expired( $article->getTouched() ) ) {
                                wfIncrStats( "pcache_miss_expired" );
                                $cacheTime = $optionsKey->getCacheTime();
-                               wfDebug( "Parser options key expired, touched " . $article->getTouched() . ", epoch $wgCacheEpoch, cached $cacheTime\n" );
+                               wfDebug( "Parser options key expired, touched " . $article->getTouched()
+                                       . ", epoch $wgCacheEpoch, cached $cacheTime\n" );
                                return false;
                        } elseif ( $optionsKey->isDifferentRevision( $article->getLatest() ) ) {
                                wfIncrStats( "pcache_miss_revid" );
@@ -164,7 +166,10 @@ class ParserCache {
                        $usedOptions = ParserOptions::legacyOptions();
                }
 
-               return $this->getParserOutputKey( $article, $popts->optionsHash( $usedOptions, $article->getTitle() ) );
+               return $this->getParserOutputKey(
+                       $article,
+                       $popts->optionsHash( $usedOptions, $article->getTitle() )
+               );
        }
 
        /**
@@ -215,7 +220,8 @@ class ParserCache {
                if ( !$useOutdated && $value->expired( $touched ) ) {
                        wfIncrStats( "pcache_miss_expired" );
                        $cacheTime = $value->getCacheTime();
-                       wfDebug( "ParserOutput key expired, touched $touched, epoch $wgCacheEpoch, cached $cacheTime\n" );
+                       wfDebug( "ParserOutput key expired, touched $touched, "
+                               . "epoch $wgCacheEpoch, cached $cacheTime\n" );
                        $value = false;
                } elseif ( $value->isDifferentRevision( $article->getLatest() ) ) {
                        wfIncrStats( "pcache_miss_revid" );
index 21403b4..fa73cf2 100644 (file)
@@ -24,7 +24,8 @@
 /**
  * \brief Set options of the Parser
  *
- * All member variables are supposed to be private in theory, although in practise this is not the case.
+ * All member variables are supposed to be private in theory, although in
+ * practise this is not the case.
  *
  * @ingroup Parser
  */
@@ -210,42 +211,134 @@ class ParserOptions {
         */
        protected $onAccessCallback = null;
 
-       function getInterwikiMagic()                { return $this->mInterwikiMagic; }
-       function getAllowExternalImages()           { return $this->mAllowExternalImages; }
-       function getAllowExternalImagesFrom()       { return $this->mAllowExternalImagesFrom; }
-       function getEnableImageWhitelist()          { return $this->mEnableImageWhitelist; }
-       function getEditSection()                   { return $this->mEditSection; }
-       function getNumberHeadings()                { $this->optionUsed( 'numberheadings' );
-                                                                                                 return $this->mNumberHeadings; }
-       function getAllowSpecialInclusion()         { return $this->mAllowSpecialInclusion; }
-       function getTidy()                          { return $this->mTidy; }
-       function getInterfaceMessage()              { return $this->mInterfaceMessage; }
-       function getTargetLanguage()                { return $this->mTargetLanguage; }
-       function getMaxIncludeSize()                { return $this->mMaxIncludeSize; }
-       function getMaxPPNodeCount()                { return $this->mMaxPPNodeCount; }
-       function getMaxGeneratedPPNodeCount()       { return $this->mMaxGeneratedPPNodeCount; }
-       function getMaxPPExpandDepth()              { return $this->mMaxPPExpandDepth; }
-       function getMaxTemplateDepth()              { return $this->mMaxTemplateDepth; }
+       function getInterwikiMagic() {
+               return $this->mInterwikiMagic;
+       }
+
+       function getAllowExternalImages() {
+               return $this->mAllowExternalImages;
+       }
+
+       function getAllowExternalImagesFrom() {
+               return $this->mAllowExternalImagesFrom;
+       }
+
+       function getEnableImageWhitelist() {
+               return $this->mEnableImageWhitelist;
+       }
+
+       function getEditSection() {
+               return $this->mEditSection;
+       }
+
+       function getNumberHeadings() {
+               $this->optionUsed( 'numberheadings' );
+
+               return $this->mNumberHeadings;
+       }
+
+       function getAllowSpecialInclusion() {
+               return $this->mAllowSpecialInclusion;
+       }
+
+       function getTidy() {
+               return $this->mTidy;
+       }
+
+       function getInterfaceMessage() {
+               return $this->mInterfaceMessage;
+       }
+
+       function getTargetLanguage() {
+               return $this->mTargetLanguage;
+       }
+
+       function getMaxIncludeSize() {
+               return $this->mMaxIncludeSize;
+       }
+
+       function getMaxPPNodeCount() {
+               return $this->mMaxPPNodeCount;
+       }
+
+       function getMaxGeneratedPPNodeCount() {
+               return $this->mMaxGeneratedPPNodeCount;
+       }
+
+       function getMaxPPExpandDepth() {
+               return $this->mMaxPPExpandDepth;
+       }
+
+       function getMaxTemplateDepth() {
+               return $this->mMaxTemplateDepth;
+       }
+
        /* @since 1.20 */
-       function getExpensiveParserFunctionLimit()  { return $this->mExpensiveParserFunctionLimit; }
-       function getRemoveComments()                { return $this->mRemoveComments; }
-       function getTemplateCallback()              { return $this->mTemplateCallback; }
-       function getEnableLimitReport()             { return $this->mEnableLimitReport; }
-       function getCleanSignatures()               { return $this->mCleanSignatures; }
-       function getExternalLinkTarget()            { return $this->mExternalLinkTarget; }
-       function getDisableContentConversion()      { return $this->mDisableContentConversion; }
-       function getDisableTitleConversion()        { return $this->mDisableTitleConversion; }
-       function getThumbSize()                     { $this->optionUsed( 'thumbsize' );
-                                                                                                 return $this->mThumbSize; }
-       function getStubThreshold()                 { $this->optionUsed( 'stubthreshold' );
-                                                                                                 return $this->mStubThreshold; }
-
-       function getIsPreview()                     { return $this->mIsPreview; }
-       function getIsSectionPreview()              { return $this->mIsSectionPreview; }
-       function getIsPrintable()                   { $this->optionUsed( 'printable' );
-                                                                                                 return $this->mIsPrintable; }
-       function getUser()                          { return $this->mUser; }
-       function getPreSaveTransform()              { return $this->mPreSaveTransform; }
+       function getExpensiveParserFunctionLimit() {
+               return $this->mExpensiveParserFunctionLimit;
+       }
+
+       function getRemoveComments() {
+               return $this->mRemoveComments;
+       }
+
+       function getTemplateCallback() {
+               return $this->mTemplateCallback;
+       }
+
+       function getEnableLimitReport() {
+               return $this->mEnableLimitReport;
+       }
+
+       function getCleanSignatures() {
+               return $this->mCleanSignatures;
+       }
+
+       function getExternalLinkTarget() {
+               return $this->mExternalLinkTarget;
+       }
+
+       function getDisableContentConversion() {
+               return $this->mDisableContentConversion;
+       }
+
+       function getDisableTitleConversion() {
+               return $this->mDisableTitleConversion;
+       }
+
+       function getThumbSize() {
+               $this->optionUsed( 'thumbsize' );
+
+               return $this->mThumbSize;
+       }
+
+       function getStubThreshold() {
+               $this->optionUsed( 'stubthreshold' );
+
+               return $this->mStubThreshold;
+       }
+
+       function getIsPreview() {
+               return $this->mIsPreview;
+       }
+
+       function getIsSectionPreview() {
+               return $this->mIsSectionPreview;
+       }
+
+       function getIsPrintable() {
+               $this->optionUsed( 'printable' );
+
+               return $this->mIsPrintable;
+       }
+
+       function getUser() {
+               return $this->mUser;
+       }
+
+       function getPreSaveTransform() {
+               return $this->mPreSaveTransform;
+       }
 
        function getDateFormat() {
                $this->optionUsed( 'dateformat' );
@@ -275,7 +368,7 @@ class ParserOptions {
         *
         * {{int: }} uses this which used to produce inconsistent link tables (bug 14404).
         *
-        * @return Language object
+        * @return Language
         * @since 1.19
         */
        function getUserLangObj() {
@@ -286,54 +379,146 @@ class ParserOptions {
        /**
         * Same as getUserLangObj() but returns a string instead.
         *
-        * @return String Language code
+        * @return string Language code
         * @since 1.17
         */
        function getUserLang() {
                return $this->getUserLangObj()->getCode();
        }
 
-       function setInterwikiMagic( $x )            { return wfSetVar( $this->mInterwikiMagic, $x ); }
-       function setAllowExternalImages( $x )       { return wfSetVar( $this->mAllowExternalImages, $x ); }
-       function setAllowExternalImagesFrom( $x )   { return wfSetVar( $this->mAllowExternalImagesFrom, $x ); }
-       function setEnableImageWhitelist( $x )      { return wfSetVar( $this->mEnableImageWhitelist, $x ); }
-       function setDateFormat( $x )                { return wfSetVar( $this->mDateFormat, $x ); }
-       function setEditSection( $x )               { return wfSetVar( $this->mEditSection, $x ); }
-       function setNumberHeadings( $x )            { return wfSetVar( $this->mNumberHeadings, $x ); }
-       function setAllowSpecialInclusion( $x )     { return wfSetVar( $this->mAllowSpecialInclusion, $x ); }
-       function setTidy( $x )                      { return wfSetVar( $this->mTidy, $x ); }
+       function setInterwikiMagic( $x ) {
+               return wfSetVar( $this->mInterwikiMagic, $x );
+       }
+
+       function setAllowExternalImages( $x ) {
+               return wfSetVar( $this->mAllowExternalImages, $x );
+       }
+
+       function setAllowExternalImagesFrom( $x ) {
+               return wfSetVar( $this->mAllowExternalImagesFrom, $x );
+       }
+
+       function setEnableImageWhitelist( $x ) {
+               return wfSetVar( $this->mEnableImageWhitelist, $x );
+       }
+
+       function setDateFormat( $x ) {
+               return wfSetVar( $this->mDateFormat, $x );
+       }
+
+       function setEditSection( $x ) {
+               return wfSetVar( $this->mEditSection, $x );
+       }
+
+       function setNumberHeadings( $x ) {
+               return wfSetVar( $this->mNumberHeadings, $x );
+       }
+
+       function setAllowSpecialInclusion( $x ) {
+               return wfSetVar( $this->mAllowSpecialInclusion, $x );
+       }
+
+       function setTidy( $x ) {
+               return wfSetVar( $this->mTidy, $x );
+       }
 
        /** @deprecated since 1.19 */
-       function setSkin( $x )                      { wfDeprecated( __METHOD__, '1.19' ); }
-       function setInterfaceMessage( $x )          { return wfSetVar( $this->mInterfaceMessage, $x ); }
-       function setTargetLanguage( $x )            { return wfSetVar( $this->mTargetLanguage, $x, true ); }
-       function setMaxIncludeSize( $x )            { return wfSetVar( $this->mMaxIncludeSize, $x ); }
-       function setMaxPPNodeCount( $x )            { return wfSetVar( $this->mMaxPPNodeCount, $x ); }
-       function setMaxGeneratedPPNodeCount( $x )   { return wfSetVar( $this->mMaxGeneratedPPNodeCount, $x ); }
-       function setMaxTemplateDepth( $x )          { return wfSetVar( $this->mMaxTemplateDepth, $x ); }
+       function setSkin( $x ) {
+               wfDeprecated( __METHOD__, '1.19' );
+       }
+
+       function setInterfaceMessage( $x ) {
+               return wfSetVar( $this->mInterfaceMessage, $x );
+       }
+
+       function setTargetLanguage( $x ) {
+               return wfSetVar( $this->mTargetLanguage, $x, true );
+       }
+
+       function setMaxIncludeSize( $x ) {
+               return wfSetVar( $this->mMaxIncludeSize, $x );
+       }
+
+       function setMaxPPNodeCount( $x ) {
+               return wfSetVar( $this->mMaxPPNodeCount, $x );
+       }
+
+       function setMaxGeneratedPPNodeCount( $x ) {
+               return wfSetVar( $this->mMaxGeneratedPPNodeCount, $x );
+       }
+
+       function setMaxTemplateDepth( $x ) {
+               return wfSetVar( $this->mMaxTemplateDepth, $x );
+       }
+
        /* @since 1.20 */
-       function setExpensiveParserFunctionLimit( $x ) { return wfSetVar( $this->mExpensiveParserFunctionLimit, $x ); }
-       function setRemoveComments( $x )            { return wfSetVar( $this->mRemoveComments, $x ); }
-       function setTemplateCallback( $x )          { return wfSetVar( $this->mTemplateCallback, $x ); }
-       function enableLimitReport( $x = true )     { return wfSetVar( $this->mEnableLimitReport, $x ); }
-       function setTimestamp( $x )                 { return wfSetVar( $this->mTimestamp, $x ); }
-       function setCleanSignatures( $x )           { return wfSetVar( $this->mCleanSignatures, $x ); }
-       function setExternalLinkTarget( $x )        { return wfSetVar( $this->mExternalLinkTarget, $x ); }
-       function disableContentConversion( $x = true ) { return wfSetVar( $this->mDisableContentConversion, $x ); }
-       function disableTitleConversion( $x = true ) { return wfSetVar( $this->mDisableTitleConversion, $x ); }
-       function setUserLang( $x )                  {
+       function setExpensiveParserFunctionLimit( $x ) {
+               return wfSetVar( $this->mExpensiveParserFunctionLimit, $x );
+       }
+
+       function setRemoveComments( $x ) {
+               return wfSetVar( $this->mRemoveComments, $x );
+       }
+
+       function setTemplateCallback( $x ) {
+               return wfSetVar( $this->mTemplateCallback, $x );
+       }
+
+       function enableLimitReport( $x = true ) {
+               return wfSetVar( $this->mEnableLimitReport, $x );
+       }
+
+       function setTimestamp( $x ) {
+               return wfSetVar( $this->mTimestamp, $x );
+       }
+
+       function setCleanSignatures( $x ) {
+               return wfSetVar( $this->mCleanSignatures, $x );
+       }
+
+       function setExternalLinkTarget( $x ) {
+               return wfSetVar( $this->mExternalLinkTarget, $x );
+       }
+
+       function disableContentConversion( $x = true ) {
+               return wfSetVar( $this->mDisableContentConversion, $x );
+       }
+
+       function disableTitleConversion( $x = true ) {
+               return wfSetVar( $this->mDisableTitleConversion, $x );
+       }
+
+       function setUserLang( $x ) {
                if ( is_string( $x ) ) {
                        $x = Language::factory( $x );
                }
+
                return wfSetVar( $this->mUserLang, $x );
        }
-       function setThumbSize( $x )                 { return wfSetVar( $this->mThumbSize, $x ); }
-       function setStubThreshold( $x )             { return wfSetVar( $this->mStubThreshold, $x ); }
-       function setPreSaveTransform( $x )          { return wfSetVar( $this->mPreSaveTransform, $x ); }
 
-       function setIsPreview( $x )                 { return wfSetVar( $this->mIsPreview, $x ); }
-       function setIsSectionPreview( $x )          { return wfSetVar( $this->mIsSectionPreview, $x ); }
-       function setIsPrintable( $x )               { return wfSetVar( $this->mIsPrintable, $x ); }
+       function setThumbSize( $x ) {
+               return wfSetVar( $this->mThumbSize, $x );
+       }
+
+       function setStubThreshold( $x ) {
+               return wfSetVar( $this->mStubThreshold, $x );
+       }
+
+       function setPreSaveTransform( $x ) {
+               return wfSetVar( $this->mPreSaveTransform, $x );
+       }
+
+       function setIsPreview( $x ) {
+               return wfSetVar( $this->mIsPreview, $x );
+       }
+
+       function setIsSectionPreview( $x ) {
+               return wfSetVar( $this->mIsSectionPreview, $x );
+       }
+
+       function setIsPrintable( $x ) {
+               return wfSetVar( $this->mIsPrintable, $x );
+       }
 
        /**
         * Extra key that should be present in the parser cache key.
@@ -344,8 +529,8 @@ class ParserOptions {
 
        /**
         * Constructor
-        * @param $user User object
-        * @param $lang Language object
+        * @param User $user
+        * @param Language $lang
         */
        function __construct( $user = null, $lang = null ) {
                if ( $user === null ) {
@@ -370,8 +555,8 @@ class ParserOptions {
         * Get a ParserOptions object from a given user.
         * Language will be taken from $wgLang.
         *
-        * @param $user User object
-        * @return ParserOptions object
+        * @param User $user
+        * @return ParserOptions
         */
        public static function newFromUser( $user ) {
                return new ParserOptions( $user );
@@ -380,9 +565,9 @@ class ParserOptions {
        /**
         * Get a ParserOptions object from a given user and language
         *
-        * @param $user User object
-        * @param $lang Language object
-        * @return ParserOptions object
+        * @param User $user
+        * @param Language $lang
+        * @return ParserOptions
         */
        public static function newFromUserAndLang( User $user, Language $lang ) {
                return new ParserOptions( $user, $lang );
@@ -391,8 +576,8 @@ class ParserOptions {
        /**
         * Get a ParserOptions object from a IContextSource object
         *
-        * @param $context IContextSource object
-        * @return ParserOptions object
+        * @param IContextSource $context
+        * @return ParserOptions
         */
        public static function newFromContext( IContextSource $context ) {
                return new ParserOptions( $context->getUser(), $context->getLanguage() );
@@ -401,8 +586,8 @@ class ParserOptions {
        /**
         * Get user options
         *
-        * @param $user User object
-        * @param $lang Language object
+        * @param User $user
+        * @param Language $lang
         */
        private function initialiseFromUser( $user, $lang ) {
                global $wgInterwikiMagic, $wgAllowExternalImages,
@@ -441,6 +626,7 @@ class ParserOptions {
        /**
         * Registers a callback for tracking which ParserOptions which are used.
         * This is a private API with the parser.
+        * @param callable $callback
         */
        function registerWatcher( $callback ) {
                $this->onAccessCallback = $callback;
@@ -448,7 +634,7 @@ class ParserOptions {
 
        /**
         * Called when an option is accessed.
-        * @param string $optionName name of the option
+        * @param string $optionName Name of the option
         */
        public function optionUsed( $optionName ) {
                if ( $this->onAccessCallback ) {
@@ -463,7 +649,14 @@ class ParserOptions {
         * @return array
         */
        public static function legacyOptions() {
-               return array( 'stubthreshold', 'numberheadings', 'userlang', 'thumbsize', 'editsection', 'printable' );
+               return array(
+                       'stubthreshold',
+                       'numberheadings',
+                       'userlang',
+                       'thumbsize',
+                       'editsection',
+                       'printable'
+               );
        }
 
        /**
index d1e3e58..931c088 100644 (file)
@@ -57,7 +57,8 @@ class ParserOutput extends CacheTime {
                private $mLimitReportData = array(); # Parser limit report data
                private $mParseStartTime = array(); # Timestamps for getTimeSinceStart()
 
-       const EDITSECTION_REGEX = '#<(?:mw:)?editsection page="(.*?)" section="(.*?)"(?:/>|>(.*?)(</(?:mw:)?editsection>))#';
+       const EDITSECTION_REGEX =
+               '#<(?:mw:)?editsection page="(.*?)" section="(.*?)"(?:/>|>(.*?)(</(?:mw:)?editsection>))#';
 
        function __construct( $text = '', $languageLinks = array(), $categoryLinks = array(),
                $containsOldMagic = false, $titletext = ''
@@ -96,7 +97,7 @@ class ParserOutput extends CacheTime {
        /**
         * callback used by getText to replace editsection tokens
         * @private
-        * @param $m
+        * @param array $m
         * @throws MWException
         * @return mixed
         */
@@ -116,50 +117,166 @@ class ParserOutput extends CacheTime {
                return call_user_func_array( array( $skin, 'doEditSectionLink' ), $args );
        }
 
-       function &getLanguageLinks()         { return $this->mLanguageLinks; }
-       function getInterwikiLinks()         { return $this->mInterwikiLinks; }
-       function getCategoryLinks()          { return array_keys( $this->mCategories ); }
-       function &getCategories()            { return $this->mCategories; }
-       function getTitleText()              { return $this->mTitleText; }
-       function getSections()               { return $this->mSections; }
-       function getEditSectionTokens()      { return $this->mEditSectionTokens; }
-       function &getLinks()                 { return $this->mLinks; }
-       function &getTemplates()             { return $this->mTemplates; }
-       function &getTemplateIds()           { return $this->mTemplateIds; }
-       function &getImages()                { return $this->mImages; }
-       function &getFileSearchOptions()     { return $this->mFileSearchOptions; }
-       function &getExternalLinks()         { return $this->mExternalLinks; }
-       function getNoGallery()              { return $this->mNoGallery; }
-       function getHeadItems()              { return $this->mHeadItems; }
-       function getModules()                { return $this->mModules; }
-       function getModuleScripts()          { return $this->mModuleScripts; }
-       function getModuleStyles()           { return $this->mModuleStyles; }
-       function getModuleMessages()         { return $this->mModuleMessages; }
+       function &getLanguageLinks() {
+               return $this->mLanguageLinks;
+       }
+
+       function getInterwikiLinks() {
+               return $this->mInterwikiLinks;
+       }
+
+       function getCategoryLinks() {
+               return array_keys( $this->mCategories );
+       }
+
+       function &getCategories() {
+               return $this->mCategories;
+       }
+
+       function getTitleText() {
+               return $this->mTitleText;
+       }
+
+       function getSections() {
+               return $this->mSections;
+       }
+
+       function getEditSectionTokens() {
+               return $this->mEditSectionTokens;
+       }
+
+       function &getLinks() {
+               return $this->mLinks;
+       }
+
+       function &getTemplates() {
+               return $this->mTemplates;
+       }
+
+       function &getTemplateIds() {
+               return $this->mTemplateIds;
+       }
+
+       function &getImages() {
+               return $this->mImages;
+       }
+
+       function &getFileSearchOptions() {
+               return $this->mFileSearchOptions;
+       }
+
+       function &getExternalLinks() {
+               return $this->mExternalLinks;
+       }
+
+       function getNoGallery() {
+               return $this->mNoGallery;
+       }
+
+       function getHeadItems() {
+               return $this->mHeadItems;
+       }
+
+       function getModules() {
+               return $this->mModules;
+       }
+
+       function getModuleScripts() {
+               return $this->mModuleScripts;
+       }
+
+       function getModuleStyles() {
+               return $this->mModuleStyles;
+       }
+
+       function getModuleMessages() {
+               return $this->mModuleMessages;
+       }
+
        /** @since 1.23 */
-       function getJsConfigVars()           { return $this->mJsConfigVars; }
-       function getOutputHooks()            { return (array)$this->mOutputHooks; }
-       function getWarnings()               { return array_keys( $this->mWarnings ); }
-       function getIndexPolicy()            { return $this->mIndexPolicy; }
-       function getTOCHTML()                { return $this->mTOCHTML; }
-       function getTimestamp()              { return $this->mTimestamp; }
-       function getLimitReportData()        { return $this->mLimitReportData; }
-       function getTOCEnabled()             { return $this->mTOCEnabled; }
-
-       function setText( $text )            { return wfSetVar( $this->mText, $text ); }
-       function setLanguageLinks( $ll )     { return wfSetVar( $this->mLanguageLinks, $ll ); }
-       function setCategoryLinks( $cl )     { return wfSetVar( $this->mCategories, $cl ); }
-
-       function setTitleText( $t )          { return wfSetVar( $this->mTitleText, $t ); }
-       function setSections( $toc )         { return wfSetVar( $this->mSections, $toc ); }
-       function setEditSectionTokens( $t )  { return wfSetVar( $this->mEditSectionTokens, $t ); }
-       function setIndexPolicy( $policy )   { return wfSetVar( $this->mIndexPolicy, $policy ); }
-       function setTOCHTML( $tochtml )      { return wfSetVar( $this->mTOCHTML, $tochtml ); }
-       function setTimestamp( $timestamp )  { return wfSetVar( $this->mTimestamp, $timestamp ); }
-       function setTOCEnabled( $flag )      { return wfSetVar( $this->mTOCEnabled, $flag ); }
-
-       function addCategory( $c, $sort )    { $this->mCategories[$c] = $sort; }
-       function addLanguageLink( $t )       { $this->mLanguageLinks[] = $t; }
-       function addWarning( $s )            { $this->mWarnings[$s] = 1; }
+       function getJsConfigVars() {
+               return $this->mJsConfigVars;
+       }
+
+       function getOutputHooks() {
+               return (array)$this->mOutputHooks;
+       }
+
+       function getWarnings() {
+               return array_keys( $this->mWarnings );
+       }
+
+       function getIndexPolicy() {
+               return $this->mIndexPolicy;
+       }
+
+       function getTOCHTML() {
+               return $this->mTOCHTML;
+       }
+
+       function getTimestamp() {
+               return $this->mTimestamp;
+       }
+
+       function getLimitReportData() {
+               return $this->mLimitReportData;
+       }
+
+       function getTOCEnabled() {
+               return $this->mTOCEnabled;
+       }
+
+       function setText( $text ) {
+               return wfSetVar( $this->mText, $text );
+       }
+
+       function setLanguageLinks( $ll ) {
+               return wfSetVar( $this->mLanguageLinks, $ll );
+       }
+
+       function setCategoryLinks( $cl ) {
+               return wfSetVar( $this->mCategories, $cl );
+       }
+
+       function setTitleText( $t ) {
+               return wfSetVar( $this->mTitleText, $t );
+       }
+
+       function setSections( $toc ) {
+               return wfSetVar( $this->mSections, $toc );
+       }
+
+       function setEditSectionTokens( $t ) {
+               return wfSetVar( $this->mEditSectionTokens, $t );
+       }
+
+       function setIndexPolicy( $policy ) {
+               return wfSetVar( $this->mIndexPolicy, $policy );
+       }
+
+       function setTOCHTML( $tochtml ) {
+               return wfSetVar( $this->mTOCHTML, $tochtml );
+       }
+
+       function setTimestamp( $timestamp ) {
+               return wfSetVar( $this->mTimestamp, $timestamp );
+       }
+
+       function setTOCEnabled( $flag ) {
+               return wfSetVar( $this->mTOCEnabled, $flag );
+       }
+
+       function addCategory( $c, $sort ) {
+               $this->mCategories[$c] = $sort;
+       }
+
+       function addLanguageLink( $t ) {
+               $this->mLanguageLinks[] = $t;
+       }
+
+       function addWarning( $s ) {
+               $this->mWarnings[$s] = 1;
+       }
 
        function addOutputHook( $hook, $data = false ) {
                $this->mOutputHooks[] = array( $hook, $data );
@@ -181,8 +298,8 @@ class ParserOutput extends CacheTime {
        /**
         * Checks, if a url is pointing to the own server
         *
-        * @param string $internal the server to check against
-        * @param string $url the url to check
+        * @param string $internal The server to check against
+        * @param string $url The url to check
         * @return bool
         */
        static function isLinkInternal( $internal, $url ) {
@@ -212,8 +329,8 @@ class ParserOutput extends CacheTime {
        /**
         * Record a local or interwiki inline link for saving in future link tables.
         *
-        * @param $title Title object
-        * @param $id Mixed: optional known page_id so we can skip the lookup
+        * @param Title $title
+        * @param int|null $id Optional known page_id so we can skip the lookup
         */
        function addLink( Title $title, $id = null ) {
                if ( $title->isExternal() ) {
@@ -247,7 +364,7 @@ class ParserOutput extends CacheTime {
         * Register a file dependency for this output
         * @param string $name Title dbKey
         * @param string $timestamp MW timestamp of file creation (or false if non-existing)
-        * @param string $sha1 base 36 SHA-1 of file (or false if non-existing)
+        * @param string $sha1 Base 36 SHA-1 of file (or false if non-existing)
         * @return void
         */
        function addImage( $name, $timestamp = null, $sha1 = null ) {
@@ -259,9 +376,9 @@ class ParserOutput extends CacheTime {
 
        /**
         * Register a template dependency for this output
-        * @param $title Title
-        * @param $page_id
-        * @param $rev_id
+        * @param Title $title
+        * @param int $page_id
+        * @param int $rev_id
         * @return void
         */
        function addTemplate( $title, $page_id, $rev_id ) {
@@ -278,7 +395,7 @@ class ParserOutput extends CacheTime {
        }
 
        /**
-        * @param $title Title object, must be an interwiki link
+        * @param Title $title Title object, must be an interwiki link
         * @throws MWException if given invalid input
         */
        function addInterwikiLink( $title ) {
@@ -296,6 +413,8 @@ class ParserOutput extends CacheTime {
         * Add some text to the "<head>".
         * If $tag is set, the section with that tag will only be included once
         * in a given page.
+        * @param string $section
+        * @param string|bool $tag
         */
        function addHeadItem( $section, $tag = false ) {
                if ( $tag !== false ) {
@@ -324,8 +443,8 @@ class ParserOutput extends CacheTime {
        /**
         * Add one or more variables to be set in mw.config in JavaScript.
         *
-        * @param $keys {String|Array} Key or array of key/value pairs.
-        * @param $value {Mixed} [optional] Value of the configuration variable.
+        * @param string|array $keys Key or array of key/value pairs.
+        * @param mixed $value [optional] Value of the configuration variable.
         * @since 1.23
         */
        public function addJsConfigVars( $keys, $value = null ) {
@@ -342,7 +461,7 @@ class ParserOutput extends CacheTime {
        /**
         * Copy items from the OutputPage object into this one
         *
-        * @param $out OutputPage object
+        * @param OutputPage $out
         */
        public function addOutputPageMetadata( OutputPage $out ) {
                $this->addModules( $out->getModules() );
@@ -369,7 +488,7 @@ class ParserOutput extends CacheTime {
        /**
         * Get the title to be used for display
         *
-        * @return String
+        * @return string
         */
        public function getDisplayTitle() {
                $t = $this->getTitleText();
@@ -398,6 +517,9 @@ class ParserOutput extends CacheTime {
         * retrieved given the page ID or via a DB join when given the page
         * title.
         *
+        * Since 1.23, page_props are also indexed by numeric value, to allow
+        * for efficient "top k" queries of pages wrt a given property.
+        *
         * setProperty() is thus used to propagate properties from the parsed
         * page to request contexts other than a page view of the currently parsed
         * article.
@@ -465,7 +587,7 @@ class ParserOutput extends CacheTime {
        /**
         * Returns the options from its ParserOptions which have been taken
         * into account to produce this output or false if not available.
-        * @return mixed Array
+        * @return array
         */
        public function getUsedOptions() {
                if ( !isset( $this->mAccessedOptions ) ) {
@@ -482,6 +604,7 @@ class ParserOutput extends CacheTime {
         * @see ParserCache::save
         * @see ParserOptions::addExtraKey
         * @see ParserOptions::optionsHash
+        * @param string $option
         */
        public function recordOption( $option ) {
                $this->mAccessedOptions[$option] = true;
@@ -506,16 +629,16 @@ class ParserOutput extends CacheTime {
         * extracted from the page's content, including a LinksUpdate object for all links stored in
         * this ParserOutput object.
         *
-        * @note: Avoid using this method directly, use ContentHandler::getSecondaryDataUpdates() instead! The content
-        *        handler may provide additional update objects.
+        * @note Avoid using this method directly, use ContentHandler::getSecondaryDataUpdates()
+        *   instead! The content handler may provide additional update objects.
         *
         * @since 1.20
         *
-        * @param $title Title The title of the page we're updating. If not given, a title object will be created
-        *                      based on $this->getTitleText()
-        * @param $recursive Boolean: queue jobs for recursive updates?
+        * @param Title $title The title of the page we're updating. If not given, a title object will
+        *    be created based on $this->getTitleText()
+        * @param bool $recursive Queue jobs for recursive updates?
         *
-        * @return Array. An array of instances of DataUpdate
+        * @return array An array of instances of DataUpdate
         */
        public function getSecondaryDataUpdates( Title $title = null, $recursive = true ) {
                if ( is_null( $title ) ) {
@@ -562,11 +685,10 @@ class ParserOutput extends CacheTime {
         * @since 1.21
         *
         * @param string $key The key for accessing the data. Extensions should take care to avoid
-        *               conflicts in naming keys. It is suggested to use the extension's name as a
-        *               prefix.
+        *   conflicts in naming keys. It is suggested to use the extension's name as a prefix.
         *
         * @param mixed $value The value to set. Setting a value to null is equivalent to removing
-        *              the value.
+        *   the value.
         */
        public function setExtensionData( $key, $value ) {
                if ( $value === null ) {
index aeae234..920b6f6 100644 (file)
@@ -128,7 +128,7 @@ class Parser_DiffTest
        }
 
        /**
-        * @param $parser Parser
+        * @param Parser $parser
         * @return bool
         */
        function onClearState( &$parser ) {
index aeacd2e..b8e262a 100644 (file)
@@ -28,7 +28,7 @@ interface Preprocessor {
        /**
         * Create a new preprocessor object based on an initialised Parser object
         *
-        * @param $parser Parser
+        * @param Parser $parser
         */
        function __construct( $parser );
 
@@ -40,26 +40,28 @@ interface Preprocessor {
        function newFrame();
 
        /**
-        * Create a new custom frame for programmatic use of parameter replacement as used in some extensions
+        * Create a new custom frame for programmatic use of parameter replacement
+        * as used in some extensions.
         *
-        * @param $args array
+        * @param array $args
         *
         * @return PPFrame
         */
        function newCustomFrame( $args );
 
        /**
-        * Create a new custom node for programmatic use of parameter replacement as used in some extensions
+        * Create a new custom node for programmatic use of parameter replacement
+        * as used in some extensions.
         *
-        * @param $values
+        * @param array $values
         */
        function newPartNodeArray( $values );
 
        /**
         * Preprocess text to a PPNode
         *
-        * @param $text
-        * @param $flags
+        * @param string $text
+        * @param int $flags
         *
         * @return PPNode
         */
@@ -84,8 +86,8 @@ interface PPFrame {
        /**
         * Create a child frame
         *
-        * @param array $args
-        * @param Title $title
+        * @param array|bool $args
+        * @param bool|Title $title
         * @param int $indexOffset A number subtracted from the index attributes of the arguments
         *
         * @return PPFrame
@@ -148,8 +150,7 @@ interface PPFrame {
        /**
         * Returns true if the infinite loop check is OK, false if a loop is detected
         *
-        * @param $title
-        *
+        * @param Title $title
         * @return bool
         */
        function loopCheck( $title );
index 0e7d42a..d15b43a 100644 (file)
@@ -56,7 +56,7 @@ class Preprocessor_DOM implements Preprocessor {
        }
 
        /**
-        * @param $args array
+        * @param array $args
         * @return PPCustomFrame_DOM
         */
        function newCustomFrame( $args ) {
@@ -64,7 +64,7 @@ class Preprocessor_DOM implements Preprocessor {
        }
 
        /**
-        * @param $values
+        * @param array $values
         * @return PPNode_DOM
         */
        function newPartNodeArray( $values ) {
@@ -73,18 +73,35 @@ class Preprocessor_DOM implements Preprocessor {
 
                foreach ( $values as $k => $val ) {
                        if ( is_int( $k ) ) {
-                               $xml .= "<part><name index=\"$k\"/><value>" . htmlspecialchars( $val ) . "</value></part>";
+                               $xml .= "<part><name index=\"$k\"/><value>"
+                                       . htmlspecialchars( $val ) . "</value></part>";
                        } else {
-                               $xml .= "<part><name>" . htmlspecialchars( $k ) . "</name>=<value>" . htmlspecialchars( $val ) . "</value></part>";
+                               $xml .= "<part><name>" . htmlspecialchars( $k )
+                                       . "</name>=<value>" . htmlspecialchars( $val ) . "</value></part>";
                        }
                }
 
                $xml .= "</list>";
 
+               wfProfileIn( __METHOD__ . '-loadXML' );
                $dom = new DOMDocument();
-               $dom->loadXML( $xml );
-               $root = $dom->documentElement;
+               wfSuppressWarnings();
+               $result = $dom->loadXML( $xml );
+               wfRestoreWarnings();
+               if ( !$result ) {
+                       // Try running the XML through UtfNormal to get rid of invalid characters
+                       $xml = UtfNormal::cleanUp( $xml );
+                       // 1 << 19 == XML_PARSE_HUGE, needed so newer versions of libxml2
+                       // don't barf when the XML is >256 levels deep
+                       $result = $dom->loadXML( $xml, 1 << 19 );
+               }
+               wfProfileOut( __METHOD__ . '-loadXML' );
+
+               if ( !$result ) {
+                       throw new MWException( 'Parameters passed to ' . __METHOD__ . ' result in invalid XML' );
+               }
 
+               $root = $dom->documentElement;
                $node = new PPNode_DOM( $root->childNodes );
                return $node;
        }
@@ -109,10 +126,11 @@ class Preprocessor_DOM implements Preprocessor {
         * Preprocess some wikitext and return the document tree.
         * This is the ghost of Parser::replace_variables().
         *
-        * @param string $text the text to parse
-        * @param $flags Integer: bitwise combination of:
-        *          Parser::PTD_FOR_INCLUSION    Handle "<noinclude>" and "<includeonly>" as if the text is being
-        *                                     included. Default is to assume a direct page view.
+        * @param string $text The text to parse
+        * @param int $flags Bitwise combination of:
+        *     Parser::PTD_FOR_INCLUSION  Handle "<noinclude>" and "<includeonly>"
+        *                                as if the text is being included. Default
+        *                                is to assume a direct page view.
         *
         * The generated DOM tree must depend only on the input text and the flags.
         * The DOM tree must be the same in OT_HTML and OT_WIKI mode, to avoid a regression of bug 4899.
@@ -180,7 +198,8 @@ class Preprocessor_DOM implements Preprocessor {
                if ( !$result ) {
                        // Try running the XML through UtfNormal to get rid of invalid characters
                        $xml = UtfNormal::cleanUp( $xml );
-                       // 1 << 19 == XML_PARSE_HUGE, needed so newer versions of libxml2 don't barf when the XML is >256 levels deep
+                       // 1 << 19 == XML_PARSE_HUGE, needed so newer versions of libxml2
+                       // don't barf when the XML is >256 levels deep.
                        $result = $dom->loadXML( $xml, 1 << 19 );
                }
                if ( $result ) {
@@ -201,8 +220,8 @@ class Preprocessor_DOM implements Preprocessor {
        }
 
        /**
-        * @param $text string
-        * @param $flags int
+        * @param string $text
+        * @param int $flags
         * @return string
         */
        function preprocessToXml( $text, $flags = 0 ) {
@@ -233,7 +252,9 @@ class Preprocessor_DOM implements Preprocessor {
                        $ignoredTags = array( 'includeonly', '/includeonly' );
                        $ignoredElements = array( 'noinclude' );
                        $xmlishElements[] = 'noinclude';
-                       if ( strpos( $text, '<onlyinclude>' ) !== false && strpos( $text, '</onlyinclude>' ) !== false ) {
+                       if ( strpos( $text, '<onlyinclude>' ) !== false
+                               && strpos( $text, '</onlyinclude>' ) !== false
+                       ) {
                                $enableOnlyinclude = true;
                        }
                } else {
@@ -249,19 +270,28 @@ class Preprocessor_DOM implements Preprocessor {
                $stack = new PPDStack;
 
                $searchBase = "[{<\n"; #}
-               $revText = strrev( $text ); // For fast reverse searches
+               // For fast reverse searches
+               $revText = strrev( $text );
                $lengthText = strlen( $text );
 
-               $i = 0;                     # Input pointer, starts out pointing to a pseudo-newline before the start
-               $accum =& $stack->getAccum();   # Current accumulator
+               // Input pointer, starts out pointing to a pseudo-newline before the start
+               $i = 0;
+               // Current accumulator
+               $accum =& $stack->getAccum();
                $accum = '<root>';
-               $findEquals = false;            # True to find equals signs in arguments
-               $findPipe = false;              # True to take notice of pipe characters
+               // True to find equals signs in arguments
+               $findEquals = false;
+               // True to take notice of pipe characters
+               $findPipe = false;
                $headingIndex = 1;
-               $inHeading = false;        # True if $i is inside a possible heading
-               $noMoreGT = false;         # True if there are no more greater-than (>) signs right of $i
-               $findOnlyinclude = $enableOnlyinclude; # True to ignore all input up to the next <onlyinclude>
-               $fakeLineStart = true;     # Do a line-start run without outputting an LF character
+               // True if $i is inside a possible heading
+               $inHeading = false;
+               // True if there are no more greater-than (>) signs right of $i
+               $noMoreGT = false;
+               // True to ignore all input up to the next <onlyinclude>
+               $findOnlyinclude = $enableOnlyinclude;
+               // Do a line-start run without outputting an LF character
+               $fakeLineStart = true;
 
                while ( true ) {
                        //$this->memCheck();
@@ -346,7 +376,9 @@ class Preprocessor_DOM implements Preprocessor {
                        if ( $found == 'angle' ) {
                                $matches = false;
                                // Handle </onlyinclude>
-                               if ( $enableOnlyinclude && substr( $text, $i, strlen( '</onlyinclude>' ) ) == '</onlyinclude>' ) {
+                               if ( $enableOnlyinclude
+                                       && substr( $text, $i, strlen( '</onlyinclude>' ) ) == '</onlyinclude>'
+                               ) {
                                        $findOnlyinclude = true;
                                        continue;
                                }
@@ -460,7 +492,9 @@ class Preprocessor_DOM implements Preprocessor {
 
                                // Handle ignored tags
                                if ( in_array( $lowerName, $ignoredTags ) ) {
-                                       $accum .= '<ignore>' . htmlspecialchars( substr( $text, $i, $tagEndPos - $i + 1 ) ) . '</ignore>';
+                                       $accum .= '<ignore>'
+                                               . htmlspecialchars( substr( $text, $i, $tagEndPos - $i + 1 ) )
+                                               . '</ignore>';
                                        $i = $tagEndPos + 1;
                                        continue;
                                }
@@ -520,9 +554,11 @@ class Preprocessor_DOM implements Preprocessor {
 
                                $count = strspn( $text, '=', $i, 6 );
                                if ( $count == 1 && $findEquals ) {
-                                       // DWIM: This looks kind of like a name/value separator
-                                       // Let's let the equals handler have it and break the potential heading
-                                       // This is heuristic, but AFAICT the methods for completely correct disambiguation are very complex.
+                                       // DWIM: This looks kind of like a name/value separator.
+                                       // Let's let the equals handler have it and break the
+                                       // potential heading. This is heuristic, but AFAICT the
+                                       // methods for completely correct disambiguation are very
+                                       // complex.
                                } elseif ( $count > 0 ) {
                                        $piece = array(
                                                'open' => "\n",
@@ -541,8 +577,9 @@ class Preprocessor_DOM implements Preprocessor {
                                // A heading must be open, otherwise \n wouldn't have been in the search list
                                assert( '$piece->open == "\n"' );
                                $part = $piece->getCurrentPart();
-                               // Search back through the input to see if it has a proper close
-                               // Do this using the reversed string since the other solutions (end anchor, etc.) are inefficient
+                               // Search back through the input to see if it has a proper close.
+                               // Do this using the reversed string since the other solutions
+                               // (end anchor, etc.) are inefficient.
                                $wsLength = strspn( $revText, " \t", $lengthText - $i );
                                $searchStart = $i - $wsLength;
                                if ( isset( $part->commentEnd ) && $searchStart - 1 == $part->commentEnd ) {
@@ -871,6 +908,7 @@ class PPDStackElement {
        /**
         * Get the output string that would result if the close is not found.
         *
+        * @param bool|int $openingCount
         * @return string
         */
        function breakSyntax( $openingCount = false ) {
@@ -947,7 +985,7 @@ class PPFrame_DOM implements PPFrame {
 
        /**
         * Construct a new preprocessor frame.
-        * @param $preprocessor Preprocessor The parent preprocessor
+        * @param Preprocessor $preprocessor The parent preprocessor
         */
        function __construct( $preprocessor ) {
                $this->preprocessor = $preprocessor;
@@ -962,6 +1000,9 @@ class PPFrame_DOM implements PPFrame {
         * Create a new child frame
         * $args is optionally a multi-root PPNode or array containing the template arguments
         *
+        * @param bool|array $args
+        * @param Title|bool $title
+        * @param int $indexOffset
         * @return PPTemplateFrame_DOM
         */
        function newChild( $args = false, $title = false, $indexOffset = 0 ) {
@@ -1004,8 +1045,8 @@ class PPFrame_DOM implements PPFrame {
 
        /**
         * @throws MWException
-        * @param $root
-        * @param $flags int
+        * @param string|PPNode_DOM|DOMDocument $root
+        * @param int $flags
         * @return string
         */
        function expand( $root, $flags = 0 ) {
@@ -1145,8 +1186,9 @@ class PPFrame_DOM implements PPFrame {
                                        ) {
                                                $out .= '';
                                        } elseif ( $this->parser->ot['wiki'] && !( $flags & PPFrame::RECOVER_COMMENTS ) ) {
-                                               # Add a strip marker in PST mode so that pstPass2() can run some old-fashioned regexes on the result
-                                               # Not in RECOVER_COMMENTS mode (extractSections) though
+                                               # Add a strip marker in PST mode so that pstPass2() can
+                                               # run some old-fashioned regexes on the result.
+                                               # Not in RECOVER_COMMENTS mode (extractSections) though.
                                                $out .= $this->parser->insertStripItem( $contextNode->textContent );
                                        } else {
                                                # Recover the literal comment in RECOVER_COMMENTS and pre+no-remove
@@ -1157,7 +1199,9 @@ class PPFrame_DOM implements PPFrame {
                                        # OT_WIKI will only respect <ignore> in substed templates.
                                        # The other output types respect it unless NO_IGNORE is set.
                                        # extractSections() sets NO_IGNORE and so never respects it.
-                                       if ( ( !isset( $this->parent ) && $this->parser->ot['wiki'] ) || ( $flags & PPFrame::NO_IGNORE ) ) {
+                                       if ( ( !isset( $this->parent ) && $this->parser->ot['wiki'] )
+                                               || ( $flags & PPFrame::NO_IGNORE )
+                                       ) {
                                                $out .= $contextNode->textContent;
                                        } else {
                                                $out .= '';
@@ -1228,8 +1272,8 @@ class PPFrame_DOM implements PPFrame {
        }
 
        /**
-        * @param $sep
-        * @param $flags
+        * @param string $sep
+        * @param int $flags
         * @return string
         */
        function implodeWithFlags( $sep, $flags /*, ... */ ) {
@@ -1260,6 +1304,7 @@ class PPFrame_DOM implements PPFrame {
         * Implode with no flags specified
         * This previously called implodeWithFlags but has now been inlined to reduce stack depth
         *
+        * @param string $sep
         * @return string
         */
        function implode( $sep /*, ... */ ) {
@@ -1290,6 +1335,7 @@ class PPFrame_DOM implements PPFrame {
         * Makes an object that, when expand()ed, will be the same as one obtained
         * with implode()
         *
+        * @param string $sep
         * @return array
         */
        function virtualImplode( $sep /*, ... */ ) {
@@ -1318,6 +1364,9 @@ class PPFrame_DOM implements PPFrame {
 
        /**
         * Virtual implode with brackets
+        * @param string $start
+        * @param string $sep
+        * @param string $end
         * @return array
         */
        function virtualBracketedImplode( $start, $sep, $end /*, ... */ ) {
@@ -1394,6 +1443,7 @@ class PPFrame_DOM implements PPFrame {
        /**
         * Returns true if the infinite loop check is OK, false if a loop is detected
         *
+        * @param Title $title
         * @return bool
         */
        function loopCheck( $title ) {
@@ -1433,13 +1483,15 @@ class PPTemplateFrame_DOM extends PPFrame_DOM {
        var $numberedExpansionCache, $namedExpansionCache;
 
        /**
-        * @param $preprocessor
-        * @param $parent PPFrame_DOM
-        * @param $numberedArgs array
-        * @param $namedArgs array
-        * @param $title Title
+        * @param Preprocessor $preprocessor
+        * @param bool|PPFrame_DOM $parent
+        * @param array $numberedArgs
+        * @param array $namedArgs
+        * @param bool|Title $title
         */
-       function __construct( $preprocessor, $parent = false, $numberedArgs = array(), $namedArgs = array(), $title = false ) {
+       function __construct( $preprocessor, $parent = false, $numberedArgs = array(),
+               $namedArgs = array(), $title = false
+       ) {
                parent::__construct( $preprocessor );
 
                $this->parent = $parent;
@@ -1515,7 +1567,10 @@ class PPTemplateFrame_DOM extends PPFrame_DOM {
                }
                if ( !isset( $this->numberedExpansionCache[$index] ) ) {
                        # No trimming for unnamed arguments
-                       $this->numberedExpansionCache[$index] = $this->parent->expand( $this->numberedArgs[$index], PPFrame::STRIP_COMMENTS );
+                       $this->numberedExpansionCache[$index] = $this->parent->expand(
+                               $this->numberedArgs[$index],
+                               PPFrame::STRIP_COMMENTS
+                       );
                }
                return $this->numberedExpansionCache[$index];
        }
@@ -1656,7 +1711,7 @@ class PPNode_DOM implements PPNode {
        }
 
        /**
-        * @param $type
+        * @param string $type
         *
         * @return bool|PPNode_DOM
         */
@@ -1676,7 +1731,7 @@ class PPNode_DOM implements PPNode {
        }
 
        /**
-        * @param $i
+        * @param int $i
         * @return bool|PPNode_DOM
         */
        function item( $i ) {
index d6edb21..a464461 100644 (file)
@@ -47,7 +47,7 @@ class Preprocessor_Hash implements Preprocessor {
        }
 
        /**
-        * @param $args array
+        * @param array $args
         * @return PPCustomFrame_Hash
         */
        function newCustomFrame( $args ) {
@@ -55,7 +55,7 @@ class Preprocessor_Hash implements Preprocessor {
        }
 
        /**
-        * @param $values array
+        * @param array $values
         * @return PPNode_Hash_Array
         */
        function newPartNodeArray( $values ) {
@@ -89,10 +89,10 @@ class Preprocessor_Hash implements Preprocessor {
         * Preprocess some wikitext and return the document tree.
         * This is the ghost of Parser::replace_variables().
         *
-        * @param string $text the text to parse
-        * @param $flags Integer: bitwise combination of:
-        *          Parser::PTD_FOR_INCLUSION    Handle "<noinclude>" and "<includeonly>" as if the text is being
-        *                                     included. Default is to assume a direct page view.
+        * @param string $text The text to parse
+        * @param int $flags Bitwise combination of:
+        *    Parser::PTD_FOR_INCLUSION    Handle "<noinclude>" and "<includeonly>" as if the text is being
+        *                                 included. Default is to assume a direct page view.
         *
         * The generated DOM tree must depend only on the input text and the flags.
         * The DOM tree must be the same in OT_HTML and OT_WIKI mode, to avoid a regression of bug 4899.
@@ -114,7 +114,9 @@ class Preprocessor_Hash implements Preprocessor {
                // Check cache.
                global $wgMemc, $wgPreprocessorCacheThreshold;
 
-               $cacheable = $wgPreprocessorCacheThreshold !== false && strlen( $text ) > $wgPreprocessorCacheThreshold;
+               $cacheable = $wgPreprocessorCacheThreshold !== false
+                       && strlen( $text ) > $wgPreprocessorCacheThreshold;
+
                if ( $cacheable ) {
                        wfProfileIn( __METHOD__ . '-cacheable' );
 
@@ -161,7 +163,9 @@ class Preprocessor_Hash implements Preprocessor {
                        $ignoredTags = array( 'includeonly', '/includeonly' );
                        $ignoredElements = array( 'noinclude' );
                        $xmlishElements[] = 'noinclude';
-                       if ( strpos( $text, '<onlyinclude>' ) !== false && strpos( $text, '</onlyinclude>' ) !== false ) {
+                       if ( strpos( $text, '<onlyinclude>' ) !== false
+                               && strpos( $text, '</onlyinclude>' ) !== false
+                       ) {
                                $enableOnlyinclude = true;
                        }
                } else {
@@ -177,18 +181,27 @@ class Preprocessor_Hash implements Preprocessor {
                $stack = new PPDStack_Hash;
 
                $searchBase = "[{<\n";
-               $revText = strrev( $text ); // For fast reverse searches
+               // For fast reverse searches
+               $revText = strrev( $text );
                $lengthText = strlen( $text );
 
-               $i = 0;                     # Input pointer, starts out pointing to a pseudo-newline before the start
-               $accum =& $stack->getAccum();   # Current accumulator
-               $findEquals = false;            # True to find equals signs in arguments
-               $findPipe = false;              # True to take notice of pipe characters
+               // Input pointer, starts out pointing to a pseudo-newline before the start
+               $i = 0;
+               // Current accumulator
+               $accum =& $stack->getAccum();
+               // True to find equals signs in arguments
+               $findEquals = false;
+               // True to take notice of pipe characters
+               $findPipe = false;
                $headingIndex = 1;
-               $inHeading = false;        # True if $i is inside a possible heading
-               $noMoreGT = false;         # True if there are no more greater-than (>) signs right of $i
-               $findOnlyinclude = $enableOnlyinclude; # True to ignore all input up to the next <onlyinclude>
-               $fakeLineStart = true;     # Do a line-start run without outputting an LF character
+               // True if $i is inside a possible heading
+               $inHeading = false;
+               // True if there are no more greater-than (>) signs right of $i
+               $noMoreGT = false;
+               // True to ignore all input up to the next <onlyinclude>
+               $findOnlyinclude = $enableOnlyinclude;
+               // Do a line-start run without outputting an LF character
+               $fakeLineStart = true;
 
                while ( true ) {
                        //$this->memCheck();
@@ -273,7 +286,9 @@ class Preprocessor_Hash implements Preprocessor {
                        if ( $found == 'angle' ) {
                                $matches = false;
                                // Handle </onlyinclude>
-                               if ( $enableOnlyinclude && substr( $text, $i, strlen( '</onlyinclude>' ) ) == '</onlyinclude>' ) {
+                               if ( $enableOnlyinclude
+                                       && substr( $text, $i, strlen( '</onlyinclude>' ) ) == '</onlyinclude>'
+                               ) {
                                        $findOnlyinclude = true;
                                        continue;
                                }
@@ -452,9 +467,10 @@ class Preprocessor_Hash implements Preprocessor {
 
                                $count = strspn( $text, '=', $i, 6 );
                                if ( $count == 1 && $findEquals ) {
-                                       // DWIM: This looks kind of like a name/value separator
-                                       // Let's let the equals handler have it and break the potential heading
-                                       // This is heuristic, but AFAICT the methods for completely correct disambiguation are very complex.
+                                       // DWIM: This looks kind of like a name/value separator.
+                                       // Let's let the equals handler have it and break the potential
+                                       // heading. This is heuristic, but AFAICT the methods for
+                                       // completely correct disambiguation are very complex.
                                } elseif ( $count > 0 ) {
                                        $piece = array(
                                                'open' => "\n",
@@ -472,8 +488,9 @@ class Preprocessor_Hash implements Preprocessor {
                                // A heading must be open, otherwise \n wouldn't have been in the search list
                                assert( '$piece->open == "\n"' );
                                $part = $piece->getCurrentPart();
-                               // Search back through the input to see if it has a proper close
-                               // Do this using the reversed string since the other solutions (end anchor, etc.) are inefficient
+                               // Search back through the input to see if it has a proper close.
+                               // Do this using the reversed string since the other solutions
+                               // (end anchor, etc.) are inefficient.
                                $wsLength = strspn( $revText, " \t", $lengthText - $i );
                                $searchStart = $i - $wsLength;
                                if ( isset( $part->commentEnd ) && $searchStart - 1 == $part->commentEnd ) {
@@ -762,6 +779,7 @@ class PPDStackElement_Hash extends PPDStackElement {
        /**
         * Get the accumulator that would result if the close is not found.
         *
+        * @param int|bool $openingCount
         * @return PPDAccum_Hash
         */
        function breakSyntax( $openingCount = false ) {
@@ -812,6 +830,7 @@ class PPDAccum_Hash {
 
        /**
         * Append a string literal
+        * @param string $s
         */
        function addLiteral( $s ) {
                if ( $this->lastNode === false ) {
@@ -826,6 +845,7 @@ class PPDAccum_Hash {
 
        /**
         * Append a PPNode
+        * @param PPNode $node
         */
        function addNode( PPNode $node ) {
                if ( $this->lastNode === false ) {
@@ -838,6 +858,8 @@ class PPDAccum_Hash {
 
        /**
         * Append a tree node with text contents
+        * @param string $name
+        * @param string $value
         */
        function addNodeWithText( $name, $value ) {
                $node = PPNode_Hash_Tree::newWithText( $name, $value );
@@ -845,9 +867,10 @@ class PPDAccum_Hash {
        }
 
        /**
-        * Append a PPAccum_Hash
+        * Append a PPDAccum_Hash
         * Takes over ownership of the nodes in the source argument. These nodes may
         * subsequently be modified, especially nextSibling.
+        * @param PPDAccum_Hash $accum
         */
        function addAccum( $accum ) {
                if ( $accum->lastNode === false ) {
@@ -898,7 +921,7 @@ class PPFrame_Hash implements PPFrame {
 
        /**
         * Construct a new preprocessor frame.
-        * @param $preprocessor Preprocessor: the parent preprocessor
+        * @param Preprocessor $preprocessor The parent preprocessor
         */
        function __construct( $preprocessor ) {
                $this->preprocessor = $preprocessor;
@@ -913,9 +936,8 @@ class PPFrame_Hash implements PPFrame {
         * Create a new child frame
         * $args is optionally a multi-root PPNode or array containing the template arguments
         *
-        * @param array|bool|\PPNode_Hash_Array $args PPNode_Hash_Array|array
-        * @param $title Title|bool
-        *
+        * @param array|bool|PPNode_Hash_Array $args
+        * @param Title|bool $title
         * @param int $indexOffset
         * @throws MWException
         * @return PPTemplateFrame_Hash
@@ -952,8 +974,8 @@ class PPFrame_Hash implements PPFrame {
 
        /**
         * @throws MWException
-        * @param $root
-        * @param $flags int
+        * @param string|PPNode$root
+        * @param int $flags
         * @return string
         */
        function expand( $root, $flags = 0 ) {
@@ -1033,7 +1055,11 @@ class PPFrame_Hash implements PPFrame {
                                        # Double-brace expansion
                                        $bits = $contextNode->splitTemplate();
                                        if ( $flags & PPFrame::NO_TEMPLATES ) {
-                                               $newIterator = $this->virtualBracketedImplode( '{{', '|', '}}', $bits['title'], $bits['parts'] );
+                                               $newIterator = $this->virtualBracketedImplode(
+                                                       '{{', '|', '}}',
+                                                       $bits['title'],
+                                                       $bits['parts']
+                                               );
                                        } else {
                                                $ret = $this->parser->braceSubstitution( $bits, $this );
                                                if ( isset( $ret['object'] ) ) {
@@ -1046,7 +1072,11 @@ class PPFrame_Hash implements PPFrame {
                                        # Triple-brace expansion
                                        $bits = $contextNode->splitTemplate();
                                        if ( $flags & PPFrame::NO_ARGS ) {
-                                               $newIterator = $this->virtualBracketedImplode( '{{{', '|', '}}}', $bits['title'], $bits['parts'] );
+                                               $newIterator = $this->virtualBracketedImplode(
+                                                       '{{{', '|', '}}}',
+                                                       $bits['title'],
+                                                       $bits['parts']
+                                               );
                                        } else {
                                                $ret = $this->parser->argSubstitution( $bits, $this );
                                                if ( isset( $ret['object'] ) ) {
@@ -1064,8 +1094,9 @@ class PPFrame_Hash implements PPFrame {
                                        ) {
                                                $out .= '';
                                        } elseif ( $this->parser->ot['wiki'] && !( $flags & PPFrame::RECOVER_COMMENTS ) ) {
-                                               # Add a strip marker in PST mode so that pstPass2() can run some old-fashioned regexes on the result
-                                               # Not in RECOVER_COMMENTS mode (extractSections) though
+                                               # Add a strip marker in PST mode so that pstPass2() can
+                                               # run some old-fashioned regexes on the result.
+                                               # Not in RECOVER_COMMENTS mode (extractSections) though.
                                                $out .= $this->parser->insertStripItem( $contextNode->firstChild->value );
                                        } else {
                                                # Recover the literal comment in RECOVER_COMMENTS and pre+no-remove
@@ -1076,7 +1107,9 @@ class PPFrame_Hash implements PPFrame {
                                        # OT_WIKI will only respect <ignore> in substed templates.
                                        # The other output types respect it unless NO_IGNORE is set.
                                        # extractSections() sets NO_IGNORE and so never respects it.
-                                       if ( ( !isset( $this->parent ) && $this->parser->ot['wiki'] ) || ( $flags & PPFrame::NO_IGNORE ) ) {
+                                       if ( ( !isset( $this->parent ) && $this->parser->ot['wiki'] )
+                                               || ( $flags & PPFrame::NO_IGNORE )
+                                       ) {
                                                $out .= $contextNode->firstChild->value;
                                        } else {
                                                //$out .= '';
@@ -1135,8 +1168,8 @@ class PPFrame_Hash implements PPFrame {
        }
 
        /**
-        * @param $sep
-        * @param $flags
+        * @param string $sep
+        * @param int $flags
         * @return string
         */
        function implodeWithFlags( $sep, $flags /*, ... */ ) {
@@ -1166,6 +1199,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
         * @return string
         */
        function implode( $sep /*, ... */ ) {
@@ -1196,6 +1230,7 @@ class PPFrame_Hash implements PPFrame {
         * Makes an object that, when expand()ed, will be the same as one obtained
         * with implode()
         *
+        * @param string $sep
         * @return PPNode_Hash_Array
         */
        function virtualImplode( $sep /*, ... */ ) {
@@ -1225,6 +1260,9 @@ class PPFrame_Hash implements PPFrame {
        /**
         * Virtual implode with brackets
         *
+        * @param string $start
+        * @param string $sep
+        * @param string $end
         * @return PPNode_Hash_Array
         */
        function virtualBracketedImplode( $start, $sep, $end /*, ... */ ) {
@@ -1257,8 +1295,8 @@ class PPFrame_Hash implements PPFrame {
        }
 
        /**
-        * @param $level bool
-        * @return array|bool|String
+        * @param bool $level
+        * @return array|bool|string
         */
        function getPDBK( $level = false ) {
                if ( $level === false ) {
@@ -1299,7 +1337,7 @@ class PPFrame_Hash implements PPFrame {
        }
 
        /**
-        * @param $name
+        * @param string $name
         * @return bool
         */
        function getArgument( $name ) {
@@ -1309,7 +1347,7 @@ class PPFrame_Hash implements PPFrame {
        /**
         * Returns true if the infinite loop check is OK, false if a loop is detected
         *
-        * @param $title Title
+        * @param Title $title
         *
         * @return bool
         */
@@ -1345,13 +1383,15 @@ class PPTemplateFrame_Hash extends PPFrame_Hash {
        var $numberedExpansionCache, $namedExpansionCache;
 
        /**
-        * @param $preprocessor
-        * @param $parent
-        * @param $numberedArgs array
-        * @param $namedArgs array
-        * @param $title Title
+        * @param Preprocessor $preprocessor
+        * @param bool|PPFrame $parent
+        * @param array $numberedArgs
+        * @param array $namedArgs
+        * @param bool|Title $title
         */
-       function __construct( $preprocessor, $parent = false, $numberedArgs = array(), $namedArgs = array(), $title = false ) {
+       function __construct( $preprocessor, $parent = false, $numberedArgs = array(),
+               $namedArgs = array(), $title = false
+       ) {
                parent::__construct( $preprocessor );
 
                $this->parent = $parent;
@@ -1431,7 +1471,7 @@ class PPTemplateFrame_Hash extends PPFrame_Hash {
        }
 
        /**
-        * @param $index
+        * @param int $index
         * @return array|bool
         */
        function getNumberedArgument( $index ) {
@@ -1440,13 +1480,16 @@ class PPTemplateFrame_Hash extends PPFrame_Hash {
                }
                if ( !isset( $this->numberedExpansionCache[$index] ) ) {
                        # No trimming for unnamed arguments
-                       $this->numberedExpansionCache[$index] = $this->parent->expand( $this->numberedArgs[$index], PPFrame::STRIP_COMMENTS );
+                       $this->numberedExpansionCache[$index] = $this->parent->expand(
+                               $this->numberedArgs[$index],
+                               PPFrame::STRIP_COMMENTS
+                       );
                }
                return $this->numberedExpansionCache[$index];
        }
 
        /**
-        * @param $name
+        * @param string $name
         * @return bool
         */
        function getNamedArgument( $name ) {
@@ -1462,7 +1505,7 @@ class PPTemplateFrame_Hash extends PPFrame_Hash {
        }
 
        /**
-        * @param $name
+        * @param string $name
         * @return array|bool
         */
        function getArgument( $name ) {
@@ -1519,7 +1562,7 @@ class PPCustomFrame_Hash extends PPFrame_Hash {
        }
 
        /**
-        * @param $index
+        * @param int $index
         * @return bool
         */
        function getArgument( $index ) {
@@ -1563,8 +1606,8 @@ class PPNode_Hash_Tree implements PPNode {
        }
 
        /**
-        * @param $name
-        * @param $text
+        * @param string $name
+        * @param string $text
         * @return PPNode_Hash_Tree
         */
        static function newWithText( $name, $text ) {
@@ -1619,7 +1662,7 @@ class PPNode_Hash_Tree implements PPNode {
        }
 
        /**
-        * @param $i
+        * @param int $i
         * @return bool
         */
        function item( $i ) {
@@ -1777,15 +1820,41 @@ class PPNode_Hash_Text implements PPNode {
                return $this->nextSibling;
        }
 
-       function getChildren() { return false; }
-       function getFirstChild() { return false; }
-       function getChildrenOfType( $name ) { return false; }
-       function getLength() { return false; }
-       function item( $i ) { return false; }
-       function getName() { return '#text'; }
-       function splitArg() { throw new MWException( __METHOD__ . ': not supported' ); }
-       function splitExt() { throw new MWException( __METHOD__ . ': not supported' ); }
-       function splitHeading() { throw new MWException( __METHOD__ . ': not supported' ); }
+       function getChildren() {
+               return false;
+       }
+
+       function getFirstChild() {
+               return false;
+       }
+
+       function getChildrenOfType( $name ) {
+               return false;
+       }
+
+       function getLength() {
+               return false;
+       }
+
+       function item( $i ) {
+               return false;
+       }
+
+       function getName() {
+               return '#text';
+       }
+
+       function splitArg() {
+               throw new MWException( __METHOD__ . ': not supported' );
+       }
+
+       function splitExt() {
+               throw new MWException( __METHOD__ . ': not supported' );
+       }
+
+       function splitHeading() {
+               throw new MWException( __METHOD__ . ': not supported' );
+       }
 }
 
 /**
@@ -1810,18 +1879,37 @@ class PPNode_Hash_Array implements PPNode {
                return $this->value[$i];
        }
 
-       function getName() { return '#nodelist'; }
+       function getName() {
+               return '#nodelist';
+       }
 
        function getNextSibling() {
                return $this->nextSibling;
        }
 
-       function getChildren() { return false; }
-       function getFirstChild() { return false; }
-       function getChildrenOfType( $name ) { return false; }
-       function splitArg() { throw new MWException( __METHOD__ . ': not supported' ); }
-       function splitExt() { throw new MWException( __METHOD__ . ': not supported' ); }
-       function splitHeading() { throw new MWException( __METHOD__ . ': not supported' ); }
+       function getChildren() {
+               return false;
+       }
+
+       function getFirstChild() {
+               return false;
+       }
+
+       function getChildrenOfType( $name ) {
+               return false;
+       }
+
+       function splitArg() {
+               throw new MWException( __METHOD__ . ': not supported' );
+       }
+
+       function splitExt() {
+               throw new MWException( __METHOD__ . ': not supported' );
+       }
+
+       function splitHeading() {
+               throw new MWException( __METHOD__ . ': not supported' );
+       }
 }
 
 /**
@@ -1847,12 +1935,35 @@ class PPNode_Hash_Attr implements PPNode {
                return $this->nextSibling;
        }
 
-       function getChildren() { return false; }
-       function getFirstChild() { return false; }
-       function getChildrenOfType( $name ) { return false; }
-       function getLength() { return false; }
-       function item( $i ) { return false; }
-       function splitArg() { throw new MWException( __METHOD__ . ': not supported' ); }
-       function splitExt() { throw new MWException( __METHOD__ . ': not supported' ); }
-       function splitHeading() { throw new MWException( __METHOD__ . ': not supported' ); }
+       function getChildren() {
+               return false;
+       }
+
+       function getFirstChild() {
+               return false;
+       }
+
+       function getChildrenOfType( $name ) {
+               return false;
+       }
+
+       function getLength() {
+               return false;
+       }
+
+       function item( $i ) {
+               return false;
+       }
+
+       function splitArg() {
+               throw new MWException( __METHOD__ . ': not supported' );
+       }
+
+       function splitExt() {
+               throw new MWException( __METHOD__ . ': not supported' );
+       }
+
+       function splitHeading() {
+               throw new MWException( __METHOD__ . ': not supported' );
+       }
 }
index 5b94453..d4f4559 100644 (file)
@@ -37,7 +37,7 @@ class StripState {
        const UNSTRIP_RECURSION_LIMIT = 20;
 
        /**
-        * @param $prefix string
+        * @param string $prefix
         */
        function __construct( $prefix ) {
                $this->prefix = $prefix;
@@ -51,16 +51,16 @@ class StripState {
 
        /**
         * Add a nowiki strip item
-        * @param $marker
-        * @param $value
+        * @param string $marker
+        * @param string $value
         */
        function addNoWiki( $marker, $value ) {
                $this->addItem( 'nowiki', $marker, $value );
        }
 
        /**
-        * @param $marker
-        * @param $value
+        * @param string $marker
+        * @param string $value
         */
        function addGeneral( $marker, $value ) {
                $this->addItem( 'general', $marker, $value );
@@ -68,9 +68,9 @@ class StripState {
 
        /**
         * @throws MWException
-        * @param $type
-        * @param $marker
-        * @param $value
+        * @param string $type
+        * @param string $marker
+        * @param string $value
         */
        protected function addItem( $type, $marker, $value ) {
                if ( !preg_match( $this->regex, $marker, $m ) ) {
@@ -81,7 +81,7 @@ class StripState {
        }
 
        /**
-        * @param $text
+        * @param string $text
         * @return mixed
         */
        function unstripGeneral( $text ) {
@@ -89,7 +89,7 @@ class StripState {
        }
 
        /**
-        * @param $text
+        * @param string $text
         * @return mixed
         */
        function unstripNoWiki( $text ) {
@@ -97,7 +97,7 @@ class StripState {
        }
 
        /**
-        * @param $text
+        * @param string $text
         * @return mixed
         */
        function unstripBoth( $text ) {
@@ -107,8 +107,8 @@ class StripState {
        }
 
        /**
-        * @param $type
-        * @param $text
+        * @param string $type
+        * @param string $text
         * @return mixed
         */
        protected function unstripType( $type, $text ) {
@@ -127,7 +127,7 @@ class StripState {
        }
 
        /**
-        * @param $m array
+        * @param array $m
         * @return array
         */
        protected function unstripCallback( $m ) {
@@ -159,7 +159,7 @@ class StripState {
         * Get a StripState object which is sufficient to unstrip the given text.
         * It will contain the minimum subset of strip items necessary.
         *
-        * @param $text string
+        * @param string $text
         *
         * @return StripState
         */
@@ -195,9 +195,9 @@ class StripState {
         * will not be preserved. The strings in the $texts array will have their
         * strip markers rewritten, the resulting array of strings will be returned.
         *
-        * @param $otherState StripState
-        * @param $texts Array
-        * @return Array
+        * @param StripState $otherState
+        * @param array $texts
+        * @return array
         */
        function merge( $otherState, $texts ) {
                $mergePrefix = Parser::getRandomString();
@@ -215,7 +215,7 @@ class StripState {
        }
 
        /**
-        * @param $m
+        * @param array $m
         * @return string
         */
        protected function mergeCallback( $m ) {
@@ -226,7 +226,7 @@ class StripState {
        /**
         * Remove any strip markers found in the given text.
         *
-        * @param $text Input string
+        * @param string $text Input string
         * @return string
         */
        function killMarkers( $text ) {
index dbfab34..f7fe5a8 100644 (file)
@@ -50,7 +50,7 @@ class MWTidyWrapper {
        }
 
        /**
-        * @param $text string
+        * @param string $text
         * @return string
         */
        public function getWrapped( $text ) {
@@ -79,7 +79,7 @@ class MWTidyWrapper {
        }
 
        /**
-        * @param $m array
+        * @param array $m
         *
         * @return string
         */
@@ -91,7 +91,7 @@ class MWTidyWrapper {
        }
 
        /**
-        * @param $text string
+        * @param string $text
         * @return string
         */
        public function postprocess( $text ) {
@@ -121,8 +121,8 @@ class MWTidy {
         * If tidy isn't able to correct the markup, the original will be
         * returned in all its glory with a warning comment appended.
         *
-        * @param string $text hideous HTML input
-        * @return String: corrected HTML output
+        * @param string $text Hideous HTML input
+        * @return string Corrected HTML output
         */
        public static function tidy( $text ) {
                global $wgTidyInternal;
@@ -153,9 +153,9 @@ class MWTidy {
        /**
         * Check HTML for errors, used if $wgValidateAllHtml = true.
         *
-        * @param $text String
-        * @param &$errorStr String: return the error string
-        * @return Boolean: whether the HTML is valid
+        * @param string $text
+        * @param string &$errorStr Return the error string
+        * @return bool Whether the HTML is valid
         */
        public static function checkErrors( $text, &$errorStr = null ) {
                global $wgTidyInternal;
@@ -175,9 +175,9 @@ class MWTidy {
         * Also called in OutputHandler.php for full page validation
         *
         * @param string $text HTML to check
-        * @param $stderr Boolean: Whether to read result from STDERR rather than STDOUT
-        * @param &$retval int Exit code (-1 on internal error)
-        * @return mixed String or null
+        * @param bool $stderr Whether to read result from STDERR rather than STDOUT
+        * @param int &$retval Exit code (-1 on internal error)
+        * @return string|null
         */
        private static function execExternalTidy( $text, $stderr = false, &$retval = null ) {
                global $wgTidyConf, $wgTidyBin, $wgTidyOpts;
@@ -242,9 +242,9 @@ class MWTidy {
         * saving the overhead of spawning a new process.
         *
         * @param string $text HTML to check
-        * @param $stderr Boolean: Whether to read result from error status instead of output
-        * @param &$retval int Exit code (-1 on internal error)
-        * @return mixed String or null
+        * @param bool $stderr Whether to read result from error status instead of output
+        * @param int &$retval Exit code (-1 on internal error)
+        * @return string|null
         */
        private static function execInternalTidy( $text, $stderr = false, &$retval = null ) {
                global $wgTidyConf, $wgDebugTidy;
index 1b209e4..34953c0 100644 (file)
@@ -53,9 +53,9 @@ abstract class PoolCounter {
 
        /** @var string All workers with the same key share the lock */
        protected $key;
-       /** @var integer Maximum number of workers doing the task simultaneously */
+       /** @var int Maximum number of workers doing the task simultaneously */
        protected $workers;
-       /** @var integer If this number of workers are already working/waiting, fail instead of wait */
+       /** @var int If this number of workers are already working/waiting, fail instead of wait */
        protected $maxqueue;
        /** @var float Maximum time in seconds to wait for the lock */
        protected $timeout;
@@ -75,8 +75,8 @@ abstract class PoolCounter {
        /**
         * Create a Pool counter. This should only be called from the PoolWorks.
         *
-        * @param $type
-        * @param $key
+        * @param string $type
+        * @param string $key
         *
         * @return PoolCounter
         */
@@ -123,7 +123,10 @@ abstract class PoolCounter {
        abstract public function release();
 }
 
+// @codingStandardsIgnoreStart Squiz.Classes.ValidClassName.NotCamelCaps
 class PoolCounter_Stub extends PoolCounter {
+       // @codingStandardsIgnoreEnd
+
        public function __construct() {
                /* No parameters needed */
        }
index 5c88239..093fe49 100644 (file)
@@ -45,7 +45,7 @@
  * Also this should be on a server plenty of RAM for the working set to avoid evictions.
  * Evictions could temporarily allow wait queues to double in size or temporarily cause
  * pools to appear as full when they are not. Using volatile-ttl and bumping memory-samples
- * and redis.conf can be helpful otherwise.
+ * in redis.conf can be helpful otherwise.
  *
  * @ingroup Redis
  * @since 1.23
@@ -59,24 +59,24 @@ class PoolCounterRedis extends PoolCounter {
        protected $serversByLabel;
        /** @var string SHA-1 of the key */
        protected $keySha1;
-       /** @var integer TTL for locks to expire (work should finish in this time) */
+       /** @var int TTL for locks to expire (work should finish in this time) */
        protected $lockTTL;
 
        /** @var RedisConnRef */
        protected $conn;
        /** @var string Pool slot value */
        protected $slot;
-       /** @var integer AWAKE_* constant */
+       /** @var int AWAKE_* constant */
        protected $onRelease;
        /** @var string Unique string to identify this process */
        protected $session;
-       /** @var integer UNIX timestamp */
+       /** @var int UNIX timestamp */
        protected $slotTime;
 
        const AWAKE_ONE = 1; // wake-up if when a slot can be taken from an existing process
        const AWAKE_ALL = 2; // wake-up if an existing process finishes and wake up such others
 
-       /** @var Array List of active PoolCounterRedis objects in this script */
+       /** @var array List of active PoolCounterRedis objects in this script */
        protected static $active = null;
 
        function __construct( $conf, $type, $key ) {
@@ -406,7 +406,8 @@ LUA;
                                if ( $poolCounter->slot !== null ) {
                                        $poolCounter->release();
                                }
-                       } catch ( Exception $e ) {}
+                       } catch ( Exception $e ) {
+                       }
                }
        }
 }
index 50ddd90..523e9e0 100644 (file)
  * Class for dealing with PoolCounters using class members
  */
 abstract class PoolCounterWork {
-       protected $cacheable = false; //Does this override getCachedWork() ?
+       /** @var string */
+       protected $type = 'generic';
+       /** @var bool */
+       protected $cacheable = false; // does this override getCachedWork() ?
 
        /**
         * @param string $type The type of PoolCounter to use
         * @param string $key Key that identifies the queue this work is placed on
         */
        public function __construct( $type, $key ) {
+               $this->type = $type;
                $this->poolCounter = PoolCounter::factory( $type, $key );
        }
 
        /**
         * Actually perform the work, caching it if needed
-        * @return mixed work result or false
+        * @return mixed Work result or false
         */
        abstract public function doWork();
 
        /**
         * Retrieve the work from cache
-        * @return mixed work result or false
+        * @return mixed Work result or false
         */
        public function getCachedWork() {
                return false;
@@ -52,7 +56,7 @@ abstract class PoolCounterWork {
        /**
         * A work not so good (eg. expired one) but better than an error
         * message.
-        * @return mixed work result or false
+        * @return mixed Work result or false
         */
        public function fallback() {
                return false;
@@ -69,13 +73,13 @@ abstract class PoolCounterWork {
        /**
         * Log an error
         *
-        * @param $status Status
+        * @param Status $status
         * @return void
         */
        public function logError( $status ) {
                $key = $this->poolCounter->getKey();
 
-               wfDebugLog( 'poolcounter', "Pool key '$key': "
+               wfDebugLog( 'poolcounter', "Pool key '$key' ({$this->type}): "
                        . $status->getMessage()->inLanguage( 'en' )->useDatabase( false )->text() );
        }
 
@@ -91,7 +95,7 @@ abstract class PoolCounterWork {
         *   - c) fallback()     : Applies for all remaining cases.
         * If these all fall through (by returning false), then the result of error() is returned.
         *
-        * @param $skipcache bool
+        * @param bool $skipcache
         * @return mixed
         */
        public function execute( $skipcache = false ) {
index 02367e1..f6bafd5 100644 (file)
  *
  * @file
  * @ingroup Profiler
- * This file is only included if profiling is enabled
- */
-
-/**
  * @defgroup Profiler Profiler
+ * This file is only included if profiling is enabled
  */
 
 /**
@@ -91,67 +88,46 @@ class ProfileSection {
 }
 
 /**
+ * Profiler base class that defines the interface and some trivial functionality
+ *
  * @ingroup Profiler
- * @todo document
  */
-class Profiler {
-       /** @var array List of resolved profile calls with start/end data */
-       protected $mStack = array();
-       /** @var array Queue of open profile calls with start data */
-       protected $mWorkStack = array();
-
-       /** @var array Map of (function name => aggregate data array) */
-       protected $mCollated = array();
-       /** @var bool */
-       protected $mCollateDone = false;
-       /** @var bool */
-       protected $mCollateOnly = false;
-       /** @var array Cache of a standard broken collation entry */
-       protected $mErrorEntry;
-
-       /** @var string wall|cpu|user */
-       protected $mTimeMetric = 'wall';
+abstract class Profiler {
        /** @var string|bool Profiler ID for bucketing data */
        protected $mProfileID = false;
        /** @var bool Whether MediaWiki is in a SkinTemplate output context */
        protected $mTemplated = false;
 
-       /** @var float seconds */
-       protected $mDBLockThreshold = 5.0;
-       /** @var Array DB/server name => (active trx count,timestamp) */
-       protected $mDBTrxHoldingLocks = array();
-       /** @var Array DB/server name => list of (function name, elapsed time) */
-       protected $mDBTrxMethodTimes = array();
+       /** @var TransactionProfiler */
+       protected $trxProfiler;
 
-       /** @var Profiler */
-       public static $__instance = null; // do not call this outside Profiler and ProfileSection
+       // @codingStandardsIgnoreStart PSR2.Classes.PropertyDeclaration.Underscore
+       /** @var Profiler Do not call this outside Profiler and ProfileSection */
+       public static $__instance = null;
+       // @codingStandardsIgnoreEnd
 
        /**
         * @param array $params
         */
        public function __construct( array $params ) {
-               if ( isset( $params['timeMetric'] ) ) {
-                       $this->mTimeMetric = $params['timeMetric'];
-               }
                if ( isset( $params['profileID'] ) ) {
                        $this->mProfileID = $params['profileID'];
                }
-
-               $this->mCollateOnly = $this->collateOnly();
-
-               $this->addInitialStack();
+               $this->trxProfiler = new TransactionProfiler();
        }
 
        /**
         * Singleton
         * @return Profiler
         */
-       public static function instance() {
+       final public static function instance() {
                if ( self::$__instance === null ) {
                        global $wgProfiler;
                        if ( is_array( $wgProfiler ) ) {
                                if ( !isset( $wgProfiler['class'] ) ) {
                                        $class = 'ProfilerStub';
+                               } elseif ( $wgProfiler['class'] === 'Profiler'  ) {
+                                       $class = 'ProfilerStub'; // b/c; don't explode
                                } else {
                                        $class = $wgProfiler['class'];
                                }
@@ -159,7 +135,7 @@ class Profiler {
                        } elseif ( $wgProfiler instanceof Profiler ) {
                                self::$__instance = $wgProfiler; // back-compat
                        } else {
-                               self::$__instance = new ProfilerStub( $wgProfiler );
+                               self::$__instance = new ProfilerStub( array() );
                        }
                }
                return self::$__instance;
@@ -167,30 +143,30 @@ class Profiler {
 
        /**
         * Set the profiler to a specific profiler instance. Mostly for dumpHTML
-        * @param $p Profiler object
+        * @param Profiler $p
         */
-       public static function setInstance( Profiler $p ) {
+       final public static function setInstance( Profiler $p ) {
                self::$__instance = $p;
        }
 
        /**
         * Return whether this a stub profiler
         *
-        * @return Boolean
+        * @return bool
         */
-       public function isStub() {
-               return false;
-       }
+       abstract public function isStub();
 
        /**
         * Return whether this profiler stores data
         *
+        * Called by Parser::braceSubstitution. If true, the parser will not
+        * generate per-title profiling sections, to avoid overloading the
+        * profiling data collector.
+        *
         * @see Profiler::logData()
-        * @return Boolean
+        * @return bool
         */
-       public function isPersistent() {
-               return false;
-       }
+       abstract public function isPersistent();
 
        /**
         * @param string $id
@@ -210,192 +186,19 @@ class Profiler {
                }
        }
 
-       /**
-        * Whether to internally just track aggregates and ignore the full stack trace
-        *
-        * @return boolean
-        */
-       protected function collateOnly() {
-               return false;
-       }
-
-       /**
-        * Add the inital item in the stack.
-        */
-       protected function addInitialStack() {
-               $this->mErrorEntry = $this->getErrorEntry();
-
-               $initialTime = $this->getInitialTime( 'wall' );
-               $initialCpu = $this->getInitialTime( 'cpu' );
-               if ( $initialTime !== null && $initialCpu !== null ) {
-                       $this->mWorkStack[] = array( '-total', 0, $initialTime, $initialCpu, 0 );
-                       if ( $this->mCollateOnly ) {
-                               $this->mWorkStack[] = array( '-setup', 1, $initialTime, $initialCpu, 0 );
-                               $this->profileOut( '-setup' );
-                       } else {
-                               $this->mStack[] = array( '-setup', 1, $initialTime, $initialCpu, 0,
-                                       $this->getTime( 'wall' ), $this->getTime( 'cpu' ), 0 );
-                       }
-               } else {
-                       $this->profileIn( '-total' );
-               }
-       }
-
-       /**
-        * @return array Initial collation entry
-        */
-       protected function getZeroEntry() {
-               return array(
-                       'cpu'      => 0.0,
-                       'cpu_sq'   => 0.0,
-                       'real'     => 0.0,
-                       'real_sq'  => 0.0,
-                       'memory'   => 0,
-                       'count'    => 0,
-                       'min_cpu'  => 0.0,
-                       'max_cpu'  => 0.0,
-                       'min_real' => 0.0,
-                       'max_real' => 0.0,
-                       'periods'  => array(), // not filled if mCollateOnly
-                       'overhead' => 0 // not filled if mCollateOnly
-               );
-       }
-
-       /**
-        * @return array Initial collation entry for errors
-        */
-       protected function getErrorEntry() {
-               $entry = $this->getZeroEntry();
-               $entry['count'] = 1;
-               return $entry;
-       }
-
-       /**
-        * Update the collation entry for a given method name
-        *
-        * @param string $name
-        * @param float $elapsedCpu
-        * @param float $elapsedReal
-        * @param integer $memChange
-        * @param integer $subcalls
-        * @param array|null $period Map of ('start','end','memory','subcalls')
-        */
-       protected function updateEntry(
-               $name, $elapsedCpu, $elapsedReal, $memChange, $subcalls = 0, $period = null
-       ) {
-               $entry =& $this->mCollated[$name];
-               if ( !is_array( $entry ) ) {
-                       $entry = $this->getZeroEntry();
-                       $this->mCollated[$name] =& $entry;
-               }
-               $entry['cpu'] += $elapsedCpu;
-               $entry['cpu_sq'] += $elapsedCpu * $elapsedCpu;
-               $entry['real'] += $elapsedReal;
-               $entry['real_sq'] += $elapsedReal * $elapsedReal;
-               $entry['memory'] += $memChange > 0 ? $memChange : 0;
-               $entry['count']++;
-               $entry['min_cpu'] = $elapsedCpu < $entry['min_cpu'] ? $elapsedCpu : $entry['min_cpu'];
-               $entry['max_cpu'] = $elapsedCpu > $entry['max_cpu'] ? $elapsedCpu : $entry['max_cpu'];
-               $entry['min_real'] = $elapsedReal < $entry['min_real'] ? $elapsedReal : $entry['min_real'];
-               $entry['max_real'] = $elapsedReal > $entry['max_real'] ? $elapsedReal : $entry['max_real'];
-               // Apply optional fields
-               $entry['overhead'] += $subcalls;
-               if ( $period ) {
-                       $entry['periods'][] = $period;
-               }
-       }
-
        /**
         * Called by wfProfieIn()
         *
-        * @param $functionname String
+        * @param string $functionname
         */
-       public function profileIn( $functionname ) {
-               global $wgDebugFunctionEntry;
-
-               if ( $wgDebugFunctionEntry ) {
-                       $this->debug( str_repeat( ' ', count( $this->mWorkStack ) ) .
-                               'Entering ' . $functionname . "\n" );
-               }
-
-               $this->mWorkStack[] = array(
-                       $functionname,
-                       count( $this->mWorkStack ),
-                       $this->getTime( 'time' ),
-                       $this->getTime( 'cpu' ),
-                       memory_get_usage()
-               );
-       }
+       abstract public function profileIn( $functionname );
 
        /**
         * Called by wfProfieOut()
         *
-        * @param $functionname String
-        */
-       public function profileOut( $functionname ) {
-               global $wgDebugFunctionEntry;
-
-               if ( $wgDebugFunctionEntry ) {
-                       $this->debug( str_repeat( ' ', count( $this->mWorkStack ) - 1 ) .
-                               'Exiting ' . $functionname . "\n" );
-               }
-
-               $item = array_pop( $this->mWorkStack );
-               list( $ofname, /* $ocount */, $ortime, $octime, $omem ) = $item;
-
-               if ( $item === null ) {
-                       $this->debugGroup( 'profileerror', "Profiling error: $functionname" );
-               } else {
-                       if ( $functionname === 'close' ) {
-                               if ( $ofname !== '-total' ) {
-                                       $message = "Profile section ended by close(): {$ofname}";
-                                       $this->debugGroup( 'profileerror', $message );
-                                       if ( $this->mCollateOnly ) {
-                                               $this->mCollated[$message] = $this->mErrorEntry;
-                                       } else {
-                                               $this->mStack[] = array( $message, 0, 0.0, 0.0, 0, 0.0, 0.0, 0 );
-                                       }
-                               }
-                               $functionname = $ofname;
-                       } elseif ( $ofname !== $functionname ) {
-                               $message = "Profiling error: in({$ofname}), out($functionname)";
-                               $this->debugGroup( 'profileerror', $message );
-                               if ( $this->mCollateOnly ) {
-                                       $this->mCollated[$message] = $this->mErrorEntry;
-                               } else {
-                                       $this->mStack[] = array( $message, 0, 0.0, 0.0, 0, 0.0, 0.0, 0 );
-                               }
-                       }
-                       $realTime = $this->getTime( 'wall' );
-                       $cpuTime = $this->getTime( 'cpu' );
-                       if ( $this->mCollateOnly ) {
-                               $elapsedcpu = $cpuTime - $octime;
-                               $elapsedreal = $realTime - $ortime;
-                               $memchange = memory_get_usage() - $omem;
-                               $this->updateEntry( $functionname, $elapsedcpu, $elapsedreal, $memchange );
-                       } else {
-                               $this->mStack[] = array_merge( $item,
-                                       array( $realTime, $cpuTime,     memory_get_usage() ) );
-                       }
-                       $this->updateTrxProfiling( $functionname, $realTime - $ortime );
-               }
-       }
-
-       /**
-        * Close opened profiling sections
-        */
-       public function close() {
-               while ( count( $this->mWorkStack ) ) {
-                       $this->profileOut( 'close' );
-               }
-       }
-
-       /**
-        * Log the data to some store or even the page output
+        * @param  string $functionname
         */
-       public function logData() {
-               /* Implement in subclasses */
-       }
+       abstract public function profileOut( $functionname );
 
        /**
         * Mark a DB as in a transaction with one or more writes pending
@@ -404,39 +207,10 @@ class Profiler {
         *
         * @param string $server DB server
         * @param string $db DB name
+        * @param string $id Resource ID string of connection
         */
-       public function transactionWritingIn( $server, $db ) {
-               $name = "{$server} ({$db})";
-               if ( isset( $this->mDBTrxHoldingLocks[$name] ) ) {
-                       ++$this->mDBTrxHoldingLocks[$name]['refs'];
-               } else {
-                       $this->mDBTrxHoldingLocks[$name] = array( 'refs' => 1, 'start' => microtime( true ) );
-                       $this->mDBTrxMethodTimes[$name] = array();
-               }
-       }
-
-       /**
-        * Register the name and time of a method for slow DB trx detection
-        *
-        * @param string $method Function name
-        * @param float $realtime Wal time ellapsed
-        */
-       protected function updateTrxProfiling( $method, $realtime ) {
-               if ( !$this->mDBTrxHoldingLocks ) {
-                       return; // short-circuit
-               // @TODO: hardcoded check is a tad janky (what about FOR UPDATE?)
-               } elseif ( !preg_match( '/^query-m: (?!SELECT)/', $method )
-                       && $realtime < $this->mDBLockThreshold
-               ) {
-                       return; // not a DB master query nor slow enough
-               }
-               $now = microtime( true );
-               foreach ( $this->mDBTrxHoldingLocks as $name => $info ) {
-                       // Hacky check to exclude entries from before the first TRX write
-                       if ( ( $now - $realtime ) >= $info['start'] ) {
-                               $this->mDBTrxMethodTimes[$name][] = array( $method, $realtime );
-                       }
-               }
+       public function transactionWritingIn( $server, $db, $id = '' ) {
+               $this->trxProfiler->transactionWritingIn( $server, $db, $id );
        }
 
        /**
@@ -448,36 +222,26 @@ class Profiler {
         *
         * @param string $server DB server
         * @param string $db DB name
+        * @param string $id Resource ID string of connection
         */
-       public function transactionWritingOut( $server, $db ) {
-               $name = "{$server} ({$db})";
-               if ( --$this->mDBTrxHoldingLocks[$name]['refs'] <= 0 ) {
-                       $slow = false;
-                       foreach ( $this->mDBTrxMethodTimes[$name] as $info ) {
-                               list( $method, $realtime ) = $info;
-                               if ( $realtime >= $this->mDBLockThreshold ) {
-                                       $slow = true;
-                                       break;
-                               }
-                       }
-                       if ( $slow ) {
-                               $dbs = implode( ', ', array_keys( $this->mDBTrxHoldingLocks ) );
-                               $msg = "Sub-optimal transaction on DB(s) {$dbs}:\n";
-                               foreach ( $this->mDBTrxMethodTimes[$name] as $i => $info ) {
-                                       list( $method, $realtime ) = $info;
-                                       $msg .= sprintf( "%d\t%.6f\t%s\n", $i, $realtime, $method );
-                               }
-                               $this->debugGroup( 'DBPerformance', $msg );
-                       }
-                       unset( $this->mDBTrxHoldingLocks[$name] );
-                       unset( $this->mDBTrxMethodTimes[$name] );
-               }
+       public function transactionWritingOut( $server, $db, $id = '' ) {
+               $this->trxProfiler->transactionWritingOut( $server, $db, $id );
        }
 
+       /**
+        * Close opened profiling sections
+        */
+       abstract public function close();
+
+       /**
+        * Log the data to some store or even the page output
+        */
+       abstract public function logData();
+
        /**
         * Mark this call as templated or not
         *
-        * @param $t Boolean
+        * @param bool $t
         */
        public function setTemplated( $t ) {
                $this->mTemplated = $t;
@@ -486,106 +250,28 @@ class Profiler {
        /**
         * Returns a profiling output to be stored in debug file
         *
-        * @return String
-        */
-       public function getOutput() {
-               global $wgDebugFunctionEntry, $wgProfileCallTree;
-
-               $wgDebugFunctionEntry = false; // hack
-
-               if ( !count( $this->mStack ) && !count( $this->mCollated ) ) {
-                       return "No profiling output\n";
-               }
-
-               if ( $wgProfileCallTree ) {
-                       return $this->getCallTree();
-               } else {
-                       return $this->getFunctionReport();
-               }
-       }
-
-       /**
-        * Returns a tree of function call instead of a list of functions
         * @return string
         */
-       protected function getCallTree() {
-               return implode( '', array_map(
-                       array( &$this, 'getCallTreeLine' ), $this->remapCallTree( $this->mStack )
-               ) );
-       }
+       abstract public function getOutput();
 
        /**
-        * Recursive function the format the current profiling array into a tree
-        *
-        * @param array $stack profiling array
         * @return array
         */
-       protected function remapCallTree( array $stack ) {
-               if ( count( $stack ) < 2 ) {
-                       return $stack;
-               }
-               $outputs = array();
-               for ( $max = count( $stack ) - 1; $max > 0; ) {
-                       /* Find all items under this entry */
-                       $level = $stack[$max][1];
-                       $working = array();
-                       for ( $i = $max -1; $i >= 0; $i-- ) {
-                               if ( $stack[$i][1] > $level ) {
-                                       $working[] = $stack[$i];
-                               } else {
-                                       break;
-                               }
-                       }
-                       $working = $this->remapCallTree( array_reverse( $working ) );
-                       $output = array();
-                       foreach ( $working as $item ) {
-                               array_push( $output, $item );
-                       }
-                       array_unshift( $output, $stack[$max] );
-                       $max = $i;
-
-                       array_unshift( $outputs, $output );
-               }
-               $final = array();
-               foreach ( $outputs as $output ) {
-                       foreach ( $output as $item ) {
-                               $final[] = $item;
-                       }
-               }
-               return $final;
-       }
-
-       /**
-        * Callback to get a formatted line for the call tree
-        * @return string
-        */
-       protected function getCallTreeLine( $entry ) {
-               list( $fname, $level, $startreal, , , $endreal ) = $entry;
-               $delta = $endreal - $startreal;
-               $space = str_repeat( ' ', $level );
-               # The ugly double sprintf is to work around a PHP bug,
-               # which has been fixed in recent releases.
-               return sprintf( "%10s %s %s\n",
-                       trim( sprintf( "%7.3f", $delta * 1000.0 ) ), $space, $fname );
-       }
+       abstract public function getRawData();
 
        /**
         * Get the initial time of the request, based either on $wgRequestTime or
         * $wgRUstart. Will return null if not able to find data.
         *
-        * @param string|false $metric metric to use, with the following possibilities:
+        * @param string|bool $metric Metric to use, with the following possibilities:
         *   - user: User CPU time (without system calls)
         *   - cpu: Total CPU time (user and system calls)
         *   - wall (or any other string): elapsed time
         *   - false (default): will fall back to default metric
         * @return float|null
         */
-       protected function getTime( $metric = false ) {
-               if ( $metric === false ) {
-                       $metric = $this->mTimeMetric;
-               }
-
-               if ( $metric === 'cpu' || $this->mTimeMetric === 'user' ) {
+       protected function getTime( $metric = 'wall' ) {
+               if ( $metric === 'cpu' || $metric === 'user' ) {
                        if ( !function_exists( 'getrusage' ) ) {
                                return 0;
                        }
@@ -606,21 +292,17 @@ class Profiler {
         * Get the initial time of the request, based either on $wgRequestTime or
         * $wgRUstart. Will return null if not able to find data.
         *
-        * @param string|false $metric metric to use, with the following possibilities:
+        * @param string|bool $metric Metric to use, with the following possibilities:
         *   - user: User CPU time (without system calls)
         *   - cpu: Total CPU time (user and system calls)
         *   - wall (or any other string): elapsed time
         *   - false (default): will fall back to default metric
         * @return float|null
         */
-       protected function getInitialTime( $metric = false ) {
+       protected function getInitialTime( $metric = 'wall' ) {
                global $wgRequestTime, $wgRUstart;
 
-               if ( $metric === false ) {
-                       $metric = $this->mTimeMetric;
-               }
-
-               if ( $metric === 'cpu' || $this->mTimeMetric === 'user' ) {
+               if ( $metric === 'cpu' || $metric === 'user' ) {
                        if ( !count( $wgRUstart ) ) {
                                return null;
                        }
@@ -642,229 +324,123 @@ class Profiler {
        }
 
        /**
-        * Populate mCollated
-        */
-       protected function collateData() {
-               if ( $this->mCollateDone ) {
-                       return;
-               }
-               $this->mCollateDone = true;
-               $this->close(); // set "-total" entry
-
-               if ( $this->mCollateOnly ) {
-                       return; // already collated as methods exited
-               }
-
-               $this->mCollated = array();
-
-               # Estimate profiling overhead
-               $profileCount = count( $this->mStack );
-               self::calculateOverhead( $profileCount );
-
-               # First, subtract the overhead!
-               $overheadTotal = $overheadMemory = $overheadInternal = array();
-               foreach ( $this->mStack as $entry ) {
-                       // $entry is (name,pos,rtime0,cputime0,mem0,rtime1,cputime1,mem1)
-                       $fname = $entry[0];
-                       $elapsed = $entry[5] - $entry[2];
-                       $memchange = $entry[7] - $entry[4];
-
-                       if ( $fname === '-overhead-total' ) {
-                               $overheadTotal[] = $elapsed;
-                               $overheadMemory[] = max( 0, $memchange );
-                       } elseif ( $fname === '-overhead-internal' ) {
-                               $overheadInternal[] = $elapsed;
-                       }
-               }
-               $overheadTotal = $overheadTotal ?
-                       array_sum( $overheadTotal ) / count( $overheadInternal ) : 0;
-               $overheadMemory = $overheadMemory ?
-                       array_sum( $overheadMemory ) / count( $overheadInternal ) : 0;
-               $overheadInternal = $overheadInternal ?
-                       array_sum( $overheadInternal ) / count( $overheadInternal ) : 0;
-
-               # Collate
-               foreach ( $this->mStack as $index => $entry ) {
-                       // $entry is (name,pos,rtime0,cputime0,mem0,rtime1,cputime1,mem1)
-                       $fname = $entry[0];
-                       $elapsedCpu = $entry[6] - $entry[3];
-                       $elapsedReal = $entry[5] - $entry[2];
-                       $memchange = $entry[7] - $entry[4];
-                       $subcalls = $this->calltreeCount( $this->mStack, $index );
-
-                       if ( substr( $fname, 0, 9 ) !== '-overhead' ) {
-                               # Adjust for profiling overhead (except special values with elapsed=0
-                               if ( $elapsed ) {
-                                       $elapsed -= $overheadInternal;
-                                       $elapsed -= ( $subcalls * $overheadTotal );
-                                       $memchange -= ( $subcalls * $overheadMemory );
-                               }
-                       }
-
-                       $period = array( 'start' => $entry[2], 'end' => $entry[5],
-                               'memory' => $memchange, 'subcalls' => $subcalls );
-                       $this->updateEntry( $fname, $elapsedCpu, $elapsedReal, $memchange, $subcalls, $period );
-               }
-
-               $this->mCollated['-overhead-total']['count'] = $profileCount;
-               arsort( $this->mCollated, SORT_NUMERIC );
-       }
-
-       /**
-        * Returns a list of profiled functions.
+        * Add an entry in the debug log file
         *
-        * @return string
+        * @param string $s to output
         */
-       protected function getFunctionReport() {
-               $this->collateData();
-
-               $width = 140;
-               $nameWidth = $width - 65;
-               $format = "%-{$nameWidth}s %6d %13.3f %13.3f %13.3f%% %9d  (%13.3f -%13.3f) [%d]\n";
-               $titleFormat = "%-{$nameWidth}s %6s %13s %13s %13s %9s\n";
-               $prof = "\nProfiling data\n";
-               $prof .= sprintf( $titleFormat, 'Name', 'Calls', 'Total', 'Each', '%', 'Mem' );
-
-               $total = isset( $this->mCollated['-total'] )
-                       ? $this->mCollated['-total']['real']
-                       : 0;
-
-               foreach ( $this->mCollated as $fname => $data ) {
-                       $calls = $data['count'];
-                       $percent = $total ? 100 * $data['real'] / $total : 0;
-                       $memory = $data['memory'];
-                       $prof .= sprintf( $format,
-                               substr( $fname, 0, $nameWidth ),
-                               $calls,
-                               (float)( $data['real'] * 1000 ),
-                               (float)( $data['real'] * 1000 ) / $calls,
-                               $percent,
-                               $memory,
-                               ( $data['min_real'] * 1000.0 ),
-                               ( $data['max_real'] * 1000.0 ),
-                               $data['overhead']
-                       );
+       protected function debug( $s ) {
+               if ( function_exists( 'wfDebug' ) ) {
+                       wfDebug( $s );
                }
-               $prof .= "\nTotal: $total\n\n";
-
-               return $prof;
        }
 
        /**
-        * @return array
+        * Add an entry in the debug log group
+        *
+        * @param string $group Group to send the message to
+        * @param string $s to output
         */
-       public function getRawData() {
-               // This method is called before shutdown in the footer method on Skins.
-               // If some outer methods have not yet called wfProfileOut(), work around
-               // that by clearing anything in the work stack to just the "-total" entry.
-               // Collate after doing this so the results do not include profile errors.
-               if ( count( $this->mWorkStack ) > 1 ) {
-                       $oldWorkStack = $this->mWorkStack;
-                       $this->mWorkStack = array( $this->mWorkStack[0] ); // just the "-total" one
-               } else {
-                       $oldWorkStack = null;
-               }
-               $this->collateData();
-               // If this trick is used, then the old work stack is swapped back afterwards
-               // and mCollateDone is reset to false. This means that logData() will still
-               // make use of all the method data since the missing wfProfileOut() calls
-               // should be made by the time it is called.
-               if ( $oldWorkStack ) {
-                       $this->mWorkStack = $oldWorkStack;
-                       $this->mCollateDone = false;
-               }
-
-               $total = isset( $this->mCollated['-total'] )
-                       ? $this->mCollated['-total']['real']
-                       : 0;
-
-               $profile = array();
-               foreach ( $this->mCollated as $fname => $data ) {
-                       $periods = array();
-                       foreach ( $data['periods'] as $period ) {
-                               $period['start'] *= 1000;
-                               $period['end'] *= 1000;
-                               $periods[] = $period;
-                       }
-                       $profile[] = array(
-                               'name' => $fname,
-                               'calls' => $data['count'],
-                               'elapsed' => $data['real'] * 1000,
-                               'percent' => $total ? 100 * $data['real'] / $total : 0,
-                               'memory' => $data['memory'],
-                               'min' => $data['min_real'] * 1000,
-                               'max' => $data['max_real'] * 1000,
-                               'overhead' => $data['overhead'],
-                               'periods' => $periods
-                       );
+       protected function debugGroup( $group, $s ) {
+               if ( function_exists( 'wfDebugLog' ) ) {
+                       wfDebugLog( $group, $s );
                }
-
-               return $profile;
        }
+}
 
-       /**
-        * Dummy calls to wfProfileIn/wfProfileOut to calculate its overhead
-        */
-       protected static function calculateOverhead( $profileCount ) {
-               wfProfileIn( '-overhead-total' );
-               for ( $i = 0; $i < $profileCount; $i++ ) {
-                       wfProfileIn( '-overhead-internal' );
-                       wfProfileOut( '-overhead-internal' );
-               }
-               wfProfileOut( '-overhead-total' );
-       }
+/**
+ * Helper class that detects high-contention DB queries via profiling calls
+ *
+ * This class is meant to work with a Profiler, as the later already knows
+ * when methods start and finish (which may take place during transactions).
+ *
+ * @since 1.24
+ */
+class TransactionProfiler {
+       /** @var float seconds */
+       protected $mDBLockThreshold = 5.0;
+       /** @var array DB/server name => (active trx count,timestamp) */
+       protected $mDBTrxHoldingLocks = array();
+       /** @var array DB/server name => list of (function name, elapsed time) */
+       protected $mDBTrxMethodTimes = array();
 
        /**
-        * Counts the number of profiled function calls sitting under
-        * the given point in the call graph. Not the most efficient algo.
+        * Mark a DB as in a transaction with one or more writes pending
         *
-        * @param $stack Array:
-        * @param $start Integer:
-        * @return Integer
-        */
-       protected function calltreeCount( $stack, $start ) {
-               $level = $stack[$start][1];
-               $count = 0;
-               for ( $i = $start -1; $i >= 0 && $stack[$i][1] > $level; $i-- ) {
-                       $count ++;
-               }
-               return $count;
-       }
-
-       /**
-        * Add an entry in the debug log file
+        * Note that there can be multiple connections to a single DB.
         *
-        * @param string $s to output
+        * @param string $server DB server
+        * @param string $db DB name
+        * @param string $id Resource ID string of connection
         */
-       protected function debug( $s ) {
-               if ( function_exists( 'wfDebug' ) ) {
-                       wfDebug( $s );
+       public function transactionWritingIn( $server, $db, $id ) {
+               $name = "{$server} ({$db}) ($id)";
+               if ( isset( $this->mDBTrxHoldingLocks[$name] ) ) {
+                       ++$this->mDBTrxHoldingLocks[$name]['refs'];
+               } else {
+                       $this->mDBTrxHoldingLocks[$name] = array( 'refs' => 1, 'start' => microtime( true ) );
+                       $this->mDBTrxMethodTimes[$name] = array();
                }
        }
 
        /**
-        * Add an entry in the debug log group
+        * Register the name and time of a method for slow DB trx detection
         *
-        * @param string $group Group to send the message to
-        * @param string $s to output
+        * This method is only to be called by the Profiler class as methods finish
+        *
+        * @param string $method Function name
+        * @param float $realtime Wal time ellapsed
         */
-       protected function debugGroup( $group, $s ) {
-               if ( function_exists( 'wfDebugLog' ) ) {
-                       wfDebugLog( $group, $s );
+       public function recordFunctionCompletion( $method, $realtime ) {
+               if ( !$this->mDBTrxHoldingLocks ) {
+                       return; // short-circuit
+               // @TODO: hardcoded check is a tad janky (what about FOR UPDATE?)
+               } elseif ( !preg_match( '/^query-m: (?!SELECT)/', $method )
+                       && $realtime < $this->mDBLockThreshold
+               ) {
+                       return; // not a DB master query nor slow enough
+               }
+               $now = microtime( true );
+               foreach ( $this->mDBTrxHoldingLocks as $name => $info ) {
+                       // Hacky check to exclude entries from before the first TRX write
+                       if ( ( $now - $realtime ) >= $info['start'] ) {
+                               $this->mDBTrxMethodTimes[$name][] = array( $method, $realtime );
+                       }
                }
        }
 
        /**
-        * Get the content type sent out to the client.
-        * Used for profilers that output instead of store data.
-        * @return string
+        * Mark a DB as no longer in a transaction
+        *
+        * This will check if locks are possibly held for longer than
+        * needed and log any affected transactions to a special DB log.
+        * Note that there can be multiple connections to a single DB.
+        *
+        * @param string $server DB server
+        * @param string $db DB name
+        * @param string $id Resource ID string of connection
         */
-       protected function getContentType() {
-               foreach ( headers_list() as $header ) {
-                       if ( preg_match( '#^content-type: (\w+/\w+);?#i', $header, $m ) ) {
-                               return $m[1];
+       public function transactionWritingOut( $server, $db, $id ) {
+               $name = "{$server} ({$db}) ($id)";
+               if ( --$this->mDBTrxHoldingLocks[$name]['refs'] <= 0 ) {
+                       $slow = false;
+                       foreach ( $this->mDBTrxMethodTimes[$name] as $info ) {
+                               list( $method, $realtime ) = $info;
+                               if ( $realtime >= $this->mDBLockThreshold ) {
+                                       $slow = true;
+                                       break;
+                               }
                        }
+                       if ( $slow ) {
+                               $dbs = implode( ', ', array_keys( $this->mDBTrxHoldingLocks ) );
+                               $msg = "Sub-optimal transaction on DB(s) {$dbs}:\n";
+                               foreach ( $this->mDBTrxMethodTimes[$name] as $i => $info ) {
+                                       list( $method, $realtime ) = $info;
+                                       $msg .= sprintf( "%d\t%.6f\t%s\n", $i, $realtime, $method );
+                               }
+                               wfDebugLog( 'DBPerformance', $msg );
+                       }
+                       unset( $this->mDBTrxHoldingLocks[$name] );
+                       unset( $this->mDBTrxMethodTimes[$name] );
                }
-               return null;
        }
 }
index 67b6034..abcd23c 100644 (file)
  * @since 1.23
  */
 class ProfilerMwprof extends Profiler {
+       /** @var array Queue of open profile calls with start data */
+       protected $mWorkStack = array();
+
+       /** @var array Map of (function name => aggregate data array) */
+       protected $mCollated = array();
+       /** @var array Cache of a standard broken collation entry */
+       protected $mErrorEntry;
+
        // Message types
        const TYPE_SINGLE = 1;
        const TYPE_RUNNING = 2;
 
-       protected function collateOnly() {
+       public function isStub() {
                return false;
        }
 
-       /**
-        * Indicate that this Profiler subclass is persistent.
-        *
-        * Called by Parser::braceSubstitution. If true, the parser will not
-        * generate per-title profiling sections, to avoid overloading the
-        * profiling data collector.
-        *
-        * @return bool true
-        */
        public function isPersistent() {
                return true;
        }
@@ -88,7 +87,7 @@ class ProfilerMwprof extends Profiler {
                $elapsedCpu = $this->getTime( 'cpu' ) - $inCpu;
                $elapsedWall = $this->getTime() - $inWall;
                $this->updateRunningEntry( $outName, $elapsedCpu, $elapsedWall );
-               $this->updateTrxProfiling( $outName, $elapsedWall );
+               $this->trxProfiler->recordFunctionCompletion( $outName, $elapsedWall );
        }
 
        /**
@@ -129,17 +128,6 @@ class ProfilerMwprof extends Profiler {
                $entry['wall']->push( $elapsedWall );
        }
 
-       /**
-        * Produce an empty function report.
-        *
-        * ProfileMwprof does not provide a function report.
-        *
-        * @return string Empty string.
-        */
-       public function getFunctionReport() {
-               return '';
-       }
-
        /**
         * @return array
         */
@@ -194,7 +182,6 @@ class ProfilerMwprof extends Profiler {
 
                foreach ( $profile as &$item ) {
                        $item['percent'] = $totalWall ? 100 * $item['elapsed'] / $totalWall : 0;
-                       $z+= $item['percent'];
                }
 
                return $profile;
@@ -214,7 +201,6 @@ class ProfilerMwprof extends Profiler {
                $this->close();
 
                if ( !function_exists( 'socket_create' ) ) {
-                       #trigger_error( __METHOD__ . ": function \"socket_create\" not found." );
                        return; // avoid fatal
                }
 
@@ -254,4 +240,17 @@ class ProfilerMwprof extends Profiler {
                        socket_send( $sock, $buffer, $bufferLength, 0 );
                }
        }
+
+       /**
+        * Close opened profiling sections
+        */
+       public function close() {
+               while ( count( $this->mWorkStack ) ) {
+                       $this->profileOut( 'close' );
+               }
+       }
+
+       public function getOutput() {
+               return ''; // no report
+       }
 }
index e35eec1..38a6436 100644 (file)
@@ -26,7 +26,7 @@
  *
  * @ingroup Profiler
  */
-class ProfilerSimpleDB extends Profiler {
+class ProfilerSimpleDB extends ProfilerStandard {
        protected function collateOnly() {
                return true;
        }
@@ -105,6 +105,7 @@ class ProfilerSimpleDB extends Profiler {
                        if ( $useTrx ) {
                                $dbw->commit();
                        }
-               } catch ( DBError $e ) {}
+               } catch ( DBError $e ) {
+               }
        }
 }
index 975d260..0ee7aad 100644 (file)
@@ -31,7 +31,7 @@
  *
  * @ingroup Profiler
  */
-class ProfilerSimpleText extends Profiler {
+class ProfilerSimpleText extends ProfilerStandard {
        public $visible = false; /* Show as <PRE> or <!-- ? */
        static private $out;
 
index 8d7f11c..2a44494 100644 (file)
@@ -26,7 +26,7 @@
  * @todo document methods (?)
  * @ingroup Profiler
  */
-class ProfilerSimpleTrace extends Profiler {
+class ProfilerSimpleTrace extends ProfilerStandard {
        protected $trace = "Beginning trace: \n";
        protected $memory = 0;
 
index dfe923d..22d5cd4 100644 (file)
@@ -27,7 +27,7 @@
  *  http://git.wikimedia.org/tree/operations%2Fsoftware.git/master/udpprofile)
  * @ingroup Profiler
  */
-class ProfilerSimpleUDP extends Profiler {
+class ProfilerSimpleUDP extends ProfilerStandard {
        protected function collateOnly() {
                return true;
        }
diff --git a/includes/profiler/ProfilerStandard.php b/includes/profiler/ProfilerStandard.php
new file mode 100644 (file)
index 0000000..5de9982
--- /dev/null
@@ -0,0 +1,557 @@
+<?php
+/**
+ * Common implementation class for profiling.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Profiler
+ */
+
+/**
+ * Standard profiler that tracks real time, cpu time, and memory deltas
+ *
+ * This supports profile reports, the debug toolbar, and high-contention
+ * DB query warnings. This does not persist the profiling data though.
+ *
+ * @ingroup Profiler
+ * @since 1.24
+ */
+class ProfilerStandard extends Profiler {
+       /** @var array List of resolved profile calls with start/end data */
+       protected $mStack = array();
+       /** @var array Queue of open profile calls with start data */
+       protected $mWorkStack = array();
+
+       /** @var array Map of (function name => aggregate data array) */
+       protected $mCollated = array();
+       /** @var bool */
+       protected $mCollateDone = false;
+       /** @var bool */
+       protected $mCollateOnly = false;
+       /** @var array Cache of a standard broken collation entry */
+       protected $mErrorEntry;
+
+       /**
+        * @param array $params
+        */
+       public function __construct( array $params ) {
+               parent::__construct( $params );
+
+               $this->mCollateOnly = $this->collateOnly();
+
+               $this->addInitialStack();
+       }
+
+       /**
+        * Return whether this a stub profiler
+        *
+        * @return bool
+        */
+       public function isStub() {
+               return false;
+       }
+
+       /**
+        * Return whether this profiler stores data
+        *
+        * @see Profiler::logData()
+        * @return bool
+        */
+       public function isPersistent() {
+               return false;
+       }
+
+       /**
+        * Whether to internally just track aggregates and ignore the full stack trace
+        *
+        * Only doing collation saves memory overhead but limits the use of certain
+        * features like that of graph generation for the debug toolbar.
+        *
+        * @return bool
+        */
+       protected function collateOnly() {
+               return false;
+       }
+
+       /**
+        * Add the inital item in the stack.
+        */
+       protected function addInitialStack() {
+               $this->mErrorEntry = $this->getErrorEntry();
+
+               $initialTime = $this->getInitialTime( 'wall' );
+               $initialCpu = $this->getInitialTime( 'cpu' );
+               if ( $initialTime !== null && $initialCpu !== null ) {
+                       $this->mWorkStack[] = array( '-total', 0, $initialTime, $initialCpu, 0 );
+                       if ( $this->mCollateOnly ) {
+                               $this->mWorkStack[] = array( '-setup', 1, $initialTime, $initialCpu, 0 );
+                               $this->profileOut( '-setup' );
+                       } else {
+                               $this->mStack[] = array( '-setup', 1, $initialTime, $initialCpu, 0,
+                                       $this->getTime( 'wall' ), $this->getTime( 'cpu' ), 0 );
+                       }
+               } else {
+                       $this->profileIn( '-total' );
+               }
+       }
+
+       /**
+        * @return array Initial collation entry
+        */
+       protected function getZeroEntry() {
+               return array(
+                       'cpu'      => 0.0,
+                       'cpu_sq'   => 0.0,
+                       'real'     => 0.0,
+                       'real_sq'  => 0.0,
+                       'memory'   => 0,
+                       'count'    => 0,
+                       'min_cpu'  => 0.0,
+                       'max_cpu'  => 0.0,
+                       'min_real' => 0.0,
+                       'max_real' => 0.0,
+                       'periods'  => array(), // not filled if mCollateOnly
+                       'overhead' => 0 // not filled if mCollateOnly
+               );
+       }
+
+       /**
+        * @return array Initial collation entry for errors
+        */
+       protected function getErrorEntry() {
+               $entry = $this->getZeroEntry();
+               $entry['count'] = 1;
+               return $entry;
+       }
+
+       /**
+        * Update the collation entry for a given method name
+        *
+        * @param string $name
+        * @param float $elapsedCpu
+        * @param float $elapsedReal
+        * @param int $memChange
+        * @param int $subcalls
+        * @param array|null $period Map of ('start','end','memory','subcalls')
+        */
+       protected function updateEntry(
+               $name, $elapsedCpu, $elapsedReal, $memChange, $subcalls = 0, $period = null
+       ) {
+               $entry =& $this->mCollated[$name];
+               if ( !is_array( $entry ) ) {
+                       $entry = $this->getZeroEntry();
+                       $this->mCollated[$name] =& $entry;
+               }
+               $entry['cpu'] += $elapsedCpu;
+               $entry['cpu_sq'] += $elapsedCpu * $elapsedCpu;
+               $entry['real'] += $elapsedReal;
+               $entry['real_sq'] += $elapsedReal * $elapsedReal;
+               $entry['memory'] += $memChange > 0 ? $memChange : 0;
+               $entry['count']++;
+               $entry['min_cpu'] = $elapsedCpu < $entry['min_cpu'] ? $elapsedCpu : $entry['min_cpu'];
+               $entry['max_cpu'] = $elapsedCpu > $entry['max_cpu'] ? $elapsedCpu : $entry['max_cpu'];
+               $entry['min_real'] = $elapsedReal < $entry['min_real'] ? $elapsedReal : $entry['min_real'];
+               $entry['max_real'] = $elapsedReal > $entry['max_real'] ? $elapsedReal : $entry['max_real'];
+               // Apply optional fields
+               $entry['overhead'] += $subcalls;
+               if ( $period ) {
+                       $entry['periods'][] = $period;
+               }
+       }
+
+       /**
+        * Called by wfProfieIn()
+        *
+        * @param string $functionname
+        */
+       public function profileIn( $functionname ) {
+               global $wgDebugFunctionEntry;
+
+               if ( $wgDebugFunctionEntry ) {
+                       $this->debug( str_repeat( ' ', count( $this->mWorkStack ) ) .
+                               'Entering ' . $functionname . "\n" );
+               }
+
+               $this->mWorkStack[] = array(
+                       $functionname,
+                       count( $this->mWorkStack ),
+                       $this->getTime( 'time' ),
+                       $this->getTime( 'cpu' ),
+                       memory_get_usage()
+               );
+       }
+
+       /**
+        * Called by wfProfieOut()
+        *
+        * @param string $functionname
+        */
+       public function profileOut( $functionname ) {
+               global $wgDebugFunctionEntry;
+
+               if ( $wgDebugFunctionEntry ) {
+                       $this->debug( str_repeat( ' ', count( $this->mWorkStack ) - 1 ) .
+                               'Exiting ' . $functionname . "\n" );
+               }
+
+               $item = array_pop( $this->mWorkStack );
+               list( $ofname, /* $ocount */, $ortime, $octime, $omem ) = $item;
+
+               if ( $item === null ) {
+                       $this->debugGroup( 'profileerror', "Profiling error: $functionname" );
+               } else {
+                       if ( $functionname === 'close' ) {
+                               if ( $ofname !== '-total' ) {
+                                       $message = "Profile section ended by close(): {$ofname}";
+                                       $this->debugGroup( 'profileerror', $message );
+                                       if ( $this->mCollateOnly ) {
+                                               $this->mCollated[$message] = $this->mErrorEntry;
+                                       } else {
+                                               $this->mStack[] = array( $message, 0, 0.0, 0.0, 0, 0.0, 0.0, 0 );
+                                       }
+                               }
+                               $functionname = $ofname;
+                       } elseif ( $ofname !== $functionname ) {
+                               $message = "Profiling error: in({$ofname}), out($functionname)";
+                               $this->debugGroup( 'profileerror', $message );
+                               if ( $this->mCollateOnly ) {
+                                       $this->mCollated[$message] = $this->mErrorEntry;
+                               } else {
+                                       $this->mStack[] = array( $message, 0, 0.0, 0.0, 0, 0.0, 0.0, 0 );
+                               }
+                       }
+                       $realTime = $this->getTime( 'wall' );
+                       $cpuTime = $this->getTime( 'cpu' );
+                       if ( $this->mCollateOnly ) {
+                               $elapsedcpu = $cpuTime - $octime;
+                               $elapsedreal = $realTime - $ortime;
+                               $memchange = memory_get_usage() - $omem;
+                               $this->updateEntry( $functionname, $elapsedcpu, $elapsedreal, $memchange );
+                       } else {
+                               $this->mStack[] = array_merge( $item,
+                                       array( $realTime, $cpuTime,     memory_get_usage() ) );
+                       }
+                       $this->trxProfiler->recordFunctionCompletion( $functionname, $realTime - $ortime );
+               }
+       }
+
+       /**
+        * Close opened profiling sections
+        */
+       public function close() {
+               while ( count( $this->mWorkStack ) ) {
+                       $this->profileOut( 'close' );
+               }
+       }
+
+       /**
+        * Log the data to some store or even the page output
+        */
+       public function logData() {
+               /* Implement in subclasses */
+       }
+
+       /**
+        * Returns a profiling output to be stored in debug file
+        *
+        * @return string
+        */
+       public function getOutput() {
+               global $wgDebugFunctionEntry, $wgProfileCallTree;
+
+               $wgDebugFunctionEntry = false; // hack
+
+               if ( !count( $this->mStack ) && !count( $this->mCollated ) ) {
+                       return "No profiling output\n";
+               }
+
+               if ( $wgProfileCallTree ) {
+                       return $this->getCallTree();
+               } else {
+                       return $this->getFunctionReport();
+               }
+       }
+
+       /**
+        * Returns a tree of function call instead of a list of functions
+        * @return string
+        */
+       protected function getCallTree() {
+               return implode( '', array_map(
+                       array( &$this, 'getCallTreeLine' ), $this->remapCallTree( $this->mStack )
+               ) );
+       }
+
+       /**
+        * Recursive function the format the current profiling array into a tree
+        *
+        * @param array $stack profiling array
+        * @return array
+        */
+       protected function remapCallTree( array $stack ) {
+               if ( count( $stack ) < 2 ) {
+                       return $stack;
+               }
+               $outputs = array();
+               for ( $max = count( $stack ) - 1; $max > 0; ) {
+                       /* Find all items under this entry */
+                       $level = $stack[$max][1];
+                       $working = array();
+                       for ( $i = $max -1; $i >= 0; $i-- ) {
+                               if ( $stack[$i][1] > $level ) {
+                                       $working[] = $stack[$i];
+                               } else {
+                                       break;
+                               }
+                       }
+                       $working = $this->remapCallTree( array_reverse( $working ) );
+                       $output = array();
+                       foreach ( $working as $item ) {
+                               array_push( $output, $item );
+                       }
+                       array_unshift( $output, $stack[$max] );
+                       $max = $i;
+
+                       array_unshift( $outputs, $output );
+               }
+               $final = array();
+               foreach ( $outputs as $output ) {
+                       foreach ( $output as $item ) {
+                               $final[] = $item;
+                       }
+               }
+               return $final;
+       }
+
+       /**
+        * Callback to get a formatted line for the call tree
+        * @return string
+        */
+       protected function getCallTreeLine( $entry ) {
+               list( $fname, $level, $startreal, , , $endreal ) = $entry;
+               $delta = $endreal - $startreal;
+               $space = str_repeat( ' ', $level );
+               # The ugly double sprintf is to work around a PHP bug,
+               # which has been fixed in recent releases.
+               return sprintf( "%10s %s %s\n",
+                       trim( sprintf( "%7.3f", $delta * 1000.0 ) ), $space, $fname );
+       }
+
+       /**
+        * Populate mCollated
+        */
+       protected function collateData() {
+               if ( $this->mCollateDone ) {
+                       return;
+               }
+               $this->mCollateDone = true;
+               $this->close(); // set "-total" entry
+
+               if ( $this->mCollateOnly ) {
+                       return; // already collated as methods exited
+               }
+
+               $this->mCollated = array();
+
+               # Estimate profiling overhead
+               $profileCount = count( $this->mStack );
+               self::calculateOverhead( $profileCount );
+
+               # First, subtract the overhead!
+               $overheadTotal = $overheadMemory = $overheadInternal = array();
+               foreach ( $this->mStack as $entry ) {
+                       // $entry is (name,pos,rtime0,cputime0,mem0,rtime1,cputime1,mem1)
+                       $fname = $entry[0];
+                       $elapsed = $entry[5] - $entry[2];
+                       $memchange = $entry[7] - $entry[4];
+
+                       if ( $fname === '-overhead-total' ) {
+                               $overheadTotal[] = $elapsed;
+                               $overheadMemory[] = max( 0, $memchange );
+                       } elseif ( $fname === '-overhead-internal' ) {
+                               $overheadInternal[] = $elapsed;
+                       }
+               }
+               $overheadTotal = $overheadTotal ?
+                       array_sum( $overheadTotal ) / count( $overheadInternal ) : 0;
+               $overheadMemory = $overheadMemory ?
+                       array_sum( $overheadMemory ) / count( $overheadInternal ) : 0;
+               $overheadInternal = $overheadInternal ?
+                       array_sum( $overheadInternal ) / count( $overheadInternal ) : 0;
+
+               # Collate
+               foreach ( $this->mStack as $index => $entry ) {
+                       // $entry is (name,pos,rtime0,cputime0,mem0,rtime1,cputime1,mem1)
+                       $fname = $entry[0];
+                       $elapsedCpu = $entry[6] - $entry[3];
+                       $elapsedReal = $entry[5] - $entry[2];
+                       $memchange = $entry[7] - $entry[4];
+                       $subcalls = $this->calltreeCount( $this->mStack, $index );
+
+                       if ( substr( $fname, 0, 9 ) !== '-overhead' ) {
+                               # Adjust for profiling overhead (except special values with elapsed=0
+                               if ( $elapsed ) {
+                                       $elapsed -= $overheadInternal;
+                                       $elapsed -= ( $subcalls * $overheadTotal );
+                                       $memchange -= ( $subcalls * $overheadMemory );
+                               }
+                       }
+
+                       $period = array( 'start' => $entry[2], 'end' => $entry[5],
+                               'memory' => $memchange, 'subcalls' => $subcalls );
+                       $this->updateEntry( $fname, $elapsedCpu, $elapsedReal, $memchange, $subcalls, $period );
+               }
+
+               $this->mCollated['-overhead-total']['count'] = $profileCount;
+               arsort( $this->mCollated, SORT_NUMERIC );
+       }
+
+       /**
+        * Returns a list of profiled functions.
+        *
+        * @return string
+        */
+       protected function getFunctionReport() {
+               $this->collateData();
+
+               $width = 140;
+               $nameWidth = $width - 65;
+               $format = "%-{$nameWidth}s %6d %13.3f %13.3f %13.3f%% %9d  (%13.3f -%13.3f) [%d]\n";
+               $titleFormat = "%-{$nameWidth}s %6s %13s %13s %13s %9s\n";
+               $prof = "\nProfiling data\n";
+               $prof .= sprintf( $titleFormat, 'Name', 'Calls', 'Total', 'Each', '%', 'Mem' );
+
+               $total = isset( $this->mCollated['-total'] )
+                       ? $this->mCollated['-total']['real']
+                       : 0;
+
+               foreach ( $this->mCollated as $fname => $data ) {
+                       $calls = $data['count'];
+                       $percent = $total ? 100 * $data['real'] / $total : 0;
+                       $memory = $data['memory'];
+                       $prof .= sprintf( $format,
+                               substr( $fname, 0, $nameWidth ),
+                               $calls,
+                               (float)( $data['real'] * 1000 ),
+                               (float)( $data['real'] * 1000 ) / $calls,
+                               $percent,
+                               $memory,
+                               ( $data['min_real'] * 1000.0 ),
+                               ( $data['max_real'] * 1000.0 ),
+                               $data['overhead']
+                       );
+               }
+               $prof .= "\nTotal: $total\n\n";
+
+               return $prof;
+       }
+
+       /**
+        * @return array
+        */
+       public function getRawData() {
+               // This method is called before shutdown in the footer method on Skins.
+               // If some outer methods have not yet called wfProfileOut(), work around
+               // that by clearing anything in the work stack to just the "-total" entry.
+               // Collate after doing this so the results do not include profile errors.
+               if ( count( $this->mWorkStack ) > 1 ) {
+                       $oldWorkStack = $this->mWorkStack;
+                       $this->mWorkStack = array( $this->mWorkStack[0] ); // just the "-total" one
+               } else {
+                       $oldWorkStack = null;
+               }
+               $this->collateData();
+               // If this trick is used, then the old work stack is swapped back afterwards
+               // and mCollateDone is reset to false. This means that logData() will still
+               // make use of all the method data since the missing wfProfileOut() calls
+               // should be made by the time it is called.
+               if ( $oldWorkStack ) {
+                       $this->mWorkStack = $oldWorkStack;
+                       $this->mCollateDone = false;
+               }
+
+               $total = isset( $this->mCollated['-total'] )
+                       ? $this->mCollated['-total']['real']
+                       : 0;
+
+               $profile = array();
+               foreach ( $this->mCollated as $fname => $data ) {
+                       $periods = array();
+                       foreach ( $data['periods'] as $period ) {
+                               $period['start'] *= 1000;
+                               $period['end'] *= 1000;
+                               $periods[] = $period;
+                       }
+                       $profile[] = array(
+                               'name' => $fname,
+                               'calls' => $data['count'],
+                               'elapsed' => $data['real'] * 1000,
+                               'percent' => $total ? 100 * $data['real'] / $total : 0,
+                               'memory' => $data['memory'],
+                               'min' => $data['min_real'] * 1000,
+                               'max' => $data['max_real'] * 1000,
+                               'overhead' => $data['overhead'],
+                               'periods' => $periods
+                       );
+               }
+
+               return $profile;
+       }
+
+       /**
+        * Dummy calls to wfProfileIn/wfProfileOut to calculate its overhead
+        */
+       protected static function calculateOverhead( $profileCount ) {
+               wfProfileIn( '-overhead-total' );
+               for ( $i = 0; $i < $profileCount; $i++ ) {
+                       wfProfileIn( '-overhead-internal' );
+                       wfProfileOut( '-overhead-internal' );
+               }
+               wfProfileOut( '-overhead-total' );
+       }
+
+       /**
+        * Counts the number of profiled function calls sitting under
+        * the given point in the call graph. Not the most efficient algo.
+        *
+        * @param array $stack
+        * @param int $start
+        * @return int
+        */
+       protected function calltreeCount( $stack, $start ) {
+               $level = $stack[$start][1];
+               $count = 0;
+               for ( $i = $start -1; $i >= 0 && $stack[$i][1] > $level; $i-- ) {
+                       $count ++;
+               }
+               return $count;
+       }
+
+       /**
+        * Get the content type sent out to the client.
+        * Used for profilers that output instead of store data.
+        * @return string
+        */
+       protected function getContentType() {
+               foreach ( headers_list() as $header ) {
+                       if ( preg_match( '#^content-type: (\w+/\w+);?#i', $header, $m ) ) {
+                               return $m[1];
+                       }
+               }
+               return null;
+       }
+}
index 7b310c1..1d3b65d 100644 (file)
@@ -30,16 +30,37 @@ class ProfilerStub extends Profiler {
        public function isStub() {
                return true;
        }
+
        public function isPersistent() {
                return false;
        }
-       public function profileIn( $fn ) {}
-       public function profileOut( $fn ) {}
-       public function getOutput() {}
-       public function close() {}
-       public function logData() {}
-       public function getCurrentSection() { return ''; }
-       public function transactionWritingIn( $server, $db ) {}
-       public function transactionWritingOut( $server, $db ) {}
-       public function getRawData() { return array(); }
+
+       public function profileIn( $fn ) {
+       }
+
+       public function profileOut( $fn ) {
+       }
+
+       public function getOutput() {
+       }
+
+       public function close() {
+       }
+
+       public function logData() {
+       }
+
+       public function getCurrentSection() {
+               return '';
+       }
+
+       public function transactionWritingIn( $server, $db, $id = '' ) {
+       }
+
+       public function transactionWritingOut( $server, $db, $id = '' ) {
+       }
+
+       public function getRawData() {
+               return array();
+       }
 }
index c2e5b03..02a8d7e 100644 (file)
@@ -77,15 +77,22 @@ class IRCColourfulRCFeedFormatter implements RCFeedFormatter {
 
                if ( $attribs['rc_type'] == RC_LOG ) {
                        $targetText = $rc->getTitle()->getPrefixedText();
-                       $comment = self::cleanupForIRC( str_replace( "[[$targetText]]", "[[\00302$targetText\00310]]", $actionComment ) );
+                       $comment = self::cleanupForIRC( str_replace(
+                               "[[$targetText]]",
+                               "[[\00302$targetText\00310]]",
+                               $actionComment
+                       ) );
                        $flag = $attribs['rc_log_action'];
                } else {
                        $comment = self::cleanupForIRC( $attribs['rc_comment'] );
                        $flag = '';
-                       if ( !$attribs['rc_patrolled'] && ( $wgUseRCPatrol || $attribs['rc_type'] == RC_NEW && $wgUseNPPatrol ) ) {
+                       if ( !$attribs['rc_patrolled']
+                               && ( $wgUseRCPatrol || $attribs['rc_type'] == RC_NEW && $wgUseNPPatrol )
+                       ) {
                                $flag .= '!';
                        }
-                       $flag .= ( $attribs['rc_type'] == RC_NEW ? "N" : "" ) . ( $attribs['rc_minor'] ? "M" : "" ) . ( $attribs['rc_bot'] ? "B" : "" );
+                       $flag .= ( $attribs['rc_type'] == RC_NEW ? "N" : "" )
+                               . ( $attribs['rc_minor'] ? "M" : "" ) . ( $attribs['rc_bot'] ? "B" : "" );
                }
 
                if ( $feed['add_interwiki_prefix'] === true && $wgLocalInterwikis ) {
index 9321f52..3f17bcd 100644 (file)
@@ -38,7 +38,7 @@ abstract class MachineReadableRCFeedFormatter implements RCFeedFormatter {
         * @see RCFeedFormatter::getLine
         */
        public function getLine( array $feed, RecentChange $rc, $actionComment ) {
-               global $wgCanonicalServer, $wgScriptPath;
+               global $wgCanonicalServer, $wgServerName, $wgScriptPath;
                $attrib = $rc->getAttributes();
 
                $packet = array(
@@ -63,9 +63,9 @@ abstract class MachineReadableRCFeedFormatter implements RCFeedFormatter {
                if ( $type == RC_EDIT || $type == RC_NEW ) {
                        global $wgUseRCPatrol, $wgUseNPPatrol;
 
-                       $packet['minor'] = $attrib['rc_minor'];
+                       $packet['minor'] = (bool)$attrib['rc_minor'];
                        if ( $wgUseRCPatrol || ( $type == RC_NEW && $wgUseNPPatrol ) ) {
-                               $packet['patrolled'] = $attrib['rc_patrolled'];
+                               $packet['patrolled'] = (bool)$attrib['rc_patrolled'];
                        }
                }
 
@@ -120,6 +120,8 @@ abstract class MachineReadableRCFeedFormatter implements RCFeedFormatter {
                }
 
                $packet['server_url'] = $wgCanonicalServer;
+               $packet['server_name'] = $wgServerName;
+
                $packet['server_script_path'] = $wgScriptPath ?: '/';
                $packet['wiki'] = wfWikiID();
 
index eac6a02..680bd99 100644 (file)
  *    https://www.mediawiki.org/wiki/ResourceLoader
  */
 class ResourceLoader {
-
-       /**
-        * @var int
-        */
+       /** @var int */
        protected static $filterCacheVersion = 7;
-       /**
-        * @var array
-        */
+
+       /** @var array */
        protected static $requiredSourceProperties = array( 'loadScript' );
 
-       /**
-        * @var array Module name/ResourceLoaderModule object pairs
-        */
+       /** @var array Module name/ResourceLoaderModule object pairs */
        protected $modules = array();
 
-       /**
-        * @var array Associative array mapping module name to info associative array
-        */
+       /** @var array Associative array mapping module name to info associative array */
        protected $moduleInfos = array();
 
        /**
@@ -55,14 +47,10 @@ class ResourceLoader {
         */
        protected $testModuleNames = array();
 
-       /**
-        * @var array e.g. array( 'source-id' => array( 'loadScript' => 'http://.../load.php' ) )
-        */
+       /** @var array e.g. array( 'source-id' => array( 'loadScript' => 'http://.../load.php' ) ) */
        protected $sources = array();
 
-       /**
-        * @var bool
-        */
+       /** @var bool */
        protected $hasErrors = false;
 
        /**
@@ -225,7 +213,10 @@ class ResourceLoader {
                wfProfileIn( __METHOD__ );
 
                // Add 'local' source first
-               $this->addSource( 'local', array( 'loadScript' => $wgLoadScript, 'apiScript' => wfScript( 'api' ) ) );
+               $this->addSource(
+                       'local',
+                       array( 'loadScript' => $wgLoadScript, 'apiScript' => wfScript( 'api' ) )
+               );
 
                // Add other sources
                $this->addSource( $wgResourceLoaderSources );
@@ -250,10 +241,10 @@ class ResourceLoader {
         * @param array $info Module info array. For backwards compatibility with 1.17alpha,
         *   this may also be a ResourceLoaderModule object. Optional when using
         *   multiple-registration calling style.
-        * @throws MWException: If a duplicate module registration is attempted
-        * @throws MWException: If a module name contains illegal characters (pipes or commas)
-        * @throws MWException: If something other than a ResourceLoaderModule is being registered
-        * @return boolean False if there were any errors, in which case one or more modules were
+        * @throws MWException If a duplicate module registration is attempted
+        * @throws MWException If a module name contains illegal characters (pipes or commas)
+        * @throws MWException If something other than a ResourceLoaderModule is being registered
+        * @return bool False if there were any errors, in which case one or more modules were
         *   not registered
         */
        public function register( $name, $info = null ) {
@@ -275,7 +266,8 @@ class ResourceLoader {
                        // Check $name for validity
                        if ( !self::isValidModuleName( $name ) ) {
                                wfProfileOut( __METHOD__ );
-                               throw new MWException( "ResourceLoader module name '$name' is invalid, see ResourceLoader::isValidModuleName()" );
+                               throw new MWException( "ResourceLoader module name '$name' is invalid, "
+                                       . "see ResourceLoader::isValidModuleName()" );
                        }
 
                        // Attach module
@@ -304,7 +296,9 @@ class ResourceLoader {
                global $IP, $wgEnableJavaScriptTest;
 
                if ( $wgEnableJavaScriptTest !== true ) {
-                       throw new MWException( 'Attempt to register JavaScript test modules but <code>$wgEnableJavaScriptTest</code> is false. Edit your <code>LocalSettings.php</code> to enable it.' );
+                       throw new MWException( 'Attempt to register JavaScript test modules '
+                               . 'but <code>$wgEnableJavaScriptTest</code> is false. '
+                               . 'Edit your <code>LocalSettings.php</code> to enable it.' );
                }
 
                wfProfileIn( __METHOD__ );
@@ -325,7 +319,8 @@ class ResourceLoader {
                        $module['dependencies'][] = 'test.mediawiki.qunit.testrunner';
                }
 
-               $testModules['qunit'] = ( include "$IP/tests/qunit/QUnitTestResources.php" ) + $testModules['qunit'];
+               $testModules['qunit'] =
+                       ( include "$IP/tests/qunit/QUnitTestResources.php" ) + $testModules['qunit'];
 
                foreach ( $testModules as $id => $names ) {
                        // Register test modules
@@ -392,13 +387,15 @@ class ResourceLoader {
         *
         * @param string $framework Get only the test module names for one
         *   particular framework (optional)
-        * @return Array
+        * @return array
         */
        public function getTestModuleNames( $framework = 'all' ) {
-               /// @todo api siteinfo prop testmodulenames modulenames
+               /** @todo api siteinfo prop testmodulenames modulenames */
                if ( $framework == 'all' ) {
                        return $this->testModuleNames;
-               } elseif ( isset( $this->testModuleNames[$framework] ) && is_array( $this->testModuleNames[$framework] ) ) {
+               } elseif ( isset( $this->testModuleNames[$framework] )
+                       && is_array( $this->testModuleNames[$framework] )
+               ) {
                        return $this->testModuleNames[$framework];
                } else {
                        return array();
@@ -622,7 +619,7 @@ class ResourceLoader {
         * If there's an If-Modified-Since header, respond with a 304 appropriately
         * and clear out the output buffer. If the client cache is too old then do nothing.
         *
-        * @param $context ResourceLoaderContext
+        * @param ResourceLoaderContext $context
         * @param string $mtime The TS_MW timestamp to check the header against
         * @return bool True if 304 header sent and output handled
         */
@@ -721,8 +718,8 @@ class ResourceLoader {
        /**
         * Handle exception display.
         *
-        * @param Exception $e to be shown to the user
-        * @return string sanitized text that can be returned to the user
+        * @param Exception $e Exception to be shown to the user
+        * @return string Sanitized text that can be returned to the user
         */
        public static function formatException( $e ) {
                global $wgShowExceptionDetails;
@@ -737,7 +734,7 @@ class ResourceLoader {
        /**
         * Generate code for a response.
         *
-        * @param $context ResourceLoaderContext Context in which to generate a response
+        * @param ResourceLoaderContext $context Context in which to generate a response
         * @param array $modules List of module objects keyed by module name
         * @param array $missing List of requested module names that are unregistered (optional)
         * @return string Response data
@@ -763,7 +760,10 @@ class ResourceLoader {
                                $blobs = MessageBlobStore::get( $this, $modules, $context->getLanguage() );
                        } catch ( Exception $e ) {
                                MWExceptionHandler::logException( $e );
-                               wfDebugLog( 'resourceloader', __METHOD__ . ": pre-fetching blobs from MessageBlobStore failed: $e" );
+                               wfDebugLog(
+                                       'resourceloader',
+                                       __METHOD__ . ": pre-fetching blobs from MessageBlobStore failed: $e"
+                               );
                                $this->hasErrors = true;
                                // Add exception to the output as a comment
                                $exceptions .= self::formatException( $e );
@@ -795,9 +795,13 @@ class ResourceLoader {
                                                $scripts = $module->getScriptURLsForDebug( $context );
                                        } else {
                                                $scripts = $module->getScript( $context );
-                                               // rtrim() because there are usually a few line breaks after the last ';'.
-                                               // A new line at EOF, a new line added by ResourceLoaderFileModule::readScriptFiles, etc.
-                                               if ( is_string( $scripts ) && strlen( $scripts ) && substr( rtrim( $scripts ), -1 ) !== ';' ) {
+                                               // rtrim() because there are usually a few line breaks
+                                               // after the last ';'. A new line at EOF, a new line
+                                               // added by ResourceLoaderFileModule::readScriptFiles, etc.
+                                               if ( is_string( $scripts )
+                                                       && strlen( $scripts )
+                                                       && substr( rtrim( $scripts ), -1 ) !== ';'
+                                               ) {
                                                        // Append semicolon to prevent weird bugs caused by files not
                                                        // terminating their statements right (bug 27054)
                                                        $scripts .= ";\n";
@@ -904,6 +908,12 @@ class ResourceLoader {
                        if ( count( $states ) ) {
                                $out .= self::makeLoaderStateScript( $states );
                        }
+               } else {
+                       if ( count( $states ) ) {
+                               $exceptions .= self::makeComment(
+                                       'Problematic modules: ' . FormatJson::encode( $states, ResourceLoader::inDebugMode() )
+                               );
+                       }
                }
 
                if ( !$context->getDebug() ) {
@@ -1016,7 +1026,7 @@ class ResourceLoader {
         *         Set the state of modules with the given names to the given states
         *
         * @param string $name
-        * @param $state
+        * @param string $state
         * @return string
         */
        public static function makeLoaderStateScript( $name, $state = null ) {
@@ -1049,7 +1059,9 @@ class ResourceLoader {
         * @param string $script JavaScript code
         * @return string
         */
-       public static function makeCustomLoaderScript( $name, $version, $dependencies, $group, $source, $script ) {
+       public static function makeCustomLoaderScript( $name, $version, $dependencies,
+               $group, $source, $script
+       ) {
                $script = str_replace( "\n", "\n\t", trim( $script ) );
                return Xml::encodeJsCall(
                        "( function ( name, version, dependencies, group, source ) {\n\t$script\n} )",
@@ -1111,8 +1123,8 @@ class ResourceLoader {
         *   - ResourceLoader::makeLoaderSourcesScript( array( $id1 => $props1, $id2 => $props2, ... ) );
         *       Register sources with the given IDs and properties.
         *
-        * @param string $id source ID
-        * @param array $properties source properties (see addSource())
+        * @param string $id Source ID
+        * @param array $properties Source properties (see addSource())
         * @return string
         */
        public static function makeLoaderSourcesScript( $id, $properties = null ) {
@@ -1200,7 +1212,7 @@ class ResourceLoader {
 
        /**
         * Build a load.php URL
-        * @param array $modules of module names (strings)
+        * @param array $modules Array of module names (strings)
         * @param string $lang Language code
         * @param string $skin Skin name
         * @param string|null $user User name. If null, the &user= parameter is omitted
@@ -1212,9 +1224,12 @@ class ResourceLoader {
         * @param array $extraQuery Extra query parameters to add
         * @return string URL to load.php. May be protocol-relative (if $wgLoadScript is procol-relative)
         */
-       public static function makeLoaderURL( $modules, $lang, $skin, $user = null, $version = null, $debug = false, $only = null,
-                       $printable = false, $handheld = false, $extraQuery = array() ) {
+       public static function makeLoaderURL( $modules, $lang, $skin, $user = null,
+               $version = null, $debug = false, $only = null, $printable = false,
+               $handheld = false, $extraQuery = array()
+       ) {
                global $wgLoadScript;
+
                $query = self::makeLoaderQuery( $modules, $lang, $skin, $user, $version, $debug,
                        $only, $printable, $handheld, $extraQuery
                );
@@ -1241,8 +1256,10 @@ class ResourceLoader {
         *
         * @return array
         */
-       public static function makeLoaderQuery( $modules, $lang, $skin, $user = null, $version = null, $debug = false, $only = null,
-                       $printable = false, $handheld = false, $extraQuery = array() ) {
+       public static function makeLoaderQuery( $modules, $lang, $skin, $user = null,
+               $version = null, $debug = false, $only = null, $printable = false,
+               $handheld = false, $extraQuery = array()
+       ) {
                $query = array(
                        'modules' => self::makePackedModulesString( $modules ),
                        'lang' => $lang,
@@ -1314,17 +1331,14 @@ class ResourceLoader {
         * Get global LESS variables.
         *
         * $since 1.22
-        * @return array: Map of variable names to string CSS values.
+        * @return array Map of variable names to string CSS values.
         */
        public static function getLESSVars() {
                global $wgResourceLoaderLESSVars;
 
-               static $lessVars = null;
-               if ( $lessVars === null ) {
-                       $lessVars = $wgResourceLoaderLESSVars;
-                       // Sort by key to ensure consistent hashing for cache lookups.
-                       ksort( $lessVars );
-               }
+               $lessVars = $wgResourceLoaderLESSVars;
+               // Sort by key to ensure consistent hashing for cache lookups.
+               ksort( $lessVars );
                return $lessVars;
        }
 }
index 0d9ef78..9013e2b 100644 (file)
@@ -27,7 +27,6 @@
  * of a specific loader request
  */
 class ResourceLoaderContext {
-
        /* Protected Members */
 
        protected $resourceLoader;
@@ -46,8 +45,8 @@ class ResourceLoaderContext {
        /* Methods */
 
        /**
-        * @param $resourceLoader ResourceLoader
-        * @param $request WebRequest
+        * @param ResourceLoader $resourceLoader
+        * @param WebRequest $request
         */
        public function __construct( $resourceLoader, WebRequest $request ) {
                global $wgDefaultSkin, $wgResourceLoaderDebug;
@@ -79,7 +78,7 @@ class ResourceLoaderContext {
         * an array of module names like array( 'jquery.foo', 'jquery.bar',
         * 'jquery.ui.baz', 'jquery.ui.quux' )
         * @param string $modules Packed module name list
-        * @return array of module names
+        * @return array Array of module names
         */
        public static function expandModuleNames( $modules ) {
                $retval = array();
@@ -109,7 +108,8 @@ class ResourceLoaderContext {
        }
 
        /**
-        * Return a dummy ResourceLoaderContext object suitable for passing into things that don't "really" need a context
+        * Return a dummy ResourceLoaderContext object suitable for passing into
+        * things that don't "really" need a context.
         * @return ResourceLoaderContext
         */
        public static function newDummyContext() {
@@ -184,14 +184,14 @@ class ResourceLoaderContext {
        }
 
        /**
-        * @return String|null
+        * @return string|null
         */
        public function getOnly() {
                return $this->only;
        }
 
        /**
-        * @return String|null
+        * @return string|null
         */
        public function getVersion() {
                return $this->version;
index 68bfe59..382bdd9 100644 (file)
  * ResourceLoader module based on local JavaScript/CSS files.
  */
 class ResourceLoaderFileModule extends ResourceLoaderModule {
-
        /* Protected Members */
 
-       /** String: Local base path, see __construct() */
+       /** @var string Local base path, see __construct() */
        protected $localBasePath = '';
-       /** String: Remote base path, see __construct() */
+
+       /** @var string Remote base path, see __construct() */
        protected $remoteBasePath = '';
+
        /**
-        * Array: List of paths to JavaScript files to always include
+        * @var array List of paths to JavaScript files to always include
         * @par Usage:
         * @code
         * array( [file-path], [file-path], ... )
         * @endcode
         */
        protected $scripts = array();
+
        /**
-        * Array: List of JavaScript files to include when using a specific language
+        * @var array List of JavaScript files to include when using a specific language
         * @par Usage:
         * @code
         * array( [language-code] => array( [file-path], [file-path], ... ), ... )
         * @endcode
         */
        protected $languageScripts = array();
+
        /**
-        * Array: List of JavaScript files to include when using a specific skin
+        * @var array List of JavaScript files to include when using a specific skin
         * @par Usage:
         * @code
         * array( [skin-name] => array( [file-path], [file-path], ... ), ... )
         * @endcode
         */
        protected $skinScripts = array();
+
        /**
-        * Array: List of paths to JavaScript files to include in debug mode
+        * @var array List of paths to JavaScript files to include in debug mode
         * @par Usage:
         * @code
         * array( [skin-name] => array( [file-path], [file-path], ... ), ... )
         * @endcode
         */
        protected $debugScripts = array();
+
        /**
-        * Array: List of paths to JavaScript files to include in the startup module
+        * @var array List of paths to JavaScript files to include in the startup module
         * @par Usage:
         * @code
         * array( [file-path], [file-path], ... )
         * @endcode
         */
        protected $loaderScripts = array();
+
        /**
-        * Array: List of paths to CSS files to always include
+        * @var array List of paths to CSS files to always include
         * @par Usage:
         * @code
         * array( [file-path], [file-path], ... )
         * @endcode
         */
        protected $styles = array();
+
        /**
-        * Array: List of paths to CSS files to include when using specific skins
+        * @var array List of paths to CSS files to include when using specific skins
         * @par Usage:
         * @code
         * array( [file-path], [file-path], ... )
         * @endcode
         */
        protected $skinStyles = array();
+
        /**
-        * Array: List of modules this module depends on
+        * @var array List of modules this module depends on
         * @par Usage:
         * @code
         * array( [file-path], [file-path], ... )
         * @endcode
         */
        protected $dependencies = array();
+
        /**
-        * Array: List of message keys used by this module
+        * @var array List of message keys used by this module
         * @par Usage:
         * @code
         * array( [message-key], [message-key], ... )
         * @endcode
         */
        protected $messages = array();
-       /** String: Name of group to load this module in */
+
+       /** @var string Name of group to load this module in */
        protected $group;
-       /** String: Position on the page to load this module at */
+
+       /** @var string Position on the page to load this module at */
        protected $position = 'bottom';
-       /** Boolean: Link to raw files in debug mode */
+
+       /** @var bool Link to raw files in debug mode */
        protected $debugRaw = true;
-       /** Boolean: Whether mw.loader.state() call should be omitted */
+
+       /** @var bool Whether mw.loader.state() call should be omitted */
        protected $raw = false;
+
        protected $targets = array( 'desktop' );
 
        /**
-        * Boolean: Whether getStyleURLsForDebug should return raw file paths,
+        * @var bool Whether getStyleURLsForDebug should return raw file paths,
         * or return load.php urls
         */
        protected $hasGeneratedStyles = false;
 
        /**
-        * Array: Cache for mtime
+        * @var array Cache for mtime
         * @par Usage:
         * @code
         * array( [hash] => [mtime], [hash] => [mtime], ... )
         * @endcode
         */
        protected $modifiedTime = array();
+
        /**
-        * Array: Place where readStyleFile() tracks file dependencies
+        * @var array Place where readStyleFile() tracks file dependencies
         * @par Usage:
         * @code
         * array( [file-path], [file-path], ... )
@@ -270,7 +285,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * Gets all scripts for a given context concatenated together.
         *
         * @param ResourceLoaderContext $context Context in which to generate script
-        * @return string: JavaScript code for $context
+        * @return string JavaScript code for $context
         */
        public function getScript( ResourceLoaderContext $context ) {
                $files = $this->getScriptFiles( $context );
@@ -299,7 +314,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        /**
         * Gets loader script.
         *
-        * @return string: JavaScript code to be added to startup module
+        * @return string JavaScript code to be added to startup module
         */
        public function getLoaderScript() {
                if ( count( $this->loaderScripts ) == 0 ) {
@@ -312,7 +327,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * Gets all styles for a given context concatenated together.
         *
         * @param ResourceLoaderContext $context Context in which to generate styles
-        * @return string: CSS code for $context
+        * @return string CSS code for $context
         */
        public function getStyles( ResourceLoaderContext $context ) {
                $styles = $this->readStyleFiles(
@@ -364,7 +379,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        /**
         * Gets list of message keys used by this module.
         *
-        * @return array: List of message keys
+        * @return array List of message keys
         */
        public function getMessages() {
                return $this->messages;
@@ -373,7 +388,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        /**
         * Gets the name of the group this module should be loaded in.
         *
-        * @return string: Group name
+        * @return string Group name
         */
        public function getGroup() {
                return $this->group;
@@ -389,7 +404,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        /**
         * Gets list of names of modules this module depends on.
         *
-        * @return array: List of module names
+        * @return array List of module names
         */
        public function getDependencies() {
                return $this->dependencies;
@@ -413,7 +428,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         *
         * @param ResourceLoaderContext $context Context in which to calculate
         *     the modified time
-        * @return int: UNIX timestamp
+        * @return int UNIX timestamp
         * @see ResourceLoaderModule::getFileDependencies
         */
        public function getModifiedTime( ResourceLoaderContext $context ) {
@@ -477,7 +492,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        /**
         * Get the definition summary for this module.
         *
-        * @return Array
+        * @return array
         */
        public function getDefinitionSummary( ResourceLoaderContext $context ) {
                $summary = array(
@@ -529,7 +544,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         *
         * @since 1.22
         * @param string $path
-        * @return string: the stylesheet language name
+        * @return string The stylesheet language name
         */
        public function getStyleSheetLang( $path ) {
                return preg_match( '/\.less$/i', $path ) ? 'less' : 'css';
@@ -540,9 +555,9 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         *
         * @param array $list List of file paths in any combination of index/path
         *     or path/options pairs
-        * @param string $option option name
-        * @param mixed $default default value if the option isn't set
-        * @return array: List of file paths, collated by $option
+        * @param string $option Option name
+        * @param mixed $default Default value if the option isn't set
+        * @return array List of file paths, collated by $option
         */
        protected static function collateFilePathListByOption( array $list, $option, $default ) {
                $collatedFiles = array();
@@ -571,7 +586,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * @param array $list List of lists to select from
         * @param string $key Key to look for in $map
         * @param string $fallback Key to look for in $list if $key doesn't exist
-        * @return array: List of elements from $map which matched $key or $fallback,
+        * @return array List of elements from $map which matched $key or $fallback,
         *     or an empty list in case of no match
         */
        protected static function tryForKey( array $list, $key, $fallback = null ) {
@@ -590,7 +605,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * Gets a list of file paths for all scripts in this module, in order of propper execution.
         *
         * @param ResourceLoaderContext $context
-        * @return array: List of file paths
+        * @return array List of file paths
         */
        protected function getScriptFiles( ResourceLoaderContext $context ) {
                $files = array_merge(
@@ -609,7 +624,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * Gets a list of file paths for all styles in this module, in order of propper inclusion.
         *
         * @param ResourceLoaderContext $context
-        * @return array: List of file paths
+        * @return array List of file paths
         */
        protected function getStyleFiles( ResourceLoaderContext $context ) {
                return array_merge_recursive(
@@ -644,7 +659,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         *
         * @param array $scripts List of file paths to scripts to read, remap and concetenate
         * @throws MWException
-        * @return string: Concatenated and remapped JavaScript data from $scripts
+        * @return string Concatenated and remapped JavaScript data from $scripts
         */
        protected function readScriptFiles( array $scripts ) {
                global $wgResourceLoaderValidateStaticJS;
@@ -678,7 +693,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * @param bool $flip
         *
         * @throws MWException
-        * @return array: List of concatenated and remapped CSS data from $styles,
+        * @return array List of concatenated and remapped CSS data from $styles,
         *     keyed by media type
         */
        protected function readStyleFiles( array $styles, $flip ) {
@@ -704,7 +719,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * @param string $path File path of style file to read
         * @param bool $flip
         *
-        * @return string: CSS data in script file
+        * @return string CSS data in script file
         * @throws MWException if the file doesn't exist
         */
        protected function readStyleFile( $path, $flip ) {
@@ -754,7 +769,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        /**
         * Get target(s) for the module, eg ['desktop'] or ['desktop', 'mobile']
         *
-        * @return array of strings
+        * @return array Array of strings
         */
        public function getTargets() {
                return $this->targets;
@@ -768,7 +783,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         *
         * @since 1.22
         * @param string $fileName File name of root LESS file.
-        * @return string: Cache key
+        * @return string Cache key
         */
        protected static function getLESSCacheKey( $fileName ) {
                $vars = json_encode( ResourceLoader::getLESSVars() );
@@ -789,7 +804,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * @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
+        * @return string CSS source
         */
        protected function compileLESSFile( $fileName ) {
                $key = self::getLESSCacheKey( $fileName );
@@ -809,7 +824,8 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                $result = $compiler->cachedCompile( $source );
 
                if ( !is_array( $result ) ) {
-                       throw new MWException( 'LESS compiler result has type ' . gettype( $result ) . '; array expected.' );
+                       throw new MWException( 'LESS compiler result has type '
+                               . gettype( $result ) . '; array expected.' );
                }
 
                $this->localFileRefs += array_keys( $result['files'] );
index 61ed520..8c7fbe7 100644 (file)
@@ -26,7 +26,7 @@
 class ResourceLoaderFilePageModule extends ResourceLoaderWikiModule {
 
        /**
-        * @param $context ResourceLoaderContext
+        * @param ResourceLoaderContext $context
         * @return array
         */
        protected function getPages( ResourceLoaderContext $context ) {
index c7570f6..e016a33 100644 (file)
@@ -37,7 +37,7 @@ class ResourceLoaderLESSFunctions {
         */
        public static function embeddable( $frame, $less ) {
                $base = pathinfo( $less->parser->sourceName, PATHINFO_DIRNAME );
-               $url = $frame[2][0];
+               $url = trim( $less->compileValue( $frame ), '"\'' );
                $file = realpath( $base . '/' . $url );
                return $less->toBool( $file
                        && strpos( $url, '//' ) === false
@@ -57,7 +57,7 @@ class ResourceLoaderLESSFunctions {
         */
        public static function embed( $frame, $less ) {
                $base = pathinfo( $less->parser->sourceName, PATHINFO_DIRNAME );
-               $url = $frame[2][0];
+               $url = trim( $less->compileValue( $frame ), '"\'' );
                $file = realpath( $base . '/' . $url );
 
                $data = CSSMin::encodeImageAsDataURI( $file );
index fa0fbf8..a1c8ac9 100644 (file)
  */
 class ResourceLoaderLanguageDataModule extends ResourceLoaderModule {
 
-       protected $language;
        protected $targets = array( 'desktop', 'mobile' );
-       /**
-        * Get the grammar forms for the site content language.
-        *
-        * @return array
-        */
-       protected function getSiteLangGrammarForms() {
-               return $this->language->getGrammarForms();
-       }
-
-       /**
-        * Get the plural forms for the site content language.
-        *
-        * @return array
-        */
-       protected function getPluralRules() {
-               return $this->language->getPluralRules();
-       }
-
-       /**
-        * Get the digit groupin Pattern for the site content language.
-        *
-        * @return array
-        */
-       protected function getDigitGroupingPattern() {
-               return $this->language->digitGroupingPattern();
-       }
-
-       /**
-        * Get the digit transform table for the content language
-        *
-        * @return array
-        */
-       protected function getDigitTransformTable() {
-               return $this->language->digitTransformTable();
-       }
-
-       /**
-        * Get seperator transform table required for converting
-        * the . and , sign to appropriate forms in site content language.
-        *
-        * @return array
-        */
-       protected function getSeparatorTransformTable() {
-               return $this->language->separatorTransformTable();
-       }
 
        /**
         * Get all the dynamic data for the content language to an array.
         *
-        * NOTE: Before calling this you HAVE to make sure $this->language is set.
-        *
+        * @param ResourceLoaderContext $context
         * @return array
         */
-       protected function getData() {
+       protected function getData( ResourceLoaderContext $context ) {
+               $language = Language::factory( $context->getLanguage() );
                return array(
-                       'digitTransformTable' => $this->getDigitTransformTable(),
-                       'separatorTransformTable' => $this->getSeparatorTransformTable(),
-                       'grammarForms' => $this->getSiteLangGrammarForms(),
-                       'pluralRules' => $this->getPluralRules(),
-                       'digitGroupingPattern' => $this->getDigitGroupingPattern(),
+                       'digitTransformTable' => $language->digitTransformTable(),
+                       'separatorTransformTable' => $language->separatorTransformTable(),
+                       'grammarForms' => $language->getGrammarForms(),
+                       'pluralRules' => $language->getPluralRules(),
+                       'digitGroupingPattern' => $language->digitGroupingPattern(),
                );
        }
 
        /**
-        * @param $context ResourceLoaderContext
-        * @return string: JavaScript code
+        * @param ResourceLoaderContext $context
+        * @return string JavaScript code
         */
        public function getScript( ResourceLoaderContext $context ) {
-               $this->language = Language::factory( $context->getLanguage() );
                return Xml::encodeJsCall( 'mw.language.setData', array(
-                       $this->language->getCode(),
-                       $this->getData()
+                       $context->getLanguage(),
+                       $this->getData( $context )
                ) );
        }
 
        /**
-        * @param $context ResourceLoaderContext
-        * @return int: UNIX timestamp
+        * @param ResourceLoaderContext $context
+        * @return int UNIX timestamp
         */
        public function getModifiedTime( ResourceLoaderContext $context ) {
                return max( 1, $this->getHashMtime( $context ) );
        }
 
        /**
-        * @param $context ResourceLoaderContext
-        * @return string: Hash
+        * @param ResourceLoaderContext $context
+        * @return string Hash
         */
        public function getModifiedHash( ResourceLoaderContext $context ) {
-               $this->language = Language::factory( $context->getLanguage() );
-
-               return md5( serialize( $this->getData() ) );
+               return md5( serialize( $this->getData( $context ) ) );
        }
 
        /**
diff --git a/includes/resourceloader/ResourceLoaderLanguageNamesModule.php b/includes/resourceloader/ResourceLoaderLanguageNamesModule.php
new file mode 100644 (file)
index 0000000..73b6ea7
--- /dev/null
@@ -0,0 +1,79 @@
+<?php
+/**
+ * Resource loader module for providing language names.
+ *
+ * By default these names will be autonyms however other extensions may
+ * provided language names in the context language (e.g. cldr extension)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write 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 Ed Sanders
+ * @author Trevor Parscal
+ */
+
+/**
+ * ResourceLoader module for populating language specific data.
+ */
+class ResourceLoaderLanguageNamesModule extends ResourceLoaderModule {
+
+       protected $targets = array( 'desktop', 'mobile' );
+
+
+       /**
+        * @param $context ResourceLoaderContext
+        * @return array
+        */
+       protected function getData( ResourceLoaderContext $context ) {
+               return Language::fetchLanguageNames(
+                       $context->getLanguage(),
+                       'all'
+               );
+       }
+
+       /**
+        * @param $context ResourceLoaderContext
+        * @return string JavaScript code
+        */
+       public function getScript( ResourceLoaderContext $context ) {
+               return Xml::encodeJsCall( 'mw.language.setData', array(
+                       $context->getLanguage(),
+                       'languageNames',
+                       $this->getData( $context )
+               ) );
+       }
+
+       public function getDependencies() {
+               return array( 'mediawiki.language.init' );
+       }
+
+       /**
+        * @param ResourceLoaderContext $context
+        * @return int UNIX timestamp
+        */
+       public function getModifiedTime( ResourceLoaderContext $context ) {
+               return max( 1, $this->getHashMtime( $context ) );
+       }
+
+       /**
+        * @param ResourceLoaderContext $context
+        * @return string Hash
+        */
+       public function getModifiedHash( ResourceLoaderContext $context ) {
+               return md5( serialize( $this->getData( $context ) ) );
+       }
+
+}
index 429bcec..9ddd184 100644 (file)
@@ -26,7 +26,6 @@
  * Abstraction for resource loader modules, with name registration and maxage functionality.
  */
 abstract class ResourceLoaderModule {
-
        # Type of resource
        const TYPE_SCRIPTS = 'scripts';
        const TYPE_STYLES = 'styles';
@@ -71,7 +70,7 @@ abstract class ResourceLoaderModule {
         * Get this module's name. This is set when the module is registered
         * with ResourceLoader::register()
         *
-        * @return mixed: Name (string) or null if no name was set
+        * @return string|null Name (string) or null if no name was set
         */
        public function getName() {
                return $this->name;
@@ -91,7 +90,7 @@ abstract class ResourceLoaderModule {
         * Get this module's origin. This is set when the module is registered
         * with ResourceLoader::register()
         *
-        * @return int: ResourceLoaderModule class constant, the subclass default
+        * @return int ResourceLoaderModule class constant, the subclass default
         *     if not set manually
         */
        public function getOrigin() {
@@ -102,7 +101,7 @@ abstract class ResourceLoaderModule {
         * Set this module's origin. This is called by ResourceLoader::register()
         * when registering the module. Other code should not call this.
         *
-        * @param int $origin origin
+        * @param int $origin Origin
         */
        public function setOrigin( $origin ) {
                $this->origin = $origin;
@@ -123,7 +122,7 @@ abstract class ResourceLoaderModule {
         * Includes all relevant JS except loader scripts.
         *
         * @param ResourceLoaderContext $context
-        * @return string: JavaScript code
+        * @return string JavaScript code
         */
        public function getScript( ResourceLoaderContext $context ) {
                // Stub, override expected
@@ -142,7 +141,7 @@ abstract class ResourceLoaderModule {
         * MUST return either an only= URL or a non-load.php URL.
         *
         * @param ResourceLoaderContext $context
-        * @return array: Array of URLs
+        * @return array Array of URLs
         */
        public function getScriptURLsForDebug( ResourceLoaderContext $context ) {
                $url = ResourceLoader::makeLoaderURL(
@@ -173,7 +172,7 @@ abstract class ResourceLoaderModule {
         * Get all CSS for this module for a given skin.
         *
         * @param ResourceLoaderContext $context
-        * @return array: List of CSS strings or array of CSS strings keyed by media type.
+        * @return array List of CSS strings or array of CSS strings keyed by media type.
         *  like array( 'screen' => '.foo { width: 0 }' );
         *  or array( 'screen' => array( '.foo { width: 0 }' ) );
         */
@@ -189,7 +188,7 @@ abstract class ResourceLoaderModule {
         * load the files directly. See also getScriptURLsForDebug()
         *
         * @param ResourceLoaderContext $context
-        * @return array: array( mediaType => array( URL1, URL2, ... ), ... )
+        * @return array array( mediaType => array( URL1, URL2, ... ), ... )
         */
        public function getStyleURLsForDebug( ResourceLoaderContext $context ) {
                $url = ResourceLoader::makeLoaderURL(
@@ -211,7 +210,7 @@ abstract class ResourceLoaderModule {
         *
         * To get a JSON blob with messages, use MessageBlobStore::get()
         *
-        * @return array: List of message keys. Keys may occur more than once
+        * @return array List of message keys. Keys may occur more than once
         */
        public function getMessages() {
                // Stub, override expected
@@ -221,7 +220,7 @@ abstract class ResourceLoaderModule {
        /**
         * Get the group this module is in.
         *
-        * @return string: Group name
+        * @return string Group name
         */
        public function getGroup() {
                // Stub, override expected
@@ -231,7 +230,7 @@ abstract class ResourceLoaderModule {
        /**
         * Get the origin of this module. Should only be overridden for foreign modules.
         *
-        * @return string: Origin name, 'local' for local modules
+        * @return string Origin name, 'local' for local modules
         */
        public function getSource() {
                // Stub, override expected
@@ -263,7 +262,7 @@ abstract class ResourceLoaderModule {
        /**
         * Get the loader JS for this module, if set.
         *
-        * @return mixed: JavaScript loader code as a string or boolean false if no custom loader set
+        * @return mixed JavaScript loader code as a string or boolean false if no custom loader set
         */
        public function getLoaderScript() {
                // Stub, override expected
@@ -278,7 +277,7 @@ abstract class ResourceLoaderModule {
         *
         * To add dependencies dynamically on the client side, use a custom
         * loader script, see getLoaderScript()
-        * @return array: List of module names as strings
+        * @return array List of module names as strings
         */
        public function getDependencies() {
                // Stub, override expected
@@ -288,7 +287,7 @@ abstract class ResourceLoaderModule {
        /**
         * Get target(s) for the module, eg ['desktop'] or ['desktop', 'mobile']
         *
-        * @return array: Array of strings
+        * @return array Array of strings
         */
        public function getTargets() {
                return $this->targets;
@@ -299,7 +298,7 @@ abstract class ResourceLoaderModule {
         * Currently these are only image files referenced by the module's CSS.
         *
         * @param string $skin Skin name
-        * @return array: List of files
+        * @return array List of files
         */
        public function getFileDependencies( $skin ) {
                // Try in-object cache first
@@ -335,7 +334,7 @@ abstract class ResourceLoaderModule {
         * Get the last modification timestamp of the message blob for this
         * module in a given language.
         * @param string $lang Language code
-        * @return int: UNIX timestamp, or 0 if the module doesn't have messages
+        * @return int UNIX timestamp, or 0 if the module doesn't have messages
         */
        public function getMsgBlobMtime( $lang ) {
                if ( !isset( $this->msgBlobMtime[$lang] ) ) {
@@ -363,7 +362,7 @@ abstract class ResourceLoaderModule {
         * Set a preloaded message blob last modification timestamp. Used so we
         * can load this information for all modules at once.
         * @param string $lang Language code
-        * @param $mtime Integer: UNIX timestamp or 0 if there is no such blob
+        * @param int $mtime UNIX timestamp or 0 if there is no such blob
         */
        public function setMsgBlobMtime( $lang, $mtime ) {
                $this->msgBlobMtime[$lang] = $mtime;
@@ -387,7 +386,7 @@ abstract class ResourceLoaderModule {
         * yourself and take its result into consideration.
         *
         * @param ResourceLoaderContext $context Context object
-        * @return integer UNIX timestamp
+        * @return int UNIX timestamp
         */
        public function getModifiedTime( ResourceLoaderContext $context ) {
                // 0 would mean now
@@ -398,7 +397,7 @@ abstract class ResourceLoaderModule {
         * Helper method for calculating when the module's hash (if it has one) changed.
         *
         * @param ResourceLoaderContext $context
-        * @return integer: UNIX timestamp or 0 if no hash was provided
+        * @return int UNIX timestamp or 0 if no hash was provided
         *  by getModifiedHash()
         */
        public function getHashMtime( ResourceLoaderContext $context ) {
@@ -432,7 +431,7 @@ abstract class ResourceLoaderModule {
         * use of getHashMTime() inside getModifiedTime().
         *
         * @param ResourceLoaderContext $context
-        * @return string|null: Hash
+        * @return string|null Hash
         */
        public function getModifiedHash( ResourceLoaderContext $context ) {
                return null;
@@ -441,7 +440,9 @@ abstract class ResourceLoaderModule {
        /**
         * Helper method for calculating when this module's definition summary was last changed.
         *
-        * @return integer: UNIX timestamp or 0 if no definition summary was provided
+        * @since 1.23
+        *
+        * @return int UNIX timestamp or 0 if no definition summary was provided
         *  by getDefinitionSummary()
         */
        public function getDefinitionMtime( ResourceLoaderContext $context ) {
@@ -474,7 +475,8 @@ abstract class ResourceLoaderModule {
                        return $data;
                }
 
-               wfDebugLog( 'resourceloader', __METHOD__ . ": New definition hash for module {$this->getName()} in context {$context->getHash()}: $hash." );
+               wfDebugLog( 'resourceloader', __METHOD__ . ": New definition hash for module "
+                       . "{$this->getName()} in context {$context->getHash()}: $hash." );
 
                $timestamp = time();
                $cache->set( $key, $timestamp );
@@ -505,7 +507,9 @@ abstract class ResourceLoaderModule {
         * contain arrays and scalars as values (avoid object instances) which means
         * it requires abstraction.
         *
-        * @return Array|null
+        * @since 1.23
+        *
+        * @return array|null
         */
        public function getDefinitionSummary( ResourceLoaderContext $context ) {
                return array(
@@ -536,7 +540,7 @@ abstract class ResourceLoaderModule {
         *
         * @param string $fileName
         * @param string $contents
-        * @return string: JS with the original, or a replacement error
+        * @return string JS with the original, or a replacement error
         */
        protected function validateScriptFile( $fileName, $contents ) {
                global $wgResourceLoaderValidateJS;
index bd026f3..61927d7 100644 (file)
@@ -33,9 +33,9 @@ class ResourceLoaderNoscriptModule extends ResourceLoaderWikiModule {
         * Gets list of pages used by this module.  Obviously, it makes absolutely no
         * sense to include JavaScript files here... :D
         *
-        * @param $context ResourceLoaderContext
+        * @param ResourceLoaderContext $context
         *
-        * @return Array: List of pages
+        * @return array List of pages
         */
        protected function getPages( ResourceLoaderContext $context ) {
                return array( 'MediaWiki:Noscript.css' => array( 'type' => 'style' ) );
@@ -46,7 +46,7 @@ class ResourceLoaderNoscriptModule extends ResourceLoaderWikiModule {
        /**
         * Gets group name
         *
-        * @return String: Name of group
+        * @return string Name of group
         */
        public function getGroup() {
                return 'noscript';
index 05754d3..d28f40f 100644 (file)
@@ -32,9 +32,9 @@ class ResourceLoaderSiteModule extends ResourceLoaderWikiModule {
        /**
         * Gets list of pages used by this module
         *
-        * @param $context ResourceLoaderContext
+        * @param ResourceLoaderContext $context
         *
-        * @return Array: List of pages
+        * @return array List of pages
         */
        protected function getPages( ResourceLoaderContext $context ) {
                global $wgUseSiteJs, $wgUseSiteCss;
@@ -58,7 +58,7 @@ class ResourceLoaderSiteModule extends ResourceLoaderWikiModule {
        /**
         * Gets group name
         *
-        * @return String: Name of group
+        * @return string Name of group
         */
        public function getGroup() {
                return 'site';
index 005081c..63a444b 100644 (file)
@@ -44,11 +44,12 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                }
 
                global $wgLoadScript, $wgScript, $wgStylePath, $wgScriptExtension,
-                       $wgArticlePath, $wgScriptPath, $wgServer, $wgContLang,
-                       $wgVariantArticlePath, $wgActionPaths, $wgVersion,
+                       $wgArticlePath, $wgScriptPath, $wgServer, $wgServerName,
+                       $wgContLang, $wgVariantArticlePath, $wgActionPaths, $wgVersion,
                        $wgEnableAPI, $wgEnableWriteAPI, $wgDBname,
                        $wgSitename, $wgFileExtensions, $wgExtensionAssetsPath,
-                       $wgCookiePrefix, $wgResourceLoaderMaxQueryLength,
+                       $wgCookiePrefix, $wgCookieDomain, $wgCookiePath,
+                       $wgCookieExpiration, $wgResourceLoaderMaxQueryLength,
                        $wgResourceLoaderStorageEnabled, $wgResourceLoaderStorageVersion,
                        $wgSearchType;
 
@@ -85,6 +86,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                        // becoming [] instead of {} in JS (bug 34604)
                        'wgActionPaths' => (object)$wgActionPaths,
                        'wgServer' => $wgServer,
+                       'wgServerName' => $wgServerName,
                        'wgUserLanguage' => $context->getLanguage(),
                        'wgContentLanguage' => $wgContLang->getCode(),
                        'wgVersion' => $wgVersion,
@@ -104,6 +106,9 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                        'wgExtensionAssetsPath' => $wgExtensionAssetsPath,
                        // MediaWiki sets cookies to have this prefix by default
                        'wgCookiePrefix' => $wgCookiePrefix,
+                       'wgCookieDomain' => $wgCookieDomain,
+                       'wgCookiePath' => $wgCookiePath,
+                       'wgCookieExpiration' => $wgCookieExpiration,
                        'wgResourceLoaderMaxQueryLength' => $wgResourceLoaderMaxQueryLength,
                        'wgCaseSensitiveNamespaces' => $caseSensitiveNamespaces,
                        'wgLegalTitleChars' => Title::convertByteClassToUnicodeClass( Title::legalChars() ),
@@ -117,10 +122,79 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                return $this->configVars[$hash];
        }
 
+       /**
+        * Recursively get all explicit and implicit dependencies for to the given module.
+        *
+        * @param array $registryData
+        * @param string $moduleName
+        * @return array
+        */
+       protected static function getImplicitDependencies( Array $registryData, $moduleName ) {
+               static $dependencyCache = array();
+
+               // The list of implicit dependencies won't be altered, so we can
+               // cache them without having to worry.
+               if ( !isset( $dependencyCache[$moduleName] ) ) {
+
+                       if ( !isset( $registryData[$moduleName] ) ) {
+                               // Dependencies may not exist
+                               $dependencyCache[$moduleName] = array();
+                       } else {
+                               $data = $registryData[$moduleName];
+                               $dependencyCache[$moduleName] = $data['dependencies'];
+
+                               foreach ( $data['dependencies'] as $dependency ) {
+                                       // Recursively get the dependencies of the dependencies
+                                       $dependencyCache[$moduleName] = array_merge(
+                                               $dependencyCache[$moduleName],
+                                               self::getImplicitDependencies( $registryData, $dependency )
+                                       );
+                               }
+                       }
+               }
+
+               return $dependencyCache[$moduleName];
+       }
+
+       /**
+        * Optimize the dependency tree in $this->modules and return it.
+        *
+        * The optimization basically works like this:
+        *      Given we have module A with the dependencies B and C
+        *              and module B with the dependency C.
+        *      Now we don't have to tell the client to explicitly fetch module
+        *              C as that's already included in module B.
+        *
+        * This way we can reasonably reduce the amout of module registration
+        * data send to the client.
+        *
+        * @param Array &$registryData Modules keyed by name with properties:
+        *  - string 'version'
+        *  - array 'dependencies'
+        *  - string|null 'group'
+        *  - string 'source'
+        *  - string|false 'loader'
+        */
+       public static function compileUnresolvedDependencies( Array &$registryData ) {
+               foreach ( $registryData as $name => &$data ) {
+                       if ( $data['loader'] !== false ) {
+                               continue;
+                       }
+                       $dependencies = $data['dependencies'];
+                       foreach ( $data['dependencies'] as $dependency ) {
+                               $implicitDependencies = self::getImplicitDependencies( $registryData, $dependency );
+                               $dependencies = array_diff( $dependencies, $implicitDependencies );
+                       }
+                       // Rebuild keys
+                       $data['dependencies'] = array_values( $dependencies );
+               }
+       }
+
+
        /**
         * Get registration code for all modules.
         *
-        * @param ResourceLoaderContext $context object
+        * @param ResourceLoaderContext $context
         * @return string JavaScript code for registering all modules with the client loader
         */
        public static function getModuleRegistrations( ResourceLoaderContext $context ) {
@@ -157,6 +231,8 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                        );
                }
 
+               self::compileUnresolvedDependencies( $registryData );
+
                // Register sources
                $out .= ResourceLoader::makeLoaderSourcesScript( $resourceLoader->getSources() );
 
@@ -238,7 +314,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
        public static function getStartupModulesUrl( ResourceLoaderContext $context ) {
                // The core modules:
                $moduleNames = array( 'jquery', 'mediawiki' );
-               wfRunHooks( 'ResourceLoaderGetStartupModules', array( &$moduleNames ) );
+               wfRunHooks( 'ResourceLoaderGetStartupModules', array( &$moduleNames ), '1.23' );
 
                // Get the latest version
                $loader = $context->getResourceLoader();
@@ -345,8 +421,8 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
         *
         * Detect changes to mw.config settings embedded in #getScript (bug 28899).
         *
-        * @param $context ResourceLoaderContext
-        * @return string: Hash
+        * @param ResourceLoaderContext $context
+        * @return string Hash
         */
        public function getModifiedHash( ResourceLoaderContext $context ) {
                global $wgLegacyJavaScriptGlobals;
index 8ce0ca7..082a65c 100644 (file)
@@ -36,8 +36,8 @@ class ResourceLoaderUserCSSPrefsModule extends ResourceLoaderModule {
        /* Methods */
 
        /**
-        * @param $context ResourceLoaderContext
-        * @return array|int|Mixed
+        * @param ResourceLoaderContext $context
+        * @return array|int|mixed
         */
        public function getModifiedTime( ResourceLoaderContext $context ) {
                $hash = $context->getHash();
@@ -50,7 +50,7 @@ class ResourceLoaderUserCSSPrefsModule extends ResourceLoaderModule {
        }
 
        /**
-        * @param $context ResourceLoaderContext
+        * @param ResourceLoaderContext $context
         * @return array
         */
        public function getStyles( ResourceLoaderContext $context ) {
index 6757d39..680c74c 100644 (file)
@@ -33,7 +33,7 @@ class ResourceLoaderUserGroupsModule extends ResourceLoaderWikiModule {
        /* Protected Methods */
 
        /**
-        * @param $context ResourceLoaderContext
+        * @param ResourceLoaderContext $context
         * @return array
         */
        protected function getPages( ResourceLoaderContext $context ) {
index 7454b65..90b4838 100644 (file)
@@ -34,7 +34,7 @@ class ResourceLoaderUserModule extends ResourceLoaderWikiModule {
        /* Protected Methods */
 
        /**
-        * @param $context ResourceLoaderContext
+        * @param ResourceLoaderContext $context
         * @return array
         */
        protected function getPages( ResourceLoaderContext $context ) {
index 3686bea..bd97a8e 100644 (file)
@@ -38,8 +38,8 @@ class ResourceLoaderUserOptionsModule extends ResourceLoaderModule {
        /* Methods */
 
        /**
-        * @param $context ResourceLoaderContext
-        * @return array|int|Mixed
+        * @param ResourceLoaderContext $context
+        * @return array|int|mixed
         */
        public function getModifiedTime( ResourceLoaderContext $context ) {
                $hash = $context->getHash();
@@ -52,7 +52,7 @@ class ResourceLoaderUserOptionsModule extends ResourceLoaderModule {
        }
 
        /**
-        * @param $context ResourceLoaderContext
+        * @param ResourceLoaderContext $context
         * @return string
         */
        public function getScript( ResourceLoaderContext $context ) {
index cdc9611..e652422 100644 (file)
@@ -37,7 +37,7 @@ class ResourceLoaderUserTokensModule extends ResourceLoaderModule {
        /**
         * Fetch the tokens for the current user.
         *
-        * @return array: List of tokens keyed by token type
+        * @return array List of tokens keyed by token type
         */
        protected function contextUserTokens() {
                global $wgUser;
@@ -50,7 +50,7 @@ class ResourceLoaderUserTokensModule extends ResourceLoaderModule {
        }
 
        /**
-        * @param $context ResourceLoaderContext
+        * @param ResourceLoaderContext $context
         * @return string
         */
        public function getScript( ResourceLoaderContext $context ) {
index f275a6b..bfb3c42 100644 (file)
@@ -54,7 +54,7 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule {
         * There is an optional media key, the value of which can be the
         * medium ('screen', 'print', etc.) of the stylesheet.
         *
-        * @param $context ResourceLoaderContext
+        * @param ResourceLoaderContext $context
         * @return array
         */
        abstract protected function getPages( ResourceLoaderContext $context );
@@ -77,7 +77,7 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule {
        }
 
        /**
-        * @param $title Title
+        * @param Title $title
         * @return null|string
         */
        protected function getContent( $title ) {
@@ -109,7 +109,7 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule {
        /* Methods */
 
        /**
-        * @param $context ResourceLoaderContext
+        * @param ResourceLoaderContext $context
         * @return string
         */
        public function getScript( ResourceLoaderContext $context ) {
@@ -132,7 +132,7 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule {
        }
 
        /**
-        * @param $context ResourceLoaderContext
+        * @param ResourceLoaderContext $context
         * @return array
         */
        public function getStyles( ResourceLoaderContext $context ) {
@@ -166,7 +166,7 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule {
        }
 
        /**
-        * @param $context ResourceLoaderContext
+        * @param ResourceLoaderContext $context
         * @return int|mixed
         */
        public function getModifiedTime( ResourceLoaderContext $context ) {
@@ -186,7 +186,7 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule {
        /**
         * Get the definition summary for this module.
         *
-        * @return Array
+        * @return array
         */
        public function getDefinitionSummary( ResourceLoaderContext $context ) {
                return array(
@@ -196,7 +196,7 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule {
        }
 
        /**
-        * @param $context ResourceLoaderContext
+        * @param ResourceLoaderContext $context
         * @return bool
         */
        public function isKnownEmpty( ResourceLoaderContext $context ) {
@@ -206,7 +206,7 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule {
        /**
         * Get the modification times of all titles that would be loaded for
         * a given context.
-        * @param $context ResourceLoaderContext: Context object
+        * @param ResourceLoaderContext $context Context object
         * @return array( prefixed DB key => UNIX timestamp ), nonexistent titles are dropped
         */
        protected function getTitleMtimes( ResourceLoaderContext $context ) {
index 7992882..fbfe325 100644 (file)
@@ -28,9 +28,9 @@
  * 'archive' table for traditionally-deleted revisions that have an
  * ar_rev_id saved.
  *
- * See RevDel_RevisionItem and RevDel_ArchivedRevisionItem for items.
+ * See RevDelRevisionItem and RevDelArchivedRevisionItem for items.
  */
-class RevDel_RevisionList extends RevDel_List {
+class RevDelRevisionList extends RevDelList {
        var $currentRevId;
 
        public function getType() {
@@ -55,7 +55,7 @@ class RevDel_RevisionList extends RevDel_List {
        }
 
        /**
-        * @param $db DatabaseBase
+        * @param DatabaseBase $db
         * @return mixed
         */
        public function doQuery( $db ) {
@@ -80,7 +80,7 @@ class RevDel_RevisionList extends RevDel_List {
                }
 
                // Check if any requested revisions are available fully deleted.
-               $archived = $db->select( array( 'archive' ), '*',
+               $archived = $db->select( array( 'archive' ), Revision::selectArchiveFields(),
                        array(
                                'ar_rev_id' => $ids
                        ),
@@ -108,12 +108,12 @@ class RevDel_RevisionList extends RevDel_List {
 
        public function newItem( $row ) {
                if ( isset( $row->rev_id ) ) {
-                       return new RevDel_RevisionItem( $this, $row );
+                       return new RevDelRevisionItem( $this, $row );
                } elseif ( isset( $row->ar_rev_id ) ) {
-                       return new RevDel_ArchivedRevisionItem( $this, $row );
+                       return new RevDelArchivedRevisionItem( $this, $row );
                } else {
                        // This shouldn't happen. :)
-                       throw new MWException( 'Invalid row type in RevDel_RevisionList' );
+                       throw new MWException( 'Invalid row type in RevDelRevisionList' );
                }
        }
 
@@ -146,7 +146,7 @@ class RevDel_RevisionList extends RevDel_List {
 /**
  * Item class for a live revision table row
  */
-class RevDel_RevisionItem extends RevDel_Item {
+class RevDelRevisionItem extends RevDelItem {
        var $revision;
 
        public function __construct( $list, $row ) {
@@ -167,7 +167,7 @@ class RevDel_RevisionItem extends RevDel_Item {
        }
 
        public function getAuthorNameField() {
-               return 'user_name'; // see Revision::selectUserFields()
+               return 'rev_user_text';
        }
 
        public function canView() {
@@ -225,7 +225,7 @@ class RevDel_RevisionItem extends RevDel_Item {
 
        /**
         * Get the HTML link to the revision text.
-        * Overridden by RevDel_ArchiveItem.
+        * Overridden by RevDelArchiveItem.
         * @return string
         */
        protected function getRevisionLink() {
@@ -248,7 +248,7 @@ class RevDel_RevisionItem extends RevDel_Item {
 
        /**
         * Get the HTML link to the diff.
-        * Overridden by RevDel_ArchiveItem
+        * Overridden by RevDelArchiveItem
         * @return string
         */
        protected function getDiffLink() {
@@ -308,7 +308,7 @@ class RevDel_RevisionItem extends RevDel_Item {
 /**
  * List for archive table items, i.e. revisions deleted via action=delete
  */
-class RevDel_ArchiveList extends RevDel_RevisionList {
+class RevDelArchiveList extends RevDelRevisionList {
        public function getType() {
                return 'archive';
        }
@@ -318,7 +318,7 @@ class RevDel_ArchiveList extends RevDel_RevisionList {
        }
 
        /**
-        * @param $db DatabaseBase
+        * @param DatabaseBase $db
         * @return mixed
         */
        public function doQuery( $db ) {
@@ -326,7 +326,7 @@ class RevDel_ArchiveList extends RevDel_RevisionList {
                foreach ( $this->ids as $id ) {
                        $timestamps[] = $db->timestamp( $id );
                }
-               return $db->select( 'archive', '*',
+               return $db->select( 'archive', Revision::selectArchiveFields(),
                                array(
                                        'ar_namespace' => $this->title->getNamespace(),
                                        'ar_title' => $this->title->getDBkey(),
@@ -338,7 +338,7 @@ class RevDel_ArchiveList extends RevDel_RevisionList {
        }
 
        public function newItem( $row ) {
-               return new RevDel_ArchiveItem( $this, $row );
+               return new RevDelArchiveItem( $this, $row );
        }
 
        public function doPreCommitUpdates() {
@@ -353,9 +353,9 @@ class RevDel_ArchiveList extends RevDel_RevisionList {
 /**
  * Item class for a archive table row
  */
-class RevDel_ArchiveItem extends RevDel_RevisionItem {
+class RevDelArchiveItem extends RevDelRevisionItem {
        public function __construct( $list, $row ) {
-               RevDel_Item::__construct( $list, $row );
+               RevDelItem::__construct( $list, $row );
                $this->revision = Revision::newFromArchiveRow( $row,
                        array( 'page' => $this->list->title->getArticleID() ) );
        }
@@ -436,11 +436,11 @@ class RevDel_ArchiveItem extends RevDel_RevisionItem {
 
 /**
  * Item class for a archive table row by ar_rev_id -- actually
- * used via RevDel_RevisionList.
+ * used via RevDelRevisionList.
  */
-class RevDel_ArchivedRevisionItem extends RevDel_ArchiveItem {
+class RevDelArchivedRevisionItem extends RevDelArchiveItem {
        public function __construct( $list, $row ) {
-               RevDel_Item::__construct( $list, $row );
+               RevDelItem::__construct( $list, $row );
 
                $this->revision = Revision::newFromArchiveRow( $row,
                        array( 'page' => $this->list->title->getArticleID() ) );
@@ -469,7 +469,7 @@ class RevDel_ArchivedRevisionItem extends RevDel_ArchiveItem {
 /**
  * List for oldimage table items
  */
-class RevDel_FileList extends RevDel_List {
+class RevDelFileList extends RevDelList {
        public function getType() {
                return 'oldimage';
        }
@@ -489,7 +489,7 @@ class RevDel_FileList extends RevDel_List {
        var $storeBatch, $deleteBatch, $cleanupBatch;
 
        /**
-        * @param $db DatabaseBase
+        * @param DatabaseBase $db
         * @return mixed
         */
        public function doQuery( $db ) {
@@ -510,7 +510,7 @@ class RevDel_FileList extends RevDel_List {
        }
 
        public function newItem( $row ) {
-               return new RevDel_FileItem( $this, $row );
+               return new RevDelFileItem( $this, $row );
        }
 
        public function clearFileOps() {
@@ -568,7 +568,7 @@ class RevDel_FileList extends RevDel_List {
 /**
  * Item class for an oldimage table row
  */
-class RevDel_FileItem extends RevDel_Item {
+class RevDelFileItem extends RevDelItem {
 
        /**
         * @var File
@@ -657,7 +657,7 @@ class RevDel_FileItem extends RevDel_Item {
 
        /**
         * Get the link to the file.
-        * Overridden by RevDel_ArchivedFileItem.
+        * Overridden by RevDelArchivedFileItem.
         * @return string
         */
        protected function getLink() {
@@ -782,7 +782,7 @@ class RevDel_FileItem extends RevDel_Item {
 /**
  * List for filearchive table items
  */
-class RevDel_ArchivedFileList extends RevDel_FileList {
+class RevDelArchivedFileList extends RevDelFileList {
        public function getType() {
                return 'filearchive';
        }
@@ -792,7 +792,7 @@ class RevDel_ArchivedFileList extends RevDel_FileList {
        }
 
        /**
-        * @param $db DatabaseBase
+        * @param DatabaseBase $db
         * @return mixed
         */
        public function doQuery( $db ) {
@@ -810,16 +810,16 @@ class RevDel_ArchivedFileList extends RevDel_FileList {
        }
 
        public function newItem( $row ) {
-               return new RevDel_ArchivedFileItem( $this, $row );
+               return new RevDelArchivedFileItem( $this, $row );
        }
 }
 
 /**
  * Item class for a filearchive table row
  */
-class RevDel_ArchivedFileItem extends RevDel_FileItem {
+class RevDelArchivedFileItem extends RevDelFileItem {
        public function __construct( $list, $row ) {
-               RevDel_Item::__construct( $list, $row );
+               RevDelItem::__construct( $list, $row );
                $this->file = ArchivedFile::newFromRow( $row );
        }
 
@@ -884,7 +884,7 @@ class RevDel_ArchivedFileItem extends RevDel_FileItem {
 /**
  * List for logging table items
  */
-class RevDel_LogList extends RevDel_List {
+class RevDelLogList extends RevDelList {
        public function getType() {
                return 'logging';
        }
@@ -916,12 +916,25 @@ class RevDel_LogList extends RevDel_List {
        }
 
        /**
-        * @param $db DatabaseBase
+        * @param DatabaseBase $db
         * @return mixed
         */
        public function doQuery( $db ) {
                $ids = array_map( 'intval', $this->ids );
-               return $db->select( 'logging', '*',
+               return $db->select( 'logging', array(
+                               'log_id',
+                               'log_type',
+                               'log_action',
+                               'log_timestamp',
+                               'log_user',
+                               'log_user_text',
+                               'log_namespace',
+                               'log_title',
+                               'log_page',
+                               'log_comment',
+                               'log_params',
+                               'log_deleted'
+                       ),
                        array( 'log_id' => $ids ),
                        __METHOD__,
                        array( 'ORDER BY' => 'log_id DESC' )
@@ -929,7 +942,7 @@ class RevDel_LogList extends RevDel_List {
        }
 
        public function newItem( $row ) {
-               return new RevDel_LogItem( $this, $row );
+               return new RevDelLogItem( $this, $row );
        }
 
        public function getSuppressBit() {
@@ -952,7 +965,7 @@ class RevDel_LogList extends RevDel_List {
 /**
  * Item class for a logging table row
  */
-class RevDel_LogItem extends RevDel_Item {
+class RevDelLogItem extends RevDelItem {
        public function getIdField() {
                return 'log_id';
        }
index 3874602..4dc9388 100644 (file)
 /**
  * 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 RevDel_Item subclasses wrapping them, and
+ * relevant rows, to return RevDelItem subclasses wrapping them, and
  * to wrap bulk update operations.
  */
-abstract class RevDel_List extends RevisionListBase {
+abstract class RevDelList extends RevisionListBase {
        function __construct( IContextSource $context, Title $title, array $ids ) {
                parent::__construct( $context, $title );
                $this->ids = $ids;
@@ -315,7 +315,7 @@ abstract class RevDel_List extends RevisionListBase {
 /**
  * Abstract base class for deletable items
  */
-abstract class RevDel_Item extends RevisionItemBase {
+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
@@ -339,7 +339,7 @@ abstract class RevDel_Item extends RevisionItemBase {
         * If the update fails because it did not match, the function should return
         * false. This prevents concurrency problems.
         *
-        * @return boolean success
+        * @return bool Success
         */
        abstract public function setBits( $newBits );
 
index b0b2253..7b82b7b 100644 (file)
@@ -33,10 +33,10 @@ class RevisionDeleteUser {
 
        /**
         * Update *_deleted bitfields in various tables to hide or unhide usernames
-        * @param $name String username
-        * @param $userId Int user id
-        * @param $op String operator '|' or '&'
-        * @param $dbw null|DatabaseBase, if you happen to have one lying around
+        * @param string $name Username
+        * @param int $userId User id
+        * @param string $op Operator '|' or '&'
+        * @param null|DatabaseBase $dbw If you happen to have one lying around
         * @return bool
         */
        private static function setUsernameBitfields( $name, $userId, $op, $dbw ) {
index bea8460..e42301b 100644 (file)
 class RevisionDeleter {
        /** List of known revdel types, with their corresponding list classes */
        private static $allowedTypes = array(
-               'revision' => 'RevDel_RevisionList',
-               'archive' => 'RevDel_ArchiveList',
-               'oldimage' => 'RevDel_FileList',
-               'filearchive' => 'RevDel_ArchivedFileList',
-               'logging' => 'RevDel_LogList',
+               'revision' => 'RevDelRevisionList',
+               'archive' => 'RevDelArchiveList',
+               'oldimage' => 'RevDelFileList',
+               'filearchive' => 'RevDelArchivedFileList',
+               'logging' => 'RevDelLogList',
        );
 
        /** Type map to support old log entries */
@@ -77,7 +77,7 @@ class RevisionDeleter {
         * @param IContextSource $context
         * @param Title $title
         * @param array $ids
-        * @return RevDel_List
+        * @return RevDelList
         */
        public static function createList( $typeName, IContextSource $context, Title $title, array $ids ) {
                $typeName = self::getCanonicalTypeName( $typeName );
@@ -93,10 +93,10 @@ class RevisionDeleter {
         *
         * @param string $desc description to add to the array if the option was
         * enabled / disabled.
-        * @param $field Integer: the bitmask describing the single option.
-        * @param $diff Integer: the xor of the old and new bitfields.
-        * @param $new Integer: the new bitfield
-        * @param array $arr the array to update.
+        * @param int $field The bitmask describing the single option.
+        * @param int $diff The xor of the old and new bitfields.
+        * @param int $new The new bitfield
+        * @param array $arr The array to update.
         */
        protected static function checkItem( $desc, $field, $diff, $new, &$arr ) {
                if ( $diff & $field ) {
@@ -117,8 +117,8 @@ class RevisionDeleter {
         * You can turn the keys in $arr[0] and $arr[1] into message keys by
         * appending -hid and and -unhid to the keys respectively.
         *
-        * @param $n Integer: the new bitfield.
-        * @param $o Integer: the old bitfield.
+        * @param int $n The new bitfield.
+        * @param int $o The old bitfield.
         * @return array An array as described above.
         * @since 1.19 public
         */
@@ -206,8 +206,8 @@ class RevisionDeleter {
         * If it doesn't, returns the corresponding ar_timestamp field
         * so that this key can be used instead.
         *
-        * @param $title Title
-        * @param $revid
+        * @param Title $title
+        * @param int $revid
         * @return bool|mixed
         */
        public static function checkRevisionExistence( $title, $revid ) {
@@ -230,8 +230,8 @@ class RevisionDeleter {
        /**
         * Put together a rev_deleted bitfield
         * @since 1.22
-        * @param array $bitPars extractBitParams() params
-        * @param int $oldfield current bitfield
+        * @param array $bitPars ExtractBitParams() params
+        * @param int $oldfield Current bitfield
         * @return array
         */
        public static function extractBitfield( $bitPars, $oldfield ) {
index 687f9a4..3d0655b 100644 (file)
  * @ingroup Search
  */
 class SearchEngine {
-       var $limit = 10;
-       var $offset = 0;
-       var $prefix = '';
-       var $searchTerms = array();
-       var $namespaces = array( NS_MAIN );
+       /** @var string */
+       public $prefix = '';
+
+       /** @var int[] */
+       public $namespaces = array( NS_MAIN );
+
+       /** @var int */
+       protected $limit = 10;
+
+       /** @var int */
+       protected $offset = 0;
+
+       /** @var array|string */
+       protected $searchTerms = array();
+
+       /** @var bool */
        protected $showSuggestion = true;
 
-       /** @var Array Feature values */
+       /** @var array Feature values */
        protected $features = array();
 
        /**
@@ -45,7 +56,7 @@ class SearchEngine {
         * If title searches are not supported or disabled, return null.
         * STUB
         *
-        * @param string $term raw search term
+        * @param string $term Raw search term
         * @return SearchResultSet|Status|null
         */
        function searchText( $term ) {
@@ -57,7 +68,7 @@ class SearchEngine {
         * If title searches are not supported or disabled, return null.
         * STUB
         *
-        * @param string $term raw search term
+        * @param string $term Raw search term
         * @return SearchResultSet|null
         */
        function searchTitle( $term ) {
@@ -66,8 +77,8 @@ class SearchEngine {
 
        /**
         * @since 1.18
-        * @param $feature String
-        * @return Boolean
+        * @param string $feature
+        * @return bool
         */
        public function supports( $feature ) {
                switch ( $feature ) {
@@ -82,8 +93,8 @@ class SearchEngine {
        /**
         * Way to pass custom data for engines
         * @since 1.18
-        * @param $feature String
-        * @param $data Mixed
+        * @param string $feature
+        * @param mixed $data
         * @return bool
         */
        public function setFeatureData( $feature, $data ) {
@@ -106,8 +117,9 @@ class SearchEngine {
        }
 
        /**
-        * Transform search term in cases when parts of the query came as different GET params (when supported)
-        * e.g. for prefix queries: search=test&prefix=Main_Page/Archive -> test prefix:Main Page/Archive
+        * Transform search term in cases when parts of the query came as different
+        * GET params (when supported), e.g. for prefix queries:
+        * search=test&prefix=Main_Page/Archive -> test prefix:Main Page/Archive
         */
        function transformSearchTerm( $term ) {
                return $term;
@@ -117,7 +129,7 @@ class SearchEngine {
         * If an exact title match can be found, or a very slightly close match,
         * return the title. If no match, returns NULL.
         *
-        * @param $searchterm String
+        * @param string $searchterm
         * @return Title
         */
        public static function getNearMatch( $searchterm ) {
@@ -131,7 +143,7 @@ class SearchEngine {
         * Do a near match (see SearchEngine::getNearMatch) and wrap it into a
         * SearchResultSet.
         *
-        * @param $searchterm string
+        * @param string $searchterm
         * @return SearchResultSet
         */
        public static function getNearMatchResultSet( $searchterm ) {
@@ -148,7 +160,10 @@ class SearchEngine {
                $allSearchTerms = array( $searchterm );
 
                if ( $wgContLang->hasVariants() ) {
-                       $allSearchTerms = array_merge( $allSearchTerms, $wgContLang->autoConvertToAllVariants( $searchterm ) );
+                       $allSearchTerms = array_merge(
+                               $allSearchTerms,
+                               $wgContLang->autoConvertToAllVariants( $searchterm )
+                       );
                }
 
                $titleResult = null;
@@ -262,8 +277,8 @@ class SearchEngine {
         * Set the maximum number of results to return
         * and how many to skip before returning the first.
         *
-        * @param $limit Integer
-        * @param $offset Integer
+        * @param int $limit
+        * @param int $offset
         */
        function setLimitOffset( $limit, $offset = 0 ) {
                $this->limit = intval( $limit );
@@ -274,7 +289,7 @@ class SearchEngine {
         * Set which namespaces the search should include.
         * Give an array of namespace index numbers.
         *
-        * @param $namespaces Array
+        * @param array $namespaces
         */
        function setNamespaces( $namespaces ) {
                $this->namespaces = $namespaces;
@@ -285,7 +300,7 @@ class SearchEngine {
         * don't support building a suggestion in the first place and others don't respect
         * this flag.
         *
-        * @param boolean $showSuggestion should the searcher try to build suggestions
+        * @param bool $showSuggestion Should the searcher try to build suggestions
         */
        function setShowSuggestion( $showSuggestion ) {
                $this->showSuggestion = $showSuggestion;
@@ -295,7 +310,7 @@ class SearchEngine {
         * Parse some common prefixes: all (search everything)
         * or namespace names
         *
-        * @param $query String
+        * @param string $query
         * @return string
         */
        function replacePrefixes( $query ) {
@@ -330,7 +345,7 @@ class SearchEngine {
 
        /**
         * Make a list of searchable namespaces and their canonical names.
-        * @return Array
+        * @return array
         */
        public static function searchableNamespaces() {
                global $wgContLang;
@@ -349,8 +364,8 @@ class SearchEngine {
         * Extract default namespaces to search from the given user's
         * settings, returning a list of index numbers.
         *
-        * @param $user User
-        * @return Array
+        * @param user $user
+        * @return array
         */
        public static function userNamespaces( $user ) {
                global $wgSearchEverythingOnlyLoggedIn;
@@ -378,7 +393,7 @@ class SearchEngine {
        /**
         * Find snippet highlight settings for all users
         *
-        * @return Array contextlines, contextchars
+        * @return array Contextlines, contextchars
         */
        public static function userHighlightPrefs() {
                $contextlines = 2; // Hardcode this. Old defaults sucked. :)
@@ -389,7 +404,7 @@ class SearchEngine {
        /**
         * An array of namespaces indexes to be searched by default
         *
-        * @return Array
+        * @return array
         */
        public static function defaultNamespaces() {
                global $wgNamespacesToBeSearchedDefault;
@@ -401,7 +416,7 @@ class SearchEngine {
         * Get a list of namespace names useful for showing in tooltips
         * and preferences
         *
-        * @param $namespaces Array
+        * @param array $namespaces
         * @return array
         */
        public static function namespacesAsText( $namespaces ) {
@@ -416,22 +431,11 @@ class SearchEngine {
                return $formatted;
        }
 
-       /**
-        * Return the help namespaces to be shown on Special:Search
-        *
-        * @return Array
-        */
-       public static function helpNamespaces() {
-               global $wgNamespacesToBeSearchedHelp;
-
-               return array_keys( $wgNamespacesToBeSearchedHelp, true );
-       }
-
        /**
         * Return a 'cleaned up' search string
         *
-        * @param $text String
-        * @return String
+        * @param string $text
+        * @return string
         */
        function filter( $text ) {
                $lc = $this->legalSearchChars();
@@ -442,7 +446,7 @@ class SearchEngine {
         * Load up the appropriate search engine class for the currently
         * active database backend, and return a configured instance.
         *
-        * @param String $type Type of search backend, if not the default
+        * @param string $type Type of search backend, if not the default
         * @return SearchEngine
         */
        public static function create( $type = null ) {
@@ -484,9 +488,9 @@ class SearchEngine {
         * Title and text should be pre-processed.
         * STUB
         *
-        * @param $id Integer
-        * @param $title String
-        * @param $text String
+        * @param int $id
+        * @param string $title
+        * @param string $text
         */
        function update( $id, $title, $text ) {
                // no-op
@@ -497,8 +501,8 @@ class SearchEngine {
         * Title should be pre-processed.
         * STUB
         *
-        * @param $id Integer
-        * @param $title String
+        * @param int $id
+        * @param string $title
         */
        function updateTitle( $id, $title ) {
                // no-op
@@ -509,8 +513,8 @@ class SearchEngine {
         * Title should be pre-processed.
         * STUB
         *
-        * @param Integer $id Page id that was deleted
-        * @param String $title Title of page that was deleted
+        * @param int $id Page id that was deleted
+        * @param string $title Title of page that was deleted
         */
        function delete( $id, $title ) {
                // no-op
@@ -519,10 +523,11 @@ class SearchEngine {
        /**
         * Get OpenSearch suggestion template
         *
-        * @return String
+        * @return string
         */
        public static function getOpenSearchTemplate() {
                global $wgOpenSearchTemplate, $wgCanonicalServer;
+
                if ( $wgOpenSearchTemplate ) {
                        return $wgOpenSearchTemplate;
                } else {
@@ -530,7 +535,9 @@ class SearchEngine {
                        if ( !$ns ) {
                                $ns = "0";
                        }
-                       return $wgCanonicalServer . wfScript( 'api' ) . '?action=opensearch&search={searchTerms}&namespace=' . $ns;
+
+                       return $wgCanonicalServer . wfScript( 'api' )
+                               . '?action=opensearch&search={searchTerms}&namespace=' . $ns;
                }
        }
 
index 4c8aea5..b8b2bae 100644 (file)
@@ -27,7 +27,7 @@
  * @ingroup Search
  */
 class SearchHighlighter {
-       var $mCleanWikitext = true;
+       protected $mCleanWikitext = true;
 
        function __construct( $cleanupWikitext = true ) {
                $this->mCleanWikitext = $cleanupWikitext;
@@ -36,15 +36,15 @@ class SearchHighlighter {
        /**
         * Default implementation of wikitext highlighting
         *
-        * @param $text String
-        * @param array $terms terms to highlight (unescaped)
-        * @param $contextlines Integer
-        * @param $contextchars Integer
-        * @return String
+        * @param string $text
+        * @param array $terms Terms to highlight (unescaped)
+        * @param int $contextlines
+        * @param int $contextchars
+        * @return string
         */
        public function highlightText( $text, $terms, $contextlines, $contextchars ) {
-               global $wgContLang;
-               global $wgSearchHighlightBoundaries;
+               global $wgContLang, $wgSearchHighlightBoundaries;
+
                $fname = __METHOD__;
 
                if ( $text == '' ) {
@@ -138,7 +138,11 @@ class SearchHighlighter {
                foreach ( $terms as $index => $term ) {
                        // manually do upper/lowercase stuff for utf-8 since PHP won't do it
                        if ( preg_match( '/[\x80-\xff]/', $term ) ) {
-                               $terms[$index] = preg_replace_callback( '/./us', array( $this, 'caseCallback' ), $terms[$index] );
+                               $terms[$index] = preg_replace_callback(
+                                       '/./us',
+                                       array( $this, 'caseCallback' ),
+                                       $terms[$index]
+                               );
                        } else {
                                $terms[$index] = $term;
                        }
@@ -229,7 +233,12 @@ class SearchHighlighter {
                        if ( $len < $targetchars - 20 ) {
                                // complete this line
                                if ( $len < strlen( $all[$index] ) ) {
-                                       $extended[$index] = $this->extract( $all[$index], $offsets[$index], $offsets[$index] + $targetchars, $offsets[$index] );
+                                       $extended[$index] = $this->extract(
+                                               $all[$index],
+                                               $offsets[$index],
+                                               $offsets[$index] + $targetchars,
+                                               $offsets[$index]
+                                       );
                                        $len = strlen( $extended[$index] );
                                }
 
@@ -254,7 +263,9 @@ class SearchHighlighter {
                foreach ( $snippets as $index => $line ) {
                        if ( $last == - 1 ) {
                                $extract .= $line; // first line
-                       } elseif ( $last + 1 == $index && $offsets[$last] + strlen( $snippets[$last] ) >= strlen( $all[$last] ) ) {
+                       } elseif ( $last + 1 == $index
+                               && $offsets[$last] + strlen( $snippets[$last] ) >= strlen( $all[$last] )
+                       ) {
                                $extract .= " " . $line; // continous lines
                        } else {
                                $extract .= '<b> ... </b>' . $line;
@@ -285,8 +296,8 @@ class SearchHighlighter {
         * Split text into lines and add it to extracts array
         *
         * @param array $extracts index -> $line
-        * @param $count Integer
-        * @param $text String
+        * @param int $count
+        * @param string $text
         */
        function splitAndAdd( &$extracts, &$count, $text ) {
                $split = explode( "\n", $this->mCleanWikitext ? $this->removeWiki( $text ) : $text );
@@ -301,7 +312,7 @@ class SearchHighlighter {
        /**
         * Do manual case conversion for non-ascii chars
         *
-        * @param $matches Array
+        * @param array $matches
         * @return string
         */
        function caseCallback( $matches ) {
@@ -316,12 +327,12 @@ class SearchHighlighter {
        /**
         * Extract part of the text from start to end, but by
         * not chopping up words
-        * @param $text String
-        * @param $start Integer
-        * @param $end Integer
-        * @param $posStart Integer: (out) actual start position
-        * @param $posEnd Integer: (out) actual end position
-        * @return String
+        * @param string $text
+        * @param int $start
+        * @param int $end
+        * @param int $posStart (out) actual start position
+        * @param int $posEnd (out) actual end position
+        * @return string
         */
        function extract( $text, $start, $end, &$posStart = null, &$posEnd = null ) {
                if ( $start != 0 ) {
@@ -350,17 +361,23 @@ class SearchHighlighter {
        /**
         * Find a nonletter near a point (index) in the text
         *
-        * @param $text String
-        * @param $point Integer
-        * @param $offset Integer: offset to found index
-        * @return Integer: nearest nonletter index, or beginning of utf8 char if none
+        * @param string $text
+        * @param int $point
+        * @param int $offset Offset to found index
+        * @return int Nearest nonletter index, or beginning of utf8 char if none
         */
        function position( $text, $point, $offset = 0 ) {
                $tolerance = 10;
                $s = max( 0, $point - $tolerance );
                $l = min( strlen( $text ), $point + $tolerance ) - $s;
                $m = array();
-               if ( preg_match( '/[ ,.!?~!@#$%^&*\(\)+=\-\\\|\[\]"\'<>]/', substr( $text, $s, $l ), $m, PREG_OFFSET_CAPTURE ) ) {
+
+               if ( preg_match(
+                       '/[ ,.!?~!@#$%^&*\(\)+=\-\\\|\[\]"\'<>]/',
+                       substr( $text, $s, $l ),
+                       $m,
+                       PREG_OFFSET_CAPTURE
+               ) ) {
                        return $m[0][1] + $s + $offset;
                } else {
                        // check if point is on a valid first UTF8 char
@@ -373,6 +390,7 @@ class SearchHighlighter {
                                }
                                $char = ord( $text[$point] );
                        }
+
                        return $point;
 
                }
@@ -381,12 +399,12 @@ class SearchHighlighter {
        /**
         * Search extracts for a pattern, and return snippets
         *
-        * @param string $pattern regexp for matching lines
-        * @param array $extracts extracts to search
-        * @param $linesleft Integer: number of extracts to make
-        * @param $contextchars Integer: length of snippet
-        * @param array $out map for highlighted snippets
-        * @param array $offsets map of starting points of snippets
+        * @param string $pattern Regexp for matching lines
+        * @param array $extracts Extracts to search
+        * @param int $linesleft Number of extracts to make
+        * @param int $contextchars Length of snippet
+        * @param array $out Map for highlighted snippets
+        * @param array $offsets Map of starting points of snippets
         * @protected
         */
        function process( $pattern, $extracts, &$linesleft, &$contextchars, &$out, &$offsets ) {
@@ -444,7 +462,11 @@ class SearchHighlighter {
                $text = preg_replace( "/\\{\\{([^|]+?)\\}\\}/", "", $text );
                $text = preg_replace( "/\\{\\{([^|]+\\|)(.*?)\\}\\}/", "\\2", $text );
                $text = preg_replace( "/\\[\\[([^|]+?)\\]\\]/", "\\1", $text );
-               $text = preg_replace_callback( "/\\[\\[([^|]+\\|)(.*?)\\]\\]/", array( $this, 'linkReplace' ), $text );
+               $text = preg_replace_callback(
+                       "/\\[\\[([^|]+\\|)(.*?)\\]\\]/",
+                       array( $this, 'linkReplace' ),
+                       $text
+               );
                // $text = preg_replace("/\\[\\[([^|]+\\|)(.*?)\\]\\]/", "\\2", $text);
                $text = preg_replace( "/<\/?[^>]+>/", "", $text );
                $text = preg_replace( "/'''''/", "", $text );
@@ -459,7 +481,7 @@ class SearchHighlighter {
         * callback to replace [[target|caption]] kind of links, if
         * the target is category or image, leave it
         *
-        * @param $matches Array
+        * @param array $matches
         */
        function linkReplace( $matches ) {
                $colon = strpos( $matches[1], ':' );
@@ -480,11 +502,11 @@ class SearchHighlighter {
         * Simple & fast snippet extraction, but gives completely unrelevant
         * snippets
         *
-        * @param $text String
-        * @param $terms Array
-        * @param $contextlines Integer
-        * @param $contextchars Integer
-        * @return String
+        * @param string $text
+        * @param array $terms
+        * @param int $contextlines
+        * @param int $contextchars
+        * @return string
         */
        public function highlightSimple( $text, $terms, $contextlines, $contextchars ) {
                global $wgContLang;
index d92c9c8..4960c42 100644 (file)
@@ -29,31 +29,37 @@ class SearchMssql extends SearchDatabase {
        /**
         * Perform a full text search query and return a result set.
         *
-        * @param string $term raw search term
-        * @return MssqlSearchResultSet
+        * @param string $term Raw search term
+        * @return SqlSearchResultSet
         * @access public
         */
        function searchText( $term ) {
-               $resultSet = $this->db->resultObject( $this->db->query( $this->getQuery( $this->filter( $term ), true ) ) );
-               return new MssqlSearchResultSet( $resultSet, $this->searchTerms );
+               $resultSet = $this->db->resultObject(
+                       $this->db->query( $this->getQuery( $this->filter( $term ), true ) )
+               );
+
+               return new SqlSearchResultSet( $resultSet, $this->searchTerms );
        }
 
        /**
         * Perform a title-only search query and return a result set.
         *
-        * @param string $term raw search term
-        * @return MssqlSearchResultSet
+        * @param string $term Raw search term
+        * @return SqlSearchResultSet
         * @access public
         */
        function searchTitle( $term ) {
-               $resultSet = $this->db->resultObject( $this->db->query( $this->getQuery( $this->filter( $term ), false ) ) );
-               return new MssqlSearchResultSet( $resultSet, $this->searchTerms );
+               $resultSet = $this->db->resultObject(
+                       $this->db->query( $this->getQuery( $this->filter( $term ), false ) )
+               );
+
+               return new SqlSearchResultSet( $resultSet, $this->searchTerms );
        }
 
        /**
         * Return a partial WHERE clause to limit the search to the given namespaces
         *
-        * @return String
+        * @return string
         * @private
         */
        function queryNamespaces() {
@@ -67,9 +73,9 @@ class SearchMssql extends SearchDatabase {
        /**
         * Return a LIMIT clause to limit results on the query.
         *
-        * @param $sql string
+        * @param string $sql
         *
-        * @return String
+        * @return string
         */
        function queryLimit( $sql ) {
                return $this->db->limitResult( $sql, $this->limit, $this->offset );
@@ -79,7 +85,7 @@ class SearchMssql extends SearchDatabase {
         * Does not do anything for generic search engine
         * subclasses may define this though
         *
-        * @return String
+        * @return string
         */
        function queryRanking( $filteredTerm, $fulltext ) {
                return ' ORDER BY ftindex.[RANK] DESC'; // return ' ORDER BY score(1)';
@@ -89,9 +95,9 @@ class SearchMssql extends SearchDatabase {
         * Construct the full SQL query to do the search.
         * The guts shoulds be constructed in queryMain()
         *
-        * @param $filteredTerm String
-        * @param $fulltext Boolean
-        * @return String
+        * @param string $filteredTerm
+        * @param bool $fulltext
+        * @return string
         */
        function getQuery( $filteredTerm, $fulltext ) {
                return $this->queryLimit( $this->queryMain( $filteredTerm, $fulltext ) . ' ' .
@@ -102,7 +108,7 @@ class SearchMssql extends SearchDatabase {
        /**
         * Picks which field to index on, depending on what type of query.
         *
-        * @param $fulltext Boolean
+        * @param bool $fulltext
         * @return string
         */
        function getIndexField( $fulltext ) {
@@ -112,9 +118,9 @@ class SearchMssql extends SearchDatabase {
        /**
         * Get the base part of the search query.
         *
-        * @param $filteredTerm String
-        * @param $fulltext Boolean
-        * @return String
+        * @param string $filteredTerm
+        * @param bool $fulltext
+        * @return string
         * @private
         */
        function queryMain( $filteredTerm, $fulltext ) {
@@ -132,7 +138,7 @@ class SearchMssql extends SearchDatabase {
         */
        function parseQuery( $filteredText, $fulltext ) {
                global $wgContLang;
-               $lc = SearchEngine::legalSearchChars();
+               $lc = $this->legalSearchChars();
                $this->searchTerms = array();
 
                # @todo FIXME: This doesn't handle parenthetical expressions.
@@ -165,9 +171,9 @@ class SearchMssql extends SearchDatabase {
         * Create or update the search index record for the given page.
         * Title and text should be pre-processed.
         *
-        * @param $id Integer
-        * @param $title String
-        * @param $text String
+        * @param int $id
+        * @param string $title
+        * @param string $text
         * @return bool|ResultWrapper
         */
        function update( $id, $title, $text ) {
@@ -189,8 +195,8 @@ class SearchMssql extends SearchDatabase {
         * Update a search index record's title only.
         * Title should be pre-processed.
         *
-        * @param $id Integer
-        * @param $title String
+        * @param int $id
+        * @param string $title
         * @return bool|ResultWrapper
         */
        function updateTitle( $id, $title ) {
@@ -204,29 +210,3 @@ class SearchMssql extends SearchDatabase {
                return $this->db->query( $sql, 'SearchMssql::updateTitle' );
        }
 }
-
-/**
- * @ingroup Search
- */
-class MssqlSearchResultSet extends SearchResultSet {
-       function __construct( $resultSet, $terms ) {
-               $this->mResultSet = $resultSet;
-               $this->mTerms = $terms;
-       }
-
-       function termMatches() {
-               return $this->mTerms;
-       }
-
-       function numRows() {
-               return $this->mResultSet->numRows();
-       }
-
-       function next() {
-               $row = $this->mResultSet->fetchObject();
-               if ( $row === false ) {
-                       return false;
-               }
-               return new SearchResult( $row );
-       }
-}
index c4d7d1e..77a0c43 100644 (file)
  * @ingroup Search
  */
 class SearchMySQL extends SearchDatabase {
-       var $strictMatching = true;
-       static $mMinSearchLength;
+       protected $strictMatching = true;
+
+       private static $mMinSearchLength;
 
        /**
         * Parse the user's query and transform it into an SQL fragment which will
         * become part of a WHERE clause
         *
-        * @param $filteredText string
-        * @param $fulltext string
+        * @param string $filteredText
+        * @param string $fulltext
         *
         * @return string
         */
        function parseQuery( $filteredText, $fulltext ) {
                global $wgContLang;
-               $lc = SearchEngine::legalSearchChars(); // Minus format chars
+
+               $lc = $this->legalSearchChars(); // Minus format chars
                $searchon = '';
                $this->searchTerms = array();
 
@@ -52,7 +54,9 @@ class SearchMySQL extends SearchDatabase {
                if ( preg_match_all( '/([-+<>~]?)(([' . $lc . ']+)(\*?)|"[^"]*")/',
                                $filteredText, $m, PREG_SET_ORDER ) ) {
                        foreach ( $m as $bits ) {
-                               @list( /* all */, $modifier, $term, $nonQuoted, $wildcard ) = $bits;
+                               wfSuppressWarnings();
+                               list( /* all */, $modifier, $term, $nonQuoted, $wildcard ) = $bits;
+                               wfRestoreWarnings();
 
                                if ( $nonQuoted != '' ) {
                                        $term = $nonQuoted;
@@ -152,8 +156,8 @@ class SearchMySQL extends SearchDatabase {
        /**
         * Perform a full text search query and return a result set.
         *
-        * @param string $term raw search term
-        * @return MySQLSearchResultSet
+        * @param string $term Raw search term
+        * @return SqlSearchResultSet
         */
        function searchText( $term ) {
                return $this->searchInternal( $term, true );
@@ -162,8 +166,8 @@ class SearchMySQL extends SearchDatabase {
        /**
         * Perform a title-only search query and return a result set.
         *
-        * @param string $term raw search term
-        * @return MySQLSearchResultSet
+        * @param string $term Raw search term
+        * @return SqlSearchResultSet
         */
        function searchTitle( $term ) {
                return $this->searchInternal( $term, false );
@@ -199,7 +203,7 @@ class SearchMySQL extends SearchDatabase {
                        $totalResult->free();
                }
 
-               return new MySQLSearchResultSet( $resultSet, $this->searchTerms, $total );
+               return new SqlSearchResultSet( $resultSet, $this->searchTerms, $total );
        }
 
        public function supports( $feature ) {
@@ -213,7 +217,7 @@ class SearchMySQL extends SearchDatabase {
 
        /**
         * Add special conditions
-        * @param $query Array
+        * @param array $query
         * @since 1.18
         */
        protected function queryFeatures( &$query ) {
@@ -226,7 +230,7 @@ class SearchMySQL extends SearchDatabase {
 
        /**
         * Add namespace conditions
-        * @param $query Array
+        * @param array $query
         * @since 1.18 (changed)
         */
        function queryNamespaces( &$query ) {
@@ -240,7 +244,7 @@ class SearchMySQL extends SearchDatabase {
 
        /**
         * Add limit options
-        * @param $query Array
+        * @param array $query
         * @since 1.18
         */
        protected function limitResult( &$query ) {
@@ -251,9 +255,9 @@ class SearchMySQL extends SearchDatabase {
        /**
         * Construct the SQL query to do the search.
         * The guts shoulds be constructed in queryMain()
-        * @param $filteredTerm String
-        * @param $fulltext Boolean
-        * @return Array
+        * @param string $filteredTerm
+        * @param bool $fulltext
+        * @return array
         * @since 1.18 (changed)
         */
        function getQuery( $filteredTerm, $fulltext ) {
@@ -275,8 +279,8 @@ class SearchMySQL extends SearchDatabase {
 
        /**
         * Picks which field to index on, depending on what type of query.
-        * @param $fulltext Boolean
-        * @return String
+        * @param bool $fulltext
+        * @return string
         */
        function getIndexField( $fulltext ) {
                return $fulltext ? 'si_text' : 'si_title';
@@ -285,9 +289,9 @@ class SearchMySQL extends SearchDatabase {
        /**
         * Get the base part of the search query.
         *
-        * @param &$query array Search query array
-        * @param $filteredTerm String
-        * @param $fulltext Boolean
+        * @param array &$query Search query array
+        * @param string $filteredTerm
+        * @param bool $fulltext
         * @since 1.18 (changed)
         */
        function queryMain( &$query, $filteredTerm, $fulltext ) {
@@ -326,9 +330,9 @@ class SearchMySQL extends SearchDatabase {
         * Create or update the search index record for the given page.
         * Title and text should be pre-processed.
         *
-        * @param $id Integer
-        * @param $title String
-        * @param $text String
+        * @param int $id
+        * @param string $title
+        * @param string $text
         */
        function update( $id, $title, $text ) {
                $dbw = wfGetDB( DB_MASTER );
@@ -345,8 +349,8 @@ class SearchMySQL extends SearchDatabase {
         * Update a search index record's title only.
         * Title should be pre-processed.
         *
-        * @param $id Integer
-        * @param $title String
+        * @param int $id
+        * @param string $title
         */
        function updateTitle( $id, $title ) {
                $dbw = wfGetDB( DB_MASTER );
@@ -362,8 +366,8 @@ class SearchMySQL extends SearchDatabase {
         * Delete an indexed page
         * Title should be pre-processed.
         *
-        * @param Integer $id Page id that was deleted
-        * @param String $title Title of page that was deleted
+        * @param int $id Page id that was deleted
+        * @param string $title Title of page that was deleted
         */
        function delete( $id, $title ) {
                $dbw = wfGetDB( DB_MASTER );
@@ -452,17 +456,3 @@ class SearchMySQL extends SearchDatabase {
                return self::$mMinSearchLength;
        }
 }
-
-/**
- * @ingroup Search
- */
-class MySQLSearchResultSet extends SqlSearchResultSet {
-       function __construct( $resultSet, $terms, $totalHits = null ) {
-               parent::__construct( $resultSet, $terms );
-               $this->mTotalHits = $totalHits;
-       }
-
-       function getTotalHits() {
-               return $this->mTotalHits;
-       }
-}
index e14de2c..4cfcec3 100644 (file)
@@ -29,7 +29,6 @@
  * @ingroup Search
  */
 class SearchOracle extends SearchDatabase {
-
        private $reservedWords = array(
                'ABOUT' => 1,
                'ACCUM' => 1,
@@ -62,7 +61,7 @@ class SearchOracle extends SearchDatabase {
        /**
         * Perform a full text search query and return a result set.
         *
-        * @param string $term raw search term
+        * @param string $term Raw search term
         * @return SqlSearchResultSet
         */
        function searchText( $term ) {
@@ -70,14 +69,17 @@ class SearchOracle extends SearchDatabase {
                        return new SqlSearchResultSet( false, '' );
                }
 
-               $resultSet = $this->db->resultObject( $this->db->query( $this->getQuery( $this->filter( $term ), true ) ) );
+               $resultSet = $this->db->resultObject(
+                       $this->db->query( $this->getQuery( $this->filter( $term ), true ) )
+               );
+
                return new SqlSearchResultSet( $resultSet, $this->searchTerms );
        }
 
        /**
         * Perform a title-only search query and return a result set.
         *
-        * @param string $term raw search term
+        * @param string $term Raw search term
         * @return SqlSearchResultSet
         */
        function searchTitle( $term ) {
@@ -85,13 +87,16 @@ class SearchOracle extends SearchDatabase {
                        return new SqlSearchResultSet( false, '' );
                }
 
-               $resultSet = $this->db->resultObject( $this->db->query( $this->getQuery( $this->filter( $term ), false ) ) );
-               return new MySQLSearchResultSet( $resultSet, $this->searchTerms );
+               $resultSet = $this->db->resultObject(
+                       $this->db->query( $this->getQuery( $this->filter( $term ), false ) )
+               );
+
+               return new SqlSearchResultSet( $resultSet, $this->searchTerms );
        }
 
        /**
         * Return a partial WHERE clause to limit the search to the given namespaces
-        * @return String
+        * @return string
         */
        function queryNamespaces() {
                if ( is_null( $this->namespaces ) ) {
@@ -108,9 +113,9 @@ class SearchOracle extends SearchDatabase {
        /**
         * Return a LIMIT clause to limit results on the query.
         *
-        * @param $sql string
+        * @param string $sql
         *
-        * @return String
+        * @return string
         */
        function queryLimit( $sql ) {
                return $this->db->limitResult( $sql, $this->limit, $this->offset );
@@ -120,7 +125,7 @@ class SearchOracle extends SearchDatabase {
         * Does not do anything for generic search engine
         * subclasses may define this though
         *
-        * @return String
+        * @return string
         */
        function queryRanking( $filteredTerm, $fulltext ) {
                return ' ORDER BY score(1)';
@@ -129,9 +134,9 @@ class SearchOracle extends SearchDatabase {
        /**
         * Construct the full SQL query to do the search.
         * The guts shoulds be constructed in queryMain()
-        * @param $filteredTerm String
-        * @param $fulltext Boolean
-        * @return String
+        * @param string $filteredTerm
+        * @param bool $fulltext
+        * @return string
         */
        function getQuery( $filteredTerm, $fulltext ) {
                return $this->queryLimit( $this->queryMain( $filteredTerm, $fulltext ) . ' ' .
@@ -141,8 +146,8 @@ class SearchOracle extends SearchDatabase {
 
        /**
         * Picks which field to index on, depending on what type of query.
-        * @param $fulltext Boolean
-        * @return String
+        * @param bool $fulltext
+        * @return string
         */
        function getIndexField( $fulltext ) {
                return $fulltext ? 'si_text' : 'si_title';
@@ -151,9 +156,9 @@ class SearchOracle extends SearchDatabase {
        /**
         * Get the base part of the search query.
         *
-        * @param $filteredTerm String
-        * @param $fulltext Boolean
-        * @return String
+        * @param string $filteredTerm
+        * @param bool $fulltext
+        * @return string
         */
        function queryMain( $filteredTerm, $fulltext ) {
                $match = $this->parseQuery( $filteredTerm, $fulltext );
@@ -171,7 +176,7 @@ class SearchOracle extends SearchDatabase {
         */
        function parseQuery( $filteredText, $fulltext ) {
                global $wgContLang;
-               $lc = SearchEngine::legalSearchChars();
+               $lc = $this->legalSearchChars();
                $this->searchTerms = array();
 
                # @todo FIXME: This doesn't handle parenthetical expressions.
@@ -222,9 +227,9 @@ class SearchOracle extends SearchDatabase {
         * Create or update the search index record for the given page.
         * Title and text should be pre-processed.
         *
-        * @param $id Integer
-        * @param $title String
-        * @param $text String
+        * @param int $id
+        * @param string $title
+        * @param string $text
         */
        function update( $id, $title, $text ) {
                $dbw = wfGetDB( DB_MASTER );
@@ -251,8 +256,8 @@ class SearchOracle extends SearchDatabase {
         * Update a search index record's title only.
         * Title should be pre-processed.
         *
-        * @param $id Integer
-        * @param $title String
+        * @param int $id
+        * @param string $title
         */
        function updateTitle( $id, $title ) {
                $dbw = wfGetDB( DB_MASTER );
index 4da63b3..42b67f3 100644 (file)
@@ -34,7 +34,7 @@ class SearchPostgres extends SearchDatabase {
         * Currently searches a page's current title (page.page_title) and
         * latest revision article text (pagecontent.old_text)
         *
-        * @param string $term raw search term
+        * @param string $term Raw search term
         * @return PostgresSearchResultSet
         */
        function searchTitle( $term ) {
@@ -64,7 +64,7 @@ class SearchPostgres extends SearchDatabase {
         * Transform the user's search string into a better form for tsearch2
         * Returns an SQL fragment consisting of quoted text to search for.
         *
-        * @param $term string
+        * @param string $term
         *
         * @return string
         */
@@ -130,9 +130,9 @@ class SearchPostgres extends SearchDatabase {
 
        /**
         * Construct the full SQL query to do the search.
-        * @param $term String
-        * @param $fulltext String
-        * @param $colname
+        * @param string $term
+        * @param string $fulltext
+        * @param string $colname
         * @return string
         */
        function searchQuery( $term, $fulltext, $colname ) {
@@ -191,7 +191,7 @@ class SearchPostgres extends SearchDatabase {
 
        function update( $pageid, $title, $text ) {
                ## We don't want to index older revisions
-               $sql = "UPDATE pagecontent SET textvector = NULL WHERE old_id IN " .
+               $sql = "UPDATE pagecontent SET textvector = NULL WHERE textvector IS NOT NULL and old_id IN " .
                                "(SELECT rev_text_id FROM revision WHERE rev_page = " . intval( $pageid ) .
                                " ORDER BY rev_text_id DESC OFFSET 1)";
                $this->db->query( $sql );
@@ -222,12 +222,8 @@ class PostgresSearchResult extends SearchResult {
  * @ingroup Search
  */
 class PostgresSearchResultSet extends SqlSearchResultSet {
-       function __construct( $resultSet, $terms ) {
-               parent::__construct( $resultSet, $terms );
-       }
-
        function next() {
-               $row = $this->mResultSet->fetchObject();
+               $row = $this->resultSet->fetchObject();
                if ( $row === false ) {
                        return false;
                } else {
index 153590a..56ae2ff 100644 (file)
@@ -45,14 +45,14 @@ class SearchResult {
        protected $mTitle;
 
        /**
-        * @var String
+        * @var string
         */
        protected $mText;
 
        /**
         * Return a new SearchResult and initializes it with a title.
         *
-        * @param $title Title
+        * @param Title $title
         * @return SearchResult
         */
        public static function newFromTitle( $title ) {
@@ -64,7 +64,7 @@ class SearchResult {
        /**
         * Return a new SearchResult and initializes it with a row.
         *
-        * @param $row object
+        * @param object $row
         * @return SearchResult
         */
        public static function newFromRow( $row ) {
@@ -84,7 +84,7 @@ class SearchResult {
         * Initialize from a database row. Makes a Title and passes that to
         * initFromTitle.
         *
-        * @param $row object
+        * @param object $row
         */
        protected function initFromRow( $row ) {
                $this->initFromTitle( Title::makeTitle( $row->page_namespace, $row->page_title ) );
@@ -94,7 +94,7 @@ class SearchResult {
         * Initialize from a Title and if possible initializes a corresponding
         * Revision and File.
         *
-        * @param $title Title
+        * @param Title $title
         */
        protected function initFromTitle( $title ) {
                $this->mTitle = $title;
@@ -112,7 +112,7 @@ class SearchResult {
        /**
         * Check if this is result points to an invalid title
         *
-        * @return Boolean
+        * @return bool
         */
        function isBrokenTitle() {
                return is_null( $this->mTitle );
@@ -121,7 +121,7 @@ class SearchResult {
        /**
         * Check if target page is missing, happens when index is out of date
         *
-        * @return Boolean
+        * @return bool
         */
        function isMissingRevision() {
                return !$this->mRevision && !$this->mImage;
@@ -143,7 +143,7 @@ class SearchResult {
        }
 
        /**
-        * @return float|null if not supported
+        * @return float|null If not supported
         */
        function getScore() {
                return null;
@@ -164,8 +164,8 @@ class SearchResult {
        }
 
        /**
-        * @param array $terms terms to highlight
-        * @return String: highlighted text snippet, null (and not '') if not supported
+        * @param array $terms Terms to highlight
+        * @return string Highlighted text snippet, null (and not '') if not supported
         */
        function getTextSnippet( $terms ) {
                global $wgAdvancedSearchHighlighting;
@@ -182,42 +182,42 @@ class SearchResult {
        }
 
        /**
-        * @return String: highlighted title, '' if not supported
+        * @return string Highlighted title, '' if not supported
         */
        function getTitleSnippet() {
                return '';
        }
 
        /**
-        * @return String: highlighted redirect name (redirect to this page), '' if none or not supported
+        * @return string Highlighted redirect name (redirect to this page), '' if none or not supported
         */
        function getRedirectSnippet() {
                return '';
        }
 
        /**
-        * @return Title object for the redirect to this page, null if none or not supported
+        * @return Title Title object for the redirect to this page, null if none or not supported
         */
        function getRedirectTitle() {
                return null;
        }
 
        /**
-        * @return string highlighted relevant section name, null if none or not supported
+        * @return string Highlighted relevant section name, null if none or not supported
         */
        function getSectionSnippet() {
                return '';
        }
 
        /**
-        * @return Title object (pagename+fragment) for the section, null if none or not supported
+        * @return Title Title object (pagename+fragment) for the section, null if none or not supported
         */
        function getSectionTitle() {
                return null;
        }
 
        /**
-        * @return String: timestamp
+        * @return string timestamp
         */
        function getTimestamp() {
                if ( $this->mRevision ) {
@@ -229,7 +229,7 @@ class SearchResult {
        }
 
        /**
-        * @return Integer: number of words
+        * @return int Number of words
         */
        function getWordCount() {
                $this->initText();
@@ -237,7 +237,7 @@ class SearchResult {
        }
 
        /**
-        * @return Integer: size in bytes
+        * @return int Size in bytes
         */
        function getByteSize() {
                $this->initText();
@@ -245,21 +245,21 @@ class SearchResult {
        }
 
        /**
-        * @return Boolean if hit has related articles
+        * @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)
+        * @return string Interwiki prefix of the title (return iw even if title is broken)
         */
        function getInterwikiPrefix() {
                return '';
        }
 
        /**
-        * @return string interwiki namespace of the title (since we likely can't resolve it locally)
+        * @return string Interwiki namespace of the title (since we likely can't resolve it locally)
         */
        function getInterwikiNamespaceText() {
                return '';
@@ -267,6 +267,7 @@ class SearchResult {
 
        /**
         * Did this match file contents (eg: PDF/DJVU)?
+        * @return bool
         */
        function isFileMatch() {
                return false;
index e689389..f753e3d 100644 (file)
@@ -30,7 +30,7 @@ class SearchResultSet {
         * the search terms as parsed by this engine in a text extract.
         * STUB
         *
-        * @return Array
+        * @return array
         */
        function termMatches() {
                return array();
@@ -44,7 +44,7 @@ class SearchResultSet {
         * Return true if results are included in this result set.
         * STUB
         *
-        * @return Boolean
+        * @return bool
         */
        function hasResults() {
                return false;
@@ -58,7 +58,7 @@ class SearchResultSet {
         *
         * Return null if no total hits number is supported.
         *
-        * @return Integer
+        * @return int
         */
        function getTotalHits() {
                return null;
@@ -68,21 +68,21 @@ class SearchResultSet {
         * Some search modes return a suggested alternate term if there are
         * no exact hits. Returns true if there is one on this set.
         *
-        * @return Boolean
+        * @return bool
         */
        function hasSuggestion() {
                return false;
        }
 
        /**
-        * @return String: suggested query, null if none
+        * @return string Suggested query, null if none
         */
        function getSuggestionQuery() {
                return null;
        }
 
        /**
-        * @return String: HTML highlighted suggested query, '' if none
+        * @return string HTML highlighted suggested query, '' if none
         */
        function getSuggestionSnippet() {
                return '';
@@ -100,7 +100,7 @@ class SearchResultSet {
        /**
         * Check if there are results on other wikis
         *
-        * @return Boolean
+        * @return bool
         */
        function hasInterwikiResults() {
                return $this->getInterwikiResults() != null;
@@ -127,6 +127,7 @@ class SearchResultSet {
         * Did the search contain search syntax?  If so, Special:Search won't offer
         * the user a link to a create a page named by the search string because the
         * name would contain the search syntax.
+        * @return bool
         */
        public function searchContainedSyntax() {
                return false;
@@ -138,32 +139,34 @@ class SearchResultSet {
  * @ingroup Search
  */
 class SqlSearchResultSet extends SearchResultSet {
+       protected $resultSet;
+       protected $terms;
+       protected $totalHits;
 
-       protected $mResultSet;
-
-       function __construct( $resultSet, $terms ) {
-               $this->mResultSet = $resultSet;
-               $this->mTerms = $terms;
+       function __construct( $resultSet, $terms, $total = null ) {
+               $this->resultSet = $resultSet;
+               $this->terms = $terms;
+               $this->totalHits = $total;
        }
 
        function termMatches() {
-               return $this->mTerms;
+               return $this->terms;
        }
 
        function numRows() {
-               if ( $this->mResultSet === false ) {
+               if ( $this->resultSet === false ) {
                        return false;
                }
 
-               return $this->mResultSet->numRows();
+               return $this->resultSet->numRows();
        }
 
        function next() {
-               if ( $this->mResultSet === false ) {
+               if ( $this->resultSet === false ) {
                        return false;
                }
 
-               $row = $this->mResultSet->fetchObject();
+               $row = $this->resultSet->fetchObject();
                if ( $row === false ) {
                        return false;
                }
@@ -172,11 +175,15 @@ class SqlSearchResultSet extends SearchResultSet {
        }
 
        function free() {
-               if ( $this->mResultSet === false ) {
+               if ( $this->resultSet === false ) {
                        return false;
                }
 
-               $this->mResultSet->free();
+               $this->resultSet->free();
+       }
+
+       function getTotalHits() {
+               return $this->totalHits;
        }
 }
 
@@ -187,7 +194,7 @@ class SearchNearMatchResultSet extends SearchResultSet {
        private $fetched = false;
 
        /**
-        * @param $match mixed Title if matched, else null
+        * @param Title|null $match Title if matched, else null
         */
        public function __construct( $match ) {
                $this->result = $match;
index 6b2b3c6..62fb236 100644 (file)
@@ -28,7 +28,7 @@
 class SearchSqlite extends SearchDatabase {
        /**
         * Whether fulltext search is supported by current schema
-        * @return Boolean
+        * @return bool
         */
        function fulltextSearchSupported() {
                return $this->db->checkForEnabledSearch();
@@ -42,7 +42,7 @@ class SearchSqlite extends SearchDatabase {
         */
        function parseQuery( $filteredText, $fulltext ) {
                global $wgContLang;
-               $lc = SearchEngine::legalSearchChars(); // Minus format chars
+               $lc = $this->legalSearchChars(); // Minus format chars
                $searchon = '';
                $this->searchTerms = array();
 
@@ -50,7 +50,9 @@ class SearchSqlite extends SearchDatabase {
                if ( preg_match_all( '/([-+<>~]?)(([' . $lc . ']+)(\*?)|"[^"]*")/',
                                $filteredText, $m, PREG_SET_ORDER ) ) {
                        foreach ( $m as $bits ) {
-                               @list( /* all */, $modifier, $term, $nonQuoted, $wildcard ) = $bits;
+                               wfSuppressWarnings();
+                               list( /* all */, $modifier, $term, $nonQuoted, $wildcard ) = $bits;
+                               wfRestoreWarnings();
 
                                if ( $nonQuoted != '' ) {
                                        $term = $nonQuoted;
@@ -144,8 +146,8 @@ class SearchSqlite extends SearchDatabase {
        /**
         * Perform a full text search query and return a result set.
         *
-        * @param string $term raw search term
-        * @return SqliteSearchResultSet
+        * @param string $term Raw search term
+        * @return SqlSearchResultSet
         */
        function searchText( $term ) {
                return $this->searchInternal( $term, true );
@@ -154,8 +156,8 @@ class SearchSqlite extends SearchDatabase {
        /**
         * Perform a title-only search query and return a result set.
         *
-        * @param string $term raw search term
-        * @return SqliteSearchResultSet
+        * @param string $term Raw search term
+        * @return SqlSearchResultSet
         */
        function searchTitle( $term ) {
                return $this->searchInternal( $term, false );
@@ -181,12 +183,12 @@ class SearchSqlite extends SearchDatabase {
                        $totalResult->free();
                }
 
-               return new SqliteSearchResultSet( $resultSet, $this->searchTerms, $total );
+               return new SqlSearchResultSet( $resultSet, $this->searchTerms, $total );
        }
 
        /**
         * Return a partial WHERE clause to limit the search to the given namespaces
-        * @return String
+        * @return string
         */
        function queryNamespaces() {
                if ( is_null( $this->namespaces ) ) {
@@ -202,8 +204,8 @@ class SearchSqlite extends SearchDatabase {
 
        /**
         * Returns a query with limit for number of results set.
-        * @param $sql String:
-        * @return String
+        * @param string $sql
+        * @return string
         */
        function limitResult( $sql ) {
                return $this->db->limitResult( $sql, $this->limit, $this->offset );
@@ -212,9 +214,9 @@ class SearchSqlite extends SearchDatabase {
        /**
         * Construct the full SQL query to do the search.
         * The guts shoulds be constructed in queryMain()
-        * @param $filteredTerm String
-        * @param $fulltext Boolean
-        * @return String
+        * @param string $filteredTerm
+        * @param bool $fulltext
+        * @return string
         */
        function getQuery( $filteredTerm, $fulltext ) {
                return $this->limitResult(
@@ -225,8 +227,8 @@ class SearchSqlite extends SearchDatabase {
 
        /**
         * Picks which field to index on, depending on what type of query.
-        * @param $fulltext Boolean
-        * @return String
+        * @param bool $fulltext
+        * @return string
         */
        function getIndexField( $fulltext ) {
                return $fulltext ? 'si_text' : 'si_title';
@@ -235,9 +237,9 @@ class SearchSqlite extends SearchDatabase {
        /**
         * Get the base part of the search query.
         *
-        * @param $filteredTerm String
-        * @param $fulltext Boolean
-        * @return String
+        * @param string $filteredTerm
+        * @param bool $fulltext
+        * @return string
         */
        function queryMain( $filteredTerm, $fulltext ) {
                $match = $this->parseQuery( $filteredTerm, $fulltext );
@@ -262,9 +264,9 @@ class SearchSqlite extends SearchDatabase {
         * Create or update the search index record for the given page.
         * Title and text should be pre-processed.
         *
-        * @param $id Integer
-        * @param $title String
-        * @param $text String
+        * @param int $id
+        * @param string $title
+        * @param string $text
         */
        function update( $id, $title, $text ) {
                if ( !$this->fulltextSearchSupported() ) {
@@ -288,8 +290,8 @@ class SearchSqlite extends SearchDatabase {
         * Update a search index record's title only.
         * Title should be pre-processed.
         *
-        * @param $id Integer
-        * @param $title String
+        * @param int $id
+        * @param string $title
         */
        function updateTitle( $id, $title ) {
                if ( !$this->fulltextSearchSupported() ) {
@@ -303,17 +305,3 @@ class SearchSqlite extends SearchDatabase {
                        __METHOD__ );
        }
 }
-
-/**
- * @ingroup Search
- */
-class SqliteSearchResultSet extends SqlSearchResultSet {
-       function __construct( $resultSet, $terms, $totalHits = null ) {
-               parent::__construct( $resultSet, $terms );
-               $this->mTotalHits = $totalHits;
-       }
-
-       function getTotalHits() {
-               return $this->mTotalHits;
-       }
-}
index f3b8a0c..4854bcb 100644 (file)
  * @ingroup Site
  */
 class MediaWikiSite extends Site {
-
        const PATH_FILE = 'file_path';
        const PATH_PAGE = 'page_path';
 
        /**
         * @since 1.21
-        * @deprecated Just use the constructor or the factory Site::newForType
+        * @deprecated since 1.21 Just use the constructor or the factory Site::newForType
         *
-        * @param integer $globalId
+        * @param int $globalId
         *
         * @return MediaWikiSite
         */
@@ -67,23 +66,25 @@ class MediaWikiSite extends Site {
         *
         * @since 1.21
         *
-        * @param string $title the target page's title, in normalized form.
+        * @param string $title The target page's title, in normalized form.
         *
-        * @return String
+        * @return string
         */
        public function toDBKey( $title ) {
                return str_replace( ' ', '_', $title );
        }
 
        /**
-        * Returns the normalized form of the given page title, using the normalization rules of the given site.
-        * If the given title is a redirect, the redirect weill be resolved and the redirect target is returned.
+        * Returns the normalized form of the given page title, using the
+        * normalization rules of the given site. If the given title is a redirect,
+        * the redirect weill be resolved and the redirect target is returned.
         *
-        * @note  : This actually makes an API request to the remote site, so beware that this function is slow and depends
-        *          on an external service.
+        * @note This actually makes an API request to the remote site, so beware
+        *   that this function is slow and depends on an external service.
         *
-        * @note  : If MW_PHPUNIT_TEST is defined, the call to the external site is skipped, and the title
-        *          is normalized using the local normalization rules as implemented by the Title class.
+        * @note If MW_PHPUNIT_TEST is defined, the call to the external site is
+        *   skipped, and the title is normalized using the local normalization
+        *   rules as implemented by the Title class.
         *
         * @see Site::normalizePageName
         *
@@ -103,8 +104,10 @@ class MediaWikiSite extends Site {
 
                // Go on call the external site
                if ( defined( 'MW_PHPUNIT_TEST' ) ) {
-                       // If the code is under test, don't call out to other sites, just normalize locally.
-                       // Note: this may cause results to be inconsistent with the actual normalization used by the respective remote site!
+                       // If the code is under test, don't call out to other sites, just
+                       // normalize locally.
+                       // Note: this may cause results to be inconsistent with the actual
+                       // normalization used by the respective remote site!
 
                        $t = Title::newFromText( $pageName );
                        return $t->getPrefixedText();
@@ -152,12 +155,14 @@ class MediaWikiSite extends Site {
                $page = static::extractPageRecord( $data, $pageName );
 
                if ( isset( $page['missing'] ) ) {
-                       wfDebugLog( "MediaWikiSite", "call to <$url> returned a marker for a missing page title! " . $ret );
+                       wfDebugLog( "MediaWikiSite", "call to <$url> returned a marker for a missing page title! "
+                               . $ret );
                        return false;
                }
 
                if ( isset( $page['invalid'] ) ) {
-                       wfDebugLog( "MediaWikiSite", "call to <$url> returned a marker for an invalid page title! " . $ret );
+                       wfDebugLog( "MediaWikiSite", "call to <$url> returned a marker for an invalid page title! "
+                               . $ret );
                        return false;
                }
 
@@ -177,7 +182,7 @@ class MediaWikiSite extends Site {
         * @param array $externalData A reply from the API on a external server.
         * @param string $pageTitle Identifies the page at the external site, needing normalization.
         *
-        * @return array|boolean a 'page' structure representing the page identified by $pageTitle.
+        * @return array|bool A 'page' structure representing the page identified by $pageTitle.
         */
        private static function extractPageRecord( $externalData, $pageTitle ) {
                // If there is a special case with only one returned page
@@ -309,7 +314,7 @@ class MediaWikiSite extends Site {
         *
         * @since 1.21
         *
-        * @param string|boolean $pageName Page name or false (default: false)
+        * @param string|bool $pageName Page name or false (default: false)
         *
         * @return string
         */
@@ -335,7 +340,7 @@ class MediaWikiSite extends Site {
         *
         * @since 1.21
         *
-        * @param string|boolean $path
+        * @param string|bool $path
         *
         * @return string
         */
@@ -348,5 +353,4 @@ class MediaWikiSite extends Site {
 
                return $filePath;
        }
-
 }
index 076dc88..e3559f5 100644 (file)
@@ -27,7 +27,6 @@
  * @author Jeroen De Dauw < jeroendedauw@gmail.com >
  */
 class Site implements Serializable {
-
        const TYPE_UNKNOWN = 'unknown';
        const TYPE_MEDIAWIKI = 'mediawiki';
 
@@ -234,7 +233,7 @@ class Site implements Serializable {
         *
         * @since 1.21
         *
-        * @return boolean
+        * @return bool
         */
        public function shouldForward() {
                return $this->forward;
@@ -246,7 +245,7 @@ class Site implements Serializable {
         *
         * @since 1.21
         *
-        * @param boolean $shouldForward
+        * @param bool $shouldForward
         *
         * @throws MWException
         */
@@ -340,11 +339,12 @@ class Site implements Serializable {
        }
 
        /**
-        * Returns the main path type, that is the type of the path that should generally be used to construct links
-        * to the target site.
+        * Returns the main path type, that is the type of the path that should
+        * generally be used to construct links to the target site.
         *
-        * This default implementation returns Site::PATH_LINK as the default path type. Subclasses can override this
-        * to define a different default path type, or return false to disable site links.
+        * This default implementation returns Site::PATH_LINK as the default path
+        * type. Subclasses can override this to define a different default path
+        * type, or return false to disable site links.
         *
         * @since 1.21
         *
@@ -365,9 +365,9 @@ class Site implements Serializable {
         *
         * @since 1.21
         *
-        * @param bool|String $pageName
+        * @param bool|string $pageName
         *
-        * @return string|boolean false
+        * @return string|bool
         */
        public function getPageUrl( $pageName = false ) {
                $url = $this->getLinkPath();
@@ -541,7 +541,9 @@ class Site implements Serializable {
         * @return string[]
         */
        public function getInterwikiIds() {
-               return array_key_exists( self::ID_INTERWIKI, $this->localIds ) ? $this->localIds[self::ID_INTERWIKI] : array();
+               return array_key_exists( self::ID_INTERWIKI, $this->localIds )
+                       ? $this->localIds[self::ID_INTERWIKI]
+                       : array();
        }
 
        /**
@@ -553,7 +555,9 @@ class Site implements Serializable {
         * @return string[]
         */
        public function getNavigationIds() {
-               return array_key_exists( self::ID_EQUIVALENT, $this->localIds ) ? $this->localIds[self::ID_EQUIVALENT] : array();
+               return array_key_exists( self::ID_EQUIVALENT, $this->localIds )
+                       ? $this->localIds[self::ID_EQUIVALENT] :
+                       array();
        }
 
        /**
@@ -693,10 +697,10 @@ class Site implements Serializable {
                $this->setForward( $fields['forward'] );
                $this->setInternalId( $fields['internalid'] );
        }
-
 }
 
 /**
  * @deprecated
  */
-class SiteObject extends Site {}
+class SiteObject extends Site {
+}
index a7c196b..dfe4ec5 100644 (file)
  * @author Jeroen De Dauw < jeroendedauw@gmail.com >
  */
 class SiteList extends GenericArrayObject {
-
        /**
         * Internal site identifiers pointing to their sites offset value.
         *
         * @since 1.21
         *
-        * @var array of integer
+        * @var array Array of integer
         */
        protected $byInternalId = array();
 
@@ -42,7 +41,7 @@ class SiteList extends GenericArrayObject {
         *
         * @since 1.21
         *
-        * @var array of string
+        * @var array Array of string
         */
        protected $byGlobalId = array();
 
@@ -52,7 +51,7 @@ class SiteList extends GenericArrayObject {
         *
         * @since 1.23
         *
-        * @var array of string
+        * @var array Array of string
         */
        protected $byNavigationId = array();
 
@@ -75,7 +74,7 @@ class SiteList extends GenericArrayObject {
         * @param int|string $index
         * @param Site $site
         *
-        * @return boolean
+        * @return bool
         */
        protected function preSetElement( $index, $site ) {
                if ( $this->hasSite( $site->getGlobalId() ) ) {
@@ -136,7 +135,7 @@ class SiteList extends GenericArrayObject {
         *
         * @param string $globalSiteId
         *
-        * @return boolean
+        * @return bool
         */
        public function hasSite( $globalSiteId ) {
                return array_key_exists( $globalSiteId, $this->byGlobalId );
@@ -173,7 +172,7 @@ class SiteList extends GenericArrayObject {
         *
         * @since 1.21
         *
-        * @return boolean
+        * @return bool
         */
        public function isEmpty() {
                return $this->byGlobalId === array();
@@ -182,9 +181,9 @@ class SiteList extends GenericArrayObject {
        /**
         * Returns if the list contains the site with the provided site id.
         *
-        * @param integer $id
+        * @param int $id
         *
-        * @return boolean
+        * @return bool
         */
        public function hasInternalId( $id ) {
                return array_key_exists( $id, $this->byInternalId );
@@ -196,7 +195,7 @@ class SiteList extends GenericArrayObject {
         *
         * @since 1.21
         *
-        * @param integer $id
+        * @param int $id
         *
         * @return Site
         */
@@ -210,7 +209,7 @@ class SiteList extends GenericArrayObject {
         *
         * @since 1.21
         *
-        * @param integer $id
+        * @param int $id
         */
        public function removeSiteByInternalId( $id ) {
                $this->offsetUnset( $this->byInternalId[$id] );
@@ -221,7 +220,7 @@ class SiteList extends GenericArrayObject {
         *
         * @param string $id
         *
-        * @return boolean
+        * @return bool
         */
        public function hasNavigationId( $id ) {
                return array_key_exists( $id, $this->byNavigationId );
@@ -350,10 +349,10 @@ class SiteList extends GenericArrayObject {
 
                return $serializationData;
        }
-
 }
 
 /**
  * @deprecated
  */
-class SiteArray extends SiteList {}
+class SiteArray extends SiteList {
+}
index 7bf933c..f382d98 100644 (file)
@@ -29,7 +29,6 @@
  * @author Jeroen De Dauw < jeroendedauw@gmail.com >
  */
 class SiteSQLStore implements SiteStore {
-
        /**
         * @since 1.21
         *
@@ -90,7 +89,7 @@ class SiteSQLStore implements SiteStore {
         *
         * @see SiteList::getSerialVersionId
         *
-        * @return String The cache key.
+        * @return string The cache key.
         */
        protected function getCacheKey() {
                wfProfileIn( __METHOD__ );
@@ -115,7 +114,7 @@ class SiteSQLStore implements SiteStore {
         *
         * @since 1.21
         *
-        * @param string $source either 'cache' or 'recache'
+        * @param string $source Either 'cache' or 'recache'
         *
         * @return SiteList
         */
@@ -169,7 +168,10 @@ class SiteSQLStore implements SiteStore {
                }
 
                if ( $siteRow->hasField( 'language' ) ) {
-                       $site->setLanguageCode( $siteRow->getField( 'language' ) === '' ? null : $siteRow->getField( 'language' ) );
+                       $site->setLanguageCode( $siteRow->getField( 'language' ) === ''
+                               ? null
+                               : $siteRow->getField( 'language' )
+                       );
                }
 
                if ( $siteRow->hasField( 'source' ) ) {
@@ -287,7 +289,7 @@ class SiteSQLStore implements SiteStore {
         *
         * @param Site $site
         *
-        * @return boolean Success indicator
+        * @return bool Success indicator
         */
        public function saveSite( Site $site ) {
                return $this->saveSites( array( $site ) );
@@ -300,7 +302,7 @@ class SiteSQLStore implements SiteStore {
         *
         * @param Site[] $sites
         *
-        * @return boolean Success indicator
+        * @return bool Success indicator
         */
        public function saveSites( array $sites ) {
                wfProfileIn( __METHOD__ );
@@ -390,7 +392,7 @@ class SiteSQLStore implements SiteStore {
         *
         * @see SiteStore::clear()
         *
-        * @return bool success
+        * @return bool Success
         */
        public function clear() {
                wfProfileIn( __METHOD__ );
@@ -468,7 +470,7 @@ class Sites extends SiteSQLStore {
         * @since 1.21
         * @deprecated
         *
-        * @param string|boolean false $globalId
+        * @param string|bool $globalId
         *
         * @return Site
         */
@@ -498,10 +500,10 @@ class Sites extends SiteSQLStore {
 
        /**
         * @deprecated
+        * @param string $group
         * @return SiteList
         */
        public function getSiteGroup( $group ) {
                return $this->getSites()->getGroup( $group );
        }
-
 }
index 52ba8fb..537f1cc 100644 (file)
@@ -35,7 +35,7 @@ interface SiteStore {
         *
         * @param Site $site
         *
-        * @return boolean Success indicator
+        * @return bool Success indicator
         */
        public function saveSite( Site $site );
 
@@ -46,7 +46,7 @@ interface SiteStore {
         *
         * @param Site[] $sites
         *
-        * @return boolean Success indicator
+        * @return bool Success indicator
         */
        public function saveSites( array $sites );
 
@@ -56,7 +56,7 @@ interface SiteStore {
         * @since 1.21
         *
         * @param string $globalId
-        * @param string $source either 'cache' or 'recache'.
+        * @param string $source Either 'cache' or 'recache'.
         * If 'cache', the values are allowed (but not obliged) to come from a cache.
         *
         * @return Site|null
@@ -70,7 +70,7 @@ interface SiteStore {
         *
         * @since 1.21
         *
-        * @param string $source either 'cache' or 'recache'.
+        * @param string $source Either 'cache' or 'recache'.
         * If 'cache', the values are allowed (but not obliged) to come from a cache.
         *
         * @return SiteList
index bc0b8ff..f7c95d1 100644 (file)
@@ -164,7 +164,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
         *
         * Intended for subclassing, e.g. to add a backwards-compatibility layer.
         *
-        * @param FormOptions $parameters
+        * @param FormOptions $opts
         * @return FormOptions
         */
        protected function fetchOptionsFromRequest( $opts ) {
@@ -398,49 +398,49 @@ abstract class ChangesListSpecialPage extends SpecialPage {
         * @todo This should not be static, then we can drop the parameter
         * @todo Not called by anything, should be called by doHeader()
         *
-        * @param $context the object available as $this in non-static functions
+        * @param IContextSource $context The object available as $this in non-static functions
         * @return string
         */
        public static function makeLegend( IContextSource $context ) {
                global $wgRecentChangesFlags;
                $user = $context->getUser();
                # The legend showing what the letters and stuff mean
-               $legend = Xml::openElement( 'dl' ) . "\n";
+               $legend = Html::openElement( 'dl' ) . "\n";
                # Iterates through them and gets the messages for both letter and tooltip
                $legendItems = $wgRecentChangesFlags;
-               if ( !$user->useRCPatrol() ) {
+               if ( !( $user->useRCPatrol() || $user->useNPPatrol() ) ) {
                        unset( $legendItems['unpatrolled'] );
                }
-               foreach ( $legendItems as $key => $legendInfo ) { # generate items of the legend
-                       $label = $legendInfo['title'];
-                       $letter = $legendInfo['letter'];
-                       $cssClass = isset( $legendInfo['class'] ) ? $legendInfo['class'] : $key;
+               foreach ( $legendItems as $key => $item ) { # generate items of the legend
+                       $label = $item['title'];
+                       $letter = $item['letter'];
+                       $cssClass = isset( $item['class'] ) ? $item['class'] : $key;
 
-                       $legend .= Xml::element( 'dt',
+                       $legend .= Html::element( 'dt',
                                array( 'class' => $cssClass ), $context->msg( $letter )->text()
                        ) . "\n";
                        if ( $key === 'newpage' ) {
-                               $legend .= Xml::openElement( 'dd' );
+                               $legend .= Html::openElement( 'dd' );
                                $legend .= $context->msg( $label )->escaped();
                                $legend .= ' ' . $context->msg( 'recentchanges-legend-newpage' )->parse();
-                               $legend .= Xml::closeElement( 'dd' ) . "\n";
+                               $legend .= Html::closeElement( 'dd' ) . "\n";
                        } else {
-                               $legend .= Xml::element( 'dd', array(),
+                               $legend .= Html::element( 'dd', array(),
                                        $context->msg( $label )->text()
                                ) . "\n";
                        }
                }
                # (+-123)
-               $legend .= Xml::tags( 'dt',
+               $legend .= Html::rawElement( 'dt',
                        array( 'class' => 'mw-plusminus-pos' ),
                        $context->msg( 'recentchanges-legend-plusminus' )->parse()
                ) . "\n";
-               $legend .= Xml::element(
+               $legend .= Html::element(
                        'dd',
                        array( 'class' => 'mw-changeslist-legend-plusminus' ),
                        $context->msg( 'recentchanges-label-plusminus' )->text()
                ) . "\n";
-               $legend .= Xml::closeElement( 'dl' ) . "\n";
+               $legend .= Html::closeElement( 'dl' ) . "\n";
 
                # Collapsibility
                $legend =
index 7496262..6020396 100644 (file)
@@ -37,13 +37,13 @@ abstract class FormSpecialPage extends SpecialPage {
 
        /**
         * Get an HTMLForm descriptor array
-        * @return Array
+        * @return array
         */
        abstract protected function getFormFields();
 
        /**
         * Add pre-text to the form
-        * @return String HTML which will be sent to $form->addPreText()
+        * @return string HTML which will be sent to $form->addPreText()
         */
        protected function preText() {
                return '';
@@ -51,7 +51,7 @@ abstract class FormSpecialPage extends SpecialPage {
 
        /**
         * Add post-text to the form
-        * @return String HTML which will be sent to $form->addPostText()
+        * @return string HTML which will be sent to $form->addPostText()
         */
        protected function postText() {
                return '';
@@ -59,7 +59,7 @@ abstract class FormSpecialPage extends SpecialPage {
 
        /**
         * Play with the HTMLForm if you need to more substantially
-        * @param $form HTMLForm
+        * @param HTMLForm $form
         */
        protected function alterForm( HTMLForm $form ) {
        }
@@ -113,8 +113,8 @@ abstract class FormSpecialPage extends SpecialPage {
 
        /**
         * Process the form on POST submission.
-        * @param $data Array
-        * @return Bool|Array true for success, false for didn't-try, array of errors on failure
+        * @param array $data
+        * @return bool|array True for success, false for didn't-try, array of errors on failure
         */
        abstract public function onSubmit( array $data );
 
@@ -155,9 +155,9 @@ abstract class FormSpecialPage extends SpecialPage {
        /**
         * Called from execute() to check if the given user can perform this action.
         * Failures here must throw subclasses of ErrorPageError.
-        * @param $user User
+        * @param User $user
         * @throws UserBlockedError
-        * @return Bool true
+        * @return bool True
         */
        protected function checkExecutePermissions( User $user ) {
                $this->checkPermissions();
@@ -176,7 +176,7 @@ abstract class FormSpecialPage extends SpecialPage {
 
        /**
         * Whether this action requires the wiki not to be locked
-        * @return Bool
+        * @return bool
         */
        public function requiresWrite() {
                return true;
@@ -184,7 +184,7 @@ abstract class FormSpecialPage extends SpecialPage {
 
        /**
         * Whether this action cannot be executed by a blocked user
-        * @return Bool
+        * @return bool
         */
        public function requiresUnblock() {
                return true;
index 3fbb0e5..3bdbc3c 100644 (file)
@@ -67,7 +67,7 @@ abstract class RedirectSpecialPage extends UnlistedSpecialPage {
         * Return part of the request string for a special redirect page
         * This allows passing, e.g. action=history to Special:Mypage, etc.
         *
-        * @return String
+        * @return string
         */
        public function getRedirectQuery() {
                $params = array();
index 15a71ff..53cef7f 100644 (file)
@@ -232,7 +232,7 @@ class SpecialPageFactory {
         * 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).
-        * @return Object
+        * @return object
         */
        static function getAliasList() {
                if ( !is_object( self::$aliases ) ) {
@@ -243,11 +243,14 @@ class SpecialPageFactory {
                        $missingPages = clone self::getList();
 
                        self::$aliases = array();
-                       foreach ( $aliases as $realName => $aliasList ) {
-                               foreach ( $aliasList as $alias ) {
-                                       self::$aliases[$wgContLang->caseFold( $alias )] = $realName;
+                       // 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;
+                                       }
+                                       unset( $missingPages->$realName );
                                }
-                               unset( $missingPages->$realName );
                        }
                        foreach ( $missingPages as $name => $stuff ) {
                                self::$aliases[$wgContLang->caseFold( $name )] = $name;
@@ -361,7 +364,7 @@ class SpecialPageFactory {
         * Return categorised listable special pages which are available
         * for the current user, and everyone.
         *
-        * @param $user User object to check permissions, $wgUser will be used if
+        * @param User $user User object to check permissions, $wgUser will be used if
         *   if not provided
         * @return array ( string => Specialpage )
         */
@@ -407,17 +410,21 @@ class SpecialPageFactory {
         * Return categorised listable special pages which are available
         * for the current user, but not for everyone
         *
+        * @param User|null $user User object to use or null for $wgUser
         * @return array ( string => Specialpage )
         */
-       public static function getRestrictedPages() {
-               global $wgUser;
+       public static function getRestrictedPages( User $user = null ) {
                $pages = array();
+               if ( $user === null ) {
+                       global $wgUser;
+                       $user = $wgUser;
+               }
                foreach ( self::getList() as $name => $rec ) {
                        $page = self::getPage( $name );
                        if (
                                $page->isListed()
                                && $page->isRestricted()
-                               && $page->userCanExecute( $wgUser )
+                               && $page->userCanExecute( $user )
                        ) {
                                $pages[$name] = $page;
                        }
@@ -567,13 +574,16 @@ class SpecialPageFactory {
                } else {
                        // Try harder in case someone misspelled the correct casing
                        $found = false;
-                       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;
+                       // Check for $aliases being an array since Language::getSpecialPageAliases can return null
+                       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;
+                                       }
                                }
                        }
                        if ( !$found ) {
index f739d3b..c42c089 100644 (file)
  * @ingroup SpecialPage
  */
 class ActiveUsersPager extends UsersPager {
-
        /**
         * @var FormOptions
         */
        protected $opts;
 
        /**
-        * @var Array
+        * @var array
         */
        protected $hideGroups = array();
 
        /**
-        * @var Array
+        * @var array
         */
        protected $hideRights = array();
 
        /**
-        * @param $context IContextSource
-        * @param $group null Unused
+        * @param IContextSource $context
+        * @param null $group Unused
         * @param string $par Parameter passed to the page
         */
        function __construct( IContextSource $context = null, $group = null, $par = null ) {
@@ -194,20 +193,31 @@ class ActiveUsersPager extends UsersPager {
                $self = $this->getTitle();
                $limit = $this->mLimit ? Html::hidden( 'limit', $this->mLimit ) : '';
 
-               $out = Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) ); # Form tag
+               # Form tag
+               $out = Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) );
                $out .= Xml::fieldset( $this->msg( 'activeusers' )->text() ) . "\n";
                $out .= Html::hidden( 'title', $self->getPrefixedDBkey() ) . $limit . "\n";
 
+               # Username field
                $out .= Xml::inputLabel( $this->msg( 'activeusers-from' )->text(),
-                       'username', 'offset', 20, $this->requestedUser, array( 'tabindex' => 1 ) ) . '<br />';# Username field
+                       'username', 'offset', 20, $this->requestedUser, array( 'tabindex' => 1 ) ) . '<br />';
 
                $out .= Xml::checkLabel( $this->msg( 'activeusers-hidebots' )->text(),
                        'hidebots', 'hidebots', $this->opts->getValue( 'hidebots' ), array( 'tabindex' => 2 ) );
 
-               $out .= Xml::checkLabel( $this->msg( 'activeusers-hidesysops' )->text(),
-                       'hidesysops', 'hidesysops', $this->opts->getValue( 'hidesysops' ), array( 'tabindex' => 3 ) ) . '<br />';
-
-               $out .= Xml::submitButton( $this->msg( 'allpagessubmit' )->text(), array( 'tabindex' => 4 ) ) . "\n";# Submit button and form bottom
+               $out .= Xml::checkLabel(
+                       $this->msg( 'activeusers-hidesysops' )->text(),
+                       'hidesysops',
+                       'hidesysops',
+                       $this->opts->getValue( 'hidesysops' ),
+                       array( 'tabindex' => 3 )
+               ) . '<br />';
+
+               # Submit button and form bottom
+               $out .= Xml::submitButton(
+                       $this->msg( 'allpagessubmit' )->text(),
+                       array( 'tabindex' => 4 )
+               ) . "\n";
                $out .= Xml::closeElement( 'fieldset' );
                $out .= Xml::closeElement( 'form' );
 
@@ -230,7 +240,7 @@ class SpecialActiveUsers extends SpecialPage {
        /**
         * Show the special page
         *
-        * @param $par Mixed: parameter passed to the page or null
+        * @param string $par Parameter passed to the page or null
         */
        public function execute( $par ) {
                global $wgActiveUserDays;
@@ -270,8 +280,8 @@ class SpecialActiveUsers extends SpecialPage {
        }
 
        /**
-        * @param integer $period Seconds (do updates no more often than this)
-        * @return integer How many seconds old the cache is
+        * @param intr $period Seconds (do updates no more often than this)
+        * @return int How many seconds old the cache is
         */
        public static function mergeActiveUsers( $period ) {
                global $wgActiveUserDays;
@@ -311,7 +321,7 @@ class SpecialActiveUsers extends SpecialPage {
         * Update the query cache as needed
         *
         * @param DatabaseBase $dbw
-        * @param integer $window Maximum time range of new data to scan (in seconds)
+        * @param int $window Maximum time range of new data to scan (in seconds)
         * @return bool Success
         */
        protected static function doQueryCacheUpdate( DatabaseBase $dbw, $window ) {
index 6b382ad..687cbd0 100644 (file)
@@ -43,7 +43,7 @@ class SpecialAllmessages extends SpecialPage {
        /**
         * Show the special page
         *
-        * @param $par Mixed: parameter passed to the page or null
+        * @param string $par Parameter passed to the page or null
         */
        public function execute( $par ) {
                $request = $this->getRequest();
@@ -253,7 +253,7 @@ class AllmessagesTablePager extends TablePager {
         * @param array $messageNames
         * @param string $langcode What language code
         * @param bool $foreign Whether the $langcode is not the content language
-        * @return array: a 'pages' and 'talks' array with the keys of existing pages
+        * @return array A 'pages' and 'talks' array with the keys of existing pages
         */
        public static function getCustomisedStatuses( $messageNames, $langcode = 'en', $foreign = false ) {
                // FIXME: This function should be moved to Language:: or something.
@@ -272,19 +272,23 @@ class AllmessagesTablePager extends TablePager {
 
                foreach ( $res as $s ) {
                        $exists = false;
+
                        if ( $foreign ) {
-                               $title = explode( '/', $s->page_title );
-                               if ( count( $title ) === 2 && $langcode === $title[1]
-                                       && isset( $xNames[$title[0]] )
+                               $titleParts = explode( '/', $s->page_title );
+                               if ( count( $titleParts ) === 2 &&
+                                       $langcode === $titleParts[1] &&
+                                       isset( $xNames[$titleParts[0]] )
                                ) {
-                                       $exists = $title[0];
+                                       $exists = $titleParts[0];
                                }
                        } elseif ( isset( $xNames[$s->page_title] ) ) {
                                $exists = $s->page_title;
                        }
-                       if ( $exists && $s->page_namespace === NS_MEDIAWIKI ) {
+
+                       $title = Title::newFromRow( $s );
+                       if ( $exists && $title->inNamespace( NS_MEDIAWIKI ) ) {
                                $pageFlags[$exists] = true;
-                       } elseif ( $exists && $s->page_namespace === NS_MEDIAWIKI_TALK ) {
+                       } elseif ( $exists && $title->inNamespace( NS_MEDIAWIKI_TALK ) ) {
                                $talkFlags[$exists] = true;
                        }
                }
index 70949d4..0490d82 100644 (file)
@@ -35,30 +35,6 @@ class SpecialAllpages extends IncludableSpecialPage {
         */
        protected $maxPerPage = 345;
 
-       /**
-        * Maximum number of pages to show on single index subpage.
-        *
-        * @var int $maxLineCount
-        */
-       protected $maxLineCount = 100;
-
-       /**
-        * Maximum number of chars to show for an entry.
-        *
-        * @var int $maxPageLength
-        */
-       protected $maxPageLength = 70;
-
-       /**
-        * Maximum number of pages in a hierarchical ("top level") list.
-        *
-        * Traversal of the entire page list by spidering the top levels is thought
-        * to require O(N^3) DB CPU time where N is the number of pages on the wiki.
-        * See bug 56840. If this limit is exceeded, the behaviour becomes like a
-        * simple alphabetic pager.
-        */
-       protected $maxTopLevelPages = 50000;
-
        /**
         * Determines, which message describes the input field 'nsfrom'.
         *
@@ -78,7 +54,7 @@ class SpecialAllpages extends IncludableSpecialPage {
        /**
         * Entry point : initialise variables and call subfunctions.
         *
-        * @param string $par becomes "FOO" when called like Special:Allpages/FOO (default NULL)
+        * @param string $par becomes "FOO" when called like Special:Allpages/FOO (default null)
         */
        function execute( $par ) {
                $request = $this->getRequest();
@@ -115,10 +91,10 @@ class SpecialAllpages extends IncludableSpecialPage {
        /**
         * HTML for the top form
         *
-        * @param $namespace Integer: a namespace constant (default NS_MAIN).
-        * @param string $from dbKey we are starting listing at.
-        * @param string $to dbKey we are ending listing at.
-        * @param bool $hideredirects dont show redirects  (default FALSE)
+        * @param int $namespace A namespace constant (default NS_MAIN).
+        * @param string $from DbKey we are starting listing at.
+        * @param string $to DbKey we are ending listing at.
+        * @param bool $hideredirects Dont show redirects  (default false)
         * @return string
         */
        function namespaceForm( $namespace = NS_MAIN, $from = '', $to = '', $hideredirects = false ) {
@@ -174,196 +150,25 @@ class SpecialAllpages extends IncludableSpecialPage {
        }
 
        /**
-        * @param $namespace Integer (default NS_MAIN)
-        * @param string $from list all pages from this name
-        * @param string $to list all pages to this name
-        * @param bool $hideredirects dont show redirects (default FALSE)
+        * @param int $namespace (default NS_MAIN)
+        * @param string $from List all pages from this name
+        * @param string $to List all pages to this name
+        * @param bool $hideredirects Dont show redirects (default false)
         */
        function showToplevel( $namespace = NS_MAIN, $from = '', $to = '', $hideredirects = false ) {
-               $output = $this->getOutput();
-
-               # TODO: Either make this *much* faster or cache the title index points
-               # in the querycache table.
-
-               $dbr = wfGetDB( DB_SLAVE );
-               $out = "";
-               $where = array( 'page_namespace' => $namespace );
-
-               if ( $hideredirects ) {
-                       $where['page_is_redirect'] = 0;
-               }
-
                $from = Title::makeTitleSafe( $namespace, $from );
                $to = Title::makeTitleSafe( $namespace, $to );
                $from = ( $from && $from->isLocal() ) ? $from->getDBkey() : null;
                $to = ( $to && $to->isLocal() ) ? $to->getDBkey() : null;
 
-               if ( isset( $from ) ) {
-                       $where[] = 'page_title >= ' . $dbr->addQuotes( $from );
-               }
-
-               if ( isset( $to ) ) {
-                       $where[] = 'page_title <= ' . $dbr->addQuotes( $to );
-               }
-
-               global $wgMemc;
-               $key = wfMemcKey( 'allpages', 'ns', $namespace, sha1( $from ), sha1( $to ) );
-               $lines = $wgMemc->get( $key );
-
-               $count = $dbr->estimateRowCount( 'page', '*', $where, __METHOD__ );
-
-               // Don't show a hierarchical list if the number of pages is very large,
-               // since generating it will cause a lot of scanning
-               if ( $count > $this->maxTopLevelPages ) {
-                       $this->showChunk( $namespace, $from, $to, $hideredirects );
-
-                       return;
-               }
-
-               $maxPerSubpage = intval( $count / $this->maxLineCount );
-               $maxPerSubpage = max( $maxPerSubpage, $this->maxPerPage );
-
-               if ( !is_array( $lines ) ) {
-                       $options = array( 'LIMIT' => 1 );
-                       $options['ORDER BY'] = 'page_title ASC';
-                       $firstTitle = $dbr->selectField( 'page', 'page_title', $where, __METHOD__, $options );
-                       $lastTitle = $firstTitle;
-                       # This array is going to hold the page_titles in order.
-                       $lines = array( $firstTitle );
-                       # If we are going to show n rows, we need n+1 queries to find the relevant titles.
-                       $done = false;
-                       while ( !$done ) {
-                               // Fetch the last title of this chunk and the first of the next
-                               $chunk = ( $lastTitle === false )
-                                       ? array()
-                                       : array( 'page_title >= ' . $dbr->addQuotes( $lastTitle ) );
-                               $res = $dbr->select( 'page', /* FROM */
-                                       'page_title', /* WHAT */
-                                       array_merge( $where, $chunk ),
-                                       __METHOD__,
-                                       array( 'LIMIT' => 2, 'OFFSET' => $maxPerSubpage - 1, 'ORDER BY' => 'page_title ASC' )
-                               );
-
-                               $s = $dbr->fetchObject( $res );
-                               if ( $s ) {
-                                       array_push( $lines, $s->page_title );
-                               } else {
-                                       // Final chunk, but ended prematurely. Go back and find the end.
-                                       $endTitle = $dbr->selectField( 'page', 'MAX(page_title)',
-                                               array_merge( $where, $chunk ),
-                                               __METHOD__ );
-                                       array_push( $lines, $endTitle );
-                                       $done = true;
-                               }
-
-                               $s = $res->fetchObject();
-                               if ( $s ) {
-                                       array_push( $lines, $s->page_title );
-                                       $lastTitle = $s->page_title;
-                               } else {
-                                       // This was a final chunk and ended exactly at the limit.
-                                       // Rare but convenient!
-                                       $done = true;
-                               }
-                               $res->free();
-                       }
-                       $wgMemc->add( $key, $lines, 3600 );
-               }
-
-               // If there are only two or less sections, don't even display them.
-               // Instead, display the first section directly.
-               if ( count( $lines ) <= 2 ) {
-                       if ( !empty( $lines ) ) {
-                               $this->showChunk( $namespace, $from, $to, $hideredirects );
-                       } else {
-                               $output->addHTML( $this->namespaceForm( $namespace, $from, $to, $hideredirects ) );
-                       }
-
-                       return;
-               }
-
-               # At this point, $lines should contain an even number of elements.
-               $out .= Xml::openElement( 'table', array( 'class' => 'allpageslist' ) );
-               while ( count( $lines ) > 0 ) {
-                       $inpoint = array_shift( $lines );
-                       $outpoint = array_shift( $lines );
-                       $out .= $this->showline( $inpoint, $outpoint, $namespace, $hideredirects );
-               }
-               $out .= Xml::closeElement( 'table' );
-               $nsForm = $this->namespaceForm( $namespace, $from, $to, $hideredirects );
-
-               # Is there more?
-               if ( $this->including() ) {
-                       $out2 = '';
-               } else {
-                       if ( isset( $from ) || isset( $to ) ) {
-                               $out2 = Xml::openElement( 'table', array( 'class' => 'mw-allpages-table-form' ) ) .
-                                       '<tr>
-                                                       <td>' .
-                                       $nsForm .
-                                       '</td>
-                                                       <td class="mw-allpages-nav">' .
-                                       Linker::link( $this->getPageTitle(), $this->msg( 'allpages' )->escaped(),
-                                               array(), array(), 'known' ) .
-                                       "</td>
-                                               </tr>" .
-                                       Xml::closeElement( 'table' );
-                       } else {
-                               $out2 = $nsForm;
-                       }
-               }
-               $output->addHTML( $out2 . $out );
-       }
-
-       /**
-        * Show a line of "ABC to DEF" ranges of articles
-        *
-        * @param string $inpoint lower limit of pagenames
-        * @param string $outpoint upper limit of pagenames
-        * @param $namespace Integer (Default NS_MAIN)
-        * @param bool $hideRedirects don't show redirects. Default: false
-        * @return string
-        */
-       function showline( $inpoint, $outpoint, $namespace = NS_MAIN, $hideRedirects = false ) {
-               // Use content language since page titles are considered to use content language
-               global $wgContLang;
-
-               $inpointf = str_replace( '_', ' ', $inpoint );
-               $outpointf = str_replace( '_', ' ', $outpoint );
-
-               // Don't let the length runaway
-               $inpointf = $wgContLang->truncate( $inpointf, $this->maxPageLength );
-               $outpointf = $wgContLang->truncate( $outpointf, $this->maxPageLength );
-
-               $queryParams = array(
-                       'from' => $inpoint,
-                       'to' => $outpoint,
-               );
-
-               if ( $namespace ) {
-                       $queryParams['namespace'] = $namespace;
-               }
-               if ( $hideRedirects ) {
-                       $queryParams['hideredirects'] = 1;
-               }
-
-               $url = $this->getPageTitle()->getLocalURL( $queryParams );
-               $inlink = Html::element( 'a', array( 'href' => $url ), $inpointf );
-               $outlink = Html::element( 'a', array( 'href' => $url ), $outpointf );
-
-               $out = $this->msg( 'alphaindexline' )->rawParams(
-                       "$inlink</td><td>",
-                       "</td><td>$outlink"
-               )->escaped();
-
-               return '<tr><td class="mw-allpages-alphaindexline">' . $out . '</td></tr>';
+               $this->showChunk( $namespace, $from, $to, $hideredirects );
        }
 
        /**
         * @param int $namespace Namespace (Default NS_MAIN)
-        * @param string $from list all pages from this name (default FALSE)
-        * @param string $to list all pages to this name (default FALSE)
-        * @param bool $hideredirects dont show redirects (default FALSE)
+        * @param string $from List all pages from this name (default false)
+        * @param string $to List all pages to this name (default false)
+        * @param bool $hideredirects Dont show redirects (default false)
         */
        function showChunk( $namespace = NS_MAIN, $from = false, $to = false, $hideredirects = false ) {
                $output = $this->getOutput();
@@ -441,127 +246,126 @@ class SpecialAllpages extends IncludableSpecialPage {
                }
 
                if ( $this->including() ) {
-                       $out2 = '';
+                       $output->addHTML( $out );
+                       return;
+               }
+
+               if ( $from == '' ) {
+                       // First chunk; no previous link.
+                       $prevTitle = null;
                } else {
-                       if ( $from == '' ) {
-                               // First chunk; no previous link.
-                               $prevTitle = null;
-                       } else {
-                               # Get the last title from previous chunk
-                               $dbr = wfGetDB( DB_SLAVE );
-                               $res_prev = $dbr->select(
-                                       'page',
-                                       'page_title',
-                                       array( 'page_namespace' => $namespace, 'page_title < ' . $dbr->addQuotes( $from ) ),
-                                       __METHOD__,
-                                       array( 'ORDER BY' => 'page_title DESC',
-                                               'LIMIT' => $this->maxPerPage, 'OFFSET' => ( $this->maxPerPage - 1 )
-                                       )
-                               );
+                       # Get the last title from previous chunk
+                       $dbr = wfGetDB( DB_SLAVE );
+                       $res_prev = $dbr->select(
+                               'page',
+                               'page_title',
+                               array( 'page_namespace' => $namespace, 'page_title < ' . $dbr->addQuotes( $from ) ),
+                               __METHOD__,
+                               array( 'ORDER BY' => 'page_title DESC',
+                                       'LIMIT' => $this->maxPerPage, 'OFFSET' => ( $this->maxPerPage - 1 )
+                               )
+                       );
 
-                               # Get first title of previous complete chunk
-                               if ( $dbr->numrows( $res_prev ) >= $this->maxPerPage ) {
-                                       $pt = $dbr->fetchObject( $res_prev );
-                                       $prevTitle = Title::makeTitle( $namespace, $pt->page_title );
+                       # Get first title of previous complete chunk
+                       if ( $dbr->numrows( $res_prev ) >= $this->maxPerPage ) {
+                               $pt = $dbr->fetchObject( $res_prev );
+                               $prevTitle = Title::makeTitle( $namespace, $pt->page_title );
+                       } else {
+                               # The previous chunk is not complete, need to link to the very first title
+                               # available in the database
+                               $options = array( 'LIMIT' => 1 );
+                               if ( !$dbr->implicitOrderby() ) {
+                                       $options['ORDER BY'] = 'page_title';
+                               }
+                               $reallyFirstPage_title = $dbr->selectField( 'page', 'page_title',
+                                       array( 'page_namespace' => $namespace ), __METHOD__, $options );
+                               # Show the previous link if it s not the current requested chunk
+                               if ( $from != $reallyFirstPage_title ) {
+                                       $prevTitle = Title::makeTitle( $namespace, $reallyFirstPage_title );
                                } else {
-                                       # The previous chunk is not complete, need to link to the very first title
-                                       # available in the database
-                                       $options = array( 'LIMIT' => 1 );
-                                       if ( !$dbr->implicitOrderby() ) {
-                                               $options['ORDER BY'] = 'page_title';
-                                       }
-                                       $reallyFirstPage_title = $dbr->selectField( 'page', 'page_title',
-                                               array( 'page_namespace' => $namespace ), __METHOD__, $options );
-                                       # Show the previous link if it s not the current requested chunk
-                                       if ( $from != $reallyFirstPage_title ) {
-                                               $prevTitle = Title::makeTitle( $namespace, $reallyFirstPage_title );
-                                       } else {
-                                               $prevTitle = null;
-                                       }
+                                       $prevTitle = null;
                                }
                        }
+               }
 
-                       $self = $this->getPageTitle();
-
-                       $nsForm = $this->namespaceForm( $namespace, $from, $to, $hideredirects );
-                       $out2 = Xml::openElement( 'table', array( 'class' => 'mw-allpages-table-form' ) ) .
-                               '<tr>
-                                                       <td>' .
-                               $nsForm .
-                               '</td>
-                                                       <td class="mw-allpages-nav">' .
-                               Linker::link( $self, $this->msg( 'allpages' )->escaped() );
-
-                       # Do we put a previous link ?
-                       if ( isset( $prevTitle ) && $pt = $prevTitle->getText() ) {
-                               $query = array( 'from' => $prevTitle->getText() );
+               $self = $this->getPageTitle();
 
-                               if ( $namespace ) {
-                                       $query['namespace'] = $namespace;
-                               }
+               $topLinks = array(
+                       Linker::link( $self, $this->msg( 'allpages' )->escaped() )
+               );
+               $bottomLinks = array();
 
-                               if ( $hideredirects ) {
-                                       $query['hideredirects'] = $hideredirects;
-                               }
+               # Do we put a previous link ?
+               if ( $prevTitle && $pt = $prevTitle->getText() ) {
+                       $query = array( 'from' => $prevTitle->getText() );
 
-                               $prevLink = Linker::linkKnown(
-                                       $self,
-                                       $this->msg( 'prevpage', $pt )->escaped(),
-                                       array(),
-                                       $query
-                               );
-                               $out2 = $this->getLanguage()->pipeList( array( $out2, $prevLink ) );
+                       if ( $namespace ) {
+                               $query['namespace'] = $namespace;
                        }
 
-                       if ( $n == $this->maxPerPage && $s = $res->fetchObject() ) {
-                               # $s is the first link of the next chunk
-                               $t = Title::makeTitle( $namespace, $s->page_title );
-                               $query = array( 'from' => $t->getText() );
+                       if ( $hideredirects ) {
+                               $query['hideredirects'] = $hideredirects;
+                       }
 
-                               if ( $namespace ) {
-                                       $query['namespace'] = $namespace;
-                               }
+                       $prevLink = Linker::linkKnown(
+                               $self,
+                               $this->msg( 'prevpage', $pt )->escaped(),
+                               array(),
+                               $query
+                       );
+                       $topLinks[] = $prevLink;
+                       $bottomLinks[] = $prevLink;
+               }
 
-                               if ( $hideredirects ) {
-                                       $query['hideredirects'] = $hideredirects;
-                               }
+               if ( $n == $this->maxPerPage && $s = $res->fetchObject() ) {
+                       # $s is the first link of the next chunk
+                       $t = Title::makeTitle( $namespace, $s->page_title );
+                       $query = array( 'from' => $t->getText() );
 
-                               $nextLink = Linker::linkKnown(
-                                       $self,
-                                       $this->msg( 'nextpage', $t->getText() )->escaped(),
-                                       array(),
-                                       $query
-                               );
-                               $out2 = $this->getLanguage()->pipeList( array( $out2, $nextLink ) );
+                       if ( $namespace ) {
+                               $query['namespace'] = $namespace;
                        }
-                       $out2 .= "</td></tr></table>";
-               }
 
-               $output->addHTML( $out2 . $out );
+                       if ( $hideredirects ) {
+                               $query['hideredirects'] = $hideredirects;
+                       }
 
-               $links = array();
-               if ( isset( $prevLink ) ) {
-                       $links[] = $prevLink;
+                       $nextLink = Linker::linkKnown(
+                               $self,
+                               $this->msg( 'nextpage', $t->getText() )->escaped(),
+                               array(),
+                               $query
+                       );
+                       $topLinks[] = $nextLink;
+                       $bottomLinks[] = $nextLink;
                }
 
-               if ( isset( $nextLink ) ) {
-                       $links[] = $nextLink;
-               }
+               $nsForm = $this->namespaceForm( $namespace, $from, $to, $hideredirects );
+               $out2 = Xml::openElement( 'table', array( 'class' => 'mw-allpages-table-form' ) ) .
+                       '<tr>
+                                               <td>' .
+                       $nsForm .
+                       '</td>
+                                               <td class="mw-allpages-nav">' .
+                       $this->getLanguage()->pipeList( $topLinks ) .
+                       '</td></tr></table>';
+
+               $output->addHTML( $out2 . $out );
 
-               if ( count( $links ) ) {
+               if ( count( $bottomLinks ) ) {
                        $output->addHTML(
                                Html::element( 'hr' ) .
                                        Html::rawElement( 'div', array( 'class' => 'mw-allpages-nav' ),
-                                               $this->getLanguage()->pipeList( $links )
+                                               $this->getLanguage()->pipeList( $bottomLinks )
                                        )
                        );
                }
        }
 
        /**
-        * @param $ns Integer: the namespace of the article
-        * @param string $text the name of the article
-        * @return array( int namespace, string dbkey, string pagename ) or NULL on error
+        * @param int $ns The namespace of the article
+        * @param string $text The name of the article
+        * @return array( int namespace, string dbkey, string pagename ) or null on error
         */
        protected function getNamespaceKeyAndText( $ns, $text ) {
                if ( $text == '' ) {
index 57637c9..8c46a93 100644 (file)
@@ -32,19 +32,19 @@ class SpecialBlock extends FormSpecialPage {
         * or as subpage (Special:Block/Foo) */
        protected $target;
 
-       /** @var Integer Block::TYPE_ constant */
+       /** @var int Block::TYPE_ constant */
        protected $type;
 
-       /** @var User|String the previous block target */
+       /** @var User|string The previous block target */
        protected $previousTarget;
 
-       /** @var Bool whether the previous submission of the form asked for HideUser */
+       /** @var bool Whether the previous submission of the form asked for HideUser */
        protected $requestedHideUser;
 
-       /** @var Bool */
+       /** @var bool */
        protected $alreadyBlocked;
 
-       /** @var Array */
+       /** @var array */
        protected $preErrors = array();
 
        public function __construct() {
@@ -70,7 +70,7 @@ class SpecialBlock extends FormSpecialPage {
        /**
         * Handle some magic here
         *
-        * @param $par String
+        * @param string $par
         */
        protected function setParameter( $par ) {
                # Extract variables from the request.  Try not to get into a situation where we
@@ -84,14 +84,15 @@ class SpecialBlock extends FormSpecialPage {
                        $this->getSkin()->setRelevantUser( $this->target );
                }
 
-               list( $this->previousTarget, /*...*/ ) = Block::parseTarget( $request->getVal( 'wpPreviousTarget' ) );
+               list( $this->previousTarget, /*...*/ ) =
+                       Block::parseTarget( $request->getVal( 'wpPreviousTarget' ) );
                $this->requestedHideUser = $request->getBool( 'wpHideUser' );
        }
 
        /**
         * Customizes the HTMLForm a bit
         *
-        * @param $form HTMLForm
+        * @param HTMLForm $form
         */
        protected function alterForm( HTMLForm $form ) {
                $form->setWrapperLegendMsg( 'blockip-legend' );
@@ -116,7 +117,7 @@ class SpecialBlock extends FormSpecialPage {
 
        /**
         * Get the HTMLForm descriptor array for the block form
-        * @return Array
+        * @return array
         */
        protected function getFormFields() {
                global $wgBlockAllowsUTEdit;
@@ -128,8 +129,7 @@ class SpecialBlock extends FormSpecialPage {
                $a = array(
                        'Target' => array(
                                'type' => 'text',
-                               'label-message' => 'ipadressorusername',
-                               'tabindex' => '1',
+                               'label-message' => 'ipaddressorusername',
                                'id' => 'mw-bi-target',
                                'size' => '45',
                                'autofocus' => true,
@@ -140,7 +140,6 @@ class SpecialBlock extends FormSpecialPage {
                                'type' => !count( $suggestedDurations ) ? 'text' : 'selectorother',
                                'label-message' => 'ipbexpiry',
                                'required' => true,
-                               'tabindex' => '2',
                                'options' => $suggestedDurations,
                                'other' => $this->msg( 'ipbother' )->text(),
                                'default' => $this->msg( 'ipb-default-expiry' )->inContentLanguage()->text(),
@@ -227,7 +226,7 @@ class SpecialBlock extends FormSpecialPage {
         * If the user has already been blocked with similar settings, load that block
         * and change the defaults for the form fields to match the existing settings.
         * @param array $fields HTMLForm descriptor array
-        * @return Bool whether fields were altered (that is, whether the target is
+        * @return bool Whether fields were altered (that is, whether the target is
         *     already blocked)
         */
        protected function maybeAlterFormDefaults( &$fields ) {
@@ -305,7 +304,7 @@ class SpecialBlock extends FormSpecialPage {
 
        /**
         * Add header elements like block log entries, etc.
-        * @return String
+        * @return string
         */
        protected function preText() {
                $this->getOutput()->addModules( 'mediawiki.special.block' );
@@ -361,7 +360,10 @@ class SpecialBlock extends FormSpecialPage {
 
                # Link to unblock the specified user, or to a blank unblock form
                if ( $this->target instanceof User ) {
-                       $message = $this->msg( 'ipb-unblock-addr', wfEscapeWikiText( $this->target->getName() ) )->parse();
+                       $message = $this->msg(
+                               'ipb-unblock-addr',
+                               wfEscapeWikiText( $this->target->getName() )
+                       )->parse();
                        $list = SpecialPage::getTitleFor( 'Unblock', $this->target->getName() );
                } else {
                        $message = $this->msg( 'ipb-unblock' )->parse();
@@ -436,7 +438,7 @@ class SpecialBlock extends FormSpecialPage {
        /**
         * Get a user page target for things like logs.
         * This handles account and IP range targets.
-        * @param $target User|string
+        * @param User|string $target
         * @return Title|null
         */
        protected static function getTargetUserTitle( $target ) {
@@ -451,10 +453,10 @@ class SpecialBlock extends FormSpecialPage {
 
        /**
         * Determine the target of the block, and the type of target
-        * TODO: should be in Block.php?
+        * @todo Should be in Block.php?
         * @param string $par subpage parameter passed to setup, or data value from
         *     the HTMLForm
-        * @param $request WebRequest optionally try and get data from a request too
+        * @param WebRequest $request Optionally try and get data from a request too
         * @return array( User|string|null, Block::TYPE_ constant|null )
         */
        public static function getTargetAndType( $par, WebRequest $request = null ) {
@@ -503,9 +505,9 @@ class SpecialBlock extends FormSpecialPage {
        /**
         * HTMLForm field validation-callback for Target field.
         * @since 1.18
-        * @param $value String
-        * @param $alldata Array
-        * @param $form HTMLForm
+        * @param string $value
+        * @param array $alldata
+        * @param HTMLForm $form
         * @return Message
         */
        public static function validateTargetField( $value, $alldata, $form ) {
@@ -583,9 +585,9 @@ class SpecialBlock extends FormSpecialPage {
 
        /**
         * Submit callback for an HTMLForm object, will simply pass
-        * @param $data array
-        * @param $form HTMLForm
-        * @return Bool|String
+        * @param array $data
+        * @param HTMLForm $form
+        * @return bool|string
         */
        public static function processUIForm( array $data, HTMLForm $form ) {
                return self::processForm( $data, $form->getContext() );
@@ -593,9 +595,9 @@ class SpecialBlock extends FormSpecialPage {
 
        /**
         * Given the form data, actually implement a block
-        * @param $data Array
-        * @param $context IContextSource
-        * @return Bool|String
+        * @param array $data
+        * @param IContextSource $context
+        * @return bool|string
         */
        public static function processForm( array $data, IContextSource $context ) {
                global $wgBlockAllowsUTEdit, $wgHideUserContribLimit;
@@ -765,7 +767,11 @@ class SpecialBlock extends FormSpecialPage {
 
                # Can't watch a rangeblock
                if ( $type != Block::TYPE_RANGE && $data['Watch'] ) {
-                       WatchAction::doWatch( Title::makeTitle( NS_USER, $target ), $performer, WatchedItem::IGNORE_USER_RIGHTS );
+                       WatchAction::doWatch(
+                               Title::makeTitle( NS_USER, $target ),
+                               $performer,
+                               WatchedItem::IGNORE_USER_RIGHTS
+                       );
                }
 
                # Block constructor sanitizes certain block options on insert
@@ -799,9 +805,9 @@ class SpecialBlock extends FormSpecialPage {
         * Get an array of suggested block durations from MediaWiki:Ipboptions
         * @todo FIXME: This uses a rather odd syntax for the options, should it be converted
         *     to the standard "**<duration>|<displayname>" format?
-        * @param $lang Language|null the language to get the durations in, or null to use
+        * @param Language|null $lang The language to get the durations in, or null to use
         *     the wiki's content language
-        * @return Array
+        * @return array
         */
        public static function getSuggestedDurations( $lang = null ) {
                $a = array();
@@ -828,8 +834,8 @@ class SpecialBlock extends FormSpecialPage {
        /**
         * Convert a submitted expiry time, which may be relative ("2 weeks", etc) or absolute
         * ("24 May 2034", etc), into an absolute timestamp we can put into the database.
-        * @param string $expiry whatever was typed into the form
-        * @return String: timestamp or "infinity" string for the DB implementation
+        * @param string $expiry Whatever was typed into the form
+        * @return string Timestamp or "infinity" string for the DB implementation
         */
        public static function parseExpiryInput( $expiry ) {
                static $infinity;
@@ -854,8 +860,8 @@ class SpecialBlock extends FormSpecialPage {
 
        /**
         * Can we do an email block?
-        * @param $user User: the sysop wanting to make a block
-        * @return Boolean
+        * @param User $user The sysop wanting to make a block
+        * @return bool
         */
        public static function canBlockEmail( $user ) {
                global $wgEnableUserEmail, $wgSysopEmailBans;
@@ -867,9 +873,9 @@ class SpecialBlock extends FormSpecialPage {
         * bug 15810: blocked admins should not be able to block/unblock
         * others, and probably shouldn't be able to unblock themselves
         * either.
-        * @param $user User|Int|String
-        * @param $performer User user doing the request
-        * @return Bool|String true or error message key
+        * @param User|int|string $user
+        * @param User $performer User doing the request
+        * @return bool|string True or error message key
         */
        public static function checkUnblockSelf( $user, User $performer ) {
                if ( is_int( $user ) ) {
@@ -901,8 +907,8 @@ class SpecialBlock extends FormSpecialPage {
        /**
         * Return a comma-delimited list of "flags" to be passed to the log
         * reader for this block, to provide more information in the logs
-        * @param array $data from HTMLForm data
-        * @param $type Block::TYPE_ constant (USER, RANGE, or IP)
+        * @param array $data From HTMLForm data
+        * @param int $type Block::TYPE_ constant (USER, RANGE, or IP)
         * @return string
         */
        protected static function blockLogFlags( array $data, $type ) {
@@ -947,8 +953,8 @@ class SpecialBlock extends FormSpecialPage {
 
        /**
         * Process the form on POST submission.
-        * @param $data Array
-        * @return Bool|Array true for success, false for didn't-try, array of errors on failure
+        * @param array $data
+        * @return bool|array True for success, false for didn't-try, array of errors on failure
         */
        public function onSubmit( array $data ) {
                // This isn't used since we need that HTMLForm that's passed in the
@@ -969,7 +975,3 @@ class SpecialBlock extends FormSpecialPage {
                return 'users';
        }
 }
-
-# BC @since 1.18
-class IPBlockForm extends SpecialBlock {
-}
index 4e7043d..9170e3e 100644 (file)
@@ -27,8 +27,9 @@
  * @ingroup SpecialPage
  */
 class SpecialBlockList extends SpecialPage {
+       protected $target;
 
-       protected $target, $options;
+       protected $options;
 
        function __construct() {
                parent::__construct( 'BlockList' );
@@ -37,7 +38,7 @@ class SpecialBlockList extends SpecialPage {
        /**
         * Main execution point
         *
-        * @param string $par title fragment
+        * @param string $par Title fragment
         */
        public function execute( $par ) {
                $this->setHeaders();
@@ -67,7 +68,7 @@ class SpecialBlockList extends SpecialPage {
                $fields = array(
                        'Target' => array(
                                'type' => 'text',
-                               'label-message' => 'ipadressorusername',
+                               'label-message' => 'ipaddressorusername',
                                'tabindex' => '1',
                                'size' => '45',
                                'default' => $this->target,
@@ -203,7 +204,11 @@ class SpecialBlockList extends SpecialPage {
                        foreach ( $otherBlockLink as $link ) {
                                $list .= Html::rawElement( 'li', array(), $link ) . "\n";
                        }
-                       $out->addHTML( Html::rawElement( 'ul', array( 'class' => 'mw-ipblocklist-otherblocks' ), $list ) . "\n" );
+                       $out->addHTML( Html::rawElement(
+                               'ul',
+                               array( 'class' => 'mw-ipblocklist-otherblocks' ),
+                               $list
+                       ) . "\n" );
                }
        }
 
@@ -217,8 +222,8 @@ class BlockListPager extends TablePager {
        protected $page;
 
        /**
-        * @param $page SpecialPage
-        * @param $conds Array
+        * @param SpecialPage $page
+        * @param array $conds
         */
        function __construct( $page, $conds ) {
                $this->page = $page;
@@ -461,8 +466,8 @@ class HTMLBlockedUsersItemSelect extends HTMLSelectField {
         * Basically don't do any validation. If it's a number that's fine. Also,
         * add it to the list if it's not there already
         *
-        * @param $value
-        * @param $alldata
+        * @param string $value
+        * @param array $alldata
         * @return bool
         */
        function validate( $value, $alldata ) {
@@ -471,11 +476,15 @@ class HTMLBlockedUsersItemSelect extends HTMLSelectField {
                }
 
                // Let folks pick an explicit limit not from our list, as long as it's a real numbr.
-               if ( !in_array( $value, $this->mParams['options'] ) && $value == intval( $value ) && $value > 0 ) {
+               if ( !in_array( $value, $this->mParams['options'] )
+                       && $value == intval( $value )
+                       && $value > 0
+               ) {
                        // This adds the explicitly requested limit value to the drop-down,
                        // then makes sure it's sorted correctly so when we output the list
                        // later, the custom option doesn't just show up last.
-                       $this->mParams['options'][$this->mParent->getLanguage()->formatNum( $value )] = intval( $value );
+                       $this->mParams['options'][$this->mParent->getLanguage()->formatNum( $value )] =
+                               intval( $value );
                        asort( $this->mParams['options'] );
                }
 
index 79636b1..581619f 100644 (file)
@@ -30,7 +30,6 @@
  * @ingroup SpecialPage
  */
 class SpecialBookSources extends SpecialPage {
-
        /**
         * ISBN passed to the page, if any
         */
@@ -55,7 +54,10 @@ class SpecialBookSources extends SpecialPage {
                $this->getOutput()->addHTML( $this->makeForm() );
                if ( strlen( $this->isbn ) > 0 ) {
                        if ( !self::isValidISBN( $this->isbn ) ) {
-                               $this->getOutput()->wrapWikiMsg( "<div class=\"error\">\n$1\n</div>", 'booksources-invalid-isbn' );
+                               $this->getOutput()->wrapWikiMsg(
+                                       "<div class=\"error\">\n$1\n</div>",
+                                       'booksources-invalid-isbn'
+                               );
                        }
                        $this->showList();
                }
@@ -118,10 +120,21 @@ class SpecialBookSources extends SpecialPage {
                global $wgScript;
 
                $form = Html::openElement( 'fieldset' ) . "\n";
-               $form .= Html::element( 'legend', array(), $this->msg( 'booksources-search-legend' )->text() ) . "\n";
+               $form .= Html::element(
+                       'legend',
+                       array(),
+                       $this->msg( 'booksources-search-legend' )->text()
+               ) . "\n";
                $form .= Html::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) ) . "\n";
                $form .= Html::hidden( 'title', $this->getPageTitle()->getPrefixedText() ) . "\n";
-               $form .= '<p>' . Xml::inputLabel( $this->msg( 'booksources-isbn' )->text(), 'isbn', 'isbn', 20, $this->isbn, array( 'autofocus' => true ) );
+               $form .= '<p>' . Xml::inputLabel(
+                       $this->msg( 'booksources-isbn' )->text(),
+                       'isbn',
+                       'isbn',
+                       20,
+                       $this->isbn,
+                       array( 'autofocus' => true )
+               );
                $form .= '&#160;' . Xml::submitButton( $this->msg( 'booksources-go' )->text() ) . "</p>\n";
                $form .= Html::closeElement( 'form' ) . "\n";
                $form .= Html::closeElement( 'fieldset' ) . "\n";
index b2ddc22..1bbdbea 100644 (file)
@@ -28,7 +28,6 @@
  * @ingroup SpecialPage
  */
 class BrokenRedirectsPage extends QueryPage {
-
        function __construct( $name = 'BrokenRedirects' ) {
                parent::__construct( $name );
        }
@@ -148,7 +147,8 @@ class BrokenRedirectsPage extends QueryPage {
                        );
                }
 
-               $out .= $this->msg( 'parentheses' )->rawParams( $this->getLanguage()->pipeList( $links ) )->escaped();
+               $out .= $this->msg( 'parentheses' )->rawParams( $this->getLanguage()
+                       ->pipeList( $links ) )->escaped();
                $out .= " {$arr} {$to}";
 
                return $out;
index 39305f0..cb9b07c 100644 (file)
@@ -38,7 +38,6 @@
  * @since 1.20
  */
 abstract class SpecialCachedPage extends SpecialPage implements ICacheHelper {
-
        /**
         * CacheHelper object to which we forward the non-SpecialPage specific caching work.
         * Initialized in startCache.
@@ -52,7 +51,7 @@ abstract class SpecialCachedPage extends SpecialPage implements ICacheHelper {
         * If the cache is enabled or not.
         *
         * @since 1.20
-        * @var boolean
+        * @var bool
         */
        protected $cacheEnabled = true;
 
@@ -61,7 +60,7 @@ abstract class SpecialCachedPage extends SpecialPage implements ICacheHelper {
         *
         * @since 1.20
         *
-        * @param $subPage string|null
+        * @param string|null $subPage
         */
        protected function afterExecute( $subPage ) {
                $this->saveCache();
@@ -73,7 +72,7 @@ abstract class SpecialCachedPage extends SpecialPage implements ICacheHelper {
         * Sets if the cache should be enabled or not.
         *
         * @since 1.20
-        * @param boolean $cacheEnabled
+        * @param bool $cacheEnabled
         */
        public function setCacheEnabled( $cacheEnabled ) {
                $this->cacheHelper->setCacheEnabled( $cacheEnabled );
@@ -85,8 +84,8 @@ abstract class SpecialCachedPage extends SpecialPage implements ICacheHelper {
         *
         * @since 1.20
         *
-        * @param integer|null $cacheExpiry Sets the cache expiry, either ttl in seconds or unix timestamp.
-        * @param boolean|null $cacheEnabled Sets if the cache should be enabled or not.
+        * @param int|null $cacheExpiry Sets the cache expiry, either ttl in seconds or unix timestamp.
+        * @param bool|null $cacheEnabled Sets if the cache should be enabled or not.
         */
        public function startCache( $cacheExpiry = null, $cacheEnabled = null ) {
                if ( !isset( $this->cacheHelper ) ) {
@@ -142,7 +141,11 @@ abstract class SpecialCachedPage extends SpecialPage implements ICacheHelper {
         * @param string|null $key
         */
        public function addCachedHTML( $computeFunction, $args = array(), $key = null ) {
-               $this->getOutput()->addHTML( $this->cacheHelper->getCachedValue( $computeFunction, $args, $key ) );
+               $this->getOutput()->addHTML( $this->cacheHelper->getCachedValue(
+                       $computeFunction,
+                       $args,
+                       $key
+               ) );
        }
 
        /**
@@ -158,11 +161,12 @@ abstract class SpecialCachedPage extends SpecialPage implements ICacheHelper {
        }
 
        /**
-        * Sets the time to live for the cache, in seconds or a unix timestamp indicating the point of expiry.
+        * Sets the time to live for the cache, in seconds or a unix timestamp
+        * indicating the point of expiry.
         *
         * @since 1.20
         *
-        * @param integer $cacheExpiry
+        * @param int $cacheExpiry
         */
        public function setExpiry( $cacheExpiry ) {
                $this->cacheHelper->setExpiry( $cacheExpiry );
@@ -187,7 +191,7 @@ abstract class SpecialCachedPage extends SpecialPage implements ICacheHelper {
         *
         * @since 1.20
         *
-        * @param boolean $hasCached
+        * @param bool $hasCached
         */
        public function onCacheInitialized( $hasCached ) {
                if ( $hasCached ) {
index e678259..c57e33b 100644 (file)
@@ -27,7 +27,6 @@
  * @ingroup SpecialPage
  */
 class SpecialChangeEmail extends UnlistedSpecialPage {
-
        /**
         * Users password
         * @var string
@@ -45,7 +44,7 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
        }
 
        /**
-        * @return Bool
+        * @return bool
         */
        function isListed() {
                global $wgAuth;
@@ -55,6 +54,7 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
 
        /**
         * Main execution point
+        * @param string $par
         */
        function execute( $par ) {
                global $wgAuth;
@@ -114,7 +114,7 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
        }
 
        /**
-        * @param $type string
+        * @param string $type
         */
        protected function doReturnTo( $type = 'hard' ) {
                $titleObj = Title::newFromText( $this->getRequest()->getVal( 'returnto' ) );
@@ -129,7 +129,7 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
        }
 
        /**
-        * @param $msg string
+        * @param string $msg
         */
        protected function error( $msg ) {
                $this->getOutput()->wrapWikiMsg( "<p class='error'>\n$1\n</p>", $msg );
@@ -181,7 +181,7 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
        }
 
        /**
-        * @param $fields array
+        * @param array $fields
         * @return string
         */
        protected function pretty( $fields ) {
@@ -215,10 +215,10 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
        }
 
        /**
-        * @param $user User
-        * @param $pass string
-        * @param $newaddr string
-        * @return bool|string true or string on success, false on failure
+        * @param User $user
+        * @param string $pass
+        * @param string $newaddr
+        * @return bool|string True or string on success, false on failure
         */
        protected function attemptChange( User $user, $pass, $newaddr ) {
                global $wgAuth, $wgPasswordAttemptThrottle;
@@ -232,13 +232,19 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
                $throttleCount = LoginForm::incLoginThrottle( $user->getName() );
                if ( $throttleCount === true ) {
                        $lang = $this->getLanguage();
-                       $this->error( array( 'changeemail-throttled', $lang->formatDuration( $wgPasswordAttemptThrottle['seconds'] ) ) );
+                       $this->error( array(
+                               'changeemail-throttled',
+                               $lang->formatDuration( $wgPasswordAttemptThrottle['seconds'] )
+                       ) );
 
                        return false;
                }
 
                global $wgRequirePasswordforEmailChange;
-               if ( $wgRequirePasswordforEmailChange && !$user->checkTemporaryPassword( $pass ) && !$user->checkPassword( $pass ) ) {
+               if ( $wgRequirePasswordforEmailChange
+                       && !$user->checkTemporaryPassword( $pass )
+                       && !$user->checkPassword( $pass )
+               ) {
                        $this->error( 'wrongpassword' );
 
                        return false;
index 91d0404..dcd2443 100644 (file)
@@ -27,8 +27,8 @@
  * @ingroup SpecialPage
  */
 class SpecialChangePassword extends FormSpecialPage {
-
-       protected $mUserName, $mDomain;
+       protected $mUserName;
+       protected $mDomain;
 
        // Optional Wikitext Message to show above the password change form
        protected $mPreTextMessage = null;
@@ -83,7 +83,7 @@ class SpecialChangePassword extends FormSpecialPage {
                $request = $this->getRequest();
 
                $oldpassMsg = $this->mOldPassMsg;
-               if ( !isset( $oldpassMsg ) ) {
+               if ( $oldpassMsg === null ) {
                        $oldpassMsg = $user->isLoggedIn() ? 'oldpassword' : 'resetpass-temp-password';
                }
 
@@ -178,7 +178,6 @@ class SpecialChangePassword extends FormSpecialPage {
                        return false;
                }
 
-
                if ( $request->getCheck( 'wpCancel' ) ) {
                        $titleObj = Title::newFromText( $request->getVal( 'returnto' ) );
                        if ( !$titleObj instanceof Title ) {
@@ -296,7 +295,8 @@ class SpecialChangePassword extends FormSpecialPage {
                if ( $isSelf ) {
                        // This is needed to keep the user connected since
                        // changing the password also modifies the user's token.
-                       $user->setCookies();
+                       $remember = $this->getRequest()->getCookie( 'Token' ) !== null;
+                       $user->setCookies( null, null, $remember );
                }
                $user->resetPasswordExpiration();
                $user->saveSettings();
index fc6b0c5..da1a54c 100644 (file)
@@ -43,8 +43,8 @@ class SpecialComparePages extends SpecialPage {
        /**
         * Show a form for filtering namespace and username
         *
-        * @param $par String
-        * @return String
+        * @param string $par
+        * @return string
         */
        public function execute( $par ) {
                $this->setHeaders();
index 2c91805..0571d0d 100644 (file)
@@ -237,8 +237,8 @@ class SpecialContributions extends IncludableSpecialPage {
 
        /**
         * Generates the subheading with links
-        * @param $userObj User object for the target
-        * @return String: appropriately-escaped HTML to be output literally
+        * @param User $userObj User object for the target
+        * @return string Appropriately-escaped HTML to be output literally
         * @todo FIXME: Almost the same as getSubTitle in SpecialDeletedContributions.php.
         * Could be combined.
         */
@@ -295,9 +295,9 @@ class SpecialContributions extends IncludableSpecialPage {
 
        /**
         * Links to different places.
-        * @param $userpage Title: Target user page
-        * @param $talkpage Title: Talk page
-        * @param $target User: Target user object
+        * @param Title $userpage Target user page
+        * @param Title $talkpage Talk page
+        * @param User $target Target user object
         * @return array
         */
        public function getUserLinks( Title $userpage, Title $talkpage, User $target ) {
@@ -381,7 +381,7 @@ class SpecialContributions extends IncludableSpecialPage {
 
        /**
         * Generates the namespace selector form with hidden attributes.
-        * @return String: HTML fragment
+        * @return string HTML fragment
         */
        protected function getForm() {
                global $wgScript;
@@ -707,9 +707,9 @@ class ContribsPager extends ReverseChronologicalPager {
         * This method basically executes the exact same code as the parent class, though with
         * a hook added, to allow extentions to add additional queries.
         *
-        * @param string $offset index offset, inclusive
-        * @param $limit Integer: exact query limit
-        * @param $descending Boolean: query direction, false for ascending, true for descending
+        * @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
         */
        function reallyDoQuery( $offset, $limit, $descending ) {
@@ -944,7 +944,7 @@ class ContribsPager extends ReverseChronologicalPager {
         * was not written by the target user.
         *
         * @todo This would probably look a lot nicer in a table.
-        * @param $row
+        * @param object $row
         * @return string
         */
        function formatRow( $row ) {
@@ -1055,7 +1055,8 @@ class ContribsPager extends ReverseChronologicalPager {
                        # Show user names for /newbies as there may be different users.
                        # Note that we already excluded rows with hidden user names.
                        if ( $this->contribs == 'newbie' ) {
-                               $userlink = ' . . ' . $lang->getDirMark() . Linker::userLink( $rev->getUser(), $rev->getUserText() );
+                               $userlink = ' . . ' . $lang->getDirMark()
+                                       . Linker::userLink( $rev->getUser(), $rev->getUserText() );
                                $userlink .= ' ' . $this->msg( 'parentheses' )->rawParams(
                                        Linker::userTalkLink( $rev->getUser(), $rev->getUserText() ) )->escaped() . ' ';
                        } else {
index d781e6d..448637e 100644 (file)
  */
 class SpecialCreateAccount extends SpecialRedirectToSpecial {
        function __construct() {
-               parent::__construct( 'CreateAccount', 'Userlogin', 'signup', array( 'returnto', 'returntoquery', 'uselang' ) );
+               parent::__construct(
+                       'CreateAccount',
+                       'Userlogin',
+                       'signup',
+                       array( 'returnto', 'returntoquery', 'uselang' )
+               );
        }
 
        // No reason to hide this link on Special:Specialpages
index 3115215..5bec95b 100644 (file)
@@ -147,7 +147,7 @@ class DeletedContribsPager extends IndexPager {
         * written by the target user.
         *
         * @todo This would probably look a lot nicer in a table.
-        * @param $row
+        * @param stdClass $row
         * @return string
         */
        function formatRow( $row ) {
@@ -375,8 +375,8 @@ class DeletedContributionsPage extends SpecialPage {
 
        /**
         * Generates the subheading with links
-        * @param $userObj User object for the target
-        * @return String: appropriately-escaped HTML to be output literally
+        * @param User $userObj User object for the target
+        * @return string Appropriately-escaped HTML to be output literally
         * @todo FIXME: Almost the same as contributionsSub in SpecialContributions.php. Could be combined.
         */
        function getSubTitle( $userObj ) {
@@ -498,7 +498,7 @@ class DeletedContributionsPage extends SpecialPage {
 
        /**
         * Generates the namespace selector form with hidden attributes.
-        * @param array $options the options to be included.
+        * @param array $options The options to be included.
         * @return string
         */
        function getForm( $options ) {
index 31fcc61..ebbef17 100644 (file)
@@ -56,7 +56,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
        /**
         * Main execution point
         *
-        * @param $mode int
+        * @param int $mode
         */
        public function execute( $mode ) {
                $this->setHeaders();
@@ -93,6 +93,14 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                                        $out->addReturnTo( SpecialPage::getTitleFor( 'Watchlist' ) );
                                }
                                break;
+                       case self::EDIT_CLEAR:
+                               $out->setPageTitle( $this->msg( 'watchlistedit-clear-title' ) );
+                               $form = $this->getClearForm();
+                               if ( $form->show() ) {
+                                       $out->addHTML( $this->successMessage );
+                                       $out->addReturnTo( SpecialPage::getTitleFor( 'Watchlist' ) );
+                               }
+                               break;
 
                        case self::EDIT_NORMAL:
                        default:
@@ -113,7 +121,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
         * Extract a list of titles from a blob of text, returning
         * (prefixed) strings; unwatchable titles are ignored
         *
-        * @param $list String
+        * @param string $list
         * @return array
         */
        private function extractTitles( $list ) {
@@ -191,19 +199,35 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                return true;
        }
 
+       public function submitClear( $data ) {
+               $current = $this->getWatchlist();
+               $this->clearWatchlist();
+               $this->getUser()->invalidateCache();
+               $this->successMessage = $this->msg( 'watchlistedit-clear-done' )->parse();
+               $this->successMessage .= ' ' . $this->msg( 'watchlistedit-clear-removed' )
+                       ->numParams( count( $current ) )->parse();
+               $this->showTitles( $current, $this->successMessage );
+
+               return true;
+       }
+
        /**
         * Print out a list of linked titles
         *
         * $titles can be an array of strings or Title objects; the former
         * is preferred, since Titles are very memory-heavy
         *
-        * @param array $titles of strings, or Title objects
-        * @param $output String
+        * @param array $titles Array of strings, or Title objects
+        * @param string $output
         */
        private function showTitles( $titles, &$output ) {
                $talk = $this->msg( 'talkpagelinktext' )->escaped();
                // Do a batch existence check
                $batch = new LinkBatch();
+               if (count($titles) >= 100) {
+                       $output = wfMessage( 'watchlistedit-too-many' )->parse();
+                       return;
+               }
                foreach ( $titles as $title ) {
                        if ( !$title instanceof Title ) {
                                $title = Title::newFromText( $title );
@@ -319,7 +343,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
         * @param Title $title
         * @param int $namespace
         * @param string $dbKey
-        * @return bool: Whether this item is valid
+        * @return bool Whether this item is valid
         */
        private function checkTitle( $title, $namespace, $dbKey ) {
                if ( $title
@@ -390,7 +414,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
         * $titles can be an array of strings or Title objects; the former
         * is preferred, since Titles are very memory-heavy
         *
-        * @param array $titles of strings, or Title objects
+        * @param array $titles Array of strings, or Title objects
         */
        private function watchTitles( $titles ) {
                $dbw = wfGetDB( DB_MASTER );
@@ -426,7 +450,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
         * $titles can be an array of strings or Title objects; the former
         * is preferred, since Titles are very memory-heavy
         *
-        * @param array $titles of strings, or Title objects
+        * @param array $titles Array of strings, or Title objects
         */
        private function unwatchTitles( $titles ) {
                $dbw = wfGetDB( DB_MASTER );
@@ -538,7 +562,8 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                $context->setTitle( $this->getPageTitle() ); // Remove subpage
                $form = new EditWatchlistNormalHTMLForm( $fields, $context );
                $form->setSubmitTextMsg( 'watchlistedit-normal-submit' );
-               # Used message keys: 'accesskey-watchlistedit-normal-submit', 'tooltip-watchlistedit-normal-submit'
+               # Used message keys:
+               # 'accesskey-watchlistedit-normal-submit', 'tooltip-watchlistedit-normal-submit'
                $form->setSubmitTooltip( 'watchlistedit-normal-submit' );
                $form->setWrapperLegendMsg( 'watchlistedit-normal-legend' );
                $form->addHeaderText( $this->msg( 'watchlistedit-normal-explain' )->parse() );
@@ -550,7 +575,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
        /**
         * Build the label for a checkbox, with a link to the title, and various additional bits
         *
-        * @param $title Title
+        * @param Title $title
         * @return string
         */
        private function buildRemoveLine( $title ) {
@@ -579,7 +604,10 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                        );
                }
 
-               wfRunHooks( 'WatchlistEditorBuildRemoveLine', array( &$tools, $title, $title->isRedirect(), $this->getSkin() ) );
+               wfRunHooks(
+                       'WatchlistEditorBuildRemoveLine',
+                       array( &$tools, $title, $title->isRedirect(), $this->getSkin() )
+               );
 
                return $link . " (" . $this->getLanguage()->pipeList( $tools ) . ")";
        }
@@ -611,12 +639,31 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                return $form;
        }
 
+       /**
+        * Get a form for clearing the watchlist
+        *
+        * @return HTMLForm
+        */
+       protected function getClearForm() {
+               $context = new DerivativeContext( $this->getContext() );
+               $context->setTitle( $this->getPageTitle( 'clear' ) ); // Reset subpage
+               $form = new HTMLForm( array(), $context );
+               $form->setSubmitTextMsg( 'watchlistedit-clear-submit' );
+               # Used message keys: 'accesskey-watchlistedit-clear-submit', 'tooltip-watchlistedit-clear-submit'
+               $form->setSubmitTooltip( 'watchlistedit-clear-submit' );
+               $form->setWrapperLegendMsg( 'watchlistedit-clear-legend' );
+               $form->addHeaderText( $this->msg( 'watchlistedit-clear-explain' )->parse() );
+               $form->setSubmitCallback( array( $this, 'submitClear' ) );
+
+               return $form;
+       }
+
        /**
         * Determine whether we are editing the watchlist, and if so, what
         * kind of editing operation
         *
-        * @param $request WebRequest
-        * @param $par mixed
+        * @param WebRequest $request
+        * @param string $par
         * @return int
         */
        public static function getMode( $request, $par ) {
@@ -625,6 +672,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                switch ( $mode ) {
                        case 'clear':
                        case self::EDIT_CLEAR:
+                               return self::EDIT_CLEAR;
                        case 'raw':
                        case self::EDIT_RAW:
                                return self::EDIT_RAW;
@@ -640,7 +688,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
         * Build a set of links for convenient navigation
         * between watchlist viewing and editing modes
         *
-        * @param $unused
+        * @param null $unused
         * @return string
         */
        public static function buildTools( $unused ) {
@@ -651,6 +699,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                        'view' => array( 'Watchlist', false ),
                        'edit' => array( 'EditWatchlist', false ),
                        'raw' => array( 'EditWatchlist', 'raw' ),
+                       'clear' => array( 'EditWatchlist', 'clear' ),
                );
 
                foreach ( $modes as $mode => $arr ) {
@@ -669,10 +718,6 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
        }
 }
 
-# B/C since 1.18
-class WatchlistEditor extends SpecialEditWatchlist {
-}
-
 /**
  * Extend HTMLForm purely so we can have a more sane way of getting the section headers
  */
@@ -700,7 +745,7 @@ class EditWatchlistCheckboxSeriesField extends HTMLMultiSelectField {
         *
         * @param string $value the value the field was submitted with
         * @param array $alldata the data collected from the form
-        * @return Mixed Bool true on success, or String error to display.
+        * @return bool|string Bool true on success, or String error to display.
         */
        function validate( $value, $alldata ) {
                // Need to call into grandparent to be a good citizen. :)
index fbddfbd..0062211 100644 (file)
@@ -176,7 +176,7 @@ class SpecialEmailUser extends UnlistedSpecialPage {
         * Validate target User
         *
         * @param string $target target user name
-        * @return User object on success or a string on error
+        * @return User User object on success or a string on error
         */
        public static function getTarget( $target ) {
                if ( $target == '' ) {
@@ -206,9 +206,9 @@ class SpecialEmailUser extends UnlistedSpecialPage {
        /**
         * Check whether a user is allowed to send email
         *
-        * @param $user User object
-        * @param string $editToken edit token
-        * @return null on success or string on error
+        * @param User $user
+        * @param string $editToken Edit token
+        * @return string|null Null on success or string on error
         */
        public static function getPermissionsError( $user, $editToken ) {
                global $wgEnableEmail, $wgEnableUserEmail;
@@ -252,8 +252,8 @@ class SpecialEmailUser extends UnlistedSpecialPage {
        /**
         * Form to ask for target user name.
         *
-        * @param string $name user name submitted.
-        * @return String: form asking for user name.
+        * @param string $name User name submitted.
+        * @return string Form asking for user name.
         */
        protected function userForm( $name ) {
                global $wgScript;
@@ -283,8 +283,8 @@ class SpecialEmailUser extends UnlistedSpecialPage {
         * Submit callback for an HTMLForm object, will simply call submit().
         *
         * @since 1.20
-        * @param $data array
-        * @param $form HTMLForm object
+        * @param array $data
+        * @param HTMLForm $form
         * @return Status|string|bool
         */
        public static function uiSubmit( array $data, HTMLForm $form ) {
@@ -298,7 +298,7 @@ class SpecialEmailUser extends UnlistedSpecialPage {
         *
         * @param array $data
         * @param IContextSource $context
-        * @return Mixed: Status object, or potentially a String on error
+        * @return Status|string|bool Status object, or potentially a String on error
         * or maybe even true on success if anything uses the EmailUser hook.
         */
        public static function submit( array $data, IContextSource $context ) {
index 61925cf..f89f03c 100644 (file)
  */
 class SpecialExpandTemplates extends SpecialPage {
 
-       /** @var boolean whether or not to show the XML parse tree */
+       /** @var bool Whether or not to show the XML parse tree */
        protected $generateXML;
 
-       /** @var boolean whether or not to show the raw HTML code */
+       /** @var bool Whether or not to show the raw HTML code */
        protected $generateRawHtml;
 
-       /** @var boolean whether or not to remove comments in the expanded wikitext */
+       /** @var bool Whether or not to remove comments in the expanded wikitext */
        protected $removeComments;
 
-       /** @var boolean whether or not to remove <nowiki> tags in the expanded wikitext */
+       /** @var bool Whether or not to remove <nowiki> tags in the expanded wikitext */
        protected $removeNowiki;
 
        /** @var maximum size in bytes to include. 50MB allows fixing those huge pages */
index 6fb5e8c..bc8e728 100644 (file)
@@ -259,8 +259,14 @@ class SpecialExport extends SpecialPage {
                        ) . '<br />';
                }
 
-               // Enable this when we can do something useful exporting/importing image information. :)
-               //$form .= Xml::checkLabel( $this->msg( 'export-images' )->text(), 'images', 'wpExportImages', false ) . '<br />';
+               /* Enable this when we can do something useful exporting/importing image information.
+               $form .= Xml::checkLabel(
+                               $this->msg( 'export-images' )->text(),
+                               'images',
+                               'wpExportImages',
+                               false
+                       ) . '<br />';
+               */
                $form .= Xml::checkLabel(
                        $this->msg( 'export-download' )->text(),
                        'wpDownload',
@@ -297,10 +303,10 @@ class SpecialExport extends SpecialPage {
         * Do the actual page exporting
         *
         * @param string $page user input on what page(s) to export
-        * @param $history Mixed: one of the WikiExporter history export constants
-        * @param $list_authors Boolean: Whether to add distinct author list (when
-        *                      not returning full history)
-        * @param $exportall Boolean: Whether to export everything
+        * @param int $history One of the WikiExporter history export constants
+        * @param bool $list_authors Whether to add distinct author list (when
+        *   not returning full history)
+        * @param bool $exportall Whether to export everything
         */
        private function doExport( $page, $history, $list_authors, $exportall ) {
 
@@ -397,7 +403,7 @@ class SpecialExport extends SpecialPage {
        }
 
        /**
-        * @param $title Title
+        * @param Title $title
         * @return array
         */
        private function getPagesFromCategory( $title ) {
@@ -430,7 +436,7 @@ class SpecialExport extends SpecialPage {
        }
 
        /**
-        * @param $nsindex int
+        * @param int $nsindex
         * @return array
         */
        private function getPagesFromNamespace( $nsindex ) {
@@ -463,9 +469,9 @@ class SpecialExport extends SpecialPage {
 
        /**
         * Expand a list of pages to include templates used in those pages.
-        * @param $inputPages array, list of titles to look up
-        * @param $pageSet array, associative array indexed by titles for output
-        * @return array associative array index by titles
+        * @param array $inputPages List of titles to look up
+        * @param array $pageSet Associative array indexed by titles for output
+        * @return array Associative array index by titles
         */
        private function getTemplates( $inputPages, $pageSet ) {
                return $this->getLinks( $inputPages, $pageSet,
@@ -477,7 +483,7 @@ class SpecialExport extends SpecialPage {
 
        /**
         * Validate link depth setting, if available.
-        * @param $depth int
+        * @param int $depth
         * @return int
         */
        private function validateLinkDepth( $depth ) {
@@ -504,13 +510,15 @@ class SpecialExport extends SpecialPage {
 
        /**
         * Expand a list of pages to include pages linked to from that page.
-        * @param $inputPages array
-        * @param $pageSet array
-        * @param $depth int
+        * @param array $inputPages
+        * @param array $pageSet
+        * @param int $depth
         * @return array
         */
        private function getPageLinks( $inputPages, $pageSet, $depth ) {
+               // @codingStandardsIgnoreStart Squiz.WhiteSpace.SemicolonSpacing.Incorrect
                for ( ; $depth > 0; --$depth ) {
+                       // @codingStandardsIgnoreEnd
                        $pageSet = $this->getLinks(
                                $inputPages, $pageSet, 'pagelinks',
                                array( 'namespace' => 'pl_namespace', 'title' => 'pl_title' ),
@@ -525,8 +533,8 @@ class SpecialExport extends SpecialPage {
        /**
         * Expand a list of pages to include images used in those pages.
         *
-        * @param $inputPages array, list of titles to look up
-        * @param $pageSet array, associative array indexed by titles for output
+        * @param array $inputPages List of titles to look up
+        * @param array $pageSet Associative array indexed by titles for output
         *
         * @return array associative array index by titles
         */
index 47a4d75..dc9d57c 100644 (file)
@@ -71,7 +71,7 @@ class FewestrevisionsPage extends QueryPage {
        /**
         * @param Skin $skin
         * @param object $result Database row
-        * @return String
+        * @return string
         */
        function formatResult( $skin, $result ) {
                global $wgContLang;
index 9cf5a73..b6c9d55 100644 (file)
@@ -101,7 +101,7 @@ class FileDuplicateSearchPage extends QueryPage {
                $this->setHeaders();
                $this->outputHeader();
 
-               $this->filename = isset( $par ) ? $par : $this->getRequest()->getText( 'filename' );
+               $this->filename = $par !== null ? $par : $this->getRequest()->getText( 'filename' );
                $this->file = null;
                $this->hash = '';
                $title = Title::newFromText( $this->filename, NS_FILE );
index 1bd4228..28e6479 100644 (file)
@@ -99,7 +99,9 @@ class SpecialImport extends SpecialPage {
                $sourceName = $request->getVal( "source" );
 
                $this->logcomment = $request->getText( 'log-comment' );
-               $this->pageLinkDepth = $wgExportMaxLinkDepth == 0 ? 0 : $request->getIntOrNull( 'pagelink-depth' );
+               $this->pageLinkDepth = $wgExportMaxLinkDepth == 0
+                       ? 0
+                       : $request->getIntOrNull( 'pagelink-depth' );
                $this->rootpage = $request->getText( 'rootpage' );
 
                $user = $this->getUser();
@@ -242,7 +244,10 @@ class SpecialImport extends SpecialPage {
                                </tr>
                                <tr>
                                        <td class='mw-label'>" .
-                                       Xml::label( $this->msg( 'import-interwiki-rootpage' )->text(), 'mw-interwiki-rootpage-upload' ) .
+                                       Xml::label(
+                                               $this->msg( 'import-interwiki-rootpage' )->text(),
+                                               'mw-interwiki-rootpage-upload'
+                                       ) .
                                        "</td>
                                        <td class='mw-input'>" .
                                        Xml::input( 'rootpage', 50, $this->rootpage,
@@ -413,8 +418,8 @@ class ImportReporter extends ContextSource {
 
        /**
         * @param WikiImporter $importer
-        * @param $upload
-        * @param $interwiki
+        * @param bool $upload
+        * @param string $interwiki
         * @param string|bool $reason
         */
        function __construct( $importer, $upload, $interwiki, $reason = false ) {
@@ -434,7 +439,9 @@ class ImportReporter extends ContextSource {
        }
 
        function reportNotice( $msg, array $params ) {
-               $this->getOutput()->addHTML( Html::element( 'li', array(), $this->msg( $msg, $params )->text() ) );
+               $this->getOutput()->addHTML(
+                       Html::element( 'li', array(), $this->msg( $msg, $params )->text() )
+               );
        }
 
        function reportLogItem( /* ... */ ) {
@@ -448,8 +455,8 @@ class ImportReporter extends ContextSource {
         * @param Title $title
         * @param Title $origTitle
         * @param int $revisionCount
-        * @param $successCount
-        * @param $pageInfo
+        * @param int $successCount
+        * @param array $pageInfo
         * @return void
         */
        function reportPage( $title, $origTitle, $revisionCount, $successCount, $pageInfo ) {
@@ -475,7 +482,8 @@ class ImportReporter extends ContextSource {
                                $detail = $this->msg( 'import-logentry-upload-detail' )->numParams(
                                        $successCount )->inContentLanguage()->text();
                                if ( $this->reason ) {
-                                       $detail .= $this->msg( 'colon-separator' )->inContentLanguage()->text() . $this->reason;
+                                       $detail .= $this->msg( 'colon-separator' )->inContentLanguage()->text()
+                                               . $this->reason;
                                }
                                $log->addEntry( 'upload', $title, $detail, array(), $this->getUser() );
                        } else {
@@ -484,7 +492,8 @@ class ImportReporter extends ContextSource {
                                $detail = $this->msg( 'import-logentry-interwiki-detail' )->numParams(
                                        $successCount )->params( $interwiki )->inContentLanguage()->text();
                                if ( $this->reason ) {
-                                       $detail .= $this->msg( 'colon-separator' )->inContentLanguage()->text() . $this->reason;
+                                       $detail .= $this->msg( 'colon-separator' )->inContentLanguage()->text()
+                                               . $this->reason;
                                }
                                $log->addEntry( 'interwiki', $title, $detail, array(), $this->getUser() );
                        }
@@ -492,13 +501,23 @@ class ImportReporter extends ContextSource {
                        $comment = $detail; // quick
                        $dbw = wfGetDB( DB_MASTER );
                        $latest = $title->getLatestRevID();
-                       $nullRevision = Revision::newNullRevision( $dbw, $title->getArticleID(), $comment, true );
+                       $nullRevision = Revision::newNullRevision(
+                               $dbw,
+                               $title->getArticleID(),
+                               $comment,
+                               true,
+                               $this->getUser()
+                       );
+
                        if ( !is_null( $nullRevision ) ) {
                                $nullRevision->insertOn( $dbw );
                                $page = WikiPage::factory( $title );
                                # Update page record
                                $page->updateRevisionOn( $dbw, $nullRevision );
-                               wfRunHooks( 'NewRevisionFromEditComplete', array( $page, $nullRevision, $latest, $this->getUser() ) );
+                               wfRunHooks(
+                                       'NewRevisionFromEditComplete',
+                                       array( $page, $nullRevision, $latest, $this->getUser() )
+                               );
                        }
                } else {
                        $this->getOutput()->addHTML( "<li>" . Linker::linkKnown( $title ) . " " .
index 7982d5c..1c4f79f 100644 (file)
  * @ingroup SpecialPage
  */
 class SpecialJavaScriptTest extends SpecialPage {
-
        /**
-        * @var $frameworks Array: Mapping of framework ids and their initilizer methods
+        * @var array Mapping of framework ids and their initilizer methods
         * in this class. If a framework is requested but not in this array,
         * the 'unknownframework' error is served.
         */
-       static $frameworks = array(
+       private static $frameworks = array(
                'qunit' => 'initQUnitTesting',
        );
 
index 5995347..b88e196 100644 (file)
@@ -177,8 +177,8 @@ class LinkSearchPage extends QueryPage {
        /**
         * Return an appropriately formatted LIKE query and the clause
         *
-        * @param String $query Search pattern to search for
-        * @param String $prot Protocol, e.g. 'http://'
+        * @param string $query Search pattern to search for
+        * @param string $prot Protocol, e.g. 'http://'
         *
         * @return array
         */
@@ -209,7 +209,7 @@ class LinkSearchPage extends QueryPage {
                global $wgMiserMode;
                $params = array();
                $params['target'] = $this->mProt . $this->mQuery;
-               if ( isset( $this->mNs ) && !$wgMiserMode ) {
+               if ( $this->mNs !== null && !$wgMiserMode ) {
                        $params['namespace'] = $this->mNs;
                }
 
@@ -244,7 +244,7 @@ class LinkSearchPage extends QueryPage {
                        'options' => array( 'USE INDEX' => $clause )
                );
 
-               if ( isset( $this->mNs ) && !$wgMiserMode ) {
+               if ( $this->mNs !== null && !$wgMiserMode ) {
                        $retval['conds']['page_namespace'] = $this->mNs;
                }
 
index 9f0d127..3715b8b 100644 (file)
@@ -68,14 +68,20 @@ class SpecialListFiles extends IncludableSpecialPage {
  * @ingroup SpecialPage Pager
  */
 class ImageListPager extends TablePager {
-       var $mFieldNames = null;
+       protected $mFieldNames = null;
+
        // Subclasses should override buildQueryConds instead of using $mQueryConds variable.
-       var $mQueryConds = array();
-       var $mUserName = null;
-       var $mSearch = '';
-       var $mIncluding = false;
-       var $mShowAll = false;
-       var $mTableName = 'image';
+       protected $mQueryConds = array();
+
+       protected $mUserName = null;
+
+       protected $mSearch = '';
+
+       protected $mIncluding = false;
+
+       protected $mShowAll = false;
+
+       protected $mTableName = 'image';
 
        function __construct( IContextSource $context, $userName = null, $search = '',
                $including = false, $showAll = false
@@ -121,7 +127,7 @@ class ImageListPager extends TablePager {
         * Build the where clause of the query.
         *
         * Replaces the older mQueryConds member variable.
-        * @param $table String Either "image" or "oldimage"
+        * @param string $table Either "image" or "oldimage"
         * @return array The query conditions.
         */
        protected function buildQueryConds( $table ) {
@@ -154,7 +160,7 @@ class ImageListPager extends TablePager {
        }
 
        /**
-        * @return Array
+        * @return array
         */
        function getFieldNames() {
                if ( !$this->mFieldNames ) {
@@ -164,9 +170,14 @@ class ImageListPager extends TablePager {
                                'img_name' => $this->msg( 'listfiles_name' )->text(),
                                'thumb' => $this->msg( 'listfiles_thumb' )->text(),
                                'img_size' => $this->msg( 'listfiles_size' )->text(),
-                               'img_user_text' => $this->msg( 'listfiles_user' )->text(),
-                               'img_description' => $this->msg( 'listfiles_description' )->text(),
                        );
+                       if ( is_null( $this->mUserName ) ) {
+                               // Do not show username if filtering by username
+                               $this->mFieldNames['img_user_text'] = $this->msg( 'listfiles_user' )->text();
+                       }
+                       // img_description down here, in order so that its still after the username field.
+                       $this->mFieldNames['img_description'] = $this->msg( 'listfiles_description' )->text();
+
                        if ( !$wgMiserMode && !$this->mShowAll ) {
                                $this->mFieldNames['count'] = $this->msg( 'listfiles_count' )->text();
                        }
@@ -226,7 +237,7 @@ class ImageListPager extends TablePager {
         *
         * This is a bit hacky.
         *
-        * @param $table String Either 'image' or 'oldimage'
+        * @param string $table Either 'image' or 'oldimage'
         * @return array Query info
         */
        protected function getQueryInfoReal( $table ) {
@@ -291,11 +302,15 @@ class ImageListPager extends TablePager {
         * @note $asc is named $descending in IndexPager base class. However
         *   it is true when the order is ascending, and false when the order
         *   is descending, so I renamed it to $asc here.
+        * @param int $offset
+        * @param int $limit
+        * @param bool $asc
         */
        function reallyDoQuery( $offset, $limit, $asc ) {
                $prevTableName = $this->mTableName;
                $this->mTableName = 'image';
-               list( $tables, $fields, $conds, $fname, $options, $join_conds ) = $this->buildQueryInfo( $offset, $limit, $asc );
+               list( $tables, $fields, $conds, $fname, $options, $join_conds ) =
+                       $this->buildQueryInfo( $offset, $limit, $asc );
                $imageRes = $this->mDb->select( $tables, $fields, $conds, $fname, $options, $join_conds );
                $this->mTableName = $prevTableName;
 
@@ -312,7 +327,8 @@ class ImageListPager extends TablePager {
                }
                $this->mIndexField = 'oi_' . substr( $this->mIndexField, 4 );
 
-               list( $tables, $fields, $conds, $fname, $options, $join_conds ) = $this->buildQueryInfo( $offset, $limit, $asc );
+               list( $tables, $fields, $conds, $fname, $options, $join_conds ) =
+                       $this->buildQueryInfo( $offset, $limit, $asc );
                $oldimageRes = $this->mDb->select( $tables, $fields, $conds, $fname, $options, $join_conds );
 
                $this->mTableName = $prevTableName;
@@ -326,10 +342,10 @@ class ImageListPager extends TablePager {
         *
         * Note: This will throw away some results
         *
-        * @param $res1 ResultWrapper
-        * @param $res2 ResultWrapper
-        * @param $limit int
-        * @param $ascending boolean See note about $asc in $this->reallyDoQuery
+        * @param ResultWrapper $res1
+        * @param ResultWrapper $res2
+        * @param int $limit
+        * @param bool $ascending See note about $asc in $this->reallyDoQuery
         * @return FakeResultWrapper $res1 and $res2 combined
         */
        protected function combineResult( $res1, $res2, $limit, $ascending ) {
@@ -357,11 +373,17 @@ class ImageListPager extends TablePager {
                                }
                        }
                }
+
+               // @codingStandardsIgnoreStart Squiz.WhiteSpace.SemicolonSpacing.Incorrect
                for ( ; $i < $limit && $topRes1; $i++ ) {
+                       // @codingStandardsIgnoreEnd
                        $resultArray[] = $topRes1;
                        $topRes1 = $res1->next();
                }
+
+               // @codingStandardsIgnoreStart Squiz.WhiteSpace.SemicolonSpacing.Incorrect
                for ( ; $i < $limit && $topRes2; $i++ ) {
+                       // @codingStandardsIgnoreEnd
                        $resultArray[] = $topRes2;
                        $topRes2 = $res2->next();
                }
index 31034f9..a77b70c 100644 (file)
@@ -29,9 +29,6 @@
  * @author Petr Kadlec <mormegil@centrum.cz>
  */
 class SpecialListGroupRights extends SpecialPage {
-       /**
-        * Constructor
-        */
        function __construct() {
                parent::__construct( 'Listgrouprights' );
        }
@@ -118,11 +115,12 @@ class SpecialListGroupRights extends SpecialPage {
                        $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] : array();
+                       $removegroupsSelf = isset( $wgGroupsRemoveFromSelf[$group] )
+                               ? $wgGroupsRemoveFromSelf[$group]
+                               : array();
 
                        $id = $group == '*' ? false : Sanitizer::escapeId( $group );
-                       $out->addHTML( Html::rawElement( 'tr', array( 'id' => $id ),
-                               "
+                       $out->addHTML( Html::rawElement( 'tr', array( 'id' => $id ), "
                                <td>$grouppage$grouplink</td>
                                        <td>" .
                                        $this->formatPermissions( $permissions, $revoke, $addgroups, $removegroups,
index f69e177..367adef 100644 (file)
@@ -35,9 +35,9 @@
 class UsersPager extends AlphabeticPager {
 
        /**
-        * @param $context IContextSource
+        * @param IContextSource $context
         * @param array $par (Default null)
-        * @param $including boolean Whether this page is being transcluded in
+        * @param bool $including Whether this page is being transcluded in
         * another page
         */
        function __construct( IContextSource $context = null, $par = null, $including = null ) {
@@ -92,7 +92,7 @@ class UsersPager extends AlphabeticPager {
        }
 
        /**
-        * @return Array
+        * @return array
         */
        function getQueryInfo() {
                $dbr = wfGetDB( DB_SLAVE );
@@ -154,8 +154,8 @@ class UsersPager extends AlphabeticPager {
        }
 
        /**
-        * @param $row Object
-        * @return String
+        * @param stdClass $row
+        * @return string
         */
        function formatRow( $row ) {
                if ( $row->user_id == 0 ) { #Bug 16487
@@ -333,7 +333,7 @@ class UsersPager extends AlphabeticPager {
        /**
         * Get a list of groups the specified user belongs to
         *
-        * @param $uid Integer: user id
+        * @param int $uid User id
         * @return array
         */
        protected static function getGroups( $uid ) {
@@ -346,7 +346,7 @@ class UsersPager extends AlphabeticPager {
        /**
         * Format a link to a group description page
         *
-        * @param string $group group name
+        * @param string $group Group name
         * @param string $username Username
         * @return string
         */
index 95ef951..3382405 100644 (file)
@@ -27,7 +27,7 @@
  * @ingroup SpecialPage
  */
 class SpecialLockdb extends FormSpecialPage {
-       var $reason = '';
+       protected $reason = '';
 
        public function __construct() {
                parent::__construct( 'Lockdb', 'siteadmin' );
index 5265403..6da6674 100644 (file)
@@ -80,7 +80,9 @@ class SpecialLog extends SpecialPage {
                $type = $opts->getValue( 'type' );
                if ( !LogPage::isLogType( $type ) ) {
                        $opts->setValue( 'type', '' );
-               } elseif ( isset( $wgLogRestrictions[$type] ) && !$this->getUser()->isAllowed( $wgLogRestrictions[$type] ) ) {
+               } elseif ( isset( $wgLogRestrictions[$type] )
+                       && !$this->getUser()->isAllowed( $wgLogRestrictions[$type] )
+               ) {
                        throw new PermissionsError( $wgLogRestrictions[$type] );
                }
 
@@ -218,7 +220,7 @@ class SpecialLog extends SpecialPage {
 
        /**
         * Set page title and show header for this log type
-        * @param $type string
+        * @param string $type
         * @since 1.19
         */
        protected function addHeader( $type ) {
index 50af915..013fc26 100644 (file)
@@ -166,7 +166,7 @@ class MIMEsearchPage extends QueryPage {
        }
 
        /**
-        * @param $type string
+        * @param string $type
         * @return bool
         */
        protected static function isValidType( $type ) {
index f799fc5..097f1b6 100644 (file)
  * @ingroup SpecialPage
  */
 class SpecialMergeHistory extends SpecialPage {
-       var $mAction, $mTarget, $mDest, $mTimestamp, $mTargetID, $mDestID, $mComment;
+       /** @var string */
+       protected $mAction;
 
-       /**
-        * @var Title
-        */
-       var $mTargetObj, $mDestObj;
+       /** @var string */
+       protected $mTarget;
+
+       /** @var string */
+       protected $mDest;
+
+       /** @var string */
+       protected $mTimestamp;
+
+       /** @var int */
+       protected $mTargetID;
+
+       /** @var int */
+       protected $mDestID;
+
+       /** @var string */
+       protected $mComment;
+
+       /** @var bool Was posted? */
+       protected $mMerge;
+
+       /** @var bool Was submitted? */
+       protected $mSubmitted;
+
+       /** @var Title */
+       protected $mTargetObj;
+
+       /** @var Title */
+       protected $mDestObj;
 
        public function __construct() {
                parent::__construct( 'MergeHistory', 'mergehistory' );
@@ -57,7 +83,9 @@ class SpecialMergeHistory extends SpecialPage {
                }
                $this->mComment = $request->getText( 'wpComment' );
 
-               $this->mMerge = $request->wasPosted() && $this->getUser()->matchEditToken( $request->getVal( 'wpEditToken' ) );
+               $this->mMerge = $request->wasPosted()
+                       && $this->getUser()->matchEditToken( $request->getVal( 'wpEditToken' ) );
+
                // target page
                if ( $this->mSubmitted ) {
                        $this->mTargetObj = Title::newFromURL( $this->mTarget );
@@ -203,7 +231,10 @@ class SpecialMergeHistory extends SpecialPage {
                                        <tr>
                                                <td>&#160;</td>
                                                <td class="mw-submit">' .
-                                       Xml::submitButton( $this->msg( 'mergehistory-submit' )->text(), array( 'name' => 'merge', 'id' => 'mw-merge-submit' ) ) .
+                                       Xml::submitButton(
+                                               $this->msg( 'mergehistory-submit' )->text(),
+                                               array( 'name' => 'merge', 'id' => 'mw-merge-submit' )
+                                       ) .
                                        '</td>
                                        </tr>' .
                                        Xml::closeElement( 'table' ) .
@@ -290,7 +321,8 @@ class SpecialMergeHistory extends SpecialPage {
                $comment = Linker::revComment( $rev );
 
                return Html::rawElement( 'li', array(),
-                       $this->msg( 'mergehistory-revisionrow' )->rawParams( $checkBox, $last, $pageLink, $userLink, $stxt, $comment )->escaped() );
+                       $this->msg( 'mergehistory-revisionrow' )
+                               ->rawParams( $checkBox, $last, $pageLink, $userLink, $stxt, $comment )->escaped() );
        }
 
        function merge() {
@@ -434,7 +466,11 @@ class SpecialMergeHistory extends SpecialPage {
 }
 
 class MergeHistoryPager extends ReverseChronologicalPager {
-       public $mForm, $mConds;
+       /** @var IContextSource */
+       public $mForm;
+
+       /** @var array */
+       public $mConds;
 
        function __construct( $form, $conds = array(), $source, $dest ) {
                $this->mForm = $form;
index 98dd68e..30ccbe5 100644 (file)
@@ -92,8 +92,8 @@ class MostinterwikisPage extends QueryPage {
        }
 
        /**
-        * @param $skin Skin
-        * @param $result
+        * @param Skin $skin
+        * @param object $result
         * @return string
         */
        function formatResult( $skin, $result ) {
index 37593bf..99f0ecf 100644 (file)
@@ -93,9 +93,9 @@ class MostlinkedPage extends QueryPage {
        /**
         * Make a link to "what links here" for the specified title
         *
-        * @param $title Title being queried
-        * @param string $caption text to display on the link
-        * @return String
+        * @param Title $title Title being queried
+        * @param string $caption Text to display on the link
+        * @return string
         */
        function makeWlhLink( $title, $caption ) {
                $wlh = SpecialPage::getTitleFor( 'Whatlinkshere', $title->getPrefixedDBkey() );
index c90acb1..8ee583b 100644 (file)
@@ -36,7 +36,7 @@ class MostlinkedTemplatesPage extends QueryPage {
        /**
         * Is this report expensive, i.e should it be cached?
         *
-        * @return Boolean
+        * @return bool
         */
        public function isExpensive() {
                return true;
@@ -45,7 +45,7 @@ class MostlinkedTemplatesPage extends QueryPage {
        /**
         * Is there a feed available?
         *
-        * @return Boolean
+        * @return bool
         */
        public function isSyndicated() {
                return false;
@@ -54,7 +54,7 @@ class MostlinkedTemplatesPage extends QueryPage {
        /**
         * Sort the results in descending order?
         *
-        * @return Boolean
+        * @return bool
         */
        public function sortDescending() {
                return true;
@@ -76,7 +76,7 @@ class MostlinkedTemplatesPage extends QueryPage {
        /**
         * Pre-cache page existence to speed up link generation
         *
-        * @param $db DatabaseBase connection
+        * @param DatabaseBase $db
         * @param ResultWrapper $res
         */
        public function preprocessResults( $db, $res ) {
@@ -125,7 +125,7 @@ class MostlinkedTemplatesPage extends QueryPage {
         *
         * @param Title $title Title to make the link for
         * @param object $result Result row
-        * @return String
+        * @return string
         */
        private function makeWlhLink( $title, $result ) {
                $wlh = SpecialPage::getTitleFor( 'Whatlinkshere', $title->getPrefixedText() );
index 91ef797..dce5ad9 100644 (file)
  * @ingroup SpecialPage
  */
 class MovePageForm extends UnlistedSpecialPage {
-       /**
-        * Objects
-        * @var Title
-        */
-       var $oldTitle, $newTitle;
-       // Text input
-       var $reason;
+       /** @var Title */
+       protected $oldTitle;
+
+       /** @var Title */
+       protected $newTitle;
+
+
+       /** @var string Text input */
+       protected $reason;
+
        // Checks
-       var $moveTalk, $deleteAndMove, $moveSubpages, $fixRedirects, $leaveRedirect, $moveOverShared;
+
+       /** @var bool */
+       protected $moveTalk;
+
+       /** @var bool */
+       protected $deleteAndMove;
+
+       /** @var bool */
+       protected $moveSubpages;
+
+       /** @var bool */
+       protected $fixRedirects;
+
+       /** @var bool */
+       protected $leaveRedirect;
+
+       /** @var bool */
+       protected $moveOverShared;
 
        private $watch = false;
 
@@ -163,6 +183,11 @@ class MovePageForm extends UnlistedSpecialPage {
                                        "<div class=\"error mw-moveuserpage-warning\">\n$1\n</div>",
                                        'moveuserpage-warning'
                                );
+                       } elseif ( $this->oldTitle->getNamespace() == NS_CATEGORY ) {
+                               $out->wrapWikiMsg(
+                                       "<div class=\"error mw-movecategorypage-warning\">\n$1\n</div>",
+                                       'movecategorypage-warning'
+                               );
                        }
 
                        $out->addWikiMsg( $wgFixDoubleRedirects ?
@@ -680,17 +705,20 @@ class MovePageForm extends UnlistedSpecialPage {
                                        );
 
                                        $newLink = Linker::linkKnown( $newSubpage );
-                                       $extraOutput[] = $this->msg( 'movepage-page-moved' )->rawParams( $oldLink, $newLink )->escaped();
+                                       $extraOutput[] = $this->msg( 'movepage-page-moved' )
+                                               ->rawParams( $oldLink, $newLink )->escaped();
                                        ++$count;
 
                                        if ( $count >= $wgMaximumMovedPages ) {
-                                               $extraOutput[] = $this->msg( 'movepage-max-pages' )->numParams( $wgMaximumMovedPages )->escaped();
+                                               $extraOutput[] = $this->msg( 'movepage-max-pages' )
+                                                       ->numParams( $wgMaximumMovedPages )->escaped();
                                                break;
                                        }
                                } else {
                                        $oldLink = Linker::linkKnown( $oldSubpage );
                                        $newLink = Linker::link( $newSubpage );
-                                       $extraOutput[] = $this->msg( 'movepage-page-unmoved' )->rawParams( $oldLink, $newLink )->escaped();
+                                       $extraOutput[] = $this->msg( 'movepage-page-unmoved' )
+                                               ->rawParams( $oldLink, $newLink )->escaped();
                                }
                        }
                }
index c10a618..147d176 100644 (file)
@@ -33,6 +33,7 @@ class SpecialNewFiles extends IncludableSpecialPage {
                $pager = new NewFilesPager( $this->getContext(), $par );
 
                if ( !$this->including() ) {
+                       $this->setTopText();
                        $form = $pager->getForm();
                        $form->prepareForm();
                        $form->displayForm( '' );
@@ -47,6 +48,25 @@ class SpecialNewFiles extends IncludableSpecialPage {
        protected function getGroupName() {
                return 'changes';
        }
+
+       /**
+        * Send the text to be displayed above the options
+        */
+       function setTopText() {
+               global $wgContLang;
+
+               $message = $this->msg( 'newimagestext' )->inContentLanguage();
+               if ( !$message->isDisabled() ) {
+                       $this->getOutput()->addWikiText(
+                               Html::rawElement( 'p',
+                                       array( 'lang' => $wgContLang->getCode(), 'dir' => $wgContLang->getDir() ),
+                                       "\n" . $message->plain() . "\n"
+                               ),
+                               /* $lineStart */ false,
+                               /* $interface */ false
+                       );
+               }
+       }
 }
 
 /**
@@ -56,7 +76,7 @@ class NewFilesPager extends ReverseChronologicalPager {
        /**
         * @var ImageGallery
         */
-       var $gallery;
+       protected $gallery;
 
        function __construct( IContextSource $context, $par = null ) {
                $this->like = $context->getRequest()->getText( 'like' );
@@ -163,7 +183,7 @@ class NewFilesPager extends ReverseChronologicalPager {
                        ),
                        'showbots' => array(
                                'type' => 'check',
-                               'label' => $this->msg( 'showhidebots', $this->msg( 'show' )->plain() )->escaped(),
+                               'label-message' => 'newimages-showbots',
                                'name' => 'showbots',
                        ),
                        'limit' => array(
index 1e631f9..505a1ec 100644 (file)
  * @ingroup SpecialPage
  */
 class SpecialNewpages extends IncludableSpecialPage {
-       // Stored objects
-
        /**
         * @var FormOptions
         */
        protected $opts;
        protected $customFilters;
 
-       // Some internal settings
        protected $showNavigation = false;
 
        public function __construct() {
@@ -124,8 +121,8 @@ class SpecialNewpages extends IncludableSpecialPage {
        /**
         * Show a form for filtering namespace and username
         *
-        * @param $par String
-        * @return String
+        * @param string $par
+        * @return string
         */
        public function execute( $par ) {
                $out = $this->getOutput();
@@ -301,7 +298,7 @@ class SpecialNewpages extends IncludableSpecialPage {
         * size, user links, and a comment
         *
         * @param object $result Result row
-        * @return String
+        * @return string
         */
        public function formatRow( $result ) {
                $title = Title::newFromRow( $result );
@@ -394,14 +391,15 @@ class SpecialNewpages extends IncludableSpecialPage {
                        $oldTitleText = $this->msg( 'rc-old-title' )->params( $oldTitleText )->escaped();
                }
 
-               return "<li{$css}>{$time} {$dm}{$plink} {$hist} {$dm}{$length} {$dm}{$ulink} {$comment} {$tagDisplay} {$oldTitleText}</li>\n";
+               return "<li{$css}>{$time} {$dm}{$plink} {$hist} {$dm}{$length} "
+                       . "{$dm}{$ulink} {$comment} {$tagDisplay} {$oldTitleText}</li>\n";
        }
 
        /**
         * Should a specific result row provide "patrollable" links?
         *
         * @param object $result Result row
-        * @return Boolean
+        * @return bool
         */
        protected function patrollable( $result ) {
                return ( $this->getUser()->useNPPatrol() && !$result->rc_patrolled );
@@ -410,7 +408,7 @@ class SpecialNewpages extends IncludableSpecialPage {
        /**
         * Output a subscription feed listing recent edits to this page.
         *
-        * @param $type String
+        * @param string $type
         */
        protected function feed( $type ) {
                global $wgFeed, $wgFeedClasses, $wgFeedLimit;
index 082eed0..14f3ccd 100644 (file)
@@ -135,10 +135,10 @@ class SpecialPasswordReset extends FormSpecialPage {
         * Process the form.  At this point we know that the user passes all the criteria in
         * userCanExecute(), and if the data array contains 'Username', etc, then Username
         * resets are allowed.
-        * @param $data array
+        * @param array $data
         * @throws MWException
         * @throws ThrottledError|PermissionsError
-        * @return Bool|Array
+        * @return bool|array
         */
        public function onSubmit( array $data ) {
                global $wgAuth;
@@ -349,7 +349,7 @@ class SpecialPasswordReset extends FormSpecialPage {
 
        /**
         * Hide the password reset page if resets are disabled.
-        * @return Bool
+        * @return bool
         */
        function isListed() {
                if ( $this->canChangePassword( $this->getUser() ) === true ) {
index 7ad39d2..34e803d 100644 (file)
@@ -47,7 +47,7 @@ class SpecialPrefixindex extends SpecialAllpages {
 
        /**
         * Entry point : initialise variables and call subfunctions.
-        * @param string $par becomes "FOO" when called like Special:Prefixindex/FOO (default null)
+        * @param string $par Becomes "FOO" when called like Special:Prefixindex/FOO (default null)
         */
        function execute( $par ) {
                global $wgContLang;
@@ -76,7 +76,7 @@ class SpecialPrefixindex extends SpecialAllpages {
                );
 
                $showme = '';
-               if ( isset( $par ) ) {
+               if ( $par !== null ) {
                        $showme = $par;
                } elseif ( $prefix != '' ) {
                        $showme = $prefix;
@@ -96,8 +96,8 @@ class SpecialPrefixindex extends SpecialAllpages {
 
        /**
         * HTML for the top form
-        * @param $namespace Integer: a namespace constant (default NS_MAIN).
-        * @param string $from dbKey we are starting listing at.
+        * @param int $namespace A namespace constant (default NS_MAIN).
+        * @param string $from DbKey we are starting listing at.
         * @return string
         */
        protected function namespacePrefixForm( $namespace = NS_MAIN, $from = '' ) {
@@ -153,9 +153,9 @@ class SpecialPrefixindex extends SpecialAllpages {
        }
 
        /**
-        * @param $namespace Integer, default NS_MAIN
-        * @param $prefix String
-        * @param string $from list all pages from this name (default FALSE)
+        * @param int $namespace Default NS_MAIN
+        * @param string $prefix
+        * @param string $from List all pages from this name (default false)
         */
        protected function showPrefixChunk( $namespace = NS_MAIN, $prefix, $from = null ) {
                global $wgContLang;
@@ -167,6 +167,7 @@ class SpecialPrefixindex extends SpecialAllpages {
                $fromList = $this->getNamespaceKeyAndText( $namespace, $from );
                $prefixList = $this->getNamespaceKeyAndText( $namespace, $prefix );
                $namespaces = $wgContLang->getNamespaces();
+               $res = null;
 
                if ( !$prefixList || !$fromList ) {
                        $out = $this->msg( 'allpagesbadtitle' )->parseAsBlock();
@@ -261,9 +262,7 @@ class SpecialPrefixindex extends SpecialAllpages {
                                '</td>
                                <td id="mw-prefixindex-nav-form" class="mw-prefixindex-nav">';
 
-                       if ( isset( $res ) && $res && ( $n == $this->maxPerPage ) &&
-                               ( $s = $res->fetchObject() )
-                       ) {
+                       if ( $res && ( $n == $this->maxPerPage ) && ( $s = $res->fetchObject() ) ) {
                                $query = array(
                                        'from' => $s->page_title,
                                        'prefix' => $prefix,
index 5b4ccb5..7554e37 100644 (file)
@@ -27,7 +27,6 @@
  * @ingroup SpecialPage
  */
 class SpecialProtectedpages extends SpecialPage {
-
        protected $IdLevel = 'level';
        protected $IdType = 'type';
 
@@ -99,7 +98,7 @@ class SpecialProtectedpages extends SpecialPage {
         * @param bool $indefOnly Only indefinite protection
         * @param bool $cascadeOnly Only cascading protection
         * @param bool $noRedirect Don't show redirects
-        * @return String: input form
+        * @return string Input form
         */
        protected function showOptions( $namespace, $type = 'edit', $level, $sizetype,
                $size, $indefOnly, $cascadeOnly, $noRedirect
@@ -131,8 +130,8 @@ class SpecialProtectedpages extends SpecialPage {
         * Prepare the namespace filter drop-down; standard namespace
         * selector, sans the MediaWiki namespace
         *
-        * @param $namespace Mixed: pre-select namespace
-        * @return String
+        * @param string|null $namespace Pre-select namespace
+        * @return string
         */
        protected function getNamespaceMenu( $namespace = null ) {
                return Html::rawElement( 'span', array( 'style' => 'white-space: nowrap;' ),
@@ -220,7 +219,7 @@ class SpecialProtectedpages extends SpecialPage {
 
        /**
         * Creates the input label of the restriction type
-        * @param $pr_type string Protection type
+        * @param string $pr_type Protection type
         * @return string Formatted HTML
         */
        protected function getTypeMenu( $pr_type ) {
@@ -249,7 +248,7 @@ class SpecialProtectedpages extends SpecialPage {
 
        /**
         * Creates the input label of the restriction level
-        * @param $pr_level string Protection level
+        * @param string $pr_level Protection level
         * @return string Formatted HTML
         */
        protected function getLevelMenu( $pr_level ) {
@@ -438,7 +437,11 @@ class ProtectedPagesPager extends TablePager {
                                        );
                                } else {
                                        $username = UserCache::singleton()->getProp( $value, 'name' );
-                                       if ( LogEventsList::userCanBitfield( $row->log_deleted, LogPage::DELETED_USER, $this->getUser() ) ) {
+                                       if ( LogEventsList::userCanBitfield(
+                                               $row->log_deleted,
+                                               LogPage::DELETED_USER,
+                                               $this->getUser()
+                                       ) ) {
                                                if ( $username === false ) {
                                                        $formatted = htmlspecialchars( $value );
                                                } else {
@@ -473,7 +476,11 @@ class ProtectedPagesPager extends TablePager {
                                                $this->msg( 'protectedpages-unknown-reason' )->escaped()
                                        );
                                } else {
-                                       if ( LogEventsList::userCanBitfield( $row->log_deleted, LogPage::DELETED_COMMENT, $this->getUser() ) ) {
+                                       if ( LogEventsList::userCanBitfield(
+                                               $row->log_deleted,
+                                               LogPage::DELETED_COMMENT,
+                                               $this->getUser()
+                                       ) ) {
                                                $formatted = Linker::formatComment( $value !== null ? $value : '' );
                                        } else {
                                                $formatted = $this->msg( 'rev-deleted-comment' )->escaped();
index c3ebd80..cb6ec3c 100644 (file)
@@ -126,9 +126,9 @@ class SpecialProtectedtitles extends SpecialPage {
        }
 
        /**
-        * @param $namespace Integer:
-        * @param $type string
-        * @param $level string
+        * @param int $namespace
+        * @param string $type
+        * @param string $level
         * @return string
         * @private
         */
@@ -152,7 +152,7 @@ class SpecialProtectedtitles extends SpecialPage {
         * Prepare the namespace filter drop-down; standard namespace
         * selector, sans the MediaWiki namespace
         *
-        * @param $namespace Mixed: pre-select namespace
+        * @param string|null $namespace Pre-select namespace
         * @return string
         */
        function getNamespaceMenu( $namespace = null ) {
index e877b4e..2707916 100644 (file)
@@ -127,7 +127,7 @@ class SpecialRandomInCategory extends SpecialPage {
 
        /**
         * Choose a random title.
-        * @return Title object (or null if nothing to choose from)
+        * @return Title|null Title object (or null if nothing to choose from)
         */
        public function getRandomTitle() {
                // Convert to float, since we do math with the random number.
@@ -177,7 +177,7 @@ class SpecialRandomInCategory extends SpecialPage {
         *   was a large gap in the distribution of cl_timestamp values. This way instead
         *   of things to the right of the gap being favoured, both sides of the gap
         *   are favoured.
-        * @return Array Query information.
+        * @return array Query information.
         */
        protected function getQueryInfo( $rand, $offset, $up ) {
                $op = $up ? '>=' : '<=';
@@ -238,7 +238,7 @@ class SpecialRandomInCategory extends SpecialPage {
         * Get the lowest and highest timestamp for a category.
         *
         * @param Title $category
-        * @return Array The lowest and highest timestamp
+        * @return array The lowest and highest timestamp
         * @throws MWException if category has no entries.
         */
        protected function getMinAndMaxForCat( Title $category ) {
@@ -268,8 +268,8 @@ class SpecialRandomInCategory extends SpecialPage {
         * @param float $rand A random number that is converted to a random timestamp
         * @param int $offset A small offset to make the result seem more "random"
         * @param bool $up Get the result above the random value
-        * @param String $fname The name of the calling method
-        * @return Array Info for the title selected.
+        * @param string $fname The name of the calling method
+        * @return array Info for the title selected.
         */
        private function selectRandomPageFromDB( $rand, $offset, $up, $fname = __METHOD__ ) {
                $dbr = wfGetDB( DB_SLAVE );
index 086193e..24b363d 100644 (file)
@@ -80,7 +80,7 @@ class RandomPage extends SpecialPage {
        /**
         * Get a comma-delimited list of namespaces we don't have
         * any pages in
-        * @return String
+        * @return string
         */
        private function getNsList() {
                global $wgContLang;
@@ -98,7 +98,7 @@ class RandomPage extends SpecialPage {
 
        /**
         * Choose a random title.
-        * @return Title object (or null if nothing to choose from)
+        * @return Title|null Title object (or null if nothing to choose from)
         */
        public function getRandomTitle() {
                $randstr = wfRandom();
index f1a31a5..f770307 100644 (file)
@@ -527,7 +527,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
        }
 
        /**
-        * Create a input to filter changes by categories
+        * Create an input to filter changes by categories
         *
         * @param FormOptions $opts
         * @return array
index c10b7a6..d3b168b 100644 (file)
@@ -43,19 +43,19 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
        /** @var string Edit token for securing image views against XSS */
        private $token;
 
-       /** @var Title object for target parameter */
+       /** @var Title Title object for target parameter */
        private $targetObj;
 
        /** @var string Deletion type, may be revision, archive, oldimage, filearchive, logging. */
        private $typeName;
 
-       /** @var array of checkbox specs (message, name, deletion bits) */
+       /** @var array Array of checkbox specs (message, name, deletion bits) */
        private $checks;
 
        /** @var array UI Labels about the current type */
        private $typeLabels;
 
-       /** @var RevDel_List object, storing the list of items to be deleted/undeleted */
+       /** @var RevDelList RevDelList object, storing the list of items to be deleted/undeleted */
        private $revDelList;
 
        /** @var bool Whether user is allowed to perform the action */
@@ -132,7 +132,9 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                // $this->ids = array_map( 'intval', $this->ids );
                $this->ids = array_unique( array_filter( $this->ids ) );
 
-               if ( $request->getVal( 'action' ) == 'historysubmit' || $request->getVal( 'action' ) == 'revisiondelete' ) {
+               if ( $request->getVal( 'action' ) == 'historysubmit'
+                       || $request->getVal( 'action' ) == 'revisiondelete'
+               ) {
                        // For show/hide form submission from history page
                        // Since we are access through index.php?title=XXX&action=historysubmit
                        // getFullTitle() will contain the target title and not our title
@@ -162,7 +164,11 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                $this->mIsAllowed = $user->isAllowed( RevisionDeleter::getRestriction( $this->typeName ) );
 
                # Allow the list type to adjust the passed target
-               $this->targetObj = RevisionDeleter::suggestTarget( $this->typeName, $this->targetObj, $this->ids );
+               $this->targetObj = RevisionDeleter::suggestTarget(
+                       $this->typeName,
+                       $this->targetObj,
+                       $this->ids
+               );
 
                $this->otherReason = $request->getVal( 'wpReason' );
                # We need a target page!
@@ -277,7 +283,8 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
 
        /**
         * Show a deleted file version requested by the visitor.
-        * TODO Mostly copied from Special:Undelete. Refactor.
+        * @todo Mostly copied from Special:Undelete. Refactor.
+        * @param string $archiveName
         */
        protected function tryShowFile( $archiveName ) {
                $repo = RepoGroup::singleton()->getLocalRepo();
@@ -325,7 +332,9 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                # a user without appropriate permissions can toddle off and
                # nab the image, and Squid will serve it
                $this->getRequest()->response()->header( 'Expires: ' . gmdate( 'D, d M Y H:i:s', 0 ) . ' GMT' );
-               $this->getRequest()->response()->header( 'Cache-Control: no-cache, no-store, max-age=0, must-revalidate' );
+               $this->getRequest()->response()->header(
+                       'Cache-Control: no-cache, no-store, max-age=0, must-revalidate'
+               );
                $this->getRequest()->response()->header( 'Pragma: no-cache' );
 
                $key = $oimage->getStorageKey();
@@ -335,6 +344,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
 
        /**
         * Get the list object for this request
+        * @return RevDelList
         */
        protected function getList() {
                if ( is_null( $this->revDelList ) ) {
@@ -362,14 +372,18 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                $numRevisions = 0;
                // Live revisions...
                $list = $this->getList();
+               // @codingStandardsIgnoreStart Generic.CodeAnalysis.ForLoopWithTestFunctionCall.NotAllowed
                for ( $list->reset(); $list->current(); $list->next() ) {
+                       // @codingStandardsIgnoreEnd
                        $item = $list->current();
+
                        if ( !$item->canView() ) {
                                if ( !$this->submitClicked ) {
                                        throw new PermissionsError( 'suppressrevision' );
                                }
                                $userAllowed = false;
                        }
+
                        $numRevisions++;
                        $this->getOutput()->addHTML( $item->getHTML() );
                }
@@ -411,7 +425,12 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                                                Xml::label( $this->msg( 'revdelete-otherreason' )->text(), 'wpReason' ) .
                                        '</td>' .
                                        '<td class="mw-input">' .
-                                               Xml::input( 'wpReason', 60, $this->otherReason, array( 'id' => 'wpReason', 'maxlength' => 100 ) ) .
+                                               Xml::input(
+                                                       'wpReason',
+                                                       60,
+                                                       $this->otherReason,
+                                                       array( 'id' => 'wpReason', 'maxlength' => 100 )
+                                               ) .
                                        '</td>' .
                                "</tr><tr>\n" .
                                        '<td></td>' .
@@ -452,17 +471,22 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
         */
        protected function addUsageText() {
                // Messages: revdelete-text-text, revdelete-text-file, logdelete-text
-               $this->getOutput()->wrapWikiMsg( "<strong>$1</strong>\n$2", $this->typeLabels['text'], 'revdelete-text-others' );
+               $this->getOutput()->wrapWikiMsg(
+                       "<strong>$1</strong>\n$2", $this->typeLabels['text'],
+                       'revdelete-text-others'
+               );
+
                if ( $this->getUser()->isAllowed( 'suppressrevision' ) ) {
                        $this->getOutput()->addWikiMsg( 'revdelete-suppress-text' );
                }
+
                if ( $this->mIsAllowed ) {
                        $this->getOutput()->addWikiMsg( 'revdelete-confirm' );
                }
        }
 
        /**
-        * @return String: HTML
+        * @return string HTML
         */
        protected function buildCheckBoxes() {
                $html = '<table>';
@@ -471,26 +495,38 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                if ( $list->length() == 1 ) {
                        $list->reset();
                        $bitfield = $list->current()->getBits(); // existing field
+
                        if ( $this->submitClicked ) {
                                $bitfield = RevisionDeleter::extractBitfield( $this->extractBitParams(), $bitfield );
                        }
+
                        foreach ( $this->checks as $item ) {
                                // Messages: revdelete-hide-text, revdelete-hide-image, revdelete-hide-name,
                                // revdelete-hide-comment, revdelete-hide-user, revdelete-hide-restricted
                                list( $message, $name, $field ) = $item;
-                               $innerHTML = Xml::checkLabel( $this->msg( $message )->text(), $name, $name, $bitfield & $field );
+                               $innerHTML = Xml::checkLabel(
+                                       $this->msg( $message )->text(),
+                                       $name,
+                                       $name,
+                                       $bitfield & $field
+                               );
+
                                if ( $field == Revision::DELETED_RESTRICTED ) {
                                        $innerHTML = "<b>$innerHTML</b>";
                                }
+
                                $line = Xml::tags( 'td', array( 'class' => 'mw-input' ), $innerHTML );
                                $html .= "<tr>$line</tr>\n";
                        }
                } else {
                        // Otherwise, use tri-state radios
                        $html .= '<tr>';
-                       $html .= '<th class="mw-revdel-checkbox">' . $this->msg( 'revdelete-radio-same' )->escaped() . '</th>';
-                       $html .= '<th class="mw-revdel-checkbox">' . $this->msg( 'revdelete-radio-unset' )->escaped() . '</th>';
-                       $html .= '<th class="mw-revdel-checkbox">' . $this->msg( 'revdelete-radio-set' )->escaped() . '</th>';
+                       $html .= '<th class="mw-revdel-checkbox">'
+                               . $this->msg( 'revdelete-radio-same' )->escaped() . '</th>';
+                       $html .= '<th class="mw-revdel-checkbox">'
+                               . $this->msg( 'revdelete-radio-unset' )->escaped() . '</th>';
+                       $html .= '<th class="mw-revdel-checkbox">'
+                               . $this->msg( 'revdelete-radio-set' )->escaped() . '</th>';
                        $html .= "<th></th></tr>\n";
                        foreach ( $this->checks as $item ) {
                                // Messages: revdelete-hide-text, revdelete-hide-image, revdelete-hide-name,
@@ -533,16 +569,20 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        return false;
                }
                $bitParams = $this->extractBitParams();
-               $listReason = $this->getRequest()->getText( 'wpRevDeleteReasonList', 'other' ); // from dropdown
+               // from dropdown
+               $listReason = $this->getRequest()->getText( 'wpRevDeleteReasonList', 'other' );
                $comment = $listReason;
-               if ( $comment != 'other' && $this->otherReason != '' ) {
-                       // Entry from drop down menu + additional comment
-                       $comment .= $this->msg( 'colon-separator' )->inContentLanguage()->text() . $this->otherReason;
-               } elseif ( $comment == 'other' ) {
+               if ( $comment === 'other' ) {
                        $comment = $this->otherReason;
+               } elseif ( $this->otherReason !== '' ) {
+                       // Entry from drop down menu + additional comment
+                       $comment .= $this->msg( 'colon-separator' )->inContentLanguage()->text()
+                               . $this->otherReason;
                }
                # Can the user set this field?
-               if ( $bitParams[Revision::DELETED_RESTRICTED] == 1 && !$this->getUser()->isAllowed( 'suppressrevision' ) ) {
+               if ( $bitParams[Revision::DELETED_RESTRICTED] == 1
+                       && !$this->getUser()->isAllowed( 'suppressrevision' )
+               ) {
                        throw new PermissionsError( 'suppressrevision' );
                }
                # If the save went through, go to success message...
@@ -565,7 +605,10 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
        protected function success() {
                // Messages: revdelete-success, logdelete-success
                $this->getOutput()->setPageTitle( $this->msg( 'actioncomplete' ) );
-               $this->getOutput()->wrapWikiMsg( "<span class=\"success\">\n$1\n</span>", $this->typeLabels['success'] );
+               $this->getOutput()->wrapWikiMsg(
+                       "<span class=\"success\">\n$1\n</span>",
+                       $this->typeLabels['success']
+               );
                $this->wasSaved = true;
                $this->revDelList->reloadFromMaster();
                $this->showForm();
@@ -604,10 +647,10 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
        }
 
        /**
-        * Do the write operations. Simple wrapper for RevDel_*List::setVisibility().
-        * @param $bitfield
-        * @param $reason
-        * @param $title
+        * Do the write operations. Simple wrapper for RevDel*List::setVisibility().
+        * @param int $bitfield
+        * @param string $reason
+        * @param Title $title
         * @return Status
         */
        protected function save( $bitfield, $reason, $title ) {
index 104cd54..63eff36 100644 (file)
@@ -66,12 +66,13 @@ class SpecialRunJobs extends UnlistedSpecialPage {
 
                // Constant-time signature verification
                // http://www.emerose.com/timing-attacks-explained
-               // @todo: make a common method for this
+               // @todo Make a common method for this
                if ( !is_string( $rSig ) || strlen( $rSig ) !== strlen( $cSig ) ) {
                        $verified = false;
                } else {
                        $result = 0;
-                       for ( $i = 0; $i < strlen( $cSig ); $i++ ) {
+                       $cSigLength = strlen( $cSig );
+                       for ( $i = 0; $i < $cSigLength; $i++ ) {
                                $result |= ord( $cSig[$i] ) ^ ord( $rSig[$i] );
                        }
                        $verified = ( $result == 0 );
@@ -117,7 +118,7 @@ class SpecialRunJobs extends UnlistedSpecialPage {
         *
         * @note: also called from Wiki.php
         *
-        * @param integer $maxJobs Maximum number of jobs to run
+        * @param int $maxJobs Maximum number of jobs to run
         * @return void
         */
        public static function executeJobs( $maxJobs ) {
index 949b863..33bd87f 100644 (file)
@@ -30,7 +30,7 @@
 class SpecialSearch extends SpecialPage {
        /**
         * Current search profile. Search profile is just a name that identifies
-        * the active search tab on the search page (content, help, discussions...)
+        * the active search tab on the search page (content, discussions...)
         * For users tt replaces the set of enabled namespaces from the query
         * string when applicable. Extensions can add new profiles with hooks
         * with custom search options just for that profile.
@@ -41,13 +41,13 @@ class SpecialSearch extends SpecialPage {
        /** @var SearchEngine Search engine */
        protected $searchEngine;
 
-       /** @var String Search engine type, if not default */
+       /** @var string Search engine type, if not default */
        protected $searchEngineType;
 
-       /** @var Array For links */
+       /** @var array For links */
        protected $extraParams = array();
 
-       /** @var String No idea, apparently used by some other classes */
+       /** @var string No idea, apparently used by some other classes */
        protected $mPrefix;
 
        /**
@@ -74,7 +74,7 @@ class SpecialSearch extends SpecialPage {
        /**
         * Entry point
         *
-        * @param string $par or null
+        * @param string $par
         */
        public function execute( $par ) {
                $this->setHeaders();
@@ -162,7 +162,7 @@ class SpecialSearch extends SpecialPage {
        /**
         * If an exact title match can be found, jump straight ahead to it.
         *
-        * @param $term String
+        * @param string $term
         */
        public function goResult( $term ) {
                $this->setupPage( $term );
@@ -200,7 +200,7 @@ class SpecialSearch extends SpecialPage {
        }
 
        /**
-        * @param $term String
+        * @param string $term
         */
        public function showResults( $term ) {
                global $wgDisableTextSearch, $wgSearchForwardUrl, $wgContLang, $wgScript;
@@ -226,7 +226,11 @@ class SpecialSearch extends SpecialPage {
                                $out->addHTML(
                                        Xml::openElement( 'fieldset' ) .
                                        Xml::element( 'legend', null, $this->msg( 'search-external' )->text() ) .
-                                       Xml::element( 'p', array( 'class' => 'mw-searchdisabled' ), $this->msg( 'searchdisabled' )->text() ) .
+                                       Xml::element(
+                                               'p',
+                                               array( 'class' => 'mw-searchdisabled' ),
+                                               $this->msg( 'searchdisabled' )->text()
+                                       ) .
                                        $this->msg( 'googlesearch' )->rawParams(
                                                htmlspecialchars( $term ),
                                                'UTF-8',
@@ -259,8 +263,6 @@ class SpecialSearch extends SpecialPage {
 
                // did you mean... suggestions
                if ( $showSuggestion && $textMatches && !$textStatus && $textMatches->hasSuggestion() ) {
-                       $st = SpecialPage::getTitleFor( 'Search' );
-
                        # mirror Go/Search behavior of original request ..
                        $didYouMeanParams = array( 'search' => $textMatches->getSuggestionQuery() );
 
@@ -280,13 +282,14 @@ class SpecialSearch extends SpecialPage {
                        }
 
                        $suggestLink = Linker::linkKnown(
-                               $st,
+                               $this->getPageTitle(),
                                $suggestionSnippet,
                                array(),
                                $stParams
                        );
 
-                       $this->didYouMeanHtml = '<div class="searchdidyoumean">' . $this->msg( 'search-suggest' )->rawParams( $suggestLink )->text() . '</div>';
+                       $this->didYouMeanHtml = '<div class="searchdidyoumean">'
+                               . $this->msg( 'search-suggest' )->rawParams( $suggestLink )->text() . '</div>';
                }
 
                if ( !wfRunHooks( 'SpecialSearchResultsPrepend', array( $this, $out, $term ) ) ) {
@@ -360,14 +363,19 @@ class SpecialSearch extends SpecialPage {
                $out->addHtml( "<div class='searchresults'>" );
 
                // prev/next links
+               $prevnext = null;
                if ( $num || $this->offset ) {
                        // Show the create link ahead
                        $this->showCreateLink( $title, $num, $titleMatches, $textMatches );
-                       $prevnext = $this->getLanguage()->viewPrevNext( $this->getPageTitle(), $this->offset, $this->limit,
-                               $this->powerSearchOptions() + array( 'search' => $term ),
-                               max( $titleMatchesNum, $textMatchesNum ) < $this->limit
-                       );
-                       //$out->addHTML( "<p class='mw-search-pager-top'>{$prevnext}</p>\n" );
+                       if ( $totalRes > $this->limit || $this->offset ) {
+                               $prevnext = $this->getLanguage()->viewPrevNext(
+                                       $this->getPageTitle(),
+                                       $this->offset,
+                                       $this->limit,
+                                       $this->powerSearchOptions() + array( 'search' => $term ),
+                                       max( $titleMatchesNum, $textMatchesNum ) < $this->limit
+                               );
+                       }
                        wfRunHooks( 'SpecialSearchResults', array( $term, &$titleMatches, &$textMatches ) );
                } else {
                        wfRunHooks( 'SpecialSearchNoResults', array( $term ) );
@@ -386,10 +394,8 @@ class SpecialSearch extends SpecialPage {
                        if ( $numTextMatches > 0 && $numTitleMatches > 0 ) {
                                // if no title matches the heading is redundant
                                $out->wrapWikiMsg( "==$1==\n", 'textmatches' );
-                       } elseif ( $totalRes == 0 ) {
-                               # Don't show the 'no text matches' if we received title matches
-                               # $out->wrapWikiMsg( "==$1==\n", 'notextmatches' );
                        }
+
                        // show interwiki results if any
                        if ( $textMatches->hasInterwikiResults() ) {
                                $out->addHTML( $this->showInterwiki( $textMatches->getInterwikiResults(), $term ) );
@@ -413,16 +419,16 @@ class SpecialSearch extends SpecialPage {
                }
                $out->addHtml( "</div>" );
 
-               if ( $num || $this->offset ) {
+               if ( $prevnext ) {
                        $out->addHTML( "<p class='mw-search-pager-bottom'>{$prevnext}</p>\n" );
                }
        }
 
        /**
-        * @param $title Title
+        * @param Title $title
         * @param int $num The number of search results found
-        * @param $titleMatches null|SearchResultSet results from title search
-        * @param $textMatches null|SearchResultSet results from text search
+        * @param null|SearchResultSet $titleMatches Results from title search
+        * @param null|SearchResultSet $textMatches  Results from text search
         */
        protected function showCreateLink( $title, $num, $titleMatches, $textMatches ) {
                // show direct page/create link if applicable
@@ -446,7 +452,11 @@ class SpecialSearch extends SpecialPage {
                } else {
                        $messageName = 'searchmenu-new-nocreate';
                }
-               $params = array( $messageName, wfEscapeWikiText( $title->getPrefixedText() ), Message::numParam( $num ) );
+               $params = array(
+                       $messageName,
+                       wfEscapeWikiText( $title->getPrefixedText() ),
+                       Message::numParam( $num )
+               );
                wfRunHooks( 'SpecialSearchCreateLink', array( $title, &$params ) );
 
                // Extensions using the hook might still return an empty $messageName
@@ -459,7 +469,7 @@ class SpecialSearch extends SpecialPage {
        }
 
        /**
-        * @param $term string
+        * @param string $term
         */
        protected function setupPage( $term ) {
                # Should advanced UI be used?
@@ -480,8 +490,8 @@ class SpecialSearch extends SpecialPage {
         * Extract "power search" namespace settings from the request object,
         * returning a list of index numbers to search.
         *
-        * @param $request WebRequest
-        * @return Array
+        * @param WebRequest $request
+        * @return array
         */
        protected function powerSearch( &$request ) {
                $arr = array();
@@ -497,7 +507,7 @@ class SpecialSearch extends SpecialPage {
        /**
         * Reconstruct the 'power search' options for links
         *
-        * @return Array
+        * @return array
         */
        protected function powerSearchOptions() {
                $opt = array();
@@ -515,7 +525,7 @@ class SpecialSearch extends SpecialPage {
        /**
         * Show whole set of results
         *
-        * @param $matches SearchResultSet
+        * @param SearchResultSet $matches
         *
         * @return string
         */
@@ -542,8 +552,8 @@ class SpecialSearch extends SpecialPage {
        /**
         * Format a single hit result
         *
-        * @param $result SearchResult
-        * @param array $terms terms to highlight
+        * @param SearchResult $result
+        * @param array $terms Terms to highlight
         *
         * @return string
         */
@@ -551,7 +561,7 @@ class SpecialSearch extends SpecialPage {
                $profile = new ProfileSection( __METHOD__ );
 
                if ( $result->isBrokenTitle() ) {
-                       return "<!-- Broken link in search result -->\n";
+                       return '';
                }
 
                $title = $result->getTitle();
@@ -583,7 +593,7 @@ class SpecialSearch extends SpecialPage {
                // The least confusing at this point is to drop the result.
                // You may get less results, but... oh well. :P
                if ( $result->isMissingRevision() ) {
-                       return "<!-- missing page " . htmlspecialchars( $title->getPrefixedText() ) . "-->\n";
+                       return '';
                }
 
                // format redirects / relevant sections
@@ -651,7 +661,6 @@ class SpecialSearch extends SpecialPage {
                // link to related articles if supported
                $related = '';
                if ( $result->hasRelated() ) {
-                       $st = SpecialPage::getTitleFor( 'Search' );
                        $stParams = array_merge(
                                $this->powerSearchOptions(),
                                array(
@@ -662,7 +671,7 @@ class SpecialSearch extends SpecialPage {
                        );
 
                        $related = ' -- ' . Linker::linkKnown(
-                               $st,
+                               $this->getPageTitle(),
                                $this->msg( 'search-relatedarticle' )->text(),
                                array(),
                                $stParams
@@ -711,7 +720,8 @@ class SpecialSearch extends SpecialPage {
                        &$score, &$size, &$date, &$related,
                        &$html
                ) ) ) {
-                       $html = "<li><div class='mw-search-result-heading'>{$link} {$redirect} {$section} {$fileMatch}</div> {$extract}\n" .
+                       $html = "<li><div class='mw-search-result-heading'>" .
+                               "{$link} {$redirect} {$section} {$fileMatch}</div> {$extract}\n" .
                                "<div class='mw-search-result-data'>{$score}{$size} - {$date}{$related}</div>" .
                                "</li>\n";
                }
@@ -722,8 +732,8 @@ class SpecialSearch extends SpecialPage {
        /**
         * Show results from other wikis
         *
-        * @param $matches SearchResultSet|array
-        * @param $query String
+        * @param SearchResultSet|array $matches
+        * @param string $query
         *
         * @return string
         */
@@ -737,7 +747,8 @@ class SpecialSearch extends SpecialPage {
 
                // work out custom project captions
                $customCaptions = array();
-               $customLines = explode( "\n", $this->msg( 'search-interwiki-custom' )->text() ); // format per line <iwprefix>:<caption>
+               // format per line <iwprefix>:<caption>
+               $customLines = explode( "\n", $this->msg( 'search-interwiki-custom' )->text() );
                foreach ( $customLines as $line ) {
                        $parts = explode( ":", $line, 2 );
                        if ( count( $parts ) == 2 ) { // validate line
@@ -759,8 +770,7 @@ class SpecialSearch extends SpecialPage {
                        }
                }
 
-
-               // TODO: should support paging in a non-confusing way (not sure how though, maybe via ajax)..
+               // @todo Should support paging in a non-confusing way (not sure how though, maybe via ajax)..
                $out .= "</ul></div>\n";
 
                // convert the whole thing to desired language variant
@@ -772,9 +782,9 @@ class SpecialSearch extends SpecialPage {
        /**
         * Show single interwiki link
         *
-        * @param $result SearchResult
-        * @param $lastInterwiki String
-        * @param $query String
+        * @param SearchResult $result
+        * @param string $lastInterwiki
+        * @param string $query
         * @param array $customCaptions iw prefix -> caption
         *
         * @return string
@@ -783,7 +793,7 @@ class SpecialSearch extends SpecialPage {
                $profile = new ProfileSection( __METHOD__ );
 
                if ( $result->isBrokenTitle() ) {
-                       return "<!-- Broken link in search result -->\n";
+                       return '';
                }
 
                $title = $result->getTitle();
@@ -847,9 +857,9 @@ class SpecialSearch extends SpecialPage {
        }
 
        /**
-        * @param $profile
-        * @param $term
-        * @return String
+        * @param string $profile
+        * @param string $term
+        * @return string
         */
        protected function getProfileForm( $profile, $term ) {
                // Hidden stuff
@@ -869,9 +879,9 @@ class SpecialSearch extends SpecialPage {
        /**
         * Generates the power search box at [[Special:Search]]
         *
-        * @param string $term search term
-        * @param $opts array
-        * @return String: HTML form
+        * @param string $term Search term
+        * @param array $opts
+        * @return string HTML form
         */
        protected function powerSearchBox( $term, $opts ) {
                global $wgContLang;
@@ -965,14 +975,6 @@ class SpecialSearch extends SpecialPage {
                                'tooltip' => 'searchprofile-images-tooltip',
                                'namespaces' => array( NS_FILE ),
                        ),
-                       'help' => array(
-                               'message' => 'searchprofile-project',
-                               'tooltip' => 'searchprofile-project-tooltip',
-                               'namespaces' => SearchEngine::helpNamespaces(),
-                               'namespace-messages' => SearchEngine::namespacesAsText(
-                                       SearchEngine::helpNamespaces()
-                               ),
-                       ),
                        'all' => array(
                                'message' => 'searchprofile-everything',
                                'tooltip' => 'searchprofile-everything-tooltip',
@@ -998,9 +1000,9 @@ class SpecialSearch extends SpecialPage {
        }
 
        /**
-        * @param $term
-        * @param $resultsShown
-        * @param $totalNum
+        * @param string $term
+        * @param int $resultsShown
+        * @param int $totalNum
         * @return string
         */
        protected function formHeader( $term, $resultsShown, $totalNum ) {
@@ -1072,7 +1074,7 @@ class SpecialSearch extends SpecialPage {
        }
 
        /**
-        * @param $term string
+        * @param string $term
         * @return string
         */
        protected function shortDialog( $term ) {
@@ -1097,12 +1099,12 @@ class SpecialSearch extends SpecialPage {
        /**
         * Make a search link with some target namespaces
         *
-        * @param $term String
-        * @param array $namespaces ignored
-        * @param string $label link's text
-        * @param string $tooltip link's tooltip
-        * @param array $params query string parameters
-        * @return String: HTML fragment
+        * @param string $term
+        * @param array $namespaces Ignored
+        * @param string $label Link's text
+        * @param string $tooltip Link's tooltip
+        * @param array $params Query string parameters
+        * @return string HTML fragment
         */
        protected function makeSearchLink( $term, $namespaces, $label, $tooltip, $params = array() ) {
                $opt = $params;
@@ -1131,8 +1133,8 @@ class SpecialSearch extends SpecialPage {
        /**
         * Check if query starts with image: prefix
         *
-        * @param string $term the string to check
-        * @return Boolean
+        * @param string $term The string to check
+        * @return bool
         */
        protected function startsWithImage( $term ) {
                global $wgContLang;
@@ -1148,8 +1150,8 @@ class SpecialSearch extends SpecialPage {
        /**
         * Check if query starts with all: prefix
         *
-        * @param string $term the string to check
-        * @return Boolean
+        * @param string $term The string to check
+        * @return bool
         */
        protected function startsWithAll( $term ) {
 
@@ -1199,8 +1201,8 @@ class SpecialSearch extends SpecialPage {
         * user navigates search results.
         * @since 1.18
         *
-        * @param $key
-        * @param $value
+        * @param string $key
+        * @param mixed $value
         */
        public function setExtraParam( $key, $value ) {
                $this->extraParams[$key] = $value;
index dffa7de..782d9a1 100644 (file)
@@ -58,7 +58,7 @@ class ShortPagesPage extends QueryPage {
        }
 
        /**
-        * @param $db DatabaseBase
+        * @param DatabaseBase $db
         * @param ResultWrapper $res
         */
        function preprocessResults( $db, $res ) {
index 9ec3c5b..8a32ba9 100644 (file)
@@ -96,7 +96,6 @@ class SpecialTrackingCategories extends SpecialPage {
                                                $catTitle,
                                                htmlspecialchars( $catName )
                                        );
-                                       $classes = array();
                                } else {
                                        $catTitleText = $this->msg( 'trackingcategories-disabled' )->parse();
                                }
index 3a2b0c6..797543f 100644 (file)
@@ -82,14 +82,14 @@ class SpecialUnblock extends SpecialPage {
                $fields = array(
                        'Target' => array(
                                'type' => 'text',
-                               'label-message' => 'ipadressorusername',
+                               'label-message' => 'ipaddressorusername',
                                'tabindex' => '1',
                                'size' => '45',
                                'required' => true,
                        ),
                        'Name' => array(
                                'type' => 'info',
-                               'label-message' => 'ipadressorusername',
+                               'label-message' => 'ipaddressorusername',
                        ),
                        'Reason' => array(
                                'type' => 'text',
@@ -144,7 +144,7 @@ class SpecialUnblock extends SpecialPage {
         * Submit callback for an HTMLForm object
         * @param array $data
         * @param HTMLForm $form
-        * @return Array( Array(message key, parameters)
+        * @return array|bool Array(message key, parameters)
         */
        public static function processUIUnblock( array $data, HTMLForm $form ) {
                return self::processUnblock( $data, $form->getContext() );
@@ -153,10 +153,10 @@ class SpecialUnblock extends SpecialPage {
        /**
         * Process the form
         *
-        * @param $data Array
-        * @param $context IContextSource
+        * @param array $data
+        * @param IContextSource $context
         * @throws ErrorPageError
-        * @return Array( Array(message key, parameters) ) on failure, True on success
+        * @return array|bool Array(message key, parameters) on failure, True on success
         */
        public static function processUnblock( array $data, IContextSource $context ) {
                $performer = $context->getUser();
index 55ab32d..51235ee 100644 (file)
@@ -331,7 +331,7 @@ class PageArchive {
        /**
         * Quick check if any archived revisions are present for the page.
         *
-        * @return boolean
+        * @return bool
         */
        function isDeleted() {
                $dbr = wfGetDB( DB_SLAVE );
@@ -439,7 +439,7 @@ class PageArchive {
         * @param bool $unsuppress Remove all ar_deleted/fa_deleted restrictions of seletected revs
         * @param string $comment
         * @throws ReadOnlyError
-        * @return Status Object containing the number of revisions restored on success
+        * @return Status Status object containing the number of revisions restored on success
         */
        private function undeleteRevisions( $timestamps, $unsuppress = false, $comment = '' ) {
                global $wgContentHandlerUseDB;
@@ -550,6 +550,7 @@ class PageArchive {
 
                $ret->seek( $rev_count - 1 ); // move to last
                $row = $ret->fetchObject(); // get newest archived rev
+               $oldPageId = (int)$row->ar_page_id; // pass this to ArticleUndelete hook
                $ret->seek( 0 ); // move back
 
                // grab the content to check consistency with global state before restoring the page.
@@ -642,7 +643,7 @@ class PageArchive {
                        );
                }
 
-               wfRunHooks( 'ArticleUndelete', array( &$this->title, $created, $comment ) );
+               wfRunHooks( 'ArticleUndelete', array( &$this->title, $created, $comment, $oldPageId ) );
 
                if ( $this->title->getNamespace() == NS_FILE ) {
                        $update = new HTMLCacheUpdate( $this->title, 'imagelinks' );
@@ -1147,6 +1148,7 @@ class SpecialUndelete extends SpecialPage {
 
        /**
         * Show a form confirming whether a tokenless user really wants to see a file
+        * @param string $key
         */
        private function showFileConfirmationForm( $key ) {
                $out = $this->getOutput();
@@ -1174,6 +1176,7 @@ class SpecialUndelete extends SpecialPage {
 
        /**
         * Show a deleted file version requested by the visitor.
+        * @param string $key
         */
        private function showFile( $key ) {
                $this->getOutput()->disable();
@@ -1539,7 +1542,7 @@ class SpecialUndelete extends SpecialPage {
         * @param File|ArchivedFile $file
         * @param Title $titleObj
         * @param string $ts A timestamp
-        * @param string $key a storage key
+        * @param string $key A storage key
         *
         * @return string HTML fragment
         */
index ec2e7f5..fe0638e 100644 (file)
@@ -70,6 +70,14 @@ class UnwatchedpagesPage extends QueryPage {
                return array( 'page_namespace', 'page_title' );
        }
 
+       /**
+        * Add the JS
+        */
+       public function execute( $par ) {
+               parent::execute( $par );
+               $this->getOutput()->addModules( 'mediawiki.special.unwatchedPages' );
+       }
+
        /**
         * @param Skin $skin
         * @param object $result Result row
@@ -91,7 +99,7 @@ class UnwatchedpagesPage extends QueryPage {
                $wlink = Linker::linkKnown(
                        $nt,
                        $this->msg( 'watch' )->escaped(),
-                       array(),
+                       array( 'class' => 'mw-watch-link' ),
                        array( 'action' => 'watch', 'token' => $token )
                );
 
index b46f942..01c0aaf 100644 (file)
@@ -32,7 +32,7 @@ class SpecialUpload extends SpecialPage {
        /**
         * Constructor : initialise object
         * Get data POSTed through the form and assign them to the object
-        * @param $request WebRequest : data posted.
+        * @param WebRequest $request Data posted.
         */
        public function __construct( $request = null ) {
                parent::__construct( 'Upload', 'upload' );
@@ -133,8 +133,8 @@ class SpecialUpload extends SpecialPage {
         * Handle permission checking elsewhere in order to be able to show
         * custom error messages.
         *
-        * @param $user User object
-        * @return Boolean
+        * @param User $user
+        * @return bool
         */
        public function userCanExecute( User $user ) {
                return UploadBase::isEnabled() && parent::userCanExecute( $user );
@@ -142,6 +142,7 @@ class SpecialUpload extends SpecialPage {
 
        /**
         * Special page entry point
+        * @param string $par
         */
        public function execute( $par ) {
                $this->setHeaders();
@@ -202,7 +203,7 @@ class SpecialUpload extends SpecialPage {
        /**
         * Show the main upload form
         *
-        * @param $form Mixed: an HTMLForm instance or HTML string to show
+        * @param HTMLForm|string $form An HTMLForm instance or HTML string to show
         */
        protected function showUploadForm( $form ) {
                # Add links if file was previously deleted
@@ -221,8 +222,8 @@ class SpecialUpload extends SpecialPage {
         * Get an UploadForm instance with title and text properly set.
         *
         * @param string $message HTML string to add to the form
-        * @param string $sessionKey session key in case this is a stashed upload
-        * @param $hideIgnoreWarning Boolean: whether to hide "ignore warning" check box
+        * @param string $sessionKey Session key in case this is a stashed upload
+        * @param bool $hideIgnoreWarning Whether to hide "ignore warning" check box
         * @return UploadForm
         */
        protected function getUploadForm( $message = '', $sessionKey = '', $hideIgnoreWarning = false ) {
@@ -328,9 +329,9 @@ class SpecialUpload extends SpecialPage {
         * Stashes the upload, shows the main form, but adds a "continue anyway button".
         * Also checks whether there are actually warnings to display.
         *
-        * @param $warnings Array
-        * @return boolean true if warnings were displayed, false if there are no
-        *         warnings and it should continue processing
+        * @param array $warnings
+        * @return bool True if warnings were displayed, false if there are no
+        *   warnings and it should continue processing
         */
        protected function showUploadWarning( $warnings ) {
                # If there are no warnings, or warnings we can ignore, return early.
@@ -535,7 +536,7 @@ class SpecialUpload extends SpecialPage {
         *
         * Note that the page target can be changed *on the form*, so our check
         * state can get out of sync.
-        * @return Bool|String
+        * @return bool|string
         */
        protected function getWatchCheck() {
                if ( $this->getUser()->getOption( 'watchdefault' ) ) {
@@ -563,7 +564,7 @@ class SpecialUpload extends SpecialPage {
        /**
         * Provides output to the user for a result of UploadBase::verifyUpload
         *
-        * @param array $details result of UploadBase::verifyUpload
+        * @param array $details Result of UploadBase::verifyUpload
         * @throws MWException
         */
        protected function processVerificationError( $details ) {
@@ -642,7 +643,7 @@ class SpecialUpload extends SpecialPage {
        /**
         * Remove a temporarily kept file stashed by saveTempUploadedFile().
         *
-        * @return Boolean: success
+        * @return bool Success
         */
        protected function unsaveUploadedFile() {
                if ( !( $this->mUpload instanceof UploadFromStash ) ) {
@@ -664,8 +665,8 @@ class SpecialUpload extends SpecialPage {
         * Formats a result of UploadBase::getExistsWarning as HTML
         * This check is static and can be done pre-upload via AJAX
         *
-        * @param array $exists the result of UploadBase::getExistsWarning
-        * @return String: empty string if there is no warning or an HTML fragment
+        * @param array $exists The result of UploadBase::getExistsWarning
+        * @return string Empty string if there is no warning or an HTML fragment
         */
        public static function getExistsWarning( $exists ) {
                if ( !$exists ) {
@@ -716,7 +717,7 @@ class SpecialUpload extends SpecialPage {
 
        /**
         * Construct a warning and a gallery from an array of duplicate files.
-        * @param $dupes array
+        * @param array $dupes
         * @return string
         */
        public function getDupeWarning( $dupes ) {
@@ -807,7 +808,7 @@ class UploadForm extends HTMLForm {
         * Get the descriptor of the fieldset that contains the file source
         * selection. The section is 'source'
         *
-        * @return Array: descriptor array
+        * @return array Descriptor array
         */
        protected function getSourceSection() {
                global $wgCopyUploadsFromSpecialUpload;
@@ -901,7 +902,7 @@ class UploadForm extends HTMLForm {
        /**
         * Get the messages indicating which extensions are preferred and prohibitted.
         *
-        * @return String: HTML string containing the message
+        * @return string HTML string containing the message
         */
        protected function getExtensionsMessage() {
                # Print a list of allowed file extensions, if so configured.  We ignore
@@ -947,7 +948,7 @@ class UploadForm extends HTMLForm {
         * Get the descriptor of the fieldset that contains the file description
         * input. The section is 'description'
         *
-        * @return Array: descriptor array
+        * @return array Descriptor array
         */
        protected function getDescriptionSection() {
                if ( $this->mSessionKey ) {
@@ -1045,7 +1046,7 @@ class UploadForm extends HTMLForm {
         * Get the descriptor of the fieldset that contains the upload options,
         * such as "watch this file". The section is 'options'
         *
-        * @return Array: descriptor array
+        * @return array Descriptor array
         */
        protected function getOptionsSection() {
                $user = $this->getUser();
@@ -1144,7 +1145,7 @@ class UploadForm extends HTMLForm {
 class UploadSourceField extends HTMLTextField {
 
        /**
-        * @param $cellAttributes array
+        * @param array $cellAttributes
         * @return string
         */
        function getLabelHtml( $cellAttributes = array() ) {
index 33883b0..75ab19f 100644 (file)
@@ -59,7 +59,7 @@ class SpecialUploadStash extends UnlistedSpecialPage {
         *
         * @param string $subPage subpage, e.g. in
         *   http://example.com/wiki/Special:UploadStash/foo.jpg, the "foo.jpg" part
-        * @return Boolean: success
+        * @return bool Success
         */
        public function execute( $subPage ) {
                $this->checkPermissions();
@@ -153,10 +153,10 @@ class SpecialUploadStash extends UnlistedSpecialPage {
        /**
         * Get a thumbnail for file, either generated locally or remotely, and stream it out
         *
-        * @param $file
-        * @param $params array
+        * @param File $file
+        * @param array $params
         *
-        * @return boolean success
+        * @return bool Success
         */
        private function outputThumbFromStash( $file, $params ) {
                // this global, if it exists, points to a "scaler", as you might find in
@@ -177,11 +177,11 @@ class SpecialUploadStash extends UnlistedSpecialPage {
        /**
         * Scale a file (probably with a locally installed imagemagick, or similar)
         * and output it to STDOUT.
-        * @param $file File
+        * @param File $file
         * @param array $params Scaling parameters ( e.g. array( width => '50' ) );
         * @param int $flags Scaling flags ( see File:: constants )
         * @throws MWException|UploadStashFileNotFoundException
-        * @return boolean success
+        * @return bool Success
         */
        private function outputLocallyScaledThumb( $file, $params, $flags ) {
                // n.b. this is stupid, we insist on re-transforming the file every time we are invoked. We rely
@@ -227,7 +227,7 @@ class SpecialUploadStash extends UnlistedSpecialPage {
         * @param array $params Scaling parameters ( e.g. array( width => '50' ) );
         * @param int $flags Scaling flags ( see File:: constants )
         * @throws MWException
-        * @return boolean success
+        * @return bool success
         */
        private function outputRemoteScaledThumb( $file, $params, $flags ) {
                // This global probably looks something like
@@ -294,8 +294,8 @@ class SpecialUploadStash extends UnlistedSpecialPage {
        /**
         * Output HTTP response of raw content
         * Side effect: writes HTTP response to STDOUT.
-        * @param string $content content
-        * @param string $contentType mime type
+        * @param string $content Content
+        * @param string $contentType Mime type
         * @throws SpecialUploadStashTooLargeException
         * @return bool
         */
index 9a2e194..bee94f8 100644 (file)
@@ -166,7 +166,7 @@ class LoginForm extends SpecialPage {
        }
 
        /*
-        * @param $subPage string|null
+        * @param string|null $subPage
         */
        public function execute( $subPage ) {
                if ( session_id() == '' ) {
@@ -193,7 +193,10 @@ class LoginForm extends SpecialPage {
                                'title' => null,
                        ) + $this->mRequest->getQueryValues();
                        $url = $title->getFullURL( $query, false, PROTO_HTTPS );
-                       if ( $wgSecureLogin && wfCanIPUseHTTPS( $this->getRequest()->getIP() ) ) {
+                       if ( $wgSecureLogin
+                               && wfCanIPUseHTTPS( $this->getRequest()->getIP() )
+                               && !$this->mFromHTTP ) // Avoid infinite redirect
+                       {
                                $url = wfAppendQuery( $url, 'fromhttp=1' );
                                $this->getOutput()->redirect( $url );
                                // Since we only do this redir to change proto, always vary
@@ -435,7 +438,11 @@ class LoginForm extends SpecialPage {
 
                // Normalize the name so that silly things don't cause "invalid username"
                // errors. User::newFromName does some rather strict checking, rejecting
-               // e.g. leading/trailing/multiple spaces.
+               // e.g. leading/trailing/multiple spaces. But first we need to reject
+               // usernames that would be treated as titles with a fragment part.
+               if ( strpos( $this->mUsername, '#' ) !== false ) {
+                       return Status::newFatal( 'noname' );
+               }
                $title = Title::makeTitleSafe( NS_USER, $this->mUsername );
                if ( !is_object( $title ) ) {
                        return Status::newFatal( 'noname' );
@@ -536,9 +543,9 @@ class LoginForm extends SpecialPage {
         * Actually add a user to the database.
         * Give it a User object that has been initialised with a name.
         *
-        * @param $u User object.
-        * @param $autocreate boolean -- true if this is an autocreation via auth plugin
-        * @return Status object, with the User object in the value member on success
+        * @param User $u
+        * @param bool $autocreate True if this is an autocreation via auth plugin
+        * @return Status Status object, with the User object in the value member on success
         * @private
         */
        function initUser( $u, $autocreate ) {
@@ -720,7 +727,7 @@ class LoginForm extends SpecialPage {
         * Increment the login attempt throttle hit count for the (username,current IP)
         * tuple unless the throttle was already reached.
         * @param string $username The user name
-        * @return Bool|Integer The integer hit count or True if it is already at the limit
+        * @return bool|int The integer hit count or True if it is already at the limit
         */
        public static function incLoginThrottle( $username ) {
                global $wgPasswordAttemptThrottle, $wgMemc, $wgRequest;
@@ -762,9 +769,9 @@ class LoginForm extends SpecialPage {
         * Attempt to automatically create a user on login. Only succeeds if there
         * is an external authentication method which allows it.
         *
-        * @param $user User
+        * @param User $user
         *
-        * @return integer Status code
+        * @return int Status code
         */
        function attemptAutoCreate( $user ) {
                global $wgAuth;
@@ -948,11 +955,11 @@ class LoginForm extends SpecialPage {
        }
 
        /**
-        * @param $u User object
-        * @param $throttle Boolean
-        * @param string $emailTitle message name of email title
-        * @param string $emailText message name of email text
-        * @return Status object
+        * @param User $u
+        * @param bool $throttle
+        * @param string $emailTitle Message name of email title
+        * @param string $emailText Message name of email text
+        * @return Status
         */
        function mailPasswordInternal( $u, $throttle = true, $emailTitle = 'passwordremindertitle',
                $emailText = 'passwordremindertext'
@@ -1037,9 +1044,9 @@ class LoginForm extends SpecialPage {
        /**
         * Display an "successful action" page.
         *
-        * @param string|Message $title page's title
-        * @param $msgname string
-        * @param $injected_html string
+        * @param string|Message $title Page's title
+        * @param string $msgname
+        * @param string $injected_html
         */
        private function displaySuccessfulAction( $title, $msgname, $injected_html ) {
                $out = $this->getOutput();
@@ -1058,7 +1065,7 @@ class LoginForm extends SpecialPage {
         * there is a block on them or their IP which prevents account creation.  Note that
         * User::isBlockedFromCreateAccount(), which gets this block, ignores the 'hardblock'
         * setting on blocks (bug 13611).
-        * @param $block Block the block causing this error
+        * @param Block $block The block causing this error
         * @throws ErrorPageError
         */
        function userBlockedMessage( Block $block ) {
@@ -1094,7 +1101,7 @@ class LoginForm extends SpecialPage {
         * Extensions can use this to reuse the "return to" logic after
         * inject steps (such as redirection) into the login process.
         *
-        * @param $type string, one of the following:
+        * @param string $type One of the following:
         *    - error: display a return to link ignoring $wgRedirectOnLogin
         *    - success: display a return to link using $wgRedirectOnLogin if needed
         *    - successredirect: send an HTTP redirect using $wgRedirectOnLogin if needed
@@ -1115,7 +1122,7 @@ class LoginForm extends SpecialPage {
        /**
         * Add a "return to" link or redirect to it.
         *
-        * @param $type string, one of the following:
+        * @param string $type One of the following:
         *    - error: display a return to link ignoring $wgRedirectOnLogin
         *    - success: display a return to link using $wgRedirectOnLogin if needed
         *    - successredirect: send an HTTP redirect using $wgRedirectOnLogin if needed
@@ -1344,7 +1351,7 @@ class LoginForm extends SpecialPage {
         * Whether the login/create account form should display a link to the
         * other form (in addition to whatever the skin provides).
         *
-        * @param $user User
+        * @param User $user
         * @return bool
         */
        private function showCreateOrLoginLink( &$user ) {
@@ -1375,7 +1382,7 @@ class LoginForm extends SpecialPage {
 
        /**
         * Get the login token from the current session
-        * @return Mixed
+        * @return mixed
         */
        public static function getLoginToken() {
                global $wgRequest;
@@ -1403,7 +1410,7 @@ class LoginForm extends SpecialPage {
 
        /**
         * Get the createaccount token from the current session
-        * @return Mixed
+        * @return mixed
         */
        public static function getCreateaccountToken() {
                global $wgRequest;
index 29266ca..8a5ba1d 100644 (file)
@@ -190,8 +190,8 @@ class UserrightsPage extends SpecialPage {
         * Save user groups changes in the database.
         * Data comes from the editUserGroupsForm() form function
         *
-        * @param string $username username to apply changes to.
-        * @param string $reason reason for group change
+        * @param string $username Username to apply changes to.
+        * @param string $reason Reason for group change
         * @param User|UserRightsProxy $user Target user object.
         * @return null
         */
@@ -278,6 +278,10 @@ class UserrightsPage extends SpecialPage {
 
        /**
         * Add a rights log entry for an action.
+        * @param User $user
+        * @param array $oldGroups
+        * @param array $newGroups
+        * @param array $reason
         */
        function addLogEntry( $user, $oldGroups, $newGroups, $reason ) {
                $logEntry = new ManualLogEntry( 'rights', 'rights' );
@@ -294,7 +298,7 @@ class UserrightsPage extends SpecialPage {
 
        /**
         * Edit user groups membership
-        * @param string $username name of the user.
+        * @param string $username Name of the user.
         */
        function editUserGroupsForm( $username ) {
                $status = $this->fetchUser( $username );
@@ -321,7 +325,7 @@ class UserrightsPage extends SpecialPage {
         *
         * Side effects: error output for invalid access
         * @param string $username
-        * @return Status object
+        * @return Status
         */
        public function fetchUser( $username ) {
                global $wgUserrightsInterwikiDelimiter;
@@ -396,7 +400,7 @@ class UserrightsPage extends SpecialPage {
         * Make a list of group names to be stored as parameter for log entries
         *
         * @deprecated since 1.21; use LogFormatter instead.
-        * @param $ids array
+        * @param array $ids
         * @return string
         */
        function makeGroupNameListForLog( $ids ) {
@@ -572,7 +576,7 @@ class UserrightsPage extends SpecialPage {
        /**
         * Format a link to a group description page
         *
-        * @param $group string
+        * @param string $group
         * @return string
         */
        private static function buildGroupLink( $group ) {
@@ -582,7 +586,7 @@ class UserrightsPage extends SpecialPage {
        /**
         * Format a link to a group member description page
         *
-        * @param $group string
+        * @param string $group
         * @return string
         */
        private static function buildGroupMemberLink( $group ) {
@@ -601,8 +605,8 @@ class UserrightsPage extends SpecialPage {
         * Adds a table with checkboxes where you can select what groups to add/remove
         *
         * @todo Just pass the username string?
-        * @param array $usergroups groups the user belongs to
-        * @param $user User a user object
+        * @param array $usergroups Groups the user belongs to
+        * @param User $user
         * @return string XHTML table element with checkboxes
         */
        private function groupCheckboxes( $usergroups, $user ) {
@@ -696,7 +700,7 @@ class UserrightsPage extends SpecialPage {
        }
 
        /**
-        * @param string $group the name of the group to check
+        * @param string $group The name of the group to check
         * @return bool Can we add the group?
         */
        private function canAdd( $group ) {
@@ -725,8 +729,8 @@ class UserrightsPage extends SpecialPage {
        /**
         * Show a rights log fragment for the specified user
         *
-        * @param $user User to show log for
-        * @param $output OutputPage to use
+        * @param User $user User to show log for
+        * @param OutputPage $output OutputPage to use
         */
        protected function showLogFragment( $user, $output ) {
                $rightsLogPage = new LogPage( 'rights' );
index dee44cd..41847dc 100644 (file)
@@ -165,7 +165,7 @@ class SpecialVersion extends SpecialPage {
        /**
         * Get the "MediaWiki is copyright 2001-20xx by lots of cool guys" text
         *
-        * @return String
+        * @return string
         */
        public static function getCopyrightAndAuthorList() {
                global $wgLang;
@@ -240,7 +240,7 @@ class SpecialVersion extends SpecialPage {
        /**
         * Return a string of the MediaWiki version with SVN revision if available.
         *
-        * @param $flags String
+        * @param string $flags
         * @return mixed
         */
        public static function getVersion( $flags = '' ) {
@@ -409,7 +409,7 @@ class SpecialVersion extends SpecialPage {
         *
         * @since 1.17
         *
-        * @param $type String
+        * @param string $type
         *
         * @return string
         */
@@ -530,8 +530,8 @@ class SpecialVersion extends SpecialPage {
         *
         * @since 1.17
         *
-        * @param $type String
-        * @param $message String
+        * @param string $type
+        * @param string $message
         *
         * @return string
         */
@@ -555,8 +555,8 @@ class SpecialVersion extends SpecialPage {
 
        /**
         * Callback to sort extensions by type.
-        * @param $a array
-        * @param $b array
+        * @param array $a
+        * @param array $b
         * @return int
         */
        function compare( $a, $b ) {
@@ -582,9 +582,9 @@ class SpecialVersion extends SpecialPage {
         *  - Description of extension (descriptionmsg or description)
         *  - List of authors (author) and link to a ((AUTHORS)|(CREDITS))(\.txt)? file if it exists
         *
-        * @param $extension Array
+        * @param array $extension
         *
-        * @return string raw HTML
+        * @return string Raw HTML
         */
        function getCreditsForExtension( array $extension ) {
                $out = $this->getOutput();
@@ -975,7 +975,7 @@ class SpecialVersion extends SpecialPage {
        /**
         * Convert an array or object to a string for display.
         *
-        * @param mixed $list will convert an array to string if given and return
+        * @param mixed $list Will convert an array to string if given and return
         *   the paramater unaltered otherwise
         *
         * @return mixed
@@ -1014,7 +1014,7 @@ class SpecialVersion extends SpecialPage {
         *        url                   The subversion URL of the directory
         *        repo-url              The base URL of the repository
         *        viewvc-url            A ViewVC URL pointing to the checked-out revision
-        * @param $dir string
+        * @param string $dir
         * @return array|bool
         */
        public static function getSvnInfo( $dir ) {
@@ -1087,7 +1087,7 @@ class SpecialVersion extends SpecialPage {
        /**
         * Retrieve the revision number of a Subversion working directory.
         *
-        * @param string $dir directory of the svn checkout
+        * @param string $dir Directory of the svn checkout
         *
         * @return int Revision number
         */
@@ -1104,8 +1104,8 @@ class SpecialVersion extends SpecialPage {
        }
 
        /**
-        * @param string $dir directory of the git checkout
-        * @return bool|String sha1 of commit HEAD points to
+        * @param string $dir Directory of the git checkout
+        * @return bool|string Sha1 of commit HEAD points to
         */
        public static function getGitHeadSha1( $dir ) {
                $repo = new GitInfo( $dir );
@@ -1113,6 +1113,15 @@ class SpecialVersion extends SpecialPage {
                return $repo->getHeadSHA1();
        }
 
+       /**
+        * @param string $dir Directory of the git checkout
+        * @return bool|string Branch currently checked out
+        */
+       public static function getGitCurrentBranch( $dir ) {
+               $repo = new GitInfo( $dir );
+               return $repo->getCurrentBranch();
+       }
+
        /**
         * Get the list of entry points and their URLs
         * @return string Wikitext
index 1345b76..490e81f 100644 (file)
@@ -50,6 +50,8 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                if ( $mode !== false ) {
                        if ( $mode === SpecialEditWatchlist::EDIT_RAW ) {
                                $title = SpecialPage::getTitleFor( 'EditWatchlist', 'raw' );
+                       } elseif ( $mode === SpecialEditWatchlist::EDIT_CLEAR ) {
+                               $title = SpecialPage::getTitleFor( 'EditWatchlist', 'clear' );
                        } else {
                                $title = SpecialPage::getTitleFor( 'EditWatchlist' );
                        }
@@ -120,7 +122,7 @@ class SpecialWatchlist extends ChangesListSpecialPage {
         * Maps old pre-1.23 request parameters Watchlist used to use (different from Recentchanges' ones)
         * to the current ones.
         *
-        * @param FormOptions $parameters
+        * @param FormOptions $opts
         * @return FormOptions
         */
        protected function fetchOptionsFromRequest( $opts ) {
@@ -577,7 +579,7 @@ class SpecialWatchlist extends ChangesListSpecialPage {
         * Count the number of items on a user's watchlist
         *
         * @param DatabaseBase $dbr A database connection
-        * @return Integer
+        * @return int
         */
        protected function countItems( $dbr ) {
                # Fetch the raw count
index 0587649..d980f79 100644 (file)
@@ -64,7 +64,7 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                $opts->validateIntBounds( 'limit', 0, 5000 );
 
                // Give precedence to subpage syntax
-               if ( isset( $par ) ) {
+               if ( $par !== null ) {
                        $opts->setValue( 'target', $par );
                }
 
@@ -265,11 +265,11 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                        $nt = Title::makeTitle( $row->page_namespace, $row->page_title );
 
                        if ( $row->rd_from && $level < 2 ) {
-                               $out->addHTML( $this->listItem( $row, $nt, true ) );
+                               $out->addHTML( $this->listItem( $row, $nt, $target, true ) );
                                $this->showIndirectLinks( $level + 1, $nt, $wgMaxRedirectLinksRetrieved );
                                $out->addHTML( Xml::closeElement( 'li' ) );
                        } else {
-                               $out->addHTML( $this->listItem( $row, $nt ) );
+                               $out->addHTML( $this->listItem( $row, $nt, $target ) );
                        }
                }
 
@@ -286,7 +286,7 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                return Xml::openElement( 'ul', ( $level ? array() : array( 'id' => 'mw-whatlinkshere-list' ) ) );
        }
 
-       protected function listItem( $row, $nt, $notClose = false ) {
+       protected function listItem( $row, $nt, $target, $notClose = false ) {
                $dirmark = $this->getLanguage()->getDirMark();
 
                # local message cache
@@ -326,6 +326,8 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                        $props[] = $msgcache['isimage'];
                }
 
+               wfRunHooks( 'WhatLinksHereProps', array( $row, $nt, $target, &$props ) );
+
                if ( count( $props ) ) {
                        $propsText = $this->msg( 'parentheses' )
                                ->rawParams( implode( $msgcache['semicolon-separator'], $props ) )->escaped();
index d5b8d8b..33b2400 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+// @codingStandardsIgnoreFile
 /**
  * Template used when there is no LocalSettings.php file.
  *
index d1aef1d..9118701 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+// @codingStandardsIgnoreFile
 /**
  * Html form for account creation (since 1.22 with VForm appearance).
  *
@@ -22,7 +23,6 @@
  */
 
 class UsercreateTemplate extends BaseTemplate {
-
        /**
         * Extensions (AntiSpoof and TitleBlacklist) call this in response to
         * UserCreateForm hook to add checkboxes to the create account form.
@@ -51,9 +51,6 @@ class UsercreateTemplate extends BaseTemplate {
                <div id="signupstart"><?php $this->msgWiki( 'signupstart' ); ?></div>
        <?php } ?>
        <div id="userloginForm">
-               <h2 class="createaccount-join">
-                       <?php $this->msg( $this->data['loggedin'] ? 'createacct-another-join' : 'createacct-join' ); ?>
-               </h2>
                <form name="userlogin2" id="userlogin2" class="mw-ui-vform" method="post" action="<?php $this->text( 'action' ); ?>">
                        <section class="mw-form-header">
                                <?php $this->html( 'header' ); /* extensions such as ConfirmEdit add form HTML here */ ?>
index 29908d7..0aad07d 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+// @codingStandardsIgnoreFile
 /**
  * Html form for user login (since 1.22 with VForm appearance).
  *
index 4b14a19..a8a5d75 100644 (file)
@@ -29,5 +29,4 @@
  * @author Daniel Kinzler
  */
 class MalformedTitleException extends Exception {
-
 }
index 62ed4c2..c593dca 100644 (file)
@@ -28,7 +28,6 @@
  * @see https://www.mediawiki.org/wiki/Requests_for_comment/TitleValue
  */
 class MediaWikiPageLinkRenderer implements PageLinkRenderer {
-
        /**
         * @var TitleFormatter
         */
@@ -108,6 +107,7 @@ class MediaWikiPageLinkRenderer implements PageLinkRenderer {
                // re-implement Linker to use a HtmlPageLinkRenderer.
                $title = Title::newFromTitleValue( $page );
                $link = Linker::link( $title, htmlspecialchars( $text ) );
+
                return $link;
        }
 
index 878f95d..d6c666a 100644 (file)
@@ -33,7 +33,6 @@
  * @see https://www.mediawiki.org/wiki/Requests_for_comment/TitleValue
  */
 class MediaWikiTitleCodec implements TitleFormatter, TitleParser {
-
        /**
         * @var Language
         */
@@ -54,7 +53,9 @@ class MediaWikiTitleCodec implements TitleFormatter, TitleParser {
         * @param GenderCache $genderCache the gender cache for generating gendered namespace names
         * @param string[]|string $localInterwikis
         */
-       public function __construct( Language $language, GenderCache $genderCache, $localInterwikis = array() ) {
+       public function __construct( Language $language, GenderCache $genderCache,
+               $localInterwikis = array()
+       ) {
                $this->language = $language;
                $this->genderCache = $genderCache;
                $this->localInterwikis = (array)$localInterwikis;
@@ -67,11 +68,12 @@ class MediaWikiTitleCodec implements TitleFormatter, TitleParser {
         * @param string $text
         *
         * @throws InvalidArgumentException if the namespace is invalid
-        * @return String
+        * @return string
         */
        public function getNamespaceName( $namespace, $text ) {
                if ( $this->language->needsGenderDistinction() &&
-                       MWNamespace::hasGenderDistinction( $namespace ) ) {
+                       MWNamespace::hasGenderDistinction( $namespace )
+               ) {
 
                        //NOTE: we are assuming here that the title text is a user name!
                        $gender = $this->genderCache->getGenderOf( $text, __METHOD__ );
@@ -120,8 +122,8 @@ class MediaWikiTitleCodec implements TitleFormatter, TitleParser {
         * Parses the given text and constructs a TitleValue. Normalization
         * is applied according to the rules appropriate for the form specified by $form.
         *
-        * @param string $text the text to parse
-        * @param int $defaultNamespace namespace to assume per default (usually NS_MAIN)
+        * @param string $text The text to parse
+        * @param int $defaultNamespace Namespace to assume per default (usually NS_MAIN)
         *
         * @throws MalformedTitleException
         * @return TitleValue
@@ -219,7 +221,11 @@ class MediaWikiTitleCodec implements TitleFormatter, TitleParser {
                # Note: use of the /u option on preg_replace here will cause
                # input with invalid UTF-8 sequences to be nullified out in PHP 5.2.x,
                # conveniently disabling them.
-               $dbkey = preg_replace( '/[ _\xA0\x{1680}\x{180E}\x{2000}-\x{200A}\x{2028}\x{2029}\x{202F}\x{205F}\x{3000}]+/u', '_', $dbkey );
+               $dbkey = preg_replace(
+                       '/[ _\xA0\x{1680}\x{180E}\x{2000}-\x{200A}\x{2028}\x{2029}\x{202F}\x{205F}\x{3000}]+/u',
+                       '_',
+                       $dbkey
+               );
                $dbkey = trim( $dbkey, '_' );
 
                if ( strpos( $dbkey, UTF8_REPLACEMENT ) !== false ) {
@@ -242,7 +248,6 @@ class MediaWikiTitleCodec implements TitleFormatter, TitleParser {
                }
 
                # Namespace or interwiki prefix
-               $firstPass = true;
                $prefixRegexp = "/^(.+?)_*:_*(.*)$/S";
                do {
                        $m = array();
@@ -264,13 +269,6 @@ class MediaWikiTitleCodec implements TitleFormatter, TitleParser {
                                                }
                                        }
                                } elseif ( Interwiki::isValidInterwiki( $p ) ) {
-                                       if ( !$firstPass ) {
-                                               //TODO: get rid of global state!
-                                               # Can't make a local interwiki link to an interwiki link.
-                                               # That's just crazy!
-                                               throw new MalformedTitleException( 'Interwiki prefix found in title: ' . $text );
-                                       }
-
                                        # Interwiki link
                                        $dbkey = $m[2];
                                        $parts['interwiki'] = $this->language->lc( $p );
@@ -283,7 +281,6 @@ class MediaWikiTitleCodec implements TitleFormatter, TitleParser {
                                                                throw new MalformedTitleException( 'Local interwiki with empty title: ' . $text );
                                                        }
                                                        $parts['interwiki'] = '';
-                                                       $firstPass = false;
 
                                                        # Do another namespace split...
                                                        continue 2;
@@ -385,7 +382,7 @@ class MediaWikiTitleCodec implements TitleFormatter, TitleParser {
 
                # Fill fields
                $parts['dbkey'] = $dbkey;
+
                return $parts;
        }
-
 }
index 240a961..a277594 100644 (file)
@@ -31,7 +31,6 @@
  * @see https://www.mediawiki.org/wiki/Requests_for_comment/TitleValue
  */
 interface PageLinkRenderer {
-
        /**
         * Returns the URL for the given page.
         *
@@ -65,5 +64,4 @@ interface PageLinkRenderer {
         * @return string
         */
        public function renderWikitextLink( TitleValue $page, $text = null );
-
 }
index f3822b6..ea58b1e 100644 (file)
@@ -31,7 +31,6 @@
  * @see https://www.mediawiki.org/wiki/Requests_for_comment/TitleValue
  */
 interface TitleFormatter {
-
        /**
         * Returns the title formatted for display.
         * Per default, this includes the namespace but not the fragment.
@@ -85,7 +84,7 @@ interface TitleFormatter {
         * @param string $text
         *
         * @throws InvalidArgumentException
-        * @return String
+        * @return string
         */
        public function getNamespaceName( $namespace, $text );
 }
index b3ef479..d548663 100644 (file)
@@ -31,7 +31,6 @@
  * @see https://www.mediawiki.org/wiki/Requests_for_comment/TitleValue
  */
 interface TitleParser {
-
        /**
         * Parses the given text and constructs a TitleValue. Normalization
         * is applied according to the rules appropriate for the form specified by $form.
index 7a865eb..73e1dc2 100644 (file)
@@ -34,7 +34,6 @@
  * @see https://www.mediawiki.org/wiki/Requests_for_comment/TitleValue
  */
 class TitleValue {
-
        /**
         * @var int
         */
@@ -59,10 +58,10 @@ class TitleValue {
         * un-normalized text when constructing TitleValues. For constructing a TitleValue from
         * user input or external sources, use a TitleParser.
         *
-        * @param $namespace int The namespace ID. This is not validated.
-        * @param $dbkey string The page title in valid DBkey form. No normalization is applied.
-        * @param $fragment string The fragment title. Use '' to represent the whole page.
-        *        No validation or normalization is applied.
+        * @param int $namespace The namespace ID. This is not validated.
+        * @param string $dbkey The page title in valid DBkey form. No normalization is applied.
+        * @param string $fragment The fragment title. Use '' to represent the whole page.
+        *   No validation or normalization is applied.
         *
         * @throws InvalidArgumentException
         */
@@ -153,7 +152,7 @@ class TitleValue {
        public function __toString() {
                $name = $this->namespace . ':' . $this->dbkey;
 
-               if ( $this->fragment !== '' )  {
+               if ( $this->fragment !== '' ) {
                        $name .= '#' . $this->fragment;
                }
 
index b14a284..b32780f 100644 (file)
@@ -44,7 +44,13 @@ abstract class UploadBase {
        protected $mBlackListedExtensions;
        protected $mJavaDetected, $mSVGNSError;
 
-       protected static $safeXmlEncodings = array( 'UTF-8', 'ISO-8859-1', 'ISO-8859-2', 'UTF-16', 'UTF-32' );
+       protected static $safeXmlEncodings = array(
+               'UTF-8',
+               'ISO-8859-1',
+               'ISO-8859-2',
+               'UTF-16',
+               'UTF-32'
+       );
 
        const SUCCESS = 0;
        const OK = 0;
@@ -66,7 +72,7 @@ abstract class UploadBase {
        const SESSION_STATUS_KEY = 'wsUploadStatusData';
 
        /**
-        * @param $error int
+        * @param int $error
         * @return string
         */
        public function getVerificationErrorCode( $error ) {
@@ -111,7 +117,7 @@ abstract class UploadBase {
         * identifying the missing permission.
         * Can be overridden by subclasses.
         *
-        * @param $user User
+        * @param User $user
         * @return bool
         */
        public static function isAllowed( $user ) {
@@ -120,18 +126,19 @@ abstract class UploadBase {
                                return $permission;
                        }
                }
+
                return true;
        }
 
        // Upload handlers. Should probably just be a global.
-       static $uploadHandlers = array( 'Stash', 'File', 'Url' );
+       private static $uploadHandlers = array( 'Stash', 'File', 'Url' );
 
        /**
         * Create a form of UploadBase depending on wpSourceType and initializes it
         *
-        * @param $request WebRequest
-        * @param $type
-        * @return null
+        * @param WebRequest $request
+        * @param string|null $type
+        * @return null|UploadBase
         */
        public static function createFromRequest( &$request, $type = null ) {
                $type = $type ? $type : $request->getVal( 'wpSourceType', 'File' );
@@ -167,19 +174,21 @@ abstract class UploadBase {
                $handler = new $className;
 
                $handler->initializeFromRequest( $request );
+
                return $handler;
        }
 
        /**
         * Check whether a request if valid for this handler
-        * @param $request
+        * @param WebRequest $request
         * @return bool
         */
        public static function isValidRequest( $request ) {
                return false;
        }
 
-       public function __construct() {}
+       public function __construct() {
+       }
 
        /**
         * Returns the upload type. Should be overridden by child classes
@@ -193,9 +202,9 @@ abstract class UploadBase {
 
        /**
         * Initialize the path information
-        * @param string $name the desired destination name
-        * @param string $tempPath the temporary path
-        * @param int $fileSize the file size
+        * @param string $name The desired destination name
+        * @param string $tempPath The temporary path
+        * @param int $fileSize The file size
         * @param bool $removeTempFile (false) remove the temporary file?
         * @throws MWException
         */
@@ -211,6 +220,8 @@ abstract class UploadBase {
 
        /**
         * Initialize from a WebRequest. Override this in a subclass.
+        *
+        * @param WebRequest $request
         */
        abstract public function initializeFromRequest( &$request );
 
@@ -232,7 +243,7 @@ abstract class UploadBase {
 
        /**
         * Return the file size
-        * @return integer
+        * @return int
         */
        public function getFileSize() {
                return $this->mFileSize;
@@ -247,15 +258,16 @@ abstract class UploadBase {
        }
 
        /**
-        * @param string $srcPath the source path
-        * @return string|bool the real path if it was a virtual URL Returns false on failure
+        * @param string $srcPath The source path
+        * @return string|bool The real path if it was a virtual URL Returns false on failure
         */
        function getRealPath( $srcPath ) {
                wfProfileIn( __METHOD__ );
                $repo = RepoGroup::singleton()->getLocalRepo();
                if ( $repo->isVirtualUrl( $srcPath ) ) {
-                       // @todo just make uploads work with storage paths
-                       // UploadFromStash loads files via virtual URLs
+                       /** @todo Just make uploads work with storage paths UploadFromStash
+                        *  loads files via virtual URLs.
+                        */
                        $tmpFile = $repo->getLocalCopy( $srcPath );
                        if ( $tmpFile ) {
                                $tmpFile->bind( $this ); // keep alive with $this
@@ -265,6 +277,7 @@ abstract class UploadBase {
                        $path = $srcPath;
                }
                wfProfileOut( __METHOD__ );
+
                return $path;
        }
 
@@ -280,6 +293,7 @@ abstract class UploadBase {
                 */
                if ( $this->isEmptyFile() ) {
                        wfProfileOut( __METHOD__ );
+
                        return array( 'status' => self::EMPTY_FILE );
                }
 
@@ -289,6 +303,7 @@ abstract class UploadBase {
                $maxSize = self::getMaxUploadSize( $this->getSourceType() );
                if ( $this->mFileSize > $maxSize ) {
                        wfProfileOut( __METHOD__ );
+
                        return array(
                                'status' => self::FILE_TOO_LARGE,
                                'max' => $maxSize,
@@ -303,6 +318,7 @@ abstract class UploadBase {
                $verification = $this->verifyFile();
                if ( $verification !== true ) {
                        wfProfileOut( __METHOD__ );
+
                        return array(
                                'status' => self::VERIFICATION_ERROR,
                                'details' => $verification
@@ -315,6 +331,7 @@ abstract class UploadBase {
                $result = $this->validateName();
                if ( $result !== true ) {
                        wfProfileOut( __METHOD__ );
+
                        return $result;
                }
 
@@ -323,19 +340,21 @@ abstract class UploadBase {
                        array( $this->mDestName, $this->mTempPath, &$error ) )
                ) {
                        wfProfileOut( __METHOD__ );
+
                        return array( 'status' => self::HOOK_ABORTED, 'error' => $error );
                }
 
                wfProfileOut( __METHOD__ );
+
                return array( 'status' => self::OK );
        }
 
        /**
         * Verify that the name is valid and, if necessary, that we can overwrite
         *
-        * @return mixed true if valid, otherwise and array with 'status'
+        * @return mixed True if valid, otherwise and array with 'status'
         * and other keys
-        **/
+        */
        public function validateName() {
                $nt = $this->getTitle();
                if ( is_null( $nt ) ) {
@@ -349,6 +368,7 @@ abstract class UploadBase {
                                        $result['blacklistedExt'] = $this->mBlackListedExtensions;
                                }
                        }
+
                        return $result;
                }
                $this->mDestName = $this->getLocalFile()->getName();
@@ -361,8 +381,8 @@ abstract class UploadBase {
         *
         * @note Only checks that it is not an evil mime. The does it have
         *  correct extension given its mime type check is in verifyFile.
-        * @param string $mime representing the mime
-        * @return mixed true if the file is verified, an array otherwise
+        * @param string $mime Representing the mime
+        * @return mixed True if the file is verified, an array otherwise
         */
        protected function verifyMimeType( $mime ) {
                global $wgVerifyMimeType;
@@ -372,6 +392,7 @@ abstract class UploadBase {
                        global $wgMimeTypeBlacklist;
                        if ( $this->checkFileExtension( $mime, $wgMimeTypeBlacklist ) ) {
                                wfProfileOut( __METHOD__ );
+
                                return array( 'filetype-badmime', $mime );
                        }
 
@@ -386,19 +407,21 @@ abstract class UploadBase {
                        foreach ( $ieTypes as $ieType ) {
                                if ( $this->checkFileExtension( $ieType, $wgMimeTypeBlacklist ) ) {
                                        wfProfileOut( __METHOD__ );
+
                                        return array( 'filetype-bad-ie-mime', $ieType );
                                }
                        }
                }
 
                wfProfileOut( __METHOD__ );
+
                return true;
        }
 
        /**
         * Verifies that it's ok to include the uploaded file
         *
-        * @return mixed true of the file is verified, array otherwise.
+        * @return mixed True of the file is verified, array otherwise.
         */
        protected function verifyFile() {
                global $wgVerifyMimeType;
@@ -407,6 +430,7 @@ abstract class UploadBase {
                $status = $this->verifyPartialFile();
                if ( $status !== true ) {
                        wfProfileOut( __METHOD__ );
+
                        return $status;
                }
 
@@ -417,6 +441,7 @@ abstract class UploadBase {
                        # XXX: Missing extension will be caught by validateName() via getTitle()
                        if ( $this->mFinalExtension != '' && !$this->verifyExtension( $mime, $this->mFinalExtension ) ) {
                                wfProfileOut( __METHOD__ );
+
                                return array( 'filetype-mime-mismatch', $this->mFinalExtension, $mime );
                        }
                }
@@ -427,6 +452,7 @@ abstract class UploadBase {
                        if ( !$handlerStatus->isOK() ) {
                                $errors = $handlerStatus->getErrorsArray();
                                wfProfileOut( __METHOD__ );
+
                                return reset( $errors );
                        }
                }
@@ -434,11 +460,13 @@ abstract class UploadBase {
                wfRunHooks( 'UploadVerifyFile', array( $this, $mime, &$status ) );
                if ( $status !== true ) {
                        wfProfileOut( __METHOD__ );
+
                        return $status;
                }
 
                wfDebug( __METHOD__ . ": all clear; passing.\n" );
                wfProfileOut( __METHOD__ );
+
                return true;
        }
 
@@ -448,7 +476,7 @@ abstract class UploadBase {
         * Runs the blacklist checks, but not any checks that may
         * assume the entire file is present.
         *
-        * @return Mixed true for valid or array with error message key.
+        * @return mixed True for valid or array with error message key.
         */
        protected function verifyPartialFile() {
                global $wgAllowJavaUploads, $wgDisableUploadScriptChecks;
@@ -464,6 +492,7 @@ abstract class UploadBase {
                $status = $this->verifyMimeType( $mime );
                if ( $status !== true ) {
                        wfProfileOut( __METHOD__ );
+
                        return $status;
                }
 
@@ -471,12 +500,14 @@ abstract class UploadBase {
                if ( !$wgDisableUploadScriptChecks ) {
                        if ( self::detectScript( $this->mTempPath, $mime, $this->mFinalExtension ) ) {
                                wfProfileOut( __METHOD__ );
+
                                return array( 'uploadscripted' );
                        }
                        if ( $this->mFinalExtension == 'svg' || $mime == 'image/svg+xml' ) {
                                $svgStatus = $this->detectScriptInSvg( $this->mTempPath );
                                if ( $svgStatus !== false ) {
                                        wfProfileOut( __METHOD__ );
+
                                        return $svgStatus;
                                }
                        }
@@ -493,11 +524,13 @@ abstract class UploadBase {
                                $error = reset( $errors );
                                if ( $error[0] !== 'zip-wrong-format' ) {
                                        wfProfileOut( __METHOD__ );
+
                                        return $error;
                                }
                        }
                        if ( $this->mJavaDetected ) {
                                wfProfileOut( __METHOD__ );
+
                                return array( 'uploadjava' );
                        }
                }
@@ -506,15 +539,19 @@ abstract class UploadBase {
                $virus = $this->detectVirus( $this->mTempPath );
                if ( $virus ) {
                        wfProfileOut( __METHOD__ );
+
                        return array( 'uploadvirus', $virus );
                }
 
                wfProfileOut( __METHOD__ );
+
                return true;
        }
 
        /**
         * Callback for ZipDirectoryReader to detect Java class files.
+        *
+        * @param array $entry
         */
        function zipEntryCallback( $entry ) {
                $names = array( $entry['name'] );
@@ -537,11 +574,13 @@ abstract class UploadBase {
        }
 
        /**
-        * Alias for verifyTitlePermissions. The function was originally 'verifyPermissions'
-        * but that suggests it's checking the user, when it's really checking the title + user combination.
-        * @param $user User object to verify the permissions against
+        * Alias for verifyTitlePermissions. The function was originally
+        * 'verifyPermissions', but that suggests it's checking the user, when it's
+        * really checking the title + user combination.
+        *
+        * @param User $user User object to verify the permissions against
         * @return mixed An array as returned by getUserPermissionsErrors or true
-        *               in case the user has proper permissions.
+        *   in case the user has proper permissions.
         */
        public function verifyPermissions( $user ) {
                return $this->verifyTitlePermissions( $user );
@@ -554,9 +593,9 @@ abstract class UploadBase {
         * isAllowed() should be called as well for generic is-user-blocked or
         * can-user-upload checking.
         *
-        * @param $user User object to verify the permissions against
+        * @param User $user object to verify the permissions against
         * @return mixed An array as returned by getUserPermissionsErrors or true
-        *               in case the user has proper permissions.
+        *   in case the user has proper permissions.
         */
        public function verifyTitlePermissions( $user ) {
                /**
@@ -577,6 +616,7 @@ abstract class UploadBase {
                if ( $permErrors || $permErrorsUpload || $permErrorsCreate ) {
                        $permErrors = array_merge( $permErrors, wfArrayDiff2( $permErrorsUpload, $permErrors ) );
                        $permErrors = array_merge( $permErrors, wfArrayDiff2( $permErrorsCreate, $permErrors ) );
+
                        return $permErrors;
                }
 
@@ -593,7 +633,7 @@ abstract class UploadBase {
         *
         * This should not assume that mTempPath is set.
         *
-        * @return Array of warnings
+        * @return array Array of warnings
         */
        public function checkWarnings() {
                global $wgLang;
@@ -614,7 +654,8 @@ abstract class UploadBase {
                if ( $this->mDesiredDestName != $filename && $comparableName != $filename ) {
                        $warnings['badfilename'] = $filename;
                        // Debugging for bug 62241
-                       wfDebugLog( 'upload', "Filename: '$filename', mDesiredDestName: '$this->mDesiredDestName', comparableName: '$comparableName'" );
+                       wfDebugLog( 'upload', "Filename: '$filename', mDesiredDestName: "
+                               . "'$this->mDesiredDestName', comparableName: '$comparableName'" );
                }
 
                // Check whether the file extension is on the unwanted list
@@ -666,6 +707,7 @@ abstract class UploadBase {
                }
 
                wfProfileOut( __METHOD__ );
+
                return $warnings;
        }
 
@@ -673,12 +715,12 @@ abstract class UploadBase {
         * Really perform the upload. Stores the file in the local repo, watches
         * if necessary and runs the UploadComplete hook.
         *
-        * @param $comment
-        * @param $pageText
-        * @param $watch
-        * @param $user User
+        * @param string $comment
+        * @param string $pageText
+        * @param bool $watch
+        * @param User $user
         *
-        * @return Status indicating the whether the upload succeeded.
+        * @return Status Indicating the whether the upload succeeded.
         */
        public function performUpload( $comment, $pageText, $watch, $user ) {
                wfProfileIn( __METHOD__ );
@@ -695,12 +737,17 @@ abstract class UploadBase {
 
                if ( $status->isGood() ) {
                        if ( $watch ) {
-                               WatchAction::doWatch( $this->getLocalFile()->getTitle(), $user, WatchedItem::IGNORE_USER_RIGHTS );
+                               WatchAction::doWatch(
+                                       $this->getLocalFile()->getTitle(),
+                                       $user,
+                                       WatchedItem::IGNORE_USER_RIGHTS
+                               );
                        }
                        wfRunHooks( 'UploadComplete', array( &$this ) );
                }
 
                wfProfileOut( __METHOD__ );
+
                return $status;
        }
 
@@ -729,6 +776,7 @@ abstract class UploadBase {
                if ( strlen( $this->mFilteredName ) > 240 ) {
                        $this->mTitleError = self::FILENAME_TOO_LONG;
                        $this->mTitle = null;
+
                        return $this->mTitle;
                }
 
@@ -743,6 +791,7 @@ abstract class UploadBase {
                if ( is_null( $nt ) ) {
                        $this->mTitleError = self::ILLEGAL_FILENAME;
                        $this->mTitle = null;
+
                        return $this->mTitle;
                }
                $this->mFilteredName = $nt->getDBkey();
@@ -785,27 +834,34 @@ abstract class UploadBase {
                if ( $this->mFinalExtension == '' ) {
                        $this->mTitleError = self::FILETYPE_MISSING;
                        $this->mTitle = null;
+
                        return $this->mTitle;
                } elseif ( $blackListedExtensions ||
-                               ( $wgCheckFileExtensions && $wgStrictFileExtensions &&
-                                       !$this->checkFileExtension( $this->mFinalExtension, $wgFileExtensions ) ) ) {
+                       ( $wgCheckFileExtensions && $wgStrictFileExtensions &&
+                               !$this->checkFileExtension( $this->mFinalExtension, $wgFileExtensions ) )
+               ) {
                        $this->mBlackListedExtensions = $blackListedExtensions;
                        $this->mTitleError = self::FILETYPE_BADTYPE;
                        $this->mTitle = null;
+
                        return $this->mTitle;
                }
 
-               // Windows may be broken with special characters, see bug XXX
-               if ( wfIsWindows() && !preg_match( '/^[\x0-\x7f]*$/', $nt->getText() ) ) {
+               // Windows may be broken with special characters, see bug 1780
+               if ( !preg_match( '/^[\x0-\x7f]*$/', $nt->getText() )
+                       && !RepoGroup::singleton()->getLocalRepo()->backendSupportsUnicodePaths()
+               ) {
                        $this->mTitleError = self::WINDOWS_NONASCII_FILENAME;
                        $this->mTitle = null;
+
                        return $this->mTitle;
                }
 
                # If there was more than one "extension", reassemble the base
                # filename to prevent bogus complaints about length
                if ( count( $ext ) > 1 ) {
-                       for ( $i = 0; $i < count( $ext ) - 1; $i++ ) {
+                       $iterations = count( $ext ) - 1;
+                       for ( $i = 0; $i < $iterations; $i++ ) {
                                $partname .= '.' . $ext[$i];
                        }
                }
@@ -813,10 +869,12 @@ abstract class UploadBase {
                if ( strlen( $partname ) < 1 ) {
                        $this->mTitleError = self::MIN_LENGTH_PARTNAME;
                        $this->mTitle = null;
+
                        return $this->mTitle;
                }
 
                $this->mTitle = $nt;
+
                return $this->mTitle;
        }
 
@@ -830,20 +888,24 @@ abstract class UploadBase {
                        $nt = $this->getTitle();
                        $this->mLocalFile = is_null( $nt ) ? null : wfLocalFile( $nt );
                }
+
                return $this->mLocalFile;
        }
 
        /**
-        * If the user does not supply all necessary information in the first upload form submission (either by accident or
-        * by design) then we may want to stash the file temporarily, get more information, and publish the file later.
+        * If the user does not supply all necessary information in the first upload
+        * form submission (either by accident or by design) then we may want to
+        * stash the file temporarily, get more information, and publish the file
+        * later.
         *
-        * This method will stash a file in a temporary directory for later processing, and save the necessary descriptive info
-        * into the database.
-        * This method returns the file object, which also has a 'fileKey' property which can be passed through a form or
-        * API request to find this stashed file again.
+        * This method will stash a file in a temporary directory for later
+        * processing, and save the necessary descriptive info into the database.
+        * This method returns the file object, which also has a 'fileKey' property
+        * which can be passed through a form or API request to find this stashed
+        * file again.
         *
-        * @param $user User
-        * @return UploadStashFile stashed file
+        * @param User $user
+        * @return UploadStashFile Stashed file
         */
        public function stashFile( User $user = null ) {
                // was stashSessionFile
@@ -854,13 +916,15 @@ abstract class UploadBase {
                $this->mLocalFile = $file;
 
                wfProfileOut( __METHOD__ );
+
                return $file;
        }
 
        /**
-        * Stash a file in a temporary directory, returning a key which can be used to find the file again. See stashFile().
+        * Stash a file in a temporary directory, returning a key which can be used
+        * to find the file again. See stashFile().
         *
-        * @return String: file key
+        * @return string File key
         */
        public function stashFileGetKey() {
                return $this->stashFile()->getFileKey();
@@ -869,7 +933,7 @@ abstract class UploadBase {
        /**
         * alias for stashFileGetKey, for backwards compatibility
         *
-        * @return String: file key
+        * @return string File key
         */
        public function stashSession() {
                return $this->stashFileGetKey();
@@ -896,12 +960,13 @@ abstract class UploadBase {
         * earlier pseudo-'extensions' to determine type and execute
         * scripts, so the blacklist needs to check them all.
         *
-        * @param $filename string
+        * @param string $filename
         * @return array
         */
        public static function splitExtensions( $filename ) {
                $bits = explode( '.', $filename );
                $basename = array_shift( $bits );
+
                return array( $basename, $bits );
        }
 
@@ -909,9 +974,9 @@ abstract class UploadBase {
         * Perform case-insensitive match against a list of file extensions.
         * Returns true if the extension is in the list.
         *
-        * @param $ext String
-        * @param $list Array
-        * @return Boolean
+        * @param string $ext
+        * @param array $list
+        * @return bool
         */
        public static function checkFileExtension( $ext, $list ) {
                return in_array( strtolower( $ext ), $list );
@@ -921,9 +986,9 @@ abstract class UploadBase {
         * Perform case-insensitive match against a list of file extensions.
         * Returns an array of matching extensions.
         *
-        * @param $ext Array
-        * @param $list Array
-        * @return Boolean
+        * @param array $ext
+        * @param array $list
+        * @return bool
         */
        public static function checkFileExtensionList( $ext, $list ) {
                return array_intersect( array_map( 'strtolower', $ext ), $list );
@@ -932,9 +997,9 @@ abstract class UploadBase {
        /**
         * Checks if the mime type of the uploaded file matches the file extension.
         *
-        * @param string $mime the mime type of the uploaded file
-        * @param string $extension the filename extension that the file is to be served with
-        * @return Boolean
+        * @param string $mime The mime type of the uploaded file
+        * @param string $extension The filename extension that the file is to be served with
+        * @return bool
         */
        public static function verifyExtension( $mime, $extension ) {
                $magic = MimeMagic::singleton();
@@ -943,10 +1008,12 @@ abstract class UploadBase {
                        if ( !$magic->isRecognizableExtension( $extension ) ) {
                                wfDebug( __METHOD__ . ": passing file with unknown detected mime type; " .
                                        "unrecognized extension '$extension', can't verify\n" );
+
                                return true;
                        } else {
                                wfDebug( __METHOD__ . ": rejecting file with unknown detected mime type; " .
                                        "recognized extension '$extension', so probably invalid file\n" );
+
                                return false;
                        }
                }
@@ -956,19 +1023,22 @@ abstract class UploadBase {
                if ( $match === null ) {
                        if ( $magic->getTypesForExtension( $extension ) !== null ) {
                                wfDebug( __METHOD__ . ": No extension known for $mime, but we know a mime for $extension\n" );
+
                                return false;
                        } else {
                                wfDebug( __METHOD__ . ": no file extension known for mime type $mime, passing file\n" );
+
                                return true;
                        }
                } elseif ( $match === true ) {
                        wfDebug( __METHOD__ . ": mime type $mime matches extension $extension, passing file\n" );
 
-                       #TODO: if it's a bitmap, make sure PHP or ImageMagic resp. can handle it!
+                       /** @todo If it's a bitmap, make sure PHP or ImageMagick resp. can handle it! */
                        return true;
-
                } else {
-                       wfDebug( __METHOD__ . ": mime type $mime mismatches file extension $extension, rejecting file\n" );
+                       wfDebug( __METHOD__
+                               . ": mime type $mime mismatches file extension $extension, rejecting file\n" );
+
                        return false;
                }
        }
@@ -979,10 +1049,10 @@ abstract class UploadBase {
         * potentially harmful. The present implementation will produce false
         * positives in some situations.
         *
-        * @param string $file pathname to the temporary upload file
-        * @param string $mime the mime type of the file
-        * @param string $extension the extension of the file
-        * @return Boolean: true if the file contains something looking like embedded scripts
+        * @param string $file Pathname to the temporary upload file
+        * @param string $mime The mime type of the file
+        * @param string $extension The extension of the file
+        * @return bool True if the file contains something looking like embedded scripts
         */
        public static function detectScript( $file, $mime, $extension ) {
                global $wgAllowTitlesInSVG;
@@ -1003,6 +1073,7 @@ abstract class UploadBase {
 
                if ( !$chunk ) {
                        wfProfileOut( __METHOD__ );
+
                        return false;
                }
 
@@ -1021,12 +1092,13 @@ abstract class UploadBase {
 
                $chunk = trim( $chunk );
 
-               # @todo FIXME: Convert from UTF-16 if necessary!
+               /** @todo FIXME: Convert from UTF-16 if necessary! */
                wfDebug( __METHOD__ . ": checking for embedded scripts and HTML stuff\n" );
 
                # check for HTML doctype
                if ( preg_match( "/<!DOCTYPE *X?HTML/i", $chunk ) ) {
                        wfProfileOut( __METHOD__ );
+
                        return true;
                }
 
@@ -1035,6 +1107,7 @@ abstract class UploadBase {
                if ( $extension == 'svg' || strpos( $mime, 'image/svg' ) === 0 ) {
                        if ( self::checkXMLEncodingMissmatch( $file ) ) {
                                wfProfileOut( __METHOD__ );
+
                                return true;
                        }
                }
@@ -1058,7 +1131,7 @@ abstract class UploadBase {
                        '<a href',
                        '<body',
                        '<head',
-                       '<html',   #also in safari
+                       '<html', #also in safari
                        '<img',
                        '<pre',
                        '<script', #also in safari
@@ -1073,6 +1146,7 @@ abstract class UploadBase {
                        if ( false !== strpos( $chunk, $tag ) ) {
                                wfDebug( __METHOD__ . ": found something that may make it be mistaken for html: $tag\n" );
                                wfProfileOut( __METHOD__ );
+
                                return true;
                        }
                }
@@ -1088,6 +1162,7 @@ abstract class UploadBase {
                if ( preg_match( '!type\s*=\s*[\'"]?\s*(?:\w*/)?(?:ecma|java)!sim', $chunk ) ) {
                        wfDebug( __METHOD__ . ": found script types\n" );
                        wfProfileOut( __METHOD__ );
+
                        return true;
                }
 
@@ -1095,6 +1170,7 @@ abstract class UploadBase {
                if ( preg_match( '!(?:href|src|data)\s*=\s*[\'"]?\s*(?:ecma|java)script:!sim', $chunk ) ) {
                        wfDebug( __METHOD__ . ": found html-style script urls\n" );
                        wfProfileOut( __METHOD__ );
+
                        return true;
                }
 
@@ -1102,11 +1178,13 @@ abstract class UploadBase {
                if ( preg_match( '!url\s*\(\s*[\'"]?\s*(?:ecma|java)script:!sim', $chunk ) ) {
                        wfDebug( __METHOD__ . ": found css-style script urls\n" );
                        wfProfileOut( __METHOD__ );
+
                        return true;
                }
 
                wfDebug( __METHOD__ . ": no scripts found\n" );
                wfProfileOut( __METHOD__ );
+
                return false;
        }
 
@@ -1114,8 +1192,8 @@ abstract class UploadBase {
         * Check a whitelist of xml encodings that are known not to be interpreted differently
         * by the server's xml parser (expat) and some common browsers.
         *
-        * @param string $file pathname to the temporary upload file
-        * @return Boolean: true if the file contains an encoding that could be misinterpreted
+        * @param string $file Pathname to the temporary upload file
+        * @return bool True if the file contains an encoding that could be misinterpreted
         */
        public static function checkXMLEncodingMissmatch( $file ) {
                global $wgSVGMetadataCutoff;
@@ -1127,16 +1205,19 @@ abstract class UploadBase {
                                && !in_array( strtoupper( $encMatch[1] ), self::$safeXmlEncodings )
                        ) {
                                wfDebug( __METHOD__ . ": Found unsafe XML encoding '{$encMatch[1]}'\n" );
+
                                return true;
                        }
                } elseif ( preg_match( "!<\?xml\b!si", $contents ) ) {
                        // Start of XML declaration without an end in the first $wgSVGMetadataCutoff
                        // bytes. There shouldn't be a legitimate reason for this to happen.
                        wfDebug( __METHOD__ . ": Unmatched XML declaration start\n" );
+
                        return true;
                } elseif ( substr( $contents, 0, 4 ) == "\x4C\x6F\xA7\x94" ) {
                        // EBCDIC encoded XML
                        wfDebug( __METHOD__ . ": EBCDIC Encoded XML\n" );
+
                        return true;
                }
 
@@ -1147,17 +1228,19 @@ abstract class UploadBase {
                        wfSuppressWarnings();
                        $str = iconv( $encoding, 'UTF-8', $contents );
                        wfRestoreWarnings();
-                       if ( $str != '' && preg_match( "!<\?xml\b(.*?)\?>!si", $str, $matches ) ) {
+                       if ( $str != '' && preg_match( "!<\?xml\b(.*?)\?>!si", $str, $matches ) ) {
                                if ( preg_match( $encodingRegex, $matches[1], $encMatch )
                                        && !in_array( strtoupper( $encMatch[1] ), self::$safeXmlEncodings )
                                ) {
                                        wfDebug( __METHOD__ . ": Found unsafe XML encoding '{$encMatch[1]}'\n" );
+
                                        return true;
                                }
                        } elseif ( $str != '' && preg_match( "!<\?xml\b!si", $str ) ) {
                                // Start of XML declaration without an end in the first $wgSVGMetadataCutoff
                                // bytes. There shouldn't be a legitimate reason for this to happen.
                                wfDebug( __METHOD__ . ": Unmatched XML declaration start\n" );
+
                                return true;
                        }
                }
@@ -1166,8 +1249,8 @@ abstract class UploadBase {
        }
 
        /**
-        * @param $filename string
-        * @return mixed false of the file is verified (does not contain scripts), array otherwise.
+        * @param string $filename
+        * @return mixed False of the file is verified (does not contain scripts), array otherwise.
         */
        protected function detectScriptInSvg( $filename ) {
                $this->mSVGNSError = false;
@@ -1184,15 +1267,17 @@ abstract class UploadBase {
                        if ( $this->mSVGNSError ) {
                                return array( 'uploadscriptednamespace', $this->mSVGNSError );
                        }
+
                        return array( 'uploadscripted' );
                }
+
                return false;
        }
 
        /**
         * Callback to filter SVG Processing Instructions.
-        * @param $target string processing instruction name
-        * @param $data string processing instruction attribute and value
+        * @param string $target processing instruction name
+        * @param string $data processing instruction attribute and value
         * @return bool (true if the filter identified something bad)
         */
        public static function checkSvgPICallback( $target, $data ) {
@@ -1200,13 +1285,14 @@ abstract class UploadBase {
                if ( preg_match( '/xml-stylesheet/i', $target ) ) {
                        return true;
                }
+
                return false;
        }
 
        /**
         * @todo Replace this with a whitelist filter!
-        * @param $element string
-        * @param $attribs array
+        * @param string $element
+        * @param array $attribs
         * @return bool
         */
        public function checkSvgScriptCallback( $element, $attribs ) {
@@ -1251,8 +1337,9 @@ abstract class UploadBase {
 
                if ( !in_array( $namespace, $validNamespaces ) ) {
                        wfDebug( __METHOD__ . ": Non-svg namespace '$namespace' in uploaded file.\n" );
-                       // @TODO return a status object to a closure in XmlTypeCheck, for MW1.21+
+                       /** @todo Return a status object to a closure in XmlTypeCheck, for MW1.21+ */
                        $this->mSVGNSError = $namespace;
+
                        return true;
                }
 
@@ -1261,24 +1348,29 @@ abstract class UploadBase {
                 */
                if ( $strippedElement == 'script' ) {
                        wfDebug( __METHOD__ . ": Found script element '$element' in uploaded file.\n" );
+
                        return true;
                }
 
-               # e.g., <svg xmlns="http://www.w3.org/2000/svg"> <handler xmlns:ev="http://www.w3.org/2001/xml-events" ev:event="load">alert(1)</handler> </svg>
+               # e.g., <svg xmlns="http://www.w3.org/2000/svg">
+               #  <handler xmlns:ev="http://www.w3.org/2001/xml-events" ev:event="load">alert(1)</handler> </svg>
                if ( $strippedElement == 'handler' ) {
                        wfDebug( __METHOD__ . ": Found scriptable element '$element' in uploaded file.\n" );
+
                        return true;
                }
 
                # SVG reported in Feb '12 that used xml:stylesheet to generate javascript block
                if ( $strippedElement == 'stylesheet' ) {
                        wfDebug( __METHOD__ . ": Found scriptable element '$element' in uploaded file.\n" );
+
                        return true;
                }
 
                # Block iframes, in case they pass the namespace check
                if ( $strippedElement == 'iframe' ) {
                        wfDebug( __METHOD__ . ": iframe in uploaded file.\n" );
+
                        return true;
                }
 
@@ -1287,69 +1379,105 @@ abstract class UploadBase {
                        $value = strtolower( $value );
 
                        if ( substr( $stripped, 0, 2 ) == 'on' ) {
-                               wfDebug( __METHOD__ . ": Found event-handler attribute '$attrib'='$value' in uploaded file.\n" );
+                               wfDebug( __METHOD__
+                                       . ": Found event-handler attribute '$attrib'='$value' in uploaded file.\n" );
+
                                return true;
                        }
 
                        # href with javascript target
                        if ( $stripped == 'href' && strpos( strtolower( $value ), 'javascript:' ) !== false ) {
-                               wfDebug( __METHOD__ . ": Found script in href attribute '$attrib'='$value' in uploaded file.\n" );
+                               wfDebug( __METHOD__
+                                       . ": Found script in href attribute '$attrib'='$value' in uploaded file.\n" );
+
                                return true;
                        }
 
                        # href with embedded svg as target
                        if ( $stripped == 'href' && preg_match( '!data:[^,]*image/svg[^,]*,!sim', $value ) ) {
-                               wfDebug( __METHOD__ . ": Found href to embedded svg \"<$strippedElement '$attrib'='$value'...\" in uploaded file.\n" );
+                               wfDebug( __METHOD__ . ": Found href to embedded svg "
+                                       . "\"<$strippedElement '$attrib'='$value'...\" in uploaded file.\n" );
+
                                return true;
                        }
 
                        # href with embedded (text/xml) svg as target
                        if ( $stripped == 'href' && preg_match( '!data:[^,]*text/xml[^,]*,!sim', $value ) ) {
-                               wfDebug( __METHOD__ . ": Found href to embedded svg \"<$strippedElement '$attrib'='$value'...\" in uploaded file.\n" );
+                               wfDebug( __METHOD__ . ": Found href to embedded svg "
+                                       . "\"<$strippedElement '$attrib'='$value'...\" in uploaded file.\n" );
+
                                return true;
                        }
 
                        # use set/animate to add event-handler attribute to parent
-                       if ( ( $strippedElement == 'set' || $strippedElement == 'animate' ) && $stripped == 'attributename' && substr( $value, 0, 2 ) == 'on' ) {
-                               wfDebug( __METHOD__ . ": Found svg setting event-handler attribute with \"<$strippedElement $stripped='$value'...\" in uploaded file.\n" );
+                       if ( ( $strippedElement == 'set' || $strippedElement == 'animate' )
+                               && $stripped == 'attributename'
+                               && substr( $value, 0, 2 ) == 'on'
+                       ) {
+                               wfDebug( __METHOD__ . ": Found svg setting event-handler attribute with "
+                                       . "\"<$strippedElement $stripped='$value'...\" in uploaded file.\n" );
+
                                return true;
                        }
 
                        # use set to add href attribute to parent element
-                       if ( $strippedElement == 'set' && $stripped == 'attributename' && strpos( $value, 'href' ) !== false ) {
+                       if ( $strippedElement == 'set'
+                               && $stripped == 'attributename'
+                               && strpos( $value, 'href' ) !== false
+                       ) {
                                wfDebug( __METHOD__ . ": Found svg setting href attribute '$value' in uploaded file.\n" );
+
                                return true;
                        }
 
                        # use set to add a remote / data / script target to an element
-                       if ( $strippedElement == 'set' && $stripped == 'to' && preg_match( '!(http|https|data|script):!sim', $value ) ) {
+                       if ( $strippedElement == 'set'
+                               && $stripped == 'to'
+                               && preg_match( '!(http|https|data|script):!sim', $value )
+                       ) {
                                wfDebug( __METHOD__ . ": Found svg setting attribute to '$value' in uploaded file.\n" );
+
                                return true;
                        }
 
                        # use handler attribute with remote / data / script
                        if ( $stripped == 'handler' && preg_match( '!(http|https|data|script):!sim', $value ) ) {
-                               wfDebug( __METHOD__ . ": Found svg setting handler with remote/data/script '$attrib'='$value' in uploaded file.\n" );
+                               wfDebug( __METHOD__ . ": Found svg setting handler with remote/data/script "
+                                       . "'$attrib'='$value' in uploaded file.\n" );
+
                                return true;
                        }
 
                        # use CSS styles to bring in remote code
                        # catch url("http:..., url('http:..., url(http:..., but not url("#..., url('#..., url(#....
-                       if ( $stripped == 'style' && preg_match_all( '!((?:font|clip-path|fill|filter|marker|marker-end|marker-mid|marker-start|mask|stroke)\s*:\s*url\s*\(\s*["\']?\s*[^#]+.*?\))!sim', $value, $matches ) ) {
+                       $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
+                               )
+                       ) {
                                foreach ( $matches[1] as $match ) {
-                                       if ( !preg_match( '!(?:font|clip-path|fill|filter|marker|marker-end|marker-mid|marker-start|mask|stroke)\s*:\s*url\s*\(\s*(#|\'#|"#)!sim', $match ) ) {
-                                               wfDebug( __METHOD__ . ": Found svg setting a style with remote url '$attrib'='$value' in uploaded file.\n" );
+                                       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" );
+
                                                return true;
                                        }
                                }
                        }
 
                        # image filters can pull in url, which could be svg that executes scripts
-                       if ( $strippedElement == 'image' && $stripped == 'filter' && preg_match( '!url\s*\(!sim', $value ) ) {
-                               wfDebug( __METHOD__ . ": Found image filter with url: \"<$strippedElement $stripped='$value'...\" in uploaded file.\n" );
+                       if ( $strippedElement == 'image'
+                               && $stripped == 'filter'
+                               && preg_match( '!url\s*\(!sim', $value )
+                       ) {
+                               wfDebug( __METHOD__ . ": Found image filter with url: "
+                                       . "\"<$strippedElement $stripped='$value'...\" in uploaded file.\n" );
+
                                return true;
                        }
-
                }
 
                return false; //No scripts detected
@@ -1357,24 +1485,26 @@ abstract class UploadBase {
 
        /**
         * Divide the element name passed by the xml parser to the callback into URI and prifix.
-        * @param $name string
-        * @return array containing the namespace URI and prefix
+        * @param string $name
+        * @return array Containing the namespace URI and prefix
         */
        private static function splitXmlNamespace( $element ) {
                // 'http://www.w3.org/2000/svg:script' -> array( 'http://www.w3.org/2000/svg', 'script' )
                $parts = explode( ':', strtolower( $element ) );
                $name = array_pop( $parts );
                $ns = implode( ':', $parts );
+
                return array( $ns, $name );
        }
 
        /**
-        * @param $name string
+        * @param string $name
         * @return string
         */
        private function stripXmlNamespace( $name ) {
                // 'http://www.w3.org/2000/svg:script' -> 'script'
                $parts = explode( ':', strtolower( $name ) );
+
                return array_pop( $parts );
        }
 
@@ -1383,10 +1513,10 @@ abstract class UploadBase {
         * This relies on the $wgAntivirus and $wgAntivirusSetup variables.
         * $wgAntivirusRequired may be used to deny upload if the scan fails.
         *
-        * @param string $file pathname to the temporary upload file
-        * @return mixed false if not virus is found, NULL if the scan fails or is disabled,
-        *         or a string containing feedback from the virus scanner if a virus was found.
-        *         If textual feedback is missing but a virus was found, this function returns true.
+        * @param string $file Pathname to the temporary upload file
+        * @return mixed False if not virus is found, null if the scan fails or is disabled,
+        *   or a string containing feedback from the virus scanner if a virus was found.
+        *   If textual feedback is missing but a virus was found, this function returns true.
         */
        public static function detectVirus( $file ) {
                global $wgAntivirus, $wgAntivirusSetup, $wgAntivirusRequired, $wgOut;
@@ -1395,6 +1525,7 @@ abstract class UploadBase {
                if ( !$wgAntivirus ) {
                        wfDebug( __METHOD__ . ": virus scanner disabled\n" );
                        wfProfileOut( __METHOD__ );
+
                        return null;
                }
 
@@ -1403,6 +1534,7 @@ abstract class UploadBase {
                        $wgOut->wrapWikiMsg( "<div class=\"error\">\n$1\n</div>",
                                array( 'virus-badscanner', $wgAntivirus ) );
                        wfProfileOut( __METHOD__ );
+
                        return wfMessage( 'virus-unknownscanner' )->text() . " $wgAntivirus";
                }
 
@@ -1447,7 +1579,9 @@ abstract class UploadBase {
                        # scan failed (code was mapped to false by $exitCodeMap)
                        wfDebug( __METHOD__ . ": failed to scan $file (code $exitCode).\n" );
 
-                       $output = $wgAntivirusRequired ? wfMessage( 'virus-scanfailed', array( $exitCode ) )->text() : null;
+                       $output = $wgAntivirusRequired
+                               ? wfMessage( 'virus-scanfailed', array( $exitCode ) )->text()
+                               : null;
                } elseif ( $mappedCode === AV_SCAN_ABORTED ) {
                        # scan failed because filetype is unknown (probably imune)
                        wfDebug( __METHOD__ . ": unsupported file type $file (code $exitCode).\n" );
@@ -1474,6 +1608,7 @@ abstract class UploadBase {
                }
 
                wfProfileOut( __METHOD__ );
+
                return $output;
        }
 
@@ -1481,9 +1616,9 @@ abstract class UploadBase {
         * Check if there's an overwrite conflict and, if so, if restrictions
         * forbid this user from performing the upload.
         *
-        * @param $user User
+        * @param User $user
         *
-        * @return mixed true on success, array on failure
+        * @return mixed True on success, array on failure
         */
        private function checkOverwrite( $user ) {
                // First check whether the local file can be overwritten
@@ -1510,9 +1645,9 @@ abstract class UploadBase {
        /**
         * Check if a user is the last uploader
         *
-        * @param $user User object
-        * @param string $img image name
-        * @return Boolean
+        * @param User $user
+        * @param string $img Image name
+        * @return bool
         */
        public static function userCanReUpload( User $user, $img ) {
                if ( $user->isAllowed( 'reupload' ) ) {
@@ -1539,7 +1674,7 @@ abstract class UploadBase {
         * - File exists with normalized extension
         * - The file looks like a thumbnail and the original exists
         *
-        * @param $file File The File object to check
+        * @param File $file The File object to check
         * @return mixed False if the file does not exists, else an array
         */
        public static function getExistsWarning( $file ) {
@@ -1585,7 +1720,7 @@ abstract class UploadBase {
 
                // Check for files with the same name but a different extension
                $similarFiles = RepoGroup::singleton()->getLocalRepo()->findFilesByPrefix(
-                               "{$partname}.", 1 );
+                       "{$partname}.", 1 );
                if ( count( $similarFiles ) ) {
                        return array(
                                'warning' => 'exists-normalized',
@@ -1596,7 +1731,10 @@ abstract class UploadBase {
 
                if ( self::isThumbName( $file->getName() ) ) {
                        # Check for filenames like 50px- or 180px-, these are mostly thumbnails
-                       $nt_thb = Title::newFromText( substr( $partname, strpos( $partname, '-' ) + 1 ) . '.' . $extension, NS_FILE );
+                       $nt_thb = Title::newFromText(
+                               substr( $partname, strpos( $partname, '-' ) + 1 ) . '.' . $extension,
+                               NS_FILE
+                       );
                        $file_thb = wfLocalFile( $nt_thb );
                        if ( $file_thb->exists() ) {
                                return array(
@@ -1629,23 +1767,24 @@ abstract class UploadBase {
 
        /**
         * Helper function that checks whether the filename looks like a thumbnail
-        * @param $filename string
+        * @param string $filename
         * @return bool
         */
        public static function isThumbName( $filename ) {
                $n = strrpos( $filename, '.' );
                $partname = $n ? substr( $filename, 0, $n ) : $filename;
+
                return (
-                                       substr( $partname, 3, 3 ) == 'px-' ||
-                                       substr( $partname, 2, 3 ) == 'px-'
-                               ) &&
-                               preg_match( "/[0-9]{2}/", substr( $partname, 0, 2 ) );
+                       substr( $partname, 3, 3 ) == 'px-' ||
+                       substr( $partname, 2, 3 ) == 'px-'
+               ) &&
+               preg_match( "/[0-9]{2}/", substr( $partname, 0, 2 ) );
        }
 
        /**
         * Get a list of blacklisted filename prefixes from [[MediaWiki:Filename-prefix-blacklist]]
         *
-        * @return array list of prefixes
+        * @return array List of prefixes
         */
        public static function getFilenamePrefixBlacklist() {
                $blacklist = array();
@@ -1666,23 +1805,28 @@ abstract class UploadBase {
                                $blacklist[] = trim( $line );
                        }
                }
+
                return $blacklist;
        }
 
        /**
         * Gets image info about the file just uploaded.
         *
-        * Also has the effect of setting metadata to be an 'indexed tag name' in returned API result if
-        * 'metadata' was requested. Oddly, we have to pass the "result" object down just so it can do that
-        * with the appropriate format, presumably.
+        * Also has the effect of setting metadata to be an 'indexed tag name' in
+        * returned API result if 'metadata' was requested. Oddly, we have to pass
+        * the "result" object down just so it can do that with the appropriate
+        * format, presumably.
         *
-        * @param $result ApiResult:
-        * @return Array: image info
+        * @param ApiResult $result
+        * @return array Image info
         */
        public function getImageInfo( $result ) {
                $file = $this->getLocalFile();
-               // TODO This cries out for refactoring. We really want to say $file->getAllInfo(); here.
-               // Perhaps "info" methods should be moved into files, and the API should just wrap them in queries.
+               /** @todo This cries out for refactoring.
+                *  We really want to say $file->getAllInfo(); here.
+                * Perhaps "info" methods should be moved into files, and the API should
+                * just wrap them in queries.
+                */
                if ( $file instanceof UploadStashFile ) {
                        $imParam = ApiQueryStashImageInfo::getPropertyNames();
                        $info = ApiQueryStashImageInfo::getInfo( $file, array_flip( $imParam ), $result );
@@ -1690,21 +1834,23 @@ abstract class UploadBase {
                        $imParam = ApiQueryImageInfo::getPropertyNames();
                        $info = ApiQueryImageInfo::getInfo( $file, array_flip( $imParam ), $result );
                }
+
                return $info;
        }
 
        /**
-        * @param $error array
+        * @param array $error
         * @return Status
         */
        public function convertVerifyErrorToStatus( $error ) {
                $code = $error['status'];
                unset( $code['status'] );
+
                return Status::newFatal( $this->getVerificationErrorCode( $code ), $error );
        }
 
        /**
-        * @param $forType null|string
+        * @param null|string $forType
         * @return int
         */
        public static function getMaxUploadSize( $forType = null ) {
@@ -1724,8 +1870,8 @@ abstract class UploadBase {
        /**
         * Get the current status of a chunked upload (used for polling).
         * The status will be read from the *current* user session.
-        * @param $statusKey string
-        * @return Array|bool
+        * @param string $statusKey
+        * @return array|bool
         */
        public static function getSessionStatus( $statusKey ) {
                return isset( $_SESSION[self::SESSION_STATUS_KEY][$statusKey] )
@@ -1736,8 +1882,8 @@ abstract class UploadBase {
        /**
         * Set the current status of a chunked upload (used for polling).
         * The status will be stored in the *current* user session.
-        * @param $statusKey string
-        * @param $value array|false
+        * @param string $statusKey
+        * @param array|bool $value
         * @return void
         */
        public static function setSessionStatus( $statusKey, $value ) {
index bdcc9a1..6f90280 100644 (file)
@@ -36,9 +36,9 @@ class UploadFromChunks extends UploadFromFile {
        /**
         * Setup local pointers to stash, repo and user (similar to UploadFromStash)
         *
-        * @param $user User|null Default: null
-        * @param $stash UploadStash|bool Default: false
-        * @param $repo FileRepo|bool Default: false
+        * @param User|null $user Default: null
+        * @param UploadStash|bool $stash Default: false
+        * @param FileRepo|bool $repo Default: false
         */
        public function __construct( $user = null, $stash = false, $repo = false ) {
                // user object. sometimes this won't exist, as when running from cron.
@@ -67,6 +67,7 @@ class UploadFromChunks extends UploadFromFile {
        /**
         * Calls the parent stashFile and updates the uploadsession table to handle "chunks"
         *
+        * @param User|null $user
         * @return UploadStashFile stashed file
         */
        public function stashFile( User $user = null ) {
@@ -86,11 +87,16 @@ class UploadFromChunks extends UploadFromFile {
 
                // Update db table to reflect initial "chunk" state
                $this->updateChunkStatus();
+
                return $this->mLocalFile;
        }
 
        /**
         * Continue chunk uploading
+        *
+        * @param string $name
+        * @param string $key
+        * @param WebRequestUpload $webRequestUpload
         */
        public function continueChunks( $name, $key, $webRequestUpload ) {
                $this->mFileKey = $key;
@@ -149,6 +155,7 @@ class UploadFromChunks extends UploadFromFile {
                if ( $ret['status'] !== UploadBase::OK ) {
                        wfDebugLog( 'fileconcatenate', "Verification failed for chunked upload" );
                        $status->fatal( $this->getVerificationErrorCode( $ret['status'] ) );
+
                        return $status;
                }
 
@@ -165,29 +172,30 @@ class UploadFromChunks extends UploadFromFile {
 
        /**
         * Perform the upload, then remove the temp copy afterward
-        * @param $comment string
-        * @param $pageText string
-        * @param $watch bool
-        * @param $user User
+        * @param string $comment
+        * @param string $pageText
+        * @param bool $watch
+        * @param User $user
         * @return Status
         */
        public function performUpload( $comment, $pageText, $watch, $user ) {
                $rv = parent::performUpload( $comment, $pageText, $watch, $user );
+
                return $rv;
        }
 
        /**
         * Returns the virtual chunk location:
-        * @param $index
+        * @param int $index
         * @return string
         */
        function getVirtualChunkLocation( $index ) {
                return $this->repo->getVirtualUrl( 'temp' ) .
-                               '/' .
-                               $this->repo->getHashPath(
-                                       $this->getChunkFileKey( $index )
-                               ) .
-                               $this->getChunkFileKey( $index );
+                       '/' .
+                       $this->repo->getHashPath(
+                               $this->getChunkFileKey( $index )
+                       ) .
+                       $this->getChunkFileKey( $index );
        }
 
        /**
@@ -229,6 +237,7 @@ class UploadFromChunks extends UploadFromFile {
                                $status = Status::newFatal( 'invalid-chunk-offset' );
                        }
                }
+
                return $status;
        }
 
@@ -237,7 +246,7 @@ class UploadFromChunks extends UploadFromFile {
         */
        private function updateChunkStatus() {
                wfDebug( __METHOD__ . " update chunk status for {$this->mFileKey} offset:" .
-                                       $this->getOffset() . ' inx:' . $this->getChunkIndex() . "\n" );
+                       $this->getOffset() . ' inx:' . $this->getChunkIndex() . "\n" );
 
                $dbw = $this->repo->getMasterDb();
                // Use a quick transaction since we will upload the full temp file into shared
@@ -283,30 +292,32 @@ class UploadFromChunks extends UploadFromFile {
 
        /**
         * Get the current Chunk index
-        * @return Integer index of the current chunk
+        * @return int Index of the current chunk
         */
        private function getChunkIndex() {
                if ( $this->mChunkIndex !== null ) {
                        return $this->mChunkIndex;
                }
+
                return 0;
        }
 
        /**
         * Gets the current offset in fromt the stashedupload table
-        * @return Integer current byte offset of the chunk file set
+        * @return int Current byte offset of the chunk file set
         */
        private function getOffset() {
                if ( $this->mOffset !== null ) {
                        return $this->mOffset;
                }
+
                return 0;
        }
 
        /**
         * Output the chunk to disk
         *
-        * @param $chunkPath string
+        * @param string $chunkPath
         * @throws UploadChunkFileException
         * @return FileRepoStatus
         */
@@ -320,19 +331,20 @@ class UploadFromChunks extends UploadFromFile {
                        $this->repo->getZonePath( 'temp' ) . "/{$hashPath}{$fileKey}" );
 
                // Check for error in stashing the chunk:
-               if ( ! $storeStatus->isOK() ) {
+               if ( !$storeStatus->isOK() ) {
                        $error = $storeStatus->getErrorsArray();
                        $error = reset( $error );
-                       if ( ! count( $error ) ) {
+                       if ( !count( $error ) ) {
                                $error = $storeStatus->getWarningsArray();
                                $error = reset( $error );
-                               if ( ! count( $error ) ) {
+                               if ( !count( $error ) ) {
                                        $error = array( 'unknown', 'no error recorded' );
                                }
                        }
                        throw new UploadChunkFileException( "Error storing file in '$chunkPath': " .
                                implode( '; ', $error ) );
                }
+
                return $storeStatus;
        }
 
@@ -340,6 +352,7 @@ class UploadFromChunks extends UploadFromFile {
                if ( $index === null ) {
                        $index = $this->getChunkIndex();
                }
+
                return $this->mFileKey . '.' . $index;
        }
 
index a00ed32..3a1e8bd 100644 (file)
  * @author Bryan Tong Minh
  */
 class UploadFromFile extends UploadBase {
-
        /**
         * @var WebRequestUpload
         */
        protected $mUpload = null;
 
        /**
-        * @param $request WebRequest
+        * @param WebRequest $request
         */
        function initializeFromRequest( &$request ) {
                $upload = $request->getUpload( 'wpUploadFile' );
@@ -49,8 +48,8 @@ class UploadFromFile extends UploadBase {
 
        /**
         * Initialize from a filename and a WebRequestUpload
-        * @param $name
-        * @param $webRequestUpload
+        * @param string $name
+        * @param WebRequestUpload $webRequestUpload
         */
        function initialize( $name, $webRequestUpload ) {
                $this->mUpload = $webRequestUpload;
@@ -59,7 +58,7 @@ class UploadFromFile extends UploadBase {
        }
 
        /**
-        * @param $request
+        * @param WebRequest $request
         * @return bool
         */
        static function isValidRequest( $request ) {
index a67fc57..b4e815f 100644 (file)
@@ -157,6 +157,7 @@ class UploadFromStash extends UploadBase {
                // replace mLocalFile with an instance of UploadStashFile, which adds some methods
                // that are useful for stashed files.
                $this->mLocalFile = parent::stashFile( $user );
+
                return $this->mLocalFile;
        }
 
@@ -187,6 +188,7 @@ class UploadFromStash extends UploadBase {
        public function performUpload( $comment, $pageText, $watch, $user ) {
                $rv = parent::performUpload( $comment, $pageText, $watch, $user );
                $this->unsaveUploadedFile();
+
                return $rv;
        }
 }
index 19b4dfd..b605640 100644 (file)
@@ -41,7 +41,7 @@ class UploadFromUrl extends UploadBase {
         * user is not allowed, return the name of the user right as a string. If
         * the user is allowed, have the parent do further permissions checking.
         *
-        * @param $user User
+        * @param User $user
         *
         * @return bool|string
         */
@@ -49,6 +49,7 @@ class UploadFromUrl extends UploadBase {
                if ( !$user->isAllowed( 'upload_by_url' ) ) {
                        return 'upload_by_url';
                }
+
                return parent::isAllowed( $user );
        }
 
@@ -58,6 +59,7 @@ class UploadFromUrl extends UploadBase {
         */
        public static function isEnabled() {
                global $wgAllowCopyUploads;
+
                return $wgAllowCopyUploads && parent::isEnabled();
        }
 
@@ -66,7 +68,7 @@ class UploadFromUrl extends UploadBase {
         * The domains in the whitelist can include wildcard characters (*) in place
         * of any of the domain levels, e.g. '*.flickr.com' or 'upload.*.gov.uk'.
         *
-        * @param $url string
+        * @param string $url
         * @return bool
         */
        public static function isAllowedHost( $url ) {
@@ -103,13 +105,14 @@ class UploadFromUrl extends UploadBase {
                        }
                        */
                }
+
                return $valid;
        }
 
        /**
         * Checks whether the URL is not allowed.
         *
-        * @param $url string
+        * @param string $url
         * @return bool
         */
        public static function isAllowedUrl( $url ) {
@@ -118,15 +121,16 @@ class UploadFromUrl extends UploadBase {
                        wfRunHooks( 'IsUploadAllowedFromUrl', array( $url, &$allowed ) );
                        self::$allowedUrls[$url] = $allowed;
                }
+
                return self::$allowedUrls[$url];
        }
 
        /**
         * Entry point for API upload
         *
-        * @param $name string
-        * @param $url string
-        * @param $async mixed Whether the download should be performed
+        * @param string $name
+        * @param string $url
+        * @param bool|string $async Whether the download should be performed
         * asynchronous. False for synchronous, async or async-leavemessage for
         * asynchronous download.
         * @throws MWException
@@ -147,7 +151,7 @@ class UploadFromUrl extends UploadBase {
 
        /**
         * Entry point for SpecialUpload
-        * @param $request WebRequest object
+        * @param WebRequest $request
         */
        public function initializeFromRequest( &$request ) {
                $desiredDestName = $request->getText( 'wpDestFile' );
@@ -162,13 +166,14 @@ class UploadFromUrl extends UploadBase {
        }
 
        /**
-        * @param $request WebRequest object
+        * @param WebRequest $request
         * @return bool
         */
        public static function isValidRequest( $request ) {
                global $wgUser;
 
                $url = $request->getVal( 'wpUploadFileURL' );
+
                return !empty( $url )
                        && Http::isValidURI( $url )
                        && $wgUser->isAllowed( 'upload_by_url' );
@@ -184,7 +189,7 @@ class UploadFromUrl extends UploadBase {
        /**
         * Download the file (if not async)
         *
-        * @param Array $httpOptions Array of options for MWHttpRequest. Ignored if async.
+        * @param array $httpOptions Array of options for MWHttpRequest. Ignored if async.
         *   This could be used to override the timeout on the http request.
         * @return Status
         */
@@ -202,6 +207,7 @@ class UploadFromUrl extends UploadBase {
                if ( !$this->mAsync ) {
                        return $this->reallyFetchFile( $httpOptions );
                }
+
                return Status::newGood();
        }
 
@@ -213,15 +219,16 @@ class UploadFromUrl extends UploadBase {
        protected function makeTemporaryFile() {
                $tmpFile = TempFSFile::factory( 'URL' );
                $tmpFile->bind( $this );
+
                return $tmpFile->getPath();
        }
 
        /**
         * Callback: save a chunk of the result of a HTTP request to the temporary file
         *
-        * @param $req mixed
-        * @param $buffer string
-        * @return int number of bytes handled
+        * @param mixed $req
+        * @param string $buffer
+        * @return int Number of bytes handled
         */
        public function saveTempFileChunk( $req, $buffer ) {
                $nbytes = fwrite( $this->mTmpHandle, $buffer );
@@ -241,7 +248,7 @@ class UploadFromUrl extends UploadBase {
         * Download the file, save it to the temporary file and update the file
         * size and set $mRemoveTempFile to true.
         *
-        * @param Array $httpOptions Array of options for MWHttpRequest
+        * @param array $httpOptions Array of options for MWHttpRequest
         * @return Status
         */
        protected function reallyFetchFile( $httpOptions = array() ) {
@@ -259,12 +266,12 @@ class UploadFromUrl extends UploadBase {
                $this->mRemoveTempFile = true;
                $this->mFileSize = 0;
 
-               $options = $httpOptions + array(
-                       'followRedirects' => true,
-               );
+               $options = $httpOptions + array( 'followRedirects' => true );
+
                if ( $wgCopyUploadProxy !== false ) {
                        $options['proxy'] = $wgCopyUploadProxy;
                }
+
                if ( $wgCopyUploadTimeout && !isset( $options['timeout'] ) ) {
                        $options['timeout'] = $wgCopyUploadTimeout;
                }
@@ -297,42 +304,46 @@ class UploadFromUrl extends UploadBase {
                if ( $this->mAsync ) {
                        return array( 'status' => UploadBase::OK );
                }
+
                return parent::verifyUpload();
        }
 
        /**
         * Wrapper around the parent function in order to defer checking warnings
         * until the file really has been fetched.
-        * @return Array
+        * @return array
         */
        public function checkWarnings() {
                if ( $this->mAsync ) {
                        $this->mIgnoreWarnings = false;
+
                        return array();
                }
+
                return parent::checkWarnings();
        }
 
        /**
         * Wrapper around the parent function in order to defer checking protection
         * until we are sure that the file can actually be uploaded
-        * @param $user User
+        * @param User $user
         * @return bool|mixed
         */
        public function verifyTitlePermissions( $user ) {
                if ( $this->mAsync ) {
                        return true;
                }
+
                return parent::verifyTitlePermissions( $user );
        }
 
        /**
         * Wrapper around the parent function in order to defer uploading to the
         * job queue for asynchronous uploads
-        * @param $comment string
-        * @param $pageText string
-        * @param $watch bool
-        * @param $user User
+        * @param string $comment
+        * @param string $pageText
+        * @param bool $watch
+        * @param User $user
         * @return Status
         */
        public function performUpload( $comment, $pageText, $watch, $user ) {
@@ -346,11 +357,11 @@ class UploadFromUrl extends UploadBase {
        }
 
        /**
-        * @param $comment
-        * @param $pageText
-        * @param $watch
-        * @param $user User
-        * @return String
+        * @param string $comment
+        * @param string $pageText
+        * @param bool $watch
+        * @param User $user
+        * @return string
         */
        protected function insertJob( $comment, $pageText, $watch, $user ) {
                $sessionKey = $this->stashSession();
@@ -367,7 +378,7 @@ class UploadFromUrl extends UploadBase {
                ) );
                $job->initializeSessionData();
                JobQueueGroup::singleton()->push( $job );
+
                return $sessionKey;
        }
-
 }
index ad2196d..a7e7100 100644 (file)
 
 /**
  * UploadStash is intended to accomplish a few things:
- *   - enable applications to temporarily stash files without publishing them to the wiki.
- *      - Several parts of MediaWiki do this in similar ways: UploadBase, UploadWizard, and FirefoggChunkedExtension
- *        And there are several that reimplement stashing from scratch, in idiosyncratic ways. The idea is to unify them all here.
- *       Mostly all of them are the same except for storing some custom fields, which we subsume into the data array.
- *   - enable applications to find said files later, as long as the db table or temp files haven't been purged.
- *   - enable the uploading user (and *ONLY* the uploading user) to access said files, and thumbnails of said files, via a URL.
- *     We accomplish this using a database table, with ownership checking as you might expect. See SpecialUploadStash, which
- *     implements a web interface to some files stored this way.
+ *   - Enable applications to temporarily stash files without publishing them to
+ *     the wiki.
+ *      - Several parts of MediaWiki do this in similar ways: UploadBase,
+ *        UploadWizard, and FirefoggChunkedExtension.
+ *        And there are several that reimplement stashing from scratch, in
+ *        idiosyncratic ways. The idea is to unify them all here.
+ *        Mostly all of them are the same except for storing some custom fields,
+ *        which we subsume into the data array.
+ *   - Enable applications to find said files later, as long as the db table or
+ *     temp files haven't been purged.
+ *   - Enable the uploading user (and *ONLY* the uploading user) to access said
+ *     files, and thumbnails of said files, via a URL. We accomplish this using
+ *     a database table, with ownership checking as you might expect. See
+ *     SpecialUploadStash, which implements a web interface to some files stored
+ *     this way.
  *
- * UploadStash right now is *mostly* intended to show you one user's slice of the entire stash. The user parameter is only optional
- * because there are few cases where we clean out the stash from an automated script. In the future we might refactor this.
+ * UploadStash right now is *mostly* intended to show you one user's slice of
+ * the entire stash. The user parameter is only optional because there are few
+ * cases where we clean out the stash from an automated script. In the future we
+ * might refactor this.
  *
  * UploadStash represents the entire stash of temporary files.
  * UploadStashFile is a filestore for the actual physical disk files.
- * UploadFromStash extends UploadBase, and represents a single stashed file as it is moved from the stash to the regular file repository
+ * UploadFromStash extends UploadBase, and represents a single stashed file as
+ * it is moved from the stash to the regular file repository
  *
  * @ingroup Upload
  */
 class UploadStash {
-
        // Format of the key for files -- has to be suitable as a filename itself (e.g. ab12cd34ef.jpg)
        const KEY_FORMAT_REGEX = '/^[\w-\.]+\.\w*$/';
 
@@ -71,8 +80,8 @@ class UploadStash {
         * Designed to be compatible with the session stashing code in UploadBase
         * (should replace it eventually).
         *
-        * @param $repo FileRepo
-        * @param $user User (default null)
+        * @param FileRepo $repo
+        * @param User $user (default null)
         */
        public function __construct( FileRepo $repo, $user = null ) {
                // this might change based on wiki's configuration.
@@ -95,10 +104,11 @@ class UploadStash {
 
        /**
         * Get a file and its metadata from the stash.
-        * The noAuth param is a bit janky but is required for automated scripts which clean out the stash.
+        * The noAuth param is a bit janky but is required for automated scripts
+        * which clean out the stash.
         *
-        * @param string $key key under which file information is stored
-        * @param $noAuth Boolean (optional) Don't check authentication. Used by maintenance scripts.
+        * @param string $key Key under which file information is stored
+        * @param bool $noAuth (optional) Don't check authentication. Used by maintenance scripts.
         * @throws UploadStashFileNotFoundException
         * @throws UploadStashNotLoggedInException
         * @throws UploadStashWrongOwnerException
@@ -106,7 +116,7 @@ class UploadStash {
         * @return UploadStashFile
         */
        public function getFile( $key, $noAuth = false ) {
-               if ( ! preg_match( self::KEY_FORMAT_REGEX, $key ) ) {
+               if ( !preg_match( self::KEY_FORMAT_REGEX, $key ) ) {
                        throw new UploadStashBadPathException( "key '$key' is not in a proper format" );
                }
 
@@ -117,7 +127,8 @@ class UploadStash {
 
                if ( !isset( $this->fileMetadata[$key] ) ) {
                        if ( !$this->fetchFileMetadata( $key ) ) {
-                               // If nothing was received, it's likely due to replication lag.  Check the master to see if the record is there.
+                               // If nothing was received, it's likely due to replication lag.
+                               // Check the master to see if the record is there.
                                $this->fetchFileMetadata( $key, DB_MASTER );
                        }
 
@@ -138,14 +149,15 @@ class UploadStash {
                        }
                }
 
-               if ( ! $this->files[$key]->exists() ) {
+               if ( !$this->files[$key]->exists() ) {
                        wfDebug( __METHOD__ . " tried to get file at $key, but it doesn't exist\n" );
                        throw new UploadStashBadPathException( "path doesn't exist" );
                }
 
                if ( !$noAuth ) {
                        if ( $this->fileMetadata[$key]['us_user'] != $this->userId ) {
-                               throw new UploadStashWrongOwnerException( "This file ($key) doesn't belong to the current user." );
+                               throw new UploadStashWrongOwnerException( "This file ($key) doesn't "
+                                       . "belong to the current user." );
                        }
                }
 
@@ -156,10 +168,11 @@ class UploadStash {
         * Getter for file metadata.
         *
         * @param string $key key under which file information is stored
-        * @return Array
+        * @return array
         */
        public function getMetadata( $key ) {
                $this->getFile( $key );
+
                return $this->fileMetadata[$key];
        }
 
@@ -167,18 +180,21 @@ class UploadStash {
         * Getter for fileProps
         *
         * @param string $key key under which file information is stored
-        * @return Array
+        * @return array
         */
        public function getFileProps( $key ) {
                $this->getFile( $key );
+
                return $this->fileProps[$key];
        }
 
        /**
-        * Stash a file in a temp directory and record that we did this in the database, along with other metadata.
+        * Stash a file in a temp directory and record that we did this in the
+        * database, along with other metadata.
         *
         * @param string $path Path to file you want stashed
-        * @param string $sourceType The type of upload that generated this file (currently, I believe, 'file' or null)
+        * @param string $sourceType The type of upload that generated this file
+        *   (currently, I believe, 'file' or null)
         * @throws UploadStashBadPathException
         * @throws UploadStashFileException
         * @throws UploadStashNotLoggedInException
@@ -201,10 +217,11 @@ class UploadStash {
                        $pathWithGoodExtension = $path;
                }
 
-               // If no key was supplied, make one.  a mysql insertid would be totally reasonable here, except
-               // that for historical reasons, the key is this random thing instead.  At least it's not guessable.
+               // If no key was supplied, make one.  a mysql insertid would be totally
+               // reasonable here, except that for historical reasons, the key is this
+               // random thing instead.  At least it's not guessable.
                //
-               // some things that when combined will make a suitably unique key.
+               // Some things that when combined will make a suitably unique key.
                // see: http://www.jwz.org/doc/mid.html
                list( $usec, $sec ) = explode( ' ', microtime() );
                $usec = substr( $usec, 2 );
@@ -215,7 +232,7 @@ class UploadStash {
 
                $this->fileProps[$key] = $fileProps;
 
-               if ( ! preg_match( self::KEY_FORMAT_REGEX, $key ) ) {
+               if ( !preg_match( self::KEY_FORMAT_REGEX, $key ) ) {
                        throw new UploadStashBadPathException( "key '$key' is not in a proper format" );
                }
 
@@ -224,30 +241,36 @@ class UploadStash {
                // if not already in a temporary area, put it there
                $storeStatus = $this->repo->storeTemp( basename( $pathWithGoodExtension ), $path );
 
-               if ( ! $storeStatus->isOK() ) {
-                       // It is a convention in MediaWiki to only return one error per API exception, even if multiple errors
-                       // are available. We use reset() to pick the "first" thing that was wrong, preferring errors to warnings.
-                       // This is a bit lame, as we may have more info in the $storeStatus and we're throwing it away, but to fix it means
+               if ( !$storeStatus->isOK() ) {
+                       // It is a convention in MediaWiki to only return one error per API
+                       // exception, even if multiple errors are available. We use reset()
+                       // to pick the "first" thing that was wrong, preferring errors to
+                       // warnings. This is a bit lame, as we may have more info in the
+                       // $storeStatus and we're throwing it away, but to fix it means
                        // redesigning API errors significantly.
-                       // $storeStatus->value just contains the virtual URL (if anything) which is probably useless to the caller
+                       // $storeStatus->value just contains the virtual URL (if anything)
+                       // which is probably useless to the caller.
                        $error = $storeStatus->getErrorsArray();
                        $error = reset( $error );
-                       if ( ! count( $error ) ) {
+                       if ( !count( $error ) ) {
                                $error = $storeStatus->getWarningsArray();
                                $error = reset( $error );
-                               if ( ! count( $error ) ) {
+                               if ( !count( $error ) ) {
                                        $error = array( 'unknown', 'no error recorded' );
                                }
                        }
-                       // at this point, $error should contain the single "most important" error, plus any parameters.
+                       // At this point, $error should contain the single "most important"
+                       // error, plus any parameters.
                        $errorMsg = array_shift( $error );
-                       throw new UploadStashFileException( "Error storing file in '$path': " . wfMessage( $errorMsg, $error )->text() );
+                       throw new UploadStashFileException( "Error storing file in '$path': "
+                               . wfMessage( $errorMsg, $error )->text() );
                }
                $stashPath = $storeStatus->value;
 
                // fetch the current user ID
                if ( !$this->isLoggedIn ) {
-                       throw new UploadStashNotLoggedInException( __METHOD__ . ' No user is logged in, files must belong to users' );
+                       throw new UploadStashNotLoggedInException( __METHOD__
+                               . ' No user is logged in, files must belong to users' );
                }
 
                // insert the file metadata into the db.
@@ -279,7 +302,8 @@ class UploadStash {
                        __METHOD__
                );
 
-               // store the insertid in the class variable so immediate retrieval (possibly laggy) isn't necesary.
+               // store the insertid in the class variable so immediate retrieval
+               // (possibly laggy) isn't necesary.
                $this->fileMetadata[$key]['us_id'] = $dbw->insertId();
 
                # create the UploadStashFile object for this file.
@@ -293,11 +317,12 @@ class UploadStash {
         * Does not clean up files in the repo, just the record of them.
         *
         * @throws UploadStashNotLoggedInException
-        * @return bool success
+        * @return bool Success
         */
        public function clear() {
                if ( !$this->isLoggedIn ) {
-                       throw new UploadStashNotLoggedInException( __METHOD__ . ' No user is logged in, files must belong to users' );
+                       throw new UploadStashNotLoggedInException( __METHOD__
+                               . ' No user is logged in, files must belong to users' );
                }
 
                wfDebug( __METHOD__ . ' clearing all rows for user ' . $this->userId . "\n" );
@@ -319,18 +344,20 @@ class UploadStash {
         * Remove a particular file from the stash.  Also removes it from the repo.
         *
         * @param string $key
-        * @throws UploadStashNoSuchKeyException|UploadStashNotLoggedInException|UploadStashWrongOwnerException
+        * @throws UploadStashNoSuchKeyException|UploadStashNotLoggedInException
+        * @throws UploadStashWrongOwnerException
         * @return bool Success
         */
        public function removeFile( $key ) {
                if ( !$this->isLoggedIn ) {
-                       throw new UploadStashNotLoggedInException( __METHOD__ . ' No user is logged in, files must belong to users' );
+                       throw new UploadStashNotLoggedInException( __METHOD__
+                               . ' No user is logged in, files must belong to users' );
                }
 
                $dbw = $this->repo->getMasterDb();
 
-               // this is a cheap query. it runs on the master so that this function still works when there's lag.
-               // it won't be called all that often.
+               // this is a cheap query. it runs on the master so that this function
+               // still works when there's lag. It won't be called all that often.
                $row = $dbw->selectRow(
                        'uploadstash',
                        'us_user',
@@ -343,7 +370,8 @@ class UploadStash {
                }
 
                if ( $row->us_user != $this->userId ) {
-                       throw new UploadStashWrongOwnerException( "Can't delete: the file ($key) doesn't belong to this user." );
+                       throw new UploadStashWrongOwnerException( "Can't delete: "
+                               . "the file ($key) doesn't belong to this user." );
                }
 
                return $this->removeFileNoAuth( $key );
@@ -369,8 +397,9 @@ class UploadStash {
                        __METHOD__
                );
 
-               // TODO: look into UnregisteredLocalFile and find out why the rv here is sometimes wrong (false when file was removed)
-               // for now, ignore.
+               /** @todo Look into UnregisteredLocalFile and find out why the rv here is
+                *  sometimes wrong (false when file was removed). For now, ignore.
+                */
                $this->files[$key]->remove();
 
                unset( $this->files[$key] );
@@ -383,11 +412,12 @@ class UploadStash {
         * List all files in the stash.
         *
         * @throws UploadStashNotLoggedInException
-        * @return Array
+        * @return array
         */
        public function listFiles() {
                if ( !$this->isLoggedIn ) {
-                       throw new UploadStashNotLoggedInException( __METHOD__ . ' No user is logged in, files must belong to users' );
+                       throw new UploadStashNotLoggedInException( __METHOD__
+                               . ' No user is logged in, files must belong to users' );
                }
 
                $dbr = $this->repo->getSlaveDb();
@@ -418,7 +448,7 @@ class UploadStash {
         * with an extension.
         * XXX this is somewhat redundant with the checks that ApiUpload.php does with incoming
         * uploads versus the desired filename. Maybe we can get that passed to us...
-        * @param $path
+        * @param string $path
         * @throws UploadStashFileException
         * @return string
         */
@@ -451,6 +481,7 @@ class UploadStash {
                        // put it in a web accesible directory.
                        return '';
                }
+
                return $extension;
        }
 
@@ -459,7 +490,7 @@ class UploadStash {
         *
         * @param string $key
         * @param int $readFromDB Constant (default: DB_SLAVE)
-        * @return boolean
+        * @return bool
         */
        protected function fetchFileMetadata( $key, $readFromDB = DB_SLAVE ) {
                // populate $fileMetadata[$key]
@@ -502,6 +533,7 @@ class UploadStash {
                        throw new UploadStashZeroLengthFileException( "File is zero length" );
                }
                $this->files[$key] = $file;
+
                return true;
        }
 }
@@ -512,8 +544,10 @@ class UploadStashFile extends UnregisteredLocalFile {
        protected $url;
 
        /**
-        * A LocalFile wrapper around a file that has been temporarily stashed, so we can do things like create thumbnails for it
-        * Arguably UnregisteredLocalFile should be handling its own file repo but that class is a bit retarded currently
+        * A LocalFile wrapper around a file that has been temporarily stashed,
+        * so we can do things like create thumbnails for it. Arguably
+        * UnregisteredLocalFile should be handling its own file repo but that
+        * class is a bit retarded currently.
         *
         * @param FileRepo $repo Repository where we should find the path
         * @param string $path Path to file
@@ -528,18 +562,21 @@ class UploadStashFile extends UnregisteredLocalFile {
                if ( $repo->isVirtualUrl( $path ) ) {
                        $path = $repo->resolveVirtualUrl( $path );
                } else {
-
-                       // check if path appears to be sane, no parent traversals, and is in this repo's temp zone.
+                       // check if path appears to be sane, no parent traversals,
+                       // and is in this repo's temp zone.
                        $repoTempPath = $repo->getZonePath( 'temp' );
-                       if ( ( ! $repo->validateFilename( $path ) ) ||
-                                       ( strpos( $path, $repoTempPath ) !== 0 ) ) {
-                               wfDebug( "UploadStash: tried to construct an UploadStashFile from a file that should already exist at '$path', but path is not valid\n" );
+                       if ( ( !$repo->validateFilename( $path ) ) ||
+                               ( strpos( $path, $repoTempPath ) !== 0 )
+                       ) {
+                               wfDebug( "UploadStash: tried to construct an UploadStashFile "
+                                       . "from a file that should already exist at '$path', but path is not valid\n" );
                                throw new UploadStashBadPathException( 'path is not valid' );
                        }
 
                        // check if path exists! and is a plain file.
-                       if ( ! $repo->fileExists( $path ) ) {
-                               wfDebug( "UploadStash: tried to construct an UploadStashFile from a file that should already exist at '$path', but path is not found\n" );
+                       if ( !$repo->fileExists( $path ) ) {
+                               wfDebug( "UploadStash: tried to construct an UploadStashFile from "
+                                       . "a file that should already exist at '$path', but path is not found\n" );
                                throw new UploadStashFileNotFoundException( 'cannot find path, or not a plain file' );
                        }
                }
@@ -552,8 +589,8 @@ class UploadStashFile extends UnregisteredLocalFile {
        /**
         * A method needed by the file transforming and scaling routines in File.php
         * We do not necessarily care about doing the description at this point
-        * However, we also can't return the empty string, as the rest of MediaWiki demands this (and calls to imagemagick
-        * convert require it to be there)
+        * However, we also can't return the empty string, as the rest of MediaWiki
+        * demands this (and calls to imagemagick convert require it to be there)
         *
         * @return string Dummy value
         */
@@ -566,14 +603,17 @@ class UploadStashFile extends UnregisteredLocalFile {
         * The actual argument is the result of thumbName although we seem to have
         * buggy code elsewhere that expects a boolean 'suffix'
         *
-        * @param string $thumbName Name of thumbnail (e.g. "120px-123456.jpg" ), or false to just get the path
-        * @return string Path thumbnail should take on filesystem, or containing directory if thumbname is false
+        * @param string $thumbName Name of thumbnail (e.g. "120px-123456.jpg" ),
+        *   or false to just get the path
+        * @return string Path thumbnail should take on filesystem, or containing
+        *   directory if thumbname is false
         */
        public function getThumbPath( $thumbName = false ) {
                $path = dirname( $this->path );
                if ( $thumbName !== false ) {
                        $path .= "/$thumbName";
                }
+
                return $path;
        }
 
@@ -591,7 +631,8 @@ class UploadStashFile extends UnregisteredLocalFile {
        }
 
        /**
-        * Helper function -- given a 'subpage', return the local URL e.g. /wiki/Special:UploadStash/subpage
+        * Helper function -- given a 'subpage', return the local URL,
+        * e.g. /wiki/Special:UploadStash/subpage
         * @param string $subPage
         * @return string Local URL for this subpage in the Special:UploadStash space.
         */
@@ -602,14 +643,16 @@ class UploadStashFile extends UnregisteredLocalFile {
        /**
         * Get a URL to access the thumbnail
         * This is required because the model of how files work requires that
-        * the thumbnail urls be predictable. However, in our model the URL is not based on the filename
-        * (that's hidden in the db)
+        * the thumbnail urls be predictable. However, in our model the URL is
+        * not based on the filename (that's hidden in the db)
         *
-        * @param string $thumbName Basename of thumbnail file -- however, we don't want to use the file exactly
+        * @param string $thumbName Basename of thumbnail file -- however, we don't
+        *   want to use the file exactly
         * @return string URL to access thumbnail, or URL with partial path
         */
        public function getThumbUrl( $thumbName = false ) {
                wfDebug( __METHOD__ . " getting for $thumbName \n" );
+
                return $this->getSpecialUrl( 'thumb/' . $this->getUrlName() . '/' . $thumbName );
        }
 
@@ -620,9 +663,10 @@ class UploadStashFile extends UnregisteredLocalFile {
         * @return string Base url name, like '120px-123456.jpg'
         */
        public function getUrlName() {
-               if ( ! $this->urlName ) {
+               if ( !$this->urlName ) {
                        $this->urlName = $this->fileKey;
                }
+
                return $this->urlName;
        }
 
@@ -636,12 +680,14 @@ class UploadStashFile extends UnregisteredLocalFile {
                if ( !isset( $this->url ) ) {
                        $this->url = $this->getSpecialUrl( 'file/' . $this->getUrlName() );
                }
+
                return $this->url;
        }
 
        /**
-        * Parent classes use this method, for no obvious reason, to return the path (relative to wiki root, I assume).
-        * But with this class, the URL is unrelated to the path.
+        * Parent classes use this method, for no obvious reason, to return the path
+        * (relative to wiki root, I assume). But with this class, the URL is
+        * unrelated to the path.
         *
         * @return string Url
         */
@@ -650,7 +696,8 @@ class UploadStashFile extends UnregisteredLocalFile {
        }
 
        /**
-        * Getter for file key (the unique id by which this file's location & metadata is stored in the db)
+        * Getter for file key (the unique id by which this file's location &
+        * metadata is stored in the db)
         *
         * @return string File key
         */
@@ -674,15 +721,32 @@ class UploadStashFile extends UnregisteredLocalFile {
        public function exists() {
                return $this->repo->fileExists( $this->path );
        }
+}
+
+class UploadStashException extends MWException {
+}
+
+class UploadStashNotAvailableException extends UploadStashException {
+}
+
+class UploadStashFileNotFoundException extends UploadStashException {
+}
+
+class UploadStashBadPathException extends UploadStashException {
+}
+
+class UploadStashFileException extends UploadStashException {
+}
+
+class UploadStashZeroLengthFileException extends UploadStashException {
+}
+
+class UploadStashNotLoggedInException extends UploadStashException {
+}
+
+class UploadStashWrongOwnerException extends UploadStashException {
+}
 
+class UploadStashNoSuchKeyException extends UploadStashException {
 }
 
-class UploadStashException extends MWException {};
-class UploadStashNotAvailableException extends UploadStashException {};
-class UploadStashFileNotFoundException extends UploadStashException {};
-class UploadStashBadPathException extends UploadStashException {};
-class UploadStashFileException extends UploadStashException {};
-class UploadStashZeroLengthFileException extends UploadStashException {};
-class UploadStashNotLoggedInException extends UploadStashException {};
-class UploadStashWrongOwnerException extends UploadStashException {};
-class UploadStashNoSuchKeyException extends UploadStashException {};
index 037663c..b6df18b 100644 (file)
@@ -109,7 +109,9 @@ class ArrayUtils {
         * @return int|bool The item index of the lower bound, or false if the target value
         *     sorts before all items.
         */
-       public static function findLowerBound( $valueCallback, $valueCount, $comparisonCallback, $target ) {
+       public static function findLowerBound( $valueCallback, $valueCount,
+               $comparisonCallback, $target
+       ) {
                if ( $valueCount === 0 ) {
                        return false;
                }
index f556ee7..b16d4a4 100644 (file)
@@ -158,4 +158,5 @@ abstract class CdbWriter {
  * Exception for Cdb errors.
  * This explicitly doesn't subclass MWException to encourage reuse.
  */
-class CdbException extends Exception {}
+class CdbException extends Exception {
+}
index c178ffe..baba580 100644 (file)
@@ -101,28 +101,28 @@ class CdbFunctions {
  */
 class CdbReaderPHP extends CdbReader {
        /** The filename */
-       var $fileName;
+       protected $fileName;
 
        /* number of hash slots searched under this key */
-       var $loop;
+       protected $loop;
 
        /* initialized if loop is nonzero */
-       var $khash;
+       protected $khash;
 
        /* initialized if loop is nonzero */
-       var $kpos;
+       protected $kpos;
 
        /* initialized if loop is nonzero */
-       var $hpos;
+       protected $hpos;
 
        /* initialized if loop is nonzero */
-       var $hslots;
+       protected $hslots;
 
        /* initialized if findNext() returns true */
-       var $dpos;
+       protected $dpos;
 
        /* initialized if cdb_findnext() returns 1 */
-       var $dlen;
+       protected $dlen;
 
        /**
         * @param $fileName string
@@ -288,8 +288,11 @@ class CdbReaderPHP extends CdbReader {
  * CDB writer class
  */
 class CdbWriterPHP extends CdbWriter {
-       var $hplist;
-       var $numentries, $pos;
+       protected $hplist;
+
+       protected $numentries;
+
+       protected $pos;
 
        /**
         * @param $fileName string
diff --git a/includes/utils/ConfEditor.php b/includes/utils/ConfEditor.php
deleted file mode 100644 (file)
index a2fe507..0000000
+++ /dev/null
@@ -1,1125 +0,0 @@
-<?php
-/**
- * Configuration file editor.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * This is a state machine style parser with two internal stacks:
- *   * A next state stack, which determines the state the machine will progress to next
- *   * A path stack, which keeps track of the logical location in the file.
- *
- * Reference grammar:
- *
- * file = T_OPEN_TAG *statement
- * statement = T_VARIABLE "=" expression ";"
- * expression = array / scalar / T_VARIABLE
- * array = T_ARRAY "(" [ element *( "," element ) [ "," ] ] ")"
- * element = assoc-element / expression
- * assoc-element = scalar T_DOUBLE_ARROW expression
- * scalar = T_LNUMBER / T_DNUMBER / T_STRING / T_CONSTANT_ENCAPSED_STRING
- */
-class ConfEditor {
-       /** The text to parse */
-       var $text;
-
-       /** The token array from token_get_all() */
-       var $tokens;
-
-       /** The current position in the token array */
-       var $pos;
-
-       /** The current 1-based line number */
-       var $lineNum;
-
-       /** The current 1-based column number */
-       var $colNum;
-
-       /** The current 0-based byte number */
-       var $byteNum;
-
-       /** The current ConfEditorToken object */
-       var $currentToken;
-
-       /** The previous ConfEditorToken object */
-       var $prevToken;
-
-       /**
-        * The state machine stack. This is an array of strings where the topmost
-        * element will be popped off and become the next parser state.
-        */
-       var $stateStack;
-
-       /**
-        * The path stack is a stack of associative arrays with the following elements:
-        *    name              The name of top level of the path
-        *    level             The level (number of elements) of the path
-        *    startByte         The byte offset of the start of the path
-        *    startToken        The token offset of the start
-        *    endByte           The byte offset of thee
-        *    endToken          The token offset of the end, plus one
-        *    valueStartToken   The start token offset of the value part
-        *    valueStartByte    The start byte offset of the value part
-        *    valueEndToken     The end token offset of the value part, plus one
-        *    valueEndByte      The end byte offset of the value part, plus one
-        *    nextArrayIndex    The next numeric array index at this level
-        *    hasComma          True if the array element ends with a comma
-        *    arrowByte         The byte offset of the "=>", or false if there isn't one
-        */
-       var $pathStack;
-
-       /**
-        * The elements of the top of the pathStack for every path encountered, indexed
-        * by slash-separated path.
-        */
-       var $pathInfo;
-
-       /**
-        * Next serial number for whitespace placeholder paths (\@extra-N)
-        */
-       var $serial;
-
-       /**
-        * Editor state. This consists of the internal copy/insert operations which
-        * are applied to the source string to obtain the destination string.
-        */
-       var $edits;
-
-       /**
-        * Simple entry point for command-line testing
-        *
-        * @param $text string
-        *
-        * @return string
-        */
-       static function test( $text ) {
-               try {
-                       $ce = new self( $text );
-                       $ce->parse();
-               } catch ( ConfEditorParseError $e ) {
-                       return $e->getMessage() . "\n" . $e->highlight( $text );
-               }
-
-               return "OK";
-       }
-
-       /**
-        * Construct a new parser
-        */
-       public function __construct( $text ) {
-               $this->text = $text;
-       }
-
-       /**
-        * Edit the text. Returns the edited text.
-        * @param array $ops of operations.
-        *
-        * Operations are given as an associative array, with members:
-        *    type:     One of delete, set, append or insert (required)
-        *    path:     The path to operate on (required)
-        *    key:      The array key to insert/append, with PHP quotes
-        *    value:    The value, with PHP quotes
-        *
-        * delete
-        *    Deletes an array element or statement with the specified path.
-        *    e.g.
-        *        array('type' => 'delete', 'path' => '$foo/bar/baz' )
-        *    is equivalent to the runtime PHP code:
-        *        unset( $foo['bar']['baz'] );
-        *
-        * set
-        *    Sets the value of an array element. If the element doesn't exist, it
-        *    is appended to the array. If it does exist, the value is set, with
-        *    comments and indenting preserved.
-        *
-        * append
-        *    Appends a new element to the end of the array. Adds a trailing comma.
-        *    e.g.
-        *        array( 'type' => 'append', 'path', '$foo/bar',
-        *            'key' => 'baz', 'value' => "'x'" )
-        *    is like the PHP code:
-        *        $foo['bar']['baz'] = 'x';
-        *
-        * insert
-        *    Insert a new element at the start of the array.
-        *
-        * @throws MWException
-        * @return string
-        */
-       public function edit( $ops ) {
-               $this->parse();
-
-               $this->edits = array(
-                       array( 'copy', 0, strlen( $this->text ) )
-               );
-               foreach ( $ops as $op ) {
-                       $type = $op['type'];
-                       $path = $op['path'];
-                       $value = isset( $op['value'] ) ? $op['value'] : null;
-                       $key = isset( $op['key'] ) ? $op['key'] : null;
-
-                       switch ( $type ) {
-                               case 'delete':
-                                       list( $start, $end ) = $this->findDeletionRegion( $path );
-                                       $this->replaceSourceRegion( $start, $end, false );
-                                       break;
-                               case 'set':
-                                       if ( isset( $this->pathInfo[$path] ) ) {
-                                               list( $start, $end ) = $this->findValueRegion( $path );
-                                               $encValue = $value; // var_export( $value, true );
-                                               $this->replaceSourceRegion( $start, $end, $encValue );
-                                               break;
-                                       }
-                                       // No existing path, fall through to append
-                                       $slashPos = strrpos( $path, '/' );
-                                       $key = var_export( substr( $path, $slashPos + 1 ), true );
-                                       $path = substr( $path, 0, $slashPos );
-                                       // Fall through
-                               case 'append':
-                                       // Find the last array element
-                                       $lastEltPath = $this->findLastArrayElement( $path );
-                                       if ( $lastEltPath === false ) {
-                                               throw new MWException( "Can't find any element of array \"$path\"" );
-                                       }
-                                       $lastEltInfo = $this->pathInfo[$lastEltPath];
-
-                                       // Has it got a comma already?
-                                       if ( strpos( $lastEltPath, '@extra' ) === false && !$lastEltInfo['hasComma'] ) {
-                                               // No comma, insert one after the value region
-                                               list( , $end ) = $this->findValueRegion( $lastEltPath );
-                                               $this->replaceSourceRegion( $end - 1, $end - 1, ',' );
-                                       }
-
-                                       // Make the text to insert
-                                       list( $start, $end ) = $this->findDeletionRegion( $lastEltPath );
-
-                                       if ( $key === null ) {
-                                               list( $indent, ) = $this->getIndent( $start );
-                                               $textToInsert = "$indent$value,";
-                                       } else {
-                                               list( $indent, $arrowIndent ) =
-                                                       $this->getIndent( $start, $key, $lastEltInfo['arrowByte'] );
-                                               $textToInsert = "$indent$key$arrowIndent=> $value,";
-                                       }
-                                       $textToInsert .= ( $indent === false ? ' ' : "\n" );
-
-                                       // Insert the item
-                                       $this->replaceSourceRegion( $end, $end, $textToInsert );
-                                       break;
-                               case 'insert':
-                                       // Find first array element
-                                       $firstEltPath = $this->findFirstArrayElement( $path );
-                                       if ( $firstEltPath === false ) {
-                                               throw new MWException( "Can't find array element of \"$path\"" );
-                                       }
-                                       list( $start, ) = $this->findDeletionRegion( $firstEltPath );
-                                       $info = $this->pathInfo[$firstEltPath];
-
-                                       // Make the text to insert
-                                       if ( $key === null ) {
-                                               list( $indent, ) = $this->getIndent( $start );
-                                               $textToInsert = "$indent$value,";
-                                       } else {
-                                               list( $indent, $arrowIndent ) =
-                                                       $this->getIndent( $start, $key, $info['arrowByte'] );
-                                               $textToInsert = "$indent$key$arrowIndent=> $value,";
-                                       }
-                                       $textToInsert .= ( $indent === false ? ' ' : "\n" );
-
-                                       // Insert the item
-                                       $this->replaceSourceRegion( $start, $start, $textToInsert );
-                                       break;
-                               default:
-                                       throw new MWException( "Unrecognised operation: \"$type\"" );
-                       }
-               }
-
-               // Do the edits
-               $out = '';
-               foreach ( $this->edits as $edit ) {
-                       if ( $edit[0] == 'copy' ) {
-                               $out .= substr( $this->text, $edit[1], $edit[2] - $edit[1] );
-                       } else { // if ( $edit[0] == 'insert' )
-                               $out .= $edit[1];
-                       }
-               }
-
-               // Do a second parse as a sanity check
-               $this->text = $out;
-               try {
-                       $this->parse();
-               } catch ( ConfEditorParseError $e ) {
-                       throw new MWException(
-                               "Sorry, ConfEditor broke the file during editing and it won't parse anymore: " .
-                               $e->getMessage() );
-               }
-
-               return $out;
-       }
-
-       /**
-        * Get the variables defined in the text
-        * @return array( varname => value )
-        */
-       function getVars() {
-               $vars = array();
-               $this->parse();
-               foreach ( $this->pathInfo as $path => $data ) {
-                       if ( $path[0] != '$' ) {
-                               continue;
-                       }
-                       $trimmedPath = substr( $path, 1 );
-                       $name = $data['name'];
-                       if ( $name[0] == '@' ) {
-                               continue;
-                       }
-                       if ( $name[0] == '$' ) {
-                               $name = substr( $name, 1 );
-                       }
-                       $parentPath = substr( $trimmedPath, 0,
-                               strlen( $trimmedPath ) - strlen( $name ) );
-                       if ( substr( $parentPath, -1 ) == '/' ) {
-                               $parentPath = substr( $parentPath, 0, -1 );
-                       }
-
-                       $value = substr( $this->text, $data['valueStartByte'],
-                               $data['valueEndByte'] - $data['valueStartByte']
-                       );
-                       $this->setVar( $vars, $parentPath, $name,
-                               $this->parseScalar( $value ) );
-               }
-
-               return $vars;
-       }
-
-       /**
-        * Set a value in an array, unless it's set already. For instance,
-        * setVar( $arr, 'foo/bar', 'baz', 3 ); will set
-        * $arr['foo']['bar']['baz'] = 3;
-        * @param $array array
-        * @param string $path slash-delimited path
-        * @param $key mixed Key
-        * @param $value mixed Value
-        */
-       function setVar( &$array, $path, $key, $value ) {
-               $pathArr = explode( '/', $path );
-               $target =& $array;
-               if ( $path !== '' ) {
-                       foreach ( $pathArr as $p ) {
-                               if ( !isset( $target[$p] ) ) {
-                                       $target[$p] = array();
-                               }
-                               $target =& $target[$p];
-                       }
-               }
-               if ( !isset( $target[$key] ) ) {
-                       $target[$key] = $value;
-               }
-       }
-
-       /**
-        * Parse a scalar value in PHP
-        * @return mixed Parsed value
-        */
-       function parseScalar( $str ) {
-               if ( $str !== '' && $str[0] == '\'' ) {
-                       // Single-quoted string
-                       // @todo FIXME: trim() call is due to mystery bug where whitespace gets
-                       // appended to the token; without it we ended up reading in the
-                       // extra quote on the end!
-                       return strtr( substr( trim( $str ), 1, -1 ),
-                               array( '\\\'' => '\'', '\\\\' => '\\' ) );
-               }
-               if ( $str !== '' && $str[0] == '"' ) {
-                       // Double-quoted string
-                       // @todo FIXME: trim() call is due to mystery bug where whitespace gets
-                       // appended to the token; without it we ended up reading in the
-                       // extra quote on the end!
-                       return stripcslashes( substr( trim( $str ), 1, -1 ) );
-               }
-               if ( substr( $str, 0, 4 ) == 'true' ) {
-                       return true;
-               }
-               if ( substr( $str, 0, 5 ) == 'false' ) {
-                       return false;
-               }
-               if ( substr( $str, 0, 4 ) == 'null' ) {
-                       return null;
-               }
-
-               // Must be some kind of numeric value, so let PHP's weak typing
-               // be useful for a change
-               return $str;
-       }
-
-       /**
-        * Replace the byte offset region of the source with $newText.
-        * Works by adding elements to the $this->edits array.
-        */
-       function replaceSourceRegion( $start, $end, $newText = false ) {
-               // Split all copy operations with a source corresponding to the region
-               // in question.
-               $newEdits = array();
-               foreach ( $this->edits as $edit ) {
-                       if ( $edit[0] !== 'copy' ) {
-                               $newEdits[] = $edit;
-                               continue;
-                       }
-                       $copyStart = $edit[1];
-                       $copyEnd = $edit[2];
-                       if ( $start >= $copyEnd || $end <= $copyStart ) {
-                               // Outside this region
-                               $newEdits[] = $edit;
-                               continue;
-                       }
-                       if ( ( $start < $copyStart && $end > $copyStart )
-                               || ( $start < $copyEnd && $end > $copyEnd )
-                       ) {
-                               throw new MWException( "Overlapping regions found, can't do the edit" );
-                       }
-                       // Split the copy
-                       $newEdits[] = array( 'copy', $copyStart, $start );
-                       if ( $newText !== false ) {
-                               $newEdits[] = array( 'insert', $newText );
-                       }
-                       $newEdits[] = array( 'copy', $end, $copyEnd );
-               }
-               $this->edits = $newEdits;
-       }
-
-       /**
-        * Finds the source byte region which you would want to delete, if $pathName
-        * was to be deleted. Includes the leading spaces and tabs, the trailing line
-        * break, and any comments in between.
-        * @param $pathName
-        * @throws MWException
-        * @return array
-        */
-       function findDeletionRegion( $pathName ) {
-               if ( !isset( $this->pathInfo[$pathName] ) ) {
-                       throw new MWException( "Can't find path \"$pathName\"" );
-               }
-               $path = $this->pathInfo[$pathName];
-               // Find the start
-               $this->firstToken();
-               while ( $this->pos != $path['startToken'] ) {
-                       $this->nextToken();
-               }
-               $regionStart = $path['startByte'];
-               for ( $offset = -1; $offset >= -$this->pos; $offset-- ) {
-                       $token = $this->getTokenAhead( $offset );
-                       if ( !$token->isSkip() ) {
-                               // If there is other content on the same line, don't move the start point
-                               // back, because that will cause the regions to overlap.
-                               $regionStart = $path['startByte'];
-                               break;
-                       }
-                       $lfPos = strrpos( $token->text, "\n" );
-                       if ( $lfPos === false ) {
-                               $regionStart -= strlen( $token->text );
-                       } else {
-                               // The line start does not include the LF
-                               $regionStart -= strlen( $token->text ) - $lfPos - 1;
-                               break;
-                       }
-               }
-               // Find the end
-               while ( $this->pos != $path['endToken'] ) {
-                       $this->nextToken();
-               }
-               $regionEnd = $path['endByte']; // past the end
-               $count = count( $this->tokens );
-               for ( $offset = 0; $offset < $count - $this->pos; $offset++ ) {
-                       $token = $this->getTokenAhead( $offset );
-                       if ( !$token->isSkip() ) {
-                               break;
-                       }
-                       $lfPos = strpos( $token->text, "\n" );
-                       if ( $lfPos === false ) {
-                               $regionEnd += strlen( $token->text );
-                       } else {
-                               // This should point past the LF
-                               $regionEnd += $lfPos + 1;
-                               break;
-                       }
-               }
-
-               return array( $regionStart, $regionEnd );
-       }
-
-       /**
-        * Find the byte region in the source corresponding to the value part.
-        * This includes the quotes, but does not include the trailing comma
-        * or semicolon.
-        *
-        * The end position is the past-the-end (end + 1) value as per convention.
-        * @param $pathName
-        * @throws MWException
-        * @return array
-        */
-       function findValueRegion( $pathName ) {
-               if ( !isset( $this->pathInfo[$pathName] ) ) {
-                       throw new MWException( "Can't find path \"$pathName\"" );
-               }
-               $path = $this->pathInfo[$pathName];
-               if ( $path['valueStartByte'] === false || $path['valueEndByte'] === false ) {
-                       throw new MWException( "Can't find value region for path \"$pathName\"" );
-               }
-
-               return array( $path['valueStartByte'], $path['valueEndByte'] );
-       }
-
-       /**
-        * Find the path name of the last element in the array.
-        * If the array is empty, this will return the \@extra interstitial element.
-        * If the specified path is not found or is not an array, it will return false.
-        * @return bool|int|string
-        */
-       function findLastArrayElement( $path ) {
-               // Try for a real element
-               $lastEltPath = false;
-               foreach ( $this->pathInfo as $candidatePath => $info ) {
-                       $part1 = substr( $candidatePath, 0, strlen( $path ) + 1 );
-                       $part2 = substr( $candidatePath, strlen( $path ) + 1, 1 );
-                       if ( $part2 == '@' ) {
-                               // Do nothing
-                       } elseif ( $part1 == "$path/" ) {
-                               $lastEltPath = $candidatePath;
-                       } elseif ( $lastEltPath !== false ) {
-                               break;
-                       }
-               }
-               if ( $lastEltPath !== false ) {
-                       return $lastEltPath;
-               }
-
-               // Try for an interstitial element
-               $extraPath = false;
-               foreach ( $this->pathInfo as $candidatePath => $info ) {
-                       $part1 = substr( $candidatePath, 0, strlen( $path ) + 1 );
-                       if ( $part1 == "$path/" ) {
-                               $extraPath = $candidatePath;
-                       } elseif ( $extraPath !== false ) {
-                               break;
-                       }
-               }
-
-               return $extraPath;
-       }
-
-       /**
-        * Find the path name of first element in the array.
-        * If the array is empty, this will return the \@extra interstitial element.
-        * If the specified path is not found or is not an array, it will return false.
-        * @return bool|int|string
-        */
-       function findFirstArrayElement( $path ) {
-               // Try for an ordinary element
-               foreach ( $this->pathInfo as $candidatePath => $info ) {
-                       $part1 = substr( $candidatePath, 0, strlen( $path ) + 1 );
-                       $part2 = substr( $candidatePath, strlen( $path ) + 1, 1 );
-                       if ( $part1 == "$path/" && $part2 != '@' ) {
-                               return $candidatePath;
-                       }
-               }
-
-               // Try for an interstitial element
-               foreach ( $this->pathInfo as $candidatePath => $info ) {
-                       $part1 = substr( $candidatePath, 0, strlen( $path ) + 1 );
-                       if ( $part1 == "$path/" ) {
-                               return $candidatePath;
-                       }
-               }
-
-               return false;
-       }
-
-       /**
-        * Get the indent string which sits after a given start position.
-        * Returns false if the position is not at the start of the line.
-        * @return array
-        */
-       function getIndent( $pos, $key = false, $arrowPos = false ) {
-               $arrowIndent = ' ';
-               if ( $pos == 0 || $this->text[$pos - 1] == "\n" ) {
-                       $indentLength = strspn( $this->text, " \t", $pos );
-                       $indent = substr( $this->text, $pos, $indentLength );
-               } else {
-                       $indent = false;
-               }
-               if ( $indent !== false && $arrowPos !== false ) {
-                       $arrowIndentLength = $arrowPos - $pos - $indentLength - strlen( $key );
-                       if ( $arrowIndentLength > 0 ) {
-                               $arrowIndent = str_repeat( ' ', $arrowIndentLength );
-                       }
-               }
-
-               return array( $indent, $arrowIndent );
-       }
-
-       /**
-        * Run the parser on the text. Throws an exception if the string does not
-        * match our defined subset of PHP syntax.
-        */
-       public function parse() {
-               $this->initParse();
-               $this->pushState( 'file' );
-               $this->pushPath( '@extra-' . ( $this->serial++ ) );
-               $token = $this->firstToken();
-
-               while ( !$token->isEnd() ) {
-                       $state = $this->popState();
-                       if ( !$state ) {
-                               $this->error( 'internal error: empty state stack' );
-                       }
-
-                       switch ( $state ) {
-                               case 'file':
-                                       $this->expect( T_OPEN_TAG );
-                                       $token = $this->skipSpace();
-                                       if ( $token->isEnd() ) {
-                                               break 2;
-                                       }
-                                       $this->pushState( 'statement', 'file 2' );
-                                       break;
-                               case 'file 2':
-                                       $token = $this->skipSpace();
-                                       if ( $token->isEnd() ) {
-                                               break 2;
-                                       }
-                                       $this->pushState( 'statement', 'file 2' );
-                                       break;
-                               case 'statement':
-                                       $token = $this->skipSpace();
-                                       if ( !$this->validatePath( $token->text ) ) {
-                                               $this->error( "Invalid variable name \"{$token->text}\"" );
-                                       }
-                                       $this->nextPath( $token->text );
-                                       $this->expect( T_VARIABLE );
-                                       $this->skipSpace();
-                                       $arrayAssign = false;
-                                       if ( $this->currentToken()->type == '[' ) {
-                                               $this->nextToken();
-                                               $token = $this->skipSpace();
-                                               if ( !$token->isScalar() ) {
-                                                       $this->error( "expected a string or number for the array key" );
-                                               }
-                                               if ( $token->type == T_CONSTANT_ENCAPSED_STRING ) {
-                                                       $text = $this->parseScalar( $token->text );
-                                               } else {
-                                                       $text = $token->text;
-                                               }
-                                               if ( !$this->validatePath( $text ) ) {
-                                                       $this->error( "Invalid associative array name \"$text\"" );
-                                               }
-                                               $this->pushPath( $text );
-                                               $this->nextToken();
-                                               $this->skipSpace();
-                                               $this->expect( ']' );
-                                               $this->skipSpace();
-                                               $arrayAssign = true;
-                                       }
-                                       $this->expect( '=' );
-                                       $this->skipSpace();
-                                       $this->startPathValue();
-                                       if ( $arrayAssign ) {
-                                               $this->pushState( 'expression', 'array assign end' );
-                                       } else {
-                                               $this->pushState( 'expression', 'statement end' );
-                                       }
-                                       break;
-                               case 'array assign end':
-                               case 'statement end':
-                                       $this->endPathValue();
-                                       if ( $state == 'array assign end' ) {
-                                               $this->popPath();
-                                       }
-                                       $this->skipSpace();
-                                       $this->expect( ';' );
-                                       $this->nextPath( '@extra-' . ( $this->serial++ ) );
-                                       break;
-                               case 'expression':
-                                       $token = $this->skipSpace();
-                                       if ( $token->type == T_ARRAY ) {
-                                               $this->pushState( 'array' );
-                                       } elseif ( $token->isScalar() ) {
-                                               $this->nextToken();
-                                       } elseif ( $token->type == T_VARIABLE ) {
-                                               $this->nextToken();
-                                       } else {
-                                               $this->error( "expected simple expression" );
-                                       }
-                                       break;
-                               case 'array':
-                                       $this->skipSpace();
-                                       $this->expect( T_ARRAY );
-                                       $this->skipSpace();
-                                       $this->expect( '(' );
-                                       $this->skipSpace();
-                                       $this->pushPath( '@extra-' . ( $this->serial++ ) );
-                                       if ( $this->isAhead( ')' ) ) {
-                                               // Empty array
-                                               $this->pushState( 'array end' );
-                                       } else {
-                                               $this->pushState( 'element', 'array end' );
-                                       }
-                                       break;
-                               case 'array end':
-                                       $this->skipSpace();
-                                       $this->popPath();
-                                       $this->expect( ')' );
-                                       break;
-                               case 'element':
-                                       $token = $this->skipSpace();
-                                       // Look ahead to find the double arrow
-                                       if ( $token->isScalar() && $this->isAhead( T_DOUBLE_ARROW, 1 ) ) {
-                                               // Found associative element
-                                               $this->pushState( 'assoc-element', 'element end' );
-                                       } else {
-                                               // Not associative
-                                               $this->nextPath( '@next' );
-                                               $this->startPathValue();
-                                               $this->pushState( 'expression', 'element end' );
-                                       }
-                                       break;
-                               case 'element end':
-                                       $token = $this->skipSpace();
-                                       if ( $token->type == ',' ) {
-                                               $this->endPathValue();
-                                               $this->markComma();
-                                               $this->nextToken();
-                                               $this->nextPath( '@extra-' . ( $this->serial++ ) );
-                                               // Look ahead to find ending bracket
-                                               if ( $this->isAhead( ")" ) ) {
-                                                       // Found ending bracket, no continuation
-                                                       $this->skipSpace();
-                                               } else {
-                                                       // No ending bracket, continue to next element
-                                                       $this->pushState( 'element' );
-                                               }
-                                       } elseif ( $token->type == ')' ) {
-                                               // End array
-                                               $this->endPathValue();
-                                       } else {
-                                               $this->error( "expected the next array element or the end of the array" );
-                                       }
-                                       break;
-                               case 'assoc-element':
-                                       $token = $this->skipSpace();
-                                       if ( !$token->isScalar() ) {
-                                               $this->error( "expected a string or number for the array key" );
-                                       }
-                                       if ( $token->type == T_CONSTANT_ENCAPSED_STRING ) {
-                                               $text = $this->parseScalar( $token->text );
-                                       } else {
-                                               $text = $token->text;
-                                       }
-                                       if ( !$this->validatePath( $text ) ) {
-                                               $this->error( "Invalid associative array name \"$text\"" );
-                                       }
-                                       $this->nextPath( $text );
-                                       $this->nextToken();
-                                       $this->skipSpace();
-                                       $this->markArrow();
-                                       $this->expect( T_DOUBLE_ARROW );
-                                       $this->skipSpace();
-                                       $this->startPathValue();
-                                       $this->pushState( 'expression' );
-                                       break;
-                       }
-               }
-               if ( count( $this->stateStack ) ) {
-                       $this->error( 'unexpected end of file' );
-               }
-               $this->popPath();
-       }
-
-       /**
-        * Initialise a parse.
-        */
-       protected function initParse() {
-               $this->tokens = token_get_all( $this->text );
-               $this->stateStack = array();
-               $this->pathStack = array();
-               $this->firstToken();
-               $this->pathInfo = array();
-               $this->serial = 1;
-       }
-
-       /**
-        * Set the parse position. Do not call this except from firstToken() and
-        * nextToken(), there is more to update than just the position.
-        */
-       protected function setPos( $pos ) {
-               $this->pos = $pos;
-               if ( $this->pos >= count( $this->tokens ) ) {
-                       $this->currentToken = ConfEditorToken::newEnd();
-               } else {
-                       $this->currentToken = $this->newTokenObj( $this->tokens[$this->pos] );
-               }
-
-               return $this->currentToken;
-       }
-
-       /**
-        * Create a ConfEditorToken from an element of token_get_all()
-        * @return ConfEditorToken
-        */
-       function newTokenObj( $internalToken ) {
-               if ( is_array( $internalToken ) ) {
-                       return new ConfEditorToken( $internalToken[0], $internalToken[1] );
-               } else {
-                       return new ConfEditorToken( $internalToken, $internalToken );
-               }
-       }
-
-       /**
-        * Reset the parse position
-        */
-       function firstToken() {
-               $this->setPos( 0 );
-               $this->prevToken = ConfEditorToken::newEnd();
-               $this->lineNum = 1;
-               $this->colNum = 1;
-               $this->byteNum = 0;
-
-               return $this->currentToken;
-       }
-
-       /**
-        * Get the current token
-        */
-       function currentToken() {
-               return $this->currentToken;
-       }
-
-       /**
-        * Advance the current position and return the resulting next token
-        */
-       function nextToken() {
-               if ( $this->currentToken ) {
-                       $text = $this->currentToken->text;
-                       $lfCount = substr_count( $text, "\n" );
-                       if ( $lfCount ) {
-                               $this->lineNum += $lfCount;
-                               $this->colNum = strlen( $text ) - strrpos( $text, "\n" );
-                       } else {
-                               $this->colNum += strlen( $text );
-                       }
-                       $this->byteNum += strlen( $text );
-               }
-               $this->prevToken = $this->currentToken;
-               $this->setPos( $this->pos + 1 );
-
-               return $this->currentToken;
-       }
-
-       /**
-        * Get the token $offset steps ahead of the current position.
-        * $offset may be negative, to get tokens behind the current position.
-        * @return ConfEditorToken
-        */
-       function getTokenAhead( $offset ) {
-               $pos = $this->pos + $offset;
-               if ( $pos >= count( $this->tokens ) || $pos < 0 ) {
-                       return ConfEditorToken::newEnd();
-               } else {
-                       return $this->newTokenObj( $this->tokens[$pos] );
-               }
-       }
-
-       /**
-        * Advances the current position past any whitespace or comments
-        */
-       function skipSpace() {
-               while ( $this->currentToken && $this->currentToken->isSkip() ) {
-                       $this->nextToken();
-               }
-
-               return $this->currentToken;
-       }
-
-       /**
-        * Throws an error if the current token is not of the given type, and
-        * then advances to the next position.
-        */
-       function expect( $type ) {
-               if ( $this->currentToken && $this->currentToken->type == $type ) {
-                       return $this->nextToken();
-               } else {
-                       $this->error( "expected " . $this->getTypeName( $type ) .
-                               ", got " . $this->getTypeName( $this->currentToken->type ) );
-               }
-       }
-
-       /**
-        * Push a state or two on to the state stack.
-        */
-       function pushState( $nextState, $stateAfterThat = null ) {
-               if ( $stateAfterThat !== null ) {
-                       $this->stateStack[] = $stateAfterThat;
-               }
-               $this->stateStack[] = $nextState;
-       }
-
-       /**
-        * Pop a state from the state stack.
-        * @return mixed
-        */
-       function popState() {
-               return array_pop( $this->stateStack );
-       }
-
-       /**
-        * Returns true if the user input path is valid.
-        * This exists to allow "/" and "@" to be reserved for string path keys
-        * @return bool
-        */
-       function validatePath( $path ) {
-               return strpos( $path, '/' ) === false && substr( $path, 0, 1 ) != '@';
-       }
-
-       /**
-        * Internal function to update some things at the end of a path region. Do
-        * not call except from popPath() or nextPath().
-        */
-       function endPath() {
-               $key = '';
-               foreach ( $this->pathStack as $pathInfo ) {
-                       if ( $key !== '' ) {
-                               $key .= '/';
-                       }
-                       $key .= $pathInfo['name'];
-               }
-               $pathInfo['endByte'] = $this->byteNum;
-               $pathInfo['endToken'] = $this->pos;
-               $this->pathInfo[$key] = $pathInfo;
-       }
-
-       /**
-        * Go up to a new path level, for example at the start of an array.
-        */
-       function pushPath( $path ) {
-               $this->pathStack[] = array(
-                       'name' => $path,
-                       'level' => count( $this->pathStack ) + 1,
-                       'startByte' => $this->byteNum,
-                       'startToken' => $this->pos,
-                       'valueStartToken' => false,
-                       'valueStartByte' => false,
-                       'valueEndToken' => false,
-                       'valueEndByte' => false,
-                       'nextArrayIndex' => 0,
-                       'hasComma' => false,
-                       'arrowByte' => false
-               );
-       }
-
-       /**
-        * Go down a path level, for example at the end of an array.
-        */
-       function popPath() {
-               $this->endPath();
-               array_pop( $this->pathStack );
-       }
-
-       /**
-        * Go to the next path on the same level. This ends the current path and
-        * starts a new one. If $path is \@next, the new path is set to the next
-        * numeric array element.
-        */
-       function nextPath( $path ) {
-               $this->endPath();
-               $i = count( $this->pathStack ) - 1;
-               if ( $path == '@next' ) {
-                       $nextArrayIndex =& $this->pathStack[$i]['nextArrayIndex'];
-                       $this->pathStack[$i]['name'] = $nextArrayIndex;
-                       $nextArrayIndex++;
-               } else {
-                       $this->pathStack[$i]['name'] = $path;
-               }
-               $this->pathStack[$i] =
-                       array(
-                               'startByte' => $this->byteNum,
-                               'startToken' => $this->pos,
-                               'valueStartToken' => false,
-                               'valueStartByte' => false,
-                               'valueEndToken' => false,
-                               'valueEndByte' => false,
-                               'hasComma' => false,
-                               'arrowByte' => false,
-                       ) + $this->pathStack[$i];
-       }
-
-       /**
-        * Mark the start of the value part of a path.
-        */
-       function startPathValue() {
-               $path =& $this->pathStack[count( $this->pathStack ) - 1];
-               $path['valueStartToken'] = $this->pos;
-               $path['valueStartByte'] = $this->byteNum;
-       }
-
-       /**
-        * Mark the end of the value part of a path.
-        */
-       function endPathValue() {
-               $path =& $this->pathStack[count( $this->pathStack ) - 1];
-               $path['valueEndToken'] = $this->pos;
-               $path['valueEndByte'] = $this->byteNum;
-       }
-
-       /**
-        * Mark the comma separator in an array element
-        */
-       function markComma() {
-               $path =& $this->pathStack[count( $this->pathStack ) - 1];
-               $path['hasComma'] = true;
-       }
-
-       /**
-        * Mark the arrow separator in an associative array element
-        */
-       function markArrow() {
-               $path =& $this->pathStack[count( $this->pathStack ) - 1];
-               $path['arrowByte'] = $this->byteNum;
-       }
-
-       /**
-        * Generate a parse error
-        */
-       function error( $msg ) {
-               throw new ConfEditorParseError( $this, $msg );
-       }
-
-       /**
-        * Get a readable name for the given token type.
-        * @return string
-        */
-       function getTypeName( $type ) {
-               if ( is_int( $type ) ) {
-                       return token_name( $type );
-               } else {
-                       return "\"$type\"";
-               }
-       }
-
-       /**
-        * Looks ahead to see if the given type is the next token type, starting
-        * from the current position plus the given offset. Skips any intervening
-        * whitespace.
-        * @return bool
-        */
-       function isAhead( $type, $offset = 0 ) {
-               $ahead = $offset;
-               $token = $this->getTokenAhead( $offset );
-               while ( !$token->isEnd() ) {
-                       if ( $token->isSkip() ) {
-                               $ahead++;
-                               $token = $this->getTokenAhead( $ahead );
-                               continue;
-                       } elseif ( $token->type == $type ) {
-                               // Found the type
-                               return true;
-                       } else {
-                               // Not found
-                               return false;
-                       }
-               }
-
-               return false;
-       }
-
-       /**
-        * Get the previous token object
-        */
-       function prevToken() {
-               return $this->prevToken;
-       }
-
-       /**
-        * Echo a reasonably readable representation of the tokenizer array.
-        */
-       function dumpTokens() {
-               $out = '';
-               foreach ( $this->tokens as $token ) {
-                       $obj = $this->newTokenObj( $token );
-                       $out .= sprintf( "%-28s %s\n",
-                               $this->getTypeName( $obj->type ),
-                               addcslashes( $obj->text, "\0..\37" ) );
-               }
-               echo "<pre>" . htmlspecialchars( $out ) . "</pre>";
-       }
-}
-
-/**
- * Exception class for parse errors
- */
-class ConfEditorParseError extends MWException {
-       var $lineNum, $colNum;
-
-       function __construct( $editor, $msg ) {
-               $this->lineNum = $editor->lineNum;
-               $this->colNum = $editor->colNum;
-               parent::__construct( "Parse error on line {$editor->lineNum} " .
-                       "col {$editor->colNum}: $msg" );
-       }
-
-       function highlight( $text ) {
-               $lines = StringUtils::explode( "\n", $text );
-               foreach ( $lines as $lineNum => $line ) {
-                       if ( $lineNum == $this->lineNum - 1 ) {
-                               return "$line\n" . str_repeat( ' ', $this->colNum - 1 ) . "^\n";
-                       }
-               }
-
-               return '';
-       }
-}
-
-/**
- * Class to wrap a token from the tokenizer.
- */
-class ConfEditorToken {
-       var $type, $text;
-
-       static $scalarTypes = array( T_LNUMBER, T_DNUMBER, T_STRING, T_CONSTANT_ENCAPSED_STRING );
-       static $skipTypes = array( T_WHITESPACE, T_COMMENT, T_DOC_COMMENT );
-
-       static function newEnd() {
-               return new self( 'END', '' );
-       }
-
-       function __construct( $type, $text ) {
-               $this->type = $type;
-               $this->text = $text;
-       }
-
-       function isSkip() {
-               return in_array( $this->type, self::$skipTypes );
-       }
-
-       function isScalar() {
-               return in_array( $this->type, self::$scalarTypes );
-       }
-
-       function isEnd() {
-               return $this->type == 'END';
-       }
-}
index 871f71b..6c95985 100644 (file)
@@ -65,6 +65,9 @@ define( 'IP_ADDRESS_STRING',
  * and IP blocks.
  */
 class IP {
+       /** @var IPSet */
+       private static $ipSet = null;
+
        /**
         * Determine if a string is as valid IP address or network (CIDR prefix).
         * SIIT IPv4-translated addresses are rejected.
@@ -299,16 +302,6 @@ class IP {
                }
        }
 
-       /**
-        * Given an unsigned integer, returns an IPv6 address in octet notation
-        *
-        * @param $ip_int String: IP address.
-        * @return String
-        */
-       public static function toOctet( $ip_int ) {
-               return self::hexToOctet( wfBaseConvert( $ip_int, 10, 16, 32, false ) );
-       }
-
        /**
         * Convert an IPv4 or IPv6 hexadecimal representation back to readable format
         *
@@ -372,67 +365,19 @@ class IP {
         * @return Boolean
         */
        public static function isPublic( $ip ) {
-               if ( self::isIPv6( $ip ) ) {
-                       return self::isPublic6( $ip );
-               }
-               $n = self::toUnsigned( $ip );
-               if ( !$n ) {
-                       return false;
-               }
-
-               // ip2long accepts incomplete addresses, as well as some addresses
-               // followed by garbage characters. Check that it's really valid.
-               if ( $ip != long2ip( $n ) ) {
-                       return false;
-               }
-
-               static $privateRanges = false;
-               if ( !$privateRanges ) {
-                       $privateRanges = array(
-                               array( '10.0.0.0', '10.255.255.255' ), # RFC 1918 (private)
-                               array( '172.16.0.0', '172.31.255.255' ), # RFC 1918 (private)
-                               array( '192.168.0.0', '192.168.255.255' ), # RFC 1918 (private)
-                               array( '0.0.0.0', '0.255.255.255' ), # this network
-                               array( '127.0.0.0', '127.255.255.255' ), # loopback
-                       );
-               }
-
-               foreach ( $privateRanges as $r ) {
-                       $start = self::toUnsigned( $r[0] );
-                       $end = self::toUnsigned( $r[1] );
-                       if ( $n >= $start && $n <= $end ) {
-                               return false;
-                       }
-               }
-
-               return true;
-       }
-
-       /**
-        * Determine if an IPv6 address really is an IP address, and if it is public,
-        * i.e. not RFC 4193 or similar
-        *
-        * @param $ip String
-        * @return Boolean
-        */
-       private static function isPublic6( $ip ) {
-               static $privateRanges = false;
-               if ( !$privateRanges ) {
-                       $privateRanges = array(
-                               array( 'fc00::', 'fdff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' ), # RFC 4193 (local)
-                               array( '0:0:0:0:0:0:0:1', '0:0:0:0:0:0:0:1' ), # loopback
-                       );
-               }
-               $n = self::toHex( $ip );
-               foreach ( $privateRanges as $r ) {
-                       $start = self::toHex( $r[0] );
-                       $end = self::toHex( $r[1] );
-                       if ( $n >= $start && $n <= $end ) {
-                               return false;
-                       }
-               }
-
-               return true;
+               static $privateSet = null;
+               if ( !$privateSet ) {
+                       $privateSet = new IPSet( array(
+                               '10.0.0.0/8', # RFC 1918 (private)
+                               '172.16.0.0/12', # RFC 1918 (private)
+                               '192.168.0.0/16', # RFC 1918 (private)
+                               '0.0.0.0/8', # this network
+                               '127.0.0.0/8', # loopback
+                               'fc00::/7', # RFC 4193 (local)
+                               '0:0:0:0:0:0:0:1', # loopback
+                       ) );
+               }
+               return !$privateSet->match( $ip );
        }
 
        /**
@@ -444,7 +389,7 @@ class IP {
         * hexadecimal string which sorts after the IPv4 addresses.
         *
         * @param string $ip quad dotted/octet IP address.
-        * @return String
+        * @return String|bool false on failure
         */
        public static function toHex( $ip ) {
                if ( self::isIPv6( $ip ) ) {
@@ -463,12 +408,12 @@ class IP {
         * Given an IPv6 address in octet notation, returns a pure hex string.
         *
         * @param string $ip octet ipv6 IP address.
-        * @return String: pure hex (uppercase)
+        * @return String|bool pure hex (uppercase); false on failure
         */
        private static function IPv6ToRawHex( $ip ) {
                $ip = self::sanitizeIP( $ip );
                if ( !$ip ) {
-                       return null;
+                       return false;
                }
                $r_ip = '';
                foreach ( explode( ':', $ip ) as $v ) {
@@ -487,7 +432,7 @@ class IP {
         */
        public static function toUnsigned( $ip ) {
                if ( self::isIPv6( $ip ) ) {
-                       $n = self::toUnsigned6( $ip );
+                       $n = wfBaseConvert( self::IPv6ToRawHex( $ip ), 16, 10 );
                } else {
                        // Bug 60035: an IP with leading 0's fails in ip2long sometimes (e.g. *.08)
                        $ip = preg_replace( '/(?<=\.)0+(?=[1-9])/', '', $ip );
@@ -505,14 +450,6 @@ class IP {
                return $n;
        }
 
-       /**
-        * @param $ip
-        * @return String
-        */
-       private static function toUnsigned6( $ip ) {
-               return wfBaseConvert( self::IPv6ToRawHex( $ip ), 16, 10 );
-       }
-
        /**
         * Convert a network specification in CIDR notation
         * to an integer network and a number of bits
@@ -583,13 +520,10 @@ class IP {
                                return self::parseRange6( $range );
                        }
                        if ( self::isIPv4( $start ) && self::isIPv4( $end ) ) {
-                               $start = self::toUnsigned( $start );
-                               $end = self::toUnsigned( $end );
+                               $start = self::toHex( $start );
+                               $end = self::toHex( $end );
                                if ( $start > $end ) {
                                        $start = $end = false;
-                               } else {
-                                       $start = sprintf( '%08X', $start );
-                                       $end = sprintf( '%08X', $end );
                                }
                        } else {
                                $start = $end = false;
@@ -677,17 +611,11 @@ class IP {
        // Explicit range notation...
                } elseif ( strpos( $range, '-' ) !== false ) {
                        list( $start, $end ) = array_map( 'trim', explode( '-', $range, 2 ) );
-                       $start = self::toUnsigned6( $start );
-                       $end = self::toUnsigned6( $end );
+                       $start = self::toHex( $start );
+                       $end = self::toHex( $end );
                        if ( $start > $end ) {
                                $start = $end = false;
-                       } else {
-                               $start = wfBaseConvert( $start, 10, 16, 32, false );
-                               $end = wfBaseConvert( $end, 10, 16, 32, false );
                        }
-                       # see toHex() comment
-                       $start = "v6-$start";
-                       $end = "v6-$end";
                } else {
                        # Single IP
                        $start = $end = self::toHex( $range );
@@ -772,4 +700,53 @@ class IP {
 
                return "$start/$bits";
        }
+
+       /**
+        * Checks if an IP is a trusted proxy provider.
+        * Useful to tell if X-Forwarded-For data is possibly bogus.
+        * Squid cache servers for the site are whitelisted.
+        * @since 1.24
+        *
+        * @param string $ip
+        * @return bool
+        */
+       public static function isTrustedProxy( $ip ) {
+               $trusted = self::isConfiguredProxy( $ip );
+               wfRunHooks( 'IsTrustedProxy', array( &$ip, &$trusted ) );
+               return $trusted;
+       }
+
+       /**
+        * Checks if an IP matches a proxy we've configured
+        * @since 1.24
+        *
+        * @param string $ip
+        * @return bool
+        */
+       public static function isConfiguredProxy( $ip ) {
+               global $wgSquidServers, $wgSquidServersNoPurge;
+
+               wfProfileIn( __METHOD__ );
+               // Quick check of known singular proxy servers
+               $trusted = in_array( $ip, $wgSquidServers );
+
+               // Check against addresses and CIDR nets in the NoPurge list
+               if ( !$trusted ) {
+                       if ( !self::$ipSet ) {
+                               self::$ipSet = new IPSet( $wgSquidServersNoPurge );
+                       }
+                       $trusted = self::$ipSet->match( $ip );
+               }
+               wfProfileOut( __METHOD__ );
+
+               return $trusted;
+       }
+
+       /**
+        * Clears precomputed data used for proxy support.
+        * Use this only for unit tests.
+        */
+       public static function clearCaches() {
+               self::$ipSet = null;
+       }
 }
index c7bb4f3..e2013b0 100644 (file)
@@ -278,7 +278,9 @@ class UIDGenerator {
                if ( ( $flags & self::QUICK_VOLATILE ) && PHP_SAPI !== 'cli' ) {
                        try {
                                $cache = ObjectCache::newAccelerator( array() );
-                       } catch ( MWException $e ) {} // not supported
+                       } catch ( MWException $e ) {
+                               // not supported
+                       }
                }
                if ( $cache ) {
                        $counter = $cache->incr( $bucket, $count );
index 1419bbb..6be186f 100644 (file)
@@ -546,6 +546,9 @@ class ZipDirectoryReader {
         * If there are not enough bytes in the file to satisfy the request, the
         * return value will be truncated. If a request is made for a segment beyond
         * the end of the file, an empty string will be returned.
+        *
+        * @param int $segIndex
+        *
         * @return string
         */
        function getSegment( $segIndex ) {
diff --git a/languages/FakeConverter.php b/languages/FakeConverter.php
new file mode 100644 (file)
index 0000000..47d24dc
--- /dev/null
@@ -0,0 +1,122 @@
+<?php
+/**
+ * Internationalisation code.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Language
+ */
+
+/**
+ * A fake language converter
+ *
+ * @ingroup Language
+ */
+class FakeConverter {
+       /**
+        * @var Language
+        */
+       public $mLang;
+
+       function __construct( $langobj ) {
+               $this->mLang = $langobj;
+       }
+
+       function autoConvert( $text, $variant = false ) {
+               return $text;
+       }
+
+       function autoConvertToAllVariants( $text ) {
+               return array( $this->mLang->getCode() => $text );
+       }
+
+       function convert( $t ) {
+               return $t;
+       }
+
+       function convertTo( $text, $variant ) {
+               return $text;
+       }
+
+       /**
+        * @param Title $t
+        * @return mixed
+        */
+       function convertTitle( $t ) {
+               return $t->getPrefixedText();
+       }
+
+       function convertNamespace( $ns ) {
+               return $this->mLang->getFormattedNsText( $ns );
+       }
+
+       function getVariants() {
+               return array( $this->mLang->getCode() );
+       }
+
+       function getVariantFallbacks( $variant ) {
+               return $this->mLang->getCode();
+       }
+
+       function getPreferredVariant() {
+               return $this->mLang->getCode();
+       }
+
+       function getDefaultVariant() {
+               return $this->mLang->getCode();
+       }
+
+       function getURLVariant() {
+               return '';
+       }
+
+       function getConvRuleTitle() {
+               return false;
+       }
+
+       function findVariantLink( &$l, &$n, $ignoreOtherCond = false ) {
+       }
+
+       function getExtraHashOptions() {
+               return '';
+       }
+
+       function getParsedTitle() {
+               return '';
+       }
+
+       function markNoConversion( $text, $noParse = false ) {
+               return $text;
+       }
+
+       function convertCategoryKey( $key ) {
+               return $key;
+       }
+
+       /** @deprecated since 1.22 is no longer used */
+       function armourMath( $text ) {
+               return $text;
+       }
+
+       function validateVariant( $variant = null ) {
+               return $variant === $this->mLang->getCode() ? $variant : null;
+       }
+
+       function translate( $text, $variant ) {
+               return $text;
+       }
+}
index 6400786..38d3af5 100644 (file)
@@ -34,46 +34,11 @@ if ( function_exists( 'mb_strtoupper' ) ) {
        mb_internal_encoding( 'UTF-8' );
 }
 
-/**
- * a fake language converter
- *
- * @ingroup Language
- */
-class FakeConverter {
-       /**
-        * @var Language
-        */
-       public $mLang;
-       function __construct( $langobj ) { $this->mLang = $langobj; }
-       function autoConvert( $text, $variant = false ) { return $text; }
-       function autoConvertToAllVariants( $text ) { return array( $this->mLang->getCode() => $text ); }
-       function convert( $t ) { return $t; }
-       function convertTo( $text, $variant ) { return $text; }
-       function convertTitle( $t ) { return $t->getPrefixedText(); }
-       function convertNamespace( $ns ) { return $this->mLang->getFormattedNsText( $ns ); }
-       function getVariants() { return array( $this->mLang->getCode() ); }
-       function getVariantFallbacks( $variant ) { return $this->mLang->getCode(); }
-       function getPreferredVariant() { return $this->mLang->getCode(); }
-       function getDefaultVariant() { return $this->mLang->getCode(); }
-       function getURLVariant() { return ''; }
-       function getConvRuleTitle() { return false; }
-       function findVariantLink( &$l, &$n, $ignoreOtherCond = false ) { }
-       function getExtraHashOptions() { return ''; }
-       function getParsedTitle() { return ''; }
-       function markNoConversion( $text, $noParse = false ) { return $text; }
-       function convertCategoryKey( $key ) { return $key; }
-       /** @deprecated since 1.22 is no longer used */
-       function armourMath( $text ) { return $text; }
-       function validateVariant( $variant = null ) { return $variant === $this->mLang->getCode() ? $variant : null; }
-       function translate( $text, $variant ) { return $text; }
-}
-
 /**
  * Internationalisation code
  * @ingroup Language
  */
 class Language {
-
        /**
         * @var LanguageConverter
         */
@@ -475,7 +440,8 @@ class Language {
         * Hook which will be called if this is the content language.
         * Descendants can use this to register hook functions or modify globals
         */
-       function initContLang() { }
+       function initContLang() {
+       }
 
        /**
         * Same as getFallbacksFor for current language.
@@ -484,6 +450,7 @@ class Language {
         */
        function getFallbackLanguageCode() {
                wfDeprecated( __METHOD__, '1.19' );
+
                return self::getFallbackFor( $this->mCode );
        }
 
@@ -540,6 +507,7 @@ class Language {
 
                        wfRunHooks( 'LanguageGetNamespaces', array( &$this->namespaceNames ) );
                }
+
                return $this->namespaceNames;
        }
 
@@ -589,6 +557,7 @@ class Language {
         */
        function getNsText( $index ) {
                $ns = $this->getNamespaces();
+
                return isset( $ns[$index] ) ? $ns[$index] : false;
        }
 
@@ -607,6 +576,7 @@ class Language {
         */
        function getFormattedNsText( $index ) {
                $ns = $this->getNsText( $index );
+
                return strtr( $ns, '_', ' ' );
        }
 
@@ -621,7 +591,9 @@ class Language {
        function getGenderNsText( $index, $gender ) {
                global $wgExtraGenderNamespaces;
 
-               $ns = $wgExtraGenderNamespaces + self::$dataCache->getItem( $this->mCode, 'namespaceGenderAliases' );
+               $ns = $wgExtraGenderNamespaces +
+                       self::$dataCache->getItem( $this->mCode, 'namespaceGenderAliases' );
+
                return isset( $ns[$index][$gender] ) ? $ns[$index][$gender] : $this->getNsText( $index );
        }
 
@@ -680,7 +652,8 @@ class Language {
                        }
 
                        global $wgExtraGenderNamespaces;
-                       $genders = $wgExtraGenderNamespaces + (array)self::$dataCache->getItem( $this->mCode, 'namespaceGenderAliases' );
+                       $genders = $wgExtraGenderNamespaces +
+                               (array)self::$dataCache->getItem( $this->mCode, 'namespaceGenderAliases' );
                        foreach ( $genders as $index => $forms ) {
                                foreach ( $forms as $alias ) {
                                        $aliases[$alias] = $index;
@@ -700,6 +673,7 @@ class Language {
 
                        $this->namespaceAliases = $aliases + $convertedNames;
                }
+
                return $this->namespaceAliases;
        }
 
@@ -1143,14 +1117,21 @@ class Language {
                        throw new MWException( __METHOD__ . ": The timestamp $ts should be a number" );
                }
 
-               for ( $p = 0; $p < strlen( $format ); $p++ ) {
+               $formatLength = strlen( $format );
+               for ( $p = 0; $p < $formatLength; $p++ ) {
                        $num = false;
                        $code = $format[$p];
-                       if ( $code == 'x' && $p < strlen( $format ) - 1 ) {
+                       if ( $code == 'x' && $p < $formatLength - 1 ) {
                                $code .= $format[++$p];
                        }
 
-                       if ( ( $code === 'xi' || $code == 'xj' || $code == 'xk' || $code == 'xm' || $code == 'xo' || $code == 'xt' ) && $p < strlen( $format ) - 1 ) {
+                       if ( ( $code === 'xi'
+                                       || $code === 'xj'
+                                       || $code === 'xk'
+                                       || $code === 'xm'
+                                       || $code === 'xo'
+                                       || $code === 'xt' )
+                               && $p < $formatLength - 1 ) {
                                $code .= $format[++$p];
                        }
 
@@ -1381,7 +1362,7 @@ class Language {
                                        break;
                                case '\\':
                                        # Backslash escaping
-                                       if ( $p < strlen( $format ) - 1 ) {
+                                       if ( $p < $formatLength - 1 ) {
                                                $s .= $format[++$p];
                                        } else {
                                                $s .= '\\';
@@ -1389,7 +1370,7 @@ class Language {
                                        break;
                                case '"':
                                        # Quoted literal
-                                       if ( $p < strlen( $format ) - 1 ) {
+                                       if ( $p < $formatLength - 1 ) {
                                                $endQuote = strpos( $format, '"', $p + 1 );
                                                if ( $endQuote === false ) {
                                                        # No terminating quote, assume literal "
@@ -1421,6 +1402,7 @@ class Language {
                                }
                        }
                }
+
                return $s;
        }
 
@@ -1523,8 +1505,10 @@ class Language {
                $zl = $zjd -1948440 + 10632;
                $zn = (int)( ( $zl - 1 ) / 10631 );
                $zl = $zl - 10631 * $zn + 354;
-               $zj = ( (int)( ( 10985 - $zl ) / 5316 ) ) * ( (int)( ( 50 * $zl ) / 17719 ) ) + ( (int)( $zl / 5670 ) ) * ( (int)( ( 43 * $zl ) / 15238 ) );
-               $zl = $zl - ( (int)( ( 30 - $zj ) / 15 ) ) * ( (int)( ( 17719 * $zj ) / 50 ) ) - ( (int)( $zj / 16 ) ) * ( (int)( ( 15238 * $zj ) / 43 ) ) + 29;
+               $zj = ( (int)( ( 10985 - $zl ) / 5316 ) ) * ( (int)( ( 50 * $zl ) / 17719 ) ) +
+                       ( (int)( $zl / 5670 ) ) * ( (int)( ( 43 * $zl ) / 15238 ) );
+               $zl = $zl - ( (int)( ( 30 - $zj ) / 15 ) ) * ( (int)( ( 17719 * $zj ) / 50 ) ) -
+                       ( (int)( $zj / 16 ) ) * ( (int)( ( 15238 * $zj ) / 43 ) ) + 29;
                $zm = (int)( ( 24 * $zl ) / 709 );
                $zd = $zl - (int)( ( 709 * $zm ) / 24 );
                $zy = 30 * $zn + $zj - 30;
@@ -1746,7 +1730,10 @@ class Language {
                        # Deduct years from the Gregorian calendar
                        # depending on the nengo periods
                        # Months and days are identical
-                       if ( ( $gy < 1912 ) || ( ( $gy == 1912 ) && ( $gm < 7 ) ) || ( ( $gy == 1912 ) && ( $gm == 7 ) && ( $gd < 31 ) ) ) {
+                       if ( ( $gy < 1912 )
+                               || ( ( $gy == 1912 ) && ( $gm < 7 ) )
+                               || ( ( $gy == 1912 ) && ( $gm == 7 ) && ( $gd < 31 ) )
+                       ) {
                                # Meiji period
                                $gy_gannen = $gy - 1868 + 1;
                                $gy_offset = $gy_gannen;
@@ -1808,7 +1795,8 @@ class Language {
                        array( '', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX', 'X' ),
                        array( '', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC', 'C' ),
                        array( '', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM', 'M' ),
-                       array( '', 'M', 'MM', 'MMM', 'MMMM', 'MMMMM', 'MMMMMM', 'MMMMMMM', 'MMMMMMMM', 'MMMMMMMMM', 'MMMMMMMMMM' )
+                       array( '', 'M', 'MM', 'MMM', 'MMMM', 'MMMMM', 'MMMMMM', 'MMMMMMM',
+                               'MMMMMMMM', 'MMMMMMMMM', 'MMMMMMMMMM' )
                );
 
                $num = intval( $num );
@@ -1920,12 +1908,9 @@ class Language {
                        $data[0] = 'Offset';
                }
 
-               $minDiff = 0;
                if ( $data[0] == 'System' || $tz == '' ) {
-                       #  Global offset in minutes.
-                       if ( isset( $wgLocalTZoffset ) ) {
-                               $minDiff = $wgLocalTZoffset;
-                       }
+                       # Global offset in minutes.
+                       $minDiff = $wgLocalTZoffset;
                } elseif ( $data[0] == 'Offset' ) {
                        $minDiff = intval( $data[1] );
                } else {
@@ -2130,7 +2115,16 @@ class Language {
         */
        public function getDurationIntervals( $seconds, array $chosenIntervals = array() ) {
                if ( empty( $chosenIntervals ) ) {
-                       $chosenIntervals = array( 'millennia', 'centuries', 'decades', 'years', 'days', 'hours', 'minutes', 'seconds' );
+                       $chosenIntervals = array(
+                               'millennia',
+                               'centuries',
+                               'decades',
+                               'years',
+                               'days',
+                               'hours',
+                               'minutes',
+                               'seconds'
+                       );
                }
 
                $intervals = array_intersect_key( self::$durationIntervals, array_flip( $chosenIntervals ) );
@@ -2276,9 +2270,12 @@ class Language {
         */
        public function getHumanTimestamp( MWTimestamp $ts, MWTimestamp $relativeTo, User $user ) {
                $diff = $ts->diff( $relativeTo );
-               $diffDay = (bool)( (int)$ts->timestamp->format( 'w' ) - (int)$relativeTo->timestamp->format( 'w' ) );
+               $diffDay = (bool)( (int)$ts->timestamp->format( 'w' ) -
+                       (int)$relativeTo->timestamp->format( 'w' ) );
                $days = $diff->days ?: (int)$diffDay;
-               if ( $diff->invert || $days > 5 && $ts->timestamp->format( 'Y' ) !== $relativeTo->timestamp->format( 'Y' ) ) {
+               if ( $diff->invert || $days > 5
+                       && $ts->timestamp->format( 'Y' ) !== $relativeTo->timestamp->format( 'Y' )
+               ) {
                        // Timestamps are in different years: use full timestamp
                        // Also do full timestamp for future dates
                        /**
@@ -2574,7 +2571,8 @@ class Language {
                        $breaks = "[ \-\(\)\}\{\.,\?!]";
 
                        // find first letter after word break
-                       $replaceRegexp = "/^([a-z]|[\\xc0-\\xff][\\x80-\\xbf]*)|$breaks([a-z]|[\\xc0-\\xff][\\x80-\\xbf]*)/";
+                       $replaceRegexp = "/^([a-z]|[\\xc0-\\xff][\\x80-\\xbf]*)|" .
+                               "$breaks([a-z]|[\\xc0-\\xff][\\x80-\\xbf]*)/";
 
                        if ( function_exists( 'mb_strtoupper' ) ) {
                                return preg_replace_callback(
@@ -2952,7 +2950,8 @@ class Language {
        /**
         * An arrow, depending on the language direction.
         *
-        * @param string $direction The direction of the arrow: forwards (default), backwards, left, right, up, down.
+        * @param string $direction The direction of the arrow: forwards (default),
+        *   backwards, left, right, up, down.
         * @return string
         */
        function getArrow( $direction = 'forwards' ) {
@@ -3046,6 +3045,7 @@ class Language {
        /**
         * Get special page names, as an associative array
         *   case folded alias => real name
+        * @return array
         */
        function getSpecialPageAliases() {
                // Cache aliases because it may be slow to load them
@@ -3128,14 +3128,18 @@ class Language {
         * @param string $number
         * @return string
         */
-       function parseFormattedNumber( $number ) {
+       public function parseFormattedNumber( $number ) {
                $s = $this->digitTransformTable();
                if ( $s ) {
+                       // eliminate empty array values such as ''. (bug 64347)
+                       $s = array_filter( $s );
                        $number = strtr( $number, array_flip( $s ) );
                }
 
                $s = $this->separatorTransformTable();
                if ( $s ) {
+                       // eliminate empty array values such as ''. (bug 64347)
+                       $s = array_filter( $s );
                        $number = strtr( $number, array_flip( $s ) );
                }
 
@@ -3574,6 +3578,7 @@ class Language {
                if ( isset( $wgGrammarForms[$this->getCode()][$case][$word] ) ) {
                        return $wgGrammarForms[$this->getCode()][$case][$word];
                }
+
                return $word;
        }
        /**
@@ -3583,9 +3588,12 @@ class Language {
         */
        function getGrammarForms() {
                global $wgGrammarForms;
-               if ( isset( $wgGrammarForms[$this->getCode()] ) && is_array( $wgGrammarForms[$this->getCode()] ) ) {
+               if ( isset( $wgGrammarForms[$this->getCode()] )
+                       && is_array( $wgGrammarForms[$this->getCode()] )
+               ) {
                        return $wgGrammarForms[$this->getCode()];
                }
+
                return array();
        }
        /**
@@ -4102,7 +4110,7 @@ class Language {
                        throw new MWException( "Invalid language code \"$code\"" );
                }
 
-               return "$IP/languages/i18n/$code.json" ;
+               return "$IP/languages/i18n/$code.json";
        }
 
        /**
@@ -4301,10 +4309,12 @@ class Language {
         * @todo Document
         * @param int|float $seconds
         * @param array $format Optional
-        *              If $format['avoid'] == 'avoidseconds' - don't mention seconds if $seconds >= 1 hour
-        *              If $format['avoid'] == 'avoidminutes' - don't mention seconds/minutes if $seconds > 48 hours
-        *              If $format['noabbrevs'] is true - use 'seconds' and friends instead of 'seconds-abbrev' and friends
-        *              For backwards compatibility, $format may also be one of the strings 'avoidseconds' or 'avoidminutes'
+        *   If $format['avoid'] === 'avoidseconds': don't mention seconds if $seconds >= 1 hour.
+        *   If $format['avoid'] === 'avoidminutes': don't mention seconds/minutes if $seconds > 48 hours.
+        *   If $format['noabbrevs'] is true: use 'seconds' and friends instead of 'seconds-abbrev'
+        *     and friends.
+        *   For backwards compatibility, $format may also be one of the strings 'avoidseconds'
+        *     or 'avoidminutes'.
         * @return string
         */
        function formatTimePeriod( $seconds, $format = array() ) {
@@ -4398,10 +4408,11 @@ class Language {
 
        /**
         * Format a bitrate for output, using an appropriate
-        * unit (bps, kbps, Mbps, Gbps, Tbps, Pbps, Ebps, Zbps or Ybps) according to the magnitude in question
+        * unit (bps, kbps, Mbps, Gbps, Tbps, Pbps, Ebps, Zbps or Ybps) according to
+        *   the magnitude in question.
         *
         * This use base 1000. For base 1024 use formatSize(), for another base
-        * see formatComputingNumbers()
+        * see formatComputingNumbers().
         *
         * @param int $bps
         * @return string
@@ -4485,7 +4496,9 @@ class Language {
         * @param bool $atend Optional param for specified if this is the last page
         * @return string
         */
-       public function viewPrevNext( Title $title, $offset, $limit, array $query = array(), $atend = false ) {
+       public function viewPrevNext( Title $title, $offset, $limit,
+               array $query = array(), $atend = false
+       ) {
                // @todo FIXME: Why on earth this needs one message for the text and another one for tooltip?
 
                # Make 'previous' link
@@ -4529,9 +4542,13 @@ class Language {
         * @param string $class Value of the "class" attribute of the link
         * @return string HTML fragment
         */
-       private function numLink( Title $title, $offset, $limit, array $query, $link, $tooltipMsg, $class ) {
+       private function numLink( Title $title, $offset, $limit, array $query, $link,
+               $tooltipMsg, $class
+       ) {
                $query = array( 'limit' => $limit, 'offset' => $offset ) + $query;
-               $tooltip = wfMessage( $tooltipMsg )->inLanguage( $this )->title( $title )->numParams( $limit )->text();
+               $tooltip = wfMessage( $tooltipMsg )->inLanguage( $this )->title( $title )
+                       ->numParams( $limit )->text();
+
                return Html::element( 'a', array( 'href' => $title->getLocalURL( $query ),
                        'title' => $tooltip, 'class' => $class ), $link );
        }
index 92cf68c..65d74e9 100644 (file)
  * @ingroup Language
  *
  * @author Zhengzhu Feng <zhengzhu@gmail.com>
- * @maintainers fdcn <fdcn64@gmail.com>, shinjiman <shinjiman@gmail.com>, PhiLiP <philip.npc@gmail.com>
+ * @author fdcn <fdcn64@gmail.com>
+ * @author shinjiman <shinjiman@gmail.com>
+ * @author PhiLiP <philip.npc@gmail.com>
  */
 class LanguageConverter {
-
        /**
         * languages supporting variants
         * @since 1.20
@@ -753,6 +754,9 @@ class LanguageConverter {
                global $wgDisableLangConversion, $wgDisableTitleConversion, $wgRequest;
                $isredir = $wgRequest->getText( 'redirect', 'yes' );
                $action = $wgRequest->getText( 'action' );
+               if ( $action == 'edit' && $wgRequest->getBool( 'redlink' ) ) {
+                       $action = 'view';
+               }
                $linkconvert = $wgRequest->getText( 'linkconvert', 'yes' );
                $disableLinkConversion = $wgDisableLangConversion
                        || $wgDisableTitleConversion;
@@ -809,6 +813,7 @@ class LanguageConverter {
         */
        public function getExtraHashOptions() {
                $variant = $this->getPreferredVariant();
+
                return '!' . $variant;
        }
 
@@ -835,6 +840,7 @@ class LanguageConverter {
         */
        function loadDefaultTables() {
                $name = get_class( $this );
+
                throw new MWException( "Must implement loadDefaultTables() method in class $name" );
        }
 
@@ -881,7 +887,8 @@ class LanguageConverter {
        /**
         * Hook for post processing after conversion tables are loaded.
         */
-       function postLoadTables() { }
+       function postLoadTables() {
+       }
 
        /**
         * Reload the conversion tables.
@@ -892,6 +899,7 @@ class LanguageConverter {
                if ( $this->mTables ) {
                        unset( $this->mTables );
                }
+
                $this->mTablesLoaded = false;
                $this->loadTables( false );
        }
index cf93d2d..ac59380 100644 (file)
@@ -30,7 +30,9 @@
  * @ingroup Language
  * @see http://be-x-old.wikipedia.org/wiki/Project_talk:LanguageBe_tarask.php
  */
+// @codingStandardsIgnoreStart Ignore class name is not in camel caps format error
 class LanguageBe_tarask extends Language {
+       // @codingStandardsIgnoreEnd
        /**
         * The Belarusian language uses apostrophe sign,
         * but the characters used for this could be both U+0027 and U+2019.
index 584f304..de9c7dc 100644 (file)
@@ -27,7 +27,6 @@
  * @ingroup Language
  */
 class LanguageBs extends Language {
-
        /**
         * Convert from the nominative form of a noun to some other case
         * Invoked with {{GRAMMAR:case|word}}
@@ -53,6 +52,8 @@ class LanguageBs extends Language {
                        break;
                }
 
-               return $word; # this will return the original value for 'nominativ' (nominative) and all undefined case values
+               # this will return the original value for 'nominativ' (nominative)
+               # and all undefined case values.
+               return $word;
        }
 }
index abe70e3..650f1ba 100644 (file)
@@ -27,7 +27,6 @@
  * @ingroup Language
  */
 class LanguageCu extends Language {
-
        /**
         * Convert from the nominative form of a noun to some other case
         * Invoked with {{grammar:case|word}}
@@ -38,12 +37,14 @@ class LanguageCu extends Language {
         */
        function convertGrammar( $word, $case ) {
                global $wgGrammarForms;
+
                if ( isset( $wgGrammarForms['сu'][$case][$word] ) ) {
                        return $wgGrammarForms['сu'][$case][$word];
                }
 
-               # These rules are not perfect, but they are currently only used for site names so it doesn't
-               # matter if they are wrong sometimes. Just add a special case for your site name if necessary.
+               # These rules are not perfect, but they are currently only used for
+               # site names so it doesn't matter if they are wrong sometimes. Just add
+               # a special case for your site name if necessary.
 
                # join and array_slice instead mb_substr
                $ar = array();
@@ -51,7 +52,9 @@ class LanguageCu extends Language {
                if ( !preg_match( "/[a-zA-Z_]/us", $word ) ) {
                        switch ( $case ) {
                                case 'genitive': # родительный падеж
-                                       if ( ( join( '', array_slice( $ar[0], -4 ) ) == 'вики' ) || ( join( '', array_slice( $ar[0], -4 ) ) == 'Вики' ) ) {
+                                       if ( ( join( '', array_slice( $ar[0], -4 ) ) == 'вики' )
+                                               || ( join( '', array_slice( $ar[0], -4 ) ) == 'Вики' )
+                                       ) {
                                        } elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'ї' ) {
                                                $word = join( '', array_slice( $ar[0], 0, -2 ) ) . 'їѩ';
                                        }
@@ -61,6 +64,7 @@ class LanguageCu extends Language {
                                        break;
                        }
                }
+
                return $word;
        }
 }
index 21ff428..2a21307 100644 (file)
@@ -28,7 +28,6 @@
  * @ingroup Language
  */
 class LanguageDsb extends Language {
-
        /**
         * Convert from the nominative form of a noun to some other case
         * Invoked with {{grammar:case|word}}
@@ -51,7 +50,8 @@ class LanguageDsb extends Language {
                                break;
                }
 
-               return $word; # this will return the original value for 'nominatiw' (nominativ) and all undefined case values
+               # this will return the original value for 'nominatiw' (nominativ) and
+               # all undefined case values.
+               return $word;
        }
-
 }
index 910e8ae..2379cac 100644 (file)
@@ -28,7 +28,6 @@
  * @ingroup Language
  */
 class LanguageFi extends Language {
-
        /**
         * Convert from the nominative form of a noun to some other case
         * Invoked with {{grammar:case|word}}
@@ -92,13 +91,16 @@ class LanguageFi extends Language {
        function translateBlockExpiry( $str, $forContent = false ) {
                /*
                        'ago', 'now', 'today', 'this', 'next',
-                       'first', 'third', 'fourth', 'fifth', 'sixth', 'seventh', 'eighth', 'ninth', 'tenth', 'eleventh', 'twelfth',
+                       'first', 'third', 'fourth', 'fifth', 'sixth', 'seventh', 'eighth', 'ninth',
+                               'tenth', 'eleventh', 'twelfth',
                        'tomorrow', 'yesterday'
 
-                       $months = 'january:tammikuu,february:helmikuu,march:maaliskuu,april:huhtikuu,may:toukokuu,june:kesäkuu,' .
-                               'july:heinäkuu,august:elokuu,september:syyskuu,october:lokakuu,november:marraskuu,december:joulukuu,' .
-                               'jan:tammikuu,feb:helmikuu,mar:maaliskuu,apr:huhtikuu,jun:kesäkuu,jul:heinäkuu,aug:elokuu,sep:syyskuu,'.
-                               'oct:lokakuu,nov:marraskuu,dec:joulukuu,sept:syyskuu';
+                       $months = 'january:tammikuu,february:helmikuu,march:maaliskuu,april:huhtikuu,' .
+                               'may:toukokuu,june:kesäkuu,july:heinäkuu,august:elokuu,september:syyskuu,' .
+                               'october:lokakuu,november:marraskuu,december:joulukuu,' .
+                               'jan:tammikuu,feb:helmikuu,mar:maaliskuu,apr:huhtikuu,jun:kesäkuu,' .
+                               'jul:heinäkuu,aug:elokuu,sep:syyskuu,oct:lokakuu,nov:marraskuu,' .
+                               dec:joulukuu,sept:syyskuu';
                */
                $weekds = array(
                        'monday' => 'maanantai',
index e298c0b..a012f59 100644 (file)
@@ -28,7 +28,6 @@ require_once __DIR__ . '/LanguageZh.php';
  * @ingroup Language
  */
 class GanConverter extends LanguageConverter {
-
        /**
         * @param Language $langobj
         * @param string $maincode
@@ -38,17 +37,17 @@ class GanConverter extends LanguageConverter {
         * @param array $manualLevel
         */
        function __construct( $langobj, $maincode,
-                                                               $variants = array(),
-                                                               $variantfallbacks = array(),
-                                                               $flags = array(),
-                                                               $manualLevel = array() ) {
+               $variants = array(),
+               $variantfallbacks = array(),
+               $flags = array(),
+               $manualLevel = array() ) {
                $this->mDescCodeSep = ':';
                $this->mDescVarSep = ';';
                parent::__construct( $langobj, $maincode,
-                                                                       $variants,
-                                                                       $variantfallbacks,
-                                                                       $flags,
-                                                                       $manualLevel );
+                       $variants,
+                       $variantfallbacks,
+                       $flags,
+                       $manualLevel );
                $names = array(
                        'gan' => '原文',
                        'gan-hans' => '简体',
@@ -82,7 +81,6 @@ class GanConverter extends LanguageConverter {
  * @ingroup Language
  */
 class LanguageGan extends LanguageZh {
-
        function __construct() {
                global $wgHooks;
                parent::__construct();
@@ -98,9 +96,9 @@ class LanguageGan extends LanguageZh {
                );
 
                $this->mConverter = new GanConverter( $this, 'gan',
-                                                               $variants, $variantfallbacks,
-                                                               array(),
-                                                               $ml );
+                       $variants, $variantfallbacks,
+                       array(),
+                       $ml );
 
                $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
        }
index acf0122..a862d42 100644 (file)
@@ -27,7 +27,6 @@
  * @ingroup Language
  */
 class LanguageHsb extends Language {
-
        /**
         * Convert from the nominative form of a noun to some other case
         * Invoked with {{grammar:case|word}}
@@ -51,7 +50,8 @@ class LanguageHsb extends Language {
                                break;
                }
 
-               return $word; # this will return the original value for 'nominatiw' (nominativ) and all undefined case values
+               # this will return the original value for 'nominatiw' (nominativ) and
+               # all undefined case values.
+               return $word;
        }
-
 }
index 28b1ce1..4c956f0 100644 (file)
@@ -36,26 +36,27 @@ require_once __DIR__ . '/../LanguageConverter.php';
  * @ingroup Language
  */
 class IuConverter extends LanguageConverter {
-
        protected $mDoContentConvert;
+
        public $mToLatin = array(
                'ᐦ' => 'h', 'ᐃ' => 'i', 'ᐄ' => 'ii', 'ᐅ' => 'u', 'ᐆ' => 'uu', 'ᐊ' => 'a', 'ᐋ' => 'aa',
                'ᑉ' => 'p', 'ᐱ' => 'pi', 'ᐲ' => 'pii', 'ᐳ' => 'pu', 'ᐴ' => 'puu', 'ᐸ' => 'pa', 'ᐹ' => 'paa',
                'ᑦ' => 't', 'ᑎ' => 'ti', 'ᑏ' => 'tii', 'ᑐ' => 'tu', 'ᑑ' => 'tuu', 'ᑕ' => 'ta', 'ᑖ' => 'taa',
                'ᒃ' => 'k', 'ᑭ' => 'ki', 'ᑮ' => 'kii', 'ᑯ' => 'ku', 'ᑰ' => 'kuu', 'ᑲ' => 'ka', 'ᑳ' => 'kaa',
-               'ᖅᒃ' => 'qq', 'ᖅᑭ' => 'qqi', 'ᖅᑮ' => 'qqii', 'ᖅᑯ' => 'qqu', 'ᖅᑰ' => 'ᖅqquu', 'ᖅᑲ' => 'qqa', 'ᖅᑳ' => 'qqaa',
-               'ᒡ' => 'g', 'ᒋ' => 'gi', 'ᒌ' => 'gii', 'ᒍ' => 'gu', 'ᒎ' => 'guu', 'ᒐ' => 'ga', 'ᒑ' => 'gaa',
-               'ᒻ' => 'm', 'ᒥ' => 'mi', 'ᒦ' => 'mii', 'ᒧ' => 'mu', 'ᒨ' => 'muu', 'ᒪ' => 'ma', 'ᒫ' => 'maa',
-               'ᓐ' => 'n', 'ᓂ' => 'ni', 'ᓃ' => 'nii', 'ᓄ' => 'nu', 'ᓅ' => 'nuu', 'ᓇ' => 'na', 'ᓈ' => 'naa',
-               'ᔅ' => 's', 'ᓯ' => 'si', 'ᓰ' => 'sii', 'ᓱ' => 'su', 'ᓲ' => 'suu', 'ᓴ' => 'sa', 'ᓵ' => 'saa',
-               'ᓪ' => 'l', 'ᓕ' => 'li', 'ᓖ' => 'lii', 'ᓗ' => 'lu', 'ᓘ' => 'luu', 'ᓚ' => 'la', 'ᓛ' => 'laa',
-               'ᔾ' => 'j', 'ᔨ' => 'ji', 'ᔩ' => 'jii', 'ᔪ' => 'ju', 'ᔫ' => 'juu', 'ᔭ' => 'ja', 'ᔮ' => 'jaa',
-               'ᕝ' => 'v', 'ᕕ' => 'vi', 'ᕖ' => 'vii', 'ᕗ' => 'vu', 'ᕘ' => 'vuu', 'ᕙ' => 'va', 'ᕚ' => 'vaa',
-               'ᕐ' => 'r', 'ᕆ' => 'ri', 'ᕇ' => 'rii', 'ᕈ' => 'ru', 'ᕉ' => 'ruu', 'ᕋ' => 'ra', 'ᕌ' => 'raa',
-               'ᖅ' => 'q', 'ᕿ' => 'qi', 'ᖀ' => 'qii', 'ᖁ' => 'qu', 'ᖂ' => 'quu', 'ᖃ' => 'qa', 'ᖄ' => 'qaa',
-               'ᖕ' => 'ng', 'ᖏ' => 'ngi', 'ᖐ' => 'ngii', 'ᖑ' => 'ngu', 'ᖒ' => 'nguu', 'ᖓ' => 'nga', 'ᖔ' => 'ngaa',
-               'ᖖ' => 'nng', 'ᙱ' => 'nngi', 'ᙲ' => 'nngii', 'ᙳ' => 'nngu', 'ᙴ' => 'nnguu', 'ᙵ' => 'nnga', 'ᙶ' => 'nngaa',
-               'ᖦ' => 'ɫ', 'ᖠ' => 'ɫi', 'ᖡ' => 'ɫii', 'ᖢ' => 'ɫu', 'ᖣ' => 'ɫuu', 'ᖤ' => 'ɫa', 'ᖥ' => 'ɫaa',
+               'ᖅᒃ' => 'qq', 'ᖅᑭ' => 'qqi', 'ᖅᑮ' => 'qqii', 'ᖅᑯ' => 'qqu', 'ᖅᑰ' => 'ᖅqquu', 'ᖅᑲ' => 'qqa',
+               'ᖅᑳ' => 'qqaa', 'ᒡ' => 'g', 'ᒋ' => 'gi', 'ᒌ' => 'gii', 'ᒍ' => 'gu', 'ᒎ' => 'guu',
+               'ᒐ' => 'ga', 'ᒑ' => 'gaa', 'ᒻ' => 'm', 'ᒥ' => 'mi', 'ᒦ' => 'mii', 'ᒧ' => 'mu', 'ᒨ' => 'muu',
+               'ᒪ' => 'ma', 'ᒫ' => 'maa', 'ᓐ' => 'n', 'ᓂ' => 'ni', 'ᓃ' => 'nii', 'ᓄ' => 'nu', 'ᓅ' => 'nuu',
+               'ᓇ' => 'na', 'ᓈ' => 'naa', 'ᔅ' => 's', 'ᓯ' => 'si', 'ᓰ' => 'sii', 'ᓱ' => 'su', 'ᓲ' => 'suu',
+               'ᓴ' => 'sa', 'ᓵ' => 'saa', 'ᓪ' => 'l', 'ᓕ' => 'li', 'ᓖ' => 'lii', 'ᓗ' => 'lu', 'ᓘ' => 'luu',
+               'ᓚ' => 'la', 'ᓛ' => 'laa', 'ᔾ' => 'j', 'ᔨ' => 'ji', 'ᔩ' => 'jii', 'ᔪ' => 'ju', 'ᔫ' => 'juu',
+               'ᔭ' => 'ja', 'ᔮ' => 'jaa', 'ᕝ' => 'v', 'ᕕ' => 'vi', 'ᕖ' => 'vii', 'ᕗ' => 'vu', 'ᕘ' => 'vuu',
+               'ᕙ' => 'va', 'ᕚ' => 'vaa', 'ᕐ' => 'r', 'ᕆ' => 'ri', 'ᕇ' => 'rii', 'ᕈ' => 'ru', 'ᕉ' => 'ruu',
+               'ᕋ' => 'ra', 'ᕌ' => 'raa', 'ᖅ' => 'q', 'ᕿ' => 'qi', 'ᖀ' => 'qii', 'ᖁ' => 'qu', 'ᖂ' => 'quu',
+               'ᖃ' => 'qa', 'ᖄ' => 'qaa', 'ᖕ' => 'ng', 'ᖏ' => 'ngi', 'ᖐ' => 'ngii', 'ᖑ' => 'ngu',
+               'ᖒ' => 'nguu', 'ᖓ' => 'nga', 'ᖔ' => 'ngaa', 'ᖖ' => 'nng', 'ᙱ' => 'nngi', 'ᙲ' => 'nngii',
+               'ᙳ' => 'nngu', 'ᙴ' => 'nnguu', 'ᙵ' => 'nnga', 'ᙶ' => 'nngaa', 'ᖦ' => 'ɫ', 'ᖠ' => 'ɫi',
+               'ᖡ' => 'ɫii', 'ᖢ' => 'ɫu', 'ᖣ' => 'ɫuu', 'ᖤ' => 'ɫa', 'ᖥ' => 'ɫaa',
        );
 
        public $mUpperToLowerCaseLatin = array(
@@ -80,11 +81,12 @@ class IuConverter extends LanguageConverter {
                'j' => 'ᔾ', 'ji' => 'ᔨ', 'jii' => 'ᔩ', 'ju' => 'ᔪ', 'juu' => 'ᔫ', 'ja' => 'ᔭ', 'jaa' => 'ᔮ',
                'v' => 'ᕝ', 'vi' => 'ᕕ', 'vii' => 'ᕖ', 'vu' => 'ᕗ', 'vuu' => 'ᕘ', 'va' => 'ᕙ', 'vaa' => 'ᕚ',
                'r' => 'ᕐ', 'ri' => 'ᕆ', 'rii' => 'ᕇ', 'ru' => 'ᕈ', 'ruu' => 'ᕉ', 'ra' => 'ᕋ', 'raa' => 'ᕌ',
-               'qq' => 'ᖅᒃ', 'qqi' => 'ᖅᑭ', 'qqii' => 'ᖅᑮ', 'qqu' => 'ᖅᑯ', 'qquu' => 'ᖅᑰ', 'qqa' => 'ᖅᑲ', 'qqaa' => 'ᖅᑳ',
-               'q' => 'ᖅ', 'qi' => 'ᕿ', 'qii' => 'ᖀ', 'qu' => 'ᖁ', 'quu' => 'ᖂ', 'qa' => 'ᖃ', 'qaa' => 'ᖄ',
-               'ng' => 'ᖕ', 'ngi' => 'ᖏ', 'ngii' => 'ᖐ', 'ngu' => 'ᖑ', 'nguu' => 'ᖒ', 'nga' => 'ᖓ', 'ngaa' => 'ᖔ',
-               'nng' => 'ᖖ', 'nngi' => 'ᙱ', 'nngii' => 'ᙲ', 'nngu' => 'ᙳ', 'nnguu' => 'ᙴ', 'nnga' => 'ᙵ', 'nngaa' => 'ᙶ',
-               'ɫ' => 'ᖦ', 'ɫi' => 'ᖠ', 'ɫii' => 'ᖡ', 'ɫu' => 'ᖢ', 'ɫuu' => 'ᖣ', 'ɫa' => 'ᖤ', 'ɫaa' => 'ᖥ',
+               'qq' => 'ᖅᒃ', 'qqi' => 'ᖅᑭ', 'qqii' => 'ᖅᑮ', 'qqu' => 'ᖅᑯ', 'qquu' => 'ᖅᑰ', 'qqa' => 'ᖅᑲ',
+               'qqaa' => 'ᖅᑳ', 'q' => 'ᖅ', 'qi' => 'ᕿ', 'qii' => 'ᖀ', 'qu' => 'ᖁ', 'quu' => 'ᖂ',
+               'qa' => 'ᖃ', 'qaa' => 'ᖄ', 'ng' => 'ᖕ', 'ngi' => 'ᖏ', 'ngii' => 'ᖐ', 'ngu' => 'ᖑ',
+               'nguu' => 'ᖒ', 'nga' => 'ᖓ', 'ngaa' => 'ᖔ', 'nng' => 'ᖖ', 'nngi' => 'ᙱ', 'nngii' => 'ᙲ',
+               'nngu' => 'ᙳ', 'nnguu' => 'ᙴ', 'nnga' => 'ᙵ', 'nngaa' => 'ᙶ', 'ɫ' => 'ᖦ', 'ɫi' => 'ᖠ',
+               'ɫii' => 'ᖡ', 'ɫu' => 'ᖢ', 'ɫuu' => 'ᖣ', 'ɫa' => 'ᖤ', 'ɫaa' => 'ᖥ',
        );
 
        function loadDefaultTables() {
@@ -128,7 +130,8 @@ class IuConverter extends LanguageConverter {
         * @return string
         */
        function parserConvert( $text, &$parser ) {
-               $this->mDoContentConvert = !( is_object( $parser->getTitle() ) && $parser->getTitle()->isTalkPage() );
+               $this->mDoContentConvert = !( is_object( $parser->getTitle() )
+                       && $parser->getTitle()->isTalkPage() );
 
                return parent::parserConvert( $text, $parser );
        }
index a7b1668..1ab3c51 100644 (file)
@@ -38,7 +38,6 @@ define( 'H_HAMZA', 'ٴ' ); # U+0674 ARABIC LETTER HIGH HAMZA
  * @ingroup Language
  */
 class KkConverter extends LanguageConverter {
-
        protected $mCyrl2Latn, $mLatn2Cyrl, $mCyLa2Arab;
 
        /**
@@ -326,14 +325,22 @@ class KkConverter extends LanguageConverter {
                // disable conversion variables like $1, $2...
                $varsfix = '\$[0-9]';
 
-               $matches = preg_split( '/' . $varsfix . '[^' . $letters . ']+/u', $text, -1, PREG_SPLIT_OFFSET_CAPTURE );
+               $matches = preg_split(
+                       '/' . $varsfix . '[^' . $letters . ']+/u',
+                       $text,
+                       -1,
+                       PREG_SPLIT_OFFSET_CAPTURE
+               );
+
                $mstart = 0;
                $ret = '';
+
                foreach ( $matches as $m ) {
                        $ret .= substr( $text, $mstart, $m[1] -$mstart );
                        $ret .= $this->regsConverter( $m[0], $toVariant );
                        $mstart = $m[1] + strlen( $m[0] );
                }
+
                return $ret;
        }
 
@@ -350,9 +357,9 @@ class KkConverter extends LanguageConverter {
                switch ( $toVariant ) {
                        case 'kk-arab':
                        case 'kk-cn':
-                               $letters = KK_C_LC . KK_C_UC/*.KK_L_LC.KK_L_UC*/;
-                               $front = 'әөүіӘӨҮІ'/*.'äöüiÄÖÜİ'*/;
-                               $excludes = 'еэгғкқЕЭГҒКҚ'/*.'eégğkqEÉGĞKQ'*/;
+                               $letters = KK_C_LC . KK_C_UC; /*.KK_L_LC.KK_L_UC*/
+                               $front = 'әөүіӘӨҮІ'; /*.'äöüiÄÖÜİ'*/
+                               $excludes = 'еэгғкқЕЭГҒКҚ'; /*.'eégğkqEÉGĞKQ'*/
                                // split text to words
                                $matches = preg_split( '/[\b\s\-\.:]+/', $text, -1, PREG_SPLIT_OFFSET_CAPTURE );
                                $mstart = 0;
@@ -362,7 +369,9 @@ class KkConverter extends LanguageConverter {
                                        // is matched the word to front vowels?
                                        // exclude a words matched to е, э, г, к, к, қ,
                                        // them should be without hamza
-                                       if ( preg_match( '/[' . $front . ']/u', $m[0] ) && !preg_match( '/[' . $excludes . ']/u', $m[0] ) ) {
+                                       if ( preg_match( '/[' . $front . ']/u', $m[0] )
+                                               && !preg_match( '/[' . $excludes . ']/u', $m[0] )
+                                       ) {
                                                $ret .= preg_replace( '/[' . $letters . ']+/u', H_HAMZA . '$0', $m[0] );
                                        } else {
                                                $ret .= $m[0];
@@ -401,7 +410,6 @@ class KkConverter extends LanguageConverter {
        function convertCategoryKey( $key ) {
                return $this->autoConvert( $key, 'kk' );
        }
-
 }
 
 /**
@@ -411,7 +419,6 @@ class KkConverter extends LanguageConverter {
  * @ingroup Language
  */
 class LanguageKk extends LanguageKk_cyrl {
-
        function __construct() {
                global $wgHooks;
                parent::__construct();
index 1541ab4..22fe428 100644 (file)
@@ -26,8 +26,9 @@
  *
  * @ingroup Language
  */
+// @codingStandardsIgnoreStart Ignore class name is not in camel caps format error
 class LanguageKk_cyrl extends Language {
-
+       // @codingStandardsIgnoreEnd
        # Convert from the nominative form of a noun to some other case
        # Invoked with {{GRAMMAR:case|word}}
        /**
@@ -203,7 +204,10 @@ class LanguageKk_cyrl extends Language {
                                        } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
                                                $word = $word . "тан";
                                        }
-                               } elseif ( in_array( $wordEnding, $allVowels ) || in_array( $wordEnding, $Sonants ) || in_array( $wordEnding, $Sibilants ) ) {
+                               } elseif ( in_array( $wordEnding, $allVowels )
+                                       || in_array( $wordEnding, $Sonants )
+                                       || in_array( $wordEnding, $Sibilants )
+                               ) {
                                        if ( in_array( $wordLastVowel, $frontVowels ) ) {
                                                $word = $word . "ден";
                                        } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
@@ -237,7 +241,10 @@ class LanguageKk_cyrl extends Language {
                        case "comitative": # kömektes
                                if ( in_array( $wordEnding, $Consonants ) ) {
                                                $word = $word . "пен";
-                               } elseif ( in_array( $wordEnding, $allVowels ) || in_array( $wordEnding, $Nasals ) || in_array( $wordEnding, $Sonants ) ) {
+                               } elseif ( in_array( $wordEnding, $allVowels )
+                                       || in_array( $wordEnding, $Nasals )
+                                       || in_array( $wordEnding, $Sonants )
+                               ) {
                                                $word = $word . "мен";
                                } elseif ( in_array( $wordEnding, $Sibilants ) ) {
                                                $word = $word . "бен";
@@ -247,7 +254,10 @@ class LanguageKk_cyrl extends Language {
                        case "possessive comitative": # täweldık + kömektes
                                if ( in_array( $wordEnding, $Consonants ) ) {
                                                $word = $word . "пенен";
-                               } elseif ( in_array( $wordEnding, $allVowels ) || in_array( $wordEnding, $Nasals ) || in_array( $wordEnding, $Sonants ) ) {
+                               } elseif ( in_array( $wordEnding, $allVowels )
+                                       || in_array( $wordEnding, $Nasals )
+                                       || in_array( $wordEnding, $Sonants )
+                               ) {
                                                $word = $word . "менен";
                                } elseif ( in_array( $wordEnding, $Sibilants ) ) {
                                                $word = $word . "бенен";
@@ -428,7 +438,10 @@ class LanguageKk_cyrl extends Language {
                                        } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
                                                $word = $word . "tan";
                                        }
-                               } elseif ( in_array( $wordEnding, $allVowels ) || in_array( $wordEnding, $Sonants ) || in_array( $wordEnding, $Sibilants ) ) {
+                               } elseif ( in_array( $wordEnding, $allVowels )
+                                       || in_array( $wordEnding, $Sonants )
+                                       || in_array( $wordEnding, $Sibilants )
+                               ) {
                                        if ( in_array( $wordLastVowel, $frontVowels ) ) {
                                                $word = $word . "den";
                                        } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
@@ -462,7 +475,10 @@ class LanguageKk_cyrl extends Language {
                        case "comitative": # kömektes
                                if ( in_array( $wordEnding, $Consonants ) ) {
                                                $word = $word . "pen";
-                               } elseif ( in_array( $wordEnding, $allVowels ) || in_array( $wordEnding, $Nasals ) || in_array( $wordEnding, $Sonants ) ) {
+                               } elseif ( in_array( $wordEnding, $allVowels )
+                                       || in_array( $wordEnding, $Nasals )
+                                       || in_array( $wordEnding, $Sonants )
+                               ) {
                                                $word = $word . "men";
                                } elseif ( in_array( $wordEnding, $Sibilants ) ) {
                                                $word = $word . "ben";
@@ -472,7 +488,10 @@ class LanguageKk_cyrl extends Language {
                        case "possessive comitative": # täweldık + kömektes
                                if ( in_array( $wordEnding, $Consonants ) ) {
                                                $word = $word . "penen";
-                               } elseif ( in_array( $wordEnding, $allVowels ) || in_array( $wordEnding, $Nasals ) || in_array( $wordEnding, $Sonants ) ) {
+                               } elseif ( in_array( $wordEnding, $allVowels )
+                                       || in_array( $wordEnding, $Nasals )
+                                       || in_array( $wordEnding, $Sonants )
+                               ) {
                                                $word = $word . "menen";
                                } elseif ( in_array( $wordEnding, $Sibilants ) ) {
                                                $word = $word . "benen";
@@ -653,7 +672,10 @@ class LanguageKk_cyrl extends Language {
                                        } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
                                                $word = $word . "تان";
                                        }
-                               } elseif ( in_array( $wordEnding, $allVowels ) || in_array( $wordEnding, $Sonants ) || in_array( $wordEnding, $Sibilants ) ) {
+                               } elseif ( in_array( $wordEnding, $allVowels )
+                                       || in_array( $wordEnding, $Sonants )
+                                       || in_array( $wordEnding, $Sibilants )
+                               ) {
                                        if ( in_array( $wordLastVowel, $frontVowels ) ) {
                                                $word = $word . "دەن";
                                        } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
@@ -687,7 +709,10 @@ class LanguageKk_cyrl extends Language {
                        case "comitative": # kömektes
                                if ( in_array( $wordEnding, $Consonants ) ) {
                                                $word = $word . "پەن";
-                               } elseif ( in_array( $wordEnding, $allVowels ) || in_array( $wordEnding, $Nasals ) || in_array( $wordEnding, $Sonants ) ) {
+                               } elseif ( in_array( $wordEnding, $allVowels )
+                                       || in_array( $wordEnding, $Nasals )
+                                       || in_array( $wordEnding, $Sonants )
+                               ) {
                                                $word = $word . "مەن";
                                } elseif ( in_array( $wordEnding, $Sibilants ) ) {
                                                $word = $word . "بەن";
@@ -697,7 +722,10 @@ class LanguageKk_cyrl extends Language {
                        case "possessive comitative": # täweldık + kömektes
                                if ( in_array( $wordEnding, $Consonants ) ) {
                                                $word = $word . "پەنەن";
-                               } elseif ( in_array( $wordEnding, $allVowels ) || in_array( $wordEnding, $Nasals ) || in_array( $wordEnding, $Sonants ) ) {
+                               } elseif ( in_array( $wordEnding, $allVowels )
+                                       || in_array( $wordEnding, $Nasals )
+                                       || in_array( $wordEnding, $Sonants )
+                               ) {
                                                $word = $word . "مەنەن";
                                } elseif ( in_array( $wordEnding, $Sibilants ) ) {
                                                $word = $word . "بەنەن";
index 9a055c2..6b6c95d 100644 (file)
@@ -28,7 +28,7 @@
  * @ingroup Language
  */
 class LanguageKsh extends Language {
-       static $familygender = array(
+       private static $familygender = array(
                // Do not add male wiki families, since that's the default.
                // No need add neuter wikis having names ending in -wiki.
                        'wikipedia' => 'f',
index 1c867d9..674e717 100644 (file)
@@ -127,7 +127,8 @@ class KuConverter extends LanguageConverter {
                ' O' => 'ئۆ ',
                ' U' => 'ئو ',
                ' Û' => 'ئوو ',
-               # eyn erstmal deaktivieren, einfache Anführungsstriche sind einfach zu häufig, um sie als eyn zu interpretieren
+               # eyn erstmal deaktivieren, einfache Anführungsstriche sind einfach zu
+               # häufig, um sie als eyn zu interpretieren.
                # '\'' => 'ع',
 
 /*             # deactivated for now, breaks links i.e. in header of Special:Recentchanges :-(
index 65fa576..e745965 100644 (file)
@@ -26,8 +26,9 @@
  *
  * @ingroup Language
  */
+// @codingStandardsIgnoreStart Ignore class name is not in camel caps format error
 class LanguageKu_ku extends Language {
-
+       // @codingStandardsIgnoreEnd
        /**
         * Avoid grouping whole numbers between 0 to 9999
         *
index 4e03c25..68e047c 100644 (file)
@@ -36,7 +36,6 @@ require_once __DIR__ . '/../LanguageConverter.php';
  * @ingroup Language
  */
 class ShiConverter extends LanguageConverter {
-
        protected $mDoContentConvert;
 
        public $mToLatin = array(
@@ -107,7 +106,8 @@ class ShiConverter extends LanguageConverter {
         * @return string
         */
        function parserConvert( $text, &$parser ) {
-               $this->mDoContentConvert = !( is_object( $parser->getTitle() ) && $parser->getTitle()->isTalkPage() );
+               $this->mDoContentConvert = !( is_object( $parser->getTitle() )
+                       && $parser->getTitle()->isTalkPage() );
 
                return parent::parserConvert( $text, $parser );
        }
index 36296a0..25fc963 100644 (file)
@@ -52,7 +52,8 @@ class LanguageSl extends Language {
                                break;
                }
 
-               return $word; # this will return the original value for 'imenovalnik' (nominativ) and all undefined case values
+               # this will return the original value for 'imenovalnik' (nominativ) and
+               # all undefined case values.
+               return $word;
        }
-
 }
index 10aab43..429d0a6 100644 (file)
@@ -44,7 +44,8 @@ class LanguageTyv extends Language {
                }
 
                // Set up some constants...
-               $allVowels = array( "е", "и", "э", "ө", "ү", "а", "ё", "о", "у", "ы", "ю", "я", "a", "e", "i", "o", "ö", "u", "ü", "y" );
+               $allVowels = array( "е", "и", "э", "ө", "ү", "а", "ё", "о", "у", "ы",
+                       "ю", "я", "a", "e", "i", "o", "ö", "u", "ü", "y" );
                $frontVowels = array( "е", "и", "э", "ө", "ү", "e", "i", "ö", "ü" );
                $backVowels = array( "а", "ё", "о", "у", "ы", "ю", "я", "a", "o", "u", "y" );
                $unroundFrontVowels = array( "е", "и", "э", "e", "i" );
@@ -53,7 +54,8 @@ class LanguageTyv extends Language {
                $roundBackVowels = array( "ё", "о", "у", "ю", "o", "u" );
                //$voicedPhonemes = array( "д", "б", "з", "ж", "г", "d", "b", "z", "g" );
                $unvoicedPhonemes = array( "т", "п", "с", "ш", "к", "ч", "х", "t", "p", "s", "k", "x" );
-               $directiveUnvoicedStems = array( "т", "п", "с", "ш", "к", "ч", "х", "л", "м", "н", "ң", "t", "p", "s", "k", "x", "l", "m", "n", "ŋ" );
+               $directiveUnvoicedStems = array( "т", "п", "с", "ш", "к", "ч", "х", "л",
+                       "м", "н", "ң", "t", "p", "s", "k", "x", "l", "m", "n", "ŋ" );
                $directiveVoicedStems = array( "д", "б", "з", "ж", "г", "р", "й", "d", "b", "z", "g", "r", "j" );
 
                //$allSonants = array("л", "м", "н", "ң", "р", "й");
@@ -62,8 +64,11 @@ class LanguageTyv extends Language {
                //Put the word in a form we can play with since we're using UTF-8
                preg_match_all( '/./us', $word, $ar );
 
-               $wordEnding = $ar[0][count( $ar[0] ) - 1]; // Here's the last letter in the word
-               $wordReversed = array_reverse( $ar[0] ); // Here's an array with the order of the letters in the word reversed so we can find a match quicker *shrug*
+               // Here's the last letter in the word
+               $wordEnding = $ar[0][count( $ar[0] ) - 1];
+               // Here's an array with the order of the letters in the word reversed so
+               // we can find a match quicker. *shrug*
+               $wordReversed = array_reverse( $ar[0] );
 
                // Find the last vowel in the word
                $wordLastVowel = null;
index 4e5d85a..5215da0 100644 (file)
@@ -51,7 +51,9 @@ class LanguageUk extends Language {
                if ( !preg_match( "/[a-zA-Z_]/us", $word ) ) {
                        switch ( $case ) {
                                case 'genitive': # родовий відмінок
-                                       if ( ( join( '', array_slice( $ar[0], -4 ) ) == 'вікі' ) || ( join( '', array_slice( $ar[0], -4 ) ) == 'Вікі' ) ) {
+                                       if ( ( join( '', array_slice( $ar[0], -4 ) ) == 'вікі' )
+                                               || ( join( '', array_slice( $ar[0], -4 ) ) == 'Вікі' )
+                                       ) {
                                        } elseif ( join( '', array_slice( $ar[0], -1 ) ) == 'ь' ) {
                                                $word = join( '', array_slice( $ar[0], 0, -1 ) ) . 'я';
                                        } elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'ія' ) {
@@ -70,7 +72,9 @@ class LanguageUk extends Language {
                                        # stub
                                        break;
                                case 'accusative': # знахідний відмінок
-                                       if ( ( join( '', array_slice( $ar[0], -4 ) ) == 'вікі' ) || ( join( '', array_slice( $ar[0], -4 ) ) == 'Вікі' ) ) {
+                                       if ( ( join( '', array_slice( $ar[0], -4 ) ) == 'вікі' )
+                                               || ( join( '', array_slice( $ar[0], -4 ) ) == 'Вікі' )
+                                       ) {
                                        } elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'ія' ) {
                                                $word = join( '', array_slice( $ar[0], 0, -2 ) ) . 'ію';
                                        }
index 0b77c56..dfdc6b1 100644 (file)
@@ -28,7 +28,6 @@ require_once __DIR__ . '/LanguageZh_hans.php';
  * @ingroup Language
  */
 class ZhConverter extends LanguageConverter {
-
        /**
         * @param Language $langobj
         * @param string $maincode
@@ -103,12 +102,22 @@ class ZhConverter extends LanguageConverter {
  * @ingroup Language
  */
 class LanguageZh extends LanguageZh_hans {
-
        function __construct() {
                global $wgHooks;
+
                parent::__construct();
 
-               $variants = array( 'zh', 'zh-hans', 'zh-hant', 'zh-cn', 'zh-hk', 'zh-mo', 'zh-my', 'zh-sg', 'zh-tw' );
+               $variants = array(
+                       'zh',
+                       'zh-hans',
+                       'zh-hant',
+                       'zh-cn',
+                       'zh-hk',
+                       'zh-mo',
+                       'zh-my',
+                       'zh-sg',
+                       'zh-tw'
+               );
 
                $variantfallbacks = array(
                        'zh' => array( 'zh-hans', 'zh-hant', 'zh-cn', 'zh-tw', 'zh-hk', 'zh-sg', 'zh-mo', 'zh-my' ),
@@ -187,4 +196,3 @@ class LanguageZh extends LanguageZh_hans {
                return $ret;
        }
 }
-
index 2f7c344..6483d90 100644 (file)
@@ -26,8 +26,9 @@
  *
  * @ingroup Language
  */
+// @codingStandardsIgnoreStart Ignore class name is not in camel caps format error
 class LanguageZh_hans extends Language {
-
+       // @codingStandardsIgnoreEnd
        /**
         * @return bool
         */
index e5ace19..4920e13 100644 (file)
@@ -9,7 +9,8 @@
                        "Meno25",
                        "Rachmat.Wahidi",
                        "Sayed Muddasir",
-                       "Si Gam Acèh"
+                       "Si Gam Acèh",
+                       "아라"
                ]
        },
        "tog-underline": "Bôh garéh yup peunawôt:",
@@ -22,7 +23,6 @@
        "tog-showtoolbar": "Peuleumah bateuëng alat andam",
        "tog-editondblclick": "Andam laman ngön duwa gö teugön",
        "tog-editsectiononrightclick": "Peujeuët andam bideueng ngön teugön blah uneun bak nan bideueng",
-       "tog-rememberpassword": "Ingat lôn tamöng bak peuramban nyoë (keu paléng trép $1 {{PLURAL:$1|uroë}})",
        "tog-watchcreations": "Tamah laman nyang lôn peugöt u dapeuta keunalön",
        "tog-watchdefault": "Tamah laman nyang lôn-andam u dapeuta keunalon",
        "tog-watchmoves": "Tamah laman nyang lôn peupinah u dapeuta keunalon",
        "permalink": "Peunawôt teutap",
        "print": "Rakam",
        "view": "Beuët",
+       "view-foreign": "Eu bak $1",
        "edit": "Andam",
+       "edit-local": "Andam deskripsi lokal",
        "create": "Peugöt",
+       "create-local": "Tamah deskripsi lokal",
        "editthispage": "Andam laman nyoë",
        "create-this-page": "Peugöt laman nyoë",
        "delete": "Sampôh",
        "jumptonavigation": "keumudoë",
        "jumptosearch": "mita",
        "view-pool-error": "Meu'ah, server teungöh sibôk jinoe\nLe that ureueng nyang meuh'eut jak eu laman nyoe\nNeuprèh si'at yôh goh neubaci lom\n\n$1",
+       "generic-pool-error": "Meu'ah, server teungöh peunoh jinoë.\nRamè that ureuëng ngui nyang eu laman nyoë.\nNeuprèh sijamong sigoh neuci lom.",
        "pool-timeout": "Liwat watèë prèh gunci",
        "pool-queuefull": "Seunapat neuprèh peunoh",
        "pool-errorunknown": "Salah hana meukön",
        "readonly_lag": "Basis data ka geurôk otomatis silawét basis data sekunder teungöh geupeusinkron ngön basis data utama",
        "internalerror": "Salah bak dalam",
        "internalerror_info": "Salah bak dalam: $1",
-       "fileappenderrorread": "H'an jitém beuet \"$1\" 'oh geutamah",
-       "fileappenderror": "H'an jeuet jipasoë \"$1\" u \"$2\"",
        "filecopyerror": "H'an jeuet salén beureukaih \"$1\" u \"$2\".",
        "filerenameerror": "H'an jeuët bôh nan beureukaih \"$1\" u \"$2\".",
        "filedeleteerror": "H'an jeuët sampôh beureukaih \"$1\".",
        "directorycreateerror": "H'an jeuet peugöt direktori \"$1\".",
        "filenotfound": "Beureukaih \"$1\" hana meurumpök.",
-       "fileexistserror": "H'an jeuet geusalén u beureukaih \"$1\": Beureukaih ka na.",
        "unexpected": "Yum hana geuharap: \"$1\"=\"$2\".",
        "formerror": "Reulöh: H'an jeuet peu'ék formulir.",
        "badarticleerror": "Buet nyoe h'an jeuët geupeulaku bak laman nyoe.",
        "gotaccountlink": "Tamöng",
        "userlogin-resetlink": "Tuwo rincian tamöng droëneuh?",
        "userlogin-resetpassword-link": "Tuwö lageuëm rahsia?",
+       "userlogin-helplink2": "Beunantu tamöng log",
        "userlogin-loggedin": "Droëneuh ka neutamöng seubagoë $1. Neungui blangko di yup keu neutamöng seubagoë ureuëng ngui la’én",
        "userlogin-createanother": "Peudapeuta nan barô",
-       "createacct-join": "Neupasoë keutrangan bhaih droëneuh di yup nyoë",
-       "createacct-another-join": "Neupasoë keutrangan nan ureuëng ngui barô di yup nyoë",
        "createacct-emailrequired": "Alamat surat-e",
        "createacct-emailoptional": "Alamat surat-e (hana wajéb)",
        "createacct-email-ph": "Neupasoë alamat surat-e droëneuh",
        "login-abort-generic": "Log tamöng droëneuh han meuhasé- Ngon ka geupeubateuë.",
        "loginlanguagelabel": "Bahsa: $1",
        "createacct-another-realname-tip": "Nan aseuli hana meucéh neupasoe.\nMeunyö neupasoe, euntreuk nan droëneuh nyan geupeuleumah mangat jitupeue soe nyang tuléh.",
+       "pt-login": "Tamöng",
+       "pt-login-button": "Tamöng",
+       "pt-createaccount": "Peudapeuta nan barô",
+       "pt-userlogout": "Teubiët",
        "php-mail-error-unknown": "Ralat hana geuteupeuë lam guna surat() PHP",
        "user-mail-no-addy": "Ujoe kirém surat-e ngön hana alamat surat-e.",
        "user-mail-no-body": "Droëneuh ka neucuba kirém e-surat soh ngon that paneuk",
        "changepassword": "Gantoe lageuem rahsia",
-       "resetpass_announce": "Droëneuh kaneutamöng ngon kode siat nyang geukirém rot e-surat. Keu neusambông nyan droëneuh jeuët neupeutamöng narit rahsia barô",
+       "resetpass_announce": "Keu neutamöng log, droëneuh suwah neupeugöt lageuëm rahsia barô",
        "resetpass_header": "Gantoë lageuëm rahsia nan ureuëng ngui",
        "oldpassword": "Lageuëm rahsia awai:",
        "newpassword": "Lageuëm rahsia barô:",
        "resetpass-wrong-oldpass": "Narit rahsia salah.\nDroëneuh kadang ka meuhasé neuubah narit rahsia atawa neulakè narit rahsia barô",
        "resetpass-temp-password": "Lageuem rahsia keu siat:",
        "resetpass-abort-generic": "Meuubah narit rahsia ka geupeubateuë lé ekstensi",
+       "resetpass-validity-soft": "Lageuëm rahsia hana sah: $1",
+       "passwordreset": "Atô keulayi lageuëm rahsia",
        "passwordreset-text-one": "Neupeuleungkap formulir nyoë keu meuatô keulayi narit rahsia",
        "passwordreset-text-many": "{{PLURAL:$1|Neupasoë saboh kutak dimeuyub nyoë keu neuteumèe narit rahsia siat rot e-surat}}",
+       "passwordreset-legend": "Atô keulayi lageuëm rahsia",
        "passwordreset-disabled": "Meuatô narit rahsia keulayi ka geupeumaté lam wiki nyoë",
        "passwordreset-emaildisabled": "Tanda e-surat ka geupeumaté lam wiki nyoë",
        "passwordreset-username": "Ureueng ngui:",
        "passwordreset-capture-help": "Meunyoë droëneuh neuceuë kutak nyoë, e-surat (ngon narit rahsia siat) ka geupeuleumah keudroëneuh ngon geukirém cit keu ureuëng ngui",
        "passwordreset-email": "Alamat surat-e:",
        "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",
        "showpreview": "Peuleumah hasé",
        "showdiff": "Peuleumah neuubah",
        "anoneditwarning": "Droëneuh   hana teudapeuta tamong. Alamat IP Droëneuh   teucatat lam tarèh (riwayat away) ôn nyoë.",
+       "missingcommenttext": "Neupasoë beunalah di yup.",
        "summary-preview": "Eu dilèë neuringkaih:",
        "blockedtitle": "Ureueng ngui geutheun",
        "blockedtext": "'''Nan ureuëng nguy atawa alamat IP Droëneuh  ka geutheun.'''\n\nGeutheun lé $1. Dalèh jih nakeuh ''$2''.\n\n* Geutheun yôh: $8\n* Neutheun maté tanggay bak: $6\n* Nyang geutheun: $7\n\nDroëneuh   jeuët neutanyong bak $1 atawa [[{{MediaWiki:Grouppage-sysop}}|nyang urôh nyang la’én]] keu peugah haba bhah nyoë.\n\nDroëneuh   h’an jeuët neunguy alat 'Kirém surat-e ureuëng nguy nyoë' keucuali ka neupasoë alamat surat-e nyang sah di [[Special:Preferences|Geunalak]] Droëneuh ngön Droëneuh ka geutheun keu nguy nyan.\n\nAlamat IP Droëneuh nakeuh $3, ngön ID neutheun nakeuh $5. Tulông peuseureuta salah saboh atawa ban duwa beurita nyoë bak tiëp teunanyöng nyang neupeugöt.",
        "creating": "Teungöh meupeugöt $1",
        "editingsection": "Andam $1 (bideuëng)",
        "editingcomment": "Andam $1 (bideuëng)",
+       "editconflict": "Konflik andam: $1",
+       "yourtext": "Naseukah droëneuh",
        "storedversion": "Geunantoë teukeubah",
        "yourdiff": "Bida",
        "copyrightwarning": "Beu neuingat bahwa ban mandum nyang Droëneuh   tuléh keu {{SITENAME}} geukira geupeuteubiët di yup $2 (ngiëng $1 keu leubèh jeulah). Meunyoë Droëneuh h‘an neutém teunuléh Droëneuh  ji’andam ngön jiba ho ho la’én, bèk neupasoë teunuléh Droëneuh  keunoë.<br />Droëneuh  neumeujanji chit meunyoë teunuléh nyoë nakeuh atra neutuléh keudroë, atawa neucok nibak nè nè atra umôm atawa nè bibeuëh la’én.\n'''BÈK NEUPASOË TEUNULÉH NYANG GEUPEULINDÔNG HAK KARANG NYANG HANA IDIN'''",
        "templatesused": "{{PLURAL:$1|Templat|Templates}} nyang geungui bak laman nyoë:",
        "templatesusedpreview": "{{PLURAL:$1|Templat|Templates}} nyang geungui bak eu dilèë nyoë:",
+       "templatesusedsection": "{{PLURAL:$1|Seunaleuëk}} geungui bak bagian nyoë:",
        "template-protected": "(geulindông)",
        "template-semiprotected": "(siteungoh-lindông)",
        "hiddencategories": "Laman nyoë nakeuh anggèëta nibak {{PLURAL:$1|1 kawan teusom |$1 kawan teusom}}:",
        "log-fulllog": "Eu ban dum ceunatat",
        "edit-hook-aborted": "Seunampôh geupeubateuë lé kaw'ét parser.\nHana jeuneulaih.",
        "edit-gone-missing": "Han jeut peubarô ôn.\nÔn nyoe mungkén ka geusampôh.",
-       "postedit-confirmation": "Neuandam droeneuh ka meukubah.",
+       "edit-conflict": "Konflik andam.",
+       "postedit-confirmation-saved": "Neuandam droeneuh ka meukubah.",
        "edit-already-exists": "Han jeut peugöt ôn barô.\nÔn nyoe ka lheuh na.",
+       "defaultmessagetext": "Naseukah peusan pukok",
+       "content-model-wikitext": "naseukah wiki",
        "post-expand-template-inclusion-warning": "'''Ingat:''' Seunipat seunaleuëk nyang neunguy rayek that.\nLadôm seunaleuëk hana geupeurôh",
        "post-expand-template-inclusion-category": "Laman ngön seunipat seunaleuëk nyang leubèh bataih",
        "post-expand-template-argument-warning": "'''Ingat:''' Laman nyoe na paléng h'an saboh alasan seunaleuëk nyang na sunipat èkspansi nyang raya that.\nAlasan-alasan nyan hana geupeureumeuën.",
        "history-show-deleted": "Nyang geusampôh mantöng",
        "histfirst": "paléng trép",
        "histlast": "paléng barô",
+       "historysize": "({{PLURAL:$1|1 bit}})",
        "historyempty": "(soh)",
        "history-feed-title": "Riwayat neupeupah",
        "history-feed-description": "Riwayat neupeupah keu ôn nyoe bak wiki",
        "shown-title": "Peuleumah $1 {{PLURAL:$1|hasé}} tiëp laman",
        "viewprevnext": "Eu ($1 {{int:pipe-separator}} $2)($3)",
        "searchmenu-exists": "'''Na laman ngön nan \"[[:$1]]\" bak wiki nyoe.'''",
-       "searchmenu-new": "'''Peugöt laman \"[[:$1]]\" bak wiki nyoë!'''",
+       "searchmenu-new": "<strong>Peugöt laman \"[[:$1]]\" bak wiki nyoë!</strong> {{PLURAL:$2|0=|Eu cit laman nyang geurumpok nibak meunita droëneuh.|Eu cit hasé mita nyang geurumpok.}}",
        "searchprofile-articles": "Laman asoë",
        "searchprofile-project": "Laman Beunantu ngön Buët",
        "searchprofile-images": "Multimedia",
        "search-nonefound": "Hana hasé nyang paih lagèë neulakèë",
        "powersearch-legend": "Mita lanjut",
        "powersearch-ns": "Mita bak ruweuëng nan:",
-       "powersearch-redir": "Dapeuta peuninah",
        "powersearch-toggleall": "Ban dum",
        "powersearch-togglenone": "Hana",
        "preferences": "Galak",
        "recentchanges-label-bot": "Neuandam nyoe geupubuet le bot",
        "recentchanges-label-unpatrolled": "Neuandam nyoe goh lom geukalon",
        "rcnotefrom": "Di yup nyoë nakeuh neuubah yôh <strong>$2</strong> (geupeudeuh trôh ‘an <strong>$1</strong> neuubah).",
-       "rclistfrom": "Peudeuih neuubah barô yôh $1 kön",
+       "rclistfrom": "Peudeuih neuubah barô yôh $3 $2 kön",
        "rcshowhideminor": "$1 andam bacut",
        "rcshowhidebots": "$1 bot",
        "rcshowhideliu": "$1 ureuëng ngui tamöng",
        "log": "Log",
        "all-logs-page": "Ban dum log umom",
        "allpages": "Ban dum laman",
-       "alphaindexline": "$1 u $2",
        "nextpage": "Laman lheuëh nyan ($1)",
        "prevpage": "Laman sigohlomjih ($1)",
        "allpagesfrom": "Peuleumah laman peuphôn nibak:",
        "confirm-unwatch-top": "Sampôh laman nyoë nibak dapeuta keunalön droëneuh?",
        "imgmultipageprev": "← laman sigohlomjih",
        "autosumm-new": "Geupeugöt laman ngön asoë '$1'",
-       "livepreview-loading": "Pumasoë...",
-       "livepreview-ready": "Pumasoë... Ka lheuëh!",
-       "livepreview-failed": "Peudeuih hasé langsông hana meuhasé!\nNeuci peudeuih hasé biasa.",
-       "livepreview-error": "H'an jitém teusambat: $1 \"$2\"\nNeuci peudeuih hasé biasa.",
        "watchlisttools-view": "Peudeuh neuubah meukaw'èt",
        "watchlisttools-edit": "Peudeuh ngön andam dapeuta keunalön",
        "watchlisttools-raw": "Andam dapeuta keunalön meuntah",
index 2674151..838f0e6 100644 (file)
@@ -4,7 +4,9 @@
                        "Abanima",
                        "Csisc",
                        "Kuwaity26",
-                       "Malekbr"
+                       "Malekbr",
+                       "아라",
+                       "Aħmedbaɛl"
                ]
        },
        "tog-underline": "ضع خطا تحت الوصلات:",
@@ -17,7 +19,6 @@
        "tog-showtoolbar": "أظهر شريط التحرير (يتطلب جافاسكربت)",
        "tog-editondblclick": "عدل الصفحات عند الضغط المزدوج (جافاسكربت)",
        "tog-editsectiononrightclick": "فعل تعديل الأقسام بواسطة كبسة الفأرة اليمين على عناوين الأقسام (جافاسكريبت)",
-       "tog-rememberpassword": "تذكر دخولي على هذا المتصفح (إلى {{PLURAL:$1||يوم واحد|يومين|$1 أيام|$1 يومًا|$1 يوم}} كحد أقصى)",
        "tog-watchcreations": "أضف الصفحات التي أنشئها والملفات التي أرفعها إلى قائمة مراقبتي.",
        "tog-watchdefault": "أضف الصفحات والملفات التي أعدلها إلى قائمة مراقبتي",
        "tog-watchmoves": "أضف الصفحات والملفات التي أنقلها إلى قائمة مراقبتي",
        "readonly_lag": "تم إغلاق قاعدة البيانات تلقائيا حتى تستطيع الخواديم التابعة ملاحقة الخادوم الرئيسي",
        "internalerror": "خطأ داخلي",
        "internalerror_info": "خطأ داخلي: $1",
-       "fileappenderrorread": "تعذرت قراءة \"$1\" أثناء الإضافة.",
-       "fileappenderror": "تعذرت إضافة \"$1\" إلى \"$2\".",
        "filecopyerror": "لم يمكن نسخ الملف \"$1\" إلى \"$2\".",
        "filerenameerror": "لم يمكن إعادة تسمية الملف \"$1\" إلى \"$2\".",
        "filedeleteerror": "لم يمكن حذف الملف \"$1\".",
        "directorycreateerror": "لم يمكن إنشاء المجلد \"$1\".",
        "filenotfound": "لم يمكن إيجاد الملف \"$1\".",
-       "fileexistserror": "غير قادر على الكتابة للملف \"$1\": الملف موجود",
        "unexpected": "قيمة غير متوقعة: \"$1\"=\"$2\".",
        "formerror": "خطأ: لم يمكن تنفيذ الاستمارة",
        "badarticleerror": "لا يمكن إجراء هذا الفعل على هذه الصفحة.",
        "savearticle": "احفظ الصفحة",
        "preview": "معاينة",
        "showpreview": "أظهر معاينة",
-       "showlivepreview": "عرض مباشر",
        "showdiff": "أظهر التغييرات",
        "anoneditwarning": "'''تحذير:''' لم تقم بالدخول.\nسيسجل عنوان الآيبي خاصتك في تاريخ هذه الصفحة.",
        "anonpreviewwarning": "''أنت غير مسجل الدخول. الحفظ سيسجل عنوان الأيبي الخاص بك في تاريخ هذه الصفحة.''",
        "recentchanges-label-bot": "أجرى هذا التعديل بوت",
        "recentchanges-label-unpatrolled": "لم يراجع هذا التعديل إلى الآن",
        "rcnotefrom": "بالأسفل التغييرات منذ '''$2''' (إلى '''$1''' معروضة).",
-       "rclistfrom": "أظهر التغييرات بدءا من $1",
+       "rclistfrom": "أظهر التغييرات بدءا من $3 $2",
        "rcshowhideminor": "$1 التعديلات الطفيفة",
        "rcshowhidebots": "$1 البوتات",
        "rcshowhideliu": "$1 المستخدمين المسجلين",
        "booksources-go": "اذهب",
        "log": "سجلات",
        "allpages": "kol ess'afa7at",
-       "alphaindexline": "$1 إلى $2",
        "allarticles": "kol ess'afa7at",
        "allpagessubmit": "اذهب",
        "categories": "تصنيفات",
        "watchlistall2": "الكل",
        "namespacesall": "الكل",
        "monthsall": "الكل",
+       "watchlistedit-clear-explain": "Elɛanawin lkol bech yetnaħaw mel'lista mteɛek",
+       "watchlistedit-clear-titles": "Elɛanawin",
+       "watchlistedit-too-many": "Famma barcha pajet w'manajmouch nħotouhom lkol lahné",
        "watchlisttools-view": "اعرض التغييرات المرتبطة",
        "watchlisttools-edit": "اعرض قائمة المراقبة وعدلها",
        "watchlisttools-raw": "عدل قائمة المراقبة الخام",
index 6694789..68d3d11 100644 (file)
@@ -18,7 +18,8 @@
                        "Shirayuki",
                        "Spacebirdy",
                        "Xethron",
-                       "පසිඳු කාවින්ද"
+                       "පසිඳු කාවින්ද",
+                       "아라"
                ]
        },
        "tog-underline": "Onderstreep skakels.",
@@ -31,7 +32,6 @@
        "tog-showtoolbar": "Wys redigeergereedskap",
        "tog-editondblclick": "Dubbelkliek om te wysig",
        "tog-editsectiononrightclick": "Wysig afdeling met regskliek op afdeling se titel (JavaScript)",
-       "tog-rememberpassword": "Onthou dat ek op hierdie rekenaar ingeteken het (vir 'n maksimum van $1 {{PLURAL:$1|dag|dae}})",
        "tog-watchcreations": "Voeg bladsye wat ek skep en lêers wat ek oplaai by my dophoulys",
        "tog-watchdefault": "Voeg bladsye en lêers wat ek wysig by my dophoulys",
        "tog-watchmoves": "Voeg bladsye en lêers wat ek skuif by my dophoulys",
        "permalink": "Permanente skakel",
        "print": "Druk",
        "view": "Wys",
+       "view-foreign": "Wys op $1",
        "edit": "Wysig",
+       "edit-local": "Wysig plaaslike beskrywing",
        "create": "Skep",
+       "create-local": "Voeg plaaslike beskrywing by",
        "editthispage": "Wysig hierdie bladsy",
        "create-this-page": "Skep hierdie bladsy",
        "delete": "Skrap",
        "readonly_lag": "Die databasis is outomaties gesluit terwyl die slaafdatabasisse met die meester gesinchroniseer word",
        "internalerror": "Interne fout",
        "internalerror_info": "Interne fout: $1",
-       "fileappenderrorread": "Kon nie \"$1\" tydens die \"append\" lees nie.",
-       "fileappenderror": "Kon nie \"$1\" agteraan \"$2\" voeg nie.",
        "filecopyerror": "Kon nie lêer van \"$1\" na \"$2\" kopieer nie.",
        "filerenameerror": "Kon nie lêernaam van \"$1\" na \"$2\" wysig nie.",
        "filedeleteerror": "Kon nie lêer \"$1\" skrap nie.",
        "directorycreateerror": "Kon nie gids \"$1\" skep nie.",
        "filenotfound": "Kon nie lêer \"$1\" vind nie.",
-       "fileexistserror": "Nie moontlik om na lêer \"$1\" te skryf: lêer bestaan reeds",
        "unexpected": "Onverwagte waarde: \"$1\"=\"$2\".",
        "formerror": "Fout: kon vorm nie stuur nie",
        "badarticleerror": "Die aksie kon nie op hierdie bladsy uitgevoer word nie.",
        "userlogin-resetpassword-link": "Wagwoord vergeet?",
        "userlogin-loggedin": "U is reeds aangemeld as {{GENDER:$1|$1}}.\nGebruik die onderstaande vorm om as 'n ander gebruiker aan te meld.",
        "userlogin-createanother": "Skep nog 'n rekening",
-       "createacct-join": "Verskaf u gegewens hieronder.",
-       "createacct-another-join": "Sleutel die nuwe rekening se inligting hier onder in:",
        "createacct-emailrequired": "E-posadres",
        "createacct-emailoptional": "E-posadres (opsioneel)",
        "createacct-email-ph": "Sleutel u e-posadres in",
        "loginlanguagelabel": "Taal: $1",
        "suspicious-userlogout": "U versoek om af te teken is geïgnoreer omdat dit lyk asof dit deur 'n gebreekte webleser of instaanbediener gestuur is.",
        "createacct-another-realname-tip": "Regte naam is opsioneel.\nAs u dit verskaf, sal dit gebruik word om u erkenning vir u werk te gee.",
+       "pt-login": "Meld aan",
+       "pt-login-button": "Meld aan",
+       "pt-createaccount": "Skep gebruiker",
+       "pt-userlogout": "Meld af",
        "php-mail-error-unknown": "Onbekende fout in PHP se mail()-funksie",
        "user-mail-no-addy": "Geprobeer om e-pos te stuur sonder 'n e-posadres.",
        "user-mail-no-body": "Daar is probeer om 'n leë of 'n onredelike kort boodskap te stuur.",
        "savearticle": "Stoor bladsy",
        "preview": "Voorskou",
        "showpreview": "Wys voorskou",
-       "showlivepreview": "Lewendige voorskou",
        "showdiff": "Wys veranderings",
        "anoneditwarning": "'''Waarskuwing:''' Aangesien u nie aangeteken is nie, sal u IP-adres in dié blad se wysigingsgeskiedenis gestoor word.",
        "anonpreviewwarning": "''U is nie aangeteken nie.''\n''As u die bladsy stoor sal u IP-adres in die bladsy se geskeidenis aangeteken word.''",
        "edit-gone-missing": "Die bladsy is nie gewysig nie.\nDit lyk of dit verwyder is.",
        "edit-conflict": "Wysigingskonflik",
        "edit-no-change": "U wysiging was geignoreer omdat die teks nie verander is nie.",
-       "postedit-confirmation": "U wysigings is gestoor.",
+       "postedit-confirmation-created": "Die bladsy is geskep.",
+       "postedit-confirmation-restored": "Die bladsy is teruggeplaas.",
+       "postedit-confirmation-saved": "U wysigings is gestoor.",
        "edit-already-exists": "Die bladsy is nie geskep nie.\nDit bestaan alreeds.",
        "defaultmessagetext": "Verstekteks",
        "content-failed-to-parse": "Dit was nie moontlik om die inhoud van die MIME-tipe $2 vir die model $1 te verwerk nie: $3.",
        "search-section": "(afdeling $1)",
        "search-suggest": "Het u $1 bedoel?",
        "search-interwiki-caption": "Susterprojekte",
-       "search-interwiki-default": "$1 resultate:",
+       "search-interwiki-default": "Resultate van $1:",
        "search-interwiki-more": "(meer)",
        "search-relatedarticle": "Verwante",
        "searcheverything-enable": "Soek in alle naamruimtes",
        "search-nonefound": "Daar is geen resultate vir u soekopdrag nie.",
        "powersearch-legend": "Gevorderde soektog",
        "powersearch-ns": "Soek in naamruimtes:",
-       "powersearch-redir": "Wys aanstuurbladsye",
        "powersearch-togglelabel": "Kies:",
        "powersearch-toggleall": "Alle",
        "powersearch-togglenone": "Geen",
        "prefs-emailconfirm-label": "E-posbevestiging:",
        "youremail": "E-posadres:",
        "username": "{{GENDER:$1|Gebruikersnaam}}:",
-       "uid": "{{GENDER:$1|Gebruiker-ID}}:",
        "prefs-memberingroups": "{{GENDER:$2|Lid}} van {{PLURAL:$1|groep|groepe}}:",
        "prefs-registration": "Registrasiedatum:",
        "yourrealname": "Regte naam:",
        "prefs-advancedsearchoptions": "Gevorderde instellings",
        "prefs-advancedwatchlist": "Gevorderde instellings",
        "prefs-displayrc": "Vertoonopsies",
-       "prefs-displaysearchoptions": "Weergaweopsies",
        "prefs-displaywatchlist": "Weergaweopsies",
        "prefs-diffs": "Verskille",
        "email-address-validity-valid": "Die e-posadres lyk geldig",
        "recentchanges-legend-heading": "'''Sleutel:'''",
        "recentchanges-legend-newpage": "$1 - nuwe bladsy",
        "rcnotefrom": "Wysigings sedert <strong>$2</strong> (maksimum van <strong>$1</strong> word gewys).",
-       "rclistfrom": "Vertoon wysigings vanaf $1",
+       "rclistfrom": "Vertoon wysigings vanaf $3 $2",
        "rcshowhideminor": "$1 klein wysigings",
+       "rcshowhideminor-show": "Wys",
+       "rcshowhideminor-hide": "Versteek",
        "rcshowhidebots": "$1 robotte",
+       "rcshowhidebots-show": "Wys",
+       "rcshowhidebots-hide": "Versteek",
        "rcshowhideliu": "$1 geregistreerde gebruikers",
+       "rcshowhideliu-show": "Wys",
+       "rcshowhideliu-hide": "Versteek",
        "rcshowhideanons": "$1 anonieme gebruikers",
+       "rcshowhideanons-show": "Wys",
+       "rcshowhideanons-hide": "Versteek",
        "rcshowhidepatr": "$1 gekontroleerde wysigings",
+       "rcshowhidepatr-show": "Wys",
+       "rcshowhidepatr-hide": "Versteek",
        "rcshowhidemine": "$1 my wysigings",
+       "rcshowhidemine-show": "Wys",
+       "rcshowhidemine-hide": "Versteek",
        "rclinks": "Vertoon die laaste $1 wysigings in die afgelope $2 dae<br />$3",
        "diff": "verskil",
        "hist": "geskiedenis",
        "uploadstash-refresh": "Verfris die lys van lêers",
        "invalid-chunk-offset": "Ongeldige \"chunk offset\"",
        "img-auth-accessdenied": "Toegang geweier",
-       "img-auth-nopathinfo": "PATH_INFO word vermis.\nU bediener is nie ingestel om hierdie inligting deur te stuur nie.\nMiskien gebruik dit CGI, waartydens img_auth nie ondersteun word nie.\nSien https://www.mediawiki.org/wiki/Manual:Image_Authorization vir meer inligting.",
+       "img-auth-nopathinfo": "PATH_INFO word vermis.\nU bediener is nie ingestel om hierdie inligting deur te stuur nie.\nMiskien gebruik dit CGI, waartydens img_auth nie ondersteun word nie.\nSien https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization vir meer inligting.",
        "img-auth-notindir": "Die aangevraagde pad is nie die ingestelde oplaaigids nie.",
        "img-auth-badtitle": "Dit was nie moontlik om 'n geldige bladsynaam van \"$1\" te maak nie.",
        "img-auth-nologinnWL": "U is nie aangeteken en \"$1\" is nie op die witlys nie.",
        "protectedpages": "Beskermde bladsye",
        "protectedpages-indef": "Slegs blokkades sonder vervaldatum",
        "protectedpages-cascade": "Slegs blokkades wat neergolf",
+       "protectedpages-noredirect": "Versteek aansture",
        "protectedpagesempty": "Geen bladsye is tans met die parameters beveilig nie.",
+       "protectedpages-timestamp": "Tydstip",
+       "protectedpages-page": "Bladsy",
+       "protectedpages-expiry": "Verval",
+       "protectedpages-reason": "Rede",
+       "protectedpages-unknown-timestamp": "Onbekend",
+       "protectedpages-unknown-performer": "Onbekende gebruiker",
        "protectedtitles": "Beskermde titels",
        "protectedtitlesempty": "Geen titels is tans met die parameters beveilig nie.",
        "listusers": "Gebruikerslys",
        "log-title-wildcard": "Soek bladsye wat met die naam begin",
        "showhideselectedlogentries": "Wys/versteek gekose logboekreëls",
        "allpages": "Alle bladsye",
-       "alphaindexline": "$1 tot $2",
        "nextpage": "Volgende blad ($1)",
        "prevpage": "Vorige bladsye ($1)",
        "allpagesfrom": "Wys bladsye vanaf:",
        "listgrouprights-removegroup-self": "Die volgende {{PLURAL:$2|groep|groepe}} verwyder van eie gebruiker: $1",
        "listgrouprights-addgroup-self-all": "Alle groepe byvoeg tot eie gebruiker",
        "listgrouprights-removegroup-self-all": "Alle groepe verwyder van eie gebruiker",
+       "listgrouprights-namespaceprotection-namespace": "Naamruimte",
+       "trackingcategories-name": "Boodskapnaam",
+       "trackingcategories-nodesc": "Geen beskrywing beskikbaar nie.",
+       "trackingcategories-disabled": "Kategorie is gedeaktiveer",
        "mailnologin": "Geen versendadres beskikbaar",
        "mailnologintext": "U moet [[Special:UserLogin|ingeteken]] wees en 'n geldige e-posadres in u [[Special:Preferences|voorkeure]] hê om e-pos aan ander gebruikers te kan stuur.",
        "emailuser": "Stuur e-pos na hierdie gebruiker",
        "watchlist-details": "{{PLURAL:$1|$1 bladsy|$1 bladsye}} in u dophoulys, besprekingsbladsye uitgesluit.",
        "wlheader-enotif": "E-pos kennisgewings is aangeskakel.",
        "wlheader-showupdated": "Bladsye wat verander is sedert u hulle laas besoek het word in '''vetdruk''' uitgewys.",
-       "watchmethod-recent": "Kontroleer onlangse wysigings aan bladsye op dophoulys",
-       "watchmethod-list": "kontroleer bladsye op dophoulys vir wysigings",
-       "watchlistcontains": "Jou dophoulys bevat $1 {{PLURAL:$1|bladsy|bladsye}}.",
-       "iteminvalidname": "Probleem met item '$1', ongeldige naam...",
        "wlshowlast": "Wys afgelope $1 ure, $2 dae of $3",
        "watchlist-options": "Opsies vir dophoulys",
        "watching": "Plaas op dophoulys...",
        "enotif_lastvisited": "Sien $1 vir alle wysigings sedert u laaste besoek.",
        "enotif_lastdiff": "Gaan na $1 om hierdie wysiging te sien.",
        "enotif_anon_editor": "anonieme gebruiker $1",
-       "enotif_body": "Beste $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nSamevatting van die wysiging: $PAGESUMMARY $PAGEMINOREDIT\n\nOuteur se kontakdetails:\nE-pos: $PAGEEDITOR_EMAIL\nWiki: $PAGEEDITOR_WIKI\n\nTensy u hierdie bladsy besoek, sal u geen verdere kennisgewings ontvang nie.\nU kan ook die waarskuwingsvlag op u dophoulys stel.\n\nGroete van {{SITENAME}} se waarskuwingsstelsel.\n\n--\nU kan u e-posvoorkeure stel by:\n{{canonicalurl:{{#special:Preferences}}}}\n\nU kan u dophoulys wysig by:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nOm die bladsy vanaf u dophoulys te verwyder, besoek:\n$UNWATCHURL\n\nTerugvoer en verdere bystand:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Beste $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nSamevatting van die wysiging: $PAGESUMMARY $PAGEMINOREDIT\n\nOuteur se kontakdetails:\nE-pos: $PAGEEDITOR_EMAIL\nWiki: $PAGEEDITOR_WIKI\n\nTensy u hierdie bladsy besoek, sal u geen verdere kennisgewings ontvang nie.\nU kan ook die waarskuwingsvlag op u dophoulys stel.\n\nGroete van {{SITENAME}} se waarskuwingsstelsel.\n\n--\nU kan u e-posvoorkeure stel by:\n{{canonicalurl:{{#special:Preferences}}}}\n\nU kan u dophoulys wysig by:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nOm die bladsy vanaf u dophoulys te verwyder, besoek:\n$UNWATCHURL\n\nTerugvoer en verdere bystand:\n$HELPPAGE",
        "created": "geskep",
        "changed": "verander",
        "deletepage": "Skrap bladsy",
        "contributions-title": "$1 se bydraes",
        "mycontris": "Bydraes",
        "contribsub2": "Vir {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "Die gebruiker \"$1\" is nie geregistreer nie.",
        "nocontribs": "Geen veranderinge wat by hierdie kriteria pas, is gevind nie.",
        "uctop": "(laaste wysiging)",
        "month": "Vanaf maand (en vroeër):",
        "sp-contributions-newbies-sub": "Vir nuwe gebruikers",
        "sp-contributions-newbies-title": "Bydraes van nuwe gebruikers",
        "sp-contributions-blocklog": "blokkeer-logboek",
+       "sp-contributions-suppresslog": "onderdrukte gebruikersbydraes",
        "sp-contributions-deleted": "geskrapte gebruikersbydraes",
        "sp-contributions-uploads": "oplaaie",
        "sp-contributions-logs": "logboeke",
        "blockip": "Blokkeer gebruiker",
        "blockip-legend": "Blokkeer gebruiker of IP-adres",
        "blockiptext": "Gebruik die vorm hier onder om skryftoegang vir 'n gebruiker of IP-adres in te trek.\nDit mag slegs as beskerming teen vandalisme en in ooreenstemming met die [[{{MediaWiki:Policy-url}}|beleid]] gedoen word.\nVul 'n spesifieke rede hier onder in (haal byvoorbeeld spesifieke bladsye wat gevandaliseer is, aan).",
-       "ipadressorusername": "IP-adres of gebruikersnaam:",
+       "ipaddressorusername": "IP-adres of gebruikersnaam:",
        "ipbexpiry": "Duur:",
        "ipbreason": "Rede:",
        "ipbreason-dropdown": "*Algemene redes vir versperring\n** Invoeg van valse inligting\n** Skrap van bladsyinhoud\n** \"Spam\" van skakels na eksterne webwerwe\n** Invoeg van gemors op bladsye\n** Intimiderende gedrag (teistering)\n** Misbruik van veelvuldige rekeninge\n** Onaanvaarbare gebruikersnaam",
        "tooltip-summary": "Verskaf 'n kort opsomming",
        "interlanguage-link-title": "$1 – $2",
        "common.css": "/** Gemeenskaplike CSS vir alle omslae */",
-       "notacceptable": "Die wikibediener kan nie data in 'n formaat wat jou kliënt kan lees verskaf nie.",
        "anonymous": "Anonieme {{PLURAL:$1|gebruiker|gebruikers}} van {{SITENAME}}",
        "siteuser": "{{SITENAME}}-gebruiker $1",
        "anonuser": "Anonieme {{SITENAME}}-gebruiker $1",
        "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):",
-       "showhidebots": "($1 robotte)",
        "noimages": "Niks te sien nie.",
        "ilsubmit": "Soek",
        "bydate": "volgens datum",
        "size-kilobytes": "$1 KG",
        "size-megabytes": "$1 MG",
        "size-gigabytes": "$1 GG",
-       "livepreview-loading": "Laai tans…",
-       "livepreview-ready": "Laai tans… Gereed!",
-       "livepreview-failed": "Lewendige voorskou het gefaal.\nProbeer normale voorskou.",
-       "livepreview-error": "Verbinding het misluk: $1 \"$2\".\nProbeer normale voorskou.",
        "lag-warn-normal": "Veranderinge nuwer as $1 {{PLURAL:$1|sekonde|sekondes}} mag moontlik nie gewys word nie.",
        "lag-warn-high": "Weens hoë databasis toevoer word wysigings nuwer as $1 {{PLURAL:$1|sekonde|sekondes}} moontlik nie in die lys vertoon nie.",
-       "watchlistedit-numitems": "U dophoulys bevat {{PLURAL:$1|1 bladsy|$1 bladsye}}, besprekingsbladsye uitgesluit.",
-       "watchlistedit-noitems": "U dophoulys bevat geen bladsye.",
        "watchlistedit-normal-title": "Wysig dophoulys",
        "watchlistedit-normal-legend": "Verwyder titels van dophoulys",
        "watchlistedit-normal-explain": "Die bladsye in u dophoulys word hier onder vertoon.\nSelekteer die titels wat verwyder moet word en kliek op {{int:Watchlistedit-normal-submit}}\" onder aan die bladsy.\nAlternatiewelik kan u die [[Special:EditWatchlist/raw|bronkode wysig]].",
        "compare-invalid-title": "Die titel wat u verskaf het is ongeldig.",
        "compare-title-not-exists": "Die titel wat u verskaf het bestaan ​​nie.",
        "compare-revision-not-exists": "Die hersiening wat u verskaf het bestaan ​​nie.",
-       "dberr-header": "Die wiki het 'n probleem",
        "dberr-problems": "Jammer! Die webwerf ondervind op die oomblik tegniese probleme.",
        "dberr-again": "Wag 'n paar minute en probeer dan weer.",
        "dberr-info": "(Kan nie die databasisbediener kontak nie: $1)",
        "htmlform-no": "Nee",
        "htmlform-yes": "Ja",
        "htmlform-chosen-placeholder": "Kies 'n opsie",
+       "htmlform-cloner-delete": "Verwyder",
+       "htmlform-cloner-required": "Ten minste één waarde verwag.",
        "sqlite-has-fts": "Weergawe $1 met ondersteuning vir vol-teks soektogte (\"full-text search\")",
        "sqlite-no-fts": "Weergawe $1 sonder ondersteuning vir vol-teks soektogte (\"full-text search\")",
        "logentry-delete-delete": "$1 {{GENDER:$2|het}} bladsy $3 verwyder",
index 0079fc7..4ebee10 100644 (file)
@@ -4,7 +4,8 @@
                        "Bresta",
                        "Cradel",
                        "Dardan",
-                       "Mdupont"
+                       "Mdupont",
+                       "아라"
                ]
        },
        "tog-underline": "Nënvizoji vegzat",
@@ -17,7 +18,6 @@
        "tog-showtoolbar": "Trego butonat për redaktim (JavaScript)",
        "tog-editondblclick": "Redakto faqet me klikim të dyfishtë (JavaScript)",
        "tog-editsectiononrightclick": "Lejo redaktimin e seksioneve tue klikue me të djathtë mbi titull (JavaScript)",
-       "tog-rememberpassword": "Ruej fjalëkalimin tem në këtë shfletues (për $1 {{PLURAL:$1|ditë|ditë}})",
        "tog-watchcreations": "Shtoji në listë mbikëqyrëse faqet që i krijoj vetë",
        "tog-watchdefault": "Shtoji në listë mbikëqyrëse faqet që i redaktoj",
        "tog-watchmoves": "Shtoji në listë mbikëqyrëse faqet që i zhvendosi",
        "readonly_lag": "Databaza âsht bllokue automatikisht përderisa serverat e mvarun të skinkronizohen me kryesorin.",
        "internalerror": "Gabim i mbrendshëm",
        "internalerror_info": "Gabimi i mbrendshëm: $1",
-       "fileappenderrorread": " \"$1\" nuk mujti m'u lexu gjatë bashkangjitjes.",
-       "fileappenderror": "\"$1\" nuk mujti me i'u bashkangjitë \"$2\".",
        "filecopyerror": "Nuk mujta me kopjue skedën \"$1\" te \"$2\".",
        "filerenameerror": "Nuk mujta me ndërrue emnin e skedës \"$1\" në \"$2\".",
        "filedeleteerror": "Nuk mujta me fshî skedën \"$1\".",
        "directorycreateerror": "Nuk mujta me krijue direktorinë \"$1\".",
        "filenotfound": "Nuk mujta me gjetë skedën \"$1\".",
-       "fileexistserror": "Nuk mujta me shkrue në skedën \"$1\": Kjo skedë ekziston",
        "unexpected": "Vlerë e papritun: \"$1\"=\"$2\".",
        "formerror": "Gabim: nuk mujta me dërgue formularin",
        "badarticleerror": "Ky veprim nuk mundet me u ekzekutue në këtë faqe.",
        "savearticle": "Regjistro faqen",
        "preview": "Parapâmje",
        "showpreview": "Trego parapâmjen",
-       "showlivepreview": "Parapâmje e menjiherëshme",
        "showdiff": "Trego ndryshimet",
        "anoneditwarning": "'''Kujdes:''' Ju nuk jeni i kyçun.\nAdresa juej IP do të regjistrohet në historikun e redaktimit të kësaj faqeje.",
        "anonpreviewwarning": "''Nuk jeni i kyçun. Regjistrimi ka me marrë shenim IP adresën tuej në histori të faqes.''",
        "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:",
-       "powersearch-redir": "Listo përcjelljet",
        "powersearch-togglelabel": "Zgjedh:",
        "powersearch-toggleall": "Tâna",
        "powersearch-togglenone": "Asnji",
        "recentchanges-summary": "Ndiqni ndryshime së fundmi tek kjo faqe.",
        "recentchanges-feed-description": "Përcjelli ndryshimet mâ të reja të këtij wiki në këtë feed.",
        "recentchanges-label-newpage": "Ky redaktim krijoi një faqe të re",
-       "rclistfrom": "Trego ndryshimet e reja tue fillue prej $1",
+       "rclistfrom": "Trego ndryshimet e reja tue fillue prej $3 $2",
        "rcshowhideminor": "$1 redaktimet e vogla",
        "rcshowhidebots": "botat në $1",
        "rcshowhideliu": "$1 përdorues të kyçun",
        "monobook.js": "/* Çdo JavaScript këtu ka me u ngarkue për shfrytëzuesit që përdorin dukjen MonoBook */",
        "modern.js": "/* Çdo JavaScript këtu ka me u ngarkue për shfrytëzuesit që përdorin dukjen Modern */",
        "vector.js": "/* Çdo JavaScript këtu ka me u ngarkue për shfrytëzuesit që përdorin dukjen Vector */",
-       "notacceptable": "Serveri i wikit nuk mundet me i ofrue të dhânat në formatin që kish mujtë me i lexue klienti juej.",
        "anonymous": "{{PLURAL:$1|Përdorues|Përdorues}} anonim të {{SITENAME}}",
        "siteuser": "Përdoruesi $1 i {{SITENAME}}",
        "lastmodifiedatby": "Kjo faqe âsht redaktue së fundi me $2, $1 prej $3.",
index 47bcd86..3752ef0 100644 (file)
@@ -7,7 +7,8 @@
                        "Reedy",
                        "Romaine",
                        "Solomon",
-                       "Teferra"
+                       "Teferra",
+                       "아라"
                ]
        },
        "tog-underline": "በመያያዣ ስር አስምር",
@@ -20,7 +21,6 @@
        "tog-showtoolbar": "«አርም» ትዕዛዝ-መስጫ ይታይ (JavaScript)",
        "tog-editondblclick": "ሁለቴ መጫን ገጹን ማረም ያስችል (JavaScript ያስፈልጋል)",
        "tog-editsectiononrightclick": "የክፍል አርዕስት ላይ በቀኝ በመጫን ክፍል ማረምን አስችል (JavaScript)",
-       "tog-rememberpassword": "ለሚቀጥለው ጊዜ በዚህ ኮምፒውተር ላይ በአባልነት ስሜ መግባቴን (ቢበዛ ለ$1 {{PLURAL:$1|ቀን|ቀናት}}) አስታውስ።",
        "tog-watchcreations": "እኔ የምፈጥራቸውን ገጾችና የምልካቸውን ፋይሎች ወደምከታተላቸው ገጾች ዝርዝር ውስጥ ጨምር",
        "tog-watchdefault": "ያረምኳቸውን ገጾች እና ፋይሎች ወደምከታተላቸው ገጾች ዝርዝር ውስጥ ጨምር",
        "tog-watchmoves": "ያዛወርኳቸውን ገጾችና ፋይሎች ወደምከታተላቸው ገጾች ዝርዝር ውስጥ ጨምር",
        "readonly_lag": "ተከታይ ሰርቨሮች ለቀዳሚው እስከሚደርሱ ድረስ መረጃ-ቤቱ በቀጥታ ተቆልፏል።",
        "internalerror": "የውስጥ ስህተት",
        "internalerror_info": "የውስጥ ስህተት፦ $1",
-       "fileappenderror": "«$1» ወደ «$2» መጨምር አልተቻለም።",
        "filecopyerror": "ፋይሉን «$1» ወደ «$2» መቅዳት አልተቻለም።",
        "filerenameerror": "የፋይሉን ስም ከ«$1» ወደ «$2» መቀየር አተቻለም።",
        "filedeleteerror": "ፋይሉን «$1» ለማጥፋት አልተቻለም።",
        "directorycreateerror": "ዶሴ «$1» መፍጠር አልተቻለም።",
        "filenotfound": "«$1» የሚባል ፋይል አልተገኘም።",
-       "fileexistserror": "ወደ ፋይሉ «$1» መጻፍ አይቻልም፦ ፋይሉ ይኖራል",
        "unexpected": "ያልተጠበቀ ዕሴት፦ «$1»=«$2»።",
        "formerror": "ስኅተት፦ ማመልከቻ ለማቅረብ አልተቻለም",
        "badarticleerror": "ይህ ተግባር በዚሁ ገጽ ላይ ሊደረግ አይቻልም።",
        "gotaccount": "(አባልነት አሁን ካለዎ፥ '''$1''' ይግቡ)",
        "gotaccountlink": "በዚህ",
        "userlogin-resetlink": "የመግቢያ ዝርዝርዎን ረተዋልን?",
-       "createacct-join": "ከዚህ በታች ይመዝገቡ።",
        "createacct-emailrequired": "ኢ-ሜይል አድራሻ",
        "createacct-email-ph": "ኢ-ሜይል አድራሻዎን ያስገቡ",
        "createaccountmail": "በኢ-ሜል",
        "login-throttled": "በዚሁ አባል ስም በጥቂት ግዜ ውስጥ ከመጠን በላይ ሙከራዎች አድርገዋል።\nእባክዎ እንደገና ሳይሞክሩ ለጥቂት ደቂቃ ይቆዩ።",
        "login-abort-generic": "መግባትዎ አልተከናወነም፤ ተሠርዟል።",
        "loginlanguagelabel": "ቋምቋ፦ $1",
+       "pt-login": "ለመግባት",
+       "pt-login-button": "ለመግባት",
        "user-mail-no-addy": "እሚደርስበት ኢ-ሜል አድራሻ ሳይታወቅ መላክ አይቻልም።",
        "changepassword": "መግቢያ ቃልዎን ለመቀየር",
        "resetpass_announce": "በኢ-ሜል በተላከ ጊዜያዊ ኮድ ገብተዋል። መግባትዎን ለመጨርስ፣ አዲስ መግቢያ ቃል እዚህ መምረጥ አለብዎ።",
        "savearticle": "ገጹን አስቀምጥ",
        "preview": "ሙከራ / preview",
        "showpreview": "ቅድመ እይታ",
-       "showlivepreview": "የቀጥታ ቅድመ-ዕይታ",
        "showdiff": "ማነጻጸሪያ",
        "anoneditwarning": "'''ማስጠንቀቂያ:''' እርስዎ አሁን በአባል ስምዎ ያልገቡ ነዎት።\nይህን ገፅ ማዘጋጀት፣ ማረምና ማስተካከል ይችላሉ፤ ነገር ግን ያደረጉት ለውጥ በአባልነት ስምዎ ሳይሆን በድህረ ገፅ የመለያ ቁጥር አድራሻዎ (IP address) በገፁ የለውጥ ታሪክ ላይ ይመዘገባሉ።",
        "anonpreviewwarning": "እርስዎ ገና ያልገቡ ነዎት። ይህን ገፅ በማቅረብ የመለያ ቁጥር አድራሻዎ (IP address) በገፁ የለውጥ ታሪክ ላይ ይመዘገባል።",
        "search-nonefound": "ለጥያቄው ምንም የሚስማማ ውጤት አልተገኘም።",
        "powersearch-legend": "ተጨማሪ ፍለጋ",
        "powersearch-ns": "በነዚሁ ክፍለ-ዊኪዎች ይፈልግ:",
-       "powersearch-redir": "መምሪያ መንገዶቹም ይዘርዝሩ",
        "powersearch-toggleall": " ሁሉም",
        "powersearch-togglenone": " ምንም",
        "search-external": "አፍአዊ ፍለጋ",
        "recentchanges-label-unpatrolled": "ይህ እርማት ገና አልተገመገመም",
        "recentchanges-legend-newpage": "$1 - አዲስ ገጽ",
        "rcnotefrom": "ከ'''$2''' ጀምሮ የተቀየሩት ገጾች (እስከ '''$1''' ድረስ) ክዚህ በታች ይታያሉ።",
-       "rclistfrom": "(ከ $1 ጀምሮ አዲስ ለውጦቹን ለማየት)",
+       "rclistfrom": "(ከ $3 $2 ጀምሮ አዲስ ለውጦቹን ለማየት)",
        "rcshowhideminor": "ጥቃቅን ለውጦች $1",
        "rcshowhidebots": "bots $1",
        "rcshowhideliu": "ያባላት ለውጦች $1",
        "watchlist-details": "አሁን {{PLURAL:$1|$1 ገፅ|$1 ገፆች}} በምትከታተላቸው ገፆች ላይ አሉ (የውይይት ገፅ ሳይጨመር)።",
        "wlheader-enotif": "የ-ኢሜል ማስታወቂያ እንዲሠራ ተደርጓል።",
        "wlheader-showupdated": "መጨረሻ ከጎበኟቸው ጀምሮ የተቀየሩት ገጾች በ'''ጉልህ ፊደላት''' ይታያሉ",
-       "watchmethod-recent": "የቅርብ ለውጦችን ለሚከታተሉት ገጾች በመፈለግ",
-       "watchmethod-list": "የሚከታተሉትን ገጾች ለቅርብ ለውጦች በመፈለግ",
-       "watchlistcontains": "አሁን በሙሉ $1 ገጾች እየተከታተሉ ነው።",
        "wlshowlast": "ያለፉት $1 ሰዓት፤ $2 ቀን፤ $3 ይታዩ።",
        "watchlist-options": "የዝርዝሩ ምርጫዎች",
        "watching": "እየተጨመረ ነው...",
        "enotif_lastvisited": "መጨረሻ ከጎበኙ ጀምሮ ለውጦችን ሁሉ ለመመልከት $1 ይዩ።",
        "enotif_lastdiff": "ይህን ለውጥ ለማመልከት $1 ይዩ።",
        "enotif_anon_editor": "ቁጥር አድራሻ $1",
-       "enotif_body": "ለ$WATCHINGUSERNAME ይድረስ፣\n\n\nየ{{SITENAME}} ገጽ $PAGETITLE በ$PAGEEDITDATE በ$PAGEEDITOR $CHANGEDORCREATED፤ ለአሁኑኑ እትም $PAGETITLE_URL ይዩ።\n\n$NEWPAGE\n\nየአዛጋጁ ማጠቃለያ፦ $PAGESUMMARY $PAGEMINOREDIT\n\nአዛጋጁን ለማገናኘት፦\nበኢ-ሜል፦ $PAGEEDITOR_EMAIL\nበዊኪ፦ $PAGEEDITOR_WIKI\n\nገጹን ካልጎበኙ በቀር ምንም ሌላ ኢሜል-ማስታወቂያ አይሰጥም። ደግሞ በተከታተሉት ገጾች ዝርዝር ላለው ገጽ ሁሉ የኢሜል-ማስታወቂያውን ሁኔታ ማስተካከል ይችላሉ።\n\n             ከክብር ጋር፣ የ{{SITENAME}} ኢሜል-ማስታወቂያ መርሃግብር።\n\n--\nየሚከታተሉት ገጾች ዝርዝር ለመቀየር፣ {{canonicalurl:{{#special:EditWatchlist}}}} ይጎበኙ።\n\nበተጨማሪ ለመረዳት፦\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "ለ$WATCHINGUSERNAME ይድረስ፣\n\n\nየ{{SITENAME}} ገጽ $PAGETITLE በ$PAGEEDITDATE በ$PAGEEDITOR $CHANGEDORCREATED፤ ለአሁኑኑ እትም $PAGETITLE_URL ይዩ።\n\n$NEWPAGE\n\nየአዛጋጁ ማጠቃለያ፦ $PAGESUMMARY $PAGEMINOREDIT\n\nአዛጋጁን ለማገናኘት፦\nበኢ-ሜል፦ $PAGEEDITOR_EMAIL\nበዊኪ፦ $PAGEEDITOR_WIKI\n\nገጹን ካልጎበኙ በቀር ምንም ሌላ ኢሜል-ማስታወቂያ አይሰጥም። ደግሞ በተከታተሉት ገጾች ዝርዝር ላለው ገጽ ሁሉ የኢሜል-ማስታወቂያውን ሁኔታ ማስተካከል ይችላሉ።\n\n             ከክብር ጋር፣ የ{{SITENAME}} ኢሜል-ማስታወቂያ መርሃግብር።\n\n--\nየሚከታተሉት ገጾች ዝርዝር ለመቀየር፣ {{canonicalurl:{{#special:EditWatchlist}}}} ይጎበኙ።\n\nበተጨማሪ ለመረዳት፦\n$HELPPAGE",
        "created": "ተፈጠረ",
        "changed": "ተለወጠ",
        "deletepage": "ገጹ ይጥፋ",
        "blockip": "ተጠቃሚውን ለማገድ",
        "blockip-legend": "ተጠቃሚ ለማገድ",
        "blockiptext": "ከዚህ ታች ያለው ማመልከቻ በአንድ ቁጥር አድርሻ ወይም ብዕር ስም ላይ ማገጃ (ማዕቀብ) ለመጣል ይጠቀማል።  ይህ በ[[{{MediaWiki:Policy-url}}|መርመርያዎቻችን]] መሠረት ተንኮል ወይም ጉዳት ለመከልከል ብቻ እንዲደረግ ይገባል። ከዚህ ታች የተለየ ምክንያት (ለምሣሌ የተጎዳው ገጽ በማጠቆም) ይጻፉ።",
-       "ipadressorusername": "የቁ. አድራሻ ወይም የብዕር ስም፦",
+       "ipaddressorusername": "የቁ. አድራሻ ወይም የብዕር ስም፦",
        "ipbexpiry": "የሚያልቅበት፦",
        "ipbreason": "ምክንያቱ፦",
        "ipbreason-dropdown": "*ተራ የማገጃ ምክንያቶች\n** የሀሠት መረጃ መጨምር\n** ከገጾች ይዞታውን መደምሰስ\n** የ'ስፓም' ማያያዣ ማብዛት\n** እንቶ ፈንቶ መጨምር\n** ዛቻ ማብዛት\n** በአድራሻዎች ብዛት መተንኮል\n** የማይገባ ብዕር ስም",
        "newimages": "የአዳዲስ ሥዕሎች ማሳያ አዳራሽ",
        "imagelisttext": "$1 የተጨመሩ ሥእሎች ወይም ፋይሎች ከታች ይዘረዝራሉ ($2)።",
        "newimages-legend": "ማጣሪያ",
-       "showhidebots": "(«bots» $1)",
        "noimages": "ምንም የለም!",
        "ilsubmit": "ፍለጋ",
        "bydate": "በተጨመሩበት ወቅት",
        "autosumm-replace": "ጽሑፉ በ«$1» ተተካ።",
        "autoredircomment": "ወደ [[$1]] መምሪያ መንገድ ፈጠረ",
        "autosumm-new": "አዲስ ገጽ ፈጠረ፦ «$1»",
-       "livepreview-loading": "በመጫን ላይ ነው...",
-       "livepreview-ready": "በመጫን ላይ ነው... ዝግጁ!",
-       "livepreview-failed": "የቀጥታ ቅድመ-ዕይታ አልተከናወነም! የተለመደ ቅድመ-ዕይታ ይሞክሩ።",
-       "livepreview-error": "መገናኘት አልተከናወነም፦$1 «$2»። የተለመደ ቅድመ-ዕይታ ይሞክሩ።",
        "lag-warn-normal": "ከ$1 ሴኮንድ በፊት ጀምሮ የቀረቡ ለውጦች ምናልባት በዚህ ዝርዝር አይታዩም።",
        "lag-warn-high": "የመረጃ-ቤት ሰርቨር በጣም ስለሚዘገይ፣ ከ$1 ሴኮንድ በፊት ጀምሮ የቀረቡ ለውጦች ምናልባት በዚህ ዝርዝር አይታዩም።",
-       "watchlistedit-numitems": "አሁን በሙሉ {{PLURAL:$1|$1 ገጽ|$1 ገጾች}} እየተከታተሉ ነው።",
-       "watchlistedit-noitems": "ዝርዝርዎ ባዶ ነው።",
        "watchlistedit-normal-title": "ዝርዝሩን ለማስተካከል",
        "watchlistedit-normal-legend": "አርእስቶችን ከተካከሉት ገጾች ዝርዝር ለማስወግድ...",
        "watchlistedit-normal-explain": "ከዚህ ታች፣ የሚከታተሉት ገጾች ሁሉ በሙሉ ተዘርዝረው ይገኛሉ።\n\nአንዳንድ ገጽ ከዚህ ዝርዝር ለማስወግድ ያሠቡ እንደሆነ፣ በሳጥኑ ውስጥ ምልክት አድርገው በስተግርጌ በሚገኘው «ማስወግጃ» የሚለውን ተጭነው ከዚህ ዝርዝር ሊያስወግዷቸው ይቻላል። (ይህን በማድረግዎ ከገጹ ጋር የሚገናኘው ውይይት ገጽ ድግሞ ከዝርዝርዎ ይጠፋል።)\n\nከዚህ ዘዴ ሌላ [[Special:EditWatchlist/raw|ጥሬውን ኮድ መቅዳት ወይም ማዘጋጀት]] ይቻላል።",
        "tag-filter-submit": "ማጣሪያ",
        "tags-edit": "አርም",
        "tags-hitcount": "$1 {{PLURAL:$1|ለውጥ|ለውጦች}}",
-       "dberr-header": "ይህ ዊኪ ችግር አለው",
        "dberr-usegoogle": "ለአሁኑ ጊዜ በጉግል መፈልግ ይችላሉ።",
        "htmlform-submit": "ለማቅረብ",
        "htmlform-selectorother-other": "ሌላ",
index a4d6813..1c2bcae 100644 (file)
@@ -9,7 +9,8 @@
                        "The Evil IP address",
                        "Urhixidur",
                        "Willtron",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Subrayar os vinclos:",
@@ -22,7 +23,6 @@
        "tog-showtoolbar": "Amostrar a barra de ferramientas d'edición (cal JavaScript)",
        "tog-editondblclick": "Activar edición de pachinas fendo-ie doble click (cal JavaScript)",
        "tog-editsectiononrightclick": "Activar a edición de seccions punchando con o botón dreito d'o ratet <br /> en os títols de seccions (cal JavaScript)",
-       "tog-rememberpassword": "Remerar o mío nombre d'usuario en iste navegador (como muito por $1 {{PLURAL:$1|día|días}})",
        "tog-watchcreations": "Cosirar as pachinas que creye",
        "tog-watchdefault": "Cosirar as pachinas que edite",
        "tog-watchmoves": "Cosirar as pachinas que treslade",
        "readonly_lag": "A base de datos ye bloqueyata temporalment entre que os servidors se sincronizan.",
        "internalerror": "Error interna",
        "internalerror_info": "Error interna: $1",
-       "fileappenderrorread": "No s'ha puesto leyer \"$1\" durant a inserción.",
-       "fileappenderror": "No s'ha puesto adhibir \"$1\" a \"$2\".",
        "filecopyerror": "No s'ha puesto copiar o fichero \"$1\" ta \"$2\".",
        "filerenameerror": "No s'ha puesto cambiar o nombre d'o fichero \"$1\" a \"$2\".",
        "filedeleteerror": "No s'ha puesto borrar o fichero \"$1\".",
        "directorycreateerror": "No s'ha puesto crear o directorio \"$1\".",
        "filenotfound": "No s'ha puesto trobar o fichero \"$1\".",
-       "fileexistserror": "No s'ha puesto escribir o fichero \"$1\": o fichero ya existe",
        "unexpected": "Valura no prevista: \"$1\"=\"$2\".",
        "formerror": "Error: no se podió ninviar o formulario",
        "badarticleerror": "Ista acción no se puede no se puede reyalizar en ista pachina.",
        "gotaccount": "Tiene ya una cuenta? '''$1'''.",
        "gotaccountlink": "Identificar-se y encetar sesión",
        "userlogin-resetlink": "Ha xublidau os suyos datos d'acceso?",
-       "createacct-join": "Fica os tuyos datos debaixo.",
        "createacct-another-email-ph": "Establir una adreza de correu-e",
        "createaccountmail": "por correu electronico",
        "createaccountreason": "Razón:",
        "savearticle": "Alzar pachina",
        "preview": "Previsualización",
        "showpreview": "Amostrar previsualización",
-       "showlivepreview": "Anvista previa",
        "showdiff": "Amostrar cambeos",
        "anoneditwarning": "''Pare cuenta:'' No s'ha identificato con un nombre d'usuario. A suya adreza IP s'alzará en l'historial d'a pachina.",
        "anonpreviewwarning": "''No s'ha identificau con una cuenta d'usuario. A suya adreza IP quedará rechistrada en l'historial d'edicions d'ista pachina.\"",
        "search-nonefound": "No s'ha trobato garra resultau que cumpla os criterios.",
        "powersearch-legend": "Busca abanzata",
        "powersearch-ns": "Mirar en os espacios de nombres:",
-       "powersearch-redir": "Listar reendreceras",
        "powersearch-togglelabel": "Marcar:",
        "powersearch-toggleall": "Totz",
        "powersearch-togglenone": "Garra",
        "prefs-advancedsearchoptions": "Opcions abanzadas",
        "prefs-advancedwatchlist": "Opcions abanzadas",
        "prefs-displayrc": "Opcions de visualización",
-       "prefs-displaysearchoptions": "Opcions de visualización",
        "prefs-displaywatchlist": "Opcions de visualización",
        "prefs-diffs": "Diferencias",
        "email-address-validity-valid": "L'adreza de correu electronico pareix valida",
        "recentchanges-label-unpatrolled": "Esta edición encara no s'ha controlato",
        "recentchanges-legend-newpage": "$1 - pachina nueva",
        "rcnotefrom": "Contino s'amuestran os cambeos dende '''$2''' (dica '''$1''').",
-       "rclistfrom": "Amostrar cambeos recients dende $1",
+       "rclistfrom": "Amostrar cambeos recients dende $3 $2",
        "rcshowhideminor": "$1 as edicions menors",
        "rcshowhidebots": "$1 bots",
        "rcshowhideliu": "$1 usuarios rechistraus",
        "uploadstash-refresh": "Esviellar a lista de fichers",
        "invalid-chunk-offset": "Desplazamiento invalido d'o fragmento",
        "img-auth-accessdenied": "Acceso refusau",
-       "img-auth-nopathinfo": "Falta PATH_INFO.\n O suyo servidor no ye configurau ta pasar ista información.\nPuet que siga basau en CGI y no siga compatible con img_auth.\nSe veiga l'autorización d'a imachen en https://www.mediawiki.org/wiki/Manual:Image_Authorization",
+       "img-auth-nopathinfo": "Falta PATH_INFO.\n O suyo servidor no ye configurau ta pasar ista información.\nPuet que siga basau en CGI y no siga compatible con img_auth.\nSe veiga l'autorización d'a imachen en https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization",
        "img-auth-notindir": "A rota solicitada no ye en o directorio de cargas configurau",
        "img-auth-badtitle": "No s'ha puesto construyir un títol valito dende \"$1\".",
        "img-auth-nologinnWL": "No ha encetau sesión y \"$1\" no ye en a lista blanca.",
        "watchlist-details": "{{PLURAL:$1|$1 pachina|$1 pachinas}} en a suya lista de seguimiento, sin contar-ie as pachinas de descusión.",
        "wlheader-enotif": "A notificación por correu electronico ye activata",
        "wlheader-showupdated": "Las pachinas cambiadas dende a suya zaguer vesita s'amuestran en '''negreta'''",
-       "watchmethod-recent": "Mirando pachinas cosiratas en os zaguers cambeos",
-       "watchmethod-list": "mirando edicions recients en as pachinas cosiratas",
-       "watchlistcontains": "A suya lista de seguimiento tiene $1 {{PLURAL:$1|pachina|pachinas}}.",
-       "iteminvalidname": "Bi ha un problema con l'articlo '$1', o nombre no ye conforme...",
        "wlshowlast": "Amostrar as zagueras $1 horas, $2 días u $3",
        "watchlist-options": "Opcions d'a lista de seguimiento",
        "watching": "Cosirando...",
        "enotif_lastvisited": "Vaiga ta $1 ta veyer totz os cambeos dende a suya zaguer vesita.",
        "enotif_lastdiff": "Vaiga ta $1 ta veyer iste cambeo.",
        "enotif_anon_editor": "usuario anonimo $1",
-       "enotif_body": "Queriu/ida $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nResumen de l'editor: $PAGESUMMARY $PAGEMINOREDIT\n\nContacto con l'editor:\ncorreu-e: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nSi no visita a pachina, no recibirá mas notificacions de futuros cambios. \nTamién puet cambiar o modo de notificación d'as pachinas que cosira en a suya lista de seguimiento.\n\nAtentament,\nO servicio de notificacions d'o prochecto {{SITENAME}}\n\n--\nTa cambiar as opcions de notificación por correu-e vaiga ta\n{{canonicalurl:{{#special:Preferences}}}}\n\nTa cambiar as opcions d'a suya lista de seguimiento, vaiga ta\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nTa eliminar a pachina d'a suya lista de seguimiento, vaiga ta $UNWATCHURL\n\nSucherencias y aduya:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Queriu/ida $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nResumen de l'editor: $PAGESUMMARY $PAGEMINOREDIT\n\nContacto con l'editor:\ncorreu-e: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nSi no visita a pachina, no recibirá mas notificacions de futuros cambios. \nTamién puet cambiar o modo de notificación d'as pachinas que cosira en a suya lista de seguimiento.\n\nAtentament,\nO servicio de notificacions d'o prochecto {{SITENAME}}\n\n--\nTa cambiar as opcions de notificación por correu-e vaiga ta\n{{canonicalurl:{{#special:Preferences}}}}\n\nTa cambiar as opcions d'a suya lista de seguimiento, vaiga ta\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nTa eliminar a pachina d'a suya lista de seguimiento, vaiga ta $UNWATCHURL\n\nSucherencias y aduya:\n$HELPPAGE",
        "created": "creyata",
        "changed": "editata",
        "deletepage": "Borrar ista pachina",
        "blockip": "Bloqueyar usuario",
        "blockip-legend": "Bloqueyar usuario",
        "blockiptext": "Replene o siguient formulario ta bloqueyar l'acceso\nd'escritura dende una cuenta d'usuario u una adreza IP especifica.\nIsto habría de fer-se nomás ta privar vandalismos, y d'alcuerdo con\nas [[{{MediaWiki:Policy-url}}|politicas]].\nEscriba a razón especifica ta o bloqueyo (por exemplo, quaternando\nas pachinas que s'han vandalizato).",
-       "ipadressorusername": "Adreza IP u nombre d'usuario",
+       "ipaddressorusername": "Adreza IP u nombre d'usuario",
        "ipbexpiry": "Circumducción:",
        "ipbreason": "Razón:",
        "ipbreason-dropdown": "*Razons comuns de bloqueyo\n** Meter información falsa\n** Borrar conteniu d'as pachinas\n** Fer publicidat ficando vinclos con atras pachinas web\n** Meter sinconisions u vasuera en as pachinas\n** Portar-se de traza intimidatoria u violenta / atosegar\n** Abusar de multiples cuentas\n** Nombre d'usuario inacceptable",
        "group-bot.js": "/* Qualsiquier codigo Javascript escrito aquí se cargará nomás ta os bots */",
        "group-sysop.js": "/* Qualsiquier codigo Javascript escrito aquí se cargará nomás ta os administradors */",
        "group-bureaucrat.js": "/* Qualsiquier codigo Javascript escrito aquí se cargará nomás ta os burocratas */",
-       "notacceptable": "O servidor wiki no puede ufrir os datos en un formato que o suyo client (navegador) pueda leyer.",
        "anonymous": "{{PLURAL:$1|Usuario anónimo|Usuarios anónimos}} de {{SITENAME}}",
        "siteuser": "Usuario $1 de {{SITENAME}}",
        "anonuser": "{{SITENAME}} usuario anonimo $1",
        "newimages-summary": "Ista pachina especial amuestra os zaguers fichers cargatos.",
        "newimages-legend": "Filtro",
        "newimages-label": "Nombre d'o fichero (u bella parte d'el):",
-       "showhidebots": "($1 bots)",
        "noimages": "No bi ha cosa a veyer.",
        "ilsubmit": "Mirar",
        "bydate": "por a calendata",
        "autosumm-replace": "O conteniu s'ha cambiato por \"$1\"",
        "autoredircomment": "Reendrezando ta [[$1]]",
        "autosumm-new": "Pachina creyada con '$1'",
-       "livepreview-loading": "Cargando…",
-       "livepreview-ready": "Cargando… ya!",
-       "livepreview-failed": "A previsualización a l'inte falló!\nPrebe con a previsualización normal.",
-       "livepreview-error": "No s'ha puesto connectar: $1 \"$2\". Prebe con l'anvista previa normal.",
        "lag-warn-normal": "Talment no s'amuestren en ista lista as edicions feitas en {{PLURAL:$1|o zaguer segundo|os zaguers $1 segundos}}.",
        "lag-warn-high": "Por o retardo d'o servidor d'a base de datos, talment no s'amuestren en ista lista as edicions feitas en {{PLURAL:$1|o zaguer segundo|os zaguers $1 segundos}}.",
-       "watchlistedit-numitems": "A suya lista de seguimiento tiene {{PLURAL:$1|una pachina |$1 pachinas}}, sin contar-ie as pachinas de descusión.",
-       "watchlistedit-noitems": "A suya lista de seguimiento ye bueda.",
        "watchlistedit-normal-title": "Editar a lista de seguimiento",
        "watchlistedit-normal-legend": "Borrar títols d'a lista de seguimiento",
        "watchlistedit-normal-explain": "Contino s'amuestran os títols de pachinas d'a suya lista de seguimiento.\nTa sacar-ne una pachina, marque o quatrón que ye a o canto d'o suyo títol, y punche con o ratet en \"{{int:Watchlistedit-normal-submit}}\".\nTamién puede [[Special:EditWatchlist/raw|editar dreitament a lista]].",
        "compare-invalid-title": "O titol especificau ye invalido.",
        "compare-title-not-exists": "O titol especificau no existe.",
        "compare-revision-not-exists": "A revisión especificada no existe.",
-       "dberr-header": "Iste wiki tiene un problema",
        "dberr-problems": "Lo sentimos. Iste sitio ye experimentando dificultatz tecnicas.",
        "dberr-again": "Mire de recargar en bells menutos.",
        "dberr-info": "(No s'ha puesto contactar con o servidor d'a base de datos: $1)",
index e540a5d..d685f8f 100644 (file)
@@ -10,7 +10,8 @@
                        "Shirayuki",
                        "Spacebirdy",
                        "Tsepelcory",
-                       "Wōdenhelm"
+                       "Wōdenhelm",
+                       "아라"
                ]
        },
        "tog-underline": "Mearc under hlencan:",
@@ -23,7 +24,6 @@
        "tog-showtoolbar": "Īwan þā adihtunge tōlmearce",
        "tog-editondblclick": "Adihtan trametas mid twifealdum mȳs swenge",
        "tog-editsectiononrightclick": "Þafian dǣla adihtunge þurh swīðran healfe mȳs swengas on dǣla titulum",
-       "tog-rememberpassword": "Gemynan mīne inmeldunge on þissum spearctellende (oþ $1 {{PLURAL:$1|dæg|dagas}} lengest)",
        "tog-watchcreations": "Ēacnian mīn behealdungtæl mid trametum þā ic scieppe and ymelum þā ic hlade on nett.",
        "tog-watchdefault": "Ēacnian mīn behealdungtæl mid trametum and ymelum þā ic adihte.",
        "tog-watchmoves": "Ēacnian mīn behealdungtæl mid trametum and ymelum þā ic wege.",
        "newwindow": "(openaþ in nīwum ēagþyrele)",
        "cancel": "Undōn",
        "moredotdotdot": "Mā...",
-       "morenotlisted": "Mā þe nis on getæle...",
+       "morenotlisted": "Þis getæl nis fulfyled.",
        "mypage": "Mīn tramet",
        "mytalk": "Mīn mōtung",
        "anontalk": "Þisses IP naman mōtung",
        "articlepage": "Sēon innunge tramet",
        "talk": "Mōtung",
        "views": "Sihþa",
-       "toolbox": "Tōlmearc",
+       "toolbox": "Tōlas",
        "userpage": "Sēon brūcendes tramet",
        "projectpage": "Sēon weorces tramet",
        "imagepage": "Sēon ymelan tramet",
        "pool-errorunknown": "Uncūþ wōh",
        "aboutsite": "Gecȳþness ymbe {{GRAMMAR:wrēgendlīc|{{SITENAME}}}}",
        "aboutpage": "Project:Gecȳþness",
-       "copyright": "Man mæg innunge under $1 findan.",
+       "copyright": "Man mæg innunge under $1 findan, būton þǣr hit is elles amearcod.",
        "copyrightpage": "{{ns:project}}:Gelīcnessriht",
        "currentevents": "Gelimpunga þisses tīman",
        "currentevents-url": "Project:Gelimpunga þisses tīman",
        "youhavenewmessages": "Þū hæfst $1 ($2).",
        "youhavenewmessagesfromusers": "Þū hafast $1 fram {{PLURAL:$3|ōðrum brūcende|$3 brūcenda}} ($2).",
        "youhavenewmessagesmanyusers": "Þū hafast $1 fram manigum brūcendum ($2).",
-       "newmessageslinkplural": "{{PLURAL:$1|nīwe ǣrendgewrit|nīwra ǣrendgewrita}}",
+       "newmessageslinkplural": "{{PLURAL:$1|nīwe ǣrendgewrit|999=nīwra ǣrendgewrita}}",
        "youhavenewmessagesmulti": "Þū hæfst nīwu ǣrendu on $1",
        "editsection": "adihtan",
        "editold": "adihtan",
        "missingarticle-rev": "(nīwung#: $1)",
        "internalerror": "Inweard wōh",
        "internalerror_info": "Inweard wōh: $1",
-       "fileappenderrorread": "Ne cūðe \"$1\" rǣdan under ēacnunge.",
-       "fileappenderror": "Ne cūðe \"$2\" mid \"$1\" ēacnian.",
        "filerenameerror": "Ne cūðe ednemnan ymelan \"$1\" tō \"$2\".",
        "filenotfound": "Ne cūðe findan ymelan \"$1\".",
        "formerror": "Wōh: ne cūðe cȳþþugewrit forþsendan.",
        "viewsource-title": "Fruman for $1 sēon",
        "cascadeprotected": "Þes trament wæs geborgen wiþ adihtunge, for þǣm þe hē is befangen in þissum {{PLURAL:$1|tramente, þe is| tramentum, þe sind}} geborgen settum wyrcende þǣm cyre \"cascading\": $2",
        "exception-nologin": "Ne inloggod",
-       "virus-badscanner": "Bad configuration: Unknown virus scanner: $1",
+       "virus-badscanner": "Yfel gesetedness: Uncūþ wyrmsēcend: <em>$1</em>",
        "virus-unknownscanner": "uncūþ andgund:",
        "logouttext": "'''Þū eart nū ūtmeldod.'''\n\nÞū canst ætfeolan þǣre nytte {{SITENAME}} tō ungecūðum, oþþe þū canst <span class='plainlinks'>[$1 inmeldian eft]</span> tō þǣm ylcan oþþe ōðrum brūcende.\nCnāw þæt sume trametas mihten gīet wesan geīwde swā þū wǣre gīet inmeldod, oþ þæt þū clǣnsie þīnes sēcendtōles hord.",
        "welcomeuser": "Wilcume, $1!",
        "userlogout": "Ūtmeldian",
        "notloggedin": "Nā ingemeldod",
        "userlogin-noaccount": "Næfst þu hordcleofan?",
-       "userlogin-joinproject": "Join {{SITENAME}}",
+       "userlogin-joinproject": "Ƿeorðan gylda of {{SITENAME}}",
        "nologin": "Næfst þū reccinge? $1",
        "nologinlink": "Scieppan reccinge",
        "createaccount": "Scieppan reccinge",
        "gotaccount": "Hafast þū reccinge ǣr? $1.",
        "gotaccountlink": "Inmeldian",
        "userlogin-resetpassword-link": "Forgēate þū þīn gelēafword?",
-       "createaccountmail": "Notian sceortne tīman hlētlic þafungword and sendan hit to þǣm spearcǣrenda naman þe is niðer",
+       "createaccountmail": "Notian hwīlendlic hlīetlic þafungword and sendan hit tō þǣm genamodan spearcǣrendnaman",
        "createaccountreason": "Racu:",
        "badretype": "Þā þafungword þe write þū, bēoþ ungelīc.",
        "userexists": "Se brūcendnama is ǣr gebrocen. Cēos lā ōðerne naman.",
        "nosuchuser": "Þǣr nis nān brūcend þe hæfþ þone naman \"$1\".\nStafena micelnessa sind hefiga and ānlica on brūcendnamum.\nScēawa þīne wrītunge eft, oþþe [[Special:UserLogin/signup|sciepp nīwe reccinge]].",
        "nosuchusershort": "Þǣr nis nān brūcend mid þǣm naman \"$1\".  Scēawa þīne wrītunge.",
        "passwordtooshort": "Þafungword sculon habban læst {{PLURAL:$1|1 stafan|$1 stafena}}.",
-       "mailmypassword": "Sendan nīwe þafungword on spearcǣrende",
+       "mailmypassword": "Settan þafungword eft",
        "acct_creation_throttle_hit": "Nēosiende tō þissum wici, þe þīnne IP-Stōwe brȳcþ, hæfþ gesett {{PLURAL:$1|1 hordcleofan|$1 hordcleofan}} in þǣm læsten dæge. Þu ne canst settan ǣnige māran. Þǣrfram ne cunnon Nēosiende, þe þisne IP-Stōwe brȳcþ, settan ǣnige hordcleofan māran on þisse handhwīle.",
        "accountcreated": "Scōp reccinge",
        "loginlanguagelabel": "Sprǣc: $1",
        "savearticle": "Hordian tramet",
        "preview": "Fōrebysen",
        "showpreview": "Īwan fōrebysene",
-       "showlivepreview": "Rihte geīwed fōrebysen",
        "showdiff": "Īwan andwendunga",
        "summary-preview": "Scortnesse fōrebysen:",
        "blockednoreason": "nān racu gifen",
        "newarticle": "(Nīwe)",
        "newarticletext": "Þū hæfst hlencan tō tramete þe nū gīet ne stent gefolgod.\nTō scieppene þone tramet, onginn tō wrītenne in þǣre mearce þe is beneoþan (seoh þone [$1 helpes tramet] ymb mā cȳþþu).\nGif þū hider be misfēnge cōme, cnoca þīnes webbsēcendes '''on bæc''' cnæpp.",
        "usercssyoucanpreview": "'''Rǣd:''' Brūc þone \"{{int:Forescēaƿian}}\" cnæpp tō costnienne þīne nīwan css/js wrītunge ǣr hit sīe hordod.",
-       "userjsyoucanpreview": "'''Rǣd:''' Brūc þone 'Forescēawian' cnæpp tō āfandienne þīne nīwe css/js beforan sparunge.",
+       "userjsyoucanpreview": "'''Rǣd:''' Brūc þone 'Īwan fōrebysene' cnæpp tō costienne þīnre nīwan JavaScrip fadunge ǣr þū hordie.",
        "updated": "(Ednīwed)",
        "note": "'''Gewritincel:'''",
        "previewnote": "'''Beþenc þe þis is gīet efne fōrebysen.'''\nÞīna andwendunga gīet ne sind hordoda!",
        "template-semiprotected": "(sāmborgen)",
        "hiddencategories": "Þes tramet is gesibb {{PLURAL:$1|1 gehȳdedum flocce|$1 gehȳdedra flocca}}:",
        "nocreate-loggedin": "Þū ne hæfst þafunge to scieppenne nīwe trametas.",
-       "permissionserrors": "Þafunga wōh",
+       "permissionserrors": "Þafunge wōh",
        "permissionserrorstext-withaction": "Þū ne hæfst þafunge tō $2, for {{PLURAL:$1|þisre race|þissum racum}}:",
        "recreate-moveddeleted-warn": "'''Warnung: Þū edsciepst tramet þe wæs ǣr forloren.'''\n\nÞu sceoldest smēagan, hwæðer hit gerādlīc sīe, forþ tō gānne mid þǣre adihtunge þisses trametes.\nÞæt forlēosunge and wegunge ealdhord þisses trametes is hēr geīeht for behēfnesse:",
        "viewpagelogs": "Sēon þisses trametes ealdhold",
        "rev-delundel": "īwan/hȳdan",
        "rev-showdeleted": "īwan",
        "revdelete-show-file-submit": "Gēa",
-       "revdelete-hide-text": "Hȳdan ednīwunge traht",
+       "revdelete-hide-text": "Nēosunge traht",
        "revdelete-hide-image": "Hȳdan ymelan innunge",
-       "revdelete-hide-comment": "Hȳdan adihtunge sceortnesse",
-       "revdelete-hide-user": "Hȳdan adihtendes brūcendnaman/IP address",
+       "revdelete-hide-comment": "Adihtunge sceortness",
+       "revdelete-hide-user": "Adihtendes brūcendnama/IP nama",
        "revdelete-radio-same": "(nā andwendan)",
        "revdelete-radio-set": "Gehȳdd",
        "revdelete-radio-unset": "Gesīene",
        "prevn": "ǣror {{PLURAL:$1|$1}}",
        "nextn": "nīehst {{PLURAL:$1|$1}}",
        "viewprevnext": "Sēon ($1 {{int:pipe-separator}} $2) ($3)",
-       "searchmenu-new": "'''Scieppan þone tramet \"[[:$1]]\" on þissum wiki!'''",
+       "searchmenu-new": "<strong>Scieppan þone tramet \"[[:$1]]\" on þissum wiki!</strong> {{PLURAL:$2|0=|Seoh ēac þone tramet þe wæs gefunden mid þīnre sōcne.|Seoh ēac þā þing þā wǣron gefunden.}}",
        "searchprofile-articles": "Innunge trametas",
        "searchprofile-project": "Helpes and Weorca trametas",
        "searchprofile-images": "Missenendebyrdness",
        "search-section": "(dǣl $1)",
        "search-suggest": "Mǣnst þū: $1",
        "search-interwiki-caption": "Sweostorweorc",
-       "search-interwiki-default": "$1 becymas:",
+       "search-interwiki-default": "Þing fram $1:",
        "search-interwiki-more": "(mā)",
        "searchrelated": "gesibb",
        "searchall": "eall",
        "showingresultsnum": "Under sind <b>$3</b> tóhígunga onginnende mid #<b>$2</b>.",
        "powersearch-legend": "Manigfeald sēcung",
        "powersearch-ns": "Sēcan in namstedum:",
-       "powersearch-redir": "Settan edlǣdunge on getæle",
        "search-external": "Ūtanweard sōcn",
        "preferences": "Fōreberunga",
        "mypreferences": "Mīna fōreberunga",
        "yourrealname": "Þīn sōða nama:",
        "yourlanguage": "Brūcendofermearces sprǣc",
        "yourvariant": "Sprǣce wendung:",
-       "yourgender": "Gecynd:",
-       "gender-male": "Wer",
-       "gender-female": "Wīf",
+       "yourgender": "Hū līcaþ þē wesan amearcod?",
+       "gender-male": "Hē adihteþ wikitrametas",
+       "gender-female": "Hēo adihteþ wikitrametas",
        "email": "Spearcǣrend",
        "userrights-user-editname": "Wrīt brūcendnaman:",
        "editusergroup": "Adihtan brūcendhēapas",
        "group-user-member": "{{GENDER:$1|brūcend|brūcicge}}",
        "group-bot-member": "{{GENDER:$1|searuþrǣl}}",
        "group-sysop-member": "{{GENDER:$1|bewitend|bewiticge}}",
-       "group-suppress-member": "oferȝesiht",
+       "group-suppress-member": "{{GENDER:$1|uncūþ}}",
        "grouppage-sysop": "{{ns:project}}:Bewitendas",
        "newuserlogpage": "Brūcenda scieppunge ealdhord",
        "rightslog": "Brūcenda riht cranic",
        "recentchanges-label-newpage": "Þēos adihtung scōp nīwne tramet",
        "recentchanges-label-minor": "Þēos is lytel adihtung",
        "recentchanges-label-bot": "Searuþrǣl fremede þās adihtunge",
-       "recentchanges-legend-newpage": "$1 - nīƿu sīde",
-       "rcnotefrom": "Niðer sind þā andwendunga fram '''$2''' (mǣst īweþ '''$1''').",
-       "rclistfrom": "Īwan nīwa andwendunga fram $1 and siþþan",
+       "recentchanges-legend-newpage": "(seoh ēac [[Special:NewPages|getæl nīwra trameta]])",
+       "rcnotefrom": "Niðer sind þā andwendunga fram <strong>$2</strong> (mǣst īweþ <strong>$1</strong>).",
+       "rclistfrom": "Īwan nīwa andwendunga fram $3 $2 and siþþan",
        "rcshowhideminor": "$1 lytela adihtunga",
        "rcshowhidebots": "$1 searuþrǣlas",
-       "rcshowhideliu": "$1 inmeldode brūcendas",
+       "rcshowhideliu": "$1 brūcendas on nambēc",
        "rcshowhideanons": "$1 uncūðe brūcendas",
        "rcshowhidemine": "$1 mīna adihtunga",
        "rclinks": "Īwan þā nīwostan $1 andwendunga in þissum nīehstum $2 daga<br />$3",
        "license-header": "Lēaf:",
        "nolicense": "Nān is gecoren",
        "license-nopreview": "(Fōrebysen nis gearu)",
-       "listfiles-summary": "Þes syndriga tramet īweþ ealla forþ gehladena ymelan.\nGif se brūcend asifte hine. synderlīce sind ymelan geīwda þǣre þe se brūcend forþ hlōd þā nīwostan fadunge.",
+       "listfiles-summary": "Þes syndriga tramet īweþ ealla forþ gehladena ymelan.",
        "listfiles_search_for": "Sēcan missenendebyrdnesse naman:",
        "imgfile": "ymele",
        "listfiles": "Ymelena getæl",
        "withoutinterwiki": "Trametas būtan sprǣchlencum",
        "withoutinterwiki-summary": "Þā folgiendan trametas nabbaþ hlencan tō ōðrum sprǣcfadungum.",
        "nbytes": "$1 {{PLURAL:$1|bita|bitena}}",
-       "ncategories": "$1 {{PLURAL:$1|flocca|flocca}}",
+       "ncategories": "$1 {{PLURAL:$1|flocc|flocca}}",
        "nlinks": "$1 {{PLURAL:$1|hlenca|hlencena}}",
        "nmembers": "$1 {{PLURAL:$1|gesīþ|gesīða}}",
        "specialpage-empty": "Nis þǣr nāht þe āh cȳðan þes tramet.",
        "speciallogtitlelabel": "Ende (trametes titul oþþe brūcendes nama):",
        "log": "Ealdhord",
        "allpages": "Ealle trametas",
-       "alphaindexline": "$1 oþ $2",
        "nextpage": "Nīehst tramet ($1)",
        "prevpage": "Ǣrra tramet ($1)",
        "allpagesfrom": "Īwan trametas fram:",
        "watchthispage": "Behealdan þisne tramet",
        "unwatch": "Ablinnan behealdunge",
        "unwatchthispage": "Ablinnan behealdunge",
-       "watchlist-details": "{{PLURAL:$1|Þǣr is $1 tramet|Þǣr sind $1 trameta}} on þīnum behealdunggetæle, nā arīmedum mōtunga trametum.",
-       "watchlistcontains": "Þīn behealdungtæl hæfþ $1 {{PLURAL:$1|tramet|trameta}}.",
+       "watchlist-details": "{{PLURAL:$1|Þǣr is $1 tramet|Þǣr sind $1 trameta}} on þīnum behealdunggetæle, nā sunderlīce arīmedum mōtunga trametum.",
        "wlshowlast": "Īwan þā nīwostan $1 tīda $2 daga $3",
        "watchlist-options": "Behealdungtæles cyras",
        "watching": "Behealdende...",
        "contributions": "{{GENDER:$1|Brūcendes}} forðunga",
        "contributions-title": "Brūcendes forðunga for $1",
        "mycontris": "Mīna forðunga",
-       "contribsub2": "For $1 ($2)",
+       "contribsub2": "For {{GENDER:$3|$1}} ($2)",
        "uctop": "(genge)",
        "month": "Fram mōnþe (and ǣr)",
        "year": "Fram iēare (and ǣr)",
        "file-info-size": "$1 × $2 pixels, ymelan micelu: $3, MIME cynn: $4",
        "file-nohires": "Þǣr nis nǣnig māre micelness.",
        "svg-long-desc": "SVG ymele, rihte $1 × $2 pixela, ymelan micelness: $3",
-       "show-big-image": "Full micelness",
+       "show-big-image": "Frumlicu ymele",
        "imagelisttext": "Niðer is getæl '''$1''' {{PLURAL:$1|ymelan|ymelena}}, endebyrded on $2.",
        "noimages": "Nāht tō sēonne.",
        "ilsubmit": "Sēcan",
        "table_pager_empty": "Nān becymas",
        "autosumm-blank": "Þā sīdan blæċode",
        "autosumm-new": "Sīdan mid '$1' ȝescapen",
-       "watchlistedit-noitems": "Þīn behealdungtæl næfþ nǣnga ymelan.",
        "watchlistedit-normal-title": "Adihtan behealdungtæl",
        "watchlistedit-normal-legend": "Forniman naman fram behealdungtæle",
        "watchlistedit-normal-submit": "Forniman naman",
index 84245c9..4649132 100644 (file)
                        "محمد أحمد عبد الفتاح",
                        "مشعل الحربي",
                        "نصوح",
-                       "وهراني"
+                       "وهراني",
+                       "아라",
+                       "Test Create account",
+                       "Kuwaity26"
                ]
        },
        "tog-underline": "سطر تحت الوصلات:",
        "permalink": "رابط دائم",
        "print": "اطبع",
        "view": "مطالعة",
+       "view-foreign": "اعرض على $1",
        "edit": "عدل",
        "edit-local": "تعديل الوصف المحلي",
        "create": "أنشئ",
        "readonly_lag": "تم قفل قاعدة البيانات تلقائيا حتى تستطيع الخواديم التابعة ملاحقة الخادوم الرئيسي",
        "internalerror": "عطل داخلي",
        "internalerror_info": "عطل داخلي: $1",
-       "fileappenderrorread": "تعذرت قراءة \"$1\" أثناء الإضافة.",
-       "fileappenderror": "تعذرت إضافة \"$1\" إلى \"$2\".",
        "filecopyerror": "تعذّر نسخ الملف \"$1\" إلى \"$2\".",
        "filerenameerror": "تعذّر تغيير اسم الملف \"$1\" إلى \"$2\".",
        "filedeleteerror": "تعذّر حذف الملف \"$1\".",
        "directorycreateerror": "تعذّر إنشاء الدليل \"$1\".",
        "filenotfound": "تعذّر إيجاد الملف \"$1\".",
-       "fileexistserror": "تعذّرت كتابة الملف \"$1\": الملف موجود",
        "unexpected": "قيمة غير متوقعة: \"$1\"=\"$2\".",
        "formerror": "عطل: تعذّر إيداع الاستمارة",
        "badarticleerror": "لا يمكن إجراء هذا الفعل على هذه الصفحة.",
        "userlogin-helplink2": "المساعدة في الدخول",
        "userlogin-loggedin": "أنت {{GENDER:$1|مسجل|مسجلة}} الدخول مسبقًا باسم $1. {{GENDER:$1|استخدم|استخدمي}} النموذج بالأسفل لتسجيل الدخول بحساب آخر.",
        "userlogin-createanother": "إنشاء حساب آخر",
-       "createacct-join": "قم بإدخال المعلومات الخاصة بك أدناه.",
-       "createacct-another-join": "أدخل معلومات الحساب الجديد أدناه.",
        "createacct-emailrequired": "عنوان البريد الإلكتروني",
        "createacct-emailoptional": "البريد الإلكتروني (اختياري)",
        "createacct-email-ph": "أدخل عنوان بريدك الإلكتروني",
        "savearticle": "احفظ الصفحة",
        "preview": "عرض مسبق",
        "showpreview": "أظهر معاينة",
-       "showlivepreview": "عرض مباشر",
        "showdiff": "عرض التغييرات",
        "anoneditwarning": "'''تحذير:''' لم تقم بالدخول.\nسيسجل عنوان الآيبي خاصتك في تاريخ هذه الصفحة.",
        "anonpreviewwarning": "''أنت غير مسجل الدخول. الحفظ سيسجل عنوان الأيبي الخاص بك في تاريخ هذه الصفحة.''",
        "edit-gone-missing": "لم يمكن تحديث الصفحة.\nيبدو أنه تم حذفها.",
        "edit-conflict": "تضارب تحريري.",
        "edit-no-change": "تعديلك تم تجاهله، لأنه لم يحدث أي تعديل للنص.",
-       "postedit-confirmation": "تعديلك حفظ.",
+       "postedit-confirmation-created": "تم انشاء الصفحة.",
+       "postedit-confirmation-restored": "تم استعادة الصفحة.",
+       "postedit-confirmation-saved": "تعديلك حفظ.",
        "edit-already-exists": "لم يمكن إنشاء صفحة جديدة.\nهي موجودة بالفعل.",
        "defaultmessagetext": "نص الرسالة الافتراضي",
        "content-failed-to-parse": "فشل في تحليل $2 محتوى لـ $1 نموذج: $3",
        "searchprofile-articles": "صفحات المحتوى",
        "searchprofile-project": "صفحات المساعدة والمشروع",
        "searchprofile-images": "الوسائط المتعددة",
-       "searchprofile-everything": "كل شيء",
+       "searchprofile-everything": "الكل",
        "searchprofile-advanced": "متقدم",
        "searchprofile-articles-tooltip": "ابحث في $1",
        "searchprofile-project-tooltip": "ابحث في $1",
        "search-file-match": "(يطابق محتوى الملف)",
        "search-suggest": "أتقصد: $1",
        "search-interwiki-caption": "المشاريع الشقيقة",
-       "search-interwiki-default": "$1 نتيجة:",
+       "search-interwiki-default": "نتائح من $1:",
        "search-interwiki-more": "(المزيد)",
        "search-relatedarticle": "مرتبطة",
        "searcheverything-enable": "ابحث في جميع النطاقات",
        "search-nonefound": "لا توجد نتائج تطابق الاستعلام.",
        "powersearch-legend": "بحث متقدم",
        "powersearch-ns": "بحث في النطاقات:",
-       "powersearch-redir": "عرض التحويلات",
        "powersearch-togglelabel": "اختر:",
        "powersearch-toggleall": "الكل",
        "powersearch-togglenone": "لا شيء",
        "prefs-emailconfirm-label": "تأكيد البريد الإلكتروني:",
        "youremail": "البريد:",
        "username": "{{GENDER:$1|اسم المستخدم|اسم المستخدمة}}:",
-       "uid": "رقم {{GENDER:$1|المستخدم|المستخدمة}}:",
        "prefs-memberingroups": "{{GENDER:$2|عضو|عضوة}} في {{PLURAL:$1|مجموعة|مجموعة|مجموعتي|مجموعات}}:",
        "prefs-registration": "وقت التسجيل:",
        "yourrealname": "الاسم الحقيقي:",
        "prefs-advancedsearchoptions": "خيارات متقدمة",
        "prefs-advancedwatchlist": "خيارات متقدمة",
        "prefs-displayrc": "خيارات العرض",
-       "prefs-displaysearchoptions": "خصائص العرض",
        "prefs-displaywatchlist": "خصائص العرض",
        "prefs-tokenwatchlist": "مفتاح",
        "prefs-diffs": "فروقات",
        "right-move": "نقل الصفحات",
        "right-move-subpages": "نقل الصفحات مع صفحاتها الفرعية",
        "right-move-rootuserpages": "نقل صفحات المستخدمين الأساسية",
+       "right-move-categorypages": "انقل صفحات التصنيف",
        "right-movefile": "نقل الملفات",
        "right-suppressredirect": "عدم إنشاء تحويلة من الاسم القديم عند نقل صفحة",
        "right-upload": "رفع الملفات",
        "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": "الكتابة على هذا الملف الموجود",
        "recentchanges-legend-heading": "شرح",
        "recentchanges-legend-newpage": "(راجع أيضا [[Special:NewPages|قائمة الصفحات الجديدة]])",
        "rcnotefrom": "بالأسفل التغييرات منذ '''$2''' (إلى '''$1''' معروضة).",
-       "rclistfrom": "أظهر التغييرات بدء من $1",
+       "rclistfrom": "أظهر التغييرات بدء من $3 $2",
        "rcshowhideminor": "$1 التعديلات الطفيفة",
        "rcshowhideminor-show": "أظهر",
        "rcshowhideminor-hide": "أخف",
        "uploadstash-refresh": "تحديث قائمة الملفات",
        "invalid-chunk-offset": "قطعة أوفست غير صالحة",
        "img-auth-accessdenied": "رفض الوصول",
-       "img-auth-nopathinfo": "PATH_INFO مفقود.\nخادومك ليس مضبوطاً لتمرير هذه المعلومة.\nقد يكون مبنياً على نظام CGI ولا يمكنه دعم img_auth.\nراجع https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "PATH_INFO مفقود.\nخادومك ليس مضبوطاً لتمرير هذه المعلومة.\nقد يكون مبنياً على نظام CGI ولا يمكنه دعم img_auth.\nراجع https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "المسار المطلوب غير موجود في مجلد الرفع المضبوط.",
        "img-auth-badtitle": "تعذر تشكيل عنوان صالح من \"$1\".",
        "img-auth-nologinnWL": "لست والجاً و\"$1\" ليست في القائمة البيضاء.",
        "log-title-wildcard": "ابحث عن عناوين تبدأ بهذا النص",
        "showhideselectedlogentries": "إطهار/إخفاء سجلات الدخول المختارة",
        "allpages": "كل الصفحات",
-       "alphaindexline": "$1 إلى $2",
        "nextpage": "الصفحة التالية ($1)",
        "prevpage": "الصفحة السابقة ($1)",
        "allpagesfrom": "اعرض الصفحات ابتداء من:",
        "listgrouprights-removegroup-self": "يمكنه إزالة {{PLURAL:$2|المجموعة|المجموعات}} من حسابه الخاص: $1",
        "listgrouprights-addgroup-self-all": "يمكنه إضافة كل المجموعات إلى حسابه الخاص",
        "listgrouprights-removegroup-self-all": "يمكنه إزالة كل المجموعات من حسابه الخاص",
+       "listgrouprights-namespaceprotection-namespace": "النطاق",
+       "trackingcategories-name": "اسم الرسالة",
+       "trackingcategories-desc": "معايير إدراج تصنيف",
+       "trackingcategories-disabled": "التصنيف غير مفعل",
        "mailnologin": "لا يوجد عنوان للإرسال",
        "mailnologintext": "يجب أن تقوم [[Special:UserLogin|بتسجيل الدخول]] وإدخال بريد إلكتروني صالح في صفحة [[Special:Preferences|التفضيلات]] لتتمكن من إرسال الرسائل لمستخدمين آخرين.",
        "emailuser": "مراسلة المستخدم",
        "watchlist-details": "{{PLURAL:$1||صفحة واحدة|صفحتان|$1 صفحات|$1 صفحة}} في قائمة مراقبتك، بدون عد صفحات النقاش.",
        "wlheader-enotif": "الإخطار بالبريد الإلكتروني مُفعّل.",
        "wlheader-showupdated": "الصفحات التي تم تحريرها بعد مطالعتك إياها آخر مرة عناوينها بالخط '''الغليظ'''",
-       "watchmethod-recent": "فحص التعديلات الأخيرة للصفحات المراقبة",
-       "watchmethod-list": "فحص الصفحات المراقبة للتعديلات الحديثة",
-       "watchlistcontains": "تحتوي قائمة مراقبتك على {{PLURAL:$1|لا صفحات|صفحة واحدة|صفحتان|$1 صفحات|$1 صفحة}}.",
-       "iteminvalidname": "مشكلة في المدخل '$1'، اسم غير صحيح...",
        "wlnote2": "فيما يلي تعرض التعديلات التي أجريت في آخر {{PLURAL:$1|ساعة|ساعتين|<strong>$1</strong> ساعات|<strong>$1</strong> ساعة}}، وذلك اعتبارا من $2، $3.",
        "wlshowlast": "عرض آخر $1 ساعات $2 أيام $3",
        "watchlist-options": "خيارات قائمة المراقبة",
        "blockip": "منع المستخدم",
        "blockip-legend": "منع المستخدم",
        "blockiptext": "استخدم النموذج التالي لمنع مستخدم، أو عنوان آيبي، معين من التعديل أو إنشاء حسابات جديدة. تُستخدم هذه العملية لمنع التخريب فقط، ويجب أن تتماشى مع [[{{MediaWiki:Policy-url}}|سياسة المنع]]. أدخل تعليلاً واضحًا لسبب المنع في الخانة المخصصة لذلك (مثلاً: ذكر صفحات محددة تمّ تخريبها من قبل المستخدم).",
-       "ipadressorusername": "عنوان الأيبي أو اسم المستخدم:",
+       "ipaddressorusername": "عنوان الأيبي أو اسم المستخدم:",
        "ipbexpiry": "مدة المنع:",
        "ipbreason": "السبب:",
        "ipbreason-dropdown": "*أسباب المنع الشائعة\n** كتابة معلومات زائفة\n** إزالة المحتوى من الصفحات\n** سبام وصلات لمواقع خارجية\n** كتابة كلام لا معنى له في الصفحات\n** سلوك عدواني\n** إساءة استخدام حسابات متعددة\n** اسم مستخدم غير مقبول",
        "group-bot.js": "/* أي جافاسكريبت هنا سيتم تحميلها للبوتات فقط */",
        "group-sysop.js": "/* أي جافاسكريبت هنا سيتم تحميلها للإداريين فقط */",
        "group-bureaucrat.js": "/* أي جافاسكريبت هنا سيتم تحميلها للبيروقراطيين فقط */",
-       "notacceptable": "لا يمكن لخادوم الويكي تزويدك ببيانات بصيغة يستطيع عميلك قراءتها.",
        "anonymous": "{{PLURAL:$1|مستخدم مجهول|مستخدمون مجهولون}} ل{{SITENAME}}",
        "siteuser": "مستخدم {{SITENAME}} $1",
        "anonuser": "مستخدم {{SITENAME}}  المجهول $1",
        "newimages-summary": "هذه الصفحة الخاصة تعرض آخر الملفات المرفوعة.",
        "newimages-legend": "المرشح",
        "newimages-label": "اسم الملف (أو جزء منه):",
-       "showhidebots": "($1 بوتات)",
+       "newimages-showbots": "أظهر التحميلات بواسطة البوتات",
        "noimages": "لا شيء للعرض.",
        "ilsubmit": "بحث",
        "bydate": "حسب التاريخ",
        "bitrate-exabits": "$1إكسابيت لكل ثانية",
        "bitrate-zetabits": "$1زيتابيت لكل ثانية",
        "bitrate-yottabits": "$1يوتابيت لكل ثانية",
-       "livepreview-loading": "جاري التحميل...",
-       "livepreview-ready": "يُحمّل… جاهز!",
-       "livepreview-failed": "فشل العرض المباشر!\nحاول تجربة العرض العادي.",
-       "livepreview-error": "لم ينجح الاتصال: $1 \"$2\"\nحاول تجربة العرض العادي.",
        "lag-warn-normal": "التغييرات الأحدث من {{PLURAL:$1|أقل من ثانية|ثانية واحدة|ثانيتين|$1 ثوانٍ|$1 ثانية}} قد لا تظهر في هذه القائمة.",
        "lag-warn-high": "نتيجة لوجود تأخر كبير في تحديث قاعدة بيانات الخادوم، التغييرات الأحدث من {{PLURAL:$1|أقل من ثانية|ثانية واحدة|ثانيتين|$1 ثوانٍ|$1 ثانية}} ربما لا تكون ظاهرة في هذه القائمة.",
-       "watchlistedit-numitems": "قائمة مراقبتك تحتوي على {{PLURAL:$1||عنوان واحد|عنوانين|$1 عناوين|$1 عنوانًا|$1 عنوان}}، بدون احتساب صفحات النقاش.",
-       "watchlistedit-noitems": "قائمة مراقبتك لا تحتوي على أية عناوين.",
        "watchlistedit-normal-title": "تعديل قائمة المراقبة",
        "watchlistedit-normal-legend": "إزالة عناوين من قائمة المراقبة",
        "watchlistedit-normal-explain": "العناوين في قائمة مراقبتك معروضة بالأسفل.\nلإزالة عنوان، اضغط على الصندوق بجواره، واضغط \"{{int:Watchlistedit-normal-submit}}\".\nيمكنك أيضا [[Special:EditWatchlist/raw|تعديل القائمة الخام]].",
        "watchlistedit-raw-done": "قائمة مراقبتك تم تحديثها.",
        "watchlistedit-raw-added": "تمت إضافة {{PLURAL:$1||عنوان واحد|عنوانين|$1 عناوين|$1 عنوانا|$1 عنوان}}:",
        "watchlistedit-raw-removed": "تمت إزالة {{PLURAL:$1||عنوان واحد|عنوانين|$1 عناوين|$1 عنوانا|$1 عنوان}}:",
+       "watchlistedit-clear-titles": "العناوين:",
        "watchlisttools-view": "اعرض التغييرات المرتبطة",
        "watchlisttools-edit": "اعرض قائمة المراقبة وعدلها",
        "watchlisttools-raw": "عدل قائمة المراقبة الخام",
        "compare-invalid-title": "العنوان الذي حددته غير متاح.",
        "compare-title-not-exists": "العنوان الذي حددته غير موجود.",
        "compare-revision-not-exists": "المراجعة التي حددتها غير موجودة.",
-       "dberr-header": "هذا الويكي به مشكلة",
        "dberr-problems": "عذرا! هذا الموقع يعاني من صعوبات تقنية.",
        "dberr-again": "جرب الانتظار بضع دقائق وإعادة التحميل.",
        "dberr-info": "(غير قادر على الاتصال بخادوم قاعدة البيانات: $1)",
        "htmlform-no": "لا",
        "htmlform-yes": "نعم",
        "htmlform-chosen-placeholder": "اختر",
+       "htmlform-cloner-create": "إضافة المزيد",
+       "htmlform-cloner-delete": "إزالة",
+       "htmlform-cloner-required": "مطلوب قيمة واحدة على الأقل.",
        "sqlite-has-fts": "$1 بدعم البحث في كامل النص",
        "sqlite-no-fts": "$1 بدون دعم البحث في كامل النص",
        "logentry-delete-delete": "{{GENDER:$2|حذف|حذفت}} $1 صفحة $3",
index f1d05ad..3cc092e 100644 (file)
@@ -7,7 +7,8 @@
                        "Basharh",
                        "Man2fly2002",
                        "Michaelovic",
-                       "The Thadman"
+                       "The Thadman",
+                       "아라"
                ]
        },
        "tog-underline": "ܪܫܘܡ ܣܪܛܐ ܬܚܝܬ ܐܣܪܐ:",
@@ -16,7 +17,6 @@
        "tog-newpageshidepatrolled": "ܛܫܝ ܦܐܬܬ̈ܐ ܟܪ̈ܝܟܬܐ ܡܢ ܡܟܬܒܘܬܐ ܕܦܐܬܐ ܚܕܬܐ",
        "tog-extendwatchlist": "ܐܪܘܚ ܪ̈ܗܝܬܐ ܠܚܘܘܝܐ ܕܟܠܗܘܢ ܫܘܚܠܦ̈ܐ، ܠܐ ܚܕ̈ܬܐ ܒܠܚܘܕ",
        "tog-editondblclick": "ܫܚܠܦ ܦܐܬܬ̈ܐ ܒܢܩܪܐ ܙܘܓܢܝܐ",
-       "tog-rememberpassword": "ܕܟܘܪ ܥܠܠܬܝ ܥܠ ܡܦܐܬܢܐ ܗܢܐ (ܠܡܬܚܐ ܥܠܝܐ ܕ $1 {{PLURAL:$1|ܝܘܡܐ|ܝܘܡܬ̈ܐ}})",
        "tog-watchcreations": "ܐܘܣܦ ܦܐܬܬ̈ܐ ܕܒܪܐ ܐܢܐ ܘܠܠܦ̈ܐ ܕܐܣܩ ܐܢܐ ܠܪ̈ܗܝܬܝ",
        "tog-watchdefault": "ܐܘܣܦ ܦܐܬܬ̈ܐ ܘܠܦܦ̈ܐ ܕܫܚܠܦ ܐܢܐ ܠܪ̈ܗܝܬܝ",
        "tog-watchmoves": "ܐܘܣܦ ܦܐܬܬ̈ܐ ܘܠܦܦ̈ܐ ܕܫܢܐ ܐܢܐ ܠܪ̈ܗܝܬܝ",
        "gotaccountlink": "ܥܘܠ",
        "userlogin-resetlink": "ܐܬܢܫܝܬ ܝܕ̈ܥܬܐ ܕܥܠܠܐ؟",
        "userlogin-resetpassword-link": "ܢܫܬ ܡܠܬܐ ܕܥܠܠܐ؟",
-       "createacct-join": "ܐܥܠ ܝܕ̈ܥܬܐ ܕܝܠܟ ܠܬܚܬ",
        "createacct-emailrequired": "ܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ",
        "createaccountmail": "ܐܦܠܚ ܡܠܬܐ ܕܥܠܠܐ ܙܒܢܢܝܬܐ ܘܫܕܪ ܠܗ ܥܠ ܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ ܬܘܚܡܐ ܠܬܚܬ",
        "createaccountreason": "ܥܠܬܐ",
        "savearticle": "ܠܒܘܟ ܦܐܬܐ",
        "preview": "ܚܝܪܐ ܩܕܡܝܐ",
        "showpreview": "ܚܘܝ ܚܝܪܐ ܩܕܡܝܐ",
-       "showlivepreview": "ܚܝܪܐ ܩܕܡܝܐ ܚܝܐ",
        "showdiff": "ܚܘܝ ܫܘܚܠܦ̈ܐ",
        "anoneditwarning": "'''ܙܘܗܪܐ:''' ܠܐ ܐܝܬܝܟ ܥܠܝܠܐ.\nܐܝ ܦܝ (IP) ܕܝܠܟ ܢܬܟܬܒ ܒܬܫܥܝܬܐ ܕܦܐܬܐ.",
        "anonpreviewwarning": "\"ܠܐ ܐܝܬܝܟ ܥܠܝܠܐ. ܠܒܟܬܐ ܕܦܐܬܐ ܢܬܟܬܒ ܐܝ ܦܝ (IP) ܕܝܠܟ ܒܬܫܥܝܬܐ ܕܫܘܚܠܦܐ ܕܦܐܬܐ.\"",
        "search-nonefound": "ܠܝܬ ܦܠܛ̈ܐ ܐܘܝܢ̈ܐ ܠܗܢܐ ܒܨܝܐ.",
        "powersearch-legend": "ܒܨܝܐ ܡܬܩܕܡܢܐ",
        "powersearch-ns": "ܒܨܝ ܒܚܩܠܬ̈ܐ:",
-       "powersearch-redir": "ܚܘܝ ܨܘܝܒ̈ܐ",
        "powersearch-togglelabel": "ܓܒܝ:",
        "powersearch-toggleall": "ܟܠ",
        "powersearch-togglenone": "ܠܐ ܡܕܡ",
        "prefs-advancedsearchoptions": "ܓܒܝܬ̈ܐ ܡܬܩܕ̈ܡܢܐ",
        "prefs-advancedwatchlist": "ܓܒܝܬ̈ܐ ܡܬܩܕ̈ܡܢܐ",
        "prefs-displayrc": "ܓܒܝܬ̈ܐ ܕܚܘܘܝܐ",
-       "prefs-displaysearchoptions": "ܓܒܝܬ̈ܐ ܕܚܘܘܝܐ",
        "prefs-displaywatchlist": "ܓܒܝܬ̈ܐ ܕܚܘܘܝܐ",
        "prefs-diffs": "ܦܪ̈ܝܫܘܝܬܐ",
        "userrights": "ܡܕܒܪܢܘܬܐ ܕܙܕ̈ܩܐ ܕܡܦܠܚܢܐ",
        "recentchanges-legend-heading": "'''ܦܘܫܩܐ:'''",
        "recentchanges-legend-newpage": "(ܐܦ ܚܙܝ [[Special:NewPages|ܡܟܬܒܘܬܐ ܕܦܐܬܬ̈ܐ ܚܕ̈ܬܬܐ]])",
        "rcnotefrom": "ܠܬܚܬ ܫܘܚܠܦ̈ܐ ܕܡܢ '''$2''' (ܥܕ '''$1''' ܡܬܚܙܝܢ̈ܐ).",
-       "rclistfrom": "ܚܘܝ ܫܘܚܠܦ̈ܐ ܚܕ̈ܬܐ ܡܢ $1",
+       "rclistfrom": "ܚܘܝ ܫܘܚܠܦ̈ܐ ܚܕ̈ܬܐ ܡܢ $3 $2",
        "rcshowhideminor": "$1 ܫܘܚܠܦ̈ܐ ܙܥܘܪ̈ܐ",
        "rcshowhideminor-show": "ܚܘܝ",
        "rcshowhideminor-hide": "ܛܫܝ",
index 5e92511..b6388e7 100644 (file)
@@ -6,13 +6,13 @@
                        "Kaniw",
                        "Lin linao",
                        "Poquil",
-                       "Remember the dot"
+                       "Remember the dot",
+                       "아라"
                ]
        },
        "tog-underline": "Miñcewirilpe lasun",
        "tog-showtoolbar": "Pengelün kümeelün ñi chemkün",
        "tog-editondblclick": "Wirin pakina epu klik mew",
-       "tog-rememberpassword": "Amulen tañi nülküwküleael tüfa mew (alürumechi $1 {{PLURAL:$1 antü}})",
        "underline-always": "Rumel",
        "underline-never": "Turpu",
        "sunday": "Domingku",
        "recentchanges-label-unpatrolled": "Pukintulelay tüfachi wirin.",
        "recentchanges-legend-newpage": "$1 - We Pakina",
        "rcnotefrom": "Nagpüle müley fill wirin tuwülu '''$2''' mew (tripalu '''$1''' mew).",
-       "rclistfrom": "Adkintun weke kalekünun amuamugelu $1",
+       "rclistfrom": "Adkintun weke kalekünun amuamugelu $3 $2",
        "rcshowhideminor": "$1 pichi wirin",
        "rcshowhidebots": "$1 kiduamukelu küdauwe",
        "rcshowhideliu": "$1 konkülelu kellufe",
index d4ca38e..c1885cf 100644 (file)
@@ -2,7 +2,8 @@
        "@metadata": {
                "authors": [
                        "Bachounda",
-                       "Oldstoneage"
+                       "Oldstoneage",
+                       "아라"
                ]
        },
        "tog-underline": "تسطار الوصيلات:",
@@ -15,7 +16,6 @@
        "tog-showtoolbar": "تبيان باره الكتيبات (يلزمها جافاسكريبت)",
        "tog-editondblclick": "كتيبت الباجات بالزوج دركات (يلزمها جافاسكربت)",
        "tog-editsectiononrightclick": "اكتيفي كتيبت السكسيوات بالدريك باليمين على العناوين نتاعهم(يتطلب جافاسكريبت)",
-       "tog-rememberpassword": "اتفكر الدخول تاعي ب هاذ النافيكاتور (ب مدّة حدها{{PLURAL:$1||يوم واحد|يومين|$1 إيّام|$1 يوم}})",
        "tog-watchcreations": "زيد الـصفحات اللي نخلقها و الـفيشيّات فل قايمة تاع التتباع تاعي",
        "tog-watchdefault": "زيد الـصفحات و الـفيشيّات اللي نبدّلها فل قايمة تاع الـتتباع تاعي",
        "tog-watchmoves": "زيد الـصفحات و الـفيشيات اللي نحوّلها فل قايمة تاع الـتباع تاعي",
        "recentchanges-label-bot": "هاذ التبديل ندار بروبو",
        "recentchanges-label-unpatrolled": "ما تراجعتش هاذ التبديله للآن",
        "rcnotefrom": "هاهي التبديلات  من'''$2''' (ل'''$1''' معروضه).",
-       "rclistfrom": "بين التبديلات البديه من $1",
+       "rclistfrom": "بين التبديلات البديه من $3 $2",
        "rcshowhideminor": "$1 التبديلات الصغير",
        "rcshowhidebots": "$1 البوتات",
        "rcshowhideliu": "$1 المستخدمين المسجلين",
index c8f92a0..954a997 100644 (file)
@@ -6,7 +6,8 @@
                        "Kaganer",
                        "MassNssen",
                        "Zanatos",
-                       "زكريا"
+                       "زكريا",
+                       "아라"
                ]
        },
        "tog-underline": "Ṣetter l-lyanaṫ:",
@@ -19,7 +20,6 @@
        "tog-showtoolbar": "Werri l-barra dyal ṫ-ṫeĝdilaṫ (kayḫṫaj JavaScript)",
        "tog-editondblclick": "Baċ ṫṣayeb ṣ-ṣefḫa ĥaṣek ṫbrek 2 merraṫ (kayḫṫaj JavaScript)",
        "tog-editsectiononrightclick": "Baċ ṫbeddel l-ĝonwan dyal ċi seksyon brek ĝlih be l-imniya (kayḫṫaj JavaScript)",
-       "tog-rememberpassword": "Ĝqel ĝla smiyṫi fe had l-ordinaṫør (ġir limoddaṫ {{PLURAL:$1|yom waḫed|$1 iyyam}})",
        "tog-watchcreations": "zid sfahi li nchatha f qaaimat lmoraqaba",
        "tog-watchdefault": "zid sfahi li adltha f qaaimat lmoraqaba",
        "tog-watchmoves": "zid sfahi li bdlt blasstha f qaaimat lmoraqaba",
        "readonly_lag": "qaĝidaṫ l-bayanaṫ ṫqflaṫ ṫilqa'iyyan mlli kanṫ l-ĥwadim ṫ-ṫabiĝa l-ĥadom r-ra'isi ka-ṫlṫaḫq bih.",
        "internalerror": "khataaa dakhili",
        "internalerror_info": "khataaa dakhili : $1",
-       "fileappenderrorread": "manqdroch nqraw  \"$1\" atna' lidafa.",
-       "fileappenderror": "maymknch ncopie had lfichier \"$1\" l hada \"$2\".",
        "filecopyerror": "maymknch ncopie had lfichier \"$1\" l hada \"$2\".",
        "filerenameerror": "maymknch nsmiw had lfichier \"$1\" l hada \"$2\".",
        "filedeleteerror": "maymknch had lfichier \"$1\" itmsh .",
        "directorycreateerror": "maymknch had lmojllad itnchaa \"$1\".",
        "filenotfound": "maymknch nlgaw had lfichier\"$1\".",
-       "fileexistserror": "maṫqdrċ ṫkṫb f-lmilef \"$1\": l-milef rah kayn",
        "unexpected": "qima mamtwqaach: \"$1\"=\"$2\".",
        "formerror": "khata':listimara matqdrch tnfd",
        "badarticleerror": "mamyknch tdir had lfiil ala had sfha",
        "savearticle": "Ċejjel ṣ-ṣefḫa",
        "preview": "L-Prévizualizasyon",
        "showpreview": "Werri l-prévizualizasyon",
-       "showlivepreview": "aard mobachir",
        "showdiff": "Werri ṫ-ṫeġyiraṫ",
        "anoneditwarning": "'''Ĝendak:''' Ma mkonéktéċ.\nĠayṫċejjel l-ĝonwan IP dyalek fe ṫariĥ had ṣ-ṣefḫa.",
        "anonpreviewwarning": "''ṛak ma daĥlċ. l-ḫifḍ ġadi ysjjl ĝonwan l-IP dialk f-listorik dial had ṣ-ṣfḫa.''",
        "search-nonefound": "ḫṫṫa naṫija ma bḫal ḫad t-talab.",
        "powersearch-legend": "Ṫeqlab ṣĝib",
        "powersearch-ns": "Qelleb fe maḫel s-smiyyaṫ",
-       "powersearch-redir": "Lisṫaṫ 'ṫ-ṫeḫwilaṫ",
        "powersearch-togglelabel": "Ĥṫar",
        "powersearch-toggleall": "Kolċi",
        "powersearch-togglenone": "Walo",
        "prefs-advancedsearchoptions": "khiyarat motaqaddima",
        "prefs-advancedwatchlist": "khiyarat motaqaddima",
        "prefs-displayrc": "khiyarat laard",
-       "prefs-displaysearchoptions": "khiyarat laard",
        "prefs-displaywatchlist": "khiyarat laard",
        "prefs-diffs": "foroqat",
        "email-address-validity-valid": "tayban billa l-email rah ṣalḫ",
        "recentchanges-label-bot": "had taadil darou bot",
        "recentchanges-label-unpatrolled": "had taadil matrajach",
        "rcnotefrom": "hna taghirat mn  '''$2''' (tal '''$1''' maaroda).",
-       "rclistfrom": "Werri ṫeġyiraṫ jdad badyen men $1",
+       "rclistfrom": "Werri ṫeġyiraṫ jdad badyen men $3 $2",
        "rcshowhideminor": "$1 Ṫeĝdilaṫ ma mohimminċ bezzaf",
        "rcshowhidebots": "$1 R-Robowaṫ",
        "rcshowhideliu": "$1 l-mosṫeĥdimin l-mċejjlin",
        "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ḍ'''",
-       "iteminvalidname": "moċkil mĝa l-madda '$1', smia ma ṣḫiḫa-ċ...",
        "wlshowlast": "Werri  l-$1 de s-swayeĝ o l-$2 iyam l-leĥĥrin, ola werri $3",
        "watchlist-options": "Lé-Opsyon de l-lista dyal s-suivi",
        "watching": "Kayraqeb...",
        "autosumm-replace": "bdl lmohtawa b  \"$1\"",
        "autoredircomment": "hwwl sfha l [[$1]]",
        "autosumm-new": "dir chi ssfha b  \"$1\"",
-       "livepreview-loading": "tssna wa7d chwiya kaytcharja ....",
-       "livepreview-ready": "tssna wahd chwiya rah kaytcharja. ....  safi ha hwa wajd",
-       "livepreview-failed": "ĝṛḍ mobaċir ma njḫ-ċ!\njrreb l-ĝṛḍ l-ĝadi.",
-       "livepreview-error": "ma njḫ-ċ ṫ-ṫiṣal: $1 \"$2\".\njrreb l-ĝṛḍ l-ĝadi.",
        "lag-warn-normal": "tghiyrat jdad y3ni aqal mn  $1 {{PLURAL:$1|taniya|tawani}} iqdr matbanch lik flista",
-       "watchlistedit-numitems": "lista d  s-suivi dyalk fiha  {{PLURAL:$1|1 onwan|$1 anawin}}, bla sfahi dniqach.",
-       "watchlistedit-noitems": "lista dyal ladressat dyalk mafihach ta onwan.",
        "watchlistedit-normal-title": "ĝddel qa'imaṫ l-moṛaqaḅa",
        "watchlistedit-normal-legend": "Mmḫiya men l-lista dyal s-suivi",
        "watchlistedit-normal-submit": "hiyd ladressat",
        "compare-rev1": "morajaa 1",
        "compare-rev2": "morajaa 2",
        "compare-submit": "qarn",
-       "dberr-header": "had lwiki fih chi mochkil",
        "dberr-problems": "smh lina had lmawqia ando chi machakil tiqniya",
        "dberr-again": "jrb tssna 5 dqayq oaawd thmil",
        "dberr-info": "mayqdrch ittasl b qaaidat lbayanat : $1",
index f2646bc..ae9538a 100644 (file)
@@ -7,7 +7,8 @@
                        "Ghaly",
                        "Meno25",
                        "Ouda",
-                       "Ramsis II"
+                       "Ramsis II",
+                       "아라"
                ]
        },
        "tog-underline": "حط خط تحت اللينكات:",
@@ -20,7 +21,6 @@
        "tog-showtoolbar": "بين شريط التعديل",
        "tog-editondblclick": "عدل الصفح لما تدوس مرتين",
        "tog-editsectiononrightclick": "اسمح بـ تعديل الاجزاء لما تعمل كليك يمين بـالماوس على عناوين الاجزاء",
-       "tog-rememberpassword": " (لمدة   $1 {{PLURAL:$1|يوم|يوم}})خليك فاكر دخولى على الكمبيوتر دا",
        "tog-watchcreations": "زوّد الصفح اللى ابتديتها على ليستة الصفح اللى باراقبها.",
        "tog-watchdefault": "زوّد الصفح اللى باعدلها على ليستة الصفح اللى باراقبها",
        "tog-watchmoves": "زوّد الصفح اللى بانقلها على ليستة الصفح اللى باراقبها",
        "readonly_lag": "قاعدة البيانات (الـ database) اتقفلت اوتوماتيكى علشان تقدر السيرڤرات الـ slave تلحق السيرڤر الـ master",
        "internalerror": "غلط جوّانى",
        "internalerror_info": "غلط جوّانى: $1",
-       "fileappenderror": "ماقدرناش نضيف \"$1\" على \"$2\".",
        "filecopyerror": "ما نفع ش  يتنسخ الفايل \"$1\" لـ \"$2\".",
        "filerenameerror": "ما نفع ش يتغير اسم الفايل \"$1\" لـ \"$2\".",
        "filedeleteerror": "ما نفع ش يتمسح الفايل \"$1\".",
        "directorycreateerror": "ما نفع ش يتعمل الدليل \"$1\".",
        "filenotfound": "مش نافع يلاقى الفايل \"$1\".",
-       "fileexistserror": "ما نفع ش يتكتب للفايل \"$1\": الفايل موجود",
        "unexpected": "قيمه مش متوقعه: \"$1\"=\"$2\".",
        "formerror": "غلط: ما نفعت ش تتقدم الاستماره",
        "badarticleerror": "مش ممكن تتفذ العمليه دى على الصفحه دى",
        "savearticle": "سييڤ الصفحه",
        "preview": "بروفه",
        "showpreview": "عرض البروفه",
-       "showlivepreview": "بروفه حيه",
        "showdiff": "بيين التعديلات",
        "anoneditwarning": "'''تحذير:''' انت ما عملتش لوجين.\nعنوان الاى  بى  بتاعك هايتسجل فى تاريخ الصفحه .",
        "missingsummary": "'''خد بالك:''' انت ما كتبتش ملخص للتعديل.\nلو دوست على سييڤ الصفحه مرة تانية التعديل بتاعك ح يتحفظ من غير ملخص.",
        "edit-gone-missing": "مش ممكن تعديل الصفحه.\nيظهر انها إتمسحت.",
        "edit-conflict": "تضارب تحريرى.",
        "edit-no-change": "تعديلك تم تجاهله، لأن ما حصلش أى تعديل للنص.",
-       "postedit-confirmation": "تعديلك  إتسييڤ.",
+       "postedit-confirmation-saved": "تعديلك  إتسييڤ.",
        "edit-already-exists": "لم يمكن إنشاء صفحة جديدة.\nهى موجودة بالفعل.",
        "defaultmessagetext": "النص الاوتوماتيكى",
        "content-failed-to-parse": "فشل ف تحليل $2 محتوى لـ $1 موديل: $3",
        "search-nonefound": "لا توجد نتائج تطابق الاستعلام.",
        "powersearch-legend": "تدوير متقدم",
        "powersearch-ns": "تدوير فى اسم المساحه:",
-       "powersearch-redir": "لستة التحويلات",
        "powersearch-togglelabel": "التشييك:",
        "powersearch-toggleall": "الكل",
        "powersearch-togglenone": "و لا حاجه",
        "prefs-advancedsearchoptions": "اختيارات متقدمه",
        "prefs-advancedwatchlist": "اختيارات متقدمه",
        "prefs-displayrc": "اختيارات العرض",
-       "prefs-displaysearchoptions": "اختيارات العرض",
        "prefs-displaywatchlist": "اختيارات العرض",
        "prefs-diffs": "التغيير",
        "email-address-validity-valid": "عنوان الإيميل صح",
        "recentchanges-label-unpatrolled": "التعديل ده مإتراجعش لسه",
        "recentchanges-legend-newpage": "(بص كمان على [[Special:NewPages|قايمه الصفحات الجديده]])",
        "rcnotefrom": "دى التعديلات من '''$2''' (ل '''$1''' معروضه).",
-       "rclistfrom": "اظهر التعديلات بدايه من $1",
+       "rclistfrom": "اظهر التعديلات بدايه من $3 $2",
        "rcshowhideminor": "$1 تعديلات صغيره",
        "rcshowhidebots": "$1 البوتات",
        "rcshowhideliu": "$1 اليوزرز المتسجلين",
        "upload-too-many-redirects": "الـ URL فيه تحويلات اكتر من اللازم",
        "upload-http-error": "حصل غلط فى الـHTTB :$1",
        "img-auth-accessdenied": "الوصول مش مسموح بيه",
-       "img-auth-nopathinfo": "PATH_INFO مش موجود.\nالخادم بتاعك مش مضبوط علشان يدى المعلومه دى.\nممكن يكون CGI-based ومايقدرش يدعم img_auth.\nبص على https://www.mediawiki.org/wiki/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\" مش فى القايمه البيضا.",
        "watchlist-details": "{{PLURAL:$1|$1 صفحه|$1 صفحه}} فى قايمه مراقبتك، بدون عد صفحات المناقشه.",
        "wlheader-enotif": "*خاصية الاعلام بالايميل متفعلة",
        "wlheader-showupdated": "الصفحات اللى اتغيرت  بعد زيارتك ليها اخر مرة معروضة بالخط '''العريض'''",
-       "watchmethod-recent": "التشييك على التعديلات الاخيرة للصفحات المتراقبة",
-       "watchmethod-list": "التشييك فى الصفحات المتراقبة على التعديلات الاخيرة",
-       "watchlistcontains": "لستة المراقبة بتاعتك فيها $1 {{PLURAL:$1|صفحة|صفحات}}.",
-       "iteminvalidname": "مشكلة فى '$1'، اسم مش صحيح...",
        "wlshowlast": "عرض اخر $1 ساعات $2 ايام $3",
        "watchlist-options": "اختيارات قايمة المراقبة",
        "watching": "بيراقب...",
        "enotif_lastvisited": "شوف $1 لمراجعة كل التغييرات اللى حصلت من أخر زيارة ليك.",
        "enotif_lastdiff": "شوف $1 علشان تبص على التغيير دا.",
        "enotif_anon_editor": "يوزر مش معروف $1",
-       "enotif_body": "عزيزى $WATCHINGUSERNAME,\n\n\nالصفحه {{SITENAME}} $PAGETITLE اتغيّرت $CHANGEDORCREATED فى $PAGEEDITDATE من $PAGEEDITOR, شوف $PAGETITLE_URL علشان تعرف مراجعة دلوقتى.\n\n$NEWPAGE\n\nملخص تعديل المحرر: $PAGESUMMARY $PAGEMINOREDIT\n\nاتصل بالمحرر:\nايميل: $PAGEEDITOR_EMAIL\nصفحة اليوزر: $PAGEEDITOR_WIKI\n\nمش ح يكون فيه تنبيهات تانيه فى حالة لو حصل تغييرات اكتر الا اذا زورت الصفحه دى.\nتقدر بردو ترجّع اعلمة التنبيه ع الزيرو لكل الصفح المتراقبه بتاعتك على ليستة المراقبه.\n\n\n             نظام التنبيه {{SITENAME}} السهل\n\n--\nعلشان تغيّر ليستة المراقبه بتاعتك, زور\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nعلشان تمسح الصفحه من على ليستة مراقبتك, زور\n$UNWATCHURL\n\nالfeedback و مساعده اكتر:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "عزيزى $WATCHINGUSERNAME,\n\n\nالصفحه {{SITENAME}} $PAGETITLE اتغيّرت $CHANGEDORCREATED فى $PAGEEDITDATE من $PAGEEDITOR, شوف $PAGETITLE_URL علشان تعرف مراجعة دلوقتى.\n\n$NEWPAGE\n\nملخص تعديل المحرر: $PAGESUMMARY $PAGEMINOREDIT\n\nاتصل بالمحرر:\nايميل: $PAGEEDITOR_EMAIL\nصفحة اليوزر: $PAGEEDITOR_WIKI\n\nمش ح يكون فيه تنبيهات تانيه فى حالة لو حصل تغييرات اكتر الا اذا زورت الصفحه دى.\nتقدر بردو ترجّع اعلمة التنبيه ع الزيرو لكل الصفح المتراقبه بتاعتك على ليستة المراقبه.\n\n\n             نظام التنبيه {{SITENAME}} السهل\n\n--\nعلشان تغيّر ليستة المراقبه بتاعتك, زور\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nعلشان تمسح الصفحه من على ليستة مراقبتك, زور\n$UNWATCHURL\n\nالfeedback و مساعده اكتر:\n$HELPPAGE",
        "created": "إتنشأت",
        "changed": "اتغيرت",
        "deletepage": "امسح الصفحه",
        "blockip": "منع يوزر",
        "blockip-legend": "منع اليوزر",
        "blockiptext": "استخدم الاستمارة اللى تحت لمنع عنوان أيبى أو يوزر معين من الكتابة.\nدا لازم يحصل بس علشان تمنع التخريب ،و على حسب\n[[{{MediaWiki:Policy-url}}|السياسة]].\nاكتب سبب محدد تحت (يعنى مثلا، اكتب الصفحات المعينة اللى اتخربت بسببه).",
-       "ipadressorusername": "عنوان الأيبى أو اسم اليوزر:",
+       "ipaddressorusername": "عنوان الأيبى أو اسم اليوزر:",
        "ipbexpiry": "مدة المنع:",
        "ipbreason": "السبب:",
        "ipbreason-dropdown": "*أسباب المنع المشهورة\n** تدخيل معلومات غلط\n** مسح المحتوى من الصفحات\n** سبام لينك لمواقع خارجية\n** كتابة كلام مالوش معنى فى الصفحات\n** سلوك عدواني/تحرش\n** إساءة استخدام اكتر من حسابات\n** اسم يوزر مش مقبول",
        "monobook.js": "/* أى جافاسكريبت هنا ح تتحمل لليوزرز اللى بيستعملو واجهة مونوبوك */",
        "modern.js": "/* أى جافاسكريبت هنا ح تتحمل لليوزرز اللى بيستعملو واجهة مودرن */",
        "vector.js": "/* اى جافاسكريبت هنا حتتحمل لكل يوزر بيستخدم واجهة فكتور */",
-       "notacceptable": "السيرفر بتاع الويكى مش ممكن يديلك بيانات بصيغة ممكن عميلك يقراها.",
        "anonymous": "{{PLURAL:$1|يوزر مجهول|يوزرز مجهولين}} ل {{SITENAME}}",
        "siteuser": "يوزر {{SITENAME}} $1",
        "anonuser": "{{SITENAME}} يوزر مجهول $1",
        "newimages-summary": "الصفحةالمخصوصة دى بتعرض آخر الملفات المتحملة",
        "newimages-legend": "اسم الملف",
        "newimages-label": "اسم الملف (او حتة منه):",
-       "showhidebots": "($1 بوتات)",
        "noimages": "مافيش حاجة للعرض.",
        "ilsubmit": "تدوير",
        "bydate": "على حسب التاريخ",
        "size-kilobytes": "$1 كيلوبايت",
        "size-megabytes": "$1 ميجابايت",
        "size-gigabytes": "$1 جيجابايت",
-       "livepreview-loading": "تحميل…",
-       "livepreview-ready": "تحميل… جاهز!",
-       "livepreview-failed": "البروفة الحية مانفعتش!\nجرب البروفة العادية.",
-       "livepreview-error": "الاتصال مانفعش: $1 \"$2\"\nجرب البروفة العادية.",
        "lag-warn-normal": "التغييرات الأحدث من $1 {{PLURAL:$1|ثانية|ثانية}} ثانية ممكن ما تظهرش فى اللستة دي.",
        "lag-warn-high": "علشان فى تأخير كبير فى تحديث قاعدة البيانات بتاعة السيرفر،  التعديلات  اللى أحدث من $1 {{PLURAL:$1|ثانية|ثانية}}\nممكن ما تظهرش فى اللستة دى.",
-       "watchlistedit-numitems": "لستة المراقبة بتاعتك  فيها{{PLURAL:$1|عنوان واحد|$1 عنوان}}، من غير صفحات المناقشة.",
-       "watchlistedit-noitems": "لستة الرقابة بتاعتك  مافيهاش ولا عنوان.",
        "watchlistedit-normal-title": "تعديل لستة المراقبة",
        "watchlistedit-normal-legend": "شيل العناوين من لستة المراقبة",
        "watchlistedit-normal-explain": "العناوين فى لستة المراقبة بتاعتك معروضة تحت.\nعلشان تشيل عنوان، دوس على الصندوق اللى جنبه، ودوس على شيل العناوين\"{{int:Watchlistedit-normal-submit}}\".\nممكن كمان [[Special:EditWatchlist/raw|تعديل اللستة الخام]].",
        "compare-page1": "صفحه 1",
        "compare-page2": "صفحه 2",
        "compare-submit": "قارن",
-       "dberr-header": "الويكى دا فيه مشكله",
        "dberr-problems": "متأسفين، السايت دا بيعانى من صعوبات فنيه",
        "dberr-again": "حاول تستنا كام دقيقه و بعدين اعمل تحميل من تانى",
        "dberr-info": "(مش قادرين نتصل بـ السيرفر بتاع قاعدة البيانات: $1)",
index 006ca34..c4f45d0 100644 (file)
@@ -13,7 +13,8 @@
                        "Rajuonline",
                        "Reedy",
                        "Simbu123",
-                       "Urhixidur"
+                       "Urhixidur",
+                       "아라"
                ]
        },
        "tog-underline": "সংযোগসমূহ অধোৰেখিত কৰক:",
@@ -26,7 +27,6 @@
        "tog-showtoolbar": "সম্পাদনা দণ্ডিকা দেখুৱাওক",
        "tog-editondblclick": "দুবাৰ ক্লিক কৰি পৃষ্ঠা সম্পাদনা কৰিব পাৰি",
        "tog-editsectiononrightclick": "অনুচ্ছেদৰ শিৰোনামাত ৰাইট্‌ ক্লিক টিপি সম্পাদনা কৰাটো সক্ৰিয় কৰক",
-       "tog-rememberpassword": "মোৰ প্ৰৱেশ এই কম্পিউটাৰত মনত ৰাখক (সৰ্বাধিক $1 {{PLURAL:$1|দিনলৈ|দিনলৈ}})",
        "tog-watchcreations": "মই সৃষ্টি সকলো পৃষ্ঠা মোৰ লক্ষ্য-তালিকাত যোগ কৰক",
        "tog-watchdefault": "মই সম্পাদনা কৰা সকলো পৃষ্ঠা মোৰ লক্ষ্য-তালিকাত যোগ কৰক",
        "tog-watchmoves": "মই স্থানান্তৰ কৰা সকলো পৃষ্ঠা মোৰ লক্ষ্য-তালিকাত যোগ কৰক",
        "moredotdotdot": "অধিক...",
        "morenotlisted": "এই তালিকা সম্পূৰ্ণ নহয়।",
        "mypage": "পৃষ্ঠা",
-       "mytalk": "à¦\95থা-বতৰা",
+       "mytalk": "বাৰà§\8dতালাপ",
        "anontalk": "এই IP-ত যোগাযোগ কৰক",
        "navigation": "দিকদৰ্শন",
        "and": "&#32;আৰু",
        "readonly_lag": "তথ্যকোষ স্বয়ংক্ৰিয়ভাৱে বন্ধ হৈছে যাতে দ্বিতীয় শ্ৰেণীৰ তথ্যকোষৰ চাৰ্ভাৰ প্ৰধান তথ্যকোষৰ চাৰ্ভাৰৰ অৱস্থালৈ আহিব পাৰে ।",
        "internalerror": "আভ্যন্তৰীণ ত্ৰুটি",
        "internalerror_info": "আভ্যন্তৰীণ ত্ৰুটি: $1",
-       "fileappenderrorread": "যোৰা দিয়াৰ সময়ত \"$1\" পাঠ্য কৰা নহ'ল ।",
-       "fileappenderror": "\"$2\"ৰ লগত \"$1\"ৰ সংযোগ কৰা নহ'ল ।",
        "filecopyerror": "\"$1\" ফাইলটো \"$2\"লৈ প্ৰতিলিপি কৰিব পৰা নগ’ল।",
        "filerenameerror": "\"$1\" ফাইলৰ নাম সলনি কৰি \"$2\" কৰিব পৰা নগ’ল ।",
        "filedeleteerror": "\"$1\" ফাইলতো বিলোপ কৰিব পৰা নগ’ল।",
        "directorycreateerror": "\"$1\" নিৰ্দেশিকা সৃষ্টি কৰিব পৰা নগ’ল।",
        "filenotfound": "\"$1\" নামৰ ফাইলটো বিচাৰি পোৱা নগ’ল।",
-       "fileexistserror": "\"$1\" ফাইলটোত লিখিব নোৱাৰি: ফাইলটো আগৰ পৰাই আছে",
        "unexpected": "অনাকাংক্ষিত মূল্য: \"$1\"=\"$2\".",
        "formerror": "ত্ৰুটি: প্ৰপত্ৰখন জমা দিব পৰা নগ’ল",
        "badarticleerror": "এই পৃষ্ঠাখনত এই কামটো কৰিব নোৱাৰি ।",
        "userlogin-helplink2": "প্ৰৱেশ সংক্ৰান্তীয় সাহায্য",
        "userlogin-loggedin": "আপুনি ইতিমধ্যে {{GENDER:$1|$1}} হিচাপে প্ৰৱেশ কৰিছে। তলৰ আন সদস্যৰূপে প্ৰৱেশ কৰিবলৈ তলৰ প্ৰপত্ৰ ব্যৱহাৰ কৰক।",
        "userlogin-createanother": "আন এটা একাউণ্ট সৃষ্টি কৰক",
-       "createacct-join": "আপোনাৰ তথ্যসমূহ তলত লিখক।",
-       "createacct-another-join": "নতুন একাউণ্টৰ তথ্যসমূহ তলত লিখক।",
        "createacct-emailrequired": "ই-মেইল ঠিকনা",
        "createacct-emailoptional": "ই-মেইল ঠিকনা (বৈকল্পিক)",
        "createacct-email-ph": "আপোনাৰ ই-মেইল ঠিকনা লিখক",
        "savearticle": "পৃষ্ঠা সাঁচক",
        "preview": "খচৰা",
        "showpreview": "খচৰা চাওক",
-       "showlivepreview": "পোনপটিয়া খচৰা",
        "showdiff": "সালসলনিবোৰ দেখুৱাওক",
        "anoneditwarning": "<span style=\"color:red;\">'''সাৱধান:''' আপুনি প্ৰৱেশ কৰা নাই ।</span> \nএই পৃষ্ঠাৰ ইতিহাসত আপোনাৰ আই পি ঠিকনা সংৰক্ষিত কৰা হ'ব।",
        "anonpreviewwarning": "''আপুনি প্ৰৱেশ কৰা নাই। আপোনাৰ সম্পাদনা সাঁচিলে আপোনাৰ আই-পি ঠিকনা এই পৃষ্ঠাৰ ইতিহাসত সংৰক্ষিত হ'ব।\"",
        "accmailtext": "[[User talk:$1|$1]]-ৰ কাৰণে যাদৃচ্ছিকভাৱে উৎপন্ন কৰা গুপ্তশব্দ $2লৈ পঠোৱা হ'ল । \nএই নতুন একাউন্টত প্ৰৱেশ কৰি ''[[Special:ChangePassword|গুপ্তশব্দ সলনি কৰক]]'' পৃষ্ঠাখনত শব্দতো সলনি কৰি ল’ব পাৰিব ।",
        "newarticle": "(নতুন)",
        "newarticletext": "আপুনি বিচৰা প্ৰবন্ধটো বিচাৰি পোৱা নগ'ল।\n\nইচ্ছা কৰিলে আপুনিয়েই এই প্ৰবন্ধটো লিখা আৰম্ভ কৰিব পাৰে। [$1 ইয়াত] সহায় পাব।\n\nআপুনি যদি ইয়ালৈ ভুলতে আহিছে, তেনেহলে আপোনাৰ ব্ৰাওজাৰৰ '''BACK''' বুটামত টিপা মাৰক।",
-       "anontalkpagetext": "----''à¦\8fà¦\87à¦\96ন à¦\86লà§\8bà¦\9aনা à¦ªà§\83ষà§\8dঠা à¦¬à§\87নামà§\80 à¦¸à¦¦à¦¸à§\8dযৰ à¦¬à¦¾à¦¬à§\87, à¦¯à¦¿à¦¯à¦¼à§\87 à¦¨à¦¿à¦\9cা à¦\8fà¦\95াà¦\89নà§\8dà¦\9f  à¦¸à§\83ষà§\8dà¦\9fি à¦\95ৰা à¦¨à¦¾à¦\87 à¦¬à¦¾ à¦¯à¦¿à¦¯à¦¼à§\87 à¦¸à§\87à¦\87 à¦\8fà¦\95াà¦\89নà§\8dà¦\9f à¦¬à§\8dযৱহাৰ à¦¨à¦\95ৰà§\87 à¥¤\nà¦\8fতà§\87à¦\95à§\87 à¦\86মি à¦¤à§\87à¦\96à§\87তসà¦\95লà¦\95 à¦\86à¦\87-পি à¦ à¦¿à¦\95নাৰà§\87 à¦\9aিনাà¦\95à§\8dত à¦\95ৰিবলà§\88 à¦¬à¦¾à¦§à§\8dয à¥¤\nসà§\87à¦\87 à¦\8fà¦\95à§\87à¦\87 à¦\86à¦\87-পি à¦ à¦¿à¦\95না à¦\85নà§\87à¦\95à§\87à¦\87 à¦¬à§\8dযৱহাৰ à¦\95ৰিব à¦ªà¦¾à§°à§\87 ।\nআপুনি যদি এজন বেনামী সদস্য আৰু যদি আপুনি অনুভৱ কৰে যে আপোনাৰ প্ৰতি অপ্ৰাসঙ্গিক মন্তব্য কৰা হৈছে, তেনেহলে আন বেনামী সদস্যৰ পৰা পৃথক কৰিবলৈ \n[[Special:UserLogin/signup|একাউন্ট সৃষ্টি কৰক]] বা [[Special:UserLogin|প্ৰৱেশ কৰক]] ।''",
+       "anontalkpagetext": "----''à¦\8fà¦\87à¦\96ন à¦\86লà§\8bà¦\9aনা à¦ªà§\83ষà§\8dঠা à¦¬à§\87নামà§\80 à¦¸à¦¦à¦¸à§\8dযৰ à¦¬à¦¾à¦¬à§\87, à¦¯à¦¿à¦¯à¦¼à§\87 à¦¨à¦¿à¦\9cা à¦\8fà¦\95াà¦\89ণà§\8dà¦\9f  à¦¸à§\83ষà§\8dà¦\9fি à¦\95ৰা à¦¨à¦¾à¦\87 à¦¬à¦¾ à¦¯à¦¿à¦¯à¦¼à§\87 à¦¸à§\87à¦\87 à¦\8fà¦\95াà¦\89ণà§\8dà¦\9f à¦¬à§\8dযৱহাৰ à¦¨à¦\95ৰà§\87।\nà¦\8fতà§\87à¦\95à§\87 à¦\86মি à¦¤à§\87à¦\96à§\87তসà¦\95লà¦\95 à¦\86à¦\87-পি à¦ à¦¿à¦\95নাৰà§\87 à¦\9aিনাà¦\95à§\8dত à¦\95ৰিবলà§\88 à¦¬à¦¾à¦§à§\8dয।\nসà§\87à¦\87 à¦\8fà¦\95à§\87à¦\87 à¦\86à¦\87-পি à¦ à¦¿à¦\95না à¦\85নà§\87à¦\95à§\87à¦\87 à¦¬à§\8dযৱহাৰ à¦\95ৰিব à¦ªà¦¾à§°à§\87।\nআপুনি যদি এজন বেনামী সদস্য আৰু যদি আপুনি অনুভৱ কৰে যে আপোনাৰ প্ৰতি অপ্ৰাসঙ্গিক মন্তব্য কৰা হৈছে, তেনেহলে আন বেনামী সদস্যৰ পৰা পৃথক কৰিবলৈ \n[[Special:UserLogin/signup|একাউন্ট সৃষ্টি কৰক]] বা [[Special:UserLogin|প্ৰৱেশ কৰক]] ।''",
        "noarticletext": "এই পৃষ্ঠাত বৰ্তমান কোনো পাঠ্য নাই ।\nআপুনি আন পৃষ্ঠাত [[Special:Search/{{PAGENAME}}| এই শিৰোনামা অনুসন্ধান কৰিব পাৰে]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} সম্পৰ্কীয় অভিলেখ অনুসন্ধান কৰিব পাৰে],\nবা [{{fullurl:{{FULLPAGENAME}}|action=edit}} এই পৃষ্ঠা সম্পাদনা কৰিব পাৰে]</span>",
        "noarticletext-nopermission": "এই পৃষ্ঠাত বৰ্তমান কোনো পাঠ্য নাই।\nআপুনি আন পৃষ্ঠাত [[Special:Search/{{PAGENAME}}|এই শিৰোনামা অনুসন্ধান কৰিব পাৰে]],\nবা <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} সম্পৰ্কীয় অভিলেখ অনুসন্ধান কৰিব পাৰে]</span>, কিন্তু এই পৃষ্ঠা সৃষ্টি কৰিবলৈ আপোনাৰ অনুমতি নাই।",
        "missing-revision": "\"{{FULLPAGENAME}}\" নামৰ পৃষ্ঠাৰ #$1 সংশোধনৰ অস্তিত্ব নাই।\n\nসাধাৰণতে বিলোপ কৰা এখন পৃষ্ঠাৰ পুৰণা ইতিহাস লিংক অনুসৰণ কৰিলে এনে হয়।\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} বিলোপন ল'গ]ত অধিক তথ্য পাব।",
        "edit-gone-missing": "পৃষ্ঠাটো নবীকৰণ কৰিব পৰা নগ’ল।\nসম্ভৱতঃ পৃষ্ঠাখন বিলোপ কৰা হৈছে।",
        "edit-conflict": "সম্পাদনা দ্বন্দ্ব।",
        "edit-no-change": "আপোনাৰ সম্পাদনা আওকাণ কৰা হৈছে, কাৰণ লেখাত কোনো তফাৎ নাই।",
-       "postedit-confirmation": "আপোনাৰ সম্পাদনা সাঁচি থোৱা হ'ল।",
+       "postedit-confirmation-saved": "আপোনাৰ সম্পাদনা সাঁচি থোৱা হ'ল।",
        "edit-already-exists": "নতুন পৃষ্ঠা সৃষ্টি কৰা নহ'ল।\nপৃষ্ঠাটো ইতিমধ্যে আছেই।",
        "defaultmessagetext": "সাধাৰণ বাৰ্তা পাঠ্য",
        "content-failed-to-parse": "$1 মডেলৰ বাবে $2ৰ তথ্য নিকা কৰিব পৰা নগ’ল: $3",
        "search-nonefound": "এই অনুসন্ধানৰ কোনো ফলাফল নাই ।",
        "powersearch-legend": "শক্তিশালী সন্ধান",
        "powersearch-ns": "নামস্থানবোৰত সন্ধান:",
-       "powersearch-redir": "পুনৰ্নিৰ্দেশনাৰ তালিকা",
        "powersearch-togglelabel": "পৰীক্ষা কৰক:",
        "powersearch-toggleall": "সকলো",
        "powersearch-togglenone": "একো নাই",
        "prefs-emailconfirm-label": "ইমেইল নিশ্চিতকৰণ:",
        "youremail": "আপোনাৰ ই-মেইল *",
        "username": "{{GENDER:$1|সদস্যনাম}}:",
-       "uid": "{{GENDER:$1|User}} চিহ্ন:",
        "prefs-memberingroups": "{{PLURAL:$1|গোট|গোটসমূহৰ}} {{GENDER:$2|সদস্য}} :",
        "prefs-registration": "পঞ্জীয়ন কৰাৰ সময়:",
        "yourrealname": "প্ৰকৃত নাম:",
        "prefs-advancedsearchoptions": "উচ্চতৰ বিকল্পসমূহ",
        "prefs-advancedwatchlist": "উচ্চতৰ বিকল্পসমূহ",
        "prefs-displayrc": "প্ৰদৰ্শন বিকল্পসমূহ",
-       "prefs-displaysearchoptions": "বিকল্পসমূহ প্ৰদৰ্শন কৰক",
        "prefs-displaywatchlist": "বিকল্পসমূহ প্ৰদৰ্শন কৰক",
        "prefs-tokenwatchlist": "ট'কেন",
        "prefs-diffs": "পাৰ্থক্য",
        "action-edit": "এই পৃষ্ঠা সম্পাদনা কৰক",
        "action-createpage": "পৃষ্ঠা সৃষ্টি কৰক",
        "action-createtalk": "কথাবতৰা পৃষ্ঠা সৃষ্টি কৰক",
-       "action-createaccount": "à¦\8fà¦\87 à¦¸à¦¦à¦¸à§\8dয à¦\8fà¦\95াà¦\89নà§\8dà¦\9f  সৃষ্টি কৰক",
+       "action-createaccount": "à¦\8fà¦\87 à¦¸à¦¦à¦¸à§\8dয à¦\8fà¦\95াà¦\89ণà§\8dà¦\9f সৃষ্টি কৰক",
        "action-minoredit": "সম্পাদনা অগুৰুত্বপূৰ্ণ বুলি চিহ্নিত কৰক",
        "action-move": "এই পৃষ্ঠা স্থানান্তৰ কৰক",
        "action-move-subpages": "এই পৃষ্ঠা আৰু ইয়াৰ উপপৃষ্ঠাসমূহ আঁতৰাওক",
        "recentchanges-legend-newpage": "(লগতে [[Special:NewPages|নতুন পৃষ্ঠাসমূহৰ তালিকা]] চাওক)",
        "recentchanges-legend-plusminus": "(''±১২৩'')",
        "rcnotefrom": "তলত '''$2''' ৰ পৰা হোৱা ('''$1''' লৈকে) পৰিৱৰ্তন দেখুৱা হৈছে ।",
-       "rclistfrom": "$1ৰ পৰা নতুন সালসলনি দেখুৱাওক",
+       "rclistfrom": "$3 $2ৰ পৰা নতুন সালসলনি দেখুৱাওক",
        "rcshowhideminor": "$1 -সংখ্যক নগণ্য সম্পাদনা",
        "rcshowhideminor-show": "দেখুৱাওক",
        "rcshowhideminor-hide": "লুকুৱাওক",
        "uploadstash-refresh": "ফাইলৰ তালিকা ৰিফ্ৰে’চ কৰক",
        "invalid-chunk-offset": "অবৈধ চাঙ্ক অফছেট্‌",
        "img-auth-accessdenied": "প্ৰৱেশাধিকাৰ নাই",
-       "img-auth-nopathinfo": "সন্ধানহীন PATH_INFO।\nআপোনাৰ চাৰ্ভাৰ এই তথ্য প্ৰেৰণ কৰিবলে প্ৰস্তুত নহয়।\nই CGI-ভিত্তিক হ'ব পাৰে img_auth সমৰ্থন কৰিব নোৱাৰে।\nhttps://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
+       "img-auth-nopathinfo": "সন্ধানহীন PATH_INFO।\nআপোনাৰ চাৰ্ভাৰ এই তথ্য প্ৰেৰণ কৰিবলে প্ৰস্তুত নহয়।\nই CGI-ভিত্তিক হ'ব পাৰে img_auth সমৰ্থন কৰিব নোৱাৰে।\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization চাওক।",
        "img-auth-notindir": "সজা হোৱা আপল’ড ডিৰেক্টৰিত অনুৰোধ কৰা পথটো নাই ।",
        "img-auth-badtitle": "\"$1\" ৰ পৰা কোনো বৈধ শিৰোনামা তৈয়াৰ কৰিব পৰা নগ’ল ।",
        "img-auth-nologinnWL": "আপুনি প্ৰৱেশ কৰা নাই আৰু চকু ৰখা ৰখা পৃষ্ঠাতালিকাত \"$1\" নাই ।",
        "ncategories": "$1টা {{PLURAL:$1|শ্ৰেণী|শ্ৰেণী}}",
        "ninterwikis": "$1 {{PLURAL:$1|ইণ্টাৰৱিকি|ইণ্টাৰৱিকিসমূহ}}",
        "nlinks": "$1 {{PLURAL:$1|সংযোগ|সংযোগ}}",
-       "nmembers": "{{PLURAL:$1|সদস্য|$1 সদস্যবৃন্দ}}",
+       "nmembers": "{{PLURAL:|$1 টা প্ৰবন্ধ বা উপশ্ৰেণী|$1 টা প্ৰবন্ধ বা উপশ্ৰেণী}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|জন সদস্য}}",
        "nrevisions": "$1টা {{PLURAL:$1|সংশোধন|সংশোধন}}",
        "nviews": "$1 {{PLURAL:$1|টা দৰ্শন|টা দৰ্শন}}",
        "log-title-wildcard": "এই পাঠেৰে আৰম্ভ হোৱা শিৰোনামাসমূহ অনুসন্ধান কৰক",
        "showhideselectedlogentries": "নিৰ্বাচিত ল'গ ভুক্তি দেখুৱাওক/লুকুৱাওক",
        "allpages": "সকলোবোৰ পৃষ্ঠা",
-       "alphaindexline": "$1 -ৰ পৰা $2 -লৈ",
        "nextpage": "পৰৱৰ্তী পৃষ্ঠা ($1)",
        "prevpage": "পিছৰ পৃষ্ঠা($1)",
        "allpagesfrom": "ইয়াৰে আৰম্ভ হোৱা পৃষ্ঠাবোৰ দেখুৱাওক:",
        "watchlist-details": "আলোচনা পৃষ্ঠাসমূহ লেখত নধৰি {{PLURAL:$1|$1 টা পৃষ্ঠা}} আপোনাৰ লক্ষ্য-তালিকাত আছে ।",
        "wlheader-enotif": "ইমেইল জাননী সক্ৰিয় কৰা হৈছে।",
        "wlheader-showupdated": "আপোনাৰ শেষ পৰিদৰ্শনৰ পিছত সলনি হোৱা পৃষ্ঠাসমূহ '''গাঢ়''' আখৰত দেখুওৱা হৈছে।",
-       "watchmethod-recent": "লক্ষ্য কৰা পৃষ্ঠাসমূহ শেহতীয়া সম্পাদনাৰ বাবে পৰীক্ষা কৰা হৈছে",
-       "watchmethod-list": "লক্ষ্য কৰা পৃষ্ঠাসমূহ শেহতীয়া সম্পাদনাৰ বাবে পৰীক্ষা কৰা হৈছে",
-       "watchlistcontains": "আপোনাৰ লক্ষ্য-তালিকাত $1টা {{PLURAL:$1|পৃষ্ঠা}} আছে ।",
-       "iteminvalidname": "'$1' আইটেমটোৰ লগত সমস্যা হৈছে, অবৈধ নাম...",
        "wlshowlast": "যোৱা $1 ঘণ্টা $2 দিন $3 চাওক",
        "watchlist-options": "লক্ষ্য-তালিকা পছন্দসমূহ",
        "watching": "চকু দিয়া হৈছে.....",
        "enotif_lastvisited": "আপোনাৰ শেষ পৰিদৰ্শনৰ পিছত হোৱা সকলো সালসলনিৰ বাবে $1 চাওক ।",
        "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{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "প্ৰিয় $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nসম্পাদকৰ সাৰাংশ: $PAGESUMMARY $PAGEMINOREDIT\n\nসম্পাদকজনক যোগাযোগ কৰক:\nমেইল: $PAGEEDITOR_EMAIL\nৱিকি: $PAGEEDITOR_WIKI\n\nআপুনি এই পৃষ্ঠাটো প্ৰৱেশ কৰি নোচোৱালৈকে আন সালসলনিৰ কোনো জাননী দিয়া নহ’ব। আপুনি আপোনাৰ লক্ষ্য-তালিকাৰ পৃষ্ঠাবোৰৰ জাননী ফ্লেগ পূৰ্বৰ অৱস্থালৈও ঘূৰাই নিব পাৰে ।\n\nআপোনাৰ {{SITENAME}} জাননী ব্যৱস্থা\n\n--\nআপোনাৰ ই-মেইল জাননী ছেটিং সলনি কৰিবলৈ চাওক\n{{canonicalurl:{{#special:Preferences}}}}\n\nআপোনাৰ লক্ষ্য-তালিকাৰ ছেটিং সলনি কৰিবলৈ চাওক\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nআপোনাৰ লক্ষ্য-তালিকাৰ পৰা পৃষ্ঠা বিলোপ কৰিবলৈ চাওক\n$UNWATCHURL\n\nপ্ৰতিক্ৰিয়া আৰু অধিক সহযোগিতাৰ বাবে:\n$HELPPAGE",
        "created": "সৃষ্টি কৰা হ’ল",
        "changed": "সলোৱা হৈছে",
        "deletepage": "পৃষ্ঠা বিলোপ কৰক",
        "blockip": "সদস্য বাৰণ কৰক",
        "blockip-legend": "সদস্য বাৰণ কৰক",
        "blockiptext": "তলৰ প্ৰপত্ৰখন ব্যৱহাৰ কৰি কোনো নিৰ্দিষ্ট আই.পি. ঠিকনা বা সদস্যনামৰ লিখাৰ অধিকাৰ বাৰণ কৰিব পাৰে ।\nকেৱল ধ্বংসপ্ৰৱণতা ৰোধ কৰিবলৈ আৰু [[{{MediaWiki:Policy-url}}|নীতি]] মানি চলি এনে কৰক ।\nতলত এটা নিৰ্দিষ্ট কাৰণ উল্লেখ কৰক (যেনে, ধ্বংসসাধন কৰা পৃষ্ঠাৰ নাম) ।",
-       "ipadressorusername": "আই-পি ঠিকনা বা সদস্যনাম:",
+       "ipaddressorusername": "আই-পি ঠিকনা বা সদস্যনাম:",
        "ipbexpiry": "ম্যাদ উকলিব:",
        "ipbreason": "কাৰণ:",
        "ipbreason-dropdown": "*প্ৰতিবন্ধকৰ সাধাৰণ কাৰণসমূহ\n** ভুল তথ্য দিয়া\n** পৃষ্ঠাৰ বিষয়বস্তু আঁতৰাই পেলোৱা\n** কোনো বাহিৰা চাইটলৈ স্পাম সংযোগ দিয়া\n** পৃষ্ঠাত অৰ্থহীন বিষয়বস্তু প্ৰৱেশ কৰোৱা\n** ভীতি উদ্ৰেককাৰী আচৰণ/হাৰাশাস্তি\n** একাধিক একাউণ্টৰ অপব্যৱহাৰ\n** অগ্ৰহণযোগ্য সদস্যনাম",
        "blocklogtext": "এই অভিলেখ অৱৰোধ কৰা আৰু অৱৰোধ আঁতৰ কৰা সদস্য সম্পৰ্কীয়।\nস্বয়ংক্ৰিয়ভাৱে প্ৰতিবন্ধক পোৱা আই.পি. ঠিকনাবোৰ ইয়াত তালিকাভুক্ত কৰা হোৱা নাই।\nসাম্প্ৰতিক কাৰ্যৰত নিষেধ আৰু প্ৰতিবন্ধকৰ বাবে [[Special:BlockList|প্ৰতিবন্ধক তালিকা]] চাওক।",
        "unblocklogentry": "$1 বাৰণ উঠাই লোৱা হ’ল",
        "block-log-flags-anononly": "কেৱল বেনামী সদস্য",
-       "block-log-flags-nocreate": "à¦\8fà¦\95াà¦\89ন্ট সৃষ্টি নিষ্ক্ৰিয় কৰা হৈছে",
+       "block-log-flags-nocreate": "à¦\8fà¦\95াà¦\89ণ্ট সৃষ্টি নিষ্ক্ৰিয় কৰা হৈছে",
        "block-log-flags-noautoblock": "স্বয়ংক্ৰিয়-প্ৰতিবন্ধক নিষ্ক্ৰিয় কৰা হৈছে",
        "block-log-flags-noemail": "ই-মেইল অৱৰোধ কৰা হৈছে",
        "block-log-flags-nousertalk": "নিজৰ কথা-বতৰা পৃষ্ঠা সম্পাদনা কৰিব নোৱাৰি",
        "block-log-flags-angry-autoblock": "বৰ্ধিত স্বয়ংক্ৰিয়-প্ৰতিবন্ধক সক্ৰিয় কৰা হৈছে",
        "block-log-flags-hiddenname": "সদস্যনাম গোপন কৰা হ’ল",
-       "range_block_disabled": "প্ৰশাসকৰ পৰিসীমা প্ৰতিবন্ধক সৃষ্টি কৰিব পৰা ক্ষমতা নিষ্ক্ৰিয় কৰা হৈছে ।",
+       "range_block_disabled": "প্ৰশাসকৰ পৰিসীমা প্ৰতিবন্ধক সৃষ্টি কৰিব পৰা ক্ষমতা নিষ্ক্ৰিয় কৰা হৈছে।",
        "ipb_expiry_invalid": "অবৈধ ম্যাদ উকলা সময়",
        "ipb_expiry_temp": "গুপ্ত সদস্যনাম অৱৰোধ স্থায়ী হ’ব লাগিব ।",
        "ipb_hide_invalid": "এই বিষয়বস্তু নিবাৰণ কৰিব পৰা নগ’ল; ইয়াত {{PLURAL:$1|এটা সম্পাদনা|$1টা সম্পাদনা}} আছে ।",
        "tooltip-undo": "\"বাতিল\"এ এই সম্পাদনাক পূৰ্বাৱস্থালৈ ঘূৰাই নিব আৰু প্ৰাক্‌দৰ্শনৰ বাবে সম্পাদনাটো খুলিব। ই সম্পাদনা সাৰাংশত কাৰণ এটা লিখিবলৈ সুযোগ দিব।",
        "tooltip-preferences-save": "পছন্দসমূহ সাঁচি থওক",
        "tooltip-summary": "চমু সাৰাংশ লিখক",
-       "notacceptable": "ৱিকি চাৰ্ভাৰে আপোনাৰ ক্লায়েন্টে পঢ়িব পৰা বিন্যাসত তথ্য প্ৰদান কৰিব নোৱাৰে।",
        "anonymous": "{{SITENAME}}ৰ বেনামী {{PLURAL:$1|সদস্য|সদস্যসকল}}",
        "siteuser": "{{SITENAME}} সদস্য $1",
        "anonuser": "{{SITENAME}} বেনামী সদস্য $1",
        "newimages-summary": "এই বিশেষ পৃষ্ঠাখনত সৰ্বশেষত আপল'ড কৰা ফাইলসমূহ দেখিব ।",
        "newimages-legend": "ছেকনী",
        "newimages-label": "নথিৰ নাম (বা তাৰ এটা অংশ)",
-       "showhidebots": "(বট $1)",
        "noimages": "চাবলৈ একো নাই ।",
        "ilsubmit": "সন্ধান কৰক",
        "bydate": "তাৰিখ অনুযায়ী",
        "table_pager_empty": "ফলাফল নাই",
        "autosumm-blank": "পৃষ্ঠাটো খালী কৰা হ'ল",
        "autosumm-replace": "পৄষ্ঠাখনক \"$1\"ৰে সলনি কৰা হ'ল",
-       "autoredircomment": "[[$1]]-à¦\95 পুনৰ্নিৰ্দেশ কৰা হ'ল",
+       "autoredircomment": "[[$1]]-লà§\88 পুনৰ্নিৰ্দেশ কৰা হ'ল",
        "autosumm-new": "\"$1\" দি পৃষ্ঠা সৃষ্টি কৰা হ'ল",
-       "livepreview-loading": "ল'ড হৈ আছে…",
-       "livepreview-ready": "ল'ড হৈ আছে… প্ৰস্তুত!",
-       "livepreview-failed": "জীৱন্ত প্ৰাকদৰ্শন ব্যৰ্থ হ'ল!\nসাধাৰণ প্ৰাকদৰ্শন চেষ্টা কৰি চাওক।",
-       "livepreview-error": "সংযোগ কৰিবলে ব্যৰ্থ হল: $1 \"$2\"।\nসাধাৰণ প্ৰাকদৰ্শন চেষ্টা কৰি চাওক।",
        "lag-warn-normal": "$1 {{PLURAL:$1|ছেকেণ্ড|ছেকেণ্ড}} তকৈ নতুন পৰিৱৰ্তনসমূহ এই তালিকাত দেখুওৱা নহবও পাৰে।",
        "lag-warn-high": "উচ্চ ডাটাবেইচ চাৰ্ভাৰ পলমৰ বাবে, $1 {{PLURAL:$1|ছেকেণ্ড|ছেকেণ্ড}} তকৈ নতুন পৰিৱৰ্তনসমূহ এই তালিকাত দেখুওৱা নহবও পাৰে।",
-       "watchlistedit-numitems": "কথাবতৰা পৃষ্ঠাসমূহ বাদ দি আপোনাৰ লক্ষ্য-তালিকাত {{PLURAL:$1|এটা শিৰোনামা|$1 টা শিৰোনামা}} আছে ।",
-       "watchlistedit-noitems": "আপোনাৰ লক্ষ্য-তালিকাত এখনো ঘাই পৃষ্ঠা নাই ।",
        "watchlistedit-normal-title": "লক্ষ্য-তালিকা সম্পাদন কৰক",
        "watchlistedit-normal-legend": "লক্ষ্য-তালিকাৰ পৰা শিৰোনামা আঁতৰাওক",
        "watchlistedit-normal-explain": "আপোনাৰ নজৰ তালিকাত থকা সূচীবদ্ধ পৃষ্ঠা তলত দেখুওৱা হৈছে।\nপৃষ্ঠা সূচী আৰৰাবলৈ তাৰ আগত দিয়া বাকচত ক্লিক কৰক, আৰু \"{{int:Watchlistedit-normal-submit}}\"ত ক্লিক কৰক।\nআপুনি [[Special:EditWatchlist/raw|মূল তালিকাখনো]] সম্পাদনা কৰিব পাৰে।",
        "compare-invalid-title": "আপুনি নিৰ্ধাৰণ কৰা শিৰোনামাটো অবৈধ ।",
        "compare-title-not-exists": "আপুনি নিৰ্ধাৰণ কৰা ফাইলটোৰ অস্বিত্ব নাই ।",
        "compare-revision-not-exists": "আপুনি নিৰ্ধাৰণ কৰা সংশোধনীটোৰ অস্বিত্ব নাই ।",
-       "dberr-header": "এই ৱিকিত এটা সমস্যা হৈছে",
        "dberr-problems": "দুঃখিত! চাইটটোত কিছু কাৰিকৰী সমস্যা হৈছে ।",
        "dberr-again": "অলপ সময় অপেক্ষা কৰি পুনৰ আপল'ডৰ চেষ্টা কৰক ।",
        "dberr-info": "(তথ্যকোষৰ চাৰ্ভাৰৰ লগত যোগাযোগ কৰিব নোৱাৰি: $1)",
index 262c7e0..69e78f5 100644 (file)
@@ -8,27 +8,28 @@
                        "Savh",
                        "Shirayuki",
                        "Xuacu",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Sorrayar enllaces:",
        "tog-hideminor": "Anubrir les ediciones menores nos cambeos recientes",
        "tog-hidepatrolled": "Anubrir les ediciones vixilaes nos cambeos recientes",
        "tog-newpageshidepatrolled": "Anubrir les páxines vixilaes na llista de páxines nueves",
-       "tog-extendwatchlist": "Espander la llista de vixilancia p'amosar tolos cambeos, non solo los más recientes.",
-       "tog-usenewrc": "Agrupar los cambeos por páxina nos cambeos recientes y na llista de vixilancia",
+       "tog-extendwatchlist": "Espander la llista de siguimientu p'amosar tolos cambeos, non solo los más recientes",
+       "tog-usenewrc": "Agrupar los cambeos por páxina nos cambeos recientes y na llista de siguimientu",
        "tog-numberheadings": "Autonumberar los encabezaos",
        "tog-showtoolbar": "Amosar la barra de ferramientes d'edición",
        "tog-editondblclick": "Editar páxines con doble clic",
        "tog-editsectiononrightclick": "Activar la edición de seiciones calcando col botón drechu nos títulos de seición",
-       "tog-watchcreations": "Amestar les páxines que creo y los ficheros que cargo a la mio llista de vixilancia",
-       "tog-watchdefault": "Amestar les páxines y ficheros qu'edito a la mio llista de vixilancia",
-       "tog-watchmoves": "Amestar les páxines y ficheros que muevo a la mio llista de vixilancia",
-       "tog-watchdeletion": "Amestar les páxines y ficheros que desanicio a la mio llista de vixilancia",
+       "tog-watchcreations": "Amestar les páxines que cree y los ficheros que xuba a la mio llista de siguimientu",
+       "tog-watchdefault": "Amestar les páxines y ficheros qu'edite a la mio llista de siguimientu",
+       "tog-watchmoves": "Amestar les páxines y ficheros que tresllade a la mio llista de siguimientu",
+       "tog-watchdeletion": "Amestar les páxines y ficheros que desanicie a la mio llista de siguimientu",
        "tog-minordefault": "Marcar toles ediciones como menores de mou predetermináu",
        "tog-previewontop": "Amosar previsualización enantes del cuadru d'edición",
        "tog-previewonfirst": "Amosar previsualización na primera edición",
-       "tog-enotifwatchlistpages": "Mandame un corréu cuando camude una páxina o ficheru de la mio llista de vixilancia",
+       "tog-enotifwatchlistpages": "Mandame un corréu cuando camude una páxina o ficheru de la mio llista de siguimientu",
        "tog-enotifusertalkpages": "Mandame un corréu cuando camude la mio páxina d'alderique",
        "tog-enotifminoredits": "Mandame tamién un corréu cuando heba ediciones menores de les páxines y ficheros",
        "tog-enotifrevealaddr": "Amosar la mio direición de corréu nos correos de notificación",
        "tog-fancysig": "Tratar la firma como testu wiki (ensin enllaz automáticu)",
        "tog-uselivepreview": "Usar vista previa en tiempu real (experimental)",
        "tog-forceeditsummary": "Avisame cuando grabe col resume d'edición en blanco",
-       "tog-watchlisthideown": "Anubrir les mios ediciones na llista de vixilancia",
-       "tog-watchlisthidebots": "Anubrir les ediciones de bots na llista de vixilancia",
-       "tog-watchlisthideminor": "Anubrir les ediciones menores na llista de vixilancia",
-       "tog-watchlisthideliu": "Anubrir les ediciones d'usuarios identificaos na llista de vixilancia",
-       "tog-watchlisthideanons": "Anubrir les ediciones d'usuarios anónimos na llista de vixilancia",
-       "tog-watchlisthidepatrolled": "Anubrir les ediciones vixilaes de la llista de vixilancia",
+       "tog-watchlisthideown": "Anubrir les mios ediciones na llista de siguimientu",
+       "tog-watchlisthidebots": "Anubrir les ediciones de bots na llista de siguimientu",
+       "tog-watchlisthideminor": "Anubrir les ediciones menores na llista de siguimientu",
+       "tog-watchlisthideliu": "Anubrir les ediciones d'usuarios identificaos na llista de siguimientu",
+       "tog-watchlisthideanons": "Anubrir les ediciones d'usuarios anónimos na llista de siguimientu",
+       "tog-watchlisthidepatrolled": "Anubrir les ediciones patrullaes na llista de siguimientu",
        "tog-ccmeonemails": "Mandame copies de los correos qu'unvio a otros usuarios",
        "tog-diffonly": "Nun amosar el conteníu de la páxina embaxo de les diferencies",
        "tog-showhiddencats": "Amosar categoríes anubríes",
        "jumptonavigation": "navegación",
        "jumptosearch": "buscar",
        "view-pool-error": "Sentímoslo, los sirvidores tán sobrecargaos nestos momentos.\nHai demasiaos usuarios intentando ver esta páxina.\nPor favor espera un ratu enantes d'intentar otra vuelta entrar a esta páxina.\n\n$1",
+       "generic-pool-error": "Sentímoslo, los sirvidores tán sobrecargaos nestos momentos.\nHai demasiaos usuarios intentando ver esti recursu.\nPor favor espera un momentu enantes d'intentar otra vuelta acceder a esti recursu.",
        "pool-timeout": "Tiempu escosáu esperando pal bloquéu",
        "pool-queuefull": "La cola de trabayu ta enllena",
        "pool-errorunknown": "Fallu desconocíu",
        "readonly_lag": "La base de datos candóse automáticamente mentes los sirvidores de la base de datos esclava se sincronicen cola maestra",
        "internalerror": "Fallu internu",
        "internalerror_info": "Fallu internu: $1",
-       "fileappenderrorread": "Nun se pudo lleer «$1» mentanto l'amestadura.",
-       "fileappenderror": "Nun se pudo amestar «$1» a «$2».",
        "filecopyerror": "Nun se pudo copiar el ficheru «$1» como «$2».",
        "filerenameerror": "Nun se pudo renomar el ficheru «$1» como «$2».",
        "filedeleteerror": "Nun se pudo desaniciar el ficheru «$1».",
        "directorycreateerror": "Nun se pudo crear el direutoriu «$1».",
        "filenotfound": "Nun pudo atopase'l ficheru «$1».",
-       "fileexistserror": "Nun se pue escribir nel ficheru «$1»: yá esiste",
        "unexpected": "Valor inesperáu: «$1»=«$2».",
        "formerror": "Fallu: Nun se pudo unviar el formulariu.",
        "badarticleerror": "Esta aición nun pue facese nesta páxina.",
        "userlogin-helplink2": "Ayuda del aniciu de sesión",
        "userlogin-loggedin": "Yá anició sesión como {{GENDER:$1|$1}}.\nUtilice'l formulariu de más abaxo p'aniciar sesión como otru usuariu.",
        "userlogin-createanother": "Crear otra cuenta",
-       "createacct-join": "Escriba abaxo la so información.",
-       "createacct-another-join": "Escriba abaxo la información de la cuenta nueva.",
        "createacct-emailrequired": "Direición de corréu electrónicu",
        "createacct-emailoptional": "Direición de corréu electrónicu (opcional)",
        "createacct-email-ph": "Escriba la so direición de corréu electrónicu",
        "savearticle": "Guardar la páxina",
        "preview": "Vista previa",
        "showpreview": "Amosar previsualización",
-       "showlivepreview": "Vista rápida",
        "showdiff": "Amosar cambeos",
        "anoneditwarning": "<strong>Avisu:</strong> Nun anició sesión.\nLa direición IP quedará grabada nel historial d'edición d'esta páxina.",
        "anonpreviewwarning": "''Nun aniciasti sesión. Al guardar quedará rexistrada la to direición IP nel historial d'edición d'esta páxina.''",
        "edit-gone-missing": "Nun se pudo actualizar la páxina.\nPaez que se desanició.",
        "edit-conflict": "Conflictu d'edición.",
        "edit-no-change": "S'inoró la to edición, porque nun se fizo nengún cambéu nel testu.",
-       "postedit-confirmation": "Guardose la edición.",
+       "postedit-confirmation-created": "Creóse la páxina.",
+       "postedit-confirmation-restored": "Restauróse la páxina.",
+       "postedit-confirmation-saved": "Guardose la edición.",
        "edit-already-exists": "Nun pudo crease una páxina nueva.\nEsta yá esiste.",
        "defaultmessagetext": "Testu predetermináu",
        "content-failed-to-parse": "Fallu al analizar el conteníu $2 pal modelu $1: $3",
        "parser-template-loop-warning": "Deteutóse un bucle de plantíes: [[$1]]",
        "parser-template-recursion-depth-warning": "Se pasó la llende de fondura recursiva de les plantíes ($1)",
        "language-converter-depth-warning": "Se pasó la llende de fondura del convertidor de llingües ($1)",
-       "node-count-exceeded-category": "Páxines onde se pasó la cuenta de nodios",
+       "node-count-exceeded-category": "Páxines onde se pasó la cuenta de noyos",
+       "node-count-exceeded-category-desc": "Una categoría pa les páxines onde se supera la cuenta de noyos.",
        "node-count-exceeded-warning": "La páxina pasó la cuenta de nodios",
        "expansion-depth-exceeded-category": "Páxines onde se pasó la fondura d'espansión",
+       "expansion-depth-exceeded-category-desc": "Esta ye una categoría pa les páxines onde se pasó la fondura d'espansión.",
        "expansion-depth-exceeded-warning": "La páxina pasó la fondura d'espansión",
        "parser-unstrip-loop-warning": "Deteutóse un bucle \"unstrip\"",
        "parser-unstrip-recursion-limit": "Pasóse la llende de recursividá d'unstrip ($1)",
        "search-nonefound": "Nun hebo resultaos que casaren cola consulta.",
        "powersearch-legend": "Busca avanzada",
        "powersearch-ns": "Buscar nos espacios de nome:",
-       "powersearch-redir": "Llistar redireiciones",
        "powersearch-togglelabel": "Comprobar:",
        "powersearch-toggleall": "Toos",
        "powersearch-togglenone": "Dengún",
        "prefs-user-pages": "Páxines d'usuariu",
        "prefs-personal": "Perfil del usuariu",
        "prefs-rc": "Cambios recientes",
-       "prefs-watchlist": "Llista de vixilancia",
-       "prefs-watchlist-days": "Númberu de díes qu'amosar na llista de vixilancia:",
+       "prefs-watchlist": "Llista de siguimientu",
+       "prefs-watchlist-days": "Númberu de díes qu'amosar na llista de siguimientu:",
        "prefs-watchlist-days-max": "Máximo $1 {{PLURAL:$1|día|díes}}",
-       "prefs-watchlist-edits": "Númberu d'ediciones qu'amosar na llista de vixilancia espandida:",
+       "prefs-watchlist-edits": "Númberu máximu d'ediciones qu'amosar na llista de siguimientu espandida:",
        "prefs-watchlist-edits-max": "Númberu máximu: 1000",
-       "prefs-watchlist-token": "Marca de la llista de vixilancia:",
+       "prefs-watchlist-token": "Pase de la llista de siguimientu:",
        "prefs-misc": "Varios",
        "prefs-resetpass": "Camudar la conseña",
        "prefs-changeemail": "Camudar el corréu electrónicu",
        "prefs-emailconfirm-label": "Confirmación del corréu:",
        "youremail": "Corréu electrónicu:",
        "username": "Nome d'{{GENDER:$1|usuariu|usuaria}}:",
-       "uid": "ID {{GENDER:$1|del usuariu|de la usuaria}}:",
        "prefs-memberingroups": "{{GENDER:$2|Miembru}} {{PLURAL:$1|del grupu|de los grupos}}:",
        "prefs-registration": "Hora del rexistru:",
        "yourrealname": "Nome real:",
        "prefs-advancedsearchoptions": "Opciones avanzaes",
        "prefs-advancedwatchlist": "Opciones avanzaes",
        "prefs-displayrc": "Opciones de vista",
-       "prefs-displaysearchoptions": "Opciones de vista",
        "prefs-displaywatchlist": "Opciones de vista",
        "prefs-tokenwatchlist": "Pase",
        "prefs-diffs": "Diferencies",
        "right-move": "Treslladar páxines",
        "right-move-subpages": "Treslladar les páxines coles sos subpáxines",
        "right-move-rootuserpages": "Treslladar páxines d'un usuariu root",
+       "right-move-categorypages": "Treslladar les páxines de categoría",
        "right-movefile": "Treslladar archivos",
        "right-suppressredirect": "Nun crear una redireición dende'l nome antiguu cuando se tresllada una páxina",
        "right-upload": "Xubir ficheros",
        "action-createpage": "crear páxines",
        "action-createtalk": "crear páxines d'alderique",
        "action-createaccount": "crear esta cuenta d'usuariu",
+       "action-history": "ver l'historial d'esta páxina",
        "action-minoredit": "marcar esta edición como menor",
        "action-move": "treslladar esta páxina",
        "action-move-subpages": "treslladar esta páxina y les sos subpáxines",
        "action-move-rootuserpages": "treslladar páxines d'un usuariu root",
+       "action-move-categorypages": "treslladar les páxines de categoría",
        "action-movefile": "treslladar esti archivu",
        "action-upload": "xubir esti archivu",
        "action-reupload": "sobreescribir esti archivu esistente",
        "recentchanges-legend-newpage": "(ver tamién la  [[Special:NewPages|llista de páxines nueves]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Abaxo tan los cambeos dende <strong>$2</strong> (s'amuesen fasta <strong>$1</strong>).",
-       "rclistfrom": "Amosar los nuevos cambios dende $1",
+       "rclistfrom": "Amosar los nuevos cambios dende $3 $2",
        "rcshowhideminor": "$1 ediciones menores",
        "rcshowhideminor-show": "Amosar",
        "rcshowhideminor-hide": "Anubrir",
        "recentchangeslinked-feed": "Cambios rellacionaos",
        "recentchangeslinked-toolbox": "Cambios rellacionaos",
        "recentchangeslinked-title": "Cambios rellacionaos con \"$1\"",
-       "recentchangeslinked-summary": "Esta ye una llista de los caberos cambios fechos nes páxines enllaciaes dende una páxina determinada (o nos miembros d'una categoría determinada). Les páxines de [[Special:Watchlist|la to llista de vixilancia]] tán en '''negrina'''.",
+       "recentchangeslinked-summary": "Esta ye una llista de los caberos cambios fechos nes páxines enllaciaes dende una páxina determinada (o nos miembros d'una categoría determinada).\nLes páxines de [[Special:Watchlist|la to llista de siguimientu]] tán en <strong>negrina</strong>.",
        "recentchangeslinked-page": "Nome de la páxina:",
        "recentchangeslinked-to": "Amosar los cambios de les páxines qu'enllacen en cuenta de los de la páxina dada",
        "upload": "Xubir ficheru",
        "uploadstash-refresh": "Anovar la llista de ficheros",
        "invalid-chunk-offset": "Allugamientu inválidu del fragmentu",
        "img-auth-accessdenied": "Accesu denegáu",
-       "img-auth-nopathinfo": "Falta PATH_INFO.\nEl to sirvidor nun ta configuráu pa pasar esta información.\nPue tar basáu en CGI y nun tener sofitu pa img_auth.\nVer https://www.mediawiki.org/wiki/Manual:Image_Authorization",
+       "img-auth-nopathinfo": "Falta PATH_INFO.\nEl to sirvidor nun ta configuráu pa pasar esta información.\nPue tar basáu en CGI y nun tener sofitu pa img_auth.\nVer https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization",
        "img-auth-notindir": "El camín solicitáu nun ta nel direutoriu de xubíes configuráu.",
        "img-auth-badtitle": "Nun se pue construir un títulu validu dende \"$1\".",
        "img-auth-nologinnWL": "Nun tas coneutáu y \"$1\" nun ta na llista blanca.",
        "pageswithprop-prophidden-binary": "valor de propiedá binaria tapecíu ($1)",
        "doubleredirects": "Redireiciones dobles",
        "doubleredirectstext": "Esta páxina llista páxines que redireicionen a otres páxines de redireición.\nCada filera contién enllaces a la primer y segunda redireición, asina como al oxetivu de la segunda redireición, que de vezu ye la páxina oxetivu \"real\", onde tendría d'empobinar la primer redireición.\nLes entraes <del>tachaes</del> tan resueltes.",
-       "double-redirect-fixed-move": "[[$1]] foi treslladáu, agora ye una redireición haza [[$2]]",
-       "double-redirect-fixed-maintenance": "Iguando la doble redireición de [[$1]] a [[$2]].",
+       "double-redirect-fixed-move": "[[$1]] treslladóse.\nAnovóse automáticamente y agora redirixe haza [[$2]].",
+       "double-redirect-fixed-maintenance": "Iguando automáticamente la doble redireición de [[$1]] a [[$2]] nuna xera de mantenimientu.",
        "double-redirect-fixer": "Iguador de redireiciones",
        "brokenredirects": "Redireiciones rotes",
        "brokenredirectstext": "Les siguientes redireiciones enllacien a páxines non esistentes:",
        "log-title-wildcard": "Buscar títulos qu'emprimen con esti testu",
        "showhideselectedlogentries": "Amosar/anubrir les entraes del rexistru seleicionaes",
        "allpages": "Toles páxines",
-       "alphaindexline": "$1 a $2",
        "nextpage": "Páxina siguiente ($1)",
        "prevpage": "Páxina anterior ($1)",
        "allpagesfrom": "Amosar páxines qu'entamen por:",
        "emailuserfooter": "Esti corréu electrónicu unviolu $1 a $2 per aciu de la función \"Manda-y un corréu a un usuariu\" de {{SITENAME}}.",
        "usermessage-summary": "Dexar un mensaxe del sistema.",
        "usermessage-editor": "Mensaxería del sistema",
-       "watchlist": "Llista de vixilancia",
-       "mywatchlist": "Llista de vixilancia",
+       "watchlist": "Llista de siguimientu",
+       "mywatchlist": "Llista de siguimientu",
        "watchlistfor2": "Pa $1 $2",
-       "nowatchlist": "La to llista de vixilancia ta vacia.",
-       "watchlistanontext": "Por favor $1 pa ver o editar entraes na to llista de vixilancia.",
+       "nowatchlist": "La to llista de siguimientu ta vacia.",
+       "watchlistanontext": "Tienes d'$1 pa ver o editar entraes de la to llista de siguimientu.",
        "watchnologin": "Non identificáu",
-       "addwatch": "Amestar a la llista de vixilancia",
-       "addedwatchtext": "La páxina \"[[:$1]]\" s'amestó a la to [[Special:Watchlist|llista de vixilancia]].\nLos futuro cambeos nesta páxina y na so páxina d'alderique asociada apaecerán allí.",
-       "removewatch": "Desaniciar de la llista de vixilancia",
-       "removedwatchtext": "Desapuntóse la páxina \"[[:$1]]\" de la [[Special:Watchlist|to llista de vixilancia]].",
+       "addwatch": "Amestar a la llista de siguimientu",
+       "addedwatchtext": "La páxina \"[[:$1]]\" s'amestó a la to [[Special:Watchlist|llista de llista de siguimientu]].\nLos cambeos futuros nesta páxina y na so páxina d'alderique asociada apaecerán allí.",
+       "addedwatchtext-short": "Amestóse la páxina «$1» a la to llista de siguimientu.",
+       "removewatch": "Desaniciar de la llista de siguimientu",
+       "removedwatchtext": "La páxina \"[[:$1]]\" desanicióse de la [[Special:Watchlist|to llista de siguimientu]].",
+       "removedwatchtext-short": "Desanicióse la páxina «$1» de la to llista de siguimientu.",
        "watch": "Vixilar",
        "watchthispage": "Vixilar esta páxina",
        "unwatch": "Dexar de vixilar",
        "unwatchthispage": "Dexar de vixilar",
        "notanarticle": "Nun ye un artículu",
        "notvisiblerev": "Esborróse la revisión",
-       "watchlist-details": "{{PLURAL:$1|$1 páxina|$1 páxines}} na to llista de vixilancia, ensin cuntar aparte les páxines d'alderique.",
+       "watchlist-details": "{{PLURAL:$1|$1 páxina|$1 páxines}} na to llista de siguimientu, ensin cuntar aparte les páxines d'alderique.",
        "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'''",
-       "watchmethod-recent": "comprobando páxines vixilaes nos cambios recientes",
-       "watchmethod-list": "comprobando ediciones recientes nes páxines vixilaes",
-       "watchlistcontains": "La to llista de vixilancia tien $1 {{PLURAL:$1|páxina|páxines}}.",
-       "iteminvalidname": "Problema col elementu '$1', nome non válidu...",
        "wlnote2": "Abaxo tan los cambios {{PLURAL:$1|na cabera hora|nes caberes <strong>$1</strong> hores}}, el día $2 a les $3.",
        "wlshowlast": "Amosar les últimes $1 hores $2 díes $3",
-       "watchlist-options": "Opciones de la llista de vixilancia",
+       "watchlist-options": "Opciones de la llista de siguimientu",
        "watching": "Vixilando...",
        "unwatching": "Dexando de vixilar...",
-       "watcherrortext": "Hebo un fallu al camudar la configuración de la to llista de vixilancia pa «$1».",
+       "watcherrortext": "Hebo un error al camudar la configuración de la to llista de siguimientu pa «$1».",
        "enotif_reset": "Marcar toles páxines visitaes",
        "enotif_impersonal_salutation": "Usuariu de {{SITENAME}}",
        "enotif_subject_deleted": "{{GENDER:$2|$2}} desanició la páxina «$1» de {{SITENAME}}",
        "enotif_lastvisited": "Mira en $1 pa ver tolos cambios dende la cabera visita.",
        "enotif_lastdiff": "Mira en $1 pa ver esti cambéu.",
        "enotif_anon_editor": "usuariu anónimu $1",
-       "enotif_body": "Estimáu $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nResume del editor: $PAGESUMMARY $PAGEMINOREDIT\n\nPonte en contautu col editor:\ncorréu: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nEn casu de producise más actividá, nun habrá más notificaciones a nun ser que visites esta páxina teniendo sesión aniciada. Tamién podríes reaniciar na to llista de vixilancia los marcadores de notificación de toles páxines que tengas vixilaes.\n\nEl to abertable sistema de notificación de {{SITENAME}}\n\n--\nPa camudar les preferencies d'avisos per corréu, visita\n{{canonicalurl:{{#special:Preferences}}}}\n\nPa camudar la configuración de la to llista de vixilancia, visita\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPa desaniciar la páxina de la to llista de vixilancia, visita\n$UNWATCHURL\n\nMás ayuda y sofitu:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Estimáu $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nResume del editor: $PAGESUMMARY $PAGEMINOREDIT\n\nPa comunicate col editor:\ncorréu: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nEn casu de producise más actividá, nun habrá más notificaciones a nun ser que visites esta páxina teniendo sesión aniciada. Tamién podríes reaniciar na to llista de siguimientu los marcadores de notificación de toles páxines que sigues.\n\nEl to abertable sistema de notificación de {{SITENAME}}\n\n--\nPa camudar les preferencies d'avisos per corréu, visita\n{{canonicalurl:{{#special:Preferences}}}}\n\nPa camudar la configuración de la to llista de siguimientu, visita\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPa desaniciar la páxina de la to llista de siguimientu, visita\n$UNWATCHURL\n\nMás ayuda y sofitu:\n$HELPPAGE",
        "created": "creada",
        "changed": "camudada",
        "deletepage": "Esborrar páxina",
        "blockip": "Bloquiar usuariu",
        "blockip-legend": "Bloquiar usuariu",
        "blockiptext": "Usa'l siguiente formulariu pa bloquiar el permisu d'escritura a una IP o a un usuariu concretu.\nEsto debería facese sólo pa prevenir vandalismu como indiquen les [[{{MediaWiki:Policy-url}}|polítiques]]. Da un motivu específicu (como por exemplu citar páxines que fueron vandalizaes).",
-       "ipadressorusername": "Direición IP o nome d'usuariu:",
+       "ipaddressorusername": "Direición IP o nome d'usuariu:",
        "ipbexpiry": "Caducidá:",
        "ipbreason": "Motivu:",
        "ipbreason-dropdown": "*Motivos comunes de bloquéu\n** Enxertamientu d'información falso\n** Dexar les páxines en blanco\n** Enllaces spam a páxines esternes\n** Enxertamientu de babayaes/enguedeyos nes páxines\n** Comportamientu intimidatoriu o d'acosu\n** Abusu de cuentes múltiples\n** Nome d'usuariu inaceutable",
        "ipbnounblockself": "Nun tienes permisu pa desbloquiate tu mesmu",
        "lockdb": "Protexer la base de datos",
        "unlockdb": "Desprotexer la base de datos",
-       "lockdbtext": "Al bloquiar la base de datos suspenderáse la capacidá de tolos usuarios pa editar páxines, camudar les sos preferencies, editar les llistes de vixilancia y otres aiciones que requieran cambios na base de datos. Por favor confirma que ye lo que quies facer, y que vas desbloquiar la base de datos cuando fines col mantenimientu.",
-       "unlockdbtext": "Al desbloquiar la base de datos restauraráse la capacidá de tolos usuarios pa editar páxines, camudar les sos preferencies, editar les sos llistes de vixilancia y otres aiciones que requieren cambios na base de datos. Por favor confirma que ye lo quies facer.",
+       "lockdbtext": "Al bloquiar la base de datos suspenderáse la capacidá de tolos usuarios pa editar páxines, camudar les sos preferencies, editar les llistes de siguimientu y otres aiciones que requieran cambios na base de datos. Por favor confirma que ye lo que quies facer, y que desbloquiarás la base de datos cuando fines col mantenimientu.",
+       "unlockdbtext": "Al desbloquiar la base de datos restauraráse la capacidá de tolos usuarios pa editar páxines, camudar les sos preferencies, editar les sos llistes de siguimientu y otres aiciones que requieren cambios na base de datos. Por favor confirma que ye lo quies facer.",
        "lockconfirm": "Si, quiero candar daveres la base de datos.",
        "unlockconfirm": "Sí, quiero descandar daveres la base de datos.",
        "lockbtn": "Protexer la base de datos",
        "movepagetalktext": "La páxina d'alderique asociada va ser treslladada automáticamente '''a nun ser que:'''\n*Yá esista una páxina d'alderique non vacia col nuevu nome, o\n*Desactives la caxella d'equí baxo.\n\nNestos casos vas tener que treslladar o fusionar la páxina manualmente.",
        "movearticle": "Treslladar la páxina:",
        "moveuserpage-warning": "'''Atención:''' Tas a piques de mover una páxina d'usuariu. Atalanta que namái se va mover la páxina y que ''nun'' se va renomar l'usuariu.",
+       "movecategorypage-warning": "<strong>Avisu:</strong> Tas a piques de treslladar una páxina de categoría. Ten en cuenta que sólo se treslladará la páxina y que cualquier páxina que tuviera na categoría antigua <em>nun</em> se recategorizará na nueva.",
        "movenologintext": "Tienes que ser un usuariu rexistráu y tar [[Special:UserLogin|identificáu]] pa treslladar una páxina.",
        "movenotallowed": "Nun tienes permisu pa mover páxines.",
        "movenotallowedfile": "Nun tienes permisu pa mover ficheros.",
        "cant-move-user-page": "Nun tienes permisu pa treslladar páxines d'usuariu (independientemente de les subpáxines).",
        "cant-move-to-user-page": "Nun tienes permisu pa treslladar una páxina a una páxina d'usuariu (sacante a una subpáxina d'usuariu).",
+       "cant-move-category-page": "Nun tienes permisu pa treslladar páxines de categoría.",
+       "cant-move-to-category-page": "Nun tienes permisu pa treslladar una páxina a una páxina de categoría.",
        "newtitle": "Al títulu nuevu:",
        "move-watch": "Vixilar esta páxina",
        "movepagebtn": "Treslladar la páxina",
        "tooltip-ca-delete": "Desaniciar esta páxina",
        "tooltip-ca-undelete": "Restaura les ediciones feches nesta páxina enantes de que fuera esborrada",
        "tooltip-ca-move": "Tresllada esta páxina",
-       "tooltip-ca-watch": "Amiesta esta páxina na to llista de vixilancia",
-       "tooltip-ca-unwatch": "Desaniciar esta páxina de la to llista de vixilancia",
+       "tooltip-ca-watch": "Amiesta esta páxina a la to llista de siguimientu",
+       "tooltip-ca-unwatch": "Desaniciar esta páxina de la to llista de siguimientu",
        "tooltip-search": "Busca en {{SITENAME}}",
        "tooltip-search-go": "Dir a una páxina con esti nome exautu si esiste",
        "tooltip-search-fulltext": "Busca páxines con esti testu",
        "tooltip-preview": "Vista previa de los cambios, ¡usa esto enantes de guardar!",
        "tooltip-diff": "Amuesa los cambios que fixisti nel testu.",
        "tooltip-compareselectedversions": "Ver les diferencies ente les dos revisiones seleicionaes d'esta páxina.",
-       "tooltip-watch": "Amiesta esta páxina a la to llista de vixilancia",
+       "tooltip-watch": "Amiesta esta páxina a la to llista de siguimientu",
        "tooltip-watchlistedit-normal-submit": "Desaniciar títulos",
        "tooltip-watchlistedit-raw-submit": "Anovar llista de vixilancia",
        "tooltip-recreate": "Vuelve a crear la páxina magar que se tenga esborrao",
        "group-bot.js": "/* Cualesquier JavaScript que tea equí se cargará pa los bots namái */",
        "group-sysop.js": "/* Cualesquier JavaScript que tea equí se cargará pa los sysops namái */",
        "group-bureaucrat.js": "/* Cualesquier JavaScript que tea equí se cargará pa los burócrates namái */",
-       "notacceptable": "El sirvidor de la wiki nun pue suplir los datos nun formatu llexible pol to navegador.",
        "anonymous": "{{PLURAL:$1|Usuariu anónimu|Usuarios anónimos}} de {{SITENAME}}",
        "siteuser": "{{SITENAME}} usuariu $1",
        "anonuser": "usuariu anónimu de {{SITENAME}} $1",
        "newimages-summary": "Esta páxina especial amuesa los caberos archivos xubíos.",
        "newimages-legend": "Peñera",
        "newimages-label": "Nome d'archivu (o una parte d'él):",
-       "showhidebots": "($1 bots)",
+       "newimages-showbots": "Ver les xubíes de los bots",
        "noimages": "Nun hai nada que ver.",
        "ilsubmit": "Buscar",
        "bydate": "por fecha",
        "autoredircomment": "Redirixendo a [[$1]]",
        "autosumm-new": "Páxina creada con «$1»",
        "size-gigabytes": "$1 XB",
-       "livepreview-loading": "Cargando...",
-       "livepreview-ready": "Cargando… ¡Llisto!",
-       "livepreview-failed": "¡La previsualización rápida falló! Intenta la previsualización normal.",
-       "livepreview-error": "Nun se pudo coneutar: $1 \"$2\". Intenta la previsualización normal.",
        "lag-warn-normal": "Los cambios más nuevos que $1 {{PLURAL:$1|segundu|segundos}} seique nun s'amuesen nesta llista.",
        "lag-warn-high": "Pola mor d'un importante retrasu nel sirvidor de la base de datos, los cambios más nuevos que $1 {{PLURAL:$1|segundu|segundos}} seique nun s'amuesen nesta llista.",
-       "watchlistedit-numitems": "La to llista de vixilancia tien {{PLURAL:$1|1 títulu|$1 títulos}}, escluyendo les páxines d'alderique.",
-       "watchlistedit-noitems": "La to llista de vixilancia nun tien títulos.",
-       "watchlistedit-normal-title": "Editar la llista de vixilancia",
-       "watchlistedit-normal-legend": "Eliminar títulos de la llista de vixilancia",
-       "watchlistedit-normal-explain": "Abaxo s'amuesen los títulos de la to llista de vixilancia.\nPa desaniciar un títulu, marca la caxella d'al llau d'él, y calca \"{{int:Watchlistedit-normal-submit}}\".\nTamién pues [[Special:EditWatchlist/raw|editar la llista en bruto]].",
+       "watchlistedit-normal-title": "Editar la llista de siguimientu",
+       "watchlistedit-normal-legend": "Quitar títulos de la llista de siguimientu",
+       "watchlistedit-normal-explain": "Abaxo s'amuesen los títulos de la to llista de siguimientu.\nPa desaniciar un títulu, marca la caxella cabo d'él, y calca \"{{int:Watchlistedit-normal-submit}}\".\nTamién pues [[Special:EditWatchlist/raw|editar la llista ensin formatu]].",
        "watchlistedit-normal-submit": "Desaniciar títulos",
-       "watchlistedit-normal-done": "{{PLURAL:$1|Eliminóse un títulu|Elimináronse $1 títulos}} de la to llista de vixilancia:",
-       "watchlistedit-raw-title": "Editar la llista de vixilancia en bruto",
-       "watchlistedit-raw-legend": "Editar la llista de vixilancia en bruto",
-       "watchlistedit-raw-explain": "Abaxo s'amuesen los títulos de la to llista de vixilancia, y puen editase amestándolos o desaniciándolos de la llista; un títulu per llinia.\nN'acabando, calca \"{{int:Watchlistedit-raw-submit}}\".\nTamién pues [[Special:EditWatchlist|usar l'editor estándar]].",
+       "watchlistedit-normal-done": "{{PLURAL:$1|Desanicióse un títulu|Desaniciáronse $1 títulos}} de la to llista de siguimientu:",
+       "watchlistedit-raw-title": "Editar la llista de siguimientu (ensin formatu)",
+       "watchlistedit-raw-legend": "Editar la llista de siguimientu (ensin formatu)",
+       "watchlistedit-raw-explain": "Abaxo s'amuesen los títulos de la to llista de siguimientu, y puen editase amestándolos o desaniciándolos de la llista;\nun títulu por llinia.\nN'acabando, calca \"{{int:Watchlistedit-raw-submit}}\".\nTamién pues [[Special:EditWatchlist|usar l'editor estándar]].",
        "watchlistedit-raw-titles": "Títulos:",
-       "watchlistedit-raw-submit": "Anovar llista de vixilancia",
-       "watchlistedit-raw-done": "La to llista de vixilancia foi actualizada.",
+       "watchlistedit-raw-submit": "Anovar la llista de siguimientu",
+       "watchlistedit-raw-done": "Anovóse la to llista de siguimientu.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Añadióse un títulu|Añadiéronse $1 títulos}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Eliminóse ún títulu|Elimináronse $1 títulos}}:",
+       "watchlistedit-clear-title": "Llimpióse la llista de siguimientu",
+       "watchlistedit-clear-legend": "Llimpiar la llista de siguimientu",
+       "watchlistedit-clear-explain": "Desaniciaránse tolos títulos de la to llista de siguimientu",
+       "watchlistedit-clear-titles": "Títulos:",
+       "watchlistedit-clear-submit": "Llimpiar la llista de siguimientu (¡Esto ye permanente!)",
+       "watchlistedit-clear-done": "Llimpióse la to llista de siguimientu.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|Desanicióse 1 títulu|Desaniciáronse $1 títulos}}:",
+       "watchlistedit-too-many": "Hai demasiaes páxines p'amosales equí.",
+       "watchlisttools-clear": "Llimpiar la llista de siguimientu",
        "watchlisttools-view": "Ver cambios relevantes",
-       "watchlisttools-edit": "Ver y editar la llista de vixilancia",
-       "watchlisttools-raw": "Editar la llista de vixilancia (en bruto)",
+       "watchlisttools-edit": "Ver y editar la llista de siguimientu",
+       "watchlisttools-raw": "Editar la llista de siguimientu (ensin formatu)",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|alderique]])",
        "unknown_extension_tag": "Etiqueta d'estensión \"$1\" desconocida",
        "duplicate-defaultsort": "Avisu: La clave d'ordenación predeterminada \"$2\" anula la clave d'ordenación anterior \"$1\".",
        "compare-invalid-title": "El títulu que conseñasti nun ye válidu.",
        "compare-title-not-exists": "El títulu que conseñasti nun esiste.",
        "compare-revision-not-exists": "La revisión que conseñasti nun esiste.",
-       "dberr-header": "Esta wiki tien un problema",
        "dberr-problems": "¡Sentímoslo! Esti sitiu ta esperimentando dificultaes téuniques.",
        "dberr-again": "Tenta esperar dellos minutos y recargar.",
        "dberr-info": "(Nun se pue contautar cola base de datos del sirvidor: $1)",
        "htmlform-no": "Non",
        "htmlform-yes": "Sí",
        "htmlform-chosen-placeholder": "Seleicione una opción",
+       "htmlform-cloner-create": "Amestar más",
+       "htmlform-cloner-delete": "Desaniciar",
+       "htmlform-cloner-required": "Necesítase polo menos un valor.",
        "sqlite-has-fts": "$1 con sofitu pa busca de testu completu",
        "sqlite-no-fts": "$1 ensin sofitu pa busca de testu completu",
        "logentry-delete-delete": "$1 {{GENDER:$2|desanició}} la páxina $3",
index 2d41e30..a93e2de 100644 (file)
@@ -6,7 +6,8 @@
                        "Sab",
                        "Urhixidur",
                        "Wikimistusik",
-                       "Zetud"
+                       "Zetud",
+                       "아라"
                ]
        },
        "tog-underline": "Levconhani gluyasiki se",
@@ -19,7 +20,6 @@
        "tog-showtoolbar": "Nedira va tidexekak ke betararude",
        "tog-editondblclick": "Ta bubetara tolon vulegal (JavaScript tir adraf)",
        "tog-editsectiononrightclick": "Betara va gabot talton vulegason<br /> va gabotvergumvelt",
-       "tog-rememberpassword": "Mo bati nedisiki va jinaf remravlem setiker (cugon $1 {{PLURAL:$1|viel|viel}})",
        "tog-watchcreations": "Kosuzdasikira va jinon betayan bueem",
        "tog-watchdefault": "Va jinon reduyun ik betayan telizeem suzdá",
        "tog-watchmoves": "Kosuzdasikira va jinon arrundayan bueem",
        "readonly_lag": "La base de donnée a été automatiquement bloquée pendant que les serveurs secondaires rattrapent leur retard avec le serveur principal",
        "internalerror": "Koefa rokla",
        "internalerror_info": "Koefa rokla : $1",
-       "fileappenderrorread": "Bal loplekura, va \"$1\" me robelir.",
-       "fileappenderror": "Va \"$1\" gu \"$2\" me roloplekur.",
        "filecopyerror": "Ksudara va « $1 » van « $2 » tir merotisa.",
        "filerenameerror": "Tolyoltara va « $1 » ton « $2 » tir merotisa.",
        "filedeleteerror": "Sulara va « $1 » tir merotisa.",
        "directorycreateerror": "Redura va \"$1\" bonja me tir.",
        "filenotfound": "« $1 » iyeltak me zo rotrasir.",
-       "fileexistserror": "Sutera va \"$1\" iyeltak me tir : iyeltak ixam krulder",
        "unexpected": "Volkena voda : « $1 » = « $2 ».",
        "formerror": "Rokla : Levplekura va valdig tir merotisa",
        "badarticleerror": "Bata tegira mo batu bu tir merotisa.",
        "savearticle": "Giwara",
        "preview": "Abdinedira",
        "showpreview": "Abdinedira",
-       "showlivepreview": "Nedira va abdinedira",
        "showdiff": "Nedira va betakseem",
        "anoneditwarning": "'''Obral !''' Rin til medogluyayas. Rinafe IP mane ko bubetarizvot zo stragatar.",
        "missingcommenttext": "Va sebuks vlevon bazel, vay !",
        "search-nonefound": "Mek trasiks vas kucilara",
        "powersearch-legend": "Aneyapara",
        "powersearch-ns": "Aneyara koe yoltxo:",
-       "powersearch-redir": "Vexalara va graskara",
        "powersearch-toggleall": "Kot",
        "powersearch-togglenone": "Mek",
        "search-external": "Divafa aneyara",
        "recentchanges-label-bot": "Bata betara gan \"bot\" zo sopuyur",
        "recentchanges-label-unpatrolled": "Bat betaks men al zo fier",
        "rcnotefrom": "Tir skuyun betakseem mali <strong>$2</strong> (<b>$1</b> cugon).",
-       "rclistfrom": "Nedira va warzaf betakseem mali $1.",
+       "rclistfrom": "Nedira va warzaf betakseem mali $3 $2",
        "rcshowhideminor": "$1 betamakseem",
        "rcshowhidebots": "$1 stiernik",
        "rcshowhideliu": "$1 vertokayan favesikeem",
        "watchlist-details": "{{PLURAL:$1|$1 bu|$1 bu}} koe rinafi suzdasiki rade prilarabueem.",
        "wlheader-enotif": "Email walzera tir tegisa.",
        "wlheader-showupdated": "Bu betayanu vielu rin ironokon worayal tir '''sulatcalakorafu'''.",
-       "watchmethod-recent": "ageltara va noeltaf betakseem va suzdan bueem",
-       "watchmethod-list": "ageltara va suzdan bueem icde noeltafa betara",
-       "watchlistcontains": "Rinafi suzdasiki va $1 bu ruldar",
-       "iteminvalidname": "Zvak icde « $1 » teliz : yolt tir mewadaf...",
        "wlshowlast": "Nedira va ironokaf $1 bartiv isu $2 viel isu $3",
        "watchlist-options": "Suzdasikiolkeem",
        "watching": "Nedis...",
        "enotif_lastvisited": "Va $1 disukel ta da va kot betaks mali ironokafa worara wil.",
        "enotif_lastdiff": "Ta wira va bat betaks va $1 disukel.",
        "enotif_anon_editor": "$1 yoltiskaf favesik",
-       "enotif_body": "Dear $WATCHINGUSERNAME,\n\n\nThe {{SITENAME}} page $PAGETITLE has been $CHANGEDORCREATED on $PAGEEDITDATE by $PAGEEDITOR, see $PAGETITLE_URL for the current version.\n\n$NEWPAGE\n\nEditor's summary: $PAGESUMMARY $PAGEMINOREDIT\n\nContact the editor:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nThere will be no other notifications in case of further changes unless you visit this page.\nYou could also reset the notification flags for all your watched pages on your watchlist.\n\n             Your friendly {{SITENAME}} notification system\n\n--\nTo change your watchlist settings, visit\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nFeedback and further assistance:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Dear $WATCHINGUSERNAME,\n\n\nThe {{SITENAME}} page $PAGETITLE has been $CHANGEDORCREATED on $PAGEEDITDATE by $PAGEEDITOR, see $PAGETITLE_URL for the current version.\n\n$NEWPAGE\n\nEditor's summary: $PAGESUMMARY $PAGEMINOREDIT\n\nContact the editor:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nThere will be no other notifications in case of further changes unless you visit this page.\nYou could also reset the notification flags for all your watched pages on your watchlist.\n\n             Your friendly {{SITENAME}} notification system\n\n--\nTo change your watchlist settings, visit\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nFeedback and further assistance:\n$HELPPAGE",
        "created": "reduyun",
        "changed": "betayan",
        "deletepage": "Busulara",
        "blockip": "Elekara va IP mane ok favesik",
        "blockip-legend": "Elekara va favesik",
        "blockiptext": "Ta suterafa elekara va vansara male pilkovafe IP mane ok favesikyolt va vlevefa erurateza favel !\nMana sabegara zo goskur ta weyonara va cidara is dotrakason va [[{{MediaWiki:Policy-url}}|gotarkan vexeem]].\nVa lazavanha (tulon ozwason va cidayanu bu se) vlevon bazel !",
-       "ipadressorusername": "IP mane ok favesikyolt",
+       "ipaddressorusername": "IP mane ok favesikyolt",
        "ipbexpiry": "Elekaracek",
        "ipbreason": "Elekaradanda :",
        "ipbcreateaccount": "Djira va pataredura",
        "tooltip-rollback": "\"Rollback\" kan tanoya vulegara va betaks va batu bu kal ironokaf webesik kuider",
        "tooltip-undo": "\"Dimbetara\"  va bata betara kuider ise va tazukasiki abdiwison fenkur.\nIse va bazera va lazava ko vildeks nover.",
        "tooltip-summary": "Va vildeksam bazel",
-       "notacceptable": "Ce serveur wiki ne peut pas fournir les données dans un format que votre client est capable de lire.",
        "anonymous": "Yoltiskaf {{PLURAL:$1|favesik|favesik}} va {{SITENAME}}",
        "siteuser": "$1 favesik va {{SITENAME}}",
        "lastmodifiedatby": "Batu bu ironokon zo betayar ba $2, $1 gan $3.",
        "newimages-summary": "Batu aptafu bu va ironokaf kalvajayan iyeltakeem nedir.",
        "newimages-legend": "Espara",
        "newimages-label": "Iyeltak (ok ki) :",
-       "showhidebots": "($1 stiernik)",
        "noimages": "Mecoba rowina",
        "ilsubmit": "Aneyara",
        "bydate": "kan evla",
        "autosumm-replace": "Ikaplekura va bu kan '$1'",
        "autoredircomment": "Graskara va [[$1]]",
        "autosumm-new": "Warzafu bu kan '$1'",
-       "livepreview-loading": "Vajas…",
-       "livepreview-ready": "Vajas... Gadion !",
-       "livepreview-failed": "Geltrafa abdiwira keluyuna ! Va preksafa abdiwira lwil !",
-       "livepreview-error": "Keluyuna dogluyara va : $1 \"$2\". Va preksafa abdiwira lwil !",
        "lag-warn-normal": "Betaks skuyun weti le $1 {{PLURAL:$1|verast|verast}} batliz me zo kovexalatar.",
-       "watchlistedit-numitems": "Rinafi suzdasiki va {{PLURAL:$1|1 vergumvelt|$1 vergumvelt}} ruldar, luke prilarabueem.",
-       "watchlistedit-noitems": "Rinafi suzdasiki va mek vergumvelt ruldar.",
        "watchlistedit-normal-title": "Betara va suzdasiki",
        "watchlistedit-normal-legend": "Divsuzdasikira va vergumvelt",
        "watchlistedit-normal-submit": "Tioltera va vergumvelt",
index 9a9bdd5..6290b74 100644 (file)
@@ -21,7 +21,8 @@
                        "Vago",
                        "Vugar 1981",
                        "Wertuose",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Keçidlərin altını xətlə:",
@@ -34,7 +35,6 @@
        "tog-showtoolbar": "Redaktə zamanı alətlər qutusunu göstər (JavaScript)",
        "tog-editondblclick": "Səhifələri iki kliklə redaktə etməyə başla (JavaScript)",
        "tog-editsectiononrightclick": "Bölmələrin redaktəsini başlıqların üzərində sağ klik etməklə mümkün et (JavaScript)",
-       "tog-rememberpassword": "Məni bu kompyuterdə xatırla (maksimum $1 {{PLURAL:$1|gün|gün}})",
        "tog-watchcreations": "Yaratdığım səhifələri izlədiyim səhifələrə əlavə et",
        "tog-watchdefault": "Redaktə etdiyim səhifələri izlədiyim səhifələrə əlavə et",
        "tog-watchmoves": "Adlarını dəyişdiyim səhifələri izlədiyim səhifələrə əlavə et",
@@ -62,7 +62,7 @@
        "tog-showhiddencats": "Gizli kateqoriyaları göstər",
        "tog-norollbackdiff": "Geri qaytardıqdan sonra, edilmiş dəyişikikləri dəyişikliklər siyahısından sil",
        "tog-useeditwarning": "Qeyd edilməmiş dəyişikliyə sahib bir dəyişiklik səhifəsindən çıxarkən məni xəbərdar et",
-       "tog-prefershttps": "Sessiya aaçarkən hər zaman etibarlı bağlantıdan istifadə et.",
+       "tog-prefershttps": "Sessiya açarkən hər zaman etibarlı bağlantıdan istifadə et.",
        "underline-always": "Həmişə",
        "underline-never": "Heç vaxt",
        "underline-default": "Susmaya görə brouzer",
        "readonly_lag": "Məlumatlar bazasının ikinci dərəcəli serveri əsas serverlə əlaqə yaradanadək məlumatlar bazası avtomatik olaraq bloklanmışdır",
        "internalerror": "Daxili xəta",
        "internalerror_info": "Daxili xəta: $1",
-       "fileappenderrorread": "Əlavələr daxil edilərkən \"$1\" oxuna bilmədi.",
-       "fileappenderror": "\"$1\" faylı \"$2\" faylına əlavə edilə bilmir.",
        "filecopyerror": "\"$1\" faylı \"$2\" faylına kopyalanmır.",
        "filerenameerror": "\"$1\" faylının adını \"$2\"-yə dəyişmək mümkün deyil",
        "filedeleteerror": "\"$1\" fayılını silə bilmədi.",
        "directorycreateerror": "\"$1\" direktoriyasını yaratmaq mümkün deyil",
        "filenotfound": "\"$1\" faylını tapa bilmədi.",
-       "fileexistserror": "\"$1\" faylına yazmaq mümkün deyil: fayl artıq mövcuddur.",
        "unexpected": "Uyğunsuzluq: \"$1\"=\"$2\".",
        "formerror": "Xəta: Formanın məlumatlarını əks etdirmək qeydi-mümkündür",
        "badarticleerror": "Yerinə yetirmək istədiyiniz fəaliyyətin icrası bu səhifədə mümkün deyil.",
        "userlogin-resetpassword-link": "Parolu unutdunuzmu?",
        "userlogin-loggedin": "Siz artıq {{GENDER:$1|$1}} kimi daxil olmusunuz.\nAşağıdakı formadan istifadə edərək, bağqa bir istifadəçi kimi daxil ola bilərsiniz.",
        "userlogin-createanother": "Başqa bir istifadəçi hesabı yarat",
-       "createacct-join": "Aşağıda məlumatlarınızı daxil edin.",
-       "createacct-another-join": "Aşağıda yeni hesabınızın məlumatlarını daxil edin.",
        "createacct-emailrequired": "E-poçt ünvanı",
        "createacct-emailoptional": "E-poçt ünvanı (istəyə bağlı)",
        "createacct-email-ph": "E-poçt ünvanınızı daxil edin",
        "savearticle": "Səhifəni qeyd et",
        "preview": "Sınaq görüntüsü",
        "showpreview": "Sınaq göstərişi",
-       "showlivepreview": "Canlı sınaq göstərişi",
        "showdiff": "Dəyişiklikləri göstər",
        "anoneditwarning": "'''DİQQƏT!''' Siz özünüzü sistemə təqdim etməmisiniz. Sizin IP ünvanınız bu səhifənin tarixçəsinə qeyd olunacaq.",
        "anonpreviewwarning": "Sistemə daxil olmamısınız. \"Səhifəni qeyd et\" düyməsini bassanız IP ünvanınız səhifənin tarixçəsində qeyd olunacaq.",
        "sectioneditnotsupported-text": "Bölüm redaktəsi bu səhifədə dəstəklənmir.",
        "permissionserrors": "İcazə xətası",
        "permissionserrorstext": "Siz, bunu aşağıdakı {{PLURAL:$1|səbəbə|səbəblərə}} görə edə bilməzsiniz:",
-       "permissionserrorstext-withaction": "Aşağıdakı {{PLURAL:$1|səbəbə|səbəblərə}} görə $2 hüququnuz yoxdur:",
+       "permissionserrorstext-withaction": "Aşağıdakı {{PLURAL:$1|səbəbə|səbəblərə}} görə, $2 hüququnuz yoxdur:",
        "recreate-moveddeleted-warn": "'''Diqqət! Siz əvvəllər silinmiş səhifəni bərpa etmək istəyirsiz.'''\n\nBu səhifəni yenidən yaratmağın nə qədər zəruri olduğunu bir daha yoxlayın.\nBu səhifə üçün silmə qeydləri aşağıda göstərilmişdir:",
        "moveddeleted-notice": "Bu səhifə silinmişdir.\nMəlumat üçün aşağıda bu səhifənin tarixçəsindən müvafiq silmə qeydləri göstərilmişdir.",
        "log-fulllog": "Bütöv məlumatı göstər",
        "edit-gone-missing": "Səhifəni yeniləmək mümkün deyil.\nÇox güman ki, səhifə silinmişdir.",
        "edit-conflict": "Düzəlişlər münaqişəsi",
        "edit-no-change": "Sizin redaktələr qeydə alınmamışdır. Belə ki, mətndə heç bir düzəliş edilməmişdir.",
-       "postedit-confirmation": "Redaktəniz qeyd edildi.",
+       "postedit-confirmation-saved": "Redaktəniz qeyd edildi.",
        "edit-already-exists": "Yeni səhifəni yaratmaq mümkün deyil.\nBelə ki, bu adda səhifə artıq mövcuddur.",
        "content-model-javascript": "JavaScript",
        "expensive-parserfunction-category": "Kifayət qədər böyük sayda genişresurslu funksiyaların müraciət olunduğu səhifələr",
        "searchmenu-exists": "'''Bu vikidə \"[[:$1]]\" adında səhifə mövcuddur'''",
        "searchmenu-new": "<strong>Bu vikidə \"[[:$1]]\" səhifəsini yarat!</strong> {{PLURAL:$2|0=|Həmçinin, axtarışınız əsasında çıxan səhifəyə baxın.|Həmçinin, axtarışınız əsasında çıxan nəticələrə baxın.}}",
        "searchprofile-articles": "Məqalələr",
-       "searchprofile-project": "Kömək və Layihə səhifələri",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Hər şey",
        "searchprofile-advanced": "Ətraflı",
        "searchprofile-articles-tooltip": "Axtarış $1",
-       "searchprofile-project-tooltip": "Axtarış $1",
        "searchprofile-images-tooltip": "Fayllar üçün axtarış",
        "searchprofile-everything-tooltip": "Bütün daxili axtar (müzakirə səhifəsi daxil olmaqla)",
        "searchprofile-advanced-tooltip": "Ad aralığında axtar",
        "search-nonefound": "Sorğunuza uyğun nəticə tapılmadı.",
        "powersearch-legend": "Təkmil axtarış",
        "powersearch-ns": "Ad aralığında axtar:",
-       "powersearch-redir": "Yönləndirmələri göstər",
        "powersearch-togglelabel": "Yoxla:",
        "powersearch-toggleall": "Hamısı",
        "powersearch-togglenone": "Heç biri",
        "prefs-emailconfirm-label": "E-poçtun təsdiqlənməsi:",
        "youremail": "E-məktub:",
        "username": "İstifadəçi adı:",
-       "uid": "İstifadəçi ID:",
        "prefs-memberingroups": "Üzvü olduğu {{PLURAL:$1|qrup|qrup}}:",
        "prefs-memberingroups-type": "$1",
        "prefs-registration": "Qeydiyyat vaxtı:",
        "prefs-advancedsearchoptions": "Ətraflı variantlar",
        "prefs-advancedwatchlist": "Ətraflı variantlar",
        "prefs-displayrc": "Görüntü variantları",
-       "prefs-displaysearchoptions": "Görüntü variantları",
        "prefs-displaywatchlist": "Görüntü variantları",
        "prefs-diffs": "Fərqlər",
        "email-address-validity-valid": "E-poçt ünvanı düzgündür",
        "recentchanges-label-unpatrolled": "Bu redaktə hələ nəzərdən keçirilməmişdir",
        "recentchanges-legend-newpage": "$1 - yeni səhifə",
        "rcnotefrom": "Aşağıda <strong>$2</strong>-dən bu yana olan dəyişikliklər göstərilib (<strong>$1</strong>-dən çox olmayaraq).",
-       "rclistfrom": "$1 vaxtından başlayaraq yeni dəyişiklikləri göstər",
+       "rclistfrom": "$3 $2 vaxtından başlayaraq yeni dəyişiklikləri göstər",
        "rcshowhideminor": "Kiçik redaktələri $1",
        "rcshowhidebots": "Botları $1",
        "rcshowhideliu": "Qeydiyyatlı istifadəçiləri $1",
        "logempty": "Jurnalda uyğun qeyd tapılmadı.",
        "log-title-wildcard": "Bu mətnlə başlayan başlıqları axtar",
        "allpages": "Bütün səhifələr",
-       "alphaindexline": "$1 məqaləsindən $2 məqaləsinə kimi",
        "nextpage": "Sonrakı səhifə ($1)",
        "prevpage": "Əvvəlki səhifə ($1)",
        "allpagesfrom": "Bu hərflə başlayan səhifələri göstər:",
        "watchlist-details": "İzləmə siyahınızda, müzakirə səhifələrini çıxmaq şərtilə, {{PLURAL:$1|$1 səhifə|$1 səhifə}} var.",
        "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.",
-       "watchmethod-recent": "yeni dəyişikliklər izlənilən səhifələr üçün yoxlanılır",
-       "watchmethod-list": "izlənilən səhifələr yeni dəyişikliklər üçün yoxlanılır",
-       "watchlistcontains": "İzləmə siyahınızda $1 {{PLURAL:$1|səhifə|səhifə}} var.",
-       "iteminvalidname": "'$1' ilə bağlı problem, adı düzgün deyil...",
        "wlshowlast": "Bunları göstər: son $1 saatı $2 günü $3",
        "watchlist-options": "İzləmə siyahısının nizamlamaları",
        "watching": "İzlənilir...",
        "enotif_lastvisited": "Sonuncu ziyarətinizdən indiyədək olan bütün dəyişiklikləri görmək üçün baxın: $1.",
        "enotif_lastdiff": "Bu dəyişikliyi görmək üçün $1 səhifəsinə baxın.",
        "enotif_anon_editor": "qeydiyyatsız istifadəçi $1",
-       "enotif_body": "Hörmətli $WATCHINGUSERNAME,\n\n{{SITENAME}} veb-saytındakı $PAGETITLE adlı səhifə $PAGEEDITDATE tarixində $PAGEEDITOR tərəfindən $CHANGEDORCREATED. Səhifənin sonuncu versiyasına baxmaq üçün $PAGETITLE_URL keçidindən istifadə edin.\n\n$NEWPAGE\n\nDəyişikliyi edən istifadəçinin izahı: $PAGESUMMARY $PAGEMINOREDIT\n\nSəhifəni dəyişdirən istifadəçinin əlaqə məlumatları:\ne-poçt: $PAGEEDITOR_EMAIL\nviki: $PAGEEDITOR_WIKI\n\nSiz haqqında söhbət gedən səhifəyə baxanadək səhifədəki digər dəyişikliklərlə bağlı başqa bildiriş məktubu almayacaqsınız. Siz həmçinin, izləmə siyahınızdakı bütün səhifələrlə bağlı bildiriş məlumatlarını silə bilərsiniz.\n\n               {{SITENAME}} saytının xəbərdarlıq sistemi.\n\n--\nİzləmə siyahısının tənzimləmələrini dəyişmək üçün:\n{{canonicalurl:Special:Watchlist/edit}}\n\nYardım və təklifləriniz üçün:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Hörmətli $WATCHINGUSERNAME,\n\n{{SITENAME}} veb-saytındakı $PAGETITLE adlı səhifə $PAGEEDITDATE tarixində $PAGEEDITOR tərəfindən $CHANGEDORCREATED. Səhifənin sonuncu versiyasına baxmaq üçün $PAGETITLE_URL keçidindən istifadə edin.\n\n$NEWPAGE\n\nDəyişikliyi edən istifadəçinin izahı: $PAGESUMMARY $PAGEMINOREDIT\n\nSəhifəni dəyişdirən istifadəçinin əlaqə məlumatları:\ne-poçt: $PAGEEDITOR_EMAIL\nviki: $PAGEEDITOR_WIKI\n\nSiz haqqında söhbət gedən səhifəyə baxanadək səhifədəki digər dəyişikliklərlə bağlı başqa bildiriş məktubu almayacaqsınız. Siz həmçinin, izləmə siyahınızdakı bütün səhifələrlə bağlı bildiriş məlumatlarını silə bilərsiniz.\n\n               {{SITENAME}} saytının xəbərdarlıq sistemi.\n\n--\nİzləmə siyahısının tənzimləmələrini dəyişmək üçün:\n{{canonicalurl:Special:Watchlist/edit}}\n\nYardım və təklifləriniz üçün:\n$HELPPAGE",
        "created": "yaradıldı",
        "changed": "dəyişdi",
        "deletepage": "Səhifəni sil",
        "unblock": "İstifadəçinin blokunu götür",
        "blockip": "İstifadəçini blokla",
        "blockip-legend": "İstifadəçinin bloklanması",
-       "ipadressorusername": "IP-ünvanı və ya istifadəçi adı",
+       "ipaddressorusername": "IP-ünvanı və ya istifadəçi adı",
        "ipbexpiry": "Bitmə müddəti:",
        "ipbreason": "Səbəb:",
        "ipbreason-dropdown": "*Bloklama səbəbləri:\n** Yalan məlumatların əlavə edilməsi\n** Səhifənin məzmununun silinməsi\n** Xarici saytlara spam-keçidlər\n** Səhifəyə mənasız və yararsız əlavələrə görə\n** Hədə və təqiblərə görə\n** Təhqirə görə\n** Çoxsaylı hesabdan sui istifadəyə görə\n** Qadağan olunmuş istifadəçi adına görə",
        "tooltip-preferences-save": "Nizamlamaları saxla",
        "tooltip-summary": "Qısa rezyume daxil edin",
        "common.css": "/* Burada yerləşən CSS bütün skinlərə tətbiq olunur */",
-       "cologneblue.css": "/* Burada yerləşən CSS Cologne Blue skin istifadəçilərinə tətbiq olunur */",
        "monobook.css": "/* Burada yerləşən CSS Monobook skin istifadəçilərinə tətbiq olunur */",
-       "modern.css": "/* Burada yerləşən CSS Modern skin istifadəçilərinə tətbiq olunur */",
        "vector.css": "/* Burada yerləşən CSS Vector istifadəçilərinə tətbiq olunur */",
        "group-autoconfirmed.css": "/* Burada yerləşən CSS yalnız avtotəsdiqlənmiş istifadəçilərə şamil olunur */",
        "group-bot.css": "/* Burada yerləşən CSS yalnız botlara şamil olunur */",
        "group-sysop.css": "/* Burada yerləşən CSS yalnız idarəçilərə şamil olunur */",
        "group-bureaucrat.css": "/* Burada yerləşən CSS yalnız bürokratlara şamil olunur */",
        "common.js": "/* Burada istifadəçilərin hamısı üçün bütün səhifələrdə istənilən JavaScript yüklənəcək */",
-       "cologneblue.js": "/* Burada Cologne Blue skin istifadəçiləri üçün istənilən JavaScript yüklənəcək */",
        "monobook.js": "/* Burada MonoBook skin istifadəçiləri üçün istənilən JavaScript yüklənəcək */",
-       "modern.js": "/* Burada Modern skin istifadəçiləri üçün istənilən JavaScript yüklənəcək */",
        "vector.js": "/* Burada Vector skin istifadəçiləri üçün istənilən JavaScript yüklənəcək */",
        "group-autoconfirmed.js": "/* Burada istənilən JavaScript yalnız avtotəsdiqlənmiş istifadəçilər üçün yüklənəcək */",
        "group-bot.js": "/* Burada istənilən JavaScript yalnız botlar üçün yüklənəcək */",
        "group-sysop.js": "/* Burada istənilən JavaScript yalnız idarəçilər üçün yüklənəcək */",
        "group-bureaucrat.js": "/* Burada istənilən JavaScript yalnız bürokratlar üçün yüklənəcək */",
-       "notacceptable": "Viki-server məlumatları brauzerinizin oxuya biləcəyi formatda təqdim edə bilmir.",
        "anonymous": "{{SITENAME}} saytının anonim {{PLURAL:$1|istifadəçisi|istifadəçiləri}}",
        "siteuser": "{{SITENAME}} istifadəçisi $1",
        "anonuser": "{{SITENAME}} anonim istifadəçisi $1",
        "pageinfo-redirectsto": "İstiqamətləndirmə",
        "pageinfo-redirectsto-info": "məlumat",
        "pageinfo-contentpage-yes": "Bəli",
-       "skinname-cologneblue": "Cologne Blue",
        "skinname-monobook": "MonoBook",
-       "skinname-modern": "Modern",
        "skinname-vector": "Vector",
        "markaspatrolleddiff": "Yoxlanıldı",
        "markaspatrolledtext": "Səhifəni patrullanmış kimi işarələ",
        "newimages": "Yeni faylların siyahısı",
        "newimages-legend": "Filtrlər",
        "newimages-label": "Faylın (və ya onun bir hissəsinin) adı:",
-       "showhidebots": "($1 bot redaktə)",
        "noimages": "Heç nəyi görməmək.",
        "ilsubmit": "Axtar",
        "bydate": "tarixə görə",
        "autosumm-replace": "Səhifənin məzmunu '$1' yazısı ilə dəyişdirildi",
        "autoredircomment": "[[$1]] səhifəsinə istiqamətləndirilir",
        "autosumm-new": "Səhifəni '$1' ilə yarat",
-       "livepreview-loading": "Yüklənir…",
-       "livepreview-ready": "Gözlə... Hazırdır!",
        "watchlistedit-normal-title": "İzlədiyim səhifələri redaktə et",
        "watchlistedit-normal-legend": "İzləmə siyahısından başlıqların silinməsi",
        "watchlistedit-normal-submit": "Başlığın silinməsi",
        "compare-rev1": "Dəyişiklik 1",
        "compare-rev2": "Dəyişiklik 2",
        "compare-submit": "Qarşılaşdır",
-       "dberr-header": "Bu vikidə problem var",
        "dberr-problems": "Üzr istəyirik! Bu saytda texniki problemlər var.",
        "dberr-info": "($1: Məlumat bazası ilə əlaqə yoxdur)",
        "htmlform-invalid-input": "Girişinizin bir qismilə əlaqədəar problemlər var",
index 7cf7fce..b51d2b2 100644 (file)
                        "Erdemaslancan",
                        "Mousa",
                        "Shirayuki",
-                       "Microchip08"
+                       "Microchip08",
+                       "아라"
                ]
        },
-       "tog-underline": "باغلانتیلارین آلتینی خطله:",
-       "tog-hideminor": "سÙ\88Ù\86 Ø¯Û\8cÛ\8cØ´Û\8cÚ©Ù\84Û\8cÚ©Ù\84ردÙ\87 Ú©Û\8cÚ\86Û\8cÚ©â\80\8cلری گیزلت",
-       "tog-hidepatrolled": "نظارتلنمیش دَییشیکلیکلری سون دییشیکلیکلرده گیزلت",
-       "tog-newpageshidepatrolled": "نظارتلنمیش صحیفه‌لری یئنی صحیفه‌لر سیاهی‌سیندان گیزلت",
-       "tog-extendwatchlist": "ایزله‌دیکلری، بوتون دیشیکلیکلری گؤسترمک اوچون گئنیشلندیر",
+       "tog-underline": "باغلانتیلارین آلتینی خطله:",
+       "tog-hideminor": "سÙ\88Ù\92Ù\86 Ø¯Û\8cÛ\8cØ´Û\8cÚ©Ù\84Û\8cÚ©Ù\84ردÙ\87 Ú©Û\8cÚ\86Û\8cÚ©لری گیزلت",
+       "tog-hidepatrolled": "سوْن دییشیکلیکلرده نظارتلنمیش دَییشیکلیکلری گیزلت",
+       "tog-newpageshidepatrolled": "نظارتلنمیش صحیفه‌لری یئنی صحیفه‌لر لیستین‌دن گیزلت",
+       "tog-extendwatchlist": "گؤزله‌دیکلری، یالنیز یئنیلر اۆچون یوْخ، بۆتون دییشیکلیکلری گؤسترمک اۆچون، گئنیشلندیر.",
        "tog-usenewrc": "دَییشیکلیکلری سون دَییشیکلیکلر صحیفه‌سینده ایزله‌دیکلر صحیفه‌سینده گروپ‌لا (جاوااسکریپت لازیم‌دیر)",
-       "tog-numberheadings": "باشلیق‌لاری اوتوماتیک نومره‌له",
-       "tog-showtoolbar": "دَییشدیرمه آراج چوبوغونو گؤستر",
-       "tog-editondblclick": "صحیفه‌‌لری ایکی کلیک‌ده دَییشدیر",
-       "tog-editsectiononrightclick": "بؤلوم‌لرین دیشدیرمه‌سینی، باشلیقلارین اوزرینده ساغ‌کلیک ائتمک‌له ایجازه وئر",
-       "tog-rememberpassword": "منیم گیریشیمی بو بیلگی‌سایاردا یاددا ساخلا (چوخو {{PLURAL:$1|بیر گونه|$1 گونه}} کیمی)",
-       "tog-watchcreations": "ياراتدیغیم صحیفه‌‌لری و يوکله‌دیگیم فايل‌لاری ایزله‌مه‌لریمه آرتیر",
-       "tog-watchdefault": "دَییشدیردیگیم صحیفه‌‌لری و فايل‌لاری ایزله‌دیکلریمه آرتیر",
-       "tog-watchmoves": "داشیدیغیم صحیفه‌‌لری و فايل‌لاری ایزله‌دیکلریمه آرتیر",
-       "tog-watchdeletion": "سیلدیگیم صحیفه‌‌لری و فايل‌لاری ایزله‌دیکلریمه آرتیر",
-       "tog-minordefault": "دیفالت اولاراق بوتون دَییشدیر‌مه‌لریمی کیچیک دَییشدیر کیمی نیشانلا",
-       "tog-previewontop": "اؤن‌گؤستریشی يازماق قوتوسوندان قاباق گؤستر",
+       "tog-numberheadings": "باشلیقلاری اوْتوماتیک نۆمره‌له",
+       "tog-showtoolbar": "دَییشدیرمک آراج-چۇبوغونو گؤستر",
+       "tog-editondblclick": "صحیفه‌‌لری ایکی کیلیک‌ده دَییشدیر",
+       "tog-editsectiononrightclick": "بؤلوم‌لرین دَییشدیرمه‌سینی، باشلیقلارین اۆزرینده ساغ‌کلیک ائتمک‌له ایجازه وئر",
+       "tog-watchcreations": "ياراتدیغیم صحیفه‌‌لری و يۆکله‌دیگیم فايل‌لاری، گؤزله‌دیکلریمه آرتیر",
+       "tog-watchdefault": "دَییشدیردیگیم صحیفه‌‌لری و فايل‌لاری، گؤزله‌دیکلریمه آرتیر",
+       "tog-watchmoves": "داشیدیغیم صحیفه‌‌لری و فايل‌لاری گؤزله‌دیکلریمه آرتیر",
+       "tog-watchdeletion": "سیلدیگیم صحیفه‌‌لری و فايل‌لاری گؤزله‌دیکلریمه آرتیر",
+       "tog-minordefault": "وارساییلان اوْلاراق، بۆتون دَییشدیر‌مه‌لری کیچیک کیمی نیشانلا",
+       "tog-previewontop": "اؤن‌گؤستریشی، يازماق قۇتوسوندان قاباق گؤستر",
        "tog-previewonfirst": "ایلک دَییشدیرمه‌ده اؤن‌گؤستریشی گؤستر",
-       "tog-enotifwatchlistpages": "ایزله‌دیکلریم‌ده اولان صحیفه یوخسا فایل دَییشدیریلنده، منه ایمیل گؤندر",
+       "tog-enotifwatchlistpages": "گؤزله‌دیکلریم‌ده اولان بیر صحیفه یا فایل دَییشدیریلنده، منه ایمیل گؤندر",
        "tog-enotifusertalkpages": "دانیشیق صحیفه‌‌م دَییشدیریلنده منه ایمیل گؤندر",
        "tog-enotifminoredits": "صحیفه‌لرده و فایل‌لاردا کیچیک دَییشیکلیکلر اولسا دا منه ایمیل گؤندر",
-       "tog-enotifrevealaddr": "Ù\85Ù\86Û\8cÙ\85 Ø§Û\8cÙ\85Û\8cÙ\84 Ø¢Ø¯Ø±Ø³Û\8cÙ\85Û\8c Ø®Ø¨Ø± Ù\88ئرÙ\85Ù\87 ایمیل‌لرینده گؤستر",
-       "tog-shownumberswatching": "ایزله‌ين ایستیفاده‌چیلرین سایینی گؤستر",
+       "tog-enotifrevealaddr": "Ù\85Ù\86Û\8cÙ\85 Ø§Û\8cÙ\85Û\8cÙ\84 Ø¢Ø¯Ø±Ø³Û\8cÙ\85Û\8c Ø¨Û\8cÙ\84دÛ\8cرÛ\8cØ´ ایمیل‌لرینده گؤستر",
+       "tog-shownumberswatching": "گؤزله‌ین ایستیفاده‌چیلرین سایینی گؤستر",
        "tog-oldsig": "ایندی‌کی ایمضا:",
-       "tog-fancysig": "ویکی متن کیمی ایمضا (اوتوماتیک باغلانتی‌سیز)",
-       "tog-uselivepreview": "دیری اؤن‌گؤستریش ایشلت (تست مرحله‌سینده)",
+       "tog-fancysig": "ایمضانی ویکی-متن کیمی نظره آل (اوْتوماتیک باغلانتی‌سیز)",
+       "tog-uselivepreview": "دیری اؤن‌گؤستریش ایشلت (تِست مرحله‌سینده)",
        "tog-forceeditsummary": "دَییشیکلیک قیساسی بوش قالاندا منی بیلدیر",
-       "tog-watchlisthideown": "منیم دَییشیکلیکلریمی ایزله‌دیکلردن گیزلت",
-       "tog-watchlisthidebots": "بوت دَییشیکلیکلرینی ایزله‌دیکلردن گیزلت",
-       "tog-watchlisthideminor": "کیچیک دَییشیکلیکلری ایزله‌دیکلردن گیزلت",
-       "tog-watchlisthideliu": "گیرمیش ایستیفاده‌چیلرین دَییشیکلیکلرینی ایزله‌دیکلردن گیزلت",
-       "tog-watchlisthideanons": "تانینمامیش ایستیفاده‌چیلرین دَییشیکلیکلرینی ایزله‌دیکلردن گیزلت",
-       "tog-watchlisthidepatrolled": "نظارتلنمیش دَییشیکلیکلری ایزله‌دیکلردن گیزلت",
-       "tog-ccmeonemails": "باشÙ\82ا Ø§Û\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8cÙ\84رÙ\87 Ú¯Ø¤Ù\86دردÛ\8cÚ¯Û\8cÙ\85 Ø§Û\8cÙ\85Û\8cÙ\84â\80\8cÙ\84رÛ\8cÙ\86 Ú©Ù\88پیلرینی منه گؤندر",
-       "tog-diffonly": "موقاییسه‌لر آلیتندا صحیفه‌لرین ایچینده‌کیلرینی گؤسترمه",
+       "tog-watchlisthideown": "منیم دَییشیکلیکلریمی گؤزله‌دیکلردن گیزلت",
+       "tog-watchlisthidebots": "بوْت دَییشیکلیکلرینی گؤزله‌دیکلردن گیزلت",
+       "tog-watchlisthideminor": "کیچیک دَییشیکلیکلری گؤزله‌دیکلردن گیزلت",
+       "tog-watchlisthideliu": "گیرمیش ایستیفاده‌چیلرین دَییشیکلیکلرینی گؤزله‌دیکلردن گیزلت",
+       "tog-watchlisthideanons": "تانینمامیش ایستیفاده‌چیلرین دَییشیکلیکلرینی گؤزله‌دیکلردن گیزلت",
+       "tog-watchlisthidepatrolled": "نظارتلنمیش دَییشیکلیکلری گؤزله‌دیکلردن گیزلت",
+       "tog-ccmeonemails": "Ø¢Û\8cرÛ\8c Ø§Û\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8cÙ\84رÙ\87 Ú¯Ø¤Ù\86دردÛ\8cÚ¯Û\8cÙ\85 Ø§Û\8cÙ\85Û\8cÙ\84â\80\8cÙ\84رÛ\8cÙ\86 Ú©Ù\88Ù\92پیلرینی منه گؤندر",
+       "tog-diffonly": "مۇقاییسه‌لر آلیتندا صحیفه‌لرین ایچینده‌کیلرینی گؤسترمه",
        "tog-showhiddencats": "گیزلی بؤلمه‌لری گؤستر",
        "tog-norollbackdiff": "قایتاراندان سونرا موقاییسه گؤسترمه",
-       "tog-useeditwarning": "دÙ\8eÛ\8cÛ\8cشدÛ\8cرÙ\85Ù\87 ØµØ­Û\8cÙ\81Ù\87â\80\8cسÛ\8cÙ\86دÙ\87 Ú\86Û\8cØ®Û\8cØ´ Ø²Ø§Ù\85اÙ\86Û\8cØ\8c Ø¢Ú\86Û\8cÙ\82 Ù\88 Ù\82ئÛ\8cد Ø§Ù\88Ù\84Ù\85اÛ\8cاÙ\86 Ø¯Ù\8eÛ\8cÛ\8cشدÛ\8cرÙ\85Ù\87 ØµØ­Û\8cÙ\81Ù\87 Ù\88ارسا Ù\85Ù\86Ù\87 Ù\87شدار Ù\88ئرÛ\8cÙ\84سÛ\8cÙ\86",
+       "tog-useeditwarning": "دÙ\8eÛ\8cÛ\8cشدÛ\8cرÙ\85Ù\87 ØµØ­Û\8cÙ\81Ù\87â\80\8cسÛ\8cÙ\86دÙ\86 Ú\86Û\8cخاÙ\86داØ\8c Ù\82ئÛ\8cد Ø§Ø¦Ø¯Û\8cÙ\84Ù\85Ù\87â\80\8cÙ\85Û\8cØ´ Ø¯Ù\8eÛ\8cÛ\8cشدÛ\8cرÙ\85Ù\87 Ø§Ù\88Ù\92Ù\84ساØ\8c Ù\85Ù\86Ù\87 Ù\87شدار Ù\88ئر",
        "tog-prefershttps": "هر زامان گیریش ائتمگه امن باغلانتی ایشلت",
-       "underline-always": "همیشه",
+       "underline-always": "هر زامان",
        "underline-never": "هئچ واخت",
-       "underline-default": "دیفالت قابیق یوخسا براوزر",
-       "editfont-style": "دَییشدیرمه قوتوطونون فونت نؤوعو:",
-       "editfont-default": "براوزر دیفالتی",
-       "editfont-monospace": "ثابیت آرالی فونت",
-       "editfont-sansserif": "بوجاق‌سیز فونت",
-       "editfont-serif": "بوجاق‌لی فونت",
-       "sunday": "سود گونو(یکشنبه)",
-       "monday": "دوزگونو(دوشنبه)",
-       "tuesday": "آرا گون(سه‌شنبه)",
-       "wednesday": "اوْدگونو(چهارشنبه)",
-       "thursday": "سوگونو(پنجشنبه)",
-       "friday": "جÙ\88Ù\85ا(Ø¢Û\8cÙ\86Û\8câ\80\8cÚ¯Ù\88Ù\86)",
-       "saturday": "يئل‌گونو(شنبه)",
-       "sun": "سود گونو(یکشنبه)",
-       "mon": "دوزگونو(دوشنبه)",
-       "tue": "سÙ\87â\80\8cØ´Ù\86بÙ\87(آرا Ú¯Ù\88Ù\86)",
+       "underline-default": "وارساییلان قابیق یا براوزِر",
+       "editfont-style": "دَییشدیرمه قۇتوسونون فوْنتی:",
+       "editfont-default": "براوزِر وارساییلانی",
+       "editfont-monospace": "ثابÛ\8cت Ø¢Ø±Ø§Ù\84Û\8c Ù\81Ù\88Ù\92Ù\86ت",
+       "editfont-sansserif": "بۇجاق‌سیز فوْنت",
+       "editfont-serif": "بۇجاق‌لی فوْنت",
+       "sunday": "سۆدگونو (یکشنبه)",
+       "monday": "دۇزگونو (دوشنبه)",
+       "tuesday": "آراگون (سه‌شنبه)",
+       "wednesday": "اوْدگونو (چهارشنبه)",
+       "thursday": "سۇگونو (پنجشنبه)",
+       "friday": "Ø¢Û\8cÙ\86Û\8câ\80\8cÚ¯Ù\88Ù\86 (جÛ\86Ù\85عÙ\87)",
+       "saturday": "يئل‌گونو (شنبه)",
+       "sun": "سۆدگونو (یکشنبه)",
+       "mon": "دۇزگونو (دوشنبه)",
+       "tue": "آراگÙ\88Ù\86 (سÙ\87â\80\8cØ´Ù\86بÙ\87)",
        "wed": "اوْدگونو (چهارشنبه)",
-       "thu": "سوگونو(پنجشنبه)",
-       "fri": "آینی‌گون(جوما)",
-       "sat": "يئل‌گونو(شنبه)",
+       "thu": "سۇگونو (پنجشنبه)",
+       "fri": "آینی‌گون (جۆمعه)",
+       "sat": "يئل‌گونو (شنبه)",
        "january": "ژانویه",
        "february": "فئوریه",
        "march": "مارس",
        "july": "ژولای",
        "august": "آقوست",
        "september": "سئپتامبر",
-       "october": "اوکتوبر",
-       "november": "نووامبر",
+       "october": "اوْکتوبر",
+       "november": "Ù\86Ù\88Ù\92Ù\88اÙ\85بر",
        "december": "دئسامبر",
        "january-gen": "ژانویه",
-       "february-gen": "فوریه",
+       "february-gen": "فئوریه",
        "march-gen": "مارس",
        "april-gen": "آوریل",
-       "may-gen": "مِی",
+       "may-gen": "مئی",
        "june-gen": "ژوئن",
        "july-gen": "جولای",
        "august-gen": "آقوست",
        "jul": "ژولای",
        "aug": "آقوست",
        "sep": "سئپتامبر",
-       "oct": "اوکتوبر",
-       "nov": "نووامبر",
+       "oct": "اوْکتوبر",
+       "nov": "Ù\86Ù\88Ù\92Ù\88اÙ\85بر",
        "dec": "دئسامبر",
        "january-date": "ژانویه‌نین $1-ی",
-       "february-date": "$1 فئوریه",
+       "february-date": "فئوریه‌نین $1-ی",
        "march-date": "مارسین $1-ی",
        "april-date": "آوریلین $1-ی",
-       "may-date": "$1 مئی",
+       "may-date": "مئیین $1-ی",
        "june-date": "ژوئنین $1-ی",
-       "july-date": "$1 ژولای",
-       "august-date": "$1 آقوست",
-       "september-date": "$1 سئپتامبر",
-       "october-date": "$1 اوکتوبر",
-       "november-date": "$1 نووامبر",
-       "december-date": "$1 دئسامبر",
+       "july-date": "ژولایین $1-ی",
+       "august-date": "آقوستون $1-ی",
+       "september-date": "سئپتامبرین $1-ی",
+       "october-date": "اوْکتوبرون $1-ی",
+       "november-date": "نوْوامبرین $1-ی",
+       "december-date": "دئسامبرین $1-ی",
        "pagecategories": "{{PLURAL:$1|بؤلمه|بؤلمه‌لر}}",
-       "category_header": "«$1» بؤلمه‌سین‌ده‌کی مقاله‌لر",
-       "subcategories": "آلت بؤلمه‌لر",
-       "category-media-header": "«$1» بؤلمه‌سینده مئدیا",
-       "category-empty": "''بو بؤلمه‌نین ایندی فایل یوخسا مئدیاسی یوخدور.''",
+       "category_header": "«$1» بؤلمه‌سین‌ده صحیفه‌لر",
+       "subcategories": "آلتبؤلمه‌لر",
+       "category-media-header": "«$1» بؤلمه‌سینده مئدیا",
+       "category-empty": "<em>بو بؤلمه‌ده ایندی فایل یا مئدیا یوْخدور.</em>",
        "hidden-categories": "{{PLURAL:$1|گیزلی بؤلمه|گیزلی بؤلمه‌لر}}",
        "hidden-category-category": "گیزلی بؤلمه‌لر",
-       "category-subcat-count": "بو بؤلمه‌ده {{PLURAL:$2|یالنیز|}} آشاغیداکی {{PLURAL:$1|بیر|$1}} آلت‌بؤلمه وار؛ بو بؤلمه‌نین جمعاً $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-subcat-count": "{{PLURAL:$2|بۇ بؤلمه‌ده یالنیز آشاغیداکی آلت‌بؤلمه واردیر.|بۇ بؤلمه‌ده، توپلام $2-دن، آشاغیداکی {{PLURAL:$1|آلت‌بؤلمه|$1 آلت‌بؤلمه}} واردیر.}}",
+       "category-subcat-count-limited": "بۇ بؤلمه‌ده آشاغیداکی {{PLURAL:$1|آلت‌بؤلمه|$1 آلت‌بؤلمه}} واردیر.",
+       "category-article-count": "{{PLURAL:$2|بۇ بؤلمه‌ده یالنیز آشاغیداکی صحیفه واردیر.|بۇ بؤلمه‌ده توْپلام $2 صحیفه‌دن، آشاغیداکی {{PLURAL:$1|صحیفه|$1 صحیفه}} واردیر.}}",
+       "category-article-count-limited": "بۇ بؤلمه‌ده، آشاغیداکی {{PLURAL:$1|صحیفه|$1 صحیفه}} واردیر.",
+       "category-file-count": "{{PLURAL:$2|بۇ بؤلمه‌ده یالنیز آشاغیداکی فایل واردیر.|بۇ بؤلمه‌ده توْپلام $1-دن، آشاغیداکی {{PLURAL:$1|فایل|$1 فایل}} واردیر.}}",
+       "category-file-count-limited": "بۇ بؤلمه‌ده، آشاغیداکی {{PLURAL:$1|فایل|$1 فایل}} واردیر.",
        "listingcontinuesabbrev": "(قالانی)",
-       "index-category": "ایندئکس‌لشدیریلمیش یارپاقلار",
-       "noindex-category": "ایندئکس‌لشدیریلمه‌ین یارپاقلار",
-       "broken-file-category": "Ù\81اÛ\8cÙ\84â\80\8cÙ\84ارا Ù\82Û\8cرÛ\8cÙ\84Ù\85Û\8cØ´ Ø¨Ø§ØºÙ\84اÙ\86تÛ\8cÙ\84ارÛ\8c Ø§Ù\88Ù\84اÙ\86 Û\8cارپاÙ\82Ù\84ار",
-       "about": "گؤره",
-       "article": "ایچری‌لی یارپاق",
+       "index-category": "ایندئکس‌لشدیریلمیش صحیفه‌لر",
+       "noindex-category": "ایندئکس‌لشدیریلمه‌میش صحیفه‌لر",
+       "broken-file-category": "Ù\82Û\8cرÛ\8cÙ\84Ù\85Û\8cØ´ Ù\81اÛ\8cÙ\84 Ø¨Ø§ØºÙ\84اÙ\86تÛ\8cÙ\84ارÛ\8c Ø§Ù\88Ù\92Ù\84اÙ\86 ØµØ­Û\8cÙ\81Ù\87â\80\8cÙ\84ر",
+       "about": "حاقیندا",
+       "article": "ایچری‌لی صحیفه",
        "newwindow": "(یئنی پنجره‌ده آچیلیر)",
-       "cancel": "Ù\84غÙ\88 Ø§Ø¦Øª",
+       "cancel": "Ù\88ازگئÚ\86",
        "moredotdotdot": "داها...",
-       "morenotlisted": "بو لیست کامل دئییل.",
-       "mypage": "مقاله",
+       "morenotlisted": "بۇ لیست کامل دئییل.",
+       "mypage": "صحیفه",
        "mytalk": "دانیشیق",
        "anontalk": "بو آی‌پی آدرسینه دانیشیق",
-       "navigation": "دولانماق",
+       "navigation": "دÙ\88Ù\92Ù\84اÙ\86Ù\85اÙ\82",
        "and": "&#32;و",
        "qbfind": "تاپ",
-       "qbbrowse": "گؤزدÙ\86 Ú¯Ø¦Ú\86Û\8cد",
+       "qbbrowse": "گؤزدÙ\86 Ú¯Ø¦Ú\86Û\8cرت",
        "qbedit": "دَییشدیر",
-       "qbpageoptions": "بو صحیفه‌‌",
-       "qbmyoptions": "منیم صحیفه‌‌لریم",
-       "faq": "چوخ سوروشولان سواللار",
-       "faqpage": "Project:چوخلو سوروشولان سورغولار",
-       "vector-action-addsection": "قونو آرتیر",
+       "qbpageoptions": "بۇ صحیفه‌‌",
+       "qbmyoptions": "صحیفه‌‌لریم",
+       "faq": "چوْخ سوْروشولان سوْال‌لار",
+       "faqpage": "Project:چوْخ سوْروشولان سوْال‌لار",
+       "vector-action-addsection": "Ù\82Ù\88Ù\92Ù\86Ù\88 Ø¢Ø±ØªÛ\8cر",
        "vector-action-delete": "سیل",
-       "vector-action-move": "آدÛ\8cÙ\86Û\8c Ø¯Ù\8aÙ\8eÛ\8cشدÛ\8cر",
-       "vector-action-protect": "قورو",
+       "vector-action-move": "داشÛ\8c",
+       "vector-action-protect": "قوْرو",
        "vector-action-undelete": "سیلمگی قایتار",
-       "vector-action-unprotect": "قوروماغی دَییشدیر",
+       "vector-action-unprotect": "قوْروماغی دَییشدیر",
        "vector-view-create": "یارات",
        "vector-view-edit": "دَییشدیر",
        "vector-view-history": "گئچمیشه باخ",
-       "vector-view-view": "اوخو",
+       "vector-view-view": "اوْخو",
        "vector-view-viewsource": "قایناغا باخ",
-       "actions": "ایشلر",
-       "namespaces": "آدلار فضاسی",
+       "actions": "چالیشمالار",
+       "namespaces": "آد فضالاری",
        "variants": "واریانتلار",
-       "navigation-heading": "دولانماق مِنوسو",
+       "navigation-heading": "دÙ\88Ù\92Ù\84اÙ\86Ù\85اÙ\82 Ù\85Ù\90Ù\86Ù\88سÙ\88",
        "errorpagetitle": "خطا",
        "returnto": "$1-ه قاییت.",
        "tagline": "{{SITENAME}} سایتیندان",
        "searcharticle": "گئت",
        "history": "صحیفه‌‌نین گئچمیشی",
        "history_short": "گئچمیش",
-       "updatedmarker": "سÙ\88Ù\86 Ø¨Ø§Ø®Û\8cØ´Û\8cÙ\85داÙ\86 Ø¨Ù\88Û\8cاÙ\86اØ\8c Û\8cئÙ\86Û\8câ\80\8cÙ\84Ø´یب‌دیر",
-       "printableversion": "چاپ ائتمه‌لی نوسخه",
+       "updatedmarker": "سÙ\88Ù\92Ù\86 Ø¨Ø§Ø®Û\8cØ´Û\8cÙ\85داÙ\86 Ø³Ù\88Ù\92Ù\86را Û\8cئÙ\86Û\8câ\80\8cÙ\84Ù\86یب‌دیر",
+       "printableversion": "یازدیریرا بیلن نۆسخه",
        "permalink": "قالان باغلانتی",
        "print": "یازدیر",
        "view": "باخ",
        "edit": "دَییشدیر",
        "create": "یارات",
-       "editthispage": "بو صحیفه‌‌نی دَییشدیر",
-       "create-this-page": "بو صحیفه‌‌نی يارات",
+       "editthispage": "بۇ صحیفه‌‌نی دَییشدیر",
+       "create-this-page": "بۇ صحیفه‌‌نی يارات",
        "delete": "سیل",
-       "deletethispage": "بو صحیفه‌‌نی سیل",
-       "undeletethispage": "بو صحیفه‌نی دیریلت",
-       "undelete_short": "{{PLURAL:$1|بیر دَییشیکلیگی|$1 دَییشیکلیگی}} برپا ائت",
-       "viewdeleted_short": "{{PLURAL:$1|بیر|$1}} سیلینمیش دَییشیکلیگی گؤستر",
-       "protect": "قوروماق",
+       "deletethispage": "بۇ صحیفه‌‌نی سیل",
+       "undeletethispage": "بۇ صحیفه‌نی دیریلت",
+       "undelete_short": "{{PLURAL:$1|بیر دَییشیکلیگی|$1 دَییشیکلیگی}} قایتار",
+       "viewdeleted_short": "{{PLURAL:$1|بیر|$1}} سیلینمیش دَییشیکلیگه باخ",
+       "protect": "قوْرو",
        "protect_change": "ديَیشدیر",
-       "protectthispage": "بو صحیفه‌‌نی قورو",
-       "unprotect": "قوروماغی دَییشدیر",
-       "unprotectthispage": "بو یارپاغین قوروماسینی دَییشدیر",
+       "protectthispage": "بۇ صحیفه‌‌نی قوْرو",
+       "unprotect": "قوْروماغی دَییشدیر",
+       "unprotectthispage": "بۇ صحیفه‌نین قوْروماسینی دَییشدیر",
        "newpage": "يئنی صحیفه‌‌",
-       "talkpage": "بو صحیفه‌یه گؤره دانیشیق آپارین",
+       "talkpage": "بۇ صحیفه‌نی دانیش",
        "talkpagelinktext": "دانیشیق",
        "specialpage": "اؤزل صحیفه",
        "personaltools": "شخصی آراجلار",
        "postcomment": "يئنی بؤلوم",
-       "articlepage": "مقاله‌یه باخین",
+       "articlepage": "ایچری‌لی صحیفه‌یه باخ",
        "talk": "دانیشیق",
        "views": "گؤرونوشلر",
        "toolbox": "آراجلار",
-       "userpage": "ایستیفاده‌چی صحیفه‌‌سینی باخین",
-       "projectpage": "پروژه صحیفه‌سینه باخین",
-       "imagepage": "فایل صحیفه‌سینه باخین",
-       "mediawikipage": "مئساژ صحیفه‌سینه باخین",
-       "templatepage": "شابلون صحیفه‌سینه باخین",
-       "viewhelppage": "یاردیم صحیفه‌سینه باخین",
-       "categorypage": "بؤلمه صحیفه‌‌سینی گؤستر",
-       "viewtalkpage": "دانیشیغا باخین",
+       "userpage": "ایستیفاده‌چی صحیفه‌‌سینه باخ",
+       "projectpage": "پروژه صحیفه‌سینه باخ",
+       "imagepage": "فایل صحیفه‌سینه باخ",
+       "mediawikipage": "مئساژ صحیفه‌سینه باخ",
+       "templatepage": "شابلون صحیفه‌سینه باخ",
+       "viewhelppage": "یاردیم صحیفه‌سینه باخ",
+       "categorypage": "بؤلمه صحیفه‌‌سینه باخ",
+       "viewtalkpage": "دانیشیغا باخ",
        "otherlanguages": "آیری دیل‌لرده",
-       "redirectedfrom": "($1 صحیفه‌‌سیندن يؤنلن‌دیریلمیش‌دیر)",
-       "redirectpagesub": "Û\8cÙ\88Ù\84لاندیرما صحیفه‌سی",
-       "lastmodifiedat": "بو صحیفه‌‌ سون دفعه‌‌ $1، $2 چاغیندا دَییشیلیب‌دیر.",
-       "viewcount": "بو یارپاق {{PLURAL:$1|بیر|$1}} دفعه گؤرونوب‌دور.",
-       "protectedpage": "قورونموش یارپاق",
-       "jumpto": "آتلان:",
-       "jumptonavigation": "دولانماق",
+       "redirectedfrom": "($1-دن يوْل‌لاندیریلمیش)",
+       "redirectpagesub": "Û\8cÙ\88Ù\92Ù\84â\80\8cلاندیرما صحیفه‌سی",
+       "lastmodifiedat": "بۇ صحیفه‌‌ سوْن دفعه‌‌ $1، $2 چاغیندا دَییشیلمیشدیر.",
+       "viewcount": "بۇ صحیفه {{PLURAL:$1|بیر|$1}} دفعه گؤرولوبدور.",
+       "protectedpage": "قوْرونموش صحیفه",
+       "jumpto": "آتیل:",
+       "jumptonavigation": "دÙ\88Ù\92Ù\84اÙ\86Ù\85اÙ\82",
        "jumptosearch": "آختار",
-       "view-pool-error": "باغیشلایین، ایندی خیدمت‌چیلر آرتیق یوک آلتیندادیلار.\nچوخلو ایشلدنلر بو یارپاغی گؤرمک ایسته‌ییرلر.\nلوطفاً یئنی‌دن بو یارپاغا ال تاپماغا چالیشماقدان اؤنجه، بیر آز دؤزون.\n\n$1",
-       "pool-timeout": "قیفیلا دؤزمک واختی قورتاردی",
-       "pool-queuefull": "مخزن صفی دولودور",
-       "pool-errorunknown": "تاÙ\86Û\8cÙ\86Ù\85اÙ\85Û\8cØ´ خطا",
-       "aboutsite": "{{SITENAME}}-ا گؤره",
+       "view-pool-error": "باغیشلایین، ایندی خیدمت‌چیلر آرتیق یۆک آلتیندادیلار.\nچوْخلو ایستیفاده‌چیلر بۇ صحیفه‌نی گؤرمک ایسته‌ییرلر.\nلۆطفاً یئنی‌دن بۇ صحیفه‌یه ال تاپماغا چالیشماقدان اؤنجه، بیر آز دؤزون.\n\n$1",
+       "pool-timeout": "قیفیلا دؤزماغین واختی بیتیردی",
+       "pool-queuefull": "Ù\85خزÙ\86 ØµÙ\81Û\8c Ø¯Ù\88Ù\92Ù\84Ù\88دÙ\88ر",
+       "pool-errorunknown": "بÛ\8cÙ\84Û\8cÙ\86Ù\85Ù\87â\80\8cÛ\8cÙ\86 خطا",
+       "aboutsite": "{{SITENAME}} حاقیندا",
        "aboutpage": "Project:حاقیندا",
        "copyright": "ایچینده‌کیلر $1 لیسانسی احاطه‌سینده‌دیلر.",
-       "copyrightpage": "{{ns:project}}:Ú©Ù\88Ù¾Û\8c Ø­Ø§Ù\82ی",
+       "copyrightpage": "{{ns:project}}:Ú©Ù\88Ù\92Ù¾Û\8c Ø­Ø§Ù\82Ù\84اری",
        "currentevents": "ایندیکی اولایلار",
        "currentevents-url": "Project:ایندیکی اولایلار",
        "disclaimers": "رد ائتمک",
        "disclaimerpage": "Project:عمومی رد ائتمک",
-       "edithelp": "ديَیشیکلیک‌لر اوچون یاردیم",
+       "edithelp": "ديَیشتیرمک یاردیمی",
        "mainpage": "آنا صحیفه",
        "mainpage-description": "آنا صحیفه",
        "policy-url": "Project:قایدالار",
-       "portal": "تÙ\88Ù¾Ù\84Ù\88Ù\85 Ù¾Ù\88رتالی",
-       "portal-url": "Project:تÙ\88Ù¾Ù\84Ù\88Ù\85 Ù¾Ù\88رتالی",
+       "portal": "تÙ\88Ù\92Ù¾Ù\84Ù\88Ù\85 Ù¾Ù\88Ù\92رتالی",
+       "portal-url": "Project:تÙ\88Ù\92Ù¾Ù\84Ù\88Ù\85 Ù¾Ù\88Ù\92رتالی",
        "privacy": "گیزلیلیک سیاستی",
        "privacypage": "Project:گیزلیلیک سیاستی",
-       "badaccess": "یول وئرمه خطاسی",
-       "badaccess-group0": "ایسته‌دیگینیز ایشه ایجازه‌نیز یوخدور.",
-       "badaccess-groups": "ایسته‌دیگینیز ایشین ایجازه‌سی، تکجه بو {{PLURAL:$2|قروپ|قروپلار}}داکی ایشلدنلره وئریلیب‌دیر: $1.",
-       "versionrequired": "مدئدیاویکی یازیلیمینین $1 نوسخه‌سی لازیم‌دیر",
-       "versionrequiredtext": "بو یارپاغی ایشلتدماغا، مئدیاویکی یازیلیمینین $1 نوسخه‌سی لازیم‌دیر.\n[[Special:Version|نوسخه یارپاغینا]] باخین.",
-       "ok": "اÙ\88Ù\84دÙ\88",
+       "badaccess": "ایجازه خطاسی",
+       "badaccess-group0": "ایسته‌دیگینیز ایشه ایجازه‌نیز یوْخدور.",
+       "badaccess-groups": "ایسته‌دیگینیز ایشین ایجازه‌سی، یالنیز بۇ {{PLURAL:$2|قروپ‌داکی|قروپلارین بیرینده‌کی}} ایستیفاده‌چیلره وئریلیب‌دیر: $1.",
+       "versionrequired": "مِدیاویکی یازیلیمینین $1 نۆسخه‌سی لازیمدیر",
+       "versionrequiredtext": "بۇ صحیفه‌نی ایشلتمک اۆچون، مِدیاویکی یازیلیمینین $1 نۆسخه‌سی لازیم‌دیر.\n[[Special:Version|نۆسخه صحیفه‌سینه]] باخ.",
+       "ok": "اÙ\88Ù\92Ù\84سÙ\88Ù\86",
        "retrievedfrom": "«$1»-دن آلینمیشدیر",
        "youhavenewmessages": "سیزین $1 ($2) وارینیزدیر.",
        "youhavenewmessagesfromusers": "سیزین {{PLURAL:$3|بیر آیری ایستیفاده‌چی‌دن|$3 ایستیفاده‌چی‌دن}} $1 وارینیزدیر ($2).",
-       "youhavenewmessagesmanyusers": "سیزین چوخلو ایشلدنلردن $1 وارینیزدیر ($2).",
+       "youhavenewmessagesmanyusers": "سیزین چوْخلو ایستیفاده‌چیلردن $1 وارینیزدیر ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|بیر یئنی مئساژ|999=یئنی مئساژلار}}",
        "newmessagesdifflinkplural": "سون {{PLURAL:$1|دَییشیکلیک|999=دَییشیکلیکلر}}",
-       "youhavenewmessagesmulti": "$1-دا یئنی بیلدیرینیز وار.",
+       "youhavenewmessagesmulti": "$1-ده یئنی مئساژینیز وار.",
        "editsection": "دَییشدیر",
        "editold": "دَییشدیر",
        "viewsourceold": "قایناغا باخ",
        "toc": "ایچینده‌کیلر",
        "showtoc": "گؤستر",
        "hidetoc": "گیزلت",
-       "collapsible-collapse": "گیزلت",
-       "collapsible-expand": "گئنیشلندیر",
-       "thisisdeleted": "$1-نا باخ یا اونو قایتار؟",
+       "collapsible-collapse": "ییغیشلات",
+       "collapsible-expand": "گئنیشلت",
+       "thisisdeleted": "$1-Ù\86ا Ø¨Ø§Ø® Û\8cا Ø§Ù\88Ù\92Ù\86Ù\88 Ù\82اÛ\8cتارØ\9f",
        "viewdeleted": "$1 گؤستریلسین؟",
-       "restorelink": "{{PLURAL:$1|بیر سیلینمیش دَییشیکلیک|$1 سیلینمیش دَییشیکلیکلر}}",
-       "feedlinks": "بسÙ\84Ù\85Ù\87",
-       "feed-invalid": "گئچرسیز آبونه کانال جورو.",
-       "feed-unavailable": "سیندیکاسیا خطلری ال‌ده دئییل‌لر",
+       "restorelink": "{{PLURAL:$1|بیر|$1}} سیلینمیش دَییشیکلیک",
+       "feedlinks": "بسÙ\84Ù\87â\80\8cÙ\85Ù\87:",
+       "feed-invalid": "گئچرسیز آبونه بسله‌مه جۆرو.",
+       "feed-unavailable": "سیندیکالاشما خطلری ال‌ده دئییل‌لر",
        "site-rss-feed": "$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": "مقاله",
+       "sort-ascending": "چوْخالان سیرالاماق",
+       "nstab-main": "صحیفه",
        "nstab-user": "ایستیفاده‌چی صحیفه‌سی",
        "nstab-media": "مئدیا صحیفه‌سی",
        "nstab-special": "اؤزل صحیفه",
        "nstab-template": "شابلون",
        "nstab-help": "یاردیم صحیفه‌سی",
        "nstab-category": "بؤلمه",
-       "nosuchaction": "بئله چالیشما یوخدور",
-       "nosuchactiontext": "URL-ده گؤستریلن ایش گئچرسیزدیر.\nاولا بیلر کی URL-ی یانلیش یازیب یوخسا یانلیش باغلانتی‌لا گلمیشسینیز.\nهمده بو، {{SITENAME}} سایتی ایشلدن یازیلیمین خطاسینی گؤستره بیلر.",
-       "nosuchspecialpage": "بئله اؤزل یارپاق یوخدور",
-       "nospecialpagetext": "<strong>سیز بیر یانلیش اؤزل یارپاغینی ایسته‌میسینیز.</strong>\nدوزگون اؤزل یارپاق‌لارین سیاهی‌سینی [[Special:SpecialPages|{{int:specialpages}}]]-ده گؤره بیلرسینیز.",
+       "nosuchaction": "بئله چالیشما یوْخدور",
+       "nosuchactiontext": "URL طرفیندن بیلینن ایش گئچرسیزدیر.\nURL-ی یانلیش یازمیش، یا یانلیش بیر باغلانتی ایله گلمیش، اوْلابیلرسیز.\nهم‌ده بۇ، {{SITENAME}} سایتی ایشلدن یازیلیمین خطاسینی گؤستره بیلر.",
+       "nosuchspecialpage": "بئله اؤزل صحیفه یوْخدور",
+       "nospecialpagetext": "<strong>سیز بیر یانلیش اؤزل صحیفه ایسته‌میسینیز.</strong>\n\nدۆزگون اؤزل صحیفه‌لرین لیستینی [[Special:SpecialPages|{{int:specialpages}}]]-ده گؤره بیلرسینیز.",
        "error": "خطا",
-       "databaseerror": "دیتابیس خطاسی",
+       "databaseerror": "دِیتابِیس خطاسی",
        "laggedslavemode": "'''دیقت:''' یارپاق‌دا، سون دَییشیکلیکلرین اولماماسی ایمکانی وار.",
        "readonly": "دیتابیس باغلانیب",
        "enterlockreason": "باغلاما نَدَن‌لیگی و آچیلماغین تخمینی واختینی یازین",
        "readonly_lag": "ایکینجی درجه‌لی دیتابیس خیدمت‌چیلری، آنا دیتابیسه یئتیشماغا گؤره، بو دیتابیس اوتوماتیک باغلانیب‌دیر",
        "internalerror": "ایچ خطاسی",
        "internalerror_info": "ایچ خطاسی: $1",
-       "fileappenderrorread": "اکلَنَنده، «$1»-ی اوخوماق مومکون دئییل‌دیر.",
-       "fileappenderror": "«$1»-ی «$2»-ه اکله‌مک اولانمادی.",
        "filecopyerror": "«$1» فایلی، «$2»-ه کوپی اولانمادی.",
        "filerenameerror": "«$1» فایلین آدی «$2»-نا دَییشدیریلنمه‌دی.",
        "filedeleteerror": "«$1» فایلی سیلیننمه‌دی.",
        "directorycreateerror": "«$1» دایرکتوری‌سی سیلیننمه‌دی.",
        "filenotfound": "«$1» فایلی تاپیلانمادی.",
-       "fileexistserror": "«$1» فایلینا یازیلانمادی: فایل اؤنجه‌دن واردیر.",
        "unexpected": "گؤزلنیلمه‌ین دَیَر: «$1»=«$2»",
        "formerror": "خطا: فورم یوللانانمادی.",
        "badarticleerror": "بو ایشی بو یارپاق اوستون‌ده ائتمک اولماز.",
        "gotaccountlink": "گیریش",
        "userlogin-resetlink": "گیریش بیلگیلرینیزی اونوتموسونوز؟",
        "userlogin-resetpassword-link": "رمزینیزی صیفیرلایین",
-       "createacct-join": "آشاغیدا بیلگیلرینیزی داخیل ائدین.",
        "createacct-emailrequired": "ایمیل آدرسی",
        "createacct-emailoptional": "ایمیل آدرسی (ایستگه باغلی)",
        "createacct-email-ph": "ایمیل آدرسینیزی داخیل ائدین",
        "savearticle": "صحیفه‌نی قئید ائت",
        "preview": "اؤن‌گؤستریش",
        "showpreview": "سیناق گؤستریش",
-       "showlivepreview": "دیری اؤن‌گؤستریش",
        "showdiff": "دَییشیکلیکلری گؤستر",
        "anoneditwarning": "'''دیقت:''' سیز سیستئمه گیرمه‌میسینیز. سیزین آی‌پی آدرسینیز بو صفحه‌نین دییشیک تاریخچه‌سین‌ده یازیلاجاق‌دیر.",
        "anonpreviewwarning": "''سیستمه گیرمه‌میسینیز. قئید ائتمک‌له، سیزین آی‌پی آدرسینیز بو صحیفه‌نین گئچمیشین‌ده ثبت اولوناجاقدیر.''",
        "edit-gone-missing": "صحیفنی یئنی لمک مومکون دئییل.\nچوخ گومان کی، صحیفه سیلینمیش‌دیر.",
        "edit-conflict": "سیزله برابر دییشدیرمه",
        "edit-no-change": "سیزین دییشدیر قئیده آلینمامیش‌دیر. بئله کی، متنده هئچ بیر دییشدیر ائدیلممیش‌دیر.",
-       "postedit-confirmation": "سیزین دَییشدیرمه‌نیز قئید اولونوب‌دور.",
+       "postedit-confirmation-saved": "سیزین دَییشدیرمه‌نیز قئید اولونوب‌دور.",
        "edit-already-exists": "یئنی صحیفنی یاراتماق مومکون دئییل.\nبئله کی، بو آددا صحیفه آرتیق مؤوجوددور.",
        "defaultmessagetext": "دفالت دانیشیق متنی",
        "content-failed-to-parse": "تجزیه محتوای $2  مدل اوچون $1: $3 موفقیت اله گلمه دی",
        "search-nonefound": "سیزین سورونوزا اویغون نتیجه تاپیلمادی.",
        "powersearch-legend": "گلیشمیش آختاریش",
        "powersearch-ns": "آدفضالاریندا آختار",
-       "powersearch-redir": "یوللاندیرمالاری لیست ائت",
        "powersearch-togglelabel": "یوخلا:",
        "powersearch-toggleall": "بوتون",
        "powersearch-togglenone": "هئچ بیری",
        "prefs-emailconfirm-label": "ایمیل دوغرولاماسی:",
        "youremail": "ایمیل:",
        "username": "{{GENDER:$1|ایستیفاده‌چی آدی}}:",
-       "uid": "{{GENDER:$1|ایستیفاده‌چی}} ID:",
        "prefs-memberingroups": "{{PLURAL:$1|بیر|$1}} قروپ {{GENDER:$2|عوضو}}و:",
        "prefs-registration": "یازیلماق واختی:",
        "yourrealname": "دوغرو آد:",
        "prefs-advancedsearchoptions": "گلیشمیش سئچَنکلر",
        "prefs-advancedwatchlist": "گلیشمیش سئچَنکلر",
        "prefs-displayrc": "گؤرونتو سئچَنکلری",
-       "prefs-displaysearchoptions": "گؤرونتو سئچَنکلری",
        "prefs-displaywatchlist": "گؤرونتو سئچَنکلری",
        "prefs-diffs": "فرقلر",
        "email-address-validity-valid": "ایمیل آدرسی، گئچرلی نظره گلیر",
        "action-viewmyprivateinfo": "گیزلی بیلگیلرینی گؤر",
        "action-editmyprivateinfo": "گیزلی بیلگیلرینی دَییشدیر",
        "nchanges": "$1 {{PLURAL:$1|دَییشیکلیک}}",
+       "enhancedrc-history": "گئچمیش",
        "recentchanges": "سون دَییشیکلیکلر",
        "recentchanges-legend": "سون دَییشیکلیکلر سئچمه‌لری",
        "recentchanges-summary": "بو صحیفه‌ده، بو ویکی‌ده وئریلن ان سون دَییشیکلیکلری ایزله‌یین.",
        "recentchanges-label-minor": "بو بیر کیچیک دَییشدیرمه‌دیر",
        "recentchanges-label-bot": "بو دییشیک بیر بوت طرفیندن ائدیلیب‌دیر",
        "recentchanges-label-unpatrolled": "بو دییشیکلیک هله گؤزدن گئچیریلمه‌ییب‌دیر",
+       "recentchanges-legend-heading": "'''ایختیصارلار:'''",
+       "recentchanges-legend-newpage": "(هم‌ده [[Special:NewPages|یئنی صحیفه‌لرین لیستینه]] باخین)",
        "rcnotefrom": "آشاغیدا '''$2'''-دن ('''$1'''-ه قدر) ديَیشیکلیکلر گلیبلر.",
-       "rclistfrom": "$1 واختیندان باشلایاراق یئنی دییشیکلری گؤستر",
+       "rclistfrom": "$3 $2 واختیندان باشلایاراق یئنی دییشیکلری گؤستر",
        "rcshowhideminor": "کیچیک دَییشیکلری $1",
+       "rcshowhideminor-show": "گؤستر",
+       "rcshowhideminor-hide": "گیزلت",
        "rcshowhidebots": "بوتلاری $1",
-       "rcshowhideliu": "ایچری گیرمیش ایستیفاده‌چیلری $1",
+       "rcshowhidebots-show": "گؤستر",
+       "rcshowhidebots-hide": "گیزلت",
+       "rcshowhideliu": "یازیلمیش ایستفاده‌چیلری $1",
+       "rcshowhideliu-show": "گؤستر",
+       "rcshowhideliu-hide": "گیزلت",
        "rcshowhideanons": "تانینمامیش ایستیفاده‌چیلری $1",
+       "rcshowhideanons-show": "گؤستر",
+       "rcshowhideanons-hide": "گیزلت",
        "rcshowhidepatr": "نظارت ائدیلن دَییشیکلیکلری $1",
+       "rcshowhidepatr-show": "گؤستر",
+       "rcshowhidepatr-hide": "گیزلت",
        "rcshowhidemine": "منیم دَییشیکلریمی $1",
+       "rcshowhidemine-show": "گؤستر",
+       "rcshowhidemine-hide": "گیزلت",
        "rclinks": "سون $2 گون عرضینده‌کی سون  $1 ديَیشیکلیگی گؤستر <br />$3",
        "diff": "فرق",
        "hist": "گئچمیش",
        "rc_categories_any": "هر",
        "rc-change-size-new": "دَییشیکلیک‌دن سونرا {{PLURAL:|بیر|$1}} بایت",
        "newsectionsummary": "/* $1 */ یئنی بؤلمه",
-       "rc-enhanced-expand": "تفصیلاتی گؤستر (جاوااسکریپت لازیم‌دیر)",
+       "rc-enhanced-expand": "تفصیل‌لری گؤستر",
        "rc-enhanced-hide": "تفصیل‌لری گیزلت",
        "rc-old-title": "ایلک‌جه «$1» آدی‌له یارانمیشدیر",
        "recentchangeslinked": "ایلگیلی دَییشیکلیکلر",
        "fileexists-shared-forbidden": "بو آددا بیر فايل اورتاق آمباردا مؤوجود دیر. \nفايلینیزی يئنه ده يوکله‌مک ایسته‌يیرسینیزسه، خاهیش ائدیریک گئری گئدیب يئنی بیر آد ایستیفاده ائدین. \n[[File:$1|thumb|center|$1]]",
        "file-exists-duplicate": "بو فایل آشاغی‌داکی {{PLURAL:$1 | فایلین | فایل‌لارین}} تکراری سی‌دیر:",
        "file-deleted-duplicate": "بو فایلین عینی اولان باشقا بیر فایل([[:$1]])داها اول‌دن سیلیندی. بو فای‌لی یئنی‌دن یوکلمه‌دن اول دیگر فایلین سیلینمه‌سی قئیدلرینی ایداره ائتملیسینیز.",
+       "file-deleted-duplicate-notitle": "قاباقجا بۇ فایلا عینی اولان بیر فایل سیلینمیشدیر، و بۇ فایل آدی قاداغان اوْلموشدور.\nاوْنی یئنی‌دن یۆکله‌مک‌دن اؤنجه، قاداغان اوْلونموش فایل‌لارا باخماق ایجازه‌سی اوْلان بیر ایستیفاده‌چی‌دن، وضعیتی گؤزدن گئچیرمگی ایسته‌مه‌لیسینیز.",
        "uploadwarning": "يوکله‌مه خبردارلیغی",
        "uploadwarning-text": "خاهیش ائدیریک آشاغی‌داکی فایل شرحینی دییش‌دیرین و یئنی‌دن جهد ائدین.",
        "savefile": "فايلی قئيد ائت",
        "uploaddisabledtext": "فايل يوکلنمه‌سی باش توتمادی.",
        "php-uploaddisabledtext": "پی اچ پی فایل یوکلملری دؤوره خاریجی‌دیر. خاهیش ائدیریک file_uploads تنظیم لرین یئنی دن بیر باخین.",
        "uploadscripted": "بو فایل بیر اینتئرنئت آختاریش برنامه سی طرفین‌دن سهو چئوریلبیلجک بیر HTML و یا ایسکریپت کودو عبارت‌دیر.",
+       "uploadscriptednamespace": "بۇ SVG فایلیندا بیر یاساق آدفضاسی ($1) واردیر.",
+       "uploadinvalidxml": "یۆکله‌نیلن فایل‌دا XML تحلیل اولونانمادی.",
        "uploadvirus": "فايلدا ویروس وار!  \nدئتاللار: $1",
        "uploadjava": "فایل، بیر جاوا. نوع ‎‎class ائهتیوا ائدن بیر زیپ فایلی‌دیر.\nجاوا فایل‌لارینین یوکلنمه‌سینه ایجازه وئریلمیر، چونکی تهلوکه‌سیزلیک محدودلاشدیرما‌لارینین آتلانماسینا سبب اولا بیلمکده‌دیرلر.",
        "upload-source": "قایناق فايلی",
        "uploadstash-refresh": "فايل سیياهیسینی يئنیله",
        "invalid-chunk-offset": "اعتبارسیز یئربه‌یئر",
        "img-auth-accessdenied": "گیریش قاداغاندیر",
-       "img-auth-nopathinfo": "PATH_INFO یوخدور.\nسئروئرینیز بو معلوماتی کئچیرمک اوچون نیزاملانمامیش. \nسی‌جی‌آی اولا بیلر و img_auth دستکله‌نیلمیر اولا بیلر. \nhttps://www.mediawiki.org/wiki/Manual:Image_Authorization صحیفه‌‌سینه باخین.",
+       "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» آغ سیياهیدا دئيیل.",
        "license-nopreview": "(اؤن‌گؤستریش یوخدور)",
        "upload_source_url": "(بیر گئچرلی و عموم گؤره بیلن اینترنت آدرسی)",
        "upload_source_file": "(بیلگی‌سایارینیزدا بیر فایل)",
-       "listfiles-summary": "بو اؤزل صحیفه، بوتون یوکله‌نیلن فایل‌لاری گؤستریر.\nایستیفاده‌چیه فیلتر اولوناندا، یالنیز او ایستیفاده‌چی سون نوسخه‌لرینی یوکله‌ین فایل‌لار گؤستریلیر.",
+       "listfiles-summary": "بۇ اؤزل صحیفه، بۆتون یۆکله‌نیلن فایل‌لاری گؤستریر.",
        "listfiles_search_for": "مئدیا آدی اوچون آختار:",
        "imgfile": "فایل",
        "listfiles": "فایل لیستی",
        "listfiles_size": "اؤلچو",
        "listfiles_description": "شرح",
        "listfiles_count": "نوسخه‌لر",
+       "listfiles-show-all": "عکسلرین اسکی نۆسخه‌لرینی ایچینه آل.",
+       "listfiles-latestversion": "ایندیکی نۆسخه",
+       "listfiles-latestversion-yes": "بلی",
+       "listfiles-latestversion-no": "یوخ",
        "file-anchor-link": "فایل",
        "filehist": "فايل گئچمیشی",
        "filehist-help": "فايلین اول‌کی وئرسیياسینی گؤرمک اۆچون گۆن/تاریخ بؤلمه‌سینده‌کی تاریخلری تێقلايین.",
        "download": "اندیر",
        "unwatchedpages": "ایزلنمه‌میش صحیفه‌لر",
        "listredirects": "یول‌لاندیرمالارین لیستی",
+       "listduplicatedfiles": "کوْپی‌لری اولان فایل‌لاری لیستی",
+       "listduplicatedfiles-summary": "بۇرا، سوْن نۆسخه‌لری آیری بیر فایلین سوْن نۆسخه‌سی‌نین کوْپی‌سی اوْلان فایل‌لارین لیستیدیر. یالنیز یئرلی فایل‌لار گؤز آلتینا آلینیبلار.",
+       "listduplicatedfiles-entry": "[[:File:$1|$1]]-ین [[$3|{{PLURAL:$2|بیر کوْپی‌سی|$2 کوْپی‌سی}}]] واردیر.",
        "unusedtemplates": "ایشلدیلمه‌میش شابلونلار",
        "unusedtemplatestext": "بو صحیفه بوتون، {{ns:template}} آدفضاسیندا اولان و باشقا صحیفه‌لرده اولمایان صحیفه‌لری لیست ائدیر.\nشابلونلاری سیلمک‌دن اؤنجه، لوطفاً اونلارا اولان باشقا باغلانتیلاری یوخلایین.",
        "unusedtemplateswlh": "باشقا باغلانتیلار",
        "randompage": "راست‌گله صحیفه",
        "randompage-nopages": "بو {{PLURAL:$2|آدفضاسیندا|آدفضالاریندا}} هئچ صحیفه یوخدور: $1.",
+       "randomincategory": "بؤلمه‌ده راست‌گله صحیفه",
+       "randomincategory-invalidcategory": "«$1» بیر گئچرلی بؤلمه آدی دئییل.",
+       "randomincategory-nopages": "[[:Category:$1|$1]] بؤلمه‌سین‌ده، هئچ صحیفه یوخدور.",
+       "randomincategory-selectcategory": "بؤلمه‌دن آلیناجاق راست‌گله صحیفه: $1 $2.",
+       "randomincategory-selectcategory-submit": "گئت",
        "randomredirect": "راست‌گله یول‌لاندیرما",
        "randomredirect-nopages": "«$1» آدفضاسیندا هئچ بیر یول‌لاندیرما یوخدور.",
        "statistics": "آمارلار",
        "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]] Ø¯Û\8cÛ\8cشدÛ\8cرÛ\8cÙ\84Û\8cب.\nحاضردا [[$2]]-Û\8cÙ\87 Ø§Û\8cستÛ\8cÙ\82اÙ\85تÙ\84Ù\86Û\8cب.",
-       "double-redirect-fixed-maintenance": "[[$1]]-دن [[$2]]-یه ایکی‌قات ایستیقامتلنمه دوزلدیلیر.",
+       "double-redirect-fixed-move": "[[$1]] Ø¢Ù¾Ø§Ø±Û\8cÙ\84Ù\85Û\8cØ´â\80\8cدÛ\8cر.\nاÙ\88Ù\92تÙ\88Ù\85اتÛ\8cÚ© Ø§Ù\88Ù\92Ù\84اراÙ\82 Ú¯Û\86Ù\86جÙ\84â\80\8cÙ\84Ù\87â\80\8cÙ\86Û\8cبدÛ\8cر Ù\88 Ø§Û\8cÙ\86دÛ\8c [[$2]]-Ù\87 Û\8cÙ\88Ù\92Ù\84â\80\8cÙ\84اÙ\86دÛ\8cرÛ\8cر.",
+       "double-redirect-fixed-maintenance": "[[$1]]-دن [[$2]]-ه ایکی‌قات یوْل‌لاندیرما، بیر ساخلاما ایشین‌ده، اوْتوماتیک اوْلاراق دۆزلدیلیر.",
        "double-redirect-fixer": "يؤنلندیرمه تعمیرجیسی",
        "brokenredirects": "خطالی ایستیقامتلندیرمه",
        "brokenredirectstext": "آشاغی‌داکی ایستیقامتلندیرمه‌لر مؤوجود اولمایان صحیفه‌لره کئچید وئریر:",
        "ninterwikis": "{{PLURAL:$1|بیر|$1}} ویکی‌آراسی",
        "nlinks": "{{PLURAL:$1|بیر|$1}} باغلانتی",
        "nmembers": "{{PLURAL:$1|بیر|$1}} عوضو",
+       "nmemberschanged": "$1 → $2 {{PLURAL:$2|عۆضو}}",
        "nrevisions": "{{PLURAL:$1|بیر|$1}} نوسخه",
        "nviews": "{{PLURAL:$1|بیر|$1}} گؤرونوش",
        "nimagelinks": "$1 ده{{PLURAL:$1|صحیفه‌ده}}ایستیفاده اولونمور",
        "mostrevisions": "ان چوخ نظردن کئچیریلمیش (وئرسیا‌لی) مقاله‌لر",
        "prefixindex": "بوتون اؤن‌اَکلی صحیفه‌لر",
        "prefixindex-namespace": "بوتون صفحه لر (آد فضاسی$1) قاباق دان یاپیشیقی وار",
+       "prefixindex-strip": "لیست‌ده، اؤن‌اَکی قوْپارت",
        "shortpages": "قیسا صحیفه‌‌لر",
        "longpages": "اوزون صحیفه‌‌لر",
        "deadendpages": "کئچید وئرمه‌ين صحیفه‌‌لر",
        "deadendpagestext": "آشاغیداکی صحیفه‌‌لردن بو ویکیپئدیياداکی دیگر صحیفه‌‌لره هئچ بیر کئچید يوخدور.",
        "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": "يئنی صحیفه‌‌‌لر",
        "log-title-wildcard": "بو متنله باشلایان باش‌لیق‌لاری آختار",
        "showhideselectedlogentries": "گؤستریش/گیزلمه سییاهه ده سئچیلمیش‌لر اوچون",
        "allpages": "بوتون صحیفه‌لر",
-       "alphaindexline": "$1-دن $2-یه",
        "nextpage": "سونراکی صحیفه‌‌ ($1)",
        "prevpage": "اولکی صحیفه ($1)",
        "allpagesfrom": "بو حرفله باشلایان صحیفه‌لری گؤستر:",
        "activeusers-noresult": "هئچ ایستیفاده‌چی تاپیلمادی.",
        "listgrouprights": "ایستیفاده‌چی قروپ حاقلاری",
        "listgrouprights-summary": "آشاغیدا، بو ویکی‌ده تانیلان ایستیفاده‌چی گروپلاری و اونلارین حاقلاری گؤستریلیر.\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-msg": "ایزله‌مک بؤلومو",
+       "trackingcategories-name": "مئساژ آدی",
+       "trackingcategories-desc": "بؤلمه ایچری آلماق معیارلاری",
        "mailnologin": "گؤندرمه آدرسی یوخدور",
        "mailnologintext": "باشقا ایستیفاده‌چیلره ایمیل گؤندرک اوچون، [[Special:UserLogin|گیریش]] ائدیب و [[Special:Preferences|ترجیحلر]]ینیزده گئچرلی ایمیل آدرسی وئرمه‌لیسینیز.",
        "emailuser": "بو ایستیفاده‌چی‌یه ایمیل گؤندر",
        "watchlist-details": "دانیشیق صفحه‌لرینی سایمایاراق، {{PLURAL:$1|$1 صفحه‌نی}} ایزله‌ییرسینیز.",
        "wlheader-enotif": "ایمیل ایله بیلدیریش آچیلیب‌دیر.",
        "wlheader-showupdated": "سون گؤروشونوزدن سونرا ائدیلن دییشیکلیکلر '''قالین''' گؤستریلیبدیلر.",
-       "watchmethod-recent": "یئنی دییشیک‌لیک‌لر ایزلنیلن صحیفه‌لر اوچون یوخلانیلیر",
-       "watchmethod-list": "ایزلنیلن صحیفه‌لر یئنی دییشیک‌لیک‌لر اوچون یوخلانیلیر",
-       "watchlistcontains": "ایزلمه سیاهینیزدا $1 {{PLURAL:$1|صحیفه}} وار.",
-       "iteminvalidname": "'$1 ایله باغ‌لی پروبلئم، آدی دوزگون دئییل...",
        "wlshowlast": "سون $1 ساعات $2 گون گؤستر $3",
        "watchlist-options": "ایزله‌دیکلر سئچمه‌لری",
        "watching": "ایزله‌نیلیر...",
        "enotif_lastvisited": "سونونجو زیارتینیزدن ایندیدک اولان بوتون دییشیک‌لیک‌لری گؤرمک اوچون باخین: $1.",
        "enotif_lastdiff": "بو دییشیک‌لیگی گؤرمک اوچون $1 صحیفه‌سینه باخین.",
        "enotif_anon_editor": "قئیدیات‌سیز ایستیفاده‌چی $1",
-       "enotif_body": "حؤرمتلی $WATCHINGUSERNAME,\n\n{{SITENAME}} وئب-سايتینداکی $PAGETITLE آدلی صحیفه‌‌ $PAGETITLE تاریخینده $PAGEEDITOR طرفیندن $CHANGEDORCREATED. صحیفه‌‌نین سونونجو وئرسیياسینا باخماق اوچون $PAGETITLE_URL کئچیدیندن ایستیفاده ائدین. \n\n$نئwپاگئ \n\nديَیشیکلیگی ائدن ایستیفاده‌چی‌نین ایضاهی: $PAGESUMMARY $PAGEMINOREDIT\n\nصحیفه‌‌نی ديَیشدیرن ایستیفاده‌چی‌نین علاقه‌‌ معلوماتلاری: \nائ-پوچت:$PAGEEDITOR_EMAIL\nویکی:$PAGEEDITOR_WIKI\n\nسیز حاقیندا صؤحبت گئدن صحیفه‌‌يه باخانادک صحیفه‌‌دکی دیگر ديَیشیکلیکلرله باغلی باشقا بیلدیریش مکتوبو آلماياجاقسینیز. سیز همچی‌نین، ایزله‌مه سیياهینیزداکی بوتون صحیفه‌‌لرله باغلی بیلدیریش معلوماتلارینی سیله بیلرسینیز. \n\n               {{SITENAME}} سايتی‌نین خبردارلیق سیستمی. \n\n-- \nایزله‌مه سیياهیسی‌نین تنزیمله‌مه‌لرینی ديَیشمک اوچون: \n{{canonicalurl:Special:Watchlist/edit}}\n\nياردیم و تکلیفلرینیز اوچون: \n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "حؤرمتلی $WATCHINGUSERNAME,\n\n{{SITENAME}} وئب-سايتینداکی $PAGETITLE آدلی صحیفه‌‌ $PAGETITLE تاریخینده $PAGEEDITOR طرفیندن $CHANGEDORCREATED. صحیفه‌‌نین سونونجو وئرسیياسینا باخماق اوچون $PAGETITLE_URL کئچیدیندن ایستیفاده ائدین. \n\n$نئwپاگئ \n\nديَیشیکلیگی ائدن ایستیفاده‌چی‌نین ایضاهی: $PAGESUMMARY $PAGEMINOREDIT\n\nصحیفه‌‌نی ديَیشدیرن ایستیفاده‌چی‌نین علاقه‌‌ معلوماتلاری: \nائ-پوچت:$PAGEEDITOR_EMAIL\nویکی:$PAGEEDITOR_WIKI\n\nسیز حاقیندا صؤحبت گئدن صحیفه‌‌يه باخانادک صحیفه‌‌دکی دیگر ديَیشیکلیکلرله باغلی باشقا بیلدیریش مکتوبو آلماياجاقسینیز. سیز همچی‌نین، ایزله‌مه سیياهینیزداکی بوتون صحیفه‌‌لرله باغلی بیلدیریش معلوماتلارینی سیله بیلرسینیز. \n\n               {{SITENAME}} سايتی‌نین خبردارلیق سیستمی. \n\n-- \nایزله‌مه سیياهیسی‌نین تنزیمله‌مه‌لرینی ديَیشمک اوچون: \n{{canonicalurl:Special:Watchlist/edit}}\n\nياردیم و تکلیفلرینیز اوچون: \n$HELPPAGE",
        "created": "یارادیلیب",
        "changed": "ديَیشدی",
        "deletepage": "صحیفه‌‌نی سیل",
        "blockip": "ایستیفاده چی نی باغلا",
        "blockip-legend": "ایستیفادچی نی باغلا",
        "blockiptext": "آشاغی‌داکی فورمو ایستیفاده ائده‌رک مویین بیر ایپنین و یا قئیدیات‌دان کئچمیش ایستیفاده‌چی‌نین دییشیک‌لیک ائتمه‌سینی مانعه تؤره‌ده بیلرسینیز. بو یالنیز واندالیزمی قارشی‌سینی آلماق اوچون و [[{{MediaWiki:Policy-url}}|قایدا‌لارا]] اویغون اولا‌راق ائدیلمه‌لی. آشاغییا موتلق قاداغا ایله علاقه‌دار بیر شرح یازین. (نومونه:-بو-صحیفه‌لرده واندالیزم ائتمیش‌دیر).",
-       "ipadressorusername": "آی-پی عونوانی و یا ایستیفاده‌چی آدی",
+       "ipaddressorusername": "آی-پی عونوانی و یا ایستیفاده‌چی آدی",
        "ipbexpiry": "بیتمه مدتی:",
        "ipbreason": "ندن:",
        "ipbreason-dropdown": "*باغلانما سبب‌لری:\n** یالان معلومات‌لارین علاوه ائدیلمه‌سی\n** صحیفه‌نین مزمونونون سیلینمه‌سی\n** خاریجی سایت‌لارا ایسپام-کئچیدلر\n** صحیفه‌یه معنا‌سیز و یارارسیز علاوه‌لره گؤره\n** حده و تعقیب‌لره گؤره\n** تحقیره گؤره\n** چوخسای‌لی حساب‌دان سوی ایستیفاده‌یه گؤره\n** قاداغان اولونموش ایستیفاده‌چی آدینا گؤره",
        "allmessages-prefix": "اؤنک ایله فیلترلی:",
        "allmessages-language": "دیل:",
        "allmessages-filter-submit": "گئت",
+       "allmessages-filter-translate": "چئویر",
        "thumbnail-more": "بؤیوت",
        "filemissing": "فایل تاپیلمادی",
        "thumbnail_error": "کیچیک شکیل یاراتما خطاسی: $1",
        "tooltip-undo": "ائدیلمیش ديَیشیکلیگی گئری قايتار و گئری قايتارما سببینی قئيد ائتمک اۆچون سێناق گؤستریشینی آچ",
        "tooltip-preferences-save": "ترجیحلری ساخلا",
        "tooltip-summary": "قیسا بیر خولاصه‌‌ یازین",
-       "notacceptable": "ویکی-سئروئر معلومات‌لاری براوزئرینیزین اوخویا بیلجیی فورماتدا تقدیم ائده بیلمیر.",
        "anonymous": "{{SITENAME}} سایتینین آنونیم {{PLURAL:$1|یستیفادچیسی|یستیفاده‌چی‌لری}}",
        "siteuser": "{{SITENAME}} ایستیفاده‌چی‌سی $1",
        "anonuser": "{{SITENAME}} آنونیم ایستیفاده‌چی‌سی $1",
        "newimages-summary": "بو خصوصی صحیفه، ان سون یوک‌لنن فایل‌لاری گؤستریر.",
        "newimages-legend": "سۆزگَج",
        "newimages-label": "فایلین (و یا اونون بیر حیسه‌سی‌نین) آدی:",
-       "showhidebots": "($1 روبات دییشدیر)",
        "noimages": "هئچ نیی گؤرممک.",
        "ilsubmit": "آختار",
        "bydate": "تاریخین اوستوندن",
        "imgmultipagenext": "سونراکی صحیفه‌‌ &rarr;",
        "imgmultigo": "گئت!",
        "imgmultigoto": "$1 صحیفه‌‌يه گئت",
+       "img-lang-default": "(وارساییلان دیل)",
+       "img-lang-go": "گئت",
        "ascending_abbrev": "آرتما سیراسینا گؤره",
        "descending_abbrev": "آزالما سیراسینا گؤره",
        "table_pager_next": "سونراکی صحیفه",
        "autosumm-replace": "صحیفه‌‌نین مظمونو ' $1' يازیسی ایله ديَیشدیریلدی",
        "autoredircomment": "[[$1]] صحیفه‌‌سینه ایستیقامتلندیریلیر",
        "autosumm-new": "صحیفه‌‌نی ' $1' ایله يارات",
-       "livepreview-loading": "یوکلنیر...",
-       "livepreview-ready": "گؤزله... حاضردیر!",
-       "livepreview-failed": "جانلی اؤنیزلئمئ موفقیتسیز! نورمال سینیق گوستریشی کولانین.",
-       "livepreview-error": "علاقه‌‌ موفقیتسیز:$1 \"$2\". \nنورمال سینیق گوستریشی کولانین.",
        "lag-warn-normal": "$1 {{PLURAL:$1 | سانیيه‌دن | سانیيه‌ده}} يئنی ديَیشیکلیکلر بو سیياهیدا گؤرولمه‌يه.",
        "lag-warn-high": "وئریلنلر بازاسی سونوجوسونداکی هددیندن آرتیق گئجیکمه‌دن گؤره، $1 {{PLURAL:$1 | سانیيه‌دن | سانیيه‌دن}} يئنی ديَیشیکلیکلر بو سیياهیدا گؤرونمئيئبیلیر.",
-       "watchlistedit-numitems": "ایزلئمئ صحیفه‌‌نیزده {{PLURAL:$1|1 باشلیق|$1 باشلیق}} وار، دانیشیق صحیفه‌‌لری چیخماق شرطیله.",
-       "watchlistedit-noitems": "ایزله‌مه سیياهینیز بوشدور.",
        "watchlistedit-normal-title": "ایزله‌دیگیم صحیفه‌‌لری دَییشدیر",
        "watchlistedit-normal-legend": "ایزله‌مه سیياهیسیندان باشلیقلارین سیلینمه‌سی",
        "watchlistedit-normal-explain": "ایزله‌مه سیياهینیزدا باشلیقلار آشاغیدا گؤستریلمیشدیر. \nبیر باشلیغی چیخارماق اوچون، يانینداکی قوتوجوغو ایشارله‌يین و «{{int:Watchlistedit-normal-submit}}» دويمه‌سینی باسین. \n[[Special:EditWatchlist/raw|سطرلر سیياهیسینی]] ده تشکیل ائده بیلرسینیز",
        "version-hook-name": "چنگه‌لین آدی",
        "version-hook-subscribedby": "طرفیندن گیریش‌‌میش",
        "version-version": "(نسخه $1)",
-       "version-license": "لیسانس",
+       "version-license": "مِدیاویکی لیسانسی",
+       "version-ext-license": "لیسانس",
        "version-poweredby-credits": "بو wیکی ' ''[https://www.mediawiki.org/ مئدیاwیکی]'ع' پروقرامی ایستیفاده ائدیله‌رک يارادیلمیشدیر، یاازارلار © 2001-$1 $2.",
        "version-poweredby-others": "آیریلار",
        "version-credits-summary": "بو ایستفاده چیلر دییشدیر لرینه گوره [[Special:Version|مئدیاویکی]] تانیش ائدیرم.",
        "tags-tag": "یاپیشقان آدی",
        "tags-display-header": "ديَیشیکلیک لیستئلئریندئکی گؤرونوش",
        "tags-description-header": "آنلامینین تام آچیقلاماسی",
+       "tags-active-header": "چالیشقلان؟",
        "tags-hitcount-header": "یاپیشقانلی دییشیک‌لیک‌لر",
+       "tags-active-yes": "بلی",
+       "tags-active-no": "یوْخ",
        "tags-edit": "دَییشدیر",
        "tags-hitcount": "$1 {{PLURAL:$1|دییشیکلیک|دییشیک‌لیک}}",
        "comparepages": "صحیفه‌لری قارشی‌لاش‌دیر",
        "compare-invalid-title": "وئردیگینیز باشلیق گئچرسیزدیر.",
        "compare-title-not-exists": "وئردیگینیز باشلیق یوخدور.",
        "compare-revision-not-exists": "بَلیرتدیگینیز نوسخه یوخدور.",
-       "dberr-header": "بو ویکی‌ده بیر ایشکال وار",
        "dberr-problems": "عوذر ایسته‌ییریک! بو سایت‌دا تِکنیکی ایشکال‌لار واردیر.",
        "dberr-again": "بیر نئچه دقیقه دؤزوب سونرا یئنی‌دن یوکله‌یین.",
        "dberr-info": "(دیتابیس خیدمت‌چیسی‌یه باغلانماق اولونمادی: $1)",
        "duration-decades": "{{PLURAL:$1|بیر|$1}} اون‌ایل",
        "duration-centuries": "{{PLURAL:$1|بیر|$1}} یوز-ایل",
        "duration-millennia": "{{PLURAL:$1|بیر|$1}} مین‌ایل",
-       "rotate-comment": "عکس $1 {{PLURAL:$1|درجه}} ساعات عقربه‌لری ایستیقامتینده فیرلاندیریلب‌دیر"
+       "rotate-comment": "عکس $1 {{PLURAL:$1|درجه}} ساعات عقربه‌لری ایستیقامتینده فیرلاندیریلب‌دیر",
+       "expand_templates_generate_rawhtml": "چیی اچ‌تی‌ام‌ال گؤستر",
+       "expand_templates_preview": "اؤن‌گؤستریش"
 }
index cb383d7..65c22ab 100644 (file)
@@ -14,7 +14,8 @@
                        "Timming",
                        "Рустам Нурыев",
                        "ҒатаУлла",
-                       "Ҡамыр Батыр"
+                       "Ҡамыр Батыр",
+                       "아라"
                ]
        },
        "tog-underline": "Һылтанмалар аҫтына һыҙыу:",
@@ -27,7 +28,6 @@
        "tog-showtoolbar": "Мөхәррирләгән ваҡытта өҫкө ҡоралдар панелен күрһәтергә (JavaScript кәрәк)",
        "tog-editondblclick": "Биттәрҙе ике сиртеү менән мөхәррирләргә",
        "tog-editsectiononrightclick": "Бүлектәрҙе исемдәренә төрткөнөң уң яғына сиртеп үҙгәртергә",
-       "tog-rememberpassword": "Был браузерҙа (иң күбендә $1 {{PLURAL:$1|көнгә}}) иҫәп яҙыуым хәтерләнһен",
        "tog-watchcreations": "Мин төҙөгән биттәрҙе һәм күсергән файлдарҙы күҙәтеү исемлегенә өҫтәргә",
        "tog-watchdefault": "Мин үҙгәрткән биттәр һәм файлдар аңлатмаһын күҙәтеү исемлегенә өҫтәргә",
        "tog-watchmoves": "Мин исемен үҙгәрткән биттәрҙе һәм файлдарҙы күҙәтеү исемлегенә өҫтәргә",
        "readonly_lag": "Өҫтәмә сервер төп сервер менән синхронлашҡанға тиклем мәғлүмәттәр базаһы автоматик рәүештә үҙгәрештәргә ҡаршы ябылған.",
        "internalerror": "Эске хата",
        "internalerror_info": "Эске хата: $1",
-       "fileappenderrorread": "Өҫтәү ваҡытында «$1» файлын уҡып булманы.",
-       "fileappenderror": "\"$1\"ҙе \"$2\"гә ҡушып булманы.",
        "filecopyerror": "«$2» файлына «$1» файлының күсермәһен яһап булмай.",
        "filerenameerror": "«$1» файлының исемен «$2» исеменә алмаштырып булмай.",
        "filedeleteerror": "«$1» файлын юйып булмай.",
        "directorycreateerror": "«$1» директорияһын яһап булмай.",
        "filenotfound": "«$1» файлын табып булмай.",
-       "fileexistserror": "«$1» файлына яҙып булмай: файл былай ҙа бар.",
        "unexpected": "Көтөлмәгән ҡиммәт: «$1»=«$2».",
        "formerror": "Хата: форма мәғлүмәттәрен ебәреп булмай",
        "badarticleerror": "Был биттә ундай ғәмәл үтәргә ярамай",
        "userlogin-resetpassword-link": "Серһүҙҙе ҡабул итмәү",
        "userlogin-loggedin": " Һеҙ {{GENDER:$1|$1}} булараҡ индегеҙ инде. Башҡа файҙаланыусы булып инер өсөн аҫтағы ҡалыпты ҡулланығыҙ.",
        "userlogin-createanother": "Башҡа иҫәп яҙмаһын булдырырға",
-       "createacct-join": "Аҫта мәғлүмәттәрегеҙҙе яҙығыҙ.",
-       "createacct-another-join": "Аҫта яңы иҫәп яҙмағыҙҙың мәғлүмәттәрен яҙығыҙ.",
        "createacct-emailrequired": "Электрон почта адресы",
        "createacct-emailoptional": "Электрон почта адресы (мотлаҡ түгел)",
        "createacct-email-ph": "Электрон почта адресығыҙҙы яҙығыҙ",
        "savearticle": "Яҙҙырып ҡуйырға",
        "preview": "Ҡарап сығыу",
        "showpreview": "Ҡарап сығырға",
-       "showlivepreview": "Тиҙ алдан байҡау",
        "showdiff": "Индерелгән үҙгәрештәр",
        "anoneditwarning": "'''Иғтибар''': Һеҙ танылмағанһығыҙ. IP-адресығыҙ был биттең үҙгәртеүҙәр тарихына яҙыласаҡ.",
        "anonpreviewwarning": "''Һеҙ танылмағанһығыҙ. Яҙҙырыу ваҡытында IP-адресығыҙ был биттең үҙгәртеүҙәр тарихына яҙыласаҡ.''",
        "edit-gone-missing": "Битте яңыртып булмай.\nБәлки ул юйылғандыр.",
        "edit-conflict": "Төҙәтеүҙәр конфликты",
        "edit-no-change": "Текста үҙгәртеүҙер булмау сәбәпле үҙгәртеүегеҙгә иғтибар ителмәне.",
-       "postedit-confirmation": "Үҙгәртеүегеҙ һаҡланды.",
+       "postedit-confirmation-saved": "Үҙгәртеүегеҙ һаҡланды.",
        "edit-already-exists": "Яңы бит яһап булмай.\nУл былай ҙа бар.",
        "defaultmessagetext": "Алдан билдәләнгән яҙма",
        "content-failed-to-parse": "$2 эстәлеге $1 төрөнә тура килмәй: $3.",
        "search-nonefound": "Был һорауға яуап биреүсе һөҙөмтәләр табылманы.",
        "powersearch-legend": "Киңәйтелгән эҙләү",
        "powersearch-ns": "Исем аралыҡтарында эҙләү:",
-       "powersearch-redir": "Йүнәлтеүҙәрҙе күрһәтергә",
        "powersearch-togglelabel": "Һайла:",
        "powersearch-toggleall": "Барыһы",
        "powersearch-togglenone": "Һис бере",
        "prefs-advancedsearchoptions": "Киңәйтелгән көйләүҙәр",
        "prefs-advancedwatchlist": "Киңәйтелгән көйләүҙәр",
        "prefs-displayrc": "Күренеш көйләүҙәре",
-       "prefs-displaysearchoptions": "Күренеш көйләүҙәре",
        "prefs-displaywatchlist": "Күренеш көйләүҙәре",
        "prefs-diffs": "Айырмалар",
        "prefs-help-prefershttps": "Был көйләү системаға киләһе танылыуҙан һуң ҡулланыласаҡ.",
        "recentchanges-label-unpatrolled": "Был төҙәтеү ҡаралмаған әле",
        "recentchanges-legend-newpage": "$1 — яңы бит",
        "rcnotefrom": "Түбәндә '''$2''' башлап ('''$1''' тиклем) үҙгәртеүҙәр күрһәтелгән.",
-       "rclistfrom": "$1 башлап яңы үҙгәртеүҙәрҙе күрһәт.",
+       "rclistfrom": "$3 $2 башлап яңы үҙгәртеүҙәрҙе күрһәт.",
        "rcshowhideminor": "бәләкәй төҙәтеүҙәрҙе $1",
        "rcshowhidebots": "боттарҙы $1",
        "rcshowhideliu": "танылған ҡулланыусыларҙы $1",
        "uploadstash-refresh": "Файлдар исемлеген яңыртырға",
        "invalid-chunk-offset": "Ҡабул ителмәгән фрагмент шылыуы",
        "img-auth-accessdenied": "Керергә рөхсәт ителмәй",
-       "img-auth-nopathinfo": "PATH_INFO юҡ.\nҺеҙҙең сервер был мәғлүмәтте ебәреү өсөн көйләнмәгән.\nУның CGI нигеҙендә эшләүе һәм img_auth ҡулланмауы мөмкин.\nТулыраҡ мәғлүмәт: https://www.mediawiki.org/wiki/Manual:Image_Authorization",
+       "img-auth-nopathinfo": "PATH_INFO юҡ.\nҺеҙҙең сервер был мәғлүмәтте ебәреү өсөн көйләнмәгән.\nУның CGI нигеҙендә эшләүе һәм img_auth ҡулланмауы мөмкин.\nТулыраҡ мәғлүмәт: https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization",
        "img-auth-notindir": "Һоралған юл көйләнгән тейәүҙәр директорияһына ҡарамай.",
        "img-auth-badtitle": "\"$1\" исеменән дөрөҫ исем төҙөп булмай.",
        "img-auth-nologinnWL": "Һеҙ танылыу үтмәнегеҙ, \"$1\" аҡ исемлеккә кермәй.",
        "watchlist-details": "Һеҙҙең күҙәтеү исемлегегеҙҙә, фекерләшеү биттәрен һанамағанда, {{PLURAL:$1|$1 бит}} бар.",
        "wlheader-enotif": "Электрон почта аша белдереү индерелгән.",
        "wlheader-showupdated": "Һеҙҙең аҙаҡҡы кереүегеҙҙән һуң үҙгәргән биттәр '''ҡалын''' шрифт менән күрһәтелгән.",
-       "watchmethod-recent": "күҙәтелгән биттәр өсөн аҙаҡҡы үҙгәртеүҙәрҙе ҡарау",
-       "watchmethod-list": "аҙаҡҡы үҙгәртеүҙәр өсөн күҙәтелгән биттәрҙе ҡарау",
-       "watchlistcontains": "Һеҙҙең күҙәтеү исемлегендә $1 {{PLURAL:$1|1=бит|бит}}бар.",
-       "iteminvalidname": "«$1» менән ҡыйынлыҡтар, исеме дөрөҫ түгел...",
        "wlshowlast": "Һуңғы $1 сәғәт $2 көн өсөн күрһәт $3",
        "watchlist-options": "Күҙәтеү исемлеге көйләүҙәре",
        "watching": "Күҙәтеү исемлегенә өҫтәү...",
        "enotif_lastvisited": "Һеҙҙең аҙаҡҡы кереүегеҙҙән һуңғы үҙгәртеүҙәрҙе ҡарау өсөн, $1 ҡарағыҙ.",
        "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\n{{SITENAME}}  проектының белдереү системаһы\n\n--\nЭлектрон почта белдереүҙәрен көйләү өсөн:\n{{canonicalurl:{{#special:Preferences}}}}\n\nКүҙәтеү исемлеге көйләүҙәрен үҙгәртер өсөн:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nБитте һеҙҙең күҙәтеү исемлегенән юйыр өсөн:\n$UNWATCHURL\n\nКире бәйләнеш һәм ярҙам:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Хөрмәтле $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nМөхәррирләү аңлатмаһы: $PAGESUMMARY $PAGEMINOREDIT\n\nҮҙгәртеүсе менән бәйләнеш өсөн:\nЭл. почта адресы: $PAGEEDITOR_EMAIL\nВики бите: $PAGEEDITOR_WIKI\n\nӘгәр һеҙ был битте ҡарамаһағыҙ, бынан һуң буласаҡ үҙгәртеүҙәр тураһында белдереү алмаясаҡһығыҙ. \nҺеҙ шулай уҡ күҙәтеү исемлегегеҙҙәге бар биттәр өсөн белдереү көйләүен һүндерә алаһығыҙ.\n\n{{SITENAME}}  проектының белдереү системаһы\n\n--\nЭлектрон почта белдереүҙәрен көйләү өсөн:\n{{canonicalurl:{{#special:Preferences}}}}\n\nКүҙәтеү исемлеге көйләүҙәрен үҙгәртер өсөн:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nБитте һеҙҙең күҙәтеү исемлегенән юйыр өсөн:\n$UNWATCHURL\n\nКире бәйләнеш һәм ярҙам:\n$HELPPAGE",
        "created": "булдырылды",
        "changed": "үҙгәртелгән",
        "deletepage": "Битте юйырға",
        "blockip": "Ҡатнашыусыны бикләү",
        "blockip-legend": "Ҡатнашыусыны бикләү",
        "blockiptext": "Билдәләнгән IP адрестан яҙыу мөмкинлеген бикләү өсөн, түбәндәге форманы ҡулланығыҙ.\nБыл бары тик вандаллыҡҡа юл ҡуймау өсөн генә һәм [[{{MediaWiki:Policy-url}}|ҡағиҙәләр]] буйынса ғына эшләнергә тейеш.\nТүбәндә бикләү сәбәбен күрһәтегеҙ (мәҫәлән, вандаллыҡ эҙҙәре булған бер нисә биттең цитатаһын килтерегеҙ).",
-       "ipadressorusername": "Ҡатнашыусының IP-адресы йәки исеме:",
+       "ipaddressorusername": "Ҡатнашыусының IP-адресы йәки исеме:",
        "ipbexpiry": "Тамамлана:",
        "ipbreason": "Сәбәп:",
        "ipbreason-dropdown": "*Ғәҙәттәге бикләү сәбәптәре \n** Ялған мәғлүмәт өҫтәү\n** Биттәрҙең эстәлеген юйыу\n** Тышҡы сайттарға һылтанмалар спамлау\n** Биттәргә мәғәнәһеҙ яҙмалар (ҡый) өҫтәү \n** Ҡатнашыусыларға янау (эҙәрлекләү)\n** Бер нисә иҫәп яҙмаларын артығы менән булдырыу\n** Килешһеҙ иҫәп яҙмаһы",
        "tooltip-undo": "\"Кире ал\" төҙәтеүҙе кире ала һәм төҙәтеү формаһын \"алдан байҡау\"ҙа күрһәтә. Һәм кире алыуҙың сәбәбен белдерергә була.",
        "tooltip-preferences-save": "Көйләүҙәрҙе һаҡларға",
        "tooltip-summary": "Ҡыҫҡаса тасуирлама керетегеҙ",
-       "notacceptable": "Вики-сервер мәғлүмәтте һеҙҙең браузер уҡый алырлыҡ форматта ҡайтара алмай.<br />\nThe wiki server cannot provide data in a format your client can read.",
        "anonymous": "{{SITENAME}} проектының танылмаған {{PLURAL:$1|1=ҡатнашыусыһы|ҡатнашыусылары}}",
        "siteuser": "{{SITENAME}} проектының ҡатнашыусыһы $1",
        "anonuser": "{{SITENAME}} проектының танылмаған ҡатнашыусыһы $1",
        "newimages-summary": "Был махсус бит һуңғы тейәлгән файлдарҙы күрһәтә.",
        "newimages-legend": "Һайлау",
        "newimages-label": "Файл исеме (йәки өлөшө):",
-       "showhidebots": "(боттарҙы $1)",
        "noimages": "Рәсемдәр юҡ.",
        "ilsubmit": "Эҙләү",
        "bydate": "булдырыу көнө буйынса",
        "autosumm-replace": "Биттең эстәлеге \"$1\" менән алыштырылған",
        "autoredircomment": "[[$1]] битенә йүнәлтелгән",
        "autosumm-new": "\"$1\" исемле яңы бит булдырылған",
-       "livepreview-loading": "Сығарыу...",
-       "livepreview-ready": "Сығарыу... Әҙер!",
-       "livepreview-failed": "Тиҙ ҡарап сығыу ваҡытында хата килеп сыҡты.\nҒәҙәти ҡарап сығыуҙы ҡулланып ҡарағыҙ.",
-       "livepreview-error": "Бәйләнеш булдырып булманы: $1 \"$2\".\nҒәҙәти ҡарап сығыуҙы ҡулланып ҡарағыҙ.",
        "lag-warn-normal": "$1 {{PLURAL:$1|секундтан}} кәмерәк ваҡыт элек эшләнгән үҙгәртеүҙәр был исемлектә күрһәтелә алмай.",
        "lag-warn-high": "Мәғлүмәттәр базаларын синхронлаштырыуҙың күпкә артта ҡалыуы сәбәпле, $1 {{PLURAL:$1|секундтан}} кәмерәк ваҡыт элек эшләнгән үҙгәртеүҙәр был исемлектә күрһәтелә алмай.",
-       "watchlistedit-numitems": "Һеҙҙең күҙәтеү исемлегегеҙҙә фекер алышыу биттәрен иҫәпләмәгәндә - {{PLURAL:$1|1=$1 бит|$1 бит}} бар.",
-       "watchlistedit-noitems": "Һеҙҙең күҙәтеү исемлегегеҙҙә бер бит тә юҡ.",
        "watchlistedit-normal-title": "Күҙәтеү исемлеген мөхәррирләү",
        "watchlistedit-normal-legend": "Күҙәтеү исемлегенән биттәрҙе юйыу",
        "watchlistedit-normal-explain": "Түбәндә һеҙҙең күҙәтеү исемлегендә булған биттәр күрһәтелгән.\nБиттәрҙе юйыу өсөн, кәрәкле юлдарҙы һайлағыҙ һәм «{{int:Watchlistedit-normal-submit}}» төймәһенә баҫығыҙ.\nҺеҙ шулай уҡ [[Special:EditWatchlist/raw|исемлекте текст рәүешендә үҙгәртә]] алаһығыҙ.",
        "compare-invalid-title": "Керетелгән исем дөрөҫ түгел.",
        "compare-title-not-exists": "Һеҙ күрһәткән исем юҡ.",
        "compare-revision-not-exists": "Һеҙ күрһәткән версия юҡ.",
-       "dberr-header": "Был вики проектта ҡыйынлыҡтар бар",
        "dberr-problems": "Ғәфү итегеҙ! Был сайтта техник ҡыйынлыҡтар тыуҙы.",
        "dberr-again": "Битте бер нисә минуттан яңыртып ҡарағыҙ.",
        "dberr-info": "(Мәғлүмәттәр базаһы серверы менән тоташтырылып булмай: $1)",
index 953ccec..bbe10e3 100644 (file)
@@ -12,7 +12,9 @@
                        "The Evil IP address",
                        "Wikifan",
                        "bar.wikipedia.org administrators",
-                       "✓"
+                       "✓",
+                       "아라",
+                       "Matthias Klostermayr"
                ]
        },
        "tog-underline": "Links unterstreichen:",
@@ -25,7 +27,6 @@
        "tog-showtoolbar": "Beorweiten-Werkzeigleisten åzoang (JavaScript werd braucht)",
        "tog-editondblclick": "Seiten mid am Dóppedrucker beorweiden (JavaScript werd braucht)",
        "tog-editsectiononrightclick": "Oahzelne Obschnitt mid am Rechtsdrucker beorweiten (JavaScript werd braucht)",
-       "tog-rememberpassword": "Mim Browser dauerhoft ågmödt bleim (maximaal $1 {{PLURAL:$1|Toog|Toog}})",
        "tog-watchcreations": "Voh mir söwer eihgstöde Seiten autómaatisch beówochten",
        "tog-watchdefault": "Voh mir söwer gänderde Seiten autómaatisch beówochten",
        "tog-watchmoves": "Voh mir söwer vaschówerne Seiten autómaatisch beówochten",
@@ -61,7 +62,7 @@
        "editfont-monospace": "Schrift mid ner festen Zeichenbreaden",
        "editfont-sansserif": "Serifenlose Groteskschrift",
        "editfont-serif": "Schrift mid Serifen",
-       "sunday": "Sundog",
+       "sunday": "Sunda",
        "monday": "Mondog",
        "tuesday": "Deansdog",
        "wednesday": "Midwoch",
        "readonly_lag": "De Daatenbånk is automaatisch fyr Schraibzuagriff gsperrt, damid se d' vatailten Daatenbånkserver (slaves) mim Hauptdaatenbånkserver (master) obglaichen kennan.",
        "internalerror": "Interner Feeler",
        "internalerror_info": "Interner Feeler: $1",
-       "fileappenderrorread": "\"$1\" hod wärend 'm dazuafyng ned gleesen wern kenna.",
-       "fileappenderror": "Dé Daatei „$1“ hod néd noch „$2“ kopird wern kenner.",
        "filecopyerror": "De Datai „$1“ hod ned noch „$2“ kopird wern kenna.",
        "filerenameerror": "Dé Daatei „$1“ hod néd noch „$2“ umbenånnt wern kenner.",
        "filedeleteerror": "De Daatei „$1“ hod néd gléschd wern kenner.",
        "directorycreateerror": "As Vazeichnis „$1“ hod néd åglégt wern kenner.",
        "filenotfound": "Dé Daatei „$1“ is néd gfunden worn.",
-       "fileexistserror": "In d' Daatei „$1“ hod néd gschriem wern kenner, weils dé Daatei nämlé schå gibt.",
        "unexpected": "Unerworteder Wert: „$1“=„$2“.",
        "formerror": "Feeler: Dé Eihgom håm néd vaorweitt wern kenner.",
        "badarticleerror": "Dé Akzión kå néd auf dé Seiten ågwendt wern.",
        "anoneditwarning": "Obocht: Du bist ned eigloggt.\nDei IP-Adress wead in da Versionsgschicht afzoachnet.",
        "missingsummary": "'''Hiwais:''' du host koa Zåmmfossung ågeem. Wånn du ernait auf „{{int:savearticle}}“ druckst, werd dai Enderung one a Zåmmfossung ywernumma.",
        "missingcommenttext": "Bittschee gib a Zåmmfossung ai.",
-       "summary-preview": "Vurschau vo da Zåmmfossung:",
+       "summary-preview": "Voaschau vo da Zammfossung:",
        "subject-preview": "Vurschau vom Bedreff:",
        "blockedtitle": "Da Benytzer is gsperrt",
        "whitelistedittext": "Du muasst de $1, um Saiten beorwaiten z' kenna.",
        "searchmenu-exists": "'''Es gibt a Seiten, wo „[[:$1]]“ hoasst.'''",
        "searchmenu-new": "'''De Seitn „[[:$1]]“ in em Wiki eastejn.'''",
        "searchprofile-articles": "Inhoidsseitn",
-       "searchprofile-project": "Huif- und Projektseitn",
        "searchprofile-images": "Muitimedia",
        "searchprofile-everything": "Ollas",
        "searchprofile-advanced": "Daweitad",
        "searchprofile-articles-tooltip": "Suacha in $1",
-       "searchprofile-project-tooltip": "Suacha in $1",
        "searchprofile-images-tooltip": "Noch Datein suacha",
        "searchprofile-everything-tooltip": "In gsamtn Inhoid duachsuacha (inkl. Dischkriaseitn)",
        "searchprofile-advanced-tooltip": "Suach in weidna Namasramm",
        "search-nonefound": "Fia dei Suachofrog gibts koa Ergebnis",
        "powersearch-legend": "Daweiterde Suach",
        "powersearch-ns": "Suach in Nåmensraim:",
-       "powersearch-redir": "Weiderloattung åzoang",
        "search-external": "Externe Suach",
        "preferences": "Eihstellungen",
        "mypreferences": "Mei Preferenz",
        "recentchanges-label-bot": "Endarung duach an Bot",
        "recentchanges-label-unpatrolled": "De Endarung is no ned kontrolliad worn",
        "rcnotefrom": "Untn san de Endarunga seit  '''$2''' (bis za '''$1''' Ozoagn).",
-       "rclistfrom": "Nua Endarunga seit $1 zoagn.",
+       "rclistfrom": "Nua Endarunga seit $3 $2 zoagn",
        "rcshowhideminor": "Kloane Endarunga $1",
        "rcshowhidebots": "Bots $1",
        "rcshowhideliu": "Eigloggte Nutza $1",
        "logempty": "Koane passenden Einträg.",
        "log-title-wildcard": "Da Titel faungt auh mid ....",
        "allpages": "Olle Seitn",
-       "alphaindexline": "$1 bis $2",
        "nextpage": "Naxde Seiten ($1)",
        "prevpage": "Vurherige Seiten ($1)",
        "allpagesfrom": "Seiten auhzoang ob:",
        "watchlist-details": "Du beoochst {{PLURAL:$1|$1 Seitn}}, Dischkriaseitn ned mitgrechnad",
        "wlheader-enotif": "Da E-Mail-Benoochrichtigungsdeanst is aktivierd.",
        "wlheader-showupdated": "Seiten mid noh néd gseengne Änderrungen wern '''fett''' dorgstöd.",
-       "watchmethod-recent": "Ywerpriaff d' létzden Beorwatungen fyr d' Beówochtungslisten",
-       "watchmethod-list": "Ywerpriaffm voh da Beówochtungslisten auf létzde Beorwatungen",
-       "watchlistcontains": "Deih Beówochtungslisten enthoitt $1 {{PLURAL:$1|Seiten|Seiten}}.",
-       "iteminvalidname": "Próblém mim Eihtrog „$1“, néd gütiger Naum.",
        "wlshowlast": "Zoag dé Änderrungen voh dé létzden $1 Stunden, $2 Dog óder $3 (in dé létzden 30 Dog).",
        "watchlist-options": "Mei Beobochta: Optiona",
        "watching": "Beówochten ...",
        "enotif_lastvisited": "Olle Änderrungen auf oan Blick: $1",
        "enotif_lastdiff": "Schaug auf $1 noch derer Änderrung.",
        "enotif_anon_editor": "Anonymer Benutzer $1",
-       "enotif_body": "Servas $WATCHINGUSERNAME,\n\ndé {{SITENAME}}-Seiten „$PAGETITLE“ is voh $PAGEEDITOR am $PAGEEDITDATE um $PAGEEDITTIME Uar $CHANGEDORCREATED.\n\nAktuöe Versión: $PAGETITLE_URL\n\n$NEWPAGE\n\nZåmmfossung vom Beorweiter: $PAGESUMMARY $PAGEMINOREDIT\n\nKontakt zum Beorweiter:\nE-Mail: $PAGEEDITOR_EMAIL\nWiki: $PAGEEDITOR_WIKI\n\nEs wern da sólång koane weidern Benoochrichtigungsmails gsendt, bis du dé Seiten wieder bsuachst. Auf deiner Beówochtungslisten kåst olle Benoochrichtigunsmarkiarungen zåmm zrucksétzen.\n             Deih freindlichs {{SITENAME}}-Benoochrichtigungssystém\n\n--\nUm d' Eihstöungen voh da E-Mail-Benoochrichtigung åzpassen, bsuachst {{canonicalurl:{{#special:Preferences}}}}\n\nUm d' Eihstöungen voh deine Beówochtungslisten åzpassen, bsuachst {{canonicalurl:{{#special:EditWatchlist}}}}\n\nUm d' Seiten voh deiner Beówochtungslisten ower z' doah, bsuachst $UNWATCHURL\n\nRyckmödungen und a weidre Hüf: {{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Servas $WATCHINGUSERNAME,\n\ndé {{SITENAME}}-Seiten „$PAGETITLE“ is voh $PAGEEDITOR am $PAGEEDITDATE um $PAGEEDITTIME Uar $CHANGEDORCREATED.\n\nAktuöe Versión: $PAGETITLE_URL\n\n$NEWPAGE\n\nZåmmfossung vom Beorweiter: $PAGESUMMARY $PAGEMINOREDIT\n\nKontakt zum Beorweiter:\nE-Mail: $PAGEEDITOR_EMAIL\nWiki: $PAGEEDITOR_WIKI\n\nEs wern da sólång koane weidern Benoochrichtigungsmails gsendt, bis du dé Seiten wieder bsuachst. Auf deiner Beówochtungslisten kåst olle Benoochrichtigunsmarkiarungen zåmm zrucksétzen.\n             Deih freindlichs {{SITENAME}}-Benoochrichtigungssystém\n\n--\nUm d' Eihstöungen voh da E-Mail-Benoochrichtigung åzpassen, bsuachst {{canonicalurl:{{#special:Preferences}}}}\n\nUm d' Eihstöungen voh deine Beówochtungslisten åzpassen, bsuachst {{canonicalurl:{{#special:EditWatchlist}}}}\n\nUm d' Seiten voh deiner Beówochtungslisten ower z' doah, bsuachst $UNWATCHURL\n\nRyckmödungen und a weidre Hüf: $HELPPAGE",
        "created": "erstöd",
        "changed": "gänderd",
        "deletepage": "Seiten léschen",
        "blockip": "IP-Adress/Benytzer sperrn",
        "blockip-legend": "IP-Adresse/Benutzer sperrn",
        "blockiptext": "Mid dem Formular sperrst a IP-Adress oder an Benytzernåmen, das vo durten aus koane Endarungen mer vurgnumma wern kennan.\nDes soid nur dafoing, um an Vandalismus z' vahindern und in Yweraistimmung mid d' [[{{MediaWiki:Policy-url}}|Richtlinien]].\nGib bittschee an Grund fyr d' Sperrn å.",
-       "ipadressorusername": "IP-Adress oder Benytzernåm:",
+       "ipaddressorusername": "IP-Adress oder Benytzernåm:",
        "ipbexpiry": "Sperrdauer:",
        "ipbreason": "Grund:",
        "ipbreason-dropdown": "* Oigmoahne Sperrgrynd\n** Eihfyng voh voische Informaziónen\n** Laarn voh Seiten\n** Massenweiss Eihfyng voh externe Links\n** Eihstön voh unsinnige Inhoite auf Seiten\n** néd åbrochts Vahoiden\n** Missbrauch mid mererne Benutzerkontós\n** néd geigneter Benutzernåm",
        "autoredircomment": "Weiderloatung noch [[$1]] is erstöd worn",
        "autosumm-new": "Dé Seiten is neich åglégt worn: $1",
        "size-bytes": "$1 Bytes",
-       "livepreview-loading": "Loon ...",
-       "livepreview-ready": "Loon … Ferdig!",
-       "livepreview-failed": "Dé sófurtige Vurschau is néd méglich!\nBittscheh d' noraale Vurschau bnutzen.",
-       "watchlistedit-noitems": "Dei Beobachtungslistn is laar.",
        "watchlistedit-normal-title": "Beobachtungslistn bearbatn",
        "watchlistedit-normal-legend": "Eiträge vo da Beobachtungslistn wegnehma",
        "watchlistedit-normal-explain": "Des san de Eiträg vo deiner Beowochtungslisten. Um de Eiträg z' entferna, markir de Kastln neem de Eiträg und druck am End vo da Seiten auf „{{int:Watchlistedit-normal-submit}}“. Du kåst dei Beowochtungslisten aa im  [[Special:EditWatchlist/raw|Listenformat beorweiten]].",
        "compare-invalid-title": "Da ågeewerne Seitennåm is néd gütig",
        "compare-title-not-exists": "Da ågeewerne Seitennåm is néd vurhånden",
        "compare-revision-not-exists": "Dé ågeewerne Versión is néd vurhånden",
-       "dberr-header": "Dés Wiki hod a Próblém",
        "dberr-problems": "Tschuidigung. Dé Seiten hod im Moment technische Próbléme.",
        "dberr-again": "Wort a por Minuten und vasuachs dånn neich z' loon.",
        "dberr-info": "(Kå koah Vabindung zum Daatenbånkserver herstön: $1)",
index fc9e345..f98f58a 100644 (file)
@@ -6,7 +6,8 @@
                        "Kaganer",
                        "Mostafadaneshvar",
                        "Reedy",
-                       "ZxxZxxZ"
+                       "ZxxZxxZ",
+                       "아라"
                ]
        },
        "tog-underline": ":لینکانآ خط کش",
@@ -19,7 +20,6 @@
        "tog-showtoolbar": "میله ابزار اصلاح پیش درا(جاوا)",
        "tog-editondblclick": "صفحات گون دو کلیک اصلاح کن(جاوا)",
        "tog-editsectiononrightclick": "فعال کتن اصلاح کسمت گون کلیک راست اور کسمت عناوین(جاوا)",
-       "tog-rememberpassword": "من ورود ته ای کامپیوتر هیال بکن (په $1 {{PLURAL:$1|روچ|روچ}})",
        "tog-watchcreations": "هور کن منی صفحاتی که من ته لیست چارگ شرکتت",
        "tog-watchdefault": "هورکن صفحاتی که من اصلاح کتن ته منی لیست چارگ",
        "tog-watchmoves": "هور کن صفحاتی که من جاه په جاه کت ته منی لیست چارگ",
        "filedeleteerror": "نه تونیت فایل حذف کنت  \"$1\".",
        "directorycreateerror": "نه تونیت مسیر شرکتن  \"$1\".",
        "filenotfound": "نه تونیت فایل درگیزگ \"$1\".",
-       "fileexistserror": "نه تونیت فایل بنویسیت به  \"$1\": فایل هستنت",
        "unexpected": "ارزش نه لوٹتیگن : \"$1\"=\"$2\".",
        "formerror": "حطا: نه تونیت فرم دیم دنت",
        "badarticleerror": "ای کار ته ای صفحه اجرای نه بیت",
        "savearticle": "صفحه ذخیره کن",
        "preview": "بازبین",
        "showpreview": "بازبین پیش دار",
-       "showlivepreview": "بازبین زنده",
        "showdiff": "تغییرات پیش دار",
        "anoneditwarning": "'''هوژاری:''' شما وارد نه بیتگیت.\nشمی آی پی ته تاریح اصلاح ای صفحه ثبت بیت.",
        "missingsummary": "'''یادآوری:''' شما یک خلاصه چه اصلاح وارد نه کرت.\nاگر دگه کلیک کنیت ذخیره آ، شمی اصلاح به بی آی ذخیره بنت.",
        "search-nonefound": "نتیجه هم دپ په درخواست نیست",
        "powersearch-legend": "گردگ پیشرفته",
        "powersearch-ns": "گردگ ته نام فضا آن",
-       "powersearch-redir": "لیست عیرمستقیم آن",
        "powersearch-togglelabel": "کنترل:",
        "powersearch-toggleall": "کل",
        "powersearch-togglenone": "هچ یک",
        "recentchanges-summary": "رندگر نوکترین تغییرات ته ویکی تی ای صفحه.",
        "recentchanges-feed-description": "آهرین تغییرات ته وی کی چه ای فید رند گر",
        "rcnotefrom": "جهلا تغییرات چه '''$2''' (تا  '''$1''' پیش دارگنت). هست",
-       "rclistfrom": "پیش دار نوکین تغییراتآ چه $1",
+       "rclistfrom": "پیش دار نوکین تغییراتآ چه $3 $2",
        "rcshowhideminor": "$1 هوردین تغییرات",
        "rcshowhidebots": "$1 روبوت",
        "rcshowhideliu": "$1 کاربران وارد بوتگین",
        "watchlist-details": "{{PLURAL:$1|$1 صفحه|$1 صفحات}} چارتگ بیت صفحات گپ حساب نه بیگن",
        "wlheader-enotif": "اخطار ایمیل فعالنت.",
        "wlheader-showupdated": "صفحات که عوض بوتگنت چه شمی آهری چارتن '''پررنگ''' پیش دراگ بنت.",
-       "watchmethod-recent": "کنترل نوکین اصلاحات په صفحاتی که چارگ بنت",
-       "watchmethod-list": "کنترل صفحاتی که چارگ بنت په نوکین اصلاحات",
-       "watchlistcontains": "شمی لیست چارگ شامل  $1 {{PLURAL:$1|صفحه|صفحات}}.",
-       "iteminvalidname": "مشکل گون آیتم  '$1', نامعتبر  این نام",
        "wlshowlast": "پیش دار آهرین $1  ساعات $2 روچان $3",
        "watchlist-options": "گزینه یان لیست چارگ",
        "watching": "چارگ بین",
        "enotif_lastvisited": "بچار  $1 په کلین تغییرات چه شمی آهری چارگ.",
        "enotif_lastdiff": "بچار $1 په گندگ ای تغییر.",
        "enotif_anon_editor": "ناشناس کاربر $1",
-       "enotif_body": "آزیزین $WATCHINGUSERNAME،\n\nصفحه {{SITENAME}} $PAGETITLE بوتت $CHANGEDORCREATED ته  $PAGEEDITDATE گون $PAGEEDITOR، بچار $PAGETITLE_URL په هنوکین نسخه.\n\n$NEWPAGE\n\nخلاصهء اصلاح کنوک:$PAGESUMMARY $PAGEMINOREDIT\n\nتماس گر گون اصلاح کنوک:\nایمیل:$PAGEEDITOR_EMAIL\nویکی: $PAGEEDITOR_WIKI\n\nدگه گیشترین اخطار په تغییرات دگه دیم دهگ نه بوت مگر شی که شما ای صفحه بچاریت.\nشما تونیت هنچوش نشانآن اخطارء ته وتی لیست چارگ په کلی چارتگین صفحات تنظیم کنیت.\n\nشمی دوستین سیستم اخطار {{SITENAME}}\n\n--\nپه عوض کتن تنظیمات وتی لیست چارگ،به چار\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nنظرات و گیشترین کمک:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "آزیزین $WATCHINGUSERNAME،\n\nصفحه {{SITENAME}} $PAGETITLE بوتت $CHANGEDORCREATED ته  $PAGEEDITDATE گون $PAGEEDITOR، بچار $PAGETITLE_URL په هنوکین نسخه.\n\n$NEWPAGE\n\nخلاصهء اصلاح کنوک:$PAGESUMMARY $PAGEMINOREDIT\n\nتماس گر گون اصلاح کنوک:\nایمیل:$PAGEEDITOR_EMAIL\nویکی: $PAGEEDITOR_WIKI\n\nدگه گیشترین اخطار په تغییرات دگه دیم دهگ نه بوت مگر شی که شما ای صفحه بچاریت.\nشما تونیت هنچوش نشانآن اخطارء ته وتی لیست چارگ په کلی چارتگین صفحات تنظیم کنیت.\n\nشمی دوستین سیستم اخطار {{SITENAME}}\n\n--\nپه عوض کتن تنظیمات وتی لیست چارگ،به چار\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nنظرات و گیشترین کمک:\n$HELPPAGE",
        "created": "شربوتت",
        "changed": "عوض بوت.",
        "deletepage": "حذف صفحه",
        "blockip": "محدود کتن کاربر",
        "blockip-legend": "کاربر محدود کن",
        "blockiptext": "چه ای فرم جهلی په نوشتن دسترسی په یک خاصین آدرس آی پی یا نام کاربری استفاده کن.\nشی فقط انجام بیت په خاطر جلوگیری چه هرابکاری  په اساس [[{{MediaWiki:Policy-url}}|سیاست]].\nیک حاصین دلیلی بنویس جهلء (مثلا، گوشگ صفخات خاصی که هراب بپتگنت).",
-       "ipadressorusername": "آدرس آي پی یا نام کاربری:",
+       "ipaddressorusername": "آدرس آي پی یا نام کاربری:",
        "ipbexpiry": "وهد هلگ:",
        "ipbreason": "دلیل:",
        "ipbreason-dropdown": "* متداولین دلایل محدودیت\n** وارد کتن غلطین اطلاحات\n** زورگ محتوا چه صفحات\n** لینکان اسپمی په دراین سایت\n**وارد کتن بی ربطین/نامفومین چیز په صفحات\n** ترسناکین رفتار/ آزار\n**سوء استفاده چه چنت حساب\n** غیر قابل قبولین نام کاربری",
        "monobook.css": "/* CSS که اداننت کابران پوست مونوبوک تاثیر کننت */",
        "common.js": "/* هر جاوا اسکریپتی ادان په کل کابران ته هر صفحه ای بار بیت. */",
        "monobook.js": "/* جاوا اسکریپت ادان فقط په کابرانی که چه پوست منوبوک استفاده کننت بار بیت. */",
-       "notacceptable": "سروری ویکی نه تونیت دیتای ته فرمتی که شمی کلاینت بتوننت آی بوانند فراهم کنت.",
        "anonymous": "ناشناسین {{PLURAL:$1|کاربر|کاربران}} چه {{SITENAME}}",
        "siteuser": "{{SITENAME}} کاربر $1",
        "lastmodifiedatby": "ای صفحه اهری رندی که تغییر دهگ بیته $2, $1گون $3.",
        "newimages-summary": "ای حاصین صفحه اهرین آپلود بوتگین فایلان پیشداریت",
        "newimages-legend": "فیلتر",
        "newimages-label": "نام فایل ( یا چنڈی چه آيی):",
-       "showhidebots": "(روباتان $1 )",
        "noimages": "هیچی په دیستن",
        "ilsubmit": "گردگ",
        "bydate": "گون تاریح",
        "size-kilobytes": "$1 ک.ب",
        "size-megabytes": "$1 م.ب",
        "size-gigabytes": "$1 گ.ب",
-       "livepreview-loading": "...بار بیت",
-       "livepreview-ready": "باربیت... حاضر!",
-       "livepreview-failed": "زنده بازبینی پروش وارت. نرمال بازبینی سعی کن.",
-       "livepreview-error": "پروش ته وصل بیگ :$1 \"$2\".  نرمال بازبینی سعی کن.",
        "lag-warn-normal": "تغییرات نوکتر چه {{PLURAL:$1|ثانیه|ثانیه}} ثانیه انت شاید ته ای لیست پجاه می کاینت.",
        "lag-warn-high": "خاطر بازگین تاخیر سرور دیتابیس، تغییرات نوکتر چه  {{PLURAL:$1|ثانیه|ثانیه}} شایدن ته ای لیست پیش دارگمه بنت.",
-       "watchlistedit-numitems": "شمی لیست چارگ شامل  {{PLURAL:$1|1 عنوان|$1 عناوین}}, بجز صفحات گپ.",
-       "watchlistedit-noitems": "شمی لیست چارگ هچ عنوانی نداریت.",
        "watchlistedit-normal-title": "اصلاح لیست چارگ",
        "watchlistedit-normal-legend": "بزور عناوینء چه لیست چارگ",
        "watchlistedit-normal-explain": "عناوین ته شمی لیست چارگ جهلء پیشدارگ بنت.\nپه زورتن یک عنوانی، جعبه کش آییء تیک زن، و کلیک کن زوگ عناوینء.\nشما تونیت هنچوش [[Special:EditWatchlist/raw|لیست هام اصلاح کنیت]].",
        "tags-hitcount-header": "اصلاحات برچسپی",
        "tags-edit": "اصلاح",
        "tags-hitcount": "$1 {{PLURAL:$1|تغییر|تغییرات}}",
-       "dberr-header": "ای ویکی ءَ مشکل هستن",
        "dberr-problems": "شرمنده! این سایت ءَ تکنیکی مشکل هستن.",
        "dberr-again": "چنت دقیقه صبر کنیت و دگه صفحه بیاریت",
        "dberr-info": "(نه توینت گون دیتابیس سرور تماس گیرت: $1)",
index 020627f..7b3e12e 100644 (file)
@@ -7,7 +7,8 @@
                        "Kaganer",
                        "Shirayuki",
                        "Steven*fung",
-                       "Urhixidur"
+                       "Urhixidur",
+                       "아라"
                ]
        },
        "tog-underline": "Linyahan an kilyawan:",
@@ -20,7 +21,6 @@
        "tog-showtoolbar": "Ipahiling an barang-gamit nin pagliwat",
        "tog-editondblclick": "Liwaton an mga pahina sa pagdoble nin klik",
        "tog-editsectiononrightclick": "Paganaha an seksyon nin pagliliwat sa pag-klik kan mga titulo nin seksyon",
-       "tog-rememberpassword": "Giromdoma an sakong paglaóg sa kilyaw (browser) na ini (para sa maximum na $1 {{PLURAL:$1|aldaw|mga aldaw}})",
        "tog-watchcreations": "Idagdag an mga pahina na ako an nagmukna asin an mga sagunson na ako an nagkarga sa sakong bantay-listahan",
        "tog-watchdefault": "Idagdag an mga pahina asin mga sagunson na ako an nagliwat sa sakong bantay-listahan",
        "tog-watchmoves": "Idagdag an mga pahina asin mga sagunson na ako an nagbalyo sa sakong bantay-listahan",
        "permalink": "Permanenteng kilyawan",
        "print": "Imprintaron",
        "view": "Tanawon",
+       "view-foreign": "Hilngon sa $1",
        "edit": "Liwatón",
+       "edit-local": "Liwaton an lokal na deskripsyon",
        "create": "Muknaon",
+       "create-local": "Idugang an lokal na deskripsyon",
        "editthispage": "Liwata ining pahina",
        "create-this-page": "Muknaon ining pahina",
        "delete": "Puraon",
        "jumptonavigation": "nabigasyon",
        "jumptosearch": "hanapon",
        "view-pool-error": "Sori tabi, an mga server kargado sa oras na ini.\nGrabe kadakol an mga paragamit na pinagprubaran mahiling an pahinang ini.\nMakihalat tabi nin kadikit na panahon bago ka magprubara na makapaglaog sa pahinang ini.\n\n$1",
+       "generic-pool-error": "Sori tabi, an mga serbidor grabe kakargado sa oras na ini. Kadakulon na gayo an mga paragamit na minaprubar na hilngon ining kaggikanan. Tabi pakihalat kadikit bago ka magprubar otro na makapaglaog sa kaggikanang ini.",
        "pool-timeout": "Timeout naghahalat para makapanugpon",
        "pool-queuefull": "An grupong panproseso panoon",
        "pool-errorunknown": "Bakong bistadong sala",
        "readonly_lag": "Tulostulos na pagkandado an base nin datos mantang makaabot an base nin datos na esklabo saiyang amo.",
        "internalerror": "Panlaog na kasalâan",
        "internalerror_info": "Panlaog na kasalâan: $1",
-       "fileappenderrorread": "Dae nakakabasa nin \"$1\" habang pinagdadagdag.",
-       "fileappenderror": "Dae nakakapagdagdag nin \"$1\" sagkod \"$2\".",
        "filecopyerror": "Dai naarog an mga file na \"$1\" hasta \"$2\".",
        "filerenameerror": "Dai natàwan nin bàgong ngaran an file na \"$1\" sa \"$2\".",
        "filedeleteerror": "Dai naparà an file na \"$1\".",
        "directorycreateerror": "Dai nagibo an direktorya na \"$1\".",
        "filenotfound": "Dai nahanap an file na \"$1\".",
-       "fileexistserror": "Dai maisurat sa file na \"$1\": igwa nang file na arog kaini",
        "unexpected": "Dai pighuhunà na balór: \"$1\"=\"$2\".",
        "formerror": "Salâ: dai pwedeng isumitir an porma",
        "badarticleerror": "Dai pwedeng gibohon ini sa ining páhina.",
        "gotaccountlink": "Maglaog",
        "userlogin-resetlink": "Nakalingaw ka sa panlaog mong detalye?",
        "userlogin-resetpassword-link": "Nalingawan mo an saimong pasa-taramon?",
+       "userlogin-helplink2": "Katabangan sa paglalaog",
        "userlogin-loggedin": "Ika nakalaog na tabi bilang si {{GENDER:$1|$1}}.\nGamita an porma sa ibaba sa paglaog bilang ibang paragamit.",
        "userlogin-createanother": "Magmukna nin ibang panindog",
-       "createacct-join": "Pakikaag an saimong impormasyon sa ibaba.",
-       "createacct-another-join": "Ikaag an impormasyon kan baguhong panindog sa ibaba.",
        "createacct-emailrequired": "Estada kan e-surat",
        "createacct-emailoptional": "E-surat na estada (opsyonal)",
        "createacct-email-ph": "Pakikaag an saimong e-surat na estada",
        "suspicious-userlogout": "An hinahagad mong magluwas pinagpundo nin huli ta ini gayod pinagpadara sa paagi nin sarong pasang kilyaw o proksing hilom.",
        "createacct-another-realname-tip": "An totoong pangaran opsyonal.\nKun gustuhon mong itao ini, ini paggagamiton sa pagtatao nin pagkakabistohan kan paragamit para sa saindang mga kaggibohan.",
        "pt-login": "Maglaog",
+       "pt-login-button": "Maglaog",
        "pt-createaccount": "Magmukna nin panindog",
        "pt-userlogout": "Magluwas",
        "php-mail-error-unknown": "Bakong bantog na kasalaan sa PHP mail() function.",
        "resetpass-temp-password": "Temporaryong sekretong panlaog:",
        "resetpass-abort-generic": "Pagliwat kan sikretong panlaog ipinagpauntok kan sarong ekstensyon.",
        "resetpass-expired": "An saimong pasa-taramon nagpalso na. Tabi man pakikaag nin sarong baguhong pasa-taramon tanganing makalaog ka.",
-       "resetpass-expired-soft": "An saimong pasa-taramon nagpalso na, asin kinakaipuhan na baguhan. Tabi man pakipili nin sarong baguhong pasa-taramon ngunyan, o i-klik an kanselaron sa pagbago kaini aro-atyan.",
+       "resetpass-expired-soft": "An saimong pasa-taramon nagpalso na, asin kinakaipuhan na baguhon. Tabi man pakipili nin sarong baguhong pasa-taramon ngunyan, o i-klik an \"{{int:resetpass-submit-cancel}}\" kun baguhon sa aro-atyan.",
        "passwordreset": "Pakibago kan sekretong panlaog",
        "passwordreset-text-one": "Kumpletuhon ining porma sa pagliwat otro kan saimong pasa-taramon.",
        "passwordreset-text-many": "{{PLURAL:$1|Kaagi an saro sa mga kaaganan tanganing makaresibe nin sarong temporaryong pasa-taramon sa paagi kan e-surat.}}",
        "savearticle": "Itagáma an pahina",
        "preview": "Tànawón",
        "showpreview": "Ipahiling an patanaw",
-       "showlivepreview": "Patànaw na direkto",
        "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.",
        "edit-gone-missing": "Dae makakapagdagdag sa pahina.\nIni minapahiwatig tabi na pinagpura na.",
        "edit-conflict": "Igwang iregularidad sa pagliwat.",
        "edit-no-change": "An saimong pagliwat pinagbalewala, nin huli ta mayong pagbabago an pinaghimo sa teksto.",
-       "postedit-confirmation": "An saimong niliwat ipinagtagama na.",
+       "postedit-confirmation-created": "An pahina nakamukna na.",
+       "postedit-confirmation-restored": "An pahina naibalik na otro.",
+       "postedit-confirmation-saved": "An saimong niliwat ipinagtagama na.",
        "edit-already-exists": "Dai maggibo an bàgong pahina.\nIgwa na kaini.",
        "defaultmessagetext": "Tugmadong mensahe sa teksto",
        "content-failed-to-parse": "Nagpalya sa paglunhay an $2 na laman para sa $1 na modelo: $3",
        "invalid-content-data": "Imbalidong datos nin laman",
        "content-not-allowed-here": "\"$1\" na laman dae pinagtutugutan sa pahina [[$2]]",
-       "editwarning-warning": "Sa pagbaya kaining pahina magkakausa saimo na mawara an anuman na mga kaliwatan na saimong ginibo. Kun ika maglaog, mapuwede mong untukon ining patanid sa \"Pagliliwat\" na seksyon kan saimong mga kamuyahan.",
+       "editwarning-warning": "Sa pagbaya kaining pahina magkakausa saimo na mawara an anuman na mga kaliwatan na saimong pinaghimo. Kun ika nakapaglaog na, ika puwedeng makapagpauntok kaining patanid sa \"{{int:prefs-editing}}\" na seksyon kan saimong mga kamuyahan.",
        "editpage-notsupportedcontentformat-title": "Kalamnan nin pormat bakong suportado",
        "editpage-notsupportedcontentformat-text": "An pormat nin kalamnan na $1 bakong suportado kan modelong kalamnan na $2.",
        "content-model-wikitext": "wiki-teksto",
        "searchmenu-exists": "'''Igwa nin sarong pahina na pinagngaranan na \"[[:$1]]\" sa wiking ini.'''",
        "searchmenu-new": "'''Muknaon an pahina \"[[:$1]]\" sa wiking ini!'''",
        "searchprofile-articles": "Mga pahina nin laog",
-       "searchprofile-project": "Mga pahina nin Tabang asin Proyekto",
        "searchprofile-images": "Multimidya",
        "searchprofile-everything": "Gabós na bagay",
        "searchprofile-advanced": "Adbansiyado",
        "searchprofile-articles-tooltip": "Hanapon sa $1",
-       "searchprofile-project-tooltip": "Maghanap sa $1",
        "searchprofile-images-tooltip": "Maghanap nin mga sagunson",
        "searchprofile-everything-tooltip": "Maghanap nin gabos na laog (kabali an mga pahina nin olay)",
        "searchprofile-advanced-tooltip": "Maghanap nin pankustombreng espasyong-ngaran",
        "search-nonefound": "Mayo nin mga resulta na panampok sa kahaputan.",
        "powersearch-legend": "Adbansiyadong paghahanap",
        "powersearch-ns": "Maghanap sa mga espasyong-ngaran:",
-       "powersearch-redir": "Listahan kan mga panukdong otro",
        "powersearch-togglelabel": "Pamili:",
        "powersearch-toggleall": "Gabos",
        "powersearch-togglenone": "Wara",
        "prefs-emailconfirm-label": "Kumpirmasyon sa E-koreo",
        "youremail": "E-surat:",
        "username": "{{GENDER:$1|Pangaran nin paragamit}}:",
-       "uid": "{{GENDER:$1|Paragamit}} ID:",
        "prefs-memberingroups": "{{GENDER:$2|Miyembro}} kan {{PLURAL:$1|grupo|mga grupo}}:",
        "prefs-registration": "Rehistrasyong oras:",
        "yourrealname": "Totoong pangaran:",
        "prefs-advancedsearchoptions": "Abantidong mga pagpipilian",
        "prefs-advancedwatchlist": "Abantidong mga pagpipilian",
        "prefs-displayrc": "Ihayag an mga pagpipilian",
-       "prefs-displaysearchoptions": "Ipahiling ang mga pagpipilian",
        "prefs-displaywatchlist": "Ipahiling ang mga pagpipilian",
        "prefs-tokenwatchlist": "Paduos",
        "prefs-diffs": "Diffs",
        "recentchanges-legend-newpage": "(hilngon man [[Special:NewPages|listahan kan mga baguhong pahina]])",
        "recentchanges-legend-plusminus": "(''±saro-duwa-tolo'')",
        "rcnotefrom": "Sa ibaba iyo an mga kaliwatan poon kan '''$2''' (sagkod sa '''$1''' na ipinapahiling).",
-       "rclistfrom": "Ipahiling an baguhon na mga kaliwatan magpoon kan $1",
+       "rclistfrom": "Ipahiling an baguhon na mga kaliwatan magpoon kan $3 $2",
        "rcshowhideminor": "$1 saradit na mga pagliwat",
+       "rcshowhideminor-show": "Ipatanaw",
+       "rcshowhideminor-hide": "Tagoa",
        "rcshowhidebots": "$1 mga gantaw",
+       "rcshowhidebots-show": "Ipatanaw",
+       "rcshowhidebots-hide": "Tagoa",
        "rcshowhideliu": "$1 rehistradong mga paragamit",
+       "rcshowhideliu-show": "Ipatanaw",
+       "rcshowhideliu-hide": "Tagoa",
        "rcshowhideanons": "$1 mga dae bistong paragamit",
+       "rcshowhideanons-show": "Ipatanaw",
+       "rcshowhideanons-hide": "Tagoa",
        "rcshowhidepatr": "$1 patrolyadong mga pagliwat",
+       "rcshowhidepatr-show": "Ipatanaw",
+       "rcshowhidepatr-hide": "Tagoa",
        "rcshowhidemine": "$1 sakong mga pagliliwat",
+       "rcshowhidemine-show": "Ipatanaw",
+       "rcshowhidemine-hide": "Tagoa",
        "rclinks": "Ipahilíng an $1 huring mga kaliwatan sa laog nin huring $2 na mga aldaw<br />$3",
        "diff": "kalaenan",
        "hist": "sagaysay",
        "uploadstash-refresh": "Papreskoha otro an listahan kan mga sagunson",
        "invalid-chunk-offset": "Imbalidong tagpas na pampahale",
        "img-auth-accessdenied": "Paggamit dae pinagtugot",
-       "img-auth-nopathinfo": "Nawawara an PATH_INFO.\nAn saimong serbidor dae naipamugtak tanganing makapasa kaining impormasyon.\nIni mapuwedeng yaon nakabase sa CGI asin dae makakasuporta sa img_auth.\nHilnga an https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "Nawawara an PATH_INFO.\nAn saimong serbidor dae naipamugtak tanganing makapasa kaining impormasyon.\nIni mapuwedeng yaon nakabase sa CGI asin dae makakasuporta sa img_auth.\nHilnga an https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "An hinahagad na agihan bakong naka-akma sa pankargang direktoryo.",
        "img-auth-badtitle": "Dae nakakapaggibo in sarong balidong titulog gikan sa \"$1\".",
        "img-auth-nologinnWL": "Dae ka nakalaog asin \"$1\" mayo sa aprubadong listahan.",
        "log-title-wildcard": "Hanapon an mga titulong napopoon sa tekstong ini",
        "showhideselectedlogentries": "Ipahiling/itago an pinagpiling mga entrada sa talaan",
        "allpages": "Gabos na mga pahina",
-       "alphaindexline": "$1 sagkod sa $2",
        "nextpage": "Sunod na pahina ($1)",
        "prevpage": "Nakaaging pahina ($1)",
        "allpagesfrom": "Ipahiling an mga páhina poon sa:",
        "watchlist-details": "{{PLURAL:$1|$1 pahina|$1 mga pahina}} sa saimong bantay-listahan, dae binibilang an mga pahina nin orolayan.",
        "wlheader-enotif": "E-surat na paisi pinagpaandar na.",
        "wlheader-showupdated": "Mga pahina na pinagriliwat poon kaidtong huri kang nagbisita sainda ipinapatanaw na '''mahîbog'''",
-       "watchmethod-recent": "Pigsososog an mga kaaagi pa sanang hirá sa mga pigbabantayan na páhina",
-       "watchmethod-list": "Pigsososog an mga pigbabantayan na páhina para mahiling an mga kaaagi pa sanan paghirá",
-       "watchlistcontains": "An saimong lista nin pigbabantayan igwang $1 na {{PLURAL:$1|páhina|mga páhina}}.",
-       "iteminvalidname": "May problema sa bagay na '$1', salâ an pangaran...",
        "wlshowlast": "Ipahilíng an nakaaging $1 na mga oras mga $2 na aldaw $3",
        "watchlist-options": "Bantay-listahan na mga pagpipilian",
        "watching": "Pigbabantayan...",
        "enotif_lastvisited": "Hilingón an $1 para sa gabos na mga pagbâgo poon kan huring bisita.",
        "enotif_lastdiff": "Hilingón an $1 tangarig mahiling an pagbâgong ini.",
        "enotif_anon_editor": "dai bistong parágamit $1",
-       "enotif_body": "Namumutan na $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nSumaryo kan paraliwat: $PAGESUMMARY $PAGEMINOREDIT\n\nKontaka an paraliwat:\ne-surat: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nDae na magkakaigwa pa nin ibang pagpapaisi sa kaso na may kadagdagan pang aktibidad laen lang kun ika magbisita sa pahinang ini mantang ika nakalaog. Ika mapuwede man na makapagbago kan bandera nin pagpapaisi para sa gabos mong pinagbabantayan na mga pahina na yaon sa saimong bantay-listahan.\n\nAn saimong mainamigong {{SITENAME}} sistema nin pagpapaisi\n\n--\nSa pagbabago kan saimong e-surat na pagpapaising panuytoy, magbisita sa {{canonicalurl:{{#special:Mga Kagustuhan}}}}\n\nSa pagbabago kan saimong bantay-listahang panuytoy, magbisita sa {{canonicalurl:{{#special:EditWatchlist}}}}\n\nSa pagpura ka pahina gikan sa saimong bantay-listahan, magbisita sa $UNWATCHURL\n\nBalik-simbag asin kadagdagang asistensiya:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Namumutan na $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nSumaryo kan paraliwat: $PAGESUMMARY $PAGEMINOREDIT\n\nKontaka an paraliwat:\ne-surat: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nDae na magkakaigwa pa nin ibang pagpapaisi sa kaso na may kadagdagan pang aktibidad laen lang kun ika magbisita sa pahinang ini mantang ika nakalaog. Ika mapuwede man na makapagbago kan bandera nin pagpapaisi para sa gabos mong pinagbabantayan na mga pahina na yaon sa saimong bantay-listahan.\n\nAn saimong mainamigong {{SITENAME}} sistema nin pagpapaisi\n\n--\nSa pagbabago kan saimong e-surat na pagpapaising panuytoy, magbisita sa {{canonicalurl:{{#special:Mga Kagustuhan}}}}\n\nSa pagbabago kan saimong bantay-listahang panuytoy, magbisita sa {{canonicalurl:{{#special:EditWatchlist}}}}\n\nSa pagpura ka pahina gikan sa saimong bantay-listahan, magbisita sa $UNWATCHURL\n\nBalik-simbag asin kadagdagang asistensiya:\n$HELPPAGE",
        "created": "piggibo",
        "changed": "pigbâgo",
        "deletepage": "Paraon an pahina",
        "blockip": "Bagáton an 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).",
-       "ipadressorusername": "direksyon nin IP o gahâ:",
+       "ipaddressorusername": "direksyon nin IP o gahâ:",
        "ipbexpiry": "Pasó:",
        "ipbreason": "Rason:",
        "ipbreason-dropdown": "*Mga komon na rason sa pagbagat\n** Nagkakaag nin salang impormasyon\n** Naghahalî nin mga laog kan páhina\n** Nagkakaag nin mga takod na ''spam'' kan mga panluwas na ''site''\n** Nagkakaag nin kalokohan/ringaw sa mga pahina\n** Gawî-gawing makatakót/makauyám\n** Nag-aabuso nin mga lain-lain na ''account''\n** Dai akong ngaran nin parágamit",
        "monobook.css": "/* an CSS na pigbugtak digdi makakaapektar sa mga parágamit kan Monobook skin */",
        "common.js": "/* Arin man na JavaScript digdi maikakarga para sa gabos na mga parágamit sa kada karga kan páhina. */",
        "monobook.js": "/* Deprecado; gamiton an [[MediaWiki:common.js]] */",
-       "notacceptable": "Dai pwedeng magtao nin datos an ''wiki server'' sa ''format'' na pwedeng basahon kan kompyuter mo.",
        "anonymous": "Bako-bistadong {{PLURAL:$1|paragamit|mga paragamit}} kan {{SITENAME}}",
        "siteuser": "Paragamit kan {{SITENAME}} na si $1",
        "anonuser": "{{SITENAME}} bako-bistadong paragamit $1",
        "pageinfo-category-pages": "Bilang nin mga pahina",
        "pageinfo-category-subcats": "Bilang nin mga sub-kategorya",
        "pageinfo-category-files": "Bilang nin mga sagunson",
-       "skinname-modern": "Bago",
        "markaspatrolleddiff": "Markahan bilang pigpapatrolya",
        "markaspatrolledtext": "Markahan iníng pahina na pigpapatrolya",
        "markedaspatrolled": "Minarkahan na pigpapatrolya",
        "newimages-summary": "Ining espesyal na pahina minaphiling kan huring pinagkargang mga sagunson.",
        "newimages-legend": "An saraan",
        "newimages-label": "Ngaran nin sagunson (o sarong parte kaini):",
-       "showhidebots": "($1 na bots)",
        "noimages": "Mayong mahihilíng.",
        "ilsubmit": "Hanápon",
        "bydate": "sa petsa",
        "autosumm-replace": "Pigriribayan an páhina nin '$1'",
        "autoredircomment": "Piglilikay sa [[$1]]",
        "autosumm-new": "Pinagmukna an pahina kaining \"$1\"",
-       "livepreview-loading": "Pigkakarga…",
-       "livepreview-ready": "Pigkakarga… Magpreparar!",
-       "livepreview-failed": "Dae nakapoon an direktong patânaw! Probaran tabî an patânaw na normal.",
-       "livepreview-error": "Dai nakakabit: $1 \"$2\". Hilingón tabî an normal na patânaw.",
        "lag-warn-normal": "Mga pagliliwat na baguhon pa sana nin $1 {{PLURAL:$1|segundo|segundos}} puwedeng dae maipapahiling sa listahang ini.",
        "lag-warn-high": "Nin huli sa halangkawon na kaabalahan sa serbidor kan datos-sarayan, mga pagliliwat na baguhon pa sana nin $1 {{PLURAL:$1|segundo|segundos}} puwedeng dae maipapahiling sa listahang ini.",
-       "watchlistedit-numitems": "An saimong pigbabantayan igwang {{PLURAL:$1|1 titulo|$1 mga titulo}}, apwera kan mga páhina kan olay.",
-       "watchlistedit-noitems": "Mayong mga titulo an pigbabantayan mo.",
        "watchlistedit-normal-title": "Hirahón an pigbabantayan",
        "watchlistedit-normal-legend": "Halion an mga titulo sa pigbabantayan",
        "watchlistedit-normal-explain": "Mga sa saimong bantay-listahan ipinapahiling sa ibaba.\nSa paghali nin sarong titutlo, -tsek an kahon kasunod kaini, asin i-klik an \"{{int:Watchlistedit-normal-submit}}\".\nPuwede ka man na [[Special:EditWatchlist/raw|magliwat kan temporaryong listahan]].",
        "compare-invalid-title": "An titulo na saimong pinagsambit sarong imbalido.",
        "compare-title-not-exists": "An titulo na saimong pinagsambit bakong eksistido.",
        "compare-revision-not-exists": "An rebisyon na saimong pinagsambit bakong eksistido.",
-       "dberr-header": "Ining wiki igwa nin sarong problema",
        "dberr-problems": "Sori! Ining sityo igwang naeksperiyensiyahan na mga kakundian sa teknikal.",
        "dberr-again": "Prubaring maghalat tabi nin nagkapirang minutos asin otrohon ikarga.",
        "dberr-info": "(Dae makakontak sa serbidor kan datos-sarayan: $1)",
index 3477d65..f515637 100644 (file)
@@ -12,7 +12,8 @@
                        "Renessaince",
                        "Wizardist",
                        "Zedlik",
-                       "Тест"
+                       "Тест",
+                       "아라"
                ]
        },
        "tog-underline": "Падкрэсьліваць спасылкі:",
        "october-date": "$1 кастрычніка",
        "november-date": "$1 лістапада",
        "december-date": "$1 сьнежня",
-       "pagecategories": "{{PLURAL:$1|Катэгорыя|Катэгорыі|Катэгорыі}}",
+       "pagecategories": "{{PLURAL:$1|1=Катэгорыя|Катэгорыі}}",
        "category_header": "Старонкі ў катэгорыі «$1»",
        "subcategories": "Падкатэгорыі",
        "category-media-header": "Файлы ў катэгорыі «$1»",
-       "category-empty": "''Гэтая катэгорыя ня ўтрымлівае ні старонак, ні файлаў.''",
+       "category-empty": "<em>Гэтая катэгорыя ня ўтрымлівае ні старонак, ні файлаў.</em>",
        "hidden-categories": "{{PLURAL:$1|1=Схаваная катэгорыя|Схаваныя катэгорыі}}",
        "hidden-category-category": "Схаваныя катэгорыі",
        "category-subcat-count": "{{PLURAL:$2|1=Гэтая катэгорыя зьмяшчае наступную падкатэгорыю.|Гэтая катэгорыя зьмяшчае {{PLURAL:$1|наступную $1 падкатэгорыю|наступныя $1 падкатэгорыі|наступныя $1 падкатэгорыяў}} з $2 агулам.}}",
        "jumptonavigation": "навігацыі",
        "jumptosearch": "пошуку",
        "view-pool-error": "Прабачце, у цяперашні момант сэрвэры перагружаныя.\nЗанадта шмат удзельнікаў спрабуюць праглядзець гэтую старонку.\nКалі ласка, пачакайце і паспрабуйце зайсьці пазьней.\n\n$1",
+       "generic-pool-error": "Выбачайце, у цяперашні момант сэрвэры перагружаныя.\nЗашмат удзельнікаў спрабуе праглядзець гэтую старонку.\nКалі ласка, пачакайце перад тым, як зноў паспрабаваць загрузіць гэтую старонку.",
        "pool-timeout": "Скончыўся час чаканьня блякаваньня",
        "pool-queuefull": "Чарга запытаў поўная",
        "pool-errorunknown": "Невядомая памылка",
        "readonly_lag": "База зьвестак была аўтаматычна заблякаваная да выкананьня рэплікацыі галоўнай базы зьвестак з другаснымі",
        "internalerror": "Унутраная памылка",
        "internalerror_info": "Унутраная памылка: $1",
-       "fileappenderrorread": "Немагчыма прачытаць «$1» пад час дапаўненьня.",
-       "fileappenderror": "Не атрымалася далучыць «$1» да «$2».",
        "filecopyerror": "Немагчыма cкапіяваць файл «$1» у «$2».",
        "filerenameerror": "Немагчыма перайменаваць файл «$1» у «$2».",
        "filedeleteerror": "Немагчыма выдаліць файл «$1».",
        "directorycreateerror": "Немагчыма стварыць дырэкторыю «$1».",
        "filenotfound": "Немагчыма знайсьці файл «$1».",
-       "fileexistserror": "Немагчыма запісаць у файл «$1»: файл існуе",
        "unexpected": "Нечаканае значэньне: «$1»=«$2».",
        "formerror": "Памылка: не атрымалася адаслаць зьвесткі формы",
        "badarticleerror": "Гэтае дзеяньне немагчыма выканаць на гэтай старонцы.",
        "badtitle": "Няслушная назва",
        "badtitletext": "Запытаная назва старонкі няслушная ці пустая, альбо няслушна ўказаная міжмоўная ці інтэрвікі-назва. Яна можа ўтрымліваць сымбалі, якія нельга ўжываць у назвах.",
        "perfcached": "Наступныя зьвесткі кэшаваныя і могуць быць састарэлымі. У кэшы {{PLURAL:$1|даступны|даступныя}} ня больш за $1 {{PLURAL:$1|вынік|вынікі|вынікаў}}.",
-       "perfcachedts": "Наступныя зьвесткі кэшаваныя і апошні раз былі абноўленыя $1. У кэшы {{PLURAL:$4|даступны|даступныя}} ня больш за $4 {{PLURAL:$4|вынік|вынікаў|вынікі}}.",
+       "perfcachedts": "Наступныя зьвесткі кэшаваныя і апошні раз былі абноўленыя $1. У кэшы {{PLURAL:$4|даступны|даступныя}} ня больш за $4 {{PLURAL:$4|вынік|вынікі|вынікаў}}.",
        "querypage-no-updates": "Абнаўленьні гэтай старонкі цяпер адключаныя. Зьвесткі ня будуць абнаўляцца.",
        "viewsource": "Паказаць крыніцу",
        "viewsource-title": "Прагляд крыніцы для $1",
        "userlogin-helplink2": "Дапамога з уваходам у сыстэму",
        "userlogin-loggedin": "Вы ўжо ўвайшлі як {{GENDER:$1|$1}}.\nДля ўваходу пад іншым удзельнікам скарыстайцеся формай унізе.",
        "userlogin-createanother": "Стварыць іншы рахунак",
-       "createacct-join": "Увядзіце свае зьвесткі ніжэй.",
-       "createacct-another-join": "Увядзіце зьвесткі для новага рахунку ніжэй.",
        "createacct-emailrequired": "E-mail адрас",
        "createacct-emailoptional": "E-mail адрас (неабавязкова)",
        "createacct-email-ph": "Увядзіце ваш e-mail адрас",
        "savearticle": "Захаваць старонку",
        "preview": "Папярэдні прагляд",
        "showpreview": "Праглядзець",
-       "showlivepreview": "Хуткі папярэдні прагляд",
        "showdiff": "Паказаць зьмены",
        "anoneditwarning": "'''Папярэджаньне:''' Вы не ўвайшлі ў сыстэму. Ваш IP-адрас будзе запісаны ў гісторыі гэтай старонкі.",
        "anonpreviewwarning": "''Вы не ўвайшлі ў сыстэму. Падчас захаваньня Ваш IP-адрас будзе дададзены ў гісторыю рэдагаваньняў старонкі.''",
        "edit-gone-missing": "Немагчыма абнавіць старонку.\nПадобна, што яна была выдаленая.",
        "edit-conflict": "Канфлікт рэдагаваньняў.",
        "edit-no-change": "Вашае рэдагаваньне было праігнараванае, таму што ў тэкст не былі ўнесеныя зьмены.",
-       "postedit-confirmation": "Вашая праўка была захаваная.",
+       "postedit-confirmation-created": "Старонка была створаная.",
+       "postedit-confirmation-restored": "Старонка была адноўленая.",
+       "postedit-confirmation-saved": "Вашая праўка была захаваная.",
        "edit-already-exists": "Немагчыма стварыць новую старонку.\nЯна ўжо існуе.",
        "defaultmessagetext": "Перадвызначаны тэкст паведамленьня",
        "content-failed-to-parse": "Зьмест «$2» не адпавядае тыпу $1: $3.",
        "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)",
        "searchmenu-exists": "* Старонка '''[[$1]]'''",
        "searchmenu-new": "<strong>Стварыць старонку «[[:$1]]» у {{GRAMMAR:месны|{{SITENAME}}}}!</strong> {{PLURAL:$2|0=|Глядзіце таксама старонку, знойдзеную ў выніку пошуку.|Глядзіце таксама вынікі пошуку.}}",
        "searchprofile-articles": "Старонкі са зьместам",
-       "searchprofile-project": "Старонкі дапамогі і праекту",
        "searchprofile-images": "Мультымэдыя",
        "searchprofile-everything": "Усё",
        "searchprofile-advanced": "Пашыраны",
        "searchprofile-articles-tooltip": "Пошук у $1",
-       "searchprofile-project-tooltip": "Пошук у $1",
        "searchprofile-images-tooltip": "Пошук файлаў",
        "searchprofile-everything-tooltip": "Шукаць усюды (уключна са старонкамі абмеркаваньня)",
        "searchprofile-advanced-tooltip": "Шукаць у дадатковых прасторах назваў",
        "search-nonefound": "Супадзеньняў па запыце ня знойдзена.",
        "powersearch-legend": "Удасканалены пошук",
        "powersearch-ns": "Шукаць у прасторах назваў:",
-       "powersearch-redir": "Паказваць перанакіраваньні",
        "powersearch-togglelabel": "Пазначыць:",
        "powersearch-toggleall": "Усе",
        "powersearch-togglenone": "Нічога",
        "prefs-emailconfirm-label": "Пацьверджаньне адрасу электроннай пошты:",
        "youremail": "Адрас электроннай пошты:",
        "username": "Імя {{GENDER:$1|ўдзельніка|ўдзельніцы}}:",
-       "uid": "ID {{GENDER:$1|удзельніка|удзельніцы}}:",
        "prefs-memberingroups": "{{GENDER:$2|Удзельнік|Удзельніца}} {{PLURAL:$1|1=групы|групаў}}:",
        "prefs-registration": "Час рэгістрацыі:",
        "yourrealname": "Сапраўднае імя:",
        "prefs-advancedsearchoptions": "Дадатковыя налады",
        "prefs-advancedwatchlist": "Дадатковыя налады",
        "prefs-displayrc": "Налады паказу",
-       "prefs-displaysearchoptions": "Налады паказу",
        "prefs-displaywatchlist": "Налады паказу",
        "prefs-tokenwatchlist": "Токен",
        "prefs-diffs": "Розьніцы вэрсіяў",
        "right-move": "перанос старонак",
        "right-move-subpages": "перанос старонак разам зь іх падстаронкамі",
        "right-move-rootuserpages": "Перанос карэнных старонак удзельнікаў",
+       "right-move-categorypages": "перанос старонак катэгорыяў",
        "right-movefile": "перайменаваньне файлаў",
        "right-suppressredirect": "не ствараць перанакіраваньне са старой назвы пасьля пераносу старонкі",
        "right-upload": "загрузка файлаў",
        "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": "перазапіс гэтага файла",
        "recentchanges-legend-heading": "'''Легенда:'''",
        "recentchanges-legend-newpage": "(глядзіце таксама [[Special:NewPages|сьпіс новых старонак]])",
        "rcnotefrom": "Ніжэй знаходзяцца зьмены з <strong>$2</strong> (да <strong>$1</strong> на старонку).",
-       "rclistfrom": "Паказаць зьмены з $1",
+       "rclistfrom": "Паказаць зьмены з $2 $3",
        "rcshowhideminor": "$1 дробныя праўкі",
        "rcshowhideminor-show": "Паказаць",
        "rcshowhideminor-hide": "Схаваць",
        "uploadstash-refresh": "Абнавіць сьпіс файлаў.",
        "invalid-chunk-offset": "Няслушнае зрушэньне фрагмэнту",
        "img-auth-accessdenied": "Доступ забаронены",
-       "img-auth-nopathinfo": "Адсутнічае PATH_INFO.\nВаш сэрвэр не ўстаноўлены на пропуск гэтай інфармацыі.\nМагчма, ён працуе праз CGI і не падтрымлівае img_auth.\nГлядзіце https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "Адсутнічае PATH_INFO.\nВаш сэрвэр не ўстаноўлены на пропуск гэтай інфармацыі.\nМагчма, ён працуе праз CGI і не падтрымлівае img_auth.\nГлядзіце https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Неабходнага шляху няма ў дырэкторыі загрузкі, пазначанай у канфігурацыі.",
        "img-auth-badtitle": "Немагчыма стварыць слушную назву з «$1».",
        "img-auth-nologinnWL": "Вы не ўвайшлі ў сыстэму, а «$1» не знаходзіцца ў белым сьпісе.",
        "pageswithprop-prophidden-binary": "двайковае значэньне ўласьцівасьці схавана ($1)",
        "doubleredirects": "Двайныя перанакіраваньні",
        "doubleredirectstext": "На гэтай старонцы пададзены сьпіс перанакіраваньняў на іншыя перанакіраваньні. Кожны радок утрымлівае спасылкі на першае і другое перанакіраваньне, а таксама мэтавую старонку другога перанакіраваньня, якая звычайна зьяўляецца «сапраўднай» мэтавай старонкай, куды павіннае спасылацца першае перанакіраваньне.\n<del>Закрэсьленыя</del> элемэнты былі выпраўленыя.",
-       "double-redirect-fixed-move": "[[$1]] была перанесеная, яна цяпер перанакіроўвае на [[$2]]",
-       "double-redirect-fixed-maintenance": "Ð\92Ñ\8bпÑ\80аÑ\9eленÑ\8cне Ð¿Ð°Ð´Ð²Ð¾Ð¹Ð½Ð°Ð³Ð° Ð¿ÐµÑ\80анакÑ\96Ñ\80аванÑ\8cнÑ\8f Ð· [[$1]] Ð½Ð° [[$2]].",
+       "double-redirect-fixed-move": "[[$1]] была перанесеная.\nСтаронка аўтаматычна абноўленая і цяпер перанакіроўвае на [[$2]].",
+       "double-redirect-fixed-maintenance": "Ð\90Ñ\9eÑ\82амаÑ\82Ñ\8bÑ\87нае Ð²Ñ\8bпÑ\80аÑ\9eленÑ\8cне Ð¿Ð°Ð´Ð²Ð¾Ð¹Ð½Ð°Ð³Ð° Ð¿ÐµÑ\80анакÑ\96Ñ\80аванÑ\8cнÑ\8f Ð· [[$1]] Ð½Ð° [[$2]] Ð¿Ð°Ð´Ñ\87аÑ\81 Ñ\82Ñ\8dÑ\85нÑ\96Ñ\87нага Ð°Ð±Ñ\81лÑ\83гоÑ\9eванÑ\8cнÑ\8f.",
        "double-redirect-fixer": "Выпраўленьне перанакіраваньняў",
        "brokenredirects": "Некарэктныя перанакіраваньні",
        "brokenredirectstext": "Наступныя перанакіраваньні спасылаюцца на неіснуючыя старонкі:",
        "log-title-wildcard": "Шукаць назвы, якія пачынаюцца з гэтага тэксту",
        "showhideselectedlogentries": "Паказаць/схаваць выбраныя запісы ў журнале",
        "allpages": "Усе старонкі",
-       "alphaindexline": "ад $1 да $2",
        "nextpage": "Наступная старонка ($1)",
        "prevpage": "Папярэдняя старонка ($1)",
        "allpagesfrom": "Паказаць старонкі, пачынаючы з:",
        "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>{{{Foo}}}</code>), старонка перавышае памер <code>$wgMaxArticleSize</code>.",
+       "expensive-parserfunction-category-desc": "На старонцы ўжываецца зашмат рэсурсаёмістых функцыяў парсэру (такіх, як <code>#ifexist</code>). Глядзіце [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "broken-file-category-desc": "Катэгорыя дадаецца, калі старонка ўтрымлівае няслушную спасылку на файл (спасылку на файл, які не існуе).",
+       "hidden-category-category-desc": "Гэта катэгорыя з дададзенай меткай <code><nowiki>__HIDDENCAT__</nowiki></code> у ёй, што па змоўчаньні не адлюстроўвае яе на старонках у сьпісе катэгорыяў.",
+       "trackingcategories-nodesc": "Апісаньне адсутнічае.",
+       "trackingcategories-disabled": "Катэгорыя адключаная",
        "mailnologin": "Няма адрасу атрымальніка",
        "mailnologintext": "Вам неабходна [[Special:UserLogin|ўвайсьці ў сыстэму]] і мець пацьверджаны адрас электроннай пошты ў Вашых [[Special:Preferences|наладах]], каб дасылаць лісты іншым удзельнікам.",
        "emailuser": "Даслаць ліст",
        "watchnologin": "Вы не ўвайшлі ў сыстэму",
        "addwatch": "Дадаць ў сьпіс назіраньня",
        "addedwatchtext": "Старонка «[[:$1]]» была дададзеная да Вашага [[Special:Watchlist|сьпісу назіраньня]].\nНаступныя зьмены ў гэтай старонцы і зьвязанай зь ёю старонцы абмеркаваньняў будуць бачныя там.",
+       "addedwatchtext-short": "Старонка «$1» была дададзеная ў ваш сьпіс назіраньня.",
        "removewatch": "Выдаліць са сьпісу назіраньня",
        "removedwatchtext": "Старонка «[[:$1]]» была выдаленая з [[Special:Watchlist|Вашага сьпісу назіраньня]].",
+       "removedwatchtext-short": "Старонка «$1» была выдаленая з вашага сьпісу назіраньня.",
        "watch": "Назіраць",
        "watchthispage": "Назіраць за гэтай старонкай",
        "unwatch": "Не назіраць",
        "watchlist-details": "У Вашым сьпісе назіраньня $1 {{PLURAL:$1|старонка|старонкі|старонак}} за выключэньнем старонак абмеркаваньня.",
        "wlheader-enotif": "Апавяшчэньне па e-mail уключанае.",
        "wlheader-showupdated": "Старонкі, зьмененыя з часу вашага апошняга візыту, вылучаныя '''тоўстым''' шрыфтам.",
-       "watchmethod-recent": "прагляд апошніх зьменаў у старонках са сьпісу назіраньня",
-       "watchmethod-list": "прагляд старонак са сьпісу назіраньня дзеля апошніх зьменах",
-       "watchlistcontains": "Ваш сьпіс назіраньня зьмяшчае $1 {{PLURAL:$1|старонка|старонкі|старонак}}.",
-       "iteminvalidname": "Праблема з элемэнтам «$1», няслушная назва…",
        "wlnote2": "Ніжэй паказаныя зьмены за {{PLURAL:$1|<strong>$1</strong> гадзіну|<strong>$1</strong> гадзіны|<strong>$1</strong> гадзінаў}} на $3 $2.",
        "wlshowlast": "Паказаць: за апошнія $1 гадзінаў, $2 дзён, $3",
        "watchlist-options": "Налады сьпісу назіраньня",
        "enotif_lastvisited": "Глядзіце на $1 усе апошнія зьмены, якія адбыліся пасьля Вашага апошняга наведваньня.",
        "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             Сыстэма паведамленьняў {{GRAMMAR:родны|{{SITENAME}}}}\n\n--\nКаб зьмяніць налады абвяшчэньня праз электронную пошту, наведайце:\n{{canonicalurl:{{#special:Preferences}}}}\n\nКаб зьмяніць налады сьпісу назіраньня, наведайце:\n{{canonicalurl:{{#special:Preferences}}}}\n\nКаб выдаліць старонку з Вашага сьпісу назіраньня, наведайце:\n$UNWATCHURL\n\nЗваротная сувязь і дапамога:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Вітаем, $WATCHINGUSERNAME.\n\n$PAGEINTRO $NEWPAGE\n\nАпісаньне зьменаў: $PAGESUMMARY $PAGEMINOREDIT\n\nЗьвязацца з рэдактарам:\nпраз электронную пошту: $PAGEEDITOR_EMAIL\nпразь вікі-старонку: $PAGEEDITOR_WIKI\n\nПаведамленьні ня будуць дасылацца ў выпадку новых дзеяньняў, пакуль Вы не наведаеце гэтую старонку па ўваходзе ў сыстэму. Вы таксама можаце адключыць паведамленьні пра зьмены для ўсіх старонак з Вашага сьпісу назіраньня.\n\n             Сыстэма паведамленьняў {{GRAMMAR:родны|{{SITENAME}}}}\n\n--\nКаб зьмяніць налады абвяшчэньня праз электронную пошту, наведайце:\n{{canonicalurl:{{#special:Preferences}}}}\n\nКаб зьмяніць налады сьпісу назіраньня, наведайце:\n{{canonicalurl:{{#special:Preferences}}}}\n\nКаб выдаліць старонку з Вашага сьпісу назіраньня, наведайце:\n$UNWATCHURL\n\nЗваротная сувязь і дапамога:\n$HELPPAGE",
        "created": "створаная",
        "changed": "зьмененая",
        "deletepage": "Выдаліць старонку",
        "contributions-title": "Унёсак {{GENDER:$1|удзельніка|удзельніцы}} $1",
        "mycontris": "Унёсак",
        "contribsub2": "Для {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "Рахунак удзельніка «$1» не зарэгістраваны.",
        "nocontribs": "Ня знойдзена зьменаў, якія адпавядаюць гэтым крытэрыям.",
        "uctop": "(апошняя)",
        "month": "Ад месяца (і раней):",
        "blockip": "Заблякаваць",
        "blockip-legend": "Заблякаваць удзельніка",
        "blockiptext": "Наступная форма дазваляе заблякаваць магчымасьць рэдагаваньня з пэўнага IP-адрасу альбо імя ўдзельніка. Гэта трэба рабіць толькі дзеля прадухіленьня вандалізму і згодна з [[{{MediaWiki:Policy-url}}|правіламі]]. Пазначце ніжэй дакладную прычыну (напрыклад, пералічыце асобныя старонкі, на якіх былі парушэньні).",
-       "ipadressorusername": "IP-адрас альбо імя ўдзельніка/ўдзельніцы:",
+       "ipaddressorusername": "IP-адрас альбо імя ўдзельніка/ўдзельніцы:",
        "ipbexpiry": "Тэрмін:",
        "ipbreason": "Прычына:",
        "ipbreason-dropdown": "* Агульныя прычыны блякаваньняў\n** Даданьне ілжывай інфармацыі\n** Выдаленьне зьместу старонак\n** Спам\n** Даданьне бязглузьдзіцы\n** Абразы/пагрозы\n** Злоўжываньне некалькімі рахункамі\n** Недапушчальнае імя ўдзельніка",
        "movepagetalktext": "Старонка абмеркаваньня будзе перанесеная разам з асноўнай старонкай, '''за выключэньнем:'''\n* Не пустая старонка абмеркаваньня ўжо існуе пад новай назвай, альбо\n* Вы не паставілі адзнаку ў полі ніжэй.\n\nУ такіх выпадках Вы можаце перанесьці ці аб’яднаць старонку абмеркаваньня самастойна.",
        "movearticle": "Перанесьці старонку:",
        "moveuserpage-warning": "'''Папярэджаньне:''' Вы зьбіраецеся перанесьці старонку ўдзельніка. Калі ласка заўважце, што старонка будзе перанесеная, але імя ўдзельніка ''ня'' будзе зьмененае.",
+       "movecategorypage-warning": "<strong>Увага:</strong> вы зьбіраецеся перанесьці старонку катэгорыі. Калі ласка, заўважце, што будзе перанесеная толькі гэтая старонка, а ўсе старонкі з старой катэгорыі <em>ня</em> будуць перанесеныя ў новую.",
        "movenologintext": "Вам неабходна [[Special:UserLogin|ўвайсьці ў сыстэму]], каб перанесьці старонкі.",
        "movenotallowed": "Вы ня маеце дазволу на перанос старонак.",
        "movenotallowedfile": "Вы ня маеце правоў на перайменаваньне файлаў.",
        "cant-move-user-page": "Вы ня маеце правоў для пераносу старонак удзельнікаў (апрача падстаронак).",
        "cant-move-to-user-page": "Вы ня маеце правоў для пераносу старонкі ў прастору ўдзельніка (апрача падстаронак).",
+       "cant-move-category-page": "Вы ня маеце правоў для пераносу старонак катэгорыяў.",
+       "cant-move-to-category-page": "Вы ня маеце правоў для пераносу старонак у прастору назваў катэгорыяў.",
        "newtitle": "Новая назва:",
        "move-watch": "Назіраць за гэтай старонкай",
        "movepagebtn": "Перанесьці старонку",
        "tooltip-preferences-save": "Захаваць налады",
        "tooltip-summary": "Увядзіце кароткае апісаньне",
        "interlanguage-link-title": "$1 — $2",
-       "notacceptable": "Вікі-сэрвэр ня можа адлюстраваць зьвесткі ў выглядзе, які здольны прачытаць Ваш браўзэр.",
        "anonymous": "{{PLURAL:$1|1=Ананімны ўдзельнік ці ўдзельніца|Ананімныя ўдзельнікі і ўдзельніцы}} {{GRAMMAR:родны|{{SITENAME}}}}",
        "siteuser": "Удзельнік/удзельніца {{GRAMMAR:родны|{{SITENAME}}}} $1",
        "anonuser": "Ананімны ўдзельнік {{GRAMMAR:родны|{{SITENAME}}}} $1",
        "pageinfo-category-pages": "Колькасьць старонак",
        "pageinfo-category-subcats": "Колькасьць падкатэгорыяў",
        "pageinfo-category-files": "Колькасьць файлаў",
-       "skinname-cologneblue": "Кёльнскі смутак",
        "skinname-monobook": "Монакніга",
-       "skinname-modern": "Сучаснае",
        "skinname-vector": "Вэктар",
        "markaspatrolleddiff": "Пазначыць як «патруляваную»",
        "markaspatrolledtext": "Пазначыць гэтую старонку як «патруляваную»",
        "newimages-summary": "Гэтая спэцыяльная старонка паказвае нядаўна загружаныя файлы.",
        "newimages-legend": "Фільтар",
        "newimages-label": "Назва файла (альбо яе частка):",
-       "showhidebots": "($1 робатаў)",
+       "newimages-showbots": "Паказаць загружаныя робатамі",
        "noimages": "Выявы адсутнічаюць.",
        "ilsubmit": "Шукаць",
        "bydate": "па даце",
        "imgmultigoto": "Перайсьці на старонку $1",
        "img-lang-default": "(мова па змоўчаньні)",
        "img-lang-info": "Паказаць гэтую выяву наступнай мовай: $1. $2",
+       "img-lang-go": "Паказаць",
        "ascending_abbrev": "узраст.",
        "descending_abbrev": "зьмянш.",
        "table_pager_next": "Наступная старонка",
        "size-exabytes": "$1 ЭБ",
        "size-zetabytes": "$1 ЗБ",
        "size-yottabytes": "$1 ЁБ",
-       "livepreview-loading": "Загрузка…",
-       "livepreview-ready": "Загрузка… Гатова!",
-       "livepreview-failed": "Немагчыма ўжыць хуткі папярэдні прагляд!\nПаспрабуйце ўжыць звычайны папярэдні прагляд.",
-       "livepreview-error": "Немагчыма далучыцца да: $1 «$2».\nПаспрабуйце ўжыць звычайны папярэдні прагляд.",
        "lag-warn-normal": "Зьмены, зробленыя меней чым $1 {{PLURAL:$1|сэкунду|сэкунды|сэкундаў}} таму, могуць ня трапіць у гэты сьпіс.",
        "lag-warn-high": "У выніку значнага адставаньня ў сынхранізацыі сэрвэраў базаў зьвестак зьмены, зробленыя раней за $1 {{PLURAL:$1|сэкунду|сэкунды|сэкундаў}} таму, могуць быць не паказаныя ў гэтым сьпісе.",
-       "watchlistedit-numitems": "Ваш сьпіс назіраньня ўтрымлівае $1 {{PLURAL:$1|запіс|запісы|запісаў}}, без уліку старонак абмеркаваньня.",
-       "watchlistedit-noitems": "Ваш сьпіс назіраньня пусты.",
        "watchlistedit-normal-title": "Рэдагаваньне сьпісу назіраньня",
        "watchlistedit-normal-legend": "Выдаленьне старонак са сьпісу назіраньня",
        "watchlistedit-normal-explain": "Ніжэй паданыя старонкі з Вашага сьпісу назіраньня.\nДля выдаленьня старонкі са сьпісу пазначце адпаведныя пазыцыі і націсьніце кнопку «{{int:Watchlistedit-normal-submit}}».\nТаксама Вы можаце [[Special:EditWatchlist/raw|рэдагаваць нефарматаваны сьпіс назіраньня]].",
        "watchlistedit-raw-done": "Ваш сьпіс назіраньня быў абноўлены.",
        "watchlistedit-raw-added": "$1 {{PLURAL:$1|запіс быў дададзены|запісы былі дададзеныя|запісаў былі дададзеныя}}:",
        "watchlistedit-raw-removed": "$1 {{PLURAL:$1|запіс быў выдалены|запісы былі выдаленыя|запісаў былі выдаленыя}}:",
+       "watchlistedit-clear-title": "Чыстка сьпісу назіраньня",
+       "watchlistedit-clear-legend": "Ачысьціць сьпіс назіраньня",
+       "watchlistedit-clear-explain": "Усе старонкі будуць выдаленыя з вашага сьпісу назіраньня",
+       "watchlistedit-clear-titles": "Старонкі:",
+       "watchlistedit-clear-submit": "Ачысьціць сьпіс назіраньня (гэта незваротна!)",
        "watchlisttools-view": "Паказаць зьмены ў старонках зь сьпісу",
        "watchlisttools-edit": "Праглядзець альбо рэдагаваць сьпіс назіраньня",
        "watchlisttools-raw": "Рэдагаваць як тэкст",
        "compare-invalid-title": "Пазначаная няслушная назва.",
        "compare-title-not-exists": "Пазначаная старонка не існуе.",
        "compare-revision-not-exists": "Пазначаная вэрсія не існуе.",
-       "dberr-header": "Гэтая вікі не функцыянуе спраўна",
        "dberr-problems": "Прабачце! На гэтым сайце ўзьніклі тэхнічныя цяжкасьці.",
        "dberr-again": "Паспрабуйце пачакаць некалькі хвілінаў і абнавіць.",
        "dberr-info": "(Немагчыма злучыцца з сэрвэрам базы зьвестак: $1)",
index 8dd7164..6b26651 100644 (file)
                        "Тест",
                        "Хомелка",
                        "Чаховіч Уладзіслаў",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라",
+                       "Unomano",
+                       "Mikalai Udodau"
                ]
        },
        "tog-underline": "Падкрэсліваць спасылкі:",
@@ -31,7 +34,6 @@
        "tog-showtoolbar": "Паказваць панэль інструментаў рэдактара",
        "tog-editondblclick": "Праўка старонак па двайным пстрыку",
        "tog-editsectiononrightclick": "Правіць падраздзелы па правым пстрыку на загалоўку",
-       "tog-rememberpassword": "Памятаць уваходныя даныя ў гэтым браўзеры (не даўжэй за $1 {{PLURAL:$1|дзень|дні|дзён}})",
        "tog-watchcreations": "Дабаўляць створаныя мною старонкі і файлы ў мой спіс назірання",
        "tog-watchdefault": "Дабаўляць старонкі і файлы пасля маіх правак у мой спіс назірання",
        "tog-watchmoves": "Дабаўляць перайменаваныя мной старонкі і файлы ў мой спіс назірання",
        "readonly_lag": "База даных была аўтаматычна зачынена, каб з ёй маглі ўзгадніцца яе базы-паслядоўнікі",
        "internalerror": "Унутраная памылка",
        "internalerror_info": "Унутраная памылка: $1",
-       "fileappenderrorread": "Не ўдалося прачытаць \"$1\" пры дапісванні файла.",
-       "fileappenderror": "Не ўдалося скапіраваць файл \"$1\" у \"$2\".",
        "filecopyerror": "Не ўдалося капіраваць файл \"$1\" у \"$2\".",
        "filerenameerror": "Не ўдалося назваць файл \"$1\" назвай \"$2\".",
        "filedeleteerror": "Не ўдалося сцерці файл \"$1\".",
        "directorycreateerror": "Немагчыма стварыць тэчку \"$1\".",
        "filenotfound": "Не ўдалося знайсці файл \"$1\".",
-       "fileexistserror": "Немагчыма запісаць у файл \"$1\": файл існуе",
        "unexpected": "Нечаканае значэнне: \"$1\"=\"$2\".",
        "formerror": "Памылка: не ўдалося падаць форму",
        "badarticleerror": "Аперацыя не дазволена на гэтай старонцы.",
        "loginlanguagelabel": "Мова: $1",
        "suspicious-userlogout": "Ваш запыт на выхад быў адмоўлены, паколькі ён выглядае як накіраваны са зламанага браўзера або кэшаванне проксі-сервераў.",
        "pt-login": "Увайсці",
+       "pt-login-button": "Увайсці",
        "pt-createaccount": "Стварыць уліковы запіс",
        "pt-userlogout": "Выйсці",
        "php-mail-error-unknown": "Невядомая памылка ў функцыі PHP-пошты",
        "savearticle": "Запісаць",
        "preview": "Перадпаказ",
        "showpreview": "Як будзе",
-       "showlivepreview": "Жывы перадпаказ",
        "showdiff": "Розніца",
        "anoneditwarning": "Вы не ўвайшлі ў сістэму. Таму, калі вы запішаце старонку, у яе гісторыю трапіць ваш адрас IP.",
        "anonpreviewwarning": "''Вы не прайшлі ідэнтыфікацыю Захаванне будзе запісана з вашым IP адрасам у гісторыі правак гэтай старонкі.''",
        "edit-gone-missing": "Не ўдалося абнавіць старонку.\nЗдаецца, што яна была сцёртая.",
        "edit-conflict": "Канфлікт правак.",
        "edit-no-change": "Вашая праўка была праігнараваная, таму што не мяняўся тэкст.",
-       "postedit-confirmation": "Вашая праўка была захаваная.",
+       "postedit-confirmation-saved": "Вашая праўка была захаваная.",
        "edit-already-exists": "Не ўдалося стварыць новую старонку.\nТакая ўжо існуе.",
        "editwarning-warning": "Пераход на іншую старонку можа прывесці да страты правак, зробленых Вамі. \nКалі Вы ўвайшлі ў сістэму, Вы можаце адключыць гэта папярэджанне ў раздзеле \"{{int:prefs-editing}}\" Вашых настроек.",
        "content-model-wikitext": "вікі-тэкст",
        "searchmenu-exists": "'''На вікі ёсць старонка \"[[:$1]]\"'''",
        "searchmenu-new": "'''Стварыць на гэтай вікі старонку \"[[:$1]]\"'''",
        "searchprofile-articles": "Артыкулы",
-       "searchprofile-project": "Старонкі даведкі і праекта",
        "searchprofile-images": "Мультымедыя",
        "searchprofile-everything": "Усё",
        "searchprofile-advanced": "Складана",
        "searchprofile-articles-tooltip": "Шукаць у $1",
-       "searchprofile-project-tooltip": "Шукаць у $1",
        "searchprofile-images-tooltip": "Шукаць файлы",
        "searchprofile-everything-tooltip": "Шукаць паўсюль (таксама ў размовах)",
        "searchprofile-advanced-tooltip": "Шукаць у дадатковых прасторах назваў",
        "search-nonefound": "Нічога не было знойдзена.",
        "powersearch-legend": "Падрабязны пошук",
        "powersearch-ns": "Шукаць у прасторах назваў:",
-       "powersearch-redir": "Паказваць перасылкі (рэдырэкты)",
        "powersearch-togglelabel": "Праверце:",
        "powersearch-toggleall": "Усе",
        "powersearch-togglenone": "Няма",
        "prefs-emailconfirm-label": "Пацверджанне адрасу эл.пошты:",
        "youremail": "Эл.пошта *",
        "username": "Імя ўдзельніка:",
-       "uid": "ID удзельніка:",
        "prefs-memberingroups": "Уваходзіць у {{PLURAL:$1|групу|групы}}:",
        "prefs-registration": "Час рэгістрацыі:",
        "yourrealname": "Сапраўднае імя:",
        "prefs-advancedsearchoptions": "Пашыраныя настройкі",
        "prefs-advancedwatchlist": "Пашыраныя настройкі",
        "prefs-displayrc": "Паказ",
-       "prefs-displaysearchoptions": "Паказ",
        "prefs-displaywatchlist": "Паказ",
        "prefs-diffs": "Розніцы",
        "email-address-validity-valid": "Адрас электроннай пошты з'яўляецца сапраўдным",
        "recentchanges-label-unpatrolled": "Праўка яшчэ не атрымала адзнакі ўхваленасці (за ёй не сочыць \"патруль\")",
        "recentchanges-legend-newpage": "$1 - новая старонка",
        "rcnotefrom": "Ніжэй знаходзяцца змены з <b>$2</b> (паказана не больш чым <b>$1</b>).",
-       "rclistfrom": "Паказаць змены з $1",
+       "rclistfrom": "Паказаць змены з $3 $2",
        "rcshowhideminor": "$1 дробныя праўкі",
        "rcshowhideminor-hide": "Схаваць",
        "rcshowhidebots": "$1 робатаў",
        "logempty": "Нічога адпаведнага ў журнале не знойдзена.",
        "log-title-wildcard": "Знайсці назвы, якія пачынаюцца з гэтага тэксту",
        "allpages": "Усе старонкі",
-       "alphaindexline": "$1 да $2",
        "nextpage": "Наступная старонка ($1)",
        "prevpage": "Папярэдняя старонка ($1)",
        "allpagesfrom": "Паказваць старонкі ад:",
        "watchlist-details": "Назіраю {{PLURAL:$1|$1 старонку|$1 старонак}} без уліку размоўных.",
        "wlheader-enotif": "Працуе апавяшчанне праз эл.пошту.",
        "wlheader-showupdated": "Старонкі, якія былі зменены пасля вашага апошняга іх наведвання, паказаны '''абрысам шрыфту'''.",
-       "watchmethod-recent": "правяраем нядаўнія праўкі ў назіраных старонках",
-       "watchmethod-list": "правяраем наяўнасць нядаўніх правак ў назіраных старонках",
-       "watchlistcontains": "У вашым спісе назірання $1 {{PLURAL:$1|старонка|старонкі|старонак}}.",
-       "iteminvalidname": "Праблема са складнікам '$1', недапушчальная назва...",
+       "wlnote2": "Ніжэй паказаны змены за апошнія {{PLURAL:$1|гадзіну|<strong>$1</strong> гадзіны}}, па стане на $2, $3.",
        "wlshowlast": "Паказваць апошнія $1 гадз. $2 дзён $3",
        "watchlist-options": "Магчымасці назірання",
        "watching": "Дапісваецца ў спіс назірання...",
        "enotif_lastvisited": "Гл. $1 каб бачыць усе змены пасля вашага апошняга наведвання.",
        "enotif_lastdiff": "Гл. $1 каб бачыць гэтую мену.",
        "enotif_anon_editor": "ананімны ўдзельнік $1",
-       "enotif_body": "Паважаны(ая) $WATCHINGUSERNAME,\n\n$PAGEEDITDATE старонка праекту «{{SITENAME}}» $PAGETITLE была $CHANGEDORCREATED удзельнікам $PAGEEDITOR, гл. $PAGETITLE_URL для прагляду бягучай версіі.\n\n$NEWPAGE\n\nКароткае апісанне змены: $PAGESUMMARY $PAGEMINOREDIT\n\nЗвярнуцца да змяніўшага:\nэл. пошта: $PAGEEDITOR_EMAIL\nвікі: $PAGEEDITOR_WIKI\n\nКалі вы не наведаеце гэтую старонку, то ў выпадку яе далейшых змен апавяшчэнняў больш не будзе.\nВы можаце таксама адключыць опцыю паведамлення для ўсіх старонак у вашым спісе назірання.\n\n             Сістэма апавяшчэння {{grammar:genitive|{{SITENAME}}}}\n\n--\nЗмена наладаў апавяшчэнняў\n{{canonicalurl:{{#special:Preferences}}}}\n\nЗмена наладаў вашага спісу назіранняў\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nВыдаліць старонкі з вашага спісу назіранага\n$UNWATCHURL\n\nЗваротная сувязь і дапамога\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Паважаны(ая) $WATCHINGUSERNAME,\n\n$PAGEEDITDATE старонка праекту «{{SITENAME}}» $PAGETITLE была $CHANGEDORCREATED удзельнікам $PAGEEDITOR, гл. $PAGETITLE_URL для прагляду бягучай версіі.\n\n$NEWPAGE\n\nКароткае апісанне змены: $PAGESUMMARY $PAGEMINOREDIT\n\nЗвярнуцца да змяніўшага:\nэл. пошта: $PAGEEDITOR_EMAIL\nвікі: $PAGEEDITOR_WIKI\n\nКалі вы не наведаеце гэтую старонку, то ў выпадку яе далейшых змен апавяшчэнняў больш не будзе.\nВы можаце таксама адключыць опцыю паведамлення для ўсіх старонак у вашым спісе назірання.\n\n             Сістэма апавяшчэння {{grammar:genitive|{{SITENAME}}}}\n\n--\nЗмена наладаў апавяшчэнняў\n{{canonicalurl:{{#special:Preferences}}}}\n\nЗмена наладаў вашага спісу назіранняў\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nВыдаліць старонкі з вашага спісу назіранага\n$UNWATCHURL\n\nЗваротная сувязь і дапамога\n$HELPPAGE",
        "created": "створана",
        "changed": "зменена",
        "deletepage": "Сцерці старонку",
        "blockip": "Заблакаваць удзельніка",
        "blockip-legend": "Заблакаваць удзельніка",
        "blockiptext": "Гэты фармуляр дазваляе заблакаваць магчымасць запісу для пэўнага адрасу IP ці імя ўдзельніка.\nГэта трэба рабіць толькі дзеля засцерагання ад вандалізму і ў адпаведнасці з [[{{MediaWiki:Policy-url}}|правіламі]].\nНіжэй трэба ўпісаць канкрэтную прычыну (напрыклад, пералічваючы канкрэтныя старонкі, якія былі вандалізаваныя).",
-       "ipadressorusername": "IP-адрас ці імя ўдзельніка:",
+       "ipaddressorusername": "IP-адрас ці імя ўдзельніка:",
        "ipbexpiry": "Згасае:",
        "ipbreason": "Прычына:",
        "ipbreason-dropdown": "*Звычайныя прычыны блоку\n** Упісванне несапраўднай інфармацыі\n** Сціранне інфармацыі са старонак\n** Спамавыя спасылкі на вонкавыя сайты\n** Упісванне бессэнсоўнай інфармацыі\n** Некультурныя паводзіны/пераследаванне\n** Злоўжыванне некалькімі рахункамі\n** Недапушчальнае імя ўдзельніка",
        "monobook.css": "/* CSS, упісаны сюды, будзе дзейнічаць на браўзер кожнага чытача з актыўнай світай Monobook */",
        "common.js": "/* Яваскрыпт, упісаны сюды, будзе выконвацца для кожнага чытача, на кожным счытванні старонкі. */",
        "monobook.js": "/* Any JavaScript here will be loaded for users using the MonoBook skin */",
-       "notacceptable": "Сервер Вікі не можа прапанаваць даных у фармаце, зразумелым для вашай кліенцкай праграмы.",
        "anonymous": "Ананімны{{PLURAL:$1| ўдзельнік|я ўдзельнікі}} на пляцоўцы {{SITENAME}}",
        "siteuser": "удзельнік $1 з {{SITENAME}}",
        "anonuser": "ананімны ўдзельнік {{SITENAME}} - $1",
        "pageinfo-lasttime": "Дата апошняй праўкі",
        "pageinfo-edits": "Агульная колькасць правак",
        "pageinfo-authors": "Агульная колькасць розных аўтараў",
-       "skinname-cologneblue": "Сіні Кёльн",
        "skinname-monobook": "Манабук",
-       "skinname-modern": "Сучаснасць",
        "markaspatrolleddiff": "Пазначыць як ухваленае",
        "markaspatrolledtext": "Пазначыць старонку як ухваленую",
        "markedaspatrolled": "Пазначана як ухваленае",
        "newimages-summary": "Тут паказаныя нядаўна ўкладзеныя файлы.",
        "newimages-legend": "Фільтр",
        "newimages-label": "Назва файла (або яе частка):",
-       "showhidebots": "($1 робатаў)",
        "noimages": "Тут нічога няма.",
        "ilsubmit": "Знайсці",
        "bydate": "п. датаў",
        "autosumm-replace": "Замена старонкі на '$1'",
        "autoredircomment": "Перасылае да [[$1]]",
        "autosumm-new": "Новая старонка: '$1'",
-       "livepreview-loading": "Счытваем…",
-       "livepreview-ready": "Счытваем… Зроблена!",
-       "livepreview-failed": "Памылка жывога перадпаказу! Паспрабуйце звычайны перадпаказ.",
-       "livepreview-error": "Не ўдалося далучыцца: $1 \"$2\". Паспрабуйце звычайны перадпаказ.",
        "lag-warn-normal": "Змены, зробленыя менш за $1 {{PLURAL:$1|сек.|сек.}} назад, могуць не трапіць у гэты спіс.",
        "lag-warn-high": "З прычыны моцных затрымак на серверы баз даных, змены, зробленыя пазней чым $1 {{PLURAL:$1|сек.|сек.}} назад, могуць не трапіць у гэты спіс.",
-       "watchlistedit-numitems": "У назіраным {{PLURAL:$1|1 складнік|$1 складнікаў}}, без уліку размоўных старонак.",
-       "watchlistedit-noitems": "Нічога не назіраецца.",
        "watchlistedit-normal-title": "Спіс назірання",
        "watchlistedit-normal-legend": "Выдаленне складнікаў са спіса назірання",
        "watchlistedit-normal-explain": "Назвы старонак з ліку назіраных паказаныя ніжэй. Каб нешта сцерці, адзначце клетку побач з адпаведным радком, пасля чаго націсніце \"Выняць складнікі\". Таксама можна правіць гэты спіс непасрэдна, [[Special:EditWatchlist/raw|без афармлення]].",
        "watchlistedit-raw-done": "Спіс назірання абноўлены.",
        "watchlistedit-raw-added": "Дапісаны{{PLURAL:$1| 1 складнік|я $1 складнікаў}}:",
        "watchlistedit-raw-removed": "Выняты{{PLURAL:$1| 1 складнік|я $1 складнікаў}}:",
+       "watchlistedit-clear-done": "Ваш спіс назірання ачышчаны.",
+       "watchlisttools-clear": "Ачысціць спіс назірання",
        "watchlisttools-view": "Паказаць змяненні",
        "watchlisttools-edit": "Паказаць спіс назірання",
        "watchlisttools-raw": "Паказаць нефарматаваны спіс назірання",
        "compare-invalid-title": "Абраная вамі назва недапушчальная.",
        "compare-title-not-exists": "Не існуе названай вамі назвы.",
        "compare-revision-not-exists": "Паказанай вамі версіі не існуе.",
-       "dberr-header": "Праблема на пляцоўцы",
        "dberr-problems": "Прабачце, на пляцоўцы здарыліся тэхнічныя цяжкасці.",
        "dberr-again": "Паспрабуйце перачытаць праз некалькі хвілін.",
        "dberr-info": "(Немагчыма звязацца з серверам баз даных: $1)",
index 85019ec..1763074 100644 (file)
@@ -19,7 +19,8 @@
                        "Urhixidur",
                        "Vladimir Penov",
                        "Петър Петров",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Подчертаване на препратките:",
@@ -32,7 +33,6 @@
        "tog-showtoolbar": "Показване на инструментите за редактиране",
        "tog-editondblclick": "Редактиране на страниците чрез двойно щракване",
        "tog-editsectiononrightclick": "Възможност за редактиране на раздел при щракване с десния бутон върху заглавието му",
-       "tog-rememberpassword": "Запомяне на паролата ми в този браузър (за не повече от $1 {{PLURAL:$1|ден|дни}})",
        "tog-watchcreations": "Добавяне на създадените от мен страници и качените от мен файлове към списъка ми за наблюдение",
        "tog-watchdefault": "Добавяне на страниците, които редактирам, в списъка ми за наблюдение",
        "tog-watchmoves": "Добавяне на преместените от мен страници и файлове към списъка ми за наблюдение",
        "print": "Печат",
        "view": "Преглед",
        "edit": "Редактиране",
+       "edit-local": "Редактиране на локалното описание",
        "create": "Създаване",
+       "create-local": "Добавяне на локално описание",
        "editthispage": "Редактиране",
        "create-this-page": "Създаване на страницата",
        "delete": "Изтриване",
        "readonly_lag": "Базата от данни беше автоматично заключена, докато подчинените сървъри успеят да се съгласуват с основния сървър.",
        "internalerror": "Вътрешна грешка",
        "internalerror_info": "Вътрешна грешка: $1",
-       "fileappenderrorread": "По време на добавянето е невъзможно прочитането на „$1“.",
-       "fileappenderror": "Не можете да добавяте \"$1\" към \"$2\".",
        "filecopyerror": "Файлът „$1“ не можа да бъде копиран като „$2“.",
        "filerenameerror": "Файлът „$1“ не можа да бъде преименуван на „$2“.",
        "filedeleteerror": "Файлът „$1“ не можа да бъде изтрит.",
        "directorycreateerror": "Невъзможно е да бъде създадена директория „$1“.",
        "filenotfound": "Файлът „$1“ не беше намерен.",
-       "fileexistserror": "Невъзможност за запис във файл „$1“: файлът съществува",
        "unexpected": "Неочаквана стойност: „$1“=„$2“.",
        "formerror": "Възникна грешка при изпращане на формуляра",
        "badarticleerror": "Действието не може да се изпълни върху страницата.",
        "userlogin-helplink2": "Помощ за влизане",
        "userlogin-loggedin": "Вече сте влезли в системата като {{GENDER:$1|$1}}.\nЧрез формуляра по-долу можете да влезете като друг потребител.",
        "userlogin-createanother": "Създаване на друга сметка",
-       "createacct-join": "Въведете своите данни по-долу.",
-       "createacct-another-join": "Попълване на информацията за новата сметка",
        "createacct-emailrequired": "Адрес за електронна поща",
        "createacct-emailoptional": "Адрес за електронна поща (незадължително)",
        "createacct-email-ph": "Въведете Вашия адрес за електронна поща",
        "createacct-benefit-heading": "{{SITENAME}} се създава от хора като вас.",
        "createacct-benefit-body1": "{{PLURAL:$1|редакция|редакции}}",
        "createacct-benefit-body2": "{{PLURAL:$1|страница|страници}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|скорошен сътрудник|скорошни сътрудници}}",
        "badretype": "Въведените пароли не съвпадат.",
        "userexists": "Въведеното потребителско име вече се използва.\nИзберете друго име.",
        "loginerror": "Грешка при влизане",
        "resetpass-wrong-oldpass": "Невалидна временна или текуща парола.\nВъзможно е вече успешно да сте сменили паролата си или да сте поискали нова временна парола.",
        "resetpass-temp-password": "Временна парола:",
        "resetpass-abort-generic": "Промяната на паролата беше прекъсната от използвано разширение.",
+       "resetpass-expired": "Срокът на валидност на паролата е изтекъл. Изберете нова парола за влизане.",
        "passwordreset": "Възстановяване на парола",
        "passwordreset-text-one": "Попълването на формуляра ще доведе до възстановяване на паролата.",
        "passwordreset-text-many": "{{PLURAL:$1|За възстановяване на паролата е необходимо да се попълни едно от полетата.}}",
        "savearticle": "Съхраняване",
        "preview": "Предварителен преглед",
        "showpreview": "Предварителен преглед",
-       "showlivepreview": "Бърз предварителен преглед",
        "showdiff": "Показване на промените",
        "anoneditwarning": "'''Внимание:''' Не сте влезли в системата. В историята на страницата ще бъде записан вашият IP-адрес.",
        "anonpreviewwarning": "Внимание: Не сте влезли в системата. Ако съхраните редакцията си, тя ще бъде записана в историята на страницата с вашият IP-адрес.",
        "edit-gone-missing": "Страницата не можа да се обнови.\nВероятно междувременно е била изтрита.",
        "edit-conflict": "Редакционен конфликт.",
        "edit-no-change": "Редакцията ви беше пренебрегната, защото не съдържа промени по текста.",
-       "postedit-confirmation": "Редакцията ви беше съхранена",
+       "postedit-confirmation-saved": "Редакцията ви беше съхранена",
        "edit-already-exists": "Не можа да се създаде нова страница.\nТакава вече съществува.",
        "defaultmessagetext": "Текст на съобщението по подразбиране",
        "content-failed-to-parse": "Неуспех при анализиране на съдържанието от тип $2 за модела $1: $3",
        "search-nonefound": "Няма резултати, които да отговарят на заявката.",
        "powersearch-legend": "Разширено търсене",
        "powersearch-ns": "Търсене в именни пространства:",
-       "powersearch-redir": "Списък на пренасочванията",
        "powersearch-togglelabel": "Избор:",
        "powersearch-toggleall": "Всички",
        "powersearch-togglenone": "Никои",
        "prefs-advancedsearchoptions": "Разширени настройки",
        "prefs-advancedwatchlist": "Разширени настройки",
        "prefs-displayrc": "Настройки за показване на списъка",
-       "prefs-displaysearchoptions": "Настройки на изгледа",
        "prefs-displaywatchlist": "Видими настройки",
        "prefs-tokenwatchlist": "Маркер",
        "prefs-diffs": "Разлики",
        "recentchanges-legend-heading": "'''Легенда:'''",
        "recentchanges-legend-newpage": "(вижте също [[Special:NewPages|списъка с нови страници]])",
        "rcnotefrom": "Дадени са промените от <strong>$2</strong> (до <strong>$1</strong> показани).",
-       "rclistfrom": "Показване на промени, като се започва от $1.",
+       "rclistfrom": "Показване на промени, като се започва от $3 $2",
        "rcshowhideminor": "$1 на малки промени",
        "rcshowhideminor-show": "Показване",
        "rcshowhideminor-hide": "Скриване",
        "uploadstash-errclear": "Изчистването на файловете беше неуспешно.",
        "uploadstash-refresh": "Обновяване на списъка с файлове",
        "img-auth-accessdenied": "Достъпът е отказан",
-       "img-auth-nopathinfo": "Липсва PATH_INFO.\nВашият сървър не е конфигуриран да предава тази информация.\nТой може да е базиран на CGI и да не може да поддържа img_auth.\nВижте https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "Липсва PATH_INFO.\nВашият сървър не е конфигуриран да предава тази информация.\nТой може да е базиран на CGI и да не може да поддържа img_auth.\nВижте https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Търсеният път не е в настроената директория за качвания.",
        "img-auth-badtitle": "Грешка при изграждането на валидно заглавие от \"$1\".",
        "img-auth-nologinnWL": "Не сте влезли в системата и „$1“ не е в белия списък.",
        "watchlist-details": "{{PLURAL:$1|Една наблюдавана страница|$1 наблюдавани страници}} от списъка ви за наблюдение (без беседи).",
        "wlheader-enotif": "Известяването по е-поща е включено.",
        "wlheader-showupdated": "Страниците, които са били променени след последния път, когато сте ги посетили, са показани в '''получер'''.",
-       "watchmethod-recent": "проверка на последните редакции за наблюдавани страници",
-       "watchmethod-list": "проверка на наблюдаваните страници за скорошни редакции",
-       "watchlistcontains": "Списъкът ви за наблюдение съдържа {{PLURAL:$1|една страница|$1 страници}}.",
-       "iteminvalidname": "Проблем с „$1“, грешно име…",
        "wlshowlast": "Показване на последните $1 часа $2 дни $3",
        "watchlist-options": "Опции на списъка за наблюдение",
        "watching": "Наблюдение…",
        "enotif_lastvisited": "Преглед на всички промени след последното ви посещение: $1.",
        "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\nСистемата за известяване на {{SITENAME}}\n\n--\nПромяна на настройките за известявания чрез електронна поща може да се извърши на\n{{canonicalurl:{{#special:Preferences}}}}\n\nПромяна на настройките на списъка за наблюдение се извършва на\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nИзтриването на тази страницата от списъка за наблюдение става чрез \n$UNWATCHURL\n\nЗа обратна връзка и помощ:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Уважаеми(а) $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nРезюме на редакцията: $PAGESUMMARY $PAGEMINOREDIT\n\nВръзка с редактора:\n* електронна поща: $PAGEEDITOR_EMAIL\n* уики страница: $PAGEEDITOR_WIKI\n\nНяма да получавате други известия за последващи промени, докато не посетите страницата.\nМожете да актуализиране настройките си за този вид известия за всички страници от вашия списък за наблюдение.\n\nСистемата за известяване на {{SITENAME}}\n\n--\nПромяна на настройките за известявания чрез електронна поща може да се извърши на\n{{canonicalurl:{{#special:Preferences}}}}\n\nПромяна на настройките на списъка за наблюдение се извършва на\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nИзтриването на тази страницата от списъка за наблюдение става чрез \n$UNWATCHURL\n\nЗа обратна връзка и помощ:\n$HELPPAGE",
        "created": "създадена",
        "changed": "променена",
        "deletepage": "Изтриване",
        "blockip": "Блокиране",
        "blockip-legend": "Блокиране на потребител",
        "blockiptext": "Формулярът по-долу се използва, за да се забрани правото на писане\nна определен IP-адрес или потребител.\nТова трябва да се направи само за да се предотвратят прояви на вандализъм\nи в съответствие с [[{{MediaWiki:Policy-url}}|политиката за поведение]] в {{SITENAME}}.\nНеобходимо е да се посочи и причина за блокирането (например заглавия на страници, станали обект на вандализъм).",
-       "ipadressorusername": "IP-адрес или потребител:",
+       "ipaddressorusername": "IP-адрес или потребител:",
        "ipbexpiry": "Срок:",
        "ipbreason": "Причина:",
        "ipbreason-dropdown": "* Общи причини за блокиране\n** Въвеждане на невярна информация\n** Премахване на съдържание от страниците\n** Добавяне на спам/нежелани външни препратки\n** Въвеждане на безсмислици в страниците\n** Заплашително поведение/тормоз\n** Злупотреба с няколко потребителски сметки\n** Неприемливо потребителско име",
        "monobook.css": "/* Чрез редактиране на този файл можете да промените облика Монобук */",
        "common.js": "/* Този файл съдържа код на Джаваскрипт и се зарежда при всички потребители. */",
        "monobook.js": "/* Остаряла страница; използвайте [[MediaWiki:Common.js]] */",
-       "notacceptable": "Сървърът не може да предостави данни във формат, който да се разпознава от клиента ви.",
        "anonymous": "{{PLURAL:$1|Анонимен потребител|Анонимни потребители}}на {{SITENAME}}",
        "siteuser": "потребител на {{SITENAME}} $1",
        "anonuser": "Анонимен потребител на {{SITENAME}} $1",
        "newimages-summary": "Тази специална страница показва последно качените файлове.",
        "newimages-legend": "Име на файл",
        "newimages-label": "Име на файл (или част от него):",
-       "showhidebots": "($1 на ботове)",
        "noimages": "Няма нищо.",
        "ilsubmit": "Търсене",
        "bydate": "по дата",
        "autosumm-replace": "Заместване на съдържанието на страницата с „$1“",
        "autoredircomment": "Пренасочване към [[$1]]",
        "autosumm-new": "Нова страница: $1",
-       "livepreview-loading": "Зарежда се…",
-       "livepreview-ready": "Зарежда се… Готово!",
-       "livepreview-failed": "Бързият предварителен преглед не е възможен! Опитайте нормален предварителен преглед.",
-       "livepreview-error": "Връзката не сполучи: $1 „$2“ Опитайте нормален предварителен преглед.",
        "lag-warn-normal": "Промените от {{PLURAL:$1|последната $1 секунда|последните $1 секунди}} вероятно не са показани в списъка.",
        "lag-warn-high": "Поради голямото изоставане в сървърната синхронизация, промените от {{PLURAL:$1|последната $1 секунда|последните $1 секунди}} вероятно не са показани в списъка.",
-       "watchlistedit-numitems": "Списъкът ви за наблюдение съдържа {{PLURAL:$1|1 страница |$1 страници}} (без беседите).",
-       "watchlistedit-noitems": "Списъкът ви за наблюдение е празен.",
        "watchlistedit-normal-title": "Редактиране на списъка за наблюдение",
        "watchlistedit-normal-legend": "Премахване на записи от списъка за наблюдение",
        "watchlistedit-normal-explain": "По-долу са показани заглавията на страниците от списъка ви за наблюдение.\nЗа да премахнете страница, отбележете полето пред нея и щракнете на бутона „{{int:Watchlistedit-normal-submit}}“.\nМожете също да редактирате [[Special:EditWatchlist/raw|необработения списък за наблюдение]].",
        "compare-invalid-title": "Посоченото заглавие е невалидно",
        "compare-title-not-exists": "Посоченото заглавие не съществува.",
        "compare-revision-not-exists": "Посочената версия не съществува.",
-       "dberr-header": "Това уики има проблем",
        "dberr-problems": "Съжаляваме! Сайтът изпитва технически затруднения.",
        "dberr-again": "Изчакайте няколко минути и опитайте да презаредите.",
        "dberr-info": "(Няма достъп до сървъра с базата данни: $1)",
index 4c0d25a..290cdbb 100644 (file)
@@ -5,7 +5,8 @@
                        "Ezagren",
                        "J Subhi",
                        "Kaganer",
-                       "Riemogerz"
+                       "Riemogerz",
+                       "아라"
                ]
        },
        "tog-underline": "Garisi di bawah tautan",
@@ -18,7 +19,6 @@
        "tog-showtoolbar": "Tampaiakan bilah-pakakas babak (parlu ada JavaScript)",
        "tog-editondblclick": "Babak tutungkaran wan klik ganda (parlu ada JavaScript)",
        "tog-editsectiononrightclick": "Kawa'akan mambabak sub-hagian lawan mang-klik kanan pada judul hagian (parlu ada JavaScript)",
-       "tog-rememberpassword": "Ingatakan babuat log ulun pada panjalajah web ini (gasan salawas $1{{PLURAL:$1|hari|hahari}})",
        "tog-watchcreations": "Tambahi tungkaran nang ulun ulah ka daptar itihan",
        "tog-watchdefault": "Tambahi tungkaran nang ulun babak ka daptar itihan ulun",
        "tog-watchmoves": "Tambahi tungkaran nang ulun pindah ka daptar itihan ulun",
        "readonly_lag": "Basisdata sudah utumatis tasunduk pas server basisdata dua lagi marungkuti basisdata tatambaian",
        "internalerror": "Kasalahan di dalam",
        "internalerror_info": "Kasalahan di dalam: $1",
-       "fileappenderrorread": "Kada kawa mambaca \"$1\" parhatan manambahi.",
-       "fileappenderror": "Kada kawa mamasukakan \"$1\" ka \"$2\".",
        "filecopyerror": "Kada kawa manyalin \"$1\" ka \"$2\".",
        "filerenameerror": "Kada kawa maubah ngaran barakas \"$1\" manjadi \"$2\".",
        "filedeleteerror": "Kada kawa mahapus barakas \"$1\".",
        "directorycreateerror": "Kada kawa maulah direktori \"$1\".",
        "filenotfound": "Kada kawa maugai barakas \"$1\".",
-       "fileexistserror": "Kada kawa manulis ka barakas \"$1\": barakas sudah ada",
        "unexpected": "Nilai kada sasuai harapan: \"$1\"=\"$2\".",
        "formerror": "Kasalahan: kada kawa mangirim purmulir",
        "badarticleerror": "Palakuan ngini kada kawa dicungulakan pada tungkaran ngini.",
        "savearticle": "Simpan tungkaran",
        "preview": "Tilik",
        "showpreview": "Tampaiakan titilikan",
-       "showlivepreview": "Titilikan langsung",
        "showdiff": "Tampaiakan paubahan",
        "anoneditwarning": "'''Paringatan:''' Pian baluman babuat log.\nAlamat IP Pian akan dirakam dalam tungkaran babakan halam",
        "anonpreviewwarning": "''Pian baluman babuat log. Manyimpan akan tarakam alamat IP Pian pada sajarah bahari tungkaran ngini.''",
        "search-nonefound": "Kadada kulihan nang pas awan parmintaan.",
        "powersearch-legend": "Panggagaian mahir",
        "powersearch-ns": "Manggagai di ngaran kamar:",
-       "powersearch-redir": "Daptar paugahan",
        "powersearch-togglelabel": "Pilihi:",
        "powersearch-toggleall": "Samunyaan",
        "powersearch-togglenone": "Kadada",
        "prefs-advancedsearchoptions": "Pilihan harat",
        "prefs-advancedwatchlist": "Pilihan harat",
        "prefs-displayrc": "Pilihan tampilan",
-       "prefs-displaysearchoptions": "Pilihan tampilan",
        "prefs-displaywatchlist": "Pilihan tampilan",
        "prefs-diffs": "Bida",
        "email-address-validity-valid": "Alamat suril tacungul sah",
        "recentchanges-label-unpatrolled": "Babakan ngini baluman ta'awasi",
        "recentchanges-legend-newpage": "$1 - tungkaran puga",
        "rcnotefrom": "Di bawah ngini paubahan tumatan '''$2''' (ditampaiakan sampai '''$1''' paubahan)",
-       "rclistfrom": "Tampaiakan paubahan pahanyarnya matan $1",
+       "rclistfrom": "Tampaiakan paubahan pahanyarnya matan $3 $2",
        "rcshowhideminor": "$1 pambabakan sapalih",
        "rcshowhidebots": "$1 bot",
        "rcshowhideliu": "$1 pamakai nang babuat di log",
        "uploadstash-refresh": "Sagar'akan daptar babarakas",
        "invalid-chunk-offset": "Putungan kada sah diimbangi",
        "img-auth-accessdenied": "Ungkaian ditolak",
-       "img-auth-nopathinfo": "PATH_INFO hilang.\nServer Pian kada disetel hagan malimpatakan panjalasan ngini.\nNgini karana CGI-based wan kada manyukung img_auth.\nJanaki https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "PATH_INFO hilang.\nServer Pian kada disetel hagan malimpatakan panjalasan ngini.\nNgini karana CGI-based wan kada manyukung img_auth.\nJanaki https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Jalur nang diminta kada ta'atur lawan direktori hunggahan.",
        "img-auth-badtitle": "Kada kawa mambangun sabuah judul sah matan \"$1\".",
        "img-auth-nologinnWL": "Pian kada kawa babuat log wan '$1\" kadada dalam daptar putih.",
        "watchlist-details": "{{PLURAL:$1|$1 tungkaran|$1 tungkaran}} dalam daptar itihan Pian, kada mahitung tungkaran pamandiran.",
        "wlheader-enotif": "Suril pamadahan dipajahi.",
        "wlheader-showupdated": "Tutungkaran nang ba-ubah tumatan ilangan tauncit Pian ditampaiakan dalam '''hurup kandal'''",
-       "watchmethod-recent": "pariksa bababakan pahanyarnya gasan tungkaran nang diitihi.",
-       "watchmethod-list": "pariksa tutungkaran nang diitihi gasan bababakan pahanyarnya",
-       "watchlistcontains": "Paitihan Pian mangandung $1 {{PLURAL:$1|tungkaran|tutungkaran}}.",
-       "iteminvalidname": "Masalah awan barang '$1', bangaran kada sah...",
        "wlshowlast": "Tampaiakan $1 jam $2 hari pahabisan $3",
        "watchlist-options": "Pilihan daptar itihan",
        "watching": "Maitihi...",
        "enotif_lastvisited": "Janaki $1 gasan samunyaan paubahan mula Pian pauncitan tadi bailang.",
        "enotif_lastdiff": "Janaki $1 hagan maniringi paubahan ngini.",
        "enotif_anon_editor": "pamakai kada-bangaran $1",
-       "enotif_body": "Halo $WATCHINGUSERNAME,\n\n\nTungkaran $PAGETITLE di {{SITENAME}} sudah $CHANGEDORCREATED pada $PAGEEDITDATE ulih $PAGEEDITOR, janaki $PAGETITLE_URL gasan ralatan wayah ini.\n\n$NEWPAGE\n\nKasimpulan pambabak: $PAGESUMMARY $PAGEMINOREDIT\n\nHubungi pambabak:\nsuril: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nKami kada akan mangirim pamadahan lain amun ada paubahan labih lanjut sampai Pian mailangi tungkaran ngini.\nPian kawa jua manyetel-pulang bandira pamadahan hagan samunyaan tungkaran nang Pian itihi dalam paitihan Pian.\n\nSistem kakawalan pamadahan {{SITENAME}} Pian\n\n--\nHagan maubah setelan suril pamadahan Piann, ilangi\n{{canonicalurl:{{#special:Preferences}}}}\n\nHagan maubah setelan paitihan Pian, ilangi\n$UNWATCHURL\n\nkitihan-bulik wan pangganian labih jauh:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Halo $WATCHINGUSERNAME,\n\n\nTungkaran $PAGETITLE di {{SITENAME}} sudah $CHANGEDORCREATED pada $PAGEEDITDATE ulih $PAGEEDITOR, janaki $PAGETITLE_URL gasan ralatan wayah ini.\n\n$NEWPAGE\n\nKasimpulan pambabak: $PAGESUMMARY $PAGEMINOREDIT\n\nHubungi pambabak:\nsuril: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nKami kada akan mangirim pamadahan lain amun ada paubahan labih lanjut sampai Pian mailangi tungkaran ngini.\nPian kawa jua manyetel-pulang bandira pamadahan hagan samunyaan tungkaran nang Pian itihi dalam paitihan Pian.\n\nSistem kakawalan pamadahan {{SITENAME}} Pian\n\n--\nHagan maubah setelan suril pamadahan Piann, ilangi\n{{canonicalurl:{{#special:Preferences}}}}\n\nHagan maubah setelan paitihan Pian, ilangi\n$UNWATCHURL\n\nkitihan-bulik wan pangganian labih jauh:\n$HELPPAGE",
        "created": "ta'ulah",
        "changed": "ta'ubah",
        "deletepage": "Hapus tungkaran",
        "blockip": "Blukir pamuruk",
        "blockip-legend": "Blukir pamuruk",
        "blockiptext": "Puruk purmulir di bawah hagan mamblukir hak ungkai manulis matan sabuah alamat IP atawa ngaran-pamuruk.\nNgini dipuruk hagan mancagah vandalisma haja, wan sasuai awan [[{{MediaWiki:Policy-url}}|kabijakan]].\nIsi sabuah alasan khas di bawah (gasan cuntuh, manulisakan tutungkaran nang suah divandal)",
-       "ipadressorusername": "Alamat IP atawa ngaran pamuruk:",
+       "ipaddressorusername": "Alamat IP atawa ngaran pamuruk:",
        "ipbexpiry": "Kadaluwarsa:",
        "ipbreason": "Alasan:",
        "ipbreason-dropdown": "*Alasan awam pamblukiran\n** Mambuati panjalasan salah\n** Mambuang isi matan tutungkaran\n** Spam tautan ka luar\n** Mambuati pandiran kusung/ratik ka tutungkaran\n** Parilaku palecehan/intimidasi\n** Panyalahpurukan akun banyak\n** Ngaran-pamuruk kada-kawa-ditarima",
        "tooltip-undo": "Mamantukakan ralatan ngini wan mambuka kutak pambabakan lawan mode tilik. Alasan kawa ditambahakan di kutak kasimpulan.",
        "tooltip-preferences-save": "Simpan kakatujuan",
        "tooltip-summary": "Buati sabuah kasimpulan handap",
-       "notacceptable": "Server wiki kada kawa manyadiakan data dalam sabuah purmat nang client Pian kawa baca.",
        "anonymous": "{{PLURAL:$1|panuruk|papamuruk}} kada-bangaran {{SITENAME}}",
        "siteuser": "Pamuruk {{SITENAME}} $1",
        "anonuser": "Pamuruk kada bangaran {{SITENAME}} $1",
        "newimages-summary": "Tungkaran istimiwa ngini manampaikan babarakas nang hahanyar dihunggah.",
        "newimages-legend": "Saringan",
        "newimages-label": "Ngaran barakas (atawa sapalihnya):",
-       "showhidebots": "($1 bot)",
        "noimages": "Kadada nang dijanaki.",
        "ilsubmit": "Gagai",
        "bydate": "ulih tanggal",
        "autosumm-replace": "Mangganti isi wan ''$1''",
        "autoredircomment": "Paugahan tungkaran ka [[$1]]",
        "autosumm-new": "Ma-ulah tungkaran nang isinya ''$1''",
-       "livepreview-loading": "Ma'unggah...",
-       "livepreview-ready": "Ma'unggah...Tuntung!",
-       "livepreview-failed": "Titilikan langsung gagal!\nCubai titilikan nurmal.",
-       "livepreview-error": "Gagal tasambung: $1 \"$2\".\nCubai titilikan nurmal.",
        "lag-warn-normal": "Paubahan pahanyarnya pada $1 {{PLURAL:$1|ditik|diditik}} pinanya kada cungul di daptar ngini.",
        "lag-warn-high": "Marga pancaunya kalambatan server databasis, paubahan pahanyarnya pada {{PLURAL:$1|datik|dadatik}} pina kada ditampaiakan dalam daptar ngini.",
-       "watchlistedit-numitems": "Daptar itihan Pian baisi {{PLURAL:$1|1 judul|$1 judul}}, kada tabuat tutungkaran pamandiran.",
-       "watchlistedit-noitems": "Daptar itihan Pian kada baisi jujudul.",
        "watchlistedit-normal-title": "Babak daptar itihan",
        "watchlistedit-normal-legend": "Buang jujudul matan daptar itihan",
        "watchlistedit-normal-explain": "Jujudul dalam daptar itihan Pian ditampaiakan di bawah ngini.\nHagan mambuang sabuah judul, cintang kutak dudi ka ngini, wan klik \"{{int:Watchlistedit-normal-submit}}\".\nPian kawa jua [[Special:EditWatchlist/raw|mambabak daptar mantah]].",
        "compare-invalid-title": "Judul nang Pian bari kada sah.",
        "compare-title-not-exists": "Si judul nang Pian ajuakan kadada.",
        "compare-revision-not-exists": "Si ralatan nang Pian ajuakan kadada.",
-       "dberr-header": "Wiki ngini baisi sabuah masalah",
        "dberr-problems": "Ampun!Situs ngini mangalami kangalihan teknik.",
        "dberr-again": "Cuba hadangi babarapa manit wan muat-pulang.",
        "dberr-info": "(Kada kawa tasambung ka server databasis: $1)",
index 0c9ef0b..e5b4d77 100644 (file)
        "pool-errorunknown": "অজানা ত্রুটি",
        "aboutsite": "{{SITENAME}} বৃত্তান্ত",
        "aboutpage": "Project:বৃত্তান্ত",
-       "copyright": "$1 এর আওতায় প্রকাশিত যদি অন্য কিছু নির্ধারিত না থাকে।",
+       "copyright": "বিষয়বস্তু $1-এর আওতায় প্রকাশিত যদি না অন্য কিছু নির্ধারিত থাকে।",
        "copyrightpage": "{{ns:project}}:কপিরাইট",
        "currentevents": "সমসাময়িক ঘটনা",
        "currentevents-url": "Project:সমসাময়িক ঘটনাসমূহ",
        "readonly_lag": "ডাটাবেজ স্বয়ংক্রিয়ভাবে বন্ধ করে দেয়া হয়েছে, যাতে অধীন ডাটাবেজ সার্ভারগুলি প্রধান ডাটাবেজ সার্ভারের অবস্থায় আসতে পারে।",
        "internalerror": "আভ্যন্তরীণ ত্রুটি",
        "internalerror_info": "আভ্যন্তরীণ ত্রুটি: $1",
-       "fileappenderrorread": "জুড়ে দেওয়ার সময় \"$1\" পড়া যায়নি।",
-       "fileappenderror": "\"$1\" কে \"$2\" এর সাথে জুড়ে দেওয়া সম্ভব নয়।",
        "filecopyerror": "\"$1\" থেকে \"$2\" ফাইল কপি করা যায়নি",
        "filerenameerror": "\"$1\" ফাইলটির নাম বদলে \"$2\" করা সম্ভব হচ্ছে না।",
        "filedeleteerror": "\"$1\" ফাইলটি মুছে ফেলা সম্ভব হচ্ছে না।",
        "directorycreateerror": "\"$1\" ডাইরেক্টরি তৈরি করা যায়নি।",
        "filenotfound": "\"$1\" ফাইলটি খুঁজে পাওয়া যাচ্ছে না।",
-       "fileexistserror": "\"$1\" ফাইলে লেখা যাচ্ছে না: ফাইলটি আগেই আছে",
        "unexpected": "অপ্রত্যাশিত মান: \"$1\"=\"$2\"।",
        "formerror": "ত্রুটি: ফরমটি জমা দেওয়া যায়নি",
        "badarticleerror": "এই পাতায় এই কাজটি করা সম্ভব নয়।",
        "userlogin-helplink2": "লগইন সংক্রান্ত সাহায্য",
        "userlogin-loggedin": "আপনি বর্তমানে {{GENDER:$1|$1}} হিসাবে লগইন আছেন।\nঅন্য ব্যবহারকারী নামে লগইন করতে চাইলে নিচের ফর্মটি ব্যবহার করুন।",
        "userlogin-createanother": "আরেকটি অ্যাকাউন্ট তৈরি করুন",
-       "createacct-join": "আপনার সম্পর্কিত তথ্য নিচে যোগ করুন।",
-       "createacct-another-join": "নিচে আপনার নতুন অ্যাকাউন্টের তথ্য দিন।",
        "createacct-emailrequired": "ইমেইল ঠিকানা",
        "createacct-emailoptional": "ইমেইল ঠিকানা (ঐচ্ছিক)",
        "createacct-email-ph": "আপনার ইমেইল ঠিকানা যোগ করুন",
        "createacct-imgcaptcha-ph": "উপরে যে লেখা দেখতে পাচ্ছেন তা লিখুন",
        "createacct-submit": "আপনার অ্যাকাউন্ট তৈরি করুন",
        "createacct-another-submit": "আরেকটি অ্যাকাউন্ট তৈরি করুন",
-       "createacct-benefit-heading": "{{SITENAME}} আপনার মত লোকেরই তৈরি।",
+       "createacct-benefit-heading": "{{SITENAME}} আপনার মত লোকের দ্বারাই তৈরি।",
        "createacct-benefit-body1": "{{PLURAL:$1|টি সম্পাদনা}}",
        "createacct-benefit-body2": "{{PLURAL:$1|টি পাতা}}",
        "createacct-benefit-body3": "জন সাম্প্রতিক {{PLURAL:$1|অবদানকারী}}",
        "resetpass-abort-generic": "শব্দচাবি পরিবর্তন একটি এক্সটেনশনের কারণে স্থগিত করা হয়েছে।",
        "resetpass-expired": "আপনার পাসওয়ার্ডের মেয়াদ উত্তীর্ণ হয়েছে। অনুগ্রহ করে নতুন পাসওয়ার্ড নির্ধারণ করুন।",
        "resetpass-expired-soft": "আপনার পাসওয়ার্ডের মেয়াদ উত্তীর্ণ হয়েছে এবং আপনাকে একটি নতুন পাসওয়ার্ড নির্ধারণ করতে হবে। অনুগ্রহ করে এখনই একটি নতুন পাসওয়ার্ড নির্ধারণ করুন অথবা পরে পরিবর্তন করতে চাইলে \"{{int:resetpass-submit-cancel}}\" বাটনে ক্লিক করুন।",
+       "resetpass-validity-soft": "দয়া করে একটি নতুন শব্দচাবি নির্ধারণ করুন অথবা পরে করার জন্য \"{{int:resetpass-submit-cancel}}\" ক্লিক করুন।",
        "passwordreset": "শব্দচাবি রিসেট",
        "passwordreset-text-one": "আপনার পাসওয়ার্ড পুনরায় সেট করতে এই ফর্মটি পূরণ করুন।",
        "passwordreset-text-many": "{{PLURAL:$1|ইমেইলের মাধ্যমে একটি অস্থায়ী শব্দচাবি পেতে ঘরগুলির একটি পূরণ করুন।}}",
        "savearticle": "সংরক্ষণ",
        "preview": "প্রাকদর্শন",
        "showpreview": "প্রাকদর্শন",
-       "showlivepreview": "তাৎক্ষণিক প্রাকদর্শন",
        "showdiff": "পরিবর্তনসমূহ",
        "anoneditwarning": "আপনি লগ ইন করেননি। এই পাতার সম্পাদনার ইতিহাসে আপনার আইপি সংখ্যা সংরক্ষিত হবে।",
        "anonpreviewwarning": "আপনি লগ ইন করেননি। এই পাতার সম্পাদনার ইতিহাসে আপনার আইপি সংখ্যা সংরক্ষিত হবে।",
        "edit-gone-missing": "পাতাটি হালনাগাদ হয়নি।\nসম্ভবতঃ পাতাটি মুছে ফেলা হয়েছে।",
        "edit-conflict": "সম্পাদনা সংঘাত।",
        "edit-no-change": "আপনার সম্পাদনাটি উপেক্ষা করা হয়েছে, কারণ লেখাতে কোনো পরিবর্তন করা হয়নি।",
-       "postedit-confirmation": "আপনার সম্পাদনা সংরক্ষিত হয়েছে।",
+       "postedit-confirmation-created": "পাতাটি তৈরি হয়েছে।",
+       "postedit-confirmation-restored": "পাতাটি পুনরুদ্ধার করা হয়েছে।",
+       "postedit-confirmation-saved": "আপনার সম্পাদনা সংরক্ষিত হয়েছে।",
        "edit-already-exists": "নতুন পাতা সৃষ্টি করা যায়নি।\nপাতাটি ইতিমধ্যেই বিদ্যমান।",
        "defaultmessagetext": "আদি টেক্সট",
        "content-failed-to-parse": "$1 মডেলের জন্য $2 কন্টেন্ট পার্স করা যাচ্ছে না: $3",
        "undo-summary-username-hidden": "একজন লুকানো ব্যবহারকারী $1 রিভিশন পুনরায় ফিরিয়ে এনেছেন",
        "cantcreateaccounttitle": "অ্যাকাউন্ট তৈরি করা যাবে না",
        "cantcreateaccount-text": "[[User:$3|$3]] এই আইপি ঠিকানা('''$1''') থেকে অ্যাকাউন্ট সৃষ্টিতে বাধা দিয়েছেন।\n\n$3-এর দেয়া কারণ হল ''$2''",
+       "cantcreateaccount-range-text": "[[User:$3|$3]] কর্তৃক আইপি ঠিকানা '''$1''' ব্যাপ্তির মধ্য থেকে অ্যাকাউন্ট তৈরি করা অবরুদ্ধ করা হয়েছে। যাতে আপনার আইপি ঠিকানা ('''$4''') রয়েছে। \n\n$3 কর্তৃক ''$2'' কারণ দেখানো হয়েছে।",
        "viewpagelogs": "এই পাতার জন্য লগগুলো দেখুন",
        "nohistory": "এই পাতার কোন সম্পাদনার ইতিহাস নেই।",
        "currentrev": "সর্বশেষ সংস্করণ",
        "revdelete-show-file-confirm": "আপনি কি নিশ্চিত যে \"<nowiki>$1</nowiki>\" ফাইলের $2 তারিখের $3 টার অপসারণ লগ দেখানো হবে?",
        "revdelete-show-file-submit": "হ্যাঁ",
        "revdelete-selected-text": "[[:$2]] পাতার {{PLURAL:$1|নির্বাচিত সংশোধন|নির্বাচিত সংশোধনসমূহ}}:",
+       "revdelete-selected-file": "[[:$2]]-এর {{PLURAL:$1|নির্বাচিত ফাইল সংস্করণ|নির্বাচিত ফাইল সংস্করণগুলি}}:",
        "logdelete-selected": "{{PLURAL:$1|টি নির্বাচিত লগ-ঘটনা|টি নির্বাচিত লগ-ঘটনা}}:",
        "revdelete-confirm": "অনুগ্রহ করে নিশ্চিত করুন যে আপনি এটি করতে চাচ্ছিলেন, আপনি এর ফলাফল সম্পর্কে অবগত আছেন, এবং [[{{MediaWiki:Policy-url}}|নীতিমালার]] উপর ভিত্তি করেই এই কাজটি করছেন।",
        "revdelete-suppress-text": "নিচের বিষয়গুলোর ক্ষেত্রেই '''কেবলমাত্র'''  চাপাচাপি করা যাবে:\n* সম্ভাব্য মানহানিকর তথ্য\n* ভুল ব্যক্তিগত তথ্য\n*: ''বাসার ঠিকানা এবং ফোন নম্বর, সোসাল সিকিউরিটি নম্বর, ইত্যাদি।''",
        "searchmenu-exists": "'''এই উইকিতে \"[[:$1]]\" নামে একটি পাতা রয়েছে'''",
        "searchmenu-new": "<strong>\"[[:$1]]\" পাতাটি এই উইকিতে তৈরি করুন!</strong> {{PLURAL:$2|0=|এছাড়া আপনার অনুসন্ধানের সাথে পাওয়া পাতা দেখুন।|এছাড়া অনুসন্ধানে পাওয়া ফলাফলগুলি দেখুন।}}",
        "searchprofile-articles": "বিষয়বস্তুর পাতা",
-       "searchprofile-project": "সহায়িকা এবং প্রকল্প পাতা",
        "searchprofile-images": "মাল্টিমিডিয়া",
        "searchprofile-everything": "সমস্তকিছু",
        "searchprofile-advanced": "উচ্চতর",
        "searchprofile-articles-tooltip": "$1 এ অনুসন্ধান",
-       "searchprofile-project-tooltip": "$1 এ অনুসন্ধান",
        "searchprofile-images-tooltip": "ফাইলের জন্য অনুসন্ধান",
        "searchprofile-everything-tooltip": "সকল বিষয়বস্তু অনুসন্ধান করো (আলাপের পাতা সহ)",
        "searchprofile-advanced-tooltip": "স্বনির্ধারিত নামস্থানে অনুসন্ধান করো",
        "search-nonefound": "খোঁজকৃত পাতার সাথে মিলে যায় এমন কোনো ফলাফল নেই।",
        "powersearch-legend": "উন্নত অনুসন্ধান",
        "powersearch-ns": "নামস্থানে অনুসন্ধান করো:",
-       "powersearch-redir": "পুনঃনির্দেশনাসমূহের তালিকা",
        "powersearch-togglelabel": "পরীক্ষা:",
        "powersearch-toggleall": "সকল",
        "powersearch-togglenone": "কিছু নয়",
        "prefs-emailconfirm-label": "ই-মেইল নিশ্চিতকরণ:",
        "youremail": "ইমেইল *",
        "username": "{{GENDER:$1|ব্যবহারকারী নাম}}:",
-       "uid": "{{GENDER:$1|ব্যবহারকারী}} নং (ID):",
        "prefs-memberingroups": "{{PLURAL:$1|দলের|দলসমূহের}} {{GENDER:$2|সদস্য}}:",
        "prefs-registration": "নিবন্ধের সময়:",
        "yourrealname": "আসল নাম *",
        "prefs-advancedsearchoptions": "উচ্চতর অপশন",
        "prefs-advancedwatchlist": "উচ্চতর অপশন",
        "prefs-displayrc": "প্রদর্শনী অপশন",
-       "prefs-displaysearchoptions": "প্রদর্শনী অপশন",
        "prefs-displaywatchlist": "প্রদর্শনী অপশন",
        "prefs-tokenwatchlist": "টোকেন",
        "prefs-diffs": "পার্থক্য",
        "right-move": "পাতা সরান",
        "right-move-subpages": "পাতাগুলোকে তার উপপাতাসহ সরিয়ে নিন",
        "right-move-rootuserpages": "root ব্যবহারকারীর পাতাগুলো সরিয়ে ফেলুন",
+       "right-move-categorypages": "বিষয়শ্রেণী পাতাসমূহ স্থানান্তর করুন",
        "right-movefile": "ফাইল স্থানান্তর",
        "right-suppressredirect": "পাতা স্থানান্তরের সময় মূল পাতায় রিডাইরেক্ট তৈরী করছে না",
        "right-upload": "ফাইল আপলোড করুন",
        "action-createpage": "পাতা তৈরি করো",
        "action-createtalk": "আলাপের পাতা তৈরি করো",
        "action-createaccount": "এই ব্যবহারকারী একাউন্টটি তৈরি করো",
+       "action-history": "এই পাতার ইতিহাস দেখাও",
        "action-minoredit": "এই সম্পাদনাটি অনুল্লেখ্য হিসেবে চিহ্নিত করো",
        "action-move": "পাতাটি সরিয়ে ফেলুন",
        "action-move-subpages": "পাতাটি এবং এর উপপাতাগুলো সরিয়ে ফেলুন",
        "action-move-rootuserpages": "root ব্যবহারকারীর পাতাগুলো সরিয়ে ফেলুন",
+       "action-move-categorypages": "বিষয়শ্রেণী পাতাসমূহ স্থানান্তর করুন",
        "action-movefile": "এই ফাইলটি সরিয়ে ফেলুন",
        "action-upload": "এই ফাইল আপলোড করো",
        "action-reupload": "বিদ্যমান ফাইল প্রতিস্থাপন করো",
        "uploadstash-refresh": "ফাইলের তালিকা রিফ্রেশ করুন",
        "invalid-chunk-offset": "ত্রুটিপূর্ণ চাংক অফসেট",
        "img-auth-accessdenied": "প্রবেশাধিকার নাই",
-       "img-auth-nopathinfo": "PATH_INFO পাওয়া যাচ্ছে না।\nআপনার সার্ভার থেকে এই তথ্য পাঠানোর জন্য কনফিগার করা হয়নি।\nএটি হয়তো CGI ভিত্তিক এবং img_auth সমর্থন করে না।\nবিস্তারিত দেখুন https://www.mediawiki.org/wiki/Manual:Image_Authorization।",
+       "img-auth-nopathinfo": "PATH_INFO পাওয়া যাচ্ছে না।\nআপনার সার্ভার থেকে এই তথ্য পাঠানোর জন্য কনফিগার করা হয়নি।\nএটি হয়তো CGI ভিত্তিক এবং img_auth সমর্থন করে না।\nবিস্তারিত দেখুন https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization।",
        "img-auth-notindir": "অনুরোধকৃত পাথটি কনফিগার করা আপলোড ডিরেক্টরী নয়।",
        "img-auth-badtitle": "\"$1\" থেকে একটি সঠিক শিরনাম তৈরী করা যাচ্ছে না।",
        "img-auth-nologinnWL": "আপনি লগইন করেননি এবং \"$1\" নজরতালিকায় নাই।",
        "doubleredirects": "দুইবার করা পুনর্নির্দেশনাগুলি",
        "doubleredirectstext": "এই পাতায় এমন পাতাগুলোর তালিকা আছে, যেগুলো অন্য কোন পুনর্নির্দেশনা পাতায় পুনর্নির্দেশিত হয়েছে। প্রতিটি সারিতে প্রথম ও দ্বিতীয় পুনর্নির্দেশনার জন্য সংযোগ আছে এবং দ্বিতীয় পুনর্নির্দেশনাটির লক্ষ্য সংযোগটিও দেওয়া আছে। এই লক্ষ্য সংযোগটিই সাধারণত \"আসল\" লক্ষ্য পাতা, যেটিতে প্রথম পুনর্নির্দেশনাটি থেকে সংযোগ থাকা উচিত।\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-cascade": "শুধুমাত্র প্রপাতাকার সুরক্ষা",
        "protectedpages-noredirect": "পুনর্নির্দেশনাগুলো লুকাও",
        "protectedpagesempty": "কোন পাতা বর্তমানে এই প্যারামিটারগুলিসহ সুরক্ষিত নয়।",
+       "protectedpages-timestamp": "সময়বার্তা",
        "protectedpages-page": "পাতা",
+       "protectedpages-expiry": "মেয়াদোত্তীর্ণ হবে",
+       "protectedpages-performer": "ব্যবহারকারীকে সুরক্ষিত করা হচ্ছে",
        "protectedpages-params": "সুরক্ষা প্যারামিটার",
        "protectedpages-reason": "কারণ",
        "protectedpages-unknown-timestamp": "অজানা",
        "log-title-wildcard": "এই টেক্সট দিয়ে শুরু হওয়া শিরোনামগুলি অনুসন্ধান করা হোক",
        "showhideselectedlogentries": "নির্বাচিত লগগুলো দেখাও/লুকাও",
        "allpages": "সব পাতা",
-       "alphaindexline": "$1 হতে $2",
        "nextpage": "পরবর্তী পাতা ($1)",
        "prevpage": "পূর্ববর্তী পাতা ($1)",
        "allpagesfrom": "এই অক্ষর দিয়ে শুরু হওয়া পাতাগুলো দেখাও:",
        "listgrouprights-removegroup-self": "নিজের অ্যাকাউন্ট থেকে {{PLURAL:$2|দল|দলসমূহ}} অপসারণ: $1",
        "listgrouprights-addgroup-self-all": "নিজের অ্যাকাউন্টে সকল দল সংযোজন",
        "listgrouprights-removegroup-self-all": "নিজের অ্যাকাউন্ট থেকে সকল দল অপসারণ",
+       "listgrouprights-namespaceprotection-header": "নামস্থান নিষেধাজ্ঞাসমূহ",
        "listgrouprights-namespaceprotection-namespace": "নামস্থান",
+       "trackingcategories": "বিষয়শ্রেণীসমূহ অনুসরণ করা হচ্ছে",
+       "trackingcategories-msg": "বিষয়শ্রেণী অনুসরণ করা হচ্ছে",
        "trackingcategories-name": "বার্তা নাম",
+       "trackingcategories-nodesc": "কোন বর্ণনা নেই।",
+       "trackingcategories-disabled": "বিষয়শ্রেণীটি বিকল",
        "mailnologin": "প্রাপকের ঠিকানা নেই",
        "mailnologintext": "অন্য ব্যবহারকারীদেরকে ই-মেইল পাঠাতে হলে আপনাকে অবশ্যই আগে [[Special:UserLogin|লগ-ইন]] করতে হবে এবং ''[[Special:Preferences|আপনার পছন্দ তালিকায়]] আপনার ই-মেইল ঠিকানাটি ঠিকমত দিতে হবে।",
        "emailuser": "ইমেইল করো",
        "watchnologin": "আপনি এখনও লগ-ইন করেননি।",
        "addwatch": "নজরতালিকায় যোগ করো",
        "addedwatchtext": "\"[[:$1]]\" পাতাটি আপনার [[Special:Watchlist|নজরতালিকাতে]] যোগ করা হয়েছে।\nভবিষ্যতে এই পাতা ও এই পাতার সাথে সম্পর্কিত আলোচনা পাতায় সংঘটিত যাবতীয় পরিবর্তন এখানে তালিকাভুক্ত হবে।",
+       "addedwatchtext-short": "\"$1\" পাতাটি আপনার নজরতালিকায় যোগ করা হয়েছে।",
        "removewatch": "নজরতালিকা থেকে অপসারণ",
        "removedwatchtext": "\"[[:$1]]\" পাতাটি [[Special:Watchlist|নজর তালিকা]] থেকে অপসারিত হয়েছে।",
+       "removedwatchtext-short": "\"$1\" পাতাটি আপনার নজরতালিকা থেকে সরিয়ে নেয়া হয়েছে।",
        "watch": "নজর রাখুন",
        "watchthispage": "নজরে রাখুন",
        "unwatch": "নজর সরিয়ে নিন",
        "watchlist-details": "আপনার নজরতালিকাতে {{PLURAL:$1|$1টি পাতা}} আছে (আলাপ পাতাগুলি গণনায় না ধরে)।",
        "wlheader-enotif": "ইমেল বিজ্ঞপ্তি সক্রিয় করা আছে।",
        "wlheader-showupdated": "আপনার শেষ আগমনের পর থেকে যেসব পাতায় পরিবর্তন হয়েছে সেগুলি '''গাঢ়''' করে দেখানো হয়েছে।",
-       "watchmethod-recent": "নজরে রাখা পাতাগুলিতে সাম্প্রতিক পরিবর্তন পরীক্ষা করা হচ্ছে",
-       "watchmethod-list": "নজরে রাখা পাতাগুলিতে সাম্প্রতিক পরিবর্তন পরীক্ষা করা হচ্ছে",
-       "watchlistcontains": "আপনার নজরতালিকায় $1 টি {{PLURAL:$1|পাতা|পাতা}} রয়েছে।",
-       "iteminvalidname": "'$1'নং আইটেমে সমস্যা, অবৈধ নাম...",
        "wlnote2": "$3, $2 অনুসারে, সর্বশেষ {{PLURAL:$1|ঘণ্টার|<strong>$1</strong> ঘণ্টার}} পরিবর্তন নিচে দেয়া হয়েছে।",
        "wlshowlast": "দেখাও সর্বশেষ  $1 ঘন্টা $2 দিন $3",
        "watchlist-options": "নজর তালিকা পছন্দসমূহ",
        "enotif_lastvisited": "আপনার শেষ আগমনের পরে সংঘটিত সমস্ত পরিবর্তনের জন্য $1 দেখুন।",
        "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{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "প্রিয় $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nসম্পাদকের সারাংশ: $PAGESUMMARY $PAGEMINOREDIT\n\nসম্পাদকের সাথে যোগাযোগের উপায়:\nইমেইল: $PAGEEDITOR_EMAIL\nউইকি: $PAGEEDITOR_WIKI\n\nপাতাটির পরবর্তী পরিবর্তনগুলো জন্য আর কোন বিজ্ঞপ্তি পাঠানো হবে না, যতক্ষণ না আপনি লগ ইন করার সময় এই পাতায় ব্রাউজ করবেন। এছাড়া আপনি আপনার নজরতালিকায় রাখা সবগুলি পাতা জন্য বিজ্ঞপ্তি ফ্ল্যাগ শুরুর অবস্থায় ফিরিয়ে নিতে পারেন।\n\n{{SITENAME}} নোটিফিকেশন\n\n--\nইমেইল নোটিফিকেশন সেটিং পরিবর্তনের জন্য দেখুন\n{{canonicalurl:{{#special:Preferences}}}}\n\nআপনার নজরতালিকা সেটিংস পরিবর্তন করতে চাইলে দেখুন, \n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nনজরতালিকা থেকে কোন পাতা অপসারণ করতে চাইলে এখানে যান:\n$UNWATCHURL\n\nপ্রতিক্রিয়া জানাতে ও আরও সহযোগিতার জন্য:\n$HELPPAGE",
        "created": "তৈরী হয়েছিল",
        "changed": "পরিবর্তিত",
        "deletepage": "পাতাটি মুছে ফেলা হোক",
        "contributions-title": "$1 ব্যবহারকারীর অবদানসমূহ",
        "mycontris": "অবদান",
        "contribsub2": "{{GENDER:$3|$1}} ($2)-এর জন্য",
+       "contributions-userdoesnotexist": "ব্যবহারকারী অ্যাকাউন্ট \"$1\" অনিবন্ধিত।",
        "nocontribs": "এই শর্তগুলির সাথে মিলে যায়, এমন কোন পরিবর্তন খুঁজে পাওয়া যায়নি।",
        "uctop": "(বর্তমান)",
        "month": "এই মাস (বা তার আগে) থেকে:",
        "blockip": "ব্যবহারকারীকে বাধা দাও",
        "blockip-legend": "ব্যবহারকারীকে বাধা দেওয়া হোক",
        "blockiptext": "কোন নির্দিষ্ট আইপি ঠিকানা বা ব্যবহারকারীর লেখার অধিকারে বাধা দিতে নিচের ফর্মটি ব্যবহার করুন।\nএটি কেবলমাত্র ধ্বংসপ্রবণতা প্রতিরোধে ও [[{{MediaWiki:Policy-url}}|নীতিমালা]] মেনে সম্পাদন করা উচিত।\nনিচে একটি নির্দিষ্ট কারণ দিন (উদাহরণস্বরূপ, যেসব পাতার ধ্বংসসাধন করা হয়েছে, সেগুলি উল্লেখ করতে পারেন)।",
-       "ipadressorusername": "আইপি ঠিকানা বা ব্যবহারকারীর নাম:",
+       "ipaddressorusername": "আইপি ঠিকানা বা ব্যবহারকারীর নাম:",
        "ipbexpiry": "যখন মেয়াদোত্তীর্ণ হবে:",
        "ipbreason": "কারণ:",
        "ipbreason-dropdown": "*বাধা দানের সাধারণ কারণ\n** মিথ্যা তথ্য ঢোকানো\n** পাতা থেকে বিষয়বস্তু মুছে ফেলা\n** বাইরের কোন সাইটের সংযোগ স্প্যাম করা\n** পাতাগুলিতে অর্থহীন বিষয়বস্তু ঢোকানো\n** ভীতি উদ্রেককারী আচরণ/হয়রানি\n** একাধিক অ্যাকাউন্টের অপব্যবহার\n** ব্যবহারকারী নাম অ-গ্রহণযোগ্য",
        "movenotallowedfile": "আপনার এই ফাইলটি স্থানান্তরের অনুমতি নেই।",
        "cant-move-user-page": "ব্যবহারকারী পাতা (উপপাতা থেকে পৃথক) স্থানান্তরের আপনার অনুমতি নেই।",
        "cant-move-to-user-page": "আপনার কোনো পাতা ব্যবহারকারী পাতার স্থানান্তরের অনুমতি নেই (ব্যবহারকারী উপপাতা ব্যতিত)।",
+       "cant-move-category-page": "আপনার বিষয়শ্রেণী পাতা স্থানান্তরের অনুমতি নেই।",
+       "cant-move-to-category-page": "আপনার পাতাটিকে বিষয়শ্রেণী পাতায় স্থানান্তরের অনুমতি নেই।",
        "newtitle": "এই নতুন শিরোনামে",
        "move-watch": "এই পাতাটি নজরে রাখুন",
        "movepagebtn": "পাতা সরান",
        "imagetypemismatch": "নতুন ফাইল এক্সটেনশনটি ফাইলের ধরনের সাথে মিলছে না",
        "imageinvalidfilename": "ফাইল নামটি সঠিক নয়",
        "fix-double-redirects": "মূল শিরনামকে নির্দেশ করে এমন সকল রিডাইরেক্ট আপডেট করুন",
-       "move-leave-redirect": "রিডাà¦\87রà§\87à¦\95à§\8dà¦\9f à¦\89পà§\87à¦\95à§\8dষা à¦\95রà§\81ন",
+       "move-leave-redirect": "পà§\81নরà§\8dনিরà§\8dদà§\87শ à¦°à§\87à¦\96à§\87 à¦¦à¦¿ন",
        "protectedpagemovewarning": "'''সতর্কীকরণ:''' এই পাতাটি বন্ধ করা হয়েছে; কেবলমাত্র প্রশাসক মর্যাদার ব্যবহারকারীরাই এটি স্থানান্তর করতে পারবেন।\nআপনার সুবিধার্থে পাতাটির সাম্প্রতিক সংরক্ষণ লগের বিবরণ নিচে দেওয়া হলো।",
        "semiprotectedpagemovewarning": "'''নোট:''' এই পাতাটির ব্যবহার নিয়ন্ত্রণ করা হয়েছে তাই নিবন্ধনকৃত ব্যবহারকারী এটি স্থানান্তর করতে পারবেন।\nআপনার সুবিধার্থে পাতাটির সাম্প্রতিক সংরক্ষণ লগের বিবরণ নিচে দেওয়া হলো:",
        "move-over-sharedrepo": "== এই নামের ফাইল রয়েছে ==\n[[:$1]] নামের ফাইলটি শেয়ার্ড রিপোজিটরীতে রয়েছে। একই নামের একটি ফাইল এখানে স্থানান্তর করা হলে পূর্বের ফাইলটি প্রতিস্থাপিত হবে।",
        "importuploaderrortemp": "আমদানি ফাইলের আপলোড ব্যর্থ। একটি সাময়িক ফোল্ডার হারানো গেছে।",
        "import-parse-failure": "XML পার্স করা যায়নি",
        "import-noarticle": "ইম্পোর্ট করার মত কোন পাতা নেই!",
-       "import-nonewrevisions": "পà§\82রà§\8dবà§\87র à¦¸à¦\95ল à¦¸à¦\82সà§\8dà¦\95রণ à¦\87মà§\8dপà§\8bরà§\8dà¦\9f à¦\95রা à¦¹à¦¯à¦¼à§\87à¦\9bà§\87।",
+       "import-nonewrevisions": "à¦\95à§\8bনà§\8b à¦¸à¦\82সà§\8dà¦\95রণ à¦\86মদানà§\80 à¦\95রা à¦¹à¦¯à¦¼à¦¨à¦¿।",
        "xml-error-string": "$1 যে লাইনে $2, কলামে $3 (বাইট $4): $5",
        "import-upload": "XML ডাটা আপলোড",
        "import-token-mismatch": "সেশন ডাটা হারিয়ে গিয়েছে।\nঅনুগ্রহ করে পুনরায় চেষ্টা করুন।",
        "tooltip-preferences-save": "পছন্দ সংরক্ষণ",
        "tooltip-summary": "একটি সংক্ষিপ্ত সারাংশ দিন",
        "interlanguage-link-title": "$1 - $2",
-       "notacceptable": "আপনার ক্লায়েন্ট পড়তে পারে এমন ফরম্যাটে উইকি সার্ভার উপাত্ত সরবরাহ করতে পারছে না।",
        "anonymous": "{{SITENAME}} এর বেনামী {{PLURAL:$1|ব্যবহারকারী|ব্যবহারকারীবৃন্দ}}",
        "siteuser": "{{SITENAME}} ব্যবহারকারী $1",
        "anonuser": "{{SITENAME}} বেনামী ব্যবহারকারী $1",
        "pageinfo-category-pages": "পাতার সংখ্যা",
        "pageinfo-category-subcats": "উপবিষয়শ্রেণীর সংখ্যা",
        "pageinfo-category-files": "ফাইলের সংখ্যা",
-       "skinname-cologneblue": "কলোন ব্লু",
        "skinname-monobook": "মনোবুক",
-       "skinname-modern": "মডার্ন",
        "skinname-vector": "ভেক্টর",
        "markaspatrolleddiff": "পরীক্ষিত বলে চিহ্নিত করুন",
        "markaspatrolledtext": "এই নিবন্ধটিকে পরীক্ষিত বলে চিহ্নিত করুন",
        "newimages-summary": "এই বিশেষ পাতা সর্বশেষ আপলোডকৃত ফাইল দেখাবে।",
        "newimages-legend": "ছাকনী",
        "newimages-label": "ফাইলের নাম (অথবা এর কোন অংশ):",
-       "showhidebots": "($1 বট)",
+       "newimages-showbots": "বটের আপলোড গুলো দেখাও।",
        "noimages": "দেখার মত কিছু নেই।",
        "ilsubmit": "অনুসন্ধান",
        "bydate": "তারিখ অনুযায়ী",
        "bitrate-terabits": "$1 টিবিপিএস",
        "bitrate-petabits": "$1 পিবিপিএস",
        "bitrate-exabits": "$1 ইবিপিএস",
-       "livepreview-loading": "লোডিং...",
-       "livepreview-ready": "লোডিং… প্রস্তুত!",
-       "livepreview-failed": "তাৎক্ষণিক প্রাকদর্শন কাজ করছে না! সাধারণ প্রাকদর্শন চেষ্টা করুন।",
-       "livepreview-error": "সংযোগ প্রদানে সম্ভব নয়: $1 \"$2\"। সাধারণ প্রাকদর্শন চেষ্টা করুণ।",
        "lag-warn-normal": "$1 {{PLURAL:$1|সেকেন্ডের|সেকেন্ডের}} চেয়ে নতুন পরিবর্তন তালিকায় না-ও দেখানো হতে পারে।",
        "lag-warn-high": "ডাটাবেজ সার্ভারের অত্যধিক বিলম্বের কারণে, $1 {{PLURAL:$1|সেকেন্ডের|সেকেন্ডের}} চেয়ে নতুন পরিবর্তনগুলি এই তালিকায় না-ও দেখানো হতে পারে।",
-       "watchlistedit-numitems": "আপনার নজরতালিকায় আলোচনা পাতাগুলি বাদ দিয়ে {{PLURAL:$1|১টি শিরোনাম|$1টি শিরোনাম}} রয়েছে।",
-       "watchlistedit-noitems": "আপনার নজর তালিকায় কোন পাতার শিরোনাম নেই।",
        "watchlistedit-normal-title": "নজরতালিকা সম্পাদনা করো",
        "watchlistedit-normal-legend": "নজর তালিকা থেকে শিরোনামসমূহ মুছে ফেলো",
        "watchlistedit-normal-explain": "আপনার নজরতালিকায় রাখা পাতার শিরোনামগুলি নিচে দেখানো হয়েছে।\nকোন শিরোনাম সরিয়ে নিতে চাইলে পাশের বাক্সে টিক দিন এবং \"{{int:Watchlistedit-normal-submit}}\"-এ ক্লিক করুন।\nআপনি [[Special:EditWatchlist/raw|মূল তালিকাটিও]] সম্পাদনা করতে পারেন।",
        "watchlistedit-raw-done": "আপনার নজর তালিকা হালনাগাদ করা হয়েছে।",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 শিরোনাম|$1 শিরোনামসমূহ}} যোগ করা হয়েছে:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|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টি শিরোনাম}} সরিয়ে ফেলা হয়েছে:",
+       "watchlistedit-too-many": "এখানে প্রদর্শনের জন্য অনেক পাতা রয়েছে।",
+       "watchlisttools-clear": "নজরতালিকা পরিস্কার করুন",
        "watchlisttools-view": "সম্পর্কিত পরিবর্তনসমূহ দেখুন",
        "watchlisttools-edit": "নজর তালিকা দেখুন এবং সম্পাদনা করুন",
        "watchlisttools-raw": "অশোধিত নজরতালিকা সম্পাদনা করুন",
        "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।",
        "compare-invalid-title": "আপনার প্রদেয় শিরোনামটি সঠিক নয়।",
        "compare-title-not-exists": "আপনার কাঙ্ক্ষিত শিরোনামটি নেই।",
        "compare-revision-not-exists": "আপনার কাঙ্ক্ষিত সংস্করণটি নেই।",
-       "dberr-header": "এই উইকিতে কোন সমস্যা রয়েছে",
        "dberr-problems": " দুঃখিত! এই সাইটটি বর্তমানে কারীগরী অসুবিধার মুখোমুখি হয়েছে।",
        "dberr-again": "কয়েক মিনিট পর পুনরায় পরিদর্শনের চেষ্টা করুন।",
        "dberr-info": "(ডেটাবেজ সার্ভার $1-এর সাথে যোগাযোগ করা সম্ভব হয়নি)",
        "htmlform-no": "না",
        "htmlform-yes": "হ্যাঁ",
        "htmlform-chosen-placeholder": "অপশন নির্বাচন করুন",
+       "htmlform-cloner-create": "আরও যোগ করুন",
+       "htmlform-cloner-delete": "অপসারণ",
+       "htmlform-cloner-required": "অন্তত একটি মূল্য আবশ্যক।",
        "sqlite-has-fts": "$1 সহ পূর্ণ টেক্সট সার্চ সমর্থন",
        "sqlite-no-fts": "$1 বাদে পূর্ণ টেক্সট সার্চ সমর্থন",
        "logentry-delete-delete": "$1 কর্তৃক $3 পাতাটি অপসারিত হয়েছে",
        "api-error-overwrite": "ইতিমধ্যেই রয়েছে এমন কোনো ফাইলের প্রতিস্থাপন গ্রহণযোগ্য নয়।",
        "api-error-stashfailed": "অভ্যন্তরীণ ত্রুটি: সার্ভার অস্থায়ী ফাইলটি সংরক্ষণ করতে ব্যর্থ হয়েছে।",
        "api-error-publishfailed": "অভ্যন্তরীন ত্রুটি: সার্ভার অস্থায়ী ফাইলটি প্রকাশ করতে ব্যর্থ হয়েছে।",
+       "api-error-stasherror": "স্ট্যাশে আপলোডের সময় চিত্র আপলোডের সময় একটি সমস্যা দেখা দিয়েছে।",
        "api-error-timeout": "কাঙ্খিত সময়ের মধ্যে সার্ভারের কোন সাড়া পাওয়া যায়নি।",
        "api-error-unclassified": "একটি অজানা ত্রুটি দেখা দিয়েছে",
        "api-error-unknown-code": "অজানা ত্রুটি: \"$1\"",
index ddb8a6a..212bd56 100644 (file)
@@ -5,7 +5,8 @@
                        "Jason (on bo.wikipedia.org)",
                        "Phurbutsering",
                        "Shirayuki",
-                       "YeshiTuhden"
+                       "YeshiTuhden",
+                       "아라"
                ]
        },
        "tog-underline": "འོག་ཐིག་ཅན་ལ་སྦྲེལ་མཐུད།",
@@ -18,7 +19,6 @@
        "tog-showtoolbar": "རྩོམ་སྒྲིག་ལག་ཆ་སྟོན། (JavaScript ཡི་བརྡ་ཆད་དགོས།)",
        "tog-editondblclick": "ཤོག་ངོས་རྩོམ་སྒྲིག་བྱེད་པར་ལན་གཉིས་རྡེབ།",
        "tog-editsectiononrightclick": "དུམ་འཚམས་ཀྱི་འགོ་འརྗོད་ལ་འཐེབ་གཞོང་གཡས་པ་གནོན་ཏེ་དུམ་འཚམས་བཟོ་འཅོས་བྱེད་རོགས།",
-       "tog-rememberpassword": "ངའི་ནང་འཛུལ་བཤར་ཆས་འདི་སྟེང་(མང་མཐར་ཉིན $1 དྲན་པར་མཛོད། )",
        "tog-watchcreations": "ངས་གསར་བཟོ་བྱས་པའི་ཤོག་ངོས་དང་ཡིག་ཆ་ཡར་འཇུག་བྱས་པ་རྣམས་ངའི་དགའ་འདེམས་ཐོ་ལ་སྣོན་རོགས།",
        "tog-watchdefault": "ངས་ཁ་སྣོན་བྱས་པའི་ཤོག་ངོས་དང་ཡིག་ཆ་རྣམས་ངའི་ལྟ་ཞིབ་ཐོ་ནང་སྣོན་རོགས།",
        "tog-watchmoves": "ངས་ཤོག་ངོས་དང་ཡིག་ཆ་ཕན་ཚུན་སྤོར་བ་རྣམས་ངའི་ལྟ་ཞིབ་ཐོའི་ནང་སྣོན་རོགས།",
        "permalink": "བརྟན་འཇགས་ཀྱི་སྦྲེལ་མཐུད།",
        "print": "དཔར་བ།",
        "view": "ལྟ་བ།",
+       "view-foreign": "$1 ལ་གཟིགས་རོགས།",
        "edit": "རྩོམ་སྒྲིག",
+       "edit-local": "ས་ཁུལ་གྱི་འགྲེལ་བརྗོད་ལ་རྩོམ་སྒྲིག།",
        "create": "གསར་སྐྲུན།",
+       "create-local": "ས་ཁུལ་འགྲེལ་བརྗོད་གསར་སྐྲུན།",
        "editthispage": "ངོས་འདི་བཟོ་བཅོས་བྱེད་པ།",
        "create-this-page": "ཤོག་ངོས་འདི་སྐྲུན་པ།",
        "delete": "སུབས།",
        "jumptonavigation": "ཕྱོགས་ཁྲིད།",
        "jumptosearch": "འཚོལ།",
        "view-pool-error": "དགོངས་པ་མ་ཚོམས་རོགས། སྤྱོད་མི་མང་དག་ཞིག་གི་ཤོག་ངོས་འདིར་གཟིགས་ཞིང་འདུག་པས། གནས་སྐབས་རིང་ཞབས་ཞུ་འཕྲུལ་ཆས་ཐེག་བརྒལ་བྱས་འདུག། \nཤོག་ངོས་འདིར་བསྐྱར་དུ་མ་གཟིགས་གོང་ཡུད་ཙམ་རིང་སྒུག་རོགས་གནང། $1",
+       "generic-pool-error": "དགོངས་པ་མ་ཚོམས་རོགས། སྤྱོད་མི་མང་དག་ཞིག་གི་ཡོངས་ཁུངས་འདིར་གཟིགས་ཞིང་འདུག་པས། གནས་སྐབས་རིང་ཞབས་ཞུ་འཕྲུལ་ཆས་ཐེག་བརྒལ་བྱས་འདུག། ཡོངས་ཁུངས་འདིར་བསྐྱར་དུ་མ་གཟིགས་གོང་ཡུད་ཙམ་ཞིག་ངང་སྒུག་གནང་རོགས།།",
        "pool-timeout": "ཟྭ་རྒྱག་སྒུག་ཡུན་གྱི་དུས་ཚོད་རྫོགས་སོང།",
        "pool-queuefull": "སྤྱི་པའི་ཐེབས་རྩའི་བསྟར་པ་ཁེངས་འདུག།",
        "pool-errorunknown": "ངོས་མ་ཟིན་པའི་ནོར་འཁྲུལ།",
+       "pool-servererror": "($1) ,ཐུན་མོང་ཡ་ལན་གི་ཞབས་ཞུ་གནས་སྐབས་རིང་མིན་འདུག།",
        "aboutsite": "{{SITENAME}}ཡི་སྐོར།",
        "aboutpage": "Project:སྐོར།",
        "copyright": "དེ་མིན་གྱི་མཆན་འགྲེལ་ཡོད་ན་མ་གཏོགས། དྲ་བའི་ནང་དོན་ $1 སྟེང་དུ་ཡོད།",
        "ok": "འགྲིག",
        "retrievedfrom": "\"$1\"ལས་སླར་རྙེད་སོང།",
        "youhavenewmessages": "ཁྱེད་ལ་འཕྲིན་གསར་$1($2)ཡོད།",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|ཁྱེད་རང་ལ་}}{{PLURAL:$3|སྤྱོད་མི་གཞན་|$3 སྤྱོད་མི་}}($2)ནས་ $1 འདུག།།",
        "youhavenewmessagesmanyusers": "ཁྱེད་ལ་ $1 སྤྱོད་མི་མང་པོ་ཞིག་ནས་ ($2)འདུག།",
        "newmessageslinkplural": "{{PLURAL:$1|འཕྲིན་ཐུང་གསར་པ་ཞིག་|999= འཕྲིན་ཐུང་གསར་པ།}}",
        "newmessagesdifflinkplural": "མཐའ་མའི་ {{PLURAL:$1|འགྱུར་བཅོས།|999=འགྱུར་བཅོས།}}",
        "enterlockreason": "བཀག་སྡོམ་བྱས་དགོས་རྐྱེན་བཀོད་རོགས དེ་མིན་བཀག་སྡོམ་འདི་དུས་ཚོད་ནམ་ཞིག་ལ་བཀྲོལ་རྒྱུ་ཡིན་མིན་སོགས་བཀོད་རོགས།",
        "readonlytext": "རྨང་གཞི་གྲངས་མཛོད་འདི་གནས་སྐབས་བཀག་སྡོམ་བྱས་འདུག། ཕལ་ཆེར་རྨང་གཞི་གྲངས་མཛོད་འདི་ཉར་འཚག་བྱད་བཞིན་འདུག། \n$1 རྒྱུ་རྐྱེན་འདི་འོག་དོ་དམ་པས་བཀག་སྡོམ་བྱས་འདུག།",
        "missing-article": "གཞི་གྲངས་མཛོད་ནང་ཤོག་ངོས་ཀྱི་ཡི་གེ་བཙལ་ཐུབ་ཀྱི་མི་འདུག་པས། \"$1\" $2 \nཕལ་ཆེར་འདི་གཤམ་ཀྱི་འགོག་རྐྱེན་ལོ་རྒྱུས་སུབ་པ་འམ་དུས་ཡོལ་ཀྱི་ཁྱད་པར་སོགས་ཀྱི་རྒྱུ་རྐྱེན་ཡིན།\nགལ་སྲིད་དེ་ལྟར་མིན་ཚེ། ཕལ་ཆེར་ཁྱེད་ཀྱི་ནོར་སྐྱོན་འཙལ་རྙེད་བྱང་བས།  [[Special:ListUsers/sysop|administrator]], དྲ་རྒྱའི་ས་ཚིགས་འདི་ཐོག་ཞུ་ཡིག་འབུལ་གནང་ཡོང་བ་མཁྱེན།",
+       "readonly_lag": "གཞི་གྲངས་མཛོད་རང་འགུལ་གི་སྒོ་ཐེབས་འདུག།",
        "internalerror": "ནང་ལོག་ནོར་སྐྱོན།",
        "internalerror_info": "ནང་ལོགས་ནོར་སྐྱོན། $1",
        "filecopyerror": "\"$1\" \"$2\"ལ་འདྲ་བཤུ་བྱེད་མ་ཐུབ།",
        "filedeleteerror": "\"$1\"ཟེར་བ་སུབ་མ་ཐུབ།",
        "directorycreateerror": "དཀར་ཆག་ \"$1\" འདི་བཟོ་ཐུབ་མ་སོང།",
        "filenotfound": "\"$1\" ཟེར་བའི་ཡིག་ཆ་རྙེད་ཀྱི་མིན་འདུག།",
-       "fileexistserror": "ཡིག་ཆ་ \"$1\" འདི་འབྲི་ཐུབ་ཀྱིན་མི་འདུག། ཡིག་ཆ་འདི་བཞིན་འདི་སྔ་ནས་འདུག།",
        "unexpected": "ཡོང་མི་སྲིད་པའི་ཁྱད་ཆོས། : \"$1\"=\"$2\"",
        "formerror": "ནོར་འཁྲུལ།:འགེངས་ཤོག་འབུལ་ཐུབ་མ་སོང།",
        "badarticleerror": "ཤོག་ངོས་འདི་ཐོག་ལག་བསྟར་བྱེད་ཐུབ་ཀྱི་མ་རེད།",
        "cannotdelete": "ཤོག་ངོས་འམ་ཡིག་ཆ་ \"$1\" འདི་སུབས་ཐུབ་མ་ཀྱི་མིན་འདུག། ཕལ་ཆེར་གཞན་ཞིག་གི་སུབས་ཚར་འདུག།",
        "cannotdelete-title": "ཤོག་ངོས་ \"$1\" འདི་སུབས་ཐུབ་མ་སོང།",
        "delete-hook-aborted": "འབྲི་སུབས་འདི་བཀག་འགོག་བྱས་སོང། རྒྱུ་རྐྱེན་བྲིས་མིན་འདུག།",
+       "no-null-revision": "\"$1\" ཤོག་ངོས་འདིར་བསྐྱར་བཅོས་གསར་སྐྲུན་བྱེད་ཐུབ་མ་སོང།",
        "badtitle": "ཁ་བྱང་སྐྱོན་ཅན།",
+       "badtitletext": "རེ་སྐུལ་བྱས་པའི་ཤོག་ངོས་འདི་སྟོང་པའམ་ཡང་ན་ཁ་བྱང་ནོར་འདུག། ཁ་བྱང་འབྲི་སྟངས་ནོར་ཡོད་སྲིད།",
+       "perfcached": "གཤམ་གི་གྲངས་ཐོ་འདི་སྦས་སྐུངས་རེད་འདུག་པས་དུས་ཐོག་གསར་འཇོག་བྱེད་མི་ཐུབ། མང་མཐར་ཡང་ {{PLURAL:$1|གྲུབ་འབྲས་}} ཙམ་སྦས་སྐུངས་ནང་འདུག།",
+       "perfcachedts": "གཤམ་གི་གྲངས་ཐོ་འདི་སྦས་སྐུངས་རེད་འདུག། མཐའ་མའི་དུས་ཐོག་གསར་འཇོག་$1 མང་མཐར་ཡང་ {{PLURAL:$1|གྲུབ་འབྲས་}} ཙམ་སྦས་སྐུངས་ནང་འདུག།",
        "viewsource": "ཁོངས་ལ་ལྟ་བ།",
        "actionthrottled": "བྱ་འགུལ་ཁེགས་སོང་།",
        "namespaceprotected": "ཁྱེད་ལ་'''$1''' མིང་གནས་ནང་གི་ཤོག་ངོས་བཟོ་བཅོས་ཀྱི་ཆོག་མཆན་མེད།",
        "savearticle": "ཤོག་ངོས་ཉར་བ།",
        "preview": "སྔོན་ལྟ།",
        "showpreview": "སྔོན་ལྟ་སྟོན་ཅིག",
-       "showlivepreview": "ད་ཡོད་སྔོན་ལྟ།",
        "showdiff": "བཟོས་བཅོས་སྟོན།",
        "anoneditwarning": "'''གསལ་བརྡ།''' ཁྱེད་ཐོ་འཛུལ་བྱས་མི་འདུག ཁྱེད་ཀྱི་ IP ཁ་བྱང་ཤོག་ངོས་འདིའི་རྩོམ་སྒྲིག་ལོ་རྒྱུས་སུ་ཉར་ཚགས་བྱས་པར་འགྱུར།",
        "anonpreviewwarning": "༼ཁྱེད་རང་ཐོ་འཛུལ་བྱས་མི་འདུག ཉར་ཚགས་ཀྱིས་ཁྱེད་ཀྱི་ IP ཁ་བྱང་ཤོག་ངོས་འདིའི་རྩོམ་སྒྲིག་ལོ་རྒྱུས་སུ་ཉར་ཚགས་བྱས་པར་འགྱུར།༽",
        "search-nonefound": "ཁྱེད་ཀྱི་འདྲི་ཞིབ་དང་མཐུན་པའི་ལན་མི་འདུག་",
        "powersearch-legend": "ཞིབ་ཏུ་འཚོལ་བ།",
        "powersearch-ns": "མིང་གནས་ནང་འཚོལ་བ།",
-       "powersearch-redir": "ཁ་ཕྱོགས་གསར་བཟོ་སྟོན་པ།",
        "powersearch-toggleall": "ཚང་མ།",
        "powersearch-togglenone": "མེད།",
        "mypreferences": "དགའ་འདེམས།",
        "recentchanges-label-minor": "འདི་ནི་རྩོམ་སྒྲིག་ཕལ་བ་ཞིག་ཡིན།",
        "recentchanges-label-bot": "བཟོ་འཅོས་འདི་རང་འགུལ་འཕྲུལ་ཆས་ཀྱིས་བྱས་སོང།",
        "recentchanges-label-unpatrolled": "རྩོམ་སྒྲིག་འདི་སྐོར་ཞིབ་བྱེད་རྒྱུ་རེད་འདུག།",
-       "rclistfrom": "$1 ལས་འགོ་བཙུགས་ཏེ་འགྱུར་བཅོས་གསར་བ་སྟོན་ཅིག",
+       "rclistfrom": "$3 $2 ལས་འགོ་བཙུགས་ཏེ་འགྱུར་བཅོས་གསར་བ་སྟོན་ཅིག",
        "rcshowhideminor": "$1 རྩོམ་སྒྲིག་ཕལ་བ།",
        "rcshowhidebots": "$1 རང་འགུལ་འཕྲུལ་ཆས།",
        "rcshowhideliu": "$1 ཐོ་འགོད་སྤྱོད་མི།",
index 3927773..36e298c 100644 (file)
@@ -2,7 +2,8 @@
        "@metadata": {
                "authors": [
                        "Usingha",
-                       "Uttam Singha, Dec 2006"
+                       "Uttam Singha, Dec 2006",
+                       "아라"
                ]
        },
        "tog-underline": "লিঙ্কর তলে দুরগ দিক:",
@@ -15,7 +16,6 @@
        "tog-showtoolbar": "পতানির আতিয়ার দেহাদে (জাভাস্ক্রিপ্ট)",
        "tog-editondblclick": "দ্বিমাউ যাতিয়া পতাহান পতিক (জাভাস্ক্রিপ্ট)",
        "tog-editsectiononrightclick": "পরিচ্ছদ পতানির য়্যাথাঙহান বাতেদের গোথামগ <br /> পরিচ্ছদর চিঙনাঙর গজে যাতিলে দে (জাভাস্ক্রিপ্ট)",
-       "tog-rememberpassword": "এরে ব্রাউজারর গজে সেশনর কা খন্তাচাবি মনে থ(সর্বোচ্চ $1 {{PLURAL:$1|দিনর|দিনর}} কা)",
        "tog-watchcreations": "যে পতাহানি মি ইকরিসু অতা মর তালাবির তালিকাত থ",
        "tog-watchdefault": "যে পতাহানি মি পতাসু অতা মর তালাবির তালিকাত থ",
        "tog-watchmoves": "যে পতাহানি মি থেইকরিসু অতা মর তালাবির তালিকাত থ",
        "readonly_lag": "ডাটাবেজহান তার তুন তাই বন্ধ ইসে, তার তলর ডাটাবেজ অতাই মানক ডাটাবেজহানর লগ দরে পারবাতা বুলিয়া",
        "internalerror": "বিতরর লাল",
        "internalerror_info": "ভিতরর লাল: $1",
-       "fileappenderrorread": "জুড়িসি মিকুপহান \"$1\" পাকরে নুৱারলাঙ।",
-       "fileappenderror": "\"$1\" লগে \"$2\" মিল করানি নাইল।",
        "filecopyerror": "\"$1\" ত্ত \"$2\" ফাইল কপি করানি নুৱারলাং",
        "filerenameerror": "\"$1\" ফাইলগর নাঙহান সিলকরিয়া \"$2\" থনা নাইল।",
        "filedeleteerror": "\"$1\" ফাইলগ পুসানি সম্ভব নাইল।",
        "directorycreateerror": "\"$1\" ডাইরেক্টরিহান হঙকরানি নাইল।",
        "filenotfound": "\"$1\" ফাইলগ বিসারিয়া নাপেইলাং।",
-       "fileexistserror": "\"$1\" ফাইলগত লেহানি নুৱারলু: ফাইলগ আগেত্তই আসে",
        "unexpected": "মানহান লালুইসে: \"$1\"=\"$2\"।",
        "formerror": "লাল: ফরমহান জমা দেনা নাইল",
        "badarticleerror": "এরে পাতা এহান কাম এহান করানি সম্ভব নেই।",
        "savearticle": "পাতাহান ইতুকর",
        "preview": "আগচা",
        "showpreview": "আগচা",
-       "showlivepreview": "এপ্পাগার আগচা",
        "showdiff": "পতাসিতা দেহাদে",
        "anoneditwarning": "'''সিঙুইসঃ''' তি লগইন নাকরিসত। পতানির ইতিহাসহাত তর IP addressহান সিজিল ইতই।",
        "anonpreviewwarning": "তি লগইন নাকরিসত। পতানির ইতিহাসহাত তর IP addressহান সিজিল ইতই।",
        "search-nonefound": "তি বিসারার অহানর লগে মান্নাপাতা নাপারাঙ।",
        "powersearch-legend": "উন্নত বিসারানি",
        "powersearch-ns": "নেমস্পেসর মা বিসারা:",
-       "powersearch-redir": "বারোআলথকর লাতঙগ",
        "powersearch-togglelabel": "চেক কর:",
        "powersearch-toggleall": "হাব্বি",
        "powersearch-togglenone": "কিত্তাউ নেই",
        "recentchanges-label-bot": "সম্পাদনা এহান বটগই করিসেহানে",
        "recentchanges-label-unpatrolled": "সম্পাদনা এহান এবাকাউ পরীক্ষা করিয়া নাচাসি",
        "rcnotefrom": "তলে গেলগা '''$2''' ত্ত পতাসিতা দেনা অইল ('''$1''' পেয়া)।",
-       "rclistfrom": "নুৱাতা পতাসিতা $1 পাতাহানাত্ত চিঙকরিয়া",
+       "rclistfrom": "নুৱাতা পতাসিতা $3 $2 পাতাহানাত্ত চিঙকরিয়া",
        "rcshowhideminor": "$1 হুরু পতানিহান",
        "rcshowhidebots": "$1 বটগি",
        "rcshowhideliu": "$1 হমাসি আতাকুরা",
        "tags-hitcount-header": "ট্যাগর সিলকরানি",
        "tags-edit": "পতা",
        "tags-hitcount": "$1 {{PLURAL:$1|ফারাক|ফারাকহানি}}",
-       "dberr-header": "উইকি এহানাত সমস্যা ইসে",
        "dberr-problems": "ঙাক্করে দিবাঙ! সাইট এহানাত টেকনিক্যাল সমস্যা ইসে।",
        "dberr-again": "রিলোড আনার কা ডান্ড আহান বাসা।",
        "dberr-info": "(ডাটা সার্ভারর লগে যোগাযোগ নেয়সে: $1)",
index 1d04501..4a6d6ce 100644 (file)
@@ -13,7 +13,8 @@
                        "Nemo bis",
                        "VIGNERON",
                        "Y-M D",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Liammoù islinennet",
        "readonly_lag": "Stanket eo bet ar bank roadennoù ent emgefre p'emañ an eilservijerioù oc'h adpakañ o dale e-keñver ar pennservijer",
        "internalerror": "Fazi diabarzh",
        "internalerror_info": "Fazi diabarzh : $1",
-       "fileappenderrorread": "Dibosupl eo lenn \"$1\" e-pad an ensoc'hañ.",
-       "fileappenderror": "Dibosupl ouzhpennañ « $1 » da « $2 ».",
        "filecopyerror": "Dibosupl eilañ \"$1\" war-du \"$2\".",
        "filerenameerror": "Dibosupl da adenvel « $1 » e « $2 ».",
        "filedeleteerror": "Dibosupl eo diverkañ « $1 ».",
        "directorycreateerror": "N'eus ket bet gallet krouiñ kavlec'h \"$1\".",
        "filenotfound": "N'haller ket kavout ar restr \"$1\".",
-       "fileexistserror": "Dibosupl skrivañ war ar restr \"$1\": bez'ez eus eus ar restr-se dija",
        "unexpected": "Talvoudenn dic'hortoz : \"$1\"=\"$2\".",
        "formerror": "Fazi: Dibosupl eo kinnig ar furmskrid",
        "badarticleerror": "N'haller ket seveniñ an ober-mañ war ar bajenn-mañ.",
        "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",
-       "createacct-join": "Skrivit ho titouroù amañ dindan.",
-       "createacct-another-join": "Ebarzhiñ titouroù ar gont nevez amañ dindan.",
        "createacct-emailrequired": "Chomlec'h postel",
        "createacct-emailoptional": "Chomlec'h postel (direizh)",
        "createacct-email-ph": "Skrivit ho chomlec'h postel",
        "resetpass-submit-loggedin": "Cheñch ger-tremen",
        "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-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ñ.",
        "savearticle": "Enrollañ ar bajenn",
        "preview": "Rakwelet",
        "showpreview": "Rakwelet",
-       "showlivepreview": "Rakwelet prim",
        "showdiff": "Diskouez ar c'hemmoù",
        "anoneditwarning": "'''Diwallit :''' N'oc'h ket kevreet. \nHo chomlec'h IP eo a vo enrollet war istor kemmoù ar bajenn-mañ.",
        "anonpreviewwarning": "''N'oc'h ket kevreet. Enrollañ a lakao war-wel ho chomlec'h IP e istor kemmoù ar bajenn.''",
        "edit-gone-missing": "Dibosupl hizivaat ar bajenn.\nDiverket eo bet evit doare.",
        "edit-conflict": "Tabut kemmañ.",
        "edit-no-change": "N'eo ket bet kemeret ho tegasadenn e kont rak ne oa ket bet kemmet netra en destenn.",
-       "postedit-confirmation": "Enrollet eo bet ho kemmoù.",
+       "postedit-confirmation-created": "Krouet eo bet ar bajenn.",
+       "postedit-confirmation-restored": "Adsavet eo bet ar bajenn.",
+       "postedit-confirmation-saved": "Enrollet eo bet ho kemmoù.",
        "edit-already-exists": "N'eus ket bet gallet krouiñ ur bajenn nevez.\nKrouet e oa bet c'hoazh.",
        "defaultmessagetext": "Testenn dre ziouer",
        "content-failed-to-parse": "C'hwitet eo dielfennadur endalc'had $2 evit ar patrom $1: $3",
        "revdelete-no-file": "N'eus ket eus ar restr spisaet ganeoc'h.",
        "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|Darvoud eus ar marilh diuzet}} :",
+       "logdelete-selected": "{{PLURAL:$1|Darvoud eus ar marilh diuzet}} :",
        "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",
        "search-nonefound": "An enklask-mañ ne zisoc'h war netra.",
        "powersearch-legend": "Klask araokaet",
        "powersearch-ns": "Klask en esaouennoù anv :",
-       "powersearch-redir": "Roll an adkasoù",
        "powersearch-togglelabel": "Dibab :",
        "powersearch-toggleall": "An holl",
        "powersearch-togglenone": "Hini ebet",
        "prefs-emailconfirm-label": "Kadarnaat ar postel :",
        "youremail": "Postel :",
        "username": "{{GENDER:$1|Anv implijer|Anv implijerez}}:",
-       "uid": "{{GENDER:$1|Niv. identelezh an implijer|Niv. identelezh an implijerez}}:",
        "prefs-memberingroups": "{{GENDER:$2|Ezel}} eus {{PLURAL:$1|ar strollad|ar strolladoù}} :",
        "prefs-registration": "Deiziad enskrivañ :",
        "yourrealname": "Anv gwir*",
        "prefs-advancedsearchoptions": "Dibarzhioù araokaet",
        "prefs-advancedwatchlist": "Dibarzhioù araokaet",
        "prefs-displayrc": "Dibarzhioù diskwel",
-       "prefs-displaysearchoptions": "Dibarzhioù diskwel",
        "prefs-displaywatchlist": "Dibarzhioù diskwel",
        "prefs-tokenwatchlist": "Jedouer",
        "prefs-diffs": "Diforc'hioù",
        "recentchanges-legend-heading": "'''Alc'hwez :'''",
        "recentchanges-legend-newpage": "(gwelet ivez [[Special:NewPages|roll ar pajennoù nevez]])",
        "rcnotefrom": "Setu aze roll ar c'hemmoù c'hoarvezet abaoe an <strong>$2</strong> (<strong>$1</strong> d'ar muiañ).",
-       "rclistfrom": "Diskouez ar c'hemmoù diwezhañ abaoe an $1.",
+       "rclistfrom": "Diskouez ar c'hemmoù diwezhañ abaoe an $3 $2",
        "rcshowhideminor": "$1 ar c'hemmoù dister",
        "rcshowhideminor-show": "Diskouez",
        "rcshowhideminor-hide": "Kuzhat",
        "uploadstash-refresh": "Freskaat roll ar restroù",
        "invalid-chunk-offset": "Direizh eo offset ar rannad",
        "img-auth-accessdenied": "Moned nac'het",
-       "img-auth-nopathinfo": "Mankout a ra ar PATH_INFO.\nN'eo ket kefluniet ho servijer evit reiñ an titour-mañ.\nMarteze eo diazezet war CGI ha n'hall ket skorañ img_auth.\nGwelet https://www.mediawiki.org/wiki/Manual:Image_Authorization",
+       "img-auth-nopathinfo": "Mankout a ra ar PATH_INFO.\nN'eo ket kefluniet ho servijer evit reiñ an titour-mañ.\nMarteze eo diazezet war CGI ha n'hall ket skorañ img_auth.\nGwelet https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization",
        "img-auth-notindir": "N'emañ ket an hent merket er c'havlec'h enporzhiañ kefluniet.",
        "img-auth-badtitle": "Dibosupl krouiñ un titl reizh adalek \"$1\".",
        "img-auth-nologinnWL": "N'oc'h ket kevreet ha n'emañ ket \"$1\" war ar roll gwenn",
        "pageswithprop-legend": "Pajennoù gant ur perzh pajenn",
        "pageswithprop-prop": "Anv ar perzh :",
        "pageswithprop-submit": "Mont",
+       "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ñ",
        "log-title-wildcard": "Klask an titloù a grog gant an destenn-mañ",
        "showhideselectedlogentries": "Diskouez/kuzhat penngerioù ar marilh bet diuzet",
        "allpages": "An holl bajennoù",
-       "alphaindexline": "$1 da $2",
        "nextpage": "Pajenn war-lerc'h ($1)",
        "prevpage": "Pajenn gent ($1)",
        "allpagesfrom": "Diskouez ar pajennoù adal :",
        "watchlist-details": "Lakaet hoc'h eus {{PLURAL:$1|$1 bajenn|$1 pajenn}} dindan evezh, 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",
-       "watchmethod-recent": "Gwiriañ ar c'hemmoù diwezhañ er pajennoù dindan evezh",
-       "watchmethod-list": "Gwiriañ ar c'hemmoù diwezhañ evit ar pajennoù evezhiet",
-       "watchlistcontains": "$1 {{PLURAL:$1|pajenn|pajenn}} zo en ho rollad evezhiañ",
-       "iteminvalidname": "Ur gudenn zo gant ar pennad « $1 » : n'eo ket mat e anv...",
        "wlshowlast": "Diskouez an $1 eurvezh $2 devezh diwezhañ $3",
        "watchlist-options": "Dibarzhioù ar roll evezhiañ",
        "watching": "Heuliet...",
        "enotif_lastvisited": "Sellet ouzh $1 evit gwelet an holl gemmoù abaoe ho selladenn ziwezhañ.",
        "enotif_lastdiff": "Gwelet $1 evit sellet ouzh ar c'hemm-mañ.",
        "enotif_anon_editor": "implijer dizanv $1",
-       "enotif_body": "$WATCHINGUSERNAME ker,\n\n$CHANGEDORCREATED eo bet pajenn $PAGETITLE {{SITENAME}} gant $PAGEEDITOR d'an $PAGEEDITDATE gwelet $PAGETITLE_URL evit gwelet ar stumm red.\n\n$NEWPAGE\n\nDiverrañ an aozer : $PAGESUMMARY $PAGEMINOREDIT\n\nMont e darempred gant an aozer :\npostel: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nNemet ez afec'h da welet ar bajenn end-eeun, ne vo kemenn all ebet ma vez kemmet pelloc'h.\nGallout a rit nevesaat doare ar pennadoù evezhiet ganeoc'h en ho rollad evezhiañ ivez.\n\n            Ho reizhiad kemenn {{SITENAME}} muiañ karet\n\n--\nEvit kemmañ arventennoù ho kemennoù dre bostel, sellit ouzh\n{{canonicalurl:{{#special:Preferences}}}}\n\nEvit kemmañ doare ho rollad evezhiañ, sellit ouzh\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nEvit dilemel ar bajenn eus ho rollad evezhiañ, sellit ouzh\n$UNWATCHURL\n\nEvezhiadennoù ha skoazell pelloc'h :\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "$WATCHINGUSERNAME ker,\n\n$CHANGEDORCREATED eo bet pajenn $PAGETITLE {{SITENAME}} gant $PAGEEDITOR d'an $PAGEEDITDATE gwelet $PAGETITLE_URL evit gwelet ar stumm red.\n\n$NEWPAGE\n\nDiverrañ an aozer : $PAGESUMMARY $PAGEMINOREDIT\n\nMont e darempred gant an aozer :\npostel: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nNemet ez afec'h da welet ar bajenn end-eeun, ne vo kemenn all ebet ma vez kemmet pelloc'h.\nGallout a rit nevesaat doare ar pennadoù evezhiet ganeoc'h en ho rollad evezhiañ ivez.\n\n            Ho reizhiad kemenn {{SITENAME}} muiañ karet\n\n--\nEvit kemmañ arventennoù ho kemennoù dre bostel, sellit ouzh\n{{canonicalurl:{{#special:Preferences}}}}\n\nEvit kemmañ doare ho rollad evezhiañ, sellit ouzh\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nEvit dilemel ar bajenn eus ho rollad evezhiañ, sellit ouzh\n$UNWATCHURL\n\nEvezhiadennoù ha skoazell pelloc'h :\n$HELPPAGE",
        "created": "Krouet",
        "changed": "kemmet",
        "deletepage": "Diverkañ ur bajenn",
        "contributions-title": "Degasadennoù an implijer evit $1",
        "mycontris": "Ma degasadennoù",
        "contribsub2": "Evit {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "N'eo ket enrollet ar gont implijer \"$1\".",
        "nocontribs": "N'eus bet kavet kemm ebet o klotañ gant an dezverkoù-se.",
        "uctop": "(red)",
        "month": "Abaoe miz (hag a-raok) :",
        "blockip": "Stankañ ur chomlec'h IP",
        "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).",
-       "ipadressorusername": "Chomlec'h IP pe anv implijer",
+       "ipaddressorusername": "Chomlec'h IP pe anv implijer",
        "ipbexpiry": "Pad ar stankadenn",
        "ipbreason": "Abeg :",
        "ipbreason-dropdown": "*Abegoù stankañ boutinañ\n** Degas titouroù faos\n** Tennañ danvez eus ar pajennoù\n** Degas liammoù Strobus war-du lec'hiennoù diavaez\n** Degas danvez diboell/dizoare er pajennoù\n** Emzalc'h hegazus/handeus betek re\n** Mont re bell gant implij meur a gont\n** Anv implijer n'eo ket aotreet",
        "monobook.js": "/* Kement JavaScript amañ a vo karget evit an implijerien a ra gant ar gwiskadur MonoBook */",
        "modern.js": "/* Kement JavaScript amañ a vo karget evit an implijerien a ra gant ar gwiskadur Modern */",
        "vector.js": "/* Kement JavaScript amañ a vo karget evit an implijerien a ra gant ar gwiskadur Vektor */",
-       "notacceptable": "N'eo ket ar servijer wiki-mañ evit pourchas stlennoù en ur furmad lennus evit ho arval.",
        "anonymous": "{{PLURAL:$1|Implijer|Implijerien}} dizanv war {{SITENAME}}",
        "siteuser": "Implijer(ez) $1 eus {{SITENAME}}",
        "anonuser": "implijer dizanv $1 eus {{SITENAME}}",
        "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) :",
-       "showhidebots": "($1 bot)",
        "noimages": "Netra da welet.",
        "ilsubmit": "Klask",
        "bydate": "dre an deiziad anezho",
        "size-kilobytes": "$1 Kio",
        "size-megabytes": "$1 Mio",
        "size-gigabytes": "$1 Gio",
-       "livepreview-loading": "O kargañ...",
-       "livepreview-ready": "O kargañ... Prest !",
-       "livepreview-failed": "C'hwitet eo rakwelet diouzhtu !\nKlaskit rakwelet er mod boutin.",
-       "livepreview-error": "C'hwitet kevreañ : $1 \"$2\"\nKlaskit rakwelet er mod boutin.",
        "lag-warn-normal": "Marteze ne ziskouezo ket ar roll-mañ an degasadennoù c'hoarvezet $1 {{PLURAL:$1|eilenn|eilenn}} zo hepken.",
        "lag-warn-high": "Dre m'eo soulgarget ar bankoù roadennoù, marteze ne vo ket gwelet er roll-mañ ar c'hemmoù deuet $1 {{PLURAL:$1|eilenn|eilenn}} zo hepken.",
-       "watchlistedit-numitems": "{{PLURAL:$1|1 pajenn|$1 pajenn}} zo war ho roll evezhiañ, hep kontañ ar pajennoù kaozeal.",
-       "watchlistedit-noitems": "N'eus pajenn ebet war ho roll evezhiañ.",
        "watchlistedit-normal-title": "Kemmañ ar roll evezhiañ",
        "watchlistedit-normal-legend": "Tennañ ar pajennoù a-ziwar ho roll evezhiañ",
        "watchlistedit-normal-explain": "Dindan emañ diskouezet titloù ar pajennoù zo war ho roll evezhiañ.\nEvit tennañ unan, sellet ouzh ar voest e-kichen ha klikañ war \"{{int:Watchlistedit-normal-submit}}\".\nGellout a reer [[Special:EditWatchlist/raw|kemmañ ar roll (mod diginkl) ivez]].",
        "compare-invalid-title": "Kamm eo an titl hoc'h eus merket.",
        "compare-title-not-exists": "N'eus ket eus an titl spisaet ganeoc'h.",
        "compare-revision-not-exists": "N'eus ket eus an adweladenn spisaet ganeoc'h.",
-       "dberr-header": "Ur gudenn zo gant ar wiki-mañ",
        "dberr-problems": "Ho tigarez ! Kudennoù teknikel zo gant al lec'hienn-mañ.",
        "dberr-again": "Gortozit un nebeud munutennoù a-raok adkargañ.",
        "dberr-info": "(Dibosupl kevreañ ouzh servijer an diaz roadennoù: $1)",
        "htmlform-no": "Ket",
        "htmlform-yes": "Ya",
        "htmlform-chosen-placeholder": "Diuzañ un dibarzh",
+       "htmlform-cloner-create": "Ouzhpennañ muioc'h",
+       "htmlform-cloner-delete": "Dilemel",
+       "htmlform-cloner-required": "Un dalvoudenn a zo ret da vihanañ.",
        "sqlite-has-fts": "$1 gant enklask eus an destenn a-bezh embreget",
        "sqlite-no-fts": "$1 hep enklask eus an destenn a-bezh embreget",
        "logentry-delete-delete": "Diverket eo bet ar bajenn $3 gant $1",
index e9ea030..2310ae3 100644 (file)
@@ -16,7 +16,8 @@
                        "Palapa",
                        "Seha",
                        "Smooth O",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Podvuci veze:",
        "readonly_lag": "Baza podataka je zaključana dok se sekundarne baze podataka na serveru ne sastave sa glavnom.",
        "internalerror": "Unutrašnja greška",
        "internalerror_info": "Interna greška: $1",
-       "fileappenderrorread": "Nije se mogao pročitati \"$1\" tokom dodavanja.",
-       "fileappenderror": "Ne može se primijeniti \"$1\" na \"$2\".",
        "filecopyerror": "Ne može se kopirati \"$1\" na \"$2\".",
        "filerenameerror": "Ne može se promjeniti ime datoteke \"$1\" u \"$2\".",
        "filedeleteerror": "Ne može se izbrisati datoteka \"$1\".",
        "directorycreateerror": "Nije moguće napraviti direktorijum \"$1\".",
        "filenotfound": "Ne može se naći datoteka \"$1\".",
-       "fileexistserror": "Nemoguće je napisati datoteku \"$1\": datoteka već postoji",
        "unexpected": "Neočekivana vrijednost: \"$1\"=\"$2\".",
        "formerror": "Greška: ne može se poslati upitnik",
        "badarticleerror": "Ova akcija ne može biti izvršena na ovoj stranici.",
        "userlogin-helplink2": "Pomoć pri prijavljivanju",
        "userlogin-loggedin": "Već ste prijavljeni kao {{GENDER:$1|$1}}.\nKoristite donji obrazac da biste se prijavili kao drugi korisnik.",
        "userlogin-createanother": "Napravi još jedan račun",
-       "createacct-join": "Unesite svoje podatke ispod.",
-       "createacct-another-join": "Unesite informacije o novom računu ispod.",
        "createacct-emailrequired": "Adresa e-pošte",
        "createacct-emailoptional": "Adresa e-pošte (opcionalno)",
        "createacct-email-ph": "Unesite Vašu adresu e-pоšte",
        "savearticle": "Sačuvaj",
        "preview": "Pregled stranice",
        "showpreview": "Prikaži izgled",
-       "showlivepreview": "Pregled uživo",
        "showdiff": "Prikaži izmjene",
        "anoneditwarning": "'''Upozorenje:''' Niste prijavljeni. \nVaša IP adresa će biti zabilježena u historiji ove stranice.",
        "anonpreviewwarning": "''Niste prijavljeni. Nakon spremanja izmjena vaša IP adresa će biti zapisana u historiji uređivanja ove stranice.''",
        "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": "Vaša izmjena je sačuvana.",
+       "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",
        "search-nonefound": "Nisu pronađeni rezultati koji odgovaraju upitu.",
        "powersearch-legend": "Napredna pretraga",
        "powersearch-ns": "Pretraga u imenskim prostorima:",
-       "powersearch-redir": "Spisak preusmjerenja",
        "powersearch-togglelabel": "Označi:",
        "powersearch-toggleall": "Sve",
        "powersearch-togglenone": "Ništa",
        "prefs-advancedsearchoptions": "Napredne opcije",
        "prefs-advancedwatchlist": "Napredne opcije",
        "prefs-displayrc": "Postavke izgleda",
-       "prefs-displaysearchoptions": "Postavke izgleda",
        "prefs-displaywatchlist": "Postavke izgleda",
        "prefs-diffs": "Razlike",
        "email-address-validity-valid": "Izgleda valjano",
        "recentchanges-legend-heading": "'''Legenda:'''",
        "recentchanges-legend-newpage": "(također pogledajte [[Special:NewPages|spisak novih stranica]])",
        "rcnotefrom": "Ispod su izmjene od <strong>$2</strong> (do <strong>$1</strong> prikazano).",
-       "rclistfrom": "Prikaži nove izmjene počev od $1",
+       "rclistfrom": "Prikaži nove izmjene počev od $3 $2",
        "rcshowhideminor": "$1 male izmjene",
        "rcshowhideminor-show": "Pokaži",
        "rcshowhideminor-hide": "Sakrij",
        "uploadstash-refresh": "Osvježi spisak datoteka",
        "invalid-chunk-offset": "Neispravna polazna tačka",
        "img-auth-accessdenied": "Pristup onemogućen",
-       "img-auth-nopathinfo": "Nedostaje PATH_INFO.\nVaš server nije postavljen da daje ovu informaciju.\nMožda je zasnovan na CGI koji ne podržava img_auth.\nPogledajte https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "Nedostaje PATH_INFO.\nVaš server nije postavljen da daje ovu informaciju.\nMožda je zasnovan na CGI koji ne podržava img_auth.\nPogledajte https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Zahtjevana putanje nije u direktorijumu podešenom za postavljanje.",
        "img-auth-badtitle": "Ne mogu napraviti valjani naslov iz \"$1\".",
        "img-auth-nologinnWL": "Niste prijavljeni i \"$1\" nije na spisku dozvoljenih.",
        "watchlist-details": "{{PLURAL:$1|$1 stranica praćena|$1 stranice praćene|$1 stranica praćeno}} ne računajući stranice za razgovor.",
        "wlheader-enotif": "Obavještavanje e-poštom je omogućeno.",
        "wlheader-showupdated": "Stranice koje su izmijenjene od kad ste ih posljednji put posjetili su prikazane '''podebljanim slovima'''",
-       "watchmethod-recent": "provjerava se da li ima praćenih stranica u nedavnim izmjenama",
-       "watchmethod-list": "provjerava se da li ima nedavnih izmjena u praćenim stranicama",
-       "watchlistcontains": "Vaš spisak praćenih članaka sadrži $1 {{PLURAL:$1|stranicu|stranica}}.",
-       "iteminvalidname": "Problem sa '$1', neispravno ime...",
        "wlshowlast": "Prikaži posljednjih $1 sati $2 dana $3",
        "watchlist-options": "Opcije spiska praćenja",
        "watching": "Pratim...",
        "enotif_lastvisited": "Pogledajte $1 za sve izmjene od vaše posljednje posjete.",
        "enotif_lastdiff": "Vidi $1 da pregledate ovu promjenu.",
        "enotif_anon_editor": "anonimni korisnik $1",
-       "enotif_body": "Poštovani $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nSažetak urednika: $PAGESUMMARY $PAGEMINOREDIT\n\nKontaktirajte urednika:\ne-pošta: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nNeće biti drugih obavještenja u slučaju daljnjih izmjena osima ako posjetite stranicu. Također možete poništiti oznake obavijesti za sve praćene stranice koje imate na vašem spisku praćenja.\n\nVaš prijateljski {{SITENAME}} sistem obavještavanja\n\n--\nZa promjenu vaših postavki e-mail obavijesti, posjetite\n{{canonicalurl:{{#special:Preferences}}}}\n\nZa promjenu postavki vašeg praćenja, posjetite\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nDa obrišete stranicu sa vašeg spiska praćenja, posjetite\n$UNWATCHURL\n\nPovratne informacije i daljnja pomoć:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Poštovani $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nSažetak urednika: $PAGESUMMARY $PAGEMINOREDIT\n\nKontaktirajte urednika:\ne-pošta: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nNeće biti drugih obavještenja u slučaju daljnjih izmjena osima ako posjetite stranicu. Također možete poništiti oznake obavijesti za sve praćene stranice koje imate na vašem spisku praćenja.\n\nVaš prijateljski {{SITENAME}} sistem obavještavanja\n\n--\nZa promjenu vaših postavki e-mail obavijesti, posjetite\n{{canonicalurl:{{#special:Preferences}}}}\n\nZa promjenu postavki vašeg praćenja, posjetite\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nDa obrišete stranicu sa vašeg spiska praćenja, posjetite\n$UNWATCHURL\n\nPovratne informacije i daljnja pomoć:\n$HELPPAGE",
        "created": "napravljena",
        "changed": "promijenjena",
        "deletepage": "Obrišite stranicu",
        "blockip": "Blokiraj korisnika",
        "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).",
-       "ipadressorusername": "IP adresa ili korisničko ime:",
+       "ipaddressorusername": "IP adresa ili korisničko ime:",
        "ipbexpiry": "Ističe:",
        "ipbreason": "Razlog:",
        "ipbreason-dropdown": "*Najčešći razlozi blokiranja\n**Netačne informacije\n**Uklanjanje sadržaja stranica\n**Postavljanje spam vanjskih linkova\n**Ubacivanje gluposti/grafita\n**Osobni napadi (ili napadačko ponašanje)\n**Čarapare (zloupotreba više korisničkih računa)\n**Neprihvatljivo korisničko ime",
        "cologneblue.js": "/* Bilo koja JavaScript će biti učitana za sve korisnike koji koriste Cologne Blue skin */",
        "monobook.js": "/* Bilo koja JavaScript će biti učitana za sve korisnike koji koriste MonoBook skin */",
        "modern.js": "/* Bilo koja JavaScript će biti učitana za sve korisnike koji koriste Modern skin */",
-       "notacceptable": "Viki server ne može da pruži podatke u onom formatu koji Vaš klijent može da pročita.",
        "anonymous": "{{PLURAL:$1|Anonimni korisnik|$1 anonimna korisnika|$1 anonimnih korisnika}} projekta {{SITENAME}}",
        "siteuser": "{{SITENAME}} korisnik $1",
        "anonuser": "{{SITENAME}} anonimni korisnik $1",
        "newimages-summary": "Ova specijalna stranica prikazuje posljednje postavljene datoteke.",
        "newimages-legend": "Filter",
        "newimages-label": "Ime datoteke (ili dio imena):",
-       "showhidebots": "($1 botove)",
        "noimages": "Ništa za prikazati.",
        "ilsubmit": "Traži",
        "bydate": "po datumu",
        "size-kilobytes": "$1 KB",
        "size-megabytes": "$1 MB",
        "size-gigabytes": "$1 GB",
-       "livepreview-loading": "Punjenje…",
-       "livepreview-ready": "Punjenje… Spreman!",
-       "livepreview-failed": "Pregled uživo nije uspio! Pokušajte normalni pregled.",
-       "livepreview-error": "Spajanje nije uspjelo: $1 \"$2\".\nPokušajte normalni pregled.",
        "lag-warn-normal": "Promjene načinjene prije manje od $1 {{PLURAL:$1|sekunde|sekunde|sekundi}} možda neće biti prikazane na ovom spisku.",
        "lag-warn-high": "Zbog dužeg zastoja baze podataka na serveru, izmjene novije od $1 {{PLURAL:$1|sekunde|sekunde|sekundi}} možda neće biti prikazane na ovom spisku.",
-       "watchlistedit-numitems": "Vaš spisak praćenja sadrži {{PLURAL:$1|1 naslov|$1 naslova}}, izuzimajući stranice za razgovor.",
-       "watchlistedit-noitems": "Vaš spisak praćenja ne sadrži naslove.",
        "watchlistedit-normal-title": "Uredi spisak praćenja",
        "watchlistedit-normal-legend": "Ukloni naslove iz spiska praćenja",
        "watchlistedit-normal-explain": "Naslovi na Vašem spisku praćenja su prikazani ispod.\nDa bi ste uklonili naslov, označite kutiju pored naslova, i kliknite \"{{int:Watchlistedit-normal-submit}}\".\nTakođer možete [[Special:EditWatchlist/raw|napredno urediti spisak]].",
        "compare-invalid-title": "Naslov koji ste unijeli je nevaljan.",
        "compare-title-not-exists": "Naslov koji ste naveli ne postoji.",
        "compare-revision-not-exists": "Izmjena koji ste naveli ne postoji.",
-       "dberr-header": "Ovaj wiki ima problem",
        "dberr-problems": "Žao nam je! Ova stranica ima određene tehničke poteškoće.",
        "dberr-again": "Pokušajte pričekati par minuta i zatim osvježiti.",
        "dberr-info": "(ne može se spojiti server baze podataka: $1)",
index 36805cc..48922ec 100644 (file)
@@ -39,7 +39,8 @@
                        "Vriullop",
                        "XVEC",
                        "Àlex",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Subratlla els enllaços:",
        "jumptonavigation": "navegació",
        "jumptosearch": "cerca",
        "view-pool-error": "Disculpeu, els servidors es troben sobrecarregats.\nMassa usuaris estan tractant d'accedir a aquesta pàgina.\nPer favor, esperau una mica abans de tornar a accedir a aquesta pàgina.\n\n$1",
+       "generic-pool-error": "Els servidors es troben sobrecarregats ara mateix.\nMassa usuaris estan provant d'accedir a aquest recurs.\nEspereu una mica abans de tornar a accedir a aquest recurs.",
        "pool-timeout": "Temps d'espera per al blocatge",
        "pool-queuefull": "La cua de treball és plena",
        "pool-errorunknown": "Error desconegut",
+       "pool-servererror": "El servei de recompte de la reserva no és disponible ($1).",
        "aboutsite": "Quant al projecte {{SITENAME}}",
        "aboutpage": "Project:Quant a",
        "copyright": "El contingut està disponible sota la llicència $1 si no s'indica el contrari.",
        "readonly_lag": "La base de dades s'ha bloquejat automàticament mentre els servidors esclaus se sincronitzen amb el mestre",
        "internalerror": "Error intern",
        "internalerror_info": "Error intern: $1",
-       "fileappenderrorread": "No s'ha pogut llegir \"$1\" durant la inserció.",
-       "fileappenderror": "No he pogut afegir \"$1\" a \"$2\".",
        "filecopyerror": "No s'ha pogut copiar el fitxer «$1» com «$2».",
        "filerenameerror": "No s'ha pogut reanomenar el fitxer «$1» com «$2».",
        "filedeleteerror": "No s'ha pogut eliminar el fitxer «$1».",
        "directorycreateerror": "No s'ha pogut crear el directori «$1».",
        "filenotfound": "No s'ha pogut trobar el fitxer «$1».",
-       "fileexistserror": "No s'ha pogut escriure al fitxer «$1»: ja existeix",
        "unexpected": "S'ha trobat un valor imprevist: «$1»=«$2».",
        "formerror": "Error: no s'ha pogut enviar les dades del formulari",
        "badarticleerror": "Aquesta operació no es pot dur a terme en aquesta pàgina",
        "userlogin-helplink2": "Ajuda amb el registre",
        "userlogin-loggedin": "Heu iniciat una sessió com {{GENDER:$1|$1}}.\nFeu servir el formulari de sota per iniciar la sessió com un altre usuari.",
        "userlogin-createanother": "Crea un altre compte",
-       "createacct-join": "Introduïu les vostres dades.",
-       "createacct-another-join": "Introduïu la informació del nou compte a continuació:",
        "createacct-emailrequired": "Adreça de correu electrònic",
        "createacct-emailoptional": "Adreça de correu electrònic (opcional)",
        "createacct-email-ph": "Introduïu la vostra adreça de correu electrònic",
        "savearticle": "Desa la pàgina",
        "preview": "Previsualització",
        "showpreview": "Mostra una previsualització",
-       "showlivepreview": "Vista ràpida",
        "showdiff": "Mostra els canvis",
        "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.",
        "anonpreviewwarning": "''No us heu identificat amb un compte d'usuari. La vostra adreça IP quedarà registrada a l'historial d'aquesta pàgina.''",
        "edit-gone-missing": "No s'ha pogut actualitzar la pàgina.\nSembla haver estat esborrada.",
        "edit-conflict": "Conflicte d'edició.",
        "edit-no-change": "S'ha ignorat la vostra modificació perquè no feia cap canvi al text.",
-       "postedit-confirmation": "S'ha desat la modificació.",
+       "postedit-confirmation-created": "S'ha creat la pàgina.",
+       "postedit-confirmation-restored": "S'ha restaurat la pàgina.",
+       "postedit-confirmation-saved": "S'ha desat la modificació.",
        "edit-already-exists": "No s'ha pogut crear una pàgina.\nJa existeix.",
        "defaultmessagetext": "Missatge per defecte",
        "content-failed-to-parse": "Ha fallat l'anàlisi del contingut de $2 per al model $1: $3",
        "search-nonefound": "La cerca no ha donat cap resultat.",
        "powersearch-legend": "Cerca avançada",
        "powersearch-ns": "Cerca als espais de noms:",
-       "powersearch-redir": "Mostra redireccions",
        "powersearch-togglelabel": "Activar:",
        "powersearch-toggleall": "Tots",
        "powersearch-togglenone": "Cap",
        "prefs-emailconfirm-label": "Confirmació de correu electrònic:",
        "youremail": "Correu electrònic:",
        "username": "{{GENDER:$1|Nom d'usuari}}:",
-       "uid": "{{GENDER:$1|Usuari}} Identificador d'usuari:",
        "prefs-memberingroups": "{{GENDER:$2|Membre}} {{PLURAL:$1|del grup|dels grups}}:",
        "prefs-registration": "Hora de registre:",
        "yourrealname": "Nom real *",
        "prefs-advancedsearchoptions": "Opcions avançades",
        "prefs-advancedwatchlist": "Opcions avançades",
        "prefs-displayrc": "Opcions d'aparença",
-       "prefs-displaysearchoptions": "Opcions de visualització",
        "prefs-displaywatchlist": "Opcions de visualització",
        "prefs-tokenwatchlist": "Testimoni",
        "prefs-diffs": "Difs",
        "right-move": "Moure pàgines",
        "right-move-subpages": "Moure pàgines amb les seves subpàgines",
        "right-move-rootuserpages": "Reanomenar la pàgina principal d'un usuari",
+       "right-move-categorypages": "Mou les pàgines de categoria",
        "right-movefile": "Moure fitxers",
        "right-suppressredirect": "No crear redireccions quan es reanomena una pàgina",
        "right-upload": "Carregar fitxers",
        "action-createpage": "crear pàgines",
        "action-createtalk": "crear pàgines de discussió",
        "action-createaccount": "crear aquest compte d'usuari",
+       "action-history": "mostra l'historial de la pàgina",
        "action-minoredit": "marcar aquesta modificació com a menor",
        "action-move": "moure aquesta pàgina",
        "action-move-subpages": "moure aquesta pàgina, i llurs subpàgines",
        "action-move-rootuserpages": "reanomenar la pàgina principal d'un usuari",
+       "action-move-categorypages": "mou les pàgines de categoria",
        "action-movefile": "moure aquest fitxer",
        "action-upload": "carregar aquest fitxer",
        "action-reupload": "substituir aquest fitxer",
        "recentchanges-legend-newpage": "(vegeu també la [[Special:NewPages|llista de pàgines noves]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "A sota hi ha els canvis des de <strong>$2</strong> (es mostren fins <strong>$1</strong>).",
-       "rclistfrom": "Mostra els canvis nous des de $1",
+       "rclistfrom": "Mostra els canvis nous des de $3 $2",
        "rcshowhideminor": "$1 edicions menors",
        "rcshowhideminor-show": "Mostra",
        "rcshowhideminor-hide": "Amaga",
        "uploadstash-refresh": "Actualitza la llista de fitxers",
        "invalid-chunk-offset": "El desplaçament del fragment no és vàlid",
        "img-auth-accessdenied": "Accés denegat",
-       "img-auth-nopathinfo": "Hi manca PATH_INFO.\nEl servidor no està configurat per passar aquesta informació.\nPot estar basat en CGI i no ser compatible amb img_auth.\nConsulteu https://www.mediawiki.org/wiki/Manual:Image_Authorization",
+       "img-auth-nopathinfo": "Hi manca PATH_INFO.\nEl servidor no està configurat per passar aquesta informació.\nPot estar basat en CGI i no ser compatible amb img_auth.\nConsulteu https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization",
        "img-auth-notindir": "No s'ha trobat la ruta sol·licitada al directori de càrrega configurat.",
        "img-auth-badtitle": "No s'ha pogut construir un títol vàlid a partir de \"$1\".",
        "img-auth-nologinnWL": "No has iniciat sessió i \"$1\" no està a la llista blanca.",
        "pageswithprop-prophidden-binary": "valor de propietat binària oculta ($1)",
        "doubleredirects": "Redireccions dobles",
        "doubleredirectstext": "Aquesta pàgina llista les pàgines que redirigeixen a altres pàgines de redirecció.\nCada fila conté enllaços a la primera i segona redireccions, així com el destí de la segona redirecció, què generalment és la pàgina destí \"real\", a la què hauria d'apuntar la primera redirecció.\nLes entrades <del>ratllades</del> s'han resolt.",
-       "double-redirect-fixed-move": "S'ha reanomenat [[$1]], ara és una redirecció a [[$2]]",
-       "double-redirect-fixed-maintenance": "S'ha arreglat la redirecció doble [[$1]] - [[$2]].",
+       "double-redirect-fixed-move": "S'ha reanomenat [[$1]].\nS'ha actualitzat automàticament i ara redirigeix a [[$2]].",
+       "double-redirect-fixed-maintenance": "S'ha arreglat automàticament la redirecció doble de [[$1]] a [[$2]] en un treball de manteniment.",
        "double-redirect-fixer": "Supressor de dobles redireccions",
        "brokenredirects": "Redireccions rompudes",
        "brokenredirectstext": "Les següents redireccions enllacen a pàgines inexistents:",
        "log-title-wildcard": "Cerca els títols que comencin amb aquest text",
        "showhideselectedlogentries": "Mostra/amaga les entrades de registre seleccionades",
        "allpages": "Totes les pàgines",
-       "alphaindexline": "$1 a $2",
        "nextpage": "Pàgina següent ($1)",
        "prevpage": "Pàgina anterior ($1)",
        "allpagesfrom": "Mostra les pàgines que comencin per:",
        "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'''.",
-       "watchmethod-recent": "s'està comprovant si hi ha pàgines vigilades en les edicions recents",
-       "watchmethod-list": "s'està comprovant si hi ha edicions recents en les pàgines vigilades",
-       "watchlistcontains": "La vostra llista de seguiment conté {{PLURAL:$1|una única pàgina|$1 pàgines}}.",
-       "iteminvalidname": "Hi ha un problema amb l'element '$1': el nom no és vàlid...",
        "wlnote2": "A continuació es presenten els canvis durant {{PLURAL:$1|l'última hora|les últimes <strong>$1</strong> hores}}, a partir de $2, $3.",
        "wlshowlast": "<small>- Mostra les darreres $1 hores, els darrers $2 dies o $3</small>",
        "watchlist-options": "Opcions de la llista de seguiment",
        "enotif_lastvisited": "Vegeu $1 per a tots els canvis que s'han fet d'ença de la vostra darrera visita.",
        "enotif_lastdiff": "Consulteu $1 per a visualitzar aquest canvi.",
        "enotif_anon_editor": "usuari anònim $1",
-       "enotif_body": "Benvolgut/uda $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nResum de l'editor: $PAGESUMMARY $PAGEMINOREDIT\n\nContacteu amb l'editor:\ncorreu: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nNo rebreu més notificacions en cas de més activitat a menys que visiteu aquesta pàgina havent iniciat sessió.\nTambé podeu canviar el mode de notificació de les pàgines que vigileu en la vostra llista de seguiment.\n\nEl servei de notificacions del projecte {{SITENAME}}\n\n--\nPer a canviar les opcions de notificació per correu electrònic aneu a\n{{canonicalurl:{{#special:Preferences}}}}\n\nPer a canviar les opcions de la vostra llista de seguiment aneu a\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPer eliminar la pàgina de la vostra llista de seguiment aneu a\n$UNWATCHURL\n\nSuggeriments i ajuda:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Benvolgut/uda $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nResum de l'editor: $PAGESUMMARY $PAGEMINOREDIT\n\nContacteu amb l'editor:\ncorreu: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nNo rebreu més notificacions en cas de més activitat a menys que visiteu aquesta pàgina havent iniciat sessió.\nTambé podeu canviar el mode de notificació de les pàgines que vigileu en la vostra llista de seguiment.\n\nEl servei de notificacions del projecte {{SITENAME}}\n\n--\nPer a canviar les opcions de notificació per correu electrònic aneu a\n{{canonicalurl:{{#special:Preferences}}}}\n\nPer a canviar les opcions de la vostra llista de seguiment aneu a\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPer eliminar la pàgina de la vostra llista de seguiment aneu a\n$UNWATCHURL\n\nSuggeriments i ajuda:\n$HELPPAGE",
        "created": "creada",
        "changed": "modificada",
        "deletepage": "Elimina la pàgina",
        "sp-contributions-blocklog": "Registre de bloquejos",
        "sp-contributions-suppresslog": "contribucions suprimides de l'usuari",
        "sp-contributions-deleted": "contribucions d'usuari esborrades",
-       "sp-contributions-uploads": "pujades",
+       "sp-contributions-uploads": "càrregues",
        "sp-contributions-logs": "registres",
        "sp-contributions-talk": "discussió",
        "sp-contributions-userrights": "gestió de drets d'usuari",
        "blockip": "Bloqueig d'usuaris",
        "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).",
-       "ipadressorusername": "Adreça IP o nom de l'usuari",
+       "ipaddressorusername": "Adreça IP o nom de l'usuari",
        "ipbexpiry": "Venciment",
        "ipbreason": "Motiu:",
        "ipbreason-dropdown": "*Motius de bloqueig més freqüents\n** Inserció d'informació falsa\n** Supressió de contingut sense justificació\n** Inserció d'enllaços promocionals (spam)\n** Inserció de contingut sense cap sentit\n** Conducta intimidatòria o hostil\n** Abús de comptes d'usuari múltiples\n** Nom d'usuari no acceptable",
        "movepagetalktext": "La pàgina de discussió associada també serà traslladada automàticament '''tret que''':\n* Ja existeix una pàgina de discussió no buida amb el nou nom, o\n* Desactiveu la opció de més avall.\n\nEn aquests casos, haureu de traslladar o fusionar la pàgina manualment si ho desitgeu.",
        "movearticle": "Reanomena la pàgina",
        "moveuserpage-warning": "'''Atenció:''' Esteu a punt de moure una pàgina d'usuari. Tingueu en compte que només la pàgina es desplaçarà i que el compte d'usuari ''no'' canviarà de nom.",
+       "movecategorypage-warning": "<strong>Avís:</strong> Esteu a punt de moure una pàgina de categoria. Tingueu en compte que només es moure la pàgina i qualsevol de les pàgines a l'antiga categoria <em>no</em> es recategoritzarà automàticament en la nova.",
        "movenologintext": "Heu de ser un usuari registrat i estar [[Special:UserLogin|dintre d'una sessió]]\nper reanomenar una pàgina.",
        "movenotallowed": "No teniu permís per a moure pàgines.",
        "movenotallowedfile": "No teniu el permís per a moure fitxers.",
        "cant-move-user-page": "No teniu permís per a moure pàgines d'usuari (independentment de les subpàgines).",
        "cant-move-to-user-page": "No teniu permís per a moure una pàgina a una pàgina d'usuari (independentment de poder fer-ho cap a una subpàgina d'usuari).",
+       "cant-move-category-page": "No teniu permisos per a moure pàgines de categoria.",
+       "cant-move-to-category-page": "No teniu permisos per a moure una pàgina a una pàgina de categoria.",
        "newtitle": "A títol nou",
        "move-watch": "Vigila aquesta pàgina",
        "movepagebtn": "Reanomena la pàgina",
        "common.css": "/* Editeu aquest fitxer per personalitzar totes les aparences per al lloc sencer */",
        "monobook.css": "/* Editeu aquest fitxer per personalitzar l'aparença del monobook per a tot el lloc sencer */",
        "common.js": "/* Es carregarà per a tots els usuaris, i per a qualsevol pàgina, el codi JavaScript que hi haja després d'aquesta línia. */",
-       "notacceptable": "El servidor wiki no pot oferir dades en un format que el client no pot llegir.",
        "anonymous": "Usuari{{PLURAL:$1| anònim|s anònims}} del projecte {{SITENAME}}",
        "siteuser": "{{GENDER:$2|l'usuari|la usuària}} $1 del projecte {{SITENAME}}",
        "anonuser": "$1, usuari anònim de {{SITENAME}}",
        "newimages-summary": "Aquesta pàgina especial mostra els darrers fitxers carregats.",
        "newimages-legend": "Nom del fitxer",
        "newimages-label": "Nom de fitxer (o part d'ell):",
-       "showhidebots": "($1 bots)",
+       "newimages-showbots": "Mostra les càrregues dels bots",
        "noimages": "Res per veure.",
        "ilsubmit": "Cerca",
        "bydate": "per data",
        "autosumm-replace": "Contingut canviat per «$1».",
        "autoredircomment": "Redirecció a [[$1]]",
        "autosumm-new": "Es crea la pàgina amb «$1».",
-       "livepreview-loading": "S'està carregant…",
-       "livepreview-ready": "S'està carregant… Preparat!",
-       "livepreview-failed": "Ha fallat la vista ràpida!\nProveu-ho amb la previsualització normal.",
-       "livepreview-error": "No s'ha pogut efectuar la connexió: $1 «$2»\nProveu-ho amb la previsualització normal.",
        "lag-warn-normal": "Els canvis més nous de $1 {{PLURAL:$1|segon|segons}} podrien no mostrar-se a la llista.",
        "lag-warn-high": "A causa de la lenta resposta del servidor de base de dades, els canvis més nous de $1 {{PLURAL:$1|segon|segons}} potser no es mostren aquesta llista.",
-       "watchlistedit-numitems": "La vostra llista de seguiment conté {{PLURAL:$1|1 títol|$1 títols}}, excloent-ne les pàgines de discussió.",
-       "watchlistedit-noitems": "La vostra llista de seguiment no té cap títol.",
        "watchlistedit-normal-title": "Edita la llista de seguiment",
        "watchlistedit-normal-legend": "Esborra els títols de la llista de seguiment",
        "watchlistedit-normal-explain": "Els títols de les pàgines que estan en la vostra llista de seguiment es mostren a continuació.\nPer a eliminar algun element, marqueu el quadre del seu costat, i feu clic al botó «{{int:Watchlistedit-normal-submit}}». També podeu [[Special:EditWatchlist/raw|editar-ne la llista en text pla]].",
        "watchlistedit-raw-done": "S'ha actualitzat la vostra llista de seguiment.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 títol s'ha|$1 títols s'han}} afegit:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 títol s'ha|$1 títols s'han}} eliminat:",
+       "watchlistedit-clear-title": "S'ha netejat la llista de seguiment",
+       "watchlistedit-clear-legend": "Neteja la llista de seguiment",
+       "watchlistedit-clear-explain": "Se suprimiran tots els títols de la vostra llista de seguiment",
+       "watchlistedit-clear-titles": "Títols:",
+       "watchlistedit-clear-submit": "Neteja la llista de seguiment (això és permanent!)",
+       "watchlistedit-clear-done": "S'ha netejat la vostra llista de seguiment.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|S'ha suprimit 1 títol|S'han suprimit $1 títols}}:",
+       "watchlistedit-too-many": "Hi ha massa pàgines per mostrar-les aquí.",
+       "watchlisttools-clear": "Neteja la llista de seguiment",
        "watchlisttools-view": "Visualitza els canvis rellevants",
        "watchlisttools-edit": "Visualitza i edita la llista de seguiment",
        "watchlisttools-raw": "Edita la llista de seguiment sense format",
        "compare-invalid-title": "El títol que heu especificat no és vàlid.",
        "compare-title-not-exists": "El títol que heu especificat no existeix.",
        "compare-revision-not-exists": "La revisió que heu especificat no existeix.",
-       "dberr-header": "Aquest wiki té un problema",
        "dberr-problems": "Ho sentim. Aquest lloc web està experimentant dificultats tècniques.",
        "dberr-again": "Intenteu esperar uns minuts i tornar a carregar.",
        "dberr-info": "(No es pot contactar amb el servidor de dades: $1)",
        "htmlform-no": "No",
        "htmlform-yes": "Sí",
        "htmlform-chosen-placeholder": "Seleccioneu una opció",
+       "htmlform-cloner-create": "Afegeix més",
+       "htmlform-cloner-delete": "Suprimeix",
+       "htmlform-cloner-required": "Cal com a mínim un valor.",
        "sqlite-has-fts": "$1, amb suport de búsqueda de text íntegre",
        "sqlite-no-fts": "$1, sense supor de búsqueda de text íntegre",
        "logentry-delete-delete": "$1 ha esborrat $3",
index 11f9d4d..9b44207 100644 (file)
@@ -4,7 +4,8 @@
                        "Xiaomingyan",
                        "Xqt",
                        "Yejianfei",
-                       "Hakka"
+                       "Hakka",
+                       "아라"
                ]
        },
        "tog-underline": "下劃綫鏈接",
@@ -12,7 +13,6 @@
        "tog-hidepatrolled": "藏起最近改變其巡邏修改",
        "tog-numberheadings": "自動編號其標題",
        "tog-editondblclick": "雙擊就修改頁面",
-       "tog-rememberpassword": "共我其躒底記錄記敆茲萆瀏覽器𡅏(最長$1{{PLURAL:$1|日}})",
        "tog-watchcreations": "加添我開其頁面共我上傳其文件遘我其監視單",
        "tog-watchdefault": "添加我編輯其頁面共文件遘我其監視單",
        "tog-watchmoves": "添加我移動其頁面共文件遘我其監視單",
        "missingarticle-diff": "(比並:$1、$2)",
        "internalerror": "內部錯誤",
        "internalerror_info": "內部錯誤:$1",
-       "fileappenderror": "𣍐使加添「$1」遘「$2」。",
        "filecopyerror": "𣍐使趁「$1」𡅏複製文件遘「$2」。",
        "filerenameerror": "𣍐使共「$1」其名字改去「$2」。",
        "filedeleteerror": "𣍐使刪掉文件「$1」。",
        "directorycreateerror": "𣍐使刪掉目錄「$1」。",
        "filenotfound": "討𣍐著文件「$1」。",
-       "fileexistserror": "無辦法寫遘文件「$1」:文件已經存在。",
        "unexpected": "伓是卜挃其值:「$1」=「$2」。",
        "formerror": "賺:𣍐使提交表單。",
        "cannotdelete": "無能耐刪掉頁面或者文件「$1」。\n可能茲已經共別儂刪掉咯了。",
        "gotaccountlink": "躒底",
        "userlogin-resetlink": "躒底其資料𣍐記咯?",
        "userlogin-resetpassword-link": "密码𣍐記?",
-       "createacct-join": "敆下底輸底汝其信息。",
        "createacct-emailrequired": "電子郵件地址",
        "createacct-emailoptional": "電子郵件地址(愛寫就寫)",
        "createacct-email-ph": "輸底汝其電子郵件地址",
        "recentchanges-label-newpage": "茲蜀萆修改創建新其蜀頁",
        "recentchanges-label-minor": "茲是蜀萆過要修改",
        "recentchanges-label-bot": "茲蜀萆修改是機器人做其",
-       "rclistfrom": "顯示由$1開始其新其改變",
+       "rclistfrom": "顯示由$3 $2開始其新其改變",
        "rcshowhideminor": "$1過要修改",
        "rcshowhidebots": "$1機器人",
        "rcshowhideliu": "$1躒底用戶",
        "autosumm-blank": "都來空其頁",
        "autoredircomment": "重定向頁面遘[[$1]]",
        "autosumm-new": "新其頁面「$1」",
-       "livepreview-loading": "載入...",
-       "livepreview-ready": "載入…好了!",
        "watchlistedit-raw-title": "修改原始監視單",
        "watchlistedit-raw-legend": "修改原始監視單",
        "watchlistedit-raw-titles": "題目:",
index 340d421..34952fb 100644 (file)
@@ -6,13 +6,14 @@
                        "Girdi",
                        "Mega programmer",
                        "Sasan700",
-                       "Умар"
+                       "Умар",
+                       "아라"
                ]
        },
        "tog-underline": "КӀел сиз хьакха хьажорган:",
        "tog-hideminor": "Къайладаха кигийра нисдарш оц могӀама керла хийцамехь",
        "tog-hidepatrolled": "Къайладаха гӀаролладина нисдарш оц могӀама керла нисдаршкахь",
-       "tog-newpageshidepatrolled": "Къайлайаха гlароллайина агlонаш оц могlама керла агlонашкахь",
+       "tog-newpageshidepatrolled": "Къайлаяха гӀароллайина агӀонаш оьцу могӀама керла агӀонашкахь",
        "tog-extendwatchlist": "Шорбина тlехьажарна могlам, ша беригге а хийцамаш чубогlуш, тlяхьабина боцурш а",
        "tog-usenewrc": "Лелабе дика могӀам керла чу хийцамашна (оьшу JavaScript)",
        "tog-numberheadings": "Ша шех хlитто терахь корташна",
        "november-date": "Ноябрь $1",
        "december-date": "Декабрь $1",
        "pagecategories": "{{PLURAL:$1|1=Категори|Категореш}}",
-       "category_header": "Агlонаш оц категоречохь «$1»",
+       "category_header": "АгӀонаш категоречохь «$1»",
        "subcategories": "Бухаркатегореш",
        "category-media-header": "Файлаш оцу категори чохь «$1»",
        "category-empty": "''ХӀара категори хӀинца йаьсса ю.''",
        "listingcontinuesabbrev": "(кхин дlа)",
        "index-category": "Меттигтерахьйо агlонаш",
        "noindex-category": "ДӀахьушйоцу агӀонаш",
-       "broken-file-category": "{{#switch:{{NAMESPACE}}\n |{{ns:0}}=Ð\91олÑ\85 Ñ\86абеÑ\88 Ñ\84айлийн Ñ\85Ñ\8cажоÑ\80агаÑ\88 Ð¹Ð¾Ð»Ñ\83 Ð°Ð³Ó\80онаÑ\88}}",
+       "broken-file-category": "{{#switch:{{NAMESPACE}}\n |{{ns:0}}=Болх цабеш файлийн хьажоргаш йолу агӀонаш}}",
        "about": "Цуьнах лаьцна",
        "article": "Яззам",
        "newwindow": "(керлачу корехь)",
        "deletethispage": "ДӀаяккха хӀара агӀо",
        "undeletethispage": "ХӀара агӀо меттахӀоттор",
        "undelete_short": "МеттахӀоттайé $1 {{PLURAL:$1|нисйинарг|нисйинарш}}",
-       "viewdeleted_short": "Хьажар {{PLURAL:$1|$1 дlадаьккхина нийсдар|$1 дlадаьхна нийсдарш|$1 дlадаьхна нийсдарш}}",
+       "viewdeleted_short": "{{PLURAL:$1|$1 ДӀадаьккхина нийсдаре|$1 ДӀадаьхна нийсдарше}} хьажар",
        "protect": "Гlаролла дé",
        "protect_change": "хийца",
        "protectthispage": "Гlаролла дé хlокху агlон",
        "redirectedfrom": "(ДӀасахьажийна кху $1)",
        "redirectpagesub": "АгӀо-дӀасахьажайар",
        "lastmodifiedat": "ХӀокху агӀон тӀаьххьаралера хийцам: $2, $1.",
-       "viewcount": "ХӀокху агӀонга хьойсина $1 {{PLURAL:$1|за}}.",
+       "viewcount": "ХӀокху агӀонг хьовсийна $1 {{PLURAL:$1|за}}.",
        "protectedpage": "ГӀароллийца йолу агӀо",
        "jumpto": "Дехьа гӀо:",
        "jumptonavigation": "Навигаци",
        "jumptosearch": "лаха",
-       "view-pool-error": "Бехк цабиллар доьха, хӀинц гӀулкхдириг йоьттина ю.\nКаьчна дуккха дехарш хӀокху агӀонтӀе хьажарца.\nДехар до, собардеш а юха хьажа хӀокху агӀонтӀе жим тӀаьхьо.\n\n$1",
+       "view-pool-error": "Бехк цабиллар доьха, хӀинц сервераш йоьттина ю.\nКаьчна дуккха дехарш хӀокху агӀонтӀе хьажарца.\nДехар до, собардеш а юха хьажа хӀокху агӀонтӀе жим тӀаьхьо.\n\n$1",
+       "generic-pool-error": "Бехк цабиллар доьха, хӀинц сервер йоьттина ю.\nКаьчна дуккха дехарш хӀокху агӀонтӀе хьажарца.\nДехар до, собардеш а юха хьажа хӀокху агӀонтӀе жим тӀаьхьо.",
        "pool-timeout": "Блоктоха еза хан тӀех йаьлла",
        "pool-queuefull": "Дехаршан чоь юьззина ю",
        "pool-errorunknown": "Дойзаш доцу гlалат",
        "readonly_lag": "Хаамашан базина цхьана хан блоктоьхна, хаамашан базан сервераш нисялца.",
        "internalerror": "Чоьхьара гlалат",
        "internalerror_info": "Чоьхьара гlалат: $1",
-       "fileappenderrorread": "Тар ца дели еша «$1» тӀетухучу хенахь.",
-       "fileappenderror": "Тар ца дели тӀетоха «$1» оцунах «$2».",
        "filecopyerror": "Йиш яц копий ян «$1» оцунах «$2».",
        "filerenameerror": "Файлан «$1» цӀе хийца «$2» йиш яц.",
        "filedeleteerror": "ДӀаяккха цатарло файл «$1».",
        "directorycreateerror": "Йиш яц директори «$1» кхолла.",
        "filenotfound": "Файл «$1» каро йиш яц.",
-       "fileexistserror": "Файл «$1» дӀаязяан йиш яц: файл йолуш ю.",
        "unexpected": "БIегIийла йоцу маьIна: «$1»=«$2».",
        "formerror": "ГӀалат: йиш яц хӀара формаш дӀакхачо",
        "badarticleerror": "И хӀума кхочушъ дан йиш яц хӀокху агӀонехь.",
        "userlogin-helplink2": "Системин чудахаран гӀодар",
        "userlogin-loggedin": "Хьо {{GENDER:$1|$1}} цӀарца чохь ву/ю.\nЛахара форманца кхин цӀарца чугӀо.",
        "userlogin-createanother": "Кхолла декъашхочун кхин дӀаяздар",
-       "createacct-join": "ДӀаязбе лахахь хай хаам.",
-       "createacct-another-join": "Язбе лахахь керлачу декъашхочун дӀаяздаран хаам.",
        "createacct-emailrequired": "Электронан почтан адрес",
        "createacct-emailoptional": "Электронан почтан адрес (ца яздича мега)",
        "createacct-email-ph": "ДӀаязде электронан почтан адрес",
        "createacct-another-email-ph": "ДӀаязде электронан почтан адрес",
-       "createaccountmail": "хааман зӀене хула",
+       "createaccountmail": "Лела йе цахууш нисйина хана пароль, кхин язйинчу электронан адрес тӀе яийта и.",
        "createacct-realname": "Хьан цӀе (ца язйича мега)",
        "createaccountreason": "Бахьна:",
        "createacct-reason": "Бахьна",
        "createacct-submit": "Кхолла декъашхочун дӀаяздар",
        "createacct-another-submit": "Кхолла декъашхочун кхин дӀаяздар",
        "createacct-benefit-heading": "{{SITENAME}} кхолийна хьо санначу наха.",
-       "createacct-benefit-body1": "{{PLURAL:$1|1=нисдар|нисдарш}}",
-       "createacct-benefit-body2": "{{PLURAL:$1|1=яззам|яззамаш}}",
-       "createacct-benefit-body3": "{{PLURAL:$1|1=декъашхо|декъашхой}} тӀаьхьарачу хенахь",
+       "createacct-benefit-body1": "{{PLURAL:$1|нисдар|нисдарш}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|яззам|яззамаш}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|декъашхо|декъашхой}} тӀаьхьарчу хенахь",
        "badretype": "Ахьа язъен ишарш цхьатера яц",
        "userexists": "Ахьа язъен декъашхочун цӀе йолуш ю, дехар до кхин цӀе харжар.",
        "loginerror": "Гlалат ду декъашхо вовзарехь/йовзарехь",
        "login-userblocked": "ХӀара декъашхо блоктоьхна ву/ю. Системин чувала/яла магийна дац.",
        "wrongpassword": "Ахьа язйина йолу пароль нийса яц. Хьажа юху цхьаъз.",
        "wrongpasswordempty": "Дехар до, язъе еса йоцу пароль.",
-       "passwordtooshort": "Пароль хилла еза $1 {{PLURAL:$1|1=символ|символаш}} йолуш.",
+       "passwordtooshort": "Пароль хилла еза $1 {{PLURAL:$1|символ|символаш}} йолуш.",
        "password-name-match": "Язъен пароль декъашхочун дӀаяздарал башха хила еза.",
        "password-login-forbidden": "Иштта декъашхочун цӀе а пароль а лелаян цамаго.",
        "mailmypassword": "Пароль кхоссар",
        "accountcreated": "Декъашхочун дӀаяздар кхоьллина",
        "accountcreatedtext": "Кхоьллина декъашхочун [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|дийцаре.]]) дӀаяздар.",
        "createaccount-title": "{{SITENAME}}: декъашхочун дӀаяздар кхоллар",
+       "createaccount-text": "{{SITENAME}} ($4) проектехь цхьам хьан электронан почтан адрес яздина хӀара «$2» декъашхочун дӀаяздар кхоьллина. \n\nДекъашхочун пароль — «$3». Ахьа дан дезарг сайтан чу гӀой пароль хийца.\n\nДекъашхочун дӀаяздар цахууш кхоьллинехь хӀума а ма де.",
        "login-throttled": "Хьо дукха гӀиртира.\nДехар до, собар де $1 юха гӀортале.",
        "login-abort-generic": "Сестемин довзийта тарцаделира",
        "loginlanguagelabel": "Мотт: $1",
+       "suspicious-userlogout": "Хьан сеанс чекхъяккха дина дехаш кхочуш цадина, иза нийса йоцу браузерца дар бахьнехь я прокси кэш еш хилар бахьнехь.",
        "pt-login": "ЧугӀо",
        "pt-login-button": "ЧугӀо",
        "pt-createaccount": "Кхолла декъашхочун дӀаяздар",
        "savearticle": "Дlайазъé агlо",
        "preview": "Хьалха муха ю хьажа",
        "showpreview": "Хьалха муха ю хьажар",
-       "showlivepreview": "Сиха хьажар",
        "showdiff": "Хlоттина болу хийцам",
        "anoneditwarning": "'''Тергам бе''': Ахьа хьай цӀарца тадарш деш дац. Хьан IP-адрес дӀаяздина хира ду хӀокху агӀон истори чу.",
        "anonpreviewwarning": "''Системин чу цагӀахь хьан IP-адрес агӀона истори чу дӀаяз лур ду.''",
        "edit-gone-missing": "АгӀо карлаяккха цатарло.\nИза дӀаяьккхина хила мега.",
        "edit-conflict": "Тадарна дойнаш.",
        "edit-no-change": "Хьан нисдар юхадаьккхина, ахьа хийцамаш бина цахилар бахьнехь.",
-       "postedit-confirmation": "Хьан нисдар дӏайазъдина.",
+       "postedit-confirmation-created": "АгӀо кхоьллина.",
+       "postedit-confirmation-restored": "АгӀо меттахӀотта йина.",
+       "postedit-confirmation-saved": "Хьан нисдар дӀаяздина.",
        "edit-already-exists": "Керла агӀо кхолла цатарло.\nИза хӀинцале йолуш ю.",
        "defaultmessagetext": "Ӏад дитарца йоза",
        "content-failed-to-parse": "Чулацам $2 богӀуш бац $1: $3.",
        "invalid-content-data": "Хилийта йиш йоцу хаамаш",
        "content-not-allowed-here": "Чулацам \"$1\" [[$2]] агӀонгахь хилийта йиш яц",
+       "editpage-notsupportedcontentformat-title": "Чулацаман тайпа ловш яц",
        "content-model-wikitext": "вики-йоза",
        "content-model-text": "цхьалхе йоза",
        "content-model-javascript": "JavaScript",
        "undo-failure": "Юккъера хийцамаш бахьнехь нисдар юхадаккха йиш яц.",
        "undo-summary": "Юхадаьккхина {{GENDER:$2|декъашхочун}} [[Special:Contributions/$2|$2]] ([[User talk:$2|дийц.]]) нисдар $1",
        "undo-summary-username-hidden": "Юхадаьккхина декъашхочун нисдарш $1, цунна цӀе дӀахьулйина",
+       "cantcreateaccounttitle": "Декъашхочун дӀаяздар кхолла йиш яц",
        "viewpagelogs": "Гайта хlокху агlонан тептар",
        "nohistory": "ХӀокху агӀона хийцамаш бина хила бац.",
        "currentrev": "Карара верси",
        "revdelete-selected-text": "{{PLURAL:$1|Файлан хаьржина верси|Файлан хаьржина версеш}} [[:$2]]:",
        "revdelete-selected-file": "{{PLURAL:$1|Файлан хаьржина верси|Файлан хаьржина версеш}} [[:$2]]:",
        "logdelete-selected": "Тептар чура {{PLURAL:$1|хаьржина дӀаяздар|хаьржина дӀаяздарш}}:",
+       "revdelete-text-text": "ДӀаяьхна версеш агӀонан истори чохь хьалха санна гуш хира ю, амма чулацаман цхьадолу дакъош декъашхошна тӀекхочехь хира дац.",
+       "revdelete-text-file": "Файлан дӀаяьхна версеш агӀонан истори чохь хьалха санна гуш хира ю, амма чулацаман цхьадолу дакъош декъашхошна тӀекхочехь хира дац.",
+       "logdelete-text": "ДӀабяьхна тептар чура хиламаш тептарш чохь хьалха санна гуш хира бу, амма чулацаман цхьадолу дакъош декъашхошна тӀекхочехь хира дац.",
+       "revdelete-text-others": "{{grammar:genitive|{{SITENAME}}}} чура кхин куьйгалхошна хьалха санна йиш хира ю къайла болу чулацаме хьажа а юху меттахӀотта бан а оьцу интерфейс чухула, кхин тӀе бехкам бина бацахь.",
        "revdelete-confirm": "Дехар до, бакъдар ахьа деш дерг [[{{MediaWiki:Policy-url}}|бакъонашца]] деш хилар.",
        "revdelete-legend": "Доза тохар",
        "revdelete-hide-text": "Къайладаккха хӀокху агӀона чура йоза",
        "searchmenu-exists": "'''ХӀокху вики чохь йолуш ю ишта агӀо «[[:$1]]»'''",
        "searchmenu-new": "'''Кхолла ишта агӀо «[[:$1]]» хӀокху {{PLURAL:$2|0=|вики-проектехь.}}'''",
        "searchprofile-articles": "Къаьстина агlонаш",
-       "searchprofile-project": "ГӀона а проектан а агӀонаш",
        "searchprofile-images": "Мультимедиа",
        "searchprofile-everything": "Массанхьа",
        "searchprofile-advanced": "Шуьйра",
        "searchprofile-articles-tooltip": "Лаха оцу $1",
-       "searchprofile-project-tooltip": "Лаха оцу $1",
        "searchprofile-images-tooltip": "Файлаш лахар",
        "searchprofile-everything-tooltip": "Лаха массо агlонашкахь (дийцаре агlонашцани)",
        "searchprofile-advanced-tooltip": "Лаха дехарца хlокху ана цlерашкахь",
        "search-nonefound": "Дехаре терра цхьа хӀума ца карийна.",
        "powersearch-legend": "Шуьро лахар",
        "powersearch-ns": "Цlераши анахь лахар:",
-       "powersearch-redir": "Схьагайта дlасахьажийнарш",
        "powersearch-togglelabel": "Билгалдан:",
        "powersearch-toggleall": "Массо",
-       "powersearch-togglenone": "Хlумма цаоьшу",
+       "powersearch-togglenone": "ХӀумма цаоьшу",
        "search-external": "Арахула лахар",
        "search-error": "Лохуш гӀалат даьлла: $1",
        "preferences": "Гlирс нисбан",
        "rows": "МогӀанаш:",
        "columns": "БӀогӀамаш:",
        "searchresultshead": "Лаха",
-       "stub-threshold": "Ð\9aеÑ\87 Ñ\8fÑ\80ан Ð´Ð¾Ð·Ð° <a href=\"#\" class=\"stub\">коÑ\8cÑ\80Ñ\82амогÓ\80амна Ñ\85Ñ\8cажоÑ\80агаÑ\88</a> (байÑ\82аÑ\88каÑ\85):",
+       "stub-threshold": "Кеч яран доза <a href=\"#\" class=\"stub\">коьртамогӀамна хьажоргаш</a> (байташках):",
        "stub-threshold-disabled": "ДӀадайина",
        "recentchangesdays": "Керла нисдар гайта динахь:",
        "recentchangesdays-max": "Къезиг $1 {{PLURAL:$1|дена}}",
        "prefs-emailconfirm-label": "Бакъ яр электрони почт:",
        "youremail": "Электронан почта:",
        "username": "{{GENDER:$1|Декъашхочун цӀе}}:",
-       "uid": "Декъашхочун {{GENDER:$1|код}}:",
        "prefs-memberingroups": "{{GENDER:$1|Тобана|Тобаншан}} {{PLURAL:$2|декъашхо|декъашхой}}:",
        "prefs-registration": "ДӀаяздар кхолийна хан:",
        "yourrealname": "Хьан бакъ цӀе:",
        "prefs-advancedsearchoptions": "Кхин гӀирс нисбар",
        "prefs-advancedwatchlist": "Кхин гӀирс нисбар",
        "prefs-displayrc": "Гуш болу гӀирсаш",
-       "prefs-displaysearchoptions": "Гуш болу гӀирсаш",
        "prefs-displaywatchlist": "Гуш болу гӀирсаш",
        "prefs-diffs": "Башхон верси",
        "prefs-help-prefershttps": "И хийцам болх байта юхугӀо системин чу.",
        "right-move": "АгӀонашан цӀераш хийцар",
        "right-move-subpages": "АгӀонашан цӀераш хийцар цера бухара агӀонашцан",
        "right-move-rootuserpages": "декъашхочун ораман агӀонийн цӀераш хийцар",
+       "right-move-categorypages": "Категорийн агӀонийн цӀераш хийцар",
        "right-movefile": "Файлийн цӀе хийцар",
        "right-suppressredirect": "агӀона цӀе хуьйцуш ширчу цӀарах ма кхолла дӀасахьажаяр",
        "right-upload": "Файлаш чуйаьхар",
        "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": "йолуш йолу файлан тӀехула дӀаязъяр",
        "recentchanges-label-plusminus": "байташкахь барам хийцар",
        "recentchanges-legend-newpage": "(хьажа кхин [[Special:NewPages|керла агӀонийн могӀа]])",
        "rcnotefrom": "Лахахь гайтина тӀера <strong>$2</strong> (хийцамаш <strong>$1</strong> кӀезиг).",
-       "rclistfrom": "Гайта хийцам оцу $1.",
+       "rclistfrom": "Гайта хийцам оцу $3 $2",
        "rcshowhideminor": "$1 кегийра нисдарш",
        "rcshowhideminor-show": "Гайта",
        "rcshowhideminor-hide": "Къайладаха",
        "uploadnologintext": "Серверан чу файлаш яха хьо $1.",
        "uploaderror": "Файл чуяккхаран гӀалат",
        "upload-recreate-warning": "'''Тегам бе: иштта цӀе йолу файл дӀаяьккхина я цӀе хийцина.'''\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>''' файлан тӀе хьажораг хӀотайо файл агӀонгахь ца гуш.",
+       "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.",
        "upload-prohibited": "Магийна доцу файлийн тайпанаш: $1.",
        "upload-warning-msg": "Чуйоккхуш [$2] гӀалат даьлла. И нисдан юхагӀо [[Special:Upload/stash/$1|upload form]] чу.",
        "upload-proto-error": "Нийса йоцу протокол",
        "upload-file-error": "Чоьхьара гӀалат",
+       "upload-misc-error": "Чуяккхаран цадевза гӀалат",
        "upload-http-error": "Даьлла гӀалат HTTP: $1",
        "backend-fail-stream": "ДӀаяккха цатарло файл «$1».",
        "backend-fail-backup": "Таро яц файлан $1 тӀаьхьалонан копиян.",
        "backend-fail-maxsize": "Файл $1 дӀаязъян цаелира, цуна барам $2 {{PLURAL:$2|байт}} сов хилар бахьнехь.",
        "backend-fail-readonly": "ХӀара «$1» хӀинца еша бен таро яц. Бахьна: «$2»",
        "lockmanager-notlocked": "БлокдӀаяккха цаелира \"$1\"; цуна блоктоьхна яц.",
+       "lockmanager-fail-closelock": "Блоктохаран «$1» файл къайлаяккха цаелира.",
+       "lockmanager-fail-deletelock": "Блоктохаран файл «$1» дӀаяккха цатарло.",
+       "lockmanager-fail-acquirelock": "«$1» блоктоха цатарло.",
+       "lockmanager-fail-openlock": "Блоктохаран «$1» файл схьаелла цаелира.",
+       "lockmanager-fail-releaselock": "\"$1\" блокдӀаяккха цаелира.",
        "uploadstash": "Къайлаха чуяккхар",
+       "uploadstash-clear": "ДӀацӀанъян къайла йолу файлаш",
+       "uploadstash-nofiles": "Хьан къайла файлаш яц.",
+       "uploadstash-errclear": "Файлаш дӀацӀанъян цаелира.",
+       "uploadstash-refresh": "Карлабаккха файлийн могӀам",
+       "img-auth-accessdenied": "ТӀекхача магийна дац",
+       "img-auth-streaming": "Тоба дӀаелар «$1».",
+       "http-invalid-url": "ГӀалате URL: $1",
+       "http-read-error": "Ешаран гӀалат HTTP.",
        "http-timed-out": "Хьежаран хан чекхели HTTP-жоп дехаран.",
+       "http-curl-error": "URLан гӀалат: $1",
+       "upload-curl-error28": "Чуйоккху хан чеккхелла",
        "license": "Бакъойалар:",
        "license-header": "Бакъойалар",
        "nolicense": "Яц",
        "filepage-nofile-link": "Ишта цӀе йолуш файл яц. Хьа йиш ю и [$1 чуяккха].",
        "uploadnewversion-linktext": "Чуяккха керла верси хӀокху файлан",
        "shared-repo-from": "$1 чура",
+       "shared-repo": "юкъара Ӏалаше меттиг",
        "shared-repo-name-wikimediacommons": "Викигулам",
+       "upload-disallowed-here": "Хьан бакъо яц хӀара файл юху дӀаяздан.",
        "filerevert": "Тохарлера верси юхаерзор $1",
        "filerevert-legend": "Файлан верси юхаерзо",
        "filerevert-intro": "<span class=\"plainlinks\">Файл юхаерзош ю '''[[Media:$1|$1]]''' оцу [$4 верси $3, $2].</span>",
        "filedelete-reason-otherlist": "Кхин бахьна",
        "filedelete-reason-dropdown": "* Даржина долу дӀаяккхаран баьхьанаш \n** Авторан бакъонаш талхор\n** ЦхӀатера файлаш хилар",
        "filedelete-edit-reasonlist": "Бахьанин список нисяр",
+       "filedelete-maintenance-title": "Файл дӀаяккха цало",
        "mimesearch": "MIME хула лаха",
        "mimesearch-summary": "ХӀокху агӀоно йиш хуьлуьйту MIME-тайпан файлаш харжа. Яздеш долу формат: чулацаман тайп/бухара тайп, масала  <code>image/jpeg</code>.",
        "mimetype": "MIME-тайп:",
        "randomincategory-selectcategory": "Категори чу цахууш нийса елла агӀона чу гӀо: $1 $2.",
        "randomincategory-selectcategory-submit": "Дехьа гӀо",
        "randomredirect": "Цахууш нисделла дIасахьажор",
-       "statistics": "Ð\91Ñ\83Ñ\85еÑ\85Ñ\8cдеÑ\80г",
+       "statistics": "СÑ\82аÑ\82иÑ\81Ñ\82ика",
        "statistics-header-pages": "АгӀонийн жамӀ",
        "statistics-header-edits": "Нисдаран жамӀ",
        "statistics-header-views": "Хьажаран статистика",
        "statistics-header-users": "Декъашхойн жамӀа",
        "statistics-header-hooks": "Кхин статистика",
        "statistics-articles": "Яззамаш",
-       "statistics-pages": "Агlонаш",
+       "statistics-pages": "АгӀонаш",
        "statistics-pages-desc": "Массо вики агlонаш, дийцаре агlонашцани, дlасахьаждарш а кхин дерш.",
-       "statistics-files": "Чуйаьхна файлаш",
+       "statistics-files": "Чуяьхна файлаш",
        "statistics-edits": "Нисдаран дукхалла {{grammar:genitive|{{SITENAME}}}} дlа йолайаларца",
        "statistics-edits-average": "Юккъера агӀонан нисдаран терахь",
        "statistics-views-total": "Массо хьажарш",
        "brokenredirectstext": "Лахара дӀасахьажийнарш ю йоцучу агӀонийн тӀе хьажийна:",
        "brokenredirects-edit": "нисъе",
        "brokenredirects-delete": "дӀаяккха",
-       "withoutinterwiki": "ЮкÑ\8aаÑ\80вики-Ñ\85Ñ\8cажоÑ\80агаÑ\88 Ð¹Ð¾Ñ\86Ñ\83 Ð°Ð³Ó\80онаÑ\88",
-       "withoutinterwiki-summary": "Ð\9bаÑ\85аÑ\80а Ð°Ð³Ó\80онийн Ñ\8eкÑ\8aаÑ\80вики-Ñ\85Ñ\8cажоÑ\80агаÑ\88 Ñ\8fÑ\86:",
+       "withoutinterwiki": "Юкъарвики-хьажоргаш йоцу агӀонаш",
+       "withoutinterwiki-summary": "Лахара агӀонийн юкъарвики-хьажоргаш яц:",
        "withoutinterwiki-submit": "Гайта",
        "fewestrevisions": "ЧIогIа кIезиг башхонаш йолу агIонаш",
        "nbytes": "$1 {{PLURAL:$1|байт}}",
        "ntransclusions": "лелош ю $1 {{PLURAL:$1|агӀонгахь|агӀонашкахь}}",
        "specialpage-empty": "Дехаро хӀумма ца елла.",
        "lonelypages": "Байлахь йисина агIонаш",
-       "lonelypagestext": "Ð\9aÑ\85Ñ\83заÑ\85Ñ\8c Ñ\8e {{grammar:genitive|{{SITENAME}}}} ÐºÑ\85еÑ\87Ñ\83 Ð°Ð³Ó\80онаÑ\88каÑ\85Ñ\8c Ñ\82Ó\80е Ñ\85Ñ\8cажийна Ñ\85Ñ\8cажоÑ\80агаÑ\88 Ð¹Ð¾Ñ\86Ñ\83 Ð°Ð³Ó\80онаÑ\88.",
+       "lonelypagestext": "Кхузахь ю {{grammar:genitive|{{SITENAME}}}} кхечу агӀонашкахь тӀе хьажийна хьажоргаш йоцу агӀонаш.",
        "uncategorizedpages": "Категореш йоцу агIонаш",
        "uncategorizedcategories": "Категореш йоцу категореш",
        "uncategorizedimages": "Категореш йоцу файлаш",
        "listusers-desc": "Харжа къезиг хиларца",
        "usereditcount": "$1 {{PLURAL:$1|нисдар|нисдарш}}",
        "usercreated": "{{GENDER:$3|дӀавазвелла|дӀаязелла}} $1 $2",
-       "newpages": "Керла агlонаш",
+       "newpages": "Керла агӀонаш",
        "newpages-username": "Декъашхо:",
        "ancientpages": "Яззамаш оцу терахьца тӀаьххьара тадар дина долу",
        "move": "ЦӀе хийца",
        "log-title-wildcard": "ХӀокху символашца болалуш болу кортанаш карабе",
        "showhideselectedlogentries": "Гайта/къайлаяха хаьржина башхонаш",
        "allpages": "Массо агӀонаш",
-       "alphaindexline": "тӀера $1 $2 кхаччалц",
        "nextpage": "Тlаьхьа йогlу агlо ($1)",
        "prevpage": "Хьалхалера агlо ($1)",
        "allpagesfrom": "Гучé яха агӀонаш, йолалуш йолу оцу:",
        "allarticles": "Массо агӀонаш",
        "allinnamespace": "Массо агlонаш оцу цlери анахь «$1»",
        "allpagessubmit": "Кхочушдé",
-       "allpagesprefix": "Лаха агlонаш, дlайуьлалуш йолу:",
+       "allpagesprefix": "Лаха агӀонаш, дӀайолалуш йолу:",
        "allpagesbadtitle": "Цамагош йолу агӀон цӀе. Коьрта могӀан юкъах ю юкъарвики меттанашан юкъе тӀечӀагӀйина йолу хьаьрк йа магийна доцу оцу коьрта моӀанца символаш йа кхин.",
-       "allpages-bad-ns": "{{SITENAME}} кху чохь ана цlераш яц «$1».",
+       "allpages-bad-ns": "{{SITENAME}} кху чохь ана цӀераш яц «$1».",
        "allpages-hide-redirects": "Къайлаяха дӀасахьажийнарш",
        "cachedspecial-refresh-now": "Хьажа тӀехьарчу версега.",
        "categories": "Категореш",
        "listgrouprights-namespaceprotection-namespace": "ЦӀерийн ана",
        "listgrouprights-namespaceprotection-restrictedto": "Декъашхочун хийцамаш бан таро хуьлуьйту бакъонаш",
        "trackingcategories-msg": "Категореш зер",
+       "trackingcategories-name": "Хааман цӀе",
        "expensive-parserfunction-category-desc": "АгӀорахь тӀех дуккха ресурсийн функцеш лелош ю (<code>#ifexist</code> саниш). Мадарра ду — [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit] агӀонгахь.",
+       "trackingcategories-nodesc": "Цунах лаьцна хӀума дац.",
+       "trackingcategories-disabled": "Категори дӀаяйина ю",
+       "mailnologin": "ДӀаяхьийта адрес дац",
        "mailnologintext": "Электронан кехаташ кхехьийта йиш хилийта [[Special:UserLogin|системин чугӀо]] кхин декъашхошка хаамаш кхехьийта хьа [[Special:Preferences|гӀирса чохь]] бакъалла долу электронан почтан адрес хила деза.",
        "emailuser": "Декъашхочун хааман кехат",
-       "emailuser-title-target": "Декъашхочунга кехат яздар",
+       "emailuser-title-target": "{{GENDER:$1|декъашхочунга}} электронан хаам базбар",
        "emailuser-title-notarget": "Декъашхочунга кехат яздар",
        "emailpage": "Декъашхочунга кехат яздар",
        "emailpagetext": "ХӀокху агӀона гӀоьнца йиш ю {{GENDER:$1|декъашхочун}} электронан почте хаам бахьийта.\nХьоьга жоп лур ду ахьа [[Special:Preferences|хьайн гӀирса чу]] дӀаяздина долу адрес тӀе.",
        "defemailsubject": "Хаам {{grammar:genitive|{{SITENAME}}}} чура бу",
+       "usermaildisabled": "Декъашхочун электронан почта дӀаяйина ю",
+       "noemailtitle": "Электронан почтан адрес дац",
        "emailusername": "Декъашхочун цӀе:",
        "emailusernamesubmit": "ДӀадахьийта",
        "email-legend": "{{grammar:genitive|{{SITENAME}}}} кхечу декъашхочунга кехат дахьийтар",
        "watchlist-details": "Хьан тергаме могӀанца $1 {{PLURAL:$1|агӀо}} ю, дийцаре агӀонаш йоцуш.",
        "wlheader-enotif": "Электронан почте хаамаш байтар латина ду.",
        "wlheader-showupdated": "Хийцам бина агӀонаш '''Ӏаьржа''' шрифтцан билгальяха ю.",
-       "watchlistcontains": "Хьан тергаме могӀам чохь ю $1 {{PLURAL:$1|агӀо|агӀонаш}}.",
-       "iteminvalidname": "«$1» элементаца гӀалат ду, магийна йоцу цӀе…",
        "wlnote2": "Лахахьа гайтина {{PLURAL:$1|тӀеххьара сахьт}} чохь бина хийцамаш $2 $3.",
        "wlshowlast": "Гайта тӀаьххьара $1 сахьт $2 де $3",
        "watchlist-options": "Тергаме могlаман гlирс нисбар",
        "undelete-search-prefix": "Гайта агӀонаш йолалуш йолу тӀера:",
        "undelete-search-submit": "Лаха",
        "undelete-no-results": "Архив чохь йогӀуш агӀонаш цакарий.",
+       "undelete-error": "АгӀо меттахӀоттаяран гӀалат",
+       "undelete-error-short": "Файл меттахӀоттаяран гӀалат: $1",
+       "undelete-error-long": "Файл меттахӀоттош гӀалат даьлла:\n\n$1",
        "undelete-show-file-submit": "Хlаъ",
        "namespace": "Цlерийн ана:",
        "invert": "Хаьржинарг хилийта",
        "contributions-title": "{{GENDER:$1|Декъашхочун}} къинхьегам $1",
        "mycontris": "Сан къинхьегам",
        "contribsub2": "Къинхьегам $1 ($2)",
+       "contributions-userdoesnotexist": "«$1» декъашхочун дӀаяздар дӀаяздина яц.",
        "nocontribs": "Дехарца хийцамаш цакарий.",
        "uctop": " (тlаьхьара)",
        "month": "Баттаца (я хьалхе):",
        "year": "Шерачохь (я хьалхе):",
        "sp-contributions-newbies": "Гайта бекъ къинхьегам, керла дlабазбиначара бина болу",
+       "sp-contributions-newbies-sub": "Керла декъашхойн дӀаяздаршкара",
        "sp-contributions-blocklog": "блоктоьхарш",
        "sp-contributions-suppresslog": "Декъашхочун дӀабаьккхина къинхьегам",
        "sp-contributions-deleted": "дӀадяхна нийсдарш",
        "whatlinkshere-title": "ХӀокхунца «$1» йолу агӀонаш",
        "whatlinkshere-page": "Агlо:",
        "linkshere": "ТӀаьхьайогӀу агӀонаш оцу '''[[:$1]]''': хьажорагца ю",
-       "nolinkshere": "Ð¥Ó\80окÑ\85Ñ\83 '''[[:$1]]''' Ð°Ð³Ó\80она Ñ\82Ó\80е ÐºÑ\85еÑ\87Ñ\83 Ð°Ð³Ó\80онаÑ\88каÑ\85Ñ\8c Ñ\85Ñ\8cажоÑ\80агаÑ\88 Ñ\8fÑ\86.",
+       "nolinkshere": "ХӀокху '''[[:$1]]''' агӀона тӀе кхечу агӀонашкахь хьажоргаш яц.",
        "nolinkshere-ns": "Хаьржинчу анахь яц '''[[:$1]]''' цӀе йолу агӀонаш",
        "isredirect": "агӀо-дӀасахьажайар",
        "istemplate": "юкъаялийнарш",
        "whatlinkshere-hideredirs": "$1 дӀасахьажорш",
        "whatlinkshere-hidetrans": "$1 латораш",
        "whatlinkshere-hidelinks": "$1 хьажоргаш",
-       "whatlinkshere-hideimages": "$1 Ñ\84айлийн Ñ\85Ñ\8cажоÑ\80агаÑ\88",
+       "whatlinkshere-hideimages": "$1 файлийн хьажоргаш",
        "whatlinkshere-filters": "Литтарш",
        "autoblockid": "Ша блоккхетар #$1",
        "block": "Декъашхочун блоктохар",
        "blockip": "Блоктоха",
        "blockip-legend": "Декъашхочун блоктохар",
        "blockiptext": "Бухахь йолу форманца блоктоха IP-адресна цунтӏера дӏаяздарш ца дайта.\nБлоктоха магийна цо зенаш деш делахь кхин хӏокху [[{{MediaWiki:Policy-url}}|низам ца]].\nЛахахь билгалде блоктохарна бахьна.",
-       "ipadressorusername": "IP-адрес я декъашхочун цӀе:",
+       "ipaddressorusername": "IP-адрес я декъашхочун цӀе:",
        "ipbexpiry": "Хан чекхйолу:",
        "ipbreason": "Бахьна:",
-       "ipbreason-dropdown": "* Ð\91елÑ\85ан Ð½ÐµÐºÑ\8a Ð´Ó\80акÑ\8aовлаÑ\80 Ð±Ð°Ñ\85Ñ\8cанаÑ\88:\n** Ð¥Ð°Ñ\80Ñ\86а Ñ\85аам Ð±Ð°Ñ\80\n** Ð\90гÓ\80онан Ñ\87Ñ\83Ñ\80аниг Ð´Ó\80аÑ\8fккÑ\85аÑ\80\n** Ð¡Ð¿Ð°Ð¼-Ñ\85Ñ\8cажоÑ\80агаÑ\88 Ð°Ñ\80аÑ\85Ñ\8cаÑ\80а Ñ\81айÑ\82аÑ\88на\n** Ð\9cаÑ\8cÓ\80на Ð´Ð¾Ñ\86Ñ\83 Ñ\82екÑ\81Ñ\82 Ñ\82Ó\80еÑ\82оÑ\85аÑ\80\n** Ð\94екÑ\8aаÑ\88Ñ\85ой Ñ\85Ñ\8cийзабаÑ\80, ÐºÑ\85еÑ\80амаÑ\88 Ñ\82иÑ\81Ñ\81аÑ\80\n** Ð\9cаÑ\81ийÑ\82Ñ\82а Ð»Ð°Ñ\80аман Ñ\8fздаÑ\80 Ð·Ñ\83ламан Ð»ÐµÐ»Ð°Ñ\8fÑ\80\n** Ð\9cагитина йоцу декъашхочун цӀе",
+       "ipbreason-dropdown": "* Ð\91елÑ\85ан Ð½ÐµÐºÑ\8a Ð´Ó\80акÑ\8aовлаÑ\80 Ð±Ð°Ñ\85Ñ\8cанаÑ\88:\n** Ð¥Ð°Ñ\80Ñ\86а Ñ\85аам Ð±Ð°Ñ\80\n** Ð\90гÓ\80онан Ñ\87Ñ\83Ñ\80аниг Ð´Ó\80аÑ\8fккÑ\85аÑ\80\n** Ð¡Ð¿Ð°Ð¼-Ñ\85Ñ\8cажоÑ\80гаÑ\88 Ð°Ñ\80аÑ\85Ñ\8cаÑ\80а Ñ\81айÑ\82аÑ\88на\n** Ð\9cаÑ\8cÓ\80на Ð´Ð¾Ñ\86Ñ\83 Ñ\82екÑ\81Ñ\82 Ñ\82Ó\80еÑ\82оÑ\85аÑ\80\n** Ð\94екÑ\8aаÑ\88Ñ\85ой Ñ\85Ñ\8cийзабаÑ\80, ÐºÑ\85еÑ\80амаÑ\88 Ñ\82ийÑ\81аÑ\80\n** Ð\9cаÑ\81ийÑ\82Ñ\82а Ð»Ð°Ñ\80аман Ñ\8fздаÑ\80 Ð·Ñ\83ламан Ð»ÐµÐ»Ð°Ñ\8fÑ\80\n** Ð\9cагийтина йоцу декъашхочун цӀе",
        "ipb-hardblock": "Шаш довзийтина болу декъашхошна бехкам бе хӀокху IP-адресца тадарш дан",
        "ipbcreateaccount": "Цамаго керла декъашхочун дӀаяздарш кхолла",
        "ipbemailban": "Цамагдо декъашхошка хааман кехаташ кхехьийта",
        "ipb-change-block": "Юхаблоктоха декъашхочун оьцу хийцамашца",
        "ipb-confirm": "Бакъде блоктохар",
        "blockipsuccesssub": "Блоктохар чакхдели",
-       "blockipsuccesstext": "[[Special:Contributions/$1|«$1»]] {{GENDER:$1|блоктоьхна ву|блоктоьхна ю}}.<br />\nХьажа. [[Special:BlockList|блоктоьхна IP-адресашан могӀам]].",
+       "blockipsuccesstext": "[[Special:Contributions/$1|«$1»]] {{GENDER:$1|блоктоьхна}}.<br />\nХьажа. [[Special:BlockList|блоктоьхна IP-адресийнн могӀам]].",
        "ipb-blockingself": "Хьо хьайна блоктоха гӀерта! Лаьий хьона и кхочушдан?",
        "ipb-edit-dropdown": "Бахьанин список нисяр",
        "ipb-unblock-addr": "ДӀаякхаблок $1",
        "unblockiptext": "Лелае лахара форма IP-адрес тӀера я декъашхойн дӀаяздар тӀера блокдӀайокхуш.",
        "ipusubmit": "ДIаяккха хӀара блок",
        "unblocked": "[[User:$1|$1]] хьайаьстина.",
+       "unblocked-range": "$1 блоктоьхна",
+       "unblocked-id": "$1 блокдӀаяьккхина",
        "blocklist": "Блоктоьхна декъашхой",
        "ipblocklist": "Блоктоьхна декъашхой",
        "ipblocklist-legend": "Блоктоьхна декъашхо лахар",
        "block-log-flags-noemail": "цамаго кехаташ кхехӀита",
        "block-log-flags-nousertalk": "шин дийцаре агӀо тая лууш дац",
        "block-log-flags-hiddenname": "декъашхочун цӀе къайлаяьккхина",
-       "ipb-needreblock": "ХӀара $1 {{GENDER:$1|блоктоьхна ву|блоктоьхна ю}}. Лаьий хьуна блоктохаран параметраш хийца?",
+       "ipb_expiry_invalid": "Дешдерг дан нийса йоцу хан.",
+       "ipb-needreblock": "ХӀокху $1 декъашхочун {{GENDER:$1|блоктоьхна ю}}. Лаьий хьуна блоктохаран параметраш хийца?",
        "ipb-otherblocks-header": "{{PLURAL:$1|Кхин блоктохар|Кхин блоктохарш}}",
        "unblock-hideuser": "Декъашхочун тӀера блокдӀаяккха хьа таро яц, цуна цӀе хьулйина хилар бахьанехь.",
+       "ip_range_invalid": "IP-адресийн магийна йоцу диапазон.",
        "move-page": "$1 — цӀе хийцар",
        "move-page-legend": "ЦӀe хийца яр",
-       "movepagetext": "Ð\91Ñ\83Ñ\85аÑ\85Ñ\8c Ð¹Ð¾Ð»Ñ\83 Ñ\84оÑ\80манÑ\86а Ð°Ð³Ó\80он Ñ\86Ó\80е Ñ\85ийÑ\86ало. Ð¦Ñ\83л Ñ\81овнаÑ\85 Ñ\86Ñ\83Ñ\8cна Ñ\85ийÑ\86аман Ð¶Ñ\83Ñ\80нал ÐºÑ\85оÑ\8cÑ\87Ñ\83 Ð¼ÐµÑ\82Ñ\82е Ð´Ð¾ÐºÐºÑ\85а. Ð¥Ñ\8cалÑ\85алеÑ\80а Ñ\86Ó\80аÑ\80аÑ\85Ñ\8c Ñ\85иÑ\80Ñ\8aÑ\8e ÐºÐµÑ\80ла ÐºÑ\85оÑ\8cллина Ð°Ð³Ó\80онан Ñ\85Ñ\8cажоÑ\80аг.\n\nÐ¥Ñ\8cовÑ\81алаÑ\88 [[Special:DoubleRedirects|Ñ\88алÑ\85а]] Ð° [[Special:BrokenRedirects|йоÑ\85на Ñ\85Ñ\8cажоÑ\80агаÑ\88]] Ñ\8eй Ñ\82еÑ\85Ñ\8c Ð°Ñ\8cлла.\n\nШÑ\83 Ð¶Ð¾Ñ\8cпеÑ\85Ñ\8c Ð´Ñ\83 Ñ\85Ñ\8cажоÑ\80агаш нийса некъ гойтуш хиларан.\n\nТидам бе хьалхалера агӀон цӀе ‘’’хийцалур яц’’’ иштта цӀе йолу агӀо йолуш елахь. Юкъардаккхар: йолуш йолу агӀо кхоьчухьа хьажораг елахь, я еса елахь а, цуьна хьийцаме истори яцахь а.\n\nИ бохург ду шун агӀонан цӀе юха а хьалха хилларгчунтӀе хийца йиш ю, амма йолуш йолу агӀо дӀаяккха йиш яц.\n\n'''ДӀАХЬЕДАР!'''\n\nЦӀе хийцар бахьнехь гӀаръяьлла агӀонашна дукха дагахь боцу хийцамаш хила тарло. Цундела цӀе хийцале шеш хила тарлучу тӀехьонашах кхета аьлла тешна хила.",
-       "movepagetext-noredirectfixer": "Ð\91Ñ\83Ñ\85аÑ\85Ñ\8c Ð¹Ð¾Ð»Ñ\83 Ñ\84оÑ\80манÑ\86а Ð°Ð³Ó\80он Ñ\86Ó\80е Ñ\85ийÑ\86ало. Ð¦Ñ\83л Ñ\81овнаÑ\85 Ñ\86Ñ\83Ñ\8cна Ñ\85ийÑ\86аман Ð¶Ñ\83Ñ\80нал ÐºÑ\85оÑ\8cÑ\87Ñ\83 Ð¼ÐµÑ\82Ñ\82е Ð´Ð¾ÐºÐºÑ\85а. Ð¥Ñ\8cалÑ\85алеÑ\80а Ñ\86Ó\80аÑ\80аÑ\85Ñ\8c Ñ\85иÑ\80Ñ\8aÑ\8e ÐºÐµÑ\80ла ÐºÑ\85оÑ\8cллина Ð°Ð³Ó\80онан Ñ\85Ñ\8cажоÑ\80аг.\n\nÐ¥Ñ\8cовÑ\81алаÑ\88 [[Special:DoubleRedirects|Ñ\88алÑ\85а]] Ð° [[Special:BrokenRedirects|йоÑ\85на Ñ\85Ñ\8cажоÑ\80агаÑ\88]] Ñ\8eй Ñ\82еÑ\85Ñ\8c Ð°Ñ\8cлла.\n\nШÑ\83 Ð¶Ð¾Ñ\8cпеÑ\85Ñ\8c Ð´Ñ\83 Ñ\85Ñ\8cажоÑ\80агаÑ\88 Ð½Ð¸Ð¹Ñ\81а Ð½ÐµÐºÑ\8a Ð³Ð¾Ð¹Ñ\82Ñ\83Ñ\88 Ñ\85илаÑ\80ан.\n\nТидам Ð±Ðµ Ñ\85Ñ\8cалÑ\85алеÑ\80а Ð°Ð³Ó\80он Ñ\86Ó\80е â\80\98â\80\99â\80\99Ñ\85ийÑ\86алÑ\83Ñ\80 Ñ\8fÑ\86â\80\99â\80\99â\80\99 Ð¸Ñ\88Ñ\82Ñ\82а Ñ\86Ó\80е Ð¹Ð¾Ð»Ñ\83 Ð°Ð³Ó\80о Ð¹Ð¾Ð»Ñ\83Ñ\88 ÐµÐ»Ð°Ñ\85Ñ\8c. Ð®ÐºÑ\8aаÑ\80даккÑ\85аÑ\80: Ð¹Ð¾Ð»Ñ\83Ñ\88 Ð¹Ð¾Ð»Ñ\83 Ð°Ð³Ó\80о ÐºÑ\85оÑ\8cÑ\87Ñ\83Ñ\85Ñ\8cа Ñ\85Ñ\8cажоÑ\80аг ÐµÐ»Ð°Ñ\85Ñ\8c, Ñ\8f ÐµÑ\81а ÐµÐ»Ð°Ñ\85Ñ\8c Ð°, Ñ\86Ñ\83Ñ\8cна Ñ\85Ñ\8cийÑ\86аме Ð¸Ñ\81Ñ\82оÑ\80и Ñ\8fÑ\86аÑ\85Ñ\8c Ð°.\n\nÐ\98 Ð±Ð¾Ñ\85Ñ\83Ñ\80г Ð´Ñ\83 Ñ\88Ñ\83н Ð°Ð³Ó\80онан Ñ\86Ó\80е Ñ\8eÑ\85а Ð° Ñ\85Ñ\8cалÑ\85а Ñ\85иллаÑ\80гÑ\87Ñ\83нÑ\82Ó\80е Ñ\85ийÑ\86а Ð¹Ð¸Ñ\88 Ñ\8e, Ð°Ð¼Ð¼Ð° Ð¹Ð¾Ð»Ñ\83Ñ\88 Ð¹Ð¾Ð»Ñ\83 Ð°Ð³Ó\80о Ð´Ó\80аÑ\8fккÑ\85а Ð¹Ð¸Ñ\88 Ñ\8fÑ\86.\n\n'''Ð\94Ó\80Ð\90ХЬÐ\95Ð\94Ð\90Р!'''\n\nЦÓ\80е Ñ\85ийÑ\86аÑ\80 Ð±Ð°Ñ\85Ñ\8cнеÑ\85Ñ\8c Ð³Ó\80аÑ\80Ñ\8aÑ\8fлла агӀонашна дукха дагахь боцу хийцамаш хила тарло. Цундела цӀе хийцале шеш хила тарлучу тӀехьонашах кхета аьлла тешна хила.",
+       "movepagetext": "Ð\91Ñ\83Ñ\85аÑ\85Ñ\8c Ð¹Ð¾Ð»Ñ\83 Ñ\84оÑ\80манÑ\86а Ð°Ð³Ó\80он Ñ\86Ó\80е Ñ\85ийÑ\86ало. Ð¦Ñ\83л Ñ\81овнаÑ\85 Ñ\86Ñ\83Ñ\8cна Ñ\85ийÑ\86аман Ð¶Ñ\83Ñ\80нал ÐºÑ\85оÑ\8cÑ\87Ñ\83 Ð¼ÐµÑ\82Ñ\82е Ð´Ð¾ÐºÐºÑ\85а. Ð¥Ñ\8cалÑ\85алеÑ\80а Ñ\86Ó\80аÑ\80аÑ\85Ñ\8c Ñ\85иÑ\80Ñ\8aÑ\8e ÐºÐµÑ\80ла ÐºÑ\85оÑ\8cллина Ð°Ð³Ó\80онан Ñ\85Ñ\8cажоÑ\80аг.\n\nÐ¥Ñ\8cовÑ\81алаÑ\88 [[Special:DoubleRedirects|Ñ\88алÑ\85а]] Ð° [[Special:BrokenRedirects|йоÑ\85на Ñ\85Ñ\8cажоÑ\80гаÑ\88]] Ñ\8eй Ñ\82еÑ\85Ñ\8c Ð°Ñ\8cлла.\n\nШÑ\83 Ð¶Ð¾Ñ\8cпеÑ\85Ñ\8c Ð´Ñ\83 Ñ\85Ñ\8cажоÑ\80гаш нийса некъ гойтуш хиларан.\n\nТидам бе хьалхалера агӀон цӀе ‘’’хийцалур яц’’’ иштта цӀе йолу агӀо йолуш елахь. Юкъардаккхар: йолуш йолу агӀо кхоьчухьа хьажораг елахь, я еса елахь а, цуьна хьийцаме истори яцахь а.\n\nИ бохург ду шун агӀонан цӀе юха а хьалха хилларгчунтӀе хийца йиш ю, амма йолуш йолу агӀо дӀаяккха йиш яц.\n\n'''ДӀАХЬЕДАР!'''\n\nЦӀе хийцар бахьнехь гӀаръяьлла агӀонашна дукха дагахь боцу хийцамаш хила тарло. Цундела цӀе хийцале шеш хила тарлучу тӀехьонашах кхета аьлла тешна хила.",
+       "movepagetext-noredirectfixer": "Ð\91Ñ\83Ñ\85аÑ\85Ñ\8c Ð¹Ð¾Ð»Ñ\83 Ñ\84оÑ\80манÑ\86а Ð°Ð³Ó\80он Ñ\86Ó\80е Ñ\85ийÑ\86ало. Ð¦Ñ\83л Ñ\81овнаÑ\85 Ñ\86Ñ\83Ñ\8cна Ñ\85ийÑ\86аман Ð¶Ñ\83Ñ\80нал ÐºÑ\85оÑ\8cÑ\87Ñ\83 Ð¼ÐµÑ\82Ñ\82е Ð´Ð¾ÐºÐºÑ\85а. Ð¥Ñ\8cалÑ\85алеÑ\80а Ñ\86Ó\80аÑ\80аÑ\85Ñ\8c Ñ\85иÑ\80Ñ\8aÑ\8e ÐºÐµÑ\80ла ÐºÑ\85оÑ\8cллина Ð°Ð³Ó\80онан Ñ\85Ñ\8cажоÑ\80аг.\n\nÐ¥Ñ\8cовÑ\81алаÑ\88 [[Special:DoubleRedirects|Ñ\88алÑ\85а]] Ð° [[Special:BrokenRedirects|йоÑ\85на Ñ\85Ñ\8cажоÑ\80гаÑ\88]] Ñ\8eй Ñ\82еÑ\85Ñ\8c Ð°Ñ\8cлла.\n\nШÑ\83 Ð¶Ð¾Ñ\8cпеÑ\85Ñ\8c Ð´Ñ\83 Ñ\85Ñ\8cажоÑ\80гаÑ\88 Ð½Ð¸Ð¹Ñ\81а Ð½ÐµÐºÑ\8a Ð³Ð¾Ð¹Ñ\82Ñ\83Ñ\88 Ñ\85илаÑ\80ан.\n\nТидам Ð±Ðµ Ñ\85Ñ\8cалÑ\85алеÑ\80а Ð°Ð³Ó\80он Ñ\86Ó\80е â\80\98â\80\99â\80\99Ñ\85ийÑ\86алÑ\83Ñ\80 Ñ\8fÑ\86â\80\99â\80\99â\80\99 Ð¸Ñ\88Ñ\82Ñ\82а Ñ\86Ó\80е Ð¹Ð¾Ð»Ñ\83 Ð°Ð³Ó\80о Ð¹Ð¾Ð»Ñ\83Ñ\88 ÐµÐ»Ð°Ñ\85Ñ\8c. Ð®ÐºÑ\8aаÑ\80даккÑ\85аÑ\80: Ð¹Ð¾Ð»Ñ\83Ñ\88 Ð¹Ð¾Ð»Ñ\83 Ð°Ð³Ó\80о ÐºÑ\85оÑ\8cÑ\87Ñ\83Ñ\85Ñ\8cа Ñ\85Ñ\8cажоÑ\80аг ÐµÐ»Ð°Ñ\85Ñ\8c, Ñ\8f ÐµÑ\81а ÐµÐ»Ð°Ñ\85Ñ\8c Ð°, Ñ\86Ñ\83Ñ\8cна Ñ\85Ñ\8cийÑ\86аме Ð¸Ñ\81Ñ\82оÑ\80и Ñ\8fÑ\86аÑ\85Ñ\8c Ð°.\n\nÐ\98 Ð±Ð¾Ñ\85Ñ\83Ñ\80г Ð´Ñ\83 Ñ\88Ñ\83н Ð°Ð³Ó\80онан Ñ\86Ó\80е Ñ\8eÑ\85а Ð° Ñ\85Ñ\8cалÑ\85а Ñ\85иллаÑ\80гÑ\87Ñ\83нÑ\82Ó\80е Ñ\85ийÑ\86а Ð¹Ð¸Ñ\88 Ñ\8e, Ð°Ð¼Ð¼Ð° Ð¹Ð¾Ð»Ñ\83Ñ\88 Ð¹Ð¾Ð»Ñ\83 Ð°Ð³Ó\80о Ð´Ó\80аÑ\8fккÑ\85а Ð¹Ð¸Ñ\88 Ñ\8fÑ\86.\n\n'''Ð\94Ó\80Ð\90ХЬÐ\95Ð\94Ð\90Р!'''\n\nЦÓ\80е Ñ\85ийÑ\86аÑ\80 Ð±Ð°Ñ\85Ñ\8cнеÑ\85Ñ\8c Ð³Ó\80аÑ\80Ñ\8aÑ\8fÑ\8cлла агӀонашна дукха дагахь боцу хийцамаш хила тарло. Цундела цӀе хийцале шеш хила тарлучу тӀехьонашах кхета аьлла тешна хила.",
        "movepagetalktext": "ТӀе хӀоьттина йолу дийцаре агӀо ишта цӀе хийцина хира ю, '''цхьа йолу ханчохь, маца:'''\n\n*Йаьсса йоцу дийцаре агӀо йолуш ю оцу цӀарца йа\n*Ахьа къастаман харжам цабиняхь а къастам хӀотточехь.\n\nИшта чу ханчохь, ахьа дехьа яккха йезар ю йа куьйга хӀоттайар, нагахь иза хьашт йалахь.",
        "movearticle": "Цle хийца хlокху агlон",
        "moveuserpage-warning": "'''Тергам бе.''' Хьо декъашхочун агӀона цӀе хийца гӀерта. Дехар до, тергам бе, декъашхочун агӀона цӀе бен хийца лур яц, декъашхочун дӀаяздаран цӀе хийца лур яц.",
        "move-talk-subpages": "ЦӀе хийца бухара агӀонаши а агӀонашан дийцаре а ($1  кхаччалц)",
        "movepage-page-exists": "Агӏо $1 йолуш ю цундела и ша юху дӏаязъян йиш яц.",
        "movepage-page-moved": "АгӀона $1 цӀе хийцина → $2.",
-       "movelogpage": "Цlераш хийцаран тептар",
+       "movelogpage": "ЦӀераш хийцаран тептар",
        "movelogpagetext": "Лахахьа гойтуш ю цӀе хийцина агӀонаш.",
        "movesubpage": "{{PLURAL:$1|1=Бухара агӀо|Бухара агӀонаш}}",
        "movesubpagetext": "ХӀокху агӀона $1 {{PLURAL:$1|1=бухара агӀо ю|бухара агӀонаш ю}}.",
        "pageinfo-edits": "Массо нисдарийн дукхалла",
        "pageinfo-authors": "Башха авторийн дукхалла",
        "pageinfo-recent-edits": "ТӀехьарчу хана нисдарш ($1 хана)",
+       "pageinfo-recent-authors": "ТӀехьарчу хана башха автораш",
        "pageinfo-magic-words": "{{PLURAL:$1|Бозбуунчаллин дош|Бозбуунчаллин дешнаш}} ($1)",
        "pageinfo-hidden-categories": "{{PLURAL:$1|Къайла категори|Къайла категореш}} ($1)",
        "pageinfo-templates": "{{PLURAL:$1|1=Кеп|Кепаш}} ($1)",
        "pageinfo-toolboxlink": "Агlонах болу бовзам",
        "pageinfo-redirectsto": "ДӀасахьажорг",
        "pageinfo-redirectsto-info": "Хаам",
+       "pageinfo-contentpage": "Лорурго чулацаме гойту агӀо",
        "pageinfo-contentpage-yes": "ХӀаъ",
        "pageinfo-protect-cascading": "Чахчарин гӀоралла кхузара",
        "pageinfo-protect-cascading-yes": "ХӀаъ",
        "pageinfo-category-pages": "АгӀонийн дукхалла",
        "pageinfo-category-subcats": "Бухара категорийн дукхалла",
        "pageinfo-category-files": "Файлийн дукхалла",
-       "skinname-cologneblue": "Кёльнин сингаттам",
-       "skinname-modern": "Кхузаманан",
        "skinname-vector": "Векторни",
        "markaspatrolleddiff": "Билгалйе теллина санна",
        "markaspatrolledtext": "Билгала йе хӀара агӀо хьаьжна сана",
        "rcpatroldisabledtext": "ТӀехьара бина хийцамаш къобалбар хӀинца дӀадайина ду.",
        "markedaspatrollederror": "теллина сана билгалъян цало",
        "markedaspatrollednotify": "АгӀо «$1» пайдане хилар билгалдина",
+       "markedaspatrollederrornotify": "Хийцамаш хьаьжна сана билгал бан цабелира.",
        "patrol-log-page": "ТӀехьажаран тептар",
        "patrol-log-header": "Хьажжина версеш йолу тептар.",
        "log-show-hide-patrol": "$1 тӀехьажаран тептар",
+       "deletedrevision": "ДӀаяьккхина шира верси $1",
+       "filedeleteerror-short": "Файл дӀаяккхаран гӀалат: $1",
+       "filedeleteerror-long": "Файл дӀайоккхуш гӀалат даьлла:\n\n$1",
+       "filedelete-missing": "Файл «$1» дӀаяккха цало, и цахилар бахьнехь.",
+       "filedelete-old-unregistered": "Файлан «$1» билгалйина верси хаамийн базан чохь яц.",
        "previousdiff": "← Хьалхдоьда нисдинарг",
        "nextdiff": "Тlяхьа догlа нисдинарг →",
        "imagemaxsize": "Суьртан бараман доза тохар:<br />''(Файла агӀона куц дийцар)''",
        "file-info-png-repeat": "локху $1 {{PLURAL:$1|за}}",
        "file-info-png-frames": "$1 {{PLURAL:$1|кадр|кадраш}}",
        "newimages": "Керлачу файлийн галерей",
-       "newimages-summary": "ХӀокху белхан агӀона чохь гойтуш ю дукха хан йоццуш чуйаьхна файлаш.",
+       "newimages-summary": "ХӀокху белхан агӀона чохь гойтуш ю дукха хан йоццуш чуяьхна файлаш.",
        "newimages-legend": "Литтар",
-       "showhidebots": "$1 боташ",
+       "newimages-showbots": "Гайта боташ чуяьхна файлаш",
        "noimages": "Суьрташ дац.",
        "ilsubmit": "Лаха",
        "bydate": "терахьашца",
        "autosumm-replace": "АгӀона чуьраниг хийцина → «$1»",
        "autoredircomment": "ДӀасахьажийна цуна [[$1]] тӏе",
        "autosumm-new": "Керла агlо: «$1»",
-       "livepreview-loading": "Чуйолуш…",
-       "livepreview-ready": "Чуйолуш… Кийча ю!",
        "watchlistedit-normal-title": "Тергаме могӀанийн хийцамаш",
        "watchlistedit-normal-legend": "Тергаме могӀам юкъар дӀаяккхар",
        "watchlistedit-normal-explain": "Лахахь гойту хьан тергаме могӀамехь йолу агӀонаш.\nДӀаяздарш дӀадаха билгалде уьш такха тӀетаӀе кнопка «{{int:Watchlistedit-normal-submit}}».\nКхин хьа йиш ю [[Special:EditWatchlist/raw|йозан кепар могӀом нисба ]].",
        "watchlistedit-raw-submit": "МогӀам Ӏалашбар",
        "watchlistedit-raw-added": "{{PLURAL:$1|ТӀетоьхна}} $1 {{PLURAL:$1|дӀаяздар|дӀаяздарш}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|ДӀаяьккхина|ДӀаяьхна}} $1 {{PLURAL:$1|дӀаяздар|дӀаяздарш}}:",
+       "watchlistedit-clear-titles": "Корта:",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|ДӀаяьккхина|ДӀаяьхна}} $1 {{PLURAL:$1|дӀаяздар|дӀаяздарш}}:",
        "watchlisttools-view": "МогӀам чура агӀонашан хийцамаш",
        "watchlisttools-edit": "Хьажа/нисбé могlам",
        "watchlisttools-raw": "Йоза санна нисдé",
        "specialpages": "Леррина агlонаш",
        "specialpages-note": "* Гуттарлера белха агlонаш.\n* <strong class=\"mw-specialpagerestricted\">Кlеззиг таронаш йолу леррина агlонаш.</strong>",
        "specialpages-group-maintenance": "Жамlаш гlирса хьашташ кхочушдар",
-       "specialpages-group-other": "Ð\9aÑ\85ин Ð³lÑ\83ллакÑ\85ан Ð°Ð³lонаш",
+       "specialpages-group-other": "Ð\9aÑ\85ин Ð±ÐµÐ»Ñ\85ан Ð°Ð³Ó\80онаш",
        "specialpages-group-login": "Системин чугӀо / дӀаяздар кхолла",
        "specialpages-group-changes": "Керла нисдарш а тéптарш",
        "specialpages-group-media": "Жамlаш оцу медиа-гlирсашан а чуяхарш",
        "specialpages-group-users": "Декъашхой а бакъонаш",
-       "specialpages-group-highuse": "Уггаре дукха лелайо агlонаш",
+       "specialpages-group-highuse": "Уггаре дукха лелайо агӀонаш",
        "specialpages-group-pages": "АгӀонийн могӀанаш",
        "specialpages-group-pagetools": "ГӀирсаш оцу агӀонашан",
        "specialpages-group-wiki": "Хаамаш а гӀирсаш а",
-       "specialpages-group-redirects": "Дlасахьажош йолу гlуллакхан агlонаш",
+       "specialpages-group-redirects": "ДӀасахьажош йолу белхан агӀонаш",
        "specialpages-group-spam": "Спаман дуьхьала гӀирсаш",
        "blankpage": "Йаьсса агlо",
        "tags": "Болш болу хийцаман къастам",
        "compare-invalid-title": "Ахьа язйина йолу цӀе ца магайо.",
        "compare-title-not-exists": "Иштта цӀе яц.",
        "compare-revision-not-exists": "Иштта версеш яц.",
-       "dberr-header": "ХӀара вики ловш ю халона бала",
        "dberr-problems": "Бехк ма бил! Хlинц машан меттиган хилла гlирсаца халонаш.",
        "dberr-again": "Хьажа карла йаккха агlо массех минот йаьлча.",
        "dberr-info": "(аьтто ца хили зӀе хӀотта серверца бухара хаамашца: $1)",
        "feedback-close": "Кийчча ю",
        "searchsuggest-search": "Лаха",
        "searchsuggest-containing": "чуьраниг…",
+       "api-error-duplicate": "Иштта чулацам болу {{PLURAL:$1|1=[$2 кхин файл]|[$2 кхин файлаш]}} йолуш ю",
        "api-error-duplicate-popup-title": "{{PLURAL:$1|1=Файлан|Файлийн}} дубликат.",
        "api-error-empty-file": "Ахьа яхьийтина файл еса ю.",
+       "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": "Чоьхьара гӀалат: файл чуйоккхуш цхьа хӀума гӀалате хилла.",
+       "api-error-unknown-warning": "Доьвзуш доцу дӀахьедар: $1",
+       "api-error-unknownerror": "Доьвзуш доцу гӀалат: «$1».",
+       "api-error-uploaddisabled": "ХӀокху вики чохь файлаш чуяхар дӀадайина ду.",
+       "api-error-verification-error": "ХӀара файл йоьхна я хила цаеза тайпан хила мега.",
        "duration-seconds": "$1 {{PLURAL:$1|секунд}}",
        "duration-minutes": "$1 {{PLURAL:$1|минут}}",
        "duration-hours": "$1 {{PLURAL:$1|сахьт}}",
        "expand_templates_title": "АгӀона {{FULLPAGENAME}} корта кхин а:",
        "expand_templates_input": "Чудолу йоза:",
        "expand_templates_output": "Хилам",
+       "expand_templates_xml_output": "HTML-арадаккхар",
+       "expand_templates_html_output": "HTML-арадаккхар",
        "expand_templates_ok": "ХӀаъ",
        "expand_templates_remove_comments": "ДӀаяха комментареш",
        "expand_templates_remove_nowiki": "ДӀайоху тегаш <nowiki> хилча",
index 899ab4d..8cbc3db 100644 (file)
@@ -8,7 +8,8 @@
                        "Mirzali",
                        "Palang hernan",
                        "Reedy",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Binadlisan nga mga sumpay:",
@@ -21,7 +22,6 @@
        "tog-showtoolbar": "Ipakita ang toolbar sa pag-edit (JavaScript)",
        "tog-editondblclick": "I-edit ang panid inig dobol-klik (JavaScript)",
        "tog-editsectiononrightclick": "Mahimo ang pag-usab sa seksyon pinaagi sa pag-right click sa titulo sa seksyon (JavaScript kinahanglan)",
-       "tog-rememberpassword": "Hinumdomi ako sa kining kompyuter (for a maximum of $1 {{PLURAL:$1|day|days}})",
        "tog-watchcreations": "Bantayi ang akong gisugdang mga panid",
        "tog-watchdefault": "Bantayi ang akong giusab nga mga panid",
        "tog-watchmoves": "Bantayi ang akong gibalhin nga mga panid",
        "readonly_lag": "Ang database awtomatikong na-lock samtang ang mga slave database server mo-catch up sa master",
        "internalerror": "Internal nga sayop",
        "internalerror_info": "Internal nga sayop: $1",
-       "fileappenderror": "Dili ma-append ang \"$1\" ngadto sa \"$2\".",
        "filecopyerror": "Dili makopya ang payl nga \"$1\" ngadto sa \"$2\".",
        "filerenameerror": "Dili mailisag ngalan ang payl \"$1\" ngadto sa \"$2\".",
        "filedeleteerror": "Dili mapapas ang payl \"$1\".",
        "directorycreateerror": "Dili makahimo og direktoryo nga \"$1\".",
        "filenotfound": "Dili makita ang payl nga \"$1\".",
-       "fileexistserror": "Dili makasulat sa payl nga \"$1\": anaa na ang payl",
        "unexpected": "Wala gi-ekspek nga value: \"$1\"=\"$2\".",
        "formerror": "Sayop: dili masumiter ang porma",
        "badarticleerror": "Ang kining lihok dili puyde mahitabo sa kining panid.",
        "search-nonefound": "Walay mga resulta nga nag-match sa gipangita.",
        "powersearch-legend": "Abansadong pagpangita",
        "powersearch-ns": "Pangitaa sa mga ngalang espasyo:",
-       "powersearch-redir": "Itala ang mga redirek",
        "powersearch-togglelabel": "I-tsek:",
        "powersearch-toggleall": "Tanan",
        "powersearch-togglenone": "Wala",
        "recentchanges": "Mga bag-ong giusab",
        "recentchanges-legend": "Mga opsyon sa bag-ong pag-usab",
        "recentchanges-feed-description": "Bantayi ang kinabag-ohang mga pag-usab sa wiki niining feed.",
-       "rclistfrom": "Ipakita ang mga bag-ong pag-usab gikan $1",
+       "rclistfrom": "Ipakita ang mga bag-ong pag-usab gikan $3 $2",
        "rcshowhideminor": "$1 menor nga pag-usab",
        "rcshowhidebots": "$1 mga bot",
        "rcshowhideliu": "$1 mga gumagamit nga naka-log-in",
index 782e812..99d3360 100644 (file)
@@ -6,14 +6,14 @@
                        "Jatrobat",
                        "Magalahi",
                        "MisterWiki",
-                       "Shirayuki"
+                       "Shirayuki",
+                       "아라"
                ]
        },
        "tog-underline": "Na'raya i inachetton:",
        "tog-hideminor": "Nå'na' i mandikike' na tinilaika siha gi påhinan tinilaika gi halacha",
        "tog-extendwatchlist": "Na'ladångkolu i listan pinilan para u na'annok i manaplikayon na tinilaika siha",
        "tog-usenewrc": "I manmana'lamaolek na tinilaika (JavaScript)",
-       "tog-rememberpassword": "Hasso iyo-ku login gi este na komputadora (for a maximum of $1 {{PLURAL:$1|day|days}})",
        "tog-watchcreations": "Po'lo i påhina siha ni fina'tinas-hu gi iyo-ku listan pinilan.",
        "tog-watchdefault": "Po'lo i påhina siha ni hu tulaika gi iyo-ku listan pinilan.",
        "tog-watchmoves": "Po'lo i påhina siha ni hu muebi gi iyo-ku listan pinilan.",
        "filedeleteerror": "Ti siña u na'suha i atkibu \"$1\".",
        "directorycreateerror": "Ti siña u fa'tinas i direktorio \"$1\".",
        "filenotfound": "Ti siña u sodda' i atkibu \"$1\".",
-       "fileexistserror": "Ti siña u tuge' i atkibu \"$1\": guåha esta i atkibu",
        "unexpected": "Ti ma'antisipa i guinaha: \"$1\"=\"$2\".",
        "badtitle": "Båba na titulo",
        "viewsource": "Atan i code",
        "showingresultsnum": "A'annok gi sampapa' {{PLURAL:$3|'''1''' na humuyongña|'''$3''' na humuyongña siha}} tumutuhon yan i #'''$2'''.",
        "powersearch-legend": "Finu na inaligao",
        "powersearch-ns": "Inaligao gi sagan nå'an:",
-       "powersearch-redir": "Na'lista i na'dirihi siha",
        "search-external": "Inaligao sanhiyong",
        "searchdisabled": "Mana'påra i inaligao {{SITENAME}}.\nSiña hao manaligao gi Google gi entretanto.\nFanapunta na fana'an ti gus nuebu i listan-ñiha i guinahan {{SITENAME}}.",
        "preferences": "I ga'ña-mu",
        "nchanges": "$1 {{PLURAL:$1|na tinilaika|na tinilaika siha}}",
        "recentchanges": "Tinilaika siha gi halacha",
        "rcnotefrom": "Gi papa' guåha i tinilaika siha ginen '''$2''' (fa'na'an '''$1''' ma'annok).",
-       "rclistfrom": "Na'annok i mannuebun tinilaika siha ginen $1",
+       "rclistfrom": "Na'annok i mannuebun tinilaika siha ginen $3 $2",
        "rcshowhideminor": "$1 na mandikike' na tinilaika siha",
        "rcshowhidebots": "$1 na bots siha",
        "rcshowhideliu": "$1 na muna'sesetbi ni ma log in",
index 1c78aef..5e2b77e 100644 (file)
@@ -11,7 +11,9 @@
                        "Haval",
                        "Marmzok",
                        "Muhammed taha",
-                       "رزگار"
+                       "رزگار",
+                       "아라",
+                       "Serwan"
                ]
        },
        "tog-underline": "ھێڵ ھێنان بەژێر بەستەرەکان:",
@@ -35,7 +37,7 @@
        "tog-enotifusertalkpages": "ئەگەر پەڕەی لێدوانەکەم گۆڕدرا ئیمەیلم بۆ بنێرە",
        "tog-enotifminoredits": "بۆ گۆڕانکارییە بچووکەکانی پەڕەکان و پەڕگەکانیش ئیمەیلم بۆ بنێرە",
        "tog-enotifrevealaddr": "ئەدرەسی ئیمەیلەکەم لە ئیمەیلە ئاگاداریدەرەکان دا نیشان بدە",
-       "tog-shownumberswatching": "ژمارەی بەکارھێنەرە چاودێڕەکان نیشان بدە",
+       "tog-shownumberswatching": "ژمارەی بەکارھێنەرە چاودێرەکان نیشان بدە",
        "tog-oldsig": "واژووی ئێستا:",
        "tog-fancysig": "وەکوو ویکیدەق واژووەکە لەبەر چاو بگرە (بێ بەستەرێکی خۆگەڕ)",
        "tog-uselivepreview": "لە پێشبینینی زیندوو کەڵک وەربگرە (تاقیکاری‌)",
        "vector-action-move": "بیگوازەوە",
        "vector-action-protect": "بیپارێزە",
        "vector-action-undelete": "سڕینەوە بگەڕێنەوە",
-       "vector-action-unprotect": "پاراستنی بگۆڕە",
+       "vector-action-unprotect": "پاراستن بگۆڕە",
        "vector-view-create": "دروستکردن",
        "vector-view-edit": "دەستکاریی بکە",
        "vector-view-history": "مێژووەکەی ببینە",
        "views": "بینینەکان",
        "toolbox": "ئامرازەکان",
        "userpage": "بینینی پەڕەی بەکارھێنەر",
-       "projectpage": "په‌ڕه‌ی پرۆژه‌ نیشانبده‌",
+       "projectpage": "پەڕەی پرۆژە نیشان بدە",
        "imagepage": "پەڕەی پەڕگە نیشان بدە",
-       "mediawikipage": "په‌ڕه‌ی په‌یام نیشانبده‌",
+       "mediawikipage": "پەڕەی پەیام نیشان بدە",
        "templatepage": "په‌ڕه‌ی داڕێژە ببینە‌",
        "viewhelppage": "په‌ڕه‌ی یارمه‌تی نیشانبده‌",
        "categorypage": "په‌ڕه‌ی هاوپۆل نیشانبده‌",
        "viewsourceold": "سەرچاوەکەی ببینە",
        "editlink": "دەستکاری",
        "viewsourcelink": "سەرچاوەکەی ببینە",
-       "editsectionhint": "دەستکاری کردنی بەشی: $1",
+       "editsectionhint": "دەستکاریکردنی بەش: $1",
        "toc": "پێرست",
        "showtoc": "نیشانیبدە",
        "hidetoc": "بیشارەوە",
-       "collapsible-collapse": "کۆیبکەوە",
-       "collapsible-expand": "بڵاویبکەوە",
+       "collapsible-collapse": "کۆی بکەوە",
+       "collapsible-expand": "بڵاوی بکەوە",
        "thisisdeleted": "$1 نیشان بدە یا بھێنەوە؟",
        "viewdeleted": "$1 نیشان بده‌؟",
        "restorelink": "{{PLURAL:$1|یەک گۆڕانکاریی سڕاو|$1 گۆڕانکاریی سڕاو}}",
        "nstab-category": "پۆل",
        "nosuchaction": "کردارێک بەم شێوە نییە",
        "nosuchactiontext": "ئەو چالاکییەی لە لایەن بەستەرەوە دیاریکراوە ناتەواوە.\nلەوانەیە بە هەڵە بەستەرەکەت نووسیبێت، یان بەستەرێکی هەڵەی بە دواوە بێت.\nلەوانەیە ئەمە نیشانەی هەڵەیەک بێت لەو نەرمەکاڵایەی کە بەکاردێت لە لایەن {{SITENAME}}.",
-       "nosuchspecialpage": "په‌ڕه‌ی تایبه‌تی له‌و شێوه‌یه‌ نییه‌",
+       "nosuchspecialpage": "پەڕەی تایبەتی ئاوا بوونی نییە",
        "nospecialpagetext": "<strong>پەڕەیەکی تایبەت دەخوازیت کە بوونی نیە.</strong>\n\nلیستێکی پەڕە تایبەتە دروستەکان لە [[Special:SpecialPages|{{int:specialpages}}]] لە بەردەست‌دایە.",
        "error": "هه‌ڵه‌",
        "databaseerror": "ھەڵەی بنکەدراوه",
        "enterlockreason": "هۆیەک بۆ قوفڵ‌کردنەکە بنووسە کە  تێیدا کاتی کردنەوەی قۆفڵەکە باس کرابێت",
        "readonlytext": "بنکەدراوەکە لەم کاتەدا  لەبەر چاکسازی ئاسایی بۆ نوسینی نوێ و دەستکاری قوفڵ کراوه. دوای ئەوە ئەگرێتەوە بۆ ئاستی خۆی.\n\nئەو بەڕێوبەرەی کە قوفڵی کردووه ئەم ڕوون‌کردنەوەی نووسیوە : $1",
        "missing-article": "داتابەیسەکە نەیتوانی دەقی پەڕەیەک بەناوی «$1» $2  بدۆزێتەوە کە دەبوا بیدۆزیبایەتەوە.\n\nئەمە زیاتر لە بەدواچوونی بەستەری جیاوازی یان مێژووی کۆنی پەڕەیەکی سڕدراو ڕوودەدات.\n\nئەگەر وا نەبێت، ئەوا ڕەنگە گرفتێکت لەم نەرمامێرەدا دۆزیبێتەوە.\nتکایە ئەمە بە ئاماژەدان بە ناونیشانی URLـەکەیەوە بە [[Special:ListUsers/sysop|بەڕێوبەرێک]] ڕاپۆرت بدە.",
-       "missingarticle-rev": "(Ù¾Û\8cاچوونەوە#: $1)",
+       "missingarticle-rev": "(Ù¾Û\8eداچوونەوە#: $1)",
        "missingarticle-diff": "(جیاوازی: $1، $2)",
        "readonly_lag": "بنكه‌دراوه‌كه‌ به‌شێوه‌ی خۆكار به‌ندكراوه‌، له‌كاتێكدا بنكه‌دراوه‌ی ڕاژه‌كاره‌كه‌ ڕۆڵی له‌خۆگرتن ده‌گێڕێت",
        "internalerror": "ھەڵەی ناوخۆیی",
        "internalerror_info": "هه‌ڵه‌ی ناوخۆیی: $1",
-       "fileappenderrorread": "نەتوانرا \"$1\" بخوێندرێتەوە لەکاتی هاوپێچکردندا.",
-       "fileappenderror": "نه‌تواندرا \"$1\" بخرێته‌سه‌ر \"$2\".",
        "filecopyerror": "نەکرا پەڕگەی «$1» کۆپی بکرێت بۆ «$2».",
        "filerenameerror": "ناوی په‌ڕگه‌ی \"$1\" نه‌گۆڕدرا بۆ \"$2\".",
        "filedeleteerror": "نەکرا پەڕگەی «$1» بسڕدرێتەوە.",
        "directorycreateerror": "نەتوانرا بوخچەی \"$1\"دروست بکرێت.",
        "filenotfound": "په‌ڕگه‌ی \"$1\" نه‌دۆزرایه‌وه‌",
-       "fileexistserror": "ناتوانی لەسەر پەڕگەی \"$1\" بنووسیت: ئەو پەڕگەیە هەیە.",
        "unexpected": "نرخی چاوەڕوان نەکراو: \"$1\"=\"$2\" .",
        "formerror": "هەڵە: فورمەکە نانێردرێت.",
        "badarticleerror": "ئەو ئاماژە لەم لاپەڕەدا پێک‌نایە.",
        "cannotdelete-title": "ناکرێ پەڕەی «$1» بسڕدرێتەوە",
        "delete-hook-aborted": "سڕینەوە لە لایەن قولاپەوە ھەڵوەشێنرایەوە.\nھۆکارەکەی لەبەر دەست نییە.",
        "no-null-revision": "نەتوانرا پێداچوونەوەی خاڵیی بۆ پەڕەی \"$1\" درووست بکرێت",
-       "badtitle": "ناونیشانی خراپ",
+       "badtitle": "سەردێڕی خراپ",
        "badtitletext": "سەرناوی پەڕەی داواکراو بەتاڵە، واڵایە یان سەرناوێکی نێوان-زمانی یان نێوانی-ویکییە کە بە شێوەیەکی ھەڵە بەستەری بۆ دراوە.\nڕەنگە یەک یان چەند کاراکتەری تێدا بێت کە ناکرێت لە سەرناوەکاندا بەکار بھێنرێت.",
        "perfcached": "داتای خوارەوە پاشەکەوتکراوەیە و لەوانەیە بەڕۆژنەکرابێتەوە. لانی زۆر {{PLURAL:$1|یەک ئەنجام|$1 ئەنجام}} لە cacheدا لەبەردەستدایە.",
        "perfcachedts": "داتای خوارەوە cacheکراوە و دوایین جار لە $1 نوێ کراوەتەوە. لە cacheدا لانی زۆر {{PLURAL:$4|یەک ئەنجام|$4 ئەنجام}} لەبەردەستە.",
        "userlogin-helplink2": "یارمەتی بۆ چوونەژوورەوە",
        "userlogin-loggedin": "تۆ ھەر ئێستا بە ناوی {{GENDER:$1|$1}} چوویتە ژوورەوە.\nفۆرمی ژێرەوە بەکاربھێنە بۆ چوونەژوورەوە وەک بەکارھێنەرێکی تر.",
        "userlogin-createanother": "ھەژمارێکی تر دروست بکە",
-       "createacct-join": "زانیارییەکەت لە ژێرەوە بنووسە.",
-       "createacct-another-join": "زانیارییەکانی ھەژمارە نوێکەت لە ژێرەوە بنووسە.",
        "createacct-emailrequired": "ناونیشانی ئیمەیل",
        "createacct-emailoptional": "ناونیشانی ئیمەیل (دڵخوازانە)",
        "createacct-email-ph": "ناونیشانی ئیمەیلەکەت بنووسە",
        "passwordreset-username": "ناوی بەکارھێنەری:",
        "passwordreset-domain": "پاوان:",
        "passwordreset-capture": "بینینی ئیمەیڵی ئەنجام؟",
-       "passwordreset-email": "ئەدرەسی ئیمەیڵ:",
+       "passwordreset-email": "ناونیشانی ئیمەیل:",
        "passwordreset-emailtitle": "وردەکارییەکانی ھەژمار لە {{SITENAME}}",
        "passwordreset-emailtext-ip": "‫کەسێک (لەوانەیە خۆت، بە ناونیشانی ئایپیی $1) داوای ڕیسێتکردنەوەی تێپەڕوشەکەت لە {{SITENAME}}دا ($4) کردووە. {{PLURAL:$3|ھەژماری بەکارھێنەریی ژێرەوە پەیوەندیی ھەیە|ھەژمارە بەکارھێنەرییەکانی ژێرەوە پەیوەندییان ھەیە}} بەم ناونیشانەی ئیمەیلەوە:\n\n$2\n\n{{PLURAL:$3|ئەم تێپەڕوشە کاتییە|ئەم تێپەڕوشە کاتییانە}} لە {{PLURAL:$5|ڕۆژێک|$5 ڕۆژ}}دا بەسەردەچێت.\nدەبێ بچیتە ژوورەوە و ھەر ئێستا تێپەڕوشەیەکی نوێ ھەڵبژێریت. ئەگەر کەسێکی تر ئەم داواکارییەی کردووە،\nیان ئەگەر تێپەڕوشە سەرەتاییەکەت ھاتووەتەوە بیرت و ئیتر ناتەوێ بیگۆڕی، دەتوانی گوێ بەم پەیامە نەدەیت و ھەر لە تێپەڕوشە کۆنەکەت کەڵک وەربگریت.",
        "passwordreset-emailtext-user": "‫بەکارھێنەر $1 لە {{SITENAME}} ڕیسێتکردنەوەی تێپەڕوشەکەت لە {{SITENAME}}دا ($4) کردووە. {{PLURAL:$3|ھەژماری بەکارھێنەریی ژێرەوە پەیوەندیی ھەیە|ھەژمارە بەکارھێنەرییەکانی ژێرەوە پەیوەندییان ھەیە}} بەم ناونیشانەی ئیمەیلەوە:\n\n$2\n\n{{PLURAL:$3|ئەم تێپەڕوشە کاتییە|ئەم تێپەڕوشە کاتییانە}} لە {{PLURAL:$5|ڕۆژێک|$5 ڕۆژ}}دا بەسەردەچێت.\nدەبێ بچیتە ژوورەوە و ھەر ئێستا تێپەڕوشەیەکی نوێ ھەڵبژێریت. ئەگەر کەسێکی تر ئەم داواکارییەی کردووە، یان ئەگەر تێپەڕوشە سەرەتاییەکەت ھاتووەتەوە بیرت و ئیتر ناتەوێ بیگۆڕی، \nدەتوانی گوێ بەم پەیامە نەدەیت و ھەر لە تێپەڕوشە کۆنەکەت کەڵک وەربگریت.",
        "passwordreset-emailsent": "ئیمەیلێکی ڕیسێتکردنەوەی تێپەڕوشە نێردرا.",
        "passwordreset-emailsent-capture": "ئیمەیلێکی ڕیسێتکردنەوەی تێپەڕوشە نێردرا، کە لە ژێرەوە نیشان دراوە.",
        "passwordreset-emailerror-capture": "ئیمەیلێکی ڕیسێتکردنەوەی تێپەڕوشە نێردرا، کە لە ژێرەوە نیشان دراوە، بەڵام ناردنەکەی بۆ {{GENDER:$2|بەکارھێنەر}} سەرکەوتوو نەبوو: $1",
-       "changeemail": "ئەدرەسی ئیمەیڵ بگۆڕە",
-       "changeemail-header": "ئەدرەسی ئیمەیلی ھەژمار بگۆڕە",
+       "changeemail": "ناونیشانی ئیمەیل بگۆڕە",
+       "changeemail-header": "ناونیشانی ئیمەیلی ھەژمار بگۆڕە",
        "changeemail-no-info": "بۆ گەیشتنی راستەوخۆ بەم پەڕە دەبێت بچیتە ژوورەوە.",
        "changeemail-oldemail": "ئەدرەسی ئیمەیڵی ئێستا:",
-       "changeemail-newemail": "ئەدرەسی ئیمەیڵی نوێ:",
+       "changeemail-newemail": "ناونیشانی ئیمەیلی نوێ:",
        "changeemail-none": "(ھیچ)",
        "changeemail-password": "تێپەڕوشەکەت لە {{SITENAME}}:",
-       "changeemail-submit": "ئەمەیڵ بگۆڕە",
+       "changeemail-submit": "ئەمەیل بگۆڕە",
        "changeemail-cancel": "ھەڵیوەشێنەوە",
        "bold_sample": "دەقی ئەستوور",
        "bold_tip": "دەقی ئەستوور",
        "savearticle": "پەڕەکە پاشەکەوت بکە",
        "preview": "پێشبینین",
        "showpreview": "پێشبینین نیشان بدە",
-       "showlivepreview": "پێشبینینی ڕاسته‌وخۆ",
        "showdiff": "گۆڕانکارییەکان نیشان بدە",
        "anoneditwarning": "'''ھۆشیار بە:''' نەچوویتە ژوورەوە.\nناونیشانی IPی تۆ لە مێژووی دەستکارییەکانی ئەم پەڕەیەدا تۆماردەکرێت.",
        "anonpreviewwarning": "«نەڕۆشتوویتە ژوورەوە. پاشەکەوتکردن، ئەدرەسی IPەکەت لە مێژووی دەستکاریی ئەم پەڕە تۆمار دەکات.»",
        "permissionserrorstext-withaction": "دەسەڵاتت نییە بۆ $2، لەبەر ئەم {{PLURAL:$1|ھۆکارە|ھۆکارانە}}ی خوارەوە:",
        "recreate-moveddeleted-warn": "'''ھۆشیار بە: خەریکی پەڕەیەک دروست‌ دەکەیتەوە کە لە پێشدا سڕاوەتەوە.'''\n\nئەمە لەبەر چاو بگرە کە دەستکاریکردنی ئەم پەڕەیە بەقازانجە یان نا.\nلۆگی سڕینەوە و گواستنەوەی ئەم پەڕەیە بۆ سانایی لێرەدا ھاتووە:",
        "moveddeleted-notice": "ئەم پەڕەیە سڕاوەتەوە.\nلۆگی سڕینەوە و گواستنەوە بۆ پەڕەکە لە ژێرەوە دابین کراوە.",
-       "log-fulllog": "دیتنی لۆگی تەواو",
+       "log-fulllog": "لۆگی تەواو ببینە",
        "edit-hook-aborted": "دەستکاری لە لایەن قولاپەوە ھەڵوەشێنرایەوە.\nھۆکارەکەی لەبەر دەست نییە.",
        "edit-gone-missing": "توانای نوێ‌کردنەوەی لاپەڕەکە نیە.<br />\nلەوە دەچی سڕدرابێتەوه.‌",
        "edit-conflict": "کێشەی دەستکاری.",
        "edit-no-change": "دەستکاریەکەت بەرچاو نەخرا، لەبەر ئەوەی هیچ گۆڕانکارییەکت لەسەر دەقەکە نەکردووە.",
-       "postedit-confirmation": "دەستکارییەکەت پاشەکەوت کرا.",
+       "postedit-confirmation-saved": "دەستکارییەکەت پاشەکەوت کرا.",
        "edit-already-exists": "تواناییی دروستکردنی پەڕەی نوێ نییە.\nئەمە پەڕەیە پێشتر هەبووە.",
        "defaultmessagetext": "دەقی پەیامی هەمیشەیی",
        "invalid-content-data": "دراوەی ناوەرۆکی نادروست",
        "cantcreateaccount-text": "درووست‌کردنی هەژمارە بۆ ناونیشانی ئای‌پی ('''$1''') لە لایەن [[User:$3|$3]] داخراوە.<br /><br />\n$3 هۆکاری \"$2\" خستوەتەڕوو",
        "viewpagelogs": "لۆگەکانی ئەم پەڕەیە ببینە",
        "nohistory": "هیچ مێژوویەکی دەستکاری نییە بۆ ئەم پەڕەیە.",
-       "currentrev": "دÙ\88اÛ\8cÛ\8cÙ\86 Ù¾Û\8cاچوونەوە",
+       "currentrev": "دÙ\88اÛ\8cÛ\8cÙ\86 Ù¾Û\8eداچوونەوە",
        "currentrev-asof": "دوایین پێداچوونەوەی $1",
-       "revisionasof": "Ù\88Û\95Ú© Ù¾Û\8cاچوونەوەی $1",
+       "revisionasof": "Ù\88Û\95Ú© Ù¾Û\8eداچوونەوەی $1",
        "revision-info": "پێداچوونەوی $1 لە لایەن $2",
        "previousrevision": "→پیاچوونەوەی کۆنتر",
-       "nextrevision": "Ù¾Û\8cاچوونەوەی نوێتر←",
-       "currentrevisionlink": "Ù¾Û\8cاچوونەوەی ئێستا",
+       "nextrevision": "Ù¾Û\8eداچوونەوەی نوێتر←",
+       "currentrevisionlink": "Ù¾Û\8eداچوونەوەی ئێستا",
        "cur": "ئێستا",
        "next": "پاش",
        "last": "پێشوو",
        "revdelete-offender": "نووسەری پیاچوونەوە:",
        "suppressionlog": "لۆگی بەرگری‌کردن",
        "suppressionlogtext": "خوارەوە لیستێکی سڕینەوەکان و بەربەستنەکانە کە ناوەرۆکێکی شاراوە لە بەڕێوبەرانیان ھەیە.\nسەیری [[Special:BlockList|لیستی بەربەستن]] بکە بۆ لیستی ئەو بەرگری و بەربەستنانە ئێستا لەکاردان.",
-       "mergehistory": "یەک‌خستنی مێژووەکانی لاپەڕە",
-       "mergehistory-header": "ئÛ\95Ù\85 Ù\84اپÛ\95Ú\95Û\95 Ø¯Û\95سÛ\95ڵاتÛ\8c Ø¦Û\95Ù\88Û\95ت Ù¾Û\8eâ\80\8cدÛ\95دا Ù¾Û\8eداÚ\86Ù\88Ù\88Ù\86Û\95Ù\88Û\95کاÙ\86Û\8c Ù\85Û\8eÚ\98Ù\88Ù\88Û\8c Ù\84اپÛ\95Ú\95Û\95Û\8cÛ\95Ú©Û\8c Ù\85Û\95بÛ\95ستت Ø¨Ø®Û\95Û\8cتÛ\95 Ø³Û\95ر Ù\84اپÛ\95Ú\95Û\95Û\8cÛ\95Ú©Û\8c Ù\86Ù\88Û\8e.\nئÛ\95رخÛ\95Û\8cاÙ\86 Ø¨Ø¨Û\95 Ø¦Û\95Ù\85 Ú¯Û\86Ú\95اÙ\86â\80\8cکارÛ\8cÛ\95 Ù\84اپÛ\95Ú\95Û\95 Ù\85Û\8eÚ\98Ù\88Ù\88Û\8cÛ\95Ú©Û\95 Ø¨Û\95ردÛ\95Ù\88اÙ\85 Ø¯Û\95Ù\87Û\8eÚµÛ\8eتÛ\95Ù\88Û\95.",
-       "mergehistory-box": "سەر یەک‌خستنی پێداچوونەوەکانی دوو لاپەڕە:",
-       "mergehistory-from": "سەرچاوەی پەڕە",
+       "mergehistory": "کردنەیەکی مێژووەکانی پەڕە",
+       "mergehistory-header": "ئÛ\95Ù\85 Ù¾Û\95Ú\95Û\95Û\8cÛ\95 Ú\95Û\8eگات Ù¾Û\8eâ\80\8cدÛ\95دا Ù¾Û\8eداÚ\86Ù\88Ù\88Ù\86Û\95Ù\88Û\95کاÙ\86Û\8c Ù\85Û\8eÚ\98Ù\88Ù\88Û\8c Ù¾Û\95Ú\95Û\95Û\8cÛ\95Ú©Û\8c Ø³Û\95رÚ\86اÙ\88Û\95 Ù\84Û\95Ú¯Û\95Úµ Ù¾Û\95Ú\95Û\95Û\8cÛ\95Ú©Û\8c ØªØ± Ø¨Ú©Û\95Û\8cÛ\95 Û\8cÛ\95Ú©.\nدڵÙ\86Û\8cا Ø¨Ø¨Û\95 Ø¦Û\95Ù\85 Ú¯Û\86Ú\95اÙ\86کارÛ\8cÛ\8cÛ\95 Ø¨Û\95ردÛ\95Ù\88اÙ\85Û\8c Ù\85Û\8eÚ\98Ù\88Û\8cÛ\8c Ù¾Û\95Ú\95Û\95 Ú\95ادÛ\95گرÛ\8e.",
+       "mergehistory-box": "کردنەیەکی پێداچوونەوەکانی دوو پەڕە:",
+       "mergehistory-from": "پەڕەی سەرچاوە:",
        "mergehistory-into": "پەڕەی مەبەست:",
-       "mergehistory-list": "ئەو مێژووی لاپەڕانە وا توانای سەر یەک‌خستنیان هەیە",
-       "mergehistory-merge": "ئەم پێداچوونەوانەی [[:$1]] دەتواندرێ بخرێتە سەر [[:$2]].\nدەتوانی لە ستوونی دوکمە ڕادیۆیەکە بۆ تەنها خستنە‌سەر پێداچوونەوەکانی ڕێکەوتێکی تایبەت یا پێش ئەوە کەڵک وەر بگریت.\nلەیادت بێت کە بەکارهێنانی بەستەرەکانی ڕێن‌نیشاندەر، ستوونەکە وەک ئەوەڵ لێ‌دەکاتەوە.",
-       "mergehistory-go": "نیشان‌دانی ئەو دەستکاریانە وا توانای خستنەسەر یەکیان هەیە",
-       "mergehistory-submit": "خستنەسەریەکی پێداچوونەوەکان",
+       "mergehistory-list": "مێژووی دەستکاریی شیاوی کردنەیەک",
+       "mergehistory-merge": "پێداچوونەوەکانی ژێرەوەی [[:$1]] دەکرێ بخرێتە سەر [[:$2]].\nستوونی دوگمەی ڕادیۆیی بەکاربھێنە بۆ کردنەیەکی پێداچوونەوە دروستکراوەکان لە کاتێکی تایبەت یا پێش ئەو.\nسەرنج بدە بەکارهێنانی بەستەرەکانی ڕێدۆزی ئەم ستوونە رێک دەخاتەوە.",
+       "mergehistory-go": "دەستکارییەکانی شیاوی کردنەیەک نیشان بدە",
+       "mergehistory-submit": "پێداچوونەوەکان بکە یەک",
        "mergehistory-empty": "ناتواندرێت هیچ یەک لە پێداچوونەوەکان بخرێتە ‌سەریەک.",
-       "mergehistory-success": "$3 {{PLURAL:$3|پێداچوونەوەی|پێداچوونەوەی}} [[:$1]] بە سەرکەوتوویەوە خرایە سەر [[:$2]].",
-       "mergehistory-fail": "سەریەک خستنی مێژوو پێک‌نایەت، تکایە دیسان دیاریکەرەکانی لاپەڕە و کات چاو لێ بکەوە.",
-       "mergehistory-no-source": "Ù\84اپÛ\95Ú\95Û\95Û\8c Ø³Û\95رÚ\86اÙ\88Û\95Û\8c $1 Ø¨Ù\88Ù\88Ù\86Û\8c Ù\86یە.",
-       "mergehistory-no-destination": "Ù\84اپÛ\95Ú\95Û\95Û\8c Ù\85Û\95بÛ\95ستÛ\8c $1 Ø¨Ù\88Ù\88Ù\86Û\8c Ù\86یە.",
-       "mergehistory-invalid-source": "Ù\84اپÛ\95Ú\95Û\95Û\8c Ø³Û\95رÚ\86اÙ\88Û\95 Ø¯Û\95بÛ\8e Ø³Û\95ردÛ\8eÚ\95Û\8eÚ©Û\8c Ú¯Ù\88Ù\86جاÙ\88 بێت.",
-       "mergehistory-invalid-destination": "Ù\84اپÛ\95Ú\95Û\95Û\8c Ù\85Û\95بÛ\95ست Ø¯Û\95بÛ\8e Ø³Û\95ردÛ\8eÚ\95Û\8eÚ©Û\8c Ú¯Ù\88Ù\86جاÙ\88 بێت.",
+       "mergehistory-success": "$3 {{PLURAL:$3|پێداچوونەوە}}ی [[:$1]] بە سەرکەوتوویی خرایە سەر [[:$2]].",
+       "mergehistory-fail": "کردنەیەکی مێژوو جێبەجێ ناکرێ، تکایە دیسان پارامەترەکانی پەڕە و کات تاوتوێ بکە.",
+       "mergehistory-no-source": "Ù¾Û\95Ú\95Û\95Û\8c Ø³Û\95رÚ\86اÙ\88Û\95Û\8c $1 Ø¨Ù\88Ù\88Ù\86Û\8c Ù\86Û\8cیە.",
+       "mergehistory-no-destination": "Ù¾Û\95Ú\95Û\95Û\8c Ù\85Û\95بÛ\95ستÛ\8c $1 Ø¨Ù\88Ù\88Ù\86Û\8c Ù\86Û\8cیە.",
+       "mergehistory-invalid-source": "Ù¾Û\95Ú\95Û\95Û\8c Ø³Û\95رÚ\86اÙ\88Û\95 Ø¯Û\95بÛ\8e Ø³Û\95ردÛ\8eÚ\95Û\8eÚ©Û\8c Ø¯Ø±Ù\88ست بێت.",
+       "mergehistory-invalid-destination": "Ù¾Û\95Ú\95Û\95Û\8c Ù\85Û\95بÛ\95ست Ø¯Û\95بÛ\8e Ø³Û\95ردÛ\8eÚ\95Û\8eÚ©Û\8c Ø¯Ø±Ù\88ست بێت.",
        "mergehistory-autocomment": "[[:$1]] خرایە سەر [[:$2]]",
        "mergehistory-comment": "[[:$1]] خرایە سەر [[:$2]]: $3",
-       "mergehistory-same-destination": "Ù\84اپÛ\95Ú\95Û\95Û\8c Ø³Û\95رÚ\86اÙ\88Û\95 Ù\88 Ù\85Û\95بÛ\95ست Ù\86ابÛ\8e Û\8cÛ\95Ú©Û\8eک بن.",
+       "mergehistory-same-destination": "Ù¾Û\95Ú\95Û\95Û\8c Ø³Û\95رÚ\86اÙ\88Û\95 Ù\88 Ù\85Û\95بÛ\95ست Ù\86ابÛ\8e Û\8cÛ\95ک بن.",
        "mergehistory-reason": "هۆکار:",
        "mergelog": "لۆگی کردنەیەک",
-       "pagemerge-logentry": "[[$1]] خرایە سەر [[$2]] (پێداچوونەوەکان تا $3)",
-       "revertmerge": "لەیەک جیاکردنەوە",
+       "pagemerge-logentry": "[[$1]]ی لەگەڵ [[$2]] کردەیەک (پێداچوونەوەکان ھەتا $3)",
+       "revertmerge": "ھەڵوەشاندنەوەی کردنەیەک",
        "mergelogpagetext": "لە خوارەوە دوایین مێژووی‌لاپەڕە خستنە سەر لاپەڕەیەکی‌تر، دەبینی.",
        "history-title": "مێژووی پێداچوونەوەکانی «$1»",
        "difference-title": "جیاوازیی نێوان پێداچوونەوەکانی «$1»",
        "searchmenu-exists": "'''پەڕەیەک بە ناوی «[[:$1]]» لەم ویکییەدا ھەیە.'''",
        "searchmenu-new": "<strong>لەم ویکییەدا پەڕەی « [[:$1]] » دروست بکە!</strong> {{PLURAL:$2|0=|ھەروەھا بڕوانە پەڕەی دۆزراوەی گەڕانەکەت.|ھەروەھا بڕوانە ئاکامە دۆزراوەکانی گەڕانەکە.}}",
        "searchprofile-articles": "پەڕە بە ناوەڕۆکەکان",
-       "searchprofile-project": "پەڕەکانی یارمەتی و پرۆژە",
        "searchprofile-images": "ڕەنگاڵە",
        "searchprofile-everything": "ھەموو شتێک",
        "searchprofile-advanced": "پێشکەوتوو",
        "searchprofile-articles-tooltip": "بگەڕێ لە $1",
-       "searchprofile-project-tooltip": "بگەڕێ لە $1",
        "searchprofile-images-tooltip": "بگەڕێ بۆ پەڕگەکان",
        "searchprofile-everything-tooltip": "لە ھەموو ناوەرۆکێکدا بگەڕێ (تەنانەت پەڕەکانی وتووێژیش)",
        "searchprofile-advanced-tooltip": "گەڕان لەناو بۆشایی‌ناوە دڵخوازەکان",
        "search-nonefound": "ھیچ ئاکامێک کە بە داواکارییەکەت بخوا نەدۆزرایەوە.",
        "powersearch-legend": "گەڕانی پێشکەوتوو",
        "powersearch-ns": "گەڕان لە بۆشاییی ناوەکانی:",
-       "powersearch-redir": "ڕەوانەکەرەکان پێرست بکە",
        "powersearch-togglelabel": "تاوتوێ بکە:",
        "powersearch-toggleall": "ھەموو",
        "powersearch-togglenone": "ھیچیان",
        "mypreferences": "ھەڵبژاردەکان",
        "prefs-edits": "ژمارەی گۆڕانکارییەکان:",
        "prefs-skin": "پێستە",
-       "skin-preview": "پێش بینین",
+       "skin-preview": "پێشبینین",
        "datedefault": "ھەڵنەبژێردراو",
        "prefs-labs": "کەرەسەکانی تاقیگەکان",
        "prefs-user-pages": "پەڕە بەکارھێنەرییەکان",
        "prefs-personal": "پرۆفایلی بەکارھێنەر",
        "prefs-rc": "دوایین گۆڕانکارییەکان",
-       "prefs-watchlist": "Ù\84Û\8cستی چاودێری",
+       "prefs-watchlist": "Ù¾Û\8eرستی چاودێری",
        "prefs-watchlist-days": "ژمارەی ڕۆژەکان بۆ نیشاندان لە لیستی چاودێری:",
        "prefs-watchlist-days-max": "ئەوپەڕی $1 {{PLURAL:$1|ڕۆژە|ڕۆژە}}",
        "prefs-watchlist-edits": "ئەوپەڕی ژمارەی گۆڕانکارییەکان بۆ نیشاندان لە لیستی چاودێریی پەرەپێدراو:",
        "timezoneuseoffset": "دیکە (ناتەواویەکان دیاری بکە)",
        "servertime": "کاتی ڕاژەکار:",
        "guesstimezone": "لە وێبگەڕەکە بیگرە",
-       "timezoneregion-africa": "ئافریقا",
+       "timezoneregion-africa": "ئەفریقا",
        "timezoneregion-america": "ئەمریکا",
        "timezoneregion-antarctica": "ئانتارکتیکا",
        "timezoneregion-arctic": "ئارکتیک",
        "timezoneregion-pacific": "ئۆقیانووسی ئارام",
        "allowemail": "ڕێگە بدە بە بەکارھێنەرانی تر کە ئیمەیلم بۆ بنێرن",
        "prefs-searchoptions": "گەڕان",
-       "prefs-namespaces": "بۆشاییناوەکان",
+       "prefs-namespaces": "بۆشایی ناوەکان",
        "defaultns": "دەنا لەم بۆشاییی ناوانەدا بگەڕێ:",
        "default": "بنچینەیی",
        "prefs-files": "پەڕگەکان",
        "prefs-emailconfirm-label": "پشتڕاستکردنەوەی ئیمەیل:",
        "youremail": "ئیمەیل:",
        "username": "{{GENDER:$1|ناوی به‌کارھێنەر}}:",
-       "uid": "پێناسەی {{GENDER:$1|به‌کارھێنەر}}:",
        "prefs-memberingroups": "{{GENDER:$2|ئەندامی}} {{PLURAL:$1|گرووپی|گرووپەکانی}}:",
        "prefs-registration": "کاتی خۆتۆمارکردن:",
        "yourrealname": "ناوی ڕاستی:",
        "prefs-advancedsearchoptions": "هەڵبژاردە پێشکەوتووەکان",
        "prefs-advancedwatchlist": "هەڵبژاردە پێشکەوتووەکان",
        "prefs-displayrc": "ھەڵبژاردەکانی نیشاندان",
-       "prefs-displaysearchoptions": "ھەڵبژاردەکانی نیشاندان",
        "prefs-displaywatchlist": "ھەڵبژاردەکانی نیشاندان",
        "prefs-tokenwatchlist": "نیشانە",
        "prefs-diffs": "جیاوازییەکان",
        "userrights-changeable-col": "ئەو گرووپانەی دەتوانی بیگۆڕی",
        "userrights-unchangeable-col": "ئەو گرووپانەی ناتوانی بیگۆڕی",
        "group": "گرووپ:",
-       "group-user": "بەکارهێنەران",
+       "group-user": "بەکارھێنەران",
        "group-autoconfirmed": "بەکارھێنەرانی پەسندکراوی خۆگەڕ",
        "group-bot": "بۆتەکان",
        "group-sysop": "بەڕێوەبەران",
        "group-user-member": "{{GENDER:$1|بەکارھێنەر}}",
        "group-autoconfirmed-member": "{{GENDER:$1|بەکارھێنەرانی پەسندکراوی خۆگەڕ}}",
        "group-bot-member": "بۆت",
-       "group-sysop-member": "{{GENDER:$1|بەڕێوبەر}}",
+       "group-sysop-member": "{{GENDER:$1|بەڕێوەبەر}}",
        "group-bureaucrat-member": "{{GENDER:$1|بیوروکرات}}",
        "group-suppress-member": "{{GENDER:$1|چاودێر}}",
        "grouppage-user": "{{ns:project}}:بەکارھێنەران",
        "grouppage-autoconfirmed": "{{ns:project}}:بەکارھێنەرانی پەسندکراوی خۆگەڕ",
        "grouppage-bot": "{{ns:project}}:بۆت",
-       "grouppage-sysop": "{{ns:project}}:بەڕێوبەران",
+       "grouppage-sysop": "{{ns:project}}:بەڕێوەبەران",
        "grouppage-bureaucrat": "{{ns:project}}:بیوروکراتەکان",
        "grouppage-suppress": "{{ns:project}}:چاودێر",
        "right-read": "خوێندنەوەی پەڕەکان",
        "right-import": "ھاوردنی پەڕەکان لە ویکییەکانی تر",
        "right-importupload": "ھاوردنی پەڕەکان بە بارکردنی پەڕگە",
        "right-patrol": "نیشانکردنی دەستکاریەکانی کەسانی تر وەک پاس دراو",
-       "right-autopatrol": "Ù\86Û\8cشاÙ\86کردÙ\86Û\8c Ø®Û\86Ú¯Û\95Ú\95Û\8c Ø¯Û\95ستکارÛ\8cÛ\8cÛ\95کاÙ\86Û\8c Ø®Û\86Û\8c Ù\88Û\95Ú© Ù¾Ø§Ø³ Ø¯Ø±Ø§Ù\88",
+       "right-autopatrol": "پاسداÙ\86Û\8c Ø®Û\86Ú¯Û\95Ú\95Û\8c Ø¯Û\95ستکارÛ\8cÛ\8cÛ\95کاÙ\86Û\8c Ø®Û\86Û\8c",
        "right-patrolmarks": "دیتنی نیشانەکانی پاسدان لە دوایین گۆڕانکارییەکاندا",
        "right-unwatchedpages": "دیتنی پێرستێک لە پەڕە چاودێری نەکراوەکان",
-       "right-mergehistory": "میژووی پەڕەکان بکە یەک",
+       "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-createpage": "درووست‌کردنی لاپەڕە",
-       "action-createtalk": "درووست‌کردنی لەپەڕەکانی وتووێژ",
+       "action-createpage": "دروستکردنی پەڕەکان",
+       "action-createtalk": "دروستکردنی پەڕەکانی وتووێژ",
        "action-createaccount": "درووست‌کردنی هەژمارەی ئەم بەکارهێنەرە",
        "action-minoredit": "نیشان‌کردنی ئەم دەستکاریە وەک بچووک",
-       "action-move": "گواستنەوەی ئەم پەڕە",
+       "action-move": "گواستنەوەی ئەم پەڕەیە",
        "action-move-subpages": "گواستنەوەی ئەم پەڕەیە و ژێرپەڕەکانی",
-       "action-move-rootuserpages": "Ú¯Ù\88استÙ\86Û\95Ù\88Û\95Û\8c Ø¨Ù\86Û\95رÛ\95تÛ\8c Ù\84اپÛ\95Ú\95Û\95کاÙ\86Û\8c Ø¨Û\95کارÙ\87ێنەر",
+       "action-move-rootuserpages": "Ú¯Ù\88استÙ\86Û\95Ù\88Û\95Û\8c Ø¨Ù\86Û\95رÛ\95تÛ\8c Ù¾Û\95Ú\95Û\95کاÙ\86Û\8c Ø¨Û\95کارھێنەر",
        "action-movefile": "ئەم پەڕگەیە بگوازەوە",
        "action-upload": "ئەم پەڕەیە بار بکە",
        "action-reupload": "سەرنووسینی ئەم پەڕگە وا هەیە",
        "action-upload_by_url": "ئەم پەرگەیە لە ناونیشانێکی ئینتەرنێتی بار بکە",
        "action-writeapi": "کەڵک وەر گرتن لە نووسینی API",
        "action-delete": "ئەم پەڕەیە بسڕەوە",
-       "action-deleterevision": "سÚ\95Û\8cÙ\86Û\8c Ø¦Û\95Ù\85 Ù¾Û\8eداÚ\86Ù\88Ù\88Ù\86Û\95Ù\88ە",
-       "action-deletedhistory": "دÛ\8cتÙ\86Û\8c Ù\85Û\8eÚ\98Ù\88Ù\88Û\8c Ø³Ú\95اÙ\88Û\95Û\8c Ø¦Û\95Ù\85 Ù\84اپÛ\95Ú\95ە",
+       "action-deleterevision": "سÚ\95Û\8cÙ\86Û\95Ù\88Û\95Û\8c Ø¦Û\95Ù\85 Ù¾Û\8eداÚ\86Ù\88Ù\88Ù\86Û\95Ù\88Û\95Û\8cە",
+       "action-deletedhistory": "دÛ\8cتÙ\86Û\8c Ù\85Û\8eÚ\98Ù\88Ù\88Û\8c Ø³Ú\95اÙ\88Û\95Û\8c Ø¦Û\95Ù\85 Ù¾Û\95Ú\95Û\95Û\8cە",
        "action-browsearchive": "گەران لە نێو لاپەڕە سڕاوەکان",
        "action-undelete": "گەڕانەوەی ئەم لاپەڕە",
        "action-suppressrevision": "چاوپێداخشان و هاردنوەی ئەم لاپەڕە شاراوە",
        "action-suppressionlog": "دیتنی ئەم لۆگە ئەهلیە",
        "action-block": "بەربەست کردنی ئەم بەکارهێنەرە بۆ دەستکاری‌کردن",
-       "action-protect": "گۆڕانی ئاستی پارێزراوی بۆ ئەم لاپەڕە",
+       "action-protect": "گۆڕینی ئاستی پاراستن بۆ ئەم پەڕەیە",
        "action-rollback": "گەڕاندنەوەی خێرای دەستکاریەکانی دوایین بەکارھێنەر کە پەڕەیەکی دیاریکراوی دەستکاری کردووە",
        "action-import": "ھاوردنی پەڕەکان لە ویکییەکی ترەوە",
        "action-importupload": "ھاوردنی پەڕەکان لە پەڕگەیەکی بارکراو",
        "action-patrol": "نیشانکردنی دەستکاریەکانی کەسانی تر وەک پاس دراو",
        "action-autopatrol": "دەستکارییەکانت وەک پاس دراو نیشان بکرێ",
        "action-unwatchedpages": "دیتنی پێرستێک لە پەڕە چاودێری نەکراوەکان",
-       "action-mergehistory": "میژووی پەڕەکان بکە یەک",
+       "action-mergehistory": "کردنەیەکی میژووی ئەم پەڕەیە",
        "action-userrights": "دەستکاریی مافەکانی ھەموو بەکارھێنەران",
        "action-userrights-interwiki": "دەستکاری مافەکانی بەکارهێنەریی بەکارهێنەران لە ویکی‌یەکانی دیکە‌دا",
        "action-siteadmin": "داخستن یا کردنەوەی بنکەدراو",
        "action-sendemail": "ناردنی ئیمەیلەکان",
        "action-viewmywatchlist": "دیتنی پێرستی چاودێریت",
        "nchanges": "$1 {{PLURAL:$1|گۆڕانکاری}}",
+       "enhancedrc-history": "مێژوو",
        "recentchanges": "دوایین گۆڕانکارییەکان",
        "recentchanges-legend": "ھەڵبژاردەکانی دوایین گۆڕانکارییەکان",
        "recentchanges-summary": "لەم پەڕەیەدا شوێنی دوایین گۆڕانکارییەکانی ویکی بکەوە.",
        "recentchanges-legend-newpage": "(ھەروەھا بڕوانە [[Special:NewPages|پێرستی پەڕە نوێکان]])",
        "recentchanges-legend-plusminus": "(''±۱٢٣'')",
        "rcnotefrom": "ژێرەوە گۆڕانکارییەکانە لە <strong>$2</strong>ەوە (ھەتا <strong>$1</strong> نیشان دراوە).",
-       "rclistfrom": "گۆڕانکارییە نوێکان نیشان بدە بە دەستپێکردن لە $1",
+       "rclistfrom": "گۆڕانکارییە نوێکان نیشان بدە بە دەستپێکردن لە $3 $2",
        "rcshowhideminor": "دەستکارییە بچووکەکان $1",
        "rcshowhideminor-show": "نیشان بدە",
        "rcshowhideminor-hide": "بشارەوە",
        "rcshowhideanons-show": "نیشان بدە",
        "rcshowhideanons-hide": "بشارەوە",
        "rcshowhidepatr": "گۆرانکارییە پاس دراوەکان $1",
+       "rcshowhidepatr-show": "نیشان بدە",
        "rcshowhidemine": "دەستکارییەکانم $1",
        "rcshowhidemine-show": "نیشان بدە",
        "rcshowhidemine-hide": "بشارەوە",
        "minoreditletter": "ب",
        "newpageletter": "ن",
        "boteditletter": "بۆ",
-       "number_of_watching_users_pageview": "[$1 چاودێر لەسەر {{PLURAL:$1|بەکارھێنەر}}]",
+       "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|بەکارھێنەر}}ی چاودێر]",
        "rc_categories": "بەرتەسک‌کردنەوە بە هاوپۆلەکان (به «|» جیای بکەوە‌)",
        "rc_categories_any": "هەرکام",
        "rc-change-size-new": "$1 {{PLURAL:$1|بایت}} پاش گۆڕانکاری",
        "filedesc": "کورتە",
        "fileuploadsummary": "کورتە:",
        "filereuploadsummary": "گۆرانکارییەکانی پەڕگە:",
-       "filestatus": "بارودۆخی مافی لەبەرگرتنەوە:",
+       "filestatus": "ڕەوشی مافی لەبەرگرتنەوە:",
        "filesource": "سەرچاوە:",
        "ignorewarning": "چاوپۆشان لە ئاگادارییەکان و پاشەکەوت کردن بە هەر شێوەیەک",
        "ignorewarnings": "گوێ مەدە بە ئاگادارییەکان",
        "unusedtemplateswlh": "بەستەرەکانی تر",
        "randompage": "پەڕەیەک بە هەڵکەوت",
        "randompage-nopages": "هیچ لاپەڕەیەک لەم {{PLURAL:$2|ناوبۆشاییەدا|ناوبۆشاییانەدا}} نیە: $1.",
+       "randomincategory-selectcategory-submit": "بڕۆ",
        "randomredirect": "ڕەوانەکەری ھەرمەکی",
        "randomredirect-nopages": "لە ناوبۆشایی \"$1\" هیچ ڕەوانکەرێک نییە.",
        "statistics": "ئامارەکان",
        "statistics-pages": "پەڕەکان",
        "statistics-pages-desc": "گشت پەڕەکانی ویکی، بە لەخۆگرتنی پەڕەکانی لێدوان، ڕەوانەکەرەکان و ھتد.",
        "statistics-files": "پەڕگە بارکراوەکان",
-       "statistics-edits": "دەستکارییەکانی پەڕەکان لە کاتی دامەزراندنی {{SITENAME}}ەوە",
+       "statistics-edits": "دەستکارییەکانی پەڕەکان لە کاتی دامەزراندنی {{SITENAME}}",
        "statistics-edits-average": "ناونجیی دەستکارییەکان بۆ ھەر پەڕە",
        "statistics-views-total": "دیتنی هەموو",
        "statistics-views-peredit": "دیتنی هەر دەستکارییەک",
        "mostrevisions": "پەڕەکان بە زۆرترین پێداچوونەوەکان",
        "prefixindex": "ھەموو پەڕەکان بە پێشگرەوە",
        "prefixindex-namespace": "هەموو پەڕەکان بەپێشگری (بۆشایی ناوی $1)",
+       "prefixindex-strip": "پێشگری ناو پێرست بقرتێنە",
        "shortpages": "پەڕە کورتەکان",
        "longpages": "پەڕە درێژەکان",
        "deadendpages": "پەڕە بنبەستەکان",
        "protectedpages": "پەڕە پارێزراوەکان",
        "protectedpages-indef": "تەنیا پاراستنە بێسنوورەکان",
        "protectedpages-cascade": "تەنیا پاراستنە زنجیرییەکان",
+       "protectedpages-noredirect": "ڕەوانەکەرەکان بشارەوە",
        "protectedpagesempty": "هیچ لاپەڕەیک ئێستا بەم دیاریکراوانە نەپارێزراوە.",
+       "protectedpages-page": "پەڕە",
+       "protectedpages-params": "پارامەترەکانی پاراستن",
+       "protectedpages-reason": "ھۆکار",
        "protectedtitles": "سەرناوە پارێزراوەکان",
        "protectedtitlesempty": "ھیچ سەرناوێک بەم سنوورانەوە ئێستا نەپارێزراوە.",
        "listusers": "پێرستی بەکارھێنەران",
        "listusers-editsonly": "تەنیا ئەو بەکارھێنەرانە نیشان بدە کە دەستکارییان کردووە",
        "listusers-creationsort": "ڕیزکردن بە پێی ڕێکەوتی دروستکردن",
+       "listusers-desc": "ڕیزکردنی بەرەوە ژێر",
        "usereditcount": "$1 {{PLURAL:$1|دەستکاری|دەستکاری}}",
        "usercreated": "لە $1، $2 {{GENDER:$3|دروست کراوە}}",
        "newpages": "پەڕە نوێکان",
        "log-title-wildcard": "گەڕانی ئەو سەرناوانە بەم دەقەوە دەست پێدەکەن",
        "showhideselectedlogentries": "بابەتەکانی ھەڵبژێردراوی لۆگ نیشان بدە/بشارەوە",
        "allpages": "ھەموو پەڕەکان",
-       "alphaindexline": "$1 تا $2",
        "nextpage": "پەڕەی پاشەوە ($1)",
        "prevpage": "پەڕەی پێشەوە ($1)",
        "allpagesfrom": "نیشاندانی پەڕەکان بە دەستپێکردن لە:",
        "listgrouprights-removegroup-self": "لابردنی {{PLURAL:$2|گرووپ|گرووپەکان}} لە سەر ھەژماری خۆی: $1",
        "listgrouprights-addgroup-self-all": "زیادکردنی ھەموو گرووپەکان بۆ سەر ھەژماری خۆی",
        "listgrouprights-removegroup-self-all": "لابردنی هەموو گرووپەکان له‌ سه‌ر هه‌ژماری خۆ",
-       "listgrouprights-namespaceprotection-namespace": "بۆشاییی ناو",
+       "listgrouprights-namespaceprotection-header": "سنوورداریی بۆشایی ناو",
+       "listgrouprights-namespaceprotection-namespace": "بۆشایی ناو",
+       "listgrouprights-namespaceprotection-restrictedto": "مافی رێ‌پێدراوی بەکارھێنەر بۆ دەستکاری",
        "trackingcategories-name": "ناوی پەیام",
        "mailnologin": "ناونیشان بۆ ناردن نییه‌",
        "mailnologintext": "ده‌بێ له‌ [[Special:UserLogin|ژووره‌وه‌]] بیت و ناونیشانێکی بڕواپێ‌کراوی ئی‌مه‌یلت له‌ ناو [[Special:Preferences|هه‌ڵبژارده‌کان]] دیاری کردبێت تا بتوانی ئی‌مه‌یل بنێریت بۆ به‌کارهێنه‌رانی دیکه‌.",
        "watchlist-details": "{{PLURAL:$1|$1 پەڕە|$1 پەڕە}} لە لیستی چاودێریەکەتدایە، بێجگە پەڕەکانی لێدوان.",
        "wlheader-enotif": "ئاگاداری بە ئیمەیل چالاکە.",
        "wlheader-showupdated": "‏ئەو پەڕانە کە لە پاش دواین سەردانت دەستکاری کراون بە '''ئەستوور''' نیشان دراون",
-       "watchmethod-recent": "سەرنج‌دانی دوایین دەستکاریەکان بۆ لاپەڕە چاودێری‌کراوەکان",
-       "watchmethod-list": "سەرنج‌دانی لاپەڕە چاودێری‌کراوەکان بۆ دوایین دەستکاریەکان",
-       "watchlistcontains": "لیستی چاودێڕییەکانت $1 {{PLURAL:$1|پەڕە|پەڕە}}ی تێدایە.",
-       "iteminvalidname": "ھەڵە لەگەڵ بابەتی '$1'، ناوی نادروست...",
        "wlshowlast": "دوایین $1 کاتژمێر $2 ڕۆژی $3 نیشان بدە",
        "watchlist-options": "ھەڵبژاردەکانی لیستی چاودێری",
        "watching": "چاودێری...",
        "enotif_lastvisited": "بۆ بینینی ھەموو گۆرانکارییەکانی پاش دوایین سەردانت $1 ببینە.",
        "enotif_lastdiff": "بۆ بینینی ئەم گۆڕانکارییە $1 ببینە.",
        "enotif_anon_editor": "بەکارھێنەری نەناسراو $1",
-       "enotif_body": "‫$WATCHINGUSERNAMEی بەڕێز،\n\n$PAGEINTRO $NEWPAG\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{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "‫$WATCHINGUSERNAMEی بەڕێز،\n\n$PAGEINTRO $NEWPAG\n\nکورتەی دەستکارییەکەی: $PAGESUMMARY $PAGEMINOREDIT\n\nپەیوەندی لەگەڵ دەستکاریکەر:\nنامە: $PAGEEDITOR_EMAIL\nویکی: $PAGEEDITOR_WIKI\n\nتا سەردانی ئەم پەڕەیە نەکەیت، گۆڕانکارییەکانی داھاتووی پەڕەکەت پێ ڕاناگەیێندرێت. هەروەھا دەتوانی ئاڵاکانی ڕاگەیاندن لە پەڕەی چاودێرییەکەتدا لە سەرەتاوە ڕێک بخەیتەوە.\n\nبە سپاسەوە، سیستەمی ڕاگەیاندنی {{SITENAME}}\n\n--\nبۆ گۆڕینی رێکخستنەکانی ڕاگەیاندن بە ئیمەیل، بڕوانە\n{{canonicalurl:{{#special:Preferences}}}}\n\nبۆ گۆڕینی ڕێکخستنەکانی پێرستی چاودێرییەکەت، بڕوانە\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nبۆ سڕینەوەی پەڕەکە لە پێرستی چاودێرییەکەت، بڕوانە\n$UNWATCHURL\n\nکاردانەوە و یارمەتیی زۆرتر:\n$HELPPAGE",
        "created": "دروستکرا",
        "changed": "گۆڕدرا",
        "deletepage": "پەڕە بسڕەوە",
        "protect-default": "بە ھەموو بەکارھێنەران ڕێگە بدە",
        "protect-fallback": "تەنیا بە بەکارھێنەران بە مافی «$1» ڕێگە بدە",
        "protect-level-autoconfirmed": "تەنیا بە بەکارھێنەرانی پەسندکراو ڕێگە بدە",
-       "protect-level-sysop": "تەنیا بەڕێوەبەران",
+       "protect-level-sysop": "تەنیا بە بەڕێوەبەران ڕێگە بدە",
        "protect-summary-cascade": "تاڤگەیی",
        "protect-expiring": "بەسەردەچێ لە ڕێکەوتی $1 (UTC)",
        "protect-expiring-local": "بە سەر دەچێ لە $1",
        "blockip": "بەربەستنی بەکارھێنەر",
        "blockip-legend": "بەربەست‌کردنی بەکارهێنەر",
        "blockiptext": "لەم فۆرمەی خوارەوە دەتوانی بۆ بەربەست‌کردنی دەست‌پێ‌گەیشتنی نووسین لە ناونیشانێکی ئای‌پی تایبەت یا ناوی بەکارهێنەریەک، کەڵک وەرگریت.\nئەمە تەنها دەبێ بۆ بەرگری لە خراپکاری بەکاربێت و ڕێکەوتنی هەبێ دەگەڵ [[{{MediaWiki:Policy-url}}|سیاسەتەکان]].\nلە خوارەوە هۆکارێک بە ڕوونی بنووسە (بۆ نموونە بە وردی ئەو لاپەڕانە و خراپکاری تێدا کراوە وەک، وەک بەڵگە، بنووسە).",
-       "ipadressorusername": "ناونیشانی ئایپی یان ناوی‌ بەکارھێنەر:",
+       "ipaddressorusername": "ناونیشانی ئایپی یان ناوی‌ بەکارھێنەر:",
        "ipbexpiry": "بەسەرچوون:",
        "ipbreason": "هۆکار:",
        "ipbreason-dropdown": "*ھۆکارە ھاوبەشەکانی بەربستن\n**دانانی زانیاریی ھەڵە\n**لابردنی ناوەرۆکی پەڕەکان\n**بەستەر بۆ پەڕەی دەرەکی نەگونجاو\n**نووسینی قسەی بێ‌مانا و بێ‌سوود\n**ھەڵسوکەوت یان وتاری ھاندەر بۆ توندوتیژی\n**بەکارھێنانی چەند ھەژمار پێکەوە\n**ناوی بەکارھێنەریی نەگونجاو",
        "tooltip-undo": "«پووچەڵکردنەوە» ئەم گۆڕانکارییە دەگەڕێنێتەوە و فۆرمی دەستکاریکردن لە شێوەی پێشبینیندا دەکاتەوە. بەم جۆرە دەکرێ ھۆکارێک لە کورتەی دەستکاریدا بنووسرێ.",
        "tooltip-preferences-save": "هەڵبژاردنەکانت بپارێزە",
        "tooltip-summary": "پوختەیەکی کورتی تێبخە",
-       "notacceptable": "ڕاژەکاری ویکی ناتوانێت داتا بەوشێوەی بۆ ڕاژەخوازی تۆ بخوێندرێتەوە، ئامادە بکات.",
        "anonymous": "{{PLURAL:$1|بەکارهێنەری|بەکارهێنەرانی}} نەناسراوی {{SITENAME}}",
        "siteuser": "بەکارھێنەری {{SITENAME}}، $1",
        "anonuser": "$1، بەکارھێنەری نامۆی {{SITENAME}}",
        "pageinfo-category-pages": "ژمارەی پەڕەکان",
        "pageinfo-category-subcats": "ژمارەی ژێرپەڕەکان",
        "pageinfo-category-files": "ژمارەی پەڕگەکان",
-       "skinname-cologneblue": "شینی کۆلۆن",
        "skinname-monobook": "مۆنۆ",
-       "skinname-modern": "مۆدێڕن",
        "skinname-vector": "ڤێکتۆر",
        "markaspatrolleddiff": "وەک پاس دراو نیشان بکە",
        "markaspatrolledtext": "ئەم پەڕەیە وەک پاس دراو نیشان بکە",
        "newimages-summary": "ئەم پەڕە تایبەتە دوایین پەڕگە بارکراوەکان نیشان دەدات.",
        "newimages-legend": "پاڵاوتن",
        "newimages-label": "ناوی پەڕگە (یان بەشێکیی):",
-       "showhidebots": "(بۆتەکان $1)",
        "noimages": "هیچ بۆ بینین نییە.",
        "ilsubmit": "بگەڕێ",
        "bydate": "بەپێی ڕێکەوت",
        "size-gigabytes": "$1 گیگابایت",
        "size-terabytes": "$1 تێرابایت",
        "size-petabytes": "$1 پێبی‌بایت",
-       "livepreview-loading": "باركردن‌...",
-       "livepreview-ready": "بارکردن... ئامادە!",
        "lag-warn-normal": "گۆڕانکاریەکانی نوێ‌تر لە $1 {{PLURAL:$1|چرکە|چرکە}} لەوانەیە لەم لیستەدا نیشان نەدرێن.",
        "lag-warn-high": "لەبەر زۆر دواکەوتنی ڕاژەکاری بنکەدراو، گۆڕانکاریەکانی نوێ‌تر لە $1 {{PLURAL:$1|چرکە|چرکە}} لەوانەیە لەم لیستەدا نیشان نەدرێن.",
-       "watchlistedit-numitems": "بێجگە لە پەڕەی وتووێژەکان، لیستی چاودێڕییەکانت {{PLURAL:$1|1 بابەت|$1 بابەت}}ی تێدایە،",
-       "watchlistedit-noitems": "لیستی چاودێڕییەکانت ھیچ بابەتێکی تێدا نییە.",
        "watchlistedit-normal-title": "دە‌ستکاری لیستی چاودێری",
        "watchlistedit-normal-legend": "لابردنی سەردێڕەکان لە لیستی چاودێری",
        "watchlistedit-normal-explain": "سەردێڕی بڕگەکانی لیستی چاودێریەکەت لە خوارەوە نیشان‌دراون.\nبۆ لابردنی هەرکام، چوارچێوەی بەرامبەری نیشان بکە و کرتە بکە سەر {{int:Watchlistedit-normal-submit}} بۆ لابردنی سەردێڕەکان\nھەروەھا دەتوانی [[Special:EditWatchlist/raw|دەستکاری لیستی خاو]] بکەیت.",
        "watchlistedit-raw-done": "لیستی چاودێریەکەت نوێ‌کرایەوە",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 سەردێڕ|$1 سەردێڕ}} زیادکرا:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 سەردێڕ|$1 سەردێڕ}} لابرا:",
+       "watchlistedit-clear-titles": "ناونیشانەکان :",
        "watchlisttools-view": "گۆڕانکارییە پەیوەندیدارەکان ببینە",
        "watchlisttools-edit": "لیستی چاودێری ببینە و دەستکاری بکە",
        "watchlisttools-raw": "لیستی خاوی چاودێری دەستکاری بکە",
        "compare-rev2": "پێداچوونەوەی ٢",
        "compare-submit": "ھەڵسەنگاندن",
        "compare-invalid-title": "ئەم سەردێڕە دەستنیشانت کردووە نادروستە.",
-       "dberr-header": "ئەم ویکی‌یە کێشەی هەیە",
        "dberr-problems": "ببورە! ئەم ماڵپەڕە ئێستا خەریک ئەزموونێکی کێشەی تەکنیکیە.",
        "dberr-again": "چەن خولک ڕاوەستە و نوێی بکەوە.",
        "dberr-info": "(پەیوەندی لەگەڵ ڕاژەکاری بنکەدراو پێکنایەت: $1)",
        "logentry-newusers-newusers": "ھەژماری بەکارھێنەریی $1 {{GENDER:$2|دروست کرا}}",
        "logentry-newusers-create": "ھەژماری بەکارھێنەریی $1 {{GENDER:$2|دروست کرا}}",
        "logentry-newusers-create2": "ھەژماری بەکارھێنەریی $3 لە لایەن $1 {{GENDER:$2|دروست کرا}}",
+       "logentry-newusers-byemail": "ھەژماری بەکارھێنەریی $3 لە لایەن $1 {{GENDER:$2|دروست کرا}} و تێپەڕوشە بە ئیمەیل نێردرا",
        "logentry-newusers-autocreate": "ھەژماری بەکارھێنەریی $1 بە شێوەی خۆگەڕ {{GENDER:$2|دروست کرا}}",
        "logentry-rights-rights": "$1 ئەندامێتیی $3ی لە $4 بۆ $5 {{GENDER:$2|گۆڕی}}",
        "rightsnone": "(ھیچ)",
index d37ec9b..c3c0736 100644 (file)
@@ -4,7 +4,8 @@
                        "Ale Mister",
                        "Ale Mister (on co.wikipedia.org)",
                        "Img (on co.wikipedia.org)",
-                       "Paulu"
+                       "Paulu",
+                       "아라"
                ]
        },
        "tog-hideminor": "Piattà e mudifiche minore in l'ultime mudifiche",
        "recentchanges-label-plusminus": "A dimensione di a pagina hè stata cambiata di 'ssu numaru d'ottetti",
        "recentchanges-legend-newpage": "(vede ancu [[Special:NewPages|a lista di e pagine nove]])",
        "rcnotefrom": "Quì seguitanu e mudifiche dapoi u '''$2''' ('''$1''' à u massimu).",
-       "rclistfrom": "Mustrà e mudifiche dapoi u $1",
+       "rclistfrom": "Mustrà e mudifiche dapoi u $3 $2",
        "rcshowhideminor": "$1 i cambiamenti minori",
        "rcshowhidebots": "$1 i boti",
        "rcshowhideliu": "$1 i cuntributori righjistrati",
        "log": "Righjistramenti",
        "all-logs-page": "Tutte l'azzioni",
        "allpages": "Tutte e pagine",
-       "alphaindexline": "da $1 à $2",
        "nextpage": "Pagina seguente ($1)",
        "prevpage": "Pagina precedente ($1)",
        "allpagesfrom": "Mustrà e pagine à parte da:",
        "whatlinkshere-links": "$1 ligami",
        "whatlinkshere-hidetrans": "inclusione",
        "whatlinkshere-hidelinks": "$1 ligami",
-       "ipadressorusername": "Adrizzu IP o nome di cuntributore",
+       "ipaddressorusername": "Adrizzu IP o nome di cuntributore",
        "ipbreason": "Mutivu:",
        "ipboptions": "2 ore:2 hours,1 ghjornu:1 day,3 ghjorni:3 days,1 sittimana:1 week,2 sittimane:2 weeks,1 mese:1 month,3 mesi:3 months,6 mesi:6 months,1 annu:1 year,infinitu:infinite",
        "ipblocklist": "Cuntributori bluccati",
        "file-nohires": "Una diversione incù una risoluzione più alta ùn hè micca dispunibile.",
        "show-big-image": "Schedariu originale",
        "show-big-image-other": "{{PLURAL:$2|Altra risuluzione|Altre risuluzioni}}: $1.",
-       "showhidebots": "($1 boti)",
        "noimages": "Nulla da vede.",
        "ilsubmit": "Ricerca",
        "bydate": "per data",
        "table_pager_limit_label": "Risultati per pagina:",
        "table_pager_limit_submit": "Invià",
        "table_pager_empty": "Micca risultati",
+       "autosumm-replace": "Pagina sustituita incù '$1'",
        "autoredircomment": "Reindirizzamentu à [[$1]]",
        "autosumm-new": "Pagina nova: $1",
        "watchlistedit-raw-titles": "Pagine:",
        "tags-edit": "mudificà",
        "logentry-delete-delete": "$1 ha cancellatu a pagina $3",
        "logentry-move-move": "$1 {{GENDER:$2|hà spustatu}} a pagina $3 à $4",
+       "logentry-newusers-create": "U participante $3 hè statu creatu da $1",
        "rightsnone": "(nessunu)",
        "expand_templates_output": "Risultatu"
 }
index da444c2..0b601fc 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Capisano",
                        "Oxyzen",
-                       "Reedy"
+                       "Reedy",
+                       "아라"
                ]
        },
        "tog-underline": "Kuritan sa idalum ang mga link",
@@ -16,7 +17,6 @@
        "tog-showtoolbar": "Ipakita ang toolbar sang pag-ilis (kinahanglan ang JavaScript)",
        "tog-editondblclick": "Liwaton ang mga pahina sa duwa ka pindot {kinahanglan ang Javascript}",
        "tog-editsectiononrightclick": "Pasugtan ang pag-ilis sang mga bahin pama-agi sa tu-o nga pagpindot sa mga titulo sang pahina {kinanglan ang JavaScript}",
-       "tog-rememberpassword": "Dumduma ang pagsulod ko sa mini nga kompyuter (pinakadamu na ang $1 {{PLURAL:$1|adlaw|mga adlaw}})",
        "tog-watchcreations": "Idugang sa akon balantayan ang mga pahina nga gin-ubra ko.",
        "tog-watchdefault": "Idugang sa akon balantayan ang mga pahina nga akon na-islan",
        "tog-watchmoves": "Idugang sa akon balantayan ang mga pahina nga akon ginsaylo",
        "readonly_lag": "Otomatiko nga ginkandaduhan samtang ang serbidor sang alila nga database ginakwa pakadto sa pinakapuno",
        "internalerror": "Pangsulodlon nga diperensiya",
        "internalerror_info": "Pangsulodlon nga diperensiya:  $1",
-       "fileappenderrorread": "Indi mabasa ang \"$1\" samtang ginalakip.",
-       "fileappenderror": "Indi malakip ang \"$1\" sa \"$2\".",
        "filecopyerror": "Indi makopya ang file nga \"$1\" pakadto sa \"$2\".",
        "filerenameerror": "Indi mapangalanan liwat ang file nga \"$1\" pakadto sa \"$2\".",
        "filedeleteerror": "Indi mapanas ang file nga \"$1\".",
        "directorycreateerror": "Indi maka-ubra sang direktoryo nga \"$1\".",
        "filenotfound": "Indi makita sang file nga \"$1\".",
-       "fileexistserror": "Indi makasulat sa file nga \"$1\": buhi ang file",
        "unexpected": "Wala naekspektaran nga bili: \"$1\"=\"$2\"",
        "formerror": "Kasal-anan: indi mapadala ang pormas",
        "badarticleerror": "Ang mini nga aksyon indi mahimo sa mini nga pahina.",
        "search-nonefound": "Wala sang mga resulta nga nagatugma sa pamangkot/pagpamangkot.",
        "powersearch-legend": "Abanse nga pagpangita",
        "powersearch-ns": "Magpangita sa mga espasyo sang pangalan:",
-       "powersearch-redir": "Lista sang mga gindirekta liwat",
        "preferences": "Mga ginapalabi",
        "mypreferences": "Akon mga ginapalabi",
        "group-sysop": "Mga manugdumala",
        "recentchanges-label-minor": "Gamay lang ini nga pagbag-o",
        "recentchanges-label-bot": "Ubra sang isa ka bot ang mini nga pagbag-o",
        "recentchanges-label-unpatrolled": "Wala pa napapatrulyahan ang mini nga pagbag-o",
-       "rclistfrom": "Ipakita ang bag-o nga mga na-islan halin sa $1",
+       "rclistfrom": "Ipakita ang bag-o nga mga na-islan halin sa $3 $2",
        "rcshowhideminor": "$1 gamay nga mga inislan",
        "rcshowhidebots": "$1 ka bots",
        "rcshowhideliu": "$1 ka mga gagamit nga naka-sulod",
index fc00357..5f27285 100644 (file)
@@ -4,7 +4,8 @@
                        "AlefZet",
                        "Alessandro",
                        "Don Alessandro",
-                       "Urhixidur"
+                       "Urhixidur",
+                       "아라"
                ]
        },
        "tog-underline": "Багълантыларнынъ тюбюни сызув:",
@@ -17,7 +18,6 @@
        "tog-showtoolbar": "Саифени денъиштирген вакъытта ярдымджы дёгмелерни косьтер. (JavaScript)",
        "tog-editondblclick": "Саифени чифт басып денъиштирмеге башла (JavaScript)",
        "tog-editsectiononrightclick": "Болюк серлевасына онъ баскъанда денъиштирюв пенджересини ач. (JavaScript)",
-       "tog-rememberpassword": "Киришимни бу браузерде хатырла (энъ чокъ $1 {{PLURAL:$1|1=кунь|кунь}} ичюн)",
        "tog-watchcreations": "Яраткъан саифелеримни ве юклеген файлларымны козетюв джедвелиме кирсет",
        "tog-watchdefault": "Денъиштирген саифе ве файлларымны козетюв джедвелиме кирсет",
        "tog-watchmoves": "Адыны мен денъиштирген саифе ве файлларны козетюв джедвелиме кирсет",
        "readonly_lag": "Малюмат базасынынъ экилемджи сервери бирлемджи серверинен замандашлаштырылгъандже малюмат базасы денъиштирильмемеси ичюн автоматик оларакъ блок этильди.",
        "internalerror": "Ички хата",
        "internalerror_info": "Ички хата: $1",
-       "fileappenderrorread": "Къошма япылгъанда \"$1\" окъуламады.",
-       "fileappenderror": "«$1» файлы «$2» файлына къошулып оламай.",
        "filecopyerror": "\"$1\" файлы \"$2\" файлына копияланып оламай.",
        "filerenameerror": "файлнынъ \"$1\" деген ады \"$2\" оларакъ денъиштирилип оламай.",
        "filedeleteerror": "\"$1\" файлы ёкъ этилип оламай.",
        "directorycreateerror": "\"$1\" директориясы яратылып оламай.",
        "filenotfound": "\"$1\" файлы тапылып оламай.",
-       "fileexistserror": "\"$1\" файлы сакъланып оламай, файл энди бар.",
        "unexpected": "бекленмеген дегер: \"$1\"=\"$2\".",
        "formerror": "Хата: форманынъ малюматыны ёлламакънынъ ич чареси ёкъ",
        "badarticleerror": "Сиз япмагъа истеген ишлев бу саифеде япылып оламай.",
        "savearticle": "Саифени сакъла",
        "preview": "Бакъып чыкъув",
        "showpreview": "Бакъып чыкъ",
-       "showlivepreview": "Тез бакъып чыкъув",
        "showdiff": "Денъиштирмелерни косьтер",
        "anoneditwarning": "'''Дикъкъат''': Сайткъа кирмегенинъизден себеп денъиштирмелер тарихына сизинъ IP адресинъиз язылыр.",
        "anonpreviewwarning": "Сайткъа кирмединъиз. Саифени сакъласанъыз, денъиштирмелер тарихына сизинъ IP адресинъиз язылыр.",
        "searchmenu-exists": "'''Бу викиде \"[[:$1]]\" адлы бир саифе бар'''",
        "searchmenu-new": "'''Бу викиде \"[[:$1]]\" саифесини ярат!'''",
        "searchprofile-articles": "Малюмат саифелери",
-       "searchprofile-project": "Ярдым ве лейха саифелери",
        "searchprofile-images": "Мультимедиа",
        "searchprofile-everything": "Эр шей",
        "searchprofile-advanced": "Тафсилятлы",
        "searchprofile-articles-tooltip": "$1 ичинде къыдыр",
-       "searchprofile-project-tooltip": "$1 ичинде къыдыр",
        "searchprofile-images-tooltip": "Файлларны къыдыр",
        "searchprofile-everything-tooltip": "Бутюн саифелерде (музакере саифелеринде де) къыдыр",
        "searchprofile-advanced-tooltip": "Бельгиленген исим фезаларында къыдыр",
        "search-nonefound": "Соратманен эшлешкен бир нетидже ёкъ.",
        "powersearch-legend": "Тафсилятлы къыдырув",
        "powersearch-ns": "Бу исим фезаларында къыдыр:",
-       "powersearch-redir": "Ёллама саифелерини де косьтер",
        "powersearch-togglelabel": "Сайла:",
        "powersearch-toggleall": "Эписи",
        "powersearch-togglenone": "Ич бири",
        "prefs-emailconfirm-label": "E-mail тасдыкъланмасы:",
        "youremail": "E-mail адресинъиз:",
        "username": "Къулланыджы ады:",
-       "uid": "Къайд номери:",
        "prefs-memberingroups": "Азасы олгъан {{PLURAL:$1|1=группа|группалар}}:",
        "prefs-registration": "Къайд тарихы:",
        "yourrealname": "Керчек адынъыз:",
        "prefs-advancedsearchoptions": "Иляве сазламалар",
        "prefs-advancedwatchlist": "Иляве сазламалар",
        "prefs-displayrc": "Косьтерилюв сазламалары",
-       "prefs-displaysearchoptions": "Косьтерилюв сазламалары",
        "prefs-displaywatchlist": "Косьтерилюв сазламалары",
        "prefs-diffs": "Фаркълар",
        "userrights": "Къулланыджы акъларыны идаре этюв",
        "recentchanges-label-minor": "Бу, кичик бир денъиштирме",
        "recentchanges-label-bot": "Бу бир ботнынъ япкъан денъиштирмеси",
        "recentchanges-label-unpatrolled": "Бу денъиштирме аля даа тешкерильмеген",
-       "recentchanges-legend-newpage": "$1 - янъы саифе",
+       "recentchanges-legend-newpage": "([[Special:NewPages|янъы саифелер джедвелине]] де бакъынъыз)",
        "rcnotefrom": "'''$2''' тарихындан итибарен япылгъан денъиштирмелер ашагъыдадыр (энъ чокъ '''$1''' дане саифе косьтериле).",
-       "rclistfrom": "$1 тарихындан берли япылгъан денъиштирмелерни косьтер",
+       "rclistfrom": "$3 $2 тарихындан берли япылгъан денъиштирмелерни косьтер",
        "rcshowhideminor": "кичик денъиштирмелерни $1",
+       "rcshowhideminor-show": "косьтер",
+       "rcshowhideminor-hide": "гизле",
        "rcshowhidebots": "ботларны $1",
-       "rcshowhideliu": "къайдлы къулланыджыларны $1",
+       "rcshowhidebots-show": "косьтер",
+       "rcshowhidebots-hide": "гизле",
+       "rcshowhideliu": "Къайдлы къулланыджыларны $1",
+       "rcshowhideliu-show": "косьтер",
+       "rcshowhideliu-hide": "гизле",
        "rcshowhideanons": "аноним къулланыджыларны $1",
+       "rcshowhideanons-show": "косьтер",
+       "rcshowhideanons-hide": "гизле",
        "rcshowhidepatr": "козетильген денъиштирмелерни $1",
+       "rcshowhidepatr-show": "косьтер",
+       "rcshowhidepatr-hide": "гизле",
        "rcshowhidemine": "меним япкъан денъиштирмелеримни $1",
+       "rcshowhidemine-show": "косьтер",
+       "rcshowhidemine-hide": "гизле",
        "rclinks": "Сонъки $2 куньде япылгъан сонъки $1 денъиштирмени косьтер;<br /> $3",
        "diff": "фаркъ",
        "hist": "кечмиш",
        "rc_categories": "Тек категориялардан («|» иле айырыла)",
        "rc_categories_any": "Эр анги",
        "newsectionsummary": "/* $1 */ янъы болюк",
-       "rc-enhanced-expand": "Тафсилятыны косьтер (JavaScript керек)",
+       "rc-enhanced-expand": "Тафсилятыны косьтер",
        "rc-enhanced-hide": "Тафсилятыны гизле",
        "recentchangeslinked": "Багълы денъиштирмелер",
        "recentchangeslinked-feed": "Багълы денъиштирмелер",
        "logempty": "Журналда бир кельген малюмат ёкъ.",
        "log-title-wildcard": "Бу ишаретлерден башлангъан серлеваларны къыдыр",
        "allpages": "Бутюн саифелер",
-       "alphaindexline": "$1 саифесинден $2 саифесинедже",
        "nextpage": "Сонъраки саифе ($1)",
        "prevpage": "Эвельки саифе ($1)",
        "allpagesfrom": "Джедвельге чекмеге башланыладжакъ арифлер:",
        "watchlist-details": "Музакере саифелерини эсапкъа алмайып, козетюв джедвелинъизде {{PLURAL:$1|1=1|$1}} саифе бар.",
        "wlheader-enotif": "E-mail иле хабер берюв ачылды.",
        "wlheader-showupdated": "Сонъки зияретинъизден сонъ денъиштирильген саифелер '''къалын арифлернен''' косьтерильди.",
-       "watchmethod-recent": "сонъки денъиштирмелер арасында козеткен саифелеринъиз къыдырыла",
-       "watchmethod-list": "козетюв джедвелиндеки саифелер тешкериле",
-       "watchlistcontains": "Сизинъ козетюв джедвелинъизде {{PLURAL:$1|1=1|$1}} саифе бар.",
-       "iteminvalidname": "\"$1\" саифеси мунасебетинен проблема олып чыкъты, эльверишли олмагъан исимдир…",
        "wlshowlast": "Сонъки $1 саат ичюн, $2 кунь ичюн я да $3 косьтер",
        "watchlist-options": "Козетюв джедвели сазламалары",
        "watching": "Козетюв джедвелине кирсетильмекте...",
        "enotif_impersonal_salutation": "{{SITENAME}} къулланыджысы",
        "enotif_lastvisited": "Сонъки зияретинъизден берли япылгъан денъиштирмелерни корьмек ичюн $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Бильдирюв сазламаларыны денъиштирмек ичюн:\n{{canonicalurl:{{#special:Preferences}}}}\n\nКозетюв джедвели сазламаларыны денъиштирмек ичюн:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nСаифени козетюв джедвелинден чыкъармакъ ичюн:\n$UNWATCHURL\n\nЯрдым ве теклифлер ичюн:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "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Бильдирюв сазламаларыны денъиштирмек ичюн:\n{{canonicalurl:{{#special:Preferences}}}}\n\nКозетюв джедвели сазламаларыны денъиштирмек ичюн:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nСаифени козетюв джедвелинден чыкъармакъ ичюн:\n$UNWATCHURL\n\nЯрдым ве теклифлер ичюн:\n$HELPPAGE",
        "created": "яратылды",
        "changed": "денъиштирильди",
        "deletepage": "Саифени ёкъ эт",
        "blockip": "Бу IP адресинден иришимни блок эт",
        "blockip-legend": "Къулланыджыны блок эт",
        "blockiptext": "Ашагъыдаки форманы къулланып белли бир IP адресининъ я да къулланыджынынъ иришимини блок этип оласынъыз. Бу тек вандализмни блок этмек ичюн ве [[{{MediaWiki:Policy-url}}|къаиделерге]] уйгъун оларакъ япылмалы. Ашагъыгъа мытлакъа блок этюв иле багълы бир изаат язынъыз. (меселя: Шу саифелерде вандализм япты).",
-       "ipadressorusername": "IP адреси я да къулланыджы ады",
+       "ipaddressorusername": "IP адреси я да къулланыджы ады",
        "ipbexpiry": "Битиш муддети",
        "ipbreason": "Себеп",
        "ipbsubmit": "Бу къулланыджыны блок эт",
        "tooltip-rollback": "\"Кери къайтув\" сычаннен бир басув вастасынен бу саифени сонъки денъиштиргеннинъ денъишикликлерини кери ала",
        "tooltip-undo": "\"Кери ал\" бу денъишикликни кери ала ве денъишиклик пенджересини бакъып чыкъув режиминде ача. Кери алувнынъ себебини бильдирмеге изин бере.",
        "monobook.css": "/* monobook темасынынъ аярларыны (настройкаларыны) денъиштирмек ичюн бу ерини денъиштиринъиз. Бутюн сайтта тесирли олур. */",
-       "notacceptable": "Вики-сервер браузеринъиз окъуп оладжакъ форматында малюмат бералмай.",
        "anonymous": "{{SITENAME}} сайтынынъ  {{PLURAL:$1|1=1|$1}} къайдсыз (аноним) къулланыджысы",
        "siteuser": "{{SITENAME}} сайтынынъ къулланыджысы $1",
        "anonuser": "{{SITENAME}} сайтынынъ къайдсыз (аноним) къулланыджысы $1",
        "spambot_username": "Спамдан темизлев",
        "spam_reverting": "$1 сайтына багълантысы олмагъан сонъки версиягъа кери кетирюв",
        "spam_blanking": "Бар олгъан версияларда $1 сайтына багълантылар бар, темизлев",
-       "skinname-cologneblue": "Кёльн асретлиги",
        "skinname-monobook": "MonoBook",
        "patrol-log-page": "Тешкерюв журналы",
        "log-show-hide-patrol": "Тешкерюв журналыны $1",
        "newimages-summary": "Бу махсус саифе сонъки юкленген файлларны косьтере.",
        "newimages-legend": "Сюзгюч",
        "newimages-label": "Файл ады (я да онынъ бир парчасы):",
-       "showhidebots": "(ботларны $1)",
        "noimages": "Ресим ёкъ.",
        "ilsubmit": "Къыдыр",
        "bydate": "хронологик сыранен",
        "autosumm-replace": "Саифедеки малюмат '$1' иле денъиштирильди",
        "autoredircomment": "[[$1]] саифесине ёлланды",
        "autosumm-new": "Янъы саифе яратылды. Мундериджеси: '$1'",
-       "livepreview-loading": "Юкленмекте…",
-       "livepreview-ready": "Юкленмекте… Азыр!",
-       "livepreview-failed": "Тез бакъып чыкъув ишлемей! Адий бакъып чыкъувны къулланып бакъынъыз.",
-       "livepreview-error": "Багъланамады: $1 «$2». Адий бакъып чыкъувны къулланып бакъынъыз.",
        "lag-warn-normal": "{{PLURAL:$1|1=1|$1}} саниеден эвель ве ондан сонъ япылгъан денъишикликлер бу джедвельде косьтерильмейип олалар.",
        "lag-warn-high": "Малюмат базасындаки проблемалар себебинден {{PLURAL:$1|1=1|$1}} саниеден эвель ве ондан сонъ япылгъан денъишикликлер бу джедвельде косьтерильмейип олалар.",
-       "watchlistedit-numitems": "Музакере саифесини эсапкъа алмайып, козетюв джедвелинъизде {{PLURAL:$1|1=1|$1}} саифе бар.",
-       "watchlistedit-noitems": "Козетюв джедвелинъизде ич бир саифе ёкъ.",
        "watchlistedit-normal-title": "Козетюв джевелинъизни денъиштиреятасыз",
        "watchlistedit-normal-legend": "Козетюв джедвелинден саифе ёкъ этилюви",
        "watchlistedit-normal-explain": "Козетюв джедвелинъиздеки саифелер ашагъыда косьтерильген.\nБир саифе козетюв джедвелинден ёкъ этмек ичюн оны бельгилеп «{{int:Watchlistedit-normal-submit}}» дёгмесине басынъыз. Козетюв джедвелинъизни [[Special:EditWatchlist/raw|метин оларакъ да]] денъиштирип оласынъыз.",
index 8e94bbe..b27cb20 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "AlefZet",
                        "Don Alessandro",
-                       "Urhixidur"
+                       "Urhixidur",
+                       "아라"
                ]
        },
        "tog-underline": "Bağlantılarnıñ tübüni sızuv:",
@@ -16,7 +17,6 @@
        "tog-showtoolbar": "Saifeni deñiştirgen vaqıtta yardımcı dögmelerni köster. (JavaScript)",
        "tog-editondblclick": "Saifeni çift basıp deñiştirmege başla (JavaScript)",
        "tog-editsectiononrightclick": "Bölük serlevasına oñ basqanda deñiştirüv penceresini aç. (JavaScript)",
-       "tog-rememberpassword": "Kirişimni bu brauzerde hatırla (eñ çoq $1 {{PLURAL:$1|kün|kün}} içün)",
        "tog-watchcreations": "Yaratqan saifelerimni ve yüklegen fayllarımnı közetüv cedvelime kirset",
        "tog-watchdefault": "Deñiştirgen saife ve fayllarımnı közetüv cedvelime kirset",
        "tog-watchmoves": "Adını men deñiştirgen saife ve fayllarnı közetüv cedvelime kirset",
        "readonly_lag": "Malümat bazasınıñ ekilemci serveri birlemci serverinen zamandaşlaştırılğance malümat bazası deñiştirilmemesi içün avtomatik olaraq blok etildi.",
        "internalerror": "İçki hata",
        "internalerror_info": "İçki hata: $1",
-       "fileappenderrorread": "Qoşma yapılğanda \"$1\" oqulamadı.",
-       "fileappenderror": "\"$1\" faylı \"$2\" faylına qoşulıp olamay.",
        "filecopyerror": "\"$1\" faylı \"$2\" faylına kopiyalanıp olamay.",
        "filerenameerror": "faylnıñ \"$1\" degen adı \"$2\" olaraq deñiştirilip olamay.",
        "filedeleteerror": "\"$1\" faylı yoq etilip olamay.",
        "directorycreateerror": "\"$1\" direktoriyası yaratılıp olamay.",
        "filenotfound": "\"$1\" faylı tapılıp olamay.",
-       "fileexistserror": "\"$1\" faylı saqlanıp olamay, fayl endi bar.",
        "unexpected": "beklenmegen deger: \"$1\"=\"$2\".",
        "formerror": "Hata: formanıñ malümatını yollamaqnıñ iç çaresi yoq",
        "badarticleerror": "Siz yapmağa istegen işlev bu saifede yapılıp olamay.",
        "savearticle": "Saifeni saqla",
        "preview": "Baqıp çıquv",
        "showpreview": "Baqıp çıq",
-       "showlivepreview": "Tez baqıp çıquv",
        "showdiff": "Deñiştirmelerni köster",
        "anoneditwarning": "'''Diqqat''': Saytqa kirmegeniñizden sebep deñiştirmeler tarihına siziñ IP adresiñiz yazılır.",
        "anonpreviewwarning": "Saytqa kirmediñiz. Saifeni saqlasañız deñiştirmeler tarihına siziñ IP adresiñiz yazılır.",
        "searchmenu-exists": "'''Bu vikide \"[[:$1]]\" adlı bir saife bar'''",
        "searchmenu-new": "'''Bu vikide \"[[:$1]]\" saifesini yarat!'''",
        "searchprofile-articles": "Malümat saifeleri",
-       "searchprofile-project": "Yardım ve leyha saifeleri",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Er şey",
        "searchprofile-advanced": "Tafsilâtlı",
        "searchprofile-articles-tooltip": "$1 içinde qıdır",
-       "searchprofile-project-tooltip": "$1 içinde qıdır",
        "searchprofile-images-tooltip": "Fayllarnı qıdır",
        "searchprofile-everything-tooltip": "Bütün saifelerde (muzakere saifelerinde de) qıdır",
        "searchprofile-advanced-tooltip": "Belgilengen isim fezalarında qıdır",
        "search-nonefound": "Soratmanen eşleşken bir netice yoq.",
        "powersearch-legend": "Tafsilâtlı qıdıruv",
        "powersearch-ns": "Bu isim fezalarında qıdır:",
-       "powersearch-redir": "Yollama saifelerini de köster",
        "powersearch-togglelabel": "Sayla:",
        "powersearch-toggleall": "Episi",
        "powersearch-togglenone": "İç biri",
        "prefs-emailconfirm-label": "E-mail tasdıqlanması:",
        "youremail": "E-mail adresiñiz:",
        "username": "Qullanıcı adı:",
-       "uid": "Qayd nomeri:",
        "prefs-memberingroups": "Azası olğan {{PLURAL:$1|gruppa|gruppalar}}:",
        "prefs-registration": "Qayd tarihı:",
        "yourrealname": "Kerçek adıñız:",
        "prefs-advancedsearchoptions": "İlâve sazlamalar",
        "prefs-advancedwatchlist": "İlâve sazlamalar",
        "prefs-displayrc": "Kösterilüv sazlamaları",
-       "prefs-displaysearchoptions": "Kösterilüv sazlamaları",
        "prefs-displaywatchlist": "Kösterilüv sazlamaları",
        "prefs-diffs": "Farqlar",
        "userrights": "Qullanıcı aqlarını idare etüv",
        "recentchanges-label-minor": "Bu, kiçik bir deñiştirme",
        "recentchanges-label-bot": "Bu bir botnıñ yapqan deñiştirmesi",
        "recentchanges-label-unpatrolled": "Bu deñiştirme alâ daa teşkerilmegen",
-       "recentchanges-legend-newpage": "$1 - yañı saife",
+       "recentchanges-legend-newpage": "([[Special:NewPages|yañı saifeler cedveline]] de baqıñız)",
        "rcnotefrom": "'''$2''' tarihından itibaren yapılğan deñiştirmeler aşağıdadır (eñ çоq '''$1''' dane saife kösterile).",
-       "rclistfrom": "$1 tarihından berli yapılğan deñiştirmelerni köster",
+       "rclistfrom": "$3 $2 tarihından berli yapılğan deñiştirmelerni köster",
        "rcshowhideminor": "kiçik deñiştirmelerni $1",
+       "rcshowhideminor-show": "köster",
+       "rcshowhideminor-hide": "gizle",
        "rcshowhidebots": "botlarnı $1",
-       "rcshowhideliu": "qaydlı qullanıcılarnı $1",
+       "rcshowhidebots-show": "köster",
+       "rcshowhidebots-hide": "gizle",
+       "rcshowhideliu": "Qaydlı qullanıcılarnı $1",
+       "rcshowhideliu-show": "köster",
+       "rcshowhideliu-hide": "gizle",
        "rcshowhideanons": "anonim qullanıcılarnı $1",
+       "rcshowhideanons-show": "köster",
+       "rcshowhideanons-hide": "gizle",
        "rcshowhidepatr": "közetilgen deñiştirmelerni $1",
+       "rcshowhidepatr-show": "köster",
+       "rcshowhidepatr-hide": "gizle",
        "rcshowhidemine": "menim yapqan deñiştirmelerimni $1",
+       "rcshowhidemine-show": "köster",
+       "rcshowhidemine-hide": "gizle",
        "rclinks": "Soñki $2 künde yapılğan soñki $1 deñiştirmeni köster;<br /> $3",
        "diff": "farq",
        "hist": "keçmiş",
        "rc_categories": "Tek kategoriyalardan (\"|\" ile ayırıla)",
        "rc_categories_any": "Er angi",
        "newsectionsummary": "/* $1 */ yañı bölük",
-       "rc-enhanced-expand": "Tafsilâtını köster (JavaScript kerek)",
+       "rc-enhanced-expand": "Tafsilâtını köster",
        "rc-enhanced-hide": "Tafsilâtını gizle",
        "recentchangeslinked": "Bağlı deñiştirmeler",
        "recentchangeslinked-feed": "Bağlı deñiştirmeler",
        "logempty": "Jurnalda bir kelgen malümat yoq.",
        "log-title-wildcard": "Bu işaretlerden başlanğan serlevalarnı qıdır",
        "allpages": "Bütün saifeler",
-       "alphaindexline": "$1 saifesinden $2 saifesinece",
        "nextpage": "Soñraki saife ($1)",
        "prevpage": "Evelki saife ($1)",
        "allpagesfrom": "Cedvelge çekmege başlanılacaq arifler:",
        "watchlist-details": "Muzakere saifelerini esapqa almayıp, közetüv cedveliñizde {{PLURAL:$1|1|$1}} saife bar.",
        "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.",
-       "watchmethod-recent": "soñki deñiştirmeler arasında közetken saifeleriñiz qıdırıla",
-       "watchmethod-list": "közetüv cedvelindeki saifeler teşkerile",
-       "watchlistcontains": "Siziñ közetüv cedveliñizde {{PLURAL:$1|1|$1}} saife bar.",
-       "iteminvalidname": "\"$1\" saifesi munasebetinen problema olıp çıqtı, elverişli olmağan isimdir…",
        "wlshowlast": "Soñki $1 saat içün, $2 kün içün ya da $3 köster",
        "watchlist-options": "Közetüv cedveli sazlamaları",
        "watching": "Közetüv cedveline kirsetilmekte...",
        "enotif_impersonal_salutation": "{{SITENAME}} qullanıcısı",
        "enotif_lastvisited": "Soñki ziyaretiñizden berli yapılğan deñiştirmelerni körmek içün $1 baqıñız.",
        "enotif_anon_editor": "adsız (anonim) qullanıcı $1",
-       "enotif_body": "Sayğılı $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nDeñiştirmeniñ qısqa tarifi: $PAGESUMMARY $PAGEMINOREDIT\n\nSaifeni deñiştirgen qullanıcınen bağlanmaq içün:\ne-mail adresi: $PAGEEDITOR_EMAIL\nviki saifesi: $PAGEEDITOR_WIKI\n\nBu saifeni ziyaret etmeseñiz, birev onı bir daa deñiştirse de, iç bir tenbi beyanatı yollanmaycaq. Közetüv cedveliñizdeki bütün saifeler içün tenbi sazlamalarını deñiştire bilesiñiz.\n\n{{SITENAME}} bildirüv sisteması\n\n--\n\nBildirüv sazlamalarını deñiştirmek içün:\n{{canonicalurl:{{#special:Preferences}}}}\n\nKözetüv cedveli sazlamalarını deñiştirmek içün:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nSaifeni közetüv cedvelinden çıqarmaq içün:\n$UNWATCHURL\n\nYardım ve teklifler içün:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Sayğılı $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nDeñiştirmeniñ qısqa tarifi: $PAGESUMMARY $PAGEMINOREDIT\n\nSaifeni deñiştirgen qullanıcınen bağlanmaq içün:\ne-mail adresi: $PAGEEDITOR_EMAIL\nviki saifesi: $PAGEEDITOR_WIKI\n\nBu saifeni ziyaret etmeseñiz, birev onı bir daa deñiştirse de, iç bir tenbi beyanatı yollanmaycaq. Közetüv cedveliñizdeki bütün saifeler içün tenbi sazlamalarını deñiştire bilesiñiz.\n\n{{SITENAME}} bildirüv sisteması\n\n--\n\nBildirüv sazlamalarını deñiştirmek içün:\n{{canonicalurl:{{#special:Preferences}}}}\n\nKözetüv cedveli sazlamalarını deñiştirmek içün:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nSaifeni közetüv cedvelinden çıqarmaq içün:\n$UNWATCHURL\n\nYardım ve teklifler içün:\n$HELPPAGE",
        "created": "yaratıldı",
        "changed": "deñiştirildi",
        "deletepage": "Saifeni yoq et",
        "blockip": "Bu IP adresinden irişimni blok et",
        "blockip-legend": "Qullanıcını blok et",
        "blockiptext": "Aşağıdaki formanı qullanıp belli bir IP adresiniñ ya da qullanıcınıñ irişimini blok etip olasıñız. Bu tek vandalizmni blok etmek içün ve [[{{MediaWiki:Policy-url}}|qaidelerge]] uyğun olaraq yapılmalı. Aşağığa mıtlaqa blok etüv ile bağlı bir izaat yazıñız. (meselâ: Şu saifelerde vandalizm yaptı).",
-       "ipadressorusername": "IP adresi ya da qullanıcı adı",
+       "ipaddressorusername": "IP adresi ya da qullanıcı adı",
        "ipbexpiry": "Bitiş müddeti",
        "ipbreason": "Sebep",
        "ipbsubmit": "Bu qullanıcını blok et",
        "tooltip-rollback": "\"Keri qaytuv\" sıçannen bir basuv vastasınen bu saifeni soñki deñiştirgenniñ deñişikliklerini keri ala",
        "tooltip-undo": "\"Keri al\" bu deñişiklikni keri ala ve deñişiklik penceresini baqıp çıquv rejiminde aça. Keri aluvnıñ sebebini bildirmege izin bere.",
        "monobook.css": "/* monobook temasınıñ ayarlarını (nastroykalarını) deñiştirmek içün bu yerini deñiştiriñiz. Bütün saytta tesirli olur. */",
-       "notacceptable": "Viki-server brauzeriñiz oqup olacaq formatında malümat beralmay.",
        "anonymous": "{{SITENAME}} saytınıñ {{PLURAL:$1|1|$1}} qaydsız (anonim) qullanıcıları",
        "siteuser": "{{SITENAME}} saytınıñ qullanıcısı $1",
        "anonuser": "{{SITENAME}} saytınıñ qaydsız (anonim) qullanıcısı $1",
        "spambot_username": "Spamdan temizlev",
        "spam_reverting": "$1 saytına bağlantısı olmağan soñki versiyağa keri ketirüv",
        "spam_blanking": "Bar olğan versiyalarda $1 saytına bağlantılar bar, temizlev",
-       "skinname-cologneblue": "Köln asretligi",
        "skinname-monobook": "MonoBook",
        "patrol-log-page": "Teşkerüv jurnalı",
        "log-show-hide-patrol": "Teşkerüv jurnalını $1",
        "newimages-summary": "Bu mahsus saife soñki yüklengen fayllarnı köstere.",
        "newimages-legend": "Süzgüç",
        "newimages-label": "Fayl adı (ya da onıñ bir parçası):",
-       "showhidebots": "(botlarnı $1)",
        "noimages": "Resim yoq.",
        "ilsubmit": "Qıdır",
        "bydate": "hronologik sıranen",
        "autosumm-replace": "Saifedeki malümat '$1' ile deñiştirildi",
        "autoredircomment": "[[$1]] saifesine yollandı",
        "autosumm-new": "Yañı saife yaratıldı. Mündericesi: '$1'",
-       "livepreview-loading": "Yüklenmekte…",
-       "livepreview-ready": "Yüklenmekte… Azır!",
-       "livepreview-failed": "Tez baqıp çıquv işlemey! Adiy baqıp çıquvnı qullanıp baqıñız.",
-       "livepreview-error": "Bağlanamadı: $1 \"$2\". Adiy baqıp çıquvnı qullanıp baqıñız.",
        "lag-warn-normal": "{{PLURAL:$1|1|$1}} saniyeden evel ve ondan soñ yapılğan deñişiklikler bu cedvelde kösterilmeyip olalar.",
        "lag-warn-high": "Malümat bazasındaki problemalar sebebinden {{PLURAL:$1|1|$1}} saniyeden evel ve ondan soñ yapılğan deñişiklikler bu cedvelde kösterilmeyip olalar.",
-       "watchlistedit-numitems": "Muzakere saifesini esapqa almayıp, közetüv cedveliñizde {{PLURAL:$1|1|$1}} saife bar.",
-       "watchlistedit-noitems": "Közetüv cedveliñizde iç bir saife yoq.",
        "watchlistedit-normal-title": "Közetüv ceveliñizni deñiştireyatasız",
        "watchlistedit-normal-legend": "Közetüv cedvelinden saife yoq etilüvi",
        "watchlistedit-normal-explain": "Közetüv cedveliñizdeki saifeler aşağıda kösterilgen.\nBir saife közetüv cedvelinden yoq etmek içün onı belgilep \"{{int:Watchlistedit-normal-submit}}\" dögmesine basıñız.\nKözetüv cedveliñizni [[Special:EditWatchlist/raw|metin olaraq da]] deñiştirip olasıñız.",
index 4b4ac16..cb3d5a9 100644 (file)
        "jumptonavigation": "navigace",
        "jumptosearch": "hledání",
        "view-pool-error": "Promiňte, servery jsou momentálně přetíženy.\nTuto stránku si právě prohlíží příliš mnoho uživatelů.\nPřed tím, než ji zkusíte načíst znovu, chvíli počkejte.\n\n$1",
+       "generic-pool-error": "Promiňte, servery jsou momentálně přetíženy.\nTento zdroj si právě prohlíží příliš mnoho uživatelů.\nProsím, před dalším pokusem o přístup chvíli počkejte.",
        "pool-timeout": "Při čekání na zámek vypršel časový limit",
        "pool-queuefull": "Fronta ve fondu je plná",
        "pool-errorunknown": "Neznámá chyba",
        "readonly_lag": "Databáze byla automaticky dočasně uzamčena kvůli zpoždění ostatních databázových serverů oproti hlavnímu",
        "internalerror": "Vnitřní chyba",
        "internalerror_info": "Vnitřní chyba: $1",
-       "fileappenderrorread": "Během přidávání se nepodařilo přečíst „$1“.",
-       "fileappenderror": "Nepodařilo se připojit „$1“ k „$2“.",
        "filecopyerror": "Nebylo možné zkopírovat soubor  „$1“ na „$2“.",
        "filerenameerror": "Nebylo možné přejmenovat soubor „$1“ na „$2“.",
        "filedeleteerror": "Nebylo možné smazat soubor „$1“.",
        "directorycreateerror": "Nelze vytvořit adresář „$1“.",
        "filenotfound": "Nebylo možné najít soubor „$1“.",
-       "fileexistserror": "Nelze uložit do souboru „$1“: soubor existuje",
        "unexpected": "Neočekávaná hodnota: \"$1\"=\"$2\".",
        "formerror": "Chyba: nebylo možné odeslat formulář",
        "badarticleerror": "Tuto činnost nelze na této stránce provést.",
        "userlogin-helplink2": "Nápověda k přihlašování",
        "userlogin-loggedin": "Již jste {{GENDER:$1|přihlášen|přihlášena}} jako $1.\nPomocí formuláře níže se můžete přihlásit jako jiný uživatel.",
        "userlogin-createanother": "Vytvořit jiný účet",
-       "createacct-join": "Níže zadejte své údaje.",
-       "createacct-another-join": "Níže zadejte údaje nového účtu.",
        "createacct-emailrequired": "E-mailová adresa",
        "createacct-emailoptional": "E-mailová adresa (nepovinné)",
        "createacct-email-ph": "Zadejte svou e-mailovou adresu",
        "savearticle": "Uložit změny",
        "preview": "Náhled",
        "showpreview": "Ukázat náhled",
-       "showlivepreview": "Rychlý náhled",
        "showdiff": "Ukázat změny",
        "anoneditwarning": "'''Varování:''' Nejste přihlášen(a). Vaše IP adresa bude zveřejněna v historii této stránky.",
        "anonpreviewwarning": "''Nejste přihlášen(a). Uložením zveřejníte svou IP adresu v historii této stránky.''",
        "noarticletext": "Tato stránka zatím neobsahuje žádný text.\nMůžete [[Special:Search/{{PAGENAME}}|zkusit tento název vyhledat]] na jiných stránkách, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} prohlédnout si příslušné protokolovací záznamy] nebo [{{fullurl:{{FULLPAGENAME}}|action=edit}} tuto stránku založit]</span>.",
        "noarticletext-nopermission": "Tato stránka zatím neobsahuje žádný text.\nMůžete [[Special:Search/{{PAGENAME}}|zkusit tento název vyhledat]] na jiných stránkách nebo <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} si prohlédnout příslušné protokolovací záznamy]</span>, ale na založení této stránky nemáte oprávnění.",
        "missing-revision": "Revize #$1 stránky s názvem „{{FULLPAGENAME}}“ neexistuje.\n\nToto je obvykle způsobeno tím, že jste následovali zastaralý odkaz na historickou verzi stránky, jež byla smazána.\nPodrobnosti mohou být uvedeny v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} knize smazaných stránek].",
-       "userpage-userdoesnotexist": "Uživatelský účet „<nowiki>$1</nowiki>“ není zaregistrován. Zkontrolujte zda skutečně chcete vytvořit či editovat tuto stránku.",
+       "userpage-userdoesnotexist": "Uživatelský účet „<nowiki>$1</nowiki>“ není zaregistrován. Zkontrolujte, zda skutečně chcete vytvořit či editovat tuto stránku.",
        "userpage-userdoesnotexist-view": "Uživatelský účet „$1“ není zaregistrován.",
        "blocked-notice-logextract": "Tento uživatel je momentálně zablokován.\nZde je pro přehled zobrazen nejnovější záznam z knihy zablokování:",
        "clearyourcache": "'''Poznámka:''' Po uložení musíte smazat cache vašeho prohlížeče, jinak změny neuvidíte.\n* '''Firefox / Safari:''' Při kliknutí na ''Aktualizovat'' držte ''Shift'' nebo stiskněte ''Ctrl-F5'' nebo ''Ctrl-R'' (na Macu ''⌘-R'').\n* '''Google Chrome:''' Stiskněte ''Ctrl-Shift-R'' (na Macu ''⌘-Shift-R'').\n* '''Internet Explorer:''' Při kliknutí na ''Aktualizovat'' držte ''Ctrl'' nebo stiskněte ''Ctrl-F5''.\n* '''Opera:''' Smažte obsah cache v menu ''Nástroje → Nastavení''.",
        "edit-gone-missing": "Stránku se nepodařilo aktualizovat.\nZřejmě byla smazána.",
        "edit-conflict": "Editační konflikt.",
        "edit-no-change": "Vaše editace byla ignorována, protože nedošlo k žádné změně textu.",
-       "postedit-confirmation": "Vaše změny byly uloženy.",
+       "postedit-confirmation-created": "Stránka byla založena.",
+       "postedit-confirmation-restored": "Stránka byla obnovena.",
+       "postedit-confirmation-saved": "Vaše změny byly uloženy.",
        "edit-already-exists": "Nepodařilo se vytvořit novou stránku, protože již existuje.",
        "defaultmessagetext": "Výchozí text hlášení",
        "content-failed-to-parse": "Nepodařilo se zpracovat data $2 do modelu $1: $3",
        "content-model-text": "čistý text",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
-       "expensive-parserfunction-warning": "Varování: Tato stránka obsahuje příliš mnoho volání výkonnostně náročných funkcí parseru.\n\nPovolený limit je $2, v současné chvíli však {{PLURAL:$1|zde jedno volání je|zde jsou $2 volání|zde je $2 volání}}.",
-       "expensive-parserfunction-category": "Stránky s příliš mnoho voláními náročných funkcí parseru",
+       "expensive-parserfunction-warning": "'''Varování:''' Tato stránka obsahuje příliš mnoho volání výkonnostně náročných funkcí syntaktického analyzátoru.\n\nPovolený limit je $2, v současné chvíli však {{PLURAL:$1|zde jedno volání je|zde jsou $1 volání|zde je $1 volání}}.",
+       "expensive-parserfunction-category": "Stránky s příliš mnoho voláními náročných funkcí syntaktického analyzátoru",
        "post-expand-template-inclusion-warning": "Varování: Objem vkládaných šablon je příliš velký.\nNěkteré šablony nebudou vloženy.",
        "post-expand-template-inclusion-category": "Stránky překračující povolenou velikost vložených šablon",
        "post-expand-template-argument-warning": "Varování: Tato stránka obsahuje alespoň jeden argument šablony, který je po rozbalení příliš velký.\nTyto argumenty byly vynechány.",
        "parser-template-recursion-depth-warning": "Překročen limit hloubky rekurzivního vkládání šablon ($1)",
        "language-converter-depth-warning": "Překročen limit vnoření u jazykové konverze ($1)",
        "node-count-exceeded-category": "Stránky překračující počet uzlů",
+       "node-count-exceeded-category-desc": "Kategorie pro stránky, kde je překročen počet uzlů.",
        "node-count-exceeded-warning": "Stránka překročila počet uzlů",
        "expansion-depth-exceeded-category": "Stránky překračující hloubku expanze",
+       "expansion-depth-exceeded-category-desc": "Toto je kategorie pro stránky, ve kterých je překročena hloubka expanze.",
        "expansion-depth-exceeded-warning": "Stránka překročila hloubku expanze",
        "parser-unstrip-loop-warning": "Detekováno zacyklení unstrip",
        "parser-unstrip-recursion-limit": "Překročen limit rekurze unstrip ($1)",
        "searchmenu-exists": "'''Na této wiki existuje stránka nazvaná „[[:$1]]“.'''",
        "searchmenu-new": "<strong>Vytvořte na této wiki stránku „[[:$1]]“!</strong> {{PLURAL:$2|0=|Prohlédněte si také stránku nalezenou vaším hledáním.|Prohlédněte si také stránky nalezené vaším hledáním.}}",
        "searchprofile-articles": "Články",
-       "searchprofile-project": "Nápověda a projektové stránky",
        "searchprofile-images": "Multimédia",
        "searchprofile-everything": "Všechno",
        "searchprofile-advanced": "Rozšířené",
        "searchprofile-articles-tooltip": "Prohledávat: $1",
-       "searchprofile-project-tooltip": "Prohledávat: $1",
        "searchprofile-images-tooltip": "Hledat obrázky a další soubory",
        "searchprofile-everything-tooltip": "Prohledávat veškerý obsah (včetně diskusních stránek)",
        "searchprofile-advanced-tooltip": "Nastavit jmenné prostory, ve kterých se má hledat",
        "search-nonefound": "Na váš dotaz nebyly nalezeny žádné výsledky.",
        "powersearch-legend": "Rozšířené vyhledávání",
        "powersearch-ns": "Hledat ve jmenných prostorech:",
-       "powersearch-redir": "Vypsat přesměrování",
        "powersearch-togglelabel": "Zaškrtnout:",
        "powersearch-toggleall": "Všechno",
        "powersearch-togglenone": "Nic",
        "prefs-emailconfirm-label": "Ověření e-mailu:",
        "youremail": "E-mail:",
        "username": "{{GENDER:$1|Uživatelské jméno}}:",
-       "uid": "{{GENDER:$1|Uživatelské}} ID:",
        "prefs-memberingroups": "{{GENDER:$2|Člen|Členka}} {{PLURAL:$1|skupiny|skupin}}:",
        "prefs-registration": "Čas registrace:",
        "yourrealname": "Vaše skutečné jméno:",
        "prefs-advancedsearchoptions": "Rozšířené možnosti",
        "prefs-advancedwatchlist": "Rozšířené možnosti",
        "prefs-displayrc": "Možnosti zobrazení",
-       "prefs-displaysearchoptions": "Možnosti zobrazení",
        "prefs-displaywatchlist": "Možnosti zobrazení",
        "prefs-tokenwatchlist": "Klíč",
        "prefs-diffs": "Porovnání verzí",
        "right-move": "Přesouvání stránek",
        "right-move-subpages": "Přesouvání stránek i s jejich podstránkami",
        "right-move-rootuserpages": "Přesouvání kořenových uživatelských stránek",
+       "right-move-categorypages": "Přesouvání stránek kategorií",
        "right-movefile": "Přesouvání souborů",
        "right-suppressredirect": "Nevytváření přesměrování po přesunu stránky",
        "right-upload": "Nahrávání souborů",
        "action-createpage": "vytvářet stránky",
        "action-createtalk": "vytvářet diskusní stránky",
        "action-createaccount": "vytvořit tento uživatelský účet",
+       "action-history": "prohlížet si historii této stránky",
        "action-minoredit": "označit tuto editaci jako malou",
        "action-move": "přesunout tuto stránku",
        "action-move-subpages": "přesunout tuto stránku a její podstránky",
        "action-move-rootuserpages": "přesouvat kořenové uživatelské stránky",
+       "action-move-categorypages": "přesouvat stránky kategorií",
        "action-movefile": "přesunout tento soubor",
        "action-upload": "nahrát tento soubor",
        "action-reupload": "přepsat tento existující soubor",
        "recentchanges-legend-newpage": "(vizte též [[Special:NewPages|seznam nových stránek]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Níže jsou změny od <strong>$2</strong> ({{PLURAL:$1|zobrazena|zobrazeny|zobrazeno}} nejvýše <strong>$1</strong>).",
-       "rclistfrom": "Ukázat nové změny, počínaje od $1",
+       "rclistfrom": "Ukázat nové změny, počínaje od $2, $3",
        "rcshowhideminor": "$1 malé editace",
        "rcshowhideminor-show": "Zobrazit",
        "rcshowhideminor-hide": "Skrýt",
        "uploadstash-refresh": "Aktualizovat seznam souborů",
        "invalid-chunk-offset": "Neplatný posun bloku",
        "img-auth-accessdenied": "Přístup odepřen",
-       "img-auth-nopathinfo": "Chybí PATH_INFO.\nVáš server není nastaven tak, aby tuto informaci poskytoval.\nMožná funguje pomocí CGI a img_auth na něm nemůže fungovat.\nVizte https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "Chybí PATH_INFO.\nVáš server není nastaven tak, aby tuto informaci poskytoval.\nMožná funguje pomocí CGI a img_auth na něm nemůže fungovat.\nVizte https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Požadovaná cesta nespadá pod nakonfigurovaný adresář s načtenými soubory.",
        "img-auth-badtitle": "Z „$1“ nelze vytvořit platný název stránky.",
        "img-auth-nologinnWL": "Nejste přihlášen(a) a „$1“ není na bílé listině.",
        "pageswithprop-prophidden-binary": "hodnota binární vlastnosti skryta ($1)",
        "doubleredirects": "Dvojitá přesměrování",
        "doubleredirectstext": "Na této stránce je seznam přesměrování vedoucích na další přesměrování.\nKaždý řádek obsahuje odkaz na první a druhé přesměrování a k tomu cíl druhého přesměrování, který obvykle ukazuje jméno „skutečné“ cílové stránky, na kterou by mělo první přesměrování odkazovat.\n<del>Přeškrtnuté</del> položky již byly vyřešeny.",
-       "double-redirect-fixed-move": "Stránka [[$1]] byla přesunuta, nyní přesměrovává na [[$2]]",
-       "double-redirect-fixed-maintenance": "Oprava dvojitého přesměrování z [[$1]] na [[$2]].",
+       "double-redirect-fixed-move": "Stránka [[$1]] byla přesunuta.\nByla automaticky aktualizována a nyní přesměrovává na [[$2]].",
+       "double-redirect-fixed-maintenance": "Automatická oprava dvojitého přesměrování z [[$1]] na [[$2]] údržbovým procesem.",
        "double-redirect-fixer": "Opravář přesměrování",
        "brokenredirects": "Přerušená přesměrování",
        "brokenredirectstext": "Tato přesměrování vedou na neexistující stránky:",
        "log-title-wildcard": "Hledat názvy začínající na tento text",
        "showhideselectedlogentries": "Ukázat/skrýt vybrané záznamy",
        "allpages": "Všechny stránky",
-       "alphaindexline": "od $1 do $2",
        "nextpage": "Další stránka ($1)",
        "prevpage": "Předchozí stránka ($1)",
        "allpagesfrom": "Zobrazit stránky počínaje od:",
        "index-category-desc": "Stránka obsahuje kouzelné slovo <code><nowiki>__INDEX__</nowiki></code> (a je ve jmenném prostoru, ve kterém je tento příznak dovolen), takže je indexována roboty, přestože by normálně nebyla.",
        "post-expand-template-inclusion-category-desc": "Po rozbalení všech šablon je stránka větší než <code>$wgMaxArticleSize</code>, takže některé šablony rozbaleny nebyly.",
        "post-expand-template-argument-category-desc": "Po rozbalení argumentu šablony (něco v trojitých závorkách, např. <code>{{{Foo}}})</code> je stránka větší než <code>$wgMaxArticleSize</code>.",
-       "expensive-parserfunction-category-desc": "Na stránce je použito příliš mnoho náročných funkcí parseru (jako <code>#ifexist</code>). Vizte [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "expensive-parserfunction-category-desc": "Na stránce je použito příliš mnoho náročných funkcí syntaktického analyzátoru (jako <code>#ifexist</code>). Vizte [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
        "broken-file-category-desc": "Kategorie přidaná pokud stránka obsahuje nefunkční odkaz na soubor (odkaz pro vložení souboru, který neexistuje).",
        "hidden-category-category-desc": "Toto je kategorie, která obsahuje <code><nowiki>__HIDDENCAT__</nowiki></code>, což způsobuje, že se na stránkách implicitně nezobrazuje v rámečku odkazů na kategorie.",
        "trackingcategories-nodesc": "Popis není k dispozici.",
        "watchnologin": "Nejste přihlášen(a)",
        "addwatch": "Přidat do sledovaných stránek",
        "addedwatchtext": "Stránka „[[:$1]]“ byla přidána mezi stránky, které sledujete.\nVe [[Special:Watchlist|sledovaných stránkách]] se tak budou objevovat budoucí změny této stránky a přidružené diskuse.",
+       "addedwatchtext-short": "Stránka „$1“ byla přidána mezi stránky, které sledujete.",
        "removewatch": "Vyřadit ze sledovaných stránek",
        "removedwatchtext": "Stránka „[[:$1]]“ byla vyřazena z vašeho [[Special:Watchlist|seznamu sledovaných stránek]].",
+       "removedwatchtext-short": "Stránka „$1“ byla vyřazena z vašeho seznamu sledovaných stránek.",
        "watch": "Sledovat",
        "watchthispage": "Sledovat tuto stránku",
        "unwatch": "Nesledovat",
        "watchlist-details": "Na vašem seznamu sledovaných stránek {{PLURAL:$1|je $1 stránka|jsou $1 stránky|je $1 stránek}}, nepočítaje v to diskusní stránky.",
        "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ě'''.",
-       "watchmethod-recent": "hledají se sledované stránky mezi posledními změnami",
-       "watchmethod-list": "hledají se nejnovější editace sledovaných stránek",
-       "watchlistcontains": "Na vašem seznamu sledovaných stránek {{PLURAL:$1|je $1 položka|jsou $1 položky|je $1 položek}}.",
-       "iteminvalidname": "Problém s položkou „$1“, neplatný název…",
        "wlnote2": "Níže jsou změny za {{PLURAL:$1|poslední hodinu|poslední <strong>$1</strong> hodiny|posledních <strong>$1</strong> hodin}} do $3, $2.",
        "wlshowlast": "Ukázat posledních $1 hodin $2 dnů $3",
        "watchlist-options": "Možnosti sledovaných stránek",
        "enotif_lastvisited": "Vizte $1 pro seznam všech změn od minulé návštěvy.",
        "enotif_lastdiff": "Na $1 si tuto změnu můžete prohlédnout.",
        "enotif_anon_editor": "anonymní uživatel $1",
-       "enotif_body": "Vážený uživateli $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nShrnutí editace: $PAGESUMMARY $PAGEMINOREDIT\n\nUživatele, který změnu provedl, můžete kontaktovat:\ne-mailem: $PAGEEDITOR_EMAIL\nna wiki: $PAGEEDITOR_WIKI\n\nDo doby, než stránku navštívíte jako přihlášený uživatel, vám další oznámení k této stránce nebudou zasílána. Případně si můžete vynulovat příznaky ve svém seznamu sledovaných stránek.\n\nS pozdravem váš zasílač hlášení {{grammar:2sg|{{SITENAME}}}}\n\n--\nZměnit nastavení e-mailových oznámení můžete na\n{{canonicalurl:{{#special:Preferences}}}}\n\nNastavení sledovaných stránek může změnit na\n{{canonicalurl:Special:Watchlist/edit}}\n\nStránku můžete ze svých sledovaných vyřadit na\n$UNWATCHURL\n\nRady a kontakt:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Vážený uživateli $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nShrnutí editace: $PAGESUMMARY $PAGEMINOREDIT\n\nUživatele, který změnu provedl, můžete kontaktovat:\ne-mailem: $PAGEEDITOR_EMAIL\nna wiki: $PAGEEDITOR_WIKI\n\nDo doby, než stránku navštívíte jako přihlášený uživatel, vám další oznámení k této stránce nebudou zasílána. Případně si můžete vynulovat příznaky ve svém seznamu sledovaných stránek.\n\nS pozdravem váš zasílač hlášení {{grammar:2sg|{{SITENAME}}}}\n\n--\nZměnit nastavení e-mailových oznámení můžete na\n{{canonicalurl:{{#special:Preferences}}}}\n\nNastavení sledovaných stránek může změnit na\n{{canonicalurl:Special:Watchlist/edit}}\n\nStránku můžete ze svých sledovaných vyřadit na\n$UNWATCHURL\n\nRady a kontakt:\n$HELPPAGE",
        "created": "vytvořil",
        "changed": "upravil",
        "deletepage": "Smazat stránku",
        "rollbacklinkcount-morethan": "vrácení více než $1 {{PLURAL:$1|editace|editací}} zpět",
        "rollbackfailed": "Nešlo vrátit zpět",
        "cantrollback": "Nelze vrátit zpět poslední editaci, neboť poslední přispěvatel je jediným autorem této stránky.",
-       "alreadyrolled": "Nelze vrátit zpět poslední editaci [[:$1]] od uživatele [[User:$2|$2]] ([[User talk:$2|diskuse]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]), protože někdo jiný již stránku editoval nebo vrátil tuto změnu zpět.\n\nPoslední editaci této stránky {{PLURAL:$3|provedl|provedla|provedl uživatel}} [[User:$3|$3]] ([[User talk:$3|diskuse]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
+       "alreadyrolled": "Nelze vrátit zpět poslední editaci [[:$1]] od uživatele [[User:$2|$2]] ([[User talk:$2|diskuse]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]), protože někdo jiný již stránku editoval nebo vrátil tuto změnu zpět.\n\nPoslední editaci této stránky {{GENDER:$3|provedl|provedla|provedl uživatel}} [[User:$3|$3]] ([[User talk:$3|diskuse]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Shrnutí editace bylo: ''„$1“''.",
        "revertpage": "Editace uživatele „[[Special:Contributions/$2|$2]]“ ([[User talk:$2|diskuse]]) vráceny do předchozího stavu, jehož autorem je „[[User:$1|$1]]“",
        "revertpage-nouser": "Editace skrytého uživatele vráceny do předchozího stavu, jehož {{GENDER:$1|autorem|autorkou}} je „[[User:$1|$1]]“",
        "undeletedrevisions-files": "{{PLURAL:$1|Obnovena jedna verze|Obnoveny $1 verze|Obnoveno $1 verzí}} a {{PLURAL:$2|jeden soubor|$2 soubory|$2 souborů}}.",
        "undeletedfiles": "{{PLURAL:$1|Obnoven jeden soubor|Obnoveny $1 soubory|Obnoveno $1 souborů}}",
        "cannotundelete": "Obnovení se nezdařilo:\n$1",
-       "undeletedpage": "'''$1 byla obnovena'''\n\nZáznam o posledních mazáních a obnoveních najdete v [[Special:Log/delete|knize smazaných stránek]].",
+       "undeletedpage": "<strong>Stránka „$1“ byla obnovena</strong>\n\nZáznam o posledních mazáních a obnoveních najdete v [[Special:Log/delete|knize smazaných stránek]].",
        "undelete-header": "Vizte nedávno smazané stránky v [[Special:Log/delete|knize smazaných stránek]].",
        "undelete-search-title": "Hledání smazaných stránek",
        "undelete-search-box": "Hledání smazaných stránek",
        "blockip": "Zablokovat uživatele",
        "blockip-legend": "Zablokovat uživatele",
        "blockiptext": "Tento formulář slouží k zablokování editací z konkrétní IP adresy nebo uživatelského jména.\nToto by mělo být používáno jen v souladu s [[{{MediaWiki:Policy-url}}|pravidly]].\nUdejte přesný důvod níže (například ocitujte, které stránky byly poškozeny).",
-       "ipadressorusername": "IP adresa nebo uživatelské jméno:",
+       "ipaddressorusername": "IP adresa nebo uživatelské jméno:",
        "ipbexpiry": "Čas vypršení:",
        "ipbreason": "Důvod:",
        "ipbreason-dropdown": "*Časté důvody blokování\n** Vkládání klamných informací\n** Odstraňování obsahu stránek\n** Vkládání reklamních externích odkazů\n** Vkládání nesmyslů\n** Zastrašování nebo vyhrožování\n** Zneužívání více účtů\n** Nevhodné uživatelské jméno",
        "ipb-confirmhideuser": "Chystáte se zablokovat uživatele se zapnutou volbou „skrýt uživatelské jméno“. To způsobí, že jméno uživatele zmizí ze všech seznamů a protokolovacích záznamů. Jste si {{gender:|jist|jista|jisti}}, že to chcete udělat?",
        "ipb-confirmaction": "Pokud jste si {{GENDER:|jist|jista|jisti}}, že to chcete udělat, zaškrtněte pole „{{int:ipb-confirm}}“ dole.",
        "ipb-edit-dropdown": "Editace seznamu důvodů zablokování",
-       "ipb-unblock-addr": "Odblokovat uživatele nebo IP $1",
+       "ipb-unblock-addr": "Odblokovat {{GENDER:$1|uživatele|uživatelku|uživatele nebo IP adresu}} $1",
        "ipb-unblock": "Odblokovat uživatele nebo IP adresu",
        "ipb-blocklist": "Zobrazit probíhající bloky",
        "ipb-blocklist-contribs": "Příspěvky uživatele $1",
        "unblockiptext": "Tímto formulářem je možno obnovit právo blokované IP adresy či uživatele opět přispívat do {{grammar:2sg|{{SITENAME}}}}.",
        "ipusubmit": "Odblokovat",
        "unblocked": "{{GENDER:$1|||Uživatel}} [[User:$1|$1]] {{GENDER:$1|byl odblokován|byla odblokována|byl odblokován}}.",
-       "unblocked-range": "$1 bylo odblokováno",
-       "unblocked-id": "Blok $1 byl zrušen",
+       "unblocked-range": "Rozsah $1 byl odblokován.",
+       "unblocked-id": "Blok $1 byl zrušen.",
        "blocklist": "Zablokovaní uživatelé",
        "ipblocklist": "Zablokovaní uživatelé",
        "ipblocklist-legend": "Hledat zablokovaného uživatele",
        "ipblocklist-empty": "Seznam probíhajících bloků je prázdný.",
        "ipblocklist-no-results": "Požadovaná IP adresa nebo uživatelské jméno není blokováno.",
        "blocklink": "zablokovat",
-       "unblocklink": "uvolnit",
+       "unblocklink": "odblokovat",
        "change-blocklink": "změnit blok",
        "contribslink": "příspěvky",
        "emaillink": "poslat e-mail",
-       "autoblocker": "{{GENDER:|Byl jste automaticky zablokován|Byla jste automaticky zablokována|Byli jste automaticky zablokováni}}, protože vaši IP adresu nedávno {{GENDER:$1|používal uživatel|používala uživatelka}} „[[User:$1|$1]]“.\nDůvod zablokování {{GENDER:$1|uživatele $1|uživatelky $1}}: „$2“",
+       "autoblocker": "Automatické zablokování kvůli tomu, že vaši IP adresu nedávno {{GENDER:$1|používal uživatel|používala uživatelka}} „[[User:$1|$1]]“.\nDůvod zablokování {{GENDER:$1|uživatele $1|uživatelky $1}}: „$2“",
        "blocklogpage": "Kniha zablokování",
        "blocklog-showlog": "{{GENDER:$1|Tento uživatel byl dříve blokován.|Tato uživatelka byla dříve blokována.|Tento uživatel byl dříve blokován.}}\nZde je pro přehled zobrazen výpis z knihy zablokování:",
        "blocklog-showsuppresslog": "Tento uživatel byl zablokován a skryt. Zde je pro přehled zobrazen výpis záznamu utajení:",
        "ipb_expiry_temp": "Blokování skrytých uživatelských jmen by měla být trvalá.",
        "ipb_hide_invalid": "Tento účet nelze utajit; má více než $1 {{PLURAL:$1|editaci|editace|editací}}.",
        "ipb_already_blocked": "„$1“ již je zablokován.",
-       "ipb-needreblock": "$1 je již zablokován(a). Chcete změnit nastavení bloku?",
+       "ipb-needreblock": "$1 je již {{GENDER:zablokován|zablokována}}. Chcete změnit nastavení bloku?",
        "ipb-otherblocks-header": "{{PLURAL:$1|Jiné zablokování|Jiná zablokování}}",
        "unblock-hideuser": "Tohoto uživatele nemůžete odblokovat, protože jeho uživatelské jméno bylo skryto.",
        "ipb_cant_unblock": "Chyba: Blokování s ID $1 nebylo nalezeno. Uživatel již možná byl odblokován.",
        "sorbs_create_account_reason": "Vaše IP adresa je uvedena na seznamu DNSBL jako otevřený proxy server. Z této adresy si nemůžete založit účet",
        "xffblockreason": "IP adresa uvedená v hlavičce X-Forwarded-For, ať už vaše, nebo patřící proxy serveru, který používáte, byla zablokována. Zdůvodnění tohoto zablokování: $1",
        "cant-see-hidden-user": "Uživatel, kterého se snažíte blokovat, už byl zablokován a skryt. Jelikož nemáte oprávnění hideuser, nemůžete si nastavení bloku tohoto uživatele prohlédnout ani ho změnit.",
-       "ipbblocked": "Nemůžete blokovat nebo odblokovávat jiné uživatele, {{GENDER:|sám|sama|sám}} jste {{GENDER:|zablokován|zablokována|zablokován}}",
-       "ipbnounblockself": "Nemáte dovoleno odblokovat {{GENDER:|sám|sama|sám}} sebe",
+       "ipbblocked": "Nemůžete blokovat nebo odblokovávat jiné uživatele, {{GENDER:|sám|sama|sám}} jste {{GENDER:|zablokován|zablokována|zablokován}}.",
+       "ipbnounblockself": "Nemáte dovoleno odblokovat {{GENDER:|sám|sama|sám}} sebe.",
        "lockdb": "Zamknout databázi",
        "unlockdb": "Odemknout databázi",
        "lockdbtext": "Pokud zamknete databázi, znemožníte ostatním editovat, upravovat nastavení, sledované stránky apod. Potvrďte, že to opravdu chcete udělat a že odemknete databázi hned po opravách.",
        "lockedbyandtime": "({{gender:$1|zamkl|zamkla|zamkl}} $1 $2 v $3)",
        "move-page": "Přesunout „$1“",
        "move-page-legend": "Přesunout stránku",
-       "movepagetext": "Použitím tohoto formuláře změníte název stránky a přesunete i celou její historii na nový název.\nPůvodní název se stane přesměrováním na nový název.\nPřesměrování na původní název můžete nechat aktualizovat automaticky.\nPokud nenecháte, nezapomeňte poté zkontrolovat [[Special:DoubleRedirects|dvojitá]] nebo [[Special:BrokenRedirects|přerušená]] přesměrování.\nJe na vaší zodpovědnosti zajistit, aby odkazy stále vedly tam, kam mají.\n\nStránku '''není možno''' přejmenovat, pokud pod cílovým názvem již nějaká stránka existuje, s výjimkou situace, kdy je cílová stránka přesměrováním na tuto stránku a nemá žádnou historii editací.\nTo znamená, že stránku můžete přesunout zpět na původní název, pokud uděláte chybu, a že nemůžete přepsat existující stránku.\n\n'''Upozornění!'''\nPřejmenování oblíbené stránky může být drastická a nečekaná změna;\nujistěte se, že chápete důsledky svého kroku před tím, než změnu provedete.",
-       "movepagetext-noredirectfixer": "Použitím tohoto formuláře změníte název stránky a přesunete i celou její historii na nový název.\nPůvodní název se stane přesměrováním na nový název.\nNezapomeňte poté zkontrolovat [[Special:DoubleRedirects|dvojitá]] nebo [[Special:BrokenRedirects|přerušená]] přesměrování.\nJe na vaší zodpovědnosti zajistit, aby odkazy stále vedly tam, kam mají.\n\nStránku '''není možno''' přejmenovat, pokud pod cílovým názvem již nějaká stránka existuje, s výjimkou situace, kdy je cílová stránka prázdná nebo je přesměrováním na tuto stránku a nemá žádnou historii editací.\nTo znamená, že stránku můžete přesunout zpět na původní název, pokud uděláte chybu, a že nemůžete přepsat existující stránku.\n\n'''Upozornění!'''\nPřejmenování oblíbené stránky může být drastická a nečekaná změna; ujistěte se, prosím, že chápete důsledky svého kroku před tím, než změnu provedete.",
-       "movepagetalktext": "Přidružená diskusní stránka, pokud existuje, bude automaticky přesunuta společně se stránkou, '''pokud:'''\n* Dosud neexistuje neprázdná diskusní stránka pod novým jménem a\n* nezrušíte křížek ve formuláři.\n\nV těchto případech musíte přesunout nebo sloučit stránky manuálně, jestliže si to přejete.",
+       "movepagetext": "Použitím tohoto formuláře změníte název stránky a přesunete i celou její historii na nový název.\nPůvodní název se stane přesměrováním na nový název.\nPřesměrování na původní název můžete nechat aktualizovat automaticky.\nPokud nenecháte, nezapomeňte poté zkontrolovat [[Special:DoubleRedirects|dvojitá]] nebo [[Special:BrokenRedirects|přerušená]] přesměrování.\nJe vaší zodpovědností zajistit, aby odkazy stále vedly tam, kam mají.\n\nStránku '''není možno''' přejmenovat, pokud pod cílovým názvem již nějaká stránka existuje, s výjimkou situace, kdy je cílová stránka přesměrováním na tuto stránku a nemá žádnou historii editací.\nTo znamená, že stránku můžete přesunout zpět na původní název, pokud uděláte chybu, a že nemůžete přepsat existující stránku.\n\n'''Upozornění!'''\nPřejmenování oblíbené stránky může být drastická a nečekaná změna;\npředtím, než změnu provedete, se ujistěte, že chápete důsledky svého kroku.",
+       "movepagetext-noredirectfixer": "Použitím tohoto formuláře změníte název stránky a přesunete i celou její historii na nový název.\nPůvodní název se stane přesměrováním na nový název.\nNezapomeňte poté zkontrolovat [[Special:DoubleRedirects|dvojitá]] nebo [[Special:BrokenRedirects|přerušená]] přesměrování.\nJe vaší zodpovědností zajistit, aby odkazy stále vedly tam, kam mají.\n\nStránku '''není možno''' přejmenovat, pokud pod cílovým názvem již nějaká stránka existuje, s výjimkou situace, kdy je cílová stránka prázdná nebo je přesměrováním na tuto stránku a nemá žádnou historii editací.\nTo znamená, že stránku můžete přesunout zpět na původní název, pokud uděláte chybu, a že nemůžete přepsat existující stránku.\n\n'''Upozornění!'''\nPřejmenování oblíbené stránky může být drastická a nečekaná změna; předtím, než změnu provedete, se prosím ujistěte, že chápete důsledky svého kroku.",
+       "movepagetalktext": "Přidružená diskusní stránka, existuje-li, bude automaticky přesunuta společně se stránkou, '''pokud:'''\n* dosud neexistuje neprázdná diskusní stránka pod novým jménem a\n* nezrušíte křížek ve formuláři.\n\nV těchto případech musíte přesunout nebo sloučit stránky manuálně, přejete-li si to.",
        "movearticle": "Přesunout stránku:",
        "moveuserpage-warning": "'''Upozornění:''' Chystáte se přesunout uživatelskou stránku. Uvědomte si prosím, že bude přesunuta pouze tato stránka, ale uživatel ''nebude'' přejmenován.",
+       "movecategorypage-warning": "<strong>Upozornění:</strong> Chystáte se přesunout stránku kategorie. Uvědomte si, že bude přesunuta pouze tato stránka a že žádné stránky v původní kategorii <em>nebudou</em> do nové překategorizovány.",
        "movenologintext": "Pro přesouvání stránek se musíte [[Special:UserLogin|přihlásit]].",
        "movenotallowed": "Nemáte oprávnění k přesunu stránek.",
-       "movenotallowedfile": "Nemáte právo přesouvat soubory",
+       "movenotallowedfile": "Nemáte právo přesouvat soubory.",
        "cant-move-user-page": "Nemáte oprávnění přesouvat uživatelské stránky.",
        "cant-move-to-user-page": "Nemáte oprávnění přesouvat na uživatelskou stránku (pouze na podstránku uživatelské stránky).",
+       "cant-move-category-page": "Nemáte oprávnění přesouvat stránky kategorií.",
+       "cant-move-to-category-page": "Nemáte oprávnění přesunout stránku na stránku kategorie.",
        "newtitle": "Na nový název:",
        "move-watch": "Sledovat tuto stránku",
        "movepagebtn": "Přesunout stránku",
        "export-submit": "Exportovat",
        "export-addcattext": "Přidat stránky z kategorie:",
        "export-addcat": "Přidat",
-       "export-addnstext": "Přidat stránky z jmenného prostoru:",
+       "export-addnstext": "Přidat stránky ze jmenného prostoru:",
        "export-addns": "Přidat",
        "export-download": "Nabídnout uložení jako soubor",
        "export-templates": "Zahrnout šablony",
        "tooltip-ca-history": "Starší verze této stránky.",
        "tooltip-ca-protect": "Zamknout tuto stránku.",
        "tooltip-ca-unprotect": "Změnit zámek této stránky.",
-       "tooltip-ca-delete": "Smazat tuto stránku.",
-       "tooltip-ca-undelete": "Obnovit editace této stránky provedené před jejím smazáním.",
+       "tooltip-ca-delete": "Smazat tuto stránku",
+       "tooltip-ca-undelete": "Obnovit editace této stránky provedené před jejím smazáním",
        "tooltip-ca-move": "Přesunout tuto stránku",
        "tooltip-ca-watch": "Přidat tuto stránku mezi sledované",
        "tooltip-ca-unwatch": "Vyjmout tuto stránku ze sledovaných",
        "tooltip-ca-nstab-user": "Zobrazit uživatelskou stránku",
        "tooltip-ca-nstab-media": "Zobrazit stránku souboru",
        "tooltip-ca-nstab-special": "Toto je speciální stránka, kterou nelze editovat.",
-       "tooltip-ca-nstab-project": "Zobrazit stránku o wiki.",
-       "tooltip-ca-nstab-image": "Zobrazit stránku obrázku.",
-       "tooltip-ca-nstab-mediawiki": "Zobrazit systémovou zprávu.",
-       "tooltip-ca-nstab-template": "Zobrazit šablonu.",
-       "tooltip-ca-nstab-help": "Zobrazit stránku nápovědy.",
-       "tooltip-ca-nstab-category": "Zobrazit kategorii.",
+       "tooltip-ca-nstab-project": "Zobrazit stránku o wiki",
+       "tooltip-ca-nstab-image": "Zobrazit stránku obrázku",
+       "tooltip-ca-nstab-mediawiki": "Zobrazit systémovou zprávu",
+       "tooltip-ca-nstab-template": "Zobrazit šablonu",
+       "tooltip-ca-nstab-help": "Zobrazit stránku nápovědy",
+       "tooltip-ca-nstab-category": "Zobrazit kategorii",
        "tooltip-minoredit": "Označit změnu jako malou editaci",
        "tooltip-save": "Uložit vaše změny",
        "tooltip-preview": "Zobrazit náhled vašich změn; prosíme, zobrazte si ho před uložením!",
        "tooltip-summary": "Zadejte stručné shrnutí",
        "interlanguage-link-title": "$1 – $2",
        "common.css": "/* Zde uvedené CSS bude ovlivňovat všechny styly */",
-       "cologneblue.css": "/* Zde uvedené CSS bude ovlivňovat pouze styl „Kolínská modř“  */",
        "monobook.css": "/* Zde uvedené CSS bude ovlivňovat pouze styl „Monobook“ */",
-       "modern.css": "/* Zde uvedené CSS bude ovlivňovat pouze styl „Moderní“ */",
        "vector.css": "/* Zde uvedené CSS bude ovlivňovat pouze styl „Vektor“ */",
        "print.css": "/* Zde uvedené CSS bude ovlivňovat tiskový výstup */",
        "noscript.css": "/* Zde uvedené CSS bude ovlivňovat uživatele s vypnutým JavaScriptem */",
        "group-sysop.css": "/* Zde uvedené CSS bude ovlivňovat pouze správce */",
        "group-bureaucrat.css": "/* Zde uvedené CSS bude ovlivňovat pouze byrokraty */",
        "common.js": "/* Zde uvedený JavaScript bude použit pro všechny uživatele při načtení každé stránky. */",
-       "cologneblue.js": "/* JavaScript pro uživatele používající vzhled „Kolínská modř“  */",
        "monobook.js": "/* JavaScript pro uživatele používající vzhled MonoBook */",
-       "modern.js": "/* JavaScript pro uživatele používající vzhled „Moderní“ */",
        "vector.js": "/* JavaScript pro uživatele používající vzhled „Vektor“ */",
        "group-autoconfirmed.js": "/* Zde uvedený JavaScript bude použit pouze pro automaticky schválené uživatele */",
        "group-user.js": "/* Zde uvedený JavaScript bude použit pouze pro registrované uživatele */",
        "group-bot.js": "/* Zde uvedený JavaScript bude použit pouze pro boty */",
        "group-sysop.js": "/* Zde uvedený JavaScript bude použit pouze pro správce */",
        "group-bureaucrat.js": "/* Zde uvedený JavaScript bude použit pouze pro byrokraty */",
-       "notacceptable": "Tento wiki server není schopen poskytnout data ve formátu, který by váš klient byl schopen přečíst.",
        "anonymous": "anonymní {{PLURAL:$1|uživatel|uživatelé|uživatelé}} {{GRAMMAR:2sg|{{SITENAME}}}}",
        "siteuser": "uživatel {{grammar:2sg|{{SITENAME}}}} $1",
        "anonuser": "anonymní uživatel {{grammar:2sg|{{SITENAME}}}} $1",
        "pageinfo-category-pages": "Počet stránek",
        "pageinfo-category-subcats": "Počet podkategorií",
        "pageinfo-category-files": "Počet souborů",
-       "skinname-cologneblue": "Kolínská modř",
-       "skinname-modern": "Moderní",
        "skinname-vector": "Vektor",
        "markaspatrolleddiff": "Označit jako prověřené",
        "markaspatrolledtext": "Označit tuto stránku jako prověřenou",
        "newimages-summary": "Na této speciální stránce se zobrazují poslední načtené soubory.",
        "newimages-legend": "Filtr",
        "newimages-label": "Název souboru (nebo jeho část):",
-       "showhidebots": "($1 roboty)",
+       "newimages-showbots": "Zobrazit soubory načtené boty",
        "noimages": "Není co zobrazit.",
        "ilsubmit": "Hledat",
        "bydate": "podle data",
        "metadata-help": "Tento soubor obsahuje dodatečné informace, poskytnuté zřejmě digitálním fotoaparátem nebo scannerem, kterým byl pořízen. Pokud byl soubor od té doby změněn, některé údaje mohou být neplatné.",
        "metadata-expand": "Zobrazit podrobnosti",
        "metadata-collapse": "Skrýt podrobnosti",
-       "metadata-fields": "Položky metadat obrázků uvedené v této zprávě budou na stránce s popisem vypsána vždy. Pro zobrazení ostatních bude třeba kliknout na „zobrazit podrobnosti“.\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": "Položky metadat obrázků uvedené v této zprávě budou na stránce s popisem vypsány vždy. Pro zobrazení ostatních bude třeba kliknout na „zobrazit podrobnosti“.\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": "Šířka",
        "exif-imagelength": "Výška",
        "exif-bitspersample": "Bitů na složku",
        "exif-saturation": "Sytost",
        "exif-sharpness": "Ostrost",
        "exif-devicesettingdescription": "Popis nastavení zařízení",
-       "exif-subjectdistancerange": "Vzdálenost k předmětu",
+       "exif-subjectdistancerange": "Vzdálenost od předmětu",
        "exif-imageuniqueid": "Unikátní ID obrázku",
        "exif-gpsversionid": "Verze GPS tagu",
        "exif-gpslatituderef": "Severní/jižní zeměpisná šířka",
        "exif-gpsdestlongitude": "Zeměpisná délka předmětu",
        "exif-gpsdestbearingref": "Reference pro směr k předmětu",
        "exif-gpsdestbearing": "Směr k předmětu",
-       "exif-gpsdestdistanceref": "Jednotka vzdálenosti k předmětu",
-       "exif-gpsdestdistance": "Vzdálenost k předmětu",
+       "exif-gpsdestdistanceref": "Jednotka vzdálenosti od předmětu",
+       "exif-gpsdestdistance": "Vzdálenost od předmětu",
        "exif-gpsprocessingmethod": "Označení metody zpracování GPS dat",
        "exif-gpsareainformation": "Označení GPS oblasti",
        "exif-gpsdatestamp": "Datum podle GPS",
        "exif-originalimageheight": "Výška obrázku před oříznutím",
        "exif-originalimagewidth": "Šířka obrázku před oříznutím",
        "exif-compression-1": "Nekomprimovaný",
-       "exif-compression-2": "1-rozměrné modifikované Huffmanovo kódování délky běhu CCITT Group 3",
+       "exif-compression-2": "1rozměrné modifikované Huffmanovo kódování délky běhu CCITT Group 3",
        "exif-compression-3": "Kódování faxů CCITT Group 3",
        "exif-compression-4": "Kódování faxů CCITT Group 4",
        "exif-compression-6": "JPEG (starý)",
        "confirmemail": "Potvrzení e-mailové adresy",
        "confirmemail_noemail": "Ve svém [[Special:Preferences|uživatelském nastavení]] jste nezadali platnou e-mailovou adresu.",
        "confirmemail_text": "Tato wiki vyžaduje, abyste před využíváním některých funkcí potvrdili svoji e-mailovou adresu. Kliknutím na tlačítko níže odešlete potvrzovací e-mail na vámi uvedenou adresu. Tento e-mail obsahuje odkaz a potvrzovací kód; zobrazením odkazované stránky ve svém internetovém prohlížeči potvrdíte, že zadaná adresa je platná.",
-       "confirmemail_pending": "Potvrzovací kód vám byl již zaslán na váš e-mail.\nPokud jste si účet založili před chvílí, zkuste na doručení kódu několik minut počkat, než požádáte o nový.",
+       "confirmemail_pending": "Potvrzovací kód vám byl na váš e-mail již zaslán.\nPokud jste si účet založili před chvílí, zkuste na doručení kódu několik minut počkat, než požádáte o nový.",
        "confirmemail_send": "Odeslat potvrzovací kód",
        "confirmemail_sent": "Potvrzovací e-mail byl odeslán",
        "confirmemail_oncreate": "Na vaši e-mailovou adresu byl zaslán potvrzovací kód.\nTento kód není zapotřebí k přihlášení, ale budete ho potřebovat k aktivaci některých funkcí založených na využití e-mailu.",
        "autoredircomment": "Přesměrování na [[$1]]",
        "autosumm-new": "Založena nová stránka s textem „$1“",
        "size-kilobytes": "$1 KB",
-       "livepreview-loading": "Nahrávám…",
-       "livepreview-ready": "Nahrávám… Připraven!",
-       "livepreview-failed": "Rychlý náhled není dostupný! Použijte normální náhled.",
-       "livepreview-error": "Neúspěšné spojení: $1 \"$2\". Použijte normální náhled.",
        "lag-warn-normal": "Změny za {{PLURAL:$1|poslední sekundu|poslední $1 sekundy|posledních $1 sekund}} nemusí být v tomto seznamu zobrazeny.",
        "lag-warn-high": "Protože je databázový server právě mimořádně vytížen, nemusí být změny za {{PLURAL:$1|poslední sekundu|poslední $1 sekundy|posledních $1 sekund}} v tomto seznamu zobrazeny.",
-       "watchlistedit-numitems": "Váš seznam sledovaných stránek obsahuje (mimo diskusních stránek) {{PLURAL:$1|1 položku|$1 položky|$1 položek}}.",
-       "watchlistedit-noitems": "Váš seznam sledovaných stránek neobsahuje žádnou položku.",
        "watchlistedit-normal-title": "Editace seznamu sledovaných stránek",
        "watchlistedit-normal-legend": "Odstranění položek ze seznamu sledovaných stránek",
        "watchlistedit-normal-explain": "Položky vašeho seznamu sledovaných stránek jsou zobrazeny níže.\nStránku můžete ze seznamu odstranit tak, že zaškrtnete její políčko a kliknete na tlačítko „{{int:Watchlistedit-normal-submit}}“.\nTaké můžete [[Special:EditWatchlist/raw|editovat seznam v textové podobě]].",
        "watchlistedit-normal-submit": "Odstranit položky",
-       "watchlistedit-normal-done": "{{PLURAL:$1|Byla odstraněna 1 položka|Byly odstraněny $1 položky|Bylo odstraněno $1 položek}} z Vašeho seznamu sledovaných stránek:",
+       "watchlistedit-normal-done": "{{PLURAL:$1|Byla odstraněna jedna položka|Byly odstraněny $1 položky|Bylo odstraněno $1 položek}} z Vašeho seznamu sledovaných stránek:",
        "watchlistedit-raw-title": "Textový režim editace seznamu",
        "watchlistedit-raw-legend": "Editace textového souboru sledovaných stránek",
        "watchlistedit-raw-explain": "Položky na vašem seznamu sledovaných stránek jsou zobrazeny níže. Můžete je přidávat, odstraňovat či měnit v zobrazeném seznamu – jedna řádka je jedna položka.\nPro uložení změn stiskněte tlačítko „{{int:Watchlistedit-raw-submit}}“.\nSeznam editovaných stránek můžete také [[Special:EditWatchlist|editovat ve standardním editoru]].",
        "watchlistedit-raw-titles": "Položky:",
        "watchlistedit-raw-submit": "Aktualizovat seznam",
        "watchlistedit-raw-done": "Seznam vašich sledovaných stránek byl aktualizován.",
-       "watchlistedit-raw-added": "{{PLURAL:$1|Byla přidána 1 položka|Byly přidány $1 položky|Bylo přidáno $1 položek}}:",
+       "watchlistedit-raw-added": "{{PLURAL:$1|Byla přidána jedna položka|Byly přidány $1 položky|Bylo přidáno $1 položek}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Byla odstraněna položka|Byly odstraněny $1 položky|Bylo odstraněno $1 položek}}:",
+       "watchlistedit-clear-title": "Vyprázdnění seznamu sledovaných stránek",
+       "watchlistedit-clear-legend": "Vyprázdnit seznam sledovaných stránek",
+       "watchlistedit-clear-explain": "Z vašeho seznamu sledovaných stránek budou odstraněny všechny názvy",
+       "watchlistedit-clear-titles": "Názvy:",
+       "watchlistedit-clear-submit": "Vyprázdnit seznam sledovaných stránek (natrvalo!)",
+       "watchlistedit-clear-done": "Váš seznam sledovaných stránek byl vyprázdněn.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|Byl odstraněn jeden název|Byly odstraněny $1 názvy|Bylo odstraněno $1 názvů}}:",
+       "watchlistedit-too-many": "Seznam obsahuje příliš mnoho stránek, než aby se zde daly zobrazit.",
+       "watchlisttools-clear": "Vyprázdnit seznam sledovaných stránek",
        "watchlisttools-view": "Zobrazit změny sledovaných stránek",
        "watchlisttools-edit": "Zobrazit a editovat seznam sledovaných stránek",
        "watchlisttools-raw": "Editovat textový soubor sledovaných stránek",
        "version": "Verze",
        "version-extensions": "Nainstalovaná rozšíření",
        "version-specialpages": "Speciální stránky",
-       "version-parserhooks": "Přípojné body parseru",
+       "version-parserhooks": "Přípojné body syntaktického analyzátoru",
        "version-variables": "Proměnné",
        "version-antispam": "Ochrana proti spamu",
        "version-skins": "Vzhledy",
        "version-poweredby-others": "další",
        "version-poweredby-translators": "překladatelé na translatewiki.net",
        "version-credits-summary": "Následujícím lidem bychom rádi poděkovali za jejich příspěvky [[Special:Version|MediaWiki]].",
-       "version-license-info": "MediaWiki je svobodný software; můžete jej šířit nebo modifikovat podle podmínek GNU General Public License, vydávané Free Software Foundation; buď verze 2 této licence anebo (podle vašeho uvážení) kterékoli pozdější verze.\n\nMediaWiki je distribuována v naději, že bude užitečná, avšak BEZ JAKÉKOLI ZÁRUKY; neposkytují se ani odvozené záruky PRODEJNOSTI anebo VHODNOSTI PRO URČITÝ ÚČEL. Podrobnosti se dočtete v textu GNU General Public License.\n\n[{{SERVER}}{{SCRIPTPATH}}/COPYING Kopii GNU General Public License] jste měli obdržet spolu s tímto programem, pokud ne, napište na Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA nebo [//www.gnu.org/licenses/old-licenses/gpl-2.0.html si ji přečtěte online].",
+       "version-license-info": "MediaWiki je svobodný software; můžete jej šířit nebo modifikovat podle podmínek GNU General Public License, vydávané Free Software Foundation; buď verze 2 této licence, anebo (podle vašeho uvážení) kterékoli pozdější verze.\n\nMediaWiki je distribuována v naději, že bude užitečná, avšak BEZ JAKÉKOLI ZÁRUKY; neposkytují se ani odvozené záruky PRODEJNOSTI anebo VHODNOSTI PRO URČITÝ ÚČEL. Podrobnosti se dočtete v textu GNU General Public License.\n\n[{{SERVER}}{{SCRIPTPATH}}/COPYING Kopii GNU General Public License] jste měli obdržet spolu s tímto programem, pokud ne, napište na Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA nebo [//www.gnu.org/licenses/old-licenses/gpl-2.0.html si ji přečtěte online].",
        "version-software": "Nainstalovaný software",
        "version-software-product": "Název",
        "version-software-version": "Verze",
        "compare-invalid-title": "Zadaný název je neplatný.",
        "compare-title-not-exists": "Zadaný název neexistuje.",
        "compare-revision-not-exists": "Zadaná revize neexistuje.",
-       "dberr-header": "Tato wiki má nějaké potíže",
        "dberr-problems": "Promiňte! Tento server má v tuto chvíli technické problémy.",
        "dberr-again": "Zkuste několik minut počkat a poté znovu načíst stránku.",
        "dberr-info": "(Nelze navázat spojení s databázovým serverem: $1)",
        "dberr-usegoogle": "Mezitím můžete zkusit hledat pomocí Google.",
        "dberr-outofdate": "Uvědomte si, že jejich vyhledávací index našeho obsahu může být zastaralý.",
        "dberr-cachederror": "Následující stránka je kopie z cache a nemusí být aktuální.",
-       "htmlform-invalid-input": "Některé vámi zadané údaje jsou chybné",
+       "htmlform-invalid-input": "Některé vámi zadané údaje jsou chybné.",
        "htmlform-select-badoption": "Vámi uvedená hodnota není platná možnost.",
        "htmlform-int-invalid": "Uvedená hodnota není celé číslo.",
        "htmlform-float-invalid": "Uvedená hodnota není číslo.",
-       "htmlform-int-toolow": "Vámi zadaná hodnota je menší než dovolené minimum $1",
-       "htmlform-int-toohigh": "Vámi zadaná hodnota je větší než dovolené maximum $1",
-       "htmlform-required": "Tato položka je povinná",
+       "htmlform-int-toolow": "Vámi zadaná hodnota je menší než dovolené minimum $1.",
+       "htmlform-int-toohigh": "Vámi zadaná hodnota je větší než dovolené maximum $1.",
+       "htmlform-required": "Tato položka je povinná.",
        "htmlform-submit": "Odeslat",
        "htmlform-reset": "Vrátit změny",
        "htmlform-selectorother-other": "Jiná hodnota",
        "htmlform-no": "Ne",
        "htmlform-yes": "Ano",
        "htmlform-chosen-placeholder": "Zvolte možnost",
+       "htmlform-cloner-create": "Přidat další",
+       "htmlform-cloner-delete": "Odstranit",
+       "htmlform-cloner-required": "Je povinná nejméně jedna hodnota.",
        "sqlite-has-fts": "$1 s podporou plnotextového vyhledávání",
        "sqlite-no-fts": "$1 bez podpory plnotextového vyhledávání",
        "logentry-delete-delete": "$1 {{GENDER:$2|smazal|smazala}} stránku $3",
        "logentry-delete-restore": "$1 {{GENDER:$2|obnovil|obnovila}} stránku $3",
        "logentry-delete-event": "$1 {{GENDER:$2|změnil|změnila}} viditelnost {{PLURAL:$5|protokolovacího záznamu|$5 protokolovacích záznamů}} ke stránce $3: $4",
-       "logentry-delete-revision": "$1 {{GENDER:$2|změnil|změnila}} viditelnost {{PLURAL:$5|revize|$5 revizí}} na stránce $3: $4",
+       "logentry-delete-revision": "$1 {{GENDER:$2|změnil|změnila}} viditelnost {{PLURAL:$5|revize|$5 revizí}} stránky $3: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|změnil|změnila}} viditelnost protokolovacích záznamů ke stránce $3",
-       "logentry-delete-revision-legacy": "$1 {{GENDER:$2|změnil|změnila}} viditelnost revizí na stránce $3",
+       "logentry-delete-revision-legacy": "$1 {{GENDER:$2|změnil|změnila}} viditelnost revizí stránky $3",
        "logentry-suppress-delete": "$1 {{GENDER:$2|utajil|utajila}} stránku $3",
        "logentry-suppress-event": "$1 utajeně {{GENDER:$2|změnil|změnila}} viditelnost {{PLURAL:$5|protokolovacího záznamu|$5 protokolovacích záznamů}} ke stránce $3: $4",
-       "logentry-suppress-revision": "$1 utajeně {{GENDER:$2|změnil|změnila}} viditelnost {{PLURAL:$5|revize|$5 revizí}} na stránce $3: $4",
+       "logentry-suppress-revision": "$1 utajeně {{GENDER:$2|změnil|změnila}} viditelnost {{PLURAL:$5|revize|$5 revizí}} stránky $3: $4",
        "logentry-suppress-event-legacy": "$1 utajeně {{GENDER:$2|změnil|změnila}} viditelnost protokolovacích záznamů ke stránce $3",
-       "logentry-suppress-revision-legacy": "$1 utajeně {{GENDER:$2|změnil|změnila}} viditelnost revizí na stránce $3",
+       "logentry-suppress-revision-legacy": "$1 utajeně {{GENDER:$2|změnil|změnila}} viditelnost revizí stránky $3",
        "revdelete-content-hid": "skryt obsah",
        "revdelete-summary-hid": "skryto shrnutí editace",
        "revdelete-uname-hid": "skryto uživatelské jméno",
        "feedback-error1": "Chyba: Nerozpoznaný výsledek z API",
        "feedback-error2": "Chyba: Editace se nezdařila",
        "feedback-error3": "Chyba: API nevrátilo žádnou odpověď",
-       "feedback-thanks": "Děkujeme! Váš komentář byl přidat na stránku „[$2 $1]“.",
+       "feedback-thanks": "Děkujeme! Váš komentář byl přidán na stránku „[$2 $1]“.",
        "feedback-close": "Hotovo",
        "feedback-bugcheck": "Skvělé! Jen zkontrolujte, zda se nejedná o jednu z [$1 už známých chyb].",
        "feedback-bugnew": "Zkontroloval(a) jsem to. Chci ohlásit novou chybu.",
        "api-error-badaccess-groups": "Nemáte povoleno nahrávat soubory na tuto wiki.",
        "api-error-badtoken": "Vnitřní chyba: špatný token.",
        "api-error-copyuploaddisabled": "Načítání z URL je na tomto severu zakázáno.",
-       "api-error-duplicate": "Na této wiki již {{PLURAL:$1|existuje [$2 jiný soubor]|existují [$2 jiné soubory]}} se shodným obsahem",
+       "api-error-duplicate": "Na této wiki již {{PLURAL:$1|existuje [$2 jiný soubor]|existují [$2 jiné soubory]}} se shodným obsahem.",
        "api-error-duplicate-archive": "[$2 {{PLURAL:$1|Soubor|Soubory}}] se stejným obsahem již zde dříve {{PLURAL:$1|byl|byly}}, ale {{PLURAL:$1|byl smazán|byly smazány}}.",
-       "api-error-duplicate-archive-popup-title": "Duplicitní {{PLURAL:$1|soubor, který byl|soubory, které byly}} smazány",
-       "api-error-duplicate-popup-title": "Duplicitní {{PLURAL:$1|soubor|soubory}}",
+       "api-error-duplicate-archive-popup-title": "Duplicitní {{PLURAL:$1|soubor, který byl smazán|soubory, které byly smazány}}.",
+       "api-error-duplicate-popup-title": "Duplicitní {{PLURAL:$1|soubor|soubory}}.",
        "api-error-empty-file": "Načtený soubor je prázdný.",
        "api-error-emptypage": "Zakládání prázdných stránek není dovoleno.",
        "api-error-fetchfileerror": "Vnitřní chyba: došlo k chybě při stahování souboru.",
        "api-error-publishfailed": "Vnitřní chyba: Serveru se nepodařilo zveřejnit dočasný soubor.",
        "api-error-stasherror": "Při načítání souboru do skrýše došlo k chybě.",
        "api-error-timeout": "Server neodpověděl v očekávaném čase.",
-       "api-error-unclassified": "Došlo k neznámé chybě",
-       "api-error-unknown-code": "Neznámá chyba: „$1“",
+       "api-error-unclassified": "Došlo k neznámé chybě.",
+       "api-error-unknown-code": "Neznámá chyba: „$1“.",
        "api-error-unknown-error": "Vnitřní chyba: došlo k chybě při pokusu o načtení souboru.",
        "api-error-unknown-warning": "Neznámé varování: $1",
        "api-error-unknownerror": "Neznámá chyba: „$1“.",
        "duration-centuries": "$1 {{PLURAL:$1|století}}",
        "duration-millennia": "$1 {{PLURAL:$1|tisíciletí}}",
        "rotate-comment": "Obrázek otočen o $1 {{PLURAL:$1|stupeň|stupně|stupňů}} po směru hodinových ručiček",
-       "limitreport-title": "Data profilování parseru:",
+       "limitreport-title": "Data profilování syntaktického analyzátoru:",
        "limitreport-cputime": "Využití času procesoru",
        "limitreport-cputime-value": "$1 {{PLURAL:$1|sekunda|sekundy|sekund}}",
        "limitreport-walltime": "Využití reálného času",
        "limitreport-templateargumentsize": "Velikost argumentů šablon",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|bajt|bajty|bajtů}}",
        "limitreport-expansiondepth": "Největší hloubka expanze",
-       "limitreport-expensivefunctioncount": "Počet náročných funkcí parseru",
+       "limitreport-expensivefunctioncount": "Počet náročných funkcí syntaktického analyzátoru",
        "expandtemplates": "Substituce šablon",
-       "expand_templates_intro": "Tato speciální stránka vezme text a rekurzivně rozbalí všechny použité šablony.\nTaké rozbalí podporované funkce parseru jako\n<code><nowiki>{{</nowiki>#language:…}}</code> a proměnné jako\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nV podstatě rozbalí prakticky všechno v dvojitých složených závorkách.",
+       "expand_templates_intro": "Tato speciální stránka zpracuje text a rekurzivně rozbalí všechny použité šablony.\nTaké rozbalí podporované funkce syntaktického analyzátoru jako\n<code><nowiki>{{</nowiki>#language:…}}</code> a proměnné jako\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nV podstatě rozbalí téměř všechno v dvojitých složených závorkách.",
        "expand_templates_title": "Název stránky kvůli kontextu pro {{FULLPAGENAME}} apod.:",
        "expand_templates_input": "Vstupní text:",
        "expand_templates_output": "Výstup",
index 2285676..5064dfc 100644 (file)
@@ -7,7 +7,8 @@
                        "Leinad",
                        "MinuteElectron",
                        "Warszk",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Pòdsztrëchiwùjë lënczi:",
@@ -20,7 +21,6 @@
        "tog-showtoolbar": "Wëskrzrni listwã nôrzãdzów edicëji (nót je JavaScript)",
        "tog-editondblclick": "Editëjë starnë przez dëbeltné klëkniãcé (nót je JavaScript)",
        "tog-editsectiononrightclick": "Włączë edicëjã sekcëji bez klëkniãcé prawą knąpą mëszë<br />na titlu sekcëji (JavaScript)",
-       "tog-rememberpassword": "Spamiãtôj mòją parolã na tim kòmpùtrze (maksymalno przez $1 {{PLURAL:$1|dzéń|dni|dniów}})",
        "tog-watchcreations": "Dodôwôj starnë, chtërné ùsôdzã, do mòji lëstë ùzérónëch artiklów",
        "tog-watchdefault": "Dodôwôj starnë, chtërné editëjã do mòji lëstë ùzérónëch artiklów",
        "tog-watchmoves": "Dodôwôj starnë jaczé przenoszã do mòji lëstë ùzérónëch artiklów",
        "savearticle": "Zapiszë artikel",
        "preview": "Pòdzérk",
        "showpreview": "Wëskrzëni pòdzérk",
-       "showlivepreview": "Pòdzérk",
        "showdiff": "Wëskrzëni zmianë",
        "anoneditwarning": "'''Bôczë:''' Të nie je wlogòwóny. Twòjô adresa IP mdze zapisónô w historëji edicëji ti starnë.",
        "summary-preview": "Pòdzérk òpisënka:",
        "searchall": "wszëtczé",
        "powersearch-legend": "Awansowónô szëkba",
        "powersearch-ns": "Szëkba w rumach mionów:",
-       "powersearch-redir": "Lësta przeczerowaniów",
        "preferences": "Preferencëje",
        "mypreferences": "Mòje nastôwë",
        "prefs-edits": "Lëczba edicëjów:",
        "recentchanges-feed-description": "Pòdstrzegô slédny zmianë w tim pòwrózkù.",
        "recentchanges-label-minor": "To je drobnô edicëjô",
        "rcnotefrom": "Niżi są zmianë òd '''$2''' (pòkazóné do '''$1''').",
-       "rclistfrom": "Pòkażë nowé zmianë òd $1",
+       "rclistfrom": "Pòkażë nowé zmianë òd $3 $2",
        "rcshowhideminor": "$1 môłé zmianë",
        "rcshowhidebots": "$1 botë",
        "rcshowhideliu": "$1 zalogòwónëch brëkòwników",
        "notanarticle": "To nie je artikel",
        "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'''",
-       "watchmethod-list": "szëkba ùzérónëch artiklów westrzód pòslédnëch edicëjów",
-       "watchlistcontains": "Na twòji lësce ùzérónëch artiklów {{PLURAL:$1|je 1 strana|są $1 starnë|je $1 starnów}}.",
        "wlshowlast": "Wëskrzëni zjinaczi z $1 gòdzënów $2 dni $3",
        "watchlist-options": "Òptacëje ùzérónych",
        "watching": "Ùzéróm...",
index 7ae4493..b932619 100644 (file)
@@ -7,7 +7,8 @@
                        "PCode",
                        "Salam",
                        "Александр Сигачёв",
-                       "Блокнот"
+                       "Блокнот",
+                       "아라"
                ]
        },
        "tog-underline": "Ссылкăсене аялтан туртса палармалла:",
@@ -18,7 +19,6 @@
        "tog-showtoolbar": "Тӳрлетнĕ чухне çӳлти хатĕрсен хăмине кăтартмалла (JavaScript)",
        "tog-editondblclick": "Иккĕ пуссан статьяна тӳрлетмелле (JavaScript)",
        "tog-editsectiononrightclick": "Шăшин сылтăм пускăчне пуссан статья пайне тӳрлетмелле (JavaScript)",
-       "tog-rememberpassword": "Мана ку компьютер çинче астуса хăвармалла (for a maximum of $1 {{PLURAL:$1|1=day|days}})",
        "tog-watchcreations": "Эпĕ тунă страницăсене сăнав списокне кĕртмелле",
        "tog-watchdefault": "Тӳрлетнĕ страницăсене сăнав списокне кĕртмелле",
        "tog-watchmoves": "Страница ятне эпĕ улаштарсан вĕсене сăнав списокне кĕртмелле",
        "filedeleteerror": "«$1» файла кăларса парахма май çук.",
        "directorycreateerror": "«$1» директорине тума май çук.",
        "filenotfound": "«$1» файла тупма май çук.",
-       "fileexistserror": "«$1» файла çырма май çук: ку ятлă файл пур.",
        "unexpected": "Тĕрĕс мар пĕлтерĕш: «$1»=«$2».",
        "formerror": "Йăнăш: формăри даннăйсене леçме май çук",
        "badarticleerror": "Çак страницăра эсир ку ĕçĕ тăваймастăр.",
        "savearticle": "Страницăна çырса хур",
        "preview": "Епле курăнĕ",
        "showpreview": "Малтанлăхи курăну",
-       "showlivepreview": "Епле курăнассине хăвăрт пахасси",
        "showdiff": "Кĕртнĕ улшăнусем",
        "anoneditwarning": "'''Асăрхăр''': Эсир сайта хăвăр çинчен пĕлтермен, çавăнпа та ку страницăна улăштарнин журналне сирĕн IP-адреса çырса хума тивĕ.",
        "missingcommenttext": "Аяларах, тархасшăн, хăвар пĕлтерĕве çырăр.",
        "recentchanges-legend": "Çĕнĕ улшăнусен ĕнерлевĕ",
        "recentchanges-label-bot": "Ку улшăнăва бот тунă",
        "recentchanges-legend-newpage": "$1 — çĕнĕ страница",
-       "rclistfrom": "Юлашки улшăнусене $1 вăхăтран пуçласа кăтартнă",
+       "rclistfrom": "Юлашки улшăнусене $3 $2 вăхăтран пуçласа кăтартнă",
        "rcshowhideminor": "пĕчĕк тӳрлетӳсене $1",
        "rcshowhidebots": "ботсене $1",
        "rcshowhideliu": "сайта кĕнĕскерсене $1",
        "autosumm-replace": "Страницăн ăшлăхне «$1» çине улăштарнă",
        "autoredircomment": "[[$1]] çине куçарни",
        "autosumm-new": "Çĕнни: $1",
-       "livepreview-loading": "Тултаратпăр…",
-       "livepreview-ready": "Тултаратпăр… Пулчĕ!",
-       "watchlistedit-noitems": "Сирĕн сăнав списокĕ пушă.",
        "watchlisttools-view": "Ку тӳрлетӳпе çыхăннăскерсем",
        "version": "MediaWiki версийĕ",
        "fileduplicatesearch": "Пĕр пек файлсен шыравĕ",
index a6664d5..9094b9c 100644 (file)
@@ -11,7 +11,8 @@
                        "Thaf",
                        "Urhixidur",
                        "Xxglennxx",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Tanlinellu cysylltiadau:",
@@ -24,7 +25,6 @@
        "tog-showtoolbar": "Dangos y bar offer golygu",
        "tog-editondblclick": "Golygu tudalennau wrth glicio ddwywaith",
        "tog-editsectiononrightclick": "Galluogi golygu adran drwy dde-glicio ar bennawd yr adran",
-       "tog-rememberpassword": "Y porwr hwn i gofio'r manylion mewngofnodi (hyd at $1 {{PLURAL:$1||diwrnod|ddiwrnod|diwrnod|diwrnod|diwrnod}})",
        "tog-watchcreations": "Ychwanegu tudalennau at fy rhestr wylio wrth i mi eu creu a ffeiliau wrth i mi eu huwchlwytho.",
        "tog-watchdefault": "Ychwanegu tudalennau a ffeiliau at fy rhestr wylio wrth i mi eu golygu",
        "tog-watchmoves": "Ychwanegu tudalennau a ffeiliau at fy rhestr wylio wrth i mi eu symud",
        "permalink": "Dolen barhaol",
        "print": "Argraffu",
        "view": "Darllen",
+       "view-foreign": "Gweld ar $1",
        "edit": "Golygu",
+       "edit-local": "Golygu'r disgrifiad ar y wici hwn",
        "create": "Dechrau",
+       "create-local": "Ychwanegu disgrifiad ar y wici hwn",
        "editthispage": "Golygwch y dudalen hon",
        "create-this-page": "Creu'r dudalen",
        "delete": "Dileu",
        "readonly_lag": "Mae'r databas wedi'i gloi'n awtomatig tra bod y gwas-weinyddion yn asio gyda'r prif weinydd",
        "internalerror": "Gwall mewnol",
        "internalerror_info": "Gwall mewnol: $1",
-       "fileappenderrorread": "Wedi methu darllen \"$1\" yn ystod yr atodi.",
-       "fileappenderror": "Ni ellid atodi \"$1\" wrth \"$2\".",
        "filecopyerror": "Wedi methu copïo'r ffeil \"$1\" i \"$2\".",
        "filerenameerror": "Wedi methu ail-enwi'r ffeil '$1' yn '$2'.",
        "filedeleteerror": "Wedi methu dileu'r ffeil \"$1\".",
        "directorycreateerror": "Wedi methu creu'r cyfeiriadur \"$1\".",
        "filenotfound": "Heb gael hyd i'r ffeil '$1'.",
-       "fileexistserror": "Nid oes modd ysgrifennu i'r ffeil \"$1\": ffeil eisoes ar glawr",
        "unexpected": "Gwerth annisgwyl: \"$1\"=\"$2\".",
        "formerror": "Gwall: Wedi methu danfon y ffurflen",
        "badarticleerror": "Mae'n amhosib cyflawni'r weithred hon ar y dudalen hon.",
        "userlogin-helplink2": "Cymorth wrth fewngofnodi",
        "userlogin-loggedin": "Rydych eisoes wedi mewngofnodi wrth yr enw {{GENDER:$1|$1}}.\nDefnyddiwch y ffurflen isod i fewngofnodi wrth rhyw enw arall.",
        "userlogin-createanother": "Creu cyfrif ychwanegol",
-       "createacct-join": "Rhowch eich manylion isod",
-       "createacct-another-join": "Rhowch fanylion y cyfrif newydd isod.",
        "createacct-emailrequired": "Cyfeiriad ebost",
        "createacct-emailoptional": "Cyfeiriad ebost (dewisol)",
        "createacct-email-ph": "Rhowch eich cyfeiriad ebost",
        "savearticle": "Cadw'r dudalen",
        "preview": "Rhagolwg",
        "showpreview": "Dangos rhagolwg",
-       "showlivepreview": "Rhagolwg byw",
        "showdiff": "Dangos newidiadau",
        "anoneditwarning": "'''Dalier sylw''': Nid ydych wedi mewngofnodi. Fe fydd eich cyfeiriad IP yn ymddangos ar hanes golygu'r dudalen hon. Gallwch ddewis cuddio'ch cyfeiriad IP drwy greu cyfrif (a mewngofnodi) cyn golygu.",
        "anonpreviewwarning": "''Nid ydych wedi mewngofnodi. Os y cadwch eich newidiadau caiff eich cyfeiriad IP ei gofnodi yn hanes golygu'r dudalen hon.''",
        "edit-gone-missing": "Ni ellid diweddaru'r dudalen.\nYmddengys iddi gael ei dileu.",
        "edit-conflict": "Cyd-ddigwyddiad golygu.",
        "edit-no-change": "Anwybyddwyd eich golygiad, gan na newidiwyd y testun.",
-       "postedit-confirmation": "Rhoddwyd eich golygiad ar gadw.",
+       "postedit-confirmation-saved": "Rhoddwyd eich golygiad ar gadw.",
        "edit-already-exists": "Ni ellid creu tudalen newydd.\nMae ar gael yn barod.",
        "defaultmessagetext": "Y testun rhagosodedig",
        "content-failed-to-parse": "Ni lwyddwyd i ddosrannu'r cynnwys sydd ar ffurf $2 yn ôl y model $1: $3",
        "search-result-score": "Perthnasedd: $1%",
        "search-redirect": "(ailgyfeiriad $1)",
        "search-section": "(adran $1)",
+       "search-file-match": "(yn cyfateb i gynnwys y ffeil)",
        "search-suggest": "Ai am hyn y chwiliwch: $1",
        "search-interwiki-caption": "Chwaer-brosiectau",
        "search-interwiki-default": "Y canlyniadau o $1:",
        "search-nonefound": "Ni chafwyd dim canlyniadau i'r ymholiad.",
        "powersearch-legend": "Chwiliad uwch",
        "powersearch-ns": "Chwilio yn y parthau:",
-       "powersearch-redir": "Rhestru ailgyfeiriadau",
        "powersearch-togglelabel": "Dewis:",
        "powersearch-toggleall": "Oll",
        "powersearch-togglenone": "Dim un",
        "prefs-emailconfirm-label": "Cadarnhau'r e-bost:",
        "youremail": "Eich cyfeiriad e-bost",
        "username": "{{GENDER:$1|Enw defnyddiwr}}:",
-       "uid": "{{GENDER:$1|ID y defnyddiwr}}:",
        "prefs-memberingroups": "Yn {{GENDER:$2|aelod}} o'r {{PLURAL:$1|grŵp|grŵp|grwpiau}} canlynol:",
        "prefs-registration": "Amser dechrau'r cyfrif:",
        "yourrealname": "Eich enw cywir*",
        "prefs-advancedsearchoptions": "Dewisiadau uwch",
        "prefs-advancedwatchlist": "Dewisiadau uwch",
        "prefs-displayrc": "Dewisiadau arddangos",
-       "prefs-displaysearchoptions": "Dewisiadau arddangos",
        "prefs-displaywatchlist": "Dewisiadau arddangos",
        "prefs-tokenwatchlist": "Tocyn",
        "prefs-diffs": "Cymharu golygiadau ('gwahan')",
        "action-createpage": "creu tudalennau",
        "action-createtalk": "creu tudalennau sgwrs",
        "action-createaccount": "creu'r cyfrif defnyddiwr hwn",
+       "action-history": "gweld hanes y dudalen",
        "action-minoredit": "marcio'r golygiad yn un bach",
        "action-move": "symud y dudalen",
        "action-move-subpages": "symud y dudalen a'i is-dudalennau",
        "recentchanges-legend-newpage": "(gweler hefyd [[Special:NewPages|restr y tudalennau newydd]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Isod rhestrir pob newid er <strong>'''$2'''</strong> (ymddengys hyd at <strong>'''$1'''</strong> ohonynt).",
-       "rclistfrom": "Dangos newidiadau newydd, gan ddechrau ers $1",
+       "rclistfrom": "Dangos newidiadau newydd, gan ddechrau ers $3 $2",
        "rcshowhideminor": "$1 golygiadau bychain",
        "rcshowhideminor-show": "Dangoser",
        "rcshowhideminor-hide": "Cuddier",
        "uploadstash-refresh": "Adnewyddu rhestr y ffeiliau",
        "invalid-chunk-offset": "Atred annilys i'r talpiau",
        "img-auth-accessdenied": "Ni chaniatawyd mynediad",
-       "img-auth-nopathinfo": "PATH_INFO yn eisiau.\nNid yw'ch gweinydd wedi ei osod i fedru pasio'r wybodaeth hon.\nEfallai ei fod wedi ei seilio ar CGI, ac heb fod yn gallu cynnal img_auth.\nGweler https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "PATH_INFO yn eisiau.\nNid yw'ch gweinydd wedi ei osod i fedru pasio'r wybodaeth hon.\nEfallai ei fod wedi ei seilio ar CGI, ac heb fod yn gallu cynnal img_auth.\nGweler https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Nid yw'r llwybr y gwneuthpwyd cais amdano yn y cyfeiriadur uwchlwytho ffurfweddedig.",
        "img-auth-badtitle": "Ddim yn gallu gwneud teitl dilys o \"$1\".",
        "img-auth-nologinnWL": "Nid ydych wedi mewngofnodi ac nid yw \"$1\" ar y rhestr wen.",
        "pageswithprop-prophidden-binary": "gwerth y briodwedd ddeuol, a guddiwyd ($1)",
        "doubleredirects": "Ailgyfeiriadau dwbl",
        "doubleredirectstext": "Mae pob rhes yn cynnwys cysylltiad i'r ddau ail-gyfeiriad cyntaf, ynghyd â chyrchfan yr ail ailgyfeiriad. Fel arfer bydd hyn yn rhoi'r gwir dudalen y dylai'r tudalennau cynt gyfeirio ati.\nGosodwyd <del>llinell</del> drwy'r eitemau sydd eisoes wedi eu datrys.",
-       "double-redirect-fixed-move": "Symudwyd [[$1]], a'i droi'n ailgyfeiriad at [[$2]]",
-       "double-redirect-fixed-maintenance": "Yn ailosod yr ailgyfeiriad dwbl o [[$1]] i [[$2]].",
+       "double-redirect-fixed-move": "Symudwyd [[$1]]. Cafodd ei diweddaru'n awtomatig, a'i droi'n ailgyfeiriad i [[$2]].",
+       "double-redirect-fixed-maintenance": "Yn ailosod yr ailgyfeiriad dwbl o [[$1]] i [[$2]], yn rhan o waith cynnal a chadw awtomatig.",
        "double-redirect-fixer": "Y bot ailgyfeirio",
        "brokenredirects": "Ailgyfeiriadau wedi'u torri",
        "brokenredirectstext": "Mae'r ailgyfeiriadau isod yn cysylltu â thudalennau nad ydynt ar gael:",
        "log-title-wildcard": "Chwilio am deitlau'n dechrau gyda'r geiriau hyn",
        "showhideselectedlogentries": "Dewis dangos neu guddio cofnodion lòg",
        "allpages": "Pob tudalen",
-       "alphaindexline": "$1 i $2",
        "nextpage": "Y bloc nesaf gan ddechrau gyda ($1)",
        "prevpage": "Y bloc cynt gan ddechrau gyda ($1)",
        "allpagesfrom": "Dangos pob tudalen gan ddechrau o:",
        "listgrouprights-removegroup-self": "Yn gallu tynnu {{PLURAL:$2|grŵp}} oddi ar eich cyfrif eich hunan: $1",
        "listgrouprights-addgroup-self-all": "Yn gallu ychwanegu'r holl grwpiau at eich cyfrif eich hunan",
        "listgrouprights-removegroup-self-all": "Yn gallu tynnu'r holl grwpiau oddi ar eich cyfrif eich hunan",
+       "listgrouprights-namespaceprotection-namespace": "Parth",
+       "listgrouprights-namespaceprotection-restrictedto": "Gallu(oedd) yn caniatau i'r defnyddiwr olygu",
+       "trackingcategories-name": "Enw'r neges",
+       "trackingcategories-nodesc": "Dim disgrifiad ar gael.",
+       "trackingcategories-disabled": "Categorïau yr analluogwyd",
        "mailnologin": "Does dim cyfeiriad i'w anfon iddo",
        "mailnologintext": "Rhaid eich bod wedi [[Special:UserLogin|mewngofnodi]]\na bod cyfeiriad e-bost dilys yn eich [[Special:Preferences|dewisiadau]]\ner mwyn medru anfon e-bost at ddefnyddwyr eraill.",
        "emailuser": "Anfon e-bost at y defnyddiwr hwn",
        "unwatchthispage": "Stopio gwylio",
        "notanarticle": "Ddim yn erthygl/ffeil",
        "notvisiblerev": "Y diwygiad wedi cael ei ddileu",
-       "watchlist-details": "{{PLURAL:$1|Nid oes dim tudalennau|Mae $1 dudalen|Mae $1 dudalen|Mae $1 tudalen|Mae $1 thudalen|Mae $1 o dudalennau}} ar eich rhestr wylio, heb gynnwys tudalennau sgwrs.",
+       "watchlist-details": "{{PLURAL:$1|Nid oes dim tudalennau|Mae $1 dudalen|Mae $1 dudalen|Mae $1 tudalen|Mae $1 thudalen|Mae $1 o dudalennau}} ar eich rhestr wylio, heb gynnwys tudalennau sgwrs ar wahan.",
        "wlheader-enotif": "Galluogwyd hysbysiadau trwy e-bost.",
        "wlheader-showupdated": "Mae tudalennau sydd wedi newid ers i chi eu gweld ddiwethaf wedi'u '''hamlygu'''.",
-       "watchmethod-recent": "yn chwilio'r diwygiadau diweddar am dudalennau ar y rhestr wylio",
-       "watchmethod-list": "yn chwilio'r tudalennau ar y rhestr wylio am ddiwygiadau diweddar",
-       "watchlistcontains": "{{PLURAL:$1|Nid oes dim tudalennau|Mae $1 dudalen|Mae $1 dudalen|Mae $1 tudalen|Mae $1 thudalen|Mae $1 o dudalennau}} ar eich rhestr wylio.",
-       "iteminvalidname": "Problem gyda'r eitem '$1', enw annilys...",
        "wlnote2": "Isod, fe welwch y newidiadau yn ystod {{PLURAL:$1|yr awr|yr awr|y ddwyawr ddiwethaf|teirawr diwethaf|<strong>$1</strong> awr diwethaf}}, hyd at $2, $3.",
        "wlshowlast": "Dangoser newidiadau'r $1 awr ddiwethaf neu'r $2 {{PLURAL:$2|diwrnod|diwrnod|ddiwrnod|diwrnod|diwrnod|diwrnod}} diwethaf neu'r $3 newidiadau.",
        "watchlist-options": "Dewisiadau ar gyfer y rhestr wylio",
        "enotif_lastvisited": "Gwelwch $1 am bob newid ers eich ymweliad blaenorol.",
        "enotif_lastdiff": "Gallwch weld y newid ar $1.",
        "enotif_anon_editor": "defnyddiwr anhysbys $1",
-       "enotif_body": "Annwyl $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nCrynodeb y golygydd: $PAGESUMMARY $PAGEMINOREDIT\n\nCysylltu â'r golygydd:\ne-bost: $PAGEEDITOR_EMAIL\nwici: $PAGEEDITOR_WIKI\n\nOs bydd mwy o drin a thrafod ar y dudalen cyn i chi ymweld â hi tra eich bod wedi mewngofnodi, ni chewch ragor o negeseuon hysbysu. Nodwn bod modd i chi ailosod y fflagiau hysbysu ar eich rhestr wylio, ar gyfer y tudalennau rydych yn eu gwylio.\n\n             Sustem hysbysu {{SITENAME}}\n\n--\nI newid eich gosodiadau negeseuon hysbysu, ewch i \n{{canonicalurl:{{#special:Preferences}}}}\n\nI newid eich gosodiadau gwylio, ewch i\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nI dynnu'r dudalen oddi ar eich rhestr wylio, ewch i\n$UNWATCHURL\n\nAm fwy o gymorth ac adborth:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Annwyl $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nCrynodeb y golygydd: $PAGESUMMARY $PAGEMINOREDIT\n\nCysylltu â'r golygydd:\ne-bost: $PAGEEDITOR_EMAIL\nwici: $PAGEEDITOR_WIKI\n\nOs bydd mwy o drin a thrafod ar y dudalen cyn i chi ymweld â hi tra eich bod wedi mewngofnodi, ni chewch ragor o negeseuon hysbysu. Nodwn bod modd i chi ailosod y fflagiau hysbysu ar eich rhestr wylio, ar gyfer y tudalennau rydych yn eu gwylio.\n\n             Sustem hysbysu {{SITENAME}}\n\n--\nI newid eich gosodiadau negeseuon hysbysu, ewch i \n{{canonicalurl:{{#special:Preferences}}}}\n\nI newid eich gosodiadau gwylio, ewch i\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nI dynnu'r dudalen oddi ar eich rhestr wylio, ewch i\n$UNWATCHURL\n\nAm fwy o gymorth ac adborth:\n$HELPPAGE",
        "created": "crëwyd",
        "changed": "Newidiwyd",
        "deletepage": "Dileer y dudalen",
        "contributions-title": "Cyfraniadau'r defnyddiwr $1",
        "mycontris": "Cyfraniadau",
        "contribsub2": "Gan {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "Nid oes cyfrif o'r enw \"$1\" wedi ei gofrestru yma.",
        "nocontribs": "Heb ddod o hyd i newidiadau gyda'r meini prawf hyn.",
        "uctop": "(cyfredol)",
        "month": "Cyfraniadau hyd at fis (ac yn gynharach):",
        "blockip": "Rhwystro'r defnyddiwr",
        "blockip-legend": "Rhwystro'r defnyddiwr",
        "blockiptext": "Defnyddiwch y ffurflen hon i rwystro cyfeiriad IP neu ddefnyddiwr rhag ysgrifennu i'r gronfa ddata. \nDylech chi ddim ond gwneud hyn er mwyn rhwystro fandaliaeth, a chan ddilyn [[{{MediaWiki:Policy-url}}|polisi'r wici]]. \nRhowch reswm dros rwystro'r defnyddiwr (er enghraifft, dywedwch pa dudalen(au) a fandaleiddiwyd).",
-       "ipadressorusername": "Cyfeiriad IP neu enw defnyddiwr:",
+       "ipaddressorusername": "Cyfeiriad IP neu enw defnyddiwr:",
        "ipbexpiry": "Am gyfnod:",
        "ipbreason": "Rheswm:",
        "ipbreason-dropdown": "*Rhesymau cyffredin dros flocio\n** Gosod gwybodaeth anghywir\n** Dileu cynnwys tudalennau\n** Gosod cysylltiadau sbam i wefannau eraill\n** Gosod dwli/lol ar dudalennau\n** Ymddygiad sy'n dychrynu neu'n aflonyddu\n** Camddefnyddio nifer o gyfrifon\n** Enw defnyddiwr annerbyniol",
        "tooltip-preferences-save": "Cadw'r dewisiadau",
        "tooltip-summary": "Rhowch grynodeb byr",
        "interlanguage-link-title": "$1 - $2",
-       "notacceptable": "Dydy gweinydd y wici ddim yn medru rhoi'r data mewn fformat darllenadwy i'ch cleient.",
        "anonymous": "chan {{PLURAL:$1|defnyddiwr|ddefnyddiwr|ddefnyddwyr|ddefnyddwyr|ddefnyddwyr|ddefnyddwyr}} anhysbys {{SITENAME}}",
        "siteuser": "y defnyddiwr {{SITENAME}} $1",
        "anonuser": "Defnyddiwr {{SITENAME}} anhysbys $1",
        "newimages-summary": "Mae'r dudalen arbennig hon yn dangos y ffeiliau a uwchlwythwyd yn ddiweddar.",
        "newimages-legend": "Hidlo",
        "newimages-label": "Enw'r ffeil (neu ran ohono):",
-       "showhidebots": "($1 botiau)",
        "noimages": "Does dim byd i'w weld.",
        "ilsubmit": "Chwilio",
        "bydate": "yn ôl dyddiad",
        "autosumm-replace": "Gwacawyd y dudalen a gosod y canlynol yn ei le: '$1'",
        "autoredircomment": "Yn ailgyfeirio at [[$1]]",
        "autosumm-new": "Crëwyd tudalen newydd yn dechrau gyda '$1'",
-       "livepreview-loading": "Wrthi'n llwytho…",
-       "livepreview-ready": "Llwytho… Ar ben!",
-       "livepreview-failed": "Y rhagolwg byw wedi methu! Rhowch gynnig ar y rhagolwg arferol.",
-       "livepreview-error": "Wedi methu cysylltu: $1 \"$2\". Rhowch gynnig ar y rhagolwg arferol.",
        "lag-warn-normal": "Hwyrach na ddangosir isod y newidiadau a ddigwyddodd o fewn y $1 {{PLURAL:$1|eiliad|eiliad|eiliad|eiliad|eiliad|eiliad}} ddiwethaf.",
        "lag-warn-high": "Mae gweinydd y data-bas ar ei hôl hi: efallai nad ymddengys newidiadau o fewn y $1 {{PLURAL:$1|eiliad|eiliad|eiliad|eiliad|eiliad|eiliad}} ddiwethaf ar y rhestr.",
-       "watchlistedit-numitems": "Mae {{PLURAL:$1|$1 tudalen|$1 dudalen|$1 dudalen|$1 tudalen|$1 thudalen|$1 o dudalennau}} ar eich rhestr wylio, heb gynnwys tudalennau sgwrs.",
-       "watchlistedit-noitems": "Mae'ch rhestr wylio'n wag.",
        "watchlistedit-normal-title": "Golygu'r rhestr wylio",
        "watchlistedit-normal-legend": "Tynnu tudalennau oddi ar y rhestr wylio",
        "watchlistedit-normal-explain": "Rhestrir y teitlau ar eich rhestr wylio isod.\nI dynnu teitl oddi ar y rhestr, ticiwch y blwch ar ei gyfer, yna cliciwch \"{{int:Watchlistedit-normal-submit}}\".\nGallwch hefyd ddewis golygu'r rhestr wylio ar ei [[Special:EditWatchlist/raw|ffurf syml]].",
        "compare-invalid-title": "Ysgrifennwyd teitl annilys.",
        "compare-title-not-exists": "Nid yw'r teitl a enwyd ar gael.",
        "compare-revision-not-exists": "Nid yw'r diwygiad a enwyd ar gael.",
-       "dberr-header": "Mae problem gan y wici hwn",
        "dberr-problems": "Mae'n ddrwg gennym! Mae'r wefan hon yn dioddef anawsterau technegol.",
        "dberr-again": "Oedwch am ychydig funudau cyn ceisio ail-lwytho.",
        "dberr-info": "(Ni ellir cysylltu â gweinydd y bas data: $1)",
        "htmlform-no": "Na/Nac ydw/Na fydd...",
        "htmlform-yes": "Ie/Iawn/Ydw/Oes...",
        "htmlform-chosen-placeholder": "Dewiswch opsiwn",
+       "htmlform-cloner-create": "Ychwaneger rhes",
+       "htmlform-cloner-delete": "Tynner i ffwrdd",
        "sqlite-has-fts": "$1 gyda chymorth chwilio yr holl destun",
        "sqlite-no-fts": "$1 heb gymorth chwiliad yr holl destun",
        "logentry-delete-delete": "Dileodd $1 y dudalen $3",
index 174f06f..f4749fb 100644 (file)
@@ -45,7 +45,8 @@
                        "Svip",
                        "Søren Løvborg",
                        "Tjernobyl",
-                       "Urhixidur"
+                       "Urhixidur",
+                       "아라"
                ]
        },
        "tog-underline": "Understreg henvisninger:",
@@ -58,7 +59,6 @@
        "tog-showtoolbar": "Vis værktøjslinje til redigering",
        "tog-editondblclick": "Redigér sider med dobbeltklik",
        "tog-editsectiononrightclick": "Redigér afsnit ved at højreklikke på deres titler",
-       "tog-rememberpassword": "Husk min login i denne browser (i højst $1 {{PLURAL:$1|dag|dage}})",
        "tog-watchcreations": "Tilføj sider, jeg opretter, og filer, jeg lægger op, til min overvågningsliste",
        "tog-watchdefault": "Tilføj sider og filer, jeg redigerer, til min overvågningsliste",
        "tog-watchmoves": "Tilføj sider og filer, jeg flytter, til min overvågningsliste",
        "permalink": "Permanent henvisning",
        "print": "Udskriv",
        "view": "Vis",
+       "view-foreign": "Vis på $1",
        "edit": "Redigér",
+       "edit-local": "Redigér lokal beskrivelse",
        "create": "Opret",
+       "create-local": "Tilføj lokal beskrivelse",
        "editthispage": "Redigér side",
        "create-this-page": "Opret denne side",
        "delete": "Slet",
        "readonly_lag": "Databasen er automatisk blevet låst mens slave database serverne synkronisere med master databasen",
        "internalerror": "Intern fejl",
        "internalerror_info": "Intern fejl: $1",
-       "fileappenderrorread": "Kunne ikke læse \"$1\" mens der blev tilføjet data.",
-       "fileappenderror": "Kunne ikke tilføje \"$1\" til \"$2\".",
        "filecopyerror": "Kunne ikke kopiere filen \"$1\" til \"$2\".",
        "filerenameerror": "Kunne ikke omdøbe filen \"$1\" til \"$2\".",
        "filedeleteerror": "Kunne ikke slette filen \"$1\".",
        "directorycreateerror": "Kunne ikke oprette mappen \"$1\".",
        "filenotfound": "Kunne ikke finde filen \"$1\".",
-       "fileexistserror": "Kunne ikke oprette \"$1\": filen findes allerede.",
        "unexpected": "Uventet værdi: \"$1\"=\"$2\".",
        "formerror": "Fejl: Kunne ikke afsende formular",
        "badarticleerror": "Denne funktion kan ikke udføres på denne side.",
        "userlogin-helplink2": "Hjælp med at logge på",
        "userlogin-loggedin": "Du er allerede logget på som {{GENDER:$1|$1}}.\nBrug formularen nedenfor til at logge på som en anden bruger.",
        "userlogin-createanother": "Opret en anden konto",
-       "createacct-join": "Indtast dine oplysninger nedenfor.",
-       "createacct-another-join": "Angiv den nye kontos oplysninger nedenfor.",
        "createacct-emailrequired": "E-mailadresse",
        "createacct-emailoptional": "E-mailadresse (valgfri)",
        "createacct-email-ph": "Indtast din e-mailadresse",
        "savearticle": "Gem side",
        "preview": "Forhåndsvisning",
        "showpreview": "Forhåndsvisning",
-       "showlivepreview": "Live-forhåndsvisning",
        "showdiff": "Vis ændringer",
        "anoneditwarning": "'''Advarsel:''' Du er ikke logget på. I stedet for brugernavn vises din IP-adresse i versionshistorikken.",
        "anonpreviewwarning": "''Du er ikke logget på. Hvis du gemmer, registreres din IP-adresse i versionshistorikken.''",
        "edit-gone-missing": "Kunne ikke opdatere siden.\nDen ser du til at være slettet.",
        "edit-conflict": "Redigeringskonflikt.",
        "edit-no-change": "Din ændring ignoreredes, fordi der ikke var ændring af teksten.",
-       "postedit-confirmation": "Din redigering er gemt.",
+       "postedit-confirmation-saved": "Din redigering er gemt.",
        "edit-already-exists": "En ny side kunne ikke oprettes, fordi den allerede findes.",
        "defaultmessagetext": "Standardtekst",
        "content-failed-to-parse": "Kunne ikke fortolke $2-indholdet af $1-modellen: $3",
        "search-nonefound": "Søgningen gav ingen resultater.",
        "powersearch-legend": "Avanceret søgning",
        "powersearch-ns": "Søg i navnerummene:",
-       "powersearch-redir": "Vis omdirigeringer",
        "powersearch-togglelabel": "Marker:",
        "powersearch-toggleall": "Alle",
        "powersearch-togglenone": "Ingen",
        "prefs-advancedsearchoptions": "Avancerede indstillinger",
        "prefs-advancedwatchlist": "Avancerede indstillinger",
        "prefs-displayrc": "Indstillinger for visning",
-       "prefs-displaysearchoptions": "Visningsmuligheder",
        "prefs-displaywatchlist": "Visningsmuligheder",
        "prefs-tokenwatchlist": "Mærke",
        "prefs-diffs": "Forskelle",
        "recentchanges-legend-newpage": "(se også [[Special:NewPages|listen over nye sider]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Nedenfor er op til '''$1''' ændringer siden '''$2''' vist.",
-       "rclistfrom": "Vis nye ændringer startende fra $1",
+       "rclistfrom": "Vis nye ændringer startende fra $3 $2",
        "rcshowhideminor": "$1 mindre ændringer",
        "rcshowhideminor-show": "Vis",
        "rcshowhideminor-hide": "Skjul",
        "uploadstash-refresh": "Opdatér filoversigten",
        "invalid-chunk-offset": "Ugyldig segmentstart",
        "img-auth-accessdenied": "Adgang nægtet",
-       "img-auth-nopathinfo": "PATH_INFO mangler.\nDin server er ikke sat op til at give denne information.\nDen bruger måske CGI og understøtter ikke img_auth.\nSe https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "PATH_INFO mangler.\nDin server er ikke sat op til at give denne information.\nDen bruger måske CGI og understøtter ikke img_auth.\nSe https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Den ønskede sti er ikke i det opsatte oplægningskatalog.",
        "img-auth-badtitle": "Kan ikke lave en gyldig titel ud fra \"$1\".",
        "img-auth-nologinnWL": "Du er ikke logget ind, og \"$1\" er ikke på hvidlisten.",
        "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'''.",
-       "watchmethod-recent": "Tjekker seneste ændringer for sider i din overvågningsliste",
-       "watchmethod-list": "Tjekker seneste ændringer for sider i din overvågningsliste",
-       "watchlistcontains": "Din overvågningsliste indeholder $1 {{PLURAL:$1|side|sider}}.",
-       "iteminvalidname": "Problem med '$1', ugyldigt navn...",
        "wlnote2": "Nedenfor ses ændringerne i {{PLURAL:$1|den sidste time|de sidste <strong>$1</strong> timer}} op til den $2 kl. $3.",
        "wlshowlast": "Vis de seneste $1 timer $2 dage $3",
        "watchlist-options": "Indstillinger for overvågningslisten",
        "enotif_lastvisited": "Se $1 for alle ændringer siden dit sidste besøg.",
        "enotif_lastdiff": "Se $1 for at vise denne ændring.",
        "enotif_anon_editor": "anonym bruger $1",
-       "enotif_body": "Kære $WATCHINGUSERNAME\n\n$PAGEINTRO $NEWPAGE\n\nBidragyderens opsummering: $PAGESUMMARY $PAGEMINOREDIT\n\nKontakt bidragyderen:\ne-mail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nDu vil ikke modtage flere beskeder om yderligere aktivitet medmindre du besøger denne side. På din overvågningsliste kan du også nulstille alle markeringer for de sider, du overvåger.\n\n         Med venlig hilsen {{SITENAME}}s informationssystem\n\n--\nFor at ændre dine indstillinger for e-mail meddelelser, besøg\n{{canonicalurl:{{#special:Preferences}}}}\n\nFor at ændre indstillingerne for din overvågningsliste, besøg\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nFor at slette siden fra din overvågningsliste, besøg\n$UNWATCHURL\n\nTilbagemelding og yderligere hjælp:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Kære $WATCHINGUSERNAME\n\n$PAGEINTRO $NEWPAGE\n\nBidragyderens opsummering: $PAGESUMMARY $PAGEMINOREDIT\n\nKontakt bidragyderen:\ne-mail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nDu vil ikke modtage flere beskeder om yderligere aktivitet medmindre du besøger denne side. På din overvågningsliste kan du også nulstille alle markeringer for de sider, du overvåger.\n\n         Med venlig hilsen {{SITENAME}}s informationssystem\n\n--\nFor at ændre dine indstillinger for e-mail meddelelser, besøg\n{{canonicalurl:{{#special:Preferences}}}}\n\nFor at ændre indstillingerne for din overvågningsliste, besøg\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nFor at slette siden fra din overvågningsliste, besøg\n$UNWATCHURL\n\nTilbagemelding og yderligere hjælp:\n$HELPPAGE",
        "created": "oprettet",
        "changed": "ændret",
        "deletepage": "Slet side",
        "blockip": "Bloker 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).",
-       "ipadressorusername": "IP-adresse eller brugernavn",
+       "ipaddressorusername": "IP-adresse eller brugernavn",
        "ipbexpiry": "varighed",
        "ipbreason": "Begrundelse:",
        "ipbreason-dropdown": "*Generelle begrundelser\n** Indsættelse af forkerte oplysninger\n** Fjernelse af korrekt indhold\n** Linkspam\n** Indsættelse af vås/nonsens\n** Utilstedelig opførsel\n** Misbrug af flere brugerkonti\n** Uacceptabelt brugernavn",
        "monobook.css": "/** CSS inkluderet her vil være aktivt for brugere af Monobook-temaet . */",
        "common.js": "/* Javascript inkluderet her vil være aktivt for alle brugere. */",
        "monobook.js": "/* JavaScript i denne fil vil indlæses for brugere af udseendet MonoBook */",
-       "notacceptable": "Wiki-serveren kan ikke levere data i et format, som din klient understøtter.",
        "anonymous": "{{PLURAL:$1|Anonym bruger|Anonyme brugere}} på {{SITENAME}}",
        "siteuser": "{{SITENAME}} bruger $1",
        "anonuser": "{{SITENAME}} anonym bruger $1",
        "newimages-summary": "Denne specialside viser de senest oplagte filer.",
        "newimages-legend": "Filter",
        "newimages-label": "Filnavn (eller en del af det):",
-       "showhidebots": "($1 botter)",
        "noimages": "Ingen filer fundet.",
        "ilsubmit": "Søg",
        "bydate": "efter dato",
        "autosumm-replace": "Erstatter sidens indhold med \"$1\"",
        "autoredircomment": "Omdirigering til [[$1]] oprettet",
        "autosumm-new": "Oprettede siden med \"$1\"",
-       "livepreview-loading": "Indlæser …",
-       "livepreview-ready": "Indlæser … færdig!",
-       "livepreview-failed": "Live-forhåndsvisning ikke mulig! Brug venligst den almindelige forhåndsvisning.",
-       "livepreview-error": "Forbindelse ikke mulig: $1 \"$2\". Brug venligst den almindelige forhåndsvisning.",
        "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-numitems": "Din overvågningsliste indeholder {{PLURAL:$1|1 side|$1 sider}}, diskussionssider fraregnet.",
-       "watchlistedit-noitems": "Din overvågningsliste er tom.",
        "watchlistedit-normal-title": "Rediger overvågningsliste",
        "watchlistedit-normal-legend": "Slet sider fra overvågningslisten",
        "watchlistedit-normal-explain": "Siderne på din overvågningsliste er vist nedenfor.\nFor at fjerne en side, skal boksen ud for den markeres, og klik på \"{{int:Watchlistedit-normal-submit}}\".\nDu kan også [[Special:EditWatchlist/raw|redigere siden direkte]].",
        "compare-invalid-title": "Den titel, du har angivet, er ugyldig.",
        "compare-title-not-exists": "Den titel, du har angivet, findes ikke.",
        "compare-revision-not-exists": "Den version, du har angivet, findes ikke.",
-       "dberr-header": "Wikien har et problem",
        "dberr-problems": "Undskyld! Siden har tekniske problemer.",
        "dberr-again": "Prøv at vente et par minutter og opdater så siden igen.",
        "dberr-info": "(Kan ikke komme i kontakt med databaseserveren: $1)",
index 3e925b0..7a6b218 100644 (file)
@@ -73,7 +73,8 @@
                        "Ziko",
                        "Zylbath",
                        "לערי ריינהארט",
-                       "✓"
+                       "✓",
+                       "XenonX3"
                ]
        },
        "tog-underline": "Links unterstreichen:",
@@ -81,7 +82,7 @@
        "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-usenewrc": "Änderungen auf „Letzte Änderungen“ und Beobachtungsliste nach Seite gruppieren",
+       "tog-usenewrc": "Änderungen auf „Letzte Änderungen“ und der Beobachtungsliste nach Seite gruppieren",
        "tog-numberheadings": "Überschriften automatisch nummerieren",
        "tog-showtoolbar": "Bearbeiten-Werkzeugleiste anzeigen",
        "tog-editondblclick": "Seiten mit Doppelklick bearbeiten",
        "jumptonavigation": "Navigation",
        "jumptosearch": "Suche",
        "view-pool-error": "Entschuldigung, die Server sind im Moment überlastet.\nZu viele Benutzer versuchen, diese Seite zu besuchen.\nBitte warte einige Minuten, bevor du es noch einmal versuchst.\n\n$1",
+       "generic-pool-error": "Leider sind die Server derzeit überlastet.\nZu viele Benutzer wollen diese Ressource ansehen.\nBitte warte einen Moment, bevor du sie erneut aufrufst.",
        "pool-timeout": "Zeitablauf während des Wartens auf die Sperrung",
        "pool-queuefull": "Poolwarteschlange ist voll",
        "pool-errorunknown": "Unbekannter Fehler",
        "databaseerror-query": "Abfrage: $1",
        "databaseerror-function": "Funktion: $1",
        "databaseerror-error": "Fehler: $1",
-       "laggedslavemode": "'''Achtung:''' Die angezeigte Seite könnte unter Umständen nicht die letzten Bearbeitungen enthalten.",
+       "laggedslavemode": "<strong>Achtung:</strong> Die angezeigte Seite könnte unter Umständen nicht die letzten Bearbeitungen enthalten.",
        "readonly": "Datenbank gesperrt",
        "enterlockreason": "Bitte gib einen Grund ein, warum die Datenbank gesperrt werden soll und eine Abschätzung über die Dauer der Sperrung",
        "readonlytext": "Die Datenbank ist vorübergehend für Neueinträge und Änderungen gesperrt. Bitte versuche es später noch einmal.\n\nGrund der Sperrung: $1",
        "readonly_lag": "Die Datenbank wurde automatisch für Schreibzugriffe gesperrt, damit sich die verteilten Datenbankserver (slaves) mit dem Hauptdatenbankserver (master) abgleichen können.",
        "internalerror": "Interner Fehler",
        "internalerror_info": "Interner Fehler: $1",
-       "fileappenderrorread": "„$1“ konnte während des Hinzufügens nicht gelesen werden.",
-       "fileappenderror": "Konnte „$1“ nicht an „$2“ anhängen.",
        "filecopyerror": "Die Datei „$1“ konnte nicht nach „$2“ kopiert werden.",
        "filerenameerror": "Die Datei „$1“ konnte nicht nach „$2“ umbenannt werden.",
        "filedeleteerror": "Die Datei „$1“ konnte nicht gelöscht werden.",
        "directorycreateerror": "Das Verzeichnis „$1“ konnte nicht angelegt werden.",
        "filenotfound": "Die Datei „$1“ wurde nicht gefunden.",
-       "fileexistserror": "In die Datei „$1“ konnte nicht geschrieben werden, da die Datei bereits vorhanden ist.",
        "unexpected": "Unerwarteter Wert: „$1“ = „$2“",
        "formerror": "Fehler: Die Eingaben konnten nicht verarbeitet werden.",
        "badarticleerror": "Diese Aktion kann auf diese Seite nicht angewendet werden.",
-       "cannotdelete": "Die Seite oder Datei „$1“ kann nicht gelöscht werden.\nMöglicherweise wurde sie bereits von jemand anderem gelöscht.",
+       "cannotdelete": "Die Seite oder Datei „$1“ konnte nicht gelöscht werden.\nMöglicherweise wurde sie bereits von jemand anderem gelöscht.",
        "cannotdelete-title": "Seite „$1“ kann nicht gelöscht werden",
        "delete-hook-aborted": "Die Löschung wurde von einer Programmerweiterung zu MediaWiki verhindert.\nEs ist hierzu keine Erklärung verfügbar.",
        "no-null-revision": "Die neue Nullversion für die Seite „$1“ konnte nicht erstellt werden",
        "myprivateinfoprotected": "Du hast keine Berechtigung, deine privaten Informationen zu bearbeiten.",
        "mypreferencesprotected": "Du hast keine Berechtigung, deine Einstellungen zu bearbeiten.",
        "ns-specialprotected": "Spezialseiten können nicht bearbeitet werden.",
-       "titleprotected": "Eine Seite mit diesem Namen kann nicht angelegt werden.\nDie Sperre wurde durch [[User:$1|$1]] mit der Begründung ''„$2“'' eingerichtet.",
+       "titleprotected": "Eine Seite mit diesem Namen kann nicht angelegt werden.\nDie Sperre wurde durch [[User:$1|$1]] mit der Begründung „<em>$2</em>“ eingerichtet.",
        "filereadonlyerror": "Die Datei „$1“ kann nicht verändert werden, da auf das Dateirepositorium „$2“ nur Lesezugriff möglich ist.\n\nDer Administrator, der den Schreibzugriff sperrte, gab folgenden Grund an: „$3“.",
        "invalidtitle-knownnamespace": "Ungültiger Titel mit Namensraum „$2“ und Text „$3“",
        "invalidtitle-unknownnamespace": "Ungültiger Titel mit unbekannter Namensraumnummer $1 und Text „$2“",
        "exception-nologin": "Nicht angemeldet",
        "exception-nologin-text": "Du musst dich [[Special:Userlogin|anmelden]], um auf diese Seite oder Aktion zugreifen zu können.",
        "exception-nologin-text-manual": "Du musst dich $1, um auf diese Seite oder Aktion zugreifen zu können.",
-       "virus-badscanner": "Fehlerhafte Konfiguration: unbekannter Virenscanner: ''$1''",
+       "virus-badscanner": "Fehlerhafte Konfiguration: unbekannter Virenscanner: <em>$1</em>",
        "virus-scanfailed": "Scan fehlgeschlagen (code $1)",
        "virus-unknownscanner": "Unbekannter Virenscanner:",
-       "logouttext": "'''Du bist nun abgemeldet.'''\n\nBeachte, dass einige Seiten noch anzeigen können, dass du angemeldet bist, solange du nicht deinen Browsercache geleert hast.",
+       "logouttext": "<strong>Du bist nun abgemeldet.</strong>\n\nBeachte, dass einige Seiten noch anzeigen können, dass du angemeldet bist, solange du nicht deinen Browsercache geleert hast.",
        "welcomeuser": "Willkommen, $1!",
        "welcomecreation-msg": "Dein Benutzerkonto wurde erstellt.\nVergiss nicht, deine [[Special:Preferences|{{SITENAME}}-Einstellungen]] zu ändern.",
        "yourname": "Benutzername:",
        "userlogin-signwithsecure": "Sichere Verbindung verwenden",
        "yourdomainname": "Deine Domain:",
        "password-change-forbidden": "Du kannst auf diesem Wiki keine Passwörter ändern.",
-       "externaldberror": "Entweder es liegt ein Fehler bei der externen Authentifizierung vor oder du darfst dein externes Benutzerkonto nicht aktualisieren.",
+       "externaldberror": "Entweder liegt ein Fehler bei der externen Authentifizierung vor oder du darfst dein externes Benutzerkonto nicht aktualisieren.",
        "login": "Anmelden",
        "nav-login-createaccount": "Anmelden / Benutzerkonto erstellen",
        "loginprompt": "Zur Anmeldung müssen Cookies aktiviert sein.",
        "userlogout": "Abmelden",
        "notloggedin": "Nicht angemeldet",
        "userlogin-noaccount": "Du hast noch kein Benutzerkonto?",
-       "userlogin-joinproject": "{{SITENAME}} beitreten",
+       "userlogin-joinproject": "Bei {{SITENAME}} anmelden",
        "nologin": "Du hast kein Benutzerkonto? $1.",
        "nologinlink": "Neues Benutzerkonto anlegen",
        "createaccount": "Benutzerkonto anlegen",
-       "gotaccount": "Du hast bereits ein Benutzerkonto? '''$1'''.",
+       "gotaccount": "Du hast bereits ein Benutzerkonto? $1.",
        "gotaccountlink": "Anmelden",
        "userlogin-resetlink": "Die Anmeldedaten vergessen?",
        "userlogin-resetpassword-link": "Passwort vergessen?",
-       "userlogin-helplink2": "Hilfe bei der Anmeldung",
+       "userlogin-helplink2": "Hilfe beim Anmelden",
        "userlogin-loggedin": "Du bist bereits als {{GENDER:$1|$1}} angemeldet.\nBenutze das unten stehende Formular, um dich unter einem anderen Benutzernamen anzumelden.",
        "userlogin-createanother": "Ein weiteres Benutzerkonto erstellen",
-       "createacct-join": "Gib unten deine Informationen ein.",
-       "createacct-another-join": "Gib unten die Informationen des neuen Benutzerkontos ein.",
        "createacct-emailrequired": "E-Mail-Adresse",
        "createacct-emailoptional": "E-Mail-Adresse (optional)",
        "createacct-email-ph": "Gib deine E-Mail-Adresse ein",
        "createaccounterror": "Benutzerkonto konnte nicht erstellt werden: $1",
        "nocookiesnew": "Der Benutzerzugang wurde erstellt, aber du bist nicht angemeldet. {{SITENAME}} benötigt für diese Funktion Cookies, bitte aktiviere diese und melde dich dann mit deinem neuen Benutzernamen und dem zugehörigen Passwort an.",
        "nocookieslogin": "{{SITENAME}} benutzt Cookies zur Anmeldung der Benutzer. Du hast Cookies deaktiviert, bitte aktiviere diese und versuche es erneut.",
-       "nocookiesfornew": "Das Benutzerkonto wurde nicht erstellt, da die Datenherkunft nicht ermittelt werden konnte.\nEs muss sichergestellt sein, dass Cookies aktiviert sind. Danach diese Seite erneut laden und es wieder versuchen.",
+       "nocookiesfornew": "Das Benutzerkonto wurde nicht erstellt, da die Datenherkunft nicht ermittelt werden konnte.\nBitte stelle sicher, dass du Cookies aktiviert hast. Lade diese Seite danach erneut und versuche es noch einmal.",
        "noname": "Du musst einen gültigen Benutzernamen angeben.",
        "loginsuccesstitle": "Anmeldung erfolgreich",
-       "loginsuccess": "Du bist jetzt als „$1“ bei {{SITENAME}} angemeldet.",
-       "nosuchuser": "Der Benutzername „$1“ existiert nicht.\nÜberprüfe die Schreibweise (Groß-/Kleinschreibung beachten) oder [[Special:UserLogin/signup|melde dich als neuer Benutzer an]].",
+       "loginsuccess": "<strong>Du bist jetzt als „$1“ bei {{SITENAME}} angemeldet.</strong>",
+       "nosuchuser": "Der Benutzername „$1“ existiert nicht.\nÜberprüfe die Schreibweise (Groß-/Kleinschreibung beachten) oder [[Special:UserLogin/signup|lege ein neues Benutzerkonto an]].",
        "nosuchusershort": "Der Benutzername „$1“ ist nicht vorhanden. Bitte überprüfe die Schreibweise.",
        "nouserspecified": "Bitte gib einen Benutzernamen an.",
        "login-userblocked": "{{GENDER:$1|Dieser Benutzer|Diese Benutzerin|Dieser Benutzer}} ist gesperrt. Die Anmeldung ist nicht erlaubt.",
        "password-name-match": "Dein Passwort muss sich von deinem Benutzernamen unterscheiden.",
        "password-login-forbidden": "Die Verwendung dieses Benutzernamens und Passwortes ist nicht erlaubt.",
        "mailmypassword": "Passwort zurücksetzen",
-       "passwordremindertitle": "Neues Passwort für ein {{SITENAME}}-Benutzerkonto",
+       "passwordremindertitle": "Neues Passwort für dein {{SITENAME}}-Benutzerkonto",
        "passwordremindertext": "Jemand mit der IP-Adresse $1, wahrscheinlich du selbst, hat ein neues Passwort für die Anmeldung bei {{SITENAME}} ($4) angefordert.\n\nDas automatisch generierte Passwort für Benutzer „$2“ lautet nun: $3\n\nFalls du dies wirklich gewünscht hast, solltest du dich jetzt anmelden und das Passwort ändern.\nDas neue Passwort ist {{PLURAL:$5|1 Tag|$5 Tage}} gültig.\n\nBitte ignoriere diese E-Mail, falls du sie nicht selbst angefordert hast. Das alte Passwort bleibt weiterhin gültig.",
        "noemail": "{{GENDER:$1|Benutzer|Benutzerin|Benutzer}} „$1“ hat keine E-Mail-Adresse angegeben.",
-       "noemailcreate": "Du musst eine gültige E-Mail-Adresse angeben",
+       "noemailcreate": "Du musst eine gültige E-Mail-Adresse angeben.",
        "passwordsent": "Ein neues, temporäres Passwort wurde an die E-Mail-Adresse von Benutzer „$1“ gesandt.\nBitte melde dich damit an, sobald du es erhalten hast. Das alte Passwort bleibt weiterhin gültig.",
        "blocked-mailpassword": "Die von dir verwendete IP-Adresse ist für das Ändern von Seiten gesperrt. Um einen Missbrauch zu verhindern, wurde die Möglichkeit zur Anforderung eines neuen Passwortes ebenfalls gesperrt.",
        "eauthentsent": "Eine Bestätigungs-E-Mail wurde an die angegebene Adresse verschickt.\n\nBevor eine E-Mail von anderen Benutzern über die E-Mail-Funktion empfangen werden kann, muss die Adresse und ihre tatsächliche Zugehörigkeit zu diesem Benutzerkonto erst bestätigt werden. Bitte befolge die Hinweise in der Bestätigungs-E-Mail.",
        "pt-login-button": "Anmelden",
        "pt-createaccount": "Benutzerkonto erstellen",
        "pt-userlogout": "Abmelden",
-       "php-mail-error-unknown": "Unbekannter Fehler mit der Funktion mail() von PHP",
-       "user-mail-no-addy": "Versuchte, eine E-Mail ohne Angabe einer E-Mail-Adresse zu versenden.",
+       "php-mail-error-unknown": "Unbekannter Fehler in der PHP-Funktion mail().",
+       "user-mail-no-addy": "Es wurde versucht, eine E-Mail ohne Angabe einer E-Mail-Adresse zu versenden.",
        "user-mail-no-body": "Es wurde versucht, eine E-Mail mit einem leeren oder zu kurzen Textkörper zu versenden.",
        "changepassword": "Passwort ändern",
        "resetpass_announce": "Um die Anmeldung abzuschließen, musst du ein neues Passwort festlegen.",
        "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, die 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.",
+       "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.",
        "resettokens-no-tokens": "Es gibt keine Tokens zum Zurücksetzen.",
        "resettokens-legend": "Tokens zurücksetzen",
        "resettokens-tokens": "Tokens:",
        "savearticle": "Seite speichern",
        "preview": "Vorschau",
        "showpreview": "Vorschau zeigen",
-       "showlivepreview": "Sofortige Vorschau",
        "showdiff": "Änderungen zeigen",
        "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.",
        "anonpreviewwarning": "''Du bist nicht angemeldet. Beim Speichern wird deine IP-Adresse in der Versionsgeschichte aufgezeichnet.''",
        "edit-gone-missing": "Die Seite konnte nicht aktualisiert werden.\nSie wurde anscheinend gelöscht.",
        "edit-conflict": "Bearbeitungskonflikt.",
        "edit-no-change": "Deine Bearbeitung wurde ignoriert, da keine Änderung an dem Text vorgenommen wurde.",
-       "postedit-confirmation": "Deine Bearbeitung wurde gespeichert.",
+       "postedit-confirmation-created": "Die Seite wurde erstellt.",
+       "postedit-confirmation-restored": "Die Seite wurde wiederhergestellt.",
+       "postedit-confirmation-saved": "Deine Bearbeitung wurde gespeichert.",
        "edit-already-exists": "Die neue Seite konnte nicht erstellt werden, da sie bereits vorhanden ist.",
        "defaultmessagetext": "Standardtext",
        "content-failed-to-parse": "Parsen des Inhalts $2 für Modell $1 fehlgeschlagen: $3",
        "parser-template-recursion-depth-warning": "Vorlagenrekursionstiefengrenze überschritten ($1)",
        "language-converter-depth-warning": "Sprachkonvertertiefenlimit überschritten ($1)",
        "node-count-exceeded-category": "Seiten, die die Knotenanzahl überschritten haben",
+       "node-count-exceeded-category-desc": "Eine Kategorie für Seiten, bei denen die Knotenzahl überschritten wurde.",
        "node-count-exceeded-warning": "Die Seite hat die Knotenpunktanzahl überschritten.",
        "expansion-depth-exceeded-category": "Seiten, die die Expansionstiefe überschritten haben",
+       "expansion-depth-exceeded-category-desc": "Dies ist eine Kategorie für Seiten, bei denen die Expandierungstiefe überschritten wurde.",
        "expansion-depth-exceeded-warning": "Die Seite hat die Expansionstiefe überschritten.",
        "parser-unstrip-loop-warning": "Zirkelbezug festgestellt",
        "parser-unstrip-recursion-limit": "Rekursionsgrenze beim Auflösen überschritten ($1)",
        "showhideselectedversions": "Gewählte Versionen zeigen/verstecken",
        "editundo": "rückgängig machen",
        "diff-empty": "(kein Unterschied)",
-       "diff-multi-sameuser": "({{PLURAL:$1|Eine dazwischenliegende Version|$1 dazwischenliegende Versionen}} des gleichen Benutzers werden nicht angezeigt)",
+       "diff-multi-sameuser": "({{PLURAL:$1|Eine dazwischenliegende Version desselben Benutzers wird|$1 dazwischenliegende Versionen desselben Benutzers werden}} nicht angezeigt)",
        "diff-multi-otherusers": "({{PLURAL:$1|Eine dazwischenliegende Version|$1 dazwischenliegende Versionen}} von {{PLURAL:$2|einem anderen Benutzer|$2 Benutzern}} werden nicht angezeigt)",
        "diff-multi-manyusers": "({{PLURAL:$1|$1 dazwischenliegende Versionen}} von mehr als {{PLURAL:$2|$2 Benutzern}}, die nicht angezeigt werden)",
        "difference-missing-revision": "{{PLURAL:$2|Eine Version|$2 Versionen}} dieser Unterschiedsanzeige ($1) {{PLURAL:$2|wurde|wurden}} nicht gefunden.\n\nDieser Fehler wird normalerweise von einem veralteten Link zur Versionsgeschichte einer Seite verursacht, die zwischenzeitlich gelöscht wurde.\nEinzelheiten sind im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Lösch-Logbuch] vorhanden.",
        "searchmenu-exists": "'''Es gibt eine Seite, die den Namen „[[:$1]]“ hat.'''",
        "searchmenu-new": "<strong>Erstelle die Seite „[[:$1]]“ in diesem Wiki.</strong> {{PLURAL:$2|0=|Siehe auch die über deine Suche gefundene Seite.|Siehe auch die gefundenen Suchergebnisse.}}",
        "searchprofile-articles": "Inhaltsseiten",
-       "searchprofile-project": "Hilfe- und Projektseiten",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Alles",
        "searchprofile-advanced": "Erweitert",
        "searchprofile-articles-tooltip": "Suchen in $1",
-       "searchprofile-project-tooltip": "Suchen in $1",
        "searchprofile-images-tooltip": "Nach Dateien suchen",
        "searchprofile-everything-tooltip": "Gesamten Inhalt durchsuchen (inklusive Diskussionsseiten)",
        "searchprofile-advanced-tooltip": "Suche in weiteren Namensräumen",
        "search-nonefound": "Zu deiner Suchanfrage wurden keine Ergebnisse gefunden.",
        "powersearch-legend": "Erweiterte Suche",
        "powersearch-ns": "Suche in Namensräumen:",
-       "powersearch-redir": "Weiterleitungen anzeigen",
        "powersearch-togglelabel": "Wähle aus:",
        "powersearch-toggleall": "Alle",
        "powersearch-togglenone": "Keine",
        "recentchangesdays-max": "Maximal $1 {{PLURAL:$1|Tag|Tage}}",
        "recentchangescount": "Anzahl der standardmäßig angezeigten Bearbeitungen:",
        "prefs-help-recentchangescount": "Dies umfasst die Liste der letzten Änderungen, die Versionsgeschichte und die Logbücher.",
-       "prefs-help-watchlist-token2": "Dies ist der geheime Schlüssel zum Webfeed deiner Beobachtungsliste.\nJeder, der ihn kennt, kann deine Beobachtungsliste lesen. Teile ihn deshalb nicht.\n[[Special:ResetTokens|Klicke hier, wenn du ihn zurücksetzen musst]].",
+       "prefs-help-watchlist-token2": "Dies ist der geheime Schlüssel zum Webfeed deiner Beobachtungsliste.\nJeder, der ihn kennt, kann deine Beobachtungsliste lesen. Teile ihn deshalb nicht Anderen mit.\nSofern notwendig, [[Special:ResetTokens|kannst du ihn zurücksetzen]].",
        "savedprefs": "Deine Einstellungen wurden gespeichert.",
        "timezonelegend": "Zeitzone:",
        "localtime": "Ortszeit:",
        "prefs-emailconfirm-label": "E-Mail-Bestätigung:",
        "youremail": "E-Mail-Adresse:",
        "username": "{{GENDER:$1|Benutzername}}:",
-       "uid": "{{GENDER:$1|Benutzerkennung}}:",
        "prefs-memberingroups": "{{GENDER:$2|Mitglied}} der {{PLURAL:$1|Benutzergruppe|Benutzergruppen}}:",
        "prefs-memberingroups-type": "$2",
        "prefs-registration": "Anmeldezeitpunkt:",
        "prefs-advancedsearchoptions": "Erweiterte Optionen",
        "prefs-advancedwatchlist": "Erweiterte Optionen",
        "prefs-displayrc": "Anzeigeoptionen",
-       "prefs-displaysearchoptions": "Anzeigeoptionen",
        "prefs-displaywatchlist": "Anzeigeoptionen",
        "prefs-tokenwatchlist": "Token",
        "prefs-diffs": "Versionsvergleich",
        "right-move": "Seiten verschieben",
        "right-move-subpages": "Seiten inklusive Unterseiten verschieben",
        "right-move-rootuserpages": "Haupt-Benutzerseiten verschieben",
+       "right-move-categorypages": "Kategorieseiten verschieben",
        "right-movefile": "Dateien verschieben",
        "right-suppressredirect": "Beim Verschieben die Erstellung einer Weiterleitung unterdrücken",
        "right-upload": "Dateien hochladen",
        "action-createpage": "Seiten zu erstellen",
        "action-createtalk": "Diskussionsseiten zu erstellen",
        "action-createaccount": "ein Benutzerkonto zu erstellen",
+       "action-history": "die Versionsgeschichte dieser Seite anzusehen",
        "action-minoredit": "diese Bearbeitung als klein zu markieren",
        "action-move": "die Seite zu verschieben",
        "action-move-subpages": "diese Seite und zugehörige Unterseiten zu verschieben",
        "action-move-rootuserpages": "Haupt-Benutzerseiten zu verschieben",
+       "action-move-categorypages": "Kategorieseiten zu verschieben",
        "action-movefile": "Diese Datei verschieben",
        "action-upload": "Dateien hochzuladen",
        "action-reupload": "die vorhandene Datei zu überschreiben",
        "action-patrol": "Bearbeitungen anderer Benutzer als kontrolliert zu markieren",
        "action-autopatrol": "eigene Bearbeitungen als kontrolliert zu markieren",
        "action-unwatchedpages": "die Liste der unbeobachteten Seiten einzusehen",
-       "action-mergehistory": "die Versionengeschichten von Seiten zu vereinen",
+       "action-mergehistory": "die Versionsgeschichten von Seiten zu vereinen",
        "action-userrights": "Benutzerrechte zu ändern",
        "action-userrights-interwiki": "die Rechte von Benutzern in anderen Wikis zu ändern",
        "action-siteadmin": "die Datenbank zu sperren oder freizugeben",
        "uploadstash-refresh": "Liste der Dateien aktualisieren",
        "invalid-chunk-offset": "Ungültiger Startpunkt",
        "img-auth-accessdenied": "Zugriff verweigert",
-       "img-auth-nopathinfo": "Die Angabe PATH_INFO fehlt.\nDer Server ist nicht dafür eingerichtet, diese Information weiterzugeben.\nSie könnte CGI-gestützt sein und kann daher „img_auth“ (Authentifizierung des Dateiaufrufs) nicht unterstützen.\nSiehe auch https://www.mediawiki.org/wiki/Manual:Image_Authorization (englisch).",
+       "img-auth-nopathinfo": "Die Angabe PATH_INFO fehlt.\nDer Server ist nicht dafür eingerichtet, diese Information weiterzugeben.\nSie könnte CGI-gestützt sein und kann daher „img_auth“ (Authentifizierung des Dateiaufrufs) nicht unterstützen.\nSiehe auch https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization (englisch).",
        "img-auth-notindir": "Der gewünschte Pfad ist nicht im konfigurierten Uploadverzeichnis.",
        "img-auth-badtitle": "Aus „$1“ kann kein gültiger Titel erstellt werden.",
        "img-auth-nologinnWL": "Du bist nicht angemeldet und „$1“ ist nicht in der weißen Liste.",
        "pageswithprop-prophidden-binary": "Binäreigenschaftswert versteckt ($1)",
        "doubleredirects": "Doppelte Weiterleitungen",
        "doubleredirectstext": "Diese Liste enthält Weiterleitungen, die auf Weiterleitungen verlinken.\nJede Zeile enthält Links zur ersten und zweiten Weiterleitung sowie dem Ziel der zweiten Weiterleitung, welches für gewöhnlich die gewünschte Zielseite ist, auf die bereits die erste Weiterleitung zeigen sollte.\n<del>Durchgestrichene</del> Einträge wurden bereits erfolgreich bearbeitet.",
-       "double-redirect-fixed-move": "[[$1]] wurde verschoben und leitet nun nach [[$2]] weiter.",
-       "double-redirect-fixed-maintenance": "Bereinigung der doppelten Weiterleitung von [[$1]] nach [[$2]].",
+       "double-redirect-fixed-move": "[[$1]] wurde verschoben.\nDie Seite wurde automatisch aktualisiert und leitet nun nach [[$2]] weiter.",
+       "double-redirect-fixed-maintenance": "Automatische Bereinigung der doppelten Weiterleitung von [[$1]] nach [[$2]] in einem Wartungsauftrag.",
        "double-redirect-fixer": "RedirectBot",
        "brokenredirects": "Defekte Weiterleitungen",
        "brokenredirectstext": "Diese Spezialseite listet Weiterleitungen auf nicht existierende Seiten auf.",
        "log-title-wildcard": "Titel beginnt mit …",
        "showhideselectedlogentries": "Ausgewählte Logbucheinträge anzeigen/verstecken",
        "allpages": "Alle Seiten",
-       "alphaindexline": "$1 bis $2",
        "nextpage": "Nächste Seite ($1)",
        "prevpage": "Vorherige Seite ($1)",
        "allpagesfrom": "Seiten anzeigen ab:",
        "watchnologin": "Du bist nicht angemeldet",
        "addwatch": "Zur Beobachtungsliste hinzufügen",
        "addedwatchtext": "Die Seite „[[:$1]]“ wurde zu deiner [[Special:Watchlist|Beobachtungsliste]] hinzugefügt.\nSpätere Änderungen an dieser Seite und der zugehörigen Diskussionsseite werden dort gelistet.",
+       "addedwatchtext-short": "Die Seite „$1“ wurde zu deiner Beobachtungsliste hinzugefügt.",
        "removewatch": "Von der Beobachtungsliste entfernen",
        "removedwatchtext": "Die Seite „[[:$1]]“ wurde von deiner [[Special:Watchlist|Beobachtungsliste]] entfernt.",
+       "removedwatchtext-short": "Die Seite „$1“ wurde von deiner Beobachtungsliste entfernt.",
        "watch": "Beobachten",
        "watchthispage": "Seite beobachten",
        "unwatch": "Nicht mehr beobachten",
        "watchlist-details": "Du beobachtest {{PLURAL:$1|eine Seite|$1 Seiten}}, ohne dass Diskussionsseiten getrennt gezählt werden.",
        "wlheader-enotif": "Der E-Mail-Benachrichtigungsdienst ist aktiviert.",
        "wlheader-showupdated": "Seiten mit noch nicht gesehenen Änderungen werden '''fett''' dargestellt.",
-       "watchmethod-recent": "Überprüfen der letzten Bearbeitungen für die Beobachtungsliste",
-       "watchmethod-list": "Überprüfen der Beobachtungsliste nach letzten Bearbeitungen",
-       "watchlistcontains": "Deine Beobachtungsliste enthält $1 {{PLURAL:$1|Seite|Seiten}}.",
-       "iteminvalidname": "Problem mit dem Eintrag „$1“, ungültiger Name.",
        "wlnote2": "Es folgen die Änderungen der letzten {{PLURAL:$1|Stunde|<strong>$1</strong> Stunden}}. Stand: $2, $3.",
        "wlshowlast": "Zeige die Änderungen der letzten $1 Stunden, $2 Tage oder $3.",
        "watchlist-options": "Anzeigeoptionen",
        "enotif_lastvisited": "Alle Änderungen auf einen Blick: $1",
        "enotif_lastdiff": "Siehe $1 nach dieser Änderung.",
        "enotif_anon_editor": "Anonymer Benutzer $1",
-       "enotif_body": "Hallo $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nZusammenfassung des Bearbeiters: $PAGESUMMARY $PAGEMINOREDIT\n\nKontakt zum Bearbeiter:\nE-Mail: $PAGEEDITOR_EMAIL\nWiki: $PAGEEDITOR_WIKI\n\nBei weiterer Aktivität auf der Seite werden dir so lange keine weiteren Benachrichtigungs-E-Mails gesendet, bis du die Seite wieder angemeldet besucht hast. Auf deiner Beobachtungsliste kannst du alle Benachrichtigungsmarkierungen zusammen zurücksetzen.\n\nDein freundliches {{SITENAME}}-Benachrichtigungssystem\n\n--\nUm die Einstellungen der E-Mail-Benachrichtigung anzupassen, besuche {{canonicalurl:{{#special:Preferences}}}}.\n\nUm die Einstellungen deiner Beobachtungsliste anzupassen, besuche {{canonicalurl:{{#special:EditWatchlist}}}}.\n\nUm die Seite von deiner Beobachtungsliste herunterzunehmen, besuche $UNWATCHURL.\n\nRückmeldungen und weitere Hilfe: {{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Hallo $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nZusammenfassung des Bearbeiters: $PAGESUMMARY $PAGEMINOREDIT\n\nKontakt zum Bearbeiter:\nE-Mail: $PAGEEDITOR_EMAIL\nWiki: $PAGEEDITOR_WIKI\n\nBei weiterer Aktivität auf der Seite werden dir so lange keine weiteren Benachrichtigungs-E-Mails gesendet, bis du die Seite wieder angemeldet besucht hast. Auf deiner Beobachtungsliste kannst du alle Benachrichtigungsmarkierungen zusammen zurücksetzen.\n\nDein freundliches {{SITENAME}}-Benachrichtigungssystem\n\n--\nUm die Einstellungen der E-Mail-Benachrichtigung anzupassen, besuche {{canonicalurl:{{#special:Preferences}}}}.\n\nUm die Einstellungen deiner Beobachtungsliste anzupassen, besuche {{canonicalurl:{{#special:EditWatchlist}}}}.\n\nUm die Seite von deiner Beobachtungsliste herunterzunehmen, besuche $UNWATCHURL.\n\nRückmeldungen und weitere Hilfe: $HELPPAGE",
        "created": "erstellt",
        "changed": "geändert",
        "deletepage": "Seite löschen",
        "contributions-title": "Benutzerbeiträge von „$1“",
        "mycontris": "Beiträge",
        "contribsub2": "Von {{GENDER:$3|$1}} ($2)",
-       "contributions-userdoesnotexist": "Das Benutzerkonto „$1“ ist nicht registriert.",
+       "contributions-userdoesnotexist": "Das Benutzerkonto „$1“ ist nicht vorhanden.",
        "nocontribs": "Es wurden keine Benutzerbeiträge mit diesen Kriterien gefunden.",
        "uctop": "(aktuell)",
        "month": "und Monat:",
        "blockip": "IP-Adresse/Benutzer sperren",
        "blockip-legend": "IP-Adresse/Benutzer sperren",
        "blockiptext": "Mit diesem Formular sperrst du eine IP-Adresse oder einen Benutzernamen, so dass von dort keine Änderungen mehr vorgenommen werden können.\nDies sollte nur erfolgen, um Vandalismus zu verhindern und in Übereinstimmung mit den [[{{MediaWiki:Policy-url}}|Richtlinien]].\nBitte gib den Grund für die Sperre an.",
-       "ipadressorusername": "IP-Adresse oder Benutzername:",
+       "ipaddressorusername": "IP-Adresse oder Benutzername:",
        "ipbexpiry": "Sperrdauer:",
        "ipbreason": "Grund:",
        "ipbreason-dropdown": "* Allgemeine Sperrgründe\n** Einfügen falscher Informationen\n** Leeren von Seiten\n** Massenweises Einfügen externer Links\n** Einstellen unsinniger Inhalte in Seiten\n** Ungebührliches Verhalten\n** Missbrauch mit mehreren Benutzerkonten\n** Ungeeigneter Benutzername",
        "movepagetalktext": "Die dazugehörige Diskussionsseite wird, sofern vorhanden, mitverschoben, '''es sei denn:'''\n*Es existiert bereits eine Diskussionsseite mit diesem Namen, oder\n*du wählst die unten stehende Option ab.\n\nIn diesen Fällen musst du, falls gewünscht, den Inhalt der Seite von Hand verschieben oder zusammenführen.\n\nBitte den '''neuen''' Titel unter '''Ziel''' eintragen, darunter die Umbenennung bitte '''begründen.'''",
        "movearticle": "Seite verschieben:",
        "moveuserpage-warning": "'''Warnung:''' Du bist dabei, eine Benutzerseite zu verschieben. Bitte bedenke, dass dadurch nur die Benutzerseite verschoben, '''nicht''' aber der Benutzer umbenannt wird.",
+       "movecategorypage-warning": "<strong>Warnung:</strong> Du bist gerade dabei, eine Kategorieseite zu verschieben. Bitte sei dir bewusst, dass nur die Seite verschoben wird. Alle Seiten in der alten Kategorie werden <em>nicht</em> neu kategorisiert.",
        "movenologintext": "Du musst ein registrierter Benutzer und [[Special:UserLogin|angemeldet]] sein, um eine Seite zu verschieben.",
        "movenotallowed": "Du hast nicht die erforderliche Berechtigung, um Seiten verschieben zu können.",
        "movenotallowedfile": "Du hast nicht die erforderliche Berechtigung, um Dateien verschieben zu können.",
        "cant-move-user-page": "Du hast nicht die erforderliche Berechtigung, Benutzerhauptseiten verschieben zu können.",
        "cant-move-to-user-page": "Du hast nicht die Berechtigung, Seiten auf eine Benutzerseite zu verschieben (mit Ausnahme von Benutzerunterseiten).",
+       "cant-move-category-page": "Du hast keine Berechtigung, um Kategorieseiten zu verschieben.",
+       "cant-move-to-category-page": "Du hast keine Berechtigung, um eine Seite zu einer Kategorieseite zu verschieben.",
        "newtitle": "Ziel:",
        "move-watch": "Quell- und Zielseite beobachten",
        "movepagebtn": "Seite verschieben",
        "tooltip-summary": "Gib eine kurze Zusammenfassung ein.",
        "interlanguage-link-title": "$1 – $2",
        "common.css": "/* Das folgende CSS wird für alle Benutzeroberflächen geladen. */",
-       "cologneblue.css": "/* Das folgende CSS wird für Benutzer der Kölnisch-Blau-Benutzeroberfläche geladen. Für allgemeingültige Benutzeroberflächen-Anpassungen bitte [[MediaWiki:Common.css]] bearbeiten. */",
        "monobook.css": "/* Das folgende CSS wird für Benutzer der MonoBook-Benutzeroberfläche geladen */",
-       "modern.css": "/* Das folgende CSS wird für Benutzer der Modern-Benutzeroberfläche geladen. Für allgemeingültige Benutzeroberflächen-Anpassungen bitte MediaWiki:Common.css bearbeiten. */",
        "vector.css": "/* Das folgende CSS wird für Benutzer der Vector-Benutzeroberfläche geladen. Für allgemeingültige Benutzeroberflächen-Anpassungen bitte [[MediaWiki:Common.css]] bearbeiten. */",
        "print.css": "/* Das folgende CSS wird in der Druckausgabe geladen. */",
        "noscript.css": "/* Das folgende CSS wirkt sich für Benutzer aus, die JavaScript deaktiviert haben */",
        "group-sysop.css": "/* CSS an dieser Stelle wirkt sich nur auf Administratoren aus */",
        "group-bureaucrat.css": "/* Das folgende CSS wird nur für Bürokraten geladen. */",
        "common.js": "/* Das folgende JavaScript wird für alle Benutzer geladen. */",
-       "cologneblue.js": "/* Das folgende JavaScript wird für Benutzer der Kölnisch-Blau-Benutzeroberfläche geladen. Allgemeingültiges JavaScript bitte in [[MediaWiki:Common.js]] eintragen. */",
        "monobook.js": "/* Das folgende JavaScript wird für Benutzer der Monobook-Benutzeroberfläche geladen. */",
-       "modern.js": "/* Das folgende JavaScript wird für Benutzer der Modern-Benutzeroberfläche geladen. Allgemeingültiges JavaScript bitte in [[MediaWiki:Common.js]] eintragen. */",
        "vector.js": "/* Das folgende JavaScript wird für Benutzer der Vector-Benutzeroberfläche geladen. Allgemeingültiges JavaScript bitte in [[MediaWiki:Common.js]] eintragen. */",
        "group-autoconfirmed.js": "/* Das folgende JavaScript wird nur für automatisch bestätigte Benutzer geladen. */",
        "group-user.js": "/* Das folgende JavaScript wird nur für angemeldete Benutzer geladen. */",
        "group-bot.js": "/* Das folgende JavaScript wird nur für Bots geladen. */",
        "group-sysop.js": "/* Das folgende JavaScript wird nur für Administratoren geladen. */",
        "group-bureaucrat.js": "/* Das folgende JavaScript wird nur für Bürokraten geladen. */",
-       "notacceptable": "Der Wiki-Server kann die Daten nicht für dein Ausgabegerät aufbereiten.",
        "anonymous": "{{PLURAL:$1|Unangemeldeter Benutzer|Unangemeldete Benutzer}} auf {{SITENAME}}",
        "siteuser": "{{SITENAME}}-{{GENDER:$2|Benutzer|Benutzerin|Benutzer}} $1",
        "anonuser": "Anonymer {{SITENAME}}-Benutzer $1",
        "pageinfo-category-pages": "Anzahl der Seiten",
        "pageinfo-category-subcats": "Anzahl der Unterkategorien",
        "pageinfo-category-files": "Anzahl der Dateien",
-       "skinname-cologneblue": "Kölnisch Blau",
        "skinname-monobook": "MonoBook",
-       "skinname-modern": "Modern",
        "skinname-vector": "Vector",
        "markaspatrolleddiff": "Als kontrolliert markieren",
        "markaspatrolledtext": "Diese Seite als kontrolliert markieren",
        "newimages-summary": "Diese Spezialseite zeigt die zuletzt hochgeladenen Dateien an.",
        "newimages-legend": "Filter",
        "newimages-label": "Dateiname (oder ein Teil davon):",
-       "showhidebots": "(Bots $1)",
+       "newimages-showbots": "Uploads von Bots anzeigen",
        "noimages": "Keine Dateien gefunden.",
        "ilsubmit": "Suchen",
        "bydate": "nach Datum",
        "scarytranscludefailed": "[Vorlageneinbindung für $1 ist gescheitert]",
        "scarytranscludefailed-httpstatus": "[Vorlagenabruf fehlgeschlagen für $1: HTTP  $2]",
        "scarytranscludetoolong": "[URL ist zu lang]",
-       "deletedwhileediting": "Achtung: Diese Seite wurde gelöscht, nachdem du angefangen hast sie zu bearbeiten!\nIm [{{fullurl:{{#special:Log}}|type=delete&page={{FULLPAGENAMEE}}}} Lösch-Logbuch] findest du den Grund für die Löschung. Wenn du die Seite speicherst, wird sie neu angelegt.",
+       "deletedwhileediting": "Achtung: Diese Seite wurde gelöscht, nachdem du angefangen hast, sie zu bearbeiten!\nIm [{{fullurl:{{#special:Log}}|type=delete&page={{FULLPAGENAMEE}}}} Lösch-Logbuch] findest du den Grund für die Löschung. Wenn du die Seite speicherst, wird sie neu angelegt.",
        "confirmrecreate": "Benutzer [[User:$1|$1]] ([[User talk:$1|Diskussion]]) hat diese Seite gelöscht, nachdem du angefangen hast, sie zu bearbeiten. Die Begründung lautete:\n:''$2''\nBitte bestätige, dass du diese Seite wirklich neu erstellen möchten.",
        "confirmrecreate-noreason": "Benutzer [[User:$1|$1 ]] ([[User talk:$1|Diskussion]]) hat diese Seite gelöscht, nachdem du mit der Bearbeitung begonnen hast. Bitte bestätige, dass du die Seite wirklich erneut erstellen möchtest.",
        "recreate": "Erneut anlegen",
        "size-bytes": "$1 Bytes",
        "size-megabytes": "$1 MB",
        "size-gigabytes": "$1 GB",
-       "livepreview-loading": "Lade …",
-       "livepreview-ready": "Laden … Fertig!",
-       "livepreview-failed": "Die Vorschau kann nicht sofort angezeigt werden!\nBitte nutze die reguläre Vorschau.",
-       "livepreview-error": "Verbindung nicht möglich: $1 „$2“. Bitte die normale Vorschau benutzen.",
        "lag-warn-normal": "Bearbeitungen der letzten {{PLURAL:$1|Sekunde|$1 Sekunden}} werden in dieser Liste noch nicht angezeigt.",
        "lag-warn-high": "Auf Grund hoher Datenbankauslastung werden die Bearbeitungen der letzten {{PLURAL:$1|Sekunde|$1 Sekunden}} noch nicht in dieser Liste angezeigt.",
-       "watchlistedit-numitems": "Deine Beobachtungsliste enthält {{PLURAL:$1|einen Eintrag|$1 Einträge}}. Die Diskussionsseiten wurden dabei nicht mitgezählt.",
-       "watchlistedit-noitems": "Deine Beobachtungsliste ist leer.",
        "watchlistedit-normal-title": "Beobachtungsliste bearbeiten",
        "watchlistedit-normal-legend": "Einträge von der Beobachtungsliste entfernen",
        "watchlistedit-normal-explain": "Dies sind die Einträge deiner Beobachtungsliste. Um Einträge zu entfernen, markiere die Kästchen neben den Einträgen und klicke am Ende der Seite auf „{{int:Watchlistedit-normal-submit}}“. Du kannst deine Beobachtungsliste auch im [[Special:EditWatchlist/raw|Listenformat bearbeiten]].",
        "watchlistedit-raw-done": "Deine Beobachtungsliste wurde gespeichert.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Ein Eintrag wurde|$1 Einträge wurden}} hinzugefügt:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Ein Eintrag wurde|$1 Einträge wurden}} entfernt:",
+       "watchlistedit-clear-title": "Beobachtungsliste leeren",
+       "watchlistedit-clear-legend": "Beobachtungsliste leeren",
+       "watchlistedit-clear-explain": "Alle Seitennamen werden von deiner Beobachtungsliste entfernt.",
+       "watchlistedit-clear-titles": "Seitennamen:",
+       "watchlistedit-clear-submit": "Beobachtungsliste leeren (Dies ist dauerhaft!)",
+       "watchlistedit-clear-done": "Deine Beobachtungsliste wurde geleert.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|Ein Seitenname wurde|$1 Seitennamen wurden}} entfernt:",
+       "watchlistedit-too-many": "Es gibt hier zu viele Seiten zum Anzeigen.",
+       "watchlisttools-clear": "Beobachtungsliste leeren",
        "watchlisttools-view": "Beobachtungsliste: Änderungen",
        "watchlisttools-edit": "normal bearbeiten",
        "watchlisttools-raw": "im Listenformat bearbeiten (Import/Export)",
        "compare-invalid-title": "Der angegebene Seitenname ist ungültig.",
        "compare-title-not-exists": "Der angegebene Seitenname ist nicht vorhanden.",
        "compare-revision-not-exists": "Die angegebene Version ist nicht vorhanden.",
-       "dberr-header": "Dieses Wiki hat ein Problem",
        "dberr-problems": "Entschuldigung. Diese Seite hat momentan technische Schwierigkeiten.",
        "dberr-again": "Warte einige Minuten und versuche dann neu zu laden.",
        "dberr-info": "(Kann keine Verbindung zum Datenbank-Server herstellen: $1)",
        "htmlform-no": "Nein",
        "htmlform-yes": "Ja",
        "htmlform-chosen-placeholder": "Wähle eine Option",
+       "htmlform-cloner-create": "Weitere hinzufügen",
+       "htmlform-cloner-delete": "Entfernen",
+       "htmlform-cloner-required": "Es ist mindestens ein Wert erforderlich.",
        "sqlite-has-fts": "Version $1 mit Unterstützung für die Volltextsuche",
        "sqlite-no-fts": "Version $1 ohne Unterstützung für die Volltextsuche",
        "logentry-delete-delete": "$1 {{GENDER:$2|löschte}} Seite $3",
index 00edca9..80ee57c 100644 (file)
@@ -18,7 +18,8 @@
                        "Sahim",
                        "Xoser",
                        "Geitost",
-                       "Microchip08"
+                       "Microchip08",
+                       "아라"
                ]
        },
        "tog-underline": "Bınê gırey de xete bance:",
        "moredotdotdot": "Vêşi...",
        "morenotlisted": "Vêşi lista nêbi...",
        "mypage": "Per",
-       "mytalk": "Werênayış",
+       "mytalk": "Mesac",
        "anontalk": "Pela werênayışê nê IPy",
        "navigation": "Pusula",
        "and": "&#32;u",
        "vector-action-unprotect": "Starkerdışi bıvurne",
        "vector-view-create": "Vıraze",
        "vector-view-edit": "Bıvurne",
-       "vector-view-history": "Verênan bıvêne",
+       "vector-view-history": "Tarixê pele bıvêne",
        "vector-view-view": "Bıwane",
        "vector-view-viewsource": "Çımey bıvêne",
        "actions": "Hereketi",
-       "namespaces": "Cayê namey",
+       "namespaces": "Heruna naman",
        "variants": "Varyanti",
        "navigation-heading": "Menuyê navigasyoni",
        "errorpagetitle": "Xeta",
        "view": "Bıvêne",
        "view-foreign": "$1'i bıvin",
        "edit": "Bıvurne",
-       "edit-local": "Lokal şınasnayışi bıvurne",
+       "edit-local": "Şınasnayışê lokali bıvurne",
        "create": "Vıraze",
-       "create-local": "Lokal şınasnayış de ke",
+       "create-local": "Şınasnayışê lokali cı ke",
        "editthispage": "Ena pele bıvurne",
        "create-this-page": "Na pele bınuse",
        "delete": "Bestere",
        "unprotectthispage": "Starkerdışe ena peler bıvurne",
        "newpage": "Pela newiye",
        "talkpage": "Ena pele sero werêne",
-       "talkpagelinktext": "Werênayış",
+       "talkpagelinktext": "Vatenayış",
        "specialpage": "Pela xısusiye",
        "personaltools": "Hacetê şexsiy",
        "postcomment": "Qısımo newe",
        "articlepage": "Pela zerreki bıvêne",
-       "talk": "Werênayış",
+       "talk": "Vatenkerdış",
        "views": "Asayışi",
        "toolbox": "Haceti",
        "userpage": "Pela karberi bıvêne",
        "page-atom-feed": "\"$1\" Cıresnayışê atomi",
        "feed-atom": "Atom",
        "feed-rss": "RSS",
-       "red-link-title": "$1 (çınya)",
+       "red-link-title": "$1 (pele çıniya)",
        "sort-descending": "Rêzkerdışo kêmbiyaye",
        "sort-ascending": "Rêzkerdışo zêdiyaye",
        "nstab-main": "Wesiqe",
        "databaseerror-textcl": "Zu ğetaya erdamalumati persayışi ameya meydan.",
        "databaseerror-query": "Perskerdış:$1",
        "databaseerror-function": "Fonksiyon: $1",
-       "databaseerror-error": "Xırab: $1",
+       "databaseerror-error": "Xeta: $1",
        "laggedslavemode": "Diqet: Pel de newe vıraşteyi belka çini .",
        "readonly": "database kılit biyo",
        "enterlockreason": "Database kılit biyo",
        "readonly_lag": "Daegeh (database) otomatikmen kılit bi, sureo ke  daegehê bınêni resay daegehê serêni.",
        "internalerror": "Xeta zerreki",
        "internalerror_info": "Xeta zerreki: $1",
-       "fileappenderrorread": "Surey pırakerdene de \"$1\" nêşa bıwaniyo.",
-       "fileappenderror": "Dosyayê \"$1\" têyor nêbeno dosyayê \"$2\" ri.",
        "filecopyerror": "\"$1\" qaydê na \"$2\" dosya nêbeno.",
        "filerenameerror": "nameyê \"$1\" dosya nêvuriya no name \"$2\" ri.",
        "filedeleteerror": "Na \"$1\" dosya hewn a nêşi .",
        "directorycreateerror": "\"$1\" rêzkiyê ey nêvırazya",
        "filenotfound": "Na \"$1\" dosya nêasena.",
-       "fileexistserror": "\"$1\" nênusiya dosya re çunke : na dosya ca ra esta",
        "unexpected": "Endek texmin nêbeni: \"$1\"=\"$2\".",
        "formerror": "Xeta: Form nêerşawiyeno",
        "badarticleerror": "Kar  ke şıma kenê, qebul nêbi.",
        "cannotdelete": "Pel  \"$1\" o ke şıma nişane kerd hewn a neşı.\nBelka yewna ten kerdo hewn a.",
-       "cannotdelete-title": "Å\9fıma  \"$1\" nê Å\9fenê besternê.",
+       "cannotdelete-title": "Å\9eıma nêÅ\9fenê pela \"$1\" besterê",
        "delete-hook-aborted": "Esterıtışi terefê çengeli ra ibtal bi.\nQet tesrih beyan nêbi.",
        "no-null-revision": "Qandé \"$1\" zew rewizyono newe névıraziya.",
        "badtitle": "Sernameo xırabın",
        "yourpasswordagain": "Parola reyna bınusne:",
        "createacct-yourpasswordagain": "Parola tesdiq ke",
        "createacct-yourpasswordagain-ph": "Parola fına cıkewe",
-       "remembermypassword": "Parola mı nê cıgeyrayoği de bia xo viri (seba tewr zêde $1 {{PLURAL:$1|roce|rocan}})",
+       "remembermypassword": "Parola mı nê cıgeyrayoği de biya xo viri (seba tewr zêde $1 {{PLURAL:$1|roce|rocan}})",
        "userlogin-remembermypassword": "Mı biya xo viri",
        "userlogin-signwithsecure": "Ebe teqdimkerê asayişın cıkewe",
        "yourdomainname": "Nameyê şıma yo meydani",
        "userlogin-helplink2": "Heqde ronıştışi peşti",
        "userlogin-loggedin": "Tı xora namey {{GENDER:$1|$1}} ra kewtê/kewtay cı.\nFormê cêrêni bıgureyne ke namey karberio bin ra cı kewê.",
        "userlogin-createanother": "Zewbi hesab vıraz",
-       "createacct-join": "Cêr melumatê xo cı ke",
-       "createacct-another-join": "Malumata hesabdé ğoye newi dekeré cér.",
        "createacct-emailrequired": "Adresa e-postey",
        "createacct-emailoptional": "Adresa e-postey (mecburi niya)",
        "createacct-email-ph": "Adresa e-posteyê xo cıkewe",
        "hr_tip": "Xeta verardiye (teserrufın bıgureyne/bıxebetne)",
        "summary": "Xulasa:",
        "subject": "Mewzu/sernuşte:",
-       "minoredit": "No vırnayışê do werdiyo",
-       "watchthis": "'''Ena pele seyr ke'''",
+       "minoredit": "No yew vurnayışo werdiyo",
+       "watchthis": "Ena pele seyr ke",
        "savearticle": "Pele qeyd ke",
        "preview": "Verqayt",
        "showpreview": "Verqayti bımocne",
-       "showlivepreview": "Verqayto cınde (giyane)",
        "showdiff": "Vurnayışan bımocne",
        "anoneditwarning": "İqaz!: Şıma be hesabê xo nêkewtê cı. \nAdresê şımaê IP tarixê vırnayışê na pele de do qeyd bo.",
        "anonpreviewwarning": "\"Şıma be hesabê xo nêkewtê cı. Eke qeyd kerê, adresê şımaê IP tarixê vırnayışê na pele de do qeyd bo.\"",
        "edit-gone-missing": "Pel rocanebiyaye niyo.\nHewna kerde aseno.",
        "edit-conflict": "Têverabiyayışê vurnayışi.",
        "edit-no-change": "Vurnayişê şıma qebul nêbı, çunke nuşte de yew vurnayiş n3evıraziya.",
-       "postedit-confirmation": "Vurnayışê to qeyd bi.",
+       "postedit-confirmation-created": "Pele vıraziye.",
+       "postedit-confirmation-restored": "Pele anciya vıraziye.",
+       "postedit-confirmation-saved": "Vurnayışê to qeyd bi.",
        "edit-already-exists": "Pelo newe nêvıraziyeno.\nPel ca ra esto.",
        "defaultmessagetext": "Metnê mesacê hesabiyayey",
        "content-failed-to-parse": "Qandê madela $3 zereyê $1, $2 sero nêagozyayo",
        "mergehistory-empty": "Revizyonî yew nibenê.",
        "mergehistory-success": "$3 {{PLURAL:$3|revizyonê|revizyonê}} [[:$1]] u [[:$2]] yew biyê.",
        "mergehistory-fail": "Tarixê pele yew nibeno, ma rica kenê ke pel u wext control bike.",
-       "mergehistory-no-source": "Pela çime $1 çini yo.",
+       "mergehistory-no-source": "Pela çımeyê $1 çıniya.",
        "mergehistory-no-destination": "Pela destinasyoni $1 çini yo.",
        "mergehistory-invalid-source": "Pela çime gani yew seroğê raşt biy.",
        "mergehistory-invalid-destination": "Pela destinasyonî gani yew seroğê raşt biy.",
        "searchmenu-exists": "''Ena 'Wikipediya de ser \"[[:$1]]\" yew pel esto'''",
        "searchmenu-new": "<strong>Na wiki de pela \"[[:$1]]\" vıraze!</strong> {{PLURAL:$2|0=|Sewbina pela ke şıma geyrayê cı aye bıvênê.|Yew zi neticanê cıgeyrayışê xo bıvênê.}}",
        "searchprofile-articles": "Pelê tedeestey",
-       "searchprofile-project": "Pelê peşti û procey",
        "searchprofile-images": "Multimedya",
        "searchprofile-everything": "Heme çi",
        "searchprofile-advanced": "Raverşiyaye",
        "searchprofile-articles-tooltip": "$1 de cı geyré",
-       "searchprofile-project-tooltip": "$1 de bigêre",
        "searchprofile-images-tooltip": "Dosya cı geyr",
        "searchprofile-everything-tooltip": "Tedeestey hemine cı geyre (pelanê mınaqeşey zi tey)",
        "searchprofile-advanced-tooltip": "qe cayê nimeyî bigêre",
        "search-nonefound": "Zey perskerdışê şıma netice nêvêniya.",
        "powersearch-legend": "Cıgeyrayışo hera",
        "powersearch-ns": "Cayanê nameyan de cıgeyrayış:",
-       "powersearch-redir": "Listeya hetenayışan",
        "powersearch-togglelabel": "Kontrol ke:",
        "powersearch-toggleall": "Pêro",
        "powersearch-togglenone": "Çıniyo",
        "prefs-edits": "Amarê vurnayışan:",
        "prefsnologintext2": "Reca kem  sazé tercihané karberi $1.",
        "prefs-skin": "Çerme",
-       "skin-preview": "Verasayış",
+       "skin-preview": "Verqayt",
        "datedefault": "Tercih çıniyo",
        "prefs-labs": "Xacetê labs",
        "prefs-user-pages": "Pela Karberi",
        "recentchangescount": "Amarê vurnayışê ke hesıbyaye deye bımocneyê:",
        "prefs-help-recentchangescount": "Ney de vurnayışê peyêni, tarixê pelan u cıkewteni asenê.",
        "prefs-help-watchlist-token2": "Na pawıtış nımnayi kılta listada şımaya.\nOke kıliti zano şeno listeya tamaşann bıvino. Poğta coy ra kesiya me hesırne. \n[[Special:ResetTokens|Na kıliti reset kerdışi re tiyay bıploğne]].",
-       "savedprefs": "Tecihey şıma qeyd biyey.",
+       "savedprefs": "Tecihê şıma qeyd biy.",
        "timezonelegend": "Warey saete:",
        "localtime": "saeta mehelliye:",
        "timezoneuseserverdefault": "Zey karkerdışê Wiki ($1)",
        "timezoneregion-pacific": "Okyanuso Pasifik",
        "allowemail": "Karberê bini wa bışê mı rê e-posta bırışê.",
        "prefs-searchoptions": "Cı geyre",
-       "prefs-namespaces": "Cayê namey",
+       "prefs-namespaces": "Heruna naman",
        "defaultns": "Eke heni, enê cayanê namey de cı geyre (sae ke):",
        "default": "qısur",
        "prefs-files": "Dosyey",
        "prefs-emailconfirm-label": "Tesdiqiya E-posta:",
        "youremail": "E-Mail (mecbur niyo) *:",
        "username": "{{GENDER:$1|Nameyê karberi}}:",
-       "uid": "Kamiya {{GENDER:$1|karberi}}:",
        "prefs-memberingroups": "{{GENDER:$2|Ezayê}} {{PLURAL:$1|grube|gruban}}:",
        "prefs-memberingroups-type": "$1",
        "prefs-registration": "Wextê qeydbiyayışi",
        "prefs-advancedsearchoptions": "Tercihê raverberdey",
        "prefs-advancedwatchlist": "Tercihê raverberdey",
        "prefs-displayrc": "Tercihan bımocne",
-       "prefs-displaysearchoptions": "Weçinayışê mocnayışi",
        "prefs-displaywatchlist": "Weçinayışê mocnayışi",
        "prefs-tokenwatchlist": "Morge",
        "prefs-diffs": "Ferqi",
        "recentchanges-noresult": "Goreyê kriteranê kıfşkerdeyan ra qet yew vurnayış nêvêniya.",
        "recentchanges-feed-description": "Ena feed dı vurnayişanê tewr peniyan teqip bık.",
        "recentchanges-label-newpage": "Enê vurnayışi ra yew pela newiye vıraziye",
-       "recentchanges-label-minor": "Eno yew vurnayışo werdiyo",
+       "recentchanges-label-minor": "No yew vurnayışo werdiyo",
        "recentchanges-label-bot": "Eno vurnayış terefê yew boti ra vıraziyo",
        "recentchanges-label-unpatrolled": "Eno vurnayış hewna dewriya nêbiyo",
        "recentchanges-label-plusminus": "Ebadê pele de bazê bayti de vayeyê cı",
        "recentchanges-legend-newpage": "([[Special:NewPages|Lista pelanê neweyan]] zi bıvêne)",
        "recentchanges-legend-plusminus": "''(±123)''",
        "rcnotefrom": "Cêr de <strong>$2</strong> ra nata vurnayışiyê asenê (tewr vêşi <strong>$1</strong> asenê).",
-       "rclistfrom": "$1 ra tepiya vurnayışanê neweyan bımocne",
+       "rclistfrom": "$3 $2 ra tepiya vurnayışanê neweyan bımocne",
        "rcshowhideminor": "Vurnayışanê werdiyan $1",
        "rcshowhideminor-show": "Bımocne",
        "rcshowhideminor-hide": "Bınımne",
        "filename-toolong": "Nameyê dosyayan 240 bayt ra derg do nêbo.",
        "badfilename": "Nameyanê dosyayî ''$1'' rê vurneyî biye.",
        "filetype-mime-mismatch": "Derg kerdıştê Dosyada \".$1\" u ($2) MIME tipiya cıya pêro nina.",
-       "filetype-badmime": "Dosyaye ke tipê MIME \"$1\"î de bar nibeno.",
+       "filetype-badmime": "Dosyeyê ke tipê MIME \"$1\" derê nêşenê bar bıbê.",
        "filetype-bad-ie-mime": "na dosya bar nebena çunke Internet Explorer na dosya \"$1\" zerarın vinena.",
        "filetype-unwanted-type": "'''\".$1\"''' na tewırê dosyayi nêwazyena. pêşniyaz biyaye {{PLURAL:$3|tewırê dosyayi|tewırê dosyayi}} $2.",
        "filetype-banned-type": "'''\".$1\"''' {{PLURAL:$4|Ena babeta dosya qebul ne vinena|Ena babeta dosya qebul ne vinena|Ena babeta dosya qebul ne vinena}}. Eke cırê izin deyayo $2. {{PLURAL:$3|Babatan dosyayan|babeta dosyayan}}",
        "uploadwarning-text": "Bînê de deskripyonê dosyayî bivurne u reyna qeyd bike.",
        "savefile": "Dosya qeyd ke",
        "uploadedimage": "\"[[$1]]\" bar bi",
-       "overwroteimage": "yew versiyonê newvî ye \"[[$1]]\"î bar bike",
+       "overwroteimage": "yew versiyonê \"$1\" newe bar bi",
        "uploaddisabled": "bar kerdişî iptal biyo",
        "copyuploaddisabled": "URL bar kerdiş kefiliyeyo.",
-       "uploaddisabledtext": "Bar kerdişê dosyayî iptal biyo",
+       "uploaddisabledtext": "Barkerdışê dosya dewre ra veta.",
        "php-uploaddisabledtext": "barkerdışê dosyayê PHP nıka çino. kerem kere eyarê file_uploads korol bıkerê.",
        "uploadscripted": "Ena dosya de yew HTML ya zi kodê scriptî este ke belki browserê webî fam nikeno.",
        "uploadinvalidxml": "Dosyaya barkerdiye de XML nêgureniya.",
        "upload-copy-upload-invalid-domain": "Na domain ra kopyayê barkerdışanê nêbenê.",
        "backend-fail-stream": "$1 nê vırazeyê",
        "backend-fail-backup": "$1 nê wendeyê",
-       "backend-fail-notexists": "$1 name dı dosya çına.",
+       "backend-fail-notexists": "Dosyaya $1 çıniya.",
        "backend-fail-hashes": "Şınasiya dosyaya gırotışê cı nêgêriya.",
        "backend-fail-notsame": "Zey $1 ju dosya xora  esta.",
        "backend-fail-invalidpath": "$1 rayê da depo kerdışa raştay niya.",
        "zip-unsupported": "Dosya MediaWiki ra ZIP dosyaya nêwanêna yana derganiya ZIP de cı aya pıro nina. Kontrolê emeleyey oyo veş nêbeno.",
        "uploadstash": "Nımıtışê barkerdışi",
        "uploadstash-summary": "Na pela barkerdış (yana hewna barbenayış dı) hema hewna wiki'dedosyeyê ke nêpêseryayê enarê rasayış gre danop. Enê dosyay o ke a dosya keno bar tek o şena a dosya bıvino.",
-       "uploadstash-clear": "Dosyeyê ke idareten bıvıryê ena besternê",
+       "uploadstash-clear": "Dosyeyanê ke idareten vuriyenê inan bestere",
        "uploadstash-nofiles": "Dosyeyê ke idareten bıvıryê çınyê.",
        "uploadstash-badtoken": "Karkerdışê cı nêbı, muhtemelen desture şımayê timarkerdışi zeman do şıma ravêrdo. Fına bıcerbnê.",
        "uploadstash-errclear": "Besternayışê dosyayan nêbı",
        "uploadstash-refresh": "Listanê dosyayan aneweke",
        "invalid-chunk-offset": "Ofseto nêravyarde",
        "img-auth-accessdenied": "Cıresnayış vındarnayo.",
-       "img-auth-nopathinfo": "PATH_INFO kemiyo.\nTeqdimkerê şıma seba ravurnayışê nê melumati eyar nêkerdo.\nBeno ke be CGI-bıngeyın bo u img_auth rê desteg nêbeno.\nhttps://www.mediawiki.org/wiki/Manual:Image_Authorization Selahiyetê resımi bıvêne.",
+       "img-auth-nopathinfo": "PATH_INFO kemiyo.\nTeqdimkerê şıma seba ravurnayışê nê melumati eyar nêkerdo.\nBeno ke be CGI-bıngeyın bo u img_auth rê desteg nêbeno.\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization Selahiyetê resımi bıvêne.",
        "img-auth-notindir": "Patikayê ke ti wazeno direktorê bar biyayişî de çin o.",
        "img-auth-badtitle": "\"$1\" ra nieşkeno yew seroğê raştî virazî.",
        "img-auth-nologinnWL": "Ti cikewte ni yo u \"$1\" listeyo sipê de çin o.",
-       "img-auth-nofile": "Dosyayê ''$1''î çin o.",
+       "img-auth-nofile": "Dosyaya ''$1'' çıniya.",
        "img-auth-isdir": "\"$1\" şıma gêrenî bıresî tiya.\nşıma têna eşkenî bıresi dosya.",
        "img-auth-streaming": "\"$1\" stream keno.",
        "img-auth-public": "img_auth.php'nin fonksiyonê ney; wiki ra dosyaya xususiyan vetışo.\nno wiki bı umumi eyar biyo.\nqey pawıtışi, img_auth.php battal verdiyayo.",
        "filehist-nothumb": "Thumbnail çin o.",
        "filehist-user": "Karber",
        "filehist-dimensions": "Ebati",
-       "filehist-filesize": "Ebatê dosyayî",
+       "filehist-filesize": "Ebata dosya",
        "filehist-comment": "Vacayış",
        "imagelinks": "Gurenayışê dosya",
        "linkstoimage": "Ena {{PLURAL:$1|pela|$1 pela}} gıreye ena dosya:",
        "filerevert-comment": "Sebeb:",
        "filerevert-defaultcomment": "Versiyonê $2, $1 rê reyna ard",
        "filerevert-submit": "Reyna biyere",
-       "filerevert-success": "'''[[Media:$1|$1]]''', [$4 versiyonê $3, $2]î reyna berd.",
+       "filerevert-success": "'''[[Media:$1|$1]]''' peyser çarna ra [versiyonanê $4, $3, $2].",
        "filerevert-badversion": "Vesiyonê lokalê verniyê eno dosya pê ena pulêwext de çin o.",
        "filedelete": "$1 bestere",
        "filedelete-legend": "Dosya bestere",
        "filedelete-comment": "Sebeb:",
        "filedelete-submit": "Bestere",
        "filedelete-success": "'''$1'''  esteriyayo.",
-       "filedelete-success-old": "Versiyonê'''[[Media:$1|$1]]'''î $3, $2 esteriyayo.",
+       "filedelete-success-old": "Versiyonê '''[[Media:$1|$1]]''' be tarixê $3, $2 ra esteriya.",
        "filedelete-nofile": "'''$1''' çin o.",
        "filedelete-nofile-old": "Versiyonê arşivi ye '''$1'''î pê enê detayanê xasî çin o.",
        "filedelete-otherreason": "Sebebo bin/ilaweyın:",
        "download": "bar ke",
        "unwatchedpages": "Pelanê seyrnibiyeyî",
        "listredirects": "Listeya Hetenayışan",
+       "listduplicatedfiles": "Lista dosyeyanê ke kopyaya cı vêniyena",
        "unusedtemplates": "Şablonê ke nê xebtênê",
        "unusedtemplatestext": "no pel, {{ns:template}} pelê ke pelê binan de nêaseni, ninan keno.",
        "unusedtemplateswlh": "linkanê binî",
        "randompage": "Pela raştameyiye",
-       "randompage-nopages": "Ena {{PLURAL:$2|cayêname|cayênameyî}} de enê pelan çin o: $1.",
+       "randompage-nopages": "Na {{PLURAL:$2|heruna namey|heruna nameyan}} de nê peli çıniyê: $1.",
        "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": "Ena cayênameyê \"$1\"î de redereksiyonî çin o.",
+       "randomredirect-nopages": "Cayê nameyê \"$1\" de serşıkıtışi çıniyê.",
        "statistics": "İstatistiki",
        "statistics-header-pages": "İstatistikê pele",
        "statistics-header-edits": "Îstatistikê vurnayîşî",
        "statistics-pages-desc": "Pelanê hemî ke wîkî de estê, pelanê mineqeşeyî, redireksiyon ucb... dehil o.",
        "statistics-files": "Dosyayê bar biye",
        "statistics-edits": "{{SITENAME}} saz kerdış ra hetana newke amora vırnayışan",
-       "statistics-edits-average": "Ser her pele de amarê vurnayîşîyê averageyî",
+       "statistics-edits-average": "Her pele sero nısbi vurnayış",
        "statistics-views-total": "Yekunî bivîne",
        "statistics-views-total-desc": "Peleyê ke çınyê yana xısusiyê e nina zerre nêkerdê",
        "statistics-views-peredit": "Ser her vurnayîşî de vînayîşî",
        "pageswithprop-prophidden-binary": "Erca dıdıyına ($1) nımneyé",
        "doubleredirects": "Serşıkıtışê dıleti",
        "doubleredirectstext": "no pel pelê ray motışani liste keno.\ngıreyê her satıri de gıreyi; raş motışê yewın u dıyıni esto.\n<del>serê ey nuşteyi</del> safi biye.",
-       "double-redirect-fixed-move": "[[$1]] kırışiya, hıni ray dana [[$2]] no pel",
-       "double-redirect-fixed-maintenance": "raçarnayışo dıletê [[$1]] ra  pela da [[$2]] timarêno",
+       "double-redirect-fixed-move": "[[$1]] kırışiye.\nNa otomatikmen biye rocaniye û nıka [[$2]] ser şıknena.",
+       "double-redirect-fixed-maintenance": "Serkışışteno dıletê [[$1]] ra  pela da [[$2]] vuriyeno.",
        "double-redirect-fixer": "Fixerî redirek bike",
        "brokenredirects": "Hetenayışê vengi",
        "brokenredirectstext": "Redireksiyonê ey ki pelanê hama çiniyeno ra link dano:",
        "specialpage-empty": "Seba na rapore netice çıniyo.",
        "lonelypages": "Pelê seyi",
        "lonelypagestext": "Ena pelî link nibiyê ya zi pelanê binî {{SITENAME}} de transclude biy.",
-       "uncategorizedpages": "Pelayanê ke kategorî nibiye",
-       "uncategorizedcategories": "Kategoriyê ke bê kategorîyê",
+       "uncategorizedpages": "Pelê ke kategorize nêbiyê",
+       "uncategorizedcategories": "Kategoriyê ke kategorize nêbiyê",
        "uncategorizedimages": "Dosyayê ke bê kategoriyê",
        "uncategorizedtemplates": "Şablonê ke bêkategoriyê",
-       "unusedcategories": "Kategoriyê ke nê xebtênê",
+       "unusedcategories": "Kategoriyê ke nêgureniyê",
        "unusedimages": "Dosyeyê ke nê xebtênê",
        "popularpages": "Pelî ke populer o.",
-       "wantedcategories": "Kategoriye ke waştênê",
+       "wantedcategories": "Kategoriyê ke waziyayê",
        "wantedpages": "Peleye ke waştênê",
        "wantedpages-badtitle": "sernuşte meqbul niyo: $1",
        "wantedfiles": "Dosyeyê cıgeyriyayey",
        "wantedfiletext-nocat": "Dosyeyê cêrêni estê lekin karnêvıstê. Dosyeyê xeribi liste benê. bo babeta dano <del>ateber</del>",
        "wantedtemplates": "Şablonê ke waziyenê",
        "mostlinked": "Pelî ke tewr zafî lînk bîy.",
-       "mostlinkedcategories": "Kategorî ke tewr zafî lînk bîy.",
+       "mostlinkedcategories": "Kategoriyê ke tewr zehf meqaley tede estê",
        "mostlinkedtemplates": "Şablonê ke tewr zafî pela re gıre bîye.",
        "mostcategories": "Pelan ke tewr zaf kategorî estê.",
        "mostimages": "Dosyayan ke tewr zaf link estê.",
        "deadendpagestext": "Ena pelan ke {{SITENAME}} de zerrî ey de link çini yo.",
        "protectedpages": "Pelê pawıtiyey",
        "protectedpages-indef": "têna pawıteyê bêmuddeti",
-       "protectedpages-summary": "têna pawıteyê têdimî",
+       "protectedpages-summary": "Listeya ena peler newke pawıtiya.Sername de  ena lista rê pawıte vıraştışi rê [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]] bıvinê.",
        "protectedpages-cascade": "Kilit biyaye ke teyna cascadiye",
        "protectedpages-noredirect": "Hetenayışan bınımnê",
        "protectedpagesempty": "pê ney parametreyan pelê pawiteyi çinî",
        "move": "Bere",
        "movethispage": "Ena pele bere",
        "unusedimagestext": "Enê dosyey estê, feqet zerrey yew pele de wedardey niyê.\nXo vira mekerê ke, sıteyê webiê bini şenê direkt ebe URLi yew dosya ra gırê bê, u wına şenê verba gurênayışo feal de tiya hewna lista bê.",
-       "unusedcategoriestext": "kategoriyê cêrıni bıbo zi çı nêşuxulyena.",
+       "unusedcategoriestext": "Kategoriyê ke cêr derê, nê bıbê zi, terefê qet madeyan ya zi kategoriyan ra nêgureniyenê.",
        "notargettitle": "Hedef çini yo",
        "notargettext": "qey xebıtnayişê ney fonksiyoni şıma yew hedef nişane nêkerd.",
        "nopagetitle": "wina yew pelê hedefi çin o.",
        "log-title-wildcard": "sername yê ke pê ney nuşteyi destkenêpê bıgêr.",
        "showhideselectedlogentries": "Qeydê weçinayışê bımocne/bınımne dekerê",
        "allpages": "Peli pêro",
-       "alphaindexline": "$1 ra $2ine",
        "nextpage": "Pela badê cû ($1)",
        "prevpage": "Pela verêne ($1)",
        "allpagesfrom": "Pelanê ke be ena herfe dest pêkenê bımocne",
        "sp-deletedcontributions-contribs": "iştıraqi",
        "linksearch": "Gıreyê teberi cı geyrê",
        "linksearch-pat": "bıgêr motif:",
-       "linksearch-ns": "Heruna nameyan:",
+       "linksearch-ns": "Heruna namey:",
        "linksearch-ok": "Cı geyre",
        "linksearch-text": "Jokeri ê zey \"*.wikipedia.org\"i benê ke bıgureniyê.\nTewr senık yew sewiya serêna cayê tesiri lazıma, mesela \"*.org\".<br />\nQeydeyê {{PLURAL:$2|protoqol|protoqoli}}:destegbiyayey: <code>$1</code> (qet yew qeydeyo hesabiyaye http:// ke name nêbiyo).",
        "linksearch-line": "$1, $2 ra link biya",
        "activeusers-count": "$1 peyni {{PLURAL:$3|roz de|$3 rozan de}} $1 {{PLURAL:$1|hereket|hereketi}} kerdê",
        "activeusers-from": "Enê karberi ra tepya bımocne:",
        "activeusers-hidebots": "Botan bınımne",
-       "activeusers-hidesysops": "İdarekerdoğan bınımne",
+       "activeusers-hidesysops": "İdarekaran bınımne",
        "activeusers-noresult": "Karberi nêdiyayê.",
        "listgrouprights": "heqê grubê karberi",
        "listgrouprights-summary": "wikiya cêrın a ke tede grubê karberi nişane biyê, listeya heqê cıresayişê inan o.\nqey heqê şexsi de [[{{MediaWiki:Listgrouprights-helppage}}|hema malumato ziyed]] belka esto.",
        "listgrouprights-removegroup-self": "Hesabê xo ra {{PLURAL:$2|grube|gruban}} bıvecê: $1",
        "listgrouprights-addgroup-self-all": "şıma eşkeni hesabê xo re heme gruban têare bıkerî",
        "listgrouprights-removegroup-self-all": "şıma hesabê xo ra eşkeni heme gruban bıveci",
-       "listgrouprights-namespaceprotection-namespace": "Caynaman",
+       "listgrouprights-namespaceprotection-namespace": "Heruna nami",
+       "trackingcategories": "Kategoriyê teqibi",
+       "trackingcategories-msg": "Kategoriya teqibi",
        "trackingcategories-name": "Namey mesaci",
+       "trackingcategories-desc": "Kriterê definayışê kategoriye",
        "trackingcategories-disabled": "Kategoriya feal niya",
        "mailnologin": "adresa erşawıtışi/ruşnayişi çina.",
        "mailnologintext": "qey karberanê binan re e-posta erşawıtış de gani şıma [[Special:UserLogin|hesab aker]]ê [[Special:Preferences|pelê tercihani]] de gani yew e-postayo meqbul bıbo.",
        "emailsend": "Bırışe",
        "emailccme": "kopyayekê mesaji mı re bıerşaw",
        "emailccsubject": "$2 kopyaya mesaj a ke şıma erşawıto/a $1:",
-       "emailsent": "E-posta bırşê",
+       "emailsent": "E-poste rışna",
        "emailsenttext": "e-mailê şıma erşawiya/ruşiya",
        "emailuserfooter": "na e-posta hetê ıney ra $1 erşawiya $2 no/na karberi/e re. pê fonksiyonê \"Karberi/e re e-posta bıerşaw\" no {{SITENAME}} keyepeli erşawiya.",
        "usermessage-summary": "Mesacê sistemi caverde.",
        "nowatchlist": "listeya temaşa kerdıişê şıma de yew madde zi çina.",
        "watchlistanontext": "qey vurnayişê maddeya listeya temaşakerdişi $1.",
        "watchnologin": "Şıma cıkewtış nêvıraşto",
-       "addwatch": "Listeyê seyri deke",
+       "addwatch": "Lista seyrkerdışi ke",
        "addedwatchtext": "Ma pele \"[[:$1]]\" zerri [[Special:Watchlist|watchlist]]ê tı kerd de.\nEna deme ra, ma qe vurnayışan ser ena pele tı haberdar keni.",
-       "removewatch": "Listedê mınê seyr kerdışi ra hewad",
+       "removewatch": "Lista seyrkerdışi ra wedare",
        "removedwatchtext": "Ena pela \"[[:$1]]\" biya wedariya [[Special:Watchlist|listeyê seyr-kerdışi şıma]].",
        "watch": "Seyr ke",
        "watchthispage": "Ena pele seyr ke",
-       "unwatch": "Teqib meke",
+       "unwatch": "Teqib meke",
        "unwatchthispage": "temaşa kerdışê peli vındarn.",
        "notanarticle": "mebhesê peli niyo",
        "notvisiblerev": "Revizyon esteriyayo",
        "watchlist-details": "{{PLURAL:$1|$1 pele|$1 peleyan}} listeyê seyr-kerdışi şıma dı, peleyanê vurnayışi dahil niyo.",
        "wlheader-enotif": "E-mail xeber dayiş abiyo.",
        "wlheader-showupdated": "ziyaretê şıma ye peyini de vuryayişê peli pê '''nuşteyo qalıni''' mocyayo.",
-       "watchmethod-recent": "pel ê ke şıma temaşa kenî vuryayişê peyinê ey konrol beno",
-       "watchmethod-list": "pel ê ke şıma temaşa kenî vuryayişê peyinê ey konrol beno",
-       "watchlistcontains": "listeya seyrkerdışê şıma de $1 tene {{PLURAL:$1|peli|peli}} estî.",
-       "iteminvalidname": "pê no '$1' unsuri problem bı, nameyo nemeqbul...",
        "wlnote2": "Cêr vurnayışê {{PLURAL:$1|saeta|<strong>$1</strong> saetanê}} peyênan estê, $2 ra be hetan $3.",
        "wlshowlast": "Peyni de vurnayışan ra  $1 seata u $2 roca $3 bımocnê",
        "watchlist-options": "Tercihê liste da seyri",
        "enotif_lastvisited": "ziyareta şıma ye peyini ra nata heme vuryayiş ê ke biyê bıewnê $1i re..",
        "enotif_lastdiff": "qey vinayişê ney vurnayişi bıewnê pelê $1i",
        "enotif_anon_editor": "karbero anonim $1",
-       "enotif_body": "Erciyayê $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\neniya timaroği: $PAGESUMMARY $PAGEMINOREDIT\n\nTimaroğiya irtibat:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nno pel o ke behs beno heta ziyaret kerdışê yewna heli, mesajê vuriyayişi nêşawiyeno.\n\n           {{SITENAME}} sistemê hişyariyê keyepeli.\n\n--\nQey vurnayişê eyari:\n{{canonicalurl:{{#Special:Watchlist/edit}}}}\n\nQey vurnayişê eyaran de lista seyri:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nQey wedarayişê ena pele liste xo ra seyr kerdişi, şo\n$UNWATCHURL\n\nQey hemkari u pêşniyazi:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Erciyayê $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\neniya timaroği: $PAGESUMMARY $PAGEMINOREDIT\n\nTimaroğiya irtibat:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nno pel o ke behs beno heta ziyaret kerdışê yewna heli, mesajê vuriyayişi nêşawiyeno.\n\n           {{SITENAME}} sistemê hişyariyê keyepeli.\n\n--\nQey vurnayişê eyari:\n{{canonicalurl:{{#Special:Watchlist/edit}}}}\n\nQey vurnayişê eyaran de lista seyri:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nQey wedarayişê ena pele liste xo ra seyr kerdişi, şo\n$UNWATCHURL\n\nQey hemkari u pêşniyazi:\n$HELPPAGE",
        "created": "viraziya",
        "changed": "vurneya",
        "deletepage": "Pele bestere",
        "protect-locked-blocked": "seviyeya qedexe biyayeyan nevuriyeno.\n'''$1''' eyarê peli:",
        "protect-locked-dblock": "semedê kılidê database ya aktifi şıma neeşkeni seviyeya pawıtışi buvurni.\n'''$1''' eyarê no peli:",
        "protect-locked-access": "Karber hesabê şıma nêşeno  staryaye sewiyey ena peler bıvurno.\nHesıbyayê sazê pela da '''$1''' enêyê:",
-       "protect-cascadeon": "Ena pele nıka kılit biya. Çınki ena pele zerre listeyê {{PLURAL:$1|pele, ki|peleyan, which li}} bınê \"cascading protection\"iyo.\nTı eşkeno seviyeye kılit kerdışi bıvurno, feqat tı nıeşken \"cascading protection\"i bıvurno.",
+       "protect-cascadeon": "Ena pele nıka kılit biya, çıke na pele zerreyê lista {{PLURAL:$1|pela ke bınê şevekiyayışê qedemeyıni dera|pelê ke bınê şevekiyayışê qedemeyıni derê}}.\nTı şenê sewiyaya kılitkerdışi bıvurnê, feqat tı nêşenê şevekiyayışê qedemeyıni bıvurnê.",
        "protect-default": "Destur bıde karberan pêrune",
        "protect-fallback": "Tenya karberanê be izna \"$1\" rê destur bıde",
        "protect-level-autoconfirmed": "Karberanê neweyan u qeyd-nêbiyaoğan kılit ke",
        "undelete-error-long": "hewn a kerdışê na dosyayi wexta tepiya geriyenê xeta vıraziya:\n\n$1",
        "undelete-show-file-confirm": "\"<nowiki>$1</nowiki>\" şıma emin î dosyaya revizyonê no $2 $3 tarixi bıvini?",
        "undelete-show-file-submit": "E",
-       "namespace": "Heruna nameyan:",
+       "namespace": "Heruna namey:",
        "invert": "Weçinıtışi açarne",
        "tooltip-invert": "nameyo ke nışan biyo (u nameyo elekeyın zi nışanyyayo se) vurnayışan  zerrekan nımtışi re ena dore tesdiqi nışan kerê",
        "namespace_association": "Heruna nameyanê elaqedaran",
        "contributions-title": "Dekerdenê karber de $1",
        "mycontris": "İştıraqi",
        "contribsub2": "Qandê {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "Hesabê karberi \"$1\" qeyd nêbiyo.",
        "nocontribs": "Ena kriteriya de vurnayîş çini yo.",
        "uctop": "(weziyet)",
        "month": "Aşme:",
        "sp-contributions-username": "Adresa IPy ya zi nameyê karberi:",
        "sp-contributions-toponly": "Tenya rewizyonanê tewr peyniyan bimocne",
        "sp-contributions-submit": "Cı geyre",
-       "whatlinkshere": "Gıreyê pele",
+       "whatlinkshere": "Pele rê gırey",
        "whatlinkshere-title": "Per da \"$1\" rê perê ke gre danê",
        "whatlinkshere-page": "Pele:",
        "linkshere": "Ena peleyan grey biya '''[[:$1]]''':",
        "blockip": "Karberi kılit ke",
        "blockip-legend": "Karber blok bike",
        "blockiptext": "pê şuxulnayişê formê cêrıni, şıma eşkeni verniyê vurnayişkerdışê yew karberi ya zi yew IPyi bıgêrî. No têna qey verni-gırewtışê vandalizmiyo u gani şıma [[{{MediaWiki:Policy-url}}|qaydeyan]] re diqqet bıkeri. cêr de muheqqeq sebebê verni-grewtışi bınusi. (mesela: -nê- pelani de vandalizm kerdo).",
-       "ipadressorusername": "Adresa IPy ya zi nameyê karberi:",
+       "ipaddressorusername": "Adresa IPy ya zi nameyê karberi:",
        "ipbexpiry": "Qedyayış:",
        "ipbreason": "Sebeb:",
        "ipbreason-dropdown": "*sebebê verni-grewtışi yê pêroyi\n** malumatê şaş têare kerdış\n** Zerreyê pelan vetış\n** keyepelê teberi re gırey eştış\n** pelani re qıseyê tewşan(toşan) eştış\n** Tehditwari hereket/Taciz\n** yew ra ziyed hesaban xırab şuxulnayiş\n** nameyê karberi yo ke meqbul niyo",
        "import-comment": "Vatış:",
        "importtext": "Kerem ke dosyay, çımeyê wiki ra pê [[Special:Export|kırıştışê teberdayişi]] bıdê teber, Komputerê xo de qeyd kerê u bar kerê tiya.",
        "importstart": "Pelan împort kenî",
-       "import-revision-count": "$1 {{PLURAL:$1|revizyon|revizyon}}",
+       "import-revision-count": "$1 {{PLURAL:$1|çımraviyarnayış|çımraviyarnayışi}}",
        "importnopages": "Pel çino ke import bike",
        "imported-log-entries": " $1 {{PLURAL:$1|logê dekerdişi|loganê dekerdişan}} ard.",
        "importfailed": "Împort nebiy: <nowiki>$1</nowiki>",
        "import-logentry-upload": "dosyayê bar kerdişî ra [[$1]] împort biyo",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|çımraviyarnayış|çımraviyarnayışi}}",
        "import-logentry-interwiki": "$1 transwiki biyo",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|revizyon|revizyonî}} $2 ra",
+       "import-logentry-interwiki-detail": "$2 ra $1 {{PLURAL:$1|çımraviyarnayış|çımraviyarnayışi}}",
        "javascripttest": "Cerebnayışê JavaScripti",
        "javascripttest-title": "Testê $1 gurweyênê",
        "javascripttest-pagetext-noframework": "Na pela testanê JavaScripta gurweynayışi re abıryaya.",
        "tooltip-pt-watchlist": "Lista pelanê ke to gırewtê seyrkerdış",
        "tooltip-pt-mycontris": "Listeya dekerdışan de şıma",
        "tooltip-pt-login": "Mayê şıma ronıştış akerdışi rê dawet keme; labelê ronıştış mecburi niyo",
-       "tooltip-pt-logout": "Sistem ra vıcyayış",
+       "tooltip-pt-logout": "Bıveciye",
        "tooltip-ca-talk": "Zerrekê pele sero werênayış",
        "tooltip-ca-edit": "Tı şenay na pele bıvurnê. Kerem ke, qeydkerdış ra ver gocega verqayti bıgurene.",
        "tooltip-ca-addsection": "Zu bınnusteya newi ak",
        "tooltip-diff": "Metni sero vurnayışan mocneno",
        "tooltip-compareselectedversions": "Ena per de ferqê rewziyonan de dı weçinaya bıvinê",
        "tooltip-watch": "Ena pele lista xoya seyrkerdışi ke",
-       "tooltip-watchlistedit-normal-submit": "Sernuşteya hewad",
-       "tooltip-watchlistedit-raw-submit": "Listeyê seyri newen ke",
+       "tooltip-watchlistedit-normal-submit": "Sernuşteyan wedare",
+       "tooltip-watchlistedit-raw-submit": "Lista seyrkerdışi newe ke",
        "tooltip-recreate": "pel hewn a bışiyo zi tepiya biya",
        "tooltip-upload": "Sergen de bari be",
        "tooltip-rollback": "\"Peyser bia\" be yew tık pela iştıraq(an)ê peyên|i(an) peyser ano.",
        "tooltip-summary": "Yew xulasaya kilm binuse",
        "interlanguage-link-title": "$1 - $2",
        "common.js": "/* Any JavaScript here will be loaded for all users on every page load. */",
-       "notacceptable": "formatê ma'lumati no peşkeşwanê wikiyi nêweniyeno.",
        "anonymous": "{{PLURAL:$1|karberê|karberê}} anonimi yê keyepelê {{SITENAME}}i",
        "siteuser": "karberê {{SITENAME}}i $1",
        "anonuser": "karberê anonim o {{SITENAME}}i $1",
        "pageinfo-recent-edits": "Amariya vurnayışan ($1 ra nata)",
        "pageinfo-recent-authors": "Amarina nuştekaran pêro",
        "pageinfo-magic-words": "{{PLURAL:$1|Çekuya|Çekuyê}} ($1) sihırini",
-       "pageinfo-hidden-categories": "{{PLURAL:$1|Kategoriye|Kategoriyan}} ($1) bınımne",
+       "pageinfo-hidden-categories": "{{PLURAL:$1|Kategoriya nımıtiye|Kategoriyê nımıtey}} ($1)",
        "pageinfo-templates": "{{PLURAL:$1|Şablono|Şablonê}} ke mocniyenê ($1)",
        "pageinfo-transclusions": "{{PLURAL:$1|1 Pele|$1 Pelan}} de bestiya pıra",
        "pageinfo-toolboxlink": "Melumatê pele",
        "pageinfo-category-pages": "Amarê pelan",
        "pageinfo-category-subcats": "Amarê bınkategoriyan",
        "pageinfo-category-files": "Amarê dosyeyan",
-       "skinname-cologneblue": "Cologne Blue",
        "skinname-monobook": "MonoBook",
-       "skinname-modern": "Modern",
        "skinname-vector": "Vektor",
        "markaspatrolleddiff": "Nişan bıke ke dewriya biyo",
        "markaspatrolledtext": "Ena pele nişan bike ke devriye biyo",
        "newimages-summary": "Ena pela xasi dosyayi ke peni de bar biyayeyi mocnane.",
        "newimages-legend": "Avrêc",
        "newimages-label": "Nameyê dosya ( ya zi parçe ey)",
-       "showhidebots": "(bota $1)",
        "noimages": "Çik çini yo.",
        "ilsubmit": "Cı geyre",
        "bydate": "goreyê zemani",
        "seconds": "{{PLURAL:$1|$1 saniya|$1 saniyeyan}}",
        "minutes": "{{PLURAL:$1|$1 deqa|$1 deqan}}",
        "hours": "{{PLURAL:$1|$1 saete|$1 saetan}}",
-       "days": "{{PLURAL:$1|$1 roce|$1 rocan}}",
-       "weeks": "{{PLURAL:$1|$1 hefte|$1 hefteyan}}",
+       "days": "{{PLURAL:$1|$1 roce|$1 roci}}",
+       "weeks": "{{PLURAL:$1|$1 hefte|$1 heftey}}",
        "months": "{{PLURAL:$1|aşme|$1 aşman}}",
-       "years": "{{PLURAL:$1|$1 serre|$1 serran}}",
+       "years": "{{PLURAL:$1|$1 serre|$1 serri}}",
        "ago": "Verê $1",
-       "just-now": "Hema newke",
-       "hours-ago": "Verê $1 {{PLURAL:$1|saete|saetan}}",
+       "just-now": "tafte nıka",
+       "hours-ago": "$1 {{PLURAL:$1|saete|saeti}} raver",
        "minutes-ago": "Verê $1 {{PLURAL:$1|deqa|deqan}}",
        "seconds-ago": "Verê $1 {{PLURAL:$1|saniya|saniyeyan}}",
        "monday-at": "Dışeme $1 de",
        "metadata-langitem": "'''$2:''' $1",
        "metadata-langitem-default": "$1",
        "exif-imagewidth": "Herayey",
-       "exif-imagelength": "Dergi",
+       "exif-imagelength": "Berziye",
        "exif-bitspersample": "yew parçe de biti",
        "exif-compression": "Planê kompresyoni",
        "exif-photometricinterpretation": "Compozisyonê pixeli",
        "exif-gpslongituderef": "meridyenê rocvetış û rocawavi",
        "exif-gpslongitude": "Lemen",
        "exif-gpsaltituderef": "çımeyê berziyi",
-       "exif-gpsaltitude": "berzî",
+       "exif-gpsaltitude": "Berziye",
        "exif-gpstimestamp": "Wextê GPSyi (se'eta atomiki)",
        "exif-gpssatellites": "Qandê peymıtışi antenê ke vıstê kar",
        "exif-gpsstatus": "cayê gırewtoxi",
        "exif-languagecode": "Zıwan",
        "exif-iimversion": "Verqaydê IIM",
        "exif-iimcategory": "Kategoriye",
-       "exif-iimsupplementalcategory": "Oleyê Kategoriyan",
+       "exif-iimsupplementalcategory": "Kategoriyê temamkerdışi",
        "exif-datetimeexpires": "No peyra mekarênê",
        "exif-datetimereleased": "Bıroşe",
        "exif-originaltransmissionref": "Oricinal pusula da kodê açarnayışi",
        "imgmultigoto": "Şo pela da $1",
        "img-lang-default": "(zıwano hesabiyaye)",
        "img-lang-info": "Resimé $1, $2 ya teké pé ke.",
-       "img-lang-go": "Bırş",
+       "img-lang-go": "Şo",
        "ascending_abbrev": "berz",
        "descending_abbrev": "nızm",
        "table_pager_next": "Pela peyêne",
        "bitrate-exabits": "$1Ebps",
        "bitrate-zetabits": "$1Zbps",
        "bitrate-yottabits": "$1Ybps",
-       "livepreview-loading": "Ho bar keni...",
-       "livepreview-ready": "Ho bar keni... Hezir o!",
-       "livepreview-failed": "Verqeyd nibiyo! Verqeydo normal deneme bike.",
-       "livepreview-error": "Nieşken giredayi biy: $1 \"$2\".\nVerqeydo normal deneme bike.",
        "lag-warn-normal": "Vurnayîşî ke {{PLURAL:$1|seniye|seniyeyî}} ra newiyerî belki inan nimucneno.",
        "lag-warn-high": "Eka serverê databaseyî zaf hebitiyeno, ayra vurnayîşî ke {{PLURAL:$1|seniye|seniyeyî}} ra newiyerî belki inan nimucneno.",
-       "watchlistedit-numitems": "Listeyê seyirkerdişi ti de {{PLURAL:$1|1 title|$1 titles}} esta, feqet pelayanê minaqeşeyan dahil niyê.",
-       "watchlistedit-noitems": "Listeyê seyr kerdişê tu de seroğ çin o.",
-       "watchlistedit-normal-title": "Listeyê seyirkerdişi bivurne",
-       "watchlistedit-normal-legend": "Listeyê seyr kerdişê tu de seroğ biwedarna.",
+       "watchlistedit-normal-title": "Lista seyrkerdışi bıvurne",
+       "watchlistedit-normal-legend": "Lista seyrkerdışi ra sernameyan wedare",
        "watchlistedit-normal-explain": "Listeyê seyr kerdîşî ti de serogî cor de mucnayiyo.\nEka ti wazeno seroğ biwedarne, kuti ke kistê de, ay işaret bike u \"{{int:Watchlistedit-normal-submit}}\" klik bike.\nTi hem zi eşkeno [[Special:EditWatchlist/raw|edit the raw list]].",
-       "watchlistedit-normal-submit": "Seroğî biwedarnê",
-       "watchlistedit-normal-done": "{{PLURAL:$1|1 seroğ|$1 seroğî}} seyr kerdişê tu ra wedarno.",
-       "watchlistedit-raw-title": "Listeyê seyirkerdişi ye hami bivurne",
-       "watchlistedit-raw-legend": "Listeyê seyirkerdişi ye hami bivurne",
+       "watchlistedit-normal-submit": "Sernuşteyan wedare",
+       "watchlistedit-normal-done": "{{PLURAL:$1|1 sername|$1 sernamey}} lista seyrkerdışê şıma ra darde we:",
+       "watchlistedit-raw-title": "Lista seyrkerdışia xame bıvurne",
+       "watchlistedit-raw-legend": "Lista seyrkerdışia xame bıvurne",
        "watchlistedit-raw-explain": "Listeyê seyr kerdîşî ti de serogî cor de mucnayiyo u ti eşkeno pê dekerdiş u wedarnayîş liste bivurne.\nEka vurnayîşê ti qediyo, Listeyê Seyr Kerdişî Rocaniye Bike \"{{int:Watchlistedit-raw-submit}}\" klik bike.\nTi hem zi eşkeno [[Special:EditWatchlist|use the standard editor]].",
-       "watchlistedit-raw-titles": "Seroğî:",
-       "watchlistedit-raw-submit": "Listeyê seyri newen ke",
+       "watchlistedit-raw-titles": "Sernamey:",
+       "watchlistedit-raw-submit": "Lista seyrkerdışi newe ke",
        "watchlistedit-raw-done": "Listeyê tuyê seyrkerdişi rocaniye biyo",
-       "watchlistedit-raw-added": "{{PLURAL:$1|1 seroğ|$1 seroğî}} de kerd:",
-       "watchlistedit-raw-removed": "{{PLURAL:$1|1 seroğ|$1 seroği}} besteriyaye:",
-       "watchlisttools-view": "vurnayışanê eleqadari bıvin",
-       "watchlisttools-edit": "Lista seyrkerdışi bıvênên u bıvurnên",
-       "watchlisttools-raw": "Listeyê seyr-kerdışi bıvin",
+       "watchlistedit-raw-added": "{{PLURAL:$1|1 sername kerd|$1 sernamey kerdi}} cı:",
+       "watchlistedit-raw-removed": "{{PLURAL:$1|1 sername dard|$1 sernamey dardi}} we:",
+       "watchlistedit-clear-titles": "Sernamey:",
+       "watchlisttools-view": "Vurnayışanê elaqedaran bıvêne",
+       "watchlisttools-edit": "Lista seyrkerdışi bıvêne û bıvurne",
+       "watchlisttools-raw": "Lista seyrkerdışia xame bıvurne",
        "iranian-calendar-m1": "Farvardin",
        "iranian-calendar-m2": "Ordibeheşt",
        "iranian-calendar-m3": "Xordad",
        "hebrew-calendar-m12-gen": "Elul",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|mesac]])",
        "timezone-utc": "[[UTC]]",
-       "unknown_extension_tag": "Etiketê ekstensiyon ê \"$1\"î nizanyeno",
+       "unknown_extension_tag": "Etiketê ilaweyo nêzanayey \"$1\"",
        "duplicate-defaultsort": "'''Tembe:''' Hesıbyaye sırmey ratnayış de \"$2\" sırmey ratnayış de \"$1\"i nêhesıbneno.",
        "version": "Versiyon",
        "version-extensions": "Ekstensiyonî ke ronaye",
        "redirect-value": "Erc:",
        "redirect-user": "Kamiya Karberi:",
        "redirect-page": "Kamiya pele",
-       "redirect-revision": "Rewizyona pela",
+       "redirect-revision": "Çımraviyarnayışê pele",
        "redirect-file": "Namey dosya",
        "redirect-not-exists": "Erc nêvineyê",
        "fileduplicatesearch": "Dosyayanê zey pêyan cı geyrê",
        "tags-intro": "Eno pel de listeyê eyiketî este ke belki software pê ey edit kenî.",
        "tags-tag": "Nameyê etiketi",
        "tags-display-header": "Listeyê vurnayîşî de esayîş",
-       "tags-description-header": "Deskripsyonê manay ê hemî",
+       "tags-description-header": "Tam arezekerdışê maneyê cı",
        "tags-active-header": "Activ o?",
        "tags-hitcount-header": "Vurnayîşî ke etiket biyê",
        "tags-active-yes": "E",
        "compare-invalid-title": "Sernameyo ke şımayê vanê ravêrde niyo.",
        "compare-title-not-exists": "Sernameyo ke şımayê vanê mewcud niyo.",
        "compare-revision-not-exists": "Revizyono ke şımaye vanê mewcud niyo.",
-       "dberr-header": "Ena Wiki de yew ğelet esta",
        "dberr-problems": "Mayê muxulêm! Ena sita dı newke xırabiya teknik esta.",
        "dberr-again": "Yew di dekika vinder u hin bar bike.",
        "dberr-info": "(Erzmelumati ra xızmetkari nêreseno: $1)",
        "htmlform-no": "Nê",
        "htmlform-yes": "Eya",
        "htmlform-chosen-placeholder": "Opsiyon weçine",
+       "htmlform-cloner-create": "Tayêna cı ke",
+       "htmlform-cloner-delete": "Wedare",
        "sqlite-has-fts": "$1 tam-metn destegê cı geyrayışiya piya",
        "sqlite-no-fts": "$1 tam-metn bê destegê cı geyrayışi",
-       "logentry-delete-delete": "$1 pera $3 {{GENDER:$2|besternê}}",
+       "logentry-delete-delete": "$1 pela $3 {{GENDER:$2|esterıte}}",
        "logentry-delete-restore": "$1 pela $3 {{GENDER:$2|peyser arde}}",
        "logentry-delete-event": "$1 $3: $4 de asayışê {{PLURAL:$5|cıkerdışi|cıkerdışan}} {{GENDER:$2|vurna}}",
        "logentry-delete-revision": "$1 pela $3: $4 de asayışê {{PLURAL:$5|yew revizyoni|$5 revizyonan}} {{GENDER:$2|vurna}}",
        "api-error-unclassified": "Yew xeteyê nizanyeni biya.",
        "api-error-unknown-code": "$1'dı jew xeta vıciye",
        "api-error-unknown-error": "Zerre xırabin:Dasoya barkerdış de tay çi raşt nêşı.",
-       "api-error-unknown-warning": "$1'dı ikazo xırab:",
+       "api-error-unknown-warning": "İqazo nêzanaye: \"$1\".",
        "api-error-unknownerror": "$1'dı jew xeta vıciye",
        "api-error-uploaddisabled": "BArkerdış ena wikide qefılneyayo",
        "api-error-verification-error": "Dosya xırabiya yana derganiya cı xıraba.",
index 5050052..0756701 100644 (file)
@@ -15,7 +15,8 @@
                        "Qualia",
                        "Shirayuki",
                        "Tlustulimu",
-                       "Tlustulimu Nepl1"
+                       "Tlustulimu Nepl1",
+                       "아라"
                ]
        },
        "tog-underline": "Wótkaze pódšmarnuś:",
@@ -28,7 +29,6 @@
        "tog-showtoolbar": "Wobźěłowańsku rědku pokazaś",
        "tog-editondblclick": "Boki z dwójnym kliknjenim wobźěłaś",
        "tog-editsectiononrightclick": "Wobźěłowanje wótrězkow pśez kliknjenje z pšaweju tastu myški zmóžniś",
-       "tog-rememberpassword": "Z toś tym wobglědowakom pśizjawjony wóstaś (za maksimalnje $1 {{PLURAL:$1|źeń|dnja|dny|dnjow}})",
        "tog-watchcreations": "Boki, kótarež napórajom a dataje, kótarež nagrawam, wobglědowaś",
        "tog-watchdefault": "Boki a dataje , kótarež změnijom, wobglědowaś",
        "tog-watchmoves": "Boki a dataje, kótarež som pśesunuł, wobglědowaś",
        "permalink": "Wobstawny wótkaz",
        "print": "Śišćaś",
        "view": "Woglědaś se",
+       "view-foreign": "Na $1 se woglědaś",
        "edit": "wobźěłaś",
+       "edit-local": "Lokalne wopisanje wobźěłaś",
        "create": "Wuźěłaś",
+       "create-local": "Lokalne wopisanje pśidaś",
        "editthispage": "Bok wobźěłaś",
        "create-this-page": "Bok wuźěłaś",
        "delete": "Wulašowaś",
        "readonly_lag": "Datowa banka jo awtomatiski se zacyniła, aby wótwisne serwery se mógli z głownym serwerom wurownowaś.",
        "internalerror": "Interna zmólka",
        "internalerror_info": "Interna zmólka: $1",
-       "fileappenderrorread": "\"$1\" njejo se dał cytaś pśi pśipowjesanju.",
-       "fileappenderror": "Njejo móžno było \"$1\" k \"$2\" pśipowjesyś.",
        "filecopyerror": "Njejo było móžno dataju „$1” k „$2” kopěrowaś.",
        "filerenameerror": "Njejo było móžno dataju „$1” do „$2” pśemjenjowaś.",
        "filedeleteerror": "Njejo było móžno dataju „$1” wulašowaś.",
        "directorycreateerror": "Njejo było móžno, zapis „$1“ wutwóriś.",
        "filenotfound": "Njejo było móžno dataju „$1” namakaś.",
-       "fileexistserror": "Njejo było móžno do dataje \"$1\" pisaś: Wóna južo eksistěrujo.",
        "unexpected": "Njewócakowana gódnota: „$1“=„$2“.",
        "formerror": "Zmólka: Njejo móžno formular wótpósłaś.",
        "badarticleerror": "Akcija njedajo se na toś tom boku wuwjasć.",
        "userlogin-helplink2": "Pomoc pśi pśizjawjenju",
        "userlogin-loggedin": "Sy južo ako {{GENDER:$1|$1 pśizjawjony|$1 pśizjawjona}}. Wužyj slědujucy formular, aby se ako drugi wužywaŕ pśizjawił.",
        "userlogin-createanother": "Druge konto załožyś",
-       "createacct-join": "Zapódaj dołojce swóje informacije.",
-       "createacct-another-join": "Zapódaj dołojce informacije nowego konta.",
        "createacct-emailrequired": "E-mailowa adresa",
        "createacct-emailoptional": "E-mailowa adresa (opcionalny)",
        "createacct-email-ph": "Zapódaj swóju e-mailowu adresu",
        "savearticle": "Bok składowaś",
        "preview": "Pśeglěd",
        "showpreview": "Pśeglěd pokazaś",
-       "showlivepreview": "Livepśeglěd",
        "showdiff": "Pśeměnjenja pokazaś",
        "anoneditwarning": "'''Warnowanje:''' Njejsy pśizjawjony. Změny w stawiznach togo boka składuju se z twójeju IP-adresu.",
        "anonpreviewwarning": "''Njejsy pśizjawjony. Składowanje pśenosujo twóju IP-adresu do wobźěłowańskeje historije toś togo boka.''",
        "edit-gone-missing": "Njejo móžno było bok aktualizěrowaś.\nZda sem až jo wulašowany.",
        "edit-conflict": "Wobźěłański konflikt.",
        "edit-no-change": "Wašo wobźěłanje jo se ignorěrowało, dokulaž tekst njejo se změnił.",
-       "postedit-confirmation": "Twója změna jo se składła.",
+       "postedit-confirmation-created": "Toś ten bok jo se napórał.",
+       "postedit-confirmation-restored": "Bok jo se wótnowił.",
+       "postedit-confirmation-saved": "Twója změna jo se składła.",
        "edit-already-exists": "Njejo móžno było nowy bok napóraś.\nEksistěrujo južo.",
        "defaultmessagetext": "Standardny tekst powěźeńki",
        "content-failed-to-parse": "Parsowanje wopśimjeśa $2 za model $1 njejo se raźiło: $3",
        "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ś:",
-       "powersearch-redir": "Dalejpósrědnjenja nalistowaś",
        "powersearch-togglelabel": "Kontrolěrowaś:",
        "powersearch-toggleall": "Wše",
        "powersearch-togglenone": "Žeden",
        "prefs-emailconfirm-label": "E-mailowe wobkšuśenje:",
        "youremail": "E-mail:",
        "username": "Mě {{GENDER:$1|wužywarja|wužywarki}}:",
-       "uid": "ID {{GENDER:$1|wužywarja|wužywarki}}:",
        "prefs-memberingroups": "{{GENDER:$2|Cłon|Cłonka}} {{PLURAL:$1|wužywarskeje kupki|wužiwarskeju kupkowu|wužywarskich kupkow}}:",
        "prefs-registration": "Cas registracije:",
        "yourrealname": "Realne mě *:",
        "prefs-advancedsearchoptions": "Rozšyrjone opcije",
        "prefs-advancedwatchlist": "Rozšyrjone opcije",
        "prefs-displayrc": "Zwobraznjowańske opcije",
-       "prefs-displaysearchoptions": "Zwobraznjowańske opcije",
        "prefs-displaywatchlist": "Zwobraznjowańske opcije",
        "prefs-tokenwatchlist": "Token",
        "prefs-diffs": "Rozdźěle",
        "action-createpage": "Boki napóraś",
        "action-createtalk": "Diskusijne boki napóraś",
        "action-createaccount": "Toś to wužywarske konto napóraś",
+       "action-history": "historiju toś togo boka pokazaś",
        "action-minoredit": "toś tu změnu ako snadnu markěrowaś",
        "action-move": "toś ten bok pśesunuś",
        "action-move-subpages": "toś ten bok a jogo pódboki pśesunuś",
        "recentchanges-legend-newpage": "(glej teke [[Special:NewPages|lisćinu nowych bokow]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Dołojce pokazuju se změny wót <strong>$2</strong> (maks. <strong>$1</strong> zapisow).",
-       "rclistfrom": "Nowe změny wót $1 pokazaś.",
+       "rclistfrom": "Nowe změny wót $3 $2 pokazaś",
        "rcshowhideminor": "Snadne změny $1",
        "rcshowhideminor-show": "Pokazaś",
        "rcshowhideminor-hide": "Schowaś",
        "uploadstash-refresh": "Lisćinu datajow aktualizěrowaś",
        "invalid-chunk-offset": "Njepłaśiwy startowy dypk",
        "img-auth-accessdenied": "Pśistup zawobarany",
-       "img-auth-nopathinfo": "PATH_INFO felujo.\nTwój serwer njejo konfigurěrowany, aby toś te informacije dalej pósrědnił.\nMóžo na CGI bazěrowaś a njamóžo img_auth pódpěraś.\nGlědaj https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "PATH_INFO felujo.\nTwój serwer njejo konfigurěrowany, aby toś te informacije dalej pósrědnił.\nMóžo na CGI bazěrowaś a njamóžo img_auth pódpěraś.\nGlědaj https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Pominana šćažka njejo w konfigurěrowanem nagraśowem zapisu.",
        "img-auth-badtitle": "Njejo móžno z \"$1\" płaśiwy titel twóriś.",
        "img-auth-nologinnWL": "Njejsy pśizjawjony a \"$1\" njejo w běłej lisćinje.",
        "pageswithprop-prophidden-binary": "binarna kakostna gódnota schowana ($1)",
        "doubleredirects": "Dwójne dalejpósrědnjenja",
        "doubleredirectstext": "Toś ten bok nalicujo boki, kótarež dalej pósrědnjaju na druge dalejpósrědnjenja.\nKužda smužka wopśimjejo wótkaze na prědne a druge dalejpósrědnjenje a teke na cel drugego dalejpósrědnjenja, což jo w normalnem paźe \"napšawdny\" celowy bok, na kótaryž by mógło prědne dalejpósrědnjenje pokazaś. <del>Pśešmarnjone</del> zapiski su južo wobstarane.",
-       "double-redirect-fixed-move": "[[$1]] jo se pśesunuł, jo něnto dalejposrědnjenje do [[$2]]",
-       "double-redirect-fixed-maintenance": "Dwójne dalejpósrědnjenje wót [[$1]] do [[$2]] se pórěźa.",
+       "double-redirect-fixed-move": "[[$1]] jo se pśesunuł.\nJo se awtomatiski zaktualizěrował a pósrědnja se něnto dalej do [[$2]].",
+       "double-redirect-fixed-maintenance": "Dwójne dalejpósrědnjenje wót [[$1]] do [[$2]] pórěźa se awtomatiski w wótwardowańskem nadawku.",
        "double-redirect-fixer": "Pórěźaŕ dalejpósrědnjenjow",
        "brokenredirects": "Skóńcowane dalejpósrědnjenja",
        "brokenredirectstext": "Slědujuce dalejpósrědnjenja wótkazuju na njeeksistěrujuce boki:",
        "log-title-wildcard": "Pytaś nadpismo, kótarež zachopijo z ...",
        "showhideselectedlogentries": "Wubrane protokolowe zapiski pokazaś/schowaś",
        "allpages": "Wšykne boki",
-       "alphaindexline": "$1 do $2",
        "nextpage": "Slědujucy bok ($1)",
        "prevpage": "Pśedchadny bok ($1)",
        "allpagesfrom": "Boki pokazaś wót:",
        "listgrouprights-removegroup-self": "Móžo {{PLURAL:$2|kupku|kupce|kupki|kupkow}} ze swójskego konta wótpóraś: $1",
        "listgrouprights-addgroup-self-all": "Móžo wše kupki swójskemu kontoju pśidaś",
        "listgrouprights-removegroup-self-all": "Móžo wše kupki ze swójskego konta wótpóraś",
+       "listgrouprights-namespaceprotection-header": "Wobgranicowanja mjenjowego ruma",
+       "listgrouprights-namespaceprotection-namespace": "Mjenjowy rum",
+       "listgrouprights-namespaceprotection-restrictedto": "Pšawa, kótarež dowóluju wužywarjeju wobźěłowanje",
+       "trackingcategories": "Slědowańske kategorije",
+       "trackingcategories-msg": "Slědowańska kategorija",
+       "trackingcategories-name": "Mě powěźeńki",
+       "trackingcategories-desc": "Kriterije za zapśěgowanje kategorije",
+       "trackingcategories-nodesc": "Žedno wopisanje k dispoziciji",
+       "trackingcategories-disabled": "Kategorija jo znjemóžnjona",
        "mailnologin": "Njejo móžno e-mailku pósłaś.",
        "mailnologintext": "Dejš [[Special:UserLogin|pśizjawjony]] byś a płaśiwu e-mailowu adresu w swójich [[Special:Preferences|nastajenjach]] měś, aby drugim wužywarjam e-mail pósłał.",
        "emailuser": "Toś tomu wužywarjeju e-mail pósłaś",
        "watchlist-details": "Wobglědujoš {{PLURAL:$1|$1 bok|$1 boka|$1 boki|$1 bokow}}, bźez diskusijnych bokow.",
        "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'''.",
-       "watchmethod-recent": "Kontrolěrowanje aktualnych změnow we wobglědowańce",
-       "watchmethod-list": "Pśepytanje wobglědowanych bokow za aktualnymi změnami",
-       "watchlistcontains": "Twója wobglědowańka wopśimujo $1 {{PLURAL:$1|bok|boka|boki|bokow}}.",
-       "iteminvalidname": "Problem ze zapisom „$1“, njepłaśece mě.",
        "wlnote2": "Slěduju změny {{PLURAL:$1|zachadneje góźiny|zachadneju <strong>$1</strong> góźinowu|zachadnych <strong>$1</strong> góźinow}} Staw: $2, $3.",
        "wlshowlast": "Pokaž změny slědnych $1 góźinow, $2 dnjow abo $3 (w slědnych 30 dnjach).",
        "watchlist-options": "Opcije wobglědowańki",
        "enotif_lastvisited": "Wšykne změny na jadno póglědnjenje: $1",
        "enotif_lastdiff": "Za toś tu změnu glědaj w $1.",
        "enotif_anon_editor": "anonymny wužywaŕ $1",
-       "enotif_body": "Luby $WATCHINGUSERNAME,\n\n$PAGEEDITOR jo bok $PAGETITLE na {{GRAMMAR:lokatiw|{{SITENAME}}}} $PAGEEDITDATE $CHANGEDORCREATED, glědaj $PAGETITLE_URL za aktualnu wersiju.\n\n$NEWPAGE\n\nZespominanje wobźěłarja: $PAGESUMMARY $PAGEMINOREDIT\n\nKontakt z wobźěłarjom:\nE-mail: $PAGEEDITOR_EMAIL\nWiki: $PAGEEDITOR_WIKI\n\nNjebudu žedne dalšne powěźeńki w paźe aktiwity, snaźkuli woglědujoš se toś ten bok, mjaztym sy pśizjawjony.\nMóźoś teke chórgojcki powěźeńkow za wšykne twóje wobglědowane boki slědk stajiś.\n\n             Twój pśijaśelny powěsćowy system {{SITENAME}}\n--\nAby swoje nastajenja za e-mailowe zdźělenja změnił, woglědaj\n{{canonicalurl:{{#special:Preferences}}}}\n\nAby nastajenja twójeje wobglědowańki změnił, woglědaj:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nAby se bok z twójeje wobglědowańki wulašował, woglědaj\n$UNWATCHURL\n\nPšašanja a dalšna pomoc:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Luby $WATCHINGUSERNAME,\n\n$PAGEEDITOR jo bok $PAGETITLE na {{GRAMMAR:lokatiw|{{SITENAME}}}} $PAGEEDITDATE $CHANGEDORCREATED, glědaj $PAGETITLE_URL za aktualnu wersiju.\n\n$NEWPAGE\n\nZespominanje wobźěłarja: $PAGESUMMARY $PAGEMINOREDIT\n\nKontakt z wobźěłarjom:\nE-mail: $PAGEEDITOR_EMAIL\nWiki: $PAGEEDITOR_WIKI\n\nNjebudu žedne dalšne powěźeńki w paźe aktiwity, snaźkuli woglědujoš se toś ten bok, mjaztym sy pśizjawjony.\nMóźoś teke chórgojcki powěźeńkow za wšykne twóje wobglědowane boki slědk stajiś.\n\n             Twój pśijaśelny powěsćowy system {{SITENAME}}\n--\nAby swoje nastajenja za e-mailowe zdźělenja změnił, woglědaj\n{{canonicalurl:{{#special:Preferences}}}}\n\nAby nastajenja twójeje wobglědowańki změnił, woglědaj:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nAby se bok z twójeje wobglědowańki wulašował, woglědaj\n$UNWATCHURL\n\nPšašanja a dalšna pomoc:\n$HELPPAGE",
        "created": "napórał",
        "changed": "změnił",
        "deletepage": "Bok wulašowaś",
        "contributions-title": "Wužywarske pśinoski wót $1",
        "mycontris": "Pśinoski",
        "contribsub2": "Za {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "Wužywarske konto \"$1\" njejo zregistrowane.",
        "nocontribs": "Za toś te kriterije njejsu žedne změny se namakali.",
        "uctop": "(aktualny)",
        "month": "wót mjaseca (a jěsnjej):",
        "blockip": "Wužywarja blokěrowaś",
        "blockip-legend": "Wužywarja blokěrowaś",
        "blockiptext": "Wužywaj slědujucy formular, jolic až coš wěstej IP-adresy abo konkretnemu wužywarjeju pśistup znjemóžniś. Take dejało se pó [[{{MediaWiki:Policy-url}}|směrnicach]] jano staś, aby se wandalizmoju zadorało. Pšosym zapódaj pśicynu za twójo blokěrowanje (na pś. mógu se citěrowaś konkretne boki, źo jo se wandalěrowało).",
-       "ipadressorusername": "IP-adresa abo wužywarske mě",
+       "ipaddressorusername": "IP-adresa abo wužywarske mě",
        "ipbexpiry": "Cas blokěrowanja:",
        "ipbreason": "Pśicyna:",
        "ipbreason-dropdown": "*powšykne pśicyny blokěrowanja\n** pódawanje njepšawych informacijow\n** wulašowanje wopśimjeśa bokow\n** pódawanje spamowych eksternych wótkazow\n** pisanje głuposćow na bokach\n** pśestupjenje zasady \"žedne wósobinske atakěrowanja\"\n** złowólne wužywanje wjele wužywarskich kontow\n** njekorektne wužywarske mě",
        "monobook.css": "/* How zaměstnjony CSS wustatkujo se na wužywarje monobook-šata */",
        "common.js": "/* Kuždy JavaScript how lodujo se za wšykne wužywarje na kuždem boce. */",
        "monobook.js": "/* Slědujucy JavaScript zacytajo se za wužywarjow, kótarež skin MonoBook wužywaju */",
-       "notacceptable": "Wiki-serwer njamóžo daty za twój klient wobźěłaś.",
        "anonymous": "{{PLURAL:$1|Anonymny wužywaŕ|Anonymnej wužywarja|Anonymne wužywarje}} na {{SITENAME}}",
        "siteuser": "{{SITENAME}}-wužywaŕ $1",
        "anonuser": "{{SITENAME}} anonymny wužywaŕ $1",
        "newimages-summary": "Toś ten specialny bok pokazujo dataje, kótarež su se ako slědne nagrali.",
        "newimages-legend": "Filter",
        "newimages-label": "Datajowe mě (abo źěl z togo):",
-       "showhidebots": "(awtomatiske programy (boty) $1)",
        "noimages": "Žedne dataje njejsu se namakali.",
        "ilsubmit": "Pytaś",
        "bydate": "pó datumje",
        "autosumm-replace": "Bok narownajo se z: '$1'",
        "autoredircomment": "Pśesměrowanje na [[$1]]",
        "autosumm-new": "Jo napórał bok z '$1'",
-       "livepreview-loading": "Lodowanje …",
-       "livepreview-ready": "Lodowanje … gótowe!",
-       "livepreview-failed": "Live-pśeglěd njejo móžny. Pšosym normalny pśeglěd wužywaś.",
-       "livepreview-error": "Kontaktowanje njejo se zglucyło: $1 \"$2\". Pšosym normalny pśeglěd wužywaś.",
        "lag-warn-normal": "Změny {{PLURAL:$1|slědneje $1 sekundy|slědneju $1 sekundowu|slědnych $1 sekundow|slědnych $1 sekundow}} njepókazuju se w toś tej lisćinje.",
        "lag-warn-high": "Dla wusokego wuśěženja serwera datoweje banki jo móžno, až pśinoski, kótarež su nowše ako {{PLURAL:$1|$1 sekunda|sekunźe|sekundy|sekundow}} se snaź na toś tej liśćinje njepokazuju.",
-       "watchlistedit-numitems": "Twója wobglědowańka wopśimuju {{PLURAL:$1|$1 zapisk|$1 zapiska|$1 zapiski|$1 zapiskow}}, bźez diskusijnych bokow.",
-       "watchlistedit-noitems": "Twója wobglědowańka jo prozna.",
        "watchlistedit-normal-title": "Zapise wobźěłaś",
        "watchlistedit-normal-legend": "Zapiski z wobglědowańki wulašowaś",
        "watchlistedit-normal-explain": "Zapiski w twójej wobglědowańce pokazuju se dołojce. Aby zapisk wulašował, markěruj kašćik pódla zapiska a klikni na \"{{int:Watchlistedit-normal-submit}}\". Móžoš swóju wobglědowańku teke w [[Special:EditWatchlist/raw|lisćinowem formaśe]] wobźěłaś.",
        "compare-invalid-title": "Titel, kótaryž sy pódał, jo njepłaśiwy.",
        "compare-title-not-exists": "Titel, kótaryž sy pódał, njeeksistěrujo.",
        "compare-revision-not-exists": "Wersija, kótaruž sy pódał, njeeksistěrujo.",
-       "dberr-header": "Toś ten wiki ma problem",
        "dberr-problems": "Wódaj! Toś to sedło ma techniske śěžkosći.",
        "dberr-again": "Pócakaj někotare minuty a aktualizěruj bok.",
        "dberr-info": "(Njejo móžno ze serwerom datoweje banki zwězaś: $1)",
        "htmlform-no": "Ně",
        "htmlform-yes": "Jo",
        "htmlform-chosen-placeholder": "Wubjeŕ móžnosć",
+       "htmlform-cloner-create": "Wěcej pśidaś",
+       "htmlform-cloner-delete": "Wótpóraś",
+       "htmlform-cloner-required": "Nanejmjenjej jadna gódnota jo trěbna.",
        "sqlite-has-fts": "Wersija $1 z pódpěru za połnotekstowe pytanje",
        "sqlite-no-fts": "Wersija $1 bźez pódpěry za połnotekstowe pytanje",
        "logentry-delete-delete": "$1 jo bok $3 {{GENDER:$2|wulašował|wulašowała}}",
index 356baf2..969741c 100644 (file)
@@ -2,7 +2,8 @@
        "@metadata": {
                "authors": [
                        "FRANCIS5091",
-                       "FRANELYA"
+                       "FRANELYA",
+                       "아라"
                ]
        },
        "tog-underline": "Mangagaris pioputan:",
        "tog-hidepatrolled": "Lisoko idit tinamangan ih wagu kaalanai",
        "tog-newpageshidepatrolled": "Lisoko bolikon tinamangan mantad lis bolikon kawawagu",
        "tog-extendwatchlist": "Pointongo koinsanai listamangan do popokito koinsanai pinongundolihon, okon ko iri kawawagu nopo",
-       "tog-usenewrc": "Tinimungan nopingalanan maya bobolikon ii wagu kaalanai om lispintangan (momoguno JawaSikrip)",
+       "tog-usenewrc": "Tinimungan nopingalanan maya bobolikon ii wagu kaalanai om lispintangan",
        "tog-numberheadings": "oporian-mongonumbur it tuluhon",
-       "tog-showtoolbar": "Pokitono kakamotbar mongidit (momoguno JawaSikrip)",
-       "tog-editondblclick": "Idito bolikon momoguno induaan todos (momoguno JawaSikrip)",
-       "tog-editsectiononrightclick": "Pabanaro sikson mongidit momoguno todos golibang id sikson tuluon (momoguno JawaSikrip)",
-       "tog-rememberpassword": "Soroho ot loginku id popogihuman diti (gisom solinaid do $1 {{PLURAL:$1|tadau|madau}})",
+       "tog-showtoolbar": "Pokitono kakamotbar mongidit",
+       "tog-editondblclick": "Idito bolikon momoguno induaan todos",
+       "tog-editsectiononrightclick": "Pabanaro sikson mongidit momoguno todos golibang id sikson tuluon",
        "tog-watchcreations": "Ruhangai bolikon di winonsoiku om nogi pail pinosuangku id lisintanganku",
        "tog-watchdefault": "Ruhangai bolikon om tangapail di niditku id lisintanganku",
        "tog-watchmoves": "Ruhangai bolikon om tangapail di pinawalihku id lisintanganku.",
@@ -30,7 +30,7 @@
        "tog-shownumberswatching": "Pokitono ginumu do momomoguno minongintong",
        "tog-oldsig": "Sain poinsandad:",
        "tog-fancysig": "Pokitono sain sobaagi do tikwiki (ingaa oporian toput )",
-       "tog-uselivepreview": "Momoguno pongingintong poimpasi (momoguno JawaSikrip) (pogumbalan)",
+       "tog-uselivepreview": "Momoguno pongingintong poimpasi(pogumbalan)",
        "tog-forceeditsummary": "Posoroho oku no nung awu nosuangan kutak koinibaan niditan",
        "tog-watchlisthideown": "Polisoko niditanku mantad do lis piintangan",
        "tog-watchlisthidebots": "Polisoko niditan rinobot mantad do lis pintangan",
@@ -42,6 +42,8 @@
        "tog-diffonly": "Kada pokitono suang bobolikon id siriba tongodip",
        "tog-showhiddencats": "Pokitono katogori poinlisok",
        "tog-norollbackdiff": "Yadaai dip opongoh po do poturug-guli",
+       "tog-useeditwarning": "Poingato oku soira mongiduan dii bobolikon nopingalanan nga awu poh nokoopi",
+       "tog-prefershttps": "Toririmo do momoguno noputan di otingolig soira do sumuang log",
        "underline-always": "Toririmo",
        "underline-never": "Kada",
        "underline-default": "Kourasai pogigihum sandad",
        "oct": "Mas",
        "nov": "Lau",
        "dec": "Hau",
+       "january-date": "Milatok $1",
+       "february-date": "Mansak $1",
+       "march-date": "Gomot $1",
+       "april-date": "Ngiop $1",
+       "may-date": "Mikat $1",
+       "june-date": "Lumahas $1",
+       "july-date": "Madas $1",
+       "august-date": "Magus $1",
+       "september-date": "Manom $1",
+       "october-date": "Gumas $1",
+       "november-date": "Milau $1",
+       "december-date": "Momuhau $1",
        "pagecategories": "{{PLURAL:$1|Katogori|Katogori}}",
        "category_header": "Bobolikon id kalas \"$1\"",
        "subcategories": "Kawo do kalas",
        "newwindow": "(ukabai id liligaon wagu)",
        "cancel": "Kinsilo",
        "moredotdotdot": "Gumu...",
-       "morenotlisted": "Susuai poh ii awu nokosurat...",
+       "morenotlisted": "Lis diti awu poh nogonop.",
        "mypage": "Bolikon",
        "mytalk": "Pogibabarasan",
        "anontalk": "Piboros montok diti nantadon IP",
        "permalink": "Toput pointatap",
        "print": "Pirino",
        "view": "Intaai",
+       "view-foreign": "Pongitanan id $1",
        "edit": "Idito",
+       "edit-local": "Idito katarangan",
        "create": "Pomonsoi",
+       "create-local": "Ruhangai katarangan",
        "editthispage": "Idito iti bolikon",
        "create-this-page": "Pudoliai iti bolikon",
        "delete": "Pugaso",
        "deletethispage": "Pugaso iti bolikon",
+       "undeletethispage": "Kada pugaso iti bolikon",
        "undelete_short": "Kada pugaso {{PLURAL:$1|iso niditan|$1 niniditan}}",
        "viewdeleted_short": "Intaai {{PLURAL:$1|iso niditan pinugas|$1 niniditan pinugas}}",
        "protect": "Tingoligai",
        "articlepage": "Intaai suang bolikon",
        "talk": "Pogigibarasan",
        "views": "Pongintangan",
-       "toolbox": "Kabankamot",
+       "toolbox": "Tangakakamot",
        "userpage": "Intaai bolikon momomoguno",
        "projectpage": "Intaai bolikon purujik",
        "imagepage": "Intaai bolikon pail",
        "pool-errorunknown": "Ukam nosilap",
        "aboutsite": "Kokomoi {{SITENAME}}",
        "aboutpage": "Project:Kokomoi",
-       "copyright": "Suang di haro do kokomoi $1.",
+       "copyright": "Suang di haro do kokomoi $1 suai ko poinsolimpad nokomoi.",
        "copyrightpage": "{{ns:project}}:Sanganuwonsoi",
        "currentevents": "Poimpanau po",
        "currentevents-url": "Project:Poimpanau poh",
        "youhavenewmessages": "Kiharo $1 montok dia ($2).",
        "youhavenewmessagesfromusers": "Nakaramit ko do $1 mantad {{PLURAL:$3|momomoguno suai|$3 tongomomomoguno}} ($2).",
        "youhavenewmessagesmanyusers": "Nakaramit koh do $1 mantad do tongomomomoguno ($2).",
-       "newmessageslinkplural": "{{PLURAL:$1|pason kawawagu|tangapason kawawagu}}",
-       "newmessagesdifflinkplural": "dohuri do {{PLURAL:$1|naalanan|nopingalanan}}",
+       "newmessageslinkplural": "{{PLURAL:$1|pason kawawagu|999=tangapason kawawagu}}",
+       "newmessagesdifflinkplural": "dohuri do {{PLURAL:$1|naalanan|999=nopingalanan}}",
        "youhavenewmessagesmulti": "Kipason kawawagu montok dia id $1",
        "editsection": "idito",
        "editold": "idito",
        "nospecialpagetext": "<strong>Nokopokianu ko diri bolikon pinatantu poinsilap.</strong>\n\nLis pointopot bobolikon pinatantu okito id [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Nosilopan",
        "databaseerror": "Nakasala databing",
+       "databaseerror-query": "Timuhot: $1",
+       "databaseerror-function": "Gunoon: $1",
+       "databaseerror-error": "Silap: $1",
        "laggedslavemode": "'''Panansarahan:''' Awu moti kaanto nopinwoguan suang do bolikon diti.",
        "readonly": "Nokunsian databing",
        "enterlockreason": "Posuango sabab do mongunsi, poobion do gisom soira oukaban kunsi",
        "readonly_lag": "Databing noporianan nokokunsi daamot do databing mamalayan kumoduo mongogusa dilo kumoiso",
        "internalerror": "Kinosilapan poinsuang",
        "internalerror_info": "Kinosilapan poinsuang: $1",
-       "fileappenderrorread": "Awu abasa \"$1\" maso pinapaapil.",
-       "fileappenderror": "Awu kapaapil \"$1\" mongoi \"$2\".",
        "filecopyerror": "Awu kadalin pail  \"$1\" gisom \"$2\".",
        "filerenameerror": "Awu  nopingaranan pail \"$1\" mongoi \"$2\".",
        "filedeleteerror": "Awu nopugas pail \"$1\".",
        "directorycreateerror": "Awu kowonsoi pailtuduk \"$1\".",
        "filenotfound": "Awu oihum pail \"$1\"",
-       "fileexistserror": "Awu kasaga do monurat pail \"$1\": kipail noh",
        "unexpected": "Awu nopoimanan gatang: \"$1\"=\"$2\".",
        "formerror": "Silap: awu kapaatod pom",
        "badarticleerror": "Awu milo momonsoi dino id bolikon diti.",
        "cannotdelete": "Iti bolikon toi pail \"$1\" awu milo pugason.\nNopugas no kaanto do tulun suai.",
        "cannotdelete-title": "Awu milo pugason bolikon \"$1\"",
        "delete-hook-aborted": "Niditan pinaratu do kakait.\nIngaa kointalangan narait.",
+       "no-null-revision": "Awu kopomudali sinimakan null kawawagu montok bolikon \"$1\"",
        "badtitle": "Sosomu tuluhon",
        "badtitletext": "Tuluhon bobolikon di pinokianu nopo nga nokosilap, aiso, nakasala pinioputan boros toi pinioputan tuluhon wiki.\nHaro kaanto sokukuri do iso pimato it awu milo gunoon id pongkotuluhon.",
        "perfcached": "Data sumusuhut namadangkob om okon ko noinwoguan. Sokiginumu do  {{PLURAL:$1|iso asil|$1 tangahasil nopo nga}} haro id dangkob diti.",
        "namespaceprotected": "Ingaa kasagaannu do mongidit bobolikon it kinoingaran '''$1'''.",
        "customcssprotected": "Ingaa kasagaannu do mongidit diti bolikon CSS, tu kisuang ponguludan minsosondiri momoguno.",
        "customjsprotected": "Ingaa kasagaannu do mongidit diti bolikon JavaScript, tu kisuang ponguludan minsosondiri momoguno.",
+       "mycustomcssprotected": "Ingaa kasagaannu do monimban diti bobolikon CSS.",
+       "mycustomjsprotected": "Ingaa kasagaannu do monimban diti bilikon Javascript.",
+       "myprivateinfoprotected": "Ingaa kasagaannu do monimban diti kointalangan minsosondirinu.",
+       "mypreferencesprotected": "Ingaa kasagaannu do monimban diti komoisaannu.",
        "ns-specialprotected": "Bolikon pinotontu awu milo iditon.",
        "titleprotected": "Notingoligan tuluhon diti mantad wonsoyon do [[User:$1|$1]].\nSasabab no do \"''$2''\".",
        "filereadonlyerror": "Awu milo do simbanan pail \"$1\" tu pinogompi iti pail \"$2\" id mud do basaon noh tomod.\n\nMongungulud di minongunsi pinopointalang do kointalangan diti: \"$3\".",
        "invalidtitle-knownnamespace": "Pogoduhan tuluhon kiruangaran \"$2\" om tiik \"$3\"",
        "invalidtitle-unknownnamespace": "Pogoduhan tuluhon it awu ointutunan ruangaran numbur $1 om tiik \"$2\"",
        "exception-nologin": "Amu nokolog sumuang",
-       "exception-nologin-text": "Bolikon diti toi koimaan diti mumang do sumuang log koh id wiki diti.",
+       "exception-nologin-text": "Mangai [[Special:Userlogin|log in]] kaanu koh do minwaya id wiki diti.",
        "virus-badscanner": "Araat kinooturon: Awu otutunan pongkowili giuk: ''$1''",
        "virus-scanfailed": "nolibai pongkowili (code $1)",
        "virus-unknownscanner": "tantobgiuk awu otutunan:",
-       "logouttext": "'''Baino nakalabus log ko noh.'''\n\nMilo ko do monilombus mongoguno {{SITENAME}} poinlisok, toi <span class='plainlinks'>[$1 sumuang log koh kawagu]</span> miagal ngaran di tiinu toi mongoguno ngaran suai.\nBirio do kipipiro bolikon popokito do maso poinsuang log koh poh gisom no do opugas nu dangkob do pogigihumnu.",
+       "logouttext": "'''Baino nakalabus log ko noh.'''\n\nBirio do kipipiro bolikon popokito do maso poinsuang log koh poh gisom noh do opugas nu dangkob do pogigihumnu.",
        "welcomeuser": "Kotobian dongkorikatan, $1!",
        "welcomecreation-msg": "Nowonsoi noh akaunnu.\nSoroho noh do mongolon do [[Special:Preferences|{{SITENAME}} komoisaannu]].",
        "yourname": "Ngarandait:",
+       "userlogin-yourname": "Ngaranmoguno",
+       "userlogin-yourname-ph": "Posurato ngaranmogunonu",
+       "createacct-another-username-ph": "Posuango o ngaranmoguno",
        "yourpassword": "Kaatalib:",
+       "userlogin-yourpassword": "Borospalapus",
+       "userlogin-yourpassword-ph": "Posurato borospanalibnu",
+       "createacct-yourpassword-ph": "Posuango borospanalib",
        "yourpasswordagain": "Mintaipo kaatalib:",
+       "createacct-yourpasswordagain": "Kompomo borospanalib",
+       "createacct-yourpasswordagain-ph": "Posuango kaagu borospanalib",
        "remembermypassword": "Soroho ot loginku id popogihuman diti (gisom solinaid do $1 {{PLURAL:$1|tadau|madau}})",
+       "userlogin-remembermypassword": "Potilombuso oku do poinsuang log",
+       "userlogin-signwithsecure": "Gunoo noputan noumoligan",
        "yourdomainname": "Damin nu:",
        "password-change-forbidden": "Awu koh kopongolon kaatalib id wiki diti.",
        "externaldberror": "Haro nokosilap pongintutunan bingdata toi awu ko pasagaon monginwagu takaun poinsoliwannu.",
        "logout": "Lumabus log",
        "userlogout": "Lumabus log",
        "notloggedin": "Amu nokolog sumuang",
+       "userlogin-noaccount": "Ingaa poh takaun?",
+       "userlogin-joinproject": "Tanud {{SITENAME}}",
        "nologin": "Ingaa akaun? $1",
        "nologinlink": "Pomonsoi do akaun",
        "createaccount": "Pomonsoi do takaun",
        "gotaccount": "Kitakaun? $1",
        "gotaccountlink": "Sumuang log",
        "userlogin-resetlink": "Nolihuan ahal loginnu?",
+       "userlogin-resetpassword-link": "Nolihuan borospanalibnu?",
+       "userlogin-helplink2": "Sokodung do sumuang log",
        "createaccountmail": "Gunoo nunu nopo kaatalib om pootodo id surat-i ii poinsurat id siriba diti",
        "createaccountreason": "Sabab:",
        "badretype": "Kaatalib pinosuang awu kopisangai.",
        "savearticle": "Umoligai bolikon",
        "preview": "Kokitanan",
        "showpreview": "Pokitono pongintangan",
-       "showlivepreview": "Kokitanan monilombus",
        "showdiff": "Pokitono nokowolion",
        "anoneditwarning": "'''Woning:''' Awu ko poinlog sumuang.\nNantadon IPnu maan podolino id susuyan bolikon nidit do hiti.",
        "anonpreviewwarning": "''Awu ko poinsuang log. Popogompi do sinuratan koponurat do kinoyonon IPnu id bobolikon susuyan niditan.''",
        "search-nonefound": "Ingaa kootuson kaagal di kuiri.",
        "powersearch-legend": "Pogigihum poimogot",
        "powersearch-ns": "Pogihum momoguno ngaran:",
-       "powersearch-redir": "Liniisan nopotilombus",
        "powersearch-togglelabel": "Imuriai:",
        "powersearch-toggleall": "Oinsanan",
        "powersearch-togglenone": "Ingaa",
        "prefs-advancedsearchoptions": "Pomilian pointilombus",
        "prefs-advancedwatchlist": "Pomilian pointilombus",
        "prefs-displayrc": "Pomilian pongitanan",
-       "prefs-displaysearchoptions": "Pomilian pongitanan",
        "prefs-displaywatchlist": "Pomilian pongitanan",
        "prefs-diffs": "Pisuaian",
        "email-address-validity-valid": "Porikatan surat-i asaah",
        "recentchanges-label-bot": "Niditan diti winonsoi do robot",
        "recentchanges-label-unpatrolled": "Niditan diti awu poh nosimak",
        "rcnotefrom": "Id siriba diti pokitonon ii nopingalanan mantad '''$2''' (gisom '''$1''' ).",
-       "rclistfrom": "Pokitono naalanan kawawagu tumimpuun mantad $1",
+       "rclistfrom": "Pokitono naalanan kawawagu tumimpuun mantad $3 $2",
        "rcshowhideminor": "$1 niditan tokoto",
        "rcshowhidebots": "Roboto $1",
        "rcshowhideliu": "$1 momomoguno poinlog sinumuang",
index a5e45b8..938621b 100644 (file)
@@ -3,7 +3,9 @@
                "authors": [
                        "Lévi",
                        "Reder",
-                       "Geitost"
+                       "Geitost",
+                       "아라",
+                       "Shirayuki"
                ]
        },
        "tog-underline": "Tîra 'na rîga sòta i colegamèint.",
        "jumpto": "Và a:",
        "jumptonavigation": "Navigasiòun",
        "jumptosearch": "Sērca",
-       "view-pool-error": "In cól mumèint ché i terminêl în trôp câregh.\nTrôp utèint în drē serchêr ed vèder cla pàgina ché.\nSpèta soquânt minût préma ed pruvêr incòra a carghêr la pgina.\n\n$1",
+       "view-pool-error": "A s' în deşpiêş mó in cól mumèint ché i terminêl în trôp câregh.\nTrôp utèint în drē serchêr ed vèder cla pàgina ché.\nSpèta soquânt minût préma ed pruvêr incòra a carghêr la pàgina.\n\n$1",
+       "generic-pool-error": "A s' în deşpiêş mó in cól mumèint ché i terminêl în trôp câregh.\nTrôp utèint în drē serchêr ed vèder cla risōrsa ché.\nSpèta soquânt minût préma ed pruvêr incòra a carghêr la risōrsa.",
        "pool-timeout": "Tèimp che gh'é da spetêr préma dal sblôch.",
        "pool-queuefull": "A ghé la fîla, trôpa gînta a vōl vèder la pàgina, prōva tra soquânt minût",
        "pool-errorunknown": "Erōr mìa cgnusû",
        "readonly_lag": "Al databêş l'é stê bluchê in avtomàtich per permèter a i terminêl cun al databêş schiêv ed mètres in pâs cun al master",
        "internalerror": "Erōr intêren",
        "internalerror_info": "Erōr intêren: $1",
-       "fileappenderrorread": "An n'é mìa stê pusébil lēşer \"$1\" mèinter es fêva la zûnta.",
-       "fileappenderror": "An n'é mìa pusébil zuntêr \"$1\" a \"$2\".",
        "filecopyerror": "An n'é mìa pusébil cupiêr al file \"$1\" in \"$2\".",
        "filerenameerror": "An n'é mìa pusébil cambiêr al nòm ed \"$1\" in \"$2\".",
        "filedeleteerror": "An n'é mìa pusébil scanşlêr al file \"$1\".",
        "directorycreateerror": "An n'é mìa pusébil fêr la directory \"$1\".",
        "filenotfound": "An n'é mìa pusébil catêr al file \"$1\".",
-       "fileexistserror": "An n'é mìa pusébil scréver al file \"$1\": al file al gh'é bèle.",
        "unexpected": "Valōr mìa pervést \"$1\"=\"$2\".",
        "formerror": "Erōr: an n'é ma pusébil spidîr al môdul.",
        "badarticleerror": "Operasiòun mìa permésa per cla pàgina ché.",
        "viewsourcetext": "L'é pusébil vèder e cupiêr al côdis surzéia ed cla pàgina ché.",
        "viewyourtext": "L'é pusébil vèder e cupiêr al côdis surzéia dal \"tō mudéfichi\" ed cla pàgina ché:",
        "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.",
+       "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'''.",
        "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.",
        "userlogin-helplink2": "Ajót per l'ingrès",
        "userlogin-loggedin": "T'ét bèle coleghê {{GENDER:$1|$1}}. \nDrōva al mōdul ché sòta cme un êter utèint.",
        "userlogin-createanother": "Fà 'n' êtra utèinsa.",
-       "createacct-join": "Mèt dèinter al tō infurmasiòun ché sòta.",
-       "createacct-another-join": "Mèt dèinter al j infurmasiòun per la registrasiòun ché sòta.",
        "createacct-emailrequired": "Indirés pôsta eletrônica",
        "createacct-emailoptional": "Indirés pôsta eletrônica (se 's vōl)",
        "createacct-email-ph": "Scrév al tó indirés ed pôsta eletrônica",
        "savearticle": "Sêlva la pàgina",
        "preview": "Guêrda préma",
        "showpreview": "Guêrda préma 'd salvêr",
-       "showlivepreview": "Guêrda préma diretamèint",
        "showdiff": "Guêrda i cambiamèint",
        "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è.",
        "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.\"",
        "accmailtitle": "Cêva 'd ingrès spidîda.",
        "accmailtext": "'Na cêva 'd ingrés l'è stêda fâta a chêş per [[User talk:$1|$1]] e l'è stêda spidîda a $2. Cla cêva 'd ingrès ché la pōl èser cambiêda int la pàgina per ''[[Special:ChangePassword|cambiêr la cêva 'd ingrès]]'' subét dôp avèir fât l'ingrès.",
        "newarticle": "(Nōv)",
-       "newarticletext": "Al colegamèint apèina fât al cumbîna cun 'na pàgina ch' an n'é mìa incòra stêda fâta. S'ét vō fêr la pàgina adès, l'é asê cumincêr a scréver al tèst int la caşèla ché sòt (per vedèr infurmasiòun pió precîşi guêrda la [{{MediaWiki:Helppage}}| pàgina 'd ajót]). Se al colegamèint  l'é stê avêrt per erōr, l'é asê clichêr al pulsânt \"Indrē\" dal tó navigadōr.",
+       "newarticletext": "Al colegamèint apèina fât al cumbîna cun 'na pàgina ch' an n'é mìa incòra stêda fâta. S'ét vō fêr la pàgina adès, l'é asê cumincêr a scréver al tèst int la caşèla ché sòt (per vedèr infurmasiòun pió precîşi guêrda la [$1 pàgina 'd ajót]). Se al colegamèint  l'é stê avêrt per erōr, l'é asê clichêr al pulsânt \"Indrē\" dal tó navigadōr.",
        "anontalkpagetext": "----'' Còsta l'è la pàgina 'd discusiòun ed 'n utèint sèinsa nòm, ch' an n' à mìa incòra fât 'n' utèinsa o in tót al manēri an n'è mìa drē druvêrla. Per arcgnòsrel l'è dòunca necesâri druvê al só indirés IP. J indirés IP a pōlen èser spartî cun êter utèint. Se t'è un utèint sèinsa nòm e 't pèins che i cumèint in cla pàgina ché an riguêrden mìa tè, [[Special:UserLogin/signup|fa 'n' utèinsa nōva]] o [[Special:UserLogin|vîn dèinter cun còla ch' ét gh'ê bèle]] per schivşêr, in futûr,  'd èser cunfûş cun 'd j êter utèint sèinsa nòm.''",
        "noarticletext": "In cól mumèint ché la pàgina serchêda l'é vōda. L'é pusébil [[Special:Search/{{PAGENAME}}|serchêr sté tétol]] int al j êtri pàgini dal sît, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} serchêr int i regéster coleghê] opór  [{{fullurl:{{FULLPAGENAME}}|action=edit}} mudifichêr la pàgina adèsa]</span>.",
        "noarticletext-nopermission": "In cól mumèint ché la pàgina serchêda l'é vōda. L'é pusébil [[Special:Search/{{PAGENAME}}|serchêr sté tétol]] int al j êtri pàgini dal sît o<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} serchêr int i regéster coleghê] <span>, mó an 't gh'ê mìa al permès ed fêr cla pàgina ché.",
        "edit-gone-missing": "Impusébil arnuvêr la pàgina. \nA sèmbra ch'la sìa stêda scanşlêda.",
        "edit-conflict": "Cuntrâst 'd edisiòun.",
        "edit-no-change": "La mudéfica an n'é mìa stêda cunsidrêda perchè an n'é mìa stê fât di cambiamèint al tèst.",
-       "postedit-confirmation": "La mudéfica l'é stêda salvêda.",
+       "postedit-confirmation-created": "La pàgina l'é stêda fâta",
+       "postedit-confirmation-restored": "La pàgina l'é stêda turnêda a mèter",
+       "postedit-confirmation-saved": "La mudéfica l'é stêda salvêda.",
        "edit-already-exists": "L'é impusébil fêr 'na pàgina nōva.\nLa ghé bèle.",
        "defaultmessagetext": "Tèst pre-stabilî",
        "content-failed-to-parse": "L'é impusébil cunsidrêr $2 p'r al mudèl $1:$3",
        "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-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-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)",
        "rev-suppressed-text-view": "Cla versiòun ché 'd la pàgina l'é stêda <strong> scanşlêda </strong>. J aministradōr a pōlen incòra guardêrla; \nconsultêr al [{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} log dal canşladûri] per nōv particulêr.",
        "rev-deleted-no-diff": "An n'é mìa pusébil guardêr cól cunfrûnt ché tra 'l versiòun perchè óna dal revisiòun l'é stêda <strong> scanşlêda </strong>. Consûlta al [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log dal scanşladûri] per i particulêr.",
        "rev-suppressed-no-diff": "An n'é mìa pusébil guardêr cól cunfrûnt ché tra 'l versiòun perchè óna dal revisiòun l'é stêda <strong> scanşlêda </strong>.",
-       "rev-deleted-unhide-diff": "Ó dal revisiòun de sté cunfrûnt l'é stêda <strong> scanşlêda </strong>. Consultêr al [{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} log dal scanşladûri] per i particulêr.\nS' l' é necesâri a j aministradōr a gh'é incòra permés [$1 ed guardêr cla versiòun ché].",
+       "rev-deleted-unhide-diff": "Óna dal revisiòun de sté cunfrûnt l'é stêda <strong> scanşlêda </strong>. Consultêr al [{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} log dal scanşladûri] per i particulêr.\nS' l' é necesâri a j aministradōr a gh'é incòra permés [$1 ed guardêr cla versiòun ché].",
+       "rev-suppressed-unhide-diff": "Óna dal revisiòun de sté cunfrûnt ed versiòun l'é stêda <strong> scanşlêda </strong>. \nA pré èsregh di particulêr int al {{#Special:Log}}/delete|page={{PAGENAMEE}}}} log dal scanşladûri]. \nSét vō cme aministradōr ét pō incòra [$1 guardêr sté cunfrûnt ed versiòun].",
+       "rev-deleted-diff-view": "Óna dal revisiòun de sté cunfrûnt ed versiòun l'é stêda <strong> scanşlêda </strong>. \nCme aministradōr ét pō guardêr sté cunfrûnt ed versiòun; a prén èsregh di particulêr int al {{#Special:Log}}/delete|page={{PAGENAMEE}}}} log dal scanşladûri].",
+       "rev-suppressed-diff-view": "Óna dal revisiòun de sté cunfrûnt ed versiòun l'é stêda <strong> spustêda </strong>. \nCme aministradōr ét pō guardêr sté cunfrûnt ed versiòun; a prén èsregh di particulêr int al {{#Special:Log}}/delete|page={{PAGENAMEE}}}} log dal scanşladûri].",
        "rev-delundel": "Guêrda/nascònd",
+       "rev-showdeleted": "fà vèder",
+       "revisiondelete": "Scanşèla o tōrna a mèter versiòun",
+       "revdelete-nooldid-title": "Versiòun mìa precişêda",
+       "revdelete-nooldid-text": "An n'é mìa stê precişê nisóna versiòun 'd la pàgina in dó fêr cla funsiòun ché, la versiòun precişêda l' an gh'é mìa opór a s' é drē pruvêr ed lughêr la vèrsiòun 'd adèsa.",
+       "revdelete-no-file": "Al file precişê an gh'é mìa.",
+       "revdelete-show-file-confirm": "A 's vōl vèder la versiòun scanşlêda dal file \"<nowiki>$1</nowiki>\" dal $2 al $3?",
+       "revdelete-show-file-submit": "Sé",
+       "revdelete-selected-text": "{{PLURAL:$1|Versiòun sernîda| Versiòun sernîdi}} ed [[:$2]]:",
+       "revdelete-selected-file": "{{PLURAL:$1|Versiòun sernîda| Versiòun sernîdi}} dal file ed [[:$2]]:",
+       "logdelete-selected": "{{PLURAL:$1|Fât dal regéster sernî}}:",
+       "revdelete-text-text": "Al versiòun scanşlêdi as vèden incòra int la stòria 'd la pàgina, mó pcòun ed còl che gh'é dèinter al srà mìa vést dal póblich.",
+       "revdelete-text-file": " Al versiòun di file scanşlê as vèden incòra int la stòria dal file, mó pcòun ed còl che gh'é dèinter al srà mìa vést dal póblich.",
+       "logdelete-text": "I fât scanşlê as vèden incòra int la stòria 'd la pàgina, mó pcòun ed còl che gh'é dèinter al srà mìa vést dal póblich.",
+       "revdelete-text-others": "Êter aministradōr ed {{SITENAME}} a srân incòra bòun ed vèder j argomèint lughê e prân a turnêri a mèter incòra ed nōv per mèz ed cól canêl ché, se în mìa stê impustê di nōv lémit.",
+       "revdelete-confirm": "Per piaşèir cunfèirma che còst l'é còl ch'ét vō fêr, che t'é infurmê dal cunseguèinsi, e che t'é drē fêr còst int al rispèt dal [[{{MediaWiki:Policy-url}}|léni guîda]].",
+       "revdelete-suppress-text": "La scanşlêda la duvré èser druvêda <strong>sōl</strong> in chi chêş ché:\n* infurmasiòun che prén èser calónij \n* infurmasiòun personêli cme \n*: <em>indirés, nómer ed telèfon, côdis fischêl, e via acsé.</em>",
+       "revdelete-legend": "Impôsta i lémit seguèint al versiòun scanşlêdi:",
+       "revdelete-hide-text": "Tèst ed la versiòun",
+       "revdelete-hide-image": "Lōga j argumèint dal file",
+       "revdelete-hide-name": "Lōga l'asiòun e l'elemèint ed la 'stèsa",
+       "revdelete-hide-comment": "Elemèint ed la mudéfica o spiegasiòun ed l'asiòun",
+       "revdelete-hide-user": "Nòm o indirés IP ed l'avtōr",
+       "revdelete-hide-restricted": "Lōga al j infurmasiòun sgnêdi ânch a j aministradōr",
+       "revdelete-radio-same": "(an cambiêr mìa)",
        "revdelete-radio-set": "Nascònd",
        "revdelete-radio-unset": "Fà vèder",
+       "revdelete-suppress": "Lōga al j infurmasiòun sgnêdi ânch a j aministradōr",
+       "revdelete-unsuppress": "Tó via i lémit al revisiòun armési",
+       "revdelete-log": "Mutîv:",
+       "revdelete-submit": "Drōva {{PLURAL:$1|int la revisiòun sernîda|int al revisiòun sernîdi}}",
+       "revdelete-success": "<strong>Vésta ed la revisòun arnuvêda int al môd gióst.</strong>",
+       "revdelete-failure": "<strong>La vésta 'd la versiòun l'an pōl mìa èser arnuvêda:</strong>\n$1",
+       "logdelete-success": "<strong>Vésta dal fât impustêda int al môd gióst.</strong>",
+       "logdelete-failure": "<strong>La vésta dal fât l'an pōl mìa èser impustêda:</strong>\n$1",
        "revdel-restore": "Câmbia la vidûda.",
+       "pagehist": "Stòria 'd la pàgina",
+       "deletedhist": "Stòria scanşlêda",
+       "revdelete-hide-current": "Imposébil lughêr l'elemèint cun dâta $1 $2 perchè l'é la revişiòun'd adès.",
+       "revdelete-show-no-access": "Imposébil fêr vèder l'elemèint perché l'é stê arcgnusû cme ''riservê''  e an 's gh'à mìa al permès ed fêrel.",
+       "revdelete-modify-no-access": "Imposébil fêr vèder l'elemèint cun dâta $1 $2 perché l'é stê arcgnusû cme \"riservê\"  e an 's gh'à mìa al permès ed fêrel.",
+       "revdelete-modify-missing": "Imposébil fêr vèder l'elemèint cun ID $1 perché an gh'é mìa int al databêş.",
+       "revdelete-no-change": "<strong>Atèinti:</strong> l'elemèint cun dâta $1 $2 al gh'îva bèle al j impustasiòun  ed vésta dmandê.",
+       "revdelete-concurrent-change": "Imposébil mudifichêr l'elemèint cun dâta $1 $2 perché la só cundisiòun l'é stêda cambiêda da 'n êter utèint mèinter a 's tintêva ed fêr la mudéfica.",
+       "revdelete-only-restricted": "Erōr int al lughêr l'elemèint cun dâta $1 $2: an n'é mìa pusébil lughêr j elemèint a la vésta ed j aministradōr sèinsa sernîr almēno 'n êtra siēlta de spustamèint.",
+       "revdelete-reason-dropdown": "*Mutîv pió cumûn per la scanşladûra\n**Mìa rispèt dal dirét 'd avtōr\n**Cumèint o infurmasiòun personêli mìa adâti\n**Nòm utèint mìa adât\n**Infurmasiòun ch'la pré ufènder",
+       "revdelete-otherreason": "Êter mutîv o mutîv zuntê:",
        "revdelete-reasonotherlist": "Êtra ragiòun",
+       "revdelete-edit-reasonlist": "Câmbia i mutîv per la scanşladûra",
+       "revdelete-offender": "Avtōr ed la versiòun:",
+       "suppressionlog": "Tâj",
        "revertmerge": "Scanşèla l'uniòun",
        "history-title": "$1 stòria dal mudéfichi",
        "lineno": "Rîga $1:",
        "searchmenu-exists": "'''Int al sît a gh'é 'na pàgina cun al nòm [[:$1]].'''\n{{PLURAL:$2|0=|Guêrda ânca chiêter ch'în stê catê.}}",
        "searchmenu-new": "<strong>Şvilópa la pàgina \"[[:$1]]\" insém a cól sît ché!</strong> {{PLURAL:$2|0=|Guêrda ânch la pàgina che t'é serchê|Guêrda ânch i rişultêt catê}}.",
        "searchprofile-articles": "Pàgini 'd j argumèint",
-       "searchprofile-project": "Pàgini 'd ajót e relatîvi al prugèt.",
        "searchprofile-images": "Multimèdia",
        "searchprofile-everything": "Tót",
        "searchprofile-advanced": "Specêla",
        "searchprofile-articles-tooltip": "Sèirca in $1",
-       "searchprofile-project-tooltip": "Sèirca in $1",
        "searchprofile-images-tooltip": "Sèirca 'file'",
        "searchprofile-everything-tooltip": "Sērca dapertót (ânch int al pàgini 'd discusuòun).",
        "searchprofile-advanced-tooltip": "Sērca int i spâsi di nòm fât só mzûra.",
        "timezoneregion-pacific": "Ocèan Pacéfich",
        "youremail": "E-mail:",
        "username": "{{GENDER:$1|Nòm utèint}}",
-       "uid": "{{GENDER:$1|utèint}}",
        "prefs-memberingroups": "{{GENDER:$2|Elemèint}}{{PLURAL:$1|dal gróp|di gróp}}:",
        "yourrealname": "Nòm vèira:",
        "yourlanguage": "Léngua",
        "recentchanges-label-bot": "Cla mudéfica ché l'é stêda fâta da un bot.",
        "recentchanges-label-unpatrolled": "Cla mudéfica ché an n'é mìa incòra stêda verifichêda.",
        "rcnotefrom": "Ché sòt a gh'é la lésta dal mudéfichi fâti a partîr da <strong>$2</strong>(fîn a <strong>$1</strong>).",
-       "rclistfrom": "Fà vèder al mudéfichi fâti a partîr da $1.",
+       "rclistfrom": "Fà vèder al mudéfichi fâti a partîr da $3 $2",
        "rcshowhideminor": "$1 al mudéfichi céchi",
        "rcshowhidebots": "$1 i bot",
        "rcshowhideliu": "$1 j utèint registrê",
        "booksources-go": "Và",
        "log": "Regéster",
        "allpages": "Tót al pàgini.",
-       "alphaindexline": "da $1 a $2",
        "allarticles": "Tót al pàgini.",
        "allpagessubmit": "Và",
        "categories": "Categoréi",
        "file-info-gif-looped": "A ripetisiòun",
        "file-info-png-looped": "A ripetisiòun",
        "newimages-legend": "Fîltra",
-       "showhidebots": "($1 i bot)",
        "ilsubmit": "Sērca",
        "bydate": "per dâta",
        "ago": "$1 fa",
index e96afb9..87fe5ba 100644 (file)
@@ -35,7 +35,8 @@
                        "Απεργός",
                        "Περίεργος",
                        "לערי ריינהארט",
-                       "Kolega2357"
+                       "Kolega2357",
+                       "아라"
                ]
        },
        "tog-underline": "Υπογράμμιση συνδέσμων:",
        "readonly_lag": "Η βάση δεδομένων έχει κλειδωθεί αυτόματα για να μπορέσουν οι επιμέρους servers των αντιγράφων της βάσης δεδομένων (slaves) να καλύψουν τη διαφορά με τον κεντρικό server του πρωτοτύπου της βάσης (master).",
        "internalerror": "Εσωτερικό σφάλμα",
        "internalerror_info": "Εσωτερικό σφάλμα: $1",
-       "fileappenderrorread": "Δεν ήταν δυνατή η ανάγνωση του «$1» κατά τη διάρκεια της επισύναψης.",
-       "fileappenderror": "Δεν ήταν δυνατή η προσάρτηση του αρχείου «$1» στο «$2».",
        "filecopyerror": "Δεν ήταν δυνατή η αντιγραφή του αρχείου «$1» στο «$2».",
        "filerenameerror": "Δεν είναι δυνατή η μετονομασία του αρχείου «$1» σε «$2».",
        "filedeleteerror": "Δεν ήταν δυνατή η διαγραφή του αρχείου «$1».",
        "directorycreateerror": "Δεν μπορούσε να δημιουργηθεί η κατηγορία «$1».",
        "filenotfound": "Δεν είναι δυνατή η ανεύρεση του αρχείου «$1».",
-       "fileexistserror": "Αδύνατον να εγγραφεί στο αρχείο «$1»: το αρχείο υπάρχει",
        "unexpected": "Μη προσδοκώμενη τιμή: «$1»=«$2».",
        "formerror": "Σφάλμα: Δεν ήταν δυνατή η υποβολή της φόρμας!",
        "badarticleerror": "Η ενέργεια αυτή δεν μπορεί να εκτελεσθεί στη συγκεκριμένη σελίδα.",
        "userlogin-resetpassword-link": "Ξεχάσατε τον κωδικό πρόσβασης;",
        "userlogin-loggedin": "Είστε ήδη {{GENDER:$1|συνδεδεμένος|συνδεδεμένη}} ως $1.\nΧρησιμοποιήστε την παρακάτω φόρμα για να συνδεθείτε ως άλλος χρήστης.",
        "userlogin-createanother": "Δημιουργήσετε έναν άλλο λογαριασμό",
-       "createacct-join": "Εισάγετε τα στοιχεία σας παρακάτω.",
-       "createacct-another-join": "Εισάγετε τα στοιχεία του νέου λογαριασμού παρακάτω.",
        "createacct-emailrequired": "Διεύθυνση ηλεκτρονικού ταχυδρομείου",
        "createacct-emailoptional": "Διεύθυνση ηλεκτρονικού ταχυδρομείου (προαιρετικό)",
        "createacct-email-ph": "Εισάγετε το email σας",
        "savearticle": "Αποθήκευση σελίδας",
        "preview": "Προεπισκόπηση",
        "showpreview": "Εμφάνιση προεπισκόπησης",
-       "showlivepreview": "Άμεση προεπισκόπιση",
        "showdiff": "Εμφάνιση αλλαγών",
        "anoneditwarning": "'''Προειδοποίηση:''' Δεν έχετε συνδεθεί. Η διεύθυνση IP σας θα καταγραφεί στο ιστορικό επεξεργασίας αυτής της σελίδας.",
        "anonpreviewwarning": "''Δεν έχετε συνδεθεί. Η αποθήκευση θα καταγράψει την διεύθυνσή IP σας στο ιστορικό επεξεργασίας αυτής της σελίδας.''",
        "edit-gone-missing": "Δεν ήταν εφικτό να ενημερωθεί η σελίδα.\nΦαίνεται πως έχει διαγραφεί.",
        "edit-conflict": "Σύγκρουση επεξεργασιών.",
        "edit-no-change": "Η επεξεργασία σας αγνοήθηκε, επειδή δεν έγινε καμία αλλαγή στο κείμενο.",
-       "postedit-confirmation": "H επεξεργασία σας αποθηκεύτηκε.",
+       "postedit-confirmation-saved": "H επεξεργασία σας αποθηκεύτηκε.",
        "edit-already-exists": "Δεν ήταν εφικτό να δημιουργηθεί η νέα σελίδα.\nΥπάρχει ήδη.",
        "defaultmessagetext": "Προεπιλεγμένο κείμενο μηνύματος",
        "content-failed-to-parse": "Απέτυχε η ανάλυση  περιεχομένου του $2 για το μοντέλο $1:$3",
        "search-nonefound": "Δεν υπάρχουν αποτελέσματα που να ικανοποιούν το ερώτημα.",
        "powersearch-legend": "Αναλυτική αναζήτηση",
        "powersearch-ns": "Αναζήτηση στις περιοχές ονομάτων:",
-       "powersearch-redir": "Κατάλογος ανακατευθύνσεων",
        "powersearch-togglelabel": "Έλεγχος:",
        "powersearch-toggleall": "Όλες",
        "powersearch-togglenone": "Καμία",
        "prefs-advancedsearchoptions": "Προηγμένες επιλογές",
        "prefs-advancedwatchlist": "Προηγμένες επιλογές",
        "prefs-displayrc": "Εμφάνιση επιλογών",
-       "prefs-displaysearchoptions": "Επιλογές εμφάνισης",
        "prefs-displaywatchlist": "Επιλογές εμφάνισης",
        "prefs-tokenwatchlist": "Κλειδί",
        "prefs-diffs": "Διαφορές",
        "recentchanges-legend-heading": "'''Υπόμνημα:'''",
        "recentchanges-legend-newpage": "(δείτε [[Special:NewPages|Νέες σελίδες]])",
        "rcnotefrom": "Παρακάτω είναι οι αλλαγές από τις <strong>$2</strong>  (εμφανίζονται μέχρι <strong>$1</strong> ).",
-       "rclistfrom": "Εμφάνιση νέων αλλαγών αρχίζοντας από $1",
+       "rclistfrom": "Εμφάνιση νέων αλλαγών αρχίζοντας από $3 $2",
        "rcshowhideminor": "$1 μικροεπεξεργασιών",
        "rcshowhideminor-show": "Εμφάνιση",
        "rcshowhideminor-hide": "Απόκρυψη",
        "uploadstash-errclear": "Η εκκαθάριση των αρχείων ήταν ανεπιτυχής.",
        "uploadstash-refresh": "Ανανεώσετε τη λίστα των αρχείων",
        "img-auth-accessdenied": "Δεν επετράπη η πρόσβαση",
-       "img-auth-nopathinfo": "Λείπει το PATH_INFO.\nΟ διακομιστής σας δεν είναι ρυθμισμένος για να περάσει αυτές τις πληροφορίες.\nΜπορεί να είναι βασισμένος σε CGI και να μην υποστηρίζει img_atuh.\nΔείτε https://www.mediawiki.org/wiki/Manual:Image_Authorization",
+       "img-auth-nopathinfo": "Λείπει το PATH_INFO.\nΟ διακομιστής σας δεν είναι ρυθμισμένος για να περάσει αυτές τις πληροφορίες.\nΜπορεί να είναι βασισμένος σε CGI και να μην υποστηρίζει img_atuh.\nΔείτε https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization",
        "img-auth-notindir": "Η ζητούμενη διαδρομή δεν βρίσκεται στον διαμορφωμένο αρχειοκατάλογο επιφορτώσεων",
        "img-auth-badtitle": "Αδύνατη η κατασκευή έγκυρου τίτλου από \"$1\".",
        "img-auth-nologinnWL": "Δεν έχετε συνδεθεί και η \"$1\" δεν είναι στην άσπρη λίστα.",
        "watchlist-details": "{{PLURAL:$1|$1 σελίδα|$1 σελίδες}} στη λίστα παρακολούθησης σας, χωρίς να προσμετρούνται οι σελίδες συζήτησης.",
        "wlheader-enotif": "Η ειδοποίηση ηλεκτρονικού ταχυδρομείου ενεργοποιήθηκε.",
        "wlheader-showupdated": "Σελίδες που έχουν υποστεί αλλαγές από την τελευταία φορά που τις επισκεφθήκατε εμφανίζονται με '''έντονους χαρακτήρες'''.",
-       "watchmethod-recent": "Έλεγχος πρόσφατων αλλαγών σε σελίδες υπό παρακολούθηση",
-       "watchmethod-list": "Έλεγχος σελίδων υπό παρακολούθηση για πρόσφατες αλλαγές",
-       "watchlistcontains": "Η λίστα παρακολούθησής σας περιέχει $1 {{PLURAL:$1|σελίδα|σελίδες}}.",
-       "iteminvalidname": "Πρόβλημα με το στοιχείο \"$1\", άκυρο όνομα...",
        "wlshowlast": "Εμφάνιση των τελευταίων $1 ωρών $2 ημερών $3",
        "watchlist-options": "Επιλογές λίστας παρακολούθησης",
        "watching": "Παρακολούθηση...",
        "enotif_lastvisited": "Δείτε το $1 για όλες τις αλλαγές που έγιναν από την τελευταία σας επίσκεψη.",
        "enotif_lastdiff": "Δείτε το $1 για να εμφανίσετε αυτή την αλλαγή.",
        "enotif_anon_editor": "ανώνυμος χρήστης $1",
-       "enotif_body": "{{GENDER:$WATCHINGUSERNAME|Αγαπητέ|Αγαπητή}} $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nΠεριγραφή επεξεργασίας: $PAGESUMMARY $PAGEMINOREDIT\n\nΕπικοινωνία με το χρήστη που έκανε την επεξεργασία:\nηλεκτρονική διεύθυνση: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nΔεν θα υπάρξουν άλλες ειδοποιήσεις σε περίπτωση περαιτέρω δραστηριότητας αν δεν επισκεφθείτε τη σελίδα. Μπορείτε επίσης να επαναφέρετε την επιλογή ειδοποίησης για όλες τις παρακολουθούμενες σελίδες στη λίστα παρακολούθησής σας.\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{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "{{GENDER:$WATCHINGUSERNAME|Αγαπητέ|Αγαπητή}} $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nΠεριγραφή επεξεργασίας: $PAGESUMMARY $PAGEMINOREDIT\n\nΕπικοινωνία με το χρήστη που έκανε την επεξεργασία:\nηλεκτρονική διεύθυνση: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nΔεν θα υπάρξουν άλλες ειδοποιήσεις σε περίπτωση περαιτέρω δραστηριότητας αν δεν επισκεφθείτε τη σελίδα. Μπορείτε επίσης να επαναφέρετε την επιλογή ειδοποίησης για όλες τις παρακολουθούμενες σελίδες στη λίστα παρακολούθησής σας.\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",
        "created": "δημιουργήθηκε",
        "changed": "έχει αλλάξει",
        "deletepage": "Διαγραφή σελίδας",
        "blockip": "Φραγή χρήστη ή διεύθυνσης IP",
        "blockip-legend": "Φραγή του χρήστη",
        "blockiptext": "Χρησιμοποιήστε την παρακάτω φόρμα για να εμποδίσετε παρεμβάσεις στο κείμενο από μια συγκεκριμένη διεύθυνση IP ή όνομα χρήστη.\nΤο μέτρο αυτό πρέπει να λαμβάνεται μόνο σε περιπτώσεις βανδαλισμού σελίδων και πάντα σύμφωνα με την [[{{MediaWiki:Policy-url}}|πολιτική]].\nΠαρακαλούμε να αιτιολογήσετε την ενέργειά σας (παραπέμποντας π.χ. σε συγκεκριμένες σελίδες που υπέστησαν βανδαλισμό).",
-       "ipadressorusername": "Διεύθυνση IP ή όνομα χρήστη",
+       "ipaddressorusername": "Διεύθυνση IP ή όνομα χρήστη",
        "ipbexpiry": "Λήξη",
        "ipbreason": "Αιτία:",
        "ipbreason-dropdown": "*Συχνοί λόγοι φραγής\n** Εισαγωγή λανθασμένων πληροφοριών\n** Αφαίρεση περιεχομένου από σελίδες\n** Σύνδεσμοι τύπου spam σε εξωτερικούς ιστοτόπους\n** Εισαγωγή ασυναρτησιών σε σελίδες\n** Εκφοβιστική συμπεριφορά/παρενόχληση\n** Κατάχρηση πολλαπλών λογαριασμών\n** Απαράδεκτο όνομα χρήστη",
        "monobook.js": "/* Οποιοσδήποτε κώδικας JavaScript εδώ θα φορτωθεί για χρήστες που χρησιμοποιούν το MonoBook skin */",
        "modern.js": "/* Οποιοσδήποτε κώδικας JavaScript εδώ θα φορτωθεί για χρήστες που χρησιμοποιούν το Modern skin */",
        "vector.js": "/* Οποιοσδήποτε κώδικας JavaScript εδώ θα φορτωθεί για χρήστες που χρησιμοποιούν το Vector skin */",
-       "notacceptable": "Ο server του Wiki δεν μπορεί να αποδώσει δεδομένα σε μορφή που να μπορεί να διαβάσει ο client σας.",
        "anonymous": "{{PLURAL:$1|Ανώνυμος χρήστης|Ανώνυμοι χρήστες}} του {{SITENAME}}",
        "siteuser": "{{SITENAME}} χρήστης $1",
        "anonuser": "ανώνυμος χρήστης $1 του {{SITENAME}}",
        "newimages-summary": "Αυτή η ειδική σελίδα δείχνει τα πιο πρόσφατα φορτωμένα αρχεία.",
        "newimages-legend": "Φίλτρο",
        "newimages-label": "Όνομα αρχείου (ή μέρος αυτού):",
-       "showhidebots": "($1 bots)",
        "noimages": "Δεν υπάρχουν εικόνες.",
        "ilsubmit": "Αναζήτηση",
        "bydate": "ημερομηνίας",
        "autosumm-replace": "Αντικατάσταση σελίδας με '$1'",
        "autoredircomment": "Ανακατεύθυνση στη σελίδα [[$1]]",
        "autosumm-new": "Νέα σελίδα με '$1'",
-       "livepreview-loading": "Φόρτωση…",
-       "livepreview-ready": "Φόρτωση… Έτοιμο!",
-       "livepreview-failed": "Η άμεση προεπισκόπηση απέτυχε!\nΔοκιμάστε την κανονική προεπισκόπηση.",
-       "livepreview-error": "Αποτυχία σύνδεσης: $1 \"$2\"\nΔοκιμάστε την κανονική προεπισκόπηση.",
        "lag-warn-normal": "Αλλαγές νεότερες από {{PLURAL:$1|δευτερόλεπτο|δευτερόλεπτα}} μπορεί να μην φαίνονται σε αυτή τη λίστα.",
        "lag-warn-high": "Εξαιτίας υψηλής καθυστέρησης της βάσης δεδομένων του εξυπηρετητή, αλλαγές νεότερες από $1 {{PLURAL:$1|δευτερόλεπτο|δευτερόλεπτα}} μπορεί να μην φαίνονται σε αυτή τη λίστα.",
-       "watchlistedit-numitems": "Η λίστα παρακολούθησής σας περιέχει {{PLURAL:$1|1 σελίδα|$1 σελίδες}}, χωρίς να συμπεριλαμβάνονται οι σελίδες συζήτησης.",
-       "watchlistedit-noitems": "Η λίστα παρακολούθησής σας δεν περιέχει καμιά εγγραφή.",
        "watchlistedit-normal-title": "Επεξεργασία λίστας παρακολούθησης",
        "watchlistedit-normal-legend": "Αφαίρεση σελίδων από τη λίστα παρακολούθησης",
        "watchlistedit-normal-explain": "Οι σελίδες στη λίστα παρακολούθησής σας φαίνονται παρακάτω. Για να αφαιρέσετε μια σελίδα σημειώστε το κουτάκι δίπλα από τον τίτλο και κάντε κλικ στο \"{{int:Watchlistedit-normal-submit}}\". Μπορείτε επίσης να [[Special:EditWatchlist/raw|επεξεργαστείτε την πηγαία λίστα]].",
        "compare-invalid-title": "Ο τίτλος που καθορίσατε δεν είναι έγκυρος.",
        "compare-title-not-exists": "Ο τίτλος που καθορίσατε δεν υπάρχει.",
        "compare-revision-not-exists": "Η αναθεώρηση που καθορίσατε δεν υπάρχει.",
-       "dberr-header": "Αυτό το wiki έχει πρόβλημα",
        "dberr-problems": "Λυπούμαστε! Αυτός ο ιστότοπος αντιμετωπίζει τεχνικές δυσκολίες.",
        "dberr-again": "Δοκιμάστε να περιμενένετε λίγα λεπτά και να ανανεώσετε.",
        "dberr-info": "(Δεν μπορεί να επικοινωνήσει με τον εξυπηρετητή της βάσης δεδομένων: $1)",
index d94cd30..85e1bdc 100644 (file)
 {
-    "@metadata": {
-        "authors": []
-    },
-    "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-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",
-    "tog-numberheadings": "Auto-number headings",
-    "tog-showtoolbar": "Show edit toolbar",
-    "tog-editondblclick": "Edit pages on double click",
-    "tog-editsectiononrightclick": "Enable section editing by right clicking on section titles",
-    "tog-watchcreations": "Add pages I create and files I upload to my watchlist",
-    "tog-watchdefault": "Add pages and files I edit to my watchlist",
-    "tog-watchmoves": "Add pages and files I move to my watchlist",
-    "tog-watchdeletion": "Add pages and files I delete to my watchlist",
-    "tog-minordefault": "Mark all edits minor by default",
-    "tog-previewontop": "Show preview before edit box",
-    "tog-previewonfirst": "Show preview on first edit",
-    "tog-enotifwatchlistpages": "Email me when a page or file on my watchlist is changed",
-    "tog-enotifusertalkpages": "Email me when my user talk page is changed",
-    "tog-enotifminoredits": "Email me also for minor edits of pages and files",
-    "tog-enotifrevealaddr": "Reveal my email address in notification emails",
-    "tog-shownumberswatching": "Show the number of watching users",
-    "tog-oldsig": "Existing signature:",
-    "tog-fancysig": "Treat signature as wikitext (without an automatic link)",
-    "tog-uselivepreview": "Use live preview (experimental)",
-    "tog-forceeditsummary": "Prompt me when entering a blank edit summary",
-    "tog-watchlisthideown": "Hide my edits from the watchlist",
-    "tog-watchlisthidebots": "Hide bot edits from the watchlist",
-    "tog-watchlisthideminor": "Hide minor edits from the watchlist",
-    "tog-watchlisthideliu": "Hide edits by logged in users from the watchlist",
-    "tog-watchlisthideanons": "Hide edits by anonymous users from the watchlist",
-    "tog-watchlisthidepatrolled": "Hide patrolled edits from the watchlist",
-    "tog-ccmeonemails": "Send me copies of emails I send to other users",
-    "tog-diffonly": "Do not show page content below diffs",
-    "tog-showhiddencats": "Show hidden categories",
-    "tog-norollbackdiff": "Omit diff after performing a rollback",
-    "tog-useeditwarning": "Warn me when I leave an edit page with unsaved changes",
-    "tog-prefershttps": "Always use a secure connection when logged in",
-    "underline-always": "Always",
-    "underline-never": "Never",
-    "underline-default": "Skin or browser default",
-    "editfont-style": "Edit area font style:",
-    "editfont-default": "Browser default",
-    "editfont-monospace": "Monospaced font",
-    "editfont-sansserif": "Sans-serif font",
-    "editfont-serif": "Serif font",
-    "sunday": "Sunday",
-    "monday": "Monday",
-    "tuesday": "Tuesday",
-    "wednesday": "Wednesday",
-    "thursday": "Thursday",
-    "friday": "Friday",
-    "saturday": "Saturday",
-    "sun": "Sun",
-    "mon": "Mon",
-    "tue": "Tue",
-    "wed": "Wed",
-    "thu": "Thu",
-    "fri": "Fri",
-    "sat": "Sat",
-    "january": "January",
-    "february": "February",
-    "march": "March",
-    "april": "April",
-    "may_long": "May",
-    "june": "June",
-    "july": "July",
-    "august": "August",
-    "september": "September",
-    "october": "October",
-    "november": "November",
-    "december": "December",
-    "january-gen": "January",
-    "february-gen": "February",
-    "march-gen": "March",
-    "april-gen": "April",
-    "may-gen": "May",
-    "june-gen": "June",
-    "july-gen": "July",
-    "august-gen": "August",
-    "september-gen": "September",
-    "october-gen": "October",
-    "november-gen": "November",
-    "december-gen": "December",
-    "jan": "Jan",
-    "feb": "Feb",
-    "mar": "Mar",
-    "apr": "Apr",
-    "may": "May",
-    "jun": "Jun",
-    "jul": "Jul",
-    "aug": "Aug",
-    "sep": "Sep",
-    "oct": "Oct",
-    "nov": "Nov",
-    "dec": "Dec",
-    "january-date": "January $1",
-    "february-date": "February $1",
-    "march-date": "March $1",
-    "april-date": "April $1",
-    "may-date": "May $1",
-    "june-date": "June $1",
-    "july-date": "July $1",
-    "august-date": "August $1",
-    "september-date": "September $1",
-    "october-date": "October $1",
-    "november-date": "November $1",
-    "december-date": "December $1",
-    "pagecategories": "{{PLURAL:$1|Category|Categories}}",
-    "pagecategorieslink": "Special:Categories",
-    "category_header": "Pages in category \"$1\"",
-    "subcategories": "Subcategories",
-    "category-media-header": "Media in category \"$1\"",
-    "category-empty": "<em>This category currently contains no pages or media.</em>",
-    "hidden-categories": "{{PLURAL:$1|Hidden category|Hidden categories}}",
-    "hidden-category-category": "Hidden categories",
-    "category-subcat-count": "{{PLURAL:$2|This category has only the following subcategory.|This category has the following {{PLURAL:$1|subcategory|$1 subcategories}}, out of $2 total.}}",
-    "category-subcat-count-limited": "This category has the following {{PLURAL:$1|subcategory|$1 subcategories}}.",
-    "category-article-count": "{{PLURAL:$2|This category contains only the following page.|The following {{PLURAL:$1|page is|$1 pages are}} in this category, out of $2 total.}}",
-    "category-article-count-limited": "The following {{PLURAL:$1|page is|$1 pages are}} in the current category.",
-    "category-file-count": "{{PLURAL:$2|This category contains only the following file.|The following {{PLURAL:$1|file is|$1 files are}} in this category, out of $2 total.}}",
-    "category-file-count-limited": "The following {{PLURAL:$1|file is|$1 files are}} in the current category.",
-    "listingcontinuesabbrev": "cont.",
-    "index-category": "Indexed pages",
-    "noindex-category": "Noindexed pages",
-    "broken-file-category": "Pages with broken file links",
-    "categoryviewer-pagedlinks": "($1) ($2)",
-    "about": "About",
-    "article": "Content page",
-    "newwindow": "(opens in new window)",
-    "cancel": "Cancel",
-    "moredotdotdot": "More...",
-    "morenotlisted": "This list is not complete.",
-    "mypage": "Page",
-    "mytalk": "Talk",
-    "anontalk": "Talk for this IP address",
-    "navigation": "Navigation",
-    "and": "&#32;and",
-    "qbfind": "Find",
-    "qbbrowse": "Browse",
-    "qbedit": "Edit",
-    "qbpageoptions": "This page",
-    "qbmyoptions": "My pages",
-    "faq": "FAQ",
-    "faqpage": "Project:FAQ",
-    "sitetitle": "{{SITENAME}}",
-    "sitesubtitle": "",
-    "vector-action-addsection": "Add topic",
-    "vector-action-delete": "Delete",
-    "vector-action-move": "Move",
-    "vector-action-protect": "Protect",
-    "vector-action-undelete": "Undelete",
-    "vector-action-unprotect": "Change protection",
-    "vector-view-create": "Create",
-    "vector-view-edit": "Edit",
-    "vector-view-history": "View history",
-    "vector-view-view": "Read",
-    "vector-view-viewsource": "View source",
-    "actions": "Actions",
-    "namespaces": "Namespaces",
-    "variants": "Variants",
-    "navigation-heading": "Navigation menu",
-    "errorpagetitle": "Error",
-    "returnto": "Return to $1.",
-    "tagline": "From {{SITENAME}}",
-    "help": "Help",
-    "search": "Search",
-    "searchbutton": "Search",
-    "go": "Go",
-    "searcharticle": "Go",
-    "history": "Page history",
-    "history_short": "History",
-    "updatedmarker": "updated since my last visit",
-    "printableversion": "Printable version",
-    "permalink": "Permanent link",
-    "print": "Print",
-    "view": "View",
-    "view-foreign": "View on $1",
-    "edit": "Edit",
-    "edit-local": "Edit local description",
-    "create": "Create",
-    "create-local": "Add local description",
-    "editthispage": "Edit this page",
-    "create-this-page": "Create this page",
-    "delete": "Delete",
-    "deletethispage": "Delete this page",
-    "undeletethispage": "Undelete this page",
-    "undelete_short": "Undelete {{PLURAL:$1|one edit|$1 edits}}",
-    "viewdeleted_short": "View {{PLURAL:$1|one deleted edit|$1 deleted edits}}",
-    "protect": "Protect",
-    "protect_change": "change",
-    "protectthispage": "Protect this page",
-    "unprotect": "Change protection",
-    "unprotectthispage": "Change protection of this page",
-    "newpage": "New page",
-    "talkpage": "Discuss this page",
-    "talkpagelinktext": "Talk",
-    "specialpage": "Special page",
-    "personaltools": "Personal tools",
-    "postcomment": "New section",
-    "addsection": "+",
-    "articlepage": "View content page",
-    "talk": "Discussion",
-    "views": "Views",
-    "toolbox": "Tools",
-    "userpage": "View user page",
-    "projectpage": "View project page",
-    "imagepage": "View file page",
-    "mediawikipage": "View message page",
-    "templatepage": "View template page",
-    "viewhelppage": "View help page",
-    "categorypage": "View category page",
-    "viewtalkpage": "View discussion",
-    "otherlanguages": "In other languages",
-    "redirectedfrom": "(Redirected from $1)",
-    "redirectpagesub": "Redirect page",
-    "talkpageheader": "-",
-    "lastmodifiedat": "This page was last modified on $1, at $2.",
-    "viewcount": "This page has been accessed {{PLURAL:$1|once|$1 times}}.",
-    "protectedpage": "Protected page",
-    "jumpto": "Jump to:",
-    "jumptonavigation": "navigation",
-    "jumptosearch": "search",
-    "view-pool-error": "Sorry, the servers are overloaded at the moment.\nToo many users are trying to view this page.\nPlease wait a while before you try to access this page again.\n\n$1",
-    "pool-timeout": "Timeout waiting for the lock",
-    "pool-queuefull": "Pool queue is full",
-    "pool-errorunknown": "Unknown error",
-    "pool-servererror": "The pool counter service is not available ($1).",
-    "aboutsite": "About {{SITENAME}}",
-    "aboutpage": "Project:About",
-    "copyright": "Content is available under $1 unless otherwise noted.",
-    "copyrightpage": "{{ns:project}}:Copyrights",
-    "currentevents": "Current events",
-    "currentevents-url": "Project:Current events",
-    "disclaimers": "Disclaimers",
-    "disclaimerpage": "Project:General disclaimer",
-    "edithelp": "Editing help",
-    "edithelppage": "https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Editing_pages",
-    "helppage": "https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents",
-    "mainpage": "Main Page",
-    "mainpage-description": "Main page",
-    "policy-url": "Project:Policy",
-    "portal": "Community portal",
-    "portal-url": "Project:Community portal",
-    "privacy": "Privacy policy",
-    "privacypage": "Project:Privacy policy",
-    "badaccess": "Permission error",
-    "badaccess-group0": "You are not allowed to execute the action you have requested.",
-    "badaccess-groups": "The action you have requested is limited to users in {{PLURAL:$2|the group|one of the groups}}: $1.",
-    "versionrequired": "Version $1 of MediaWiki required",
-    "versionrequiredtext": "Version $1 of MediaWiki is required to use this page.\nSee [[Special:Version|version page]].",
-    "ok": "OK",
-    "pagetitle": "$1 - {{SITENAME}}",
-    "pagetitle-view-mainpage": "{{SITENAME}}",
-    "backlinksubtitle": "← $1",
-    "retrievedfrom": "Retrieved from \"$1\"",
-    "youhavenewmessages": "{{PLURAL:$3|You have}} $1 ($2).",
-    "youhavenewmessagesfromusers": "{{PLURAL:$4|You have}} $1 from {{PLURAL:$3|another user|$3 users}} ($2).",
-    "youhavenewmessagesmanyusers": "You have $1 from many users ($2).",
-    "newmessageslinkplural": "{{PLURAL:$1|a new message|999=new messages}}",
-    "newmessagesdifflinkplural": "last {{PLURAL:$1|change|999=changes}}",
-    "youhavenewmessagesmulti": "You have new messages on $1",
-    "newtalkseparator": ",&#32;",
-    "editsection": "edit",
-    "editold": "edit",
-    "viewsourceold": "view source",
-    "editlink": "edit",
-    "viewsourcelink": "view source",
-    "editsectionhint": "Edit section: $1",
-    "toc": "Contents",
-    "showtoc": "show",
-    "hidetoc": "hide",
-    "collapsible-collapse": "Collapse",
-    "collapsible-expand": "Expand",
-    "thisisdeleted": "View or restore $1?",
-    "viewdeleted": "View $1?",
-    "restorelink": "{{PLURAL:$1|one deleted edit|$1 deleted edits}}",
-    "feedlinks": "Feed:",
-    "feed-invalid": "Invalid subscription feed type.",
-    "feed-unavailable": "Syndication feeds are not available",
-    "site-rss-feed": "$1 RSS feed",
-    "site-atom-feed": "$1 Atom feed",
-    "page-rss-feed": "\"$1\" RSS feed",
-    "page-atom-feed": "\"$1\" Atom feed",
-    "feed-atom": "Atom",
-    "feed-rss": "RSS",
-    "sitenotice": "-",
-    "anonnotice": "-",
-    "newsectionheaderdefaultlevel": "== $1 ==",
-    "red-link-title": "$1 (page does not exist)",
-    "sort-descending": "Sort descending",
-    "sort-ascending": "Sort ascending",
-    "nstab-main": "Page",
-    "nstab-user": "User page",
-    "nstab-media": "Media page",
-    "nstab-special": "Special page",
-    "nstab-project": "Project page",
-    "nstab-image": "File",
-    "nstab-mediawiki": "Message",
-    "nstab-template": "Template",
-    "nstab-help": "Help page",
-    "nstab-category": "Category",
-    "mainpage-nstab": "",
-    "nosuchaction": "No such action",
-    "nosuchactiontext": "The action specified by the URL is invalid.\nYou might have mistyped the URL, or followed an incorrect link.\nThis might also indicate a bug in the software used by {{SITENAME}}.",
-    "nosuchspecialpage": "No such special page",
-    "nospecialpagetext": "<strong>You have requested an invalid special page.</strong>\n\nA list of valid special pages can be found at [[Special:SpecialPages|{{int:specialpages}}]].",
-    "error": "Error",
-    "databaseerror": "Database error",
-    "databaseerror-text": "A database query error has occurred.\nThis may indicate a bug in the software.",
-    "databaseerror-textcl": "A database query error has occurred.",
-    "databaseerror-query": "Query: $1",
-    "databaseerror-function": "Function: $1",
-    "databaseerror-error": "Error: $1",
-    "laggedslavemode": "<strong>Warning:</strong> Page may not contain recent updates.",
-    "readonly": "Database locked",
-    "enterlockreason": "Enter a reason for the lock, including an estimate of when the lock will be released",
-    "readonlytext": "The database is currently locked to new entries and other modifications, probably for routine database maintenance, after which it will be back to normal.\n\nThe administrator who locked it offered this explanation: $1",
-    "missing-article": "The database did not find the text of a page that it should have found, named \"$1\" $2.\n\nThis is usually caused by following an outdated diff or history link to a page that has been deleted.\n\nIf this is not the case, you may have found a bug in the software.\nPlease report this to an [[Special:ListUsers/sysop|administrator]], making note of the URL.",
-    "missingarticle-rev": "(revision#: $1)",
-    "missingarticle-diff": "(Diff: $1, $2)",
-    "readonly_lag": "The database has been automatically locked while the slave database servers catch up to the master",
-    "internalerror": "Internal error",
-    "internalerror_info": "Internal error: $1",
-    "fileappenderrorread": "Could not read \"$1\" during append.",
-    "fileappenderror": "Could not append \"$1\" to \"$2\".",
-    "filecopyerror": "Could not copy file \"$1\" to \"$2\".",
-    "filerenameerror": "Could not rename file \"$1\" to \"$2\".",
-    "filedeleteerror": "Could not delete file \"$1\".",
-    "directorycreateerror": "Could not create directory \"$1\".",
-    "filenotfound": "Could not find file \"$1\".",
-    "fileexistserror": "Unable to write to file \"$1\": File exists.",
-    "unexpected": "Unexpected value: \"$1\"=\"$2\".",
-    "formerror": "Error: Could not submit form.",
-    "badarticleerror": "This action cannot be performed on this page.",
-    "cannotdelete": "The page or file \"$1\" could not be deleted.\nIt may have already been deleted by someone else.",
-    "cannotdelete-title": "Cannot delete page \"$1\"",
-    "delete-hook-aborted": "Deletion aborted by hook.\nIt gave no explanation.",
-    "no-null-revision": "Could not create new null revision for page \"$1\"",
-    "badtitle": "Bad title",
-    "badtitletext": "The requested page title was invalid, empty, or an incorrectly linked inter-language or inter-wiki title.\nIt may contain one or more characters that cannot be used in titles.",
-    "perfcached": "The following data is cached and may not be up to date. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.",
-    "perfcachedts": "The following data is cached, and was last updated $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
-    "querypage-no-updates": "Updates for this page are currently disabled.\nData here will not presently be refreshed.",
-    "viewsource": "View source",
-    "viewsource-title": "View source for $1",
-    "actionthrottled": "Action throttled",
-    "actionthrottledtext": "As an anti-spam measure, you are limited from performing this action too many times in a short space of time, and you have exceeded this limit.\nPlease try again in a few minutes.",
-    "protectedpagetext": "This page has been protected to prevent editing or other actions.",
-    "viewsourcetext": "You can view and copy the source of this page:",
-    "viewyourtext": "You can view and copy the source of <strong>your edits</strong> to this page:",
-    "protectedinterface": "This page provides interface text for the software on this wiki, and is protected to prevent abuse.\nTo add or change translations for all wikis, please use [//translatewiki.net/ translatewiki.net], the MediaWiki localisation project.",
-    "editinginterface": "<strong>Warning:</strong> You are editing a page that is used to provide interface text for the software.\nChanges to this page will affect the appearance of the user interface for other users on this wiki.\nTo add or change translations for all wikis, please use [//translatewiki.net/ translatewiki.net], the MediaWiki localisation project.",
-    "cascadeprotected": "This page has been protected from editing because it is included in the following {{PLURAL:$1|page, which is|pages, which are}} protected with the \"cascading\" option turned on:\n$2",
-    "namespaceprotected": "You do not have permission to edit pages in the <strong>$1</strong> namespace.",
-    "customcssprotected": "You do not have permission to edit this CSS page because it contains another user's personal settings.",
-    "customjsprotected": "You do not have permission to edit this JavaScript page because it contains another user's personal settings.",
-    "mycustomcssprotected": "You do not have permission to edit this CSS page.",
-    "mycustomjsprotected": "You do not have permission to edit this JavaScript page.",
-    "myprivateinfoprotected": "You do not have permission to edit your private information.",
-    "mypreferencesprotected": "You do not have permission to edit your preferences.",
-    "ns-specialprotected": "Special pages cannot be edited.",
-    "titleprotected": "This title has been protected from creation by [[User:$1|$1]].\nThe reason given is \"<em>$2</em>\".",
-    "filereadonlyerror": "Unable to modify the file \"$1\" because the file repository \"$2\" is in read-only mode.\n\nThe administrator who locked it offered this explanation: \"$3\".",
-    "invalidtitle-knownnamespace": "Invalid title with namespace \"$2\" and text \"$3\"",
-    "invalidtitle-unknownnamespace": "Invalid title with unknown namespace number $1 and text \"$2\"",
-    "exception-nologin": "Not logged in",
-    "exception-nologin-text": "Please [[Special:Userlogin|log in]] to be able to access this page or action.",
-    "exception-nologin-text-manual": "Please $1 to be able to access this page or action.",
-    "virus-badscanner": "Bad configuration: Unknown virus scanner: <em>$1</em>",
-    "virus-scanfailed": "scan failed (code $1)",
-    "virus-unknownscanner": "unknown antivirus:",
-    "logouttext": "<strong>You are now logged out.</strong>\n\nNote that some pages may continue to be displayed as if you were still logged in, until you clear your browser cache.",
-    "welcomeuser": "Welcome, $1!",
-    "welcomecreation-msg": "Your account has been created.\nYou can change your {{SITENAME}} [[Special:Preferences|preferences]] if you wish.",
-    "yourname": "Username:",
-    "userlogin-yourname": "Username",
-    "userlogin-yourname-ph": "Enter your username",
-    "createacct-another-username-ph": "Enter the username",
-    "createacct-helpusername": "",
-    "yourpassword": "Password:",
-    "userlogin-yourpassword": "Password",
-    "userlogin-yourpassword-ph": "Enter your password",
-    "createacct-yourpassword-ph": "Enter a password",
-    "yourpasswordagain": "Retype password:",
-    "createacct-yourpasswordagain": "Confirm password",
-    "createacct-yourpasswordagain-ph": "Enter password again",
-    "remembermypassword": "Remember my login on this browser (for a maximum of $1 {{PLURAL:$1|day|days}})",
-    "userlogin-remembermypassword": "Keep me logged in",
-    "userlogin-signwithsecure": "Use secure connection",
-    "yourdomainname": "Your domain:",
-    "password-change-forbidden": "You cannot change passwords on this wiki.",
-    "externaldberror": "There was either an authentication database error or you are not allowed to update your external account.",
-    "login": "Log in",
-    "nav-login-createaccount": "Log in / create account",
-    "loginprompt": "You must have cookies enabled to log in to {{SITENAME}}.",
-    "userlogin": "Log in / create account",
-    "userloginnocreate": "Log in",
-    "logout": "Log out",
-    "userlogout": "Log out",
-    "userlogout-summary": "",
-    "notloggedin": "Not logged in",
-    "userlogin-noaccount": "Don't have an account?",
-    "userlogin-joinproject": "Join {{SITENAME}}",
-    "nologin": "Don't have an account? $1.",
-    "nologinlink": "Create an account",
-    "createaccount": "Create account",
-    "gotaccount": "Already have an account? $1.",
-    "gotaccountlink": "Log in",
-    "userlogin-resetlink": "Forgotten your login details?",
-    "userlogin-resetpassword-link": "Forgot your password?",
-    "helplogin-url": "https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Logging_in",
-    "userlogin-helplink2": "Help with logging in",
-    "userlogin-loggedin": "You are already logged in as {{GENDER:$1|$1}}.\nUse the form below to log in as another user.",
-    "userlogin-createanother": "Create another account",
-    "createacct-join": "Enter your information below.",
-    "createacct-another-join": "Enter the new account's information below.",
-    "createacct-emailrequired": "Email address",
-    "createacct-emailoptional": "Email address (optional)",
-    "createacct-email-ph": "Enter your email address",
-    "createacct-another-email-ph": "Enter email address",
-    "createaccountmail": "Use a temporary random password and send it to the specified email address",
-    "createacct-realname": "Real name (optional)",
-    "createaccountreason": "Reason:",
-    "createacct-reason": "Reason",
-    "createacct-reason-ph": "Why you are creating another account",
-    "createacct-captcha": "Security check",
-    "createacct-imgcaptcha-help": "",
-    "createacct-imgcaptcha-ph": "Enter the text you see above",
-    "createacct-submit": "Create your account",
-    "createacct-another-submit": "Create another account",
-    "createacct-benefit-heading": "{{SITENAME}} is made by people like you.",
-    "createacct-benefit-icon1": "icon-edits",
-    "createacct-benefit-head1": "{{NUMBEROFEDITS}}",
-    "createacct-benefit-body1": "{{PLURAL:$1|edit|edits}}",
-    "createacct-benefit-icon2": "icon-pages",
-    "createacct-benefit-head2": "{{NUMBEROFARTICLES}}",
-    "createacct-benefit-body2": "{{PLURAL:$1|page|pages}}",
-    "createacct-benefit-icon3": "icon-contributors",
-    "createacct-benefit-head3": "{{NUMBEROFACTIVEUSERS}}",
-    "createacct-benefit-body3": "recent {{PLURAL:$1|contributor|contributors}}",
-    "badretype": "The passwords you entered do not match.",
-    "userexists": "Username entered already in use.\nPlease choose a different name.",
-    "loginerror": "Login error",
-    "createacct-error": "Account creation error",
-    "createaccounterror": "Could not create account: $1",
-    "nocookiesnew": "The user account was created, but you are not logged in.\n{{SITENAME}} uses cookies to log in users.\nYou have cookies disabled.\nPlease enable them, then log in with your new username and password.",
-    "nocookieslogin": "{{SITENAME}} uses cookies to log in users.\nYou have cookies disabled.\nPlease enable them and try again.",
-    "nocookiesfornew": "The user account was not created, as we could not confirm its source.\nEnsure you have cookies enabled, reload this page and try again.",
-    "nocookiesforlogin": "{{int:nocookieslogin}}",
-    "noname": "You have not specified a valid username.",
-    "loginsuccesstitle": "Login successful",
-    "loginsuccess": "<strong>You are now logged in to {{SITENAME}} as \"$1\".</strong>",
-    "nosuchuser": "There is no user by the name \"$1\".\nUsernames are case sensitive.\nCheck your spelling, or [[Special:UserLogin/signup|create a new account]].",
-    "nosuchusershort": "There is no user by the name \"$1\".\nCheck your spelling.",
-    "nouserspecified": "You have to specify a username.",
-    "login-userblocked": "This user is blocked. Login not allowed.",
-    "wrongpassword": "Incorrect password entered.\nPlease try again.",
-    "wrongpasswordempty": "Password entered was blank.\nPlease try again.",
-    "passwordtooshort": "Passwords must be at least {{PLURAL:$1|1 character|$1 characters}}.",
-    "password-name-match": "Your password must be different from your username.",
-    "password-login-forbidden": "The use of this username and password has been forbidden.",
-    "mailmypassword": "Reset password",
-    "passwordremindertitle": "New temporary password for {{SITENAME}}",
-    "passwordremindertext": "Someone (probably you, from IP address $1) requested a new\npassword for {{SITENAME}} ($4). A temporary password for user\n\"$2\" has been created and was set to \"$3\". If this was your\nintent, you will need to log in and choose a new password now.\nYour temporary password will expire in {{PLURAL:$5|one day|$5 days}}.\n\nIf someone else made this request, or if you have remembered your password,\nand you no longer wish to change it, you may ignore this message and\ncontinue using your old password.",
-    "noemail": "There is no email address recorded for user \"$1\".",
-    "noemailcreate": "You need to provide a valid email address.",
-    "passwordsent": "A new password has been sent to the email address registered for \"$1\".\nPlease log in again after you receive it.",
-    "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}}",
-    "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.",
-    "emailauthenticated": "Your email address was confirmed on $2 at $3.",
-    "emailnotauthenticated": "Your email address is not yet confirmed.\nNo email will be sent for any of the following features.",
-    "noemailprefs": "Specify an email address in your preferences for these features to work.",
-    "emailconfirmlink": "Confirm your email address",
-    "invalidemailaddress": "The email address cannot be accepted as it appears to have an invalid format.\nPlease enter a well-formatted address or empty that field.",
-    "cannotchangeemail": "Account email addresses cannot be changed on this wiki.",
-    "emaildisabled": "This site cannot send emails.",
-    "emailsender": "{{SITENAME}}",
-    "accountcreated": "Account created",
-    "accountcreatedtext": "The user account for [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) has been created.",
-    "createaccount-title": "Account creation for {{SITENAME}}",
-    "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",
-    "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.",
-    "createacct-another-realname-tip": "Real name is optional.\nIf you choose to provide it, this will be used for giving the user attribution for their work.",
-    "pt-login": "Log in",
-    "pt-login-button": "Log in",
-    "pt-createaccount": "Create account",
-    "pt-userlogout": "Log out",
-    "pear-mail-error": "$1",
-    "php-mail-error": "$1",
-    "php-mail-error-unknown": "Unknown error in PHP's mail() function.",
-    "user-mail-no-addy": "Tried to send email without an email address.",
-    "user-mail-no-body": "Tried to send email with an empty or unreasonably short body.",
-    "changepassword": "Change password",
-    "changepassword-summary": "",
-    "resetpass_announce": "To finish logging in, you must set a new password.",
-    "resetpass_text": "<!-- Add text here -->",
-    "resetpass_header": "Change account password",
-    "oldpassword": "Old password:",
-    "newpassword": "New password:",
-    "retypenew": "Retype new password:",
-    "resetpass_submit": "Set password and log in",
-    "changepassword-success": "Your password has been changed successfully!",
-    "changepassword-throttled": "You have made too many recent login attempts.\nPlease wait $1 before trying again.",
-    "resetpass_forbidden": "Passwords cannot be changed",
-    "resetpass-no-info": "You must be logged in to access this page directly.",
-    "resetpass-submit-loggedin": "Change password",
-    "resetpass-submit-cancel": "Cancel",
-    "resetpass-wrong-oldpass": "Invalid temporary or current password.\nYou may have already successfully changed your password or requested a new temporary password.",
-    "resetpass-recycled": "Please reset your password to something other than your current password.",
-    "resetpass-temp-emailed": "You logged in with a temporary emailed code.\nTo finish logging in, you must set a new password here:",
-    "resetpass-temp-password": "Temporary password:",
-    "resetpass-abort-generic": "Password change has been aborted by an extension.",
-    "resetpass-expired": "Your password has expired. Please set a new password to log in.",
-    "resetpass-expired-soft": "Your password has expired and needs to be reset. Please choose a new password now, or click \"{{int:resetpass-submit-cancel}}\" to reset it later.",
-    "resetpass-validity-soft": "Your password is not valid: $1\n\nPlease choose a new password now, or click \"{{int:resetpass-submit-cancel}}\" to reset it later.",
-    "passwordreset": "Reset password",
-    "passwordreset-text-one": "Complete this form to receive a temporary password via email.",
-    "passwordreset-text-many": "{{PLURAL:$1|Fill in one of the fields to receive a temporary password via email.}}",
-    "passwordreset-legend": "Reset password",
-    "passwordreset-disabled": "Password resets have been disabled on this wiki.",
-    "passwordreset-emaildisabled": "Email features have been disabled on this wiki.",
-    "passwordreset-username": "Username:",
-    "passwordreset-domain": "Domain:",
-    "passwordreset-capture": "View the resulting email?",
-    "passwordreset-capture-help": "If you check this box, the email (with the temporary password) will be shown to you as well as being sent to the user.",
-    "passwordreset-email": "Email address:",
-    "passwordreset-emailtitle": "Account details on {{SITENAME}}",
-    "passwordreset-emailtext-ip": "Someone (probably you, from IP address $1) requested a reset of your\npassword for {{SITENAME}} ($4). The following user {{PLURAL:$3|account is|accounts are}}\nassociated with this email address:\n\n$2\n\n{{PLURAL:$3|This temporary password|These temporary passwords}} will expire in {{PLURAL:$5|one day|$5 days}}.\nYou should log in and choose a new password now. If someone else made this\nrequest, or if you have remembered your original password, and you no longer\nwish to change it, you may ignore this message and continue using your old\npassword.",
-    "passwordreset-emailtext-user": "User $1 on {{SITENAME}} requested a reset of your password for {{SITENAME}}\n($4). The following user {{PLURAL:$3|account is|accounts are}} associated with this email address:\n\n$2\n\n{{PLURAL:$3|This temporary password|These temporary passwords}} will expire in {{PLURAL:$5|one day|$5 days}}.\nYou should log in and choose a new password now. If someone else made this\nrequest, or if you have remembered your original password, and you no longer\nwish to change it, you may ignore this message and continue using your old\npassword.",
-    "passwordreset-emailelement": "Username: $1\nTemporary password: $2",
-    "passwordreset-emailsent": "A password reset email has been sent.",
-    "passwordreset-emailsent-capture": "A password reset email has been sent, which is shown below.",
-    "passwordreset-emailerror-capture": "A password reset email was generated, which is shown below, but sending it to the {{GENDER:$2|user}} failed: $1",
-    "changeemail": "Change email address",
-    "changeemail-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-newemail": "New 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": "",
-    "resettokens-text": "You can reset tokens which allow access to certain private data associated with your account here.\n\nYou should do it if you accidentally shared them with someone or if your account has been compromised.",
-    "resettokens-no-tokens": "There are no tokens to reset.",
-    "resettokens-legend": "Reset tokens",
-    "resettokens-tokens": "Tokens:",
-    "resettokens-token-label": "$1 (current value: $2)",
-    "resettokens-watchlist-token": "Token for the web feed (Atom/RSS) of [[Special:Watchlist|changes to pages on your watchlist]]",
-    "resettokens-done": "Tokens reset.",
-    "resettokens-resetbutton": "Reset selected tokens",
-    "bold_sample": "Bold text",
-    "bold_tip": "Bold text",
-    "italic_sample": "Italic text",
-    "italic_tip": "Italic text",
-    "link_sample": "Link title",
-    "link_tip": "Internal link",
-    "extlink_sample": "http://www.example.com link title",
-    "extlink_tip": "External link (remember http:// prefix)",
-    "headline_sample": "Headline text",
-    "headline_tip": "Level 2 headline",
-    "nowiki_sample": "Insert non-formatted text here",
-    "nowiki_tip": "Ignore wiki formatting",
-    "image_sample": "Example.jpg",
-    "image_tip": "Embedded file",
-    "media_sample": "Example.ogg",
-    "media_tip": "File link",
-    "sig_tip": "Your signature with timestamp",
-    "hr_tip": "Horizontal line (use sparingly)",
-    "summary": "Summary:",
-    "subject": "Subject/headline:",
-    "minoredit": "This is a minor edit",
-    "watchthis": "Watch this page",
-    "savearticle": "Save page",
-    "preview": "Preview",
-    "showpreview": "Show preview",
-    "showlivepreview": "Live preview",
-    "showdiff": "Show changes",
-    "anoneditwarning": "<strong>Warning:</strong> You are not logged in.\nYour IP address will be recorded in this page's edit history.",
-    "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.",
-    "missingcommentheader": "<strong>Reminder:</strong> You have not provided a subject/headline for this comment.\nIf you click \"{{int:savearticle}}\" again, your edit will be saved without one.",
-    "summary-preview": "Summary preview:",
-    "subject-preview": "Subject/headline preview:",
-    "blockedtitle": "User is blocked",
-    "blockedtext": "<strong>Your username or IP address has been blocked.</strong>\n\nThe block was made by $1.\nThe reason given is <em>$2</em>.\n\n* Start of block: $8\n* Expiry of block: $6\n* Intended blockee: $7\n\nYou can contact $1 or another [[{{MediaWiki:Grouppage-sysop}}|administrator]] to discuss the block.\nYou cannot use the \"email this user\" feature unless a valid email address is specified in your [[Special:Preferences|account preferences]] and you have not been blocked from using it.\nYour current IP address is $3, and the block ID is #$5.\nPlease include all above details in any queries you make.",
-    "autoblockedtext": "Your IP address has been automatically blocked because it was used by another user, who was blocked by $1.\nThe reason given is:\n\n:<em>$2</em>\n\n* Start of block: $8\n* Expiry of block: $6\n* Intended blockee: $7\n\nYou may contact $1 or one of the other [[{{MediaWiki:Grouppage-sysop}}|administrators]] to discuss the block.\n\nNote that you may not use the \"email this user\" feature unless you have a valid email address registered in your [[Special:Preferences|user preferences]] and you have not been blocked from using it.\n\nYour current IP address is $3, and the block ID is #$5.\nPlease include all above details in any queries you make.",
-    "blockednoreason": "no reason given",
-    "whitelistedittext": "Please $1 to edit pages.",
-    "confirmedittext": "You must confirm your email address before editing pages.\nPlease set and validate your email address through your [[Special:Preferences|user preferences]].",
-    "nosuchsectiontitle": "Cannot find section",
-    "nosuchsectiontext": "You tried to edit a section that does not exist.\nIt may have been moved or deleted while you were viewing the page.",
-    "loginreqtitle": "Login required",
-    "loginreqlink": "log in",
-    "loginreqpagetext": "Please $1 to view other pages.",
-    "accmailtitle": "Password sent",
-    "accmailtext": "A randomly generated password for [[User talk:$1|$1]] has been sent to $2. It can be changed on the <em>[[Special:ChangePassword|change password]]</em> page upon logging in.",
-    "newarticle": "(New)",
-    "newarticletext": "You have followed a link to a page that does not exist yet.\nTo create the page, start typing in the box below (see the [$1 help page] for more info).\nIf you are here by mistake, click your browser's <strong>back</strong> button.",
-    "newarticletextanon": "{{int:newarticletext|$1}}",
-    "talkpagetext": "<!-- MediaWiki:talkpagetext -->",
-    "anontalkpagetext": "----\n<em>This is the discussion page for an anonymous user who has not created an account yet, or who does not use it.</em>\nWe therefore have to use the numerical IP address to identify him/her.\nSuch an IP address can be shared by several users.\nIf you are an anonymous user and feel that irrelevant comments have been directed at you, please [[Special:UserLogin/signup|create an account]] or [[Special:UserLogin|log in]] to avoid future confusion with other anonymous users.",
-    "noarticletext": "There is currently no text in this page.\nYou can [[Special:Search/{{PAGENAME}}|search for this page title]] in other pages,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs],\nor [{{fullurl:{{FULLPAGENAME}}|action=edit}} edit this page]</span>.",
-    "noarticletext-nopermission": "There is currently no text in this page.\nYou can [[Special:Search/{{PAGENAME}}|search for this page title]] in other pages, or <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs]</span>, but you do not have permission to create this page.",
-    "noarticletextanon": "{{int:noarticletext}}",
-    "missing-revision": "The revision #$1 of the page named \"{{FULLPAGENAME}}\" does not exist.\n\nThis is usually caused by following an outdated history link to a page that has been deleted.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
-    "userpage-userdoesnotexist": "User account \"$1\" is not registered.\nPlease check if you want to create/edit this page.",
-    "userpage-userdoesnotexist-view": "User account \"$1\" is not registered.",
-    "blocked-notice-logextract": "This user is currently blocked.\nThe latest block log entry is provided below for reference:",
-    "clearyourcache": "<strong>Note:</strong> After saving, you may have to bypass your browser's cache to see the changes.\n* <strong>Firefox / Safari:</strong> Hold <em>Shift</em> while clicking <em>Reload</em>, or press either <em>Ctrl-F5</em> or <em>Ctrl-R</em> (<em>⌘-R</em> on a Mac)\n* <strong>Google Chrome:</strong> Press <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> on a Mac)\n* <strong>Internet Explorer:</strong> Hold <em>Ctrl</em> while clicking <em>Refresh</em>, or press <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Clear the cache in <em>Tools → Preferences</em>",
-    "usercssyoucanpreview": "<strong>Tip:</strong> Use the \"{{int:showpreview}}\" button to test your new CSS before saving.",
-    "userjsyoucanpreview": "<strong>Tip:</strong> Use the \"{{int:showpreview}}\" button to test your new JavaScript before saving.",
-    "usercsspreview": "<strong>Remember that you are only previewing your user CSS.\nIt has not yet been saved!</strong>",
-    "userjspreview": "<strong>Remember that you are only testing/previewing your user JavaScript.\nIt has not yet been saved!</strong>",
-    "sitecsspreview": "<strong>Remember that you are only previewing this CSS.\nIt has not yet been saved!</strong>",
-    "sitejspreview": "<strong>Remember that you are only previewing this JavaScript code.\nIt has not yet been saved!</strong>",
-    "userinvalidcssjstitle": "<strong>Warning:</strong> There is no skin \"$1\".\nCustom .css and .js pages use a lowercase title, e.g. {{ns:user}}:Foo/vector.css as opposed to {{ns:user}}:Foo/Vector.css.",
-    "updated": "(Updated)",
-    "note": "<strong>Note:</strong>",
-    "previewnote": "<strong>Remember that this is only a preview.</strong>\nYour changes have not yet been saved!",
-    "continue-editing": "Go to editing area",
-    "previewconflict": "This preview reflects the text in the upper text editing area as it will appear if you choose to save.",
-    "session_fail_preview": "<strong>Sorry! We could not process your edit due to a loss of session data.</strong>\nPlease try again.\nIf it still does not work, try [[Special:UserLogout|logging out]] and logging back in.",
-    "session_fail_preview_html": "<strong>Sorry! We could not process your edit due to a loss of session data.</strong>\n\n<em>Because {{SITENAME}} has raw HTML enabled, the preview is hidden as a precaution against JavaScript attacks.</em>\n\n<strong>If this is a legitimate edit attempt, please try again.</strong>\nIf it still does not work, try [[Special:UserLogout|logging out]] and logging back in.",
-    "token_suffix_mismatch": "<strong>Your edit has been rejected because your client mangled the punctuation characters in the edit token.</strong>\nThe edit has been rejected to prevent corruption of the page text.\nThis sometimes happens when you are using a buggy web-based anonymous proxy service.",
-    "edit_form_incomplete": "<strong>Some parts of the edit form did not reach the server; double-check that your edits are intact and try again.</strong>",
-    "editing": "Editing $1",
-    "creating": "Creating $1",
-    "editingsection": "Editing $1 (section)",
-    "editingcomment": "Editing $1 (new section)",
-    "editconflict": "Edit conflict: $1",
-    "explainconflict": "Someone else has changed this page since you started editing it.\nThe upper text area contains the page text as it currently exists.\nYour changes are shown in the lower text area.\nYou will have to merge your changes into the existing text.\n<strong>Only</strong> the text in the upper text area will be saved when you press \"{{int:savearticle}}\".",
-    "yourtext": "Your text",
-    "storedversion": "Stored revision",
-    "nonunicodebrowser": "<strong>Warning: Your browser is not Unicode compliant.</strong>\nA workaround is in place to allow you to safely edit pages: Non-ASCII characters will appear in the edit box as hexadecimal codes.",
-    "editingold": "<strong>Warning: You are editing an out-of-date revision of this page.</strong>\nIf you save it, any changes made since this revision will be lost.",
-    "yourdiff": "Differences",
-    "copyrightwarning": "Please note that all contributions to {{SITENAME}} are considered to be released under the $2 (see $1 for details).\nIf you do not want your writing to be edited mercilessly and redistributed at will, then do not submit it here.<br />\nYou are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource.\n<strong>Do not submit copyrighted work without permission!</strong>",
-    "copyrightwarning2": "Please note that all contributions to {{SITENAME}} may be edited, altered, or removed by other contributors.\nIf you do not want your writing to be edited mercilessly, then do not submit it here.<br />\nYou are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see $1 for details).\n<strong>Do not submit copyrighted work without permission!</strong>",
-    "editpage-head-copy-warn": "-",
-    "editpage-tos-summary": "-",
-    "longpage-hint": "-",
-    "longpageerror": "<strong>Error: The text you have submitted is {{PLURAL:$1|one kilobyte|$1 kilobytes}} long, which is longer than the maximum of {{PLURAL:$2|one kilobyte|$2 kilobytes}}.</strong>\nIt cannot be saved.",
-    "readonlywarning": "<strong>Warning: The database has been locked for maintenance, so you will not be able to save your edits right now.</strong>\nYou may wish to copy and paste your text into a text file and save it for later.\n\nThe administrator who locked it offered this explanation: $1",
-    "protectedpagewarning": "<strong>Warning: This page has been protected so that only users with administrator privileges can edit it.</strong>\nThe latest log entry is provided below for reference:",
-    "semiprotectedpagewarning": "<strong>Note:</strong> This page has been protected so that only registered users can edit it.\nThe latest log entry is provided below for reference:",
-    "cascadeprotectedwarning": "<strong>Warning:</strong> This page has been protected so that only users with administrator privileges can edit it because it is included in the following cascade-protected {{PLURAL:$1|page|pages}}:",
-    "titleprotectedwarning": "<strong>Warning: This page has been protected so that [[Special:ListGroupRights|specific rights]] are needed to create it.</strong>\nThe latest log entry is provided below for reference:",
-    "templatesused": "{{PLURAL:$1|Template|Templates}} used on this page:",
-    "templatesusedpreview": "{{PLURAL:$1|Template|Templates}} used in this preview:",
-    "templatesusedsection": "{{PLURAL:$1|Template|Templates}} used in this section:",
-    "template-protected": "(protected)",
-    "template-semiprotected": "(semi-protected)",
-    "hiddencategories": "This page is a member of {{PLURAL:$1|1 hidden category|$1 hidden categories}}:",
-    "edittools": "<!-- Text here will be shown below edit and upload forms. -->",
-    "edittools-upload": "-",
-    "nocreatetext": "{{SITENAME}} has restricted the ability to create new pages.\nYou can go back and edit an existing page, or [[Special:UserLogin|log in or create an account]].",
-    "nocreate-loggedin": "You do not have permission to create new pages.",
-    "sectioneditnotsupported-title": "Section editing not supported",
-    "sectioneditnotsupported-text": "Section editing is not supported in this page.",
-    "permissionserrors": "Permission error",
-    "permissionserrorstext": "You do not have permission to do that, for the following {{PLURAL:$1|reason|reasons}}:",
-    "permissionserrorstext-withaction": "You do not have permission to $2, for the following {{PLURAL:$1|reason|reasons}}:",
-    "recreate-moveddeleted-warn": "<strong>Warning: You are recreating a page that was previously deleted.</strong>\n\nYou should consider whether it is appropriate to continue editing this page.\nThe deletion and move log for this page are provided here for convenience:",
-    "moveddeleted-notice": "This page has been deleted.\nThe deletion and move log for the page are provided below for reference.",
-    "log-fulllog": "View full log",
-    "edit-hook-aborted": "Edit aborted by hook.\nIt gave no explanation.",
-    "edit-gone-missing": "Could not update the page.\nIt appears to have been deleted.",
-    "edit-conflict": "Edit conflict.",
-    "edit-no-change": "Your edit was ignored because no change was made to the text.",
-    "postedit-confirmation": "Your edit was saved.",
-    "edit-already-exists": "Could not create a new page.\nIt already exists.",
-    "addsection-preload": "",
-    "addsection-editintro": "",
-    "defaultmessagetext": "Default message text",
-    "content-failed-to-parse": "Failed to parse $2 content for $1 model: $3",
-    "invalid-content-data": "Invalid content data",
-    "content-not-allowed-here": "\"$1\" content is not allowed on page [[$2]]",
-    "editwarning-warning": "Leaving this page may cause you to lose any changes you have made.\nIf you are logged in, you can disable this warning in the \"{{int:prefs-editing}}\" section of your preferences.",
-    "editpage-notsupportedcontentformat-title": "Content format not supported",
-    "editpage-notsupportedcontentformat-text": "The content format $1 is not supported by the content model $2.",
-    "content-model-wikitext": "wikitext",
-    "content-model-text": "plain text",
-    "content-model-javascript": "JavaScript",
-    "content-model-css": "CSS",
-    "expensive-parserfunction-warning": "<strong>Warning:</strong> This page contains too many expensive parser function calls.\n\nIt should have less than $2 {{PLURAL:$2|call|calls}}, there {{PLURAL:$1|is now $1 call|are now $1 calls}}.",
-    "expensive-parserfunction-category": "Pages with too many expensive parser function calls",
-    "post-expand-template-inclusion-warning": "<strong>Warning:</strong> Template include size is too large.\nSome templates will not be included.",
-    "post-expand-template-inclusion-category": "Pages where template include size is exceeded",
-    "post-expand-template-argument-warning": "<strong>Warning:</strong> This page contains at least one template argument that has a too large expansion size.\nThese arguments have been omitted.",
-    "post-expand-template-argument-category": "Pages containing omitted template arguments",
-    "parser-template-loop-warning": "Template loop detected: [[$1]]",
-    "parser-template-recursion-depth-warning": "Template recursion depth limit exceeded ($1)",
-    "language-converter-depth-warning": "Language converter depth limit exceeded ($1)",
-    "node-count-exceeded-category": "Pages where node-count is exceeded",
-    "node-count-exceeded-warning": "Page exceeded the node-count",
-    "expansion-depth-exceeded-category": "Pages where expansion depth is exceeded",
-    "expansion-depth-exceeded-warning": "Page exceeded the expansion depth",
-    "parser-unstrip-loop-warning": "Unstrip loop detected",
-    "parser-unstrip-recursion-limit": "Unstrip recursion limit exceeded ($1)",
-    "converter-manual-rule-error": "Error detected in manual language conversion rule",
-    "undo-success": "The edit can be undone.\nPlease check the comparison below to verify that this is what you want to do, and then save the changes below to finish undoing the edit.",
-    "undo-failure": "The edit could not be undone due to conflicting intermediate edits.",
-    "undo-norev": "The edit could not be undone because it does not exist or was deleted.",
-    "undo-nochange": "The edit appears to have already been undone.",
-    "undo-summary": "Undo revision $1 by [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]])",
-    "undo-summary-username-hidden": "Undo revision $1 by a hidden user",
-    "cantcreateaccounttitle": "Cannot create account",
-    "cantcreateaccount-text": "Account creation from this IP address (<strong>$1</strong>) has been blocked by [[User:$3|$3]].\n\nThe reason given by $3 is <em>$2</em>",
-    "cantcreateaccount-range-text": "Account creation from IP addresses in the range '''$1''', which includes your IP address ('''$4'''), has been blocked by [[User:$3|$3]].\n\nThe reason given by $3 is ''$2''",
-    "createaccount-hook-aborted": "$1",
-    "viewpagelogs": "View logs for this page",
-    "nohistory": "There is no edit history for this page.",
-    "currentrev": "Latest revision",
-    "currentrev-asof": "Latest revision as of $1",
-    "revisionasof": "Revision as of $1",
-    "revision-info": "Revision as of $1 by $2",
-    "revision-info-current": "-",
-    "revision-nav": "($1) $2{{int:pipe-separator}}$3 ($4){{int:pipe-separator}}$5 ($6)",
-    "previousrevision": "← Older revision",
-    "nextrevision": "Newer revision →",
-    "currentrevisionlink": "Latest revision",
-    "cur": "cur",
-    "next": "next",
-    "last": "prev",
-    "page_first": "first",
-    "page_last": "last",
-    "histlegend": "Diff selection: Mark the radio boxes of the revisions to compare and hit enter or the button at the bottom.<br />\nLegend: <strong>({{int:cur}})</strong> = difference with latest revision, <strong>({{int:last}})</strong> = difference with preceding revision, <strong>{{int:minoreditletter}}</strong> = minor edit.",
-    "history-fieldset-title": "Browse history",
-    "history-show-deleted": "Deleted only",
-    "history_copyright": "-",
-    "histfirst": "oldest",
-    "histlast": "newest",
-    "historysize": "({{PLURAL:$1|1 byte|$1 bytes}})",
-    "historyempty": "(empty)",
-    "history-feed-title": "Revision history",
-    "history-feed-description": "Revision history for this page on the wiki",
-    "history-feed-item-nocomment": "$1 at $2",
-    "history-feed-empty": "The requested page does not exist.\nIt may have been deleted from the wiki, or renamed.\nTry [[Special:Search|searching on the wiki]] for relevant new pages.",
-    "rev-deleted-comment": "(edit summary removed)",
-    "rev-deleted-user": "(username removed)",
-    "rev-deleted-event": "(log action removed)",
-    "rev-deleted-user-contribs": "[username or IP address removed - edit hidden from contributions]",
-    "rev-deleted-text-permission": "This page revision has been <strong>deleted</strong>.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
-    "rev-deleted-text-unhide": "This page revision has been <strong>deleted</strong>.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].\nYou can still [$1 view this revision] if you wish to proceed.",
-    "rev-suppressed-text-unhide": "This page revision has been <strong>suppressed</strong>.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].\nYou can still [$1 view this revision] if you wish to proceed.",
-    "rev-deleted-text-view": "This page revision has been <strong>deleted</strong>.\nYou can view it; details can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
-    "rev-suppressed-text-view": "This page revision has been <strong>suppressed</strong>.\nYou can view it; details can be found in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].",
-    "rev-deleted-no-diff": "You cannot view this diff because one of the revisions has been <strong>deleted</strong>.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
-    "rev-suppressed-no-diff": "You cannot view this diff because one of the revisions has been <strong>deleted</strong>.",
-    "rev-deleted-unhide-diff": "One of the revisions of this diff has been <strong>deleted</strong>.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].\nYou can still [$1 view this diff] if you wish to proceed.",
-    "rev-suppressed-unhide-diff": "One of the revisions of this diff has been <strong>suppressed</strong>.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].\nYou can still [$1 view this diff] if you wish to proceed.",
-    "rev-deleted-diff-view": "One of the revisions of this diff has been <strong>deleted</strong>.\nYou can view this diff; details can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
-    "rev-suppressed-diff-view": "One of the revisions of this diff has been <strong>suppressed</strong>.\nYou can view this diff; details can be found in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].",
-    "rev-delundel": "change visibility",
-    "rev-showdeleted": "show",
-    "revisiondelete": "Delete/undelete revisions",
-    "revdelete-nooldid-title": "Invalid target revision",
-    "revdelete-nooldid-text": "You have either not specified a target revision(s) to perform this\nfunction, the specified revision does not exist, or you are attempting to hide the current revision.",
-    "revdelete-no-file": "The file specified does not exist.",
-    "revdelete-show-file-confirm": "Are you sure you want to view a deleted revision of the file \"<nowiki>$1</nowiki>\" from $2 at $3?",
-    "revdelete-show-file-submit": "Yes",
-    "revdelete-selected-text": "{{PLURAL:$1|Selected revision|Selected revisions}} of [[:$2]]:",
-    "revdelete-selected-file": "{{PLURAL:$1|Selected file version|Selected file versions}} of [[:$2]]:",
-    "logdelete-selected": "{{PLURAL:$1|Selected log event|Selected log events}}:",
-    "revdelete-text-text": "Deleted revisions will still appear in the page history, but parts of their content will be inaccessible to the public.",
-    "revdelete-text-file": "Deleted file versions will still appear in the file history, but parts of their content will be inaccessible to the public.",
-    "logdelete-text": "Deleted log events will still appear in the logs, but parts of their content will be inaccessible to the public.",
-    "revdelete-text-others": "Other administrators on {{SITENAME}} will still be able to access the hidden content and can undelete it again through this same interface, unless additional restrictions are set.",
-    "revdelete-confirm": "Please 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]].",
-    "revdelete-suppress-text": "Suppression should <strong>only</strong> be used for the following cases:\n* potentially libelous information\n* inappropriate personal information\n*: <em>home addresses and telephone numbers, national identification numbers, etc.</em>",
-    "revdelete-legend": "Set visibility restrictions",
-    "revdelete-hide-text": "Revision text",
-    "revdelete-hide-image": "Hide file content",
-    "revdelete-hide-name": "Hide action and target",
-    "revdelete-hide-comment": "Edit summary",
-    "revdelete-hide-user": "Editor's username/IP address",
-    "revdelete-hide-restricted": "Suppress data from administrators as well as others",
-    "revdelete-radio-same": "(do not change)",
-    "revdelete-radio-set": "Hidden",
-    "revdelete-radio-unset": "Visible",
-    "revdelete-suppress": "Suppress data from administrators as well as others",
-    "revdelete-unsuppress": "Remove restrictions on restored revisions",
-    "revdelete-log": "Reason:",
-    "revdelete-submit": "Apply to selected {{PLURAL:$1|revision|revisions}}",
-    "revdelete-success": "<strong>Revision visibility successfully updated.</strong>",
-    "revdelete-failure": "<strong>Revision visibility could not be updated:</strong>\n$1",
-    "logdelete-success": "<strong>Log visibility successfully set.</strong>",
-    "logdelete-failure": "<strong>Log visibility could not be set:</strong>\n$1",
-    "revdel-restore": "change visibility",
-    "pagehist": "Page history",
-    "deletedhist": "Deleted history",
-    "revdelete-hide-current": "Error hiding the item dated $2, $1: This is the current revision.\nIt cannot be hidden.",
-    "revdelete-show-no-access": "Error showing the item dated $2, $1: This item has been marked \"restricted\".\nYou do not have access to it.",
-    "revdelete-modify-no-access": "Error modifying the item dated $2, $1: This item has been marked \"restricted\".\nYou do not have access to it.",
-    "revdelete-modify-missing": "Error modifying item ID $1: It is missing from the database!",
-    "revdelete-no-change": "<strong>Warning:</strong> The item dated $2, $1 already had the requested visibility settings.",
-    "revdelete-concurrent-change": "Error modifying the item dated $2, $1: Its status appears to have been changed by someone else while you attempted to modify it.\nPlease check the logs.",
-    "revdelete-only-restricted": "Error hiding the item dated $2, $1: You cannot suppress items from view by administrators without also selecting one of the other visibility options.",
-    "revdelete-reason-dropdown": "*Common delete reasons\n** Copyright violation\n** Inappropriate comment or personal information\n** Inappropriate username\n** Potentially libelous information",
-    "revdelete-otherreason": "Other/additional reason:",
-    "revdelete-reasonotherlist": "Other reason",
-    "revdelete-edit-reasonlist": "Edit delete reasons",
-    "revdelete-offender": "Revision author:",
-    "suppressionlog": "Suppression log",
-    "suppressionlogtext": "Below is a list of deletions and blocks involving content hidden from administrators.\nSee the [[Special:BlockList|block list]] for the list of currently operational bans and blocks.",
-    "mergehistory": "Merge page histories",
-    "mergehistory-header": "This page lets you merge revisions of the history of one source page into a newer page.\nMake sure that this change will maintain historical page continuity.",
-    "mergehistory-box": "Merge revisions of two pages:",
-    "mergehistory-from": "Source page:",
-    "mergehistory-into": "Destination page:",
-    "mergehistory-list": "Mergeable edit history",
-    "mergehistory-merge": "The following revisions of [[:$1]] can be merged into [[:$2]].\nUse the radio button column to merge in only the revisions created at and before the specified time.\nNote that using the navigation links will reset this column.",
-    "mergehistory-go": "Show mergeable edits",
-    "mergehistory-submit": "Merge revisions",
-    "mergehistory-empty": "No revisions can be merged.",
-    "mergehistory-success": "$3 {{PLURAL:$3|revision|revisions}} of [[:$1]] successfully merged into [[:$2]].",
-    "mergehistory-fail": "Unable to perform history merge, please recheck the page and time parameters.",
-    "mergehistory-no-source": "Source page $1 does not exist.",
-    "mergehistory-no-destination": "Destination page $1 does not exist.",
-    "mergehistory-invalid-source": "Source page must be a valid title.",
-    "mergehistory-invalid-destination": "Destination page must be a valid title.",
-    "mergehistory-autocomment": "Merged [[:$1]] into [[:$2]]",
-    "mergehistory-comment": "Merged [[:$1]] into [[:$2]]: $3",
-    "mergehistory-same-destination": "Source and destination pages cannot be the same",
-    "mergehistory-reason": "Reason:",
-    "mergehistory-revisionrow": "$1 ($2) $3 . . $4 $5 $6",
-    "mergelog": "Merge log",
-    "pagemerge-logentry": "merged [[$1]] into [[$2]] (revisions up to $3)",
-    "revertmerge": "Unmerge",
-    "mergelogpagetext": "Below is a list of the most recent merges of one page history into another.",
-    "history-title": "Revision history of \"$1\"",
-    "difference-title": "Difference between revisions of \"$1\"",
-    "difference-title-multipage": "Difference between pages \"$1\" and \"$2\"",
-    "difference-multipage": "(Difference between pages)",
-    "lineno": "Line $1:",
-    "compareselectedversions": "Compare selected revisions",
-    "showhideselectedversions": "Change visibility of selected revisions",
-    "editundo": "undo",
-    "diff-empty": "(No difference)",
-    "diff-multi-sameuser": "({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} by the same user not shown)",
-    "diff-multi-otherusers": "({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} by {{PLURAL:$2|one other user|$2 users}} not shown)",
-    "diff-multi-manyusers": "({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} by more than $2 {{PLURAL:$2|user|users}} not shown)",
-    "difference-missing-revision": "{{PLURAL:$2|One revision|$2 revisions}} of this difference ($1) {{PLURAL:$2|was|were}} not found.\n\nThis is usually caused by following an outdated diff link to a page that has been deleted.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
-    "search-summary": "",
-    "searchresults": "Search results",
-    "searchresults-title": "Search results for \"$1\"",
-    "toomanymatches": "Too many matches were returned, please try a different query",
-    "titlematches": "Page title matches",
-    "textmatches": "Page text matches",
-    "notextmatches": "No page text matches",
-    "prevn": "previous {{PLURAL:$1|$1}}",
-    "nextn": "next {{PLURAL:$1|$1}}",
-    "prevn-title": "Previous $1 {{PLURAL:$1|result|results}}",
-    "nextn-title": "Next $1 {{PLURAL:$1|result|results}}",
-    "shown-title": "Show $1 {{PLURAL:$1|result|results}} per page",
-    "viewprevnext": "View ($1 {{int:pipe-separator}} $2) ($3)",
-    "searchmenu-exists": "<strong>There is a page named \"[[:$1]]\" on this wiki.</strong> {{PLURAL:$2|0=|See also the other search results found.}}",
-    "searchmenu-new": "<strong>Create the page \"[[:$1]]\" on this wiki!</strong> {{PLURAL:$2|0=|See also the page found with your search.|See also the search results found.}}",
-    "searchmenu-new-nocreate": "",
-    "searchprofile-articles": "Content pages",
-    "searchprofile-project": "Help and Project pages",
-    "searchprofile-images": "Multimedia",
-    "searchprofile-everything": "Everything",
-    "searchprofile-advanced": "Advanced",
-    "searchprofile-articles-tooltip": "Search in $1",
-    "searchprofile-project-tooltip": "Search in $1",
-    "searchprofile-images-tooltip": "Search for files",
-    "searchprofile-everything-tooltip": "Search all of content (including talk pages)",
-    "searchprofile-advanced-tooltip": "Search in custom namespaces",
-    "search-result-size": "$1 ({{PLURAL:$2|1 word|$2 words}})",
-    "search-result-category-size": "{{PLURAL:$1|1 member|$1 members}} ({{PLURAL:$2|1 subcategory|$2 subcategories}}, {{PLURAL:$3|1 file|$3 files}})",
-    "search-result-score": "Relevance: $1%",
-    "search-redirect": "(redirect $1)",
-    "search-section": "(section $1)",
-    "search-file-match": "(matches file content)",
-    "search-suggest": "Did you mean: $1",
-    "search-interwiki-caption": "Sister projects",
-    "search-interwiki-default": "Results from $1:",
-    "search-interwiki-custom": "",
-    "search-interwiki-more": "(more)",
-    "search-relatedarticle": "Related",
-    "searcheverything-enable": "Search in all namespaces",
-    "searchrelated": "related",
-    "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>.",
-    "showingresultsnum": "Showing below {{PLURAL:$3|<strong>1</strong> result|<strong>$3</strong> results}} starting with #<strong>$2</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-nonefound": "There were no results matching the query.",
-    "powersearch-legend": "Advanced search",
-    "powersearch-ns": "Search in namespaces:",
-    "powersearch-redir": "List redirects",
-    "powersearch-togglelabel": "Check:",
-    "powersearch-toggleall": "All",
-    "powersearch-togglenone": "None",
-    "search-external": "External search",
-    "searchdisabled": "{{SITENAME}} search is disabled.\nYou can search via Google in the meantime.\nNote that their indexes of {{SITENAME}} content may be out of date.",
-    "googlesearch": "<form method=\"get\" action=\"//www.google.com/search\" id=\"googlesearch\">\n\t<input type=\"hidden\" name=\"domains\" value=\"{{SERVER}}\" />\n\t<input type=\"hidden\" name=\"num\" value=\"50\" />\n\t<input type=\"hidden\" name=\"ie\" value=\"$2\" />\n\t<input type=\"hidden\" name=\"oe\" value=\"$2\" />\n\n\t<input type=\"text\" name=\"q\" size=\"31\" maxlength=\"255\" value=\"$1\" />\n\t<input type=\"submit\" name=\"btnG\" value=\"$3\" />\n  <div>\n\t<input type=\"radio\" name=\"sitesearch\" id=\"gwiki\" value=\"{{SERVER}}\" checked=\"checked\" /><label for=\"gwiki\">{{SITENAME}}</label>\n\t<input type=\"radio\" name=\"sitesearch\" id=\"gWWW\" value=\"\" /><label for=\"gWWW\">WWW</label>\n  </div>\n</form>",
-    "search-error": "An error has occurred while searching: $1",
-    "opensearch-desc": "{{SITENAME}} ({{CONTENTLANGUAGE}})",
-    "preferences": "Preferences",
-    "preferences-summary": "",
-    "mypreferences": "Preferences",
-    "prefs-edits": "Number of edits:",
-    "prefsnologintext2": "Please $1 to change your preferences.",
-    "prefs-skin": "Skin",
-    "skin-preview": "Preview",
-    "datedefault": "No preference",
-    "prefs-labs": "Labs features",
-    "prefs-user-pages": "User pages",
-    "prefs-personal": "User profile",
-    "prefs-rc": "Recent changes",
-    "prefs-watchlist": "Watchlist",
-    "prefs-watchlist-days": "Days to show in watchlist:",
-    "prefs-watchlist-days-max": "Maximum $1 {{PLURAL:$1|day|days}}",
-    "prefs-watchlist-edits": "Maximum number of changes to show in expanded watchlist:",
-    "prefs-watchlist-edits-max": "Maximum number: 1000",
-    "prefs-watchlist-token": "Watchlist token:",
-    "prefs-misc": "Misc",
-    "prefs-resetpass": "Change password",
-    "prefs-changeemail": "Change email address",
-    "prefs-setemail": "Set an email address",
-    "prefs-email": "Email options",
-    "prefs-rendering": "Appearance",
-    "saveprefs": "Save",
-    "restoreprefs": "Restore all default settings (in all sections)",
-    "prefs-editing": "Editing",
-    "rows": "Rows:",
-    "columns": "Columns:",
-    "searchresultshead": "Search",
-    "stub-threshold": "Threshold for <a href=\"#\" class=\"stub\">stub link</a> formatting (bytes):",
-    "stub-threshold-disabled": "Disabled",
-    "recentchangesdays": "Days to show in recent changes:",
-    "recentchangesdays-max": "Maximum $1 {{PLURAL:$1|day|days}}",
-    "recentchangescount": "Number of edits to show by default:",
-    "prefs-help-recentchangescount": "This includes recent changes, page histories, and logs.",
-    "prefs-help-watchlist-token2": "This is the secret key to the web feed of your watchlist.\nAnyone who knows it will be able to read your watchlist, so do not share it.\nIf you need to, [[Special:ResetTokens|you can reset it]].",
-    "savedprefs": "Your preferences have been saved.",
-    "timezonelegend": "Time zone:",
-    "localtime": "Local time:",
-    "timezoneuseserverdefault": "Use wiki default ($1)",
-    "timezoneuseoffset": "Other (specify offset)",
-    "servertime": "Server time:",
-    "guesstimezone": "Fill in from browser",
-    "timezoneregion-africa": "Africa",
-    "timezoneregion-america": "America",
-    "timezoneregion-antarctica": "Antarctica",
-    "timezoneregion-arctic": "Arctic",
-    "timezoneregion-asia": "Asia",
-    "timezoneregion-atlantic": "Atlantic Ocean",
-    "timezoneregion-australia": "Australia",
-    "timezoneregion-europe": "Europe",
-    "timezoneregion-indian": "Indian Ocean",
-    "timezoneregion-pacific": "Pacific Ocean",
-    "allowemail": "Enable email from other users",
-    "prefs-searchoptions": "Search",
-    "prefs-namespaces": "Namespaces",
-    "defaultns": "Otherwise search in these namespaces:",
-    "default": "default",
-    "prefs-files": "Files",
-    "prefs-custom-css": "Custom CSS",
-    "prefs-custom-js": "Custom JavaScript",
-    "prefs-common-css-js": "Shared CSS/JavaScript for all skins:",
-    "prefs-reset-intro": "You can use this page to reset your preferences to the site defaults.\nThis cannot be undone.",
-    "prefs-emailconfirm-label": "Email confirmation:",
-    "youremail": "Email:",
-    "username": "{{GENDER:$1|Username}}:",
-    "uid": "{{GENDER:$1|User}} ID:",
-    "prefs-memberingroups": "{{GENDER:$2|Member}} of {{PLURAL:$1|group|groups}}:",
-    "prefs-memberingroups-type": "$1",
-    "prefs-registration": "Registration time:",
-    "prefs-registration-date-time": "$1",
-    "yourrealname": "Real name:",
-    "yourlanguage": "Language:",
-    "yourvariant": "Content language variant:",
-    "prefs-help-variant": "Your preferred variant or orthography to display the content pages of this wiki in.",
-    "yournick": "New signature:",
-    "prefs-help-signature": "Comments on talk pages should be signed with \"<nowiki>~~~~</nowiki>\", which will be converted into your signature and a timestamp.",
-    "badsig": "Invalid raw signature.\nCheck HTML tags.",
-    "badsiglength": "Your signature is too long.\nIt must not be more than $1 {{PLURAL:$1|character|characters}} long.",
-    "yourgender": "How do you prefer to be described?",
-    "gender-unknown": "I prefer not to say",
-    "gender-male": "He edits wiki pages",
-    "gender-female": "She edits wiki pages",
-    "prefs-help-gender": "Setting this preference is optional.\nThe software uses its value to address you and to mention you to others using the appropriate grammatical gender.\nThis information will be public.",
-    "email": "Email",
-    "prefs-help-realname": "Real name is optional.\nIf you choose to provide it, this will be used for giving you attribution for your work.",
-    "prefs-help-email": "Email address is optional, but is needed for password resets, should you forget your password.",
-    "prefs-help-email-others": "You can also choose to let others contact you by email through a link on your user or talk page.\nYour email address is not revealed when other users contact you.",
-    "prefs-help-email-required": "Email address is required.",
-    "prefs-info": "Basic information",
-    "prefs-i18n": "Internationalisation",
-    "prefs-signature": "Signature",
-    "prefs-dateformat": "Date format",
-    "prefs-timeoffset": "Time offset",
-    "prefs-advancedediting": "General options",
-    "prefs-editor": "Editor",
-    "prefs-preview": "Preview",
-    "prefs-advancedrc": "Advanced options",
-    "prefs-advancedrendering": "Advanced options",
-    "prefs-advancedsearchoptions": "Advanced options",
-    "prefs-advancedwatchlist": "Advanced options",
-    "prefs-displayrc": "Display options",
-    "prefs-displaysearchoptions": "Display options",
-    "prefs-displaywatchlist": "Display options",
-    "prefs-tokenwatchlist": "Token",
-    "prefs-diffs": "Diffs",
-    "prefs-help-prefershttps": "This preference will take effect on your next login.",
-    "prefs-tabs-navigation-hint": "Tip: You can use the left and right arrow keys to navigate between the tabs in the tabs list.",
-    "email-address-validity-valid": "Email address appears valid",
-    "email-address-validity-invalid": "Enter a valid email address",
-    "userrights": "User rights management",
-    "userrights-summary": "",
-    "userrights-lookup-user": "Manage user groups",
-    "userrights-user-editname": "Enter a username:",
-    "editusergroup": "Edit user groups",
-    "editinguser": "Changing user rights of user <strong>[[User:$1|$1]]</strong> $2",
-    "userrights-editusergroup": "Edit user groups",
-    "saveusergroups": "Save user groups",
-    "userrights-groupsmember": "Member of:",
-    "userrights-groupsmember-auto": "Implicit member of:",
-    "userrights-groupsmember-type": "$1",
-    "userrights-groups-help": "You may alter the groups this user is in:\n* A checked box means the user is in that group.\n* An unchecked box means the user is not in that group.\n* A * indicates that you cannot remove the group once you have added it, or vice versa.",
-    "userrights-reason": "Reason:",
-    "userrights-no-interwiki": "You do not have permission to edit user rights on other wikis.",
-    "userrights-nodatabase": "Database $1 does not exist or is not local.",
-    "userrights-nologin": "You must [[Special:UserLogin|log in]] with an administrator account to assign user rights.",
-    "userrights-notallowed": "You do not have permission to add or remove user rights.",
-    "userrights-changeable-col": "Groups you can change",
-    "userrights-unchangeable-col": "Groups you cannot change",
-    "userrights-irreversible-marker": "$1*",
-    "userrights-conflict": "Conflict of user rights changes! Please review and confirm your changes.",
-    "userrights-removed-self": "You successfully removed your own rights. As such, you are no longer able to access this page.",
-    "group": "Group:",
-    "group-user": "Users",
-    "group-autoconfirmed": "Autoconfirmed users",
-    "group-bot": "Bots",
-    "group-sysop": "Administrators",
-    "group-bureaucrat": "Bureaucrats",
-    "group-suppress": "Oversights",
-    "group-all": "(all)",
-    "group-user-member": "{{GENDER:$1|user}}",
-    "group-autoconfirmed-member": "{{GENDER:$1|autoconfirmed user}}",
-    "group-bot-member": "{{GENDER:$1|bot}}",
-    "group-sysop-member": "{{GENDER:$1|administrator}}",
-    "group-bureaucrat-member": "{{GENDER:$1|bureaucrat}}",
-    "group-suppress-member": "{{GENDER:$1|oversight}}",
-    "grouppage-user": "{{ns:project}}:Users",
-    "grouppage-autoconfirmed": "{{ns:project}}:Autoconfirmed users",
-    "grouppage-bot": "{{ns:project}}:Bots",
-    "grouppage-sysop": "{{ns:project}}:Administrators",
-    "grouppage-bureaucrat": "{{ns:project}}:Bureaucrats",
-    "grouppage-suppress": "{{ns:project}}:Oversight",
-    "right-read": "Read pages",
-    "right-edit": "Edit pages",
-    "right-createpage": "Create pages (which are not discussion pages)",
-    "right-createtalk": "Create discussion pages",
-    "right-createaccount": "Create new user accounts",
-    "right-minoredit": "Mark edits as minor",
-    "right-move": "Move pages",
-    "right-move-subpages": "Move pages with their subpages",
-    "right-move-rootuserpages": "Move root user pages",
-    "right-movefile": "Move files",
-    "right-suppressredirect": "Not create redirects from source pages when moving pages",
-    "right-upload": "Upload files",
-    "right-reupload": "Overwrite existing files",
-    "right-reupload-own": "Overwrite existing files uploaded by oneself",
-    "right-reupload-shared": "Override files on the shared media repository locally",
-    "right-upload_by_url": "Upload files from a URL",
-    "right-purge": "Purge the site cache for a page without confirmation",
-    "right-autoconfirmed": "Not be affected by IP-based rate limits",
-    "right-bot": "Be treated as an automated process",
-    "right-nominornewtalk": "Not have minor edits to discussion pages trigger the new messages prompt",
-    "right-apihighlimits": "Use higher limits in API queries",
-    "right-writeapi": "Use of the write API",
-    "right-delete": "Delete pages",
-    "right-bigdelete": "Delete pages with large histories",
-    "right-deletelogentry": "Delete and undelete specific log entries",
-    "right-deleterevision": "Delete and undelete specific revisions of pages",
-    "right-deletedhistory": "View deleted history entries, without their associated text",
-    "right-deletedtext": "View deleted text and changes between deleted revisions",
-    "right-browsearchive": "Search deleted pages",
-    "right-undelete": "Undelete a page",
-    "right-suppressrevision": "Review and restore revisions hidden from administrators",
-    "right-suppressionlog": "View private logs",
-    "right-block": "Block other users from editing",
-    "right-blockemail": "Block a user from sending email",
-    "right-hideuser": "Block a username, hiding it from the public",
-    "right-ipblock-exempt": "Bypass IP blocks, auto-blocks and range blocks",
-    "right-proxyunbannable": "Bypass automatic blocks of proxies",
-    "right-unblockself": "Unblock oneself",
-    "right-protect": "Change protection levels and edit cascade-protected pages",
-    "right-editprotected": "Edit pages protected as \"{{int:protect-level-sysop}}\"",
-    "right-editsemiprotected": "Edit pages protected as \"{{int:protect-level-autoconfirmed}}\"",
-    "right-editinterface": "Edit the user interface",
-    "right-editusercssjs": "Edit other users' CSS and JavaScript files",
-    "right-editusercss": "Edit other users' CSS files",
-    "right-edituserjs": "Edit other users' JavaScript files",
-    "right-editmyusercss": "Edit your own user CSS files",
-    "right-editmyuserjs": "Edit your own user JavaScript files",
-    "right-viewmywatchlist": "View your own watchlist",
-    "right-editmywatchlist": "Edit your own watchlist. Note some actions will still add pages even without this right.",
-    "right-viewmyprivateinfo": "View your own private data (e.g. email address, real name)",
-    "right-editmyprivateinfo": "Edit your own private data (e.g. email address, real name)",
-    "right-editmyoptions": "Edit your own preferences",
-    "right-rollback": "Quickly rollback the edits of the last user who edited a particular page",
-    "right-markbotedits": "Mark rolled-back edits as bot edits",
-    "right-noratelimit": "Not be affected by rate limits",
-    "right-import": "Import pages from other wikis",
-    "right-importupload": "Import pages from a file upload",
-    "right-patrol": "Mark others' edits as patrolled",
-    "right-autopatrol": "Have one's own edits automatically marked as patrolled",
-    "right-patrolmarks": "View recent changes patrol marks",
-    "right-unwatchedpages": "View a list of unwatched pages",
-    "right-mergehistory": "Merge the history of pages",
-    "right-userrights": "Edit all user rights",
-    "right-userrights-interwiki": "Edit user rights of users on other wikis",
-    "right-siteadmin": "Lock and unlock the database",
-    "right-override-export-depth": "Export pages including linked pages up to a depth of 5",
-    "right-sendemail": "Send email to other users",
-    "right-passwordreset": "View password reset emails",
-    "newuserlogpage": "User creation log",
-    "newuserlogpagetext": "This is a log of user creations.",
-    "rightslog": "User rights log",
-    "rightslogtext": "This is a log of changes to user rights.",
-    "action-read": "read this page",
-    "action-edit": "edit this page",
-    "action-createpage": "create pages",
-    "action-createtalk": "create discussion pages",
-    "action-createaccount": "create this user account",
-    "action-minoredit": "mark this edit as minor",
-    "action-move": "move this page",
-    "action-move-subpages": "move this page, and its subpages",
-    "action-move-rootuserpages": "move root user pages",
-    "action-movefile": "move this file",
-    "action-upload": "upload this file",
-    "action-reupload": "overwrite this existing file",
-    "action-reupload-shared": "override this file on a shared repository",
-    "action-upload_by_url": "upload this file from a URL",
-    "action-writeapi": "use the write API",
-    "action-delete": "delete this page",
-    "action-deleterevision": "delete this revision",
-    "action-deletedhistory": "view this page's deleted history",
-    "action-browsearchive": "search deleted pages",
-    "action-undelete": "undelete this page",
-    "action-suppressrevision": "review and restore this hidden revision",
-    "action-suppressionlog": "view this private log",
-    "action-block": "block this user from editing",
-    "action-protect": "change protection levels for this page",
-    "action-rollback": "quickly rollback the edits of the last user who edited a particular page",
-    "action-import": "import pages from another wiki",
-    "action-importupload": "import pages from a file upload",
-    "action-patrol": "mark others' edits as patrolled",
-    "action-autopatrol": "have your edit marked as patrolled",
-    "action-unwatchedpages": "view the list of unwatched pages",
-    "action-mergehistory": "merge the history of this page",
-    "action-userrights": "edit all user rights",
-    "action-userrights-interwiki": "edit user rights of users on other wikis",
-    "action-siteadmin": "lock or unlock the database",
-    "action-sendemail": "send emails",
-    "action-editmywatchlist": "edit your watchlist",
-    "action-viewmywatchlist": "view your watchlist",
-    "action-viewmyprivateinfo": "view your private information",
-    "action-editmyprivateinfo": "edit your private information",
-    "nchanges": "$1 {{PLURAL:$1|change|changes}}",
-    "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|since last visit}}",
-    "enhancedrc-history": "history",
-    "recentchanges": "Recent changes",
-    "recentchanges-url": "Special:RecentChanges",
-    "recentchanges-legend": "Recent changes options",
-    "recentchanges-summary": "Track the most recent changes to the wiki on this page.",
-    "recentchangestext": "-",
-    "recentchanges-noresult": "No changes during the given period matching these criteria.",
-    "recentchanges-feed-description": "Track the most recent changes to the wiki in this feed.",
-    "recentchanges-label-newpage": "This edit created a new page",
-    "recentchanges-label-minor": "This is a minor edit",
-    "recentchanges-label-bot": "This edit was performed by a bot",
-    "recentchanges-label-unpatrolled": "This edit has not yet been patrolled",
-    "recentchanges-label-plusminus": "The page size changed by this number of bytes",
-    "recentchanges-legend-heading": "'''Legend:'''",
-    "recentchanges-legend-newpage": "(also see [[Special:NewPages|list of new pages]])",
-    "recentchanges-legend-plusminus": "(<em>±123</em>)",
-    "rcnotefrom": "Below are the changes since <strong>$2</strong> (up to <strong>$1</strong> shown).",
-    "rclistfrom": "Show new changes starting from $2, $3",
-    "rcshowhideminor": "$1 minor edits",
-    "rcshowhideminor-show": "Show",
-    "rcshowhideminor-hide": "Hide",
-    "rcshowhidebots": "$1 bots",
-    "rcshowhidebots-show": "Show",
-    "rcshowhidebots-hide": "Hide",
-    "rcshowhideliu": "$1 registered users",
-    "rcshowhideliu-show": "Show",
-    "rcshowhideliu-hide": "Hide",
-    "rcshowhideanons": "$1 anonymous users",
-    "rcshowhideanons-show": "Show",
-    "rcshowhideanons-hide": "Hide",
-    "rcshowhidepatr": "$1 patrolled edits",
-    "rcshowhidepatr-show": "Show",
-    "rcshowhidepatr-hide": "Hide",
-    "rcshowhidemine": "$1 my edits",
-    "rcshowhidemine-show": "Show",
-    "rcshowhidemine-hide": "Hide",
-    "rclinks": "Show last $1 changes in last $2 days<br />$3",
-    "diff": "diff",
-    "hist": "hist",
-    "hide": "Hide",
-    "show": "Show",
-    "minoreditletter": "m",
-    "newpageletter": "N",
-    "boteditletter": "b",
-    "unpatrolledletter": "!",
-    "number_of_watching_users_RCview": "[$1]",
-    "number_of_watching_users_pageview": "[$1 watching {{PLURAL:$1|user|users}}]",
-    "rc_categories": "Limit to categories (separate with \"|\")",
-    "rc_categories_any": "Any",
-    "rc-change-size": "$1",
-    "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} after change",
-    "newsectionsummary": "/* $1 */ new section",
-    "rc-enhanced-expand": "Show details",
-    "rc-enhanced-hide": "Hide details",
-    "rc-old-title": "originally created as \"$1\"",
-    "recentchangeslinked": "Related changes",
-    "recentchangeslinked-feed": "Related changes",
-    "recentchangeslinked-toolbox": "Related changes",
-    "recentchangeslinked-title": "Changes related to \"$1\"",
-    "recentchangeslinked-summary": "This is a list of changes made recently to pages linked from a specified page (or to members of a specified category).\nPages on [[Special:Watchlist|your watchlist]] are <strong>bold</strong>.",
-    "recentchangeslinked-page": "Page name:",
-    "recentchangeslinked-to": "Show changes to pages linked to the given page instead",
-    "upload": "Upload file",
-    "uploadbtn": "Upload file",
-    "reuploaddesc": "Cancel upload and return to the upload form",
-    "upload-tryagain": "Submit modified file description",
-    "uploadnologin": "Not logged in",
-    "uploadnologintext": "Please $1 to upload files.",
-    "upload_directory_missing": "The upload directory ($1) is missing and could not be created by the webserver.",
-    "upload_directory_read_only": "The upload directory ($1) is not writable by the webserver.",
-    "uploaderror": "Upload error",
-    "upload-summary": "",
-    "upload-recreate-warning": "<strong>Warning: A file by that name has been deleted or moved.</strong>\n\nThe deletion and move log for this page are provided here for convenience:",
-    "uploadtext": "Use the form below to upload files.\nTo view or search previously uploaded files go to the [[Special:FileList|list of uploaded files]], (re)uploads are also logged in the [[Special:Log/upload|upload log]], deletions in the [[Special:Log/delete|deletion log]].\n\nTo include a file in a page, use a link in one of the following forms:\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code></strong> to use the full version of the file\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code></strong> to use a 200 pixel wide rendition in a box in the left margin with \"alt text\" as description\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code></strong> for directly linking to the file without displaying the file",
-    "upload-permitted": "Permitted file types: $1.",
-    "upload-preferred": "Preferred file types: $1.",
-    "upload-prohibited": "Prohibited file types: $1.",
-    "uploadfooter": "-",
-    "upload-default-description": "-",
-    "uploadlogpage": "Upload log",
-    "uploadlogpagetext": "Below is a list of the most recent file uploads.\nSee the [[Special:NewFiles|gallery of new files]] for a more visual overview.",
-    "filename": "Filename",
-    "filedesc": "Summary",
-    "fileuploadsummary": "Summary:",
-    "filereuploadsummary": "File changes:",
-    "filestatus": "Copyright status:",
-    "filesource": "Source:",
-    "ignorewarning": "Ignore warning and save file anyway",
-    "ignorewarnings": "Ignore any warnings",
-    "minlength1": "Filenames must be at least one letter.",
-    "illegalfilename": "The filename \"$1\" contains characters that are not allowed in page titles.\nPlease rename the file and try uploading it again.",
-    "filename-toolong": "Filenames may not be longer than 240 bytes.",
-    "badfilename": "Filename has been changed to \"$1\".",
-    "filetype-mime-mismatch": "File extension \".$1\" does not match the detected MIME type of the file ($2).",
-    "filetype-badmime": "Files of the MIME type \"$1\" are not allowed to be uploaded.",
-    "filetype-bad-ie-mime": "Cannot upload this file because Internet Explorer would detect it as \"$1\", which is a disallowed and potentially dangerous file type.",
-    "filetype-unwanted-type": "<strong>\".$1\"</strong> is an unwanted file type.\nPreferred {{PLURAL:$3|file type is|file types are}} $2.",
-    "filetype-banned-type": "<strong>\".$1\"</strong> {{PLURAL:$4|is not a permitted file type|are not permitted file types}}.\nPermitted {{PLURAL:$3|file type is|file types are}} $2.",
-    "filetype-missing": "The file has no extension (like \".jpg\").",
-    "empty-file": "The file you submitted was empty.",
-    "file-too-large": "The file you submitted was too large.",
-    "filename-tooshort": "The filename is too short.",
-    "filetype-banned": "This type of file is banned.",
-    "verification-error": "This file did not pass file verification.",
-    "hookaborted": "The modification you tried to make was aborted by an extension.",
-    "illegal-filename": "The filename is not allowed.",
-    "overwrite": "Overwriting an existing file is not allowed.",
-    "unknown-error": "An unknown error occurred.",
-    "tmp-create-error": "Could not create temporary file.",
-    "tmp-write-error": "Error writing temporary file.",
-    "large-file": "It is recommended that files are no larger than $1;\nthis file is $2.",
-    "largefileserver": "This file is bigger than the server is configured to allow.",
-    "emptyfile": "The file you uploaded seems to be empty.\nThis might be due to a typo in the filename.\nPlease check whether you really want to upload this file.",
-    "windows-nonascii-filename": "This wiki does not support filenames with special characters.",
-    "fileexists": "A file with this name exists already, please check <strong>[[:$1]]</strong> if you are not sure if you want to change it.\n[[$1|thumb]]",
-    "filepageexists": "The description page for this file has already been created at <strong>[[:$1]]</strong>, but no file with this name currently exists.\nThe summary you enter will not appear on the description page.\nTo make your summary appear there, you will need to manually edit it.\n[[$1|thumb]]",
-    "fileexists-extension": "A file with a similar name exists: [[$2|thumb]]\n* Name of the uploading file: <strong>[[:$1]]</strong>\n* Name of the existing file: <strong>[[:$2]]</strong>\nPlease choose a different name.",
-    "fileexists-thumbnail-yes": "The file seems to be an image of reduced size <em>(thumbnail)</em>.\n[[$1|thumb]]\nPlease check the file <strong>[[:$1]]</strong>.\nIf the checked file is the same image of original size it is not necessary to upload an extra thumbnail.",
-    "file-thumbnail-no": "The filename begins with <strong>$1</strong>.\nIt seems to be an image of reduced size <em>(thumbnail)</em>.\nIf you have this image in full resolution upload this one, otherwise change the filename please.",
-    "fileexists-forbidden": "A file with this name already exists, and cannot be overwritten.\nIf you still want to upload your file, please go back and use a new name.\n[[File:$1|thumb|center|$1]]",
-    "fileexists-shared-forbidden": "A file with this name exists already in the shared file repository.\nIf you still want to upload your file, please go back and use a new name.\n[[File:$1|thumb|center|$1]]",
-    "file-exists-duplicate": "This file is a duplicate of the following {{PLURAL:$1|file|files}}:",
-    "file-deleted-duplicate": "A file identical to this file ([[:$1]]) has previously been deleted.\nYou should check that file's deletion history before proceeding to re-upload it.",
-    "file-deleted-duplicate-notitle": "A file identical to this file has previously been deleted, and the title has been suppressed.\nYou should ask someone with the ability to view suppressed file data to review the situation before proceeding to re-upload it.",
-    "uploadwarning": "Upload warning",
-    "uploadwarning-text": "Please modify the file description below and try again.",
-    "savefile": "Save file",
-    "uploadedimage": "uploaded \"[[$1]]\"",
-    "overwroteimage": "uploaded a new version of \"[[$1]]\"",
-    "uploaddisabled": "Uploads disabled.",
-    "copyuploaddisabled": "Upload by URL disabled.",
-    "uploaddisabledtext": "File uploads are disabled.",
-    "php-uploaddisabledtext": "File uploads are disabled in PHP.\nPlease check the file_uploads setting.",
-    "uploadscripted": "This file contains HTML or script code that may be erroneously interpreted by a web browser.",
-    "uploadscriptednamespace": "This SVG file contains an illegal namespace \"$1\"",
-    "uploadinvalidxml": "The XML in the uploaded file could not be parsed.",
-    "uploadvirus": "The file contains a virus!\nDetails: $1",
-    "uploadjava": "The file is a ZIP file that contains a Java .class file.\nUploading Java files is not allowed because they can cause security restrictions to be bypassed.",
-    "upload-source": "Source file",
-    "sourcefilename": "Source filename:",
-    "sourceurl": "Source URL:",
-    "destfilename": "Destination filename:",
-    "upload-maxfilesize": "Maximum file size: $1",
-    "upload-description": "File description",
-    "upload-options": "Upload options",
-    "watchthisupload": "Watch this file",
-    "filewasdeleted": "A file of this name has been previously uploaded and subsequently deleted.\nYou should check the $1 before proceeding to upload it again.",
-    "filename-bad-prefix": "The name of the file you are uploading begins with <strong>\"$1\"</strong>, which is a non-descriptive name typically assigned automatically by digital cameras.\nPlease choose a more descriptive name for your file.",
-    "filename-prefix-blacklist": " #<!-- leave this line exactly as it is --> <pre>\n# Syntax is as follows:\n#   * Everything from a \"#\" character to the end of the line is a comment\n#   * Every non-blank line is a prefix for typical filenames assigned automatically by digital cameras\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # some mobile phones\nIMG # generic\nJD # Jenoptik\nMGP # Pentax\nPICT # misc.\n #</pre> <!-- leave this line exactly as it is -->",
-    "upload-success-subj": "Successful upload",
-    "upload-success-msg": "Your upload from [$2] was successful. It is available here: [[:{{ns:file}}:$1]]",
-    "upload-failure-subj": "Upload problem",
-    "upload-failure-msg": "There was a problem with your upload from [$2]:\n\n$1",
-    "upload-warning-subj": "Upload warning",
-    "upload-warning-msg": "There was a problem with your upload from [$2]. You may return to the [[Special:Upload/stash/$1|upload form]] to correct this problem.",
-    "upload-proto-error": "Incorrect protocol",
-    "upload-proto-error-text": "Remote upload requires URLs beginning with <code>http://</code> or <code>ftp://</code>.",
-    "upload-file-error": "Internal error",
-    "upload-file-error-text": "An internal error occurred when attempting to create a temporary file on the server.\nPlease contact an [[Special:ListUsers/sysop|administrator]].",
-    "upload-misc-error": "Unknown upload error",
-    "upload-misc-error-text": "An unknown error occurred during the upload.\nPlease verify that the URL is valid and accessible and try again.\nIf the problem persists, contact an [[Special:ListUsers/sysop|administrator]].",
-    "upload-too-many-redirects": "The URL contained too many redirects",
-    "upload-http-error": "An HTTP error occurred: $1",
-    "upload-copy-upload-invalid-domain": "Copy uploads are not available from this domain.",
-    "backend-fail-stream": "Could not stream file \"$1\".",
-    "backend-fail-backup": "Could not backup file \"$1\".",
-    "backend-fail-notexists": "The file $1 does not exist.",
-    "backend-fail-hashes": "Could not get file hashes for comparison.",
-    "backend-fail-notsame": "A non-identical file already exists at \"$1\".",
-    "backend-fail-invalidpath": "\"$1\" is not a valid storage path.",
-    "backend-fail-delete": "Could not delete file \"$1\".",
-    "backend-fail-describe": "Could not change metadata for file \"$1\".",
-    "backend-fail-alreadyexists": "The file \"$1\" already exists.",
-    "backend-fail-store": "Could not store file \"$1\" at \"$2\".",
-    "backend-fail-copy": "Could not copy file \"$1\" to \"$2\".",
-    "backend-fail-move": "Could not move file \"$1\" to \"$2\".",
-    "backend-fail-opentemp": "Could not open temporary file.",
-    "backend-fail-writetemp": "Could not write to temporary file.",
-    "backend-fail-closetemp": "Could not close temporary file.",
-    "backend-fail-read": "Could not read file \"$1\".",
-    "backend-fail-create": "Could not write file \"$1\".",
-    "backend-fail-maxsize": "Could not write file \"$1\" because it is larger than {{PLURAL:$2|one byte|$2 bytes}}.",
-    "backend-fail-readonly": "The storage backend \"$1\" is currently read-only. The reason given is: \"<em>$2</em>\"",
-    "backend-fail-synced": "The file \"$1\" is in an inconsistent state within the internal storage backends",
-    "backend-fail-connect": "Could not connect to storage backend \"$1\".",
-    "backend-fail-internal": "An unknown error occurred in storage backend \"$1\".",
-    "backend-fail-contenttype": "Could not determine the content type of the file to store at \"$1\".",
-    "backend-fail-batchsize": "The storage backend was given a batch of $1 file {{PLURAL:$1|operation|operations}}; the limit is $2 {{PLURAL:$2|operation|operations}}.",
-    "backend-fail-usable": "Could not read or write file \"$1\" due to insufficient permissions or missing directories/containers.",
-    "filejournal-fail-dbconnect": "Could not connect to the journal database for storage backend \"$1\".",
-    "filejournal-fail-dbquery": "Could not update the journal database for storage backend \"$1\".",
-    "lockmanager-notlocked": "Could not unlock \"$1\"; it is not locked.",
-    "lockmanager-fail-closelock": "Could not close lock file for \"$1\".",
-    "lockmanager-fail-deletelock": "Could not delete lock file for \"$1\".",
-    "lockmanager-fail-acquirelock": "Could not acquire lock for \"$1\".",
-    "lockmanager-fail-openlock": "Could not open lock file for \"$1\".",
-    "lockmanager-fail-releaselock": "Could not release lock for \"$1\".",
-    "lockmanager-fail-db-bucket": "Could not contact enough lock databases in bucket $1.",
-    "lockmanager-fail-db-release": "Could not release locks on database $1.",
-    "lockmanager-fail-svr-acquire": "Could not acquire locks on server $1.",
-    "lockmanager-fail-svr-release": "Could not release locks on server $1.",
-    "zip-file-open-error": "An error was encountered when opening the file for ZIP checks.",
-    "zip-wrong-format": "The specified file was not a ZIP file.",
-    "zip-bad": "The file is a corrupt or otherwise unreadable ZIP file.\nIt cannot be properly checked for security.",
-    "zip-unsupported": "The file is a ZIP file that uses ZIP features not supported by MediaWiki.\nIt cannot be properly checked for security.",
-    "uploadstash": "Upload stash",
-    "uploadstash-summary": "This page provides access to files that are uploaded or in the process of uploading, but are not yet published to the wiki. These files are not visible to anyone but the user who uploaded them.",
-    "uploadstash-clear": "Clear stashed files",
-    "uploadstash-nofiles": "You have no stashed files.",
-    "uploadstash-badtoken": "Performing of that action was unsuccessful, perhaps because your editing credentials expired. Try again.",
-    "uploadstash-errclear": "Clearing the files was unsuccessful.",
-    "uploadstash-refresh": "Refresh the list of files",
-    "invalid-chunk-offset": "Invalid chunk offset",
-    "img-auth-accessdenied": "Access denied",
-    "img-auth-nopathinfo": "Missing PATH_INFO.\nYour server is not set up to pass this information.\nIt may be CGI-based and cannot support img_auth.\nSee https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
-    "img-auth-notindir": "Requested path is not in the configured upload directory.",
-    "img-auth-badtitle": "Unable to construct a valid title from \"$1\".",
-    "img-auth-nologinnWL": "You are not logged in and \"$1\" is not in the whitelist.",
-    "img-auth-nofile": "File \"$1\" does not exist.",
-    "img-auth-isdir": "You are trying to access a directory \"$1\".\nOnly file access is allowed.",
-    "img-auth-streaming": "Streaming \"$1\".",
-    "img-auth-public": "The function of img_auth.php is to output files from a private wiki.\nThis wiki is configured as a public wiki.\nFor optimal security, img_auth.php is disabled.",
-    "img-auth-noread": "User does not have access to read \"$1\".",
-    "http-invalid-url": "Invalid URL: $1",
-    "http-invalid-scheme": "URLs with the \"$1\" scheme are not supported.",
-    "http-request-error": "HTTP request failed due to unknown error.",
-    "http-read-error": "HTTP read error.",
-    "http-timed-out": "HTTP request timed out.",
-    "http-curl-error": "Error fetching URL: $1",
-    "http-bad-status": "There was a problem during the HTTP request: $1 $2",
-    "upload-curl-error6": "Could not reach URL",
-    "upload-curl-error6-text": "The URL provided could not be reached.\nPlease double-check that the URL is correct and the site is up.",
-    "upload-curl-error28": "Upload timeout",
-    "upload-curl-error28-text": "The site took too long to respond.\nPlease check the site is up, wait a short while and try again.\nYou may want to try at a less busy time.",
-    "license": "Licensing:",
-    "license-header": "Licensing",
-    "nolicense": "None selected",
-    "licenses": "-",
-    "license-nopreview": "(Preview not available)",
-    "upload_source_url": "(a valid, publicly accessible URL)",
-    "upload_source_file": "(a file on your computer)",
-    "listfiles-summary": "This special page shows all uploaded files.",
-    "listfiles_search_for": "Search for media name:",
-    "imgfile": "file",
-    "listfiles": "File list",
-    "listfiles_thumb": "Thumbnail",
-    "listfiles_date": "Date",
-    "listfiles_name": "Name",
-    "listfiles_user": "User",
-    "listfiles_size": "Size",
-    "listfiles_description": "Description",
-    "listfiles_count": "Versions",
-    "listfiles-show-all": "Include old versions of images",
-    "listfiles-latestversion": "Current version",
-    "listfiles-latestversion-yes": "Yes",
-    "listfiles-latestversion-no": "No",
-    "file-anchor-link": "File",
-    "filehist": "File history",
-    "filehist-help": "Click on a date/time to view the file as it appeared at that time.",
-    "filehist-deleteall": "delete all",
-    "filehist-deleteone": "delete",
-    "filehist-revert": "revert",
-    "filehist-current": "current",
-    "filehist-datetime": "Date/Time",
-    "filehist-thumb": "Thumbnail",
-    "filehist-thumbtext": "Thumbnail for version as of $1",
-    "filehist-nothumb": "No thumbnail",
-    "filehist-user": "User",
-    "filehist-dimensions": "Dimensions",
-    "filehist-filesize": "File size",
-    "filehist-comment": "Comment",
-    "imagelinks": "File usage",
-    "linkstoimage": "The following {{PLURAL:$1|page links|$1 pages link}} to this file:",
-    "linkstoimage-more": "More than $1 {{PLURAL:$1|page links|pages link}} to this file.\nThe following list shows the {{PLURAL:$1|first page link|first $1 page links}} to this file only.\nA [[Special:WhatLinksHere/$2|full list]] is available.",
-    "nolinkstoimage": "There are no pages that link to this file.",
-    "morelinkstoimage": "View [[Special:WhatLinksHere/$1|more links]] to this file.",
-    "linkstoimage-redirect": "$1 (file redirect) $2",
-    "duplicatesoffile": "The following {{PLURAL:$1|file is a duplicate|$1 files are duplicates}} of this file ([[Special:FileDuplicateSearch/$2|more details]]):",
-    "sharedupload": "This file is from $1 and may be used by other projects.",
-    "sharedupload-desc-there": "This file is from $1 and may be used by other projects.\nPlease see the [$2 file description page] for further information.",
-    "sharedupload-desc-here": "This file is from $1 and may be used by other projects.\nThe description on its [$2 file description page] there is shown below.",
-    "sharedupload-desc-edit": "This file is from $1 and may be used by other projects.\nMaybe you want to edit the description on its [$2 file description page] there.",
-    "sharedupload-desc-create": "This file is from $1 and may be used by other projects.\nMaybe you want to edit the description on its [$2 file description page] there.",
-    "shareddescriptionfollows": "-",
-    "filepage-nofile": "No file by this name exists.",
-    "filepage-nofile-link": "No file by this name exists, but you can [$1 upload it].",
-    "uploadnewversion-linktext": "Upload a new version of this file",
-    "shared-repo-from": "from $1",
-    "shared-repo": "a shared repository",
-    "shared-repo-name-wikimediacommons": "Wikimedia Commons",
-    "filepage.css": "/* CSS placed here is included on the file description page, also included on foreign client wikis */",
-    "upload-disallowed-here": "You cannot overwrite this file.",
-    "filerevert": "Revert $1",
-    "filerevert-legend": "Revert file",
-    "filerevert-intro": "You are about to revert the file <strong>[[Media:$1|$1]]</strong> to the [$4 version as of $3, $2].",
-    "filerevert-comment": "Reason:",
-    "filerevert-defaultcomment": "Reverted to version as of $2, $1",
-    "filerevert-submit": "Revert",
-    "filerevert-success": "<strong>[[Media:$1|$1]]</strong> has been reverted to the [$4 version as of $3, $2].",
-    "filerevert-badversion": "There is no previous local version of this file with the provided timestamp.",
-    "filedelete": "Delete $1",
-    "filedelete-legend": "Delete file",
-    "filedelete-intro": "You are about to delete the file <strong>[[Media:$1|$1]]</strong> along with all of its history.",
-    "filedelete-intro-old": "You are deleting the version of <strong>[[Media:$1|$1]]</strong> as of [$4 $3, $2].",
-    "filedelete-comment": "Reason:",
-    "filedelete-submit": "Delete",
-    "filedelete-success": "<strong>$1</strong> has been deleted.",
-    "filedelete-success-old": "The version of <strong>[[Media:$1|$1]]</strong> as of $3, $2 has been deleted.",
-    "filedelete-nofile": "<strong>$1</strong> does not exist.",
-    "filedelete-nofile-old": "There is no archived version of <strong>$1</strong> with the specified attributes.",
-    "filedelete-otherreason": "Other/additional reason:",
-    "filedelete-reason-otherlist": "Other reason",
-    "filedelete-reason-dropdown": "*Common delete reasons\n** Copyright violation\n** Duplicated file",
-    "filedelete-edit-reasonlist": "Edit delete reasons",
-    "filedelete-maintenance": "Deletion and restoration of files temporarily disabled during maintenance.",
-    "filedelete-maintenance-title": "Cannot delete file",
-    "mimesearch": "MIME search",
-    "mimesearch-summary": "This page enables the filtering of files for their MIME type.\nInput: contenttype/subtype, e.g. <code>image/jpeg</code>.",
-    "mimetype": "MIME type:",
-    "download": "download",
-    "unwatchedpages": "Unwatched pages",
-    "unwatchedpages-summary": "",
-    "listredirects": "List of redirects",
-    "listredirects-summary": "",
-    "listduplicatedfiles": "List of files with duplicates",
-    "listduplicatedfiles-summary": "This is a list of files where the most recent version of the file is a duplicate of the most recent version of some other file. Only local files are considered.",
-    "listduplicatedfiles-entry": "[[:File:$1|$1]] has [[$3|{{PLURAL:$2|a duplicate|$2 duplicates}}]].",
-    "unusedtemplates": "Unused templates",
-    "unusedtemplates-summary": "",
-    "unusedtemplatestext": "This page lists all pages in the {{ns:template}} namespace that are not included in another page.\nRemember to check for other links to the templates before deleting them.",
-    "unusedtemplateswlh": "other links",
-    "randompage": "Random page",
-    "randompage-nopages": "There are no pages in the following {{PLURAL:$2|namespace|namespaces}}: $1.",
-    "randompage-url": "Special:Random",
-    "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",
-    "randomredirect": "Random redirect",
-    "randomredirect-nopages": "There are no redirects in the namespace \"$1\".",
-    "statistics": "Statistics",
-    "statistics-summary": "",
-    "statistics-header-pages": "Page statistics",
-    "statistics-header-edits": "Edit statistics",
-    "statistics-header-views": "View statistics",
-    "statistics-header-users": "User statistics",
-    "statistics-header-hooks": "Other statistics",
-    "statistics-articles": "Content pages",
-    "statistics-pages": "Pages",
-    "statistics-pages-desc": "All pages in the wiki, including talk pages, redirects, etc.",
-    "statistics-files": "Uploaded files",
-    "statistics-edits": "Page edits since {{SITENAME}} was set up",
-    "statistics-edits-average": "Average edits per page",
-    "statistics-views-total": "Views total",
-    "statistics-views-total-desc": "Views to non-existing pages and special pages are not included",
-    "statistics-views-peredit": "Views per edit",
-    "statistics-users": "Registered [[Special:ListUsers|users]]",
-    "statistics-users-active": "Active users",
-    "statistics-users-active-desc": "Users who have performed an action in the last {{PLURAL:$1|day|$1 days}}",
-    "statistics-mostpopular": "Most viewed pages",
-    "statistics-footer": "",
-    "pageswithprop": "Pages with a page property",
-    "pageswithprop-summary": "",
-    "pageswithprop-legend": "Pages with a page property",
-    "pageswithprop-text": "This page lists pages that use a particular page property.",
-    "pageswithprop-prop": "Property name:",
-    "pageswithprop-submit": "Go",
-    "pageswithprop-prophidden-long": "long text property value hidden ($1)",
-    "pageswithprop-prophidden-binary": "binary property value hidden ($1)",
-    "doubleredirects": "Double redirects",
-    "doubleredirects-summary": "",
-    "doubleredirectstext": "This page lists pages that redirect to other redirect pages.\nEach row contains links to the first and second redirect, as well as the target of the second redirect, which is usually the \"real\" target page to which the first redirect should point.\n<del>Crossed out</del> entries have been solved.",
-    "double-redirect-fixed-move": "[[$1]] has been moved.\nIt now redirects to [[$2]].",
-    "double-redirect-fixed-maintenance": "Fixing double redirect from [[$1]] to [[$2]].",
-    "double-redirect-fixer": "Redirect fixer",
-    "brokenredirects": "Broken redirects",
-    "brokenredirects-summary": "",
-    "brokenredirectstext": "The following redirects link to non-existent pages:",
-    "brokenredirects-edit": "edit",
-    "brokenredirects-delete": "delete",
-    "withoutinterwiki": "Pages without language links",
-    "withoutinterwiki-summary": "The following pages do not link to other language versions.",
-    "withoutinterwiki-legend": "Prefix",
-    "withoutinterwiki-submit": "Show",
-    "fewestrevisions": "Pages with the fewest revisions",
-    "fewestrevisions-summary": "",
-    "nbytes": "$1 {{PLURAL:$1|byte|bytes}}",
-    "ncategories": "$1 {{PLURAL:$1|category|categories}}",
-    "ninterwikis": "$1 {{PLURAL:$1|interwiki|interwikis}}",
-    "nlinks": "$1 {{PLURAL:$1|link|links}}",
-    "nmembers": "$1 {{PLURAL:$1|member|members}}",
-    "nmemberschanged": "$1 → $2 {{PLURAL:$2|member|members}}",
-    "nrevisions": "$1 {{PLURAL:$1|revision|revisions}}",
-    "nviews": "$1 {{PLURAL:$1|view|views}}",
-    "nimagelinks": "Used on $1 {{PLURAL:$1|page|pages}}",
-    "ntransclusions": "used on $1 {{PLURAL:$1|page|pages}}",
-    "specialpage-empty": "There are no results for this report.",
-    "lonelypages": "Orphaned pages",
-    "lonelypages-summary": "",
-    "lonelypagestext": "The following pages are not linked from or transcluded into other pages in {{SITENAME}}.",
-    "uncategorizedpages": "Uncategorized pages",
-    "uncategorizedpages-summary": "",
-    "uncategorizedcategories": "Uncategorized categories",
-    "uncategorizedcategories-summary": "",
-    "uncategorizedimages": "Uncategorized files",
-    "uncategorizedimages-summary": "",
-    "uncategorizedtemplates": "Uncategorized templates",
-    "uncategorizedtemplates-summary": "",
-    "unusedcategories": "Unused categories",
-    "unusedcategories-summary": "",
-    "unusedimages": "Unused files",
-    "unusedimages-summary": "",
-    "popularpages": "Popular pages",
-    "popularpages-summary": "",
-    "wantedcategories": "Wanted categories",
-    "wantedcategories-summary": "",
-    "wantedpages": "Wanted pages",
-    "wantedpages-summary": "",
-    "wantedpages-badtitle": "Invalid title in result set: $1",
-    "wantedfiles": "Wanted files",
-    "wantedfiles-summary": "",
-    "wantedfiletext-cat": "The following files are used but do not exist. Files from foreign repositories may be listed despite existing. Any such false positives will be <del>struck out</del>. Additionally, pages that embed files that do not exist are listed in [[:$1]].",
-    "wantedfiletext-nocat": "The following files are used but do not exist. Files from foreign repositories may be listed despite existing. Any such false positives will be <del>struck out</del>.",
-    "wantedtemplates": "Wanted templates",
-    "wantedtemplates-summary": "",
-    "mostlinked": "Most linked-to pages",
-    "mostlinked-summary": "",
-    "mostlinkedcategories": "Most linked-to categories",
-    "mostlinkedcategories-summary": "",
-    "mostlinkedtemplates": "Most linked-to templates",
-    "mostlinkedtemplates-summary": "",
-    "mostcategories": "Pages with the most categories",
-    "mostcategories-summary": "",
-    "mostimages": "Most linked-to files",
-    "mostimages-summary": "",
-    "mostinterwikis": "Pages with the most interwikis",
-    "mostinterwikis-summary": "",
-    "mostrevisions": "Pages with the most revisions",
-    "mostrevisions-summary": "",
-    "prefixindex": "All pages with prefix",
-    "prefixindex-namespace": "All pages with prefix ($1 namespace)",
-    "prefixindex-summary": "",
-    "prefixindex-strip": "Strip prefix in list",
-    "shortpages": "Short pages",
-    "shortpages-summary": "",
-    "longpages": "Long pages",
-    "longpages-summary": "",
-    "deadendpages": "Dead-end pages",
-    "deadendpages-summary": "",
-    "deadendpagestext": "The following pages do not link to other pages in {{SITENAME}}.",
-    "protectedpages": "Protected pages",
-    "protectedpages-indef": "Indefinite protections only",
-    "protectedpages-summary": "This page lists existing pages that are currently protected. For a list of titles that are protected from creation, see [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
-    "protectedpages-cascade": "Cascading protections only",
-    "protectedpages-noredirect": "Hide redirects",
-    "protectedpagesempty": "No pages are currently protected with these parameters.",
-    "protectedpages-timestamp": "Timestamp",
-    "protectedpages-page": "Page",
-    "protectedpages-expiry": "Expires",
-    "protectedpages-performer": "Protecting user",
-    "protectedpages-params": "Protection parameters",
-    "protectedpages-reason": "Reason",
-    "protectedpages-unknown-timestamp": "Unknown",
-    "protectedpages-unknown-performer": "Unknown user",
-    "protectedpages-unknown-reason": "—",
-    "protectedtitles": "Protected titles",
-    "protectedtitles-summary": "This page lists titles that are currently protected from creation. For a list of existing pages that are protected, see [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
-    "protectedtitlesempty": "No titles are currently protected with these parameters.",
-    "listusers": "User list",
-    "listusers-summary": "",
-    "listusers-editsonly": "Show only users with edits",
-    "listusers-creationsort": "Sort by creation date",
-    "listusers-desc": "Sort in descending order",
-    "usereditcount": "$1 {{PLURAL:$1|edit|edits}}",
-    "usercreated": "{{GENDER:$3|Created}} on $1 at $2",
-    "newpages": "New pages",
-    "newpages-summary": "",
-    "newpages-username": "Username:",
-    "ancientpages": "Oldest pages",
-    "ancientpages-summary": "",
-    "move": "Move",
-    "movethispage": "Move this page",
-    "unusedimagestext": "The following files exist but are not embedded in any page.\nPlease note that other web sites may link to a file with a direct URL, and so may still be listed here despite being in active use.",
-    "unusedcategoriestext": "The following category pages exist, although no other page or category makes use of them.",
-    "notargettitle": "No target",
-    "notargettext": "You have not specified a target page or user to perform this function on.",
-    "nopagetitle": "No such target page",
-    "nopagetext": "The target page you have specified does not exist.",
-    "pager-newer-n": "{{PLURAL:$1|newer 1|newer $1}}",
-    "pager-older-n": "{{PLURAL:$1|older 1|older $1}}",
-    "suppress": "Oversight",
-    "querypage-disabled": "This special page is disabled for performance reasons.",
-    "booksources": "Book sources",
-    "booksources-summary": "",
-    "booksources-search-legend": "Search for book sources",
-    "booksources-isbn": "ISBN:",
-    "booksources-go": "Go",
-    "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",
-    "pubmedurl": "//www.ncbi.nlm.nih.gov/pubmed/$1?dopt=Abstract",
-    "specialloguserlabel": "Performer:",
-    "speciallogtitlelabel": "Target (title or user):",
-    "log": "Logs",
-    "all-logs-page": "All public logs",
-    "alllogstext": "Combined display of all available logs of {{SITENAME}}.\nYou can narrow down the view by selecting a log type, the username (case-sensitive), or the affected page (also case-sensitive).",
-    "logempty": "No matching items in log.",
-    "log-title-wildcard": "Search titles starting with this text",
-    "showhideselectedlogentries": "Change visibility of selected log entries",
-    "allpages": "All pages",
-    "allpages-summary": "",
-    "alphaindexline": "$1 to $2",
-    "nextpage": "Next page ($1)",
-    "prevpage": "Previous page ($1)",
-    "allpagesfrom": "Display pages starting at:",
-    "allpagesto": "Display pages ending at:",
-    "allarticles": "All pages",
-    "allinnamespace": "All pages ($1 namespace)",
-    "allpagessubmit": "Go",
-    "allpagesprefix": "Display pages with prefix:",
-    "allpagesbadtitle": "The given page title was invalid or had an inter-language or inter-wiki prefix.\nIt may contain one or more characters that cannot be used in titles.",
-    "allpages-bad-ns": "{{SITENAME}} does not have namespace \"$1\".",
-    "allpages-hide-redirects": "Hide redirects",
-    "cachedspecial-viewing-cached-ttl": "You are viewing a cached version of this page, which can be up to $1 old.",
-    "cachedspecial-viewing-cached-ts": "You are viewing a cached version of this page, which might not be completely actual.",
-    "cachedspecial-refresh-now": "View latest.",
-    "categories": "Categories",
-    "categories-summary": "",
-    "categoriespagetext": "The following {{PLURAL:$1|category contains|categories contain}} pages or media.\n[[Special:UnusedCategories|Unused categories]] are not shown here.\nAlso see [[Special:WantedCategories|wanted categories]].",
-    "categoriesfrom": "Display categories starting at:",
-    "special-categories-sort-count": "sort by count",
-    "special-categories-sort-abc": "sort alphabetically",
-    "deletedcontributions": "Deleted user contributions",
-    "deletedcontributions-summary": "",
-    "deletedcontributions-title": "Deleted user contributions",
-    "sp-deletedcontributions-contribs": "contributions",
-    "linksearch": "External links search",
-    "linksearch-summary": "",
-    "linksearch-pat": "Search pattern:",
-    "linksearch-ns": "Namespace:",
-    "linksearch-ok": "Search",
-    "linksearch-text": "Wildcards such as \"*.wikipedia.org\" may be used.\nNeeds at least a top-level domain, for example \"*.org\".<br />\nSupported {{PLURAL:$2|protocol|protocols}}: <code>$1</code> (defaults to http:// if no protocol is specified).",
-    "linksearch-line": "$1 is linked from $2",
-    "linksearch-error": "Wildcards may appear only at the start of the hostname.",
-    "listusersfrom": "Display users starting at:",
-    "listusers-submit": "Show",
-    "listusers-noresult": "No user found.",
-    "listusers-blocked": "(blocked)",
-    "activeusers": "Active users list",
-    "activeusers-summary": "",
-    "activeusers-intro": "This is a list of users who had some kind of activity within the last $1 {{PLURAL:$1|day|days}}.",
-    "activeusers-count": "$1 {{PLURAL:$1|action|actions}} in the last {{PLURAL:$3|day|$3 days}}",
-    "activeusers-from": "Display users starting at:",
-    "activeusers-hidebots": "Hide bots",
-    "activeusers-hidesysops": "Hide administrators",
-    "activeusers-noresult": "No users found.",
-    "listgrouprights": "User group rights",
-    "listgrouprights-summary": "The following is a list of user groups defined on this wiki, with their associated access rights.\nThere may be [[{{MediaWiki:Listgrouprights-helppage}}|additional information]] about individual rights.",
-    "listgrouprights-key": "Legend:\n* <span class=\"listgrouprights-granted\">Granted right</span>\n* <span class=\"listgrouprights-revoked\">Revoked right</span>",
-    "listgrouprights-group": "Group",
-    "listgrouprights-rights": "Rights",
-    "listgrouprights-helppage": "Help:Group rights",
-    "listgrouprights-members": "(list of 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": "Add {{PLURAL:$2|group|groups}}: $1",
-    "listgrouprights-removegroup": "Remove {{PLURAL:$2|group|groups}}: $1",
-    "listgrouprights-addgroup-all": "Add all groups",
-    "listgrouprights-removegroup-all": "Remove all groups",
-    "listgrouprights-addgroup-self": "Add {{PLURAL:$2|group|groups}} to own account: $1",
-    "listgrouprights-removegroup-self": "Remove {{PLURAL:$2|group|groups}} from own account: $1",
-    "listgrouprights-addgroup-self-all": "Add all groups to own account",
-    "listgrouprights-removegroup-self-all": "Remove all groups from own account",
-    "listgrouprights-namespaceprotection-header": "Namespace restrictions",
-    "listgrouprights-namespaceprotection-namespace": "Namespace",
-    "listgrouprights-namespaceprotection-restrictedto": "Right(s) allowing user to edit",
-    "trackingcategories": "Tracking categories",
-    "trackingcategories-summary": "This page lists tracking categories which are automatically populated by the MediaWiki software. Their names can be changed by altering the relevant system messages in the {{ns:8}} namespace.",
-    "trackingcategories-msg": "Tracking category",
-    "trackingcategories-name": "Message name",
-    "trackingcategories-desc": "Category inclusion criteria",
-    "noindex-category-desc": "The page is not indexed by robots because it has the magic word <code><nowiki>__NOINDEX__</nowiki></code> on it and is in a namespace where that flag is allowed.",
-    "index-category-desc": "The page has a <code><nowiki>__INDEX__</nowiki></code> on it (and is in a namespace where that flag is allowed), and hence is indexed by robots where it normally wouldn't be.",
-    "post-expand-template-inclusion-category-desc": "After expanding all the templates, the page size is bigger than <code>$wgMaxArticleSize</code>, so some templates weren't expanded.",
-    "post-expand-template-argument-category-desc": "After expanding a template argument (something in triple braces, like <code>{{{Foo}}}</code>), the page is bigger than <code>$wgMaxArticleSize</code>.",
-    "expensive-parserfunction-category-desc": "Too many expensive parser functions (like <code>#ifexist</code>) included on a page. See [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
-    "broken-file-category-desc": "Category added if the page contains a broken file link (a link to embed a file when the file does not exist).",
-    "hidden-category-category-desc": "This is a category with <code><nowiki>__HIDDENCAT__</nowiki></code> on it, which prevents it from showing up in the category links box on pages, by default.",
-    "trackingcategories-nodesc": "No description available.",
-    "trackingcategories-disabled": "Category is disabled",
-    "mailnologin": "No send address",
-    "mailnologintext": "You must be [[Special:UserLogin|logged in]] and have a valid email address in your [[Special:Preferences|preferences]] to send email to other users.",
-    "emailuser": "Email this user",
-    "emailuser-title-target": "Email this {{GENDER:$1|user}}",
-    "emailuser-title-notarget": "Email user",
-    "emailuser-summary": "",
-    "emailpage": "Email user",
-    "emailpagetext": "You can use the form below to send an email message to this {{GENDER:$1|user}}.\nThe email address you entered in [[Special:Preferences|your user preferences]] will appear as the \"From\" address of the email, so the recipient will be able to reply directly to you.",
-    "defemailsubject": "{{SITENAME}} email from user \"$1\"",
-    "usermaildisabled": "User email disabled",
-    "usermaildisabledtext": "You cannot send email to other users on this wiki",
-    "noemailtitle": "No email address",
-    "noemailtext": "This user has not specified a valid email address.",
-    "nowikiemailtext": "This user has chosen not to receive email from other users.",
-    "emailnotarget": "Non-existent or invalid username for recipient.",
-    "emailtarget": "Enter username of recipient",
-    "emailusername": "Username:",
-    "emailusernamesubmit": "Submit",
-    "email-legend": "Send an email to another {{SITENAME}} user",
-    "emailfrom": "From:",
-    "emailto": "To:",
-    "emailsubject": "Subject:",
-    "emailmessage": "Message:",
-    "emailsend": "Send",
-    "emailccme": "Email me a copy of my message.",
-    "emailccsubject": "Copy of your message to $1: $2",
-    "emailsent": "Email sent",
-    "emailsenttext": "Your email message has been sent.",
-    "emailuserfooter": "This email was sent by $1 to $2 by the \"Email user\" function at {{SITENAME}}.",
-    "usermessage-summary": "Leaving system message.",
-    "usermessage-editor": "System messenger",
-    "usermessage-template": "MediaWiki:UserMessage",
-    "watchlist": "Watchlist",
-    "watchlist-summary": "",
-    "mywatchlist": "Watchlist",
-    "watchlistfor2": "For $1 $2",
-    "nowatchlist": "You have no items on your watchlist.",
-    "watchlistanontext": "Please $1 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.",
-    "removewatch": "Remove from watchlist",
-    "removedwatchtext": "The page \"[[:$1]]\" has been removed from [[Special:Watchlist|your watchlist]].",
-    "watch": "Watch",
-    "watchthispage": "Watch this page",
-    "unwatch": "Unwatch",
-    "unwatchthispage": "Stop watching",
-    "notanarticle": "Not a content page",
-    "notvisiblerev": "The last revision by a different user has been deleted",
-    "watchlist-details": "{{PLURAL:$1|$1 page|$1 pages}} on your watchlist, not separately counting talk pages.",
-    "wlheader-enotif": "Email notification is enabled.",
-    "wlheader-showupdated": "Pages that have been changed since you last visited them are shown in <strong>bold</strong>.",
-    "watchmethod-recent": "checking recent edits for watched pages",
-    "watchmethod-list": "checking watched pages for recent edits",
-    "watchlistcontains": "Your watchlist contains $1 {{PLURAL:$1|page|pages}}.",
-    "iteminvalidname": "Problem with item \"$1\", invalid name...",
-    "wlnote2": "Below are the changes in the last {{PLURAL:$1|hour|<strong>$1</strong> hours}}, as of $2, $3.",
-    "wlshowlast": "Show last $1 hours $2 days $3",
-    "watchlist-options": "Watchlist options",
-    "watching": "Watching...",
-    "unwatching": "Unwatching...",
-    "watcherrortext": "An error occurred while changing your watchlist settings for \"$1\".",
-    "enotif_reset": "Mark all pages visited",
-    "enotif_impersonal_salutation": "{{SITENAME}} user",
-    "enotif_subject_deleted": "{{SITENAME}} page $1 has been {{GENDER:$2|deleted}} by $2",
-    "enotif_subject_created": "{{SITENAME}} page $1 has been {{GENDER:$2|created}} by $2",
-    "enotif_subject_moved": "{{SITENAME}} page $1 has been {{GENDER:$2|moved}} by $2",
-    "enotif_subject_restored": "{{SITENAME}} page $1 has been {{GENDER:$2|restored}} by $2",
-    "enotif_subject_changed": "{{SITENAME}} page $1 has been {{GENDER:$2|changed}} by $2",
-    "enotif_body_intro_deleted": "The {{SITENAME}} page $1 has been {{GENDER:$2|deleted}} on $PAGEEDITDATE by $2, see $3.",
-    "enotif_body_intro_created": "The {{SITENAME}} page $1 has been {{GENDER:$2|created}} on $PAGEEDITDATE by $2, see $3 for the current revision.",
-    "enotif_body_intro_moved": "The {{SITENAME}} page $1 has been {{GENDER:$2|moved}} on $PAGEEDITDATE by $2, see $3 for the current revision.",
-    "enotif_body_intro_restored": "The {{SITENAME}} page $1 has been {{GENDER:$2|restored}} on $PAGEEDITDATE by $2, see $3 for the current revision.",
-    "enotif_body_intro_changed": "The {{SITENAME}} page $1 has been {{GENDER:$2|changed}} on $PAGEEDITDATE by $2, see $3 for the current revision.",
-    "enotif_lastvisited": "See $1 for all changes since your last visit.",
-    "enotif_lastdiff": "See $1 to view this change.",
-    "enotif_anon_editor": "anonymous user $1",
-    "enotif_body": "Dear $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nEditor's summary: $PAGESUMMARY $PAGEMINOREDIT\n\nContact the editor:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nThere will be no other notifications in case of further activity unless you visit this page while logged in. You could also reset the notification flags for all your watched pages on your watchlist.\n\nYour friendly {{SITENAME}} notification system\n\n--\nTo change your email notification settings, visit\n{{canonicalurl:{{#special:Preferences}}}}\n\nTo change your watchlist settings, visit\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nTo delete the page from your watchlist, visit\n$UNWATCHURL\n\nFeedback and further assistance:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
-    "created": "created",
-    "changed": "changed",
-    "deletepage": "Delete page",
-    "confirm": "Confirm",
-    "excontent": "content was: \"$1\"",
-    "excontentauthor": "content was: \"$1\" (and the only contributor was \"[[Special:Contributions/$2|$2]]\")",
-    "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}}:",
-    "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",
-    "deletedtext": "\"$1\" has been deleted.\nSee $2 for a record of recent deletions.",
-    "dellogpage": "Deletion log",
-    "dellogpagetext": "Below is a list of the most recent deletions.",
-    "deletionlog": "deletion log",
-    "reverted": "Reverted to earlier revision",
-    "deletecomment": "Reason:",
-    "deleteotherreason": "Other/additional reason:",
-    "deletereasonotherlist": "Other reason",
-    "deletereason-dropdown": "* Common delete reasons\n** Spam\n** Vandalism\n** Copyright violation\n** Author request\n** Broken redirect",
-    "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.",
-    "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",
-    "rollbacklink": "rollback",
-    "rollbacklinkcount": "rollback $1 {{PLURAL:$1|edit|edits}}",
-    "rollbacklinkcount-morethan": "rollback more than $1 {{PLURAL:$1|edit|edits}}",
-    "rollbackfailed": "Rollback failed",
-    "cantrollback": "Cannot revert edit;\nlast contributor is only author of this page.",
-    "alreadyrolled": "Cannot rollback last edit of [[:$1]] by [[User:$2|$2]] ([[User talk:$2|talk]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nsomeone else has edited or rolled back the page already.\n\nThe last edit to the page was by [[User:$3|$3]] ([[User talk:$3|talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
-    "editcomment": "The edit summary was: \"''$1''\".",
-    "revertpage": "Reverted edits by [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]]) to last revision by [[User:$1|$1]]",
-    "revertpage-nouser": "Reverted edits by a hidden user to last revision by {{GENDER:$1|[[User:$1|$1]]}}",
-    "rollback-success": "Reverted edits by $1;\nchanged back to last revision by $2.",
-    "sessionfailure-title": "Session failure",
-    "sessionfailure": "There seems to be a problem with your login session;\nthis action has been canceled as a precaution against session hijacking.\nGo back to the previous page, reload that page and then try again.",
-    "protectlogpage": "Protection log",
-    "protectlogtext": "Below is a list of changes to page protections.\nSee the [[Special:ProtectedPages|protected pages list]] for the list of currently operational page protections.",
-    "protectedarticle": "protected \"[[$1]]\"",
-    "modifiedarticleprotection": "changed protection level for \"[[$1]]\"",
-    "unprotectedarticle": "removed protection from \"[[$1]]\"",
-    "movedarticleprotection": "moved protection settings from \"[[$2]]\" to \"[[$1]]\"",
-    "protect-title": "Change protection level for \"$1\"",
-    "protect-title-notallowed": "View protection level of \"$1\"",
-    "prot_1movedto2": "[[$1]] moved to [[$2]]",
-    "protect-badnamespace-title": "Non-protectable namespace",
-    "protect-badnamespace-text": "Pages in this namespace cannot be protected.",
-    "protect-norestrictiontypes-text": "This page cannot be protected as there are no restriction types available.",
-    "protect-norestrictiontypes-title": "Non-protectable page",
-    "protect-legend": "Confirm protection",
-    "protectcomment": "Reason:",
-    "protectexpiry": "Expires:",
-    "protect_expiry_invalid": "Expiry time is invalid.",
-    "protect_expiry_old": "Expiry time is in the past.",
-    "protect-unchain-permissions": "Unlock further protect options",
-    "protect-text": "Here you may view and change the protection level for the page <strong>$1</strong>.",
-    "protect-locked-blocked": "You cannot change protection levels while blocked.\nHere are the current settings for the page <strong>$1</strong>:",
-    "protect-locked-dblock": "Protection levels cannot be changed due to an active database lock.\nHere are the current settings for the page <strong>$1</strong>:",
-    "protect-locked-access": "Your account does not have permission to change page protection levels.\nHere are the current settings for the page <strong>$1</strong>:",
-    "protect-cascadeon": "This page is currently protected because it is included in the following {{PLURAL:$1|page, which has|pages, which have}} cascading protection turned on.\nChanges to this page's protection level will not affect the cascading protection.",
-    "protect-default": "Allow all users",
-    "protect-fallback": "Allow only users with \"$1\" permission",
-    "protect-level-autoconfirmed": "Allow only autoconfirmed users",
-    "protect-level-sysop": "Allow only administrators",
-    "protect-summary-desc": "[$1=$2] ($3)",
-    "protect-summary-cascade": "cascading",
-    "protect-expiring": "expires $1 (UTC)",
-    "protect-expiring-local": "expires $1",
-    "protect-expiry-indefinite": "indefinite",
-    "protect-cascade": "Protect pages included in this page (cascading protection)",
-    "protect-cantedit": "You cannot change the protection levels of this page because you do not have permission to edit it.",
-    "protect-othertime": "Other time:",
-    "protect-othertime-op": "other time",
-    "protect-existing-expiry": "Existing expiry time: $3, $2",
-    "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",
-    "protect-edit-reasonlist": "Edit protection reasons",
-    "protect-expiry-options": "1 hour:1 hour,1 day:1 day,1 week:1 week,2 weeks:2 weeks,1 month:1 month,3 months:3 months,6 months:6 months,1 year:1 year,infinite:infinite",
-    "restriction-type": "Permission:",
-    "restriction-level": "Restriction level:",
-    "minimum-size": "Min size",
-    "maximum-size": "Max size:",
-    "pagesize": "(bytes)",
-    "restriction-edit": "Edit",
-    "restriction-move": "Move",
-    "restriction-create": "Create",
-    "restriction-upload": "Upload",
-    "restriction-level-sysop": "fully protected",
-    "restriction-level-autoconfirmed": "semi protected",
-    "restriction-level-all": "any level",
-    "undelete": "View deleted pages",
-    "undelete-summary": "",
-    "undeletepage": "View and restore deleted pages",
-    "undeletepagetitle": "<strong>The following consists of deleted revisions of [[:$1|$1]]</strong>.",
-    "viewdeletedpage": "View deleted pages",
-    "undeletepagetext": "The following {{PLURAL:$1|page has been deleted but is|$1 pages have been deleted but are}} still in the archive and can be restored.\nThe archive may be periodically cleaned out.",
-    "undelete-fieldset-title": "Restore revisions",
-    "undeleteextrahelp": "To restore the page's entire history, leave all checkboxes deselected and click <strong><em>{{int:undeletebtn}}</em></strong>.\nTo perform a selective restoration, check the boxes corresponding to the revisions to be restored, and click <strong><em>{{int:undeletebtn}}</em></strong>.",
-    "undeleterevisions": "$1 {{PLURAL:$1|revision|revisions}} archived",
-    "undeletehistory": "If you restore the page, all revisions will be restored to the history.\nIf a new page with the same name has been created since the deletion, the restored revisions will appear in the prior history.",
-    "undeleterevdel": "Undeletion will not be performed if it will result in the top page or file revision being partially deleted.\nIn such cases, you must uncheck or unhide the newest deleted revision.",
-    "undeletehistorynoadmin": "This page has been deleted.\nThe reason for deletion is shown in the summary below, along with details of the users who had edited this page before deletion.\nThe actual text of these deleted revisions is only available to administrators.",
-    "undelete-revision": "Deleted revision of $1 (as of $4, at $5) by $3:",
-    "undeleterevision-missing": "Invalid or missing revision.\nYou may have a bad link, or the revision may have been restored or removed from the archive.",
-    "undelete-nodiff": "No previous revision found.",
-    "undeletebtn": "Restore",
-    "undeletelink": "view/restore",
-    "undeleteviewlink": "view",
-    "undeleteinvert": "Invert selection",
-    "undeletecomment": "Reason:",
-    "undeletedrevisions": "{{PLURAL:$1|1 revision|$1 revisions}} restored",
-    "undeletedrevisions-files": "{{PLURAL:$1|1 revision|$1 revisions}} and {{PLURAL:$2|1 file|$2 files}} restored",
-    "undeletedfiles": "{{PLURAL:$1|1 file|$1 files}} restored",
-    "cannotundelete": "Undelete failed:\n$1",
-    "undeletedpage": "<strong>$1 has been restored</strong>\n\nConsult the [[Special:Log/delete|deletion log]] for a record of recent deletions and restorations.",
-    "undelete-header": "See [[Special:Log/delete|the deletion log]] for recently deleted pages.",
-    "undelete-search-title": "Search deleted pages",
-    "undelete-search-box": "Search deleted pages",
-    "undelete-search-prefix": "Show pages starting with:",
-    "undelete-search-submit": "Search",
-    "undelete-no-results": "No matching pages found in the deletion archive.",
-    "undelete-filename-mismatch": "Cannot undelete file revision with timestamp $1: Filename mismatch.",
-    "undelete-bad-store-key": "Cannot undelete file revision with timestamp $1: File was missing before deletion.",
-    "undelete-cleanup-error": "Error deleting unused archive file \"$1\".",
-    "undelete-missing-filearchive": "Unable to restore file archive ID $1 because it is not in the database.\nIt may have already been undeleted.",
-    "undelete-error": "Error undeleting page",
-    "undelete-error-short": "Error undeleting file: $1",
-    "undelete-error-long": "Errors were encountered while undeleting the file:\n\n$1",
-    "undelete-show-file-confirm": "Are you sure you want to view the deleted revision of the file \"<nowiki>$1</nowiki>\" from $2 at $3?",
-    "undelete-show-file-submit": "Yes",
-    "undelete-revision-row": "$1 $2 ($3) $4 . . $5 $6 $7 $8 $9",
-    "namespace": "Namespace:",
-    "invert": "Invert selection",
-    "tooltip-invert": "Check this box to hide changes to pages within the selected namespace (and the associated namespace if checked)",
-    "namespace_association": "Associated namespace",
-    "tooltip-namespace_association": "Check this box to also include the talk or subject namespace associated with the selected namespace",
-    "blanknamespace": "(Main)",
-    "contributions": "{{GENDER:$1|User}} contributions",
-    "contributions-summary": "",
-    "contributions-title": "User contributions for $1",
-    "mycontris": "Contributions",
-    "contribsub2": "For {{GENDER:$3|$1}} ($2)",
-    "contributions-userdoesnotexist": "User account \"$1\" is not registered.",
-    "nocontribs": "No changes were found matching these criteria.",
-    "uctop": "(current)",
-    "month": "From month (and earlier):",
-    "year": "From year (and earlier):",
-    "sp-contributions-newbies": "Show contributions of new accounts only",
-    "sp-contributions-newbies-sub": "For new accounts",
-    "sp-contributions-newbies-title": "User contributions for new accounts",
-    "sp-contributions-blocklog": "block log",
-    "sp-contributions-suppresslog": "suppressed user contributions",
-    "sp-contributions-deleted": "deleted user contributions",
-    "sp-contributions-uploads": "uploads",
-    "sp-contributions-logs": "logs",
-    "sp-contributions-talk": "talk",
-    "sp-contributions-userrights": "user rights management",
-    "sp-contributions-blocked-notice": "This user is currently blocked.\nThe latest block log entry is provided below for reference:",
-    "sp-contributions-blocked-notice-anon": "This IP address is currently blocked.\nThe latest block log entry is provided below for reference:",
-    "sp-contributions-search": "Search for contributions",
-    "sp-contributions-username": "IP address or username:",
-    "sp-contributions-toponly": "Only show edits that are latest revisions",
-    "sp-contributions-newonly": "Only show edits that are page creations",
-    "sp-contributions-submit": "Search",
-    "sp-contributions-explain": "",
-    "sp-contributions-footer": "-",
-    "sp-contributions-footer-anon": "-",
-    "sp-contributions-footer-newbies": "-",
-    "whatlinkshere": "What links here",
-    "whatlinkshere-title": "Pages that link to \"$1\"",
-    "whatlinkshere-summary": "",
-    "whatlinkshere-page": "Page:",
-    "linkshere": "The following pages link to <strong>[[:$1]]</strong>:",
-    "nolinkshere": "No pages link to <strong>[[:$1]]</strong>.",
-    "nolinkshere-ns": "No pages link to <strong>[[:$1]]</strong> in the chosen namespace.",
-    "isredirect": "redirect page",
-    "istemplate": "transclusion",
-    "isimage": "file link",
-    "whatlinkshere-prev": "{{PLURAL:$1|previous|previous $1}}",
-    "whatlinkshere-next": "{{PLURAL:$1|next|next $1}}",
-    "whatlinkshere-links": "← links",
-    "whatlinkshere-hideredirs": "$1 redirects",
-    "whatlinkshere-hidetrans": "$1 transclusions",
-    "whatlinkshere-hidelinks": "$1 links",
-    "whatlinkshere-hideimages": "$1 file links",
-    "whatlinkshere-filters": "Filters",
-    "autoblockid": "Autoblock #$1",
-    "block": "Block user",
-    "unblock": "Unblock user",
-    "unblock-summary": "",
-    "blockip": "Block user",
-    "blockip-legend": "Block user",
-    "blockiptext": "Use the form below to block write access from a specific IP address or username.\nThis should be done only to prevent vandalism, and in accordance with [[{{MediaWiki:Policy-url}}|policy]].\nFill in a specific reason below (for example, citing particular pages that were vandalized).",
-    "ipadressorusername": "IP address or username:",
-    "ipbexpiry": "Expiry:",
-    "ipbreason": "Reason:",
-    "ipbreason-dropdown": "*Common block reasons\n** Inserting false information\n** Removing content from pages\n** Spamming links to external sites\n** Inserting nonsense/gibberish into pages\n** Intimidating behavior/harassment\n** Abusing multiple accounts\n** Unacceptable username",
-    "ipb-hardblock": "Prevent logged-in users from editing from this IP address",
-    "ipbcreateaccount": "Prevent account creation",
-    "ipbemailban": "Prevent user from sending email",
-    "ipbenableautoblock": "Automatically block the last IP address used by this user, and any subsequent IP addresses they try to edit from",
-    "ipbsubmit": "Block this user",
-    "ipbother": "Other time:",
-    "ipboptions": "2 hours:2 hours,1 day:1 day,3 days:3 days,1 week:1 week,2 weeks:2 weeks,1 month:1 month,3 months:3 months,6 months:6 months,1 year:1 year,indefinite:infinite",
-    "ipbhidename": "Hide username from edits and lists",
-    "ipbwatchuser": "Watch this user's user and talk pages",
-    "ipb-disableusertalk": "Prevent this user from editing their own talk page while blocked",
-    "ipb-change-block": "Re-block the user with these settings",
-    "ipb-confirm": "Confirm block",
-    "badipaddress": "Invalid IP address",
-    "blockipsuccesssub": "Block succeeded",
-    "blockipsuccesstext": "[[Special:Contributions/$1|$1]] has been blocked.<br />\nSee the [[Special:BlockList|block list]] to review blocks.",
-    "ipb-blockingself": "You are about to block yourself! Are you sure you want to do that?",
-    "ipb-confirmhideuser": "You are about to block a user with \"hide user\" enabled. This will suppress the user's name in all lists and log entries. Are you sure you want to do that?",
-    "ipb-confirmaction": "If you are sure you really want to do it, please check the \"{{int:ipb-confirm}}\" field at the bottom.",
-    "ipb-edit-dropdown": "Edit block reasons",
-    "ipb-unblock-addr": "Unblock $1",
-    "ipb-unblock": "Unblock a username or IP address",
-    "ipb-blocklist": "View existing blocks",
-    "ipb-blocklist-contribs": "Contributions for $1",
-    "unblockip": "Unblock user",
-    "unblockiptext": "Use the form below to restore write access to a previously blocked IP address or username.",
-    "ipusubmit": "Remove this block",
-    "unblocked": "[[User:$1|$1]] has been unblocked.",
-    "unblocked-range": "$1 has been unblocked.",
-    "unblocked-id": "Block $1 has been removed.",
-    "blocklist": "Blocked users",
-    "ipblocklist": "Blocked users",
-    "ipblocklist-legend": "Find a blocked user",
-    "blocklist-userblocks": "Hide account blocks",
-    "blocklist-tempblocks": "Hide temporary blocks",
-    "blocklist-addressblocks": "Hide single IP blocks",
-    "blocklist-rangeblocks": "Hide range blocks",
-    "blocklist-timestamp": "Timestamp",
-    "blocklist-target": "Target",
-    "blocklist-expiry": "Expires",
-    "blocklist-by": "Blocking admin",
-    "blocklist-params": "Block parameters",
-    "blocklist-reason": "Reason",
-    "blocklist-summary": "",
-    "ipblocklist-submit": "Search",
-    "ipblocklist-localblock": "Local block",
-    "ipblocklist-otherblocks": "Other {{PLURAL:$1|block|blocks}}",
-    "infiniteblock": "infinite",
-    "expiringblock": "expires on $1 at $2",
-    "anononlyblock": "anon. only",
-    "noautoblockblock": "autoblock disabled",
-    "createaccountblock": "account creation disabled",
-    "emailblock": "email disabled",
-    "blocklist-nousertalk": "cannot edit own talk page",
-    "ipblocklist-empty": "The block list is empty.",
-    "ipblocklist-no-results": "The requested IP address or username is not blocked.",
-    "blocklink": "block",
-    "unblocklink": "unblock",
-    "change-blocklink": "change block",
-    "contribslink": "contribs",
-    "emaillink": "send email",
-    "autoblocker": "Autoblocked because your IP address has been recently used by \"[[User:$1|$1]]\".\nThe reason given for $1's block is \"$2\"",
-    "blocklogpage": "Block log",
-    "blocklog-showlog": "This user has been blocked previously.\nThe block log is provided below for reference:",
-    "blocklog-showsuppresslog": "This user has been blocked and hidden previously.\nThe suppress log is provided below for reference:",
-    "blocklogentry": "blocked [[$1]] with an expiry time of $2 $3",
-    "reblock-logentry": "changed block settings for [[$1]] with an expiry time of $2 $3",
-    "blocklogtext": "This is a log of user blocking and unblocking actions.\nAutomatically blocked IP addresses are not listed.\nSee the [[Special:BlockList|block list]] for the list of currently operational bans and blocks.",
-    "unblocklogentry": "unblocked $1",
-    "block-log-flags-anononly": "anonymous users only",
-    "block-log-flags-nocreate": "account creation disabled",
-    "block-log-flags-noautoblock": "autoblock disabled",
-    "block-log-flags-noemail": "email disabled",
-    "block-log-flags-nousertalk": "cannot edit own talk page",
-    "block-log-flags-angry-autoblock": "enhanced autoblock enabled",
-    "block-log-flags-hiddenname": "username hidden",
-    "range_block_disabled": "The administrator ability to create range blocks is disabled.",
-    "ipb_expiry_invalid": "Expiry time invalid.",
-    "ipb_expiry_temp": "Hidden username blocks must be permanent.",
-    "ipb_hide_invalid": "Unable to suppress this account; it has more than {{PLURAL:$1|one edit|$1 edits}}.",
-    "ipb_already_blocked": "\"$1\" is already blocked.",
-    "ipb-needreblock": "$1 is already blocked. Do you want to change the settings?",
-    "ipb-otherblocks-header": "Other {{PLURAL:$1|block|blocks}}",
-    "unblock-hideuser": "You cannot unblock this user, as their username has been hidden.",
-    "ipb_cant_unblock": "Error: Block ID $1 not found. It may have been unblocked already.",
-    "ipb_blocked_as_range": "Error: The IP address $1 is not blocked directly and cannot be unblocked.\nIt is, however, blocked as part of the range $2, which can be unblocked.",
-    "ip_range_invalid": "Invalid IP range.",
-    "ip_range_toolarge": "Range blocks larger than /$1 are not allowed.",
-    "proxyblocker": "Proxy blocker",
-    "proxyblockreason": "Your IP address has been blocked because it is an open proxy.\nPlease contact your Internet service provider or technical support of your organization and inform them of this serious security problem.",
-    "sorbs": "DNSBL",
-    "sorbsreason": "Your IP address is listed as an open proxy in the DNSBL used by {{SITENAME}}.",
-    "sorbs_create_account_reason": "Your IP address is listed as an open proxy in the DNSBL used by {{SITENAME}}.\nYou cannot create an account.",
-    "xffblockreason": "An IP address present in the X-Forwarded-For header, either yours or that of a proxy server you are using, has been blocked. The original block reason was: $1",
-    "cant-see-hidden-user": "The user you are trying to block has already been blocked and hidden.\nSince you do not have the hideuser right, you cannot see or edit the user's block.",
-    "ipbblocked": "You cannot block or unblock other users because you are yourself blocked.",
-    "ipbnounblockself": "You are not allowed to unblock yourself.",
-    "ipb-default-expiry": "",
-    "lockdb": "Lock database",
-    "unlockdb": "Unlock database",
-    "lockdbtext": "Locking the database will suspend the ability of all users to edit pages, change their preferences, edit their watchlists, and other things requiring changes in the database.\nPlease confirm that this is what you intend to do, and that you will unlock the database when your maintenance is done.",
-    "unlockdbtext": "Unlocking the database will restore the ability of all users to edit pages, change their preferences, edit their watchlists, and other things requiring changes in the database.\nPlease confirm that this is what you intend to do.",
-    "lockconfirm": "Yes, I really want to lock the database.",
-    "unlockconfirm": "Yes, I really want to unlock the database.",
-    "lockbtn": "Lock database",
-    "unlockbtn": "Unlock database",
-    "locknoconfirm": "You did not check the confirmation box.",
-    "lockdbsuccesssub": "Database lock succeeded",
-    "unlockdbsuccesssub": "Database lock removed",
-    "lockdbsuccesstext": "The database has been locked.<br />\nRemember to [[Special:UnlockDB|remove the lock]] after your maintenance is complete.",
-    "unlockdbsuccesstext": "The database has been unlocked.",
-    "lockfilenotwritable": "The database lock file is not writable.\nTo lock or unlock the database, this needs to be writable by the web server.",
-    "databasenotlocked": "The database is not locked.",
-    "lockedbyandtime": "(by {{GENDER:$1|$1}} on $2 at $3)",
-    "move-page": "Move $1",
-    "movepage-summary": "",
-    "move-page-legend": "Move page",
-    "movepagetext": "Using the form below will rename a page, moving all of its history to the new name.\nThe old title will become a redirect page to the new title.\nYou can update redirects that point to the original title automatically.\nIf you choose not to, be sure to check for [[Special:DoubleRedirects|double]] or [[Special:BrokenRedirects|broken redirects]].\nYou are responsible for making sure that links continue to point where they are supposed to go.\n\nNote that the page will <strong>not</strong> be moved if there is already a page at the new title, unless the latter is a redirect and has no past edit history.\nThis means that you can rename a page back to where it was renamed from if you make a mistake, and you cannot overwrite an existing page.\n\n<strong>Warning!</strong>\nThis can be a drastic and unexpected change for a popular page;\nplease be sure you understand the consequences of this before proceeding.",
-    "movepagetext-noredirectfixer": "Using the form below will rename a page, moving all of its history to the new name.\nThe old title will become a redirect page to the new title.\nBe sure to check for [[Special:DoubleRedirects|double]] or [[Special:BrokenRedirects|broken redirects]].\nYou are responsible for making sure that links continue to point where they are supposed to go.\n\nNote that the page will <strong>not</strong> be moved if there is already a page at the new title, unless it is a redirect and has no past edit history.\nThis means that you can rename a page back to where it was renamed from if you make a mistake, and you cannot overwrite an existing page.\n\n<strong>Warning!</strong>\nThis can be a drastic and unexpected change for a popular page;\nplease be sure you understand the consequences of this before proceeding.",
-    "movepagetalktext": "The associated talk page will be automatically moved along with it <strong>unless:</strong>\n*A non-empty talk page already exists under the new name, or\n*You uncheck the box below.\n\nIn those cases, you will have to move or merge the page manually if desired.",
-    "movearticle": "Move page:",
-    "moveuserpage-warning": "<strong>Warning:</strong> You are about to move a user page. Please note that only the page will be moved and the user will <em>not</em> be renamed.",
-    "movenologintext": "You must be a registered user and [[Special:UserLogin|logged in]] to move a page.",
-    "movenotallowed": "You do not have permission to move pages.",
-    "movenotallowedfile": "You do not have permission to move files.",
-    "cant-move-user-page": "You do not have permission to move user pages (apart from subpages).",
-    "cant-move-to-user-page": "You do not have permission to move a page to a user page (except to a user subpage).",
-    "newtitle": "To new title:",
-    "move-watch": "Watch source page and target page",
-    "movepagebtn": "Move page",
-    "pagemovedsub": "Move succeeded",
-    "movepage-moved": "<strong>\"$1\" has been moved to \"$2\"</strong>",
-    "movepage-moved-redirect": "A redirect has been created.",
-    "movepage-moved-noredirect": "The creation of a redirect has been suppressed.",
-    "articleexists": "A page of that name already exists, or the name you have chosen is not valid.\nPlease choose another name.",
-    "cantmove-titleprotected": "You cannot move a page to this location because the new title has been protected from creation",
-    "movetalk": "Move associated talk page",
-    "move-subpages": "Move subpages (up to $1)",
-    "move-talk-subpages": "Move subpages of talk page (up to $1)",
-    "movepage-page-exists": "The page $1 already exists and cannot be automatically overwritten.",
-    "movepage-page-moved": "The page $1 has been moved to $2.",
-    "movepage-page-unmoved": "The page $1 could not be moved to $2.",
-    "movepage-max-pages": "The maximum of $1 {{PLURAL:$1|page|pages}} has been moved and no more will be moved automatically.",
-    "movelogpage": "Move log",
-    "movelogpagetext": "Below is a list of all page moves.",
-    "movesubpage": "{{PLURAL:$1|Subpage|Subpages}}",
-    "movesubpagetext": "This page has $1 {{PLURAL:$1|subpage|subpages}} shown below.",
-    "movenosubpage": "This page has no subpages.",
-    "movereason": "Reason:",
-    "move-redirect-text": "",
-    "revertmove": "revert",
-    "delete_and_move": "Delete and move",
-    "delete_and_move_text": "== Deletion required ==\nThe destination page \"[[:$1]]\" already exists.\nDo you want to delete it to make way for the move?",
-    "delete_and_move_confirm": "Yes, delete the page",
-    "delete_and_move_reason": "Deleted to make way for move from \"[[$1]]\"",
-    "selfmove": "Source and destination titles are the same;\ncannot move a page over itself.",
-    "immobile-source-namespace": "Cannot move pages in namespace \"$1\"",
-    "immobile-target-namespace": "Cannot move pages into namespace \"$1\"",
-    "immobile-target-namespace-iw": "Interwiki link is not a valid target for page move.",
-    "immobile-source-page": "This page is not movable.",
-    "immobile-target-page": "Cannot move to that destination title.",
-    "bad-target-model": "The desired destination uses a different content model. Can not convert from $1 to $2.",
-    "imagenocrossnamespace": "Cannot move file to non-file namespace",
-    "nonfile-cannot-move-to-file": "Cannot move non-file to file namespace",
-    "imagetypemismatch": "The new file extension does not match its type",
-    "imageinvalidfilename": "The target filename is invalid",
-    "fix-double-redirects": "Update any redirects that point to the original title",
-    "move-leave-redirect": "Leave a redirect behind",
-    "protectedpagemovewarning": "<strong>Warning:</strong> This page has been protected so that only users with administrator privileges can move it.\nThe latest log entry is provided below for reference:",
-    "semiprotectedpagemovewarning": "<strong>Note:</strong> This page has been protected so that only registered users can move it.\nThe latest log entry is provided below for reference:",
-    "move-over-sharedrepo": "== File exists ==\n[[:$1]] exists on a shared repository. Moving a file to this title will override the shared file.",
-    "file-exists-sharedrepo": "The filename chosen is already in use on a shared repository.\nPlease choose another name.",
-    "export": "Export pages",
-    "export-summary": "",
-    "exporttext": "You can export the text and editing history of a particular page or set of pages wrapped in some XML.\nThis can be imported into another wiki using MediaWiki via the [[Special:Import|import page]].\n\nTo export pages, enter the titles in the text box below, one title per line, and select whether you want the current revision as well as all old revisions, with the page history lines, or the current revision with the info about the last edit.\n\nIn the latter case you can also use a link, for example [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] for the page \"[[{{MediaWiki:Mainpage}}]]\".",
-    "exportall": "Export all pages",
-    "exportcuronly": "Include only the current revision, not the full history",
-    "exportnohistory": "----\n<strong>Note:</strong> Exporting the full history of pages through this form has been disabled due to performance reasons.",
-    "exportlistauthors": "Include a full list of contributors for each page",
-    "export-submit": "Export",
-    "export-addcattext": "Add pages from category:",
-    "export-addcat": "Add",
-    "export-addnstext": "Add pages from namespace:",
-    "export-addns": "Add",
-    "export-download": "Save as file",
-    "export-templates": "Include templates",
-    "export-pagelinks": "Include linked pages to a depth of:",
-    "allmessages": "System messages",
-    "allmessagesname": "Name",
-    "allmessagesdefault": "Default message text",
-    "allmessagescurrent": "Current message text",
-    "allmessagestext": "This is a list of system messages available in the MediaWiki namespace.\nPlease visit [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] and [//translatewiki.net translatewiki.net] if you wish to contribute to the generic MediaWiki localisation.",
-    "allmessagesnotsupportedDB": "This page cannot be used because <strong>$wgUseDatabaseMessages</strong> has been disabled.",
-    "allmessages-filter-legend": "Filter",
-    "allmessages-filter": "Filter by customization state:",
-    "allmessages-filter-unmodified": "Unmodified",
-    "allmessages-filter-all": "All",
-    "allmessages-filter-modified": "Modified",
-    "allmessages-prefix": "Filter by prefix:",
-    "allmessages-language": "Language:",
-    "allmessages-filter-submit": "Go",
-    "allmessages-filter-translate": "Translate",
-    "thumbnail-more": "Enlarge",
-    "filemissing": "File missing",
-    "thumbnail_error": "Error creating thumbnail: $1",
-    "thumbnail_error_remote": "Error message from $1:\n$2",
-    "djvu_page_error": "DjVu page out of range",
-    "djvu_no_xml": "Unable to fetch XML for DjVu file",
-    "thumbnail-temp-create": "Unable to create temporary thumbnail file",
-    "thumbnail-dest-create": "Unable to save thumbnail to destination",
-    "thumbnail_invalid_params": "Invalid thumbnail parameters",
-    "thumbnail_dest_directory": "Unable to create destination directory",
-    "thumbnail_image-type": "Image type not supported",
-    "thumbnail_gd-library": "Incomplete GD library configuration: Missing function $1",
-    "thumbnail_image-missing": "File seems to be missing: $1",
-    "thumbnail_image-failure-limit": "There have been too many recent failed attempts ($1 or more) to render this thumbnail. Please try again later.",
-    "import": "Import pages",
-    "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-history": "Copy all history revisions for this page",
-    "import-interwiki-templates": "Include all templates",
-    "import-interwiki-submit": "Import",
-    "import-interwiki-namespace": "Destination namespace:",
-    "import-interwiki-rootpage": "Destination root page (optional):",
-    "import-upload-filename": "Filename:",
-    "import-comment": "Comment:",
-    "importtext": "Please export the file from the source wiki using the [[Special:Export|export utility]].\nSave it to your computer and upload it here.",
-    "importstart": "Importing pages...",
-    "import-revision-count": "$1 {{PLURAL:$1|revision|revisions}}",
-    "importnopages": "No pages to import.",
-    "imported-log-entries": "Imported $1 {{PLURAL:$1|log entry|log entries}}.",
-    "importfailed": "Import failed: <nowiki>$1</nowiki>",
-    "importunknownsource": "Unknown import source type",
-    "importcantopen": "Could not open import file",
-    "importbadinterwiki": "Bad interwiki link",
-    "importsuccess": "Import finished!",
-    "importnosources": "No transwiki import sources have been defined and direct history uploads are disabled.",
-    "importnofile": "No import file was uploaded.",
-    "importuploaderrorsize": "Upload of import file failed.\nThe file is bigger than the allowed upload size.",
-    "importuploaderrorpartial": "Upload of import file failed.\nThe file was only partially uploaded.",
-    "importuploaderrortemp": "Upload of import file failed.\nA temporary folder is missing.",
-    "import-parse-failure": "XML import parse failure",
-    "import-noarticle": "No page to import!",
-    "import-nonewrevisions": "No revisions imported (all were either already present, or skipped due to errors).",
-    "xml-error-string": "$1 at line $2, col $3 (byte $4): $5",
-    "import-upload": "Upload XML data",
-    "import-token-mismatch": "Loss of session data.\nPlease try again.",
-    "import-invalid-interwiki": "Cannot import from the specified wiki.",
-    "import-error-edit": "Page \"$1\" is not imported because you are not allowed to edit it.",
-    "import-error-create": "Page \"$1\" is not imported because you are not allowed to create it.",
-    "import-error-interwiki": "Page \"$1\" is not imported because its name is reserved for external linking (interwiki).",
-    "import-error-special": "Page \"$1\" is not imported because it belongs to a special namespace that does not allow pages.",
-    "import-error-invalid": "Page \"$1\" is not imported because its name is invalid.",
-    "import-error-unserialize": "Revision $2 of page \"$1\" could not be unserialized. The revision was reported to use content model $3 serialized as $4.",
-    "import-error-bad-location": "Revision $2 using content model $3 can not be stored on \"$1\" on this wiki, since that model is not supported on that page.",
-    "import-options-wrong": "Wrong {{PLURAL:$2|option|options}}: <nowiki>$1</nowiki>",
-    "import-rootpage-invalid": "Given root page is an invalid title.",
-    "import-rootpage-nosubpage": "Namespace \"$1\" of the root page does not allow subpages.",
-    "importlogpage": "Import log",
-    "importlogpagetext": "Administrative imports of pages with edit history from other wikis.",
-    "import-logentry-upload": "imported [[$1]] by file upload",
-    "import-logentry-upload-detail": "$1 {{PLURAL:$1|revision|revisions}}",
-    "import-logentry-interwiki": "transwikied $1",
-    "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|revision|revisions}} from $2",
-    "javascripttest": "JavaScript testing",
-    "javascripttest-backlink": "< $1",
-    "javascripttest-title": "Running $1 tests",
-    "javascripttest-pagetext-noframework": "This page is reserved for running JavaScript tests.",
-    "javascripttest-pagetext-unknownframework": "Unknown testing framework \"$1\".",
-    "javascripttest-pagetext-frameworks": "Please choose one of the following testing frameworks: $1",
-    "javascripttest-pagetext-skins": "Choose a skin to run the tests with:",
-    "javascripttest-qunit-name": "QUnit",
-    "javascripttest-qunit-intro": "See [$1 testing documentation] on mediawiki.org.",
-    "javascripttest-qunit-heading": "MediaWiki JavaScript QUnit test suite",
-    "accesskey-pt-userpage": ".",
-    "accesskey-pt-anonuserpage": ".",
-    "accesskey-pt-mytalk": "n",
-    "accesskey-pt-anontalk": "n",
-    "accesskey-pt-preferences": "",
-    "accesskey-pt-watchlist": "l",
-    "accesskey-pt-mycontris": "y",
-    "accesskey-pt-login": "o",
-    "accesskey-pt-logout": "",
-    "accesskey-ca-talk": "t",
-    "accesskey-ca-edit": "e",
-    "accesskey-ca-addsection": "+",
-    "accesskey-ca-viewsource": "e",
-    "accesskey-ca-history": "h",
-    "accesskey-ca-protect": "=",
-    "accesskey-ca-unprotect": "=",
-    "accesskey-ca-delete": "d",
-    "accesskey-ca-undelete": "d",
-    "accesskey-ca-move": "m",
-    "accesskey-ca-watch": "w",
-    "accesskey-ca-unwatch": "w",
-    "accesskey-search": "f",
-    "accesskey-search-go": "",
-    "accesskey-search-fulltext": "",
-    "accesskey-p-logo": "",
-    "accesskey-n-mainpage": "z",
-    "accesskey-n-mainpage-description": "z",
-    "accesskey-n-portal": "",
-    "accesskey-n-currentevents": "",
-    "accesskey-n-recentchanges": "r",
-    "accesskey-n-randompage": "x",
-    "accesskey-n-help": "",
-    "accesskey-t-whatlinkshere": "j",
-    "accesskey-t-recentchangeslinked": "k",
-    "accesskey-feed-rss": "",
-    "accesskey-feed-atom": "",
-    "accesskey-t-contributions": "",
-    "accesskey-t-emailuser": "",
-    "accesskey-t-permalink": "",
-    "accesskey-t-print": "p",
-    "accesskey-t-upload": "u",
-    "accesskey-t-specialpages": "q",
-    "accesskey-ca-nstab-main": "c",
-    "accesskey-ca-nstab-user": "c",
-    "accesskey-ca-nstab-media": "c",
-    "accesskey-ca-nstab-special": "",
-    "accesskey-ca-nstab-project": "a",
-    "accesskey-ca-nstab-image": "c",
-    "accesskey-ca-nstab-mediawiki": "c",
-    "accesskey-ca-nstab-template": "c",
-    "accesskey-ca-nstab-help": "c",
-    "accesskey-ca-nstab-category": "c",
-    "accesskey-minoredit": "i",
-    "accesskey-save": "s",
-    "accesskey-preview": "p",
-    "accesskey-diff": "v",
-    "accesskey-compareselectedversions": "v",
-    "accesskey-watch": "w",
-    "accesskey-upload": "s",
-    "accesskey-preferences-save": "s",
-    "accesskey-summary": "b",
-    "accesskey-userrights-set": "s",
-    "accesskey-blockip-block": "s",
-    "accesskey-export": "s",
-    "accesskey-import": "s",
-    "accesskey-watchlistedit-normal-submit": "s",
-    "accesskey-watchlistedit-raw-submit": "s",
-    "tooltip-pt-userpage": "Your user page",
-    "tooltip-pt-anonuserpage": "The user page for the IP address you are editing as",
-    "tooltip-pt-mytalk": "Your talk page",
-    "tooltip-pt-anontalk": "Discussion about edits from this IP address",
-    "tooltip-pt-preferences": "Your preferences",
-    "tooltip-pt-watchlist": "A list of pages you are monitoring for changes",
-    "tooltip-pt-mycontris": "A list of your contributions",
-    "tooltip-pt-login": "You are encouraged to log in; however, it is not mandatory",
-    "tooltip-pt-logout": "Log out",
-    "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",
-    "tooltip-ca-viewsource": "This page is protected.\nYou can view its source",
-    "tooltip-ca-history": "Past revisions of this page",
-    "tooltip-ca-protect": "Protect this page",
-    "tooltip-ca-unprotect": "Change protection of this page",
-    "tooltip-ca-delete": "Delete this page",
-    "tooltip-ca-undelete": "Restore the edits done to this page before it was deleted",
-    "tooltip-ca-move": "Move this page",
-    "tooltip-ca-watch": "Add this page to your watchlist",
-    "tooltip-ca-unwatch": "Remove this page from your watchlist",
-    "tooltip-search": "Search {{SITENAME}}",
-    "tooltip-search-go": "Go to a page with this exact name if exists",
-    "tooltip-search-fulltext": "Search the pages for this text",
-    "tooltip-p-logo": "Visit the main page",
-    "tooltip-n-mainpage": "Visit the main page",
-    "tooltip-n-mainpage-description": "Visit the main page",
-    "tooltip-n-portal": "About the project, what you can do, where to find things",
-    "tooltip-n-currentevents": "Find background information on current events",
-    "tooltip-n-recentchanges": "A list of recent changes in the wiki",
-    "tooltip-n-randompage": "Load a random page",
-    "tooltip-n-help": "The place to find out",
-    "tooltip-t-whatlinkshere": "A list of all wiki pages that link here",
-    "tooltip-t-recentchangeslinked": "Recent changes in pages linked from this page",
-    "tooltip-feed-rss": "RSS feed for this page",
-    "tooltip-feed-atom": "Atom feed for this page",
-    "tooltip-t-contributions": "A list of contributions of this user",
-    "tooltip-t-emailuser": "Send an email to this user",
-    "tooltip-t-upload": "Upload files",
-    "tooltip-t-specialpages": "A list of all special pages",
-    "tooltip-t-print": "Printable version of this page",
-    "tooltip-t-permalink": "Permanent link to this revision of the page",
-    "tooltip-ca-nstab-main": "View the content page",
-    "tooltip-ca-nstab-user": "View the user page",
-    "tooltip-ca-nstab-media": "View the media page",
-    "tooltip-ca-nstab-special": "This is a special page, you cannot edit the page itself",
-    "tooltip-ca-nstab-project": "View the project page",
-    "tooltip-ca-nstab-image": "View the file page",
-    "tooltip-ca-nstab-mediawiki": "View the system message",
-    "tooltip-ca-nstab-template": "View the template",
-    "tooltip-ca-nstab-help": "View the help page",
-    "tooltip-ca-nstab-category": "View the category page",
-    "tooltip-minoredit": "Mark this as a minor edit",
-    "tooltip-save": "Save your changes",
-    "tooltip-preview": "Preview your changes, please use this before saving!",
-    "tooltip-diff": "Show which changes you made to the text",
-    "tooltip-compareselectedversions": "See the differences between the two selected revisions of this page",
-    "tooltip-watch": "Add this page to your watchlist",
-    "tooltip-watchlistedit-normal-submit": "Remove titles",
-    "tooltip-watchlistedit-raw-submit": "Update watchlist",
-    "tooltip-recreate": "Recreate the page even though it has been deleted",
-    "tooltip-upload": "Start upload",
-    "tooltip-rollback": "\"Rollback\" reverts edit(s) to this page of the last contributor in one click",
-    "tooltip-undo": "\"Undo\" reverts this edit and opens the edit form in preview mode. It allows adding a reason in the summary.",
-    "tooltip-preferences-save": "Save preferences",
-    "tooltip-summary": "Enter a short summary",
-    "interlanguage-link-title": "$1 – $2",
-    "interlanguage-link-title-langonly": "$1",
-    "common.css": "/* CSS placed here will be applied to all skins */",
-    "cologneblue.css": "/* CSS placed here will affect users of the Cologne Blue skin */",
-    "monobook.css": "/* CSS placed here will affect users of the MonoBook skin */",
-    "modern.css": "/* CSS placed here will affect users of the Modern skin */",
-    "vector.css": "/* CSS placed here will affect users of the Vector skin */",
-    "print.css": "/* CSS placed here will affect the print output */",
-    "noscript.css": "/* CSS placed here will affect users with JavaScript disabled */",
-    "group-autoconfirmed.css": "/* CSS placed here will affect autoconfirmed users only */",
-    "group-user.css": "/* CSS placed here will affect registered users only */",
-    "group-bot.css": "/* CSS placed here will affect bots only */",
-    "group-sysop.css": "/* CSS placed here will affect sysops only */",
-    "group-bureaucrat.css": "/* CSS placed here will affect bureaucrats only */",
-    "common.js": "/* Any JavaScript here will be loaded for all users on every page load. */",
-    "cologneblue.js": "/* Any JavaScript here will be loaded for users using the Cologne Blue skin */",
-    "monobook.js": "/* Any JavaScript here will be loaded for users using the MonoBook skin */",
-    "modern.js": "/* Any JavaScript here will be loaded for users using the Modern skin */",
-    "vector.js": "/* Any JavaScript here will be loaded for users using the Vector skin */",
-    "group-autoconfirmed.js": "/* Any JavaScript here will be loaded for autoconfirmed users only */",
-    "group-user.js": "/* Any JavaScript here will be loaded for registered users only */",
-    "group-bot.js": "/* Any JavaScript here will be loaded for bots only */",
-    "group-sysop.js": "/* Any JavaScript here will be loaded for sysops only */",
-    "group-bureaucrat.js": "/* Any JavaScript here will be loaded for bureaucrats only */",
-    "notacceptable": "The wiki server cannot provide data in a format your client can read.",
-    "anonymous": "Anonymous {{PLURAL:$1|user|users}} of {{SITENAME}}",
-    "siteuser": "{{SITENAME}} user $1",
-    "anonuser": "{{SITENAME}} anonymous user $1",
-    "lastmodifiedatby": "This page was last modified $2, $1 by $3.",
-    "othercontribs": "Based on work by $1.",
-    "others": "others",
-    "siteusers": "{{SITENAME}} {{PLURAL:$2|user|users}} $1",
-    "anonusers": "{{SITENAME}} anonymous {{PLURAL:$2|user|users}} $1",
-    "creditspage": "Page credits",
-    "nocredits": "There is no credits info available for this page.",
-    "spamprotectiontitle": "Spam protection filter",
-    "spamprotectiontext": "The text you wanted to save was blocked by the spam filter.\nThis is probably caused by a link to a blacklisted external site.",
-    "spamprotectionmatch": "The following text is what triggered our spam filter: $1",
-    "spambot_username": "MediaWiki spam cleanup",
-    "spam_reverting": "Reverting to last revision not containing links to $1",
-    "spam_blanking": "All revisions contained links to $1, blanking",
-    "spam_deleting": "All revisions contained links to $1, deleting",
-    "simpleantispam-label": "Anti-spam check.\nDo <strong>NOT</strong> fill this in!",
-    "pageinfo-header": "-",
-    "pageinfo-title": "Information for \"$1\"",
-    "pageinfo-not-current": "Sorry, it's impossible to provide this information for old revisions.",
-    "pageinfo-header-basic": "Basic information",
-    "pageinfo-header-edits": "Edit history",
-    "pageinfo-header-restrictions": "Page protection",
-    "pageinfo-header-properties": "Page properties",
-    "pageinfo-display-title": "Display title",
-    "pageinfo-default-sort": "Default sort key",
-    "pageinfo-length": "Page length (in bytes)",
-    "pageinfo-article-id": "Page ID",
-    "pageinfo-language": "Page content language",
-    "pageinfo-content-model": "Page content model",
-    "pageinfo-robot-policy": "Indexing by robots",
-    "pageinfo-robot-index": "Allowed",
-    "pageinfo-robot-noindex": "Disallowed",
-    "pageinfo-views": "Number of views",
-    "pageinfo-watchers": "Number of page watchers",
-    "pageinfo-few-watchers": "Fewer than $1 {{PLURAL:$1|watcher|watchers}}",
-    "pageinfo-redirects-name": "Number of redirects to this page",
-    "pageinfo-redirects-value": "$1",
-    "pageinfo-subpages-name": "Number of subpages of this page",
-    "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|redirect|redirects}}; $3 {{PLURAL:$3|non-redirect|non-redirects}})",
-    "pageinfo-firstuser": "Page creator",
-    "pageinfo-firsttime": "Date of page creation",
-    "pageinfo-lastuser": "Latest editor",
-    "pageinfo-lasttime": "Date of latest edit",
-    "pageinfo-edits": "Total number of edits",
-    "pageinfo-authors": "Total number of distinct authors",
-    "pageinfo-recent-edits": "Recent number of edits (within past $1)",
-    "pageinfo-recent-authors": "Recent number of distinct authors",
-    "pageinfo-magic-words": "Magic {{PLURAL:$1|word|words}} ($1)",
-    "pageinfo-hidden-categories": "Hidden {{PLURAL:$1|category|categories}} ($1)",
-    "pageinfo-templates": "Transcluded {{PLURAL:$1|template|templates}} ($1)",
-    "pageinfo-transclusions": "{{PLURAL:$1|Page|Pages}} transcluded on ($1)",
-    "pageinfo-footer": "-",
-    "pageinfo-toolboxlink": "Page information",
-    "pageinfo-redirectsto": "Redirects to",
-    "pageinfo-redirectsto-info": "info",
-    "pageinfo-contentpage": "Counted as a content page",
-    "pageinfo-contentpage-yes": "Yes",
-    "pageinfo-protect-cascading": "Protections are cascading from here",
-    "pageinfo-protect-cascading-yes": "Yes",
-    "pageinfo-protect-cascading-from": "Protections are cascading from",
-    "pageinfo-category-info": "Category information",
-    "pageinfo-category-pages": "Number of pages",
-    "pageinfo-category-subcats": "Number of subcategories",
-    "pageinfo-category-files": "Number of files",
-    "skinname-cologneblue": "Cologne Blue",
-    "skinname-monobook": "MonoBook",
-    "skinname-modern": "Modern",
-    "skinname-vector": "Vector",
-    "markaspatrolleddiff": "Mark as patrolled",
-    "markaspatrolledlink": "[$1]",
-    "markaspatrolledtext": "Mark this page as patrolled",
-    "markedaspatrolled": "Marked as patrolled",
-    "markedaspatrolledtext": "The selected revision of [[:$1]] has been marked as patrolled.",
-    "rcpatroldisabled": "Recent changes patrol disabled",
-    "rcpatroldisabledtext": "The recent changes patrol feature is currently disabled.",
-    "markedaspatrollederror": "Cannot mark as patrolled",
-    "markedaspatrollederrortext": "You need to specify a revision to mark as patrolled.",
-    "markedaspatrollederror-noautopatrol": "You are not allowed to mark your own changes as patrolled.",
-    "markedaspatrollednotify": "This change to $1 has been marked as patrolled.",
-    "markedaspatrollederrornotify": "Marking as patrolled failed.",
-    "patrol-log-page": "Patrol log",
-    "patrol-log-header": "This is a log of patrolled revisions.",
-    "log-show-hide-patrol": "$1 patrol log",
-    "deletedrevision": "Deleted old revision $1",
-    "filedeleteerror-short": "Error deleting file: $1",
-    "filedeleteerror-long": "Errors were encountered while deleting the file:\n\n$1",
-    "filedelete-missing": "The file \"$1\" cannot be deleted because it does not exist.",
-    "filedelete-old-unregistered": "The specified file revision \"$1\" is not in the database.",
-    "filedelete-current-unregistered": "The specified file \"$1\" is not in the database.",
-    "filedelete-archive-read-only": "The archive directory \"$1\" is not writable by the webserver.",
-    "previousdiff": "← Older edit",
-    "nextdiff": "Newer edit →",
-    "mediawarning": "<strong>Warning:</strong> This file type may contain malicious code.\nBy executing it, your system may be compromised.",
-    "imagemaxsize": "Image size limit:<br /><em>(for file description pages)</em>",
-    "thumbsize": "Thumbnail size:",
-    "widthheight": "$1 × $2",
-    "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|page|pages}}",
-    "file-info": "file size: $1, MIME type: $2",
-    "file-info-size": "$1 × $2 pixels, file size: $3, MIME type: $4",
-    "file-info-size-pages": "$1 × $2 pixels, file size: $3, MIME type: $4, $5 {{PLURAL:$5|page|pages}}",
-    "file-nohires": "No higher resolution available.",
-    "svg-long-desc": "SVG file, nominally $1 × $2 pixels, file size: $3",
-    "svg-long-desc-animated": "Animated SVG file, nominally $1 × $2 pixels, file size: $3",
-    "svg-long-error": "Invalid SVG file: $1",
-    "show-big-image": "Original file",
-    "show-big-image-preview": "Size of this preview: $1.",
-    "show-big-image-other": "Other {{PLURAL:$2|resolution|resolutions}}: $1.",
-    "show-big-image-size": "$1 × $2 pixels",
-    "file-info-gif-looped": "looped",
-    "file-info-gif-frames": "$1 {{PLURAL:$1|frame|frames}}",
-    "file-info-png-looped": "looped",
-    "file-info-png-repeat": "played $1 {{PLURAL:$1|time|times}}",
-    "file-info-png-frames": "$1 {{PLURAL:$1|frame|frames}}",
-    "file-no-thumb-animation": "<strong>Note: Due to technical limitations, thumbnails of this file will not be animated.</strong>",
-    "file-no-thumb-animation-gif": "<strong>Note: Due to technical limitations, thumbnails of high resolution GIF images such as this one will not be animated.</strong>",
-    "newimages": "Gallery of new files",
-    "imagelisttext": "Below is a list of <strong>$1</strong> {{PLURAL:$1|file|files}} sorted $2.",
-    "newimages-summary": "This special page shows the last uploaded files.",
-    "newimages-legend": "Filter",
-    "newimages-label": "Filename (or a part of it):",
-    "showhidebots": "($1 bots)",
-    "noimages": "Nothing to see.",
-    "ilsubmit": "Search",
-    "bydate": "by date",
-    "sp-newimages-showfrom": "Show new files starting from $2, $1",
-    "video-dims": "$1, $2 × $3",
-    "seconds-abbrev": "$1 s",
-    "minutes-abbrev": "$1 min",
-    "hours-abbrev": "$1 h",
-    "days-abbrev": "$1 d",
-    "seconds": "{{PLURAL:$1|$1 second|$1 seconds}}",
-    "minutes": "{{PLURAL:$1|$1 minute|$1 minutes}}",
-    "hours": "{{PLURAL:$1|$1 hour|$1 hours}}",
-    "days": "{{PLURAL:$1|$1 day|$1 days}}",
-    "weeks": "{{PLURAL:$1|$1 week|$1 weeks}}",
-    "months": "{{PLURAL:$1|$1 month|$1 months}}",
-    "years": "{{PLURAL:$1|$1 year|$1 years}}",
-    "ago": "$1 ago",
-    "just-now": "just now",
-    "hours-ago": "$1 {{PLURAL:$1|hour|hours}} ago",
-    "minutes-ago": "$1 {{PLURAL:$1|minute|minutes}} ago",
-    "seconds-ago": "$1 {{PLURAL:$1|second|seconds}} ago",
-    "monday-at": "Monday at $1",
-    "tuesday-at": "Tuesday at $1",
-    "wednesday-at": "Wednesday at $1",
-    "thursday-at": "Thursday at $1",
-    "friday-at": "Friday at $1",
-    "saturday-at": "Saturday at $1",
-    "sunday-at": "Sunday at $1",
-    "today-at": "$1",
-    "yesterday-at": "Yesterday at $1",
-    "bad_image_list": "The format is as follows:\n\nOnly list items (lines starting with *) are considered.\nThe first link on a line must be a link to a bad file.\nAny subsequent links on the same line are considered to be exceptions, i.e. pages where the file may occur inline.",
-    "variantname-zh-hans": "hans",
-    "variantname-zh-hant": "hant",
-    "variantname-zh-cn": "cn",
-    "variantname-zh-tw": "tw",
-    "variantname-zh-hk": "hk",
-    "variantname-zh-mo": "mo",
-    "variantname-zh-sg": "sg",
-    "variantname-zh-my": "my",
-    "variantname-zh": "zh",
-    "variantname-gan-hans": "hans",
-    "variantname-gan-hant": "hant",
-    "variantname-gan": "gan",
-    "variantname-sr-ec": "sr-ec",
-    "variantname-sr-el": "sr-el",
-    "variantname-sr": "sr",
-    "variantname-kk-kz": "kk-kz",
-    "variantname-kk-tr": "kk-tr",
-    "variantname-kk-cn": "kk-cn",
-    "variantname-kk-cyrl": "kk-cyrl",
-    "variantname-kk-latn": "kk-latn",
-    "variantname-kk-arab": "kk-arab",
-    "variantname-kk": "kk",
-    "variantname-ku-arab": "ku-Arab",
-    "variantname-ku-latn": "ku-Latn",
-    "variantname-ku": "ku",
-    "variantname-tg-cyrl": "tg-Cyrl",
-    "variantname-tg-latn": "tg-Latn",
-    "variantname-tg": "tg",
-    "variantname-ike-cans": "ike-Cans",
-    "variantname-ike-latn": "ike-Latn",
-    "variantname-iu": "iu",
-    "variantname-shi-tfng": "shi-Tfng",
-    "variantname-shi-latn": "shi-Latn",
-    "variantname-shi": "shi",
-    "metadata": "Metadata",
-    "metadata-help": "This file contains additional information, probably added from the digital camera or scanner used to create or digitize it.\nIf the file has been modified from its original state, some details may not fully reflect the modified file.",
-    "metadata-expand": "Show extended details",
-    "metadata-collapse": "Hide extended details",
-    "metadata-fields": "Image metadata fields listed in this message will be included on image page display when the metadata table is collapsed.\nOthers will be hidden by 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",
-    "metadata-langitem": "<strong>$2:</strong> $1",
-    "metadata-langitem-default": "$1",
-    "exif-imagewidth": "Width",
-    "exif-imagelength": "Height",
-    "exif-bitspersample": "Bits per component",
-    "exif-compression": "Compression scheme",
-    "exif-photometricinterpretation": "Pixel composition",
-    "exif-orientation": "Orientation",
-    "exif-samplesperpixel": "Number of components",
-    "exif-planarconfiguration": "Data arrangement",
-    "exif-ycbcrsubsampling": "Subsampling ratio of Y to C",
-    "exif-ycbcrpositioning": "Y and C positioning",
-    "exif-xresolution": "Horizontal resolution",
-    "exif-yresolution": "Vertical resolution",
-    "exif-stripoffsets": "Image data location",
-    "exif-rowsperstrip": "Number of rows per strip",
-    "exif-stripbytecounts": "Bytes per compressed strip",
-    "exif-jpeginterchangeformat": "Offset to JPEG SOI",
-    "exif-jpeginterchangeformatlength": "Bytes of JPEG data",
-    "exif-whitepoint": "White point chromaticity",
-    "exif-primarychromaticities": "Chromaticities of primarities",
-    "exif-ycbcrcoefficients": "Color space transformation matrix coefficients",
-    "exif-referenceblackwhite": "Pair of black and white reference values",
-    "exif-datetime": "File change date and time",
-    "exif-imagedescription": "Image title",
-    "exif-make": "Camera manufacturer",
-    "exif-model": "Camera model",
-    "exif-software": "Software used",
-    "exif-artist": "Author",
-    "exif-copyright": "Copyright holder",
-    "exif-exifversion": "Exif version",
-    "exif-flashpixversion": "Supported Flashpix version",
-    "exif-colorspace": "Color space",
-    "exif-componentsconfiguration": "Meaning of each component",
-    "exif-compressedbitsperpixel": "Image compression mode",
-    "exif-pixelydimension": "Image width",
-    "exif-pixelxdimension": "Image height",
-    "exif-usercomment": "User comments",
-    "exif-relatedsoundfile": "Related audio file",
-    "exif-datetimeoriginal": "Date and time of data generation",
-    "exif-datetimedigitized": "Date and time of digitizing",
-    "exif-subsectime": "DateTime subseconds",
-    "exif-subsectimeoriginal": "DateTimeOriginal subseconds",
-    "exif-subsectimedigitized": "DateTimeDigitized subseconds",
-    "exif-exposuretime": "Exposure time",
-    "exif-exposuretime-format": "$1 sec ($2)",
-    "exif-fnumber": "F Number",
-    "exif-fnumber-format": "f/$1",
-    "exif-exposureprogram": "Exposure Program",
-    "exif-spectralsensitivity": "Spectral sensitivity",
-    "exif-isospeedratings": "ISO speed rating",
-    "exif-shutterspeedvalue": "APEX shutter speed",
-    "exif-aperturevalue": "APEX aperture",
-    "exif-brightnessvalue": "APEX brightness",
-    "exif-exposurebiasvalue": "APEX exposure bias",
-    "exif-maxaperturevalue": "Maximum land aperture",
-    "exif-subjectdistance": "Subject distance",
-    "exif-meteringmode": "Metering mode",
-    "exif-lightsource": "Light source",
-    "exif-flash": "Flash",
-    "exif-focallength": "Lens focal length",
-    "exif-focallength-format": "$1 mm",
-    "exif-subjectarea": "Subject area",
-    "exif-flashenergy": "Flash energy",
-    "exif-focalplanexresolution": "Focal plane X resolution",
-    "exif-focalplaneyresolution": "Focal plane Y resolution",
-    "exif-focalplaneresolutionunit": "Focal plane resolution unit",
-    "exif-subjectlocation": "Subject location",
-    "exif-exposureindex": "Exposure index",
-    "exif-sensingmethod": "Sensing method",
-    "exif-filesource": "File source",
-    "exif-scenetype": "Scene type",
-    "exif-customrendered": "Custom image processing",
-    "exif-exposuremode": "Exposure mode",
-    "exif-whitebalance": "White balance",
-    "exif-digitalzoomratio": "Digital zoom ratio",
-    "exif-focallengthin35mmfilm": "Focal length in 35 mm film",
-    "exif-scenecapturetype": "Scene capture type",
-    "exif-gaincontrol": "Scene control",
-    "exif-contrast": "Contrast",
-    "exif-saturation": "Saturation",
-    "exif-sharpness": "Sharpness",
-    "exif-devicesettingdescription": "Device settings description",
-    "exif-subjectdistancerange": "Subject distance range",
-    "exif-imageuniqueid": "Unique image ID",
-    "exif-gpsversionid": "GPS tag version",
-    "exif-gpslatituderef": "North or south latitude",
-    "exif-gpslatitude": "Latitude",
-    "exif-gpslongituderef": "East or west longitude",
-    "exif-gpslongitude": "Longitude",
-    "exif-gpsaltituderef": "Altitude reference",
-    "exif-gpsaltitude": "Altitude",
-    "exif-gpstimestamp": "GPS time (atomic clock)",
-    "exif-gpssatellites": "Satellites used for measurement",
-    "exif-gpsstatus": "Receiver status",
-    "exif-gpsmeasuremode": "Measurement mode",
-    "exif-gpsdop": "Measurement precision",
-    "exif-gpsspeedref": "Speed unit",
-    "exif-gpsspeed": "Speed of GPS receiver",
-    "exif-gpstrackref": "Reference for direction of movement",
-    "exif-gpstrack": "Direction of movement",
-    "exif-gpsimgdirectionref": "Reference for direction of image",
-    "exif-gpsimgdirection": "Direction of image",
-    "exif-gpsmapdatum": "Geodetic survey data used",
-    "exif-gpsdestlatituderef": "Reference for latitude of destination",
-    "exif-gpsdestlatitude": "Latitude destination",
-    "exif-gpsdestlongituderef": "Reference for longitude of destination",
-    "exif-gpsdestlongitude": "Longitude of destination",
-    "exif-gpsdestbearingref": "Reference for bearing of destination",
-    "exif-gpsdestbearing": "Bearing of destination",
-    "exif-gpsdestdistanceref": "Reference for distance to destination",
-    "exif-gpsdestdistance": "Distance to destination",
-    "exif-gpsprocessingmethod": "Name of GPS processing method",
-    "exif-gpsareainformation": "Name of GPS area",
-    "exif-gpsdatestamp": "GPS date",
-    "exif-gpsdifferential": "GPS differential correction",
-    "exif-coordinate-format": "$1° $2′ $3″ $4",
-    "exif-jpegfilecomment": "JPEG file comment",
-    "exif-keywords": "Keywords",
-    "exif-worldregioncreated": "World region that the picture was taken in",
-    "exif-countrycreated": "Country that the picture was taken in",
-    "exif-countrycodecreated": "Code for the country that the picture was taken in",
-    "exif-provinceorstatecreated": "Province or state that the picture was taken in",
-    "exif-citycreated": "City that the picture was taken in",
-    "exif-sublocationcreated": "Sublocation of the city that the picture was taken in",
-    "exif-worldregiondest": "World region shown",
-    "exif-countrydest": "Country shown",
-    "exif-countrycodedest": "Code for country shown",
-    "exif-provinceorstatedest": "Province or state shown",
-    "exif-citydest": "City shown",
-    "exif-sublocationdest": "Sublocation of city shown",
-    "exif-objectname": "Short title",
-    "exif-specialinstructions": "Special instructions",
-    "exif-headline": "Headline",
-    "exif-credit": "Credit/Provider",
-    "exif-source": "Source",
-    "exif-editstatus": "Editorial status of image",
-    "exif-urgency": "Urgency",
-    "exif-fixtureidentifier": "Fixture name",
-    "exif-locationdest": "Location depicted",
-    "exif-locationdestcode": "Code of location depicted",
-    "exif-objectcycle": "Time of day that media is intended for",
-    "exif-contact": "Contact information",
-    "exif-writer": "Writer",
-    "exif-languagecode": "Language",
-    "exif-iimversion": "IIM version",
-    "exif-iimcategory": "Category",
-    "exif-iimsupplementalcategory": "Supplemental categories",
-    "exif-datetimeexpires": "Do not use after",
-    "exif-datetimereleased": "Released on",
-    "exif-originaltransmissionref": "Original transmission location code",
-    "exif-identifier": "Identifier",
-    "exif-lens": "Lens used",
-    "exif-serialnumber": "Serial number of camera",
-    "exif-cameraownername": "Owner of camera",
-    "exif-label": "Label",
-    "exif-datetimemetadata": "Date metadata was last modified",
-    "exif-nickname": "Informal name of image",
-    "exif-rating": "Rating (out of 5)",
-    "exif-rightscertificate": "Rights management certificate",
-    "exif-copyrighted": "Copyright status",
-    "exif-copyrightowner": "Copyright owner",
-    "exif-usageterms": "Usage terms",
-    "exif-webstatement": "Online copyright statement",
-    "exif-originaldocumentid": "Unique ID of original document",
-    "exif-licenseurl": "URL for copyright license",
-    "exif-morepermissionsurl": "Alternative licensing information",
-    "exif-attributionurl": "When re-using this work, please link to",
-    "exif-preferredattributionname": "When re-using this work, please credit",
-    "exif-pngfilecomment": "PNG file comment",
-    "exif-disclaimer": "Disclaimer",
-    "exif-contentwarning": "Content warning",
-    "exif-giffilecomment": "GIF file comment",
-    "exif-intellectualgenre": "Type of item",
-    "exif-subjectnewscode": "Subject code",
-    "exif-scenecode": "IPTC scene code",
-    "exif-event": "Event depicted",
-    "exif-organisationinimage": "Organization depicted",
-    "exif-personinimage": "Person depicted",
-    "exif-originalimageheight": "Height of image before it was cropped",
-    "exif-originalimagewidth": "Width of image before it was cropped",
-    "exif-make-value": "$1",
-    "exif-model-value": "$1",
-    "exif-software-value": "$1",
-    "exif-software-version-value": "$1 (Version $2)",
-    "exif-contact-value": "$1\n\n$2\n<div class=\"adr\">\n$3\n\n$4, $5, $6 $7\n</div>\n$8",
-    "exif-subjectnewscode-value": "$2 ($1)",
-    "exif-compression-1": "Uncompressed",
-    "exif-compression-2": "CCITT Group 3 1-Dimensional Modified Huffman run length encoding",
-    "exif-compression-3": "CCITT Group 3 fax encoding",
-    "exif-compression-4": "CCITT Group 4 fax encoding",
-    "exif-compression-5": "LZW",
-    "exif-compression-6": "JPEG (old)",
-    "exif-compression-7": "JPEG",
-    "exif-compression-8": "Deflate (Adobe)",
-    "exif-compression-32773": "PackBits (Macintosh RLE)",
-    "exif-compression-32946": "Deflate (PKZIP)",
-    "exif-compression-34712": "JPEG2000",
-    "exif-copyrighted-true": "Copyrighted",
-    "exif-copyrighted-false": "Copyright status not set",
-    "exif-photometricinterpretation-2": "RGB",
-    "exif-photometricinterpretation-6": "YCbCr",
-    "exif-unknowndate": "Unknown date",
-    "exif-orientation-1": "Normal",
-    "exif-orientation-2": "Flipped horizontally",
-    "exif-orientation-3": "Rotated 180°",
-    "exif-orientation-4": "Flipped vertically",
-    "exif-orientation-5": "Rotated 90° CCW and flipped vertically",
-    "exif-orientation-6": "Rotated 90° CCW",
-    "exif-orientation-7": "Rotated 90° CW and flipped vertically",
-    "exif-orientation-8": "Rotated 90° CW",
-    "exif-planarconfiguration-1": "chunky format",
-    "exif-planarconfiguration-2": "planar format",
-    "exif-xyresolution-i": "$1 dpi",
-    "exif-xyresolution-c": "$1 dpc",
-    "exif-colorspace-1": "sRGB",
-    "exif-colorspace-65535": "Uncalibrated",
-    "exif-componentsconfiguration-0": "does not exist",
-    "exif-componentsconfiguration-1": "Y",
-    "exif-componentsconfiguration-2": "Cb",
-    "exif-componentsconfiguration-3": "Cr",
-    "exif-componentsconfiguration-4": "R",
-    "exif-componentsconfiguration-5": "G",
-    "exif-componentsconfiguration-6": "B",
-    "exif-exposureprogram-0": "Not defined",
-    "exif-exposureprogram-1": "Manual",
-    "exif-exposureprogram-2": "Normal program",
-    "exif-exposureprogram-3": "Aperture priority",
-    "exif-exposureprogram-4": "Shutter priority",
-    "exif-exposureprogram-5": "Creative program (biased toward depth of field)",
-    "exif-exposureprogram-6": "Action program (biased toward fast shutter speed)",
-    "exif-exposureprogram-7": "Portrait mode (for closeup photos with the background out of focus)",
-    "exif-exposureprogram-8": "Landscape mode (for landscape photos with the background in focus)",
-    "exif-subjectdistance-value": "$1 meters",
-    "exif-meteringmode-0": "Unknown",
-    "exif-meteringmode-1": "Average",
-    "exif-meteringmode-2": "Center weighted average",
-    "exif-meteringmode-3": "Spot",
-    "exif-meteringmode-4": "Multi-Spot",
-    "exif-meteringmode-5": "Pattern",
-    "exif-meteringmode-6": "Partial",
-    "exif-meteringmode-255": "Other",
-    "exif-lightsource-0": "Unknown",
-    "exif-lightsource-1": "Daylight",
-    "exif-lightsource-2": "Fluorescent",
-    "exif-lightsource-3": "Tungsten (incandescent light)",
-    "exif-lightsource-4": "Flash",
-    "exif-lightsource-9": "Fine weather",
-    "exif-lightsource-10": "Cloudy weather",
-    "exif-lightsource-11": "Shade",
-    "exif-lightsource-12": "Daylight fluorescent (D 5700 – 7100K)",
-    "exif-lightsource-13": "Day white fluorescent (N 4600 – 5400K)",
-    "exif-lightsource-14": "Cool white fluorescent (W 3900 – 4500K)",
-    "exif-lightsource-15": "White fluorescent (WW 3200 – 3700K)",
-    "exif-lightsource-17": "Standard light A",
-    "exif-lightsource-18": "Standard light B",
-    "exif-lightsource-19": "Standard light C",
-    "exif-lightsource-20": "D55",
-    "exif-lightsource-21": "D65",
-    "exif-lightsource-22": "D75",
-    "exif-lightsource-23": "D50",
-    "exif-lightsource-24": "ISO studio tungsten",
-    "exif-lightsource-255": "Other light source",
-    "exif-flash-fired-0": "Flash did not fire",
-    "exif-flash-fired-1": "Flash fired",
-    "exif-flash-return-0": "no strobe return detection function",
-    "exif-flash-return-2": "strobe return light not detected",
-    "exif-flash-return-3": "strobe return light detected",
-    "exif-flash-mode-1": "compulsory flash firing",
-    "exif-flash-mode-2": "compulsory flash suppression",
-    "exif-flash-mode-3": "auto mode",
-    "exif-flash-function-1": "No flash function",
-    "exif-flash-redeye-1": "red-eye reduction mode",
-    "exif-focalplaneresolutionunit-2": "inches",
-    "exif-sensingmethod-1": "Undefined",
-    "exif-sensingmethod-2": "One-chip color area sensor",
-    "exif-sensingmethod-3": "Two-chip color area sensor",
-    "exif-sensingmethod-4": "Three-chip color area sensor",
-    "exif-sensingmethod-5": "Color sequential area sensor",
-    "exif-sensingmethod-7": "Trilinear sensor",
-    "exif-sensingmethod-8": "Color sequential linear sensor",
-    "exif-filesource-3": "Digital still camera",
-    "exif-scenetype-1": "A directly photographed image",
-    "exif-customrendered-0": "Normal process",
-    "exif-customrendered-1": "Custom process",
-    "exif-exposuremode-0": "Auto exposure",
-    "exif-exposuremode-1": "Manual exposure",
-    "exif-exposuremode-2": "Auto bracket",
-    "exif-whitebalance-0": "Auto white balance",
-    "exif-whitebalance-1": "Manual white balance",
-    "exif-scenecapturetype-0": "Standard",
-    "exif-scenecapturetype-1": "Landscape",
-    "exif-scenecapturetype-2": "Portrait",
-    "exif-scenecapturetype-3": "Night scene",
-    "exif-gaincontrol-0": "None",
-    "exif-gaincontrol-1": "Low gain up",
-    "exif-gaincontrol-2": "High gain up",
-    "exif-gaincontrol-3": "Low gain down",
-    "exif-gaincontrol-4": "High gain down",
-    "exif-contrast-0": "Normal",
-    "exif-contrast-1": "Soft",
-    "exif-contrast-2": "Hard",
-    "exif-saturation-0": "Normal",
-    "exif-saturation-1": "Low saturation",
-    "exif-saturation-2": "High saturation",
-    "exif-sharpness-0": "Normal",
-    "exif-sharpness-1": "Soft",
-    "exif-sharpness-2": "Hard",
-    "exif-subjectdistancerange-0": "Unknown",
-    "exif-subjectdistancerange-1": "Macro",
-    "exif-subjectdistancerange-2": "Close view",
-    "exif-subjectdistancerange-3": "Distant view",
-    "exif-gpslatitude-n": "North latitude",
-    "exif-gpslatitude-s": "South latitude",
-    "exif-gpslongitude-e": "East longitude",
-    "exif-gpslongitude-w": "West longitude",
-    "exif-gpsaltitude-above-sealevel": "$1 {{PLURAL:$1|meter|meters}} above sea level",
-    "exif-gpsaltitude-below-sealevel": "$1 {{PLURAL:$1|meter|meters}} below sea level",
-    "exif-gpsstatus-a": "Measurement in progress",
-    "exif-gpsstatus-v": "Measurement interoperability",
-    "exif-gpsmeasuremode-2": "2-dimensional measurement",
-    "exif-gpsmeasuremode-3": "3-dimensional measurement",
-    "exif-gpsspeed-k": "Kilometers per hour",
-    "exif-gpsspeed-m": "Miles per hour",
-    "exif-gpsspeed-n": "Knots",
-    "exif-gpsdestdistance-k": "Kilometers",
-    "exif-gpsdestdistance-m": "Miles",
-    "exif-gpsdestdistance-n": "Nautical miles",
-    "exif-gpsdop-excellent": "Excellent ($1)",
-    "exif-gpsdop-good": "Good ($1)",
-    "exif-gpsdop-moderate": "Moderate ($1)",
-    "exif-gpsdop-fair": "Fair ($1)",
-    "exif-gpsdop-poor": "Poor ($1)",
-    "exif-objectcycle-a": "Morning only",
-    "exif-objectcycle-p": "Evening only",
-    "exif-objectcycle-b": "Both morning and evening",
-    "exif-gpsdirection-t": "True direction",
-    "exif-gpsdirection-m": "Magnetic direction",
-    "exif-ycbcrpositioning-1": "Centered",
-    "exif-ycbcrpositioning-2": "Co-sited",
-    "exif-dc-contributor": "Contributors",
-    "exif-dc-coverage": "Spatial or temporal scope of media",
-    "exif-dc-date": "Date(s)",
-    "exif-dc-publisher": "Publisher",
-    "exif-dc-relation": "Related media",
-    "exif-dc-rights": "Rights",
-    "exif-dc-source": "Source media",
-    "exif-dc-type": "Type of media",
-    "exif-rating-rejected": "Rejected",
-    "exif-isospeedratings-overflow": "Greater than 65535",
-    "exif-maxaperturevalue-value": "$1 APEX (f/$2)",
-    "exif-iimcategory-ace": "Arts, culture and entertainment",
-    "exif-iimcategory-clj": "Crime and law",
-    "exif-iimcategory-dis": "Disasters and accidents",
-    "exif-iimcategory-fin": "Economy and business",
-    "exif-iimcategory-edu": "Education",
-    "exif-iimcategory-evn": "Environment",
-    "exif-iimcategory-hth": "Health",
-    "exif-iimcategory-hum": "Human interest",
-    "exif-iimcategory-lab": "Labor",
-    "exif-iimcategory-lif": "Lifestyle and leisure",
-    "exif-iimcategory-pol": "Politics",
-    "exif-iimcategory-rel": "Religion and belief",
-    "exif-iimcategory-sci": "Science and technology",
-    "exif-iimcategory-soi": "Social issues",
-    "exif-iimcategory-spo": "Sports",
-    "exif-iimcategory-war": "War, conflict and unrest",
-    "exif-iimcategory-wea": "Weather",
-    "exif-urgency-normal": "Normal ($1)",
-    "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",
-    "confirmemail_noemail": "You do not have a valid email address set in your [[Special:Preferences|user preferences]].",
-    "confirmemail_text": "{{SITENAME}} requires that you validate your email address before using email features.\nActivate the button below to send a confirmation mail to your address.\nThe mail will include a link containing a code;\nload the link in your browser to confirm that your email address is valid.",
-    "confirmemail_pending": "A confirmation code has already been emailed to you;\nif you recently created your account, you may wish to wait a few minutes for it to arrive before trying to request a new code.",
-    "confirmemail_send": "Mail a confirmation code",
-    "confirmemail_sent": "Confirmation email sent.",
-    "confirmemail_oncreate": "A confirmation code was sent to your email address.\nThis code is not required to log in, but you will need to provide it before enabling any email-based features in the wiki.",
-    "confirmemail_sendfailed": "{{SITENAME}} could not send your confirmation mail.\nPlease check your email address for invalid characters.\n\nMailer returned: $1",
-    "confirmemail_invalid": "Invalid confirmation code.\nThe code may have expired.",
-    "confirmemail_needlogin": "Please $1 to confirm your email address.",
-    "confirmemail_success": "Your email address has been confirmed.\nYou may now [[Special:UserLogin|log in]] and enjoy the wiki.",
-    "confirmemail_loggedin": "Your email address has now been confirmed.",
-    "confirmemail_subject": "{{SITENAME}} email address confirmation",
-    "confirmemail_body": "Someone, probably you, from IP address $1,\nhas registered an account \"$2\" with this email address on {{SITENAME}}.\n\nTo confirm that this account really does belong to you and activate\nemail features on {{SITENAME}}, open this link in your browser:\n\n$3\n\nIf you did *not* register the account, follow this link\nto cancel the email address confirmation:\n\n$5\n\nThis confirmation code will expire at $4.",
-    "confirmemail_body_changed": "Someone, probably you, from IP address $1,\nhas changed the email address of the account \"$2\" to this address on {{SITENAME}}.\n\nTo confirm that this account really does belong to you and reactivate\nemail features on {{SITENAME}}, open this link in your browser:\n\n$3\n\nIf the account does *not* belong to you, follow this link\nto cancel the email address confirmation:\n\n$5\n\nThis confirmation code will expire at $4.",
-    "confirmemail_body_set": "Someone, probably you, from IP address $1,\nhas set the email address of the account \"$2\" to this address on {{SITENAME}}.\n\nTo confirm that this account really does belong to you and activate\nemail features on {{SITENAME}}, open this link in your browser:\n\n$3\n\nIf the account does *not* belong to you, follow this link\nto cancel the email address confirmation:\n\n$5\n\nThis confirmation code will expire at $4.",
-    "confirmemail_invalidated": "Email address confirmation canceled",
-    "invalidateemail": "Cancel email confirmation",
-    "scarytranscludedisabled": "[Interwiki transcluding is disabled]",
-    "scarytranscludefailed": "[Template fetch failed for $1]",
-    "scarytranscludefailed-httpstatus": "[Template fetch failed for $1: HTTP $2]",
-    "scarytranscludetoolong": "[URL is too long]",
-    "deletedwhileediting": "<strong>Warning:</strong> This page was deleted after you started editing!",
-    "confirmrecreate": "User [[User:$1|$1]] ([[User talk:$1|talk]]) deleted this page after you started editing with reason:\n: <em>$2</em>\nPlease confirm that you really want to recreate this page.",
-    "confirmrecreate-noreason": "User [[User:$1|$1]] ([[User talk:$1|talk]]) deleted this page after you started editing. Please confirm that you really want to recreate this page.",
-    "recreate": "Recreate",
-    "unit-pixel": "px",
-    "confirm_purge_button": "OK",
-    "confirm-purge-top": "Clear the cache of this page?",
-    "confirm-purge-bottom": "Purging a page clears the cache and forces the most current revision to appear.",
-    "confirm-watch-button": "OK",
-    "confirm-watch-top": "Add this page to your watchlist?",
-    "confirm-unwatch-button": "OK",
-    "confirm-unwatch-top": "Remove this page from your watchlist?",
-    "semicolon-separator": ";&#32;",
-    "comma-separator": ",&#32;",
-    "colon-separator": ":&#32;",
-    "autocomment-prefix": "",
-    "pipe-separator": "&#32;|&#32;",
-    "word-separator": "&#32;",
-    "ellipsis": "...",
-    "percent": "$1%",
-    "parentheses": "($1)",
-    "brackets": "[$1]",
-    "quotation-marks": "\"$1\"",
-    "imgmultipageprev": "← previous page",
-    "imgmultipagenext": "next page →",
-    "imgmultigo": "Go!",
-    "imgmultigoto": "Go to page $1",
-    "img-lang-opt": "$2 ($1)",
-    "img-lang-default": "(default language)",
-    "img-lang-info": "Render this image in $1. $2",
-    "img-lang-go": "Go",
-    "ascending_abbrev": "asc",
-    "descending_abbrev": "desc",
-    "table_pager_next": "Next page",
-    "table_pager_prev": "Previous page",
-    "table_pager_first": "First page",
-    "table_pager_last": "Last page",
-    "table_pager_limit": "Show $1 items per page",
-    "table_pager_limit_label": "Items per page:",
-    "table_pager_limit_submit": "Go",
-    "table_pager_empty": "No results",
-    "autosumm-blank": "Blanked the page",
-    "autosumm-replace": "Replaced content with \"$1\"",
-    "autoredircomment": "Redirected page to [[$1]]",
-    "autosumm-new": "Created page with \"$1\"",
-    "autoblock_whitelist": "AOL http://webmaster.info.aol.com/proxyinfo.html\n*64.12.96.0/19\n*149.174.160.0/20\n*152.163.240.0/21\n*152.163.248.0/22\n*152.163.252.0/23\n*152.163.96.0/22\n*152.163.100.0/23\n*195.93.32.0/22\n*195.93.48.0/22\n*195.93.64.0/19\n*195.93.96.0/19\n*195.93.16.0/20\n*198.81.0.0/22\n*198.81.16.0/20\n*198.81.8.0/23\n*202.67.64.128/25\n*205.188.192.0/20\n*205.188.208.0/23\n*205.188.112.0/20\n*205.188.146.144/30\n*207.200.112.0/21",
-    "size-bytes": "$1 B",
-    "size-kilobytes": "$1 KB",
-    "size-megabytes": "$1 MB",
-    "size-gigabytes": "$1 GB",
-    "size-terabytes": "$1 TB",
-    "size-petabytes": "$1 PB",
-    "size-exabytes": "$1 EB",
-    "size-zetabytes": "$1 ZB",
-    "size-yottabytes": "$1 YB",
-    "bitrate-bits": "$1 bps",
-    "bitrate-kilobits": "$1 kbps",
-    "bitrate-megabits": "$1 Mbps",
-    "bitrate-gigabits": "$1 Gbps",
-    "bitrate-terabits": "$1 Tbps",
-    "bitrate-petabits": "$1 Pbps",
-    "bitrate-exabits": "$1 Ebps",
-    "bitrate-zetabits": "$1 Zbps",
-    "bitrate-yottabits": "$1 Ybps",
-    "livepreview-loading": "Loading...",
-    "livepreview-ready": "Loading... Ready!",
-    "livepreview-failed": "Live preview failed!\nTry normal preview.",
-    "livepreview-error": "Failed to connect: $1 \"$2\".\nTry normal preview.",
-    "lag-warn-normal": "Changes newer than $1 {{PLURAL:$1|second|seconds}} may not be shown in this list.",
-    "lag-warn-high": "Due to high database server lag, changes newer than $1 {{PLURAL:$1|second|seconds}} may not be shown in this list.",
-    "editwatchlist-summary": "",
-    "watchlistedit-numitems": "Your watchlist contains {{PLURAL:$1|1 title|$1 titles}}, excluding talk pages.",
-    "watchlistedit-noitems": "Your watchlist contains no titles.",
-    "watchlistedit-normal-title": "Edit watchlist",
-    "watchlistedit-normal-legend": "Remove titles from watchlist",
-    "watchlistedit-normal-explain": "Titles on your watchlist are shown below.\nTo remove a title, check the box next to it, and click \"{{int:Watchlistedit-normal-submit}}\".\nYou can also [[Special:EditWatchlist/raw|edit the raw list]].",
-    "watchlistedit-normal-submit": "Remove titles",
-    "watchlistedit-normal-done": "{{PLURAL:$1|1 title was|$1 titles were}} removed from your watchlist:",
-    "watchlistedit-raw-title": "Edit raw watchlist",
-    "watchlistedit-raw-legend": "Edit raw watchlist",
-    "watchlistedit-raw-explain": "Titles on your watchlist are shown below, and can be edited by adding to and removing from the list;\none title per line.\nWhen finished, click \"{{int:Watchlistedit-raw-submit}}\".\nYou can also [[Special:EditWatchlist|use the standard editor]].",
-    "watchlistedit-raw-titles": "Titles:",
-    "watchlistedit-raw-submit": "Update watchlist",
-    "watchlistedit-raw-done": "Your watchlist has been updated.",
-    "watchlistedit-raw-added": "{{PLURAL:$1|1 title was|$1 titles were}} added:",
-    "watchlistedit-raw-removed": "{{PLURAL:$1|1 title was|$1 titles were}} removed:",
-    "watchlisttools-view": "View relevant changes",
-    "watchlisttools-edit": "View and edit watchlist",
-    "watchlisttools-raw": "Edit raw watchlist",
-    "iranian-calendar-m1": "Farvardin",
-    "iranian-calendar-m2": "Ordibehesht",
-    "iranian-calendar-m3": "Khordad",
-    "iranian-calendar-m4": "Tir",
-    "iranian-calendar-m5": "Mordad",
-    "iranian-calendar-m6": "Shahrivar",
-    "iranian-calendar-m7": "Mehr",
-    "iranian-calendar-m8": "Aban",
-    "iranian-calendar-m9": "Azar",
-    "iranian-calendar-m10": "Dey",
-    "iranian-calendar-m11": "Bahman",
-    "iranian-calendar-m12": "Esfand",
-    "hijri-calendar-m1": "Muharram",
-    "hijri-calendar-m2": "Safar",
-    "hijri-calendar-m3": "Rabi' al-awwal",
-    "hijri-calendar-m4": "Rabi' al-thani",
-    "hijri-calendar-m5": "Jumada al-awwal",
-    "hijri-calendar-m6": "Jumada al-thani",
-    "hijri-calendar-m7": "Rajab",
-    "hijri-calendar-m8": "Sha'aban",
-    "hijri-calendar-m9": "Ramadan",
-    "hijri-calendar-m10": "Shawwal",
-    "hijri-calendar-m11": "Dhu al-Qi'dah",
-    "hijri-calendar-m12": "Dhu al-Hijjah",
-    "hebrew-calendar-m1": "Tishrei",
-    "hebrew-calendar-m2": "Cheshvan",
-    "hebrew-calendar-m3": "Kislev",
-    "hebrew-calendar-m4": "Tevet",
-    "hebrew-calendar-m5": "Shevat",
-    "hebrew-calendar-m6": "Adar",
-    "hebrew-calendar-m6a": "Adar I",
-    "hebrew-calendar-m6b": "Adar II",
-    "hebrew-calendar-m7": "Nisan",
-    "hebrew-calendar-m8": "Iyar",
-    "hebrew-calendar-m9": "Sivan",
-    "hebrew-calendar-m10": "Tamuz",
-    "hebrew-calendar-m11": "Av",
-    "hebrew-calendar-m12": "Elul",
-    "hebrew-calendar-m1-gen": "Tishrei",
-    "hebrew-calendar-m2-gen": "Cheshvan",
-    "hebrew-calendar-m3-gen": "Kislev",
-    "hebrew-calendar-m4-gen": "Tevet",
-    "hebrew-calendar-m5-gen": "Shevat",
-    "hebrew-calendar-m6-gen": "Adar",
-    "hebrew-calendar-m6a-gen": "Adar I",
-    "hebrew-calendar-m6b-gen": "Adar II",
-    "hebrew-calendar-m7-gen": "Nisan",
-    "hebrew-calendar-m8-gen": "Iyar",
-    "hebrew-calendar-m9-gen": "Sivan",
-    "hebrew-calendar-m10-gen": "Tamuz",
-    "hebrew-calendar-m11-gen": "Av",
-    "hebrew-calendar-m12-gen": "Elul",
-    "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|talk]])",
-    "signature-anon": "[[{{#special:Contributions}}/$1|$2]]",
-    "timezone-utc": "UTC",
-    "unknown_extension_tag": "Unknown extension tag \"$1\"",
-    "duplicate-defaultsort": "<strong>Warning:</strong> Default sort key \"$2\" overrides earlier default sort key \"$1\".",
-    "version": "Version",
-    "version-summary": "",
-    "version-extensions": "Installed extensions",
-    "version-specialpages": "Special pages",
-    "version-parserhooks": "Parser hooks",
-    "version-variables": "Variables",
-    "version-antispam": "Spam prevention",
-    "version-skins": "Skins",
-    "version-api": "API",
-    "version-other": "Other",
-    "version-mediahandlers": "Media handlers",
-    "version-hooks": "Hooks",
-    "version-parser-extensiontags": "Parser extension tags",
-    "version-parser-function-hooks": "Parser function hooks",
-    "version-hook-name": "Hook name",
-    "version-hook-subscribedby": "Subscribed by",
-    "version-version": "($1)",
-    "version-svn-revision": "r$1",
-    "version-license": "MediaWiki License",
-    "version-ext-license": "License",
-    "version-ext-colheader-name": "Extension",
-    "version-ext-colheader-version": "Version",
-    "version-ext-colheader-license": "License",
-    "version-ext-colheader-description": "Description",
-    "version-ext-colheader-credits": "Authors",
-    "version-license-title": "License for $1",
-    "version-license-not-found": "No detailed license information was found for this extension.",
-    "version-credits-title": "Credits for $1",
-    "version-credits-not-found": "No detailed credits information was found for this extension.",
-    "version-poweredby-credits": "This wiki is powered by <strong>[https://www.mediawiki.org/ MediaWiki]</strong>, copyright © 2001-$1 $2.",
-    "version-poweredby-others": "others",
-    "version-poweredby-translators": "translatewiki.net translators",
-    "version-credits-summary": "We would like to recognize the following persons for their contribution to [[Special:Version|MediaWiki]].",
-    "version-license-info": "MediaWiki is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.\n\nMediaWiki is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n\nYou should have received [{{SERVER}}{{SCRIPTPATH}}/COPYING a copy of the GNU General Public License] along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA or [//www.gnu.org/licenses/old-licenses/gpl-2.0.html read it online].",
-    "version-software": "Installed software",
-    "version-software-product": "Product",
-    "version-software-version": "Version",
-    "version-db-mysql-url": "http://www.mysql.com/",
-    "version-db-mariadb-url": "http://mariadb.org/",
-    "version-db-percona-url": "http://www.percona.com/software/percona-server",
-    "version-db-postgres-url": "http://www.postgresql.org/",
-    "version-db-oracle-url": "http://www.oracle.com/database/",
-    "version-db-sqlite-url": "http://www.sqlite.org/",
-    "version-db-mssql-url": "http://www.microsoft.com/sql/",
-    "version-entrypoints": "Entry point URLs",
-    "version-entrypoints-header-entrypoint": "Entry point",
-    "version-entrypoints-header-url": "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]",
-    "version-entrypoints-index-php": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:index.php index.php]",
-    "version-entrypoints-api-php": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:api.php api.php]",
-    "version-entrypoints-load-php": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:load.php load.php]",
-    "redirect": "Redirect by file, user, page or revision ID",
-    "redirect-legend": "Redirect to a file or page",
-    "redirect-text": "",
-    "redirect-summary": "This special page redirects to a file (given the file name), a page (given a revision ID or page ID), or a user page (given a numeric user ID). Usage: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], or [[{{#Special:Redirect}}/user/101]].",
-    "redirect-submit": "Go",
-    "redirect-lookup": "Lookup:",
-    "redirect-value": "Value:",
-    "redirect-user": "User ID",
-    "redirect-page": "Page ID",
-    "redirect-revision": "Page revision",
-    "redirect-file": "File name",
-    "redirect-not-exists": "Value not found",
-    "fileduplicatesearch": "Search for duplicate files",
-    "fileduplicatesearch-summary": "Search for duplicate files based on hash values.",
-    "fileduplicatesearch-legend": "Search for a duplicate",
-    "fileduplicatesearch-filename": "Filename:",
-    "fileduplicatesearch-submit": "Search",
-    "fileduplicatesearch-info": "$1 × $2 pixel<br />File size: $3<br />MIME type: $4",
-    "fileduplicatesearch-result-1": "The file \"$1\" has no identical duplication.",
-    "fileduplicatesearch-result-n": "The file \"$1\" has {{PLURAL:$2|1 identical duplication|$2 identical duplications}}.",
-    "fileduplicatesearch-noresults": "No file named \"$1\" found.",
-    "specialpages": "Special pages",
-    "specialpages-summary": "",
-    "specialpages-note-top": "Legend",
-    "specialpages-note": "* Normal special pages.\n* <span class=\"mw-specialpagerestricted\">Restricted special pages.</span>",
-    "specialpages-group-maintenance": "Maintenance reports",
-    "specialpages-group-other": "Other special pages",
-    "specialpages-group-login": "Login / create account",
-    "specialpages-group-changes": "Recent changes and logs",
-    "specialpages-group-media": "Media reports and uploads",
-    "specialpages-group-users": "Users and rights",
-    "specialpages-group-highuse": "High use pages",
-    "specialpages-group-pages": "Lists of pages",
-    "specialpages-group-pagetools": "Page tools",
-    "specialpages-group-wiki": "Data and tools",
-    "specialpages-group-redirects": "Redirecting special pages",
-    "specialpages-group-spam": "Spam tools",
-    "blankpage": "Blank page",
-    "intentionallyblankpage": "This page is intentionally left blank.",
-    "external_image_whitelist": " #Leave this line exactly as it is<pre>\n#Put regular expression fragments (just the part that goes between the //) below\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#Lines beginning with # are treated as comments\n#This is case-insensitive\n\n#Put all regex fragments above this line. Leave this line exactly as it is</pre>",
-    "tags": "Valid change tags",
-    "tags-summary": "",
-    "tag-filter": "[[Special:Tags|Tag]] filter:",
-    "tag-filter-submit": "Filter",
-    "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag|Tags}}]]: $2)",
-    "tags-title": "Tags",
-    "tags-intro": "This page lists the tags that the software may mark an edit with, and their meaning.",
-    "tags-tag": "Tag name",
-    "tags-display-header": "Appearance on change lists",
-    "tags-description-header": "Full description of meaning",
-    "tags-active-header": "Active?",
-    "tags-hitcount-header": "Tagged changes",
-    "tags-active-yes": "Yes",
-    "tags-active-no": "No",
-    "tags-edit": "edit",
-    "tags-hitcount": "$1 {{PLURAL:$1|change|changes}}",
-    "comparepages": "Compare pages",
-    "comparepages-summary": "",
-    "compare-page1": "Page 1",
-    "compare-page2": "Page 2",
-    "compare-rev1": "Revision 1",
-    "compare-rev2": "Revision 2",
-    "compare-submit": "Compare",
-    "compare-invalid-title": "The title you specified is invalid.",
-    "compare-title-not-exists": "The title you specified does not exist.",
-    "compare-revision-not-exists": "The revision you specified does not exist.",
-    "dberr-header": "This wiki has a problem",
-    "dberr-problems": "Sorry! This site is experiencing technical difficulties.",
-    "dberr-again": "Try waiting a few minutes and reloading.",
-    "dberr-info": "(Cannot contact the database server: $1)",
-    "dberr-info-hidden": "(Cannot contact the database server)",
-    "dberr-usegoogle": "You can try searching via Google in the meantime.",
-    "dberr-outofdate": "Note that their indexes of our content may be out of date.",
-    "dberr-cachederror": "This is a cached copy of the requested page, and may not be up to date.",
-    "htmlform-invalid-input": "There are problems with some of your input.",
-    "htmlform-select-badoption": "The value you specified is not a valid option.",
-    "htmlform-int-invalid": "The value you specified is not an integer.",
-    "htmlform-float-invalid": "The value you specified is not a number.",
-    "htmlform-int-toolow": "The value you specified is below the minimum of $1.",
-    "htmlform-int-toohigh": "The value you specified is above the maximum of $1.",
-    "htmlform-required": "This value is required.",
-    "htmlform-submit": "Submit",
-    "htmlform-reset": "Undo changes",
-    "htmlform-selectorother-other": "Other",
-    "htmlform-no": "No",
-    "htmlform-yes": "Yes",
-    "htmlform-chosen-placeholder": "Select an option",
-    "sqlite-has-fts": "$1 with full-text search support",
-    "sqlite-no-fts": "$1 without full-text search support",
-    "logentry-delete-delete": "$1 {{GENDER:$2|deleted}} page $3",
-    "logentry-delete-restore": "$1 {{GENDER:$2|restored}} page $3",
-    "logentry-delete-event": "$1 {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a log event|$5 log events}} on $3: $4",
-    "logentry-delete-revision": "$1 {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a revision|$5 revisions}} on page $3: $4",
-    "logentry-delete-event-legacy": "$1 {{GENDER:$2|changed}} visibility of log events on $3",
-    "logentry-delete-revision-legacy": "$1 {{GENDER:$2|changed}} visibility of revisions on page $3",
-    "logentry-suppress-delete": "$1 {{GENDER:$2|suppressed}} page $3",
-    "logentry-suppress-event": "$1 secretly {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a log event|$5 log events}} on $3: $4",
-    "logentry-suppress-revision": "$1 secretly {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a revision|$5 revisions}} on page $3: $4",
-    "logentry-suppress-event-legacy": "$1 secretly {{GENDER:$2|changed}} visibility of log events on $3",
-    "logentry-suppress-revision-legacy": "$1 secretly {{GENDER:$2|changed}} visibility of revisions on page $3",
-    "revdelete-content-hid": "content hidden",
-    "revdelete-summary-hid": "edit summary hidden",
-    "revdelete-uname-hid": "username hidden",
-    "revdelete-content-unhid": "content unhidden",
-    "revdelete-summary-unhid": "edit summary unhidden",
-    "revdelete-uname-unhid": "username unhidden",
-    "revdelete-restricted": "applied restrictions to administrators",
-    "revdelete-unrestricted": "removed restrictions for administrators",
-    "logentry-move-move": "$1 {{GENDER:$2|moved}} page $3 to $4",
-    "logentry-move-move-noredirect": "$1 {{GENDER:$2|moved}} page $3 to $4 without leaving a redirect",
-    "logentry-move-move_redir": "$1 {{GENDER:$2|moved}} page $3 to $4 over redirect",
-    "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|moved}} page $3 to $4 over a redirect without leaving a redirect",
-    "logentry-patrol-patrol": "$1 {{GENDER:$2|marked}} revision $4 of page $3 patrolled",
-    "logentry-patrol-patrol-auto": "$1 automatically {{GENDER:$2|marked}} revision $4 of page $3 patrolled",
-    "logentry-newusers-newusers": "User account $1 was {{GENDER:$2|created}}",
-    "logentry-newusers-create": "User account $1 was {{GENDER:$2|created}}",
-    "logentry-newusers-create2": "User account $3 was {{GENDER:$2|created}} by $1",
-    "logentry-newusers-byemail": "User account $3 was {{GENDER:$2|created}} by $1 and password was sent by email",
-    "logentry-newusers-autocreate": "User account $1 was {{GENDER:$2|created}} automatically",
-    "logentry-rights-rights": "$1 {{GENDER:$2|changed}} group membership for $3 from $4 to $5",
-    "logentry-rights-rights-legacy": "$1 {{GENDER:$2|changed}} group membership for $3",
-    "logentry-rights-autopromote": "$1 was automatically {{GENDER:$2|promoted}} from $4 to $5",
-    "rightsnone": "(none)",
-    "revdelete-logentry": "changed revision visibility of \"[[$1]]\"",
-    "logdelete-logentry": "changed event visibility of \"[[$1]]\"",
-    "revdelete-content": "content",
-    "revdelete-summary": "edit summary",
-    "revdelete-uname": "username",
-    "revdelete-hid": "hid $1",
-    "revdelete-unhid": "unhid $1",
-    "revdelete-log-message": "$1 for $2 {{PLURAL:$2|revision|revisions}}",
-    "logdelete-log-message": "$1 for $2 {{PLURAL:$2|event|events}}",
-    "deletedarticle": "deleted \"[[$1]]\"",
-    "suppressedarticle": "suppressed \"[[$1]]\"",
-    "undeletedarticle": "restored \"[[$1]]\"",
-    "patrol-log-line": "marked $1 of $2 patrolled $3",
-    "patrol-log-auto": "(automatic)",
-    "patrol-log-diff": "revision $1",
-    "1movedto2": "moved [[$1]] to [[$2]]",
-    "1movedto2_redir": "moved [[$1]] to [[$2]] over redirect",
-    "move-redirect-suppressed": "redirect suppressed",
-    "newuserlog-create-entry": "New user account",
-    "newuserlog-create2-entry": "created new account $1",
-    "newuserlog-autocreate-entry": "Account created automatically",
-    "rightslogentry": "changed group membership for $1 from $2 to $3",
-    "rightslogentry-autopromote": "was automatically promoted from $2 to $3",
-    "feedback-bugornote": "If you are ready to describe a technical problem in detail please [$1 report a bug].\nOtherwise, you can use the easy form below. Your comment will be added to the page \"[$3 $2]\", along with your username.",
-    "feedback-subject": "Subject:",
-    "feedback-message": "Message:",
-    "feedback-cancel": "Cancel",
-    "feedback-submit": "Submit Feedback",
-    "feedback-adding": "Adding feedback to page...",
-    "feedback-error1": "Error: Unrecognized result from API",
-    "feedback-error2": "Error: Edit failed",
-    "feedback-error3": "Error: No response from API",
-    "feedback-thanks": "Thanks! Your feedback has been posted to the page \"[$2 $1]\".",
-    "feedback-close": "Done",
-    "feedback-bugcheck": "Great! Just check that it is not already one of the [$1 known bugs].",
-    "feedback-bugnew": "I checked. Report a new bug",
-    "searchsuggest-search": "Search",
-    "searchsuggest-containing": "containing...",
-    "api-error-badaccess-groups": "You are not permitted to upload files to this wiki.",
-    "api-error-badtoken": "Internal error: Bad token.",
-    "api-error-copyuploaddisabled": "Uploading by URL is disabled on this server.",
-    "api-error-duplicate": "There {{PLURAL:$1|is [$2 another file]|are [$2 some other files]}} already on the site with the same content.",
-    "api-error-duplicate-archive": "There {{PLURAL:$1|was [$2 another file]|were [$2 some other files]}} already on the site with the same content, but {{PLURAL:$1|it was|they were}} deleted.",
-    "api-error-duplicate-archive-popup-title": "Duplicate {{PLURAL:$1|file that has|files that have}} already been deleted.",
-    "api-error-duplicate-popup-title": "Duplicate {{PLURAL:$1|file|files}}.",
-    "api-error-empty-file": "The file you submitted was empty.",
-    "api-error-emptypage": "Creating new, empty pages is not allowed.",
-    "api-error-fetchfileerror": "Internal error: Something went wrong while fetching the file.",
-    "api-error-fileexists-forbidden": "A file with name \"$1\" already exists, and cannot be overwritten.",
-    "api-error-fileexists-shared-forbidden": "A file with name \"$1\" already exists in the shared file repository, and cannot be overwritten.",
-    "api-error-file-too-large": "The file you submitted was too large.",
-    "api-error-filename-tooshort": "The filename is too short.",
-    "api-error-filetype-banned": "This type of file is banned.",
-    "api-error-filetype-banned-type": "$1 {{PLURAL:$4|is not a permitted file type|are not permitted file types}}. Permitted {{PLURAL:$3|file type is|file types are}} $2.",
-    "api-error-filetype-missing": "The filename is missing an extension.",
-    "api-error-hookaborted": "The modification you tried to make was aborted by an extension.",
-    "api-error-http": "Internal error: Unable to connect to server.",
-    "api-error-illegal-filename": "The filename is not allowed.",
-    "api-error-internal-error": "Internal error: Something went wrong with processing your upload on the wiki.",
-    "api-error-invalid-file-key": "Internal error: File was not found in temporary storage.",
-    "api-error-missingparam": "Internal error: Missing parameters on request.",
-    "api-error-missingresult": "Internal error: Could not determine if the copy succeeded.",
-    "api-error-mustbeloggedin": "You must be logged in to upload files.",
-    "api-error-mustbeposted": "Internal error: Request requires HTTP POST.",
-    "api-error-noimageinfo": "The upload succeeded, but the server did not give us any information about the file.",
-    "api-error-nomodule": "Internal error: No upload module set.",
-    "api-error-ok-but-empty": "Internal error: No response from server.",
-    "api-error-overwrite": "Overwriting an existing file is not allowed.",
-    "api-error-stashfailed": "Internal error: Server failed to store temporary file.",
-    "api-error-publishfailed": "Internal error: Server failed to publish temporary file.",
-    "api-error-stasherror": "There was an error while uploading the file to stash.",
-    "api-error-timeout": "The server did not respond within the expected time.",
-    "api-error-unclassified": "An unknown error occurred.",
-    "api-error-unknown-code": "Unknown error: \"$1\".",
-    "api-error-unknown-error": "Internal error: Something went wrong when trying to upload your file.",
-    "api-error-unknown-warning": "Unknown warning: \"$1\".",
-    "api-error-unknownerror": "Unknown error: \"$1\".",
-    "api-error-uploaddisabled": "Uploading is disabled on this wiki.",
-    "api-error-verification-error": "This file might be corrupt, or have the wrong extension.",
-    "duration-seconds": "$1 {{PLURAL:$1|second|seconds}}",
-    "duration-minutes": "$1 {{PLURAL:$1|minute|minutes}}",
-    "duration-hours": "$1 {{PLURAL:$1|hour|hours}}",
-    "duration-days": "$1 {{PLURAL:$1|day|days}}",
-    "duration-weeks": "$1 {{PLURAL:$1|week|weeks}}",
-    "duration-years": "$1 {{PLURAL:$1|year|years}}",
-    "duration-decades": "$1 {{PLURAL:$1|decade|decades}}",
-    "duration-centuries": "$1 {{PLURAL:$1|century|centuries}}",
-    "duration-millennia": "$1 {{PLURAL:$1|millennium|millennia}}",
-    "rotate-comment": "Image rotated by $1 {{PLURAL:$1|degree|degrees}} clockwise",
-    "limitreport-title": "Parser profiling data:",
-    "limitreport-cputime": "CPU time usage",
-    "limitreport-cputime-value": "$1 {{PLURAL:$1|second|seconds}}",
-    "limitreport-walltime": "Real time usage",
-    "limitreport-walltime-value": "$1 {{PLURAL:$1|second|seconds}}",
-    "limitreport-ppvisitednodes": "Preprocessor visited node count",
-    "limitreport-ppvisitednodes-value": "$1/$2",
-    "limitreport-ppgeneratednodes": "Preprocessor generated node count",
-    "limitreport-ppgeneratednodes-value": "$1/$2",
-    "limitreport-postexpandincludesize": "Post-expand include size",
-    "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|byte|bytes}}",
-    "limitreport-templateargumentsize": "Template argument size",
-    "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|byte|bytes}}",
-    "limitreport-expansiondepth": "Highest expansion depth",
-    "limitreport-expansiondepth-value": "$1/$2",
-    "limitreport-expensivefunctioncount": "Expensive parser function count",
-    "limitreport-expensivefunctioncount-value": "$1/$2",
-    "expandtemplates": "Expand templates",
-    "expand_templates_intro": "This special page takes text and expands all templates in it recursively.\nIt also expands supported parser functions like\n<code><nowiki>{{</nowiki>#language:…}}</code> and variables like\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nIn fact, it expands pretty much everything in double-braces.",
-    "expand_templates_title": "Context title, for {{FULLPAGENAME}}, etc.:",
-    "expand_templates_input": "Input text:",
-    "expand_templates_output": "Result",
-    "expand_templates_xml_output": "XML output",
-    "expand_templates_html_output": "Raw HTML output",
-    "expand_templates_ok": "OK",
-    "expand_templates_remove_comments": "Remove comments",
-    "expand_templates_remove_nowiki": "Suppress <nowiki> tags in result",
-    "expand_templates_generate_xml": "Show XML parse tree",
-    "expand_templates_generate_rawhtml": "Show raw HTML",
-    "expand_templates_preview": "Preview"
+       "@metadata": {
+               "authors": []
+       },
+       "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-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",
+       "tog-numberheadings": "Auto-number headings",
+       "tog-showtoolbar": "Show edit toolbar",
+       "tog-editondblclick": "Edit pages on double click",
+       "tog-editsectiononrightclick": "Enable section editing by right clicking on section titles",
+       "tog-watchcreations": "Add pages I create and files I upload to my watchlist",
+       "tog-watchdefault": "Add pages and files I edit to my watchlist",
+       "tog-watchmoves": "Add pages and files I move to my watchlist",
+       "tog-watchdeletion": "Add pages and files I delete to my watchlist",
+       "tog-minordefault": "Mark all edits minor by default",
+       "tog-previewontop": "Show preview before edit box",
+       "tog-previewonfirst": "Show preview on first edit",
+       "tog-enotifwatchlistpages": "Email me when a page or file on my watchlist is changed",
+       "tog-enotifusertalkpages": "Email me when my user talk page is changed",
+       "tog-enotifminoredits": "Email me also for minor edits of pages and files",
+       "tog-enotifrevealaddr": "Reveal my email address in notification emails",
+       "tog-shownumberswatching": "Show the number of watching users",
+       "tog-oldsig": "Existing signature:",
+       "tog-fancysig": "Treat signature as wikitext (without an automatic link)",
+       "tog-uselivepreview": "Use live preview (experimental)",
+       "tog-forceeditsummary": "Prompt me when entering a blank edit summary",
+       "tog-watchlisthideown": "Hide my edits from the watchlist",
+       "tog-watchlisthidebots": "Hide bot edits from the watchlist",
+       "tog-watchlisthideminor": "Hide minor edits from the watchlist",
+       "tog-watchlisthideliu": "Hide edits by logged in users from the watchlist",
+       "tog-watchlisthideanons": "Hide edits by anonymous users from the watchlist",
+       "tog-watchlisthidepatrolled": "Hide patrolled edits from the watchlist",
+       "tog-ccmeonemails": "Send me copies of emails I send to other users",
+       "tog-diffonly": "Do not show page content below diffs",
+       "tog-showhiddencats": "Show hidden categories",
+       "tog-norollbackdiff": "Omit diff after performing a rollback",
+       "tog-useeditwarning": "Warn me when I leave an edit page with unsaved changes",
+       "tog-prefershttps": "Always use a secure connection when logged in",
+       "underline-always": "Always",
+       "underline-never": "Never",
+       "underline-default": "Skin or browser default",
+       "editfont-style": "Edit area font style:",
+       "editfont-default": "Browser default",
+       "editfont-monospace": "Monospaced font",
+       "editfont-sansserif": "Sans-serif font",
+       "editfont-serif": "Serif font",
+       "sunday": "Sunday",
+       "monday": "Monday",
+       "tuesday": "Tuesday",
+       "wednesday": "Wednesday",
+       "thursday": "Thursday",
+       "friday": "Friday",
+       "saturday": "Saturday",
+       "sun": "Sun",
+       "mon": "Mon",
+       "tue": "Tue",
+       "wed": "Wed",
+       "thu": "Thu",
+       "fri": "Fri",
+       "sat": "Sat",
+       "january": "January",
+       "february": "February",
+       "march": "March",
+       "april": "April",
+       "may_long": "May",
+       "june": "June",
+       "july": "July",
+       "august": "August",
+       "september": "September",
+       "october": "October",
+       "november": "November",
+       "december": "December",
+       "january-gen": "January",
+       "february-gen": "February",
+       "march-gen": "March",
+       "april-gen": "April",
+       "may-gen": "May",
+       "june-gen": "June",
+       "july-gen": "July",
+       "august-gen": "August",
+       "september-gen": "September",
+       "october-gen": "October",
+       "november-gen": "November",
+       "december-gen": "December",
+       "jan": "Jan",
+       "feb": "Feb",
+       "mar": "Mar",
+       "apr": "Apr",
+       "may": "May",
+       "jun": "Jun",
+       "jul": "Jul",
+       "aug": "Aug",
+       "sep": "Sep",
+       "oct": "Oct",
+       "nov": "Nov",
+       "dec": "Dec",
+       "january-date": "January $1",
+       "february-date": "February $1",
+       "march-date": "March $1",
+       "april-date": "April $1",
+       "may-date": "May $1",
+       "june-date": "June $1",
+       "july-date": "July $1",
+       "august-date": "August $1",
+       "september-date": "September $1",
+       "october-date": "October $1",
+       "november-date": "November $1",
+       "december-date": "December $1",
+       "pagecategories": "{{PLURAL:$1|Category|Categories}}",
+       "pagecategorieslink": "Special:Categories",
+       "category_header": "Pages in category \"$1\"",
+       "subcategories": "Subcategories",
+       "category-media-header": "Media in category \"$1\"",
+       "category-empty": "<em>This category currently contains no pages or media.</em>",
+       "hidden-categories": "{{PLURAL:$1|Hidden category|Hidden categories}}",
+       "hidden-category-category": "Hidden categories",
+       "category-subcat-count": "{{PLURAL:$2|This category has only the following subcategory.|This category has the following {{PLURAL:$1|subcategory|$1 subcategories}}, out of $2 total.}}",
+       "category-subcat-count-limited": "This category has the following {{PLURAL:$1|subcategory|$1 subcategories}}.",
+       "category-article-count": "{{PLURAL:$2|This category contains only the following page.|The following {{PLURAL:$1|page is|$1 pages are}} in this category, out of $2 total.}}",
+       "category-article-count-limited": "The following {{PLURAL:$1|page is|$1 pages are}} in the current category.",
+       "category-file-count": "{{PLURAL:$2|This category contains only the following file.|The following {{PLURAL:$1|file is|$1 files are}} in this category, out of $2 total.}}",
+       "category-file-count-limited": "The following {{PLURAL:$1|file is|$1 files are}} in the current category.",
+       "listingcontinuesabbrev": "cont.",
+       "index-category": "Indexed pages",
+       "noindex-category": "Noindexed pages",
+       "broken-file-category": "Pages with broken file links",
+       "categoryviewer-pagedlinks": "($1) ($2)",
+       "about": "About",
+       "article": "Content page",
+       "newwindow": "(opens in new window)",
+       "cancel": "Cancel",
+       "moredotdotdot": "More...",
+       "morenotlisted": "This list is not complete.",
+       "mypage": "Page",
+       "mytalk": "Talk",
+       "anontalk": "Talk for this IP address",
+       "navigation": "Navigation",
+       "and": "&#32;and",
+       "qbfind": "Find",
+       "qbbrowse": "Browse",
+       "qbedit": "Edit",
+       "qbpageoptions": "This page",
+       "qbmyoptions": "My pages",
+       "faq": "FAQ",
+       "faqpage": "Project:FAQ",
+       "sitetitle": "{{SITENAME}}",
+       "sitesubtitle": "",
+       "vector-action-addsection": "Add topic",
+       "vector-action-delete": "Delete",
+       "vector-action-move": "Move",
+       "vector-action-protect": "Protect",
+       "vector-action-undelete": "Undelete",
+       "vector-action-unprotect": "Change protection",
+       "vector-view-create": "Create",
+       "vector-view-edit": "Edit",
+       "vector-view-history": "View history",
+       "vector-view-view": "Read",
+       "vector-view-viewsource": "View source",
+       "actions": "Actions",
+       "namespaces": "Namespaces",
+       "variants": "Variants",
+       "navigation-heading": "Navigation menu",
+       "errorpagetitle": "Error",
+       "returnto": "Return to $1.",
+       "tagline": "From {{SITENAME}}",
+       "help": "Help",
+       "search": "Search",
+       "searchbutton": "Search",
+       "go": "Go",
+       "searcharticle": "Go",
+       "history": "Page history",
+       "history_short": "History",
+       "updatedmarker": "updated since my last visit",
+       "printableversion": "Printable version",
+       "permalink": "Permanent link",
+       "print": "Print",
+       "view": "View",
+       "view-foreign": "View on $1",
+       "edit": "Edit",
+       "edit-local": "Edit local description",
+       "create": "Create",
+       "create-local": "Add local description",
+       "editthispage": "Edit this page",
+       "create-this-page": "Create this page",
+       "delete": "Delete",
+       "deletethispage": "Delete this page",
+       "undeletethispage": "Undelete this page",
+       "undelete_short": "Undelete {{PLURAL:$1|one edit|$1 edits}}",
+       "viewdeleted_short": "View {{PLURAL:$1|one deleted edit|$1 deleted edits}}",
+       "protect": "Protect",
+       "protect_change": "change",
+       "protectthispage": "Protect this page",
+       "unprotect": "Change protection",
+       "unprotectthispage": "Change protection of this page",
+       "newpage": "New page",
+       "talkpage": "Discuss this page",
+       "talkpagelinktext": "Talk",
+       "specialpage": "Special page",
+       "personaltools": "Personal tools",
+       "postcomment": "New section",
+       "addsection": "+",
+       "articlepage": "View content page",
+       "talk": "Discussion",
+       "views": "Views",
+       "toolbox": "Tools",
+       "userpage": "View user page",
+       "projectpage": "View project page",
+       "imagepage": "View file page",
+       "mediawikipage": "View message page",
+       "templatepage": "View template page",
+       "viewhelppage": "View help page",
+       "categorypage": "View category page",
+       "viewtalkpage": "View discussion",
+       "otherlanguages": "In other languages",
+       "redirectedfrom": "(Redirected from $1)",
+       "redirectpagesub": "Redirect page",
+       "talkpageheader": "-",
+       "lastmodifiedat": "This page was last modified on $1, at $2.",
+       "viewcount": "This page has been accessed {{PLURAL:$1|once|$1 times}}.",
+       "protectedpage": "Protected page",
+       "jumpto": "Jump to:",
+       "jumptonavigation": "navigation",
+       "jumptosearch": "search",
+       "view-pool-error": "Sorry, the servers are overloaded at the moment.\nToo many users are trying to view this page.\nPlease wait a while before you try to access this page again.\n\n$1",
+       "generic-pool-error": "Sorry, the servers are overloaded at the moment.\nToo many users are trying to view this resource.\nPlease wait a while before you try to access this resource again.",
+       "pool-timeout": "Timeout waiting for the lock",
+       "pool-queuefull": "Pool queue is full",
+       "pool-errorunknown": "Unknown error",
+       "pool-servererror": "The pool counter service is not available ($1).",
+       "aboutsite": "About {{SITENAME}}",
+       "aboutpage": "Project:About",
+       "copyright": "Content is available under $1 unless otherwise noted.",
+       "copyrightpage": "{{ns:project}}:Copyrights",
+       "currentevents": "Current events",
+       "currentevents-url": "Project:Current events",
+       "disclaimers": "Disclaimers",
+       "disclaimerpage": "Project:General disclaimer",
+       "edithelp": "Editing help",
+       "edithelppage": "https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Editing_pages",
+       "helppage": "https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents",
+       "mainpage": "Main Page",
+       "mainpage-description": "Main page",
+       "policy-url": "Project:Policy",
+       "portal": "Community portal",
+       "portal-url": "Project:Community portal",
+       "privacy": "Privacy policy",
+       "privacypage": "Project:Privacy policy",
+       "badaccess": "Permission error",
+       "badaccess-group0": "You are not allowed to execute the action you have requested.",
+       "badaccess-groups": "The action you have requested is limited to users in {{PLURAL:$2|the group|one of the groups}}: $1.",
+       "versionrequired": "Version $1 of MediaWiki required",
+       "versionrequiredtext": "Version $1 of MediaWiki is required to use this page.\nSee [[Special:Version|version page]].",
+       "ok": "OK",
+       "pagetitle": "$1 - {{SITENAME}}",
+       "pagetitle-view-mainpage": "{{SITENAME}}",
+       "backlinksubtitle": "← $1",
+       "retrievedfrom": "Retrieved from \"$1\"",
+       "youhavenewmessages": "{{PLURAL:$3|You have}} $1 ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|You have}} $1 from {{PLURAL:$3|another user|$3 users}} ($2).",
+       "youhavenewmessagesmanyusers": "You have $1 from many users ($2).",
+       "newmessageslinkplural": "{{PLURAL:$1|a new message|999=new messages}}",
+       "newmessagesdifflinkplural": "last {{PLURAL:$1|change|999=changes}}",
+       "youhavenewmessagesmulti": "You have new messages on $1",
+       "newtalkseparator": ",&#32;",
+       "editsection": "edit",
+       "editold": "edit",
+       "viewsourceold": "view source",
+       "editlink": "edit",
+       "viewsourcelink": "view source",
+       "editsectionhint": "Edit section: $1",
+       "toc": "Contents",
+       "showtoc": "show",
+       "hidetoc": "hide",
+       "collapsible-collapse": "Collapse",
+       "collapsible-expand": "Expand",
+       "thisisdeleted": "View or restore $1?",
+       "viewdeleted": "View $1?",
+       "restorelink": "{{PLURAL:$1|one deleted edit|$1 deleted edits}}",
+       "feedlinks": "Feed:",
+       "feed-invalid": "Invalid subscription feed type.",
+       "feed-unavailable": "Syndication feeds are not available",
+       "site-rss-feed": "$1 RSS feed",
+       "site-atom-feed": "$1 Atom feed",
+       "page-rss-feed": "\"$1\" RSS feed",
+       "page-atom-feed": "\"$1\" Atom feed",
+       "feed-atom": "Atom",
+       "feed-rss": "RSS",
+       "sitenotice": "-",
+       "anonnotice": "-",
+       "newsectionheaderdefaultlevel": "== $1 ==",
+       "red-link-title": "$1 (page does not exist)",
+       "sort-descending": "Sort descending",
+       "sort-ascending": "Sort ascending",
+       "nstab-main": "Page",
+       "nstab-user": "User page",
+       "nstab-media": "Media page",
+       "nstab-special": "Special page",
+       "nstab-project": "Project page",
+       "nstab-image": "File",
+       "nstab-mediawiki": "Message",
+       "nstab-template": "Template",
+       "nstab-help": "Help page",
+       "nstab-category": "Category",
+       "mainpage-nstab": "",
+       "nosuchaction": "No such action",
+       "nosuchactiontext": "The action specified by the URL is invalid.\nYou might have mistyped the URL, or followed an incorrect link.\nThis might also indicate a bug in the software used by {{SITENAME}}.",
+       "nosuchspecialpage": "No such special page",
+       "nospecialpagetext": "<strong>You have requested an invalid special page.</strong>\n\nA list of valid special pages can be found at [[Special:SpecialPages|{{int:specialpages}}]].",
+       "error": "Error",
+       "databaseerror": "Database error",
+       "databaseerror-text": "A database query error has occurred.\nThis may indicate a bug in the software.",
+       "databaseerror-textcl": "A database query error has occurred.",
+       "databaseerror-query": "Query: $1",
+       "databaseerror-function": "Function: $1",
+       "databaseerror-error": "Error: $1",
+       "laggedslavemode": "<strong>Warning:</strong> Page may not contain recent updates.",
+       "readonly": "Database locked",
+       "enterlockreason": "Enter a reason for the lock, including an estimate of when the lock will be released",
+       "readonlytext": "The database is currently locked to new entries and other modifications, probably for routine database maintenance, after which it will be back to normal.\n\nThe administrator who locked it offered this explanation: $1",
+       "missing-article": "The database did not find the text of a page that it should have found, named \"$1\" $2.\n\nThis is usually caused by following an outdated diff or history link to a page that has been deleted.\n\nIf this is not the case, you may have found a bug in the software.\nPlease report this to an [[Special:ListUsers/sysop|administrator]], making note of the URL.",
+       "missingarticle-rev": "(revision#: $1)",
+       "missingarticle-diff": "(Diff: $1, $2)",
+       "readonly_lag": "The database has been automatically locked while the slave database servers catch up to the master",
+       "internalerror": "Internal error",
+       "internalerror_info": "Internal error: $1",
+       "filecopyerror": "Could not copy file \"$1\" to \"$2\".",
+       "filerenameerror": "Could not rename file \"$1\" to \"$2\".",
+       "filedeleteerror": "Could not delete file \"$1\".",
+       "directorycreateerror": "Could not create directory \"$1\".",
+       "filenotfound": "Could not find file \"$1\".",
+       "unexpected": "Unexpected value: \"$1\"=\"$2\".",
+       "formerror": "Error: Could not submit form.",
+       "badarticleerror": "This action cannot be performed on this page.",
+       "cannotdelete": "The page or file \"$1\" could not be deleted.\nIt may have already been deleted by someone else.",
+       "cannotdelete-title": "Cannot delete page \"$1\"",
+       "delete-hook-aborted": "Deletion aborted by hook.\nIt gave no explanation.",
+       "no-null-revision": "Could not create new null revision for page \"$1\"",
+       "badtitle": "Bad title",
+       "badtitletext": "The requested page title was invalid, empty, or an incorrectly linked inter-language or inter-wiki title.\nIt may contain one or more characters that cannot be used in titles.",
+       "perfcached": "The following data is cached and may not be up to date. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.",
+       "perfcachedts": "The following data is cached, and was last updated $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
+       "querypage-no-updates": "Updates for this page are currently disabled.\nData here will not presently be refreshed.",
+       "viewsource": "View source",
+       "viewsource-title": "View source for $1",
+       "actionthrottled": "Action throttled",
+       "actionthrottledtext": "As an anti-spam measure, you are limited from performing this action too many times in a short space of time, and you have exceeded this limit.\nPlease try again in a few minutes.",
+       "protectedpagetext": "This page has been protected to prevent editing or other actions.",
+       "viewsourcetext": "You can view and copy the source of this page:",
+       "viewyourtext": "You can view and copy the source of <strong>your edits</strong> to this page:",
+       "protectedinterface": "This page provides interface text for the software on this wiki, and is protected to prevent abuse.\nTo add or change translations for all wikis, please use [//translatewiki.net/ translatewiki.net], the MediaWiki localisation project.",
+       "editinginterface": "<strong>Warning:</strong> You are editing a page that is used to provide interface text for the software.\nChanges to this page will affect the appearance of the user interface for other users on this wiki.\nTo add or change translations for all wikis, please use [//translatewiki.net/ translatewiki.net], the MediaWiki localisation project.",
+       "cascadeprotected": "This page has been protected from editing because it is included in the following {{PLURAL:$1|page, which is|pages, which are}} protected with the \"cascading\" option turned on:\n$2",
+       "namespaceprotected": "You do not have permission to edit pages in the <strong>$1</strong> namespace.",
+       "customcssprotected": "You do not have permission to edit this CSS page because it contains another user's personal settings.",
+       "customjsprotected": "You do not have permission to edit this JavaScript page because it contains another user's personal settings.",
+       "mycustomcssprotected": "You do not have permission to edit this CSS page.",
+       "mycustomjsprotected": "You do not have permission to edit this JavaScript page.",
+       "myprivateinfoprotected": "You do not have permission to edit your private information.",
+       "mypreferencesprotected": "You do not have permission to edit your preferences.",
+       "ns-specialprotected": "Special pages cannot be edited.",
+       "titleprotected": "This title has been protected from creation by [[User:$1|$1]].\nThe reason given is \"<em>$2</em>\".",
+       "filereadonlyerror": "Unable to modify the file \"$1\" because the file repository \"$2\" is in read-only mode.\n\nThe administrator who locked it offered this explanation: \"$3\".",
+       "invalidtitle-knownnamespace": "Invalid title with namespace \"$2\" and text \"$3\"",
+       "invalidtitle-unknownnamespace": "Invalid title with unknown namespace number $1 and text \"$2\"",
+       "exception-nologin": "Not logged in",
+       "exception-nologin-text": "Please [[Special:Userlogin|log in]] to be able to access this page or action.",
+       "exception-nologin-text-manual": "Please $1 to be able to access this page or action.",
+       "virus-badscanner": "Bad configuration: Unknown virus scanner: <em>$1</em>",
+       "virus-scanfailed": "scan failed (code $1)",
+       "virus-unknownscanner": "unknown antivirus:",
+       "logouttext": "<strong>You are now logged out.</strong>\n\nNote that some pages may continue to be displayed as if you were still logged in, until you clear your browser cache.",
+       "welcomeuser": "Welcome, $1!",
+       "welcomecreation-msg": "Your account has been created.\nYou can change your {{SITENAME}} [[Special:Preferences|preferences]] if you wish.",
+       "yourname": "Username:",
+       "userlogin-yourname": "Username",
+       "userlogin-yourname-ph": "Enter your username",
+       "createacct-another-username-ph": "Enter the username",
+       "createacct-helpusername": "",
+       "yourpassword": "Password:",
+       "userlogin-yourpassword": "Password",
+       "userlogin-yourpassword-ph": "Enter your password",
+       "createacct-yourpassword-ph": "Enter a password",
+       "yourpasswordagain": "Retype password:",
+       "createacct-yourpasswordagain": "Confirm password",
+       "createacct-yourpasswordagain-ph": "Enter password again",
+       "remembermypassword": "Remember my login on this browser (for a maximum of $1 {{PLURAL:$1|day|days}})",
+       "userlogin-remembermypassword": "Keep me logged in",
+       "userlogin-signwithsecure": "Use secure connection",
+       "yourdomainname": "Your domain:",
+       "password-change-forbidden": "You cannot change passwords on this wiki.",
+       "externaldberror": "There was either an authentication database error or you are not allowed to update your external account.",
+       "login": "Log in",
+       "nav-login-createaccount": "Log in / create account",
+       "loginprompt": "You must have cookies enabled to log in to {{SITENAME}}.",
+       "userlogin": "Log in / create account",
+       "userloginnocreate": "Log in",
+       "logout": "Log out",
+       "userlogout": "Log out",
+       "userlogout-summary": "",
+       "notloggedin": "Not logged in",
+       "userlogin-noaccount": "Don't have an account?",
+       "userlogin-joinproject": "Join {{SITENAME}}",
+       "nologin": "Don't have an account? $1.",
+       "nologinlink": "Create an account",
+       "createaccount": "Create account",
+       "gotaccount": "Already have an account? $1.",
+       "gotaccountlink": "Log in",
+       "userlogin-resetlink": "Forgotten your login details?",
+       "userlogin-resetpassword-link": "Forgot your password?",
+       "helplogin-url": "https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Logging_in",
+       "userlogin-helplink2": "Help with logging in",
+       "userlogin-loggedin": "You are already logged in as {{GENDER:$1|$1}}.\nUse the form below to log in as another user.",
+       "userlogin-createanother": "Create another account",
+       "createacct-emailrequired": "Email address",
+       "createacct-emailoptional": "Email address (optional)",
+       "createacct-email-ph": "Enter your email address",
+       "createacct-another-email-ph": "Enter email address",
+       "createaccountmail": "Use a temporary random password and send it to the specified email address",
+       "createacct-realname": "Real name (optional)",
+       "createaccountreason": "Reason:",
+       "createacct-reason": "Reason",
+       "createacct-reason-ph": "Why you are creating another account",
+       "createacct-captcha": "Security check",
+       "createacct-imgcaptcha-help": "",
+       "createacct-imgcaptcha-ph": "Enter the text you see above",
+       "createacct-submit": "Create your account",
+       "createacct-another-submit": "Create another account",
+       "createacct-benefit-heading": "{{SITENAME}} is made by people like you.",
+       "createacct-benefit-icon1": "icon-edits",
+       "createacct-benefit-head1": "{{NUMBEROFEDITS}}",
+       "createacct-benefit-body1": "{{PLURAL:$1|edit|edits}}",
+       "createacct-benefit-icon2": "icon-pages",
+       "createacct-benefit-head2": "{{NUMBEROFARTICLES}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|page|pages}}",
+       "createacct-benefit-icon3": "icon-contributors",
+       "createacct-benefit-head3": "{{NUMBEROFACTIVEUSERS}}",
+       "createacct-benefit-body3": "recent {{PLURAL:$1|contributor|contributors}}",
+       "badretype": "The passwords you entered do not match.",
+       "userexists": "Username entered already in use.\nPlease choose a different name.",
+       "loginerror": "Login error",
+       "createacct-error": "Account creation error",
+       "createaccounterror": "Could not create account: $1",
+       "nocookiesnew": "The user account was created, but you are not logged in.\n{{SITENAME}} uses cookies to log in users.\nYou have cookies disabled.\nPlease enable them, then log in with your new username and password.",
+       "nocookieslogin": "{{SITENAME}} uses cookies to log in users.\nYou have cookies disabled.\nPlease enable them and try again.",
+       "nocookiesfornew": "The user account was not created, as we could not confirm its source.\nEnsure you have cookies enabled, reload this page and try again.",
+       "nocookiesforlogin": "{{int:nocookieslogin}}",
+       "noname": "You have not specified a valid username.",
+       "loginsuccesstitle": "Login successful",
+       "loginsuccess": "<strong>You are now logged in to {{SITENAME}} as \"$1\".</strong>",
+       "nosuchuser": "There is no user by the name \"$1\".\nUsernames are case sensitive.\nCheck your spelling, or [[Special:UserLogin/signup|create a new account]].",
+       "nosuchusershort": "There is no user by the name \"$1\".\nCheck your spelling.",
+       "nouserspecified": "You have to specify a username.",
+       "login-userblocked": "This user is blocked. Login not allowed.",
+       "wrongpassword": "Incorrect password entered.\nPlease try again.",
+       "wrongpasswordempty": "Password entered was blank.\nPlease try again.",
+       "passwordtooshort": "Passwords must be at least {{PLURAL:$1|1 character|$1 characters}}.",
+       "password-name-match": "Your password must be different from your username.",
+       "password-login-forbidden": "The use of this username and password has been forbidden.",
+       "mailmypassword": "Reset password",
+       "passwordremindertitle": "New temporary password for {{SITENAME}}",
+       "passwordremindertext": "Someone (probably you, from IP address $1) requested a new\npassword for {{SITENAME}} ($4). A temporary password for user\n\"$2\" has been created and was set to \"$3\". If this was your\nintent, you will need to log in and choose a new password now.\nYour temporary password will expire in {{PLURAL:$5|one day|$5 days}}.\n\nIf someone else made this request, or if you have remembered your password,\nand you no longer wish to change it, you may ignore this message and\ncontinue using your old password.",
+       "noemail": "There is no email address recorded for user \"$1\".",
+       "noemailcreate": "You need to provide a valid email address.",
+       "passwordsent": "A new password has been sent to the email address registered for \"$1\".\nPlease log in again after you receive it.",
+       "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}}",
+       "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.",
+       "emailauthenticated": "Your email address was confirmed on $2 at $3.",
+       "emailnotauthenticated": "Your email address is not yet confirmed.\nNo email will be sent for any of the following features.",
+       "noemailprefs": "Specify an email address in your preferences for these features to work.",
+       "emailconfirmlink": "Confirm your email address",
+       "invalidemailaddress": "The email address cannot be accepted as it appears to have an invalid format.\nPlease enter a well-formatted address or empty that field.",
+       "cannotchangeemail": "Account email addresses cannot be changed on this wiki.",
+       "emaildisabled": "This site cannot send emails.",
+       "emailsender": "{{SITENAME}}",
+       "accountcreated": "Account created",
+       "accountcreatedtext": "The user account for [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) has been created.",
+       "createaccount-title": "Account creation for {{SITENAME}}",
+       "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",
+       "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.",
+       "createacct-another-realname-tip": "Real name is optional.\nIf you choose to provide it, this will be used for giving the user attribution for their work.",
+       "pt-login": "Log in",
+       "pt-login-button": "Log in",
+       "pt-createaccount": "Create account",
+       "pt-userlogout": "Log out",
+       "pear-mail-error": "$1",
+       "php-mail-error": "$1",
+       "php-mail-error-unknown": "Unknown error in PHP's mail() function.",
+       "user-mail-no-addy": "Tried to send email without an email address.",
+       "user-mail-no-body": "Tried to send email with an empty or unreasonably short body.",
+       "changepassword": "Change password",
+       "changepassword-summary": "",
+       "resetpass_announce": "To finish logging in, you must set a new password.",
+       "resetpass_text": "<!-- Add text here -->",
+       "resetpass_header": "Change account password",
+       "oldpassword": "Old password:",
+       "newpassword": "New password:",
+       "retypenew": "Retype new password:",
+       "resetpass_submit": "Set password and log in",
+       "changepassword-success": "Your password has been changed successfully!",
+       "changepassword-throttled": "You have made too many recent login attempts.\nPlease wait $1 before trying again.",
+       "resetpass_forbidden": "Passwords cannot be changed",
+       "resetpass-no-info": "You must be logged in to access this page directly.",
+       "resetpass-submit-loggedin": "Change password",
+       "resetpass-submit-cancel": "Cancel",
+       "resetpass-wrong-oldpass": "Invalid temporary or current password.\nYou may have already successfully changed your password or requested a new temporary password.",
+       "resetpass-recycled": "Please reset your password to something other than your current password.",
+       "resetpass-temp-emailed": "You logged in with a temporary emailed code.\nTo finish logging in, you must set a new password here:",
+       "resetpass-temp-password": "Temporary password:",
+       "resetpass-abort-generic": "Password change has been aborted by an extension.",
+       "resetpass-expired": "Your password has expired. Please set a new password to log in.",
+       "resetpass-expired-soft": "Your password has expired and needs to be reset. Please choose a new password now, or click \"{{int:resetpass-submit-cancel}}\" to reset it later.",
+       "resetpass-validity-soft": "Your password is not valid: $1\n\nPlease choose a new password now, or click \"{{int:resetpass-submit-cancel}}\" to reset it later.",
+       "passwordreset": "Reset password",
+       "passwordreset-text-one": "Complete this form to receive a temporary password via email.",
+       "passwordreset-text-many": "{{PLURAL:$1|Fill in one of the fields to receive a temporary password via email.}}",
+       "passwordreset-legend": "Reset password",
+       "passwordreset-disabled": "Password resets have been disabled on this wiki.",
+       "passwordreset-emaildisabled": "Email features have been disabled on this wiki.",
+       "passwordreset-username": "Username:",
+       "passwordreset-domain": "Domain:",
+       "passwordreset-capture": "View the resulting email?",
+       "passwordreset-capture-help": "If you check this box, the email (with the temporary password) will be shown to you as well as being sent to the user.",
+       "passwordreset-email": "Email address:",
+       "passwordreset-emailtitle": "Account details on {{SITENAME}}",
+       "passwordreset-emailtext-ip": "Someone (probably you, from IP address $1) requested a reset of your\npassword for {{SITENAME}} ($4). The following user {{PLURAL:$3|account is|accounts are}}\nassociated with this email address:\n\n$2\n\n{{PLURAL:$3|This temporary password|These temporary passwords}} will expire in {{PLURAL:$5|one day|$5 days}}.\nYou should log in and choose a new password now. If someone else made this\nrequest, or if you have remembered your original password, and you no longer\nwish to change it, you may ignore this message and continue using your old\npassword.",
+       "passwordreset-emailtext-user": "User $1 on {{SITENAME}} requested a reset of your password for {{SITENAME}}\n($4). The following user {{PLURAL:$3|account is|accounts are}} associated with this email address:\n\n$2\n\n{{PLURAL:$3|This temporary password|These temporary passwords}} will expire in {{PLURAL:$5|one day|$5 days}}.\nYou should log in and choose a new password now. If someone else made this\nrequest, or if you have remembered your original password, and you no longer\nwish to change it, you may ignore this message and continue using your old\npassword.",
+       "passwordreset-emailelement": "Username: $1\nTemporary password: $2",
+       "passwordreset-emailsent": "A password reset email has been sent.",
+       "passwordreset-emailsent-capture": "A password reset email has been sent, which is shown below.",
+       "passwordreset-emailerror-capture": "A password reset email was generated, which is shown below, but sending it to the {{GENDER:$2|user}} failed: $1",
+       "changeemail": "Change email address",
+       "changeemail-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-newemail": "New 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": "",
+       "resettokens-text": "You can reset tokens which allow access to certain private data associated with your account here.\n\nYou should do it if you accidentally shared them with someone or if your account has been compromised.",
+       "resettokens-no-tokens": "There are no tokens to reset.",
+       "resettokens-legend": "Reset tokens",
+       "resettokens-tokens": "Tokens:",
+       "resettokens-token-label": "$1 (current value: $2)",
+       "resettokens-watchlist-token": "Token for the web feed (Atom/RSS) of [[Special:Watchlist|changes to pages on your watchlist]]",
+       "resettokens-done": "Tokens reset.",
+       "resettokens-resetbutton": "Reset selected tokens",
+       "bold_sample": "Bold text",
+       "bold_tip": "Bold text",
+       "italic_sample": "Italic text",
+       "italic_tip": "Italic text",
+       "link_sample": "Link title",
+       "link_tip": "Internal link",
+       "extlink_sample": "http://www.example.com link title",
+       "extlink_tip": "External link (remember http:// prefix)",
+       "headline_sample": "Headline text",
+       "headline_tip": "Level 2 headline",
+       "nowiki_sample": "Insert non-formatted text here",
+       "nowiki_tip": "Ignore wiki formatting",
+       "image_sample": "Example.jpg",
+       "image_tip": "Embedded file",
+       "media_sample": "Example.ogg",
+       "media_tip": "File link",
+       "sig_tip": "Your signature with timestamp",
+       "hr_tip": "Horizontal line (use sparingly)",
+       "summary": "Summary:",
+       "subject": "Subject/headline:",
+       "minoredit": "This is a minor edit",
+       "watchthis": "Watch this page",
+       "savearticle": "Save page",
+       "preview": "Preview",
+       "showpreview": "Show preview",
+       "showdiff": "Show changes",
+       "anoneditwarning": "<strong>Warning:</strong> You are not logged in.\nYour IP address will be recorded in this page's edit history.",
+       "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.",
+       "missingcommentheader": "<strong>Reminder:</strong> You have not provided a subject/headline for this comment.\nIf you click \"{{int:savearticle}}\" again, your edit will be saved without one.",
+       "summary-preview": "Summary preview:",
+       "subject-preview": "Subject/headline preview:",
+       "blockedtitle": "User is blocked",
+       "blockedtext": "<strong>Your username or IP address has been blocked.</strong>\n\nThe block was made by $1.\nThe reason given is <em>$2</em>.\n\n* Start of block: $8\n* Expiry of block: $6\n* Intended blockee: $7\n\nYou can contact $1 or another [[{{MediaWiki:Grouppage-sysop}}|administrator]] to discuss the block.\nYou cannot use the \"email this user\" feature unless a valid email address is specified in your [[Special:Preferences|account preferences]] and you have not been blocked from using it.\nYour current IP address is $3, and the block ID is #$5.\nPlease include all above details in any queries you make.",
+       "autoblockedtext": "Your IP address has been automatically blocked because it was used by another user, who was blocked by $1.\nThe reason given is:\n\n:<em>$2</em>\n\n* Start of block: $8\n* Expiry of block: $6\n* Intended blockee: $7\n\nYou may contact $1 or one of the other [[{{MediaWiki:Grouppage-sysop}}|administrators]] to discuss the block.\n\nNote that you may not use the \"email this user\" feature unless you have a valid email address registered in your [[Special:Preferences|user preferences]] and you have not been blocked from using it.\n\nYour current IP address is $3, and the block ID is #$5.\nPlease include all above details in any queries you make.",
+       "blockednoreason": "no reason given",
+       "whitelistedittext": "Please $1 to edit pages.",
+       "confirmedittext": "You must confirm your email address before editing pages.\nPlease set and validate your email address through your [[Special:Preferences|user preferences]].",
+       "nosuchsectiontitle": "Cannot find section",
+       "nosuchsectiontext": "You tried to edit a section that does not exist.\nIt may have been moved or deleted while you were viewing the page.",
+       "loginreqtitle": "Login required",
+       "loginreqlink": "log in",
+       "loginreqpagetext": "Please $1 to view other pages.",
+       "accmailtitle": "Password sent",
+       "accmailtext": "A randomly generated password for [[User talk:$1|$1]] has been sent to $2. It can be changed on the <em>[[Special:ChangePassword|change password]]</em> page upon logging in.",
+       "newarticle": "(New)",
+       "newarticletext": "You have followed a link to a page that does not exist yet.\nTo create the page, start typing in the box below (see the [$1 help page] for more info).\nIf you are here by mistake, click your browser's <strong>back</strong> button.",
+       "newarticletextanon": "{{int:newarticletext|$1}}",
+       "talkpagetext": "<!-- MediaWiki:talkpagetext -->",
+       "anontalkpagetext": "----\n<em>This is the discussion page for an anonymous user who has not created an account yet, or who does not use it.</em>\nWe therefore have to use the numerical IP address to identify him/her.\nSuch an IP address can be shared by several users.\nIf you are an anonymous user and feel that irrelevant comments have been directed at you, please [[Special:UserLogin/signup|create an account]] or [[Special:UserLogin|log in]] to avoid future confusion with other anonymous users.",
+       "noarticletext": "There is currently no text in this page.\nYou can [[Special:Search/{{PAGENAME}}|search for this page title]] in other pages,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs],\nor [{{fullurl:{{FULLPAGENAME}}|action=edit}} edit this page]</span>.",
+       "noarticletext-nopermission": "There is currently no text in this page.\nYou can [[Special:Search/{{PAGENAME}}|search for this page title]] in other pages, or <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs]</span>, but you do not have permission to create this page.",
+       "noarticletextanon": "{{int:noarticletext}}",
+       "missing-revision": "The revision #$1 of the page named \"{{FULLPAGENAME}}\" does not exist.\n\nThis is usually caused by following an outdated history link to a page that has been deleted.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
+       "userpage-userdoesnotexist": "User account \"$1\" is not registered.\nPlease check if you want to create/edit this page.",
+       "userpage-userdoesnotexist-view": "User account \"$1\" is not registered.",
+       "blocked-notice-logextract": "This user is currently blocked.\nThe latest block log entry is provided below for reference:",
+       "clearyourcache": "<strong>Note:</strong> After saving, you may have to bypass your browser's cache to see the changes.\n* <strong>Firefox / Safari:</strong> Hold <em>Shift</em> while clicking <em>Reload</em>, or press either <em>Ctrl-F5</em> or <em>Ctrl-R</em> (<em>⌘-R</em> on a Mac)\n* <strong>Google Chrome:</strong> Press <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> on a Mac)\n* <strong>Internet Explorer:</strong> Hold <em>Ctrl</em> while clicking <em>Refresh</em>, or press <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Clear the cache in <em>Tools → Preferences</em>",
+       "usercssyoucanpreview": "<strong>Tip:</strong> Use the \"{{int:showpreview}}\" button to test your new CSS before saving.",
+       "userjsyoucanpreview": "<strong>Tip:</strong> Use the \"{{int:showpreview}}\" button to test your new JavaScript before saving.",
+       "usercsspreview": "<strong>Remember that you are only previewing your user CSS.\nIt has not yet been saved!</strong>",
+       "userjspreview": "<strong>Remember that you are only testing/previewing your user JavaScript.\nIt has not yet been saved!</strong>",
+       "sitecsspreview": "<strong>Remember that you are only previewing this CSS.\nIt has not yet been saved!</strong>",
+       "sitejspreview": "<strong>Remember that you are only previewing this JavaScript code.\nIt has not yet been saved!</strong>",
+       "userinvalidcssjstitle": "<strong>Warning:</strong> There is no skin \"$1\".\nCustom .css and .js pages use a lowercase title, e.g. {{ns:user}}:Foo/vector.css as opposed to {{ns:user}}:Foo/Vector.css.",
+       "updated": "(Updated)",
+       "note": "<strong>Note:</strong>",
+       "previewnote": "<strong>Remember that this is only a preview.</strong>\nYour changes have not yet been saved!",
+       "continue-editing": "Go to editing area",
+       "previewconflict": "This preview reflects the text in the upper text editing area as it will appear if you choose to save.",
+       "session_fail_preview": "<strong>Sorry! We could not process your edit due to a loss of session data.</strong>\nPlease try again.\nIf it still does not work, try [[Special:UserLogout|logging out]] and logging back in.",
+       "session_fail_preview_html": "<strong>Sorry! We could not process your edit due to a loss of session data.</strong>\n\n<em>Because {{SITENAME}} has raw HTML enabled, the preview is hidden as a precaution against JavaScript attacks.</em>\n\n<strong>If this is a legitimate edit attempt, please try again.</strong>\nIf it still does not work, try [[Special:UserLogout|logging out]] and logging back in.",
+       "token_suffix_mismatch": "<strong>Your edit has been rejected because your client mangled the punctuation characters in the edit token.</strong>\nThe edit has been rejected to prevent corruption of the page text.\nThis sometimes happens when you are using a buggy web-based anonymous proxy service.",
+       "edit_form_incomplete": "<strong>Some parts of the edit form did not reach the server; double-check that your edits are intact and try again.</strong>",
+       "editing": "Editing $1",
+       "creating": "Creating $1",
+       "editingsection": "Editing $1 (section)",
+       "editingcomment": "Editing $1 (new section)",
+       "editconflict": "Edit conflict: $1",
+       "explainconflict": "Someone else has changed this page since you started editing it.\nThe upper text area contains the page text as it currently exists.\nYour changes are shown in the lower text area.\nYou will have to merge your changes into the existing text.\n<strong>Only</strong> the text in the upper text area will be saved when you press \"{{int:savearticle}}\".",
+       "yourtext": "Your text",
+       "storedversion": "Stored revision",
+       "nonunicodebrowser": "<strong>Warning: Your browser is not Unicode compliant.</strong>\nA workaround is in place to allow you to safely edit pages: Non-ASCII characters will appear in the edit box as hexadecimal codes.",
+       "editingold": "<strong>Warning: You are editing an out-of-date revision of this page.</strong>\nIf you save it, any changes made since this revision will be lost.",
+       "yourdiff": "Differences",
+       "copyrightwarning": "Please note that all contributions to {{SITENAME}} are considered to be released under the $2 (see $1 for details).\nIf you do not want your writing to be edited mercilessly and redistributed at will, then do not submit it here.<br />\nYou are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource.\n<strong>Do not submit copyrighted work without permission!</strong>",
+       "copyrightwarning2": "Please note that all contributions to {{SITENAME}} may be edited, altered, or removed by other contributors.\nIf you do not want your writing to be edited mercilessly, then do not submit it here.<br />\nYou are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see $1 for details).\n<strong>Do not submit copyrighted work without permission!</strong>",
+       "editpage-head-copy-warn": "-",
+       "editpage-tos-summary": "-",
+       "longpage-hint": "-",
+       "longpageerror": "<strong>Error: The text you have submitted is {{PLURAL:$1|one kilobyte|$1 kilobytes}} long, which is longer than the maximum of {{PLURAL:$2|one kilobyte|$2 kilobytes}}.</strong>\nIt cannot be saved.",
+       "readonlywarning": "<strong>Warning: The database has been locked for maintenance, so you will not be able to save your edits right now.</strong>\nYou may wish to copy and paste your text into a text file and save it for later.\n\nThe administrator who locked it offered this explanation: $1",
+       "protectedpagewarning": "<strong>Warning: This page has been protected so that only users with administrator privileges can edit it.</strong>\nThe latest log entry is provided below for reference:",
+       "semiprotectedpagewarning": "<strong>Note:</strong> This page has been protected so that only registered users can edit it.\nThe latest log entry is provided below for reference:",
+       "cascadeprotectedwarning": "<strong>Warning:</strong> This page has been protected so that only users with administrator privileges can edit it because it is included in the following cascade-protected {{PLURAL:$1|page|pages}}:",
+       "titleprotectedwarning": "<strong>Warning: This page has been protected so that [[Special:ListGroupRights|specific rights]] are needed to create it.</strong>\nThe latest log entry is provided below for reference:",
+       "templatesused": "{{PLURAL:$1|Template|Templates}} used on this page:",
+       "templatesusedpreview": "{{PLURAL:$1|Template|Templates}} used in this preview:",
+       "templatesusedsection": "{{PLURAL:$1|Template|Templates}} used in this section:",
+       "template-protected": "(protected)",
+       "template-semiprotected": "(semi-protected)",
+       "hiddencategories": "This page is a member of {{PLURAL:$1|1 hidden category|$1 hidden categories}}:",
+       "edittools": "<!-- Text here will be shown below edit and upload forms. -->",
+       "edittools-upload": "-",
+       "nocreatetext": "{{SITENAME}} has restricted the ability to create new pages.\nYou can go back and edit an existing page, or [[Special:UserLogin|log in or create an account]].",
+       "nocreate-loggedin": "You do not have permission to create new pages.",
+       "sectioneditnotsupported-title": "Section editing not supported",
+       "sectioneditnotsupported-text": "Section editing is not supported in this page.",
+       "permissionserrors": "Permission error",
+       "permissionserrorstext": "You do not have permission to do that, for the following {{PLURAL:$1|reason|reasons}}:",
+       "permissionserrorstext-withaction": "You do not have permission to $2, for the following {{PLURAL:$1|reason|reasons}}:",
+       "recreate-moveddeleted-warn": "<strong>Warning: You are recreating a page that was previously deleted.</strong>\n\nYou should consider whether it is appropriate to continue editing this page.\nThe deletion and move log for this page are provided here for convenience:",
+       "moveddeleted-notice": "This page has been deleted.\nThe deletion and move log for the page are provided below for reference.",
+       "log-fulllog": "View full log",
+       "edit-hook-aborted": "Edit aborted by hook.\nIt gave no explanation.",
+       "edit-gone-missing": "Could not update the page.\nIt appears to have been deleted.",
+       "edit-conflict": "Edit conflict.",
+       "edit-no-change": "Your edit was ignored because no change was made to the text.",
+       "postedit-confirmation-created": "The page has been created.",
+       "postedit-confirmation-restored": "The page has been restored.",
+       "postedit-confirmation-saved": "Your edit was saved.",
+       "edit-already-exists": "Could not create a new page.\nIt already exists.",
+       "addsection-preload": "",
+       "addsection-editintro": "",
+       "defaultmessagetext": "Default message text",
+       "content-failed-to-parse": "Failed to parse $2 content for $1 model: $3",
+       "invalid-content-data": "Invalid content data",
+       "content-not-allowed-here": "\"$1\" content is not allowed on page [[$2]]",
+       "editwarning-warning": "Leaving this page may cause you to lose any changes you have made.\nIf you are logged in, you can disable this warning in the \"{{int:prefs-editing}}\" section of your preferences.",
+       "editpage-notsupportedcontentformat-title": "Content format not supported",
+       "editpage-notsupportedcontentformat-text": "The content format $1 is not supported by the content model $2.",
+       "content-model-wikitext": "wikitext",
+       "content-model-text": "plain text",
+       "content-model-javascript": "JavaScript",
+       "content-model-css": "CSS",
+       "expensive-parserfunction-warning": "<strong>Warning:</strong> This page contains too many expensive parser function calls.\n\nIt should have less than $2 {{PLURAL:$2|call|calls}}, there {{PLURAL:$1|is now $1 call|are now $1 calls}}.",
+       "expensive-parserfunction-category": "Pages with too many expensive parser function calls",
+       "post-expand-template-inclusion-warning": "<strong>Warning:</strong> Template include size is too large.\nSome templates will not be included.",
+       "post-expand-template-inclusion-category": "Pages where template include size is exceeded",
+       "post-expand-template-argument-warning": "<strong>Warning:</strong> This page contains at least one template argument that has a too large expansion size.\nThese arguments have been omitted.",
+       "post-expand-template-argument-category": "Pages containing omitted template arguments",
+       "parser-template-loop-warning": "Template loop detected: [[$1]]",
+       "parser-template-recursion-depth-warning": "Template recursion depth limit exceeded ($1)",
+       "language-converter-depth-warning": "Language converter depth limit exceeded ($1)",
+       "node-count-exceeded-category": "Pages where node-count is exceeded",
+       "node-count-exceeded-category-desc": "A category for pages where the node-count is exceeded.",
+       "node-count-exceeded-warning": "Page exceeded the node-count",
+       "expansion-depth-exceeded-category": "Pages where expansion depth is exceeded",
+       "expansion-depth-exceeded-category-desc": "This is a category for pages where the expansion depth is exceeded.",
+       "expansion-depth-exceeded-warning": "Page exceeded the expansion depth",
+       "parser-unstrip-loop-warning": "Unstrip loop detected",
+       "parser-unstrip-recursion-limit": "Unstrip recursion limit exceeded ($1)",
+       "converter-manual-rule-error": "Error detected in manual language conversion rule",
+       "undo-success": "The edit can be undone.\nPlease check the comparison below to verify that this is what you want to do, and then save the changes below to finish undoing the edit.",
+       "undo-failure": "The edit could not be undone due to conflicting intermediate edits.",
+       "undo-norev": "The edit could not be undone because it does not exist or was deleted.",
+       "undo-nochange": "The edit appears to have already been undone.",
+       "undo-summary": "Undo revision $1 by [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]])",
+       "undo-summary-username-hidden": "Undo revision $1 by a hidden user",
+       "cantcreateaccounttitle": "Cannot create account",
+       "cantcreateaccount-text": "Account creation from this IP address (<strong>$1</strong>) has been blocked by [[User:$3|$3]].\n\nThe reason given by $3 is <em>$2</em>",
+       "cantcreateaccount-range-text": "Account creation from IP addresses in the range '''$1''', which includes your IP address ('''$4'''), has been blocked by [[User:$3|$3]].\n\nThe reason given by $3 is ''$2''",
+       "createaccount-hook-aborted": "$1",
+       "viewpagelogs": "View logs for this page",
+       "nohistory": "There is no edit history for this page.",
+       "currentrev": "Latest revision",
+       "currentrev-asof": "Latest revision as of $1",
+       "revisionasof": "Revision as of $1",
+       "revision-info": "Revision as of $1 by $2",
+       "revision-info-current": "-",
+       "revision-nav": "($1) $2{{int:pipe-separator}}$3 ($4){{int:pipe-separator}}$5 ($6)",
+       "previousrevision": "← Older revision",
+       "nextrevision": "Newer revision →",
+       "currentrevisionlink": "Latest revision",
+       "cur": "cur",
+       "next": "next",
+       "last": "prev",
+       "page_first": "first",
+       "page_last": "last",
+       "histlegend": "Diff selection: Mark the radio boxes of the revisions to compare and hit enter or the button at the bottom.<br />\nLegend: <strong>({{int:cur}})</strong> = difference with latest revision, <strong>({{int:last}})</strong> = difference with preceding revision, <strong>{{int:minoreditletter}}</strong> = minor edit.",
+       "history-fieldset-title": "Browse history",
+       "history-show-deleted": "Deleted only",
+       "history_copyright": "-",
+       "histfirst": "oldest",
+       "histlast": "newest",
+       "historysize": "({{PLURAL:$1|1 byte|$1 bytes}})",
+       "historyempty": "(empty)",
+       "history-feed-title": "Revision history",
+       "history-feed-description": "Revision history for this page on the wiki",
+       "history-feed-item-nocomment": "$1 at $2",
+       "history-feed-empty": "The requested page does not exist.\nIt may have been deleted from the wiki, or renamed.\nTry [[Special:Search|searching on the wiki]] for relevant new pages.",
+       "rev-deleted-comment": "(edit summary removed)",
+       "rev-deleted-user": "(username removed)",
+       "rev-deleted-event": "(log action removed)",
+       "rev-deleted-user-contribs": "[username or IP address removed - edit hidden from contributions]",
+       "rev-deleted-text-permission": "This page revision has been <strong>deleted</strong>.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
+       "rev-deleted-text-unhide": "This page revision has been <strong>deleted</strong>.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].\nYou can still [$1 view this revision] if you wish to proceed.",
+       "rev-suppressed-text-unhide": "This page revision has been <strong>suppressed</strong>.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].\nYou can still [$1 view this revision] if you wish to proceed.",
+       "rev-deleted-text-view": "This page revision has been <strong>deleted</strong>.\nYou can view it; details can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
+       "rev-suppressed-text-view": "This page revision has been <strong>suppressed</strong>.\nYou can view it; details can be found in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].",
+       "rev-deleted-no-diff": "You cannot view this diff because one of the revisions has been <strong>deleted</strong>.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
+       "rev-suppressed-no-diff": "You cannot view this diff because one of the revisions has been <strong>deleted</strong>.",
+       "rev-deleted-unhide-diff": "One of the revisions of this diff has been <strong>deleted</strong>.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].\nYou can still [$1 view this diff] if you wish to proceed.",
+       "rev-suppressed-unhide-diff": "One of the revisions of this diff has been <strong>suppressed</strong>.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].\nYou can still [$1 view this diff] if you wish to proceed.",
+       "rev-deleted-diff-view": "One of the revisions of this diff has been <strong>deleted</strong>.\nYou can view this diff; details can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
+       "rev-suppressed-diff-view": "One of the revisions of this diff has been <strong>suppressed</strong>.\nYou can view this diff; details can be found in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].",
+       "rev-delundel": "change visibility",
+       "rev-showdeleted": "show",
+       "revisiondelete": "Delete/undelete revisions",
+       "revdelete-nooldid-title": "Invalid target revision",
+       "revdelete-nooldid-text": "You have either not specified a target revision(s) to perform this\nfunction, the specified revision does not exist, or you are attempting to hide the current revision.",
+       "revdelete-no-file": "The file specified does not exist.",
+       "revdelete-show-file-confirm": "Are you sure you want to view a deleted revision of the file \"<nowiki>$1</nowiki>\" from $2 at $3?",
+       "revdelete-show-file-submit": "Yes",
+       "revdelete-selected-text": "{{PLURAL:$1|Selected revision|Selected revisions}} of [[:$2]]:",
+       "revdelete-selected-file": "{{PLURAL:$1|Selected file version|Selected file versions}} of [[:$2]]:",
+       "logdelete-selected": "{{PLURAL:$1|Selected log event|Selected log events}}:",
+       "revdelete-text-text": "Deleted revisions will still appear in the page history, but parts of their content will be inaccessible to the public.",
+       "revdelete-text-file": "Deleted file versions will still appear in the file history, but parts of their content will be inaccessible to the public.",
+       "logdelete-text": "Deleted log events will still appear in the logs, but parts of their content will be inaccessible to the public.",
+       "revdelete-text-others": "Other administrators on {{SITENAME}} will still be able to access the hidden content and can undelete it again through this same interface, unless additional restrictions are set.",
+       "revdelete-confirm": "Please 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]].",
+       "revdelete-suppress-text": "Suppression should <strong>only</strong> be used for the following cases:\n* potentially libelous information\n* inappropriate personal information\n*: <em>home addresses and telephone numbers, national identification numbers, etc.</em>",
+       "revdelete-legend": "Set visibility restrictions",
+       "revdelete-hide-text": "Revision text",
+       "revdelete-hide-image": "Hide file content",
+       "revdelete-hide-name": "Hide action and target",
+       "revdelete-hide-comment": "Edit summary",
+       "revdelete-hide-user": "Editor's username/IP address",
+       "revdelete-hide-restricted": "Suppress data from administrators as well as others",
+       "revdelete-radio-same": "(do not change)",
+       "revdelete-radio-set": "Hidden",
+       "revdelete-radio-unset": "Visible",
+       "revdelete-suppress": "Suppress data from administrators as well as others",
+       "revdelete-unsuppress": "Remove restrictions on restored revisions",
+       "revdelete-log": "Reason:",
+       "revdelete-submit": "Apply to selected {{PLURAL:$1|revision|revisions}}",
+       "revdelete-success": "<strong>Revision visibility successfully updated.</strong>",
+       "revdelete-failure": "<strong>Revision visibility could not be updated:</strong>\n$1",
+       "logdelete-success": "<strong>Log visibility successfully set.</strong>",
+       "logdelete-failure": "<strong>Log visibility could not be set:</strong>\n$1",
+       "revdel-restore": "change visibility",
+       "pagehist": "Page history",
+       "deletedhist": "Deleted history",
+       "revdelete-hide-current": "Error hiding the item dated $2, $1: This is the current revision.\nIt cannot be hidden.",
+       "revdelete-show-no-access": "Error showing the item dated $2, $1: This item has been marked \"restricted\".\nYou do not have access to it.",
+       "revdelete-modify-no-access": "Error modifying the item dated $2, $1: This item has been marked \"restricted\".\nYou do not have access to it.",
+       "revdelete-modify-missing": "Error modifying item ID $1: It is missing from the database!",
+       "revdelete-no-change": "<strong>Warning:</strong> The item dated $2, $1 already had the requested visibility settings.",
+       "revdelete-concurrent-change": "Error modifying the item dated $2, $1: Its status appears to have been changed by someone else while you attempted to modify it.\nPlease check the logs.",
+       "revdelete-only-restricted": "Error hiding the item dated $2, $1: You cannot suppress items from view by administrators without also selecting one of the other visibility options.",
+       "revdelete-reason-dropdown": "*Common delete reasons\n** Copyright violation\n** Inappropriate comment or personal information\n** Inappropriate username\n** Potentially libelous information",
+       "revdelete-otherreason": "Other/additional reason:",
+       "revdelete-reasonotherlist": "Other reason",
+       "revdelete-edit-reasonlist": "Edit delete reasons",
+       "revdelete-offender": "Revision author:",
+       "suppressionlog": "Suppression log",
+       "suppressionlogtext": "Below is a list of deletions and blocks involving content hidden from administrators.\nSee the [[Special:BlockList|block list]] for the list of currently operational bans and blocks.",
+       "mergehistory": "Merge page histories",
+       "mergehistory-header": "This page lets you merge revisions of the history of one source page into a newer page.\nMake sure that this change will maintain historical page continuity.",
+       "mergehistory-box": "Merge revisions of two pages:",
+       "mergehistory-from": "Source page:",
+       "mergehistory-into": "Destination page:",
+       "mergehistory-list": "Mergeable edit history",
+       "mergehistory-merge": "The following revisions of [[:$1]] can be merged into [[:$2]].\nUse the radio button column to merge in only the revisions created at and before the specified time.\nNote that using the navigation links will reset this column.",
+       "mergehistory-go": "Show mergeable edits",
+       "mergehistory-submit": "Merge revisions",
+       "mergehistory-empty": "No revisions can be merged.",
+       "mergehistory-success": "$3 {{PLURAL:$3|revision|revisions}} of [[:$1]] successfully merged into [[:$2]].",
+       "mergehistory-fail": "Unable to perform history merge, please recheck the page and time parameters.",
+       "mergehistory-no-source": "Source page $1 does not exist.",
+       "mergehistory-no-destination": "Destination page $1 does not exist.",
+       "mergehistory-invalid-source": "Source page must be a valid title.",
+       "mergehistory-invalid-destination": "Destination page must be a valid title.",
+       "mergehistory-autocomment": "Merged [[:$1]] into [[:$2]]",
+       "mergehistory-comment": "Merged [[:$1]] into [[:$2]]: $3",
+       "mergehistory-same-destination": "Source and destination pages cannot be the same",
+       "mergehistory-reason": "Reason:",
+       "mergehistory-revisionrow": "$1 ($2) $3 . . $4 $5 $6",
+       "mergelog": "Merge log",
+       "pagemerge-logentry": "merged [[$1]] into [[$2]] (revisions up to $3)",
+       "revertmerge": "Unmerge",
+       "mergelogpagetext": "Below is a list of the most recent merges of one page history into another.",
+       "history-title": "Revision history of \"$1\"",
+       "difference-title": "Difference between revisions of \"$1\"",
+       "difference-title-multipage": "Difference between pages \"$1\" and \"$2\"",
+       "difference-multipage": "(Difference between pages)",
+       "lineno": "Line $1:",
+       "compareselectedversions": "Compare selected revisions",
+       "showhideselectedversions": "Change visibility of selected revisions",
+       "editundo": "undo",
+       "diff-empty": "(No difference)",
+       "diff-multi-sameuser": "({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} by the same user not shown)",
+       "diff-multi-otherusers": "({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} by {{PLURAL:$2|one other user|$2 users}} not shown)",
+       "diff-multi-manyusers": "({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} by more than $2 {{PLURAL:$2|user|users}} not shown)",
+       "difference-missing-revision": "{{PLURAL:$2|One revision|$2 revisions}} of this difference ($1) {{PLURAL:$2|was|were}} not found.\n\nThis is usually caused by following an outdated diff link to a page that has been deleted.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
+       "search-summary": "",
+       "searchresults": "Search results",
+       "searchresults-title": "Search results for \"$1\"",
+       "toomanymatches": "Too many matches were returned, please try a different query",
+       "titlematches": "Page title matches",
+       "textmatches": "Page text matches",
+       "notextmatches": "No page text matches",
+       "prevn": "previous {{PLURAL:$1|$1}}",
+       "nextn": "next {{PLURAL:$1|$1}}",
+       "prevn-title": "Previous $1 {{PLURAL:$1|result|results}}",
+       "nextn-title": "Next $1 {{PLURAL:$1|result|results}}",
+       "shown-title": "Show $1 {{PLURAL:$1|result|results}} per page",
+       "viewprevnext": "View ($1 {{int:pipe-separator}} $2) ($3)",
+       "searchmenu-exists": "<strong>There is a page named \"[[:$1]]\" on this wiki.</strong> {{PLURAL:$2|0=|See also the other search results found.}}",
+       "searchmenu-new": "<strong>Create the page \"[[:$1]]\" on this wiki!</strong> {{PLURAL:$2|0=|See also the page found with your search.|See also the search results found.}}",
+       "searchmenu-new-nocreate": "",
+       "searchprofile-articles": "Content pages",
+       "searchprofile-images": "Multimedia",
+       "searchprofile-everything": "Everything",
+       "searchprofile-advanced": "Advanced",
+       "searchprofile-articles-tooltip": "Search in $1",
+       "searchprofile-images-tooltip": "Search for files",
+       "searchprofile-everything-tooltip": "Search all of content (including talk pages)",
+       "searchprofile-advanced-tooltip": "Search in custom namespaces",
+       "search-result-size": "$1 ({{PLURAL:$2|1 word|$2 words}})",
+       "search-result-category-size": "{{PLURAL:$1|1 member|$1 members}} ({{PLURAL:$2|1 subcategory|$2 subcategories}}, {{PLURAL:$3|1 file|$3 files}})",
+       "search-result-score": "Relevance: $1%",
+       "search-redirect": "(redirect $1)",
+       "search-section": "(section $1)",
+       "search-file-match": "(matches file content)",
+       "search-suggest": "Did you mean: $1",
+       "search-interwiki-caption": "Sister projects",
+       "search-interwiki-default": "Results from $1:",
+       "search-interwiki-custom": "",
+       "search-interwiki-more": "(more)",
+       "search-relatedarticle": "Related",
+       "searcheverything-enable": "Search in all namespaces",
+       "searchrelated": "related",
+       "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>.",
+       "showingresultsnum": "Showing below {{PLURAL:$3|<strong>1</strong> result|<strong>$3</strong> results}} starting with #<strong>$2</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-nonefound": "There were no results matching the query.",
+       "powersearch-legend": "Advanced search",
+       "powersearch-ns": "Search in namespaces:",
+       "powersearch-togglelabel": "Check:",
+       "powersearch-toggleall": "All",
+       "powersearch-togglenone": "None",
+       "search-external": "External search",
+       "searchdisabled": "{{SITENAME}} search is disabled.\nYou can search via Google in the meantime.\nNote that their indexes of {{SITENAME}} content may be out of date.",
+       "googlesearch": "<form method=\"get\" action=\"//www.google.com/search\" id=\"googlesearch\">\n\t<input type=\"hidden\" name=\"domains\" value=\"{{SERVER}}\" />\n\t<input type=\"hidden\" name=\"num\" value=\"50\" />\n\t<input type=\"hidden\" name=\"ie\" value=\"$2\" />\n\t<input type=\"hidden\" name=\"oe\" value=\"$2\" />\n\n\t<input type=\"text\" name=\"q\" size=\"31\" maxlength=\"255\" value=\"$1\" />\n\t<input type=\"submit\" name=\"btnG\" value=\"$3\" />\n  <div>\n\t<input type=\"radio\" name=\"sitesearch\" id=\"gwiki\" value=\"{{SERVER}}\" checked=\"checked\" /><label for=\"gwiki\">{{SITENAME}}</label>\n\t<input type=\"radio\" name=\"sitesearch\" id=\"gWWW\" value=\"\" /><label for=\"gWWW\">WWW</label>\n  </div>\n</form>",
+       "search-error": "An error has occurred while searching: $1",
+       "opensearch-desc": "{{SITENAME}} ({{CONTENTLANGUAGE}})",
+       "preferences": "Preferences",
+       "preferences-summary": "",
+       "mypreferences": "Preferences",
+       "prefs-edits": "Number of edits:",
+       "prefsnologintext2": "Please $1 to change your preferences.",
+       "prefs-skin": "Skin",
+       "skin-preview": "Preview",
+       "datedefault": "No preference",
+       "prefs-labs": "Labs features",
+       "prefs-user-pages": "User pages",
+       "prefs-personal": "User profile",
+       "prefs-rc": "Recent changes",
+       "prefs-watchlist": "Watchlist",
+       "prefs-watchlist-days": "Days to show in watchlist:",
+       "prefs-watchlist-days-max": "Maximum $1 {{PLURAL:$1|day|days}}",
+       "prefs-watchlist-edits": "Maximum number of changes to show in expanded watchlist:",
+       "prefs-watchlist-edits-max": "Maximum number: 1000",
+       "prefs-watchlist-token": "Watchlist token:",
+       "prefs-misc": "Misc",
+       "prefs-resetpass": "Change password",
+       "prefs-changeemail": "Change email address",
+       "prefs-setemail": "Set an email address",
+       "prefs-email": "Email options",
+       "prefs-rendering": "Appearance",
+       "saveprefs": "Save",
+       "restoreprefs": "Restore all default settings (in all sections)",
+       "prefs-editing": "Editing",
+       "rows": "Rows:",
+       "columns": "Columns:",
+       "searchresultshead": "Search",
+       "stub-threshold": "Threshold for <a href=\"#\" class=\"stub\">stub link</a> formatting (bytes):",
+       "stub-threshold-disabled": "Disabled",
+       "recentchangesdays": "Days to show in recent changes:",
+       "recentchangesdays-max": "Maximum $1 {{PLURAL:$1|day|days}}",
+       "recentchangescount": "Number of edits to show by default:",
+       "prefs-help-recentchangescount": "This includes recent changes, page histories, and logs.",
+       "prefs-help-watchlist-token2": "This is the secret key to the web feed of your watchlist.\nAnyone who knows it will be able to read your watchlist, so do not share it.\nIf you need to, [[Special:ResetTokens|you can reset it]].",
+       "savedprefs": "Your preferences have been saved.",
+       "timezonelegend": "Time zone:",
+       "localtime": "Local time:",
+       "timezoneuseserverdefault": "Use wiki default ($1)",
+       "timezoneuseoffset": "Other (specify offset)",
+       "servertime": "Server time:",
+       "guesstimezone": "Fill in from browser",
+       "timezoneregion-africa": "Africa",
+       "timezoneregion-america": "America",
+       "timezoneregion-antarctica": "Antarctica",
+       "timezoneregion-arctic": "Arctic",
+       "timezoneregion-asia": "Asia",
+       "timezoneregion-atlantic": "Atlantic Ocean",
+       "timezoneregion-australia": "Australia",
+       "timezoneregion-europe": "Europe",
+       "timezoneregion-indian": "Indian Ocean",
+       "timezoneregion-pacific": "Pacific Ocean",
+       "allowemail": "Enable email from other users",
+       "prefs-searchoptions": "Search",
+       "prefs-namespaces": "Namespaces",
+       "defaultns": "Otherwise search in these namespaces:",
+       "default": "default",
+       "prefs-files": "Files",
+       "prefs-custom-css": "Custom CSS",
+       "prefs-custom-js": "Custom JavaScript",
+       "prefs-common-css-js": "Shared CSS/JavaScript for all skins:",
+       "prefs-reset-intro": "You can use this page to reset your preferences to the site defaults.\nThis cannot be undone.",
+       "prefs-emailconfirm-label": "Email confirmation:",
+       "youremail": "Email:",
+       "username": "{{GENDER:$1|Username}}:",
+       "prefs-memberingroups": "{{GENDER:$2|Member}} of {{PLURAL:$1|group|groups}}:",
+       "prefs-memberingroups-type": "$1",
+       "prefs-registration": "Registration time:",
+       "prefs-registration-date-time": "$1",
+       "yourrealname": "Real name:",
+       "yourlanguage": "Language:",
+       "yourvariant": "Content language variant:",
+       "prefs-help-variant": "Your preferred variant or orthography to display the content pages of this wiki in.",
+       "yournick": "New signature:",
+       "prefs-help-signature": "Comments on talk pages should be signed with \"<nowiki>~~~~</nowiki>\", which will be converted into your signature and a timestamp.",
+       "badsig": "Invalid raw signature.\nCheck HTML tags.",
+       "badsiglength": "Your signature is too long.\nIt must not be more than $1 {{PLURAL:$1|character|characters}} long.",
+       "yourgender": "How do you prefer to be described?",
+       "gender-unknown": "I prefer not to say",
+       "gender-male": "He edits wiki pages",
+       "gender-female": "She edits wiki pages",
+       "prefs-help-gender": "Setting this preference is optional.\nThe software uses its value to address you and to mention you to others using the appropriate grammatical gender.\nThis information will be public.",
+       "email": "Email",
+       "prefs-help-realname": "Real name is optional.\nIf you choose to provide it, this will be used for giving you attribution for your work.",
+       "prefs-help-email": "Email address is optional, but is needed for password resets, should you forget your password.",
+       "prefs-help-email-others": "You can also choose to let others contact you by email through a link on your user or talk page.\nYour email address is not revealed when other users contact you.",
+       "prefs-help-email-required": "Email address is required.",
+       "prefs-info": "Basic information",
+       "prefs-i18n": "Internationalisation",
+       "prefs-signature": "Signature",
+       "prefs-dateformat": "Date format",
+       "prefs-timeoffset": "Time offset",
+       "prefs-advancedediting": "General options",
+       "prefs-editor": "Editor",
+       "prefs-preview": "Preview",
+       "prefs-advancedrc": "Advanced options",
+       "prefs-advancedrendering": "Advanced options",
+       "prefs-advancedsearchoptions": "Advanced options",
+       "prefs-advancedwatchlist": "Advanced options",
+       "prefs-displayrc": "Display options",
+       "prefs-displaywatchlist": "Display options",
+       "prefs-tokenwatchlist": "Token",
+       "prefs-diffs": "Diffs",
+       "prefs-help-prefershttps": "This preference will take effect on your next login.",
+       "prefs-tabs-navigation-hint": "Tip: You can use the left and right arrow keys to navigate between the tabs in the tabs list.",
+       "email-address-validity-valid": "Email address appears valid",
+       "email-address-validity-invalid": "Enter a valid email address",
+       "userrights": "User rights management",
+       "userrights-summary": "",
+       "userrights-lookup-user": "Manage user groups",
+       "userrights-user-editname": "Enter a username:",
+       "editusergroup": "Edit user groups",
+       "editinguser": "Changing user rights of user <strong>[[User:$1|$1]]</strong> $2",
+       "userrights-editusergroup": "Edit user groups",
+       "saveusergroups": "Save user groups",
+       "userrights-groupsmember": "Member of:",
+       "userrights-groupsmember-auto": "Implicit member of:",
+       "userrights-groupsmember-type": "$1",
+       "userrights-groups-help": "You may alter the groups this user is in:\n* A checked box means the user is in that group.\n* An unchecked box means the user is not in that group.\n* A * indicates that you cannot remove the group once you have added it, or vice versa.",
+       "userrights-reason": "Reason:",
+       "userrights-no-interwiki": "You do not have permission to edit user rights on other wikis.",
+       "userrights-nodatabase": "Database $1 does not exist or is not local.",
+       "userrights-nologin": "You must [[Special:UserLogin|log in]] with an administrator account to assign user rights.",
+       "userrights-notallowed": "You do not have permission to add or remove user rights.",
+       "userrights-changeable-col": "Groups you can change",
+       "userrights-unchangeable-col": "Groups you cannot change",
+       "userrights-irreversible-marker": "$1*",
+       "userrights-conflict": "Conflict of user rights changes! Please review and confirm your changes.",
+       "userrights-removed-self": "You successfully removed your own rights. As such, you are no longer able to access this page.",
+       "group": "Group:",
+       "group-user": "Users",
+       "group-autoconfirmed": "Autoconfirmed users",
+       "group-bot": "Bots",
+       "group-sysop": "Administrators",
+       "group-bureaucrat": "Bureaucrats",
+       "group-suppress": "Oversights",
+       "group-all": "(all)",
+       "group-user-member": "{{GENDER:$1|user}}",
+       "group-autoconfirmed-member": "{{GENDER:$1|autoconfirmed user}}",
+       "group-bot-member": "{{GENDER:$1|bot}}",
+       "group-sysop-member": "{{GENDER:$1|administrator}}",
+       "group-bureaucrat-member": "{{GENDER:$1|bureaucrat}}",
+       "group-suppress-member": "{{GENDER:$1|oversight}}",
+       "grouppage-user": "{{ns:project}}:Users",
+       "grouppage-autoconfirmed": "{{ns:project}}:Autoconfirmed users",
+       "grouppage-bot": "{{ns:project}}:Bots",
+       "grouppage-sysop": "{{ns:project}}:Administrators",
+       "grouppage-bureaucrat": "{{ns:project}}:Bureaucrats",
+       "grouppage-suppress": "{{ns:project}}:Oversight",
+       "right-read": "Read pages",
+       "right-edit": "Edit pages",
+       "right-createpage": "Create pages (which are not discussion pages)",
+       "right-createtalk": "Create discussion pages",
+       "right-createaccount": "Create new user accounts",
+       "right-minoredit": "Mark edits as minor",
+       "right-move": "Move pages",
+       "right-move-subpages": "Move pages with their subpages",
+       "right-move-rootuserpages": "Move root user pages",
+       "right-move-categorypages": "Move category pages",
+       "right-movefile": "Move files",
+       "right-suppressredirect": "Not create redirects from source pages when moving pages",
+       "right-upload": "Upload files",
+       "right-reupload": "Overwrite existing files",
+       "right-reupload-own": "Overwrite existing files uploaded by oneself",
+       "right-reupload-shared": "Override files on the shared media repository locally",
+       "right-upload_by_url": "Upload files from a URL",
+       "right-purge": "Purge the site cache for a page without confirmation",
+       "right-autoconfirmed": "Not be affected by IP-based rate limits",
+       "right-bot": "Be treated as an automated process",
+       "right-nominornewtalk": "Not have minor edits to discussion pages trigger the new messages prompt",
+       "right-apihighlimits": "Use higher limits in API queries",
+       "right-writeapi": "Use of the write API",
+       "right-delete": "Delete pages",
+       "right-bigdelete": "Delete pages with large histories",
+       "right-deletelogentry": "Delete and undelete specific log entries",
+       "right-deleterevision": "Delete and undelete specific revisions of pages",
+       "right-deletedhistory": "View deleted history entries, without their associated text",
+       "right-deletedtext": "View deleted text and changes between deleted revisions",
+       "right-browsearchive": "Search deleted pages",
+       "right-undelete": "Undelete a page",
+       "right-suppressrevision": "Review and restore revisions hidden from administrators",
+       "right-suppressionlog": "View private logs",
+       "right-block": "Block other users from editing",
+       "right-blockemail": "Block a user from sending email",
+       "right-hideuser": "Block a username, hiding it from the public",
+       "right-ipblock-exempt": "Bypass IP blocks, auto-blocks and range blocks",
+       "right-proxyunbannable": "Bypass automatic blocks of proxies",
+       "right-unblockself": "Unblock oneself",
+       "right-protect": "Change protection levels and edit cascade-protected pages",
+       "right-editprotected": "Edit pages protected as \"{{int:protect-level-sysop}}\"",
+       "right-editsemiprotected": "Edit pages protected as \"{{int:protect-level-autoconfirmed}}\"",
+       "right-editinterface": "Edit the user interface",
+       "right-editusercssjs": "Edit other users' CSS and JavaScript files",
+       "right-editusercss": "Edit other users' CSS files",
+       "right-edituserjs": "Edit other users' JavaScript files",
+       "right-editmyusercss": "Edit your own user CSS files",
+       "right-editmyuserjs": "Edit your own user JavaScript files",
+       "right-viewmywatchlist": "View your own watchlist",
+       "right-editmywatchlist": "Edit your own watchlist. Note some actions will still add pages even without this right.",
+       "right-viewmyprivateinfo": "View your own private data (e.g. email address, real name)",
+       "right-editmyprivateinfo": "Edit your own private data (e.g. email address, real name)",
+       "right-editmyoptions": "Edit your own preferences",
+       "right-rollback": "Quickly rollback the edits of the last user who edited a particular page",
+       "right-markbotedits": "Mark rolled-back edits as bot edits",
+       "right-noratelimit": "Not be affected by rate limits",
+       "right-import": "Import pages from other wikis",
+       "right-importupload": "Import pages from a file upload",
+       "right-patrol": "Mark others' edits as patrolled",
+       "right-autopatrol": "Have one's own edits automatically marked as patrolled",
+       "right-patrolmarks": "View recent changes patrol marks",
+       "right-unwatchedpages": "View a list of unwatched pages",
+       "right-mergehistory": "Merge the history of pages",
+       "right-userrights": "Edit all user rights",
+       "right-userrights-interwiki": "Edit user rights of users on other wikis",
+       "right-siteadmin": "Lock and unlock the database",
+       "right-override-export-depth": "Export pages including linked pages up to a depth of 5",
+       "right-sendemail": "Send email to other users",
+       "right-passwordreset": "View password reset emails",
+       "newuserlogpage": "User creation log",
+       "newuserlogpagetext": "This is a log of user creations.",
+       "rightslog": "User rights log",
+       "rightslogtext": "This is a log of changes to user rights.",
+       "action-read": "read this page",
+       "action-edit": "edit this page",
+       "action-createpage": "create pages",
+       "action-createtalk": "create discussion pages",
+       "action-createaccount": "create this user account",
+       "action-history": "view the history of this page",
+       "action-minoredit": "mark this edit as minor",
+       "action-move": "move this page",
+       "action-move-subpages": "move this page, and its subpages",
+       "action-move-rootuserpages": "move root user pages",
+       "action-move-categorypages": "move category pages",
+       "action-movefile": "move this file",
+       "action-upload": "upload this file",
+       "action-reupload": "overwrite this existing file",
+       "action-reupload-shared": "override this file on a shared repository",
+       "action-upload_by_url": "upload this file from a URL",
+       "action-writeapi": "use the write API",
+       "action-delete": "delete this page",
+       "action-deleterevision": "delete this revision",
+       "action-deletedhistory": "view this page's deleted history",
+       "action-browsearchive": "search deleted pages",
+       "action-undelete": "undelete this page",
+       "action-suppressrevision": "review and restore this hidden revision",
+       "action-suppressionlog": "view this private log",
+       "action-block": "block this user from editing",
+       "action-protect": "change protection levels for this page",
+       "action-rollback": "quickly rollback the edits of the last user who edited a particular page",
+       "action-import": "import pages from another wiki",
+       "action-importupload": "import pages from a file upload",
+       "action-patrol": "mark others' edits as patrolled",
+       "action-autopatrol": "have your edit marked as patrolled",
+       "action-unwatchedpages": "view the list of unwatched pages",
+       "action-mergehistory": "merge the history of this page",
+       "action-userrights": "edit all user rights",
+       "action-userrights-interwiki": "edit user rights of users on other wikis",
+       "action-siteadmin": "lock or unlock the database",
+       "action-sendemail": "send emails",
+       "action-editmywatchlist": "edit your watchlist",
+       "action-viewmywatchlist": "view your watchlist",
+       "action-viewmyprivateinfo": "view your private information",
+       "action-editmyprivateinfo": "edit your private information",
+       "nchanges": "$1 {{PLURAL:$1|change|changes}}",
+       "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|since last visit}}",
+       "enhancedrc-history": "history",
+       "recentchanges": "Recent changes",
+       "recentchanges-url": "Special:RecentChanges",
+       "recentchanges-legend": "Recent changes options",
+       "recentchanges-summary": "Track the most recent changes to the wiki on this page.",
+       "recentchangestext": "-",
+       "recentchanges-noresult": "No changes during the given period matching these criteria.",
+       "recentchanges-feed-description": "Track the most recent changes to the wiki in this feed.",
+       "recentchanges-label-newpage": "This edit created a new page",
+       "recentchanges-label-minor": "This is a minor edit",
+       "recentchanges-label-bot": "This edit was performed by a bot",
+       "recentchanges-label-unpatrolled": "This edit has not yet been patrolled",
+       "recentchanges-label-plusminus": "The page size changed by this number of bytes",
+       "recentchanges-legend-heading": "'''Legend:'''",
+       "recentchanges-legend-newpage": "(also see [[Special:NewPages|list of new pages]])",
+       "recentchanges-legend-plusminus": "(<em>±123</em>)",
+       "rcnotefrom": "Below are the changes since <strong>$2</strong> (up to <strong>$1</strong> shown).",
+       "rclistfrom": "Show new changes starting from $2, $3",
+       "rcshowhideminor": "$1 minor edits",
+       "rcshowhideminor-show": "Show",
+       "rcshowhideminor-hide": "Hide",
+       "rcshowhidebots": "$1 bots",
+       "rcshowhidebots-show": "Show",
+       "rcshowhidebots-hide": "Hide",
+       "rcshowhideliu": "$1 registered users",
+       "rcshowhideliu-show": "Show",
+       "rcshowhideliu-hide": "Hide",
+       "rcshowhideanons": "$1 anonymous users",
+       "rcshowhideanons-show": "Show",
+       "rcshowhideanons-hide": "Hide",
+       "rcshowhidepatr": "$1 patrolled edits",
+       "rcshowhidepatr-show": "Show",
+       "rcshowhidepatr-hide": "Hide",
+       "rcshowhidemine": "$1 my edits",
+       "rcshowhidemine-show": "Show",
+       "rcshowhidemine-hide": "Hide",
+       "rclinks": "Show last $1 changes in last $2 days<br />$3",
+       "diff": "diff",
+       "hist": "hist",
+       "hide": "Hide",
+       "show": "Show",
+       "minoreditletter": "m",
+       "newpageletter": "N",
+       "boteditletter": "b",
+       "unpatrolledletter": "!",
+       "number_of_watching_users_RCview": "[$1]",
+       "number_of_watching_users_pageview": "[$1 watching {{PLURAL:$1|user|users}}]",
+       "rc_categories": "Limit to categories (separate with \"|\")",
+       "rc_categories_any": "Any",
+       "rc-change-size": "$1",
+       "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} after change",
+       "newsectionsummary": "/* $1 */ new section",
+       "rc-enhanced-expand": "Show details",
+       "rc-enhanced-hide": "Hide details",
+       "rc-old-title": "originally created as \"$1\"",
+       "recentchangeslinked": "Related changes",
+       "recentchangeslinked-feed": "Related changes",
+       "recentchangeslinked-toolbox": "Related changes",
+       "recentchangeslinked-title": "Changes related to \"$1\"",
+       "recentchangeslinked-summary": "This is a list of changes made recently to pages linked from a specified page (or to members of a specified category).\nPages on [[Special:Watchlist|your watchlist]] are <strong>bold</strong>.",
+       "recentchangeslinked-page": "Page name:",
+       "recentchangeslinked-to": "Show changes to pages linked to the given page instead",
+       "upload": "Upload file",
+       "uploadbtn": "Upload file",
+       "reuploaddesc": "Cancel upload and return to the upload form",
+       "upload-tryagain": "Submit modified file description",
+       "uploadnologin": "Not logged in",
+       "uploadnologintext": "Please $1 to upload files.",
+       "upload_directory_missing": "The upload directory ($1) is missing and could not be created by the webserver.",
+       "upload_directory_read_only": "The upload directory ($1) is not writable by the webserver.",
+       "uploaderror": "Upload error",
+       "upload-summary": "",
+       "upload-recreate-warning": "<strong>Warning: A file by that name has been deleted or moved.</strong>\n\nThe deletion and move log for this page are provided here for convenience:",
+       "uploadtext": "Use the form below to upload files.\nTo view or search previously uploaded files go to the [[Special:FileList|list of uploaded files]], (re)uploads are also logged in the [[Special:Log/upload|upload log]], deletions in the [[Special:Log/delete|deletion log]].\n\nTo include a file in a page, use a link in one of the following forms:\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code></strong> to use the full version of the file\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code></strong> to use a 200 pixel wide rendition in a box in the left margin with \"alt text\" as description\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code></strong> for directly linking to the file without displaying the file",
+       "upload-permitted": "Permitted file types: $1.",
+       "upload-preferred": "Preferred file types: $1.",
+       "upload-prohibited": "Prohibited file types: $1.",
+       "uploadfooter": "-",
+       "upload-default-description": "-",
+       "uploadlogpage": "Upload log",
+       "uploadlogpagetext": "Below is a list of the most recent file uploads.\nSee the [[Special:NewFiles|gallery of new files]] for a more visual overview.",
+       "filename": "Filename",
+       "filedesc": "Summary",
+       "fileuploadsummary": "Summary:",
+       "filereuploadsummary": "File changes:",
+       "filestatus": "Copyright status:",
+       "filesource": "Source:",
+       "ignorewarning": "Ignore warning and save file anyway",
+       "ignorewarnings": "Ignore any warnings",
+       "minlength1": "Filenames must be at least one letter.",
+       "illegalfilename": "The filename \"$1\" contains characters that are not allowed in page titles.\nPlease rename the file and try uploading it again.",
+       "filename-toolong": "Filenames may not be longer than 240 bytes.",
+       "badfilename": "Filename has been changed to \"$1\".",
+       "filetype-mime-mismatch": "File extension \".$1\" does not match the detected MIME type of the file ($2).",
+       "filetype-badmime": "Files of the MIME type \"$1\" are not allowed to be uploaded.",
+       "filetype-bad-ie-mime": "Cannot upload this file because Internet Explorer would detect it as \"$1\", which is a disallowed and potentially dangerous file type.",
+       "filetype-unwanted-type": "<strong>\".$1\"</strong> is an unwanted file type.\nPreferred {{PLURAL:$3|file type is|file types are}} $2.",
+       "filetype-banned-type": "<strong>\".$1\"</strong> {{PLURAL:$4|is not a permitted file type|are not permitted file types}}.\nPermitted {{PLURAL:$3|file type is|file types are}} $2.",
+       "filetype-missing": "The file has no extension (like \".jpg\").",
+       "empty-file": "The file you submitted was empty.",
+       "file-too-large": "The file you submitted was too large.",
+       "filename-tooshort": "The filename is too short.",
+       "filetype-banned": "This type of file is banned.",
+       "verification-error": "This file did not pass file verification.",
+       "hookaborted": "The modification you tried to make was aborted by an extension.",
+       "illegal-filename": "The filename is not allowed.",
+       "overwrite": "Overwriting an existing file is not allowed.",
+       "unknown-error": "An unknown error occurred.",
+       "tmp-create-error": "Could not create temporary file.",
+       "tmp-write-error": "Error writing temporary file.",
+       "large-file": "It is recommended that files are no larger than $1;\nthis file is $2.",
+       "largefileserver": "This file is bigger than the server is configured to allow.",
+       "emptyfile": "The file you uploaded seems to be empty.\nThis might be due to a typo in the filename.\nPlease check whether you really want to upload this file.",
+       "windows-nonascii-filename": "This wiki does not support filenames with special characters.",
+       "fileexists": "A file with this name exists already, please check <strong>[[:$1]]</strong> if you are not sure if you want to change it.\n[[$1|thumb]]",
+       "filepageexists": "The description page for this file has already been created at <strong>[[:$1]]</strong>, but no file with this name currently exists.\nThe summary you enter will not appear on the description page.\nTo make your summary appear there, you will need to manually edit it.\n[[$1|thumb]]",
+       "fileexists-extension": "A file with a similar name exists: [[$2|thumb]]\n* Name of the uploading file: <strong>[[:$1]]</strong>\n* Name of the existing file: <strong>[[:$2]]</strong>\nPlease choose a different name.",
+       "fileexists-thumbnail-yes": "The file seems to be an image of reduced size <em>(thumbnail)</em>.\n[[$1|thumb]]\nPlease check the file <strong>[[:$1]]</strong>.\nIf the checked file is the same image of original size it is not necessary to upload an extra thumbnail.",
+       "file-thumbnail-no": "The filename begins with <strong>$1</strong>.\nIt seems to be an image of reduced size <em>(thumbnail)</em>.\nIf you have this image in full resolution upload this one, otherwise change the filename please.",
+       "fileexists-forbidden": "A file with this name already exists, and cannot be overwritten.\nIf you still want to upload your file, please go back and use a new name.\n[[File:$1|thumb|center|$1]]",
+       "fileexists-shared-forbidden": "A file with this name exists already in the shared file repository.\nIf you still want to upload your file, please go back and use a new name.\n[[File:$1|thumb|center|$1]]",
+       "file-exists-duplicate": "This file is a duplicate of the following {{PLURAL:$1|file|files}}:",
+       "file-deleted-duplicate": "A file identical to this file ([[:$1]]) has previously been deleted.\nYou should check that file's deletion history before proceeding to re-upload it.",
+       "file-deleted-duplicate-notitle": "A file identical to this file has previously been deleted, and the title has been suppressed.\nYou should ask someone with the ability to view suppressed file data to review the situation before proceeding to re-upload it.",
+       "uploadwarning": "Upload warning",
+       "uploadwarning-text": "Please modify the file description below and try again.",
+       "savefile": "Save file",
+       "uploadedimage": "uploaded \"[[$1]]\"",
+       "overwroteimage": "uploaded a new version of \"[[$1]]\"",
+       "uploaddisabled": "Uploads disabled.",
+       "copyuploaddisabled": "Upload by URL disabled.",
+       "uploaddisabledtext": "File uploads are disabled.",
+       "php-uploaddisabledtext": "File uploads are disabled in PHP.\nPlease check the file_uploads setting.",
+       "uploadscripted": "This file contains HTML or script code that may be erroneously interpreted by a web browser.",
+       "uploadscriptednamespace": "This SVG file contains an illegal namespace \"$1\".",
+       "uploadinvalidxml": "The XML in the uploaded file could not be parsed.",
+       "uploadvirus": "The file contains a virus!\nDetails: $1",
+       "uploadjava": "The file is a ZIP file that contains a Java .class file.\nUploading Java files is not allowed because they can cause security restrictions to be bypassed.",
+       "upload-source": "Source file",
+       "sourcefilename": "Source filename:",
+       "sourceurl": "Source URL:",
+       "destfilename": "Destination filename:",
+       "upload-maxfilesize": "Maximum file size: $1",
+       "upload-description": "File description",
+       "upload-options": "Upload options",
+       "watchthisupload": "Watch this file",
+       "filewasdeleted": "A file of this name has been previously uploaded and subsequently deleted.\nYou should check the $1 before proceeding to upload it again.",
+       "filename-bad-prefix": "The name of the file you are uploading begins with <strong>\"$1\"</strong>, which is a non-descriptive name typically assigned automatically by digital cameras.\nPlease choose a more descriptive name for your file.",
+       "filename-prefix-blacklist": " #<!-- leave this line exactly as it is --> <pre>\n# Syntax is as follows:\n#   * Everything from a \"#\" character to the end of the line is a comment\n#   * Every non-blank line is a prefix for typical filenames assigned automatically by digital cameras\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # some mobile phones\nIMG # generic\nJD # Jenoptik\nMGP # Pentax\nPICT # misc.\n #</pre> <!-- leave this line exactly as it is -->",
+       "upload-success-subj": "Successful upload",
+       "upload-success-msg": "Your upload from [$2] was successful. It is available here: [[:{{ns:file}}:$1]]",
+       "upload-failure-subj": "Upload problem",
+       "upload-failure-msg": "There was a problem with your upload from [$2]:\n\n$1",
+       "upload-warning-subj": "Upload warning",
+       "upload-warning-msg": "There was a problem with your upload from [$2]. You may return to the [[Special:Upload/stash/$1|upload form]] to correct this problem.",
+       "upload-proto-error": "Incorrect protocol",
+       "upload-proto-error-text": "Remote upload requires URLs beginning with <code>http://</code> or <code>ftp://</code>.",
+       "upload-file-error": "Internal error",
+       "upload-file-error-text": "An internal error occurred when attempting to create a temporary file on the server.\nPlease contact an [[Special:ListUsers/sysop|administrator]].",
+       "upload-misc-error": "Unknown upload error",
+       "upload-misc-error-text": "An unknown error occurred during the upload.\nPlease verify that the URL is valid and accessible and try again.\nIf the problem persists, contact an [[Special:ListUsers/sysop|administrator]].",
+       "upload-too-many-redirects": "The URL contained too many redirects",
+       "upload-http-error": "An HTTP error occurred: $1",
+       "upload-copy-upload-invalid-domain": "Copy uploads are not available from this domain.",
+       "backend-fail-stream": "Could not stream file \"$1\".",
+       "backend-fail-backup": "Could not backup file \"$1\".",
+       "backend-fail-notexists": "The file $1 does not exist.",
+       "backend-fail-hashes": "Could not get file hashes for comparison.",
+       "backend-fail-notsame": "A non-identical file already exists at \"$1\".",
+       "backend-fail-invalidpath": "\"$1\" is not a valid storage path.",
+       "backend-fail-delete": "Could not delete file \"$1\".",
+       "backend-fail-describe": "Could not change metadata for file \"$1\".",
+       "backend-fail-alreadyexists": "The file \"$1\" already exists.",
+       "backend-fail-store": "Could not store file \"$1\" at \"$2\".",
+       "backend-fail-copy": "Could not copy file \"$1\" to \"$2\".",
+       "backend-fail-move": "Could not move file \"$1\" to \"$2\".",
+       "backend-fail-opentemp": "Could not open temporary file.",
+       "backend-fail-writetemp": "Could not write to temporary file.",
+       "backend-fail-closetemp": "Could not close temporary file.",
+       "backend-fail-read": "Could not read file \"$1\".",
+       "backend-fail-create": "Could not write file \"$1\".",
+       "backend-fail-maxsize": "Could not write file \"$1\" because it is larger than {{PLURAL:$2|one byte|$2 bytes}}.",
+       "backend-fail-readonly": "The storage backend \"$1\" is currently read-only. The reason given is: \"<em>$2</em>\"",
+       "backend-fail-synced": "The file \"$1\" is in an inconsistent state within the internal storage backends",
+       "backend-fail-connect": "Could not connect to storage backend \"$1\".",
+       "backend-fail-internal": "An unknown error occurred in storage backend \"$1\".",
+       "backend-fail-contenttype": "Could not determine the content type of the file to store at \"$1\".",
+       "backend-fail-batchsize": "The storage backend was given a batch of $1 file {{PLURAL:$1|operation|operations}}; the limit is $2 {{PLURAL:$2|operation|operations}}.",
+       "backend-fail-usable": "Could not read or write file \"$1\" due to insufficient permissions or missing directories/containers.",
+       "filejournal-fail-dbconnect": "Could not connect to the journal database for storage backend \"$1\".",
+       "filejournal-fail-dbquery": "Could not update the journal database for storage backend \"$1\".",
+       "lockmanager-notlocked": "Could not unlock \"$1\"; it is not locked.",
+       "lockmanager-fail-closelock": "Could not close lock file for \"$1\".",
+       "lockmanager-fail-deletelock": "Could not delete lock file for \"$1\".",
+       "lockmanager-fail-acquirelock": "Could not acquire lock for \"$1\".",
+       "lockmanager-fail-openlock": "Could not open lock file for \"$1\".",
+       "lockmanager-fail-releaselock": "Could not release lock for \"$1\".",
+       "lockmanager-fail-db-bucket": "Could not contact enough lock databases in bucket $1.",
+       "lockmanager-fail-db-release": "Could not release locks on database $1.",
+       "lockmanager-fail-svr-acquire": "Could not acquire locks on server $1.",
+       "lockmanager-fail-svr-release": "Could not release locks on server $1.",
+       "zip-file-open-error": "An error was encountered when opening the file for ZIP checks.",
+       "zip-wrong-format": "The specified file was not a ZIP file.",
+       "zip-bad": "The file is a corrupt or otherwise unreadable ZIP file.\nIt cannot be properly checked for security.",
+       "zip-unsupported": "The file is a ZIP file that uses ZIP features not supported by MediaWiki.\nIt cannot be properly checked for security.",
+       "uploadstash": "Upload stash",
+       "uploadstash-summary": "This page provides access to files that are uploaded or in the process of uploading, but are not yet published to the wiki. These files are not visible to anyone but the user who uploaded them.",
+       "uploadstash-clear": "Clear stashed files",
+       "uploadstash-nofiles": "You have no stashed files.",
+       "uploadstash-badtoken": "Performing of that action was unsuccessful, perhaps because your editing credentials expired. Try again.",
+       "uploadstash-errclear": "Clearing the files was unsuccessful.",
+       "uploadstash-refresh": "Refresh the list of files",
+       "invalid-chunk-offset": "Invalid chunk offset",
+       "img-auth-accessdenied": "Access denied",
+       "img-auth-nopathinfo": "Missing PATH_INFO.\nYour server is not set up to pass this information.\nIt may be CGI-based and cannot support img_auth.\nSee https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
+       "img-auth-notindir": "Requested path is not in the configured upload directory.",
+       "img-auth-badtitle": "Unable to construct a valid title from \"$1\".",
+       "img-auth-nologinnWL": "You are not logged in and \"$1\" is not in the whitelist.",
+       "img-auth-nofile": "File \"$1\" does not exist.",
+       "img-auth-isdir": "You are trying to access a directory \"$1\".\nOnly file access is allowed.",
+       "img-auth-streaming": "Streaming \"$1\".",
+       "img-auth-public": "The function of img_auth.php is to output files from a private wiki.\nThis wiki is configured as a public wiki.\nFor optimal security, img_auth.php is disabled.",
+       "img-auth-noread": "User does not have access to read \"$1\".",
+       "http-invalid-url": "Invalid URL: $1",
+       "http-invalid-scheme": "URLs with the \"$1\" scheme are not supported.",
+       "http-request-error": "HTTP request failed due to unknown error.",
+       "http-read-error": "HTTP read error.",
+       "http-timed-out": "HTTP request timed out.",
+       "http-curl-error": "Error fetching URL: $1",
+       "http-bad-status": "There was a problem during the HTTP request: $1 $2",
+       "upload-curl-error6": "Could not reach URL",
+       "upload-curl-error6-text": "The URL provided could not be reached.\nPlease double-check that the URL is correct and the site is up.",
+       "upload-curl-error28": "Upload timeout",
+       "upload-curl-error28-text": "The site took too long to respond.\nPlease check the site is up, wait a short while and try again.\nYou may want to try at a less busy time.",
+       "license": "Licensing:",
+       "license-header": "Licensing",
+       "nolicense": "None selected",
+       "licenses": "-",
+       "license-nopreview": "(Preview not available)",
+       "upload_source_url": "(a valid, publicly accessible URL)",
+       "upload_source_file": "(a file on your computer)",
+       "listfiles-summary": "This special page shows all uploaded files.",
+       "listfiles_search_for": "Search for media name:",
+       "imgfile": "file",
+       "listfiles": "File list",
+       "listfiles_thumb": "Thumbnail",
+       "listfiles_date": "Date",
+       "listfiles_name": "Name",
+       "listfiles_user": "User",
+       "listfiles_size": "Size",
+       "listfiles_description": "Description",
+       "listfiles_count": "Versions",
+       "listfiles-show-all": "Include old versions of images",
+       "listfiles-latestversion": "Current version",
+       "listfiles-latestversion-yes": "Yes",
+       "listfiles-latestversion-no": "No",
+       "file-anchor-link": "File",
+       "filehist": "File history",
+       "filehist-help": "Click on a date/time to view the file as it appeared at that time.",
+       "filehist-deleteall": "delete all",
+       "filehist-deleteone": "delete",
+       "filehist-revert": "revert",
+       "filehist-current": "current",
+       "filehist-datetime": "Date/Time",
+       "filehist-thumb": "Thumbnail",
+       "filehist-thumbtext": "Thumbnail for version as of $1",
+       "filehist-nothumb": "No thumbnail",
+       "filehist-user": "User",
+       "filehist-dimensions": "Dimensions",
+       "filehist-filesize": "File size",
+       "filehist-comment": "Comment",
+       "imagelinks": "File usage",
+       "linkstoimage": "The following {{PLURAL:$1|page links|$1 pages link}} to this file:",
+       "linkstoimage-more": "More than $1 {{PLURAL:$1|page links|pages link}} to this file.\nThe following list shows the {{PLURAL:$1|first page link|first $1 page links}} to this file only.\nA [[Special:WhatLinksHere/$2|full list]] is available.",
+       "nolinkstoimage": "There are no pages that link to this file.",
+       "morelinkstoimage": "View [[Special:WhatLinksHere/$1|more links]] to this file.",
+       "linkstoimage-redirect": "$1 (file redirect) $2",
+       "duplicatesoffile": "The following {{PLURAL:$1|file is a duplicate|$1 files are duplicates}} of this file ([[Special:FileDuplicateSearch/$2|more details]]):",
+       "sharedupload": "This file is from $1 and may be used by other projects.",
+       "sharedupload-desc-there": "This file is from $1 and may be used by other projects.\nPlease see the [$2 file description page] for further information.",
+       "sharedupload-desc-here": "This file is from $1 and may be used by other projects.\nThe description on its [$2 file description page] there is shown below.",
+       "sharedupload-desc-edit": "This file is from $1 and may be used by other projects.\nMaybe you want to edit the description on its [$2 file description page] there.",
+       "sharedupload-desc-create": "This file is from $1 and may be used by other projects.\nMaybe you want to edit the description on its [$2 file description page] there.",
+       "shareddescriptionfollows": "-",
+       "filepage-nofile": "No file by this name exists.",
+       "filepage-nofile-link": "No file by this name exists, but you can [$1 upload it].",
+       "uploadnewversion-linktext": "Upload a new version of this file",
+       "shared-repo-from": "from $1",
+       "shared-repo": "a shared repository",
+       "shared-repo-name-wikimediacommons": "Wikimedia Commons",
+       "filepage.css": "/* CSS placed here is included on the file description page, also included on foreign client wikis */",
+       "upload-disallowed-here": "You cannot overwrite this file.",
+       "filerevert": "Revert $1",
+       "filerevert-legend": "Revert file",
+       "filerevert-intro": "You are about to revert the file <strong>[[Media:$1|$1]]</strong> to the [$4 version as of $3, $2].",
+       "filerevert-comment": "Reason:",
+       "filerevert-defaultcomment": "Reverted to version as of $2, $1",
+       "filerevert-submit": "Revert",
+       "filerevert-success": "<strong>[[Media:$1|$1]]</strong> has been reverted to the [$4 version as of $3, $2].",
+       "filerevert-badversion": "There is no previous local version of this file with the provided timestamp.",
+       "filedelete": "Delete $1",
+       "filedelete-legend": "Delete file",
+       "filedelete-intro": "You are about to delete the file <strong>[[Media:$1|$1]]</strong> along with all of its history.",
+       "filedelete-intro-old": "You are deleting the version of <strong>[[Media:$1|$1]]</strong> as of [$4 $3, $2].",
+       "filedelete-comment": "Reason:",
+       "filedelete-submit": "Delete",
+       "filedelete-success": "<strong>$1</strong> has been deleted.",
+       "filedelete-success-old": "The version of <strong>[[Media:$1|$1]]</strong> as of $3, $2 has been deleted.",
+       "filedelete-nofile": "<strong>$1</strong> does not exist.",
+       "filedelete-nofile-old": "There is no archived version of <strong>$1</strong> with the specified attributes.",
+       "filedelete-otherreason": "Other/additional reason:",
+       "filedelete-reason-otherlist": "Other reason",
+       "filedelete-reason-dropdown": "*Common delete reasons\n** Copyright violation\n** Duplicated file",
+       "filedelete-edit-reasonlist": "Edit delete reasons",
+       "filedelete-maintenance": "Deletion and restoration of files temporarily disabled during maintenance.",
+       "filedelete-maintenance-title": "Cannot delete file",
+       "mimesearch": "MIME search",
+       "mimesearch-summary": "This page enables the filtering of files for their MIME type.\nInput: contenttype/subtype, e.g. <code>image/jpeg</code>.",
+       "mimetype": "MIME type:",
+       "download": "download",
+       "unwatchedpages": "Unwatched pages",
+       "unwatchedpages-summary": "",
+       "listredirects": "List of redirects",
+       "listredirects-summary": "",
+       "listduplicatedfiles": "List of files with duplicates",
+       "listduplicatedfiles-summary": "This is a list of files where the most recent version of the file is a duplicate of the most recent version of some other file. Only local files are considered.",
+       "listduplicatedfiles-entry": "[[:File:$1|$1]] has [[$3|{{PLURAL:$2|a duplicate|$2 duplicates}}]].",
+       "unusedtemplates": "Unused templates",
+       "unusedtemplates-summary": "",
+       "unusedtemplatestext": "This page lists all pages in the {{ns:template}} namespace that are not included in another page.\nRemember to check for other links to the templates before deleting them.",
+       "unusedtemplateswlh": "other links",
+       "randompage": "Random page",
+       "randompage-nopages": "There are no pages in the following {{PLURAL:$2|namespace|namespaces}}: $1.",
+       "randompage-url": "Special:Random",
+       "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",
+       "randomredirect": "Random redirect",
+       "randomredirect-nopages": "There are no redirects in the namespace \"$1\".",
+       "statistics": "Statistics",
+       "statistics-summary": "",
+       "statistics-header-pages": "Page statistics",
+       "statistics-header-edits": "Edit statistics",
+       "statistics-header-views": "View statistics",
+       "statistics-header-users": "User statistics",
+       "statistics-header-hooks": "Other statistics",
+       "statistics-articles": "Content pages",
+       "statistics-pages": "Pages",
+       "statistics-pages-desc": "All pages in the wiki, including talk pages, redirects, etc.",
+       "statistics-files": "Uploaded files",
+       "statistics-edits": "Page edits since {{SITENAME}} was set up",
+       "statistics-edits-average": "Average edits per page",
+       "statistics-views-total": "Views total",
+       "statistics-views-total-desc": "Views to non-existing pages and special pages are not included",
+       "statistics-views-peredit": "Views per edit",
+       "statistics-users": "Registered [[Special:ListUsers|users]]",
+       "statistics-users-active": "Active users",
+       "statistics-users-active-desc": "Users who have performed an action in the last {{PLURAL:$1|day|$1 days}}",
+       "statistics-mostpopular": "Most viewed pages",
+       "statistics-footer": "",
+       "pageswithprop": "Pages with a page property",
+       "pageswithprop-summary": "",
+       "pageswithprop-legend": "Pages with a page property",
+       "pageswithprop-text": "This page lists pages that use a particular page property.",
+       "pageswithprop-prop": "Property name:",
+       "pageswithprop-submit": "Go",
+       "pageswithprop-prophidden-long": "long text property value hidden ($1)",
+       "pageswithprop-prophidden-binary": "binary property value hidden ($1)",
+       "doubleredirects": "Double redirects",
+       "doubleredirects-summary": "",
+       "doubleredirectstext": "This page lists pages that redirect to other redirect pages.\nEach row contains links to the first and second redirect, as well as the target of the second redirect, which is usually the \"real\" target page to which the first redirect should point.\n<del>Crossed out</del> entries have been solved.",
+       "double-redirect-fixed-move": "[[$1]] has been moved.\nIt was automatically updated and now it redirects to [[$2]].",
+       "double-redirect-fixed-maintenance": "Automatically fixing double redirect from [[$1]] to [[$2]] in a maintenance job.",
+       "double-redirect-fixer": "Redirect fixer",
+       "brokenredirects": "Broken redirects",
+       "brokenredirects-summary": "",
+       "brokenredirectstext": "The following redirects link to non-existent pages:",
+       "brokenredirects-edit": "edit",
+       "brokenredirects-delete": "delete",
+       "withoutinterwiki": "Pages without language links",
+       "withoutinterwiki-summary": "The following pages do not link to other language versions.",
+       "withoutinterwiki-legend": "Prefix",
+       "withoutinterwiki-submit": "Show",
+       "fewestrevisions": "Pages with the fewest revisions",
+       "fewestrevisions-summary": "",
+       "nbytes": "$1 {{PLURAL:$1|byte|bytes}}",
+       "ncategories": "$1 {{PLURAL:$1|category|categories}}",
+       "ninterwikis": "$1 {{PLURAL:$1|interwiki|interwikis}}",
+       "nlinks": "$1 {{PLURAL:$1|link|links}}",
+       "nmembers": "$1 {{PLURAL:$1|member|members}}",
+       "nmemberschanged": "$1 → $2 {{PLURAL:$2|member|members}}",
+       "nrevisions": "$1 {{PLURAL:$1|revision|revisions}}",
+       "nviews": "$1 {{PLURAL:$1|view|views}}",
+       "nimagelinks": "Used on $1 {{PLURAL:$1|page|pages}}",
+       "ntransclusions": "used on $1 {{PLURAL:$1|page|pages}}",
+       "specialpage-empty": "There are no results for this report.",
+       "lonelypages": "Orphaned pages",
+       "lonelypages-summary": "",
+       "lonelypagestext": "The following pages are not linked from or transcluded into other pages in {{SITENAME}}.",
+       "uncategorizedpages": "Uncategorized pages",
+       "uncategorizedpages-summary": "",
+       "uncategorizedcategories": "Uncategorized categories",
+       "uncategorizedcategories-summary": "",
+       "uncategorizedimages": "Uncategorized files",
+       "uncategorizedimages-summary": "",
+       "uncategorizedtemplates": "Uncategorized templates",
+       "uncategorizedtemplates-summary": "",
+       "unusedcategories": "Unused categories",
+       "unusedcategories-summary": "",
+       "unusedimages": "Unused files",
+       "unusedimages-summary": "",
+       "popularpages": "Popular pages",
+       "popularpages-summary": "",
+       "wantedcategories": "Wanted categories",
+       "wantedcategories-summary": "",
+       "wantedpages": "Wanted pages",
+       "wantedpages-summary": "",
+       "wantedpages-badtitle": "Invalid title in result set: $1",
+       "wantedfiles": "Wanted files",
+       "wantedfiles-summary": "",
+       "wantedfiletext-cat": "The following files are used but do not exist. Files from foreign repositories may be listed despite existing. Any such false positives will be <del>struck out</del>. Additionally, pages that embed files that do not exist are listed in [[:$1]].",
+       "wantedfiletext-nocat": "The following files are used but do not exist. Files from foreign repositories may be listed despite existing. Any such false positives will be <del>struck out</del>.",
+       "wantedtemplates": "Wanted templates",
+       "wantedtemplates-summary": "",
+       "mostlinked": "Most linked-to pages",
+       "mostlinked-summary": "",
+       "mostlinkedcategories": "Most linked-to categories",
+       "mostlinkedcategories-summary": "",
+       "mostlinkedtemplates": "Most linked-to templates",
+       "mostlinkedtemplates-summary": "",
+       "mostcategories": "Pages with the most categories",
+       "mostcategories-summary": "",
+       "mostimages": "Most linked-to files",
+       "mostimages-summary": "",
+       "mostinterwikis": "Pages with the most interwikis",
+       "mostinterwikis-summary": "",
+       "mostrevisions": "Pages with the most revisions",
+       "mostrevisions-summary": "",
+       "prefixindex": "All pages with prefix",
+       "prefixindex-namespace": "All pages with prefix ($1 namespace)",
+       "prefixindex-summary": "",
+       "prefixindex-strip": "Strip prefix in list",
+       "shortpages": "Short pages",
+       "shortpages-summary": "",
+       "longpages": "Long pages",
+       "longpages-summary": "",
+       "deadendpages": "Dead-end pages",
+       "deadendpages-summary": "",
+       "deadendpagestext": "The following pages do not link to other pages in {{SITENAME}}.",
+       "protectedpages": "Protected pages",
+       "protectedpages-indef": "Indefinite protections only",
+       "protectedpages-summary": "This page lists existing pages that are currently protected. For a list of titles that are protected from creation, see [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
+       "protectedpages-cascade": "Cascading protections only",
+       "protectedpages-noredirect": "Hide redirects",
+       "protectedpagesempty": "No pages are currently protected with these parameters.",
+       "protectedpages-timestamp": "Timestamp",
+       "protectedpages-page": "Page",
+       "protectedpages-expiry": "Expires",
+       "protectedpages-performer": "Protecting user",
+       "protectedpages-params": "Protection parameters",
+       "protectedpages-reason": "Reason",
+       "protectedpages-unknown-timestamp": "Unknown",
+       "protectedpages-unknown-performer": "Unknown user",
+       "protectedpages-unknown-reason": "—",
+       "protectedtitles": "Protected titles",
+       "protectedtitles-summary": "This page lists titles that are currently protected from creation. For a list of existing pages that are protected, see [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
+       "protectedtitlesempty": "No titles are currently protected with these parameters.",
+       "listusers": "User list",
+       "listusers-summary": "",
+       "listusers-editsonly": "Show only users with edits",
+       "listusers-creationsort": "Sort by creation date",
+       "listusers-desc": "Sort in descending order",
+       "usereditcount": "$1 {{PLURAL:$1|edit|edits}}",
+       "usercreated": "{{GENDER:$3|Created}} on $1 at $2",
+       "newpages": "New pages",
+       "newpages-summary": "",
+       "newpages-username": "Username:",
+       "ancientpages": "Oldest pages",
+       "ancientpages-summary": "",
+       "move": "Move",
+       "movethispage": "Move this page",
+       "unusedimagestext": "The following files exist but are not embedded in any page.\nPlease note that other web sites may link to a file with a direct URL, and so may still be listed here despite being in active use.",
+       "unusedcategoriestext": "The following category pages exist, although no other page or category makes use of them.",
+       "notargettitle": "No target",
+       "notargettext": "You have not specified a target page or user to perform this function on.",
+       "nopagetitle": "No such target page",
+       "nopagetext": "The target page you have specified does not exist.",
+       "pager-newer-n": "{{PLURAL:$1|newer 1|newer $1}}",
+       "pager-older-n": "{{PLURAL:$1|older 1|older $1}}",
+       "suppress": "Oversight",
+       "querypage-disabled": "This special page is disabled for performance reasons.",
+       "booksources": "Book sources",
+       "booksources-summary": "",
+       "booksources-search-legend": "Search for book sources",
+       "booksources-isbn": "ISBN:",
+       "booksources-go": "Go",
+       "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",
+       "pubmedurl": "//www.ncbi.nlm.nih.gov/pubmed/$1?dopt=Abstract",
+       "specialloguserlabel": "Performer:",
+       "speciallogtitlelabel": "Target (title or user):",
+       "log": "Logs",
+       "all-logs-page": "All public logs",
+       "alllogstext": "Combined display of all available logs of {{SITENAME}}.\nYou can narrow down the view by selecting a log type, the username (case-sensitive), or the affected page (also case-sensitive).",
+       "logempty": "No matching items in log.",
+       "log-title-wildcard": "Search titles starting with this text",
+       "showhideselectedlogentries": "Change visibility of selected log entries",
+       "allpages": "All pages",
+       "allpages-summary": "",
+       "nextpage": "Next page ($1)",
+       "prevpage": "Previous page ($1)",
+       "allpagesfrom": "Display pages starting at:",
+       "allpagesto": "Display pages ending at:",
+       "allarticles": "All pages",
+       "allinnamespace": "All pages ($1 namespace)",
+       "allpagessubmit": "Go",
+       "allpagesprefix": "Display pages with prefix:",
+       "allpagesbadtitle": "The given page title was invalid or had an inter-language or inter-wiki prefix.\nIt may contain one or more characters that cannot be used in titles.",
+       "allpages-bad-ns": "{{SITENAME}} does not have namespace \"$1\".",
+       "allpages-hide-redirects": "Hide redirects",
+       "cachedspecial-viewing-cached-ttl": "You are viewing a cached version of this page, which can be up to $1 old.",
+       "cachedspecial-viewing-cached-ts": "You are viewing a cached version of this page, which might not be completely actual.",
+       "cachedspecial-refresh-now": "View latest.",
+       "categories": "Categories",
+       "categories-summary": "",
+       "categoriespagetext": "The following {{PLURAL:$1|category contains|categories contain}} pages or media.\n[[Special:UnusedCategories|Unused categories]] are not shown here.\nAlso see [[Special:WantedCategories|wanted categories]].",
+       "categoriesfrom": "Display categories starting at:",
+       "special-categories-sort-count": "sort by count",
+       "special-categories-sort-abc": "sort alphabetically",
+       "deletedcontributions": "Deleted user contributions",
+       "deletedcontributions-summary": "",
+       "deletedcontributions-title": "Deleted user contributions",
+       "sp-deletedcontributions-contribs": "contributions",
+       "linksearch": "External links search",
+       "linksearch-summary": "",
+       "linksearch-pat": "Search pattern:",
+       "linksearch-ns": "Namespace:",
+       "linksearch-ok": "Search",
+       "linksearch-text": "Wildcards such as \"*.wikipedia.org\" may be used.\nNeeds at least a top-level domain, for example \"*.org\".<br />\nSupported {{PLURAL:$2|protocol|protocols}}: <code>$1</code> (defaults to http:// if no protocol is specified).",
+       "linksearch-line": "$1 is linked from $2",
+       "linksearch-error": "Wildcards may appear only at the start of the hostname.",
+       "listusersfrom": "Display users starting at:",
+       "listusers-submit": "Show",
+       "listusers-noresult": "No user found.",
+       "listusers-blocked": "(blocked)",
+       "activeusers": "Active users list",
+       "activeusers-summary": "",
+       "activeusers-intro": "This is a list of users who had some kind of activity within the last $1 {{PLURAL:$1|day|days}}.",
+       "activeusers-count": "$1 {{PLURAL:$1|action|actions}} in the last {{PLURAL:$3|day|$3 days}}",
+       "activeusers-from": "Display users starting at:",
+       "activeusers-hidebots": "Hide bots",
+       "activeusers-hidesysops": "Hide administrators",
+       "activeusers-noresult": "No users found.",
+       "listgrouprights": "User group rights",
+       "listgrouprights-summary": "The following is a list of user groups defined on this wiki, with their associated access rights.\nThere may be [[{{MediaWiki:Listgrouprights-helppage}}|additional information]] about individual rights.",
+       "listgrouprights-key": "Legend:\n* <span class=\"listgrouprights-granted\">Granted right</span>\n* <span class=\"listgrouprights-revoked\">Revoked right</span>",
+       "listgrouprights-group": "Group",
+       "listgrouprights-rights": "Rights",
+       "listgrouprights-helppage": "Help:Group rights",
+       "listgrouprights-members": "(list of 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": "Add {{PLURAL:$2|group|groups}}: $1",
+       "listgrouprights-removegroup": "Remove {{PLURAL:$2|group|groups}}: $1",
+       "listgrouprights-addgroup-all": "Add all groups",
+       "listgrouprights-removegroup-all": "Remove all groups",
+       "listgrouprights-addgroup-self": "Add {{PLURAL:$2|group|groups}} to own account: $1",
+       "listgrouprights-removegroup-self": "Remove {{PLURAL:$2|group|groups}} from own account: $1",
+       "listgrouprights-addgroup-self-all": "Add all groups to own account",
+       "listgrouprights-removegroup-self-all": "Remove all groups from own account",
+       "listgrouprights-namespaceprotection-header": "Namespace restrictions",
+       "listgrouprights-namespaceprotection-namespace": "Namespace",
+       "listgrouprights-namespaceprotection-restrictedto": "Right(s) allowing user to edit",
+       "trackingcategories": "Tracking categories",
+       "trackingcategories-summary": "This page lists tracking categories which are automatically populated by the MediaWiki software. Their names can be changed by altering the relevant system messages in the {{ns:8}} namespace.",
+       "trackingcategories-msg": "Tracking category",
+       "trackingcategories-name": "Message name",
+       "trackingcategories-desc": "Category inclusion criteria",
+       "noindex-category-desc": "The page is not indexed by robots because it has the magic word <code><nowiki>__NOINDEX__</nowiki></code> on it and is in a namespace where that flag is allowed.",
+       "index-category-desc": "The page has a <code><nowiki>__INDEX__</nowiki></code> on it (and is in a namespace where that flag is allowed), and hence is indexed by robots where it normally wouldn't be.",
+       "post-expand-template-inclusion-category-desc": "After expanding all the templates, the page size is bigger than <code>$wgMaxArticleSize</code>, so some templates weren't expanded.",
+       "post-expand-template-argument-category-desc": "After expanding a template argument (something in triple braces, like <code>{{{Foo}}}</code>), the page is bigger than <code>$wgMaxArticleSize</code>.",
+       "expensive-parserfunction-category-desc": "Too many expensive parser functions (like <code>#ifexist</code>) included on a page. See [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "broken-file-category-desc": "Category added if the page contains a broken file link (a link to embed a file when the file does not exist).",
+       "hidden-category-category-desc": "This is a category with <code><nowiki>__HIDDENCAT__</nowiki></code> on it, which prevents it from showing up in the category links box on pages, by default.",
+       "trackingcategories-nodesc": "No description available.",
+       "trackingcategories-disabled": "Category is disabled",
+       "mailnologin": "No send address",
+       "mailnologintext": "You must be [[Special:UserLogin|logged in]] and have a valid email address in your [[Special:Preferences|preferences]] to send email to other users.",
+       "emailuser": "Email this user",
+       "emailuser-title-target": "Email this {{GENDER:$1|user}}",
+       "emailuser-title-notarget": "Email user",
+       "emailuser-summary": "",
+       "emailpage": "Email user",
+       "emailpagetext": "You can use the form below to send an email message to this {{GENDER:$1|user}}.\nThe email address you entered in [[Special:Preferences|your user preferences]] will appear as the \"From\" address of the email, so the recipient will be able to reply directly to you.",
+       "defemailsubject": "{{SITENAME}} email from user \"$1\"",
+       "usermaildisabled": "User email disabled",
+       "usermaildisabledtext": "You cannot send email to other users on this wiki",
+       "noemailtitle": "No email address",
+       "noemailtext": "This user has not specified a valid email address.",
+       "nowikiemailtext": "This user has chosen not to receive email from other users.",
+       "emailnotarget": "Non-existent or invalid username for recipient.",
+       "emailtarget": "Enter username of recipient",
+       "emailusername": "Username:",
+       "emailusernamesubmit": "Submit",
+       "email-legend": "Send an email to another {{SITENAME}} user",
+       "emailfrom": "From:",
+       "emailto": "To:",
+       "emailsubject": "Subject:",
+       "emailmessage": "Message:",
+       "emailsend": "Send",
+       "emailccme": "Email me a copy of my message.",
+       "emailccsubject": "Copy of your message to $1: $2",
+       "emailsent": "Email sent",
+       "emailsenttext": "Your email message has been sent.",
+       "emailuserfooter": "This email was sent by $1 to $2 by the \"Email user\" function at {{SITENAME}}.",
+       "usermessage-summary": "Leaving system message.",
+       "usermessage-editor": "System messenger",
+       "usermessage-template": "MediaWiki:UserMessage",
+       "watchlist": "Watchlist",
+       "watchlist-summary": "",
+       "mywatchlist": "Watchlist",
+       "watchlistfor2": "For $1 $2",
+       "nowatchlist": "You have no items on your watchlist.",
+       "watchlistanontext": "Please $1 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.",
+       "addedwatchtext-short": "The page \"$1\" has been added to your watchlist.",
+       "removewatch": "Remove from watchlist",
+       "removedwatchtext": "The page \"[[:$1]]\" has been removed from [[Special:Watchlist|your watchlist]].",
+       "removedwatchtext-short": "The page \"$1\" has been removed from your watchlist.",
+       "watch": "Watch",
+       "watchthispage": "Watch this page",
+       "unwatch": "Unwatch",
+       "unwatchthispage": "Stop watching",
+       "notanarticle": "Not a content page",
+       "notvisiblerev": "The last revision by a different user has been deleted",
+       "watchlist-details": "{{PLURAL:$1|$1 page|$1 pages}} on your watchlist, not separately counting talk pages.",
+       "wlheader-enotif": "Email notification is enabled.",
+       "wlheader-showupdated": "Pages that have been changed since you last visited them are shown in <strong>bold</strong>.",
+       "wlnote2": "Below are the changes in the last {{PLURAL:$1|hour|<strong>$1</strong> hours}}, as of $2, $3.",
+       "wlshowlast": "Show last $1 hours $2 days $3",
+       "watchlist-options": "Watchlist options",
+       "watching": "Watching...",
+       "unwatching": "Unwatching...",
+       "watcherrortext": "An error occurred while changing your watchlist settings for \"$1\".",
+       "enotif_reset": "Mark all pages visited",
+       "enotif_impersonal_salutation": "{{SITENAME}} user",
+       "enotif_subject_deleted": "{{SITENAME}} page $1 has been {{GENDER:$2|deleted}} by $2",
+       "enotif_subject_created": "{{SITENAME}} page $1 has been {{GENDER:$2|created}} by $2",
+       "enotif_subject_moved": "{{SITENAME}} page $1 has been {{GENDER:$2|moved}} by $2",
+       "enotif_subject_restored": "{{SITENAME}} page $1 has been {{GENDER:$2|restored}} by $2",
+       "enotif_subject_changed": "{{SITENAME}} page $1 has been {{GENDER:$2|changed}} by $2",
+       "enotif_body_intro_deleted": "The {{SITENAME}} page $1 has been {{GENDER:$2|deleted}} on $PAGEEDITDATE by $2, see $3.",
+       "enotif_body_intro_created": "The {{SITENAME}} page $1 has been {{GENDER:$2|created}} on $PAGEEDITDATE by $2, see $3 for the current revision.",
+       "enotif_body_intro_moved": "The {{SITENAME}} page $1 has been {{GENDER:$2|moved}} on $PAGEEDITDATE by $2, see $3 for the current revision.",
+       "enotif_body_intro_restored": "The {{SITENAME}} page $1 has been {{GENDER:$2|restored}} on $PAGEEDITDATE by $2, see $3 for the current revision.",
+       "enotif_body_intro_changed": "The {{SITENAME}} page $1 has been {{GENDER:$2|changed}} on $PAGEEDITDATE by $2, see $3 for the current revision.",
+       "enotif_lastvisited": "See $1 for all changes since your last visit.",
+       "enotif_lastdiff": "See $1 to view this change.",
+       "enotif_anon_editor": "anonymous user $1",
+       "enotif_body": "Dear $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nEditor's summary: $PAGESUMMARY $PAGEMINOREDIT\n\nContact the editor:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nThere will be no other notifications in case of further activity unless you visit this page while logged in. You could also reset the notification flags for all your watched pages on your watchlist.\n\nYour friendly {{SITENAME}} notification system\n\n--\nTo change your email notification settings, visit\n{{canonicalurl:{{#special:Preferences}}}}\n\nTo change your watchlist settings, visit\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nTo delete the page from your watchlist, visit\n$UNWATCHURL\n\nFeedback and further assistance:\n$HELPPAGE",
+       "created": "created",
+       "changed": "changed",
+       "deletepage": "Delete page",
+       "confirm": "Confirm",
+       "excontent": "content was: \"$1\"",
+       "excontentauthor": "content was: \"$1\" (and the only contributor was \"[[Special:Contributions/$2|$2]]\")",
+       "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}}:",
+       "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",
+       "deletedtext": "\"$1\" has been deleted.\nSee $2 for a record of recent deletions.",
+       "dellogpage": "Deletion log",
+       "dellogpagetext": "Below is a list of the most recent deletions.",
+       "deletionlog": "deletion log",
+       "reverted": "Reverted to earlier revision",
+       "deletecomment": "Reason:",
+       "deleteotherreason": "Other/additional reason:",
+       "deletereasonotherlist": "Other reason",
+       "deletereason-dropdown": "* Common delete reasons\n** Spam\n** Vandalism\n** Copyright violation\n** Author request\n** Broken redirect",
+       "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.",
+       "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",
+       "rollbacklink": "rollback",
+       "rollbacklinkcount": "rollback $1 {{PLURAL:$1|edit|edits}}",
+       "rollbacklinkcount-morethan": "rollback more than $1 {{PLURAL:$1|edit|edits}}",
+       "rollbackfailed": "Rollback failed",
+       "cantrollback": "Cannot revert edit;\nlast contributor is only author of this page.",
+       "alreadyrolled": "Cannot rollback last edit of [[:$1]] by [[User:$2|$2]] ([[User talk:$2|talk]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nsomeone else has edited or rolled back the page already.\n\nThe last edit to the page was by [[User:$3|$3]] ([[User talk:$3|talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
+       "editcomment": "The edit summary was: \"''$1''\".",
+       "revertpage": "Reverted edits by [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]]) to last revision by [[User:$1|$1]]",
+       "revertpage-nouser": "Reverted edits by a hidden user to last revision by {{GENDER:$1|[[User:$1|$1]]}}",
+       "rollback-success": "Reverted edits by $1;\nchanged back to last revision by $2.",
+       "sessionfailure-title": "Session failure",
+       "sessionfailure": "There seems to be a problem with your login session;\nthis action has been canceled as a precaution against session hijacking.\nGo back to the previous page, reload that page and then try again.",
+       "protectlogpage": "Protection log",
+       "protectlogtext": "Below is a list of changes to page protections.\nSee the [[Special:ProtectedPages|protected pages list]] for the list of currently operational page protections.",
+       "protectedarticle": "protected \"[[$1]]\"",
+       "modifiedarticleprotection": "changed protection level for \"[[$1]]\"",
+       "unprotectedarticle": "removed protection from \"[[$1]]\"",
+       "movedarticleprotection": "moved protection settings from \"[[$2]]\" to \"[[$1]]\"",
+       "protect-title": "Change protection level for \"$1\"",
+       "protect-title-notallowed": "View protection level of \"$1\"",
+       "prot_1movedto2": "[[$1]] moved to [[$2]]",
+       "protect-badnamespace-title": "Non-protectable namespace",
+       "protect-badnamespace-text": "Pages in this namespace cannot be protected.",
+       "protect-norestrictiontypes-text": "This page cannot be protected as there are no restriction types available.",
+       "protect-norestrictiontypes-title": "Non-protectable page",
+       "protect-legend": "Confirm protection",
+       "protectcomment": "Reason:",
+       "protectexpiry": "Expires:",
+       "protect_expiry_invalid": "Expiry time is invalid.",
+       "protect_expiry_old": "Expiry time is in the past.",
+       "protect-unchain-permissions": "Unlock further protect options",
+       "protect-text": "Here you may view and change the protection level for the page <strong>$1</strong>.",
+       "protect-locked-blocked": "You cannot change protection levels while blocked.\nHere are the current settings for the page <strong>$1</strong>:",
+       "protect-locked-dblock": "Protection levels cannot be changed due to an active database lock.\nHere are the current settings for the page <strong>$1</strong>:",
+       "protect-locked-access": "Your account does not have permission to change page protection levels.\nHere are the current settings for the page <strong>$1</strong>:",
+       "protect-cascadeon": "This page is currently protected because it is included in the following {{PLURAL:$1|page, which has|pages, which have}} cascading protection turned on.\nChanges to this page's protection level will not affect the cascading protection.",
+       "protect-default": "Allow all users",
+       "protect-fallback": "Allow only users with \"$1\" permission",
+       "protect-level-autoconfirmed": "Allow only autoconfirmed users",
+       "protect-level-sysop": "Allow only administrators",
+       "protect-summary-desc": "[$1=$2] ($3)",
+       "protect-summary-cascade": "cascading",
+       "protect-expiring": "expires $1 (UTC)",
+       "protect-expiring-local": "expires $1",
+       "protect-expiry-indefinite": "indefinite",
+       "protect-cascade": "Protect pages included in this page (cascading protection)",
+       "protect-cantedit": "You cannot change the protection levels of this page because you do not have permission to edit it.",
+       "protect-othertime": "Other time:",
+       "protect-othertime-op": "other time",
+       "protect-existing-expiry": "Existing expiry time: $3, $2",
+       "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",
+       "protect-edit-reasonlist": "Edit protection reasons",
+       "protect-expiry-options": "1 hour:1 hour,1 day:1 day,1 week:1 week,2 weeks:2 weeks,1 month:1 month,3 months:3 months,6 months:6 months,1 year:1 year,infinite:infinite",
+       "restriction-type": "Permission:",
+       "restriction-level": "Restriction level:",
+       "minimum-size": "Min size",
+       "maximum-size": "Max size:",
+       "pagesize": "(bytes)",
+       "restriction-edit": "Edit",
+       "restriction-move": "Move",
+       "restriction-create": "Create",
+       "restriction-upload": "Upload",
+       "restriction-level-sysop": "fully protected",
+       "restriction-level-autoconfirmed": "semi protected",
+       "restriction-level-all": "any level",
+       "undelete": "View deleted pages",
+       "undelete-summary": "",
+       "undeletepage": "View and restore deleted pages",
+       "undeletepagetitle": "<strong>The following consists of deleted revisions of [[:$1|$1]]</strong>.",
+       "viewdeletedpage": "View deleted pages",
+       "undeletepagetext": "The following {{PLURAL:$1|page has been deleted but is|$1 pages have been deleted but are}} still in the archive and can be restored.\nThe archive may be periodically cleaned out.",
+       "undelete-fieldset-title": "Restore revisions",
+       "undeleteextrahelp": "To restore the page's entire history, leave all checkboxes deselected and click <strong><em>{{int:undeletebtn}}</em></strong>.\nTo perform a selective restoration, check the boxes corresponding to the revisions to be restored, and click <strong><em>{{int:undeletebtn}}</em></strong>.",
+       "undeleterevisions": "$1 {{PLURAL:$1|revision|revisions}} archived",
+       "undeletehistory": "If you restore the page, all revisions will be restored to the history.\nIf a new page with the same name has been created since the deletion, the restored revisions will appear in the prior history.",
+       "undeleterevdel": "Undeletion will not be performed if it will result in the top page or file revision being partially deleted.\nIn such cases, you must uncheck or unhide the newest deleted revision.",
+       "undeletehistorynoadmin": "This page has been deleted.\nThe reason for deletion is shown in the summary below, along with details of the users who had edited this page before deletion.\nThe actual text of these deleted revisions is only available to administrators.",
+       "undelete-revision": "Deleted revision of $1 (as of $4, at $5) by $3:",
+       "undeleterevision-missing": "Invalid or missing revision.\nYou may have a bad link, or the revision may have been restored or removed from the archive.",
+       "undelete-nodiff": "No previous revision found.",
+       "undeletebtn": "Restore",
+       "undeletelink": "view/restore",
+       "undeleteviewlink": "view",
+       "undeleteinvert": "Invert selection",
+       "undeletecomment": "Reason:",
+       "undeletedrevisions": "{{PLURAL:$1|1 revision|$1 revisions}} restored",
+       "undeletedrevisions-files": "{{PLURAL:$1|1 revision|$1 revisions}} and {{PLURAL:$2|1 file|$2 files}} restored",
+       "undeletedfiles": "{{PLURAL:$1|1 file|$1 files}} restored",
+       "cannotundelete": "Undelete failed:\n$1",
+       "undeletedpage": "<strong>$1 has been restored</strong>\n\nConsult the [[Special:Log/delete|deletion log]] for a record of recent deletions and restorations.",
+       "undelete-header": "See [[Special:Log/delete|the deletion log]] for recently deleted pages.",
+       "undelete-search-title": "Search deleted pages",
+       "undelete-search-box": "Search deleted pages",
+       "undelete-search-prefix": "Show pages starting with:",
+       "undelete-search-submit": "Search",
+       "undelete-no-results": "No matching pages found in the deletion archive.",
+       "undelete-filename-mismatch": "Cannot undelete file revision with timestamp $1: Filename mismatch.",
+       "undelete-bad-store-key": "Cannot undelete file revision with timestamp $1: File was missing before deletion.",
+       "undelete-cleanup-error": "Error deleting unused archive file \"$1\".",
+       "undelete-missing-filearchive": "Unable to restore file archive ID $1 because it is not in the database.\nIt may have already been undeleted.",
+       "undelete-error": "Error undeleting page",
+       "undelete-error-short": "Error undeleting file: $1",
+       "undelete-error-long": "Errors were encountered while undeleting the file:\n\n$1",
+       "undelete-show-file-confirm": "Are you sure you want to view the deleted revision of the file \"<nowiki>$1</nowiki>\" from $2 at $3?",
+       "undelete-show-file-submit": "Yes",
+       "undelete-revision-row": "$1 $2 ($3) $4 . . $5 $6 $7 $8 $9",
+       "namespace": "Namespace:",
+       "invert": "Invert selection",
+       "tooltip-invert": "Check this box to hide changes to pages within the selected namespace (and the associated namespace if checked)",
+       "namespace_association": "Associated namespace",
+       "tooltip-namespace_association": "Check this box to also include the talk or subject namespace associated with the selected namespace",
+       "blanknamespace": "(Main)",
+       "contributions": "{{GENDER:$1|User}} contributions",
+       "contributions-summary": "",
+       "contributions-title": "User contributions for $1",
+       "mycontris": "Contributions",
+       "contribsub2": "For {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "User account \"$1\" is not registered.",
+       "nocontribs": "No changes were found matching these criteria.",
+       "uctop": "(current)",
+       "month": "From month (and earlier):",
+       "year": "From year (and earlier):",
+       "sp-contributions-newbies": "Show contributions of new accounts only",
+       "sp-contributions-newbies-sub": "For new accounts",
+       "sp-contributions-newbies-title": "User contributions for new accounts",
+       "sp-contributions-blocklog": "block log",
+       "sp-contributions-suppresslog": "suppressed user contributions",
+       "sp-contributions-deleted": "deleted user contributions",
+       "sp-contributions-uploads": "uploads",
+       "sp-contributions-logs": "logs",
+       "sp-contributions-talk": "talk",
+       "sp-contributions-userrights": "user rights management",
+       "sp-contributions-blocked-notice": "This user is currently blocked.\nThe latest block log entry is provided below for reference:",
+       "sp-contributions-blocked-notice-anon": "This IP address is currently blocked.\nThe latest block log entry is provided below for reference:",
+       "sp-contributions-search": "Search for contributions",
+       "sp-contributions-username": "IP address or username:",
+       "sp-contributions-toponly": "Only show edits that are latest revisions",
+       "sp-contributions-newonly": "Only show edits that are page creations",
+       "sp-contributions-submit": "Search",
+       "sp-contributions-explain": "",
+       "sp-contributions-footer": "-",
+       "sp-contributions-footer-anon": "-",
+       "sp-contributions-footer-newbies": "-",
+       "whatlinkshere": "What links here",
+       "whatlinkshere-title": "Pages that link to \"$1\"",
+       "whatlinkshere-summary": "",
+       "whatlinkshere-page": "Page:",
+       "linkshere": "The following pages link to <strong>[[:$1]]</strong>:",
+       "nolinkshere": "No pages link to <strong>[[:$1]]</strong>.",
+       "nolinkshere-ns": "No pages link to <strong>[[:$1]]</strong> in the chosen namespace.",
+       "isredirect": "redirect page",
+       "istemplate": "transclusion",
+       "isimage": "file link",
+       "whatlinkshere-prev": "{{PLURAL:$1|previous|previous $1}}",
+       "whatlinkshere-next": "{{PLURAL:$1|next|next $1}}",
+       "whatlinkshere-links": "← links",
+       "whatlinkshere-hideredirs": "$1 redirects",
+       "whatlinkshere-hidetrans": "$1 transclusions",
+       "whatlinkshere-hidelinks": "$1 links",
+       "whatlinkshere-hideimages": "$1 file links",
+       "whatlinkshere-filters": "Filters",
+       "autoblockid": "Autoblock #$1",
+       "block": "Block user",
+       "unblock": "Unblock user",
+       "unblock-summary": "",
+       "blockip": "Block user",
+       "blockip-legend": "Block user",
+       "blockiptext": "Use the form below to block write access from a specific IP address or username.\nThis should be done only to prevent vandalism, and in accordance with [[{{MediaWiki:Policy-url}}|policy]].\nFill in a specific reason below (for example, citing particular pages that were vandalized).",
+       "ipaddressorusername": "IP address or username:",
+       "ipbexpiry": "Expiry:",
+       "ipbreason": "Reason:",
+       "ipbreason-dropdown": "*Common block reasons\n** Inserting false information\n** Removing content from pages\n** Spamming links to external sites\n** Inserting nonsense/gibberish into pages\n** Intimidating behavior/harassment\n** Abusing multiple accounts\n** Unacceptable username",
+       "ipb-hardblock": "Prevent logged-in users from editing from this IP address",
+       "ipbcreateaccount": "Prevent account creation",
+       "ipbemailban": "Prevent user from sending email",
+       "ipbenableautoblock": "Automatically block the last IP address used by this user, and any subsequent IP addresses they try to edit from",
+       "ipbsubmit": "Block this user",
+       "ipbother": "Other time:",
+       "ipboptions": "2 hours:2 hours,1 day:1 day,3 days:3 days,1 week:1 week,2 weeks:2 weeks,1 month:1 month,3 months:3 months,6 months:6 months,1 year:1 year,indefinite:infinite",
+       "ipbhidename": "Hide username from edits and lists",
+       "ipbwatchuser": "Watch this user's user and talk pages",
+       "ipb-disableusertalk": "Prevent this user from editing their own talk page while blocked",
+       "ipb-change-block": "Re-block the user with these settings",
+       "ipb-confirm": "Confirm block",
+       "badipaddress": "Invalid IP address",
+       "blockipsuccesssub": "Block succeeded",
+       "blockipsuccesstext": "[[Special:Contributions/$1|$1]] has been blocked.<br />\nSee the [[Special:BlockList|block list]] to review blocks.",
+       "ipb-blockingself": "You are about to block yourself! Are you sure you want to do that?",
+       "ipb-confirmhideuser": "You are about to block a user with \"hide user\" enabled. This will suppress the user's name in all lists and log entries. Are you sure you want to do that?",
+       "ipb-confirmaction": "If you are sure you really want to do it, please check the \"{{int:ipb-confirm}}\" field at the bottom.",
+       "ipb-edit-dropdown": "Edit block reasons",
+       "ipb-unblock-addr": "Unblock $1",
+       "ipb-unblock": "Unblock a username or IP address",
+       "ipb-blocklist": "View existing blocks",
+       "ipb-blocklist-contribs": "Contributions for $1",
+       "unblockip": "Unblock user",
+       "unblockiptext": "Use the form below to restore write access to a previously blocked IP address or username.",
+       "ipusubmit": "Remove this block",
+       "unblocked": "[[User:$1|$1]] has been unblocked.",
+       "unblocked-range": "$1 has been unblocked.",
+       "unblocked-id": "Block $1 has been removed.",
+       "blocklist": "Blocked users",
+       "ipblocklist": "Blocked users",
+       "ipblocklist-legend": "Find a blocked user",
+       "blocklist-userblocks": "Hide account blocks",
+       "blocklist-tempblocks": "Hide temporary blocks",
+       "blocklist-addressblocks": "Hide single IP blocks",
+       "blocklist-rangeblocks": "Hide range blocks",
+       "blocklist-timestamp": "Timestamp",
+       "blocklist-target": "Target",
+       "blocklist-expiry": "Expires",
+       "blocklist-by": "Blocking admin",
+       "blocklist-params": "Block parameters",
+       "blocklist-reason": "Reason",
+       "blocklist-summary": "",
+       "ipblocklist-submit": "Search",
+       "ipblocklist-localblock": "Local block",
+       "ipblocklist-otherblocks": "Other {{PLURAL:$1|block|blocks}}",
+       "infiniteblock": "infinite",
+       "expiringblock": "expires on $1 at $2",
+       "anononlyblock": "anon. only",
+       "noautoblockblock": "autoblock disabled",
+       "createaccountblock": "account creation disabled",
+       "emailblock": "email disabled",
+       "blocklist-nousertalk": "cannot edit own talk page",
+       "ipblocklist-empty": "The block list is empty.",
+       "ipblocklist-no-results": "The requested IP address or username is not blocked.",
+       "blocklink": "block",
+       "unblocklink": "unblock",
+       "change-blocklink": "change block",
+       "contribslink": "contribs",
+       "emaillink": "send email",
+       "autoblocker": "Autoblocked because your IP address has been recently used by \"[[User:$1|$1]]\".\nThe reason given for $1's block is \"$2\"",
+       "blocklogpage": "Block log",
+       "blocklog-showlog": "This user has been blocked previously.\nThe block log is provided below for reference:",
+       "blocklog-showsuppresslog": "This user has been blocked and hidden previously.\nThe suppress log is provided below for reference:",
+       "blocklogentry": "blocked [[$1]] with an expiry time of $2 $3",
+       "reblock-logentry": "changed block settings for [[$1]] with an expiry time of $2 $3",
+       "blocklogtext": "This is a log of user blocking and unblocking actions.\nAutomatically blocked IP addresses are not listed.\nSee the [[Special:BlockList|block list]] for the list of currently operational bans and blocks.",
+       "unblocklogentry": "unblocked $1",
+       "block-log-flags-anononly": "anonymous users only",
+       "block-log-flags-nocreate": "account creation disabled",
+       "block-log-flags-noautoblock": "autoblock disabled",
+       "block-log-flags-noemail": "email disabled",
+       "block-log-flags-nousertalk": "cannot edit own talk page",
+       "block-log-flags-angry-autoblock": "enhanced autoblock enabled",
+       "block-log-flags-hiddenname": "username hidden",
+       "range_block_disabled": "The administrator ability to create range blocks is disabled.",
+       "ipb_expiry_invalid": "Expiry time invalid.",
+       "ipb_expiry_temp": "Hidden username blocks must be permanent.",
+       "ipb_hide_invalid": "Unable to suppress this account; it has more than {{PLURAL:$1|one edit|$1 edits}}.",
+       "ipb_already_blocked": "\"$1\" is already blocked.",
+       "ipb-needreblock": "$1 is already blocked. Do you want to change the settings?",
+       "ipb-otherblocks-header": "Other {{PLURAL:$1|block|blocks}}",
+       "unblock-hideuser": "You cannot unblock this user, as their username has been hidden.",
+       "ipb_cant_unblock": "Error: Block ID $1 not found. It may have been unblocked already.",
+       "ipb_blocked_as_range": "Error: The IP address $1 is not blocked directly and cannot be unblocked.\nIt is, however, blocked as part of the range $2, which can be unblocked.",
+       "ip_range_invalid": "Invalid IP range.",
+       "ip_range_toolarge": "Range blocks larger than /$1 are not allowed.",
+       "proxyblocker": "Proxy blocker",
+       "proxyblockreason": "Your IP address has been blocked because it is an open proxy.\nPlease contact your Internet service provider or technical support of your organization and inform them of this serious security problem.",
+       "sorbs": "DNSBL",
+       "sorbsreason": "Your IP address is listed as an open proxy in the DNSBL used by {{SITENAME}}.",
+       "sorbs_create_account_reason": "Your IP address is listed as an open proxy in the DNSBL used by {{SITENAME}}.\nYou cannot create an account.",
+       "xffblockreason": "An IP address present in the X-Forwarded-For header, either yours or that of a proxy server you are using, has been blocked. The original block reason was: $1",
+       "cant-see-hidden-user": "The user you are trying to block has already been blocked and hidden.\nSince you do not have the hideuser right, you cannot see or edit the user's block.",
+       "ipbblocked": "You cannot block or unblock other users because you are yourself blocked.",
+       "ipbnounblockself": "You are not allowed to unblock yourself.",
+       "ipb-default-expiry": "",
+       "lockdb": "Lock database",
+       "unlockdb": "Unlock database",
+       "lockdbtext": "Locking the database will suspend the ability of all users to edit pages, change their preferences, edit their watchlists, and other things requiring changes in the database.\nPlease confirm that this is what you intend to do, and that you will unlock the database when your maintenance is done.",
+       "unlockdbtext": "Unlocking the database will restore the ability of all users to edit pages, change their preferences, edit their watchlists, and other things requiring changes in the database.\nPlease confirm that this is what you intend to do.",
+       "lockconfirm": "Yes, I really want to lock the database.",
+       "unlockconfirm": "Yes, I really want to unlock the database.",
+       "lockbtn": "Lock database",
+       "unlockbtn": "Unlock database",
+       "locknoconfirm": "You did not check the confirmation box.",
+       "lockdbsuccesssub": "Database lock succeeded",
+       "unlockdbsuccesssub": "Database lock removed",
+       "lockdbsuccesstext": "The database has been locked.<br />\nRemember to [[Special:UnlockDB|remove the lock]] after your maintenance is complete.",
+       "unlockdbsuccesstext": "The database has been unlocked.",
+       "lockfilenotwritable": "The database lock file is not writable.\nTo lock or unlock the database, this needs to be writable by the web server.",
+       "databasenotlocked": "The database is not locked.",
+       "lockedbyandtime": "(by {{GENDER:$1|$1}} on $2 at $3)",
+       "move-page": "Move $1",
+       "movepage-summary": "",
+       "move-page-legend": "Move page",
+       "movepagetext": "Using the form below will rename a page, moving all of its history to the new name.\nThe old title will become a redirect page to the new title.\nYou can update redirects that point to the original title automatically.\nIf you choose not to, be sure to check for [[Special:DoubleRedirects|double]] or [[Special:BrokenRedirects|broken redirects]].\nYou are responsible for making sure that links continue to point where they are supposed to go.\n\nNote that the page will <strong>not</strong> be moved if there is already a page at the new title, unless the latter is a redirect and has no past edit history.\nThis means that you can rename a page back to where it was renamed from if you make a mistake, and you cannot overwrite an existing page.\n\n<strong>Warning!</strong>\nThis can be a drastic and unexpected change for a popular page;\nplease be sure you understand the consequences of this before proceeding.",
+       "movepagetext-noredirectfixer": "Using the form below will rename a page, moving all of its history to the new name.\nThe old title will become a redirect page to the new title.\nBe sure to check for [[Special:DoubleRedirects|double]] or [[Special:BrokenRedirects|broken redirects]].\nYou are responsible for making sure that links continue to point where they are supposed to go.\n\nNote that the page will <strong>not</strong> be moved if there is already a page at the new title, unless it is a redirect and has no past edit history.\nThis means that you can rename a page back to where it was renamed from if you make a mistake, and you cannot overwrite an existing page.\n\n<strong>Warning!</strong>\nThis can be a drastic and unexpected change for a popular page;\nplease be sure you understand the consequences of this before proceeding.",
+       "movepagetalktext": "The associated talk page will be automatically moved along with it <strong>unless:</strong>\n*A non-empty talk page already exists under the new name, or\n*You uncheck the box below.\n\nIn those cases, you will have to move or merge the page manually if desired.",
+       "movearticle": "Move page:",
+       "moveuserpage-warning": "<strong>Warning:</strong> You are about to move a user page. Please note that only the page will be moved and the user will <em>not</em> be renamed.",
+       "movecategorypage-warning": "<strong>Warning:</strong> You are about to move a category page. Please note that only the page will be moved and any pages in the old category will <em>not</em> be recategorized into the new one.",
+       "movenologintext": "You must be a registered user and [[Special:UserLogin|logged in]] to move a page.",
+       "movenotallowed": "You do not have permission to move pages.",
+       "movenotallowedfile": "You do not have permission to move files.",
+       "cant-move-user-page": "You do not have permission to move user pages (apart from subpages).",
+       "cant-move-to-user-page": "You do not have permission to move a page to a user page (except to a user subpage).",
+       "cant-move-category-page": "You do not have permission to move category pages.",
+       "cant-move-to-category-page": "You do not have permission to move a page to a category page.",
+       "newtitle": "To new title:",
+       "move-watch": "Watch source page and target page",
+       "movepagebtn": "Move page",
+       "pagemovedsub": "Move succeeded",
+       "movepage-moved": "<strong>\"$1\" has been moved to \"$2\"</strong>",
+       "movepage-moved-redirect": "A redirect has been created.",
+       "movepage-moved-noredirect": "The creation of a redirect has been suppressed.",
+       "articleexists": "A page of that name already exists, or the name you have chosen is not valid.\nPlease choose another name.",
+       "cantmove-titleprotected": "You cannot move a page to this location because the new title has been protected from creation",
+       "movetalk": "Move associated talk page",
+       "move-subpages": "Move subpages (up to $1)",
+       "move-talk-subpages": "Move subpages of talk page (up to $1)",
+       "movepage-page-exists": "The page $1 already exists and cannot be automatically overwritten.",
+       "movepage-page-moved": "The page $1 has been moved to $2.",
+       "movepage-page-unmoved": "The page $1 could not be moved to $2.",
+       "movepage-max-pages": "The maximum of $1 {{PLURAL:$1|page|pages}} has been moved and no more will be moved automatically.",
+       "movelogpage": "Move log",
+       "movelogpagetext": "Below is a list of all page moves.",
+       "movesubpage": "{{PLURAL:$1|Subpage|Subpages}}",
+       "movesubpagetext": "This page has $1 {{PLURAL:$1|subpage|subpages}} shown below.",
+       "movenosubpage": "This page has no subpages.",
+       "movereason": "Reason:",
+       "move-redirect-text": "",
+       "category-move-redirect-override": "-",
+       "revertmove": "revert",
+       "delete_and_move": "Delete and move",
+       "delete_and_move_text": "== Deletion required ==\nThe destination page \"[[:$1]]\" already exists.\nDo you want to delete it to make way for the move?",
+       "delete_and_move_confirm": "Yes, delete the page",
+       "delete_and_move_reason": "Deleted to make way for move from \"[[$1]]\"",
+       "selfmove": "Source and destination titles are the same;\ncannot move a page over itself.",
+       "immobile-source-namespace": "Cannot move pages in namespace \"$1\"",
+       "immobile-target-namespace": "Cannot move pages into namespace \"$1\"",
+       "immobile-target-namespace-iw": "Interwiki link is not a valid target for page move.",
+       "immobile-source-page": "This page is not movable.",
+       "immobile-target-page": "Cannot move to that destination title.",
+       "bad-target-model": "The desired destination uses a different content model. Cannot convert from $1 to $2.",
+       "imagenocrossnamespace": "Cannot move file to non-file namespace",
+       "nonfile-cannot-move-to-file": "Cannot move non-file to file namespace",
+       "imagetypemismatch": "The new file extension does not match its type",
+       "imageinvalidfilename": "The target filename is invalid",
+       "fix-double-redirects": "Update any redirects that point to the original title",
+       "move-leave-redirect": "Leave a redirect behind",
+       "protectedpagemovewarning": "<strong>Warning:</strong> This page has been protected so that only users with administrator privileges can move it.\nThe latest log entry is provided below for reference:",
+       "semiprotectedpagemovewarning": "<strong>Note:</strong> This page has been protected so that only registered users can move it.\nThe latest log entry is provided below for reference:",
+       "move-over-sharedrepo": "== File exists ==\n[[:$1]] exists on a shared repository. Moving a file to this title will override the shared file.",
+       "file-exists-sharedrepo": "The filename chosen is already in use on a shared repository.\nPlease choose another name.",
+       "export": "Export pages",
+       "export-summary": "",
+       "exporttext": "You can export the text and editing history of a particular page or set of pages wrapped in some XML.\nThis can be imported into another wiki using MediaWiki via the [[Special:Import|import page]].\n\nTo export pages, enter the titles in the text box below, one title per line, and select whether you want the current revision as well as all old revisions, with the page history lines, or the current revision with the info about the last edit.\n\nIn the latter case you can also use a link, for example [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] for the page \"[[{{MediaWiki:Mainpage}}]]\".",
+       "exportall": "Export all pages",
+       "exportcuronly": "Include only the current revision, not the full history",
+       "exportnohistory": "----\n<strong>Note:</strong> Exporting the full history of pages through this form has been disabled due to performance reasons.",
+       "exportlistauthors": "Include a full list of contributors for each page",
+       "export-submit": "Export",
+       "export-addcattext": "Add pages from category:",
+       "export-addcat": "Add",
+       "export-addnstext": "Add pages from namespace:",
+       "export-addns": "Add",
+       "export-download": "Save as file",
+       "export-templates": "Include templates",
+       "export-pagelinks": "Include linked pages to a depth of:",
+       "allmessages": "System messages",
+       "allmessagesname": "Name",
+       "allmessagesdefault": "Default message text",
+       "allmessagescurrent": "Current message text",
+       "allmessagestext": "This is a list of system messages available in the MediaWiki namespace.\nPlease visit [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] and [//translatewiki.net translatewiki.net] if you wish to contribute to the generic MediaWiki localisation.",
+       "allmessagesnotsupportedDB": "This page cannot be used because <strong>$wgUseDatabaseMessages</strong> has been disabled.",
+       "allmessages-filter-legend": "Filter",
+       "allmessages-filter": "Filter by customization state:",
+       "allmessages-filter-unmodified": "Unmodified",
+       "allmessages-filter-all": "All",
+       "allmessages-filter-modified": "Modified",
+       "allmessages-prefix": "Filter by prefix:",
+       "allmessages-language": "Language:",
+       "allmessages-filter-submit": "Go",
+       "allmessages-filter-translate": "Translate",
+       "thumbnail-more": "Enlarge",
+       "filemissing": "File missing",
+       "thumbnail_error": "Error creating thumbnail: $1",
+       "thumbnail_error_remote": "Error message from $1:\n$2",
+       "djvu_page_error": "DjVu page out of range",
+       "djvu_no_xml": "Unable to fetch XML for DjVu file",
+       "thumbnail-temp-create": "Unable to create temporary thumbnail file",
+       "thumbnail-dest-create": "Unable to save thumbnail to destination",
+       "thumbnail_invalid_params": "Invalid thumbnail parameters",
+       "thumbnail_dest_directory": "Unable to create destination directory",
+       "thumbnail_image-type": "Image type not supported",
+       "thumbnail_gd-library": "Incomplete GD library configuration: Missing function $1",
+       "thumbnail_image-missing": "File seems to be missing: $1",
+       "thumbnail_image-failure-limit": "There have been too many recent failed attempts ($1 or more) to render this thumbnail. Please try again later.",
+       "import": "Import pages",
+       "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-history": "Copy all history revisions for this page",
+       "import-interwiki-templates": "Include all templates",
+       "import-interwiki-submit": "Import",
+       "import-interwiki-namespace": "Destination namespace:",
+       "import-interwiki-rootpage": "Destination root page (optional):",
+       "import-upload-filename": "Filename:",
+       "import-comment": "Comment:",
+       "importtext": "Please export the file from the source wiki using the [[Special:Export|export utility]].\nSave it to your computer and upload it here.",
+       "importstart": "Importing pages...",
+       "import-revision-count": "$1 {{PLURAL:$1|revision|revisions}}",
+       "importnopages": "No pages to import.",
+       "imported-log-entries": "Imported $1 {{PLURAL:$1|log entry|log entries}}.",
+       "importfailed": "Import failed: <nowiki>$1</nowiki>",
+       "importunknownsource": "Unknown import source type",
+       "importcantopen": "Could not open import file",
+       "importbadinterwiki": "Bad interwiki link",
+       "importsuccess": "Import finished!",
+       "importnosources": "No transwiki import sources have been defined and direct history uploads are disabled.",
+       "importnofile": "No import file was uploaded.",
+       "importuploaderrorsize": "Upload of import file failed.\nThe file is bigger than the allowed upload size.",
+       "importuploaderrorpartial": "Upload of import file failed.\nThe file was only partially uploaded.",
+       "importuploaderrortemp": "Upload of import file failed.\nA temporary folder is missing.",
+       "import-parse-failure": "XML import parse failure",
+       "import-noarticle": "No page to import!",
+       "import-nonewrevisions": "No revisions imported (all were either already present, or skipped due to errors).",
+       "xml-error-string": "$1 at line $2, col $3 (byte $4): $5",
+       "import-upload": "Upload XML data",
+       "import-token-mismatch": "Loss of session data.\nPlease try again.",
+       "import-invalid-interwiki": "Cannot import from the specified wiki.",
+       "import-error-edit": "Page \"$1\" is not imported because you are not allowed to edit it.",
+       "import-error-create": "Page \"$1\" is not imported because you are not allowed to create it.",
+       "import-error-interwiki": "Page \"$1\" is not imported because its name is reserved for external linking (interwiki).",
+       "import-error-special": "Page \"$1\" is not imported because it belongs to a special namespace that does not allow pages.",
+       "import-error-invalid": "Page \"$1\" is not imported because its name is invalid.",
+       "import-error-unserialize": "Revision $2 of page \"$1\" could not be unserialized. The revision was reported to use content model $3 serialized as $4.",
+       "import-error-bad-location": "Revision $2 using content model $3 cannot be stored on \"$1\" on this wiki, since that model is not supported on that page.",
+       "import-options-wrong": "Wrong {{PLURAL:$2|option|options}}: <nowiki>$1</nowiki>",
+       "import-rootpage-invalid": "Given root page is an invalid title.",
+       "import-rootpage-nosubpage": "Namespace \"$1\" of the root page does not allow subpages.",
+       "importlogpage": "Import log",
+       "importlogpagetext": "Administrative imports of pages with edit history from other wikis.",
+       "import-logentry-upload": "imported [[$1]] by file upload",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|revision|revisions}}",
+       "import-logentry-interwiki": "transwikied $1",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|revision|revisions}} from $2",
+       "javascripttest": "JavaScript testing",
+       "javascripttest-backlink": "< $1",
+       "javascripttest-title": "Running $1 tests",
+       "javascripttest-pagetext-noframework": "This page is reserved for running JavaScript tests.",
+       "javascripttest-pagetext-unknownframework": "Unknown testing framework \"$1\".",
+       "javascripttest-pagetext-frameworks": "Please choose one of the following testing frameworks: $1",
+       "javascripttest-pagetext-skins": "Choose a skin to run the tests with:",
+       "javascripttest-qunit-name": "QUnit",
+       "javascripttest-qunit-intro": "See [$1 testing documentation] on mediawiki.org.",
+       "javascripttest-qunit-heading": "MediaWiki JavaScript QUnit test suite",
+       "accesskey-pt-userpage": ".",
+       "accesskey-pt-anonuserpage": ".",
+       "accesskey-pt-mytalk": "n",
+       "accesskey-pt-anontalk": "n",
+       "accesskey-pt-preferences": "",
+       "accesskey-pt-watchlist": "l",
+       "accesskey-pt-mycontris": "y",
+       "accesskey-pt-login": "o",
+       "accesskey-pt-logout": "",
+       "accesskey-ca-talk": "t",
+       "accesskey-ca-edit": "e",
+       "accesskey-ca-addsection": "+",
+       "accesskey-ca-viewsource": "e",
+       "accesskey-ca-history": "h",
+       "accesskey-ca-protect": "=",
+       "accesskey-ca-unprotect": "=",
+       "accesskey-ca-delete": "d",
+       "accesskey-ca-undelete": "d",
+       "accesskey-ca-move": "m",
+       "accesskey-ca-watch": "w",
+       "accesskey-ca-unwatch": "w",
+       "accesskey-search": "f",
+       "accesskey-search-go": "",
+       "accesskey-search-fulltext": "",
+       "accesskey-p-logo": "",
+       "accesskey-n-mainpage": "z",
+       "accesskey-n-mainpage-description": "z",
+       "accesskey-n-portal": "",
+       "accesskey-n-currentevents": "",
+       "accesskey-n-recentchanges": "r",
+       "accesskey-n-randompage": "x",
+       "accesskey-n-help": "",
+       "accesskey-t-whatlinkshere": "j",
+       "accesskey-t-recentchangeslinked": "k",
+       "accesskey-feed-rss": "",
+       "accesskey-feed-atom": "",
+       "accesskey-t-contributions": "",
+       "accesskey-t-emailuser": "",
+       "accesskey-t-permalink": "",
+       "accesskey-t-print": "p",
+       "accesskey-t-upload": "u",
+       "accesskey-t-specialpages": "q",
+       "accesskey-ca-nstab-main": "c",
+       "accesskey-ca-nstab-user": "c",
+       "accesskey-ca-nstab-media": "c",
+       "accesskey-ca-nstab-special": "",
+       "accesskey-ca-nstab-project": "a",
+       "accesskey-ca-nstab-image": "c",
+       "accesskey-ca-nstab-mediawiki": "c",
+       "accesskey-ca-nstab-template": "c",
+       "accesskey-ca-nstab-help": "c",
+       "accesskey-ca-nstab-category": "c",
+       "accesskey-minoredit": "i",
+       "accesskey-save": "s",
+       "accesskey-preview": "p",
+       "accesskey-diff": "v",
+       "accesskey-compareselectedversions": "v",
+       "accesskey-watch": "w",
+       "accesskey-upload": "s",
+       "accesskey-preferences-save": "s",
+       "accesskey-summary": "b",
+       "accesskey-userrights-set": "s",
+       "accesskey-blockip-block": "s",
+       "accesskey-export": "s",
+       "accesskey-import": "s",
+       "accesskey-watchlistedit-normal-submit": "s",
+       "accesskey-watchlistedit-raw-submit": "s",
+       "tooltip-pt-userpage": "Your user page",
+       "tooltip-pt-anonuserpage": "The user page for the IP address you are editing as",
+       "tooltip-pt-mytalk": "Your talk page",
+       "tooltip-pt-anontalk": "Discussion about edits from this IP address",
+       "tooltip-pt-preferences": "Your preferences",
+       "tooltip-pt-watchlist": "A list of pages you are monitoring for changes",
+       "tooltip-pt-mycontris": "A list of your contributions",
+       "tooltip-pt-login": "You are encouraged to log in; however, it is not mandatory",
+       "tooltip-pt-logout": "Log out",
+       "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",
+       "tooltip-ca-viewsource": "This page is protected.\nYou can view its source",
+       "tooltip-ca-history": "Past revisions of this page",
+       "tooltip-ca-protect": "Protect this page",
+       "tooltip-ca-unprotect": "Change protection of this page",
+       "tooltip-ca-delete": "Delete this page",
+       "tooltip-ca-undelete": "Restore the edits done to this page before it was deleted",
+       "tooltip-ca-move": "Move this page",
+       "tooltip-ca-watch": "Add this page to your watchlist",
+       "tooltip-ca-unwatch": "Remove this page from your watchlist",
+       "tooltip-search": "Search {{SITENAME}}",
+       "tooltip-search-go": "Go to a page with this exact name if exists",
+       "tooltip-search-fulltext": "Search the pages for this text",
+       "tooltip-p-logo": "Visit the main page",
+       "tooltip-n-mainpage": "Visit the main page",
+       "tooltip-n-mainpage-description": "Visit the main page",
+       "tooltip-n-portal": "About the project, what you can do, where to find things",
+       "tooltip-n-currentevents": "Find background information on current events",
+       "tooltip-n-recentchanges": "A list of recent changes in the wiki",
+       "tooltip-n-randompage": "Load a random page",
+       "tooltip-n-help": "The place to find out",
+       "tooltip-t-whatlinkshere": "A list of all wiki pages that link here",
+       "tooltip-t-recentchangeslinked": "Recent changes in pages linked from this page",
+       "tooltip-feed-rss": "RSS feed for this page",
+       "tooltip-feed-atom": "Atom feed for this page",
+       "tooltip-t-contributions": "A list of contributions of this user",
+       "tooltip-t-emailuser": "Send an email to this user",
+       "tooltip-t-upload": "Upload files",
+       "tooltip-t-specialpages": "A list of all special pages",
+       "tooltip-t-print": "Printable version of this page",
+       "tooltip-t-permalink": "Permanent link to this revision of the page",
+       "tooltip-ca-nstab-main": "View the content page",
+       "tooltip-ca-nstab-user": "View the user page",
+       "tooltip-ca-nstab-media": "View the media page",
+       "tooltip-ca-nstab-special": "This is a special page, you cannot edit the page itself",
+       "tooltip-ca-nstab-project": "View the project page",
+       "tooltip-ca-nstab-image": "View the file page",
+       "tooltip-ca-nstab-mediawiki": "View the system message",
+       "tooltip-ca-nstab-template": "View the template",
+       "tooltip-ca-nstab-help": "View the help page",
+       "tooltip-ca-nstab-category": "View the category page",
+       "tooltip-minoredit": "Mark this as a minor edit",
+       "tooltip-save": "Save your changes",
+       "tooltip-preview": "Preview your changes, please use this before saving!",
+       "tooltip-diff": "Show which changes you made to the text",
+       "tooltip-compareselectedversions": "See the differences between the two selected revisions of this page",
+       "tooltip-watch": "Add this page to your watchlist",
+       "tooltip-watchlistedit-normal-submit": "Remove titles",
+       "tooltip-watchlistedit-raw-submit": "Update watchlist",
+       "tooltip-recreate": "Recreate the page even though it has been deleted",
+       "tooltip-upload": "Start upload",
+       "tooltip-rollback": "\"Rollback\" reverts edit(s) to this page of the last contributor in one click",
+       "tooltip-undo": "\"Undo\" reverts this edit and opens the edit form in preview mode. It allows adding a reason in the summary.",
+       "tooltip-preferences-save": "Save preferences",
+       "tooltip-summary": "Enter a short summary",
+       "interlanguage-link-title": "$1 – $2",
+       "interlanguage-link-title-langonly": "$1",
+       "common.css": "/* CSS placed here will be applied to all skins */",
+       "monobook.css": "/* CSS placed here will affect users of the MonoBook skin */",
+       "vector.css": "/* CSS placed here will affect users of the Vector skin */",
+       "print.css": "/* CSS placed here will affect the print output */",
+       "noscript.css": "/* CSS placed here will affect users with JavaScript disabled */",
+       "group-autoconfirmed.css": "/* CSS placed here will affect autoconfirmed users only */",
+       "group-user.css": "/* CSS placed here will affect registered users only */",
+       "group-bot.css": "/* CSS placed here will affect bots only */",
+       "group-sysop.css": "/* CSS placed here will affect sysops only */",
+       "group-bureaucrat.css": "/* CSS placed here will affect bureaucrats only */",
+       "common.js": "/* Any JavaScript here will be loaded for all users on every page load. */",
+       "monobook.js": "/* Any JavaScript here will be loaded for users using the MonoBook skin */",
+       "vector.js": "/* Any JavaScript here will be loaded for users using the Vector skin */",
+       "group-autoconfirmed.js": "/* Any JavaScript here will be loaded for autoconfirmed users only */",
+       "group-user.js": "/* Any JavaScript here will be loaded for registered users only */",
+       "group-bot.js": "/* Any JavaScript here will be loaded for bots only */",
+       "group-sysop.js": "/* Any JavaScript here will be loaded for sysops only */",
+       "group-bureaucrat.js": "/* Any JavaScript here will be loaded for bureaucrats only */",
+       "anonymous": "Anonymous {{PLURAL:$1|user|users}} of {{SITENAME}}",
+       "siteuser": "{{SITENAME}} user $1",
+       "anonuser": "{{SITENAME}} anonymous user $1",
+       "lastmodifiedatby": "This page was last modified $2, $1 by $3.",
+       "othercontribs": "Based on work by $1.",
+       "others": "others",
+       "siteusers": "{{SITENAME}} {{PLURAL:$2|user|users}} $1",
+       "anonusers": "{{SITENAME}} anonymous {{PLURAL:$2|user|users}} $1",
+       "creditspage": "Page credits",
+       "nocredits": "There is no credits info available for this page.",
+       "spamprotectiontitle": "Spam protection filter",
+       "spamprotectiontext": "The text you wanted to save was blocked by the spam filter.\nThis is probably caused by a link to a blacklisted external site.",
+       "spamprotectionmatch": "The following text is what triggered our spam filter: $1",
+       "spambot_username": "MediaWiki spam cleanup",
+       "spam_reverting": "Reverting to last revision not containing links to $1",
+       "spam_blanking": "All revisions contained links to $1, blanking",
+       "spam_deleting": "All revisions contained links to $1, deleting",
+       "simpleantispam-label": "Anti-spam check.\nDo <strong>NOT</strong> fill this in!",
+       "pageinfo-header": "-",
+       "pageinfo-title": "Information for \"$1\"",
+       "pageinfo-not-current": "Sorry, it's impossible to provide this information for old revisions.",
+       "pageinfo-header-basic": "Basic information",
+       "pageinfo-header-edits": "Edit history",
+       "pageinfo-header-restrictions": "Page protection",
+       "pageinfo-header-properties": "Page properties",
+       "pageinfo-display-title": "Display title",
+       "pageinfo-default-sort": "Default sort key",
+       "pageinfo-length": "Page length (in bytes)",
+       "pageinfo-article-id": "Page ID",
+       "pageinfo-language": "Page content language",
+       "pageinfo-content-model": "Page content model",
+       "pageinfo-robot-policy": "Indexing by robots",
+       "pageinfo-robot-index": "Allowed",
+       "pageinfo-robot-noindex": "Disallowed",
+       "pageinfo-views": "Number of views",
+       "pageinfo-watchers": "Number of page watchers",
+       "pageinfo-few-watchers": "Fewer than $1 {{PLURAL:$1|watcher|watchers}}",
+       "pageinfo-redirects-name": "Number of redirects to this page",
+       "pageinfo-redirects-value": "$1",
+       "pageinfo-subpages-name": "Number of subpages of this page",
+       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|redirect|redirects}}; $3 {{PLURAL:$3|non-redirect|non-redirects}})",
+       "pageinfo-firstuser": "Page creator",
+       "pageinfo-firsttime": "Date of page creation",
+       "pageinfo-lastuser": "Latest editor",
+       "pageinfo-lasttime": "Date of latest edit",
+       "pageinfo-edits": "Total number of edits",
+       "pageinfo-authors": "Total number of distinct authors",
+       "pageinfo-recent-edits": "Recent number of edits (within past $1)",
+       "pageinfo-recent-authors": "Recent number of distinct authors",
+       "pageinfo-magic-words": "Magic {{PLURAL:$1|word|words}} ($1)",
+       "pageinfo-hidden-categories": "Hidden {{PLURAL:$1|category|categories}} ($1)",
+       "pageinfo-templates": "Transcluded {{PLURAL:$1|template|templates}} ($1)",
+       "pageinfo-transclusions": "{{PLURAL:$1|Page|Pages}} transcluded on ($1)",
+       "pageinfo-footer": "-",
+       "pageinfo-toolboxlink": "Page information",
+       "pageinfo-redirectsto": "Redirects to",
+       "pageinfo-redirectsto-info": "info",
+       "pageinfo-contentpage": "Counted as a content page",
+       "pageinfo-contentpage-yes": "Yes",
+       "pageinfo-protect-cascading": "Protections are cascading from here",
+       "pageinfo-protect-cascading-yes": "Yes",
+       "pageinfo-protect-cascading-from": "Protections are cascading from",
+       "pageinfo-category-info": "Category information",
+       "pageinfo-category-pages": "Number of pages",
+       "pageinfo-category-subcats": "Number of subcategories",
+       "pageinfo-category-files": "Number of files",
+       "skinname-monobook": "MonoBook",
+       "skinname-vector": "Vector",
+       "markaspatrolleddiff": "Mark as patrolled",
+       "markaspatrolledlink": "[$1]",
+       "markaspatrolledtext": "Mark this page as patrolled",
+       "markedaspatrolled": "Marked as patrolled",
+       "markedaspatrolledtext": "The selected revision of [[:$1]] has been marked as patrolled.",
+       "rcpatroldisabled": "Recent changes patrol disabled",
+       "rcpatroldisabledtext": "The recent changes patrol feature is currently disabled.",
+       "markedaspatrollederror": "Cannot mark as patrolled",
+       "markedaspatrollederrortext": "You need to specify a revision to mark as patrolled.",
+       "markedaspatrollederror-noautopatrol": "You are not allowed to mark your own changes as patrolled.",
+       "markedaspatrollednotify": "This change to $1 has been marked as patrolled.",
+       "markedaspatrollederrornotify": "Marking as patrolled failed.",
+       "patrol-log-page": "Patrol log",
+       "patrol-log-header": "This is a log of patrolled revisions.",
+       "log-show-hide-patrol": "$1 patrol log",
+       "deletedrevision": "Deleted old revision $1",
+       "filedeleteerror-short": "Error deleting file: $1",
+       "filedeleteerror-long": "Errors were encountered while deleting the file:\n\n$1",
+       "filedelete-missing": "The file \"$1\" cannot be deleted because it does not exist.",
+       "filedelete-old-unregistered": "The specified file revision \"$1\" is not in the database.",
+       "filedelete-current-unregistered": "The specified file \"$1\" is not in the database.",
+       "filedelete-archive-read-only": "The archive directory \"$1\" is not writable by the webserver.",
+       "previousdiff": "← Older edit",
+       "nextdiff": "Newer edit →",
+       "mediawarning": "<strong>Warning:</strong> This file type may contain malicious code.\nBy executing it, your system may be compromised.",
+       "imagemaxsize": "Image size limit:<br /><em>(for file description pages)</em>",
+       "thumbsize": "Thumbnail size:",
+       "widthheight": "$1 × $2",
+       "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|page|pages}}",
+       "file-info": "file size: $1, MIME type: $2",
+       "file-info-size": "$1 × $2 pixels, file size: $3, MIME type: $4",
+       "file-info-size-pages": "$1 × $2 pixels, file size: $3, MIME type: $4, $5 {{PLURAL:$5|page|pages}}",
+       "file-nohires": "No higher resolution available.",
+       "svg-long-desc": "SVG file, nominally $1 × $2 pixels, file size: $3",
+       "svg-long-desc-animated": "Animated SVG file, nominally $1 × $2 pixels, file size: $3",
+       "svg-long-error": "Invalid SVG file: $1",
+       "show-big-image": "Original file",
+       "show-big-image-preview": "Size of this preview: $1.",
+       "show-big-image-other": "Other {{PLURAL:$2|resolution|resolutions}}: $1.",
+       "show-big-image-size": "$1 × $2 pixels",
+       "file-info-gif-looped": "looped",
+       "file-info-gif-frames": "$1 {{PLURAL:$1|frame|frames}}",
+       "file-info-png-looped": "looped",
+       "file-info-png-repeat": "played $1 {{PLURAL:$1|time|times}}",
+       "file-info-png-frames": "$1 {{PLURAL:$1|frame|frames}}",
+       "file-no-thumb-animation": "<strong>Note: Due to technical limitations, thumbnails of this file will not be animated.</strong>",
+       "file-no-thumb-animation-gif": "<strong>Note: Due to technical limitations, thumbnails of high resolution GIF images such as this one will not be animated.</strong>",
+       "newimages": "Gallery of new files",
+       "newimagestext": "-",
+       "imagelisttext": "Below is a list of <strong>$1</strong> {{PLURAL:$1|file|files}} sorted $2.",
+       "newimages-summary": "This special page shows the last uploaded files.",
+       "newimages-legend": "Filter",
+       "newimages-label": "Filename (or a part of it):",
+       "newimages-showbots": "Show uploads by bots",
+       "noimages": "Nothing to see.",
+       "ilsubmit": "Search",
+       "bydate": "by date",
+       "sp-newimages-showfrom": "Show new files starting from $2, $1",
+       "video-dims": "$1, $2 × $3",
+       "seconds-abbrev": "$1 s",
+       "minutes-abbrev": "$1 min",
+       "hours-abbrev": "$1 h",
+       "days-abbrev": "$1 d",
+       "seconds": "{{PLURAL:$1|$1 second|$1 seconds}}",
+       "minutes": "{{PLURAL:$1|$1 minute|$1 minutes}}",
+       "hours": "{{PLURAL:$1|$1 hour|$1 hours}}",
+       "days": "{{PLURAL:$1|$1 day|$1 days}}",
+       "weeks": "{{PLURAL:$1|$1 week|$1 weeks}}",
+       "months": "{{PLURAL:$1|$1 month|$1 months}}",
+       "years": "{{PLURAL:$1|$1 year|$1 years}}",
+       "ago": "$1 ago",
+       "just-now": "just now",
+       "hours-ago": "$1 {{PLURAL:$1|hour|hours}} ago",
+       "minutes-ago": "$1 {{PLURAL:$1|minute|minutes}} ago",
+       "seconds-ago": "$1 {{PLURAL:$1|second|seconds}} ago",
+       "monday-at": "Monday at $1",
+       "tuesday-at": "Tuesday at $1",
+       "wednesday-at": "Wednesday at $1",
+       "thursday-at": "Thursday at $1",
+       "friday-at": "Friday at $1",
+       "saturday-at": "Saturday at $1",
+       "sunday-at": "Sunday at $1",
+       "today-at": "$1",
+       "yesterday-at": "Yesterday at $1",
+       "bad_image_list": "The format is as follows:\n\nOnly list items (lines starting with *) are considered.\nThe first link on a line must be a link to a bad file.\nAny subsequent links on the same line are considered to be exceptions, i.e. pages where the file may occur inline.",
+       "variantname-zh-hans": "hans",
+       "variantname-zh-hant": "hant",
+       "variantname-zh-cn": "cn",
+       "variantname-zh-tw": "tw",
+       "variantname-zh-hk": "hk",
+       "variantname-zh-mo": "mo",
+       "variantname-zh-sg": "sg",
+       "variantname-zh-my": "my",
+       "variantname-zh": "zh",
+       "variantname-gan-hans": "hans",
+       "variantname-gan-hant": "hant",
+       "variantname-gan": "gan",
+       "variantname-sr-ec": "sr-ec",
+       "variantname-sr-el": "sr-el",
+       "variantname-sr": "sr",
+       "variantname-kk-kz": "kk-kz",
+       "variantname-kk-tr": "kk-tr",
+       "variantname-kk-cn": "kk-cn",
+       "variantname-kk-cyrl": "kk-cyrl",
+       "variantname-kk-latn": "kk-latn",
+       "variantname-kk-arab": "kk-arab",
+       "variantname-kk": "kk",
+       "variantname-ku-arab": "ku-Arab",
+       "variantname-ku-latn": "ku-Latn",
+       "variantname-ku": "ku",
+       "variantname-tg-cyrl": "tg-Cyrl",
+       "variantname-tg-latn": "tg-Latn",
+       "variantname-tg": "tg",
+       "variantname-ike-cans": "ike-Cans",
+       "variantname-ike-latn": "ike-Latn",
+       "variantname-iu": "iu",
+       "variantname-shi-tfng": "shi-Tfng",
+       "variantname-shi-latn": "shi-Latn",
+       "variantname-shi": "shi",
+       "variantname-uz": "uz",
+       "variantname-uz-latn": "uz-Latn",
+       "variantname-uz-cyrl": "uz-Cyrl",
+       "metadata": "Metadata",
+       "metadata-help": "This file contains additional information, probably added from the digital camera or scanner used to create or digitize it.\nIf the file has been modified from its original state, some details may not fully reflect the modified file.",
+       "metadata-expand": "Show extended details",
+       "metadata-collapse": "Hide extended details",
+       "metadata-fields": "Image metadata fields listed in this message will be included on image page display when the metadata table is collapsed.\nOthers will be hidden by 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",
+       "metadata-langitem": "<strong>$2:</strong> $1",
+       "metadata-langitem-default": "$1",
+       "exif-imagewidth": "Width",
+       "exif-imagelength": "Height",
+       "exif-bitspersample": "Bits per component",
+       "exif-compression": "Compression scheme",
+       "exif-photometricinterpretation": "Pixel composition",
+       "exif-orientation": "Orientation",
+       "exif-samplesperpixel": "Number of components",
+       "exif-planarconfiguration": "Data arrangement",
+       "exif-ycbcrsubsampling": "Subsampling ratio of Y to C",
+       "exif-ycbcrpositioning": "Y and C positioning",
+       "exif-xresolution": "Horizontal resolution",
+       "exif-yresolution": "Vertical resolution",
+       "exif-stripoffsets": "Image data location",
+       "exif-rowsperstrip": "Number of rows per strip",
+       "exif-stripbytecounts": "Bytes per compressed strip",
+       "exif-jpeginterchangeformat": "Offset to JPEG SOI",
+       "exif-jpeginterchangeformatlength": "Bytes of JPEG data",
+       "exif-whitepoint": "White point chromaticity",
+       "exif-primarychromaticities": "Chromaticities of primarities",
+       "exif-ycbcrcoefficients": "Color space transformation matrix coefficients",
+       "exif-referenceblackwhite": "Pair of black and white reference values",
+       "exif-datetime": "File change date and time",
+       "exif-imagedescription": "Image title",
+       "exif-make": "Camera manufacturer",
+       "exif-model": "Camera model",
+       "exif-software": "Software used",
+       "exif-artist": "Author",
+       "exif-copyright": "Copyright holder",
+       "exif-exifversion": "Exif version",
+       "exif-flashpixversion": "Supported Flashpix version",
+       "exif-colorspace": "Color space",
+       "exif-componentsconfiguration": "Meaning of each component",
+       "exif-compressedbitsperpixel": "Image compression mode",
+       "exif-pixelydimension": "Image width",
+       "exif-pixelxdimension": "Image height",
+       "exif-usercomment": "User comments",
+       "exif-relatedsoundfile": "Related audio file",
+       "exif-datetimeoriginal": "Date and time of data generation",
+       "exif-datetimedigitized": "Date and time of digitizing",
+       "exif-subsectime": "DateTime subseconds",
+       "exif-subsectimeoriginal": "DateTimeOriginal subseconds",
+       "exif-subsectimedigitized": "DateTimeDigitized subseconds",
+       "exif-exposuretime": "Exposure time",
+       "exif-exposuretime-format": "$1 sec ($2)",
+       "exif-fnumber": "F Number",
+       "exif-fnumber-format": "f/$1",
+       "exif-exposureprogram": "Exposure Program",
+       "exif-spectralsensitivity": "Spectral sensitivity",
+       "exif-isospeedratings": "ISO speed rating",
+       "exif-shutterspeedvalue": "APEX shutter speed",
+       "exif-aperturevalue": "APEX aperture",
+       "exif-brightnessvalue": "APEX brightness",
+       "exif-exposurebiasvalue": "APEX exposure bias",
+       "exif-maxaperturevalue": "Maximum land aperture",
+       "exif-subjectdistance": "Subject distance",
+       "exif-meteringmode": "Metering mode",
+       "exif-lightsource": "Light source",
+       "exif-flash": "Flash",
+       "exif-focallength": "Lens focal length",
+       "exif-focallength-format": "$1 mm",
+       "exif-subjectarea": "Subject area",
+       "exif-flashenergy": "Flash energy",
+       "exif-focalplanexresolution": "Focal plane X resolution",
+       "exif-focalplaneyresolution": "Focal plane Y resolution",
+       "exif-focalplaneresolutionunit": "Focal plane resolution unit",
+       "exif-subjectlocation": "Subject location",
+       "exif-exposureindex": "Exposure index",
+       "exif-sensingmethod": "Sensing method",
+       "exif-filesource": "File source",
+       "exif-scenetype": "Scene type",
+       "exif-customrendered": "Custom image processing",
+       "exif-exposuremode": "Exposure mode",
+       "exif-whitebalance": "White balance",
+       "exif-digitalzoomratio": "Digital zoom ratio",
+       "exif-focallengthin35mmfilm": "Focal length in 35 mm film",
+       "exif-scenecapturetype": "Scene capture type",
+       "exif-gaincontrol": "Scene control",
+       "exif-contrast": "Contrast",
+       "exif-saturation": "Saturation",
+       "exif-sharpness": "Sharpness",
+       "exif-devicesettingdescription": "Device settings description",
+       "exif-subjectdistancerange": "Subject distance range",
+       "exif-imageuniqueid": "Unique image ID",
+       "exif-gpsversionid": "GPS tag version",
+       "exif-gpslatituderef": "North or south latitude",
+       "exif-gpslatitude": "Latitude",
+       "exif-gpslongituderef": "East or west longitude",
+       "exif-gpslongitude": "Longitude",
+       "exif-gpsaltituderef": "Altitude reference",
+       "exif-gpsaltitude": "Altitude",
+       "exif-gpstimestamp": "GPS time (atomic clock)",
+       "exif-gpssatellites": "Satellites used for measurement",
+       "exif-gpsstatus": "Receiver status",
+       "exif-gpsmeasuremode": "Measurement mode",
+       "exif-gpsdop": "Measurement precision",
+       "exif-gpsspeedref": "Speed unit",
+       "exif-gpsspeed": "Speed of GPS receiver",
+       "exif-gpstrackref": "Reference for direction of movement",
+       "exif-gpstrack": "Direction of movement",
+       "exif-gpsimgdirectionref": "Reference for direction of image",
+       "exif-gpsimgdirection": "Direction of image",
+       "exif-gpsmapdatum": "Geodetic survey data used",
+       "exif-gpsdestlatituderef": "Reference for latitude of destination",
+       "exif-gpsdestlatitude": "Latitude destination",
+       "exif-gpsdestlongituderef": "Reference for longitude of destination",
+       "exif-gpsdestlongitude": "Longitude of destination",
+       "exif-gpsdestbearingref": "Reference for bearing of destination",
+       "exif-gpsdestbearing": "Bearing of destination",
+       "exif-gpsdestdistanceref": "Reference for distance to destination",
+       "exif-gpsdestdistance": "Distance to destination",
+       "exif-gpsprocessingmethod": "Name of GPS processing method",
+       "exif-gpsareainformation": "Name of GPS area",
+       "exif-gpsdatestamp": "GPS date",
+       "exif-gpsdifferential": "GPS differential correction",
+       "exif-coordinate-format": "$1° $2′ $3″ $4",
+       "exif-jpegfilecomment": "JPEG file comment",
+       "exif-keywords": "Keywords",
+       "exif-worldregioncreated": "World region that the picture was taken in",
+       "exif-countrycreated": "Country that the picture was taken in",
+       "exif-countrycodecreated": "Code for the country that the picture was taken in",
+       "exif-provinceorstatecreated": "Province or state that the picture was taken in",
+       "exif-citycreated": "City that the picture was taken in",
+       "exif-sublocationcreated": "Sublocation of the city that the picture was taken in",
+       "exif-worldregiondest": "World region shown",
+       "exif-countrydest": "Country shown",
+       "exif-countrycodedest": "Code for country shown",
+       "exif-provinceorstatedest": "Province or state shown",
+       "exif-citydest": "City shown",
+       "exif-sublocationdest": "Sublocation of city shown",
+       "exif-objectname": "Short title",
+       "exif-specialinstructions": "Special instructions",
+       "exif-headline": "Headline",
+       "exif-credit": "Credit/Provider",
+       "exif-source": "Source",
+       "exif-editstatus": "Editorial status of image",
+       "exif-urgency": "Urgency",
+       "exif-fixtureidentifier": "Fixture name",
+       "exif-locationdest": "Location depicted",
+       "exif-locationdestcode": "Code of location depicted",
+       "exif-objectcycle": "Time of day that media is intended for",
+       "exif-contact": "Contact information",
+       "exif-writer": "Writer",
+       "exif-languagecode": "Language",
+       "exif-iimversion": "IIM version",
+       "exif-iimcategory": "Category",
+       "exif-iimsupplementalcategory": "Supplemental categories",
+       "exif-datetimeexpires": "Do not use after",
+       "exif-datetimereleased": "Released on",
+       "exif-originaltransmissionref": "Original transmission location code",
+       "exif-identifier": "Identifier",
+       "exif-lens": "Lens used",
+       "exif-serialnumber": "Serial number of camera",
+       "exif-cameraownername": "Owner of camera",
+       "exif-label": "Label",
+       "exif-datetimemetadata": "Date metadata was last modified",
+       "exif-nickname": "Informal name of image",
+       "exif-rating": "Rating (out of 5)",
+       "exif-rightscertificate": "Rights management certificate",
+       "exif-copyrighted": "Copyright status",
+       "exif-copyrightowner": "Copyright owner",
+       "exif-usageterms": "Usage terms",
+       "exif-webstatement": "Online copyright statement",
+       "exif-originaldocumentid": "Unique ID of original document",
+       "exif-licenseurl": "URL for copyright license",
+       "exif-morepermissionsurl": "Alternative licensing information",
+       "exif-attributionurl": "When re-using this work, please link to",
+       "exif-preferredattributionname": "When re-using this work, please credit",
+       "exif-pngfilecomment": "PNG file comment",
+       "exif-disclaimer": "Disclaimer",
+       "exif-contentwarning": "Content warning",
+       "exif-giffilecomment": "GIF file comment",
+       "exif-intellectualgenre": "Type of item",
+       "exif-subjectnewscode": "Subject code",
+       "exif-scenecode": "IPTC scene code",
+       "exif-event": "Event depicted",
+       "exif-organisationinimage": "Organization depicted",
+       "exif-personinimage": "Person depicted",
+       "exif-originalimageheight": "Height of image before it was cropped",
+       "exif-originalimagewidth": "Width of image before it was cropped",
+       "exif-make-value": "$1",
+       "exif-model-value": "$1",
+       "exif-software-value": "$1",
+       "exif-software-version-value": "$1 (Version $2)",
+       "exif-contact-value": "$1\n\n$2\n<div class=\"adr\">\n$3\n\n$4, $5, $6 $7\n</div>\n$8",
+       "exif-subjectnewscode-value": "$2 ($1)",
+       "exif-compression-1": "Uncompressed",
+       "exif-compression-2": "CCITT Group 3 1-Dimensional Modified Huffman run length encoding",
+       "exif-compression-3": "CCITT Group 3 fax encoding",
+       "exif-compression-4": "CCITT Group 4 fax encoding",
+       "exif-compression-5": "LZW",
+       "exif-compression-6": "JPEG (old)",
+       "exif-compression-7": "JPEG",
+       "exif-compression-8": "Deflate (Adobe)",
+       "exif-compression-32773": "PackBits (Macintosh RLE)",
+       "exif-compression-32946": "Deflate (PKZIP)",
+       "exif-compression-34712": "JPEG2000",
+       "exif-copyrighted-true": "Copyrighted",
+       "exif-copyrighted-false": "Copyright status not set",
+       "exif-photometricinterpretation-2": "RGB",
+       "exif-photometricinterpretation-6": "YCbCr",
+       "exif-unknowndate": "Unknown date",
+       "exif-orientation-1": "Normal",
+       "exif-orientation-2": "Flipped horizontally",
+       "exif-orientation-3": "Rotated 180°",
+       "exif-orientation-4": "Flipped vertically",
+       "exif-orientation-5": "Rotated 90° CCW and flipped vertically",
+       "exif-orientation-6": "Rotated 90° CCW",
+       "exif-orientation-7": "Rotated 90° CW and flipped vertically",
+       "exif-orientation-8": "Rotated 90° CW",
+       "exif-planarconfiguration-1": "chunky format",
+       "exif-planarconfiguration-2": "planar format",
+       "exif-xyresolution-i": "$1 dpi",
+       "exif-xyresolution-c": "$1 dpc",
+       "exif-colorspace-1": "sRGB",
+       "exif-colorspace-65535": "Uncalibrated",
+       "exif-componentsconfiguration-0": "does not exist",
+       "exif-componentsconfiguration-1": "Y",
+       "exif-componentsconfiguration-2": "Cb",
+       "exif-componentsconfiguration-3": "Cr",
+       "exif-componentsconfiguration-4": "R",
+       "exif-componentsconfiguration-5": "G",
+       "exif-componentsconfiguration-6": "B",
+       "exif-exposureprogram-0": "Not defined",
+       "exif-exposureprogram-1": "Manual",
+       "exif-exposureprogram-2": "Normal program",
+       "exif-exposureprogram-3": "Aperture priority",
+       "exif-exposureprogram-4": "Shutter priority",
+       "exif-exposureprogram-5": "Creative program (biased toward depth of field)",
+       "exif-exposureprogram-6": "Action program (biased toward fast shutter speed)",
+       "exif-exposureprogram-7": "Portrait mode (for closeup photos with the background out of focus)",
+       "exif-exposureprogram-8": "Landscape mode (for landscape photos with the background in focus)",
+       "exif-subjectdistance-value": "$1 meters",
+       "exif-meteringmode-0": "Unknown",
+       "exif-meteringmode-1": "Average",
+       "exif-meteringmode-2": "Center weighted average",
+       "exif-meteringmode-3": "Spot",
+       "exif-meteringmode-4": "Multi-Spot",
+       "exif-meteringmode-5": "Pattern",
+       "exif-meteringmode-6": "Partial",
+       "exif-meteringmode-255": "Other",
+       "exif-lightsource-0": "Unknown",
+       "exif-lightsource-1": "Daylight",
+       "exif-lightsource-2": "Fluorescent",
+       "exif-lightsource-3": "Tungsten (incandescent light)",
+       "exif-lightsource-4": "Flash",
+       "exif-lightsource-9": "Fine weather",
+       "exif-lightsource-10": "Cloudy weather",
+       "exif-lightsource-11": "Shade",
+       "exif-lightsource-12": "Daylight fluorescent (D 5700 – 7100K)",
+       "exif-lightsource-13": "Day white fluorescent (N 4600 – 5400K)",
+       "exif-lightsource-14": "Cool white fluorescent (W 3900 – 4500K)",
+       "exif-lightsource-15": "White fluorescent (WW 3200 – 3700K)",
+       "exif-lightsource-17": "Standard light A",
+       "exif-lightsource-18": "Standard light B",
+       "exif-lightsource-19": "Standard light C",
+       "exif-lightsource-20": "D55",
+       "exif-lightsource-21": "D65",
+       "exif-lightsource-22": "D75",
+       "exif-lightsource-23": "D50",
+       "exif-lightsource-24": "ISO studio tungsten",
+       "exif-lightsource-255": "Other light source",
+       "exif-flash-fired-0": "Flash did not fire",
+       "exif-flash-fired-1": "Flash fired",
+       "exif-flash-return-0": "no strobe return detection function",
+       "exif-flash-return-2": "strobe return light not detected",
+       "exif-flash-return-3": "strobe return light detected",
+       "exif-flash-mode-1": "compulsory flash firing",
+       "exif-flash-mode-2": "compulsory flash suppression",
+       "exif-flash-mode-3": "auto mode",
+       "exif-flash-function-1": "No flash function",
+       "exif-flash-redeye-1": "red-eye reduction mode",
+       "exif-focalplaneresolutionunit-2": "inches",
+       "exif-sensingmethod-1": "Undefined",
+       "exif-sensingmethod-2": "One-chip color area sensor",
+       "exif-sensingmethod-3": "Two-chip color area sensor",
+       "exif-sensingmethod-4": "Three-chip color area sensor",
+       "exif-sensingmethod-5": "Color sequential area sensor",
+       "exif-sensingmethod-7": "Trilinear sensor",
+       "exif-sensingmethod-8": "Color sequential linear sensor",
+       "exif-filesource-3": "Digital still camera",
+       "exif-scenetype-1": "A directly photographed image",
+       "exif-customrendered-0": "Normal process",
+       "exif-customrendered-1": "Custom process",
+       "exif-exposuremode-0": "Auto exposure",
+       "exif-exposuremode-1": "Manual exposure",
+       "exif-exposuremode-2": "Auto bracket",
+       "exif-whitebalance-0": "Auto white balance",
+       "exif-whitebalance-1": "Manual white balance",
+       "exif-scenecapturetype-0": "Standard",
+       "exif-scenecapturetype-1": "Landscape",
+       "exif-scenecapturetype-2": "Portrait",
+       "exif-scenecapturetype-3": "Night scene",
+       "exif-gaincontrol-0": "None",
+       "exif-gaincontrol-1": "Low gain up",
+       "exif-gaincontrol-2": "High gain up",
+       "exif-gaincontrol-3": "Low gain down",
+       "exif-gaincontrol-4": "High gain down",
+       "exif-contrast-0": "Normal",
+       "exif-contrast-1": "Soft",
+       "exif-contrast-2": "Hard",
+       "exif-saturation-0": "Normal",
+       "exif-saturation-1": "Low saturation",
+       "exif-saturation-2": "High saturation",
+       "exif-sharpness-0": "Normal",
+       "exif-sharpness-1": "Soft",
+       "exif-sharpness-2": "Hard",
+       "exif-subjectdistancerange-0": "Unknown",
+       "exif-subjectdistancerange-1": "Macro",
+       "exif-subjectdistancerange-2": "Close view",
+       "exif-subjectdistancerange-3": "Distant view",
+       "exif-gpslatitude-n": "North latitude",
+       "exif-gpslatitude-s": "South latitude",
+       "exif-gpslongitude-e": "East longitude",
+       "exif-gpslongitude-w": "West longitude",
+       "exif-gpsaltitude-above-sealevel": "$1 {{PLURAL:$1|meter|meters}} above sea level",
+       "exif-gpsaltitude-below-sealevel": "$1 {{PLURAL:$1|meter|meters}} below sea level",
+       "exif-gpsstatus-a": "Measurement in progress",
+       "exif-gpsstatus-v": "Measurement interoperability",
+       "exif-gpsmeasuremode-2": "2-dimensional measurement",
+       "exif-gpsmeasuremode-3": "3-dimensional measurement",
+       "exif-gpsspeed-k": "Kilometers per hour",
+       "exif-gpsspeed-m": "Miles per hour",
+       "exif-gpsspeed-n": "Knots",
+       "exif-gpsdestdistance-k": "Kilometers",
+       "exif-gpsdestdistance-m": "Miles",
+       "exif-gpsdestdistance-n": "Nautical miles",
+       "exif-gpsdop-excellent": "Excellent ($1)",
+       "exif-gpsdop-good": "Good ($1)",
+       "exif-gpsdop-moderate": "Moderate ($1)",
+       "exif-gpsdop-fair": "Fair ($1)",
+       "exif-gpsdop-poor": "Poor ($1)",
+       "exif-objectcycle-a": "Morning only",
+       "exif-objectcycle-p": "Evening only",
+       "exif-objectcycle-b": "Both morning and evening",
+       "exif-gpsdirection-t": "True direction",
+       "exif-gpsdirection-m": "Magnetic direction",
+       "exif-ycbcrpositioning-1": "Centered",
+       "exif-ycbcrpositioning-2": "Co-sited",
+       "exif-dc-contributor": "Contributors",
+       "exif-dc-coverage": "Spatial or temporal scope of media",
+       "exif-dc-date": "Date(s)",
+       "exif-dc-publisher": "Publisher",
+       "exif-dc-relation": "Related media",
+       "exif-dc-rights": "Rights",
+       "exif-dc-source": "Source media",
+       "exif-dc-type": "Type of media",
+       "exif-rating-rejected": "Rejected",
+       "exif-isospeedratings-overflow": "Greater than 65535",
+       "exif-maxaperturevalue-value": "$1 APEX (f/$2)",
+       "exif-iimcategory-ace": "Arts, culture and entertainment",
+       "exif-iimcategory-clj": "Crime and law",
+       "exif-iimcategory-dis": "Disasters and accidents",
+       "exif-iimcategory-fin": "Economy and business",
+       "exif-iimcategory-edu": "Education",
+       "exif-iimcategory-evn": "Environment",
+       "exif-iimcategory-hth": "Health",
+       "exif-iimcategory-hum": "Human interest",
+       "exif-iimcategory-lab": "Labor",
+       "exif-iimcategory-lif": "Lifestyle and leisure",
+       "exif-iimcategory-pol": "Politics",
+       "exif-iimcategory-rel": "Religion and belief",
+       "exif-iimcategory-sci": "Science and technology",
+       "exif-iimcategory-soi": "Social issues",
+       "exif-iimcategory-spo": "Sports",
+       "exif-iimcategory-war": "War, conflict and unrest",
+       "exif-iimcategory-wea": "Weather",
+       "exif-urgency-normal": "Normal ($1)",
+       "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",
+       "confirmemail_noemail": "You do not have a valid email address set in your [[Special:Preferences|user preferences]].",
+       "confirmemail_text": "{{SITENAME}} requires that you validate your email address before using email features.\nActivate the button below to send a confirmation mail to your address.\nThe mail will include a link containing a code;\nload the link in your browser to confirm that your email address is valid.",
+       "confirmemail_pending": "A confirmation code has already been emailed to you;\nif you recently created your account, you may wish to wait a few minutes for it to arrive before trying to request a new code.",
+       "confirmemail_send": "Mail a confirmation code",
+       "confirmemail_sent": "Confirmation email sent.",
+       "confirmemail_oncreate": "A confirmation code was sent to your email address.\nThis code is not required to log in, but you will need to provide it before enabling any email-based features in the wiki.",
+       "confirmemail_sendfailed": "{{SITENAME}} could not send your confirmation mail.\nPlease check your email address for invalid characters.\n\nMailer returned: $1",
+       "confirmemail_invalid": "Invalid confirmation code.\nThe code may have expired.",
+       "confirmemail_needlogin": "Please $1 to confirm your email address.",
+       "confirmemail_success": "Your email address has been confirmed.\nYou may now [[Special:UserLogin|log in]] and enjoy the wiki.",
+       "confirmemail_loggedin": "Your email address has now been confirmed.",
+       "confirmemail_subject": "{{SITENAME}} email address confirmation",
+       "confirmemail_body": "Someone, probably you, from IP address $1,\nhas registered an account \"$2\" with this email address on {{SITENAME}}.\n\nTo confirm that this account really does belong to you and activate\nemail features on {{SITENAME}}, open this link in your browser:\n\n$3\n\nIf you did *not* register the account, follow this link\nto cancel the email address confirmation:\n\n$5\n\nThis confirmation code will expire at $4.",
+       "confirmemail_body_changed": "Someone, probably you, from IP address $1,\nhas changed the email address of the account \"$2\" to this address on {{SITENAME}}.\n\nTo confirm that this account really does belong to you and reactivate\nemail features on {{SITENAME}}, open this link in your browser:\n\n$3\n\nIf the account does *not* belong to you, follow this link\nto cancel the email address confirmation:\n\n$5\n\nThis confirmation code will expire at $4.",
+       "confirmemail_body_set": "Someone, probably you, from IP address $1,\nhas set the email address of the account \"$2\" to this address on {{SITENAME}}.\n\nTo confirm that this account really does belong to you and activate\nemail features on {{SITENAME}}, open this link in your browser:\n\n$3\n\nIf the account does *not* belong to you, follow this link\nto cancel the email address confirmation:\n\n$5\n\nThis confirmation code will expire at $4.",
+       "confirmemail_invalidated": "Email address confirmation canceled",
+       "invalidateemail": "Cancel email confirmation",
+       "scarytranscludedisabled": "[Interwiki transcluding is disabled]",
+       "scarytranscludefailed": "[Template fetch failed for $1]",
+       "scarytranscludefailed-httpstatus": "[Template fetch failed for $1: HTTP $2]",
+       "scarytranscludetoolong": "[URL is too long]",
+       "deletedwhileediting": "<strong>Warning:</strong> This page was deleted after you started editing!",
+       "confirmrecreate": "User [[User:$1|$1]] ([[User talk:$1|talk]]) deleted this page after you started editing with reason:\n: <em>$2</em>\nPlease confirm that you really want to recreate this page.",
+       "confirmrecreate-noreason": "User [[User:$1|$1]] ([[User talk:$1|talk]]) deleted this page after you started editing. Please confirm that you really want to recreate this page.",
+       "recreate": "Recreate",
+       "unit-pixel": "px",
+       "confirm_purge_button": "OK",
+       "confirm-purge-top": "Clear the cache of this page?",
+       "confirm-purge-bottom": "Purging a page clears the cache and forces the most current revision to appear.",
+       "confirm-watch-button": "OK",
+       "confirm-watch-top": "Add this page to your watchlist?",
+       "confirm-unwatch-button": "OK",
+       "confirm-unwatch-top": "Remove this page from your watchlist?",
+       "semicolon-separator": ";&#32;",
+       "comma-separator": ",&#32;",
+       "colon-separator": ":&#32;",
+       "autocomment-prefix": "",
+       "pipe-separator": "&#32;|&#32;",
+       "word-separator": "&#32;",
+       "ellipsis": "...",
+       "percent": "$1%",
+       "parentheses": "($1)",
+       "brackets": "[$1]",
+       "quotation-marks": "\"$1\"",
+       "imgmultipageprev": "← previous page",
+       "imgmultipagenext": "next page →",
+       "imgmultigo": "Go!",
+       "imgmultigoto": "Go to page $1",
+       "img-lang-opt": "$2 ($1)",
+       "img-lang-default": "(default language)",
+       "img-lang-info": "Render this image in $1. $2",
+       "img-lang-go": "Go",
+       "ascending_abbrev": "asc",
+       "descending_abbrev": "desc",
+       "table_pager_next": "Next page",
+       "table_pager_prev": "Previous page",
+       "table_pager_first": "First page",
+       "table_pager_last": "Last page",
+       "table_pager_limit": "Show $1 items per page",
+       "table_pager_limit_label": "Items per page:",
+       "table_pager_limit_submit": "Go",
+       "table_pager_empty": "No results",
+       "autosumm-blank": "Blanked the page",
+       "autosumm-replace": "Replaced content with \"$1\"",
+       "autoredircomment": "Redirected page to [[$1]]",
+       "autosumm-new": "Created page with \"$1\"",
+       "autoblock_whitelist": "AOL http://webmaster.info.aol.com/proxyinfo.html\n*64.12.96.0/19\n*149.174.160.0/20\n*152.163.240.0/21\n*152.163.248.0/22\n*152.163.252.0/23\n*152.163.96.0/22\n*152.163.100.0/23\n*195.93.32.0/22\n*195.93.48.0/22\n*195.93.64.0/19\n*195.93.96.0/19\n*195.93.16.0/20\n*198.81.0.0/22\n*198.81.16.0/20\n*198.81.8.0/23\n*202.67.64.128/25\n*205.188.192.0/20\n*205.188.208.0/23\n*205.188.112.0/20\n*205.188.146.144/30\n*207.200.112.0/21",
+       "size-bytes": "$1 B",
+       "size-kilobytes": "$1 KB",
+       "size-megabytes": "$1 MB",
+       "size-gigabytes": "$1 GB",
+       "size-terabytes": "$1 TB",
+       "size-petabytes": "$1 PB",
+       "size-exabytes": "$1 EB",
+       "size-zetabytes": "$1 ZB",
+       "size-yottabytes": "$1 YB",
+       "bitrate-bits": "$1 bps",
+       "bitrate-kilobits": "$1 kbps",
+       "bitrate-megabits": "$1 Mbps",
+       "bitrate-gigabits": "$1 Gbps",
+       "bitrate-terabits": "$1 Tbps",
+       "bitrate-petabits": "$1 Pbps",
+       "bitrate-exabits": "$1 Ebps",
+       "bitrate-zetabits": "$1 Zbps",
+       "bitrate-yottabits": "$1 Ybps",
+       "lag-warn-normal": "Changes newer than $1 {{PLURAL:$1|second|seconds}} may not be shown in this list.",
+       "lag-warn-high": "Due to high database server lag, changes newer than $1 {{PLURAL:$1|second|seconds}} may not be shown in this list.",
+       "editwatchlist-summary": "",
+       "watchlistedit-normal-title": "Edit watchlist",
+       "watchlistedit-normal-legend": "Remove titles from watchlist",
+       "watchlistedit-normal-explain": "Titles on your watchlist are shown below.\nTo remove a title, check the box next to it, and click \"{{int:Watchlistedit-normal-submit}}\".\nYou can also [[Special:EditWatchlist/raw|edit the raw list]].",
+       "watchlistedit-normal-submit": "Remove titles",
+       "watchlistedit-normal-done": "{{PLURAL:$1|1 title was|$1 titles were}} removed from your watchlist:",
+       "watchlistedit-raw-title": "Edit raw watchlist",
+        "watchlistedit-raw-legend": "Edit raw watchlist",
+       "watchlistedit-raw-explain": "Titles on your watchlist are shown below, and can be edited by adding to and removing from the list;\none title per line.\nWhen finished, click \"{{int:Watchlistedit-raw-submit}}\".\nYou can also [[Special:EditWatchlist|use the standard editor]].",
+        "watchlistedit-raw-titles": "Titles:",
+        "watchlistedit-raw-submit": "Update watchlist",
+        "watchlistedit-raw-done": "Your watchlist has been updated.",
+        "watchlistedit-raw-added": "{{PLURAL:$1|1 title was|$1 titles were}} added:",
+        "watchlistedit-raw-removed": "{{PLURAL:$1|1 title was|$1 titles were}} removed:",
+       "watchlistedit-clear-title": "Cleared watchlist",
+       "watchlistedit-clear-legend": "Clear watchlist",
+       "watchlistedit-clear-explain": "All of the titles will be removed from your watchlist",
+       "watchlistedit-clear-titles": "Titles:",
+       "watchlistedit-clear-submit": "Clear the watchlist (This is permanent!)",
+       "watchlistedit-clear-done": "Your watchlist has been cleared.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|1 title was|$1 titles were}} removed:",
+       "watchlistedit-too-many": "There are too many pages to display here.",
+       "watchlisttools-clear": "Clear the watchlist",
+       "watchlisttools-view": "View relevant changes",
+       "watchlisttools-edit": "View and edit watchlist",
+       "watchlisttools-raw": "Edit raw watchlist",
+       "iranian-calendar-m1": "Farvardin",
+       "iranian-calendar-m2": "Ordibehesht",
+       "iranian-calendar-m3": "Khordad",
+       "iranian-calendar-m4": "Tir",
+       "iranian-calendar-m5": "Mordad",
+       "iranian-calendar-m6": "Shahrivar",
+       "iranian-calendar-m7": "Mehr",
+       "iranian-calendar-m8": "Aban",
+       "iranian-calendar-m9": "Azar",
+       "iranian-calendar-m10": "Dey",
+       "iranian-calendar-m11": "Bahman",
+       "iranian-calendar-m12": "Esfand",
+       "hijri-calendar-m1": "Muharram",
+       "hijri-calendar-m2": "Safar",
+       "hijri-calendar-m3": "Rabi' al-awwal",
+       "hijri-calendar-m4": "Rabi' al-thani",
+       "hijri-calendar-m5": "Jumada al-awwal",
+       "hijri-calendar-m6": "Jumada al-thani",
+       "hijri-calendar-m7": "Rajab",
+       "hijri-calendar-m8": "Sha'aban",
+       "hijri-calendar-m9": "Ramadan",
+       "hijri-calendar-m10": "Shawwal",
+       "hijri-calendar-m11": "Dhu al-Qi'dah",
+       "hijri-calendar-m12": "Dhu al-Hijjah",
+       "hebrew-calendar-m1": "Tishrei",
+       "hebrew-calendar-m2": "Cheshvan",
+       "hebrew-calendar-m3": "Kislev",
+       "hebrew-calendar-m4": "Tevet",
+       "hebrew-calendar-m5": "Shevat",
+       "hebrew-calendar-m6": "Adar",
+       "hebrew-calendar-m6a": "Adar I",
+       "hebrew-calendar-m6b": "Adar II",
+       "hebrew-calendar-m7": "Nisan",
+       "hebrew-calendar-m8": "Iyar",
+       "hebrew-calendar-m9": "Sivan",
+       "hebrew-calendar-m10": "Tamuz",
+       "hebrew-calendar-m11": "Av",
+       "hebrew-calendar-m12": "Elul",
+       "hebrew-calendar-m1-gen": "Tishrei",
+       "hebrew-calendar-m2-gen": "Cheshvan",
+       "hebrew-calendar-m3-gen": "Kislev",
+       "hebrew-calendar-m4-gen": "Tevet",
+       "hebrew-calendar-m5-gen": "Shevat",
+       "hebrew-calendar-m6-gen": "Adar",
+       "hebrew-calendar-m6a-gen": "Adar I",
+       "hebrew-calendar-m6b-gen": "Adar II",
+       "hebrew-calendar-m7-gen": "Nisan",
+       "hebrew-calendar-m8-gen": "Iyar",
+       "hebrew-calendar-m9-gen": "Sivan",
+       "hebrew-calendar-m10-gen": "Tamuz",
+       "hebrew-calendar-m11-gen": "Av",
+       "hebrew-calendar-m12-gen": "Elul",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|talk]])",
+       "signature-anon": "[[{{#special:Contributions}}/$1|$2]]",
+       "timezone-utc": "UTC",
+       "unknown_extension_tag": "Unknown extension tag \"$1\"",
+       "duplicate-defaultsort": "<strong>Warning:</strong> Default sort key \"$2\" overrides earlier default sort key \"$1\".",
+       "version": "Version",
+       "version-summary": "",
+       "version-extensions": "Installed extensions",
+       "version-specialpages": "Special pages",
+       "version-parserhooks": "Parser hooks",
+       "version-variables": "Variables",
+       "version-antispam": "Spam prevention",
+       "version-skins": "Skins",
+       "version-api": "API",
+       "version-other": "Other",
+       "version-mediahandlers": "Media handlers",
+       "version-hooks": "Hooks",
+       "version-parser-extensiontags": "Parser extension tags",
+       "version-parser-function-hooks": "Parser function hooks",
+       "version-hook-name": "Hook name",
+       "version-hook-subscribedby": "Subscribed by",
+       "version-version": "($1)",
+       "version-svn-revision": "r$1",
+       "version-license": "MediaWiki License",
+       "version-ext-license": "License",
+       "version-ext-colheader-name": "Extension",
+       "version-ext-colheader-version": "Version",
+       "version-ext-colheader-license": "License",
+       "version-ext-colheader-description": "Description",
+       "version-ext-colheader-credits": "Authors",
+       "version-license-title": "License for $1",
+       "version-license-not-found": "No detailed license information was found for this extension.",
+       "version-credits-title": "Credits for $1",
+       "version-credits-not-found": "No detailed credits information was found for this extension.",
+       "version-poweredby-credits": "This wiki is powered by <strong>[https://www.mediawiki.org/ MediaWiki]</strong>, copyright © 2001-$1 $2.",
+       "version-poweredby-others": "others",
+       "version-poweredby-translators": "translatewiki.net translators",
+       "version-credits-summary": "We would like to recognize the following persons for their contribution to [[Special:Version|MediaWiki]].",
+       "version-license-info": "MediaWiki is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.\n\nMediaWiki is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n\nYou should have received [{{SERVER}}{{SCRIPTPATH}}/COPYING a copy of the GNU General Public License] along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA or [//www.gnu.org/licenses/old-licenses/gpl-2.0.html read it online].",
+       "version-software": "Installed software",
+       "version-software-product": "Product",
+       "version-software-version": "Version",
+       "version-db-mysql-url": "http://www.mysql.com/",
+       "version-db-mariadb-url": "http://mariadb.org/",
+       "version-db-percona-url": "http://www.percona.com/software/percona-server",
+       "version-db-postgres-url": "http://www.postgresql.org/",
+       "version-db-oracle-url": "http://www.oracle.com/database/",
+       "version-db-sqlite-url": "http://www.sqlite.org/",
+       "version-db-mssql-url": "http://www.microsoft.com/sql/",
+       "version-entrypoints": "Entry point URLs",
+       "version-entrypoints-header-entrypoint": "Entry point",
+       "version-entrypoints-header-url": "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]",
+       "version-entrypoints-index-php": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:index.php index.php]",
+       "version-entrypoints-api-php": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:api.php api.php]",
+       "version-entrypoints-load-php": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:load.php load.php]",
+       "redirect": "Redirect by file, user, page or revision ID",
+       "redirect-legend": "Redirect to a file or page",
+       "redirect-text": "",
+       "redirect-summary": "This special page redirects to a file (given the file name), a page (given a revision ID or page ID), or a user page (given a numeric user ID). Usage: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], or [[{{#Special:Redirect}}/user/101]].",
+       "redirect-submit": "Go",
+       "redirect-lookup": "Lookup:",
+       "redirect-value": "Value:",
+       "redirect-user": "User ID",
+       "redirect-page": "Page ID",
+       "redirect-revision": "Page revision",
+       "redirect-file": "File name",
+       "redirect-not-exists": "Value not found",
+       "fileduplicatesearch": "Search for duplicate files",
+       "fileduplicatesearch-summary": "Search for duplicate files based on hash values.",
+       "fileduplicatesearch-legend": "Search for a duplicate",
+       "fileduplicatesearch-filename": "Filename:",
+       "fileduplicatesearch-submit": "Search",
+       "fileduplicatesearch-info": "$1 × $2 pixel<br />File size: $3<br />MIME type: $4",
+       "fileduplicatesearch-result-1": "The file \"$1\" has no identical duplication.",
+       "fileduplicatesearch-result-n": "The file \"$1\" has {{PLURAL:$2|1 identical duplication|$2 identical duplications}}.",
+       "fileduplicatesearch-noresults": "No file named \"$1\" found.",
+       "specialpages": "Special pages",
+       "specialpages-summary": "",
+       "specialpages-note-top": "Legend",
+       "specialpages-note": "* Normal special pages.\n* <span class=\"mw-specialpagerestricted\">Restricted special pages.</span>",
+       "specialpages-group-maintenance": "Maintenance reports",
+       "specialpages-group-other": "Other special pages",
+       "specialpages-group-login": "Login / create account",
+       "specialpages-group-changes": "Recent changes and logs",
+       "specialpages-group-media": "Media reports and uploads",
+       "specialpages-group-users": "Users and rights",
+       "specialpages-group-highuse": "High use pages",
+       "specialpages-group-pages": "Lists of pages",
+       "specialpages-group-pagetools": "Page tools",
+       "specialpages-group-wiki": "Data and tools",
+       "specialpages-group-redirects": "Redirecting special pages",
+       "specialpages-group-spam": "Spam tools",
+       "blankpage": "Blank page",
+       "intentionallyblankpage": "This page is intentionally left blank.",
+       "external_image_whitelist": " #Leave this line exactly as it is<pre>\n#Put regular expression fragments (just the part that goes between the //) below\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#Lines beginning with # are treated as comments\n#This is case-insensitive\n\n#Put all regex fragments above this line. Leave this line exactly as it is</pre>",
+       "tags": "Valid change tags",
+       "tags-summary": "",
+       "tag-filter": "[[Special:Tags|Tag]] filter:",
+       "tag-filter-submit": "Filter",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag|Tags}}]]: $2)",
+       "tags-title": "Tags",
+       "tags-intro": "This page lists the tags that the software may mark an edit with, and their meaning.",
+       "tags-tag": "Tag name",
+       "tags-display-header": "Appearance on change lists",
+       "tags-description-header": "Full description of meaning",
+       "tags-active-header": "Active?",
+       "tags-hitcount-header": "Tagged changes",
+       "tags-active-yes": "Yes",
+       "tags-active-no": "No",
+       "tags-edit": "edit",
+       "tags-hitcount": "$1 {{PLURAL:$1|change|changes}}",
+       "comparepages": "Compare pages",
+       "comparepages-summary": "",
+       "compare-page1": "Page 1",
+       "compare-page2": "Page 2",
+       "compare-rev1": "Revision 1",
+       "compare-rev2": "Revision 2",
+       "compare-submit": "Compare",
+       "compare-invalid-title": "The title you specified is invalid.",
+       "compare-title-not-exists": "The title you specified does not exist.",
+       "compare-revision-not-exists": "The revision you specified does not exist.",
+       "dberr-problems": "Sorry! This site is experiencing technical difficulties.",
+       "dberr-again": "Try waiting a few minutes and reloading.",
+       "dberr-info": "(Cannot contact the database server: $1)",
+       "dberr-info-hidden": "(Cannot contact the database server)",
+       "dberr-usegoogle": "You can try searching via Google in the meantime.",
+       "dberr-outofdate": "Note that their indexes of our content may be out of date.",
+       "dberr-cachederror": "This is a cached copy of the requested page, and may not be up to date.",
+       "htmlform-invalid-input": "There are problems with some of your input.",
+       "htmlform-select-badoption": "The value you specified is not a valid option.",
+       "htmlform-int-invalid": "The value you specified is not an integer.",
+       "htmlform-float-invalid": "The value you specified is not a number.",
+       "htmlform-int-toolow": "The value you specified is below the minimum of $1.",
+       "htmlform-int-toohigh": "The value you specified is above the maximum of $1.",
+       "htmlform-required": "This value is required.",
+       "htmlform-submit": "Submit",
+       "htmlform-reset": "Undo changes",
+       "htmlform-selectorother-other": "Other",
+       "htmlform-no": "No",
+       "htmlform-yes": "Yes",
+       "htmlform-chosen-placeholder": "Select an option",
+       "htmlform-cloner-create": "Add more",
+       "htmlform-cloner-delete": "Remove",
+       "htmlform-cloner-required": "At least one value is required.",
+       "sqlite-has-fts": "$1 with full-text search support",
+       "sqlite-no-fts": "$1 without full-text search support",
+       "logentry-delete-delete": "$1 {{GENDER:$2|deleted}} page $3",
+       "logentry-delete-restore": "$1 {{GENDER:$2|restored}} page $3",
+       "logentry-delete-event": "$1 {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a log event|$5 log events}} on $3: $4",
+       "logentry-delete-revision": "$1 {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a revision|$5 revisions}} on page $3: $4",
+       "logentry-delete-event-legacy": "$1 {{GENDER:$2|changed}} visibility of log events on $3",
+       "logentry-delete-revision-legacy": "$1 {{GENDER:$2|changed}} visibility of revisions on page $3",
+       "logentry-suppress-delete": "$1 {{GENDER:$2|suppressed}} page $3",
+       "logentry-suppress-event": "$1 secretly {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a log event|$5 log events}} on $3: $4",
+       "logentry-suppress-revision": "$1 secretly {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a revision|$5 revisions}} on page $3: $4",
+       "logentry-suppress-event-legacy": "$1 secretly {{GENDER:$2|changed}} visibility of log events on $3",
+       "logentry-suppress-revision-legacy": "$1 secretly {{GENDER:$2|changed}} visibility of revisions on page $3",
+       "revdelete-content-hid": "content hidden",
+       "revdelete-summary-hid": "edit summary hidden",
+       "revdelete-uname-hid": "username hidden",
+       "revdelete-content-unhid": "content unhidden",
+       "revdelete-summary-unhid": "edit summary unhidden",
+       "revdelete-uname-unhid": "username unhidden",
+       "revdelete-restricted": "applied restrictions to administrators",
+       "revdelete-unrestricted": "removed restrictions for administrators",
+       "logentry-move-move": "$1 {{GENDER:$2|moved}} page $3 to $4",
+       "logentry-move-move-noredirect": "$1 {{GENDER:$2|moved}} page $3 to $4 without leaving a redirect",
+       "logentry-move-move_redir": "$1 {{GENDER:$2|moved}} page $3 to $4 over redirect",
+       "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|moved}} page $3 to $4 over a redirect without leaving a redirect",
+       "logentry-patrol-patrol": "$1 {{GENDER:$2|marked}} revision $4 of page $3 patrolled",
+       "logentry-patrol-patrol-auto": "$1 automatically {{GENDER:$2|marked}} revision $4 of page $3 patrolled",
+       "logentry-newusers-newusers": "User account $1 was {{GENDER:$2|created}}",
+       "logentry-newusers-create": "User account $1 was {{GENDER:$2|created}}",
+       "logentry-newusers-create2": "User account $3 was {{GENDER:$2|created}} by $1",
+       "logentry-newusers-byemail": "User account $3 was {{GENDER:$2|created}} by $1 and password was sent by email",
+       "logentry-newusers-autocreate": "User account $1 was {{GENDER:$2|created}} automatically",
+       "logentry-rights-rights": "$1 {{GENDER:$2|changed}} group membership for $3 from $4 to $5",
+       "logentry-rights-rights-legacy": "$1 {{GENDER:$2|changed}} group membership for $3",
+       "logentry-rights-autopromote": "$1 was automatically {{GENDER:$2|promoted}} from $4 to $5",
+       "rightsnone": "(none)",
+       "revdelete-logentry": "changed revision visibility of \"[[$1]]\"",
+       "logdelete-logentry": "changed event visibility of \"[[$1]]\"",
+       "revdelete-content": "content",
+       "revdelete-summary": "edit summary",
+       "revdelete-uname": "username",
+       "revdelete-hid": "hid $1",
+       "revdelete-unhid": "unhid $1",
+       "revdelete-log-message": "$1 for $2 {{PLURAL:$2|revision|revisions}}",
+       "logdelete-log-message": "$1 for $2 {{PLURAL:$2|event|events}}",
+       "deletedarticle": "deleted \"[[$1]]\"",
+       "suppressedarticle": "suppressed \"[[$1]]\"",
+       "undeletedarticle": "restored \"[[$1]]\"",
+       "patrol-log-line": "marked $1 of $2 patrolled $3",
+       "patrol-log-auto": "(automatic)",
+       "patrol-log-diff": "revision $1",
+       "1movedto2": "moved [[$1]] to [[$2]]",
+       "1movedto2_redir": "moved [[$1]] to [[$2]] over redirect",
+       "move-redirect-suppressed": "redirect suppressed",
+       "newuserlog-create-entry": "New user account",
+       "newuserlog-create2-entry": "created new account $1",
+       "newuserlog-autocreate-entry": "Account created automatically",
+       "rightslogentry": "changed group membership for $1 from $2 to $3",
+       "rightslogentry-autopromote": "was automatically promoted from $2 to $3",
+       "feedback-bugornote": "If you are ready to describe a technical problem in detail please [$1 report a bug].\nOtherwise, you can use the easy form below. Your comment will be added to the page \"[$3 $2]\", along with your username.",
+       "feedback-subject": "Subject:",
+       "feedback-message": "Message:",
+       "feedback-cancel": "Cancel",
+       "feedback-submit": "Submit Feedback",
+       "feedback-adding": "Adding feedback to page...",
+       "feedback-error1": "Error: Unrecognized result from API",
+       "feedback-error2": "Error: Edit failed",
+       "feedback-error3": "Error: No response from API",
+       "feedback-thanks": "Thanks! Your feedback has been posted to the page \"[$2 $1]\".",
+       "feedback-close": "Done",
+       "feedback-bugcheck": "Great! Just check that it is not already one of the [$1 known bugs].",
+       "feedback-bugnew": "I checked. Report a new bug",
+       "searchsuggest-search": "Search",
+       "searchsuggest-containing": "containing...",
+       "api-error-badaccess-groups": "You are not permitted to upload files to this wiki.",
+       "api-error-badtoken": "Internal error: Bad token.",
+       "api-error-copyuploaddisabled": "Uploading by URL is disabled on this server.",
+       "api-error-duplicate": "There {{PLURAL:$1|is [$2 another file]|are [$2 some other files]}} already on the site with the same content.",
+       "api-error-duplicate-archive": "There {{PLURAL:$1|was [$2 another file]|were [$2 some other files]}} already on the site with the same content, but {{PLURAL:$1|it was|they were}} deleted.",
+       "api-error-duplicate-archive-popup-title": "Duplicate {{PLURAL:$1|file that has|files that have}} already been deleted.",
+       "api-error-duplicate-popup-title": "Duplicate {{PLURAL:$1|file|files}}.",
+       "api-error-empty-file": "The file you submitted was empty.",
+       "api-error-emptypage": "Creating new, empty pages is not allowed.",
+       "api-error-fetchfileerror": "Internal error: Something went wrong while fetching the file.",
+       "api-error-fileexists-forbidden": "A file with name \"$1\" already exists, and cannot be overwritten.",
+       "api-error-fileexists-shared-forbidden": "A file with name \"$1\" already exists in the shared file repository, and cannot be overwritten.",
+       "api-error-file-too-large": "The file you submitted was too large.",
+       "api-error-filename-tooshort": "The filename is too short.",
+       "api-error-filetype-banned": "This type of file is banned.",
+       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|is not a permitted file type|are not permitted file types}}. Permitted {{PLURAL:$3|file type is|file types are}} $2.",
+       "api-error-filetype-missing": "The filename is missing an extension.",
+       "api-error-hookaborted": "The modification you tried to make was aborted by an extension.",
+       "api-error-http": "Internal error: Unable to connect to server.",
+       "api-error-illegal-filename": "The filename is not allowed.",
+       "api-error-internal-error": "Internal error: Something went wrong with processing your upload on the wiki.",
+       "api-error-invalid-file-key": "Internal error: File was not found in temporary storage.",
+       "api-error-missingparam": "Internal error: Missing parameters on request.",
+       "api-error-missingresult": "Internal error: Could not determine if the copy succeeded.",
+       "api-error-mustbeloggedin": "You must be logged in to upload files.",
+       "api-error-mustbeposted": "Internal error: Request requires HTTP POST.",
+       "api-error-noimageinfo": "The upload succeeded, but the server did not give us any information about the file.",
+       "api-error-nomodule": "Internal error: No upload module set.",
+       "api-error-ok-but-empty": "Internal error: No response from server.",
+       "api-error-overwrite": "Overwriting an existing file is not allowed.",
+       "api-error-stashfailed": "Internal error: Server failed to store temporary file.",
+       "api-error-publishfailed": "Internal error: Server failed to publish temporary file.",
+       "api-error-stasherror": "There was an error while uploading the file to stash.",
+       "api-error-timeout": "The server did not respond within the expected time.",
+       "api-error-unclassified": "An unknown error occurred.",
+       "api-error-unknown-code": "Unknown error: \"$1\".",
+       "api-error-unknown-error": "Internal error: Something went wrong when trying to upload your file.",
+       "api-error-unknown-warning": "Unknown warning: \"$1\".",
+       "api-error-unknownerror": "Unknown error: \"$1\".",
+       "api-error-uploaddisabled": "Uploading is disabled on this wiki.",
+       "api-error-verification-error": "This file might be corrupt, or have the wrong extension.",
+       "duration-seconds": "$1 {{PLURAL:$1|second|seconds}}",
+       "duration-minutes": "$1 {{PLURAL:$1|minute|minutes}}",
+       "duration-hours": "$1 {{PLURAL:$1|hour|hours}}",
+       "duration-days": "$1 {{PLURAL:$1|day|days}}",
+       "duration-weeks": "$1 {{PLURAL:$1|week|weeks}}",
+       "duration-years": "$1 {{PLURAL:$1|year|years}}",
+       "duration-decades": "$1 {{PLURAL:$1|decade|decades}}",
+       "duration-centuries": "$1 {{PLURAL:$1|century|centuries}}",
+       "duration-millennia": "$1 {{PLURAL:$1|millennium|millennia}}",
+       "rotate-comment": "Image rotated by $1 {{PLURAL:$1|degree|degrees}} clockwise",
+       "limitreport-title": "Parser profiling data:",
+       "limitreport-cputime": "CPU time usage",
+       "limitreport-cputime-value": "$1 {{PLURAL:$1|second|seconds}}",
+       "limitreport-walltime": "Real time usage",
+       "limitreport-walltime-value": "$1 {{PLURAL:$1|second|seconds}}",
+       "limitreport-ppvisitednodes": "Preprocessor visited node count",
+       "limitreport-ppvisitednodes-value": "$1/$2",
+       "limitreport-ppgeneratednodes": "Preprocessor generated node count",
+       "limitreport-ppgeneratednodes-value": "$1/$2",
+       "limitreport-postexpandincludesize": "Post-expand include size",
+       "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|byte|bytes}}",
+       "limitreport-templateargumentsize": "Template argument size",
+       "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|byte|bytes}}",
+       "limitreport-expansiondepth": "Highest expansion depth",
+       "limitreport-expansiondepth-value": "$1/$2",
+       "limitreport-expensivefunctioncount": "Expensive parser function count",
+       "limitreport-expensivefunctioncount-value": "$1/$2",
+       "expandtemplates": "Expand templates",
+       "expand_templates_intro": "This special page takes text and expands all templates in it recursively.\nIt also expands supported parser functions like\n<code><nowiki>{{</nowiki>#language:…}}</code> and variables like\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nIn fact, it expands pretty much everything in double-braces.",
+       "expand_templates_title": "Context title, for {{FULLPAGENAME}}, etc.:",
+       "expand_templates_input": "Input text:",
+       "expand_templates_output": "Result",
+       "expand_templates_xml_output": "XML output",
+       "expand_templates_html_output": "Raw HTML output",
+       "expand_templates_ok": "OK",
+       "expand_templates_remove_comments": "Remove comments",
+       "expand_templates_remove_nowiki": "Suppress <nowiki> tags in result",
+       "expand_templates_generate_xml": "Show XML parse tree",
+       "expand_templates_generate_rawhtml": "Show raw HTML",
+       "expand_templates_preview": "Preview"
 }
index f45a95f..dd696b5 100644 (file)
@@ -36,7 +36,8 @@
                        "Urhixidur",
                        "Yekrats",
                        "Александр Сигачёв",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Substreki ligilojn",
        "readonly_lag": "La datumbazo estis aŭtomate ŝlosita dum la subdatumbazo atingas la ĉefan datumbazon.",
        "internalerror": "Interna eraro",
        "internalerror_info": "Interna eraro: $1",
-       "fileappenderrorread": "Ne eblis legi \"$1\" dum postaldonado.",
-       "fileappenderror": "Ne eblis postaldoni \"$1\" al \"$2\".",
        "filecopyerror": "Ne povis kopii dosieron  \"$1\" al \"$2\".",
        "filerenameerror": "Ne eblis alinomigi dosieron \"$1\" al \"$2\".",
        "filedeleteerror": "Neeblis forigi dosieron \"$1\".",
        "directorycreateerror": "Ne povis krei dosierujon \"$1\".",
        "filenotfound": "Ne eblis trovi dosieron \"$1\".",
-       "fileexistserror": "Ne povas skribi en la dosieron \"$1\": dosiero ekzistas",
        "unexpected": "Neatendita valoro: \"$1\"=\"$2\".",
        "formerror": "Eraro: ne eblis liveri formulon",
        "badarticleerror": "Tiun ĉi agon oni ne povas apliki al tiu ĉi artikolo.",
        "userlogin-helplink2": "Helpo pri ensaluto",
        "userlogin-loggedin": "Vi jam estas ensalutita kiel {{GENDER:$1|$1}}.\nUzu la formularon suben por ensaluti kiel alia uzanto.",
        "userlogin-createanother": "Krei alian konton",
-       "createacct-join": "Suben enigu informojn pri vi",
-       "createacct-another-join": "Enigu la informon de la nova konto suben.",
        "createacct-emailrequired": "Retpoŝta adreso",
        "createacct-emailoptional": "Retpoŝta adreso (nedeviga)",
        "createacct-email-ph": "Enigu vian retpoŝtan adreson",
        "savearticle": "Konservi ŝanĝojn",
        "preview": "Antaŭrigardo",
        "showpreview": "Antaŭrigardo",
-       "showlivepreview": "Aktiva antaŭvido",
        "showdiff": "Montri ŝanĝojn",
        "anoneditwarning": "'''Averto:''' Vi ne estas ensalutinta.\nVia IP-adreso enregistriĝos en la redakta historio de tiu ĉi paĝo.",
        "anonpreviewwarning": "''Vi ne estas ensalutita. La konservo de la paĝo registros vian IP-adreson en redakta historio de ĉi tiu paĝo.''",
        "edit-gone-missing": "Ne eblis ĝisdatigi la paĝon.\nVerŝajne ĝi estis forigita.",
        "edit-conflict": "Redakto-konflikto.",
        "edit-no-change": "Via redakto estis ignorita, ĉar neniu ŝanĝo estis farita al la teksto.",
-       "postedit-confirmation": "Via redakto estis konservita.",
+       "postedit-confirmation-saved": "Via redakto estis konservita.",
        "edit-already-exists": "Ne eblis krei novan paĝon.\nĜi jam ekzistas.",
        "defaultmessagetext": "Defaŭlta teksto",
        "content-failed-to-parse": "Oni malsukcesis analizi $2-entenon laŭ la $1-modelo: $3",
        "search-nonefound": "La serĉomendo rezultis kun neniuj trafoj.",
        "powersearch-legend": "Progresa serĉo",
        "powersearch-ns": "Serĉi en nomspacoj:",
-       "powersearch-redir": "Listigi alidirektilojn",
        "powersearch-togglelabel": "Elekti:",
        "powersearch-toggleall": "Ĉion",
        "powersearch-togglenone": "Nenion",
        "prefs-advancedsearchoptions": "Progresaj opcioj",
        "prefs-advancedwatchlist": "Progresaj opcioj",
        "prefs-displayrc": "Montraj opcioj",
-       "prefs-displaysearchoptions": "Montraj opcioj",
        "prefs-displaywatchlist": "Montraj opcioj",
        "prefs-tokenwatchlist": "Ĵetono",
        "prefs-diffs": "Diferencoj",
        "recentchanges-label-minor": "Ĉi tiu estas eta redakto",
        "recentchanges-label-bot": "Ĉi tiu redakto estis farita per roboto.",
        "recentchanges-label-unpatrolled": "Ĉi tiu redakto ne jam estis patrolata.",
-       "recentchanges-label-plusminus": "La paĝa grandeco ŝanĝiĝis je ĉi tiu nombro de batoj",
+       "recentchanges-label-plusminus": "La paĝa grandeco ŝanĝiĝis je ĉi tiu nombro de bajtoj",
        "recentchanges-legend-heading": "'''Klarigo:'''",
        "recentchanges-legend-newpage": "(vidu ankaŭ [[Special:NewPages|liston de novaj paĝoj]])",
-       "rcnotefrom": "Sube estas ŝanĝoj ekde <strong>$2</strong> ({{PLURAL:$1|lasta|lastaj}} <strong>$1</strong>).",
-       "rclistfrom": "Montri novajn ŝanĝojn ekde \"$1\"",
+       "rcnotefrom": "Malsupre estas ŝanĝoj ekde <strong>$2</strong> ({{PLURAL:$1|lasta|lastaj}} <strong>$1</strong>).",
+       "rclistfrom": "Montri novajn ŝanĝojn ekde \"$3 $2\"",
        "rcshowhideminor": "$1 redaktetojn",
        "rcshowhideminor-show": "Montri",
        "rcshowhideminor-hide": "Kaŝi",
        "uploadstash-refresh": "Aktualigi la dosierliston.",
        "invalid-chunk-offset": "Malvalida deŝovo de dosierpeco",
        "img-auth-accessdenied": "Atingo malpermisita",
-       "img-auth-nopathinfo": "Mankas PATH_INFO (informo pri dosiervojo).\nVia servilo ne estas konfigurita por sendi ĉi tiun informon.\nEble ĝi estas CGI-bazita kaj ne subtenas img_auth.\nVidu https://www.mediawiki.org/wiki/Manual:Image_Authorization (angle).",
+       "img-auth-nopathinfo": "Mankas PATH_INFO (informo pri dosiervojo).\nVia servilo ne estas konfigurita por sendi ĉi tiun informon.\nEble ĝi estas CGI-bazita kaj ne subtenas img_auth.\nVidu https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization (angle).",
        "img-auth-notindir": "Petita vojo ne estas en la konfigurita alŝuta dosierujo.",
        "img-auth-badtitle": "Ne povas konstrui validan titolon de \"$1\".",
        "img-auth-nologinnWL": "Vi ne estas ensalutita kaj \"$1\" ne estas en la blankalisto.",
        "watchlist-details": "{{PLURAL:$1|$1 paĝon|$1 paĝojn}} en via atentaro, krom diskutpaĝoj.",
        "wlheader-enotif": "Retpoŝta sciigo estas ŝalta.",
        "wlheader-showupdated": "Paĝoj montriĝis per '''dikaj literoj''' kiuj estis ŝanĝitaj ekde vi laste vizitis.",
-       "watchmethod-recent": "traserĉas lastajn redaktojn",
-       "watchmethod-list": "traserĉas priatentitajn",
-       "watchlistcontains": "Via atentaro enhavas $1 {{PLURAL:$1|paĝon|paĝojn}}.",
-       "iteminvalidname": "Ia eraro pri \"$1\", nevalida titolo...",
        "wlnote2": "Malsupre estas la ŝanĝoj en la {{PLURAL:$1|lasta horo|lastaj <strong>$1</strong> horoj}}, ekde $2, $3.",
        "wlshowlast": "Montri el lastaj $1 horoj $2 tagoj $3",
        "watchlist-options": "Opcioj por atentaro",
        "enotif_lastvisited": "Vidi $1 por ĉiuj ŝanĝoj de post via lasta vizito.",
        "enotif_lastdiff": "Vidi $1 por rigardi ĉi tiun ŝanĝon.",
        "enotif_anon_editor": "anonima uzanto $1",
-       "enotif_body": "Kara $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nRedaktinta resumo:\n$PAGESUMMARY $PAGEMINOREDIT\n\nResumo pri la ŝanĝo de la redaktinto: $PAGESUMMARY $PAGEMINOREDIT\n\nKontaktu la redaktinton:\nretpoŝte: $PAGEEDITOR_EMAIL\nvikie: $PAGEEDITOR_WIKI\n\nNe estos aliaj avertoj kaze de sekvaj agoj krom se vi vizitus ĉi tiun paĝon ensalutite. Vi povas ankaŭ malaktivigi la avertsignalon por ĉiuj priatentitaj paĝoj de via atentaro.\n\n            Sincere via, la avertsistemo de {{SITENAME}}\n\n--\nPor ŝanĝi vian retpoŝtan avertadajn preferojn, klaku\n{{canonicalurl:{{#special:Preferences}}}}\n\nPor ŝanĝi vian preferojn de la atentaro, klaku\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPor forigi ĉi tiun paĝon de via atentaro, klaku\n$UNWATCHURL\n\nKomentoj kaj plia helpo:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Kara $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nRedaktinta resumo:\n$PAGESUMMARY $PAGEMINOREDIT\n\nResumo pri la ŝanĝo de la redaktinto: $PAGESUMMARY $PAGEMINOREDIT\n\nKontaktu la redaktinton:\nretpoŝte: $PAGEEDITOR_EMAIL\nvikie: $PAGEEDITOR_WIKI\n\nNe estos aliaj avertoj kaze de sekvaj agoj krom se vi vizitus ĉi tiun paĝon ensalutite. Vi povas ankaŭ malaktivigi la avertsignalon por ĉiuj priatentitaj paĝoj de via atentaro.\n\n            Sincere via, la avertsistemo de {{SITENAME}}\n\n--\nPor ŝanĝi vian retpoŝtan avertadajn preferojn, klaku\n{{canonicalurl:{{#special:Preferences}}}}\n\nPor ŝanĝi vian preferojn de la atentaro, klaku\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPor forigi ĉi tiun paĝon de via atentaro, klaku\n$UNWATCHURL\n\nKomentoj kaj plia helpo:\n$HELPPAGE",
        "created": "kreita",
        "changed": "ŝanĝita",
        "deletepage": "Forigi paĝon",
        "blockip": "Forbari uzanton/IP-adreson",
        "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).",
-       "ipadressorusername": "IP-adreso aŭ salutnomo:",
+       "ipaddressorusername": "IP-adreso aŭ salutnomo:",
        "ipbexpiry": "Blokdaŭro",
        "ipbreason": "Kialo:",
        "ipbreason-dropdown": "*Oftaj kialoj de forbaro\n** Enmetas malveraĵojn\n** Forviŝas entenon el paĝoj\n** Entrudas ligilojn al eksteraj paĝaroj\n** Enmetas sensencaĵojn\n** Terurigema sinteno\n** Misuzo de pluraj salutnomoj\n** Neakceptebla uzanto-nomo",
        "group-bot.js": "/* La jena Ĝavaskripto sole ŝargiĝos por robotoj. */",
        "group-sysop.js": "/* La jena Ĝavaskripto sole ŝargiĝos por administrantoj. */",
        "group-bureaucrat.js": "/* La jena Ĝavaskripto sole ŝargiĝos por burokratoj. */",
-       "notacceptable": "La viki-servilo ne povas doni datumon en formato kiun via kliento povas legi.",
        "anonymous": "{{PLURAL:$1|Anonima uzanto|Anonimaj uzantoj}} de {{SITENAME}}",
        "siteuser": "{{SITENAME}} uzanto $1",
        "anonuser": "{{SITENAME}}-anonimulo $1",
        "newimages-summary": "Ĉi tiu speciala paĝo montras la lastajn alŝutitajn dosierojn.",
        "newimages-legend": "Dosiernomo",
        "newimages-label": "Dosiernomo (aŭ parto de ĝi):",
-       "showhidebots": "($1 robotojn)",
        "noimages": "Nenio videbla.",
        "ilsubmit": "Serĉi",
        "bydate": "laŭ dato",
        "autosumm-replace": "Anstataŭigis paĝon per '$1'",
        "autoredircomment": "Alidirektigis al [[$1]]",
        "autosumm-new": "Nova paĝo kun '$1'",
-       "livepreview-loading": "Ŝarĝante...",
-       "livepreview-ready": "Ŝarĝante… Prete!",
-       "livepreview-failed": "Aktiva antaŭvido malsukcesis! Provu normalan antaŭvidon.",
-       "livepreview-error": "Malsukcesis konekti: $1 \"$2\". Provu norman antaŭvidon.",
        "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-numitems": "Via atentaro enhavas {{PLURAL:$1|1 titolon|$1 titolojn}}, escepte de diskuto-paĝoj.",
-       "watchlistedit-noitems": "Via atentaro enhavas neniujn titolojn.",
        "watchlistedit-normal-title": "Redakti atentaron",
        "watchlistedit-normal-legend": "Forigi titolojn de atentaro",
        "watchlistedit-normal-explain": "Jen titoloj de via atentaro.\nForigi titolon, marku la skatoleto apude de ĝi, kaj klaku \"{{int:Watchlistedit-normal-submit}}\".\nVi ankaŭ povas [[Special:EditWatchlist/raw|redakti la krudan liston]].",
        "compare-invalid-title": "La titolo kiun vi enmetis estas malvalida.",
        "compare-title-not-exists": "La titolo kiun vi specifis ne ekzistas.",
        "compare-revision-not-exists": "La revizio kiun vi specifis ne ekzistas.",
-       "dberr-header": "Ĉi tiu vikio havas problemon",
        "dberr-problems": "Bedaŭrinde, ĉi tiu retejo suferas pro teknikaj problemoj.",
        "dberr-again": "Bonvolu atendi kelkajn minutojn kaj reŝargi.",
        "dberr-info": "(Ne eblas kontakti la datenbazan servilon: $1)",
index b443422..780cbfa 100644 (file)
                        "XanaG",
                        "לערי ריינהארט",
                        "Chocolate con galleta",
-                       "Csbotero"
+                       "Csbotero",
+                       "아라",
+                       "Mcervera",
+                       "Wifidel"
                ]
        },
        "tog-underline": "Subrayar los enlaces:",
        "tog-hidepatrolled": "Ocultar las ediciones patrulladas en los cambios recientes",
        "tog-newpageshidepatrolled": "Ocultar las páginas patrulladas de la lista de páginas nuevas",
        "tog-extendwatchlist": "Expandir la lista de seguimiento a todos los cambios, no sólo a los más recientes",
-       "tog-usenewrc": "Agrupar los cambios por página en los cambios recientes y en la lista de seguimiento (requiere JavaScript)",
+       "tog-usenewrc": "Agrupar los cambios por página en los cambios recientes y en la lista de seguimiento",
        "tog-numberheadings": "Numerar automáticamente los encabezados",
        "tog-showtoolbar": "Mostrar la barra de edición",
-       "tog-editondblclick": "Editar las páginas al pulsar dos veces en ellos con el ratón",
+       "tog-editondblclick": "Editar las páginas al hace doble clic",
        "tog-editsectiononrightclick": "Activar la edición de secciones pulsando el botón derecho en los títulos de secciones",
        "tog-watchcreations": "Añadir las páginas que cree y los archivos que suba a mi lista de seguimento",
        "tog-watchdefault": "Añadir las páginas y archivos que edite a mi lista de seguimiento",
        "tog-watchlisthideliu": "Ocultar las ediciones de los usuarios registrados en la lista de seguimiento",
        "tog-watchlisthideanons": "Ocultar las ediciones de los usuarios anónimos en la lista de seguimiento",
        "tog-watchlisthidepatrolled": "Ocultar las ediciones patrulladas en la lista de seguimiento",
-       "tog-ccmeonemails": "Recibir copias de los correos que envío a otros usuarios",
+       "tog-ccmeonemails": "Recibir copias de los mensajes que envíe a otros usuarios",
        "tog-diffonly": "No mostrar bajo las ''diferencias'' el contenido de la página",
        "tog-showhiddencats": "Mostrar las categorías escondidas",
        "tog-norollbackdiff": "Omitir la diferencia después de revertir",
        "jumptonavigation": "navegación",
        "jumptosearch": "buscar",
        "view-pool-error": "Lo sentimos, los servidores están sobrecargados en este momento.\nHay demasiados usuarios que están tratando de ver esta página.\nEspera un momento antes de tratar de acceder nuevamente a esta página.\n\n$1",
+       "generic-pool-error": "Lo sentimos, los servidores están sobrecargados por el momento.\nHay demasiados usuarios tratando de ver esta página.\nIntentes acceder nuevamente a esta página dentro de un rato.",
        "pool-timeout": "Tiempo limite agotado para el bloqueo",
        "pool-queuefull": "La cola de trabajo está llena",
        "pool-errorunknown": "Error desconocido",
+       "pool-servererror": "El servicio de contador de la piscina no está disponible ($1).",
        "aboutsite": "Acerca de {{SITENAME}}",
        "aboutpage": "Project:Acerca de",
        "copyright": "El contenido está disponible bajo  $1  a menos que se indique lo contrario.",
        "nospecialpagetext": "<strong>Ha solicitado una página especial inexistente.</strong>\n\nPuedes ver una lista de las páginas especiales en [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Error",
        "databaseerror": "Error de la base de datos",
-       "databaseerror-text": "Se ha producido un error en la base de datos.\nEsto puede indicar un bug en el software.",
+       "databaseerror-text": "Ocurrió un error de consulta de la base de datos.\nEsto puede indicar un fallo en el software.",
        "databaseerror-textcl": "Se ha producido un error en la base de datos.",
        "databaseerror-query": "Consulta: $1",
        "databaseerror-function": "Función: $1",
        "databaseerror-error": "Error: $1",
        "laggedslavemode": "'''Aviso:''' puede que falten las actualizaciones más recientes en esta página.",
        "readonly": "Base de datos bloqueada",
-       "enterlockreason": "Explique el motivo del bloqueo, incluyendo una estimación de cuándo se producirá el desbloqueo",
+       "enterlockreason": "Explica el motivo del bloqueo, incluyendo una estimación de cuándo se producirá el desbloqueo",
        "readonlytext": "La base de datos no permite nuevas entradas u otras modificaciones de forma temporal, probablemente por mantenimiento rutinario, tras lo cual volverá a la normalidad.\n\nLa explicación dada por el administrador que la bloqueó fue: $1",
        "missing-article": "La base de datos no encuentra el texto de una página que debería hallarse, llamada «$1» $2.\n\nLa causa de esto suele deberse a un ''diff'' anacrónico o un enlace al historial de una página que ha sido borrada.\n\nSi no fuera el caso, puedes haber encontrado un fallo en el software.\n\nPor favor, avisa a un [[Special:ListUsers/sysop|administrador]], tomando nota de la URL.",
        "missingarticle-rev": "(n.º de revisión: $1)",
        "readonly_lag": "La base de datos se ha bloqueado temporalmente mientras los servidores se sincronizan.",
        "internalerror": "Error interno",
        "internalerror_info": "Error interno: $1",
-       "fileappenderrorread": "No se ha podido leer «$1» durante la anexión.",
-       "fileappenderror": "No se ha podido añadir «$1» a «$2».",
        "filecopyerror": "No se pudo copiar el archivo «$1» a «$2».",
        "filerenameerror": "No se pudo renombrar el archivo «$1» a «$2».",
        "filedeleteerror": "No se pudo borrar el archivo «$1».",
        "directorycreateerror": "No se pudo crear el directorio «$1».",
        "filenotfound": "No se pudo encontrar el archivo «$1».",
-       "fileexistserror": "No se pudo escribir en el archivo «$1»: el archivo existe.",
        "unexpected": "Valor inesperado: «$1»=«$2».",
        "formerror": "Error: no se pudo enviar el formulario",
        "badarticleerror": "Esta acción no se puede llevar a cabo en esta página.",
        "viewsourcetext": "Puedes ver y copiar el código fuente de esta página:",
        "viewyourtext": "Puedes ver y copiar el código de '''tus ediciones''' a esta página:",
        "protectedinterface": "Esta página proporciona el texto de la interfaz del software en este wiki, y está protegida para prevenir el abuso.\nPara agregar o cambiar las traducciones para todos los wikis, por favor, usa [//translatewiki.net/ translatewiki.net], el proyecto de localización de MediaWiki.",
-       "editinginterface": "'''Aviso:''' Estás editando una página usada para proporcionar el texto de la interfaz para el software. \nLos cambios en esta página afectarán a la apariencia de la interfaz para los demás usuarios de este wiki. \nPara añadir o cambiar las traducciones, por favor considera usar [//translatewiki.net/ translatewiki.net], el proyecto de localización de MediaWiki.",
+       "editinginterface": "<strong>Aviso:</strong> Estás editando una página usada para proporcionar el texto de la interfaz para el software. \nLos cambios en esta página afectarán la apariencia de la interfaz para los demás usuarios de este wiki. \nPara añadir o cambiar las traducciones utiliza [//translatewiki.net/ translatewiki.net], el proyecto de localización de MediaWiki.",
        "cascadeprotected": "Esta página ha sido protegida para su edición, porque está incluida en {{PLURAL:$1|la siguiente página|las siguientes páginas}}, que están protegidas con la opción de «cascada»:\n$2",
        "namespaceprotected": "No tienes permiso para editar las páginas del espacio de nombres '''$1'''.",
        "customcssprotected": "No tienes permiso para editar esta página CSS, porque contiene configuraciones personales de otro usuario.",
        "mycustomjsprotected": "No tienes permiso para editar esta página JavaScript.",
        "myprivateinfoprotected": "No tienes permiso para editar tu información privada.",
        "mypreferencesprotected": "No tienes permiso para editar tus preferencias.",
-       "ns-specialprotected": "Las páginas especiales no se pueden editar",
+       "ns-specialprotected": "No se pueden editar las páginas especiales.",
        "titleprotected": "Esta página ha sido protegida contra creación por [[User:$1|$1]].\nEl motivo dado fue: \"''$2''\".",
        "filereadonlyerror": "No se puede modificar el archivo \"$1\" porque el repositorio de archivos \"$2\" está en modo de sólo lectura.\nEl administrador que lo ha bloqueado ofrece esta explicación: \"$3\".",
        "invalidtitle-knownnamespace": "Título no válido con el espacio de nombres \"$2\" y el texto \"$3\"",
        "exception-nologin": "No has iniciado sesión",
        "exception-nologin-text": "[[Special:Userlogin|Inicia sesión]] para acceder a esta página o acción.",
        "exception-nologin-text-manual": "Necesitas $1 para acceder a esta página o acción.",
-       "virus-badscanner": "Error de configuración: Antivirus desconocido: ''$1''",
+       "virus-badscanner": "Configuración incorrecta: antivirus desconocido: <em>$1</em>",
        "virus-scanfailed": "falló el análisis (código $1)",
        "virus-unknownscanner": "antivirus desconocido:",
-       "logouttext": "\"'Usted está ahora desconectado.\"'\nTenga en cuenta que algunas páginas pueden continuar mostrándose como si todavía estuviera conectado, hasta que borres la caché de tu navegador.",
+       "logouttext": "<strong>Ha finalizado tu sesión.</strong>\n\nPuede que algunas páginas continúen mostrándose como si la sesión estuviera iniciada hasta que vacíes la memoria caché del navegador.",
        "welcomeuser": "¡Te damos la bienvenida, $1!",
        "welcomecreation-msg": "Se ha creado tu cuenta.\nNo olvides personalizar tus [[Special:Preferences|preferencias de {{SITENAME}}]].",
        "yourname": "Nombre de usuario:",
        "remembermypassword": "Mantenerme conectado en este navegador (hasta $1 {{PLURAL:$1|día|días}})",
        "userlogin-remembermypassword": "Mantener mi sesión iniciada",
        "userlogin-signwithsecure": "Usar conexión segura",
-       "yourdomainname": "Dominio",
+       "yourdomainname": "Tu dominio:",
        "password-change-forbidden": "No puedes cambiar las contraseñas de este wiki.",
        "externaldberror": "Hubo un error de autenticación externa de la base de datos o bien no tienes autorización para actualizar tu cuenta externa.",
        "login": "Iniciar sesión",
-       "nav-login-createaccount": "Iniciar sesión / crear cuenta",
-       "loginprompt": "Necesita activar las ''cookies'' en el navegador para iniciar sesión en {{SITENAME}}.",
-       "userlogin": "Iniciar sesión / crear cuenta",
-       "userloginnocreate": "Iniciar sesión",
-       "logout": "Cerrar sesión",
-       "userlogout": "Cerrar sesión",
+       "nav-login-createaccount": "Acceder/crear cuenta",
+       "loginprompt": "Hay que activar las ''cookies'' en el navegador para iniciar sesión en {{SITENAME}}.",
+       "userlogin": "Acceder/crear cuenta",
+       "userloginnocreate": "Acceder",
+       "logout": "Salir",
+       "userlogout": "Salir",
        "notloggedin": "No has iniciado sesión",
        "userlogin-noaccount": "¿No tienes una cuenta?",
        "userlogin-joinproject": "Únete a {{SITENAME}}",
        "nologinlink": "Crear una cuenta",
        "createaccount": "Crear una cuenta",
        "gotaccount": "¿Ya tienes una cuenta? $1.",
-       "gotaccountlink": "Iniciar sesión",
+       "gotaccountlink": "Acceder",
        "userlogin-resetlink": "¿Olvidaste tus datos de acceso?",
        "userlogin-resetpassword-link": "¿Has olvidado tu contraseña?",
        "userlogin-helplink2": "Ayuda con el registro",
        "userlogin-loggedin": "Ya estás conectado como {{GENDER:$1|$1}}.\nUsa el formulario de abajo para iniciar sesión como otro usuario.",
        "userlogin-createanother": "Crear otra cuenta",
-       "createacct-join": "Introduce tus datos debajo.",
-       "createacct-another-join": "Escribe la información de la cuenta nueva a continuación.",
        "createacct-emailrequired": "Dirección de correo electrónico",
        "createacct-emailoptional": "Dirección de correo electrónico (opcional)",
        "createacct-email-ph": "Escribe tu dirección de correo electrónico",
        "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": "Inicio de sesión exitoso",
+       "loginsuccesstitle": "Has accedido correctamente",
        "loginsuccess": "'''Has iniciado sesión en {{SITENAME}} como «$1».'''",
        "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.",
        "nouserspecified": "Debes especificar un nombre de usuario.",
-       "login-userblocked": "Este usuario está bloqueado. Inicio de sesión no permitido.",
+       "login-userblocked": "No puedes iniciar sesión porque tu cuenta está bloqueada.",
        "wrongpassword": "La contraseña indicada es incorrecta.\nInténtalo de nuevo.",
        "wrongpasswordempty": "No has escrito una contraseña.\nInténtalo de nuevo.",
-       "passwordtooshort": "Las contraseñas deben tener al menos {{PLURAL:$1|1 caracter|$1 caracteres}}.",
+       "passwordtooshort": "Las contraseñas deben tener al menos {{PLURAL:$1|1 carácter|$1 caracteres}}.",
        "password-name-match": "Tu contraseña debe ser diferente de tu nombre de usuario.",
        "password-login-forbidden": "El uso de este nombre de usuario y contraseña han sido prohibidos.",
        "mailmypassword": "Restablecer la contraseña",
        "blocked-mailpassword": "Tu dirección IP está bloqueada, y no se te permite el uso de la función de recuperación de contraseñas para prevenir abusos.",
        "eauthentsent": "Se ha enviado un correo electrónico de confirmación a la dirección especificada.\nAntes de que se envíe cualquier otro correo a la cuenta tienes que seguir las instrucciones enviadas en el mensaje para así confirmar que la dirección te pertenece.",
        "throttled-mailpassword": "Ya se ha enviado un recordatorio de contraseña en {{PLURAL:$1|la última hora|las últimas $1 horas}}.\nPara evitar los abusos, solo se enviará un recordatorio de contraseña cada {{PLURAL:$1|hora|$1 horas}}.",
-       "mailerror": "Error al enviar correo: $1",
+       "mailerror": "Error al enviar el mensaje: $1",
        "acct_creation_throttle_hit": "Los visitantes a este wiki usando tu dirección IP han creado {{PLURAL:$1|una cuenta|$1 cuentas}} en el último día, lo cual es lo máximo permitido en este periodo de tiempo.\nComo resultado, los visitantes usando esta dirección IP no pueden crear más cuentas en este momento.",
        "emailauthenticated": "Tu dirección de correo electrónico fue confirmada el $2 a las $3.",
        "emailnotauthenticated": "Aún no has confirmado tu dirección de correo electrónico.\nHasta que lo hagas, las siguientes funciones no estarán disponibles.",
        "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.",
-       "pt-login": "Iniciar sesión",
-       "pt-login-button": "Iniciar sesión",
+       "pt-login": "Acceder",
+       "pt-login-button": "Acceder",
        "pt-createaccount": "Crear una cuenta",
-       "pt-userlogout": "Cerrar sesión",
+       "pt-userlogout": "Salir",
        "php-mail-error-unknown": "Error desconocido en la función mail() de PHP.",
        "user-mail-no-addy": "Se ha intentado enviar correo electrónico sin una dirección de correo electrónico.",
        "user-mail-no-body": "Trató de enviar un correo electrónico con un cuerpo vacío o excesivamente corto.",
        "resetpass-submit-loggedin": "Cambiar contraseña",
        "resetpass-submit-cancel": "Cancelar",
        "resetpass-wrong-oldpass": "La contraseña antigua no es correcta.\nPuede que ya hayas cambiado la contraseña o que hayas pedido una temporal.",
-       "resetpass-recycled": "Por favor, restablece tu contraseña a algo distinto de tu contraseña actual.",
+       "resetpass-recycled": "Restablece tu contraseña a algo distinto de tu contraseña actual.",
        "resetpass-temp-emailed": "Has iniciado sesión con un código temporal por correo electrónico.\nPara terminar la sesión, debes establecer una nueva contraseña aquí:",
        "resetpass-temp-password": "Contraseña temporal:",
        "resetpass-abort-generic": "Una extensión ha cancelado el cambio de la contraseña.",
        "savearticle": "Guardar la página",
        "preview": "Previsualizar",
        "showpreview": "Mostrar previsualización",
-       "showlivepreview": "Previsualización dinámica",
        "showdiff": "Mostrar los cambios",
        "anoneditwarning": "'''Aviso:''' No has iniciado sesión con una cuenta de usuario.\nTu dirección IP se almacenará en el historial de ediciones de la página.",
        "anonpreviewwarning": "''No has iniciado sesión con una cuenta de usuario. Al guardar los cambios se almacenará tu dirección IP en el historial de edición de la página.''",
        "nosuchsectiontitle": "Sección no encontrada",
        "nosuchsectiontext": "Has intentado editar una sección que no existe.\nQuizá ha sido movida o borrada mientras visitabas la página.",
        "loginreqtitle": "Es necesario iniciar sesión",
-       "loginreqlink": "iniciar sesión",
+       "loginreqlink": "acceder",
        "loginreqpagetext": "Debes $1 para ver otras páginas.",
        "accmailtitle": "Se ha enviado la contraseña",
        "accmailtext": "Se ha enviado a $2 una contraseña generada aleatoriamente para [[User talk:$1|$1]].\n\nLa contraseña para esta nueva cuenta puede cambiarse en [[Special:ChangePassword|la página destinada para ello]] después de haber iniciado sesión.",
        "sitejspreview": "'''Recuerda que sólo estás previsualizando este código JavaScript.'''\n'''¡Aún no se ha guardado!'''",
        "userinvalidcssjstitle": "'''Aviso:''' No existe la apariencia «$1». Recuerda que las páginas personalizadas ''.css'' y ''.js'' tienen un título en minúsculas. Por ejemplo, {{ns:user}}:Ejemplo/vector.css en vez de {{ns:user}}:Ejemplo/Vector.css.",
        "updated": "(Actualizado)",
-       "note": "'''Nota:'''",
-       "previewnote": "'''Recuerda que esto es solo una previsualización.'''\n¡Tus cambios aún no se han guardado!",
+       "note": "<strong>Nota:</strong>",
+       "previewnote": "<strong>Recuerda que esta es una previsualización.</strong>\nTodavía no se han guardado tus cambios.",
        "continue-editing": "Ir al área de edición",
        "previewconflict": "Esta previsualización refleja el texto en el área de edición superior como aparecerá una vez guardados los cambios.",
        "session_fail_preview": "'''No se pudo procesar la edición debido a una pérdida de los datos de sesión.'''\nInténtalo de nuevo.\nSi el problema persiste, [[Special:UserLogout|cierra la sesión]] y vuelve a identificarte.",
        "edit-gone-missing": "No se pudo actualizar la página.\nParece que ha sido borrada.",
        "edit-conflict": "Conflicto de edición.",
        "edit-no-change": "Se ignoró tu revisión, porque no se hizo ningún cambio al texto.",
-       "postedit-confirmation": "Se ha guardado tu edición.",
+       "postedit-confirmation-created": "Se ha creado la página.",
+       "postedit-confirmation-restored": "Se ha restaurado la página.",
+       "postedit-confirmation-saved": "Se ha guardado tu edición.",
        "edit-already-exists": "No se pudo crear una página nueva.\nYa existe.",
        "defaultmessagetext": "Texto de mensaje predeterminado",
        "content-failed-to-parse": "No se pudo analizar el contenido $2 del modelo $1: $3",
        "invalid-content-data": "Datos de contenido inválidos",
-       "content-not-allowed-here": "El contenido \"$1\" no está permitido en la página [[$2]]",
+       "content-not-allowed-here": "El contenido «$1» no está permitido en la página [[$2]]",
        "editwarning-warning": "Se perderán los cambios si se cierra esta página.\nSi has iniciado sesión, puedes desactivar este aviso en la sección «{{int:prefs-editing}}» de las preferencias.",
        "editpage-notsupportedcontentformat-title": "Formato de contenido no admitido",
        "editpage-notsupportedcontentformat-text": "El formato de contenido $1 no es compatible con el modelo de contenido  $2.",
        "parser-template-recursion-depth-warning": "Se ha excedido el límite de recursión de plantillas ($1)",
        "language-converter-depth-warning": "El límite de profundidad del convertidor de idioma ha excedido ($1)",
        "node-count-exceeded-category": "Páginas donde se supera el número de nodos",
+       "node-count-exceeded-category-desc": "Una categoría para las páginas donde se supera el número de nodos.",
        "node-count-exceeded-warning": "Página que ha superado el número de nodos",
        "expansion-depth-exceeded-category": "Páginas donde se supera la profundidad de expansión",
+       "expansion-depth-exceeded-category-desc": "Esta es una categoría para las páginas donde se supera la profundidad de expansión.",
        "expansion-depth-exceeded-warning": "Página que ha superado la profundidad de expansión",
        "parser-unstrip-loop-warning": "Se ha detectado un bucle \"unstrip\"",
        "parser-unstrip-recursion-limit": "Se ha superado el límite de recursión de \"unstrip\" ($1)",
        "nextn-title": "Próximos $1 {{PLURAL:$1|resultado|resultados}}",
        "shown-title": "Mostrar $1 {{PLURAL:$1|resultado|resultados}} por página",
        "viewprevnext": "Ver ($1 {{int:pipe-separator}} $2) ($3).",
-       "searchmenu-exists": "'''Hay una página llamada \"[[:$1]]\" en esta wiki.'''",
+       "searchmenu-exists": "'''Hay una página llamada «[[:$1]]» en este wiki.'''",
        "searchmenu-new": "<strong>Crear la página «[[:$1]]» en este wiki.</strong> {{PLURAL:$2|0=|Véase también la página encontrada con la búsqueda.|Véanse también los resultados de la búsqueda.}}",
        "searchprofile-articles": "Páginas de contenido",
-       "searchprofile-project": "Páginas de ayuda y de proyecto",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Todo",
        "searchprofile-advanced": "Avanzado",
        "searchprofile-articles-tooltip": "Buscar en $1",
-       "searchprofile-project-tooltip": "Buscar en $1",
        "searchprofile-images-tooltip": "Buscar archivos",
        "searchprofile-everything-tooltip": "Buscar en todo el contenido (incluyendo páginas de discusión)",
        "searchprofile-advanced-tooltip": "Buscar en espacios de nombres personalizados",
        "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:",
-       "powersearch-redir": "Listar redirecciones",
        "powersearch-togglelabel": "Seleccionar:",
        "powersearch-toggleall": "Todos",
        "powersearch-togglenone": "Ninguno",
        "prefs-emailconfirm-label": "Confirmación de correo electrónico:",
        "youremail": "Correo electrónico:",
        "username": "{{GENDER:$1|Nombre de usuario|Nombre de usuaria}}:",
-       "uid": "ID de {{GENDER:$1|usuario|usuaria}}:",
        "prefs-memberingroups": "{{GENDER:$2|Miembro}} {{PLURAL:$1|del grupo|de los grupos}}:",
        "prefs-registration": "Fecha y hora de registro:",
        "yourrealname": "Nombre real:",
        "prefs-advancedsearchoptions": "Opciones avanzadas",
        "prefs-advancedwatchlist": "Opciones avanzadas",
        "prefs-displayrc": "Opciones de mostrado",
-       "prefs-displaysearchoptions": "Opciones de visualización",
        "prefs-displaywatchlist": "Opciones de visualización",
        "prefs-tokenwatchlist": "Clave",
        "prefs-diffs": "Diferencias",
        "right-move": "Trasladar páginas",
        "right-move-subpages": "Trasladar páginas con sus subpáginas",
        "right-move-rootuserpages": "Trasladar páginas de usuario raíz",
+       "right-move-categorypages": "Trasladar páginas de categoría",
        "right-movefile": "Trasladar archivos",
        "right-suppressredirect": "No crear redirecciones de las páginas fuente  al trasladar páginas",
        "right-upload": "Subir archivos",
        "action-createpage": "crear páginas",
        "action-createtalk": "crear páginas de discusión",
        "action-createaccount": "crear esta cuenta de usuario",
+       "action-history": "Ver el historial de esta página",
        "action-minoredit": "marcar este cambio como menor",
        "action-move": "trasladar esta página",
        "action-move-subpages": "trasladar esta página y sus subpáginas",
        "action-move-rootuserpages": "trasladar páginas de usuario raíz",
+       "action-move-categorypages": "trasladar páginas de categoría",
        "action-movefile": "trasladar este archivo",
        "action-upload": "subir este archivo",
        "action-reupload": "reemplazar este archivo existente",
        "recentchanges-legend-heading": "'''Leyenda:'''",
        "recentchanges-legend-newpage": "(véase también la [[Special:NewPages|lista de páginas nuevas]])",
        "rcnotefrom": "A continuación se presentan los cambios desde <strong> $2 </strong> (hasta <strong> $1 </strong> se muestra).",
-       "rclistfrom": "Mostrar nuevos cambios desde $1",
+       "rclistfrom": "Mostrar nuevos cambios desde $2, $3",
        "rcshowhideminor": "$1 ediciones menores",
        "rcshowhideminor-show": "Mostrar",
        "rcshowhideminor-hide": "Ocultar",
        "uploadstash-refresh": "Actualizar la lista de archivos",
        "invalid-chunk-offset": "Desplazamiento inválido del fragmento",
        "img-auth-accessdenied": "Acceso denegado",
-       "img-auth-nopathinfo": "Falta PATH_INFO.\nEl servidor no está configurado para proporcionar esta información.\nEs posible que esté basado en CGI y que no sea compatible con img_auth.\nConsulte https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "Falta PATH_INFO.\nEl servidor no está configurado para proporcionar esta información.\nEs posible que esté basado en CGI y que no sea compatible con img_auth.\nConsulte https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Ruta solicitad no esá en el directorio de cargas configurado",
        "img-auth-badtitle": "Incapaz de construir un título válido de «$1».",
        "img-auth-nologinnWL": "No has iniciado sesión y «$1» no está en la lista blanca.",
        "pageswithprop-prophidden-binary": "valor de la propiedad binaria oculta ($1)",
        "doubleredirects": "Redirecciones dobles",
        "doubleredirectstext": "Esta página contiene una lista de páginas que redirigen a otras páginas de redirección.\nCada fila contiene enlaces a la segunda y tercera redirección, así como la primera línea de la segunda redirección, en la que usualmente se encontrará el artículo «real» al que la primera redirección debería apuntar.\nLas entradas <del>tachadas</del> han sido resueltas.",
-       "double-redirect-fixed-move": "[[$1]] ha sido trasladado, ahora es una redirección a [[$2]]",
-       "double-redirect-fixed-maintenance": "Corrigiendo la doble redirección desde [[$1]] a [[$2]].",
+       "double-redirect-fixed-move": "[[$1]] ha sido movido.\nEste fue automáticamente actualizado y ahora es una redirección a [[$2]].",
+       "double-redirect-fixed-maintenance": "Corrigiendo automáticamente la doble redirección desde [[$1]] a [[$2]] en un trabajo de mantenimiento.",
        "double-redirect-fixer": "Corrector de redirecciones",
        "brokenredirects": "Redirecciones incorrectas",
        "brokenredirectstext": "Las siguientes redirecciones enlazan a páginas que no existen:",
        "log-title-wildcard": "Buscar títulos que empiecen con este texto",
        "showhideselectedlogentries": "Mostrar u ocultar las entradas seleccionadas del registro",
        "allpages": "Todas las páginas",
-       "alphaindexline": "$1 a $2",
        "nextpage": "Siguiente página ($1)",
        "prevpage": "Página anterior ($1)",
        "allpagesfrom": "Mostrar páginas que empiecen por:",
        "trackingcategories-disabled": "La categoría está desactivada",
        "mailnologin": "Ninguna dirección de envio",
        "mailnologintext": "Debes [[Special:UserLogin|iniciar sesión]] y tener una dirección electrónica válida en tus [[Special:Preferences|preferencias]] para enviar un correo electrónico a otros usuarios.",
-       "emailuser": "Enviar un correo electrónico a {{GENDER:{{BASEPAGENAME}}|este usuario|esta usuaria}}",
-       "emailuser-title-target": "Enviar un correo electrónico a {{GENDER:$1|este usuario|esta usuaria}}",
+       "emailuser": "Enviar un mensaje de correo a {{GENDER:{{BASEPAGENAME}}|este usuario|esta usuaria}}",
+       "emailuser-title-target": "Enviar un mensaje a {{GENDER:$1|este usuario|esta usuaria}}",
        "emailuser-title-notarget": "Enviar un correo electrónico al usuario",
-       "emailpage": "Enviar un correo electrónico a un usuario",
+       "emailpage": "Enviar mensaje al usuario",
        "emailpagetext": "Puedes usar el formulario de abajo para enviar un correo electrónico a {{GENDER:$1|este usuario|esta usuaria}}.\nLa dirección de correo electrónico que indicaste en [[Special:Preferences|tus preferencias de usuario]] aparecerá en el campo \"Remitente\" o \"De\" para que el destinatario pueda responderte.",
        "defemailsubject": "Correo electrónico enviado por el usuario «$1» desde {{SITENAME}}",
        "usermaildisabled": "Correo electrónico del usuario deshabilitado",
        "watchnologin": "No has iniciado sesión",
        "addwatch": "Añadir a la lista de seguimiento",
        "addedwatchtext": "La página «[[:$1]]» ha sido añadida a tu [[Special:Watchlist|lista de seguimiento]]. Los cambios futuros en esta página y en su página de discusión asociada se indicarán ahí.",
+       "addedwatchtext-short": "La página \"$1\" ha sido añadida a tu lista de seguimiento.",
        "removewatch": "Quitar de la lista de seguimiento",
        "removedwatchtext": "Se ha eliminado la página «[[:$1]]» de tu [[Special:Watchlist|lista de seguimiento]].",
+       "removedwatchtext-short": "La página \"$1\" ha sido eliminado de tu lista de seguimiento.",
        "watch": "Vigilar",
        "watchthispage": "Vigilar esta página",
        "unwatch": "Dejar de vigilar",
        "watchlist-details": "{{PLURAL:$1|$1 página|$1 páginas}} en su lista de seguimiento, sin contar las de discusión.",
        "wlheader-enotif": "La notificación por correo está activada.",
        "wlheader-showupdated": "Las páginas modificadas desde su última visita aparecen en '''negrita'''.",
-       "watchmethod-recent": "revisando cambios recientes en páginas vigiladas",
-       "watchmethod-list": "revisando las páginas vigiladas en busca de cambios recientes",
-       "watchlistcontains": "Tu lista de seguimiento posee $1 {{PLURAL:$1|página|páginas}}.",
-       "iteminvalidname": "Problema con el artículo '$1', nombre inválido...",
        "wlnote2": "A continuación se muestran los cambios de  {{PLURAL:$1|la última hora|las últimas <strong>$1</strong> horas}}, a partir del $2, $3.",
        "wlshowlast": "Ver los cambios de las últimas $1 horas, $2 días  $3",
        "watchlist-options": "Opciones de la lista de seguimiento",
        "enotif_lastvisited": "Consulta $1 para ver todos los cambios realizados desde tu última visita.",
        "enotif_lastdiff": "Consulta $1 para ver este cambio.",
        "enotif_anon_editor": "usuario anónimo $1",
-       "enotif_body": "Hola, $WATCHINGUSERNAME:\n\n$PAGEINTRO $NEWPAGE\n\nResumen del editor: $PAGESUMMARY $PAGEMINOREDIT\n\nContacta al editor:\ncorreo: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nNo enviaremos más notificaciones si ocurre más actividad, a menos que visites esta página con la sesión iniciada. También puedes restablecer los estados de notificación para todas las páginas en tu lista de seguimiento.\n\nAtentamente, el sistema de notificaciones de {{SITENAME}}\n\n--\nPara cambiar tus ajustes de notificación por correo, visita\n{{canonicalurl:{{#special:Preferences}}}}\n\nPara cambiar los ajustes de tu lista de seguimiento, visita\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPara quitar la página de tu lista de seguimiento, visita\n$UNWATCHURL\n\nPara ayuda y comentarios:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Hola, $WATCHINGUSERNAME:\n\n$PAGEINTRO $NEWPAGE\n\nResumen del editor: $PAGESUMMARY $PAGEMINOREDIT\n\nContacta al editor:\ncorreo: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nNo enviaremos más notificaciones si ocurre más actividad, a menos que visites esta página con la sesión iniciada. También puedes restablecer los estados de notificación para todas las páginas en tu lista de seguimiento.\n\nAtentamente, el sistema de notificaciones de {{SITENAME}}\n\n--\nPara cambiar tus ajustes de notificación por correo, visita\n{{canonicalurl:{{#special:Preferences}}}}\n\nPara cambiar los ajustes de tu lista de seguimiento, visita\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPara quitar la página de tu lista de seguimiento, visita\n$UNWATCHURL\n\nPara ayuda y comentarios:\n$HELPPAGE",
        "created": "creada",
        "changed": "modificada",
        "deletepage": "Borrar esta página",
        "blockip": "Bloquear usuario",
        "blockip-legend": "Bloquear usuario",
        "blockiptext": "Usa el siguiente formulario para bloquear el acceso de escritura desde una dirección IP específica o nombre de usuario.\nEsto debería hacerse sólo para prevenir vandalismos, y de acuerdo a las [[{{MediaWiki:Policy-url}}|políticas]].\nExplica la razón específica del bloqueo (por ejemplo, citando las páginas en particular que han sido objeto de vandalismo).",
-       "ipadressorusername": "Dirección IP o nombre de usuario:",
+       "ipaddressorusername": "Dirección IP o nombre de usuario:",
        "ipbexpiry": "Caducidad:",
        "ipbreason": "Motivo:",
        "ipbreason-dropdown": "*Motivos comunes de bloqueo\n** Añadir información falsa\n** Eliminar contenido de las páginas\n** Publicitar enlaces a otras páginas web\n** Añadir basura a las páginas\n** Comportamiento intimidatorio u hostil\n** Abuso de múltiples cuentas\n** Nombre de usuario inaceptable",
        "movepagetalktext": "La página de discusión asociada, si existe, será renombrada automáticamente '''a menos que:'''\n*Estés trasladando la página entre espacios de nombres diferentes,\n*Una página de discusión no vacía ya exista con el nombre nuevo, o\n*No marques el recuadro «Renombrar la página de discusión asociada».\n\nEn estos casos, deberás trasladar manualmente el contenido de la página de discusión.",
        "movearticle": "Renombrar página",
        "moveuserpage-warning": "'''Aviso:''' estás a punto de trasladar una página de usuario. Ten en cuenta que solo será trasladada la página; el usuario '''no''' será renombrado.",
+       "movecategorypage-warning": "<strong>Advertencia:</strong> Estás a punto de trasladar una página de categoría. Ten en cuenta que se trasladará sólo la página y las páginas en la antigua categoría <em>no</em> serán recategorizadas en la nueva.",
        "movenologintext": "Es necesario ser usuario registrado y [[Special:UserLogin|haber iniciado sesión]] para renombrar una página.",
        "movenotallowed": "No tienes permiso para trasladar páginas.",
        "movenotallowedfile": "No tienes permiso para trasladar archivos.",
        "cant-move-user-page": "No tienes permiso para trasladar páginas de usuario (excepto subpáginas).",
        "cant-move-to-user-page": "No tienes permiso para trasladar una página a una página de usuario (excepto a subpáginas de usuario).",
+       "cant-move-category-page": "No tienes permiso para trasladar páginas de categoría.",
+       "cant-move-to-category-page": "No tienes permiso para trasladar una página a una página de categoría.",
        "newtitle": "A título nuevo:",
        "move-watch": "Vigilar páginas de origen y destino",
        "movepagebtn": "Renombrar página",
        "tooltip-summary": "Introduce un breve resumen",
        "interlanguage-link-title": "$1 ($2)",
        "common.css": "/* El CSS colocado en esta página será aplicado a todas las apariencias */",
-       "cologneblue.css": "/* El CSS colocado en esta página afectará a los usuarios que usen la apariencia Cologne Blue */",
        "monobook.css": "/* El CSS colocado en esta página afectará a los usuarios que usen la apariencia \"MonoBook\" */",
-       "modern.css": "/* El CSS colocado en esta página afectará a los usuarios que usen la apariencia Moderna */",
        "vector.css": "/* El CSS colocado en esta página afectará a los usuarios que usen la apariencia \"Vector\" */",
        "print.css": "/* Los estilos CSS colocados aquí afectarán la impresión */",
        "noscript.css": "/* Los estilos CSS colocados aquí se aplicarán a los usuarios que hayan desactivado el JavaScript en su navegador */",
        "group-sysop.css": "/* Los estilos CSS colocados aquí se aplicarán para todos los usuarios del grupo Administradores */",
        "group-bureaucrat.css": "/* Los estilos CSS colocados aquí se aplicarán para todos los usuarios del grupo Burócratas */",
        "common.js": "/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios en cada carga de página */",
-       "cologneblue.js": "/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios que usen la piel Colonia azul */",
        "monobook.js": "/* El código JavaScript que se ponga aquí será cargado por los usuarios de la apariencia MonoBook */",
-       "modern.js": "/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios que usen la apariencia Moderna */",
        "vector.js": "/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios que usen la apariencia Vector */",
        "group-autoconfirmed.js": "/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios del grupo Usuarios autoconfirmados */",
        "group-bot.js": "/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios del grupo Bots */",
        "group-sysop.js": "/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios del grupo Administradores */",
        "group-bureaucrat.js": "/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios del grupo Burócratas */",
-       "notacceptable": "El servidor wiki no puede proveer los datos en un formato que su cliente (navegador) pueda entender.",
        "anonymous": "{{PLURAL:$1|Usuario anónimo|Usuarios anónimos}} de {{SITENAME}}",
        "siteuser": "{{GENDER:$1|Usuario|Usuaria}} $1 de {{SITENAME}}",
        "anonuser": "{{SITENAME}} usuario anónimo $1",
        "pageinfo-category-pages": "Número de páginas",
        "pageinfo-category-subcats": "Número de subcategorías",
        "pageinfo-category-files": "Número de archivos",
-       "skinname-cologneblue": "Colonia azul",
        "skinname-monobook": "MonoBook",
-       "skinname-modern": "Moderna",
        "skinname-vector": "Vector",
        "markaspatrolleddiff": "Marcar como revisado",
        "markaspatrolledtext": "Marcar este artículo como revisado",
        "newimages-summary": "Esta página especial muestra una galería de los últimos archivos subidos.",
        "newimages-legend": "Nombre del fichero",
        "newimages-label": "Nombre del fichero (o una parte):",
-       "showhidebots": "($1 bots)",
+       "newimages-showbots": "Mostrar cargas de bots",
        "noimages": "No hay nada que ver.",
        "ilsubmit": "Buscar",
        "bydate": "por fecha",
        "autosumm-replace": "Página reemplazada por «$1»",
        "autoredircomment": "Página redirigida a [[$1]]",
        "autosumm-new": "Página creada con «$1»",
-       "livepreview-loading": "Cargando…",
-       "livepreview-ready": "Cargando… ¡Listo!",
-       "livepreview-failed": "¡La previsualización al vuelo falló!\nPrueba la previsualización normal.",
-       "livepreview-error": "No se pudo conectar:  $1  «$2».\nIntenta usar la previsualización normal.",
        "lag-warn-normal": "Los cambios realizados en {{PLURAL:$1|el último segundo|los últimos $1 segundos}} podrían no mostrarse en esta lista.",
        "lag-warn-high": "Debido a una alta latencia el servidor de base de datos, los cambios realizados en {{PLURAL:$1|el último segundo|los últimos $1 segundos}} podrían no mostrarse en esta lista.",
-       "watchlistedit-numitems": "Tu lista de seguimiento tiene {{PLURAL:$1|una página |$1 páginas}}, excluyendo las páginas de discusión.",
-       "watchlistedit-noitems": "Tu lista de seguimiento está vacía.",
        "watchlistedit-normal-title": "Editar lista de seguimiento",
        "watchlistedit-normal-legend": "Borrar títulos de la lista de seguimiento",
        "watchlistedit-normal-explain": "A continuación se listan las páginas en tu lista de seguimiento.\nPara quitar un título, marca la casilla junto a él, y pulsa «{{int:Watchlistedit-normal-submit}}».\nTambién puedes [[Special:EditWatchlist/raw|editar la lista en crudo]].",
        "watchlistedit-raw-done": "Tu lista de seguimiento se ha actualizado.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Se ha añadido una página|Se han añadido $1 páginas}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Una página ha sido borrada|$1 páginas han sido borradas}}:",
+       "watchlistedit-clear-title": "Lista de seguimiento limpiada",
+       "watchlistedit-clear-legend": "Limpiar lista de seguimiento",
+       "watchlistedit-clear-explain": "Todos los títulos serán eliminados de tu lista de seguimiento",
+       "watchlistedit-clear-titles": "Títulos:",
+       "watchlistedit-clear-submit": "Vaciar la lista de seguimiento (¡permanente!)",
+       "watchlistedit-clear-done": "Se ha vaciado tu lista de seguimiento.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|un título fue removido|Los títulos $1 fueron removidos}}:",
+       "watchlistedit-too-many": "Hay demasiadas páginas para mostrar aquí.",
+       "watchlisttools-clear": "Limpiar la lista de seguimiento",
        "watchlisttools-view": "Ver cambios",
        "watchlisttools-edit": "Ver y editar tu lista de seguimiento",
        "watchlisttools-raw": "Editar lista de seguimiento en crudo",
        "specialpages-note": "* Páginas especiales normales\n* <span class=\"mw-specialpagerestricted\">Páginas especiales restringidas.</span>\n* <span class=\"mw-specialpagecached\">Páginas especiales en caché (podrían ser obsoletas).</span>",
        "specialpages-group-maintenance": "Reportes de mantenimiento",
        "specialpages-group-other": "Otras páginas especiales",
-       "specialpages-group-login": "Iniciar sesión / Crear cuenta",
+       "specialpages-group-login": "Acceder/crear cuenta",
        "specialpages-group-changes": "Cambios recientes y registros",
        "specialpages-group-media": "Páginas sobre archivos",
        "specialpages-group-users": "Usuarios y permisos",
        "compare-invalid-title": "El título especificado es inválido.",
        "compare-title-not-exists": "El título especificado no existe.",
        "compare-revision-not-exists": "La revisión especificada no existe.",
-       "dberr-header": "Este wiki tiene un problema",
        "dberr-problems": "Lo sentimos. Este sitio está experimentando dificultades técnicas.",
        "dberr-again": "Prueba a recargar dentro de unos minutos.",
        "dberr-info": "(No se puede contactar con la base de datos del servidor: $1)",
        "htmlform-no": "No",
        "htmlform-yes": "Sí",
        "htmlform-chosen-placeholder": "Selecciona una opción",
+       "htmlform-cloner-create": "Añadir más",
+       "htmlform-cloner-delete": "Eliminar",
+       "htmlform-cloner-required": "Se requiere al menos un valor",
        "sqlite-has-fts": "$1 con soporte para búsqueda de texto completo",
        "sqlite-no-fts": "$1 sin soporte para búsqueda de texto completo",
        "logentry-delete-delete": "$1 {{GENDER:$2|borró}} la página «$3»",
index 5bc2e39..d311c95 100644 (file)
        "searchbutton": "Otsi",
        "go": "Mine",
        "searcharticle": "Mine",
-       "history": "Artikli ajalugu",
+       "history": "Ajalugu",
        "history_short": "Ajalugu",
        "updatedmarker": "uuendatud pärast viimast külastust",
        "printableversion": "Prinditav versioon",
        "jumptonavigation": "navigeerimiskast",
        "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-errorunknown": "Teadmata tõrge",
        "aboutsite": "{{GRAMMAR:genitive|{{SITENAME}}}} tiitelandmed",
        "aboutpage": "Project:Tiitelandmed",
        "thisisdeleted": "Vaata $1 või taasta?",
        "viewdeleted": "Vaata $1?",
        "restorelink": "{{PLURAL:$1|üht|$1}} kustutatud versiooni",
-       "feedlinks": "Sööde:",
+       "feedlinks": "Voog:",
        "feed-invalid": "Vigane vootüüp.",
        "feed-unavailable": "Uudisvood ei ole saadaval.",
        "site-rss-feed": "$1 (RSS-voog)",
        "readonly_lag": "Andmebaas on automaatselt lukustatud, seniks kuni ''slave''-andmebaasid on uuendatud.",
        "internalerror": "Sisemine viga",
        "internalerror_info": "Sisemine viga: $1",
-       "fileappenderrorread": "Lisamise käigus ebaõnnestus faili \"$1\" lugemine.",
-       "fileappenderror": "Faili \"$1\" ei saanud lisada failile \"$2\".",
        "filecopyerror": "Ei saanud faili \"$1\" kopeerida nimega \"$2\".",
        "filerenameerror": "Ei saanud faili \"$1\" failiks \"$2\" ümber nimetada.",
        "filedeleteerror": "Faili nimega \"$1\" ei ole võimalik kustutada.",
        "directorycreateerror": "Kataloogi \"$1\" ei saanud luua.",
        "filenotfound": "Faili nimega \"$1\" ei leitud.",
-       "fileexistserror": "Kirjutamine faili \"$1\" ebaõnnestus: fail on juba olemas",
        "unexpected": "Ootamatu väärtus: \"$1\"=\"$2\".",
        "formerror": "Viga: vormi ei saanud salvestada",
        "badarticleerror": "Seda toimingut ei saa sellel leheküljel sooritada.",
        "userlogin-helplink2": "Sisselogimisabi",
        "userlogin-loggedin": "Oled juba sisse logitud nimega {{GENDER:$1|$1}}.\nKasuta allolevat vormi, et logida sisse teise kasutajaga.",
        "userlogin-createanother": "Loo teine konto",
-       "createacct-join": "Sisesta allapoole oma andmed.",
-       "createacct-another-join": "Sisesta allpool uue konto andmed.",
        "createacct-emailrequired": "E-posti aadress",
        "createacct-emailoptional": "E-posti aadress (valikuline)",
        "createacct-email-ph": "Sisesta oma e-posti aadress",
        "savearticle": "Salvesta",
        "preview": "Eelvaade",
        "showpreview": "Näita eelvaadet",
-       "showlivepreview": "Näita eelvaadet",
        "showdiff": "Näita muudatusi",
        "anoneditwarning": "'''Hoiatus:''' Sa pole sisse logitud.\nSelle lehe redigeerimislogisse salvestatakse su IP-aadress.",
        "anonpreviewwarning": "''Sa pole sisse logitud. Selle lehe redigeerimislogisse salvestatakse su IP-aadress.''",
        "edit-gone-missing": "Polnud võimalik lehekülge uuendada.\nTundub, et see on kustutatud.",
        "edit-conflict": "Redigeerimiskonflikt.",
        "edit-no-change": "Sinu redigeerimist ignoreeriti, sest tekstile ei olnud tehtud muudatusi.",
-       "postedit-confirmation": "Sinu muudatus on salvestatud.",
+       "postedit-confirmation-created": "See lehekülg on alustatud.",
+       "postedit-confirmation-restored": "See lehekülg on taastatud.",
+       "postedit-confirmation-saved": "Sinu muudatus on salvestatud.",
        "edit-already-exists": "Ei saanud alustada uut lehekülge.\nSee on juba olemas.",
        "defaultmessagetext": "Sõnumi vaiketekst",
        "content-failed-to-parse": "Ebaõnnestus $1i mudeli $2-tüüpi sisu liigendamine: $3",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
        "expensive-parserfunction-warning": "'''Hoiatus:''' See lehekülg kasutab liialt palju aeglustavaid laiendusfunktsioone. Neid võiks kasutada vähem kui {{PLURAL:$2|ühel|$2}} korral, praegu on kasutatud {{PLURAL:$1|ühel|$1}} korral.",
-       "expensive-parserfunction-category": "Liiga palju aeglasi laiendusfunktsioone kasutavad leheküljed",
+       "expensive-parserfunction-category": "Leheküljed, kus on liiga palju kulukaid parserifunktsioone",
        "post-expand-template-inclusion-warning": "'''Hoiatus:''' Väljakutsutavate mallide hulk on liiga suur, mõningaid malle ei näidata.",
        "post-expand-template-inclusion-category": "Leheküljed, kus mallide väljakutsumise limiit on ületatud",
        "post-expand-template-argument-warning": "'''Hoiatus:''' See lehekülg sisaldab argumendina vähemalt üht malli, mille määratud maht on liiga suur.\nNeed argumendid on välja jäetud.",
-       "post-expand-template-argument-category": "Malli vahele jäetud argumente sisaldavad leheküljed",
+       "post-expand-template-argument-category": "Leheküljed, kus malli argumendid on välja jäänud",
        "parser-template-loop-warning": "Mallid moodustavad tsükli: [[$1]]",
        "parser-template-recursion-depth-warning": "Malli rekursiivse kasutamise limiit on ületatud ($1)",
        "language-converter-depth-warning": "Keeleteisendaja sügavuspiir ületatud ($1)",
        "node-count-exceeded-category": "Ületatud sõlmemääraga leheküljed",
+       "node-count-exceeded-category-desc": "Ületatud sõlmemääraga lehekülgede kategooria.",
        "node-count-exceeded-warning": "Lehekülg ületas sõlmemäära.",
        "expansion-depth-exceeded-category": "Ületatud hõrendussügavusega leheküljed",
+       "expansion-depth-exceeded-category-desc": "Ületatud hõrendussügavusega lehekülgede kategooria.",
        "expansion-depth-exceeded-warning": "Lehekülg ületas hõrendussügavuse.",
        "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.",
        "revdelete-legend": "Nähtavuse piirangute seadmine",
        "revdelete-hide-text": "Redaktsiooni tekst",
        "revdelete-hide-image": "Peida faili sisu",
-       "revdelete-hide-name": "Peida toiming ja sihtmärk",
+       "revdelete-hide-name": "Peida toiming ja selle objekt",
        "revdelete-hide-comment": "Resümee",
        "revdelete-hide-user": "Toimetaja kasutajanimi või IP-aadress",
        "revdelete-hide-restricted": "Varja andmeid nii administraatorite kui ka teiste eest.",
        "revdelete-offender": "Redaktsiooni tegija:",
        "suppressionlog": "Varjamislogi",
        "suppressionlogtext": "Allpool on nimekiri kustutamistest ja blokeeringutest, millega kaasneb administraatorite eest sisu varjamine.\nJõus olevad keelud ja blokeeringud leiad [[Special:BlockList|blokeerimisnimekirja]].",
-       "mergehistory": "Ühenda lehtede ajalood",
+       "mergehistory": "Lehekülgede ajalugude liitmine",
        "mergehistory-header": "Siin leheküljel saad ühe lehekülje ajaloo redaktsioonid uuema leheküljega liita.\nVeendu, et selle muudatusega jääb lehekülje redigeerimislugu ajaliselt katkematuks.",
-       "mergehistory-box": "Ühenda kahe lehekülje muudatuste ajalugu:",
-       "mergehistory-from": "Lehekülje allikas:",
+       "mergehistory-box": "Kahe lehekülje redaktsioonide liitmine:",
+       "mergehistory-from": "Alliklehekülg:",
        "mergehistory-into": "Sihtlehekülg:",
-       "mergehistory-list": "Ühendatav redigeerimise ajalugu",
+       "mergehistory-list": "Liidetav redigeerimise ajalugu",
        "mergehistory-merge": "Järgmised lehekülje [[:$1]] redaktsioonid saab liita leheküljega [[:$2]].\nKasuta raadionuppe, et valida ainult redaktsioonid, mis on loodud valitud ajal või varem.\nPane tähele, et navigeerimislinkide kasutamine lähtestab redaktsioonide valiku.",
-       "mergehistory-go": "Näita ühendatavaid muudatusi",
-       "mergehistory-submit": "Ühenda redaktsioonid",
-       "mergehistory-empty": "Ühendatavaid redaktsioone ei ole.",
+       "mergehistory-go": "Näita liidetavaid muudatusi",
+       "mergehistory-submit": "Liida redaktsioonid",
+       "mergehistory-empty": "Ühtegi redaktsiooni ei saa liita.",
        "mergehistory-success": "Lehekülje [[:$1]] {{PLURAL:$3|üks redaktsioon|$3 redaktsiooni}} liideti lehega [[:$2]].",
        "mergehistory-fail": "Muudatuste ajaloo liitmine ebaõnnestus. Palun kontrolli lehekülje ja aja parameetreid.",
-       "mergehistory-no-source": "Lehekülje allikat $1 ei ole.",
+       "mergehistory-no-source": "Alliklehekülge $1 pole olemas.",
        "mergehistory-no-destination": "Sihtlehekülge $1 pole olemas.",
-       "mergehistory-invalid-source": "Allikaleheküljel peab olema lubatav pealkiri.",
-       "mergehistory-invalid-destination": "Sihtkoha leheküljel peab olema lubatav pealkiri.",
-       "mergehistory-autocomment": "Liitsin lehe [[:$1]] lehele [[:$2]]",
-       "mergehistory-comment": "Lehekülg [[:$1]] liidetud leheküljele [[:$2]]: $3",
-       "mergehistory-same-destination": "Lähte- ja sihtlehekülg ei saa samad olla",
+       "mergehistory-invalid-source": "Allikleheküljel peab olema lubatav pealkiri.",
+       "mergehistory-invalid-destination": "Sihtleheküljel peab olema lubatav pealkiri.",
+       "mergehistory-autocomment": "Liidetud lehekülg [[:$1]] leheküljega [[:$2]]",
+       "mergehistory-comment": "Liidetud lehekülg [[:$1]] leheküljega [[:$2]]: $3",
+       "mergehistory-same-destination": "Allik- ja sihtlehekülg ei saa olla samad.",
        "mergehistory-reason": "Põhjus:",
        "mergelog": "Liitmislogi",
-       "pagemerge-logentry": "liitis lehekülje [[$1]] leheküljelega [[$2]] (muudatusi kuni $3)",
-       "revertmerge": "Tühista ühendamine",
+       "pagemerge-logentry": "liitis lehekülje [[$1]] leheküljega [[$2]] (kuni redaktsioonini $3)",
+       "revertmerge": "Tühista liitmine",
        "mergelogpagetext": "Allpool on hiljuti üksteisega liidetud leheküljeajalugude logi.",
        "history-title": "Lehekülje \"$1\" muudatuste ajalugu",
        "difference-title": "Erinevus lehekülje \"$1\" redaktsioonide vahel",
        "searchresults": "Otsingu tulemused",
        "searchresults-title": "Otsingu \"$1\" tulemused",
        "toomanymatches": "Liiga palju tulemusi, ürita teistsugust päringut",
-       "titlematches": "Vasted artikli pealkirjades",
-       "textmatches": "Vasted artikli tekstides",
-       "notextmatches": "Artikli tekstides otsitavat ei leitud",
+       "titlematches": "Vasted lehekülje pealkirjades",
+       "textmatches": "Vasted lehekülje tekstides",
+       "notextmatches": "Vasted lehekülje tekstides puuduvad.",
        "prevn": "{{PLURAL:$1|eelmine|eelmised $1}}",
        "nextn": "{{PLURAL:$1|järgmine|järgmised $1}}",
        "prevn-title": "{{PLURAL:$1|Eelmine tulemus|Eelmised $1 tulemust}}",
        "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.}}",
        "searchprofile-articles": "Sisuleheküljed",
-       "searchprofile-project": "Abi- ja projektilehed",
        "searchprofile-images": "Multimeedia",
        "searchprofile-everything": "Kõik",
        "searchprofile-advanced": "Täpsem otsing",
        "searchprofile-articles-tooltip": "Otsi nimeruumist $1",
-       "searchprofile-project-tooltip": "Otsi nimeruumidest $1",
        "searchprofile-images-tooltip": "Failiotsing",
        "searchprofile-everything-tooltip": "Otsi kogu sisust (k.a aruteluleheküljed)",
        "searchprofile-advanced-tooltip": "Otsi kohandatud nimeruumidest",
        "search-nonefound": "Päringule ei leitud vasteid.",
        "powersearch-legend": "Täpsem otsing",
        "powersearch-ns": "Otsing nimeruumidest:",
-       "powersearch-redir": "Loetle ümbersuunamised",
        "powersearch-togglelabel": "Vali:",
        "powersearch-toggleall": "Kõik",
        "powersearch-togglenone": "Ei ühtegi",
        "prefs-emailconfirm-label": "E-posti kinnitus:",
        "youremail": "E-posti aadress:",
        "username": "{{GENDER:$1|Kasutajanimi}}:",
-       "uid": "{{GENDER:$1|Kasutaja}} ID:",
        "prefs-memberingroups": "{{PLURAL:$1|Järgmise rühma|Järgmiste rühmade}} {{GENDER:$2|liige}}:",
        "prefs-registration": "Registreerumise aeg:",
        "yourrealname": "Tegelik nimi:",
        "prefs-advancedsearchoptions": "Täpsemad eelistused",
        "prefs-advancedwatchlist": "Täpsemad eelistused",
        "prefs-displayrc": "Kuvasätted",
-       "prefs-displaysearchoptions": "Kuvasätted",
        "prefs-displaywatchlist": "Kuvasätted",
        "prefs-tokenwatchlist": "Luba",
        "prefs-diffs": "Erinevused",
        "right-move": "Teisaldada lehekülgi",
        "right-move-subpages": "Teisaldada lehekülgi koos nende alamlehtedega",
        "right-move-rootuserpages": "Teisaldada kasutajalehekülgi",
+       "right-move-categorypages": "Teisaldada kategoorialehekülgi",
        "right-movefile": "Teisaldada faile",
        "right-suppressredirect": "Teisaldada lehekülgi ümbersuunamist loomata",
        "right-upload": "Faile üles laadida",
        "action-createpage": "lehekülgi luua",
        "action-createtalk": "arutelulehekülgi luua",
        "action-createaccount": "seda kasutajakontot luua",
+       "action-history": "vaadata selle lehekülje ajalugu",
        "action-minoredit": "seda muudatust pisimuudatuseks märkida",
        "action-move": "seda lehekülge teisaldada",
        "action-move-subpages": "seda lehekülge koos alamlehekülgedega teisaldada",
        "action-move-rootuserpages": "teisaldada kasutajalehekülgi",
+       "action-move-categorypages": "teisaldada kategoorialehekülgi",
        "action-movefile": "seda faili teisaldada",
        "action-upload": "seda faili üles laadida",
        "action-reupload": "seda olemasolevat faili üle kirjutada",
        "recentchanges-label-bot": "Roboti tehtud muudatus",
        "recentchanges-label-unpatrolled": "Seda muudatust ei ole veel kontrollitud",
        "recentchanges-label-plusminus": "Lehekülje suuruse muutus baitides",
+       "recentchanges-legend-heading": "'''Seletus:'''",
        "recentchanges-legend-newpage": "(vaata ka [[Special:NewPages|uute lehekülgede loendit]])",
        "rcnotefrom": "Allpool on toodud muudatused alates: <strong>$2</strong> (näidatakse kuni <strong>$1</strong> muudatust)",
-       "rclistfrom": "Näita muudatusi alates: $1",
+       "rclistfrom": "Näita muudatusi alates: $3, kell $2",
        "rcshowhideminor": "Pisiparandused ($1)",
        "rcshowhideminor-show": "näita",
        "rcshowhideminor-hide": "peida",
        "filesource": "Allikas:",
        "ignorewarning": "Ignoreeri hoiatust ja salvesta fail hoiatusest hoolimata",
        "ignorewarnings": "Ignoreeri hoiatusi",
-       "minlength1": "Faili nimes peab olema vähemalt üks kirjamärk.",
+       "minlength1": "Failinimes peab olema vähemalt üks täht.",
        "illegalfilename": "Failinimi \"$1\" sisaldab märke, mis pole pealkirjades lubatud. Palun nimeta fail ümber ja proovi uuesti.",
        "filename-toolong": "Failinimed ei või olla pikemad kui 240 baiti.",
        "badfilename": "Pildi nimi on muudetud. Uus nimi on \"$1\".",
        "uploadstash-refresh": "Värskenda faililoendit",
        "invalid-chunk-offset": "Tüki vigane nihe",
        "img-auth-accessdenied": "Juurdepääs keelatud",
-       "img-auth-nopathinfo": "PATH_INFO puudub.\nSinu server pole seadistatud seda teavet edastama.\nSee võib olla CGI-põhine ja ei toeta img_auth-i.\nVaata lehekülge https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "PATH_INFO puudub.\nSinu server pole seadistatud seda teavet edastama.\nSee võib olla CGI-põhine ja ei toeta img_auth-i.\nVaata lehekülge https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Soovitud salvestuskoht pole üleslaadimiskataloogi all.",
        "img-auth-badtitle": "Väljendist \"$1\" ei saa sobivat pealkirja moodustada.",
        "img-auth-nologinnWL": "Sa pole sisselogitud ja \"$1\" pole valges nimekirjas.",
        "pageswithprop-prophidden-long": "pika tekstiatribuudi väärtus peidetud ($1)",
        "pageswithprop-prophidden-binary": "kahendatribuudi väärtus peidetud ($1)",
        "doubleredirects": "Kahekordsed ümbersuunamised",
-       "doubleredirectstext": "Käesolev leht esitab loendi lehtedest, mis sisaldavad ümbersuunamisi teistele ümbersuunamislehtedele.\nIgal real on ära toodud esimene ja teine ümbersuunamisleht ning samuti teise ümbersuunamislehe sihtmärk, mis tavaliselt on esialgse ümbersuunamise tegelik siht, millele see otse osutama peakski.\n<del>Läbikriipsutatud</del> kirjed on kohendatud.",
-       "double-redirect-fixed-move": "[[$1]] on teisaldatud, see suunab nüüd leheküljele [[$2]].",
-       "double-redirect-fixed-maintenance": "Parandatakse kahekordne suunamine leheküljelt [[$1]] leheküljele [[$2]].",
+       "doubleredirectstext": "See lehekülg loetleb leheküljed, mis on ümber suunatud teistele ümbersuunamislehekülgedel.\nIgal real on toodud esimene ja teine ümbersuunamislehekülg ning samuti lehekülg, kuhu teine ümbersuunamislehekülg on suunatud ja kuhu tavaliselt ka esimene ümbersuunamislehekülg tegelikult peaks suunama.\n<del>Läbikriipsutatud</del> kirjed on kohendatud.",
+       "double-redirect-fixed-move": "[[$1]] on teisaldatud.\nLehekülg uuendati automaatselt ja see suunab nüüd leheküljele [[$2]].",
+       "double-redirect-fixed-maintenance": "Hooldustöö käigus parandati automaatselt kahekordne suunamine leheküljelt [[$1]] leheküljele [[$2]].",
        "double-redirect-fixer": "Ümbersuunamiste parandaja",
        "brokenredirects": "Vigased ümbersuunamised",
        "brokenredirectstext": "Järgmised leheküljed on ümber suunatud olematutele lehekülgedele:",
        "log-title-wildcard": "Selle tekstiga algavad pealkirjad",
        "showhideselectedlogentries": "Muuda valitud logisissekannete nähtavust",
        "allpages": "Kõik leheküljed",
-       "alphaindexline": "$1 kuni $2",
        "nextpage": "Järgmine lehekülg ($1)",
        "prevpage": "Eelmine lehekülg ($1)",
        "allpagesfrom": "Näita lehti alates pealkirjast:",
        "mailnologin": "Saatja aadress puudub",
        "mailnologintext": "Pead olema [[Special:UserLogin|sisse logitud]] ja sul peab [[Special:Preferences|eelistustes]] olema kehtiv e-posti aadress, et saata teistele kasutajatele e-kirju.",
        "emailuser": "Saada sellele kasutajale e-kiri",
-       "emailuser-title-target": "Sellele {{GENDER:$1|kasutajale}} e-kirja saatmine",
+       "emailuser-title-target": "{{GENDER:$1|Kasutajale}} e-kirja saatmine",
        "emailuser-title-notarget": "Kasutajale e-kirja saatmine",
        "emailpage": "Saada kasutajale e-kiri",
        "emailpagetext": "Alloleva vormi kaudu saad sellele {{GENDER:$1|kasutajale}} e-kirja saata. Et kasutaja saaks vastata, täidetakse kirja saatja väli e-posti aadressiga, mille oled sisestanud [[Special:Preferences|oma eelistuste leheküljel]].",
        "watchnologin": "Ei ole sisse logitud",
        "addwatch": "Lisa jälgimisloendisse",
        "addedwatchtext": "Lehekülg \"[[:$1]]\" on lisatud sinu [[Special:Watchlist|jälgimisloendisse]].\nEdasised muudatused sellel leheküljel ja seotud aruteluleheküljel tuuakse ära jälgimisloendis.",
+       "addedwatchtext-short": "Lehekülg \"$1\" on lisatud sinu jälgimisloendisse.",
        "removewatch": "Eemalda jälgimisloendist",
        "removedwatchtext": "Lehekülg \"[[:$1]]\" on [[Special:Watchlist|jälgimisloendist]] eemaldatud.",
+       "removedwatchtext-short": "Lehekülg \"$1\" on eemaldatud sinu jälgimisloendist.",
        "watch": "Jälgi",
        "watchthispage": "Jälgi seda lehekülge",
        "unwatch": "Lõpeta jälgimine",
        "unwatchthispage": "Ära jälgi",
-       "notanarticle": "Pole artikkel",
+       "notanarticle": "Pole sisulehekülg",
        "notvisiblerev": "Redaktsioon on kustutatud",
        "watchlist-details": "Jälgimisloendis on {{PLURAL:$1|üks lehekülg|$1 lehekülge}}. Arutelulehekülgi pole eraldi välja toodud.",
        "wlheader-enotif": "E-posti teel teavitamine on lubatud.",
        "wlheader-showupdated": "Leheküljed, mida on muudetud peale sinu viimast külastust, on '''rasvases kirjas'''.",
-       "watchmethod-recent": "jälgitud lehekülgedel tehtud viimaste muudatuste läbivaatamine",
-       "watchmethod-list": "jälgitavate lehekülgede viimased muudatused",
-       "watchlistcontains": "Sinu jälgimisloendis on $1 {{PLURAL:$1|lehekülg|lehekülge}}.",
-       "iteminvalidname": "Probleem üksusega '$1'. Selle nimes on viga.",
        "wlnote2": "Allpool on viimase {{PLURAL:$1|tunni|<strong>$1</strong> tunni}} jooksul tehtud muudatused seisuga $2, $3.",
        "wlshowlast": "Näita viimast $1 tundi $2 päeva. $3",
        "watchlist-options": "Jälgimisloendi seaded",
        "enotif_lastvisited": "Kõigi sinu viimase külastuse järel tehtud muudatuste nägemiseks vaata: $1.",
        "enotif_lastdiff": "Muudatus on leheküljel $1.",
        "enotif_anon_editor": "anonüümne kasutaja $1",
-       "enotif_body": "Lugupeetud $WATCHINGUSERNAME\n\n$PAGEINTRO $NEWPAGE\n\nRedigeerija resümee: $PAGESUMMARY $PAGEMINOREDIT\n\nRedigeerijaga ühenduse võtmine:\ne-post: $PAGEEDITOR_EMAIL\nviki: $PAGEEDITOR_WIKI\n\nSeni kuni sa sisselogituna seda lehekülge ei külasta, selle leheküljega seotud toimingute kohta sulle uusi teavituse e-kirju ei saadeta. Jälgimisloendis saaksid kõigi jälgitavate lehekülgedega seotud teavitussätted ka lähtestada.\n\nAbivalmilt\n{{GRAMMAR:genitive|{{SITENAME}}}} teavitussüsteem\n\n--\nE-kirjatsi saabuvate teavituste sätteid saad muuta leheküljel\n{{canonicalurl:{{#special:Preferences}}}}.\n\nOma jälgimisloendi sätete muutmiseks mine leheküljele\n{{canonicalurl:Special:Watchlist/edit}}.\n\nLehekülje kustutamiseks jälgimisloendist mine leheküljele $UNWATCHURL.\n\nTagasiside ja abi:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Lugupeetud $WATCHINGUSERNAME\n\n$PAGEINTRO $NEWPAGE\n\nRedigeerija resümee: $PAGESUMMARY $PAGEMINOREDIT\n\nRedigeerijaga ühenduse võtmine:\ne-post: $PAGEEDITOR_EMAIL\nviki: $PAGEEDITOR_WIKI\n\nSeni kuni sa sisselogituna seda lehekülge ei külasta, selle leheküljega seotud toimingute kohta sulle uusi teavituse e-kirju ei saadeta. Jälgimisloendis saaksid kõigi jälgitavate lehekülgedega seotud teavitussätted ka lähtestada.\n\nAbivalmilt\n{{GRAMMAR:genitive|{{SITENAME}}}} teavitussüsteem\n\n--\nE-kirjatsi saabuvate teavituste sätteid saad muuta leheküljel\n{{canonicalurl:{{#special:Preferences}}}}.\n\nOma jälgimisloendi sätete muutmiseks mine leheküljele\n{{canonicalurl:Special:Watchlist/edit}}.\n\nLehekülje kustutamiseks jälgimisloendist mine leheküljele $UNWATCHURL.\n\nTagasiside ja abi:\n$HELPPAGE",
        "created": "loonud lehekülje",
        "changed": "muutnud lehekülge",
        "deletepage": "Kustuta lehekülg",
        "blockip": "Kasutaja blokeerimine",
        "blockip-legend": "Kasutaja blokeerimine",
        "blockiptext": "See vorm on kindla IP-aadressi või kasutajanime kirjutamisõiguste blokeerimiseks.\nSeda tohib teha ainult vandalismi vältimiseks ja kooskõlas [[{{MediaWiki:Policy-url}}|{{GRAMMAR:genitive|{{SITENAME}}}} sisekorraga]].\nTäida ka põhjuse väli, näiteks viidates lehekülgedele, mis rikuti.",
-       "ipadressorusername": "IP-aadress või kasutajanimi:",
+       "ipaddressorusername": "IP-aadress või kasutajanimi:",
        "ipbexpiry": "Kehtivus:",
        "ipbreason": "Põhjus:",
        "ipbreason-dropdown": "*Tavalised blokeerimise põhjused\n** Valeandmete lisamine\n** Lehekülgedelt sisu kustutamine\n** Välislinkide rämpspostitus\n** Sodimine\n** Hirmutav käitumine/ahistamine\n** Mitme konto väärkasutus\n** Lubamatu kasutajanimi",
        "blocklist-params": "Blokeerimissätted",
        "blocklist-reason": "Põhjus",
        "ipblocklist-submit": "Otsi",
-       "ipblocklist-localblock": "Kohalikud blokeeringud",
+       "ipblocklist-localblock": "Kohalik blokeering",
        "ipblocklist-otherblocks": "{{PLURAL:$1|Muu blokeering|Muud blokeeringud}}",
        "infiniteblock": "igavene",
        "expiringblock": "aegub $1 $2",
        "ipb_hide_invalid": "Seda kontot ei saa varjata, sest sellega on tehtud üle {{PLURAL:$1|ühe|$1}} muudatuse.",
        "ipb_already_blocked": "\"$1\" on juba blokeeritud.",
        "ipb-needreblock": "$1 on juba blokeeritud.\nKas soovid muuta blokeeringu sätteid?",
-       "ipb-otherblocks-header": "{{PLURAL:$1|Teine blokeering|Teised blokeeringud}}",
+       "ipb-otherblocks-header": "{{PLURAL:$1|Muu blokeering|Muud blokeeringud}}",
        "unblock-hideuser": "Selle kasutaja blokeeringut ei saa eemaldada, sest tema kasutajanimi on peidetud.",
        "ipb_cant_unblock": "Tõrge: Blokeerimis-ID $1 pole leitav.\nBlokeering võib juba eemaldatud olla.",
        "ipb_blocked_as_range": "Tõrge: IP-aadressi $1 pole eraldi blokeeritud ja blokeeringut ei saa eemaldada.\nSee kuulub aga blokeeritud IP-vahemikku $2, mille blokeeringut saab eemaldada.",
        "movepagetalktext": "Koos artiklileheküljega teisaldatakse automaatselt ka arutelulehekülg, '''välja arvatud juhtudel, kui:'''\n*uue pealkirja all on juba arutelulehekülg, mis pole tühi;\n*jätad alloleva märkeruudu valimata.\n\nNeil juhtudel saad lehekülje soovi korral käsitsi teisaldada või liita.",
        "movearticle": "Teisalda lehekülg",
        "moveuserpage-warning": "'''Hoiatus:''' Oled teisaldamas kasutajalehekülge. Pane tähele, et teisaldatakse ainult lehekülg ja kasutajat '''ei''' nimetata ümber.",
+       "movecategorypage-warning": "<strong>Hoiatus:</strong> Oled teisaldamas kategoorialehekülge. Pane palun tähele, et teisaldatakse vaid see lehekülg ja ühtegi vanas kategoorias sisalduvat lehekülge <em>ei</em> kategoriseerita ümber uude kategooriasse.",
        "movenologintext": "Lehekülje teisaldamiseks pead registreeruma ja [[Special:UserLogin|sisse logima]].",
        "movenotallowed": "Sul ei ole lehekülgede teisaldamise õigust.",
        "movenotallowedfile": "Sul ei ole failide teisaldamise õigust.",
        "cant-move-user-page": "Sul ei ole õigust teisaldada kasutajalehti (erandiks on kasutajate alamlehed).",
        "cant-move-to-user-page": "Sul ei ole õigust teisaldada lehekülge kasutajaleheks (ei käi kasutaja alamlehe kohta).",
+       "cant-move-category-page": "Sul pole õigust kategoorialehekülgi teisaldada.",
+       "cant-move-to-category-page": "Sul pole õigust teisaldada lehekülge kategoorialeheküljele.",
        "newtitle": "Uue pealkirja alla:",
-       "move-watch": "Jälgi seda lehekülge",
+       "move-watch": "Jälgi lähte- ja sihtlehekülge",
        "movepagebtn": "Teisalda lehekülg",
        "pagemovedsub": "Lehekülg on teisaldatud",
        "movepage-moved": "'''\"$1\" teisaldatud pealkirja \"$2\" alla'''",
        "movepage-moved-noredirect": "Ümbersuunamist ei loodud.",
        "articleexists": "Selle nimega artikkel on juba olemas või pole valitud nimi lubatav. Palun valige uus nimi.",
        "cantmove-titleprotected": "Lehte ei saa sinna teisaldada, sest uus pealkiri on artikli loomise eest kaitstud",
-       "movetalk": "Teisalda ka \"arutelu\", kui saab.",
+       "movetalk": "Teisalda seonduv arutelulehekülg",
        "move-subpages": "Teisalda alamleheküljed (kuni $1)",
        "move-talk-subpages": "Teisalda arutelulehekülje alamleheküljed (kuni $1)",
        "movepage-page-exists": "Lehekülg $1 on juba olemas ja seda ei saa automaatselt üle kirjutada.",
        "imagenocrossnamespace": "Faili ei saa teisaldada mõnda muusse nimeruumi.",
        "nonfile-cannot-move-to-file": "Failinimeruumi saab ainult faile teisaldada.",
        "imagetypemismatch": "Uus faililaiend ei sobi selle tüübiga",
-       "imageinvalidfilename": "Sihtmärgi nimi on vigane",
+       "imageinvalidfilename": "Failinimi on vigane",
        "fix-double-redirects": "Värskenda kõik siia viitavad ümbersuunamislehed uuele pealkirjale",
        "move-leave-redirect": "Jäta maha ümbersuunamisleht",
        "protectedpagemovewarning": "'''Hoiatus:''' See lehekülg on nii lukustatud, et ainult administraatori õigustega kasutajad saavad seda teisaldada.\nAllpool on toodud uusim logisissekanne:",
        "import-comment": "Kommentaar:",
        "importtext": "Palun kasuta faili allikvikist eksportimiseks [[Special:Export|ekspordivahendit]].\nSalvesta see oma arvutisse ja laadi siia üles.",
        "importstart": "Lehekülgede importimine...",
-       "import-revision-count": "$1 {{PLURAL:$1|versioon|versiooni}}",
+       "import-revision-count": "$1 {{PLURAL:$1|redaktsioon|redaktsiooni}}",
        "importnopages": "Ei olnud imporditavaid lehekülgi.",
        "imported-log-entries": "Imporditi $1 {{PLURAL:$1|logisissekanne|logisissekannet}}.",
        "importfailed": "Importimine ebaõnnestus: <nowiki>$1</nowiki>",
        "tooltip-pt-mytalk": "Sinu arutelulehekülg",
        "tooltip-pt-anontalk": "Arutelu sellelt IP-aadressilt tehtud muudatuste kohta",
        "tooltip-pt-preferences": "Sinu eelistused",
-       "tooltip-pt-watchlist": "Lehekülgede loend, mille muudatusi jälgid",
+       "tooltip-pt-watchlist": "Loend lehekülgedest, mille muudatusi jälgid",
        "tooltip-pt-mycontris": "Sinu kaastööde loend",
        "tooltip-pt-login": "Me julgustame teid sisse logima, kuid see pole kohustuslik.",
        "tooltip-pt-logout": "Logi välja",
        "tooltip-t-specialpages": "Erilehekülgede loend",
        "tooltip-t-print": "Selle lehe trükiversioon",
        "tooltip-t-permalink": "Püsilink lehekülje sellele redaktsioonile",
-       "tooltip-ca-nstab-main": "Näita artiklit",
+       "tooltip-ca-nstab-main": "Vaata sisulehekülge",
        "tooltip-ca-nstab-user": "Näita kasutaja lehte",
        "tooltip-ca-nstab-media": "Näita pildi lehte",
        "tooltip-ca-nstab-special": "See on erilehekülg, sa ei saa seda lehekülge ennast redigeerida.",
        "tooltip-summary": "Kirjuta lühike kokkuvõte",
        "common.css": "/* Siin olevat CSS-i kasutavad kõik kujundused. */",
        "common.js": "/* Siinne JavaScript laaditakse igale kasutajatele igal laaditud leheküljel. */",
-       "notacceptable": "Viki server ei saa esitada andmeid formaadis, mida sinu veebiklient lugeda suudab.",
        "anonymous": "{{GRAMMAR:genitive|{{SITENAME}}}} {{PLURAL:$1|anonüümne kasutaja|anonüümsed kasutajad}}",
        "siteuser": "{{GRAMMAR:genitive|{{SITENAME}}}} kasutaja $1",
        "anonuser": "{{GRAMMAR:genitive|{{SITENAME}}}} anonüümne kasutaja $1",
        "pageinfo-category-pages": "Lehekülgede arv",
        "pageinfo-category-subcats": "Alamkategooriate arv",
        "pageinfo-category-files": "Failide arv",
-       "skinname-cologneblue": "Kölni sinine",
        "skinname-monobook": "MonoBook",
-       "skinname-modern": "Uudne",
        "skinname-vector": "Vektor",
-       "markaspatrolleddiff": "Märgi kui kontrollitud",
+       "markaspatrolleddiff": "Märgi kontrollituks",
        "markaspatrolledtext": "Märgi see leht kontrollituks",
        "markedaspatrolled": "Kontrollituks märgitud",
        "markedaspatrolledtext": "Valitud redaktsioon leheküljel [[:$1]] on kontrollituks märgitud.",
        "rcpatroldisabledtext": "Viimaste muudatuste kontrolli tunnus ei toimi hetkel.",
        "markedaspatrollederror": "Ei saa kontrollituks märkida",
        "markedaspatrollederrortext": "Vajalik on määrata, milline versioon märkida kontrollituks.",
-       "markedaspatrollederror-noautopatrol": "Enda muudatusi ei saa kontrollituks märkida.",
+       "markedaspatrollederror-noautopatrol": "Sul pole lubatud enda muudatusi kontrollituks märkida.",
        "markedaspatrollednotify": "See muudatus leheküljel $1 on märgitud kontrollituks.",
        "markedaspatrollederrornotify": "Kontrollituks märkimine ebaõnnestus.",
        "patrol-log-page": "Kontrollimislogi",
        "filedelete-old-unregistered": "Etteantud failiversiooni \"$1\" pole andmebaasis.",
        "filedelete-current-unregistered": "Fail \"$1\" ei ole andmebaasis.",
        "filedelete-archive-read-only": "Arhiivikataloogi \"$1\" kirjutamine ebaõnnestus.",
-       "previousdiff": "← Eelmised erinevused",
-       "nextdiff": "Järgmised erinevused →",
+       "previousdiff": "← Vanem muudatus",
+       "nextdiff": "Uuem muudatus →",
        "mediawarning": "'''Hoiatus''': See failitüüp võib sisaldada pahatahtlikku koodi.\nSelle avamine võib su arvutit kahjustada.",
        "imagemaxsize": "Pildi suuruse ülemmäär:<br />''(faili kirjeldusleheküljel)''",
        "thumbsize": "Pisipildi suurus:",
        "newimages-summary": "Sellel erilehel on viimati üles laaditud failid.",
        "newimages-legend": "Filter",
        "newimages-label": "Failinimi (või selle osa):",
-       "showhidebots": "($1 robotite kaastööd)",
+       "newimages-showbots": "Näita robotite üles laaditud faile",
        "noimages": "Uusi pilte ei ole.",
        "ilsubmit": "Otsi",
        "bydate": "kuupäeva järgi",
        "exif-contrast-1": "Nõrk",
        "exif-contrast-2": "Tugev",
        "exif-saturation-0": "Normaalne",
-       "exif-saturation-1": "Madal värviküllastus",
-       "exif-saturation-2": "Kõrge värviküllastus",
+       "exif-saturation-1": "Vähene värviküllastus",
+       "exif-saturation-2": "Suur värviküllastus",
        "exif-sharpness-0": "Normaalne",
        "exif-sharpness-1": "Nõrk",
        "exif-sharpness-2": "Tugev",
        "confirm-watch-top": "Kas lisad selle lehekülje oma jälgimisloendisse?",
        "confirm-unwatch-button": "Sobib",
        "confirm-unwatch-top": "Kas eemaldad selle lehekülje oma jälgimisloendist?",
+       "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← eelmine lehekülg",
        "imgmultipagenext": "järgmine lehekülg →",
        "imgmultigo": "Mine!",
        "autosumm-replace": "Lehekülg asendatud tekstiga '$1'",
        "autoredircomment": "Ümbersuunamine lehele [[$1]]",
        "autosumm-new": "Uus lehekülg: '$1'",
-       "livepreview-loading": "Laadimine...",
-       "livepreview-ready": "Laadimisel... Valmis!",
-       "livepreview-failed": "Elav eelvaade ebaõnnestus! Proovi normaalset eelvaadet.",
-       "livepreview-error": "Ühendus ebaõnnestus: $1 \"$2\".\nProovi tavalist eelvaadet.",
        "lag-warn-normal": "Viimase {{PLURAL:$1|ühe sekundi|$1 sekundi}} jooksul tehtud muudatused ei pruugi selles loendis näha olla.",
        "lag-warn-high": "Andmebaasiserveri töö viivituste tõttu ei pruugi viimase {{PLURAL:$1|ühe sekundi|$1 sekundi}} jooksul tehtud muudatused selles loendis näha olla.",
-       "watchlistedit-numitems": "Sinu jälgimisloendis on {{PLURAL:$1|üks lehekülg|$1 lehekülge}}, aruteluleheküljed välja arvatud.",
-       "watchlistedit-noitems": "Sinu jälgimisloend ei sisalda ühtegi lehekülge.",
        "watchlistedit-normal-title": "Jälgimisloendi redigeerimine",
        "watchlistedit-normal-legend": "Jälgimisloendist lehtede eemaldamine",
        "watchlistedit-normal-explain": "Need lehed on sinu jälgimisloendis.\nJälgimisloendist lehtekülgede eemaldamiseks tee vastava lehekülje ees olevasse kastikesse linnuke ja klõpsa nuppu \"{{int:Watchlistedit-normal-submit}}\". Saad ka jälgimisloendi [[Special:EditWatchlist/raw|algandmeid muuta]].",
        "watchlistedit-raw-done": "Sinu jälgimisloend on uuendatud.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 lehekülg|$1 lehekülge}} lisatud:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 pealkiri|$1 pealkirja}} eemaldati:",
+       "watchlistedit-clear-title": "Tühjendatud jälgimisloend",
+       "watchlistedit-clear-legend": "Jälgimisloendi tühjendamine",
+       "watchlistedit-clear-explain": "Sinu jälgimisloendist eemaldatakse kõik pealkirjad.",
+       "watchlistedit-clear-titles": "Pealkirjad:",
+       "watchlistedit-clear-submit": "Tühjenda jälgimisloend (jäädavalt!)",
+       "watchlistedit-clear-done": "Sinu jälgimisloend on tühjendatud.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|Üks pealkiri|$1 pealkirja}} eemaldati:",
+       "watchlistedit-too-many": "Pealkirju on siin kuvamiseks liiga palju.",
+       "watchlisttools-clear": "Tühjenda jälgimisloend",
        "watchlisttools-view": "Näita vastavaid muudatusi",
        "watchlisttools-edit": "Vaata ja redigeeri jälgimisloendit",
        "watchlisttools-raw": "Muuda lähteteksti",
        "redirect-not-exists": "Väärtust ei leitud",
        "fileduplicatesearch": "Faili duplikaatide otsimine",
        "fileduplicatesearch-summary": "Otsi duplikaatfaile nende räsiväärtuse järgi.",
-       "fileduplicatesearch-legend": "Otsi faili duplikaati",
+       "fileduplicatesearch-legend": "Duplikaadi otsimine",
        "fileduplicatesearch-filename": "Faili nimi:",
        "fileduplicatesearch-submit": "Otsi",
        "fileduplicatesearch-info": "$1 × $2 pikslit<br />Faili suurus: $3<br />MIME-tüüp: $4",
        "fileduplicatesearch-result-n": "Failil \"$1\" on {{PLURAL:$2|1 samane duplikaat|$2 samast duplikaati}}.",
        "fileduplicatesearch-noresults": "Faili nimega \"$1\" ei leidu.",
        "specialpages": "Erileheküljed",
+       "specialpages-note-top": "Seletus",
        "specialpages-note": "* Harilikud erileheküljed.\n* <span class=\"mw-specialpagerestricted\">Piiranguga erileheküljed.</span>",
        "specialpages-group-maintenance": "Hooldusaruanded",
        "specialpages-group-other": "Teised erileheküljed",
        "compare-invalid-title": "Valitud pealkiri on vigane.",
        "compare-title-not-exists": "Valitud pealkirja ei ole.",
        "compare-revision-not-exists": "Valitud redaktsiooni ei ole.",
-       "dberr-header": "Selles vikis on probleem",
        "dberr-problems": "Kahjuks on sellel saidil tehnilisi probleeme",
        "dberr-again": "Oota mõni hetk ja laadi lehekülg uuesti.",
        "dberr-info": "(Ei saa ühendust andmebaasi serveriga: $1)",
        "htmlform-float-invalid": "Määratud väärtus ei ole arvuline.",
        "htmlform-int-toolow": "Antud suurus on väiksem kui minimaalne $1",
        "htmlform-int-toohigh": "Antud suurus on suurem kui maksimaalne $1",
-       "htmlform-required": "See väärtus on nõutav",
+       "htmlform-required": "See väärtus on nõutav.",
        "htmlform-submit": "Saada",
        "htmlform-reset": "Tühista muudatused",
        "htmlform-selectorother-other": "Muu",
        "htmlform-no": "Ei",
        "htmlform-yes": "Jah",
        "htmlform-chosen-placeholder": "Vali säte",
+       "htmlform-cloner-create": "Lisa veel",
+       "htmlform-cloner-delete": "Eemalda",
+       "htmlform-cloner-required": "Vähemalt üks väärtus on nõutav.",
        "sqlite-has-fts": "$1 koos täistekstiotsingu toega",
        "sqlite-no-fts": "$1 ilma täistekstiotsingu toeta",
        "logentry-delete-delete": "$1 {{GENDER:$2|kustutas}} lehekülje $3",
index e48cb7e..d4b7d19 100644 (file)
@@ -17,7 +17,9 @@
                        "Urhixidur",
                        "Xabier Armendaritz",
                        "לערי ריינהארט",
-                       "පසිඳු කාවින්ද"
+                       "පසිඳු කාවින්ද",
+                       "아라",
+                       "Joxemai"
                ]
        },
        "tog-underline": "Loturak azpimarratu:",
@@ -30,7 +32,6 @@
        "tog-showtoolbar": "Aldaketen tresna-barra erakutsi",
        "tog-editondblclick": "Klik bikoitzaren bitartez orrialdeak aldatu",
        "tog-editsectiononrightclick": "Atalen izenburuetan eskuin klik eginez aldatzea gaitu",
-       "tog-rememberpassword": "Nire saioa ordenagailu honetan gorde ({{PLURAL:$1|egun baterako| $1 egunerako}} gehienez)",
        "tog-watchcreations": "Sortzen ditudan orrialdeak eta fitxategiak nire jarraipen-zerrendara gehitu",
        "tog-watchdefault": "Aldatzen ditudan orrialdeak eta fitxategiak nire jarraipen-zerrendara gehitu",
        "tog-watchmoves": "Izena aldatutako orrialdeak eta fitxategiak jarraipen-zerrendara gehitu",
        "searchbutton": "Bilatu",
        "go": "Joan",
        "searcharticle": "Joan",
-       "history": "Orrialdearen historia",
+       "history": "Orriaren historia",
        "history_short": "Historia",
        "updatedmarker": "nire azkeneko bisitaz geroztik eguneratuta",
        "printableversion": "Inprimatzeko bertsioa",
        "pool-timeout": "Lock-a itxoiten denbora amaitu da",
        "pool-queuefull": "Prozesuen zerrenda beteta dago",
        "pool-errorunknown": "Errore ezezaguna",
-       "aboutsite": "{{SITENAME}}(e)ri buruz",
+       "aboutsite": "{{SITENAME}} guneari buruz",
        "aboutpage": "Project:Honi_buruz",
        "copyright": "Eduki guztia $1(r)en babespean dago, ez bada kontrakoa esaten.",
        "copyrightpage": "{{ns:project}}:Eskubideak",
        "readonly_lag": "Datu-basea automatikoki blokeatu da, menpeko zerbitzariak nagusiarekin sinkronizatu bitartean",
        "internalerror": "Barne errorea",
        "internalerror_info": "Barne errorea: $1",
-       "fileappenderrorread": "Ezin izan da \"$1\" irakurri, gehitzean.",
-       "fileappenderror": "Ezin da gehitu \"$1\" \"$2\"(e)ra.",
        "filecopyerror": "Ezin izan da \"$1\" fitxategia \"$2\"(e)ra kopiatu.",
        "filerenameerror": "Ezin izan zaio \"$1\" fitxategiari \"$2\" izen berria eman.",
        "filedeleteerror": "Ezin izan da \"$1\" fitxategia ezabatu.",
        "directorycreateerror": "Ezin izan da \"$1\" karpeta sortu.",
        "filenotfound": "Ezin izan da \"$1\" fitxategia aurkitu.",
-       "fileexistserror": "Ezin da \"$1\" fitxategian idatzi: lehendik existitzen da",
        "unexpected": "Espero ez zen balioa: \"$1\"=\"$2\".",
        "formerror": "Errorea: ezin izan da formularioa bidali",
        "badarticleerror": "Ekintza hori ezin da orri honetan egin.",
        "userlogin-resetpassword-link": "Zure pasahitza ahaztu duzu?",
        "userlogin-loggedin": "Dagoeneko izena emana zaude {{GENDER:$1|$1}}.\nBeheko formularioa erabil ezazu beste erabiltzaile baten izenean sartzeko.",
        "userlogin-createanother": "Beste kontu bat sortu",
-       "createacct-join": "Sartu zure informazioa azpian.",
-       "createacct-another-join": "Sartu kontu berriaren informazioa azpian.",
        "createacct-emailrequired": "E-posta helbidea",
        "createacct-emailoptional": "E-posta helbidea (hautazkoa)",
        "createacct-email-ph": "Sartu zure e-posta helbidea",
        "loginlanguagelabel": "Hizkuntza: $1",
        "suspicious-userlogout": "Saioa amaitzeko egin duzun eskaria ukatu da. Izan ere, ematen du eskari hori gaizki dabilen nabigatzaile edo cache proxy batek bidali duela.",
        "createacct-another-realname-tip": "Benetako izena hautazkoa da.\nEmatea erabakitzen baduzu hori erabiliko da lanaren atribuzioa egiterako garaian.",
+       "pt-createaccount": "Sortu kontua",
+       "pt-userlogout": "Saioa itxi",
        "php-mail-error-unknown": "PHPren mail() funtzioan arazo ezezagun bat egon da.",
        "user-mail-no-addy": "E-posta bidaltzen saiatu zara e-posta helbiderik gabe.",
        "user-mail-no-body": "E-posta bidaltzen saiatu zara testu gorputzik gabe edo laburregiarekin.",
        "changepassword": "Pasahitza aldatu",
-       "resetpass_announce": "E-postaz jasotako kode tenporal baten bidez saioa hasi duzu. Saioa hasierarekin jarraitzeko, pasahitz berri bat definitu beharra daukazu:",
+       "resetpass_announce": "Sartu ahal izateko, pasahitz berria ezarri behar duzu.",
        "resetpass_text": "<!-- Testua hemen idatzi -->",
        "resetpass_header": "Pasahitza aldatu",
        "oldpassword": "Pasahitz zaharra:",
        "retypenew": "Pasahitz berria berriz idatzi:",
        "resetpass_submit": "Pasahitza definitu eta saioa hasi",
        "changepassword-success": "Zure pasahitza ondo aldatu da!",
+       "changepassword-throttled": "Saioa hasteko saiakera gehiegi egin berri dituzu.\nBerriro saiatu aurretik $1 itxoin, mesedez.",
        "resetpass_forbidden": "Ezin dira pasahitzak aldatu",
        "resetpass-no-info": "Orrialde honetara zuzenean sartzeko izena eman behar duzu.",
        "resetpass-submit-loggedin": "Pasahitza aldatu",
        "resetpass-submit-cancel": "Utzi",
        "resetpass-wrong-oldpass": "Behin-behineko edo oraintxuko pasahitza ez da baliagarria.\nAgian dagoeneko ondo aldatu duzu zure pasahitza edo behin-behineko pasahitza bat eskatu duzu.",
+       "resetpass-recycled": "Mesedez berritu zure pasahitza.",
        "resetpass-temp-password": "Behin-behineko pasahitza:",
        "resetpass-abort-generic": "Estentsio batek pasahitza aldatzea ekidin du.",
+       "resetpass-expired": "Zure pasahitza iraungitu da. Sartzeko, pasahitz berria ezarri, mesedez.",
        "passwordreset": "Pasahitzaren berrezarpena",
        "passwordreset-text-one": "Bete formulario hau zure pasahitza berrezartzeko.",
        "passwordreset-text-many": "{{PLURAL:$1|Sartu datuetako bat zure pasahitza berrezartzeko.}}",
        "savearticle": "Gorde orria",
        "preview": "Aurrebista erakutsi",
        "showpreview": "Aurrebista erakutsi",
-       "showlivepreview": "Zuzeneko aurrebista",
        "showdiff": "Aldaketak erakutsi",
        "anoneditwarning": "'''Oharra:''' Ez duzu saioa hasi. Zure IP helbidea orrialde honetako historian gordeko da.",
        "anonpreviewwarning": "''Ez duzu saioa hasi. Gordez gero, zure IP helbidea grabatuko da orri honen edizio historian.''",
        "token_suffix_mismatch": "'''Zure aldaketa ezeztatua izan da zure bezeroak puntuazio-karaktereak itxuragabetu dituelako.\nAldaketa ezeztatua izan da testuaren galtzea galarazteko.\nHau batzuetan gertatzen da buggyan oinarritutako web proxy zerbitzua erabiltzean.'''",
        "edit_form_incomplete": "'''Aldaketa formularioaren atal batzuk ez dira iritsi zerbitzarira; bi aldiz ziurtatu zure aldaketak osorik daudela eta berriro saiatu.'''",
        "editing": "«$1» aldatzen",
-       "creating": "$1 sortzen",
+       "creating": "«$1» sortzen",
        "editingsection": "«$1» aldatzen (atala)",
        "editingcomment": "«$1» aldatzen (atal berria)",
        "editconflict": "Aldaketa gatazka: $1",
        "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": "Zure aldaketa gorde da.",
+       "postedit-confirmation-saved": "Zure aldaketa gorde da.",
        "edit-already-exists": "Ezin izan da orri berria sortu.\nJada existitzen da.",
        "defaultmessagetext": "Testu lehenetsia",
        "content-failed-to-parse": "Ezin izan da $2(r)en edukia parseatu $1 modeloarentzat: $3",
        "revdelete-hide-user": "Egilearen erabiltzaile izena/IPa ezkutatu",
        "revdelete-hide-restricted": "Mugapen hauek administratzaileei zein besteei aplikatu",
        "revdelete-radio-same": "(ez aldatu)",
-       "revdelete-radio-set": "Izkutua",
+       "revdelete-radio-set": "Ezkutua",
        "revdelete-radio-unset": "Ikusgarria",
        "revdelete-suppress": "Administratzaileen eta bestelakoen datuak kendu",
        "revdelete-unsuppress": "Berrezarritako aldaketen mugak kendu",
        "pagemerge-logentry": "[[$1]] [[$2]](r)ekin batu da ($3(e)raino berrikuspenak)",
        "revertmerge": "Bereiztu",
        "mergelogpagetext": "Jarraian dagoen zerrendak orrialde baten historiatik beste batera egindako azken bateratzeak erakusten ditu.",
-       "history-title": "«$1» orrialdearen historia berrikuspena",
+       "history-title": "«$1» orriaren historia berrikuspena",
        "difference-title": "«$1»: berrikuspenen arteko aldeak",
        "difference-title-multipage": "«$1» eta «$2» orrien arteko aldeak",
        "difference-multipage": "(Orrien arteko aldeak)",
        "searchmenu-exists": "'''«[[:$1]]» izena duen orri bat bada wiki honetan.''' {{PLURAL:$2|0=|Ikus, gainera, aurkitutako beste bilaketa emaitzak.}}",
        "searchmenu-new": "'''Sortu «[[:$1]]» orria wiki honetan!''' {{PLURAL:$2|0=|Ikus, gainera, zure bilaketarekin aurkitutako orria.|Ikus, gainera, bilaketaren emaitzak.}}",
        "searchprofile-articles": "Eduki-orriak",
-       "searchprofile-project": "Laguntza eta Proiektu-orriak",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Guztia",
        "searchprofile-advanced": "Aurreratua",
        "searchprofile-articles-tooltip": "$1(e)n bilatu",
-       "searchprofile-project-tooltip": "$1(e)n bilatu",
        "searchprofile-images-tooltip": "Fitxategiak bilatu",
        "searchprofile-everything-tooltip": "Bilatu eduki guztian (lankide orrialdeak barne)",
        "searchprofile-advanced-tooltip": "Lankideen izen zehatzetan bilatu",
        "search-nonefound": "Ez dago eskaerarekin bat egiten duten emaitzarik.",
        "powersearch-legend": "Bilaketa aurreratua",
        "powersearch-ns": "Bilatu honako izen-tartetan:",
-       "powersearch-redir": "Birzuzenketen zerrenda",
        "powersearch-togglelabel": "Egiaztatu:",
        "powersearch-toggleall": "Guztiak",
        "powersearch-togglenone": "Bat ere ez",
        "prefs-emailconfirm-label": "E-posta baieztapena:",
        "youremail": "E-posta:",
        "username": "{{GENDER:$1|Erabiltzaile izena}}:",
-       "uid": "{{GENDER:$1|Erabiltzaile}} zenbakia:",
        "prefs-memberingroups": "{{PLURAL:$1|Taldeko|taldeetako}} {{GENDER:$2|kidea}}:",
        "prefs-registration": "Erregistratzeko unea:",
        "yourrealname": "Benetako izena:",
        "prefs-advancedsearchoptions": "Aukera aurreratuak",
        "prefs-advancedwatchlist": "Aukera aurreratuak",
        "prefs-displayrc": "Aukerak erakutsi",
-       "prefs-displaysearchoptions": "Aukerak erakutsi",
        "prefs-displaywatchlist": "Aukerak erakutsi",
        "prefs-diffs": "Ezberdintasunak",
        "prefs-help-prefershttps": "Hobespen hauek eragina izango dute sartzen zaren hurrengoan.",
        "recentchanges-legend-heading": "'''Azalpenak:'''",
        "recentchanges-legend-newpage": "(ikus, gainera, [[Special:NewPages|orri berrien zerrenda]])",
        "rcnotefrom": "Jarraian azaltzen diren aldaketak data honetatik aurrerakoak dira: <b>$2</b> (gehienez <b>$1</b> erakusten dira).",
-       "rclistfrom": "Erakutsi $1 ondorengo aldaketa berriak",
+       "rclistfrom": "Erakutsi $3 $2 ondorengo aldaketa berriak",
        "rcshowhideminor": "$1 aldaketa txikiak",
        "rcshowhidebots": "$1 bot-ak",
        "rcshowhideliu": "$1 erabiltzaile erregistratuak",
        "uploadstash-errclear": "Fitxategiak ezabatzeak ez du arrakastarik izan.",
        "uploadstash-refresh": "Fitxategien zerrenda eguneratu",
        "img-auth-accessdenied": "Sarbide ukatua",
-       "img-auth-nopathinfo": "PATH_INFO falta da.\nZure zerbitzaria ez dago informazio hau pasatzeko konfiguratuta.\nCGI-oinarriduna izan daiteke, img_auth onartzen ez duena.\nIkusi https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "PATH_INFO falta da.\nZure zerbitzaria ez dago informazio hau pasatzeko konfiguratuta.\nCGI-oinarriduna izan daiteke, img_auth onartzen ez duena.\nIkusi https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Eskatutako bidea ez dago kofiguratutako igoera-direktorioan.",
        "img-auth-badtitle": "Ezin izan da baleko izenbururik eraiki \"$1\" izenetik abiatuta",
        "img-auth-nologinnWL": "Ez duzu saioa hasi eta \"$1\" ez dago zerrenda zurian.",
        "log-title-wildcard": "Testu honekin hasten diren izenburuak bilatu",
        "showhideselectedlogentries": "Erakutsi/ezkutatu aukeratutako log sarrerak",
        "allpages": "Orri guztiak",
-       "alphaindexline": "$1(e)tik $2(e)raino",
        "nextpage": "Hurrengo orrialdea ($1)",
        "prevpage": "Aurreko orrialdea ($1)",
        "allpagesfrom": "Erakutsi hasiera hau duten orriak:",
        "watchlist-details": "{{PLURAL:$1|Orrialde $1|$1 orrialde}} jarraitzen, eztabaida orrialdeak kontuan hartu gabe.",
        "wlheader-enotif": "Posta bidezko ohartarazpena gaituta dago.",
        "wlheader-showupdated": "Bisitatu zenituen azken alditik aldaketak izan dituzten orrialdeak '''beltzez''' nabarmenduta daude.",
-       "watchmethod-recent": "Aldaketa berriak aztertzen jarraipen zerrendako orrialdeen bila",
-       "watchmethod-list": "jarraipen zerrendako orrialdeak aldaketa berrien bila aztertzen",
-       "watchlistcontains": "Zure jarraipen zerrendak {{PLURAL:$1|orrialde $1 du|$1 orrialde ditu}}.",
-       "iteminvalidname": "Arazoa '$1' elementuarekin, baliogabeko izena...",
        "wlshowlast": "Erakutsi azken $1 orduak $2 egunak $3",
        "watchlist-options": "Jarraitze-zerrendaren aukerak",
        "watching": "Zerrendan gehitzen...",
        "enotif_lastvisited": "Jo $1 orrialdera zure azken bisitaz geroztik izandako aldaketa guztiak ikusteko.",
        "enotif_lastdiff": "Jo $1(e)ra aldaketa hau ikusteko.",
        "enotif_anon_editor": "$1 erabiltzaile anonimoa",
-       "enotif_body": "Kaixo $WATCHINGUSERNAME,\n\n{{SITENAME}}-(e)ko $PAGETITLE orrialdea $CHANGEDORCREATED egin da $PAGEEDITOR-(e)k une honetan: $PAGEEDITDATE, ikus $PAGETITLE_URL azken bertsiorako.\n\n$NEWPAGE\n\nEgilearen laburpena: $PAGESUMMARY $PAGEMINOREDIT\n\nEgilearekin harremanetan jarri:\nposta: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nEz dira oharpen gehiago bidaliko orrialde hau berriz bisitatzen ez baduzu.\nHorrez gain, orrialdeen oharpen konfigurazioa leheneratu dezakezu jarraipen zerrendatik.\n\n             Adeitasunez {{SITENAME}}(e)ko oharpen sistema\n\n--\nZure epostaren jakinarazpenen konfigurazioa aldatzeko, ikus\n{{canonicalurl:{{#special:Preferences}}}}\n\nZure jarraipen zerrendako konfigurazioa aldatzeko, ikus\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nOrrialdea zure jarraipen zerrendatik ezabatzeko, ikus\n$UNWATCHURL\n\nLaguntza:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Kaixo $WATCHINGUSERNAME,\n\n{{SITENAME}}-(e)ko $PAGETITLE orrialdea $CHANGEDORCREATED egin da $PAGEEDITOR-(e)k une honetan: $PAGEEDITDATE, ikus $PAGETITLE_URL azken bertsiorako.\n\n$NEWPAGE\n\nEgilearen laburpena: $PAGESUMMARY $PAGEMINOREDIT\n\nEgilearekin harremanetan jarri:\nposta: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nEz dira oharpen gehiago bidaliko orrialde hau berriz bisitatzen ez baduzu.\nHorrez gain, orrialdeen oharpen konfigurazioa leheneratu dezakezu jarraipen zerrendatik.\n\n             Adeitasunez {{SITENAME}}(e)ko oharpen sistema\n\n--\nZure epostaren jakinarazpenen konfigurazioa aldatzeko, ikus\n{{canonicalurl:{{#special:Preferences}}}}\n\nZure jarraipen zerrendako konfigurazioa aldatzeko, ikus\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nOrrialdea zure jarraipen zerrendatik ezabatzeko, ikus\n$UNWATCHURL\n\nLaguntza:\n$HELPPAGE",
        "created": "sortu",
        "changed": "aldatu",
        "deletepage": "Orrialdea ezabatu",
        "blockip": "Blokeatu erabiltzailea",
        "blockip-legend": "Blokeatu erabiltzailea",
        "blockiptext": "IP helbide edo erabiltzaile izen bati idazketa baimenak kentzeko beheko formularioa erabil dezakezu. Ekintza hau bandalismoa saihesteko baino ez da burutu behar, eta beti ere [[{{MediaWiki:Policy-url}}|politikak]] errespetatuz. Blokeoaren arrazoi bat ere zehaztu ezazu (adibidez, orrialde batzuk zehaztuz).",
-       "ipadressorusername": "IP Helbidea edo erabiltzaile izena",
+       "ipaddressorusername": "IP Helbidea edo erabiltzaile izena",
        "ipbexpiry": "Iraungipena",
        "ipbreason": "Arrazoia:",
        "ipbreason-dropdown": "*Blokeaketa arrazoi arruntak\n** Benetakoa ez den informazioa ezartzea\n** Orrialdetatik edukia ezabatzea\n** Spam-a edota kanpoko loturak ezarri\n** Bandalismoa egitea\n** Beste erabiltzaileei mehatxatzea\n** Kontu ugari erabiltzea\n** Erabiltzaile izen desegokia",
        "common.css": "/** Hemen idatzitako CSS kodeak itxura guztietan izango du eragina */",
        "monobook.css": "/* Hemen idatzitako CSS kodeak Monobook itxuran bakarrik izango du eragina */",
        "common.js": "/* Hemen idatzitako JavaScript kode oro erabiltzaile guztiek edozein orrialde irekitzerakoan kargatuko da. */",
-       "notacceptable": "Wiki zerbitzariak ezin ditu datuak zure bezeroak irakur ditzakeen formatu batean eskaini.",
        "anonymous": "{{SITENAME}}(e)ko lankide {{PLURAL:$1|anonimoa|anonimoak}}",
        "siteuser": "{{SITENAME}}(e)ko $1 erabiltzailea",
        "anonuser": "{{SITENAME}}-(e)ko $1 erabiltzaile anonimoa",
        "pageinfo-category-pages": "Orrialde kopurua",
        "pageinfo-category-subcats": "Azpikategorien zenbakia",
        "pageinfo-category-files": "Fitxategi kopurua",
-       "skinname-cologneblue": "Cologne Blue",
-       "skinname-modern": "Modernoa",
        "markaspatrolleddiff": "Patruilatutzat markatu",
        "markaspatrolledtext": "Artikulu hau patruilatutzat markatu",
        "markedaspatrolled": "Patruilatutzat markatu da",
        "newimages-summary": "Orrialde berezi honek igotako azkeneko fitxategiak erakusten ditu.",
        "newimages-legend": "Iragazkia",
        "newimages-label": "Fitxategia (edo bere zati bat):",
-       "showhidebots": "($1 bot-ak)",
        "noimages": "Ez dago ezer ikusteko.",
        "ilsubmit": "Bilatu",
        "bydate": "dataren arabera",
        "autosumm-replace": "Orriaren edukiaren ordez, «$1» jarri da",
        "autoredircomment": "[[$1]] orrialdera birzuzentzentzen",
        "autosumm-new": "Orria sortu da. Edukia: $1",
-       "livepreview-loading": "Kargatzen…",
-       "livepreview-ready": "Kargatzen… Prest!",
-       "livepreview-failed": "Huts egin du berehalako aurreikuspenak! Saiatu aurreikuspen normala erabiltzen.",
-       "livepreview-error": "Ezin izan da konektatu: $1 \"$2\". Saiatu aurreikuspen normala erabiltzen.",
        "lag-warn-normal": "{{PLURAL:$1|segundu $1|$1 segundu}} baino berriagoak diren aldaketak ez dira zerrenda honetan agertuko.",
        "lag-warn-high": "Zerbitzariaren atzerapen handia dela eta, {{PLURAL:$1|segundu $1|$1 segundu}} baino berriagoak diren aldaketak baliteke zerrenda honetan ez azaltzea.",
-       "watchlistedit-numitems": "Zure jarraipen zerrendak {{PLURAL:$1|titulu bat du|$1 titulu ditu}}, eztabaida orrialdeak kenduta.",
-       "watchlistedit-noitems": "Zure jarraitze-zerrendak ez du izenbururik.",
        "watchlistedit-normal-title": "Jarraitze zerrenda aldatu",
        "watchlistedit-normal-legend": "Jarraipen-zerrendatik izenburuak kendu",
        "watchlistedit-normal-explain": "Behean ageri dira zure jarraipen zerrendako izenburuak.\nIzenburu bat kentzeko, marka ezazu ondoan duen laukia, eta klika ezazu «{{int:Watchlistedit-normal-submit}}».\nNahiago baduzu, [[Special:EditWatchlist/raw|zerrenda soila edita dezakezu]].",
        "compare-invalid-title": "Zehaztutako izenburua ez dago zuzen.",
        "compare-title-not-exists": "Zehazturiko izenburua ez da existitzen.",
        "compare-revision-not-exists": "Zehazturiko berrikuspena ez da existitzen.",
-       "dberr-header": "Wiki honek arazo bat du",
        "dberr-problems": "Barkatu! Webgune honek zailtasun teknikoak jasaten ari da.",
        "dberr-again": "Saiatu pare bat minutu itxaroten edo kargatu ezazu orrialdea berriro.",
        "dberr-info": "($1: Ezin da datu-base zerbitzariarekin konektatu)",
index 000df53..46d5017 100644 (file)
@@ -5,7 +5,8 @@
                        "Kaganer",
                        "The Evil IP address",
                        "Urhixidur",
-                       "Xuacu"
+                       "Xuacu",
+                       "아라"
                ]
        },
        "tog-underline": "Surrayal atihus:",
@@ -18,7 +19,6 @@
        "tog-showtoolbar": "Muestral la barra d'eición (JavaScript)",
        "tog-editondblclick": "Eital páhinas haziendu dobri click (JavaScript)",
        "tog-editsectiononrightclick": "Premitil eital secionis pulsandu el botón de la derecha<br /> enus entítulus de secionis (JavaScript)",
-       "tog-rememberpassword": "Recordal la mi cuenta nesti ordinaol (for a maximum of $1 {{PLURAL:$1|day|days}})",
        "tog-watchcreations": "Vehilal las páhinas que yo crei",
        "tog-watchdefault": "Vehilal las páhinas qu'eiti",
        "tog-watchmoves": "Vehilal las páhinas que rellami",
        "filedeleteerror": "Nu se puei esborral el archivu \"$1\".",
        "directorycreateerror": "Nu se puei crial el diretoriu \"$1\".",
        "filenotfound": "Nu se puei alcuentral el archivu \"$1\".",
-       "fileexistserror": "Nu es posibri escrebil el archivu \"$1\": el archivu ya desisti",
        "unexpected": "Valol nu asperau: \"$1\"=\"$2\".",
        "formerror": "Marru: nu se puei envial el hormulariu",
        "badarticleerror": "Nu se puei realizal esta ación nesta páhina.",
        "savearticle": "Emburacal páhina",
        "preview": "Previsoreal",
        "showpreview": "Previsoreal",
-       "showlivepreview": "\"Live Preview\"",
        "showdiff": "Muestral chambus",
        "anoneditwarning": "'''Avisu:''' Nu t'alcuentras rustriu, razón pola que s'emburacará la tu IP nel estorial d'esta páhina.",
        "missingsummary": "'''Atención:''' Nu as escrebiu una síntesis al tentu la tu eición. Si pursas otra vezi sobri «{{int:savearticle}}» la tu eición s´emburacará sin él.",
        "showingresultsnum": "Embahu se {{PLURAL:$3|muestra '''1''' resurtau qu'esmiença|muestran'''$3''' resurtaus qu'esmiençan}} pol #'''$2'''.",
        "powersearch-legend": "Landeu avançau",
        "powersearch-ns": "Landeal en espaciu e nombris:",
-       "powersearch-redir": "Listal redirecionis",
        "search-external": "Landeu estelnu",
        "searchdisabled": "Los landeus en {{SITENAME}} están temporalmenti desativaus. Mentris tantu, pueis landeal meyanti landerus esternus, inque ten en cuenta que los sus éndicis concernientis a {{SITENAME}} puein nu estal atualizaus.",
        "preferences": "Preferéncias",
        "recentchanges-summary": "Sigui los úrtimus chambus d´esti güiqui nesta páhina.",
        "recentchanges-feed-description": "Sigui los úrtimus chambus nel güiqui nesti feed.",
        "rcnotefrom": "Embahu se muestran los chambus hechus dendi el '''$2''' (hata el '''$1''').",
-       "rclistfrom": "Muestral los chambus hechus dendi el $1",
+       "rclistfrom": "Muestral los chambus hechus dendi el $3 $2",
        "rcshowhideminor": "$1 eicionis chiqueninas",
        "rcshowhidebots": "$1 bots",
        "rcshowhideliu": "$1 usuárius rustrius",
        "watchlist-details": "{{PLURAL:$1|$1 artículu|$1 artículus}} vehilaus (sin contal las carabas).",
        "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'''",
-       "watchmethod-recent": "comprebandu las úrtimas eicionis en páhinas vehilás",
-       "watchmethod-list": "Revisandu las páhinas vehilás en cata los úrtimus chambus",
-       "watchlistcontains": "Ai $1 {{PLURAL:$1|páhina|páhinas}} ena tu lista e seguimientu.",
-       "iteminvalidname": "Pobrema con el artículu '$1', nombri nu premitiu...",
        "wlshowlast": "Muestral úrtimus $1 oras $2 dias $3",
        "watchlist-options": "Ocionis de la mi lista e seguimientu",
        "watching": "Vehilandu...",
        "enotif_lastvisited": "Vai pa $1 pa visoreal tolos chambus hechus dendi la tu úrtima vesita.",
        "enotif_lastdiff": "Vai pa $1 pa visoreal esti chambu.",
        "enotif_anon_editor": "usuáriu anónimu $1",
-       "enotif_body": "Estimau $WATCHINGUSERNAME,\n\n\nS'á $CHANGEDORCREATED el artículu $PAGETITLE (de {{SITENAME}}) el $PAGEEDITDATE, siendu el su autol  $PAGEEDITOR. Consurta la $PAGETITLE_URL pa leyel la nueva velsión.\n\n$NEWPAGE\n\nSíntesis el eitol: $PAGESUMMARY $PAGEMINOREDIT\n\nContatal con el eitol:\nEmail: $PAGEEDITOR_EMAIL\nGüiqui: $PAGEEDITOR_WIKI\n\nNel chascu en que nu vesitis el artículu, nu se te hazrán mas notificacionis. Amas, pueis cancelal tolas notificacionis ena tu lista e seguimientu.\n\n             Salús dendi {{SITENAME}}!!\n\n--\nPa hazel chambus ena tu lista e seguimientu, vesita\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nAyua la Güiquipeya:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Estimau $WATCHINGUSERNAME,\n\n\nS'á $CHANGEDORCREATED el artículu $PAGETITLE (de {{SITENAME}}) el $PAGEEDITDATE, siendu el su autol  $PAGEEDITOR. Consurta la $PAGETITLE_URL pa leyel la nueva velsión.\n\n$NEWPAGE\n\nSíntesis el eitol: $PAGESUMMARY $PAGEMINOREDIT\n\nContatal con el eitol:\nEmail: $PAGEEDITOR_EMAIL\nGüiqui: $PAGEEDITOR_WIKI\n\nNel chascu en que nu vesitis el artículu, nu se te hazrán mas notificacionis. Amas, pueis cancelal tolas notificacionis ena tu lista e seguimientu.\n\n             Salús dendi {{SITENAME}}!!\n\n--\nPa hazel chambus ena tu lista e seguimientu, vesita\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nAyua la Güiquipeya:\n$HELPPAGE",
        "created": "criá",
        "changed": "chambau",
        "deletepage": "Esborral páhina",
        "blockip": "Atarugal usuáriu",
        "blockip-legend": "Atarugal usuáriu",
        "blockiptext": "Gasta el hormuláriu d'embahu p'atarugal el acesu duna IP u dun usuáriu.\nEstu solu ebi hazelsi pa evital el vandalismu, i dalcuerdu cola [[{{MediaWiki:Policy-url}}|póliça]].\nEscrebi una razón concreta embahu (pol sabulugal, almientandu páhinas qu'aigan siu vandalizás pol esti usuáriu).",
-       "ipadressorusername": "IP u nombri d´usuáriu:",
+       "ipaddressorusername": "IP u nombri d´usuáriu:",
        "ipbexpiry": "Acabiha:",
        "ipbreason": "Razón:",
        "ipbreason-dropdown": "*Motivus frecuentis de tarugus\n** Escrebil enhormación farsa\n** Esborral el continiu las páhinas\n** Añiil publiciá d´otras páhinas...\n** Añiil basura enas páhinas\n** Comportamientu encévicu\n** Abusal con varias cuentas\n** Nombris d´usuárius enacetabris",
        "tooltip-rollback": "\"Reveltil\" esborra las eicionis hechas a esta página pol úrtimu usuáriu con un click",
        "tooltip-undo": "\"Esjadel\" revierti ésta eición i abri el mó eición en mó previsoreal.\nÉstu premiti añiil una radón al estorial.",
        "monobook.js": "/* Antigu; gasta [[MediaWiki:common.js]] */",
-       "notacceptable": "El sirviol de la güiqui nu puei chambal los datus a un hormatu leibri pol tu escrucaol.",
        "anonymous": "{{PLURAL:$1|Ussuáriu anónimu|Ussuárius anónimus}} en {{SITENAME}}",
        "siteuser": "{{SITENAME}} usuáriu $1",
        "lastmodifiedatby": "Esta páhina se chambó pol úrtima vezi a las $2, el dia $1 pol $3.",
        "imagelisttext": "Embahu ai una lista con '''$1''' {{PLURAL:$1|archivu|archivus}} ordenaus $2.",
        "newimages-legend": "Filtru",
        "newimages-label": "Nombri el archivu (u parti):",
-       "showhidebots": "($1 bots)",
        "noimages": "Nu ai ná pa vel.",
        "ilsubmit": "Landeal",
        "bydate": "pol fecha",
        "autosumm-replace": "Páhina escambiá pol '$1'",
        "autoredircomment": "Rederihiendu a [[$1]]",
        "autosumm-new": "Criá página con '$1'",
-       "livepreview-loading": "Cargandu…",
-       "livepreview-ready": "Cargandu… Listu!",
-       "livepreview-failed": "Marru cola \"Live Preview\"! Preba a previsoreal normalmenti.",
-       "livepreview-error": "Marru al conetal: $1 \"$2\". Preba a previsoreal normalmenti.",
        "lag-warn-normal": "Es possibri que nu se muestrin los chambus hechus hadi menus de $1 {{PLURAL:$1|segundu|segundus}}.",
        "lag-warn-high": "Ebiu a una arta laténcia el sirviol la basi e datus, los chambus hechus enos úrtimus $1 segundus puein nu sel muestraus nesta lista.",
-       "watchlistedit-numitems": "Ena tu lista e seguimientu ai {{PLURAL:$1|1 entítulu|$1 entítulus}}, sin contal las carabas.",
-       "watchlistedit-noitems": "Nu ai entítulus ena tu lista e seguimientu.",
        "watchlistedit-normal-title": "Eital la lista e seguimientu",
        "watchlistedit-normal-legend": "Esborral entítulus de la lista e seguimientu",
        "watchlistedit-normal-explain": "Los entítulus de la tu lista e seguimientu se muestran embahu. Pa esborral un entítulu, seleciona el cuairu d´al lau i pursa sobri \"Esborral entítulus\". Tamién pueis [[Special:EditWatchlist/raw|eital la lista]].",
        "specialpages-group-spam": "Herramientas de Spam",
        "blankpage": "Branqueal página",
        "tags-edit": "eital",
-       "dberr-header": "Marru ena wiki",
        "revdelete-restricted": "las restricionis a los çahorilis án siu apricás",
        "revdelete-unrestricted": "las restricionis a los çahorilis án siu esborrás",
        "rightsnone": "(dengunu)",
index 7be130a..a206e08 100644 (file)
@@ -32,7 +32,9 @@
                        "לערי ריינהארט",
                        "جواد",
                        "درفش کاویانی",
-                       "محک"
+                       "محک",
+                       "아라",
+                       "Mostafadaneshvar"
                ]
        },
        "tog-underline": "خط کشیدن زیر پیوندها:",
@@ -56,7 +58,7 @@
        "tog-enotifusertalkpages": "هنگامی که در صفحهٔ بحث کاربری‌ام تغییری صورت می‌گیرد به من نامه‌ای فرستاده شود",
        "tog-enotifminoredits": "برای تغییرات جزئی در صفحه‌ها و پرونده‌ها هم به من نامه‌ای فرستاده شود",
        "tog-enotifrevealaddr": "نشانی رایانامهٔ من در رایانامه‌های اطلاع‌رسانی نمایش یابد",
-       "tog-shownumberswatching": "شمار کاربران پی‌گیری‌کننده نمایش یابد",
+       "tog-shownumberswatching": "شمار کاربران پی‌گیرندهٔ نمایش یابد",
        "tog-oldsig": "امضای کنونی:",
        "tog-fancysig": "امضا به صورت ویکی‌متن در نظر گرفته شود (بدون درج خودکار پیوند)",
        "tog-uselivepreview": "استفاده از پیش‌نمایش زنده (نیازمند جاوااسکریپت) (آزمایشی)",
        "jumptonavigation": "ناوبری",
        "jumptosearch": "جستجو",
        "view-pool-error": "متأسفانه سرورها در حال حاضر دچار بار اضافی هستند.\nتعداد زیادی از کاربران دارند تلاش می‌کنند که این صفحه را ببینند.\nلطفاً قبل از تلاش دوباره برای دیدن این صفحه مدتی صبر کنید.\n\n$1",
+       "generic-pool-error": "متأسفانه سرورها در حال حاضر دچار بار اضافی هستند.\nتعداد زیادی از کاربران دارند تلاش می‌کنند که این صفحه را ببینند.\nلطفاً قبل از تلاش دوباره برای دیدن این صفحه مدتی صبر کنید.",
        "pool-timeout": "اتمام مهلت انتظار برای قفل",
        "pool-queuefull": "صف مخزن پر است",
        "pool-errorunknown": "خطای ناشناخته",
        "readonly_lag": "پایگاه داده به طور خودکار قفل شده‌است تا نسخه‌های پشتیبان با نسخهٔ اصلی هماهنگ شوند",
        "internalerror": "خطای داخلی",
        "internalerror_info": "خطای داخلی: $1",
-       "fileappenderrorread": "در طی الحاق امکان خواندن «$1» وجود نداشت.",
-       "fileappenderror": "نشد «$1» را به «$2» الحاق کرد.",
        "filecopyerror": "نشد از پروندهٔ «$1» روی «$2» نسخه‌برداری شود.",
        "filerenameerror": "نشد پروندهٔ «$1» به «$2» تغییر نام یابد.",
        "filedeleteerror": "نشد پروندهٔ «$1» حذف شود.",
        "directorycreateerror": "نشد مسیر $1 را ایجاد کرد.",
        "filenotfound": "پروندهٔ «$1» یافت نشد.",
-       "fileexistserror": "امکان نوشتن روی پرونده $1 وجود ندارد: پرونده از قبل موجود است.",
        "unexpected": "مقدار غیرمنتظره: «$1»=«$2».",
        "formerror": "خطا: نمی‌توان فرم را فرستاد.",
        "badarticleerror": "نمی‌توان این عمل را بر این صفحه انجام داد.",
        "userlogin-helplink2": "کمک با ورود",
        "userlogin-loggedin": "شما در حال حاضر به‌عنوان {{GENDER:$1|$1}} وارد شده‌اید.\nاز فرم پایین برای ورود به‌عنوان یک کاربر دیگر استفاده کنید.",
        "userlogin-createanother": "ایجاد یک حساب کاربری دیگر",
-       "createacct-join": "اطلاعاتتان را در زیر وارد کنید",
-       "createacct-another-join": "در زیر اطلاعات کاربری جدیدتان را وارد کنید.",
        "createacct-emailrequired": "نشانی رایانامه",
        "createacct-emailoptional": "نشانی رایانامه (اختیاری)",
        "createacct-email-ph": "نشانی رایانامه را وارد کنید",
        "savearticle": "صفحه ذخیره شود",
        "preview": "پیش‌نمایش",
        "showpreview": "پیش‌نمایش",
-       "showlivepreview": "پیش‌نمایش زنده",
        "showdiff": "نمایش تغییرات",
        "anoneditwarning": "'''هشدار:''' شما به سامانه وارد نشده‌اید.\nنشانی آی‌پی شما در تاریخچهٔ ویرایش این صفحه ثبت خواهد شد.",
        "anonpreviewwarning": "''شما به سامانه وارد نشده‌اید. ذخیره کردن باعث می‌شود که نشانی آی‌پی شما در تاریخچهٔ این صفحه ثبت گردد.''",
        "edit-gone-missing": "امکان به‌روز کردن صفحه وجود ندارد.\nبه نظرمی‌رسد که صفحه حذف شده باشد.",
        "edit-conflict": "تعارض ویرایشی.",
        "edit-no-change": "ویرایش شما نادیده گرفته شد، زیرا تغییری در متن داده نشده بود.",
-       "postedit-confirmation": "ویرایش شما ذخیره شد.",
+       "postedit-confirmation-created": "صفحه ایجاد شده است.",
+       "postedit-confirmation-restored": "صفحه بازیابی شده است.",
+       "postedit-confirmation-saved": "ویرایش شما ذخیره شد.",
        "edit-already-exists": "امکان ساختن صفحهٔ جدید وجود ندارد.\nاین صفحه از قبل وجود داشته‌است.",
        "defaultmessagetext": "متن پیش‌فرض پیغام",
        "content-failed-to-parse": "عدم موفقیت در تجزیه محتوای $2 برای مدل $1: $3",
        "parser-template-recursion-depth-warning": "محدودیت عمق بازگشت الگو رد شد ($1)",
        "language-converter-depth-warning": "محدودیت عمق مبدل زبانی رد شد ($1)",
        "node-count-exceeded-category": "صفحه‌هایی که از حداکثر تعداد گره تجاوز کرده‌اند",
+       "node-count-exceeded-category-desc": "رده برای صفحاتی که در آنها شمارنده فراتر رفته است.",
        "node-count-exceeded-warning": "صفحه از حداکثر تعداد گره تجاوز کرد",
        "expansion-depth-exceeded-category": "صفحه‌هایی که از حداکثر عمق بسط دادن تجاوز کرده‌اند",
+       "expansion-depth-exceeded-category-desc": "رده برای صفحاتی که در آنها عمق گسترش فراتر رفته است.",
        "expansion-depth-exceeded-warning": "صفحه حداکثر عمق بسط دادن تجاوز کرد",
        "parser-unstrip-loop-warning": "حلقه در دستور unstrip پیدا شد",
        "parser-unstrip-recursion-limit": "از حداکثر ارجاع در دستور unstrip تجاوز شد ($1)",
        "showhideselectedversions": "نمایش/نهفتن نسخه‌های انتخاب شده",
        "editundo": "خنثی‌سازی",
        "diff-empty": "(بدون تفاوت)",
-       "diff-multi-sameuser": "({{PLURAL:$1|یک نسخهٔ متوسط|$1 نسخه‌های متوسط}} توسط کاربر مشابهی که نشان داده نشده)",
+       "diff-multi-sameuser": "({{PLURAL:$1|یک نسخهٔ میانی|$1 نسخهٔ میانی}} توسط کاربر مشابهی که نشان داده نشده)",
        "diff-multi-otherusers": "({{PLURAL:$1|یک نسخهٔ متوسط|$1 نسخه‌های متوسط}} توسط {{PLURAL:$2|کاربر دیگری|$2 کاربران}} نشان داده نشده)",
        "diff-multi-manyusers": "({{PLURAL:$1|یک|$1}} ویرایش میانی توسط بیش از {{PLURAL:$2|یک|$2}} کاربر نشان داده نشده‌است)",
        "difference-missing-revision": "{{PLURAL:$2|یک ویرایش|$2 ویرایش}}  از تفاوت نسخه‌ها ($1) {{PLURAL:$2|یافت|یافت}}  نشد.\n\nمعمولاً در اثر پیوند به تاریخچهٔ به‌روز نشدهٔ صفحهٔ حذف شده است.\nمی‌توانید جزئیات بیشتر را در [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سیاههٔ حذف] بیابید.",
        "searchmenu-exists": "'''صفحه‌ای با عنوان «[[:$1]]» در این ویکی وجود دارد.'''",
        "searchmenu-new": "<strong>ایجاد صفحهٔ «[[:$1]]» در این ویکی!</strong> {{PLURAL:$2|0=|همچنین مشاهدهٔ صفحهٔ پیدا شده با جستجوی شما.|همچنین مشاهدهٔ جستجوی نتایج پیدا شده.}}",
        "searchprofile-articles": "صفحه‌های محتوایی",
-       "searchprofile-project": "صفحه‌های راهنما و پروژه",
        "searchprofile-images": "چندرسانه‌ای",
        "searchprofile-everything": "همه‌چیز",
        "searchprofile-advanced": "پیشرفته",
        "searchprofile-articles-tooltip": "جستجو در $1",
-       "searchprofile-project-tooltip": "جستجو در $1",
        "searchprofile-images-tooltip": "جستجو برای پرونده‌ها",
        "searchprofile-everything-tooltip": "جستجوی تمام محتوا (شامل صفحه‌های بحث)",
        "searchprofile-advanced-tooltip": "جستجو در فضاهای نام دلخواه",
        "search-nonefound": "نتیجه‌ای منطبق با درخواست پیدا نشد.",
        "powersearch-legend": "جستجوی پیشرفته",
        "powersearch-ns": "جستجو در فضاهای نام:",
-       "powersearch-redir": "فهرست‌کردن تغییرمسیرها",
        "powersearch-togglelabel": "بررسی:",
        "powersearch-toggleall": "همه",
        "powersearch-togglenone": "هیچ‌کدام",
        "prefs-emailconfirm-label": "تأیید رایانامه:",
        "youremail": "رایانامه:",
        "username": "{{GENDER:$1|نام کاربری}}:",
-       "uid": "شناسهٔ {{GENDER:$1|کاربری}}:",
        "prefs-memberingroups": "{{GENDER:$2|عضو}} {{PLURAL:$1|گروه|گروه}}:",
        "prefs-registration": "زمان ثبت‌نام:",
        "yourrealname": "نام واقعی:",
        "prefs-advancedsearchoptions": "گزینه‌های پیشرفته",
        "prefs-advancedwatchlist": "گزینه‌های پیشرفته",
        "prefs-displayrc": "گزینه‌های نمایش",
-       "prefs-displaysearchoptions": "گزینه‌های نمایش",
        "prefs-displaywatchlist": "گزینه‌های نمایش",
        "prefs-tokenwatchlist": "نشانه",
        "prefs-diffs": "تفاوت‌ها",
        "right-move": "انتقال صفحه",
        "right-move-subpages": "انتقال صفحه‌ها به همراه زیر‌صفحه‌هایشان",
        "right-move-rootuserpages": "انتقال صفحه‌های کاربری سرشاخه",
+       "right-move-categorypages": "انتقال صفحهٔ رده",
        "right-movefile": "انتقال پرونده‌ها",
        "right-suppressredirect": "انتقال صفحه بدون ایجاد تغییرمسیر از نام قبلی",
        "right-upload": "بارگذاری پرونده",
        "right-import": "واردکردن صفحه از ویکی‌های دیگر",
        "right-importupload": "واردکردن صفحه از طریق بارگذاری پرونده",
        "right-patrol": "گشت زدن به ویرایش‌های دیگران",
-       "right-autopatrol": "گشن زدن خودکار به ویرایش‌های خودش",
+       "right-autopatrol": "گشت زدن خودکار ویرایش‌های خودش",
        "right-patrolmarks": "مشاهدهٔ برچسب گشت تغییرات اخیر",
        "right-unwatchedpages": "مشاهدهٔ فهرست صفحه‌هایی که پی‌گیری نمی‌شوند",
        "right-mergehistory": "ادغام تاریخچهٔ صفحه‌ها",
        "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": "نوشتن روی این پرونده موجود",
        "recentchanges-legend-newpage": "(همچنین به [[Special:NewPages|فهرست صفحات جدید]] نگاه کنید)",
        "recentchanges-legend-plusminus": "('' ±۱۲۳'')",
        "rcnotefrom": "در زیر تغییرات از <strong>$2</strong> (تا <strong>$1</strong> نشان داده شده‌است).",
-       "rclistfrom": "نمایش تغییرات جدید با شروع از $1",
+       "rclistfrom": "نمایش تغییرات جدید با شروع از $3 $2",
        "rcshowhideminor": "$1 ویرایش‌های جزئی",
        "rcshowhideminor-show": "نمایش",
-       "rcshowhideminor-hide": "پنهان‌ کردن",
+       "rcshowhideminor-hide": "پنهان‌کردن",
        "rcshowhidebots": "$1 ربات‌ها",
        "rcshowhidebots-show": "نمایش",
        "rcshowhidebots-hide": "پنهان‌کردن",
        "minoreditletter": "جز",
        "newpageletter": "نو",
        "boteditletter": "ر",
-       "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|کاربر|کاربر}} پی‌گیری‌کننده]",
+       "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|کاربر}} پی‌گیرنده]",
        "rc_categories": "محدود به این رده‌ها (رده‌ها را با «|» جدا کنید)",
        "rc_categories_any": "هر کدام",
        "rc-change-size-new": "$1 {{PLURAL:$1|بایت}} پس از تغییر",
        "uploadstash-refresh": "تازه‌کردن فهرست پرونده‌ها",
        "invalid-chunk-offset": "جابجایی نامعتبر قطعه",
        "img-auth-accessdenied": "منع دسترسی",
-       "img-auth-nopathinfo": "PATH_INFO موجود نیست.\nسرور شما برای ردکردن این مقدار تنظیم نشده‌است.\nممکن است مبتنی بر سی‌جی‌آی باشد و از img_auth پشتیبانی نکند.\nhttps://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.",
+       "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» در فهرست سفید قرار ندارد.",
        "pageswithprop-prophidden-binary": "جزییات مقدار مخفی باینری ($1)",
        "doubleredirects": "تغییرمسیرهای دوتایی",
        "doubleredirectstext": "این صفحه فهرستی از صفحه‌های تغییرمسیری را ارائه می‌کند که به صفحهٔ تغییرمسیر دیگری اشاره می‌کنند.\nهر سطر دربردارندهٔ پیوندهایی به تغییرمسیر اول و دوم و همچنین مقصد تغییرمسیر دوم است، که معمولاً صفحهٔ مقصد واقعی است و نخستین تغییرمسیر باید به آن اشاره کند.\nموارد <del>خط خورده</del> درست شده‌اند.",
-       "double-redirect-fixed-move": "[[$1]] انتقال داده شده‌است، و در حال حاضر تغییرمسیری به [[$2]] است",
-       "double-redirect-fixed-maintenance": "رÙ\81ع ØªØºÛ\8cÛ\8cرÙ\85سÛ\8cر Ø¯Ù\88تاÛ\8cÛ\8c Ø§Ø² [[$1]] Ø¨Ù\87 [[$2]].",
+       "double-redirect-fixed-move": "[[$1]] انتقال داده شده‌است.\n\nبه صورت خودکار به‌روز شده‌است و  تغییرمسیری به [[$2]] داده شد.",
+       "double-redirect-fixed-maintenance": "رÙ\81ع Ø®Ù\88دکار ØªØºÛ\8cÛ\8cرÙ\85سÛ\8cر Ø¯Ù\88تاÛ\8cÛ\8c Ø§Ø² [[$1]] Ø¨Ù\87 [[$2]] Ø¯Ø± Ø±Ù\88Ù\86د Ù\86Ú¯Ù\87دارÛ\8c.",
        "double-redirect-fixer": "تعمیرکار تغییرمسیرها",
        "brokenredirects": "تغییرمسیرهای خراب",
        "brokenredirectstext": "تغییرمسیرهای زیر به یک صفحهٔ ناموجود پیوند دارند:",
        "log-title-wildcard": "صفحه‌هایی را جستجو کن که عنوانشان با این عبارت آغاز می‌شود",
        "showhideselectedlogentries": "نمایش/نهفتن موارد انتخابی در سیاهه",
        "allpages": "همهٔ صفحه‌ها",
-       "alphaindexline": "$1 تا $2",
        "nextpage": "صفحهٔ بعد ($1)",
        "prevpage": "صفحهٔ قبلی ($1)",
        "allpagesfrom": "نمایش صفحه‌ها با شروع از:",
        "watchlist-details": "بدون احتساب صفحه‌های جداگانهٔ بحث، {{PLURAL:$1|$1 صفحه|$1 صفحه}} در فهرست پی‌گیری‌های شما قرار {{PLURAL:$1|دارد|دارند}}.",
        "wlheader-enotif": "آگاه‌سازی رایانامه‌ای فعال است.",
        "wlheader-showupdated": "صفحه‌هایی که پس از آخرین بازدید شما تغییر کرده‌اند '''پررنگ''' نمایش داده شده‌اند.",
-       "watchmethod-recent": "بررسی ویرایش‌های اخیر برای صفحه‌های مورد پی‌گیری",
-       "watchmethod-list": "بررسی صفحه‌های مورد پی‌گیری برای ویرایش‌های اخیر",
-       "watchlistcontains": "فهرست پی‌گیری‌های شما حاوی $1 {{PLURAL:$1|صفحه|صفحه}} است.",
-       "iteminvalidname": "مشکل با مورد «$1»، نام نامعتبر است...",
        "wlnote2": "در زیر تغییرات اخیر وجود دارد {{PLURAL:$1|ساعت|<strong>$1</strong> ساعت‌ها}}, به عنوان $2, $3.",
        "wlshowlast": "نمایش آخرین $1 ساعت $2 روز $3",
        "watchlist-options": "گزینه‌های پی‌گیری",
        "enotif_lastvisited": "برای دیدن همهٔ تغییرات از آخرین باری که سر زده‌اید $1 را ببینید.",
        "enotif_lastdiff": "برای نمایش این تغییر $1 را ببینید.",
        "enotif_anon_editor": "کاربر ناشناس $1",
-       "enotif_body": "$WATCHINGUSERNAME گرامی،\n\n$PAGEINTRO $NEWPAGE\n\n\nتوضیح ویراستار: $PAGESUMMARY $PAGEMINOREDIT\n\nتماس با ویراستار:\nنامه: $PAGEEDITOR_EMAIL\nویکی: $PAGEEDITOR_WIKI\n\nتا هنگامی که به صفحه سر نزده‌اید، در صورت رخ‌دادنِ احتمالیِ فعالیت بیشتر، تا زمانی که در با کاربریتان در سامانه هستید، اعلانیه‌ای برای شما فرستاده نخواهد شد.\nشما همچنین می‌توانید در صفحهٔ پی‌گیری‌های خود پرچم‌های مربوط به آگاهی‌رسانی را صفر کنید همچنین می‌توانید پرچم‌های آگاهی‌سازی را بازنشانی کنید.\n\nدوستدار شما، سامانهٔ آگاهی‌رسانی {{SITENAME}}\n\n--\nبرای تغییر تنظیمات فهرست آگاهی‌رسانی رایانامه‌ای به {{canonicalurl:{{#special:EditWatchlist}}}} بروید.\n\nبرای تغییر تنظیمات فهرست پی‌گیری‌هایتان به {{canonicalurl:{{#special:EditWatchlist}}}} بروید.\n\nبرای حذف صفحه از فهرست پی‌گیری‌هایتان به $UNWATCHURL بروید.\n\nبازخورد و کمک بیشتر:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "$WATCHINGUSERNAME گرامی،\n\n$PAGEINTRO $NEWPAGE\n\n\nتوضیح ویراستار: $PAGESUMMARY $PAGEMINOREDIT\n\nتماس با ویراستار:\nنامه: $PAGEEDITOR_EMAIL\nویکی: $PAGEEDITOR_WIKI\n\nتا هنگامی که به صفحه سر نزده‌اید، در صورت رخ‌دادنِ احتمالیِ فعالیت بیشتر، تا زمانی که در با کاربریتان در سامانه هستید، اعلانیه‌ای برای شما فرستاده نخواهد شد.\nشما همچنین می‌توانید در صفحهٔ پی‌گیری‌های خود پرچم‌های مربوط به آگاهی‌رسانی را صفر کنید همچنین می‌توانید پرچم‌های آگاهی‌سازی را بازنشانی کنید.\n\nدوستدار شما، سامانهٔ آگاهی‌رسانی {{SITENAME}}\n\n--\nبرای تغییر تنظیمات فهرست آگاهی‌رسانی رایانامه‌ای به {{canonicalurl:{{#special:EditWatchlist}}}} بروید.\n\nبرای تغییر تنظیمات فهرست پی‌گیری‌هایتان به {{canonicalurl:{{#special:EditWatchlist}}}} بروید.\n\nبرای حذف صفحه از فهرست پی‌گیری‌هایتان به $UNWATCHURL بروید.\n\nبازخورد و کمک بیشتر:\n$HELPPAGE",
        "created": "ایجاد شده",
        "changed": "تغییر یافته",
        "deletepage": "حذف صفحه",
        "blockip": "بستن کاربر",
        "blockip-legend": "بستن کاربر",
        "blockiptext": "از فرم زیر برای بستن دسترسی ویرایش یک نشانی آی‌پی یا نام کاربری مشخص استفاده کنید.\nاین کار فقط فقط باید برای جلوگیری از خرابکاری و بر اساس [[{{MediaWiki:Policy-url}}|سیاست قطع دسترسی]] انجام شود.\nدلیل مشخص این کار را در زیر ذکر کنید (مثلاً با ذکر صفحه‌های به‌خصوصی که مورد خرابکاری واقع شده‌اند).",
-       "ipadressorusername": "نشانی آی‌پی یا نام کاربری:",
+       "ipaddressorusername": "نشانی آی‌پی یا نام کاربری:",
        "ipbexpiry": "زمان سرآمدن:",
        "ipbreason": "دلیل:",
        "ipbreason-dropdown": "*دلایل متداول قطع دسترسی\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": "شما اجازهٔ انتقال دادن صفحه‌ها را ندارید.",
        "movenotallowedfile": "شما اجازهٔ انتقال پرونده‌ها را ندارید.",
        "cant-move-user-page": "شما اجازه ندارید صفحه‌های کاربری سرشاخه را انتقال دهید.",
        "cant-move-to-user-page": "شما اجازه ندارید که یک صفحه را به یک صفحهٔ کاربر انتقال دهید (به استثنای زیر صفحه‌های کاربری).",
+       "cant-move-category-page": "شما اجازهٔ انتقال دادن صفحهٔ رده‌ها را ندارید.",
+       "cant-move-to-category-page": "شما مجوز برای انتقال صفحه به صفحه رده ندارید.",
        "newtitle": "به‌عنوان جدید",
        "move-watch": "پی‌گیری صفحه‌های مبدأ و مقصد",
        "movepagebtn": "صفحه منتقل شود",
        "interlanguage-link-title": "$1–$2",
        "common.css": "/* دستورات این بخش همهٔ کاربران را تحت تاثیر قرار می‌دهند. */",
        "monobook.css": "/* دستورات این بخش کاربرانی را که از پوستهٔ مونوبوک استفاده کنند تحت تاثیر قرار می‌دهند. */",
-       "notacceptable": "کارگذار این ویکی از ارسال داده به شکلی که برنامهٔ شما بتواند نمایش بدهد، عاجز است.",
        "anonymous": "{{PLURAL:$1|کاربر|کاربران}} گمنام {{SITENAME}}",
        "siteuser": "$1، کاربر {{SITENAME}}",
        "anonuser": "$1 کاربر ناشناس {{SITENAME}}",
        "pageinfo-category-pages": "تعداد صفحه‌ها",
        "pageinfo-category-subcats": "تعداد زیررده‌ها",
        "pageinfo-category-files": "تعداد پرونده‌ها",
-       "skinname-cologneblue": "آبی کلن",
        "skinname-monobook": "مونوبوک",
-       "skinname-modern": "مدرن",
        "skinname-vector": "برداری",
        "markaspatrolleddiff": "برچسب گشت بزن",
        "markaspatrolledtext": "به این صفحه برچسب گشت بزن",
        "markedaspatrollederrornotify": "زدن برچسب گشت، ناموفق بود.",
        "patrol-log-page": "سیاههٔ گشت",
        "patrol-log-header": "این سیاهه‌ای از ویرایش‌های گشت‌خورده است.",
-       "log-show-hide-patrol": "سیاههٔ گشت‌زنی $1",
+       "log-show-hide-patrol": "$1 سیاههٔ گشت‌زنی",
        "deletedrevision": "$1 نسخهٔ حذف شدهٔ قدیمی",
        "filedeleteerror-short": "خطا در حذف پرونده: $1",
        "filedeleteerror-long": "در زمان حذف پرونده خطا رخ داد:\n\n$1",
        "newimages-summary": "این صفحهٔ ویژه آخرین پرونده‌های بارگذاری شده را نمایش می‌دهد",
        "newimages-legend": "پالودن",
        "newimages-label": "نام پرونده (یا قسمتی از آن):",
-       "showhidebots": "($1 ربات‌ها)",
+       "newimages-showbots": "نمایش بارگذاری‌ها توسط ربات‌ها",
        "noimages": "چیزی برای دیدن نیست.",
        "ilsubmit": "جستجو",
        "bydate": "از روی تاریخ",
        "size-kilobytes": "$1 کیلوبایت",
        "size-megabytes": "$1 مگابایت",
        "size-gigabytes": "$1 گیگابایت",
-       "livepreview-loading": "در حال بارگیری…",
-       "livepreview-ready": "بارشدن… آماده!",
-       "livepreview-failed": "پیش‌نمایش زنده به مشکل برخورد! لطفاً از پیش‌نمایش عادی استفاده کنید",
-       "livepreview-error": "ارتباط به مشکل برخورد: $1 \"$2\" از پیش‌نمایش عادی استفاده کنید.",
        "lag-warn-normal": "ممکن است تغییرات تازه‌تر از $1 {{PLURAL:$1|ثانیه|ثانیه}} در این فهرست نشان داده نشوند.",
        "lag-warn-high": "ممکن است، به خاطر پس‌افتادگی زیاد سرور پایگاه داده، تغییرات تازه‌تر از $1 {{PLURAL:$1|ثانیه|ثانیه}} در این فهرست نشان داده نشده باشند.",
-       "watchlistedit-numitems": "فهرست پی‌گیری‌های شما شامل {{PLURAL:$1|$1 صفحه|$1 صفحه}} به جز صفحه‌های بحث است.",
-       "watchlistedit-noitems": "فهرست پی‌گیری‌های شما خالی است.",
        "watchlistedit-normal-title": "ویرایش فهرست پی‌گیری‌ها",
        "watchlistedit-normal-legend": "حذف عنوان‌ها از فهرست پی‌گیری‌ها",
        "watchlistedit-normal-explain": "عنوان‌های موجود در فهرست پی‌گیری شما در زیر نشان داده شده‌اند.\nبرای حذف هر عنوان جعبهٔ کنار آن را علامت بزنید و دکمهٔ «{{int:Watchlistedit-normal-submit}}» را بفشارید.\nشما همچنین می‌توانید [[Special:EditWatchlist/raw|فهرست خام را ویرایش کنید]].",
        "watchlistedit-raw-done": "فهرست پی‌گیری‌های شما به روز شد.",
        "watchlistedit-raw-added": "$1 عنوان به فهرست پی‌گیری‌ها اضافه {{PLURAL:$1|شد|شدند}}:",
        "watchlistedit-raw-removed": "$1 عنوان حذف {{PLURAL:$1|شد|شدند}}:",
+       "watchlistedit-clear-title": "فهرست پیگیری پاکسازی‌شده",
+       "watchlistedit-clear-legend": "پاکسازی فهرست پیگیری",
+       "watchlistedit-clear-explain": "همه عناوین از فهرست پیگیریهای شما حذف خواهد شد",
+       "watchlistedit-clear-titles": "عنوان‌ها:",
+       "watchlistedit-clear-submit": "پاک کردن فهرست پیگیریها (این دائم است!)",
+       "watchlistedit-clear-done": "فهرست پیگیریهای شما پاک شد.",
+       "watchlistedit-clear-removed": "$1 عنوان حذف {{PLURAL:$1|شد|شدند}}:",
+       "watchlistedit-too-many": "تعداد زیادی صفحه برای نمایش در اینجا وجود دارد.",
+       "watchlisttools-clear": "پاکسازی فهرست پیگیری",
        "watchlisttools-view": "فهرست پی‌گیری‌ها",
        "watchlisttools-edit": "مشاهده و ویرایش فهرست پی‌گیری‌ها",
        "watchlisttools-raw": "ویرایش فهرست خام پی‌گیری‌ها",
        "compare-invalid-title": "عنوان تعیین‌شده نامعتبر است.",
        "compare-title-not-exists": "عنوان مشخص شده وجود ندارد.",
        "compare-revision-not-exists": "پالایهٔ مشخص شده وجود ندارد.",
-       "dberr-header": "این ویکی یک ایراد دارد",
        "dberr-problems": "شرمنده! این تارنما از مشکلات فنی رنج می‌برد.",
        "dberr-again": "چند دقیقه صبر کنید و دوباره صفحه را بارگیری کنید.",
        "dberr-info": "(امکان برقراری ارتباط با کارساز پایگاه داده وجود ندارد: $1)",
        "htmlform-no": "نه",
        "htmlform-yes": "بله",
        "htmlform-chosen-placeholder": "یک گزینه را انتخاب کنید",
+       "htmlform-cloner-create": "افزودن بیشتر",
+       "htmlform-cloner-delete": "حذف",
+       "htmlform-cloner-required": "حداقل یک مقدار مورد نیاز است.",
        "sqlite-has-fts": "$1 با پشتیبانی از جستجو در متن کامل",
        "sqlite-no-fts": "$1 بدون پشتیبانی از جستجو در متن کامل",
        "logentry-delete-delete": "$1 صفحهٔ $3 را {{GENDER:$2|حذف کرد}}",
index 6af07b3..69f021f 100644 (file)
@@ -37,7 +37,9 @@
                        "Wix",
                        "Yaamboo",
                        "ZeiP",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라",
+                       "Syreeni"
                ]
        },
        "tog-underline": "Linkkien alleviivaus:",
        "permalink": "Ikilinkki",
        "print": "Tulosta",
        "view": "Näytä",
-       "view-foreign": "Katso kohdetta $1",
+       "view-foreign": "Näytä $1",
        "edit": "Muokkaa",
        "edit-local": "Muokkaa paikallista kuvausta",
        "create": "Luo sivu",
-       "create-local": "Lisää paikallinen kuvaus",
+       "create-local": "Luo paikallinen kuvaus",
        "editthispage": "Muokkaa tätä sivua",
        "create-this-page": "Luo tämä sivu",
        "delete": "Poista",
        "jumptonavigation": "valikkoon",
        "jumptosearch": "hakuun",
        "view-pool-error": "Valitettavasti palvelimet ovat ylikuormittuneet tällä hetkellä.\nLiian monta käyttäjää yrittää tarkastella tätä sivua.\nOdota hetki ennen kuin yrität uudelleen.\n\n$1",
+       "generic-pool-error": "Valitettavasti palvelimet ovat ylikuormittuneet tällä hetkellä.\nLiian monta käyttäjää yrittää tarkastella tätä sivua.\nOdota hetki ennen kuin yrität uudelleen.",
        "pool-timeout": "Lukon aikakatkaisu.",
        "pool-queuefull": "Lukkojono on täysi.",
        "pool-errorunknown": "Tuntematon virhe.",
        "readonly_lag": "Tietokanta on automaattisesti lukittu, jotta kaikki tietokantapalvelimet saisivat kaikki tuoreet muutokset",
        "internalerror": "Sisäinen virhe",
        "internalerror_info": "Sisäinen virhe: $1",
-       "fileappenderrorread": "Ei voitu lukea tiedostoa ”$1” liittämisen aikana.",
-       "fileappenderror": "Tiedostoa ”$1” ei voitu lisätä tiedostoon ”$2”.",
        "filecopyerror": "Tiedostoa <b>$1</b> ei voitu kopioida tiedostoksi <b>$2</b>.",
        "filerenameerror": "Tiedostoa <b>$1</b> ei voitu nimetä uudelleen nimellä <b>$2</b>.",
        "filedeleteerror": "Tiedostoa <b>$1</b> ei voitu poistaa.",
        "directorycreateerror": "Hakemiston ”$1” luominen epäonnistui.",
        "filenotfound": "Tiedostoa <b>$1</b> ei löytynyt.",
-       "fileexistserror": "Tiedostoon ”$1” kirjoittaminen epäonnistui: Tiedosto on olemassa.",
        "unexpected": "Odottamaton arvo: ”$1” on ”$2”.",
        "formerror": "Lomakkeen tiedot eivät kelpaa",
        "badarticleerror": "Tätä toimintoa ei voi suorittaa tälle sivulle.",
        "userlogin-helplink2": "Apua sisäänkirjautumiseen",
        "userlogin-loggedin": "Olet jo kirjautunut sisään tunnuksella {{GENDER:$1|$1}}.\nKäytä alla olevaa lomaketta kirjautuaksesi sisään toisena käyttäjänä.",
        "userlogin-createanother": "Luo toinen käyttäjätunnus",
-       "createacct-join": "Kirjoita tietosi alle.",
-       "createacct-another-join": "Lisää uuden käyttäjätunnuksen tiedot alle.",
        "createacct-emailrequired": "Sähköpostiosoite",
        "createacct-emailoptional": "Sähköpostiosoite (vapaaehtoinen)",
        "createacct-email-ph": "Anna sähköpostiosoitteesi",
        "savearticle": "Tallenna sivu",
        "preview": "Esikatselu",
        "showpreview": "Esikatsele",
-       "showlivepreview": "Pikaesikatselu",
        "showdiff": "Näytä muutokset",
        "anoneditwarning": "'''Varoitus:''' Et ole kirjautunut sisään.\nIP-osoitteesi kirjataan tämän sivun muutoshistoriaan.",
        "anonpreviewwarning": "''Et ole kirjautunut sisään. Tallentaminen kirjaa IP-osoitteesi tämän sivun muutoshistoriaan.''",
        "hiddencategories": "Tämä sivu kuuluu {{PLURAL:$1|seuraavaan piilotettuun luokkaan|seuraaviin piilotettuihin luokkiin}}:",
        "edittools": "<!-- Tässä oleva teksti näytetään muokkauskentän alla. -->",
        "nocreatetext": "Et voi luoda uusia sivuja. Voit muokata olemassa olevia sivuja tai [[Special:UserLogin|luoda käyttäjätunnuksen]].",
-       "nocreate-loggedin": "Sinulla ei ole oikeuksia luoda uusia sivuja.",
+       "nocreate-loggedin": "Sinulla ei ole oikeutta luoda uusia sivuja.",
        "sectioneditnotsupported-title": "Osioiden muokkaamista ei tueta.",
        "sectioneditnotsupported-text": "Osioiden muokkaamista ei tueta tällä sivulla.",
        "permissionserrors": "Puutteelliset oikeudet",
        "edit-gone-missing": "Sivun päivitys ei onnistunut.\nSe on ilmeisesti poistettu.",
        "edit-conflict": "Päällekkäinen muokkaus.",
        "edit-no-change": "Muokkauksesi sivuutettiin, koska tekstiin ei tehty mitään muutoksia.",
-       "postedit-confirmation": "Muokkauksesi on tallennettu.",
+       "postedit-confirmation-created": "Sivu on nyt luotu.",
+       "postedit-confirmation-restored": "Sivu on nyt palautettu (aiempaan versioonsa).",
+       "postedit-confirmation-saved": "Muokkauksesi on tallennettu.",
        "edit-already-exists": "Uuden sivun luominen ei onnistunut.\nSe on jo olemassa.",
        "defaultmessagetext": "Viestin oletusteksti",
        "content-failed-to-parse": "Sisältö tyypiltään $2 ei jäsenny tyypiksi $1: $3",
        "parser-template-recursion-depth-warning": "Mallineen rekursioraja ylittyi ($1)",
        "language-converter-depth-warning": "Kielimuuntimen syvyysraja ylittyi ($1)",
        "node-count-exceeded-category": "Sivut, joissa solmumäärä on ylitetty",
+       "node-count-exceeded-category-desc": "Luokka sivuille, joissa solmujen lukumäärä (node-count) on ylitetty.",
        "node-count-exceeded-warning": "Sivu ylitti solmumäärän",
        "expansion-depth-exceeded-category": "Sivut, joissa laajentamissyvyys on ylitetty",
+       "expansion-depth-exceeded-category-desc": "Tämä on luokka sivuille, joissa laajentamissyvyys (expansion depth) on ylitetty.",
        "expansion-depth-exceeded-warning": "Sivu ylitti laajentamissyvyyden.",
        "parser-unstrip-loop-warning": "Unstrip-silmukka havaittiin",
        "parser-unstrip-recursion-limit": "Unstrip-rekursion enimmäissyvyys ($1) ylitettiin",
        "searchmenu-exists": "'''Tässä wikissä on sivu nimellä [[:$1]].'''",
        "searchmenu-new": "<strong>Luo sivu \"[[:$1]]\" tähän wikiin.</strong> {{PLURAL:$2|0=|Katso myös sivua, joka löytyi hakutoiminnolla.\n|Katso myös hakutuloksia.}}",
        "searchprofile-articles": "Sisältösivut",
-       "searchprofile-project": "Ohje- ja projektisivut",
        "searchprofile-images": "Kuvat ja tiedostot",
        "searchprofile-everything": "Kaikki",
        "searchprofile-advanced": "Laajennettu",
        "searchprofile-articles-tooltip": "Hae nimiavaruuksista $1",
-       "searchprofile-project-tooltip": "Hae nimiavaruuksista $1",
        "searchprofile-images-tooltip": "Etsi tiedostoja",
        "searchprofile-everything-tooltip": "Etsi kaikkialta (myös keskustelusivut)",
        "searchprofile-advanced-tooltip": "Etsi määritellyistä nimiavaruuksista",
        "search-nonefound": "Hakusi ei tuottanut tulosta.",
        "powersearch-legend": "Laajennettu haku",
        "powersearch-ns": "Hae nimiavaruuksista:",
-       "powersearch-redir": "Luettele ohjaukset",
        "powersearch-togglelabel": "Muuta valintaa",
        "powersearch-toggleall": "Valitse kaikki",
        "powersearch-togglenone": "Ei mitään",
        "prefs-emailconfirm-label": "Sähköpostin varmistus",
        "youremail": "Sähköpostiosoite",
        "username": "{{GENDER:$1|Käyttäjätunnus}}",
-       "uid": "{{GENDER:$1|Tunniste}}",
        "prefs-memberingroups": "{{GENDER:$2|Jäsenenä}} {{PLURAL:$1|ryhmässä|ryhmissä}}",
        "prefs-registration": "Rekisteröintiaika",
        "yourrealname": "Oikea nimi",
        "prefs-advancedsearchoptions": "Lisäasetukset",
        "prefs-advancedwatchlist": "Lisäasetukset",
        "prefs-displayrc": "Perusasetukset",
-       "prefs-displaysearchoptions": "Näyttöasetukset",
        "prefs-displaywatchlist": "Näyttöasetukset",
        "prefs-tokenwatchlist": "Avain",
        "prefs-diffs": "Eroavaisuudet",
        "right-move": "Siirtää sivuja",
        "right-move-subpages": "Siirtää sivuja alasivuineen",
        "right-move-rootuserpages": "Siirtää käyttäjäsivuja",
+       "right-move-categorypages": "Siirtää luokkasivuja",
        "right-movefile": "Siirtää tiedostoja",
        "right-suppressredirect": "Siirtää sivuja luomatta automaattisia ohjauksia",
        "right-upload": "Tallentaa tiedostoja",
-       "right-reupload": "Korvata olemassa olevia tiedostoja uudella",
+       "right-reupload": "Tallentaa olemassa olevien tiedostojen tilalle uusia",
        "right-reupload-own": "Korvata itsetallennettu tiedosto uudella tiedostolla",
-       "right-reupload-shared": "Korvata jaettuun mediavarastoon tallennettuja tiedostoja paikallisesti",
+       "right-reupload-shared": "Korvata yhteiseen mediavarastoon tallennettuja tiedostoja paikallisesti",
        "right-upload_by_url": "Tallentaa tiedostoja verkko-osoitteella",
        "right-purge": "Tyhjentää sivuston välimuisti ilman varmennussivua",
        "right-autoconfirmed": "IP-pohjaiset nopeusrajoitukset eivät ole voimassa",
        "action-createpage": "luoda sivuja",
        "action-createtalk": "luoda keskustelusivuja",
        "action-createaccount": "luoda tätä käyttäjätunnusta",
+       "action-history": "tarkastella tämän sivun historiaa",
        "action-minoredit": "merkitä tätä muokkausta pieneksi",
        "action-move": "siirtää tätä sivua",
        "action-move-subpages": "siirtää tätä sivua eikä sen alasivuja",
        "action-move-rootuserpages": "siirtää käyttäjäsivuja",
+       "action-move-categorypages": "siirtää luokkasivuja",
        "action-movefile": "siirtää tätä tiedostoa",
        "action-upload": "tallentaa tätä tiedostoa",
-       "action-reupload": "korvata tätä olemassa olevaa tiedostoa",
-       "action-reupload-shared": "korvata tätä jaetun mediavaraston tiedostoa",
+       "action-reupload": "tallentaa tämän tiedoston tilalle uutta",
+       "action-reupload-shared": "korvata tätä yhteisen mediavaraston tiedostoa",
        "action-upload_by_url": "tallentaa tätä tiedostoa URL-osoitteesta",
        "action-writeapi": "käyttää kirjoitus-APIa",
        "action-delete": "poistaa tätä sivua",
        "recentchanges-legend-newpage": "(katso myös [[Special:NewPages|lista uusista sivuista]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Alla ovat muutokset <strong>$2</strong> lähtien. (Enintään <strong>$1</strong> näytetään.)",
-       "rclistfrom": "Näytä uudet muutokset $1 alkaen",
+       "rclistfrom": "Näytä uudet muutokset $3 $2 alkaen",
        "rcshowhideminor": "$1 pienet muutokset",
        "rcshowhideminor-show": "Näytä",
        "rcshowhideminor-hide": "Piilota",
        "upload_directory_missing": "Tallennushakemisto $1 puuttuu, eikä palvelin pysty luomaan sitä.",
        "upload_directory_read_only": "Palvelimella ei ole kirjoitusoikeuksia tallennushakemistoon $1.",
        "uploaderror": "Tallennusvirhe",
-       "upload-recreate-warning": "'''Varoitus: Tiedosto tällä nimellä on poistettu tai siirretty.'''\n\nPoisto- ja siirtoloki tälle sivulle näkyy alla:",
+       "upload-recreate-warning": "<strong>Varoitus: Tiedosto tällä nimellä on poistettu tai siirretty.</strong>\n\nPoisto- ja siirtoloki tälle sivulle näkyy alla:",
        "uploadtext": "Voit tallentaa tiedostoja alla olevalla lomakkeella. [[Special:FileList|Tiedostoluettelo]] sisältää listan tallennetuista tiedostoista. Tallennukset kirjataan myös [[Special:Log/upload|tallennuslokiin]], ja poistot [[Special:Log/delete|poistolokiin]].\n\nVoit käyttää tiedostoja wikisivuilla seuraavilla tavoilla:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Tiedosto.jpg]]</nowiki></code>''', käyttääksesi tiedoston täyttä versiota.\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Tiedosto.png|200px|thumb|left|Kuvausteksti]]</nowiki></code>''', käyttääksesi tiedostoa sovitettuna 200 kuvapistettä leveään laatikkoon kuvaustekstillä.\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Tiedosto.ogg]]</nowiki></code>''', jos haluat suoran linkin tiedostoon.",
        "upload-permitted": "Sallitut tiedostomuodot: $1.",
        "upload-preferred": "Suositellut tiedostomuodot: $1.",
        "fileexists-extension": "Tiedosto, jolla on samankaltainen nimi, on jo olemassa: [[$2|thumb]]\n* Tallennetun tiedoston nimi: <strong>[[:$1]]</strong>\n* Olemassa olevan tiedoston nimi: <strong>[[:$2]]</strong>\nValitse toinen tiedostonimi.",
        "fileexists-thumbnail-yes": "Tiedosto näyttäisi olevan pienennetty kuva ''(pienoiskuva)''. [[$1|thumb]]\nTarkista tiedosto <strong>[[:$1]]</strong>.\nJos yllä oleva tiedosto on alkuperäisversio samasta kuvasta, ei sille tarvitse tallentaa pienoiskuvaa.",
        "file-thumbnail-no": "Tiedostonimi alkaa merkkijonolla <strong>$1</strong>. Tiedosto näyttäisi olevan pienennetty kuva.\nJos sinulla on tämän kuvan alkuperäinen versio, tallenna se. Muussa tapauksessa nimeä tiedosto uudelleen.",
-       "fileexists-forbidden": "Samanniminen tiedosto on jo olemassa, eikä sitä voi korvata. Tallenna tiedosto jollakin toisella nimellä. Nykyinen tiedosto: [[File:$1|thumb|center|$1]]",
+       "fileexists-forbidden": "Samanniminen tiedosto on jo olemassa, eikä sen tilalle voi tallentaa uutta. \nJos kuitenkin haluat tallentaa tiedostosi, palaa takaisin ja käytä jotain toista nimeä. \n[[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Samanniminen tiedosto on jo olemassa jaetussa mediavarastossa. Tallenna tiedosto jollakin toisella nimellä. [[File:$1|thumb|center|$1]]",
        "file-exists-duplicate": "Tämä tiedosto on kaksoiskappale {{PLURAL:$1|seuraavasta tiedostosta|seuraavista tiedostoista}}:",
        "file-deleted-duplicate": "Tiedosto, joka on identtinen tämän tiedoston kanssa ([[:$1]]) on aiemmin poistettu. Katso kyseisen tiedoston poistoloki ennen kuin jatkat uudelleentallentamista.",
        "uploadstash-refresh": "Päivitä tiedostoluettelo",
        "invalid-chunk-offset": "Kelpaamaton siirtymä lohkoissa",
        "img-auth-accessdenied": "Pääsy estetty",
-       "img-auth-nopathinfo": "PATH_INFO puuttuu.\nPalvelintasi ei ole asetettu välittämään tätä tietoa.\nSe saattaa olla CGI-pohjainen eikä voi tukea img_authia.\nLisätietoja löytyy sivulta https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "PATH_INFO puuttuu.\nPalvelintasi ei ole asetettu välittämään tätä tietoa.\nSe saattaa olla CGI-pohjainen eikä voi tukea img_authia.\nLisätietoja löytyy sivulta https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Pyydetty polku ei ole asetuksissa tiedostojen tallennushakemistona.",
        "img-auth-badtitle": "”$1” ei kelpaa oikean otsikon muodostamiseen.",
        "img-auth-nologinnWL": "Et ole kirjautunut sisään ja tiedosto ”$1” ei ole sallittujen tiedostojen luettelossa.",
        "filepage-nofile-link": "Tämän nimistä tiedostoa ei ole olemassa, mutta voit [$1 tallentaa sen].",
        "uploadnewversion-linktext": "Tallenna uusi versio tästä tiedostosta",
        "shared-repo-from": "kohteesta $1",
-       "shared-repo": "jaettu mediavarasto",
-       "upload-disallowed-here": "Et voi korvata tätä tiedostoa uudella tiedostolla.",
+       "shared-repo": "yhteinen mediavarasto",
+       "upload-disallowed-here": "Et voi tallentaa uutta tiedostoa tämän tilalle.",
        "filerevert": "Tiedoston $1 palautus",
        "filerevert-legend": "Tiedoston palautus",
        "filerevert-intro": "Olet palauttamassa takaisin tiedostoa '''[[Media:$1|$1]]''' [$4 versioon, joka luotiin $2 kello $3].",
        "filerevert-submit": "Suorita palauttaminen",
        "filerevert-success": "'''[[Media:$1|$1]]''' on palautettu takaisin [$4 versioon, joka luotiin $2 kello $3].",
        "filerevert-badversion": "Tiedostosta ei ole luotu versiota kyseisellä ajan hetkellä.",
-       "filedelete": "Tiedoston $1 poisto",
+       "filedelete": "Poistetaan tiedosto $1",
        "filedelete-legend": "Tiedoston poisto",
        "filedelete-intro": "Olet poistamassa tiedoston '''[[Media:$1|$1]]''' ja kaiken sen historian.",
        "filedelete-intro-old": "<span class=\"plainlinks\">Olet poistamassa tiedoston '''[[Media:$1|$1]]''' [$4 päivämäärällä $2 kello $3 luotua versiota].</span>",
        "filedelete-maintenance-title": "Tiedostoa ei voi poistaa",
        "mimesearch": "MIME-haku",
        "mimesearch-summary": "Tällä sivulla voit etsiä tiedostoja niiden MIME-tyypin perusteella.\nSyöte: sisältötyyppi/alatyyppi, esimerkiksi <code>image/jpeg</code>.",
-       "mimetype": "MIME-tyyppi",
+       "mimetype": "MIME-tyyppi:",
        "download": "lataa",
        "unwatchedpages": "Tarkkailemattomat sivut",
        "listredirects": "Ohjaukset",
        "pageswithprop-prophidden-long": "Pitkä tekstimuotoinen ominaisuuden arvo piilotettu ($1)",
        "pageswithprop-prophidden-binary": "ominaisuuden binääriarvo on piilotettu ($1)",
        "doubleredirects": "Kaksinkertaiset ohjaukset",
-       "doubleredirectstext": "Tässä listassa on ohjaussivut, jotka ohjaavat toiseen ohjaussivuun.\nJokaisella rivillä on linkit ensimmäiseen ja toiseen ohjaukseen sekä toisen ohjauksen kohteen ensimmäiseen riviin, eli yleensä ”oikeaan” kohteeseen, johon ensimmäisen ohjauksen pitäisi osoittaa.\n<del>Yliviivatut</del> kohteet on korjattu.",
-       "double-redirect-fixed-move": "[[$1]] on siirretty, ja se ohjaa nyt sivulle [[$2]]",
-       "double-redirect-fixed-maintenance": "Korjataan kaksinkertainen ohjaus sivulta [[$1]] sivulle [[$2]]",
+       "doubleredirectstext": "Tällä sivulla on lueteltu ne sivut, jotka ohjaavat toiseen ohjaussivuun.\nJokaisella rivillä on linkit ensimmäiseen ja toiseen ohjaukseen sekä toisen ohjauksen kohteeseen, joka on yleensä ”oikea” kohdesivu, johon ensimmäisen ohjauksen pitäisi johtaa.\n<del>Yliviivatut</del> kohteet on korjattu.",
+       "double-redirect-fixed-move": "[[$1]] on siirretty.\nSe on automaattisesti päivitetty ja se ohjaa nyt sivulle [[$2]].",
+       "double-redirect-fixed-maintenance": "Korjataan automaattisesti kaksinkertainen ohjaus sivulta [[$1]] sivulle [[$2]].",
        "double-redirect-fixer": "Ohjausten korjaaja",
        "brokenredirects": "Virheelliset ohjaukset",
        "brokenredirectstext": "Seuraavat ohjaukset osoittavat sivuihin, joita ei ole olemassa.",
        "booksources-go": "Siirry",
        "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": "Käyttäjä",
-       "speciallogtitlelabel": "Kohde",
+       "specialloguserlabel": "Suorittaja:",
+       "speciallogtitlelabel": "Kohde (sivu tai käyttäjä):",
        "log": "Lokit",
        "all-logs-page": "Kaikki julkiset lokit",
        "alllogstext": "Tämä on yhdistetty lokien näyttö.\nVoit rajoittaa listaa valitsemalla lokityypin, käyttäjän tai sivun johon muutos on kohdistunut. Jälkimmäiset ovat kirjainkokoherkkiä.",
        "logempty": "Ei tapahtumia lokissa.",
-       "log-title-wildcard": "Kohde alkaa merkkijonolla",
+       "log-title-wildcard": "Haun kohteet alkavat tällä tekstillä",
        "showhideselectedlogentries": "Muuta valittujen lokitapahtumien näkyvyyttä",
        "allpages": "Kaikki sivut",
-       "alphaindexline": "$1…$2",
        "nextpage": "Seuraava sivu ($1)",
        "prevpage": "Edellinen sivu ($1)",
        "allpagesfrom": "Alkaen sivusta",
        "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ä.",
+       "addedwatchtext-short": "Sivu ”$1” on lisätty tarkkailulistallesi.",
        "removewatch": "Poista tarkkailulistalta",
        "removedwatchtext": "Sivu '''[[:$1]]''' on poistettu [[Special:Watchlist|tarkkailulistaltasi]].",
+       "removedwatchtext-short": "Sivu ”$1” on poistettu tarkkailulistaltasi.",
        "watch": "Tarkkaile",
        "watchthispage": "Tarkkaile tätä sivua",
        "unwatch": "Lopeta tarkkailu",
        "watchlist-details": "Tarkkailulistallasi on {{PLURAL:$1|$1 sivu|$1 sivua}}. Keskustelusivuja ei lasketa mukaan.",
        "wlheader-enotif": "Sähköposti-ilmoitus on käytössä.",
        "wlheader-showupdated": "Sivut, joita on muokattu viimeisen käyntisi jälkeen, on '''lihavoitu'''.",
-       "watchmethod-recent": "tarkistetaan tuoreimpia muutoksia tarkkailluille sivuille",
-       "watchmethod-list": "tarkistetaan tarkkailtujen sivujen tuoreimmat muutokset",
-       "watchlistcontains": "Tarkkailulistallasi on {{PLURAL:$1|yksi sivu|$1 sivua}}.",
-       "iteminvalidname": "Sivun $1 kanssa oli ongelmia. Sivun nimessä on vikaa.",
        "wlnote2": "Alla on muutokset viimeisen {{PLURAL:$1|tunnin|<strong>$1</strong> tunnin}} ajalta $2 kello $3 asti.",
        "wlshowlast": "Näytä viimeiset $1 tuntia tai $2 päivää, $3",
        "watchlist-options": "Tarkkailulistan asetukset",
        "enotif_lastvisited": "Osoitteessa $1 on kaikki muutokset viimeisen käyntisi jälkeen.",
        "enotif_lastdiff": "Muutos on osoitteessa $1.",
        "enotif_anon_editor": "kirjautumaton käyttäjä $1",
-       "enotif_body": "$WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nMuokkaajan yhteenveto: $PAGESUMMARY $PAGEMINOREDIT\n\nOta yhteyttä muokkaajaan:\nsähköposti: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nUusia ilmoituksia tästä sivusta ei tule kunnes vierailet sivulla sisään kirjautuneena. Voit myös nollata ilmoitukset kaikille tarkkailemillesi sivuille tarkkailulistallasi.\n\n             {{GRAMMAR:genitive|{{SITENAME}}}} ilmoitusjärjestelmä\n\n--\nVoit muuttaa sähköpostimuistutusten asetuksia osoitteessa:\n{{canonicalurl:{{#special:Preferences}}}}\n\nVoit muuttaa tarkkailulistasi asetuksia osoitteessa:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nVoit poistaa sivun tarkkailulistalta osoitteessa:\n$UNWATCHURL\n\nPalaute ja lisäapu osoitteessa:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "$WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nMuokkaajan yhteenveto: $PAGESUMMARY $PAGEMINOREDIT\n\nOta yhteyttä muokkaajaan:\nsähköposti: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nUusia ilmoituksia tästä sivusta ei tule kunnes vierailet sivulla sisään kirjautuneena. Voit myös nollata ilmoitukset kaikille tarkkailemillesi sivuille tarkkailulistallasi.\n\n             {{GRAMMAR:genitive|{{SITENAME}}}} ilmoitusjärjestelmä\n\n--\nVoit muuttaa sähköpostimuistutusten asetuksia osoitteessa:\n{{canonicalurl:{{#special:Preferences}}}}\n\nVoit muuttaa tarkkailulistasi asetuksia osoitteessa:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nVoit poistaa sivun tarkkailulistalta osoitteessa:\n$UNWATCHURL\n\nPalaute ja lisäapu osoitteessa:\n$HELPPAGE",
        "created": "luonut",
        "changed": "muuttanut",
        "deletepage": "Poista sivu",
        "protect-text": "Voit tarkastella ja muuttaa sivun '''$1''' suojaustasoa.",
        "protect-locked-blocked": "Et voi muuttaa sivun suojauksia, koska sinut on estetty. Alla on sivun ”'''$1'''” nykyiset suojaukset:",
        "protect-locked-dblock": "Sivun suojauksia ei voi muuttaa, koska tietokanta on lukittu. Alla on sivun ”'''$1'''” nykyiset suojaukset:",
-       "protect-locked-access": "Sinulla ei ole tarvittavia oikeuksia sivujen suojauksen muuttamiseen. Alla on sivun ”'''$1'''” nykyiset suojaukset:",
+       "protect-locked-access": "Sinun käyttäjätunnuksellasi ei ole oikeutta muuttaa sivujen suojauksia. \nTässä ovat nykyiset suojausasetukset sivulla <strong>$1</strong>:",
        "protect-cascadeon": "Tämä sivu on suojauksen kohteena, koska se on sisällytetty alla {{PLURAL:$1|olevaan suojattuun sivuun, jossa|oleviin suojattuihin sivuihin, joissa}} on kytketty tarttuva suojaus päälle.\n\nTämän sivun suojaustasoon tehdyillä muutoksilla ei ole vaikutusta sivuun muualta tarttuneeseen suojaukseen.",
        "protect-default": "Salli kaikki käyttäjät",
        "protect-fallback": "Salli vain käyttäjät, joilla on oikeus $1",
        "blockip": "Estä 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.",
-       "ipadressorusername": "IP-osoite tai käyttäjätunnus",
+       "ipaddressorusername": "IP-osoite tai käyttäjätunnus",
        "ipbexpiry": "Kesto",
        "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",
        "movepagetalktext": "Sivuun mahdollisesti liittyvä keskustelusivu siirtyy automaattisesti mukana, '''paitsi:'''\n*jos siirron kohdesivulla on olemassa keskustelusivu, joka ei ole tyhjä, tai\n*jos otat pois rastin alla olevasta ruudusta.\n\nNäissä tapauksissa sivu täytyy siirtää tai yhdistää käsin, jos se on tarpeen.",
        "movearticle": "Siirrettävä sivu:",
        "moveuserpage-warning": "'''Varoitus:''' Olet siirtämässä käyttäjäsivua. Huomaa, että vain sivu siirretään ja käyttäjää ''ei'' nimetä uudelleen.",
+       "movecategorypage-warning": "<strong>Varoitus:</strong> Olet siirtämässä luokkasivua. Ota huomioon, että ainoastaan luokan oma sivu siirretään ja että tämä toiminto <em>ei</em> luokittele tai itsestään siirrä vanhassa luokassa olevia sivuja uuteen luokkaan.",
        "movenologintext": "Sinun pitää olla rekisteröitynyt käyttäjä ja [[Special:UserLogin|kirjautua sisään]], jotta voisit siirtää sivun.",
        "movenotallowed": "Sinulla ei ole oikeutta siirtää sivuja.",
        "movenotallowedfile": "Sinulla ei ole oikeutta siirtää tiedostoja.",
        "cant-move-user-page": "Sinulla ei ole oikeutta siirtää käyttäjäsivuja (lukuun ottamatta alasivuja).",
        "cant-move-to-user-page": "Sinulla ei ole oikeutta siirtää sivua käyttäjäsivuksi (paitsi käyttäjän alasivuksi).",
+       "cant-move-category-page": "Sinulla ei ole oikeutta siirtää luokkien sivuja.",
+       "cant-move-to-category-page": "Sinulla ei ole oikeutta siirtää sivua luokkasivuksi.",
        "newtitle": "Uusi nimi sivulle:",
        "move-watch": "Tarkkaile tätä sivua",
        "movepagebtn": "Siirrä sivu",
        "tooltip-summary": "Kirjoita lyhyt yhteenveto",
        "interlanguage-link-title": "$1 — $2",
        "common.css": "/* Tämä sivu sisältää koko sivustoa muuttavia tyylejä. */",
-       "cologneblue.css": "/* Tämä sivu sisältää Kölnin sininen -ulkoasua muuttavia tyylejä. */",
        "monobook.css": "/* Tämä sivu sisältää Monobook-ulkoasua muuttavia tyylejä. */",
-       "modern.css": "/* Tämä sivu sisältää Moderni-ulkoasua muuttavia tyylejä. */",
        "vector.css": "/* Tämä sivu sisältää Vector-ulkoasua muuttavia tyylejä. */",
        "print.css": "/* Tämä sivu sisältää tulostettua sivua muuttavia tyylejä */",
        "noscript.css": "/* Tämä sivun tyylit muuttavat niiden käyttäjien tyylejä, joilla JavaScript ei ole käytössä */",
        "group-sysop.css": "/* Tämä sivun tyylit muuttavat ylläpitäjien tyylejä */",
        "group-bureaucrat.css": "/* Tämä sivun tyylit muuttavat byrokraattien tyylejä */",
        "common.js": "/* Tämän sivun JavaScript-koodi liitetään jokaiseen sivulataukseen */",
-       "cologneblue.js": "/* Tämän sivun JavaScript-koodi liitetään Kölnin sininen -tyyliin */",
        "monobook.js": "/* Tämän sivun JavaScript-koodi liitetään Monobook-tyyliin */",
-       "modern.js": "/* Tämän sivun JavaScript-koodi liitetään Moderni-tyyliin */",
        "vector.js": "/* Tämän sivun JavaScript-koodi liitetään Vector-tyyliin */",
        "group-autoconfirmed.js": "/* Tämän sivun JavaScript-koodi liitetään vain automaattisesti hyväksytyille käyttäjille */",
        "group-bot.js": "/* Tämän sivun JavaScript-koodi liitetään vain boteille */",
        "group-sysop.js": "/* Tämän sivun JavaScript-koodi liitetään vain ylläpitäjille */",
        "group-bureaucrat.js": "/* Tämän sivun JavaScript-koodi liitetään vain byrokraateille */",
-       "notacceptable": "Wikipalvelin ei voi näyttää tietoja muodossa, jota ohjelmasi voisi lukea.",
        "anonymous": "{{GRAMMAR:genitive|{{SITENAME}}}} {{PLURAL:$1|anonyymi käyttäjä|anonyymit käyttäjät}}",
        "siteuser": "{{GRAMMAR:genitive|{{SITENAME}}}} käyttäjä $1",
        "anonuser": "{{GRAMMAR:genitive|{{SITENAME}}}} anonyymi käyttäjä $1",
        "pageinfo-category-pages": "Sivujen määrä",
        "pageinfo-category-subcats": "Alaluokkien määrä",
        "pageinfo-category-files": "Tiedostojen määrä",
-       "skinname-cologneblue": "Kölnin sininen",
        "skinname-monobook": "Monobook",
-       "skinname-modern": "Moderni",
        "markaspatrolleddiff": "Merkitse tarkastetuksi",
        "markaspatrolledtext": "Merkitse muutos tarkastetuksi",
        "markedaspatrolled": "Muutos on tarkastettu",
        "newimages": "Uudet tiedostot",
        "imagelisttext": "Alla on {{PLURAL:$1|1 tiedosto|$1 tiedostoa}} lajiteltuna <strong>$2</strong>.",
        "newimages-summary": "Tällä toimintosivulla on viimeisimmät tallennetut tiedostot.",
-       "newimages-legend": "Suodin",
+       "newimages-legend": "Suodatin",
        "newimages-label": "Tiedostonimi (tai osa siitä)",
-       "showhidebots": "($1 botit)",
+       "newimages-showbots": "Näytä bottien tekemät tallennukset",
        "noimages": "Ei uusia tiedostoja.",
        "ilsubmit": "Hae",
        "bydate": "päiväyksen mukaan",
        "size-kilobytes": "$1 KiB",
        "size-megabytes": "$1 MiB",
        "size-gigabytes": "$1 GiB",
-       "livepreview-loading": "Ladataan…",
-       "livepreview-ready": "Ladataan… Valmis!",
-       "livepreview-failed": "Pikaesikatselu epäonnistui!\nYritä normaalia esikatselua.",
-       "livepreview-error": "Yhdistäminen epäonnistui: $1 ”$2”\nYritä normaalia esikatselua.",
        "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.",
-       "watchlistedit-numitems": "Tarkkailulistallasi on {{PLURAL:$1|yksi sivu|$1 sivua}}, lukuun ottamatta keskustelusivuja.",
-       "watchlistedit-noitems": "Tarkkailulistasi on tyhjä.",
        "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]].",
        "watchlistedit-raw-done": "Tarkkailulistasi on päivitetty.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Yksi sivu|$1 sivua}} lisättiin:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Yksi sivu|$1 sivua}} poistettiin:",
+       "watchlistedit-clear-title": "Tyhjä tarkkailulista",
+       "watchlistedit-clear-legend": "Tyhjennä tarkkailulista",
+       "watchlistedit-clear-explain": "Kaikki sivut poistetaan tarkkailulistaltasi",
+       "watchlistedit-clear-titles": "Sivujen nimet:",
+       "watchlistedit-clear-submit": "Tyhjennä tarkkailulista (pysyvästi ja peruuttamattomasti!)",
+       "watchlistedit-clear-done": "Tarkkailulistasi on tyhjennetty.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|Yksi sivu|$1 sivua}} on poistettu:",
+       "watchlistedit-too-many": "Luettelossa on liikaa sivuja näytettäväksi tässä.",
+       "watchlisttools-clear": "Tyhjennä tarkkailulista",
        "watchlisttools-view": "Näytä tarkkaillut muutokset",
        "watchlisttools-edit": "Katso ja muokkaa tarkkailulistaa",
        "watchlisttools-raw": "Muokkaa listaa raakamuodossa",
        "compare-invalid-title": "Antamasi sivun nimi on virheellinen.",
        "compare-title-not-exists": "Määrittämääsi sivua ei ole.",
        "compare-revision-not-exists": "Määrittämääsi versiota ei ole.",
-       "dberr-header": "Wikissä on tietokantaongelma",
        "dberr-problems": "Tällä sivustolla on teknisiä ongelmia.",
        "dberr-again": "Odota hetki ja lataa sivu uudelleen.",
        "dberr-info": "(Tietokantapalvelimeen yhdistäminen epäonnistui: $1)",
        "htmlform-no": "Ei",
        "htmlform-yes": "Kyllä",
        "htmlform-chosen-placeholder": "Valitse vaihtoehto",
+       "htmlform-cloner-create": "Lisää enemmän",
+       "htmlform-cloner-delete": "Poista",
+       "htmlform-cloner-required": "Vähintään yksi arvo on pakollinen.",
        "sqlite-has-fts": "$1, jossa on tuki kokotekstihaulle",
        "sqlite-no-fts": "$1, jossa ei ole tukea kokotekstihaulle",
        "logentry-delete-delete": "$1 {{GENDER:$2|poisti}} sivun $3",
index 9f51183..cd41181 100644 (file)
@@ -9,7 +9,8 @@
                        "S.Örvarr.S",
                        "Spacebirdy",
                        "Urhixidur",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Undirstrika leinki:",
@@ -22,7 +23,6 @@
        "tog-showtoolbar": "Vís rættingar-tóllinju",
        "tog-editondblclick": "Rætta síður við at tvíklikkja",
        "tog-editsectiononrightclick": "Rætta reglubrot við at høgraklikkja á reglubrotsyvirskrift",
-       "tog-rememberpassword": "Minst til mítt loyniorð á hesum kaga (í mesta lagi í $1 {{PLURAL:$1|dag|dagar}})",
        "tog-watchcreations": "Legg síður, sum eg stovni og fílur sum eg leggi út, afturat mínum eftirlitslista",
        "tog-watchdefault": "Legg síður sum eg rætti afturat mínum eftirlitslista",
        "tog-watchmoves": "Legg síður og fílur, sum eg flyti, afturat mínum eftirlitslista",
        "readonly_lag": "↓ Dátugrunnurin er blivin stongdur sjálvvirkandi meðan træla dátugrunna servararnir synkronisera við høvuðs dátugrunnin (master)",
        "internalerror": "Innvortis brek",
        "internalerror_info": "Innanhýsis villa: $1",
-       "fileappenderrorread": "Tað bar ikki til at lesa \"$1\" meðan endingin var sett til.",
-       "fileappenderror": "Kundi ikki seta endingina \"$1\" á \"$2\".",
        "filecopyerror": "Kundi ikki avrita fíluna \"$1\" til \"$2\".",
        "filerenameerror": "Kundi ikki umdoypa fílu \"$1\" til \"$2\".",
        "filedeleteerror": "Kundi ikki strika fíluna \"$1\".",
        "directorycreateerror": "Kundi ikki upprætta mappuna \"$1\".",
        "filenotfound": "Kundi ikki finna fílu \"$1\".",
-       "fileexistserror": "Kundi ikki upprætta \"$1\": fílan er longu til",
        "unexpected": "Óvæntað virði: \"$1\"=\"$2\".",
        "formerror": "Villa: Kundi ikki senda skránna.",
        "badarticleerror": "Hendan gerðin kann ikki fremjast á hesi síðu.",
        "userlogin-resetpassword-link": "Hevur tú gloymt títt loyniorð?",
        "userlogin-loggedin": "Tú ert longu innritað/ur sum {{GENDER:$1|$1}}.\nNýt formularin niðanfyri fyri at rita inn sum ein annar brúkari.",
        "userlogin-createanother": "Stovna eina aðra kontu",
-       "createacct-join": "Skrivað tínar upplýsingar niðanfyri.",
-       "createacct-another-join": "Skriva upplýsingarnar fyri tað nýggju kontuna niðanfyri.",
        "createacct-emailrequired": "Teldupost adressa",
        "createacct-emailoptional": "Teldupost adressa (valfrítt)",
        "createacct-email-ph": "Skrivað tína email adressu",
        "savearticle": "Goym síðu",
        "preview": "Forskoðan",
        "showpreview": "Forskoðan",
-       "showlivepreview": "Beinleiðis forskoðan",
        "showdiff": "Sýn broytingar",
        "anoneditwarning": "'''Ávaring:''' Tú hevur ikki ritað inn.\nTín IP-adressa verður goymd í rættisøguni fyri hesa síðuna.",
        "anonpreviewwarning": "''Tú ert ikki innritað/ur. Um tú goymir nú, so verður tín IP adressa goymd í rættingar søguni hjá hesi síðu. ''",
        "search-nonefound": "Leitingin gav onki úrslit.",
        "powersearch-legend": "Víðkað leitan",
        "powersearch-ns": "Leita í navnaøkinum:",
-       "powersearch-redir": "Vís umvegir",
        "powersearch-togglelabel": "Kanna eftir:",
        "powersearch-toggleall": "Alt",
        "powersearch-togglenone": "Ongi",
        "prefs-advancedsearchoptions": "Víðkaðir møguleikar",
        "prefs-advancedwatchlist": "Víðkaðir møguleikar",
        "prefs-displayrc": "Vís møguleikar",
-       "prefs-displaysearchoptions": "Vís møguleikar",
        "prefs-displaywatchlist": "Vís møguleikar",
        "prefs-tokenwatchlist": "Lykil",
        "prefs-diffs": "Munir",
        "recentchanges-legend-heading": "'''Teknfrágreiðing:'''",
        "recentchanges-legend-newpage": "(sí eisini [[Special:NewPages|yvirlit yvir nýggjar síður]])",
        "rcnotefrom": "Niðanfyri standa broytingarnar síðani '''$2''', (upp til '''$1''' er sýndar).",
-       "rclistfrom": "Sýn nýggjar broytingar byrjandi við $1",
+       "rclistfrom": "Sýn nýggjar broytingar byrjandi við $3 $2",
        "rcshowhideminor": "$1 minni rættingar",
        "rcshowhidebots": "$1 bottar",
        "rcshowhideliu": "$1 skrásettir brúkarar",
        "watchlist-details": "{{PLURAL:$1|$1 síða|$1 síður}} á tínum vaktarlista, kjaksíður ikki íroknaðar.",
        "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'''.",
-       "watchmethod-recent": "kanna eftir nýligum rættingum á eftirlitssíðum",
-       "watchmethod-list": "kannar síður undir eftirliti fyri feskar broytingar",
-       "watchlistcontains": "Títt eftirlit inniheldur {{PLURAL:$1|eina síðu|$1 síður}}.",
-       "iteminvalidname": "Trupulleiki við luti '$1', ógyldugt navn...",
        "wlshowlast": "Vís seinastu $1 tímar $2 dagar $3",
        "watchlist-options": "Møguleikar í ansingarlistanum",
        "watching": "Eftirlitir...",
        "tooltip-undo": "\"Angra\" tekur burtur hesa rættingina og letur upp rættingarsíðuna við forskoðan. Tað loyvir at tú skrivar eina orsøk í samandráttin.",
        "tooltip-preferences-save": "Goym innstillingar",
        "tooltip-summary": "Skriva stuttan samandrátt",
-       "notacceptable": "Wiki ambætarin kann ikki veita dáta í einum formati, sum tín viðskiftari (klientur) kann lesa.",
        "anonymous": "Dulnevndir {{PLURAL:$1|brúkari|brúkarar}} í {{SITENAME}}",
        "siteuser": "{{SITENAME}}brúkari $1",
        "anonuser": "{{SITENAME}} dulnevndur brúkari $1",
        "autosumm-replace": "Innihaldið á síðuni bleiv skift út við \"$1\"",
        "autoredircomment": "Víðaristillaði síðuna til [[$1]]",
        "autosumm-new": "Stovnaði síðu við \"$1\"",
-       "livepreview-loading": "Innlesur...",
        "watchlistedit-normal-title": "Rætta eftirlit",
        "watchlistedit-raw-title": "Rætta rátt eftirlit",
        "watchlistedit-raw-legend": "Rætta rátt eftirlit",
        "compare-rev1": "Versjón 1",
        "compare-rev2": "Versjón 2",
        "compare-submit": "Samanber",
-       "dberr-header": "Henda wikiin hevur ein trupulleika",
        "rightsnone": "(ongin)",
        "searchsuggest-search": "Leita",
        "api-error-empty-file": "Fílan sum tú sendi inn var tóm.",
index 61d129d..8d195e5 100644 (file)
                        "Zetud",
                        "Zolo",
                        "Горан Анђелковић",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라",
+                       "Scoopfinder"
                ]
        },
        "tog-underline": "Souligner les liens :",
        "tog-hidepatrolled": "Masquer les modifications surveillées dans les modifications récentes",
        "tog-newpageshidepatrolled": "Masquer les pages surveillées dans la liste des nouvelles pages",
        "tog-extendwatchlist": "Étendre la liste de suivi pour afficher toutes les modifications et pas uniquement les plus récentes",
-       "tog-usenewrc": "Grouper les changements par page dans les modifications récentes et la liste de suivi (nécessite JavaScript)",
+       "tog-usenewrc": "Grouper les changements par page dans les modifications récentes et la liste de suivi",
        "tog-numberheadings": "Numéroter automatiquement les titres de section",
        "tog-showtoolbar": "Afficher la barre d'outils de modification (nécessite JavaScript)",
        "tog-editondblclick": "Modifier des pages sur double-clic (nécessite JavaScript)",
        "vector-action-unprotect": "Changer la protection",
        "vector-view-create": "Créer",
        "vector-view-edit": "Modifier",
-       "vector-view-history": "Afficher l'historique",
+       "vector-view-history": "Afficher lhistorique",
        "vector-view-view": "Lire",
        "vector-view-viewsource": "Voir la source",
        "actions": "Actions",
        "jumptonavigation": "navigation",
        "jumptosearch": "rechercher",
        "view-pool-error": "Désolé, les serveurs sont surchargés en ce moment.\nTrop d'utilisateurs cherchent à consulter cette page.\nVeuillez attendre un moment avant de retenter l'accès à cette page.\n\n$1",
+       "generic-pool-error": "Désolé, les serveurs sont surchargés pour le moment.\nTrop d’utilisateurs essayent de consulter cette ressource.\nVeuillez attendre un peu avant de réessayer d’accéder à celle-ci.",
        "pool-timeout": "Délai d'attente dépassé",
        "pool-queuefull": "La file d'attente est pleine",
        "pool-errorunknown": "Erreur inconnue",
        "readonly": "Base de données verrouillée",
        "enterlockreason": "Indiquez la raison du verrouillage ainsi qu'une estimation de sa durée",
        "readonlytext": "Les ajouts et mises à jour de la base de données sont actuellement bloqués, probablement pour permettre la maintenance de la base, après quoi, tout rentrera dans l'ordre.\n\nL'administrateur ayant verrouillé la base de données a fourni l'explication suivante :<br />$1",
-       "missing-article": "La base de données n'a pas trouvé le texte d'une page qu'elle aurait dû trouver, intitulée « $1 » $2.\n\nGénéralement, cela survient en suivant un lien vers un diff périmé ou vers l'historique d'une page supprimée.\n\nSi ce n'est pas le cas, il peut s'agir d'un bug dans le programme.\nVeuillez le signaler à un [[Special:ListUsers/sysop|administrateur]] sans oublier de lui indiquer l'URL du lien.",
+       "missing-article": "La base de données n’a pas trouvé le texte d’une page qu’elle aurait dû trouver, intitulée « $1 » $2.\n\nGénéralement, cela survient en suivant un lien vers un diff périmé ou vers l’historique d’une page supprimée.\n\nSi ce n’est pas le cas, il peut s’agir d’un bogue dans le programme.\nVeuillez le signaler à un [[Special:ListUsers/sysop|administrateur]] sans oublier de lui indiquer l’URL du lien.",
        "missingarticle-rev": "(numéro de version : $1)",
        "missingarticle-diff": "(diff : $1, $2)",
        "readonly_lag": "La base de données a été automatiquement verrouillée pendant que les serveurs secondaires rattrapent leur retard sur le serveur principal.",
        "internalerror": "Erreur interne",
        "internalerror_info": "Erreur interne : $1",
-       "fileappenderrorread": "Impossible de lire « $1 » lors de l'insertion",
-       "fileappenderror": "Impossible d'ajouter « $1 » à « $2 ».",
        "filecopyerror": "Impossible de copier le fichier « $1 » vers « $2 ».",
        "filerenameerror": "Impossible de renommer le fichier « $1 » en « $2 ».",
        "filedeleteerror": "Impossible de supprimer le fichier « $1 ».",
        "directorycreateerror": "Impossible de créer le dossier « $1 ».",
        "filenotfound": "Impossible de trouver le fichier « $1 ».",
-       "fileexistserror": "Impossible d'écrire le fichier « $1 » : le fichier existe.",
        "unexpected": "Valeur inattendue : « $1 » = « $2 ».",
        "formerror": "Erreur : Impossible de soumettre le formulaire.",
        "badarticleerror": "Cette action ne peut pas être effectuée sur cette page.",
        "userlogin-helplink2": "Aide à la connexion",
        "userlogin-loggedin": "Vous êtes déjà connecté{{GENDER:$1||e}} en tant que {{GENDER:$1|$1}}.\nUtilisez le formulaire ci-dessous pour vous connecter avec un autre compte utilisateur.",
        "userlogin-createanother": "Créer un autre compte",
-       "createacct-join": "Entrez vos informations ci-dessous.",
-       "createacct-another-join": "Saisir les informations du nouveau compte ci-dessous.",
        "createacct-emailrequired": "Adresse de courriel",
        "createacct-emailoptional": "Adresse de courriel (facultative)",
        "createacct-email-ph": "Entrez votre adresse de courriel",
        "savearticle": "Enregistrer",
        "preview": "Prévisualisation",
        "showpreview": "Prévisualiser",
-       "showlivepreview": "Aperçu rapide",
        "showdiff": "Voir les modifications",
-       "anoneditwarning": "'''Attention :''' vous n'êtes pas identifié(e). Votre adresse IP sera enregistrée dans l'historique de cette page.",
-       "anonpreviewwarning": "''Vous n'êtes pas identifié. Sauvegarder enregistrera votre adresse IP dans l'historique des modifications de la page.''",
+       "anoneditwarning": "'''Attention :''' vous n’êtes pas identifié(e). Votre adresse IP sera enregistrée dans l’historique de cette page.",
+       "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.",
        "missingcommentheader": "'''Rappel :''' vous n'avez pas fourni de sujet ou de titre à ce commentaire.\nSi vous cliquez de nouveau sur « {{int:Savearticle}} », votre modification sera enregistrée sans titre.",
        "edit-gone-missing": "N'a pas pu mettre à jour la page.\nIl semble qu'elle ait été supprimée.",
        "edit-conflict": "Conflit de modification.",
        "edit-no-change": "Votre modification a été ignorée car aucun changement n'a été fait au texte.",
-       "postedit-confirmation": "Votre modification a été enregistrée.",
+       "postedit-confirmation-created": "La page a été créée.",
+       "postedit-confirmation-restored": "La page a été restaurée.",
+       "postedit-confirmation-saved": "Votre modification a été enregistrée.",
        "edit-already-exists": "La nouvelle page n'a pas pu être créée.\nElle existe déjà.",
        "defaultmessagetext": "Message par défaut",
        "content-failed-to-parse": "Échec de l’analyse syntaxique du contenu de $2 pour le modèle $1: $3",
        "parser-template-recursion-depth-warning": "Limite de profondeur des appels de modèles dépassée ($1)",
        "language-converter-depth-warning": "Limite de profondeur du convertisseur de langue dépassée ($1)",
        "node-count-exceeded-category": "Pages où nombre de nœuds est dépassé",
+       "node-count-exceeded-category-desc": "Une catégorie pour les pages où le nombre de nœuds est dépassé.",
        "node-count-exceeded-warning": "Page dépassant le nombre de nœuds",
        "expansion-depth-exceeded-category": "Pages où la profondeur d'expansion est dépassée",
+       "expansion-depth-exceeded-category-desc": "Ceci est une catégorie pour les pages où la profondeur d’expansion est dépassée.",
        "expansion-depth-exceeded-warning": "Page dépassant la profondeur d'expansion",
        "parser-unstrip-loop-warning": "Boucle non démontable détectée",
        "parser-unstrip-recursion-limit": "Limite de récursion non démontable dépassée ($1)",
        "page_first": "première",
        "page_last": "dernière",
        "histlegend": "Légende : ({{int:cur}}) = différence avec la version actuelle, ({{int:last}}) = différence avec la version précédente, <b>{{int:minoreditletter}}</b> = modification mineure",
-       "history-fieldset-title": "Naviguer dans l'historique",
+       "history-fieldset-title": "Naviguer dans lhistorique",
        "history-show-deleted": "Masqués seulement",
        "histfirst": "les plus anciennes",
        "histlast": "les plus récentes",
        "revdelete-selected-text": "{{PLURAL:$1|Révision sélectionnée|Révisions sélectionnées}} de [[:$2]] :",
        "revdelete-selected-file": "{{PLURAL:$1|Version de fichier sélectionnée|Versions de fichier sélectionnées}} de [[:$2]] :",
        "logdelete-selected": "{{PLURAL:$1|Événement d'historique sélectionné|Événements d'historique sélectionnés}} :",
-       "revdelete-text-text": "Les révisions supprimées continueront à apparaître dans l'historique de la page, mais une partie de leur contenu sera inaccessible au public.",
-       "revdelete-text-file": "Les versions de fichier supprimées continueront à apparaître dans l'historique des fichiers, mais une partie de leur contenu sera indisponible au public.",
+       "revdelete-text-text": "Les révisions supprimées continueront à apparaître dans lhistorique de la page, mais une partie de leur contenu sera inaccessible au public.",
+       "revdelete-text-file": "Les versions de fichier supprimées continueront à apparaître dans lhistorique des fichiers, mais une partie de leur contenu sera indisponible au public.",
        "logdelete-text": "Les évènements du journal supprimés continueront à apparaître dans les journaux, mais une partie de leur contenu sera indisponible au public.",
        "revdelete-text-others": "Les autres administrateurs de {{SITENAME}} seront toujours capables d'accéder au contenu caché et peuvent le restaurer à nouveau par cette interface, à moins que des restrictions additionnelles soient définies.",
        "revdelete-confirm": "Confirmez que vous voulez effectuer cette action, que vous en comprenez les conséquences, et que vous le faites en accord avec [[{{MediaWiki:Policy-url}}|les règles]].",
        "suppressionlog": "Journal des masquages",
        "suppressionlogtext": "Voici la liste des masquages et des blocages qui portent sur du contenu caché aux administrateurs.\nVoir la [[Special:BlockList|liste des blocages]] pour la liste des bannissements et des blocages actuellement opérationnels.",
        "mergehistory": "Fusionner les historiques des pages",
-       "mergehistory-header": "Cette page vous permet de fusionner des versions de l'historique d'une page d'origine vers une nouvelle page.\nAssurez-vous que cette opération conservera la continuité de l'historique de la page.",
+       "mergehistory-header": "Cette page vous permet de fusionner des versions de l’historique d’une page d’origine vers une nouvelle page.\nAssurez-vous que cette opération conservera la continuité de l’historique de la page.",
        "mergehistory-box": "Fusionner les versions de deux pages :",
        "mergehistory-from": "Page d'origine :",
        "mergehistory-into": "Page de destination :",
        "mergelog": "Journal des fusions",
        "pagemerge-logentry": "[[$1]] fusionnée avec [[$2]] (versions jusqu'au $3)",
        "revertmerge": "Séparer",
-       "mergelogpagetext": "Voici la liste des fusions de l'historique d'une page dans celui d'une autre les plus récentes.",
+       "mergelogpagetext": "Voici la liste des plus récentes fusions de l’historique d’une page dans celui d’une autre.",
        "history-title": "$1 : Historique des versions",
        "difference-title": "$1 : Différence entre versions",
        "difference-title-multipage": "Différences entre les pages « $1 » et « $2 »",
        "searchmenu-exists": "'''Il existe une page nommée « [[:$1]] » sur ce wiki.''' {{PLURAL:$2|0=|Voyez également les autres résultats de votre recherche.}}",
        "searchmenu-new": "<strong>Créer la page « [[:$1|$1]] » sur ce wiki !</strong> {{PLURAL:$2|0=|Voyez également la page trouvée avec votre recherche.|Voyez également les résultats de votre recherche.}}",
        "searchprofile-articles": "Pages de contenu",
-       "searchprofile-project": "Pages d'aide et de projet",
        "searchprofile-images": "Multimédia",
        "searchprofile-everything": "Tout",
        "searchprofile-advanced": "Recherche avancée",
        "searchprofile-articles-tooltip": "Rechercher dans $1",
-       "searchprofile-project-tooltip": "Rechercher dans $1",
        "searchprofile-images-tooltip": "Rechercher des fichiers multimédias",
        "searchprofile-everything-tooltip": "Rechercher dans tout le site (y compris dans les pages de discussion)",
        "searchprofile-advanced-tooltip": "Choisir les espaces de noms pour la recherche",
        "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 :",
-       "powersearch-redir": "Afficher les redirections",
        "powersearch-togglelabel": "Cocher :",
        "powersearch-toggleall": "Tout",
        "powersearch-togglenone": "Aucune",
        "prefs-emailconfirm-label": "Confirmation du courriel :",
        "youremail": "Courriel :",
        "username": "{{GENDER:$1|Nom d'utilisateur|Nom d'utilisatrice}} :",
-       "uid": "Numéro d’{{GENDER:$1|utilisateur|utilisatrice}} :",
        "prefs-memberingroups": "{{GENDER:$2|Membre}} {{PLURAL:$1|du groupe|des groupes}}:",
        "prefs-registration": "Date d'inscription :",
        "yourrealname": "Nom réel :",
        "prefs-advancedsearchoptions": "Options avancées",
        "prefs-advancedwatchlist": "Options avancées",
        "prefs-displayrc": "Options d'affichage",
-       "prefs-displaysearchoptions": "Options d'affichage",
        "prefs-displaywatchlist": "Options d'affichage",
        "prefs-tokenwatchlist": "Jeton",
        "prefs-diffs": "Différences",
        "right-move": "Renommer des pages",
        "right-move-subpages": "Renommer des pages avec leurs sous-pages",
        "right-move-rootuserpages": "Renommer la page principale d'un utilisateur",
+       "right-move-categorypages": "Renommer des pages de catégorie",
        "right-movefile": "Renommer des fichiers",
        "right-suppressredirect": "Ne pas créer de redirection depuis le titre d'origine en renommant une page",
        "right-upload": "Importer des fichiers",
        "right-sendemail": "Envoyer un courriel aux autres utilisateurs",
        "right-passwordreset": "Voir les courriels de réinitialisation des mots de passe",
        "newuserlogpage": "Journal des créations de comptes utilisateur",
-       "newuserlogpagetext": "Cette page affiche l'historique des créations de comptes utilisateur.",
+       "newuserlogpagetext": "Cette page affiche lhistorique des créations de comptes utilisateur.",
        "rightslog": "Journal des modifications de droits d’utilisateurs",
-       "rightslogtext": "Voici l'historique des modifications des droits des utilisateurs.",
+       "rightslogtext": "Voici lhistorique des modifications des droits des utilisateurs.",
        "action-read": "lire cette page",
        "action-edit": "modifier cette page",
        "action-createpage": "créer des pages",
        "action-createtalk": "créer des pages de discussion",
        "action-createaccount": "créer ce compte utilisateur",
+       "action-history": "afficher l’historique de cette page",
        "action-minoredit": "marquer cette modification comme mineure",
        "action-move": "renommer cette page",
        "action-move-subpages": "renommer cette page et ses sous-pages",
        "action-move-rootuserpages": "renommer la page principale d'un utilisateur",
+       "action-move-categorypages": "renommer des pages de catégorie",
        "action-movefile": "renommer ce fichier",
        "action-upload": "importer ce fichier",
        "action-reupload": "écraser ce fichier existant",
        "action-writeapi": "utiliser l‘API d'écriture",
        "action-delete": "supprimer cette page",
        "action-deleterevision": "supprimer cette version",
-       "action-deletedhistory": "voir l'historique supprimé de cette page",
+       "action-deletedhistory": "voir lhistorique supprimé de cette page",
        "action-browsearchive": "rechercher des pages supprimées",
        "action-undelete": "restaurer cette page",
        "action-suppressrevision": "visionner et rétablir cette version supprimée",
        "action-patrol": "marquer la modification des autres comme relue",
        "action-autopatrol": "avoir votre modification marquée comme relue",
        "action-unwatchedpages": "voir la liste des pages non suivies",
-       "action-mergehistory": "fusionner l'historique de cette page",
+       "action-mergehistory": "fusionner lhistorique de cette page",
        "action-userrights": "modifier tous les droits d'utilisateur",
        "action-userrights-interwiki": "modifier les droits des utilisateurs sur d'autres wikis",
        "action-siteadmin": "verrouiller ou déverrouiller la base de données",
        "recentchanges-legend-newpage": "(voir aussi la [[Special:NewPages|liste des nouvelles pages]]).",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Ci-dessous les modifications effectuées depuis le <strong>$2</strong> (jusqu’à <strong>$1</strong> affichés).",
-       "rclistfrom": "Afficher les nouvelles modifications depuis le $1.",
+       "rclistfrom": "Afficher les nouvelles modifications depuis le $3 à $2",
        "rcshowhideminor": "$1 les modifications mineures",
        "rcshowhideminor-show": "Afficher",
        "rcshowhideminor-hide": "Masquer",
        "uploadstash-refresh": "Actualiser la liste des fichiers",
        "invalid-chunk-offset": "Offset de segment non valide",
        "img-auth-accessdenied": "Accès refusé",
-       "img-auth-nopathinfo": "PATH_INFO manquant.\nVotre serveur n'est pas paramétré pour passer cette information.\nIl fonctionne peut-être en CGI et ne supporte pas img_auth.\nVoyez https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "PATH_INFO manquant.\nVotre serveur n'est pas paramétré pour transmettre cette information.\nIl fonctionne peut-être en CGI et ne supporte pas img_auth.\nVoir : https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Le chemin demandé n'est pas le répertoire d'import configuré.",
        "img-auth-badtitle": "Impossible de construire un titre valide à partir de « $1 ».",
        "img-auth-nologinnWL": "Vous n'êtes pas connecté et « $1 » n'est pas dans la liste blanche.",
        "pageswithprop-prophidden-binary": "valeur de propriété binaire masquée ($1)",
        "doubleredirects": "Doubles redirections",
        "doubleredirectstext": "Voici une liste des pages qui redirigent vers des pages qui sont elles-mêmes des pages de redirection.\nChaque entrée contient des liens vers la première et la seconde redirections, ainsi que la première ligne de texte de la seconde page, ce qui fournit habituellement la « vraie » page cible, vers laquelle la première redirection devrait rediriger.\nLes entrées <del>barrées</del> ont été résolues.",
-       "double-redirect-fixed-move": "Cette redirection, dont la cible [[$1]] a été renommée, mène maintenant vers [[$2]].",
-       "double-redirect-fixed-maintenance": "Corrige la double redirection de [[$1]] vers [[$2]].",
+       "double-redirect-fixed-move": "[[$1]] a été déplacé.\nIl a été mis à jour automatiquement et redirige maintenant vers [[$2]].",
+       "double-redirect-fixed-maintenance": "Correction automatique de la double redirection de [[$1]] vers [[$2]] dans une tâche de maintenance.",
        "double-redirect-fixer": "Correcteur de redirection",
        "brokenredirects": "Redirections cassées",
        "brokenredirectstext": "Ces redirections mènent vers des pages inexistantes :",
        "listusers-creationsort": "Trier par date de création",
        "listusers-desc": "Trier en ordre descendant",
        "usereditcount": "$1 modification{{PLURAL:$1||s}}",
-       "usercreated": "{{GENDER:$3|Créé}} le $1 à $2",
+       "usercreated": "Créé le $1 à $2",
        "newpages": "Nouvelles pages",
        "newpages-username": "Nom d'utilisateur :",
        "ancientpages": "Pages les plus anciennement modifiées",
        "log-title-wildcard": "Chercher parmi les titres commençant par ce texte",
        "showhideselectedlogentries": "Afficher/masquer les entrées de journal sélectionnées",
        "allpages": "Toutes les pages",
-       "alphaindexline": "de $1 à $2",
        "nextpage": "Page suivante ($1)",
        "prevpage": "Page précédente ($1)",
        "allpagesfrom": "Afficher les pages à partir de :",
        "watchnologin": "Non connecté",
        "addwatch": "Ajouter à la liste de suivi",
        "addedwatchtext": "La page « [[:$1]] » a été ajoutée à votre [[Special:Watchlist|liste de suivi]].\nLes prochaines modifications de cette page et de la page de discussion associée y seront répertoriées.",
+       "addedwatchtext-short": "La page « $1 » a été ajoutée à votre liste de suivi.",
        "removewatch": "Supprimer de la liste de suivi",
        "removedwatchtext": "La page « [[:$1]] » a été retirée de votre [[Special:Watchlist|liste de suivi]].",
+       "removedwatchtext-short": "La page « $1 » a été supprimée de votre liste de suivi.",
        "watch": "Suivre",
        "watchthispage": "Suivre cette page",
        "unwatch": "Ne plus suivre",
        "watchlist-details": "{{PLURAL:$1|$1 page|$1 pages}} dans votre liste de suivi, sans compter les pages de discussion.",
        "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'''.",
-       "watchmethod-recent": "vérification des modifications récentes pour y trouver des pages suivies",
-       "watchmethod-list": "vérification des pages suivies pour y trouver des modifications récentes",
-       "watchlistcontains": "Votre liste de suivi référence $1 page{{PLURAL:$1||s}}.",
-       "iteminvalidname": "Problème avec l'élément « $1 » : le nom est invalide.",
        "wlnote2": "Ci-dessous les modifications dans {{PLURAL:$1|la dernière heure|les <strong>$1</strong> dernières heures}}, à partir de $2, $3.",
        "wlshowlast": "Montrer les dernières $1 heures, les derniers $2 jours ou bien $3",
        "watchlist-options": "Options de la liste de suivi",
        "enotif_lastvisited": "Voyez $1 pour tous les changements depuis votre dernière visite.",
        "enotif_lastdiff": "Voyez $1 pour visualiser ces changements.",
        "enotif_anon_editor": "utilisateur non-enregistré $1",
-       "enotif_body": "Cher $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nRésumé du contributeur : $PAGESUMMARY $PAGEMINOREDIT\n\nContactez ce contributeur :\ncourriel : $PAGEEDITOR_EMAIL\nwiki : $PAGEEDITOR_WIKI\n\nIl n’y aura pas d’autres notifications en cas de changements ultérieurs, à moins que vous ne visitiez cette page une fois connecté. Vous pouvez aussi réinitialiser les drapeaux de notification pour toutes les pages de votre liste de suivi.\n\nVotre système de notification de {{SITENAME}}\n\n--\nPour modifier les paramètres de notification par courriel, visitez\n{{canonicalurl:{{#special:Preferences}}}}\n\nPour modifier les paramètres de votre liste de suivi, visitez\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPour supprimer la page de votre liste de suivi, visitez\n$UNWATCHURL\n\nRetour et assistance :\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Cher $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nRésumé du contributeur : $PAGESUMMARY $PAGEMINOREDIT\n\nContactez ce contributeur :\ncourriel : $PAGEEDITOR_EMAIL\nwiki : $PAGEEDITOR_WIKI\n\nIl n’y aura pas d’autres notifications en cas de changements ultérieurs, à moins que vous ne visitiez cette page une fois connecté. Vous pouvez aussi réinitialiser les drapeaux de notification pour toutes les pages de votre liste de suivi.\n\nVotre système de notification de {{SITENAME}}\n\n--\nPour modifier les paramètres de notification par courriel, visitez\n{{canonicalurl:{{#special:Preferences}}}}\n\nPour modifier les paramètres de votre liste de suivi, visitez\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPour supprimer la page de votre liste de suivi, visitez\n$UNWATCHURL\n\nRetour et assistance :\n$HELPPAGE",
        "created": "créée",
        "changed": "modifiée",
        "deletepage": "Supprimer la page",
        "blockip": "Bloquer l’utilisateur",
        "blockip-legend": "Bloquer l’utilisateur",
        "blockiptext": "Utilisez le formulaire ci-dessous pour bloquer les tentatives de modification faites à partir d’une adresse IP spécifique ou d’un nom d’utilisateur.\nUne telle mesure ne devrait être prise que pour prévenir le vandalisme et en accord avec les [[{{MediaWiki:Policy-url}}|règles internes]].\nDonnez ci-dessous un motif précis (par exemple en citant les pages qui ont été vandalisées).",
-       "ipadressorusername": "Adresse IP ou nom d'utilisateur :",
+       "ipaddressorusername": "Adresse IP ou nom d'utilisateur :",
        "ipbexpiry": "Durée avant expiration :",
        "ipbreason": "Motif :",
        "ipbreason-dropdown": "* Motifs de blocage les plus fréquents\n** Insertion de fausses informations\n** Suppression injustifiée de contenu des pages\n** Insertion répétée de liens externes publicitaires (pollupostage)\n** Insertion de contenu sans aucun sens et de déchets dans les pages\n** Tentative d'intimidation ou harcèlement\n** Abus d'utilisation de comptes multiples\n** Nom d'utilisateur inacceptable, injurieux ou diffamant",
        "movepagetalktext": "La page de discussion associée, si présente, sera automatiquement renommée '''sauf si :'''\n* vous déplacez la page vers un autre espace de noms, ou\n* une page de discussion non vide existe déjà sous le nouveau nom, ou\n* vous décochez la case ci-dessous.\n\nDans ces cas-là, vous devrez renommer ou fusionner cette page de discussion manuellement si vous le désirez.",
        "movearticle": "Renommer la page :",
        "moveuserpage-warning": "'''Attention :''' Vous êtes sur le point de renommer une page d’utilisateur. Veuillez noter que seule la page sera renommée et que l’utilisateur '''ne''' sera '''pas''' renommé.",
+       "movecategorypage-warning": "<strong>Avertissement :</strong> Vous êtes sur le point de renommer une page de catégorie. Veuillez noter que seule la page sera renommée et que toutes les pages dans l'ancienne catégorie ne seront <em>pas</em> transférées dans la nouvelle.",
        "movenologintext": "Pour pouvoir renommer une page, vous devez être [[Special:UserLogin|identifié{{GENDER:||e|(e)}}]] avec un compte utilisateur enregistré et d'ancienneté suffisante.",
        "movenotallowed": "Vous n'avez pas la permission de renommer les pages.",
        "movenotallowedfile": "Vous n'avez pas la permission de renommer les fichiers.",
        "cant-move-user-page": "Vous n’avez pas la permission de renommer les pages principales d’utilisateurs.",
        "cant-move-to-user-page": "Vous n’avez pas la permission de renommer une page vers une page utilisateur (à l’exception d’une sous-page).",
+       "cant-move-category-page": "Vous n'avez pas la permis de renommer les pages de catégorie.",
+       "cant-move-to-category-page": "Vous n'avez pas la permission de renommer une page vers une page de catégorie.",
        "newtitle": "Vers le nouveau titre :",
        "move-watch": "Suivre les pages originale et nouvelle",
        "movepagebtn": "Renommer la page",
        "move-over-sharedrepo": "== Le fichier existe ==\n[[:$1]] existe déjà sur un dépôt partagé. Renommer ce fichier rendra le fichier sur le dépôt partage inaccessible.",
        "file-exists-sharedrepo": "Le nom choisi est déjà utilisé par un fichier sur un dépôt partagé.\nChoisissez un autre nom.",
        "export": "Exporter des pages",
-       "exporttext": "Vous pouvez exporter en XML le texte et l'historique d'une page ou d'un ensemble de pages ;\nle résultat peut alors être importé dans un autre wiki utilisant le logiciel MediaWiki via la [[Special:Import|page d'importation]].\n\nPour exporter des pages, entrez leurs titres dans la boîte de texte ci-dessous, à raison d'un titre par ligne. Sélectionnez si vous désirez ou non la version actuelle avec toutes les anciennes versions, avec les lignes de l'historique de la page, ou simplement la page actuelle avec des informations sur la dernière modification.\n\nDans ce dernier cas vous pouvez aussi utiliser un lien, tel que [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] pour la page [[{{MediaWiki:Mainpage}}]].",
+       "exporttext": "Vous pouvez exporter en XML le texte et l’historique d’une page ou d’un ensemble de pages ; le résultat peut alors être importé dans un autre wiki utilisant le logiciel MediaWiki via la [[Special:Import|page d’importation]].\n\nPour exporter des pages, entrez leurs titres dans la boîte de texte ci-dessous, à raison d’un titre par ligne. Sélectionnez si vous désirez la version actuelle avec toutes les anciennes versions, avec les lignes de l’historique de la page, ou simplement la page actuelle avec des informations sur la dernière modification.\n\nDans ce dernier cas vous pouvez aussi utiliser un lien, tel que [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] pour la page [[{{MediaWiki:Mainpage}}]].",
        "exportall": "Exporter toutes les pages",
-       "exportcuronly": "Exporter uniquement la version courante, sans l'historique complet",
-       "exportnohistory": "----\n'''Note :''' l'exportation de l'historique complet des pages à l'aide de ce formulaire a été désactivée pour des raisons de performance.",
+       "exportcuronly": "Exporter uniquement la version courante, sans lhistorique complet",
+       "exportnohistory": "----\n'''Note :''' l’exportation de l’historique complet des pages à l’aide de ce formulaire a été désactivée pour des raisons de performance.",
        "exportlistauthors": "Inclure une liste complète des contributeurs pour chaque page",
        "export-submit": "Exporter",
        "export-addcattext": "Ajouter les pages de la catégorie :",
        "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-history": "Copier toutes les versions de l'historique de cette page",
+       "import-interwiki-history": "Copier toutes les versions de lhistorique de cette page",
        "import-interwiki-templates": "Inclure tous les modèles",
        "import-interwiki-submit": "Importer",
        "import-interwiki-namespace": "Espace de noms de destination :",
        "tooltip-summary": "Entrez un bref résumé",
        "interlanguage-link-title": "$1 — $2",
        "common.css": "/* Le CSS placé ici sera appliqué à tous les habillages. */",
-       "cologneblue.css": "/* Le CSS placé ici affectera les utilisateurs de l’habillage Cologne Blue. */",
        "monobook.css": "/* Le CSS placé ici affectera les utilisateurs de l’habillage Monobook. */",
-       "modern.css": "/* Le CSS placé ici affectera les utilisateurs de l’habillage Modern. */",
        "vector.css": "/* Le CSS placé ici affectera les utilisateurs de l’habillage Vector. */",
        "print.css": "/* Le CSS placé ici affectera les impressions */",
        "noscript.css": "/* Le CSS placé ici affectera les utilisateurs ayant désactivé Javascript. */",
        "group-sysop.css": "/* Le CSS inclus ici n’affectera que les administrateurs */",
        "group-bureaucrat.css": "/* Le CSS inclus ici n’affectera que les bureaucrates */",
        "common.js": "/* Tout JavaScript ici sera chargé avec chaque page accédée par n’importe quel utilisateur. */",
-       "cologneblue.js": "/* Tout JavaScript ici sera chargé avec les pages accédées par les utilisateurs de l’habillage Bleu de cologne uniquement */",
        "monobook.js": "/* Tout JavaScript ici sera chargé avec les pages accédées par les utilisateurs de l’habillage MonoBook uniquement. */",
-       "modern.js": "/* Tout JavaScript ici sera chargé avec les pages accédées par les utilisateurs de l’habillage Moderne uniquement */",
        "vector.js": "/* Tout code JavaScript placé ici sera chargé pour les utilisateurs de l’habillage Vector */",
        "group-autoconfirmed.js": "/* Le JavaScript inclus ici n’affectera que les utilisateurs auto-confirmés */",
        "group-user.js": "/* Le JavaScript placé ici ne sera chargé que pour les utilisateurs enregistrés. */",
        "group-bot.js": "/* Le JavaScript inclus ici n’affectera que les robots */",
        "group-sysop.js": "/* Le JavaScript inclus ici n’affectera que les administrateurs */",
        "group-bureaucrat.js": "/* Le JavaScript inclus ici n’affectera que les bureaucrates */",
-       "notacceptable": "Ce serveur wiki ne peut pas fournir les données dans un format que votre client soit capable de lire.",
        "anonymous": "{{PLURAL:$1|Utilisateur non enregistré|Utilisateurs non enregistrés}} sur {{SITENAME}}",
        "siteuser": "{{GENDER:$2|l'utilisateur|l'utilisatrice|l'utilisateur}} $1 de {{SITENAME}}",
        "anonuser": "l'utilisateur anonyme $1 de {{SITENAME}}",
        "nocredits": "Il n'y a pas d'informations d'attribution disponibles pour cette page.",
        "spamprotectiontitle": "Filtre de protection anti-pollution",
        "spamprotectiontext": "La page que vous avez voulu sauvegarder a été bloquée par le filtre anti-pollution. Ceci est probablement dû à l'introduction d'un lien vers un site externe apparaissant sur la liste noire.",
-       "spamprotectionmatch": "La chaîne de caractères « '''$1''' » a déclenché le détecteur de spam.",
-       "spambot_username": "Nettoyage de spams par MediaWiki",
+       "spamprotectionmatch": "La chaîne de caractères « '''$1''' » a déclenché le détecteur de pollution.",
+       "spambot_username": "Nettoyage de pourriels par MediaWiki",
        "spam_reverting": "Rétablissement de la dernière version ne contenant pas de lien vers $1",
        "spam_blanking": "Toutes les versions contenant des liens vers $1 sont blanchies",
        "spam_deleting": "Toutes les versions contenaient des liens vers $1, suppression",
        "pageinfo-category-pages": "Nombre de pages",
        "pageinfo-category-subcats": "Nombre de sous-catégories",
        "pageinfo-category-files": "Nombre de fichiers",
-       "skinname-cologneblue": "Bleu de Cologne",
        "skinname-monobook": "Monobook",
-       "skinname-modern": "Moderne",
        "skinname-vector": "Vector",
        "markaspatrolleddiff": "Marquer comme relue",
        "markaspatrolledtext": "Marquer cette page comme relue",
        "markedaspatrollednotify": "Cette modification de $1 a été marquée comme relue.",
        "markedaspatrollederrornotify": "Échec du marquage comme contrôlé.",
        "patrol-log-page": "Journal des relectures",
-       "patrol-log-header": "Voici l'historique des versions relues.",
-       "log-show-hide-patrol": "$1 l'historique des relectures",
+       "patrol-log-header": "Voici lhistorique des versions relues.",
+       "log-show-hide-patrol": "$1 lhistorique des relectures",
        "deletedrevision": "Ancienne version $1 supprimée",
        "filedeleteerror-short": "Erreur lors de la suppression du fichier : $1",
        "filedeleteerror-long": "Des erreurs ont été rencontrées lors de la suppression du fichier :\n\n$1",
        "newimages-summary": "Cette page spéciale affiche les derniers fichiers importés.",
        "newimages-legend": "Nom du fichier",
        "newimages-label": "Nom du fichier (ou une partie de celui-ci) :",
-       "showhidebots": "($1 robots)",
+       "newimages-showbots": "Afficher les imports par des robots",
        "noimages": "Aucune image à afficher.",
        "ilsubmit": "Rechercher",
        "bydate": "par date",
        "bitrate-exabits": "$1&nbsp;Ebps",
        "bitrate-zetabits": "$1&nbsp;Zbps",
        "bitrate-yottabits": "$1&nbsp;Ybps",
-       "livepreview-loading": "Chargement...",
-       "livepreview-ready": "Chargement … terminé !",
-       "livepreview-failed": "L'aperçu rapide a échoué !\nEssayez la prévisualisation normale.",
-       "livepreview-error": "Impossible de se connecter : $1 « $2 ».\nEssayez la prévisualisation normale.",
        "lag-warn-normal": "Les modifications datant de moins de $1 seconde{{PLURAL:$1||s}} peuvent ne pas apparaître dans cette liste.",
        "lag-warn-high": "En raison d'un retard important du serveur de base de données, les modifications datant de moins de $1 seconde{{PLURAL:$1||s}} peuvent ne pas apparaître dans cette liste.",
-       "watchlistedit-numitems": "Votre liste de suivi contient {{PLURAL:$1|un titre|$1 titres}}, sans compter les pages de discussion.",
-       "watchlistedit-noitems": "Votre liste de suivi ne contient aucun titre.",
        "watchlistedit-normal-title": "Modifier la liste de suivi",
        "watchlistedit-normal-legend": "Retirer des titres de la liste de suivi",
        "watchlistedit-normal-explain": "Les titres de votre liste de suivi sont visibles ci-dessous.\nPour enlever un titre de la liste (et sa page de discussion), cochez la case à côté puis cliquez sur le bouton « {{int:Watchlistedit-normal-submit}} ».\nVous pouvez aussi [[Special:EditWatchlist/raw|modifier la liste en mode brut]].",
        "watchlistedit-raw-done": "Votre liste de suivi a été mise à jour.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Un titre a été ajouté|$1 titres ont été ajoutés}} :",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Un titre a été retiré|$1 titres ont été retirés}} :",
+       "watchlistedit-clear-title": "Liste de suivi vidée",
+       "watchlistedit-clear-legend": "Effacer la liste de suivi",
+       "watchlistedit-clear-explain": "Tous les titres seront supprimés de votre liste de suivi",
+       "watchlistedit-clear-titles": "Titres :",
+       "watchlistedit-clear-submit": "Effacer la liste de suivi (ceci est permanent !)",
+       "watchlistedit-clear-done": "Votre liste de suivi a été effacée.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|Un titre a été|$1 titres ont été}} retirés :",
+       "watchlistedit-too-many": "Il y a trop de pages à afficher ici.",
+       "watchlisttools-clear": "Effacer la liste de suivi",
        "watchlisttools-view": "Liste de suivi",
        "watchlisttools-edit": "Voir et modifier la liste de suivi",
        "watchlisttools-raw": "Modifier la liste de suivi en mode brut",
        "version-specialpages": "Pages spéciales",
        "version-parserhooks": "Greffons de l'analyseur syntaxique",
        "version-variables": "Variables",
-       "version-antispam": "Prévention du spam",
+       "version-antispam": "Prévention du pollupostage",
        "version-skins": "Habillages",
        "version-other": "Divers",
        "version-mediahandlers": "Manipulateurs de médias",
        "compare-invalid-title": "Le titre que vous avez spécifié n’est pas valide.",
        "compare-title-not-exists": "Le titre que vous avez spécifié n’existe pas.",
        "compare-revision-not-exists": "La révision que vous avez spécifiée n’existe pas.",
-       "dberr-header": "Ce wiki a un problème",
        "dberr-problems": "Désolé ! Ce site rencontre des difficultés techniques.",
        "dberr-again": "Essayez d'attendre quelques minutes et rechargez.",
        "dberr-info": "(Connexion au serveur de base de données impossible : $1)",
        "htmlform-no": "Non",
        "htmlform-yes": "Oui",
        "htmlform-chosen-placeholder": "Choisir une option",
+       "htmlform-cloner-create": "Ajouter encore",
+       "htmlform-cloner-delete": "Supprimer",
+       "htmlform-cloner-required": "Une valeur au moins est obligatoire.",
        "sqlite-has-fts": "$1 avec recherche en texte intégral supportée",
        "sqlite-no-fts": "$1 sans recherche en texte intégral supportée",
        "logentry-delete-delete": "$1 {{GENDER:$2|a supprimé}} la page $3",
index 3fa8297..1d41451 100644 (file)
@@ -4,7 +4,8 @@
                        "Cedric31",
                        "ChrisPtDe",
                        "Reedy",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Solegnér los lims :",
@@ -17,7 +18,6 @@
        "tog-showtoolbar": "Montrar la bârra d’outils de changement (at fôta de JavaScript)",
        "tog-editondblclick": "Changiér des pâges sur doblo-clic (at fôta de JavaScript)",
        "tog-editsectiononrightclick": "Activar lo changement de sèccions per clic drêt sur lors titros (at fôta de JavaScript)",
-       "tog-rememberpassword": "Sè rapelar de mon contresegno sur ceti navigator (por lo més $1 jorn{{PLURAL:$1||s}})",
        "tog-watchcreations": "Apondre les pâges que fé et pués los fichiérs que tèlèchârjo a ma lista de siuvu",
        "tog-watchdefault": "Apondre les pâges et los fichiérs que chanjo a ma lista de siuvu",
        "tog-watchmoves": "Apondre les pâges et los fichiérs que dèplaço a ma lista de siuvu",
        "readonly_lag": "La bâsa de balyês est étâye vèrrolyêe ôtomaticament pendent que los sèrviors secondèros ratrapont lor retârd sur lo sèrvior principâl.",
        "internalerror": "Fôta de dedens",
        "internalerror_info": "Fôta de dedens : $1",
-       "fileappenderrorread": "Y at pas moyen de liére « $1 » pendent l’aponsa.",
-       "fileappenderror": "Y at pas moyen d’apondre « $1 » a « $2 ».",
        "filecopyerror": "Y at pas moyen de copiyér lo fichiér « $1 » vers « $2 ».",
        "filerenameerror": "Y at pas moyen de renomar lo fichiér « $1 » en « $2 ».",
        "filedeleteerror": "Y at pas moyen de suprimar lo fichiér « $1 ».",
        "directorycreateerror": "Y at pas moyen de fâre lo rèpèrtouèro « $1 ».",
        "filenotfound": "Y at pas moyen de trovar lo fichiér « $1 ».",
-       "fileexistserror": "Y at pas moyen d’ècrire lo fichiér « $1 » : lo fichiér ègziste.",
        "unexpected": "Valor emprèvua : « $1 » = « $2 ».",
        "formerror": "Fôta : y at pas moyen de mandar lo formulèro.",
        "badarticleerror": "Cel’accion pôt pas étre fêta sur ceta pâge.",
        "gotaccountlink": "Branchiéd-vos",
        "userlogin-resetlink": "Vos éd oubliâ voutros dètalys de branchement ?",
        "userlogin-resetpassword-link": "Rebetar a zérô lo contresegno",
-       "createacct-join": "Buchiéd voutres enformacions ce-desot.",
-       "createacct-another-join": "Buchiéd les enformacions sur lo compto novél ce-desot.",
        "createacct-emailrequired": "Adrèce èlèctronica",
        "createacct-emailoptional": "Adrèce èlèctronica (u chouèx)",
        "createacct-email-ph": "Buchiéd voutron adrèce èlèctronica",
        "savearticle": "Encartar la pâge",
        "preview": "Apèrçu",
        "showpreview": "Montrar un apèrçu",
-       "showlivepreview": "Apèrçu drêt",
        "showdiff": "Montrar los changements",
        "anoneditwarning": "'''Atencion :''' vos éte pas branchiê(e).\nVoutron adrèce IP serat encartâye dedens l’historico des changements de ceta pâge.",
        "anonpreviewwarning": "''Vos éte pas branchiê(e). Sôvar encarterat voutron adrèce IP dedens l’historico des changements de ceta pâge.''",
        "edit-gone-missing": "Y at pas moyen de betar a jorn la pâge.\nSemble que seye étâye suprimâye.",
        "edit-conflict": "Conflit de changement.",
        "edit-no-change": "Voutron changement est étâ ignorâ, nion changement est étâ fêt u tèxto.",
-       "postedit-confirmation": "Voutron changement est étâ encartâ.",
+       "postedit-confirmation-saved": "Voutron changement est étâ encartâ.",
        "edit-already-exists": "Y at pas moyen de fâre na pâge novèla.\nÈgziste ja.",
        "defaultmessagetext": "Mèssâjo per dèfôt",
        "content-failed-to-parse": "Falyita de l’analisa du contegnu de $2 por lo modèlo $1 : $3",
        "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 :",
-       "powersearch-redir": "Listar les redirèccions",
        "powersearch-togglelabel": "Chouèsir :",
        "powersearch-toggleall": "Tôs",
        "powersearch-togglenone": "Pas yon",
        "prefs-advancedsearchoptions": "Chouèx avanciês",
        "prefs-advancedwatchlist": "Chouèx avanciês",
        "prefs-displayrc": "Chouèx de vua",
-       "prefs-displaysearchoptions": "Chouèx de vua",
        "prefs-displaywatchlist": "Chouèx de vua",
        "prefs-diffs": "Difèrences",
        "email-address-validity-valid": "L’adrèce èlèctronica semble justa",
        "recentchanges-label-unpatrolled": "Ceti changement est p’oncor étâ gouardâ",
        "recentchanges-legend-newpage": "$1 - pâge novèla",
        "rcnotefrom": "Vê-que los changements fêts dês lo '''$2''' (tant qu’a '''$1''' montrâs).",
-       "rclistfrom": "Montrar los novéls changements dês lo $1",
+       "rclistfrom": "Montrar los novéls changements dês lo $3 $2",
        "rcshowhideminor": "$1 los petiôts changements",
        "rcshowhidebots": "$1 los robots",
        "rcshowhideliu": "$1 los utilisators branchiês",
        "uploadstash-refresh": "Rafrèchir la lista des fichiérs",
        "invalid-chunk-offset": "Dèplacement de bocon pas justo",
        "img-auth-accessdenied": "Accès refusâ",
-       "img-auth-nopathinfo": "PATH_INFO manquenta.\nVoutron sèrvior est pas configurâ por passar cel’enformacion.\nPôt étre bâsâye sur CGI et vêr pas recognetre « img_auth ».\nVêde https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "PATH_INFO manquenta.\nVoutron sèrvior est pas configurâ por passar cel’enformacion.\nPôt étre bâsâye sur CGI et vêr pas recognetre « img_auth ».\nVêde https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Lo chemin demandâ est pas lo rèpèrtouèro de tèlèchargement configurâ.",
        "img-auth-badtitle": "Y at pas moyen de construire un titro justo dês « $1 ».",
        "img-auth-nologinnWL": "Vos éte pas branchiê et pués « $1 » est pas dedens la lista blanche.",
        "watchlist-details": "Y at $1 pâge{{PLURAL:$1||s}} dedens voutra lista de siuvu, sen comptar les pâges de discussion.",
        "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'''.",
-       "watchmethod-recent": "contrôlo des novéls changements por y trovar des pâges siuvues",
-       "watchmethod-list": "contrôlo de les pâges siuvues por y trovar des novéls changements",
-       "watchlistcontains": "Voutra lista de siuvu contint $1 pâge{{PLURAL:$1||s}}.",
-       "iteminvalidname": "Problèmo avouéc la piéce « $1 », nom pas justo...",
        "wlshowlast": "Montrar les $1 hores passâyes, los $2 jorns passâs ou ben $3",
        "watchlist-options": "Chouèx de la lista de siuvu",
        "watching": "Siuvu...",
        "enotif_lastvisited": "Vêde $1 por tôs los changements dês voutra dèrriére visita.",
        "enotif_lastdiff": "Vêde $1 por vêre cél changement.",
        "enotif_anon_editor": "utilisator anonimo $1",
-       "enotif_body": "Chier(a) $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nRèsumâ du contributor : $PAGESUMMARY $PAGEMINOREDIT\n\nVeriéd-vos vers lo contributor :\nmèl. : $PAGEEDITOR_EMAIL\nvouiqui : $PAGEEDITOR_WIKI\n\nY arat gins d’ôtra notificacion en câs de changements a vegnir, du muens que vos visiteyâd cela pâge. Vos pouede asse-ben rebetar a zérô los segnalements de notificacion por totes les pâges de voutra lista de siuvu.\n\nVoutron sistèmo de notificacion de {{SITENAME}}\n\n--\nPor changiér la configuracion de notificacion per mèssageria èlèctronica, visitâd\n{{canonicalurl:{{#special:Preferences}}}}\n\nPor changiér la configuracion de voutra lista de siuvu, visitâd\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPor suprimar la pâge de voutra lista de siuvu, visitâd\n$UNWATCHURL\n\nAvis et assistance de ples :\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Chier(a) $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nRèsumâ du contributor : $PAGESUMMARY $PAGEMINOREDIT\n\nVeriéd-vos vers lo contributor :\nmèl. : $PAGEEDITOR_EMAIL\nvouiqui : $PAGEEDITOR_WIKI\n\nY arat gins d’ôtra notificacion en câs de changements a vegnir, du muens que vos visiteyâd cela pâge. Vos pouede asse-ben rebetar a zérô los segnalements de notificacion por totes les pâges de voutra lista de siuvu.\n\nVoutron sistèmo de notificacion de {{SITENAME}}\n\n--\nPor changiér la configuracion de notificacion per mèssageria èlèctronica, visitâd\n{{canonicalurl:{{#special:Preferences}}}}\n\nPor changiér la configuracion de voutra lista de siuvu, visitâd\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPor suprimar la pâge de voutra lista de siuvu, visitâd\n$UNWATCHURL\n\nAvis et assistance de ples :\n$HELPPAGE",
        "created": "fêta",
        "changed": "changiê",
        "deletepage": "Suprimar la pâge",
        "blockip": "Blocar l’usanciér",
        "blockip-legend": "Blocar l’usanciér",
        "blockiptext": "Utilisâd lo formulèro ce-desot por blocar l’accès en ècritura dês una adrèce IP spècefica ou ben un nom d’usanciér.\nUna tâla mesera devrêt étre prêsa ren que por empachiér lo vandalismo et en acôrd avouéc les [[{{MediaWiki:Policy-url}}|règlles de dedens]].\nBalyéd ce-desot una rêson justa (per ègzemplo en citent les pâges qu’ont étâ vandalisâs).",
-       "ipadressorusername": "Adrèce IP ou ben nom d’usanciér :",
+       "ipaddressorusername": "Adrèce IP ou ben nom d’usanciér :",
        "ipbexpiry": "Temps devant èxpiracion :",
        "ipbreason": "Rêson :",
        "ipbreason-dropdown": "*Rêsons corentes de blocâjo\n** Entrebetâ d’enformacions fôsses\n** Suprèssion de contegnu de les pâges\n** Entrebetâ de lims de defôr publicitèros (spame)\n** Entrebetâ de contegnu sen gins de significacion et d’ècovelyes dedens les pâges\n** Tentativa d’entimidacion ou ben de torment\n** Abus d’usâjo d’un mouél de comptos\n** Nom d’utilisator pas accèptâblo",
        "group-bot.js": "/* Tot code JavaScript betâ ique serat chargiê ren que por los bots. */",
        "group-sysop.js": "/* Tot code JavaScript betâ ique serat chargiê ren que por los administrators. */",
        "group-bureaucrat.js": "/* Tot code JavaScript betâ ique serat chargiê ren que por los grata-papiérs. */",
-       "notacceptable": "Lo sèrvor vouiqui pôt pas balyér les balyês dens un format que voutron cliant est capâblo de liére.",
        "anonymous": "{{PLURAL:$1|Usanciér pas encartâ|Usanciérs pas encartâs}} dessus {{SITENAME}}",
        "siteuser": "l’usanciér{{GENDER:$2||e}} $1 de {{SITENAME}}",
        "anonuser": "l’usanciér pas encartâ $1 de {{SITENAME}}",
        "newimages-summary": "Ceta pâge spèciâla montre los dèrriérs fichiérs tèlèchargiês.",
        "newimages-legend": "Nom du fichiér",
        "newimages-label": "Nom du fichiér (ou ben una partia de ceti) :",
-       "showhidebots": "($1 los bots)",
        "noimages": "Gins de fichiér a fâre vêre.",
        "ilsubmit": "Rechèrchiér",
        "bydate": "per dâta",
        "size-kilobytes": "$1 Kio",
        "size-megabytes": "$1 Mio",
        "size-gigabytes": "$1 Gio",
-       "livepreview-loading": "Chargement...",
-       "livepreview-ready": "Chargement... chavonâ !",
-       "livepreview-failed": "L’apèrçu vito fêt at pas reussi !\nÈprovâd la prèvisualisacion normala.",
-       "livepreview-error": "Empossiblo de sè branchiér : $1 « $2 ».\nÈprovâd la prèvisualisacion normala.",
        "lag-warn-normal": "Los changements que dâtont de muens de $1 {{PLURAL:$1|seconda|secondes}} pôvont pas aparêtre dens ceta lista.",
        "lag-warn-high": "En rêson d’un retârd important du sèrvor de bâsa de balyês, los changements que dâtont de muens de $1 {{PLURAL:$1|seconda|secondes}} pôvont pas aparêtre dens ceta lista.",
-       "watchlistedit-numitems": "Voutra lista de survelyence contint {{PLURAL:$1|yon titro|$1 titros}}, sen comptar les pâges de discussion.",
-       "watchlistedit-noitems": "Voutra lista de survelyence contint gins de titro.",
        "watchlistedit-normal-title": "Changiér la lista de survelyence",
        "watchlistedit-normal-legend": "Enlevar des titros de la lista de survelyence",
        "watchlistedit-normal-explain": "Los titros de voutra lista de survelyence sont montrâs ce-desot.\nPor enlevar un titro (et sa pâge de discussion), pouentâd la câsa a coutâ et pués clicâd sur lo boton « {{int:Watchlistedit-normal-submit}} ».\nVos pouede asse-ben changiér la [[Special:EditWatchlist/raw|lista en fôrma bruta]].",
        "compare-invalid-title": "Lo titro que vos éd spècifiâ est envalido.",
        "compare-title-not-exists": "Lo titro que vos éd spècefiâ ègziste pas.",
        "compare-revision-not-exists": "La vèrsion que vos éd spècefiâ ègziste pas.",
-       "dberr-header": "Ceti vouiqui at un problèmo",
        "dberr-problems": "Dèsolâ ! Ceti seto rencontre des dificultâts tècniques.",
        "dberr-again": "Tâchiéd d’atendre doux-três menutes et pués rechargiéd.",
        "dberr-info": "(Branchement u sèrvor de bâsa de balyês empossiblo : $1)",
index 409bc24..624a890 100644 (file)
@@ -6,7 +6,8 @@
                        "Maartenvdbent",
                        "Merlissimo",
                        "Murma174",
-                       "Pyt"
+                       "Pyt",
+                       "아라"
                ]
        },
        "tog-underline": "Ferwisangen onerstrik:",
        "readonly_lag": "Det dootenbeenk as speret wurden, amdat jo ferdiald dootenbeenken (slaves) jo mä di hoodserver (master) ufglik kön.",
        "internalerror": "Süsteemfeeler",
        "internalerror_info": "Süsteemfeeler: $1",
-       "fileappenderrorread": "\"$1\" küd ei leesen wurd, auer diar jüst üüb skrewen woort.",
-       "fileappenderror": "\"$1\" küd ei bi \"$2\" bihinget wurd.",
        "filecopyerror": "Det datei $1 küd ei efter $2 kopiaret wurd.",
        "filerenameerror": "Det datei $1 küd ei efter $2 amnäämd wurd.",
        "filedeleteerror": "Det datei $1 küd ei stregen wurd.",
        "directorycreateerror": "Det fertiaknis \"$1\" küd ei iinracht wurd.",
        "filenotfound": "Det datei $1 küd ei fünjen wurd.",
-       "fileexistserror": "Uun det datei \"$1\" küd ei skrewen wurd: Hat as al diar.",
        "unexpected": "Mä di wäärs stemet wat ei: \"$1\"=\"$2\".",
        "formerror": "Feeler: Di iindrach küd ei ferwerket wurd.",
        "badarticleerror": "Son aktjuun koon üüb detdiar sidj ei föörnimen wurd.",
        "userlogin-helplink2": "Halep bi't uunmeldin",
        "userlogin-loggedin": "Du beest al üs {{GENDER:$1|$1}} uunmeldet.\nBrük det formulaar diar oner, am di mä en öödern nööm uuntumeldin.",
        "userlogin-createanother": "En ööder brükerkonto iinracht",
-       "createacct-join": "Du oner din dooten iin.",
-       "createacct-another-join": "Skriiw oner a dooten för't nei brükerkonto hen",
        "createacct-emailrequired": "E-mail adres",
        "createacct-emailoptional": "E-mail adres (optional)",
        "createacct-email-ph": "Du din e-mail adres iin",
        "savearticle": "Sidj seekre",
        "preview": "Iarst ans luke",
        "showpreview": "Iarst ans luke",
-       "showlivepreview": "Glik uunluke",
        "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.",
        "anonpreviewwarning": "\"Dü beest ei uunmeldet. Bi't seekrin woort din IP-adres uun a ferluup faan werjuunen aptiakent.\"",
        "edit-gone-missing": "Detdiar sidj küd ei aktualisiaret wurd. Ferlicht as det stregen wurden.",
        "edit-conflict": "Konflikt bi't bewerkin (BK).",
        "edit-no-change": "Din feranrang woort ei seekert, auer dü di tekst ei feranert heest.",
-       "postedit-confirmation": "Din feranrang as seekert wurden.",
+       "postedit-confirmation-saved": "Din feranrang as seekert wurden.",
        "edit-already-exists": "Det nei sidj küd ei iinracht wurd. Son sidj as al diar.",
        "defaultmessagetext": "Standard tekst",
        "content-failed-to-parse": "Parsing faan $2 för't model $1 ging skiaf: $3",
        "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:",
-       "powersearch-redir": "Widjerfeerangen uunwise",
        "powersearch-togglelabel": "Schük uun:",
        "powersearch-toggleall": "Aaltumaal",
        "powersearch-togglenone": "Nianen",
        "prefs-advancedsearchoptions": "Ütjwidjet mögelkhaiden",
        "prefs-advancedwatchlist": "Ütjwidjet mögelkhaiden",
        "prefs-displayrc": "Mögelkhaiden för't uunwisin",
-       "prefs-displaysearchoptions": "Mögelkhaiden för't uunwisin",
        "prefs-displaywatchlist": "Mögelkhaiden för't uunwisin",
        "prefs-tokenwatchlist": "Token",
        "prefs-diffs": "Ferskeel",
        "recentchanges-legend-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).",
-       "rclistfrom": "Bluas feranrangen sant $1 wise.",
+       "rclistfrom": "Bluas feranrangen sant $3 $2 wise",
        "rcshowhideminor": "$1 letj feranrangen",
        "rcshowhideminor-show": "Wise",
        "rcshowhideminor-hide": "Fersteeg",
        "uploadstash-refresh": "List mä datein aktualisiare.",
        "invalid-chunk-offset": "Di began as diar ei tuläät.",
        "img-auth-accessdenied": "Tugrip ei mögelk",
-       "img-auth-nopathinfo": "Diar as nään PATH_INFO.\nDi server koon detdiar informatjuun ei widjerdu.\nFerlicht as det uun CGI iinbünjen an komt diaram uk ei mä „img_auth“ turocht.\nÜüb det sidj https://www.mediawiki.org/wiki/Manual:Image_Authorization (ingelsk) stäänt diar muar auer.",
+       "img-auth-nopathinfo": "Diar as nään PATH_INFO.\nDi server koon detdiar informatjuun ei widjerdu.\nFerlicht as det uun CGI iinbünjen an komt diaram uk ei mä „img_auth“ turocht.\nÜüb det sidj https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization (ingelsk) stäänt diar muar auer.",
        "img-auth-notindir": "Detdiar fertiaknis as ei föörsen tu huuchschüüren.",
        "img-auth-badtitle": "Mä „$1“ küd nään tiitel maaget wurd.",
        "img-auth-nologinnWL": "Dü beest ei uunmeldet, an „$1“ stäänt ei uun't whitelist.",
        "watchlist-details": "Dü heest {{PLURAL:$1|1 sidj|$1 sidjen}} uun't uug.",
        "wlheader-enotif": "Di e-mail siinst as aktiif.",
        "wlheader-showupdated": "Nei feranert sidjen wurd '''fäät''' uunwiset.",
-       "watchmethod-recent": "Leetst feranrangen faan sidjen, diar dü uun't uug heest",
-       "watchmethod-list": "Sidjen, diar dü uun't uug heest, am a leetst feranrangen beluke",
-       "watchlistcontains": "Dü häälst $1 {{PLURAL:$1|sidj|sidjen}} uun't uug.",
-       "iteminvalidname": "Mä di iindrach „$1“ stemet wat ei, di nööm as ferkiard.",
        "wlnote2": "Diar stun a feranrangen faan a leetst {{PLURAL:$1|stünj|<strong>$1</strong> stünjen}}, üüb a stant faan $2, $3.",
        "wlshowlast": "Wise a feranrangen faan leetst $1 stünjen, $2 daar of $3.",
        "watchlist-options": "Iinstelangen för't uunwisin",
        "enotif_lastvisited": "Luke bi $1 am aal a feranrangen sant dan leetst beschük.",
        "enotif_lastdiff": "Luke bi $1 am det feranrang.",
        "enotif_anon_editor": "Anonüüm brüker $1",
-       "enotif_body": "Gud dai $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nTuupfaadet faan: $PAGESUMMARY $PAGEMINOREDIT\n\nKontakt tu di bewerker:\nE-mail: $PAGEEDITOR_EMAIL\nWiki: $PAGEEDITOR_WIKI\n\nDi wurd iarst ans nian e-mails muar tu detdiar sidj schüürd, bit dü det sidj weder uunmeldet beschükst. Üüb din list faan sidjen, diar dü uun't uug behual wel, könst dü a noorachtenkääntiaken weder turagsaat.\n\nDan frinjelk {{SITENAME}}-noorachten siinst\n\n--\nAm iinstelangen tu e-mail noorachten tu feranrin, gung tu {{canonicalurl:{{#special:Preferences}}}}.\n\nAm iinstelangen am sidjen, diar dü uun't uug behual wel, gung tu {{canonicalurl:{{#special:EditWatchlist}}}}.\n\nAm det sidj ei linger uun't uug tu behualen, gung tu $UNWATCHURL.\n\nHalep an muar diartu: {{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Gud dai $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nTuupfaadet faan: $PAGESUMMARY $PAGEMINOREDIT\n\nKontakt tu di bewerker:\nE-mail: $PAGEEDITOR_EMAIL\nWiki: $PAGEEDITOR_WIKI\n\nDi wurd iarst ans nian e-mails muar tu detdiar sidj schüürd, bit dü det sidj weder uunmeldet beschükst. Üüb din list faan sidjen, diar dü uun't uug behual wel, könst dü a noorachtenkääntiaken weder turagsaat.\n\nDan frinjelk {{SITENAME}}-noorachten siinst\n\n--\nAm iinstelangen tu e-mail noorachten tu feranrin, gung tu {{canonicalurl:{{#special:Preferences}}}}.\n\nAm iinstelangen am sidjen, diar dü uun't uug behual wel, gung tu {{canonicalurl:{{#special:EditWatchlist}}}}.\n\nAm det sidj ei linger uun't uug tu behualen, gung tu $UNWATCHURL.\n\nHalep an muar diartu: $HELPPAGE",
        "created": "maaget",
        "changed": "feranert",
        "deletepage": "Sidj strik",
        "blockip": "IP-adres/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.",
-       "ipadressorusername": "IP-adres of brükernööm:",
+       "ipaddressorusername": "IP-adres of brükernööm:",
        "ipbexpiry": "Sperdüür:",
        "ipbreason": "Grünj:",
        "ipbreason-dropdown": "* Mist brükt spergrünjer\n** Skraft wat ferkiards\n** Maaget sidjen leesag\n** Maaget tuföl ferwisangen üüb frääm sidjen\n** Maaget dom tschüch\n** Koon ham ei skake\n** Masbrükt brükerkontos\n** Hää en brükernööm, diar ei tuläät as",
        "tooltip-preferences-save": "Iinstelangen seekre",
        "tooltip-summary": "Faade det kurt tuup",
        "interlanguage-link-title": "$1 - $2",
-       "notacceptable": "Di Wiki-server koon a dooten ei för dan aperoot apwerke.",
        "anonymous": "{{PLURAL:$1|anonüümen brüker|anonüüm brükern}} üüb {{SITENAME}}",
        "siteuser": "{{SITENAME}}-brüker $1",
        "anonuser": "Anonüüm {{SITENAME}}-brüker $1",
        "newimages-summary": "Detdiar spezial-sidj wiset a tuleetst huuchschüürd datein uun.",
        "newimages-legend": "Filter",
        "newimages-label": "Dateinööm (of en dial diarfaan):",
-       "showhidebots": "(Bots $1)",
        "noimages": "Niks tu sen.",
        "ilsubmit": "Schük",
        "bydate": "efter dootem",
        "autosumm-replace": "Di tekst as ütjbütjet wurden mä \"$1\"",
        "autoredircomment": "Sidj tu [[$1]] widjerfeerd",
        "autosumm-new": "Det sidj as nei uunlaanj wurden: \"$1\"",
-       "livepreview-loading": "Loose ...",
-       "livepreview-ready": "Loosin ... Klaar!",
-       "livepreview-failed": "Live-preview wul ei!\nFerschük det üüb di normool wai.",
-       "livepreview-error": "Küd ei ferbinj: $1 \"$2\".\nFerschük det üüb di normool wai.",
        "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-numitems": "Dü heest {{PLURAL:$1|ian sidj|$1 sidjen}} uun't uug. A diskusjuunssidjen wurd ei mätääld.",
-       "watchlistedit-noitems": "Dü heest nian sidjen, diar dü uun't uug behual wel.",
        "watchlistedit-normal-title": "List mä sidjen, diar dü uun't uug behual wel, bewerke",
        "watchlistedit-normal-legend": "Ei muar uun't uug behual",
        "watchlistedit-normal-explain": "Jodiar sidjen wel dü uun't uug behual. Am iindracher tu striken, kääntiakne a kaschin üüb sidj faan di iindrach an trak oner üüb „{{int:Watchlistedit-normal-submit}}“. Dü könst det list uk uun't [[Special:EditWatchlist/raw|listenformoot]] bewerke.",
        "compare-invalid-title": "Didiar sidjennööm gongt ei.",
        "compare-title-not-exists": "Son sidjennööm as diar ei.",
        "compare-revision-not-exists": "Son werjuun as diar ei.",
-       "dberr-header": "Det Wiki hää komer.",
        "dberr-problems": "Dää mi iarag! Det sidj hää technisk komer.",
        "dberr-again": "Teew en uugenblak an ferschük det noch ans.",
        "dberr-info": "(Koon ei mä a dootenbeenk-server ferbinj: $1)",
index b4eea1d..5ccdd4c 100644 (file)
@@ -8,7 +8,8 @@
                        "Reedy",
                        "Tocaibon",
                        "Urhixidur",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Sotlinee leams",
@@ -21,7 +22,6 @@
        "tog-showtoolbar": "Mostre sbare dai imprescj pe modifiche (JavaScript)",
        "tog-editondblclick": "Cambie lis pagjinis fracant dôs voltis",
        "tog-editsectiononrightclick": "Modifiche une sezion fracant cul tast diestri<br /> sui titui des sezions",
-       "tog-rememberpassword": "Visiti di me su chest sgarfadôr (par un massim di $1 {{PLURAL:$1|zornade|zornadis}})",
        "tog-watchcreations": "Zonte  lis pagjinis creadis e i file cjariats aes oservadis specials",
        "tog-watchdefault": "Zonte in automatic lis pagjinis che o cambii inte liste di chês tignudis di voli",
        "tog-watchmoves": "Zonte in automatic lis pagjinis che o cambii inte liste di chês tignudis di voli",
        "readonly_lag": "Par cumò il database al è stât blocât pe sincronizazion cul server",
        "internalerror": "Erôr interni",
        "internalerror_info": "Erôr interni: $1",
-       "fileappenderrorread": "No si pues lei \"$1\" durant òa zonte",
-       "fileappenderror": "No si pues tacâ \"$1\" a \"$2\"",
        "filecopyerror": "No si pues copiâ il file \"$1\" in \"$2\"",
        "filerenameerror": "No si pues rinominâ \"$1\" in \"$2\"",
        "filedeleteerror": "No si pues eliminâ il file \"$1\".",
        "directorycreateerror": "No si pues creâ la cartele \"$1\"",
        "filenotfound": "No si pues cjatâ il file \"$1\".",
-       "fileexistserror": "No si pues scrivi il file \"$1\": al esist zà",
        "unexpected": "Valor no proviodût: \"$1\" = \"$2\"",
        "formerror": "Erôr: no si rive a mandâ il form",
        "badarticleerror": "Operazion no permetude in cheste pagjine",
        "savearticle": "Salve la pagjine",
        "preview": "Anteprime",
        "showpreview": "Mostre anteprime",
-       "showlivepreview": "Anteprime ''live''",
        "showdiff": "Mostre cambiaments",
        "anoneditwarning": "No tu sês jentrât cuntun non utent. La to direzion IP e vignarà regjistrade tal storic di cheste pagjine.",
        "missingsummary": "'''Atenzion:''' no tu âs specificât un ogjet par chest cambiament. Se tu tornis a fracâ su \"Salve la pagjine\", il cambiament al vignarà salvât cuntun ogjet vueit.",
        "search-nonefound": "Nissun risultât par cheste ricercje.",
        "powersearch-legend": "Ricercje avanzade",
        "powersearch-ns": "Cîr tai spazis dai nons:",
-       "powersearch-redir": "Elenc re-indreçaments",
        "search-external": "Ricercje esterne",
        "searchdisabled": "La ricercje in {{SITENAME}} no je ative. Tu puedis doprâ Google intant. Sta atent che lis lôr tabelis sul contignût di {{SITENAME}} a puedin jessi pôc inzornadis.",
        "preferences": "Preferencis",
        "recentchanges-label-unpatrolled": "Chest cambiament nol è stât ancjemò verificât",
        "recentchanges-label-plusminus": "La dimension de pagjine e je cambiade di chest numar di byte",
        "rcnotefrom": "Ca sot i cambiaments dal '''$2''' (fintremai al '''$1''').",
-       "rclistfrom": "Mostre i ultins cambiaments dal $1",
+       "rclistfrom": "Mostre i ultins cambiaments dal $3 $2",
        "rcshowhideminor": "$1 i piçui cambiaments",
        "rcshowhidebots": "$1 i bots",
        "rcshowhideliu": "$1 utents regjstrâts",
        "watchlist-details": "{{PLURAL:$1|E je $1 pagjine tignude|A son $1 pagjinis tignudis}} di voli, cence contâ lis pagjinis di discussion.",
        "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'''",
-       "watchlistcontains": "Tu stâs tignint di voli $1 {{PLURAL:$1|pagjine|pagjinis}}.",
        "wlshowlast": "Mostre ultimis $1 oris $2 zornadis $3",
        "watchlist-options": "Opzions pe liste dai tignûts di voli",
        "watching": "Daûr a zontâ aes pagjinis tignudis di voli...",
        "table_pager_limit_submit": "Va",
        "autosumm-blank": "Pagjine disvuedade fûr par fûr",
        "autosumm-new": "Creade la pagjine cun \"$1\"",
-       "livepreview-loading": "Daûr a cjamâ…",
-       "livepreview-ready": "Daûr a cjamâ… pront!",
-       "watchlistedit-numitems": "La liste des pagjinis tignudis di voli e conten {{PLURAL:$1|une pagjine|$1 pagjinis}}, cence contâ lis pagjinis di discussion.",
-       "watchlistedit-noitems": "La liste des pagjinis tignudis di voli e je vueide.",
        "watchlistedit-normal-title": "Modifiche tignûts di voli",
        "watchlistedit-normal-submit": "Elimine pagjinis",
        "watchlistedit-normal-done": "{{PLURAL:$1|1 pagjine e je stade eliminade|$1 pagjinis a son stadis eliminadis}} de liste des pagjinis tignudis di voli:",
        "tag-filter-submit": "Filtre",
        "tags-edit": "cambie",
        "tags-hitcount": "$1 {{PLURAL:$1|cambiament|cambiaments}}",
-       "dberr-header": "Cheste wiki e à un probleme",
        "dberr-problems": "Nus displâs, chest sît web al è daûr a vê dificoltâts tecnichis.",
        "dberr-again": "Prove a spietâ uns minûts e po torne a cjamâ la pagjine.",
        "dberr-info": "(No si pues contatâ il servidor de base di dâts: $1)",
index 12cb433..ece00d8 100644 (file)
@@ -10,7 +10,8 @@
                        "Shirayuki",
                        "Snakesteuben",
                        "Urhixidur",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Keppelings ûnderstreekje:",
        "readonly_lag": "De database is automatysk beskoattele wylst de ûndergeskikte databaseservers syngronisearje mei de haadserver.",
        "internalerror": "Ynterne fout",
        "internalerror_info": "Ynterne fout: $1",
-       "fileappenderror": "It tafoegjen fan \"$1\" oan \"$2\" is mislearre.",
        "filecopyerror": "Koe triem \"$1\" net kopiearje as \"$2\".",
        "filerenameerror": "Koe triem \"$1\" net werneame as \"$2\".",
        "filedeleteerror": "Koe triem \"$1\" net wiskje.",
        "directorycreateerror": "Map \"$1\" koe net oanmakke wurde.",
        "filenotfound": "Koe triem \"$1\" net fine.",
-       "fileexistserror": "Skriuwen nei triem \"$1\" ûnmûglik: de triem bestiet al",
        "unexpected": "Hommelse wearde: \"$1\"=\"$2\".",
        "formerror": "Fout: koe formulier net oerlizze",
        "badarticleerror": "Dat kin op dizze side net dien wurden.",
        "savearticle": "Fêstlizze",
        "preview": "Oerlêze",
        "showpreview": "Earst oerlêze",
-       "showlivepreview": "Bewurking foar kontrôle besjen",
        "showdiff": "Wizigings",
        "anoneditwarning": "'''Warskôging:''' Jo binne net oanmeld. By it fêstlizzen wurdt jo ynternetadres opnaam yn de sideskiednis.",
        "missingsummary": "'''Wink:''' jo hawwe gjin gearfetting jûn foar jo bewurking. As jo nochris op ''Side opslaan'' klikke wurdt de bewurking sûnder gearfetting opslein.",
        "edit-gone-missing": "De side kin net bywurke wurde.\nHy liket fuorthelle te wezen.",
        "edit-conflict": "Bewurkingskonflikt.",
        "edit-no-change": "Dyn bewurking is is net trochfierd, om 't der gjin feroaring yn 'e tekst oanbrocht is.",
-       "postedit-confirmation": "Dyn bewurking is fêstlein.",
+       "postedit-confirmation-saved": "Dyn bewurking is fêstlein.",
        "edit-already-exists": "De side is net oanmakke.\nHy bestie al.",
        "defaultmessagetext": "Standert berjochttekst",
        "expensive-parserfunction-warning": "Warskôging: Dizze side brûkt tefolle kostbere parserfunksjes.\n\nWylst it minder as $2 {{PLURAL:$2|parserfunksje|parserfunksjes}} wêze moatte, no {{PLURAL:$1|is it $1 |binne it $1}}",
        "search-nonefound": "Der binne gjin resultaten foar Jo sykopdracht.",
        "powersearch-legend": "Sykje",
        "powersearch-ns": "Sykje op nammeromten:",
-       "powersearch-redir": "Trochferwizings werjaan",
        "powersearch-togglelabel": "Oantikje:",
        "powersearch-toggleall": "Allegear",
        "powersearch-togglenone": "Gjin",
        "recentchanges-label-unpatrolled": "Dizze wiziging is noch net neisjûn",
        "recentchanges-legend-newpage": "$1 - nije side",
        "rcnotefrom": "Dit binne de feroarings sûnt <b>$2</b> (maksimaal <b>$1</b>).",
-       "rclistfrom": "Jou nije feroarings, begjinnende mei $1",
+       "rclistfrom": "Jou nije feroarings, begjinnende mei $3 $2",
        "rcshowhideminor": "$1 tekstwizigings",
        "rcshowhidebots": "bots $1",
        "rcshowhideliu": "$1 meidoggers",
        "unwatchthispage": "Ferjit dizze side",
        "notanarticle": "Dit kin net folge wurde.",
        "watchlist-details": "Jo folchlist hat {{PLURAL:$1|$1 side|$1 siden}}, oerlissiden net meiteld.",
-       "watchmethod-recent": "Koartlyn feroare ...",
-       "watchmethod-list": "Folge ...",
-       "watchlistcontains": "Jo folgje op it stuit $1 {{PLURAL:$1|side|siden}}.",
-       "iteminvalidname": "Misse namme: \"$1\" ...",
        "wlshowlast": "Lit feroarings sjen fan de lêste $1 oeren $2 dagen $3",
        "watching": "Dwaande mei op'e folchlist te setten ...",
        "unwatching": "Dwaande mei fan'e folchlist ôf te heljen ...",
        "enotif_impersonal_salutation": "meidogger fan {{SITENAME}}",
-       "enotif_body": "Bêste $WATCHINGUSERNAME,\n\nDe {{SITENAME}}side '$PAGETITLE' is op $PAGEEDITDATE $CHANGEDORCREATED troch meidogger $PAGEEDITOR;\nsjoch $PAGETITLE_URL foar de aktuele ferzje.\n\n$NEWPAGE\n\nGearfetting: $PAGESUMMARY $PAGEMINOREDIT\n\nFoar oerlis mei meidogger $PAGEEDITOR:\n- netpost: $PAGEEDITOR_EMAIL\n- wiki: $PAGEEDITOR_WIKI\n\nFierdere meldings wurde jo net tastjoerd, oant jo de side lêzen hawwe. Op jo folchlist kinne jo op 'e nij meldings foar al jo folge siden freegje.\n\n                 Jo freonlike {{SITENAME}}-meldingssysteem.\n\n--\nGean nei {{canonicalurl:{{#special:EditWatchlist}}}}\nom jo folchlistynstellings te feroarjen.\n\nReaksjes en fierdere help:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Bêste $WATCHINGUSERNAME,\n\nDe {{SITENAME}}side '$PAGETITLE' is op $PAGEEDITDATE $CHANGEDORCREATED troch meidogger $PAGEEDITOR;\nsjoch $PAGETITLE_URL foar de aktuele ferzje.\n\n$NEWPAGE\n\nGearfetting: $PAGESUMMARY $PAGEMINOREDIT\n\nFoar oerlis mei meidogger $PAGEEDITOR:\n- netpost: $PAGEEDITOR_EMAIL\n- wiki: $PAGEEDITOR_WIKI\n\nFierdere meldings wurde jo net tastjoerd, oant jo de side lêzen hawwe. Op jo folchlist kinne jo op 'e nij meldings foar al jo folge siden freegje.\n\n                 Jo freonlike {{SITENAME}}-meldingssysteem.\n\n--\nGean nei {{canonicalurl:{{#special:EditWatchlist}}}}\nom jo folchlistynstellings te feroarjen.\n\nReaksjes en fierdere help:\n$HELPPAGE",
        "created": "oanmakke",
        "changed": "feroare",
        "deletepage": "Wisk side",
        "blockip": "Slút meidogger út",
        "blockip-legend": "Slút brûker út",
        "blockiptext": "Brûk dizze fjilden om in meidogger fan skriuwtagong út te sluten.\nDat soe allinnich fanwege fandalisme dien wurde moatte, sa't de\n[[{{MediaWiki:Policy-url}}|útslut-rie]] it oanjout.\nMeld de krekte reden! Neam bygelyks de siden dy't oantaaste waarden.",
-       "ipadressorusername": "IP Adres of meidoggernamme:",
+       "ipaddressorusername": "IP Adres of meidoggernamme:",
        "ipbexpiry": "Ferrint nei:",
        "ipbreason": "Reden:",
        "ipbreason-dropdown": "*Faak foarkommende redenen foar blokkades\n** Ferkearde ynformaasje ynfiere\n** Fuortheljen fan ynformaasje út siden\n** Spamferwizing nei eksterne websites\n** Ynfoegjen fan ûnsin yn siden\n** Yntimidearjend gedrach\n** Misbrûk troch meardere brûkers\n** Unakseptabele brûkersnamme",
        "newimages": "Nije ôfbylden",
        "imagelisttext": "Dit is in list fan '''$1''' {{PLURAL:$1|triem|triemen}}, op $2.",
        "newimages-legend": "Filter",
-       "showhidebots": "(Bots $1)",
        "noimages": "Neat te sjen.",
        "ilsubmit": "Sykje",
        "bydate": "datum",
        "autosumm-replace": "Side ferfong mei '$1'",
        "autoredircomment": "Ferwiist troch nei [[$1]]",
        "autosumm-new": "Nije Side: $1",
-       "livepreview-loading": "Ynlade...",
-       "livepreview-ready": "Lade... Klear!",
        "watchlistedit-normal-title": "Folchlist bewurkje",
        "watchlistedit-normal-submit": "Siden wiskje",
        "watchlistedit-raw-titles": "Siden:",
index fbc78e3..97b3acb 100644 (file)
@@ -16,7 +16,8 @@
                        "Tameamseo",
                        "Urhixidur",
                        "לערי ריינהארט",
-                       "පසිඳු කාවින්ද"
+                       "පසිඳු කාවින්ද",
+                       "아라"
                ]
        },
        "tog-underline": "Folínte faoi naisc:",
@@ -29,7 +30,6 @@
        "tog-showtoolbar": "Taispeáin an barra uirlisí eagair (JavaScript)",
        "tog-editondblclick": "Déghliogáil chun leathanaigh a chur in eagar (JavaScript)",
        "tog-editsectiononrightclick": "Cumasaigh mír-eagarthóireacht le deaschliceáil<br /> ar cheannteidil (JavaScript)",
-       "tog-rememberpassword": "Cuimhnigh orm ar an ríomhaire seo (ar feadh uastréimhse de $1 {{PLURAL:$1|lá|lá}})",
        "tog-watchcreations": "Cuir ar mo liosta faire leathanaigh a chruthaím",
        "tog-watchdefault": "Déan faire ar leathanaigh a athraím",
        "tog-watchmoves": "Cuir ar mo liosta faire leathanaigh a athainmnaím",
        "readonly_lag": "Glasáladh an bunachar sonraí go huathoibríoch, go dtiocfaidh na sclábhfhreastalaithe suas leis an máistirfhreastalaí.",
        "internalerror": "Earráid inmhéanach",
        "internalerror_info": "Earráid inmhéanach: $1",
-       "fileappenderrorread": "Níorbh fhéidir \"$1\" a léamh le linn ceangal.",
-       "fileappenderror": "Níorbh fhéidir \"$1\" a cheangal le \"$2\".",
        "filecopyerror": "Ní féidir an comhad \"$1\" a chóipeáil go \"$2\".",
        "filerenameerror": "Ní féidir an comhad \"$1\" a athainmnigh mar \"$2\".",
        "filedeleteerror": "Ní féidir an comhad \"$1\" a scriosaigh amach.",
        "directorycreateerror": "Ní féidir an chomhadlann \"$1\" a chruth.",
        "filenotfound": "Ní bhfuarthas an comhad \"$1\".",
-       "fileexistserror": "Unable to write to file  file exists\nNí-abálta scríobh chuif comhad \"$1\": is ann don chomhad",
        "unexpected": "Luach gan súil leis: \"$1\"=\"$2\".",
        "formerror": "Earráid: ní féidir an foirm a tabhair isteach",
        "badarticleerror": "Ní féidir an gníomh seo a dhéanamh ar an leathanach seo.",
        "savearticle": "Sábháil an lch",
        "preview": "Réamhamharc",
        "showpreview": "Taispeáin réamhamharc",
-       "showlivepreview": "Réamhamharc beo",
        "showdiff": "Taispeáin athruithe",
        "anoneditwarning": "'''Rabhadh:''' Níl tú logáilte isteach. Cuirfear do sheoladh IP i stair eagarthóireachta an leathanaigh seo.",
        "missingsummary": "'''Cuimhneachán:''' Níor thug tú achoimriú don athrú. Má chliceáileann tú Sábháil arís, sábhálfar an t-athrú gan é a hachoimriú.",
        "search-nonefound": "Ní bhfuarthas toradh ar bith ar an iarratas.",
        "powersearch-legend": "Cuardach casta",
        "powersearch-ns": "Cuardaigh in ainmspásanna:",
-       "powersearch-redir": "Liosta athsheoltaí",
        "powersearch-toggleall": "Uile",
        "powersearch-togglenone": "Tada",
        "searchdisabled": "Tá brón orainn! Mhíchumasaíodh an cuardach téacs iomlán go sealadach chun luas an tsuímh a chosaint. Idir an dá linn, is féidir leat an cuardach Google anseo thíos a úsáid - b'fhéidir go bhfuil sé as dáta.",
        "recentchanges-label-bot": "Chomhlíon róbó an t-athrú seo",
        "recentchanges-legend-newpage": "$1 - leathanach nua",
        "rcnotefrom": "Is iad seo a leanas na hathruithe ó <b>$2</b> (go dti <b>$1</b> taispeánaithe).",
-       "rclistfrom": "Taispeáin athruithe nua ó $1 anuas.",
+       "rclistfrom": "Taispeáin athruithe nua ó $3 $2 anuas",
        "rcshowhideminor": "$1 mionathruithe",
        "rcshowhidebots": "$1 róbónna",
        "rcshowhideliu": "$1 úsáideoirí atá logáilte isteach",
        "watchlist-details": "Tá tú ag faire ar {{PLURAL:$1|leathanach amháin|$1 leathanaigh}}, gan leathanaigh phlé a chur san áireamh.",
        "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.",
-       "watchmethod-recent": "ag seiceáil na athruithe deireanacha ar do chuid leathanaigh faire",
-       "watchmethod-list": "ag seiceáil na leathanaigh faire ar do chuid athruithe deireanacha",
-       "watchlistcontains": "Tá {{PLURAL:$1|leathanach amháin|$1 leathanaigh}} ar do liosta faire.",
-       "iteminvalidname": "Fadhb leis an mír '$1', ainm neamhbhailí...",
        "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.",
        "watchlist-options": "Roghanna don liosta faire",
        "watching": "Ag faire...",
        "enotif_impersonal_salutation": "úsáideoir {{SITENAME}}",
        "enotif_lastvisited": "Féach ar $1 le haghaidh gach athrú a rinneadh ó thús na cuairte seo caite a rinne tú.",
        "enotif_anon_editor": "úsáideoir gan ainm $1",
-       "enotif_body": "A $WATCHINGUSERNAME, a chara,\n\n$CHANGEDORCREATED $PAGEEDITOR an leathanach $PAGETITLE  ag {{SITENAME}} ar $PAGEEDITDATE, féach ar $PAGETITLE_URL chun an leagan reatha a fháil.\n\n$NEWPAGE\n\nAthchoimriú an úsáideora a rinne é: $PAGESUMMARY $PAGEMINOREDIT\n\nSonraí teagmhála an úsáideora:\nr-phost: $PAGEEDITOR_EMAIL\nvicí: $PAGEEDITOR_WIKI\n\nI gcás athruithe eile, ní bheidh aon fhógra eile muna dtéann tú go dtí an leathanach seo.\nIs féidir freisin na bratacha fógartha a athrú do gach leathanach ar do liosta faire.\n\n\t     Is mise le meas,\n\t     Fógrachóras cairdiúil {{GRAMMAR:genitive|{{SITENAME}}}}\n\n--\nChun socruithe do liosta faire a athrú, tabhair cuairt ar\n{{canonicalurl:Special:Watchlist/edit}}\n\nChun an leathanach a bhaint de do liosta faire, tabhair cuairt ar\n$UNWATCHURL\n\nAiseolas agus a thuilleadh cabhrach:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "A $WATCHINGUSERNAME, a chara,\n\n$CHANGEDORCREATED $PAGEEDITOR an leathanach $PAGETITLE  ag {{SITENAME}} ar $PAGEEDITDATE, féach ar $PAGETITLE_URL chun an leagan reatha a fháil.\n\n$NEWPAGE\n\nAthchoimriú an úsáideora a rinne é: $PAGESUMMARY $PAGEMINOREDIT\n\nSonraí teagmhála an úsáideora:\nr-phost: $PAGEEDITOR_EMAIL\nvicí: $PAGEEDITOR_WIKI\n\nI gcás athruithe eile, ní bheidh aon fhógra eile muna dtéann tú go dtí an leathanach seo.\nIs féidir freisin na bratacha fógartha a athrú do gach leathanach ar do liosta faire.\n\n\t     Is mise le meas,\n\t     Fógrachóras cairdiúil {{GRAMMAR:genitive|{{SITENAME}}}}\n\n--\nChun socruithe do liosta faire a athrú, tabhair cuairt ar\n{{canonicalurl:Special:Watchlist/edit}}\n\nChun an leathanach a bhaint de do liosta faire, tabhair cuairt ar\n$UNWATCHURL\n\nAiseolas agus a thuilleadh cabhrach:\n$HELPPAGE",
        "created": "Chruthaigh",
        "changed": "D'athraigh",
        "deletepage": "Scrios an leathanach",
        "blockip": "Coisc úsáideoir",
        "blockip-legend": "Coisc úsáideoir",
        "blockiptext": "Úsáid an foirm anseo thíos chun bealach scríofa a chosc ó\nseoladh IP nó ainm úsáideora áirithe.\nIs féidir leat an rud seo a dhéanamh amháin chun an chreachadóireacht a chosc, de réir\nmar a deirtear sa [[{{MediaWiki:Policy-url}}|polasaí {{GRAMMAR:genitive|{{SITENAME}}}}]].\nLíonaigh cúis áirithe anseo thíos (mar shampla, is féidir leat a luaigh\nleathanaigh áirithe a rinne an duine damáiste ar).",
-       "ipadressorusername": "Seoladh IP nó ainm úsáideora:",
+       "ipaddressorusername": "Seoladh IP nó ainm úsáideora:",
        "ipbexpiry": "Am éaga",
        "ipbreason": "Fáth:",
        "ipbreason-dropdown": "*Fáthanna coitianta\n** Loitiméaracht\n** Naisc turscar\n** Fadhbanna cóipcheart\n** Ag iarraidh ciapadh daoine eile\n** Drochúsáid as cuntais iolrach\n** Fadhbanna idirvicí\n** Feallaire\n** Seachfhreastalaí Oscailte",
        "tooltip-undo": "Cuirtear \"Cealaigh\" an t-athrú seo ar cheal agus osclaítear an fhoirm eagair i mód réamhamhairc. Is féidir cúis na hathruithe a chur san achoimre.",
        "tooltip-summary": "Cuir isteach achoimre ghearr",
        "monobook.css": "/* athraigh an comhad seo chun an craiceann MonoBook a athrú don suíomh ar fad */",
-       "notacceptable": "Ní féidir leis an freastalaí vicí na sonraí a chur ar fáil i bhformáid atá inléite ag do chliant.",
        "anonymous": "{{PLURAL:$1|Úsáideoir|Úsáideoirí}} gan ainm ar {{SITENAME}}",
        "siteuser": "Úsáideoir $1 ag {{SITENAME}}",
        "lastmodifiedatby": "Leasaigh $3 an leathanach seo go déanaí ag $2, $1.",
        "newimages": "Gailearaí na n-íomhánna nua",
        "imagelisttext": "Tá liosta thíos de {{PLURAL:$1|comhad amháin|$1 comhaid $2}}.",
        "newimages-label": "Comhadainm (nó cuid de):",
-       "showhidebots": "($1 róbónna)",
        "noimages": "Tada le feiceáil.",
        "ilsubmit": "Cuardaigh",
        "bydate": "de réir dáta",
        "table_pager_empty": "Folamh",
        "autoredircomment": "Ag athdhíriú go [[$1]]",
        "autosumm-new": "Leathanach cruthaithe le '$1'",
-       "livepreview-loading": "Ag lódáil…",
-       "livepreview-ready": "Ag lódáil… Réidh!",
-       "watchlistedit-numitems": "Tá {{PLURAL:$1|teideal amháin|$1 teideail}} i do liosta faire, gan leathanaigh phlé a chur san áireamh.",
-       "watchlistedit-noitems": "Níl aon teideail ar do liosta faire.",
        "watchlistedit-normal-title": "Athraigh do liosta faire",
        "watchlistedit-normal-legend": "Bain teideail as do liosta faire",
        "watchlistedit-normal-submit": "Bain Teideail as",
index b340b9f..ca3192d 100644 (file)
@@ -5,7 +5,8 @@
                        "Cuman",
                        "Emperyan",
                        "Reedy",
-                       "Meisam"
+                       "Meisam",
+                       "아라"
                ]
        },
        "tog-underline": "Baalantıların altını çiz",
@@ -16,7 +17,6 @@
        "tog-showtoolbar": "Diişmäk yapar känä yardımcı tuşları göster. (JavaScript)",
        "tog-editondblclick": "Sayfayı çift tuşlayarak diiştirmää başla (JavaScript)",
        "tog-editsectiononrightclick": "Bölüm başlıına saa tuşla basarak bölümü düzmää izin ver.(JavaScript)",
-       "tog-rememberpassword": "Parolu hatırla (en fazla $1 {{PLURAL:$1|gün|gün}})",
        "tog-watchcreations": "Yarattıım sayfaları bakmaa listama ekle",
        "tog-watchdefault": "Diişmäk yapılan sayfayı bakmaa listasına ekle",
        "tog-watchmoves": "Bakmaa listama ekle o sayfaları angılarını taşıdım",
        "savearticle": "Sayfayı registrat et",
        "preview": "Ön siir",
        "showpreview": "Ön siiri göster",
-       "showlivepreview": "Cannı ön siir",
        "showdiff": "Diişilmäkleri göster",
        "anoneditwarning": "Sessiya açmadınız deyni yazının diişmäk istoriyasına diil nik, IP adresiniz registrat olunacêk.",
        "summary-preview": "Ön siir özeti:",
        "search-interwiki-more": "(taa çok)",
        "powersearch-legend": "Gelişmiş arama",
        "powersearch-ns": "Ad erlerindä aara:",
-       "powersearch-redir": "Yönnendirmäkler listası",
        "preferences": "Seçimner",
        "mypreferences": "Seçimnerim",
        "skin-preview": "Ön siir",
        "recentchanges-legend": "Bitki diişlär opţiyaları",
        "recentchanges-feed-description": "Bu lentalan en bitki diişmäkleri vikiyä yaz.",
        "rcnotefrom": "'''$2''' datasınnan büüne kadar yapılan diişmäkler aşaada (en çok '''$1''' yazı gösteriler).",
-       "rclistfrom": "Göster diişmäkleri ani $1 datasından beeri yapıldı",
+       "rclistfrom": "Göster diişmäkleri ani $3 $2 datasından beeri yapıldı",
        "rcshowhideminor": "küçük diişilmäkläri $1",
        "rcshowhidebots": "botları $1",
        "rcshowhideliu": "registrat olmuş kullanıcıları $1",
index 875b437..747f40c 100644 (file)
@@ -10,7 +10,8 @@
                        "Symane",
                        "Urhixidur",
                        "Vipuser",
-                       "Xiaomingyan"
+                       "Xiaomingyan",
+                       "아라"
                ]
        },
        "tog-underline": "下划链接",
        "filedeleteerror": "删伓正档案 \"$1\"。",
        "directorycreateerror": "创建伓正目录 \"$1\"。",
        "filenotfound": "寻伓到档案 \"$1\"。",
-       "fileexistserror": "文件 \"$1\" 写伓正进去:佢已存在",
        "unexpected": "伓正常值: \"$1\"=\"$2\"。",
        "formerror": "错误:交伓正表格",
        "badarticleerror": "个只操作到个页用伓正。",
        "savearticle": "存到著",
        "preview": "预览",
        "showpreview": "望吖起",
-       "showlivepreview": "即时预览",
        "showdiff": "望吖差别",
        "anoneditwarning": "'''警告:'''倷哈冇登入,个页𠮶编写历史会记到倷𠮶IP。",
        "missingsummary": "'''提示:''' 倷冇提供编写摘要。要系倷再按系保存𠮶话,倷保存𠮶编辑就会冇编辑摘要。",
        "search-nonefound": "冇合到𠮶查询结果。",
        "powersearch-legend": "高级搜寻",
        "powersearch-ns": "到名子空间里头寻:",
-       "powersearch-redir": "重定向𠮶表单",
        "searchdisabled": "{{SITENAME}}𠮶搜索功能已经关闭。倷可以用Google寻吖。但系佢𠮶索引可能系早先𠮶。",
        "preferences": "参数设置",
        "mypreferences": "偶𠮶参数设置",
        "recentchanges-label-bot": "个只编辑系机器人舞𠮶",
        "recentchanges-label-unpatrolled": "个只编辑冇拕查过",
        "rcnotefrom": "底下系自'''$2'''𠮶更改(顶多显示'''$1'''):",
-       "rclistfrom": "显示自$1后𠮶新改动",
+       "rclistfrom": "显示自$3 $2后𠮶新改动",
        "rcshowhideminor": "$1细编辑",
        "rcshowhidebots": "$1机器人𠮶编辑",
        "rcshowhideliu": "$1登入用户𠮶编辑",
        "watchlist-details": "$1只页面(伓算讨论页) 拖眏到哩",
        "wlheader-enotif": "启动嘞email通知功能。",
        "wlheader-showupdated": "上回倷眵𠮶页面改动𠮶部分用'''粗体'''显到",
-       "watchmethod-recent": "眵吖拖眏到𠮶页面𠮶最近编辑",
-       "watchmethod-list": "望吖监视页里头最晏𠮶改动",
-       "watchlistcontains": "倷𠮶监视列表包含$1只页面。",
-       "iteminvalidname": "页面'$1'出错,无效命名...",
        "wlshowlast": "显示近来$1钟头$2日$3𠮶改动",
        "watchlist-options": "监视清单选项",
        "watching": "眏到...",
        "enotif_lastvisited": "眵倷上回访问后𠮶全部改动请去$1。",
        "enotif_lastdiff": "想眵改动请去$1。",
        "enotif_anon_editor": "匿名用户$1",
-       "enotif_body": "$WATCHINGUSERNAME先生/小姐倷好,\n\n$CHANGEDORCREATED{{SITENAME}}𠮶 $PAGETITLE 页面已经由$PAGEEDITOR到 $PAGEEDITDATE,请到 $PAGETITLE_URL眵吖目前𠮶版本。\n\n$NEWPAGE\n编辑摘要: $PAGESUMMARY $PAGEMINOREDIT\n联络个只编辑人: mail: $PAGEEDITOR_EMAIL\n\n本站: $PAGEEDITOR_WIKI 今后伓会通知倷将来𠮶改动,除非接到来到个页。倷也能设过倷全部监视页𠮶通知标记。\n\n{{SITENAME}}通知系统 – 会改卟倷𠮶监视列表设置,请去 {{canonicalurl:{{#special:EditWatchlist}}}}\n\n回馈同到别𠮶说明: {{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "$WATCHINGUSERNAME先生/小姐倷好,\n\n$CHANGEDORCREATED{{SITENAME}}𠮶 $PAGETITLE 页面已经由$PAGEEDITOR到 $PAGEEDITDATE,请到 $PAGETITLE_URL眵吖目前𠮶版本。\n\n$NEWPAGE\n编辑摘要: $PAGESUMMARY $PAGEMINOREDIT\n联络个只编辑人: mail: $PAGEEDITOR_EMAIL\n\n本站: $PAGEEDITOR_WIKI 今后伓会通知倷将来𠮶改动,除非接到来到个页。倷也能设过倷全部监视页𠮶通知标记。\n\n{{SITENAME}}通知系统 – 会改卟倷𠮶监视列表设置,请去 {{canonicalurl:{{#special:EditWatchlist}}}}\n\n回馈同到别𠮶说明: $HELPPAGE",
        "created": "建正嘞",
        "changed": "改卟嘞",
        "deletepage": "删卟页面",
        "whatlinkshere-filters": "筛滤器",
        "blockip": "封到IP地址",
        "blockiptext": "用下底𠮶表格去阻止某一IP𠮶修改权限。除非倷系为到怕佢乱扤,接到非要符合[[{{MediaWiki:Policy-url}}|守则]]𠮶条件下才能啖做。请到下底话只确切原因(比如引用一只拖破坏𠮶页面)。",
-       "ipadressorusername": "IP地址或用户名:",
+       "ipaddressorusername": "IP地址或用户名:",
        "ipbexpiry": "期限:",
        "ipbreason": "原因:",
        "ipbreason-dropdown": "*一般𠮶封锁原因\n** 紧编写假𠮶内容\n** 删卟文章内容\n** 乱加外部链接\n** 写冇油盐𠮶话\n** 吓人/骚扰别𠮶\n** 滥用帐号\n** 乱起用户名",
        "monobook.css": "/* 个首𠮶 CSS 会碍到正用Monobook皮肤𠮶用户 */",
        "common.js": "/* 个首𠮶JavaScript仰上载进到所有用户全部页面。 */",
        "monobook.js": "/* 伓再使用;请用[[MediaWiki:common.js]] */",
-       "notacceptable": "个只网站服务器提供伓正倷𠮶用户端认得𠮶格式。",
        "anonymous": "{{SITENAME}}𠮶匿名用户",
        "siteuser": "{{SITENAME}}用户$1",
        "anonuser": "{{SITENAME}}匿名用户$1",
        "show-big-image": "完整分辨率",
        "newimages": "新建图像画廊",
        "imagelisttext": "底下系按$2排列𠮶$1只档案列表。",
-       "showhidebots": "($1机器人)",
        "noimages": "冇什哩可望。",
        "ilsubmit": "寻",
        "bydate": "按日子",
        "autosumm-replace": "搦页面换到 '$1'",
        "autoredircomment": "重定向页面至[[$1]]",
        "autosumm-new": "新页: $1",
-       "livepreview-loading": "加载中…",
-       "livepreview-ready": "加载中… 舞正哩!",
-       "livepreview-failed": "即时预览失败! 试吖标准预览。",
-       "livepreview-error": "连接失败: $1 \"$2\" 试吖标准预览。",
        "lag-warn-normal": "将将𠮶$1秒之内𠮶改动话伓正伓会显到列表里头。",
        "lag-warn-high": "数据库咁慢,将将𠮶$1秒𠮶改动话伓正伓会显到列表里头。",
-       "watchlistedit-numitems": "倷𠮶监视列表拢共有$1只标题,佢伓包括对话页。",
-       "watchlistedit-noitems": "倷𠮶监视列表冇标题。",
        "watchlistedit-normal-title": "编写监视列表",
        "watchlistedit-normal-legend": "到监视列表移卟标题",
        "watchlistedit-normal-explain": "倷𠮶监视列表𠮶标题会到下底显到。想移卟只标题,到佢前头勾吖,跟到按吖移除标题。倷也能[[Special:EditWatchlist/raw|编辑原始监视列表]]或[[Special:Watchlist/clear|移除所全部标题]]。",
index ca33501..d98fe23 100644 (file)
@@ -7,7 +7,8 @@
                        "Symane",
                        "Urhixidur",
                        "Vipuser",
-                       "Xiaomingyan"
+                       "Xiaomingyan",
+                       "아라"
                ]
        },
        "tog-underline": "下劃連結",
@@ -20,7 +21,6 @@
        "tog-showtoolbar": "顯示編輯工具欄(JavaScript)",
        "tog-editondblclick": "捺兩下來改下(JavaScript)",
        "tog-editsectiononrightclick": "可以按右鍵來編寫隻把子段落(JavaScript)",
-       "tog-rememberpassword": "到箇隻電腦記到我嗰密碼(至多$1{{PLURAL:$1|日|日}})",
        "tog-watchcreations": "搦我開嗰頁面加到我嗰監視列表",
        "tog-watchdefault": "搦我改嗰頁面加到我嗰監視列表",
        "tog-watchmoves": "搦我移嗰頁面加到我嗰監視列表",
        "filedeleteerror": "刪伓正檔案 \"$1\"。",
        "directorycreateerror": "創建伓正目錄 \"$1\"。",
        "filenotfound": "尋伓到檔案 \"$1\"。",
-       "fileexistserror": "文件 \"$1\" 寫伓正進去:佢已存在",
        "unexpected": "伓正常值: \"$1\"=\"$2\"。",
        "formerror": "錯誤:交伓正表格",
        "badarticleerror": "箇隻操作到箇頁用伓正。",
        "savearticle": "存到著",
        "preview": "預覽",
        "showpreview": "望吖起",
-       "showlivepreview": "即時預覽",
        "showdiff": "望吖差別",
        "anoneditwarning": "'''警告:'''汝哈冇登入,箇頁嗰編寫歷史會錄到汝嗰IP。",
        "missingsummary": "'''提示:''' 倷冇提供編寫摘要。要係倷再按係保存嗰話,倷保存嗰編輯就會冇編輯摘要。",
        "search-nonefound": "冇合到嗰查詢結果。",
        "powersearch-legend": "高級搜尋",
        "powersearch-ns": "到名子空間裡頭尋:",
-       "powersearch-redir": "重定向嗰表單",
        "searchdisabled": "{{SITENAME}}嗰搜索功能已經關閉。倷可以用Google尋吖。但係佢嗰索引可能係早先嗰。",
        "preferences": "參數設置",
        "mypreferences": "我嗰參數設置",
        "recentchanges-label-bot": "箇隻編輯係機器人舞嗰",
        "recentchanges-label-unpatrolled": "箇隻編輯冇拕查過",
        "rcnotefrom": "底下係自'''$2'''嗰更改(頂多顯示'''$1'''):",
-       "rclistfrom": "顯示自$1後嗰新改動",
+       "rclistfrom": "顯示自$3 $2後嗰新改動",
        "rcshowhideminor": "$1細編輯",
        "rcshowhidebots": "$1機器人嗰編輯",
        "rcshowhideliu": "$1登入用戶嗰編輯",
        "watchlist-details": "$1隻頁面(伓算討論頁) 拕眏到哩",
        "wlheader-enotif": "啟動哩email通知功能。",
        "wlheader-showupdated": "上回倷眵嗰頁面改動嗰部分用'''粗體'''顯到",
-       "watchmethod-recent": "眵吖拕眏到嗰頁面嗰頂晏嗰編輯",
-       "watchmethod-list": "望吖監視頁裡頭頂晏嗰改動",
-       "watchlistcontains": "倷嗰監視列表包含$1隻頁面。",
-       "iteminvalidname": "頁面'$1'出錯,無效命名...",
        "wlshowlast": "顯示箇日子$1鐘頭$2日$3嗰改動",
        "watchlist-options": "監視清單選項",
        "watching": "眏到...",
        "enotif_lastvisited": "眵倷上回訪問後嗰全部改動請去$1。",
        "enotif_lastdiff": "想眵改動請去$1。",
        "enotif_anon_editor": "匿名用戶$1",
-       "enotif_body": "$WATCHINGUSERNAME先生/小姐倷好,\n\n$CHANGEDORCREATED{{SITENAME}}嗰 $PAGETITLE 頁面已經由$PAGEEDITOR到 $PAGEEDITDATE,請到 $PAGETITLE_URL眵吖目前嗰版本。\n\n$NEWPAGE\n編輯摘要: $PAGESUMMARY $PAGEMINOREDIT\n聯絡箇隻編輯人: mail: $PAGEEDITOR_EMAIL\n\n本站: $PAGEEDITOR_WIKI 今後伓會通知倷將來嗰改動,除非接到來到箇頁。倷也能設過倷全部監視頁嗰通知標記。\n\n{{SITENAME}}通知系統 – 會改卟倷嗰監視列表設置,請去 {{canonicalurl:{{#special:EditWatchlist}}}}\n\n回饋同到別嗰説明: {{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "$WATCHINGUSERNAME先生/小姐倷好,\n\n$CHANGEDORCREATED{{SITENAME}}嗰 $PAGETITLE 頁面已經由$PAGEEDITOR到 $PAGEEDITDATE,請到 $PAGETITLE_URL眵吖目前嗰版本。\n\n$NEWPAGE\n編輯摘要: $PAGESUMMARY $PAGEMINOREDIT\n聯絡箇隻編輯人: mail: $PAGEEDITOR_EMAIL\n\n本站: $PAGEEDITOR_WIKI 今後伓會通知倷將來嗰改動,除非接到來到箇頁。倷也能設過倷全部監視頁嗰通知標記。\n\n{{SITENAME}}通知系統 – 會改卟倷嗰監視列表設置,請去 {{canonicalurl:{{#special:EditWatchlist}}}}\n\n回饋同到別嗰説明: $HELPPAGE",
        "created": "建正嘞",
        "changed": "改卟嘞",
        "deletepage": "刪卟頁面",
        "whatlinkshere-filters": "篩濾器",
        "blockip": "封到IP地址",
        "blockiptext": "用下底嗰表格去阻止某一IP嗰修改許可權。除非倷係為到怕佢亂扤,接到非要符合[[{{MediaWiki:Policy-url}}|守則]]嗰條件下才能噉做。請到下底話隻確切原因(比如引用一隻拕破壞嗰頁面)。",
-       "ipadressorusername": "IP地址或用戶名:",
+       "ipaddressorusername": "IP地址或用戶名:",
        "ipbexpiry": "期限:",
        "ipbreason": "原因:",
        "ipbreason-dropdown": "*一般嗰封鎖原因\n** 緊編寫假嗰內容\n** 刪卟文章內容\n** 亂加外部連結\n** 寫冇油鹽嗰話\n** 嚇人/騷擾別嗰\n** 濫用帳號\n** 亂起用戶名",
        "monobook.css": "/* 箇首嗰 CSS 會礙到正用Monobook皮膚嗰用戶 */",
        "common.js": "/* 箇首嗰JavaScript仰上載進到所有用戶全部頁面。 */",
        "monobook.js": "/* 伓再使用;請用[[MediaWiki:common.js]] */",
-       "notacceptable": "箇隻網站服務器提供伓正倷嗰用戶端認得嗰格式。",
        "anonymous": "{{SITENAME}}嗰匿名用戶",
        "siteuser": "{{SITENAME}}用戶$1",
        "anonuser": "{{SITENAME}}匿名用戶$1",
        "show-big-image": "完整解析度",
        "newimages": "新建圖像畫廊",
        "imagelisttext": "底下係按$2排列嗰$1隻檔案列表。",
-       "showhidebots": "($1機器人)",
        "noimages": "冇什哩可望。",
        "ilsubmit": "尋",
        "bydate": "按日子",
        "autosumm-replace": "搦頁面換到 '$1'",
        "autoredircomment": "重定向页面至[[$1]]",
        "autosumm-new": "新頁: $1",
-       "livepreview-loading": "載入中…",
-       "livepreview-ready": "載入中… 舞正哩!",
-       "livepreview-failed": "即時預覽失敗! 試吖標準預覽。",
-       "livepreview-error": "連接失敗: $1 \"$2\" 試吖標準預覽。",
        "lag-warn-normal": "將將嗰$1秒之內嗰改動話伓正伓會顯到列表裡頭。",
        "lag-warn-high": "資料庫咁慢,將將嗰$1秒嗰改動話伓正伓會顯到列表裡頭。",
-       "watchlistedit-numitems": "倷嗰監視列表攏共有$1隻標題,佢伓包括對話頁。",
-       "watchlistedit-noitems": "汝嗰監視列表冇標題。",
        "watchlistedit-normal-title": "編寫監視列表",
        "watchlistedit-normal-legend": "到監視列表移卟標題",
        "watchlistedit-normal-explain": "倷嗰監視列表嗰標題會到下底顯到。想移卟隻標題,到佢前頭勾吖,跟到按吖移除標題。倷也能[[Special:EditWatchlist/raw|編輯原始監視列表]]或[[Special:Watchlist/clear|移除所全部標題]]。",
index c719fc2..faa032d 100644 (file)
@@ -6,7 +6,8 @@
                        "Caoimhin",
                        "Sionnach",
                        "Steafan31",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Fo-loidhneadh nan ceanglaichean:",
@@ -19,7 +20,6 @@
        "tog-showtoolbar": "Seall am bàr-inneal deasachaidh",
        "tog-editondblclick": "Tòisich air deasachadh duilleige le briogadh dùbailte",
        "tog-editsectiononrightclick": "Cuir an comas deasachadh earrainn le briogadh deas air tiotal de dh'earrainn",
-       "tog-rememberpassword": "Cuimhnich gu bheil mi air logadh a-steach air a' choimpiutair seo (suas gu $1 {{PLURAL:$1|latha|latha|làithean|latha}})",
        "tog-watchcreations": "Cuir duilleagan a chruthaicheas mi air a' chlàr-fhaire agam",
        "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",
        "permalink": "Ceangal buan",
        "print": "Clò-bhuail",
        "view": "Seall",
+       "view-foreign": "Seall air $1",
        "edit": "Deasaich",
+       "edit-local": "Deasaich an tuairisgeul ionadail",
        "create": "Cruthaich",
+       "create-local": "Cuir tuairisgeul ionadail ris",
        "editthispage": "Deasaich an duilleag seo",
        "create-this-page": "Cruthaich an duilleag seo",
        "delete": "Sguab às",
        "jumptonavigation": "seòladh",
        "jumptosearch": "lorg",
        "view-pool-error": "Duilich, tha na frithealaichean ro thrang an-dràsta.\nTha cus chleachdaichean a' feuchainn ris an duilleag seo fhaicinn.\nFuirich ort greis mus feuch thu ris an duilleag seo fhaicinn a-rithist.\n\n$1",
+       "generic-pool-error": "Tha sinn duilich ach tha na frithealaichean ro thrang an-dràsta.\nTha cus dhaoine a' toirt sùil air a' ghoireas seo.\nFuirich ort mus feuch thu an goireas seo a-rithist.",
        "pool-timeout": "Dh'fhalbh an ùine air 's tu a' feitheamh ris a ghlas",
        "pool-queuefull": "Tha ciutha nam pròiseasan làn",
        "pool-errorunknown": "Mearachd neo-aithnichte",
+       "pool-servererror": "Chan eil seirbheis cunntadh nan amar ri fhaighinn ($1).",
        "aboutsite": "Mu dhèidhinn {{SITENAME}}",
        "aboutpage": "Project:Mu dhèidhinn",
        "copyright": "Tha susbaint ri làimh fo $1 mur eil an caochladh 'ga innse.",
        "readonly_lag": "Chaidh an stòr-dàta a ghlasadh leis fhèin fhad 's a tha frithealaichean nan stòr-dàta tràilleach air dheireadh a' mhaighstir",
        "internalerror": "Ion-mhearachd",
        "internalerror_info": "Ion-mhearachd: $1",
-       "fileappenderrorread": "Cha do ghabh \"$1\" a leughadh fhad 's a bhathar 'ga chur ris.",
-       "fileappenderror": "Cha do ghabh \"$1\" a chur ri \"$2\".",
        "filecopyerror": "Cha do ghabh lethbhreac dhen fhaidhle \"$1\" gu \"$2\".",
        "filerenameerror": "Cha do ghabh ainm an fhaidhle \"$1\" atharrachadh gu \"$2\".",
        "filedeleteerror": "Cha do ghabh am faidhle \"$1\" a sguabadh às.",
        "directorycreateerror": "Cha do ghabh am pasgan \"$1\" a chruthachadh.",
        "filenotfound": "Cha do ghabh am faidhle \"$1\" a lorg.",
-       "fileexistserror": "Chan urrainnear sgrìobhadh gun fhaidhle \"$1\": tha am faidhle ann mu thràth",
        "unexpected": "Luach ris nach robh dùil: \"$1\"=\"$2\".",
        "formerror": "Mearachd: cha do ghabh am foirm a chur a-null",
        "badarticleerror": "Cha ghabh an gnìomh seo a dhèanamh air an duilleag seo.",
        "invalidtitle-unknownnamespace": "Tiotal mì-dhligheach leis an àireamh namespace $1 agus an teacsa \"$2\"",
        "exception-nologin": "Chan eil thu air clàradh a-steach",
        "exception-nologin-text": "Feumaidh tu [[Special:Userlogin|clàradh a-steach]] mus fhaic thu an duilleag seo no mus urrainn dhut seo a dhèanamh.",
+       "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: ''$1''",
        "virus-scanfailed": "dh'fhàillig an sganadh (còd $1)",
        "virus-unknownscanner": "sganair bhìorasan neo-aithnichte:",
        "gotaccountlink": "Log a-steach",
        "userlogin-resetlink": "Na dhìochuimhnich thu d' ainm is facal-faire?",
        "userlogin-resetpassword-link": "Na dhìochuimhnich thu am facal-faire agad?",
+       "userlogin-helplink2": "Taic le clàradh a-steach",
        "userlogin-loggedin": "Chaidh do chlàradh mar {{GENDER:$1|$1}} mu thràth.\nCleachd am foirm gu h-ìosal airson clàradh a-steach mar chleachdaiche eile.",
        "userlogin-createanother": "Cruthaich cunntas eile",
-       "createacct-join": "Cuir a-steach am fiosrachadh agad gu h-ìosal.",
-       "createacct-another-join": "Cuir a-steach fiosrachadh a' chunntais ùir gu h-ìosal.",
        "createacct-emailrequired": "Seòladh puist-d",
        "createacct-emailoptional": "Seòladh puist-d (roghainneil)",
        "createacct-email-ph": "Cuir a-steach an seòladh puist-d agad",
        "loginlanguagelabel": "Cànan: $1",
        "suspicious-userlogout": "Chaidh d' iarrtas airson clàradh 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.",
+       "pt-login": "Log a-steach",
+       "pt-login-button": "Log a-steach",
+       "pt-createaccount": "Cruthaich cunntas",
+       "pt-userlogout": "Log a-mach",
        "php-mail-error-unknown": "Mearachd neo-aithichte san fheart mail() aig PHP.",
        "user-mail-no-addy": "Cha do ghabh am post-d a chur leis nach robh seòladh puist-d ann.",
        "user-mail-no-body": "Bha bodhaig na teachdaireachd bàn no air leth goirid.",
        "changepassword": "Atharraich facal-faire",
-       "resetpass_announce": "Chlàraich thu a-steach le còd sealach a fhuair thu air a' phost-d.\nGus an clàradh a-steach a choileadh, tha agad ri facal-faire ùr a shuidheachadh an-seo:",
+       "resetpass_announce": "Gus an clàradh a-steach a choileanadh, tha agad ri facal-faire ùr a shuidheachadh.",
        "resetpass_header": "Atharraich facal-faire a' chunntais",
        "oldpassword": "Seann fhacal-faire",
        "newpassword": "Facal-faire ùr",
        "retypenew": "Ath-sgrìobh am facal-faire ùr",
        "resetpass_submit": "Suidhich am facal-faire 's clàraich a-steach",
        "changepassword-success": "Chaidh am facal-faire agad atharrachadh!",
+       "changepassword-throttled": "Dh'fheuch thu ri clàradh a-steach ro thric o chionn ghoirid.\nFuirich ort $1 mus feuch thu ris a-rithist.",
        "resetpass_forbidden": "Cha ghabh na faclan-faire atharrachadh",
        "resetpass-no-info": "Feumaidh tu clàradh a-steach mus dèan thu inntrigeadh dìreach dhan duilleag seo.",
        "resetpass-submit-loggedin": "Atharraich am facal-faire",
        "resetpass-submit-cancel": "Sguir dheth",
        "resetpass-wrong-oldpass": "Tha am facal-faire sealach no làithreach mì-dhligheach.\nSaoil an do dh'atharraich thu am facal-faire agad mu thràth no an do dh'iarr thu facal-faire sealach ùr?",
+       "resetpass-recycled": "Tagh facal-faire ùr nach eil co-ionnann ris an fhacal-fhaire a tha agad an-dràsta.",
+       "resetpass-temp-emailed": "Rinn thu clàradh a-steach le còd sealach a fhuair thu air a' phost-d.\nAirson clàradh a-steach slàn a dhèanamh, feumaidh tu facal-faire ùr a shuidheachadh an-seo:",
        "resetpass-temp-password": "Facal-faire sealach:",
        "resetpass-abort-generic": "Chuir leudachan crìoch air atharrachadh an fhacail-fhaire.",
+       "resetpass-expired": "Dh'fhalbh an ùine air an fhacal-fhaire agad. Suidhich facal-faire ùr airson clàradh a-steach.",
+       "resetpass-expired-soft": "Dh'fhalbh an ùine air an fhacal-fhaire agad is feumaidh tu ath-shuidheachadh. Tagh fear ùr no briog air \"{{int:resetpass-submit-cancel}}\" gus ath-shuidheachadh às a dhèidh seo.",
+       "resetpass-validity-soft": "Chan eil am facal-faire seo dligheach: $1\n\nTagh facal-faire ùr an-dràsta no briog air \"{{int:resetpass-submit-cancel}}\" gus ath-shuidheachadh às a dhèidh seo.",
        "passwordreset": "Ath-shuidhich am facal-faire",
        "passwordreset-text-one": "Lìon am foirm seo gus am facal-faire agad ath-shuidheachadh.",
        "passwordreset-text-many": "{{PLURAL:$1|Lìon aon dhe na raointean gus facal-faire sealach fhaighinn ann am post-d.}}",
        "changeemail-password": "Am facal-faire agad air {{SITENAME}}:",
        "changeemail-submit": "Atharraich am post-d",
        "changeemail-cancel": "Sguir dheth",
+       "changeemail-throttled": "Dh'fheuch thu ri clàradh 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.",
        "resettokens-no-tokens": "Chan eil tòcan ann a ghabhas ath-shuidheachadh.",
        "savearticle": "Sàbhail an duilleag",
        "preview": "Ro-shealladh",
        "showpreview": "Seall an ro-shealladh",
-       "showlivepreview": "Ro-shealladh beò",
        "showdiff": "Seall na mùthaidhean",
        "anoneditwarning": "'''Rabhadh:''' Chan eil thu air logadh a-steach.\nThèid an seòladh IP agad a chlàrachadh ann an eachdraidh na duilleige seo.",
        "anonpreviewwarning": "''Chan eil thu air clàradh a-steach. Ma nì thu sàbhaladh, thèid an seòladh IP agad a chlàradh ann an eachdraidh deasachadh na duilleige seo.''",
        "edit-gone-missing": "Cha b' urrainn dhuinn an duilleag ath-nuadhachadh.\nTha coltas gun deach a sguabadh às.",
        "edit-conflict": "Còmhstri deasachaidh.",
        "edit-no-change": "Chaidh an obair-dheasachaidh agad a leigeil seachad a chionn 's nach do dh'atharraich thu dad.",
-       "postedit-confirmation": "Chaidh na dheasaich thu a shàbhaladh.",
+       "postedit-confirmation-created": "Chaidh an duilleag a chruthachadh.",
+       "postedit-confirmation-restored": "Chaidh an duilleag aiseag.",
+       "postedit-confirmation-saved": "Chaidh na dheasaich thu a shàbhaladh.",
        "edit-already-exists": "Cha b' urrainn dhuinn an duilleag ùr a chruthachadh.\nTha e ann mu thràth.",
        "defaultmessagetext": "Teacsa bunaiteach na teachdaireachd",
        "content-failed-to-parse": "Dh'fhàillig parsadh susbaint $2 airson modail $1: $3",
        "invalid-content-data": "Dàta susbaint a tha mì-dhligheach",
        "content-not-allowed-here": "Chan eil susbaint \"$1\" ceadaichte air an duilleag [[$2]]",
-       "editwarning-warning": "Ma dh'fhàgas tu an duilleag seo, faodaidh gun caill thu mùthadh sam bith a rinn thu.\nMa tha thu air logadh a-steach, 's urrainn dhut an rabhadh seo a chur dheth san roinn \"Deasachadh\" sna roghainnean agad.",
+       "editwarning-warning": "Ma dh'fhàgas tu an duilleag seo, faodaidh gun caill thu mùthadh sam bith a rinn thu.\nMa tha thu air logadh a-steach, 's urrainn dhut an rabhadh seo a chur dheth san earrann \"{{int:prefs-editing}}\" anns na roghainnean agad.",
+       "editpage-notsupportedcontentformat-title": "Chan eil taic ri fòrmat na susbaint",
+       "editpage-notsupportedcontentformat-text": "Chan eil modail na susbaint \"$2\" a' cur taic ri fòrmat na susbaint \"$1\".",
        "content-model-wikitext": "wikitext",
        "content-model-text": "teacsa lom",
        "content-model-javascript": "JavaScript",
        "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",
        "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",
        "parser-unstrip-loop-warning": "Mhothaich sinn do lùb unstrip",
        "parser-unstrip-recursion-limit": "Chaidheas thairis air crìoch unstrip recursion ($1)",
        "undo-success": "Gabhaidh an deasachadh seo a neo-dhèanamh.\nThoir sùil air a' choimeas gu h-ìosal is dearbh gur e sin a tha fa-near dhut agus sàbhail na h-atharraichean gu h-ìosal gus neo-dhèanamh an deasachaidh a choileanadh.",
        "undo-failure": "Cha b' urrainn dhuinn an deasachadh a neo-dhèanamh air sgàth 's gun robh deasachaidhean eile sa mheadhan.",
        "undo-norev": "Cha b' urrainn dhuinn an deasachadh a neo-dhèanamh a chionn 's nach robh e ann no gun deach a sguabadh às.",
+       "undo-nochange": "Tha coltas gun deach am mùthadh seo a neo-dhèanamh mu thràth.",
        "undo-summary": "Neo-dhèan mùthadh $1 le [[Special:Contributions/$2|$2]] ([[User talk:$2|Deasbaireachd]])",
        "undo-summary-username-hidden": "Neo-dhèan am mùthadh $1 le cleachdaiche falaichte",
        "cantcreateaccounttitle": "Cha ghabh an cunntas a chruthachadh",
        "cantcreateaccount-text": "Chuir [[User:$3|$3]] bacadh air cruthachadh chunntasan on t-seòladh IP seo ('''$1''').\n\nDh'innise $3 gun do rinn iad seo air sgàth: ''$2''",
+       "cantcreateaccount-range-text": "Chuir [[User:$3|$3]] casg air daoine a tha airson cunntasan a chruthachadh on sheòlaidhean IP taobh a-staigh na rainse '''$1''' agus tha sin a' gabhail a-steach an t-seòlaidh IP agad-sa ('''$4''').\n\nThuir $3 gun do rinn iad seo air sgàth an adhbhair seo: ''$2''",
        "viewpagelogs": "Seall logaichean na duilleige seo",
        "nohistory": "Chan eil eachdraidh deasachaidh aig an duilleag seo.",
        "currentrev": "Lethbhreac làithreach",
        "revdelete-no-file": "Chan eil am faidhle a shònraich thu ann.",
        "revdelete-show-file-confirm": "A bheil thu cinnteach gu bheil thu airson coimhead air mùthadh an fhaidhle \"<nowiki>$1</nowiki>\" a chaidh a sguabadh às $2 aig $3?",
        "revdelete-show-file-submit": "Tha",
+       "revdelete-selected-text": "{{PLURAL:$1|Lèirmheas|Lèirmheas|Lèirmheas|Lèirmheas|Lèirmheasan|Lèirmheas}} de [[:$2]] a thagh thu:",
+       "revdelete-selected-file": "{{PLURAL:$1|Tionndadh an fhaidhle|Tionndadh nam faidhlichean|Tionndadh nam faidhlichean|Tionndadh nam faidhlichean|Tionndadh nam faidhlichean|Tionndadh nam faidhlichean}} a thagh thu à [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|An tachartas loga|Na tachartasan loga}} a thagh thu:",
+       "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-confirm": "Dearbh 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 '''ach''' ann an suidheachaidhean mar seo:\n* Fiosrachadh a dh'fhaodadh a bhith dìteachail\n* Fiosrachadh pearsanta a tha cearr\n*: ''seòladh taige, àireamhan fòn, àireamhan NI is msaa.''",
        "revdelete-legend": "Suidhich cuingeachaidhean na faicsinneachd",
        "mergelog": "Loga a' cho-aonaidh",
        "pagemerge-logentry": "chaidh [[$1]] a cho-aonadh dha [[$2]] (lèirmheasan suas ri $3)",
        "revertmerge": "Dì-aontaich",
+       "mergelogpagetext": "Chì thu liosta nan co-aonaidhean as ùire eadar eachdraidh dhuilleagan gu h-ìosail.",
        "history-title": "Eachdraidh nam mùthaidhean aig \"$1\"",
+       "difference-title": "An diofar eadar na lèirmheasan a rinneadh air \"$1\"",
+       "difference-title-multipage": "An diofar eadar an dà dhuilleag \"$1\" agus \"$2\"",
        "difference-multipage": "(An diofar eadar na duilleagan)",
        "lineno": "Loidhne $1:",
        "compareselectedversions": "Dèan coimeas eadar na mùthaidhean a thagh thu",
        "showhideselectedversions": "Seall/Falaich na lèirmheasan a thagh thu",
        "editundo": "neo-dhèan",
        "diff-empty": "(Gun diofar eatarra)",
+       "diff-multi-sameuser": "(Rinn an cleachdaiche {{PLURAL:$1|$1 lèirmheas eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach|$1 lèirmheasan eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach}}nach eil 'gan sealltainn)",
+       "diff-multi-otherusers": "({{PLURAL:$1|$1 lèirmheas eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach|$1 lèirmheasan eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach}} le {{PLURAL:$2|$2 chleachdaiche|$2 chleachdaiche|$2 chleachdaiche|$2 chleachdaiche|$2 cleachdaichean|$2 cleachdaiche}} eile nach eil 'gan sealltainn)",
        "diff-multi-manyusers": "({{PLURAL:$1|Aon lèirmheas eadar-mheadhanach||$1 lèirmheasan eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach}} le {{PLURAL:$2|aon chleachdaiche|$2 chleachdaiche|$2 cleachdaichean|$2 cleachdaiche}} gun sealltainn)",
+       "difference-missing-revision": "Cha deach {{PLURAL:$2|$2 lèirmheas|$2 lèirmheas|$2 lèirmheas|$2 lèirmheas|$2 lèirmheasan|$2 lèirmheas}} dhen diofar seo ($1) a lorg.\n\nMar is trice, tachraidh seo ma leanas tu ceangal gu diff air duilleag a chaidh a sguabadh às.\nGheibh thu mion-fhiosrachadh ann an [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} loga nan duilleagan a chaidh a sguabadh às].",
        "searchresults": "Toraidhean rannsachaidh",
        "searchresults-title": "Lorg \"$1\" am broinn nan toraidhean",
        "toomanymatches": "Fhuaras cus thoraidhean, feuch ceist eile",
        "titlematches": "Tiotalan dhuilleagan a tha a' maidseadh",
+       "textmatches": "Teacsa sna duilleagan a tha co-ionnann",
        "notextmatches": "Chan eil tiotal de dhuilleag sam bith a' freagairt ris",
        "prevn": "an {{PLURAL:$1|$1}} roimhe",
        "nextn": "an ath {{PLURAL:$1|$1}}",
        "shown-title": "Seall $1 {{PLURAL:$1|toradh|thoradh|toraidhean|toradh}} air gach duilleag",
        "viewprevnext": "Seall ($1 {{int:pipe-separator}} $2) ($3).",
        "searchmenu-exists": "'''Tha duilleag air a bheil \"[[:$1]]\" air an uicipeid seo.'''",
-       "searchmenu-new": "'''Cruthaich an duilleag \"[[:$1]]\" air an uicipeid seo!'''",
+       "searchmenu-new": "<strong>Cruthaich an duilleag \"[[:$1]]\" air an uicipeid seo!</strong> {{PLURAL:$2|0=|Seall an duilleag a chaidh a lorg ri linn na lorg thu.|Seall na duilleagan a chaidh a lorg ri linn na lorg thu.|Seall na duilleagan a chaidh a lorg ri linn na lorg thu.|Seall na duilleagan a chaidh a lorg ri linn na lorg thu.|Seall na duilleagan a chaidh a lorg ri linn na lorg thu.|Seall na duilleagan a chaidh a lorg ri linn na lorg thu.}}'",
        "searchprofile-articles": "Duilleagan susbainte",
-       "searchprofile-project": "Duilleagan nan cobharach 's nam pròiseactan",
        "searchprofile-images": "Ioma-mheadhanan",
        "searchprofile-everything": "Gach rud",
        "searchprofile-advanced": "Adhartach",
        "searchprofile-articles-tooltip": "Lorg ann an $1",
-       "searchprofile-project-tooltip": "Lorg ann an $1",
        "searchprofile-images-tooltip": "Lorg faidhlichean",
        "searchprofile-everything-tooltip": "Lorg am broinn susbaint sam bith (a' gabhail a-steach nan duilleagan deasbaireachd)",
        "searchprofile-advanced-tooltip": "Lorg am broinn ainm-spàsan gnàthaichte",
        "search-result-score": "Buntainneas: $1%",
        "search-redirect": "(ag ath-sheòladh $1)",
        "search-section": "(earrann $1)",
+       "search-file-match": "{a' freagairt ri susbaint an fhaidhle)",
        "search-suggest": "An e na leanas a bha fa-near dhut: $1",
        "search-interwiki-caption": "Pròiseactan co-cheangailte",
-       "search-interwiki-default": "Toraidhean $1:",
+       "search-interwiki-default": "Toraidhean $1:",
        "search-interwiki-more": "(barrachd)",
        "search-relatedarticle": "Co-cheangailte",
        "searcheverything-enable": "Seall anns na namespaces air fad",
        "searchrelated": "co-cheangailte",
        "searchall": "a h-uile",
        "showingresults": "A' nochdadh suas gu $1 {{PLURAL:$1|$1 toradh|$1 thoradh|$1 toraidhean|$1 toradh}} gu h-ìosal a' tòiseachadh le #'''$2'''.",
+       "showingresultsinrange": "A' sealltainn suas ri {{PLURAL:$1|<strong>$1</strong> toradh|<strong>$1</strong> toradh|<strong>$1</strong> toradh|<strong>$1</strong> toradh|<strong>$1</strong> toraidhean|<strong>$1</strong> toradh}} san rainse eadar #<strong>$2</strong> is #<strong>$3</strong>.",
        "showingresultsnum": "A' nochdadh '''$3''' {{PLURAL:$3|$3 toradh|$3 thoradh|$3 toraidhean|$3 toradh}} gu h-ìosal a' tòiseachadh le #'''$2'''.",
        "showingresultsheader": "{{PLURAL:$5|Toradh '''$1''' à '''$3'''|Toraidhean '''$1 - $2''' of '''$3'''}} airson '''$4'''",
        "search-nonefound": "Cha do fhreagair toradh sam bith ri d' iarrtas.",
        "powersearch-legend": "Rannsachadh adhartach",
        "powersearch-ns": "Lorg ann an namespaces:",
-       "powersearch-redir": "Seall ath-sheòlaidhean",
        "powersearch-togglelabel": "Sgrùd:",
        "powersearch-toggleall": "Na h-uile",
        "powersearch-togglenone": "Chan eil gin",
        "search-external": "Lorg air an taobh a-muigh",
        "searchdisabled": "Tha lorg air {{SITENAME}} à comas.\n'S urrainn dhut lorg a dhèanamh air Google san eadar-àm.\nFaodaidh gum bi inneacsan susbaint {{SITENAME}} tuilleadh 's sean ge-tà.",
+       "search-error": "Thachair mearachd fhad 's a bha sinn a' lorg an-seo: $1",
        "preferences": "Roghainnean",
        "mypreferences": "Na roghainnean agam",
        "prefs-edits": "Co mheud deasachadh:",
+       "prefsnologintext2": "Ma tha thu airson na roghainnean agad atharrachadh, $1.",
        "prefs-skin": "Bian",
        "skin-preview": "Ro-shealladh",
        "datedefault": "Gun roghainnean",
        "prefs-watchlist": "An clàr-faire",
        "prefs-watchlist-days": "Co mheud latha a sheallar air a' chlàr-fhaire:",
        "prefs-watchlist-days-max": "{{PLURAL:$1|latha|latha|làithean|latha}} air a' char as motha",
+       "prefs-watchlist-edits": "An àireamh as motha de mhùthaidhean a thèid a shealltainn air a' chlàr-fhaire leudaichte:",
        "prefs-watchlist-edits-max": "Àireamh as motha: 1000",
        "prefs-watchlist-token": "Tòcan a' chlàir-fhaire:",
        "prefs-misc": "Measgachadh",
        "rows": "Sreathan",
        "columns": "Colbhan",
        "searchresultshead": "Lorg",
+       "stub-threshold": "An stairsneach airson fòrmatadh <a href=\"#\" class=\"stub\">cheanglaichean nam bun</a> (bytes):",
        "stub-threshold-disabled": "À comas",
+       "recentchangesdays": "Co mheud latha a thèid a shealltainn sna mùthaidhean ùra:",
        "recentchangesdays-max": "{{PLURAL:$1|latha|latha|làithean|latha}} air a' char as motha",
        "recentchangescount": "Uiread a dheasachaidhean a thèid a shealltainn a ghnàth:",
+       "prefs-help-recentchangescount": "Tha seo a' gabhail a-steach mùthaidhean ùra, eachdraidhean nan duilleagan is logaichean.",
        "savedprefs": "Tha na roghainnean agad air an sàbhaladh.",
        "timezonelegend": "Roinn-tìde:",
        "localtime": "An t-àm ionadail:",
        "prefs-emailconfirm-label": "Dearbhadh puist-d:",
        "youremail": "Post-dealain:",
        "username": "{{GENDER:$1|Ainm-cleachdaiche}}:",
-       "uid": "ID {{GENDER:$1|a' chleachdaiche}}:",
        "prefs-memberingroups": "{{GENDER:$2|Ball}} ann an {{PLURAL:$1|bhuidheann|bhuidheann|buidhnean|buidheann}}:",
        "prefs-registration": "Àm clàraidh:",
        "yourrealname": "An dearbh ainm a th' ort:",
        "prefs-advancedsearchoptions": "Roghainnean adhartach",
        "prefs-advancedwatchlist": "Roghainnean adhartach",
        "prefs-displayrc": "Roghainnean taisbeanaidh",
-       "prefs-displaysearchoptions": "Roghainnean taisbeanaidh",
        "prefs-displaywatchlist": "Roghainnean taisbeanaidh",
        "prefs-tokenwatchlist": "Tòcan",
        "prefs-diffs": "Diffs",
        "recentchanges-label-minor": "Seo mùthadh beag",
        "recentchanges-label-bot": "'S e bot a rinn an deasachadh seo",
        "recentchanges-label-unpatrolled": "Cha deach freiceadan tron deasachadh seo fhathast",
-       "rcnotefrom": "Gheibhear na mùthaidhean a-mach o '''$2''' (gu ruige '''$1''') gu h-ìosal.",
-       "rclistfrom": "Seall na mùthaidhean ùra a-mach o $1",
+       "recentchanges-label-plusminus": "Seo meud atharrachadh na duilleige ann am byte",
+       "recentchanges-legend-newpage": "(faic [[Special:NewPages|liosta nan duilleagan ùra]] cuideachd)",
+       "rcnotefrom": "Gheibhear na mùthaidhean a-mach o <strong>$2</strong> (gu ruige <strong>$1</strong>) gu h-ìosal.",
+       "rclistfrom": "Seall na mùthaidhean ùra a-mach o $3 $2",
        "rcshowhideminor": "$1 mùthaidhean beaga",
        "rcshowhidebots": "$1 botaichean",
        "rcshowhideliu": "$1 neach-cleachdaidh clàraichte",
        "logempty": "Chan eil rud sam bith san loga a tha 'ga mhaidseadh.",
        "showhideselectedlogentries": "Seall/Falaich innteartan an loga a thagh thu",
        "allpages": "A h-uile duilleag",
-       "alphaindexline": "$1 gu $2",
        "nextpage": "An ath dhuilleag ($1)",
        "prevpage": "An duilleag roimhe ($1)",
        "allpagesfrom": "Seall duilleagan a tha a' tòiseachadh aig:",
        "unwatch": "Na cum sùil tuilleadh",
        "unwatchthispage": "Na cum sùil tuilleadh",
        "notanarticle": "Chan e duilleag susbaint a tha ann",
-       "watchlist-details": "Tha {{PLURAL:$1|$1 duilleag|$1 dhuilleag|$1 duilleagan|$1 duilleag}} air do chlàr-faire, gun luaidh air na duilleagan deasbaireachd.",
+       "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-showupdated": "Tha clò '''trom''' air duilleagan a chaidh atharrachadh on turas mu dheireadh a thadhail thu orra.",
-       "watchmethod-recent": "A' sgrùdadh deasachaidhean ùra airson duilleagan air d' fhaire",
-       "watchmethod-list": "A' sgrùdadh duilleagan air d' fhaire airson deasachaidhean ùra",
-       "watchlistcontains": "Tha $1 {{PLURAL:$1|duilleag|dhuilleag|duilleagan|duilleag}} air do chlàr-faire.",
+       "wlnote2": "Chì thu na h-atharraichean {{PLURAL:$1|san uair|san <strong>$1</strong> uair|san <strong>$1</strong> uair|san <strong>$1</strong> uair|sna <strong>$1</strong> uairean|sna <strong>$1</strong> uair}} a thìde seo chaidh aig $3 air $2.",
        "wlshowlast": "Seall na $1 uairean a thìde mu dheireadh $2 làithean mu dheireadh $3",
        "watchlist-options": "Roghainnean mo chlàir-faire",
        "watching": "'Ga chur air a' chlàr-fhaire...",
        "unwatching": "A' toirt far a' chlàir-fhaire...",
+       "enotif_reset": "Comharraich gun do thadhladh air gach duilleag",
        "deletepage": "Sguab às duilleag",
        "confirm": "Daingnich",
        "excontent": "stuth a bh' ann: '$1'",
index cdc0813..3072722 100644 (file)
        "edit": "Editar",
        "edit-local": "Editar a descrición local",
        "create": "Crear",
-       "create-local": "Engadir a descrición local",
+       "create-local": "Engadir unha descrición local",
        "editthispage": "Editar esta páxina",
        "create-this-page": "Crear esta páxina",
        "delete": "Borrar",
        "jumptonavigation": "navegación",
        "jumptosearch": "procura",
        "view-pool-error": "Sentímolo, os servidores están sobrecargados nestes intres.\nHai moitos usuarios intentando ver esta páxina.\nPor favor, agarde un anaco antes de intentar acceder á páxina de novo.\n\n$1",
+       "generic-pool-error": "Sentímolo, os servidores están sobrecargados nestes intres.\nHai moitos usuarios intentando ver este recurso.\nPor favor, agarde un anaco antes de intentar acceder ao recurso de novo.",
        "pool-timeout": "Tempo límite de espera para o peche",
        "pool-queuefull": "A cola está chea",
        "pool-errorunknown": "Erro descoñecido",
        "readonly_lag": "A base de datos bloqueouse automaticamente mentres os servidores levan a cabo a sincronización co servidor principal",
        "internalerror": "Erro interno",
        "internalerror_info": "Erro interno: $1",
-       "fileappenderrorread": "Non foi posible ler \"$1\" durante a inserción.",
-       "fileappenderror": "Non se puido engadir \"$1\" a \"$2\".",
        "filecopyerror": "Non se deu copiado o ficheiro \"$1\" a \"$2\".",
        "filerenameerror": "Non se pode cambiar o nome do ficheiro \"$1\" a \"$2\".",
        "filedeleteerror": "Non se deu borrado o ficheiro \"$1\".",
        "directorycreateerror": "Non se puido crear o directorio \"$1\".",
        "filenotfound": "Non se deu atopado o ficheiro \"$1\".",
-       "fileexistserror": "Non se pode escribir no ficheiro \"$1\": O ficheiro xa existe.",
        "unexpected": "Valor inesperado: \"$1\"=\"$2\".",
        "formerror": "Erro: Non se pode enviar o formulario.",
        "badarticleerror": "Non pode efectuarse esa acción nesta páxina.",
        "userlogin-helplink2": "Axuda co rexistro",
        "userlogin-loggedin": "Xa accedeu ao sistema como {{GENDER:$1|$1}}.\nUtilice o formulario inferior para acceder como outro usuario.",
        "userlogin-createanother": "Crear outra conta",
-       "createacct-join": "Insira a súa información embaixo.",
-       "createacct-another-join": "Insira a información da nova conta embaixo.",
        "createacct-emailrequired": "Enderezo de correo electrónico",
        "createacct-emailoptional": "Enderezo de correo electrónico (opcional)",
        "createacct-email-ph": "Insira o seu enderezo de correo electrónico",
        "savearticle": "Gardar a páxina",
        "preview": "Vista previa",
        "showpreview": "Mostrar a vista previa",
-       "showlivepreview": "Vista previa",
        "showdiff": "Mostrar os cambios",
        "anoneditwarning": "'''Aviso:''' Non accedeu ao sistema.\nO seu enderezo IP quedará rexistrado no historial de revisións desta páxina.",
        "anonpreviewwarning": "''Non accedeu ao sistema. Se garda a páxina, o seu enderezo IP quedará rexistrado no historial de edicións.''",
        "edit-gone-missing": "Non se pode actualizar a páxina.\nSemella que foi borrada.",
        "edit-conflict": "Conflito de edición.",
        "edit-no-change": "A súa edición foi ignorada dado que non fixo ningún cambio no texto.",
-       "postedit-confirmation": "Gardouse a súa edición.",
+       "postedit-confirmation-saved": "Gardouse a súa edición.",
        "edit-already-exists": "Non se pode crear a nova páxina.\nEsta xa existe.",
        "defaultmessagetext": "Texto predeterminado",
        "content-failed-to-parse": "Erro ao analizar o contido de \"$2\" para o modelo de $1: $3",
        "search-nonefound": "Non se atopou ningún resultado que coincidise coa procura.",
        "powersearch-legend": "Busca avanzada",
        "powersearch-ns": "Procurar nos espazos de nomes:",
-       "powersearch-redir": "Listar as redireccións",
        "powersearch-togglelabel": "Seleccionar:",
        "powersearch-toggleall": "Todos",
        "powersearch-togglenone": "Ningún",
        "prefs-advancedsearchoptions": "Opcións avanzadas",
        "prefs-advancedwatchlist": "Opcións avanzadas",
        "prefs-displayrc": "Opcións de visualización",
-       "prefs-displaysearchoptions": "Opcións de visualización",
        "prefs-displaywatchlist": "Opcións de visualización",
        "prefs-tokenwatchlist": "Pase",
        "prefs-diffs": "Diferenzas",
        "uploadstash-refresh": "Actualizar a lista de ficheiros",
        "invalid-chunk-offset": "Desprazamento inválido do fragmento",
        "img-auth-accessdenied": "Acceso rexeitado",
-       "img-auth-nopathinfo": "Falta a PATH_INFO.\nO seu servidor non está configurado para pasar esta información.\nPode ser que estea baseado en CGI e non soporte img_auth.\nVéxase https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "Falta a PATH_INFO.\nO seu servidor non está configurado para pasar esta información.\nPode ser que estea baseado en CGI e non soporte img_auth.\nVéxase https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "A ruta solicitada non está no directorio de carga configurado.",
        "img-auth-badtitle": "Non é posible construír un título válido a partir de \"$1\".",
        "img-auth-nologinnWL": "Non accedeu ao sistema e \"$1\" non está na lista de branca.",
        "pageswithprop-prophidden-binary": "agochouse o valor de propiedade binaria ($1)",
        "doubleredirects": "Redireccións dobres",
        "doubleredirectstext": "Esta lista contén as páxinas que redirixen cara a outras páxinas de redirección.\nCada ringleira contén ligazóns cara á primeira e segunda redireccións, así como a primeira liña de texto da segunda páxina, que é frecuentemente o artigo \"real\", á que a primeira redirección debera apuntar.\nAs entradas <del>riscadas</del> xa foron resoltas.",
-       "double-redirect-fixed-move": "A páxina \"[[$1]]\" foi movida, agora é unha redirección cara a \"[[$2]]\"",
-       "double-redirect-fixed-maintenance": "Arranxo a redirección dobre entre \"[[$1]]\" e \"[[$2]]\".",
+       "double-redirect-fixed-move": "Trasladouse a páxina \"[[$1]]\".\nActualizouse automaticamente e agora é unha redirección cara a \"[[$2]]\".",
+       "double-redirect-fixed-maintenance": "Arranxo automaticamente a redirección dobre entre \"[[$1]]\" e \"[[$2]]\" como tarefa de mantemento.",
        "double-redirect-fixer": "Amañador de redireccións",
        "brokenredirects": "Redireccións rotas",
        "brokenredirectstext": "As seguintes redireccións ligan cara a páxinas que non existen:",
        "listgrouprights-removegroup-self": "Pode eliminar {{PLURAL:$2|un grupo|grupos}} pola súa propia conta: $1",
        "listgrouprights-addgroup-self-all": "Pode engadir todos os grupos pola súa propia conta",
        "listgrouprights-removegroup-self-all": "Pode eliminar todos os grupos pola súa propia conta",
+       "listgrouprights-namespaceprotection-header": "Restricións dos espazos de nomes",
+       "listgrouprights-namespaceprotection-namespace": "Espazo de nomes",
+       "listgrouprights-namespaceprotection-restrictedto": "Dereito(s) que permite(n) ao usuario editar",
        "trackingcategories": "Categorías de seguimento",
        "trackingcategories-summary": "Esta páxina lista as categorías de seguimento que o software de MediaWiki enche automaticamente. Pódense alterar os seus nomes modificando as correspondentes mensaxes do sistema no espazo de nomes \"{{ns:8}}\".",
        "trackingcategories-msg": "Categoría de seguimento",
        "trackingcategories-name": "Nome da mensaxe",
        "trackingcategories-desc": "Criterio de inclusión da categoría",
-       "noindex-category-desc": "A páxina non está indexada polos robots porque ten a palabra máxica <code><nowiki>__NOINDEX__</nowiki></code> e está nun espazo de nomes no que esa marca está permitida.",
+       "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>.",
        "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'''.",
-       "watchmethod-recent": "comprobando as edicións recentes na procura de páxinas vixiadas",
-       "watchmethod-list": "comprobando as páxinas vixiadas na procura de edicións recentes",
-       "watchlistcontains": "A súa lista de vixilancia ten $1 {{PLURAL:$1|páxina|páxinas}}.",
-       "iteminvalidname": "Hai un problema co elemento \"$1\", nome non válido...",
        "wlnote2": "A continuación están as modificacións feitas {{PLURAL:$1|na última hora|nas últimas <strong>$1</strong> horas}}, ata o $2 ás $3.",
        "wlshowlast": "Mostrar as últimas $1 horas, os últimos $2 días ou $3",
        "watchlist-options": "Opcións de vixilancia",
        "enotif_lastvisited": "Consulte $1 para comprobar todos os cambios feitos desde a súa última visita.",
        "enotif_lastdiff": "Consulte $1 para ver esta modificación.",
        "enotif_anon_editor": "usuario anónimo $1",
-       "enotif_body": "Boas, $WATCHINGUSERNAME:\n\n$PAGEINTRO $NEWPAGE\n\nResumo de edición: $PAGESUMMARY $PAGEMINOREDIT\n\nPode contactar co editor:\npor correo electrónico: $PAGEEDITOR_EMAIL\nno wiki: $PAGEEDITOR_WIKI\n\nNon se producirán máis notificacións en caso de que haxa actividade nova ata que acceda ao sistema e visite a páxina. Pode restablecer os indicadores de aviso de notificación para o conxunto das páxinas marcadas na súa lista de vixilancia.\n\nO sistema de avisos de {{SITENAME}}\n\n--\nPara cambiar as notificacións por correo electrónico, visite\n{{canonicalurl:{{#special:Preferences}}}}\n\n\nPara cambiar a súa lista de vixilancia, visite\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPara borrar a páxina da súa lista de vixilancia, visite\n$UNWATCHURL\n\nAxuda:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Boas, $WATCHINGUSERNAME:\n\n$PAGEINTRO $NEWPAGE\n\nResumo de edición: $PAGESUMMARY $PAGEMINOREDIT\n\nPode contactar co editor:\npor correo electrónico: $PAGEEDITOR_EMAIL\nno wiki: $PAGEEDITOR_WIKI\n\nNon se producirán máis notificacións en caso de que haxa actividade nova ata que acceda ao sistema e visite a páxina. Pode restablecer os indicadores de aviso de notificación para o conxunto das páxinas marcadas na súa lista de vixilancia.\n\nO sistema de avisos de {{SITENAME}}\n\n--\nPara cambiar as notificacións por correo electrónico, visite\n{{canonicalurl:{{#special:Preferences}}}}\n\n\nPara cambiar a súa lista de vixilancia, visite\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPara borrar a páxina da súa lista de vixilancia, visite\n$UNWATCHURL\n\nAxuda:\n$HELPPAGE",
        "created": "creada",
        "changed": "modificada",
        "deletepage": "Borrar a páxina",
        "contributions-title": "Contribucións de $1",
        "mycontris": "Contribucións",
        "contribsub2": "De {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "A conta de usuario \"$1\" non está rexistrada.",
        "nocontribs": "Non se deron atopado cambios con eses criterios.",
        "uctop": "(última revisión)",
        "month": "Desde o mes de (e anteriores):",
        "blockip": "Bloquear o usuario",
        "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).",
-       "ipadressorusername": "Enderezo IP ou nome de usuario:",
+       "ipaddressorusername": "Enderezo IP ou nome de usuario:",
        "ipbexpiry": "Duración:",
        "ipbreason": "Motivo:",
        "ipbreason-dropdown": "*Motivos frecuentes para bloquear\n** Inserir información falsa\n** Eliminar o contido de páxinas\n** Ligazóns lixo a sitios externos\n** Inserir textos sen sentido ou inintelixibles\n** Comportamento intimidatorio/acoso\n** Abuso de múltiples contas de usuario\n** Nome de usuario inaceptable",
        "group-bot.js": "/* Calquera JavaScript que haxa aquí será cargado soamente para os bots */",
        "group-sysop.js": "/* Calquera JavaScript que haxa aquí será cargado soamente para os administradores */",
        "group-bureaucrat.js": "/* Calquera JavaScript que haxa aquí será cargado soamente para os burócratas */",
-       "notacceptable": "O servidor do wiki non pode fornecer os datos nun formato que o seu cliente poida ler.",
        "anonymous": "{{PLURAL:$1|Usuario anónimo|Usuarios anónimos}} de {{SITENAME}}",
        "siteuser": "$1 de {{SITENAME}}",
        "anonuser": "o usuario anónimo $1 de {{SITENAME}}",
        "newimages-summary": "Esta páxina especial mostra os últimos ficheiros cargados.",
        "newimages-legend": "Filtro",
        "newimages-label": "Nome do ficheiro (ou parte del):",
-       "showhidebots": "($1 os bots)",
        "noimages": "Non hai imaxes para ver.",
        "ilsubmit": "Procurar",
        "bydate": "por data",
        "autoredircomment": "Redirixida cara a \"[[$1]]\"",
        "autosumm-new": "Nova páxina: \"$1\"",
        "size-kilobytes": "$1 kB",
-       "livepreview-loading": "Cargando...",
-       "livepreview-ready": "Cargando… Listo!",
-       "livepreview-failed": "Fallou a vista previa en tempo real! Inténteo coa vista previa normal.",
-       "livepreview-error": "Fallou a conexión: $1 \"$2\".\nProbe coa vista previa normal.",
        "lag-warn-normal": "Pode que os cambios feitos {{PLURAL:$1|no último segundo|nos últimos $1 segundos}} non aparezan nesta lista.",
        "lag-warn-high": "Debido a unha gran demora do servidor da base de datos, pode que nesta lista non aparezan os cambios feitos {{PLURAL:$1|no último segundo|nos últimos $1 segundos}}.",
-       "watchlistedit-numitems": "A súa lista de vixilancia inclúe {{PLURAL:$1|un título|$1 títulos}}, excluíndo as páxinas de conversa.",
-       "watchlistedit-noitems": "A súa lista de vixilancia non contén ningún título.",
        "watchlistedit-normal-title": "Editar a lista de vixilancia",
        "watchlistedit-normal-legend": "Eliminar títulos da lista de vixilancia",
        "watchlistedit-normal-explain": "Os títulos da súa lista de vixilancia aparecen a continuación.\nPara eliminar un título, escóllao na súa caixa de selección e prema en \"{{int:Watchlistedit-normal-submit}}\".\nTamén pode [[Special:EditWatchlist/raw|editar a lista simple]].",
        "redirect-submit": "Continuar",
        "redirect-lookup": "Procurar:",
        "redirect-value": "Valor:",
-       "redirect-user": "Id. do usuario",
+       "redirect-user": "ID de usuario",
        "redirect-page": "ID de páxina",
        "redirect-revision": "Revisión de páxina",
        "redirect-file": "Nome de ficheiro",
        "compare-invalid-title": "O título que especificou non é válido.",
        "compare-title-not-exists": "O título que especificou non existe.",
        "compare-revision-not-exists": "A revisión que especificou non existe.",
-       "dberr-header": "Este wiki ten un problema",
        "dberr-problems": "Sentímolo! Este sitio está experimentando dificultades técnicas.",
        "dberr-again": "Por favor, agarde uns minutos e logo probe a cargar de novo a páxina.",
        "dberr-info": "(Non se pode conectar co servidor da base de datos: $1)",
index 8195e6a..95e9f9b 100644 (file)
@@ -13,7 +13,8 @@
                        "SPQRobin",
                        "Trixt",
                        "Yannos",
-                       "ZaDiak"
+                       "ZaDiak",
+                       "아라"
                ]
        },
        "tog-underline": "Ὑπογραμμίζειν συνδέσμους:",
@@ -26,7 +27,6 @@
        "tog-showtoolbar": "Δεικνύναι τὴν τῶν ἐργαλείων μεταγραφῆς μετώπην (ἀπαιτεῖται JavaScript)",
        "tog-editondblclick": "Ἐπὶ δέλτων δὶς θλίψας, μετάγραψον αὐτάς (ἀπαιτεῖται JavaScript)",
        "tog-editsectiononrightclick": "Καθιστάναι δυνατὸν τὸ μεταγράφειν τμήματα διὰ τοῦ ἐπὶ τῶν ἐπιγραφῶν τῶν τμημάτων θλίβειν δεξιῶς (ἀπαιτεῖται JavaScript)",
-       "tog-rememberpassword": "Ἐνθυμεῖσθαι τὴν ἐμὴν σύνδεσιν ἐν τῇδε τῇ ὑπολογιστικῇ μηχανῇ (μέγιστον $1 {{PLURAL:$1|ἡμέρα|ἡμέραι}})",
        "tog-watchcreations": "Προστιθέναι τὰς δέλτους ἃς ποιῶ τοῖς ἐφορωμένοις μου",
        "tog-watchdefault": "Προστιθέναι τὰς δέλτους ἃς μεταγράφω τοῖς ἐφορωμένοις μου",
        "tog-watchmoves": "Προστιθέναι τὰς δέλτους ἃς κινῶ τοῖς ἐφορωμένοις μου",
        "readonly_lag": "Ἡ βάσις δεδομένων πέφρακται αὐτομάτως ἐνόσω αἱ ἐπὶ μέρους ἐξυπηρετητικαὶ μηχαναὶ τῶν ἀντιγράφων τῆς βάσεως δεδομένων καλύψωσιν τὴν διαφορὰν μεταξὺ σφῶν καὶ τῆς κεντρικῆς ἐξυπηρετητικῆς μηχανῆς τοῦ πρωτοτύπου τῆς βάσεως",
        "internalerror": "Ἐσώτερον σφάλμα",
        "internalerror_info": "Ἐσώτερον σφάλμα: $1",
-       "fileappenderror": "Οὐκ ἦτο δυνατὴ ἡ προσάρτησις τοῦ \"$1\" εἰς τὸ \"$2\".",
        "filecopyerror": "Οὐκ ἦν δυνατὴ ἡ ἀντιγραφὴ τοῦ ἀρχείου \"$1\" εἰς τὸ \"$2\".",
        "filerenameerror": "Οὐκ ἦν δυνατὴ ἡ μετωνομασία τοῦ ἀρχείου \"$1\" ὡς \"$2\".",
        "filedeleteerror": "Οὐκ ἦν δυνατὴ ἡ διαγραφὴ τοῦ ἀρχείου \"$1\".",
        "directorycreateerror": "Οὐκ ἦν δυνατὴ ἡ ποίησις τοῦ ἀρχειοκαταλόγου \"$1\".",
        "filenotfound": "Γραφὴ \"$1\" οὐχ ηὑρέθη",
-       "fileexistserror": "Οὐκ ἦν δυνατὴ ἡ ἐγγραφὴ εἰς τὸ ἀρχεῖον \"$1\": τὸ ἀρχεῖον ὑπάρχει",
        "unexpected": "Ἀπροσδόκητος τιμή: \"$1\"=\"$2\".",
        "formerror": "Σφάλμα: μὴ δυναμένη ἡ ὑποβολὴ τοῦ τύπου ἐστίν",
        "badarticleerror": "Ἡ πρᾶξις μὴ ἐκτελέσιμος ἦν ἐν τῇδε δέλτῳ.",
        "savearticle": "Γράφειν τὴν δέλτον",
        "preview": "Τὸ προεπισκοπεῖν",
        "showpreview": "Προεπισκοπεῖν",
-       "showlivepreview": "Ἄμεσος προθεώρησις",
        "showdiff": "Δεικνύναι τὰς μεταβολάς",
        "anoneditwarning": "'''Προσοχή:''' Οὐ συνδεδεμένος εἶ.\nἩ διεύθυνσις IP σου καταγεγραμμένη ἔσται ἐν τῇδε δέλτου ἱστορίᾳ.",
        "missingcommenttext": "Εἰσάγαγε σχόλιον τι κατωτέρω.",
        "search-nonefound": "Οὐδὲν ἀποτέλεσμα ἀντίστοιχον τῆς πεύσεως.",
        "powersearch-legend": "Ἀνωτέρα ἀναζήτησις",
        "powersearch-ns": "Ζήτησις ἐν τοῖς ὀνοματείοις:",
-       "powersearch-redir": "Ἀναδιευθύνσεων καταλόγος",
        "powersearch-togglelabel": "Ἐλέγχειν:",
        "powersearch-toggleall": "Ἅπαντες",
        "powersearch-togglenone": "Οὐδέν",
        "recentchanges-label-unpatrolled": "Ἥδε ἡ μεταγραφὴ μὴ ἐλεγμένη ἐστίν",
        "recentchanges-legend-newpage": "$1 - νέα δέλτος",
        "rcnotefrom": "Ἰδοῦ αἱ ἀλλαγαὶ ἐκ τοῦ '''$2''' (ἕως τὸ '''$1''').",
-       "rclistfrom": "Δεικνύναι νέας ἀλλαγάς. Ἐκκίνησις ἐκ τοῦ $1",
+       "rclistfrom": "Δεικνύναι νέας ἀλλαγάς. Ἐκκίνησις ἐκ τοῦ $3 $2",
        "rcshowhideminor": "$1 μικραὶ μεταβολαὶ",
        "rcshowhidebots": "$1 αὐτόματα",
        "rcshowhideliu": "$1 χρωμένους συνδεδεμένους",
        "notvisiblerev": "Ἀναθεώρησις διαγεγραμμένη",
        "watchlist-details": "{{PLURAL:$1|$1 δέλτος|$1 δέλτοι}} ἐφορωμέναι, ἄνευ τῶν δέλτων διαλέξεως περιλαμβανομένων.",
        "wlheader-enotif": "Σύστημα εἰδήσεως μέσῳ ἠλ-ἐπιστολῶν ἐνεργόν.",
-       "watchmethod-recent": "ἐλέγχειν προσφάτους μεταγραφὰς περὶ ἐφορωμένων δέλτων",
-       "watchmethod-list": "ἐλέγχειν ἐφορωμένας δέλτους περὶ μεταγραφὰς προσφάτους",
-       "watchlistcontains": "Ἡ ἐφοροδιαλογὴ σου περιέχει $1 {{PLURAL:$1|δέλτον|δέλτους}}.",
-       "iteminvalidname": "Πρόβλημα τεμαχἰου '$1', ἄκυρον ὄνομα...",
        "wlshowlast": "Ἐμφάνισις τῶν τελευταίων $1 ὡρῶν $2 ἡμερῶν $3",
        "watchlist-options": "Ἐπιλογαὶ ἐφοροδιαλογῆς",
        "watching": "Ἐφορῶν...",
        "enotif_lastvisited": "Ἴδε $1 διὰ ἁπάσας τὰς ἀλλαγὰς ἐκ τῆς ὑστάτης ἐπισκέψεώς σου.",
        "enotif_lastdiff": "Ἴδε $1 διὰ τὸ ὁρᾶν τήνδε τὴν ἀλλαγήν.",
        "enotif_anon_editor": "ἀνώνυμος χρώμενος $1",
-       "enotif_body": "Φίλτατε  $WATCHINGUSERNAME,\n\n\nἩ τοῦ {{SITENAME}} δέλτος $PAGETITLE $CHANGEDORCREATED ἐστὶ τῇ $PAGEEDITDATE ὑπὸ τοῦ $PAGEEDITOR, $PAGETITLE_URL.\n\n$NEWPAGE\n\nΣύνοψις: $PAGESUMMARY $PAGEMINOREDIT\n\nΚοινωνῆσαι τὸν μεταγραφέα:\nἠλ.-ταχυδρομεῖον: $PAGEEDITOR_EMAIL\nβίκι: $PAGEEDITOR_WIKI\n\nΟὐχ ὑπάρξουσιν ἕτεραι εἰδήσεις ἐν περιπτώσει περαιτέρω ἀλλαγαὶ προκύψουσι εἰ μὴ σὺ ἐπισκεφθεὶς τὴν δέλτον ᾖς. Δύνασαι ἐπἴσης ἀναρρυθμίσειν τὰ σήματα εἰδήσεως διὰ ἅπασας τὰς ἐφορωμένας ὑπἐσοῦ δέλτους\n\n             Τοῦ φιλικοῦ σου {{SITENAME}} τὸ σύστημα εἰδήσεως\n\n--\nΔιὰ τὸ ἀλλάξειν τὰς ῥυθμίσεις τὴς ἐφοροδιαλογῆς σου, ἐπίσκεψαι τὸ\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nἈνάδρασις καὶ περαιτέρω βοήθεια:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Φίλτατε  $WATCHINGUSERNAME,\n\n\nἩ τοῦ {{SITENAME}} δέλτος $PAGETITLE $CHANGEDORCREATED ἐστὶ τῇ $PAGEEDITDATE ὑπὸ τοῦ $PAGEEDITOR, $PAGETITLE_URL.\n\n$NEWPAGE\n\nΣύνοψις: $PAGESUMMARY $PAGEMINOREDIT\n\nΚοινωνῆσαι τὸν μεταγραφέα:\nἠλ.-ταχυδρομεῖον: $PAGEEDITOR_EMAIL\nβίκι: $PAGEEDITOR_WIKI\n\nΟὐχ ὑπάρξουσιν ἕτεραι εἰδήσεις ἐν περιπτώσει περαιτέρω ἀλλαγαὶ προκύψουσι εἰ μὴ σὺ ἐπισκεφθεὶς τὴν δέλτον ᾖς. Δύνασαι ἐπἴσης ἀναρρυθμίσειν τὰ σήματα εἰδήσεως διὰ ἅπασας τὰς ἐφορωμένας ὑπἐσοῦ δέλτους\n\n             Τοῦ φιλικοῦ σου {{SITENAME}} τὸ σύστημα εἰδήσεως\n\n--\nΔιὰ τὸ ἀλλάξειν τὰς ῥυθμίσεις τὴς ἐφοροδιαλογῆς σου, ἐπίσκεψαι τὸ\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nἈνάδρασις καὶ περαιτέρω βοήθεια:\n$HELPPAGE",
        "created": "ποιηθέν",
        "changed": "ἠλλαγμένη",
        "deletepage": "Διαγράφειν τὴν δέλτον",
        "whatlinkshere-filters": "Ἠθητήρια",
        "blockip": "Ἀποκλῄειν τόνδε τὸν χρώμενον",
        "blockip-legend": "Φράττειν χρώμενον",
-       "ipadressorusername": "Διεύθυνσις IP ἢ ὄνομα χρωμένου:",
+       "ipaddressorusername": "Διεύθυνσις IP ἢ ὄνομα χρωμένου:",
        "ipbexpiry": "Λῆξις:",
        "ipbreason": "Αἰτία:",
        "ipbreason-dropdown": "*Κοιναὶ αἰτίαι φραγῆς\n** Εἰσαγωγὴ ψευδοῦς πεύσεως\n** Ἁφαίρεσις τοῦ περιεχομένου τῶν δέλτων\n** Σύνδεσμοι πρὸς ἀνεπιθύμητους ἀγγελίας\n** Εἰσαγωγὴ ἀσυναρτησιῶν ἐν ταῖς δέλτοις\n** Ἐκφοβιστικὴ συμπεριφορά/ἐνόχλησις\n** Κατάχρησις πολλαπλῶν λογισμῶν\n** Ἀναπόδεκτον ὄνομα χρωμένου",
        "tooltip-rollback": "Ἡ \"Ἀναστροφὴ\" ἀναστρέφει τὰς μεταγραφὰς τῆσδε τῆς δέλτου ὑπὸ τοῦ ὑστάτου συμβάλλοντος μέσῳ ἑνὸς κλίκ",
        "tooltip-undo": "Ἡ \"Ἀναίρεσις\" ἀναιρεῖ τήνδε τὴν μεταγραφἢν καὶ ἀνοίγει τὸν τὐπον μεταγραφῆς ἐν καταστάσει προθεωρήσεως.\nἘπιτρέπει τὴν προσθήκην αἰτιολογίας ἐν τῇ συνόψει",
        "tooltip-preferences-save": "Τιθέναι τὰς προαιρέσεις",
-       "notacceptable": "Ἡ ἐξυπηρετητικὴ μηχανὴ τοῦ βίκι οὐ δύναται παράσχειν δεδομένα ἐν διαμορφώσει τινὰ ἀναγνωσίμῳ ὑπἐσοῦ.",
        "anonymous": "{{PLURAL:$1|Ἀνώνυμος χρώμενος|Ἀνώνυμοι χρώμενοι}} τῷ {{SITENAME}}",
        "siteuser": "Χρώμενος τῷ {{SITENAME}} $1",
        "anonuser": "ἀνώνυμος χρώμενος $1 τοῦ {{SITENAME}}",
        "newimages-summary": "Ἥδε ἡ εἰδικὴ δέλτος δεικνύει τὰ πλέον πρόσφατα ἐπιπεφορτισμένα ἀρχεῖα.",
        "newimages-legend": "Διηθητήριον",
        "newimages-label": "Ἀρχειώνυμον (ἢ μέρος οὗ):",
-       "showhidebots": "($1 αὐτόματα)",
        "noimages": "Οὐδεμία εἰκών.",
        "ilsubmit": "Ζητεῖν",
        "bydate": "κατὰ χρονολογίαν",
        "size-kilobytes": "$1 ΧΔ",
        "size-megabytes": "$1 ΜΔ",
        "size-gigabytes": "$1 ΓΔ",
-       "livepreview-loading": "Φορτίζειν…",
-       "livepreview-ready": "Φορτίζειν… Ἕτοιμον!",
-       "livepreview-failed": "Ἡ προθεώρησις τῆς διαλογῆς ἀποτευκτὸς ἦν! Πείρασον τὴν κανονικὴν προθεώρησιν.",
-       "livepreview-error": "Ἀπότευξις συνδέσεως: $1 \"$2\".\nΠεἰρασον τὴν κανονικὴν προθεώρησιν.",
        "lag-warn-normal": "Μεταβολαὶ νεώτεραι {{PLURAL:$1|τοῦ|τῶν}} $1 {{PLURAL:$1|δευτερολέπτου|δευτερολέπτων}} ἐνδέχεται μὴ εἶναι ἐμφανίσιμοι ἐν τῷδε τῷ καταλόγῳ.",
        "lag-warn-high": "Ἐξ αἰτίας τῆς ὑψηλῆς καθυστερήσεως τῆς βάσεως δεδομένων τῆς ἐξυπηρετητικῆς μηχανῆς, ἀλλαγαὶ νεώτεραι τῶν $1 {{PLURAL:$1|δευτερολέπτου|δευτερολέπτων}} ἐνδέχεται μὴ ἐμφανιζόμεναι εἶναι ἐν τῇδε τῇ καταλογῇ.",
-       "watchlistedit-numitems": "Ἡ ἐφοροδιαλογή σου περιέχει {{PLURAL:$1|1 δέλτον|$1 δέλτους}}, ἐκτὸς τῶν δέλτων διαλέξεως.",
-       "watchlistedit-noitems": "Οὐδεμία ἐγγραφὴ ἐν τῷ καταλόγῳ ἐφορωμένων σου.",
        "watchlistedit-normal-title": "Μεταγράφειν κατάλογον ἐφορωμένων",
        "watchlistedit-normal-legend": "Ἀφαιρεῖν ἐγγραφὰς ἐκ τῆς ἐφοροδιαλογῆς",
        "watchlistedit-normal-submit": "Ἀφαιρεῖν ἐπιγραφάς",
        "tags-edit": "μεταγραφή",
        "tags-hitcount": "$1 {{PLURAL:$1|μεταβολή|μεταβολαί}}",
        "compare-submit": "Συγκρίνειν",
-       "dberr-header": "Τόδε τὸ βίκι ἔχει πρόβλημα",
        "dberr-problems": "Συγγνώμην! Ἐμπεφανίκασι τεχνικαὶ δυσχέρειαι.",
        "dberr-again": "Πείρασον ἀναμένειν ὀλίγα λεπτὰ τῆς ὥρας καὶ ὕστερον ἐπιφόρτισον πάλιν.",
        "dberr-info": "(Ἀδύνατος ἡ ἐπαφὴ μετὰ τοῦ ἐξυπηρετητικοῦ συστήματος τῆς βάσεως δεδομένων: $1)",
index 0813cd9..a3ec3ba 100644 (file)
@@ -31,7 +31,6 @@
        "tog-showtoolbar": "Wärchzyyglyscht zum Bearbeite aazeige",
        "tog-editondblclick": "Syte ändere mit Doppelklick",
        "tog-editsectiononrightclick": "Einzelni Absätz ändere mit Rächtsclick uf d Iberschrifte",
-       "tog-rememberpassword": "Mit däm Browser duurhaft aamälde (Maximal fir $1 {{PLURAL:$1|Tag|Täg}})",
        "tog-watchcreations": "Sälber gmachti Sytene un uffegladeni Dateie automatisch  beobachte",
        "tog-watchdefault": "Sälber gändereti Syte un Dateie automatisch beobachte",
        "tog-watchmoves": "Sälber verschobeni Sytene un Dateie automatisch beobachte",
        "readonly_lag": "D Datebank isch automatisch gperrt wore, wil di verteilte Datebankserver (Sklave) mien mit em Hauptdatebankserver (Meischter) abgliche wäre.",
        "internalerror": "Interner Fähler",
        "internalerror_info": "Interne Fähler: $1",
-       "fileappenderrorread": "„$1“ het nit chenne gläse wäre bim Aahänke.",
-       "fileappenderror": "Het „$1“ nit an „$2“ chenne anhänke.",
        "filecopyerror": "D Datei $1 het nit no $2 chenne kopiert wäre.",
        "filerenameerror": "D Datei \"$1\" het nit in \"$2\" umgnennt werre kinne.",
        "filedeleteerror": "Datei \"$1\" het nit glöscht werre kinne.",
        "directorycreateerror": "S Verzeichnis „$1“ het nit chenne aaglait wäre.",
        "filenotfound": "Datei \"$1\" isch nit gfunde worre.",
-       "fileexistserror": "In d Datei „$1“ het nit chenne gschribe wäre, wel s die Datei scho git.",
        "unexpected": "Wärt, wu nit erwartet woren isch: „$1“=„$2“.",
        "formerror": "Fähler: Ds Formular het nid chönne verarbeitet wärde",
        "badarticleerror": "D Aktion konn uf denne Artikel nit ongwendet werre.",
        "userlogin-resetpassword-link": "Passwort vergässe?",
        "userlogin-loggedin": "Du bisch scho as {{GENDER:$1|$1}} aagmäldet.\nBruuch s Formular unte go Di unter eme andere Benutzername aamälde.",
        "userlogin-createanother": "En ander Benutzerkonto aalege",
-       "createacct-join": "Gib unte Dyni Informationen yy.",
-       "createacct-another-join": "Gib unte d Informatione vum neie Benutzerkonto yy.",
        "createacct-emailrequired": "E-Mail-Adräss",
        "createacct-emailoptional": "E-Mail-Adräss (optional)",
        "createacct-email-ph": "Gib Dyy E-Mail-Adräss yy",
        "savearticle": "Syte spychere",
        "preview": "Vorschou",
        "showpreview": "Vorschau aaluege",
-       "showlivepreview": "Live-Vorschau",
        "showdiff": "Zeig Änderige",
        "anoneditwarning": "'''Warnig:''' Si sin nit aagmäldet. Ihri IP-Adrässe wird in de Gschicht vo däm Artikel gspeicheret.",
        "anonpreviewwarning": "''Du bisch nit aagmäldet. Bim Spychere wird Dyy IP-Adräss yydrait in d Versionsgschicht vu däre Syte.''",
        "edit-gone-missing": "D Syte het nid chenne aktalisiert wäre.\nSi isch schyns glescht wore.",
        "edit-conflict": "Bearbeitigskonflikt.",
        "edit-no-change": "Dyyni Bearbeitig isch ignoriert wore, wel kei Änderig am Täxt gmacht woren isch.",
-       "postedit-confirmation": "Dyy Bearbeitig isch gspycheret wore.",
+       "postedit-confirmation-saved": "Dyy Bearbeitig isch gspycheret wore.",
        "edit-already-exists": "Di nej Syte het nid chenne aaglait wäre, wel s si scho git.",
        "defaultmessagetext": "Standardtext",
        "content-failed-to-parse": "Parse vum Inhalt $2 fir Modell $1 fählgschlaa: $3",
        "search-nonefound": "Fir Dyyni Suechaafrog sin keini Ergebniss gfunde wore.",
        "powersearch-legend": "Erwytereti Suech",
        "powersearch-ns": "Suech in Namensryym:",
-       "powersearch-redir": "Wyterleitige aazeige",
        "powersearch-togglelabel": "Wehl uus:",
        "powersearch-toggleall": "Alli",
        "powersearch-togglenone": "Keini",
        "prefs-advancedsearchoptions": "Erwytereti Optione",
        "prefs-advancedwatchlist": "Erwytereti Optione",
        "prefs-displayrc": "Aazeigoptione",
-       "prefs-displaysearchoptions": "Aazeigoptione",
        "prefs-displaywatchlist": "Aazeigoptione",
        "prefs-diffs": "Versionsverglych",
        "email-address-validity-valid": "Siht giltig uus",
        "uploadstash-refresh": "Lischt vu dr Dateie aktualisiere",
        "invalid-chunk-offset": "Nit giltige Startpunkt",
        "img-auth-accessdenied": "Zuegriff verweigeret",
-       "img-auth-nopathinfo": "PATH_INFO fählt.\nDyy Server isch nit derfir yygrichtet, die Information wyterzgee.\nS chennt CGI-basiert syy un unterstitzt img_auth nit.\nLueg https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "PATH_INFO fählt.\nDyy Server isch nit derfir yygrichtet, die Information wyterzgee.\nS chennt CGI-basiert syy un unterstitzt img_auth nit.\nLueg https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Dr gwinscht Pfad isch nit im konfigurierte Uploadverzeichnis.",
        "img-auth-badtitle": "Giltige Titel vu „$1“ cha nit aagleit wäre.",
        "img-auth-nologinnWL": "Du bisch nit aagmäldet un „$1“ isch nit in dr wyße Lischt.",
        "watchlist-details": "{{PLURAL:$1|1 Syte wird|$1 Sytene wärde}} beobachtet (Diskussionssyte nid zelt, aber ou beobachtet).",
        "wlheader-enotif": "Dr E-Mail-Benochrichtigungsdienscht isch aktiviert.",
        "wlheader-showupdated": "Syte mit Anderige, wu no nit aagluegt sin, sin '''fett''' dargstellt.",
-       "watchmethod-recent": "Iberpriefe vu dr letschte Bearbeitige fir d Beobachtigslischt",
-       "watchmethod-list": "Iberpriefe vu dr Beobachtigslischt no letschte Bearbeitige",
-       "watchlistcontains": "In Dyynere Beobachtigslischt het s $1 {{PLURAL:$1|Syte|Syte}}.",
-       "iteminvalidname": "Probläm mit em Yytrag „$1“, uugiltige Name.",
        "wlshowlast": "Zeig di letschte $1 Stunde $2 Tage $3",
        "watchlist-options": "Aazeigoptione",
        "watching": "Am beobachte …",
        "enotif_lastvisited": "$1 zeigt alli Änderige uf s Mol.",
        "enotif_lastdiff": "Lueg $1 no däre Änderig.",
        "enotif_anon_editor": "Anonyme Benutzer $1",
-       "enotif_body": "Sali $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nZämmenfassig vum Autor: $PAGESUMMARY $PAGEMINOREDIT\n\nKontakt zum Autor:\nMail $PAGEEDITOR_EMAIL\nWiki $PAGEEDITOR_WIKI\n\n\nEs wird kei wyteri Nochricht iber Änderige gschickt, bis Du uf sälli Syte gohsch un di aamäldsch. Uf Dyyre Beobachtigssyte chasch d Beobachtigsmarker fir alli Syte zrucksetze, wu Du beobachte tuesch.\n\n             Dyy fryndli {{SITENAME}}-Nochrichtesyschtem\n\n---\nGo d Yystellige vu dr E-Mail-Benochrichtigung aapasse, gang uf {{canonicalurl:{{#special:Preferences}}}}\n\nGo d Yystellige vu Dyyre Beobachtigslischte ändere, gang uf {{canonicalurl:{{#special:EditWatchlist}}}}\n\nGo d Syte us Dyyre Beobachtigslischte uuseneh, gang uf $UNWATCHURL\n\nRuckmäldig un wyteri Hilf: {{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Sali $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nZämmenfassig vum Autor: $PAGESUMMARY $PAGEMINOREDIT\n\nKontakt zum Autor:\nMail $PAGEEDITOR_EMAIL\nWiki $PAGEEDITOR_WIKI\n\n\nEs wird kei wyteri Nochricht iber Änderige gschickt, bis Du uf sälli Syte gohsch un di aamäldsch. Uf Dyyre Beobachtigssyte chasch d Beobachtigsmarker fir alli Syte zrucksetze, wu Du beobachte tuesch.\n\n             Dyy fryndli {{SITENAME}}-Nochrichtesyschtem\n\n---\nGo d Yystellige vu dr E-Mail-Benochrichtigung aapasse, gang uf {{canonicalurl:{{#special:Preferences}}}}\n\nGo d Yystellige vu Dyyre Beobachtigslischte ändere, gang uf {{canonicalurl:{{#special:EditWatchlist}}}}\n\nGo d Syte us Dyyre Beobachtigslischte uuseneh, gang uf $UNWATCHURL\n\nRuckmäldig un wyteri Hilf: $HELPPAGE",
        "created": "aagleit",
        "changed": "gänderet",
        "deletepage": "Syte lösche",
        "blockip": "Däm Binutzer d Bearbeitigsrächt furtnee",
        "blockip-legend": "IP-Adräss/Benutzer sperre",
        "blockiptext": "Nimm des Formular go ne Benutzer oder e IP-Adräss sperre.\nDes sott numme erfolge go Vandalismus verhindere un in Ibereinstimmig mit in dr [[{{MediaWiki:Policy-url}}|Leitlinie]]. Bitte gib au ne Grund fi d Sperri aa (z. B. indäm du einzel ni Syte zitiersch, wu vandaliert wore sin).",
-       "ipadressorusername": "IP-Adräss oder Benutzername:",
+       "ipaddressorusername": "IP-Adräss oder Benutzername:",
        "ipbexpiry": "Sperrduur:",
        "ipbreason": "Grund:",
        "ipbreason-dropdown": "* Allgmeini Sperrgrind\n** Lesche vu Syte\n** Aalege vu bledsinnige Syte\n** Vylfachi Verstess gege d Richtlinie fir Netzgleicher\n** Verstoss gege dr Grundsatz „Kei persenligi Aagriff“\n* Benutzerspezifischi Sperrgrind\n** Uugeignete Benutzername\n** Neijaamäldig vun eme uubschränkt gsperrte Benutzer\n* IP-spezifischi Sperrgrind\n** Proxy, wäge Vandalismus vu einzelne Benutzer lengerfrischtig gsperrt",
        "tooltip-undo": "Mach numme die eint Ändrig rugggängig, un zeig e Vorschau aa. Doodurch chasch in dr Zammefassig e Begründig aagää.",
        "tooltip-preferences-save": "Yystellige spychere",
        "tooltip-summary": "Gib e churzi Zämmefassig yy",
-       "notacceptable": "Dr Wiki-Server cha d Date nit im e Format z Verfiegig stelle, wu Dyy Grät cha läse.",
        "anonymous": "{{PLURAL:$1|Anonyme Benutzer|Anonymi Benutzer}} uff {{SITENAME}}",
        "siteuser": "{{SITENAME}}-Benutzer $1",
        "anonuser": "anonyme {{SITENAME}}-Benutzer $1",
        "newimages-summary": "Die Spezialsyte zeigt di zletscht uffegladene Dateie aa.",
        "newimages-legend": "Filter",
        "newimages-label": "Dateiname (oder e Teil devu):",
-       "showhidebots": "(Bötli $1)",
        "noimages": "Kei Dateie gfunde.",
        "ilsubmit": "Suech",
        "bydate": "noch Datum",
        "autosumm-replace": "Dr Inhalt vo dr Syte isch ersetzt worde: '$1'",
        "autoredircomment": "E Wyterleitig uf [[$1]] isch erstellt worde",
        "autosumm-new": "Het Syte aagleit mit '$1'",
-       "livepreview-loading": "Am Lade …",
-       "livepreview-ready": "Am Lade… Fertig!",
-       "livepreview-failed": "Live-Vorschau nit megli! Bitte di normal Vorschau verwände.",
-       "livepreview-error": "Verbindig nit megli: $1 „$2“. Bitte di normal Vorschau verwände.",
        "lag-warn-normal": "Bearbeitige in dr letschte {{PLURAL:$1|Sekund|$1 Sekunde}} wäre in däre Lischt nonig aazeigt.",
        "lag-warn-high": "Wäg ere hoche Datebank-Uslaschtig wäre d Bearbeitige in dr letschte {{PLURAL:$1|Sekund|$1 Sekunde}} in däre Lischt nonig aazeigt.",
-       "watchlistedit-numitems": "Uf dynrer Beobachtigslischt sin {{PLURAL:$1|ei Ytrag|$1 Yträg}}, Diskussionssyte werde nüt zäält.",
-       "watchlistedit-noitems": "Du hesch kei Syte uf dynrer Beobachtigslischt.",
        "watchlistedit-normal-title": "D Beobachtigslischt bearbeite",
        "watchlistedit-normal-legend": "Yträg vo dynrer Beobachtigslischt entferne",
        "watchlistedit-normal-explain": "Doo unte sihsch d Yytreg uf Dyyre Beobachtigslischt. Zum e Yytrag uusenee muesch s Chäschtli dernäbe markiere un derno ganz unte uf „{{int:Watchlistedit-normal-submit}}“ drucke. Du chasch Dyyni Beobachtigslischt au als [[Special:EditWatchlist/raw|Lischte bearbeite]].",
        "compare-invalid-title": "Dr Sytename, wu Du aagee hesch, isch nit giltig",
        "compare-title-not-exists": "Dr Sytename, wu Du aagee hesch, git s nit.",
        "compare-revision-not-exists": "Die Version, wu Du aagee hesch, git s nit.",
-       "dberr-header": "Des Wiki het e Probläm",
        "dberr-problems": "Excusez! Die Seite het im Momänt tächnischi Schwirigkeite.",
        "dberr-again": "Wart e paar Minute un lad derno nej.",
        "dberr-info": "(Cha kei Verbindig zum Datebank-Server härstelle: $1)",
index 42a0eee..bc124ce 100644 (file)
@@ -20,7 +20,8 @@
                        "Rangilo Gujarati",
                        "RaviC",
                        "Sushant savla",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "કડીઓની નીચે લીટી (અંડરલાઇન):",
        "readonly_lag": "કનિષ્ઠ માહિતીસંચ સર્વરો મુખ્ય સર્વર સુધી પહોંચી ત્યા સુધી આ માહિતીસંચ પર સ્વયંચલિત રીતે તાળું મરાયું છે",
        "internalerror": "આંતરિક ત્રુટિ",
        "internalerror_info": "આંતરિક ત્રુટિ: $1",
-       "fileappenderrorread": "ઉમેરો કરતાં \"$1\" વાંચી શકાયું નથી",
-       "fileappenderror": "\"$1\" ને \"$2\" શાથે જોડી શકાશે નહીં.",
        "filecopyerror": "\"$1\" થી \"$2\"માં નકલ નિષ્ફળ.",
        "filerenameerror": "\"$1\" નું નામ બદલીને \"$2\" કરવામાં નિષ્ફળ.",
        "filedeleteerror": "\"$1\" ફાઇલ હટાવી ન શકાઇ.",
        "directorycreateerror": "ડિરેક્ટરી \"$1\" ન બનાવી શકાઇ.",
        "filenotfound": "ફાઇલ \"$1\" ન મળી.",
-       "fileexistserror": "ફાઇલ \"$1\"માં ન લખી શકાયું : ફાઇલ અસ્તિત્વ ધરાવે છે.",
        "unexpected": "અણધારી કિંમત: \"$1\"=\"$2\".",
        "formerror": "ત્રુટિ: પત્રક રજૂ થયું નહીં",
        "badarticleerror": "આ ક્રિયા આ પાના ઉપર કરવી શક્ય નથી.",
        "userlogin-resetpassword-link": "તમારો પાસવર્ડ ભૂલી ગયા છો?",
        "userlogin-loggedin": "તમે પહેલેથી {{GENDER:$1|$1}} તરીકે પ્રવેશ કરેલો જ છે.\nબીજા સભ્ય તરીકે પ્રવેશ કરવા માટે નીચેનું ફોર્મ વાપરો.",
        "userlogin-createanother": "બીજું ખાતું બનાવો",
-       "createacct-join": "તમારી માહિતી નીચે દાખલ કરો.",
-       "createacct-another-join": "નવા ખાતાંની માહિતી નીચે દાખલ કરો.",
        "createacct-emailrequired": "ઇમેલ સરનામું",
        "createacct-emailoptional": "ઇમેલ સરનામું (વૈકલ્પિક)",
        "createacct-email-ph": "તમારું ઇમેલ સરનામું દાખલ કરો",
        "savearticle": "પાનું સાચવો",
        "preview": "પૂર્વાવલોકન",
        "showpreview": "ઝલક દર્શાવો",
-       "showlivepreview": "જીવંત પૂર્વાવલોકન",
        "showdiff": "ફેરફારો દર્શાવો",
        "anoneditwarning": "'''ચેતવણી:''' તમે તમારા સભ્ય નામથી પ્રવેશ કર્યો નથી.\nઆ પાનાનાં ઇતિહાસમાં તમારૂં આઇ.પી. (IP) એડ્રેસ નોંધવામાં આવશે.",
        "anonpreviewwarning": "તમે સભ્યનામથી પ્રવેશ કર્યો નથી,આ પાનું ઈતિહાસમાંતમારા IP સરનામાના નામે  સાચવવામાં આવશે",
        "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મહેરબાની કરીને કોઇ પણ પત્ર વ્યવહારમાં ઉપરની બધીજ માહિતીનો ઉલ્લેખ કરશો.",
-       "autoblockedtext": "તમારà«\81àª\82  IP àª¸àª°àª¨àª¾àª®àª¾ àªªàª° àª¸à«\8dવયàª\82 àª\9aાલિત àª°à«\80તà«\87 àª°à«\8bàª\95 àª²àª\97ાવà«\80 àª¦à«\87વાàª\88 àª\9bà«\87 àª\95à«\87મàª\95à«\87 àª¤à«\87નà«\87 àª\85નà«\8dય àª¸àª­à«\8dય àª¦à«\8dવારા àªµàª¾àªªàª°àªµàª¾àª®àª¾àª\82 àª\86વà«\8dયà«\81àª\82 àª¹àª¤à«\81àª\82 àª\9cà«\87ના àªªàª°  $1 àª¦à«\8dવારા \n àªªàª¹à«\87લà«\87થà«\80 àª°à«\8bàª\95 àª²àª\97ાવાàª\87 àª\9bà«\87.\n:''$2''\n\n* àª°à«\8bàª\95નà«\80 àª¶àª°à«\81àª\86ત : $8\n* àª°à«\8bàª\95નà«\80 àª¸àª®àª¾àªªà«\8dતિ àª¤àª¿àª¥à«\80 : $6\n* àªªà«\8dરસà«\8dતાવિત àª°à«\8bàª\95 àª¸àª¹àª¨ àª\95રનાર : $7\n\nતમà«\87 $1 àª\85થવા  àª\95à«\8bàª\87 àª\85નà«\8dય  [[{{MediaWiki:Grouppage-sysop}}|પà«\8dરબàª\82ધàª\95 ]] àª¨à«\8b àª¸àª\82પરà«\8dàª\95 àª\95રà«\80 àª°à«\8bàª\95નà«\80 àª\9aરà«\8dàª\9aા àª\95રà«\80 àª¶àª\95à«\8b.\n\nનà«\8bàª\82ધà«\8b àª\95à«\87 àª¤à«\87મà«\87 \"àª\86 àª¸àª­à«\8dયનà«\87 àª\88-મà«\87લ àª\95રà«\8b\" àªµàª¿àª\95લà«\8dપના àªµàª¾àªªàª°à«\80 àª¶àª\95à«\8b àª¸àª¿àªµàª¾àª¯àª\95à«\87 àª¤àª®àª°à«\80 àªªàª¾àª¸à«\87 àª¤àª®àª¾àª°àª¾ [[Special:Preferences|user preferences]] àª®àª¾àª\82 àªµà«\88ધ àª\88-મà«\87લ àª¸àª°àª¨àª¾àª®à«\81àª\82 àª¹à«\8bય àª\85નà«\87તà«\87વાપરà«\80 àª¤àª®àª°àª¾ àªªàª° àª°à«\8bàª\95 àª²àª\97ાડવામાàª\82 àª\86વà«\80 àª¨ àª¹à«\8bય.\n\nતમારà«\81àª\82 àª¹àª¾àª²àª¨à«\81àª\82   IP àª¸àª°àª¨àª¾àª®à«\81àª\82  $3 àª\9bà«\87, àª\85નà«\87 àª°à«\8bàª\95નà«\80  ID àª\9bà«\87  #$5.\nàª\86 àª®àª¾àª¹àª¿àª¤à«\80 àª¤àª®àª¾àª°à«\80 àªªà«\82àª\9bપરàª\9bમાàª\82 àª\9cરà«\82ર àª\89મà«\87રશà«\8b",
+       "autoblockedtext": "તમારાàª\82 IP àª¸àª°àª¨àª¾àª®àª¾ àªªàª° àª¸à«\8dવયàª\82àª\9aાલિત àª°à«\80તà«\87 àª°à«\8bàª\95 àª²àª\97ાવà«\80 àª¦à«\87વાàª\88 àª\9bà«\87 àª\95à«\87મàª\95à«\87 àª¤à«\87 àª\85નà«\8dય àª¸àª­à«\8dય àª¦à«\8dવારા àªµàª¾àªªàª°àªµàª¾àª®àª¾àª\82 àª\86વà«\8dયà«\81àª\82 àª¹àª¤à«\81àª\82 àª\9cà«\87ના àªªàª° $1 àª¦à«\8dવારા àªªàª¹à«\87લà«\87થà«\80 àªªà«\8dરતિબàª\82ધ àª®à«\82àª\95વામાàª\82 àª\86વà«\8dયà«\8b àª\9bà«\87.\n:''$2''\n\n* àª°à«\8bàª\95નà«\80 àª¶àª°à«\81àª\86ત : $8\n* àª°à«\8bàª\95નà«\80 àª¸àª®àª¾àªªà«\8dતિ : $6\n* àªªà«\8dરસà«\8dતાવિત àª°à«\8bàª\95 àª¸àª¹àª¨ àª\95રનાર : $7\n\nતમà«\87 $1 àª\85થવા àª\95à«\8bàª\87 àª\85નà«\8dય [[{{MediaWiki:Grouppage-sysop}}|પà«\8dરબàª\82ધàª\95]]નà«\8b àª¸àª\82પરà«\8dàª\95 àª\95રà«\80 àª°à«\8bàª\95નà«\80 àª\9aરà«\8dàª\9aા àª\95રà«\80 àª¶àª\95à«\8b.\n\nનà«\8bàª\82ધà«\8b àª\95à«\87 àª¤à«\87મà«\87 \"àª\86 àª¸àª­à«\8dયનà«\87 àª\88-મà«\87લ àª\95રà«\8b\" àªµàª¿àª\95લà«\8dપ àª¨àª¹àª¿ àªµàª¾àªªàª°à«\80 àª¶àª\95à«\8b, àª¸àª¿àªµàª¾àª¯àª\95à«\87 àª¤àª®àª°à«\80 àªªàª¾àª¸à«\87 àª¤àª®àª¾àª°àª¾ [[Special:Preferences|user preferences]]માàª\82 àªµà«\88ધ àª\88-મà«\87લ àª¸àª°àª¨àª¾àª®à«\81àª\82 àª¹à«\8bય àª\85નà«\87 àª¤à«\87 àªµàª¾àªªàª°àªµàª¾ àªªàª° àªªà«\8dરતિબàª\82ધ àª¨ àª®à«\82àª\95વામાàª\82 àª\86વà«\8dયà«\8b àª¹à«\8bય.\n\nતમારà«\81àª\82 àª¹àª¾àª²àª¨à«\81àª\82 IP àª¸àª°àª¨àª¾àª®à«\81àª\82 $3 àª\9bà«\87, àª\85નà«\87 àª°à«\8bàª\95નà«\80 ID àª\9bà«\87 #$5.\nàª\86 àª®àª¾àª¹àª¿àª¤à«\80 àª¤àª®àª¾àª°à«\80 àªªà«\82àª\9bપરàª\9bમાàª\82 àª\9cરà«\82ર àª\89મà«\87રશà«\8b.",
        "blockednoreason": "કોઇ કારણ દર્શાવવામાં આવ્યું નથી",
        "whitelistedittext": "ફેરફાર કરવા માટે તમારે $1 કરવાનું છે.",
        "confirmedittext": "પાનાંમાં ફેરફાર કરવા માટે તમારે તમારા ઇમેલની પુષ્ટિ કરવી પડશે.\nમહેરબાની કરી [[Special:Preferences|મારી પસંદ]]માં જઇને તમારું ઇમેલ સરનામું આપો અને તેને પ્રમાણિત કરો.",
        "accmailtext": "[[User talk:$1|$1]] માટે રચેલ ગુપ્તસંજ્ઞા $2 ને મોકલાવી દેવાઇ છે. આ નવા ખાતાનીગુપ્તસંજ્ઞા પ્રવેશ કર્યા બાદ ''[[Special:ChangePassword|ગુપ્તસંજ્ઞા બદલો]]'' વાપરીને બદલી શકાશે.",
        "newarticle": "(નવીન)",
        "newarticletext": "આપ જે કડીને અનુસરીને અહીં પહોંચ્યા છો તે પાનું અસ્તિત્વમાં નથી.\n<br />નવું પાનું બનાવવા માટે નીચે આપેલા ખાનામાં લખવાનું શરૂ કરો (વધુ માહિતિ માટે [$1 મદદ] જુઓ).\n<br />જો આપ ભુલમાં અહીં આવી ગયા હોવ તો, આપનાં બ્રાઉઝર નાં '''બેક''' બટન પર ક્લિક કરીને પાછા વળો.",
-       "anontalkpagetext": "----''આ એક અજ્ઞાત સભ્યનું ચર્ચા પાનું છે જેણે યા તો પોતાનું ખાતું નથી ખોલ્યું યાતો તેને વાપરતો નથી.\nઆથી તેને ઓળખવા માટે અમારે સાંખ્યિક  IP સરનામાની મદદ લેવી પડી છે.\nઆવું IP સરનામુંઘણાંઅન્યસભ્યો પણ વાપરતા હોઇ શકે.\nજો તમે અજ્ઞાત સભ્ય હોવ અને ઈચ્છતા હોવ કે અસંધિત ટિપ્પનીઓ તમારી તરફ વાળવામાં આવે છે, \nતો કૃપયા  [[Special:UserLogin/signup|create an account]] અથવા [[Special:UserLogin|log in]] નો ઉપયોગ કરશો  જેથી તમને કોઈ અજ્ઞાત સભ્ય સમજીને તમારી ટીકા ન કરાય.''",
+       "anontalkpagetext": "----\n<em>આ એક અજ્ઞાત સભ્યનું ચર્ચા પાનું છે જેમણે ક્યાં તો પોતાનું ખાતું ખોલ્યું નથી અથવા તો તેને વાપરતા નથી.</em>\nઆથી તેમને ઓળખવા માટે અમારે સાંખ્યિક IP સરનામાની મદદ લેવી પડી છે.\nઆવું IP સરનામું ઘણાં અન્ય સભ્યો પણ વાપરતા હોઇ શકે.\nજો તમે અજ્ઞાત સભ્ય હોવ અને માનતા હોવ કે અસંધિત ટિપ્પણીઓ તમારી તરફ વાળવામાં આવી છે, તો કૃપયા  [[Special:UserLogin/signup|create an account]] અથવા [[Special:UserLogin|log in]]નો ઉપયોગ કરશો જેથી તમને કોઈ અજ્ઞાત સભ્ય સમજવાની ભૂલ ભવિષ્યમાં ટાળી શકાય.",
        "noarticletext": "આ પાનામાં હાલમાં કોઇ માહિતિ નથી.\nતમે  [[Special:Search/{{PAGENAME}}|આ શબ્દ]] ધરાવતાં અન્ય લેખો શોધી શકો છો, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} સંલગ્ન માહિતિ પત્રકોમાં શોધી શકો છો],\nઅથવા  [{{fullurl:{{FULLPAGENAME}}|action=edit}} આ પાનામાં ફેરફાર કરી] માહિતિ ઉમેરવાનું શરૂ કરી શકો છો</span>.",
        "noarticletext-nopermission": "આ પાનામાં હાલમાં કોઇ માહિતિ નથી.\nતમે  [[Special:Search/{{PAGENAME}}|આ શબ્દ]] ધરાવતાં અન્ય લેખો શોધી શકો છો, અથવા <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} સંલગ્ન માહિતિ પત્રકોમાં શોધી શકો છો], પરંતુ તમને આ પાનું બનાવવાની મંજૂરી નથી.",
        "userpage-userdoesnotexist": "સભ્ય ખાતું \"<nowiki>$1</nowiki>\"ની નોંધણીનથી થઈ.\nશું તમે ખરેખર આ પાનાની રચના કે ફેરફાર કરવા માંગો છો",
        "edit-gone-missing": "આ પાને અધ્યતન ન બનાવી શકાયું \nલાગે છે કોઇએ આ પાનું હટાવી દીધું છે",
        "edit-conflict": "સંપાદન સંઘર્ષ.",
        "edit-no-change": "તમારા ફેરફારો અવગણાયા, કેમકે અક્ષરકાયામાં કોઈ ફેરફારાના હતો",
-       "postedit-confirmation": "તમે કરેલો ફેરફાર સચવાઈ ગયો છે.",
+       "postedit-confirmation-saved": "તમે કરેલો ફેરફાર સચવાઈ ગયો છે.",
        "edit-already-exists": "નવું પાનું બનાવી ન શકાયું\nતે પહેલેથી હાજર છે.",
        "defaultmessagetext": "મૂળભૂત સંદેશ લખાણ",
        "invalid-content-data": "અયોગ્ય વિગત માહિતી",
        "search-nonefound": "તમે આપેલી માહિતી ને મળતાં આવતાં કોઈ પરિણામો નથી",
        "powersearch-legend": "વધુ પર્યાયો સાથે શોધો",
        "powersearch-ns": "નામસ્થળોમાં શોધો:",
-       "powersearch-redir": "અન્યત્ર વાળેલાં પાનાંની યાદી",
        "powersearch-togglelabel": "ચકાસો:",
        "powersearch-toggleall": "બધા",
        "powersearch-togglenone": "એકે નહિ",
        "prefs-advancedsearchoptions": "અદ્યતન વિકલ્પો",
        "prefs-advancedwatchlist": "અદ્યતન વિકલ્પો",
        "prefs-displayrc": "પ્રદર્શન વિકલ્પો",
-       "prefs-displaysearchoptions": "પ્રદર્શન વિકલ્પો",
        "prefs-displaywatchlist": "પ્રદર્શન વિકલ્પો",
        "prefs-tokenwatchlist": "નિશાની",
        "prefs-diffs": "ભેદો",
        "recentchanges-legend-heading": "'''કળ:'''",
        "recentchanges-legend-newpage": "([[Special:NewPages|નવા પાનાઓની યાદી]] પણ જુઓ)",
        "rcnotefrom": "નીચે <strong>$2</strong> થી ફેરફારો દર્શાવેલ છે (<strong>$1</strong> સુધી દર્શાવલે છે).",
-       "rclistfrom": "$1 બાદ થયેલા નવા ફેરફારો બતાવો",
+       "rclistfrom": "$3 $2 બાદ થયેલા નવા ફેરફારો બતાવો",
        "rcshowhideminor": "નાના ફેરફારો $1",
        "rcshowhideminor-show": "બતાવો",
        "rcshowhideminor-hide": "છુપાવો",
        "uploadstash-refresh": "અધ્યતન ફાઇલ યાદિ",
        "invalid-chunk-offset": "અમાન્ય કાપી કાઢેલો ઓફસેટ",
        "img-auth-accessdenied": "પ્રવેશ વર્જીત",
-       "img-auth-nopathinfo": "પથ માહિતી ગાયબ.\nઆ માહિતી પસાર કરવા તમારું સર્વર સજ્જ નથી.\nતે કદાચ CGI-આધારિત હોય અને img_authને આધાર ન આપે.\nhttps://www.mediawiki.org/wiki/Manual:Image_Authorization. જુઓ",
+       "img-auth-nopathinfo": "પથ માહિતી ગાયબ.\nઆ માહિતી પસાર કરવા તમારું સર્વર સજ્જ નથી.\nતે કદાચ CGI-આધારિત હોય અને img_authને આધાર ન આપે.\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization. જુઓ",
        "img-auth-notindir": "અર્જીત પથ ચડાવેલ ફાઈલની ડીરેક્ટરીમાં નથી",
        "img-auth-badtitle": "\"$1\" માટે વૈધ શીર્ષક ન શોધી શકાયું",
        "img-auth-nologinnWL": "તમે પ્રવેશ કર્યો નથી અને અને : $1 ધવલ યાદિમાં નથી.",
        "watchlist-details": "ચર્ચાનાં પાનાં ન ગણતા {{PLURAL:$1|$1 પાનું|$1 પાનાં}} ધ્યાનસૂચીમાં છે.",
        "wlheader-enotif": "ઈમેલ સૂચના પદ્ધતિ સક્રીય કરાઈ.",
        "wlheader-showupdated": "તમારી છેલ્લી મુલાકાત પછી બદલાયેલાં પાના  '''ઘાટા''' અક્ષરો વડે દર્શાવ્યાં છે.",
-       "watchmethod-recent": "હાલમાં ફેરફાર થયેલ પાનાની ચકાસણી જારી",
-       "watchmethod-list": "હાલમાં થયેલ ફેરફાર માટે નીરીક્ષીત પાના તપાસાય છે",
-       "watchlistcontains": "તમારી ધ્યાનસૂચીમાં $1 {{PLURAL:$1|પાનું|પાનાં}} છે.",
-       "iteminvalidname": "વસ્તુ '$1' સાથે સમસ્યા, અવૈધ નામ...",
        "wlshowlast": "છેલ્લા $1 કલાક $2 દિવસ $3 બતાવો",
        "watchlist-options": "ધ્યાનસૂચિના વિકલ્પો",
        "watching": "નજર રાખી રહ્યાં છો...",
        "enotif_lastvisited": "તમારી પાછલી મુલાકાત પછી થયેલા બધા ફેરફારો માટે $1 જુઓ",
        "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\nઆપની વિશ્વાસુ {{SITENAME}} સૂચના પ્રણાલી   \n\n--\nઇમેલ સૂચના પ્રણાલી બદલવા માટે મુલાકાત લો\n{{canonicalurl:{{#special:Preferences}}}}\n\nતમારી ધ્યાનસૂચિની વિક્લ્પ ગોઠવણી માટે મુલાકાત લો\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nધ્યાનસૂચિમાંથી પાનું હટાવવા માટે મુલાકાત લો\n$UNWATCHURL\n\nમંતવ્યો અને વધુ મદદ માટે\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "પ્રિય $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nફેરફારોનો સારાંશ: $PAGESUMMARY $PAGEMINOREDIT\n\nસંપાદકનો સંપર્ક:\nઇમેલ: $PAGEEDITOR_EMAIL\nવિકિ: $PAGEEDITOR_WIKI\n\nજ્યાં સુધી તમે પ્રવેશ કરીને આ પાનાની મુલાકાત નહી લો ત્યાં સુધી તેમાં ભવિષ્યમાં થનાર કોઇ પણ ફેરફારની સૂચના તમને મળશે નહિ. તમે તમારી ધ્યાન સૂચિમાં તમે જોયેલા પાના સંબંધી સૂચનાને લાગતા વિકલ્પોમાં ફેરફાર કરી શકો છો.\n\n\nઆપની વિશ્વાસુ {{SITENAME}} સૂચના પ્રણાલી   \n\n--\nઇમેલ સૂચના પ્રણાલી બદલવા માટે, મુલાકાત લો\n{{canonicalurl:{{#special:Preferences}}}}\n\nતમારી ધ્યાનસૂચિની વિક્લ્પ ગોઠવણી માટે, મુલાકાત લો\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nધ્યાનસૂચિમાંથી પાનું હટાવવા માટે, મુલાકાત લો\n$UNWATCHURL\n\nમંતવ્યો અને વધુ મદદ માટે:\n$HELPPAGE",
        "created": "બનાવ્યું",
        "changed": "બદલ્યું",
        "deletepage": "પાનું હટાવો",
        "blockip": "સભ્ય પર પ્રતિબંધ મુકો",
        "blockip-legend": "સભ્ય પર પ્રતિબંધ મુકો",
        "blockiptext": "કોઈ ચોક્કસ IP સરનામું કે સભ્યના લેખન યોગદાન પર પ્રતિબંધ મુકવા નીચેનું ફોર્મ વાપરો.\nતેનો ઉપયોગ માત્ર ભાંગફોડિયા પ્રવૃત્તિઓને રોકવા અને  [[{{MediaWiki:Policy-url}}|નીતિ]] અનુસાર જ હોવો જોઈએ.\nકારણનું ખાનું અવશ્ય ભરશો (દા.ત. અમુક ભાંગફોડ કરાયેલા પાનાનો સંદર્ભ).",
-       "ipadressorusername": "IP સરનામું અથવા સભ્યનામ:",
+       "ipaddressorusername": "IP સરનામું અથવા સભ્યનામ:",
        "ipbexpiry": "સમાપ્તિ:",
        "ipbreason": "કારણ:",
        "ipbreason-dropdown": "*સામાન્ય પ્રતિબંધ કારણો\n** ખોટી માહિતી ઉમેરાઈ  \n** પાનામાંથી માહિતી ભૂંસી નાંખી\n** અનાવશ્યક બાહ્ય કડીઓ ઉમેરી \n** પાનામાં મૂર્ખામીભરી/અર્થહીન માહિતી ઉમેરી\n** ત્રાસદાયક વર્તન \n** ઘણા ખાતાઓ અને દુરુપયોગ\n** અસ્વીકાર્ય સભ્ય નામ\n** આત્યંતિક ભાંગફોડ",
-       "ipb-hardblock": "àª\85àª\9fàª\95ાવà«\8b àª\86 IP àª¸àª°àª¨àª¾àª®à«\81àª\82 àª®àª¾àª\82થà«\80 àª«à«\87રફાર àªµàªªàª°àª¾àª¶àª\95રà«\8dતાàª\93 àª®àª¾àª\82 àª²à«\89àª\97",
+       "ipb-hardblock": "àª\86 IP àª¸àª°àª¨àª¾àª®àª¾àª\82 àªªàª°àª¥à«\80 àª²à«\8bàª\97-àª\88ન àª¥àª¯à«\87લા àª¸àª­à«\8dયà«\8bનà«\87 àª«à«\87રફાર àª\95રતા àª\85àª\9fàª\95ાવà«\8b.",
        "ipbcreateaccount": "ખાતા ખોલવા પર પ્રતિબંધ",
        "ipbemailban": "સભ્યના ઇ-મેલ મોકલવા પર પ્રતિબંધ મૂકો",
        "ipbenableautoblock": "આ સભ્ય દ્વારા વપરાયેલ  IP સરનામા પર અને તત-પશ્ચ્યાત વપરાયેલ IP સરનામા ને સ્વયંચાલિત રીતે રોક લગાવો",
        "tooltip-undo": "\"રદ કરો\" આ ફેરફારને પાછો વાળશે અને ફેરફાર પછીનું પૂર્વાવલોકન ફોર્મ નવા પાના તરીકે ખુલશે.\nતે તમને 'સારાંશ'માં કારણ જણાવવા દેશે.",
        "tooltip-preferences-save": "પસંદ સાચવો",
        "tooltip-summary": "ટૂંક સારાંશ ઉમેરો",
-       "notacceptable": "તમારા ગ્રાહક સમજી શકે તે રીતે વિકિ માહિતી નહીં આપી શકે",
        "anonymous": "{{SITENAME}} ના અ‍જ્ઞાત {{PLURAL:$1|સભ્ય|સભ્યો}}",
        "siteuser": "{{SITENAME}} સભ્ય $1",
        "anonuser": "{{SITENAME}} અજ્ઞાત સભ્ય  $1",
        "newimages-summary": "આ ખાસ પાનું છેવટની  ચડાવેલા વફાઈલા બતાવે છે",
        "newimages-legend": "ચાળણી",
        "newimages-label": "ફાઈલનામ (કે તેનો ભાગ)",
-       "showhidebots": "($1 બોટ)",
        "noimages": "જોવા માટે કશું નથી.",
        "ilsubmit": "શોધો",
        "bydate": "તારીખ પ્રમાણે",
        "autosumm-replace": "માહિતીને \"$1\" થી બદલી",
        "autoredircomment": "[[$1]] પર દિશાનિર્દેશિત",
        "autosumm-new": "$1થી શરૂ થતું નવું પાનું બનાવ્યું",
-       "livepreview-loading": "લવાઇ રહ્યું છે...",
-       "livepreview-ready": "લવાઇ રહ્યું છે .... તૈયાર!",
-       "livepreview-failed": "સજીવ ઝલક અસફળ\nસામાન્ય ઝલક જુઓ",
-       "livepreview-error": " $1 \"$2\" નો સંપર્ક અસફળ\nસામાન્ય ઝલક જુઓ",
        "lag-warn-normal": "$1 {{PLURAL:$1|સેકંડ|સેકંડો}} પછી થયેલ  નવા સુધારા કદાચ ન બતાવી શકાય.",
        "lag-warn-high": "માહિતીસંચ સર્વરના લાંબાગાળાને કારણે $1 {{PLURAL:$1|સેકંડ|સેકંડો}} પછી કરેલા ફેરફાર જોઇ શકાશે નહીં",
-       "watchlistedit-numitems": "તમારી ધ્યાન સૂચિ {{PLURAL:$1|1 શીર્ષક |$1 શીર્ષકો}} ધરાવે છે, ચર્ચાના પાના સિવાય.",
-       "watchlistedit-noitems": "તમારી ધ્યાન સૂચિમાં કોઇ શીર્ષક નથી.",
        "watchlistedit-normal-title": "ધ્યાનસૂચિ માં ફેરફાર કરો",
        "watchlistedit-normal-legend": "ધ્યાનસૂચિમાંથી આશીર્ષકો કાઢી નાખો",
        "watchlistedit-normal-explain": "તમારી ધ્યાનસૂચિના શીર્ષકો અહીં બતાવ્યાં છે.\nકોઇ શીર્ષક હતાવવા માટે , તેની બાજું નું ખાનું અંકિત કરો , અને \"{{int:Watchlistedit-normal-submit}}\"ના પર ક્લિક કરો.\nતમે [[Special:EditWatchlist/raw|edit the raw list]]માં  બદલાવ પણ કરી શકો.",
        "compare-invalid-title": "આ શીર્ષક અમાન્ય છે.",
        "compare-title-not-exists": "આ શીર્ષક અસ્તિત્વમાં નથી.",
        "compare-revision-not-exists": "આ આવૃત્તિ અસ્તિત્વમાં નથી.",
-       "dberr-header": "આ વિકિમાં તકલીફ છે",
        "dberr-problems": "માફ કરશો! આ સાઇટ તકનિકી અડચણો અનુભવી રહી છે.",
        "dberr-again": "થોડી વાર રાહ જોઈને ફરી પેજ લોડ કરવાનો પ્રયત્ન કરો.",
        "dberr-info": "(માહિતી સંચય સર્વર : $1નો સંપર્ક નથી કરી શકાયો)",
index 036afab..cb5b009 100644 (file)
@@ -4,7 +4,8 @@
                        "Alison",
                        "Kaganer",
                        "MacTire02",
-                       "Shimmin Beg"
+                       "Shimmin Beg",
+                       "아라"
                ]
        },
        "tog-underline": "Cur linnaghyn fo chianglaghyn:",
@@ -15,7 +16,6 @@
        "tog-numberheadings": "Cur earrooyn gyn smooinaght er kione-linnaghyn",
        "tog-showtoolbar": "Taishbyn barr greieyn (ta feme ec er JavaScript)",
        "tog-editondblclick": "Reagh duillagyn lesh crig dooblit (ta feme ec er JavaScript)",
-       "tog-rememberpassword": "Cooinnee my fys loggal stiagh er y cho-earrooder shoh (rish wheesh as $1 {{PLURAL:$1|laa|laa|laa|laaghyn}})",
        "tog-watchcreations": "Cur duillagyn ta crooit aym rish my rolley arrey",
        "tog-watchdefault": "Cur duillagyn ta reaghit aym rish my rolley arrey",
        "tog-watchmoves": "Cur duillagyn ta scughit aym rish my rolley arrey",
        "internalerror": "Marranys ynveanagh",
        "internalerror_info": "Marranys yn-veanagh: $1",
        "filenotfound": "Cha dooar shin y coadan \"$1\".",
-       "fileexistserror": "Cha dod shin screeu da'n choadan \"$1\": t'eh ayn hannah",
        "badarticleerror": "Cha nod oo jannoo yn obbyr shen er y duillag shoh.",
        "cannotdelete-title": "Gyn jargaght y duillag \"$1\" y scryssey",
        "badtitle": "Drogh-ennym",
        "savearticle": "Sauail y duillag",
        "preview": "Roie-haishbynys",
        "showpreview": "Taishbyn roie-haishbynys",
-       "showlivepreview": "Roie-haishbynys bio",
        "showdiff": "Taishbyn caghlaaghyn",
        "anoneditwarning": "'''Raaue:''' Cha nel oo loggit stiagh.\nBee dt'enmys IP recortyssit ayns shennaghys reaghee yn duillag shoh.",
        "missingcommenttext": "Taggloo er heese, my sailt.",
        "searchall": "yn clane",
        "powersearch-legend": "Ard-ronsaghey",
        "powersearch-ns": "Ronsee ayns boayl-enmyn:",
-       "powersearch-redir": "Cur aa-enmyssyn er y rolley",
        "search-external": "Ronsaghey mooie",
        "preferences": "Tosheeaghtyn",
        "mypreferences": "My hosheeaghtyn",
        "prefs-advancedsearchoptions": "Tosheeaghtyn crampey",
        "prefs-advancedwatchlist": "Tosheeaghtyn crampey",
        "prefs-displayrc": "Toshiaghtyn taishbyney",
-       "prefs-displaysearchoptions": "Toshiaghtyn taishbyney",
        "prefs-displaywatchlist": "Toshiaghtyn taishbyney",
        "prefs-diffs": "Cosoylaghey caghlaaghyn",
        "userrights": "Reireydys kiartyn ymmydeyr",
        "recentchanges-label-minor": "She myn-reaghey eh shoh",
        "recentchanges-label-bot": "Ren bot y reaghey shoh",
        "rcnotefrom": "Shoh heese ny caghlaaghyn veih '''$2''' (gys '''$1''' taishbynit).",
-       "rclistfrom": "Taishbyn ny caghlaaghyn s'noa veih $1",
+       "rclistfrom": "Taishbyn ny caghlaaghyn s'noa veih $3 $2",
        "rcshowhideminor": "$1 myn-arraghyn",
        "rcshowhidebots": "{{PLURAL:$1|$1 robot|$1 robot|$1 robot|$1 robotyn}}",
        "rcshowhideliu": "{{PLURAL:$1|$1 ymmydeyr|$1 ymmydeyr|$1 ymmydeyr|$1 ymmydeyryn}} ta loggit stiagh",
        "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.",
-       "watchlistcontains": "Ta $1 {{PLURAL:$1|duillag|duillagyn}} ayns dty rolley arrey.",
        "wlshowlast": "Taishbyn ny kied $1 ooryn $2 laaghyn $3 s'jerree",
        "watchlist-options": "Reihyn da'n rolley arrey",
        "watching": "Jannoo arrey...",
        "unwatching": "Stap y chur er arrey...",
        "enotif_impersonal_salutation": "{{SITENAME}} ymmydeyr",
        "enotif_anon_editor": "ymmydeyr $1 neuenmyssit",
-       "enotif_body": "$WATCHINGUSERNAME veen,\n\n\nVa'n duillag $PAGETITLE er {{SITENAME}} $CHANGEDORCREATED er $PAGEEDITDATE liorish $PAGEEDITOR, jeeagh er $PAGETITLE_URL son y lhieggan roie dy akin.\n\n$NEWPAGE\n\nGiare-choontey yn reagheyder: $PAGESUMMARY $PAGEMINOREDIT\n\nCur fys er y reagheyder:\npost: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nCha bee fograghyn elley er caghlaaghyn elley agh my jigys shiu dys y duillag shen ynrican.\nFoddee shiu aajeshaghey bratteeyn ny fograghyn ry hoi dagh duillag er dty rolley arrey.\n\n             Dty chorys fograghyn caarjoil ec {{SITENAME}}\n\n--\n\nDys toshiaghtyn fys post-y y chaghlaa, cur keayrt er\n{{canonicalurl:{{#special:Preferences}}}}\n\nDys toshiaghtyn dty rolley arrey y chaghlaa, cur keayrt er\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nDys scryssey duillag ass dty rolley arrey, cur keayrt er\n$UNWATCHURL\n\nAaveaghey as cooney s'odjey:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "$WATCHINGUSERNAME veen,\n\n\nVa'n duillag $PAGETITLE er {{SITENAME}} $CHANGEDORCREATED er $PAGEEDITDATE liorish $PAGEEDITOR, jeeagh er $PAGETITLE_URL son y lhieggan roie dy akin.\n\n$NEWPAGE\n\nGiare-choontey yn reagheyder: $PAGESUMMARY $PAGEMINOREDIT\n\nCur fys er y reagheyder:\npost: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nCha bee fograghyn elley er caghlaaghyn elley agh my jigys shiu dys y duillag shen ynrican.\nFoddee shiu aajeshaghey bratteeyn ny fograghyn ry hoi dagh duillag er dty rolley arrey.\n\n             Dty chorys fograghyn caarjoil ec {{SITENAME}}\n\n--\n\nDys toshiaghtyn fys post-y y chaghlaa, cur keayrt er\n{{canonicalurl:{{#special:Preferences}}}}\n\nDys toshiaghtyn dty rolley arrey y chaghlaa, cur keayrt er\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nDys scryssey duillag ass dty rolley arrey, cur keayrt er\n$UNWATCHURL\n\nAaveaghey as cooney s'odjey:\n$HELPPAGE",
        "created": "crooit",
        "changed": "ceaghlit",
        "deletepage": "Scryss y duillag",
        "whatlinkshere-filters": "Shollaneyn",
        "blockip": "Glass magh yn ymmydeyr",
        "blockip-legend": "Glass magh yn ymmydeyr",
-       "ipadressorusername": "Enmys IP ny ennym ymmydeyr:",
+       "ipaddressorusername": "Enmys IP ny ennym ymmydeyr:",
        "ipbexpiry": "Jerrey:",
        "ipbreason": "Fa:",
        "ipbreason-dropdown": "* Oyr glassey cadjin\n** Inserting false information\n** Removing content from pages\n** Spamming links to external sites\n** Inserting nonsense/gibberish into pages\n** Intimidating behavior/harassment\n** Abusing multiple accounts\n* Oyr elley\n** Ennym ymmydeyryn neuchooie\n** Feyshtyn eddyr-wiki",
        "svg-long-desc": "coadan SVG, $1 × {{PLURAL:$2|$2 pixel|$2 phixel|$2 phixel|$2 pixelyn}} dy ennymagh, mooadys y choadan: $3",
        "show-big-image": "Jeeskeaylley ymlane",
        "newimages": "Laaragh coadanyn noa",
-       "showhidebots": "($1 botyn)",
        "ilsubmit": "Ronsee",
        "bydate": "rere date",
        "bad_image_list": "Shoh yn aght:\n\nCha nel agh meeryn ayns rolley (linnaghyn as * ec y toshiaght) ta goll er smooinaghtyn er.\nShegin da'n chied chiangley er linney ve ny chiangley da drogh choadan.\nKianglaghyn eiyrtyssagh erbee er yn linney shoh, t'ad goll er loaghtey myr lhimmaghyn, shen gra, duillagyn as ta'n coadan ayns-linney, foddee.",
        "table_pager_limit_submit": "Gow",
        "table_pager_empty": "Gyn eiyrtys",
        "autosumm-new": "Duillag crooit lesh: $1",
-       "watchlistedit-numitems": "Ta {{PLURAL:$1|1 ard-ennym|$1 ard-ennym|$1 ard-ennym|$1 ard-enmyn}} ayns dty rolley arrey, magh voish duillagyn resoonaght.",
-       "watchlistedit-noitems": "Cha nel ard-enmyn ayns dty rolley arrey.",
        "watchlistedit-normal-title": "Rolley arrey y reaghey",
        "watchlistedit-normal-legend": "Enmyn y scughey ass y rolley arrey",
        "watchlistedit-normal-submit": "Enmyn y scughey",
index 31f2f36..63e467b 100644 (file)
@@ -8,7 +8,8 @@
                        "Jetlag",
                        "Mnemonic kek",
                        "Urhixidur",
-                       "Xiaomingyan"
+                       "Xiaomingyan",
+                       "아라"
                ]
        },
        "tog-underline": "鏈接加底線:",
@@ -21,7 +22,6 @@
        "tog-showtoolbar": "展示編寫工具欄",
        "tog-editondblclick": "雙撳編寫頁面",
        "tog-editsectiononrightclick": "允許右撳標題編寫段落",
-       "tog-rememberpassword": "在邇隻瀏覽器記下亻厓嘅登入狀態(最多$1日)",
        "tog-watchcreations": "加亻厓建立嘅頁面撈上傳嘅文件加入亻厓嘅監視列表",
        "tog-watchdefault": "將亻厓編寫嘅頁面撈檔案加入亻厓嘅監視列表",
        "tog-watchmoves": "將亻厓移動嘅頁面撈檔案加入亻厓嘅監視列表",
        "readonly_lag": "附屬數據庫服務器正在將緩存更新到主服務器肚,數據庫已分自動鎖定",
        "internalerror": "內部差錯",
        "internalerror_info": "內部差錯:$1",
-       "fileappenderrorread": "附加當時無辦法讀取「$1」。",
-       "fileappenderror": "無辦法附加“$1”到“$2”。",
        "filecopyerror": "文件“$1”無辦法複製到“$2”。",
        "filerenameerror": "文件“$1”到無辦法重新命名到“$2”。",
        "filedeleteerror": "刪除毋到“$1”文件。",
        "directorycreateerror": "無辦法建立目錄“$1”。",
        "filenotfound": "尋毋到“$1”文件。",
-       "fileexistserror": "無法寫入文件“$1”:文件已存在",
        "unexpected": "毋正常數值:\"$1\"=\"$2\"。",
        "formerror": "差錯:無法提交表單",
        "badarticleerror": "無法在邇頁進行邇隻操作。",
        "userlogin-resetlink": "毋記得汝嘅登入信息?",
        "userlogin-resetpassword-link": "添忘訖汝嘅密碼?",
        "userlogin-loggedin": "汝已作為{{GENDER:$1|$1}}登錄。\n利用以下表單以作為另一賬戶登錄。",
-       "createacct-join": "輸入汝嘅基本資料:",
-       "createacct-another-join": "在下方輸入新帳號个資訊。",
        "createacct-emailrequired": "電郵地址:",
        "createacct-emailoptional": "電郵地址(可選)",
        "createacct-email-ph": "設置電郵地址",
        "savearticle": "保存本頁",
        "preview": "預覽",
        "showpreview": "展示預覽",
-       "showlivepreview": "即時預覽",
        "showdiff": "展示差別",
        "anoneditwarning": "'''警告:'''汝還吂登入。\n汝嘅IP地址將記錄在邇頁嘅編寫歷史肚。",
        "anonpreviewwarning": "“警告:汝還吂登入。汝嘅IP地址將會記錄在邇頁嘅編輯歷史中”",
        "search-nonefound": "在查詢肚無結果相符。",
        "powersearch-legend": "高級搜尋",
        "powersearch-ns": "在下背嘅名字空間肚搜尋:",
-       "powersearch-redir": "重定向清單",
        "powersearch-togglelabel": "監查:",
        "searchdisabled": "{{SITENAME}}由於性能方面嘅原因,全文搜已分暫時停用。汝做得暫時通過Google搜尋。請留意佢兜嘅索引可能會過時。",
        "preferences": "偏好設定",
        "recentchanges-label-bot": "邇次編寫係由機器人進行",
        "recentchanges-label-unpatrolled": "邇次編寫還吂巡查過",
        "rcnotefrom": "下背係從'''$2'''起嘅更改(最多展示'''$1'''):",
-       "rclistfrom": "展示從$1以來嘅新更改",
+       "rclistfrom": "展示從$3 $2以來嘅新更改",
        "rcshowhideminor": "$1細微編寫",
        "rcshowhidebots": "$1機器人嘅編寫",
        "rcshowhideliu": "$1已登入用戶嘅編寫",
        "watchlist-details": "毋包含交流頁,汝嘅監視列表上有$1隻頁面。",
        "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í'''.",
-       "watchmethod-recent": "檢查分監視頁面嘅最近編寫",
-       "watchmethod-list": "檢查最近編寫嘅分監視頁面",
-       "watchlistcontains": "汝嘅監視列表包含$1隻頁面。",
-       "iteminvalidname": "頁面'$1'錯誤,無效命名...",
        "wlshowlast": "展示最近$1隻鐘頭,$2日或$3嘅更改。",
        "watchlist-options": "監視列表選項",
        "watching": "監視中...",
        "enotif_lastvisited": "請參詳$1查看汝上次訪問後嘅所有更改。",
        "enotif_lastdiff": "請參詳$1查看邇次更改。",
        "enotif_anon_editor": "匿名用戶$1",
-       "enotif_body": "Chhîn-oi ke $WATCHINGUSERNAME, $PAGEEDITOR yí-kîn chhai $PAGEEDITDATE $CHANGEDORCREATED{{SITENAME}} ke $PAGETITLE vùn-chông, chhiáng-to $PAGETITLE_URL kiám-sṳ siên-chhièn pán-pún.  $NEWPAGE phiên-si̍p chak-yeu: $PAGESUMMARY $PAGEMINOREDIT lièn-kiê chhṳ́ phiên-si̍p-chá: email: $PAGEEDITOR_EMAIL pún-chham: $PAGEEDITOR_WIKI chhai ngì fóng-mun chhṳ́-chông chṳ̂-chhièn, chiông-lòi ke kiên-kói vù-nèn hiong ngì thûng-tî. Ngì khó-yî chhûng-sat ngì só-yû kam-sṳ vùn-chông ke thûng-tî phêu-ki. {{SITENAME}} thûng-tî ne-thúng -- yeu kói-pien ngì-ke kam-sṳ lie̍t-péu sat-thin, chhiáng chhâm-siòng {{canonicalurl:{{#special:EditWatchlist}}}} chin-yit-phu ke pông-chhu: {{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Chhîn-oi ke $WATCHINGUSERNAME, $PAGEEDITOR yí-kîn chhai $PAGEEDITDATE $CHANGEDORCREATED{{SITENAME}} ke $PAGETITLE vùn-chông, chhiáng-to $PAGETITLE_URL kiám-sṳ siên-chhièn pán-pún.  $NEWPAGE phiên-si̍p chak-yeu: $PAGESUMMARY $PAGEMINOREDIT lièn-kiê chhṳ́ phiên-si̍p-chá: email: $PAGEEDITOR_EMAIL pún-chham: $PAGEEDITOR_WIKI chhai ngì fóng-mun chhṳ́-chông chṳ̂-chhièn, chiông-lòi ke kiên-kói vù-nèn hiong ngì thûng-tî. Ngì khó-yî chhûng-sat ngì só-yû kam-sṳ vùn-chông ke thûng-tî phêu-ki. {{SITENAME}} thûng-tî ne-thúng -- yeu kói-pien ngì-ke kam-sṳ lie̍t-péu sat-thin, chhiáng chhâm-siòng {{canonicalurl:{{#special:EditWatchlist}}}} chin-yit-phu ke pông-chhu: $HELPPAGE",
        "created": "建立矣",
        "changed": "更改矣",
        "deletepage": "刪除頁面",
        "whatlinkshere-filters": "過濾器",
        "blockip": "封禁用戶",
        "blockiptext": "用下背嘅表單來禁止來自某一特定IP地址嘅修改許可權。\n單淨在為防止破壞,撈符合[[{{MediaWiki:Policy-url}}|守則]]嘅情況下正做得採取邇行動。\n請在下背輸入一隻具體嘅理由(例如引述一隻分破壞嘅頁面)。",
-       "ipadressorusername": "IP地址或用戶名:",
+       "ipaddressorusername": "IP地址或用戶名:",
        "ipbexpiry": "期限:",
        "ipbreason": "原因:",
        "ipbreason-dropdown": "*一般嘅封禁理由\n** 多次加入虛假資料\n** 刪除頁面內容\n** 外部鏈接廣告\n** 在頁面肚增加無意義文字\n** 無禮嘅行為、攻擊/騷擾別儕\n** 濫用多隻賬號\n** 做毋得接受嘅用戶名",
        "monobook.css": "/* Chhṳ́-chhu ke CSS chiông-voi yáng-hióng sṳ́-yung Monobook mien-pán ke yung-fu */",
        "common.js": "/* Chhṳ́-chhu ke JavaScript chiông chai-ngi̍p yî só-yû ying-fu mî yit-ke vùn-chông. */",
        "monobook.js": "/* Yí-kîn put-chai sṳ́-yung; chhiáng-yung [[MediaWiki:common.js]] */",
-       "notacceptable": "Ke-mióng-chham fu̍k-vu-hi put-nèn thì-kiûng ngì-ke hak-fu tôn-nèn sṳt-phe̍t ke su-kí kak-sṳt.",
        "anonymous": "{{SITENAME}} ke ngia̍k-miàng yung-fu",
        "siteuser": "{{SITENAME}} Yung-fu-chá $1",
        "lastmodifiedatby": "Chhṳ́-chông yù $3 yî $1 $2 ke chui-heu kiên-kói.",
        "show-big-image": "完整分辨率",
        "newimages": "Sîn-kien thù-chhiong ke va̍k-lòng",
        "imagelisttext": "Yî-ha he on $2 phài-lie̍t ke $1-ke tóng-on lie̍t-péu.",
-       "showhidebots": "($1 kî-hi-ngìn)",
        "noimages": "Mò-khó kiám-sṳ thù-chhiong.",
        "ilsubmit": "Chhìm-cháu",
        "bydate": "on-cheu ngit-khì",
        "autoredircomment": "Chang-chhai chhûng-thin hiong to [[$1]]",
        "autosumm-new": "Sîn hong-mien: $1",
        "size-bytes": "$1 Vi-ngièn-chû",
-       "livepreview-loading": "Chang-chhai chai-ngi̍p…",
-       "livepreview-ready": "Chang-chhai chai-ngi̍p… Vàn-sṳ̀n!",
-       "livepreview-failed": "Sṳ̍t-sṳ̀ yi-liau sṳt-phai!\nSòn-chhṳ phêu-chún yi-liau.",
-       "livepreview-error": "lièn-chiap sṳt-phai: $1 \"$2\".\nSòn-chhṳ phêu-chún yi-liau.",
        "lag-warn-normal": "Tô-yî $1-méu ke kiên-kói khó-nèn put-voi chhai liá-ke chhîn-tân chûng hién-sṳ.",
        "lag-warn-high": "Yù-yî chṳ̂-liau-khu ke ko-thu yèn-chhṳ̀, tô-yî $1-méu ke kiên-kói khó-nèn put-voi chhai liá-ke chhîn-tân chûng hién-sṳ.",
        "watchlisttools-view": "查看有關更改",
index 81c1946..a78042e 100644 (file)
        "readonly_lag": "Ua hikalaka ka hōkeo ʻikepili i ka hele nei ʻana o nā hōkeo ʻikepili kauā i ka haku",
        "internalerror": "Hewa koloko",
        "internalerror_info": "Hewa koloko:$1",
-       "fileappenderrorread": "ʻAʻole hiki ke heluhelu iā \"$1\" ma loko o ka pākuʻi ʻana.",
-       "fileappenderror": "ʻAʻole hiki ke pākuʻi \"$1\" iā \"$2\".",
        "filecopyerror": "ʻAʻole hiki ke kope ka waihona \"$1\" iā \"$2\".",
        "filerenameerror": "ʻAʻole hiki ke hōʻinoa hou ka waihona \"$1\" iā \"$2\".",
        "filedeleteerror": "‘A‘ole hiki ke holoi i ka waihona \"$1\".",
        "directorycreateerror": "ʻAʻole hiki ke haku ka papakuhi waihona \"$1\"",
        "filenotfound": "‘A‘ole hiki ke loa‘a ka waihona \"$1\".",
-       "fileexistserror": "ʻAʻole hiki ke kākau i ka waihona \"$1\": Aia no ia.",
        "unexpected": "Helu mahuʻi ʻole: \"$1\"=\"$2\".",
        "formerror": "Hewa: Hiki ʻole ke waiho i ke kahua.",
        "badarticleerror": "Hiki ʻole i kēia hana ke hana ʻia ma kēia ʻaoʻao.",
        "userlogin-helplink2": "Ke kōkua ʻana me ka ʻeʻe ʻana",
        "userlogin-loggedin": "Ua ʻeʻe ʻē ʻoe penei: {{GENDER:$1|$1}}.\nHana i ke kahua i lalo no ka ʻeʻe ʻana i kekahi mea hoʻohana ʻē aʻe.",
        "userlogin-createanother": "E kāinoa i kekahi moʻokāki ʻē aʻe",
-       "createacct-join": "E kikokiko i kāu ʻike i lalo.",
-       "createacct-another-join": "E kikokiko i ka ʻike o ka moʻokāki hou i lalo.",
        "createacct-emailrequired": "Wahinoho lekauila",
        "createacct-emailoptional": "Wahinoho lekauila (kāpae)",
        "createacct-email-ph": "E kikokiko i kāu wahinoho lekauila",
        "savearticle": "E mālama i ka ʻaoʻao",
        "preview": "Nāmua",
        "showpreview": "E hō'ike i ka nāmua",
-       "showlivepreview": "Nāmua ʻānō",
        "showdiff": "E hō'ike i nā loli",
        "anoneditwarning": "<strong>E akahele:</strong> ʻAʻole ʻoe ʻeʻe nei.\nE hoʻopaʻa ʻia ana kāu IP ma ko kēia ʻaoʻao mōʻaukala hoʻololi.",
        "summary-preview": "Nāmua hōʻuluʻulu manaʻo:",
        "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:",
-       "powersearch-redir": "Helu i nā kiahou",
        "powersearch-togglelabel": "Hōʻoia:",
        "powersearch-toggleall": "Nā mea apau",
        "powersearch-togglenone": "ʻAʻohe",
        "prefs-advancedsearchoptions": "Koho kiʻelē",
        "prefs-advancedwatchlist": "Koho kiʻelē",
        "prefs-displayrc": "Koho nānā",
-       "prefs-displaysearchoptions": "Koho nānā",
        "prefs-displaywatchlist": "Koho nānā",
        "prefs-tokenwatchlist": "Tokene",
        "prefs-diffs": "ʻOkoʻa",
        "autosumm-replace": "Ke pani nei i ka mealoko me '$1'",
        "autoredircomment": "Kiahou i ka ʻaoʻao iā [[$1]]",
        "autosumm-new": "Ua hoʻokumu ʻia kekahi ʻaoʻao me '$1'",
-       "livepreview-loading": "Ke ho‘ouka nei…",
        "watchlistedit-normal-title": "Hoʻololi i ka papakiaʻi",
        "watchlisttools-view": "Nānā i nā loli ʻālike",
        "watchlisttools-edit": "Nānā a hoʻololi i ka papakiaʻi",
index 1fbc600..ebf5c18 100644 (file)
@@ -25,7 +25,8 @@
                        "ערן",
                        "פדיחה",
                        "שומבלע",
-                       "תומר ט"
+                       "תומר ט",
+                       "Matanya"
                ]
        },
        "tog-underline": "סימון קישורים בקו תחתי:",
        "jumptonavigation": "ניווט",
        "jumptosearch": "חיפוש",
        "view-pool-error": "מצטערים, השרתים עמוסים כרגע.\nיותר מדי משתמשים מנסים לצפות בדף זה.\nאנא המתינו זמן מה לפני שתנסו שוב לצפות בדף.\n\n$1",
+       "generic-pool-error": "מצטערים, השרתים עמוסים כרגע.\nיותר מדי משתמשים מנסים לצפות במשאב הזה.\nאנא המתינו זמן מה לפני שתנסו שוב לצפות במשאב הזה.",
        "pool-timeout": "זמן ההמתנה לסיום הנעילה עבר",
        "pool-queuefull": "התור מלא",
        "pool-errorunknown": "שגיאה בלתי ידועה",
        "readonly_lag": "בסיס הנתונים ננעל אוטומטית כדי לאפשר לבסיסי הנתונים המשניים להתעדכן מהבסיס הראשי.",
        "internalerror": "שגיאה פנימית",
        "internalerror_info": "שגיאה פנימית: $1",
-       "fileappenderrorread": "קריאת \"$1\" במהלך צירוף נכשלה.",
-       "fileappenderror": "צירוף \"$1\" ל־\"$2\" נכשל.",
        "filecopyerror": "העתקת \"$1\" ל־\"$2\" נכשלה.",
        "filerenameerror": "שינוי השם של \"$1\" ל־\"$2\" נכשל.",
        "filedeleteerror": "מחיקת \"$1\" נכשלה.",
        "directorycreateerror": "יצירת התיקייה \"$1\" נכשלה.",
        "filenotfound": "הקובץ \"$1\" לא נמצא.",
-       "fileexistserror": "הכתיבה לקובץ \"$1\" נכשלה: הקובץ קיים",
        "unexpected": "ערך לא צפוי: \"$1\"=\"$2\"",
        "formerror": "שגיאה: לא יכול לשלוח טופס.",
        "badarticleerror": "לא ניתן לבצע פעולה זו בדף זה.",
        "userlogin-helplink2": "עזרה בכניסה לחשבון",
        "userlogin-loggedin": "אתם כבר מחוברים לחשבון {{GENDER:$1|$1}}.\nהשתמשו בטופס שלהלן כדי להתחבר לחשבון אחר.",
        "userlogin-createanother": "יצירת חשבון אחר",
-       "createacct-join": "יש להקליד להלן את הפרטים שלך.",
-       "createacct-another-join": "יש להקליד להלן את פרטי החשבון החדש.",
        "createacct-emailrequired": "כתובת דוא\"ל",
        "createacct-emailoptional": "כתובת דוא\"ל (לא חובה)",
        "createacct-email-ph": "יש להקליד את כתובת הדוא\"ל שלך",
        "savearticle": "שמירה",
        "preview": "תצוגה מקדימה",
        "showpreview": "תצוגה מקדימה",
-       "showlivepreview": "תצוגה מקדימה מהירה",
        "showdiff": "הצגת שינויים",
        "anoneditwarning": "'''אזהרה:''' אינכם מחוברים לחשבון. כתובת ה־IP שלכם תירשם בהיסטוריית העריכות של הדף.",
        "anonpreviewwarning": "''אינכם מחוברים לחשבון. שמירה תגרום לכתובת ה־IP שלכם להירשם בהיסטוריית העריכות של הדף.''",
        "edit-gone-missing": "לא ניתן לעדכן את הדף.\nנראה שהוא נמחק.",
        "edit-conflict": "התנגשות עריכה.",
        "edit-no-change": "המערכת התעלמה מעריכתכם, כיוון שלא נעשה שינוי בטקסט.",
-       "postedit-confirmation": "עריכתך נשמרה.",
+       "postedit-confirmation-created": "הדף נוצר.",
+       "postedit-confirmation-restored": "הדף שוחזר.",
+       "postedit-confirmation-saved": "עריכתך נשמרה.",
        "edit-already-exists": "לא ניתן ליצור דף חדש.\nהוא כבר קיים.",
        "defaultmessagetext": "טקסט ההודעה המקורי",
        "content-failed-to-parse": "פענוח $2 כתוכן מסוג $1 נכשל: $3",
        "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)",
        "searchmenu-exists": "'''קיים דף בשם \"[[:$1]]\" באתר זה.'''",
        "searchmenu-new": "<strong>'''יצירת הדף \"[[:$1]]\" באתר זה.'''</strong> \n{{PLURAL:$2|0=|ראו גם את הדף שנמצא בחיפוש שלכם.|ראו גם את תוצאות החיפוש שלכם.}}",
        "searchprofile-articles": "דפי תוכן",
-       "searchprofile-project": "עזרה ודפי המיזם",
        "searchprofile-images": "מולטימדיה",
        "searchprofile-everything": "הכול",
        "searchprofile-advanced": "מתקדם",
        "searchprofile-articles-tooltip": "חיפוש $1",
-       "searchprofile-project-tooltip": "חיפוש $1",
        "searchprofile-images-tooltip": "חיפוש קבצים",
        "searchprofile-everything-tooltip": "חיפוש בכל התוכן (למעט דפי השיחה)",
        "searchprofile-advanced-tooltip": "חיפוש במרחבי שם מותאמים אישית",
        "search-nonefound": "לא נמצאו תוצאות המתאימות לחיפוש.",
        "powersearch-legend": "חיפוש מתקדם",
        "powersearch-ns": "חיפוש על־פי מרחבי שם:",
-       "powersearch-redir": "הצגת דפי הפניה",
        "powersearch-togglelabel": "בחירה:",
        "powersearch-toggleall": "הכול",
        "powersearch-togglenone": "אף אחד",
        "prefs-emailconfirm-label": "אימות כתובת דוא\"ל:",
        "youremail": "דואר אלקטרוני:",
        "username": "שם {{GENDER:$1|המשתמש|המשתמשת}}:",
-       "uid": "המספר הסידורי של {{GENDER:$1|המשתמש|המשתמשת}}:",
        "prefs-memberingroups": "{{GENDER:$2|חבר|חברה}} {{PLURAL:$1|בקבוצה|בקבוצות}}:",
        "prefs-registration": "זמן ההרשמה:",
        "yourrealname": "שם אמיתי:",
        "prefs-advancedsearchoptions": "אפשרויות מתקדמות",
        "prefs-advancedwatchlist": "אפשרויות מתקדמות",
        "prefs-displayrc": "אפשרויות תצוגה",
-       "prefs-displaysearchoptions": "אפשרויות תצוגה",
        "prefs-displaywatchlist": "אפשרויות תצוגה",
        "prefs-tokenwatchlist": "אסימון",
        "prefs-diffs": "הבדלים בין גרסאות",
        "right-move": "העברת דפים",
        "right-move-subpages": "העברת דפים עם דפי המשנה שלהם",
        "right-move-rootuserpages": "העברת דפי משתמש שאינם דפי משנה",
+       "right-move-categorypages": "העברת דפי קטגוריה",
        "right-movefile": "העברת קבצים",
        "right-suppressredirect": "הימנעות מיצירת הפניות מדפי המקור בעת העברת דפים",
        "right-upload": "העלאת קבצים",
        "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": "לדרוס את הקובץ הקיים הזה",
        "uploadstash-refresh": "רענון רשימת הקבצים",
        "invalid-chunk-offset": "היסט גוש לא תקין",
        "img-auth-accessdenied": "הגישה נדחתה",
-       "img-auth-nopathinfo": "PATH_INFO חסר.\nהשרת אינו מוגדר להעברת מידע זה.\nייתכן שהוא מבוסס על CGI ולכן אינו יכול לתמוך ב־img_auth.\nראו https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "PATH_INFO חסר.\nהשרת אינו מוגדר להעברת מידע זה.\nייתכן שהוא מבוסס על CGI ולכן אינו יכול לתמוך ב־img_auth.\nראו https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "הנתיב המבוקש אינו בתיקיית ההעלאות שהוגדרה.",
        "img-auth-badtitle": "לא ניתן ליצור כותרת תקינה מתוך \"$1\".",
        "img-auth-nologinnWL": "אינכם מחוברים לחשבון והדף \"$1\" אינו ברשימה המותרת.",
        "pageswithprop-prophidden-binary": "ערך של מאפיין בינארי הוסתר ($1)",
        "doubleredirects": "הפניות כפולות",
        "doubleredirectstext": "בדף הזה מופיעה רשימת דפי הפניה שמפנים לדפי הפניה אחרים.\nכל שורה מכילה קישור לשתי ההפניות הראשונות, וכן את היעד של ההפניה השנייה, שהיא לרוב היעד ה\"אמיתי\" של ההפניה, שההפניה הראשונה אמורה להצביע אליו.\nפריטים <del>מחוקים</del> כבר תוקנו.",
-       "double-redirect-fixed-move": "[[$1]] הועבר.\nכעת זו הפניה לדף [[$2]].",
-       "double-redirect-fixed-maintenance": "ת×\99ק×\95×\9f ×\94פנ×\99×\94 ×\9bפ×\95×\9c×\94 ×\9e[[$1]] ×\9c[[$2]].",
+       "double-redirect-fixed-move": "הדף [[$1]] הועבר.\nהוא עודכן אוטומטית ועכשיו מפנה לדף [[$2]].",
+       "double-redirect-fixed-maintenance": "ת×\99ק×\95×\9f ×\90×\95×\98×\95×\9e×\98×\99 ×©×\9c ×\94פנ×\99×\94 ×\9bפ×\95×\9c×\94 ×\9e[[$1]] ×\9c[[$2]] ×\91×\9eש×\99×\9eת ×ª×\97×\96×\95ק×\94.",
        "double-redirect-fixer": "מתקן הפניות",
        "brokenredirects": "הפניות לא תקינות",
        "brokenredirectstext": "ההפניות שלהלן מפנות לדפים שאינם קיימים:",
        "log-title-wildcard": "חיפוש כותרות המתחילות באותיות אלה",
        "showhideselectedlogentries": "הצגת/הסתרת פעולות היומן שנבחרו",
        "allpages": "כל הדפים",
-       "alphaindexline": "$1 עד $2",
        "nextpage": "הדף הבא ($1)",
        "prevpage": "הדף הקודם ($1)",
        "allpagesfrom": "הצגת דפים החל מ:",
        "watchlistanontext": "עליכם $1 כדי לצפות או לערוך פריטים ברשימת המעקב.",
        "watchnologin": "לא נכנסת לחשבון",
        "addwatch": "הוספה לרשימת המעקב",
-       "addedwatchtext": "הדף [[:$1]] נוסף ל[[Special:Watchlist|רשימת המעקב]].\nשינויים שייערכו בעתיד בדף זה ובדף השיחה שלו, יוצגו ברשימת המעקב.",
+       "addedwatchtext": "הדף \"[[:$1]]\" נוסף ל[[Special:Watchlist|רשימת המעקב]].\nשינויים שייערכו בעתיד בדף זה ובדף השיחה שלו, יוצגו ברשימת המעקב.",
+       "addedwatchtext-short": "הדף \"$1\" נוסף לרשימת המעקב.",
        "removewatch": "הסרה מרשימת המעקב",
-       "removedwatchtext": "הדף [[:$1]] הוסר מ[[Special:Watchlist|רשימת המעקב]].",
+       "removedwatchtext": "הדף \"[[:$1]]\" הוסר מ[[Special:Watchlist|רשימת המעקב]].",
+       "removedwatchtext-short": "הדף \"$1\" הוסר מרשימת המעקב.",
        "watch": "מעקב",
        "watchthispage": "מעקב אחרי דף זה",
        "unwatch": "הפסקת מעקב",
        "watchlist-details": "ברשימת המעקב יש {{PLURAL:$1|דף אחד|$1 דפים}}, כאשר דפי השיחה אינם נספרים בנפרד.",
        "wlheader-enotif": "הודעות דוא\"ל מאופשרות.",
        "wlheader-showupdated": "דפים שהשתנו מאז ביקורך האחרון בהם מוצגים ב'''הדגשה'''.",
-       "watchmethod-recent": "בודק את הדפים שברשימת המעקב לשינויים אחרונים.",
-       "watchmethod-list": "בודק את העריכות האחרונות בדפים שברשימת המעקב",
-       "watchlistcontains": "רשימת המעקב כוללת {{PLURAL:$1|דף אחד|$1 דפים}}.",
-       "iteminvalidname": "בעיה עם $1, שם שגוי…",
        "wlnote2": "להלן השינויים האחרונים {{PLURAL:$1|בשעה האחרונה|בשעתיים האחרונות|ב‏‏־<strong>$1</strong> השעות האחרונות}}, עד $3, $2.",
        "wlshowlast": "(הצגת $1 שעות אחרונות | $2 ימים אחרונים | $3)",
        "watchlist-options": "אפשרויות ברשימת המעקב",
        "enotif_lastvisited": "ראו $1 לכל השינויים מאז ביקורכם האחרון.",
        "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{{canonicalurl::{{MediaWiki:Helppage}}}}",
+       "enotif_body": "לכבוד $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nתקציר העריכה: $PAGESUMMARY $PAGEMINOREDIT\n\nבאפשרותכם ליצור קשר עם העורך:\nבדואר האלקטרוני: $PAGEEDITOR_EMAIL\nבאתר: $PAGEEDITOR_WIKI\n\nלא תהיינה הודעות על פעולות נוספות עד שתבקרו בדף כשאתם מחוברים לחשבון. באפשרותכם גם לאפס את דגלי ההודעות בכל הדפים שברשימת המעקב.\n\nמערכת ההודעות של {{SITENAME}}\n\n--\nכדי לשנות את ההגדרות של הודעות הדוא\"ל הנשלחות אליכם, בקרו בדף\n{{canonicalurl:{{#special:Preferences}}}}\n\nכדי לשנות את הגדרות רשימת המעקב, בקרו בדף\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nכדי למחוק את הדף מרשימת המעקב שלכם, בקרו בדף\n$UNWATCHURL\n\nלמשוב ולעזרה נוספת:\n$HELPPAGE",
        "created": "נוצר",
        "changed": "שונה",
        "deletepage": "מחיקה",
        "rollbacklinkcount-morethan": "שחזור יותר מ{{PLURAL:$1|עריכה אחת|־$1 עריכות}}",
        "rollbackfailed": "השחזור נכשל",
        "cantrollback": "לא ניתן לשחזר את העריכה;\nהתורם האחרון הוא היחיד שכתב בדף זה.",
-       "alreadyrolled": "×\9c×\90 × ×\99ת×\9f ×\9cש×\97×\96ר ×\90ת ×\94ער×\99×\9b×\94 ×©×\9c [[User:$2|$2]] ([[User talk:$2|ש×\99×\97×\94]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) ×\91×\93×£ [[:$1]]; ×\9e×\99ש×\94×\95 ×\90×\97ר ×\9b×\91ר ×¢×¨×\9a ×\90×\95 ×©×\97×\96ר ×\90ת ×\94×\93×£.\n\nהעריכה האחרונה הייתה של [[User:$3|$3]] ([[User talk:$3|שיחה]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
+       "alreadyrolled": "×\9c×\90 × ×\99ת×\9f ×\9cש×\97×\96ר ×\90ת ×\94ער×\99×\9b×\94 ×©×\9c [[User:$2|$2]] ([[User talk:$2|ש×\99×\97×\94]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) ×\91×\93×£ [[:$1]]; ×\94×\93×£ ×\9b×\91ר × ×¢×¨×\9a ×\90×\95 ×©×\95×\97×\96ר.\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]]}}",
        "blockip": "חסימת משתמש",
        "blockip-legend": "חסימת משתמש",
        "blockiptext": "השתמשו בטופס שלהלן כדי לחסום את הרשאות הכתיבה מכתובת IP או משתמש מסוימים.\nחסימות כאלה צריכות להתבצע רק כדי למנוע השחתה, ובהתאם ל[[{{MediaWiki:Policy-url}}|נהלים]].\nאנא מלאו את הסיבה הפרטנית לחסימה להלן (לדוגמה, באמצעות ציון דפים מסוימים שהשחית המשתמש).",
-       "ipadressorusername": "כתובת IP או שם משתמש:",
+       "ipaddressorusername": "כתובת IP או שם משתמש:",
        "ipbexpiry": "פקיעה:",
        "ipbreason": "סיבה:",
        "ipbreason-dropdown": "* סיבות חסימה נפוצות\n** הוספת מידע שגוי\n** הסרת תוכן מדפים\n** הצפת קישורים לאתרים חיצוניים\n** הוספת שטויות/ג'יבריש לדפים\n** התנהגות מאיימת/הטרדה\n** שימוש לרעה בחשבונות מרובים\n** שם משתמש בעייתי",
        "movepagetalktext": "דף השיחה של דף זה יועבר אוטומטית, אלא אם:\n* קיים דף שיחה שאינו ריק תחת השם החדש אליו מועבר הדף, או\n* הסרתם את הסימון בתיבה שלהלן.\n\nבמקרים אלו, תצטרכו להעביר או לשלב את הדפים באופן ידני, אם תרצו.",
        "movearticle": "העברת דף:",
        "moveuserpage-warning": "'''אזהרה:''' אתם עומדים להעביר דף משתמש. שימו לב שרק הדף יועבר וששם המשתמש '''לא''' ישתנה.",
+       "movecategorypage-warning": "<strong>אזהרה:</strong> אתם עומדים להעביר דף קטגוריה. שימו לב שרק הדף יועבר ושכל הדפים בקטגוריה הישנה <strong>לא</strong> יסווגו לקטגוריה החדשה.",
        "movenologintext": "עליכם [[Special:UserLogin|להיכנס לחשבון]] כדי להעביר דפים.",
        "movenotallowed": "אינכם מורשים להעביר דפים.",
        "movenotallowedfile": "אינכם מורשים להעביר קבצים.",
        "cant-move-user-page": "אינכם מורשים להעביר דפי משתמש (למעט דפי משנה).",
        "cant-move-to-user-page": "אינכם מורשים להעביר דף לדף משתמש (למעט לדף משנה של דף משתמש).",
+       "cant-move-category-page": "אינכם מורשים להעביר דפי קטגוריה.",
+       "cant-move-to-category-page": "אינכם מורשים להעביר דף לדף קטגוריה.",
        "newtitle": "לשם החדש:",
        "move-watch": "מעקב אחר דף המקור ואחר דף היעד",
        "movepagebtn": "העברה",
        "allmessagesname": "שם",
        "allmessagesdefault": "טקסט ברירת המחדל של ההודעה",
        "allmessagescurrent": "הטקסט הנוכחי של ההודעה",
-       "allmessagestext": "×\96×\95×\94×\99 ×¨×©×\99×\9eת ×\9b×\9c ×\94×\95×\93×¢×\95ת ×\94×\9eער×\9bת ×©×\91×\9eר×\97×\91 ×\94ש×\9d {{ns:mediawiki}}.\n×\90× ×\90 ×\91קר×\95 ×\91×\93×£ [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] ×\95×\91â\80\8fâ\80\8fÖ«×\90תר [//translatewiki.net translatewiki.net] ×\90×\9d ×\91רצ×\95× ×\9b×\9d ×\9cתר×\95×\9d ×\9cתר×\92×\95×\9d ×\94×\9b×\9c×\9c×\99 ×©×\9c ×\9e×\93×\99×\94â\80\8fâ\80\8fÖ«־ויקי.",
+       "allmessagestext": "×\96×\95×\94×\99 ×¨×©×\99×\9e×\94 ×©×\9c ×\9b×\9c ×\94×\95×\93×¢×\95ת ×\94×\9eער×\9bת ×\91×\9eר×\97×\91 ×\94ש×\9d {{ns:mediawiki}}.\n×\90× ×\90 ×\91קר×\95 ×\91×\93×£ [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] ×\95×\91×\90תר [//translatewiki.net translatewiki.net] ×\90×\9d ×\91רצ×\95× ×\9b×\9d ×\9cתר×\95×\9d ×\9cתר×\92×\95×\9d ×\94×\9b×\9c×\9c×\99 ×©×\9c ×\9e×\93×\99×\94־ויקי.",
        "allmessagesnotsupportedDB": "לא ניתן להשתמש בדף זה כיוון ש־wgUseDatabseMessages מבוטל.",
        "allmessages-filter-legend": "מסנן",
        "allmessages-filter": "סינון לפי מצב ההודעה:",
        "tooltip-preferences-save": "שמירת ההעדפות",
        "tooltip-summary": "להכנסת תקציר קצר",
        "common.css": "/* הסגנונות הנכתבים כאן ישפיעו על כל העיצובים */",
-       "cologneblue.css": "/* הסגנונות הנכתבים כאן ישפיעו על העיצוב CologneBlue בלבד */",
        "monobook.css": "/* הסגנונות הנכתבים כאן ישפיעו על העיצוב MonoBook בלבד */",
-       "modern.css": "/* הסגנונות הנכתבים כאן ישפיעו על העיצוב Modern בלבד */",
        "vector.css": "/* הסגנונות הנכתבים כאן ישפיעו על העיצוב Vector בלבד */",
        "print.css": "/* הסגנונות הנכתבים כאן ישפיעו על הפלט בהדפסה בלבד */",
        "noscript.css": "/* הסגנונות הנכתבים כאן ישפיעו על משתמשים עם JavaScript מבוטל */",
        "group-sysop.css": "/* הסגנונות הנכתבים כאן ישפיעו על מפעילי מערכת בלבד */",
        "group-bureaucrat.css": "/* הסגנונות הנכתבים כאן ישפיעו על ביורוקרטים בלבד */",
        "common.js": "/* כל סקריפט JavaScript שנכתב כאן ירוץ עבור כל המשתמשים בכל טעינת עמוד */",
-       "cologneblue.js": "/* כל סקריפט JavaScript שנכתב כאן ירוץ רק עבור המשתמשים בעיצוב CologneBlue */",
        "monobook.js": "/* כל סקריפט JavaScript שנכתב כאן ירוץ רק עבור המשתמשים בעיצוב Monobook */",
-       "modern.js": "/* כל סקריפט JavaScript שנכתב כאן ירוץ רק עבור המשתמשים בעיצוב Modern */",
        "vector.js": "/* כל סקריפט JavaScript שנכתב כאן ירוץ רק עבור המשתמשים בעיצוב Vector */",
        "group-autoconfirmed.js": "/* כל סקריפט JavaScript שנכתב כאן ירוץ עבור משתמשים ותיקים בלבד */",
        "group-user.js": "/* כל סקריפט JavaScript שנכתב כאן ירוץ עבור משתמשים רשומים בלבד */",
        "group-bot.js": "/* כל סקריפט JavaScript שנכתב כאן ירוץ עבור בוטים בלבד */",
        "group-sysop.js": "/* כל סקריפט JavaScript שנכתב כאן ירוץ עבור מפעילי מערכת בלבד */",
        "group-bureaucrat.js": "/* כל סקריפט JavaScript שנכתב כאן ירוץ עבור ביורוקרטים בלבד */",
-       "notacceptable": "האתר לא יכול לספק מידע בפורמט שתוכנת הלקוח יכולה לקרוא.",
        "anonymous": "{{PLURAL:$1|משתמש אנונימי|משתמשים אנונימיים}} של {{SITENAME}}",
        "siteuser": "משתמש {{SITENAME}} $1",
        "anonuser": "משתמש אנונימי של {{SITENAME}} $1",
        "pageinfo-category-pages": "מספר הדפים",
        "pageinfo-category-subcats": "מספר קטגוריות המשנה",
        "pageinfo-category-files": "מספר הקבצים",
-       "skinname-cologneblue": "מים כחולים",
        "skinname-monobook": "מונובוק",
-       "skinname-modern": "מודרני",
        "skinname-vector": "וקטור",
        "markaspatrolleddiff": "סימון השינוי כבדוק",
        "markaspatrolledtext": "סימון דף זה כבדוק",
        "newimages-summary": "דף זה מציג את הקבצים האחרונים שהועלו",
        "newimages-legend": "מסנן",
        "newimages-label": "שם הקובץ (או חלק ממנו):",
-       "showhidebots": "($1 בוטים)",
+       "newimages-showbots": "הצגת העלאות שבוצעו על־ידי בוטים",
        "noimages": "אין קבצים.",
        "ilsubmit": "חיפוש",
        "bydate": "לפי תאריך",
        "size-exabytes": "$1 אקסה־בייט",
        "size-zetabytes": "$1 זטה־בייט",
        "size-yottabytes": "$1 יוטה־בייט",
-       "livepreview-loading": "בטעינה…",
-       "livepreview-ready": "בטעינה… נטען!",
-       "livepreview-failed": "התצוגה המקדימה המהירה נכשלה! נסו להשתמש בתצוגה מקדימה רגילה.",
-       "livepreview-error": "ההתחברות נכשלה: $1 \"$2\". נסו להשתמש בתצוגה מקדימה רגילה.",
        "lag-warn-normal": "שינויים שבוצעו לפני פחות מ{{PLURAL:$1|שנייה אחת|־$1 שניות}} אינם מוצגים ברשימה זו.",
        "lag-warn-high": "בגלל עיכוב בעדכון בסיס הנתונים, שינויים שבוצעו לפני פחות מ{{PLURAL:$1|שנייה אחת|־$1 שניות}} אינם מוצגים ברשימה זו.",
-       "watchlistedit-numitems": "יש לכם {{PLURAL:$1|פריט אחד|$1 פריטים}} ברשימת המעקב, לא כולל דפי שיחה.",
-       "watchlistedit-noitems": "רשימת המעקב ריקה.",
        "watchlistedit-normal-title": "עריכת רשימת המעקב",
        "watchlistedit-normal-legend": "הסרת דפים מרשימת המעקב",
        "watchlistedit-normal-explain": "כל הדפים ברשימת המעקב מוצגים להלן.\nכדי להסיר דף, יש לסמן את התיבה לידו, וללחוץ על \"{{int:Watchlistedit-normal-submit}}\".\nבאפשרותכם גם [[Special:EditWatchlist/raw|לערוך את הרשימה הגולמית]].",
        "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 כותרות הוסרו}}:",
+       "watchlistedit-too-many": "יש יותר מדי דפים ולא ניתן להציגם כאן.",
+       "watchlisttools-clear": "מחיקת רשימת המעקב",
        "watchlisttools-view": "הצגת השינויים הרלוונטיים",
        "watchlisttools-edit": "הצגה ועריכה של רשימת המעקב",
        "watchlisttools-raw": "עריכת הרשימה הגולמית",
        "compare-invalid-title": "שם הדף שציינת אינו תקין.",
        "compare-title-not-exists": "הדף שציינת אינו קיים.",
        "compare-revision-not-exists": "הגרסה שציינת אינה קיימת.",
-       "dberr-header": "בעיה בוויקי",
        "dberr-problems": "מצטערים! קיימת בעיה טכנית באתר זה.",
        "dberr-again": "נסו להמתין מספר שניות ולהעלות מחדש את הדף.",
        "dberr-info": "(לא ניתן ליצור קשר עם שרת הנתונים: $1)",
        "htmlform-no": "לא",
        "htmlform-yes": "כן",
        "htmlform-chosen-placeholder": "נא לבחור אפשרות",
+       "htmlform-cloner-create": "הוספה",
+       "htmlform-cloner-delete": "הסרה",
+       "htmlform-cloner-required": "דרוש לפחות ערך אחד.",
        "sqlite-has-fts": "$1 עם תמיכה בחיפוש בטקסט מלא",
        "sqlite-no-fts": "$1 ללא תמיכה בחיפוש בטקסט מלא",
        "logentry-delete-delete": "$1 {{GENDER:$2|מחק|מחקה}} את הדף $3&rlm;",
index 32f125a..5aea0f6 100644 (file)
@@ -53,7 +53,8 @@
                        "Wikiconference",
                        "לערי ריינהארט",
                        "आलोक",
-                       "रोहित रावत"
+                       "रोहित रावत",
+                       "아라"
                ]
        },
        "tog-underline": "कड़ियाँ अधोरेखन:",
        "readonly_lag": "उपमुख्य डाटाबेस सर्वर मुख्य डाटाबेस सर्वर के बराबर अद्यातानीत होने तक मुख्य डाटाबेस सर्वर लॉक हो गया है।",
        "internalerror": "आन्तरिक त्रुटि",
        "internalerror_info": "आन्तरिक त्रुटि: $1",
-       "fileappenderrorread": "संलग्न करने के दौरान \"$1\" पढ़ा नहीं जा सका।",
-       "fileappenderror": "\"$1\" के आगे \"$2\" नहीं जुड़ पाया",
        "filecopyerror": "\"$1\" फ़ाइल की \"$2\" पर प्रतिलिपि नहीं बन पाई।",
        "filerenameerror": "\"$1\" फ़ाइल का नाम बदलकर \"$2\" नहीं रखा जा सका।",
        "filedeleteerror": "\"$1\" फ़ाइल को हटाया नहीं जा सका।",
        "directorycreateerror": "\"$1\" डाइरेक्टरी नहीं बनाई जा सकी।",
        "filenotfound": "\"$1\" फ़ाइल नहीं मिली।",
-       "fileexistserror": "फ़ाइल \"$1\" पर लिख नहीं सकते: फ़ाइल अस्तित्व में है",
        "unexpected": "अनपेक्षित मूल्य: \"$1\"=\"$2\".",
        "formerror": "त्रुटि: फ़ॉर्म सबमिट नहीं किया जा सका",
        "badarticleerror": "इस पृष्ठ पर यह कार्य नहीं किया जा सकता।",
        "userlogin-resetpassword-link": "अपना पासवर्ड भूल गए?",
        "userlogin-loggedin": "आप {{GENDER:$1|$1}} के रूप में पहले से लॉग्ड इन हैं।\nकिसी अन्य सदस्य के रूप में लॉग इन करने के लिए निम्नलिखित फ़ॉर्म का प्रयोग करें।",
        "userlogin-createanother": "एक अन्य खाता खोलें",
-       "createacct-join": "अपनी जानकारी नीचे लिखें",
-       "createacct-another-join": "नए खाते की जानकारी नीचे प्रदान करें।",
        "createacct-emailrequired": "ई-मेल पता",
        "createacct-emailoptional": "ई-मेल पता (वैकल्पिक)",
        "createacct-email-ph": "अपना ई-मेल पता लिखें",
        "savearticle": "पृष्ठ सहेजें",
        "preview": "झलक",
        "showpreview": "झलक दिखाएँ",
-       "showlivepreview": "सीधी झलक",
        "showdiff": "बदलाव दिखाएँ",
        "anoneditwarning": "'''सावधान:''' आपने सत्रारंभ नहीं किया है। इस पृष्ठ के संपादन इतिहास में आपका आइ॰पी पता अंकित किया जाएगा।",
        "anonpreviewwarning": "''आप लॉग्ड इन नहीं हैं। पृष्ठ सहेजने पर आपका आइ॰पी पता इस पृष्ठ के इतिहास में दर्ज किया जायेगा।''",
        "edit-gone-missing": "पृष्ठ अद्यतित न किया जा सका।\nलगता है यह हटा दिया गया है।",
        "edit-conflict": "संपादन अंतर्विरोध",
        "edit-no-change": "आपने कोई बदलाव ही नहीं किए, अतः आपके इस संपादन को नज़रंदाज़ कर दिया गया है।",
-       "postedit-confirmation": "आपका सम्पादन सहेजा गया है।",
+       "postedit-confirmation-saved": "आपका सम्पादन सहेजा गया है।",
        "edit-already-exists": "नया पृष्ठ बनाया नहीं जा सका।\nयह पहले से मौजूद है।",
        "defaultmessagetext": "संदेश का डिफ़ॉल्ट पाठ",
        "content-failed-to-parse": "$1 के लिए $2 सामग्री को पार्स करने में विफल, त्रुटि: $3",
        "search-nonefound": "आपकी खोज से मेल खाते कोई परिणाम नहीं मिले।",
        "powersearch-legend": "उन्नत खोज",
        "powersearch-ns": "नामस्थानों में खोजें:",
-       "powersearch-redir": "पुनार्निर्देश दर्शाएँ",
        "powersearch-togglelabel": "चुनें:",
        "powersearch-toggleall": "सभी",
        "powersearch-togglenone": "कोई भी नहीं",
        "prefs-advancedsearchoptions": "उन्नत विकल्प",
        "prefs-advancedwatchlist": "उन्नत विकल्प",
        "prefs-displayrc": "प्रदर्शन विकल्प",
-       "prefs-displaysearchoptions": "प्रदर्शन विकल्प",
        "prefs-displaywatchlist": "प्रदर्शन विकल्प",
        "prefs-tokenwatchlist": "टोकन",
        "prefs-diffs": "अंतर",
        "recentchanges-legend-heading": "'''कुंजी:'''",
        "recentchanges-legend-newpage": "([[Special:NewPages|नए पन्नों की सूची]] को भी देखें)",
        "rcnotefrom": "नीचे <strong>$2</strong> के बाद से (<strong>$1</strong> तक) हुए बदलाव दर्शाए गये हैं।",
-       "rclistfrom": "$1 से नये बदलाव दिखाएँ",
+       "rclistfrom": "$3 $2 से नये बदलाव दिखाएँ",
        "rcshowhideminor": "छोटे बदलाव $1",
        "rcshowhideminor-show": "दिखाएँ",
        "rcshowhideminor-hide": "छुपाएँ",
        "uploadstash-refresh": "फ़ाइलों की सूची रिफ़्रेश करें",
        "invalid-chunk-offset": "अग्राह्य चंक ऑफ़सेट",
        "img-auth-accessdenied": "अनुमति नहीं है",
-       "img-auth-nopathinfo": "PATH_INFO मौजूद नहीं है।\nआपके सर्वर में इस जानकारी को भेजने के लिए जमाव नहीं है।\nयह सी॰जी॰आई-आधारित हो सकता है और img_auth को स्वीकार नहीं करता है।\nhttps://www.mediawiki.org/wiki/Manual:Image_Authorization देखें।",
+       "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\" श्वेतसूची में नहीं है।",
        "watchlist-details": "वार्ता पृष्ठों के अलावा {{PLURAL:$1|$1 पृष्ठ}} आपकी ध्यानसूची में हैं।",
        "wlheader-enotif": "ई-मेल नोटिफ़िकेशन सक्षम हैं।",
        "wlheader-showupdated": "पृष्ठ जो आपके द्वारा देखे जाने के बाद बदले गये हैं '''बोल्ड''' दिखेंगे।",
-       "watchmethod-recent": "ध्यानसूची में दिये गये पृष्ठों में हाल में हुए बदलाव देख रहे हैं",
-       "watchmethod-list": "ध्यानसूची में दिये गये पृष्ठों में हाल में हुए बदलाव देख रहे हैं",
-       "watchlistcontains": "आपकी ध्यानसूची में $1 {{PLURAL:$1|पृष्ठ}} हैं।",
-       "iteminvalidname": "'$1' के साथ समस्या, अवैध नाम...",
        "wlnote2": "$2,$3 तक आखरी {{PLURAL:$1|घंटे|<strong>$1</strong> घंटों}} में बदलाव निम्नलिखित हैं।",
        "wlshowlast": "पिछले $1 घंटे $2 दिन $3 देखें",
        "watchlist-options": "ध्यानसूची विकल्प",
        "enotif_lastvisited": "आपकी आखिरी भेंट के बाद हुए बदलाव देखने के लिये $1 देखें।",
        "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\nआपकी सहायिका, {{SITENAME}} की सूचक प्रणाली\n\n--\nअपनी ई-मेल सूचना के जमाव बदलने के लिये देखें\n{{canonicalurl:{{#special:Preferences}}}}\n\nअपनी ध्यानसूची के जमाव बदलने के लिए देखें\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nइस पृष्ठ को अपनी ध्यानसूची से हटाने के लिये देखें\n$UNWATCHURL\n\nराय देने या अधिक सहायता पाने के लिए:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "प्रिय $WATCHINGUSERNAME जी,\n\n$PAGEINTRO $NEWPAGE\n\nसम्पादन सारांश: $PAGESUMMARY $PAGEMINOREDIT\n\nसंपादक से संपर्क करें:\nई-मेल: $PAGEEDITOR_EMAIL\nविकि: $PAGEEDITOR_WIKI\n\nजब तक आप इस पृष्ठ पर लॉगिन कर के फिर से नहीं जाते, तब तक और बदलाव होने पर भी आपको फिर से सूचना नहीं भेजी जाएगी।\nआप चाहें तो अपनी ध्यानसूची में मौजूद सभी पन्नों के लिए सूचना चिन्ह को भी बदल सकते हैं।\n\nआपकी सहायिका, {{SITENAME}} की सूचक प्रणाली\n\n--\nअपनी ई-मेल सूचना के जमाव बदलने के लिये देखें\n{{canonicalurl:{{#special:Preferences}}}}\n\nअपनी ध्यानसूची के जमाव बदलने के लिए देखें\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nइस पृष्ठ को अपनी ध्यानसूची से हटाने के लिये देखें\n$UNWATCHURL\n\nराय देने या अधिक सहायता पाने के लिए:\n$HELPPAGE",
        "created": "बनाया",
        "changed": "परिवर्तित किया",
        "deletepage": "पृष्ठ हटाएँ",
        "blockip": "अवरोधित करें",
        "blockip-legend": "सदस्य को ब्लॉक करें",
        "blockiptext": "विशिष्ठ IP पते अथवा सदस्य नाम को लिखने के अधिकार से बाध्य करने के लिए निम्न पत्र का प्रयोग करें।\nयह सिर्फ बर्बरता को रोकने के लिए ही किया जाना चाहिए, और [[{{MediaWiki:Policy-url}}|नीति]] के अनुसार ही करना चाहिए।\nनीचे विशिष्ठ कारण भी लिखें (उदाहरण के लिए, सटीक पृष्ठों को दर्शाते हुए, जिनमें बर्बरता की गई हो)।",
-       "ipadressorusername": "आईपी एड्रेस या सदस्यनाम:",
+       "ipaddressorusername": "आईपी एड्रेस या सदस्यनाम:",
        "ipbexpiry": "समाप्ति:",
        "ipbreason": "कारण:",
        "ipbreason-dropdown": "*अवरोधित करने के साधारण कारण\n** अवैध सदस्यनाम\n** एक से अधिक खातें खोलकर उनका दुरुपयोग करना\n** गलत जानकारी भरना\n** पृष्ठों में कचरा भरना\n** पृष्ठों से सामग्री हटाना‍‍‍‍‍\n** बाहरी जालस्थलों की फ़ालतू कड़ियां देना \n** सदस्यों को तंग करना",
        "monobook.css": "/* यहां रखी गई css मोनोबुक त्वचा का इस्तेमाल करने वाले सभी सदस्योंपर असर करेगी */",
        "common.js": "/* यहां लिखी गई जावास्क्रीप्ट सभी सदस्योंके लिये इस्तेमाल में लाई जायेगी। */",
        "monobook.js": "/* यहाँ पर दी गई जावास्क्रिप्ट मोनोबुक त्वचा का प्रयोग कर रहे सदस्यों के लिए लोड होगी */",
-       "notacceptable": "विकि सर्वर आपके क्लायंटको जिस प्रकारसे डाटा चाहिये उस प्रकारसे नहीं दे सकता।",
        "anonymous": "{{SITENAME}} के {{PLURAL:$1||}} बेनामी सदस्य",
        "siteuser": "विकिपीडिया सदस्य  $1",
        "anonuser": "{{SITENAME}} अज्ञात उपयोगकर्ता $1",
        "newimages-summary": "यह विशेष पृष्ठ हाल ही में अपलोड की गयी फ़ाइलें दिखाता है।",
        "newimages-legend": "छननी",
        "newimages-label": "संचिका नाम (या उसका अंश):",
-       "showhidebots": "(बोट्स $1)",
        "noimages": "देखने के लिए कुछ नहीं है।",
        "ilsubmit": "खोजें",
        "bydate": "तिथि अनुसार",
        "size-kilobytes": "$1 KB",
        "size-megabytes": "$1 MB",
        "size-gigabytes": "$1 GB",
-       "livepreview-loading": "लोड हो रहा है...",
-       "livepreview-ready": "लोड हो रहा हैं... तैयार!",
-       "livepreview-failed": "लाइव झलक नहीं दिखा पायें। साधारण झलक देखें।",
-       "livepreview-error": "संपर्क नहीं कर पायें: $1 \"$2\"। साधारण झलक देखें।",
        "lag-warn-normal": "पिछले $1 {{PLURAL:$1|सेकिंड|सेकिंड}} में हुए बदलाव संभवतः इस सूची में नहीं आएँगे।",
        "lag-warn-high": "आँकड़ाकोष सेवक में अधिक देर की वजह से $1 {{PLURAL:$1|सेकिंड|सेकिंड}} से पहले तक के बदलाव ही इस सूची में निश्चित रूप से दिखेंगे।",
-       "watchlistedit-numitems": "आपकी ध्यानसूची में {{PLURAL:$1|1 शीर्षक|$1 शीर्षक}} हैं, जिसमें वार्ता पृष्ठ नहीं गिनें हैं।",
-       "watchlistedit-noitems": "आपकी ध्यानसूचीमें शीर्षक नहीं हैं।",
        "watchlistedit-normal-title": "ध्यानसूची बदलें",
        "watchlistedit-normal-legend": "ध्यानसूची से शीर्षक हटायें",
        "watchlistedit-normal-explain": "आपकी ध्यानसूची में सूचीबद्ध पृष्ठ नीचे दिये गये हैं।\nपृष्ठ सूची से हटाने के लिये उसके आगे दिये बक्से पर क्लिक करें, और \"{{int:Watchlistedit-normal-submit}}\" पर क्लिक करें।\nआप [[Special:EditWatchlist/raw|रॉ ध्यानसूची का संपादन]] भी कर सकते हैं।",
        "compare-invalid-title": "आपके द्वारा निर्दिष्ट शीर्षक अमान्य है।",
        "compare-title-not-exists": "आपके द्वारा निर्दिष्ट शीर्षक मौजूद नहीं है।",
        "compare-revision-not-exists": "आपके द्वारा निर्दिष्ट संशोधन मौजूद नहीं है।",
-       "dberr-header": "इस विकि को कुछ दिक्कत आ रही है",
        "dberr-problems": "क्षमा करें! इस जालस्थल को कुछ तकनीकी परेशानियों का सामना करना पड़ रहा है।",
        "dberr-again": "कुछ मिनट रुकने के बाद फिर से चढ़ाएँ।",
        "dberr-info": "(आँकड़ाकोष सेवक से संपर्क नहीं हो पा रहा:$1)",
index ec3e1e9..caa8d29 100644 (file)
@@ -8,7 +8,8 @@
                        "Girmitya",
                        "Kaganer",
                        "Malafaya",
-                       "Thakurji"
+                       "Thakurji",
+                       "아라"
                ]
        },
        "tog-underline": "Jorr ke niche line khicho:",
@@ -21,7 +22,6 @@
        "tog-showtoolbar": "Badle waala toolbar ke dekhao",
        "tog-editondblclick": "Dugnaa click pe panna ke badlo",
        "tog-editsectiononrightclick": "Bhaag ke title pe right click kare pe bhaag ke badle ke laabu karo",
-       "tog-rememberpassword": "Ii browser me (jaada se jaada $1 {{PLURAL:$1|din|din}}) talak hamaar login ke yaad rakho.",
        "tog-watchcreations": "Hamaar banawa waala panna aur upload karaa gais file ke hamaar dhyaan suchi me jorro",
        "tog-watchdefault": "Ham se badla gais panna aur file ke hamaar dhyaan suchi me jorro",
        "tog-watchmoves": "Uu panna aur file jiske naam ham badla hai ke hamaar dhyaan suchi me jorro",
        "readonly_lag": "Database apne se band hoi gais hai jab tak ki duusra database, khaas database ke sanghe kaam nai kare lage.",
        "internalerror": "Bhitri galti",
        "internalerror_info": "Bhitri galti: $1",
-       "fileappenderrorread": "Jorre ke time $1 ke nai parrhe sakaa hae.",
-       "fileappenderror": "\"$1\" ke \"$2\" se nai jorre sakaa hae.",
        "filecopyerror": "File \"$1\" ke \"$2\" pe copy nai kare sakaa.",
        "filerenameerror": "File \"$1\" ke naam badal ke \"$2\" nai kare sakaa.",
        "filedeleteerror": "File \"$1\" ke nai mitae sakaa.",
        "directorycreateerror": "Directory \"$1\" ke nai banae sakaa.",
        "filenotfound": "File \"$1\" ke nai pae sakaa.",
-       "fileexistserror": "File \"$1\" me nai likhe sakaa: file hai",
        "unexpected": "Aasa karaa gais jaankari nai hai: \"$1\"=\"$2\".",
        "formerror": "Galti: form ke submit nai kare sakaa",
        "badarticleerror": "Ii chij ke ii panna me nai karaa jae sake hai.",
        "gotaccountlink": "Log in",
        "userlogin-resetlink": "Ka aap aapan login kare waala jaankari ke bhulae gaya hae?",
        "userlogin-resetpassword-link": "Aapan password ke reset karo",
-       "createacct-join": "Aapan jankari niche likho",
-       "createacct-another-join": "Account ke baare me jaankari niche likho",
        "createacct-emailrequired": "Email address",
        "createacct-emailoptional": "Email address (jaruri nai hae)",
        "createacct-email-ph": "Aapan mail address ke likho",
        "savearticle": "Panna ke bachao",
        "preview": "Jhalak dekhao",
        "showpreview": "Preview dekhao",
-       "showlivepreview": "Abhi ke jhalak",
        "showdiff": "Badlao dekhao",
        "anoneditwarning": "'''Sawadhaan:''' Aap login nai karaa hai\nAap ke IP address ii panna ke edit itihaas me record karaa jaai.",
        "anonpreviewwarning": "\"Aap log in nai bhaya hae. Ii panna ke bachae pe aap ke IP address ke panna ke badlao ke itihass me likha jaai.\"",
        "edit-gone-missing": "Panna ke badle nai sakaa.\nJanae hai ki iske koi mitae dii hai.",
        "edit-conflict": "Badlao me conflict hai.",
        "edit-no-change": "Aap ke badle ke kosis ke ignore kar dewa gais hai, kahe ki text ke badla nai gais hai.",
-       "postedit-confirmation": "Aap ke badlao ke bachae lewa gais hae.",
+       "postedit-confirmation-saved": "Aap ke badlao ke bachae lewa gais hae.",
        "edit-already-exists": "Nawaa panna nai banae sakaa hai.\nIi naam ke panna abhi hai.",
        "defaultmessagetext": "Default message text",
        "content-failed-to-parse": "$1 model ke khatir $2 ke parse nai kare sakaa hae: $3",
        "search-nonefound": "Ii sawaal ke koi jawab nai hae.",
        "powersearch-legend": "Gahira khoj",
        "powersearch-ns": "Namespaces me khojo:",
-       "powersearch-redir": "Redirects ke suchi do",
        "powersearch-togglelabel": "Check karo:",
        "powersearch-toggleall": "Sab",
        "powersearch-togglenone": "Koi bhi nai",
        "prefs-advancedsearchoptions": "Uchchaa pasand",
        "prefs-advancedwatchlist": "Uchchaa pasand",
        "prefs-displayrc": "Choice dekhao",
-       "prefs-displaysearchoptions": "Choice dekhao",
        "prefs-displaywatchlist": "Choice dekhao",
        "prefs-tokenwatchlist": "Chinh (token)",
        "prefs-diffs": "Farka",
        "recentchanges-label-unpatrolled": "Ii badlao pe abhi pahraa nai dewa gais hae.",
        "recentchanges-legend-newpage": "$1 - nawaa panna",
        "rcnotefrom": "Niche '''$2''' se badlao hai ('''$1''' tak )",
-       "rclistfrom": "$1 se suruu kar ke nawaa badlao dekhao",
+       "rclistfrom": "$3 $2 se suruu kar ke nawaa badlao dekhao",
        "rcshowhideminor": "$1 chhota badlao",
        "rcshowhidebots": "$1 bots",
        "rcshowhideliu": "$1 logged-in sadasya",
        "uploadstash-refresh": "File ke suchi ke fir se dekhao",
        "invalid-chunk-offset": "Kharaab chunk offset",
        "img-auth-accessdenied": "ijajat nai hae",
-       "img-auth-nopathinfo": "Aap ke server ke ii jankari de khatir set up nai karaa gais hae\nSaait ii CGI-based hoi aur img_auth ke nai support karat hoi.\nhttps://www.mediawiki.org/wiki/Manual:Image_Authorization ke dekho.",
+       "img-auth-nopathinfo": "Aap ke server ke ii jankari de khatir set up nai karaa gais hae\nSaait ii CGI-based hoi aur img_auth ke nai support karat hoi.\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization ke dekho.",
        "img-auth-notindir": "Maanga gais path configured upload directory me me nai hae.",
        "img-auth-badtitle": "\"$1\" se kanuni title ke nai banae sakaa hae.",
        "img-auth-nologinnWL": "Aap logged in nai hae aur \"$1\" whitelist me nai hae.",
        "watchlist-details": "{{PLURAL:$1|$1 panna|$1 panna}} pe dhyan dewa jae hai, baat waala panna ke chhorr ke.",
        "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.",
-       "watchmethod-recent": "Dhyan me rakkhaa gais panna ke nawaa badlao ke check karaa jaawe hai",
-       "watchmethod-list": "dhyan me rakkha gais panna ke nawaa badlao ke khatir check karaa jaawe hai",
-       "watchlistcontains": "Aap ke dhyan suchi me  $1 {{PLURAL:$1|panna|panna}} hai.",
-       "iteminvalidname": "'$1' chij se kuchh garrbarr hai, galat naam...",
        "wlshowlast": "Pichhla $1 ghanta $2 din $3 ke dekhao",
        "watchlist-options": "Dhyan suchi ke options",
        "watching": "Dekhtaa...",
        "enotif_lastvisited": "Aap ke pichhla visit ke baad ke badlao ke khatir $1 ke dekho.",
        "enotif_lastdiff": "Ii badlao ke dekhe ke khatir $1 ke dekho.",
        "enotif_anon_editor": "bina naam ke sadasya $1",
-       "enotif_body": "Priye $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nEditor's summary: $PAGESUMMARY $PAGEMINOREDIT\n\nContact the editor:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\n\n\nAur koi notifications nai rahii, kahe ki koi aur badlao hoe sake hai, jab talak aap ii panna ke visit nai karta hai.\nAap aapan dhyan suchi me sab dhyan me rakha gais panna pe notification flags ke reset kare sakta hai.\n\nAap ke  dayalu {{SITENAME}} notification system\n\n--\nAapan Email notofication setting ke badle ke khatir, jaao\n{{canonicalurl:{{#special:Preferences}}}}\n\nAapan dhyan ke settings ke badle ke khatir, jaao\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\n\nAapan dhyan suchi se panna ke mitae ke khatir, jaao\n$UNWATCHURL\n\n\nAapan bichar de ke khatir aur aage ke sahaeta:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Priye $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nEditor's summary: $PAGESUMMARY $PAGEMINOREDIT\n\nContact the editor:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\n\n\nAur koi notifications nai rahii, kahe ki koi aur badlao hoe sake hai, jab talak aap ii panna ke visit nai karta hai.\nAap aapan dhyan suchi me sab dhyan me rakha gais panna pe notification flags ke reset kare sakta hai.\n\nAap ke  dayalu {{SITENAME}} notification system\n\n--\nAapan Email notofication setting ke badle ke khatir, jaao\n{{canonicalurl:{{#special:Preferences}}}}\n\nAapan dhyan ke settings ke badle ke khatir, jaao\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\n\nAapan dhyan suchi se panna ke mitae ke khatir, jaao\n$UNWATCHURL\n\n\nAapan bichar de ke khatir aur aage ke sahaeta:\n$HELPPAGE",
        "created": "banae dewa gais hai",
        "changed": "badal dewa gais hai",
        "deletepage": "Pana ke delete karo",
        "blockip": "Sadasya ke roko",
        "blockip-legend": "Sadasya ke roko",
        "blockiptext": "Niche ke form ke use kar ke koi khaas IP address nai to username ke write access ke roko.\nIske khaali vandalism ke roke ke khatir use kare ke chaahi [[{{MediaWiki:Policy-url}}|policy]] ke niche.\nNiche ek khaas kaaran likho (jaise ki, citing particular pages that were vandalized).",
-       "ipadressorusername": "IP Address nai to username:",
+       "ipaddressorusername": "IP Address nai to username:",
        "ipbexpiry": "Expiry:",
        "ipbreason": "Kaaran:",
        "ipbreason-dropdown": "*Roke ke sadhaarankaaran\n** Galat jaankari diis\n** Panna se jaankari nikalis\n** Bahaari site se spamming jorr\n** Panna me bakwaas/and sand liko\n** Duusre ke dhamki do\n** Ek se jaada account ke khraab kaam me laao\n** Sadasya ke naam thiik nai hae",
        "tooltip-undo": "\"Undo\" ii badlao ke pahile jaise kar de hai aur edit form ke preview mode me khole hai.\nIi summary me ek kaaran jorre ke ijajat de hai.",
        "tooltip-preferences-save": "Pasand ke bachao",
        "tooltip-summary": "Thora sabd me likho",
-       "notacceptable": "Wiki server uu rakam se data nai dewe sake hai jisse ki aap ke client parrhe sake.",
        "anonymous": "Anonymous {{PLURAL:$1|sadasya|sadasya}} {{SITENAME}} ke",
        "siteuser": "{{SITENAME}} sadasya $1",
        "anonuser": "{{SITENAME}} benaam sadasya $1",
        "newimages-summary": "Ii khaas panna pahile waala upload karaa gais file ke dekhae hai.",
        "newimages-legend": "Chaalo",
        "newimages-label": "Filename (nai to iske ek hissa):",
-       "showhidebots": "($1 bots)",
        "noimages": "Koi chij dekhe ke nai hai.",
        "ilsubmit": "Khojo",
        "bydate": "tarik se",
        "autosumm-replace": "Contwnt ke \"$1\" se replace kar dewa gais hae",
        "autoredircomment": "Panna ke [[$1]] pe redirect kar dewa gais hae",
        "autosumm-new": "Panna jisme \"$1\" hae ke banae dewa gais hae.",
-       "livepreview-loading": "load karaa jaae hae...",
-       "livepreview-ready": "Load karaa jaae hae... Ready!",
-       "livepreview-failed": "Live preview fail hoe gais hae!\nNormal preview try karo.",
-       "livepreview-error": "Connect nai kare sakaa hae: $1 \"$2\".\nNormal preview ke try karo.",
        "lag-warn-normal": "$1 {{PLURAL:$1|second|seconds}} se nawaa badlao, saait ii suchi me nai dekhai.",
        "lag-warn-high": "Jaada database server lag ke kaaran $1 {{PLURAL:$1|second|seconds}} se nawaa badlao suchi me saait nai dekhaai.",
-       "watchlistedit-numitems": "Aap ke dhyan suchi me, baat aala panna ke chhorr ke,  {{PLURAL:$1|1 title|$1 titles}} hae.",
-       "watchlistedit-noitems": "Aap ke dhyan suchi me koi naam nai hae",
        "watchlistedit-normal-title": "Dhyan suchi ke badlo",
        "watchlistedit-normal-legend": "Titles ke dhyan suchi se hatao",
        "watchlistedit-normal-explain": "Aap ke dhyan suchi ke title ke niche dekaa jaae hae.\nEk title ke hatae ke khatir, uske bagal ke box ke check karo, aur \"{{int:Watchlistedit-normal-submit}}\" ke click karo.\nYou can also [[Special:EditWatchlist/raw|edit the raw list]].",
        "compare-rev1": "Badlao 1",
        "compare-rev2": "Badlao 2",
        "compare-submit": "Antar dekho",
-       "dberr-header": "Ii wiki me kuchh garrbarr hae",
        "htmlform-reset": "Badlao ke pahile jaise karo",
        "htmlform-selectorother-other": "Duusra",
        "revdelete-restricted": "sysops pe llabu restrictions",
index 8a75c43..1de9987 100644 (file)
@@ -9,7 +9,8 @@
                        "Midnight Gambler",
                        "Oxyzen",
                        "Tagimata",
-                       "Taylortheturtle"
+                       "Taylortheturtle",
+                       "아라"
                ]
        },
        "tog-underline": "Kuritan sa idalom ang mga tabid:",
@@ -22,7 +23,6 @@
        "tog-showtoolbar": "Ipakita ang edit toolbar (nagakilanlan JavaScript)",
        "tog-editondblclick": "Islan ang pahina kung i-doble klik mo (nagakilanlan JavaScript)",
        "tog-editsectiononrightclick": "Sugtan ang pag-ilis sang seksyon paagi sa pagtum-ok sang natoo sa mouse sa titulo sang seksyon (nagakinahanglan sang JavaScript)",
-       "tog-rememberpassword": "Dumdumon ang akon password sa sini nga brawser (para sa indi magsobra $1 {{PLURAL:$1|nga adlaw|nga mga adlaw}})",
        "tog-watchcreations": "Magdugang sang mga panid nga akon buhaton kag mga hilera nga akon igapasaka sa akon mga ginabantayan",
        "tog-watchdefault": "Idugang ang mga panid kag hilera nga akon ginbag-o sa akon mga ginabantayan",
        "tog-watchmoves": "Idugang ang mga panid kag hilera nga akon ginsaylo sa akon mga ginabantayan",
        "readonly_lag": "Ang database ginkadadohan na dayon samtang ang alalay nga mga serber sang database nagalagas sa agalon",
        "internalerror": "Pangsulod nga sala",
        "internalerror_info": "Pangsulod nga sala: $1",
-       "fileappenderrorread": "Indi mabasa ang \"$1\" sa tion sang pagdugang.",
-       "fileappenderror": "Indi mahimo nga idugang ang \"$1\" sa \"$2\".",
        "filecopyerror": "Indi mahimo nga pagakopyahon ang \"$1\" sa \"$2\".",
        "filerenameerror": "Indi mahimo nga paga-ilisan ang pangalan sang hilera halin sa \"$1\" sa \"$2\".",
        "filedeleteerror": "Indi mahimo nga pagapanason ang hilera nga \"$1\".",
        "directorycreateerror": "Indi mahimo nga mabuhat ang direktoryo nga \"$1\".",
        "filenotfound": "Indi makita ang hiilera nga \"$1\".",
-       "fileexistserror": "Wala madayon ang pagsulat sa hilera nga \"$1\": ang hilera yara na nga daan",
        "unexpected": "Wala mapaktan nga bili: \"$1\"=\"$2\".",
        "formerror": "Sala: indi mahimo nga mapadala ang formas",
        "badarticleerror": "Ang ini nga hulag indi pwede mabuhat sa sini nga panid.",
        "savearticle": "Tiponon ining panid",
        "preview": "Ipakita subong",
        "showpreview": "Ipakita nga daan",
-       "showlivepreview": "Prebiyu nga karon dayon",
        "showdiff": "Ipakita ang inislan",
        "anoneditwarning": "'''Pa-andam:''' Wala ka pa nakasulod.\nIgasulat ang imo IP adres sa historya sini nga inislan na pahina.",
        "anonpreviewwarning": "''Wala ka pa nakasulod. Igasulat ang imo IP adres sa historya sini nga inislan na pahina.''",
        "search-nonefound": "Wala sang mga resulta nga nagsanto sa imo nga ginapangita.",
        "powersearch-legend": "Abanse nga pagpangita",
        "powersearch-ns": "Pangita sa mga ngalan-espasyo:",
-       "powersearch-redir": "Lista sang mga gin direkta liwat",
        "powersearch-togglelabel": "Tsekan:",
        "powersearch-toggleall": "Tanan",
        "powersearch-togglenone": "Wala",
        "prefs-advancedsearchoptions": "Mas progresibo nga pilian",
        "prefs-advancedwatchlist": "Mas progresibo nga pilian",
        "prefs-displayrc": "Ipagwa ang mga pagpilian",
-       "prefs-displaysearchoptions": "Ipagwa ang mga pagpilian",
        "prefs-displaywatchlist": "Ipagwa ang mga pagpilian",
        "prefs-diffs": "Mga ginalainan",
        "email-address-validity-valid": "Ang nasambit nga e-mail pwede batunon",
        "recentchanges-label-bot": "Ang sini nga pagbag-o ginubra sang isa ka bot",
        "recentchanges-label-unpatrolled": "Ang sini nga pagbag-o indi pa ginbantayan",
        "rcnotefrom": "Yara sa idalum ang mga guinbag-o halin '''$2''' (tubtub '''$1''' ang ginpagwa).",
-       "rclistfrom": "Ipakita ang bag-o lang nahimo halin sa $1",
+       "rclistfrom": "Ipakita ang bag-o lang nahimo halin sa $3 $2",
        "rcshowhideminor": "$1 menor nga mga inislan",
        "rcshowhidebots": "$1 bots",
        "rcshowhideliu": "$1 mga ga-usar nga naka sulod",
        "tooltip-undo": "\"Indi pag-obrahon\" ginabalik ang gin-islan kag gabukas sa isaln form sa may prebyu mode.\nGapasugot sa pagdugang sang rason sa kabilugan.",
        "tooltip-preferences-save": "kon pagpalabi",
        "tooltip-summary": "Maghatag sing diutay nga eksplikasyon",
-       "notacceptable": "Indi makahatag sang impormasyon ang serbidor sang wiki sa porma nga mabasahan sang imo nga kliyente.",
        "anonymous": "Indi kilala {{PLURAL:$1|tagagamit|mga tagagamit}} sang {{SITENAME}}",
        "siteuser": "Tiggamit {{SITENAME}} sang $1",
        "previousdiff": "← Mas daan nga na-islan",
index 9bce0a6..d0e5a97 100644 (file)
@@ -26,7 +26,8 @@
                        "SpeedyGonsales",
                        "Tivek",
                        "Treecko",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Podcrtane poveznice",
@@ -39,7 +40,6 @@
        "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-rememberpassword": "Zapamti moju lozinku u ovom pregledniku (najduže $1 {{PLURAL:$1|dan|dana|dana}})",
        "tog-watchcreations": "Dodaj članke koje kreiram 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",
        "permalink": "Trajna poveznica",
        "print": "Ispiši",
        "view": "Vidi",
+       "view-foreign": "vidi na projektu $1",
        "edit": "uredi",
        "create": "Započni",
+       "create-local": "dodaj lokalni opis",
        "editthispage": "Uredi ovu stranicu",
        "create-this-page": "Započni ovu stranicu",
        "delete": "Izbriši",
        "readonly_lag": "Baza podataka je automatski zaključana dok se sekundarni bazni poslužitelji ne usklade s glavnim",
        "internalerror": "Pogreška sustava",
        "internalerror_info": "Interna pogrješka: $1",
-       "fileappenderrorread": "Nije se moglo pročitati \"$1\" tijekom dodavanja.",
-       "fileappenderror": "Nije bilo moguće dodati \"$1\" u \"$2\".",
        "filecopyerror": "Ne mogu kopirati datoteku \"$1\" u \"$2\".",
        "filerenameerror": "Ne mogu preimenovati datoteku \"$1\" u \"$2\".",
        "filedeleteerror": "Ne mogu obrisati datoteku \"$1\".",
        "directorycreateerror": "Nije moguće kreirati direktorij \"$1\".",
        "filenotfound": "Datoteka \"$1\" nije nađena.",
-       "fileexistserror": "Ne mogu stvoriti datoteku \"$1\": datoteka s tim imenom već postoji",
        "unexpected": "Neočekivana vrijednost: \"$1\"=\"$2\".",
        "formerror": "Pogreška: Ne mogu poslati podatke",
        "badarticleerror": "Ovu radnju nije moguće izvesti s tom stranicom.",
        "userlogin-resetpassword-link": "Zaboravili ste zaporku?",
        "userlogin-loggedin": "Već ste prijavljeni kao {{GENDER:$1|$1}}.\nRabite donji obrazac da biste se prijavili kao drugi suradnik.",
        "userlogin-createanother": "Stvori još jedan račun",
-       "createacct-join": "Upišite ispod svoje podatke.",
-       "createacct-another-join": "Upišite dolje podatke o novom računu.",
        "createacct-emailrequired": "Adresa e-pošte",
        "createacct-emailoptional": "Adresa e-pošte",
        "createacct-email-ph": "Upišite svoju adresu e-pošte",
        "savearticle": "Sačuvaj stranicu",
        "preview": "Pregled kako će stranica izgledati",
        "showpreview": "Prikaži kako će izgledati",
-       "showlivepreview": "Pregled kako će izgledati, uživo",
        "showdiff": "Prikaži promjene",
        "anoneditwarning": "'''Upozorenje:''' Niste prijavljeni pod suradničkim imenom. Vaša IP adresa bit će zabilježena u popisu izmjena ove stranice.",
        "anonpreviewwarning": "''Niste prijavljeni. Spremanjem će Vaše IP adrese ostati zabilježene u starim izmjenama ove stranice.''",
        "edit-gone-missing": "Stranica nije spremljena.\nČini se kako je obrisana.",
        "edit-conflict": "Sukob uređivanja.",
        "edit-no-change": "Vaše uređivanje je zanemareno, jer nikakva promjena sadržaja nije napravljena.",
-       "postedit-confirmation": "Vaše je uređivanje sačuvano.",
+       "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",
        "content-failed-to-parse": "Obrada (''parsiranje'') formata $2 za model $1 nije uspjela: $3",
        "logdelete-success": "'''Vidljivost uređivanja uspješno postavljena.'''",
        "logdelete-failure": "'''Vidljivost evidencije ne može biti postavljena:'''\n$1",
        "revdel-restore": "Promijeni dostupnost",
-       "pagehist": "Povijest stranice",
+       "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.",
        "revdelete-show-no-access": "Pogrješka u prikazivanju stavke od $2, $1: ova stavka označena je kao \"ograničeno\".\nNemate pristup do nje.",
        "searchmenu-exists": "* Stranica '''[[$1]]'''",
        "searchmenu-new": "'''Stvori stranicu \"[[:$1]]\" na ovoj wiki!'''",
        "searchprofile-articles": "Stranice sa sadržajem",
-       "searchprofile-project": "Pomoć i stranice projekta",
        "searchprofile-images": "Multimedija",
        "searchprofile-everything": "Sve",
        "searchprofile-advanced": "Napredno",
        "searchprofile-articles-tooltip": "Traži u $1",
-       "searchprofile-project-tooltip": "Traži u $1",
        "searchprofile-images-tooltip": "Traži datoteke",
        "searchprofile-everything-tooltip": "Pretraži sav sadržaj (uključujući i stranice za razgovor)",
        "searchprofile-advanced-tooltip": "Traži u zadanom imenskom prostoru",
        "search-nonefound": "Ne postoje rezultati koji se podudaraju s upitom.",
        "powersearch-legend": "Napredno pretraživanje",
        "powersearch-ns": "Traži u imenskom prostoru:",
-       "powersearch-redir": "Prikaži preusmjerenja",
        "powersearch-togglelabel": "Uključi:",
        "powersearch-toggleall": "Sve",
        "powersearch-togglenone": "Ništa",
        "prefs-emailconfirm-label": "Potvrda e-mail adrese:",
        "youremail": "Vaša elektronska pošta *",
        "username": "Ime {{GENDER:$1|suradnika|suradnice}}:",
-       "uid": "ID-broj {{GENDER:$1|suradnika|suradnice}}:",
        "prefs-memberingroups": "{{GENDER:$2|Suradnik|Suradnica}} je član {{PLURAL:$1|sljedeće skupine|sljedećih skupina}}:",
        "prefs-registration": "Vrijeme prijave:",
        "yourrealname": "Pravo ime (nije obvezno)*",
        "prefs-advancedsearchoptions": "Napredne mogućnosti",
        "prefs-advancedwatchlist": "Napredne mogućnosti",
        "prefs-displayrc": "Prikaži opcije",
-       "prefs-displaysearchoptions": "Mogućnosti prikaza",
        "prefs-displaywatchlist": "Mogućnosti prikaza",
        "prefs-diffs": "razl",
        "prefs-help-prefershttps": "Ova mogućnost će stupiti na snagu kod sljedeće prijave.",
        "recentchanges-legend-heading": "'''Legenda:'''",
        "recentchanges-legend-newpage": "$1 - 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 $1",
+       "rclistfrom": "Prikaži nove promjene počevši od $3 $2",
        "rcshowhideminor": "$1 manje promjene",
        "rcshowhideminor-show": "prikaži",
        "rcshowhideminor-hide": "sakrij",
        "rc_categories": "Ograniči na kategorije (odvojene znakom  \"|\")",
        "rc_categories_any": "Sve",
        "rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajta|bajtova}} poslije uređivanja",
-       "newsectionsummary": "/* $1 */ Novi odlomak",
+       "newsectionsummary": "/* $1 */ novi odlomak",
        "rc-enhanced-expand": "Pokaži detalje (potreban JavaScript)",
        "rc-enhanced-hide": "Sakrij detalje",
        "rc-old-title": "izvorno ime bilo je \"$1\"",
        "uploadstash-refresh": "Osvježi popis datoteka",
        "invalid-chunk-offset": "Nevaljana točka nastavka snimanja",
        "img-auth-accessdenied": "Pristup onemogućen",
-       "img-auth-nopathinfo": "Nedostaje PATH_INFO.\nVaš poslužitelj nije postavljen da prosljeđuje ovu informaciju.\nMožda se temelji na CGI skripti i ne može podržavati img_auth.\n[https://www.mediawiki.org/wiki/Manual:Image_Authorization?uselang=hr Pogledajte stranicu o autorizaciji slika]",
+       "img-auth-nopathinfo": "Nedostaje PATH_INFO.\nVaš poslužitelj nije postavljen da prosljeđuje ovu informaciju.\nMožda se temelji na CGI skripti i ne može podržavati img_auth.\n[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization?uselang=hr Pogledajte stranicu o autorizaciji slika]",
        "img-auth-notindir": "Zahtjevana putanja nije u direktoriju podešenom za postavljanje.",
        "img-auth-badtitle": "Ne mogu stvoriti valjani naslov iz \"$1\".",
        "img-auth-nologinnWL": "Niste prijavljeni i \"$1\" nije na popisu dozvoljenih.",
        "log-title-wildcard": "Traži stranice koje počinju s navedenim izrazom",
        "showhideselectedlogentries": "Otkrij/sakrij odabrane evidencije",
        "allpages": "Sve stranice",
-       "alphaindexline": "$1 do $2",
        "nextpage": "Sljedeća stranica ($1)",
        "prevpage": "Prethodna stranica ($1)",
        "allpagesfrom": "Pokaži stranice počevši od:",
        "watchlist-details": "{{PLURAL:$1|$1 stranica|$1 stranice|$1 stranica}} se nalazi na popisu praćenja, ne brojeći stranice za razgovor.",
        "wlheader-enotif": "Uključeno je izvješćivanje e-poštom.",
        "wlheader-showupdated": "Stranice koje su promijenjene od Vašeg posljednjeg posjeta prikazane su '''podebljano'''",
-       "watchmethod-recent": "provjera nedavnih promjena praćenih stranica",
-       "watchmethod-list": "provjera praćanih stranica za nedavne promjene",
-       "watchlistcontains": "Vaš popis praćenja sadrži $1 {{PLURAL:$1|stranicu|stranice|stranica}}.",
-       "iteminvalidname": "Problem s izborom '$1', ime nije valjano...",
        "wlshowlast": "Prikaži posljednjih $1 sati $2 dana $3",
        "watchlist-options": "Izbornik popisa praćenja",
        "watching": "Pratim...",
        "enotif_lastvisited": "Pogledaj $1 za promjene od zadnjeg posjeta.",
        "enotif_lastdiff": "Pogledajte $1 kako biste mogli vidjeti tu izmjenu.",
        "enotif_anon_editor": "neprijavljeni suradnik $1",
-       "enotif_body": "Poštovani $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nSažetak urednika: $PAGESUMMARY $PAGEMINOREDIT\n\nMožete kontaktirati suradnika koji je posljednji uređivao stranicu:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nDo Vašeg ponovnog posjeta stranici nećete dobivati nove obavijesti. Postavke za izvješćivanje možete vratiti na prvotno zadane za sve praćene stranice svog popisa praćenja.\n\nVaš sustav izvješćivanja {{SITENAME}}.\n\n--\nZa promjene postavki izvješćivanja putem e-pošte, posjetite\n{{canonicalurl:{{#special:Preferences}}}}\n\nZa promjene svog popisa praćenja, posjetite\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nZa brisanje stranica iz svog popisa praćenja, posjetite\n$UNWATCHURL\n\nZa povratne informacije i pomoć posjetite:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Poštovani $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nSažetak urednika: $PAGESUMMARY $PAGEMINOREDIT\n\nMožete kontaktirati suradnika koji je posljednji uređivao stranicu:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nDo Vašeg ponovnog posjeta stranici nećete dobivati nove obavijesti. Postavke za izvješćivanje možete vratiti na prvotno zadane za sve praćene stranice svog popisa praćenja.\n\nVaš sustav izvješćivanja {{SITENAME}}.\n\n--\nZa promjene postavki izvješćivanja putem e-pošte, posjetite\n{{canonicalurl:{{#special:Preferences}}}}\n\nZa promjene svog popisa praćenja, posjetite\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nZa brisanje stranica iz svog popisa praćenja, posjetite\n$UNWATCHURL\n\nZa povratne informacije i pomoć posjetite:\n$HELPPAGE",
        "created": "stvorio",
        "changed": "promijenio",
        "deletepage": "Izbriši stranicu",
        "exbeforeblank": "sadržaj prije brisanja je bio: '$1'",
        "delete-confirm": "Obriši \"$1\"",
        "delete-legend": "Izbriši",
-       "historywarning": "'''Upozorenje''':  Stranica koju želite obrisati ima starije izmjene s približno $1 {{PLURAL:$1|inačicom|inačice|inačica}}:",
+       "historywarning": "'''Upozorenje''': stranica koju želite izbrisati ima starije izmjene s približno $1 {{PLURAL:$1|inačicom|inačice|inačica}}:",
        "confirmdeletetext": "Zauvijek ćete izbrisati stranicu ili sliku zajedno s prijašnjim inačicama.\nMolim potvrdite svoju namjeru, da razumijete posljedice i da ovo radite u skladu s [[{{MediaWiki:Policy-url}}|pravilima]].",
        "actioncomplete": "Zahvat završen",
        "actionfailed": "Radnja nije uspjela",
        "contributions-title": "Suradnički doprinosi za $1",
        "mycontris": "Moji doprinosi",
        "contribsub2": "Za {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "Suradnički račun \"$1\" nije registriran.",
        "nocontribs": "Nema promjena koje udovoljavaju ovim kriterijima.",
        "uctop": "(vrh)",
        "month": "Od mjeseca (i ranije):",
        "sp-contributions-search": "Pretraži doprinose",
        "sp-contributions-username": "IP adresa ili suradnik:",
        "sp-contributions-toponly": "Prikaži samo najnovije izmjene",
+       "sp-contributions-newonly": "Pokaži samo stranice koje je suradnik započeo",
        "sp-contributions-submit": "Traži",
        "whatlinkshere": "Što vodi ovamo",
        "whatlinkshere-title": "Stranice koje vode na \"$1\"",
        "blockip": "Blokiraj suradnika",
        "blockip-legend": "Blokiraj suradnika",
        "blockiptext": "Koristite donji obrazac za blokiranje pisanja pojedinih suradnika ili IP adresa .\nTo biste trebali raditi samo zbog sprječavanja vandalizma i u skladu\nsa [[{{MediaWiki:Policy-url}}|smjernicama]].\nUpišite i razlog za ovo blokiranje (npr. stranice koje su\nvandalizirane).",
-       "ipadressorusername": "IP adresa ili suradničko ime",
+       "ipaddressorusername": "IP adresa ili suradničko ime",
        "ipbexpiry": "Rok (na engleskom)",
        "ipbreason": "Razlog:",
        "ipbreason-dropdown": "*Najčešći razlozi za blokiranje\n** Netočne informacije\n** Uklanjanje sadržaja stranica\n** Postavljanje ''spam'' vanjskih poveznica\n** Grafiti\n** Osobni napadi (ili napadačko ponašanje)\n** Čarapare (zloporaba više suradničkih računa)\n** Neprihvatljivo suradničko ime",
        "monobook.css": "/** Ovdje idu izmjene monobook stylesheeta */",
        "common.js": "/* JavaScript kod na ovoj stranici će biti izvršen kod svakog suradnika pri svakom učitavanju svake stranice wikija. */",
        "monobook.js": "/* Ne rabi se više; molimo rabite [[MediaWiki:common.js]] */",
-       "notacceptable": "Wiki server ne može dobaviti podatke u obliku kojega Vaš preglednik može pročitati.",
        "anonymous": "Neprijavljeni {{PLURAL:$1|suradnik|suradnici}} projekta {{SITENAME}}",
        "siteuser": "Suradnik $1 na projektu {{SITENAME}}",
        "anonuser": "{{SITENAME}} anonimni suradnik $1",
        "pageinfo-category-pages": "Broj stranica",
        "pageinfo-category-subcats": "Broj podkategorija",
        "pageinfo-category-files": "Broj datoteka",
-       "skinname-cologneblue": "Kölnska plava",
        "skinname-monobook": "MonoBook",
        "markaspatrolleddiff": "Označi za pregledano",
        "markaspatrolledtext": "Označi ovaj članak pregledanim",
        "newimages-summary": "Ova posebna stranica pokazuje posljednje nedavno postavljene datoteke.",
        "newimages-legend": "Filtar",
        "newimages-label": "Naziv datoteke (ili njen dio):",
-       "showhidebots": "($1 botova)",
        "noimages": "Nema slika.",
        "ilsubmit": "Traži",
        "bydate": "po datumu",
        "table_pager_limit_label": "Stavke po stranici:",
        "table_pager_limit_submit": "Idi",
        "table_pager_empty": "Nema rezultata",
-       "autosumm-blank": "Uklonjen cjelokupni sadržaj stranice",
-       "autosumm-replace": "Tekst stranice se zamjenjuje s '$1'",
-       "autoredircomment": "Preusmjeravanje na [[$1]]",
-       "autosumm-new": "Nova stranica: $1",
-       "livepreview-loading": "Učitavam…",
-       "livepreview-ready": "Učitavam… gotovo!",
-       "livepreview-failed": "Lokalni (JavaScript) pretpregled nije uspio! Pokušajte normalni pretpregled.",
-       "livepreview-error": "Spajanje nije uspjelo: $1 \"$2\". Pokušajte normalni pretpregled.",
+       "autosumm-blank": "uklonjen cjelokupni sadržaj stranice",
+       "autosumm-replace": "tekst stranice se zamjenjuje s '$1'",
+       "autoredircomment": "preusmjeravanje na [[$1]]",
+       "autosumm-new": "nova stranica: $1",
        "lag-warn-normal": "Moguće je da izmjene nastale posljednjih $1 {{PLURAL:$1|sekundu|sekundi}} neće biti vidljive na ovom popisu.",
        "lag-warn-high": "Zbog kašnjenja baze podataka, moguće je da promjene napravljene u posljednjih $1 {{PLURAL:$1|sekundu|sekunde|sekundi}} nisu prikazane u popisu.",
-       "watchlistedit-numitems": "Vaš popis praćenja sadrži {{PLURAL:$1|1 stranicu|$1 stranica}}, bez stranica za razgovor.",
-       "watchlistedit-noitems": "Vaš popis praćenja je prazan.",
        "watchlistedit-normal-title": "Uredi popis praćenja",
        "watchlistedit-normal-legend": "Ukloni stranice iz popisa praćenja",
        "watchlistedit-normal-explain": "Prikazane su stranice na Vašem popisu praćenja.\nDa uklonite stranicu s popisa praćenja, označite kućicu kraj nje i kliknite gumb \"{{int:Watchlistedit-normal-submit}}\".\nMožete također [[Special:EditWatchlist/raw|uređivati ovaj popis u okviru za uređivanje]].",
        "compare-invalid-title": "Naslov koji ste naveli je nevažeći.",
        "compare-title-not-exists": "Naslov koji ste naveli ne postoji.",
        "compare-revision-not-exists": "Navedena izmjena stranice ne postoji.",
-       "dberr-header": "Ovaj wiki ima problem",
        "dberr-problems": "Ispričavamo se! Ova stranica ima tehničkih poteškoća.",
        "dberr-again": "Pričekajte nekoliko minuta i ponovno učitajte.",
        "dberr-info": "(Ne mogu se spojiti na poslužitelj baze: $1)",
index b70c55d..b9bec71 100644 (file)
        "readonly_lag": "Die Datebank woard automatisch für Schreibzugriffe gesperrt, domit sich die verteilte Datebankserver (Slaves/Skloove) mit dem Hauptdatebankserver (Master / Meister) abgegleicht sin könne.",
        "internalerror": "Interner Fehler",
        "internalerror_info": "Interner Fehler: $1",
-       "fileappenderrorread": "„$1“ konnt im Verloof von der Hinzufüche net geles sin.",
-       "fileappenderror": "Konnt „$1“ net an \"$2\" oonhänge.",
        "filecopyerror": "Die Datei \"$1\" konnt net noh \"$2\" kopiert sin.",
        "filerenameerror": "Die Datei \"$1\" konnt net noh \"$2\" umbenannt sin.",
        "filedeleteerror": "Die Datei \"$1\" konnt net gelöscht sin.",
        "directorycreateerror": "Das Verzeichnis \"$1\" konnt net oongeleht sin.",
        "filenotfound": "Die Datei \"$1\" woard net gefund.",
-       "fileexistserror": "In die Datei \"$1\" konnt net geschrieb sin, weil die Datei schon voarhand ist.",
        "unexpected": "Unerwoorteter Weart: „$1“ = „$2“",
        "formerror": "Fehler: Die Igäb konnte net veroorbeitet sin.",
        "badarticleerror": "Die Aktion kann uff die Seit net oongewendt sin.",
        "userlogin-helplink2": "Hellef bei der Oonmeldung",
        "userlogin-loggedin": "Du bist schon als {{GENDER:$1|$1}} oongemeldt.\nBenutz das unne stehnd Formular, um dich unner enem annren Benutzername oonzumelde.",
        "userlogin-createanother": "En weitres Benutzerkonto erstelle",
-       "createacct-join": "Geb do unne deine Informatione ren.",
-       "createacct-another-join": "Geb do unne die Informationen von der neie Benutzerkonto ren.",
        "createacct-emailrequired": "E-Mail-Adress",
        "createacct-emailoptional": "E-Mail-Adress (optional)",
        "createacct-email-ph": "Geb dein E-Mail-Adress ren",
        "savearticle": "Seit speichre",
        "preview": "Voarschau",
        "showpreview": "Vorschau zeiche",
-       "showlivepreview": "Sofortiche Voarschau",
        "showdiff": "Ändrunge zeiche",
        "anoneditwarning": "Du beoorbeitest die Seit unoongemeldet. Wenn du sie abspeichre tust, weard dein aktuelle Komputador IP-Adress in der Versionsgeschicht uffgezeichnet und ist domit unwiderruflich und kann '''öffentlich''' gesiehn sind.",
        "anonpreviewwarning": "''Du bist net oongemeldet. Beim Speichre weard dein IP-Adress in der Versionsgeschicht uffgezeichnet.''",
        "edit-gone-missing": "Die Seit konnt net aktualisiert sin.\nDie woard oonscheinend gelöscht.",
        "edit-conflict": "Beoorbeitungskonflikt.",
        "edit-no-change": "Dein Beoorbeitung woard ignoriert, do ken Ännrung an dem Text voargenomm  woard.",
-       "postedit-confirmation": "Dein Beoorbeitung woard gespeichert.",
+       "postedit-confirmation-created": "Die Seit woard erstellt.",
+       "postedit-confirmation-restored": "Die Seit woard wiederhergestellt.",
+       "postedit-confirmation-saved": "Dein Beoorbeitung woard gespeichert.",
        "edit-already-exists": "Die neie Seit konnt net erstellt werre, do sie bereits voarhand ist.",
        "defaultmessagetext": "Standardtext",
        "content-failed-to-parse": "Parsierung von den Inhalt $2 für Modell $1 fehlgeschlohn: $3",
        "search-nonefound": "Zu deiner Suchoonfroch wore ken Ergebnisse gefund.",
        "powersearch-legend": "Erweiterte Such",
        "powersearch-ns": "Such in Noomeräume:",
-       "powersearch-redir": "Weiterleitunge oonzeiche",
        "powersearch-togglelabel": "Wähl aus:",
        "powersearch-toggleall": "All",
        "powersearch-togglenone": "Ken",
        "prefs-emailconfirm-label": "E-Mail-Bestätichung:",
        "youremail": "E-Mail-Adress:",
        "username": "{{GENDER:$1|Benutzernoome}}:",
-       "uid": "{{GENDER:$1|Benutzerkennung}}:",
        "prefs-memberingroups": "{{GENDER:$2|Mitglied}} von der {{PLURAL:$1|Benutzergrupp|Benutzergruppe}}:",
        "prefs-registration": "Oonmeldezeitpunkt:",
        "yourrealname": "Dein Noome wie registriert:",
        "prefs-advancedsearchoptions": "Erweiterte Optione",
        "prefs-advancedwatchlist": "Erweiterte Optione",
        "prefs-displayrc": "Oonzeichoptione",
-       "prefs-displaysearchoptions": "Oonzeichoptione",
        "prefs-displaywatchlist": "Oonzeichoptione",
        "prefs-tokenwatchlist": "Token",
        "prefs-diffs": "Versionsvergleich",
        "action-createpage": "Seite zu erstelle",
        "action-createtalk": "Diskussionsseite erstelle",
        "action-createaccount": "der Benutzerkonto erstelle",
+       "action-history": "die Versionsgeschichte von der Seit oonsiehen",
        "action-minoredit": "die Beoorbeitung als klen markiere",
        "action-move": "die Seit verschiebe",
        "action-move-subpages": "die Seit und zugehöriche Unnerseite verschiebe",
        "uploadstash-refresh": "List von der Dateie aktualisiere",
        "invalid-chunk-offset": "Ungülticher Startpunkt",
        "img-auth-accessdenied": "Zugriff verweichert",
-       "img-auth-nopathinfo": "Die Oongäb PATH_INFO fehlt.\nDer Server ist net dafoar ingerichtet, die Information weiterzugebe.\nSie könnt CGI-gestützt sin und kann dodrum \"img_auth\" (Authentifizierung von dem Dateiuffruf) net unnerstütze.\nSieh ooch https://www.mediawiki.org/wiki/Manual:Image_Authorization (englisch).",
+       "img-auth-nopathinfo": "Die Oongäb PATH_INFO fehlt.\nDer Server ist net dafoar ingerichtet, die Information weiterzugebe.\nSie könnt CGI-gestützt sin und kann dodrum \"img_auth\" (Authentifizierung von dem Dateiuffruf) net unnerstütze.\nSieh ooch https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization (englisch).",
        "img-auth-notindir": "Der gewünschte Paad ist net im konfigurierte Uploadverzeichnis.",
        "img-auth-badtitle": "Aus \"$1\" kann ken gülticher Titel erstellt sin.",
        "img-auth-nologinnWL": "Du bist net oongemeldt und \"$1\" ist net in der weiss List.",
        "pageswithprop-prophidden-binary": "Binäreichenschaftsweart versteckt ($1)",
        "doubleredirects": "Doppelte Weiterleitunge",
        "doubleredirectstext": "Diese Liste enthält Weiterleitungen, die auf Weiterleitungen verlinken.\nJede Zeile enthält Links zur ersten und zweiten Weiterleitung sowie dem Ziel der zweiten Weiterleitung, welches für gewöhnlich die gewünschte Zielseite ist, auf die bereits die erste Weiterleitung zeigen sollte.\n<del>Durchgestrichene</del> Einträge wurden bereits erfolgreich bearbeitet.",
-       "double-redirect-fixed-move": "[[$1]] woard verschub und leitet jetzt noh [[$2]] weiter.",
-       "double-redirect-fixed-maintenance": "Bereinichung von der doppelte Weiterleitung von [[$1]] noh [[$2]].",
+       "double-redirect-fixed-move": "[[$1]] woard verschub. Die Seit woard automatisch aktualisiert und leitet jetzt noh [[$2]] weiter.",
+       "double-redirect-fixed-maintenance": "Automatische Bereinichung von der doppelte Weiterleitung von [[$1]] noh [[$2]] in enem Woortungsufftrooch.",
        "double-redirect-fixer": "RedirectBot",
        "brokenredirects": "Defekte Weiterleitunge",
        "brokenredirectstext": "Die Spezialseit listiert Weiterleitung uff net existierende Seite uff.",
        "log-title-wildcard": "Titel beginnt mit …",
        "showhideselectedlogentries": "Ausgewählte Logbucheinträch oonzeiche/verstecke",
        "allpages": "All Seite",
-       "alphaindexline": "$1 bis $2",
        "nextpage": "Nächste Seit ($1)",
        "prevpage": "Vorhrich Seit ($1)",
        "allpagesfrom": "Seite oonzeiche ab:",
        "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.",
-       "watchmethod-recent": "Üwerprüfung von der letzte Beoorbeitungen für die Beobachtungslist (mit observierte Seite)",
-       "watchmethod-list": "Üwerprüfung von der Beobachtungslist noh letzte Beoorbeitunge",
-       "watchlistcontains": "Dein Beobachtungslist enthält $1 {{PLURAL:$1|Seit|Seite}}.",
-       "iteminvalidname": "Problem mit dem Eintrooch \"$1\", ungültiche Noome.",
        "wlnote2": "Do folliche die Ändrunge von der letzte {{PLURAL:$1|Stund|<strong>$1</strong> Stunne}}. Stand: $2, $3.",
        "wlshowlast": "Zeich die Ännrunge von der letzte $1 Stunde, $2 Tooch orrer $3.",
        "watchlist-options": "Oonzeichoptione",
        "enotif_lastvisited": "All Ännrunge uff en Blick: $1",
        "enotif_lastdiff": "Sieh $1 noh der Ännrung.",
        "enotif_anon_editor": "Anonymer Benutzer $1",
-       "enotif_body": "Hallo $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nZusammerfassung von dem Beoorbeiter/rinne: $PAGESUMMARY $PAGEMINOREDIT\n\nKontakt zu dem Beoorbeiter/rinne:\nE-Mail: $PAGEEDITOR_EMAIL\nWiki: $PAGEEDITOR_WIKI\n\nBei weitrer Aktivität uff der Seit werre dir so lang keh weitre Benochrichtichungs-E-Mails geschickt, bis du die Seit wieder oongemeldt besucht host. Uff dein Beobachtungslist kannst du all Benochrichtichungsmarkierung zusammet zurücksetze.\n\nDein freindliches {{SITENAME}}-Benochrichtichungssystem\n\n--\nUm die Einstellunge der E-Mail-Benochrichtichung oonzupasse, besuch {{canonicalurl:{{#special:Preferences}}}}.\n\nUm die Einstellunge von deiner Beobachtungslist oonzupasse, besuche {{canonicalurl:{{#special:EditWatchlist}}}}.\n\nUm die Seit von deiner Beobachtungslist herunnerzunehme, besuch $UNWATCHURL.\n\nRückmeldunge und weitre Hilfe: {{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Hallo $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nZusammerfassung von dem Beoorbeiter/rinne: $PAGESUMMARY $PAGEMINOREDIT\n\nKontakt zu dem Beoorbeiter/rinne:\nE-Mail: $PAGEEDITOR_EMAIL\nWiki: $PAGEEDITOR_WIKI\n\nBei weitrer Aktivität uff der Seit werre dir so lang keh weitre Benochrichtichungs-E-Mails geschickt, bis du die Seit wieder oongemeldt besucht host. Uff dein Beobachtungslist kannst du all Benochrichtichungsmarkierung zusammet zurücksetze.\n\nDein freindliches {{SITENAME}}-Benochrichtichungssystem\n\n--\nUm die Einstellunge der E-Mail-Benochrichtichung oonzupasse, besuch {{canonicalurl:{{#special:Preferences}}}}.\n\nUm die Einstellunge von deiner Beobachtungslist oonzupasse, besuche {{canonicalurl:{{#special:EditWatchlist}}}}.\n\nUm die Seit von deiner Beobachtungslist herunnerzunehme, besuch $UNWATCHURL.\n\nRückmeldunge und weitre Hilfe: $HELPPAGE",
        "deletepage": "Seite abwische",
        "confirm": "Bestätich",
        "excontent": "Inhalt woor: \"$1\"",
        "blockip": "IP-Adress/Benutzer sperre",
        "blockip-legend": "IP-Adress/Benutzer sperre",
        "blockiptext": "Mit dem Formular sperrst du en IP-Adress orrer en Benutzernoome, so dass von dort ken Ännrunge meh voargenomm sin könne.\nDas sollt nuar erfolche, um Vandalismus zu verhinnre und in Üwereinstimmung mit den [[{{MediaWiki:Policy-url}}|Richtlinie]].\nBittschön tue den Grund für die Sperr gebe.",
-       "ipadressorusername": "IP-Adress orrer Benutzernoome:",
+       "ipaddressorusername": "IP-Adress orrer Benutzernoome:",
        "ipbexpiry": "Sperrdauer:",
        "ipbreason": "Grund:",
        "ipbreason-dropdown": "* Allgemein Sperrgründe\n** Infüchung von falscher Informatione\n** Leere von Seite\n** Massweises infüchung von externer Links\n** Instellung von unsinnicher Inhalte in Seite\n** Ungebührliches Verhalte\n** Missbrauch mit mehrre Benutzerkonte\n** Ungeeichneter Benutzernoome",
        "tooltip-undo": "\"Umwerfe\" Macht ledichlich die en Ännrung rückgängich und zeicht das Resultoot in der Vorschau an, domit in der Zusammenfassungszeil, im Summarium, en Begründung oongeb sin kann.",
        "tooltip-preferences-save": "Einstellunge speichre",
        "tooltip-summary": "Tue en koorz Zusammerfassung ren gewe.",
-       "notacceptable": "Der Wiki-Server kann die Date net für dein Ausgäbgerät uffbereite.",
        "anonymous": "{{PLURAL:$1|Unangemeldeter Benutzer|Unangemeldete Benutzer}} uff {{SITENAME}}",
        "siteuser": "{{SITENAME}}-{{GENDER:$2|Benutzer|Benutzerin|Benutzer}} $1",
        "anonuser": "Anonymer {{SITENAME}}-Benutzer $1",
        "newimages-summary": "Die Spezialseit tut die zuletzt hochgeloodne Dateie oonzeiche.",
        "newimages-legend": "Filter",
        "newimages-label": "Dateinoome (orrer ein Tel davon):",
-       "showhidebots": "(Bots $1)",
        "noimages": "Kene Dateie gefund.",
        "ilsubmit": "Suche",
        "bydate": "noh Datum",
        "autosumm-replace": "Der Seiteinhalt woard dorrich en annre Text ersetzt: \"$1\"",
        "autoredircomment": "Weiterleitung noh [[$1]] erstellt",
        "autosumm-new": "Die Seit woard nei oongeleht: „$1“",
-       "livepreview-loading": "Am loode …",
-       "livepreview-ready": "Lood … Fertich!",
-       "livepreview-failed": "Die Vorschau kann net sofort oongezeicht sin!\nBittschön nutz die reguläre Voarschau.",
-       "livepreview-error": "Verbinnung net möchlich: $1 \"$2\". Bittschön die normale Voarschau benutze.",
        "lag-warn-normal": "Beoorbeitunge von der letzte {{PLURAL:$1|Sekund|$1 Sekunde}} werre in der List noch net oongezeicht.",
        "lag-warn-high": "Uff Grund von hocher Datebankauslaschtung werre die Beoorbeitunge von der letzte {{PLURAL:$1|Sekund|$1 Sekunde}} noch net in der List oongezeicht.",
-       "watchlistedit-numitems": "Deine Beobachtungslist enthält {{PLURAL:$1|ein Introoch|$1 Einträche}}. Die Diskussionsseite woorre dabei net mitgezählt.",
-       "watchlistedit-noitems": "Dein Beobachtungslist ist leer.",
        "watchlistedit-normal-title": "Beobachtungslist beoorbeite",
        "watchlistedit-normal-legend": "Einträch von der Beobachtungslist entferne",
        "watchlistedit-normal-explain": "Das sind die Einträche von deiner Beobachtungslist. Um Einträche zu entferne, markier die Kästcher do newe von den Einträch und mach en Klick am End von der Seit uff \"{{int:Watchlistedit-normal-submit}}\". Du kannst dein Beobachtungslist ooch im [[Special:EditWatchlist/raw|Listeformat beoorbeite]].",
        "compare-invalid-title": "Der oongebne Seitenoome ist ungültich.",
        "compare-title-not-exists": "Der oongebne Seitenoome ist net voarhand.",
        "compare-revision-not-exists": "Die oongebne Version ist net voarhand.",
-       "dberr-header": "Das Wiki hot en Problem",
        "dberr-problems": "Entschuldichung. Die Seit hot momentan technische Schwierichkeite.",
        "dberr-again": "Woort en pooh Minute und versuch dann nochmo zu loode.",
        "dberr-info": "(Kann ken Verbinnung zum Datebank-Server hearstelle: $1)",
        "htmlform-no": "Ne, nein",
        "htmlform-yes": "Jo",
        "htmlform-chosen-placeholder": "Wähl ein Option",
+       "htmlform-cloner-create": "Weitre dozu tun",
+       "htmlform-cloner-delete": "Entferne",
+       "htmlform-cloner-required": "Es ist minschtens en Weart erforderlich.",
        "sqlite-has-fts": "Version $1 mit Unnerstützung für die Volltextsuch",
        "sqlite-no-fts": "Version $1 ohne Unnerstützung für die Volltextsuch",
        "logentry-delete-delete": "$1 {{GENDER:$2|löschte}} Seit $3",
index 7002492..336c9c1 100644 (file)
@@ -10,7 +10,8 @@
                        "Shirayuki",
                        "Tchoř",
                        "Tlustulimu",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Wotkazy podšmórnić:",
        "permalink": "Trajny wotkaz",
        "print": "Ćišćeć",
        "view": "Wobhladać",
+       "view-foreign": "Na $1 sej wobhladać",
        "edit": "wobdźěłać",
        "edit-local": "Lokalny wopis wobdźěłać .",
        "create": "Wutworić",
        "jumptonavigation": "Nawigacija",
        "jumptosearch": "Pytać",
        "view-pool-error": "Wodaj, serwery su we wokomiku přećežene.\nPřewjele wužiwarjow pospytuje sej tutu stronu wobhladać.\nProšu wočakń chwilku, prjedy hač pospytuješ sej tutu stronu hišće raz wobhladać.\n\n$1",
+       "generic-pool-error": "Bohužel su serwery w tutym wokomiku přećežene. Přewjele wužiwarjow pospytuje sej tutu resursu wobhladać. Prošu čakaj chwilku, prjedy hač pospytuješ přistup na tutu resursu měć.",
        "pool-timeout": "Timeout, doniž zawrjenje skónčene njeje.",
        "pool-queuefull": "Poolowa čakanska rynka je połna",
        "pool-errorunknown": "Njeznaty zmylk:",
+       "pool-servererror": "Poolowa ličakowa słužba k dispoziciji njesteji ($1)",
        "aboutsite": "Wo {{GRAMMAR:lokatiw|{{SITENAME}}}}",
        "aboutpage": "Project:Wo",
        "copyright": "Wobsah pod $1 k dispoziciji steji, jeli njeje so hinak podało.",
        "readonly_lag": "Datowa banka bu awtomatisce zawrjena, mjeztym zo pospytuja wotwisne serwery datowych bankow  hłowny serwer docpěć",
        "internalerror": "Znutřkowny zmylk",
        "internalerror_info": "Znutřkowny zmylk: $1",
-       "fileappenderrorread": "\"$1\" njeda so čitać při připowěšenju.",
-       "fileappenderror": "Njeje móžno było \"$1\" k \"$2\" připowěsnyć.",
        "filecopyerror": "Njebě móžno dataju „$1” do „$2” kopěrować.",
        "filerenameerror": "Njebě móžno dataju „$1” do „$2” přemjenować.",
        "filedeleteerror": "Njebě móžno dataju „$1” wušmórnyć.",
        "directorycreateerror": "Zapis „$1“ njeda so wutworić.",
        "filenotfound": "Njebě móžno dataju „$1” namakać.",
-       "fileexistserror": "Njebě móžno do dataje „$1“ pisać: Dataja eksistuje.",
        "unexpected": "Njewočakowana hódnota: \"$1\"=\"$2\".",
        "formerror": "Zmylk: Njebě móžno formular wotesłać.",
        "badarticleerror": "Tuta akcija njeda so na tutej stronje wuwjesć.",
        "userlogin-helplink2": "Pomoc při přizjewjenju",
        "userlogin-loggedin": "Sy hižo jako {{GENDER:$1|$1 přizjewjeny|$1 přizjewjena}}. Wužij slědowacy formular, zo by so jako druhi wužiwar přizjewił.",
        "userlogin-createanother": "Dalše konto załožić",
-       "createacct-join": "Zapodaj deleka swoje informacije.",
-       "createacct-another-join": "Zapodaj deleka informacije noweho konta.",
        "createacct-emailrequired": "E-mejlowa adresa",
        "createacct-emailoptional": "E-mejlowa adresa (opcionalny)",
        "createacct-email-ph": "Zapodaj swoju e-mejlowu adresu",
        "savearticle": "Stronu składować",
        "preview": "Přehlad",
        "showpreview": "Přehlad pokazać",
-       "showlivepreview": "Hnydomny přehlad",
        "showdiff": "Změny pokazać",
        "anoneditwarning": "'''Kedźbu:''' Njejsy přizjewjeny. Twoja IP-adresa budźe so do wersijowych stawiznow strony přijimać.",
        "anonpreviewwarning": "''Njejsy přizjewjeny. Składowanje přenošuje twoju IP-adresu do wobdźěłowanskeje historije tuteje strony.''",
        "edit-gone-missing": "Strona njeje so aktualizować dała.\nZda so, zo je hîžo wušmórnjena.",
        "edit-conflict": "Wobdźěłanski konflikt.",
        "edit-no-change": "Waše wobdźěłanje bu ignorowane, dokelž tekst njebu zm,ěnjeny.",
-       "postedit-confirmation": "Twoja změna je so składowała.",
+       "postedit-confirmation-created": "Tuta strona je so wutworiła.",
+       "postedit-confirmation-restored": "Tuta strona je so wobnowiła.",
+       "postedit-confirmation-saved": "Twoja změna je so składowała.",
        "edit-already-exists": "Njebě móžno nowu stronu wutworić.\nEksistuje hižo.",
        "defaultmessagetext": "Standardny tekst zdźělenki",
        "content-failed-to-parse": "Parsowanje wobsaha $2 za model $1 je so njeporadźiło: $3",
        "search-nonefound": "Njebuchu wuslědki namakane, kotrež naprašowanju wotpowěduja.",
        "powersearch-legend": "Rozšěrjene pytanje",
        "powersearch-ns": "W mjenowych rumach pytać:",
-       "powersearch-redir": "Daleposrědkowanja nalistować",
        "powersearch-togglelabel": "Kontrolować:",
        "powersearch-toggleall": "Wšě",
        "powersearch-togglenone": "Žadyn",
        "prefs-emailconfirm-label": "E-mejlowe wobkrućenje:",
        "youremail": "E-mejl:",
        "username": "Mjeno {{GENDER:$1|wužiwarja|wužiwarki}}:",
-       "uid": "ID {{GENDER:$1|wužiwarja|wužiwarki}}:",
        "prefs-memberingroups": "{{GENDER:$2|Čłon|Čłonka}} {{PLURAL:$1|wužiwarskeje skupiny|wužiwarskeju skupinow|wužiwarskich skupinow}}:",
        "prefs-registration": "Čas registracije:",
        "yourrealname": "Woprawdźite mjeno:",
        "prefs-advancedsearchoptions": "Rozšěrjene opcije",
        "prefs-advancedwatchlist": "Rozšěrjene opcije",
        "prefs-displayrc": "Zwobraznjenske opcije",
-       "prefs-displaysearchoptions": "Zwobraznjenske opcije",
        "prefs-displaywatchlist": "Zwobraznjenske opcije",
        "prefs-tokenwatchlist": "Token",
        "prefs-diffs": "Rozdźěle",
        "action-createpage": "strony wutworić",
        "action-createtalk": "diskusijne strony wutworić",
        "action-createaccount": "wužiwarske konto załožić",
+       "action-history": "historiju tuteje strony pokazać",
        "action-minoredit": "tutu změnu jako snadnu markěrować",
        "action-move": "tutu stronu přesunyć",
        "action-move-subpages": "tutu stronu a jeje podstrony přesunyć",
        "recentchanges-legend-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 $1",
+       "rclistfrom": "Nowe změny pokazać, započinajo z $3 $2",
        "rcshowhideminor": "snadne změny $1",
        "rcshowhideminor-show": "Pokazać",
        "rcshowhideminor-hide": "Schować",
        "uploadstash-refresh": "Lisćinu datajow aktualizować",
        "invalid-chunk-offset": "Njepłaćiwy startowy dypk",
        "img-auth-accessdenied": "Přistup wotpokazany",
-       "img-auth-nopathinfo": "PATH_INFO faluje.\nTwój serwer njeje za to konfigurował, zo by tute informacije dale posrědkował.\nBy móhł na CGI bazować a ani njemóže img_auth podpěrać.\nHlej https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "PATH_INFO faluje.\nTwój serwer njeje za to konfigurował, zo by tute informacije dale posrědkował.\nBy móhł na CGI bazować a ani njemóže img_auth podpěrać.\nHlej https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Požadana šćežka w konfigurowanym nahraćowym zapisu njeje.",
        "img-auth-badtitle": "Njeje móžno z \"$1\" płaćiwy titul tworić.",
        "img-auth-nologinnWL": "Njejsy přizjewjeny a \"$1\" w běłej lisćinje njeje.",
        "pageswithprop-prophidden-binary": "binarna kajkostna hódnota schowana ($1)",
        "doubleredirects": "Dwójne daleposrědkowanja",
        "doubleredirectstext": "Tuta strona nalistuje strony, kotrež k druhim daleposrědkowanskim stronam dale posrědkuja.\nKóžda rjadka wobsahuje wotkazy k prěnjemu a druhemu daleposrědkowanju kaž tež cil druheho daleposrědkowanja, kotryž je zwjetša  \"woprawdźita\" cilowa strona, na kotruž prěnje daleposrědkowanje měło pokazać. <del>Přešmórnjene</del> zapiski su hižo sčinjene.",
-       "double-redirect-fixed-move": "[[$1]] bu přesunjeny, je nětko daleposrědkowanje do [[$2]]",
-       "double-redirect-fixed-maintenance": "Dwójne dalesposrědkowanje wot [[$1]] do [[$2]] so porjedźuje",
+       "double-redirect-fixed-move": "[[$1]] bu přesunjeny.\nJe so awtomatisce zaktualizował a posrědkuje so nětko do [[$2]].",
+       "double-redirect-fixed-maintenance": "Dwójne dalesposrědkowanje wot [[$1]] do [[$2]] so awtomatisce w wothladowanskim nadawku porjedźuje.",
        "double-redirect-fixer": "Porjedźer daleposrědkowanjow",
        "brokenredirects": "Skóncowane daleposrědkowanja",
        "brokenredirectstext": "Slědowace daleposrědkowanja wotkazuja na njeeksistowace strony:",
        "log-title-wildcard": "Titul započina so z …",
        "showhideselectedlogentries": "Wubrane protokolowe zapiski pokazać/schować",
        "allpages": "Wšě nastawki",
-       "alphaindexline": "$1 do $2",
        "nextpage": "přichodna strona ($1)",
        "prevpage": "předchadna strona ($1)",
        "allpagesfrom": "Strony pokazać, započinajo z:",
        "listgrouprights-removegroup-self": "Móže {{PLURAL:$2|skupinu|skupinje|skupiny|skupinow}} ze swójskeho konta wotstronić: $1",
        "listgrouprights-addgroup-self-all": "Móže wšě skupiny swójskemu kontu přidać",
        "listgrouprights-removegroup-self-all": "Móže wšě skupiny ze swójskeho konta wotstronić",
+       "listgrouprights-namespaceprotection-header": "Wobmjezowanja mjenoweho ruma",
+       "listgrouprights-namespaceprotection-namespace": "Mjenowy rum",
+       "listgrouprights-namespaceprotection-restrictedto": "Prawa, kotrež wužiwarjej wobdźěłowanje dowoleja",
+       "trackingcategories": "Slědowanske kategorije",
+       "trackingcategories-summary": "Tuta strona nalistuje slědowanske kategorije, kotrež so awtomatisce přez softwaru MediaWiki zadźěłuja. Jich mjena hodźa so z pomocu relewantnych systemowych zdźělenkow w mjenowym rumje {{ns:8}} změnić.",
+       "trackingcategories-msg": "Slědowanska kategorija",
+       "trackingcategories-name": "Mjeno zdźělenki",
+       "trackingcategories-desc": "Kriterije za zapřijimanje kategorije",
+       "noindex-category-desc": "Tuta strona so přez boćiki njeindeksuje, dokelž ma magiske słowo <code><nowiki>__NOINDEX__</nowiki></code> na sebi a je w mjenowym rumje, hdźež chorhojčka je dowolena.",
+       "index-category-desc": "Strona je <code><nowiki>__INDEX__</nowiki></code> na sebi (a je w mjenowym rumje, hdźež ta chorhojčak je dowolena), a tohodla so přez boćiki indeksuje, hdźež so to normalnje njestawa.",
+       "post-expand-template-inclusion-category-desc": "Po ekspandowanju wšěch předłohow, je strona wjetša hač <code>$wgMaxArticleSize</code>, tohodla njejsu so někotre předłohi ekspandowali.",
+       "post-expand-template-argument-category-desc": "Po ekspandowanju předłohoweho argumenta (něšto w trójnych kwaklatych spinkach kaž <code>{{{přikład}}}</code>), strona je wjetša hač <code>$wgMaxArticleSize</code>.",
+       "expensive-parserfunction-category-desc": "Přewjele naročnych parserowych funkcijow (kaž <code>#ifexist</code>) je so do strony zasadźiło. Hlej [http://www.mediawiki.org/wiki/Special:MyLanguageManual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "broken-file-category-desc": "Kategorija je so přidała, jeli strona wobsahuje njepłaćiwy datajowy wotkaz (wotkaz za zasadźenje dataje, jeli dataja njeeksistuje).",
+       "hidden-category-category-desc": "To je kategorija z <code><nowiki>__HIDDENCAT__</nowiki></code>, kotrež standardnje jeje zwobraznjenju w kašćiku kategorijowych wotkazow na stronje zadźěwa.",
+       "trackingcategories-nodesc": "Žane wopisanje k dispoziciji",
+       "trackingcategories-disabled": "Kategorija je znjemóžnjena",
        "mailnologin": "Njejsy přizjewjeny.",
        "mailnologintext": "Dyrbiš [[Special:UserLogin|přizjewjeny]] być a płaćiwu e-mejlowu adresu w swojich [[Special:Preferences|nastajenjach]] měć, zo by druhim wužiwarjam mejlki pósłać móhł.",
        "emailuser": "Wužiwarjej mejlku pósłać",
        "unwatchthispage": "wobkedźbowanje skónčić",
        "notanarticle": "njeje nastawk",
        "notvisiblerev": "Wersija bu wušmórnjena",
-       "watchlist-details": "{{PLURAL:$1|$1 wobkedźbowana strona|$1 wobkedźbowanej stronje|$1 wobkedźbowane strony|$1 wobkedźbowanych stronow}}, diskusijne strony wuwzate.",
+       "watchlist-details": "{{PLURAL:$1|$1 wobkedźbowana strona|$1 wobkedźbowanej stronje|$1 wobkedźbowane strony|$1 wobkedźbowanych stronow}}, bjeztoho zo so diskusijne strony dźělene liča.",
        "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.",
-       "watchmethod-recent": "Aktualne změny za wobkedźbowane strony přepruwować",
-       "watchmethod-list": "Wobkedźbowanki za aktualnymi změnami přepruwować",
-       "watchlistcontains": "Maš $1 {{PLURAL:$1|stronu|stronje|strony|stronow}} w swojich wobkedźbowankach.",
-       "iteminvalidname": "Problem ze zapiskom „$1“, njepłaćiwe mjeno.",
        "wlnote2": "Slěduja změny {{PLURAL:$1|zańdźeneje hodźiny|zańdźeneju <strong>$1</strong> hodźinow|zańdźenych <strong>$1</strong> hodźin}} Staw: $2, $3.",
        "wlshowlast": "Poslednje $1 hodź. - $2 dnjow - $3 pokazać",
        "watchlist-options": "Opcije wobkedźbowankow",
        "enotif_lastvisited": "Hlej $1 za wšě změny po twojim poslednim wopyće.",
        "enotif_lastdiff": "Hlej $1 za tutu změnu.",
        "enotif_anon_editor": "anonymny wužiwar $1",
-       "enotif_body": "Luby $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\n\nZjeće wobdźěłarja: $PAGESUMMARY $PAGEMINOREDIT\n\nStaj so z wobdźěłarjom do zwiska:\ne-mejl: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nNjebudu žane druhe zdźělenki w padźe dalšeje aktiwity, chibazo wopytaš tutu stronu. mjeztym zo sy přizjewjeny.\nMóžeš tež zdźělenske marki za wšě swoje wobkedźbowane strony we swojich wobkedźbowankach wróćo stajić.\n\nTwój přećelny zdźělenski system {{GRAMMAR:genitiw|{{SITENAME}}}}\n\n--\nZo by swoje nastajenja za e-mejlowe zdźělenja změnił, wopytaj\n{{canonicalurl:{{#special:Preferences}}}}\n\nZo by nastajenja swojich wobkedźbowankow změnił, wopytaj\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nZo by stronu ze swojich wobkedźbowankow zhašał, wopytaj\n$UNWATCHURL\n\n\nWotmołwy a dalša pomoc:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Luby $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\n\nZjeće wobdźěłarja: $PAGESUMMARY $PAGEMINOREDIT\n\nStaj so z wobdźěłarjom do zwiska:\ne-mejl: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nNjebudu žane druhe zdźělenki w padźe dalšeje aktiwity, chibazo wopytaš tutu stronu. mjeztym zo sy přizjewjeny.\nMóžeš tež zdźělenske marki za wšě swoje wobkedźbowane strony we swojich wobkedźbowankach wróćo stajić.\n\nTwój přećelny zdźělenski system {{GRAMMAR:genitiw|{{SITENAME}}}}\n\n--\nZo by swoje nastajenja za e-mejlowe zdźělenja změnił, wopytaj\n{{canonicalurl:{{#special:Preferences}}}}\n\nZo by nastajenja swojich wobkedźbowankow změnił, wopytaj\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nZo by stronu ze swojich wobkedźbowankow zhašał, wopytaj\n$UNWATCHURL\n\n\nWotmołwy a dalša pomoc:\n$HELPPAGE",
        "created": "wutworjena",
        "changed": "změnjena",
        "deletepage": "Stronu zhašeć",
        "contributions-title": "Wužiwarske přinoški wot „$1“",
        "mycontris": "Přinoški",
        "contribsub2": "Za {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "Wužiwarske konto \"$1\" njeje zregistrowane.",
        "nocontribs": "Žane změny, kotrež podatym kriterijam wotpowěduja.",
        "uctop": "(aktualny)",
        "month": "wot měsaca (a do toho):",
        "blockip": "Wužiwarja zablokować",
        "blockip-legend": "Wužiwarja blokować",
        "blockiptext": "Wužij slědowacy formular deleka, zo by pisanski přistup za podatu IP-adresu abo wužiwarske mjeno blokował. To měło so jenož stać, zo by wandalizmej zadźěwało a woptpowědujo [[{{MediaWiki:Policy-url}}|zasadam]]. Zapodaj deleka přičinu (na př. citujo wosebite strony, kotrež běchu z woporom wandalizma).",
-       "ipadressorusername": "IP-adresa abo wužiwarske mjeno",
+       "ipaddressorusername": "IP-adresa abo wužiwarske mjeno",
        "ipbexpiry": "Spadnjenje",
        "ipbreason": "Přičina:",
        "ipbreason-dropdown": "*powšitkowne přičiny\n** wandalizm\n** wutworjenje njezmyslnych stronow\n** linkspam\n** wobobinske nadběhi\n*specifiske přičiny\n** njepřihódne wužiwarske mjeno\n** znowapřizjewjenje na přeco zablokowaneho wužiwarja\n** proksy, wandalizma jednotliwych wužiwarjow dla dołhodobnje zablokowany",
        "monobook.css": "/* CSS wobdźěłać, zo by so skin „monobook” za wšěčh wužiwarjow tutoho skina priměrił */",
        "common.js": "/* Kóždy JavaScript tu so za wšěch wužiwarjow při kóždym zwobraznjenju někajkeje strony začita. */",
        "monobook.js": "/* Slědowacy JavaScript začita so za wužiwarjow, kotřiž šat MonoBook wužiwaja */",
-       "notacceptable": "Serwer wikija njemóže daty we formaće poskićić, kotryž twój wudawanski nastroj móže čitać.",
        "anonymous": "{{PLURAL:$1|Anonymny wužiwar|Anonymnaj wužiwarjej|Anonymni wužiwarjo|Anonymni wužiwarjo}} we {{GRAMMAR:lokatiw|{{SITENAME}}}}",
        "siteuser": "wužiwarja $1 na {{GRAMMAR:lokatiw|{{SITENAME}}}}",
        "anonuser": "anonymny wužiwar $1 na {{GRAMMAR:lokatiw|{{SITENAME}}}}",
        "newimages-summary": "Tuta specialna strona naliči aktualnje nahrate wobrazy a druhe dataje.",
        "newimages-legend": "Filter",
        "newimages-label": "Datajowe mjeno (abo dźěl z njeho):",
-       "showhidebots": "(bots $1)",
        "noimages": "Žane dataje.",
        "ilsubmit": "Pytać",
        "bydate": "datumje",
        "autoredircomment": "posrědkuju k stronje „[[$1]]”",
        "autosumm-new": "Wutwori stronu z '$1'",
        "size-kilobytes": "$1 kB",
-       "livepreview-loading": "Čita so…",
-       "livepreview-ready": "Začitanje… Hotowe!",
-       "livepreview-failed": "Dynamiski přehlad njemóžno!\nSpytaj normalny přehlad.",
-       "livepreview-error": "Zwisk njemóžno: $1 \"$2\"\nSpytaj normalny přehlad.",
        "lag-warn-normal": "Změny {{PLURAL:$1|zašłeje $1 sekundy|zašłeju $1 sekundow|zašłych $1 sekundow|zašłych $1 sekundow}} so w tutej lisćinje hišće njezwobraznjeja.",
        "lag-warn-high": "Wućeženja datoweje banki dla so změny {{PLURAL:$1|zašłeje $1 sekundy|zašłeje $1 sekundow|zašłych $1 sekundow|zašłych $1 sekundow}} w tutej lisćinje hišće njepokazuja.",
-       "watchlistedit-numitems": "Twoje wobkedźbowanki wobsahuja {{PLURAL:$1|1 zapisk|$1 zapiskaj|$1 zapiski|$1 zapiskow}}, diskusijne strony njejsu ličene.",
-       "watchlistedit-noitems": "Twoje wobkedźbowanki su prózdne.",
        "watchlistedit-normal-title": "Wobkedźbowanki wobdźěłać",
        "watchlistedit-normal-legend": "Zapiski z wobkedźbowankow wotstronić",
        "watchlistedit-normal-explain": "Tu su zapiski z twojich wobkedźbowankow. Zo by zapisk wušmórnył, markěruj kašćik pódla njeho a klikń na {{int:Watchlistedit-normal-submit}}\". Móžeš tež swoje wobkedźbowanki [[Special:EditWatchlist/raw|w lisćinowym formaće wobdźěłać]].",
        "compare-invalid-title": "Titul, kotryž sy podał, je njepłaćiwy.",
        "compare-title-not-exists": "Titul, kotryž sy podał, njeeksistuje.",
        "compare-revision-not-exists": "Wersija, kotruž sy podał, njeeksistuje.",
-       "dberr-header": "Tutón wiki ma problem",
        "dberr-problems": "Wodaj! Tute sydło ma techniske ćežkosće.",
        "dberr-again": "Počakń někotre mjeńšiny a zaktualizuj stronu.",
        "dberr-info": "(Njeje móžno ze serwerom datoweje banki zwjazać: $1)",
        "htmlform-no": "Ně",
        "htmlform-yes": "Haj",
        "htmlform-chosen-placeholder": "Wubjer móžnosć",
+       "htmlform-cloner-create": "Wjace přidać",
+       "htmlform-cloner-delete": "Wotstronić",
+       "htmlform-cloner-required": "Znjamjeńša jedna hódnota je trěbna.",
        "sqlite-has-fts": "$1 połnotekstowe pytanje podpěruje.",
        "sqlite-no-fts": "$1 połnotekstowe pytanje njepodpěruje",
        "logentry-delete-delete": "$1 je stronu $3 {{GENDER:$1|zhašał|zhašała}}",
index 2b9db38..172e3a4 100644 (file)
@@ -5,7 +5,8 @@
                        "Internoob",
                        "Jvm",
                        "Masterches",
-                       "Urhixidur"
+                       "Urhixidur",
+                       "아라"
                ]
        },
        "tog-underline": "Souliyen lyen yo :",
@@ -18,7 +19,6 @@
        "tog-showtoolbar": "Montre meni modifikasyon an (sa mande JavaScript)",
        "tog-editondblclick": "Klike de fwa pou modifye yon paj (sa mande JavaScript)",
        "tog-editsectiononrightclick": "Pemèt modifye yon seksyon lè ou klike a dwat sou tit seksyon an (sa mande JavaScript)",
-       "tog-rememberpassword": "Sonje mopas mwen nan òdinatè sa (pou $1 {{PLURAL:$1|jou|jou}} maximum)",
        "tog-watchcreations": "Mete paj mwen kreye yo nan lis swivi mwen.",
        "tog-watchdefault": "Mete paj mwen edite yo nan lis swivi mwen",
        "tog-watchmoves": "Mete paj mwen deplase yo nan lis swivi mwen",
        "readonly_lag": "Bazdone a bloke otomatikman pandan lòt sèvè segondè yo ap travay pou bay lanmen nan sèvè prensipal la.",
        "internalerror": "Erè nan sistèm la.",
        "internalerror_info": "Erè nan sistèm la : $1",
-       "fileappenderrorread": "Pa kapab li $1 pandan n ap ajoute sou do.",
-       "fileappenderror": "Pa kapab ajoute « $1 » sou do « $2 ».",
        "filecopyerror": "Nou pa kapab kopye fichye  « $1 » nan « $2 ».",
        "filerenameerror": "Nou pa kapab bay lòt non « $2 » pou fichye « $1 ».",
        "filedeleteerror": "Nou pa kapab efase fichye « $1 ».",
        "directorycreateerror": "Nou pa kapab kreye dosye « $1 ».",
        "filenotfound": "Nou pa kapab jwenn fichye « $1 ».",
-       "fileexistserror": "Nou pa kapab ekri nan dosye « $1 » : fichye a egziste deja",
        "unexpected": "Valè sa pa koresponn ak sa nou genyen nan sistèm an : « $1 » = « $2 ».",
        "formerror": "Erè : nou pa kapab anrejistre fòmilè sa",
        "badarticleerror": "Ou pa kapab fè aksyon sa sou paj sa.",
        "savearticle": "Anrejistre",
        "preview": "Gade pou wè",
        "showpreview": "Gade pou wè",
-       "showlivepreview": "Gade pou wè (Kout je rapid)",
        "showdiff": "Montre chanjman yo",
        "anoneditwarning": "'''Pòte atansyon :''' ou pa konekte nan sistèm nan. Adrès IP ou a ap anrejistre nan istorik paj sa a.",
        "anonpreviewwarning": "''Ou pa konekte.  Anrejistre ap kenbe adrès IP ou a nan istorik paj sa a.''",
        "search-interwiki-more": "(plis)",
        "powersearch-legend": "Fouye fon",
        "powersearch-ns": "Chache nan espas non sa yo:",
-       "powersearch-redir": "Montre redireksyon yo",
        "preferences": "Preferans yo",
        "mypreferences": "Preferans mwen yo",
        "skin-preview": "Voye kout je",
        "recentchanges-legend": "Opsyon pou modifikasyon ki fèk fèt",
        "recentchanges-feed-description": "Swiv dènye modifikasyon pou wiki sa a nan fil sa a (RSS,Atom...)",
        "rcnotefrom": "Men modifikasyon yo ki fèt depi '''$2''' ('''$1''' dènye).",
-       "rclistfrom": "Afiche nouvo modifikasyon yo depi $1.",
+       "rclistfrom": "Afiche nouvo modifikasyon yo depi $3 $2",
        "rcshowhideminor": "$1 modifiksayon yo ki tou piti",
        "rcshowhidebots": "$1 wobo",
        "rcshowhideliu": "$1 itilizatè ki konekte",
index 1069636..3267546 100644 (file)
@@ -32,7 +32,8 @@
                        "Tacsipacsi",
                        "Terik",
                        "Tgr",
-                       "Xbspiro"
+                       "Xbspiro",
+                       "아라"
                ]
        },
        "tog-underline": "Hivatkozások aláhúzása:",
        "readonly_lag": "Az adatbázis automatikusan le lett zárva, amíg a mellékkiszolgálók utolérik a főkiszolgálót.",
        "internalerror": "Belső hiba",
        "internalerror_info": "Belső hiba: $1",
-       "fileappenderrorread": "A(z) „$1” nem olvasható hozzáírás közben.",
-       "fileappenderror": "Nem sikerült hozzáfűzni a(z) „$1” fájlt a(z) „$2” fájlhoz.",
        "filecopyerror": "Nem tudtam átmásolni a(z) „$1” fájlt „$2” névre.",
        "filerenameerror": "Nem tudtam átnevezni a(z) „$1” fájlt „$2” névre.",
        "filedeleteerror": "Nem tudtam törölni a(z) „$1” fájlt.",
        "directorycreateerror": "Nem tudtam létrehozni a(z) „$1” könyvtárat.",
        "filenotfound": "A(z) „$1” fájl nem található.",
-       "fileexistserror": "Nem tudtam írni a(z) „$1” fájlba: a fájl már létezik",
        "unexpected": "Váratlan érték: „$1”=„$2”.",
        "formerror": "Hiba: nem tudom elküldeni az űrlapot",
        "badarticleerror": "Ez a tevékenység nem végezhető el ezen a lapon.",
        "gotaccountlink": "Bejelentkezés",
        "userlogin-resetlink": "Elfelejtetted a bejelentkezési adataidat?",
        "userlogin-resetpassword-link": "Elfelejtetted a jelszavad?",
+       "userlogin-helplink2": "Segítség a bejelentkezéshez",
        "userlogin-loggedin": "Már be vagy jelentkezve mint {{GENDER:$1|$1}}. Ha más néven akarsz belépni, alább megteheted.",
        "userlogin-createanother": "Felhasználói fiók létrehozása",
-       "createacct-join": "Add meg az alábbi információkat.",
-       "createacct-another-join": "Add meg az új fiók adatait alább.",
        "createacct-emailrequired": "E-mail cím",
        "createacct-emailoptional": "E-mail cím (opcionális)",
        "createacct-email-ph": "Add meg e-mail címed",
        "createacct-captcha": "Biztonsági ellenőrzés",
        "createacct-imgcaptcha-ph": "Írd be a szöveget, amit fent látsz",
        "createacct-submit": "Felhasználói fiók létrehozása",
-       "createacct-another-submit": "Újabb felhasználó létrehozása",
+       "createacct-another-submit": "Újabb felhasználói fiók létrehozása",
        "createacct-benefit-heading": "A(z) {{SITENAME}}-t hozzád hasonló emberek készítik.",
        "createacct-benefit-body1": "{{PLURAL:$1|szerkesztés|szerkesztés}}",
        "createacct-benefit-body2": "{{PLURAL:$1|lap|lap}}",
        "resetpass-abort-generic": "A jelszómódosítást megszakította egy kiterjesztés.",
        "resetpass-expired": "A jelszavad lejárt. Adjál meg egy új jelszót a bejelentkezéshez!",
        "resetpass-expired-soft": "A jelszavad lejárt, ezért újat kell beállítanod. Válassz most egy új jelszót, vagy kattints a {{int:resetpass-submit-cancel}} gombra, ha később akarod csak beállítani.",
+       "resetpass-validity-soft": "Adj meg egy új jelszót most, vagy kattints a \"{{int:resetpass-submit-cancel}}\" gombra, ha később akarod megadni.",
        "passwordreset": "Jelszó törlése",
        "passwordreset-text-one": "A jelszavad alaphelyzetbe á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.}}",
        "savearticle": "Lap mentése",
        "preview": "Előnézet",
        "showpreview": "Előnézet megtekintése",
-       "showlivepreview": "Élő előnézet",
        "showdiff": "Változtatások megtekintése",
        "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.''",
        "edit-gone-missing": "Nem lehet frissíteni a lapot.\nÚgy tűnik, hogy törölve lett.",
        "edit-conflict": "Szerkesztési ütközés.",
        "edit-no-change": "A szerkesztésed figyelmen kívül lett hagyva, mivel nem változtattál a lap szövegén.",
-       "postedit-confirmation": "A szerkesztésedet elmentettük.",
+       "postedit-confirmation-saved": "A szerkesztésedet elmentettük.",
        "edit-already-exists": "Az új lap nem készíthető el.\nMár létezik.",
        "defaultmessagetext": "Alapértelmezett szöveg",
        "content-failed-to-parse": "Hiba történt a $2 tartalom $1 modellre történő konvertálása során: $3",
        "editundo": "visszavonás",
        "diff-empty": "(Nincs különbség)",
        "diff-multi-sameuser": "({{PLURAL:$1|Egy közbenső módosítás|$1 közbenső módosítás}} ugyanattól a szerkesztőtől nincs mutatva)",
+       "diff-multi-otherusers": "({{PLURAL:$1|Egy közbenső módosítás|$1 közbenső módosítás}}, amit {{PLURAL:$2|egy másik szerkesztő végzett|$2 másik szerkesztő végzett}}, nincs mutatva)",
        "diff-multi-manyusers": "({{PLURAL:$1|Egy közbeeső változat|$1 közbeeső változat}} nincs mutatva, amit $2 szerkesztő módosított)",
        "difference-missing-revision": "A(z) \"{{PAGENAME}}\" nevű oldal #$1 $2 változata nem létezik.\n\nEzt általában egy elavult, törölt oldalra mutató laptörténeti hivatkozás használata okozza. Részletek a [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} törlési naplóban] találhatóak.",
        "searchresults": "A keresés eredménye",
        "search-section": "($1 szakasz)",
        "search-suggest": "Keresési javaslat: $1",
        "search-interwiki-caption": "Társlapok",
-       "search-interwiki-default": "$1 találat",
+       "search-interwiki-default": "$1 találatok:",
        "search-interwiki-more": "(több)",
        "search-relatedarticle": "Kapcsolódó",
        "searcheverything-enable": "Keresés az összes névtérben",
        "search-nonefound": "Nincs egyezés a megadott szöveggel.",
        "powersearch-legend": "Részletes keresés",
        "powersearch-ns": "Névterek:",
-       "powersearch-redir": "Átirányítások megjelenítése",
        "powersearch-togglelabel": "Megjelölés:",
        "powersearch-toggleall": "Mind",
        "powersearch-togglenone": "Egyik sem",
        "prefs-emailconfirm-label": "E-mail cím megerősítése:",
        "youremail": "Az e-mail címed:",
        "username": "{{GENDER:$1|Szerkesztőnév}}:",
-       "uid": "{{GENDER:$1|Azonosító}}:",
        "prefs-memberingroups": "{{GENDER:$2|{{PLURAL:$1|Csoporttagság|Csoporttagságok}}}}:",
        "prefs-registration": "Regisztráció ideje:",
        "yourrealname": "Valódi neved:",
        "prefs-advancedsearchoptions": "Haladó beállítások",
        "prefs-advancedwatchlist": "Haladó beállítások",
        "prefs-displayrc": "Megjelenítési beállítások",
-       "prefs-displaysearchoptions": "Megjelenítési beállítások",
        "prefs-displaywatchlist": "Megjelenítési beállítások",
        "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.",
        "recentchanges-legend-heading": "Jelmagyarázat:",
        "recentchanges-legend-newpage": "(lásd még: [[Special:NewPages|Új lapok]])",
        "rcnotefrom": "Alább a <b>$2</b> óta történt változtatások láthatóak (legfeljebb <b>$1</b> db).",
-       "rclistfrom": "$1 után történt változtatások megtekintése",
+       "rclistfrom": "$3 $2 után történt változtatások megtekintése",
        "rcshowhideminor": "apró szerkesztések $1",
        "rcshowhideminor-show": "megjelenítése",
        "rcshowhideminor-hide": "elrejtése",
        "uploadstash-refresh": "Fájlok listájának frissítése",
        "invalid-chunk-offset": "Érvénytelen darab eltolás",
        "img-auth-accessdenied": "Hozzáférés megtagadva",
-       "img-auth-nopathinfo": "Hiányzó PATH_INFO.\nA szerver nincs beállítva, hogy továbbítsa ezt az információt.\nLehet, hogy CGI-alapú, és nem támogatja az img_auth-ot.\nLásd https://www.mediawiki.org/wiki/Manual:Image_Authorization!",
+       "img-auth-nopathinfo": "Hiányzó PATH_INFO.\nA szerver nincs beállítva, hogy továbbítsa ezt az információt.\nLehet, hogy CGI-alapú, és nem támogatja az img_auth-ot.\nLásd https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization!",
        "img-auth-notindir": "A kért elérési út nincs a beállított feltöltési könyvtárban.",
        "img-auth-badtitle": "Nem sikerült érvényes címet készíteni a(z) „$1” szövegből.",
        "img-auth-nologinnWL": "Nem vagy bejelentkezve, és a(z) „$1” nincs az engedélyezési listán.",
        "log-title-wildcard": "Így kezdődő címek keresése",
        "showhideselectedlogentries": "Kijelölt napló bejegyzések megjelenítése/elrejtése",
        "allpages": "Az összes lap listája",
-       "alphaindexline": "$1 – $2",
        "nextpage": "Következő lap ($1)",
        "prevpage": "Előző lap ($1)",
        "allpagesfrom": "Lapok listázása a következő címtől kezdve:",
        "watchlist-details": "A vitalapokon kívül {{PLURAL:$1|egy|$1}} lap van a figyelőlistádon.",
        "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.",
-       "watchmethod-recent": "a figyelt lapokon belüli legfrissebb szerkesztések",
-       "watchmethod-list": "a legfrissebb szerkesztésekben található figyelt lapok",
-       "watchlistcontains": "A figyelőlistádon {{PLURAL:$1|egy|$1}} lap szerepel.",
-       "iteminvalidname": "Probléma a '$1' elemmel: érvénytelen név...",
        "wlnote2": "Alább az utolsó {{PLURAL:$1| <strong> $1 </strong> óra}} változásai láthatók. A lista frissítésének ideje  $2 $3",
        "wlshowlast": "Az elmúlt $1 órában | $2 napon | $3 történt változtatások legyenek láthatóak",
        "watchlist-options": "A figyelőlista beállításai",
        "enotif_lastvisited": "Lásd a $1 lapot az utolsó látogatásod óta történt változtatásokért.",
        "enotif_lastdiff": "Lásd a $1 lapot ezen változtatás megtekintéséhez.",
        "enotif_anon_editor": "$1 névtelen felhasználó",
-       "enotif_body": "Kedves $WATCHINGUSERNAME!\n\n$PAGEINTRO $NEWPAGE\n\nA szerkesztési összefoglaló a következő volt: $PAGESUMMARY $PAGEMINOREDIT\n\nA szerkesztő elérhetősége:\ne-mail küldése: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nAmíg nem keresed fel az oldalt bejelentkezve, addig nem érkeznek újabb értesítések az oldal változásaival kapcsolatban. A figyelőlistádon is beállíthatod, hogy újból kapj értesítéseket, az összes lap után.\n\nBaráti üdvözlettel: a(z) {{SITENAME}} értesítő rendszere\n\n--\nAz e-mail értesítéseid módosításához keresd fel a \n{{canonicalurl:{{#special:Preferences}}}} címet\n\nA figyelőlistád módosításához keresd fel a\n{{canonicalurl:{{#special:EditWatchlist}}}} címet\n\nA lap figyelőlistádról való törléséhez keresd fel a\n$UNWATCHURL címet\n\nVisszajelzés és további segítség:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Kedves $WATCHINGUSERNAME!\n\n$PAGEINTRO $NEWPAGE\n\nA szerkesztési összefoglaló a következő volt: $PAGESUMMARY $PAGEMINOREDIT\n\nA szerkesztő elérhetősége:\ne-mail küldése: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nAmíg nem keresed fel az oldalt bejelentkezve, addig nem érkeznek újabb értesítések az oldal változásaival kapcsolatban. A figyelőlistádon is beállíthatod, hogy újból kapj értesítéseket, az összes lap után.\n\nBaráti üdvözlettel: a(z) {{SITENAME}} értesítő rendszere\n\n--\nAz e-mail értesítéseid módosításához keresd fel a \n{{canonicalurl:{{#special:Preferences}}}} címet\n\nA figyelőlistád módosításához keresd fel a\n{{canonicalurl:{{#special:EditWatchlist}}}} címet\n\nA lap figyelőlistádról való törléséhez keresd fel a\n$UNWATCHURL címet\n\nVisszajelzés és további segítség:\n$HELPPAGE",
        "created": "létrehozta",
        "changed": "megváltoztatta",
        "deletepage": "Lap törlése",
        "blockip": "Blokkolás",
        "blockip-legend": "Felhasználó blokkolása",
        "blockiptext": "Az alábbi űrlap segítségével megvonhatod egy szerkesztő vagy IP-cím szerkesztési jogait.\nÜgyelj rá, hogy az intézkedésed mindig legyen tekintettel a vonatkozó [[{{MediaWiki:Policy-url}}|irányelvekre]].\nAdd meg a blokkolás okát is (például idézd a blokkolandó személy által vandalizált lapokat).",
-       "ipadressorusername": "IP-cím vagy felhasználói név",
+       "ipaddressorusername": "IP-cím vagy felhasználói név",
        "ipbexpiry": "Lejárat:",
        "ipbreason": "Ok:",
        "ipbreason-dropdown": "*Gyakori blokkolási okok\n** Téves információ beírása\n** Lapok tartalmának eltávolítása\n** Spammelgetés, reklámlinkek tömködése a lapokba\n** Értelmetlen megjegyzések, halandzsa beillesztése a cikkekbe\n** Megfélemlítő viselkedés, zaklatás\n** Több szerkesztői fiókkal való visszaélés\n** Elfogadhatatlan azonosító",
        "group-bot.js": "/* Az ide elhelyezett JavaScript csak botoknak töltődik be */",
        "group-sysop.js": "/* Az ide elhelyezett JavaScript csak adminisztrátoroknak töltődik be */",
        "group-bureaucrat.js": "/* Az ide elhelyezett JavaScript csak bürokratáknak töltődik be */",
-       "notacceptable": "A wiki kiszolgálója nem tudja olyan formátumban biztosítani az adatokat, amit a kliens olvasni tud.",
        "anonymous": "Névtelen {{SITENAME}}-{{PLURAL:$1|szerkesztő|szerkesztők}}",
        "siteuser": "$1 {{SITENAME}}-felhasználó",
        "anonuser": "$1 névtelen {{SITENAME}}-felhasználó",
        "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):",
-       "showhidebots": "(botok szerkesztéseinek $1)",
        "noimages": "Nem tekinthető meg semmi.",
        "ilsubmit": "Keresés",
        "bydate": "dátum szerint",
        "autosumm-replace": "A lap tartalmának cseréje erre: $1",
        "autoredircomment": "Átirányítás ide: [[$1]]",
        "autosumm-new": "Új oldal, tartalma: „$1”",
-       "livepreview-loading": "Betöltés…",
-       "livepreview-ready": "Betöltés… Kész!",
-       "livepreview-failed": "Az élő előnézet nem sikerült! Próbálkozz a normál előnézettel.",
-       "livepreview-error": "A csatlakozás nem sikerült: $1 \"$2\". Próbálkozz a normál előnézettel.",
        "lag-warn-normal": "{{PLURAL:$1|Az egy|A(z) $1}} másodpercnél frissebb szerkesztések nem biztos, hogy megjelennek ezen a listán.",
        "lag-warn-high": "Az adatbázisszerver túlterheltsége miatt {{PLURAL:$1|az egy|a(z) $1}} másodpercnél frissebb változtatások nem biztos, hogy megjelennek ezen a listán.",
-       "watchlistedit-numitems": "A figyelőlistádon {{PLURAL:$1|egy|$1}} cím szerepel (a vitalapok nélkül).",
-       "watchlistedit-noitems": "A figyelőlistád üres.",
        "watchlistedit-normal-title": "A figyelőlista szerkesztése",
        "watchlistedit-normal-legend": "Lapok eltávolítása a figyelőlistáról",
        "watchlistedit-normal-explain": "A figyelőlistádra felvett lapok címei alább láthatóak.\nHa el szeretnél távolítani egy címet, pipáld ki a mellette található jelölőnégyzetet, majd kattints „{{int:Watchlistedit-normal-submit}}” gombra.\nLehetőséged van a [[Special:EditWatchlist/raw|figyelőlista nyers változatának]] szerkesztésére is.",
        "version-hook-subscribedby": "Használja",
        "version-version": "(verzió: $1)",
        "version-license": "MediaWiki licenc",
+       "version-ext-license": "Licenc",
+       "version-ext-colheader-name": "Kiterjesztés",
+       "version-ext-colheader-version": "Verzió",
+       "version-ext-colheader-license": "Licenc",
+       "version-ext-colheader-description": "Leírás",
+       "version-ext-colheader-credits": "Szerzők",
+       "version-license-title": "$1 licence",
+       "version-license-not-found": "Ehhez a kiterjesztéshez nincs részletes licenc információ.",
        "version-poweredby-credits": "Ez a wiki '''[https://www.mediawiki.org/ MediaWiki]''' szoftverrel működik, copyright © 2001-$1 $2.",
        "version-poweredby-others": "mások",
        "version-poweredby-translators": "translatewiki.net fordítók",
        "compare-invalid-title": "A megadott cím érvénytelen.",
        "compare-title-not-exists": "A megadott cím nem létezik.",
        "compare-revision-not-exists": "A megadott lapváltozat nem létezik.",
-       "dberr-header": "A wikivel problémák vannak",
        "dberr-problems": "Sajnáljuk, de az oldallal technikai problémák vannak.",
        "dberr-again": "Várj néhány percet, majd frissítsd az oldalt.",
        "dberr-info": "(Nem sikerült kapcsolatot létesíteni az adatbázisszerverrel: $1)",
index 78e13c5..ce10d7e 100644 (file)
@@ -15,7 +15,8 @@
                        "Vadgt",
                        "Xelgen",
                        "Համլետ",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "ընդգծել հղումները՝",
@@ -28,7 +29,6 @@
        "tog-showtoolbar": "Ցույց տալ խմբագրումների գործիքների վահանակը",
        "tog-editondblclick": "Խմբագրել էջերը կրկնակի մատնահարմամբ",
        "tog-editsectiononrightclick": "Խմբագրել բաժինները վերնագրի աջ մատնահարմամբ",
-       "tog-rememberpassword": "Հիշել իմ մուտքագրված տվյալներն այս համակարգչում ($1 {{PLURAL:$1|օրից}} ոչ ավել ժամկետով)",
        "tog-watchcreations": "Ավելացնել իմ ստեղծած էջերը և բեռնած նիշքերը հսկացանկին",
        "tog-watchdefault": "Ավելացնել իմ խմբագրած էջերը և նիշքերը հսկացանկին",
        "tog-watchmoves": "Ավելացնել իմ վերնավանած էջերը և նիշքերը հսկացանկին",
        "readonly_lag": "Տվյալների բազան ավտոմատիկ կողպվել է ժամանակավորապես՝ մինչև ՏԲ-ի երկրորդական սերվերը չհամաժամանակեցվի առաջնայինի հետ։",
        "internalerror": "Ներքին սխալ",
        "internalerror_info": "Ներքին սխալ՝ $1",
-       "fileappenderror": "Չհաջողվեց ավելացնել «$1» «$2»-ին։",
        "filecopyerror": "Չհաջողվեց պատճենել «$1» նիշքը «$2» նիշքի մեջ։",
        "filerenameerror": "Չհաջողվեց «$1» նիշքը վերանվանել «$2»։",
        "filedeleteerror": "Չհաջողվեց ջնջել «$1» ֆայլը։",
        "directorycreateerror": "Չհաջողվեց ստեղծել «$1» պանակը։",
        "filenotfound": "Չհաջողվեց գտնել «$1» ֆայլը։",
-       "fileexistserror": "Չհաջողվեց գրել «$1» նիշքին. նիշքը գոյություն ունի։",
        "unexpected": "Անսպասելի արժեք. «$1»=«$2»։",
        "formerror": "Սխալ. չհաջողվեց փոխանցել տվյալները",
        "badarticleerror": "Տվյալ գործողությունը չի կարող կատարվել այս էջում։",
        "userlogin-resetlink": "Մոռացե՞լ եք Ձեր հաշվի տվյալները։",
        "userlogin-resetpassword-link": "Մոռացե՞լ եք գաղտնաբառը",
        "userlogin-createanother": "Ստեղծել այլ հաշիվ",
-       "createacct-join": "Մուտքագրեք Ձեր տեղեկությունները ստորև",
        "createacct-emailrequired": "Էլ–փոստի հասցե",
        "createacct-emailoptional": "Էլ–փոստի հասցե (ոչ պարտադիր)",
        "createacct-email-ph": "Մուտքագրեք ձեր էլ–փոստի հասցեն",
        "savearticle": "Հիշել էջը",
        "preview": "Նախադիտում",
        "showpreview": "Նախադիտել",
-       "showlivepreview": "Ուղիղ նախադիտում",
        "showdiff": "Կատարված փոփոխությունները",
        "anoneditwarning": "'''Ուշադրություն.''' Դուք չեք մտել համակարգ։\nՁեր IP հասցեն կգրանցվի այս էջի խմբագրումների պատմության մեջ։",
        "anonpreviewwarning": "Դուք չեք մտել համակարգ։\n''Հիշելով ձեր կատարած խմբագրումը, այն կգրանցվի Ձեր IP հասցեի ներքո այս էջի խմբագրումների պատմության մեջ։''",
        "log-fulllog": "Դիտել ամբողջական տեղեկամատյանը",
        "edit-conflict": "Խմբագրման ընհարում։",
        "edit-no-change": "Ձեր խմբագրումը անտեսվել է, քանի որ ոչ մի փոփոխություն չի կատարվել տեքստի մեջ։",
-       "postedit-confirmation": "Ձեր խմբագրումը պահպանված է:",
+       "postedit-confirmation-saved": "Ձեր խմբագրումը պահպանված է:",
        "defaultmessagetext": "Լռելյան տեքստը",
        "editwarning-warning": "Այս էջը լքելով դուք կարող եք կորցնել ձեր կատարած փոփոխությունները։\nԵթե դուք գրանցված եք համակարգում, կարող եք անջատել այս նախազգուշացումը ձեր նախընրությունների «{{int:prefs-editing}}» բաժնում։",
        "content-model-wikitext": "վիքիտեքստ",
        "search-nonefound": "Որոնմանը համապատասխանող արդյունքներ չեն գտնվել։",
        "powersearch-legend": "Ընդլայնված որոնում",
        "powersearch-ns": "Որոնել անվանատարածքում.",
-       "powersearch-redir": "Ցույց տալ վերահղումները",
        "powersearch-togglelabel": "Նշել․",
        "powersearch-toggleall": "Բոլորը",
        "powersearch-togglenone": "Ոչ մեկը",
        "prefs-advancedsearchoptions": "Ընդլայնված ընրանքներ",
        "prefs-advancedwatchlist": "Ընդլայնված ընրանքներ",
        "prefs-displayrc": "Ցուցադրման ընտրանքներ",
-       "prefs-displaysearchoptions": "Ցուցադրման ընտրանքներ",
        "prefs-displaywatchlist": "Ցուցադրման ընտրանքներ",
        "prefs-diffs": "Տարբերություններ",
        "email-address-validity-valid": "Էլ. հասցեն վավերական է",
        "recentchanges-label-plusminus": "Էջի չափսն փոխոխվեց այսքան բայթով։",
        "recentchanges-legend-newpage": "(տես նաև՝  [[Special:NewPages|նոր էջերի ցանկ]])",
        "rcnotefrom": "Ստորև բերված են փոփոխությունները սկսած՝ '''$2''' (մինչև՝ '''$1''')։",
-       "rclistfrom": "Ցույց տալ նոր փոփոխությունները սկսած $1",
+       "rclistfrom": "Ցույց տալ նոր փոփոխությունները սկսած $3 $2",
        "rcshowhideminor": "$1 չնչին խմբագրումները",
        "rcshowhideminor-show": "Ցուցադրել",
        "rcshowhideminor-hide": "Թաքցնել",
        "watchlist-details": "Ձեր հսկացանկում կա {{PLURAL:$1|$1 էջ|$1 էջ}}` քննարկման էջերը չհաշված։",
        "wlheader-enotif": "Էլ-փոստով տեղեկացումը միացված է։",
        "wlheader-showupdated": "Էջերը, որոնք փոփոխվել են ձեր դրանց վերջին այցից հետո բերված են '''թավատառ'''։",
-       "watchmethod-recent": "վերջին փոփոխությունները հսկվող էջերի համար",
-       "watchmethod-list": "հսկվող էջերի վերջին փոփոխությունները",
-       "watchlistcontains": "Ձեր հսկացանկում կա $1 {{PLURAL:$1|էջ|էջ}}։",
-       "iteminvalidname": "Խնդիր «$1» տարրի հետ, անթույլատրելի անվանում...",
        "wlshowlast": "Ցուցադրել վերջին $1 ժամերը $2 օրերը $3",
        "watchlist-options": "Հսկացանկի նախընտրություններ",
        "watching": "Հսկվում է...",
        "enotif_lastvisited": "Տես $1՝ ձեր վերջին այցից ի վեր կատարված փոփոխությունների համար։",
        "enotif_lastdiff": "Տես $1՝ այս փոփոխությունը դիտելու համար։",
        "enotif_anon_editor": "անանուն մասնակից $1",
-       "enotif_body": "Հարգելի $WATCHINGUSERNAME,\n\n$PAGEEDITDATE {{grammar:genitive|{{SITENAME}}}} «$PAGETITLE» էջը $CHANGEDORCREATED $PAGEEDITOR մասնակցի կողմից, տես $PAGETITLE_URL ՝ ընթացիկ տարբերակի համար։\n\n$NEWPAGE\n\nԽմբագրման ամփոփում. $PAGESUMMARY $PAGEMINOREDIT\n\nԿապվել խմբագրողի հետ.\nէլ-փոստ՝ $PAGEEDITOR_EMAIL\nվիքի՝ $PAGEEDITOR_WIKI\n\nՀետագա տեղեկացումներ այս էջի փոփոխումների մասին չեն լինի, մինչև որ չայցելեք այն։ Դուք կարող եք նաև փոփոխել տեղեկացման դրոշները ձեր կողմից հսկվող բոլոր էջերի համար ձեր հսկացանկում։\n\n             {{grammar:genitive|{{SITENAME}}}} տեղեկացման ծառայություն\n\n--\nՁեր հսկացանկի նախընտրությունները փոխելու համար այցելեք՝\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nՀետադարձ կապ և օգնություն՝\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Հարգելի $WATCHINGUSERNAME,\n\n$PAGEEDITDATE {{grammar:genitive|{{SITENAME}}}} «$PAGETITLE» էջը $CHANGEDORCREATED $PAGEEDITOR մասնակցի կողմից, տես $PAGETITLE_URL ՝ ընթացիկ տարբերակի համար։\n\n$NEWPAGE\n\nԽմբագրման ամփոփում. $PAGESUMMARY $PAGEMINOREDIT\n\nԿապվել խմբագրողի հետ.\nէլ-փոստ՝ $PAGEEDITOR_EMAIL\nվիքի՝ $PAGEEDITOR_WIKI\n\nՀետագա տեղեկացումներ այս էջի փոփոխումների մասին չեն լինի, մինչև որ չայցելեք այն։ Դուք կարող եք նաև փոփոխել տեղեկացման դրոշները ձեր կողմից հսկվող բոլոր էջերի համար ձեր հսկացանկում։\n\n             {{grammar:genitive|{{SITENAME}}}} տեղեկացման ծառայություն\n\n--\nՁեր հսկացանկի նախընտրությունները փոխելու համար այցելեք՝\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nՀետադարձ կապ և օգնություն՝\n$HELPPAGE",
        "created": "ստեղծված է",
        "changed": "փոփոխված է",
        "deletepage": "Ջնջել էջը",
        "blockip": "Մասնակցի արգելափակում",
        "blockip-legend": "Մասնակցի արգելափակում",
        "blockiptext": "Օգտագործեք ստորև բերված ձևը որոշակի IP-հասցեից կամ մասնակցի անունից գրելու հնարավորությունը արգելափակելու համար։\nՆման բան հարկավոր է անել միայն վանդալության կանխարգելման նպատակով և համաձայն [[{{MediaWiki:Policy-url}}|կանոնակարգի]]։\nՆշեք արգելափակման որոշակի պատճառը ստորև (օրինակ՝ նշեք այն էջը, որում վանդալություն է տեղի ունեցել)։",
-       "ipadressorusername": "IP-հասցե կամ մասնակցի անուն.",
+       "ipaddressorusername": "IP-հասցե կամ մասնակցի անուն.",
        "ipbexpiry": "Մարման ժամկետ.",
        "ipbreason": "Պատճառ.",
        "ipbreason-dropdown": "*Արգելափակման սովորական պատճառներ\n** Կեղծ տեղեկությունների ներմուծում\n** Էջերից նյութերի հեռացում\n** Արտաքին կայքերին հղումների սպամ\n** Անիմաստ/անկապ տեքստի ներմուծում էջերում\n** Վարկաբեկող/ահաբեկող պահվածք\n** Բազմաթիվ մասնակցային հաշիվների չարաշահում\n** Անպատշաճ մասնակցի անուն",
        "monobook.css": "/* Այստեղ տեղադրված CSS կոդը կկիրառվի Monobook տեսքի վրա*/",
        "common.js": "/* Այստեղ տեղադրված JavaScript կոդը կբեռնվի բոլոր մասնակիցների համար էջերի բոլոր դիմումների ժամանակ */",
        "monobook.js": "/* Հնացած է. օգտագործեք [[MediaWiki:common.js]] */",
-       "notacceptable": "Վիքի-սպասարկիչը չի կարող տվյլաները տրամադրել ձեր զննարկիչի կողմից կարդացվող ֆորմատով։",
        "anonymous": "{{SITENAME}}ի անանուն {{PLURAL:$1|մասնակից|մասնակիցներ}}",
        "siteuser": "{{grammar:genitive|{{SITENAME}}}} մասնակից $1",
        "lastmodifiedatby": "Այս էջը վերջին անգամ փոփոխվել է ժամը $2-ին, $1 թվին՝ $3 մասնակցի կողմից։",
        "newimages": "Նոր նիշքերի սրահ",
        "imagelisttext": "Ստորև բերված է '''$1''' {{PLURAL:$1|նիշքի}} ցանկ՝ դասավորված ըստ $2։",
        "newimages-legend": "Ֆիլտր",
-       "showhidebots": "($1 բոտերին)",
        "noimages": "Տեսնելու բան չկա։",
        "ilsubmit": "Որոնել",
        "bydate": "ըստ ամսաթվի",
        "size-kilobytes": "$1 ԿԲ",
        "size-megabytes": "$1 ՄԲ",
        "size-gigabytes": "$1 ԳԲ",
-       "livepreview-loading": "Բեռնվում է…",
-       "livepreview-ready": "Բեռնվում է… Պատրա՜ստ է։",
-       "livepreview-failed": "Ուղիղ նախադիտումը ձախողվեց։ Փորձեք օգտվել հասարակ նախադիտմամբ։",
-       "livepreview-error": "Չհաջողվեց կապ հաստատել. $1 «$2»։ Փորձեք օգտվել հասարակ նախադիտմամբ։",
        "lag-warn-normal": "Վերջին $1 վայրկյանի ընթացքում կատարված փափախությունները հնարավոր է չլինեն այս ցանկում։",
        "lag-warn-high": "Տվյալների բազայի մեծ հապաղման պատճառով վերջին $1 {{PLURAL:$1|վայրկյանում|վայրկյանում}} կատարված խմբագրումները հնարավոր է չերևան այս ցանկում։",
-       "watchlistedit-numitems": "Ձեր հսկացանկը պարունակում է {{PLURAL:$1|1 անվանում|$1 անվանում}}՝ քննարկման էջերը չհաշված։",
-       "watchlistedit-noitems": "Ձեր հսկացանկը չի պարունակում ոչ մի անվանում։",
        "watchlistedit-normal-title": "Հսկացանկի խմբագրում",
        "watchlistedit-normal-legend": "Հեռացնել անվանումները հսկացանկից",
        "watchlistedit-normal-explain": "Ձեր հսկացանկի անվանումները բերված են ստորև։\nԱնվանումը հեռացնելու համար նշեք անվանման կողքի արկղում և մատնահարեք Հեռացնել Անվանումները։\nԴուք կարող եք նաև [[Special:EditWatchlist/raw|խմբագրել հում ցանկը]]։",
        "compare-invalid-title": "Ձեր նշած վերնագիրը անվավեր է։",
        "compare-title-not-exists": "Ձեր նշած վերնագիրը գոյություն չունի:",
        "compare-revision-not-exists": "Ձեր նշած փոփոխությունը գոյություն չունի։",
-       "dberr-header": "Այս վիքիում խնդիրներ են առաջացել",
        "dberr-problems": "Այս կայքում առաջացել են տեխնիկական խնդիրներ։ Հայցում ենք ձեր ներողությունը։",
        "dberr-again": "Փորձեք մի քանի րոպե սպասել և վերաբեռնել էջը։",
        "htmlform-submit": " \nՀաշվել",
index b3528b2..bd1d41e 100644 (file)
@@ -10,7 +10,8 @@
                        "Reedy",
                        "Shirayuki",
                        "Yfdyh000",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Sublinear ligamines:",
@@ -23,7 +24,6 @@
        "tog-showtoolbar": "Monstrar instrumentario de modification",
        "tog-editondblclick": "Modificar paginas con duple clic",
        "tog-editsectiononrightclick": "Permitter modification de sectiones con clic-a-dextra sur titulos de section",
-       "tog-rememberpassword": "Memorar mi contrasigno in iste navigator (pro un maximo de $1 {{PLURAL:$1|die|dies}})",
        "tog-watchcreations": "Adder le paginas que io crea e le files que io incarga a mi observatorio",
        "tog-watchdefault": "Adder le paginas e files que io modifica a mi observatorio",
        "tog-watchmoves": "Adder le paginas e files que io renomina a mi observatorio",
        "readonly_lag": "Le base de datos ha essite automaticamente blocate durante que le servitores de base de datos secundari se synchronisa con le servitor principal.",
        "internalerror": "Error interne",
        "internalerror_info": "Error interne: $1",
-       "fileappenderrorread": "Non poteva leger \"$1\" durante le adjunction.",
-       "fileappenderror": "Non poteva adjunger \"$1\" a \"$2\".",
        "filecopyerror": "Impossibile copiar file \"$1\" a \"$2\".",
        "filerenameerror": "Impossibile renominar file \"$1\" a \"$2\".",
        "filedeleteerror": "Impossibile deler file \"$1\".",
        "directorycreateerror": "Impossibile crear le directorio \"$1\".",
        "filenotfound": "Impossibile trovar file \"$1\".",
-       "fileexistserror": "Impossibile scriber in le file \"$1\": le file ja existe",
        "unexpected": "Valor impreviste: \"$1\"=\"$2\".",
        "formerror": "Error: impossibile submitter formulario",
        "badarticleerror": "Iste action non pote esser effectuate super iste pagina.",
        "userlogin-helplink2": "Adjuta al accesso",
        "userlogin-loggedin": "Tu ha jam aperite session como {{GENDER:$1|$1}}.\nUsa le formulario sequente pro aperir session como altere usator.",
        "userlogin-createanother": "Crear un altere conto",
-       "createacct-join": "Specifica tu information hic infra.",
-       "createacct-another-join": "Specifica le informationes del nove conto ci infra.",
        "createacct-emailrequired": "Adresse de e-mail",
        "createacct-emailoptional": "Adresse de e-mail (optional)",
        "createacct-email-ph": "Entra tu adresse de e-mail",
        "savearticle": "Publicar pagina",
        "preview": "Previsualisation",
        "showpreview": "Monstrar previsualisation",
-       "showlivepreview": "Previsualisation directe",
        "showdiff": "Detaliar modificationes",
        "anoneditwarning": "'''Attention:''' Tu non ha aperite un session.\nTu adresse IP essera registrate in le historia de modificationes de iste pagina.",
        "anonpreviewwarning": "''Tu non ha aperite un session. Salveguardar registrara tu adresse IP in le historia de modificationes de iste pagina.''",
        "edit-gone-missing": "Impossibile actualisar le pagina.\nPare que illo ha essite delite.",
        "edit-conflict": "Conflicto inter modificationes.",
        "edit-no-change": "Tu modification ha essite ignorate, proque nulle cambio esseva facite in le texto.",
-       "postedit-confirmation": "Tu modification ha essite salveguardate.",
+       "postedit-confirmation-saved": "Tu modification ha essite salveguardate.",
        "edit-already-exists": "Non poteva crear un nove pagina.\nIllo existe ja.",
        "defaultmessagetext": "Texto predefinite del message",
        "content-failed-to-parse": "Impossibile processar le contento $2 pro le modello $1: $3",
        "search-nonefound": "Le recerca non ha producite resultatos.",
        "powersearch-legend": "Recerca avantiate",
        "powersearch-ns": "Cercar in spatios de nomines:",
-       "powersearch-redir": "Listar redirectiones",
        "powersearch-togglelabel": "Seliger:",
        "powersearch-toggleall": "Totes",
        "powersearch-togglenone": "Nihil",
        "prefs-advancedsearchoptions": "Optiones avantiate",
        "prefs-advancedwatchlist": "Optiones avantiate",
        "prefs-displayrc": "Optiones de presentation",
-       "prefs-displaysearchoptions": "Optiones de presentation",
        "prefs-displaywatchlist": "Optiones de presentation",
        "prefs-tokenwatchlist": "Indicio",
        "prefs-diffs": "Differentias",
        "recentchanges-legend-newpage": "(vide etiam le [[Special:NewPages|lista de nove paginas]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Ecce le modificationes a partir del <strong>$3 a $4</strong> (usque a <strong>$1</strong> entratas).",
-       "rclistfrom": "Monstrar nove modificationes a partir de $1",
+       "rclistfrom": "Monstrar nove modificationes a partir de $3 $2",
        "rcshowhideminor": "$1 modificationes minor",
        "rcshowhideminor-show": "Monstrar",
        "rcshowhideminor-hide": "Celar",
        "uploadstash-refresh": "Refrescar le lista de files",
        "invalid-chunk-offset": "Position de segmento invalide",
        "img-auth-accessdenied": "Accesso refusate",
-       "img-auth-nopathinfo": "PATH_INFO manca.\nLe servitor non ha essite configurate pro passar iste information.\nIllo pote esser basate super CGI e non pote supportar img_auth.\nVide https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "PATH_INFO manca.\nLe servitor non ha essite configurate pro passar iste information.\nIllo pote esser basate super CGI e non pote supportar img_auth.\nVide https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Le cammino requestate non es in le directorio de incargamentos configurate.",
        "img-auth-badtitle": "Impossibile construer un titulo valide ex \"$1\".",
        "img-auth-nologinnWL": "Tu non ha aperite un session e \"$1\" non es in le lista blanc.",
        "pageswithprop-prophidden-binary": "valor de proprietate binari celate ($1)",
        "doubleredirects": "Redirectiones duple",
        "doubleredirectstext": "Iste pagina lista paginas de redirection verso altere paginas de redirection.\nCata linea contine ligamines al prime e al secunde redirection, con le destination del secunde redirection. Iste es normalmente le \"ver\" pagina de destination, al qual le prime redirection tamben deberea punctar.\nLe entratas <del>cancellate</del> ha essite resolvite.",
-       "double-redirect-fixed-move": "[[$1]] ha essite renominate, illo es ora un redirection verso [[$2]]",
-       "double-redirect-fixed-maintenance": "Corrige redirection duple de [[$1]] a [[$2]].",
+       "double-redirect-fixed-move": "[[$1]] ha essite renominate.\nIllo ha essite automaticamente actualisate e ora redirige verso [[$2]].",
+       "double-redirect-fixed-maintenance": "Corrige automaticamente le redirection duple de [[$1]] a [[$2]] durante un carga de mantenentia.",
        "double-redirect-fixer": "Corrector de redirectiones",
        "brokenredirects": "Redirectiones rupte",
        "brokenredirectstext": "Le sequente redirectiones mena a paginas non existente:",
        "watchlist-details": "{{PLURAL:$1|$1 pagina|$1 paginas}} es in tu observatorio, sin contar le paginas de discussion.",
        "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'''.",
-       "watchmethod-recent": "cerca paginas sub observation in modificationes recente",
-       "watchmethod-list": "cerca modificationes recente in paginas sub observation",
-       "watchlistcontains": "Tu observatorio contine $1 {{PLURAL:$1|pagina|paginas}}.",
-       "iteminvalidname": "Problema con entrata '$1', nomine invalide...",
        "wlnote2": "Ecce le cambiamentos in le ultime {{PLURAL:$1|hora|<strong>$1</strong> horas}}, a partir del $2 a $3.",
        "wlshowlast": "Revelar ultime $1 horas $2 dies $3",
        "watchlist-options": "Optiones del observatorio",
        "enotif_lastvisited": "Vide $1 pro tote le modificationes depost tu ultime visita.",
        "enotif_lastdiff": "Vide $1 pro revider iste modification.",
        "enotif_anon_editor": "usator anonyme $1",
-       "enotif_body": "Car $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nSummario del redactor: $PAGESUMMARY $PAGEMINOREDIT\n\nPro contactar le redactor:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nTu non recipera altere notificationes de activitate si tu non visita iste pagina con session aperte. Tu pote anque reinitialisar le optiones de notification pro tote le paginas in tu observatorio.\n\nLe systema de notification de {{SITENAME}}, a tu servicio\n\n-- \nPro configurar le notification per e-mail, visita\n{{canonicalurl:{{#special:Preferences}}}}\n\nPro configurar le observatorio, visita\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPro retirar le pagina de tu observatorio, visita\n$UNWATCHURL\n\nFeedback e ulterior assistentia:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Car $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nSummario del redactor: $PAGESUMMARY $PAGEMINOREDIT\n\nPro contactar le redactor:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nTu non recipera altere notificationes de activitate si tu non visita iste pagina con session aperte. Tu pote anque reinitialisar le optiones de notification pro tote le paginas in tu observatorio.\n\nLe systema de notification de {{SITENAME}}, a tu servicio\n\n-- \nPro configurar le notification per e-mail, visita\n{{canonicalurl:{{#special:Preferences}}}}\n\nPro configurar le observatorio, visita\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPro retirar le pagina de tu observatorio, visita\n$UNWATCHURL\n\nFeedback e ulterior assistentia:\n$HELPPAGE",
        "created": "create",
        "changed": "modificate",
        "deletepage": "Deler pagina",
        "blockip": "Blocar 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).",
-       "ipadressorusername": "Adresse IP o nomine de usator:",
+       "ipaddressorusername": "Adresse IP o nomine de usator:",
        "ipbexpiry": "Expiration:",
        "ipbreason": "Motivo:",
        "ipbreason-dropdown": "*Motivos frequente pro blocar\n** Insertion de informationes false\n** Elimination de contento de paginas\n** Ligamines ''spam'' verso sitos externe\n** Insertion de nonsenso/absurditates in paginas\n** Comportamento intimidatori/molestation\n** Abuso de contos multiple\n** Nomine de usator inacceptabile",
        "monobook.js": "/* Omne JavaScript hic se executara pro le usatores del apparentia MonoBook */",
        "modern.js": "/* Omne JavaScript hic se executara pro le usatores del apparentia Moderne */",
        "vector.js": "/* Omne JavaScript hic se executara pro le usatores del apparentia Vector */",
-       "notacceptable": "Le servitor wiki non pote provider datos in un formato que tu cliente sape leger.",
        "anonymous": "{{PLURAL:$1|Usator|Usatores}} anonyme de {{SITENAME}}",
        "siteuser": "Usator $1 de {{SITENAME}}",
        "anonuser": "le usator anonyme $1 de {{SITENAME}}",
        "newimages-summary": "Iste pagina special detalia le recente files incargate.",
        "newimages-legend": "Filtro",
        "newimages-label": "Nomine del file (o un parte de illo):",
-       "showhidebots": "($1 bots)",
        "noimages": "Nihil a vider.",
        "ilsubmit": "Cercar",
        "bydate": "per data",
        "autosumm-replace": "Contento reimplaciate per '$1'",
        "autoredircomment": "Redirection verso [[$1]]",
        "autosumm-new": "Pagina create con '$1'",
-       "livepreview-loading": "Cargamento in curso…",
-       "livepreview-ready": "Cargamento in curso… Preste!",
-       "livepreview-failed": "Le previsualisation directe ha fallite! Prova le previsualisation normal.",
-       "livepreview-error": "Impossibile connecter: $1 \"$2\". Prova le previsualisation normal.",
        "lag-warn-normal": "Le modificationes plus nove que $1 {{PLURAL:$1|secunda|secundas}} possibilemente non se revela in iste lista.",
        "lag-warn-high": "Le servitor del base de datos es in retardo; modificationes facite durante le ultime $1 {{PLURAL:$1|secunda|secundas}} possibilemente non appare in iste lista.",
-       "watchlistedit-numitems": "Tu observatorio contine {{PLURAL:$1|1 titulo|$1 titulos}}, excludente le paginas de discussion.",
-       "watchlistedit-noitems": "Tu observatorio contine nulle titulos.",
        "watchlistedit-normal-title": "Modificar observatorio",
        "watchlistedit-normal-legend": "Remover titulos del observatorio",
        "watchlistedit-normal-explain": "Le titulos in tu observatorio es monstrate hic infra.\nPro eliminar un titulo, marca le quadrato correspondente, e clicca \"{{int:Watchlistedit-normal-submit}}\".\nTu pote etiam [[Special:EditWatchlist/raw|modificar le lista in forma crude]].",
        "compare-invalid-title": "Le titulo que tu specificava es invalide.",
        "compare-title-not-exists": "Le titulo que tu specificava non existe.",
        "compare-revision-not-exists": "Le version que tu specificava non existe.",
-       "dberr-header": "Iste wiki ha un problema",
        "dberr-problems": "Pardono! Iste sito ha incontrate difficultates technic.",
        "dberr-again": "Proba attender alcun minutas e recargar.",
        "dberr-info": "(Non pote contactar le servitor del base de datos: $1)",
index 1dc3938..db936b1 100644 (file)
@@ -31,7 +31,9 @@
                        "StefanusRA",
                        "Urhixidur",
                        "William Surya Permana",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라",
+                       "C5st4wr6ch"
                ]
        },
        "tog-underline": "Garis bawahi pranala:",
@@ -44,7 +46,6 @@
        "tog-showtoolbar": "Tampilkan bilah alat penyuntingan",
        "tog-editondblclick": "Sunting halaman dengan klik ganda",
        "tog-editsectiononrightclick": "Fungsikan penyuntingan bagian dengan mengeklik kanan pada judul bagian",
-       "tog-rememberpassword": "Ingat kata sandi saya di peramban ini (selama $1 {{PLURAL:$1|hari}})",
        "tog-watchcreations": "Tambahkan halaman yang saya buat ke daftar pantauan",
        "tog-watchdefault": "Tambahkan halaman yang saya sunting ke daftar pantauan",
        "tog-watchmoves": "Tambahkan halaman yang saya pindahkan ke daftar pantauan",
        "permalink": "Pranala permanen",
        "print": "Cetak",
        "view": "Baca",
+       "view-foreign": "Lihat di $1",
        "edit": "Sunting",
+       "edit-local": "Sunting deskripsi lokal",
        "create": "Buat",
+       "create-local": "Tambah deskripsi lokal",
        "editthispage": "Sunting halaman ini",
        "create-this-page": "Buat halaman ini",
        "delete": "Hapus",
        "jumptonavigation": "navigasi",
        "jumptosearch": "cari",
        "view-pool-error": "Maaf, server sedang sibuk pada saat ini.\nTerlalu banyak pengguna berusaha melihat halaman ini.\nTunggu sebentar sebelum Anda mencoba lagi mengakses halaman ini.\n\n$1",
+       "generic-pool-error": "Maaf, server sedang sibuk pada saat ini.\nTerlalu banyak pengguna yang mencoba melihat sumber ini.\nSilakan tunggu sebentar sebelum Anda mencoba mengakses halaman ini lagi.",
        "pool-timeout": "Lewat waktu menunggu kunci",
        "pool-queuefull": "Kumpulan antrean penuh",
        "pool-errorunknown": "Kesalahan yang tidak diketahui",
        "readonly_lag": "Basis data telah dikunci otomatis selagi basis data sekunder melakukan sinkronisasi dengan basis data utama",
        "internalerror": "Kesalahan internal",
        "internalerror_info": "Kesalahan internal: $1",
-       "fileappenderrorread": "Tidak dapat membaca \"$1\" saat penambahan.",
-       "fileappenderror": "Tidak dapat memasukkan \"$1\" ke \"$2\".",
        "filecopyerror": "Tidak dapat menyalin berkas \"$1\" ke \"$2\".",
        "filerenameerror": "Tidak dapat mengubah nama berkas \"$1\" menjadi \"$2\".",
        "filedeleteerror": "Tidak dapat menghapus berkas \"$1\".",
        "directorycreateerror": "Tidak dapat membuat direktori \"$1\".",
        "filenotfound": "Tidak dapat menemukan berkas \"$1\".",
-       "fileexistserror": "Tidak dapat menulis berkas \"$1\": berkas sudah ada",
        "unexpected": "Nilai di luar jangkauan: \"$1\"=\"$2\".",
        "formerror": "Kesalahan: Tidak dapat mengirimkan formulir",
        "badarticleerror": "Tindakan ini tidak dapat dilaksanakan di halaman ini.",
        "userlogin-helplink2": "Bantuan masuk log",
        "userlogin-loggedin": "Andan telah masuk log sebagai $1.\nGunakan formulir di bawah untuk masuk log sebagai pengguna lain.",
        "userlogin-createanother": "Buat akun lain",
-       "createacct-join": "Masukkan informasi Anda di bawah ini.",
-       "createacct-another-join": "Masukkan informasi akun baru di bawah ini.",
        "createacct-emailrequired": "Alamat surel",
        "createacct-emailoptional": "Alamat surel (opsional)",
        "createacct-email-ph": "Masukkan alamat surel Anda",
        "resetpass-submit-loggedin": "Ganti kata sandi",
        "resetpass-submit-cancel": "Batalkan",
        "resetpass-wrong-oldpass": "Kata sandi tidak sah.\nAnda mungkin telah berhasil mengganti kata sandi Anda atau telah meminta kata sandi sementara yang baru.",
-       "resetpass-recycled": "Mohon menyetel ulang kata sandi Anda.",
+       "resetpass-recycled": "Mohon menyetel ulang kata sandi Anda ke sesuatu yang berbeda dari kata sandi Anda sekarang.",
        "resetpass-temp-emailed": "Anda masuk log dengan kode sementara yang disurel.\nUntuk menyelesaikan masuk log, Anda harus mengatur sandi baru di sini:",
        "resetpass-temp-password": "Kata sandi sementara:",
        "resetpass-abort-generic": "Perubahan kata sandi telah dibatalkan oleh ekstensi.",
        "savearticle": "Simpan halaman",
        "preview": "Pratayang",
        "showpreview": "Lihat pratayang",
-       "showlivepreview": "Pratayang langsung",
        "showdiff": "Lihat perubahan",
        "anoneditwarning": "'''Peringatan:''' Anda tidak terdaftar masuk.\nAlamat IP Anda akan tercatat dalam sejarah (versi terdahulu) halaman ini.",
        "anonpreviewwarning": "''Anda belum masuk log. Menyimpan halaman akan menyebabkan alamat IP Anda tercatat pada riwayat suntingan laman ini.''",
        "anontalkpagetext": "----''Ini adalah halaman pembicaraan seorang pengguna anonim yang belum membuat akun atau tidak menggunakannya.\nDengan demikian, kami terpaksa harus memakai alamat IP yang bersangkutan untuk mengidentifikasikannya.\nAlamat IP seperti ini mungkin dipakai bersama oleh beberapa pengguna yang berbeda.\nJika Anda adalah seorang pengguna anonim dan merasa mendapatkan komentar-komentar yang tidak relevan yang ditujukan langsung kepada Anda, silakan [[Special:UserLogin/signup|membuat akun]] atau [[Special:UserLogin|masuk log]] untuk menghindari kerancuan dengan pengguna anonim lainnya di lain waktu.''",
        "noarticletext": "Saat ini tidak ada teks di halaman ini.\nAnda dapat [[Special:Search/{{PAGENAME}}|melakukan pencarian untuk judul halaman ini]] di halaman-halaman lain, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mencari log terkait], atau [{{fullurl:{{FULLPAGENAME}}|action=edit}} menyunting halaman ini]</span>.",
        "noarticletext-nopermission": "!Saat ini tidak ada teks di halaman ini.\nAnda dapat [[Special:Search/{{PAGENAME}}|melakukan pencarian untuk judul halaman ini]] di halaman-halaman lain, atau <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mencari log terkait]</span>, tapi Anda tidak memiliki izin untuk membuat halaman ini",
-       "missing-revision": "Revisi #$1 halaman berjudul \"{{FULLPAGENAME}}\" tidak eksks.\n\nHal ini biasanya disebabkan oleh tautan versi terdahulu menuju halaman yang sudah dihapus.\nRinciannya dapat ditemukan di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log penghapusan].",
+       "missing-revision": "Revisi #$1 halaman berjudul \"{{FULLPAGENAME}}\" tidak eksis.\n\nHal ini biasanya disebabkan oleh tautan versi terdahulu menuju halaman yang sudah dihapus.\nRinciannya dapat ditemukan di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log penghapusan].",
        "userpage-userdoesnotexist": "Akun pengguna \"<nowiki>$1</nowiki>\" tidak terdaftar.",
        "userpage-userdoesnotexist-view": "Pengguna \"$1\" tidak terdaftar.",
        "blocked-notice-logextract": "Pengguna ini sedang diblokir.\nEntri log pemblokiran terakhir tersedia di bawah ini sebagai rujukan.",
        "edit-gone-missing": "Tidak dapat memperbaharui halaman.\nHalaman kemungkinan telah dihapus.",
        "edit-conflict": "Konflik penyuntingan.",
        "edit-no-change": "Suntingan diabaikan, karena Anda tidak melakukan perubahan atas teks.",
-       "postedit-confirmation": "Suntingan Anda tersimpan.",
+       "postedit-confirmation-created": "Halaman telah dibuat.",
+       "postedit-confirmation-restored": "Halaman telah dipulihkan.",
+       "postedit-confirmation-saved": "Suntingan Anda tersimpan.",
        "edit-already-exists": "Tidak dapat membuat halaman baru\nkarena telah ada.",
        "defaultmessagetext": "Teks baku",
        "content-failed-to-parse": "Gagal menjabarkan konten $2 untuk model $1: $3",
        "revdelete-selected-text": "{{PLURAL:$1|Revisi terpilih|Revisi terpilih}} dari [[:$2]]:",
        "revdelete-selected-file": "{{PLURAL:$1|Versi berkas terpilih|Versi berkas terpilih}} dari [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|Log|Log-log}} pilihan untuk:",
+       "revdelete-text-others": "Pengurus lain pada {{SITENAME}} masih akan dapat mengakses konten tersembunyi dan dapat membatalkan penghapusan itu kembali melalui antarmuka yang sama ini, kecuali ada batasan-batasan tambahan yang ditetapkan.",
        "revdelete-confirm": "Tolong konfirmasi bahwa Anda memang bermaksud melakukan ini, memahami konsekuensinya, dan bahwa Anda melakukannya sesuai dengan [[{{MediaWiki:Policy-url}}|kebijakan]].",
        "revdelete-suppress-text": "Penyembunyian revisi '''hanya''' boleh digunakan untuk kasus-kasus berikut:\n* Informasi yang berpotensi memfitnah\n* Informasi pribadi yang tak sepantasnya\n*: ''alamat rumah dan nomor telepon, nomor kartu identitas, dan lain-lain.''",
        "revdelete-legend": "Atur batasan:",
        "showhideselectedversions": "Tampilkan/sembunyikan versi terpilih",
        "editundo": "balikkan",
        "diff-empty": "(Tidak ada perbedaan)",
+       "diff-multi-sameuser": "({{PLURAL:$1|Satu revisi antara|$1 revisi antara}} oleh pengguna yang sama tidak ditampilkan)",
        "diff-multi-manyusers": "({{PLURAL:$1|Satu|$1}} revisi antara oleh lebih dari $2 {{PLURAL:$2|satu|$2}} pengguna tak ditampilkan)",
        "difference-missing-revision": "{{PLURAL:$2|Satu revisi|$2 revisi}} dari perbedaan ini ($1) {{PLURAL:$2|tidak|tidak}} ditemukan.\n\nHal ini biasanya disebabkan oleh tautan diff yang kedaluwarsa ke halaman yang sudah dihapus.\nRinciannya dapat ditemukan di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log penghapusan].",
        "searchresults": "Hasil pencarian",
        "shown-title": "Tampilkan $1 {{PLURAL:$1|hasil|hasil}} per halaman",
        "viewprevnext": "Lihat ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "* Halaman '''[[$1]]'''",
-       "searchmenu-new": "'''Buat halaman \"[[:$1]]\" di wiki ini!'''",
+       "searchmenu-new": "<strong>Buat halaman \"[[:$1]]\" di wiki ini!</strong> {{PLURAL:$2|0=|Lihat pula halaman yang ditemukan dari pencarian Anda.|Lihat pula hasil pencarian yang ditemukan.}}",
        "searchprofile-articles": "Halaman isi",
-       "searchprofile-project": "Halaman Bantuan dan Proyek",
        "searchprofile-images": "Berkas Multimedia",
        "searchprofile-everything": "Semua",
        "searchprofile-advanced": "Lanjutan",
        "searchprofile-articles-tooltip": "Pencarian di $1",
-       "searchprofile-project-tooltip": "Pencarian di $1",
        "searchprofile-images-tooltip": "Pencarian berkas",
        "searchprofile-everything-tooltip": "Pencarian di seluruh situs (termasuk halaman pembicaraan)",
        "searchprofile-advanced-tooltip": "Pencarian di ruang nama tertentu",
        "searchrelated": "berkaitan",
        "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>.",
        "showingresultsnum": "Di bawah ini ditampilkan {{PLURAL:$3|'''1'''|'''$3'''}} hasil, dimulai dari #'''$2'''.",
        "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-redir": "Daftar pengalihan",
        "powersearch-togglelabel": "Pilih:",
        "powersearch-toggleall": "Semua",
        "powersearch-togglenone": "Tidak ada",
        "prefs-emailconfirm-label": "Konfirmasi surel:",
        "youremail": "Surel:",
        "username": "{{GENDER:$1|Nama pengguna}}:",
-       "uid": "ID {{GENDER:$1|pengguna}}:",
        "prefs-memberingroups": "{{GENDER:$2|Anggota}} {{PLURAL:$1|kelompok|kelompok}}:",
        "prefs-memberingroups-type": "$1",
        "prefs-registration": "Waktu pendaftaran:",
        "prefs-advancedsearchoptions": "Opsi lanjutan",
        "prefs-advancedwatchlist": "Opsi lanjutan",
        "prefs-displayrc": "Pilihan tampilan",
-       "prefs-displaysearchoptions": "Pilihan tampilan",
        "prefs-displaywatchlist": "Pilihan tampilan",
        "prefs-tokenwatchlist": "Tanda",
        "prefs-diffs": "Beda",
        "recentchanges-legend-heading": "'''Legenda:'''",
        "recentchanges-legend-newpage": "(lihat pula [[Special:NewPages|daftar halaman baru]])",
        "rcnotefrom": "Di bawah ini adalah perubahan sejak <strong>$2</strong> (ditampilkan sampai <strong>$1</strong> perubahan).",
-       "rclistfrom": "Perlihatkan perubahan terbaru sejak $1",
+       "rclistfrom": "Perlihatkan perubahan terbaru sejak $3 $2",
        "rcshowhideminor": "$1 suntingan kecil",
        "rcshowhideminor-show": "Tampilkan",
        "rcshowhideminor-hide": "Sembunyikan",
        "uploadstash-refresh": "Segarkan daftar berkas.",
        "invalid-chunk-offset": "Ofset potongan tidak valid",
        "img-auth-accessdenied": "Akses ditolak",
-       "img-auth-nopathinfo": "PATH_INFO hilang.\nServer Anda tidak diatur untuk melewatkan informasi ini.\nServer tersebut mungkin berbasis CGI dan tidak dapat mendukung img_auth.\nLihat https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "PATH_INFO hilang.\nServer Anda tidak diatur untuk melewatkan informasi ini.\nServer tersebut mungkin berbasis CGI dan tidak dapat mendukung img_auth.\nLihat https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Alur yang diminta tidak diatur dalam direktori ungahan.",
        "img-auth-badtitle": "Tidak dapat membangun judul yang sah dari \"$1\".",
        "img-auth-nologinnWL": "Anda tidak masuk log dan \"$1\" tidak dalam daftar putih.",
        "unwatchedpages": "Halaman yang tak dipantau",
        "listredirects": "Daftar pengalihan",
        "listduplicatedfiles": "Daftar berkas yang berduplikat",
+       "listduplicatedfiles-entry": "[[:File:$1|$1]] memiliki [[$3|{{PLURAL:$2|sebuah duplikat|$2 duplikat}}]].",
        "unusedtemplates": "Templat yang tak digunakan",
        "unusedtemplatestext": "Daftar berikut adalah semua halaman pada ruang nama {{ns:template}} yang tidak dipakai di halaman mana pun.\nCek dahulu pranala lain ke templat tersebut sebelum menghapusnya.",
        "unusedtemplateswlh": "pranala lain",
        "pageswithprop-prophidden-binary": "nilai properti biner tersembunyi ($1 kilobita)",
        "doubleredirects": "Pengalihan ganda",
        "doubleredirectstext": "Halaman ini memuat daftar halaman yang dialihkan ke halaman pengalihan yang lain.\nSetiap baris memuat pranala ke pengalihan pertama dan pengalihan kedua serta target dari pengalihan kedua yang umumnya adalah halaman yang \"sebenarnya\". Halaman peralihan pertama seharusnya dialihkan ke halaman yang bukan merupakan halaman peralihan.\nNama yang telah <del>dicoret</del> berarti telah dibetulkan.",
-       "double-redirect-fixed-move": "[[$1]] telah dipindahkan menjadi halaman peralihan ke [[$2]]",
-       "double-redirect-fixed-maintenance": "Memperbaiki pengalihan ganda dari [[$1]] ke [[$2]].",
+       "double-redirect-fixed-move": "[[$1]] telah dipindahkan.\nKami telah memperbaruinya secara otomatis dan sekarang menjadi halaman peralihan ke [[$2]].",
+       "double-redirect-fixed-maintenance": "Memperbaiki pengalihan ganda dari [[$1]] ke [[$2]] dalam sebuah pemeliharaan.",
        "double-redirect-fixer": "Revisi pengalihan",
        "brokenredirects": "Pengalihan rusak",
        "brokenredirectstext": "Pengalihan-pengalihan berikut merujuk pada halaman yang tidak ada:",
        "deadendpagestext": "Halaman-halaman berikut tidak memiliki pranala ke halaman mana pun di wiki ini.",
        "protectedpages": "Halaman yang dilindungi",
        "protectedpages-indef": "Hanya untuk pelindungan dengan jangka waktu tak terbatas",
+       "protectedpages-summary": "Halaman ini mendaftarkan halaman-halaman yang telah ada yang sedang dilindungi. Untuk daftar judul yang dilindungi dari pembuatan, lihat [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "protectedpages-cascade": "Hanya pelindungan runtun",
        "protectedpages-noredirect": "Sembunyikan pengalihan",
        "protectedpagesempty": "Saat ini tidak ada halaman yang sedang dilindungi dengan parameter-parameter tersebut.",
        "protectedpages-unknown-timestamp": "Tidak diketahui",
        "protectedpages-unknown-performer": "Pengguna yang tidak diketahui",
        "protectedtitles": "Judul yang dilindungi",
+       "protectedtitles-summary": "Halaman ini mendaftarkan judul-judul yang saat ini dilindungi dari pembuatan. Untuk daftar halaman yang sudah ada dan dilindungi, lihat [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Tidak ada judul yang dilindungi.",
        "listusers": "Daftar pengguna",
        "listusers-editsonly": "Tampilkan hanya pengguna yang memiliki kontribusi",
        "log-title-wildcard": "Cari judul yang diawali dengan teks tersebut",
        "showhideselectedlogentries": "Tampilkan/sembunyikan entri log terpilih",
        "allpages": "Semua halaman",
-       "alphaindexline": "$1 hingga $2",
        "nextpage": "Halaman selanjutnya ($1)",
        "prevpage": "Halaman sebelumnya ($1)",
        "allpagesfrom": "Tampilkan halaman mulai dari:",
        "listgrouprights-removegroup-self": "Menghapus {{PLURAL:$2|kelompok|kelompok}} dari akun sendiri: $1",
        "listgrouprights-addgroup-self-all": "Dapat menambahkan semua grup ke akun sendiri",
        "listgrouprights-removegroup-self-all": "Menghapus semua kelompok dari akun sendiri",
+       "listgrouprights-namespaceprotection-header": "Batasan ruang nama",
+       "listgrouprights-namespaceprotection-namespace": "Ruang nama",
+       "listgrouprights-namespaceprotection-restrictedto": "Hak yang mengizinkan pengguna untuk menyunting",
+       "trackingcategories": "Kategori pelacak",
+       "trackingcategories-summary": "Halaman ini mendaftarkan kategori-kategori pelacak yang secara otomatis dibuat oleh perangkat lunak MediaWiki. Nama kategori ini dapat diubah dengan mengubah pesan sistem yang sesuai dalam ruang nama {{ns:8}}.",
+       "trackingcategories-msg": "Kategori pelacak",
+       "trackingcategories-name": "Nama pesan",
+       "trackingcategories-desc": "Kriteria inklusi kategori",
+       "noindex-category-desc": "Halaman tidak diindeks oleh robot karena ini mempunyai kata khusus <code><nowiki>__NOINDEX__</nowiki></code> padanya dan berada dalam ruang nama yang mengizinkan penanda itu.",
+       "post-expand-template-inclusion-category-desc": "Setelah memperluas semua templat, ukuran halaman menjadi lebih besar dari <code>$wgMaxArticleSize</code>, sehingga beberapa templat tidak diperluas.",
+       "broken-file-category-desc": "Kategori ditambahkan jika halaman tersebut berisi pranala rusak (pranala untuk menanamkan sebuah berkas ketika berkas tersebut tidak ada).",
+       "trackingcategories-nodesc": "Deskripsi tidak tersedia.",
        "trackingcategories-disabled": "Kategori dinonaktifkan",
        "mailnologin": "Tidak ada alamat surel",
        "mailnologintext": "Anda harus [[Special:UserLogin|masuk log]] dan mempunyai alamat surel yang sah di dalam [[Special:Preferences|preferensi]] untuk mengirimkan surel kepada pengguna lain.",
        "watchlist-details": "Terdapat {{PLURAL:$1|$1 halaman|$1 halaman}} di daftar pantauan Anda, tidak termasuk halaman pembicaraan.",
        "wlheader-enotif": "Notifikasi surel diaktifkan.",
        "wlheader-showupdated": "Halaman-halaman yang telah berubah sejak kunjungan terakhir Anda ditampilkan dengan '''huruf tebal'''.",
-       "watchmethod-recent": "periksa daftar perubahan terbaru terhadap halaman yang dipantau",
-       "watchmethod-list": "periksa halaman yang dipantau terhadap perubahan terbaru",
-       "watchlistcontains": "Daftar pantauan Anda berisi $1 {{PLURAL:$1|halaman|halaman}}.",
-       "iteminvalidname": "Ada masalah dengan '$1', namanya tidak sah...",
+       "wlnote2": "Di bawah ini adalah perubahan yang terjadi dalam {{PLURAL:$1|sejam|<strong>$1</strong> jam}} terakhir, per $2, $3.",
        "wlshowlast": "Tampilkan $1 jam $2 hari terakhir $3",
        "watchlist-options": "Opsi daftar pantauan",
        "watching": "Memantau...",
        "enotif_lastvisited": "Lihat $1 untuk semua perubahan sejak kunjungan terakhir Anda.",
        "enotif_lastdiff": "Kunjungi $1 untuk melihat perubahan ini.",
        "enotif_anon_editor": "pengguna anonim $1",
-       "enotif_body": "Halo $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nRingkasan suntingan: $PAGESUMMARY $PAGEMINOREDIT\n\nHubungi penyunting:\nsurel: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nKami tidak akan mengirim pemberitahuan lain bila ada perubahan lebih lanjut sampai Anda mengunjungi halaman ini.\nAnda juga dapat menyetel ulang tanda pemberitahuan untuk semua halaman pantauan pada daftar pantauan Anda.\n\nSistem pemberitahuan situs {{SITENAME}}\n\n--\nUntuk mengubah setelan pemberitahuan surel, kunjungi\n{{canonicalurl:{{#special:Preferences}}}}\n\nUntuk mengubah setelan daftar pantauan, kunjungi\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nUntuk menghapus halaman dari daftar pantauan, kunjungi\n$UNWATCHURL\n\nUmpan balik dan bantuan lebih lanjut:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Halo $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nRingkasan suntingan: $PAGESUMMARY $PAGEMINOREDIT\n\nHubungi penyunting:\nsurel: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nKami tidak akan mengirim pemberitahuan lain bila ada perubahan lebih lanjut sampai Anda mengunjungi halaman ini ketika masuk log. Anda juga dapat menyetel ulang tanda pemberitahuan untuk semua halaman pantauan pada daftar pantauan Anda.\n\nSistem pemberitahuan situs {{SITENAME}} Anda yang ramah\n\n--\nUntuk mengubah pengaturan pemberitahuan surel, kunjungi\n{{canonicalurl:{{#special:Preferences}}}}\n\nUntuk mengubah setelan daftar pantauan, kunjungi\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nUntuk menghapus halaman dari daftar pantauan, kunjungi\n$UNWATCHURL\n\nUmpan balik dan bantuan lebih lanjut:\n$HELPPAGE",
        "created": "dibuat",
        "changed": "diubah",
        "deletepage": "Hapus halaman",
        "delete-edit-reasonlist": "Alasan penghapusan suntingan",
        "delete-toobig": "Halaman ini memiliki sejarah penyuntingan yang panjang, melebihi {{PLURAL:$1|revisi|revisi}}.\nPenghapusan halaman dengan sejarah penyuntingan yang panjang tidak diperbolehkan untuk mencegah kerusakan di {{SITENAME}}.",
        "delete-warning-toobig": "Halaman ini memiliki sejarah penyuntingan yang panjang, melebihi {{PLURAL:$1|revisi|revisi}}.\nMenghapus halaman ini dapat menyebabkan masalah dalam operasional basis data {{SITENAME}}.",
+       "deleting-backlinks-warning": "'''Peringatan:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Halaman lain]] mengarah atau memiliki transklusi ke halaman yang akan Anda hapus.",
        "rollback": "Kembalikan suntingan",
        "rollback_short": "Kembalikan",
        "rollbacklink": "kembalikan",
        "protect-locked-blocked": "Anda tak dapat mengganti tingkat pelindungan selagi diblokir. Berikut adalah konfigurasi saat ini untuk halaman '''$1''':",
        "protect-locked-dblock": "Tingkat pelindungan tak dapat diganti karena aktifnya penguncian basis data. Berikut adalah konfigurasi saat ini untuk halaman '''$1''':",
        "protect-locked-access": "Akun Anda tidak dapat memiliki hak untuk mengganti tingkat pelindungan halaman. Berikut adalah konfigurasi saat ini untuk halaman '''$1''':",
-       "protect-cascadeon": "Halaman ini sedang dilindungi karena disertakan dalam {{PLURAL:$1|halaman|halaman-halaman}} berikut yang telah dilindungi dengan pilihan pelindungan runtun diaktifkan. Anda dapat mengganti tingkat pelindungan untuk halaman ini, tapi hal tersebut tidak akan mempengaruhi pelindungan runtun.",
+       "protect-cascadeon": "Halaman ini sedang dilindungi karena disertakan dalam {{PLURAL:$1|halaman|halaman-halaman}} berikut yang telah dilindungi dengan pilihan pelindungan runtun diaktifkan.\nPenggantian tingkat pelindungan untuk halaman ini tidak akan mempengaruhi pelindungan runtun.",
        "protect-default": "Izinkan semua pengguna",
        "protect-fallback": "Hanya untuk pengguna dengan izin  \"$1\"",
        "protect-level-autoconfirmed": "Hanya untuk pengguna terdaftar otomatis",
        "contributions-title": "Kontribusi pengguna untuk $1",
        "mycontris": "Kontribusi",
        "contribsub2": "Untuk {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "Pengguna \"$1\" tidak terdaftar.",
        "nocontribs": "Tidak ada perubahan yang sesuai dengan kriteria tersebut.",
        "uctop": "(saat ini)",
        "month": "Sejak bulan (dan sebelumnya):",
        "sp-contributions-search": "Cari kontribusi",
        "sp-contributions-username": "Alamat IP atau nama pengguna:",
        "sp-contributions-toponly": "Tampilkan hanya revisi teratas",
+       "sp-contributions-newonly": "Hanya tampilkan suntingan yang berupa pembuatan halaman",
        "sp-contributions-submit": "Cari",
        "whatlinkshere": "Pranala balik",
        "whatlinkshere-title": "Halaman yang memiliki pranala ke \"$1\"",
        "blockip": "Blokir pengguna",
        "blockip-legend": "Blokir pengguna",
        "blockiptext": "Gunakan formulir di bawah untuk memblokir akses penulisan dari sebuah alamat IP atau pengguna tertentu.\nIni hanya boleh dilakukan untuk mencegah vandalisme, dan sejalan dengan [[{{MediaWiki:Policy-url}}|kebijakan]].\nMasukkan alasan Anda di bawah (contoh, menuliskan nama halaman yang telah divandalisasi).",
-       "ipadressorusername": "Alamat IP atau nama pengguna:",
+       "ipaddressorusername": "Alamat IP atau nama pengguna:",
        "ipbexpiry": "Kedaluwarsa:",
        "ipbreason": "Alasan:",
        "ipbreason-dropdown": "*Alasan umum\n** Vandalisme\n** Memberikan informasi palsu\n** Menghilangkan isi halaman\n** Spam pranala ke situs luar\n** Memasukkan omong kosong ke halaman\n** Perilaku intimidasi/pelecehan\n** Menyalahgunakan beberapa akun\n** Nama pengguna tak layak",
        "range_block_disabled": "Kemampuan pengurus dalam membuat blokir blok IP dimatikan.",
        "ipb_expiry_invalid": "Waktu kedaluwarsa tidak sah.",
        "ipb_expiry_temp": "Pemblokiran atas nama pengguna yang disembunyikan harus permanen.",
-       "ipb_hide_invalid": "Tak dapat menutup akun ini; mungkin akun tersebut memiliki terlalu banyak suntingan.",
+       "ipb_hide_invalid": "Tak dapat menutup akun ini; akun tersebut memiliki {{PLURAL:$1|satu suntingan|$1 suntingan}}.",
        "ipb_already_blocked": "\"$1\" telah diblokir",
        "ipb-needreblock": "$1 sudah diblokir. Apakah Anda ingin mengubah set pemblokiran yang bersangkutan?",
        "ipb-otherblocks-header": "{{PLURAL:$1|Blok|Blok}} lain",
        "tooltip-preferences-save": "Simpan preferensi",
        "tooltip-summary": "Masukkan sebuah ringkasan pendek",
        "common.css": "/* CSS yang ada di sini akan diterapkan pada semua kulit. */",
-       "cologneblue.css": "/* CSS yang ada di sini akan diterapkan pada kulit Cologne Blue. */",
        "monobook.css": "/* CSS yang ada di sini akan diterapkan pada kulit Monobook. */",
-       "modern.css": "/* CSS yang ada di sini akan diterapkan pada kulit Modern. */",
        "vector.css": "/* CSS nan ado di siko diterapkan pado kulik Vektor. */",
        "print.css": "/* CSS yang ada di sini akan diterapkan pada tampilan cetak. */",
        "noscript.css": "/* CSS di sini akan mempengaruhi pengguna dengan skrip Java non-aktif */",
        "group-sysop.css": "/* CSS di sini hanya mempengaruhi pengurus */",
        "group-bureaucrat.css": "/* CSS di sini hanya mempengaruhi birokrat */",
        "common.js": "/* JavaScript yang ada di sini akan diterapkan untuk semua kulit. */",
-       "cologneblue.js": "/* Semua JavaScript di sini akan dimuatkan untuk para pengguna yang menggunakan kulit Cologne Blue */",
        "monobook.js": "/* Semua JavaScript di sini akan dimuatkan untuk para pengguna yang menggunakan kulit MonoBook */",
-       "modern.js": "/* Semua JavaScript di sini akan dimuatkan untuk para pengguna yang menggunakan kulit Modern */",
        "vector.js": "/* Semua JavaScript di sini akan dimuatkan untuk para pengguna yang menggunakan kulit Vector */",
        "group-autoconfirmed.js": "/* Semua JavaScript di sini hanya dimuatkan untuk pengguna terkonfirmasi otomatis */",
        "group-bot.js": "/* Semua JavaScript di sini hanya dimuatkan untuk bot */",
        "group-sysop.js": "/* Semua JavaScript di sini hanya dimuatkan untuk pengurus */",
        "group-bureaucrat.js": "/* Semua JavaScript di sini hanya dimuatkan untuk birokrat */",
-       "notacceptable": "Server wiki tidak dapat menyediakan data dalam format yang dapat dibaca oleh client Anda.",
        "anonymous": "{{PLURAL:$1|pengguna|para pengguna}} anonim {{SITENAME}}",
        "siteuser": "pengguna {{SITENAME}} $1",
        "anonuser": "pengguna anonim {{SITENAME}} $1",
        "pageinfo-category-pages": "Jumlah halaman",
        "pageinfo-category-subcats": "Jumlah subkategori",
        "pageinfo-category-files": "Jumlah berkas",
-       "skinname-cologneblue": "Biru Köln",
        "skinname-monobook": "MonoBook",
-       "skinname-modern": "Modern",
        "skinname-vector": "Vektor",
        "markaspatrolleddiff": "Tandai telah dipatroli",
        "markaspatrolledtext": "Tandai halaman ini telah dipatroli",
        "newimages-summary": "Halaman istimewa berikut menampilkan daftar berkas yang terakhir dimuat",
        "newimages-legend": "Penyaring",
        "newimages-label": "Nama berkas (atau sebagian dari nama berkas):",
-       "showhidebots": "($1 bot)",
        "noimages": "Tidak ada yang dilihat.",
        "ilsubmit": "Cari",
        "bydate": "berdasarkan tanggal",
        "autosumm-replace": "←Mengganti halaman dengan '$1'",
        "autoredircomment": "←Mengalihkan ke [[$1]]",
        "autosumm-new": "←Membuat halaman berisi '$1'",
-       "livepreview-loading": "Mengunggah...",
-       "livepreview-ready": "Memuat… Selesai!",
-       "livepreview-failed": "Pratayang langsung gagal!\nCoba dengan pratayang normal.",
-       "livepreview-error": "Gagal tersambung: $1 \"$2\".\nCoba dengan pratayang normal.",
        "lag-warn-normal": "Perubahan yang lebih baru dari $1 {{PLURAL:$1|detik|detik}} mungkin tidak muncul di daftar ini.",
        "lag-warn-high": "Karenanya besarnya keterlambatan basis data server, perubahan yang lebih baru dari $1 {{PLURAL:$1|detik|detik}} mungkin tidak muncul di daftar ini.",
-       "watchlistedit-numitems": "Daftar pantauan Anda berisi {{PLURAL:$1|1 judul|$1 judul}}, tidak termasuk halaman pembicaraan.",
-       "watchlistedit-noitems": "Daftar pantauan Anda kosong.",
        "watchlistedit-normal-title": "Sunting daftar pantauan",
        "watchlistedit-normal-legend": "Hapus judul dari daftar pantauan",
        "watchlistedit-normal-explain": "Judul pada daftar pantauan Anda ditampilkan di bawah ini.\nUntuk menghapus judul, berikan tanda cek pada kotak di sampingnya, dan klik \"{{int:Watchlistedit-normal-submit}}\".\nAnda juga dapat [[Special:EditWatchlist/raw|menyunting daftar mentahnya]].",
        "compare-invalid-title": "Judul yang Anda berikan tidak sah.",
        "compare-title-not-exists": "Judul yang Anda minta tidak ada.",
        "compare-revision-not-exists": "Revisi yang Anda minta tidak ada.",
-       "dberr-header": "Wiki ini bermasalah",
        "dberr-problems": "Maaf! Situs ini mengalami masalah teknis.",
        "dberr-again": "Cobalah menunggu beberapa menit dan muat ulang.",
        "dberr-info": "(Tak dapat tersambung dengan server basis data: $1)",
        "htmlform-no": "Tidak",
        "htmlform-yes": "Ya",
        "htmlform-chosen-placeholder": "Pilih opsi",
+       "htmlform-cloner-create": "Tambahkan lebih banyak",
+       "htmlform-cloner-delete": "Hapus",
+       "htmlform-cloner-required": "Paling sedikit satu nilai diperlukan.",
        "sqlite-has-fts": "$1 dengan dukungan pencarian teks lengkap",
        "sqlite-no-fts": "$1 tanpa dukungan pencarian teks lengkap",
        "logentry-delete-delete": "$1 {{GENDER:$2|menghapus}} halaman $3",
index 6ff22d9..ba845bb 100644 (file)
@@ -10,7 +10,8 @@
                        "Remember the dot",
                        "Renan",
                        "Valodnieks",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Ultracatenun:",
@@ -23,7 +24,6 @@
        "tog-showtoolbar": "Monstrar barre de redactional utensiles",
        "tog-editondblclick": "Redacter págines per duplic clacca",
        "tog-editsectiononrightclick": "Redacter singul sectiones per dextri clacca",
-       "tog-rememberpassword": "Memorar mi registre in ti computator (por um max de $1 {{PLURAL:$1|die|dies}})",
        "tog-watchcreations": "Automaticmen viligar págines e files, queles yo ha creat.",
        "tog-watchdefault": "Automaticmen vigilar págines e files, queles yo ha redactet.",
        "tog-watchmoves": "Automaticmen vigilar págines e files, queles yo move.",
        "recentchanges-label-bot": "Ti redaction esset efectuat per un machine",
        "recentchanges-label-unpatrolled": "Ti redaction ne have ancor esset protectet",
        "rcnotefrom": "In infra es li changes desde '''$2''' (ad-supra por '''$1''' monstrat).",
-       "rclistfrom": "Monstrar li nov modificationes desde $1.",
+       "rclistfrom": "Monstrar li nov modificationes desde $3 $2",
        "rcshowhideminor": "$1 redactiones minori",
        "rcshowhidebots": "$1 machines",
        "rcshowhideliu": "$1 usatores registrat",
        "watchlist-details": "{{PLURAL:$1|$1 págine|$1 págines}} in tui liste de págines vigilat, sin págines de discussion.",
        "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'''",
-       "watchmethod-recent": "controlant nov redactiones por págines vigilat",
-       "watchmethod-list": "controlant págines vigilat por nov redactiones",
-       "watchlistcontains": "Tui liste de págines vigilat contene $1 {{PLURAL:$1|págine|págines}}.",
        "wlshowlast": "Monstra ultim $1 hores $2 dies $3",
        "watchlist-options": "Optiones de liste de págines vigilat",
        "watching": "Vigilant...",
        "table_pager_limit_label": "Detallies por págine",
        "table_pager_limit_submit": "Ear",
        "table_pager_empty": "Nequant resultates",
-       "watchlistedit-numitems": "Tui liste de págines vigilat contene {{PLURAL:$1|1 titul|$1 titules}}, excludent págines de discussion.",
-       "watchlistedit-noitems": "Tui liste de págines vigilat ne contene titules.",
        "watchlistedit-normal-title": "Redacter liste de págines vigilat",
        "watchlistedit-normal-legend": "Remove titules del liste de págines vigilat",
        "watchlistedit-normal-explain": "Titules in tui liste de págines vigilat es monstrat infra.\nPor remover un titul, controla li buxe proxim por it, e clacca \"{{int:Watchlistedit-normal-submit}}\".\nVu posse anc [[Special:EditWatchlist/raw|redacter li liste vulnerosi]].",
index 0d11b36..0289610 100644 (file)
@@ -2,7 +2,8 @@
        "@metadata": {
                "authors": [
                        "Reedy",
-                       "Ukabia"
+                       "Ukabia",
+                       "아라"
                ]
        },
        "tog-underline": "Okpürụ ahiri jikodo:",
@@ -15,7 +16,6 @@
        "tog-showtoolbar": "Zi igbe orü (Í gí nwere JavaScript)",
        "tog-editondblclick": "Rüwá na élu ihü mgbe I kpạtạrạ (ö chọrọ JavaScript)",
        "tog-editsectiononrightclick": "Kpa na áká nri Í gbanyé orürü nkeji na ishi nkeji (ö chọrọ JavaScript)",
-       "tog-rememberpassword": "Chetá edemede éjim a banyé na orunótuá (nke ukwu nke rürü {{PLURAL:$1|chi|chi}} $1)",
        "tog-watchcreations": "Tinyé ihüm na eké na ndetu ihem ne lé",
        "tog-watchdefault": "Tinyé ihü m na rüoru élu na ndetu ihem ne lé",
        "tog-watchmoves": "Tinyé ihü m na puzié na ndetu ihe m ne lé",
        "missingarticle-diff": "(Íchè: $1, $2)",
        "internalerror": "Nsogbu ime ime",
        "internalerror_info": "Nsogbu ime ime: $1",
-       "fileappenderrorread": "Ènwéghíkí gú \"$1\" mgbe ọ nè tinyé tu ihe.",
-       "fileappenderror": "Enwerịkị tinyé \"$1\" gá \"$2\".",
        "filecopyerror": "enwerịkị jë usòrò \"$1\" ko bu \"$2\".",
        "filerenameerror": "Enwerịkị guwaria áhạ usòrò \"$1\" ko bu \"$2\".",
        "filedeleteerror": "Enwerịkị kàchafu usòrò ''$1''.",
        "directorycreateerror": "Enwerịkị ké usoro ''$1''.",
        "filenotfound": "Enwerịkị tü usòrò ''$1''.",
-       "fileexistserror": "Ènwéghịkị dé nà usòrò \"$1\": ùsòrò nọ",
        "unexpected": "Onuogụgụ amághị o ga fụtá: ''$1''=''$2''.",
        "formerror": "Nsogbu di: a nwere I ki nyefwuör edemede nka",
        "badarticleerror": "Áká nke ènwèghịkị mẹ nà ihü nke.",
        "savearticle": "Domá ihüa",
        "preview": "Lètú",
        "showpreview": "Létu ntakìrí",
-       "showlivepreview": "Létu ntakìrí otu o dị ubwá",
        "showdiff": "Zi ihe gbanwere",
        "anoneditwarning": "'''Kpàchákwá anya:''' Ị bághị bo.\nIP gi gí détụ na ákíkó mbu ihü a.",
        "missingcommenttext": "Biko tinyé ótù okwu na àlà nga.",
        "searchall": "nke níle",
        "powersearch-legend": "Nchöwá nkè íshí",
        "powersearch-ns": "Tuo na ímé:",
-       "powersearch-redir": "Dètú nkúfù",
        "powersearch-togglelabel": "Lechányá:",
        "powersearch-toggleall": "Haníle",
        "powersearch-togglenone": "Efù",
        "recentchanges-feed-description": "Chóputà ihe ógẹ ǹsò na wiki ímé órírí nke á.",
        "recentchanges-label-minor": "Ihe bu orü ntakírí",
        "recentchanges-legend-newpage": "$1 - ihü ohúrù",
-       "rclistfrom": "Zìrí ihe gbanwere ọhúrù shí $1",
+       "rclistfrom": "Zìrí ihe gbanwere ọhúrù shí $3 $2",
        "rcshowhideminor": "orü ntákírí $1",
        "rcshowhidebots": "bot $1",
        "rcshowhideliu": "Ndi né ké dị $1 di íme",
        "table_pager_empty": "Odígị ihe fútárá",
        "autosumm-blank": "Melá ihü ochá",
        "autosumm-new": "Jiri '$1' kere ihü",
-       "livepreview-loading": "Ọ biágó...",
-       "livepreview-ready": "O na biá... Ojikobala!",
        "watchlistedit-normal-title": "Rüó na ndétu ihe Í nè lé",
        "watchlistedit-raw-titles": "Ishi edemede:",
        "watchlistedit-raw-submit": "Kuwaria ndetu ihem ne lé",
        "compare-rev1": "Orübà 1",
        "compare-rev2": "Orübà 2",
        "compare-submit": "Má àtù",
-       "dberr-header": "Wiki nka nwere nsogbu",
        "dberr-problems": "Ndó! Ámá nka nwere nsogbu ime ime.",
        "htmlform-required": "Ọgụgụ nke gi dị",
        "htmlform-submit": "Dànyé",
index 49a9eec..2fc82c4 100644 (file)
@@ -6,7 +6,8 @@
                        "Lam-ang",
                        "Saluyot",
                        "Urhixidur",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Pinag-ugisan ti silpo:",
@@ -19,7 +20,6 @@
        "tog-showtoolbar": "Ipakita ti baras ti ramit ti panag-urnos",
        "tog-editondblclick": "Urnosen dagiti panid iti mamindua a panagpindut",
        "tog-editsectiononrightclick": "Pakabaelan ti panag-urnos ti paset babaen ti kanawan a panagpindut kadagiti titulo ti paset",
-       "tog-rememberpassword": "Laglagipem ti iseserrekko iti daytoy a pagbasabasa (iti kapaut nga $1 {{PLURAL:$1|aldaw|al-aldaw}})",
        "tog-watchcreations": "Agnayon kadagiti panid a pinartuatko ken papeles nga inkargak idiay listaan ti bambantayak",
        "tog-watchdefault": "Agnayon kadagiti panid ken papeles nga inurnosko idiay listaan ti bambantayak",
        "tog-watchmoves": "Agnayon kadagiti panid ken papeles nga inyalisko idiay listaan ti bambantayak",
        "permalink": "Agnanayon a silpo",
        "print": "Imaldit",
        "view": "Kitaen",
+       "view-foreign": "Kitaen idiay $1",
        "edit": "Urnosen",
+       "edit-local": "Urnosen ti lokal a deskripsion",
        "create": "Agaramid",
+       "create-local": "Agnayon ti lokal a deskripsion",
        "editthispage": "Urnosen daytoy a panid",
        "create-this-page": "Partuaten daytoy a panid",
        "delete": "Ikkaten",
        "jumptonavigation": "pagdaliasatan",
        "jumptosearch": "biruken",
        "view-pool-error": "Pasensian, dagiti servers ket nadagsenan unay tattan.\nAdu unay dagiti agar-aramat nga agbuy-buya ti daytoy a panid.\nPangaasi nga agurayka met bassit sakbay a padasem manen ti mangserrek daytoy a panid.\n\n$1",
+       "generic-pool-error": "Pasensian, dagiti server ket agdama a nadagsenan unay.\nAdu unay dagiti agar-aramat nga agbuybuya ti daytoy a rekurso.\nPangngaasi nga agurayka bassit sakbay a padasem manen a serrekan daytoy a rekurso.",
        "pool-timeout": "Madamdama agur-uray para iti kandado",
        "pool-queuefull": "Napunnon ti nagyanan ti pagur-urayan",
        "pool-errorunknown": "Di am-ammo a biddut",
+       "pool-servererror": "Ti serbisio ti pagbilangan ti pisina ket saan a magun-od ($1).",
        "aboutsite": "Maipanggep ti {{SITENAME}}",
        "aboutpage": "Project:Maipanggep",
        "copyright": "Ti linaon ket magun-od babaen ti $1 malaksid no adda sabali a naibaga.",
        "readonly_lag": "Automatiko a narikpan ti database kabayatan a dagiti tagabu a database server ket kumamakam iti agturay",
        "internalerror": "Akin-uneg a biddut",
        "internalerror_info": "Akin-uneg a biddut: $1",
-       "fileappenderrorread": "Saan a mabasa ti \"$1\" iti las-ud ti panagnayon.",
-       "fileappenderror": "Saan a makanayon ti \"$1\" iti  \"$2\".",
        "filecopyerror": "Saan a makopia ti papeles $1 iti $2.",
        "filerenameerror": "Saan a managanan manen ti papeles \"$1\" iti \"$2\".",
        "filedeleteerror": "Saan a maikkat ti papeles  \"$1\".",
        "directorycreateerror": "Saan a maaramid ti direktorio \"$1\".",
        "filenotfound": "Saan a mabirukan ti papeles \"$1\".",
-       "fileexistserror": "Di mabalin a maisurat ti papeles \"$1\": Adda kastan a papeles.",
        "unexpected": "Di mapakpakadaaan a pateg: \"$1\"=\"$2\".",
        "formerror": "Biddut: saan a maited ti porma.",
        "badarticleerror": "Saan a matungpal daytoy nga aramid iti daytoy a panid.",
        "gotaccountlink": "Sumrek",
        "userlogin-resetlink": "Nalipatam dagiti salaysay ti pagserrekmo?",
        "userlogin-resetpassword-link": "Nalipatam ti kontraseniasmo?",
+       "userlogin-helplink2": "Tulong iti panagserrek",
        "userlogin-loggedin": "Nakastrekkan a kas ni {{GENDER:$1|$1}}.\nUsaren ti porma dita baba tapno sumrek a kas sabali nga agar-aramat.",
        "userlogin-createanother": "Agaramid pay ti sabali a pakabilangan",
-       "createacct-join": "Ikabil ti pakaammom dita baba.",
-       "createacct-another-join": "Ikabil ti pakaammo ti baro a pakabilangan dita baba.",
        "createacct-emailrequired": "Esurat a pagtaengan",
        "createacct-emailoptional": "Esurat a pagtaengan (pagpilian)",
        "createacct-email-ph": "Ikabil ti esurat a pagtaengam",
        "resetpass-abort-generic": "Ti panagsukat ti kontrasenias ket pinasardeng babaen ti maysa a pagpaatiddog.",
        "resetpass-expired": "Nagpason ti kontraseniasmo. Pangngaasi a mangiyasentar ti baro a kontrasenias tapno makastrek.",
        "resetpass-expired-soft": "Nagpason ti kontraseniasmo, ken nasken a maiyasentar manen. Pangngaasi nga agpili tattan ti baro a kontrasenias, wenno pinduten ti \"{{int:resetpass-submit-cancel}}\"  tapno maiyasentarto intono madamdama.",
+       "resetpass-validity-soft": "Saan nga umiso ti kontraseniasmo: $1\n\nAgpilika tattan ti baro a kontrasenias, wenno pinduten ti \"{{int:resetpass-submit-cancel}}\" tapno isaad intono madamdama.",
        "passwordreset": "Iyasentar manen ti kontrasenias",
        "passwordreset-text-one": "Lippasem daytoy a porma tapno maiyasentar manen ti bukodmo a kontrasenias.",
        "passwordreset-text-many": "{{PLURAL:$1|Agpunno ti maysa kadagiti pagikabilan tapno makaawat ti temporario a kontrasenias babaen ti esurat.}}",
        "savearticle": "Idulin ti panid",
        "preview": "Ipadas",
        "showpreview": "Ipakita ti ipadas",
-       "showlivepreview": "Agdama nga ipadas",
        "showdiff": "Ipakita dagiti sinukatan",
        "anoneditwarning": "'''Ballaag:''' Saanka a nakastrek.\nMairehistro ti IP a pagtaengam iti pakasaritaan ti panagurnos iti daytoy a panid.",
        "anonpreviewwarning": "\" Saanka a nakastrek. Ti panagidulin ket agirehistro ti IP a pagtaengam kadagitoy a  pakasaritaan ti panagurnos iti daytoy a panid.\"",
        "edit-gone-missing": "Saan a mapabaro daytoy a panid.\nKasla met naikkaten.",
        "edit-conflict": "Adda kasinnungat ti panag-urnos.",
        "edit-no-change": "Ti inurnosmo ket saan a naikaskaso, ngamin ket awan ti nasukatan a testo.",
-       "postedit-confirmation": "Ti inurnosmo ket naidulinen.",
+       "postedit-confirmation-created": "Ti panid ket napartuaten.",
+       "postedit-confirmation-restored": "Ti panid ket naisublin.",
+       "postedit-confirmation-saved": "Ti inurnosmo ket naidulinen.",
        "edit-already-exists": "Saan a makaaramid ti baro a panid.\nAdda met daytoyen.",
        "defaultmessagetext": "Kasisigud a testo ti mensahe",
        "content-failed-to-parse": "Napaay a nausig ti $2 a linaon para iti $1 a modelo: $3",
        "parser-template-recursion-depth-warning": "Ti kinauneg ti panagdullit ti plantilia ket nagpatingga ti napalabes ($1)",
        "language-converter-depth-warning": "Ti kauneg ti panagaramid ti pagsasao ket napalabes ti agpatingga a ($1)",
        "node-count-exceeded-category": "Dagiti panid a simmurok ti bilang ti nodo",
+       "node-count-exceeded-category-desc": "Ti kategoria para kadagiti panid a nalabsan ti bilang ti nodo.",
        "node-count-exceeded-warning": "Ti panid ket nasurokanna ti bilang ti nodo",
        "expansion-depth-exceeded-category": "Dagiti panid a nasurokan ti kauneg ti panagpadakkel",
+       "expansion-depth-exceeded-category-desc": "Daytoy ket kategoria para kadagiti panid a nalabsan ti kauneg ti panagpadakkel.",
        "expansion-depth-exceeded-warning": "Ti panid ket nasurokanna ti kauneg ti panagpadakkel",
        "parser-unstrip-loop-warning": "Adda nakita a di-naukisan a silo",
        "parser-unstrip-recursion-limit": "Ti di-naukisan a panagsumro manen a patingga ket nasurokan ($1)",
        "revdelete-no-file": "Awan dayta nainaganan a papeles.",
        "revdelete-show-file-confirm": "Sigurado kadi a kayatmo ti mangkita ti naikkat a baliwan ti papeles \"<nowiki>$1</nowiki>\" a naggapu idi $2 idi $3?",
        "revdelete-show-file-submit": "Wen",
+       "revdelete-selected-text": "{{PLURAL:$1|Napili a nabaliwan|Dagiti napili a nabaliwan}} iti [[:$2]]:",
+       "revdelete-selected-file": "{{PLURAL:$1|Napili a bersion ti papeles|Dagiti napili a bersion ti papeles}} iti [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|Ti napili a listaan ti napasamak|Dagiti napili a listaan ti napasamak}}:",
        "revdelete-text-text": "Dagiti naikkat a rebision ket agparangto pay laeng iti panid ti pakasaritaan, ngem dagiti paset ti linaonda ket saanton a publiko a maserrekan.",
        "revdelete-text-file": "Dagiti naikkat a bersion ti papeles ket agparangto pay laeng iti pakasaritaan ti papeles, ngem dagiti paset ti linaonda ket saanton a publiko a maserrekan.",
        "searchmenu-exists": "'''Adda panid a nanaganan ti \"[[:$1]]\" iti daytoy a wiki.'''",
        "searchmenu-new": "<strong>Partuaten ti panid ti \"[[:$1]]\" iti daytoy a wiki!</strong> {{PLURAL:$2|0=|Kitaen pay ti panid a nabirukan ti panagbirukmo.|Kitaen pay dagiti resulta a nabirukan ti panagbiruk.}}",
        "searchprofile-articles": "Dagiti naglaon a panid",
-       "searchprofile-project": "Tulong ken Gandat a pampanid",
        "searchprofile-images": "Sabsabali a midia",
        "searchprofile-everything": "Amin amin",
        "searchprofile-advanced": "Napasayaat",
        "searchprofile-articles-tooltip": "Agbirukka idiay $1",
-       "searchprofile-project-tooltip": "Agbirukka idiay $1",
        "searchprofile-images-tooltip": "Agbirukka para iti papeles",
        "searchprofile-everything-tooltip": "Birukem amin a linaon (uray dagiti makipatangan a panid)",
        "searchprofile-advanced-tooltip": "Agbirukka kadagiti naiduma a \"nagan ti espasio\"",
        "search-nonefound": "Awan ti nagbanagan a kapadpada ti sinapul.",
        "powersearch-legend": "Napasayat a panagbiruk",
        "powersearch-ns": "Agbirukka kadagiti nagan ti espasio:",
-       "powersearch-redir": "Ilista dagiti baw-ing",
        "powersearch-togglelabel": "Markaan:",
        "powersearch-toggleall": "Amin",
        "powersearch-togglenone": "Awan",
        "prefs-emailconfirm-label": "Pammasingked ti esurat:",
        "youremail": "Esurat:",
        "username": "{{GENDER:$1|Nagan ti agar-aramat}}:",
-       "uid": "ID ti {{GENDER:$1|Agar-aramat}}:",
        "prefs-memberingroups": "{{GENDER:$2|Kameng}} ti {{PLURAL:$1|a grupo|a grupgrupo}}:",
        "prefs-registration": "Oras a nagrehistro:",
        "yourrealname": "Pudno a nagan:",
        "prefs-advancedsearchoptions": "Dagiti napasayaat a pagpilian",
        "prefs-advancedwatchlist": "Dagiti napasayaat a pagpilian",
        "prefs-displayrc": "Ipakita dagiti pagpilian",
-       "prefs-displaysearchoptions": "Ipakita dagiti pagpilian",
        "prefs-displaywatchlist": "Ipakita dagiti pagpilian",
        "prefs-tokenwatchlist": "Tandaan",
        "prefs-diffs": "Sabali",
        "right-move": "Iyalis dagiti panid",
        "right-move-subpages": "Iyalis dagiti panid a kakuyog dagiti subpanidda.",
        "right-move-rootuserpages": "Iyalis dagiti ramut a panid ti agar-aramat",
+       "right-move-categorypages": "Iyalis ti pampanid ti kategoria",
        "right-movefile": "Iyalis dagiti papeles",
        "right-suppressredirect": "Saan nga agaramid ti baw-ing a naggapo iti taudan no iyalis dagiti panid",
        "right-upload": "Agipan ti papeles",
        "action-createpage": "agpartuat kadagiti panid",
        "action-createtalk": "agaramid kadagiti pagtungtungan a panid",
        "action-createaccount": "agpartuat ti pakabilangan daytoy nga agar-aramat",
+       "action-history": "kitaen ti pakasaritaan daytoy a panid",
        "action-minoredit": "markaam a bassit nga urnos daytoy",
        "action-move": "iyalis daytoy a panid",
        "action-move-subpages": "iyalis daytoy a panid, ken dagiti subpanidna",
        "action-move-rootuserpages": "iyalis dagiti ramut a panid ti agar-aramat",
+       "action-move-categorypages": "iyalis ti pampanid ti kategoria",
        "action-movefile": "iyalis daytoy a papeles",
        "action-upload": "ikarga daytoy a papeles",
        "action-reupload": "suratam manen dagiti adda a papeles",
        "recentchanges-legend-heading": "'''Leyenda:'''",
        "recentchanges-legend-newpage": "(kitaen pay ti [[Special:NewPages|listaan ti baro a pampanid]])",
        "rcnotefrom": "Dita baba ket dagiti sinukatan manipud idi strong>$2</strong> (agingga iti <strong>$1</strong> a naipakita).",
-       "rclistfrom": "Ipakita dagiti kabarbaro a sinukatan a mangrugi manipud idi $1",
+       "rclistfrom": "Ipakita dagiti kabarbaro a sinukatan a mangrugi manipud idi $3 $2",
        "rcshowhideminor": "$1 dagiti bassit a panag-urnos",
        "rcshowhideminor-show": "Ipakita",
        "rcshowhideminor-hide": "Ilemmeng",
        "uploadstash-refresh": "Pasadiwaam dagiti listaan ti papeles",
        "invalid-chunk-offset": "Imbalido ti maysa a tangdan",
        "img-auth-accessdenied": "naiparit ti iseserrek",
-       "img-auth-nopathinfo": "Ti servermo ket mabalin nga agipasa iti daytoy a pakaammo.\nBaka met laeng naibasta ti CGI ken saan na a tapayaen ti img_auth.\nKitaen ti https://www.mediawiki.org/wiki/Manual:Image_Authorization .",
+       "img-auth-nopathinfo": "Ti servermo ket mabalin nga agipasa iti daytoy a pakaammo.\nBaka met laeng naibasta ti CGI ken saan na a tapayaen ti img_auth.\nKitaen ti https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization .",
        "img-auth-notindir": "Ti kiniddaw a dalan ket saan a ti naaramid a direktorio ti pag-ipan",
        "img-auth-badtitle": "Saan a makaaramid ti umisu a titulo a naggapu idiay \"$1\".",
        "img-auth-nologinnWL": "Saanka a nakastrek ken ti \"$1\" ket awan idiay mabalin a listaan.",
        "download": "ikarga",
        "unwatchedpages": "Di mabambantayan a pampanid",
        "listredirects": "Listaan dagiti baw-ing",
+       "listduplicatedfiles": "Listaan dagiti papeles nga addaan kadagiti duplikado",
+       "listduplicatedfiles-summary": "Daytoy ket listaan dagiti papeles a ti kaudian unay a bersion ti papeles ket duplikado ti kaudian unay a bersion iti sabali a papeles. Dagiti laeng lokal a papeles ti maikeddeng.",
+       "listduplicatedfiles-entry": "Ti [[:File:$1|$1]] ket addaan [[$3|{{PLURAL:$2|iti duplikado|kadagiti $2 a duplikado}}]].",
        "unusedtemplates": "Dagiti saan a nausar a plantilia",
        "unusedtemplatestext": "Daytoy a panid ket ilistana dagiti panid idiay {{ns:template}} a nagan ti espasio a saan a nairaman iti sabali a panid.\nLaglagipem ti agkita kadagiti sabsabali a silpo ti plantilia sakbay nga ikkatem ida.",
        "unusedtemplateswlh": "dagiti sabali a silpo",
        "pageswithprop-prophidden-binary": "binario a pateg ti tagikua a nailemmeng ($1)",
        "doubleredirects": "Dagiti namindua a naibaw-ing",
        "doubleredirectstext": "Daytoy a panid ket ilistana dagiti panid nga agbaw-ing kadagiti sabsabali a baw-ing a pampanid.\nIti tunggal maysa nga aray ket adda nagyanna kadagiti silpo iti umuna ken maikadua a baw-ing, ken iti puntaan iti maikadua a baw-ing, nga isu ti \"pudno\" a puntaan ti panid, nga ti umuna a baw-ing ket isu ti ipatudona.\n<del>Nakurosan</del> dagita naikabil ket napadtuan.",
-       "double-redirect-fixed-move": "Ti [[$1]] ket naiyalisen.\nTattan ket naibaw-ing idiay [[$2]].",
-       "double-redirect-fixed-maintenance": "Simsimpaen dagiti namindua a naibaw-ing a naggapo idiay [[$1]] nga ipan idiay [[$2]].",
+       "double-redirect-fixed-move": "Naiyalisen ti [[$1]].\nAutomatiko idi a napabaro ken naibaw-ing tattan idiay [[$2]].",
+       "double-redirect-fixed-maintenance": "Automatiko a simsimpaen ti doble a baw-ing manipud ti [[$1]] idiay [[$2]] iti panagtaripato nga obra.",
        "double-redirect-fixer": "Panagsimpa ti baw-ing",
        "brokenredirects": "Dagiti naputed a baw-ing",
        "brokenredirectstext": "Dagitoy sumaganad a baw-ing ket nakasilpo kadagiti awan a panid:",
        "deadendpagestext": "Dagitoy a pampanid ket saan a nakasilpo ti sabali a pampanid ditoy {{SITENAME}} .",
        "protectedpages": "Dagiti nasalakniban a panid",
        "protectedpages-indef": "Inggat ingana a salakniban laeng",
-       "protectedpages-summary": "Daytoy a panid ket ilistana dagiti adda a panid nga agdama a nasalakniban. Para iti listaan dagiti titulo a nasalakniban manipud ti pannakapartuat, kitaen ti [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
+       "protectedpages-summary": "Daytoy a panid ket ilistana dagiti panid nga agdama a nasalakniban. Para iti listaan dagiti titulo a nasalakniban manipud ti pannakapartuat, kitaen ti [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "protectedpages-cascade": "Dagiti sariap a salaknib laeng",
        "protectedpages-noredirect": "Ilemmeng dagiti baw-ing",
        "protectedpagesempty": "Awan ti pampanid nga agdama a nasalakniban babaen kadagitoy a parametro.",
        "protectedpages-unknown-timestamp": "Di ammo",
        "protectedpages-unknown-performer": "Di ammo nga agar-aramat",
        "protectedtitles": "Dagiti nasalakniban a titulo",
-       "protectedtitles-summary": "Daytoy a panid ket ilistana dagiti titulo nga agdama a nasalakniban manipud ti pannakapartuat. Para iti listaan dagiti adda a panid a nasalakniban, kitaen ti [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
+       "protectedtitles-summary": "Daytoy a panid ket ilistana dagiti titulo nga agdama a nasalakniban manipud ti pannakapartuat. Para iti listaan dagiti adda a panid a nasalakniban, kitaen ti  [[{{#special:ProtectedPages}}|{{int:protectedpages}}]]..",
        "protectedtitlesempty": "Awan dagiti titulo nga agdama a nasalakniban iti dagitoy a parametro.",
        "listusers": "Listaan dagiti agar-aramat",
        "listusers-editsonly": "Ipakita laeng dagiti agar-aramat nga adda inurnosda",
        "log-title-wildcard": "Agsapul kadagiti titulo nga agrugi iti daytoy a testo",
        "showhideselectedlogentries": "Ipakita/ilemmeng dagiti napili a naikabil ti listaan",
        "allpages": "Amin a pampanid",
-       "alphaindexline": "$1 iti $2",
        "nextpage": "sumaruno a panid ($1)",
        "prevpage": "Napalabas a panid ($1)",
        "allpagesfrom": "Ipakita dagiti panid a mangrugi iti:",
        "listgrouprights-removegroup-self": "Agikkat ti {{PLURAL:$2|a grupo|kadagiti grupo}} manipud ti bukod a pakabilangan: $1",
        "listgrouprights-addgroup-self-all": "Inayon amin dagiti grupo iti bukod a pakabilangan",
        "listgrouprights-removegroup-self-all": "Ikkatem amin dagiti grupo manipud ti bukod a pakabilangan",
+       "listgrouprights-namespaceprotection-header": "Dagiti panangigawid ti nagan ti espasio",
+       "listgrouprights-namespaceprotection-namespace": "Nagan ti espasio",
+       "listgrouprights-namespaceprotection-restrictedto": "Karbengan wenno karkarbengan a mangpalubos nga agurnos ti agar-aramat",
+       "trackingcategories": "Pagsurotan a katkategoria",
+       "trackingcategories-summary": "Daytoy a panid ket ilistana ti pagsurotan a katkategoria nga automatiko a nayonan babaen ti sopwer ti MediaWiki. Ti nagnaganda ket mabalin a mabaliwan babaen ti panagbaliw kadagiti maitutop a mensahe ti sistema iti nagan ti espasio ti {{ns:8}}.",
+       "trackingcategories-msg": "Pagsurotan a kategoria",
+       "trackingcategories-name": "Nagan ti mensahe",
+       "trackingcategories-desc": "Kriteria ti panangiraman ti kategoria",
+       "noindex-category-desc": "Ti panid ket saan naipagsurotan babaen dagiti robot gapu ta addaan iti salamangka a balikas ti <code><nowiki>__NOINDEX__</nowiki></code> ken adda iti nagan ti espasio a maipalubos ti wagayway.",
+       "index-category-desc": "Ti panid ket addaan iti <code><nowiki>__INDEX__</nowiki></code> (ken adda iti nagan ti espasio a maipalubos ti wagayway), ken isu a naipagsurotan babaen dagiti robot ngem no iti kadawyan ket saan.",
+       "post-expand-template-inclusion-category-desc": "Kalpasan ti panagpadakkel kadagiti amin a plantilia, ti kadakkel ti panid ket dakdakkel ngem ti <code>$wgMaxArticleSize</code>, isu a dagiti plantilia ket saan a napadakkel.",
+       "post-expand-template-argument-category-desc": "Kalpasan ti panagpadakkel ti argumento ti plantilia (dagiti addaan iti tallo a pangrikep, kasla ti <code>{{{Foo}}}</code>), ti panid ket dakdakkel ngem ti <code>$wgMaxArticleSize</code>.",
+       "expensive-parserfunction-category-desc": "Adu unay dagiti nangina nga annong ti parser (kasla ti <code>#ifexist</code>) a nairaman iti panid. Kitaen ti[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "broken-file-category-desc": "Kategoria a nainayon no ti panid ket aglaon ti nadadael a silpo ti papeles (ti silpo a panangisengngat ti papeles no awan ti papeles).",
+       "hidden-category-category-desc": "Daytoy ket kategoria nga addaan iti <code><nowiki>__HIDDENCAT__</nowiki></code> , a mangpawil daytoy nga agparang kadagiti silpo ti kahon ti kategoria kadagiti panid, bbabaen ti kasisigud.",
+       "trackingcategories-nodesc": "Awan ti magun-od a deskripsion.",
+       "trackingcategories-disabled": "Nabaldado ti kategoria",
        "mailnologin": "Awan ti pagipatulodan a pagtaengan",
        "mailnologintext": "Masapul a [[Special:UserLogin|nakastrekka]] ken adda umisu nga esurat a pagtaengan idiay [[Special:Preferences|kaykayatmo]] ti agipatulod ti esurat kadagiti sabsabali nga agar-aramat.",
        "emailuser": "Esuratan daytoy nga agar-aramat",
        "watchnologin": "Saan a nakastrek",
        "addwatch": "Inayon iti bambantayan",
        "addedwatchtext": "Ti panid iti \"[[:$1]]\" ket nainayonen idiay [[Special:Watchlist|listaan ti bambantayam]].\nDagiti masakbayan a panagsukat iti daytoy a panid ken dagiti mainaig a tungtunganna a panid ket mailistanto idiay.",
+       "addedwatchtext-short": "Ti panid ti \"$1\" ket nainayonen iti listaan ti bambantayam.",
        "removewatch": "Ikkaten dita bambantayan",
        "removedwatchtext": "Daytoy a panid  \"[[:$1]]\" ket naikkat idiay [[Special:Watchlist|bambantayam]].",
+       "removedwatchtext-short": "Ti panid ti \"$1\" ket naikkaten manipud ti listaan ti bambantayam.",
        "watch": "bantayan",
        "watchthispage": "Bantayan daytoy a panid",
        "unwatch": "Saanen a bantayan",
        "unwatchthispage": "Isardeng a bantayan daytoy a panid",
        "notanarticle": "Saan a naglaon a panid",
        "notvisiblerev": "Ti panagbalbaliw ti sabali nga agar-aramat ket naikkaten",
-       "watchlist-details": "{{PLURAL:$1|$1 panid|$1 dagiti panid}} a bambantayam, saan a mairaman dagiti panid ti tungtungan.",
+       "watchlist-details": "{{PLURAL:$1|$1 panid|$1 dagiti panid}} a bambantayam, saan a naisina a mairaman dagiti panid ti tungtungan.",
        "wlheader-enotif": "Napakabaelan ti panangipakaammo ti esurat.",
        "wlheader-showupdated": "Dagiti panid a nasukatanen manipud ti kinaudi a panagsarungkarmo ket naipakita iti '''napuskol'''",
-       "watchmethod-recent": "kitkitaen dagiti kinaudi nga inurnos kadagiti bambantayan a panid",
-       "watchmethod-list": "kitkitaen dagiti bambantayan a panid kadagiti kinaudi nga inurnos",
-       "watchlistcontains": "Ti listaan ti bambantayam ket aglaon ti $1 {{PLURAL:$1|a panid|a pampanid}}.",
-       "iteminvalidname": "Parikut iti banag '$1', imbalido a nagan...",
        "wlnote2": "Dita baba ket dagiti binalbaliwan {{PLURAL:$1|iti napalabas nga oras|kadagiti napalabas a <strong>$1</strong> nga oras}}, manipud idi $2, $3.",
        "wlshowlast": "Ipakita dagiti naudi a $1 nga or-oras $2 nga al-aldaw $3",
        "watchlist-options": "Dagiti pagpilian ti listaan a bambantayan",
        "enotif_lastvisited": "Kitaen ti $1 para iti am-amin a panagsukat sipud ti naudi nga isasarungkarmo.",
        "enotif_lastdiff": "Kitaen ti $1 tapno mabuya daytoy a panagsukat.",
        "enotif_anon_editor": "di am-ammo nga agar-aramat $1",
-       "enotif_body": "Nadungngo a $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nPakabuklan ti mannurat: $PAGESUMMARY $PAGEMINOREDIT\n\nKontaken ti mannurat:\nsurat: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nAwanton dagiti sabali a pakaammo iti kaso ti adu pay a panagtigtignay malaksid no sarungkaram datoy a panid bayat a nakastrekka. Mabalinmo pay nga iyasentar manen dagiti wagayway ti pakaammo para kadagiti amin a bambantayam a panid idiay listaan ti bambantayam.\n\nTi mannakigayyem a sistema ti panagpaammo ti {{SITENAME}} \n\n--\nTi panagsukat ti kasasaad ti esurat a pagpa-ammom, sarungkaram ti\n{{canonicalurl:{{#special:Preferences}}}}\n\nTi panagsukat kadagiti kasasaad ti bambantayam, sarungkaram ti\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nTi panag-ikkat ti panid kadagiti bambantayam, sarungkaram ti\n$UNWATCHURL\n\nTi makunkunam ken no masapulmo pay ti tulong:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Nadungngo a $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nPakabuklan ti mannurat: $PAGESUMMARY $PAGEMINOREDIT\n\nKontaken ti mannurat:\nsurat: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nAwanton dagiti sabali a pakaammo iti kaso ti adu pay a panagtigtignay malaksid no sarungkaram datoy a panid bayat a nakastrekka. Mabalinmo pay nga iyasentar manen dagiti wagayway ti pakaammo para kadagiti amin a bambantayam a panid idiay listaan ti bambantayam.\n\nTi mannakigayyem a sistema ti panagpaammo ti {{SITENAME}} \n\n--\nTi panagsukat ti kasasaad ti esurat a pagpa-ammom, sarungkaram ti\n{{canonicalurl:{{#special:Preferences}}}}\n\nTi panagsukat kadagiti kasasaad ti bambantayam, sarungkaram ti\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nTi panag-ikkat ti panid kadagiti bambantayam, sarungkaram ti\n$UNWATCHURL\n\nTi makunkunam ken no masapulmo pay ti tulong:\n$HELPPAGE",
        "created": "naaramid",
        "changed": "nasukatan",
        "deletepage": "Ikkaten ti panid",
        "protect-locked-blocked": "Saanmo a mabalin a sukatan dagiti kita ti salaknib no naserraanka.\nAdda ditoy kadagiti agdama a kasasaad ti panid '''$1''':",
        "protect-locked-dblock": "Ti kita ti salaknib ket saan a masukatan gapu ti agdama a kandado ti database.\nAdda ditoy kadagiti agdama a kasasaad ti panid '''$1''':",
        "protect-locked-access": "Awan ti pammalubos ti pakabilangam a mangsukat kadagiti lessaad ti salaknib ti panid.\nDagitoy dagiti agdama a kasasaad ti panid a '''$1''':",
-       "protect-cascadeon": "Daytoy a panid ket agdama a nasalakniban gapu ta nairaman kadagiti sumaganad a {{PLURAL:$1|panid, nga addaan|pampanid, nga addaan}} ti sipapakat a salaknib ti amin-amin.\nMabalinmo a sukatan ti lessaad ti salaknib daytoy a panid, ngem saanna a tignayen ti salaknib nga amin-amin.",
+       "protect-cascadeon": "Daytoy a panid ket agdama a nasalakniban gapu ta nairaman kadagiti sumaganad a {{PLURAL:$1|panid, nga addaan|pampanid, nga addaan}} iti sipapakat a salaknib a sariap.\nDagiti panagbaliw iti agpang ti salaknib iti daytoy a panid ket saan a mabanagan ti salaknib a sariap.",
        "protect-default": "Palubosan amin nga agar-aramat",
        "protect-fallback": "Palubosan laeng dagiti agar-aramat nga adda iti \"$1\" a pammalubos",
        "protect-level-autoconfirmed": "Palubosan laeng dagiti automatiko a napasingkedan nga agar-aramat",
        "contributions-title": "Inar-aramid ti agar-aramat para kenni $1",
        "mycontris": "Naar-aramid",
        "contribsub2": "Para kenni {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "Ti pakabilangan ti agar-aramat \"$1\" ket saan a nakarehistro.",
        "nocontribs": "Awan ti nasarakan a nasukatan a kapada daytoy a kita.",
        "uctop": "(agdama)",
        "month": "Manipud iti bulan ti (ken nasapsapa pay):",
        "blockip": "Serraan ti agar-aramat",
        "blockip-legend": "Serraan ti agar-aramat",
        "blockiptext": "Usaren ti kinabuklan dita baba tapno maserraan ti panagsurat manipud iti naisangayan nga IP a pagtaengan wenno nagan ti agar-aramat.\nUsaren laeng daytoy tapno pawilan ti bandalismo, ken panagtunos iti [[{{MediaWiki:Policy-url}}|annuroten]].\nIkkan ti naisangayan a rason dita baba (kas pagarigan, dakamaten ti maysa a panid a na-bandalismo) .",
-       "ipadressorusername": "IP a pagtaengan wenno nagan ti agar-aramat:",
+       "ipaddressorusername": "IP a pagtaengan wenno nagan ti agar-aramat:",
        "ipbexpiry": "Agpaso:",
        "ipbreason": "Rason:",
        "ipbreason-dropdown": "*Dagiti kadawyan a rason ti panagserra\n** Agikabil kadagiti  madi a pakaammo\n** Agikkat kadagiti linaon ti pampanid\n** Agikabil ti spam a silpo iti ruar\n** Agikabil ti minamaag/saan a maawatan a pampanid\n** Nabutbuteng a panagkukua /agriribok\n** Agab-abuso kadagiti sabsabali a pakabilangan\n** Saan a maawat a nagan ti agar-aramat",
        "movepagetalktext": "Ti mainaig a tungtungan ti panid ket giddato a maiyalis a karamanna '''malaksid:'''\n*No addan sigud nga awan linaonna a tungtungan ti panid babaen ti baro a nagan, wenno\n*No ikkatem ti kur-itna ti kahon iti baba.\n\nKadagitoy a kaso, masapul nga iyalis wenno itiponmo a manual ti panid no kayatmo.",
        "movearticle": "Iyalis ti panid:",
        "moveuserpage-warning": "'''Ballaag:''' Mangrugrugika nga agiyalis ti panid ti agar-aramat. Pangngaasi a laglapipen a ti panid ket isu laeng ti mabalin nga iyalis ken ti agar-aramat ket ''saan'' a managanan.",
+       "movecategorypage-warning": "<strong>Ballaag:</strong> Mangiyal-aliskan iti panid ti kategoria. Pangngaasi a laglagipen a ti maiyalisto laeng ket ti panid ken ti aniaman a pampanid iti daan a kategoria ket <em>saanto</em> a maikategoria iti baro.",
        "movenologintext": "Masapul a nakarehistroka nga agar-aramat ken [[Special:UserLogin|nakastrek]] tapno makaiyalis iti panid.",
        "movenotallowed": "Awan ti pammalubosmo nga agiyalis kadagiti panid.",
        "movenotallowedfile": "Awan ti pammalubosmo nga agiyalis kadagiti papeles.",
        "cant-move-user-page": "Awan ti pammalubos mo nga agiyalis kadagiti panid ti agar-aramat (malaksid kadaiti subpanid).",
        "cant-move-to-user-page": "Awan ti pammalubos mo nga agiyalis ti panid idiay panid ti agar-aramat (malaksid kadagiti subpanid ti agar-aramat).",
+       "cant-move-category-page": "Awan ti pammalubosmo nga agiyalis kadagiti panid ti kategoria.",
+       "cant-move-to-category-page": "Awan ti pammalubosmo nga agiyalis ti panid iti panid ti kategoria.",
        "newtitle": "Iti baro a titulo:",
        "move-watch": "Bantayan daytoy a panid",
        "movepagebtn": "Iyalis ti panid",
        "tooltip-undo": "\"Ibabawi\" ipasubli daytoy nga urnos ken lukatanna ti kinabuklan ti urnos iti panagpadas. Agpabalin daytoy a mangikabil ti rason idiay pinakabuklan.",
        "tooltip-preferences-save": "Idulin dagiti kakaykayatam",
        "tooltip-summary": "Ikabil ti bassit a pakabuklan",
-       "notacceptable": "Ti server ti wiki ket saan a makaited ti data iti kinabuklan a saan a mabasa ti kliente.",
        "anonymous": "Di am-ammo {{PLURAL:$1|nga agar-aramat|kadagiti agar-aramat}} iti {{SITENAME}}",
        "siteuser": "{{SITENAME}} nga agar-aramat $1",
        "anonuser": "{{SITENAME}} di amammo nga agar-aramat $1",
        "newimages-summary": "Daytoy nga espesial a panid ket ipakitana ti kinaudi a pinag-ipan kadagiti papeles.",
        "newimages-legend": "Sagat",
        "newimages-label": "Nagan ti papeles (wenno paset na) :",
-       "showhidebots": "($1 dagiti bot)",
+       "newimages-showbots": "Ipakita dagiti naikarga babaen dagiti bot",
        "noimages": "Awan ti makita.",
        "ilsubmit": "Biruken",
        "bydate": "babaen ti petsa",
        "autosumm-replace": "Sinukatan ti linaon iti '$1'",
        "autoredircomment": "Naibaw-ing ti panid iti [[$1]]",
        "autosumm-new": "Pinartuat ti panid iti \"$1\"",
-       "livepreview-loading": "Maikarkarga…",
-       "livepreview-ready": "Maikarkarga… Agsagana!",
-       "livepreview-failed": "Napaay ti agdama a panagipadas! \nPadasem ti kadawyan a panagipadas.",
-       "livepreview-error": "Napaay a sumilpo: $1 \"$2\". Padasem ti normal a pinagpadas",
        "lag-warn-normal": "Dagiti panangbalbaliw a nabarbaro ngem $1 {{PLURAL:$1|a segundo|kadagiti segundo}} ket mabalin a saan a maiparang itoy a listaan.",
        "lag-warn-high": "Gapu ti kinabuntog ti database server, dagiti nasukatan a barbaro ngem $1 {{PLURAL:$1|a segundo|kadagiti segundo}} ket mabalin a saan nga agparang ditoy a listaan.",
-       "watchlistedit-numitems": "Addaan ti listaan ti bambantayam  {{PLURAL:$1|iti1 a titulo|kadagiti $1 a titulo}}, a di mairaman dagiti patungtungan a panid.",
-       "watchlistedit-noitems": "Ti listaan ti banbantayam ket saan a naglaon kadagiti titulo.",
        "watchlistedit-normal-title": "Urnosem ti listaan ti bambantayan",
        "watchlistedit-normal-legend": "Ikkaten dagiti titulo manipud ti listaan ti bambantayam",
        "watchlistedit-normal-explain": "Dagiti titulo ti listaan ti bambantayam ket naipakita dita baba.\nTi mangikkat ti titulo, ikur-it ti kaaripingna a kahon, ken agtakla ti \"{{int:Watchlistedit-normal-submit}}\".\nMabalinmo pay nga [[Special:EditWatchlist/raw|urnosen ti kilaw a listaan]].",
        "watchlistedit-raw-done": "Napabaro ti listaan ti bambantayam.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 a titulo ti|dagiti $1 a titulo ti}} nainayon:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 a titulo ti|dagiti $1 dagiti titulo ti}} naikkat:",
+       "watchlistedit-clear-title": "Nadalusanen ti listaan ti bambantayan",
+       "watchlistedit-clear-legend": "Dalusan ti listaan ti bambantayan",
+       "watchlistedit-clear-explain": "Amin dagiti titulo ket maikkatto manipud ti listaan ti bambantayam.",
+       "watchlistedit-clear-titles": "Dagiti titulo:",
+       "watchlistedit-clear-submit": "Dalusan ti listaan ti bambantayan (Daytoy ket permanente!)",
+       "watchlistedit-clear-done": "Nadalusanen ti bambantayam.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|1 a titulo|$1 kadagiti titulo}} ti naikkat:",
+       "watchlistedit-too-many": "Adu unay a pampanid ti maiparang ditoy.",
+       "watchlisttools-clear": "Dalusan ti listaan ti bambantayan",
        "watchlisttools-view": "Kitaen dagiti maitunos a sinukatan",
        "watchlisttools-edit": "Kitaen ken urnosen ti listaan ti bambantayan",
        "watchlisttools-raw": "Urnosen ti kilaw a listaan ti bambantayan",
        "compare-invalid-title": "Ti titulo nga intedmo ket imbalido.",
        "compare-title-not-exists": "Awan met dayta titulo a nainaganam.",
        "compare-revision-not-exists": "Awan met ti pinagbaliw dayta titulo a nainaganam.",
-       "dberr-header": "Adda ti pakirutna daytoy a wiki",
        "dberr-problems": "Pasensian a! Daytoy a pagsaadan ket agdadama ti teknikal a pagrigrigatan.",
        "dberr-again": "Padasem ti agururay to manu a minutos ken agikarga.",
        "dberr-info": "(Saan a makontak ti database server: $1)",
        "htmlform-no": "Saan",
        "htmlform-yes": "Wen",
        "htmlform-chosen-placeholder": "Agpili ti pagpilian",
+       "htmlform-cloner-create": "Agnayon pay ti adu",
+       "htmlform-cloner-delete": "Ikkaten",
+       "htmlform-cloner-required": "Saan a basbassit ngem maysa a pateg ti masapul.",
        "sqlite-has-fts": "$1 adda ti suporta ti napno a testo ti panagbiruk",
        "sqlite-no-fts": "$1 awan ti suporta ti napno a testo ti panagbiruk",
        "logentry-delete-delete": "Ni $1 ket {{GENDER:$2|inikkatna}} ti panid ti $3",
index 7d01398..bcbdc91 100644 (file)
@@ -6,7 +6,8 @@
                        "Reedy",
                        "Sapral Mikail",
                        "Tagir",
-                       "Умар"
+                       "Умар",
+                       "아라"
                ]
        },
        "tog-underline": "Ӏинкаш белгалде:",
@@ -19,7 +20,6 @@
        "tog-showtoolbar": "ГӀалатнийcдара юкъе лакхера гӀорсан гартакх хьахьокха (JavaScript)",
        "tog-editondblclick": "Шозза цлицакацa oагӀув хувца (JavaScript)",
        "tog-editsectiononrightclick": "Декъам хувца кертмугӀа аьтта цлицака я (JavaScript)",
-       "tog-rememberpassword": "(укх $1 {{PLURAL:$1|1=ден|деношк}}) мара са чувалара/ялара дагалоаца дезаш дац",
        "tog-watchcreations": "Аз яь йола оагӀувнаш теркама дагарле йолач чуяьккха",
        "tog-watchdefault": "Аз хийца йола оагӀувнаш теркама дагарле йолач чуяьккха",
        "tog-watchmoves": "Аз цӀи хийца йола оагӀувнаш теркама дагарле йолач чуяьккха",
        "savearticle": "ОагӀув хьаязъе",
        "preview": "Хьалхе бӀаргтассар",
        "showpreview": "Хьалхе бӀаргтaссам",
-       "showlivepreview": "Сиха бӀаргтассар",
        "showdiff": "Даь хувцамаш",
        "anoneditwarning": "Зем хила! Шо кхы чудаьннадац. Шун IP-моттиг укх хийца оагӀув искаречу дӀаяздаь хургья.",
        "summary-preview": "Лоацам ба:",
        "search-nonefound": "ДIахаттама нийсамаш корадаьдац.",
        "powersearch-legend": " Доккха тахкар",
        "powersearch-ns": " ЦIерий аренашкахь лахар",
-       "powersearch-redir": "ДIа-хьа оагIувнаш гойта",
        "powersearch-toggleall": "Деррига",
        "powersearch-togglenone": "Цхьаккха",
        "preferences": "Оттамаш",
        "recentchanges-label-bot": "Ер хувцам бIатаца яь е",
        "recentchanges-label-unpatrolled": "Ер хувцам ший моттиге кхы дIадехьаяьккхаяц.",
        "rcnotefrom": "КIалхагIа хувцамаш хьахьекха я <strong>$2</strong> денза (<strong>$1</strong> кхачалца).",
-       "rclistfrom": "$1 тIара хувцамаш хьахьокха",
+       "rclistfrom": "$3 $2 тIара хувцамаш хьахьокха",
        "rcshowhideminor": "зIамига хувцамаш $1",
        "rcshowhidebots": "$1 шабелхалой",
        "rcshowhideliu": "Чубаьнначара дакъалаьцархочий $1",
        "compare-page2": "2. ОагIув",
        "compare-rev1": "1. Доржам",
        "compare-rev2": "2. Доржам",
-       "dberr-header": "Укх массано халонаш ловш латта",
        "htmlform-submit": "ДIадахьийта",
        "htmlform-reset": "Хувцамаш юхадаккха",
        "htmlform-selectorother-other": "Кхыдола",
index 07f0ba1..1362c8e 100644 (file)
@@ -10,7 +10,8 @@
                        "Reedy",
                        "Remember the dot",
                        "Wyvernoid",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Sub-strekizez ligili:",
@@ -23,7 +24,6 @@
        "tog-showtoolbar": "Montrez redaktilo (JavaScript bezonesas)",
        "tog-editondblclick": "Redaktez pagini kande on klikus dufoye (JavaScript bezonesas)",
        "tog-editsectiononrightclick": "Kapabligez redakto di secioni kande on dextra-klikus tituli di secioni (JavaScript bezonesas)",
-       "tog-rememberpassword": "Memorez mea pasovorto en ca ''browser'' (maxime $1 {{PLURAL:$1|dio|dii}})",
        "tog-watchcreations": "Adjuntez pagini kreota da me ad mea surveyaji",
        "tog-watchdefault": "Adjuntez pagini redaktota da me ad mea surveyaji",
        "tog-watchmoves": "Adjuntez pagini movota da me ad mea surveyaji",
        "showingresultsheader": "{{PLURAL:$5|Rezultajo '''$1''' ek '''$3'''|Rezultaji '''$1 - $2''' ek '''$3'''}} di '''$4'''",
        "powersearch-legend": "Avancita sercho",
        "powersearch-ns": "Serchez en nomari:",
-       "powersearch-redir": "Listar ridirekti",
        "powersearch-toggleall": "Omna",
        "powersearch-togglenone": "Nula",
        "search-external": "Extera sercho",
        "recentchanges-label-bot": "Ta chanjo facita da bot",
        "recentchanges-legend-newpage": "$1 - nova pagino",
        "rcnotefrom": "Infre esas la lasta chanji depos '''$2''' (montrita til '''$1''').",
-       "rclistfrom": "Montrar nova chanji startante de $1",
+       "rclistfrom": "Montrar nova chanji startante de $3 $2",
        "rcshowhideminor": "$1 mikra redakti",
        "rcshowhidebots": "$1 roboti",
        "rcshowhideliu": "$1 enirinta uzanti",
        "unwatch": "Ne plus surveyar",
        "unwatchthispage": "Ne plus surveyar",
        "notanarticle": "Ne esas artiklo",
-       "watchmethod-recent": "serchante recenta chanji en la listo di surveyaji",
-       "watchmethod-list": "serchante recenta redakti en la listo di surveyaji",
-       "watchlistcontains": "Vua listo di surveyaji kontenas $1 {{PLURAL:$1|pagino|pagini}}.",
-       "iteminvalidname": "Problemo en la artiklo '$1', nevalida nomo...",
        "wlshowlast": "Montrar la lasta $1 hori $2 dii $3",
        "watchlist-options": "Surveryo-listo selekti",
        "watching": "Surveyanta…",
        "tooltip-rollback": "\"Retrorular\" desfacas omna chanji ad ca pagino da la lasta kontributanto per un kliko",
        "tooltip-undo": "\"Desfacez\" nuligas ca versiono e apertas la redakto-pagino en prevido-modo.\nVu darfos adjuntar kauso en la rezumo.",
        "tooltip-summary": "Skribez kurta rezumo",
-       "notacceptable": "La servanto di {{SITENAME}} ne povas provizar datumi en formato quan vua kliento povas komprenar.",
        "anonymous": "Anonima {{PLURAL:$1|uzanto|uzanti}} di {{SITENAME}}",
        "siteuser": "Uzanto che {{SITENAME}} $1",
        "lastmodifiedatby": "Ica pagino modifikesis ye $2, $1 da $3.",
        "autosumm-replace": "Kontenajo remplasigesis kun '$1'",
        "autoredircomment": "Ridirektas a [[$1]]",
        "autosumm-new": "Pagino kreesis kun '$1'",
-       "livepreview-loading": "Ol kargesas…",
-       "livepreview-ready": "Ol kargesas… Pronta!",
        "watchlistedit-raw-title": "Redaktar texto di surveyo-listo",
        "watchlistedit-raw-legend": "Redaktar texto di surveyo-listo",
        "watchlistedit-raw-titles": "Tituli:",
        "tag-filter-submit": "Filtrez",
        "tags-edit": "redaktar",
        "tags-hitcount": "$1 {{PLURAL:$1|chanjo|chanji}}",
-       "dberr-header": "Ta wiki havas problemo",
        "htmlform-reset": "Desfacar chanji",
        "htmlform-selectorother-other": "Altra",
        "rightsnone": "(nula)",
index 0d878bc..d7a1e69 100644 (file)
@@ -16,7 +16,8 @@
                        "Steinninn",
                        "Urhixidur",
                        "Ævar Arnfjörð Bjarmason",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Undirstrika tengla:",
@@ -29,7 +30,6 @@
        "tog-showtoolbar": "Sýna breytingarverkfærastiku",
        "tog-editondblclick": "Breyta síðum þegar tvísmellt er",
        "tog-editsectiononrightclick": "Virkja hlutabreytingu með því að hægrismella á hlutafyrirsagnir",
-       "tog-rememberpassword": "Muna innskráninguna mína í þessum vafra (í allt að $1 {{PLURAL:$1|dag|daga}})",
        "tog-watchcreations": "Bæta síðum sem ég bý til og skrám sem ég hleð inn á vaktlistann minn",
        "tog-watchdefault": "Bæta síðum og skrám sem ég breyti á vaktlistann minn",
        "tog-watchmoves": "Bæta síðum og skrám sem ég færi á vaktlistann minn",
        "readonly_lag": "Gagnagrunninum hefur verið læst sjálfkrafa á meðan undirvefþjónarnir reyna að hafa í við aðalvefþjóninn",
        "internalerror": "Kerfisvilla",
        "internalerror_info": "Innri villa: $1",
-       "fileappenderrorread": "Mistókst að lesa \"$1\" á meðan skeytt var við síðuna.",
-       "fileappenderror": "Gat ekki bætt „$1“ við „$2“.",
        "filecopyerror": "Mistókst að afrita skjal \"$1\" á \"$2\".",
        "filerenameerror": "Gat ekki endurnefnt skrána „$1“ í „$2“.",
        "filedeleteerror": "Gat ekki eytt skránni „$1“.",
        "directorycreateerror": "Gat ekki búið til efnisskrána \"$1\".",
        "filenotfound": "Gat ekki fundið skrána „$1“.",
-       "fileexistserror": "Ekki var hægt að skrifa í \"$1\" skjalið: það er nú þegar til",
        "unexpected": "Óvænt gildi: „$1“=„$2“.",
        "formerror": "Villa: gat ekki sent eyðublað",
        "badarticleerror": "Þetta er ekki hægt að framkvæma á síðunni.",
        "userlogin-resetpassword-link": "Gleymdiru lykilorðinu þínu?",
        "userlogin-loggedin": "Þú ert búin(n) að skrá þig inn sem {{GENDER:$1|$1}}.\nNotaðu eyðablaðið fyrir neðan til að skrá þig inn sem annar notandi.",
        "userlogin-createanother": "Stofna annan aðgang",
-       "createacct-join": "Sláðu inn þínar upplýsingar fyrir neðan.",
-       "createacct-another-join": "Skrifaðu upplýsingar um nýja aðganginn fyrir neðan.",
        "createacct-emailrequired": "Netfang",
        "createacct-emailoptional": "Netfang (valfrjálst)",
        "createacct-email-ph": "Skrifaðu niður netfangið þitt",
        "savearticle": "Vista síðu",
        "preview": "Forskoða",
        "showpreview": "Forskoða",
-       "showlivepreview": "Forskoða",
        "showdiff": "Sýna breytingar",
        "anoneditwarning": "'''Viðvörun:''' Þú ert ekki innskráð(ur). Vistfang þitt skráist í breytingaskrá síðunnar.",
        "anonpreviewwarning": "Þú ert ekki innskráð(ur). Vistfang þitt skráist í breytingaskrá síðunnar.",
        "edit-gone-missing": "Gat ekki uppfært síðu.\nSvo virðist sem henni hafi verið eytt.",
        "edit-conflict": "Breytingaárekstur.",
        "edit-no-change": "Breyting þín var hunsuð, því engin breyting var á textanum.",
-       "postedit-confirmation": "Breytingin þín var vistuð.",
+       "postedit-confirmation-saved": "Breytingin þín var vistuð.",
        "edit-already-exists": "Gat ekki skapað nýja síðu.\nHún er nú þegar til.",
        "defaultmessagetext": "Sjálfgefinn skilaboða texti",
        "content-failed-to-parse": "Gat ekki þáttað $2 efni samkvæmt $1 líkani: $3",
        "search-nonefound": "Engar niðurstöður pössuðu við fyrirspurnina.",
        "powersearch-legend": "Ítarlegri leit",
        "powersearch-ns": "Leita í nafnrýmum:",
-       "powersearch-redir": "Lista tilvísanir",
        "powersearch-togglelabel": "Athuga:",
        "powersearch-toggleall": "Allt",
        "powersearch-togglenone": "Ekkert",
        "prefs-advancedsearchoptions": "Háþróaðir möguleikar",
        "prefs-advancedwatchlist": "Háþróaðir möguleikar",
        "prefs-displayrc": "Útlitsmöguleikar",
-       "prefs-displaysearchoptions": "Útlitsmöguleikar",
        "prefs-displaywatchlist": "Útlitsmöguleikar",
        "prefs-tokenwatchlist": "Lykill",
        "prefs-diffs": "Breytingar",
        "recentchanges-label-unpatrolled": "Þessi breyting hefur ekki verið yfirfarin",
        "recentchanges-legend-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).",
-       "rclistfrom": "Sýna breytingar frá og með $1",
+       "rclistfrom": "Sýna breytingar frá og með $3 $2",
        "rcshowhideminor": "$1 minniháttar breytingar",
        "rcshowhideminor-show": "Sýna",
        "rcshowhideminor-hide": "Fela",
        "uploadstash-refresh": "Endurhlaða listann",
        "invalid-chunk-offset": "Ógild raðbreyting bunka",
        "img-auth-accessdenied": "Aðgangur óheimill",
-       "img-auth-nopathinfo": "PATH_INFO vantar.\nBiðlarinn þínn er ekki stilltur til að gefa upp þessar upplýsingar.\nÞær mega vera CGI-byggðar og mega ekki styðja img_auth.\nhttps://www.mediawiki.org/wiki/Manual:Image_Authorization",
+       "img-auth-nopathinfo": "PATH_INFO vantar.\nBiðlarinn þínn er ekki stilltur til að gefa upp þessar upplýsingar.\nÞær mega vera CGI-byggðar og mega ekki styðja img_auth.\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization",
        "img-auth-notindir": "Umbeðin slóð var ekki í stilltri upphlaðsmöppu.",
        "img-auth-badtitle": "Mistókst að búa til gildan titil útfrá „$1”.",
        "img-auth-nologinnWL": "Þú ert ekki skráð(ur) inn og „$1“ er ekki á hvítlista.",
        "watchlist-details": "{{PLURAL:$1|$1 síða|$1 síður}} á vaktlistanum þínum, fyrir utan spjallsíður.",
        "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'''.",
-       "watchmethod-recent": "kanna hvort nýlegar breytingar innihalda vaktaðar síður",
-       "watchmethod-list": "leita að breytingum í vöktuðum síðum",
-       "watchlistcontains": "Vaktlistinn þinn inniheldur {{PLURAL:$1|$1 síðu|$1 síður}}.",
-       "iteminvalidname": "Vandamál með „$1“, rangt nafn...",
        "wlshowlast": "Sýna síðustu $1 klukkutíma, $2 daga, $3",
        "watchlist-options": "Vaktlistastillingar",
        "watching": "Vakta...",
        "blockip": "Banna 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).",
-       "ipadressorusername": "Vistfang eða notandanafn:",
+       "ipaddressorusername": "Vistfang eða notandanafn:",
        "ipbexpiry": "Bannið rennur út:",
        "ipbreason": "Ástæða:",
        "ipbreason-dropdown": "* Algengar bannástæður\n** Setur inn rangar upplýsingar\n** Fjarlægir efni af síðum\n** Setur inn rusltengla á utanaðkomandi síður\n** Setur inn vitleysu/þvaður á síður\n** Yfirþyrmandi framkoma/áreitni\n** Misnotkun á fjölda notandanafna\n** Óásættanlegt notandanafn",
        "common.css": "/* Allt CSS sem sett er hér mun virka á öllum þemum. */",
        "monobook.css": "/* Það sem sett er hingað er bætt við Monobook stilsniðið fyrir allan vefinn */",
        "common.js": "/* Allt JavaScript sem sett er hér mun virka í hvert skipti sem að síða hleðst. */",
-       "notacceptable": "Wiki vefþjónninn getur ekki útvegað gögn á því formi sem biðlarinn þinn getur lesið.",
        "anonymous": "$1 {{PLURAL:$1|óþekktur notandi|óþekktir notendur}} á {{SITENAME}}",
        "siteuser": "{{SITENAME}} notandi $1",
        "anonuser": "{{SITENAME}} nafnlaus notandi $1",
        "newimages-summary": "Þessi kerfissíða sýnir nýlega innhlaðnar skrár.",
        "newimages-legend": "Sía",
        "newimages-label": "Skráarnafn (eða hluti þess):",
-       "showhidebots": "($1 vélmenni)",
        "noimages": "Ekkert að sjá.",
        "ilsubmit": "Leita",
        "bydate": "eftir dagsetningu",
        "autosumm-replace": "Skipti út innihaldi með „$1“",
        "autoredircomment": "Tilvísun á [[$1]]",
        "autosumm-new": "Ný síða: $1",
-       "livepreview-loading": "Framkalla…",
-       "livepreview-ready": "… framköllun lokið!",
        "lag-warn-normal": "Breytingar nýrri en $1 {{PLURAL:$1|sekúnda|sekúndur}} kunna að vera ekki á þessm lista.",
        "lag-warn-high": "Vegna mikils álags á vefþjónanna, kunna breytingar yngri en $1 {{PLURAL:$1|sekúnda|sekúndur}} ekki að vera á þessum lista.",
-       "watchlistedit-numitems": "Á vaktlista þínum {{PLURAL:$1|er $1 síða|eru $1 síður}}, að undanskildum spjallsíðum.",
-       "watchlistedit-noitems": "Vaktlistinn þinn inniheldur enga titla.",
        "watchlistedit-normal-title": "Breyta vaktlistanum",
        "watchlistedit-normal-legend": "Fjarlægja titla af vaktlistanum",
        "watchlistedit-normal-explain": "Titlarnir á vaktlistanum þínum er sýndir fyrir neðan.\nTil að fjarlægja titil hakaðu í kassann við hliðina á honum og smelltu á „{{int:Watchlistedit-normal-submit}}“. Þú getur einnig [[Special:EditWatchlist/raw|breytt honum opnum]].",
        "compare-invalid-title": "Titillinn sem þú gafst upp er ógildur.",
        "compare-title-not-exists": "Umbeðinn titill er ekki til.",
        "compare-revision-not-exists": "Umbeðin útgáfa er ekki til.",
-       "dberr-header": "Vandamál við þennan wiki",
        "dberr-problems": "Því miður!Tæknilegir örðugleikar eru á þessari síðu.",
        "dberr-again": "Reyndu að bíða í nokkrar mínútur og endurhladdu síðan síðuna.",
        "dberr-info": "(Mistókst að hafa samband við gagnaþjón: $1)",
index ce82154..fb5739b 100644 (file)
                        "Ximo17",
                        "Xpensive",
                        "ZioNicco",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "PeppeAeco",
+                       "아라",
+                       "Lucas2"
                ]
        },
        "tog-underline": "Sottolinea i collegamenti:",
@@ -92,7 +95,7 @@
        "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": "Rivela il mio indirizzo e-mail nei messaggi di avviso",
+       "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)",
        "delete": "Cancella",
        "deletethispage": "Cancella questa pagina",
        "undeletethispage": "Recupera questa pagina",
-       "undelete_short": "Recupera {{PLURAL:$1|una revisione|$1 revisioni}}",
+       "undelete_short": "Recupera {{PLURAL:$1|una versione|$1 versioni}}",
        "viewdeleted_short": "Vedi {{PLURAL:$1|una modifica cancellata|$1 modifiche cancellate}}",
        "protect": "Proteggi",
        "protect_change": "cambia",
        "jumpto": "Vai a:",
        "jumptonavigation": "navigazione",
        "jumptosearch": "ricerca",
-       "view-pool-error": "In questo momento i server sono sovraccarichi.\nTroppi utenti stanno tentando di visualizzare questa pagina.\nAttendere qualche minuto prima di riprovare a caricare la pagina.\n\n$1",
+       "view-pool-error": "Spiacenti, in questo momento i server sono sovraccarichi.\nTroppi utenti stanno tentando di visualizzare questa pagina.\nAttendi qualche minuto prima di riprovare a caricare la pagina.\n\n$1",
+       "generic-pool-error": "Spiacenti, in questo momento i server sono sovraccarichi.\nTroppi utenti stanno tentando di visualizzare questa risorsa.\nAttendi qualche minuto prima di riprovare a caricare la risorsa.",
        "pool-timeout": "Timeout durante l'attesa dello sblocco",
        "pool-queuefull": "La coda del pool è piena",
        "pool-errorunknown": "Errore sconosciuto",
        "readonly_lag": "Il database è stato bloccato automaticamente per consentire ai server con i database slave di sincronizzarsi con il master",
        "internalerror": "Errore interno",
        "internalerror_info": "Errore interno: $1",
-       "fileappenderrorread": "Non è stato possibile leggere \"$1\" durante l'aggiunta.",
-       "fileappenderror": "Impossibile aggiungere \"$1\" a \"$2\".",
        "filecopyerror": "Impossibile copiare il file \"$1\" in \"$2\".",
        "filerenameerror": "Impossibile rinominare il file \"$1\" in \"$2\".",
        "filedeleteerror": "Impossibile cancellare il file \"$1\".",
        "directorycreateerror": "Impossibile creare la directory \"$1\".",
        "filenotfound": "Impossibile trovare il file \"$1\".",
-       "fileexistserror": "Impossibile scrivere il file \"$1\": il file esiste già",
        "unexpected": "Valore imprevisto: \"$1\"=\"$2\".",
        "formerror": "Errore: impossibile inviare il modulo",
        "badarticleerror": "Operazione non consentita per questa pagina.",
        "badtitle": "Titolo non corretto",
        "badtitletext": "Il titolo della pagina richiesta è vuoto, errato oppure deriva da un errore nei collegamenti interlingua o interwiki.\nPotrebbe inoltre contenere uno o più caratteri il cui uso non è ammesso nei titoli.",
        "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 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",
        "userlogin": "Entra / registrati",
        "userloginnocreate": "Entra",
        "logout": "Esci",
-       "userlogout": "esci",
+       "userlogout": "Esci",
        "notloggedin": "Accesso non effettuato",
        "userlogin-noaccount": "Non hai ancora effettuato la registrazione?",
        "userlogin-joinproject": "Registrati su {{SITENAME}}",
        "userlogin-helplink2": "Aiuto con l'accesso",
        "userlogin-loggedin": "Sei già connesso come {{GENDER:$1|$1}}.\nUsa il modulo sottostante per accedere come altro utente.",
        "userlogin-createanother": "Crea un'altra utenza",
-       "createacct-join": "Inserisci i tuoi dati qui sotto.",
-       "createacct-another-join": "Inserisci le informazioni per la registrazione qui sotto.",
        "createacct-emailrequired": "Indirizzo email",
        "createacct-emailoptional": "Indirizzo di posta elettronica (opzionale)",
        "createacct-email-ph": "Inserisci il tuo indirizzo email",
        "pt-login": "Entra",
        "pt-login-button": "Entra",
        "pt-createaccount": "Registrati",
-       "pt-userlogout": "Esci",
+       "pt-userlogout": "esci",
        "php-mail-error-unknown": "Errore sconosciuto nella funzione PHP mail()",
        "user-mail-no-addy": "Hai cercato di inviare una e-mail senza un indirizzo.",
        "user-mail-no-body": "Tentato di inviare una e-mail con un testo vuoto o estremamente breve.",
        "savearticle": "Salva la pagina",
        "preview": "Anteprima",
        "showpreview": "Visualizza anteprima",
-       "showlivepreview": "Funzione ''Live preview''",
        "showdiff": "Mostra modifiche",
        "anoneditwarning": "'''Attenzione:''' Accesso non effettuato. Nella cronologia della pagina verrà registrato il tuo indirizzo IP.",
        "anonpreviewwarning": "''Non è stato eseguito il login. Salvando la pagina, il proprio indirizzo IP sarà registrato nella cronologia.''",
        "anontalkpagetext": "----\n''Questa è la pagina di discussione di un utente anonimo, che non ha ancora creato un'utenza o comunque non la sta usando. Per identificarlo è quindi necessario usare il numero del suo indirizzo IP. Gli indirizzi IP possono però essere condivisi da più utenti. Se sei un utente anonimo e ritieni che i commenti presenti in questa pagina non si riferiscano a te, [[Special:UserLogin/signup|crea una nuova utenza]] o [[Special:UserLogin|entra con quella che già hai]] per evitare di essere confuso con altri utenti anonimi in futuro.''",
        "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 revisione #$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].",
+       "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-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:",
        "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.<br />\nSe si sceglie di salvarla, tutti i cambiamenti apportati dopo questa revisione andranno perduti.'''",
+       "editingold": "'''ATTENZIONE: si sta modificando una versione non aggiornata della pagina. Salvandola 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!'''",
        "longpageerror": "'''Errore: il testo inviato è lungo {{PLURAL:$1|1|$1}} kilobyte, che è maggiore della dimensione massima consentita ({{PLURAL:$2|1|$2}} kilobyte).'''\nIl testo non può essere salvato.",
-       "readonlywarning": "'''Attenzione: il database è stato bloccato per manutenzione, è quindi impossibile salvare le modifiche in questo momento.'''\nPer non perderle, è possibile copiare quanto inserito finora nella casella di modifica, incollarlo in un programma di elaborazione testi e salvarlo in attesa dello sblocco del database.\n\nL'amministratore che ha bloccato il database ha fornito questa spiegazione: $1",
+       "readonlywarning": "<strong>ATTENZIONE</strong>: il database è bloccato per manutenzione, non è momentaneamente possibile salvare le modifiche effettuate.\nPer non perderle, copiale in un file di testo e salvalo in attesa dello sblocco del database.\n\nL'amministratore che impostato il blocco ha fornito questa spiegazione: $1.",
        "protectedpagewarning": "'''Attenzione: questa pagina è stata bloccata in modo che solo gli utenti con privilegi di amministratore possano modificarla.'''\nL'ultimo elemento del registro è riportato di seguito per informazione:",
        "semiprotectedpagewarning": "'''Nota:''' Questa pagina è stata bloccata in modo che solo gli utenti registrati possano modificarla.\nL'ultimo elemento del registro è riportato di seguito per informazione:",
        "cascadeprotectedwarning": "'''Attenzione:''' Questa pagina è stata bloccata in modo che solo gli utenti con privilegi di amministratore possano modificarla. Ciò avviene perché la pagina è inclusa {{PLURAL:$1|nella pagina indicata di seguito, che è stata protetta|nelle pagine indicate di seguito, che sono state protette}} selezionando la protezione \"ricorsiva\":",
        "edit-gone-missing": "Impossibile aggiornare la pagina.\nSembra che sia stata cancellata.",
        "edit-conflict": "Conflitto di edizione.",
        "edit-no-change": "La modifica è stata ignorata poiché non sono stati apportati cambiamenti al testo.",
-       "postedit-confirmation": "La modifica è stata salvata.",
+       "postedit-confirmation-created": "La pagina è stata creata.",
+       "postedit-confirmation-restored": "La pagina è stata ripristinata.",
+       "postedit-confirmation-saved": "La modifica è stata salvata.",
        "edit-already-exists": "Impossibile creare una nuova pagina.\nEsiste già.",
        "defaultmessagetext": "Testo predefinito",
        "content-failed-to-parse": "Impossibile analizzare $2 per il modello $1: $3",
        "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-warning": "Questa pagina ha superato il numero di nodi",
-       "expansion-depth-exceeded-category": "Pagine dove viene superata la profondità di espansione",
+       "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-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-unhide": "Questa versione della pagina è stata '''rimossa'''.\nConsultare il [{{fullurl:{{#Special:Log}}/suppress|page={{PAGENAMEE}}}} log di rimozione] per ulteriori dettagli.\nAgli amministratori è ancora consentito [$1 visualizzare questa versione] se necessario.",
        "rev-deleted-text-view": "Questa versione della pagina è stata '''cancellata'''.\nGli amministratori possono ancora visualizzarla; consultare il [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log delle cancellazioni] per ulteriori dettagli.",
        "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 revisioni è 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 revisioni è stata '''cancellata'''.",
-       "rev-deleted-unhide-diff": "Una delle revisioni 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-suppressed-unhide-diff": "Una delle revisioni 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 revisioni 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 revisioni 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].",
+       "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-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].",
        "rev-delundel": "mostra/nascondi",
        "rev-showdeleted": "mostra",
        "revisiondelete": "Cancella o ripristina versioni",
        "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-text-text": "Le versioni cancellate appariranno ancora nella cronologia della pagina, ma parti del loro contenuto sarà inaccessibile al pubblico.",
+       "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.",
        "revdelete-text-others": "Altri amministratori di {{SITENAME}} saranno ancora in grado di accedere ai contenuti nascosti e potranno ripristinarli nuovamente attraverso questa stessa interfaccia, se non sono state impostate restrizioni aggiuntive.",
        "revdelete-radio-set": "Nascondi",
        "revdelete-radio-unset": "Mostra",
        "revdelete-suppress": "Nascondi le informazioni anche agli amministratori",
-       "revdelete-unsuppress": "Elimina le limitazioni sulle revisioni ripristinate",
+       "revdelete-unsuppress": "Elimina le limitazioni sulle versioni ripristinate",
        "revdelete-log": "Motivo:",
-       "revdelete-submit": "Applica {{PLURAL:$1|alla revisione selezionata|alle revisioni selezionate}}",
-       "revdelete-success": "'''Visibilità della revisione aggiornata correttamente.'''",
+       "revdelete-submit": "Applica {{PLURAL:$1|alla versione selezionata|alle versioni selezionate}}",
+       "revdelete-success": "'''Visibilità della versione aggiornata correttamente.'''",
        "revdelete-failure": "'''La visibilità della versione non può essere aggiornata:'''\n$1",
        "logdelete-success": "'''Visibilità dell'evento impostata correttamente.'''",
        "logdelete-failure": "'''La visibilità dell'evento non può essere impostata:'''\n$1",
        "revdel-restore": "cambia la visibilità",
        "pagehist": "Cronologia della pagina",
        "deletedhist": "Cronologia cancellata",
-       "revdelete-hide-current": "Impossibile nascondere l'oggetto con data $1 $2 in quanto è la revisione attuale.",
+       "revdelete-hide-current": "Impossibile nascondere l'oggetto con data $1 $2 in quanto è la versione attuale.",
        "revdelete-show-no-access": "Impossibile mostrare l'oggetto con data $1 $2 in quanto è stato identificato come \"riservato\" e non si dispone del relativo accesso.",
        "revdelete-modify-no-access": "Impossibile modificare l'oggetto con data $1 $2 in quanto è stato identificato come \"riservato\" e non si dispone del relativo accesso.",
        "revdelete-modify-missing": "Impossibile modificare l'oggetto con ID $1 in quanto non è presente nel database.",
        "suppressionlog": "Soppressioni",
        "suppressionlogtext": "Di seguito sono elencate le cancellazioni e i blocchi con del contenuto nascosto agli amministratori.\nVedi l'[[Special:BlockList|elenco dei blocchi]] per l'elenco dei bandi e dei blocchi attivi al momento.",
        "mergehistory": "Unione cronologie",
-       "mergehistory-header": "Questa pagina consente di unire le revisioni appartenenti alla cronologia di una pagina (detta pagina di origine) alla cronologia di una pagina più recente.\nÈ necessario accertarsi che la continuità storica della pagina non venga alterata.",
+       "mergehistory-header": "Questa pagina consente di unire le versioni appartenenti alla cronologia di una pagina (detta pagina di origine) alla cronologia di una pagina più recente.\nÈ necessario accertarsi che la continuità storica della pagina non venga alterata.",
        "mergehistory-box": "Unisci la cronologia di due pagine:",
        "mergehistory-from": "Pagina di origine:",
        "mergehistory-into": "Pagina di destinazione:",
        "mergehistory-list": "Cronologia cui è applicabile l'unione",
-       "mergehistory-merge": "È possibile unire le revisioni di [[:$1]] indicate di seguito alla cronologia di [[:$2]]. Usare la colonna con i pulsanti di opzione per unire tutte le revisioni fino alla data e ora indicate. Si noti che se vengono usati i pulsanti di navigazione, la colonna con i pulsanti di opzione viene azzerata.",
+       "mergehistory-merge": "È possibile unire le versioni di [[:$1]] indicate di seguito alla cronologia di [[:$2]]. Usare la colonna con i pulsanti di opzione per unire tutte le versioni fino alla data e ora indicate. Si noti che se vengono usati i pulsanti di navigazione, la colonna con i pulsanti di opzione viene azzerata.",
        "mergehistory-go": "Mostra le modifiche che possono essere unite",
-       "mergehistory-submit": "Unisci le revisioni",
-       "mergehistory-empty": "Nessuna revisione da unire.",
-       "mergehistory-success": "{{PLURAL:$3|Una revisione di [[:$1]] è stata unita|$3 revisioni di [[:$1]] sono state unite}} alla cronologia di [[:$2]].",
+       "mergehistory-submit": "Unisci le versioni",
+       "mergehistory-empty": "Nessuna versione da unire.",
+       "mergehistory-success": "{{PLURAL:$3|Una versione di [[:$1]] è stata unita|$3 versioni di [[:$1]] sono state unite}} alla cronologia di [[:$2]].",
        "mergehistory-fail": "Impossibile unire le cronologie. Verificare la pagina e i parametri temporali.",
        "mergehistory-no-source": "La pagina di origine $1 non esiste.",
        "mergehistory-no-destination": "La pagina di destinazione $1 non esiste.",
        "mergehistory-same-destination": "Le pagine di origine e di destinazione non possono coincidere",
        "mergehistory-reason": "Motivo:",
        "mergelog": "Unioni",
-       "pagemerge-logentry": "ha unito [[$1]] a [[$2]] (revisioni fino a $3)",
+       "pagemerge-logentry": "ha unito [[$1]] a [[$2]] (versioni fino a $3)",
        "revertmerge": "Annulla unioni",
        "mergelogpagetext": "Di seguito sono elencate le ultime operazioni di unione della cronologia di due pagine.",
        "history-title": "$1: cronologia delle modifiche",
        "searchmenu-exists": "'''Sul sito esiste una pagina il cui nome è \"[[:$1]]\"'''",
        "searchmenu-new": "<strong>Crea la pagina \"[[:$1]]\" su questo wiki!</strong> {{PLURAL:$2|0=|Vedi anche la pagina trovata con la tua ricerca|Vedi anche i risultati della ricerca}}",
        "searchprofile-articles": "Pagine di contenuti",
-       "searchprofile-project": "Pagine di aiuto e relative al progetto",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Tutto",
        "searchprofile-advanced": "Avanzata",
        "searchprofile-articles-tooltip": "Cerca in $1",
-       "searchprofile-project-tooltip": "Cerca in $1",
        "searchprofile-images-tooltip": "Cerca file",
        "searchprofile-everything-tooltip": "Cerca ovunque (incluse le pagine di discussione)",
        "searchprofile-advanced-tooltip": "Cerca nei namespace personalizzati",
        "search-nonefound": "La ricerca non ha prodotto risultati.",
        "powersearch-legend": "Ricerca avanzata",
        "powersearch-ns": "Cerca nei namespace:",
-       "powersearch-redir": "Elenca redirect",
        "powersearch-togglelabel": "Seleziona:",
        "powersearch-toggleall": "Tutti",
        "powersearch-togglenone": "Nessuno",
        "timezoneregion-europe": "Europa",
        "timezoneregion-indian": "Oceano Indiano",
        "timezoneregion-pacific": "Oceano Pacifico",
-       "allowemail": "Abilita la ricezione di messaggi e-mail da altri utenti",
+       "allowemail": "Abilita la ricezione di messaggi email da altri utenti",
        "prefs-searchoptions": "Ricerca",
        "prefs-namespaces": "Namespace",
        "defaultns": "Altrimenti, cerca in questi namespace:",
        "default": "predefinito",
        "prefs-files": "File",
        "prefs-custom-css": "CSS personalizzato",
-       "prefs-custom-js": "JS personalizzato",
-       "prefs-common-css-js": "CSS/JS condiviso per tutte le skin:",
+       "prefs-custom-js": "JavaScript personalizzato",
+       "prefs-common-css-js": "CSS/JavaScript condiviso per tutte le skin:",
        "prefs-reset-intro": "È possibile usare questa pagina per reimpostare le proprie preferenze a quelle predefinite del sito.\nL'operazione non può essere annullata.",
        "prefs-emailconfirm-label": "Conferma dell'e-mail:",
        "youremail": "Indirizzo email:",
        "username": "{{GENDER:$1|Nome utente}}:",
-       "uid": "{{GENDER:$1|ID utente}}:",
        "prefs-memberingroups": "{{GENDER:$2|Membro}} {{PLURAL:$1|del gruppo|dei gruppi}}:",
        "prefs-registration": "Data di registrazione:",
        "yourrealname": "Nome vero:",
        "prefs-advancedsearchoptions": "Opzioni avanzate",
        "prefs-advancedwatchlist": "Opzioni avanzate",
        "prefs-displayrc": "Opzioni di visualizzazione",
-       "prefs-displaysearchoptions": "Opzioni di visualizzazione",
        "prefs-displaywatchlist": "Opzioni di visualizzazione",
        "prefs-tokenwatchlist": "Token",
        "prefs-diffs": "Differenze",
        "right-move": "Sposta le pagine",
        "right-move-subpages": "Sposta le pagine insieme alle relative sottopagine",
        "right-move-rootuserpages": "Sposta le pagine principali degli utenti",
+       "right-move-categorypages": "Sposta le categorie",
        "right-movefile": "Sposta i file",
        "right-suppressredirect": "Non crea un redirect automatico quando si sposta una pagina",
        "right-upload": "Carica file",
        "right-delete": "Cancella pagine",
        "right-bigdelete": "Cancella pagine con cronologie lunghe",
        "right-deletelogentry": "Cancella e ripristina voci di registro specifiche",
-       "right-deleterevision": "Nasconde revisioni specifiche delle pagine",
-       "right-deletedhistory": "Visualizza le revisioni della cronologia cancellate senza il testo associato",
-       "right-deletedtext": "Visualizza testo cancellato e modifiche fra revisioni cancellate",
+       "right-deleterevision": "Nasconde versioni specifiche delle pagine",
+       "right-deletedhistory": "Visualizza le versioni della cronologia cancellate senza il testo associato",
+       "right-deletedtext": "Visualizza testo cancellato e modifiche fra versioni cancellate",
        "right-browsearchive": "Ricerca nelle pagine cancellate",
        "right-undelete": "Recupera una pagina",
-       "right-suppressrevision": "Rivede e recupera revisioni nascoste agli amministratori",
+       "right-suppressrevision": "Rivede e recupera versioni nascoste agli amministratori",
        "right-suppressionlog": "Visualizza i registri privati",
        "right-block": "Blocca le modifiche da parte di altri utenti",
        "right-blockemail": "Impedisce a un utente di inviare email",
        "action-createpage": "creare pagine",
        "action-createtalk": "creare pagine di discussione",
        "action-createaccount": "effettuare questa registrazione",
+       "action-history": "vedere la cronologia di questa pagina",
        "action-minoredit": "segnare questa modifica come minore",
        "action-move": "spostare questa pagina",
        "action-move-subpages": "spostare questa pagina e le relative sottopagine",
        "action-move-rootuserpages": "spostare le pagine principali degli utenti",
+       "action-move-categorypages": "spostare le categorie",
        "action-movefile": "spostare questo file",
        "action-upload": "caricare questo file",
        "action-reupload": "sovrascrivere questo file esistente",
        "recentchanges-summary": "Questa pagina presenta le modifiche più recenti ai contenuti del sito.",
        "recentchanges-noresult": "Nessuna modifica durante il periodo inserito che soddisfa questi criteri.",
        "recentchanges-feed-description": "Questo feed riporta le modifiche più recenti ai contenuti del sito.",
-       "recentchanges-label-newpage": "Questa modifica ha creato una nuova pagina",
-       "recentchanges-label-minor": "Questa è una modifica minore",
-       "recentchanges-label-bot": "Questa modifica è stata effettuata da un bot",
-       "recentchanges-label-unpatrolled": "Questa modifica non è stata ancora verificata",
-       "recentchanges-label-plusminus": "La dimensione della pagina è cambiata di questo numero di byte",
+       "recentchanges-label-newpage": "Creazione di una nuova pagina",
+       "recentchanges-label-minor": "Modifica minore",
+       "recentchanges-label-bot": "Modifica effettuata da un bot",
+       "recentchanges-label-unpatrolled": "Modifica non ancora verificata",
+       "recentchanges-label-plusminus": "Variazione della pagina in numero di byte",
        "recentchanges-legend-heading": "'''Legenda:'''",
-       "recentchanges-legend-newpage": "(vedi anche [[Special:NewPages|l'elenco delle nuove pagine]])",
+       "recentchanges-legend-newpage": "(vedi [[Special:NewPages|le nuove pagine]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Di seguito sono elencate le modifiche apportate a partire da <strong>$2</strong> (mostrate fino a <strong>$1</strong>).",
-       "rclistfrom": "Mostra le modifiche apportate a partire da $1",
+       "rclistfrom": "Mostra le modifiche apportate a partire da $3 $2",
        "rcshowhideminor": "$1 le modifiche minori",
        "rcshowhideminor-show": "Mostra",
        "rcshowhideminor-hide": "Nascondi",
        "uploadstash-refresh": "Aggiorna l'elenco dei file",
        "invalid-chunk-offset": "Offset della parte non valido.",
        "img-auth-accessdenied": "Accesso negato",
-       "img-auth-nopathinfo": "PATH_INFO mancante.\nIl server non è impostato per passare questa informazione.\nPotrebbe essere basato su CGI e non può supportare img_auth.\nVedi https://www.mediawiki.org/wiki/Manual:Image_Authorization",
+       "img-auth-nopathinfo": "PATH_INFO mancante.\nIl server non è impostato per passare questa informazione.\nPotrebbe essere basato su CGI e non può supportare img_auth.\nVedi https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization",
        "img-auth-notindir": "Il percorso richiesto non si trova nella directory di upload configurata.",
        "img-auth-badtitle": "Impossibile costruire un titolo valido da \"$1\".",
        "img-auth-nologinnWL": "Non si è effettuato l'accesso e \"$1\" non è nella whitelist.",
        "filehist-dimensions": "Dimensioni",
        "filehist-filesize": "Dimensione del file",
        "filehist-comment": "Commento",
-       "imagelinks": "Uso del file",
+       "imagelinks": "Utilizzo del file",
        "linkstoimage": "{{PLURAL:$1|La seguente pagina contiene|Le seguenti $1 pagine contengono}} collegamenti al file:",
        "linkstoimage-more": "Più di $1 {{PLURAL:$1|pagina punta|pagine puntano}} a questo file.\nDi seguito sono elencate solo {{PLURAL:$1|la prima pagina che punta|le prime $1 pagine che puntano}} a questo file.\nÈ disponibile un [[Special:WhatLinksHere/$2|elenco completo]].",
        "nolinkstoimage": "Nessuna pagina contiene collegamenti al file.",
        "pageswithprop-prophidden-binary": "valore binario della proprietà nascosto ($1)",
        "doubleredirects": "Redirect doppi",
        "doubleredirectstext": "In questa pagina sono elencate pagine che reindirizzano ad altre pagine di redirect.\nCiascuna riga contiene i collegamenti al primo ed al secondo redirect, oltre alla prima riga di testo del secondo redirect che di solito contiene la pagina di destinazione \"corretta\" alla quale dovrebbe puntare anche il primo redirect.\nI redirect <del>cancellati</del> sono stati corretti.",
-       "double-redirect-fixed-move": "[[$1]] è stata spostata automaticamente, ora è un redirect a [[$2]]",
-       "double-redirect-fixed-maintenance": "Corretto doppio redirect da [[$1]] a [[$2]].",
+       "double-redirect-fixed-move": "[[$1]] è stata spostato.\nÈ stato automaticamente aggiornato e ora è un redirect a [[$2]].",
+       "double-redirect-fixed-maintenance": "Corretto automaticamente il doppio redirect da [[$1]] a [[$2]] nel lavoro di manutenzione.",
        "double-redirect-fixer": "Correttore di redirect",
        "brokenredirects": "Redirect errati",
        "brokenredirectstext": "I seguenti redirect puntano a pagine inesistenti:",
        "withoutinterwiki-summary": "Le pagine indicate di seguito sono prive di collegamenti alle versioni in altre lingue:",
        "withoutinterwiki-legend": "Prefisso",
        "withoutinterwiki-submit": "Mostra",
-       "fewestrevisions": "Pagine con meno revisioni",
+       "fewestrevisions": "Pagine con meno versioni",
        "nbytes": "$1 {{PLURAL:$1|byte}}",
        "ncategories": "$1 {{PLURAL:$1|categoria|categorie}}",
        "ninterwikis": "$1 {{PLURAL:$1|interwiki}}",
        "nlinks": "$1 {{PLURAL:$1|collegamento|collegamenti}}",
        "nmembers": "$1 {{PLURAL:$1|elemento|elementi}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|elemento|elementi}}",
-       "nrevisions": "$1 {{PLURAL:$1|revisione|revisioni}}",
+       "nrevisions": "$1 {{PLURAL:$1|versione|versioni}}",
        "nviews": "$1 {{PLURAL:$1|visita|visite}}",
        "nimagelinks": "Utilizzato su $1 {{PLURAL:$1|pagina|pagine}}",
        "ntransclusions": "usato in $1 {{PLURAL:$1|pagina|pagine}}",
        "specialpage-empty": "Questa pagina speciale è attualmente vuota.",
        "lonelypages": "Pagine orfane",
-       "lonelypagestext": "Le pagine indicate di seguito sono prive di collegamenti provenienti da altre pagine di {{SITENAME}} e non sono incluse in nessuna pagina del sito.",
+       "lonelypagestext": "Le pagine indicate di seguito sono prive di collegamenti provenienti da altre pagine di {{SITENAME}} e non sono incluse in alcuna pagina del sito.",
        "uncategorizedpages": "Pagine prive di categorie",
        "uncategorizedcategories": "Categorie prive di categorie",
        "uncategorizedimages": "File privi di categorie",
        "listusers-desc": "Ordina in senso decrescente",
        "usereditcount": "$1 {{PLURAL:$1|contributo|contributi}}",
        "usercreated": "{{GENDER:$3|Creato/a}} il $1 alle $2",
-       "newpages": "Pagine più recenti",
+       "newpages": "Nuove pagine",
        "newpages-username": "Nome utente:",
        "ancientpages": "Pagine meno recenti",
        "move": "Sposta",
        "movethispage": "Sposta questa pagina",
        "unusedimagestext": "In questo elenco sono presenti i file caricati e non usati nel sito.\nPotrebbero essere presenti immagini che sono usate da altri siti con un collegamento diretto.",
-       "unusedcategoriestext": "Le pagine delle categorie indicate di seguito sono state create ma non contengono nessuna pagina né sottocategoria.",
+       "unusedcategoriestext": "Le seguenti pagine testuali esistono, sebbene le categorie corrispondenti siano vuote.",
        "notargettitle": "Dati mancanti",
        "notargettext": "Non è stata indicata una pagina o un utente in relazione al quale eseguire l'operazione richiesta.",
        "nopagetitle": "La pagina di destinazione non esiste",
        "log-title-wildcard": "Ricerca dei titoli che iniziano con",
        "showhideselectedlogentries": "Mostra/nascondi le voci di registro selezionate",
        "allpages": "Tutte le pagine",
-       "alphaindexline": "da $1 a $2",
        "nextpage": "Pagina successiva ($1)",
        "prevpage": "Pagina precedente ($1)",
        "allpagesfrom": "Mostra le pagine a partire da:",
        "trackingcategories-disabled": "La categoria è disabilitata",
        "mailnologin": "Nessun indirizzo cui inviare il messaggio",
        "mailnologintext": "Per inviare messaggi e-mail ad altri utenti è necessario [[Special:UserLogin|accedere al sito]] e aver registrato un indirizzo valido nelle proprie [[Special:Preferences|preferenze]].",
-       "emailuser": "Scrivi all'utente",
+       "emailuser": "Invia una email all'utente",
        "emailuser-title-target": "Invia una email a questo {{GENDER:$1|utente}}",
        "emailuser-title-notarget": "Invia una email a un utente",
-       "emailpage": "Invia un messaggio email all'utente",
+       "emailpage": "Invia una email all'utente",
        "emailpagetext": "Usare il modulo sottostante per inviare un messaggio e-mail all'{{GENDER:$1|utente}} indicato. L'indirizzo specificato nelle [[Special:Preferences|preferenze]] del mittente apparirà nel campo \"Da:\" del messaggio per consentire al destinatario di rispondere direttamente.",
        "defemailsubject": "Messaggio da {{SITENAME}} dall'utente \"$1\"",
        "usermaildisabled": "e-mail utente disabilitata",
        "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.",
+       "addedwatchtext-short": "La pagina \"$1\" è stata aggiunta alla propria lista degli osservati speciali.",
        "removewatch": "Rimuovi dagli osservati speciali",
-       "removedwatchtext": "La pagina \"[[:$1]]\" è stata eliminata dalla [[Special:Watchlist|lista degli osservati speciali]].",
+       "removedwatchtext": "La pagina \"[[:$1]]\" è stata rimossa dalla propria [[Special:Watchlist|lista degli osservati speciali]].",
+       "removedwatchtext-short": "La pagina \"$1\" è stata rimossa dalla propria lista degli osservati speciali.",
        "watch": "Segui",
        "watchthispage": "Segui questa pagina",
        "unwatch": "Non seguire",
        "unwatchthispage": "Smetti di seguire",
        "notanarticle": "Questa pagina non è una voce",
-       "notvisiblerev": "La revisione è stata cancellata",
+       "notvisiblerev": "La versione è stata cancellata",
        "watchlist-details": "La lista degli osservati speciali contiene {{PLURAL:$1|una pagina (e la rispettiva pagina di discussione)|$1 pagine (e le rispettive pagine di discussione)}}.",
        "wlheader-enotif": "La notifica via email è attiva.",
        "wlheader-showupdated": "Le pagine che sono state modificate dopo l'ultima visita sono evidenziate in '''grassetto'''.",
-       "watchmethod-recent": "controllo delle modifiche recenti per gli osservati speciali",
-       "watchmethod-list": "controllo degli osservati speciali per modifiche recenti",
-       "watchlistcontains": "La lista degli osservati speciali contiene {{PLURAL:$1|una pagina|$1 pagine}}.",
-       "iteminvalidname": "Problemi con la pagina '$1', nome non valido...",
        "wlnote2": "Di seguito le modifiche {{PLURAL:$1|nell'ultima ora|nelle ultime <strong>$1</strong> ore}}, da $2, $3.",
        "wlshowlast": "Mostra le ultime $1 ore $2 giorni $3",
        "watchlist-options": "Opzioni osservati speciali",
        "enotif_lastvisited": "Visita $1 per vedere tutte le modifiche dall'ultima visita.",
        "enotif_lastdiff": "Visita $1 per vedere la modifica.",
        "enotif_anon_editor": "utente anonimo $1",
-       "enotif_body": "Gentile $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nOggetto dell'intervento, inserito dall'autore: $PAGESUMMARY $PAGEMINOREDIT\n\nContatta l'autore:\nvia posta elettronica: $PAGEEDITOR_EMAIL\nsul sito: $PAGEEDITOR_WIKI\n\nNon verranno inviate altre notifiche in caso di ulteriori attività, se non visiti la pagina dopo aver effettuato l'accesso. Inoltre, è possibile modificare le impostazioni di notifica per tutte le pagine nella lista degli osservati speciali.\n\nIl sistema di notifica di {{SITENAME}}, al tuo servizio\n\n--\nPer modificare le impostazioni delle notifiche via posta elettronica, visita \n{{canonicalurl:{{#special:Preferences}}}}\n\nPer modificare la lista degli osservati speciali, visita \n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPer rimuovere la pagina dalla lista degli osservati speciali, visita\n$UNWATCHURL\n\nPer commentare e ricevere aiuto:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Gentile $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nOggetto dell'intervento, inserito dall'autore: $PAGESUMMARY $PAGEMINOREDIT\n\nContatta l'autore:\nvia posta elettronica: $PAGEEDITOR_EMAIL\nsul sito: $PAGEEDITOR_WIKI\n\nNon verranno inviate altre notifiche in caso di ulteriori attività, se non visiti la pagina dopo aver effettuato l'accesso. Inoltre, è possibile modificare le impostazioni di notifica per tutte le pagine nella lista degli osservati speciali.\n\nIl sistema di notifica di {{SITENAME}}, al tuo servizio\n\n--\nPer modificare le impostazioni delle notifiche via posta elettronica, visita \n{{canonicalurl:{{#special:Preferences}}}}\n\nPer modificare la lista degli osservati speciali, visita \n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPer rimuovere la pagina dalla lista degli osservati speciali, visita\n$UNWATCHURL\n\nPer commentare e ricevere aiuto:\n$HELPPAGE",
        "created": "creata",
        "changed": "modificata",
        "deletepage": "Cancella pagina",
        "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|revisione|revisioni}}:",
+       "historywarning": "'''Attenzione:''' La pagina che stai per cancellare ha una cronologia con approssimativamente $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",
        "deletereasonotherlist": "Altra motivazione",
        "deletereason-dropdown": "* Motivazioni più comuni per la cancellazione\n** Spam\n** Vandalismo\n** Violazione di copyright\n** Richiesta dell'autore\n** Redirect rotto",
        "delete-edit-reasonlist": "Modifica i motivi di cancellazione",
-       "delete-toobig": "La cronologia di questa pagina è molto lunga (oltre $1 {{PLURAL:$1|revisione|revisioni}}). 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|revisione|revisioni}}). La sua cancellazione può creare dei problemi di funzionamento al database di {{SITENAME}}; procedere con cautela.",
+       "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.",
        "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",
        "restriction-level-all": "tutti i livelli",
        "undelete": "Visualizza pagine cancellate",
        "undeletepage": "Visualizza e recupera le pagine cancellate",
-       "undeletepagetitle": "'''Quanto segue è composto da revisioni cancellate di [[:$1|$1]]'''.",
+       "undeletepagetitle": "'''Quanto segue è composto da versioni cancellate di [[:$1|$1]]'''.",
        "viewdeletedpage": "Visualizza le pagine cancellate",
        "undeletepagetext": "{{PLURAL:$1|La pagina indicata di seguito è stata cancellata, ma è ancora in archivio e pertanto può essere recuperata|Le pagine indicate di seguito sono state cancellate, ma sono ancora in archivio e pertanto possono essere recuperate}}. L'archivio può essere svuotato periodicamente.",
        "undelete-fieldset-title": "Ripristina versioni",
-       "undeleteextrahelp": "Per recuperare l'intera cronologia della pagina, lasciare tutte le caselle deselezionate e fare clic su '''''{{int:undeletebtn}}'''''.\nPer effettuare un ripristino selettivo, selezionare le caselle corrispondenti alle revisioni da ripristinare e fare clic su '''''{{int:undeletebtn}}'''''.",
-       "undeleterevisions": "{{PLURAL:$1|Una revisione|$1 revisioni}} in archivio",
-       "undeletehistory": "Recuperando questa pagina, tutte le sue versioni verranno ripristinate nella relativa cronologia.\nSe dopo la cancellazione è stata creata una nuova pagina con lo stesso titolo, le revisioni recuperate saranno inserite nella cronologia precedente.",
-       "undeleterevdel": "Il ripristino non verrà effettuato se determina la cancellazione parziale della versione attuale della pagina o del file interessato. In tal caso, è necessario rimuovere il segno di spunta o l'oscuramento dalle revisioni cancellate più recenti.",
-       "undeletehistorynoadmin": "Questa pagina è stata cancellata.\nIl motivo della cancellazione è mostrato qui sotto, assieme ai dettagli dell'utente che ha modificato questa pagina prima della cancellazione.\nIl testo contenuto nelle revisioni cancellate è disponibile solo agli amministratori.",
-       "undelete-revision": "Revisione cancellata della pagina $1, inserita il $4 alle $5 da $3:",
-       "undeleterevision-missing": "Revisione errata o mancante. Il collegamento è errato oppure la revisione è stata già ripristinata o eliminata dall'archivio.",
-       "undelete-nodiff": "Non è stata trovata nessuna revisione precedente.",
+       "undeleteextrahelp": "Per recuperare l'intera cronologia della pagina, lasciare tutte le caselle deselezionate e fare clic su '''''{{int:undeletebtn}}'''''.\nPer effettuare un ripristino selettivo, selezionare le caselle corrispondenti alle versioni da ripristinare e fare clic su '''''{{int:undeletebtn}}'''''.",
+       "undeleterevisions": "{{PLURAL:$1|Una versione|$1 versioni}} in archivio",
+       "undeletehistory": "Recuperando questa pagina, tutte le sue versioni saranno ripristinate nella relativa cronologia.\nSe dopo la cancellazione è stata creata una nuova pagina con lo stesso titolo, le versioni recuperate saranno inserite nella cronologia precedente.",
+       "undeleterevdel": "Il ripristino non verrà effettuato se determina la cancellazione parziale della versione attuale della pagina o del file interessato. In tal caso, è necessario rimuovere il segno di spunta o l'oscuramento dalle versioni cancellate più recenti.",
+       "undeletehistorynoadmin": "Questa pagina è stata cancellata.\nIl motivo della cancellazione è mostrato qui sotto, assieme ai dettagli dell'utente che ha modificato questa pagina prima della cancellazione.\nIl testo contenuto nelle versioni cancellate è disponibile solo agli amministratori.",
+       "undelete-revision": "Versione cancellata della pagina $1, inserita il $4 alle $5 da $3:",
+       "undeleterevision-missing": "Versione errata o mancante. Il collegamento è errato oppure la versione è stata già ripristinata o eliminata dall'archivio.",
+       "undelete-nodiff": "Non è stata trovata nessuna versione precedente.",
        "undeletebtn": "Ripristina",
        "undeletelink": "visualizza/ripristina",
        "undeleteviewlink": "visualizza",
        "undeleteinvert": "Inverti selezione",
        "undeletecomment": "Motivo:",
-       "undeletedrevisions": "{{PLURAL:$1|Una revisione recuperata|$1 revisioni recuperate}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|Una revisione|$1 revisioni}} e $2 file recuperati",
+       "undeletedrevisions": "{{PLURAL:$1|Una versione recuperata|$1 versioni recuperate}}",
+       "undeletedrevisions-files": "{{PLURAL:$1|Una versione|$1 versioni}} e $2 file recuperati",
        "undeletedfiles": "{{PLURAL:$1|Un file recuperato|$1 file recuperati}}",
        "cannotundelete": "Ripristino non riuscito:\n$1",
        "undeletedpage": "'''La pagina $1 è stata recuperata'''\n\nConsultare il [[Special:Log/delete|log delle cancellazioni]] per vedere le cancellazioni e i recuperi più recenti.",
        "undelete-search-prefix": "Mostra le pagine il cui titolo inizia con:",
        "undelete-search-submit": "Cerca",
        "undelete-no-results": "Nessuna pagina corrispondente nell'archivio delle cancellazioni.",
-       "undelete-filename-mismatch": "Impossibile annullare la cancellazione della revisione del file con timestamp $1: nome file non corrispondente.",
-       "undelete-bad-store-key": "Impossibile annullare la cancellazione della revisione del file con timestamp $1: file non disponibile prima della cancellazione.",
+       "undelete-filename-mismatch": "Impossibile annullare la cancellazione della versione del file con timestamp $1: nome file non corrispondente.",
+       "undelete-bad-store-key": "Impossibile annullare la cancellazione della versione del file con timestamp $1: file non disponibile prima della cancellazione.",
        "undelete-cleanup-error": "Errore nella cancellazione del file di archivio non utilizzato \"$1\".",
        "undelete-missing-filearchive": "Impossibile ripristinare l'ID $1 dell'archivio file in quanto non è presente nel database. Potrebbe essere stato già ripristinato.",
        "undelete-error": "Errore nel ripristino della pagina",
        "sp-contributions-talk": "discussione",
        "sp-contributions-userrights": "gestione dei permessi",
        "sp-contributions-blocked-notice": "Questo utente è attualmente bloccato. L'ultimo elemento del registro dei blocchi è riportato di seguito per informazione:",
-       "sp-contributions-blocked-notice-anon": "Questo indirizzo IP è attualmente bloccato. Di seguito è riportato l'ultimo elemento del registro dei blocchi:",
+       "sp-contributions-blocked-notice-anon": "Questo indirizzo IP è attualmente bloccato.\nL'ultimo elemento del registro dei blocchi è riportato di seguito per informazione:",
        "sp-contributions-search": "Ricerca contributi",
        "sp-contributions-username": "Indirizzo IP o nome utente:",
-       "sp-contributions-toponly": "Mostra solo i contributi che sono le ultime revisioni per la pagina",
+       "sp-contributions-toponly": "Mostra solo i contributi che sono le ultime versioni per la pagina",
        "sp-contributions-newonly": "Visualizza solo le modifiche che sono creazioni di pagina",
        "sp-contributions-submit": "Ricerca",
        "whatlinkshere": "Puntano qui",
        "unblock": "Sblocca utente",
        "blockip": "Blocco utente",
        "blockip-legend": "Blocca l'utente",
-       "blockiptext": "Usare il modulo sottostante per bloccare l'accesso in scrittura a uno specifico indirizzo IP o un utente registrato.\nIl blocco dev'essere operato per prevenire atti di vandalismo e in stretta osservanza della [[{{MediaWiki:Policy-url}}|policy di {{SITENAME}}]].\nIndicare il motivo specifico per il quale si procede al blocco (per esempio, citando i titoli di eventuali pagine oggetto di vandalismo).",
-       "ipadressorusername": "Indirizzo IP o nome 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:",
        "ipbexpiry": "Scadenza del blocco:",
        "ipbreason": "Motivo:",
        "ipbreason-dropdown": "*Motivazioni più comuni per i blocchi\n** Inserimento di informazioni false\n** Rimozione di contenuti dalle pagine\n** Collegamenti promozionali a siti esterni\n** Inserimento di contenuti privi di senso\n** Comportamenti intimidatori o molestie\n** Uso indebito di utenze multiple\n** Nome utente non consono",
        "unblocked-id": "Il blocco $1 è stato rimosso",
        "blocklist": "Utenti bloccati",
        "ipblocklist": "Utenti bloccati",
-       "ipblocklist-legend": "Trova un utente bloccato",
+       "ipblocklist-legend": "Cerca un utente bloccato",
        "blocklist-userblocks": "Nascondi i blocchi degli utenti registrati",
        "blocklist-tempblocks": "Nascondi i blocchi temporanei",
        "blocklist-addressblocks": "Nascondi i blocchi di un solo IP",
        "ip_range_toolarge": "Non è possibile bloccare range superiori al /$1",
        "proxyblocker": "Blocco dei proxy aperti",
        "proxyblockreason": "Questo indirizzo IP è stato bloccato perché risulta essere un proxy aperto. Si prega di contattare il proprio fornitore di accesso a Internet o il supporto tecnico e informarli di questo grave problema di sicurezza.",
-       "sorbsreason": "Questo indirizzo IP è elencato come proxy aperto nella blacklist DNSBL utilizzata da {{SITENAME}}.",
-       "sorbs_create_account_reason": "Non è possibile creare nuovi accessi da questo indirizzo IP perché è elencato come proxy aperto nella blacklist DNSBL utilizzata da {{SITENAME}}.",
+       "sorbsreason": "Questo indirizzo IP è elencato come proxy aperto nella lista DNSBL utilizzata da {{SITENAME}}.",
+       "sorbs_create_account_reason": "Non è possibile creare nuove utenze con questo indirizzo IP perché è elencato come proxy aperto nella lista DNSBL utilizzata da {{SITENAME}}.",
        "xffblockreason": "Un indirizzo IP presente nell'intestazione X-Forwarded-For, tuo o del server proxy che stai utilizzando, è stato bloccato. La motivazione originale del blocco è: $1",
        "cant-see-hidden-user": "L'utente che si sta tentando di bloccare è stato già bloccato e nascosto. Poiché non hai il permesso \"hideuser\", non è possibile visualizzare o modificare il blocco dell'utente.",
        "ipbblocked": "Non puoi bloccare o sbloccare altri utenti, perché tu stesso sei bloccato",
        "movepagetalktext": "La corrispondente pagina di discussione, se esiste, sarà spostata automaticamente insieme alla pagina principale, '''tranne che nei seguenti casi''':\n* lo spostamento della pagina è tra namespace diversi;\n* in corrispondenza del nuovo titolo esiste già una pagina di discussione (non vuota);\n* la casella qui sotto è stata deselezionata.\n\nIn questi casi, se lo si ritiene opportuno, occorre spostare o aggiungere manualmente le informazioni contenute nella pagina di discussione.",
        "movearticle": "Sposta la pagina:",
        "moveuserpage-warning": "'''Attenzione:''' Si sta per spostare una pagina utente. Nota che verrà spostata solamente la pagina. L'utente ''non'' sarà rinominato.",
+       "movecategorypage-warning": "<strong>Attenzione:</strong> stai per spostare una categoria. Solo la pagina verrà spostata, ma tutte le pagine nella vecchia categoria <em>non</em> saranno inserite nella nuova.",
        "movenologintext": "Lo spostamento delle pagine è consentito solo agli utenti registrati che hanno eseguito l'[[Special:UserLogin|accesso]] al sito.",
        "movenotallowed": "Non si dispone dei permessi necessari per spostare le pagine.",
        "movenotallowedfile": "Non si dispone dei permessi necessari per spostare i file.",
        "cant-move-user-page": "Non si dispone dei permessi necessari per spostare le pagine utente (escluse le sottopagine).",
        "cant-move-to-user-page": "Non si dispone dei permessi necessari per spostare la pagina su una pagina utente (escluse le sottopagine utente).",
+       "cant-move-category-page": "Non si dispone dei permessi necessari per spostare categorie.",
+       "cant-move-to-category-page": "Non si dispone dei permessi necessari per spostare la pagina su una categoria.",
        "newtitle": "Nuovo titolo:",
        "move-watch": "Aggiungi la pagina agli osservati speciali",
        "movepagebtn": "Sposta la pagina",
        "delete_and_move_text": "==Cancellazione richiesta==\n\nLa pagina specificata come destinazione \"[[:$1]]\" esiste già. Vuoi cancellarla per proseguire con lo spostamento?",
        "delete_and_move_confirm": "Sì, sovrascrivi la pagina esistente",
        "delete_and_move_reason": "Cancellata per rendere possibile lo spostamento da \"[[$1]]\"",
-       "selfmove": "Il nuovo titolo è uguale al vecchio; impossibile spostare la pagina su se stessa.",
+       "selfmove": "Il titolo di destinazione è uguale a quello di provenienza, non è possibile spostare una pagina su se stessa.",
        "immobile-source-namespace": "Non è possibile spostare pagine del namespace \"$1\"",
        "immobile-target-namespace": "Non è possibile spostare pagine nel namespace \"$1\"",
        "immobile-target-namespace-iw": "Un collegamento interwiki non è una destinazione valida per spostare la pagina.",
        "export": "Esporta pagine",
        "exporttext": "È possibile esportare il testo e la cronologia delle modifiche di una pagina o di un gruppo di pagine in formato XML per importarle in altri siti che utilizzano il software MediaWiki, attraverso la [[Special:Import|pagina delle importazioni]].\n\nPer esportare le pagine indicare i titoli nella casella di testo sottostante, uno per riga, e specificare se si desidera ottenere l'ultima versione e tutte le versioni precedenti, con i dati della cronologia della pagina, oppure soltanto l'ultima versione e i dati corrispondenti all'ultima modifica.\n\nIn quest'ultimo caso si può anche utilizzare un collegamento, ad esempio [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] per esportare \"[[{{MediaWiki:Mainpage}}]]\".",
        "exportall": "Esporta tutte le pagine",
-       "exportcuronly": "Includi solo la revisione attuale, non l'intera cronologia",
+       "exportcuronly": "Includi solo la versione attuale, non l'intera cronologia",
        "exportnohistory": "----\n'''Nota:''' l'esportazione dell'intera cronologia delle pagine attraverso questa interfaccia è stata disattivata per motivi legati alle prestazioni del sistema.",
        "exportlistauthors": "Includi l'elenco completo dei contributori per ogni pagina",
        "export-submit": "Esporta",
        "import-comment": "Oggetto:",
        "importtext": "Si prega di esportare il file dal sito wiki di origine con la [[Special:Export|funzione di esportazione]], salvarlo sul proprio disco e poi caricarlo qui.",
        "importstart": "Importazione delle pagine in corso...",
-       "import-revision-count": "{{PLURAL:$1|una revisione importata|$1 revisioni importate}}",
+       "import-revision-count": "{{PLURAL:$1|una versione importata|$1 versioni importate}}",
        "importnopages": "Nessuna pagina da importare.",
        "imported-log-entries": "Importat{{PLURAL:$1|o|i}} $1 {{PLURAL:$1|evento|eventi}} di log.",
        "importfailed": "Importazione non riuscita: <nowiki>$1</nowiki>",
        "importlogpage": "Importazioni",
        "importlogpagetext": "Di seguito sono elencate le importazioni di pagine provenienti da altre wiki, complete di cronologia.",
        "import-logentry-upload": "ha importato [[$1]] tramite upload",
-       "import-logentry-upload-detail": "{{PLURAL:$1|una revisione importata|$1 revisioni importate}}",
+       "import-logentry-upload-detail": "{{PLURAL:$1|una versione importata|$1 versioni importate}}",
        "import-logentry-interwiki": "ha trasferito da altra wiki la pagina $1",
-       "import-logentry-interwiki-detail": "{{PLURAL:$1|una revisione importata|$1 revisioni importate}} da $2",
+       "import-logentry-interwiki-detail": "{{PLURAL:$1|una versione importata|$1 versioni importate}} da $2",
        "javascripttest": "Sperimentazione JavaScript",
        "javascripttest-title": "In esecuzione test per $1",
        "javascripttest-pagetext-noframework": "Questa pagina è riservata all'esecuzione di test di JavaScript.",
        "tooltip-summary": "Inserire una breve sintesi",
        "interlanguage-link-title": "$1 - $2",
        "common.css": "/* Gli stili CSS inseriti qui si applicano a tutte le skin */",
-       "cologneblue.css": "/* Gli stili CSS inseriti qui si applicano agli utenti che usano la skin Cologne Blue */",
        "monobook.css": "/* Gli stili CSS inseriti qui si applicano agli utenti che usano la skin Monobook */",
-       "modern.css": "/* Gli stili CSS inseriti qui si applicano agli utenti che usano la skin Modern */",
        "vector.css": "/* Gli stili CSS inseriti qui si applicano agli utenti che usano la skin Vector */",
        "print.css": "/* Gli stili CSS inseriti qui si applicano all'output in stampa */",
        "noscript.css": "/ * Gli stili CSS inseriti qui si applicano agli utenti che hanno JavaScript disabilitato * /",
        "group-sysop.css": "/ * Gli stili CSS inseriti qui si applicheranno solo agli amministratori/sysop * /",
        "group-bureaucrat.css": "/ * Gli stili CSS inseriti qui si applicheranno solo ai burocrati * /",
        "common.js": "/* Il codice JavaScript inserito qui viene caricato da ciascuna pagina, per tutti gli utenti. */",
-       "cologneblue.js": "/* Il codice JavaScript inserito qui viene caricato dagli utenti che usano la skin Cologne Blue */",
        "monobook.js": "/* Il codice JavaScript inserito qui viene caricato dagli utenti che usano la skin MonoBook */",
-       "modern.js": "/* Il codice JavaScript inserito qui viene caricato dagli utenti che usano la skin Modern */",
        "vector.js": "/* Il codice JavaScript inserito qui viene caricato dagli utenti che usano la skin Vector */",
        "group-autoconfirmed.js": "/ * Il codice JavaScript inserito qui viene caricato solo per gli utenti autoconvalidati * /",
        "group-user.js": "/ * Il codice JavaScript inserito qui viene caricato solo per gli utenti registrati * /",
        "group-bot.js": "/ * Il codice JavaScript inserito qui viene caricato solo per i bot * /",
        "group-sysop.js": "/ * Il codice JavaScript inserito qui viene caricato solo per gli amministratori/sysop * /",
        "group-bureaucrat.js": "/ * Il codice JavaScript inserito qui viene caricato solo per i burocrati * /",
-       "notacceptable": "Il server wiki non è in grado di fornire i dati in un formato leggibile dal client.",
        "anonymous": "{{PLURAL:$1|Utente anonimo|Utenti anonimi}} di {{SITENAME}}",
        "siteuser": "$1, utente di {{SITENAME}}",
        "anonuser": "$1, utente anonimo di {{SITENAME}}",
        "patrol-log-page": "Modifiche verificate",
        "patrol-log-header": "Di seguito sono elencate le verifiche delle modifiche.",
        "log-show-hide-patrol": "$1 registro delle modifiche verificate",
-       "deletedrevision": "Cancellata la vecchia revisione di $1.",
+       "deletedrevision": "Cancellata la vecchia versione di $1.",
        "filedeleteerror-short": "Errore nella cancellazione del file: $1",
        "filedeleteerror-long": "Si sono verificati degli errori nel tentativo di cancellare il file:\n\n$1",
        "filedelete-missing": "Impossibile cancellare il file \"$1\" in quanto non esiste.",
-       "filedelete-old-unregistered": "La revisione del file indicata, \"$1\", non è contenuta nel database.",
+       "filedelete-old-unregistered": "La versione del file indicata, \"$1\", non è contenuta nel database.",
        "filedelete-current-unregistered": "Il file specificato, \"$1\", non è contenuto nel database.",
        "filedelete-archive-read-only": "Il server Web non è in grado di scrivere nella directory di archivio \"$1\".",
        "previousdiff": "← Differenza precedente",
        "newimages-summary": "Questa pagina speciale mostra i file caricati più di recente.",
        "newimages-legend": "Filtra",
        "newimages-label": "Nome file (o una parte di esso):",
-       "showhidebots": "($1 i bot)",
+       "newimages-showbots": "Mostra caricamenti di bot",
        "noimages": "Non c'è nulla da vedere.",
        "ilsubmit": "Ricerca",
        "bydate": "per data",
        "autoredircomment": "Redirect alla pagina [[$1]]",
        "autosumm-new": "Creata pagina con \"$1\"",
        "size-bytes": "$1 byte",
-       "livepreview-loading": "Caricamento in corso...",
-       "livepreview-ready": "Caricamento in corso… Pronto.",
-       "livepreview-failed": "Errore nella funzione Live preview.\nUsare l'anteprima standard.",
-       "livepreview-error": "Impossibile effettuare il collegamento: $1 \"$2\"\nUsare l'anteprima standard.",
        "lag-warn-normal": "Le modifiche apportate {{PLURAL:$1|nell'ultimo secondo|negli ultimi $1 secondi}} potrebbero non apparire in questa lista.",
        "lag-warn-high": "A causa di un eccessivo ritardo nell'aggiornamento del server di database, le modifiche apportate {{PLURAL:$1|nell'ultimo secondo|negli ultimi $1 secondi}} potrebbero non apparire in questa lista.",
-       "watchlistedit-numitems": "La lista degli osservati speciali contiene {{PLURAL:$1|una pagina (e la rispettiva pagina di discussione)|$1 pagine (e le rispettive pagine di discussione)}}.",
-       "watchlistedit-noitems": "La lista degli osservati speciali è vuota.",
        "watchlistedit-normal-title": "Modifica osservati speciali",
        "watchlistedit-normal-legend": "Eliminazione di pagine dagli osservati speciali",
        "watchlistedit-normal-explain": "Di seguito sono elencate tutte le pagine osservate.\nPer rimuovere una o più pagine dalla lista, selezionare le caselle relative e fare clic sul pulsante \"{{int:Watchlistedit-normal-submit}}\" in fondo all'elenco.\nSi noti che è anche possibile [[Special:EditWatchlist/raw|modificare la lista in formato testuale]].",
        "watchlistedit-raw-title": "Modifica degli osservati speciali in forma testuale",
        "watchlistedit-raw-legend": "Modifica testuale osservati speciali",
        "watchlistedit-raw-explain": "Di seguito sono elencate tutte le pagine osservate. Per modificare la lista aggiungere o rimuovere i rispettivi titoli, uno per riga.\nUna volta terminato, fare clic su \"{{int:Watchlistedit-raw-submit}}\" in fondo all'elenco.\nSi noti che è anche possibile [[Special:EditWatchlist|modificare la lista con l'interfaccia standard]].",
-       "watchlistedit-raw-titles": "Titoli delle pagine:",
+       "watchlistedit-raw-titles": "Titoli:",
        "watchlistedit-raw-submit": "Aggiorna la lista",
        "watchlistedit-raw-done": "La lista degli osservati speciali è stata aggiornata.",
        "watchlistedit-raw-added": "{{PLURAL:$1|È stata aggiunta una pagina|Sono state aggiunte $1 pagine}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|È stata eliminata una pagina|Sono state eliminate $1 pagine}}:",
+       "watchlistedit-clear-title": "Osservati speciali puliti",
+       "watchlistedit-clear-legend": "Pulisci osservati speciali",
+       "watchlistedit-clear-explain": "Tutti i titoli saranno rimossi dai tuoi osservati speciali",
+       "watchlistedit-clear-titles": "Titoli:",
+       "watchlistedit-clear-submit": "Pulisci gli osservati speciali (sarà permanente!)",
+       "watchlistedit-clear-done": "La lista degli osservati speciali è stata pulita.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|È stata eliminata una pagina|Sono state eliminate $1 pagine}}:",
+       "watchlistedit-too-many": "Ci sono troppe pagine da visualizzare qui.",
+       "watchlisttools-clear": "Pulisci gli osservati speciali",
        "watchlisttools-view": "Visualizza le modifiche pertinenti",
        "watchlisttools-edit": "Visualizza e modifica la lista degli osservati speciali",
        "watchlisttools-raw": "Modifica la lista in formato testo",
        "comparepages": "Confronta le pagine",
        "compare-page1": "Pagina 1",
        "compare-page2": "Pagina 2",
-       "compare-rev1": "Revisione 1",
-       "compare-rev2": "Revisione 2",
+       "compare-rev1": "Versione 1",
+       "compare-rev2": "Versione 2",
        "compare-submit": "Confronta",
        "compare-invalid-title": "Il titolo che hai specificato non è valido.",
        "compare-title-not-exists": "Il titolo che hai specificato non esiste.",
-       "compare-revision-not-exists": "La revisione che hai specificato non esiste.",
-       "dberr-header": "Questa wiki ha un problema",
+       "compare-revision-not-exists": "La versione che hai specificato non esiste.",
        "dberr-problems": "Questo sito sta avendo dei problemi tecnici.",
        "dberr-again": "Prova ad attendere qualche minuto e ricaricare.",
        "dberr-info": "(Impossibile contattare il server del database: $1)",
        "htmlform-no": "No",
        "htmlform-yes": "Sì",
        "htmlform-chosen-placeholder": "Seleziona un'opzione",
+       "htmlform-cloner-create": "Aggiungi altro",
+       "htmlform-cloner-delete": "Rimuovi",
+       "htmlform-cloner-required": "È necessario almeno un valore.",
        "sqlite-has-fts": "$1 con la possibilità di ricerca completa nel testo",
        "sqlite-no-fts": "$1 senza la possibilità di ricerca completa nel testo",
        "logentry-delete-delete": "$1 {{GENDER:$2|ha cancellato}} la pagina $3",
index b45dc10..e98596e 100644 (file)
@@ -57,7 +57,8 @@
                        "欅",
                        "蝋燭α",
                        "青子守歌",
-                       "아라"
+                       "아라",
+                       "Rxy"
                ]
        },
        "tog-underline": "リンクの下線:",
        "jumptonavigation": "案内",
        "jumptosearch": "検索",
        "view-pool-error": "申し訳ありませんが、現在サーバーに過大な負荷がかかっています。\nこのページを閲覧しようとする利用者が多すぎます。\nしばらく時間を置いてから、もう一度このページにアクセスしてみてください。\n\n$1",
+       "generic-pool-error": "申し訳ありませんが、現在サーバーに過大な負荷がかかっています。\nこのページを閲覧しようとする利用者が多すぎます。\nしばらく時間を置いてから、もう一度このリソースにアクセスしてみてください。",
        "pool-timeout": "ロック待ちタイムアウト",
        "pool-queuefull": "プールキューがいっぱいです",
        "pool-errorunknown": "不明なエラー",
        "readonly_lag": "データベースはスレーブのデータベースサーバーがマスターに同期するまで自動的にロックされています",
        "internalerror": "内部エラー",
        "internalerror_info": "内部エラー: $1",
-       "fileappenderrorread": "追加中に、「$1」を読み取れませんでした。",
-       "fileappenderror": "「$1」を「$2」に追加できませんでした。",
        "filecopyerror": "ファイル「$1」を「$2」に複製できませんでした。",
        "filerenameerror": "ファイル名を「$1」から「$2」へ変更できませんでした。",
        "filedeleteerror": "ファイル「$1」を削除できませんでした。",
        "directorycreateerror": "ディレクトリ「$1」を作成できませんでした。",
        "filenotfound": "ファイル「$1」が見つかりませんでした。",
-       "fileexistserror": "ファイル「$1」に書き込めませんでした: ファイルが存在します。",
        "unexpected": "予期しない値「$1」=「$2」です。",
        "formerror": "エラー: フォームを送信できませんでした。",
        "badarticleerror": "このページでは要求された操作を行えません。",
        "userlogin-helplink2": "ログインについてのヘルプ",
        "userlogin-loggedin": "{{GENDER:$1|$1}} として既にログインしています。\n別の利用者としてログインするには下のフォームを使用してください。",
        "userlogin-createanother": "別アカウントを作成",
-       "createacct-join": "以下の情報を入力してください。",
-       "createacct-another-join": "新しいアカウントの情報を以下に記入してください。",
        "createacct-emailrequired": "メールアドレス",
        "createacct-emailoptional": "メールアドレス (省略可能)",
        "createacct-email-ph": "メールアドレスを入力",
        "savearticle": "ページを保存",
        "preview": "プレビュー",
        "showpreview": "プレビューを表示",
-       "showlivepreview": "ライブプレビュー",
        "showdiff": "差分を表示",
        "anoneditwarning": "<strong>警告:</strong> ログインしていません。\n編集すると、IPアドレスがこのページの編集履歴に記録されます。",
        "anonpreviewwarning": "<em>ログインしていません。投稿を保存すると、ご使用中のIPアドレスがこのページの履歴に記録されます。</em>",
        "nonunicodebrowser": "<strong>警告: ご使用中のブラウザーは Unicode に未対応です。</strong>\n安全にページを編集する回避策を表示しています: 編集ボックス内の非 ASCII 文字を 16 進数コードで表現しています。",
        "editingold": "<strong>警告: このページの古い版を編集しています。</strong>\n保存すると、この版以降になされた変更がすべて失われます。",
        "yourdiff": "差分",
-       "copyrightwarning": "{{SITENAME}}ã\81¸ã\81®æ\8a\95稿ã\81¯ã\80\81ã\81\99ã\81¹ã\81¦$2 (詳細ã\81¯$1ã\82\92å\8f\82ç\85§) ã\81®ã\82\82ã\81¨ã\81§å\85¬é\96\8bã\81\97ã\81\9fã\81¨è¦\8bã\81ªã\81\95ã\82\8cã\82\8bã\81\93ã\81¨ã\81«ã\81\94注æ\84\8fã\81\8fã\81 ã\81\95ã\81\84ã\80\82\nã\81\82ã\81ªã\81\9fã\81\8cæ\8a\95稿ã\81\97ã\81\9fã\82\82ã\81®ã\82\92ã\80\81ä»\96人ã\81\8cよって遠慮なく編集し、それを自由に配布するのを望まない場合は、ここには投稿しないでください。<br />\nまた、投稿するのは、あなたが書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください。\n<strong>著作権保護されている作品を、許諾なしに投稿しないでください!</strong>",
+       "copyrightwarning": "{{SITENAME}}ã\81¸ã\81®æ\8a\95稿ã\81¯ã\80\81ã\81\99ã\81¹ã\81¦$2 (詳細ã\81¯$1ã\82\92å\8f\82ç\85§) ã\81®ã\82\82ã\81¨ã\81§å\85¬é\96\8bã\81\97ã\81\9fã\81¨è¦\8bã\81ªã\81\95ã\82\8cã\82\8bã\81\93ã\81¨ã\81«ã\81\94注æ\84\8fã\81\8fã\81 ã\81\95ã\81\84ã\80\82\nã\81\82ã\81ªã\81\9fã\81\8cæ\8a\95稿ã\81\97ã\81\9fã\82\82ã\81®ã\82\92ã\80\81ä»\96人ã\81«よって遠慮なく編集し、それを自由に配布するのを望まない場合は、ここには投稿しないでください。<br />\nまた、投稿するのは、あなたが書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください。\n<strong>著作権保護されている作品を、許諾なしに投稿しないでください!</strong>",
        "copyrightwarning2": "{{SITENAME}}へのすべての投稿は、他の利用者によって編集、変更、除去される場合があります。\nあなたの投稿を、他人が遠慮なく編集するのを望まない場合は、ここには投稿しないでください。<br />\nまた、投稿するのは、あなたが書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください (詳細は$1を参照)。\n<strong>著作権保護されている作品を、許諾なしに投稿してはいけません!</strong>",
        "longpageerror": "<strong>エラー: 投稿された文章は {{PLURAL:$1|$1 KB}} の長さがあります。これは投稿できる最大の長さ {{PLURAL:$2|$2 KB}} を超えています。</strong>\nこの編集内容は保存できません。",
        "readonlywarning": "<strong>警告: データベースがメンテナンスのためロックされており、現在は編集内容を保存できません。</strong>\n必要であれば文章をコピー&amp;ペーストしてテキストファイルとして保存し、後ほど保存をやり直してください。\n\nデータベースをロックした管理者による説明は以下の通りです: $1",
        "edit-gone-missing": "ページを更新できませんでした。\n既に削除されているようです。",
        "edit-conflict": "編集が競合。",
        "edit-no-change": "文章が変更されていないため、編集は無視されました。",
-       "postedit-confirmation": "編集を保存しました。",
+       "postedit-confirmation-created": "ページを作成しました。",
+       "postedit-confirmation-restored": "ページを復元しました。",
+       "postedit-confirmation-saved": "編集を保存しました。",
        "edit-already-exists": "新しいページを作成できませんでした。\nそのページは既に存在します。",
        "defaultmessagetext": "既定のメッセージ文",
        "content-failed-to-parse": "$2のコンテンツを$1モデルとして構文解析できませんでした: $3",
        "parser-template-recursion-depth-warning": "テンプレートの再帰の深さ ($1) が上限を超えました",
        "language-converter-depth-warning": "言語変換機能の深さ ($1) が制限を超えました",
        "node-count-exceeded-category": "ノード数が制限を超えたページ",
+       "node-count-exceeded-category-desc": "ノード数が制限を超えたページを列挙するカテゴリです。",
        "node-count-exceeded-warning": "ページがノード数の制限を超えました",
        "expansion-depth-exceeded-category": "展開の深さ制限を超えたページ",
+       "expansion-depth-exceeded-category-desc": "このカテゴリでは、展開の深さが制限を超えたページを列挙します。",
        "expansion-depth-exceeded-warning": "ページが展開の深さ制限を超えました",
        "parser-unstrip-loop-warning": "unstrip のループを検出しました",
        "parser-unstrip-recursion-limit": "unstrip の再帰 ($1) が上限を超えました",
        "revdelete-show-file-submit": "はい",
        "revdelete-selected-text": "[[:$2]] の{{PLURAL:$1|選択された版}}:",
        "logdelete-selected": "{{PLURAL:$1|選択された記録項目}}:",
+       "revdelete-text-text": "削除された版は履歴に表示され続けますが、一般の利用者が内容を閲覧できなくなります。",
+       "revdelete-text-file": "削除されたファイルの版はファイルの履歴に表示されつづけますが、一般の利用者はその内容の一部を閲覧できなくなります。",
+       "logdelete-text": "削除された記録項目は記録に表示されつづけますが、一般の利用者はその内容の一部を閲覧できなくなります。",
        "revdelete-text-others": "追加の制限を設定しない限り、{{SITENAME}} の他の管理者は非表示コンテンツにまだアクセスでき、この同じインターフェースを通してそれを復元することができます。",
        "revdelete-confirm": "この操作を行おうとしていること、その結果を理解していること、[[{{MediaWiki:Policy-url}}|方針]]に従っていること、を確認してください。",
        "revdelete-suppress-text": "秘匿は、<strong>以下の場合に限って</strong>使用すべきです:\n* 名誉毀損のおそれがある記述\n* 非公開個人情報\n*: <em>自宅の住所、電話番号、個人を識別できる公的な番号など</em>",
        "searchmenu-exists": "<strong>このウィキには「[[:$1]]」という名前のページがあります。</strong>{{PLURAL:$2|0=|検索で見つかった他のページも参照してください。}}",
        "searchmenu-new": "<strong>このウィキでページ「[[:$1]]」を新規作成しましょう。</strong>{{PLURAL:$2|0=|検索で見つかった他のページも参照してください。}}",
        "searchprofile-articles": "本文ページ",
-       "searchprofile-project": "ヘルプとプロジェクトページ",
        "searchprofile-images": "マルチメディア",
        "searchprofile-everything": "すべて",
        "searchprofile-advanced": "詳細",
        "searchprofile-articles-tooltip": "$1内を検索",
-       "searchprofile-project-tooltip": "$1内を検索",
        "searchprofile-images-tooltip": "ファイルを検索",
        "searchprofile-everything-tooltip": "全本文ページ (トークページを含む) 内を検索",
        "searchprofile-advanced-tooltip": "特定の名前空間内を検索",
        "search-nonefound": "問い合わせに合致する検索結果はありませんでした。",
        "powersearch-legend": "高度な検索",
        "powersearch-ns": "名前空間を指定して検索:",
-       "powersearch-redir": "転送ページを含める",
        "powersearch-togglelabel": "チェックを入れる:",
        "powersearch-toggleall": "すべて",
        "powersearch-togglenone": "すべて外す",
        "prefs-emailconfirm-label": "メールアドレスの確認:",
        "youremail": "メールアドレス:",
        "username": "{{GENDER:$1|利用者名}}:",
-       "uid": "{{GENDER:$1|利用者}} ID:",
        "prefs-memberingroups": "{{GENDER:$2|所属}}{{PLURAL:$1|グループ}}:",
        "prefs-memberingroups-type": "$1",
        "prefs-registration": "登録日時:",
        "prefs-advancedsearchoptions": "詳細設定",
        "prefs-advancedwatchlist": "詳細設定",
        "prefs-displayrc": "表示の設定",
-       "prefs-displaysearchoptions": "表示の設定",
        "prefs-displaywatchlist": "表示の設定",
        "prefs-tokenwatchlist": "トークン",
        "prefs-diffs": "差分",
        "right-move": "ページを移動",
        "right-move-subpages": "下位ページを含めてページを移動",
        "right-move-rootuserpages": "利用者ページ本体を移動",
+       "right-move-categorypages": "カテゴリのページを移動",
        "right-movefile": "ファイルを移動",
        "right-suppressredirect": "転送ページを作成せずにページを移動",
        "right-upload": "ファイルをアップロード",
        "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": "この既存のファイルへの上書き",
        "recentchanges-legend-newpage": "([[Special:NewPages|新しいページ一覧]]も参照)",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "rcnotefrom": "以下は<strong>$2</strong>以降の更新です (最大 <strong>$1</strong> 件)。",
-       "rclistfrom": "$1以降の更新を表示する",
+       "rclistfrom": "$3の$2以降の更新を表示する",
        "rcshowhideminor": "細部の編集を$1",
        "rcshowhideminor-show": "表示",
        "rcshowhideminor-hide": "非表示",
        "uploaddisabledtext": "ファイルのアップロードは、無効になっています。",
        "php-uploaddisabledtext": "ファイルのアップロードがPHPで無効化されています。\nfile_uploadsの設定を確認してください。",
        "uploadscripted": "このファイルは、ウェブブラウザーが誤って解釈してしまうおそれがあるHTMLまたはスクリプトコードを含んでいます。",
-       "uploadscriptednamespace": "この SVG ファイルは無効な名前空間「$1」を含んでいます",
+       "uploadscriptednamespace": "この SVG ファイルは無効な名前空間「$1」を含んでいます",
        "uploadinvalidxml": "アップロードされたファイルに含まれる XML が構文解析できませんでした。",
        "uploadvirus": "このファイルはウイルスを含んでいます!\n詳細: $1",
        "uploadjava": "このファイルは、Javaの.classファイルを含むZIPファイルです。\nセキュリティ上の制限を回避されるおそれがあるため、Javaファイルのアップロードは許可されていません。",
        "uploadstash-refresh": "ファイルの一覧を更新",
        "invalid-chunk-offset": "無効なチャンクオフセット",
        "img-auth-accessdenied": "アクセスが拒否されました",
-       "img-auth-nopathinfo": "PATH_INFO が見つかりません。\nサーバーが、この情報を渡すように構成されていません。\nCGI ベースであるため、img_auth に対応できない可能性もあります。\nhttps://www.mediawiki.org/wiki/Manual:Image_Authorization をご覧ください。",
+       "img-auth-nopathinfo": "PATH_INFO が見つかりません。\nサーバーが、この情報を渡すように構成されていません。\nCGI ベースであるため、img_auth に対応できない可能性もあります。\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization をご覧ください。",
        "img-auth-notindir": "要求されたパスは、設定済みのアップロード先ディレクトリ内にありません。",
        "img-auth-badtitle": "「$1」からは有効なページ名を構築できません。",
        "img-auth-nologinnWL": "ログインしておらず、さらに「$1」はホワイトリストに入っていません。",
        "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": "以下は、存在しないページへのリダイレクトの一覧です:",
        "log-title-wildcard": "この文字列で始まるページ名を検索",
        "showhideselectedlogentries": "選択した記録項目を表示/非表示",
        "allpages": "全ページ",
-       "alphaindexline": "$1から$2まで",
        "nextpage": "次のページ ($1)",
        "prevpage": "前のページ ($1)",
        "allpagesfrom": "最初に表示するページ:",
        "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>{{{Foo}}}</code> のような三重中括弧部分) を展開したあとのページが <code>$wgMaxArticleSize</code> よりも大きい",
        "expensive-parserfunction-category-desc": "高負荷なパーサー関数 (<code>#ifexist</code> など) の呼び出し回数が多過ぎるページ。[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit] を参照してください。",
        "broken-file-category-desc": "リンク切れしたファイルを含むページ (ファイルを埋め込むリンクがあり、そのファイルが存在しない) に追加されるカテゴリ",
        "hidden-category-category-desc": "<code><nowiki>__HIDDENCAT__</nowiki></code> を含むカテゴリ。このカテゴリは、既定ではページのカテゴリ リンク ボックス内に表示されません。",
        "trackingcategories-nodesc": "説明はありません。",
+       "trackingcategories-disabled": "このカテゴリは無効化されています",
        "mailnologin": "送信アドレスがありません",
        "mailnologintext": "他の利用者宛にメールを送信するためには、[[Special:UserLogin|ログイン]]し、[[Special:Preferences|個人設定]]で有効なメールアドレスを設定する必要があります。",
        "emailuser": "この利用者にメールを送信",
        "watchnologin": "ログインしていません",
        "addwatch": "ウォッチリストに追加",
        "addedwatchtext": "ページ「[[:$1]]」を[[Special:Watchlist|ウォッチリスト]]に追加しました。\nこのページまたはそのトークページが変更されると、ウォッチリストに表示されます。",
+       "addedwatchtext-short": "ページ「$1」をウォッチリストに追加しました。",
        "removewatch": "ウォッチリストから除去",
        "removedwatchtext": "ページ「[[:$1]]」を[[Special:Watchlist|ウォッチリスト]]から除去しました。",
+       "removedwatchtext-short": "ページ「$1」をウォッチリストから除去しました。",
        "watch": "ウォッチ",
        "watchthispage": "このページをウォッチする",
        "unwatch": "ウォッチ解除",
        "watchlist-details": "ウォッチリストには {{PLURAL:$1|$1 ページ}}が登録されています (トークページを除く)。",
        "wlheader-enotif": "メール通知が有効になっています。",
        "wlheader-showupdated": "最終訪問以降に変更されたページは、<strong>太字</strong>で表示されます。",
-       "watchmethod-recent": "最近の更新内のウォッチされているページを確認中",
-       "watchmethod-list": "ウォッチされているページ内の最近の更新を確認中",
-       "watchlistcontains": "ウォッチリストには {{PLURAL:$1|$1 ページ}}が登録されています。",
-       "iteminvalidname": "項目「$1」には問題があります。名前が無効です...",
        "wlnote2": "以下は $2 $3 までの {{PLURAL:$1|<strong>$1</strong> 時間}}でなされた変更です。",
        "wlshowlast": "次の期間で表示: $1時間、$2日間、$3",
        "watchlist-options": "ウォッチリストのオプション",
        "enotif_lastvisited": "最終訪問以降のすべての変更は $1 をご覧ください。",
        "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{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "$WATCHINGUSERNAMEさん\n\n$PAGEINTRO $NEWPAGE\n\n編集内容の要約: $PAGESUMMARY ($PAGEMINOREDIT)\n\n投稿者の連絡先:\nメール: $PAGEEDITOR_EMAIL\nウィキ: $PAGEEDITOR_WIKI\n\nログインした状態でこのページを訪れない限り、これ以上の活動に対する通知は送信されません。ウォッチリスト内のすべてのページについて、通知を再設定することもできます。\n\n{{SITENAME}}通知システム\n\n--\nメール通知の設定は、以下のページで変更してください:\n{{canonicalurl:{{#special:Preferences}}}}\n\nウォッチリストの設定は、以下のページで変更してください:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nこのページは、以下のページでウォッチリストから削除できます:\n$UNWATCHURL\n\nご意見、お問い合わせ:\n$HELPPAGE",
        "created": "作成",
        "changed": "変更",
        "deletepage": "ページを削除",
        "blockip": "利用者をブロック",
        "blockip-legend": "利用者をブロック",
        "blockiptext": "以下のフォームを使用して、指定したIPアドレスまたは利用者からの書き込みアクセスをブロックできます。\nこのような措置は、荒らしからの防御の目的のみに行われるべきで、また[[{{MediaWiki:Policy-url}}|方針]]に沿ったものであるべきです。\n以下にブロックの理由を具体的に書いてください (例えば、荒らされたページへの言及など)。",
-       "ipadressorusername": "IPアドレスまたは利用者名:",
+       "ipaddressorusername": "IPアドレスまたは利用者名:",
        "ipbexpiry": "有効期限:",
        "ipbreason": "理由:",
        "ipbreason-dropdown": "*よくあるブロック理由\n** 虚偽情報の挿入\n** ページから内容の除去\n** 外部サイトへのスパムリンク追加\n** ページへ無意味な/意味不明な内容の挿入\n** 威圧的な態度/嫌がらせ\n** 複数アカウントの不正利用\n** 不適切な利用者名",
        "expiringblock": "$1$2に解除",
        "anononlyblock": "匿名利用者のみ",
        "noautoblockblock": "自動ブロック無効",
-       "createaccountblock": "ã\82¢ã\82«ã\82¦ã\83³ã\83\88ä½\9cæ\88\90ã\81®禁止",
-       "emailblock": "ã\83¡ã\83¼ã\83«é\80\81ä¿¡ã\81®禁止",
+       "createaccountblock": "ã\82¢ã\82«ã\82¦ã\83³ã\83\88ä½\9cæ\88\90ã\82\82禁止",
+       "emailblock": "ã\83¡ã\83¼ã\83«é\80\81ä¿¡ã\82\82禁止",
        "blocklist-nousertalk": "自分のトークページも編集禁止",
        "ipblocklist-empty": "ブロック一覧は空です。",
        "ipblocklist-no-results": "指定されたIPアドレスまたは利用者名はブロックされていません。",
        "blocklogpage": "ブロック記録",
        "blocklog-showlog": "この利用者は以前にブロックされたことがあります。\n参考のため、ブロック記録を以下に示します:",
        "blocklog-showsuppresslog": "この利用者は以前にブロックされ、隠されたことがあります。\n参考のため、秘匿記録を以下に示します:",
-       "blocklogentry": "が [[$1]] を$2ブロックしました。追加事項: $3",
-       "reblock-logentry": "が [[$1]] のブロック設定を$2に変更しました。ブロックの詳細: $3",
+       "blocklogentry": "が [[$1]] を$2ブロックしました $3",
+       "reblock-logentry": "が [[$1]] のブロック設定を$2に変更しました $3",
        "blocklogtext": "このページは利用者のブロックと解除の記録です。\n自動的にブロックされたIPアドレスは表示されていません。\n現時点で有効なブロックは[[Special:BlockList|ブロックの一覧]]をご覧ください。",
        "unblocklogentry": "$1のブロックを解除しました",
-       "block-log-flags-anononly": "匿名利用者のみ",
-       "block-log-flags-nocreate": "アカウント作成禁止",
-       "block-log-flags-noautoblock": "自動ブロック無効",
-       "block-log-flags-noemail": "メール送信禁止",
-       "block-log-flags-nousertalk": "è\87ªå\88\86ã\81®ã\83\88ã\83¼ã\82¯ã\83\9aã\83¼ã\82¸ã\81®編集禁止",
+       "block-log-flags-anononly": "対象ã\81¯å\8c¿å\90\8då\88©ç\94¨è\80\85ã\81®ã\81¿",
+       "block-log-flags-nocreate": "アカウント作成禁止",
+       "block-log-flags-noautoblock": "自動ブロック無効",
+       "block-log-flags-noemail": "メール送信禁止",
+       "block-log-flags-nousertalk": "è\87ªå\88\86ã\81®ã\83\88ã\83¼ã\82¯ã\83\9aã\83¼ã\82¸ã\82\82編集禁止",
        "block-log-flags-angry-autoblock": "拡張自動ブロック有効",
        "block-log-flags-hiddenname": "利用者名の秘匿",
        "range_block_disabled": "範囲ブロックを作成する管理者機能は無効化されています。",
        "movepagetalktext": "関連付けられたトークページも一緒に、自動的に移動されます。ただし、<strong>以下の場合を除きます:</strong>\n* 移動先に、空ではないトークページが既に存在する場合\n* 下のボックスのチェックを消した場合\n\nこれらの場合、必要に応じて、トークページを移動または統合する必要があります。",
        "movearticle": "移動するページ:",
        "moveuserpage-warning": "<strong>警告:</strong> 利用者ページを移動しようとしています。この操作ではページのみが移動され、利用者名は<em>変更されない</em>点に注意してください。",
+       "movecategorypage-warning": "<strong>警告:</strong> カテゴリのページを移動させようとしています。カテゴリのページのみが移動するため、元のカテゴリに属していたどのページも新しいカテゴリには移動 <em>しない</em> ことにご注意ください。",
        "movenologintext": "ページを移動するためには、登録利用者でありかつ、[[Special:UserLogin|ログイン]]している必要があります。",
        "movenotallowed": "ページを移動する権限がありません。",
        "movenotallowedfile": "ファイルを移動する権限がありません。",
        "cant-move-user-page": "利用者ページを移動させる権限がありません (下位ページ内を除く)。",
        "cant-move-to-user-page": "利用者下位ページ以外の利用者ページに、ページを移動させる権限がありません。",
+       "cant-move-category-page": "カテゴリのページを移動させる権限がありません。",
+       "cant-move-to-category-page": "ページをカテゴリのページに移動させる権限がありません。",
        "newtitle": "新しいページ名:",
        "move-watch": "移動元と移動先ページをウォッチ",
        "movepagebtn": "ページを移動",
        "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|取り込み記録]]に記録されます。",
        "tooltip-summary": "短い要約を入力してください",
        "interlanguage-link-title": "$2: $1",
        "common.css": "/* ここに記述したCSSはすべての外装に反映されます */",
-       "cologneblue.css": "/* ここに記述したCSSはケルンブルー外装の利用者に影響します */",
        "monobook.css": "/* ここに記述したCSSはモノブック外装の利用者に影響します */",
-       "modern.css": "/* ここに記述したCSSはモダン外装の利用者に影響します */",
        "vector.css": "/* ここに記述したCSSはベクター外装の利用者に影響します */",
        "print.css": "/* ここに記述したCSSは印刷出力に影響します */",
        "noscript.css": "/* ここに記述したCSSはJavaScriptを無効にしている利用者に影響します */",
        "group-sysop.css": "/* ここに記述したCSSは管理者のみに影響します */",
        "group-bureaucrat.css": "/* ここに記述したCSSはビューロクラットのみに影響します */",
        "common.js": "/* ここにあるすべてのJavaScriptは、すべてのページ読み込みですべての利用者に対して読み込まれます */",
-       "cologneblue.js": "/* ここにあるすべてのJavaScriptは、ケルンブルー外装を使用している利用者に対して読み込まれます */",
        "monobook.js": "/* ここにあるすべてのJavaScriptは、モノブック外装を使用している利用者に対して読み込まれます */",
-       "modern.js": "/* ここにあるすべてのJavaScriptは、モダン外装を使用している利用者に対して読み込まれます */",
        "vector.js": "/* ここにあるすべてのJavaScriptは、ベクター外装を使用している利用者に対して読み込まれます */",
        "group-autoconfirmed.js": "/* ここにあるすべてのJavaScriptは、自動承認された利用者のみに読み込まれます */",
        "group-user.js": "/* ここにあるすべてのJavaScriptは、登録利用者のみに読み込まれます */",
        "group-bot.js": "/* ここにあるすべてのJavaScriptは、ボットのみに読み込まれます */",
        "group-sysop.js": "/* ここにあるすべてのJavaScriptは、管理者のみに読み込まれます */",
        "group-bureaucrat.js": "/* ここにあるすべてのJavaScriptは、ビューロクラットのみに読み込まれます */",
-       "notacceptable": "ウィキサーバーは、ご使用中のクライアントが読める形式では情報を提供できません。",
        "anonymous": "{{SITENAME}}の匿名{{PLURAL:$1|利用者}}",
        "siteuser": "{{SITENAME}}の利用者 $1",
        "anonuser": "{{SITENAME}}の匿名利用者 $1",
        "pageinfo-category-pages": "ページ数",
        "pageinfo-category-subcats": "下位カテゴリ数",
        "pageinfo-category-files": "ファイル数",
-       "skinname-cologneblue": "ケルンブルー",
        "skinname-monobook": "モノブック",
-       "skinname-modern": "モダン",
        "skinname-vector": "ベクター",
        "markaspatrolleddiff": "巡回済みにする",
        "markaspatrolledtext": "このページを巡回済みにする",
        "newimages-summary": "この特別ページでは、最近アップロードされたファイルを表示します。",
        "newimages-legend": "絞り込み",
        "newimages-label": "ファイル名 (またはその一部):",
-       "showhidebots": "(ボットを$1)",
+       "newimages-showbots": "ボットによるアップロードを表示",
        "noimages": "表示できるものがありません。",
        "ilsubmit": "検索",
        "bydate": "日付順",
        "size-exabytes": "$1 EB",
        "size-zetabytes": "$1 ZB",
        "size-yottabytes": "$1 YB",
-       "livepreview-loading": "読み込み中...",
-       "livepreview-ready": "読み込み中...完了!",
-       "livepreview-failed": "ライブプレビューが失敗しました!\n通常のプレビューを試してください。",
-       "livepreview-error": "接続に失敗しました: $1「$2」。\n通常のプレビューを試してください。",
        "lag-warn-normal": "この一覧には $1 {{PLURAL:$1|秒}}前以降の変更内容が表示されていないおそれがあります。",
        "lag-warn-high": "データベースサーバーの大幅な遅延のため、この一覧には $1 {{PLURAL:$1|秒}}前以降の変更内容が表示されていないおそれがあります。",
-       "watchlistedit-numitems": "ウォッチリストには {{PLURAL:$1|$1 件のページ}}が登録されています (トークページを除く)。",
-       "watchlistedit-noitems": "ウォッチリストにはどのページも登録されていません。",
        "watchlistedit-normal-title": "ウォッチリストの編集",
        "watchlistedit-normal-legend": "ウォッチリストからページを除去",
        "watchlistedit-normal-explain": "ウォッチリストに入っているページ名を以下に表示しています。\nページを除去するには、隣のボックスにチェックを入れて「{{int:watchlistedit-normal-submit}}」をクリックしてください。\nまた、[[Special:EditWatchlist/raw|ウォッチリストをテキストで編集]]も使用できます。",
        "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 件のページ}}を除去しました:",
+       "watchlistedit-too-many": "ページ数が多すぎるため表示できません。",
+       "watchlisttools-clear": "ウォッチリストの全消去",
        "watchlisttools-view": "関連する変更を閲覧",
        "watchlisttools-edit": "ウォッチリストの閲覧と編集",
        "watchlisttools-raw": "ウォッチリストをテキストで編集",
        "compare-invalid-title": "指定したページ名は無効です。",
        "compare-title-not-exists": "指定したページは存在しません。",
        "compare-revision-not-exists": "指定した版は存在しません。",
-       "dberr-header": "このウィキには問題があります",
        "dberr-problems": "申し訳ありません! このウェブサイトに技術的な障害が発生しています。",
        "dberr-again": "数分間待った後、もう一度読み込んでください。",
        "dberr-info": "(データベースサーバー $1 に接続できませんでした)",
        "htmlform-no": "いいえ",
        "htmlform-yes": "はい",
        "htmlform-chosen-placeholder": "選択してください",
+       "htmlform-cloner-delete": "除去",
        "sqlite-has-fts": "$1 (全文検索あり)",
        "sqlite-no-fts": "$1 (全文検索なし)",
        "logentry-delete-delete": "$1 がページ「$3」を{{GENDER:$2|削除しました}}",
index 290ba55..571ed7d 100644 (file)
@@ -4,7 +4,8 @@
                        "Hazard-SJ",
                        "Ukabia",
                        "Yocahuna",
-                       "គីមស៊្រុន"
+                       "គីមស៊្រុន",
+                       "아라"
                ]
        },
        "tog-underline": "Lingk andalainin",
@@ -17,7 +18,6 @@
        "tog-showtoolbar": "Shuo edit tuulbaar (rikwaya JavaScript)",
        "tog-editondblclick": "Edit piej pahn dobl klik (rikwaya JavaScript)",
        "tog-editsectiononrightclick": "Eniebl sekshan editin bai rait klikin pahn sekshan taikl (rikwaya JavaScript)",
-       "tog-rememberpassword": "Memba mi lagiin pahn dis brouza (fi a maximom a $1 {{PLURAL:$1|die|die}})",
        "tog-watchcreations": "Ad piej mi kriet tu mi wachlis",
        "tog-watchdefault": "Ad piej mi edit tu mi wachlis",
        "tog-watchmoves": "Ad piej mi muuv tu mi wachlis",
        "readonly_lag": "Di dietabies aatamatikali lak wails di sliev dietabies soervadem kechop tu di maasta",
        "internalerror": "Intoernal era",
        "internalerror_info": "Intoernal era: $1",
-       "fileappenderrorread": "Kudn riid \"$1\" juurin apen.",
-       "fileappenderror": "Kudn apen \"$1\" tu \"$2\".",
        "filecopyerror": "Kudn kapi fail \"$1\" tu \"$2\".",
        "filerenameerror": "Kudn riiniem fail \"$1\" tu \"$2\".",
        "filedeleteerror": "Kudn diliit fail \"$1\".",
        "directorycreateerror": "Kudn kriet direkchri \"$1\".",
        "filenotfound": "Kudn fain fail \"$1\".",
-       "fileexistserror": "Aniebl fi rait tu fail \"$1\": fail egzis",
        "unexpected": "Anexpektid valyu: \"$1\"=\"$2\".",
        "formerror": "Era: kudn sobmit faam",
        "badarticleerror": "Dis akshan kyaahn pofaam pahn dis piej.",
        "savearticle": "Sieb piej",
        "preview": "Priivyuu",
        "showpreview": "Shuo priivyuu",
-       "showlivepreview": "Laiv priivyuu",
        "showdiff": "Shuo chienjdem",
        "anoneditwarning": "'''Waanin:''' Yu no lag iin.\nYu IP ajres wi rikaad ina dis piej edit ischri.",
        "anonpreviewwarning": "''Yu no lag iin. Sievin wi rikaad yu IP ajres ina dis piej edit ischri.''",
        "search-interwiki-more": "(muo)",
        "powersearch-legend": "Advans saach",
        "powersearch-ns": "Saach ina niemspies:",
-       "powersearch-redir": "Lis riidirek",
        "preferences": "Prefrens",
        "mypreferences": "Mi prefrans",
        "group-sysop": "Adminischrieta",
        "recentchanges": "Riisant chienjdem",
        "recentchanges-legend": "Riisant chienj apshan",
        "recentchanges-feed-description": "Chrak di muos riisant chienjdem tu di wiki ina dis fiid.",
-       "rclistfrom": "Shuo nyuu chienjdem we taat frahn $1",
+       "rclistfrom": "Shuo nyuu chienjdem we taat frahn $3 $2",
        "rcshowhideminor": "$1 maina editdem",
        "rcshowhidebots": "$1 batdem",
        "rcshowhideliu": "$1 lag-iin yuuzadem",
index 844c9e2..dc61e25 100644 (file)
@@ -13,7 +13,8 @@
                        "Pras",
                        "Rex",
                        "StefanusRA",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Garisen ngisoré pranala:",
@@ -26,7 +27,6 @@
        "tog-showtoolbar": "Tuduhna <em>toolbar</em> (batang piranti) panyuntingan (mbutuhaké JavaScript)",
        "tog-editondblclick": "Sunting kaca nganggo klik ping loro (mbutuhaké JavaScript)",
        "tog-editsectiononrightclick": "Fungsèkna panyuntingan sub-bagian mawa klik-tengen ing judul bagian (mbutuhaké JavaScript)",
-       "tog-rememberpassword": "Émut tembung sandi kula ing peramban punika (salebeting $1 {{PLURAL:$1|dinten|dinten}})",
        "tog-watchcreations": "Tambahaké kaca sing tak gawé lan berkas sing tak unggah nèng daptar pangawasan",
        "tog-watchdefault": "Tambahaké kaca lan berkas sing tak sunting nèng daptar pangawasan",
        "tog-watchmoves": "Tambahaké kaca lan berkas sing tak pindhahaké nèng daptar pangawasan",
        "readonly_lag": "Database wis dikunci mawa otomatis sawetara database sékundhèr lagi nglakoni sinkronisasi mawa database utama",
        "internalerror": "Kasalahan internal",
        "internalerror_info": "Kaluputan internal: $1",
-       "fileappenderrorread": "Ora bisa maca \"$1\" nalika nambahi",
-       "fileappenderror": "Ora bisa nglebokaké \"$1\" menyang \"$2\".",
        "filecopyerror": "Ora bisa nulad berkas \"$1\" menyang \"$2\".",
        "filerenameerror": "Ora bisa ngowahi saka \"$1\" dadi \"$2\".",
        "filedeleteerror": "Ora bisa mbusak berkas \"$1\".",
        "directorycreateerror": "Ora bisa nggawé dirèktori \"$1\".",
        "filenotfound": "Ora bisa nemokaké berkas \"$1\".",
-       "fileexistserror": "Ora bisa nulis berkas \"$1\": berkas wis ana",
        "unexpected": "Biji (''nilai'') ing njabaning jangkauan: \"$1\"=\"$2\".",
        "formerror": "Kasalahan: Ora bisa ngirimaké formulir",
        "badarticleerror": "Pratingkah iku ora bisa katindhakaké ing kaca iki.",
        "userlogin-resetpassword-link": "Sampéyan kélangan tembung sandhi?",
        "userlogin-loggedin": "Sampeyan sampun mlebet log dadi {{GENDER:$1|$1}}.\nGunakna formulir ing ngisor iki kanggo mlebet log dadi panganggo liyane.",
        "userlogin-createanother": "Gawé akun anyar",
-       "createacct-join": "Lebokna informasi sampeyan ing ngisor iki.",
-       "createacct-another-join": "Lebokna informasi akun anyar ing ngisor iki.",
        "createacct-emailrequired": "Alamat layang èlèktronik",
        "createacct-emailoptional": "Alamat layang èlèktronik (ora kudu)",
        "createacct-email-ph": "Lebokna alamat layang èlèktronik sampeyan",
        "savearticle": "Simpen kaca",
        "preview": "Pratayang",
        "showpreview": "Mirsani pratayang",
-       "showlivepreview": "Pratayang langsung",
        "showdiff": "Tuduhna pangowahan",
        "anoneditwarning": "Panjenengan ora kadaftar mlebu. Alamat IP panjenengan bakal kacathet ing sajarah panyuntingan kaca iki.",
        "anonpreviewwarning": "''Sampéyan durung mlebu log. Nyimpen bakal nyathet alamat IP Sampéyan nèng riwayat sunting kaca iki.''",
        "edit-gone-missing": "Ora bisa nganyari kaca.\nKatoné kaca iki wis dibusak.",
        "edit-conflict": "Konflik panyuntingan.",
        "edit-no-change": "Suntingan panjenengan dilirwakaké amerga panjenengan ora nglakoni pangowahan apa-apa ing tèks.",
-       "postedit-confirmation": "Pangowahan sampéyan wis disimpen!",
+       "postedit-confirmation-saved": "Pangowahan sampéyan wis disimpen!",
        "edit-already-exists": "Ora bisa nggawé kaca anyar.\nAmerga wis ana.",
        "defaultmessagetext": "Tèks layang gawan",
        "content-failed-to-parse": "Gagal menjabarkan konten $2 untuk model $1: $3",
        "search-nonefound": "Ora ana kasil sing cocog karo pitakonan (''query'').",
        "powersearch-legend": "Panggolèkan sabanjuré (''advance search'')",
        "powersearch-ns": "Panggolèkan ing ruang jeneng:",
-       "powersearch-redir": "Pratélan pangalihan",
        "powersearch-togglelabel": "Pilih:",
        "powersearch-toggleall": "Kabèh",
        "powersearch-togglenone": "Ora ana",
        "prefs-advancedsearchoptions": "Opsi lanjutan",
        "prefs-advancedwatchlist": "Opsi lanjutan",
        "prefs-displayrc": "Opsi tampilan",
-       "prefs-displaysearchoptions": "Opsi tampilan",
        "prefs-displaywatchlist": "Opsi tampilan",
        "prefs-tokenwatchlist": "Token",
        "prefs-diffs": "Prabédan",
        "recentchanges-legend-newpage": "(dhelengen uga: [[Special:NewPages|daftar kaca anyar]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Ing ngisor iki owah-owahan wiwit <strong>$2</strong> (kapacak nganti <strong>$1</strong> owah-owahan).",
-       "rclistfrom": "Saiki nuduhaké owah-owahan wiwit tanggal $1",
+       "rclistfrom": "Saiki nuduhaké owah-owahan wiwit tanggal $3 $2",
        "rcshowhideminor": "$1 suntingan sithik",
        "rcshowhidebots": "$1 bot",
        "rcshowhideliu": "$1 panganggo sing wis ndaptar",
        "uploadstash-refresh": "Segeraké daptar berkas",
        "invalid-chunk-offset": "Ganti rugi kethoka ora sah",
        "img-auth-accessdenied": "Aksès ditulak",
-       "img-auth-nopathinfo": "Kélangan PATH_INFO.\nSasana Sampéyan durung disetèl kanggo ngliwati inpormasi iki.\nMungkin amarga abasis-CGI lan ora bisa nyengkuyung img_auth.\nDelok https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "Kélangan PATH_INFO.\nSasana Sampéyan durung disetèl kanggo ngliwati inpormasi iki.\nMungkin amarga abasis-CGI lan ora bisa nyengkuyung img_auth.\nDelok https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Alur sing dijaluk dudu dirèktori unggah kakonpigurasi.",
        "img-auth-badtitle": "Ora bisa mbangun judhul sah saka \"$1\".",
        "img-auth-nologinnWL": "Sampéyan durung mlebu log lan \"$1\" ora nèng daptar putih.",
        "watchlist-details": "Ngawasaké {{PLURAL:$1|$1 kaca|$1 kaca}}, ora kalebu kaca-kaca dhiskusi.",
        "wlheader-enotif": "Notifikasi layang elektronik diaktifaké.",
        "wlheader-showupdated": "Kaca-kaca sing wis owah wiwit ditiliki panjenengan kaping pungkasan, dituduhaké mawa '''aksara kandel'''",
-       "watchmethod-recent": "priksa daftar owah-owahan anyar kanggo kaca sing diawasi",
-       "watchmethod-list": "priksa kaca sing diawasi kanggo owah-owahan anyar",
-       "watchlistcontains": "Daftar pangawasan panjenengan isiné ana $1 {{PLURAL:$1|kaca|kaca}}.",
-       "iteminvalidname": "Ana masalah karo '$1', jenengé ora absah...",
        "wlshowlast": "Tuduhna $1 jam $2 dina $3 pungkasan",
        "watchlist-options": "Opsi daftar pangawasan",
        "watching": "Ngawasi...",
        "enotif_lastvisited": "Deleng $1 kanggo kabèh owah-owahan wiwit pungkasan panjenengan niliki.",
        "enotif_lastdiff": "Tilikana $1 kanggo mirsani owah-owahan iki.",
        "enotif_anon_editor": "panganggo anonim $1",
-       "enotif_body": "Sing minulya $WATCHINGUSERNAME,\n\nKaca $PAGETITLE ing {{SITENAME}} wis $CHANGEDORCREATED ing $PAGEEDITDATE déning $PAGEEDITOR, mangga mirsani $PAGETITLE_URL kanggo vèrsi pungkasan.\n\n$NEWPAGE\n\nSajarah suntingan: $PAGESUMMARY $PAGEMINOREDIT\n\nHubungana panyunting:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nKita ora bakal ngandhani manèh yèn diowahi manèh, kejaba panjenengan wis mirsani kaca iku. Panjenengan uga bisa mbusak tandha notifikasi kanggo kabèh kaca pangawasan ing daftar pangawasan panjenengan.\n\n             Sistém notifikasi {{SITENAME}}\n\n--\nKanggo ngowahi préferènsi ing daftar pangawasan panjenengan, mangga mirsani\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nUmpan balik lan pitulung sabanjuré:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Sing minulya $WATCHINGUSERNAME,\n\nKaca $PAGETITLE ing {{SITENAME}} wis $CHANGEDORCREATED ing $PAGEEDITDATE déning $PAGEEDITOR, mangga mirsani $PAGETITLE_URL kanggo vèrsi pungkasan.\n\n$NEWPAGE\n\nSajarah suntingan: $PAGESUMMARY $PAGEMINOREDIT\n\nHubungana panyunting:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nKita ora bakal ngandhani manèh yèn diowahi manèh, kejaba panjenengan wis mirsani kaca iku. Panjenengan uga bisa mbusak tandha notifikasi kanggo kabèh kaca pangawasan ing daftar pangawasan panjenengan.\n\n             Sistém notifikasi {{SITENAME}}\n\n--\nKanggo ngowahi préferènsi ing daftar pangawasan panjenengan, mangga mirsani\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nUmpan balik lan pitulung sabanjuré:\n$HELPPAGE",
        "created": "kadamel",
        "changed": "kaubah",
        "deletepage": "Busak kaca",
        "blockip": "Blokir panganggo",
        "blockip-legend": "Blokir panganggo",
        "blockiptext": "Enggonen formulir ing ngisor iki kanggo mblokir sawijining alamat IP utawa panganggo supaya ora bisa nyunting kaca.\nPrekara iki perlu dilakoni kanggo menggak vandalisme, lan miturut [[{{MediaWiki:Policy-url}}|kawicaksanan {{SITENAME}}]].\nLebokna alesan panjenengan ing ngisor iki (contoné njupuk conto kaca sing wis tau dirusak).",
-       "ipadressorusername": "Alamat IP utawa jeneng panganggo",
+       "ipaddressorusername": "Alamat IP utawa jeneng panganggo",
        "ipbexpiry": "Kadaluwarsa",
        "ipbreason": "Alesan:",
        "ipbreason-dropdown": "*Alesan umum mblokir panganggo\n** Mènèhi informasi palsu\n** Ngilangi isi kaca\n** Spam pranala menyang situs njaba\n** Nglebokaké tulisan ngawur ing kaca\n** Tumindak intimidasi/nglècèhaké\n** Nyalahgunakaké sawetara akun utawa rékening\n** Jeneng panganggo ora layak",
        "tooltip-undo": "Mbalèkaké révisi iki lan mbukak kothak panyuntingan jroning mode pratayang. Wènèhi kasempatan kanggo ngisi alesan ing kothak ringkesan.",
        "tooltip-preferences-save": "Simpen préperensi",
        "tooltip-summary": "Lebkaké ringkesan cedhèk",
-       "notacceptable": "Server wiki ora bisa nyedyakaké data sajroning format sing bisa diwaca déning klièn panjenengan.",
        "anonymous": "{{PLURAL:$1|Panganggo|panganggo}} anon ing {{SITENAME}}.",
        "siteuser": "Panganggo {{SITENAME}} $1",
        "anonuser": "Panganggo anonim {{SITENAME}} $1",
        "newimages-summary": "Kaca astaméwa utawa kusus iki nuduhaké daftar berkas anyar dhéwé sing diunggahaké.",
        "newimages-legend": "Filter",
        "newimages-label": "Jeneng berkas (utawa sapérangan seka jeneng berkas):",
-       "showhidebots": "($1 bot)",
        "noimages": "Ora ana sing dideleng.",
        "ilsubmit": "Golek",
        "bydate": "miturut tanggal",
        "autosumm-replace": "←Ngganti kaca karo '$1'",
        "autoredircomment": "←Ngalihaké menyang [[$1]]",
        "autosumm-new": "Gawé kaca sing isi '$1'",
-       "livepreview-loading": "Ngunggahaké…",
-       "livepreview-ready": "Ngunggahaké… Rampung!",
-       "livepreview-failed": "Pratayang langsung gagal! Coba karo pratayang normal.",
-       "livepreview-error": "Gagal nyambung: $1 \"$2\"\nCobanen mawa pratayang normal.",
        "lag-warn-normal": "Owah-owahan pungkasan sing luwih anyar tinimbang $1 {{PLURAL:$1|detik|detik}} mbokmanawa ora metu ing pratélan iki.",
        "lag-warn-high": "Amarga gedhéné ''lag'' basis data server, owah-owahan pungkasan sing luwih anyar saka $1 {{PLURAL:$1|detik|detik}} mbokmanawa ora metu ing daftar iki.",
-       "watchlistedit-numitems": "Daftar pangawasan panjenengan ngandhut {{PLURAL:$1|1 irah-irahan|$1 irah-irahan}}, ora kalebu kaca-kaca dhiskusi.",
-       "watchlistedit-noitems": "Daftar pangawasan panjenengan kosong.",
        "watchlistedit-normal-title": "Sunting daftar pangawasan",
        "watchlistedit-normal-legend": "Busak irah-irahan saka daftar pangawasan",
        "watchlistedit-normal-explain": "Irah-irahan utawa judhul ing daftar pangawasan panjenengan kapacak ing ngisor iki.\nKanggo mbusak sawijining irah-irahan, kliken kothak ing pinggiré, lan banjur kliken \"Busak judhul\".\nPanjenengan uga bisa [[Special:EditWatchlist/raw|nyunting daftar mentah]].",
        "compare-invalid-title": "Judhul sing Sampéyan awèhaké ora sah.",
        "compare-title-not-exists": "Judhul sing Sampéyan jaluk ora ana.",
        "compare-revision-not-exists": "Benahan sing Sampéyan jaluk ora ana.",
-       "dberr-header": "Wiki iki duwé masalah",
        "dberr-problems": "Nyuwun ngapura! Situs iki ngalami masalah tèknis.",
        "dberr-again": "Coba nunggu sawetara menit lan unggahna manèh.",
        "dberr-info": "(Ora bisa nyambung menyang peladèn basis data: $1)",
index 0df0830..0712260 100644 (file)
@@ -20,7 +20,8 @@
                        "Tokoko",
                        "ka.wikipedia.org sysops",
                        "לערי ריינהארט",
-                       "გიორგიმელა"
+                       "გიორგიმელა",
+                       "아라"
                ]
        },
        "tog-underline": "ბმულების ხაზგასმა:",
        "readonly_lag": "მონაცემთა ბაზა ავტომატურად დაიხურა, სანამ შვილობილი ბაზის სერვერები მთავარ ბაზასთან სინქრონიზაციას ახდენს",
        "internalerror": "შიდა შეცდომა",
        "internalerror_info": "შიდა შეცდომა: $1",
-       "fileappenderrorread": "შეუძლებელია „$1“-ის წაკითხვა დამატებისას.",
-       "fileappenderror": "ვერ მოხერხდა „$1“ შეერთება „$2“-თან",
        "filecopyerror": "„$1“ ფაილის „$2“-ზე კოპირება ვერ მოხერხდა.",
        "filerenameerror": "შეუძლებელია ფაილის „$1“ სათაურის შეცვლა სახელწოდებით „$2“.",
        "filedeleteerror": "ფაილის „$1“ წაშლა ვერ მოხერხდა.",
        "directorycreateerror": "დირექტორიის „$1“ შექმნა შეუძლებელია.",
        "filenotfound": "ფაილის „$1“ მოძიება ვერ მოხერხდა.",
-       "fileexistserror": "შეუძლებელია ფაილის „$1“ ჩაწერა: ფაილი არსებობს",
        "unexpected": "გაუთვალისწინებელი სიდიდე: „$1“=„$2“.",
        "formerror": "შეცდომა: ფორმის გაგზავნა ვერ მოხერხდა.",
        "badarticleerror": "ეს მოქმედება ვერ შესრულდება ამ გვერდზე.",
        "gotaccountlink": "შესვლა",
        "userlogin-resetlink": "ავტორიზაციის მონაცემები დაგავიწყდათ?",
        "userlogin-resetpassword-link": "დაგავიწყდათ პაროლი?",
+       "userlogin-helplink2": "დახმარება:შესვლა",
        "userlogin-createanother": "სხვა ანგარიშის შექმნა",
-       "createacct-join": "ქვემოთ მიუთითეთ ინფორმაცია თქვენ შესახებ.",
-       "createacct-another-join": "ქვემოთ შეიყვანეთ ახალი ანგარიშის ინფორმაცია.",
        "createacct-emailrequired": "ელ. ფოსტის მისამართი",
        "createacct-emailoptional": "ელ. ფოსტის მისამართი (არასავალდებულო)",
        "createacct-email-ph": "შეიყვანეთ თქვენი ელ. ფოსტის მისამართი",
        "user-mail-no-addy": "ცდილობდა ელ-ფოსტის გაგზავნას ელ-ფოსტის მისამართის გარეშე.",
        "user-mail-no-body": "ცდილობდა ცარიელი ან უაზროდ მოკლე შინაარსის ელექტრონული წერილის გაგზავნას.",
        "changepassword": "პაროლის შეცვლა",
-       "resetpass_announce": "á\83\97á\83¥á\83\95á\83\94á\83\9c á\83¨á\83\94á\83\9bá\83\9dá\83®á\83\95á\83\94á\83\93á\83\98á\83\97 á\83\93á\83 á\83\9dá\83\94á\83\91á\83\98á\83\97 á\83\94á\83\9a\83¤á\83\9dá\83¡á\83¢á\83\98á\83¡ á\83\99á\83\9dá\83\93á\83\98á\83\97. á\83 á\83\94á\83\92á\83\98á\83¡á\83¢á\83 á\83\90á\83ªá\83\98á\83\98á\83¡ á\83\93á\83\90á\83¡á\83 á\83£á\83\9aá\83\94á\83\91á\83\98á\83¡á\83\97á\83\95á\83\98á\83¡, á\83£á\83\9cá\83\93á\83\90 á\83¨á\83\94á\83¥á\83\9bá\83\9cá\83\90á\83\97 á\83\90á\83®á\83\90á\83\9aá\83\98 á\83\9eá\83\90á\83 á\83\9dá\83\9aá\83\98 á\83\90á\83¥:",
+       "resetpass_announce": "á\83¡á\83\98á\83¡á\83¢á\83\94á\83\9bá\83\90á\83¨á\83\98 á\83¨á\83\94á\83¡á\83\95á\83\9aá\83\98á\83¡ á\83\93á\83\90á\83¡á\83 á\83£á\83\9aá\83\94á\83\91á\83\98á\83¡á\83\90á\83\97á\83\95á\83\98á\83¡ á\83\97á\83¥á\83\95á\83\94á\83\9c á\83£á\83\9cá\83\93á\83\90 á\83\93á\83\90á\83\90á\83§á\83\94á\83\9cá\83\9dá\83\97 á\83\90á\83®á\83\90á\83\9aá\83\98 á\83\9eá\83\90á\83 á\83\9dá\83\9aá\83\98.",
        "resetpass_text": "<!-- აქ დაამატეთ ტექსტი -->",
        "resetpass_header": "შეცვალეთ ანგარიშის პაროლი",
        "oldpassword": "ძველი პაროლი:",
        "savearticle": "შენახვა",
        "preview": "წინასწარი გადახედვა",
        "showpreview": "წინასწარი გადახედვა",
-       "showlivepreview": "შავი ნიმუში",
        "showdiff": "ცვლილებების ჩვენება",
        "anoneditwarning": "'''გაფრთხილება:''' თქვენ არ ხართ რეგისტრირებული. თქვენი IP მისამართი ჩაიწერება ამ გვერდის რედაქტირების ისტორიაში.",
        "anonpreviewwarning": "''თქვენ არ შესულხართ სისტემაში. თქვენი IP მისამართი შეინახება გვერდის ისტორიაში. ''",
        "permissionserrorstext": "თქვენ არ გაქვთ ამის გაკეთების უფლება, შემდეგი {{PLURAL:$1|მიზეზის|მიზეზების}} გამო:",
        "permissionserrorstext-withaction": "თქვენ არ გაქვთ ამ მოქმედების - „$2“ განხორციელების ნებართვა შემდეგი {{PLURAL:$1|მიზეზის|მიზეზის}} გამო:",
        "recreate-moveddeleted-warn": "'''გაფრთხილება: თქვენ ხელახლა ქმნით გვერდს, რომელიც ადრე წაიშალა.'''\n\nგთხოვთ დაფიქრდეთ, მისაღები არის თუ არა ამ გვერდის რედაქტირების გაგრძელება.\nინფორმაციისთვის ქვემოთ მოყვანილია ამ გვერდის წაშლის ისტორია:",
-       "moveddeleted-notice": "á\83\94á\83¡ á\83\92á\83\95á\83\94á\83 á\83\93á\83\98 á\83¬á\83\90á\83\98á\83¨á\83\90á\83\9aá\83\90. á\83\98á\83\9cá\83¤á\83\9dá\83 á\83\9bá\83\90á\83ªá\83\98á\83\98á\83¡ á\83\9bá\83\98á\83¡á\83\90á\83¦á\83\94á\83\91á\83\90á\83\93 á\83¥á\83\95á\83\94á\83\9bá\83\9dá\83\97 á\83¬á\83\90á\83 á\83\9bá\83\93á\83\92á\83\94á\83\9cá\83\98á\83\9aá\83\98á\83\90 á\83¨á\83\94á\83¡á\83\90á\83\91á\83\90á\83\9bá\83\98á\83¡á\83\98 á\83©á\83\90á\83\9cá\83\90á\83¬á\83\94á\83 á\83\94á\83\91á\83\98 á\83¬á\83\90á\83¨á\83\9aá\83\98á\83¡á\83\90 á\83\93á\83\90 á\83\92á\83\90á\83\93á\83\90á\83¥á\83 მევის ჟურნალებიდან.",
+       "moveddeleted-notice": "á\83\94á\83¡ á\83\92á\83\95á\83\94á\83 á\83\93á\83\98 á\83¬á\83\90á\83\98á\83¨á\83\90á\83\9aá\83\90. á\83\98á\83\9cá\83¤á\83\9dá\83 á\83\9bá\83\90á\83ªá\83\98á\83\98á\83¡ á\83\9bá\83\98á\83¡á\83\90á\83¦á\83\94á\83\91á\83\90á\83\93 á\83¥á\83\95á\83\94á\83\9bá\83\9dá\83\97 á\83¬á\83\90á\83 á\83\9bá\83\9dá\83\93á\83\92á\83\94á\83\9cá\83\98á\83\9aá\83\98á\83\90 á\83¨á\83\94á\83¡á\83\90á\83\91á\83\90á\83\9bá\83\98á\83¡á\83\98 á\83©á\83\90á\83\9cá\83\90á\83¬á\83\94á\83 á\83\94á\83\91á\83\98 á\83¬á\83\90á\83¨á\83\9aá\83\98á\83¡á\83\90 á\83\93á\83\90 á\83\92á\83\90á\83\93á\83\90á\83 á\83¥მევის ჟურნალებიდან.",
        "log-fulllog": "ყველა ჟურნალის ხილვა",
        "edit-hook-aborted": "შესწორება გაუქმებულია გადამჭერით.\nდამატებითი ახსნა არ ჩაწერილა.",
        "edit-gone-missing": "გვერდის განახლეა შეუძლებელია.\nშესაძლოა, იგი წაიშალა.",
        "edit-conflict": "რედაქციების კონფლიქტი.",
        "edit-no-change": "თქვენი შესწორება არ იქნა შენახული, რადგანაც ტექსტის ცვლილება არ მოხდა.",
-       "postedit-confirmation": "თქვენი რედაქტირება შენახულია.",
+       "postedit-confirmation-saved": "თქვენი რედაქტირება შენახულია.",
        "edit-already-exists": "ახალი გვერდის შექმნა არ მოხერხდა.\nის უკვე არსებობს.",
        "defaultmessagetext": "შეტყობინების სტანდარტული ტექსტი",
        "content-failed-to-parse": "$2-ის შინაარსი არ შეესაბამება $1-ის ტიპს: $3.",
        "invalid-content-data": "დაუშვებელი მონაცემები",
        "content-not-allowed-here": "„$1“-ის შინაარსი დაუშვებელია [[$2]] გვერდზე",
-       "editwarning-warning": "სხვა გვერდზე გადასვლამ შესაძლოა გამოიწვიოს ცვლილებების დაკარგვა.\nთუკი თქვენ დარეგისტრირებული ხართ სისტემაში, მაშინ შეგიძლიათ გამორთოთ ეს გაფრთხილება თქვენი კონფიგურაციის განყოფილებაში „რედაქტირება“ .",
+       "editwarning-warning": "სხვა გვერდზე გადასვლამ შესაძლოა გამოიწვიოს ცვლილებების დაკარგვა.\nთუკი თქვენ დარეგისტრირებული ხართ სისტემაში, მაშინ შეგიძლიათ გამორთოთ ეს გაფრთხილება თქვენი კონფიგურაციის განყოფილებაში „{{int:prefs-editing}}“ .",
        "content-model-wikitext": "ვიკიტექსტი",
        "content-model-text": "ჩვეულებრივი ტექსტი",
        "content-model-javascript": "ჯავასკრიპტი",
        "search-nonefound": "მოთხოვნის შესაბამისობა არ არის ნაპოვნი.",
        "powersearch-legend": "გაფართოებული ძიება",
        "powersearch-ns": "ძიება სახელთა სივრცეებში:",
-       "powersearch-redir": "გადამისამართებების სიის ჩვენება",
        "powersearch-togglelabel": "მონიშვნა:",
        "powersearch-toggleall": "ყველა",
        "powersearch-togglenone": "არაფერი",
        "prefs-emailconfirm-label": "ელ-ფოსტის დადასტურება:",
        "youremail": "ელექტრონული ფოსტა:",
        "username": "{{GENDER:$1|მომხმარებლის სახელი}}:",
-       "uid": "{{GENDER:$1|მომხმარებლის}} იდენტიფიკატორი:",
        "prefs-memberingroups": "{{PLURAL:$1|ჯგუფის|ჯგუფების}} {{GENDER:$2|წევრი}}:",
        "prefs-memberingroups-type": "$1",
        "prefs-registration": "რეგისტრაციის თარიღი",
        "prefs-advancedsearchoptions": "გაფართოებული პარამეტრები",
        "prefs-advancedwatchlist": "გაფართოებული კონფიგურაციები",
        "prefs-displayrc": "გამოსახვის კონფიგურაციები",
-       "prefs-displaysearchoptions": "გამოსახვის კონფიგურაციები",
        "prefs-displaywatchlist": "გამოსახვის კონფიგურაციები",
        "prefs-tokenwatchlist": "ჟეტონი",
        "prefs-diffs": "სხვაობა ვერსიებს შორის",
        "recentchanges-label-plusminus": "ცვლილებების ზომა ბაიტებში",
        "recentchanges-legend-heading": "'''ლეგენდა:'''",
        "recentchanges-legend-newpage": "(იხ. აგრეთვე [[Special:NewPages|ახალი გვერდების სია]])",
-       "rcnotefrom": "ქვემოთ მოყვანილია ცვლილებები '''$2'''-დან (ნაჩვენებია '''$1''').",
-       "rclistfrom": "ახალი ცვლილებების ჩვენება დაწყებული $1-დან",
+       "rcnotefrom": "ქვემოთ მოყვანილია ცვლილებები <strong>$2</strong>-დან (ნაჩვენებია არაუმეტეს <strong>$1</strong>).",
+       "rclistfrom": "ახალი ცვლილებების ჩვენება დაწყებული $3 $2-დან",
        "rcshowhideminor": "მცირე რედაქტირების $1",
+       "rcshowhideminor-show": "ჩვენება",
+       "rcshowhideminor-hide": "დამალვა",
        "rcshowhidebots": "რობოტების  $1",
        "rcshowhidebots-show": "ჩვენება",
        "rcshowhidebots-hide": "დამალვა",
-       "rcshowhideliu": "$1 რეგისტრირებული მომხმარებელი",
+       "rcshowhideliu": "რეგისტრირებული მომხმარებლების $1",
+       "rcshowhideliu-show": "ჩვენება",
+       "rcshowhideliu-hide": "დამალვა",
        "rcshowhideanons": "ანონიმური მომხმარებლების $1",
+       "rcshowhideanons-show": "ჩვენება",
+       "rcshowhideanons-hide": "დამალვა",
        "rcshowhidepatr": "გაკონტროლებული ცვლილებების $1",
        "rcshowhidemine": "ჩემი რედაქტირების $1",
+       "rcshowhidemine-show": "ჩვენება",
+       "rcshowhidemine-hide": "დამალვა",
        "rclinks": "ბოლო $1 ცვლილების ჩვენება უკანასკნელი $2 დღის მანძილზე<br />$3",
        "diff": "განსხ.",
        "hist": "ისტ.",
        "uploadstash-refresh": "ფაილების სიის განახლება",
        "invalid-chunk-offset": "არასწორი საწყისი წერტილი",
        "img-auth-accessdenied": "მოქმედება აკრძალულია",
-       "img-auth-nopathinfo": "დაკარგულია PATH_INFO.\nთქვენი სერვერი არ არის მომართული ამ ინფორმაციის გადასაცემად.\nშესაძლოა, ის მუშაობს CGI-ის ბაზაზე და არ გააჩნია img_auth მხარდაჭერა.\n[//www.mediawiki.org/wiki/Manual:Image_Authorization იხილეთ სურათის ავტორიზაცია.]",
+       "img-auth-nopathinfo": "დაკარგულია PATH_INFO.\nთქვენი სერვერი არ არის მომართული ამ ინფორმაციის გადასაცემად.\nშესაძლოა, ის მუშაობს CGI-ის ბაზაზე და არ გააჩნია img_auth მხარდაჭერა.\n[//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization იხილეთ სურათის ავტორიზაცია.]",
        "img-auth-notindir": "მოთხოვნილი გზა არ შეესაბამება ატვირთვის ფოლდერს.",
        "img-auth-badtitle": "შეუძლებელია სწორი სათაურის შექმნა \"$1\"-დან.",
        "img-auth-nologinnWL": "თქვენ არ შესულხართ სისტემაში, ხოლო «$1» არ არის თეთრ სიაში.",
        "log-title-wildcard": "სათაურების ძებნა, რომლებიც იწყება ამ ტექსტით",
        "showhideselectedlogentries": "არჩეული ჟურნალის ჩანაწერის ჩვენება/დამალვა",
        "allpages": "ყველა გვერდი",
-       "alphaindexline": "$1-დან $2-მდე",
        "nextpage": "შემდეგი გვერდი ($1)",
        "prevpage": "წინა გვერდი ($1)",
        "allpagesfrom": "გვერდების ჩვენება დაწყებული:",
        "watchlist-details": "$1 გვერდია თქვენი კონტროლის სიაში განხილვის გვერდების ჩაუთვლელად.",
        "wlheader-enotif": "ელ.ფოსტით შეტყობინება ჩართულია.",
        "wlheader-showupdated": "თქვენი ბოლო ვიზიტის შემდეგ შეცვლილი გვერდები, აღნიშნულია '''მუქად'''.",
-       "watchmethod-recent": "მიმდინარეობს უახლესი შესწორებების შემოწმება კონტროლის ქვეშ მყოფი გვერდების მიხედვით.",
-       "watchmethod-list": "მიმდინარეობს თქვენი კონტროლის ქვეშ მყოფი გვერდების შემოწმება უახლესი შესწორებების მიხედვით.",
-       "watchlistcontains": "თქვენი კონტროლის სია შეიცავს $1 გვერდს.",
-       "iteminvalidname": "„$1-ს“ პრობლემა აქვს, სახელი არასწორია...",
        "wlshowlast": "აჩვენე ბოლო $1 საათის $2 დღის $3",
        "watchlist-options": "კონტროლის სიის პარამეტრები",
        "watching": "კონტროლებადი...",
        "enotif_lastvisited": "იხ. $1 ყველა ცვლილებისთვის თქვენი ბოლო შემოსვლის შემდეგ.",
        "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\t\t\t {{SITENAME}} შეტყობინებათა სისტემა\n\n--\nშეტყობინების პარამეტრების ცვლილება\n{{canonicalurl:{{#special:Preferences}}}}\n\nთქვენი კონტროლის სიის პარამეტრების ცვლილება\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nგვერდების ამოშლა თქვენი კონტროლის სიიდან\n$UNWATCHURL\n\nდამატებითი ინფორმაცია\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "ძვირფასო $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nცვლილების მოკლე აღწერა: $PAGESUMMARY $PAGEMINOREDIT\n\nდაუკავშირდით რედაქტორს:\nელ.ფოსტა: $PAGEEDITOR_EMAIL\nვიკი: $PAGEEDITOR_WIKI\n\nშემდგომი ცვლილებების შესახებ შეტყობინებების მისაღებად ამ გვერდს კვლავ უნდა ესტუმროთ. თქვენ აგრეთვე შეგიძლიათ თქვენ კონტროლის სიაში გათიშოთ შეტყობინების ფუნქცია ყველა გვერდისათვის.\n\n\t\t\t {{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": "გვერდის წაშლა",
        "blockip": "მომხმარებლის ან IP მისამართის ბლოკირება",
        "blockip-legend": "მომხმარებლის დაბლოკვა",
        "blockiptext": "გამოიყენეთ ქვემოთ მოყვანილი ფორმა სპეციფიური IP მისამართის\nან მომხმარებლისთვის რედაქტირების ბლოკირებისთვის.\nამის გაკეთება შეიძლება მხოლოდ ვანდალიზმის ასარიდებლად,\nდა [[{{MediaWiki:Policy-url}}|პოლიტიკასთან]] თანხმობაში.\nჩაწერეთ სპეციფიური მიზეზი ქვემოთ (მაგ. მიუთითეთ გვერდები,\nრომლებზეც ვანდალიზმი განხორციელდა).",
-       "ipadressorusername": "IP მისამართი ან მომხმარებლის სახელი",
+       "ipaddressorusername": "IP მისამართი ან მომხმარებლის სახელი",
        "ipbexpiry": "ვადა",
        "ipbreason": "მიზეზი:",
        "ipbreason-dropdown": "* დაბლოკვის სტანდარტული მიზეზები\n** ცრუ ინფორმაციის ჩამატება\n** გვერდების შინაარსის წაშლა\n** სპამ ბმულები გარე საიტებზე\n** სულელური ტექსტის/ნაგვის ჩამატება\n** დაშინება, მომხმარებელთა დარბევა\n** რამდენიმე ანგარიშის ბოროტად გამოყენება\n** მომხმარებლის მიუღებელი სახელი",
        "group-sysop.css": "/* აქ განთავსებული CSS გამოყენებული იქნება მხოლოდ ადმინისტრატორებისათვის */",
        "group-bureaucrat.css": "/* აქ განთავსებული CSS გამოყენებული იქნება მხოლოდ ბიუროკრატებისათვის */",
        "common.js": "/* აქ ნებისმიერი ჯავასკრიპტი ყველა მომხმარებლისთვის ჩაიტვირთება ყველა გვერდზე. */",
-       "notacceptable": "ვიკი სერვერს არ შეუძლია წარმოგიდგინოთ ინფორმაცია იმ სახით, რომლის კითხვა თქვენ ბრაუზერს შეუძლია.",
        "anonymous": "{{SITENAME}}-ის ანონიმური {{PLURAL:$1|მომხმარებელი|მომხმარებლები}}",
        "siteuser": "{{SITENAME}} მომხმარებელი $1",
        "anonuser": "{{SITENAME}} ანონიმური მომხმარებელი $1",
        "newimages-summary": "ეს სპეცგვერდი აჩვენებს ბოლო დროს ატვირთულ ფაილებს.",
        "newimages-legend": "ფილტრი",
        "newimages-label": "ფაილის (ან მისი სახელის) ნაწილი",
-       "showhidebots": "(რობოტების $1)",
        "noimages": "გადასახედი არაფერია.",
        "ilsubmit": "ძიება",
        "bydate": "თარიღით",
        "bitrate-exabits": "$1 ებ/წმ",
        "bitrate-zetabits": "$1 ზბ/წმ",
        "bitrate-yottabits": "$1 იბ/წმ",
-       "livepreview-loading": "იტვირთება…",
-       "livepreview-ready": "იტვირთება… მზადაა!",
-       "livepreview-failed": "ვვერ მოხერხდა ჩქარი წინასწარ გადახედვის განხორციელება. ეცადეთ ჩვეულებრივი წინასწარ გადახედვის გამოყენება/",
-       "livepreview-error": "ვერ მოხერხდა დაკავშირება: $1 «$2». ეცადეთ ჩვეულებრივი წინასწარ გადახედვის გამოყენება.",
        "lag-warn-normal": "სიაში $1 {{PLURAL:$1|წამი|წამები|წამებში}} განხორციელებული ცვლილებები არ იქნება ნაჩვენები ამ სიაში.",
        "lag-warn-high": "სერვერთა სიქრონიზაციაში შეფერხების გამო $1 {{PLURAL:$1|წამი|წამები|წამებში}} განხორციელებული ცვლილებები არ იქნება ნაჩვენები ამ სიაში.",
-       "watchlistedit-numitems": "თქვენი კონტროლის სია $1 სათაურს შეიცავს, განხილვის გვერდების გარდა.",
-       "watchlistedit-noitems": "თქვენი კონტროლის სია ცარიელია.",
        "watchlistedit-normal-title": "კონტროლის სიის რედაქტირება",
        "watchlistedit-normal-legend": "მოხსენით სათაურები კონტროლის სიიდან",
        "watchlistedit-normal-explain": "ქვემოთ წარმოდგენილია თქვენი კონტროლის სიის გვერდები.\nწაშლისთვის მონიშნეთ გვერდები დაა დააჭირეთ '''„ჩანაწერების წაშლას“'''.\nთქვენ ასევე შეგიძლიათ მისი  [[Special:EditWatchlist/raw|ტექსტად შესწორება]].",
        "compare-invalid-title": "თქვენ მიერ მითითებულია დაუშვებელი სახელი.",
        "compare-title-not-exists": "თქვენ მიერ მითითებული სახელი არ არსებობს.",
        "compare-revision-not-exists": "თქვენ მიერ მითითებული ვერსია არ არსებობს.",
-       "dberr-header": "ეს ვიკი განიცდის პრობლემას",
        "dberr-problems": "ბოდიში! საიტზე დროებითი ტექნიკური პრობლემებია",
        "dberr-again": "ეცადეთ რამდენიმე წუთით დაცდა და ამ გვერდის გადატვირთვა",
        "dberr-info": "ვერ მოხერხდა ინფორმაციის $1 სერვერთან დაკავშირება",
index 06f4fcf..8e1db50 100644 (file)
@@ -7,7 +7,8 @@
                        "Jiemurat",
                        "Kaganer",
                        "Reedy",
-                       "Urhixidur"
+                       "Urhixidur",
+                       "아라"
                ]
        },
        "tog-underline": "Siltewdin' astın sız:",
@@ -18,7 +19,6 @@
        "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-rememberpassword": "Menin' kirgenimdi usı kompyuterde saqlap qal (en' ko'bi menen $1 {{PLURAL:$1|ku'nge|ku'nge}} shekem)",
        "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",
        "filedeleteerror": "\"$1\" faylı o'shirilmedi.",
        "directorycreateerror": "\"$1\" papkası jaratılmadı.",
        "filenotfound": "\"$1\" faylı tabılmadı.",
-       "fileexistserror": "\"$1\" faylına jazıwg'a bolmaydı: bunday fayl bar",
        "unexpected": "Ku'tilmegen ma'nis: \"$1\" = \"$2\".",
        "formerror": "Qatelik: forma mag'lıwmatların jiberiw mu'mkin emes",
        "badarticleerror": "Bunday ha'reket bul bette atqarılmaydı.",
        "savearticle": "Betti saqla",
        "preview": "Ko'rip shıg'ıw",
        "showpreview": "Ko'rip shıq",
-       "showlivepreview": "Tez ko'rip shıg'ıw",
        "showdiff": "O'zgerislerdi ko'rset",
        "anoneditwarning": "'''Esletpe:''' Siz kirmedin'iz. Sizin' IP adresin'iz usi bettin' o'zgeris tariyxında saqlanıp qaladı.",
        "missingsummary": "'''Esletpe:''' O'zgeristin' qısqasha mazmunın ko'rsetpedin'iz.\n\"Saqlaw\"dı ja'ne bassan'ız, o'zgerislerin'iz hesh qanday kommentariysiz saqlanadı.",
        "search-nonefound": "Sorawg'a sa'ykes na'tiyje tabılmadı.",
        "powersearch-legend": "Ken'eytilgen izlew",
        "powersearch-ns": "Usı isimler ko'pliginen izlew:",
-       "powersearch-redir": "Qayta bag'ıtlawshı betlerdi ko'rset",
        "search-external": "Sırtqı izlewshi",
        "preferences": "Sazlawlar",
        "mypreferences": "Menin' sazlawlarım",
        "recentchanges-label-unpatrolled": "Bul o'zgeris ele baqlanbag'an",
        "recentchanges-legend-newpage": "$1 - taza bet",
        "rcnotefrom": "To'mende '''$2''' baslap '''$1''' shekemgi o'zgerisler ko'rsetilgen.",
-       "rclistfrom": "$1 waqtınan baslap jan'a o'zgerisler ko'rset",
+       "rclistfrom": "$3 $2 waqtınan baslap jan'a o'zgerisler ko'rset",
        "rcshowhideminor": "Kishi o'zgerislerdi $1",
        "rcshowhidebots": "Botlardı $1",
        "rcshowhideliu": "Kirgenlerdi $1",
        "notvisiblerev": "Nusqa o'shirildi",
        "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.",
-       "watchlistcontains": "Sizin' baqlaw dizimin'izde {{PLURAL:$1|1 bet|$1 bet}} bar.",
        "wlshowlast": "Aqırg'ı $1 saat, $2 ku'n, $3 ko'rset",
        "watchlist-options": "Baqlaw diziminin' sazlawları",
        "watching": "Baqlaw...",
        "autoredircomment": "[[$1]] degenge burıw",
        "autosumm-new": "Taza bet jaratıldı: \"$1\"",
        "lag-warn-normal": "Usı dizimde $1 {{PLURAL:$1|sekundtan|sekundtan}} jan'alaw bolg'an o'zgerisler ko'rsetilmewi mu'mkin.",
-       "watchlistedit-numitems": "Sizin' baqlaw dizimin'izde, sa'wbet betlerin esapqa almag'anda {{PLURAL:$1|1 atama|$1 atama}} bar.",
-       "watchlistedit-noitems": "Baqlaw dizimin'izde atamalar joq.",
        "watchlistedit-normal-title": "Baqlaw dizimin o'zgertiw",
        "watchlistedit-normal-legend": "Baqlaw diziminen atamalardi o'shıriw",
        "watchlistedit-normal-submit": "Atamalardı O'shir",
index 936bbfe..7737c39 100644 (file)
@@ -9,7 +9,8 @@
                        "MoubarikBelkasim",
                        "Salem333",
                        "Teak",
-                       "Urhixidur"
+                       "Urhixidur",
+                       "아라"
                ]
        },
        "tog-underline": "Derrer izdayen:",
@@ -22,7 +23,6 @@
        "tog-showtoolbar": "Ssken tafeggagt n ifecka n ubeddel",
        "tog-editondblclick": "Beddel isebtar mi wekkiɣ snat n tikwal",
        "tog-editsectiononrightclick": "Ssermed abeddel n tigezmi s ukliki ayeffus ɣef izwal",
-       "tog-rememberpassword": "Cfu ɣef yisem n umseqdac inu di uselkim-agi (i afellay n $1 {{PLURAL:$1|ass|ussan}})",
        "tog-watchcreations": "Rnu isebtar i xelqeɣ deg wumuɣ n uɛessi inu",
        "tog-watchdefault": "Rnu isebtar i ttbeddileɣ deg wumuɣ n uɛessi inu",
        "tog-watchmoves": "Rnu isebtar i smimḍeɣ deg wumuɣ n uɛessi inu",
        "readonly_lag": "Database d tamsekkert (weḥdes) axaṭer kra n serveur ɛeṭṭlen",
        "internalerror": "Agul zdaxel",
        "internalerror_info": "Anezri agensan : $1",
-       "fileappenderrorread": "Ulamek an ɣeṛ « $1 »  mi taguri",
-       "fileappenderror": "Ulamek an seffes « $1 » ar « $2 ».",
        "filecopyerror": "Ur yezmir ara ad yexdem alsaru n ufaylu \"$1\" ar \"$2\".",
        "filerenameerror": "Ur yezmir ara ad ibeddel isem ufaylu \"$1\" ar \"$2\".",
        "filedeleteerror": "Ulamek an mḥu afaylu \"$1\".",
        "directorycreateerror": "Ulamek an snulfu akaram « $1 ».",
        "filenotfound": "Ur yezmir ara ad yaf afaylu \"$1\".",
-       "fileexistserror": "Ulamek an aru afaylu « $1 » : afaylu agi yesnulfad yakan.",
        "unexpected": "Agul: \"$1\"=\"$2\".",
        "formerror": "Agul: ur yezmir ara ad yazen talɣa",
        "badarticleerror": "Ur yezmir ara ad yexdem tigawt-agi deg usebter-agi.",
        "userlogin-resetpassword-link": "Ettuḍ awal n uɛaddi ?",
        "userlogin-loggedin": "Teqqneḍ yakan am {{GENDER:$1|$1}}. Seqdec tiferkit ddaw-agi iwakken ad teqqneḍ s umiḍan nniḍen.",
        "userlogin-createanother": "Snulfud amiḍan nniḍen",
-       "createacct-join": "Sekcem tilɣa inek(m) ddaw-agi.",
-       "createacct-another-join": "Sekcem tilɣa n umiḍan amaynut ddaw-agi.",
        "createacct-emailrequired": "Tansa email",
        "createacct-emailoptional": "Tansa email (axetṛan)",
        "createacct-email-ph": "Sekcem tansa email inek(m)",
        "savearticle": "Beddel asebter",
        "preview": "Pre-Ẓer",
        "showpreview": "Ssken pre-timeẓriwt",
-       "showlivepreview": "Pre-timeẓriwt taǧiḥbuṭ",
        "showdiff": "Ssken ibeddlen",
        "anoneditwarning": "'''Aɣtal:''' Ur tkecmiḍ ara. Tansa IP inek ad tettusmekti deg umezruy n usebter-agi.",
        "anonpreviewwarning": "''Ur tesuluḍ ara. Aḥraz ad yekles tansa IP inek/inem deg umezruy n ibeddilen n usebter.''",
        "edit-gone-missing": "Ur yezmer ara ad yemucceḍ asebter agi.\nAhat yetwemḥa.",
        "edit-conflict": "Amgirred n ubeddel.",
        "edit-no-change": "Abeddel inek/inem ur yetwexdam ara acku ur di ban ara abeddel deg uḍris.",
-       "postedit-confirmation": "Abeddel inek/inem yetwakles.",
+       "postedit-confirmation-saved": "Abeddel inek/inem yetwakles.",
        "edit-already-exists": "Asebter amaynut ur d yesnufu ara.\nYella yakan.",
        "defaultmessagetext": "Izen s lexṣas",
        "content-failed-to-parse": "Tasleṭ n ugbur n $2 i talɣa $1 texseṛ : $3",
        "search-nonefound": "Ulac igmad i usuter agi.",
        "powersearch-legend": "Anadi amahlan",
        "powersearch-ns": "Nadi deg tallunin n isemawen",
-       "powersearch-redir": "Beqqeḍ isemmimḍen",
        "powersearch-togglelabel": "Ɛellem :",
        "powersearch-toggleall": "Akkw",
        "powersearch-togglenone": "Ulac",
        "prefs-advancedsearchoptions": "Tixtiṛiyin timahlanin",
        "prefs-advancedwatchlist": "Tixtiṛiyin timahlanin",
        "prefs-displayrc": "Tixtiṛiyin n ubeqqeḍ",
-       "prefs-displaysearchoptions": "Tixtiṛiyin n ubeqqeḍ",
        "prefs-displaywatchlist": "Tixtiṛiyin n ubeqqeḍ",
        "prefs-tokenwatchlist": "Tiddest",
        "prefs-diffs": "Timeẓliwin",
        "recentchanges-legend-newpage": "(zeṛ daɣen [[Special:NewPages|umuɣ n isebtar imaynuten]]).",
        "recentchanges-legend-plusminus": "(''± 123'')",
        "rcnotefrom": "Deg ukessar llan ibeddlen seg wasmi '''$2''' (ar '''$1''').",
-       "rclistfrom": "Ssken ibeddlen imaynuten seg $1",
+       "rclistfrom": "Ssken ibeddlen imaynuten seg $3 $2",
        "rcshowhideminor": "$1 ibeddlen ifessasen",
        "rcshowhidebots": "$1 irubuten",
        "rcshowhideliu": "$1 imseqdacen imseklesen",
        "uploadstash-refresh": "Mucceḍ umuɣ n ifuyla",
        "invalid-chunk-offset": "Tiggit n iɣil ur teɣbel ara",
        "img-auth-accessdenied": "Addaf yugwi",
-       "img-auth-nopathinfo": "Yexus BATH_INFU.\nAqeddac inek/inem ur yeseɣwer ara iwakken ad i ɛeddi talɣut agi.\nAhat i lḥu  s CGI dɣa ur s-yezmer ara i img_auth.\nẒeṛ https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "Yexus BATH_INFU.\nAqeddac inek/inem ur yeseɣwer ara iwakken ad i ɛeddi talɣut agi.\nAhat i lḥu  s CGI dɣa ur s-yezmer ara i img_auth.\nẒeṛ https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Abrid yesuteren mačči d akaram n taktert yellan deg tawila.",
        "img-auth-badtitle": "Ulamek an ssali azwel i ɣbelen seg « $1 ».",
        "img-auth-nologinnWL": "Ur teqqneḍ ara dɣa « $1 » ur yella ara deg umuɣ amellal.",
        "watchlist-details": "ttɛassaɣ {{PLURAL:$1|$1 usebter|$1 n isebtaren}} mebla isebtaren \"amyannan\".",
        "wlheader-enotif": "Talɣut s email yessermed.",
        "wlheader-showupdated": "Isebtar ttubeddlen segwasmi tkecmeḍ tikelt taneggarut ttbanen-d s uḍris '''aberbuz'''.",
-       "watchmethod-recent": "yessenqed ibeddlen imaynuten n isebtar i ttɛasseɣ",
-       "watchmethod-list": "yessenqed isebtar i ttɛassaɣ i ibeddlen imaynuten",
-       "watchlistcontains": "Umuɣ n uɛessi inek ɣur-s $1 n {{PLURAL:$1|usebter|isebtar}}.",
-       "iteminvalidname": "Agnu akk d uferdis '$1', isem mačči ṣaḥiḥ...",
        "wlnote2": "Ddaw agi ibeddilen deg {{PLURAL:$1|asrag aneggaru|<strong>$1</strong> isragen ineggura}}, seg $2, $3.",
        "wlshowlast": "Ssken $1 n swayeɛ $2 n wussan neɣ $3 ineggura",
        "watchlist-options": "Tifranin n umuɣ n uɛessi",
        "enotif_lastvisited": "Ẓer $1 i akk ibeddlen segwasmi tkecmeḍ tikelt taneggarut.",
        "enotif_lastdiff": "Ẓer $1 akken ad tmuqleḍ abeddel.",
        "enotif_anon_editor": "aseqdac ur i siggezen ara $1",
-       "enotif_body": "Ay $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nAgzul n umttekki  : $PAGESUMMARY $PAGEMINOREDIT\n\nMeslay s umttekki :\ne-mail : $PAGEEDITOR_EMAIL\nwiki : $PAGEEDITOR_WIKI\n\nUr yelli ara email n talɣut asmi ad illin ibeddlen deg usebter ala lukan tekcmeḍ deg usebtar-agi sakin teqqneḍ. Tzemreḍ ad wennezeḍ tikbabin n talɣut i akkw isebtar yellan deg umuɣ inek/inem n uḍfar.\n\nAnagraw inek/inem n talɣut n {{SITENAME}}\n\n--\nIwakken ad beddeleḍ iɣewwaren n talɣut deg tirawt, ẓeṛ\n{{canonicalurl:{{#special:Preferences}}}}\n\nIwakken ad beddeleḍ iɣewwaren n umuɣ inek/inem n uḍfar, ẓeṛ\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nIwakken ad mḥuḍ asebtar deg umuɣ inek/inem n uḍfar, ẓeṛ\n$UNWATCHURL\n\nTuɣalin d tadhelt :\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Ay $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nAgzul n umttekki  : $PAGESUMMARY $PAGEMINOREDIT\n\nMeslay s umttekki :\ne-mail : $PAGEEDITOR_EMAIL\nwiki : $PAGEEDITOR_WIKI\n\nUr yelli ara email n talɣut asmi ad illin ibeddlen deg usebter ala lukan tekcmeḍ deg usebtar-agi sakin teqqneḍ. Tzemreḍ ad wennezeḍ tikbabin n talɣut i akkw isebtar yellan deg umuɣ inek/inem n uḍfar.\n\nAnagraw inek/inem n talɣut n {{SITENAME}}\n\n--\nIwakken ad beddeleḍ iɣewwaren n talɣut deg tirawt, ẓeṛ\n{{canonicalurl:{{#special:Preferences}}}}\n\nIwakken ad beddeleḍ iɣewwaren n umuɣ inek/inem n uḍfar, ẓeṛ\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nIwakken ad mḥuḍ asebtar deg umuɣ inek/inem n uḍfar, ẓeṛ\n$UNWATCHURL\n\nTuɣalin d tadhelt :\n$HELPPAGE",
        "created": "yettwaxleq",
        "changed": "yettubeddel",
        "deletepage": "Mḥu asebter",
        "blockip": "Ɛekkel aseqdac",
        "blockip-legend": "Ɛekkel aseqdac",
        "blockiptext": "Seqdec tiferkit ddaw-agi iwakken ad  sewḥeleḍ ineɛruḍen n ubeddel seg yiwet tansa IP tulmist neɣ n yiwen isem umseqdac.\nAsket am wagi, ur ilaq ad yetwexddem kan iwakken ad yeεeggen axeṣṣar dɣa ilaq ad yemtawi s [[{{MediaWiki:Policy-url}}|ilugan igensanen]].\nEfked ddaw-agi taɣẓint tusdidt (amedya : efked isebtar yetwaxeṣṣren).",
-       "ipadressorusername": "Tansa IP neɣ isem n wemseqdac",
+       "ipaddressorusername": "Tansa IP neɣ isem n wemseqdac",
        "ipbexpiry": "Tanzagt uqbel aneffeṛ :",
        "ipbreason": "Ayɣer",
        "ipbreason-dropdown": "* Tiɣẓinin n ukyaf id ttuɣalen aṭas tikwal\n** Taguri n tilɣa n ukellax\n** Tukksa war assefhem n ugbur n isebtar\n** Taguri s uɛiwed n izdayen uffiɣen ɣer idellilen (abluleɣ)\n** Taguri n ugbur war anamek d tursaḍ deg isebtar\n** Aneɛruḍ n umsiged neɣ ubbezbax\n** Tafuli n useqdac n aṭas imiḍanen\n** Isem n umseqdac ur nezmer ara an qbel, d-anergam neɣ d-abucemmat",
        "tooltip-preferences-save": "Ḥrez isemyifiyen",
        "tooltip-summary": "Sekcem agzul awezzlan",
        "interlanguage-link-title": "$1 — $2",
-       "notacceptable": "Aqeddac wiki agi ur yezmer ara ad yefk isefka deg amasal ur yezmer ara ad yeɣar amsaɣ inek/inem.",
        "anonymous": "{{PLURAL:$1|Aseqdac udrig|Iseqdacen udrigen}} ɣef {{SITENAME}}",
        "siteuser": "{{SITENAME}} amseqdac $1",
        "anonuser": "amseqdac abnabak $1 n {{SITENAME}}",
        "newimages-summary": "Asebtar agi uslig yebeqqeḍ ifuyla ineggura i kteren.",
        "newimages-legend": "Tastayt",
        "newimages-label": "Isem n ufaylu (naɣ aḥric ines) :",
-       "showhidebots": "($1 iṛubuten)",
        "noimages": "Tugna ulac-itt.",
        "ilsubmit": "Nadi",
        "bydate": "s uzemz",
        "size-kilobytes": "$1 KB/KO",
        "size-megabytes": "$1 MB/MO",
        "size-gigabytes": "$1 GB/GO",
-       "livepreview-loading": "Assisi…",
-       "livepreview-ready": "Assisi… D ayen!",
-       "livepreview-failed": "Pre-timeẓriwt taǧiḥbuṭ texser!\nƐreḍ pre-timeẓriwt tamagnut.",
-       "livepreview-error": "Pre-timeẓriwt taǧiḥbuṭ texser: $1 \"$2\"\nƐreḍ pre-timeẓriwt tamagnut.",
        "lag-warn-normal": "Ibeddelen n ddaw n $1 {{PLURAL:$1|tasint|tisinin}} ur ttbanen ara deg umuɣ-agi.",
        "lag-warn-high": "Acku af talalut taxatart n uqeddac n taffa n isefka, ibeddelen n ddaw n $1 {{PLURAL:$1|tasint|tisinin}} ur ttbanen ara deg umuɣ-agi.",
-       "watchlistedit-numitems": "Mebla isebtar \"Amyannan\", umuɣ n uɛessi inek ɣur-s {{PLURAL:$1|1 wezwel|$1 yizwalen}}.",
-       "watchlistedit-noitems": "Umuɣ n uɛessi inek ur yesɛi ḥedd izwal.",
        "watchlistedit-normal-title": "Beddel umuɣ n uɛessi",
        "watchlistedit-normal-legend": "Kkes izwal seg wumuɣ n uɛessi",
        "watchlistedit-normal-explain": "Izwal deg wumuɣ n uɛessi ttbanen-d deg ukessar. Akken ad tekkseḍ yiwen wezwel, wekki ɣef tenkult i zdat-s, umbeɛd wekki ɛef \"Kkes izwal\". Tzemreḍ daɣen [[Special:EditWatchlist/raw|ad tbeddleḍ umuɣ n uɛessi (raw)]].",
        "compare-invalid-title": "Azwel id efkiḍ ur yeɣbel ara.",
        "compare-title-not-exists": "Azwel id efkiḍ ulac-it.",
        "compare-revision-not-exists": "Lqem id efkiḍ ulac-it.",
-       "dberr-header": "Wiki agi yesɛa ugur",
        "dberr-problems": "Ssurfet-aɣ ! Asmel agi yemliled ilɣiten itikniten.",
        "dberr-again": "Ɛreḍ ad arǧuḍ kra n tisdidin dɣa sismeḍ.",
        "dberr-info": "(Ulamek an qqen ar uqeddac n taffa n isefka : $1)",
index 8726b09..c39bc1e 100644 (file)
@@ -5,7 +5,8 @@
                        "Marina",
                        "Vito Genovese",
                        "Алёшка",
-                       "Тамэ Балъкъэрхэ"
+                       "Тамэ Балъкъэрхэ",
+                       "아라"
                ]
        },
        "tog-underline": "ТехьэпӀэхэр щӀэтхъэн:",
@@ -18,7 +19,6 @@
        "tog-showtoolbar": "Гъэтэрэзыным идежь ищхьэ пэнелыр гъэлъэгъуэн (JavaScript)",
        "tog-editondblclick": "ТӀуанэ текъузэгъуэкӀэ напэкӀуэцӀхэр гъэтэрэзын (requires JavaScript)",
        "tog-editsectiononrightclick": "Псалъашъхьэм, дзыгъуэм и ижырабгъу текъузэгъуэмкӀэ секциэхэр гъэтэрэзын (JavaScript)",
-       "tog-rememberpassword": "Компутерым си логиныр щыхъумэн (мы нэхъыбу $1 {{PLURAL:$1|махуэ|маху}})",
        "tog-watchcreations": "Сэ сщIа напэкIуэцIхэр сызыкIэлъыплъ тхылъым хэлъхьэн",
        "tog-watchdefault": "Сэ схъуэжа напэкIуэцIхэр сызыкIэлъыплъ тхылъым хэлъхьэн",
        "tog-watchmoves": "Зи цIэ схъуэжа напэкIуэцIхэр сызыкIэлъыплъ тхылъым хэлъхьэн",
        "readonly_lag": "Ӏохугъуэлъэр зэман гуэрэкӀэ автоматику зэтриубыда зэхъуэкӀыгъуэ щӀыным щхьэкӀэ, Ӏохугъуэлъэм и тӀуанэ серверым япэрем теху синхронизациэ иримгъэкӀуэкӀ щыкӀэ.",
        "internalerror": "И кӀуэцӀ щыуагъэ",
        "internalerror_info": "И кӀуэцӀ щыуагъэ: $1",
-       "fileappenderrorread": "Хэлъхьэгъуэм идежь «$1» гурыӀуэгъуэ хъуакъым.",
-       "fileappenderror": "«$2»-м «$1»-р щӀэрылъхьэн хъуакъым.",
        "filecopyerror": "«$1»-м и копиэ «$2»-м хуэкӀуэкъым.",
        "filerenameerror": "«$1»-м и цӀэр «$2»-кӀэ зэхъуэкӀыфкъым.",
        "filedeleteerror": "Файл «$1»-р ирихыфкъым.",
        "directorycreateerror": "«$1»-м и директориэ ищӀыфкъым.",
        "filenotfound": "Файл «$1»-р игъуэтыфкъым.",
-       "fileexistserror": "Файл «$1»-р иритхэфкъым: апхуэдэ файл щыӀэщ.",
        "unexpected": "Мыхьэнэ темыхуэ: «$1»=«$2».",
        "formerror": "Щыуагъэ: Ӏохугъуэ формэр егъэхьын хъукъым",
        "badarticleerror": "А лэжьыгъэр мы напэкӀуэцӀым егъэкӀуэкӀыфынукъым.",
        "savearticle": "НапэкӀуэцIыр итхэн",
        "preview": "Япэ-еплъ",
        "showpreview": "Хэплъэн япэ щӀыкӀэ",
-       "showlivepreview": "ЩӀэх япэ-еплъ",
        "showdiff": "ЗэхъуэкӀыныгъэ хэлъхьахэр",
        "anoneditwarning": "'''Гу лъытэ!''': ЗыкъебгъэцӀыхуакъым системэм. Уи IP-адресыр иритхэнущ  напэкӀуэцӀым и зэхъуэкӀыныгъэ тхыдэм.",
        "anonpreviewwarning": "''Системэм зыкъебгъэцӀыхуакъым. Итхэным уи IP-адресыр къыринэну напэкӀуэцӀым и зэхъуэкӀыгъуэхэм я тхыдэм.''",
        "search-nonefound": "Узлъыхъуэм техуэу щыӀэкъым.",
        "powersearch-legend": "Убгъуауэ лъыхъу",
        "powersearch-ns": "ЦIэзэхэтыгъуэм щылъыхъуэн",
-       "powersearch-redir": "ЕгъэзэкӀахэри гъэлъэгъуэн",
        "powersearch-togglelabel": "Къыхэхын:",
        "powersearch-toggleall": "Псори",
        "powersearch-togglenone": "Зыри/пари",
        "recentchanges": "Гъэтэрэзыгъуэ щIэхэр",
        "recentchanges-legend": "Гъэтэрэзыгъуэ щӀэхэм я зэгъэзэхуэгъуэ",
        "recentchanges-feed-description": "Вики и иужырей зэхъуэкӀыгъeэхэм кӀэлъыплъын мы нэтыным.",
-       "rclistfrom": "ЗэхъуэкӀыгъуэхэр гъэлъэгъуэн $1 щыкӀэдзауэ",
+       "rclistfrom": "ЗэхъуэкӀыгъуэхэр гъэлъэгъуэн $3 $2 щыкӀэдзауэ",
        "rcshowhideminor": "$1 мащІэу яхъуэжахэр",
        "rcshowhidebots": "Боту $1",
        "rcshowhideliu": "ЦӀыхухэту, ихьахэр $1",
index cf3f9fd..6cb8209 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "Rachitrali"
+                       "Rachitrali",
+                       "아라"
                ]
        },
        "tog-underline": "ربطو خط کشیدگی",
@@ -14,7 +15,6 @@
        "tog-showtoolbar": "تدوینی اوزاردانن پشاؤے ( JavaScript ضرورت بوی)",
        "tog-editondblclick": "کلکہ صفحاتن  ترمیم (JavaScript ضرورت بوی)",
        "tog-editsectiononrightclick": "سطری عنواناتا فروسکی کلکو ذریعا سطری ترمیم کاریو فعال ساؤزاوے",
-       "tog-rememberpassword": "ھیہ کمپیوٹرا مہ داخل کاردو معلوماتن یاد لاکھے(کم از کم $1 {{PLURAL:$1|بس|بس}})",
        "tog-watchcreations": "مہ مرتب کاردو صفحاتن مہ  زیرِنظرفہرستہ شامل کورے",
        "tog-watchdefault": "مہ ترمیم کاردو صفحاتن مہ  زیرِنظرفہرستہ شامل کورے",
        "tog-watchmoves": "آوا کیہ صفحاتن کہ منتقل کومان ھتیتان مہ زیرِنظرفہرستہ شامل کورے",
        "filedeleteerror": "مسلو \"$1\" حذف کورونو نو ھوی",
        "directorycreateerror": "رہنامچہ \"$1\" تخلیق کورونو نو ھوی",
        "filenotfound": "مسلو \"$1\" تلاش کورونو نو ھوی",
-       "fileexistserror": "مسلو \"$1\" نیویشکا قاصر، مسل موجود",
        "unexpected": "غیرمتوقع قدر: \"$1\"=\"$2\"",
        "formerror": "خطا: کغاز انځینو نو ھوی",
        "badarticleerror": "ھیہ صفحہا ھیہ عمل انجام دیونو نو ھوی۔",
        "savearticle": "محفوظ",
        "preview": "نمائش",
        "showpreview": "نمائش",
-       "showlivepreview": "براہِ راست پیش منظر",
        "showdiff": "تبدیلیان پشاوے",
        "anoneditwarning": "تو{{SITENAME}} داخل نو بیتی اسوس لہذا تہIP پتہ ھیہ صفحو تاریخچہ ء ترمیما محفوظ بوی",
        "missingcommenttext": "براہِ کرم! تبصرہ موڑا درج کورے.",
        "search-nonefound": "استفسارو مطابقا نتائج ملاو نو ھونی.",
        "powersearch-legend": "ایڈوانس سرچ",
        "powersearch-ns": "جائے ناما تلاش:",
-       "powersearch-redir": "فہرستِ رجوع مکرر",
        "powersearch-toggleall": "سف",
        "preferences": "ترجیحات",
        "mypreferences": "مہ ترجیہات",
        "recentchanges-label-bot": "ھیہ ایڈیٹو خود کار بوٹو زریعا انجام دیونو ہوی",
        "recentchanges-label-unpatrolled": "ھیہ ترمیمو ھمونیہ پت مراجعت(Patrolled) کورونو نو بیتی شیر",
        "rcnotefrom": "ھیہ موڑا '''$2''' کورونو بیرو تبدیلیان تفصیلات شینی ('''$1''' تبدیلیان پشینو بونیان)۔",
-       "rclistfrom": "$1 نوغ تبدیلیاں پشیک شروع کورے",
+       "rclistfrom": "$3 $2 نوغ تبدیلیاں پشیک شروع کورے",
        "rcshowhideminor": " معمولی ترامیم $1",
        "rcshowhidebots": "خودکار صارف $1",
        "rcshowhideliu": "داخل بیرو صارف $1",
index f74f96f..94d44db 100644 (file)
@@ -4,7 +4,8 @@
                        "Erdemaslancan",
                        "Gorizon",
                        "Marmase",
-                       "Mirzali"
+                       "Mirzali",
+                       "아라"
                ]
        },
        "tog-underline": "Bınê gırey de xete bonce:",
        "readonly_lag": "Panga daeyu otomatikman qapan biye ''slave-database-servers''i ra be hata ''master''i",
        "internalerror": "Xeta zerrey",
        "internalerror_info": "Xeta zerrey: $1",
-       "fileappenderrorread": "İlawe ke bi \"$1\" nêşikiya bıwaniyo.",
-       "fileappenderror": "Dosya \"$1\"ine dosya \"$2\"ine ser nêbena.",
        "filecopyerror": "Dosya \"$1\"i kopya nêbiye be dosya \"$2\".",
        "filerenameerror": "Namê dosya \"$1\"i nêvuriya be dosya \"$2\".",
        "filedeleteerror": "Dosya \"$1\"i nêesteriye.",
        "directorycreateerror": "İndeksê \"$1\"i nêvıraşt.",
        "filenotfound": "Dosya \"$1\"i nêvêniye.",
-       "fileexistserror": "Sıma nêşikinê dosya \"$1\" de bınusê: dosya esta",
        "unexpected": "Qimeto nêpawıte: \"$1\"=\"$2\".",
        "formerror": "Xeta: form niard",
        "badarticleerror": "No faeliyet na pele de nêvıracino.",
        "savearticle": "Pele qeyd ke",
        "preview": "Verqayt",
        "showpreview": "Verqayti bıasne",
-       "showlivepreview": "Verqayto cınde",
        "showdiff": "Vurnaisun bıasne",
        "anoneditwarning": "'''Diqet:''' Tı cınêkota.\nTarixê vurnaena na pele de, hurêndia leqeme de numra tuya IPy qeyd bena.",
        "missingcommenttext": "Cêr de jü xulasa bınuse.",
        "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:",
-       "powersearch-redir": "Girêun lista ke",
        "powersearch-togglelabel": "Weçine:",
        "powersearch-toggleall": "Pêro",
        "powersearch-togglenone": "Qet",
        "prefs-files": "Dosyey",
        "youremail": "E-poste:",
        "username": "Namê karberi:",
-       "uid": "Kamiya {{GENDER:$1|karberi}}:",
        "prefs-memberingroups": "{{GENDER:$2|Ezayê}} {{PLURAL:$1|grube|grubu}}:",
        "yourrealname": "Namo rastıkên:",
        "yourlanguage": "Zon:",
        "recentchanges-label-unpatrolled": "No vurnais hona çım ra ranêvêrdo",
        "recentchanges-legend-newpage": "$1 - pela newiye",
        "rcnotefrom": "Cêr de vurnayîşê esto ke '''$2''' ra raver  (heta '''$1''' mucnayiyo).",
-       "rclistfrom": "$1 ra hata nıka vurnaisunê newu bıasne",
+       "rclistfrom": "$3 $2 ra hata nıka vurnaisunê newu bıasne",
        "rcshowhideminor": "$1 vurnaisê qızkeki",
        "rcshowhidebots": "Botu $1",
        "rcshowhideliu": "Karberunê qeydbiyayu $1",
        "nmembers": "$1 {{PLURAL:$1|eza|ezay}}",
        "nrevisions": "$1 {{PLURAL:$1|çım-ra-viarnais|çım-ra-viarnaişi}}",
        "nviews": "$1 {{PLURAL:$1|vênais|vênaişi}}",
-       "uncategorizedpages": "Pelê kategorizenêkerdey",
+       "uncategorizedpages": "Pelê ke kategorize nêbiyê",
        "prefixindex": "Peli pêro be verbend",
        "shortpages": "Pelê kılmi",
        "longpages": "Pelê dergi",
        "speciallogtitlelabel": "Sernuste:",
        "log": "Qeydi",
        "allpages": "Peli pêro",
-       "alphaindexline": "$1 bere $2",
        "nextpage": "Pela peyê coy ($1)",
        "prevpage": "Pela verêne ($1)",
        "allpagesfrom": "Pelê ke be na herfe dest niyo pıra bıasne:",
        "removedwatchtext": "Na pele \"[[:$1]]\" [[Special:Watchlist|lista tuya şêrkerdişi]] ra esteriya.",
        "watch": "Şêr ke",
        "watchthispage": "Na pele de şêr ke",
-       "unwatch": "Endi şêr meke",
+       "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",
        "watchlist-options": "Alternatifê lista şêrkerdene",
        "tooltip-ca-history": "Versiyonê verênê na pele",
        "tooltip-ca-protect": "Na pele bısevekne",
        "tooltip-ca-delete": "Na pele bestere",
-       "tooltip-ca-move": "Namê na pele bıvurne",
+       "tooltip-ca-move": "Na pele bere",
        "tooltip-ca-watch": "Na pele bıcê lista huya şêrkerdene",
        "tooltip-ca-unwatch": "Na pele lista huya şêrkerdene ra wedare",
        "tooltip-search": "Zerrê {{SITENAME}} de cı feteliye",
index dca8253..ec41fcf 100644 (file)
@@ -2,7 +2,8 @@
        "@metadata": {
                "authors": [
                        "GaiJin",
-                       "Kaztrans"
+                       "Kaztrans",
+                       "아라"
                ]
        },
        "tog-underline": "سىلتەمەنىڭ استىن سىز:",
@@ -13,7 +14,6 @@
        "tog-showtoolbar": "وڭدەۋ قۋرالدار جولاعىن كورسەت (JavaScript)",
        "tog-editondblclick": "قوس نۇقىمداپ وڭدەۋ (JavaScript)",
        "tog-editsectiononrightclick": "ٴبولىم تاقىرىبىن وڭ نۇقۋمەن وڭدەۋىن قوس (JavaScript)",
-       "tog-rememberpassword": "كىرگەنىمدى وسى كومپيۋتەردە ۇمىتپا (for a maximum of $1 {{PLURAL:$1|day|days}})",
        "tog-watchcreations": "مەن باستاعان بەتتەردى باقىلاۋ تىزىمىمە ۇستە",
        "tog-watchdefault": "مەن وڭدەگەن بەتتەردى باقىلاۋ تىزىمىمە ۇستە",
        "tog-watchmoves": "مەن جىلجىتقان بەتتەردى باقىلاۋ تىزىمىمە ۇستە",
        "filedeleteerror": "«$1» فايلى جويىلمايدى.",
        "directorycreateerror": "«$1» قالتاسى قۇرىلمادى.",
        "filenotfound": "«$1» فايلى تابىلمادى.",
-       "fileexistserror": "«$1» فايلعا جازۋ ىيكەمدى ەمەس: فايل بار",
        "unexpected": "كۇتىلمەگەن ماعىنا: «$1» = «$2».",
        "formerror": "قاتەلىك: ٴپىشىن جونەلتىلمەيدى",
        "badarticleerror": "وسىنداي ارەكەت مىنا بەتتە اتقارىلمايدى.",
        "savearticle": "بەتتى ساقتا!",
        "preview": "قاراپ شىعۋ",
        "showpreview": "قاراپ شىق",
-       "showlivepreview": "تۋرا قاراپ شىق",
        "showdiff": "وزگەرىستەردى كورسەت",
        "anoneditwarning": "'''قۇلاقتاندىرۋ:''' ٴسىز جۇيەگە كىرمەگەنسىز.\nIP مەكەنجايىڭىز بۇل بەتتىڭ تۇزەتۋ تارىيحىندا جازىلىپ الىنادى.",
        "missingsummary": "'''ەسكەرتپە:''' وڭدەمەنىڭ قىسقاشا مازمۇنداماسىن ەنگىزبەپسىز.\n«ساقتاۋ» تۇيمەسىن تاعى باسساڭىز, وڭدەنمەڭىز ماندەمەسىز ساقتالادى.",
        "showingresultsnum": "تومەندە ٴنومىر '''$2''' ورنىنان باستاپ '''$3''' ناتىيجە كورسەتىلەدى.",
        "powersearch-legend": "كەڭەيتىلگەن ىزدەۋ",
        "powersearch-ns": "مىنا ەسىم ايالاردا ىزدەۋ:",
-       "powersearch-redir": "ايداتۋلاردى تىزىمدەۋ",
        "search-external": "شەتتىك ىزدەگىش",
        "searchdisabled": "{{SITENAME}} ىزدەۋ قىزمەتى وشىرىلگەن.\nازىرشە Google ارقىلى ىزدەۋگە بولادى.\nاڭعارتپا: {{SITENAME}} تورابىنىڭ ماعلۇمات تىزبەلەرى ەسكىرگەن بولۋى مۇمكىن.",
        "preferences": "باپتالىمدار",
        "recentchanges-summary": "بۇل بەتتە وسى ۋىيكىيدەگى بولعان جۋىقتاعى وزگەرىستەر بايقالادى.",
        "recentchanges-feed-description": "بۇل ارنامەنەن ۋىيكىيدەگى ەڭ سوڭعى وزگەرىستەر قاداعالانادى.",
        "rcnotefrom": "'''$2''' كەزىنەن بەرى — تومەندە '''$1''' جەتكەنشە دەيىن وزگەرىستەر كورسەتىلەدى.",
-       "rclistfrom": "$1 كەزىنەن بەرى — جاڭا وزگەرىستەردى كورسەت.",
+       "rclistfrom": "$3 $2 كەزىنەن بەرى — جاڭا وزگەرىستەردى كورسەت.",
        "rcshowhideminor": "شاعىن وڭدەمەلەردى $1",
        "rcshowhidebots": "بوتتاردى $1",
        "rcshowhideliu": "كىرگەندەردى $1",
        "watchlist-details": "تالقىلاۋ بەتتەرىن ساناماعاندا $1 بەت باقلانىلادى.",
        "wlheader-enotif": "ەسكەرتۋ حات جىبەرۋى قوسىلعان.",
        "wlheader-showupdated": "سوڭعى كەلىپ-كەتۋىڭىزدەن بەرى وزگەرتىلگەن بەتتەردى '''جۋان''' قارىپىمەن كورسەت",
-       "watchmethod-recent": "باقىلاۋلى بەتتەر ٴۇشىن جۋىقتاعى وزگەرىستەردى تەكسەرۋ",
-       "watchmethod-list": "جۋىقتاعى وزگەرىستەر ٴۇشىن باقىلاۋلى بەتتەردى تەكسەرۋ",
-       "watchlistcontains": "باقىلاۋ تىزىمىڭىزدە $1 بەت بار.",
-       "iteminvalidname": "'$1' دانادا اقاۋ بار — جارامسىز اتاۋ…",
        "wlshowlast": "سوڭعى $1 ساعاتتاعى, $2 كۇندەگى, $3 بولعان وزگەرىستى كورسەتۋ",
        "watching": "باقىلاۋدا…",
        "unwatching": "باقىلاماۋدا…",
        "cologneblue.js": "/* مىنداعى JavaScript تەك «كولن زەڭگىرلىگى» (cologneblue) مانەرىن پايدالانۋشىلار ٴۇشىن جەگىلەدى */",
        "monobook.js": "/* مىنداعى JavaScript تەك «دارا كىتاپ» (monobook) مانەرىن پايدالانۋشىلار ٴۇشىن جەگىلەدى */",
        "modern.js": "/* مىنداعى JavaScript تەك «زاماناۋىي» (modern) مانەرىن پايدالانۋشىلار ٴۇشىن جەگىلەدى */",
-       "notacceptable": "تۇتىنعىشىڭىز وقىي الاتىن ٴپىشىمى بار دەرەكتەردى بۇل ۋىيكىي سەرۆەر جەتىستىرە المايدى.",
        "anonymous": "{{SITENAME}} تىركەلگىسىز قاتىسۋشى(لارى)",
        "siteuser": "{{SITENAME}} قاتىسۋشى $1",
        "lastmodifiedatby": "بۇل بەتتى $3 قاتىسۋشى سوڭعى وزگەرتكەن كەزى: $2, $1.",
        "autoredircomment": "[[$1]] دەگەنگە ايدادى",
        "autosumm-new": "جاڭا بەتتە: $1",
        "size-bytes": "$1 بايت",
-       "livepreview-loading": "جۇكتەۋدە…",
-       "livepreview-ready": "جۇكتەۋدە… دايىن!",
-       "livepreview-failed": "تۋرا قاراپ شىعۋ ٴساتسىز! كادىمگى قاراپ شىعۋ ٴادىسىن بايقاپ كورىڭىز.",
-       "livepreview-error": "قوسىلۋ ٴساتسىز: $1 «$2». كادىمگى قاراپ شىعۋ ٴادىسىن بايقاپ كورىڭىز.",
        "lag-warn-normal": "$1 سەكۋندتان جاڭالاۋ وزگەرىستەر بۇل تىزىمدە كورسەتىلمەۋى مۇمكىن.",
        "lag-warn-high": "دەرەكقور سەرۆەرى زور كەشىگۋى سەبەبىنەن, $1 سەكۋندتان جاڭالاۋ وزگەرىستەر بۇل تىزىمدە كورسەتىلمەۋى مۇمكىن.",
-       "watchlistedit-numitems": "باقىلاۋ تىزىمىڭىزدە, تالقىلاۋ بەتتەرسىز, $1 تاقىرىپ اتى بار.",
-       "watchlistedit-noitems": "باقىلاۋ تىزىمىڭىزدە ەش تاقىرىپ اتى جوق.",
        "watchlistedit-normal-title": "باقىلاۋ ٴتىزىمدى وڭدەۋ",
        "watchlistedit-normal-legend": "باقىلاۋ تىزىمىنەن تاقىرىپ اتتارىن الاستاۋ",
        "watchlistedit-normal-explain": "باقىلاۋ تىزىمىڭىزدەگى تاقىرىپ اتتار تومەندە كورسەتىلەدى.\nتاقىرىپ اتىن الاستاۋ ٴۇشىن, ٴبۇيىر كوزگە قۇسبەلگى سالىڭىز, جانە «تاقىرىپ اتتارىن الاستا» دەگەندى نۇقىڭىز.\nتاعى دا [[Special:EditWatchlist/raw|قام ٴتىزىمدى وڭدەي]] الاسىز.",
index 81c2374..b562bd2 100644 (file)
        },
        "tog-underline": "Сілтеменің астын сызу:",
        "tog-hideminor": "Жуықтағы өзгерістерден шағын өңдемелерді жасыру",
-       "tog-hidepatrolled": "Тексерілген өңдеулерді соңғы өзгерістер тізімінде көрсетпеу",
-       "tog-newpageshidepatrolled": "ТекÑ\81еÑ\80Ñ\96лген Ð±ÐµÑ\82Ñ\82еÑ\80дÑ\96 Ð¶Ð°Ò£Ð° Ð±ÐµÑ\82Ñ\82еÑ\80 Ñ\82Ñ\96зÑ\96мÑ\96нде ÐºÓ©Ñ\80Ñ\81еÑ\82пеу",
-       "tog-extendwatchlist": "Ð\91аÒ\9bÑ\8bлаÑ\83 Ñ\82Ñ\96зÑ\96мдÑ\96 Ò±Ð»Ò\93айÑ\82Ñ\83 (баÑ\80лÑ\8bÒ\9b Ð¶Ð°Ñ\80амдÑ\8b Ó©Ð·Ð³ÐµÑ\80Ñ\96Ñ\81Ñ\82еÑ\80дÑ\96 ÐºÓ©Ñ\80Ñ\81еÑ\82Ñ\83)",
+       "tog-hidepatrolled": "Тексерілген өңдеулерді жуықтағы өзгерістер тізімінде көрсетпеу",
+       "tog-newpageshidepatrolled": "ТекÑ\81еÑ\80Ñ\96лген Ð±ÐµÑ\82Ñ\82еÑ\80дÑ\96 Ð¶Ð°Ò£Ð° Ð±ÐµÑ\82Ñ\82еÑ\80 Ñ\82Ñ\96зÑ\96мÑ\96нде Ð¶Ð°Ñ\81Ñ\8bÑ\80у",
+       "tog-extendwatchlist": "Ð\91аÒ\9bÑ\8bлаÑ\83 Ñ\82Ñ\96зÑ\96мдÑ\96 Ò±Ð»Ò\93айÑ\82Ñ\8bп Ð±Ð°Ñ\80лÑ\8bÒ\9b Ó©Ð·Ð³ÐµÑ\80Ñ\96Ñ\81Ñ\82еÑ\80дÑ\96 ÐºÓ©Ñ\80Ñ\81еÑ\82Ñ\83, ÐµÒ£ Ñ\81оңÒ\93Ñ\8bлаÑ\80дÑ\8b Ò\93ана ÐµÐ¼ÐµÑ\81",
        "tog-usenewrc": "Жуықтағы өзгерістер және бақылау тізімінде беті бойынша өзгерістерді топтау",
        "tog-numberheadings": "Мазмұн тақырыптарын автоматты нөмірлеу",
-       "tog-showtoolbar": "Өңдеу құралдарын көрсету",
+       "tog-showtoolbar": "Өңдеу құралдарын үстелін көрсету",
        "tog-editondblclick": "Қос шерту арқылы бетті өңдеу",
        "tog-editsectiononrightclick": "Бөлім тақырыбын оң нұқумен бөлім өңдеуін қосу",
-       "tog-watchcreations": "Ð\9cен Ð±Ð°Ñ\81Ñ\82аÒ\93ан Ð±ÐµÑ\82Ñ\82еÑ\80дÑ\96 Ð±Ð°Ò\9bÑ\8bлаÑ\83 Ñ\82Ñ\96зÑ\96мÑ\96не Ò\9bоÑ\81",
-       "tog-watchdefault": "Ð\9cен Ó©Ò£Ð´ÐµÐ³ÐµÐ½ Ð±ÐµÑ\82Ñ\82еÑ\80дÑ\96 Ð±Ð°Ò\9bÑ\8bлаÑ\83 Ñ\82Ñ\96зÑ\96мÑ\96не Ò\9bоÑ\81",
-       "tog-watchmoves": "Ð\9cен Ð¶Ñ\8bлжÑ\8bÑ\82Ò\9bан Ð±ÐµÑ\82Ñ\82еÑ\80дÑ\96 Ð±Ð°Ò\9bÑ\8bлаÑ\83 Ñ\82Ñ\96зÑ\96мÑ\96не Ò\9bоÑ\81",
-       "tog-watchdeletion": "Ð\9cен Ð¶Ð¾Ð¹Ò\93ан Ð±ÐµÑ\82Ñ\82еÑ\80дÑ\96 Ð±Ð°Ò\9bÑ\8bлаÑ\83 Ñ\82Ñ\96зÑ\96мÑ\96не Ò\9bоÑ\81",
-       "tog-minordefault": "Әдепкіден барлық өңдемелерді шағын деп белгіле",
+       "tog-watchcreations": "Ð\9cен Ð±Ð°Ñ\81Ñ\82аÒ\93ан Ð±ÐµÑ\82Ñ\82еÑ\80дÑ\96 Ð¶Ó\99не Ð¼ÐµÐ½ Ð¶Ò¯ÐºÑ\82еген Ñ\84айлдаÑ\80дÑ\8b Ð±Ð°Ò\9bÑ\8bлаÑ\83 Ñ\82Ñ\96зÑ\96мÑ\96не Ò\9bоÑ\81Ñ\83",
+       "tog-watchdefault": "Ð\9cен Ó©Ò£Ð´ÐµÐ³ÐµÐ½ Ð±ÐµÑ\82Ñ\82еÑ\80дÑ\96 Ð¶Ó\99не Ñ\84айлдаÑ\80дÑ\8b Ð±Ð°Ò\9bÑ\8bлаÑ\83 Ñ\82Ñ\96зÑ\96мÑ\96не Ò\9bоÑ\81Ñ\83",
+       "tog-watchmoves": "Ð\9cен Ð¶Ñ\8bлжÑ\8bÑ\82Ò\9bан Ð±ÐµÑ\82Ñ\82еÑ\80дÑ\96 Ð¶Ó\99не Ñ\84айлдаÑ\80дÑ\8b Ð±Ð°Ò\9bÑ\8bлаÑ\83 Ñ\82Ñ\96зÑ\96мÑ\96не Ò\9bоÑ\81Ñ\83",
+       "tog-watchdeletion": "Ð\9cен Ð¶Ð¾Ð¹Ò\93ан Ð±ÐµÑ\82Ñ\82еÑ\80дÑ\96 Ð¶Ó\99не Ñ\84айлдаÑ\80дÑ\8b Ð±Ð°Ò\9bÑ\8bлаÑ\83 Ñ\82Ñ\96зÑ\96мÑ\96не Ò\9bоÑ\81Ñ\83",
+       "tog-minordefault": "Әдепкі бойынша барлық өңдемелерді шағын деп белгілеу",
        "tog-previewontop": "Қарап шығу аумағын өңдеу терезесінің жоғарғы жағында көрсету",
-       "tog-previewonfirst": "Бірінші өңдегенде қарап шығу",
-       "tog-enotifwatchlistpages": "Бақылауыңыздағы бет өзгергенде е-поштаға хабарлама жіберу",
+       "tog-previewonfirst": "Бірінші өңдегенде алдын-ала қарап шығу",
+       "tog-enotifwatchlistpages": "Бақылауымдағы бет және файл өзгергенде е-поштаға хабарлама жіберу",
        "tog-enotifusertalkpages": "Талқылау бетім өзгергенде маған хат жібер",
        "tog-enotifminoredits": "Шағын өңдеме туралы да маған хат жібер",
        "tog-enotifrevealaddr": "Е-поштамның мекенжайын ескерту хаттарда аш",
        "tog-shownumberswatching": "Бақылап тұрған қатысушылардың санын көрсет",
        "tog-oldsig": "Қазіргі уақыттағы қолтаңбаңыз:",
-       "tog-fancysig": "Қолтаңбаны уикимәтін ретінде қарастыру (автоматты сілтеме қойылмайды)",
+       "tog-fancysig": "Қолтаңбаны уикимәтінге айналдыру (автоматты сілтеме қойылмайды)",
        "tog-uselivepreview": "Тура қарап шығуды қолдану (сынақтық)",
-       "tog-forceeditsummary": "Өңдеменің қысқаша мазмұндамасы бос қалғанда маған ескерт",
+       "tog-forceeditsummary": "Өңдеме түйіндемесі бос қалғанда маған ескерт",
        "tog-watchlisthideown": "Өңдемелерімді бақылау тізімінен жасыру",
        "tog-watchlisthidebots": "Бот өңдемелерін бақылау тізімінен жасыру",
        "tog-watchlisthideminor": "Шағын өңдемелерді бақылау тізімінде көрсетпеу",
-       "tog-watchlisthideliu": "Бақылау тізіміндегі қатысушылардың өңдеулерін көрсетпеу",
-       "tog-watchlisthideanons": "Ð\91аÒ\9bÑ\8bлаÑ\83 Ñ\82Ñ\96зÑ\96мÑ\96ндегÑ\96 Ð¶Ð°Ñ\81Ñ\8bÑ\80Ñ\8bн қатысушылардың өңдеулерін көрсетпеу",
+       "tog-watchlisthideliu": "Бақылау тізіміндегі кірген қатысушылардың өңдеулерін көрсетпеу",
+       "tog-watchlisthideanons": "Ð\91аÒ\9bÑ\8bлаÑ\83 Ñ\82Ñ\96зÑ\96мÑ\96ндегÑ\96 Ð°Ð½Ð¾Ð½Ð¸Ð¼ қатысушылардың өңдеулерін көрсетпеу",
        "tog-watchlisthidepatrolled": "Бақылау тізімінде тексерілген өңдеулерді көрсетпеу",
-       "tog-ccmeonemails": "Ð\91аÑ\81Ò\9bа Ò\9bаÑ\82Ñ\8bÑ\81Ñ\83Ñ\88Ñ\8bÒ\93а Ð¶Ñ\96беÑ\80ген Ñ\85аÑ\82Ñ\8bмнÑ\8bÒ£ ÐºÓ©Ñ\88Ñ\96Ñ\80меÑ\81Ñ\96н Ð¼Ð°Ò\93ан Ð´Ð° Ð¶Ó©Ð½ÐµÐ»Ñ\82",
+       "tog-ccmeonemails": "Ð\91аÑ\81Ò\9bа Ò\9bаÑ\82Ñ\8bÑ\81Ñ\83Ñ\88Ñ\8bÒ\93а Ð¶Ñ\96беÑ\80ген Ñ\85аÑ\82Ñ\8bмнÑ\8bÒ£ ÐµÑ\81еÑ\81Ñ\96н Ó©Ð·Ñ\96ме Ð¶Ó©Ð½ÐµÐ»Ñ\82Ñ\83",
        "tog-diffonly": "Нұсқалар айырмашылықтарының астында бет мағлұматын көрсетпеу",
        "tog-showhiddencats": "Жасырын санаттарды көрсету",
        "tog-norollbackdiff": "Шегіндіруден кейін нұсқалардың айырмашылығын көрсетпеу",
-       "tog-useeditwarning": "Өңдемесі сақталмаған парақшадан шығар кезде ескерту",
+       "tog-useeditwarning": "Өзгерістері сақталмаған өңделудегі беттен шығар кезде ескерту",
        "tog-prefershttps": "Кірген кезде қауіпсіз байланысуды әрқашан қолдану",
        "underline-always": "Әрқашан",
        "underline-never": "Ешқашан",
-       "underline-default": "Шолғыш бойынша",
-       "editfont-style": "ӨңдеÑ\83 Ð¶Ð¾Ð»Ñ\8bндаÒ\93Ñ\8b Ò\9bаÑ\80Ñ\96пÑ\82Ñ\96Ò£ Ñ\82Ò¯рі",
+       "underline-default": "Әдепкі мәнер не броузер",
+       "editfont-style": "ӨңдеÑ\83 Ð°Ñ\83маÒ\93Ñ\8bндаÒ\93Ñ\8b Ò\9bаÑ\80Ñ\96п Ð¼Ó\99нері",
        "editfont-default": "Негізгі браузер",
        "editfont-monospace": "Бірдей енді қаріп",
        "editfont-sansserif": "Ноқатсыз қаріп",
        "november-date": "Қараша $1",
        "december-date": "Желтоқсан $1",
        "pagecategories": "{{PLURAL:$1|Санат|Санат}}",
-       "category_header": "\"$1\" санатындағы беттер",
+       "category_header": "«$1» санатындағы беттер",
        "subcategories": "Санатшалар",
-       "category-media-header": "\"$1\" санатындағы медиа",
-       "category-empty": "''Бұл санатта ағымда еш бет немесе медиа жоқ.''",
-       "hidden-categories": "{{PLURAL:$1|Жасырын санат|Жасырын санаттар}}",
+       "category-media-header": "«$1» санатындағы медиа",
+       "category-empty": "<em>Бұл санатта қазіргі уақытта еш бет немесе медиа жоқ.</em>",
+       "hidden-categories": "{{PLURAL:$1|Жасырын санат|Жасырын санат}}",
        "hidden-category-category": "Жасырын санаттар",
        "category-subcat-count": "{{PLURAL:$2|Бұл санатта тек келесі санатша бар.|Бұл санатта келесі {{PLURAL:$1|санатша|$1 санатша}} бар (не барлығы $2).}}",
-       "category-subcat-count-limited": "Бұл санатта келесі $1 санатша бар.",
+       "category-subcat-count-limited": "Бұл санатта келесі {{PLURAL:$1|санатша|$1 санатша}} бар.",
        "category-article-count": "{{PLURAL:$2|Бұл санатта тек келесі бет бар.|Бұл санатта келесі {{PLURAL:$1|бет|$1 бет}} бар, барлығы $2 сыртында.}}",
        "category-article-count-limited": "Ағымдағы санатта келесі $1 бет бар.",
        "category-file-count": "{{PLURAL:$2|Бұл санатта тек келесі файл бар.|Бұл санатта келесі {{PLURAL:$1|файл|$1 файл}} бар, барлығы $2 сыртында.}}",
        "category-file-count-limited": "Ағымдағы санатта келесі $1 файл бар.",
        "listingcontinuesabbrev": "(жалғ.)",
        "index-category": "Индекстелген беттер",
-       "noindex-category": "Ð\98ндекÑ\81Ñ\82елмейÑ\82Ñ\96н беттер",
+       "noindex-category": "Ð\98ндекÑ\81Ñ\82елмеген беттер",
        "broken-file-category": "Ақаулы файлдық сілтемелері бар беттер",
        "about": "Жоба туралы",
        "article": "Мағлұмат беті",
        "create-this-page": "Осы бетті бастау",
        "delete": "Жою",
        "deletethispage": "Бұл бетті жою",
-       "undeletethispage": "Ð\96ойÑ\8bлÒ\93ан Ð±ÐµÑ\82Ñ\82Ñ\96 Ò\9bайÑ\82ару",
-       "undelete_short": "{{PLURAL:$1|өңдеме|$1 өңдеме}} жоюын болдырмау",
-       "viewdeleted_short": "{{PLURAL:$1|жойылған өңдеуді|$1 жойылған өңдеулерді }} көру",
+       "undeletethispage": "Ð\91ұл Ð±ÐµÑ\82Ñ\82Ñ\96 Ò\9bалпÑ\8bна ÐºÐµÐ»Ñ\82Ñ\96ру",
+       "undelete_short": "{{PLURAL:$1|өңдеме|$1 өңдеме}} жойылуын болдырмау",
+       "viewdeleted_short": "{{PLURAL:$1|жойылған өңдемені|$1 жойылған өңдемені }} көру",
        "protect": "Қорғау",
        "protect_change": "өзгерту",
        "protectthispage": "Бұл бетті қорғау",
        "unprotect": "Қорғалуын өзгерту",
-       "unprotectthispage": "Бұл беттің қорғауын өзгерту",
+       "unprotectthispage": "Бұл беттің қорғалуын өзгерту",
        "newpage": "Жаңа бет",
        "talkpage": "Бұл бетті талқылау",
        "talkpagelinktext": "Талқылауы",
        "jumptonavigation": "шарлау",
        "jumptosearch": "іздеу",
        "view-pool-error": "Кешіріңіз, қазір серверлер шектен тыс жүктелуде.\nОсы бетті қарауға өте көп сұраныс жасалды.\nӨтініш, күте тұрыңыз және осы бетке кіруге қайта әрекет жасаңыз.\n\n$1",
-       "pool-timeout": "Бұғатталу уақытын күту мерзімі өтті",
+       "generic-pool-error": "Кешіріңіз, қазір серверлер шектен тыс жүктелуде.\nОсы бетті қарауға өте көп сұраныс жасалды.\nӨтініш, күте тұрыңыз және осы бетке кіруге қайта әрекет жасаңыз.",
+       "pool-timeout": "Құлыпталу уақытын күту мерзімі өтті",
        "pool-queuefull": "Сұранымдар жинақтауышысы толық",
        "pool-errorunknown": "Белгісіз қате",
        "aboutsite": "{{SITENAME}} туралы",
        "policy-url": "Project:Ережелер",
        "portal": "Қауым порталы",
        "portal-url": "Project:Қауым порталы",
-       "privacy": "Жеке құпиясын сақтау",
-       "privacypage": "Project:Жеке құпиясын сақтау",
+       "privacy": "Құпиялық саясаты",
+       "privacypage": "Project:Құпиялық саясаты",
        "badaccess": "Рұқсат беру қатесі",
        "badaccess-group0": "Сұратылған әрекетіңізді орындауға рұқсат етілмейді.",
-       "badaccess-groups": "Ð\90Ñ\82алÒ\93ан Ó\99Ñ\80екеÑ\82Ñ\82Ñ\96 Ñ\82ек {{PLURAL:$2|Ñ\82опÑ\82аÑ\80дÑ\8bÒ£|Ñ\82опÑ\82Ñ\8bÒ£}} $1 Ò\9bаÑ\82Ñ\8bÑ\81Ñ\83Ñ\88Ñ\8bлаÑ\80Ñ\8b Ò\93ана Ð°Ñ\82Ò\9bаÑ\80а Ð°Ð»Ð°Ð´Ñ\8b.",
-       "versionrequired": "MediaWiki $1 нұсқасы керек",
-       "versionrequiredtext": "Бұл бетті қолдану үшін MediaWiki $1 нұсқасы керек. [[Special:Version|Жүйе нұсқасы бетін]] қараңыз.",
-       "ok": "Жарайды",
+       "badaccess-groups": "СÑ\96з Ñ\81Ò±Ñ\80анÒ\93ан Ó\99Ñ\80екеÑ\82Ñ\82Ñ\96 Ñ\82ек Ñ\88екÑ\82елген {{PLURAL:$2|Ñ\82опÑ\82Ñ\8bÒ£|Ñ\82опÑ\82Ñ\8bÒ£}} Ò\9bаÑ\82Ñ\8bÑ\81Ñ\83Ñ\88Ñ\8bлаÑ\80Ñ\8b Ò\93ана Ð°Ñ\82Ò\9bаÑ\80а Ð°Ð»Ð°Ð´Ñ\8b: $1.",
+       "versionrequired": "MediaWiki $1 нұсқасын қажет етеді",
+       "versionrequiredtext": "Бұл бетті пайдалану үшін MediaWiki $1 нұсқасын қажет етеді. \n[[Special:Version|Жүйе нұсқасы бетін]] қараңыз.",
+       "ok": "OK",
        "pagetitle": "$1 — {{SITENAME}}",
        "retrievedfrom": "«$1» бетінен алынған",
-       "youhavenewmessages": "Сізде $1 бар ($2).",
-       "youhavenewmessagesfromusers": "Сіз {{PLURAL:$3|басқа қатысушыдан|$3 қатысушыдан}} $1 алдыңыз ($2).",
-       "youhavenewmessagesmanyusers": "Сіз бірнеше қатысушыдан $1 алдыңыз ($2).",
+       "youhavenewmessages": "{{PLURAL:$3|Сізге}} $1 келді ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Сізге}} {{PLURAL:$3|басқа қатысушыдан|$3 қатысушыдан}} $1 келді ($2).",
+       "youhavenewmessagesmanyusers": "Сізге бірнеше қатысушыдан $1 келді ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|жаңа хабарлама|999=жаңа хабарламалар}}",
        "newmessagesdifflinkplural": "соңғы {{PLURAL:$1|өзгеріс|999=өзгерістер}}",
        "youhavenewmessagesmulti": "$1 дегенде жаңа хабарламалар бар",
        "viewdeleted": "$1 қарайсыз ба?",
        "restorelink": "{{PLURAL:$1|жойылған өңдемені|$1 жойылған өңдемені}}",
        "feedlinks": "Арна:",
-       "feed-invalid": "Жарамсыз жазылымды арна түрі.",
-       "feed-unavailable": "Синдикация таспалары қолжетімсіз",
+       "feed-invalid": "Жарамсыз жазылым арна түрі.",
+       "feed-unavailable": "Синдикация арналары қолжетімсіз",
        "site-rss-feed": "$1 RSS арнасы",
        "site-atom-feed": "$1 Atom арнасы",
        "page-rss-feed": "«$1» — RSS арнасы",
        "page-atom-feed": "«$1» — Atom арнасы",
        "red-link-title": "$1 (мұндай бет жоқ)",
-       "sort-descending": "Кему бойынша ретке келтіру",
-       "sort-ascending": "Өсу бойынша ретке келтіру",
+       "sort-descending": "Кемуі бойынша ретке келтіру",
+       "sort-ascending": "Артуы бойынша ретке келтіру",
        "nstab-main": "Мақала",
-       "nstab-user": "Жеке бет",
+       "nstab-user": "Қатысушы беті",
        "nstab-media": "Медиа беті",
        "nstab-special": "Арнайы бет",
        "nstab-project": "Жоба беті",
        "nstab-image": "Файл",
        "nstab-mediawiki": "Хабарлама",
        "nstab-template": "Үлгі",
-       "nstab-help": "Анықтама",
+       "nstab-help": "Анықтама беті",
        "nstab-category": "Санат",
        "nosuchaction": "Мұндай әрекет жоқ",
-       "nosuchactiontext": "URL-дегі көрсетілген әрекет қате.\nБәлкім, Сіз URL теру барысында қате жібердіңіз немесе қате сілтеме бойынша өттіңіз.\nБұл сондай-ақ {{SITENAME}} жобасында қателікті көрсетуі мүмкін.",
+       "nosuchactiontext": "URL-дегі көрсетілген әрекет жарамсыз.\nМүмкін сіз URL теру барысында қате жібердіңіз немесе дұрыс емес сілтеме бойынша өттіңіз.\nБұл сондай-ақ {{SITENAME}} жобасында қолданылатын бағдарламалық жасақтама қатесін көрсетуі мүмкін.",
        "nosuchspecialpage": "Мұндай арнайы бет жоқ",
-       "nospecialpagetext": "<strong>СÑ\96здÑ\96Ò£ Ñ\81Ò±Ñ\80аÒ\93ан Ð°Ñ\80найÑ\8b Ð±ÐµÑ\82Ñ\96Ò£Ñ\96з Ð¶Ð¾Ò\9b.</strong>\n\nÐ\91аÑ\80 Ð°Ñ\80найÑ\8b Ð±ÐµÑ\82Ñ\82еÑ\80 Ñ\82Ñ\96зÑ\96мÑ\96: [[Special:SpecialPages|{{int:specialpages}}]].",
+       "nospecialpagetext": "<strong>СÑ\96здÑ\96Ò£ Ñ\81Ò±Ñ\80аÒ\93ан Ð°Ñ\80найÑ\8b Ð±ÐµÑ\82Ñ\96Ò£Ñ\96з Ð¶Ð°Ñ\80амÑ\81Ñ\8bз.</strong>\n\nÐ\96аÑ\80амдÑ\8b Ð°Ñ\80найÑ\8b Ð±ÐµÑ\82Ñ\82еÑ\80 Ñ\82Ñ\96зÑ\96мÑ\96н [[Special:SpecialPages|{{int:specialpages}}]] Ð´ÐµÐ³ÐµÐ½Ð½ÐµÐ½ Ñ\82аба Ð°Ð»Ð°Ñ\81Ñ\8bз.",
        "error": "Қате",
        "databaseerror": "Дерекқор қатесі",
-       "databaseerror-query": "Сұрау:$1",
-       "databaseerror-function": "Әрекет: $1",
-       "databaseerror-error": "Қате:$1",
-       "laggedslavemode": "'''Ескерту:''' Бетте жуықтағы жаңартулар болмауы мүмкін.",
+       "databaseerror-text": "Дерекқор қатесі кездесті.\nБұл бағдарламалық жасақтама қатесін білдіруі мүмкін.",
+       "databaseerror-textcl": "Дерекқор қатесі кездесті.",
+       "databaseerror-query": "Сұрау: $1",
+       "databaseerror-function": "Функция: $1",
+       "databaseerror-error": "Қате: $1",
+       "laggedslavemode": "<strong>Ескерту:</strong> Бетте жуықтағы жаңартулар болмауы мүмкін.",
        "readonly": "Дерекқоры құлыпталған",
        "enterlockreason": "Құлыптау себебін, қай уақытқа дейін құлыпталғанын кірістіріп, енгізіңіз.",
        "readonlytext": "Бұл дерекқор жаңадан жазу және басқа өзгерістер жасаудан ағымда құлыпталынған, мүмкін күнде-күн дерекқорды баптау үшін, бұны бітіргеннен соң қалыпты іске қайтарылады.\n\nҚұлыптаған әкімші бұны былай түсіндіреді: $1",
        "readonly_lag": "Жетек дерекқор серверлер басқасымен қадамланғанда осы дерекқор өздіктік құлыпталынған",
        "internalerror": "Ішкі қате",
        "internalerror_info": "Ішкі қатесі: $1",
-       "fileappenderrorread": "Толықтыру кезінде «$1» оқылмады.",
-       "fileappenderror": "«$2» -ге  \"$1\" -ді қосу мүмкін болмады.",
-       "filecopyerror": "«$1» файлы «$2» файлына көшірілмеді.",
+       "filecopyerror": "«$1» файлы «$2» файлына еселенбеді.",
        "filerenameerror": "«$1» файл атауы «$2» атауына өзгертілмеді.",
        "filedeleteerror": "«$1» файлы жойылмайды.",
        "directorycreateerror": "«$1» қалтасы құрылмады.",
        "filenotfound": "«$1» файлы табылмады.",
-       "fileexistserror": "«$1» файлға жазу икемді емес: файл бар",
        "unexpected": "Күтілмеген мағына: «$1» = «$2».",
        "formerror": "Қателік: пішін жөнелтілмейді",
        "badarticleerror": "Осындай әрекет мына бетте атқарылмайды.",
-       "cannotdelete": "«$1» бетін немесе файлын жою мүмкін емес. \nМұны әлдекім жойған болуы мүмкін.",
+       "cannotdelete": "«$1» беті немесе файлы жойылмайды. \nМұны әлдебіреу әлдеқашан жойған болуы мүмкін.",
        "cannotdelete-title": "«$1» бетін жою мүмкін емес",
-       "delete-hook-aborted": "ТүзеÑ\82Ñ\83 Ñ\96лмек Ð°Ñ\80Ò\9bÑ\8bлÑ\8b Ñ\82оÒ\9bÑ\82аÑ\82ылды.\nҚосымша түсіндірмелер көрсетілмеген.",
-       "no-null-revision": "\"$1\" беті үшін жаңа бос нұсқасын бастау мүмкін болмады.",
+       "delete-hook-aborted": "Ð\96ойÑ\8bлÑ\83 Ñ\96лмек Ð°Ñ\80Ò\9bÑ\8bлÑ\8b Ð´Ð¾Ò\93аÑ\80ылды.\nҚосымша түсіндірмелер көрсетілмеген.",
+       "no-null-revision": "«$1» беті үшін жаңа бос нұсқасын бастау мүмкін болмады.",
        "badtitle": "Жарамсыз тақырып аты",
-       "badtitletext": "СұÑ\80алÒ\93ан Ð±ÐµÑ\82 Ñ\82аÒ\9bÑ\8bÑ\80Ñ\8bбÑ\8bнÑ\8bÒ£ Ð°Ñ\82Ñ\8b Ð¶Ð°Ñ\80амÑ\81Ñ\8bз, Ð±Ð¾Ñ\81, Ñ\82Ñ\96лаÑ\80алÑ\8bÒ\9b Ñ\81Ñ\96лÑ\82емеÑ\81Ñ\96 Ð½Ðµ Ñ\83ики-аÑ\80алÑ\8bÒ\9b Ñ\82аÒ\9bÑ\8bÑ\80Ñ\8bп Ð°Ñ\82Ñ\8b Ð±Ò±Ñ\80Ñ\8bÑ\81 ÐµÐ½Ð³Ñ\96зÑ\96лген.\nÐ\9cÑ\8bнда Ñ\82аÒ\9bÑ\8bÑ\80Ñ\8bп Ð°Ñ\82Ñ\8bнда Ò\9bолдалмайтын бірқатар таңбалар болуы мүмкін.",
-       "perfcached": "Келесі дерек бүркемеленген, сондықтан толықтай жаңаланбаған болуы мүмкін. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.",
-       "perfcachedts": "Келесі дерек бүркемеленген, соңғы жаңаланған кезі: $1. Кэште {{PLURAL:$4|жазбалардан}} артық сақталмайды..",
-       "querypage-no-updates": "Бұл беттің жаңартылуы ағымда өшірілген. Деректері қазір өзгертілмейді.",
+       "badtitletext": "СұÑ\80алÒ\93ан Ð±ÐµÑ\82 Ñ\82аÒ\9bÑ\8bÑ\80Ñ\8bбÑ\8bнÑ\8bÒ£ Ð°Ñ\82Ñ\8b Ð¶Ð°Ñ\80амÑ\81Ñ\8bз, Ð±Ð¾Ñ\81, Ñ\82Ñ\96лаÑ\80алÑ\8bÒ\9b Ñ\81Ñ\96лÑ\82емеÑ\81Ñ\96 Ð½Ðµ Ñ\83ики-аÑ\80алÑ\8bÒ\9b Ñ\82аÒ\9bÑ\8bÑ\80Ñ\8bп Ð°Ñ\82Ñ\8b Ð±Ò±Ñ\80Ñ\8bÑ\81 ÐµÐ½Ð³Ñ\96зÑ\96лген.\nÐ\9eнда Ñ\82аÒ\9bÑ\8bÑ\80Ñ\8bп Ð°Ñ\82Ñ\8bнда Ò\9bолданÑ\8bлмайтын бірқатар таңбалар болуы мүмкін.",
+       "perfcached": "Келесі дерек бүркемеленген, сондықтан толықтай жаңаланбаған болуы мүмкін. Кэште ең көбі {{PLURAL:$1|бір нәтиже|$1 нәтиже}} қолжетімді.",
+       "perfcachedts": "Келесі дерек бүркемеленген, соңғы жаңаланған кезі: $1. Кэште ең көбі {{PLURAL:$4|бір нәтиже|$4 нәтиже}} қолжетімді.",
+       "querypage-no-updates": "Бұл беттің жаңартылуы қазіргі уақытта өшірілген.\nДеректері қазір өзгертілмейді.",
        "viewsource": "Қайнарын қарау",
-       "viewsource-title": "$1 бетінің бастапқы мәтінін қарау",
+       "viewsource-title": "$1 бетінің қайнарын қарау",
        "actionthrottled": "Әрекет бәсеңдетілді",
-       "actionthrottledtext": "Спамға қарсы күрес есебінде, осы әрекетті қысқа уақытта тым көп рет орындауыңыз шектелінді, және бұл шектеу шамасынан асып кеткенсіз.\nБірнеше минуттан қайта байқап көріңіз.",
-       "protectedpagetext": "Ð\91ұл Ð±ÐµÑ\82 Ó©Ò£Ð´ÐµÑ\83 Ð½ÐµÐ¼ÐµÑ\81е Ð±Ð°Ñ\81Ò\9bа Ó©Ð·Ð³ÐµÑ\80Ñ\96Ñ\81Ñ\82еÑ\80 ÐµÐ½Ð³Ñ\96зÑ\96лмеÑ\81 үшін қорғалған.",
+       "actionthrottledtext": "Спамға қарсы күрес есебінде осы әрекетті қысқа уақытта тым көп рет орындауыңыз шектелінді және бұл шектеу шамасынан асып кетіпсіз.\nБірнеше минуттан кейін қайта байқап көріңіз.",
+       "protectedpagetext": "Ð\91ұл Ð±ÐµÑ\82 Ó©Ò£Ð´ÐµÑ\83 Ð½ÐµÐ¼ÐµÑ\81е Ð±Ð°Ñ\81Ò\9bа Ó\99Ñ\80екеÑ\82Ñ\82еÑ\80дÑ\96 Ð±Ð¾Ð»Ð´Ñ\8bÑ\80маÑ\83 үшін қорғалған.",
        "viewsourcetext": "Бұл беттің қайнарын қарауыңызға және көшіріп алуыңызға болады:",
-       "viewyourtext": "Осы бет арқылы \"өзіңіз жасаған өңдеулердің\" бастапқы мәтінін көруге және көшіруге мүмкіндігіңіз болады.",
-       "protectedinterface": "This page provides interface text for the software on this wiki, and is protected to prevent abuse.\nTo add or change translations for all wikis, please use [//translatewiki.net/ translatewiki.net], the MediaWiki localisation project.",
-       "editinginterface": "'''Ескерту:''' Бағдарламалық жасақтаманың тілдесу мәтінін жетістіретін бетін өңдеп жатырсыз.\nБұл беттің өзгертуі басқа қатысушыларға пайдаланушылық тілдесуі қалай көрінетіне әсер етеді.\nБарлық уикилер үшін аудармаларды өзгерту немесе қосу үшін [//translatewiki.net/ translatewiki.net] МедиаУики жерлестіру жобасын пайдаланыңыз.",
-       "cascadeprotected": "Бұл бет өңдеуден қорғалған, себебі бұл келесі «баулы қорғауы» қосылған {{PLURAL:$1|беттің|беттердің}} кірікбеті:\n$2",
-       "namespaceprotected": "'''$1''' есім аясындағы беттерді өңдеу үшін рұқсатыңыз жоқ.",
-       "customcssprotected": "Сіздің бұл CSS-бетті өңдеуге рұқсатыңыз жоқ, себебі мұнда өзге қатысушының жеке баптаулары бар.",
-       "customjsprotected": "Сіздің бұл JavaScript бетін өңдеуге рұқсатыңыз жоқ, себебі мұнда өзге қатысушының жеке баптаулары бар.",
+       "viewyourtext": "Осы беттен <strong>өңдемелеріңіздің</strong> қайнарын қарай және көшіре аласыз.",
+       "protectedinterface": "Бұл бет осы уикидің бағдарламалық жасақтамасы үшін интерфейс мәтінін қамтамасыз етеді және қиянаттауды болдырмау үшін қорғалған. Барлық уикилер үшін аудармаларды қосу немесе өзгерту үшін [//translatewiki.net/ translatewiki.net] MediaWiki жерсіндіру жобасын қолданыңыз.",
+       "editinginterface": "<strong>Ескерту:</strong> Бағдарламалық жасақтаманың тілдесу мәтінін жетістіретін бетін өңдеп жатырсыз.\nБұл беттің өзгертілуі басқа қатысушыларға пайдаланушылық интерфейсін қалай көрінетіне әсер етеді.\nБарлық уикилер үшін аудармаларды өзгерту немесе қосу үшін [//translatewiki.net/ translatewiki.net] МедиаУики жерсіндіру жобасын пайдаланыңыз.",
+       "cascadeprotected": "Бұл бет өңдеуден қорғалған, себебі бұл келесі «баулы қорғауы» қосылған {{PLURAL:$1|бетке|беттерге}} кірістірілген:\n$2",
+       "namespaceprotected": "<strong>$1</strong> есім кеңістігіндегі беттерді өңдеу рұқсатыңыз жоқ.",
+       "customcssprotected": "Сіздің бұл CSS бетін өңдеуге рұқсатыңыз жоқ, себебі мұнда өзге қатысушының жеке баптауларынан тұрады.",
+       "customjsprotected": "Сіздің бұл JavaScript бетін өңдеуге рұқсатыңыз жоқ, себебі мұнда өзге қатысушының жеке баптауларынан тұрады.",
        "mycustomcssprotected": "Сізде CSS бетін өңдеуге рұқсатыңыз жоқ.",
        "mycustomjsprotected": "Сізде JavaScript бетін өңдеуге рұқсатыңыз жоқ.",
-       "myprivateinfoprotected": "СÑ\96зде Ð¶ÐµÐºÐµ Ð°Ò\9bпаÑ\80аÑ\82Ñ\82аÑ\80Ñ\8bÒ£Ñ\8bздÑ\8b өңдеу рұқсатыңыз жоқ.",
+       "myprivateinfoprotected": "СÑ\96зде Ð¶ÐµÐºÐµ Ð¼Ó\99лÑ\96меÑ\82Ñ\82еÑ\80Ñ\96Ò£Ñ\96здÑ\96 өңдеу рұқсатыңыз жоқ.",
        "mypreferencesprotected": "Сізде баптауларыңызды өңдеуге рұқсатыңыз жоқ.",
-       "ns-specialprotected": "{{ns:special}} есім аясындағы беттер өңдеуге келмейді.",
-       "titleprotected": "Бұл тақырып аты бастаудан [[User:$1|$1]] қорғады.\nКелтірілген себебі: ''$2''.",
-       "filereadonlyerror": "«$2» Ñ\81аÒ\9bÑ\82амаÑ\81Ñ\8b Â«Ñ\82ек Ò\9bана Ð¾Ò\9bÑ\83» Ñ\82Ó\99Ñ\80Ñ\82Ñ\96пÑ\82емеÑ\81Ñ\96нде Ñ\82Ò±Ñ\80Ò\93аÑ\81Ñ\8bн, Â«$1» Ñ\84айлÑ\8bн Ó©Ð·Ð³ÐµÑ\80Ñ\82Ñ\83 Ð¼Ò¯Ð¼ÐºÑ\96н ÐµÐ¼ÐµÑ\81.\nÐ\91ұл Ñ\82Ó\99Ñ\80Ñ\82Ñ\96пÑ\82еменÑ\96 Ò\9bондÑ\8bÑ\80Ò\93ан Ó\99кÑ\96мÑ\88Ñ\96 ÐºÐµÐ»ÐµÑ\81Ñ\96 Ñ\82Ò¯Ñ\81Ñ\96ндÑ\96Ñ\80менÑ\96 Ò\9bалдÑ\8bÑ\80дÑ\8b: Â«''$3''»",
-       "invalidtitle-knownnamespace": "\"$2\" есім кеңістік түрі және  \"$3\" мәтіні жарамсыз",
-       "invalidtitle-unknownnamespace": "Нөмері $1 белгісіз есім кеңістік түрі және \"$2\" мәтіні жарамсыз",
+       "ns-specialprotected": "Арнайы беттер өңдеуге келмейді.",
+       "titleprotected": "Бұл атауды бастаудан [[User:$1|$1]] қорғаған.\nКелтірілген себебі: «<em>$2</em>».",
+       "filereadonlyerror": "«$2» Ñ\84айл Ò\9bоÑ\80Ñ\8b Ñ\82ек Ò\9bана Ð¾Ò\9bÑ\83 Ñ\82Ó\99Ñ\80Ñ\82Ñ\96пÑ\82емеÑ\81Ñ\96нде Ñ\82Ò±Ñ\80Ò\93аÑ\81Ñ\8bн Â«$1» Ñ\84айлÑ\8bн Ó©Ð·Ð³ÐµÑ\80Ñ\82Ñ\83 Ð¼Ò¯Ð¼ÐºÑ\96н ÐµÐ¼ÐµÑ\81.\nÐ\91ұл Ñ\82Ó\99Ñ\80Ñ\82Ñ\96пÑ\82еменÑ\96 Ò\9bондÑ\8bÑ\80Ò\93ан Ó\99кÑ\96мÑ\88Ñ\96 ÐºÐµÐ»ÐµÑ\81Ñ\96 Ñ\82Ò¯Ñ\81Ñ\96ндÑ\96Ñ\80менÑ\96 Ò\9bалдÑ\8bÑ\80дÑ\8b: Â«$3»",
+       "invalidtitle-knownnamespace": "«$2» есім кеңістік түрі және  «$3» мәтіні жарамсыз",
+       "invalidtitle-unknownnamespace": "Нөмері $1 белгісіз есім кеңістік атауы және «$2» мәтіні жарамсыз",
        "exception-nologin": "Кірмегенсіз",
        "exception-nologin-text": "Бұл әрекетке немесе бетке қатынау үшін [[Special:Userlogin|кіріңіз]].",
        "exception-nologin-text-manual": "Бұл бетке қатынау немесе әрекетті орнындау үшін $1",
-       "virus-badscanner": "Ð\94Ò±Ñ\80Ñ\8bÑ\81 ÐµÐ¼ÐµÑ\81 Ñ\96Ñ\88Ò\9bÒ±Ñ\80Ñ\8bлÑ\8bм. Ð\91елгÑ\96Ñ\81Ñ\96з Ð²Ð¸Ñ\80Ñ\83Ñ\81 Ñ\81канеÑ\80Ñ\96: $1",
-       "virus-scanfailed": "Ñ\81канеÑ\80леÑ\83 Ð¾Ñ\80Ñ\8bндалмадÑ\8b (код $1)",
+       "virus-badscanner": "Ð\94Ò±Ñ\80Ñ\8bÑ\81 ÐµÐ¼ÐµÑ\81 Ñ\96Ñ\88Ò\9bÒ±Ñ\80Ñ\8bлÑ\8bм. Ð\91елгÑ\96Ñ\81Ñ\96з Ð²Ð¸Ñ\80Ñ\83Ñ\81 Ñ\81кайнеÑ\80Ñ\96: <em>$1</em>",
+       "virus-scanfailed": "Ñ\81кайнеÑ\80леÑ\83 Ð¾Ñ\80Ñ\8bндалмадÑ\8b (кодÑ\8b: $1)",
        "virus-unknownscanner": "белгісіз антивирус:",
-       "logouttext": "<strong>Ð\96үйеден Ñ\88Ñ\8bÒ\9bÑ\82Ñ\8bÒ£Ñ\8bз.</strong>\n\nÐ\90Ò£Ò\93аÑ\80Ñ\82па: Ð\9aейбÑ\96Ñ\80 Ð±ÐµÑ\82Ñ\82еÑ\80 Ñ\88олÒ\93Ñ\8bÑ\88Ñ\8bÒ£Ñ\8bздÑ\8bÒ£ ÐºÑ\8dÑ\88Ñ\96н Ñ\82азаÑ\80Ñ\82Ò\9bанÑ\88а Ó\99лÑ\96 Ð´Ðµ Ð¶Ò¯Ð¹ÐµÐ³Ðµ ÐºÑ\96Ñ\80Ñ\96п Ð¾Ñ\82Ñ\8bÑ\80Ò\93анÑ\8bÒ£Ñ\8bздай ÐºÓ©Ñ\80Ñ\96нÑ\83Ñ\96 Ð¼Ò¯Ð¼ÐºÑ\96н.",
+       "logouttext": "<strong>Ð\96үйеден Ñ\88Ñ\8bÒ\9bÑ\82Ñ\8bÒ£Ñ\8bз.</strong>\n\nÐ\9aейбÑ\96Ñ\80 Ð±ÐµÑ\82Ñ\82еÑ\80 Ð±Ñ\80оÑ\83зеÑ\80Ñ\96Ò£Ñ\96здÑ\96Ò£ ÐºÑ\8dÑ\88Ñ\96н Ñ\82азаÑ\80Ñ\82Ò\9bанÑ\88а Ó\99лÑ\96 Ð´Ðµ Ð¶Ò¯Ð¹ÐµÐ³Ðµ ÐºÑ\96Ñ\80Ñ\96п Ð¾Ñ\82Ñ\8bÑ\80Ò\93анÑ\8bÒ£Ñ\8bздай ÐºÓ©Ñ\80Ñ\96нÑ\83Ñ\96 Ð¼Ò¯Ð¼ÐºÑ\96ндÑ\96гÑ\96н ÐµÑ\81кеÑ\80Ñ\96Ò£Ñ\96з.",
        "welcomeuser": "Қош келдіңіз, $1!",
-       "welcomecreation-msg": "Сіздің тіркеліміңіз жасалынды.\n[[Special:Preferences|{{SITENAME}} баптауларыңызды]] өзгертуді ұмытпаңыз.",
+       "welcomecreation-msg": "Сіз тіркелдіңіз.\n{{SITENAME}} [[Special:Preferences|баптауларыңызды]] өзіңіз қалауыңыз бойынша өзгерте аласыз.",
        "yourname": "Қатысушы аты:",
        "userlogin-yourname": "Қатысушы есіміңіз",
        "userlogin-yourname-ph": "Қатысушы есіміңізді енгізіңіз",
-       "createacct-another-username-ph": "Қатысушы есіміңізді енгізіңіз",
+       "createacct-another-username-ph": "Қатысушы есімін енгізіңіз",
        "yourpassword": "Құпия сөз:",
        "userlogin-yourpassword": "Құпия сөз",
        "userlogin-yourpassword-ph": "Құпия сөздіңізді енгізіңіз",
        "createacct-yourpasswordagain-ph": "Құпия сөзіңізді қайтадан енгізіңіз",
        "remembermypassword": "Тіркелгімді осы браузерде ұмытпа (ең көбі $1 {{PLURAL:$1|күн|күн}})",
        "userlogin-remembermypassword": "Мені жүйеде сақтап қою",
-       "userlogin-signwithsecure": "Құпия байланысуды қолдану",
-       "yourdomainname": "Желі үйшігіңіз:",
+       "userlogin-signwithsecure": "Қауіпсіз байланысуды қолдану",
+       "yourdomainname": "Үйшігіңіз:",
        "password-change-forbidden": "Сіз бұл уикиде құпия сөзіңізді өзгерте алмайсыз.",
        "externaldberror": "Осы арада не шеттік растау дерекқорында қате болды, немесе шеттік тіркелгіңізді жаңалау рұқсаты жоқ.",
        "login": "Кіру",
        "nav-login-createaccount": "Кіру / Тіркелу",
-       "loginprompt": "{{SITENAME}} Ñ\82оÑ\80абÑ\8bна ÐºÑ\96Ñ\80Ñ\83Ñ\96Ò£Ñ\96з Ò¯Ñ\88Ñ\96н Â«cookies» Ò\9bоÑ\81Ñ\8bлÑ\83Ñ\8b Ð¶Ó©Ð½.",
+       "loginprompt": "{{SITENAME}} Ñ\82оÑ\80абÑ\8bна ÐºÑ\96Ñ\80Ñ\83Ñ\96Ò£Ñ\96з Ò¯Ñ\88Ñ\96н Â«cookies» Ò\9bоÑ\81Ñ\8bлÑ\83Ñ\8b ÐºÐµÑ\80ек.",
        "userlogin": "Кіру / Тіркелу",
        "userloginnocreate": "Кіру",
        "logout": "Шығу",
        "notloggedin": "Кірмегенсіз",
        "userlogin-noaccount": "Тіркелгіңіз жоқ па?",
        "userlogin-joinproject": "{{SITENAME}} жобасына тіркелу",
-       "nologin": "ТÑ\96Ñ\80келгÑ\96Ò£Ñ\96з Ð±Ð°Ñ\80 Ð¼а? $1.",
+       "nologin": "ТÑ\96Ñ\80келгÑ\96Ò£Ñ\96з Ð¶Ð¾Ò\9b Ð¿а? $1.",
        "nologinlink": "Тіркелгіңізді жасаңыз",
-       "createaccount": "Ð\96аңа Ñ\82Ñ\96Ñ\80келгÑ\96",
+       "createaccount": "ТÑ\96Ñ\80келÑ\83",
        "gotaccount": "Бұған дейін тіркеліп пе едіңіз? '''$1'''.",
        "gotaccountlink": "Кіріңіз",
        "userlogin-resetlink": "Қатысушы атын не құпия сөзді ұмыттыңыз ба?",
        "userlogin-helplink2": "Кіруге көмек",
        "userlogin-loggedin": "{{GENDER:$1|$1}} ретінде әлдеқашан кіргенсіз.\nТөмендегі пішінді басқа қатысушы кіруі ретінде қолданыңыз.",
        "userlogin-createanother": "Басқа тіркелгі жасау",
-       "createacct-join": "Төменге өзіңіз туралы ақпарат енгізіңіз.",
-       "createacct-another-join": "Төменге жаңа тіркелгі туралы ақпарат енгізіңіз.",
-       "createacct-emailrequired": "Е-пошта мекен-жайы:",
-       "createacct-emailoptional": "Е-поштаның мекен-жайы (міндетті емес)",
+       "createacct-emailrequired": "Е-пошта мекен-жайы",
+       "createacct-emailoptional": "Е-пошта мекен-жайы (міндетті емес)",
        "createacct-email-ph": "Е-пошта мекен-жайыңызды енгізіңіз",
        "createacct-another-email-ph": "Е-пошта мекен-жайын енгізіңіз",
-       "createaccountmail": "Уақытша берілген кілтсөзді пайдаланыңыз және оны көрсетілген электрондық поштаға жіберіңіз",
+       "createaccountmail": "Уақытша берілген құпия сөзді пайдаланыңыз және оны көрсетілген электрондық поштаға жіберіңіз",
        "createacct-realname": "Нақты атыңыз (ерікті)",
        "createaccountreason": "Себебі:",
        "createacct-reason": "Себебі:",
        "createacct-imgcaptcha-ph": "Жоғарыдағы мәтінді енгізіңіз",
        "createacct-submit": "Тіркелгіңізді жасаңыз",
        "createacct-another-submit": "Басқа тіркелгі жасау",
-       "createacct-benefit-heading": "{{SITENAME}} сіз сияқты қызығатын адамдар арқылы жасалады.",
+       "createacct-benefit-heading": "{{SITENAME}} сіздермен жасалады.",
        "createacct-benefit-body1": "{{PLURAL:$1|өңдеме|өңдеме}}",
        "createacct-benefit-body2": "{{PLURAL:$1|бет|бет}}",
        "createacct-benefit-body3": "жуықтағы {{PLURAL:$1|қатысушы|қатысушы}}",
        "nocookiesnew": "Жаңа қатысушы тіркелгісі жасалды, бірақ кірмегенсіз.\nҚатысушы кіру үшін {{SITENAME}} торабында «cookie» файлдары қолданылады.\nСізде «cookies» өшірілген.\nСоны қосыңыз да жаңа қатысушы атыңызды және құпия сөзіңізді енгізіп кіріңіз.",
        "nocookieslogin": "Қатысушы кіру үшін {{SITENAME}} торабында «cookies» деген қолданылады.\nСізде «cookies» өшірілген.\nСоны қосыңыз да кіруді қайта байқап көріңіз.",
        "nocookiesfornew": "Оның қайнарын растай алмағандықтан қатысушының аккаунты тіркелмеді. «Cookies» қосылып тұрғанына көз жеткізіңіз, бетті қайта жаңартыңыз және тағы байқап көріңіз.",
-       "noname": "Ð\96аÑ\80амдÑ\8b Ò\9bаÑ\82Ñ\8bÑ\81Ñ\83Ñ\88Ñ\8b Ð°Ñ\82Ñ\8bн ÐµÐ½Ð³Ñ\96збедÑ\96Ò£Ñ\96з.",
-       "loginsuccesstitle": "Кіруіңіз сәтті өтті",
-       "loginsuccess": "'''Сіз енді {{SITENAME}} жобасына «$1» ретінде кірдіңіз.'''",
-       "nosuchuser": "«$1» деген қатысушы тіркелмеген.\nҚатысушы аттары кіші әріптерден тұру керек.\nЕмлеңізді тексеріңіз, немесе [[Special:UserLogin/signup|жаңа тіркелгі жасаңыз]].",
-       "nosuchusershort": "Мұнда «$1» деп аталған қатысушы жоқ.\nЕмлеңізді тексеріңіз.",
-       "nouserspecified": "Қатысушы атын келтіруіңіз жөн.",
+       "noname": "СÑ\96зде Ð¶Ð°Ñ\80амдÑ\8b Ò\9bаÑ\82Ñ\8bÑ\81Ñ\83Ñ\88Ñ\8b Ð°Ñ\82Ñ\8b Ð°Ð½Ñ\8bÒ\9bÑ\82алмаÒ\93ан.",
+       "loginsuccesstitle": "Кіруіңіз сәтті болды.",
+       "loginsuccess": "<strong>Сіз енді {{SITENAME}} жобасына «$1» ретінде кірдіңіз.</strong>",
+       "nosuchuser": "Мұнда «$1» деп аталған қатысушы тіркелмеген.\nҚатысушы аттары кіші әріптерден тұру керек.\nЕмлеңізді тексеріңіз немесе [[Special:UserLogin/signup|жаңа тіркелгі жасаңыз]].",
+       "nosuchusershort": "Мұнда «$1» деп аталған қатысушы тіркелмеген.\nЕмлеңізді тексеріңіз.",
+       "nouserspecified": "Қатысушы атын көрсетуіңіз керек.",
        "login-userblocked": "Бұл қатысушы бұғатталған. Жүйеге кiру рұқсат етiлмеген.",
-       "wrongpassword": "Ð\91Ò±Ñ\80Ñ\8bÑ\81 Ò\9bұпиÑ\8f Ñ\81өз ÐµÐ½Ð³Ñ\96зÑ\96лген. Қайта байқап көріңіз.",
-       "wrongpasswordempty": "Құпия сөз бос болған. Қайта байқап көріңіз.",
-       "passwordtooshort": "Құпия сөзіңіз жарамсыз немесе тым қысқа.\nБұнда ең кемінде $1 таңба болуы керек.",
-       "password-name-match": "Енгізген құпия сөзіңіз қатысушы атынан өзгеше болуы қажет.",
+       "wrongpassword": "Ð\94Ò±Ñ\80Ñ\8bÑ\81 ÐµÐ¼ÐµÑ\81 Ò\9bұпиÑ\8f Ñ\81өз ÐµÐ½Ð³Ñ\96зÑ\96лген. \nҚайта байқап көріңіз.",
+       "wrongpasswordempty": "Құпия сөз бос болған.\nҚайта байқап көріңіз.",
+       "passwordtooshort": "Құпиясөзде кем дегенде {{PLURAL:$1|1таңба|таңба}} болуы керек.",
+       "password-name-match": "Құпия сөзіңіз қатысушы атынан өзгеше болуы қажет.",
        "password-login-forbidden": "Бұл қатысушы аты мен құпия сөзін пайдалануға тыйым салынған.",
        "mailmypassword": "Құпия сөзді қалпына кеттіру",
        "passwordremindertitle": "{{SITENAME}} үшін жаңа уақытша құпия сөз",
-       "passwordremindertext": "Біреу (IP мекенжайы: $1, бәлкім өзіңіз боларсыз) {{SITENAME}} үшін жаңа құпия сөз жөнелету сұранымын жасаған ($4).\nҚатысушы «$2» үшін уақытша құпия сөз жасалды: «$3». Егер бұл Сіздің сұранымыңыз болса, жүйеге кіріп құпия сөзді өзгертуіңіз керек. Сіздің уақытша құпия сөзіңіз $5 дейін белсенді болады.\n\nЕгер бұл сұранымды Сіз жасамасыңыз, не құпия сөзді еске түсіріп енді өзгерткіңіз келмесе, ескі құпия сөзді қолдануды жалғастырып осы хатқа аңғармауыңызға да болады.",
-       "noemail": "Осы арада «$1» қатысушының е-пошта мекенжайы жоқ.",
-       "noemailcreate": "СÑ\96зге Ð½Ð°Ò\9bÑ\82Ñ\8b Ð¶Ð°Ñ\80амдÑ\8b Ñ\8dлекÑ\82Ñ\80ондÑ\8bÒ\9b Ð¿Ð¾Ñ\88Ñ\82а Ð¼ÐµÐºÐµÐ½-жайÑ\8bн ÐºÓ©Ñ\80Ñ\81еÑ\82Ñ\83 ÐºÐµÑ\80ек.",
-       "passwordsent": "Жаңа құпия сөз «$1» үшін тіркелген е-пошта мекенжайына жөнелтілді.\nҚабылдағаннан кейін кіргенде соны енгізіңіз.",
+       "passwordremindertext": "Біреу (IP мекенжайы: $1, бәлкім өзіңіз боларсыз) {{SITENAME}} жобасында жаңа құпия сөз жөнелету сұранымын жасаған ($4).\nҚатысушы «$2» үшін уақытша құпия сөз жасалды: «$3». Егер бұл сіздің сұранымыңыз болса қазір жүйеге кіріп жаңа құпия сөз таңдауыңыз керек. \nСіздің уақытша құпия сөзіңіз {{PLURAL:$5|бір күнге|$5 күнге}} дейін белсенді болады.\n\nЕгер бұл сұранымды басқа біреу жасаса, не құпия сөздіңізді еске түсіріп енді өзгерткіңіз келмесе ескі құпия сөзді қолдануды жалғастырып осы хатты елемеуіңізге да болады.",
+       "noemail": "Осы арада жазылып алынған «$1» қатысушының е-пошта мекенжайы жоқ.",
+       "noemailcreate": "Сізге жарамды электрондық пошта мекен-жайын көрсету керек.",
+       "passwordsent": "Жаңа құпия сөз «$1» үшін тіркелген е-пошта мекенжайына жөнелтілді.\nҚабылдағаннан кейін қайта жүйеге кіргенде соны енгізіңіз.",
        "blocked-mailpassword": "IP мекенжайыңыздан өңдеу бұғатталған, сондықтан қиянатты қақпайлау үшін құпия сөзді қалпына келтіру жетесін қолдануына рұқсат етілмейді.",
-       "eauthentsent": "Ò\9aұпÑ\82аÑ\83 Ñ\85аÑ\82Ñ\8b Ð°Ð¹Ñ\82Ñ\8bлмÑ\8bÑ\88 Ðµ-поÑ\88Ñ\82а Ð¼ÐµÐºÐµÐ½Ð¶Ð°Ð¹Ñ\8bна Ð¶Ó©Ð½ÐµÐ»Ñ\82Ñ\96лдÑ\96.\nÐ\91аÑ\81Ò\9bа Ðµ-поÑ\88Ñ\82а Ñ\85аÑ\82Ñ\8bн Ð¶Ó©Ð½ÐµÐ»Ñ\82Ñ\83 Ð°Ð»Ð´Ñ\8bнан, Ñ\82Ñ\96Ñ\80келгÑ\96 Ñ\88Ñ\8bнÑ\8bнан сіздікі екенін құптау үшін хаттағы нұсқамаларға лесіңіз.",
-       "throttled-mailpassword": "Соңғы {{PLURAL:$1|сағатта|$1 сағатта}} құпия сөз ескерту хаты алдақашан жөнелтілді.\nҚиянатты қақпайлау үшін, {{PLURAL:$1|сағат|$1 сағат}} сайын тек бір ғана құпия сөз ескерту хаты жөнелтіледі.",
+       "eauthentsent": "Ò\9aұпÑ\82аÑ\83 Ñ\85аÑ\82Ñ\8b ÐºÓ©Ñ\80Ñ\81еÑ\82Ñ\96лген Ðµ-поÑ\88Ñ\82а Ð¼ÐµÐºÐµÐ½Ð¶Ð°Ð¹Ñ\8bна Ð¶Ó©Ð½ÐµÐ»Ñ\82Ñ\96лдÑ\96.\nÐ\9aез-келген Ð±Ð°Ñ\81Ò\9bа Ðµ-поÑ\88Ñ\82а Ñ\85аÑ\82Ñ\8bн Ñ\82Ñ\96Ñ\80келгÑ\96ге Ð¶Ó©Ð½ÐµÐ»Ñ\82Ñ\83 Ð°Ð»Ð´Ñ\8bнан, Ñ\82Ñ\96Ñ\80келгÑ\96 Ñ\88Ñ\8bнÑ\8bмен сіздікі екенін құптау үшін хаттағы нұсқамаларға лесіңіз.",
+       "throttled-mailpassword": "Соңғы {{PLURAL:$1|сағатта|$1 сағатта}} құпия сөзді өзгерту хаты әлдеқашан жіберілді.\nҚиянатты қақпайлау үшін {{PLURAL:$1|сағат|$1 сағат}} сайын тек бір ғана құпия сөзді өзгерту хаты жіберіледі.",
        "mailerror": "Хат жөнелту қатесі: $1",
-       "acct_creation_throttle_hit": "Сіздің IP-мекенжайыңызбен осы уикиге кірушілер соңғы күнде {{PLURAL:$1|1 тіркелгі|$1 тіркелгі}} жасапты. Одан артық бұл уақыт аралығында рұқсат етілмейді.\nНәтижесінде осы IP-мекенжайды пайдаланып кірушілер дәл қазіргі уақытта бірнеше тіркелгі жасай алмайды.",
-       "emailauthenticated": "Е-пошта мекен-жайыңыз расталған кезі: $3, $2.",
-       "emailnotauthenticated": "Е-пошта мекен-жайыңыз әлі расталған жоқ.\nКелесі әрбір мүмкіндіктер үшін еш хат жөнелтілмейді.",
+       "acct_creation_throttle_hit": "Сіздің IP мекенжайыңызбен осы уикиге кірушілер соңғы күнде {{PLURAL:$1|1 тіркелгі|$1 тіркелгі}} жасапты. Одан артық бұл уақыт аралығында рұқсат етілмейді.\nНәтижесінде осы IP мекенжайды пайдаланып кірушілер дәл қазіргі уақытта бірнеше тіркелгі жасай алмайды.",
+       "emailauthenticated": "Е-пошта мекенжайыңыз расталған кезі: $3, $2.",
+       "emailnotauthenticated": "Е-пошта мекенжайыңыз әлі расталған жоқ.\nКелесі әрбір мүмкіндіктер үшін еш хат жөнелтілмейді.",
        "noemailprefs": "Осы мүмкіндіктер істеуі үшін е-пошта мекен-жайыңызды енгізіңіз.",
        "emailconfirmlink": "Е-пошта мекен-жайыңызды құптаңыз",
-       "invalidemailaddress": "Ð\91ұл Ðµ-поÑ\88Ñ\82а ÐµÑ\81Ñ\96мÑ\96 Ð¿Ñ\96Ñ\88Ñ\96мге Ñ\81Ó\99йкеÑ\81 ÐºÐµÐ»Ð¼ÐµÐ³ÐµÐ½Ð´Ñ\96кÑ\82ен Ò\9bабÑ\8bлданбайдÑ\8b.\nÐ\94Ò±Ñ\80Ñ\8bÑ\81 Ð¿Ñ\96Ñ\88Ñ\96мделген Ðµ-поÑ\88Ñ\82а ÐµÑ\81Ñ\96мÑ\96н ÐµÐ½Ð³Ñ\96зÑ\96Ò£Ñ\96з, Ð½ÐµÐ¼ÐµÑ\81е Ð°Ñ\83мақты бос қалдырыңыз.",
-       "cannotchangeemail": "Тіркелгінің е-поштасының мекен-жайы бұл уикиде өзгертілмейді.",
-       "emaildisabled": "Бұл сайт е-поштаның хабарламасын жібере алмайды.",
+       "invalidemailaddress": "Ð\91ұл Ðµ-поÑ\88Ñ\82а Ð¼ÐµÐºÐµÐ½Ð¶Ð°Ð¹Ñ\8b Ð¶Ð°Ñ\80амÑ\81Ñ\8bз Ð¿Ñ\96Ñ\88Ñ\96мде Ð±Ð¾Ð»Ò\93анÑ\8b Ð°Ð½Ñ\8bÒ\9bÑ\82алÒ\93андÑ\8bÒ\9bÑ\82ан Ò\9bабÑ\8bлданбайдÑ\8b.\nÐ\94Ò±Ñ\80Ñ\8bÑ\81 Ð¿Ñ\96Ñ\88Ñ\96мделген Ðµ-поÑ\88Ñ\82а Ð¼ÐµÐºÐµÐ½Ð¶Ð°Ð¹Ñ\8bн ÐµÐ½Ð³Ñ\96зÑ\96Ò£Ñ\96з Ð½ÐµÐ¼ÐµÑ\81е Ð¶Ð¾Ð»ақты бос қалдырыңыз.",
+       "cannotchangeemail": "Тіркелгінің е-пошта мекенжайы бұл уикиде өзгертілмейді.",
+       "emaildisabled": "Бұл сайт хаттар жібере алмайды.",
        "accountcreated": "Тіркелгі жасалды",
        "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|талқылауы]]) үшін жаңа қатысушы тіркелгісі жасалды.",
-       "createaccount-title": "{{SITENAME}} үшін тіркелу",
-       "createaccount-text": "Кейбіреу е-пошта мекенжайыңызды пайдаланып {{SITENAME}} жобасында ($4) «$2» атауымен, «$3» құпия сөзімен тіркелгі жасаған.\nЖобаға кіріуіңіз және құпия сөзіңізді өзгертуіңіз тиісті.\n\nЕгер бұл тіркелгі қателікпен жасалса, осы хабарға елемеуіңіз мүмкін.",
-       "login-throttled": "Сіз жүйеге кіру үшін тым көп талпыныс жасадыңыз. Өтінемін, қайта кірмес бұрын $1 күте тұрыңыз.",
-       "login-abort-generic": "Жүйеге кіру үшін сәтсіз талпыныс жасадыңыз.",
+       "createaccount-title": "{{SITENAME}} жобасына тіркелу",
+       "createaccount-text": "Әлдебіреу е-пошта мекенжайыңызды пайдаланып {{SITENAME}} жобасында ($4) «$2» деген атау, «$3» деген құпия сөзбен тіркелгі жасаған.\nҚазір жүйеге кіріуіңіз және құпия сөзіңізді өзгертуіңіз керек.\n\nЕгер бұл тіркелгі қателікпен жасалса осы хабарламаны елемеуіңізге болады.",
+       "login-throttled": "Сіз жүйеге кіру үшін тым көп талпыныс жасадыңыз.\nҚайта байқап көрмес бұрын $1 күте тұрыңыз.",
+       "login-abort-generic": "Жүйеге кіру сәтсіз болды - Доғарылды.",
        "loginlanguagelabel": "Тіл: $1",
-       "suspicious-userlogout": "Сіздің жүйеден шығу сұранымыңыз қабылданбады, өйткені, бұл жарамсыз браузер немесе кэштеуші проксидің сұранымына ұқсайды.",
+       "suspicious-userlogout": "Сіздің жүйеден шығу сұранымыңыз қабылданбады, өйткені бұл бұзылған браузер немесе кэштеуші прокси арқылы жіберілгенге ұқсайды.",
        "pt-login": "Кіру",
        "pt-login-button": "Кіру",
        "pt-createaccount": "Тіркелгі жасау",
        "pt-userlogout": "Шығу",
        "php-mail-error-unknown": "Mail() PHP-функциясындағы белгісіз қате.",
-       "user-mail-no-addy": "Е-пошта есімінсіз хабарлама жіберуге талпынды.",
+       "user-mail-no-addy": "Е-пошта мекенжайынсыз хабарлама жіберуді байқап көрді.",
+       "user-mail-no-body": "Бос немесе қысқа мағынасыз хабарлама жіберуді байқап көрді.",
        "changepassword": "Құпия сөзді өзгерту",
-       "resetpass_announce": "Ð\9aÑ\96Ñ\80Ñ\83Ñ\96Ò£Ñ\96здÑ\96 Ð±Ñ\96Ñ\82Ñ\96Ñ\80Ñ\83 Ò¯Ñ\88Ñ\96н Ð¶Ð°Ò£Ð° Ò\9bұпиÑ\8f Ñ\81өзÑ\96Ò£Ñ\96здÑ\96 Ð¼Ñ\8bнда енгізуіңіз керек:",
+       "resetpass_announce": "Ð\9aÑ\96Ñ\80Ñ\83Ñ\96Ò£Ñ\96здÑ\96 Ð°Ñ\8fÒ\9bÑ\82аÑ\83 Ò¯Ñ\88Ñ\96н Ð¶Ð°Ò£Ð° Ò\9bұпиÑ\8f Ñ\81өзÑ\96Ò£Ñ\96здÑ\96 енгізуіңіз керек:",
        "resetpass_header": "Құпия сөзді өзгерту",
        "oldpassword": "Ескі құпия сөзіңіз:",
        "newpassword": "Жаңа құпия сөзіңіз:",
        "changepassword-success": "Құпия сөзіңіз сәтті өзгертілді!",
        "changepassword-throttled": "Сіз жақында кіруге тым көп әрекет жасадыңыз.\nҚайта байқап көру үшін $1 уақыт күте тұрыңыз.",
        "resetpass_forbidden": "Құпия сөз өзгертілмейді",
-       "resetpass-no-info": "Бұл бетке тікелей ену үшін, жүйеге кіруіңіз керек.",
+       "resetpass-no-info": "Бұл бетке тікелей ену үшін жүйеге кіруіңіз керек.",
        "resetpass-submit-loggedin": "Құпия сөзді өзгерту",
        "resetpass-submit-cancel": "Болдырмау",
-       "resetpass-wrong-oldpass": "Уақытша немесе ағымдағы құпия сөзіңіз дұрыс емес.\nМүмкін Сіз құпия сөзді сәтті өзгерткенсіз, немесе жаңа уақытша құпия сөзге сұраным жасағансыз.",
+       "resetpass-wrong-oldpass": "Уақытша немесе қазіргі құпия сөзіңіз жарамсыз.\nМүмкін сіз құпия сөзді сәтті өзгерткенсіз немесе жаңа уақытша құпия сөзге сұраным жасағансыз.",
        "resetpass-temp-password": "Уақытша құпия сөз:",
-       "resetpass-abort-generic": "Құпия сөзді өзгерту кеңейтпенің әсерінен аяқталмады.",
+       "resetpass-abort-generic": "Құпия сөзді өзгерту кеңейтілім арқылы доғарылды.",
        "passwordreset": "Құпия сөзді қайтару",
-       "passwordreset-text-one": "Құпия сөзіңізді түзеу үшін бұл пішінді толтырыңыз.",
-       "passwordreset-text-many": "{{PLURAL:$1|Ð\95-поÑ\87та арқылы уақытша құпия сөзді қабылдау үшін жолақтардың бірін толтырыңыз.}}",
+       "passwordreset-text-one": "Уақытша құпия сөзіңізді электрон пошта арқылы қабылдау үшін бұл пішінді толтырыңыз.",
+       "passwordreset-text-many": "{{PLURAL:$1|Ð\95-поÑ\88та арқылы уақытша құпия сөзді қабылдау үшін жолақтардың бірін толтырыңыз.}}",
        "passwordreset-legend": "Құпия сөзді қайтару",
        "passwordreset-disabled": "Бұл уикиде құпия сөзді қайтару ажыратылған.",
        "passwordreset-emaildisabled": "E-mail мүмкіндігі бұл уикиде өшірілген.",
        "passwordreset-emailerror-capture": "Жазылған ескертпе-хат төменде көрсетілген, оның жөнелтілмеу себебі: $1",
        "changeemail": "Е-пошта мекен-жайын өзгерту",
        "changeemail-header": "Е-пошта мекен-жайының өзгертілуі",
-       "changeemail-text": "Е-поштаның мекен-жайын өзгерту үшін мына пішінді толтырыңыз. Өзгертулерді растау үшін Сізге құпия сөзді енгізу керек.",
-       "changeemail-no-info": "Бұл бетке тікелей ену үшін, жүйеге кіруіңіз керек.",
-       "changeemail-oldemail": "Е-поштаның ағымдағы мекен-жайы:",
-       "changeemail-newemail": "Ð\95-поÑ\88Ñ\82анÑ\8bÒ£ Ð¶Ð°Ò£Ð° Ð¼ÐµÐºÐµÐ½ жайы:",
+       "changeemail-text": "Е-поштаның мекен-жайын өзгерту үшін мына пішінді толтырыңыз. Өзгертулерді растау үшін құпия сөздіңізді енгізу керек.",
+       "changeemail-no-info": "Бұл бетке тікелей ену үшін жүйеге кіруіңіз керек.",
+       "changeemail-oldemail": "Е-поштаның қазіргі уақыттағы мекен-жайы:",
+       "changeemail-newemail": "Ð\96аңа Ðµ-поÑ\88Ñ\82а Ð¼ÐµÐºÐµÐ½жайы:",
        "changeemail-none": "(ешкім)",
-       "changeemail-password": "Сіздің {{SITENAME}} жобасындағы құпия сөзіңіз:",
+       "changeemail-password": "{{SITENAME}} жобасындағы құпия сөзіңіз:",
        "changeemail-submit": "Е-поштаны өзгерту",
        "changeemail-cancel": "Болдырмау",
        "changeemail-throttled": "Сіз жақында кіруге тым көп әрекет жасадыңыз.\nҚайта байқап көру үшін $1 уақыт күте тұрыңыз.",
        "italic_tip": "Қиғаш мәтін",
        "link_sample": "Сілтеме тақырыбының аты",
        "link_tip": "Ішкі сілтеме",
-       "extlink_sample": "http://www.мысал.com сілтеме тақырыбының аты",
-       "extlink_tip": "ШеÑ\82Ñ\82Ñ\96к сілтеме (алдынан http:// енгізуін ұмытпаңыз)",
+       "extlink_sample": "http://www.example.com сілтеме тақырыбының аты",
+       "extlink_tip": "СÑ\8bÑ\80Ñ\82Ò\9bÑ\8b сілтеме (алдынан http:// енгізуін ұмытпаңыз)",
        "headline_sample": "Бас жол мәтіні",
        "headline_tip": "2-ші деңгейлі бас жол",
-       "nowiki_sample": "Ð\9fÑ\96Ñ\88Ñ\96мделÑ\96нбеген Ð¼Ó\99Ñ\82Ñ\96ндÑ\96 Ð¼Ñ\8bнда ÐµÐ½Ð³Ñ\96зіңіз",
-       "nowiki_tip": "Уики пішімін елемеу",
+       "nowiki_sample": "ФоÑ\80маÑ\82Ñ\82алмаÒ\93ан Ð¼Ó\99Ñ\82Ñ\96ндÑ\96 Ð¼Ñ\8bнда ÐºÑ\96Ñ\80Ñ\96Ñ\81Ñ\82Ñ\96Ñ\80іңіз",
+       "nowiki_tip": "Уики форматтауын елемеу",
        "image_sample": "Мысал.jpg",
        "image_tip": "Ендірілген файл",
        "media_tip": "Файл сілтемесі",
        "savearticle": "Бетті сақтау",
        "preview": "Қарап шығу",
        "showpreview": "Алдын ала қарау",
-       "showlivepreview": "Жылдам қарау",
        "showdiff": "Өзгерістерді көрсет",
-       "anoneditwarning": "'''Ескерту:''' Сіз жүйеге кірмегенсіз.\nIP-мекенжайыңыз бұл беттің түзету тарихында жазылып алынады.",
-       "anonpreviewwarning": "\"Сіз жүйеге кірмегенсіз. IP-мекенжайыңыз бұл беттің өңдеу тарихында жазылып алынады.\"",
-       "missingsummary": "'''Ескерту:''' Өңдеменің қысқаша түйіндемесін енгізбепсіз.\n«Сақтау» түймесін қайта бассаңыз, өңденмеңіз түйіндемесіз сақталады.",
-       "missingcommenttext": "Ð\9cÓ\99ндемеңÑ\96здÑ\96 Ñ\82өменде енгізіңіз.",
-       "missingcommentheader": "'''Ескерту:''' Бұл мәндемеге тақырып/басжол жазбапсыз.\n«{{int:savearticle}}» түймесін тағы бассаңыз, өңдемеңіз түйіндемесіз жазылады.",
+       "anoneditwarning": "<strong> Ескерту:</strong>  Сіз жүйеге кірмегенсіз.\nIP мекенжайыңыз бұл беттің өңделу тарихында жазылып алынады.",
+       "anonpreviewwarning": "<em>Сіз жүйеге кірмегенсіз. IP мекенжайыңыз бұл беттің өңделу тарихында жазылып алынады.</em>",
+       "missingsummary": "<strong>Ескерту:</strong> Өңдеменің қысқаша түйіндемесін енгізбепсіз.\n«{{int:savearticle}}» батырмасын қайта бассаңыз өңденмеңіз түйіндемесіз сақталады.",
+       "missingcommenttext": "Ð\9fÑ\96кÑ\96Ñ\80Ñ\96Ò£Ñ\96здÑ\96 Ñ\82өменге енгізіңіз.",
+       "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-мекенжайыңыз бұғатталған.'''\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Сұраным жасағанда осының екеуін де кірістіруіңізді сұраймыз.",
+       "blockedtext": "<strong>Қатысушы атыңыз не IP мекенжайыңыз бұғатталған.</strong>\n\n$1 деген әкімші бұғаттаған. \nКелтірілген себебі: <em>$2</em>.\n\n* Бұғаттаудың басталғаны: $8\n* Бұғаттаудың бітетіні: $6\n* Бұғаттау нысанасы: $7\n\nОсы бұғаттауды талқылау үшін $1 не өзге [[{{MediaWiki:Grouppage-sysop}}|әкімшімен]] байланыса аласыз.\n[[Special:Preferences|Тіркелгі бапталымдары]]ңызда жарамды е-пошта мекенжайын көрсетіп және де оны пайдаланудан бұғатталмаған жағдайда ғана «Қатысушыға хат жазу» қызметін қолдана аласыз.\nАғымдық 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[[Special:Preferences|Тіркелгі бапталымдары]]ңызда жарамды е-пошта мекенжайын көрсеткен болсаңыз және де оны пайдаланудан бұғатталмаған жағдайда ғана «Қатысушыға хат жазу» қызметін қолдана аласыз.\nАғымдық IP мекенжайыңыз: $3, бұғатау нөмірі: $5.\nСұраным жасағанда осының екеуін де кірістіруіңізді сұраймыз.",
        "blockednoreason": "еш себебі келтірілмеген",
        "whitelistedittext": "Беттерді өңдеу үшін $1.",
-       "confirmedittext": "Беттерді өңдеу үшін алдын ала Е-пошта мекенжайыңызды құптауыңыз жөн.\nЕ-пошта мекенжайыңызды [[Special:Preferences|қатысушы бапталымдарыңыз]] арқылы қойыңыз да жарамдылығын тексеріп шығыңыз.",
-       "nosuchsectiontitle": "Бұл бөлімді табу мүмкін емес",
-       "nosuchsectiontext": "СÑ\96з Ð±Ò±Ñ\80Ñ\8bн Ð±Ð¾Ð»Ð¼Ð°Ò\93ан Ð±Ó©Ð»Ñ\96мдÑ\96 Ó©Ð·Ð³ÐµÑ\80Ñ\82пекÑ\88Ñ\96Ñ\81Ñ\96з.\nÐ\9cүмкÑ\96н Ð±Ò±Ð» Ð±ÐµÑ\82Ñ\82Ñ\96 Ò\9bаÑ\80ап Ð¶Ð°Ñ\82Ò\9bанÑ\8bÒ£Ñ\8bзда Ð¾Ð» Ð±Ó©Ð»Ñ\96м Ð¶Ð¾Ð¹Ñ\8bлÒ\93ан Ð½ÐµÐ¼ÐµÑ\81е Ð±Ð°Ñ\81Ò\9bа Ð¾Ñ\80Ñ\8bнÒ\93а ÐºÓ©Ñ\88Ñ\96Ñ\80Ñ\96лген.",
-       "loginreqtitle": "Ð\9aÑ\96Ñ\80Ñ\83Ñ\96Ò£Ñ\96з ÐºÐµÑ\80ек",
+       "confirmedittext": "Беттерді өңдеу алдында е-пошта мекенжайыңызды құптауыңыз керек.\nЕ-пошта мекенжайыңызды [[Special:Preferences|қатысушы бапталымдарыңыз]] арқылы қойыңыз да жарамдылығын тексеріп шығыңыз.",
+       "nosuchsectiontitle": "Бөлімді табу мүмкін емес",
+       "nosuchsectiontext": "СÑ\96з Ð¶Ð¾Ò\9b Ð±Ó©Ð»Ñ\96мдÑ\96 Ó©Ò£Ð´ÐµÐ¿ ÐºÓ©Ñ\80мекÑ\88Ñ\96Ñ\81Ñ\96з.\nÐ\9cүмкÑ\96н Ð±ÐµÑ\82Ñ\82Ñ\96 Ò\9bаÑ\80ап Ð¶Ð°Ñ\82Ò\9bанÑ\8bÒ£Ñ\8bзда Ð¾Ð½Ñ\8b Ð¶Ð¾Ð¹Ò\93ан Ð½ÐµÐ¼ÐµÑ\81е Ð±Ð°Ñ\81Ò\9bа Ð¾Ñ\80Ñ\8bнÒ\93а ÐºÓ©Ñ\88Ñ\96Ñ\80ген.",
+       "loginreqtitle": "Ð\96үйеге ÐºÑ\96Ñ\80Ñ\83дÑ\96 Ò\9bажеÑ\82 ÐµÑ\82едÑ\96",
        "loginreqlink": "кіріңіз",
        "loginreqpagetext": "Басқа беттерді көру үшін $1.",
-       "accmailtitle": "Құпия сөз жөнелтілді.",
-       "accmailtext": "$2 дегенге [[User talk:$1|$1]] үшін құпия сөзі жөнелтілді.\nБұл жаңа қатысушы үшін құпия сөз <em> [[Special:ChangePassword|құпия сөзді өзгерту]]</em>  бетінде кіру үстінде өзгертілген.",
+       "accmailtitle": "Құпия сөз жіберілді.",
+       "accmailtext": "$2 дегенге [[User talk:$1|$1]] үшін құпия сөзі жөнелтілді. Оны <em>[[Special:ChangePassword|құпия сөзді өзгерту]]</em> бетінде жүйеге кірген кезде өзгеруге болады.",
        "newarticle": "(Жаңа)",
-       "newarticletext": "Сілтемеге еріп әлі басталмаған бетке келіпсіз.\nБетті бастау үшін, төменгі терезеде мәтініңізді теріңіз (көбірек ақпарат үшін [$1 анықтама бетін] қараңыз).\nЕгер жаңылғаннан осында келген болсаңыз, браузердің «артқа» деген батырмасын басыңыз.",
-       "anontalkpagetext": "----''Бұл тіркелгісіз (немесе тіркелгісін қолданбаған) қатысушы талқылау беті. Осы қатысушыны біз тек сандық IP мекенжайымен теңдестіреміз.\nОсындай IP мекенжай бірнеше қатысушыға ортақтастырылған болуы мүмкін.\nЕгер сіз тіркелгісіз қатысушы болсаңыз және сізге қатыссыз мәндемелер жіберілгенін сезсеңіз, басқа тіркелгісіз қатысушылармен араластырмауы үшін [[{{#special:Userlogin}}|тіркеліңіз не кіріңіз]].''",
+       "newarticletext": "Сілтеме бойынша әлі басталмаған бетке келіпсіз.\nБетті бастау үшін төменгі терезеде мәтінді теріңіз (көбірек ақпарат үшін [$1 анықтама бетін] қараңыз).\nЕгер жаңылғаннан осында келген болсаңыз браузеріңіздің <strong>артқа</strong> деген батырмасын басыңыз.",
+       "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}}}} Журналдардан бұл бетке қатысты сәйкес жазбаларды табу]</span>,\n* <span class=\"plainlinks\">'''[{{fullurl:{{FULLPAGENAME}}|action=edit}} Бұл бетті жаңадан бастау]'''</span>.",
-       "noarticletext-nopermission": "Ағымда бұл бетте еш мәтін жоқ.\nСіз [[Special:Search/{{PAGENAME}}|бұл бет атауын]] басқа беттерден іздей аласыз, немесе <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} журналдардан бұл бетке қатысты сәйкес жазбаларды таба аласыз]</span>. Ал бұл бетті жаңадан бастауға сізде рұқсат жоқ.",
-       "userpage-userdoesnotexist": "«<nowiki>$1</nowiki>» қатысушы тіркелгісі жазып алынбаған. Бұл бетті бастау/өңдеу талабыңызды тексеріп шығыңыз.",
+       "noarticletext-nopermission": "Қазіргі уақытта бұл бетте мәтін жоқ.\nСіз бұл бет атауын басқа беттерден [[Special:Search/{{PAGENAME}}|іздей аласыз]], немесе <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} қатысты журналдардан іздей аласыз]</span>. Ал бұл бетті жаңадан бастауға сізде рұқсат жоқ.",
+       "missing-revision": "#$1 нұсқалы «{{FULLPAGENAME}}» деп аталатын бет жоқ",
+       "userpage-userdoesnotexist": "«$1» қатысушы тіркелгісі жазылып алынбаған. \nБұл бетті бастау/өңдеу қалауыңызды тексеріп шығыңыз.",
        "userpage-userdoesnotexist-view": "«$1» қатысушы есімі тіркелмеген.",
-       "blocked-notice-logextract": "Бұл қатысушы қазіргі уақытта  бұғатталған.\nТөменде бұғаттау журналындағы соңғы жазбалар көрсетілген.",
+       "blocked-notice-logextract": "Бұл қатысушы қазіргі уақытта  бұғатталған.\nТөменде бұғаттау журналындағы соңғы жазбасы көрсетілген:",
        "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": "'''Кеңес:''' Жаңа CSS файлын сақтау алдында «Қарап шығу» батырмасын қолданып сынақтаңыз.",
-       "userjsyoucanpreview": "<strong>Ð\90Ò\9bÑ\8bл-кеңеÑ\81:</strong> Ð\96аңа JavaScript Ñ\84айлÑ\8bÒ£Ñ\8bздÑ\8b Ñ\81аÒ\9bÑ\82аÑ\83 Ð°Ð»Ð´Ñ\8bнда \"{{int:showpreview}}\" батырмасын қолданып сынақтаңыз.",
+       "usercssyoucanpreview": "<strong>Кеңес:</strong> Жаңа CSS файлыңызды сақтау алдында «{{int:showpreview}}» батырмасын қолданып сынақтаңыз.",
+       "userjsyoucanpreview": "<strong>Ð\9aеңеÑ\81:</strong> Ð\96аңа JavaScript Ñ\84айлÑ\8bÒ£Ñ\8bздÑ\8b Ñ\81аÒ\9bÑ\82аÑ\83 Ð°Ð»Ð´Ñ\8bнда Â«{{int:showpreview}}» батырмасын қолданып сынақтаңыз.",
        "usercsspreview": "</strong>Бұл тек қатысушы CSS файлыңызды қарап шығу екенін ұмытпаңыз, ол әлі сақталған жоқ!</strong>",
-       "userjspreview": "'''Мынау JavaScript қатысушы бағдарламасын тексеру/қарап шығу екенін ұмытпаңыз, ол әлі сақталған жоқ!'''",
-       "sitecsspreview": "'''Мынау CSS қатысушы бағдарламасын тексеру/қарап шығу екенін ұмытпаңыз, ол әлі сақталған жоқ!'''",
-       "sitejspreview": "'''Мынау JavaScript кодын тексеру/қарап шығу екенін ұмытпаңыз, ол әлі сақталған жоқ!'''",
-       "userinvalidcssjstitle": "'''Ескерту:''' Осы арада «$1» деген еш мәнер жоқ.\nҚатысушының .css және .js файл атауы кіші әріпппен жазылу тиісті екенін ұмытпаңыз, мысалға {{ns:user}}:Foo/vector.css дегенді {{ns:user}}:Foo/Vector.css дегенмен салыстырып қараңыз.",
+       "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": "'''Ð\90Ò£Ò\93аÑ\80Ñ\82па:'''",
-       "previewnote": "Бұл тек '''қарап шығу''' екенін ұмытпаңыз, сіздің өзгертулеріңіз әлі сақталған жоқ!",
+       "note": "'''Ð\95Ñ\81кеÑ\80Ñ\82Ñ\83:'''",
+       "previewnote": "</strong>Бұл тек қарап шығу екенін ұмытпаңыз.</strong> \nӨзгертулеріңіз әлі сақталған жоқ!",
        "continue-editing": "Өңдеу аумағына өту",
        "previewconflict": "Бұл қарап шығу беті жоғарғы кірістіру орнындағы мәтінді қамтиды да және сақталғандағы өңді көрсетпек.",
-       "session_fail_preview": "'''Ғафу етіңіз! Сессия деректері жоғалуы салдарынан өңдемеңізді бітіре алмаймыз.\nҚайта байқап көріңіз. Егер бұл әлі істелмесе, шығуды және қайта кіруді байқап көріңіз.'''",
-       "session_fail_preview_html": "<strong>Кешіріңіз! Сессия деректері жоғалуы салдарынан өңдемеңізді бітіре алмаймыз.</strong>\n\n<em>{{SITENAME}} жобасында қам HTML қосылған, JavaScript шабуылдардан қорғану үшін алдын ала қарап шығу жасырылған.</em>\n\n<strong>Егер бұл өңдеме адал талап болса, қайта байқап көріңіз.</strong> Егер бұл әлі істемесе, [[Special:UserLogout|шығуды]] және қайта кіруді байқап көріңіз.'''",
-       "token_suffix_mismatch": "'''Өңдемеңіз тайдырылды, себебі тұтынғышыңыз өңдеме деректер бумасындағы тыныс белгілерін бүлдіртті.\nБет мәтіні бүлінбеу үшін өңдемеңіз тайдырылады.\nБұл кей уақытта қатесі толған веб-негізінде тіркелуі жоқ прокси-серверді пайдаланған болуы мүмкін.'''",
+       "session_fail_preview": "<strong>Кешіріңіз! Сессия деректері жоғалуы салдарынан өңдемеңізді бітіре алмаймыз.</strong>\nҚайта байқап көріңіз. \nЕгер бұл әлі істелмесе [[Special:UserLogout|шығуды]] және қайта кіруді байқап көріңіз.",
+       "session_fail_preview_html": "<strong>Кешіріңіз! Сессия деректері жоғалуы салдарынан өңдемеңізді бітіре алмаймыз.</strong>\n\n<em>Сондықтан {{SITENAME}} жобасында қам HTML қосылған, JavaScript шабуылдардан қорғану үшін алдын ала қарап шығу жасырылған.</em>\n\n<strong>Егер бұл өңдеме адал ниетті әрекет болса қайта байқап көріңіз.</strong> \nЕгер бұл әлі істемесе [[Special:UserLogout|шығуды]] және қайта кіруді байқап көріңіз.",
+       "token_suffix_mismatch": "<strong>Өңдемеңіз тайдырылды, себебі тұтынғышыңыз өңдеме деректер бумасындағы тыныс белгілерін бүлдіртті.\nБет мәтіні бүлінбеу үшін өңдемеңіз тайдырылады.</strong>\nБұл кей уақытта қатесі толған веб-негізінде тіркелуі жоқ прокси-серверді пайдаланған болуы мүмкін.",
        "editing": "Өңделуде: $1",
        "creating": "Жаңадан бастау: $1",
        "editingsection": "Өңделуде: $1 (бөлімі)",
        "editingcomment": "Өңделуде: $1 (жаңа бөлім)",
        "editconflict": "Өңдемелер қақтығысы: $1",
-       "explainconflict": "Ð\9eÑ\81Ñ\8b Ð±ÐµÑ\82Ñ\82Ñ\96 Ñ\81Ñ\96з Ó©Ò£Ð´ÐµÐ¹ Ð±Ð°Ñ\81Ñ\82аÒ\93анда Ð±Ð°Ñ\81Ò\9bа Ð±Ñ\96Ñ\80еÑ\83 Ð±ÐµÑ\82Ñ\82Ñ\96 Ó©Ð·Ð³ÐµÑ\80Ñ\82кен.\nÐ\96оÒ\93аÑ\80Ò\93Ñ\8b ÐºÑ\96Ñ\80Ñ\96Ñ\81Ñ\82Ñ\96Ñ\80Ñ\83 Ð¾Ñ\80нÑ\8bнда Ð±ÐµÑ\82Ñ\82Ñ\96Ò£ Ð°Ò\93Ñ\8bмдÑ\8bÒ\9b Ð¼Ó\99Ñ\82Ñ\96нÑ\96 Ð±Ð°Ñ\80.\nТөменгÑ\96 ÐºÑ\96Ñ\80Ñ\96Ñ\81Ñ\82Ñ\96Ñ\80Ñ\83 Ð¾Ñ\80нÑ\8bнда Ñ\81Ñ\96з Ó©Ð·Ð³ÐµÑ\80Ñ\82кен Ð¼Ó\99Ñ\82Ñ\96нÑ\96 ÐºÓ©Ñ\80Ñ\81еÑ\82Ñ\96ледÑ\96.\nӨзгеÑ\80Ñ\82Ñ\83Ñ\96Ò£Ñ\96здÑ\96 Ð°Ò\93Ñ\8bмдÑ\8bÒ\9b Ð¼Ó\99Ñ\82Ñ\96нге Ò¯Ñ\81Ñ\82еÑ\83Ñ\96Ò£Ñ\96з Ð¶Ó©Ð½.\n\"{{int:savearticle}}\" Ð±Ð°Ñ\82Ñ\8bÑ\80маÑ\81Ñ\8bн Ð±Ð°Ñ\81Ò\9bанда '''Ñ\82ек''' Ð¶Ð¾Ò\93аÑ\80Ò\93Ñ\8b ÐºÑ\96Ñ\80Ñ\96Ñ\81Ñ\82Ñ\96Ñ\80Ñ\83 Ð¾Ñ\80нÑ\8bндаÒ\93Ñ\8b Ð¼Ó\99Ñ\82Ñ\96н сақталады.",
+       "explainconflict": "Ð\9eÑ\81Ñ\8b Ð±ÐµÑ\82Ñ\82Ñ\96 Ñ\81Ñ\96з Ó©Ò£Ð´ÐµÐ¹ Ð±Ð°Ñ\81Ñ\82аÒ\93анда Ð±Ð°Ñ\81Ò\9bа Ð±Ñ\96Ñ\80еÑ\83 Ð±ÐµÑ\82Ñ\82Ñ\96 Ó©Ð·Ð³ÐµÑ\80Ñ\82кен.\nÐ\96оÒ\93аÑ\80Ò\93Ñ\8b Ð¼Ó\99Ñ\82Ñ\96н Ð°Ñ\83маÒ\93Ñ\8bнда Ò\9bазÑ\96Ñ\80гÑ\96 Ñ\83аÒ\9bÑ\8bÑ\82Ñ\82а Ð±Ð°Ñ\80 Ð±ÐµÑ\82 Ð¼Ó\99Ñ\82Ñ\96нÑ\96нен Ñ\82Ò±Ñ\80адÑ\8b.\nТөменгÑ\96 Ð¼Ó\99Ñ\82Ñ\96н Ð°Ñ\83маÒ\93Ñ\8bнда Ñ\81Ñ\96здÑ\96Ò£ Ó©Ð·Ð³ÐµÑ\80Ñ\82Ñ\83леÑ\80Ñ\96Ò£Ñ\96з ÐºÓ©Ñ\80Ñ\81еÑ\82Ñ\96ледÑ\96.\nӨзгеÑ\80Ñ\82Ñ\83Ñ\96Ò£Ñ\96здÑ\96 Ð±Ð°Ñ\80 Ð¼Ó\99Ñ\82Ñ\96нге Ð±Ñ\96Ñ\80Ñ\96кÑ\82Ñ\96Ñ\80Ñ\83ге Ñ\82Ñ\83Ñ\80а ÐºÐµÐ»ÐµÐ´Ñ\96.\n«{{int:savearticle}}» Ð±Ð°Ñ\82Ñ\8bÑ\80маÑ\81Ñ\8bн Ð±Ð°Ñ\81Ò\9bанда </strong>Ñ\82ек</strong> Ð¶Ð¾Ò\93аÑ\80Ò\93Ñ\8b Ð¼Ó\99Ñ\82Ñ\96н Ð°Ñ\83маÒ\93Ñ\8b сақталады.",
        "yourtext": "Мәтініңіз",
        "storedversion": "Сақталған нұсқасы",
-       "nonunicodebrowser": "'''ЕСКЕРТУ: Шолғышыңыз Unicode белгілеуіне үйлесімді емес, сондықтан латын емес әріптері бар беттерді өңдеу зіл болу мүмкін.\nЖұмыс істеуге ықтималдық беру үшін, төмендегі кірістіру орнында ASCII емес таңбалар оналтылық кодымен көрсетіледі'''.",
-       "editingold": "'''ЕСКЕТУ: Осы беттің ертерек түзетуін өңдеп жатырсыз.'''\nБұны сақтасаңыз, осы түзетуден кейінгі барлық өзгерістер жойылады.",
-       "yourdiff": "Айырмалар",
+       "nonunicodebrowser": "<strong>Ескерту: Шолғышыңыз Unicode белгілеуіне үйлесімді емес</strong>\nЖұмыс істеуге ықтималдық беру үшін, төмендегі кірістіру орнында ASCII емес таңбалар оналтылық кодымен көрсетіледі.",
+       "editingold": "<strong>Ескерту: Осы беттің ертерек түзетуін өңдеп жатырсыз.</strong>\nБұны сақтасаңыз осы түзетуден кейінгі барлық өзгерістер жоғалады.",
+       "yourdiff": "Айырмашылықтар",
        "copyrightwarning": "Аңғартпа: {{SITENAME}} жобасына берілген барлық үлестер $2 (көбірек ақпарат үшін: $1) құжатына сай деп саналады.\nЕгер жазуыңыздың еркін өңделуін және ақысыз көпшілікке таратуын қаламасаңыз, мында жарияламауыңыз жөн.<br />\nТағы да, бұл мағлұмат өзіңіз жазғаныңызға, не қоғам қазынасынан немесе сондай ашық қорлардан көшірілгеніне бізге уәде бересіз.\n'''АВТОРЛЫҚ ҚҰҚЫҚПЕН ҚОРҒАУҒАН МАҒЛҰМАТТЫ РҰҚСАТСЫЗ ЖАРИЯЛАМАҢЫЗ!'''",
        "copyrightwarning2": "Аңғартпа: {{SITENAME}} жобасына берілген барлық үлестерді басқа үлескерлер өңдеуге, өзгертуге, не аластауға мүмкін.\nЕгер жазуыңыздың еркін өңделуін қаламасаңыз, мында жарияламауыңыз жөн.<br />\nТағы да, бұл мағлұмат өзіңіз жазғаныңызға, не қоғам қазынасынан немесе сондай ашық қорлардан көшірілгеніне бізге уәде бересіз (көбірек ақпарат үшін $1 қужатын қараңыз).\n'''АВТОРЛЫҚ ҚҰҚЫҚПЕН ҚОРҒАУҒАН МАҒЛҰМАТТЫ РҰҚСАТСЫЗ ЖАРИЯЛАМАҢЫЗ!'''",
-       "longpageerror": "'''ҚАТЕЛІК: Сақтамақ мәтініңіздін мөлшері {{PLURAL:$1|килобайт|$1 килобайт}}, ең көбі {{PLURAL:$2|килобайт|$2 килобайт}} рұқсат етілген мөлшерінен асқан.\nБұл сақталмайды.'''",
+       "longpageerror": "<strong>ҚАТЕЛІК: Сақтамақшы болған мәтініңіздің көлемі {{PLURAL:$1|килобайт|$1 килобайт}}, ең көбі {{PLURAL:$2|килобайт|$2 килобайт}} рұқсат етілген көлемінен асқан.</strong>\nБұл сақталмайды.",
        "readonlywarning": "'''ЕСКЕТУ: Дерекқор баптау үшін құлыпталған, сондықтан дәл қазір өңдемеңізді сақтай алмайсыз.\nКейін қолдану үшін мәтінді қойып алып және қойып, мәтін файлына сақтауңызға болады.''' \nӘкімшінің құлыптау себебі келесідей: $1",
-       "protectedpagewarning": "'''Ескерту: Бұл бет өңдеуден қорғалған. Тек әкімші құқықтары бар қатысушылар ғана өңдей алады.'''\nТөменде бет журналының соңғы жазбасы көрсетілген:",
-       "semiprotectedpagewarning": "'''Аңғартпа:''' Бет жартылай қорғалған, сондықтан осыны тек тіркелген қатысушылар өңдей алады.\nТөменде бет журналының соңғы жазбасы көрсетілген:",
+       "protectedpagewarning": "<strong>Ескерту: Бұл бет өңдеуден қорғалған. Тек әкімші құқықтары бар қатысушылар ғана өңдей алады.</strong>\nТөменде бет журналының соңғы жазбасы көрсетілген:",
+       "semiprotectedpagewarning": "<strong>Ескерту:</strong> Бет жартылай қорғалған, сондықтан осыны тек тіркелген қатысушылар өңдей алады.\nТөменде бет журналының соңғы жазбасы көрсетілген:",
        "cascadeprotectedwarning": "<strong>Ескерту:</strong>  Бұл бет қорғалған, енді тек әкімші құқықтары бар қатысушылар ғана бұны өңдей алады, себебі бұл келесі «баулы қорғауы» бар {{PLURAL:$1|бетіне|беттеріне}} кірістілген бет:",
        "titleprotectedwarning": "'''Ескерту: Бұл бет атауы бастаудан қорғалған, сондықтан [[Special:ListGroupRights|арнайы құқықтары]] бар қатысушылар бұндай атаумен бетті бастай алады.'''\nТөменде бет журналының соңғы жазбасы көрсетілген:",
        "templatesused": "Бұл бетте қолданылған {{PLURAL:$1|үлгі|үлгілер}}:",
        "edit-gone-missing": "Бетті жаңарту мүмкін емес.\nМүмкін, бұл бет жойылған.",
        "edit-conflict": "Өңдемелер қақтығысы.",
        "edit-no-change": "Өңдемеңіз мәтінге өзгеріс жасамағандықтан еленілмеді.",
-       "postedit-confirmation": "Өңдемеңіз сақталды.",
+       "postedit-confirmation-saved": "Өңдемеңіз сақталды.",
        "edit-already-exists": "Жаңа бет жасау мүмкін емес.\nОл әлдеқашан бар.",
        "defaultmessagetext": "Әдепкі мәтіні",
        "invalid-content-data": "Жарамсыз дерек мазмұны",
        "expensive-parserfunction-category": "Шығыс алатын құрылым талдатқыш жетелерінің тым көп шақырымы бар беттер",
        "post-expand-template-inclusion-warning": "Ескерту: Үлгі кірістіру өлшемі тым үлкен.\nКейбір үлгілер кірістірілмейді.",
        "post-expand-template-inclusion-category": "Үлгі кірістірілген беттер өлшемі асып кетті",
-       "post-expand-template-argument-warning": "Ескерту: Бұл бетте тым көп ұлғайтылған мөлшері болған ең кемінде бір үлгі дәлелі бар.\nБұның дәлелдерін қалдырып кеткен.",
+       "post-expand-template-argument-warning": "<strong>Ескерту:</strong> Бұл бетте тым көп ұлғайтылған өлшемі болған ең кемінде бір үлгі дәлелі бар.\nБұның дәлелдерін қалдырып кеткен.",
        "post-expand-template-argument-category": "Үлгі дәлелдерін қалдырып кеткен беттер",
        "undo-success": "Бұл өңдеме жоққа шығарылуы мүмкін. Талабыңызды құптап алдын ала төмендегі салыстыруды тексеріп шығыңыз да, өңдемені жоққа шығаруын бітіру үшін төмендегі өзгерістерді сақтаңыз.",
        "undo-failure": "Бұл өңдеме жоққа шығарылмайды, себебі арада қақтығысты өңдемелер бар.",
        "undo-norev": "Бұл өңдеме жоққа шығарылмайды, себебі бұл жоқ немесе жойылған.",
-       "undo-nochange": "Өңдеме әлдеқашан жоққа шығарылғаны анықталыды.",
+       "undo-nochange": "Өңдеме әлдеқашан жоққа шығарылғаны анықталды.",
        "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|т]]) істеген нөмір $1 түзетуін [[Project:Жоққа шығару|жоққа шығарды]]",
        "undo-summary-username-hidden": "$1 нұсқасын жасырылған қатысушы жоққа шығарды",
        "cantcreateaccounttitle": "Жаңа тіркелгі жасалмады",
        "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-delundel": "көÑ\80Ñ\81еÑ\82/жаÑ\81Ñ\8bÑ\80",
+       "rev-delundel": "көÑ\80Ñ\96нÑ\96Ñ\81Ñ\96н Ó©Ð·Ð³ÐµÑ\80Ñ\82Ñ\83",
        "rev-showdeleted": "көрсету",
        "revisiondelete": "Түзетулерді жою/жоюды болдырмау",
        "revdelete-nooldid-title": "Нысана түзету жарамсыз",
        "revertmerge": "Біріктіруді болдырмау",
        "mergelogpagetext": "Төменде бір беттің тарихы өзге бетке біріктіру ең соңғы тізімі келтіріледі.",
        "history-title": "«$1» дегеннің өңдеу тарихы",
-       "difference-title": "Нұсқалар арасындағы айырмашылық: <<$1>>",
+       "difference-title": "$1 — нұсқалар арасындағы айырмашылық",
        "difference-title-multipage": "\"$1\" және \"$2\" беттерінің арасындағы айырмашылық",
        "difference-multipage": "(Беттер арасындағы айырмашылық)",
        "lineno": "Жол нөмірі $1:",
        "searchresults": "Іздеу нәтижелері",
        "searchresults-title": "\"$1\" сұранымына табылған нәтижелер",
        "toomanymatches": "Тым көп сәйкес қайтарылды, өзге сұранымды байқап көріңіз",
-       "titlematches": "Бет тақырыбын аты сәйкес келеді",
+       "titlematches": "Бет атауы сәйкес келеді",
        "textmatches": "Бет мәтіні сәйкес келеді",
        "notextmatches": "Еш бет мәтіні сәйкес емес",
        "prevn": "алдыңғы {{PLURAL:$1|$1}}",
        "shown-title": "Осы бетте {{PLURAL:$1|жазба}} көрсету.",
        "viewprevnext": "Көрсетілуі: ($1 {{int:pipe-separator}} $2) ($3) жазба",
        "searchmenu-exists": "'''Бұл жобада «[[:$1]]» деген бет бар.'''",
-       "searchmenu-new": "<strong>\"[[:$1]]\" осындай атпен бұл уикиде бетті бастау</strong> {{PLURAL:$2|0=|Тағы қараңыз: іздеіңіз бойынша табылған беттер.|Тағы қараңыз: Табылған іздеу нәтижелері.}}",
+       "searchmenu-new": "<strong>«[[:$1]]» осындай атпен бұл уикиде бетті бастау!</strong> {{PLURAL:$2|0=|Іздегеніңіз бойынша табылған беттер:|Табылған іздеу нәтижелері:}}",
        "searchprofile-articles": "Негізгі беттер",
-       "searchprofile-project": "Анықтама және жоба беттері",
        "searchprofile-images": "Мультимедиа",
        "searchprofile-everything": "Барлық жерде",
        "searchprofile-advanced": "Кеңейтілген",
        "searchprofile-articles-tooltip": "$1 іздеу",
-       "searchprofile-project-tooltip": "$1 іздеу",
        "searchprofile-images-tooltip": "Файлдарды іздеу",
        "searchprofile-everything-tooltip": "Барлық беттерден іздеу (талқылау беттерін қоса)",
        "searchprofile-advanced-tooltip": "Әдепкі есім кеңістігінен іздеу",
        "searchall": "барлық",
        "showingresults": "Төменде нөмір '''$2''' орнынан бастап барынша '''$1''' нәтиже көрсетіледі.",
        "showingresultsnum": "Төменде нөмір '''$2''' орнынан бастап '''$3''' нәтиже көрсетіледі.",
-       "showingresultsheader": "«'''$4'''» үшін {{PLURAL:$5|тек '''$1''' нәтиже табылды|табылған '''$3''' нәтиженің '''$1—$2''' аралығы көрсетілген}}",
+       "showingresultsheader": "«<strong>$4</strong>» сұранысына {{PLURAL:$5|тек <strong>$1</strong> нәтиже табылды|табылған <strong>$3</strong> нәтиженің <strong>$1 - $2</strong> аралығы көрсетілген}}",
        "search-nonefound": "Сұрауға сәйкес нәтижелер табылмады.",
        "powersearch-legend": "Кеңейтілген іздеу",
        "powersearch-ns": "Атау кеңістіктері бойынша іздеу:",
-       "powersearch-redir": "Бағыттауларды тізімдеу",
        "powersearch-togglelabel": "Белгілеу:",
        "powersearch-toggleall": "Барлығы",
        "powersearch-togglenone": "Ешқандай",
        "prefs-emailconfirm-label": "Е-поштаның расталуы:",
        "youremail": "Е-поштаңыз:",
        "username": "{{GENDER:$1|Қатысушы атыңыз}}:",
-       "uid": "{{GENDER:$1|Қатысушы}} теңдестіргішіңіз (ID):",
        "prefs-memberingroups": "{{GENDER:$2|Мүше}}  {{PLURAL:$1|тобыңыз|топтарыңыз}}:",
        "prefs-registration": "Тіркелген уақытыңыз:",
        "yourrealname": "Нақты атыңыз:",
        "prefs-advancedsearchoptions": "Кеңейтілген баптаулар",
        "prefs-advancedwatchlist": "Кеңейтілген баптаулар",
        "prefs-displayrc": "Көрсету бапталымдары",
-       "prefs-displaysearchoptions": "Көрсету бапталымдары",
        "prefs-displaywatchlist": "Көрсету бапталымдары",
        "prefs-diffs": "Айырмашылықтар",
        "prefs-help-prefershttps": "Бұл баптауды келесі кіргеніңізде әсерін көре аласыз.",
        "enhancedrc-history": "Тарихы",
        "recentchanges": "Жуықтағы өзгерістер",
        "recentchanges-legend": "Жуықтағы өзгерістер баптаулары",
-       "recentchanges-summary": "Ð\91ұл Ð±ÐµÑ\82Ñ\82е Ð¾Ñ\81Ñ\8b Ñ\83икидегÑ\96 Ð±Ð¾Ð»Ò\93ан Ð¶Ñ\83Ñ\8bÒ\9bÑ\82аÒ\93Ñ\8b Ó©Ð·Ð³ÐµÑ\80Ñ\96Ñ\81Ñ\82еÑ\80 Ð±Ð°Ð¹Ò\9bаладÑ\8b.",
+       "recentchanges-summary": "Төменде {{SITENAME}} Ð±ÐµÑ\82Ñ\82еÑ\80Ñ\96ндегÑ\96 Ð¶Ñ\83Ñ\8bÒ\9bÑ\82аÒ\93Ñ\8b Ó©Ð·Ð³ÐµÑ\80Ñ\96Ñ\81Ñ\82еÑ\80 Ñ\85Ñ\80онологиÑ\8fлÑ\8bÒ\9b Ñ\80еÑ\82пен ÐºÓ©Ñ\80Ñ\81еÑ\82Ñ\96ледÑ\96.",
        "recentchanges-noresult": "Бұл талап бойынша көрсетілген уақыттан бері өзгерістер болған жоқ.",
        "recentchanges-feed-description": "Бұл арнаменен уикидегі ең соңғы өзгерістер қадағаланады.",
        "recentchanges-label-newpage": "Жаңа беттер",
        "recentchanges-label-minor": "Бұл шағын өңдеме",
        "recentchanges-label-bot": "Бұл өңдемені бот жасады.",
        "recentchanges-label-unpatrolled": "Бұл өңдеме әлі тексеруден өтпеді.",
-       "recentchanges-label-plusminus": "Байт бойынша беттің өзгеріс мөлшері",
+       "recentchanges-label-plusminus": "Байт бойынша беттің өзгеріс өлшемі",
        "recentchanges-legend-heading": "'''Шартты белгілер:'''",
        "recentchanges-legend-newpage": "(қ: [[Special:NewPages|бөлек бетте]])",
-       "recentchanges-legend-plusminus": "(''±123'')",
+       "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "rcnotefrom": "Төменде <strong>$2</strong> кезінен бергі (<strong>$1</strong> өңдемеге дейін) өзгерістер көрсетіледі.",
-       "rclistfrom": "$1 кезінен бергі жаңа өзгерістерді көрсет.",
+       "rclistfrom": "$2, $3 кезінен бергі жаңа өзгерістерді көрсет.",
        "rcshowhideminor": "Шағын өңдемелерді $1",
        "rcshowhideminor-show": "көрсету",
        "rcshowhideminor-hide": "жасыру",
        "rcshowhidemine": "Өңдемелерімді $1",
        "rcshowhidemine-show": "көрсету",
        "rcshowhidemine-hide": "жасыру",
-       "rclinks": "Соңғы $2 күнде болған, соңғы $1 өзгерісті көрсет<br />$3",
+       "rclinks": "Соңғы $2 күнде болған соңғы $1 өзгерісті көрсет<br />$3",
        "diff": "айырм",
        "hist": "тарихы",
        "hide": "жасыру",
        "upload_directory_read_only": "Жүктеу қалтасына ($1) веб-сервер жаза алмайды.",
        "uploaderror": "Жүктеу қатесі",
        "upload-recreate-warning": "'''Ескету: Бұл атаумен файл жойылған немесе жылжытылған'''\n\nThe deletion and move log for this page are provided here for convenience:",
-       "uploadtext": "ТөмендегÑ\96 Ð¿Ñ\96Ñ\88Ñ\96ндÑ\96 Ñ\84айлдаÑ\80дÑ\8b Ð¶Ò¯ÐºÑ\82еÑ\83 Ò¯Ñ\88Ñ\96н Ò\9bолданÑ\8bÒ£Ñ\8bз.\nÐ\90лдÑ\8bнда Ð¶Ò¯ÐºÑ\82елген Ñ\84айлдаÑ\80дÑ\8b Ò\9bаÑ\80аÑ\83 Ð½Ðµ Ñ\96здеÑ\83 Ò¯Ñ\88Ñ\96н [[Special:FileList|жүкÑ\82елген Ñ\84айлдаÑ\80 Ñ\82Ñ\96зÑ\96мÑ\96не]] Ð±Ð°Ñ\80Ñ\8bÒ£Ñ\8bз. Ð¡Ð¾Ð½Ð´Ð°Ð¹-аÒ\9b Ñ\84айлдаÑ\80дÑ\8bÒ£ Ð¶Ò¯ÐºÑ\82елÑ\83Ñ\96 [[Special:Log/upload|жүкÑ\82елÑ\96 Ð¶Ñ\83Ñ\80налÑ\8bна]], Ð°Ð» Ð¶Ð¾Ð¹Ñ\8bлÒ\93ан Ñ\84айлдаÑ\80 [[Special:Log/delete|жойÑ\8bлÑ\83 Ð¶Ñ\83Ñ\80налÑ\8bна]] Ð¶Ð°Ð·Ñ\8bладÑ\8b.\n\nСÑ\83Ñ\80еÑ\82Ñ\82Ñ\96 Ð¼Ð°Ò\9bалаÒ\93а Ò\9bоÑ\81Ñ\83 Ò¯Ñ\88Ñ\96н ÐºÐµÐ»ÐµÑ\81Ñ\96 Ñ\82Ó\99Ñ\81Ñ\96лдеÑ\80дÑ\96 Ò\9bолданÑ\8bÒ£Ñ\8bз:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' Ñ\84айлдÑ\8bÒ£ Ñ\82олÑ\8bÒ\9b Ð½Ò±Ñ\81Ò\9bаÑ\81Ñ\8bн Ð¾Ñ\80наÑ\82Ñ\83 Ò¯Ñ\88Ñ\96н;\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|Ñ\81Ñ\83Ñ\80еÑ\82 Ñ\82аÒ\9bÑ\8bÑ\80Ñ\8bбÑ\8b]]</nowiki></code>''' 200px ÐºÑ\96Ñ\88Ñ\96Ñ\80ейÑ\82Ñ\96лген Ñ\84айлдÑ\8b Ñ\82аÒ\9bÑ\8bÑ\80Ñ\8bбÑ\8bн Ò\9bоÑ\81Ñ\8bп Ñ\81ол Ð¶Ð°Ò\9bÒ\9bа Ð¾Ñ\80налаÑ\81Ñ\82Ñ\8bÑ\80Ñ\83;\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' Ñ\82ек Ñ\84айлÒ\93а Ñ\81Ñ\96лÑ\82еме Ð¶Ð°Ñ\81аÑ\83 Ò¯Ñ\88Ñ\96н.",
+       "uploadtext": "ТөмендегÑ\96 Ð¿Ñ\96Ñ\88Ñ\96ндÑ\96 Ñ\84айлдаÑ\80дÑ\8b Ð¶Ò¯ÐºÑ\82еÑ\83 Ò¯Ñ\88Ñ\96н Ò\9bолданÑ\8bÒ£Ñ\8bз.\nÐ\90лдÑ\8bнда Ð¶Ò¯ÐºÑ\82елген Ñ\84айлдаÑ\80дÑ\8b Ò\9bаÑ\80аÑ\83 Ð½Ðµ Ñ\96здеÑ\83 Ò¯Ñ\88Ñ\96н [[Special:FileList|жүкÑ\82елген Ñ\84айлдаÑ\80 Ñ\82Ñ\96зÑ\96мÑ\96не]] Ð±Ð°Ñ\80Ñ\8bÒ£Ñ\8bз. Ð¡Ð¾Ð½Ð´Ð°Ð¹-аÒ\9b Ñ\84айлдаÑ\80дÑ\8bÒ£ Ð¶Ò¯ÐºÑ\82елÑ\83Ñ\96 [[Special:Log/upload|жүкÑ\82елÑ\83 Ð¶Ñ\83Ñ\80налÑ\8bна]], Ð°Ð» Ð¶Ð¾Ð¹Ñ\8bлÒ\93ан Ñ\84айлдаÑ\80 [[Special:Log/delete|жойÑ\8bлÑ\83 Ð¶Ñ\83Ñ\80налÑ\8bна]] Ð¶Ð°Ð·Ñ\8bладÑ\8b.\n\nФайлдÑ\8b Ð¼Ð°Ò\9bалаÒ\93а Ò\9bоÑ\81Ñ\83 Ò¯Ñ\88Ñ\96н ÐºÐµÐ»ÐµÑ\81Ñ\96 Ñ\82Ó\99Ñ\81Ñ\96лдеÑ\80дÑ\96 Ò\9bолданÑ\8bÒ£Ñ\8bз:\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code></strong> Ñ\84айлдÑ\8bÒ£ Ñ\82олÑ\8bÒ\9b Ð½Ò±Ñ\81Ò\9bаÑ\81Ñ\8bн Ð¾Ñ\80наÑ\82Ñ\83 Ò¯Ñ\88Ñ\96н;\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|Ñ\81Ñ\83Ñ\80еÑ\82 Ñ\82аÒ\9bÑ\8bÑ\80Ñ\8bбÑ\8b]]</nowiki></code></strong> 200px ÐºÑ\96Ñ\88Ñ\96Ñ\80ейÑ\82Ñ\96лген Ñ\84айлдÑ\8b Â«Ñ\84айл Ñ\82аÒ\9bÑ\8bÑ\80Ñ\8bбÑ\8b» Ñ\81ипаÑ\82Ñ\82амаÑ\81Ñ\8bн Ò\9bоÑ\81Ñ\8bп Ñ\81ол Ð¶Ð°Ò\9bÒ\9bа Ð¾Ñ\80налаÑ\81Ñ\82Ñ\8bÑ\80Ñ\83;\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code></strong> Ñ\84айл ÐºÓ©Ñ\80Ñ\81еÑ\82Ñ\96лÑ\83Ñ\96нÑ\81Ñ\96з Ñ\84айлÒ\93а Ñ\82Ñ\96келеÑ\83 Ñ\81Ñ\96лÑ\82еÑ\83 Ò¯Ñ\88Ñ\96н",
        "upload-permitted": "Рұқсат етілген файл түрлері: $1.",
        "upload-preferred": "Ұнамды файл түрлері $1.",
        "upload-prohibited": "Рұқсат етілмеген файл түрлері: $1.",
        "uploadlogpage": "Жүктеу журналы",
-       "uploadlogpagetext": "Төменде ең соңғы жүктелген файлдар тізімі.\nТағы көрнекі қарап шығу үшін [[Special:NewFiles|жаңа файлдар көрмесі]] дегенді қараңыз.",
+       "uploadlogpagetext": "Төменде ең соңғы жүктелген файлдар тізімі келтірілген.\nТағы көрнекі қарап шығу үшін [[Special:NewFiles|жаңа файлдар көрмесін]] қараңыз.",
        "filename": "Файл атауы",
        "filedesc": "Түйіндемесі",
        "fileuploadsummary": "Файл сипаттамасы:",
        "illegal-filename": "Файл атауы рұқсат етілген.",
        "overwrite": "Бар файлдың үстінен жазу рұқсат етілмейді",
        "unknown-error": "Белгісіз қателік орын алды.",
-       "large-file": "ФайлдÑ\8bÒ£ $1 Ð¼Ó©Ð»Ñ\88еÑ\80Ñ\96нен Ð°Ñ\81паÑ\83Ñ\8bна ÐºÐµÐ¿Ñ\96лдеме Ð±ÐµÑ\80Ñ\96ледÑ\96;\nбұл Ñ\84айл Ð¼Ó©Ð»Ñ\88еÑ\80і — $2.",
-       "largefileserver": "Осы файлдың мөлшері сервердің қалауынан асып кеткен.",
+       "large-file": "Ð\91ұл Ñ\84айлдÑ\8bÒ£ $1 Ó©Ð»Ñ\88емÑ\96нен Ð°Ñ\81паÑ\83Ñ\8b Ò±Ñ\81Ñ\8bнÑ\8bладÑ\8b;\nбұл Ñ\84айл Ó©Ð»Ñ\88емі — $2.",
+       "largefileserver": "Осы файлдың өлшемі сервердің қалауынан асып кеткен.",
        "emptyfile": "Қотарып берілген файлыңыз бос сияқты. Файл атауы қате жазылған мүмкін.\nБұл файлды қотарып беруі нақты талабыңыз екенін тексеріп шығыңыз.",
        "windows-nonascii-filename": "Бұл уики файл атауларында арнайы таңбаларды қолдамайды.",
        "fileexists": "Осылай аталған файл әлдеқашан бар, егер бұны өзгертуге сеніміңіз жоқ болса <strong>[[:$1]]</strong> дегенді тексеріп шығыңыз.\n[[$1|thumb]]",
-       "filepageexists": "Бұл файлдың сипаттама беті алдақашан <strong>[[:$1]]</strong> дегенде жасалған, бірақ ағымда былай аталған еш файл жоқ.\nЕнгізген қысқаша мазмұндамаңыз сипаттамасы бетінде көрсетілмейді.\nҚысқаша мазмұндамаңыз осы арада көрсетілу үшін, бұны қолмен өңдемек болыңыз.\n[[$1|нобай]]",
+       "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": "Осы файл — мөлшері кішірітілген көшірмесі (нобай) сияқты. [[$1|thumb]]\nӨтініш, <strong>[[:$1]]</strong> деген файлды тексеріңіз.\nЕгер көрсетілген файл дәл сіз жүктейін деп жатқан файл болса, онда оның кішірейтілген көшірмесін қайта жүктеудің қажеті жоқ.",
-       "file-thumbnail-no": "Файл Ð°Ñ\82аÑ\83Ñ\8b <strong>$1</strong> Ð´ÐµÐ³ÐµÐ½Ð¼ÐµÐ½ Ð±Ð°Ñ\81Ñ\82аладÑ\8b.\nÐ\91ұл â\80\94 Ð¼Ó©Ð»Ñ\88еÑ\80Ñ\96 ÐºÑ\96Ñ\88Ñ\96Ñ\80Ñ\96Ñ\82Ñ\96лген Ñ\81Ñ\83Ñ\80еÑ\82 <em>(нобай)</em> Ñ\81иÑ\8fÒ\9bÑ\82Ñ\8b.\nÐ\95геÑ\80 бұл суреттің толық ажыратылымды нұсқасы болса оны жүктеңіз, әйтпесе файл атауын өзгертіңіз.",
-       "fileexists-forbidden": "Осылай аталған файл алдақашан бар;\nкері қайтыңыз да, осы файлды жаңа атымен жүктеп беріңіз. [[File:$1|нобай|center|$1]]",
-       "fileexists-shared-forbidden": "Осылай аталған файл ортаққорда алдақашан бар;\nкері қайтыңыз да, осы файлды жаңа атымен жүктеп беріңіз. [[File:$1|thumb|center|$1]]",
+       "fileexists-thumbnail-yes": "Осы файл көлемі кішірейтілген көшірмесі <em>(нобай)</em> сияқты. \n[[$1|thumb]]\nӨтініш, <strong>[[:$1]]</strong> деген файлды тексеріңіз.\nЕгер көрсетілген файл дәл сіз жүктейін деп жатқан файл болса, онда оның кішірейтілген көшірмесін қайта жүктеудің қажеті жоқ.",
+       "file-thumbnail-no": "Файл Ð°Ñ\82аÑ\83Ñ\8b <strong>$1</strong> Ð´ÐµÐ³ÐµÐ½Ð¼ÐµÐ½ Ð±Ð°Ñ\81Ñ\82аладÑ\8b.\nÐ\9eл Ó©Ð»Ñ\88емÑ\96 ÐºÑ\96Ñ\88Ñ\96Ñ\80ейÑ\82Ñ\96лген Ñ\81Ñ\83Ñ\80еÑ\82 <em>(нобай)</em> Ñ\81иÑ\8fÒ\9bÑ\82Ñ\8b.\nÐ\95геÑ\80 Ñ\81Ñ\96зде бұл суреттің толық ажыратылымды нұсқасы болса оны жүктеңіз, әйтпесе файл атауын өзгертіңіз.",
+       "fileexists-forbidden": "Осылай аталған файл әлдеқашан бар және үстінен жазылмайды.\nЕгер сіз өзіңіздің файлыңызды жүктегіңіз келсе кері қайтыңыз да жаңа атау қолданыңыз. \n[[File:$1|thumb|center|$1]]",
+       "fileexists-shared-forbidden": "Осылай аталған файл ортаққорда әлдеқашан бар.\nЕгер сіз файлыңызды жүктегіңіз келсе кері қайтыңыз және жаңа атау қолданыңыз. \n[[File:$1|thumb|center|$1]]",
        "file-exists-duplicate": "Бұл файл келесі {{PLURAL:$1|файлдың|файлдарының}} телнұсқасы:",
        "uploadwarning": "Жүктеу жөнінде құлақтандыру",
        "savefile": "Файлды сақтау",
        "sourcefilename": "Қайнар файл атауы:",
        "sourceurl": "Қайнардың URL-мекенжайы:",
        "destfilename": "Файл атауы:",
-       "upload-maxfilesize": "ФайлдÑ\8bÒ£ ÐµÒ£ ÐºÓ©Ð¿ Ð¼Ò¯Ð¼ÐºÑ\96н Ð¼Ó©Ð»Ñ\88еÑ\80і: $1",
+       "upload-maxfilesize": "Ð\96үкÑ\82еÑ\83ге Ð±Ð¾Ð»Ð°Ñ\82Ñ\8bн ÐµÒ£ Ò¯Ð»ÐºÐµÐ½ Ñ\84айл Ó©Ð»Ñ\88емі: $1",
        "upload-description": "Файл сипаттамасы",
        "upload-options": "Жүктеу баптаулары",
        "watchthisupload": "Осы файлды бақылау",
        "listfiles-latestversion-no": "Жоқ",
        "file-anchor-link": "Файл беті",
        "filehist": "Файл тарихы",
-       "filehist-help": "ФайлдÑ\8bÒ£ Ò\9bай Ñ\83аÒ\9bÑ\8bÑ\82Ñ\82а Ò\9bалай ÐºÓ©Ñ\80Ñ\96неÑ\82Ñ\96н Ò¯Ñ\88Ñ\96н Ð\9aүн-ай/УаÒ\9bÑ\8bÑ\82 дегенді нұқыңыз.",
-       "filehist-deleteall": "барлығын жой",
+       "filehist-help": "ФайлдÑ\8bÒ£ Ò\9bай Ñ\83аÒ\9bÑ\8bÑ\82Ñ\82а Ò\9bалай ÐºÓ©Ñ\80Ñ\96неÑ\82Ñ\96н Ò¯Ñ\88Ñ\96н ÐºÒ¯Ð½-айÑ\8b\83аÒ\9bÑ\8bÑ\82Ñ\8b дегенді нұқыңыз.",
+       "filehist-deleteall": "барлығын жою",
        "filehist-deleteone": "жой",
        "filehist-revert": "қайтар",
        "filehist-current": "ағымдағы",
        "filehist-filesize": "Файл өлшемі",
        "filehist-comment": "Пікір",
        "imagelinks": "Файл қолданылуы",
-       "linkstoimage": "Бұл файлға келесі {{PLURAL:$1|беттер|$1 бет}} сілтейді:",
+       "linkstoimage": "Бұл файлға келесі {{PLURAL:$1|бет|$1 бет}} сілтейді:",
+       "linkstoimage-more": "Бұл файлға $1 беттен көп {{PLURAL:$1|бет сілтейді|бет сілтейді}}.\nТөмендегі тізімде тек бұл файлға {{PLURAL:$1|бірінше бет сілтемесі|бірінші $1 бет сілтемелері}} көрсетілген.\nБет сілтемесінің [[Special:WhatLinksHere/$2|толық тізімін]] қараңыз.",
        "nolinkstoimage": "Бұл файлға еш бет сілтемейді.",
        "morelinkstoimage": "Бұл файлдың [[Special:WhatLinksHere/$1|көбірек сілтемелерін]] қарау.",
        "linkstoimage-redirect": "$1 (файл айдатылуы) $2",
        "booksources": "Кітап қайнарлары",
        "booksources-search-legend": "Кітап қайнарларын іздеу",
        "booksources-go": "Өту",
-       "booksources-text": "Төменде жаңа және қолданған кітаптар сататын тораптарының сілтемелері тізімделген. Бұл тораптарда ізделген кітаптар туралы былайғы ақпарат болуға мүмкін.",
+       "booksources-text": "Төменде жаңа және қолданған кітаптар сататын тораптарының сілтемелері тізімделген және ізделген кітаптар туралы қосымша ақпарат болуы мүмкін:",
        "specialloguserlabel": "Орындаушы:",
-       "speciallogtitlelabel": "Нысана (тақырып аты немесе қатысушы):",
+       "speciallogtitlelabel": "Нысана (атауы немесе қатысушы):",
        "log": "Журналдар",
        "all-logs-page": "Барлық журналдар",
        "alllogstext": "{{SITENAME}} жобасының барлық қатынаулы журналдарын біріктіріп көрсетуі.\nЖурнал түрін, қатысушы атын (үлкен кішілігін ескеріп), не тиісті бетін бөлектеп, тарылтып қарай аласыз (кейде үлкен кішілігін ескеріп).",
        "log-title-wildcard": "Мына мәтіннен басталытын тақырып аттарын іздеу",
        "showhideselectedlogentries": "Таңдалған журнал енгізілімдерін көрсету/жасыру",
        "allpages": "Барлық беттер",
-       "alphaindexline": "$1 дегеннен $2",
        "nextpage": "Келесі бетке ($1)",
        "prevpage": "Алдыңғы бетке ($1)",
        "allpagesfrom": "Мына беттерден бастап көрсету:",
        "listgrouprights-group": "Топ",
        "listgrouprights-rights": "Құқықтары",
        "listgrouprights-helppage": "Help:Топ құқықтары",
-       "listgrouprights-members": "(мүше тізімі)",
+       "listgrouprights-members": "(мүшелер тізімі)",
        "listgrouprights-addgroup": "{{PLURAL:$2|топты|топтарды}} қосу: $1",
        "listgrouprights-removegroup": "{{PLURAL:$2|топты|топтарды}} алып тастау: $1",
        "listgrouprights-addgroup-all": "Барлық топтарды қосу",
        "noemailtext": "Бұл қатысушы жарамды е-пошта мекенжайын келтірмеген.",
        "emailusername": "Қатысушы аты:",
        "emailusernamesubmit": "Жіберу",
-       "email-legend": "Басқа{{SITENAME}} қатысушысына хат жіберу",
+       "email-legend": "Басқа {{SITENAME}} қатысушысына хат жіберу",
        "emailfrom": "Кімнен:",
        "emailto": "Кімге:",
        "emailsubject": "Тақырыбы:",
        "watchlist-details": "Бақылау тізіміңізде {{PLURAL:$1|$1 бет|$1 бет}} бар (талқылау беттері жекелей саналмайды).",
        "wlheader-enotif": "Ескерту хат жіберуі қосылған.",
        "wlheader-showupdated": "Соңғы келіп-кетуіңізден бері өзгертілген беттер '''жуан''' қаріпімен көрсетіледі.",
-       "watchmethod-recent": "бақылаулы беттер үшін жуықтағы өзгерістерді тексеру",
-       "watchmethod-list": "жуықтағы өзгерістер үшін бақылаулы беттерді тексеру",
-       "watchlistcontains": "Бақылау тізіміңізде $1 бет бар.",
-       "iteminvalidname": "'$1' данада ақау бар — жарамсыз атау…",
        "wlnote2": "Төменде $2, $3 кезіне дейінгі соңғы {{PLURAL:$1|сағаттағы|<strong>$1</strong> сағаттағы}} өзгерістер көрсетілген.",
        "wlshowlast": "Соңғы $1 сағаттағы, $2 күндегі, $3 болған өзгерісті көрсету",
        "watchlist-options": "Бақылау тізімінің баптаулары",
        "changed": "өзгертті",
        "deletepage": "Бетті жою",
        "confirm": "Құптау",
-       "excontent": "болған мағлұматы: '$1'",
-       "excontentauthor": "болған мағлұматы (тек \"[[Special:Contributions/$2|$2]]\" үлесі): \"$1\"",
-       "exbeforeblank": "тазарту алдындағы болған мағлұматы: \"$1\"",
+       "excontent": "болған мағлұматы: $1",
+       "excontentauthor": "болған мағлұматы (тек «[[Special:Contributions/$2|$2]]» үлесі): $1",
+       "exbeforeblank": "тазарту алдындағы болған мағлұматы: $1",
        "delete-confirm": "«$1» дегенді жою",
        "delete-legend": "Жою",
        "historywarning": "'''Ескету:'' Жоюы көзделген бетте бет тарихында шамамен $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\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\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": "Жасырылған қатысушы өңдемелерінен {{GENDER:$1|[[User:$1|$1]]}} соңғы нұсқасына қайтарды",
        "sessionfailure": "Кіру сессиясында шатақ болған сияқты;\nсессияға шабуылдаудардан қорғану үшін, осы әрекет тоқтатылды.\n«Артқа» дегенді басыңыз, және бетті қайта жүктеңіз де, қайта байқап көріңіз.",
        "protectlogpage": "Қорғау журналы",
        "protectlogtext": "Төменде беттердің қорғау/қорғамау тізімі берілген.\nАғымдағы қорғау әректтер бар беттер үшін [[Special:ProtectedPages|қорғалған беттер тізімін]] қараңыз.",
-       "protectedarticle": "<<[[$1]]>> бетін қорғады",
-       "modifiedarticleprotection": "\"[[$1]]\" қорғалу деңгейін өзгертті",
-       "unprotectedarticle": "\"[[$1]]\" дегеннен қорғалуын жылжытты",
-       "movedarticleprotection": "қорғалу баптауларын \"[[$2]]\" дегеннен \"[[$1]]\" дегенге жылжытты",
+       "protectedarticle": "«[[$1]]» бетін қорғады",
+       "modifiedarticleprotection": "«[[$1]]» бетінің қорғалу деңгейін өзгертті",
+       "unprotectedarticle": "«[[$1]]» дегеннен қорғалуын жылжытты",
+       "movedarticleprotection": "қорғалу баптауларын «[[$2]]» дегеннен «[[$1]]» дегенге жылжытты",
        "protect-title": "«$1» қорғау деңгейін өзгерту",
        "protect-title-notallowed": "«$1» қорғалу деңгейін қарау",
        "prot_1movedto2": "[[$1]] дегенді [[$2]] дегенге жылжытты",
        "undelete-filename-mismatch": "$1 кезіндегі файл түзетуінің жоюы болдырмады: файл атауы сәйкессіз",
        "undelete-bad-store-key": "$1 кезіндегі файл түзетуінің жоюы болдырмады: жоюдың алдынан файл жоқ болған.",
        "undelete-cleanup-error": "«$1» пайдаланылмаған мұрағатталған файл жою қатесі.",
-       "undelete-missing-filearchive": "Мұрағатталған файл (нөмірі $1) қалпына келтіруі икемді емес, себебі ол дерекқорда жоқ.\nБұның жоюын болдырмауы алдақашан болғаны мүмкін.",
+       "undelete-missing-filearchive": "Мұрағатталған файл $1 нөмерлі ID-і қалпына келтіруі мүмкін емес, себебі ол дерекқорда жоқ.\nБұның жойылуы әлдақашан қалпына келтірілген болуы мүмкін.",
        "undelete-error-short": "Файл жоюын болдырмау қатесі: $1",
        "undelete-error-long": "Файл жоюын болдырмау кезінде мына қателер кездесті:\n\n$1",
        "undelete-show-file-submit": "Иә",
        "namespace": "Есім кеңістігі:",
        "invert": "Таңдалғанды жасыру",
-       "tooltip-invert": "Бұл құсбелгі қойсаңыз таңдалған есім кеңістігіндегі беттердегі өзгерістерді жасырады (және қатысты есем кеңістігі тексерліеді)",
+       "tooltip-invert": "Бұл белгіні қойсаңыз таңдалған есім кеңістігіндегі беттердегі өзгерістерді жасырады (және қатысты есем кеңістігі тексеріледі)",
        "namespace_association": "Қатысты есім аясы",
-       "tooltip-namespace_association": "Бұл құсбелгі қойсаңыз кейде таңдалған есім кеңістігіне қатысты талқылау немесе бастауыш есім кеңістігіндегі өзгерістер қосылып көрсетіледі",
+       "tooltip-namespace_association": "Бұл белгіні қойсаңыз кейде таңдалған есім кеңістігіне қатысты талқылау немесе бастауыш есім кеңістігіндегі өзгерістер қосылып көрсетіледі",
        "blanknamespace": "Негізгі беттерден",
        "contributions": "{{GENDER:$1|Қатысушы}} үлестері",
        "contributions-title": "$1 есімді қатысушының үлесі",
        "uctop": "(соңғы)",
        "month": "Мына айдан (және ертеректен):",
        "year": "Мына жылдан (және ертеректен):",
-       "sp-contributions-newbies": "Тек жаңа тіркелгіден жасаған үлестерді көрсет",
+       "sp-contributions-newbies": "Тек жаңа тіркелгіден жасаған үлестерді көрсету",
        "sp-contributions-newbies-sub": "Жаңа тіркелгендер үшін",
        "sp-contributions-newbies-title": "Жаңа тіркелгендер үшін қатысушы үлестері",
        "sp-contributions-blocklog": "бұғатталу журналы",
        "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": "Өңдемелердің тек соңғы нұсқаларын көрсету",
        "sp-contributions-newonly": "Бет бастау өңдемелерін ғана көрсету",
-       "sp-contributions-submit": "Ізде",
+       "sp-contributions-submit": "Іздеу",
        "whatlinkshere": "Мұнда сілтейтін беттер",
        "whatlinkshere-title": "$1 дегенге сілтейтін беттер",
        "whatlinkshere-page": "Бет:",
        "linkshere": "'''[[:$1]]''' дегенге мына беттер сілтейді:",
        "nolinkshere": "'''[[:$1]]''' дегенге еш бет сілтемейді.",
        "nolinkshere-ns": "Таңдалған есім кеңістігінде '''[[:$1]]''' дегенге ешқандай бет сілтемейді.",
-       "isredirect": "айдаÑ\82у беті",
+       "isredirect": "баÒ\93Ñ\8bÑ\82Ñ\82ау беті",
        "istemplate": "кірікбет",
        "isimage": "файл сілтемесі",
        "whatlinkshere-prev": "{{PLURAL:$1|алдыңғы|алдыңғы $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|келесі|келесі $1}}",
        "whatlinkshere-links": "← сілтемелер",
-       "whatlinkshere-hideredirs": "айдаÒ\93Ñ\8bÑ\88Ñ\82арды $1",
-       "whatlinkshere-hidetrans": "кірікбеттерді $1",
+       "whatlinkshere-hideredirs": "Ð\91аÒ\93Ñ\8bÑ\82Ñ\82аÑ\83Ñ\88Ñ\8bларды $1",
+       "whatlinkshere-hidetrans": "кіріcтірілген беттерді $1",
        "whatlinkshere-hidelinks": "сілтемелерді $1",
        "whatlinkshere-hideimages": "файл сілтемелерін $1",
        "whatlinkshere-filters": "Сүзгілер",
        "autoblockid": "#$1 өздікбұғаттауы",
        "block": "Қатысушыны бұғаттау",
-       "unblock": "Қатысушыны бұғаттамау",
+       "unblock": "Қатысушыны бұғаттауынан босату",
        "blockip": "Қатысушыны бұғаттау",
        "blockip-legend": "Қатысушыны бұғаттау",
-       "blockiptext": "Төмендегі пішін қатысушының жазу рұқсатын белгілі IP мекенжайынан не қатысушы есімінен бұғаттау үшін қолданылады.\nБұны тек бұзақылықты қақпайлау үшін және де [[{{MediaWiki:Policy-url}}|ережелер]] бойынша атқаруыңыз жөн.\nТөменде тиісті себебін көрсетіңіз (мысалы, дәйекке бұзақылықпен өзгерткен беттерді келтіріп).",
-       "ipadressorusername": "IP-мекенжайы немесе қатысушы аты:",
+       "blockiptext": "Төмендегі форманы жазу рұқсатын белгілі IP мекенжайынан не қатысушы есімінен бұғаттау үшін қолданыңыз.\nБұны тек бұзақылықты болдырмау үшін және де [[{{MediaWiki:Policy-url}}|ережелер]] бойынша атқаруыңыз кажет.\nТөменге тиісті себебін көрсетіңіз (мысалы дәлелге бұзақылықпен өзгертілген беттерді келтіріңіз).",
+       "ipaddressorusername": "IP-мекенжайы немесе қатысушы аты:",
        "ipbexpiry": "Мерзімі бітпек:",
        "ipbreason": "Себебі:",
        "ipbreason-dropdown": "* Бұғаттаудың жалпы себебтері\n** Жалған мәлімет енгізу\n** Беттердегі мағлұматты аластау\n** Сыртқы сайттар сілтемелерін жаудыру\n** Беттерге мағынасыздық/балдырлау кірістіру\n** Қоқандау/қуғындау мінезқұлық\n** Бірнеше рет тіркеліп қиянаттау\n** Өрескел қатысушы аты",
        "ipb-disableusertalk": "Бұл қатысушыны бұғатталған кезде өзінің талқылау бетінін өңдеуіне  кедергі жасау",
        "ipb-confirm": "Бұғаттауды құптау",
        "badipaddress": "IP мекенжайы жарамсыз.",
-       "blockipsuccesssub": "Бұғаттау сәтті өтті",
+       "blockipsuccesssub": "Бұғатталды",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] деген бұғатталған.<br />\nБұғаттарды шолып шығу үшін [[Special:BlockList|бұғаттау тізімін]] қараңыз.",
        "ipb-blockingself": "Сіз өзіңізді бұғаттамақшысыз. Бұны істегіңіз келгеніне сенімдісіз бе?",
        "ipb-edit-dropdown": "Бұғаттау себептерін өңдеу",
-       "ipb-unblock-addr": "$1 дегенді бұғаттамау",
+       "ipb-unblock-addr": "$1 дегенді бұғаттауынан босату",
        "ipb-unblock": "Қатысушы атын немесе IP мекенжайын бұғаттамау",
-       "ipb-blocklist": "Бар бұғаттауларды қарау",
+       "ipb-blocklist": "Бұғатталғандарды қарау",
        "ipb-blocklist-contribs": "$1 есімді қатысушының үлесі",
-       "unblockip": "Қатысушыны бұғаттамау",
-       "unblockiptext": "Төмендегі пішінді алдындағы IP мекенжайымен не атымен бұғатталған қатысушыға жазу қатынауын қалпына келтіріуі үшін қолданыңыз.",
+       "unblockip": "Қатысушыны бұғаттауынан босату",
+       "unblockiptext": "Төмендегі форманы IP мекенжайымен не қатысушы есімімен алдын-ала бұғатталған қатысушыға жазу рұқсатын қалпына келтіріу үшін қолданыңыз.",
        "ipusubmit": "Осы бұғаттауды алып тастау",
        "unblocked": "[[User:$1|$1]] бұғаттауы өшірілді",
        "unblocked-range": "$1  бұғаттауы өшірілді",
        "blocklist": "Бұғатталған қатысушылар",
        "ipblocklist": "Бұғатталған қатысушылар",
        "ipblocklist-legend": "Бұғатталған қатысушыны табу",
-       "blocklist-userblocks": "Тіркелгендер бұғаттауын жасыру",
-       "blocklist-tempblocks": "Уақытша бұғаттауларды жасыру",
-       "blocklist-addressblocks": "Жалғыз IP бұғаттауларын жасыру",
-       "blocklist-rangeblocks": "Аралық бұғаттауларды жасыру",
+       "blocklist-userblocks": "Тіркелгендер бұғатталуларын жасыру",
+       "blocklist-tempblocks": "Уақытша бұғатталуларды жасыру",
+       "blocklist-addressblocks": "Жалғыз IP бұғатталуларын жасыру",
+       "blocklist-rangeblocks": "Аралық бұғатталуларды жасыру",
        "blocklist-timestamp": "Уақыт белгісі",
        "blocklist-target": "Нысана",
        "blocklist-expiry": "Біту мерзімі",
        "blocklist-by": "Әкімшіні бұғаттау",
        "blocklist-params": "Бұғаттау бапталымдары",
        "blocklist-reason": "Себебі",
-       "ipblocklist-submit": "Ізде",
+       "ipblocklist-submit": "Іздеу",
        "ipblocklist-localblock": "Жергілікті бұғаттауы",
        "ipblocklist-otherblocks": "Басқа {{PLURAL:$1|бұғаттауы|бұғаттаулары}}",
        "infiniteblock": "мәңгі",
        "noautoblockblock": "өзбұғаттау өшірілген",
        "createaccountblock": "тіркелу бұғатталған",
        "emailblock": "е-пошта өшірілді",
-       "blocklist-nousertalk": "талқылау бетіңізді өңдемеңіз",
+       "blocklist-nousertalk": "өз талқылау бетін өңдей алмайтындай ету",
        "ipblocklist-empty": "Бұғаттау тізімі бос.",
-       "ipblocklist-no-results": "Сұратылған IP мекенжай не қатысушы аты бұғатталған емес.",
+       "ipblocklist-no-results": "Сұратылған IP мекенжай немесе қатысушы аты бұғатталмаған.",
        "blocklink": "бұғаттау",
        "unblocklink": "бұғаттамау",
        "change-blocklink": "бұғаттауын өзгерту",
        "blocklog-showlog": "Бұл қатысушы ұдайы бұғатталып отырған.\nДерек үшін төменде бұғатталу журналы берілген:",
        "blocklog-showsuppresslog": "Бұл қатысушы ұдайы жасырылып және бұғатталып отырған.\nДерек үшін төменде жасыру журналы берілген:",
        "blocklogentry": "[[$1]] дегенді $2 мерзімге бұғаттады $3",
-       "blocklogtext": "Бұл қатысушыларды бұғаттау/бұғаттамау әрекеттерінің журналы.\nӨздіктік бұғатталған IP мекенжайлар осында тізімделгемеген.\nАғымдағы белсенді тиымдар мен бұғаттауларды [[Special:BlockList|IP бұғаттау тізімінен]] қараңыз.",
-       "unblocklogentry": "«$1» — бұғаттауын өшірді",
-       "block-log-flags-anononly": "тек тіркелгісіздер",
+       "blocklogtext": "Бұл қатысушыларды бұғаттау және бұғаттауынан босату әрекеттерінің журналы.\nӨздіктік бұғатталған IP мекенжайлар тізімделмеген.\nҚазіргі уақыттағы белсенді тиымдар мен бұғаттауларды [[Special:BlockList|бұғаттау тізімінен]] қараңыз.",
+       "unblocklogentry": "$1 есімді қатысушыны бұғаттауынан босатты",
+       "block-log-flags-anononly": "тек аноним қатысушылар",
        "block-log-flags-nocreate": "тіркелу өшірілген",
-       "block-log-flags-noautoblock": "өзбұғаттау өшірілген",
-       "block-log-flags-noemail": "е-пошта бұғатталған",
-       "block-log-flags-nousertalk": "талқылау бетін өңдемеңіз",
-       "block-log-flags-hiddenname": "қатысушы есімі жасырылды",
+       "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|бұғаттау|бұғаттаулар}}",
-       "ipb_cant_unblock": "Қателік: IP $1 бұғаттауы табылмады. Оның бұғаттауы алдақашан өшірлген мүмкін.",
+       "ipb_cant_unblock": "Қател: Бұғаттау $1 нөмірлі ID-і табылмады. Оның бұғаттауы әлдақашан өшірілген болуы мүмкін.",
        "ipb_blocked_as_range": "Қателік: IP $1 тікелей бұғатталмаған және бұғаттауы өшірілмейді.\nБірақ, бұл бұғаттауы өшірілуі мүмкін $2 ауқымы бөлігі боп бұғатталған.",
        "ip_range_invalid": "IP мекенжай ауқымы жарамсыз.",
        "proxyblocker": "Прокси серверлерді бұғаттауыш",
        "databasenotlocked": "Дерекқор құлыпталған жоқ.",
        "move-page": "«$1» дегенді жылжыту",
        "move-page-legend": "Бетті жылжыту",
-       "movepagetext": "Бетті бүкіл тарихымен қоса жаңа атауға жылжытқалы жатырсыз.\nБеттің бұрыңғы атауы жаңа бетке айдағыш сілтеме ретінде қалады.\nҚаласаңыз, бұрыңғы атауды мегзейтін сілтемелердің автоматты түрде жаңартылуын таңдай аласыз. Бұны таңдамаған жағдайда, [[Special:DoubleRedirects|екі мәрте айдағыш]] не [[Special:BrokenRedirects|сынық айдағыш]] сілтемелер қалып қоймауына көз жеткізіңіз.\nЖылжытудан кейін әр сілтеме өзіне тиісті бетке мегзейтініне жауапты боласыз.\n\nЕгер жылжытайын деп жатқан жаңа атау басқа бетке әлдеқашан берілген болса, жылжыту '''орындалмайды'''. Бұл шара әлдеқашан бар беттің қайта жазылуынан сақтайды. Алайда, егер бет —   бос бет, не өткен тарихы жоқ [[Special:ListRedirects|айдағыш бет]] болса, жылжыту орындалады. Бұл жаңылыс жылжытылған бетті бұрыңғы атауына қайтаруды мүмкін ету үшін жасалған.\n\n\n'''Ескерту!'''\nБұл көп қаралатын бетке тиісті өзгеріс болуы мүмкін;\nілгері басудан бұрын әрекетіңіздің салдарын есепке алуыңызды сұраймыз.",
+       "movepagetext": "Бетті бүкіл тарихымен қоса жаңа атауға жылжытқалы жатырсыз.\nБеттің бұрыңғы атауы жаңа бетке айдағыш сілтеме ретінде қалады.\nҚаласаңыз, бұрыңғы атауды мегзейтін сілтемелердің автоматты түрде жаңартылуын таңдай аласыз. Бұны таңдамаған жағдайда, [[Special:DoubleRedirects|екі мәрте айдағыш]] не [[Special:BrokenRedirects|сынық айдағыш]] сілтемелер қалып қоймауына көз жеткізіңіз.\nЖылжытудан кейін әр сілтеме өзіне тиісті бетке мегзейтініне жауапты боласыз.\n\nЕгер жылжытайын деп жатқан жаңа атау басқа бетке әлдеқашан берілген болса, жылжыту <strong>орындалмайды</strong>. Бұл шара әлдеқашан бар беттің қайта жазылуынан сақтайды. Алайда, егер бет —   бос бет, не өткен тарихы жоқ [[Special:ListRedirects|айдағыш бет]] болса, жылжыту орындалады. Бұл жаңылыс жылжытылған бетті бұрыңғы атауына қайтаруды мүмкін ету үшін жасалған.\n\n\n</strong>Ескерту!</strong>\nБұл көп қаралатын бет үшін қатаң және күтілмеген өзгеріс болуы мүмкін;\nілгері басудан бұрын әрекетіңіздің салдарын есепке алуыңызды сұраймыз.",
        "movepagetext-noredirectfixer": "Бетті бүкіл тарихымен қоса жаңа атауға жылжытқалы жатырсыз.\nБеттің бұрыңғы атауы жаңа бетке айдағыш сілтеме ретінде қалады.\n[[Special:DoubleRedirects|Екі мәрте айдағыш]] не [[Special:BrokenRedirects|сынық айдағыш]] сілтемелер қалып қоймауына көз жеткізіңіз.\nЖылжытудан кейін әр сілтеме өзіне тиісті бетке мегзейтініне жауапты боласыз.\n\nЕгер жылжытайын деп жатқан жаңа атау басқа бетке әлдеқашан берілген болса, жылжыту '''орындалмайды'''. Бұл шара әлдеқашан бар беттің қайта жазылуынан сақтайды. Алайда, егер бет —   бос бет, не өткен тарихы жоқ [[Special:ListRedirects|айдағыш бет]] болса, жылжыту орындалады. Бұл жаңылыс жылжытылған бетті бұрыңғы атауына қайтаруды мүмкін ету үшін жасалған.\n\n\n'''Ескерту!'''\nБұл көп қаралатын бетке тиісті өзгеріс болуы мүмкін;\nілгері басудан бұрын әрекетіңіздің салдарын есепке алуыңызды сұраймыз.",
        "movepagetalktext": "Келесі жағдай орын алса, қатысты талқылау беті '''жылжытылмайды''':\n*жаңа атаумен аталатын беттің талқылау беті әлдеқашан бар болған кезде (бұл жағдайда талқылауын қолмен көшіруге болады, бірақ түйіндемесіне қай беттен көшірілгендігін міндетті түрде жазыңыз)\n*төмендегі қорапшадан құсбелгі алынып тасталғанда.\n\nАл мақаланың атауын өзгертем деп мағлұматын қолмен көшіруге болмайды, себебі беттің түзету тарихын өшіреді.",
        "movearticle": "Бетті жылжыту:",
        "moveuserpage-warning": "<strong>Ескерту:</strong> Сіз қатысушы бетін жылжытпақшысыз. Назар аударыңыз, қатысушы беті ғана жылжытылуы мүмкін және қатысушы аты <em>өзгертілмейді</em>.",
-       "movenologintext": "Бетті жылжыту үшін тіркелген болуыңыз және [[{{#special:UserLogin}}|кіруіңіз]] жөн.",
+       "movenologintext": "Бетті жылжыту үшін тіркелген қатысуышы болуыңыз және [[Special:UserLogin|кіруіңіз]] керек.",
        "movenotallowed": "{{SITENAME}} жобасында беттерді жылжытуға рұқсатыңыз жоқ.",
        "movenotallowedfile": "Файлдарды жылжытуға рұқсатыңыз жоқ.",
        "cant-move-user-page": "Қатысушы беттерін жылжытуға рұқсатыңыз жоқ (төменгі беттерінен басқа).",
        "newtitle": "Жаңа бет атауы:",
        "move-watch": "Бұл бетті бақылау",
        "movepagebtn": "Бетті жылжыту",
-       "pagemovedsub": "Ð\96Ñ\8bлжÑ\8bÑ\82Ñ\83 Ñ\81Ó\99Ñ\82Ñ\82Ñ\96 Ð°Ñ\8fÒ\9bÑ\82алды",
-       "movepage-moved": "'''\"$1\" беті \"$2\" бетіне жылжытылды'''",
+       "pagemovedsub": "Ð\91еÑ\82 Ð¶Ñ\8bлжÑ\8bÑ\82Ñ\8bлды",
+       "movepage-moved": "<strong>«$1» беті «$2» бетіне жылжытылды</strong>",
        "movepage-moved-redirect": "Айдатқыш жасалды.",
-       "articleexists": "Осылай аталған бет алдақашан бар, не таңдаған атауыңыз жарамды емес.\nӨзге атауды таңдаңыз.",
+       "articleexists": "Осылай аталған бет әлдақашан бар немесе таңдаған атауыңыз жарамды емес.\nБасқа атауды таңдаңыз.",
        "cantmove-titleprotected": "Бетті осы орынға жылжыта алмайсыз, себебі жаңа тақырып аты бастаудан қорғалған",
        "movetalk": "Қатысты талқылау бетін де жылжыту",
        "move-subpages": "Барлық бетшелерін жылжыту ($1 дейін)",
        "move-talk-subpages": "Талқылау бетінің барлық бетшелерін жылжыту ($1 дегенге)",
-       "movepage-page-exists": "$1 деген бет алдақашан бар және үстіне өздіктік жазылмайды.",
+       "movepage-page-exists": "$1 деген бет әлдеқашан бар және автоматты түрде үстіне жазылмайды.",
        "movepage-page-moved": "$1 деген бет $2 дегенге жылжытылды.",
        "movepage-page-unmoved": "$1 деген бет $2 дегенге жылжытылмайды.",
        "movepage-max-pages": "Барынша $1 бет жылжытылды да мыннан көбі өздіктік жылжылтылмайды.",
        "movereason": "Жылжытудың себебі:",
        "revertmove": "қайтару",
        "delete_and_move": "Жою және жылжыту",
-       "delete_and_move_text": "==Жою керек==\n\"[[:$1]]\" деген нысана бет алдақашан бар.\nЖылжытуға жол беру үшін бұны жоясыз ба?",
+       "delete_and_move_text": "== Жоюды қажет етеді ==\nТағайындалған «[[:$1]]» беті әлдеқашан бар.\nЖылжытуға жол беру үшін бұны жойғыңыз келе ме?",
        "delete_and_move_confirm": "Иә, бұл бетті жой",
        "delete_and_move_reason": "\"[[$1]]\" дегеннен жылжытуға жол беру үшін жойылған",
        "selfmove": "Қайнар және нысана тақырып аттары бірдей;\nбет өзінің үстіне жылжытылмайды.",
        "importsuccess": "Сырттан алу аяқталды!",
        "importnosources": "Уики-апару үшін сырттан алынатын еш қайнар көзі анықталмаған, және тарихын тікелей қотарып беруі өшірілген.",
        "importnofile": "Сырттан алынған файл жүктелген жоқ.",
-       "importuploaderrorsize": "СÑ\8bÑ\80Ñ\82Ñ\82ан Ð°Ð»Ñ\8bнÒ\93ан Ñ\84айлдÑ\8bÒ£ Ð¶Ò¯ÐºÑ\82елÑ\83Ñ\96 Ñ\81Ó\99Ñ\82Ñ\81Ñ\96з Ó©Ñ\82Ñ\82Ñ\96. Ð¤Ð°Ð¹Ð» Ð¼Ó©Ð»Ñ\88еÑ\80Ñ\96 Ñ\80Ò±Ò\9bÑ\81аÑ\82 ÐµÑ\82Ñ\96лгеннен Ð¼Ó©Ð»Ñ\88еÑ\80ден Ð°Ñ\81адÑ\8b.",
+       "importuploaderrorsize": "Ð\98мпоÑ\80Ñ\82Ñ\82алÒ\93ан Ñ\84айлдÑ\8bÒ£ Ð¶Ò¯ÐºÑ\82елÑ\83Ñ\96 Ñ\81Ó\99Ñ\82Ñ\81Ñ\96з Ð±Ð¾Ð»Ð´Ñ\8b. \nФайл Ñ\80Ò±Ò\9bÑ\81аÑ\82 ÐµÑ\82Ñ\96лгеннен Ð¶Ò¯ÐºÑ\82еÑ\83 Ó©Ð»Ñ\88емÑ\96нен Ò¯Ð»ÐºÐµÐ½Ñ\96Ñ\80ек.",
        "importuploaderrorpartial": "Сырттан алынған файлдың жүктелуі сәтсіз өтті. Осы файлдың тек бөліктері жүктелді.",
        "importuploaderrortemp": "Сырттан алынған файлдың жүктелуі сәтсіз өтті. Уақытша қалта табылмады.",
        "import-parse-failure": "Сырттан алынған XML файл құрылымын талдатқанда сәтсіздік болды",
        "tooltip-preferences-save": "Бапталымдарыңызды сақтау",
        "tooltip-summary": "Қысқаша түйіндемесін енгізіңіз",
        "common.css": "/* Мында орналастырылған CSS барлық мәнерлерде қолданылады */",
-       "cologneblue.css": "/* Мында орналастырылған CSS тек «Көлн зеңгірлігі» (cologneblue) мәнерін пайдаланушыларына ықпал етеді skin */",
        "monobook.css": "/* Мында орналастырылған CSS тек «Дара кітап» (monobook) мәнерін пайдаланушыларына ықпал етеді */",
-       "modern.css": "/* Мында орналастырылған CSS тек «Заманауи» (modern) мәнерін пайдаланушыларына ықпал етеді */",
        "common.js": "/* Мындағы әртүрлі JavaScript кез келген бет қотарылғанда барлық пайдаланушылар үшін жегіледі. */",
-       "cologneblue.js": "/* Мындағы JavaScript тек «Көлн зеңгірлігі» (cologneblue) мәнерін пайдаланушылар үшін жегіледі */",
        "monobook.js": "/* Мындағы JavaScript тек «Дара кітап» (monobook) мәнерін пайдаланушылар үшін жегіледі */",
-       "modern.js": "/* Мындағы JavaScript тек «Заманауи» (modern) мәнерін пайдаланушылар үшін жегіледі */",
-       "notacceptable": "Тұтынғышыңыз оқи алатын пішімі бар деректерді бұл уики сервер жетістіре алмайды.",
        "anonymous": "{{SITENAME}} тіркелгісіз {{PLURAL:$1|қатысушысы|қатысушылары}}",
        "siteuser": "{{SITENAME}} қатысушы $1",
        "anonuser": "{{SITENAME}} анонимді қатысушы: $1",
        "pageinfo-length": "Бет ұзындығы (байтпен)",
        "pageinfo-article-id": "Бет ID-і",
        "pageinfo-language": "Бет мәлімет тілі",
-       "pageinfo-content-model": "Бет мағұлымат қалпы",
+       "pageinfo-content-model": "Бет мағлұмат қалпы",
        "pageinfo-robot-policy": "Индекстеуді робот жүргізеді",
        "pageinfo-robot-index": "Рұқсат берілген",
        "pageinfo-robot-noindex": "Рұқсат етілмеген",
        "pageinfo-category-pages": "Беттер саны",
        "pageinfo-category-subcats": "Санатшалар саны",
        "pageinfo-category-files": "Файлдар саны",
-       "skinname-cologneblue": "Көк зеңгірлігі (cologneblue)",
        "skinname-monobook": "Жеке кітап (monobook)",
-       "skinname-modern": "Заманауи (modern)",
        "markaspatrolleddiff": "Зерттелді деп белгілеу",
        "markaspatrolledtext": "Бұл бетті тексерілді деп белгілеу",
        "markedaspatrolled": "Тексерілді деп белгіленді",
        "nextdiff": "Келесі өңдеме →",
        "mediawarning": "'''Ескерту''': Бұл файл түрінде қаскүнемді коды бар болуы ықтимал; бұны жегіп жүйеңізге зиян келтіруіңіз мүмкін.",
        "imagemaxsize": "Суреттің өлшем шектеуі:<br />''(файл сипаттама беттері үшін)''",
-       "thumbsize": "Нобай мөлшері:",
+       "thumbsize": "Нобай өлшемі:",
        "widthheight": "$1 × $2",
        "widthheightpage": "$1 × $2, $3 бет",
-       "file-info": "Файл мөлшері: $1, MIME түрі: $2",
+       "file-info": "файл өлшемі: $1, MIME түрі: $2",
        "file-info-size": "$1 × $2 нүкте, файл өлшемі: $3, MIME түрі: $4",
        "file-info-size-pages": "$1 × $2 нүкте (пиксел), Файл өлшемі: $3, MIME түрі: $4, $5 {{PLURAL:$5|бет|бет}}",
        "file-nohires": "Жоғары кеңейтілімдегі нұсқалары жоқ.",
-       "svg-long-desc": "SVG файлы, кесімді $1 × $2 нүкте, файл мөлшері: $3",
+       "svg-long-desc": "SVG файлы, кесімді $1 × $2 (пиксел) нүкте, файл өлшемі: $3",
        "svg-long-desc-animated": "SVG қозғалысты файлы, кесімді $1 × $2 нүкте, файл өлшемі: $3",
        "svg-long-error": "жарамсыз SVG файлы: $1",
        "show-big-image": "Түпнұсқа файл",
        "imagelisttext": "Төменде $2 сұрыпталған '''$1''' файл тізімі.",
        "newimages-summary": "Бұл арнайы бетте соңғы жүктелген файлдар көрсетіледі",
        "newimages-legend": "Сүзгі",
-       "showhidebots": "(боттарды $1)",
        "noimages": "Көретін ештеңе жоқ.",
-       "ilsubmit": "Ізде",
+       "ilsubmit": "Іздеу",
        "bydate": "күн-айымен",
        "sp-newimages-showfrom": "$2, $1 кезінен бері — жаңа суреттерді көрсет",
        "video-dims": "$1, $2 × $3",
        "seconds-ago": "$1 {{PLURAL:$1|секунт|секунт}} бұрын",
        "bad_image_list": "Пішімі төмендегідей:\n\nТек тізім даналары (* нышанымен басталытын жолдар) есептеледі.\nЖолдың бірінші сілтемесі жарамсыз суретке сілтеу жөн.\nСол жолдағы кейінгі әрбір сілтемелер ерен болып есептеледі, мысалы жол ішіндегі кездесетін суреті бар беттер.",
        "metadata": "Қосымша мәліметтер",
-       "metadata-help": "Осы файлда қосымша мәліметтер бар. Бәлкім, осы мәліметтер файлды жасап шығару, не сандылау үшін пайдаланған сандық камера, не мәтіналғырдан алынған.\nЕгер осы файл негізгі күйінен өзгертілген болса, кейбір ежелелері өзгертілген фотосуретке лайық болмас.",
+       "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",
        "monthsall": "барлығы",
        "confirmemail": "Е-пошта мекенжайын құптау",
        "confirmemail_noemail": "[[Special:Preferences|Пайдаланушылық бапталымдарыңызда]] жарамды е-пошта мекенжайын қоймапсыз.",
-       "confirmemail_text": "{{SITENAME}} Ðµ-поÑ\88Ñ\82а Ð¼Ò¯Ð¼ÐºÑ\96ндÑ\96кÑ\82еÑ\80Ñ\96н Ð¿Ð°Ð¹Ð´Ð°Ð»Ð°Ð½Ñ\83 Ò¯Ñ\88Ñ\96н Ð°Ð»Ð´Ñ\8bнан Ðµ-поÑ\88Ñ\82а Ð¼ÐµÐºÐµÐ½Ð¶Ð°Ð¹Ñ\8bÒ£Ñ\8bздÑ\8bÒ£ Ð¶Ð°Ñ\80амдÑ\8bлÑ\8bÒ\93Ñ\8bн Ñ\82екÑ\81еÑ\80Ñ\96п Ñ\88Ñ\8bÒ\93Ñ\83Ñ\8bÒ£Ñ\8bз ÐºÐµÑ\80ек.\nӨзÑ\96Ò£Ñ\96здÑ\96Ò£ Ð¼ÐµÐºÐµÐ½Ð¶Ð°Ð¹Ñ\8bÒ£Ñ\8bзÒ\93а Ò\9bұпÑ\82аÑ\83 Ñ\85аÑ\82Ñ\8bн Ð¶Ó©Ð½ÐµÐ»Ñ\82Ñ\83 Ò¯Ñ\88Ñ\96н Ñ\82өмендегÑ\96 Ð±Ð°Ñ\82Ñ\8bÑ\80манÑ\8b Ð½Ò±Ò\9bÑ\8bÒ£Ñ\8bз.\nХаÑ\82Ñ\82Ñ\8bÒ£ Ñ\96Ñ\88Ñ\96нде ÐºÐ¾Ð´Ñ\8b Ð±Ð°Ñ\80 Ñ\81Ñ\96лÑ\82еме ÐºÑ\96Ñ\80Ñ\96Ñ\81Ñ\82Ñ\96Ñ\80мек;\nе-поÑ\88Ñ\82а Ð¶Ð°Ð¹Ñ\8bÒ£Ñ\8bздÑ\8bÒ£ Ð¶Ð°Ñ\80амдÑ\8bлÑ\8bÒ\93Ñ\8bн Ò\9bұпÑ\82аÑ\83 Ò¯Ñ\88Ñ\96н Ñ\81Ñ\96лÑ\82еменÑ\96 Ñ\88олÒ\93Ñ\8bÑ\88Ñ\82Ñ\8bÒ£ Ð¼ÐµÐºÐµÐ½Ð¶Ð°Ð¹ Ð¶Ð¾Ð»Ð°Ò\93Ñ\8bна ÐµÐ½Ð³Ñ\96зÑ\96п Ð°Ñ\88Ñ\8bÒ£Ñ\8bз.",
-       "confirmemail_pending": "Құптау коды алдақашан хатпен жіберіліген;\nегер жуықта тіркелсеңіз, жаңа кодын сұрату алдынан хат келуін біршама минөт күте тұрыңыз.",
+       "confirmemail_text": "{{SITENAME}} Ðµ-поÑ\88Ñ\82а Ð¼Ò¯Ð¼ÐºÑ\96ндÑ\96кÑ\82еÑ\80Ñ\96н Ð¿Ð°Ð¹Ð´Ð°Ð»Ð°Ð½Ñ\83 Ò¯Ñ\88Ñ\96н Ð°Ð»Ð´Ñ\8bнан Ðµ-поÑ\88Ñ\82а Ð¼ÐµÐºÐµÐ½Ð¶Ð°Ð¹Ñ\8bÒ£Ñ\8bздÑ\8bÒ£ Ð¶Ð°Ñ\80амдÑ\8bлÑ\8bÒ\93Ñ\8bн Ñ\82екÑ\81еÑ\80Ñ\96п Ñ\88Ñ\8bÒ\93Ñ\83Ñ\8bÒ£Ñ\8bз ÐºÐµÑ\80ек.\nӨзÑ\96Ò£Ñ\96здÑ\96Ò£ Ð¼ÐµÐºÐµÐ½Ð¶Ð°Ð¹Ñ\8bÒ£Ñ\8bзÒ\93а Ò\9bұпÑ\82аÑ\83 Ñ\85аÑ\82Ñ\8bн Ð¶Ó©Ð½ÐµÐ»Ñ\82Ñ\83 Ò¯Ñ\88Ñ\96н Ñ\82өмендегÑ\96 Ð±Ð°Ñ\82Ñ\8bÑ\80манÑ\8b Ð½Ò±Ò\9bÑ\8bÒ£Ñ\8bз.\nХаÑ\82Ñ\82Ñ\8bÒ£ Ñ\96Ñ\88Ñ\96нде ÐºÐ¾Ð´Ñ\8b Ð±Ð°Ñ\80 Ñ\81Ñ\96лÑ\82еме ÐºÑ\96Ñ\80Ñ\96Ñ\81Ñ\82Ñ\96Ñ\80мек;\nе-поÑ\88Ñ\82а Ð¼ÐµÐºÐµÐ½Ð¶Ð°Ð¹Ñ\8bÒ£Ñ\8bздÑ\8bÒ£ Ð¶Ð°Ñ\80амдÑ\8bлÑ\8bÒ\93Ñ\8bн Ò\9bұпÑ\82аÑ\83 Ò¯Ñ\88Ñ\96н Ñ\81Ñ\96лÑ\82еменÑ\96 Ð±Ñ\80оÑ\83зеÑ\80Ñ\96Ò£Ñ\96зде Ð¶Ò¯ÐºÑ\82еңÑ\96з.",
+       "confirmemail_pending": "Құптау коды әлдеқашан хатпен жіберіліген;\nегер жуықта тіркелсеңіз жаңа кодын сұрату алдынан хат келуін бірнеше минут күте тұрыңыз.",
        "confirmemail_send": "Құптау кодын жөнелту",
        "confirmemail_sent": "Құптау хаты жөнелтілді.",
        "confirmemail_oncreate": "Құптау коды е-пошта мекенжайыңызға жөнелтілді.\nБұл белгілеме кіру үдірісіне керегі жоқ, бірақ е-пошта негізіндегі уики мүмкіндіктерді қосу үшін бұны жетістіруіңіз керек.",
        "confirmemail_success": "Е-пошта мекенжайыңыз құпталды.\nЕнді уикиге кіріп жұмысқа кірісуге болады",
        "confirmemail_loggedin": "Е-пошта мекенжайыңыз енді құпталды.",
        "confirmemail_subject": "{{SITENAME}} торабынан е-пошта мекенжайыңызды құптау хаты",
-       "confirmemail_body": "Кейбіреу, $1 деген IP мекенжайынан, өзіңіз болуы мүмкін,\n{{SITENAME}} жобасында бұл Е-пошта мекенжайын қолданып «$2» деген тіркелгі жасапты.\n\nБұл тіркелгі нақты сізге тән екенін құптау үшін, және {{SITENAME}} жобасының\nе-пошта мүмкіндіктерін белсендіру үшін, мына сілтемені шолғышыңызбен ашыңыз:\n\n$3\n\nЕгер бұл тіркелгіні жасаған өзіңіз *емес* болса, мына сілтемеге еріп\nе-пошта мекенжайы құптауын болдырмаңыз:\n\n$5\n\nҚұптау коды мерзімі бітетін кезі: $4.",
+       "confirmemail_body": "Әлдебіреу өзіңіз болуы мүмкін $1 деген IP мекенжайынан \n{{SITENAME}} жобасында бұл э-пошта мекенжайынмен «$2» деген тіркелгі жасапты.\n\nБұл тіркелгі нақты сізге тән екенін құптау үшін және {{SITENAME}} жобасының э-пошта мүмкіндіктерін белсендіру үшін мына сілтемені броузеріңізбен ашыңыз:\n\n$3\n\nЕгер бұл тіркелгіні жасаған өзіңіз *емес* болса мына сілтемеге еріп\nэ-пошта мекенжайы құптауын болдырмаңыз:\n\n$5\n\nҚұптау коды мерзімі бітетін кезі: $4.",
        "confirmemail_invalidated": "Е-пошта мекенжайын құптауы болдырылмады",
        "invalidateemail": "Е-пошта мекенжайын құптауы болдырмау",
        "scarytranscludedisabled": "[Уики-аралық кірікбеттер өшірілген]",
        "confirmrecreate": "Бұл бетті өңдеуіңізді бастағанда [[User:$1|$1]] ([[User talk:$1|талқылауы]]) осы бетті жойды, келтірген себебі:\n: ''$2''\nОсы бетті қайта бастауын нақты тілегеніңізді құптаңыз.",
        "recreate": "Қайта бастау",
        "unit-pixel": " нүкте",
-       "confirm_purge_button": "Жарайды",
-       "confirm-purge-top": "Бұл беттін бүркемесін тазартасыз ба?",
-       "confirm-watch-button": "Жарайды",
+       "confirm_purge_button": "OK",
+       "confirm-purge-top": "Бұл бетті бүркемесінен тазартасыз ба?",
+       "confirm-watch-button": "OK",
        "confirm-watch-top": "Бұл бетті бақылау тізіміңізге қосқыңыз келе ме?",
-       "confirm-unwatch-button": "Жарайды",
+       "confirm-unwatch-button": "OK",
        "confirm-unwatch-top": "Бұл бетті бақылау тізіміңізден аластағыңыз келе ме?",
        "semicolon-separator": ";",
        "colon-separator": ":&#32;",
        "autosumm-new": "Жаңа бетте: $1",
        "size-bytes": "$1 байт",
        "size-kilobytes": "$1 КБ",
-       "livepreview-loading": "Жүктеуде…",
-       "livepreview-ready": "Жүктеуде… Дайын!",
-       "livepreview-failed": "Тура қарап шығу сәтсіз! Кәдімгі қарап шығу әдісін байқап көріңіз.",
-       "livepreview-error": "Қосылу сәтсіз: $1 \"$2\". Кәдімгі қарап шығу әдісін байқап көріңіз.",
        "lag-warn-normal": "{{PLURAL:$1|секунтта|секунтта}} $1 жаңалау өзгерістер бұл тізімде көрсетілмеуі мүмкін.",
        "lag-warn-high": "Дерекқор сервері көп кешігуі себебінен, $1 {{PLURAL:$1|секунтта|сеунтта}} жаңалау өзгерістер бұл тізімде көрсетілмеуі мүмкін.",
-       "watchlistedit-numitems": "Бақылау тізіміңізде, талқылау беттерсіз, {{PLURAL:$1|1 тақырып аты|$1 тақырып аттары}} бар.",
-       "watchlistedit-noitems": "Бақылау тізіміңізде еш тақырып аты жоқ.",
        "watchlistedit-normal-title": "Бақылау тізімді өңдеу",
        "watchlistedit-normal-legend": "Бақылау тізімінен тақырып аттарын аластау",
        "watchlistedit-normal-explain": "Бақылау тізіміңіздегі тақырып аттар төменде көрсетіледі.\nТақырып атын аластау үшін, бүйір көзге құсбелгі салыңыз, және \"{{int:Watchlistedit-normal-submit}}\" дегенді нұқыңыз.\nТағы да [[Special:EditWatchlist/raw|қам тізімді өңдей]] аласыз.",
        "hebrew-calendar-m10-gen": "тымоздың",
        "hebrew-calendar-m11-gen": "абтың",
        "hebrew-calendar-m12-gen": "айлолдың",
-       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|талқ]])",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|талқылауы]])",
        "unknown_extension_tag": "Белгісіз кеңейтпе белгісі \"$1\"",
        "version": "Нұсқа",
        "version-extensions": "Орнатылған кеңейтімдер",
        "fileduplicatesearch-summary": "Файл хеші мағынасы негізінде телнұсқаларын іздеу.",
        "fileduplicatesearch-legend": "Телнұсқаны іздеу",
        "fileduplicatesearch-filename": "Файл атауы:",
-       "fileduplicatesearch-submit": "Ізде",
+       "fileduplicatesearch-submit": "Іздеу",
        "fileduplicatesearch-info": "$1 × $2 пиксел (нүкте)<br />Файл өлшемі: $3<br />MIME түрі: $4",
        "fileduplicatesearch-result-1": "«$1» файлына тең телнұсқасы жоқ.",
        "fileduplicatesearch-result-n": "«$1» файлына тең $2 телнұсқасы бар.",
        "compare-invalid-title": "Cіз көрсеткен атау жарамды емес.",
        "compare-title-not-exists": "Cіз көрсеткен атау жоқ.",
        "compare-revision-not-exists": "Cіз көрсеткен нұсқа жоқ.",
-       "dberr-header": "Бұл уикиде мәселе бар",
        "htmlform-required": "Бұл мән міндетті",
        "htmlform-submit": "Жіберу",
        "htmlform-reset": "Өзгерістерді болдырмау",
        "logentry-delete-event": "$1 $3 бетіндегі {{PLURAL:$5|журнал оқиғасы|$5 журнал оқиғасы}} көрінісін {{GENDER:$2|өзгертті}}: $4",
        "logentry-delete-revision": "$1 $3 бетіндегі {{PLURAL:$5|нұсқа|$5 нұсқа}} көрінісін {{GENDER:$2|өзгертті}}: $4",
        "logentry-suppress-event": "$1 $3 бетіндегі {{PLURAL:$5|журнал оқиғасы|$5 журнал оқиғасы}} көрінісін құпия түрде {{GENDER:$2|өзгертті}}: $4",
-       "revdelete-content-hid": "мағұлымат жасырылған",
+       "revdelete-content-hid": "мағлұмат жасырылған",
        "revdelete-summary-hid": "өңдеу түйіндемесі жасырылған",
        "revdelete-uname-hid": "қатысушы есімі жасырылған",
        "revdelete-content-unhid": "мағлұматы жасырылмаған",
        "expand_templates_input": "Кіріс мәтіні:",
        "expand_templates_output": "Нәтижесі",
        "expand_templates_xml_output": "XML шығаруы",
-       "expand_templates_ok": "Жарайды",
+       "expand_templates_ok": "OK",
        "expand_templates_remove_comments": "Мәндемелерін аластатып?",
        "expand_templates_generate_xml": "XML өңдету бұтақтарын көрсет",
        "expand_templates_preview": "Қарап шығу"
index 53d3914..968cd64 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Atabek",
                        "GaiJin",
-                       "Kaztrans"
+                       "Kaztrans",
+                       "아라"
                ]
        },
        "tog-underline": "Siltemeniñ astın sız:",
@@ -14,7 +15,6 @@
        "tog-showtoolbar": "Öñdew qwraldar jolağın körset (JavaScript)",
        "tog-editondblclick": "Qos nuqımdap öñdew (JavaScript)",
        "tog-editsectiononrightclick": "Bölim taqırıbın oñ nuqwmen öñdewin qos (JavaScript)",
-       "tog-rememberpassword": "Kirgenimdi osı komp′ywterde umıtpa (for a maximum of $1 {{PLURAL:$1|day|days}})",
        "tog-watchcreations": "Men bastağan betterdi baqılaw tizimime üste",
        "tog-watchdefault": "Men öñdegen betterdi baqılaw tizimime üste",
        "tog-watchmoves": "Men jıljıtqan betterdi baqılaw tizimime üste",
        "filedeleteerror": "«$1» faýlı joýılmaýdı.",
        "directorycreateerror": "«$1» qaltası qurılmadı.",
        "filenotfound": "«$1» faýlı tabılmadı.",
-       "fileexistserror": "«$1» faýlğa jazw ïkemdi emes: faýl bar",
        "unexpected": "Kütilmegen mağına: «$1» = «$2».",
        "formerror": "Qatelik: pişin jöneltilmeýdi",
        "badarticleerror": "Osındaý äreket mına bette atqarılmaýdı.",
        "savearticle": "Betti saqta!",
        "preview": "Qarap şığw",
        "showpreview": "Qarap şıq",
-       "showlivepreview": "Twra qarap şıq",
        "showdiff": "Özgeristerdi körset",
        "anoneditwarning": "'''Qulaqtandırw:''' Siz jüýege kirmegensiz.\nIP mekenjaýıñız bul bettiñ tüzetw tarïxında jazılıp alınadı.",
        "missingsummary": "'''Eskertpe:''' Öñdemeniñ qısqaşa mazmundamasın engizbepsiz.\n«Saqtaw» tüýmesin tağı bassañız, öñdenmeñiz mändemesiz saqtaladı.",
        "showingresultsnum": "Tömende nömir '''$2''' ornınan bastap '''$3''' nätïje körsetiledi.",
        "powersearch-legend": "Keñeýtilgen izdew",
        "powersearch-ns": "Usı isimler ko'pliginen izlew:",
-       "powersearch-redir": "Qayta bag'ıtlawshı betlerdi ko'rset",
        "search-external": "Şettik izdegiş",
        "searchdisabled": "{{SITENAME}} izdew qızmeti öşirilgen.\nÄzirşe Google arqılı izdewge boladı.\nAñğartpa: {{SITENAME}} torabınıñ mağlumat tizbeleri eskirgen bolwı mümkin.",
        "preferences": "Baptalımdar",
        "recentchanges-summary": "Bul bette osı wïkïdegi bolğan jwıqtağı özgerister baýqaladı.",
        "recentchanges-feed-description": "Bul arnamenen wïkïdegi eñ soñğı özgerister qadağalanadı.",
        "rcnotefrom": "'''$2''' kezinen beri — tömende '''$1''' jetkenşe deýin özgerister körsetiledi.",
-       "rclistfrom": "$1 kezinen beri — jaña özgeristerdi körset.",
+       "rclistfrom": "$3 $2 kezinen beri — jaña özgeristerdi körset.",
        "rcshowhideminor": "Şağın öñdemelerdi $1",
        "rcshowhidebots": "Bottardı $1",
        "rcshowhideliu": "Kirgenderdi $1",
        "watchlist-details": "Talqılaw betterin sanamağanda $1 bet baqlanıladı.",
        "wlheader-enotif": "Eskertw xat jiberwi qosılğan.",
        "wlheader-showupdated": "Soñğı kelip-ketwiñizden beri özgertilgen betterdi '''jwan''' qaripimen körset",
-       "watchmethod-recent": "baqılawlı better üşin jwıqtağı özgeristerdi tekserw",
-       "watchmethod-list": "jwıqtağı özgerister üşin baqılawlı betterdi tekserw",
-       "watchlistcontains": "Baqılaw tizimiñizde $1 bet bar.",
-       "iteminvalidname": "'$1' danada aqaw bar — jaramsız ataw…",
        "wlshowlast": "Soñğı $1 sağattağı, $2 kündegi, $3 bolğan özgeristi körsetw",
        "watching": "Baqılawda…",
        "unwatching": "Baqılamawda…",
        "cologneblue.js": "/* Mındağı JavaScript tek «Köln zeñgirligi» (cologneblue) mänerin paýdalanwşılar üşin jegiledi */",
        "monobook.js": "/* Mındağı JavaScript tek «Dara kitap» (monobook) mänerin paýdalanwşılar üşin jegiledi */",
        "modern.js": "/* Mındağı JavaScript tek «Zamanawï» (modern) mänerin paýdalanwşılar üşin jegiledi */",
-       "notacceptable": "Tutınğışıñız oqï alatın pişimi bar derekterdi bul wïkï server jetistire almaýdı.",
        "anonymous": "{{SITENAME}} tirkelgisiz qatıswşı(ları)",
        "siteuser": "{{SITENAME}} qatıswşı $1",
        "lastmodifiedatby": "Bul betti $3 qatıswşı soñğı özgertken kezi: $2, $1.",
        "autoredircomment": "[[$1]] degenge aýdadı",
        "autosumm-new": "Jaña bette: $1",
        "size-bytes": "$1 baýt",
-       "livepreview-loading": "Jüktewde…",
-       "livepreview-ready": "Jüktewde… Daýın!",
-       "livepreview-failed": "Twra qarap şığw sätsiz! Kädimgi qarap şığw ädisin baýqap köriñiz.",
-       "livepreview-error": "Qosılw sätsiz: $1 «$2». Kädimgi qarap şığw ädisin baýqap köriñiz.",
        "lag-warn-normal": "$1 sekwndtan jañalaw özgerister bul tizimde körsetilmewi mümkin.",
        "lag-warn-high": "Derekqor serveri zor keşigwi sebebinen, $1 sekwndtan jañalaw özgerister bul tizimde körsetilmewi mümkin.",
-       "watchlistedit-numitems": "Baqılaw tizimiñizde, talqılaw bettersiz, $1 taqırıp atı bar.",
-       "watchlistedit-noitems": "Baqılaw tizimiñizde eş taqırıp atı joq.",
        "watchlistedit-normal-title": "Baqılaw tizimdi öñdew",
        "watchlistedit-normal-legend": "Baqılaw tiziminen taqırıp attarın alastaw",
        "watchlistedit-normal-explain": "Baqılaw tizimiñizdegi taqırıp attar tömende körsetiledi.\nTaqırıp atın alastaw üşin, büýir közge qusbelgi salıñız, jäne «Taqırıp attarın alasta» degendi nuqıñız.\nTağı da [[Special:EditWatchlist/raw|qam tizimdi öñdeý]] alasız.",
index b5c3ea3..fa16fff 100644 (file)
@@ -13,7 +13,8 @@
                        "Ævar Arnfjörð Bjarmason <avarab@gmail.com>",
                        "គីមស៊្រុន",
                        "តឹក ប៊ុនលី",
-                       "វ័ណថារិទ្ធ"
+                       "វ័ណថារិទ្ធ",
+                       "아라"
                ]
        },
        "tog-underline": "គូសបន្ទាត់ក្រោម​តំណភ្ជាប់៖",
@@ -26,7 +27,6 @@
        "tog-showtoolbar": "បង្ហាញ​របារឧបករណ៍កែប្រែ",
        "tog-editondblclick": "កែប្រែទំព័រដោយចុចពីរដង​ជាប់គ្នា",
        "tog-editsectiononrightclick": "អនុញ្ញាត​អោយកែប្រែ​​ផ្នែកណាមួយ ដោយ​ចុចកណ្តុរស្ដាំ​លើ​ចំណងជើង​របស់វា",
-       "tog-rememberpassword": "ចងចាំ​ការកត់ឈ្មោះចូលរបស់ខ្ញុំ​លើកុំព្យូទ័រនេះ (សំរាប់រយៈពេលយ៉ាងយូរ$1 {{PLURAL:$1|ថ្ងៃ|ថ្ងៃ}})",
        "tog-watchcreations": "បន្ថែម​ទំព័រ​ទាំងឡាយដែលខ្ញុំបង្កើត​ទៅ​បញ្ជីតាមដាន​របស់ខ្ញុំ",
        "tog-watchdefault": "បន្ថែម​ទំព័រទាំងឡាយ​ដែលខ្ញុំកែប្រែ​ទៅ​បញ្ជីតាមដាន​របស់ខ្ញុំ",
        "tog-watchmoves": "បន្ថែម​ទំព័រ​ទាំងឡាយដែលខ្ញុំប្តូរទីតាំង​ទៅ​បញ្ជីតាមដាន​របស់ខ្ញុំ",
        "readonly_lag": "មូលដ្ឋានទិន្នន័យត្រូវបានចាក់សោដោយស្វ័យប្រវត្តិ ខណៈពេលដែលម៉ាស៊ីនបម្រើ(server)មូលដ្ឋានទិន្នន័យរង​កំពុង​ទាក់ទង​ទៅម៉ាស៊ីនបម្រើ​មូលដ្ឋានទិន្នន័យមេ",
        "internalerror": "បញ្ហាផ្នែកខាងក្នុង",
        "internalerror_info": "បញ្ហាផ្នែកខាងក្នុង៖ $1",
-       "fileappenderrorread": "មិនអាចអាន \"$1\" បានទេពេលកំពុងសរសេរបន្ថែម។",
-       "fileappenderror": "មិនអាចបន្ថែម \"$1\" ទៅខាងចុង \"$2\" បានទេ។",
        "filecopyerror": "មិនអាចចម្លងឯកសារ\"$1\" ទៅ \"$2\"បានទេ។",
        "filerenameerror": "មិនអាចប្តូរឈ្មោះឯកសារពី\"$1\" ទៅ \"$2\"បានទេ។",
        "filedeleteerror": "មិនអាចលុបឯកសារ\"$1\"បានទេ។",
        "directorycreateerror": "មិនអាចបង្កើតថត\"$1\"បានទេ។",
        "filenotfound": "រក​ឯកសារ \"$1\" មិនឃើញទេ។",
-       "fileexistserror": "មិនអាចសរសេរ​ទៅក្នុង​ឯកសារ \"$1\"ទេ៖ ឯកសារមានរួចហើយ",
        "unexpected": "តម្លៃ​មិនបានរំពឹងទុក៖ \"$1\"=\"$2\"។",
        "formerror": "បញ្ហា៖ មិនអាចដាក់ស្នើ​សំណុំបែបបទ",
        "badarticleerror": "សកម្មភាពនេះ​មិនអាចអនុវត្ត​លើទំព័រនេះទេ។",
        "userlogin-resetpassword-link": "អ្នកភ្លេចពាក្យសម្ងាត់ហើយ?",
        "userlogin-loggedin": "អ្នកបានកត់ឈ្មោះចូលជា {{GENDER:$1|$1}} ហើយ។\nប្រើសំណុំបែបបទខាងក្រោមដើម្បីកត់ឈ្មោះចូលជាអ្នកប្រើប្រាស់ផ្សេងម្នាក់ទៀត។",
        "userlogin-createanother": "បង្កើតគណនីមួយទៀត",
-       "createacct-join": "បំពេញព័ត៌មានរបស់អ្នកខាងក្រោម។",
-       "createacct-another-join": "បញ្ចូលព័ត៌មានគណនីថ្មីខាងក្រោម។",
        "createacct-emailrequired": "អាសយដ្ឋានអ៊ីមែល",
        "createacct-emailoptional": "អាសយដ្ឋានអ៊ីមែល (ដាក់ក៏បានមិនដាក់ក៏បាន)",
        "createacct-email-ph": "បញ្ចូលអាសយដ្ឋានអ៊ីមែលរបស់អ្នក",
        "savearticle": "រក្សាទំព័រទុក",
        "preview": "មើលជាមុន",
        "showpreview": "បង្ហាញ​ការមើលជាមុន",
-       "showlivepreview": "មើលជាមុនដោយផ្ទាល់",
        "showdiff": "បង្ហាញ​បន្លាស់ប្ដូរ",
        "anoneditwarning": "'''ប្រយ័ត្ន ៖''' អ្នកមិនបានកត់ឈ្មោះចូល​ទេ។ អាសយដ្ឋានIPរបស់អ្នក​នឹងត្រូវបាន​កត់ត្រាទុក​ក្នុងប្រវត្តិកែប្រែ​នៃទំព័រ​នេះ។",
        "anonpreviewwarning": "''អ្នកមិនបានកត់ឈ្មោះចូល​ទេ។ ប្រសិនបើអ្នកធ្វើការរក្សាទុក នោះអាសយដ្ឋានIPរបស់អ្នក​នឹងត្រូវបាន​កត់ត្រាទុក​ក្នុងប្រវត្តិកែប្រែ​នៃទំព័រ​នេះ។''",
        "edit-gone-missing": "មិនអាចបន្ទាន់សម័យទំព័រនេះទេ។\n\nទំព័រនេះហាក់ដូចជាត្រូវបានលុបចោលហើយ។",
        "edit-conflict": "កែប្រែ​ភាពឆ្គង​។",
        "edit-no-change": "ការកែប្រែរបស់អ្នកត្រូវបានមិនទុកជាការទេ ព្រោះគ្មានការផ្លាស់ប្ដូរណាមួយត្រូវបានធ្វើនៅលើអត្ថបទនេះទេ។",
-       "postedit-confirmation": "កំណែប្រែរបស់អ្នកត្រូវបានរក្សាទុកហើយ។",
+       "postedit-confirmation-saved": "កំណែប្រែរបស់អ្នកត្រូវបានរក្សាទុកហើយ។",
        "edit-already-exists": "មិនអាចបង្កើតទំព័រថ្មីមួយទេ។\n\nទំព័រនេះមានរួចហើយ។",
        "defaultmessagetext": "អត្ថបទសារតាមលំនាំដើម",
        "invalid-content-data": "ខ្លឹមសារទិន្នន័យគ្មានសុពលភាព",
        "search-nonefound": "មិនមានលទ្ធផលណាមួយ​ត្រូវគ្នានឹងសំណើសុំនេះទេ",
        "powersearch-legend": "ស្វែងរកថ្នាក់ខ្ពស់",
        "powersearch-ns": "ស្វែងរកក្នុងលំហឈ្មោះ៖",
-       "powersearch-redir": "បញ្ជីការបញ្ជូនបន្ត",
        "powersearch-togglelabel": "គូសធីក៖",
        "powersearch-toggleall": "ទាំងអស់",
        "powersearch-togglenone": "ទទេ",
        "prefs-advancedsearchoptions": "ជំរើសថ្នាក់ខ្ពស់",
        "prefs-advancedwatchlist": "ជំរើសថ្នាក់ខ្ពស់",
        "prefs-displayrc": "ជំរើសការបង្ហាញ",
-       "prefs-displaysearchoptions": "ជំរើសការបង្ហាញ",
        "prefs-displaywatchlist": "ជំរើសការបង្ហាញ",
        "prefs-tokenwatchlist": "កូនសោរ",
        "prefs-diffs": "ភាពខុសគ្នា",
        "recentchanges-legend-heading": "''កំណត់សម្គាល់៖'''",
        "recentchanges-legend-newpage": "(មើលផងដែរនូវ [[Special:NewPages|បញ្ជីទំព័រថ្មី]])",
        "rcnotefrom": "ខាងក្រោមនេះជាបន្លាស់ប្ដូរនានាគិតចាប់តាំងពី '''$2''' (បង្ហាញអតិបរមាចំនួន '''$1''')។",
-       "rclistfrom": "បង្ហាញបន្លាស់ប្ដូរថ្មីៗចាប់តាំងពី $1",
+       "rclistfrom": "បង្ហាញបន្លាស់ប្ដូរថ្មីៗចាប់តាំងពី $3 $2",
        "rcshowhideminor": "$1កំណែប្រែ​តិចតួច",
        "rcshowhideminor-show": "បង្ហាញ​",
        "rcshowhideminor-hide": "លាក់",
        "watchlist-details": "{{PLURAL:$1|$1 page|ទំព័រ $1}}នៅក្នុងបញ្ជីតាមដានរបស់អ្នក ដោយមិនរាប់បញ្ចូលទំព័រពិភាក្សា។",
        "wlheader-enotif": "បើកប្រើការផ្ដល់ដំណឹងតាមរយៈអ៊ីមែល។",
        "wlheader-showupdated": "ទំព័រដែលត្រូវបានផ្លាស់ប្តូរតាំងពីពេលចូលមើលចុងក្រោយរបស់អ្នក ត្រូវបានបង្ហាញជា '''អក្សរដិត'''។",
-       "watchmethod-recent": "ឆែកមើលកំណែប្រែថ្មីៗចំពោះទំព័រត្រូវបានតាមដាន",
-       "watchmethod-list": "ឆែកមើលទំព័រត្រូវបានតាមដានចំពោះកំណែប្រែថ្មីៗ",
-       "watchlistcontains": "បញ្ជីតាមដាន របស់អ្នក មាន $1 {{PLURAL:$1|ទំព័រ|ទំព័រ}}។",
-       "iteminvalidname": "មានបញ្ហាជាមួយនឹង'$1'​។ ឈ្មោះគឺមិនត្រឹមត្រូវ...",
        "wlshowlast": "បង្ហាញ $1ម៉ោងចុងក្រោយ $2ថ្ងៃចុងក្រោយ ឬ$3",
        "watchlist-options": "ជម្រើសនានាក្នុងបញ្ជីតាមដាន",
        "watching": "កំពុង​តាមដាន...",
        "enotif_lastvisited": "ពិនិត្យ $1 សម្រាប់គ្រប់បន្លាស់ប្តូរតាំងពីពេលចូលមើលចុងក្រោយ។",
        "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ដើម្បីផ្លាស់ប្តូរការកំណត់បញ្ជីតាមដានរបស់អ្នក, សូមទៅកាន់\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\n\nដើម្បីដកទំព័រចេញពីបញ្ជីតាមដានរបស់អ្នក, សូមទៅកាន់\n$UNWATCHURL\n\nមតិ​យោបល់​និងជំនួយបន្ថែម ៖\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "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ដើម្បីផ្លាស់ប្តូរការកំណត់បញ្ជីតាមដានរបស់អ្នក, សូមទៅកាន់\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\n\nដើម្បីដកទំព័រចេញពីបញ្ជីតាមដានរបស់អ្នក, សូមទៅកាន់\n$UNWATCHURL\n\nមតិ​យោបល់​និងជំនួយបន្ថែម ៖\n$HELPPAGE",
        "created": "បានបង្កើត",
        "changed": "បានផ្លាស់ប្តូរ",
        "deletepage": "លុបទំព័រចោល",
        "blockip": "ដាក់ការហាមឃាត់លើអ្នកប្រើប្រាស់",
        "blockip-legend": "ដាក់ការហាមឃាត់លើអ្នកប្រើប្រាស់",
        "blockiptext": "សូម​ប្រើប្រាស់​សំណុំ​បែបបទ​ខាងក្រោម​ដើម្បី​ហាមឃាត់ការសរសេរ​ពី​អាសយដ្ឋាន IP ឬ​ឈ្មោះ​អ្នកប្រើប្រាស់ណាមួយ​។\nការ​ធ្វើ​បែបនេះ​គួរតែ​ធ្វើឡើង​ក្នុង​គោលបំណង​បង្ការ​ការប៉ុនប៉ង​បំផ្លាញ(vandalism)ដូច​ដែល​មាន​ចែង​ក្នុង[[{{MediaWiki:Policy-url}}|គោលការណ៍]]។\nសូមបំពេញមូលហេតុច្បាស់លាស់មួយខាងក្រោម (ឧទាហរណ៍៖ រាយឈ្មោះទំព័រនានាដែលត្រូវបានគេបំផ្លាញ)។",
-       "ipadressorusername": "អាសយដ្ឋានIP ឬអត្តនាម៖",
+       "ipaddressorusername": "អាសយដ្ឋានIP ឬអត្តនាម៖",
        "ipbexpiry": "រយៈពេលផុតកំណត់៖",
        "ipbreason": "មូលហេតុ៖",
        "ipbreason-dropdown": "*មូលហេតុហាមឃាត់ជាទូទៅ\n** ដាក់បញ្ចូលព័ត៌មានមិនពិត\n** ដកខ្លឹមទាំងស្រុងពីទំព័រនានា\n** ដាក់តំណភ្ជាប់ស្ប៉ាមតភ្ជាប់ទៅវិបសៃថ៍ខាងក្រៅ\n** បញ្ចូលខ្លឹមសារគ្មានន័យឬខ្លឹមសារមិនអាចយល់បានទៅក្នុងទំព័រនានា\n** អំពើគំរាមកំហែងឬរំលោភបំពានសិទ្ធិមនុស្ស\n** ប្រើប្រាស់គណនីច្រើនក្នុងគោលបំណងមិនល្អ\n** ប្រើប្រាស់ឈ្មោះដែលមិនអាចទទួលយកបាន",
        "newimages-summary": "ទំព័រពិសេសនេះបង្ហាញឯកសារដែលផ្ទុកឡើងចុងក្រោយគេ។",
        "newimages-legend": "តម្រងការពារ",
        "newimages-label": "ឈ្មោះរូបភាព៖",
-       "showhidebots": "($1រូបយន្ត)",
        "noimages": "គ្មានអ្វីសំរាប់មើលទេ។",
        "ilsubmit": "ស្វែងរក",
        "bydate": "តាមកាលបរិច្ឆេទ",
        "size-kilobytes": "$1គីឡូបៃ",
        "size-megabytes": "$1មេកាបៃ",
        "size-gigabytes": "$1ជីកាបៃ",
-       "livepreview-loading": "កំពុងផ្ទុក…",
-       "livepreview-ready": "កំពុងផ្ទុក… ហើយ!",
-       "livepreview-failed": "ការមើលជាមុនដោយផ្ទាល់មិនទទួលបានជោគជ័យទេ! សូមសាកល្បងជាមួយនឹងការមើលជាមុនតាមធម្មតា។",
-       "livepreview-error": "មិនអាចទាក់ទងទៅ៖ $1 \"$2\" បានទេ។\n\nសូមសាកល្បងប្រើការមើលមុនធម្មតា។",
        "lag-warn-normal": "បំលាស់ប្តូរថ្មីជាង {{PLURAL:$1|second|វិនាទី}}អាចមិនត្រូវបានបង្ហាញក្នុងបញ្ជីនេះ​។",
        "lag-warn-high": "ដោយសារប្រព័ន្ធបំរើការមូលដ្ឋានទិន្នន័យមានភាពយឺតយ៉ាវខ្លាំង បំលាស់ប្ដូរដែលថ្មីជាង $1 វិនាទីមិនអាចបង្ហាញបានទេនៅក្នុងបញ្ជីនេះ។",
-       "watchlistedit-numitems": "បញ្ជីតាមដានរបស់អ្នកមាន{{PLURAL:$1|១ចំណងជើង|$1ចំណងជើង}}ដោយមិនរាប់បញ្ចូលទំព័រពិភាក្សាទេ។",
-       "watchlistedit-noitems": "បញ្ជីតាមដាន របស់អ្នក គ្មានផ្ទុក ចំណងជើង។",
        "watchlistedit-normal-title": "កែប្រែបញ្ជីតាមដាន",
        "watchlistedit-normal-legend": "ដកចំណងជើងចេញពីបញ្ជីតាមដាន",
        "watchlistedit-normal-explain": "ចំណងជើងក្នុងបញ្ជីតាមដានរបស់អ្នកត្រូវបានបង្ហាញខាងក្រោម។\n\nដើម្បីដកចេញនូវចំណងជើងណាមួយ សូមចុច\"{{int:Watchlistedit-normal-submit}}\"។\n\nអ្នកអាច[[Special:EditWatchlist/raw|កែប្រែបញ្ជីឆៅ]]ផងដែរ។",
        "compare-submit": "ប្រៀបធៀប",
        "compare-invalid-title": "ចំណងជើងដែលអ្នកបានផ្ដល់អោយមិនត្រឹមត្រូវទេ",
        "compare-title-not-exists": "ចំណងជើងដែលអ្នកផ្ដល់អោយមិនមានទេ។",
-       "dberr-header": "វិគីនេះមានបញ្ហា",
        "dberr-problems": "សូមអភ័យទោស! វិបសាយនេះកំពុងជួបបញ្ហាបច្ចេកទេស។",
        "dberr-again": "សូមរង់ចាំប៉ុន្មាននាទីសិនហើយផ្ទុកឡើងវិញម្ដងទៀត។",
        "dberr-info": "(មិនអាចទាក់ទងទៅប្រភពទិន្នន័យរបស់ប្រព័ន្ធបំរើការបានទេ៖ $1)",
index ee72afb..a2e70a9 100644 (file)
@@ -21,7 +21,8 @@
                        "Teju2friends",
                        "The Evil IP address",
                        "VASANTH S.N.",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "ಲಿಂಕುಗಳ ಕೆಳಗೆ ಗೆರೆ ತೋರಿಸಿ",
        "readonly_lag": "ಅಡಿಯಲ್ಲಿರುವ ಡೇಟಾಬೇಸ್ ಸರ್ವರ್‍ಗಳು ಮೂಲ ಸರ್ವರ್ ಒಂದಿಗೆ ಸಮಾನತೆಗೆ ಬರುವವರೆಗೂ ಡೇಟಾಬೇಸ್ ಅನ್ನು ಯಾಂತ್ರಿಕವಾಗಿ ಮುಚ್ಚಲಾಗಿದೆ",
        "internalerror": "ಆಂತರಿಕ ದೋಷ",
        "internalerror_info": "ಆಂತರಿಕ ದೋಷ: $1",
-       "fileappenderrorread": "ಸೇರಿಸುವಾಗ \"$1\" ನ್ನು ಓದಲಾಗಿಲ್ಲ",
-       "fileappenderror": "\"$1\"ನ್ನು\"$2\" ರೊಂದಿಗೆ ಸೇರಿಸಲಾಗಿಲ್ಲ",
        "filecopyerror": "\"$1\" ಫೈಲ್ ಅನ್ನು \"$2\" ಗೆ ನಕಲಿಸಲಾಗಲಿಲ್ಲ.",
        "filerenameerror": "\"$1\" ಫೈಲನ್ನು \"$2\" ಎಂದು ಮರುನಾಮಕರಣ ಮಾಡಲು ಆಗಲಿಲ್ಲ.",
        "filedeleteerror": "\"$1\" ಫೈಲ್ ಅನ್ನು ಅಳಿಸಲಾಗಲಿಲ್ಲ.",
        "directorycreateerror": "\"$1\" ನಿದರ್ಶಕವನ್ನು ಸೃಷ್ಟಿಸಲಾಗಲಿಲ್ಲ.",
        "filenotfound": "\"$1\" ಫೈಲನ್ನು ಹುಡುಕಲಾಗಲಿಲ್ಲ.",
-       "fileexistserror": "ಫೈಲು \"$1\" ಅನ್ನು ಬರೆಯಲಾಗಲಿಲ್ಲ: ಫೈಲು ಆಗಲೆ ಇದೆ",
        "unexpected": "ಅನಿರೀಕ್ಷಿತ ಮೌಲ್ಯ: \"$1\"=\"$2\".",
        "formerror": "ದೋಷ: ಅರ್ಜಿ ಕಳುಹಿಸಲಾಗಲಿಲ್ಲ",
        "badarticleerror": "ಈ ಪುಟದ ಮೇಲೆ ನೀವು ಪ್ರಯತ್ನಿಸಿದ ಕಾರ್ಯವನ್ನು ನಡೆಸಲಾಗದು.",
        "userlogin-resetpassword-link": "ನಿಮ್ಮ ಪ್ರವೇಶಪದ ಮರೆತಿರೇ?",
        "userlogin-helplink2": "ಲಾಗಿನ್ ಆಗಲು ಸಹಾಯ",
        "userlogin-createanother": "ಇನ್ನೊಂದು ಖಾತೆಯನ್ನು ಸೃಷ್ಟಿಸಿ",
-       "createacct-join": "ನಿಮ್ಮ ಮಾಹಿತಿಯನ್ನು ಕೆಳಗೆ ನಮೂದಿಸಿ",
-       "createacct-another-join": "ಹೊಸ ಖಾತೆಯ ವಿವರಗಳನ್ನು ಈ ಕೆಳಗೆ ನಮೂದಿಸಿ.",
        "createacct-emailrequired": "ಇ-ಮೇಲ್ ವಿಳಾಸ:",
        "createacct-emailoptional": "ಮಿಂಚಂಚೆ ವಿಳಾಸ (ಐಚ್ಛಿಕ)",
        "createacct-email-ph": "ನಿಮ್ಮ ಇ-ಅಂಚೆ ವಿಳಾಸವನ್ನು ನಮೂದಿಸಿ",
        "userexists": "ನೀವು ನೀಡಿದ ಸದಸ್ಯರ ಹೆಸರು ಆಗಲೆ ಬಳಕೆಯಲ್ಲಿದೆ. ದಯವಿಟ್ಟು ಬೇರೊಂದು ಹೆಸರನ್ನು ಆಯ್ಕೆ ಮಾಡಿ.",
        "loginerror": "ಲಾಗಿನ್ ದೋಷ",
        "createacct-error": "ಖಾತೆ ನಿರ್ಮಾಣ ತ್ರುಟಿ",
-       "createaccounterror": "ಖಾತೆ ನಿರ್ಮಾಣ ಮಾಡಲಿಕ್ಕೆ ಆಗಲಿಲ್ಲ.",
+       "createaccounterror": "$1 ಖಾತೆ ನಿರ್ಮಾಣ ಮಾಡಲಿಕ್ಕೆ ಆಗಲಿಲ್ಲ.",
        "nocookiesnew": "ನಿಮ್ಮ ಬಳಕೆದಾರ ಖಾತೆಯು ಸೃಷ್ಟಿತವಾಗಿದೆ, ಆದರೆ ನೀವು ಲಾಗ್ ಇನ್ ಆಗಿಲ್ಲ.\n{{SITENAME}} ಲಾಗ್ ಇನ್ ಮಾಡಲು cookieಗಳನ್ನು ಉಪಯೋಗಿಸುತ್ತದೆ.\nನಿಮ್ಮ ಗಣಕಯಂತ್ರದಲ್ಲಿ cookieಗಳು ನಿಷಿದ್ಧವಾಗಿದೆ.\nದಯವಿಟ್ಟು ಈ ನಿಷೇಧವನ್ನು ತೆಗೆದು, ನಿಮ್ಮ ಬಳಕೆದಾರ ಹೆಸರು ಮತ್ತು ಪ್ರವೇಶಪದಗಳನ್ನು ಉಪಯೋಗಿಸಿ ಲಾಗ್ ಇನ್ ಆಗಿ.",
        "nocookieslogin": "{{SITENAME}} ಬಳಕೆದಾರರನ್ನು ಲಾಗ್ ಇನ್ ಮಾಡಲು cookieಗಳನ್ನು ಉಪಯೋಗಿಸುತ್ತದೆ.\nನಿಮ್ಮ ಗಣಕಯಂತ್ರದಲ್ಲ್ cookieಗಳ ಉಪಯೋಗ ನಿಷಿದ್ಧವಾಗಿದೆ.\nದಯವಿಟ್ಟು ಆ ನಿಷೇಧವನ್ನು ತೆಗೆದು ಮತ್ತೊಮ್ಮೆ ಪ್ರಯತ್ನಿಸಿ.",
        "noname": "ನೀವು ಸರಿಯಾದ ಬಳಕೆದಾರ ಹೆಸರನ್ನು ಸೂಚಿಸಿಲ್ಲ.",
        "loginsuccesstitle": "ಲಾಗಿನ್ ಯಶಸ್ವಿ",
        "loginsuccess": "ನೀವು ಈಗ \"$1\" ಆಗಿ ವಿಕಿಪೀಡಿಯಕ್ಕೆ ಲಾಗಿನ್ ಆಗಿದ್ದೀರಿ.",
-       "nosuchuser": "\"$1\" ಹೆಸರಿನ ಯಾವ ಸದಸ್ಯರೂ ಇಲ್ಲ.\nಕಾಗುಣಿತವನ್ನು ಪರೀಕ್ಷಿಸಿ, ಅಥವಾ [[Special:UserLogin/signup|ಹೊಸ ಸದಸ್ಯತ್ವ ಖಾತೆಯನ್ನು ಸೃಷ್ಟಿಸಿ]].",
+       "nosuchuser": "\"$1\" à²¹à³\86ಸರಿನ à²¯à²¾à²µ à²¸à²¦à²¸à³\8dಯರà³\82 à²\87ಲà³\8dಲ.\nಸದಸà³\8dಯನಾಮದಲà³\8dಲಿ à²²à²\98à³\81 à²®à²¤à³\8dತà³\81 à²¦à³\80ರà³\8dà²\98 à²\85à²\95à³\8dಷರà²\97ಳಲà³\8dಲಿ à²µà³\8dಯತà³\8dಯಾಸವಿದà³\86.\nà²\95ಾà²\97à³\81ಣಿತವನà³\8dನà³\81 à²ªà²°à³\80à²\95à³\8dಷಿಸಿ, à²\85ಥವಾ [[Special:UserLogin/signup|ಹà³\8aಸ à²¸à²¦à²¸à³\8dಯತà³\8dವ à²\96ಾತà³\86ಯನà³\8dನà³\81 à²¸à³\83ಷà³\8dà²\9fಿಸಿ]].",
        "nosuchusershort": "\"$1\" ಹೆಸರಿನ ಸದಸ್ಯರು ಯಾರೂ ಇಲ್ಲ.\nಹೆಸರಲ್ಲಿ ಕಾಗುಣಿತ ತಪ್ಪಿದೆಯೆ ಎಂದು ಪರೀಕ್ಷಿಸಿ.",
        "nouserspecified": "ನೀವು ಒಂದು ಸದಸ್ಯತ್ವದ ಹೆಸರನ್ನು ಸೂಚಿಸಬೇಕು.",
        "login-userblocked": "ಈ ಬಳಕೆದಾರರನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ. ಲಾಗಿನ್ ಆಗಲು ಸಾದ್ಯವಿಲ್ಲ.",
        "passwordtooshort": "ಪ್ರವೇಶಪದ ಕನಿಷ್ಟ {{PLURAL:$1|೧ ಅಕ್ಷರವನ್ನು|$1 ಅಕ್ಷರಗಳನ್ನು}} ಹೊಂದಿರಬೇಕು.",
        "password-name-match": "ನಿಮ್ಮ ಬಳಕೆದಾರ ಹೆಸರಿನಿಂದ ಪ್ರವೇಶಪದ ವಿಭಿನ್ನವಾಗಿರಬೇಕು.",
        "password-login-forbidden": "ಈ ಬಳಕೆದಾರರ ಹೆಸರು ಮತ್ತು ಪ್ರವೇಶಪದವನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ.",
-       "mailmypassword": "ಹà³\8aಸ à²ªà³\8dರವà³\87ಶ à²ªà²¦à²µà²¨à³\8dನà³\81 à²\87-à²\85à²\82à²\9aà³\86 à²®à³\82ಲà²\95 à²\95ಳà³\81ಹಿಸಿ",
+       "mailmypassword": "ಪà³\8dರವà³\87ಶಪದವನà³\8dನà³\81 à²ªà³\81ನà²\83ಸà³\8dಥಾಪಿಸಿ.",
        "passwordremindertitle": "{{SITENAME}}ಗೆ ಹೊಸ ತಾತ್ಕಾಲಿಕ ಪ್ರವೇಶ ಪದ",
        "passwordremindertext": "{{SITENAME}} ($4) ಸೈಟಿಗೆ ಹೊಸ ಪ್ರವೇಶಪದವನ್ನು $1 ಐ.ಪಿ. ವಿಳಾಸದಿಂದ ಕೋರಲಾಗಿದೆ.\nಸದಸ್ಯ \"$2\" ಅವರ ಹೊಸ ಪ್ರವೇಶಪದ ಈಗ \"$3\".\nನೀವು ಲಾಗ್ ಇನ್ ಆಗಿ ತಮ್ಮ ಪ್ರವೇಶಪದವನ್ನು ಬದಲಾಯಿಸಿ.\n\nನೀವು ಈ ಕೋರಿಕೆಯನ್ನು ಮಾಡಿಲ್ಲದಿದ್ದರೆ, ಅಥವ ನೀವು ನಿಮ್ಮ ಹಳೆಯ ಪ್ರವೇಶಪದವನ್ನು ನೆನಪಿಸಿಕೊಂಡರೆ ಈ ಮಾಹಿತಿಗೆ ಗಮನ ನೀಡದೆ ನಿಮ್ಮ ಹಳೆಯ ಪ್ರವೇಶಪದವನ್ನು ಉಪಯೋಗಿಸಲು ಮುಂದುವರೆಸಿರಿ.",
        "noemail": "ಸದಸ್ಯ \"$1\" ಅವರ ಹೆಸರಿನಲ್ಲಿ ಯಾವ ಇ-ಅಂಚೆ ವಿಳಾಸವೂ ದಾಖಲಾಗಿಲ್ಲ.",
        "savearticle": "ಪುಟವನ್ನು ಉಳಿಸಿ",
        "preview": "ಮುನ್ನೋಟ",
        "showpreview": "ಮುನ್ನೋಟ",
-       "showlivepreview": "ಸಜೀವ ಮುನ್ನೋಟ",
        "showdiff": "ಬದಲಾವಣೆಗಳನ್ನು ತೋರಿಸು",
        "anoneditwarning": "'''ಎಚ್ಚರ:''' ನೀವು ಲಾಗ್ ಇನ್ ಆಗಿಲ್ಲ. ನಿಮ್ಮ ಐಪಿ ವಿಳಾಸವು ಪುಟದ ಸಂಪಾದನೆಗಳ ಇತಿಹಾಸದಲ್ಲಿ ದಾಖಲಾಗುತ್ತದೆ.",
        "anonpreviewwarning": "''ನೀವು ಲಾಗಿನ್ ಆಗಿಲ್ಲ . ಉಳಿಸಲು ಪ್ರಯತ್ನಿಸಿದಾಗ ನಿಮ್ಮ IP ವಿಳಾಸವನ್ನು ಈ ಪುಟದ ಸಂಪಾದನೆ ಇತಿಹಾಸದಲ್ಲಿ ನಮೂದಿಸಲಗುವುದು.''",
        "edit-gone-missing": "ಪುಟವನ್ನು ಪ್ರಸ್ತುತಗೊಳಿಸಲು ಸಾದ್ಯವಿಲ್ಲ, ಪುಟವು ಬಹುಶ: ಅಳಿಸಲ್ಪಟ್ಟಿರಬಹುದು",
        "edit-conflict": "ಸಂಪಾದನಾ ಘರ್ಷಣೆ.",
        "edit-no-change": "ನಿಮ್ಮ ಸಂಪಾದನೆಯನ್ನು ಕಡೆಗಣಿಸಲಾಗಿದೆ ಏಕೆಂದರೆ ಪಠ್ಯದಲ್ಲಿ ಯಾವುದೇ ಬದಲಾವಣೆ ಮಾಡಲಾಗಿಲ್ಲ್ಲ",
-       "postedit-confirmation": "ನಿಮ್ಮ ಸಂಪಾದನೆಯನ್ನು ಉಳಿಸಲಾಗಿದೆ.",
+       "postedit-confirmation-saved": "ನಿಮ್ಮ ಸಂಪಾದನೆಯನ್ನು ಉಳಿಸಲಾಗಿದೆ.",
        "edit-already-exists": "ಹೊಸ ಪುಟವನ್ನು ಸೃಷ್ಟಿಸಲಾಗಲಿಲ್ಲ.\nಅದು ಆಗಲೆ ಅಸ್ಥಿತ್ವದಲ್ಲಿದೆ.",
        "content-model-javascript": "ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್",
        "content-model-css": "ಸಿಎಸ್‍ಎಸ್",
        "revdelete-hide-user": "ಸಂಪಾದಕರ ಬಳಕೆಯ ಹೆಸರು/IP ಅಡಗಿಸು",
        "revdelete-hide-restricted": "ಈ ನಿಬಂಧನೆಗಳನ್ನು ನಿರ್ವಾಹಕರಿಗೂ ಅನ್ವಯಿಸು ಮತ್ತು ಈ interface ಗೆ ಬೀಗ ಹಾಕು",
        "revdelete-radio-same": "(ಬದಲಾಯಿಸಬೇಡಿ)",
-       "revdelete-radio-set": "ಹà³\8cದà³\81",
+       "revdelete-radio-set": "à²\85ಡà²\97ಿದ",
        "revdelete-radio-unset": "ಇಲ್ಲ",
        "revdelete-suppress": "ನಿರ್ವಾಹಕರಿಂದ ಮತ್ತಿತರರಿಂದ ಬಂದ ಮಾಹಿತಿಯನ್ನು ಅಡಗಿಸು",
        "revdelete-unsuppress": "ಪುನಃ ಸ್ಥಾಪಿಸಿದ ಬದಲಾವಣೆಗಳ ಮೇಲಿನ ನಿಬಂಧನೆಗಳನ್ನು ತೆಗೆ",
        "searchmenu-exists": "'''\"[[:$1]]\" ಹೆಸರಿನ ಪುಟ ಈ ವಿಕಿಯಲ್ಲಿದೆ.'''",
        "searchmenu-new": "'''''[[:$1]]'' ಪುಟವನ್ನು ಈ ವಿಕಿಯಲ್ಲಿ ಸೃಷ್ಟಿಸಿ!'''",
        "searchprofile-articles": "ಲೇಖನ ಪುಟ",
-       "searchprofile-project": "ಸಹಾಯ ಮತ್ತು ಯೋಜನೆ ಪುಟಗಳು",
        "searchprofile-images": "ಬಹುಮಾಧ್ಯಮ",
        "searchprofile-everything": "ಪ್ರತಿಯೊಂದು",
        "searchprofile-advanced": "ಪರಿಣತ",
        "searchprofile-articles-tooltip": "$1 ನಲ್ಲಿ ಹುಡುಕಿ",
-       "searchprofile-project-tooltip": "$1 ನಲ್ಲಿ ಹುಡುಕಿ",
        "searchprofile-images-tooltip": "ಹುದುಕಿ  ಹಲೆಯನು",
        "searchprofile-everything-tooltip": "ಹುದುಕಿ ಯಲ ಸುಮನು (ಇಥಿಯದಿ ಮಾಥು ಹಲೆ)",
        "searchprofile-advanced-tooltip": "ಹುಧುಕಿ ನಮ ಜಾಗ ಹೆಸರುಸ್ತಲ್ಲ",
        "search-nonefound": "ನಿಮ್ಮ ವಿಚಾರಣೆಗೆ ತಕ್ಕ ಫಲಿತಾಂಶಗಳಿಲ್ಲ.",
        "powersearch-legend": "ಮುಂದುವರೆದ ಹುಡುಕಾಟ",
        "powersearch-ns": "ಈ ಪುಟ ಪ್ರಬೇಧಗಳಲ್ಲಿ ಹುಡುಕು:",
-       "powersearch-redir": "ಪುನರ್ನಿರ್ದೇಶನಗಳ ಪಟ್ಟಿ",
        "powersearch-togglelabel": "ಪರೀಕ್ಷಿಸಿ:",
        "powersearch-toggleall": "ಎಲ್ಲಾ",
        "powersearch-togglenone": "ಯಾವುದೂ ಇಲ್ಲ",
        "prefs-files": "ಫೈಲುಗಳು",
        "youremail": "ಇ-ಅಂಚೆ:",
        "username": "ಸದಸ್ಯತ್ವದ ಹೆಸರು:",
-       "uid": "ಬಳಕೆದಾರ ID:",
        "prefs-memberingroups": "ಈ {{PLURAL:$1|ಗುಂಪಿನ|ಗುಂಪುಗಳ}} ಸದಸ್ಯ:",
        "yourrealname": "ನಿಜ ಹೆಸರು:",
        "yourlanguage": "ಭಾಷೆ:",
        "badsiglength": "ನಿಮ್ಮ ಅಡ್ಡಹೆಸರು ತುಂಬಾ ಉದ್ದವಾಗಿದೆ.\nಅದು $1 {{PLURAL:$1|ಅಕ್ಷರಕ್ಕಿಂತ|ಅಕ್ಷರಗಳಿಗಿಂತ}} ಕಡಿಮೆ ಇರಬೇಕು.",
        "yourgender": "ಲಿಂಗ:",
        "gender-unknown": "ನಾನು ಹೇಳಲಿಚ್ಛಿಸುವುದಿಲ್ಲ",
-       "gender-male": "à²\97à²\82ಡಸà³\81",
-       "gender-female": "ಸà³\8dತà³\8dರà³\80",
+       "gender-male": "à²\85ವನà³\81 à²µà²¿à²\95ಿ à²ªà³\81à²\9fà²\97ಳನà³\8dನà³\81 à²¸à²\82ಪಾದಿಸà³\81ತà³\8dತಾನà³\86",
+       "gender-female": "à²\85ವಳà³\81 à²µà²¿à²\95ಿ à²ªà³\81à²\9fà²\97ಳನà³\8dನà³\81 à²¸à²\82ಪಾದಿಸà³\81ತà³\8dತಾಳà³\86",
        "email": "ಇ-ಅಂಚೆ",
        "prefs-help-realname": "ನಿಜ ಹೆಸರು ನೀಡುವುದು ಐಚ್ಛಿಕ. ನೀವು ಅದನ್ನು ನೀಡಿದಲ್ಲಿ ನಿಮ್ಮ ಕಾಣಿಕೆಗಳಿಗೆ ನಿಮಗೆ ಮನ್ನಣೆ ನೀಡಲಾಗುವುದು.",
        "prefs-help-email": "ಇ-ಅಂಚೆ ವಿಳಾಸ ಕಡ್ಡಾಯವಲ್ಲ, ಆದರೆ ನೀವು ಅದನ್ನು ನೀಡಿದರೆ ನೀವು ನಿಮ್ಮ ಪ್ರವೇಶ ಪದವನ್ನು ಮರೆತರೆ ಅದನ್ನು ನಿಮಗೆ ಇ-ಅಂಚೆಯಿಂದ ಕಳುಹಿಸಿಬಹುದು.",
        "prefs-advancedsearchoptions": "ಪರಿಣತ ಇಚ್ಛೆಗಳು",
        "prefs-advancedwatchlist": "ಪರಿಣತ ಇಚ್ಛೆಗಳು",
        "prefs-displayrc": "ಪ್ರದರ್ಶನ ಆಯ್ಕೆಗಳು",
-       "prefs-displaysearchoptions": "ಪ್ರದರ್ಶನ ಆಯ್ಕೆಗಳು",
        "prefs-displaywatchlist": "ಪ್ರದರ್ಶನ ಆಯ್ಕೆಗಳು",
        "email-address-validity-valid": "ಮಿಂಚಂಚೆ ವಿಳಾಸವು ಸಿಂಧುವೆಂದು ತೋರುತ್ತದೆ",
        "email-address-validity-invalid": "ಸಿಂಧುವಾದ ಮಿಂಚಂಚೆ ವಿಳಾಸವನ್ನು ನಮೂದಿಸಿ",
        "recentchanges-label-bot": "ಈ ಸಂಪಾದನೆಯನ್ನು ಒಂದು ಬಾಟ್ ಮಾಡಿದೆ",
        "recentchanges-label-unpatrolled": "ಈ ಸಂಪಾದನೆಯನ್ನು ಇನ್ನೂ ಪರೀಕ್ಷೆಗೆ ಒಳಪಡಿಸಿಲ್ಲ",
        "rcnotefrom": "'''$2''' ಇಂದ ಆಗಿರುವ ಬದಲಾವಣೆಗಳು ಕೆಳಗಿವೆ (ಕೊನೆಯ '''$1'''ರವರೆಗೆ ತೋರಿಸಲಾಗಿದೆ).",
-       "rclistfrom": "$1 ಇಂದ ಪ್ರಾರಂಭಿಸಿ ಮಾಡಲಾದ ಬದಲಾವಣೆಗಳನ್ನು ನೋಡಿ",
+       "rclistfrom": "$3 $2 ಇಂದ ಪ್ರಾರಂಭಿಸಿ ಮಾಡಲಾದ ಬದಲಾವಣೆಗಳನ್ನು ನೋಡಿ",
        "rcshowhideminor": "ಚಿಕ್ಕಪುಟ್ಟ ಬದಲಾವಣೆಗಳನ್ನು $1",
        "rcshowhideminor-show": "ತೊರಿಸಿ",
        "rcshowhideminor-hide": "ಮರೆ ಮಾಡಿ",
        "logempty": "ದಾಖಲೆಗಳಲ್ಲಿ ಇದಕ್ಕೆ ಹೋಲುವ ಯಾವ ವಸ್ತುವೂ ಇಲ್ಲ.",
        "log-title-wildcard": "ಈ ಪದಗಳಿಂದ ಪ್ರಾರಂಭವಾಗುವ ಶೀರ್ಷಿಕೆಗಳನ್ನು ಹುಡುಕು",
        "allpages": "ಎಲ್ಲ ಪುಟಗಳು",
-       "alphaindexline": "$1 ಇಂದ $2",
        "nextpage": "ಮುಂದಿನ ಪುಟ ($1)",
        "prevpage": "ಹಿಂದಿನ ಪುಟ ($1)",
        "allpagesfrom": "ಇದರಿಂದ ಪ್ರಾರಂಭವಾಗುವ ಪುಟಗಳನ್ನು ತೋರಿಸು:",
        "watchnologin": "ಲಾಗಿನ್ ಆಗಿಲ್ಲ",
        "addwatch": "ವೀಕ್ಷಣಾಪಟ್ಟಿಗೆ ಸೇರಿಸು",
        "addedwatchtext": "\"[[:$1]]\" ಪುಟವನ್ನು ನಿಮ್ಮ [[Special:Watchlist|ವೀಕ್ಷಣಾಪಟ್ಟಿಗೆ]] ಸೇರಿಸಲಾಗಿದೆ. ಈ ಪುಟದ ಮತ್ತು ಇದರ ಚರ್ಚಾ ಪುಟದ ಮುಂದಿನ ಬದಲಾವಣೆಗಳು ವೀಕ್ಷಣಾ ಪಟ್ಟಿಯಲ್ಲಿ ಕಾಣಸಿಗುತ್ತವೆ, ಮತ್ತು [[Special:RecentChanges|ಇತ್ತೀಚೆಗಿನ ಬದಲಾವಣೆಗಳ]] ಪಟ್ಟಿಯಲ್ಲಿ ಈ ಪುಟಗಳನ್ನು ದಪ್ಪಕ್ಷರಗಳಲ್ಲಿ ಕಾಣಿಸಲಾಗುವುದು.\n\n<p>ಈ ಪುಟವನ್ನು ವೀಕ್ಷಣಾ ಪಟ್ಟಿಯಿಂದ ತೆಗೆಯಬಯಸಿದಲ್ಲಿ, ಮೇಲ್ಪಟ್ಟಿಯಲ್ಲಿ ಕಾಣಿಸಿರುವ \"ವೀಕ್ಷಣಾ ಪುಟದಿಂದ ತೆಗೆ\" ಅನ್ನು ಕ್ಲಿಕ್ಕಿಸಿ.",
+       "addedwatchtext-short": "\"$1\" ಪುಟವನ್ನು ನಿಮ್ಮ ವೀಕ್ಷಣಾಪಟ್ಟಿಗೆ ಸೇರಿಸಲಾಗಿದೆ.",
        "removewatch": "ವೀಕ್ಷಣಾಪಟ್ಟಿಯಿಂದ ತೆಗೆ",
        "removedwatchtext": "\"[[:$1]]\" ಪುಟವನ್ನು ನಿಮ್ಮ [[Special:Watchlist|ವೀಕ್ಷಣಾಪಟ್ಟಿಯಿಂದ]] ತೆಗೆಯಲಾಗಿದೆ.",
+       "removedwatchtext-short": "\"$1\" ಪುಟವನ್ನು ನಿಮ್ಮ ವೀಕ್ಷಣಾಪಟ್ಟಿಂದ ತೆಗೆಯಲಾಗಿದೆ.",
        "watch": "ವೀಕ್ಷಿಸಿ",
        "watchthispage": "ಈ ಪುಟವನ್ನು ವೀಕ್ಷಿಸಿ",
        "unwatch": "ವೀಕ್ಷಣಾ ಪಟ್ಟಿಯಿಂದ ತೆಗೆ",
        "watchlist-details": "ಚರ್ಚೆ ಪುಟಗಳನ್ನು ಹೊರತುಪಡಿಸಿ, ನಿಮ್ಮ ವೀಕ್ಷಣಾಪಟ್ಟಿಯಲ್ಲಿ {{PLURAL:$1|$1 ಪುಟ ಇದೆ|$1 ಪುಟಗಳು ಇವೆ}}.",
        "wlheader-enotif": "ಮಿಂಚಂಚೆ ಸೂಚನೆಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ.",
        "wlheader-showupdated": "ನೀವು ಕೊನೆಯ ಬಾರಿ ಭೇಟಿ ನೀಡಿದ ನಂತರ ಬದಲಾವಣೆಗಳು ಆಗಿರುವ ಪುಟಗಳು '''ದಪ್ಪ ಅಕ್ಷರಗಳಲ್ಲಿ''' ತೋರಿಸಲಾಗಿದೆ",
-       "watchmethod-recent": "ಇತ್ತೀಚಿನ ಸಂಪಾದನೆಗಳಲ್ಲಿ ವೀಕ್ಷಣಾಪಟ್ಟಿಗೆ ಸೇರುವ ಪುಟಗಳ ಹುಡುಕು",
-       "watchmethod-list": "ವೀಕ್ಷಣಾಪಟ್ಟಿಗೆ ಸೇರುವ ಪುಟಗಳಲ್ಲಿ ಇತ್ತೀಚಿನ ಸಂಪಾದನೆಗಳಿಗೆ ಹುಡುಕು",
-       "watchlistcontains": "ನಿಮ್ಮ ವೀಕ್ಷಣಾಪಟ್ಟಿಯಲ್ಲಿ $1 {{PLURAL:$1|ಪುಟ|ಪುಟಗಳು}} ಇವೆ.",
        "wlshowlast": "ಕೊನೆಯ $1 ಗಂಟೆ $2 ದಿನಗಳು $3 ಅನ್ನು ತೋರಿಸು",
        "watchlist-options": "ವೀಕ್ಷಣಾಪಟ್ಟಿ ಆಯ್ಕೆಗಳು",
        "watching": "ವೀಕ್ಷಣೆಗೆ ಸೇರಿಸಲಾಗುತ್ತಿದೆ...",
        "unblock": "ಬಳಕೆದಾರನ ತಡೆಯನ್ನು ತೆಗೆ",
        "blockip": "ಈ ಸದಸ್ಯನನ್ನು ತಡೆ ಹಿಡಿಯಿರಿ",
        "blockip-legend": "ಬಳಕೆದಾರನನ್ನು ತಡೆಹಿಡಿ",
-       "ipadressorusername": "IP ವಿಳಾಸ ಅಥವ ಬಳಕೆಯ ಹೆಸರು:",
+       "ipaddressorusername": "IP ವಿಳಾಸ ಅಥವ ಬಳಕೆಯ ಹೆಸರು:",
        "ipbexpiry": "ಅಂತ್ಯ:",
        "ipbreason": "ಕಾರಣ:",
        "ipbreason-dropdown": "*ತಡೆಹಿಡಿಯುವಿಕೆಗೆ ಸಾಧಾರಣ ಕಾರಣಗಳು\n** ತಪ್ಪು ಮಾಹಿತಿಯನ್ನು ಸೇರಿಸುವುದು\n** ಪುಟದಲ್ಲಿರುವ ಮಾಹಿತಿಯನ್ನು ತೆಗೆಯುವುದು\n** ಬಾಹ್ಯ ತಾಣಗಳಿಗೆ ಜಾಹೀರಾತಿಗೆ ಕೊಂಡಿ ಸೇರಿಸುವುದು\n** ಪುಟಗಳಲ್ಲಿ ಅರ್ಥವಿಲ್ಲದ ಮಾಹಿತಿ ಸೇರಿಸುವುದು\n** ಬೇರೆಯವರನ್ನು ಬೆದರಿಸುವ/ಕಾಡುವ ವರ್ತನೆ\n** ಒಂದಕ್ಕಿಂತ ಹೆಚ್ಚು ಖಾತೆಗಳ ದುರುಪಯೋಗ\n** ಒಪ್ಪಿಗೆಯಿರದಂತಹ ಬಳಕೆಯ ಹೆಸರು",
        "newimages": "ಹೊಸ ಫೈಲುಗಳ ಪ್ರದರ್ಶನ",
        "imagelisttext": "ಕೆಳಗೆ ಇರುವುದು '''$1''' {{PLURAL:$1|ಫೈಲಿನ|ಫೈಲುಗಳ}} ಪಟ್ಟಿ, $2 ಏರ್ಪಾಟಾಗಿದೆ.",
        "newimages-summary": "ಈ ವಿಶೇಷ ಪುಟವು ಕೊನೆಯದಾಗಿ ಅಪ್ಲೋಡ್ ಆಗಿರುವ ಫೈಲುಗಳನ್ನು ತೋರುತ್ತದೆ",
-       "showhidebots": "($1 ಬಾಟ್‍ಗಳು)",
        "noimages": "ನೋಡಲು ಏನೂ ಇಲ್ಲ.",
        "ilsubmit": "ಹುಡುಕು",
        "bydate": "ದಿನಾಂಕಕ್ಕನುಗುಣವಾಗಿ",
        "autoredircomment": "[[$1]] ಪುಟಕ್ಕೆ ಪುನರ್ನಿರ್ದೇಶನ",
        "autosumm-new": "ಹೊಸ ಪುಟ: $1",
        "lag-warn-normal": "$1 {{PLURAL:$1|ಕ್ಷಣಕ್ಕಿಂತ|ಕ್ಷಣಗಳಿಗಿಂತ}} ಹೊಸದಾದ ಬದಲಾವಣೆಗಳು ಈ ಪಟ್ಟಿಯಲ್ಲಿ ತೋರದೆ ಇರಬಹುದು.",
-       "watchlistedit-numitems": "ಚರ್ಚೆ ಪುಟಗಳನ್ನು ಹೊರತುಪಡಿಸಿ, ನಿಮ್ಮ ವೀಕ್ಷಣಾಪಟ್ಟಿಯಲ್ಲಿ {{PLURAL:$1|೧ ಶೀರ್ಷಿಕೆ ಇದೆ|$1 ಶೀರ್ಷಿಕೆಗಳು ಇವೆ}}.",
-       "watchlistedit-noitems": "ನಿಮ್ಮ ವೀಕ್ಷಣಾಪಟ್ಟಿಯಲ್ಲಿ ಯಾವುದೂ ಪುಟಗಳಿಲ್ಲ.",
        "watchlistedit-normal-title": "ವೀಕ್ಷಣಾಪಟ್ಟಿಯನ್ನು ಸಂಪಾದಿಸು",
        "watchlistedit-normal-legend": "ವೀಕ್ಷಣಾಪಟ್ಟಿಯಿಂದ ಶೀರ್ಷಿಕೆಗಳನ್ನು ತೆಗೆ",
        "watchlistedit-normal-explain": "ನಿಮ್ಮ ವೀಕ್ಷಣಾಪಟ್ಟಿಯಲ್ಲಿ ಇರುವ ಶೀರ್ಷಿಕೆಗಳನ್ನು ಕೆಳಗೆ ತೋರಿಸಲಾಗಿದೆ.\nಯಾವುದೇ ಶೀರ್ಷಿಕೆಯನ್ನು ತಗೆಯಲು, ಅದರ ಪಕ್ಕದಲ್ಲಿರುವ ಚೌಕವನ್ನು ಗುರುತು ಮಾಡಿ ಮತ್ತು \"ಶೀರ್ಷಿಕೆಗಳನ್ನು ತೆಗೆ\" ಗುಂಡಿಯನ್ನು ಒತ್ತಿ.\nನೀವು ವೀಕ್ಷಣಾಪಟ್ಟಿಯನ್ನು [[Special:EditWatchlist/raw|ನೇರವಾಗಿ ಸಂಪಾದಿಸಬಹುದು]] ಕೂಡ.",
        "watchlistedit-raw-titles": "ಶೀರ್ಷಿಕೆಗಳು:",
        "watchlistedit-raw-added": "{{PLURAL:$1|೧ ಶೀರ್ಷಿಕೆಯನ್ನು|$1 ಶೀರ್ಷಿಕೆಗಳನ್ನು}} ಸೇರಿಸಲಾಯಿತು:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|೧ ಶೀರ್ಷಿಕೆಯನ್ನು|$1 ಶೀರ್ಷಿಕೆಗಳನ್ನು}} ತೆಗೆಯಲಾಯಿತು:",
+       "watchlistedit-clear-titles": "ಶೀರ್ಷಿಕೆಗಳು:",
        "watchlisttools-view": "ಸೂಚಿಸಲ್ಪಟ್ಟ ಬದಲಾವಣೆಗಳನ್ನು ವೀಕ್ಷಿಸಿ",
        "watchlisttools-edit": "ವೀಕ್ಷಣಾಪಟ್ಟಿಯನ್ನು ನೋಡು ಮತ್ತು ಸಂಪಾದಿಸು",
        "watchlisttools-raw": "ಮೂಲ ವೀಕ್ಷಣಾಪಟ್ಟಿಯನ್ನು ಸಂಪಾದಿಸು",
index 6a8c5d2..bda0f5b 100644 (file)
@@ -47,7 +47,7 @@
        "tog-extendwatchlist": "주시문서 목록에서 가장 최근의 편집만이 아닌 모든 편집을 보기",
        "tog-usenewrc": "최근 바뀜과 주시문서 목록의 문서별 그룹 바뀜",
        "tog-numberheadings": "자동으로 머릿글 번호 매기기",
-       "tog-showtoolbar": "편집에 툴바 보이기",
+       "tog-showtoolbar": "편집 도구 모음 보이기",
        "tog-editondblclick": "더블 클릭으로 문서 편집하기",
        "tog-editsectiononrightclick": "제목을 오른쪽 클릭해서 문단 편집하기 활성화",
        "tog-watchcreations": "내가 만드는 문서와 내가 올린 파일을 주시문서 목록에 추가",
@@ -80,9 +80,9 @@
        "tog-prefershttps": "로그인할 때 항상 보안 연결 사용",
        "underline-always": "항상",
        "underline-never": "항상 치지 않기",
-       "underline-default": "스킨 또는 브라우저 기본 값을 따르기",
+       "underline-default": "스킨 또는 브라우저 기본",
        "editfont-style": "편집 창의 글꼴:",
-       "editfont-default": "브라우저 기본 값을 따르기",
+       "editfont-default": "브라우저 기본",
        "editfont-monospace": "고정폭 글꼴",
        "editfont-sansserif": "산세리프 글꼴",
        "editfont-serif": "세리프 글꼴",
        "jumpto": "이동:",
        "jumptonavigation": "둘러보기",
        "jumptosearch": "검색",
-       "view-pool-error": "현재 서버에 과부하가 걸렸습니다.\n너무 많은 사용자가 이 문서를 보려고 하고 있습니다.\n이 문서를 다시 열기 전에 잠시만 기다려주세요.\n\n$1",
+       "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에 따라 사용할 수 있습니다.",
        "readonly_lag": "슬레이브 데이터베이스가 마스터 서버의 자료를 새로 고치는 중입니다. 데이터베이스가 자동으로 잠겨 있습니다.",
        "internalerror": "내부 오류",
        "internalerror_info": "내부 오류: $1",
-       "fileappenderrorread": "내용을 덧붙이는 도중 \"$1\" 파일을 읽을 수 없었습니다.",
-       "fileappenderror": "\"$1\" 파일을 \"$2\"에 덧붙일 수 없습니다.",
        "filecopyerror": "\"$1\" 파일을 \"$2\"로 복사할 수 없습니다.",
        "filerenameerror": "\"$1\" 파일을 \"$2\"로 옮길 수 없습니다.",
        "filedeleteerror": "\"$1\" 파일을 삭제할 수 없습니다.",
        "directorycreateerror": "\"$1\" 디렉터리를 만들 수 없습니다.",
        "filenotfound": "\"$1\" 파일을 찾을 수 없습니다.",
-       "fileexistserror": "\"$1\" 파일이 이미 있어서 쓸 수 없습니다.",
        "unexpected": "예기치 못한 값: \"$1\"=\"$2\"",
        "formerror": "오류: 양식을 제출할 수 없습니다.",
        "badarticleerror": "해당 명령은 이 문서에서 실행할 수 없습니다.",
        "userlogin-helplink2": "로그인에 대한 도움말",
        "userlogin-loggedin": "이미 $1로 로그인되어 있습니다. 아래의 양식을 사용하여 다른 계정으로 로그인하세요.",
        "userlogin-createanother": "다른 계정 만들기",
-       "createacct-join": "아래에 정보를 입력하세요.",
-       "createacct-another-join": "아래에 새 계정의 정보를 입력하세요.",
        "createacct-emailrequired": "이메일 주소",
        "createacct-emailoptional": "이메일 주소 (선택 사항)",
        "createacct-email-ph": "이메일 주소를 입력하세요",
        "userexists": "입력한 사용자 계정 이름이 이미 사용되고 있습니다.\n다른 이름을 선택하세요.",
        "loginerror": "로그인 오류",
        "createacct-error": "계정 만들기 오류",
-       "createaccounterror": "ê³\84ì \95ì\9d\84 ë§\8cë\93¤ì§\80 ëª»í\96\88습니다: $1",
+       "createaccounterror": "ê³\84ì \95ì\9d\84 ë§\8cë\93¤ì\88\98 ì\97\86습니다: $1",
        "nocookiesnew": "사용자 계정을 만들었지만, 아직 로그인하지 않았습니다.\n{{SITENAME}}에서는 로그인 정보를 저장하기 위해 쿠키를 사용합니다.\n지금 사용하는 웹 브라우저는 쿠키를 사용하지 않도록 설정되어 있습니다.\n로그인하기 전에 웹 브라우저에서 쿠키를 사용하도록 설정해주세요.",
        "nocookieslogin": "{{SITENAME}}에서는 로그인을 위해 쿠키를 사용합니다.\n쿠키가 비활성되어 있습니다.\n쿠키 사용을 활성화한 다음 다시 시도하세요.",
        "nocookiesfornew": "요청의 출처를 확인할 수 없기 때문에 사용자 계정이 만들어지지 않았습니다.\n쿠키를 허용한 것을 확인한 후에 이 문서를 새로 고치고 나서 다시 시도하세요.",
        "invalidemailaddress": "이메일 주소의 형식이 잘못되어 인식할 수 없습니다.\n정상적인 형식의 이메일을 입력하거나 칸을 비워 주세요.",
        "cannotchangeemail": "이 위키에서는 계정의 이메일 주소를 바꿀 수 없습니다.",
        "emaildisabled": "이 사이트에서는 이메일을 보낼 수 없습니다.",
-       "accountcreated": "계정 만들어짐",
+       "accountcreated": "계정 만들어짐",
        "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|토론]]) 사용자 계정이 만들어졌습니다.",
        "createaccount-title": "{{SITENAME}} 계정 만들기",
        "createaccount-text": "누군가가 {{SITENAME}} ($4)에서 사용자 이름 \"$2\", 비밀번호 \"$3\"로 당신의 이메일 주소가 등록된 계정을 만들었습니다. \n지금 로그인하여 비밀번호를 바꾸십시오.\n\n실수로 계정을 잘못 만들었다면 이 메시지는 무시해도 됩니다.",
        "subject": "주제/제목:",
        "minoredit": "사소한 편집입니다",
        "watchthis": "이 문서 주시하기",
-       "savearticle": "저장",
+       "savearticle": "문서 저장",
        "preview": "미리 보기",
        "showpreview": "미리 보기",
-       "showlivepreview": "실시간 미리 보기",
        "showdiff": "차이 보기",
        "anoneditwarning": "'''경고''': 로그인하고 있지 않습니다.\nIP 주소가 문서 역사에 남게 됩니다.",
        "anonpreviewwarning": "'''로그인하고 있지 않습니다. 문서를 저장하면 당신의 IP 주소가 문서 역사에 남게 됩니다.'''",
        "permissionserrors": "권한 오류",
        "permissionserrorstext": "해당 명령을 수행할 권한이 없습니다. 다음 {{PLURAL:$1|이유}}를 확인해보세요:",
        "permissionserrorstext-withaction": "$2 권한이 없습니다. 다음 {{PLURAL:$1|이유}}를 확인해주세요:",
-       "recreate-moveddeleted-warn": "'''경고: 삭제된 적이 있는 문서를 다시 만들고 있습니다.'''\n\n이 문서를 계속 편집하는 것이 적합한 것인지 확인해주세요.\n편의를 위해 삭제와 이동 기록을 다음과 같이 제공합니다:",
+       "recreate-moveddeleted-warn": "<strong>경고: 삭제된 문서를 다시 만들고 있습니다.</strong>\n\n이 문서를 계속 편집하는 것이 적합한 것인지 확인해주세요.\n편의를 위해 삭제와 옮기기 기록을 다음과 같이 제공합니다:",
        "moveddeleted-notice": "이 문서는 삭제되었습니다.\n이 문서의 삭제 및 이동 기록은 다음과 같습니다.",
        "log-fulllog": "전체 기록 보기",
        "edit-hook-aborted": "훅에 의해 편집이 중단되었습니다.\n아무런 설명도 주어지지 않았습니다.",
        "edit-gone-missing": "문서를 저장하지 못했습니다.\n문서가 삭제된 것 같습니다.",
        "edit-conflict": "편집 충돌.",
        "edit-no-change": "문서에 어떠한 바뀜도 없기 때문에 편집은 무시되었습니다.",
-       "postedit-confirmation": "편집을 저장했습니다.",
+       "postedit-confirmation-created": "문서가 만들어졌습니다.",
+       "postedit-confirmation-restored": "문서가 되돌려졌습니다.",
+       "postedit-confirmation-saved": "편집을 저장했습니다.",
        "edit-already-exists": "새 문서를 만들 수 없습니다.\n문서가 이미 존재합니다.",
        "defaultmessagetext": "기본 메시지 글",
        "content-failed-to-parse": "$1 모델에 대한 $2 내용을 구문 분석하는 데 실패했습니다: $3",
        "parser-template-recursion-depth-warning": "틀 반복 깊이 제한을 초과함 ($1)",
        "language-converter-depth-warning": "언어 변환기 실행 제한 초과($1)",
        "node-count-exceeded-category": "문서가 노드 횟수를 초과하였습니다.",
+       "node-count-exceeded-category-desc": "노드 횟수를 초과하는 문서의 분류입니다.",
        "node-count-exceeded-warning": "문서가 노드 수를 초과하였습니다.",
        "expansion-depth-exceeded-category": "문서가 확장 깊이를 초과하였습니다.",
+       "expansion-depth-exceeded-category-desc": "확장 깊이를 초과하는 문서의 분류입니다.",
        "expansion-depth-exceeded-warning": "문서가 확장 깊이를 초과하였습니다",
        "parser-unstrip-loop-warning": "Unstrip의 반복을 감지했습니다",
        "parser-unstrip-recursion-limit": "Unstrip의 재귀 한도를 초과했습니다 ($1)",
        "undo-nochange": "편집이 이미 되돌려진 것으로 나타납니다.",
        "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|토론]])의 $1판 편집을 되돌림",
        "undo-summary-username-hidden": "숨겨진 사용자가 $1 판을 되돌림",
-       "cantcreateaccounttitle": "ê³\84ì \95ì\9d\84 ë§\8cë\93¤ ì\88\98 ì\97\86ì\9d\8c",
+       "cantcreateaccounttitle": "ê³\84ì \95ì\9d\84 ë§\8cë\93¤ ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤",
        "cantcreateaccount-text": "현재 아이피 주소('''$1''')는 [[User:$3|$3]] 사용자에 의해 계정 만들기가 차단되었습니다.\n\n차단 이유는 다음과 같습니다: $2",
        "cantcreateaccount-range-text": "당신의 IP 주소('''$4''')가 속해 있는 '''$1''' 대역에서의 계정 생성을 [[User:$3|$3]] 사용자가 차단하였습니다.\n\n$3 사용자가 제시한 이유는 \"$2\"입니다.",
        "viewpagelogs": "이 문서의 기록 보기",
        "history-feed-empty": "요청한 문서가 존재하지 않습니다.\n해당 문서가 삭제되었거나, 문서 이름이 바뀌었을 수 있습니다.\n[[Special:Search|위키의 검색]]을 사용해 관련 문서를 찾아보세요.",
        "rev-deleted-comment": "(편집 요약 삭제됨)",
        "rev-deleted-user": "(사용자 이름 삭제됨)",
-       "rev-deleted-event": "(기록 동작 삭제됨)",
+       "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 해당 편집]을 볼 수 있습니다.",
        "showhideselectedversions": "선택한 판을 보이기/숨기기",
        "editundo": "편집 취소",
        "diff-empty": "(차이 없음)",
-       "diff-multi-sameuser": "(ê°\99ì\9d\80 ì\82¬ì\9a©ì\9e\90ì\97\90 ì\9d\98í\95\9c {{PLURAL:$1|í\95\98ë\82\98ì\9d\98 ì¤\91ê°\84 í\8e¸ì§\91|$1ê°\9cì\9d\98 ì¤\91ê°\84 í\8e¸ì§\91}}ì\9d´ ì\88¨ê²¨ì§\90)",
-       "diff-multi-otherusers": "({{PLURAL:$2|한 명의 사용자|$2명의 사용자}}에 의한 {{PLURAL:$1|$1개의 중간 편집}}이 숨겨짐)",
-       "diff-multi-manyusers": "({{PLURAL:$2|한 사용자의|사용자 $2명 이상의}} {{PLURAL:$1|중간의 편집 $1개}} 숨겨짐)",
+       "diff-multi-sameuser": "(ê°\99ì\9d\80 ì\82¬ì\9a©ì\9e\90ì\9d\98 {{PLURAL:$1|ì¤\91ê°\84 í\8c\90 í\95\98ë\82\98|ì¤\91ê°\84 í\8c\90 $1ê°\9c}}ë\8a\94 ë³´ì\9d´ì§\80 ì\95\8aì\8aµë\8b\88ë\8b¤)",
+       "diff-multi-otherusers": "({{PLURAL:$2|다른 사용자 한 명|사용자 $2명}}의 {{PLURAL:$1|중간 판 하나|중간 판 $1개}}는 보이지 않습니다)",
+       "diff-multi-manyusers": "({{PLURAL:$2|사용자}} $2명 이상의 {{PLURAL:$1|중간 판 하나|중간 판 $1개}}는 보이지 않습니다)",
        "difference-missing-revision": "문서 비교에서 {{PLURAL:$2|하나|$2개}}의 판($1)을 찾을 수 {{PLURAL:$2|없습니다}}.\n\n이 문제는 주로 삭제된 문서를 가리키는 오래된 문서 비교 링크로 인해 발생합니다.\n자세한 내용은 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 삭제 기록]에서 확인할 수 있습니다.",
        "searchresults": "검색 결과",
        "searchresults-title": "\"$1\"에 대한 검색 결과",
        "searchmenu-exists": "'''이 위키에 \"[[:$1]]\"의 이름을 가진 문서가 있습니다.'''",
        "searchmenu-new": "<strong>이 위키에 \"[[:$1]]\" 문서를 만드세요!</strong> {{PLURAL:$2|0=|검색으로 찾은 문서도 보세요.|찾은 검색 결과도 보세요.}}",
        "searchprofile-articles": "본문",
-       "searchprofile-project": "도움말 및 프로젝트 문서",
        "searchprofile-images": "멀티미디어",
        "searchprofile-everything": "모든 문서",
        "searchprofile-advanced": "고급",
        "searchprofile-articles-tooltip": "$1에서 검색",
-       "searchprofile-project-tooltip": "$1에서 검색",
        "searchprofile-images-tooltip": "파일 검색",
        "searchprofile-everything-tooltip": "모든 내용 (토론 문서를 포함) 검색",
        "searchprofile-advanced-tooltip": "다음 설정한 이름공간에서 검색",
        "search-nonefound": "검색어와 일치하는 결과가 없습니다.",
        "powersearch-legend": "고급 검색",
        "powersearch-ns": "다음 이름공간에서 검색:",
-       "powersearch-redir": "넘겨주기 목록",
        "powersearch-togglelabel": "확인:",
        "powersearch-toggleall": "모두",
        "powersearch-togglenone": "모두 제외",
        "search-error": "검색하는 동안 오류가 발생했습니다: $1",
        "preferences": "사용자 환경 설정",
        "mypreferences": "환경 설정",
-       "prefs-edits": "편집 수:",
+       "prefs-edits": "편집 수:",
        "prefsnologintext2": "사용자 환경 설정을 설정하려면 $1하십시오.",
        "prefs-skin": "스킨",
        "skin-preview": "미리 보기",
-       "datedefault": "기본 값",
+       "datedefault": "설정하지 않음",
        "prefs-labs": "실험 중인 기능",
        "prefs-user-pages": "사용자 문서",
        "prefs-personal": "사용자 정보",
        "prefs-custom-css": "사용자 CSS",
        "prefs-custom-js": "사용자 자바스크립트",
        "prefs-common-css-js": "모든 스킨에 대한 공통 CSS/자바스크립트:",
-       "prefs-reset-intro": "이 사이트의 기본 값으로 환경 설정을 재설정할 수 있습니다.\n재설정한 환경 설정은 되돌릴 수 없습니다.",
+       "prefs-reset-intro": "이 페이지를 사용해 사이트 기본값으로 환경 설정을 재설정할 수 있습니다.\n이는 되돌릴 수 없습니다.",
        "prefs-emailconfirm-label": "이메일 인증:",
        "youremail": "이메일:",
        "username": "{{GENDER:$1|사용자 이름}}:",
-       "uid": "{{GENDER:$1|사용자}} ID:",
        "prefs-memberingroups": "{{GENDER:$2|소속}} {{PLURAL:$1|그룹}}:",
-       "prefs-registration": "ë\93±ë¡\9d ì\9d¼ì\8b\9c:",
+       "prefs-registration": "ë\93±ë¡\9d ì\8b\9cê°\84:",
        "yourrealname": "실명:",
        "yourlanguage": "언어:",
        "yourvariant": "언어 변종:",
        "prefs-advancedsearchoptions": "고급 설정",
        "prefs-advancedwatchlist": "고급 설정",
        "prefs-displayrc": "보이기 설정",
-       "prefs-displaysearchoptions": "보이기 설정",
        "prefs-displaywatchlist": "보이기 설정",
        "prefs-tokenwatchlist": "토큰",
        "prefs-diffs": "차이",
        "right-move": "문서 옮기기",
        "right-move-subpages": "문서와 하위 문서 옮기기",
        "right-move-rootuserpages": "최상위 사용자 문서 옮기기",
+       "right-move-categorypages": "분류 문서 옮기기",
        "right-movefile": "파일 옮기기",
        "right-suppressredirect": "문서을 옮길 때 원래 문서 이름으로 된 넘겨주기를 만들지 않기",
        "right-upload": "파일 올리기",
        "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": "이미 존재하는 파일 덮어쓰기",
        "recentchanges-legend-newpage": "([[Special:NewPages|새 문서 목록]]도 보세요)",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "다음은 <strong>$2</strong>에서부터 바뀐 문서 <strong>$1</strong>개입니다.",
-       "rclistfrom": "$1 이래로 새로 바뀐 문서 보기",
+       "rclistfrom": "$3 $2부터 시작하는 새로 바뀐 문서 보기",
        "rcshowhideminor": "사소한 편집을 $1",
        "rcshowhideminor-show": "보이기",
        "rcshowhideminor-hide": "숨기기",
        "upload_directory_missing": "파일 올리기용 디렉터리($1)가 없고 웹 서버가 만들지 못했습니다.",
        "upload_directory_read_only": "파일 저장 디렉터리($1)에 쓰기 권한이 없습니다.",
        "uploaderror": "올리기 오류",
-       "upload-recreate-warning": "'''경고: ì\9d´ í\8c\8cì\9d¼ë¡\9c ë\90\9c ì\9d´ë¦\84ì\9d´ ì\82­ì \9cë\90\98ì\97\88ê±°ë\82\98 ì\98®ê²¨ì¡\8cì\8aµë\8b\88ë\8b¤.'''\n\nì\9d´ ë¬¸ì\84\9cì\9d\98 ìµ\9cê·¼ ì\82­ì \9c ê¸°ë¡\9dê³¼ ì\9d´ë\8f\99 ê¸°ë¡\9dì\9d\84 ì°¸ê³ í\95\98ì\8b­ì\8b\9cì\98¤:",
+       "upload-recreate-warning": "<strong>경고: í\95´ë\8b¹ ì\9d´ë¦\84ì\9c¼ë¡\9c ë\90\9c í\8c\8cì\9d¼ì\9d´ ì\82­ì \9cë\90\98ì\97\88ê±°ë\82\98 ì\98®ê²¨ì¡\8cì\8aµë\8b\88ë\8b¤.</strong>\n\ní\8e¸ì\9d\98를 ì\9c\84í\95´ ì\9d´ ë¬¸ì\84\9cì\97\90 ë\8c\80í\95\9c ì\82­ì \9cì\99\80 ì\98®ê¸°ê¸° ê¸°ë¡\9dì\9d\84 ë\8b¤ì\9d\8cê³¼ ê°\99ì\9d´ ì \9cê³µí\95©ë\8b\88ë\8b¤:",
        "uploadtext": "파일을 올리기 위해서는 아래의 양식을 채워주세요.\n[[Special:FileList|파일 목록]]에서 이전에 올라온 파일을 검색할 수 있습니다. [[Special:Log/upload|올리기 기록]]에는 파일이 올라온 기록이 남습니다. 삭제 기록은 [[Special:Log/delete|삭제 기록]]에서 볼 수 있습니다.\n\n문서에 파일을 넣으려면 아래 방법 중 하나를 사용하세요.\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' 파일의 온전한 모양을 사용하고자 할 때\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200픽셀|섬네일|왼쪽|설명]]</nowiki></code>''' 파일의 너비를 200픽셀로 하고 왼쪽 정렬하며 '설명' 이라는 주석을 파일 밑에 달 때\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' 파일을 직접 보여주지 않고 파일로 바로 링크할 때",
        "upload-permitted": "허용하는 파일 확장자: $1",
        "upload-preferred": "권장하는 파일 확장자: $1",
        "uploadlogpage": "올리기 기록",
        "uploadlogpagetext": "최근 올라온 파일 목록입니다.\n갤러리 형식으로 확인하고 싶으시다면 [[Special:NewFiles|새 파일 목록]]을 보세요.",
        "filename": "파일 이름",
-       "filedesc": "요약",
+       "filedesc": "파일의 설명",
        "fileuploadsummary": "요약:",
        "filereuploadsummary": "파일의 바뀜:",
        "filestatus": "저작권 상태:",
        "empty-file": "올린 파일이 비어 있습니다.",
        "file-too-large": "올리려는 파일이 너무 큽니다.",
        "filename-tooshort": "파일 이름이 너무 짧습니다.",
-       "filetype-banned": "이러한 종류의 파일은 금지되어 있습니다.",
+       "filetype-banned": "이 파일의 형식은 금지되어 있습니다.",
        "verification-error": "이 파일은 파일 확인 절차를 통과하지 않았습니다.",
        "hookaborted": "수정하려고 한 것이 확장 기능 훅에 의해 중지되었습니다.",
        "illegal-filename": "이 파일 이름은 허용되지 않습니다.",
        "uploadstash-refresh": "파일 목록을 새로 고침",
        "invalid-chunk-offset": "청크 오프셋이 잘못되었습니다.",
        "img-auth-accessdenied": "접근이 거부됨",
-       "img-auth-nopathinfo": "PATH_INFO를 잃었습니다.\n서버가 이 정보를 받을 수 있도록 설정되어 있지 않습니다.\n이러한 경우는 서버가 CGI 기반이고 img_auth를 지원하지 않을 때 나타날 수 있습니다.\nhttps://www.mediawiki.org/wiki/Manual:Image_Authorization 을 참고하십시오.",
+       "img-auth-nopathinfo": "PATH_INFO를 잃었습니다.\n서버가 이 정보를 받을 수 있도록 설정되어 있지 않습니다.\n이러한 경우는 서버가 CGI 기반이고 img_auth를 지원하지 않을 때 나타날 수 있습니다.\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization 을 참고하십시오.",
        "img-auth-notindir": "요청한 경로가 설정한 올리기 디렉터리에 없습니다.",
        "img-auth-badtitle": "\"$1\"에서 올바른 제목을 만들 수 없습니다.",
        "img-auth-nologinnWL": "로그인하지 않았으며 \"$1\" 파일은 화이트리스트에 존재하지 않습니다.",
        "statistics-pages": "전체 문서",
        "statistics-pages-desc": "토론 문서, 넘겨주기 문서 등을 포함하는 위키에 있는 모든 문서입니다",
        "statistics-files": "올려져 있는 파일",
-       "statistics-edits": "{{SITENAME}} 설치 후 문서의 전체 편집 횟수",
-       "statistics-edits-average": "문서당 평균 편집 수",
+       "statistics-edits": "{{SITENAME}} 설치 이후 문서의 전체 편집 수",
+       "statistics-edits-average": "문서당 평균 편집 수",
        "statistics-views-total": "총 방문 수",
        "statistics-views-total-desc": "존재하지 않는 문서나 특수 문서에 대한 방문 수는 포함하지 않았습니다",
        "statistics-views-peredit": "편집당 방문 횟수",
        "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-fixed-move": "[[$1]] 문서를 옮겼습니다.\n이 문서는 이제 [[$2]] 문서로 자동으로 바꾸고 넘겨줍니다.",
+       "double-redirect-fixed-maintenance": "유지 보수 작업에서 [[$1]]에서 [[$2]](으)로 이중 넘겨주기를 자동으로 고치고 있습니다.",
        "double-redirect-fixer": "넘겨주기 수리꾼",
        "brokenredirects": "끊긴 넘겨주기 목록",
        "brokenredirectstext": "존재하지 않는 문서로 넘겨주기가 되어 있는 문서의 목록입니다:",
        "protectedpages-page": "문서",
        "protectedpages-expiry": "만료 기한",
        "protectedpages-performer": "사용자를 보호",
-       "protectedpages-params": "ë³´í\98¸ ë§¤ê°\9cë³\80ì\88\98",
+       "protectedpages-params": "보호 변수",
        "protectedpages-reason": "이유",
        "protectedpages-unknown-timestamp": "알 수 없음",
        "protectedpages-unknown-performer": "알 수 없는 사용자",
        "listusers-creationsort": "계정을 만든 날짜순으로 정렬",
        "listusers-desc": "내림차순으로 정렬",
        "usereditcount": "{{PLURAL:$1|편집}} $1회",
-       "usercreated": "$1 $2에 계정 {{GENDER:$3|만들어짐}}",
+       "usercreated": "$1 $2에 계정 {{GENDER:$3|만들어짐}}",
        "newpages": "새 문서 목록",
        "newpages-username": "사용자 이름:",
        "ancientpages": "오래된 문서 목록",
        "log-title-wildcard": "다음 글로 시작하는 제목 검색",
        "showhideselectedlogentries": "선택한 기록 항목 보이기/숨기기",
        "allpages": "모든 문서 목록",
-       "alphaindexline": "$1부터 $2까지",
        "nextpage": "다음 문서 ($1)",
        "prevpage": "이전 문서 ($1)",
        "allpagesfrom": "다음으로 시작하는 문서 보기:",
        "categoriesfrom": "다음으로 시작하는 분류를 보여주기:",
        "special-categories-sort-count": "갯수 순으로 정렬",
        "special-categories-sort-abc": "알파벳순으로 정렬",
-       "deletedcontributions": "삭제된 기여 목록",
-       "deletedcontributions-title": "삭제된 기여 목록",
+       "deletedcontributions": "삭제된 사용자 기여",
+       "deletedcontributions-title": "삭제된 사용자 기여",
        "sp-deletedcontributions-contribs": "기여",
        "linksearch": "바깥 링크 검색",
        "linksearch-pat": "검색 패턴:",
        "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>가 있어서, 정상적이지 않을 곳에 로봇에 의해 색인됩니다.",
+       "post-expand-template-inclusion-category-desc": "모든 틀을 확장하고 나서, 문서 크기가 <code>$wgMaxArticleSize</code>보다 커지므로, 어떤 틀은 확장하지 않았습니다.",
+       "post-expand-template-argument-category-desc": "틀 변수 (<code>{{{Foo}}}</code>와 같은, 중괄호가 세 개 있는 무언가)를 확장하고 나서, 문서는 <code>$wgMaxArticleSize</code>보다 커집니다.",
+       "expensive-parserfunction-category-desc": "(<code>#ifexist</code>와 같은) 느린 파서 함수가 너무 많이 문서에 포함되어 있습니다. [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit]를 보세요.",
+       "broken-file-category-desc": "분류가 깨진 파일 링크 (파일이 존재하지 않을 때 포함되는 링크)가 있는 문서가 있다면 추가됩니다.",
+       "hidden-category-category-desc": "기본적으로 문서에 분류 링크 상자가 보여지는 것에서 막기 위한, <code><nowiki>__HIDDENCAT__</nowiki></code>가 있는 분류입니다.",
        "trackingcategories-nodesc": "사용할 수 있는 설명이 없습니다.",
        "trackingcategories-disabled": "분류가 비활성화되어 있습니다",
        "mailnologin": "보낼 이메일 주소가 없음",
        "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개}}를 주시하고 있습니다.",
+       "watchlist-details": "별도의 토론 문서를 세지 않고, 주시문서 목록에 {{PLURAL:$1|문서 $1개}}가 있습니다.",
        "wlheader-enotif": "이메일 알림 기능이 활성화되었습니다.",
        "wlheader-showupdated": "마지막으로 방문한 이후에 바뀐 문서는 '''굵은 글씨'''로 보입니다.",
-       "watchmethod-recent": "주시된 문서를 확인하고자 최근 편집을 확인",
-       "watchmethod-list": "최근 편집을 확인하고자 주시된 문서 확인",
-       "watchlistcontains": "{{PLURAL:$1|문서 $1개}}를 주시하고 있습니다.",
-       "iteminvalidname": "'$1' 항목에 문제가 발생했습니다. 이름이 잘못되었습니다...",
        "wlnote2": "아래는 $2, $3 기준으로 지난 {{PLURAL:$1|한 시간|<strong>$1</strong>시간}} 동안의 바뀜입니다.",
        "wlshowlast": "최근 $1시간 $2일 또는 $3 동안에 바뀐 문서 보기",
        "watchlist-options": "주시문서 목록 설정",
        "enotif_lastvisited": "마지막으로 방문한 뒤 생긴 모든 바뀜을 보려면 $1 을 보세요.",
        "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{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "$WATCHINGUSERNAME님,\n\n$PAGEINTRO $NEWPAGE\n\n편집 요약: $PAGESUMMARY $PAGEMINOREDIT\n\n다음을 통해 편집자와 대화를 할 수 있습니다:\n이메일: $PAGEEDITOR_EMAIL\n위키: $PAGEEDITOR_WIKI\n\n로그인한 상태에서 이 문서를 열기 전에는 다른 알림 이메일을 더 이상 보내지 않습니다. 모든 주시 문서의 알림 딱지를 초기화할 수도 있습니다.\n\n{{SITENAME}} 알림 시스템\n\n--\n이메일 알림 설정을 바꾸시려면 이곳을 방문해주세요:\n{{canonicalurl:{{#special:Preferences}}}}\n\n주시문서 설정을 바꾸려면 다음을 사용하세요:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\n주시문서에서 이 문서를 지우려면 이곳을 방문해주세요:\n$UNWATCHURL\n\n도움을 얻거나 피드백 하기:\n$HELPPAGE",
        "created": "만들었",
        "changed": "바꾸었",
-       "deletepage": "문서 삭제하기",
+       "deletepage": "문서 삭제",
        "confirm": "확인",
        "excontent": "내용: \"$1\"",
        "excontentauthor": "내용: \"$1\" (유일한 편집자는 \"[[Special:Contributions/$2|$2]]\")",
        "delete-legend": "삭제",
        "historywarning": "'''경고:''' 삭제하려는 문서에 이전 {{PLURAL:$1|편집 역사}} 약 $1개가 있습니다:",
        "confirmdeletetext": "문서와 문서 역사를 삭제하려고 합니다.\n삭제하려는 문서가 맞는지, 이 문서를 삭제하는 것이 [[{{MediaWiki:Policy-url}}|정책]]에 맞는 행동인지를 확인해 주세요.",
-       "actioncomplete": "ëª\85ë ¹ 완료",
+       "actioncomplete": "ë\8f\99ì\9e\91 완료",
        "actionfailed": "명령 실패",
        "deletedtext": "\"$1\" 문서를 삭제했습니다.\n최근 삭제 기록은 $2에 있습니다.",
        "dellogpage": "삭제 기록",
        "tooltip-namespace_association": "선택한 이름공간과 관련된 토론이나 본문 이름공간을 포함하려면 이 상자를 선택하세요",
        "blanknamespace": "(일반)",
        "contributions": "{{GENDER:$1|사용자}} 기여",
-       "contributions-title": "$1 사용자의 기여 목록",
+       "contributions-title": "$1 사용자의 기여",
        "mycontris": "기여",
        "contribsub2": "{{GENDER:$3|$1}}($2)의 기여",
        "contributions-userdoesnotexist": "\"$1\" 사용자 계정은 등록되어 있지 않습니다.",
        "sp-contributions-newbies-title": "새 사용자의 기여",
        "sp-contributions-blocklog": "차단 기록",
        "sp-contributions-suppresslog": "삭제된 사용자 기여",
-       "sp-contributions-deleted": "삭제된 기여 목록",
+       "sp-contributions-deleted": "삭제된 사용자 기여",
        "sp-contributions-uploads": "올린 파일",
        "sp-contributions-logs": "기록",
        "sp-contributions-talk": "토론",
        "blockip": "사용자 차단",
        "blockip-legend": "사용자 차단",
        "blockiptext": "차단할 IP 주소나 사용자 이름을 아래에 적어 주세요.\n차단은 문서 훼손을 막기 위해, [[{{MediaWiki:Policy-url}}|정책]]에 의해서만 이루어져야 합니다.\n차단 이유를 같이 적어주세요(예: 특정 문서 훼손).",
-       "ipadressorusername": "IP 주소 또는 사용자 이름:",
+       "ipaddressorusername": "IP 주소 또는 사용자 이름:",
        "ipbexpiry": "기한:",
        "ipbreason": "이유:",
        "ipbreason-dropdown": "*일반적인 차단 이유\n** 거짓 정보를 넣음\n** 문서 내용을 지움\n** 바깥 사이트의 광고성 링크를 넣음\n** 문서에 장난성 내용을 넣음\n** 협박성 행동\n** 다중 계정 악용\n** 부적절한 사용자 이름",
        "blocklist-addressblocks": "단일 IP 차단을 숨기기",
        "blocklist-rangeblocks": "광역 차단을 숨기기",
        "blocklist-timestamp": "시간 기록",
-       "blocklist-target": "차단 대상",
+       "blocklist-target": "대상",
        "blocklist-expiry": "차단 기한",
        "blocklist-by": "차단한 관리자",
        "blocklist-params": "차단 설정",
        "movepagetalktext": "딸린 토론 문서도 자동으로 이동합니다. 하지만 다음의 경우는 '''이동하지 않습니다''':\n* 이동할 이름으로 된 문서가 이미 있는 경우\n* 아래의 선택을 해제하는 경우\n\n이 경우에는 문서를 직접 이동하거나 두 문서를 합쳐야 합니다.",
        "movearticle": "문서 옮기기:",
        "moveuserpage-warning": "'''경고:''' 사용자 문서를 옮기려 하고 있습니다. 사용자 문서만 이동되며 사용자 이름이 바뀌지 '''않는다'''는 점을 참고하세요.",
+       "movecategorypage-warning": "<strong>경고:</strong> 분류 문서를 옮기려고 합니다. 해당 문서만 옮겨지고 옛 분류에 있는 문서는 새 분류 안에 다시 분류되지 <em>않음</em>을 참고하세요.",
        "movenologintext": "문서를 이동하려면 [[Special:UserLogin|로그인]]해야 합니다.",
        "movenotallowed": "문서를 옮길 권한이 없습니다.",
        "movenotallowedfile": "파일을 옮길 권한이 없습니다.",
-       "cant-move-user-page": "사용자 문서를 옮길 권한이 없습니다(하위 문서는 예외).",
-       "cant-move-to-user-page": "문서를 사용자 문서로 옮길 권한이 없습니다(하위 문서는 예외).",
+       "cant-move-user-page": "사용자 문서를 옮길 권한이 없습니다 (하위 문서는 예외).",
+       "cant-move-to-user-page": "문서를 사용자 문서로 옮길 권한이 없습니다 (하위 문서는 예외).",
+       "cant-move-category-page": "분류 문서를 옮길 권한이 없습니다.",
+       "cant-move-to-category-page": "문서를 분류 문서로 옮길 권한이 없습니다.",
        "newtitle": "새 제목:",
        "move-watch": "원래 문서와 대상 문서를 주시하기",
        "movepagebtn": "문서 옮기기",
        "tooltip-summary": "짧은 요약을 적어주세요",
        "interlanguage-link-title": "$1 – $2",
        "common.css": "/* 이 CSS 설정은 모든 스킨에 동일하게 적용됩니다 */",
-       "cologneblue.css": "/* 이 CSS 설정은 쾰른 블루 스킨을 사용하는 사용자에게 적용됩니다 */",
        "monobook.css": "/* 이 CSS 설정은 모노북 스킨을 사용하는 사용자에게 적용됩니다 */",
-       "modern.css": "/* 이 CSS 설정은 모던 스킨을 사용하는 사용자에게 적용됩니다 */",
        "vector.css": "/* 이 CSS 설정은 벡터 스킨을 사용하는 사용자에게 적용됩니다 */",
        "print.css": "/* 이 CSS 설정은 인쇄 출력 화면에 적용됩니다 */",
        "noscript.css": "/* 이 CSS 설정은 자바스크립트를 비활성화한 사용자에 적용됩니다 */",
        "group-sysop.css": "/* 이 CSS 설정은 관리자에만 적용됩니다 */",
        "group-bureaucrat.css": "/* 이 CSS 설정은 사무관에만 적용됩니다 */",
        "common.js": "/* 이 자바스크립트 설정은 모든 문서, 모든 사용자에게 적용됩니다. */",
-       "cologneblue.js": "/* 이 자바스크립트 설정은 쾰른 블루 스킨을 사용하는 사용자에게 적용됩니다 */",
        "monobook.js": "/* 이 자바스크립트 설정은 모노북 스킨을 사용하는 사용자에게 적용됩니다 */",
-       "modern.js": "/* 이 자바스크립트 설정은 모던 스킨을 사용하는 사용자에게 적용됩니다 */",
        "vector.js": "/* 이 자바스크립트 설정은 벡터 스킨을 사용하는 사용자에게 적용됩니다 */",
        "group-autoconfirmed.js": "/* 이 자바스크립트 설정은 자동 인증된 사용자에만 적용됩니다 */",
        "group-bot.js": "/* 이 자바스크립트 설정은 봇에만 적용됩니다 */",
        "group-sysop.js": "/* 이 자바스크립트 설정은 관리자에만 적용됩니다 */",
        "group-bureaucrat.js": "/* 이 자바스크립트 설정은 사무관에만 적용됩니다 */",
-       "notacceptable": "클라이언트에서 인식 가능한 출력 포맷이 없습니다.",
        "anonymous": "{{SITENAME}} 익명 {{PLURAL:$1|사용자}}",
        "siteuser": "{{SITENAME}} 사용자 $1",
        "anonuser": "{{SITENAME}} 익명 사용자 $1",
        "anonusers": "{{SITENAME}} 익명 {{PLURAL:$2|사용자}} $1",
        "creditspage": "문서 기여자",
        "nocredits": "이 문서에서는 기여자 정보가 없습니다.",
-       "spamprotectiontitle": "ì\8a¤í\8c¸ ë°©ì§\80 필터",
+       "spamprotectiontitle": "ì\8a¤í\8c¸ ë§\89기 필터",
        "spamprotectiontext": "스팸 필터가 문서 저장을 막았습니다.\n바깥 사이트로 연결하는 링크 중에 블랙리스트에 포함된 사이트가 있을 것입니다.",
        "spamprotectionmatch": "문제가 되는 부분은 다음과 같습니다: $1",
        "spambot_username": "미디어위키 스팸 정리",
        "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-category-pages": "문서 수",
        "pageinfo-category-subcats": "하위 분류 수",
        "pageinfo-category-files": "파일 수",
-       "skinname-cologneblue": "쾰른 블루",
        "skinname-monobook": "모노북",
-       "skinname-modern": "모던",
        "skinname-vector": "벡터",
        "markaspatrolleddiff": "검토한 문서로 표시",
        "markaspatrolledtext": "이 문서를 검토한 것으로 표시",
        "newimages-summary": "이 특수 문서는 최근에 올라온 파일을 나열하고 있습니다.",
        "newimages-legend": "필터",
        "newimages-label": "파일 이름 (또는 그 일부분):",
-       "showhidebots": "(봇을 $1)",
+       "newimages-showbots": "봇이 올린 것 보기",
        "noimages": "그림이 없습니다.",
        "ilsubmit": "검색",
        "bydate": "날짜",
-       "sp-newimages-showfrom": "$1 $2ë¶\80í\84° ì\98¬ë\9d¼ì\98¨ í\8c\8cì\9d¼ ëª©ë¡\9d 보기",
+       "sp-newimages-showfrom": "$1 $2ë¶\80í\84° ì\8b\9cì\9e\91í\95\98ë\8a\94 ì\83\88 í\8c\8cì\9d¼ 보기",
        "seconds": "$1초",
        "minutes": "$1분",
        "hours": "$1시간",
        "exif-filesource-3": "디지털 정지 카메라",
        "exif-scenetype-1": "직접 촬영한 그림",
        "exif-customrendered-0": "일반",
-       "exif-customrendered-1": "ì\82¬ì\9a©ì\9e\90 ì \95ì\9d\98",
+       "exif-customrendered-1": "ì\82¬ì\9a©ì\9e\90 ì§\80ì \95 ì²\98리",
        "exif-exposuremode-0": "자동 노출",
        "exif-exposuremode-1": "수동 노출",
        "exif-exposuremode-2": "자동 노출 브래킷",
        "autosumm-replace": "문서 내용을 \"$1\"으로 바꿈",
        "autoredircomment": "[[$1]] 문서로 넘겨주기",
        "autosumm-new": "새 문서: $1",
-       "livepreview-loading": "불러오는 중...",
-       "livepreview-ready": "불러오는 중... 준비!",
-       "livepreview-failed": "실시간 미리 보기 실패!\n일반 미리 보기를 이용하세요.",
-       "livepreview-error": "연결에 실패하였습니다: $1 \"$2\"\n일반 미리 보기를 이용하세요.",
        "lag-warn-normal": "최근 $1{{PLURAL:$1|초}} 안에 바뀐 문서는 이 목록에서 빠졌을 수 있습니다.",
        "lag-warn-high": "데이터베이스 서버의 과도한 부하 때문에 최근 $1{{PLURAL:$1|초}} 안에 바뀐 문서 목록은 보이지 않을 수 있습니다.",
-       "watchlistedit-numitems": "토론 문서를 제외하고 {{PLURAL:$1|문서 1개|문서 $1개}}를 주시하고 있습니다.",
-       "watchlistedit-noitems": "주시문서 목록이 비어 있습니다.",
        "watchlistedit-normal-title": "주시문서 목록 편집하기",
        "watchlistedit-normal-legend": "주시문서 목록에서 문서 제거하기",
        "watchlistedit-normal-explain": "주시문서 목록에 있는 문서의 제목이 아래에 나와 있습니다.\n주시문서 목록에서 제거하려는 문서가 있으면 각 항목의 확인 상자를 선택한 다음 \"{{int:Watchlistedit-normal-submit}}\"를 클릭해주세요.\n또는 [[Special:EditWatchlist/raw|목록을 직접 편집]]할 수도 있습니다.",
        "watchlistedit-normal-submit": "항목 삭제",
-       "watchlistedit-normal-done": "주시문서 목록에서 다음 {{PLURAL:$1|항목 1개|항목 $1개}}를 제거했습니다:",
+       "watchlistedit-normal-done": "{{PLURAL:$1|제목 1개|제목 $1개}}를 주시문서 목록에서 제거했습니다:",
        "watchlistedit-raw-title": "주시문서 목록 직접 편집하기",
        "watchlistedit-raw-legend": "주시문서 목록 직접 편집하기",
        "watchlistedit-raw-explain": "주시문서 목록의 각 항목이 나와 있습니다. 필요한 항목을 직접 추가하거나 제거할 수 있습니다.\n각 줄마다 하나의 제목을 입력하세요.\n수정을 마쳤다면 \"{{int:Watchlistedit-raw-submit}}\"을 누르면 됩니다.\n또는 [[Special:EditWatchlist|일반적인 편집기]]를 쓸 수도 있습니다.",
        "watchlistedit-raw-titles": "목록:",
        "watchlistedit-raw-submit": "주시문서 목록 새로 고침",
        "watchlistedit-raw-done": "주시문서 목록을 새로 고쳤습니다.",
-       "watchlistedit-raw-added": "{{PLURAL:$1|문서 $1개}}를 추가했습니다:",
-       "watchlistedit-raw-removed": "{{PLURAL:$1|문서 $1개}}를 제거했습니다:",
+       "watchlistedit-raw-added": "{{PLURAL:$1|제목 1개|제목 $1개}}를 추가했습니다:",
+       "watchlistedit-raw-removed": "{{PLURAL:$1|제목 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": "주시문서 목록 직접 편집하기",
        "version-specialpages": "특수 문서",
        "version-parserhooks": "파서 훅",
        "version-variables": "변수",
-       "version-antispam": "ì\8a¤í\8c¸ ë°©ì§\80",
+       "version-antispam": "ì\8a¤í\8c¸ ë§\89기",
        "version-skins": "스킨",
        "version-other": "기타",
        "version-mediahandlers": "미디어 핸들러",
        "version-version": "(버전 $1)",
        "version-license": "미디어위키 라이선스",
        "version-ext-license": "라이선스",
-       "version-ext-colheader-name": "확장기능",
+       "version-ext-colheader-name": "확장 기능",
        "version-ext-colheader-version": "버전",
        "version-ext-colheader-license": "라이선스",
        "version-ext-colheader-description": "설명",
        "compare-invalid-title": "입력한 제목이 잘못되었습니다.",
        "compare-title-not-exists": "입력한 문서가 존재하지 않습니다.",
        "compare-revision-not-exists": "지정한 판이 없습니다.",
-       "dberr-header": "이 위키에 문제가 있습니다",
        "dberr-problems": "죄송합니다! 이 사이트에 기술적인 문제가 발생하고 있습니다.",
        "dberr-again": "잠시 기다리고 나서 다시 불러오세요.",
        "dberr-info": "(데이터베이스 서버에 연결할 수 없습니다: $1)",
        "htmlform-int-toolow": "지정한 값은 최소값 $1 미만입니다.",
        "htmlform-int-toohigh": "지정한 값은 최대값 $1 이상입니다.",
        "htmlform-required": "이 값은 필수 항목입니다",
-       "htmlform-submit": "ì \80ì\9e¥",
+       "htmlform-submit": "ì \9cì¶\9c",
        "htmlform-reset": "바뀜을 되돌리기",
        "htmlform-selectorother-other": "기타",
        "htmlform-no": "아니오",
        "htmlform-yes": "예",
        "htmlform-chosen-placeholder": "선택하세요",
+       "htmlform-cloner-create": "더 추가",
+       "htmlform-cloner-delete": "제거",
+       "htmlform-cloner-required": "적어도 하나의 값이 필요합니다.",
        "sqlite-has-fts": "$1 (본문 전체 검색 지원)",
        "sqlite-no-fts": "$1 (본문 전체 검색 지원 제외)",
        "logentry-delete-delete": "$1 사용자가 $3 문서를 {{GENDER:$2|삭제했습니다}}",
        "api-error-fileexists-shared-forbidden": "\"$1\" 이름으로 된 파일이 이미 공용 저장소에 존재하며 덮어쓸 수 없습니다.",
        "api-error-file-too-large": "올리려는 파일이 너무 큽니다.",
        "api-error-filename-tooshort": "파일 이름이 너무 짧습니다.",
-       "api-error-filetype-banned": "이런 파일 형식은 올릴 수 없습니다.",
+       "api-error-filetype-banned": "이 파일의 형식은 금지되어 있습니다.",
        "api-error-filetype-banned-type": "$1 {{PLURAL:$4|파일 형식은 올릴 수 없습니다}}. $2 {{PLURAL:$3|파일 형식만 사용할 수 있습니다}}.",
        "api-error-filetype-missing": "파일 이름에 확장자가 없습니다.",
        "api-error-hookaborted": "수정하려고 한 것이 확장 기능에 의해 중지되었습니다.",
index 32a44f8..eaed4ff 100644 (file)
@@ -6,7 +6,8 @@
                        "Iltever",
                        "Kaganer",
                        "Reedy",
-                       "Къарачайлы"
+                       "Къарачайлы",
+                       "아라"
                ]
        },
        "tog-underline": "Джибериулени черт:",
        "navigation-heading": "Навигация меню",
        "errorpagetitle": "Халат",
        "returnto": "«$1» бетге къайт",
-       "tagline": "{{SITENAME}} Ñ\81айÑ\82дан",
+       "tagline": "{{SITENAME}} Ñ\81айÑ\82нÑ\8b Ð¼Ð°Ñ\82еÑ\80иалÑ\8b",
        "help": "Джардам",
        "search": "Излеу",
        "searchbutton": "Таб",
        "view": "Къарау",
        "view-foreign": "$1 сайтда къара",
        "edit": "Тюрлендир",
+       "edit-local": "Локал айгъакълауну тюрлендириу",
        "create": "Къура",
+       "create-local": "Локал айгъакълау къош",
        "editthispage": "Бу бетни тюрлендир",
        "create-this-page": "Бу бетни къура",
        "delete": "Кетер",
        "readonly_lag": "Информация база, экинчи сервер биринчи сервер бла синхронизацияны тындыргъынчы, тюрлендириуледен автомат джабылыб турады.",
        "internalerror": "Ич халат",
        "internalerror_info": "Ич халат: $1",
-       "fileappenderrorread": "«$1» окъулуналмагъанды къошулгъан заманда",
-       "fileappenderror": "«$1» файл «$2» файлгъа къошулмайды.",
        "filecopyerror": "«$2» файлны «$1» файлгъа копия этиб болмайды.",
        "filerenameerror": "«$1» файлны атын «$2» атха алышдырыргъа болмайды.",
        "filedeleteerror": "«$1» файлны кетерирге болмайды.",
        "directorycreateerror": "«$1» директория къураргъа болмайды.",
        "filenotfound": "«$1» файл табылынмайды.",
-       "fileexistserror": "«$1» файлгъа джазаргъа болмайды: ол энди барды",
        "unexpected": "Келишмеген магъана: «$1»=«$2».",
        "formerror": "Халат: форма ташылмайды",
        "badarticleerror": "Бу бетде этилирге болмайды быллай амал.",
        "userlogin-resetpassword-link": "Паролунгу унутдунгму?",
        "userlogin-helplink2": "Кириуде болушлукъ",
        "userlogin-createanother": "Башха аккаунт къурау",
-       "createacct-join": "Билгилеринги тюбюрекде джаз.",
        "createacct-emailrequired": "Электрон почтаны адреси",
        "createacct-emailoptional": "Электрон почтаны адреси (амалсыз тюлдю)",
        "createacct-email-ph": "Электрон почта адресигизни джазыгъыз",
        "changeemail-password": "«{{SITENAME}}» проектде паролугъуз:",
        "changeemail-submit": "Адресни тюрлендир",
        "changeemail-cancel": "Ызына алыу",
+       "resettokens": "Токенлени джибер",
        "resettokens-tokens": "Токенле:",
        "bold_sample": "Къалын джазыу",
        "bold_tip": "Къалын джазыу",
-       "italic_sample": "Ð\9aÑ\83Ñ\80Ñ\81ив джазыу",
-       "italic_tip": "Ð\9aÑ\83Ñ\80Ñ\81ив джазыу",
+       "italic_sample": "СÑ\91дегей джазыу",
+       "italic_tip": "СÑ\91дегей джазыу",
        "link_sample": "Джибериуню башлыгъы",
        "link_tip": "Ич джибериу",
        "extlink_sample": "http://www.example.com линкни ачыкълауу",
        "savearticle": "Бетни сакъла",
        "preview": "Ал къарау",
        "showpreview": "Ал къарау",
-       "showlivepreview": "Терк ал къарау",
        "showdiff": "Къошулгъан тюрлениуле",
        "anoneditwarning": "'''Эс бёлюгюз''': Сиз системагъа кирмегенсиз. Сизни IP-адресигиз бу бетни тюрлениу тарихине джазыллыкъды.",
        "anonpreviewwarning": "''Сиз тергеу джазыуугъуз бла кирмегенсиз. Бетде тюрлениулени сакълатсагъыз, бетни тюрлениу тарихине IP-адресигиз джазыллыкъды.''",
        "edit-gone-missing": "Бет джангыртылмайды.\nКетерилген болур.",
        "edit-conflict": "Тюрлендириулени конфликти.",
        "edit-no-change": "Текстде тюрлениуле эсленмегени ючюн, сизни тюрлендириуюгюз къабыл этилмеди.",
-       "postedit-confirmation": "Тюрлендириуюгюз сакъланды.",
+       "postedit-confirmation-saved": "Тюрлендириуюгюз сакъланды.",
        "edit-already-exists": "Джангы бет къураргъа боллукъ тюлдю.\nАлайсызда барды бу атлы бет.",
        "defaultmessagetext": "Тынгылау бла текст",
        "content-failed-to-parse": "$2 контент $1 типге келишмейди: $3",
        "shown-title": "Бетде $1 {{PLURAL:$1|джазыуну}} кёргюз",
        "viewprevnext": "Къара: ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''Бу викиде «[[:$1]]» бет барды'''",
-       "searchmenu-new": "'''Бу вики-проектде «[[:$1]]» бетни къура!'''",
+       "searchmenu-new": "<strong>Бу вики-проектде «[[:$1]]» бетни къура!</strong>\n{{PLURAL:$2|0=|Дагъыда табылгъан излеу эсебге къарагъыз.|Дагъыда табылгъан излеу эсеблеге къарагъыз.}}",
        "searchprofile-articles": "Баш бетле",
-       "searchprofile-project": "Болушлукъ эм проект бетле",
        "searchprofile-images": "Мультимедия",
        "searchprofile-everything": "Хар къайда",
        "searchprofile-advanced": "Кенгерген",
        "searchprofile-articles-tooltip": "$1 ичинде изле",
-       "searchprofile-project-tooltip": "$1 ичинде изле",
        "searchprofile-images-tooltip": "Файлланы изле",
        "searchprofile-everything-tooltip": "Бютеу бетледе изле (сюзюу бетледе да)",
        "searchprofile-advanced-tooltip": "Энчи ат аланладада изле",
        "search-nonefound": "Соруу бла келишген эсеб джокъду",
        "powersearch-legend": "Кенг излеу",
        "powersearch-ns": "Атла аламда излеу:",
-       "powersearch-redir": "Джибериулени кёргюз",
        "powersearch-togglelabel": "Белгиле:",
        "powersearch-toggleall": "Барысы да",
        "powersearch-togglenone": "Бири да",
        "prefs-emailconfirm-label": "Электрон почтаны бегитиу:",
        "youremail": "Электрон почта:",
        "username": "{{GENDER:$1|Къошулуучу ат}}:",
-       "uid": "{{GENDER:$1|Къошулуучуну}} коду:",
        "prefs-memberingroups": "{{PLURAL:$1|1=Группаны|Группаланы}} {{GENDER:$2|члени}}:",
        "prefs-memberingroups-type": "$1",
        "prefs-registration": "Регистрацияны этилген заманы:",
        "prefs-advancedsearchoptions": "Кенгленнген джарашдырыула",
        "prefs-advancedwatchlist": "Кенгленнген джарашдырыула",
        "prefs-displayrc": "Кёрюнюуню джарашдырыулары",
-       "prefs-displaysearchoptions": "Кёрюнюуню джарашдырыулары",
        "prefs-displaywatchlist": "Кёрюнюуню джарашдырыулары",
        "prefs-diffs": "Версияланы башхалыкълары",
        "prefs-help-prefershttps": "Бу джарашдырыу эндиги авторизацияны ётгенден сора сингдирилликди.",
        "recentchanges-label-unpatrolled": "Бу тюрлендириу алкъын патруль этилинмегенди",
        "recentchanges-label-plusminus": "Бетни ёлчеми быллай бир байтха тюрленнгенди",
        "recentchanges-legend-newpage": "(къарагъыз: [[Special:NewPages|джангы бетлени тизмеси]])",
+       "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Тюбюрекде <strong>$2</strong> башлаб (<strong>$1</strong> дери) тюрлендириуле кёрюнедиле",
-       "rclistfrom": "$1 башлаб джангы тюрлениулени кёргюз",
+       "rclistfrom": "$3 $2 башлаб джангы тюрлениулени кёргюз",
        "rcshowhideminor": "гитче тюрлениулени $1",
        "rcshowhideminor-show": "кёргюз",
        "rcshowhideminor-hide": "джашыр",
        "uploadstash-refresh": "Файлланы тизмесин джангырт",
        "invalid-chunk-offset": "Фрагментни джарамагъан офсети",
        "img-auth-accessdenied": "Эркинлик джасакъланнганды",
-       "img-auth-nopathinfo": "<code>PATH_INFO</code> джокъду.\nСерверигиз бу билгилени джиберир ючюн джарашмагъанды.\nCGI тамалында ишлерге эмда <code>img_auth</code> бла ишлемезге болур.\nКъарагъыз: https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "<code>PATH_INFO</code> джокъду.\nСерверигиз бу билгилени джиберир ючюн джарашмагъанды.\nCGI тамалында ишлерге эмда <code>img_auth</code> бла ишлемезге болур.\nКъарагъыз: https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Изленнген джол джюклениулени папкасы бла байламлы тюлдю.",
        "img-auth-badtitle": "«$1» бла джараулу башлыкъ этилмейди.",
        "img-auth-nologinnWL": "Сиз системагъа кирмедигиз, эмда «$1» акъ тизмеде тюлдю.",
        "fewestrevisions": "Эм аз версиясы болгъан бетле",
        "nbytes": "$1 {{PLURAL:$1|байт}}",
        "ncategories": "$1 {{PLURAL:$1|категория}}",
+       "ninterwikis": "$1 {{PLURAL:$1|интервики}}",
        "nlinks": "$1 {{PLURAL:$1|джибериу}}",
        "nmembers": "$1 {{PLURAL:$1|объект}}",
+       "nmemberschanged": "$1 → $2 {{PLURAL:$2|объект}}",
        "nrevisions": "$1 {{PLURAL:$1|версия}}",
        "nviews": "$1 {{PLURAL:$1|къарау}}",
        "nimagelinks": "$1 {{PLURAL:$1|бетде}} хайырланады",
        "logempty": "Журналлагъа келишген билги джокъду.",
        "log-title-wildcard": "Бу символладан башланнган башлыкъланы изле",
        "allpages": "Бютеу бетле",
-       "alphaindexline": "$1 бетден $2 бетге дери",
        "nextpage": "Эндиги бет ($1)",
        "prevpage": "Алдагъы бет ($1)",
        "allpagesfrom": "Мунга башланнган бетлени чыгъар:",
        "watchlist-details": "Кёздеги тизмегизде сюзюу бетлери саналмай {{PLURAL:$1|бет|бет}} барды.",
        "wlheader-enotif": "E-mail бла хапар бериу джандырылыбды.",
        "wlheader-showupdated": "Ахыр кириуюгюзден сора бетни тюрлениулери '''къалын''' джазыу бла кёргюзюлгенди.",
-       "watchmethod-recent": "кёзде тургъан бетледе этилген ахыр тюрлениуле кёрюу",
-       "watchmethod-list": "кёзде тургъан бетледе этилген ахыр тюрлениуле кёрюу",
-       "watchlistcontains": "Кёзюгюзде тургъан тизмегизде $1 {{PLURAL:$1|1=бет|бет}} барды.",
-       "iteminvalidname": "'$1' элемент бла проблемала, джараусуз ат...",
        "wlnote2": "Тюбюнде, ахыр {{PLURAL:$1|сагъатны|<strong>$1</strong> сагъатны}} ичинден этилген тюрлениуле кёрюнедиле, $2, $3 заманда болумгъа кёре.",
        "wlshowlast": "Арт $1 сагъат $2 кюннге $3 кёргюз",
        "watchlist-options": "Кёзде тургъан тизмени джарашдырыулары",
        "enotif_lastvisited": "Ахыр кириуюгюзден бу кереге дери болгъан бютеу тюрлениулени кёрюр ючюн $1-ге къара.",
        "enotif_lastdiff": "Бу тюрлениуню кёрюр ючюн, $1 бетге къарагъыз.",
        "enotif_anon_editor": "аноним къошулуучу $1",
-       "enotif_body": "Багъалы $WATCHINGUSERNAME,\n\n{{SITENAME}} сайтдагъы $PAGETITLE башлыкълы бет $PAGEEDITDATE заманда $PAGEEDITOR джанындан $CHANGEDORCREATED тюзетилгенди неда тюрледирилгенди. Бетни ахыр халына $PAGETITLE_URL адресден кирирге боллукъсуз.\n\n$NEWPAGE\n\nТюрлендириуню этген къошлуучуну ангылатыуу: $PAGESUMMARY $PAGEMINOREDIT\n\nБетни тюрлендирген къошулуучуну билгилери:\nэл. почта: $PAGEEDITOR_EMAIL\nвики: $PAGEEDITOR_WIKI\n\nБу бетге киргинчигизге дери бу бет бла байламлы башха тюрлендириулени юсюнден хапар джибериллик тюлдю. Кёзде тургъан тизмегиздеги бютеу бетлени билдириу джибериу опцияларын джукълаталлыкъсыз.\n\n{{SITENAME}} сайтны билдириу системасы.\n\n--\n\nДжарашдырыуланы тюрлендирир ючюн:\n{{fullurl:{{#special:Watchlist}}/edit}}\n\nКёзде тургъан тизмеден кетерир ючюн:\n$UNWATCHURL\n\nБолушлукъ эм теджеуле ючюн:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Багъалы $WATCHINGUSERNAME,\n\n{{SITENAME}} сайтдагъы $PAGETITLE башлыкълы бет $PAGEEDITDATE заманда $PAGEEDITOR джанындан $CHANGEDORCREATED тюзетилгенди неда тюрледирилгенди. Бетни ахыр халына $PAGETITLE_URL адресден кирирге боллукъсуз.\n\n$NEWPAGE\n\nТюрлендириуню этген къошлуучуну ангылатыуу: $PAGESUMMARY $PAGEMINOREDIT\n\nБетни тюрлендирген къошулуучуну билгилери:\nэл. почта: $PAGEEDITOR_EMAIL\nвики: $PAGEEDITOR_WIKI\n\nБу бетге киргинчигизге дери бу бет бла байламлы башха тюрлендириулени юсюнден хапар джибериллик тюлдю. Кёзде тургъан тизмегиздеги бютеу бетлени билдириу джибериу опцияларын джукълаталлыкъсыз.\n\n{{SITENAME}} сайтны билдириу системасы.\n\n--\n\nДжарашдырыуланы тюрлендирир ючюн:\n{{fullurl:{{#special:Watchlist}}/edit}}\n\nКёзде тургъан тизмеден кетерир ючюн:\n$UNWATCHURL\n\nБолушлукъ эм теджеуле ючюн:\n$HELPPAGE",
        "created": "къуралды",
        "changed": "тюрленди",
        "deletepage": "Бетни кетер",
        "blockip": "Бу къошулуучуну блок эт",
        "blockip-legend": "Къошулуучуну блокга салыу",
        "blockiptext": "Тюбюндеги форманы хайырланыб белгили бир IP-ден неда регистрация этилген къошулуучуну тюрлениу этиуюню тыяллыкъсыз. Бу, джангыз вандализмни тыяр ючюн эм [[{{MediaWiki:Policy-url}}|джорукълагъа]] келишиулю этилирге керекди. Тюбюрек тыйыу бла байламлы ангылатыу джазыгъыз. (юлгю: -Бу- бетледе вандализм этилгенди).",
-       "ipadressorusername": "IP-адрес неда къошулуучу ат:",
+       "ipaddressorusername": "IP-адрес неда къошулуучу ат:",
        "ipbexpiry": "Бошаллыкъды (ётсе):",
        "ipbreason": "Чурум:",
        "ipbreason-dropdown": "* Тыйылыуну асламысында тюбеген чурумлары\n** Джалгъан билги къошуу\n** Бетлени ичиндегин кетериу\n** Тыш спам-сайтлагъа джибериу бериу\n** Бетлеге магъанасыз/ангыламсыз джазмала къошуу\n** Къошулуучуланы къоркъутургъа излеу\n** Талай тергеу джазыу къураб аманлыкъгъа хайырланыу\n** Джарамагъан къошулуучу ат",
        "tooltip-undo": "Этилиннген тюрлендириуню ызына ал эмда ал къарауну кёргюз, ызына нек алыннгын чертирча",
        "tooltip-preferences-save": "Джарашдырыуланы сакълат",
        "tooltip-summary": "Къысха ачыкълау джазыгъыз",
-       "notacceptable": "Бу вики-сервер сизни браузеригиз излеген форматда билгиле берелмейди.",
        "anonymous": "сайтны аноним {{PLURAL:$1|1=къошулуучулары|къошулуучулары}}",
        "siteuser": "{{SITENAME}} къошулуучу $1",
        "anonuser": "{{SITENAME}} аноним къошулуучу $1",
        "lastmodifiedatby": "Бет эм ахыр $3 джанындан $2, $1 заманда тюрлендирилгенди.",
        "othercontribs": "$1 джанындан этилген ишге тамалланады.",
        "others": "башхала",
-       "siteusers": "{{SITENAME}} {{PLURAL:$2|1=къошулуучу|къошулуучула}} $1",
-       "anonusers": "{{SITENAME}} аноним {{PLURAL:$2|1=къошулуучу|къошулуучула}} $1",
+       "siteusers": "{{SITENAME}} {{PLURAL:$2|къошулуучусу|къошулуучулары}} $1",
+       "anonusers": "{{SITENAME}} аноним {{PLURAL:$2|къошулуучусу|къошулуучулары}} $1",
        "creditspage": "Бетни кредитлери",
        "nocredits": "Бу къошулуучу ючюн кредит билги джокъду.",
        "spamprotectiontitle": "Спамгъа къаршчы фильтр",
        "pageinfo-article-id": "Бетни идентификатору",
        "pageinfo-language": "Бетни ичиндегисини тили",
        "pageinfo-content-model": "Батни ичиндегисини модели",
-       "pageinfo-robot-policy": "Излеу къуллукъла бла индексация",
+       "pageinfo-robot-policy": "Излеу роботла бла индексация",
        "pageinfo-robot-index": "Эркинлик берилгенди",
        "pageinfo-robot-noindex": "Эркинлик берилмегенди",
        "pageinfo-views": "Къарауланы саны",
        "pageinfo-category-pages": "Бетлени саны",
        "pageinfo-category-subcats": "Тюбкатегорияланы саны",
        "pageinfo-category-files": "Файлланы саны",
-       "skinname-cologneblue": "Кёльн такъылыкъ",
        "skinname-monobook": "Моно-китаб",
-       "skinname-modern": "Бусагъатдагъы",
        "skinname-vector": "Вектор",
        "markaspatrolleddiff": "Контроль этилгенин белгиле",
        "markaspatrolledtext": "Сыналгъан статья кибик белгиле",
        "newimages-summary": "Бу къуллукъ бет, кёб болмай джюкленнген файлланы кёргюзеди.",
        "newimages-legend": "Фильтр",
        "newimages-label": "Файлны аты (неда кесеги):",
-       "showhidebots": "($1 бот)",
        "noimages": "Кёрюр зат джокъду",
        "ilsubmit": "Таб",
        "bydate": "Хронологиягъа кёре",
        "size-kilobytes": "$1 КБ",
        "size-megabytes": "$1 МБ",
        "size-gigabytes": "$1 МБ",
-       "livepreview-loading": "Джюклениу...",
-       "livepreview-ready": "Джюклениу... Хазырды!",
-       "livepreview-failed": "Джанлы ал къарау джетишимсиз! Нормал ал къарауну сынагъыз.",
-       "livepreview-error": "Байланыу этиленмеди: $1 \"$2\".\nНормал ал къарауну хайырланыгъыз.",
        "lag-warn-normal": "$1 {{PLURAL:$1|секундан}} джангы тюрлендириуле бу тизмеде кёрюнмезге боллукъдула.",
        "lag-warn-high": "Билги базаны сервериндеги бек кечигиу себебли, $1 {{PLURAL:$1|секундан}} джангы тюрлендириуле бу тизмеде кёрюнмей къалыргъа болур.",
-       "watchlistedit-numitems": "Кёзде тургъан тизмеде {{PLURAL:$1|1 джазылгъан|$1 джазылгъан}} барды, сюзюу бетлени тышында.",
-       "watchlistedit-noitems": "Кёзюгюзде тургъан тизмегизде бир джазылгъан да джокъду.",
        "watchlistedit-normal-title": "Чынчыкълау спизокню тюрлендир",
        "watchlistedit-normal-legend": "Кёзюгюзде тургъан тизмегизден джазылгъанланы кетериу",
        "watchlistedit-normal-explain": "Кёзде тургъан тизмедеги бетле тюбюрекде кёргюзюлгендиле.\nДжазылгъанланы кетерир ючюн, къатындагъы тёртгюлчюкде белгилеб, «{{int:Watchlistedit-normal-submit}}» тиекден басыгъыз.\nСиз дагъыда [[Special:EditWatchlist/raw|тизмени текст кибик тюрлендирирге]] боллукъсуз.",
        "watchlistedit-raw-done": "Кёзюгюзде тургъан тизмегиз сакъланнганды.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 башлыкъ|$1 башлыкъ}} къошулду:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 башлыкъ|$1 башлыкъ}} кетерилди:",
+       "watchlistedit-clear-titles": "Башлыкъла:",
        "watchlisttools-view": "Тизмеден бетледе тюрлениуле",
        "watchlisttools-edit": "Тизмеге къарау эм тюрлендириу",
        "watchlisttools-raw": "Текстча тюрлендириу",
        "compare-rev2": "Экинчи версия",
        "compare-submit": "Тенглешдир",
        "compare-title-not-exists": "Белгиленнген башлыкъ джокъду.",
-       "dberr-header": "Бу викини проблемасы барды",
        "dberr-problems": "Кечериксиз! Бу сайтда техника джаны бла проблемала чыкъгъандыла.",
        "dberr-again": "Талай минутну сакълаб, джангыдан кириб кёрюгюз.",
        "dberr-info": "(билги базаны сервери бла байлам къурулалмайды: $1)",
        "htmlform-no": "Огъай",
        "htmlform-yes": "Хоу",
        "htmlform-chosen-placeholder": "Вариантны сайлагъыз",
+       "htmlform-cloner-create": "Энтда къош",
+       "htmlform-cloner-delete": "Кетер",
        "sqlite-has-fts": "$1 толу текст излеуню хайырландыргъан",
        "sqlite-no-fts": "$1 толу текст излеуню хайырландыра билмеген",
        "logentry-delete-delete": "$3 бетни $1 {{GENDER:$2|кетерди}}",
        "limitreport-title": "Анализаторну билгилери:",
        "limitreport-cputime": "Процессорну заманын хайырлан",
        "limitreport-cputime-value": "$1 {{PLURAL:$1|секунд}}",
+       "limitreport-walltime": "Керти заман режимде хайырланыу",
        "limitreport-walltime-value": "$1 {{PLURAL:$1|секунд}}",
+       "limitreport-ppvisitednodes": "Препроцессор кирген тюйюмчеклени саны",
+       "limitreport-ppgeneratednodes": "Препроцессор чыгъаргъан тюйюмчеклени саны",
+       "limitreport-postexpandincludesize": "Кенгерилген джандырыуланы ёлчеми",
        "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|байт}}",
        "limitreport-templateargumentsize": "Шаблонну арагументини ёлчеми",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|байт}}",
+       "limitreport-expansiondepth": "Кенгериуню эм уллу теренлиги",
+       "limitreport-expensivefunctioncount": "Анализаторну «багъа» функцияларыны саны",
        "expandtemplates": "Шаблонланы ачыу",
        "expand_templates_title": "{{FULLPAGENAME}} ючюн контекст башлыкъ эм д. а. к.:",
        "expand_templates_input": "Кириу текст:",
index 1419fc2..8a7e9cb 100644 (file)
@@ -6,7 +6,8 @@
                        "Purodha",
                        "Reedy",
                        "Rentenirer",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Dun de Links ungerstriche:",
@@ -19,7 +20,6 @@
        "tog-showtoolbar": "De Wärkzüchleß zom Ändere aanzeije",
        "tog-editondblclick": "Sigge met Dubbel-Klicke ändere",
        "tog-editsectiononrightclick": "Afschnedde met Räächs-Klecke op de Üvverschrefte ändere",
-       "tog-rememberpassword": "Op Duur enlogge op dämm Kompjuter un för dää Brauser (hält {{PLURAL:$1|för eine Daach|bes op $1 Dääsch|bloß för hück}})",
        "tog-watchcreations": "Donn Sigge beim neu Aanlääje automattesch för ming Oppaßlėß vörschlonn",
        "tog-watchdefault": "Donn Sigge beim Ändere automattesch för ming Oppaßlėß vörschlonn",
        "tog-watchmoves": "Donn Sigge beim Ömnänne automattesch för ming Oppaßlėß vörschlonn",
        "permalink": "Ne Permalink noh heh",
        "print": "Drocke",
        "view": "Beloore",
+       "view-foreign": "Op $1 beloohre",
        "edit": "Ändere",
        "create": "Aanlääje",
        "editthispage": "De Sigg ändere",
        "jumptonavigation": "Noh de Navigation",
        "jumptosearch": "Jangk Söke!",
        "view-pool-error": "Deiht uns leid, de ßöörvere han em Momang ze vill ze donn.\nZoh vill Metmaacher versöhke di Sigg heh aanzelohre.\nBes esu joot un waat e Weilsche, ih dat de versöhks, di Sigg noch ens opzeroofe.\n\n$1",
+       "generic-pool-error": "Schahd, onser ẞöövere han ze vell ze donn.\nZoh vill Lück welle dat heh beloohre.\nWaad ene Momang, ih dat De et wider versöhs.",
        "pool-timeout": "Zick zem Waade affjeloufe, diweil mer op en Sperr am Waade wohre",
        "pool-queuefull": "De Schlang zom Waade op ene freie Prozäß zom Beärbeide es vull",
        "pool-errorunknown": "Dä Fähler kenne mer nit",
        "readonly_lag": "De Daatebank es för en koote Zigg automattesch jesperrt, för de Daate vun de ongerjeodente Rääschner mem Houprääschner avzejliiche.",
        "internalerror": "De Wiki-Soffwär hät ene Fähler jefunge",
        "internalerror_info": "Enne ennere Fäähler en de ẞoffwäer es opjetrodde: $1",
-       "fileappenderrorread": "Mer kunnte „$1“ nit lässe, beim Aanhänge.",
-       "fileappenderror": "Mer kunnte „$1“ nit aan „$2“ aanhange.",
        "filecopyerror": "Kunnt de Datei „$1“ nit noh „$2“ kopeere.",
        "filerenameerror": "Kunnt de Datei „$1“ nit op „$2“ ömdäufe.",
        "filedeleteerror": "Kunnt de Datei „$1“ nit fottschmieße.",
        "directorycreateerror": "Dat Verzeichnis „$1“ kunnte mer nit aanläje.",
        "filenotfound": "Kunnt de Datei „$1“ nit finge.",
-       "fileexistserror": "Die Datei „$1“ kunnt mer nit neu schrieve. Se eß ald doh.",
        "unexpected": "Domet hät keiner jerechnet: „$1“=„$2“",
        "formerror": "Dat es donevve jejange: Wor nix, met däm Fomular.",
        "badarticleerror": "Dat jeiht met heh dä Sigg nit ze maache.",
        "gotaccountlink": "Enlogge",
        "userlogin-resetlink": "Häß De Ding Daate för et Enlogge verjäße?",
        "userlogin-resetpassword-link": "Paßwoot verjäße?",
-       "userlogin-loggedin": "Do bes ald als {{GENDER:$1|dä Metmaacher|de Metmaacherėn|dä Metmaacher|de Metmaacherėn|däMetmaacher}} [[User:$1|$1]] enjelogg. Met heh dämm Fommolaa kanns De jäz ävver onger enem andere Nahme enlogge.",
+       "userlogin-helplink2": "Hölp mem Enlogge",
+       "userlogin-loggedin": "Do bes ald als {{GENDER:$1|dä Metmaacher|de Metmaacherėn|dä Metmaacher|de Metmaacherėn|dä Metmaacher}} [[User:$1|$1]] enjelogg. Met heh dämm Fommolaa kanns De jäz ävver onger enem andere Nahme enlogge.",
        "userlogin-createanother": "Donn ene zohsäzlejje Zohjang aanlääje",
-       "createacct-join": "Jiv Ding Daate en:",
-       "createacct-another-join": "Maach de nüüdeje Aanjaabe för dä neue Zohjaang.",
        "createacct-emailrequired": "Ding Addräß för de <i lang=\"en\">e-mail</i>",
        "createacct-emailoptional": "Ding Addräß för de <i lang=\"en\">e-mail</i>, kann fott bliive",
        "createacct-email-ph": "Jiv Ding Addräß för de <i lang=\"en\">e-mail</i> en!",
        "suspicious-userlogout": "Do bes '''nit''' ußjelogg.\nEt süht us, wi wann ene kappodde Brauser udder <i lang=\"en\">proxy</i>ẞööver met Zwescheschpeischer noh däm Ußlogge jefrooch hät.",
        "createacct-another-realname-tip": "Dä reschteje Nahme kam_mer fott lohße.\n\nWann dä aanjejovve es, weet_e jebruch, öm öffentlesch de Schriiver för Beidrääsch ze nänne.",
        "pt-login": "Enlogge",
+       "pt-login-button": "Enlogge",
        "pt-createaccount": "Ene neue Zohjang aanmälde",
        "pt-userlogout": "Ußlogge",
        "php-mail-error-unknown": "Nit bekannte Fähler met dä Funxjohn <code lang=\"en\">mail()</code> vum PHP",
        "resetpass-abort-generic": "E Zohsazprojramm häd_et nit zohjelohße, et Paßwoot ze ändere.",
        "resetpass-expired": "Di Paßwood es afjeloufe. Donn jetz e neu Passwoot för et Enlogg faßlääje.",
        "resetpass-expired-soft": "Ding Paßwood es afjeloufe un moß neu jesaz wääde. Bes esu jood_un donn e neu Paßwoot ußsöhke, udder jangk op {{int:resetpass-submit-cancel}}, öm et schpääder ze säze.",
+       "resetpass-validity-soft": "Ding Kännwood es nit johd: $1\n\nSöhk Der e neu Kännwood us, udder jangg_op <em>{{int:resetpass-submit-cancel}}</em>, öm dat schpääder ze donn.",
        "passwordreset": "Et Paßwoot zeröck säze",
        "passwordreset-text-one": "Föll dat Fommolaa uß, öm Ding Paßwoot ze ändere.",
        "passwordreset-text-many": "{{PLURAL:$1|Föll ei vun dä Fälder en heh däm Fommolaa uß, öm e Zwesche_Paßwoot ze krijje.}}",
        "savearticle": "De Sigg Avspeichere",
        "preview": "Vör-Ansich",
        "showpreview": "Vör-Aansich zeije",
-       "showlivepreview": "Lebendije Vör-Aansich zeije",
        "showdiff": "De Ungerscheide zeije",
        "anoneditwarning": "'''Opjepaß:''' Weil De nit enjelogg bes, weed Ding <i lang=\"en\">IP</i>-Adräß en dä Sigg ier Leß met de Versione faßjehallde wääde.",
        "anonpreviewwarning": "''Weil De nit enjlogg bes, weed Ding <code lang=\"en\">IP</code>-Addräß zoamme met dä neue Version faßjehallde, wann de heh di Sigg avspeichere deihß.''",
        "edit-gone-missing": "Kunnt di Sigg nit änndere. Se schingk verschwunde un weed fottjeschemeße woode sin.",
        "edit-conflict": "Dubbelt beärbeit.",
        "edit-no-change": "Do häs ja nix aan dä Sigg jeändert, do dom_mer och nix domet.",
-       "postedit-confirmation": "Ding Änderunge sin nit faßjehallde.",
+       "postedit-confirmation-created": "Di Sigg es aanjelaat.",
+       "postedit-confirmation-restored": "Der ahle Zohschtand es widder zeröck jehollt.",
+       "postedit-confirmation-saved": "Ding Änderunge sin nit faßjehallde.",
        "edit-already-exists": "Kunnt kei neu Sigg aanlääje. Di Sigg jidd_et ald.",
        "defaultmessagetext": "Dä standaadmäßije Tex",
        "content-failed-to-parse": "Et wohr nit müjjelesch, dä Enhalld met däm <i lang=\"en\">MIME-Typ</i> $2 för en Dattei met $1 dren ze verwooschte: $3.",
        "node-count-exceeded-category": "Sigge, woh dä <i lang=\"en\" xml:lang=\"en\">node-count</i> övverschredde es",
        "node-count-exceeded-warning": "Heh di Sigg hät dä <i lang=\"en\" xml:lang=\"en\">node-count</i> övverschredde",
        "expansion-depth-exceeded-category": "Sigge, woh de <i lang=\"en\" xml:lang=\"en\">expansion depth</i> övverschredde es",
+       "expansion-depth-exceeded-category-desc": "Dat heh es de Saachjropp för Sigge, woh de <i lang=\"en\" xml:lang=\"en\">expansion depth</i> övverschreddde es.",
        "expansion-depth-exceeded-warning": "Heh di Sigg hät de <i lang=\"en\" xml:lang=\"en\">expansion depth</i> övverschredde",
        "parser-unstrip-loop-warning": "Ene Befähl em Täx betrick sesch op sesch sellef.",
        "parser-unstrip-recursion-limit": "Ene Befähl em Täx es mieh wi {{PLURAL:$1|eijmohl|$1 Mohl|jaa nit}} met  sesch sellef verschachtelt.",
        "revdelete-no-file": "De aanjejovve Dattei jidd_et nit.",
        "revdelete-show-file-confirm": "Beß De sescher, dat De de fottjeschmeße Version vun dä Dattei „<nowiki>$1</nowiki>“ vum $2 oö $3 Uhr aanloore wells?",
        "revdelete-show-file-submit": "Lohß Jonn!",
+       "revdelete-selected-text": "Di ußjesöhk Väsjohn{{PLURAL:$1||e|}} vun [[:$2]]:",
+       "revdelete-selected-file": "Di ußjesöhk Väsjohn{{PLURAL:$1||e|}} vun dä Dattei [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|Dä ußjewählte Logboch-Endrach|De Ußjewählte Logboch-Endrähsch}}:",
+       "revdelete-text-text": "Fottjeschmeße Väsjohne blieve en dä Leß met de vörrije Väsjohne, ävver zom Deil kann de Öffentleschkeit nit mieh drop zohjriehfe.",
+       "revdelete-text-file": "Fottjeschmeße Väsjohne vun Datteije blieve en dä Leß met de vörrije Väsjohne, ävver zom Deil kann de Öffentleschkeit nit mieh drop zohjriehfe.",
+       "logdelete-text": "Fottjeschmeße Endrääsch en de Logbööscher blieve en dä Leß met de vörrije Väsjohne, ävver zom Deil kann de Öffentleschkeit nit mieh drop zohjriehfe.",
+       "revdelete-text-others": "De Wiki_Kööbeße künne emmer noch drop zohjriefe un künne och wider för alle seeschbaa maache, wat jäz verschtoche es, esu lang kein äxtra Beschränkonge jemaat woodte.",
        "revdelete-confirm": "Bes esu joot un doon dat beschtääteje, un donn domet ongerschriive, dat De dat donn wells, dat De weiß, wat dobei eruß kütt, un dat De dat och noh de [[{{MediaWiki:Policy-url}}|Rääjelle]] deihß.",
        "revdelete-suppress-text": "Dat sullt '''blooß''' jedonn wäde för:\n* onjesäzlesche Aanjaabe\n* unjenehmesch persöhnlesch Daate\n*: ''Aanschreffte, Tellefoon- un ander Nummere, <span lang=\"en\" xml:lang=\"en\">e-mail</span> Adräß, uew.''",
        "revdelete-legend": "Dä öffentlije Zojang enschränke",
        "search-file-match": "(en dä Dattei dren)",
        "search-suggest": "Häß De „$1“ jemeint?",
        "search-interwiki-caption": "Schwesterprojekte",
-       "search-interwiki-default": "$1 hät heh di Träffer jefonge:",
+       "search-interwiki-default": "Op $1 woodte heh di Träffer jefonge:",
        "search-interwiki-more": "(mieh)",
        "search-relatedarticle": "Ähnlesch",
        "searcheverything-enable": "En alle Appachtemangs söhke",
        "search-nonefound": "Mer han nix zopaß jefonge för Ding Aanfrohch.",
        "powersearch-legend": "Extra Söhke",
        "powersearch-ns": "Söök en de Apachtemangs:",
-       "powersearch-redir": "Ömleidonge aanzeije",
        "powersearch-togglelabel": "&nbsp;",
        "powersearch-toggleall": "Övverall Höhksche draan maache",
        "powersearch-togglenone": "All Höhksche fott nämme",
        "prefs-emailconfirm-label": "Beshtätejung övver <i lang=\"en\">e-mail</i>:",
        "youremail": "E-Mail *",
        "username": "{{GENDER:$1|Metmaacher|Metmaacherėnne|Metmaacher|Metmaacherėnne|Metmaacher}} Name:",
-       "uid": "{{GENDER:$1|Metmaacher|Metmaacherėnne|Metmaacher|Metmaacherėnne|Metmaacher}} Nommer:",
        "prefs-memberingroups": "{{GENDER:$2|Bes}} en {{PLURAL:$1|de Metmaacherjrupp:|$1 Metmaacherjruppe:|keijn Metmaacherjruppe.}}",
        "prefs-registration": "Aanjemeldt zick",
        "prefs-registration-date-time": "dem $2 öm $3 Uhr",
        "prefs-advancedsearchoptions": "Extra Ußwahle",
        "prefs-advancedwatchlist": "Extra Ußwahle",
        "prefs-displayrc": "Ußwahle för et Leßte Aanzeje",
-       "prefs-displaysearchoptions": "Enstellunge för et Aanzeje",
        "prefs-displaywatchlist": "Enstellunge för et Aanzeje",
        "prefs-tokenwatchlist": "Schlößel",
        "prefs-diffs": "Ongerscheide un Verjliische",
        "right-move": "Sigge ömnenne",
        "right-move-subpages": "Sigge, un ier Ungersigge, zosamme ömnenne",
        "right-move-rootuserpages": "(Houp)-Metmaacher-Sigg Ömnänne",
+       "right-move-categorypages": "Sigge vun Saachjroppe ömbenänne",
        "right-movefile": "Dateie ömnenne",
        "right-suppressredirect": "Kein automatesche Ömleidong aanlääje beim Ömnenne",
        "right-upload": "Dateie huhlade",
        "action-createpage": "di Sigg aanzeläje",
        "action-createtalk": "Klaafsigge aanzeläje",
        "action-createaccount": "hee dä neue Metmaacher aanzemelde",
+       "action-history": "de Leß met de fröhjere Väsohne vun heh dä Sigg ze belohre",
        "action-minoredit": "hee di Änderung als klein „mini“ ze makkeere",
        "action-move": "di Sigg ömzebenänne",
        "action-move-subpages": "hee di Sigg un ier Ongersigge ömzebenänne",
        "action-move-rootuserpages": "enem Metmaacher sing (Houp)-Metmaacher-Sigg ömzenänne",
+       "action-move-categorypages": "Sigge vun Saachjroppe ömzebenänne",
        "action-movefile": "Die Datei ömnenne",
        "action-upload": "hee di Datei huhzelade",
        "action-reupload": "hee di Datei, di et ald jitt, ußzetuusche",
        "recentchanges-legend-newpage": "(Loor och noh de [[Special:NewPages|Leß met de neue Sigge]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Hee {{PLURAL:$1|es ein|sin bes op <strong>$1</strong>|es keine}} fun de Änderunge zick dem <strong>$3</strong> öm <strong>$4</strong> Uhr opjelėß.",
-       "rclistfrom": "Zeich de Änderunge vum $1 aan",
+       "rclistfrom": "Zeich de Änderunge vum $3 $2 aan",
        "rcshowhideminor": "$1 klein Mini-Änderunge",
        "rcshowhideminor-show": "Zeisch",
        "rcshowhideminor-hide": "Verschteihsch",
        "uploadstash-refresh": "De Leß met de Dateie op ene neue Shtand bränge",
        "invalid-chunk-offset": "Ene onjöltijje Aanfangspungk för dä Rötsch",
        "img-auth-accessdenied": "Keine Zohjang",
-       "img-auth-nopathinfo": "De <code lang=\"en\">PATH_INFO</code> fäählt.\nDä Webßööver es nit doför ennjerescht, di Ennfommazjuhn wigger ze jävve.\nHä künnd_op <code lang=\"en\">CGI</code> opjebout sin, un dröm <code lang=\"en\">img_auth</code> nit ongshtöze künne. Loor em [https://www.mediawiki.org/wiki/Manual:Image_Authorization Handbooch] noh, wat domet es.",
+       "img-auth-nopathinfo": "De <code lang=\"en\">PATH_INFO</code> fäählt.\nDä Webßööver es nit doför ennjerescht, di Ennfommazjuhn wigger ze jävve.\nHä künnd_op <code lang=\"en\">CGI</code> opjebout sin, un dröm <code lang=\"en\">img_auth</code> nit ongshtöze künne. Loor em [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization Handbooch] noh, wat domet es.",
        "img-auth-notindir": "Dä aanjefroochte Pat is nit em enjeschtallte Verzeischneß för et Huhlaade.",
        "img-auth-badtitle": "Uß „$1“ lööt sesch keine jöltijje Tittel maache.",
        "img-auth-nologinnWL": "Do bes nit ennjelogg, un „$1“ es nit op dä Leß met de zohjelohße Datteiname.",
        "download": "eronger laade",
        "unwatchedpages": "Sigge, wo keiner drop oppass",
        "listredirects": "Ömleitunge",
+       "listduplicatedfiles": "Leß met dubbelte Datteije",
+       "listduplicatedfiles-summary": "Dat heh es en Leß met Datteije, woh de neuste Väsjuhn vun es desällve es, wi de neuste Väsjuhn vun öhnds en ander Dattei. Bloß Datteije heh e Wiki sin med em Boot.",
+       "listduplicatedfiles-entry": "Zoh dä Dattei [[:File:$1|$1]] ham_mer [[$3|{{PLURAL:$2|a Dubbel|$2 Dubbelte|kein Dubbelte}}]] jefonge.",
        "unusedtemplates": "Schablone oder Baustein, die nit jebruch wääde",
        "unusedtemplatestext": "Hee sin all de Schablone opjeliss, die em Appachtemeng „{{ns:template}}“ sin, die nit en\nander Sigge enjefüg wääde. Ih De jet dovun fottschmieß, denk dran, se künnte och op en ander Aat jebruch\nwääde, un luur Der der iehr ander Links aan!",
        "unusedtemplateswlh": "ander Links",
        "pageswithprop-submit": "Lohß Jonn!",
        "doubleredirects": "Ömleitunge op Ömleitunge",
        "doubleredirectstext": "Hee fings De en jede Reih ene Link op de iertste un de zweite Ömleitung, donoh ene Link op de Sigg, wo de\nzweite Ömleitung hin jeiht. För jewöhnlich es dat dann och de richtije Sigg, wo de iertste Ömleitung ald hen jonn sullt.\n<del>Ußjeshtreshe</del> Reije sin ald äleedesh.\nMet däm „(Ändere)“-Link kanns De de eetste Sigg tirek aanpacke.\nTipp: Merk Der dä Tittel vun dä Sigg dovör.",
-       "double-redirect-fixed-move": "dubbel Ömleidong nohm Ömnenne automattesch opjelös: [[$1]] → [[$2]]",
+       "double-redirect-fixed-move": "Di Sigg [[$1]] es ömjenannt un längk jäz autmattesch öm op di Sigg [[$2]].",
        "double-redirect-fixed-maintenance": "De dubbelte Ömleidong vun [[$1]] noh [[$2]] wood opjelühß.",
        "double-redirect-fixer": "(Opjaveleß)",
        "brokenredirects": "Ömleitunge, die en et Leere jonn",
        "deadendpagestext": "De Atikele hee han kein Links op ander Atikele em Wiki.",
        "protectedpages": "Jeschötzte Sigge",
        "protectedpages-indef": "Nor de Sigge zeije, woh alleins de Wiki-Köbesse draan dörrve",
-       "protectedpages-summary": "He sin Sigge opjeliss, wo jäje Veränderunge un/odde jäje et Ömnenne jeschötz sin, su dat nit einfach Jede jet draan don kann.",
+       "protectedpages-summary": "He sin Sigge opjeließ, wo jäje et Verändere udder jäje et Ömnänne jeschötz sin.\nEn Leß met dä Sigge, di mer nit aanlääje darref, es op dä Sigg [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]] ze fenge.",
        "protectedpages-cascade": "Nur Sigge en ener Schotz-Kaskad",
        "protectedpages-noredirect": "Ömleidonge verschteische",
        "protectedpagesempty": "Op di Aat sin jrad kein Sigge jeschötz.",
        "protectedpages-unknown-timestamp": "Onbikannt",
        "protectedpages-unknown-performer": "Onbikannte Metmaacher",
        "protectedtitles": "Verbodde Titele för Sigge",
-       "protectedtitles-summary": "Hee sin verbodde Sigge-Tittele opjelis, unger dä Name ka'mer kein neu Sigge aanläje.",
+       "protectedtitles-summary": "Hee sin verbodde Sigge-Tittele opjeleß. Onger dä Name ka_mer kein neu Sigge aanläje.\nEn Leß met dä Sigge, di jäje et Verändere udder jäje et Ömnenne jeschötz sin, fengk mer op dä Sigg [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Op di Aat sin jrad kein Sigge jäje et neu Aanlääje jeschötz.",
        "listusers": "De Metmaacherleß",
        "listusers-editsonly": "Donn nor Metmaacher zeije, di och ens jät jeschrevve han.",
        "log-title-wildcard": "Sök noh Titelle, di aanfange met …",
        "showhideselectedlogentries": "Ußjesöhk Endrääsch verschteische udder zeije",
        "allpages": "All Sigge",
-       "alphaindexline": "$1 … $2",
        "nextpage": "De nächste Sigg: „$1“",
        "prevpage": "Vörijje Sigg ($1)",
        "allpagesfrom": "Sigge aanzeije av däm Name:",
        "listgrouprights-removegroup-self": "Kann sesch sällver {{PLURAL:$2|eruß nämme uß dä Metmaacherjropp:|uß $2 Metmaacherjroppe eruß nämme:|uß kei Metmaacherjropp eruß nämme.}} $1",
        "listgrouprights-addgroup-self-all": "Kann sesch sällver en alle Metmaacherjroppe erenn donn",
        "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",
+       "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.",
        "emailuser": "E-mail aan dä Metmaacher",
        "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ß.",
+       "addedwatchtext-short": "De Sigg  „$1“ es en Ding Oppaßleß openumme.",
        "removewatch": "Us de Oppassliss nämme",
        "removedwatchtext": "Die Sigg „[[:$1]]“ es jetz us de [[Special:Watchlist|Oppassliss]] erusjenomme.",
+       "removedwatchtext-short": "De Sigg  „$1“ es uß Dinge Oppaßleß eruß jenumme.",
        "watch": "Drop Oppasse",
        "watchthispage": "Op die Sigg oppasse",
        "unwatch": "Nimieh drop Oppasse",
        "unwatchthispage": "Nit mieh op die Sigg oppasse",
        "notanarticle": "Keine Atikkel",
        "notvisiblerev": "Di Version es fottjeschmesse",
-       "watchlist-details": "Do häs {{PLURAL:$1|<strong>ein</strong> Sigg|<strong>$1</strong> Sigge|<strong>kein</strong> Sigg}} en dä Oppassliss{{PLURAL:$1|, un di Klaafsigg dozo|, un de Klaafsigge dozo|}}.",
+       "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>.",
-       "watchmethod-recent": "Ben de letzte Änderunge jäje de Oppassliss am pröfe",
-       "watchmethod-list": "Ben de Oppassliss am pröfe, noh de letzte Änderung",
-       "watchlistcontains": "En dä Oppassliss {{PLURAL:$1|es ein Sigg|sinner <strong>$1</strong> Sigge|sinner <strong>kein</strong> Sigge}}.",
-       "iteminvalidname": "Dä Endrach „$1“ hät ene kapodde Name.",
        "wlnote2": "Heh sin de Änderonge us de läzde {{PLURAL:$1|Schtond|<strong>$1</strong> Schtonde|kein Schtond}} bes zom $2 öm $3 Uhr.",
        "wlshowlast": "Zeich de letzte | $1 | Stunde | $2 | Dage | $3 | aan, dun",
        "watchlist-options": "Eijeschaffte fun de Oppassless",
        "enotif_lastvisited": "Luur unger „$1“ - do fings de all die Änderunge zick Dingem letzte Besoch hee.",
        "enotif_lastdiff": "Loor op $1 för heh di Änderung aan_ze_loore.",
        "enotif_anon_editor": "Dä namelose Metmaacher $1",
-       "enotif_body": "Leeven $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\n{{int:summary}} „$PAGESUMMARY“ $PAGEMINOREDIT\n\nDo kanns dä Metmaacher „$PAGEEDITOR“ aanspräsche:\n* Övver e-mail: $PAGEEDITOR_EMAIL\n* Em Wiki: $PAGEEDITOR_WIKI\n\nDo kreß vun jetz aan kein e-mail mieh, bes dat Do\nDer di Sigg aanjeluurt häs wann De enjelogg bes,\noch wann se norr_ens verändert weed. Do kanns ävver\noch all die Merker för e-mail för die Sigge en Dinger\nOppaßleß op eimol ändere.\n\nEne schöne Jrohß {{GRAMMAR:vun|{{SITENAME}}}}.\n\n-- \nÖm de Enschtällonge för Nohreeschte aan Desch ze ändere,\njangk op:\n{{canonicalurl:{{#special:Preferences}}}}\n\nDo kanns heh Ding Oppaßleß ändere:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nÖm di Sigg vun Dinger Oppaßleß ze schmieße:\n$UNWATCHURL\n\nDo kanns heh noh Hölp luure:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Leeven $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\n{{int:summary}} „$PAGESUMMARY“ $PAGEMINOREDIT\n\nDo kanns dä Metmaacher „$PAGEEDITOR“ aanspräsche:\n* Övver e-mail: $PAGEEDITOR_EMAIL\n* Em Wiki: $PAGEEDITOR_WIKI\n\nDo kreß vun jetz aan kein e-mail mieh, bes dat Do\nDer di Sigg aanjeluurt häs wann De enjelogg bes,\noch wann se norr_ens verändert weed. Do kanns ävver\noch all die Merker för e-mail för die Sigge en Dinger\nOppaßleß op eimol ändere.\n\nEne schöne Jrohß {{GRAMMAR:vun|{{SITENAME}}}}.\n\n-- \nÖm de Enschtällonge för Nohreeschte aan Desch ze ändere,\njangk op:\n{{canonicalurl:{{#special:Preferences}}}}\n\nDo kanns heh Ding Oppaßleß ändere:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nÖm di Sigg vun Dinger Oppaßleß ze schmieße:\n$UNWATCHURL\n\nDo kanns heh noh Hölp luure:\n$HELPPAGE",
        "created": "neu aanjelaht",
        "changed": "jeändert",
        "deletepage": "Schmieß die Sigg jetz fott",
        "contributions-title": "Beidräsch fum  $1",
        "mycontris": "Beidrähch",
        "contribsub2": "För {{GENDER:$3|dä|et|dä Metmaacher|de|dat}} $1: $1 ($2)",
+       "contributions-userdoesnotexist": "Ene Metmaacher mem Nahme „$1“ ham_mer nit.",
        "nocontribs": "Mer han kein Änderunge jefonge, en de Logböcher, die do passe däte.",
        "uctop": "(Neuste)",
        "month": "un Moohnt:",
        "blockip": "Metmaacher sperre",
        "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.",
-       "ipadressorusername": "<i lang=\"en\">IP</i>-Adress oder Metmaacher Name:",
+       "ipaddressorusername": "<i lang=\"en\">IP</i>-Adress oder Metmaacher Name:",
        "ipbexpiry": "Duur, för wie lang",
        "ipbreason": "Aanlass:",
        "ipbreason-dropdown": "* Alljemein Jrönd för et Sperre\n** hät fekeehte Behouptunge udder Leeje en Atikele jeschrevve\n** hät Sigge fottjeschmesse udder leddig jemaat\n** hält sesch iewesch nit aan de Rejelle övver de Links op anger Websigge un jäje der Link-SPAM\n** hät Sigge met Shtuß udder Kauderwelsch drop aajelaat udder Keu en Sigge jedonn\n** deit Medmaacher bedrohe, beleijije, udder schlääsch maache\n** hät mieh wie eine Metmaachername un deit domet Schmuu maache\n* Op der Name betrocke Jrönd\n** esu ene Metmaacher-Name wolle mer nit\n* Op en IP-Adräß betrocke Jrönd\n** dat es en Proxy-ẞööver övver dänn de Lück zo vill Driß aanjestellt han",
        "movepagetalktext": "Dä Sigg ehr Klaafsigg, wann se ein hät, weed automatisch met  ömjenannt, '''usser''' wann:\n* de Sigg en en ander Appachtemeng kütt,\n* en Klaafsigg met däm neue Name ald do es, un et steiht och jet drop,\n* De unge en däm Kääsje '''kei''' Hökche aan häs.\nEn dänne Fäll, muss De Der dä Enhald vun dä Klaafsigge selvs vörnemme, un eröm kopeere watte bruchs.",
        "movearticle": "Sigg zem Ömnenne:",
        "moveuserpage-warning": "'''Opjepaß:''' Do wells en Metmaachersigg ömnänne, domet weed ävver dä Metmaacher sellver ''nit'' met ömjenannt.",
+       "movecategorypage-warning": "<strong>Opjepaß:</strong> Do kanns bloß di Sigg vun dä Saachjropp ömbenänne. Sigge, di en dä ahle Saachjropp sin, blieve doh. Se kumme nit met en di neue Saachjropp.",
        "movenologintext": "Do mööts ald aanjemeldt un [[Special:UserLogin|enjelogg]] sin, öm en Sigg ömzenenne.",
        "movenotallowed": "Do kriss nit erlaub, en däm Wiki heh de Sigge ömzenenne.",
        "movenotallowedfile": "Do häs nit dat Rääsch, Dateie ömzenenne.",
        "cant-move-user-page": "Do häs nit dat Rääsch, öm enem Metmaacher sing eetzte Sigg ömzedeufe.",
        "cant-move-to-user-page": "Do häs nit dat Rääsch, en Sigg tirkäk op en Metmaacher-Sigg ömzenänne, Do kanns se ävver op en Ungersigg dofun ömnenne.",
+       "cant-move-category-page": "Do häß nit dat Rääsch, Saachjroppesigge ömzebenänne.",
+       "cant-move-to-category-page": "Do häß nit dat Rääsch, en Sigg obb en Saachjroppesigg ömzebenänne.",
        "newtitle": "op dä neue Name",
        "move-watch": "Op die Sigg heh oppasse",
        "movepagebtn": "Ömnenne",
        "group-bot.js": "/* De JavaSkreppte fun hee krijje bloß de Bots jescheck */",
        "group-sysop.js": "/* De JavaSkreppte fun hee krijje bloß de Wiki_Köbeße jescheck */",
        "group-bureaucrat.js": "/* De JavaSkreppte fun hee krijje bloß de Bürrokraate jescheck */",
-       "notacceptable": "<strong>Blöd:</strong> Dä Wiki_Sörver kann de Daate nit en einem Format erüvverjevve, wat Dinge Client oder Brauser verstonn künnt.",
        "anonymous": "Namelose {{PLURAL:$1|Metmaacher|Metmaacher|Metmaacher}} vun {{GRAMMAR:Dat|{{SITENAME}}}}",
        "siteuser": "{{SITENAME}}-Metmaacher $1",
        "anonuser": "dä nameloose Metmaacher $1 {{GRAMMAR:Genitive vum|{{SITENAME}}}}",
        "newimages-summary": "Heh die Sigg zeig die zoletz huhjeladene Belder un Dateie aan.",
        "newimages-legend": "Ußwähle",
        "newimages-label": "Dä Dattei ier Name udder e Stöck dofun:",
-       "showhidebots": "(Bots $1)",
+       "newimages-showbots": "Zeisch, wat de Bots huhjelaade han.",
        "noimages": "Kein Dateie jefunge.",
        "ilsubmit": "Söhk",
        "bydate": "nohm Datum",
        "word-separator": "&#32;",
        "ellipsis": "&nbsp;…",
        "parentheses": "($1)",
+       "quotation-marks": "„$1“",
        "imgmultipageprev": "← de Sigg dovör",
        "imgmultipagenext": "de Sigg donoh →",
        "imgmultigo": "Lohß Jonn!",
        "bitrate-exabits": "$1&nbsp;Ebps",
        "bitrate-zetabits": "$1&nbsp;Zbps",
        "bitrate-yottabits": "$1&nbsp;Ybps",
-       "livepreview-loading": "Ben aam Laade{{int:ellipsis}}",
-       "livepreview-ready": "Fädesch jelaade.",
-       "livepreview-failed": "De lebendije Vör-Ansich klapp jrad nit.\nDon de nomaale Vör-Ansich nemme.",
-       "livepreview-error": "Kein Verbendung müjjelisch: $1 „$2“.\nDon de nomaale Vör-Ansich nemme.",
        "lag-warn-normal": "Änderunge us de letzte {{PLURAL:$1|Sekund|$1 Sekunde|knappe Sekund}} sin en dä Leß wall noch nit opjenomme.",
        "lag-warn-high": "Dä Datebankßööver hät jrad vill ze donn.\nÄnderunge us de letzte {{PLURAL:$1|Sekund|$1 Sekunde|knappe Sekund}} sin dröm en dä Leß heh wall noch nit opjenomme.",
-       "watchlistedit-numitems": "En Dinge Oppassliss {{PLURAL:$1|es eine Endrach|sen $1 Endräsch|es keine Endrach}} — Klaafsigge dozoh zälle nit ëxtra.",
-       "watchlistedit-noitems": "Ding Oppassliss es leddisch.",
        "watchlistedit-normal-title": "Oppassliss beärbeijde",
        "watchlistedit-normal-legend": "Titell uß de Oppassliss eruß lohße",
        "watchlistedit-normal-explain": "Dat sin de Endräsch en Dinge Oppaßleß.\nÖm einzel Titelle loßß ze wääde, don Hökche en de Kässjer nevve inne maache, un dann deuß De dä Knopp „{{int:watchlistedit-normal-submit}}“.\nDo kanns Ding Oppassleß och [[Special:EditWatchlist/raw|en rüh beärbeide]].",
        "watchlistedit-raw-done": "Ding Oppassliss es fassjehallde.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Eine Sigge-Tittel wood|<strong>$1</strong> Sigge-Tittele woodte|Keine Sigge-Tittel}} dobeijedonn:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Eine Endrach es eruß jefloore:|<strong>$1</strong> Endräsh es eruß jefloore:|Keine Endrach es eruß jefloore.}}",
+       "watchlistedit-clear-title": "Oppaßleß läddesch jemaad",
+       "watchlistedit-clear-legend": "Oppaßleß läddesch maache",
+       "watchlistedit-clear-explain": "Alle vun heh dä Siggetettelle fleeje uß dä Oppaßless eruß.",
+       "watchlistedit-clear-titles": "Siggetettelle",
+       "watchlistedit-clear-submit": "Maach Ding Oppaßleß läddesch.",
+       "watchlistedit-clear-done": "Ding Oppaßleß es läddesch jemaad.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|Eine Siggetettel wood|$1 Siggetettele sin}} eruß jenumme:",
+       "watchlistedit-too-many": "Et sen zoh vell Sigge för heh aanzezeije.",
+       "watchlisttools-clear": "Maach de Oppaßleß läddesch",
        "watchlisttools-view": "Oppaßliß — Änderunge zeije",
        "watchlisttools-edit": "beloore un beärbede",
        "watchlisttools-raw": "rüh beärbeijde | expochteere | empochteere",
        "compare-invalid-title": "Dä aanjejovve Tettel es nit jöltesch",
        "compare-title-not-exists": "De aanjejovve Sigg jidd_et nit.",
        "compare-revision-not-exists": "Dä aanjejovve Version jidd_et jaa nit.",
-       "dberr-header": "Dat Wiki heh häd en Schwierischkeit",
        "dberr-problems": "Deit uns leid, die Sigg heh häd för der Momang e teschnisch Problem.",
        "dberr-again": "Versök eijfach en e paa Menutte, norr_ens die Sigg afzeroofe.",
        "dberr-info": "(Mer han kei Verbindung noh_m Datebank-ẞööver krijje künne: $1)",
        "htmlform-no": "Nää",
        "htmlform-yes": "Joh",
        "htmlform-chosen-placeholder": "Söhk jäd_uß",
+       "htmlform-cloner-create": "Mieh derbei donn",
+       "htmlform-cloner-delete": "Fottnämme",
+       "htmlform-cloner-required": "Winnischsdens eine Wääd es nühdesch.",
        "sqlite-has-fts": "Version $1 (un kann en janze Täxte söhke)",
        "sqlite-no-fts": "Version $1 (kann ävver nit en janze Täxte söhke)",
        "logentry-delete-delete": "{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät di Sigg „$3“ fottjeschmeße.",
index 72deaa9..b9b62ad 100644 (file)
@@ -12,7 +12,8 @@
                        "Krinkle",
                        "Liangent",
                        "The Evil IP address",
-                       "Welathêja"
+                       "Welathêja",
+                       "아라"
                ]
        },
        "tog-underline": "Xetekê di bin girêdanê de çêke:",
@@ -25,7 +26,6 @@
        "tog-showtoolbar": "Tiştên guherandinê bibîne (JavaScript bibîne)",
        "tog-editondblclick": "Rûpelan bi du klîkan biguherîne (Java Script gireke)",
        "tog-editsectiononrightclick": "Beşekê bi rast-klîkekê biguherîne (JavaScript gireke)",
-       "tog-rememberpassword": "Qeyda min di vê komputerê de biparêze (herî zêde ji bo $1 {{PLURAL:$1|rojekê|rojan}})",
        "tog-watchcreations": "Rûpelên min çêkirin, têxe nav lîsteya min a şopandinê",
        "tog-watchdefault": "Rûpelên min guhertin, têxe nav lîsteya min a şopandinê",
        "tog-watchmoves": "Rûpelên min navê wan guhertin, têxe nav lîsteya min a şopandinê",
        "readonly_lag": "Bingeha daneyan otomatîk hate girtin, ji bo server ên bingeha daneyên girêdayî karibin xwe bikêrhatî bikin.",
        "internalerror": "Çewtiyeke navxweyî",
        "internalerror_info": "Çewtiya navxweyî: $1",
-       "fileappenderror": "\"$1\" li \"$2\" nehate zêdekirin.",
        "filecopyerror": "Daneya \"$1\" ji bo \"$2\" naye kopîkirin.",
        "filerenameerror": "Navê pelê \"$1\" nebû \"$2\".",
        "filedeleteerror": "\"$1\" jê nehate birîn.",
        "directorycreateerror": "Rêbera \"$1\" nehate çêkirin.",
        "filenotfound": "Pela bi navê \"$1\" nehate dîtin.",
-       "fileexistserror": "\"$1\" nehate çêkirin , ji ber ku ev pel heye.",
        "unexpected": "Tiştekî nedihate hêvîkirin: \"$1\"=\"$2\".",
        "formerror": "Çewtî: Ew nivîs pêk nehat.",
        "badarticleerror": "Ev çalakî di vê rûpelê de nabe.",
        "savearticle": "Rûpelê tomar bike",
        "preview": "Pêşdîtin",
        "showpreview": "Pêşdîtinê nîşan bide",
-       "showlivepreview": "Pêşdîtina zindî",
        "showdiff": "Guherandinan nîşan bide",
        "anoneditwarning": "'''Hişyarî:''' Tu netêketî yî! Navnîşana IP'ya te wê di dîroka guherandina vê rûpelê de bê tomarkirin.",
        "anonpreviewwarning": "''Tu ne têketî yî. Tomarkirin wê navnîşana IP'ya te di dîroka guhertinan de nîşan bide.''",
        "log-fulllog": "Tevahiya wê bibîne",
        "edit-conflict": "Têkçûna guherandinan.",
        "edit-no-change": "Guherandina te nehate hesibandin, ji ber ku guherandinên nivîsê tune bûn.",
-       "postedit-confirmation": "Guhertina te hate tomarkirin.",
+       "postedit-confirmation-saved": "Guhertina te hate tomarkirin.",
        "edit-already-exists": "Nikarî rûpeleka nuh çêke.\nEw berê heye.",
        "content-model-css": "CSS",
        "undo-success": "Ev guherandin dikare were şûndekirin. Ji kerema xwe ferqa piştî tomarkirinê bibîne, bê ka tu dixwazî vê guhertoyê tomar bikî an na. Ger te şaşîtiyek kir, ji kerema xwe derkeve.",
        "search-nonefound": "Ti rûpelên wek ya daxwazkirî nînin.",
        "powersearch-legend": "Lê bigere",
        "powersearch-ns": "Di valahiya navan de lêbigere:",
-       "powersearch-redir": "Lîsteya beralîkirinan",
        "powersearch-togglelabel": "Kontrol bike:",
        "powersearch-toggleall": "Hemû",
        "powersearch-togglenone": "Tune",
        "prefs-advancedsearchoptions": "Vebijarkên berfireh",
        "prefs-advancedwatchlist": "Vebijarkên berfireh",
        "prefs-displayrc": "Vebijarkan nîşan bide",
-       "prefs-displaysearchoptions": "Vebijarkan nîşan bide",
        "prefs-displaywatchlist": "Vebijarkan nîşan bide",
        "prefs-diffs": "Cudahî",
        "email-address-validity-valid": "E-name derbasdar e",
        "recentchanges-summary": "Guhertinên herî dawî yên wîkiyê li ser vê rûpelê bişopîne.",
        "recentchanges-label-minor": "Ev guhertineka biçûk e",
        "recentchanges-legend-newpage": "$1 - rûpela nû",
-       "rclistfrom": "Guherandinên ji $1 şûnde nîşan bide",
+       "rclistfrom": "Guherandinên ji $3 $2 şûnde nîşan bide",
        "rcshowhideminor": "Guherandinên biçûk $1",
        "rcshowhidebots": "Bot'an $1",
        "rcshowhideliu": "Bikarhênerên qeydkirî $1",
        "watchlist-details": "{{PLURAL:$1|Rûpeleka|$1 rûpel}} li ser lîsteya te ya şopandinê, rûpelên gotûbêjê nayên jimartin.",
        "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.",
-       "watchlistcontains": "Di lîsteya şopandina te de {{PLURAL:$1|rûpelek heye|$1 rûpel hene}}.",
        "wlshowlast": "Guhertinên berî $1 saetan, $2 rojan, ya $3 nîşan bide",
        "watchlist-options": "Vebijarkên lîsteya şopandinê",
        "watching": "Bişopîne...",
        "enotif_reset": "Hemû rûpelan wek lêsekirî nîşanbide",
        "enotif_impersonal_salutation": "Bikarhênerî {{SITENAME}}",
        "enotif_anon_editor": "Bikarhênerê/a neqeydkirî $1",
-       "enotif_body": "Birêz $WATCHINGUSERNAME,\n\n\nRûpela {{SITENAME}} $PAGETITLE hate $CHANGEDORCREATED di roja $PAGEEDITDATE de ji aliyê $PAGEEDITOR ve, ji kerema xwe li $PAGETITLE_URL ji bo guhertoya niha li $NEWPAGE binêre.\n\nKurtnivîsa bikarhêner: $PAGESUMMARY $PAGEMINOREDIT\n\nJi bo bikarhêner peyamekê binivisîne:\nE-name: $PAGEEDITOR_EMAIL\n{{SITENAME}}: $PAGEEDITOR_WIKI\n\nHeta tu li vê guherandinê nenêrî, peyamên din ên guhertinê yên vê rûpelê nayên nîşandan.\n\n             Peyamên {{SITENAME}}\n\n--\nHeke tu dixwazî lîsteya xwe ya şopandinê biguherînî, li\n{{canonicalurl:{{#special:EditWatchlist}}}} binêre.\n\nPaşagahîdan û alîkaraya din:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Birêz $WATCHINGUSERNAME,\n\n\nRûpela {{SITENAME}} $PAGETITLE hate $CHANGEDORCREATED di roja $PAGEEDITDATE de ji aliyê $PAGEEDITOR ve, ji kerema xwe li $PAGETITLE_URL ji bo guhertoya niha li $NEWPAGE binêre.\n\nKurtnivîsa bikarhêner: $PAGESUMMARY $PAGEMINOREDIT\n\nJi bo bikarhêner peyamekê binivisîne:\nE-name: $PAGEEDITOR_EMAIL\n{{SITENAME}}: $PAGEEDITOR_WIKI\n\nHeta tu li vê guherandinê nenêrî, peyamên din ên guhertinê yên vê rûpelê nayên nîşandan.\n\n             Peyamên {{SITENAME}}\n\n--\nHeke tu dixwazî lîsteya xwe ya şopandinê biguherînî, li\n{{canonicalurl:{{#special:EditWatchlist}}}} binêre.\n\nPaşagahîdan û alîkaraya din:\n$HELPPAGE",
        "created": "hate afirandin",
        "changed": "hate guhertin",
        "deletepage": "Rûpelê jê bibe",
        "blockip": "Bikarhêner asteng bike",
        "blockip-legend": "Bikarhêner asteng bike",
        "blockiptext": "Ji bo astengkirina nivîsandinê ya ji navnîşaneke IP'yê an jî ji bikarhênerekî/ê, vê formê bikarbîne.\nDivê ev tenê ji bo sekinandina vandalîzmê were bikaranîn, ku divê li gorî [[{{MediaWiki:Policy-url}}|rêgezê]] be.\n\nSedemekê binivîse!",
-       "ipadressorusername": "adresê IP'yekê ya navekî bikarhênerekî",
+       "ipaddressorusername": "adresê IP'yekê ya navekî bikarhênerekî",
        "ipbexpiry": "Dem:",
        "ipbreason": "Sedem",
        "ipbreason-dropdown": "*Sedemên astengkirinê\n** Vandalîzm\n** Agahiya şaş dikire gotarekê\n** Naveroka rûpelekê vala kir\n** Girêdanên xerab tevlî rûpelan dikir\n** Tiştên tewş tevlî gotaran dikir\n** Heqaretkirin\n** Pir hesab bikaranîn\n** Navekî ku nayê pejirandin",
        "imagelisttext": "Jêr lîsteyek ji $1 file'an heye, duxrekirin $2.",
        "newimages-summary": "Ev rûpela taybet dosyeyên ku herî dawî hatine barkirin, nîşan dide.",
        "newimages-legend": "Parzûn",
-       "showhidebots": "(Bot'an $1)",
        "noimages": "Ne tiştek tê dîtin.",
        "ilsubmit": "Lêgerîn",
        "bydate": "li gor dîrokê",
        "autosumm-replace": "'$1' ket şûna rûpelê.",
        "autoredircomment": "Ji bo [[$1]] hate beralîkirin",
        "autosumm-new": "Rûpela nû: \"$1\"",
-       "livepreview-loading": "Tê…",
-       "livepreview-ready": "Bar dibe… Amade ye!",
        "lag-warn-normal": "Sererastkirinên piştî $1 çirkeyan hatine çêkirin belkî neyên weşandin.",
        "lag-warn-high": "Ji bo westinê sistêmê ew xeyrandin, yê piştî $1 sanîyan hatine çêkirin netên wêşendan.",
-       "watchlistedit-numitems": "Di lîsteya te ya şopandinê de {{PLURAL:$1|gotarek heye.|$1 gotar hene.}} (ji xeynî rûpela gotûbêjan).",
-       "watchlistedit-noitems": "Di lîsteya te ya şopandinê  de gotar tune ne.",
        "watchlistedit-normal-title": "Lîsteya xwe ya şopandinê biguherîne",
        "watchlistedit-normal-legend": "Gotaran ji lîsteya min ya şopandinê rake",
        "watchlistedit-normal-submit": "Gotaran jê bibe",
        "compare-rev1": "Revîzyon 1",
        "compare-rev2": "Revîzyon 2",
        "compare-submit": "Bide berhev",
-       "dberr-header": "Problemeka vê wiki'yê heye.",
        "htmlform-submit": "Tomar bike",
        "htmlform-reset": "Guherandinan vegerîne",
        "htmlform-selectorother-other": "Yên din",
index e834c24..bbaef68 100644 (file)
@@ -9,7 +9,8 @@
                        "Nemo bis",
                        "Nicky.ker",
                        "Nrowe",
-                       "Scryfer"
+                       "Scryfer",
+                       "아라"
                ]
        },
        "tog-underline": "Islinenna kevrennow:",
@@ -22,7 +23,6 @@
        "tog-showtoolbar": "Diskwedhes an toulvar chanjya (res yw JavaScript)",
        "tog-editondblclick": "Chanjya folennow ow tobyl-glyckya (res yw JavaScript)",
        "tog-editsectiononrightclick": "Galosegi chanjya trehow dre dhyhow-glyckya war ditlys an trehow (res yw JavaScript)",
-       "tog-rememberpassword": "Perthi kov a'm omgelmi war an beurel-ma (rag $1 {{PLURAL:$1|dydh}} dhe'n moyha)",
        "tog-watchcreations": "Keworra folennow gwruthys genev ha restrennow ughkergys genev dhe'm rol golyas",
        "tog-watchdefault": "Keworra folennow ha restrennow chanjys genev dhe'm rol golyas",
        "tog-watchmoves": "Keworra folennow ha restrennow gwayys genev dhe'm rol golyas",
        "gotaccountlink": "Omgelmi",
        "userlogin-resetlink": "A ankevsowgh hwi agas manylyon omgelmi?",
        "userlogin-resetpassword-link": "Dassettya agas ger tremena",
-       "createacct-join": "Entrewgh agas kedhlow a-woles.",
        "createacct-emailrequired": "Trigva ebost",
        "createacct-emailoptional": "Trigva ebost (a-dhewis)",
        "createacct-email-ph": "Entrewgh agas trigva ebost",
        "savearticle": "Gwitha an folen",
        "preview": "Ragwel",
        "showpreview": "Diskwedhes ragwel",
-       "showlivepreview": "Ragwel byw",
        "showdiff": "Diskwedhes an chanjyow",
        "anoneditwarning": "'''Gwarnyans:''' Nyns owgh omgelmys.\nRekordys vydh agas trigva IP yn istori an folen-ma.",
        "anonpreviewwarning": "''Nyns owgh omgelmys. Dre witha, agas trigva IP a vydh rekordyes istori chanjya an folen-ma.''",
        "search-nonefound": "Nyns esa sewyans vyth owth omdhesedha orth an govyn.",
        "powersearch-legend": "Hwilans avonsys",
        "powersearch-ns": "Hwilas yn spasys-hanow:",
-       "powersearch-redir": "Rolya daskedyansow",
        "powersearch-togglelabel": "Dewis:",
        "powersearch-toggleall": "Oll",
        "powersearch-togglenone": "Nagonan",
        "prefs-advancedsearchoptions": "Etholyow avonsys",
        "prefs-advancedwatchlist": "Etholyow avonsys",
        "prefs-displayrc": "Etholyow diskwedhes",
-       "prefs-displaysearchoptions": "Etholyow diskwedhes",
        "prefs-displaywatchlist": "Etholyow diskwedhes",
        "userrights-user-editname": "Entrewgh hanow devnydhyer:",
        "userrights-groupsmember": "Esel a:",
        "recentchanges-label-bot": "Gwrys veu an chanj-ma gans bott",
        "recentchanges-label-unpatrolled": "Ny veu an chanj-ma patrolyes hwath",
        "recentchanges-legend-newpage": "$1 - folen nowyth",
-       "rclistfrom": "Diskwedhes chanjyow nowyth yn unn dhalleth dhyworth $1.",
+       "rclistfrom": "Diskwedhes chanjyow nowyth yn unn dhalleth dhyworth $3 $2",
        "rcshowhideminor": "$1 chanjyow byhan",
        "rcshowhidebots": "$1 bottow",
        "rcshowhideliu": "$1 devnydhoryon omgelmys",
        "autosumm-blank": "Gwakhes veu an folen",
        "autoredircomment": "Folen daskedyes war-tu ha [[$1]]",
        "autosumm-new": "Folen gwruthys gans: '$1'",
-       "livepreview-loading": "Ow karga...",
-       "livepreview-ready": "Ow karga... Parys!",
-       "watchlistedit-noitems": "Nyns eus folen vyth y'gas rol wolya.",
        "watchlistedit-normal-title": "Chanjya an rol wolya",
        "watchlistedit-normal-legend": "Dilea folennow dhyworth agas rol wolya",
        "watchlistedit-normal-explain": "Yma diskwedhys a-woles folennow war agas rol wolya.\nRag dilea folen, checkyewgh an gisten rybdhi, ha klyckyewgh \"{{int:Watchlistedit-normal-submit}}\".\nHwi a yll [[Special:EditWatchlist/raw|chanjya restren an rol wolya]] ynwedh.",
        "blankpage": "Folen wag",
        "tag-filter": "Sidhel [[Special:Tags|tagyow]]:",
        "tags-edit": "chanjya",
-       "dberr-header": "An wiki-ma a'n jeves kudyn",
        "dberr-problems": "Drog yw genen! An wiasva-ma a's teves kaletter teknogel.",
        "dberr-again": "Assayewgh gortos pols ha daskarga.",
        "dberr-info": "(Ny yllir kestava orth servyer an database: $1)",
index eec3209..d0a703d 100644 (file)
@@ -11,7 +11,8 @@
                        "Muratjumashev",
                        "Tynchtyk Chorotegin",
                        "Ztimur",
-                       "Викиней"
+                       "Викиней",
+                       "아라"
                ]
        },
        "tog-underline": "Шилтемелердин алдын сызуу:",
@@ -24,7 +25,6 @@
        "tog-showtoolbar": "Оңдоо учурунда аспаптар тактасын көрсөтүү (JavaScript талап кылынат)",
        "tog-editondblclick": "Эки басып баракты оңдоо (JavaScript талап кылынат)",
        "tog-editsectiononrightclick": "Бөлүмдүн башжазуусун чычкандын оң баскычы менен басканда оңдоп-түзөө бөлүгүн ачуу (JavaScript талап кылынат)",
-       "tog-rememberpassword": "Бул браузердин эсинде эсеп жазуумду ($1 {{PLURAL:$1|күн}}) сактоо",
        "tog-watchcreations": "Көзөмөл тизмеме мен жараткан барактарды жана мен жүктөгөн файлдарды кошуу",
        "tog-watchdefault": "Мен өзгөрткөн барактарды жана файлдарды көзөмөл тизмеме кошуу",
        "tog-watchmoves": "Мен атын өзгөрткөн барактарды жана файлдарды көзөмөл тизмеме кошуу",
        "missingarticle-diff": "(айырмасы: $1, $2)",
        "internalerror": "Ички ката",
        "internalerror_info": "Ички ката: $1",
-       "fileappenderrorread": "Аягына кошуу үчүн «$1» файлы ачылбады.",
-       "fileappenderror": "\"$1\" файлы \"$2\" файлынын аягына кошулбады.",
        "filecopyerror": "\"$1\" файлы \"$2\" файлына көчүрүлбөдү.",
        "filerenameerror": "«$1» файлын бул «$2» атка өзгөртүүгө мүмкүн эмес.",
        "filedeleteerror": "\"$1\" файлын өчүрүүгө болбоду.",
        "directorycreateerror": "\"$1\" каталогун түзүүгө болбоду.",
        "filenotfound": "\"$1\" файлын табуу мүмкүн эмес.",
-       "fileexistserror": "\"$1\" файлына жазууга болбоду: Мурдатан бар.",
        "unexpected": "Күтүлбөгөн маани: \"$1\"=\"$2\".",
        "formerror": "Ката: Форманы жөнөтүүгө болбоду.",
        "badarticleerror": "Бул аракетти бул баракта аткарууга болбойт.",
        "gotaccountlink": "Кирүү",
        "userlogin-resetlink": "Кирүүчү маалыматарыңызды эсиңизден чыгардыңызбы?",
        "userlogin-resetpassword-link": "Сырсөздү алмаштыруу",
-       "createacct-join": "Маалыматыңызды төмөнгө териңиз.",
        "createacct-emailrequired": "Эмейл дарек",
        "createacct-emailoptional": "Эмейл дарек (милдеттүү эмес)",
        "createacct-email-ph": "Эмейл дарегиңизди киргизиңиз",
        "savearticle": "Баракты сактоо",
        "preview": "Алдын ала көрүү",
        "showpreview": "Алдын ала көрсөтүү",
-       "showlivepreview": "Ылдам карап чыгуу",
        "showdiff": "Өзгөртүүлөрдү көрсөтүү",
        "anoneditwarning": "'''Эскертүү:''' Сиз системге кирген жоксуз.\nIP дарегиңиз бул барактын оңдоо тарыхына жазылат.",
        "anonpreviewwarning": "\"Сиз системге кирген жоксуз. Барактын тарыхында сиздин IP дарегиңиз жазылып калат.\"",
        "search-nonefound": "Талапка төп маалымат табылган жок.",
        "powersearch-legend": "Кеңейтилген издөө",
        "powersearch-ns": "Аталыш мейкиндиктеринен издөө:",
-       "powersearch-redir": "Багыттамаларды чыгаруу",
        "powersearch-togglelabel": "Белги салуу:",
        "powersearch-toggleall": "Баары",
        "powersearch-togglenone": "Эчнерсе",
        "prefs-advancedsearchoptions": "Кеңейтилген ырастоолор",
        "prefs-advancedwatchlist": "Кеңейтилген ырастоолор",
        "prefs-displayrc": "Көрүнүштүн ырастоолору",
-       "prefs-displaysearchoptions": "Көрүнүштүн ырастоолору",
        "prefs-displaywatchlist": "Көрүнүштүн ырастоолору",
        "email-address-validity-valid": "Эл. почтанын дареги анык көрүнөт",
        "email-address-validity-invalid": "Эл. почтанын анык дарегин киргизиңиз!",
        "recentchanges-label-bot": "Бул оңдоо бот тарабынан жасалды",
        "recentchanges-label-unpatrolled": "Бул оңдоо күзөттөн өтө элек.",
        "rcnotefrom": "'''$2''' -тан өзгөрүүлөр ылдый жакта ('''$1''' чейин көрсөтүлдү).",
-       "rclistfrom": "$1 күнүнөн баштап жаңы өзгөртүүлөрдү көрсөтүү",
+       "rclistfrom": "$3 $2 күнүнөн баштап жаңы өзгөртүүлөрдү көрсөтүү",
        "rcshowhideminor": "Майда оңдоолорду $1",
        "rcshowhidebots": "ботторду $1",
        "rcshowhideliu": "$1 катталган колдонуучу",
        "watch": "Көзөмөлдөө",
        "unwatch": "Көзөмөлдөбөө",
        "watchlist-details": "Талкуу барактарын эсепке албаганда көзөмөл тизмеңизде {{PLURAL:$1|$1 барак|$1 барак}} бар.",
-       "watchlistcontains": "Сиздин көзөмөл тизмеңизде $1 {{PLURAL:$1|барак}} бар.",
        "wlshowlast": "Соңку $1 саат $2 күн $3 көрсөтүү.",
        "watchlist-options": "Көзөмөл тизменин ырастоолору",
        "created": "түзүлдү",
        "table_pager_last": "Соңку барак",
        "table_pager_limit_submit": "Аткаруу",
        "table_pager_empty": "Табылган жок",
-       "livepreview-loading": "Жүктөлүүдө...",
-       "livepreview-ready": "Жүктөлүүдө… Даяр!",
        "watchlistedit-raw-titles": "Жазуулар:",
        "watchlistedit-raw-submit": "Көзөмөл тизмесин жаңыртуу",
        "watchlisttools-view": "Тийиштүү өзгөрүүлөрдү кароо",
        "compare-rev1": "Биринчи версия",
        "compare-rev2": "Экинчи версия",
        "compare-submit": "Салыштыруу",
-       "dberr-header": "Бул уикиде көйгөйлөр бар болуп жатат",
        "htmlform-required": "Бул чоңдук керек болот",
        "htmlform-submit": "Жөнөтүү",
        "htmlform-reset": "Өзгөртүүлөрдү жокко чыгаруу",
index a1aa13a..c48b946 100644 (file)
@@ -20,7 +20,8 @@
                        "SPQRobin",
                        "UV",
                        "Žekřil71pl",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Versores linea denotandi:",
@@ -33,7 +34,6 @@
        "tog-showtoolbar": "Affigere trabem redigentem",
        "tog-editondblclick": "Percussus duplex redactionem hortetur",
        "tog-editsectiononrightclick": "Paginarum segmenta dextero percussu in titulis redigenda",
-       "tog-rememberpassword": "Memorare tesserae meae hoc in navigatro inter conventa ({{PLURAL:$1|die|diebus}} $1 tenus)",
        "tog-watchcreations": "Paginas quas creo et fasciculos quos impono in paginarum custoditarum indicem addere",
        "tog-watchdefault": "Paginas et fasciculos quos recenseo in paginarum custoditarum indicem addere",
        "tog-watchmoves": "Paginas et fasciculos quos moveo in paginarum custoditarum indicem addere",
        "savearticle": "Servare hanc rem",
        "preview": "Praevidere",
        "showpreview": "Monstrare praevisum",
-       "showlivepreview": "Monstrare praevisum viventem",
        "showdiff": "Mutata ostendere",
        "anoneditwarning": "'''Monitio:''' Conventum tuum non apertum. Locus IP tuus in historia huius paginae notabitur.",
        "anonpreviewwarning": "''Conventum tuum non apertum. Si servas, locus IP tuus in historia huius paginae notabitur.''",
        "edit-gone-missing": "Non potui paginam modificare.\nHaec pagina deleta esse videtur.",
        "edit-conflict": "Contentio recensionis.",
        "edit-no-change": "Recensio tua non servata est, quia contenta paginae non mutavisti.",
-       "postedit-confirmation": "Recensio tua servata est.",
+       "postedit-confirmation-created": "Pagina creata est.",
+       "postedit-confirmation-restored": "Pagina restituta est.",
+       "postedit-confirmation-saved": "Recensio tua servata est.",
        "edit-already-exists": "Non potui paginam novam creare\nquia haec pagina iam est.",
        "content-model-wikitext": "vicitextum",
        "parser-template-loop-warning": "Ansa formulae detecta: [[$1]]",
        "search-nonefound": "Nullae paginae quaesitionem tuam adaequant.",
        "powersearch-legend": "Quaerere callidissime",
        "powersearch-ns": "Quaerere in spatiis nominalibus:",
-       "powersearch-redir": "Monstrare redirectiones",
        "powersearch-togglelabel": "Selegere:",
        "powersearch-toggleall": "Omnia",
        "powersearch-togglenone": "Nullum",
        "prefs-preview": "Praevisum",
        "prefs-advancedwatchlist": "Praeferentiae monstrare",
        "prefs-displayrc": "Praeferentiae vultus",
-       "prefs-displaysearchoptions": "Praeferentiae vultus",
        "prefs-displaywatchlist": "Praeferentiae vultus",
        "prefs-diffs": "Differentiae",
        "userrights": "Usorum potestates",
        "recentchanges-label-plusminus": "Magnitudo paginae per istam copiam octetorum mutata est",
        "recentchanges-legend-newpage": "(vide etiam [[Special:NewPages|indicem paginarum novarum]])",
        "rcnotefrom": "Subter sunt '''$1''' nuperrime mutata in proxima '''$2''' die.",
-       "rclistfrom": "Monstrare mutata nova incipiens ab $1",
+       "rclistfrom": "Monstrare mutata nova incipiens ab $3 $2",
        "rcshowhideminor": "$1 recensiones minores",
        "rcshowhidebots": "$1 automata",
        "rcshowhideliu": "$1 usores notos",
        "notanarticle": "Res non est",
        "notvisiblerev": "Emendatio deleta est",
        "watchlist-details": "{{PLURAL:$1|$1 pagina|$1 paginae}} in indice paginarum custoditarum tuarum, sine paginis disputationis.",
-       "watchmethod-recent": "recensita recenta quaerens pro pagina custodita",
-       "watchmethod-list": "paginas custoditas quaerens pro recensitis recentibus",
-       "watchlistcontains": "Index paginarum custoditarum tuus $1 {{PLURAL:$1|paginam|paginas}} habet.",
-       "iteminvalidname": "Aerumna cum pagina '$1', nomen non est rectum...",
        "wlshowlast": "Monstrare proximas $1 horas $2 dies $3",
        "watchlist-options": "Indicis paginarum custoditarum praeferentiae",
        "watching": "Custodiens...",
        "enotif_impersonal_salutation": "Usor {{grammar:genitive|{{SITENAME}}}}",
        "enotif_lastdiff": "Vide $1 ad hanc recensionem inspiciendum.",
        "enotif_anon_editor": "usor ignotus $1",
-       "enotif_body": "\nSalve $WATCHINGUSERNAME,\n\nPagina {{grammar:genitive|{{SITENAME}}}} $PAGETITLE ab $PAGEEDITOR die $PAGEEDITDATE $CHANGEDORCREATED est, vide emendationem currentem apud $PAGETITLE_URL\n\n$NEWPAGE\n\nAuctor hunc summarium dedit: $PAGESUMMARY $PAGEMINOREDIT\n\nContact the editor:\nlitterae electronicae: $PAGEEDITOR_EMAIL\nvici: $PAGEEDITOR_WIKI\n\nThere will be no other notifications in case of further changes unless you visit this page.\nYou could also reset the notification flags for all your watched pages on your watchlist.\n\n             Your friendly {{SITENAME}} notification system\n\n--\nTo change your watchlist settings, visit\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nFeedback and further assistance:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "\nSalve $WATCHINGUSERNAME,\n\nPagina {{grammar:genitive|{{SITENAME}}}} $PAGETITLE ab $PAGEEDITOR die $PAGEEDITDATE $CHANGEDORCREATED est, vide emendationem currentem apud $PAGETITLE_URL\n\n$NEWPAGE\n\nAuctor hunc summarium dedit: $PAGESUMMARY $PAGEMINOREDIT\n\nContact the editor:\nlitterae electronicae: $PAGEEDITOR_EMAIL\nvici: $PAGEEDITOR_WIKI\n\nThere will be no other notifications in case of further changes unless you visit this page.\nYou could also reset the notification flags for all your watched pages on your watchlist.\n\n             Your friendly {{SITENAME}} notification system\n\n--\nTo change your watchlist settings, visit\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nFeedback and further assistance:\n$HELPPAGE",
        "created": "creata",
        "changed": "mutata",
        "deletepage": "Delere paginam",
        "blockip": "Usorem obstruere",
        "blockip-legend": "Usorem vel locum IP obstruere",
        "blockiptext": "Forma infera utere ut quendam usorem vel locum IP obstruas ne plus scribere potest.\nHoc non nisi secundum [[{{MediaWiki:Policy-url}}|consilium]] fieri potest.\nRationem certam subscribe (exempli gratia titulos paginarum quas iste usor modo vandalorum recensuit).",
-       "ipadressorusername": "Locus IP aut nomen usoris:",
+       "ipaddressorusername": "Locus IP aut nomen usoris:",
        "ipbexpiry": "Exitus:",
        "ipbreason": "Causa:",
        "ipbreason-dropdown": "*Rationes crebriter adductae\n** Ob scripta falsa\n** Ob textum remotum\n** Ob nexus externos multiplicatos\n** Ob scripta sensu sive et Latinitate carentia\n** Ob scripta inurbana\n** Ob rationes perniciose multiplicatas\n** Ob nomen inurbanum sive inconveniens",
        "newimages-summary": "Haec pagina specialis monstrat fasciculos impositos ultimos.",
        "newimages-legend": "Filtrum",
        "newimages-label": "Nomen fasciculi (vel pars eius):",
-       "showhidebots": "($1 automata)",
        "noimages": "Nullum videndum.",
        "ilsubmit": "Quaerere",
        "bydate": "ex die",
        "size-kilobytes": "$1 chiliocteti",
        "size-megabytes": "$1 megaocteti",
        "size-gigabytes": "$1 gigaocteti",
-       "livepreview-loading": "Depromens…",
-       "livepreview-ready": "Depromens… Praesto!",
-       "watchlistedit-numitems": "Indice paginarum custoditarum tuo {{PLURAL:$1|est unus titulus|sunt $1 tituli}}, sine paginis disputationis.",
-       "watchlistedit-noitems": "Indice paginarum custoditarum tuo non sunt ulli tituli.",
        "watchlistedit-normal-title": "Indicem paginarum custoditarum recensere",
        "watchlistedit-normal-submit": "Removere titulos",
        "watchlistedit-raw-title": "Indicem paginarum custoditarum quasi textum recensere",
index 727c579..10396bb 100644 (file)
@@ -9,7 +9,8 @@
                        "Runningfridgesrule",
                        "Taichi",
                        "Universal Life",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Suliñar los atamientos:",
@@ -22,7 +23,6 @@
        "tog-showtoolbar": "Amostrar el chibuk de aparatos",
        "tog-editondblclick": "Trocar las hojas con doble klik",
        "tog-editsectiononrightclick": "Pueder trocar los kapítůlos, en pizando el botón derecho del ratón encima el títůlo",
-       "tog-rememberpassword": "Acordarse de mi entrada en este navigador (a lo más muńcho $1 {{PLURAL:$1|día|días}})",
        "tog-watchcreations": "Anyadir lad pajinas ke kree i archivos ke karge a mi lista",
        "tog-watchdefault": "Anyadir pajinas i archivos ke edite a mi lista",
        "tog-watchmoves": "Anyadir pajinas i archivo ke move a mi lista",
        "readonly_lag": "La base de datos se a blokeado mientres los servidores se sinkronizan",
        "internalerror": "Yerro enterno",
        "internalerror_info": "Yerro enterno: $1",
-       "fileappenderrorread": "No se pudo meldar \"$1\" durante enkashyon.",
-       "fileappenderror": "No se pudo enkashar \"$1\" a \"$2\".",
        "filecopyerror": "No se pudo copiar el arxiv \"$1\" a \"$2\".",
        "filerenameerror": "No se pudo renombrar archivo \"$1\" a \"$2\".",
        "filedeleteerror": "No se pudo efasar archivo \"$1\".",
        "directorycreateerror": "No se pudo krear direktorio \"$1\".",
        "filenotfound": "No se pudo topar archivo \"$1\".",
-       "fileexistserror": "No se pudo eskrivir al archivo \"$1\": Archivo ya egziste.",
        "unexpected": "Valor enasperado: \"$1\"=\"$2\".",
        "formerror": "Yerro: No se pudo embiar fomulario.",
        "badarticleerror": "No se puede azer esta aksyon en este pajina.",
        "userlogin-resetlink": "Olvidates tus detalyos de akseso?",
        "userlogin-resetpassword-link": "Olvidaste tu kontrasenya?",
        "userlogin-createanother": "Krear otro kuento",
-       "createacct-join": "Eskrive abasho tu informasyon",
        "createacct-emailrequired": "Adreso de korreo elektroniko",
        "createacct-emailoptional": "Korreo elektroniko (opsyonal)",
        "createacct-email-ph": "Eskrive tu adreso de korreo elektroniko",
        "savearticle": "Enrejistra la hoja",
        "preview": "Echar una ojada",
        "showpreview": "Echar una ojada",
-       "showlivepreview": "Previsteo bivo",
        "showdiff": "Amostrar los trocamientos",
        "anoneditwarning": "<strong>Aviso:</strong> No entrates a tu cuento.\nTu adresso de IP se va a enrejistrar en la istoria de trocamientos de la hoja.",
        "summary-preview": "Previsualización del resumen:",
        "search-nonefound": "No ay resultados por esta búxquida.",
        "powersearch-legend": "Búsqueda adelantada",
        "powersearch-ns": "Busca en los espacios de nombres:",
-       "powersearch-redir": "Mostra las redirecciones",
        "powersearch-toggleall": "Todos",
        "powersearch-togglenone": "dingun",
        "search-external": "Búsqueda eksterna",
        "recentchanges-label-unpatrolled": "Este trocamiento no fue patrullado daínda",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Debasho se amostran los trokamientos desde '''$2''' (amostrados fina <b>$1</b>)",
-       "rclistfrom": "Amostrar los trocamientos muevos empeçando el $1",
+       "rclistfrom": "Amostrar los trocamientos muevos empeçando el $3 $2",
        "rcshowhideminor": "$1 trocamientos chiquiticos",
        "rcshowhidebots": "$1 botes",
        "rcshowhideliu": "$1 usadores enrejistrados",
        "table_pager_empty": "No hay resultados",
        "autoredircomment": "Redireksionado a [[$1]]",
        "autosumm-new": "Pajina kreado con \"$1\"",
-       "livepreview-loading": "Cargando...",
-       "livepreview-ready": "Cargando… ¡Pronto!",
        "watchlisttools-view": "Ver los trocamientos",
        "watchlisttools-edit": "Ver i trocar tu lista de escogidas",
        "watchlisttools-raw": "Troca tu lista de escogidas en crudo",
index cfdf1ed..42633ac 100644 (file)
@@ -14,7 +14,8 @@
                        "Urhixidur",
                        "VT98Fan",
                        "Zinneke",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Linken ënnersträichen:",
        "jumptonavigation": "Navigatioun",
        "jumptosearch": "sichen",
        "view-pool-error": "Pardon, d'Servere si fir de Moment iwwerlaascht.\nZevill Benotzer versichen dës Säit ze gesinn.\nWaart w.e.g. e bëssen ier Dir versicht dës Säit nach emol opzeruffen.\n\n$1",
+       "generic-pool-error": "Pardon, d'Servere si fir de Moment iwwerlaascht.\nZevill Benotzer versichen dës Ressource ze gesinn.\nWaart w.e.g. e bëssen ier Dir versicht dës Ressource nach emol opzeruffen.",
        "pool-timeout": "Timeout bis d'Spär opgehuewen ass",
        "pool-queuefull": "Pool-Queue ass voll",
        "pool-errorunknown": "Onbekannte Feeler",
        "readonly_lag": "D'Datebank gouf automatesch gespaart fir datt d'Zweetserveren (slaves) nees mat dem Haaptserver (master) synchron geschalt kënne ginn.",
        "internalerror": "Interne Feeler",
        "internalerror_info": "Interne Feeler: $1",
-       "fileappenderrorread": "\"$1\" konnt während dem Derbäisetze net gelies ginn.",
-       "fileappenderror": "\"$1\" konnt net bei \"$2\" derbäigesat ginn.",
        "filecopyerror": "De Fichier \"$1\" konnt net op \"$2\" kopéiert ginn.",
        "filerenameerror": "De Fichier \"$1\" konnt net op \"$2\" ëmbenannt ginn.",
        "filedeleteerror": "De Fichier \"$1\" konnt net geläscht ginn.",
        "directorycreateerror": "De Repertoire \"$1\" konnt net geschafe ginn.",
        "filenotfound": "De Fichier \"$1\" gouf net fonnt.",
-       "fileexistserror": "De Fichier \"$1\" konnt net geschriwwe ginn, well et dee Fichier scho gëtt.",
        "unexpected": "Onerwaarte Wäert: \"$1\"=\"$2\".",
        "formerror": "Feeler: Dat wat Dir aginn hutt konnt net verschafft ginn.",
        "badarticleerror": "Dës Aktioun kann net op dëser Säit duerchgefouert ginn.",
        "userlogin-helplink2": "Hëllef beim Aloggen",
        "userlogin-loggedin": "Dir sidd schonn als {{GENDER:$1|$1}} ageloggt.\nBenotzt de Formulaire hei drënner fir Iech als een anere Benotzer anzeloggen.",
        "userlogin-createanother": "Maacht een anere Benotzerkont op",
-       "createacct-join": "Gitt Är Informatioune hei drënner an.",
-       "createacct-another-join": "Gitt d'Informatioune fir den neie Benotzerkont hei drënner an.",
        "createacct-emailrequired": "E-Mail-Adress",
        "createacct-emailoptional": "E-Mailadress (fakultativ)",
        "createacct-email-ph": "Gitt Är E-Mail-Adress an",
        "savearticle": "Säit späicheren",
        "preview": "Kucken ouni ofzespäicheren",
        "showpreview": "Kucken ouni ofzespäicheren",
-       "showlivepreview": "Live-Kucken ouni ofzespäicheren",
        "showdiff": "Ännerunge weisen",
        "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.",
        "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.''",
        "edit-gone-missing": "D'Säit konnt net aktualiséiert ginn.\nSi gouf anscheinend geläscht.",
        "edit-conflict": "Ännerungskonflikt.",
        "edit-no-change": "Är ännerung gouf ignoréiert, well Dir näischt um Text geännert hutt.",
-       "postedit-confirmation": "Är Ännerung gouf gespäichert.",
+       "postedit-confirmation-created": "D'Säit gouf ugeluecht.",
+       "postedit-confirmation-restored": "D'Säit gouf restauréiert.",
+       "postedit-confirmation-saved": "Är Ännerung gouf gespäichert.",
        "edit-already-exists": "Déi nei Säit konnt net ugeluecht ginn, well et se scho gëtt.",
        "defaultmessagetext": "Standardtext",
        "content-failed-to-parse": "Den $2-Inhalt fir den $1-Modell konnt net geparst ginn: $3",
        "parser-template-loop-warning": "Endlos Schleef an der Schabloun: [[$1]] entdeckt",
        "parser-template-recursion-depth-warning": "D'Limit vun der Zuel vun de Verschachtelunge vu Schabloune gouf iwwerschratt ($1)",
        "language-converter-depth-warning": "D'Limite vun der déift vun der Sproochëmwandlung gouf iwwerschratt ($1)",
+       "node-count-exceeded-category-desc": "Eng Kategorie fir Säiten an deenen d'Zuel vun de Kniet (Node-count) ze grouss ass.",
        "parser-unstrip-loop-warning": "Endlos Schleef entdeckt",
        "converter-manual-rule-error": "An der Regel iwwer déi manuell Ëmwandlung vun der Sprooch gouf e Feeler fonnt",
        "undo-success": "D'Ännerung gëtt réckgängeg gemaach. Iwwerpréift w.e.g. de Verglach ënnendrënner fir nozekuckeen ob et sou richteg ass, duerno späichert w.e.g d'Ännerungen of, fir dës Aktioun ofzeschléissen.",
        "revdelete-show-file-confirm": "Sidd Dir sécher datt Dir déi geläschte Versioun vum Fichier \"<nowiki>$1</nowiki>\" vum $2 ëm $3 gesi wëllt?",
        "revdelete-show-file-submit": "Jo",
        "revdelete-selected-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-others": "Aner Administrateuren op {{SITENAME}} kënnen nach ëmmer de verstoppten Inhalt gesinn an en iwwer deeselwechten Interface 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.",
        "searchmenu-exists": "* Säit '''[[$1]]'''",
        "searchmenu-new": "<strong>Opmaache vun der Säit ''[[:$1]]'' op dëser Wiki!</strong> {{PLURAL:$2|0=|Kuckt och d'Säit déi Dir beim siche fonnt hutt.|Kuckt och d'Resultater déi Dir beim siche fonnt hutt.}}",
        "searchprofile-articles": "Säite mat Inhalt",
-       "searchprofile-project": "Hëllef a Projetssäiten",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Alles",
        "searchprofile-advanced": "Erweidert",
        "searchprofile-articles-tooltip": "Sichen a(n) $1",
-       "searchprofile-project-tooltip": "Sichen a(n) $1",
        "searchprofile-images-tooltip": "No Fichiere sichen",
        "searchprofile-everything-tooltip": "Op alle Säiten nom Inhalt sichen  (inklusiv Diskussiounssäiten)",
        "searchprofile-advanced-tooltip": "Sich an den Nummraim déi an de perséinlichen Astellungen festgeluecht sinn",
        "search-nonefound": "Fir Är Ufro gouf näischt fonnt.",
        "powersearch-legend": "Erweidert Sich",
        "powersearch-ns": "Sichen an den Nummraim:",
-       "powersearch-redir": "Viruleedunge weisen",
        "powersearch-togglelabel": "Markéieren:",
        "powersearch-toggleall": "All",
        "powersearch-togglenone": "Keen",
        "prefs-emailconfirm-label": "E-Mail Confirmatioun:",
        "youremail": "E-Mail-Adress:",
        "username": "{{GENDER:$1|Benotzernumm}}:",
-       "uid": "{{GENDER:$1|Benotzer}} ID:",
        "prefs-memberingroups": "{{GENDER:$2|Member}} vun {{PLURAL:$1|der Benotzergrupp|de Benotzergruppen}}:",
        "prefs-registration": "Zäitpunkt vum Opmaache vum Benotzerkont:",
        "yourrealname": "Richtegen Numm:",
        "prefs-advancedsearchoptions": "Méi Optiounen",
        "prefs-advancedwatchlist": "Méi Optiounen",
        "prefs-displayrc": "Optioune vun deem wat gewise gëtt",
-       "prefs-displaysearchoptions": "Optioune vum Affichage",
        "prefs-displaywatchlist": "Optioune vun deem wat gewise gëtt",
        "prefs-tokenwatchlist": "Token",
        "prefs-diffs": "Ënnerscheeder",
        "right-move": "Säite réckelen",
        "right-move-subpages": "Säiten zesumme mat hiren Ënnersäite réckelen",
        "right-move-rootuserpages": "Haapt-Benotzersäite réckelen",
+       "right-move-categorypages": "Kategorie-Säite réckelen",
        "right-movefile": "Fichiere réckelen",
        "right-suppressredirect": "Keng Viruleedung vum alen Numm aus uleeë wann eng Säit geréckelt gëtt",
        "right-upload": "Fichieren eroplueden",
        "action-createpage": "Säiten unzelleeën",
        "action-createtalk": "Diskussiounssäiten unzeleeën",
        "action-createaccount": "dëse Benotzerkont unzeleeën",
+       "action-history": "d'Versioune vun dëser Säit weisen",
        "action-minoredit": "dës Ännerung als kleng Ännerung ze markéieren",
        "action-move": "dës Säit ze réckelen",
        "action-move-subpages": "dës Säit an déi Ënnersäiten déi dozou gehéieren ze réckelen",
        "recentchanges-summary": "Op dëser Säit kënnt Dir déi rezent Ännerungen op dëser Wiki gesinn.",
        "recentchanges-noresult": "Keng Ännerunge während der Period déi ugi gouf passen op de Critère.",
        "recentchanges-feed-description": "Verfollegt mat dësem Feed déi rezent Ännerungen op {{SITENAME}}.",
-       "recentchanges-label-newpage": "Dës Ännerung huet eng nei Säit ugeluecht",
+       "recentchanges-label-newpage": "Mat dëser Ännerung gouf eng nei Säit ugeluecht",
        "recentchanges-label-minor": "Dëst ass eng kleng Ännerung",
        "recentchanges-label-bot": "Dës Ännerung gouf vun engem Bot gemaacht",
        "recentchanges-label-unpatrolled": "Dës Ännerung gouf nach net nogekuckt",
        "recentchanges-legend-newpage": "(kuckt och [[Special:NewPages|Lëscht vun den neie Säiten]])",
        "recentchanges-legend-plusminus": "''(±123)''",
        "rcnotefrom": "Ugewise ginn d'Ännerunge vum <strong>$2</strong> un (maximal <strong>$1</strong> Ännerunge gi gewisen).",
-       "rclistfrom": "Nei Ännerunge vu(n) $1 u weisen",
+       "rclistfrom": "Nei Ännerunge vu(n) $3 $2 u weisen",
        "rcshowhideminor": "Kleng Ännerunge $1",
        "rcshowhideminor-show": "Weisen",
        "rcshowhideminor-hide": "Verstoppen",
        "uploadstash-errclear": "D'Läsche vun de Fichieren huet net funktionéiert.",
        "uploadstash-refresh": "Lëscht vun de Fichieren aktualiséieren",
        "img-auth-accessdenied": "Zougang refuséiert",
-       "img-auth-nopathinfo": "PATH_INFO feelt.\nÄre Server ass net agestallt fir déi Informatioun weiderzeginn.\nEt kann u CGI leien an datt imag_auth net ënnerstëtzt gëtt.\nKuckt  https://www.mediawiki.org/wiki/Manual:Image_Authorization",
+       "img-auth-nopathinfo": "PATH_INFO feelt.\nÄre Server ass net agestallt fir déi Informatioun weiderzeginn.\nEt kann u CGI leien an datt imag_auth net ënnerstëtzt gëtt.\nKuckt  https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization",
        "img-auth-notindir": "De gefrote Pad ass net am Upload-Repertoire agestallt.",
        "img-auth-badtitle": "Aus \"$1\" ka kee valabelen Titel gemaach ginn.",
        "img-auth-nologinnWL": "Dir sidd net ageloggt a(n) \"$1\" ass net op der Wäisser Lëscht.",
        "pageswithprop-prophidden-long": "Wäert vun der laanger Texteegeschaft verstoppt ($1)",
        "doubleredirects": "Duebel Viruleedungen",
        "doubleredirectstext": "Op dëser Säit stinn déi Säiten déi op aner Viruleedungssäite viruleeden.\nAn all Rei sti Linken zur éischter an zweeter Viruleedung, souwéi d'Zil vun der zweeter Viruleedung, déi normalerweis déi \"richteg\" Zilsäit ass, op déi déi éischt Viruleedung hilinke soll.\n<del>Duerchgestrachen</del> Linke goufe scho sou verännert datt déi duebel Viruleedung opgeléist ass.",
-       "double-redirect-fixed-move": "[[$1]] gouf geréckelt, et ass elo eng Viruleedung op [[$2]]",
-       "double-redirect-fixed-maintenance": "Flécke vun der duebeler Viruleedung vu(n) [[$1]] op [[$2]].",
+       "double-redirect-fixed-move": "[[$1]] gouf geréckelt.\nD'Säit gouf automatesch aktualiséiert an et ass elo eng Viruleedung op [[$2]].",
+       "double-redirect-fixed-maintenance": "Duebel Viruleedung vu(n) [[$1]] op [[$2]] gouf automatesch an engem 'maintenance job' gefléckt.",
        "double-redirect-fixer": "Verbesserung vu Viruleedungen",
        "brokenredirects": "Futtis Viruleedungen",
        "brokenredirectstext": "Dës Viruleedunge linken op Säiten déi et net gëtt.",
        "log-title-wildcard": "Titel fänkt mat dësem Text un",
        "showhideselectedlogentries": "Déi erausgesichte Entréeën am Logbuch weisen/verstoppen",
        "allpages": "All Säiten",
-       "alphaindexline": "$1 bis $2",
        "nextpage": "Nächst Säit ($1)",
        "prevpage": "Säit viru(n) ($1)",
        "allpagesfrom": "Säite weisen, ugefaange mat:",
        "listgrouprights-namespaceprotection-header": "Limitatioune vum Nummraum",
        "listgrouprights-namespaceprotection-namespace": "Nummraum",
        "listgrouprights-namespaceprotection-restrictedto": "Recht(er), déi dem Benotzer d'Änneren erlaben",
+       "trackingcategories": "Tracking-Kategorien",
+       "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.",
        "hidden-category-category-desc": "Dëst ass eng Kategorie an där <code><nowiki>__HIDDENCAT__</nowiki></code> drasteet, dat verhënnert datt se standardméisseg an der këscht mat de Kategorielinken op der Säit gewise gëtt.",
        "watchnologin": "Net ageloggt",
        "addwatch": "Op d'Iwwerwaachungslëscht derbäisetzen",
        "addedwatchtext": "D'Säit \"[[:$1]]\" gouf op är [[Special:Watchlist|Iwwerwaachungslëscht]] gesat.\nAll weider Ännerungen op dëser Säit an der associéierter Diskussiounssäit ginn hei opgelëscht.",
+       "addedwatchtext-short": "D'Säit \"$1\" gouf op Är Iwwerwaachungslëscht derbäigesat.",
        "removewatch": "Vun der Iwwerwaachungslëscht erofhuelen",
        "removedwatchtext": "D'Säit \"[[:$1]]\" gouf vun [[Special:Watchlist|ärer Iwwerwaachungslëscht]] erofgeholl.",
+       "removedwatchtext-short": "D'Säit \"$1\" gouf vun Ärer Iwwerwaachungslëscht erofgeholl.",
        "watch": "Iwwerwaachen",
        "watchthispage": "Dës Säit iwwerwaachen",
        "unwatch": "Net méi iwwerwaachen",
        "watchlist-details": "{{PLURAL:$1|1 Säit|$1 Säiten}} sinn op ärer Iwwerwaachungsklëscht, d'Diskussiounssäiten net matgezielt.",
        "wlheader-enotif": "E-Mail-Notifikatioun ass ageschalt.",
        "wlheader-showupdated": "Säiten déi zanter Ärer leschter Visite geännert goufen, si '''fett''' geschriwwen",
-       "watchmethod-recent": "Rezent Ännerunge ginn op iwwerwaacht Säiten iwwerpréift",
-       "watchmethod-list": "Iwwerwaachte Säite ginn op rezent Ännerungen iwwerpréift",
-       "watchlistcontains": "Op ärer Iwwerwaachungslëscht $1 {{PLURAL:$1|steet $1 Säit|stinn $1 Säiten}}.",
-       "iteminvalidname": "Problem mam Element '$1', ongëltegen Numm ...",
        "wlnote2": "Hei sinn déi lescht Ännerunge aus {{PLURAL:$1|der leschter Stonn|de leschte(n) <strong>$1</strong> Stonnen}}, Stand: $2 ëm $3 Auer.“",
        "wlshowlast": "D'Ännerunge vun de leschte(n) $1 Stonnen, $2 Deeg oder $3 (an de leschten 30 Deeg) weisen.",
        "watchlist-options": "Optioune vun der Iwwerwaachungslëscht",
        "enotif_lastvisited": "All Ännerungen op ee Bléck: $1",
        "enotif_lastdiff": "Kuckt $1 fir dës Ännerung.",
        "enotif_anon_editor": "Anonyme Benotzer $1",
-       "enotif_body": "Léiwe $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nResumé vum Mataarbechter: $PAGESUMMARY $PAGEMINOREDIT\n\nDen Editeur kontaktéieren:\nE-Mail: $PAGEEDITOR_EMAIL\nWiki: $PAGEEDITOR_WIKI\n\nEt gi soulaang keng weider Maile geschéckt, bis Dir d'Säit nees emol besicht hutt wärend deem Dir ageloggt sidd.\nOp Ärer Iwwerwaachungslëscht kënnt Dir all Noriichtemarkeren zesummen zrécksetzen.\n\n\nÄre frëndlechen {{SITENAME}} Noriichtessystem\n\n--\n\nFir d'Astellungen op Ären E-Mailnoriichten z'änneren, besicht w.e.g.\n{{canonicalurl:{{#special:Preferences}}}}\n\n\nFir d'Astellunge vun Ärer Iwwerwaachungslëscht z'änneren, besicht w.e.g.\n{{canonicalurl:Special:Watchlist/edit}}\n\nFeedback a weider Hëllef:\n{{canonicalurl:{{MediaWiki:Helppage}}}}\nFir d'Säit vun Ärer Iwwerwaachungslëscht erofzehuelen, gitt w.e.g. op\n$UNWATCHURL\n\nReaktiounen a méi Hëllef:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Léiwe $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nResumé vum Mataarbechter: $PAGESUMMARY $PAGEMINOREDIT\n\nDen Editeur kontaktéieren:\nE-Mail: $PAGEEDITOR_EMAIL\nWiki: $PAGEEDITOR_WIKI\n\nEt gi soulaang keng weider Maile geschéckt, bis Dir d'Säit nees emol besicht hutt wärend deem Dir ageloggt sidd.\nOp Ärer Iwwerwaachungslëscht kënnt Dir all Noriichtemarkeren zesummen zrécksetzen.\n\n\nÄre frëndlechen {{SITENAME}} Noriichtessystem\n\n--\n\nFir d'Astellungen op Ären E-Mailnoriichten z'änneren, besicht w.e.g.\n{{canonicalurl:{{#special:Preferences}}}}\n\n\nFir d'Astellunge vun Ärer Iwwerwaachungslëscht z'änneren, besicht w.e.g.\n{{canonicalurl:Special:Watchlist/edit}}\n\nFeedback a weider Hëllef:\n$HELPPAGE",
        "created": "gemaach",
        "changed": "geännert",
        "deletepage": "Säit läschen",
        "rollbacklinkcount-morethan": "méi wéi {{PLURAL:$1|Eng Ännerung|$1 Ännerungen}} zrécksetzen",
        "rollbackfailed": "Zrécksetzen huet net geklappt",
        "cantrollback": "Lescht Ännerung kann net zréckgesat ginn. De leschten Auteur ass deen eenzegen Auteur vun dëser Säit.",
-       "alreadyrolled": "Déi lescht Ännerung vun der Säit [[:$1]] vum [[User:$2|$2]] ([[User talk:$2|talk]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);; kann net zeréckgesat ginn;\neen Aneren huet dëst entweder scho gemaach oder nei Ännerungen agedroen.\n\nDéi lescht Ännerung vun der Säit ass vum [[User:$3|$3]] ([[User talk:$3|Diskussioun]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
+       "alreadyrolled": "Déi lescht Ännerung vun der Säit [[:$1]] vum [[User:$2|$2]] ([[User talk:$2|talk]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); kann net zréckgesat ginn;\neen Aneren huet dat entweder scho gemaach oder nei Ännerungen agedroen.\n\nDéi lescht Ännerung vun der Säit war vum [[User:$3|$3]] ([[User talk:$3|Diskussioun]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "De Resumé vun der Ännerung war: \"''$1''\".",
        "revertpage": "Ännerunge vum [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskussioun]]) zréckgesat op déi lescht Versioun vum [[User:$1|$1]]",
        "revertpage-nouser": "Zréckgesaten Ännerungen duerch e verstoppte Benotzer op déi lescht Versioun vum {{GENDER:$1|[[User:$1|$1]]}}",
        "blockip": "Benotzer spären",
        "blockip-legend": "Benotzer spären",
        "blockiptext": "Benotzt dëse Formulaire fir eng spezifesch IP-Adress oder e Benotzernumm ze spären. Dëst soll nëmmen am Fall vu Vandalismus gemaach ginn, en accordance mat den [[{{MediaWiki:Policy-url}}|interne Richlinen]]. Gitt e spezifesche Grond un (zum Beispill Säite wou Vandalismus virgefall ass).",
-       "ipadressorusername": "IP-Adress oder Benotzernumm:",
+       "ipaddressorusername": "IP-Adress oder Benotzernumm:",
        "ipbexpiry": "Gültegkeet:",
        "ipbreason": "Grond:",
        "ipbreason-dropdown": "*Heefeg Ursaache fir Benotzer ze spären:\n**Bewosst falsch Informatiounen an eng oder méi Säite gesat\n**Ouni Grond Inhalt vu Säite geläscht\n**Spam-Verknëppunge mat externe Säiten\n**Topereien an d'Säite gesat\n**Beleidegt oder bedréit aner Mataarbechter\n**Mëssbrauch vu verschiddene Benotzernimm\n**Net akzeptabele Benotzernumm",
        "movenotallowedfile": "Dir hutt net d'Recht fir Fichieren ze réckelen.",
        "cant-move-user-page": "Dir hutt net déi néideg Rechter fir Benotzerhaaptsäiten ze réckelen.",
        "cant-move-to-user-page": "Dir hutt net d'Recht fir eng Säit op eng Benotzersäit (ausser op eng Ënnersäit vun enger Benotzersäit) ze réckelen.",
+       "cant-move-category-page": "Dir hutt net déi néideg Rechter fir Kategorie-Säiten ze réckelen.",
        "newtitle": "Op den neien Titel:",
        "move-watch": "Dës Säit iwwerwaachen",
        "movepagebtn": "Säit réckelen",
        "tooltip-recreate": "D'Säit nees uleeën, obwuel se geläscht gi war.",
        "tooltip-upload": "Mam eroplueden ufänken",
        "tooltip-rollback": "\"Zrécksetzen\" mécht all Ännerunge vum leschten \"Auteur\" an engem Klick nees réckgängeg.",
-       "tooltip-undo": "\"Zréck\" setzt dës Ännerung zréck a mécht den Ännerungsformulaire am Modus \"kucken ouni ofzespäicheren\" op.\nErlaabt et e Grond an de Resumé derbäizesetzen.",
+       "tooltip-undo": "\"Zréck\" setzt dës Ännerung zréck a mécht den Ännerungsformulaire am Modus \"kucken ouni ofzespäicheren\" op, fir datt een  eventuell eng Ursaach an de Resumé ka schreiwen.",
        "tooltip-preferences-save": "Astellunge späicheren",
        "tooltip-summary": "Gitt e kuerze Resumé an",
        "interlanguage-link-title": "$1 - $2",
        "common.css": "/* Dës CSS huet nëmmen Afloss op de Skin ''Chick''  */",
-       "cologneblue.css": "/* Dës CSS huet nëmmen Afloss op de Skin ''Köln Blo''  */",
        "monobook.css": "/* Dës CSS huet nëmmen Afloss op de Skin ''Monobook''  */",
-       "modern.css": "/* Dës CSS huet nëmmen Afloss op de Skin ''Modern''  */",
        "common.js": "/* All JavaScript hei gëtt fir all Benotzer beim Luede vun all Säit gelueden. */",
-       "notacceptable": "De Wiki-Server kann d'Donnéeë net an engem Format liwweren déi vun ärem Apparat geliest kënne ginn.",
        "anonymous": "{{PLURAL:$1|Anonyme Benotzer|Anonym Benotzer}} op {{SITENAME}}",
        "siteuser": "{{SITENAME}}-Benotzer $1",
        "anonuser": "Anonyme(n) {{SITENAME}}-Benotzer $1",
        "pageinfo-category-pages": "Zuel vun de Säiten",
        "pageinfo-category-subcats": "Zuel vun den Ënnerkategorien",
        "pageinfo-category-files": "Zuel vun de Fichieren",
-       "skinname-cologneblue": "Köln Blo",
        "skinname-monobook": "MonoBook",
-       "skinname-modern": "Modern",
        "markaspatrolleddiff": "Als nogekuckt markéieren",
        "markaspatrolledtext": "Dës Säit als nogekuckt markéieren",
        "markedaspatrolled": "ass als nogekuckt markéiert",
        "newimages-summary": "Dës Spezialsäit weist eng Lëscht mat de Fichieren déi als lescht eropgeluede goufen.",
        "newimages-legend": "Filter",
        "newimages-label": "Numm vum Fichier (oder en Deel dovun):",
-       "showhidebots": "($1 Botten)",
        "noimages": "Keng Biller fonnt.",
        "ilsubmit": "Sichen",
        "bydate": "no Datum",
        "autosumm-replace": "Säitinhalt gëtt ersat duerch '$1'",
        "autoredircomment": "Virugeleet op [[$1]]",
        "autosumm-new": "Säit ugeluecht mat: '$1'",
-       "livepreview-loading": "Lueden...",
-       "livepreview-ready": "Lueden … Fäerdeg!",
-       "livepreview-failed": "Live-Preview huet net funktionéiert! Benotzt w.e.g. d'Funktioun ''Kucken ouni ofzespäicheren''.",
-       "livepreview-error": "Verbindung net méiglech: $1 „$2“.\nBenotzt w.e.g. d'Funktioun fir déi nach net gespäichert Versioun ze kucken (Kucken ouni ofzespäicheren).",
        "lag-warn-normal": "Ännerunge vun {{PLURAL:$1|der leschter Sekonn|de leschte(n) $1 Sekonnen}} kënnen an dëser Lëscht net gewise ginn.",
        "lag-warn-high": "Duerch eng héich Serverbelaaschtung kënne Verännerungen déi viru manner wéi $1 {{PLURAL:$1|Sekonn|Sekonne}} gemaach goufen, net an dëser Lëscht ugewise ginn.",
-       "watchlistedit-numitems": "Op Ärer Iwwerwaachungslëscht {{PLURAL:$1|steet 1 Säit|stinn $1 Säiten}}, ouni d'Diskussiounssäiten.",
-       "watchlistedit-noitems": "Är Iwwerwaachungslëscht ass eidel.",
        "watchlistedit-normal-title": "Iwwerwaachungslëscht änneren",
        "watchlistedit-normal-legend": "Säite vun der Iwwerwaachungslëscht erofhuelen",
        "watchlistedit-normal-explain": "D'Säite vun Ärer Iwwerwaachungslëscht ginn drënner gewisen.\nFir eng Säit erofzehuelen, klickt op d'Haischen niewendrun a klickt duerno op \"{{int:Watchlistedit-normal-submit}}\".\nDir kënnt och [[Special:EditWatchlist/raw|déi net formatéiert Iwwerwaachungslëscht änneren]].",
        "watchlistedit-raw-done": "Är Iwwerwaachungslëscht gouf aktualiséiert.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 Säit gouf|$1 Säite goufen}} derbäigesat:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 Säit gouf|$1 Säite goufen}} erausgeholl:",
+       "watchlistedit-clear-title": "Eidelgemaachten Iwwerwaachungslëscht",
+       "watchlistedit-clear-legend": "Iwwerwaachungslëscht eidelmaachen",
+       "watchlistedit-clear-explain": "All D'Säite gi vun Ärer Iwwerwaachungslëscht erofgeholl",
+       "watchlistedit-clear-titles": "Säiten:",
+       "watchlistedit-clear-submit": "Iwwerwaachungslëscht eidelmaachen (kann net réckgängeg gemaach ginn!)",
+       "watchlistedit-clear-done": "Är Iwwerwaachungslëscht gouf eidel gemaach.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|1 Säit gouf|$1 Säite goufen}} erausgeholl:",
+       "watchlistedit-too-many": "Et sinn ze vill Säite fir se hei ze weisen.",
+       "watchlisttools-clear": "D'Iwwerwaachungslëscht eidelmaachen",
        "watchlisttools-view": "Iwwerwaachungslëscht: Ännerungen",
        "watchlisttools-edit": "Iwwerwaachungslëscht weisen an änneren",
        "watchlisttools-raw": "Net-formatéiert Iwwerwaachungslëscht änneren",
        "compare-invalid-title": "Den Titel deen Dir uginn hutt ass net valabel.",
        "compare-title-not-exists": "Den Titel deen Dir uginn hutt gëtt et net.",
        "compare-revision-not-exists": "D'Versioun déi Dir uginn hutt gëtt et net.",
-       "dberr-header": "Dës Wiki huet e Problem",
        "dberr-problems": "Pardon! Dëse Site huet technesch Schwieregkeeten.",
        "dberr-again": "Versicht e puer Minutten ze waarden an dann nei ze lueden.",
        "dberr-info": "(Den Datebank-Server kann net erreecht ginn: $1)",
        "htmlform-no": "Neen",
        "htmlform-yes": "Jo",
        "htmlform-chosen-placeholder": "Sicht eng Optioun eraus",
+       "htmlform-cloner-create": "Méi derbäisetzen",
+       "htmlform-cloner-delete": "Ewechhuelen",
+       "htmlform-cloner-required": "Mindestens ee Wäert ass obligatoresch.",
        "sqlite-has-fts": "$1 ënnerstëtzt d'Volltextsich",
        "sqlite-no-fts": "$1 ënnerstëtzt d'Volltextsich net",
        "logentry-delete-delete": "$1 {{GENDER:$2|huet}} d'Säit $3 geläscht",
index 1ff17e0..365b76f 100644 (file)
@@ -13,7 +13,8 @@
                        "Ole Yves",
                        "Reedy",
                        "Soul Train",
-                       "Умар"
+                       "Умар",
+                       "아라"
                ]
        },
        "tog-underline": "ЭлячӀунрин кӀаникай цӀар чӀугун",
@@ -26,7 +27,6 @@
        "tog-showtoolbar": "Дуьзар хъувунин алатрин кьвати къалура (JavaScript)",
        "tog-editondblclick": "Ччинар кьве тӀампӀуналди дуьзар хъувун (JavaScript герекзава)",
        "tog-editsectiononrightclick": "Пайдин кьилинцӀардиз эрчӀи патан тӀампӀ авуна пайдин дуьзар хъувуниз мумкинвал гун (JavaScript герекзава)",
-       "tog-rememberpassword": "И браузерда зи логин рикӀел хуьхь (лап гзаф $1 {{PLURAL:$1|1=югъ|йикъар}})",
        "tog-watchcreations": "За туькӀуьрнавай ччинар зи гуьзетунин сиягьдиз алава авун",
        "tog-watchdefault": "За дуьзар хъувунвай ччинар зи гуьзетунин сиягьдиз алава авун",
        "tog-watchmoves": "За тӀвар эхцигай ччинар зи гуьзетунин сиягьдиз алава авун",
        "watchthis": "И ччин гуьзетун",
        "savearticle": "Ччин хуьн",
        "preview": "Сифтедин килигун",
-       "showpreview": "Сифтедин килигун къалурун",
-       "showlivepreview": "Фад сифтедин килигун",
+       "showpreview": "Виликамаз килигун",
        "showdiff": "МасакIавилер къалурун",
        "anoneditwarning": "'''Дикъет:''' Куьне системадиз жув вуж ятIа лагьанвач. Куь IP-адрес и ччинин масакIавилерин тарихдиз  кхьида.",
        "summary-preview": "Сифте килигун паталди:",
        "search-nonefound": "Тlалабдив кьадай са нетижани жагъанвач.",
        "powersearch-legend": "Гегьенш жугъурун",
        "powersearch-ns": "Жугъурун тlварарин генгвилера:",
-       "powersearch-redir": "Рахкъурунар къалура",
        "powersearch-togglelabel": "Акун",
        "powersearch-toggleall": "Вири",
        "powersearch-togglenone": "Садни",
        "prefs-files": "Шикил",
        "youremail": "Электрон почта:",
        "username": "Уртахдин тӀвар",
-       "uid": "Уртах тайин ийидайди:",
        "yourrealname": "Xалис тIвар:",
        "yourlanguage": "ЧIалар",
        "yournick": "ЦӀийи къул:",
        "recentchanges-label-bot": "И дуьзар хъувун ботди авунвайд я",
        "recentchanges-label-unpatrolled": "И дуьзар хъувундин винел патрулвал авунвач",
        "rcnotefrom": "Агъадихъ '''$2'''-ай эгечIна масакIавилер къалурнава ( '''$1''' кьван  къалурнава).",
-       "rclistfrom": "$1-й эгечIна цIийи масакIавилер къалурун",
+       "rclistfrom": "$3 $2-й эгечIна цIийи масакIавилер къалурун",
        "rcshowhideminor": "$1 гъвечlи дуьзар хъувунар",
        "rcshowhideminor-show": "Къалурун",
        "rcshowhideminor-hide": "Чуьнуьхун",
        "booksources-go": "Фин",
        "log": "Журналар",
        "allpages": "Вири ччинар",
-       "alphaindexline": "$1-кай $2 -ди",
        "prevpage": "Алатай чар ($1)",
        "allpagesfrom": "Къалур хъувун,идалай гатIунай:",
        "allpagesto": "Акъудан чарар, куьтягь жезвай:",
        "table_pager_limit_label": "Са ччиниз талукь тир затIар:",
        "table_pager_limit_submit": "Фин",
        "table_pager_empty": "Жагъанвач",
-       "livepreview-loading": "Ппарзава...",
-       "livepreview-ready": "Ппарзава... ГЬазур я!",
        "watchlistedit-normal-title": "Гуьзетунин сиягь дуьзар хъувун",
        "watchlistedit-raw-title": "Гуьзетунин сиягь текст хьиз дуьзар хъувун",
        "watchlistedit-raw-legend": "Гуьзетунин сиягь текст хьиз дуьзар хъувун",
index 3e0ad47..a93b27d 100644 (file)
@@ -5,7 +5,8 @@
                        "Kaganer",
                        "Malafaya",
                        "Reedy",
-                       "Urhixidur"
+                       "Urhixidur",
+                       "아라"
                ]
        },
        "tog-underline": "Sulinia lias:",
@@ -16,7 +17,6 @@
        "tog-showtoolbar": "Mostra la bara de utiles per edita (JavaScript)",
        "tog-editondblclick": "Edita pajes a du clicas (JavaScript)",
        "tog-editsectiononrightclick": "Engrana la edita de sesion par clica a la destra a titulos de sesion (JavaScript)",
-       "tog-rememberpassword": "Memora me sinia per entra a esta computador (for a maximum of $1 {{PLURAL:$1|day|days}})",
        "tog-watchcreations": "Junta la pajes ce me ia creada a me lista de pajes oservada",
        "tog-watchdefault": "Junta pajes ce me ia edita a me lista de pajes oservada",
        "tog-watchmoves": "Junta pajes ce me ia moveda a me lista de pajes oservada",
        "recentchanges-summary": "Asi la lista de cambias resente en la vici.",
        "recentchanges-feed-description": "Seque la cambias plu resente a la vici en esta flue.",
        "rcnotefrom": "A su es la cambias de '''$2''' (asta '''$1''' es mostrada).",
-       "rclistfrom": "Mostra cambias nova, comensante de $1",
+       "rclistfrom": "Mostra cambias nova, comensante de $3 $2",
        "rcshowhideminor": "$1 editas minor",
        "rcshowhidebots": "$1 botes",
        "rcshowhideliu": "$1 usores ativa aora",
        "watchthispage": "Oserva esta paje",
        "unwatch": "Nonoserva",
        "watchlist-details": "{{PLURAL:$1|$1 paje|$1 pajes}} osservada, sin pajes de discutes.",
-       "watchlistcontains": "Tu lista oservada teni $1 {{PLURAL:$1|paje|pajes}}.",
        "wlshowlast": "Mostra la $1 oras e $2 dias presedente $3",
        "watching": "Oserva...",
        "unwatching": "No oserva...",
index b9c99a2..f3911bf 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "Kizito"
+                       "Kizito",
+                       "아라"
                ]
        },
        "tog-underline": "Enyunzi ebengako olukoloboze?",
@@ -14,7 +15,6 @@
        "tog-showtoolbar": "Amapeesa g'ebiyamba mu kuwandika galabikenga (kino kyetaagisa JavaScript)",
        "tog-editondblclick": "Okunyiga eppeesa emirundi ebiri kubikkulenga w'okyusiza olupapula  (kyetaagisa 'JavaScript')",
        "tog-editsectiononrightclick": "Okunyiga ku omutwe gw'omuko ku lupapula n'eppeesa erya ddyo kubikkulenga w'ogukyusiza (kyetaagisa 'JavaScript')",
-       "tog-rememberpassword": "Tereka ekigambo kyange ekikuumi ku kompyuta eno (okumala {{PLURAL:$1|olunaku|ennaku ezitasukka mu}} $1)",
        "tog-watchcreations": "Empapula zenkolawo ziteekebwenga ku lukalala lw'ezo zengoberera",
        "tog-watchdefault": "Empapula zenkyusamu ziteekebwenga ku lukalala lw'ezo zengoberera",
        "tog-watchmoves": "Empapula zenkyusa erinnya ziteekebwenga ku lukalala lw'ezo zengoberera",
        "readonly_lag": "Okukukkiriza enkyukakyuka mu ggwanika lya data lino kuyimirizidwamu, kompyuta eziriko amawanika ga data amazibizi zisobole okugakwataganya n'eggwanika lya data ery'ennono",
        "internalerror": "Puloguramu ey'oku wiki efunye kirimya munda mwayo",
        "internalerror_info": "Puloguramu ey'oku wiki efunye kirimya munda mwayo: $1",
-       "fileappenderrorread": "\"$1\" nnemedwa okugisoma ndyoke ngiwayireko ebipya.",
-       "fileappenderror": "\"$2\" nnemedwa okugiwayirako \"$1\".",
        "filecopyerror": "Nnemedwa okuteeka kkopi ya fayiro \"$1\" mu \"$2\".",
        "filerenameerror": "Fayiro \"$1\" nnemedwa okugikyusa erinnya lifuuke \"$2\".",
        "filedeleteerror": "Nnemedwa okugyawo fayiro \"$1\".",
        "directorycreateerror": "Nnemedwa okukolawo etterekero \"$1\".",
        "filenotfound": "Fayiro \"$1\" embuze.",
-       "fileexistserror": "Nnemedwa okuwandika fayiro \"$1\": Yakolebwawo dda",
        "unexpected": "Waliwo ekivaamu ekitasuubirwa: \"$1\"=\"$2\".",
        "formerror": "Kiremya: nnemedwa okusindika foomu",
        "badarticleerror": "Ku lupapula luno ekikolwa ekyo tekisoboka.",
        "savearticle": "Kaza olupapula",
        "preview": "Kulagako",
        "showpreview": "Sooka ondageko",
-       "showlivepreview": "Labirawo enfaanana ya by'okusiza",
        "showdiff": "Ndaga bwe bikyuse",
        "anoneditwarning": "'''Kulabula:''' Owandika toyingidde mu sisitemu. Tujjakuwandika endagiriro eya kompyuta kwosinzidde\nmu lukalala lw'enkuykakyuka ez'omu lupapula luno.",
        "anonpreviewwarning": "''Okola toyingidde sisitemu. Bw'on'okaza by'okola nga sisitemu ewandika n'endagiriro yo eya IP mu lukalala lw'enkyukakyuka lw'olupapula luno.''",
        "searchall": "",
        "powersearch-legend": "Noonya mu ngeri esunsula",
        "powersearch-ns": "Noonyeza mu makuŋaaniro gano:",
-       "powersearch-redir": "Laga n'empapula ezikutwalabutwazi ku zinnaazo",
        "powersearch-togglelabel": "Londa:",
        "powersearch-toggleall": "Gonna",
        "preferences": "Enteekateeka yange",
        "recentchanges-legend": "Awategekerwa endaga y'ebyakakyusibwa",
        "recentchanges-summary": "Goberera enkyukakyuka empya ez'oku lupapula luno",
        "recentchanges-feed-description": "Kozesa omukutu guno okugoberera enkyukakyuka empya ez'oku wiki",
-       "rclistfrom": "Laga enkyukakyuka empya ezikoledwa okuva $1",
+       "rclistfrom": "Laga enkyukakyuka empya ezikoledwa okuva $3 $2",
        "rcshowhideminor": "$1 nkyukakyuka ntono",
        "rcshowhidebots": "$1 ebya bboti",
        "rcshowhideliu": "$1 ebya bamemba abali ku wiki ku saawa eno",
index 13c4383..743e9cf 100644 (file)
@@ -13,7 +13,8 @@
                        "Reedy",
                        "Remember the dot",
                        "Tibor",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Links óngersjtriepe",
@@ -26,7 +27,6 @@
        "tog-showtoolbar": "Laot edit toolbar zeen",
        "tog-editondblclick": "Bewirk pagina's bie 'ne dobbelklik (JavaScript)",
        "tog-editsectiononrightclick": "Secties bewirke mit 'ne rechtermoesklik op sectietitels (JavaScript nudig)",
-       "tog-rememberpassword": "Mien wachwaord onthouwe veur later sessies (hoegstens $1 {{PLURAL:$1|daag|daag}})",
        "tog-watchcreations": "Volg autematis pagina's die ich aanmaak en bestenj die ich upload",
        "tog-watchdefault": "Voog pagina's em bestenj die se bewirks toe aan dien volglies",
        "tog-watchmoves": "Volg autematis pagina's en bestenj die ich verplaats",
        "readonly_lag": "De database is autematis vergrendeld terwiel de ongergesjikte databaseservers synchronisere mit de huidserver.",
        "internalerror": "Interne fout",
        "internalerror_info": "Interne fout: $1",
-       "fileappenderrorread": "\"$1\" kós neet gelaeze waere tiejes 't toevoge.",
-       "fileappenderror": "Kós \"$1\" neet toevogen aan \"$2\".",
        "filecopyerror": "Besjtand \"$1\" kós neet nao \"$2\" gekopieerd waere.",
        "filerenameerror": "Verangere van de titel van 't besjtand \"$1\" in \"$2\" neet mäögelik.",
        "filedeleteerror": "Kós bestjand \"$1\" neet ewegsjaffe.",
        "directorycreateerror": "Map \"$1\" kós neet aangemaak waere.",
        "filenotfound": "Kós bestjand \"$1\" neet vènje.",
-       "fileexistserror": "Sjrieve nao bestandj \"$1\" waor neet mäögelik: 't bestandj besjteit al",
        "unexpected": "Ónverwachte waerd: \"$1\"=\"$2\".",
        "formerror": "Fout: kós formeleer neet versjikke",
        "badarticleerror": "Dees hanjeling kan neet waere oetgeveurd op dees pagina.",
        "savearticle": "Pagina opsjlaon",
        "preview": "Naokieke",
        "showpreview": "Betrach dees bewirking",
-       "showlivepreview": "Bewèrking ter controle tuine",
        "showdiff": "Toen verangeringe",
        "anoneditwarning": "Doe bis neet aangemeld. Dien IP adres weurt opgesjlage in de historie van dees pagina.",
        "anonpreviewwarning": "''Doe bös neet aangemeldj.''\n''Door dien bewèrking op te slaon wört dien IP-adres opgeslagen in de paginagesjiedenis.''",
        "search-nonefound": "D'r zien gein resultate veur diene zeukopdrach.",
        "powersearch-legend": "Oetgebreid zeuke",
        "powersearch-ns": "Zeuke in naamruumdes:",
-       "powersearch-redir": "Doorverwiezinge waergaeve",
        "powersearch-togglelabel": "Conterleer:",
        "powersearch-toggleall": "Alle",
        "powersearch-togglenone": "Gein",
        "prefs-advancedsearchoptions": "Wiejer instèllinger",
        "prefs-advancedwatchlist": "Wiejer instèllinger",
        "prefs-displayrc": "Toeaningsinstèllinger",
-       "prefs-displaysearchoptions": "Toeaningsinstèllinger",
        "prefs-displaywatchlist": "Toeaningsinstèllinger",
        "prefs-diffs": "Vers",
        "email-address-validity-valid": "'t E-mailadres liek geldig",
        "recentchanges-label-unpatrolled": "Dees bewirking is nog neet gekónterleerd",
        "recentchanges-legend-newpage": "$1 - Nuuj pagina",
        "rcnotefrom": "Verangeringe sins <b>$2</b> (mit 'n maximum van <b>$1</b> verangeringe).",
-       "rclistfrom": "Tuin de verangeringe vanaaf $1",
+       "rclistfrom": "Tuin de verangeringe vanaaf $3 $2",
        "rcshowhideminor": "$1 klein bewèrkinge",
        "rcshowhidebots": "$1 bots",
        "rcshowhideliu": "$1 aangemelde gebroekers",
        "uploadstash-refresh": "Wèrk lies van bestenj bie",
        "invalid-chunk-offset": "Óngèljige chunckaafzatj",
        "img-auth-accessdenied": "Toegank geweigerd",
-       "img-auth-nopathinfo": "PATH_INFO óntbrèk.\nDiene server is neet ingesteld om dees informatie door te gaeve.\nMisjien gebroek deze CGI, en dan wört img_auth neet ongersteund.\nZuuch https://www.mediawiki.org/wiki/Manual:Image_Authorization aafbeildingsrechte veur mee informatie.",
+       "img-auth-nopathinfo": "PATH_INFO óntbrèk.\nDiene server is neet ingesteld om dees informatie door te gaeve.\nMisjien gebroek deze CGI, en dan wört img_auth neet ongersteund.\nZuuch https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization aafbeildingsrechte veur mee informatie.",
        "img-auth-notindir": "'t Ópgevraogdje paad is neet de ingestelde uploadmap.",
        "img-auth-badtitle": "Kèn geine geldige paginanaam make van \"$1\".",
        "img-auth-nologinnWL": "Doe bös neet aangemeld en \"$1\" steit neet op de witte lies.",
        "watchlist-details": "D'r {{PLURAL:$1|sjteit ein pagina|sjtaon $1 pagina's}} op dien volglies mit oetzunjering van de euverlèkpagina's.",
        "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'''",
-       "watchmethod-recent": "Controleer recènte verangere veur gevolgde pazjena's",
-       "watchmethod-list": "controlere van gevolgde pazjena's veur recènte verangeringe",
-       "watchlistcontains": "Dien volglies bevat $1 {{PLURAL:$1|pazjena|pazjena's}}.",
-       "iteminvalidname": "Probleem mit object '$1', ongeljige naam...",
        "wlshowlast": "Tuin lètste $1 ore $2 daag $3",
        "watchlist-options": "Opties veur volglies",
        "watching": "Bezig mit plaatse op de volglies...",
        "enotif_lastvisited": "Zuug $1 veur al verangeringe saer dien lèste bezeuk.",
        "enotif_lastdiff": "Zuug $1 om deze wieziging te zeen.",
        "enotif_anon_editor": "anonieme gebroeker $1",
-       "enotif_body": "Bèste $WATCHINGUSERNAME,\n\nDe {{SITENAME}}-pazjena \"$PAGETITLE\" is $CHANGEDORCREATED op $PAGEEDITDATE door $PAGEEDITOR, zuug $PAGETITLE_URL veur de hujige versie.\n\n$NEWPAGE\n\nBewirkingssamevatting: $PAGESUMMARY $PAGEMINOREDIT\n\nContacteer de bewirker:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nDao zalle bie volgende verangeringe gein nuuj berichte kómme tenzies te dees pazjena obbenuujts bezeuks. De kans ouch de notificatievlegskes op dien volglies verzètte.\n\n             't {{SITENAME}}-notificatiesysteem\n\n--\nÓm de insjtèllinge van dien volglies te verangere, zuug\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nÓm de paasj van dien wachlies aaf te haole, bezeuk\n$UNWATCHURL\n\nCommentaar en wiejer assistentie:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Bèste $WATCHINGUSERNAME,\n\nDe {{SITENAME}}-pazjena \"$PAGETITLE\" is $CHANGEDORCREATED op $PAGEEDITDATE door $PAGEEDITOR, zuug $PAGETITLE_URL veur de hujige versie.\n\n$NEWPAGE\n\nBewirkingssamevatting: $PAGESUMMARY $PAGEMINOREDIT\n\nContacteer de bewirker:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nDao zalle bie volgende verangeringe gein nuuj berichte kómme tenzies te dees pazjena obbenuujts bezeuks. De kans ouch de notificatievlegskes op dien volglies verzètte.\n\n             't {{SITENAME}}-notificatiesysteem\n\n--\nÓm de insjtèllinge van dien volglies te verangere, zuug\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nÓm de paasj van dien wachlies aaf te haole, bezeuk\n$UNWATCHURL\n\nCommentaar en wiejer assistentie:\n$HELPPAGE",
        "created": "aangemaak",
        "changed": "verangerd",
        "deletepage": "Pagina ewegsjaffe",
        "blockip": "Blokkeer dit IP-adres",
        "blockip-legend": "'ne Gebroeker of IP-adres blokkere",
        "blockiptext": "Gebroek 't óngerstjaondj formeleer óm sjrieftoegank van e zeker IP-adres te verbeje. Dit maag allein gedaon weure om vandalisme te veurkómme en in euvereinkóms mitte [[{{MediaWiki:Policy-url}}|beleid]]. Gaef hiejónger de raeje óp (bv. inkel vandaliseerdje paazjes).",
-       "ipadressorusername": "IP-adres of gebroekersnaam",
+       "ipaddressorusername": "IP-adres of gebroekersnaam",
        "ipbexpiry": "Verlöp (maak 'n keuze)",
        "ipbreason": "Reeje:",
        "ipbreason-dropdown": "*Väöl veurkommende rejer veur blokkaazjes\n** Foutieve informatie inveure\n** Verwiedere van informatie oet artikele\n** Spamlinks nao externe websites\n** Inveuge van nonsens in artikele\n** Intimiderend gedraag\n** Misbroek van meerdere gebroekers\n** Onacceptabele gebroekersnaam",
        "tooltip-undo": "Mit \"óngedaon make\" driejs te dees bewirking trök en koms te in 't bewirkingsvinster.\nDoe kans in de bewirkingssamevatting 'n reej opgaeve.",
        "tooltip-preferences-save": "Slaon veurkäöre óp",
        "tooltip-summary": "Veur 'n kórte samevatting in",
-       "notacceptable": "De wikiserver kin de gegaeves neet levere in  'ne vorm dae diene client kin laeze.",
        "anonymous": "{{PLURAL:$1|Anonieme gebroeker|Anoniem gebroekers}} ven {{SITENAME}}",
        "siteuser": "{{SITENAME}} gebroeker $1",
        "anonuser": "anonieme gebroeker óp {{SITENAME}} $1",
        "newimages-summary": "Op dees speciaal pazjena waere de meis recènt toegevoogde bestenj weergegaeve.",
        "newimages-legend": "Bestandjsnaam",
        "newimages-label": "Bestandjsnaam (of deel daarvan):",
-       "showhidebots": "($1 Bots)",
        "noimages": "Niks te zeen.",
        "ilsubmit": "Zeuk",
        "bydate": "op datum",
        "autosumm-replace": "Teks vervange mit '$1'",
        "autoredircomment": "Verwies door nao [[$1]]",
        "autosumm-new": "Nuuj pazjena mit $1",
-       "livepreview-loading": "Laje…",
-       "livepreview-ready": "Laje… Vaerdig!",
-       "livepreview-failed": "Live veurvertuin mislök!\nProbeer normaal veurvertuin.",
-       "livepreview-error": "Verbènje mislök: $1 \"$2\"\nProbeer normaal veurvertuin.",
        "lag-warn-normal": "Verangeringe die nujer zeen es $1 {{PLURAL:$1|sekónd|sekónd}} waere mesjiens neet getuind in dees lies.",
        "lag-warn-high": "Door 'ne hoege database-servertoeveur zeen verangeringe nujer es $1 {{PLURAL:$1|seconde|seconde}} mäögelik neet besjikbaar in de lies.",
-       "watchlistedit-numitems": "Op dien volglies sjtaon {{PLURAL:$1|1 pazjena|$1 pazjena's}}, exclusief euverlèkpazjena's.",
-       "watchlistedit-noitems": "Dao sjtaon gein pazjena's op dien volglies.",
        "watchlistedit-normal-title": "Volglies bewirke",
        "watchlistedit-normal-legend": "Pazjena's ewegsjaffe van dien volglies",
        "watchlistedit-normal-explain": "Pazjena's op dien volglies waere hiejónger getuind.\nKlik op 't veerkentje d'rnaeve óm 'n pazjena eweg te sjaffe. Klik daonao op '{{int:Watchlistedit-normal-submit}}'.\nDe kèns ouch [[Special:EditWatchlist/raw|de roew lies bewirke]].",
        "compare-invalid-title": "De opgegaeve pazjenanaam is óngeljig.",
        "compare-title-not-exists": "Aangegaeve titel besteit neet.",
        "compare-revision-not-exists": "Aangegaeve versie besteit neet.",
-       "dberr-header": "Deze wiki haet 'n probleem",
        "dberr-problems": "Os excuses. Deze site ongervindj op t moment technische probleme.",
        "dberr-again": "Wach n aantal minute en probeer t daonao opnuuj.",
        "dberr-info": "(Kan gein verbinjing make mit de databaseserver: $1)",
index 9703ed2..8c1d942 100644 (file)
@@ -7,7 +7,8 @@
                        "Giromin Cangiaxo",
                        "Malafaya",
                        "Urhixidur",
-                       "ZeneizeForesto"
+                       "ZeneizeForesto",
+                       "아라"
                ]
        },
        "tog-underline": "Sottolineâ i collegamenti",
@@ -20,7 +21,6 @@
        "tog-showtoolbar": "Fanni vedde a barra di strumenti de modìffica (serve JavaScript)",
        "tog-editondblclick": "Modifica e paggine co-o doggio clic (serve Javascrpt)",
        "tog-editsectiononrightclick": "Modifica e seçión co-o clic drito in sciô tìtolo (serve Javascipt)",
-       "tog-rememberpassword": "Arregorda a mæ paròlla d'ordine (a-o màscimo pe $1 {{PLURAL:$1|day|days}})",
        "tog-watchcreations": "Azonzi e paggine che creo e i file che carrego a-i oservæ speciâli",
        "tog-watchdefault": "Azonzi e paggine e i files che modiffico a-i mæ sotta oservaçion",
        "tog-watchmoves": "Azonzi e paggine e i file che mescio a-i mæ sotta oservaçion",
        "gotaccountlink": "Intra",
        "userlogin-resetlink": "T'æ ascordòu i teu dæti de acesso?",
        "userlogin-resetpassword-link": "Reimposta a to password",
-       "createacct-join": "Inserisci i to dæti chi sotta.",
        "createaccountmail": "Doeuvia una password temporanea abrettio e mandila a l'adresso de posta elettronica speçificou",
        "createaccountreason": "Raxon:",
        "createacct-imgcaptcha-ph": "Scrivi quello che ti veddi de d'ato",
        "recentchanges-label-bot": "Sto cangiaménto o l'à fæto in bot",
        "recentchanges-label-unpatrolled": "Sto cangiaménto o no l'é stæto ancón verificòu",
        "rcnotefrom": "Chì sotta gh'è i cangiamenti fæti comensando da '''$2''' (scin a '''$1''').",
-       "rclistfrom": "Fanni vedde e modiffiche apportæ partindo da $1",
+       "rclistfrom": "Fanni vedde e modiffiche apportæ partindo da $3 $2",
        "rcshowhideminor": "$1 cangiaménti minoi",
        "rcshowhidebots": "$1 bot",
        "rcshowhideliu": "$1 utenti registræ",
        "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)}}.",
-       "watchlistcontains": "A lista in osservaçion g'ha $1 {{PLURAL:$1|pagine|pagina}}.",
        "wlshowlast": "Famme vedde e ûrtime $1 ôe $2 giorni $3",
        "watchlist-options": "Inpostaçioìn di oservæ speciâli",
        "watching": "Inti osservæ speçiâli...",
        "autosumm-replace": "Sostituçion da pagina con '$1'",
        "autoredircomment": "Reindirissoö a [[$1]]",
        "autosumm-new": "Paggina creâ con \"$1\"",
-       "livepreview-loading": "Camallando…",
-       "livepreview-ready": "Camallando… Æmô finïo!",
        "watchlisttools-view": "Veddi e modiffiche pertinenti",
        "watchlisttools-edit": "Veddi e modiffica a lista",
        "watchlisttools-raw": "Modiffica a lista in formato testo",
index 1000643..c6244cd 100644 (file)
@@ -15,7 +15,9 @@
                        "Remulazz",
                        "SabineCretella",
                        "Snowdog",
-                       "Sprüngli"
+                       "Sprüngli",
+                       "아라",
+                       "Ninonino"
                ]
        },
        "tog-underline": "Sutulinia i ligam",
        "tog-hidepatrolled": "Scund i mudifegh verifegaa intra i ültem mudifegh",
        "tog-newpageshidepatrolled": "Scund i paginn verifegaa de la lista di paginn növ",
        "tog-extendwatchlist": "Slarga la funziun \"tegn sot ögg\" in manera che la fà vidè tüt i mudifegh, minga dumà l'ültema",
-       "tog-usenewrc": "Dupra i ültem mudifegh avanzaa (ghe vör el JavaScript)",
-       "tog-numberheadings": "Utu-nümerazión di paragraf",
-       "tog-showtoolbar": "Fá vidé ai butún da redataziún (JavaScript)",
-       "tog-editondblclick": "Redatá i pagin cun al dópi clich (JavaScript)",
-       "tog-editsectiononrightclick": "Abilitá redatazziún dai sezziún cun al clic<br />\nsüi titul dai sezziún (JavaScript)",
-       "tog-rememberpassword": "Regòrdass la mè paròla d'urdin (for a maximum of $1 {{PLURAL:$1|day|days}})",
-       "tog-watchcreations": "Giunta i paginn ch'hoo creaa mì a la lista di paginn che tegni sot ögg",
-       "tog-watchdefault": "Gjüntá i pagin redataa in dala lista dii pagin tegnüü d'öcc",
-       "tog-watchmoves": "Giunta i paginn ch'hoo muvüü a la lista di paginn che tegni sot ögg",
-       "tog-watchdeletion": "Giunta i paginn ch'hoo scancelaa a la lista di paginn che tegni sot ögg",
+       "tog-usenewrc": "Reönés le mudifiche per pàgina endèle ölteme mudìfiche 'ndèi oservàcc speciài",
+       "tog-numberheadings": "Auto-nümerazion di paragraf",
+       "tog-showtoolbar": "Fà ved la barra dei arnés de modifica",
+       "tog-editondblclick": "Redatá i pagin cun al dópi clich",
+       "tog-editsectiononrightclick": "Abilitá mudifica di seziún cun al clic dester sül tìtul",
+       "tog-watchcreations": "Giunta i paginn e i archivi ch'hoo creaa mì a la lista di paginn che tegni sot ögg",
+       "tog-watchdefault": "Gjüntá i pagin e i archivi mudificaa in dela lista dii pagin tegnüü d'öcc",
+       "tog-watchmoves": "Giunta i paginn e i archivi ch'hoo muvüü a la lista di paginn che tegni sot ögg",
+       "tog-watchdeletion": "Giunta i paginne i archivi ch'hoo scancelaa a la lista di paginn che tegni sot ögg",
        "tog-minordefault": "Marca tücc i mudifegh cume piscinìn",
        "tog-previewontop": "Fá vidé un'anteprima anaanz dala finèstra da redatazziún",
        "tog-previewonfirst": "Fá vidé l'anteprima ala prima redatazziún",
+       "tog-enotifwatchlistpages": "Màndem 'na e-mail quan che vé mudificàda 'na pagina o 'n archivi che g'ho 'ntra i mé oservàcc speciài",
        "tog-enotifusertalkpages": "Mandem un messagg e-mail quand che gh'è di mudifegh a la mè pàgina di ciaciarad",
-       "tog-enotifminoredits": "Màndem un messagg e-mail anca per i mudifegh piscinín",
+       "tog-enotifminoredits": "Màndem un messagg e-mail anca per i mudifegh piscinín ai articol e ai archivi",
        "tog-enotifrevealaddr": "Lassa vedè 'l mè indirizz e-mail int i messagg d'avis",
-       "tog-oldsig": "Anteprima de la firma esistenta:",
+       "tog-shownumberswatching": "Fa vet el nümer de ütent che té d'ögg l'articol",
+       "tog-oldsig": "Firma esistenta:",
        "tog-fancysig": "Trata la firma cume test wiki (senza nissön ligam utumatich)",
-       "tog-watchlisthideown": "Sconda i me mudifich dai pagin che a ten d'ögg",
-       "tog-watchlisthidebots": "Sconda i mudifich di bot da i pagin che a ten d'ögg",
+       "tog-uselivepreview": "Ativa la funzion \"Live Preview\" (anteprima al vul)",
+       "tog-forceeditsummary": "Ciamem cunferma semai che 'l camp oget l'è öt",
+       "tog-watchlisthideown": "Scont le mé mudìfiche endèi oservàcc speciài",
+       "tog-watchlisthidebots": "Sconda i mudifich di bot da i pagin uservaa special",
+       "tog-watchlisthideminor": "Scont le mudìfiche picinìne 'ndèi oservàcc speciai",
+       "tog-watchlisthideliu": "Scont le mudìfiche dei ütèncc autenticàcc endèi oservàcc speciài",
+       "tog-watchlisthideanons": "Scont le mudìfiche dei ütèncc anònim endèi oservàcc speciài",
+       "tog-watchlisthidepatrolled": "Scont le mudìfiche verificàde endèi oservàcc speciài",
        "tog-ccmeonemails": "Spedissem una copia di messagg spedii a i alter druvadur",
        "tog-diffonly": "Mustra mía el cuntegnüü de la pagina apress ai ''diffs''",
        "tog-showhiddencats": "Fà vidè i categurij scundüü",
        "tog-norollbackdiff": "Mustra mía i ''diffs'' dop che i henn staa ripristinaa cun un rollback",
+       "tog-useeditwarning": "Avìzem quan che so dré a nà fò de 'na pàgina sènsa ìga salvàt le mudìfiche",
+       "tog-prefershttps": "Dopra sèmper 'na conesiù sigüra quan che s'è autenticàcc",
        "underline-always": "Semper",
        "underline-never": "Mai",
-       "underline-default": "Mantegn i impustazión standard del browser",
+       "underline-default": "Mantegn i impustazión standard del browser o de l'interfàcia",
        "editfont-style": "Stil del font de l'area de mudifega:",
        "editfont-default": "Browser de default",
        "editfont-monospace": "Font mono-spaziaa",
        "oct": "Utu",
        "nov": "Nuv",
        "dec": "Dic",
+       "january-date": "{{PLURAL:$1|1°|$1}} de zenér",
+       "february-date": "{{PLURAL:$1|1°|$1}} de febrér",
+       "march-date": "{{PLURAL:$1|1°|$1}} de Mars",
+       "april-date": "{{PLURAL:$1|1°|$1}} de Bril",
+       "may-date": "{{PLURAL:$1|1°|$1}} de Magio",
+       "june-date": "{{PLURAL:$1|1°|$1}} de Zögn",
+       "july-date": "{{PLURAL:$1|1°|$1}} de Löi",
+       "august-date": "{{PLURAL:$1|1°|$1}} de Agost",
+       "september-date": "{{PLURAL:$1|1°|$1}} de Setèmber",
+       "october-date": "{{PLURAL:$1|1°|$1}} de Utùer",
+       "november-date": "{{PLURAL:$1|1°|$1}} de Noèmber",
+       "december-date": "{{PLURAL:$1|1°|$1}} de Dezèmber",
        "pagecategories": "{{PLURAL:$1|Categuria|Categurij}}",
        "category_header": "Artìcuj int la categuria \"$1\"",
        "subcategories": "Suta-categurij",
        "category-subcat-count": "{{PLURAL:$2|Quela categuria chì la gh'ha dumà una sota-categuria, missa chì de sota.|Quela categuria chì la gh'ha {{PLURAL:$1|una sota-categuria|$1 sota-categurij}} chì de sota, sü un tutal de $2.}}",
        "category-subcat-count-limited": "Quela categuria chì la gh'ha denter {{PLURAL:$1|la sut-categuria| i $1 sut-categurij}} chì abass.",
        "category-article-count": "{{PLURAL:$2|Quela categuria chì la gh'ha dumà quela pagina chì.|In quela categuria chì gh'è {{PLURAL:$1|la pagina indicada|i $1 paginn indicaa}} de $2 che gh'hinn in tutal.}}",
+       "category-article-count-limited": "Chèsta categuria la g'ha dét {{PLURAL:$1|l'artìcol|i $1 artìcoi}} elencàcc ché sota:",
        "category-file-count": "{{PLURAL:$2|Quela categuria chì la gh'ha denter dumà el file chì suta|Quela categuria chì la gh'ha denter {{PLURAL:$1|'l file|$1 i file}} ripurtaa chì suta, sü un tutal de $2.}}",
+       "category-file-count-limited": "Chèsta categuria la g'ha dét {{PLURAL:$1|l'archivi|i $1 archivi}} elencàcc ché sota:",
        "listingcontinuesabbrev": "cont.",
        "index-category": "Paginn indicizaa",
+       "noindex-category": "Paginn minga indicizaa",
+       "broken-file-category": "Pàgine con dét colegamèncc che va mìa",
        "about": "A pruposit də",
        "article": "Pagina de cuntegnüü",
        "newwindow": "(sa derviss int un'óltra finèstra)",
        "cancel": "Lassa perd",
-       "moredotdotdot": "Püssee",
+       "moredotdotdot": "Amò...",
+       "morenotlisted": "Chèsta lìsta l'è mìa compléta",
        "mypage": "La mè pagina",
        "mytalk": "i mè discüssiun",
        "anontalk": "Ciciarad per quel adress IP chì",
        "navigation": "Navegazión",
        "and": "&#32;e",
        "qbfind": "Tröva",
-       "qbbrowse": "Sföja",
+       "qbbrowse": "Fà passà",
        "qbedit": "Mudifega",
        "qbpageoptions": "Opzión de la pagina",
        "qbmyoptions": "I mè paginn",
        "vector-action-move": "Sposta",
        "vector-action-protect": "Prutegg",
        "vector-action-undelete": "Recüpera",
-       "vector-action-unprotect": "Desbloca",
+       "vector-action-unprotect": "Càmbia la protesiù",
        "vector-view-create": "Crea",
        "vector-view-edit": "Mudifega",
        "vector-view-history": "Varda la storia",
        "actions": "Azión",
        "namespaces": "Namespace",
        "variants": "Variant",
+       "navigation-heading": "Menù de navigasiù",
        "errorpagetitle": "Erur",
        "returnto": "Turna indré a $1.",
        "tagline": "De {{SITENAME}}",
        "searcharticle": "Và",
        "history": "Crunulugia de la pagina",
        "history_short": "Crunulugìa",
+       "updatedmarker": "mudificàda de l'öltema ólta che l'è stàda ésta",
        "printableversion": "Versión stampàbil",
        "permalink": "Culegament permanent",
        "print": "Stampa",
+       "view": "Varda",
+       "view-foreign": "Arda sö",
        "edit": "Mudifega",
+       "edit-local": "Mudìfica descrisiù locàla",
        "create": "Crea",
+       "create-local": "Zóntega 'na descrisiù locàla",
        "editthispage": "Mudifega quela pagina chi",
        "create-this-page": "Crea quela pagina chi",
        "delete": "Scancela",
        "deletethispage": "Scancela quela pagina chì",
+       "undeletethispage": "Recüpera chèsta pàgina",
        "undelete_short": "Rimet a post {{PLURAL:$1|1 mudifica|$1 mudifigh}}",
+       "viewdeleted_short": "Arda {{PLURAL:$1|'na mudìfica scancelàda|$1 mudìfiche scancelàde}}",
        "protect": "Bloca",
        "protect_change": "cambia",
        "protectthispage": "Prutegg quela pagina chì",
-       "unprotect": "Desbloca",
-       "unprotectthispage": "Tö via la pruteziun",
+       "unprotect": "Càmbia la protesiù",
+       "unprotectthispage": "Càmbia la protesiù de chèsta pàgina",
        "newpage": "Pagina növa",
        "talkpage": "Discüssión",
        "talkpagelinktext": "Ciciarada",
        "articlepage": "Varda l'articul",
        "talk": "Discüssión",
        "views": "Visid",
-       "toolbox": "Arnes",
+       "toolbox": "Arnés",
        "userpage": "Vidè la pàgina del dovrat",
        "projectpage": "Varda la pagina de servizzi",
        "imagepage": "Varda la pagina del file",
        "jumptonavigation": "Navigazión",
        "jumptosearch": "cerca",
        "view-pool-error": "Ne rincress, ma i server a hinn bej caregaa al mument.\nTrop drovat a hinn 'dree pruvà a vardà quela pagina chì.\nPer piasè, specia un mument prima de pruà a vardà anmò quela pagina chì.\n\n$1",
-       "aboutsite": "A prupòsit de {{SITENAME}}",
+       "generic-pool-error": "Ne rincress, ma i server a hinn bej caregaa al mument.\nTrop drovat a hinn 'dree pruvà a vardà chèsta risorsa.\nPer piasè, specia un mument prima de pruà a cargà anmò quela risorsa chì.\n\n$1",
+       "pool-timeout": "Tép scadìt per l'operasiù de blocàgio",
+       "pool-queuefull": "La cùa del \"pool\" l'è piéna",
+       "pool-errorunknown": "Erùr mìa cunusìt",
+       "pool-servererror": "El contör dei pool l'è mìa dispunìbil ($1).",
+       "aboutsite": "A mèret de {{SITENAME}}",
        "aboutpage": "Project:A pruposit",
-       "copyright": "El cuntegnüü a l'è dispunibil sota a una licenza $1.",
+       "copyright": "Se minga marcaa in manera diferenta, el cuntegnüü a l'è dispunibil sota a una licenza $1.",
        "copyrightpage": "{{ns:project}}:Dirit d'autur",
        "currentevents": "Atüalitaa",
        "currentevents-url": "Project:Aveniment Recent",
        "pagetitle-view-mainpage": "{{SITENAME}}",
        "retrievedfrom": "Utegnüü de \"$1\"",
        "youhavenewmessages": "A gh'hii di $1 ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Te g'hét}} $1 de {{PLURAL:$3|'n óter ütènt|$3 ütèncc}} ($2).",
+       "youhavenewmessagesmanyusers": "Te g'hét $1 de divèrsi ütèncc ($2).",
+       "newmessageslinkplural": "{{PLURAL:$1|en mesàgio nöf|999=mesàgi nöf}}",
+       "newmessagesdifflinkplural": "{{PLURAL:$1|öltem cambiamènt|999=öltem cambiamèncc}}",
        "youhavenewmessagesmulti": "Te gh'hee di messagg növ ins'el $1",
        "editsection": "mudifega",
        "editold": "mudifega",
        "toc": "Cuntegnüü",
        "showtoc": "fà vidè",
        "hidetoc": "scund",
+       "collapsible-collapse": "sara sü",
+       "collapsible-expand": "slarga",
        "thisisdeleted": "Varda o rimet a post $1?",
        "viewdeleted": "Te vöret vidè $1?",
        "restorelink": "{{PLURAL:$1|1 mudifega scancelada|$1 mudifegh scancelaa}}",
        "page-rss-feed": "Feed RSS per \"$1\"",
        "page-atom-feed": "Feed Atom per \"$1\"",
        "red-link-title": "$1 (la pagina la gh'è minga)",
+       "sort-descending": "Met en ùrden del piö grant al piö pesèn",
+       "sort-ascending": "Met en ùrden del piö pesèn al piö grant",
        "nstab-main": "Articul",
        "nstab-user": "Pagina persunala",
        "nstab-media": "Pagina multimediala",
        "nospecialpagetext": "<strong>T'hee ciamaa una pagina speciala minga valida.</strong>\n\nUna lista di paginn special la se pö truà in de la [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Erur",
        "databaseerror": "Erur in del database",
+       "databaseerror-query": "Ricérca: $1",
+       "databaseerror-function": "Funsiù: $1",
+       "databaseerror-error": "Erur: $1",
        "readonly": "Database blucaa",
        "missing-article": "El database l'ha minga truaa el test d'una pagina che l'avaria duvüü truà, ciamaa \"$1\" $2.\n\nQuest chì a l'è de solet causaa perchè al s'è riciamaa un paragón intra revisión vegg de la pagina o un ligam a una versión vegia d'una pagina che l'è stada scancelada\n\nSe l'è minga inscì, te pudariet vegh truà un bug in del software.\n\nPer piasè, fa raport a 'n'[[Special:ListUsers/sysop|aministradur]], cun la nota de l'URL.",
        "missingarticle-rev": "(revision#: $1)",
        "internalerror": "Erur in del sistema",
        "internalerror_info": "Erur intern: $1",
        "filecopyerror": "L'è mía staa pussibel cubià l'archivi \"$1\" in \"$2\"",
+       "filerenameerror": "L'è mía staa pussibel rinumunà l'archivi \"$1\" in \"$2\"",
+       "filedeleteerror": "L'è mía staa pussibel scancelà l'archivi \"$1\"",
+       "directorycreateerror": "L'è mía staa pussibel creà la cartèla \"$1\"",
+       "filenotfound": "L'è mía staa pussibel trövà l'archivi \"$1\"",
+       "unexpected": "Valur inaspetaa: \"$1\"=\"$2\"",
+       "cannotdelete": "La pagina o l'archivi \"$1\" i g'ha mìa püdìt véser scancelàcc.\nPöl das che i sàpe zà stacc scancelàcc de vergü óter.",
+       "cannotdelete-title": "L'è mìa stat pusìbol scancelà la pàgina \"$1\"",
+       "delete-hook-aborted": "El scancelamènt l'è stat anulàt de l'hook.\nGh'è stat dat nesöna spiegasiù.",
        "badtitle": "Títul mía bun",
        "badtitletext": "El titul de la pagina ciamada a l'è vöj, sbajaa o cun carater minga acetaa, opüra al vegn d'un erur in di ligam intra sit wiki diferent o versión in lenguv diferent de l'istess sit.",
        "viewsource": "Còdas surgent",
-       "protectedpagetext": "Cula pagina chi l'è stata blucà per impedinn la mudifica.",
-       "viewsourcetext": "L'è pussibil vèd e cupià el codes surgent de cula pagina chí:",
-       "editinginterface": "'''Ocio''': Te see adree a mudifegà una pàgina che la se dröva per generà 'l test de l'interfacia del prugrama. Qualsìa mudìfega fada la cambierà l'interfacia de tüt i druvadur. Se te gh'hee intenzión de fà una tradüzión, per piasì cunsiderà la pussibilità de druvà [//translatewiki.net/wiki/Main_Page?setlang=lmo translatewiki.net], 'l pruget de lucalizazión de MediaWiki.",
+       "viewsource-title": "Còdas surgent per $1",
+       "actionthrottled": "Asiù ritardàda",
+       "protectedpagetext": "Chela pagina chi l'è stata blucàda per impedinn la mudifica o altre azion.",
+       "viewsourcetext": "L'è pussibil vèd e cupià el codes surgent de chela pagina chí:",
+       "editinginterface": "'''Ocio''': Te see adree a mudifegà una pàgina che la se dröva per generà 'l test de l'interfacia del prugrama. Ogna mudìfega fada la cambierà l'interfacia de tüt i druvadur. Se te gh'hee intenzión de fà una tradüzión, per piasì cunsiderà la pussibilità de druvà [//translatewiki.net/ translatewiki.net], 'l pruget de lucalizazión de MediaWiki.",
+       "namespaceprotected": "Te g'hét mìa 'l permès nesesàre per mudificà le pàgine del namespace <strong>$1</strong>.",
+       "mypreferencesprotected": "Te g'hét mìa i permès nesesàre per mudificà le tò preferènse",
        "ns-specialprotected": "I paginn special i pören mía vess mudifegaa",
-       "logouttext": "'''Adess a sii descuness.'''\n\nA pudé andà inanz a druvà la {{SITENAME}} in manera anònima, o a pudé <span class='plainlinks'>[$1 cunètev anmò]</span> cun l'istess suranomm o cun un suranomm diferent.\nTegné cünt che certi paginn pödass che i seguiten a vedess tant 'me se a füdìssuv anmò cuness, fin quand che hii nò vudaa 'l ''cache'' del voster browser.",
+       "exception-nologin": "Te seet minga dent in del sistema",
+       "virus-scanfailed": "scansiù falìda (còdes $1)",
+       "logouttext": "'''Ades te sét scolegàt.'''\n\nOcio che 'na quach pàgina la te pödarès vègner fò compàgn che se te g'hèset mìa fat el log-out enfìna a che te snètet mìa fò la cache del tò browser.",
+       "welcomeuser": "Benvegnüü\\Benriàt, $1",
+       "welcomecreation-msg": "El to cünt l'è staa pruntaa. Desmenteghet mía de persunalizà i to [[Special:Preferences|preferenz de {{SITENAME}}]].",
        "yourname": "El to suranóm:",
+       "userlogin-yourname": "Nom del ütènt",
+       "userlogin-yourname-ph": "Mèt dét el tò nòm de ütènt",
+       "createacct-another-username-ph": "Mèt dét el nòm de ütènt",
        "yourpassword": "Parola d'urdin",
-       "yourpasswordagain": "Mett dent ammò la parola d'urdin",
-       "remembermypassword": "Regordass la mè parola d'urdin (for a maximum of $1 {{PLURAL:$1|day|days}})",
+       "userlogin-yourpassword": "Password",
+       "userlogin-yourpassword-ph": "Mèt dét la tò password",
+       "createacct-yourpassword-ph": "Mèt dét la password",
+       "yourpasswordagain": "Tùrna a scrìer la password",
+       "createacct-yourpasswordagain": "Conférma la password",
+       "createacct-yourpasswordagain-ph": "Tùrna a mèter dét la password",
+       "remembermypassword": "Regordass la mé password (per mìa de piö de {{PLURAL:$1|dé|dé}})",
+       "userlogin-remembermypassword": "Tègnem colegàt",
+       "userlogin-signwithsecure": "Dòpra 'na conesiù sigüra",
+       "yourdomainname": "Specificà 'l domini",
+       "password-change-forbidden": "Te pödet mìa cambià password sö chèsta wiki",
+       "externaldberror": "Gh'è 'n erùr söl server de autenticasiù estèrno o sedenò se g'ha mìa le autorizasiù nesesàre per agiurnà i dati de registrasiù estèrni.",
        "login": "Va dent",
        "nav-login-createaccount": "Vena denter / Crea un cünt",
        "loginprompt": "Par cunett a {{SITENAME}}, a duvii abilitá i galet.",
        "logout": "Va fö",
        "userlogout": "Và fö",
        "notloggedin": "Te seet minga dent in del sistema",
+       "userlogin-noaccount": "Sét gnemò registràt?",
+       "userlogin-joinproject": "Regìstret sö {{SITENAME}}",
        "nologin": "Gh'avii anmò da registrav? $1.",
        "nologinlink": "Creé un cünt!",
        "createaccount": "Creá un cünt",
        "gotaccount": "Gh'hee-t giamò un cünt? '''$1'''.",
        "gotaccountlink": "Va dent in del sistema",
-       "createaccountmail": "per indirizz e-mail",
+       "userlogin-resetlink": "Sét desmentegàt i tò dati de autenticasiù?",
+       "userlogin-resetpassword-link": "Sét desmentegàt la tò password?",
+       "userlogin-helplink2": "G'hét bezògn de 'na mà per autenticàt?",
+       "userlogin-loggedin": "Te sét zabèla autenticàt come {{GENDER:$1|$1}}.\nDòpra el mòdulo ché sóta per turnà a autenticàt come 'n óter ütènt.",
+       "userlogin-createanother": "Créa 'n ótra ütènsa",
+       "createacct-emailrequired": "Indirìs e-mail",
+       "createacct-emailoptional": "Indirìs e-mail (upsiunàl)",
+       "createacct-email-ph": "Mét dét el tò indiris e-mail",
+       "createacct-another-email-ph": "Mét dét l'indirìs e-mail",
+       "createaccountmail": "Dòpra 'na password a càzo temporànea e màndela a l'indirìs e-mail specificàt",
+       "createacct-realname": "Nòm véro (upsiunàl)",
+       "createaccountreason": "Mutìf:",
+       "createacct-reason": "Mutìf:",
+       "createacct-reason-ph": "Che fòza che sét dré a creà 'n ótra ütènsa?",
+       "createacct-captcha": "Contròl de sigürèsa",
+       "createacct-imgcaptcha-ph": "Mèt dét el tèst che te èdet ché sura",
+       "createacct-submit": "Créa la tò ütènsa",
+       "createacct-another-submit": "Créa 'n ótra ütènsa",
+       "createacct-benefit-heading": "{{SITENAME}} la crès gràsie a le persùne compagn de té.",
+       "createacct-benefit-body1": "{{PLURAL:$1|cambiamènt|cambiamèncc}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|artìcol|artìcoi}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|contribüdur recènt|contribüdur recèncc}}",
        "badretype": "I password che t'hee miss a hinn diferent.",
-       "userexists": "El nom de duvrat che t'hee miss dent a l'è giamò dupraa.\nPer piasè, scerniss un alter suranom.",
+       "userexists": "El nom de duvrat che t'hee miss dent a l'è giamò dupraa.\nPer piasè, scerniss un alter nom.",
        "loginerror": "Erur in de l'andà dent in del sistema.",
+       "createacct-error": "Erùr endèl creà l'ütènsa",
        "createaccounterror": "Se pö minga creà el cünt: $1",
        "nocookiesnew": "El cünt a l'è staa creaa, ma t'hee minga pudüü andà dent in del sistema.\n{{SITENAME}} al dupra i cookies per fà andà i duvrat in del sistema.\nTì te gh'hee i cookies disabilitaa.\nPer piasè, abilita i cookies e pröa anmò a andà dent cunt el tò nom e la password.",
-       "noname": "Vüü avii mía specificaa un nomm d'üsüari valévul.",
-       "loginsuccesstitle": "La cunessiun l'è scumenzada cun sücess.",
-       "loginsuccess": "Al é connectaa a {{SITENAME}} compagn \"$1\".",
+       "nocookieslogin": "{{SITENAME}} el dòpra i cookies per l'operasiù de log-in dei ütèncc. I tò cookies envéce i è dizativàcc. Atìvei e pröa tùrna.",
+       "nocookiesfornew": "L'ütènsa l'è mìa stàda creàda, perchè l'è mìa stat pusìbol confermà la sò fónt. Dà 'n öciàda de ìga i cookies atìf, tùrna a cargà chèsta pàgina e pröa amò m'na ólta.",
+       "noname": "Te g'hét mìa specificàt en nòm de ütènt bù.",
+       "loginsuccesstitle": "Login efetuàt.",
+       "loginsuccess": "<strong>Adès te sét cunitìt al server de {{SITENAME}} col nòm ütènt de \"$1\".</strong>",
        "nosuchuser": "A gh'è nissün druvat cun 'l nom ''$1''. <br />\nI suranomm i henn sensibil a i leter majùscul.<br />\nCuntrola 'l nom che t'hee metüü denter o [[Special:UserLogin/signup|crea un cünt növ]].",
        "nosuchusershort": "Ghe n'è mia d'ütent cun el nom de \"$1\". Ch'el cuntrola se l'ha scrivüü giüst.",
        "nouserspecified": "Te gh'heet da specificà un nom del druvatt.",
+       "login-userblocked": "Chèsta ütènsa l'è blocàda. La conesiù l'è mìa cunsentìda.",
        "wrongpassword": "La ciav che t'hee metüü denter l'è nò giüsta. Pröva turna per piasè.",
        "wrongpasswordempty": "T'hee no metüü denter la parola ciav. Pröva turna per piasè.",
-       "mailmypassword": "Spedissem una password növa per e-mail",
+       "password-name-match": "La tò password la g'ha de éser diferènta del tò nòm de ütènt",
+       "mailmypassword": "Tùrna a defenéser la password",
        "passwordremindertext": "Un quajdün (prubabilment ti, cun l'indiriz IP $1) l'ha ciamaa da mandagh 'na ciav növa per andà denter int 'l sistema de {{SITENAME}} ($4).\nLa ciav per 'l druvadur \"$2\" adess l'è \"$3\".\nSariss mej andà denter int 'l sit almanch una völta prima de cambià la ciav.\nLa to ciav tempuranea la scaderà da chì a {{PLURAL:$5|un dì|$5 dì}}.\n\nSe te nò staa ti a ciamà 'sta ciav chì, o magara t'hee truaa la ciav vegia e te vör pü cambiala, te pör ignurà 'stu messagg chì e 'ndà inanz a druà la ciav vegia.",
+       "noemail": "Gh'è registràt nisü indirìs e-mail per l'ütènt \"$1\".",
+       "noemailcreate": "Bezògna fornéser en indirìs e-mail bù",
        "passwordsent": "Una parola ciav bele növa l'è staa spedii a l'indiriz e-mail registra da l'ütent \"$1\".\nPer piasè, ve drent anmò dop che te l'ricevüü.",
        "blocked-mailpassword": "'L to indirizz IP l'è blucaa, e per quela resón lì te pö mía druvà la funzion de recüper de la password.",
+       "mailerror": "Erùr endel mandà la e-mail: $1",
        "emailauthenticated": "'L tò indirizz e-mail l'è staa verificaa 'l $2 ai $3.",
-       "emailnotauthenticated": "Ul tò adrèss da pòsta letronica l è mia staa gnamò verificaa. Nissün mesacc al saraa mandaa par i servizzi che segütan.",
+       "emailnotauthenticated": "El tò indirìs e-mail l'è gnemò stat confermàt. Nesöna e-mail la sarà mandàda per le funsiù elencàde ché sota.",
        "emailconfirmlink": "Cunferma 'l to indirizz e-mail",
-       "accountcreated": "Cunt bell-e-cread",
-       "accountcreatedtext": "'L cünt del druvat $1 l'è bele pruntaa.",
+       "cannotchangeemail": "I indirìs e-mail i pöl mìa éser cambiàcc en chèsta wiki.",
+       "emaildisabled": "Chèsto sit el pöl mìa mandà vià le e-mail.",
+       "accountcreated": "Ütènsa creàda",
+       "accountcreatedtext": "Ghè stat creàt l'ütènsa per [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|msg]]).",
+       "createaccount-title": "Creasiù de 'n ütènsa a {{SITENAME}}",
+       "login-abort-generic": "La tò autenticasiù l'è falìda - Operasiù anulàda",
        "loginlanguagelabel": "Lengua: $1",
+       "pt-login": "Va dent",
+       "pt-login-button": "Va dent",
+       "pt-createaccount": "Creá un cünt",
+       "pt-userlogout": "Va fö (logout)",
        "changepassword": "Mudifega la paròla d'urdin",
-       "oldpassword": "Paròla d'urdin végja:",
-       "newpassword": "Paròla d'urdin növa:",
-       "retypenew": "Scriv ancamò la paròla d'urdin növa:",
+       "resetpass_announce": "Per completà la conesiù, te g'hét de definì 'na password nöa.",
+       "resetpass_header": "Càmbia la password de l'ütènsa",
+       "oldpassword": "Password vècia:",
+       "newpassword": "Password nöa:",
+       "retypenew": "Tùrna a mèter dét la password nöa:",
+       "resetpass_submit": "Defenés la password e regìstret (fà 'l log-in)",
+       "changepassword-success": "La tò password l'è stàda cambiàda sènsa erùr!",
+       "changepassword-throttled": "Te g'hét fat tròp tacc tentatìf de cunitìt en poch tép, adès te g'hét de spetà $1 per püdì turnà a pröà.",
+       "resetpass_forbidden": "Te pödet mìa cambià le password",
+       "resetpass-no-info": "Te g'hét de éser cunitìt per acéder diretamènt a la pàgina",
+       "resetpass-submit-loggedin": "Càmbia la password",
+       "resetpass-submit-cancel": "Scancèla l'operasiù",
+       "passwordreset": "Tùrna a defenéser la password",
+       "passwordreset-legend": "Tùrna a defenéser la password",
+       "passwordreset-disabled": "La ridefinisiù de la password l'è mìa atìva sö chèsta wiki",
+       "passwordreset-emaildisabled": "Le funsiù de pòsta eletrònica i è stàde disativàde sö chèsta wiki.",
+       "passwordreset-username": "Nòm de ütènt",
+       "passwordreset-domain": "Domini:",
+       "passwordreset-email": "Indirìs e-mail:",
+       "changeemail-none": "(nisü)",
+       "changeemail-password": "La password sö {{SITENAME}}:",
+       "changeemail-submit": "Càmbia l'indirìs e-mail",
+       "changeemail-cancel": "Scancèla l'operasiù",
+       "resettokens": "Redefenés i tokens",
+       "resettokens-legend": "Redefenés i tokens",
+       "resettokens-tokens": "Token:",
+       "resettokens-token-label": "$1 (valùr de adès: $2)",
+       "resettokens-done": "Tokens redefinìcc.",
+       "resettokens-resetbutton": "Redefenés i tokens selesiunàcc",
        "bold_sample": "Test in grasset",
        "bold_tip": "Test in grasset",
        "italic_sample": "Test in cursiv",
        "showpreview": "Famm vedè prima",
        "showdiff": "Famm vedè i cambiament",
        "anoneditwarning": "Tì te set minga entraa. In de la crunulugia de la pagina se vedarà el tò IP.",
+       "missingcommenttext": "Mèt dét en comènt ché sota",
        "summary-preview": "Pröva de l'uget:",
+       "blockedtitle": "Ütènsa blocàda",
        "blockedtext": "'''El to nom del druvadur o el to indirizz IP l'è stat blucaa.'''\n\nEl bloch l'è stat fat da $1.\nEl mutiv per el bloch l'è: ''$2''\n\n* Principi del bloch: $8\n* Scadenza del bloch: $6\n* Blucaa: $7\n\nSe a vurii, a pudii cuntatà $1 o un olter [[{{MediaWiki:Grouppage-sysop}}|aministradur]] per discüt el bloch.\n\nFeegh a ment che la funzion 'Manda un email a quel druvadur chì' l'è mia ativa se avii mia registraa un indirizz e-mail valid ind i voster [[Special:Preferences|preferenz]] o se l'üsagg de 'sta funzion l' è stat blucaa.\n\nL'indirizz IP curent l'è $3, el nümer ID del bloch l'è #$5.\nFee el piasè d'inclüd tüt i detaj chì de sura in qualsessìa dumanda che a decidii de fà.",
-       "accmailtext": "La parola d'urdin per \"$1\" l'è stada mandada a $2.",
-       "newarticle": "(Növ)",
+       "blockednoreason": "Gh'è stat dat nisü mutìf",
+       "loginreqtitle": "Autenticasiù nesesària",
+       "loginreqlink": "autenticàs (fà 'l log-in)",
+       "loginreqpagetext": "Per véder le otre pàgine ghe öl $1.",
+       "accmailtitle": "Password mandàda",
+       "accmailtext": "La password per [[User talk:$1|$1]] l'è stada mandada a $2. Chèsta password la pöl véser cambiàda per [[Special:ChangePassword|cambià la password]] apéna dòpo che te g'harét fat el log-in.",
+       "newarticle": "(Nöf)",
        "newarticletext": "Te seet andaa adree a un ligam a una pagina che la esista gnamò.\nPer creà la pagina, a l'è assee che te tachet a scriv in del box desota (varda la [$1 pagina de vüt] per savèn püssee).\nSe te seet chì per erur, schiscia \"indree\" in sül tò browser.",
-       "anontalkpagetext": "''Questa chí a l'é la pagina da ciciarada d'un druvadur che l'ha nonanmò registraa un cünt, o che 'l le dröva mia.\nPer 'sta reson chí, el pò vess identificaa dumà cunt el sò indirizz nümereg de IP.\n'Stu indirizz IP el pö vess druvaa da püssee d'un druvadur. Se te seet un druvadur anònim e ve someja che un quaj messagg ch'al ga par ch'al gh'a nagòt à vidé con lu, ch'al prœuva a [[Special:UserLogin|creà el sò cunt]].''",
+       "anontalkpagetext": "''Questa chí a l'é la pagina da ciciarada d'un druvadur che l'ha nonanmò registraa un cünt, o che 'l le dröva mia.\nPer 'sta reson chí, el pò vess identificaa dumà cunt el sò indirizz nümereg de IP.\n'Stu indirizz IP el pö vess druvaa da püssee d'un druvadur. Se te seet un druvadur anònim e te someja che un quaj messagg al ga nagòt à vidé con de ti, prœuva a [[Special:UserLogin/signup|creà 'n ütènsa nöa]] o [[Special:UserLogin|regìstret con chèla che te g'hét zà]] inscì de minga vess scunfundüü anmò con quaj alter ütent anomim.''",
        "noarticletext": "Per 'l mument quela pagina chì l'è vöja. Te pòdet [[Special:Search/{{PAGENAME}}|cercà quel articul chì]] int i alter paginn, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cercà int i register imparentaa], o sedenò [{{fullurl:{{FULLPAGENAME}}|action=edit}} mudifichè 'sta pagina chì adess-adess]</span>.",
+       "noarticletext-nopermission": "Per 'l mument quela pagina chì l'è vöja. Te pòdet [[Special:Search/{{PAGENAME}}|cercà quel articul chì]] int i alter paginn, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cercà int i register imparentaa], ma te gh'ét nò i permiss per creà-la</span>.",
+       "userpage-userdoesnotexist": "L'ütènsa \"$1\" l'è mìa registràda. Arda bé semài che te ölet creàla o mudificàa adilbù.",
+       "userpage-userdoesnotexist-view": "L'ütènsa \"$1\" l'è mìa registràda.",
+       "blocked-notice-logextract": "Per el mument quel druvadur chì l'è blucaa. L'ültima entrada int el register di bloch l'è repurtada chì de suta per riferiment:",
        "clearyourcache": "'''Nòta:''' dòpu che avii salvaa, pudaría véss neçessari de scancelá la memòria \"cache\" dal vòst prugráma də navigazziún in reet par vidé i mudifich faa. '''Mozilla / Firefox / Safari:''' tegní schiscjaa al butún ''Shift'' intaant che sə clica ''Reload'', upüür schiscjá ''Ctrl-Shift-R'' (''Cmd-Shift-R'' sül Apple Mac); '''IE:''' schiscjá ''Ctrl'' intaant che sə clica ''Refresh'', upüür schiscjá ''Ctrl-F5''; '''Konqueror:''': semplicemeent clicá al butún ''Reload'', upüür schiscjá ''F5''; '''Opera''' i üteent pudarían vech büsögn da scancelá cumpletameent la memòria \"cache\" in ''Tools&rarr;Preferences''.",
-       "previewnote": "''''''Atenziun'''! Questa pagina la serviss dumà de vardà. I cambiament hinn minga staa salvaa.'''",
+       "updated": "(Agiurnàt)",
+       "note": "<strong>Ocio:</strong>",
+       "previewnote": "<strong>Atenziun! Questa pagina la serviss dumà de vardà.</strong> I cambiament hinn gnamò staa salvaa.'''",
+       "continue-editing": "Và 'ndel area de mudifica",
        "editing": "Mudifega de $1",
+       "creating": "Creasiù de $1",
        "editingsection": "Mudifega de $1 (sezión)",
        "editingcomment": "Adree a mudifegà $1 (sezión növa)",
+       "editconflict": "Cunflit de edisiù sö $1",
+       "explainconflict": "'N óter ütènt el g'ha salvàt 'na versiù nöa de l'articol entàt che te sìet dré a fà le tò mudìfiche.\nL'area de mudìfica de sura la g'ha dét el test de la pàgina che gh'è on-line adès, isé come che l'è stat agiurnàt de l'óter ütènt.\nLa versiù co le tò mudìfiche envéce te la tróet endèl'area de mudìfica de sòta.\nSemài che te ölarèset confermàle, te g'hét de riportà le tò mudìfiche endèl tèst de l'area de sura.\nA schisà el butù '{{int:savearticle}}', se salvarà '''apéna''' el test che gh'è dét endèl'àrea de mudìfica de sura.",
        "yourtext": "El tò test",
+       "storedversion": "La versiù en memória",
        "yourdiff": "Diferenz",
        "copyrightwarning": "Ten per piasè present che tüt i cuntribüzión a {{SITENAME}} se cunsideren daa sota una licenza $2 (varda $1 per savèn püssee).\nSe te vöret minga che i tò test i poden vess mudifegaa e redistribüii d'una persona qualsessia senza nissüna limitazión, mandei minga a {{SITENAME}}<br />\nCunt el test che te mandet tì te deciaret anca che, sota la tò respunsabilità, che el test te l'hee scrivüü depertì 'me uriginal, o pür che l'è una cobia d'una funt de dumini pübligh o un'altra funt libera in manera cumpagna.<br />\n'''MANDA MINGA DEL MATERIAL CHE L'E' CUERT D'UN DIRIT D'AUTUR SENZA UTURIZAZIUN'''",
-       "protectedpagewarning": "'''Ocio: quela pagina chì l'è stada blucaa in manéra che dumá i dupradur cunt i privilegg de sysop i pören mudificàla.'''",
+       "protectedpagewarning": "'''Ocio: quela pagina chì l'è stada blucaa in manéra che dumá i dupradur cunt i privilegg de sysop i pören mudificàla.''' L'öltem element del register l'è riportàt ché sota per dà 'n riferimènt:",
        "semiprotectedpagewarning": "'''Nota:''' Quela pagina chì l'è stada blucada in manera che dumà i druvadur registraa i pören mudifegàla.\nL'ültima vus del register l'è mustrada chì de suta per riferiment:",
        "templatesused": "{{PLURAL:$1|Mudel|Mudej}} dopraa in quela pagina chì:",
        "templatesusedpreview": "{{PLURAL:$1|Mudel|Mudej}} dopraa in quela pröva chì:",
+       "templatesusedsection": "{{PLURAL:$1|Mudel|Mudej}} dopraa in quela sezion chì:",
        "template-protected": "(prutegiüü)",
        "template-semiprotected": "(semi-prutegiüü)",
        "hiddencategories": "Quela pagina chì la fa part de {{PLURAL:$1|una categuria|$1 categurij}} scundüü:",
+       "nocreate-loggedin": "Te g'hét mìa 'l permès per creà pàgine nöe",
+       "sectioneditnotsupported-title": "Mudìfica dele sesiù mìa suportàda",
+       "sectioneditnotsupported-text": "La mudìfica de le sesiù l'è mìa suportàda en chèsta pàgina.",
+       "permissionserrors": "Erur de permès",
+       "permissionserrorstext": "Te gh'hee minga i permiss per fall, per {{PLURAL:$1|quel motiv chì |quij motiv chì}}:",
        "permissionserrorstext-withaction": "Te gh'hee minga i permiss per $2, per {{PLURAL:$1|quela resón chì |quij resón chì}}:",
        "recreate-moveddeleted-warn": "'''Ocio: te see adree a creà turna una pagina che l'eva giamò stada scancelada.'''\n\nCuntrulee se l'è propi el cas de cuntinuà a mudifegà 'sta pagina chì.\nPer cumudità, la lista di scancelament e di San Martìn l'è ripurtada chi de suta:",
+       "log-fulllog": "Arda el log compléto",
+       "edit-hook-aborted": "L'hook el g'ha anulàt la mudìfica e 'l g'ha dat nesöna spiegasiù.",
+       "edit-gone-missing": "Se pöl mìa agiurnà la pàgina.\nPar che la sàpe stàda scancelàda.",
+       "edit-conflict": "Cunflit de edisiù",
+       "edit-no-change": "La modifica l'è stàda ignuràda perchè gh'è mìa stat fat cambiamèncc al test.",
+       "postedit-confirmation-created": "La pàgina l'è stàda creàda.",
+       "postedit-confirmation-restored": "La pàgina l'è stàda ripristinàda.",
+       "postedit-confirmation-saved": "La tò mudìfica l'è stàda memurizàda.",
+       "edit-already-exists": "Se pöl mìa creà 'na pàgina nöa.\nLa gh'è zamò.",
+       "defaultmessagetext": "Test standard",
+       "content-model-wikitext": "wikitest",
+       "content-model-text": "test normal",
+       "content-model-javascript": "JavaScript",
+       "content-model-css": "CSS",
        "undo-summary": "Scancelada la mudifega $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|Ciciarada]])",
+       "cantcreateaccounttitle": "Impusìbol creà 'n ütènt",
+       "cantcreateaccount-text": "La creasiù de ütènse de part de chèsto indirìs IP (<strong>$1</strong>) l'è stàda blocàda de l'ütènt [[User:$3|$3]]. El mutìf specificàt de $3 l'è <em>$2</em>",
+       "cantcreateaccount-range-text": "La creasiù de ütènse de part de indirìs IP endèl interval '''$1''', del qual el fà part apò a 'l tò ('''$4'''), l'è stàda blocàda de [[User:$3|$3]].\n\nEl mutìf specificàt de $3 l'è ''$2''.",
        "viewpagelogs": "Varda i register de quela pagina chì",
+       "nohistory": "El sistéma el rìa mìa a catà la crunulugìa de le versiù de chèsta pàgina.",
+       "currentrev": "Versiù de adès",
        "currentrev-asof": "Versión curenta di $1",
        "revisionasof": "Revisión $1",
+       "revision-info": "Versiù del $4 a le $5 de $2",
        "previousrevision": "←Versión püssee vegia",
        "nextrevision": "Revisión püssee növ →",
        "currentrevisionlink": "Varda la revisión curenta",
        "cur": "Cur",
        "next": "pròssim",
        "last": "ültima",
+       "page_first": "prìma",
+       "page_last": "öltema",
        "histlegend": "Selezion di diferenz: seleziuná i balitt di version de cumpará e pö schisciá ''enter'' upüra al buton in scima ala tabèlina.<br />\nSpiegazzion di símbul: (cur) = diferenza cun la version curenta, (ültima) = diferenza cun l'ültima version, M = mudifega piscinína.",
        "history-fieldset-title": "Varda la cronolugia",
+       "history-show-deleted": "Apéna chèi scancelàcc",
        "histfirst": "Püssee vegg",
        "histlast": "Püssee növ",
+       "historysize": "({{PLURAL:$1|1 byte|$1 bytes}})",
+       "historyempty": "(öda)",
+       "history-feed-title": "Crunulugìa",
+       "history-feed-description": "Crunulogia de la pàgina sö la wiki",
+       "history-feed-item-nocomment": "$1 el $2",
+       "history-feed-empty": "La pàgina che te sét dré a sercà la gh'è mìa; pöl das che la sàpe stàda scancelàda o spostàda. Arda bé co la [[Special:Search|pàgina de ricérca]] semài che gh'è dele pàgine nöe.",
+       "rev-deleted-comment": "(Ogèt de la mudìfica scancelàt)",
+       "rev-deleted-user": "(nòm de ütènt scancelàt)",
+       "rev-deleted-event": "(asiù del log scancelàda)",
+       "rev-deleted-user-contribs": "[nòm ütènt o indirìs IP scancelàt - mudìfica scundìda de la crunulugìa]",
        "rev-deleted-text-permission": "Questa version de la pagina l'è stada '''scancelada'''.\nPer infurmazion, varda ind el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} register di scancelament].",
        "rev-delundel": "fa vidè/scund",
+       "rev-showdeleted": "Fà ved",
+       "revisiondelete": "Scancèla o riprìstina versiù",
+       "revdelete-nooldid-title": "Versiù mìa specificàda",
+       "revdelete-no-file": "L'archivi specificàt l'ezìste mìa",
+       "revdelete-show-file-submit": "Sé",
+       "revdelete-hide-text": "Test de la versiù",
+       "revdelete-hide-image": "Scont el contenùto de l'archivi",
+       "revdelete-hide-name": "Scont l'asiù e 'l sò ogèt",
+       "revdelete-hide-comment": "Ogèt o mutìf de la mudìfica",
+       "revdelete-hide-user": "Nom o indirìs IP de l'autùr",
+       "revdelete-radio-same": "(càmbia mìa)",
+       "revdelete-radio-set": "Scond",
+       "revdelete-radio-unset": "Fà vèt",
+       "revdelete-log": "Mutìf:",
        "revdel-restore": "Cambia la visibilità",
+       "pagehist": "Crunulugia de la pagina",
+       "deletedhist": "Crunulugìa scancelàda",
+       "revdelete-otherreason": "Alter resón/spiegazión",
+       "revdelete-reasonotherlist": "Alter mutiv",
        "revdelete-edit-reasonlist": "Mudifega i mutiv del scancelament",
+       "mergehistory-submit": "Önés le versiù",
+       "mergehistory-reason": "Mutìf:",
+       "pagemerge-logentry": "el g'ha ünìt [[$1]] a [[$2]] (reviziù 'nfìna al $3)",
        "revertmerge": "Scancela i ünión",
        "history-title": "Cronolugia di mudifegh de \"$1\"",
        "lineno": "Riga $1:",
        "notextmatches": "La vus che t'hee ciamaa la gh'ha minga una curispundenza in del test di paginn.",
        "prevn": "precedent {{PLURAL:$1|$1}}",
        "nextn": "pròssim {{PLURAL:$1|$1}}",
+       "prevn-title": "{{PLURAL:$1|Rezültàt precedènt|$1 rezültàcc precedèncc}}",
+       "nextn-title": "Next $1 {{PLURAL:$1|result|results}}",
        "viewprevnext": "Vidé ($1 {{int:pipe-separator}} $2) ($3).",
        "searchmenu-new": "'''Trà in pee la pagina \"[[:$1]]\" ins quel sit chì!'''",
        "searchprofile-articles": "Paginn de cuntegnüü",
-       "searchprofile-project": "Paginn de jüt e de pruget",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Tüt",
        "searchprofile-advanced": "Avanzaa",
        "searchprofile-articles-tooltip": "Cerca in $1",
-       "searchprofile-project-tooltip": "Cerca in $1",
+       "searchprofile-images-tooltip": "Sérca l'archivi",
        "searchprofile-everything-tooltip": "Cerca depertüt (anca int i paginn de discüssion)",
        "searchprofile-advanced-tooltip": "Cerca int i namespace persunalizaa",
        "search-result-size": "$1 ({{PLURAL:$2|1 parola|$2 paroll}})",
+       "search-result-score": "Atinènsa: $1%",
        "search-redirect": "(redirezión $1)",
        "search-section": "(sessión $1)",
        "search-suggest": "Vurivet dì: $1",
        "search-interwiki-caption": "Pruget fredej",
-       "search-interwiki-default": "$1 resültaa",
+       "search-interwiki-default": "Rezültàcc de $1:",
        "search-interwiki-more": "(püssee)",
+       "search-relatedarticle": "Rezültàcc corelàcc",
+       "searcheverything-enable": "Sérca en töcc i namespaces",
+       "searchrelated": "Corelàcc",
+       "searchall": "tücc",
        "powersearch-legend": "Recerca avanzada",
        "powersearch-ns": "Cerca in di namespace:",
-       "powersearch-redir": "Lista i redirezión",
+       "powersearch-togglelabel": "Selesiùna:",
+       "powersearch-toggleall": "Töcc",
+       "powersearch-togglenone": "Nisü",
        "preferences": "Preferenz",
-       "mypreferences": "i mè preferenz",
+       "mypreferences": "Preferenz",
        "prefs-edits": "Quantità de mudifegh faa:",
        "prefs-skin": "Aspett de l'interfacia",
-       "datedefault": "Nissüna preferenza",
-       "prefs-personal": "Carateristich dal dupradur",
+       "skin-preview": "Anteprìma",
+       "datedefault": "Nesöna preferènsa",
+       "prefs-labs": "Funsiù sperimentài",
+       "prefs-user-pages": "Pàgine ütènt",
+       "prefs-personal": "Prufil ütènt",
        "prefs-rc": "Cambiament recent",
        "prefs-watchlist": "Paginn tegnüü d'ögg",
        "prefs-watchlist-days": "Nümer de dì da mustrà ind i paginn da tegn d'ögg:",
+       "prefs-watchlist-days-max": "Màsimo $1 {{PLURAL:$1|dé|dé}}",
        "prefs-watchlist-edits": "Nümer de mudifegh da mustrà cunt i fünzión avanzaa:",
        "prefs-misc": "Ólter",
-       "prefs-rendering": "Aparenza",
+       "prefs-resetpass": "Càmbia la password",
+       "prefs-changeemail": "Càmbia l'indirìs e-mail",
+       "prefs-setemail": "Defenés l'indirìs e-mail",
+       "prefs-email": "Upsiù e-mail",
+       "prefs-rendering": "Aspèt",
        "saveprefs": "Tegn i mudifech",
-       "restoreprefs": "Ristabiliss i impustazión de default",
-       "prefs-editing": "Mudifich",
+       "restoreprefs": "Ristabiliss i impustazión de default (en töte le sesiù)",
+       "prefs-editing": "Cazèla de mudìfica",
        "rows": "Riich:",
        "columns": "Culònn:",
        "searchresultshead": "Cerca",
+       "stub-threshold-disabled": "Dezativàt",
        "recentchangescount": "Nümer de mudifegh da mustrà per ''default'':",
        "savedprefs": "I preferenz hinn stai salvaa.",
-       "timezonelegend": "Lucalitaa",
-       "localtime": "Urari lucaal",
-       "servertime": "Urari dal sèrver",
-       "guesstimezone": "Catá l urari dal sèrver",
+       "timezonelegend": "Füs oràre:",
+       "localtime": "Ura local:",
+       "timezoneuseserverdefault": "Dòpra l'ura predefinìda de la wiki ($1)",
+       "timezoneuseoffset": "Oter (specificà la diferènsa)",
+       "servertime": "Ura dal sèrver",
+       "guesstimezone": "Dòpra l'ura del browser",
+       "timezoneregion-africa": "Africa",
+       "timezoneregion-america": "America",
+       "timezoneregion-antarctica": "Antartich",
+       "timezoneregion-arctic": "Artich",
+       "timezoneregion-asia": "Asia",
+       "timezoneregion-atlantic": "Oceano Atlantich",
+       "timezoneregion-australia": "Australia",
+       "timezoneregion-europe": "Europa",
+       "timezoneregion-indian": "Ocean Indian",
+       "timezoneregion-pacific": "Ocean Pacifich",
        "allowemail": "Permètt ai altar üteent də cuntatamm par email",
-       "prefs-searchoptions": "Upzión de ricerca",
-       "defaultns": "Tröva sempar in di caamp:",
+       "prefs-searchoptions": "Ricerca",
+       "prefs-namespaces": "Namespaces",
+       "defaultns": "Sedenò, serca en chèsti namespaces:",
+       "default": "predefinit",
        "prefs-files": "Archivi",
+       "prefs-custom-css": "CSS personalizàt",
+       "prefs-custom-js": "JavaScript personalizat",
+       "prefs-common-css-js": "CSS/JavaScript cundivis per töte le skin:",
        "prefs-emailconfirm-label": "Cunferma de l'e-mail:",
        "youremail": "E-mail",
-       "username": "Nom dal dovrée",
-       "uid": "ID del druvadur:",
-       "prefs-memberingroups": "Mémber {{PLURAL:$1|del grüp|di grüp}}:",
-       "prefs-registration": "Registraa dal:",
+       "username": "{{GENDER:$1|Nom ütent}}:",
+       "prefs-memberingroups": "{{GENDER:$2|Mèmber}} {{PLURAL:$1|del grupo|dei grupi}}:",
+       "prefs-registration": "Data de registrasiù:",
        "yourrealname": "Nomm:",
        "yourlanguage": "Lengua:",
+       "yourvariant": "Variant de la lèngua:",
+       "prefs-help-variant": "La variant o grafia co la qual te preferéset véder le pàgine de la wiki.",
        "yournick": "Suranomm:",
        "prefs-help-signature": "I cument ind i paginn de discüssion i gh'han de vess firmaa cun \"<nowiki>~~~~</nowiki>\" che 'l sarà pö cunvertì int la tua firma cun tacada la data e l'ura.",
        "yourgender": "Géner:",
-       "gender-unknown": "Mía specifegaa",
+       "gender-unknown": "Preferissi specifegaa nò",
        "gender-male": "Mas'c",
        "gender-female": "Femena",
        "prefs-help-gender": "Upziunal: druvaa per adatà i messagg del software a segónda del gener del druvadur. Questa infurmazion chì la sarà püblica.",
        "email": "Indirizz de pòsta elettrònica.",
        "prefs-help-email": "L'e-mail a l'è mia obligatòri, però al permet da mandàv una ciav noeva in cas che ve la desmenteghé. A podé apó scernì da lassà entrà i alter dovrat in contat con violter senza da busogn da svelà la vosta identità.",
+       "prefs-help-email-required": "L'indirìs e-mail l'è ubligatóre",
        "prefs-info": "Infurmazion de bas",
        "prefs-i18n": "Internaziunalizazión",
-       "prefs-advancedrendering": "Fünzión avanzaa",
+       "prefs-signature": "Fìrma",
+       "prefs-dateformat": "Furmàt de la data",
+       "prefs-timeoffset": "Ure de diferensa",
+       "prefs-advancedediting": "Upsiù generài",
+       "prefs-editor": "Editur",
+       "prefs-preview": "Anteprìma",
+       "prefs-advancedrc": "Upsiù avansàde",
+       "prefs-advancedrendering": "Upsiù avansàde",
+       "prefs-advancedsearchoptions": "Upsiù avansàde",
+       "prefs-advancedwatchlist": "Upsiù avansàde",
+       "prefs-displayrc": "Upsiù de visualizasiù",
+       "prefs-displaywatchlist": "Upsiù de visualizasiù",
+       "prefs-tokenwatchlist": "Token",
+       "prefs-diffs": "Diferènse",
+       "prefs-help-prefershttps": "Chèsta preferènsa la g'harà efèt la pròsima ólta che te se autèntichet.",
+       "email-address-validity-valid": "L'indirìs e-mail el par bù",
+       "email-address-validity-invalid": "Mèt dét en indirìs e-mail che funsiùna",
        "userrights": "Gestión di dirit di druvadur",
        "userrights-lookup-user": "Gestion di grüp di druvaduu",
        "userrights-user-editname": "Butée dent un nom da dovrat",
        "group-user": "Druvadur",
        "group-autoconfirmed": "Druvadur che i s'henn cunvalidaa deperlur",
        "group-sysop": "Aministradur",
-       "group-user-member": "Dovratt",
+       "group-all": "(töcc)",
+       "group-user-member": "{{GENDER:$1|ütènt}}",
+       "group-autoconfirmed-member": "{{GENDER:$1|ütènt autoconvalidat|ütènta autoconvalidada|ütent/a autoconvalidat/da}}",
+       "group-bot-member": "{{GENDER:$1|bot}}",
+       "group-sysop-member": "{{GENDER:$1|amministradur|amministradura|amministradur/ra}}",
        "grouppage-user": "{{ns:project}}:Druvadur",
+       "grouppage-autoconfirmed": "{{ns:project}}:Ütèncc autoconvalidàcc",
+       "grouppage-bot": "{{ns:project}}:Bots",
        "grouppage-sysop": "{{ns:project}}:Aministradur",
        "right-edit": "Edita pàgini",
        "right-createaccount": "Crea cünt de dovratt bej-e növ",
-       "newuserlogpage": "Rrgister di druvat növ",
+       "right-delete": "Scancelà pàgine",
+       "right-siteadmin": "Blocà e desblocà el database",
+       "newuserlogpage": "Register di ütent növ",
        "rightslog": "Dirit di druvat",
+       "action-read": "lèzer chèsta pàgina",
        "action-edit": "mudifega quela pagina chì",
+       "action-createpage": "creà pàgine",
+       "action-createtalk": "creà pàgine de discusiù",
+       "action-createaccount": "creà chèsta ütènsa",
+       "action-history": "ardà la crunulugìa de chèsta pàgina",
+       "action-minoredit": "segnà chèsta mudìfica come picinìna",
+       "action-move": "spostà chèsta pàgina",
+       "action-move-categorypages": "spostà le categurìe",
+       "action-movefile": "Spòsta chèsto archivi",
+       "action-upload": "Càrga sö chèsto archivi",
+       "action-reupload": "surascrìf chèsto archivi (che l'ezìste zà)",
+       "action-upload_by_url": "cargà chèsto archivi de 'n indirìs URL",
+       "action-writeapi": "doprà le API en scritüra",
+       "action-delete": "scancelà chèsta pàgina",
+       "action-deleterevision": "scancelà chèsta versiù",
+       "action-deletedhistory": "ardà la crunulugìa scancelàda de chèsta pàgina",
+       "action-browsearchive": "sercà pàgine scancelàde",
+       "action-undelete": "ripristinà chèsta pàgina",
+       "action-suppressrevision": "riéder e ripristinà le mudìfiche scundìde",
+       "action-suppressionlog": "éder chèsto regìster privàt",
+       "action-protect": "cambià i leèi de protesiù de chèsta pàgina",
+       "action-import": "emportà pàgine de le ótre wiki",
+       "action-importupload": "emportà pàgine col upload de archivi",
+       "action-patrol": "segnà le mudìfiche dei óter ütèncc come verificàde",
+       "action-autopatrol": "segnà le tò mudìfiche come verificàde",
+       "action-userrights": "cambià töcc i permès dei ütèncc",
+       "action-userrights-interwiki": "cambià i permès dei ütèncc de le ótre wiki",
+       "action-siteadmin": "blocà o sblocà el database",
+       "action-sendemail": "mànda e-mail",
+       "action-editmywatchlist": "cambià la lìsta dei tò oservàcc speciài",
+       "action-viewmywatchlist": "ardà la lìsta dei tò oservàcc speciài",
+       "action-viewmyprivateinfo": "ardà le tò informasiù personài",
+       "action-editmyprivateinfo": "cambià le tò informasiù personài",
        "nchanges": "$1 {{PLURAL:$1|mudifega|mudifegh}}",
+       "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|de l'öltima vìzita}}",
+       "enhancedrc-history": "crunulugìa",
        "recentchanges": "Cambiament recent",
        "recentchanges-legend": "Upzión ültem mudifegh",
        "recentchanges-summary": "In quela pagina chì a gh'è i cambiament püssee recent al cuntegnüü del sit.",
        "recentchanges-label-minor": "Quela chì l'è una mudifega piscinina.",
        "recentchanges-label-bot": "Quela mudifega chì l'ha fada un bot",
        "recentchanges-label-unpatrolled": "Quela mudifega chì a l'è stada mimga anmò verificada.",
-       "recentchanges-legend-newpage": "$1 - pagina növa",
+       "recentchanges-legend-newpage": "(arda apò [[Special:NewPages|la lìsta de le pàgine nöe]])",
        "rcnotefrom": "Chì de sota gh'è la lista di mudifegh de <b>$2</b> (fina a <b>$1</b>).",
-       "rclistfrom": "Fà vidè i cambiament növ a partì de $1",
+       "rclistfrom": "Fà vidè i cambiament növ a partì de $3 $2",
        "rcshowhideminor": "$1 i mudifegh piscinín",
+       "rcshowhideminor-show": "Fà vèd",
+       "rcshowhideminor-hide": "Scond",
        "rcshowhidebots": "$1 i bot",
+       "rcshowhidebots-show": "Fà ved",
+       "rcshowhidebots-hide": "Scond",
        "rcshowhideliu": "$1 i dupradur cunetüü",
+       "rcshowhideliu-show": "Fà ved",
+       "rcshowhideliu-hide": "Scond",
        "rcshowhideanons": "$1 i dupradur anònim",
+       "rcshowhideanons-show": "Fà ved",
+       "rcshowhideanons-hide": "Scond",
+       "rcshowhidepatr-show": "Fà ved",
+       "rcshowhidepatr-hide": "Scond",
        "rcshowhidemine": "$1 i mè mudifich",
+       "rcshowhidemine-show": "Fà ved",
+       "rcshowhidemine-hide": "Scond",
        "rclinks": "Fà vedé i ültim $1 cambiament in di ültim $2 dì<br />$3",
        "diff": "dif",
        "hist": "stòria",
        "minoreditletter": "m",
        "newpageletter": "N",
        "boteditletter": "b",
+       "rc_categories_any": "Töcc",
+       "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} dopo la mudìfica",
        "newsectionsummary": "/* $1 */ sezión növa",
-       "rc-enhanced-expand": "Varda i detali (al vör el JavaScript)",
+       "rc-enhanced-expand": "Fà ved i detali",
        "rc-enhanced-hide": "Scund i detali",
+       "rc-old-title": "creàda en urìgin come \"$1\"",
        "recentchangeslinked": "Cambiament culegaa",
        "recentchangeslinked-feed": "Cambiament culegaa",
        "recentchangeslinked-toolbox": "Cambiament culegaa",
        "recentchangeslinked-summary": "Questa chì a l'è una lista di paginn faa de poch temp ai paginn culigaa a quela specifegada (o a member d'una categuria specifegada).\nI paginn dent in [[Special:Watchlist|la lista ch'it ten-e sot euj]] i resten marcaa in \"grasset\"",
        "recentchangeslinked-page": "Nom de la pagina:",
        "recentchangeslinked-to": "Fà vidè dumà i mudifegh ai paginn culigaa a quela dada",
-       "upload": "Carga sü un file",
+       "upload": "Carga sü un archivi",
        "uploadbtn": "Carga sü",
        "uploadnologin": "Minga cuness",
+       "uploadnologintext": "Per cargà 'n archivi bezògna $1.",
        "uploadlogpage": "Log di file caregaa",
+       "filename": "Nom de l'archivi",
        "filedesc": "Sumari",
        "fileuploadsummary": "Sumari:",
        "ignorewarnings": "Ignora tücc i avertimeent",
        "largefileserver": "Chel archivi-chí al è püssee graant che ul serviduur al sía cunfigüraa da permett.",
+       "savefile": "Salva l'archivi",
        "uploadedimage": "l'ha cargaa \"[[$1]]\"",
        "sourcefilename": "Nomm da l'archivi surgeent:",
        "destfilename": "Nomm da l'archivi da destinazziun:",
        "imgfile": "archivi",
        "listfiles": "Listá i imàgin",
-       "listfiles_date": "Dada",
+       "listfiles_thumb": "Miniadüra",
+       "listfiles_date": "Data",
        "listfiles_name": "Nomm",
-       "listfiles_user": "Dovratt",
-       "filehist": "Storia de l'archivi",
-       "filehist-help": "Schiscia in sü un grüp data/ura per vidè el file cumè che'l se presentava in quel mument là",
+       "listfiles_user": "Ütènt",
+       "listfiles_size": "Dimensiù en byte",
+       "listfiles_description": "Descrisiù",
+       "listfiles_count": "Versiù",
+       "listfiles-latestversion": "Versiù de adès",
+       "listfiles-latestversion-yes": "Sé",
+       "listfiles-latestversion-no": "Nò",
+       "file-anchor-link": "Archivi",
+       "filehist": "Crunulugia de l'archivi",
+       "filehist-help": "Schiscia in sü un grüp data/ura per vidè l'archivi cumè che'l se presentava in quel mument là",
        "filehist-deleteall": "scancela tüt",
        "filehist-deleteone": "Scancèla",
        "filehist-revert": "Butar torna 'me ch'al era",
        "filehist-datetime": "Data/Ura",
        "filehist-thumb": "Miniadüra",
        "filehist-thumbtext": "Miniadüra de la versión di $1",
+       "filehist-nothumb": "Nesöna miniadüra",
        "filehist-user": "Dovrat",
        "filehist-dimensions": "Dimensión",
-       "filehist-comment": "Uget",
-       "imagelinks": "Ligamm al file",
+       "filehist-filesize": "Dimensiù de l'archivi",
+       "filehist-comment": "Comènt",
+       "imagelinks": "Üzo de l'archivi",
        "linkstoimage": "{{PLURAL:$1|Quela pagina chì la gh'ha |$1 Quij paginn chì i gh'hann}} ligam al file:",
        "sharedupload": "Quel archivi chì al vegn de $1 e'l pö vess dupraa da alter pruget",
        "sharedupload-desc-here": "Quel ''file'' chì al vegn de $1 e 'l pö vess druvaa da alter pruget.\nLa descrizión sura la sua [$2 pagina de descrizión del file] l'è mustrada chì suta.",
        "uploadnewversion-linktext": "Carga una versión növa de quel file chì",
        "filerevert-intro": "Te seet adree a bütà turna el file '''[[Media:$1|$1]]''' a la [$4 version del $2, $3].",
-       "filerevert-comment": "Uget:",
-       "filerevert-defaultcomment": "Bütada turna la versión di $2, $1",
+       "filerevert-comment": "Mutif:",
+       "filerevert-defaultcomment": "Ripristinàt la versiù del $2, $1",
+       "filerevert-submit": "Riprìstina 'mè che l'era",
+       "filerevert-success": "'''L'archivi [[Media:$1|$1]]''' l'è stat ripristinat a la [$4 versiù del $2, $3].",
        "filedelete": "Scancela $1",
-       "filedelete-legend": "Scancela 'l file",
+       "filedelete-legend": "Scancela l'archivi",
        "filedelete-intro-old": "Te seet adree a scancelà la versión de '''[[Media:$1|$1]]''' del [$4 $2, $3].",
-       "filedelete-comment": "Reson:",
+       "filedelete-comment": "Mutif:",
+       "filedelete-submit": "Scancèla",
+       "filedelete-success": "L'archivi '''$1''' l'è stat scancelàt.",
+       "filedelete-success-old": "La versiù de l'archivi '''[[Media:$1|$1]]''' del $2, $3  l'è stada scancelada.",
        "filedelete-otherreason": "Alter resón/spiegazión:",
        "filedelete-reason-otherlist": "Óltra resón",
        "filedelete-reason-dropdown": "*I sòlit resón per i scancelament\n** Viulazión de copyright\n** File dubi",
        "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",
        "statistics-users": "[[Special:ListUsers|Druvadur]] registraa",
        "statistics-users-active": "Druvadur ativ",
        "statistics-users-active-desc": "Druvadur che i hann faa un'azión int {{PLURAL:$1|l'ültem dì|i ültem $1 dì}}",
+       "pageswithprop-submit": "Và",
        "doubleredirects": "Redirezziún dópi",
+       "double-redirect-fixer": "Coretùr de redirects",
        "brokenredirects": "Redirezziún interótt",
+       "brokenredirectstext": "I redirects ché sóta i pùnta a pàgine che gh'è mìa:",
+       "brokenredirects-edit": "mudifega",
+       "brokenredirects-delete": "scancèla",
+       "withoutinterwiki": "Pàgine sènsa interwiki",
+       "withoutinterwiki-legend": "Prefìs",
+       "withoutinterwiki-submit": "Fà ved",
+       "fewestrevisions": "Pàgine con piö póche reviziù",
        "nbytes": "$1 {{PLURAL:$1|byte|bytes}}",
+       "ncategories": "$1 {{PLURAL:$1|categuria|Categurie}}",
+       "ninterwikis": "$1 {{PLURAL:$1|interwiki}}",
+       "nlinks": "$1 {{PLURAL:$1|colegament|colegamencc}}",
        "nmembers": "$1 {{PLURAL:$1|element|element}}",
+       "nmemberschanged": "$1 → $2 {{PLURAL:$2|elemènt|elemèncc}}",
+       "nrevisions": "$1 {{PLURAL:$1|reviziù}}",
+       "nviews": "$1 {{PLURAL:$1|vìzita|vìzite}}",
+       "nimagelinks": "Dopràt sö $1 {{PLURAL:$1|pàgina|pàgine}}",
+       "ntransclusions": "dopràt sö $1 {{PLURAL:$1|pàgina|pàgine}}",
+       "specialpage-empty": "Chèsta pàgina speciàl al momènt l'è öda.",
+       "lonelypages": "Pàgine òrfane",
+       "lonelypagestext": "Le pàgine elencàde ché sóta le g'ha mìa colegamèncc che é de ótre pàgine de {{SITENAME}} e i è mìa dét en nesöna ótra pàgina del sit.",
        "uncategorizedpages": "Paginn ch'i gh'hann mía de categuria",
        "uncategorizedcategories": "Categurij mía categurizaa",
        "uncategorizedimages": "''File'' ch'i gh'hann mía de categuria.",
        "uncategorizedtemplates": "Mudel ch'i gh'hann mía de categuria.",
        "unusedcategories": "Categurij mía druvaa",
        "unusedimages": "Imagin mia druvaa",
+       "popularpages": "Pàgine éste piö de spès",
        "wantedcategories": "Categurij ricercaa",
        "wantedpages": "Pagin ricercaa",
        "mostlinked": "Püssè ligaa a pagin",
        "mostlinkedcategories": "Categurij cun püssee ligamm",
+       "mostlinkedtemplates": "Mudèi dopràcc piö de spès",
        "mostcategories": "Articui cun püssee categurij",
        "mostimages": "Püssè ligaa a imagin",
+       "mostinterwikis": "Pàgine con piö tacc interwikis",
        "mostrevisions": "Articui cun püssè revisiún",
        "prefixindex": "Tüt i paginn cun prefiss",
        "shortpages": "Paginn püssee cürt",
        "longpages": "Paginn püssee lungh",
        "deadendpages": "Pagin senza surtida",
+       "protectedpages": "Pàgine prutigìde",
+       "protectedpages-indef": "Apéna protesiù infinìte",
+       "protectedpages-noredirect": "Scond i redirezion (redirect)",
        "listusers": "Lista di dupradur registraa",
        "listusers-editsonly": "Mustra dumà i dupradur cun di mudifegh",
        "listusers-creationsort": "Cavèzza per data de creazión",
        "booksources": "Surgent per i lìber",
        "booksources-search-legend": "Cerca i fónt di liber",
        "booksources-go": "Va",
-       "specialloguserlabel": "Üteent:",
-       "speciallogtitlelabel": "Titul:",
+       "specialloguserlabel": "Ütent:",
+       "speciallogtitlelabel": "Asiù fàda sö:",
        "log": "Register",
        "logempty": "El log l'è vöj.",
        "allpages": "Tücc i pagin",
-       "alphaindexline": "de $1 a $2",
        "prevpage": "Pagina prima ($1)",
        "allpagesfrom": "Fàm vedè i paginn a partì da:",
        "allpagesto": "Fàm ved i paginn fín a:",
        "allarticles": "Tucc i artícoj",
        "allpagessubmit": "Inanz",
        "allpagesprefix": "Varda i pagin ch'i scumenza per:",
+       "allpages-hide-redirects": "Scond i bot",
        "categories": "Categurij",
        "deletedcontributions": "Cuntribüziun scancelaa",
        "deletedcontributions-title": "Cuntribüziun scancelaa",
-       "linksearch": "Ligam de föra",
+       "linksearch": "Sérca ligam de föra",
        "listusersfrom": "Fàm vedè i dupradur a partì da:",
+       "listusers-submit": "Fà ved",
        "activeusers-from": "Fàm vedè i dupradur a partì da:",
+       "activeusers-hidebots": "Scond i bot",
        "listgrouprights": "Dirit del grüp di druvat",
+       "listgrouprights-rights": "Dirìcc",
+       "listgrouprights-helppage": "Help:Diricc del grupo",
        "listgrouprights-members": "(Lista di member)",
        "emailuser": "Manda un email a quel druvadur chì",
        "emailsent": "Messagg spedii",
        "watch": "Tegn d'öcc",
        "watchthispage": "Tegn d'ögg quela pagina chì",
        "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",
        "watchlist-options": "Upzión lista d'ussevazión",
        "watching": "Giuntà ai pagin da ten d'ögg...",
        "unwatching": "Eliminà dai pagin da ten d'ögg...",
        "enotif_lastvisited": "Varda $1 per vedè tüt i mudifegh da la tua ültema vìsita.",
-       "enotif_body": "Cara $WATCHINGUSERNAME,\n\nLa pàgina $PAGETITLE del sit {{SITENAME}} a l'è stada $CHANGEDORCREATED del $PAGEEDITDATE da $PAGEEDITOR, varda $PAGETITLE_URL per la version curenta.\n\n$NEWPAGE\n\nSumari de la mudifega, metüü denter da l'autur: $PAGESUMMARY $PAGEMINOREDIT\n\nPer cuntatà l'autur:\nper e-mail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nGhe sarà pü mía de nutificazion in cas d'una quaj oltra mudifega, a manch che te veet nò a visità la pàgina in questión.\nDe surapü, te pö mudifegà l'impustazion de l'avis de nutifega per quij paginn che i henn ins la lista di paginn che te tegn d'ögg.\n\n             'L to sistema de nutifega da {{SITENAME}}\n\n--\nPer mudifegà l'impustazión de la lista di paginn che te tegn d'ögg, varda\n{{canonicalurl:Special:Watchlist/edit}}\n\nPer fà di cumünicazion de servizzi e per cercà jüt:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Cara $WATCHINGUSERNAME,\n\nLa pàgina $PAGETITLE del sit {{SITENAME}} a l'è stada $CHANGEDORCREATED del $PAGEEDITDATE da $PAGEEDITOR, varda $PAGETITLE_URL per la version curenta.\n\n$NEWPAGE\n\nSumari de la mudifega, metüü denter da l'autur: $PAGESUMMARY $PAGEMINOREDIT\n\nPer cuntatà l'autur:\nper e-mail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nGhe sarà pü mía de nutificazion in cas d'una quaj oltra mudifega, a manch che te veet nò a visità la pàgina in questión.\nDe surapü, te pö mudifegà l'impustazion de l'avis de nutifega per quij paginn che i henn ins la lista di paginn che te tegn d'ögg.\n\n             'L to sistema de nutifega da {{SITENAME}}\n\n--\nPer mudifegà l'impustazión de la lista di paginn che te tegn d'ögg, varda\n{{canonicalurl:Special:Watchlist/edit}}\n\nPer fà di cumünicazion de servizzi e per cercà jüt:\n$HELPPAGE",
        "changed": "cambiaa",
        "deletepage": "Scancela la pagina",
+       "confirm": "Cunférma",
        "excontent": "'l cuntegnüü l'eva: '$1'",
        "excontentauthor": "'l cuntegnüü l'eva: '$1' (e l'ünich cuntribüdur l'eva staa '[[Special:Contributions/$2|$2]]')",
        "exbeforeblank": "Inanz da vess svujaa 'l cuntegnüü l'eva: '$1'",
-       "historywarning": "'''Ocio!''' La pagina che a sii adree a scancelà la gh'a una stòria cun $1 {{PLURAL:$1|revisión|revisionn}}:",
+       "delete-confirm": "Scancèla \"$1\"",
+       "delete-legend": "Scancèla",
+       "historywarning": "'''Ocio!''' La pagina che a sii adree a scancelà la gh'a una crunulugìa cun presapoch $1 {{PLURAL:$1|revision|revision}}:",
        "confirmdeletetext": "A te see lì per scancelà una pagina cun tüta la sua crunulugìa.\nPer piasè, dà la cunferma che te gh'hee intenzión de andà inanz cun 'l scancelament, che te see al curent di cunseguenz, e che te see adree a fàl segónd i regulament de [[{{MediaWiki:Policy-url}}]].",
        "actioncomplete": "Aziun cumpletada",
+       "actionfailed": "Asiù falìda",
        "deletedtext": "La pagina \"$1\" l'è stada scancelada. Varda el $2 per una lista di ültim scancelaziun.",
        "dellogpage": "Register di scancelament",
        "deletionlog": "log di scancelament",
        "protect-title": "Prutezziún da \"$1\"",
        "prot_1movedto2": "[[$1]] spustaa in [[$2]]",
        "protect-legend": "Cunferma de blocch",
-       "protectcomment": "Reson:",
-       "protectexpiry": "Scadenza:",
+       "protectcomment": "Mutìf:",
+       "protectexpiry": "Scadènsa:",
        "protect_expiry_invalid": "Scadenza pü bona",
        "protect_expiry_old": "Scadenza giamò passada",
        "protect-text": "Chì se pö vardà e müdà el nivel de prutezión de la pagina '''$1'''.",
        "undeletebtn": "Rimett a post",
        "undeletelink": "Varda/büta indree",
        "undeletedrevisions": "{{PLURAL:$1|1 revision|$1 versiun}} rimetüü a post",
+       "undelete-search-prefix": "Fà ved i paginn che scumenzen per:",
        "namespace": "Namespace:",
        "invert": "Invertì la seleziòn",
        "blanknamespace": "(Principal)",
        "blockip": "Bloca el dovrat",
        "blockip-legend": "Bloca 'l druvadur",
        "blockiptext": "Druvee 'l mòdul chì de suta per blucà l'acess cun dirit de scritüra a un indirizz IP specifegh o a un druvadur registraa.\nEl bloch gh'è de druvàl dumà per evità el vandalism e in acord cun i [[{{MediaWiki:Policy-url}}|regulament de {{SITENAME}}]].\nScrivee chì de suta 'l mutiv specifegh per el bloch (presempi, a pudii scriv i titul di paginn che i henn stat suget a vandalism).",
-       "ipadressorusername": "Indirizz IP o nom del druvdur:",
+       "ipaddressorusername": "Indirizz IP o nom del druvdur:",
        "ipbexpiry": "Fina al:",
        "ipbreason": "Reson:",
        "ipbreason-dropdown": "*Mutiv püssee cumün per i blòch\n** Avè caregaa di infurmazión fals\n** Avè töt via del cuntegnüü dai paginn\n** Avè giuntaa di ereclam a di sit da föra\n** Avè giuntaa de la ratatuja int i paginn\n** Cumpurtament intimidatori\n** Avè druvaa püssee dun cünt in manera abüsiva\n** El nom del druvàt l'è inacetabil",
        "ipusubmit": "Tö via 'stu bloch chì",
        "unblocked": "[[User:$1|$1]] l'è staa desblucaa",
        "ipblocklist": "Adrèss IP e druvàt blucaa",
+       "blocklist-reason": "Mutìf",
        "infiniteblock": "per semper",
        "expiringblock": "el finiss el $1 a $2",
        "anononlyblock": "dumà i anònim",
        "unblocklink": "desbloca",
        "change-blocklink": "cambia bloch",
        "contribslink": "cuntribüzión",
+       "emaillink": "mànda e-mail",
        "blocklogpage": "Log di blocch",
        "blocklogentry": "l'ha blucaa [[$1]] per un temp de $2 $3",
        "blocklogtext": "Quel chì l'è el register di bloch e desbloch di druvadur.\nI indirizz IP che i henn staa blucaa utumaticament i henn mía cumpres int la lista.\nVarda el [[Special:BlockList|register di IP blucaa]] per la lista de tüt i bloch uperaziunaj ativ.",
        "block-log-flags-nocreate": "blucada la creazión de cünt növ",
        "movepagetext": "Duvraant la büeta chí-da-sota al re-numinerà una pàgina, muveent tüta la suva stòria al nomm nööf. Ul vecc títul al deventarà una pàgina da redirezziun al nööf títul. I liamm a la vegja pàgina i sarà mia cambiaa: assürévas da cuntrulá par redirezziun dopi u rumpüüt.\nA sii respunsàbil da assüráss che i liamm i sigüta a puntá intúe i è süpunüü da ná.\nNutii che la pàgina la sarà '''mia''' muvüda se a gh'è gjamò una pàgina al nööf títul, a maanch che la sía vöja, una redirezziun cun nissüna stòtia d'esizziun passada. Cheest-chí al signífega ch'a pudii renuminá indrée\nuna pàgina intúe l'évuf renuminada via par eruur, e che vüü pudii mia surascriif una pàgina esisteent.\n\n\n<b>ATENZIUN!</b>\nCheest-chí al pöö vess un canbi dràstegh e inaspetaa par una pàgina pupülara: par piasée assürévas ch'a ii capii i cunsegueenz da cheest-chí prima da ná inaanz.",
        "movepagetalktext": "La pagina de discüssión tacada a quel articul chì, la sarà spustada in manera utumatega insema a l'articul, '''asca in quij cas chì:'''\n* quand che la pagina a l'è spustada intra namespace diferent\n* se in del növ titul al gh'è giamò una pagina de discüssiun (minga vöja)\n* el quadret de cunferma chì de sota a l'è staa deseleziónaa.\nIn quij cas chì, se'l var la pena, ghe sarà de spustà a man i infurmazión de la pagina de discüssión.",
-       "movearticle": "Möva l'articul",
+       "movearticle": "Spòsta la pàgina:",
        "newtitle": "Titul növ:",
        "move-watch": "Gionta chela pagina chí ai pàgin à tegní d'œucc.",
        "movepagebtn": "Sposta quela pagina chì",
        "articleexists": "Una pagina che la se ciama cumpagn la gh'è giamò, opüra el nom che hii scernüü al va minga ben. <br />\nChe 'l scerna, per piasè, un nom diferent per quel articul chì.",
        "movetalk": "Sposta anca la pagina de discüssión",
        "movelogpage": "Register di San Martin",
-       "movereason": "Resón:",
-       "revertmove": "büta indree a 'mè che l'era",
-       "delete_and_move": "Scancelá e mööf",
+       "movereason": "Mutìf:",
+       "revertmove": "Riprìstina 'mè che l'era",
+       "delete_and_move": "Scancèla e möf",
+       "delete_and_move_confirm": "Sé, surascrìf la pàgina che gh'è zà",
        "export": "Espurtá pagin",
        "allmessages": "Tücc i messacc dal sistéma",
+       "allmessagesname": "Nòm",
        "allmessagesdefault": "Test standard",
        "allmessagescurrent": "Test curent",
        "allmessagestext": "Chesta chí l è una lista də messácc də sistema dispunibil indal MediaWiki: namespace.",
+       "allmessages-filter-legend": "Fìlter",
+       "allmessages-filter-unmodified": "Mìa mudificàcc",
+       "allmessages-filter-all": "Töcc",
+       "allmessages-filter-modified": "Mudificàcc",
+       "allmessages-prefix": "Fìltra per prefìs:",
+       "allmessages-language": "Lèngua:",
+       "allmessages-filter-submit": "Và",
        "thumbnail-more": "Ingrandí",
        "import": "Impurtá di pagin",
        "tooltip-pt-userpage": "La tò pagina druvat",
        "tooltip-rollback": "El \"Rollback\" al scancela cunt un clich i mudifigh faa a quela pagina chì de l'ültem cuntribüdur",
        "tooltip-undo": "\"Undo\" al scancela questa mudifega chì e la derv la finestra de mudifega in manera de vardà prima. La te lassa giuntàgh una spiegazión de la mudifega.",
        "siteuser": "{{SITENAME}} ütent $1",
+       "pageinfo-contentpage-yes": "Sé",
+       "pageinfo-protect-cascading-yes": "Sé",
        "deletedrevision": "Scancelada la revision vegia de $1.",
        "previousdiff": "← Diferenza püssee vegia",
        "nextdiff": "Mudifega püssee növa →",
        "svg-long-desc": "archivi in furmaa SVG, dimensión nominaj  $1 × $2 pixel, dimensión de l'archivi: $3",
        "show-big-image": "Versión a resolüzión volta",
        "newimages": "Espusizión di imàgin növ",
+       "newimages-legend": "Fìltra",
+       "noimages": "Gh'è negót de éder.",
        "ilsubmit": "Truvá",
+       "bydate": "per data",
        "bad_image_list": "El furmaa a l'è quest chì:\n\nSe tegnen bón dumà i list póntaa (i righ che scumincen per *).\nEl prim ligam de ogni riga la gh'ha de vess un ligam a un file minga desideraa.\nI ligam che i vegnen dopu, in sü l'istessa riga, i vegnen cónsideraa di ecezión (che'l vör dì paginn induè che 'l file se'l pö riciamà in manera nurmala).",
        "metadata": "Metadat",
        "metadata-help": "Quel file chì al gh'ha dent di infurmazión adiziunaj, che l'è prubabil che j'ha giuntaa la fotocamera o 'l scanner dupraa per fàl o digitalizàl. Se el file a l'è staa mudifegaa, un quajvün di detali i pudarien curespund pü ai mudifegh faa.",
        "confirmemail_sent": "Ul mesacc da cunfermazziún l è staa mandaa.",
        "confirmemail_success": "'L voster indirizz e-mail l'è staa cunfermaa: adess a pudii druvà la wiki.",
        "confirmemail_loggedin": "Adess 'l voster indirizz e-mail l'è staa cunfermaa",
+       "confirm_purge_button": "Cunferma",
+       "confirm-watch-button": "OK",
+       "imgmultigo": "Và!",
        "autosumm-blank": "Pagina svujada",
        "watchlisttools-view": "Varda i mudifegh impurtant",
        "watchlisttools-edit": "Varda e mudifega la lista di paginn che te tegnet sut ögg",
        "watchlisttools-raw": "Mudifega la lista in furmaa test",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ciciarade]])",
        "version": "Versiun",
-       "specialpages": "Paginn special"
+       "specialpages": "Paginn special",
+       "tags-active-yes": "Sé",
+       "tags-active-no": "Nò",
+       "tags-edit": "mudìfica",
+       "rightsnone": "(nisü)"
 }
index cb581f1..cf3e7e2 100644 (file)
@@ -2,7 +2,8 @@
        "@metadata": {
                "authors": [
                        "Passawuth",
-                       "Tuinui"
+                       "Tuinui",
+                       "아라"
                ]
        },
        "tog-underline": "ຂີດເສັ້ນກ້ອງລິງກ໌:",
@@ -15,7 +16,6 @@
        "tog-showtoolbar": "ສະແດງ ທູລບາດັດແກ້ (JavaScript)",
        "tog-editondblclick": "ໃຫ້ສາມາດດັດແກ້ ໂດຍ ດັບເບິລ໌ ຄລິກ (JavaScript)",
        "tog-editsectiononrightclick": "ໃຫ້ສາມາດ ດັດແກ້ ໂດຍກົດປຸ່ມຂວາ ຂອງເມົາສ໌ ຢູ່ <br /> ຫົວຂໍ້ຂອງພາກ (JavaScript)",
-       "tog-rememberpassword": "ຈົດຈໍາການເຊັນເຂົ້າຂອງຂ້ອຍ ຢູ່ ຄອມພິວເຕີໜ່ວຍນີ້ (for a maximum of $1 {{PLURAL:$1|day|days}})",
        "tog-watchcreations": "ເພີ່ມ ໜ້າທີ່ຂ້ອຍສ້າງ ເຂົ້າໃນ ລາຍການຕິດຕາມ ຂອງ ຂ້ອຍ",
        "tog-watchdefault": "ເພີ່ມໜ້າ ທີ່ ຂ້ອຍດັດແກ້ ໃສ່ ລາຍຕິດຕາມ ຂອງ ຂ້ອຍ",
        "tog-watchmoves": "ເພີ່ມ ໜ້າທີ່ຂອ້ຍຍ້າຍ ໃສ່ ລາຍການຕິດຕາມຂອງຂ້ອຍ",
        "recentchanges": "ການດັດແກ້ຫຼ້າສຸດ",
        "recentchanges-summary": "ເບິ່ງ ການປ່ຽນແປງ ຫຼ້າສຸດ ຢູ່ ໜ້າວິກີນີ້.",
        "recentchanges-feed-description": "ນຳເບິ່ງການປ່ຽນແປງຫຼ້າສຸດຢູ່ ວິກິນີ້ ໃນ ຟີດ",
-       "rclistfrom": "ສະແດງ ການປ່ຽນແປງ ເລີ່ມແຕ່  $1",
+       "rclistfrom": "ສະແດງ ການປ່ຽນແປງ ເລີ່ມແຕ່  $3 $2",
        "rcshowhideminor": "$1 ການດັດແກ້ເລັກນ້ອຍ",
        "rcshowhidebots": "$1 ບອທ໌",
        "rcshowhideliu": "$1 ຜູ້ໃຊ້ໄດ້ເຊັນເຂົ້າ",
index c20e2fa..8e097c9 100644 (file)
@@ -4,7 +4,8 @@
                        "Kaganer",
                        "Litingatinga Silozi",
                        "Ooswesthoesbes",
-                       "SF-Language"
+                       "SF-Language",
+                       "아라"
                ]
        },
        "tog-underline": "Tumana ling'ko:",
@@ -12,7 +13,6 @@
        "tog-numberheadings": "Auto-palo mukunguna",
        "tog-showtoolbar": "Kamukile hloli ye ng'i toolbar (bulukezi JavaScript)",
        "tog-editondblclick": "Hloli ye ng'i petulo di 'klik' dubo (JavaScript)",
-       "tog-rememberpassword": "Askevusize zwa menuhile kwa bye kompyuta (for a maximum of $1 {{PLURAL:$1|day|days}})",
        "tog-watchcreations": "Pusize petulo a hloli di zwa mukoloko di kentezi",
        "tog-watchdefault": "Pusize petulo a hloli ye ng'i di zwa mukoloko di kentezi",
        "tog-watchmoves": "Pusize petulo a nyanganyisoze di zwa mukoloko di kentezi",
        "filedeleteerror": "Ni sa afi kulobala media \"$1\".",
        "directorycreateerror": "Ni sa hloli direktori \"$1\".",
        "filenotfound": "Ni sa fatukile media \"$1\".",
-       "fileexistserror": "Ni sa ubelisize di media \"$1\": media sa",
        "unexpected": "Teko lishokomoki: \"$1\"=\"$2\".",
        "formerror": "Bufosi: ni bulukezi form",
        "badtitle": "Sebu sa bani",
        "savearticle": "Bulukezi",
        "preview": "PendiBe",
        "showpreview": "Kamukile PendiBe",
-       "showlivepreview": "Lyangutukezi 'Live'",
        "showdiff": "Kamukile nca petuho",
        "anoneditwarning": "'''!:''' A ni sa menuhile.\nZwa adresi di IP sa bulukezi kwa kenki bundau di petulo.",
        "summary-preview": "Lyangutukezi pendiBe:",
        "recentchanges": "Petuho nca",
        "recentchanges-feed-description": "Kamukile petuho nca di wiki kwa bye feed.",
        "rcnotefrom": "Bye sa petuho di '''$2''' (di '''$1''' sa kamukile).",
-       "rclistfrom": "Kamukile nca petuho di $1",
+       "rclistfrom": "Kamukile nca petuho di $3 $2",
        "rcshowhideminor": "$1 pili kenki",
        "rcshowhidebots": "$1 roboti",
        "rcshowhideliu": "$1 sebelu",
        "autosumm-replace": "Sa blanki info con '$1'",
        "autoredircomment": "Abezi di [[$1]]",
        "autosumm-new": "Nca petulo: $1",
-       "watchlistedit-numitems": "Zwa mukoloko di kentezi sa pozefisize {{PLURAL:$1|1 petulo|$1 petulo}}, dicon bulelezina.",
-       "watchlistedit-noitems": "Zwa mukoloko di kentezi sa pozefisize 0 petulo.",
        "watchlistedit-normal-title": "Hloli ye ng'i mukoloko di kentezi",
        "watchlistedit-normal-legend": "Afi kulobala petulo di mukoloko di kentezi",
        "watchlistedit-normal-submit": "Afi kulobala petulo",
index 668a0e4..e9e4a8d 100644 (file)
@@ -2,7 +2,8 @@
        "@metadata": {
                "authors": [
                        "Bonevarluri",
-                       "Mogoeilor"
+                       "Mogoeilor",
+                       "아라"
                ]
        },
        "tog-underline": "هوم پیوند زیرخط دار:",
        "readonly_lag": "ای پاگا دونسمنی قلف بیه تا اوسه که سرور پایگا دونسمنیا وه مینجاون برسه.",
        "internalerror": "خطا داخلی",
        "internalerror_info": "خطا داخلی:$1",
-       "fileappenderrorread": "نبوئه $1 نه اوسه که پیوست بوئه بحونیت.",
-       "fileappenderror": "نبوئه فایل $1 د $2 پیوست بوئه",
        "filecopyerror": "نبوئه فایل $1 د $2 کپی بوئه",
        "filerenameerror": "نبوئه فایل $1 د $2 نوم آلشت بوئه",
        "filedeleteerror": "نبوئه فایل $1 پاک بوئه",
        "directorycreateerror": "نبوئه سردسه $1 راس بوئه.",
        "filenotfound": "نتونیت فایل $1 پیدا بکید",
-       "fileexistserror": "نبوئه د فایل \"$1\" بنیسید:فایل هئیش",
        "unexpected": "ارزایشت ناحاسته: \"$1\"=\"$2\".",
        "formerror": "خطا:نبوئه فرم وه مو بئيت",
        "badarticleerror": "ای انجوم دئنی د ای بلگه انجوم نگره.",
        "userlogin-helplink2": "هومیاری وا مین اومائن",
        "userlogin-loggedin": "شما ایسه د عنوان {{جنس:$1|$1}} اومایته وا مین.\nد فرم هاری سی وا مین اومائن وه عنوان کارور هنی استفاده بکیتو.",
        "userlogin-createanother": "يه گل حساوهنی راست بكيد",
-       "createacct-join": "دونسمنيا دباره خوتونه د هار وارد بكيد",
-       "createacct-another-join": "دونسمنیا یه گل حساو د هار وارد بکید",
        "createacct-emailrequired": "نشونی ايميل",
        "createacct-emailoptional": "نشونی ايميل",
        "createacct-email-ph": "نوم نشون ايميلتونه وارد بكيت",
        "savearticle": "بلگه ضبط بوئه",
        "preview": "پيش سيل",
        "showpreview": "پيش نمائش نشون بيئه",
-       "showlivepreview": "پیش سیل زنه",
        "showdiff": "آلشتيانه نشون بيئه",
        "anoneditwarning": "زنهار شما وامین نیومایته.\nنشونی آی پی تو د ویرگار ویرایشت ای بلگه ضفط بوئه",
        "missingcommenttext": "لطفن د ایچه نظر بیئتو",
        "prefs-advancedsearchoptions": "گزینه یا پیشکرده",
        "prefs-advancedwatchlist": "گزینه یا پیشکرده",
        "prefs-displayrc": "گزینه یا نه نشو بیه",
-       "prefs-displaysearchoptions": "گزینه یا نه نشو بیه",
        "prefs-displaywatchlist": "گزینه یا نه نشو بیه",
        "prefs-diffs": "فرخیا",
        "email-address-validity-valid": "نشونی ایمیل دیار بیه خوئه",
        "recentchanges-legend-heading": "'''میراث:'''",
        "recentchanges-legend-newpage": "(همچنو بوینیت [[ویجه:بلگیا تازه|نوم گه بلگیا تازه]])",
        "rcnotefrom": "د هار آلشتیا د $2 هیئن(د بال د $1 نشون دئه بیه)",
-       "rclistfrom": "آلشتیا تازه ایی که وا $1 شرو بیه نشونش بئه",
+       "rclistfrom": "آلشتیا تازه ایی که وا $3 $2 شرو بیه نشونش بئه",
        "rcshowhideminor": "ويرايشتيا کؤچک $1",
        "rcshowhideminor-show": "نشو دئن",
        "rcshowhideminor-hide": "قام کردن",
index dab0f12..8d9bae3 100644 (file)
@@ -27,7 +27,8 @@
                        "Vpovilaitis",
                        "Xabier Armendaritz",
                        "לערי ריינהארט",
-                       "Vogone"
+                       "Vogone",
+                       "아라"
                ]
        },
        "tog-underline": "Pabraukti nuorodas:",
@@ -37,7 +38,7 @@
        "tog-extendwatchlist": "Išplėsti stebimųjų sąrašą, kad rodytų visus tinkamus keitimus, ne tik pačius naujausius.",
        "tog-usenewrc": "Naudoti patobulintąjį paskutinių keitimų sąrašą (reikia JavaScript)",
        "tog-numberheadings": "Automatiškai numeruoti skyrelius",
-       "tog-showtoolbar": "Rodyti redagavimo įrankinę (JavaScript)",
+       "tog-showtoolbar": "Rodyti redagavimo įrankių juosta",
        "tog-editondblclick": "Puslapių redagavimas dvigubu spustelėjimu (JavaScript)",
        "tog-editsectiononrightclick": "Įjungti skyrelių redagavimą paspaudus skyrelio pavadinimą dešiniuoju pelės klavišu (JavaScript)",
        "tog-watchcreations": "Pridėti puslapius, kuriuos aš sukuriu, į stebimų sąrašą",
@@ -67,6 +68,7 @@
        "tog-showhiddencats": "Rodyti paslėptas kategorijas",
        "tog-norollbackdiff": "Nepaisyti skirtumo atlikus atmetimą",
        "tog-useeditwarning": "Perspėti mane, kai palieku redagavimo puslapį, o jame yra neišsaugotų pakeitimų",
+       "tog-prefershttps": "Prisiregistruojant visada naudokite saugų ryšį",
        "underline-always": "Visada",
        "underline-never": "Niekada",
        "underline-default": "Pagal naršyklės nustatymus",
        "newwindow": "(atsidaro naujame lange)",
        "cancel": "Atšaukti",
        "moredotdotdot": "Daugiau...",
-       "morenotlisted": "Daugiau nėra",
+       "morenotlisted": "Šis sąrašas nėra išsamus.",
        "mypage": "Naudotojo puslapis",
        "mytalk": "Mano aptarimas",
        "anontalk": "Šio IP aptarimas",
        "permalink": "Nuolatinė nuoroda",
        "print": "Spausdinti",
        "view": "Žiūrėti",
+       "view-foreign": "Rodyti $1",
        "edit": "Redaguoti",
+       "edit-local": "Redaguoti vietos aprašymą",
        "create": "Sukurti",
+       "create-local": "Pridėti vietos aprašymą",
        "editthispage": "Redaguoti šį puslapį",
        "create-this-page": "Sukurti šį puslapį",
        "delete": "Trinti",
        "pool-errorunknown": "Nežinoma klaida",
        "aboutsite": "Apie {{SITENAME}}",
        "aboutpage": "Project:Apie",
-       "copyright": "Turinys pateikiamas pagal $1 licenciją.",
+       "copyright": "Turinys pateikiamas pagal  $1  jei nenurodyta kitaip.",
        "copyrightpage": "{{ns:project}}:Autorystės teisės",
        "currentevents": "Naujienos",
        "currentevents-url": "Project:Naujienos",
        "youhavenewmessages": "Jūs turite $1 ($2).",
        "youhavenewmessagesfromusers": "Jūs gavote $1 nuo {{PLURAL:$3|kito vartotojo|$3 vartotojų}} ($2).",
        "youhavenewmessagesmanyusers": "Jūs turite $1 iš daugelio vartotojų ( $2 ) .",
-       "newmessageslinkplural": "{{PLURAL:$1|naują žinutę|naujų žinučių}}",
-       "newmessagesdifflinkplural": "paskutinis {{PLURAL:$1|pakeitimas|pakeitimai}}",
+       "newmessageslinkplural": "{{PLURAL:$1|nauja žinutė|999=naujos žinutės}}",
+       "newmessagesdifflinkplural": "paskutinis {{PLURAL:$1|pakeitimas|999=pakeitimai}}",
        "youhavenewmessagesmulti": "Turite naujų žinučių $1",
        "editsection": "redaguoti",
        "editold": "taisyti",
        "nospecialpagetext": "<strong>Toks specialusis puslapis neegzistuoja</strong>\n\nEgzistuojančių specialiųjų puslapių sąrašą galite rasti [[Special:SpecialPages|specialiųjų puslapių sąraše]].",
        "error": "Klaida",
        "databaseerror": "Duomenų bazės klaida",
+       "databaseerror-query": "Užklausa:$1",
+       "databaseerror-error": "Klaida: $1",
        "laggedslavemode": "Dėmesio: Puslapyje gali nesimatyti naujausių pakeitimų.",
        "readonly": "Duomenų bazė užrakinta",
        "enterlockreason": "Įveskite užrakinimo priežastį, taip pat datą, kada bus atrakinta",
        "readonly_lag": "Duomenų bazė buvo automatiškai užrakinta, kol pagalbinės duomenų bazės prisivys pagrindinę",
        "internalerror": "Vidinė klaida",
        "internalerror_info": "Vidinė klaida: $1",
-       "fileappenderrorread": "Papildymo metu nepavyko perskaityti „$1“.",
-       "fileappenderror": "Nepavyko pridėti „$1“ prie „$2“.",
        "filecopyerror": "Nepavyksta kopijuoti failo iš „$1“ į „$2“.",
        "filerenameerror": "Nepavyksta pervardinti failo iš „$1“ į „$2“.",
        "filedeleteerror": "Nepavyksta ištrinti failo „$1“.",
        "directorycreateerror": "Nepavyko sukurti aplanko „$1“.",
        "filenotfound": "Nepavyksta rasti failo „$1“.",
-       "fileexistserror": "Nepavyksta įrašyti į failą „$1“: failas jau yra",
        "unexpected": "Netikėta reikšmė: „$1“=„$2“.",
        "formerror": "Klaida: nepavyko apdoroti formos duomenų",
        "badarticleerror": "Veiksmas negalimas šiam puslapiui.",
        "gotaccount": "Jau turite paskyrą? '''$1'''.",
        "gotaccountlink": "Prisijunkite",
        "userlogin-resetlink": "Pamiršote savo prisijungimo duomenis?",
-       "userlogin-resetpassword-link": "Nustatykite slaptažodį iš naujo",
+       "userlogin-resetpassword-link": "Pamiršote savo slaptažodį?",
+       "userlogin-helplink2": "Padėti prisijungti",
        "userlogin-createanother": "Sukurti kitą paskyrą",
-       "createacct-join": "Įveskite savo informaciją žemiau.",
-       "createacct-another-join": "Įveskite naujos paskyros informaciją žemiau.",
        "createacct-emailrequired": "Elektroninio pašto adresas",
        "createacct-emailoptional": "Elektroninio pašto adresas (neprivaloma)",
        "createacct-email-ph": "Įveskite savo elektroninio pašto adresą",
        "accountcreatedtext": "Naudotojo paskyra [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) buvo sukurta.",
        "createaccount-title": "{{SITENAME}} paskyros kūrimas",
        "createaccount-text": "Projekte {{SITENAME}} ($4) kažkas sukūrė paskyrą „$2“ su slaptažodžiu „$3“ panaudodamas jūsų el. pašto adresą.\nJūs turėtumėte prisijungti ir pasikeisti savo slaptažodį.\n\nJūs galite nekreipti dėmesio į laišką, jei ši paskyra buvo sukurta per klaidą.",
-       "login-throttled": "Jūs pernelyg daug kartų bandėte prisijungti.\nPalaukite prieš bandant vėl.",
+       "login-throttled": "Jūs pernelyg daug kartų bandėte prisijungti.\nPalaukite $1 prieš bandant vėl.",
        "login-abort-generic": "Jūsų prisijungimas buvo nesėkmingas - Nutraukta",
        "loginlanguagelabel": "Kalba: $1",
        "suspicious-userlogout": "Jūsų prašymas atsijungti buvo atmestas, nes, atrodo, jį klaidingai išsiuntė naršyklė arba spartinantysis tarpinis serveris.",
        "newpassword": "Naujas slaptažodis:",
        "retypenew": "Pakartokite naują slaptažodį:",
        "resetpass_submit": "Nustatyti slaptažodį ir prisijungti",
-       "changepassword-success": "Jūsų slaptažodis pakeistas sėkmingai! Dabar prisijungiama...",
+       "changepassword-success": "Jūsų slaptažodis pakeistas sėkmingai!",
        "resetpass_forbidden": "Slaptažodžiai negali būti pakeisti",
        "resetpass-no-info": "Jūs turite būti prisijungęs, kad pasiektumėte puslapį tiesiogiai.",
        "resetpass-submit-loggedin": "Keisti slaptažodį",
        "savearticle": "Išsaugoti puslapį",
        "preview": "Peržiūra",
        "showpreview": "Rodyti peržiūrą",
-       "showlivepreview": "Tiesioginė peržiūra",
        "showdiff": "Rodyti skirtumus",
        "anoneditwarning": "'''Dėmesio:''' Jūs nesate prisijungęs. Jūsų IP adresas bus įrašytas į šio puslapio istoriją.",
        "anonpreviewwarning": "''Jūs nesate prisijungęs. Išsaugojant jūsų IP adresas bus rodomas šio puslapio redagavimo istorijoje.''",
        "edit-gone-missing": "Negalima atnaujinti puslapio.\nGreičiausiai jis yra ištrintas.",
        "edit-conflict": "Redagavimo konfliktas.",
        "edit-no-change": "Jūsų keitimas buvo ignoruotas kadangi nebuvo atlikta jokių teksto pakeitimų.",
-       "postedit-confirmation": "Jūsų pakeitimas išsaugotas.",
+       "postedit-confirmation-saved": "Jūsų pakeitimas išsaugotas.",
        "edit-already-exists": "Negalima sukurti naujo puslapio.\nJis jau egzistuoja.",
        "defaultmessagetext": "Numatytasis pranešimo tekstas",
        "invalid-content-data": "Neleistinas turinys.",
        "content-not-allowed-here": "Turinys \"$1\" puslapyje [[$2]] nėra leistinas.",
        "editwarning-warning": "Palikdamas šį puslapį jūs prarasite visus padarytus pakeitimus.",
+       "editpage-notsupportedcontentformat-title": "Turinio formatas nepalaikomas",
+       "editpage-notsupportedcontentformat-text": "Turinio formatas $1 nepalaiko turinio modelio $2.",
        "content-model-wikitext": "wikitekstas",
        "content-model-text": "paprastasis tekstas",
        "content-model-javascript": "JavaScript",
        "search-nonefound": "Nėra rezultatų, atitinkančių užklausą.",
        "powersearch-legend": "Išplėstinė paieška",
        "powersearch-ns": "Ieškoti vardų srityse:",
-       "powersearch-redir": "Įtraukti peradresavimus",
        "powersearch-togglelabel": "Pažymėti:",
        "powersearch-toggleall": "Viską",
        "powersearch-togglenone": "Nieko",
        "badsig": "Neteisingas parašas; patikrinkite HTML žymes.",
        "badsiglength": "Jūsų parašas per ilgas.\nJį turi sudaryti ne daugiau kaip $1 {{PLURAL:$1|simbolis|simboliai|simbolių}}.",
        "yourgender": "Lytis:",
-       "gender-unknown": "Nenurodyta",
-       "gender-male": "Vyras",
-       "gender-female": "Moteris",
+       "gender-unknown": "Aš nenoriu pasakyti",
+       "gender-male": "Jis redaguoja wiki puslapius",
+       "gender-female": "Ji redaguoja wiki puslapius",
        "prefs-help-gender": "Pasirinktinai: naudojama teisingam sistemos kreipimuisi į jus.\nŠi informacija yra vieša.",
        "email": "El. paštas",
        "prefs-help-realname": "Tikrasis vardas yra neprivalomas.\nJei jūs jį įvesite, jis bus naudojamas pažymėti jūsų darbą.",
        "prefs-signature": "Parašas",
        "prefs-dateformat": "Datos formatas",
        "prefs-timeoffset": "Laiko skirtumas",
-       "prefs-advancedediting": "Bendras",
+       "prefs-advancedediting": "Bendrosios parinktys",
        "prefs-editor": "Redaktorius",
        "prefs-preview": "Peržiūra",
        "prefs-advancedrc": "Papildomi nustatymai",
        "prefs-advancedsearchoptions": "Papildomi nustatymai",
        "prefs-advancedwatchlist": "Papildomi nustatymai",
        "prefs-displayrc": "Rodymo nustatymai",
-       "prefs-displaysearchoptions": "Rodymo nuostatos",
        "prefs-displaywatchlist": "Rodymo nuostatos",
        "prefs-diffs": "Skirtumai",
        "email-address-validity-valid": "Panašu, kad E-pašto adresas yra teisingas",
        "userrights-no-interwiki": "Jūs neturite leidimo keisti naudotojų teises kituose projektuose.",
        "userrights-nodatabase": "Duomenų bazė $1 neegzistuoja arba yra ne vietinė.",
        "userrights-nologin": "Jūs privalote [[Special:UserLogin|prisijungti]] kaip administratorius, kad galėtumėte priskirti naudotojų teises.",
-       "userrights-notallowed": "Jūsų paskyra neturi teisių priskirti ar panaikinti naudotojų teises.",
+       "userrights-notallowed": "Jūs neturite leidimo įtraukti arba pašalinti vartotojo teisių.",
        "userrights-changeable-col": "Grupės, kurias galite keisti",
        "userrights-unchangeable-col": "Grupės, kurių negalite keisti",
        "userrights-conflict": "Naudotojo teisių konfliktas! Prašome dar kartą taikyti savo keitimus.",
        "right-reupload-shared": "Perrašyti failus bendrojoje failų saugykloje lokaliai",
        "right-upload_by_url": "Įkelti failą iš URL adreso",
        "right-purge": "Išvalyti svetainės podėlį puslapiui be patvirtinimo",
-       "right-autoconfirmed": "Redaguoti pusiau užrakintus puslapius",
+       "right-autoconfirmed": "Netaikyti greičio apribojimų",
        "right-bot": "Laikyti automatiniu procesu",
        "right-nominornewtalk": "Atlikus smulkių keitimų aptarimų puslapiuose įjungia pranešimą apie naujas žinutes",
        "right-apihighlimits": "Mažesni apribojimai API užklausoms",
        "action-viewmyprivateinfo": "peržiūrėti jūsų privačią informaciją",
        "action-editmyprivateinfo": "redaguoti savo privačią informaciją",
        "nchanges": "$1 {{PLURAL:$1|pakeitimas|pakeitimai|pakeitimų}}",
+       "enhancedrc-history": "istorija",
        "recentchanges": "Naujausi keitimai",
        "recentchanges-legend": "Naujausių keitimų parinktys",
        "recentchanges-summary": "Šiame puslapyje yra patys naujausi pakeitimai šiame projekte.",
        "recentchanges-label-plusminus": "Šiuo baitų skaičiumi pakeista puslapio apimtis",
        "recentchanges-legend-newpage": "$1 - naujas puslapis",
        "rcnotefrom": "Žemiau yra pakeitimai pradedant <strong>$2</strong> (rodoma iki <strong>$1</strong> pakeitimų).",
-       "rclistfrom": "Rodyti naujus pakeitimus pradedant $1",
+       "rclistfrom": "Rodyti naujus pakeitimus pradedant $3 $2",
        "rcshowhideminor": "$1 smulkius keitimus",
        "rcshowhideminor-show": "Rodyti",
        "rcshowhideminor-hide": "Slėpti",
        "uploadstash-refresh": "Atnaujinti failų sąrašą",
        "invalid-chunk-offset": "Neleistinas segmento poslinkis",
        "img-auth-accessdenied": "Prieiga uždrausta",
-       "img-auth-nopathinfo": "Trūksta PATH_INFO.\nJūsų serveris nenustatytas perduoti šią informaciją.\nTai gali būti CGI paremta ir negali palaikyti img_auth.\nDaugiau informacijos https://www.mediawiki.org/wiki/Manual:Image_Authorization. žr.",
+       "img-auth-nopathinfo": "Trūksta PATH_INFO.\nJūsų serveris nenustatytas perduoti šią informaciją.\nTai gali būti CGI paremta ir negali palaikyti img_auth.\nDaugiau informacijos https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization. žr.",
        "img-auth-notindir": "Užklaustas kelias nėra sukonfigūruotame įkėlimo kataloge.",
        "img-auth-badtitle": "Nepavyksta padaryti leistino pavadinimo iš „$1“.",
        "img-auth-nologinnWL": "Jūs nesate prisijungęs ir „$1“ nėra baltajame sąraše.",
        "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",
        "protectedpages": "Užrakinti puslapiai",
        "protectedpages-indef": "Tik neapibrėžtos apsaugos",
        "protectedpages-cascade": "Tik pakopinė apsauga",
+       "protectedpages-noredirect": "Slėpti peradresavimus",
        "protectedpagesempty": "Šiuo metu nėra apsaugotas joks failas su šiais parametrais.",
+       "protectedpages-timestamp": "Laiko žyma",
        "protectedpages-page": "Puslapis",
        "protectedpages-expiry": "Galioja iki",
        "protectedpages-reason": "Priežastis",
+       "protectedpages-unknown-timestamp": "Nežinomas",
+       "protectedpages-unknown-performer": "Nežinomas vartotojas",
        "protectedtitles": "Apsaugoti pavadinimai",
        "protectedtitlesempty": "Šiuo metu nėra jokių pavadinimų apsaugotų šiais parametrais.",
        "listusers": "Naudotojų sąrašas",
        "watchlist-details": "Stebima {{PLURAL:$1|$1 puslapis|$1 puslapiai|$1 puslapių}} neskaičiuojant aptarimų puslapių.",
        "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'''",
-       "watchmethod-recent": "tikrinami naujausi stebimųjų puslapių pakeitimai",
-       "watchmethod-list": "ieškoma naujausių keitimų stebimuose puslapiuose",
-       "watchlistcontains": "Jūsų stebimųjų sąraše yra $1 {{PLURAL:$1|puslapis|puslapiai|puslapių}}.",
-       "iteminvalidname": "Problema su elementu „$1“, neteisingas vardas...",
        "wlshowlast": "Rodyti paskutinių $1 valandų, $2 dienų ar $3 pakeitimus",
        "watchlist-options": "Stebimųjų sąrašo parinktys",
        "watching": "Įtraukiama į stebimųjų sąrašą...",
        "enotif_lastvisited": "Užeikite į $1, jei norite matyti pakeitimus nuo paskutiniojo apsilankymo.",
        "enotif_lastdiff": "Užeikite į $1, jei norite pamatyti šį pakeitimą.",
        "enotif_anon_editor": "anoniminis naudotojas $1",
-       "enotif_body": "$WATCHINGUSERNAME,\n\n\n$PAGEEDITDATE {{SITENAME}} projekte $PAGEEDITOR $CHANGEDORCREATED puslapį „$PAGETITLE“, dabartinę versiją rasite adresu $PAGETITLE_URL.\n\n$NEWPAGE\n\nRedaguotojo komentaras: $PAGESUMMARY $PAGEMINOREDIT\n\nSusisiekti su redaguotoju:\nel. paštu: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nDaugiau pranešimų apie vėlesnius pakeitimus nebus siunčiama, jei neapsilankysite puslapyje.\nJūs taip pat galite išjungti pranešimo žymę visiems jūsų stebimiems puslapiams savo stebimųjų sąraše.\n\n Jūsų draugiškoji projekto {{SITENAME}} pranešimų sistema\n\n--\nNorėdami pakeisti e-paštu siunčiamų pranešimų nustatymus, užeikite į\n{{canonicalurl:{{#special:Preferences}}}}\n\nNorėdami pakeisti stebimų puslapių nustatymus, užeikite į\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nNorėdami puslapį iš stebimų puslapių sąrašo, užeikite į\n$UNWATCHURL\n\nAtsiliepimai ir pagalba:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "$WATCHINGUSERNAME,\n\n\n$PAGEEDITDATE {{SITENAME}} projekte $PAGEEDITOR $CHANGEDORCREATED puslapį „$PAGETITLE“, dabartinę versiją rasite adresu $PAGETITLE_URL.\n\n$NEWPAGE\n\nRedaguotojo komentaras: $PAGESUMMARY $PAGEMINOREDIT\n\nSusisiekti su redaguotoju:\nel. paštu: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nDaugiau pranešimų apie vėlesnius pakeitimus nebus siunčiama, jei neapsilankysite puslapyje.\nJūs taip pat galite išjungti pranešimo žymę visiems jūsų stebimiems puslapiams savo stebimųjų sąraše.\n\n Jūsų draugiškoji projekto {{SITENAME}} pranešimų sistema\n\n--\nNorėdami pakeisti e-paštu siunčiamų pranešimų nustatymus, užeikite į\n{{canonicalurl:{{#special:Preferences}}}}\n\nNorėdami pakeisti stebimų puslapių nustatymus, užeikite į\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nNorėdami puslapį iš stebimų puslapių sąrašo, užeikite į\n$UNWATCHURL\n\nAtsiliepimai ir pagalba:\n$HELPPAGE",
        "created": "sukurė",
        "changed": "pakeitė",
        "deletepage": "Trinti puslapį",
        "undeletedrevisions": "{{PLURAL:$1|atkurta $1 versija|atkurtos $1 versijos|atkurta $1 versijų}}",
        "undeletedrevisions-files": "{{PLURAL:$1|atkurta $1 versija|atkurtos $1 versijos|atkurta $1 versijų}} ir $2 {{PLURAL:$2|failas|failai|failų}}",
        "undeletedfiles": "{{PLURAL:$1|atkurtas $1 failas|atkurti $1 failai|atkurta $1 failų}}",
-       "cannotundelete": "Atkūrimas nepavyko; kažkas kitas pirmas galėjo atkurti puslapį.",
+       "cannotundelete": "Atkūrimas nepavyko:\n$1",
        "undeletedpage": "'''$1 buvo atkurtas'''\n\nPeržiūrėkite [[Special:Log/delete|trynimų sąrašą]], norėdami rasti paskutinių trynimų ir atkūrimų sąrašą.",
        "undelete-header": "Kad sužinotumėte, kurie puslapiai paskiausiai ištrinti, žiūrėkite [[Special:Log/delete|šalinimų sąrašą]].",
        "undelete-search-title": "Panaikintų puslapių paieška",
        "blockip": "Blokuoti naudotoją",
        "blockip-legend": "Blokuoti naudotoją",
        "blockiptext": "Naudokite šią formą, kad uždraustumėte redagavimo prieigą pasirinktam IP adresui ar naudotojui. Tai turėtų būti atliekama tik tam, kad sustabdytumėte vandalizmą, ir neprieštarauti [[{{MediaWiki:Policy-url}}|projekte galiojančioms taisyklėms]].\nŽemiau pateikite tikslią priežastį (pavyzdžiui, nurodydami sugadintus puslapius).",
-       "ipadressorusername": "IP adresas arba naudotojo vardas",
+       "ipaddressorusername": "IP adresas arba naudotojo vardas",
        "ipbexpiry": "Galiojimo laikas",
        "ipbreason": "Priežastis:",
        "ipbreason-dropdown": "*Bendrosios blokavimo priežastys\n** Klaidingos informacijos įterpimas\n** Turinio šalinimas iš puslapių\n** Kitų svetainių reklamavimas\n** Nesusijusio arba beprasmio teksto įterpimas į puslapius\n** Gąsdinimai/įžeidinėjimai\n** Piktnaudžiavimas keliomis paskyromis\n** Nepriimtinas naudotojo vardas",
        "monobook.css": "/* Čia įdėtas CSS bus rodomas Monobook išvaizdos naudotojams */",
        "common.js": "/* Bet koks čia parašytas JavaScript bus rodomas kiekviename puslapyje kievienam naudotojui. */",
        "monobook.js": "/* Šis JavaScript bus įkeltas tik „MonoBook“ išvaizdos naudotojams. */",
-       "notacceptable": "Projekto serveris negali pateikti duomenų formatu, kurį jūsų klientas galėtų skaityti.",
        "anonymous": "{{SITENAME}} {{PLURAL:$1|anoniminis naudotojas|anoniminiai naudotojai}}",
        "siteuser": "{{SITENAME}} {{GENDER:$2|naudotojas|naudotoja}} $1",
        "anonuser": "{{SITENAME}} anoniminis naudotojas $1",
        "newimages-summary": "Šis specialus puslapis rodo paskiausiai įkeltus failus.",
        "newimages-legend": "Filtras",
        "newimages-label": "Failo vardas (ar jo dalis):",
-       "showhidebots": "($1 robotus)",
        "noimages": "Nėra ką parodyti.",
        "ilsubmit": "Ieškoti",
        "bydate": "pagal datą",
        "size-kilobytes": "$1 KiB",
        "size-megabytes": "$1 MiB",
        "size-gigabytes": "$1 GiB",
-       "livepreview-loading": "Įkeliama…",
-       "livepreview-ready": "Įkeliama… Paruošta!",
-       "livepreview-failed": "Nepavyko tiesioginė peržiūra! Pamėginkite paprastąją peržiūrą.",
-       "livepreview-error": "Nepavyko prisijungti: $1 „$2“. Pamėginkite paprastąją peržiūrą.",
        "lag-warn-normal": "Pakeitimai, naujesni nei $1 {{PLURAL:$1|sekundė|sekundės|sekundžių}}, šiame sąraše gali būti nerodomi.",
        "lag-warn-high": "Dėl didelio duomenų bazės atsilikimo pakeitimai, naujesni nei $1 {{PLURAL:$1|sekundė|sekundės|sekundžių}}, šiame sąraše gali būti nerodomi.",
-       "watchlistedit-numitems": "Jūsų stebimųjų sąraše yra $1 {{PLURAL:$1|puslapis|puslapiai|puslapių}} neskaičiuojant aptarimų puslapių.",
-       "watchlistedit-noitems": "Jūsų stebimųjų sąraše nėra jokių puslapių.",
        "watchlistedit-normal-title": "Redaguoti stebimųjų sąrašą",
        "watchlistedit-normal-legend": "Šalinti puslapius iš stebimųjų sąrašo",
        "watchlistedit-normal-explain": "Žemiau yra rodomi puslapiai jūsų stebimųjų sąraše.\nNorėdami pašalinti puslapį, prie jo uždėkite varnelė ir paspauskite „{{int:Watchlistedit-normal-submit}}“.\nJūs taip pat galite [[Special:EditWatchlist/raw|redaguoti grynąjį stebimųjų sąrašą]].",
        "fileduplicatesearch-result-n": "Šis failas „$1“ turi $2 {{PLURAL:$2|identišką dublikatą|identiškus dublikatus|identiškų dublikatų}}.",
        "fileduplicatesearch-noresults": "Nėra failo pavadinimu \"$1\".",
        "specialpages": "Specialieji puslapiai",
-       "specialpages-note": " * įprastą specialius puslapius.\n * <span class=\"mw-specialpagerestricted\">tik specialius puslapius.</span>\n * <span class=\"mw-specialpagecached\">Talpyklinių specialius puslapius (gali būti pasenusius).</span>",
+       "specialpages-note": "* Įprastą specialius puslapius.\n* <span class=\"mw-specialpagerestricted\">Tik specialius puslapius.</span>",
        "specialpages-group-maintenance": "Sistemos palaikymo pranešimai",
        "specialpages-group-other": "Kiti specialieji puslapiai",
        "specialpages-group-login": "Prisijungti / sukurti paskyrą",
        "compare-invalid-title": "Jūsų nurodytas pavadinimas neleistinas.",
        "compare-title-not-exists": "Pavadinimas, kurį nurodėte, neegzistuoja.",
        "compare-revision-not-exists": "Keitimas, kurį nurodėte, neegzistuoja.",
-       "dberr-header": "Ši svetainė turi problemų.",
        "dberr-problems": "Atsiprašome! Svetainei iškilo techninių problemų.",
        "dberr-again": "Palaukite kelias minutes ir perkraukite puslapį.",
        "dberr-info": "(Nepavyksta pasiekti duomenų bazės serverio: $1)",
index 4e5b763..e81281e 100644 (file)
@@ -4,7 +4,8 @@
                        "Dark Eagle",
                        "Gleb Borisov",
                        "Jureits",
-                       "Reedy"
+                       "Reedy",
+                       "아라"
                ]
        },
        "tog-showhiddencats": "Ruodeit nūglobuotys kategorejis",
        "searchall": "vysi",
        "powersearch-legend": "Smolkuo mekliešona",
        "powersearch-ns": "Meklēt itamuos lopu grupuos:",
-       "powersearch-redir": "Ruodeit puoradresacejis",
        "powersearch-toggleall": "Vysi",
        "powersearch-togglenone": "Nikas",
        "preferences": "Īstatejumi",
        "recentchanges": "Nasenejis puormejis",
        "recentchanges-legend": "Pādejūs izmaiņu īspiejis",
        "recentchanges-feed-description": "Redzit jaunuokuos wiki izmainis ar itīm pādim.",
-       "rclistfrom": "Paruodeit jaunys izmainis nu $1",
+       "rclistfrom": "Paruodeit jaunys izmainis nu $3 $2",
        "rcshowhideminor": "$1 nasvareigūs",
        "rcshowhidebots": "$1 robotprogramys",
        "rcshowhideliu": "$1 dasaslāgtu lītuotuoju",
index 51185c7..4c75d41 100644 (file)
@@ -2,7 +2,8 @@
        "@metadata": {
                "authors": [
                        "Lpachuau",
-                       "RMizo"
+                       "RMizo",
+                       "아라"
                ]
        },
        "tog-underline": "Zawmna hnuairinna",
@@ -15,7 +16,6 @@
        "tog-showtoolbar": "Siamṭhatna hmanraw-liang tilang rawh (JavaScript a ngai)",
        "tog-editondblclick": "Hmehphìrin phêk siamṭha rawh (JavaScript a ngai)",
        "tog-editsectiononrightclick": "Hlawm thupui ding-hmeh hmangin hlawm siamţhat theihna awmtir rawh (JavaScript a ngai)",
-       "tog-rememberpassword": "He ka rangpuifannaah hian min hre reng rawh (a rei berah ni $1  {{PLURAL:$1}})",
        "tog-watchcreations": "Ka phêk siamte leh ka taksa hlankaite ka ralvèn zing-ah telh rawh",
        "tog-watchdefault": "Ka phêk siamţhatte ka ralvèn zing-ah telh rawh",
        "tog-watchmoves": "Ka phêk leh taksa sawnte ka ralvèn zing-ah telh rawh",
        "readonly_lag": "Database salin a pu a umphâk laiin database amahin inkhar behtir a ni.",
        "internalerror": "Chhunglam dik loh",
        "internalerror_info": "Chhunglam dik loh: $1",
-       "fileappenderrorread": "A hmawrbawk laiin \"$1\" a chhiar thei lo.",
-       "fileappenderror": "\"$1\"-a \"$2\" hmawrbawk theih a ni lo.",
        "filecopyerror": "Taksa \"$1\" hi \"$2\"-a lakchhawn theih a ni lo.",
        "filerenameerror": "Taksa \"$1\" hi hming dang, \"$2\"-ah a thlâk thei lo.",
        "filedeleteerror": "Taksa \"$1\" nuaibo thei lo tlat.",
        "directorycreateerror": "Bawmpui \"$1\" siam theih a ni lo.",
        "filenotfound": "Taksa \"$1\" hmuh theih a ni lo.",
-       "fileexistserror": "Taksa \"$1\" ziah theih a ni lo: Taksa chu a awm si.",
        "unexpected": "Hlutzawng beisei loh: \"$1\"=\"$2\".",
        "formerror": "Dikhlel: Lehkha thehluh theih a ni lo.",
        "badarticleerror": "He phêkah hian tuna i tih tum ang kha tih theih a ni lo.",
        "savearticle": "Tlangzarh rawh le",
        "preview": "Enchhinna",
        "showpreview": "Tlangzarh hmaa endikna",
-       "showlivepreview": "Endik thuakna",
        "showdiff": "Tihdanglam tihlanna",
        "anoneditwarning": "'''Vaukhanna:''' I inziaklût lo tlat.\nI chenhmun-IP he phêk chanchinah chhinchhian a ni ang.",
        "anonpreviewwarning": "''I inziaklût lo. I dahţhat chuan he phêk siamţhat chanchinah i chenhmun-IP hi chhinchhian a ni ang.''",
        "search-nonefound": "I zawn mil a awm lo",
        "powersearch-legend": "Zawnna chi sang",
        "powersearch-ns": "Hemi hminghmun chhungah hian zawng rawh:",
-       "powersearch-redir": "Thawnkual ngaiho",
        "powersearch-togglelabel": "Thai rawh:",
        "powersearch-toggleall": "A vaiin",
        "powersearch-togglenone": "Pakhat mah",
        "prefs-advancedsearchoptions": "Duhthlan ràiril",
        "prefs-advancedwatchlist": "Duhthlan ràiril",
        "prefs-displayrc": "Duhthlanna tilang rawh",
-       "prefs-displaysearchoptions": "Duhthlanna tilang rawh",
        "prefs-displaywatchlist": "Duhthlanna tilang rawh",
        "prefs-diffs": "Danglamna",
        "email-address-validity-valid": "E-chenhmun a dik hmel",
        "recentchanges-label-bot": "He siamţhat hi khawlmi tih a ni",
        "recentchanges-label-unpatrolled": "He siamţhat hi viltu la nei lo a ni",
        "rcnotefrom": "'''$2''' hnua tihdanglamna zawng zawng a hnuaiah khuan kan rawn tilang e ('''$1''' thleng chauh tihlan a ni).",
-       "rclistfrom": "$1 hnu lama tihdanglama tihlanna",
+       "rclistfrom": "$3 $2 hnu lama tihdanglama tihlanna",
        "rcshowhideminor": "siamţhat tenau $1",
        "rcshowhidebots": "Khawlmi $1",
        "rcshowhideliu": "hmangtu inziaklut $1",
        "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.",
-       "watchmethod-recent": "phêk vèn tihdanglam leh danglam loh kan enfiah mek!",
-       "watchmethod-list": "phêk vèn tunhnaia tihdanglam a awm em kan enfiah",
-       "watchlistcontains": "{{PLURAL:$1|phêk|}} $1 ral i veng.",
        "wlshowlast": "Darkar $1 kalta-a tihdanglam tilang rawh , ni $2 kalta-a tihdanglam tilang rawh, $3 tilang rawh",
        "watchlist-options": "Ralvèn duhdàn",
        "enotif_reset": "Phêk zawng zawng tlawh tawh vek angin chhinchhiah rawh.",
index ffb2a9e..781b149 100644 (file)
@@ -19,7 +19,8 @@
                        "Srolanh",
                        "Xil",
                        "Yyy",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Pasvītrot saites:",
        "missingarticle-diff": "(Salīdz.: $1, $2)",
        "internalerror": "Iekšēja kļūda",
        "internalerror_info": "Iekšējā kļūda: $1",
-       "fileappenderror": "Neizdevās pievienot \"$1\" pie \"$2\".",
        "filecopyerror": "Nav iespējams nokopēt failu \"$1\" uz \"$2\"",
        "filerenameerror": "Neizdevās pārdēvēt failu \"$1\" par \"$2\".",
        "filedeleteerror": "Nevar izdzēst failu \"$1\".",
        "directorycreateerror": "Nevar izveidot mapi \"$1\".",
        "filenotfound": "Neizdevās atrast failu \"$1\".",
-       "fileexistserror": "Nevar saglabāt failā \"$1\": fails jau pastāv",
        "unexpected": "Negaidīta vērtība: \"$1\"=\"$2\".",
        "formerror": "Kļūda: neizdevās nosūtīt saturu",
        "badarticleerror": "Šo darbību nevar veikt šajā lapā.",
        "userlogin-resetlink": "Esat aizmirsis savu pieslēgšanās informāciju?",
        "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",
-       "createacct-join": "Ievadiet savu informāciju zemāk.",
-       "createacct-another-join": "Ievadiet jaunā konta informāciju zemāk.",
        "createacct-emailrequired": "E-pasta adrese",
        "createacct-emailoptional": "E-pasta adrese (nav obligāta)",
        "createacct-email-ph": "Ievadiet savu e-pasta adresi",
        "savearticle": "Saglabāt lapu",
        "preview": "Pirmskats",
        "showpreview": "Rādīt pirmskatu",
-       "showlivepreview": "Tūlītējs pirmskats",
        "showdiff": "Rādīt izmaiņas",
        "anoneditwarning": "'''Uzmanību:''' tu neesi iegājis. Lapas hronoloģijā tiks ierakstīta tava IP adrese.",
        "anonpreviewwarning": "''Tu neesi ienācis. Saglabājot lapu, Tava IP adrese tiks ierakstīta šīs lapas hronoloģijā.''",
        "edit-gone-missing": "Nevar atjaunināt lapu.\nIzskatās, ka lapa ir dzēsta.",
        "edit-conflict": "Labošanas konflikts.",
        "edit-no-change": "Tavs labojums tika ignorēts, jo tekstā netika izdarītas izmaiņas.",
-       "postedit-confirmation": "Jūsu labojums tika saglabāts.",
+       "postedit-confirmation-saved": "Jūsu labojums tika saglabāts.",
        "edit-already-exists": "Nevar izveidot jaunu lapu.\nTā jau eksistē.",
        "defaultmessagetext": "Noklusētais ziņojuma teksts",
        "invalid-content-data": "Nederīgi satura dati",
        "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:",
-       "powersearch-redir": "Parādīt pāradresācijas",
        "powersearch-togglelabel": "Pārbaudīt:",
        "powersearch-toggleall": "Viss",
        "powersearch-togglenone": "Neviena",
        "prefs-advancedsearchoptions": "Papildu uzstādījumi",
        "prefs-advancedwatchlist": "Papildu uzstādījumi",
        "prefs-displayrc": "Pamatuzstādījumi",
-       "prefs-displaysearchoptions": "Pamatuzstādījumi",
        "prefs-displaywatchlist": "Pamatuzstādījumi",
        "prefs-diffs": "Izmaiņas",
        "prefs-help-prefershttps": "Šie uzstādījumi stāsies spēkā nākamajā pievienošanās reizē.",
        "recentchanges-legend-heading": "'''Apzīmējumi:'''",
        "recentchanges-legend-newpage": "(skatīt arī [[Special:NewPages|jaunās lapas]])",
        "rcnotefrom": "Šobrīd redzamas izmaiņas kopš '''$2''' (parādītas ne vairāk par '''$1''').",
-       "rclistfrom": "Parādīt jaunas izmaiņas kopš $1",
+       "rclistfrom": "Parādīt jaunas izmaiņas kopš $3 $2",
        "rcshowhideminor": "$1 maznozīmīgos",
        "rcshowhidebots": "$1 botus",
        "rcshowhideliu": "$1 reģistrētos lietotājus",
        "uploadstash-errclear": "Failu tīrīšana bija neveiksmīga.",
        "uploadstash-refresh": "Atsvaidzināt failu sarakstu",
        "img-auth-accessdenied": "Pieeja liegta",
-       "img-auth-nopathinfo": "Trūkst PATH_INFO.\nJūsu serveris nav konfigurēts nodot šo informāciju.\nTas var būt bāzēts uz CGI un neatbalstīt img_auth.\nSkatīt https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "Trūkst PATH_INFO.\nJūsu serveris nav konfigurēts nodot šo informāciju.\nTas var būt bāzēts uz CGI un neatbalstīt img_auth.\nSkatīt https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-nologinnWL": "Jūs neesat iegājis un \"$1\" nav baltajā sarakstā.",
        "img-auth-nofile": "Fails \"$1\" nepastāv.",
        "img-auth-isdir": "Jūs mēģinājāt piekļūt direktorijai \"$1\".\nAtļauta ir tikai failu piekļuve.",
        "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",
-       "watchlistcontains": "Tavā uzraugāmo lapu sarakstā ir $1 {{PLURAL:$1|lapa|lapas}}.",
-       "iteminvalidname": "Problēma ar '$1' vienību, nederīgs nosaukums...",
        "wlshowlast": "Parādīt izmaiņas pēdējo $1 stundu laikā vai $2 dienu laikā, vai arī $3.",
        "watchlist-options": "Uzraugāmo rakstu saraksta opcijas",
        "watching": "Uzrauga...",
        "enotif_lastvisited": "$1 lai apskatītos visas izmaiņas kopš tava pēdējā apmeklējuma.",
        "enotif_lastdiff": "$1 lai apskatītos šo izmaiņu.",
        "enotif_anon_editor": "anonīms lietotājs $1",
-       "enotif_body": "$WATCHINGUSERNAME,\n\n\n{{grammar:ģenitīvs|{{SITENAME}}}} lapu $PAGETITLE $CHANGEDORCREATED $PAGEEDITOR, $PAGEEDITDATE, pašreizējā versja ir $PAGETITLE_URL.\n\n$NEWPAGE\n\nIzmaiņu kopsavilkums bija: $PAGESUMMARY $PAGEMINOREDIT\n\nSazināties ar attiecīgo lietotāju:\ne-pasts: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nJa šo uzraugāmo lapu izmainīs vēl, turpmāku paziņojumu par to nebūs, kamēr tu to neatvērsi.\nTu arī vari atstatīt visu uzraugāmo lapu paziņojumu statusus uzraugāmo lapu sarakstā.\n\n             {{grammar:ģenitīvs|{{SITENAME}}}} paziņojumu sistēma\n\n--\nLai izmainītu uzraugāmo lapu saraksta uzstādījumus:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nLai dzēstu lapu no uzraugāmo lapu saraksta:\n$UNWATCHURL\n\nPapildinformācija:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "$WATCHINGUSERNAME,\n\n\n{{grammar:ģenitīvs|{{SITENAME}}}} lapu $PAGETITLE $CHANGEDORCREATED $PAGEEDITOR, $PAGEEDITDATE, pašreizējā versja ir $PAGETITLE_URL.\n\n$NEWPAGE\n\nIzmaiņu kopsavilkums bija: $PAGESUMMARY $PAGEMINOREDIT\n\nSazināties ar attiecīgo lietotāju:\ne-pasts: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nJa šo uzraugāmo lapu izmainīs vēl, turpmāku paziņojumu par to nebūs, kamēr tu to neatvērsi.\nTu arī vari atstatīt visu uzraugāmo lapu paziņojumu statusus uzraugāmo lapu sarakstā.\n\n             {{grammar:ģenitīvs|{{SITENAME}}}} paziņojumu sistēma\n\n--\nLai izmainītu uzraugāmo lapu saraksta uzstādījumus:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nLai dzēstu lapu no uzraugāmo lapu saraksta:\n$UNWATCHURL\n\nPapildinformācija:\n$HELPPAGE",
        "created": "izveidoja",
        "changed": "izmainīja",
        "deletepage": "Dzēst lapu",
        "blockip": "Bloķēt lietotāju",
        "blockip-legend": "Bloķēt lietotāju",
        "blockiptext": "Šo veidni izmanto, lai bloķētu kādas IP adreses vai lietotājvārda piekļuvi wiki lapu saglabāšanai. Dari to tikai, lai novērstu vandālismu atbilstoši [[{{MediaWiki:Policy-url}}|noteikumiem]].\nNorādi konkrētu iemeslu (piemēram, linkus uz vandalizētajām lapām).",
-       "ipadressorusername": "IP adrese vai lietotājvārds",
+       "ipaddressorusername": "IP adrese vai lietotājvārds",
        "ipbexpiry": "Termiņš",
        "ipbreason": "Iemesls:",
        "ipbreason-dropdown": "*Biežākie bloķēšanas iemesli\n** Ievieto nepatiesu informāciju\n** Dzēš lapu saturu\n** Spamo ārējās saitēs\n** Ievieto nesakarīgus simbolus sakopojumus\n** Nepieņemama uzvedība un apvainojumi\n** Vairāku kontu ļaunprātīga izmantošana\n** Nepieņemams lietotājvārds",
        "tooltip-undo": "\"Atgriezt\" atgriež šīs izmaiņas un atver labošanas formu priekšskatījuma veidā.\nTas atļauj pievienot iemeslu kopsavilkumā.",
        "tooltip-preferences-save": "Saglabāt iestatījumus",
        "tooltip-summary": "Ievadiet īsu kopsavilkumu",
-       "notacceptable": "Vikipēdijas serveris nevar sniegt datus Jūsu klientam nolasāmā formātā.",
        "anonymous": "{{PLURAL:$1|Anonīmais {{grammar:ģenitīvs|{{SITENAME}}}} lietotājs|Anonīmie {{grammar:ģenitīvs|{{SITENAME}}}} lietotāji}}",
        "siteuser": "{{grammar:ģenitīvs|{{SITENAME}}}} lietotājs $1",
        "anonuser": "{{SITENAME}} anonīms lietotājs $1",
        "newimages-summary": "Šeit var apskatīties pēdējos šeit augšuplādētos failus.",
        "newimages-legend": "Filtrs",
        "newimages-label": "Faila nosaukums (vai tā daļa):",
-       "showhidebots": "($1 botus)",
        "noimages": "Nav nekā ko redzēt.",
        "ilsubmit": "Meklēt",
        "bydate": "<b>pēc datuma</b>",
        "autosumm-replace": "Aizvieto lapas saturu ar '$1'",
        "autoredircomment": "Pāradresē uz [[$1]]",
        "autosumm-new": "Jauna lapa: $1",
-       "livepreview-loading": "Ielādē…",
-       "livepreview-ready": "Ielādējas… Gatavs!",
-       "livepreview-failed": "Tūlītējais pirmskats nobruka! Pamēģini parasto pirmskatu.",
-       "livepreview-error": "Neizdevās pievienoties: $1 \"$2\". Pamēģini parasto pirmskatu.",
        "lag-warn-normal": "Izmaiņas, kas ir jaunākas par  $1 {{PLURAL:$1|sekundi|sekundēm}}, var neparādīties šajā sarakstā.",
        "lag-warn-high": "Sakarā ar lielu datubāzes servera lagu, izmaiņas, kas svaigākas par $1 {{PLURAL:$1|sekundi|sekundēm}}, šajā sarakstā var neparādīties.",
-       "watchlistedit-numitems": "Tavs uzraugāmo lapu saraksts satur {{PLURAL:$1|1 lapu|$1 lapas}}, neieskaitot diskusiju lapas.",
-       "watchlistedit-noitems": "Tavs uzraugāmo rakstu saraksts ir tukšs.",
        "watchlistedit-normal-title": "Izmainīt uzraugāmo rakstu sarakstu",
        "watchlistedit-normal-legend": "Noņemt lapas (virsrakstus) no uzraugāmo rakstu saraksta",
        "watchlistedit-normal-explain": "Tavā uzraugāmo rakstu sarakstā esošās lapas ir redzamas zemāk.\nLai noņemtu lapu, ieķeksē lodziņā pretī lapai un uzspied Noņemt lapas.\nVar arī izmainīt [[Special:EditWatchlist/raw|neapstrādātu sarakstu]] (viens liels teksta lauks).",
        "compare-invalid-title": "Norādītais nosaukums nav derīgs.",
        "compare-title-not-exists": "Norādītais nosaukums neeksistē.",
        "compare-revision-not-exists": "Norādītā versija neeksistē.",
-       "dberr-header": "Šim viki ir problēma",
        "dberr-problems": "Atvainojiet!\nŠai vietnei ir radušās tehniskas problēmas.",
        "dberr-again": "Uzgaidiet dažas minūtes un pārlādējiet šo lapu.",
        "dberr-info": "(Nevar sazināties ar datubāzes serveri: $1)",
index 70c1719..cab767d 100644 (file)
@@ -10,7 +10,8 @@
                        "StephDC",
                        "Super Wang",
                        "Xiaomingyan",
-                       "Yanteng3"
+                       "Yanteng3",
+                       "아라"
                ]
        },
        "tog-underline": "鏈墊線:",
        "missingarticle-diff": "(異:$1,$2)",
        "internalerror": "家誤",
        "internalerror_info": "家誤:$1",
-       "fileappenderrorread": "當附時無讀 \"$1\",未可為也。",
-       "fileappenderror": "\"$2\"附\"$1\",未可為也。",
        "filecopyerror": "\"$1\"謄\"$2\",未可為也。",
        "filerenameerror": "\"$2\"替\"$1\"名,未可為也。",
        "filedeleteerror": "\"$1\"未可刪也。",
        "directorycreateerror": "立目\"$1\",未可為也。",
        "filenotfound": "\"$1\"未見。",
-       "fileexistserror": "\"$1\"存焉,未可儲也。",
        "unexpected": "異數,\"$1\"=\"$2\"。",
        "formerror": "有誤:表不可呈",
        "badarticleerror": "此頁莫為之",
        "savearticle": "存儲",
        "preview": "草覽",
        "showpreview": "草覽",
-       "showlivepreview": "即覽",
        "showdiff": "示異",
        "anoneditwarning": "'''警示:'''子未登簿,IP將誌。",
        "anonpreviewwarning": "''子未登簿,IP將誌。''",
        "edit-gone-missing": "無更頁。\n刪之也。",
        "edit-conflict": "纂突。",
        "edit-no-change": "爾之纂已略,由字無改也。",
-       "postedit-confirmation": "汝之纂已成",
+       "postedit-confirmation-saved": "汝之纂已成",
        "edit-already-exists": "不建新頁。\n已存也。",
        "defaultmessagetext": "慣話文",
        "content-model-css": "層疊樣式表",
        "search-nonefound": "詢中無結。",
        "powersearch-legend": "尋",
        "powersearch-ns": "尋名集:",
-       "powersearch-redir": "轉表",
        "powersearch-togglelabel": "核:",
        "powersearch-toggleall": "全",
        "powersearch-togglenone": "無",
        "prefs-advancedsearchoptions": "進",
        "prefs-advancedwatchlist": "進",
        "prefs-displayrc": "示項",
-       "prefs-displaysearchoptions": "示項",
        "prefs-displaywatchlist": "示項",
        "prefs-diffs": "異",
        "email-address-validity-valid": "電郵有效之",
        "recentchanges-label-unpatrolled": "是纂未巡",
        "recentchanges-legend-newpage": "$1 - 新頁",
        "rcnotefrom": "下為自'''$2'''至'''$1'''之易也。",
-       "rclistfrom": "自$1起之易也",
+       "rclistfrom": "自$3 $2起之易也",
        "rcshowhideminor": "$1校",
        "rcshowhideminor-show": "示",
        "rcshowhideminor-hide": "藏",
        "uploadstash-errclear": "清貢無功也。",
        "uploadstash-refresh": "重載貢表",
        "img-auth-accessdenied": "無通",
-       "img-auth-nopathinfo": "PATH_INFO失之。\n爾之伺服器無此資料也。\n以CGI之本耳,無img_auth矣。\n閱https://www.mediawiki.org/wiki/Manual:Image_Authorization。",
+       "img-auth-nopathinfo": "PATH_INFO失之。\n爾之伺服器無此資料也。\n以CGI之本耳,無img_auth矣。\n閱https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization。",
        "img-auth-notindir": "求之徑無存貢錄中。",
        "img-auth-badtitle": "於「$1」無建效題也。",
        "img-auth-nologinnWL": "爾未登簿,「$1」無在白名中。",
        "watchlist-details": "哨上有$1,不含議論。",
        "wlheader-enotif": "*准報信。",
        "wlheader-showupdated": "*易者'''粗體'''。",
-       "watchmethod-recent": "哨近易。",
-       "watchmethod-list": "報近易…",
-       "watchlistcontains": "共$1哨。",
-       "iteminvalidname": "'$1'謬名。",
        "wlshowlast": "見近$1時、$2天、$3時易",
        "watchlist-options": "哨項",
        "watching": "出陣…",
        "enotif_lastvisited": "自子出簿,有易見$1。",
        "enotif_lastdiff": "欲閱此易,見$1。",
        "enotif_anon_editor": "過客$1",
-       "enotif_body": "$WATCHINGUSERNAME鈞鑑\n\n$PAGEEDITDATE{{SITENAME}}簿$PAGEEDITOR$CHANGEDORCREATED$PAGETITLE,閱審之見$PAGETITLE_URL。\n\n$NEWPAGE\n\n纂者彙:$PAGESUMMARY $PAGEMINOREDIT\n遣書($PAGEEDITOR_EMAIL)或訪齋($PAGEEDITOR_WIKI)聯繫之。\n\n如不訪頁,哨報止也。可赴哨所令復之。\n\n{{SITENAME}}敬上\n\n--\n欲更哨令,惠訪{{canonicalurl:{{#special:EditWatchlist}}}}\n\n欲刪之頁,惠訪$UNWATCHURL\n\n饋助之,惠訪{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "$WATCHINGUSERNAME鈞鑑\n\n$PAGEEDITDATE{{SITENAME}}簿$PAGEEDITOR$CHANGEDORCREATED$PAGETITLE,閱審之見$PAGETITLE_URL。\n\n$NEWPAGE\n\n纂者彙:$PAGESUMMARY $PAGEMINOREDIT\n遣書($PAGEEDITOR_EMAIL)或訪齋($PAGEEDITOR_WIKI)聯繫之。\n\n如不訪頁,哨報止也。可赴哨所令復之。\n\n{{SITENAME}}敬上\n\n--\n欲更哨令,惠訪{{canonicalurl:{{#special:EditWatchlist}}}}\n\n欲刪之頁,惠訪$UNWATCHURL\n\n饋助之,惠訪$HELPPAGE",
        "created": "撰",
        "changed": "易",
        "deletepage": "刪頁",
        "blockip": "禁簿",
        "blockip-legend": "禁簿",
        "blockiptext": "函下禁纂,簿、址明判;[[{{MediaWiki:Policy-url}}|秉據]]如斯,立法克亂。指罪證行,了冤無憾。",
-       "ipadressorusername": "IP或簿名",
+       "ipaddressorusername": "IP或簿名",
        "ipbexpiry": "限期",
        "ipbreason": "指證",
        "ipbreason-dropdown": "*如下道:\n** 造假報\n** 毀文貌\n** 廣賈告\n** 話胡鬧\n** 恐嚇擾\n** 污名號\n** 名瀆道",
        "newimages-summary": "此奇頁示最後呈上之檔也。",
        "newimages-legend": "濾",
        "newimages-label": "名(或其部):",
-       "showhidebots": "($1僕)",
        "noimages": "無可見。",
        "ilsubmit": "尋檔",
        "bydate": "時序",
        "autoredircomment": "渡至[[$1]]",
        "autosumm-new": "新文「$1」",
        "size-bytes": "$1 位元組",
-       "livepreview-loading": "遺藏…",
-       "livepreview-ready": "藏至矣。",
-       "livepreview-failed": "弗能即時示之!\n嘗以本法。",
-       "livepreview-error": "莫之連也:$1 \"$2\"。\n嘗以本法。",
        "lag-warn-normal": "近$1秒新易者疑喪也。",
        "lag-warn-high": "遣藏遲焉。近$1秒新易者疑喪也。",
-       "watchlistedit-numitems": "不計議論,哨有題$1。",
-       "watchlistedit-noitems": "哨無題也。",
        "watchlistedit-normal-title": "治哨站",
        "watchlistedit-normal-legend": "撤之",
        "watchlistedit-normal-explain": "盡列有哨。欲撤題,揀之再擊『{{int:Watchlistedit-normal-submit}}』。亦[[Special:EditWatchlist/raw|治源哨]]也。",
index d2f7dcb..2baf3b1 100644 (file)
@@ -16,7 +16,8 @@
                        "Reedy",
                        "Rillke",
                        "Umeshberma",
-                       "Vinitutpal"
+                       "Vinitutpal",
+                       "아라"
                ]
        },
        "tog-underline": "लिंककेँ रेखांकित करू:",
@@ -29,7 +30,6 @@
        "tog-showtoolbar": "संपादन ओजारपेटी देखाऊ (जावास्क्रीप्ट)",
        "tog-editondblclick": "दू बेर क्लीक कए पन्ना संपादित करू (जावास्क्रीप्ट)",
        "tog-editsectiononrightclick": "ऐ खण्डक सम्पादन खण्डक शीर्षकेँ दहिन क्लिक कऽ सम्भव (जावास्क्रिप्ट चाही)",
-       "tog-rememberpassword": "ऐ गवेषकपर हमर कूटशब्द (बेशीसं बेशी $1 {{PLURAL:$1|दिन धरि| कएक दिन धरि}}) मोन राखू",
        "tog-watchcreations": "हमर बनाओल पृष्ठ हमर साकांक्ष सूचीमे राखू",
        "tog-watchdefault": "हमर संपादित पृष्ठ हमर साकांक्ष सूचीमे देखाऊ",
        "tog-watchmoves": "हमरा द्वारा हटाओल पृष्ठ हमर साकांक्ष सूचीमे राखू",
        "readonly_lag": "दत्तांशनिधि स्वचालित रूपेँ प्रतिबन्धित कएल गेल अछि जा परजीवी दतांशनिधि वितरक मूलक समक्ष नै आबि जाए।",
        "internalerror": "आन्तरिक भ्रम",
        "internalerror_info": "आन्तरिक भ्रम: $1",
-       "fileappenderrorread": "\"$1\"  केँ जोड़ै कालमे नै पढ़ि सकल",
-       "fileappenderror": "\"$1\" सँ \"$2\" केँ नै जोड़ि सकल।",
        "filecopyerror": "\"$1\" सँ \"$2\" केँ नै अनुकृति कऽ सकल।",
        "filerenameerror": "\"$1\" सँ \"$2\" केँ नै नाम बदलि सकल।",
        "filedeleteerror": "\"$1\" केँ नै मेटा सकल।",
        "directorycreateerror": "विभाग \"$1\" नै बना सकल।",
        "filenotfound": "फाइल \"$1\" नै ताकि सकल।",
-       "fileexistserror": "फाइल \"$1\" पर लिखबामे अक्षम: फाइल अछि",
        "unexpected": "आसक विपरीत परिणाम: \"$1\"=\"$2\"",
        "formerror": "फॉर्म नै पठा सकल",
        "badarticleerror": "ई क्रिया ऐ पन्नापर नै कएल जा सकैए।",
        "savearticle": "पन्नाक रक्षण करू",
        "preview": "पूर्वावलोकन",
        "showpreview": "पूर्वप्रदर्शन",
-       "showlivepreview": "चलित पूर्वावलोकन",
        "showdiff": "परिवर्त्तन देखाऊ",
        "anoneditwarning": "'''चेतौनी:''' अहाँ सम्प्रवेशित नै छी।\nअहाँक अनिकेत ऐ पन्नाक सम्पादन इतिहासमे दर्ज कएल जाएत।",
        "anonpreviewwarning": "'' अहाँ सम्प्रवेशित नै छी। अखन रक्षण केलासँ अहाँक अनिकेत पता ऐ पन्नाक सम्पादन इतिहासमे दर्ज भऽ जाएत।''",
        "search-nonefound": "अभ्यर्थनासँ मेल खाइत कोनो परिणाम नै भेटल।",
        "powersearch-legend": "विशेष खोज",
        "powersearch-ns": "निर्धारकमे खोज",
-       "powersearch-redir": "रस्ता बदलेनक सूची",
        "powersearch-togglelabel": "जाँचू:",
        "powersearch-toggleall": "सभटा",
        "powersearch-togglenone": "कोनो नै",
        "prefs-advancedsearchoptions": "विशिष्ट विकल्प सभ",
        "prefs-advancedwatchlist": "विशिष्ट विकल्प सभ",
        "prefs-displayrc": "दृश्य विकल्प सभ",
-       "prefs-displaysearchoptions": "दृश्य विकल्प सभ",
        "prefs-displaywatchlist": "दृश्य विकल्प सभ",
        "prefs-diffs": "अन्तर निर्धारक सभ",
        "email-address-validity-valid": "ई-पत्र संकेत मान्य बुझाइत अछि",
        "recentchanges-label-bot": "ई सम्पादन यांत्रिक छल।",
        "recentchanges-label-unpatrolled": "ऐ सम्पादनक पुनरीक्षण अखन धरि नै कएल गेल अछि।",
        "rcnotefrom": "नीचाँमे '''$2''' सँ भेल परिवर्तन अछि ('''$1''' धरि देखाएल)।",
-       "rclistfrom": "$1 सँ शुरू भेल नव परिवर्तन देखू",
+       "rclistfrom": "$3 $2 सँ शुरू भेल नव परिवर्तन देखू",
        "rcshowhideminor": "$1 अल्प संपादन",
        "rcshowhidebots": "$1 स्वचालक सभ",
        "rcshowhideliu": "$1 सम्प्रवेशित प्रयोक्ता सभ",
        "uploadstash-refresh": "संचिका सभक सूचीकेँ ताजा करू।",
        "invalid-chunk-offset": "एकट्ठे अमान्य बौस्तु",
        "img-auth-accessdenied": "प्रवेश प्रतिबन्धित",
-       "img-auth-nopathinfo": "बाटक जानकारी नै अछि।\nअहाँक वितरक ऐ सूचनाकेँ प्रसारित नै कऽ सकत।\nई सी.जी.आइ.आधारित अछि आ चित्र-समर्थन केँ समर्थन नै दऽ सकत।\n[https://www.mediawiki.org/wiki/Manual:Image_Authorization देखू image authorization.]",
+       "img-auth-nopathinfo": "बाटक जानकारी नै अछि।\nअहाँक वितरक ऐ सूचनाकेँ प्रसारित नै कऽ सकत।\nई सी.जी.आइ.आधारित अछि आ चित्र-समर्थन केँ समर्थन नै दऽ सकत।\n[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization देखू image authorization.]",
        "img-auth-notindir": "आग्रह कएल रस्ता विन्यासित उपारोपित निर्देशिकामे नै अछि।",
        "img-auth-badtitle": "\"$1\" लेल कोनो मान्य शीर्षक नै बना सकल।",
        "img-auth-nologinnWL": "अहाँ सम्प्रवेशित नै छी आ \"$1\" स्वीकृत सूचीमे नै अछि।",
        "watchlist-details": "{{PLURAL:$1|$1 पन्ना|$1 पन्ना सभ}} अहाँक साकांक्षसूचीमे, चौबटिया पन्ना नै गानल गेल।",
        "wlheader-enotif": "ई-पत्र सूचना लागू अछि।",
        "wlheader-showupdated": "पन्ना सभ जे अहाँक एतए अन्तिम बेर अएलाक बाद बदलल अछि तकर सूची देल अछि '''गाढ़''' मे",
-       "watchmethod-recent": "साकांक्ष सूचीक हालक सम्पादन जाँचि रहल छी",
-       "watchmethod-list": "साकांक्ष-सूचीक हालक सम्पादनकेँ देखि रहल छी",
-       "watchlistcontains": "अहाँक साकांक्ष-सूचीमे अछि $1 {{PLURAL:$1|पन्ना|पन्ना}}।",
-       "iteminvalidname": "'$1' क संग समस्या, अमान्य नाम ...",
        "wlshowlast": "देखाउ अन्तिम $1 घण्टा $2 दिन $3",
        "watchlist-options": "साकांक्षसूचीक विकल्प सभ",
        "watching": "ताकिमे...",
        "enotif_lastvisited": "देखू $1 अपन अन्तिम बेर अएलाक बादक परिवर्तन लेल।",
        "enotif_lastdiff": "ऐ परिवर्तनकेँ देखबा लेल $1 देखू।",
        "enotif_anon_editor": "गुप्त प्रयोक्ता $1",
-       "enotif_body": "प्रिय $WATCHINGUSERNAME,\n\n\nई {{अन्तर्जाल}} पन्ना $पन्नाशीर्षक $CHANGEDORCREATED कएल गेल $PAGEEDITDATE तिथिकेँ $PAGEEDITOR द्वारा, देखू $PAGETITLE_URL वर्तमान संस्करण लेल।\n\n$NEWPAGE\n\nसम्पादकीय: $PAGESUMMARY $PAGEMINOREDIT\n\nसम्पादकसँ सम्पर्क करू:\nई-पत्र: $PAGEEDITOR_EMAIL\nविकी: $PAGEEDITOR_WIKI\n\nआन परिवर्तन भेलापर कोनो सूचना नै देल जाएत जँ अहाँ ई पन्ना नै देखब।\nअपन साकांक्ष सूचीक सूचना पेबाक प्रकार अहाँ बदलि सकै छी।\n\n             अहाँक प्रिय {{ान्तर्जाल}} सूचना प्रणाली\n\n--\nअपन ई-पत्र सूचना प्रकार बदलबाक लेल देखू\n{{canonicalurl:{{#special:Preferences}}}}\nअपन साकांक्ष-सूची सूचना प्रकार बदलबाक लेल देखू\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nअपन साकांक्ष-सूचीसँ कोनो पन्ना मेटेबाक लेल देखू\n$UNWATCHURL\n\nअपन अनुभव बतेबा वा कोनो सहायता लेल:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "प्रिय $WATCHINGUSERNAME,\n\n\nई {{अन्तर्जाल}} पन्ना $पन्नाशीर्षक $CHANGEDORCREATED कएल गेल $PAGEEDITDATE तिथिकेँ $PAGEEDITOR द्वारा, देखू $PAGETITLE_URL वर्तमान संस्करण लेल।\n\n$NEWPAGE\n\nसम्पादकीय: $PAGESUMMARY $PAGEMINOREDIT\n\nसम्पादकसँ सम्पर्क करू:\nई-पत्र: $PAGEEDITOR_EMAIL\nविकी: $PAGEEDITOR_WIKI\n\nआन परिवर्तन भेलापर कोनो सूचना नै देल जाएत जँ अहाँ ई पन्ना नै देखब।\nअपन साकांक्ष सूचीक सूचना पेबाक प्रकार अहाँ बदलि सकै छी।\n\n             अहाँक प्रिय {{ान्तर्जाल}} सूचना प्रणाली\n\n--\nअपन ई-पत्र सूचना प्रकार बदलबाक लेल देखू\n{{canonicalurl:{{#special:Preferences}}}}\nअपन साकांक्ष-सूची सूचना प्रकार बदलबाक लेल देखू\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nअपन साकांक्ष-सूचीसँ कोनो पन्ना मेटेबाक लेल देखू\n$UNWATCHURL\n\nअपन अनुभव बतेबा वा कोनो सहायता लेल:\n$HELPPAGE",
        "created": "बनाएल गेल",
        "changed": "बदलल गेल",
        "deletepage": "पन्ना मेटाउ",
        "blockip": "प्रयोक्ताकेँ प्रतिबन्धित करू",
        "blockip-legend": "प्रयोक्ताकेँ प्रतिबन्धित करू",
        "blockiptext": "नीचाँक आवेदनक प्रयोग कोनो खास अनिकेत वा प्रयोक्तानामक लिखैक प्रवेशकेँ प्रतिबन्धित करबा लेल करू।\nई अतत्तः करैबलाक विरुद्ध प्रयुक्त हुअए, आ एकर अनुसार [[{{MediaWiki:Policy-url}}|policy]]।\nनीचाँ स्पष्ट कारण लिखू (जेना, खास पन्नाकेँ देखबैत जतए अतत्तः कएल गेल अछि)।",
-       "ipadressorusername": "अनिकेत संकेत वा प्रयोक्तानाम:",
+       "ipaddressorusername": "अनिकेत संकेत वा प्रयोक्तानाम:",
        "ipbexpiry": "खतम हएत:",
        "ipbreason": "कारण:",
        "ipbreason-dropdown": "*सामान्य प्रतिबन्ध कारण\n** गलत सूचना घुसेनाइ\n** पन्ना सभसँ पाठ हटेनाइ\n** बाहरी जालस्थलक अवांछित लागि\n** फालतू/ अवांछित सामिग्रिक पान्नामे घुसाएब\n** धमकीबला व्यवहार/ तंग करब\n** कएक खाताकेँ गरिआएब\n** अवांछित प्रयोक्तानाम",
        "tooltip-undo": "\"फेरसँ वएह\" सम्पादनकेँ पूर्वस्थितिमे लऽ जाइए आ पूर्वावलोकन अवस्थामे सम्पादन फॉर्म खोलैए। ई सारांशमे कारण जोड़बाक विकल्प दैत अछि।",
        "tooltip-preferences-save": "मोनपसंद के सुरक्षित करू",
        "tooltip-summary": "छोट संक्षेप दिअ",
-       "notacceptable": "विकी वितरक ओइ प्रारूपमे दत्तांश नै दऽ सकैए जे अहाँक ग्राहक पढ़ि सकए।",
        "anonymous": "अज्ञात {{अन्तर्जाल}} क  {{PLURAL:$1|प्रयोक्ता|प्रयोक्ता सभ}}",
        "siteuser": "{{अन्तर्जाल}} प्रयोक्ता $1",
        "anonuser": "{{SITENAME}} नुकायल प्रयोक्ता $1",
        "newimages-summary": "ऐ विशेष पन्नामे उपारोपित संचिका सभ देखाएल गेल अछि।",
        "newimages-legend": "चलनी",
        "newimages-label": "संचिका नाम (वा ओकर अंश):",
-       "showhidebots": "($1 स्वचालक सभ)",
        "noimages": "किछु देखबा योग्य नै |",
        "ilsubmit": "ताकू",
        "bydate": "तारीख सं",
        "autosumm-replace": "\"$1\" सहित पाठ परिवर्तित भेल",
        "autoredircomment": "[[$1]] के अनुप्रेषित",
        "autosumm-new": "'$1'संग नब पृष्ठ बनाओल गेल",
-       "livepreview-loading": "उपारोपण भऽ रहल अछि...",
-       "livepreview-ready": "उपारोपण भऽ रहल अछि...तैयार रहू!",
-       "livepreview-failed": "चल पूर्वदृश्य अफल!\nसामान्य पूर्वदृश्य प्रयोग करू।",
-       "livepreview-error": "जुड़बामे असफल: $1 \"$2\"।\nसामान्य पूर्वदृश्यक प्रयोग करू।",
        "lag-warn-normal": "$1 सँ नव बदलल गेल {{PLURAL:$1|सेकेण्ड|सेकेण्ड}} ऐ सूचीमे नै देखाएल गेल।",
        "lag-warn-high": "उच्च दत्तनिधि वितरक देरीक कारण, $1 सँ नव परिवर्तन {{PLURAL:$1|सेकेण्ड|सेकेण्ड}} ऐ सूचीमे नै देखाएल जा सकल।",
-       "watchlistedit-numitems": "अहाँक साकांक्ष-सूचीमे अछि {{PLURAL:$1|1 शीर्षक|$1 शीर्षक}}, वार्ता पन्नाकेँ छोड़ि कऽ।",
-       "watchlistedit-noitems": "अहाँक साकांक्ष-सूचीमे कोनो शीर्षक नै अछि।",
        "watchlistedit-normal-title": "साकांक्षसूची बदलू",
        "watchlistedit-normal-legend": "साकांक्ष सूचीसँ हटाउ",
        "watchlistedit-normal-explain": "अहाँक साकांक्ष-सूचीक शीर्षक नीचाँमे देल अछि।\nएकटा शीर्षककेँ हटेबाले, ओकर सोझाँक बक्शाकेँ सही करू, आ क्लिक करू \"{{int:Watchlistedit-normal-submit}}\"।\nअहाँ [[Special:EditWatchlist/raw|काँच-सूची सम्पादित करू]] ईहो कऽ सकै छी।",
        "compare-invalid-title": "जे शीर्षक अहाँ देलौं से अमान्य अछि।",
        "compare-title-not-exists": "जे शीर्षक अहाँ कहलौं से अछिये नै।",
        "compare-revision-not-exists": "जे संशोधन अहाँ कहलौं से अछिये नै।",
-       "dberr-header": "ऐ विकीमे एकटा समस्या अछि",
        "dberr-problems": "दुखी छी! ई जालस्थल तकनीकी समस्या अनुभव कऽ अछि।",
        "dberr-again": "किछु काल बाट ताकू आ फेरसँ भारित करू।",
        "dberr-info": "(दत्तनिधि वितरककेँ सम्पर्क नै कऽ सकल: $1)",
index 07d8f3b..c323d43 100644 (file)
@@ -5,7 +5,8 @@
                        "Slamet Serayu (on map-bms.wikipedia.org)",
                        "StefanusRA",
                        "לערי ריינהארט",
-                       "Bennylin"
+                       "Bennylin",
+                       "아라"
                ]
        },
        "tog-underline": "Garisen ngisoré pranala:",
@@ -18,7 +19,6 @@
        "tog-showtoolbar": "Tidhokna bilah alat penyuntingan",
        "tog-editondblclick": "Nyunting kaca nganggo dobel klik (mbutuhna JavaScript)",
        "tog-editsectiononrightclick": "Aktifna penyuntingan subbagian nganggo klik-tengen nang judul bagian (mbutuhna JavaScript)",
-       "tog-rememberpassword": "Emutna data login-ne inyong nang peramban kiye (kanggo paling suwe $1 {{PLURAL:$1|dina|dina}})",
        "tog-watchcreations": "Tambahna kaca gaweanne inyong lan berkas sing tek unggah nang daptar pangawasanne inyong",
        "tog-watchdefault": "Tambahna kaca lan berkas sing tek-sunting maring daptar pangawasanne inyong",
        "tog-watchmoves": "Tambahna kaca lan berkas sing tek-pindah maring daptar pangawasanne inyong",
        "readonly_lag": "Basis data uwis dikunci otomatis sawetara basis data sekunder lagi nglakokna sinkronisasi karo basis data utama",
        "internalerror": "Kasalahan internal",
        "internalerror_info": "Kasalahan internal: $1",
-       "fileappenderrorread": "Ora teyeng maca \"$1\" dong lagi nambahi.",
-       "fileappenderror": "Ora teyeng nambahna \"$1\" maring \"$2\".",
        "filecopyerror": "Ora teyeng nyalin berkas \"$1\" maring \"$2\".",
        "filerenameerror": "Ora teyeng ngowahi jeneng berkas sekang \"$1\" dadi \"$2\".",
        "filedeleteerror": "Ora teyeng mbusak berkas \"$1\".",
        "directorycreateerror": "Ora teyeng nggawé dirèktori \"$1\".",
        "filenotfound": "Ora teyeng nemokna berkas \"$1\".",
-       "fileexistserror": "Ora teyeng nulis maring berkas \"$1\": Berkase wis ana.",
        "unexpected": "Nilai-ne nang jaba jangkauan: \"$1\"=\"$2\".",
        "formerror": "Kasalahan: Ora teyeng ngirimna formulir.",
        "badarticleerror": "Tindakan kiye ora teyeng dilakokna nang kaca kiye.",
        "gotaccountlink": "Mlebu log",
        "userlogin-resetlink": "Apa Rika kelalen info detil nggo mlebune?",
        "userlogin-resetpassword-link": "Setel maning tembung sandhine Rika",
-       "createacct-join": "Lebokna informasine Rika nang ngisor kiye.",
-       "createacct-another-join": "Lebokna informasi akun anyar nang ngisor kiye.",
        "createacct-emailrequired": "Alamat imel",
        "createacct-emailoptional": "Alamat imel (ora kudu)",
        "createacct-email-ph": "Lebokna alamat imele Rika",
        "savearticle": "Simpen",
        "preview": "Pra tayang",
        "showpreview": "Pra tayang",
-       "showlivepreview": "Pratayang langsung",
        "showdiff": "Ndeleng bedané",
        "anoneditwarning": "Rika ora kadaftar mlebu.\nAlamat IP-ne Rika bakal dicatet nang sajarah panyuntingane kaca kiye.",
        "anonpreviewwarning": "''Rika durung mlebu log. Nyimpen kaca bakal nyatetna alamat IP-ne Rika nang riwayat suntingan kaca kiye.''",
        "search-nonefound": "Ora ana kasil sing cocog karo pitakonan (''query'').",
        "powersearch-legend": "Panggoletan lanjut",
        "powersearch-ns": "Goleti nang bilik jeneng:",
-       "powersearch-redir": "Daftar pangalihan",
        "powersearch-togglelabel": "Pilih:",
        "powersearch-toggleall": "Kabeh",
        "powersearch-togglenone": "Ora ana",
        "prefs-advancedsearchoptions": "Opsi lanjutan",
        "prefs-advancedwatchlist": "Opsi lanjutan",
        "prefs-displayrc": "Opsi tampilan",
-       "prefs-displaysearchoptions": "Opsi tampilan",
        "prefs-displaywatchlist": "Opsi tampilan",
        "prefs-diffs": "Prabédan",
        "email-address-validity-valid": "Alamatimel ketone wis sah",
        "recentchanges-label-bot": "Suntingan iki dilakokna déning bot",
        "recentchanges-label-unpatrolled": "Suntingan kiye durung dipatroli",
        "rcnotefrom": "Nang ngisor kiye owah-owahan wiwit <strong>$2</strong> (kapacak nganti <strong>$1</strong> owah-owahan).",
-       "rclistfrom": "Tidokna owahan anyar molai sekang tanggal $1",
+       "rclistfrom": "Tidokna owahan anyar molai sekang tanggal $3 $2",
        "rcshowhideminor": "$1 suntingan cilik",
        "rcshowhidebots": "$1 bot",
        "rcshowhideliu": "$1 panganggo sing mlebu log",
index a72fa9d..5bc4044 100644 (file)
@@ -5,7 +5,8 @@
                        "Kaganer",
                        "Khazar II",
                        "Kranch",
-                       "Numulunj pilgae"
+                       "Numulunj pilgae",
+                       "아라"
                ]
        },
        "tog-underline": "Сюлмафкснень алга китькстамс:",
@@ -18,7 +19,6 @@
        "tog-showtoolbar": "Кядьёнкс седяфксть няфтемс сёрмадомбачк (JavaScript)",
        "tog-editondblclick": "Кафксть люпштазь сувамс сёрматфть петнема (JavaScript)",
        "tog-editsectiononrightclick": "Петнемс пялькстне: люпштамс сёрмадомбяльксть лемонц лангс видешире пуняса (JavaScript)",
-       "tog-rememberpassword": "Ванфтомс монь сувама лемозе тя содаммашинаса (сяда кувать $1 {{PLURAL:$1|ши|шит}})",
        "tog-watchcreations": "Сувафтомс лопатнень, конатнень тиине ди файлат, конатнень тонгине мельгеваномазон",
        "tog-watchdefault": "Сувафтомс лопатнень ди файлатнень, конатнень петнесайне мельгеваномазон",
        "tog-watchmoves": "Сувафтомс лопатнень ди файлатнень, конатнень шашфтыне мельгеваномазон",
        "readonly_lag": "Датабазась эслек пякстась мъзярс кядяла датабаза серверхт сотни прясерверть мархта",
        "internalerror": "Потмонь эльбятькс",
        "internalerror_info": "Потмонь эльбятькс: $1",
-       "fileappenderrorread": "\"$1\" файлась аф лувови поладома пингста.",
-       "fileappenderror": "\"$1\" файлась изь поладов \"$2\" файлти.",
        "filecopyerror": "Аш кода копиямс файл \"$1\" файл \"$2\"с.",
        "filerenameerror": "Аш кода \"$1\" файлти максомс од лем \"$2\".",
        "filedeleteerror": "Файл \"$1\" аф нардави.",
        "directorycreateerror": "Директорие \"$1\" аф тиеви.",
        "filenotfound": "Файл \"$1\" аф муви.",
-       "fileexistserror": "Файл \"$1\" аф сёрмадови: стама файлсь ульсь ни",
        "unexpected": "Аф шарьхкодеви смузьсь: \"$1\"=\"$2\".",
        "formerror": "Эльбятькс: Формсь аф кучеви",
        "badarticleerror": "Тя лопаса тя аф тиеви.",
        "savearticle": "Ванфтомс лопать",
        "preview": "Васень няфтема",
        "showpreview": "Максомс васень няфтема",
-       "showlivepreview": "Эряй васень няфтема",
        "showdiff": "Няфтемс мезе полафтсь",
        "anoneditwarning": "'''Инголе мярьгома:''' Тон изеть сува. Тонь IP адресце кармай сувафтф тя лопать петнема историязонза.",
        "missingsummary": "'''Лятфтама:''' Тон изеть макса петнемацень колга нюрьхкяня лихтемась. Люпштандярят \"Ванфтомс лопать\" тага весть, тонь полафнематне кармайхть ванфтфт мяльполатксфтома.",
        "search-nonefound": "Аш вешфксонди малады муфкст.",
        "powersearch-legend": "Анцяйняньбес вешендема",
        "powersearch-ns": "Вешендемс лемботмоса:",
-       "powersearch-redir": "Шашфтфкснень лувомась",
        "powersearch-togglelabel": "Варжак:",
        "powersearch-toggleall": "Сембе",
        "powersearch-togglenone": "Фкявок аш",
        "recentchanges-label-bot": "Тя видептемась тизе кона-бди робот програм",
        "recentchanges-label-unpatrolled": "Тя видептемась ашесь пова патруль ала ни",
        "rcnotefrom": "Ала няфтезь полафнематне '''$2'''-ста ('''$1'''-с).",
-       "rclistfrom": "Няфтемс од полафнематне $1-ста ушедомс",
+       "rclistfrom": "Няфтемс од полафнематне $3 $2-ста ушедомс",
        "rcshowhideminor": "$1 ёмланя видептемат",
        "rcshowhidebots": "$1 робот програпт",
        "rcshowhideliu": "$1 суваф тиихть",
        "watchlist-details": "{{PLURAL:$1|$1 лопа|$1 лопат}} мельгеваномацень ала корхнема лопат аф лувомок.",
        "wlheader-enotif": "Электрононь сёрма вельде пачфнема нолдаф тевс.",
        "wlheader-showupdated": "Лопат конань полафтозь тонь мекольце сувсемадот меле няфтевсть '''эчке тяшкса'''.",
-       "watchmethod-recent": "мельге ванома ала лопатнень коряс мекольце петнематнень ванондома",
-       "watchmethod-list": "мекольце петнематнень коряс мельге ванома ала лопат ванондома",
-       "watchlistcontains": "Тонь мельгеваномасот $1 {{PLURAL:$1|лопа|лопат}}.",
-       "iteminvalidname": "Прябала '$1'-ть мархть, лемоц аф кондясти...",
        "wlshowlast": "Няфтемс мекольце $1 ойхть (част) $2 шит $3",
        "watchlist-options": "Мельгеваномать латцемасна",
        "watching": "Ванома...",
        "enotif_lastvisited": "Ванк $1 тонь мекольце самдот меле сембе поланематнень няфтеманкса.",
        "enotif_lastdiff": "Ванк $1 тя полафнемать няфтеманкса.",
        "enotif_anon_editor": "лемфтома тиись $1",
-       "enotif_body": "Кельгома $WATCHINGUSERNAME,\n\n\n{{SITENAME}} лопа $PAGETITLE $CHANGEDORCREATED $PAGEEDITDATE тиись $PAGEEDITOR. Мекольце верзие ванк $REFINFO\n\n$NEWPAGE\n\nПетнить лихтемац: $PAGESUMMARY $PAGEMINOREDIT\n\nСотомс петнить мархта:\nэлектрононь адрес вельде: $PAGEEDITOR_EMAIL\nвики вельде: $PAGEEDITOR_WIKI\n\nАф кармайхть кучевома пачфтемат иля сай полафнематнень колга тонь самдот тя лопас инголе. Тондейть тага ули кода омбоцекс путомс пачфтема содафксне тонь мельгеваномазот сембе тонь мельгеванома ала лопатненди.\n\n             Тонь ялгань {{SITENAME}} пачфтема системце\n\n--\nТонь мельгеваномацень латцемасна полафтоманкса сашентт\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nЛопать тонь мельгеваномастот нардаманди сашентт\n$UNWATCHURL\n\nАзома мекпяли ди иля лезкс:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Кельгома $WATCHINGUSERNAME,\n\n\n{{SITENAME}} лопа $PAGETITLE $CHANGEDORCREATED $PAGEEDITDATE тиись $PAGEEDITOR. Мекольце верзие ванк $REFINFO\n\n$NEWPAGE\n\nПетнить лихтемац: $PAGESUMMARY $PAGEMINOREDIT\n\nСотомс петнить мархта:\nэлектрононь адрес вельде: $PAGEEDITOR_EMAIL\nвики вельде: $PAGEEDITOR_WIKI\n\nАф кармайхть кучевома пачфтемат иля сай полафнематнень колга тонь самдот тя лопас инголе. Тондейть тага ули кода омбоцекс путомс пачфтема содафксне тонь мельгеваномазот сембе тонь мельгеванома ала лопатненди.\n\n             Тонь ялгань {{SITENAME}} пачфтема системце\n\n--\nТонь мельгеваномацень латцемасна полафтоманкса сашентт\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nЛопать тонь мельгеваномастот нардаманди сашентт\n$UNWATCHURL\n\nАзома мекпяли ди иля лезкс:\n$HELPPAGE",
        "created": "тиф",
        "changed": "полафтсь",
        "deletepage": "Нардамс лопать",
        "blockip": "Пякстамс тиить",
        "blockip-legend": "Кардамс тиить",
        "blockiptext": "Эряви нолдамс тевс форм ала башка IP адресста эли тиить лем вельде  сёрмадомань сувамать сёлгоманкса.\nТя эряви тиемс аньцек колендемада аралама туфталонкса ди [[{{MediaWiki:Policy-url}}|политик]]-ть коряс.\nПутт туфталть алу (кепотьксонди, лятфнек лопатне конатнень эса колендесть).",
-       "ipadressorusername": "IP адрес эли тиить лемоц:",
+       "ipaddressorusername": "IP адрес эли тиить лемоц:",
        "ipbexpiry": "Сирелгоды:",
        "ipbreason": "Туфтал:",
        "ipbreason-dropdown": "* Кърдань сёлгома туфталхт\n** Аф виде информациень путнема\n** Лопаста сёрматфть нардама\n** Аф виде ушеширень интернет сюлмафкснень макссема\n** Ёньфтома/смузьфтома информациень лопас путнема\n** Кальдяв прянь вятема/сялгодома\n** Лама сёрматфтоматнень покордама\n** Аф пара тиить лемоц",
        "tooltip-rollback": "\"Потафтфкс\" мърдафтсыне петнематне мекольце тиинь путксонц лопазонза фкя люпштамас.",
        "tooltip-undo": "\"Каряньфтема\" мърдафтсыне тя петнемать эди панжесы петнема форм васень няфтемаса.\nЛезни поладомс туфталхт лихтемать эс.",
        "tooltip-summary": "Тяштьк нюрьхкяняста сувафтфть колга",
-       "notacceptable": "Вики серверонди аш кода максомс информациесь стама форматса конань эса тонь клиентти ули кода сонь морафтомс.",
        "anonymous": "Лемфтома {{SITENAME}}-нь {{PLURAL:$1|тиись|тиихне}}",
        "siteuser": "{{SITENAME}}-нь тиись $1",
        "lastmodifiedatby": "Тя лопать мекольцеда петнезь $3 $2, $1",
        "newimages-summary": "Тя башка тевонь лопась няфнесыне мекольце тонкф файлхт.",
        "newimages-legend": "Педяма",
        "newimages-label": "Файллем (эли сонь пакшец):",
-       "showhidebots": "($1 робот програпт)",
        "noimages": "Мезеге аш.",
        "ilsubmit": "Вешендемс",
        "bydate": "ши коряс",
        "autosumm-replace": "Нардакшневи лопать '$1' мархта",
        "autoredircomment": "Умборондафневи [[$1]]с",
        "autosumm-new": "Тиевсь лопа $1 мархта",
-       "livepreview-loading": "Аноклакшни…",
-       "livepreview-ready": "Аноклакшни… Анок!",
-       "livepreview-failed": "Эряк васень няфтемась колавсь! Тяряфтт кундамс кърдань васень няфтемас.",
-       "livepreview-error": "Аш кода сотомс: $1 \"$2\" мархта. Тяряфтт кундамс кърдань васень няфтемас.",
        "lag-warn-normal": "Полафнематне $1 {{PLURAL:$1|фавда|фавда}} од аш кода няфтемс лувомаса.",
        "lag-warn-high": "Серверонь вельф стака яксеманкса $1 {{PLURAL:$1|фавда|фавда}} од полафнематне аш кода няфтемс тя лувомаса.",
-       "watchlistedit-numitems": "Тонь мельгеваномазост {{PLURAL:$1|1 конякс|$1 конякст}} корхнема лопатнень башка.",
-       "watchlistedit-noitems": "Тонь мельгеваномазост конякст ашет.",
        "watchlistedit-normal-title": "Петнемс мельгеваномать",
        "watchlistedit-normal-legend": "Нардамс конякст мельгеваномаста",
        "watchlistedit-normal-explain": "Тонь мельгеваномаса коняксне няфтьфт ала.\nКоняксонь нардаманди, путт тяште кудняс сонь ваксса ди люпштак Нардамс конякст.\nТондейть ули кода [[Special:EditWatchlist/raw|петнемс ише лувомать]].",
index b7fa186..bea4e6f 100644 (file)
@@ -6,7 +6,8 @@
                        "Jagwar",
                        "The Evil IP address",
                        "Urhixidur",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Hanipika ny rohy:",
@@ -19,7 +20,6 @@
        "tog-showtoolbar": "Haneho ny toolbar fanovana",
        "tog-editondblclick": "Hanova pejy amin'ny alalan'ny tsindrim-boalavo roa misesy",
        "tog-editsectiononrightclick": "Hampiasa ny fanovana fizarana amin'ny tsindry havanana eo amin'ny lohatenim-pizarana.",
-       "tog-rememberpassword": "Tadidio ny tenimiafiko eto amin'ity solosaina ity (mandritry ny andro $1 fara-fahabetsany){{PLURAL:}}",
        "tog-watchcreations": "Hanaraka ny pejy foronoko ary ny rakitra ampidiriko",
        "tog-watchdefault": "Hanaraka ny pejy ary ny rakitra ovaiko",
        "tog-watchmoves": "Hanaraka ny pejy ary ny rakitra ovaiko anarana",
        "permalink": "Rohy maharitra",
        "print": "Avoaka an-taratasy",
        "view": "Hamaky",
+       "view-foreign": "Jerena eo amin'i $1",
        "edit": "Ovaina",
+       "edit-local": "Hanova ny famisavisana eo an-toerana",
        "create": "Amboarina",
+       "create-local": "Hanampy famisavisana eo an-toerana",
        "editthispage": "Hanova ity pejy ity",
        "create-this-page": "Forony ity pejy ity",
        "delete": "Hamafa",
        "jumptonavigation": "Fikarohana",
        "jumptosearch": "karohy",
        "view-pool-error": "Azafady, be asa ny lohamilina ankehitriny.\nBetsaka loatra ny mpikambana mitady hijery ity pejy ity.\nMiandrasa kely, dia avereno.\n\n$1",
+       "generic-pool-error": "Azafady fa tototry ny asa ny lohamilina amin'izao fotoana izao.\nBetsaka loatra ny mpampiasa manandrana mijery io loharano io.\nAndraso kely dia andramo fanindroany.",
        "pool-timeout": "Fe-potoana voahoatra ho an'ny hidy.",
        "pool-queuefull": "Feno ny lisitry ny asa hatao",
        "pool-errorunknown": "Tsi-fetezana tsy fantatra",
+       "pool-servererror": "Tsy mandeha ny rahraha fanisana ($1).",
        "aboutsite": "Mombamomba ny {{SITENAME}}",
        "aboutpage": "Project:Mombamomba",
        "copyright": "Ny lisansa $1 no mamehy ny fampiasana ity voatoatiny ity.",
        "readonly_lag": "\nMihidy ho azy aloha ny banky angona mandra-pahatratran'ny serveur andevo ny tompony",
        "internalerror": "Tsy fetezana anatin'ny rindrankajy",
        "internalerror_info": "Tsy fetezana ety anatiny : $1",
-       "fileappenderrorread": "Tsy afaka mamaky « $1 » nandritry ny fampidirana.",
-       "fileappenderror": "Tsy afaka ampiana amin'ny « $2 »  « $1 ».",
        "filecopyerror": "Tsy voadika ho \"$2\" ilay rakitra\"$1\".",
        "filerenameerror": "Tsy voaova ho \"$2\" ny anaran'ilay rakitra \"$1\".",
        "filedeleteerror": "Tsy voafafa ilay rakitra \"$1\".",
        "directorycreateerror": "Tsy afaka amboarina ny petra-drakitra (''dossier, directory'') « $1 ».",
        "filenotfound": "Tsy hita ilay rakitra \"$1\".",
-       "fileexistserror": "Tsy afaka manoratra ao anatin'ilay dossier « $1 » : efa misy ilay fisy",
        "unexpected": "Tsy nandrasana: \"$1\"=\"$2\".",
        "formerror": "Tsy mety: tsy lasa ny fisy",
        "badarticleerror": "Tsy azo atao eto amin'ity pejy ity io asa io.",
        "gotaccountlink": "Midira",
        "userlogin-resetlink": "Adinonavo ve ny antsipihan'ny fidiranao ?",
        "userlogin-resetpassword-link": "Hadino ny tenimiafina?",
+       "userlogin-helplink2": "Fanampiana amin'ny fidirana",
        "userlogin-loggedin": "Efa tafiditra amin'ny anaran'i {{GENDER:$1|$1}} ianao. Ampiasao ny fôrmiolera eo ambany raha hiditra amin'ny anaran'ny mpikambana hafa.",
        "userlogin-createanother": "Hamorona kaonty hafa",
-       "createacct-join": "Atsofohy eo ambany ny fampahalalana momba anao.",
-       "createacct-another-join": "Atsofohy eo ambany ny fampahalalana vaovaon'ny kaonty",
        "createacct-emailrequired": "Adiresy mailaka :",
        "createacct-emailoptional": "Adiresy mailaka (azo tsy atao) :",
        "createacct-email-ph": "Atsofohy ny adiresy mailakao",
        "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.",
        "pt-login": "Hiditra",
+       "pt-login-button": "Hiditra",
        "pt-createaccount": "Hamorona kaonty",
        "pt-userlogout": "Hivoaka",
        "php-mail-error-unknown": "Hadisoana tsy fantatra tao amin'ny tao mial() an'i PHP.",
        "resetpass-temp-password": "Tenimiafina miserana :",
        "resetpass-abort-generic": "Nosakanan'ny itatra (extension) iray ny fanovana tenimiafina.",
        "resetpass-expired": "Efa nitsahatra ny tenimiafinao. Mampidira tenimiafina vaovao hahafahanao miditra.",
-       "resetpass-expired-soft": "Efa nitsahatra ny tenimiafinao, ary tsy maintsy averina ilay izy. Safidio avy hatrany ny tenimiafina, na tsindrio \"Aoka aloha\" raha tsy hanao izany androany",
+       "resetpass-expired-soft": "Efa nitsahatra ny tenimiafinao, ary tsy maintsy averina ilay izy. Safidio avy hatrany ny tenimiafina, na tsindrio \"{{int:resetpass-submit-cancel}}\" raha tsy hanao izany androany",
+       "resetpass-validity-soft": "Tsy ekena ny tenimiafinao : $1\n\nTenimiafina vaovao fidiana, na tsindrio \"{{int:resetpass-submit-cancel}}\" raha hamerina azy amin'ny fotoana hafa.",
        "passwordreset": "Famafana ary famerenana ny tenimiafina",
        "passwordreset-text-one": "Fenoy ity fôrmiolera ity mba hamerenana ny tenimiafinao",
        "passwordreset-text-many": "{{PLURAL:$1|Fenoy ny saha mba hahazoanao tenimiafina vonjimaika.}}",
        "savearticle": "Tehirizo",
        "preview": "Topi-maso",
        "showpreview": "Asehoy aloha",
-       "showlivepreview": "Topi-maso maikamaika",
        "showdiff": "Asehoy ny fiovana",
        "anoneditwarning": "'''Tandremo''' : Tsy nisoratra tato amin'ny sehtatra ianao. Ho voatahiry ao amin'ny tantaram-pejy ny adiresy IP anao.",
        "anonpreviewwarning": "''Tsy niditra ianao. Hampitahiry ny adiresy IP anao ao amin'ny tantaram-panovan'ity pejy ity ny fitehirizana ny fanovana.''",
        "edit-gone-missing": "Tsy afaka natao update ilay pejy.\nMety voafafa angamba izy.",
        "edit-conflict": "Adi-panovàna.",
        "edit-no-change": "Tsy norarahian'ny rindrankajy ny fanovanao satria tsy nanova ny lahatsoratra ianao.",
-       "postedit-confirmation": "Voatahiry ny fanovanao.",
+       "postedit-confirmation-created": "Voaforona ilay pejy.",
+       "postedit-confirmation-restored": "Tafaverina ilay pejy.",
+       "postedit-confirmation-saved": "Voatahiry ny fanovanao.",
        "edit-already-exists": "Tsy afaka amboarina ilay pejy vaovao.\nEfa misy izy.",
        "defaultmessagetext": "Hafatra raha tsy misy",
        "content-failed-to-parse": "Tsy naha-parse ny votoatin'i $2 ho an'ny modely $1 : $3",
        "content-not-allowed-here": "Votoatiny ''$1'' voarara eo amin'ny pejy [[$2]]",
        "editwarning-warning": "Mety hahavery ny fanovana nataonao ny fialanao amin'ity pejy ity.\nRaha tafiditra ianao dia azonao esorina ity fampitandremana ity ao amin'ny fizarana \"{{int:prefs-editing}}\" ao amin'ny safidinao.",
        "editpage-notsupportedcontentformat-title": "Tsy zaka io andrefim-botoatiny io",
+       "editpage-notsupportedcontentformat-text": "Tsy zakan'ny maodelim-botoatiny $1 ny firafi-botoatiny $1",
        "content-model-wikitext": "wiki-soratra",
        "content-model-text": "soratra tsotra",
        "content-model-javascript": "JavaScript",
        "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-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.",
        "expansion-depth-exceeded-warning": "Pejy manana halalim-panitarana mihoatra",
        "parser-unstrip-loop-warning": "Nahitana tondro mifolaka tsy azo vahana",
        "parser-unstrip-recursion-limit": "Tafahoatra ny fetra avo ny fetra recursion ($1)",
        "searchmenu-exists": "'''Misy pejy mitondra anarana « [[:$1]] » eto amin'ity wiki ity'''",
        "searchmenu-new": "<strong>Hamorona ny pejy \"[[:$1]]\" eto amin'ity wiki ity!</strong> {{PLURAL:$2|0=|Jereo koa ny pejy hita tamin'ny karokao.|Jereo koa ny valim-pikarohana hita.}}",
        "searchprofile-articles": "Pejy misy votoatiny",
-       "searchprofile-project": "Pejy fanampiana sy pejy tetikasa",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Izy Rehetra",
        "searchprofile-advanced": "Fikarohana antsipirihany",
        "searchprofile-articles-tooltip": "Hikaroka ao amin'ny $1",
-       "searchprofile-project-tooltip": "Hikaroka ao amin'ny $1",
        "searchprofile-images-tooltip": "Hikaroka rakitra multimedia",
        "searchprofile-everything-tooltip": "Hitady eraky ny tranonkala (miaraka amin'ny pejin-dresaka)",
        "searchprofile-advanced-tooltip": "Hitady ny anaran-tsehatra ho an'ny fikarohana",
        "search-nonefound": "Tsy nahitana valiny ilay fanontaniana.",
        "powersearch-legend": "Fikarohana havanana",
        "powersearch-ns": "Hitady anatin'ny anaran-tsehatra :",
-       "powersearch-redir": "Ampiseho ny redirect",
        "powersearch-togglelabel": "Marihana:",
        "powersearch-toggleall": "Rehetra",
        "powersearch-togglenone": "Tsy misy",
        "prefs-emailconfirm-label": "Famarinana ny imailaka :",
        "youremail": "Imailaka:",
        "username": "{{GENDER:$1}}Anaram-pikambana :",
-       "uid": "{{GENDER:$1}}mpikambana :",
        "prefs-memberingroups": "Mpikambana{{GENDER:$2}} ao amin'ny vondrona{{PLURAL:$1}}:",
        "prefs-registration": "Daty fidirana :",
        "yourrealname": "Tena anarana marina:",
        "prefs-advancedsearchoptions": "Antsipirihan-tsafidy",
        "prefs-advancedwatchlist": "Antsipirihan-tsafidy",
        "prefs-displayrc": "safidim-tseho",
-       "prefs-displaysearchoptions": "Safidin-tseho",
        "prefs-displaywatchlist": "Safidin-tseho",
        "prefs-tokenwatchlist": "Token",
        "prefs-diffs": "Diff",
        "recentchanges-legend-heading": "'''Maribolana:'''",
        "recentchanges-legend-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).",
-       "rclistfrom": "Asehoy izay vao niova manomboka ny $1",
+       "rclistfrom": "Asehoy izay vao niova manomboka ny $3 $2",
        "rcshowhideminor": "$1 ny fanovàna kely",
        "rcshowhideminor-show": "Haneho",
        "rcshowhideminor-hide": "Hanafina",
        "rcshowhidebots-hide": "Hanafina",
        "rcshowhideliu": "$1 ny mpikambana nisoratra anarana",
        "rcshowhideliu-show": "Haneho",
-       "rcshowhideliu-hide": "Hanadina",
+       "rcshowhideliu-hide": "Hanafina",
        "rcshowhideanons": "$1 ny mpikambana tsy nisoratra anarana",
        "rcshowhideanons-show": "Haneho",
        "rcshowhideanons-hide": "Hanafina",
        "uploadstash-errclear": "Tsy navokatra ny famafana rakitra.",
        "uploadstash-refresh": "Vaozina ny lisi-drakitra",
        "img-auth-accessdenied": "Tsy afa-mankao",
-       "img-auth-nopathinfo": "Tsy misy PATH_INFO.\nTsy voaparametatra ny lohamilinao hampita io fampahalalàna io.\nMety mampiasa CGI angamba ilay lohamilina ka tsy mahazaka an'i img_auth\nVangio ny https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "Tsy misy PATH_INFO.\nTsy voaparametatra ny lohamilinao hampita io fampahalalàna io.\nMety mampiasa CGI angamba ilay lohamilina ka tsy mahazaka an'i img_auth\nVangio ny https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Ny lalana nangatahana dia tsy ny petra-drakitra nokaonfigiorena.",
        "img-auth-badtitle": "Tsy afaka mamorona lohateny azo ampiasaina avy amin'ny « $1 ».",
        "img-auth-nologinnWL": "Tsy mbola niditra ianao ary tsy ao amin'ny lisitra fotsy « $1 ».",
        "log-title-wildcard": "Hitady amin'ny lohateny manomboka amin'io soratra io",
        "showhideselectedlogentries": "Haneho/Hanafina ny iditry ny laogy nofidiana",
        "allpages": "Pejy rehetra",
-       "alphaindexline": "$1 hatramin'ny $2",
        "nextpage": "Pejy manaraka ($1)",
        "prevpage": "Pejy taloha ($1)",
        "allpagesfrom": "Asehoy ny pejy manomboka ny:",
        "listgrouprights-removegroup-self": "Afaka manala ny tenany amin'ny vondrona{{PLURAL:$2}} : $1",
        "listgrouprights-addgroup-self-all": "Manampy ny vondrom-pikambana rehetra amin'ny kaontiny",
        "listgrouprights-removegroup-self-all": "Manala ny vondrom-pikambana rehetra amin'ny kaontiny",
+       "listgrouprights-namespaceprotection-header": "Fifehezana amin'ny valan'anarana",
+       "listgrouprights-namespaceprotection-namespace": "Valan'anarana",
+       "listgrouprights-namespaceprotection-restrictedto": "Zo ahafahan'ny mpikambana manova",
+       "trackingcategories": "Sokajy fanarahana",
+       "trackingcategories-msg": "Sokajy fanarahana",
+       "trackingcategories-name": "Anaran-kafatra",
+       "trackingcategories-nodesc": "Tsy ahitana famaritana.",
+       "trackingcategories-disabled": "Tsy nalefa ho ampiasaina ilay sokajy",
        "mailnologin": "Tsy misy adiresy handefasana ny tenimiafina",
        "mailnologintext": "Mila [[Special:UserLogin|miditra]] ianao sady manana imailaka mandeha sy voamarina ao amin'ny [[Special:Preferences|mombamomba anao]] vao afaka mandefa imailaka amin'ny mpikambana hafa.",
        "emailuser": "Andefaso imailaka io mpikambana io",
        "watchlist-details": "Pejy $1{{PLURAL:}} ao amin'ny lisitry ny pejy arahanao, tsy isaina ny pejin-dresaka.",
        "wlheader-enotif": "Alefa ny fampilazana amin'ny mailaka.",
        "wlheader-showupdated": "Aseho '''sorabaventy''' ny pejy niova taorian'ny famangianao azy farany.",
-       "watchmethod-recent": "fanamarinana ny fiovana farany hahitana pejy arahana",
-       "watchmethod-list": "fanamarinana ny pejy arahana hahitana fiovana vao haingana",
-       "watchlistcontains": "Ao amin'ny pejy arahanao dia ahitana pejy $1{{PLURAL:}}.",
-       "iteminvalidname": "Olana amin'ny zavatra « $1 » : tsy ara-dalàna ny anarana...",
        "wlshowlast": "Haneho ny $1 ora farany, ny $2 andro farany na $3",
        "watchlist-options": "Safidy ny lisitry ny pejy arahana",
        "watching": "Fanarahana...",
        "enotif_lastvisited": "Jereo eto $1 ny niova rehetra hatramin'ny fitsidihanao farany.",
        "enotif_lastdiff": "Jereo $1 mba ahitana ireo fanovana ireo.",
        "enotif_anon_editor": "mpikambana tsy nisoratra anarana $1",
-       "enotif_body": "Tompoko $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nAmbangovangon'ny mpikambana nanova : $PAGESUMMARY $PAGEMINOREDIT\n\nIfandraisana amin'io mpikambana io :\nmailaka : $PAGEEDITOR_EMAIL\nwiki : $PAGEEDITOR_WIKI\n\nTsy hisy fampandrenesana hafa raha misy mpikambana manova aorian'ny nandefasana ity mailaka ity, raha tsy hoe mitsidika ilay pejy ianao. Azonao atao koa ny mamerina ho aotra ny flag fampandrenesana ho an'ny pejy rehetra ao amin'ny lisitry ny pejy arahanao.\n\n             Ny rafitr'i {{SITENAME}} mampandre anao.\n\n--\nRehefa hanova ny parametatra mikasika ny fampandrenesana amin'ny alalan'ny mailaka, tsidiho\n{{canonicalurl:{{#special:Preferences}}}}\n\n\nRehefa tia hanova ny parametatray ny lisitry ny pejy arahanao, tsidiho\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nRehefa tsy hanaraka ilay pejy intsony ianao dia tsidiho\n$UNWATCHURL\n\nVerindrohy ary fanampiana:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Tompoko $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nAmbangovangon'ny mpikambana nanova : $PAGESUMMARY $PAGEMINOREDIT\n\nIfandraisana amin'io mpikambana io :\nmailaka : $PAGEEDITOR_EMAIL\nwiki : $PAGEEDITOR_WIKI\n\nTsy hisy fampandrenesana hafa raha misy mpikambana manova aorian'ny nandefasana ity mailaka ity, raha tsy hoe mitsidika ilay pejy ianao. Azonao atao koa ny mamerina ho aotra ny flag fampandrenesana ho an'ny pejy rehetra ao amin'ny lisitry ny pejy arahanao.\n\n             Ny rafitr'i {{SITENAME}} mampandre anao.\n\n--\nRehefa hanova ny parametatra mikasika ny fampandrenesana amin'ny alalan'ny mailaka, tsidiho\n{{canonicalurl:{{#special:Preferences}}}}\n\n\nRehefa tia hanova ny parametatray ny lisitry ny pejy arahanao, tsidiho\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nRehefa tsy hanaraka ilay pejy intsony ianao dia tsidiho\n$UNWATCHURL\n\nVerindrohy ary fanampiana:\n$HELPPAGE",
        "created": "voaforona",
        "changed": "voaova",
        "deletepage": "Hamafa ny pejy",
        "blockip": "Sakano ny 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).",
-       "ipadressorusername": "Adiresy IP na solonanarana",
+       "ipaddressorusername": "Adiresy IP na solonanarana",
        "ipbexpiry": "Fahataperana",
        "ipbreason": "Antony :",
        "ipb-hardblock": "Hanakana ny mpikambana nisoratra anarana mampiasa ity adiresy IP ity",
        "tooltip-preferences-save": "Tehirizina ny safidy",
        "tooltip-summary": "Atsofohy eo ambangovangony fohifohy",
        "monobook.css": "/* Ovay ity rakitra ity raha hampiasa takilan'angaly (stylesheet) anao manokana amin'ny wiki iray manontolo */",
-       "notacceptable": "Tsy afaka manome données amin'ny format zakan'ny navigateur-nao ny serveur wiki.",
        "anonymous": "Mpikambana {{PLURAL:$1}} tsy mitonona anarana eto amin'ny {{SITENAME}}",
        "siteuser": "{{SITENAME}} mpikambana $1",
        "anonuser": "ny mpikambana tsy nisoratra anarana $1 an'i {{SITENAME}}",
        "imagelisttext": "{{PLURAL:}}Eto ambany ny lisitran'ny rakitra $1 milahatra araka ny $2.",
        "newimages-legend": "Anaran-drakitra",
        "newimages-label": "Anaran-drakitra (na singan'izy io) :",
-       "showhidebots": "(rôbô $1)",
        "noimages": "Tsy misy sary ato.",
        "ilsubmit": "Karohy",
        "bydate": "araka ny daty",
        "autosumm-replace": "Votoatiny novaina ho « $1 »",
        "autoredircomment": "Pejy fihodinana mankany [[$1]]",
        "autosumm-new": "Pejy voaforona amin'ny « $1 »",
-       "livepreview-loading": "Am-pakàna…",
-       "livepreview-ready": "Am-pakàna … vita !",
-       "livepreview-failed": "Tsy nandeha soa aman-tsara ny topi-maso haingankaingana !\nAndrano ny topi-maso tsotra.",
-       "livepreview-error": "Tsy afaka mifandray : $1 « $2 ».\nAndramo ny topi-maso tsotra",
        "lag-warn-normal": "Ny fanovana vaovao nohon'ny $1 segondra {{PLURAL:}} dia tsy hiseho eo amin'ity lisitra ity.",
        "lag-warn-high": "Noho ny hataraiky ny lohamilin'ny banky angona, tsy hiseho eto ny fanovana natao tao anatin'ny fotoana latsaky ny $1 segondra{{PLURAL:}}.",
-       "watchlistedit-numitems": "Ny lisitry ny pejy arahanao maso dia misy {{PLURAL:$1|lohateny iray|lohateny $1}}, raha tsy kaontiana ny pejin-dresaka.",
-       "watchlistedit-noitems": "Tsy misy lohateny ny lisitrao.",
        "watchlistedit-normal-title": "Hanova ny lisitra ny pejy arahako maso",
        "watchlistedit-normal-legend": "Hanala lohateny ao amin'ny lisitra",
        "watchlistedit-normal-explain": "Aseho eo ambany ny lohateny ao amin'ny lisitry ny pejy arahanao.\nTsindrio ny boaty eo akaikiny ary tsindrio  « {{int:Watchlistedit-normal-submit}} ».\nAzonao atao ihany koa ny [[Special:EditWatchlist/raw|manova ilay lisitra amin'ny akorany]].",
        "compare-rev1": "Versiona 1",
        "compare-rev2": "Versiona 2",
        "compare-submit": "Ampitahao",
-       "dberr-header": "Misy olana io wiki io",
        "dberr-problems": "Azafady Tompoko ! Manana olana ara-teknika ny sehatra.",
        "dberr-again": "Miandrasa minitra vitsivitsy ary alefaso fanindroany",
        "dberr-info": "(Tsy afaka mifandray amin'ny lohamilin'ny database : $1)",
index ce0ff9a..8b6be56 100644 (file)
@@ -8,7 +8,9 @@
                        "Lifeway",
                        "Shirayuki",
                        "Сай",
-                       "Санюн Вадик"
+                       "Санюн Вадик",
+                       "아라",
+                       "Sergey Ivanov"
                ]
        },
        "tog-underline": "Кузе кылвер-влакым ӱлычын удыралаш?",
@@ -19,7 +21,6 @@
        "tog-usenewrc": "У тӧрлатымаш саемдыме лӱмерым кучылташ (JavaScript кӱлеш)",
        "tog-numberheadings": "Вуймутым автоматик йӧн дене радамлаш",
        "tog-showtoolbar": "Тӧрлатымаш ӱзгараҥам ончыкташ",
-       "tog-rememberpassword": "Тиде компьютерышто мыйын шолыпмутым шарнаш (эн шуко $1 {{PLURAL:$1|1=кечылын|кечылан}})",
        "tog-watchcreations": "Мыйын ыштыме лаштык-влакым эскерыме лӱмерыш ешараш",
        "tog-watchdefault": "Мыйын тӧрлатыме лаштык-влакым эскерыме лӱмерыш ешараш",
        "tog-watchmoves": "Мыйын лӱмым вашталтыме лаштык-влакым эскерыме лӱмерыш ешараш",
        "faq": "ЧӱВаЙо (Чӱчкыдын вашлиялтше йодыш-влак)",
        "vector-action-addsection": "У ӱжашым тӱҥалаш",
        "vector-action-delete": "Шӧраш",
-       "vector-action-move": "Ð\9aÑ\83Ñ\81аÑ\80аш",
+       "vector-action-move": "Ð\9bӱмÑ\8bм Ð²Ð°Ñ\88Ñ\82алÑ\82аш",
        "vector-action-protect": "Тӧрлатымаш деч аралаш",
        "vector-action-undelete": "Шӧрымым пӧртылаш",
        "vector-action-unprotect": "Оролым вашталташ",
        "internalerror": "Кӧргысӧ йоҥылыш",
        "internalerror_info": "Кӧргысӧ йоҥылыш: $1",
        "filecopyerror": "«$1» гыч «$2» файлыш копийым ышташ ок лий.",
-       "fileexistserror": "«$1» файлыш возыкым ышташ лийдыме: файл уло.",
        "unexpected": "Келшыдыме кугыт: «$1»=«$2».",
        "cannotdelete-title": "\"$1\" лаштыкым шӧраш ок лий",
        "badtitle": "Уда лӱм",
        "recreate-moveddeleted-warn": "'''Йолташ, тиде лаштыкым тиддеч ончыч шӧреныт.''' Тудым илаҥдарыме деч ончыч, тыгай лаштык кӱлешак мо - тергыман. Ӱлнырак шӧрымаш да лӱм вашталтымаш журнал-влакым шергал лекташ лиеш.",
        "moveddeleted-notice": "Тиде лаштык шӧралтын.\nЛаштыклан шӧрымӧ да кусарыме нерген журнал ӱлнӧ ончыктымо.",
        "viewpagelogs": "Тиде лаштыклан журнал-влакым ончыкташ",
-       "currentrev": "Кызытсе тӱрлык",
-       "currentrev-asof": "$1 кечын кызытсе тӱрлык",
-       "revisionasof": "$1 тӱрлык",
+       "currentrev": "Кызытсе версий",
+       "currentrev-asof": "$1 кызытсе версий",
+       "revisionasof": "$1 версий",
        "revision-info": "$1; $2 деч версий",
-       "previousrevision": "← Ончычсо тӱрлык",
+       "previousrevision": "← Ончычсо версий",
        "nextrevision": "Весе →",
        "currentrevisionlink": "Кызытсе",
        "cur": "кызыт",
        "revdelete-reasonotherlist": "Вес амал",
        "mergehistory-reason": "Амал:",
        "revertmerge": "Ойыраш",
-       "history-title": "$1лан тӱрлык эртымгорно",
+       "history-title": "$1 — вашталтылме эртымгорно",
        "lineno": "$1 корно:",
        "compareselectedversions": "Ойырымо версий-влакым таҥастараш",
        "editundo": "чараш",
        "search-nonefound": "Тыйын йодышет почеш нимо муалтын огыл",
        "powersearch-legend": "Сайынрак кычалаш",
        "powersearch-ns": "Кычалаш тиде лӱм-влакын кумдыкышт-влакыште:",
-       "powersearch-redir": "Вес вере колтымо лаштык-влакым ончыкташ",
        "powersearch-togglelabel": "Сайлаш:",
        "powersearch-toggleall": "Чыла",
        "powersearch-togglenone": "Нимо",
        "prefs-emailconfirm-label": "Электрон почто пеҥгыдемдыме:",
        "youremail": "Электрон почто:",
        "username": "{{GENDER:$1|Пайдаланышын лӱмжӧ|Пайдаланышын лӱмжӧ}}:",
-       "uid": "{{GENDER:$1|Пайдаланышын}} ID-же:",
        "prefs-memberingroups": "{{PLURAL:$1|1=Тӱшкаште шогышо|Тӱшка-влакыште шогышо}}:",
        "yourrealname": "Чын лӱмжӧ:",
        "yourlanguage": "Йылме:",
        "grouppage-bot": "{{ns:project}}:Бот-влак",
        "grouppage-sysop": "{{ns:project}}:Сайтвиктарыше-влак",
        "newuserlogpage": "У пайдаланыше регистрацийым эртарыме журнал",
-       "rightslog": "Ð\9fайдаланÑ\8bÑ\88Ñ\8bн ÐºÐµÑ\80Ñ\82Ñ\8bж Ð½ÐµÑ\80ген журнал",
+       "rightslog": "УÑ\87аÑ\81Ñ\82никÑ\8bн Ð¿Ñ\80аваже-влакÑ\8bм Ð¾Ð½Ñ\87Ñ\8bкÑ\82Ñ\8bÑ\88о журнал",
        "action-edit": "тиде лаштыкым тӧрлаташ",
        "nchanges": "$1 {{PLURAL:$1|тӧрлатымаш}}",
        "recentchanges": "Пытартыш тӧрлатымаш-влак",
        "recentchanges-label-unpatrolled": "Тиде тӧрлатымашым нигӧ терген огыл",
        "recentchanges-legend-newpage": "$1 - у лаштык",
        "rcnotefrom": "Ниже перечислены изменения с '''$2''' (не более '''$1''').",
-       "rclistfrom": "$1 гыч тӱҥалын у вашталтымашым ончыкташ",
+       "rclistfrom": "$3 $2 гыч тӱҥалын у вашталтымашым ончыкташ",
        "rcshowhideminor": "Изи тӧрлатымашым $1",
        "rcshowhidebots": "Бот-влакым $1",
        "rcshowhideliu": "Шолып пайдаланыше-влакым $1",
        "linkstoimage": "Тиде {{PLURAL:$1|1=$1 лаштык саде файл дене кылдалтын|$1 лаштык-влак саде файл дене кылдалтыныт}}:",
        "nolinkstoimage": "Тиде файл дене кылдалтше ик лаштыкат уке.",
        "sharedupload": "Тиде файлын верже: $1, туге гынат, тудым моло веренат кучылташ лиеш.",
-       "uploadnewversion-linktext": "Тиде файлын у тӱрлыкшым пурташ",
+       "uploadnewversion-linktext": "Тиде файлын у версийжым пурташ",
        "filedelete-comment": "Амал:",
        "filedelete-submit": "Шӧраш",
        "filedelete-otherreason": "Вес/ешартыш амал:",
        "usercreated": "$1, $2 шагатлан {{GENDER:$3|регистрацийым эртен|регистрацийым эртен}}",
        "newpages": "У лаштык-влак",
        "newpages-username": "Пайдаланышын лӱмжӧ:",
-       "move": "Ð\9aÑ\83Ñ\81аÑ\80аш",
-       "movethispage": "Тиде Ð»Ð°Ñ\88Ñ\82Ñ\8bкÑ\8bм ÐºÑ\83Ñ\81аÑ\80аш",
+       "move": "Ð\9bӱмÑ\8bм Ð²Ð°Ñ\88Ñ\82алÑ\82аш",
+       "movethispage": "Тиде Ð»Ð°Ñ\88Ñ\82Ñ\8bкÑ\8bн Ð»Ó±Ð¼Ð¶Ñ\8bм Ð²Ð°Ñ\88Ñ\82алÑ\82аш",
        "pager-newer-n": "{{PLURAL:$1|1=вес|вес}}",
        "pager-older-n": "{{PLURAL:$1|1=ончычсо|ончычсо}}",
        "booksources": "Негызым пыштыше кнага-влак",
        "specialloguserlabel": "Пайдаланыше:",
        "log": "Журнал-влак",
        "allpages": "Чыла лаштык-влак",
-       "alphaindexline": "$1 $2 марте",
        "prevpage": "Ончычсо лаштык ($1)",
        "allpagesfrom": "Лукташ тыгай лӱман лаштык-влакым, кудыжо тӱҥалыт:",
        "allpagesto": "кудыжо пытат:",
        "unwatch": "Эскерыман огыл",
        "unwatchthispage": "Эскерымым чарнаш",
        "watchlist-details": "Эскерымаш лӱмерыштет $1 {{PLURAL:$1|лаштык}}, каҥашымаш лаштык-влакым шотлыде",
-       "watchlistcontains": "Тыйын лӱмерыште $1 {{PLURAL:$1|1=лаштык|лаштык}}.",
        "wlshowlast": "Пытартыш $1 шагат $2 кечылан $3 ончыкташ",
        "watchlist-options": "Эскерыме лӱмерын келыштарымаш",
        "watching": "Эскерымаш лӱмерыш ешарымаш...",
        "blocklogentry": "[[$1]] лан йӧным петрен $2 $3 мучашлалтеш",
        "unblocklogentry": "$1лан йӧным почмо",
        "block-log-flags-nocreate": "у пайдаланыше-влаклан регистрацийым чактарыме",
-       "move-page-legend": "Ð\9bаÑ\88Ñ\82Ñ\8bкÑ\8bм ÐºÑ\83Ñ\81аÑ\80аш",
+       "move-page-legend": "Ð\9bаÑ\88Ñ\82Ñ\8bкÑ\8bн Ð»Ó±Ð¼Ð¶Ñ\8bм Ð²Ð°Ñ\88Ñ\82алÑ\82Ñ\8bмаш",
        "movepagetext": "Ӱлыл формо дене пайдаланен, тый лаштыкын лӱмым вашталтен кертат, тудын вашталтыме эртымгорныже у верыш кусарыме.\nТошто лӱмыштӧ у лӱмыш колтымо лаштык кодеш.\nТый тошто лӱмыш колтымо лаштык-влакым шке семын вашталтке кертат.\nТый тидым ынет ыште гын, [[Special:DoubleRedirects|кокытан]] да [[Special:BrokenRedirects|пудыргышо вес вере колтымашым]] терге.\nТый палемдыме верыш кылвер-влаклан шуйнымылан да тушко ончыктымылан вуйын шогет.\n\nШотыш нал: кунам у лӱман лаштык уло, тудо '''ок''' кусаралт. Тыге огыл, кунам лаштык вес вере кусаралтеш але тудо яра да вашталтымаш эртымгорныже уке.\nТый лаштыкым йонгылыш кусаренат гын менгешла тудым тошто лӱмыш кусарен кертат, но тый уже улшо лаштыкым ӱштын от керт, манын ончыкта.\n\n'''Тӱтко лий!'''\nЧӱчкыдын кучылтмо лаштыклан тиде кугу вашталтышым ыштен кертеш;\nУмбаке кайыме деч ончыч шоналте, тый тидын деч вара лиймым умылет.",
        "movepagetalktext": "Тиде лаштыкын каҥашымаш лаштык шке семын огеш кусно, '''тидлан амалже:'''\n*Тыгай лӱман яра огыл каҥашымаш лаштык уло ала\n*Ӱлыч кайыкым от корангде.\n\nТыгай годым тылат лаштыкым шке кидет дене кусараш але иктеш ушнаш кӱлеш.",
-       "movearticle": "Тиде Ð»Ð°Ñ\88Ñ\82Ñ\8bкÑ\8bм ÐºÑ\83Ñ\81аÑ\80аш:",
+       "movearticle": "Тиде Ð»Ð°Ñ\88Ñ\82Ñ\8bкÑ\8bн Ð»Ó±Ð¼Ð¶Ñ\8bм Ð²Ð°Ñ\88Ñ\82алÑ\82аш:",
        "newtitle": "У лӱм:",
        "move-watch": "Тиде лаштыкым эскераш",
-       "movepagebtn": "Ð\9bаÑ\88Ñ\82Ñ\8bкÑ\8bм ÐºÑ\83Ñ\81аÑ\80аш",
+       "movepagebtn": "Ð\9bаÑ\88Ñ\82Ñ\8bкÑ\8bн Ð»Ó±Ð¼Ð¶Ñ\8bм Ð²Ð°Ñ\88Ñ\82алÑ\82аш",
        "pagemovedsub": "Кусарымаш сайын эртен",
        "movepage-moved": "'''\"$1\" лаштыкым \"$2\" лаштыкыш кусарыме'''",
        "movepage-moved-redirect": "Вес вере колтымаш ыштыме.",
        "movepage-moved-noredirect": "Вес вере колтымаш ыштыме огыл.",
        "articleexists": "Тыгай лӱман лаштык уло але тиде лӱмым кучылташ огеш лий. Вес лӱмым ойыро.",
-       "movetalk": "Ð\9aаҥаÑ\88Ñ\8bмаÑ\88 Ð»Ð°Ñ\88Ñ\82Ñ\8bкÑ\8bм ÐºÑ\83Ñ\81аÑ\80аш",
+       "movetalk": "Ð\9aаҥаÑ\88Ñ\8bмаÑ\88 Ð»Ð°Ñ\88Ñ\82Ñ\8bкÑ\8bн Ð»Ó±Ð¼Ð¶Ñ\8bм Ð²Ð°Ñ\88Ñ\82алÑ\82аш",
        "movelogpage": "Кусарыме нерген журнал",
        "movereason": "Амал:",
        "revertmove": "мӧҥгешла пӧртылаш",
        "tooltip-ca-history": "Лаштыкын ондаксе тӧрлатымаш",
        "tooltip-ca-protect": "Тиде лаштыкым тӧрлатымаш деч аралаш",
        "tooltip-ca-delete": "Тиде лаштыкым шӧраш",
-       "tooltip-ca-move": "Тиде Ð»Ð°Ñ\88Ñ\82Ñ\8bкÑ\8bм ÐºÑ\83Ñ\81аÑ\80аш",
+       "tooltip-ca-move": "Тиде Ð»Ð°Ñ\88Ñ\82Ñ\8bкÑ\8bн Ð»Ó±Ð¼Ð¶Ñ\8bм Ð²Ð°Ñ\88Ñ\82алÑ\82аш",
        "tooltip-ca-watch": "Тиде лаштыкым тыйын эскерыме лӱмерыш ешараш",
        "tooltip-ca-unwatch": "Тиде лаштыкым тыйын эскерымашет гыч кораҥдаш",
        "tooltip-search": "{{SITENAME}} лаштыкыште кычалаш",
        "svg-long-desc": "SVG файл, шкенжын кугытшо: $1 × $2 пиксел, файлын кугытшо: $3",
        "show-big-image": "Шкенжын чаплыкше",
        "newimages-legend": "Фильтр",
-       "showhidebots": "(Бот-влакым $1 )",
        "ilsubmit": "Кычал",
        "bad_image_list": "Формат тыгай лийшаш:\n\nЛӱмерын ужашыже-влак гына шотыш налалташ тӱналалтыт (* дене туҥалше корно-влак).\nКорнышто икымше кылвер шӱкшӧ файлыш кылвер семын лийшаш.\nТиде корнышто вара лийше кылвер-влак лийын кертдыме семын ончалтыт: файлыш кылверан лаштык-влак.",
        "metadata": "Метаданный-влак",
index ac865cc..df1ce4f 100644 (file)
@@ -7,7 +7,8 @@
                        "Naval Scene",
                        "Rahmatdenas",
                        "SpartacksCompatriot",
-                       "VoteITP"
+                       "VoteITP",
+                       "아라"
                ]
        },
        "tog-underline": "Garih bawahi tautan:",
@@ -20,7 +21,6 @@
        "tog-showtoolbar": "Tunjuakan bilah panyuntiangan (paralu JavaScript)",
        "tog-editondblclick": "Suntiang laman jo klik duo kali (paralu JavaScript)",
        "tog-editsectiononrightclick": "Aktipan bagian panyuntiangan jo mangklik kanan pado judul bagian (paralu JavaScript)",
-       "tog-rememberpassword": "Ingek log masuak denai di paramban ko (salamo $1 {{PLURAL:$1|hari}})",
        "tog-watchcreations": "Tambahan laman nan den buek jo gambar nan den unggah ka daftar pantau",
        "tog-watchdefault": "Tambahan laman jo gambar nan den suntiang ka daftar pantau",
        "tog-watchmoves": "Tambahan laman jo gambar nan den pindah ka daftar pantau",
        "readonly_lag": "Basis data alah dikunci otomatis salagi basis data sakunder malakukan sinkronisasi jo basis data utamo",
        "internalerror": "Kasalahan internal",
        "internalerror_info": "Kasalahan internal: $1",
-       "fileappenderrorread": "Indak dapek mambaco \"$1\" saat panambahan.",
-       "fileappenderror": "Indak dapek mamasuakkan \"$1\" ka \"$2\".",
        "filecopyerror": "Indak dapek manyalin berkas \"$1\" ke \"$2\".",
        "filerenameerror": "Indak dapek maubah namo berkas \"$1\" manjadi \"$2\".",
        "filedeleteerror": "Indak dapek mahapuih berkas \"$1\".",
        "directorycreateerror": "Indak dapek mambuek direktori \"$1\".",
        "filenotfound": "Indak dapek manamukan berkas \"$1\".",
-       "fileexistserror": "Indak dapek manulih berkas \"$1\": berkas lah ado.",
        "unexpected": "Nilai di lua jangkauan: \"$1\"=\"$2\".",
        "formerror": "Kasalahan: Indak dapek mangiriman formulir",
        "badarticleerror": "Tindakan iko indak dapek dilaksanakan di laman iko.",
        "gotaccountlink": "Masuak log",
        "userlogin-resetlink": "Lupo rincian info masuak Sanak?",
        "userlogin-resetpassword-link": "Buek ulang kato sandi",
-       "createacct-join": "Masuakan informasi Sanak di bawah ko.",
        "createacct-emailrequired": "Alamaik surel",
        "createacct-emailoptional": "Alamaik surel (opsional)",
        "createacct-email-ph": "Masuakan alamaik surel Sanak",
        "savearticle": "Simpan",
        "preview": "Caliak",
        "showpreview": "Pratonton",
-       "showlivepreview": "Pratayang langsuang",
        "showdiff": "Parubahan",
        "anoneditwarning": "'''Ingek:''' Sanak alun masuak log.\nAlamat IP sanak tacatat pado riwayaik suntiangan laman ko.",
        "anonpreviewwarning": "''Sanak alun masuak log. Manyimpan laman akan manyababkan alamaik IP Sanak tacatat pado riwayat suntiangan laman iko.''",
        "search-nonefound": "Indak ado hasil nan cocok sasuai jo parmintaan",
        "powersearch-legend": "Pencarian lanjut",
        "powersearch-ns": "Mancari di ruangnamo:",
-       "powersearch-redir": "Daftar pangaliahan",
        "powersearch-togglelabel": "Piliah:",
        "powersearch-toggleall": "Sadonyo",
        "powersearch-togglenone": "Dak ado",
        "prefs-advancedsearchoptions": "Piliahan lanjuik",
        "prefs-advancedwatchlist": "Piliahan lanjuik",
        "prefs-displayrc": "Piliahan tampilan",
-       "prefs-displaysearchoptions": "Piliahan tampilan",
        "prefs-displaywatchlist": "Piliahan tampilan",
        "prefs-diffs": "Pabedoan",
        "email-address-validity-valid": "Alamaik surel nampaknyo sah",
        "recentchanges-label-bot": "Suntiang ko dibuek dek bot",
        "recentchanges-label-unpatrolled": "Suntiangan ko alun dipatroli",
        "rcnotefrom": "Di bawah ko ado parubahan mulai dari '''$2''' (sampai '''$1''' parubahan).",
-       "rclistfrom": "Tunjuakan parubahan baru mulai dari tanggal $1",
+       "rclistfrom": "Tunjuakan parubahan baru mulai dari tanggal $3 $2",
        "rcshowhideminor": "$1 suntiangan ketek",
        "rcshowhidebots": "$1 bot",
        "rcshowhideliu": "$1 pangguno masuak log",
        "tooltip-preferences-save": "Simpan preferensi",
        "tooltip-summary": "Buek ringkasan pendek",
        "print.css": "/* CSS placed here will affect the print output */",
-       "notacceptable": "Server wiki indak dapek manyadioan data dalam format nan dapek dibaco dek klien Sanak.",
        "anonymous": "{{PLURAL:$1|Pangguno}} anonim {{SITENAME}}",
        "siteuser": "pangguno {{SITENAME}} $1",
        "anonuser": "pangguno anonim {{SITENAME}} $1",
        "compare-invalid-title": "Judul nan Sanak agiah indak sah.",
        "compare-title-not-exists": "Judul nan dituju indak basobok.",
        "compare-revision-not-exists": "Revisi nan dituju indak basobok.",
-       "dberr-header": "Wiki ko bamasalah",
        "dberr-problems": "Maaf! Situs ko mangalami masalah teknis.",
        "htmlform-required": "Nilai ko diparaluan",
        "logentry-delete-delete": "$1 {{GENDER:$2|mangapuih}} laman $3",
index 484d759..9bb0619 100644 (file)
@@ -13,7 +13,8 @@
                        "Rancher",
                        "Spacebirdy",
                        "Urhixidur",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Потцртување на врски:",
        "jumptonavigation": "содржини",
        "jumptosearch": "барај",
        "view-pool-error": "За жал во моментов опслужувачите се преоптоварени.\nПремногу корисници се обидуваат да ја прегледаат оваа страница.\nВе молиме почекајте некое време пред повторно да се обидете да пристапите до оваа страница.\n\n$1",
+       "generic-pool-error": "За жал во моментов опслужувачите се преоптоварени.\nПремногу корисници се обидуваат да го прегледаат овој ресурс.\nПочекајте некое време, па обидете се повторно.",
        "pool-timeout": "Истече времето за чекање на заклучувањето",
        "pool-queuefull": "Редицата на барања е полна",
        "pool-errorunknown": "Непозната грешка",
        "readonly_lag": "Базата е автоматски заклучена додека помошните опслужувачи не се усогласат",
        "internalerror": "Внатрешна грешка",
        "internalerror_info": "Внатрешна грешка: $1",
-       "fileappenderrorread": "Не можев да го прочитам „$1“ во текот на придодавањето.",
-       "fileappenderror": "Не можe да се додаде „$1“ на „$2“.",
        "filecopyerror": "Не можeв да ја ископирам податотеката „$1“ во „$2“.",
        "filerenameerror": "Не можев да ја преименувам податотеката „$1“ во „$2“.",
        "filedeleteerror": "Не може да се избрише податотеката „$1“.",
        "directorycreateerror": "Не можеше да се создаде именикот „$1“.",
        "filenotfound": "Не може да се најде податотеката „$1“.",
-       "fileexistserror": "Не може да се запишува во податотеката „$1“: податотеката постои",
        "unexpected": "Неочекувана вредност: „$1“=„$2“.",
        "formerror": "Грешка: не можам да го испратам образецот",
        "badarticleerror": "Ова дејство не може да се спроведе на оваа страница.",
        "userlogin-helplink2": "Помош за најава",
        "userlogin-loggedin": "Веќе сте најавени како {{GENDER:$1|$1}}.\nСо образецот подолу можете да се најавите како друг корисник.",
        "userlogin-createanother": "Направи нова сметка",
-       "createacct-join": "Внесете ваши информации",
-       "createacct-another-join": "Подолу внесете податоци за сметката",
        "createacct-emailrequired": "Е-пошта",
        "createacct-emailoptional": "Е-пошта (незадолжително)",
        "createacct-email-ph": "Внесете е-пошта",
        "savearticle": "Зачувај",
        "preview": "Преглед",
        "showpreview": "Преглед",
-       "showlivepreview": "Преглед во живо",
        "showdiff": "Прикажи промени",
        "anoneditwarning": "'''Предупредување:''' Не сте најавени.\nВашата IP-адреса ќе биде заведена во историјата на уредување на страницата.",
        "anonpreviewwarning": "''Не сте најавени. Ако ја зачувате, Вашата IP-адреса ќе биде заведена во историјата на уредување на страницата.''",
        "previewnote": "'''Имајте предвид дека ова е само преглед.'''\nПромените сè уште не се зачувани!",
        "continue-editing": "Оди на полето за уредување",
        "previewconflict": "Овој преглед прикажува како ќе изгледа текстот внесен во горниот дел откако ќе се зачува страницата.",
-       "session_fail_preview": "'''Жалиме! Не можевме да го обработиме вашето уредување поради загуба на сесиски податоци.'''\nОбидете се повторно.\nАко сè уште не функционира, обидете се да се [[Special:UserLogout|одјавите]] и повторно да се најавите.",
-       "session_fail_preview_html": "'''Ð\96алиме, Ð½Ð¾ Ð\92аÑ\88еÑ\82о Ñ\83Ñ\80едÑ\83ваÑ\9aе Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ\88е Ð´Ð° Ñ\81е Ð¾Ð±Ñ\80абоÑ\82и Ð¿Ð¾Ñ\80ади Ð³Ñ\83беÑ\9aе Ð½Ð° Ñ\81еÑ\81иÑ\81киÑ\82е Ð¿Ð¾Ð´Ð°Ñ\82оÑ\86и.'''\n\n''{{SITENAME}} има овозможено чист HTML, па прегледот е скриен како мерка за заштита од JavaScript-напади.''\n\n'''Ако ова е разумен обид за уредување, тогаш обидете се повторно.'''\nАко и ова не го реши проблемот, обидете се со [[Special:UserLogout|одјавување]] и повторно најавување.",
+       "session_fail_preview": "'''Жалиме! Не можевме да го обработиме вашето уредување поради загуба на податоци од седницата.'''\nОбидете се повторно.\nАко сè уште не функционира, обидете се да се [[Special:UserLogout|одјавите]] и повторно да се најавите.",
+       "session_fail_preview_html": "'''Ð\96алиме, Ð½Ð¾ Ð\92аÑ\88еÑ\82о Ñ\83Ñ\80едÑ\83ваÑ\9aе Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ\88е Ð´Ð° Ñ\81е Ð¾Ð±Ñ\80абоÑ\82и Ð¿Ð¾Ñ\80ади Ð·Ð°Ð³Ñ\83ва Ð½Ð° Ð¿Ð¾Ð´Ð°Ñ\82оÑ\86иÑ\82е Ð¾Ð´ Ñ\81едниÑ\86аÑ\82а.'''\n\n''{{SITENAME}} има овозможено чист HTML, па прегледот е скриен како мерка за заштита од JavaScript-напади.''\n\n'''Ако ова е разумен обид за уредување, тогаш обидете се повторно.'''\nАко и ова не го реши проблемот, обидете се со [[Special:UserLogout|одјавување]] и повторно најавување.",
        "token_suffix_mismatch": "'''Вашето уредување е одбиено затоа што вашиот пребарувач направил проблеми со интерпукциските знаци во шифрата на уредувањето.\nУредувањето не е прифатено за да се спречи несакана промена на текстот на страницата.\nОва понекогаш се случува кога користите неисправна мрежна анонимна застапничка (proxy) служба.'''",
        "edit_form_incomplete": "'''Некои делови од образецот за уредување не стасаа до опслужувачот. Внимателно проверете дали уреденото не е пореметено и обидете се поввторно.'''",
        "editing": "Уредување на $1",
        "edit-gone-missing": "Не можев да ја подновам страницата.\nВеројатно е избришана.",
        "edit-conflict": "Спротиставеност во уредувањето.",
        "edit-no-change": "Вашите уредувања беа игнорирани, бидејќи не се направени промени врз текстот.",
-       "postedit-confirmation": "Вашето уредување е зачувано.",
+       "postedit-confirmation-created": "Страницата е создадена.",
+       "postedit-confirmation-restored": "Страницата е повратена.",
+       "postedit-confirmation-saved": "Вашето уредување е зачувано.",
        "edit-already-exists": "Не може да се создаде нова страница.\nИстата веќе постои.",
        "defaultmessagetext": "Текст на пораката по основно",
        "content-failed-to-parse": "Не успеав да ја предадам содржината од типот $2 за моделот $1: $3",
        "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)",
        "search-nonefound": "Нема резултати што одговараат на бараното.",
        "powersearch-legend": "Напредно пребарување",
        "powersearch-ns": "Пребарај во следниве именски простори:",
-       "powersearch-redir": "Дај и пренасочувања",
        "powersearch-togglelabel": "Одбери:",
        "powersearch-toggleall": "Сè",
        "powersearch-togglenone": "Ништо",
        "prefs-emailconfirm-label": "Потврда на е-пошта:",
        "youremail": "Е-пошта:",
        "username": "{{GENDER:$1|Корисничко име}}:",
-       "uid": "{{GENDER:$1|Кориснички бр.}}:",
        "prefs-memberingroups": "{{GENDER:$2|Член}} на {{PLURAL:$1|групата|групите}}:",
        "prefs-registration": "Време на регистрација:",
        "yourrealname": "Вистинско име:",
        "prefs-advancedsearchoptions": "Напредни нагодувања",
        "prefs-advancedwatchlist": "Напредни нагодувања",
        "prefs-displayrc": "Нагодувања на приказот",
-       "prefs-displaysearchoptions": "Нагодувања на приказот",
        "prefs-displaywatchlist": "Нагодувања на приказот",
        "prefs-tokenwatchlist": "Шифра",
        "prefs-diffs": "Разлики",
        "right-move": "Преместување страници",
        "right-move-subpages": "Преместување на страници со нивните потстраници",
        "right-move-rootuserpages": "Преместување на основна корисничка страница",
+       "right-move-categorypages": "Преместување на категориски страници",
        "right-movefile": "Преместување на податотеки",
        "right-suppressredirect": "Не прави пренасочување од старото име при преместување на страница",
        "right-upload": "Подигни податотеки",
        "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": "заменување на оваа постоечка податотека",
        "recentchanges-legend-newpage": "(погл. и [[Special:NewPages|списокот на нови страници]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Подолу се промените направени од <strong>$2</strong> наваму (се прикажуваат до <b>$1</b>).",
-       "rclistfrom": "Прикажи нови промени почнувајќи од $1",
+       "rclistfrom": "Прикажи нови промени почнувајќи од $3 $2",
        "rcshowhideminor": "$1 ситни промени",
        "rcshowhideminor-show": "Прикажи",
        "rcshowhideminor-hide": "Скриј",
        "uploadstash-refresh": "Превчитај го списокот на податотеки",
        "invalid-chunk-offset": "Неважечка појдовна точка",
        "img-auth-accessdenied": "Оневозможен пристап",
-       "img-auth-nopathinfo": "Недостасува PATH_INFO.\nВашиот опслужувач не е нагоден за да ја предаде оваа информација.\nМожеби се заснова на CGI, и така не подржува img_auth.\nПогл. https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "Недостасува PATH_INFO.\nВашиот опслужувач не е нагоден за да ја предаде оваа информација.\nМожеби се заснова на CGI, и така не подржува img_auth.\nПогл. https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Бараниот пат не води кон зададената папка за подигање.",
        "img-auth-badtitle": "Не може да се конструира важечки наслов од „$1“.",
        "img-auth-nologinnWL": "Не сте најавени и „$1“ не е на списокот на допуштени.",
        "pageswithprop-prophidden-binary": "бинарната вредност на својството за долгиот текст е скриена  ($1)",
        "doubleredirects": "Двојни пренасочувања",
        "doubleredirectstext": "Оваа страница ги прикажува пренасочувачките страници до други пренасочувачки страници.\nСекој ред содржи врски кон првото и второто пренасочување, како и целта на второто пренасочување, кое обично ја посочува <i>вистинската</i> целна страница кон која првото пренасочување би требало да насочува.\n<del>Пречкртаните</del> ставки треба да се разрешат.",
-       "double-redirect-fixed-move": "Страницата [[$1]] е преместена.\nСега пренасочува кон [[$2]]",
-       "double-redirect-fixed-maintenance": "Ð\98Ñ\81пÑ\80авка Ð½Ð° Ð´Ð²Ð¾Ñ\98но Ð¿Ñ\80енаÑ\81оÑ\87Ñ\83ваÑ\9aе Ð¾Ð´ [[$1]] Ð½Ð° [[$2]].",
+       "double-redirect-fixed-move": "Страницата „[[$1]]“ е преместена.\nСега е самоподновена и пренасочува кон [[$2]].",
+       "double-redirect-fixed-maintenance": "СамоиÑ\81пÑ\80авка Ð½Ð° Ð´Ð²Ð¾Ñ\98но Ð¿Ñ\80енаÑ\81оÑ\87Ñ\83ваÑ\9aе Ð¾Ð´ [[$1]] Ð½Ð° [[$2]] Ð²Ð¾ Ð·Ð°Ð´Ð°Ñ\87а Ð·Ð° Ð¾Ð´Ñ\80жÑ\83ваÑ\9aе.",
        "double-redirect-fixer": "Исправувач на пренасочувања",
        "brokenredirects": "Прекинати пренасочувања",
        "brokenredirectstext": "Следните пренасочувања водат до непостоечки страници.",
        "log-title-wildcard": "Пребарај наслови кои почнуваат со овој текст",
        "showhideselectedlogentries": "Прикажи/скриј одбрани записи",
        "allpages": "Сите страници",
-       "alphaindexline": "од $1 до $2",
        "nextpage": "Следна страница ($1)",
        "prevpage": "Претходна страница ($1)",
        "allpagesfrom": "Прикажи страници кои започнуваат со:",
        "categoriesfrom": "Приказ на категории почнувајќи од:",
        "special-categories-sort-count": "подреди по број",
        "special-categories-sort-abc": "подреди азбучно",
-       "deletedcontributions": "Ð\98збÑ\80иÑ\88ани Ð¿Ñ\80идонеÑ\81и Ð½Ð° ÐºÐ¾Ñ\80иÑ\81никоÑ\82",
-       "deletedcontributions-title": "Ð\98збÑ\80иÑ\88ани Ð¿Ñ\80идонеÑ\81и Ð½Ð° ÐºÐ¾Ñ\80иÑ\81никоÑ\82",
+       "deletedcontributions": "Ð\98збÑ\80иÑ\88ани ÐºÐ¾Ñ\80иÑ\81ниÑ\87ки Ð¿Ñ\80идонеÑ\81и",
+       "deletedcontributions-title": "Ð\98збÑ\80иÑ\88ани ÐºÐ¾Ñ\80иÑ\81ниÑ\87ки Ð¿Ñ\80идонеÑ\81и",
        "sp-deletedcontributions-contribs": "придонеси",
        "linksearch": "Пребарување на надворешни врски",
        "linksearch-pat": "Услов за пребарување:",
        "emailccme": "Испрати ми копија на пораката по е-пошта.",
        "emailccsubject": "Копија од вашата порака до $1: $2",
        "emailsent": "Писмото е испратено",
-       "emailsenttext": "Ð\92аÑ\88аÑ\82а Ðµ-поÑ\88Ñ\82а Ðµ Ð¿Ñ\80аÑ\82ена.",
+       "emailsenttext": "Ð\9fиÑ\81моÑ\82о Ðµ Ð¸Ñ\81пÑ\80аÑ\82ено.",
        "emailuserfooter": "Оваа е-порака беше пратена од $1 до $2 со помош на функцијата Е-пошта на {{SITENAME}}.",
        "usermessage-summary": "Оставете системска порака.",
        "usermessage-editor": "Системски гласник",
        "watchnologin": "Не сте најавени",
        "addwatch": "Додај во списокот на набљудувања",
        "addedwatchtext": "Страницата „[[:$1]]“ е додадена во [[Special:Watchlist|списокот на набљудувања]].\nИдните промени на оваа страница и нејзината страница за разговор ќе се прикажуваат таму.",
+       "addedwatchtext-short": "Страницата „$1“ е додадена во вашите набљудувања.",
        "removewatch": "Отстрани од списокот на набљудувања",
        "removedwatchtext": "Страницата „[[:$1]]“ е отстранета од [[Special:Watchlist|списокот на набљудувања]].",
+       "removedwatchtext-short": "Страницата „$1“ е отстранета од вашите набљудувања.",
        "watch": "Набљудувај",
        "watchthispage": "Набљудувај ја страницава",
        "unwatch": "Престани со набљудување",
        "watchlist-details": "{{PLURAL:$1|$1 страница|$1 страници}} во вашиот список на набљудувања, не броејќи ги посебно страниците за разговор.",
        "wlheader-enotif": "Известувањето по е-пошта е вклучено.",
        "wlheader-showupdated": "Страниците што се изменети од вашата последна посета се прикажани со '''задебелени''' букви",
-       "watchmethod-recent": "Проверка на скорешните уредувања на набљудуваните страници",
-       "watchmethod-list": "Проверерка на набљудуваните страници во скорешните уредувања",
-       "watchlistcontains": "Вашиот список на набљудувања содржи $1 {{PLURAL:$1|страница|страници}}.",
-       "iteminvalidname": "Проблем со елементот '$1', неважечко име...",
        "wlnote2": "Подолу се прикажани промените направени во {{PLURAL:$1|последниов час|последните <strong>$1</strong> часа}}, согласно $2, $3.",
        "wlshowlast": "Прикажи ги последните $1 часа, $2 дена, $3",
        "watchlist-options": "Поставки за список на набљудувања",
        "enotif_lastvisited": "Видете $1 за сите промени од вашата последна посета.",
        "enotif_lastdiff": "Видете $1 за да ја видите оваа промена.",
        "enotif_anon_editor": "анонимен корисник $1",
-       "enotif_body": "Почитуван(а) $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\n$NEWPAGE\n\nОпис од уредникот: $PAGESUMMARY $PAGEMINOREDIT\n\nКонакт на уредникот:\nе-пошта: $PAGEEDITOR_EMAIL\nвики: $PAGEEDITOR_WIKI\n\nПовеќе нема да добивате известувања во случај на други понатамошни активности, освен ако не ја посетите оваа страница додека сте најавени.\nМожете и да ги поништите ознаките за известување за сите набљудувани страници на вашиот список на набљудувања.\n\nИзвестителниот систем на {{SITENAME}}\n\n--\nАко сакате да ги измените нагодувањата за известување по е-пошта, посетете ја страницата\n{{canonicalurl:{{#special:Preferences}}}}\n\nДоколку сакате да ги измените нагодувањата на списокот на набљудувања, посетете ја страницата\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nЗа да ја избришете страницата од списокот на набљудувања, посетете ја страницата\n$UNWATCHURL\n\nВаши мислења, прашања и повеќе помош:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Почитуван(а) $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\n$NEWPAGE\n\nОпис од уредникот: $PAGESUMMARY $PAGEMINOREDIT\n\nКонакт на уредникот:\nе-пошта: $PAGEEDITOR_EMAIL\nвики: $PAGEEDITOR_WIKI\n\nПовеќе нема да добивате известувања во случај на други понатамошни активности, освен ако не ја посетите оваа страница додека сте најавени.\nМожете и да ги поништите ознаките за известување за сите набљудувани страници на вашиот список на набљудувања.\n\nИзвестителниот систем на {{SITENAME}}\n\n--\nАко сакате да ги измените нагодувањата за известување по е-пошта, посетете ја страницата\n{{canonicalurl:{{#special:Preferences}}}}\n\nДоколку сакате да ги измените нагодувањата на списокот на набљудувања, посетете ја страницата\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nЗа да ја избришете страницата од списокот на набљудувања, посетете ја страницата\n$UNWATCHURL\n\nВаши мислења, прашања и повеќе помош:\n$HELPPAGE",
        "created": "создадена",
        "changed": "изменета",
        "deletepage": "Избриши страница",
        "excontent": "содржината беше: '$1'",
        "excontentauthor": "содржината беше: '$1' (и единствениот автор беше '$2')",
        "exbeforeblank": "содржината пред бришењето беше: '$1'",
-       "delete-confirm": "Ð\98збÑ\80иÑ\88и „$1“",
+       "delete-confirm": "Ð\91Ñ\80иÑ\88еÑ\9aе Ð½Ð° „$1“",
        "delete-legend": "Бришење",
        "historywarning": "'''Предупредување:''' Страницата што сакате да ја избришете има историја со околу $1 {{PLURAL:$1|преработка|преработки}}:",
        "confirmdeletetext": "На пат сте трајно да избришете страница заедно со нејзината историја.\nПотврдете дека имате намера да го направите ова, дека ги разбирате последиците од тоа и дека го правите во согласност со [[{{MediaWiki:Policy-url}}|правилата]].",
        "revertpage": "Отстрането уредувањето на [[Special:Contributions/$2|$2]] ([[User talk:$2|разговор]]), вратено на последната верзија на [[User:$1|$1]]",
        "revertpage-nouser": "Вратени уредувања од скриен корисник на последната преработка на {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Откажани уредувањата на $1; вратено на последната верзија на $2.",
-       "sessionfailure-title": "Сесијата не успеа",
-       "sessionfailure": "Има проблем со вашата сесија;\nоваа дејство е откажано како превентива против преземање сесии.\nПритиснете го копчето „назад“ и повторно вчитајте ја страницата од која дојдовте и обидете се повторно.",
+       "sessionfailure-title": "Седницата не успеа",
+       "sessionfailure": "Има проблем со вашата седница;\nоваа дејство е откажано како превентива против преземање седници.\nПритиснете го копчето „назад“ и повторно вчитајте ја страницата од која дојдовте и обидете се повторно.",
        "protectlogpage": "Дневник на заштитувања",
        "protectlogtext": "Подолу има список на измените во заштитата на страницата.\nМоментално заштитените страници ќе ги најдете [[Special:ProtectedPages|овој список]].",
        "protectedarticle": "заштитена „[[$1]]“",
        "sp-contributions-newbies-title": "Придонеси на нови корисници",
        "sp-contributions-blocklog": "Дневник на блокирања",
        "sp-contributions-suppresslog": "притаени придонеси на корисникот",
-       "sp-contributions-deleted": "избÑ\80иÑ\88ани Ð¿Ñ\80идонеÑ\81и Ð½Ð° ÐºÐ¾Ñ\80иÑ\81никоÑ\82",
+       "sp-contributions-deleted": "избÑ\80иÑ\88ани ÐºÐ¾Ñ\80иÑ\81ниÑ\87ки Ð¿Ñ\80идонеÑ\81и",
        "sp-contributions-uploads": "подигања",
        "sp-contributions-logs": "дневници",
        "sp-contributions-talk": "разговор",
        "blockip": "Блокирај корисник",
        "blockip-legend": "Блокирај корисник",
        "blockiptext": "Користете го долниот образец за да го забраните пристапот за пишување од одредена IP-адреса или корисничко име.\nОва единствено треба да се прави за да се спречи вандализам, во согласност со [[{{MediaWiki:Policy-url}}|правилата на Википедија]].\nИзберете конкретна причина подолу (на пр. наведувајќи ги страниците што биле вандализирани).",
-       "ipadressorusername": "IP-адреса или корисничко име:",
+       "ipaddressorusername": "IP-адреса или корисничко име:",
        "ipbexpiry": "Истек на рокот:",
        "ipbreason": "Причина:",
        "ipbreason-dropdown": "*Вообичаени причини за блокирање\n** Вметнување лажни информации\n** Бришење на содржини од страниците\n** Спам-врски кон надворешни мрежни места\n** Вметнување глупости во страниците\n** Непристојно однесување\n** Навредување на други корисници\n** Неприфатливо корисничко име",
        "movepagetalktext": "Соодветната страница за разговор, доколку постои, ќе биде автоматски преместена заедно со неа, освен ако:\n*Веќе постои страница за разговор за новиот наслов, или\n*Долното поле е неозначено.\n\nВо овие случаи, ќе треба рачно да се премести или спои ако има потреба.",
        "movearticle": "Премести страница:",
        "moveuserpage-warning": "'''Предупредување:''' На пат сте да преместите корисничка страница. Имајте предвид дека само страницата ќе биде преместена, а самиот корисник ''нема'' да биде преименуван.",
+       "movecategorypage-warning": "<strong>Предупредување:</strong> Преместувате категориска страница. Имајте предвид дека ќе се премести само страницата, а страниците во старата категорија <em>нема</em> да се прекатегоризираат во новата.",
        "movenologintext": "Мора да бидете регистриран корисник и да сте [[Special:UserLogin|најавени]] за да можете да преместувате страници.",
        "movenotallowed": "Немате доволно привилегии за преместување на страници.",
        "movenotallowedfile": "Немате дозвола за преместување податотеки.",
        "cant-move-user-page": "Немате дозвола за преместување на основни кориснички страници (освен потстраници).",
        "cant-move-to-user-page": "Немате дозвола за преместување на страница во ваша корисничка страница (освен во корисничка потстраница)",
+       "cant-move-category-page": "Немате дозвола да преместувате категориски страници.",
+       "cant-move-to-category-page": "Немате дозвола да преместувате страници во категориски страници.",
        "newtitle": "Кон новиот наслов:",
        "move-watch": "Набљудувај ја страницава",
        "movepagebtn": "Премести страница",
        "import-nonewrevisions": "Не увезов ниедна преработка (сите се веќе присутни или изоставени поради грешки)",
        "xml-error-string": "$1 во ред $2, колона $3 (бајт $4): $5",
        "import-upload": "Подигни XML податоци",
-       "import-token-mismatch": "Ð\93Ñ\83беÑ\9aе Ð½Ð° Ñ\81еÑ\81иÑ\81киÑ\82е Ð¿Ð¾Ð´Ð°Ñ\82оÑ\86и. Обидете се повторно.",
+       "import-token-mismatch": "Ð\97агÑ\83бени Ð½Ð° Ð¿Ð¾Ð´Ð°Ñ\82оÑ\86иÑ\82е Ð¾Ð´ Ñ\81едниÑ\86аÑ\82а. Обидете се повторно.",
        "import-invalid-interwiki": "Не можам да увезам од наведеното вики.",
        "import-error-edit": "Страницата „$1“ не е увезена бидејќи не ви е дозволено да ја уредувате.",
        "import-error-create": "Страницата „$1“ не е увезена бидејќи не ви е дозволено да ја создадете.",
        "group-bot.js": "/* Тука поставениот JavaScript  ќе им се вчитува само на ботовите */",
        "group-sysop.js": "/* Тука поставениот JavaScript  ќе им се вчитува само на системските оператори */",
        "group-bureaucrat.js": "/* Тука поставениот JavaScript  ќе им се вчитува само на бирократите */",
-       "notacceptable": "Опслужувачот не може да создаде податоци во формат погоден за вашиот клиент.",
        "anonymous": "{{PLURAL:$1|Анонимен корисник|Анонимни корисници}} на {{SITENAME}}",
        "siteuser": "{{SITENAME}} корисник $1",
        "anonuser": "{{SITENAME}} анонимен корисник $1",
        "newimages-summary": "Оваа специјална страница ги покажува скоро подигнатите податотеки.",
        "newimages-legend": "Филтрирај",
        "newimages-label": "Име на податотека (или дел од името):",
-       "showhidebots": "($1 ботови)",
+       "newimages-showbots": "Прикажувај подигања од ботови",
        "noimages": "Нема ништо.",
        "ilsubmit": "Барај",
        "bydate": "по датум",
        "exif-subsectime": "Дел од секундата во кој е сликано",
        "exif-subsectimeoriginal": "Дел од секундата во кој е фотографирано",
        "exif-subsectimedigitized": "Дел од секундата во кој е дигитализирано",
-       "exif-exposuretime": "Ð\95кÑ\81позиÑ\86иÑ\98а",
+       "exif-exposuretime": "Ð\92Ñ\80еме Ð½Ð° Ð¸Ð·Ð»Ð¾Ð¶ÐµÐ½Ð¾Ñ\81Ñ\82",
        "exif-exposuretime-format": "$1 сек ($2)",
        "exif-fnumber": "F-бр.",
        "exif-fnumber-format": "f/$1",
-       "exif-exposureprogram": "Режим Ð½Ð° ÐµÐºÑ\81позиÑ\86иÑ\98а",
+       "exif-exposureprogram": "Ð\9fÑ\80огÑ\80ам Ð½Ð° Ð¸Ð·Ð»Ð¾Ð¶Ñ\83ваÑ\9aе",
        "exif-spectralsensitivity": "Спектрална осетливост",
-       "exif-isospeedratings": "ISO светлоосетливост",
+       "exif-isospeedratings": "Светлоосетливост по ISO",
        "exif-shutterspeedvalue": "APEX-брзина на затворачот",
        "exif-aperturevalue": "APEX-oтвор",
        "exif-brightnessvalue": "APEX-светлост",
-       "exif-exposurebiasvalue": "Ð\9dадомеÑ\81Ñ\82ок Ð½Ð° ÐµÐºÑ\81позиÑ\86иÑ\98аÑ\82а",
+       "exif-exposurebiasvalue": "Ð\9dадомеÑ\81Ñ\82ок Ð½Ð° Ð¸Ð·Ð»Ð¾Ð¶Ñ\83ваÑ\9aеÑ\82о",
        "exif-maxaperturevalue": "Макс. отвореност на блендата",
        "exif-subjectdistance": "Оддалеченост до објектот",
        "exif-meteringmode": "Режим на мерачот",
        "exif-lightsource": "Светлосен извор",
        "exif-flash": "Блиц",
-       "exif-focallength": "ФокÑ\83Ñ\81но растојание на леќата",
+       "exif-focallength": "Ð\96аÑ\80иÑ\88но растојание на леќата",
        "exif-focallength-format": "$1 мм",
        "exif-subjectarea": "Положба и површина на објектот",
        "exif-flashenergy": "Енергија на блицот",
        "exif-focalplaneyresolution": "Разложеност на жаришната рамнина Y",
        "exif-focalplaneresolutionunit": "Единица за разложеност на жаришната рамнина",
        "exif-subjectlocation": "Положба на субјектот",
-       "exif-exposureindex": "Ð\98ндекÑ\81 Ð½Ð° ÐµÐºÑ\81позиÑ\86иÑ\98аÑ\82а",
+       "exif-exposureindex": "Ð\9fоказаÑ\82ел Ð½Ð° Ð¸Ð·Ð»Ð¾Ð¶Ñ\83ваÑ\9aеÑ\82о",
        "exif-sensingmethod": "Метод на сензорот",
        "exif-filesource": "Извор на податотеката",
        "exif-scenetype": "Тип на сцена",
        "exif-customrendered": "Дополнитела обработка на сликата",
-       "exif-exposuremode": "Режим Ð½Ð° ÐµÐºÑ\81позиÑ\86иÑ\98а",
+       "exif-exposuremode": "Режим Ð½Ð° Ð¸Ð·Ð»Ð¾Ð¶Ñ\83ваÑ\9aе",
        "exif-whitebalance": "Рамнотежа на бело",
        "exif-digitalzoomratio": "Сооднос на дигиталното приближување (зум)",
-       "exif-focallengthin35mmfilm": "Ð\95квиваленÑ\82но Ñ\84окÑ\83Ñ\81но Ñ\80аÑ\81Ñ\82оÑ\98ание Ð·Ð° 35 мм филм",
+       "exif-focallengthin35mmfilm": "Ð\96аÑ\80иÑ\88но Ñ\80аÑ\81Ñ\82оÑ\98ание ÐºÐ°Ñ\98 35 мм филм",
        "exif-scenecapturetype": "Тип на сликаната сцена",
        "exif-gaincontrol": "Контрола на сцената",
        "exif-contrast": "Контраст",
        "exif-scenetype-1": "Директно фотографирана слика",
        "exif-customrendered-0": "Нормален процес",
        "exif-customrendered-1": "Нестандарден процес",
-       "exif-exposuremode-0": "Ð\90вÑ\82омаÑ\82Ñ\81ка ÐµÐºÑ\81позиÑ\86иÑ\98а",
-       "exif-exposuremode-1": "РаÑ\87на ÐµÐºÑ\81позиÑ\86иÑ\98а",
+       "exif-exposuremode-0": "Ð\90вÑ\82омаÑ\82Ñ\81ко Ð¸Ð·Ð»Ð¾Ð¶Ñ\83ваÑ\9aе",
+       "exif-exposuremode-1": "РаÑ\87но Ð¸Ð·Ð»Ð¾Ð¶Ñ\83ваÑ\9aе",
        "exif-exposuremode-2": "Автоматски со зададен распон",
        "exif-whitebalance-0": "Автоматска рамнотежа на бело",
        "exif-whitebalance-1": "Рачна рамнотежа на бело",
        "bitrate-exabits": "$1 Еб/с",
        "bitrate-zetabits": "$1 Зб/с",
        "bitrate-yottabits": "$1 Јб/с",
-       "livepreview-loading": "Вчитувам...",
-       "livepreview-ready": "Се вчитува… готово!",
-       "livepreview-failed": "Неуспешно прегледување!\nПробајте со нормален преглед.",
-       "livepreview-error": "Неуспешно поврзување: $1 „$2“\nОбидете се со нормален преглед.",
        "lag-warn-normal": "Промените во {{PLURAL:$1|последната секунда|последните $1 секунди}} може да не бидат прикажани во списокот.",
        "lag-warn-high": "Поради преоптовареност на податочниот опслужувач, промените понови од {{PLURAL:$1|една секунда|$1 секунди}}\nможе да не бидат прикажани во списокот.",
-       "watchlistedit-numitems": "Вашиот список на набљудувања содржи {{PLURAL:$1|еден наслов|$1 наслови}}, без страниците за разговор.",
-       "watchlistedit-noitems": "Вашиот список на набљудувања не содржи ниту еден наслов.",
        "watchlistedit-normal-title": "Уредување на списокот на набљудувања",
        "watchlistedit-normal-legend": "Бришење на наслови од список на набљудување",
        "watchlistedit-normal-explain": "Насловите во вашиот список на набљудувања се прикажани подолу.\nЗа да избришете наслов, штиклирајте го квадратчето лево од насловот, и стиснете на „{{int:Watchlistedit-normal-submit}}“.\nМожете и да го [[Special:EditWatchlist/raw|уредувате сировиот список]].",
        "watchlistedit-raw-submit": "Поднови го списокот",
        "watchlistedit-raw-done": "Вашиот список на набљудувања е подновен.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 наслов беше|$1 наслови беа}} додадени:",
-       "watchlistedit-raw-removed": "{{PLURAL:$1|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 наслови}}:",
+       "watchlistedit-too-many": "Има премногу страници за да можат тука да се прикажат.",
+       "watchlisttools-clear": "Исчисти ги набљудуваните",
        "watchlisttools-view": "Преглед на релевантни промени",
        "watchlisttools-edit": "Погледај и уреди список на набљудувања",
        "watchlisttools-raw": "Напредно уредување на списокот на набљудувања",
        "compare-invalid-title": "Наведениот наслов е неважечки.",
        "compare-title-not-exists": "Наведениот наслов не постои.",
        "compare-revision-not-exists": "Наведената преработка не постои.",
-       "dberr-header": "Ова вики не функционира како што треба",
        "dberr-problems": "Жалиме! Ова мрежно место се соочува со технички потешкотии.",
        "dberr-again": "Почекајте неколку минути и обидете се повторно.",
        "dberr-info": "(Не може да се добие опслужувачот на базата на податоци: $1)",
        "htmlform-no": "Не",
        "htmlform-yes": "Да",
        "htmlform-chosen-placeholder": "Одберете можност",
+       "htmlform-cloner-create": "Додај уште",
+       "htmlform-cloner-delete": "Отстрани",
+       "htmlform-cloner-required": "Се бара барем една вредност.",
        "sqlite-has-fts": "$1 со поддршка за пребарување по цели текстови",
        "sqlite-no-fts": "$1 без поддршка за пребарување по цели текстови",
        "logentry-delete-delete": "$1 {{GENDER:$2|ја избриша}} страницата $3",
index 308ae7c..9c59c20 100644 (file)
@@ -26,7 +26,8 @@
                        "Shijualex",
                        "Vssun",
                        "Ævar Arnfjörð Bjarmason <avarab@gmail.com>",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "കണ്ണികൾക്ക് അടിവരയിടുക:",
        "jumptonavigation": "വഴികാട്ടി",
        "jumptosearch": "തിരയൂ",
        "view-pool-error": "ക്ഷമിക്കണം, ഈ നിമിഷം സെർവറുകൾ അമിതഭാരം കൈകാര്യം ചെയ്യുകയാണ്.\nധാരാളം ഉപയോക്താക്കൾ ഈ താൾ കാണുവാൻ ശ്രമിച്ചുകൊണ്ടിരിക്കുകയാണ്.\nഇനിയും താൾ ലഭ്യമാക്കുവാൻ താങ്കൾ ശ്രമിക്കുന്നതിന് മുൻപ് ദയവായി അല്പസമയം കാത്തിരിക്കുക.\n\n$1",
+       "generic-pool-error": "ക്ഷമിക്കണം, ഈ നിമിഷം സെർവറുകൾ അമിതഭാരം കൈകാര്യം ചെയ്യുകയാണ്.\nധാരാളം ഉപയോക്താക്കൾ ഈ സ്രോതസ്സുകൾ കാണുവാൻ ശ്രമിച്ചുകൊണ്ടിരിക്കുകയാണ്.\nഇനിയും ഇത് ലഭ്യമാക്കുവാൻ താങ്കൾ ശ്രമിക്കുന്നതിന് മുൻപ് ദയവായി അല്പസമയം കാത്തിരിക്കുക.",
        "pool-timeout": "പൂട്ട് മാറാനുള്ള കാത്തിരിപ്പ് സമയം",
        "pool-queuefull": "പൂൾ ക്യൂ നിറഞ്ഞിരിക്കുന്നു",
        "pool-errorunknown": "അപരിചിതമായ പിഴവ്",
        "readonly_lag": " കീഴ്-വിവരശേഖര സെർവറുകൾ മാസ്റ്റർ വരെ എത്തിയതിനാൽ വിവരശേഖരം സ്വയം ബന്ധിക്കപ്പെട്ടിരിക്കുന്നു",
        "internalerror": "ആന്തരിക പിഴവ്",
        "internalerror_info": "ആന്തരിക പിഴവ്: $1",
-       "fileappenderrorread": "കൂട്ടിച്ചേർക്കുന്ന സമയം \"$1\" വായിച്ചെടുക്കാൻ കഴിഞ്ഞില്ല.",
-       "fileappenderror": "\"$1\" എന്നത് \"$2\" എന്നതിലേയ്ക്ക് കൂട്ടിച്ചേർക്കുവാൻ സാധിച്ചില്ല.",
        "filecopyerror": "\"$1\" എന്ന പ്രമാണം \"$2\" എന്നതിലേയ്ക്ക് പകർത്താൻ സാധിച്ചില്ല.",
        "filerenameerror": "പ്രമാണം \"$1\", \"$2\" എന്ന തലക്കെട്ടിലേയ്ക്ക് മാറ്റാൻ സാധിച്ചില്ല.",
        "filedeleteerror": "\"$1\" നീക്കം ചെയ്യാൻ സാധിച്ചില്ല.",
        "directorycreateerror": "\"$1\" എന്ന ഡയറക്റ്ററി സൃഷ്ടിക്കാൻ സാധിച്ചില്ല.",
        "filenotfound": "\"$1\" എന്ന പ്രമാണം കണ്ടെത്താനായില്ല.",
-       "fileexistserror": "\"$1\" എന്ന പ്രമാണത്തിലേയ്ക്ക് എഴുതാൻ പറ്റിയില്ല: പ്രമാണം നിലവിലുണ്ട്",
        "unexpected": "പ്രതീക്ഷിക്കാത്ത മൂല്യം: \"$1\"=\"$2\".",
        "formerror": "പിഴവ്: ഫോം സമർപ്പിക്കുവാൻ പറ്റിയില്ല",
        "badarticleerror": "താങ്കൾ ചെയ്യാനുദ്ദേശിക്കുന്നത് ഈ താളിൽ സാദ്ധ്യമല്ല",
        "userlogin-helplink2": "പ്രവേശിക്കാൻ സഹായമാവശ്യമെങ്കിൽ",
        "userlogin-loggedin": "താങ്കൾ ഇപ്പോൾ തന്നെ {{GENDER:$1|$1}} ആയി പ്രവേശിച്ചിരിക്കുന്നു.\nതാഴെ ഉള്ള ഫോം ഉപയോഗിച്ച് മറ്റൊരു ഉപയോക്താവായി പ്രവേശിക്കാവുന്നതാണ്.",
        "userlogin-createanother": "മറ്റൊരു അംഗത്വമെടുക്കുക",
-       "createacct-join": "താങ്കളെപ്പറ്റിയുള്ള വിവരങ്ങൾ താഴെ നൽകുക.",
-       "createacct-another-join": "പുതിയ അംഗത്വത്തിന്റെ വിവരങ്ങൾ താഴെ നൽകുക.",
        "createacct-emailrequired": "ഇമെയിൽ വിലാസം",
        "createacct-emailoptional": "ഇമെയിൽ വിലാസം (നിർബന്ധമില്ല)",
        "createacct-email-ph": "താങ്കളുടെ ഇമെയിൽ വിലാസം നൽകുക",
        "savearticle": "താൾ സേവ് ചെയ്യുക",
        "preview": "എങ്ങനെയുണ്ടെന്നു കാണുക",
        "showpreview": "എങ്ങനെയുണ്ടെന്നു കാണുക",
-       "showlivepreview": "തത്സമയ പ്രിവ്യൂ",
        "showdiff": "മാറ്റങ്ങൾ കാണിക്കുക",
        "anoneditwarning": "'''മുന്നറിയിപ്പ്:''' താങ്കൾ ലോഗിൻ ചെയ്തിട്ടില്ല. താങ്കളുടെ ഐ.പി. വിലാസം താളിന്റെ തിരുത്തൽ ചരിത്രത്തിൽ ചേർക്കുന്നതാണ്.",
        "anonpreviewwarning": "''താങ്കൾ ലോഗിൻ ചെയ്തിട്ടില്ല. സേവ് ചെയ്യുമ്പോൾ താളിന്റെ തിരുത്തൽ ചരിത്രത്തിൽ താങ്കളുടെ ഐ.പി. വിലാസം ചേർത്തു സൂക്ഷിക്കപ്പെടും.''",
        "edit-gone-missing": "ഈ താൾ പുതുക്കുവാൻ സാധിക്കുകയില്ല.\nഇത് മായ്ക്കപ്പെട്ടതായി കാണുന്നു.",
        "edit-conflict": "തിരുത്തൽ സമരസപ്പെടായ്ക.",
        "edit-no-change": "ഇപ്പോഴുള്ള സ്ഥിതിയിൽ നിന്നു യാതൊരു മാറ്റവും ഇല്ലാത്തതിനാൽ താങ്കളുടെ തിരുത്തലുകൾ തിരസ്കരിക്കപ്പെട്ടിരിക്കുന്നു.",
-       "postedit-confirmation": "താങ്കളുടെ തിരുത്ത് സേവ് ചെയ്തിരിക്കുന്നു.",
+       "postedit-confirmation-created": "താൾ സൃഷ്ടിച്ചിരിക്കുന്നു.",
+       "postedit-confirmation-restored": "താൾ പുൻഃസ്ഥാപിച്ചിരിക്കുന്നു.",
+       "postedit-confirmation-saved": "താങ്കളുടെ തിരുത്ത് സേവ് ചെയ്തിരിക്കുന്നു.",
        "edit-already-exists": "പുതിയ താൾ സൃഷ്ടിക്കാൻ കഴിഞ്ഞില്ല.\nതാൾ ഇപ്പോൾ തന്നെ നിലവിലുണ്ട്.",
        "defaultmessagetext": "സ്വതേയുള്ള സന്ദേശ എഴുത്ത്",
        "content-failed-to-parse": "$2 ഉള്ളടക്കം $1 മാതൃകയിൽ പാഴ്സ് ചെയ്യൽ പരാജയപ്പെട്ടു: $3",
        "parser-template-recursion-depth-warning": "ഫലകത്തിന്റെ പുനരാവർത്തന ആഴത്തിന്റെ പരിധി കഴിഞ്ഞിരിക്കുന്നു ($1)",
        "language-converter-depth-warning": "ഭാഷ മാറ്റൽ ഉപകരണത്തിന്റെ ആഴത്തിന്റെ പരിധി കവിഞ്ഞിരിക്കുന്നു ($1)",
        "node-count-exceeded-category": "നോഡ്-എണ്ണം അധികരിച്ച താളുകൾ",
+       "node-count-exceeded-category-desc": "നോഡ്-എണ്ണം അധികരിച്ച താളുകൾക്കുള്ള വർഗ്ഗം.",
        "node-count-exceeded-warning": "താൾ നോഡ്-എണ്ണം അധികരിച്ചിരിക്കുന്നു",
        "expansion-depth-exceeded-category": "വികസന ആഴം അധികരിച്ച താളുകൾ",
+       "expansion-depth-exceeded-category-desc": "വികസന ആഴം അധികരിച്ച താളുകൾക്കുള്ള വർഗ്ഗം.",
        "expansion-depth-exceeded-warning": "താളിന്റെ വികസന ആഴം അധികരിച്ചിരിക്കുന്നു",
        "parser-unstrip-loop-warning": "അൺസ്ട്രിപ്പ് (Unstrip) പാഴ്സർ ഫങ്ഷനിൽ കുരുക്ക് കണ്ടെത്തി",
        "parser-unstrip-recursion-limit": "അൺസ്ട്രിപ്പ് (Unstrip) പാഴ്സർ ഫങ്ഷന്റെ പുനരാവർത്തന പരിധി അധികരിച്ചിരിക്കുന്നു ($1)",
        "searchmenu-exists": "'''\"[[:$1]]\" എന്ന തലക്കെട്ടിൽ ഒരു താൾ ഈ വിക്കിയിൽ നിലവിലുണ്ട്'''",
        "searchmenu-new": "<strong>ഈ വിക്കിയിൽ \"[[:$1]]\" എന്ന താൾ സൃഷ്ടിക്കുക!</strong> {{PLURAL:$2|0=|ഒപ്പം താങ്കളുടെ തിരയലിനു ലഭിച്ച ഫലമായ ഈ താൾ കാണുക.|ഒപ്പം താങ്കളുടെ തിരയലിനു ലഭിച്ച ഫലങ്ങൾ കാണുക.}}",
        "searchprofile-articles": "ലേഖനങ്ങളിൽ",
-       "searchprofile-project": "സഹായം, പദ്ധതി താളുകളിൽ",
        "searchprofile-images": "പ്രമാണങ്ങളിൽ",
        "searchprofile-everything": "എല്ലാം",
        "searchprofile-advanced": "വിപുലമായ വിധം",
        "searchprofile-articles-tooltip": "$1 മേഖലയിൽ തിരയുക",
-       "searchprofile-project-tooltip": "$1 മേഖലകളിൽ തിരയുക",
        "searchprofile-images-tooltip": "പ്രമാണങ്ങൾക്ക് വേണ്ടി തിരയുക",
        "searchprofile-everything-tooltip": "എല്ലാ ഉള്ളടക്കവും തിരയുക (സംവാദത്താളുകൾ ഉൾപ്പെടെ)",
        "searchprofile-advanced-tooltip": "തിരഞ്ഞെടുത്ത നാമമേഖലകളിൽ തിരച്ചിൽ നടത്തുവാൻ",
        "search-nonefound": "താങ്കൾ തിരഞ്ഞ പദത്തിനു യോജിച്ച ഫലങ്ങളൊന്നും ലഭിച്ചില്ല.",
        "powersearch-legend": "വിപുലീകൃത തിരച്ചിൽ",
        "powersearch-ns": "തിരയേണ്ട നാമമേഖലകൾ",
-       "powersearch-redir": "തിരിച്ചുവിടലുകൾ കാണിക്കുക",
        "powersearch-togglelabel": "അടയാളപ്പെടുത്തുക:",
        "powersearch-toggleall": "എല്ലാം",
        "powersearch-togglenone": "ഒന്നുംവേണ്ട",
        "prefs-emailconfirm-label": "ഇമെയിൽ സ്ഥിരീകരണം:",
        "youremail": "ഇമെയിൽ:",
        "username": "{{GENDER:$1|ഉപയോക്തൃനാമം}}:",
-       "uid": "{{GENDER:$1|ഉപയോക്തൃ}} ഐ.ഡി.:",
        "prefs-memberingroups": "{{GENDER:$2|അംഗത്വമുള്ള}} {{PLURAL:$1|സംഘം|സംഘങ്ങൾ}}:",
        "prefs-registration": "അംഗത്വം എടുത്തത്:",
        "yourrealname": "യഥാർത്ഥ പേര്‌:",
        "prefs-advancedsearchoptions": "വിപുലമായ ഉപാധികൾ",
        "prefs-advancedwatchlist": "വിപുലമായ ഉപാധികൾ",
        "prefs-displayrc": "പ്രദർശന ഐച്ഛികങ്ങൾ",
-       "prefs-displaysearchoptions": "പ്രദർശന ഐച്ഛികങ്ങൾ",
        "prefs-displaywatchlist": "പ്രദർശന ഐച്ഛികങ്ങൾ",
        "prefs-tokenwatchlist": "ചീട്ട്",
        "prefs-diffs": "വ്യത്യാസങ്ങൾ",
        "right-move": "താളുകൾ നീക്കുക",
        "right-move-subpages": "താളുകൾ അവയുടെ ഉപതാളുകളോടുകൂടീ നീക്കുക",
        "right-move-rootuserpages": "അടിസ്ഥാന ഉപയോക്തൃതാൾ മാറ്റുക",
+       "right-move-categorypages": "വർഗ്ഗ താളുകൾ മാറ്റുക",
        "right-movefile": "പ്രമാണങ്ങൾ നീക്കുക",
        "right-suppressredirect": "താളുകൾ മാറ്റുമ്പോൾ സ്രോതസ്സ് താളിൽ തിരിച്ചുവിടലുകൾ സൃഷ്ടിക്കാതിരിക്കുക",
        "right-upload": "പ്രമാണങ്ങൾ അപ്‌ലോഡ് ചെയ്യുക",
        "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": "നിലവിലുള്ള പ്രമാണത്തിന്റെ ഉപരിയായി സ്ഥാപിക്കുക",
        "recentchanges-legend-heading": "'''സൂചന:'''",
        "recentchanges-legend-newpage": "([[Special:NewPages|പുതിയ താളുകളുടെ പട്ടികയും]] കാണുക)",
        "rcnotefrom": "<strong>$2</strong> മുതലുള്ള മാറ്റങ്ങൾ (<strong>$1</strong> എണ്ണം വരെ കാണാം).",
-       "rclistfrom": "$1 മുതലുള്ള മാറ്റങ്ങൾ പ്രദർശിപ്പിക്കുക",
+       "rclistfrom": "$3 $2 മുതലുള്ള മാറ്റങ്ങൾ പ്രദർശിപ്പിക്കുക",
        "rcshowhideminor": "ചെറുതിരുത്തലുകൾ $1",
        "rcshowhideminor-show": "പ്രദർശിപ്പിക്കുക",
        "rcshowhideminor-hide": "മറയ്ക്കുക",
        "uploadstash-errclear": "പ്രമാണങ്ങൾ ശൂന്യമാക്കൽ വിജയകരമായിരുന്നില്ല.",
        "uploadstash-refresh": "പ്രമാണങ്ങളുടെ പട്ടിക പുതുക്കുക",
        "img-auth-accessdenied": "പ്രവേശനമില്ല",
-       "img-auth-nopathinfo": "PATH_INFO ലഭ്യമല്ല.\nതാങ്കളുടെ സെർവർ ഈ വിവരം കൈമാറ്റം ചെയ്യാൻ തയ്യാറാക്കിയിട്ടില്ല.\nഅത് img_auth പിന്തുണയില്ലാത്ത സി.ജി.ഐ. അധിഷ്ഠിതമായ ഒന്നായിരിക്കാം.\nhttps://www.mediawiki.org/wiki/Manual:Image_Authorization കാണുക.",
+       "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\" ശുദ്ധിപട്ടികയിൽ ഇല്ല.",
        "pageswithprop-submit": "പോകൂ",
        "doubleredirects": "ഇരട്ട തിരിച്ചുവിടലുകൾ",
        "doubleredirectstext": "ഈ താളിൽ ഒരു തിരിച്ചുവിടലിൽ നിന്നും മറ്റു തിരിച്ചുവിടൽ താളുകളിലേയ്ക്ക് പോകുന്ന താളുകൾ കൊടുത്തിരിക്കുന്നു. ഓരോ വരിയിലും ഒന്നാമത്തേയും രണ്ടാമത്തേയും തിരിച്ചുവിടൽ താളിലേക്കുള്ള കണ്ണികളും, രണ്ടാമത്തെ തിരിച്ചുവിടൽ താളിൽ നിന്നു ശരിയായ ലക്ഷ്യതാളിലേക്കുള്ള കണ്ണികളും ഉൾക്കൊള്ളുന്നു.\n<del>വെട്ടിക്കൊടുത്തിരിക്കുന്നവ</del> ശരിയാക്കിയവയാണ്.",
-       "double-redirect-fixed-move": "[[$1]] മാറ്റിയിരിക്കുന്നു.\nഇത് ഇപ്പോൾ [[$2]] എന്നതിലേയ്ക്ക് തിരിച്ചുവിടപ്പെട്ടിരിക്കുന്നു.",
-       "double-redirect-fixed-maintenance": "[[$1]] എന്ന താളിൽ നിന്ന് [[$2]] എന്ന താളിലേയ്ക്കുള്ള ഇരട്ട തിരിച്ചുവിടൽ ശരിയാക്കുന്നു.",
+       "double-redirect-fixed-move": "[[$1]] മാറ്റിയിരിക്കുന്നു.\nഇത് ഇപ്പോൾ സ്വയം പുതുക്കപ്പെട്ട് [[$2]] എന്നതിലേയ്ക്ക് തിരിച്ചുവിടപ്പെട്ടിരിക്കുന്നു.",
+       "double-redirect-fixed-maintenance": "[[$1]] à´\8eà´¨àµ\8dà´¨ à´¤à´¾à´³à´¿àµ½ à´¨à´¿à´¨àµ\8dà´¨àµ\8d [[$2]] à´\8eà´¨àµ\8dà´¨ à´¤à´¾à´³à´¿à´²àµ\87à´¯àµ\8dà´\95àµ\8dà´\95àµ\81à´³àµ\8dà´³ à´\87à´°à´\9fàµ\8dà´\9f à´¤à´¿à´°à´¿à´\9aàµ\8dà´\9aàµ\81വിà´\9fൽ à´ªà´°à´¿à´ªà´¾à´²à´¨à´\9càµ\8bലിà´\95ൾà´\95àµ\8dà´\95à´¿à´\9fàµ\86 à´¸àµ\8dവയà´\82 à´¶à´°à´¿à´¯à´¾à´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨àµ\81.",
        "double-redirect-fixer": "തിരിച്ചുവിടൽ ശരിയാക്കിയത്",
        "brokenredirects": "മുറിഞ്ഞ തിരിച്ചുവിടലുകൾ",
        "brokenredirectstext": "താഴെക്കാണുന്ന തിരിച്ചുവിടലുകൾ നിലവിലില്ലാത്ത താളുകളിലേയ്ക്കാണ്‌:",
        "log-title-wildcard": "ഈ വാക്കിൽ തുടങ്ങുന്ന തിരച്ചിൽ ഫലങ്ങൾ",
        "showhideselectedlogentries": "തിരഞ്ഞെടുത്ത രേഖാ വിവരങ്ങൾ പ്രദർശിപ്പിക്കുക/മറയ്ക്കുക",
        "allpages": "എല്ലാ താളുകളും",
-       "alphaindexline": "$1 മുതൽ $2 വരെ",
        "nextpage": "അടുത്ത താൾ ($1)",
        "prevpage": "മുൻപത്തെ താൾ ($1)",
        "allpagesfrom": "താളുകളുടെ തുടക്കം:",
        "watchnologin": "ലോഗിൻ ചെയ്തിട്ടില്ല",
        "addwatch": "ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയിലേക്കു ചേർക്കുക",
        "addedwatchtext": "താങ്കൾ [[Special:Watchlist|ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയിലേക്ക്]] \"[[:$1]]\" എന്ന ഈ താൾ ചേർത്തിരിക്കുന്നു. ഇനി മുതൽ ഈ താളിലും ബന്ധപ്പെട്ട സം‌വാദം താളിലും ഉണ്ടാകുന്ന മാറ്റങ്ങൾ ആ പട്ടികയിൽ ദൃശ്യമാവും.",
+       "addedwatchtext-short": "\"$1\" എന്ന താൾ താങ്കൾ ശ്രദ്ധിക്കുന്നവയുടെ പട്ടികയിലേക്ക് ചേർത്തു.",
        "removewatch": "ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയിൽ നിന്നും ഒഴിവാക്കുക",
        "removedwatchtext": "താങ്കൾ [[Special:Watchlist|ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയിൽ]] നിന്നും \"[[:$1]]\" എന്ന താൾ നീക്കം ചെയ്തിരിക്കുന്നു.",
+       "removedwatchtext-short": "\"$1\" എന്ന താൾ താങ്കൾ ശ്രദ്ധിക്കുന്നവയുടെ പട്ടികയിൽ നിന്ന് നീക്കി.",
        "watch": "മാറ്റങ്ങൾ ശ്രദ്ധിക്കുക",
        "watchthispage": "ഈ താൾ ശ്രദ്ധിക്കുക",
        "unwatch": "ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയിൽ നിന്നു മാറ്റുക",
        "watchlist-details": "സം‌വാദത്താളുകൾ ഉൾപ്പെടുത്താതെ {{PLURAL:$1|ഒരു താൾ|$1 താളുകൾ}} താങ്കൾ ശ്രദ്ധിക്കുന്നവയുടെ പട്ടികയിലുണ്ട്.",
        "wlheader-enotif": "ഇമെയിൽ അറിയിപ്പുകൾ സജ്ജമാക്കിയിരിക്കുന്നു.",
        "wlheader-showupdated": "താങ്കളുടെ അവസാന സന്ദർശനത്തിനു ശേഷം മാറ്റം വന്ന താളുകൾ  '''കടുപ്പിച്ച്''' കാണിച്ചിരിക്കുന്നു",
-       "watchmethod-recent": "ശ്രദ്ധിക്കുന്ന താളുകൾക്കുവേണ്ടി പുതിയ മാറ്റങ്ങൾ പരിശോധിക്കുന്നു",
-       "watchmethod-list": "ശ്രദ്ധിക്കുന്ന താളുകളിലെ പുതിയ മാറ്റങ്ങൾ പരിശോധിക്കുന്നു",
-       "watchlistcontains": "താങ്കൾ {{PLURAL:$1|താൾ|താളുകൾ}} ശ്രദ്ധിക്കുന്നുണ്ട്.",
-       "iteminvalidname": "ഇനം '$1' ൽ പിഴവ്, അസാധുവായ പേര്‌...",
        "wlnote2": "$2, $3-നു കഴിഞ്ഞ {{PLURAL:$1|ഒരു മണിക്കൂറിലെ|<strong>$1</strong> മണിക്കൂറുകളിലെ}} മാറ്റങ്ങൾ താഴെക്കൊടുത്തിരിക്കുന്നു.",
        "wlshowlast": "ഒടുവിലത്തെ $1 മണിക്കൂറുകൾ $2 ദിനങ്ങൾ, $3 പ്രദർശിപ്പിക്കുക",
        "watchlist-options": "ശ്രദ്ധിക്കുന്ന താളുകളുടെ സജ്ജീകരണങ്ങൾ",
        "enotif_lastvisited": "താങ്കളുടെ അവസാന സന്ദർശനത്തിനു ശേഷമുണ്ടായ മാറ്റങ്ങൾ കാണുവാൻ  $1 സന്ദർശിക്കുക.",
        "enotif_lastdiff": "ഈ മാറ്റം കാണാൻ $1 കാണുക.",
        "enotif_anon_editor": "അജ്ഞാത ഉപയോക്താവ് $1",
-       "enotif_body": "പ്രിയ $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\n{{SITENAME}} സം‌രംഭത്തിലെ $PAGETITLE എന്ന താൾ $PAGEEDITDATE-ൽ $PAGEEDITOR എന്ന ഉപയോക്താവ് $CHANGEDORCREATED, ഇപ്പോഴുള്ള പതിപ്പിനായി $PAGETITLE_URL കാണുക.\n\n$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{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "പ്രിയ $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\n{{SITENAME}} സം‌രംഭത്തിലെ $PAGETITLE എന്ന താൾ $PAGEEDITDATE-ൽ $PAGEEDITOR എന്ന ഉപയോക്താവ് $CHANGEDORCREATED, ഇപ്പോഴുള്ള പതിപ്പിനായി $PAGETITLE_URL കാണുക.\n\n$NEWPAGE\n\nതിരുത്തിയയാൾ നൽകിയ സം‌ഗ്രഹം: $PAGESUMMARY $PAGEMINOREDIT\n\nതിരുത്തിയയാളെ ബന്ധപ്പെടുക:\nമെയിൽ: $PAGEEDITOR_EMAIL\nവിക്കി: $PAGEEDITOR_WIKI\n\nതാങ്കൾ ലോഗിൻ ചെയ്ത് ഈ താൾ സന്ദർശിക്കുന്നില്ലങ്കിൽ മറ്റ് അറിയിപ്പുകൾ ഒന്നുമുണ്ടാകുന്നതല്ല. ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടിക സന്ദർശിച്ചും ഉൾപ്പെട്ട താളുകളിലെ അറിയിപ്പ് മുദ്രകൾ താങ്കൾക്ക് പുനഃക്രമീകരിക്കാവുന്നതാണ്‌.\n\nതാങ്കളുടെ {{SITENAME}} സുഹൃദ് അറിയിപ്പ് സജ്ജീകരണം\n\n--\nഇമെയിൽ അറിയിപ്പ് സജ്ജീകരണങ്ങളിൽ മാറ്റംവരുത്താൻ, സന്ദർശിക്കുക\n{{canonicalurl:{{#special:Preferences}}}}\n\nശ്രദ്ധിക്കുന്ന പട്ടികയിലെ ക്രമീകരണങ്ങളിൽ മാറ്റം വരുത്താൻ, സന്ദർശിക്കുക\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nതാൾ താങ്കൾ ശ്രദ്ധിക്കുന്നവയുടെ പട്ടികയിൽ നിന്ന് നീക്കംചെയ്യാൻ, സന്ദർശിക്കുക\n$UNWATCHURL\n\nഅഭിപ്രായം അറിയിക്കാനും മറ്റു സഹായങ്ങൾക്കും:\n$HELPPAGE",
        "created": "സൃഷ്ടിച്ചു",
        "changed": "മാറ്റിയിരിക്കുന്നു",
        "deletepage": "താൾ മായ്ക്കുക",
        "blockip": "ഉപയോക്താവിനെ തടയുക",
        "blockip-legend": "ഉപയോക്താവിനെ തടയുക",
        "blockiptext": "ഏതെങ്കിലും ഐ.പി. വിലാസത്തേയോ ഉപയോക്താവിനേയോ തടയുവാൻ താഴെയുള്ള ഫോം ഉപയോഗിക്കുക.\n[[{{MediaWiki:Policy-url}}|വിക്കിയുടെ നയം]] അനുസരിച്ച് നശീകരണപ്രവർത്തനം തടയാൻ മാത്രമേ ഇതു ചെയ്യാവൂ.\nതടയാനുള്ള വ്യക്തമായ കാരണം (ഏതു താളിലാണു നശീകരണപ്രവർത്തനം നടന്നത് എന്നതടക്കം) താഴെ രേഖപ്പെടുത്തിയിരിക്കണം.",
-       "ipadressorusername": "ഐ.പി. വിലാസം അല്ലെങ്കിൽ ഉപയോക്തൃനാമം:",
+       "ipaddressorusername": "ഐ.പി. വിലാസം അല്ലെങ്കിൽ ഉപയോക്തൃനാമം:",
        "ipbexpiry": "കാലാവധി:",
        "ipbreason": "കാരണം:",
        "ipbreason-dropdown": "*തടയലിനു യോഗ്യമായ കാരണങ്ങൾ\n** തെറ്റായ വിവരങ്ങൾ ചേർക്കുക\n** താളിൽ നിന്നു വിവരങ്ങൾ മായ്ക്കുക\n** പുറം വെബ്ബ്സൈറ്റിലേക്കുള്ള പാഴ് കണ്ണികൾ ചേർക്കൽ\n** അനാവശ്യം/അസംബന്ധം താളിലേക്കു ചേർക്കൽ\n** മാന്യമല്ലാത്ത പെരുമാറ്റം\n** ദുരുദ്ദേശത്തോടെ ഉപയോഗിക്കുന്ന നിരവധി അംഗത്വങ്ങൾ\n** വിക്കിക്കു ചേരാത്ത ഉപയോക്തൃനാമം",
        "movepagetalktext": "'''ബന്ധപ്പെട്ട സം‌വാദത്താൾ സ്വയം മാറ്റപ്പെടാതിരിക്കാനുള്ള കാരണങ്ങൾ'''\n*അതേ പേരിൽ തന്നെ ശൂന്യമല്ലാത്ത ഒരു സം‌വാദത്താൾ നിലവിലുണ്ടെങ്കിൽ\n*താങ്കൾ താഴെയുള്ള ചെൿബോക്സ് ഉപയോഗിച്ചിട്ടില്ലെങ്കിൽ\n\nഅത്തരം സന്ദർഭങ്ങളിൽ സം‌വാദത്താളുകൾ താങ്കൾ സ്വയം കൂട്ടിച്ചേർക്കേണ്ടതാണ്.",
        "movearticle": "മാറ്റേണ്ട താൾ",
        "moveuserpage-warning": "'''മുന്നറിയിപ്പ്:''' ഉപയോക്താവിനുള്ള താളാണ് താങ്കൾ മാറ്റാൻ പോകുന്നത്. താൾ മാത്രമേ മാറുകയുള്ളു എന്നും ഉപയോക്താവിന്റെ പേര് ''മാറുകയില്ലെന്നും'' ദയവായി ഓർക്കുക.",
+       "movecategorypage-warning": "<strong>മുന്നറിയിപ്പ്:</strong> താങ്കൾ ഒരു വർഗ്ഗതാൾ മാറ്റാൻ പോവുകയാണ്. ഈ താൾ മാത്രമേ മാറുകയുള്ളുവെന്നും പഴയ വർഗ്ഗത്തിൽ ഉണ്ടായിരുന്ന താളുകളൊന്നും പുനർവർഗ്ഗീകരണം ചെയ്യാത്ത പക്ഷം പുതിയതിലേക്ക് <em>മാറില്ലെന്നും</em> ഓർക്കുക.",
        "movenologintext": "തലക്കെട്ടു മാറ്റാനുള്ള അനുമതി കൈവരിക്കാൻ താങ്കൾ ഒരു രജിസ്റ്റേർഡ് ഉപയോക്താവായിരിക്കുകയും [[Special:UserLogin|ലോഗിൻ ചെയ്തിരിക്കുകയും]] ചെയ്യേണ്ടത് അത്യന്താപേക്ഷിതമാണ്‌.",
        "movenotallowed": "താളുകളുടെ തലക്കെട്ടു മാറ്റുവാനുള്ള അനുവാദം താങ്കൾക്കില്ല.",
        "movenotallowedfile": "പ്രമാണങ്ങൾ മാറ്റാനുള്ള അനുമതി താങ്കൾക്കില്ല.",
        "cant-move-user-page": "ഉപയോക്താവിനുള്ള താളുകളുടെ തലക്കെട്ട് മാറ്റാനുള്ള അനുമതി താങ്കൾക്കില്ല (ഉപതാളുകൾ ഉൾപ്പെടുന്നില്ല).",
        "cant-move-to-user-page": "ഉപയോക്താവിനുള്ള താളിന്റെ തലക്കെട്ടു മാറ്റാനുള്ള അനുമതി താങ്കൾക്കില്ല (ഉപയോക്താവിനുള്ള ഉപതാളുകൾ ഒഴിച്ച്).",
+       "cant-move-category-page": "വർഗ്ഗ താളുകൾ മാറ്റാനുള്ള അനുവാദം താങ്കൾക്കില്ല.",
+       "cant-move-to-category-page": "ഒരു താൾ വർഗ്ഗ താളാക്കി മാറ്റാനുള്ള അനുവാദം താങ്കൾക്കില്ല.",
        "newtitle": "പുതിയ തലക്കെട്ട്:",
        "move-watch": "ഈ താളിലെ മാറ്റങ്ങൾ ശ്രദ്ധിക്കുക",
        "movepagebtn": "താൾ മാറ്റുക",
        "tooltip-summary": "ചെറിയൊരു ചുരുക്കം ചേർക്കുക",
        "common.css": "/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. എല്ലാ ദൃശ്യരൂപങ്ങൾക്കും ബാധകമായിരിക്കും */",
        "monobook.css": "/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. മോണോബുക്ക് ദൃശ്യരൂപം ഉപയോഗിക്കുന്നവർക്ക് ബാധകമായിരിക്കും */",
-       "modern.css": "/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. നവീനം ദൃശ്യരൂപം ഉപയോഗിക്കുന്നവർക്ക് ബാധകമായിരിക്കും */",
        "vector.css": "/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. വെക്റ്റർ ദൃശ്യരൂപത്തിനു ബാധകമായിരിക്കും*/",
        "noscript.css": "/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്., ജാവാസ്ക്രിപ്റ്റ് സജ്ജമാക്കിയിട്ടില്ലാത്ത ഉപയോക്താക്കൾക്ക് ബാധകമായിരിക്കും */",
        "group-autoconfirmed.css": "/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. യാന്ത്രികമായി സ്ഥിരീകരിച്ച ഉപയോക്താക്കൾക്ക് ബാധകമായിരിക്കും */",
        "group-bureaucrat.css": "/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. ബ്യൂറോക്രാറ്റുകൾക്ക് ബാധകമായിരിക്കും */",
        "common.js": "/* ഇവിടെ നൽകുന്ന ജാവാസ്ക്രിപ്റ്റ് എല്ലാ ഉപയോക്താക്കൾക്കും, എല്ലാ താളുകളിലും പ്രവർത്തിക്കുന്നതായിരിക്കും */",
        "monobook.js": "/* ഇവിടെ നൽകുന്ന ജാവാസ്ക്രിപ്റ്റ് മോണോബുക്ക് ദൃശ്യരൂപം ഉപയോഗിക്കുന്നവർക്ക് ബാധകമായിരിക്കും */",
-       "modern.js": "/* ഇവിടെ നൽകുന്ന ജാവാസ്ക്രിപ്റ്റ് നവീനം ദൃശ്യരൂപം ഉപയോഗിക്കുന്നവർക്ക് ബാധകമായിരിക്കും */",
        "vector.js": "/*ഇവിടെ നൽകുന്ന ജാവാസ്ക്രിപ്റ്റ് വെക്റ്റർ ദൃശ്യരൂപം ഉപയോഗിക്കുന്ന ഉപയോക്താക്കൾക്ക് ബാധകമായിരിക്കും*/",
        "group-autoconfirmed.js": "/* ഇവിടെ നൽകുന്ന ജാവാസ്ക്രിപ്റ്റ് യാന്ത്രികമായി സ്ഥിരീകരിക്കപ്പെട്ട ഉപയോക്താക്കൾക്ക് ബാധകമായിരിക്കും */",
        "group-bot.js": "/* ഇവിടെ നൽകുന്ന ജാവാസ്ക്രിപ്റ്റ് ബോട്ടുകൾക്ക് ബാധകമായിരിക്കും */",
        "group-sysop.js": "/* ഇവിടെ നൽകുന്ന ജാവാസ്ക്രിപ്റ്റ് കാര്യനിർവാഹകർക്ക് ബാധകമായിരിക്കും */",
        "group-bureaucrat.js": "/* ഇവിടെ നൽകുന്ന ജാവാസ്ക്രിപ്റ്റ് ബ്യൂറോക്രാറ്റുകൾക്ക് ബാധകമായിരിക്കും */",
-       "notacceptable": "താങ്കളുടെ ക്ലയന്റിനു മനസ്സിലാക്കാൻ പാകത്തിലുള്ള തരത്തിൽ വിവരങ്ങൾ നൽകാൻ വിക്കി സെർവറിനു ശേഷിയില്ല.",
        "anonymous": "{{SITENAME}} സംരംഭത്തിലെ അജ്ഞാത {{PLURAL:$1|ഉപയോക്താവ്|ഉപയോക്താക്കൾ}}",
        "siteuser": "{{SITENAME}} ഉപയോക്താവ് $1",
        "anonuser": "{{SITENAME}} പദ്ധതിയിലെ അജ്ഞാത ഉപയോക്താവ് $1",
        "pageinfo-category-pages": "താളുകളുടെ എണ്ണം",
        "pageinfo-category-subcats": "ഉപവർഗ്ഗങ്ങളുടെ എണ്ണം",
        "pageinfo-category-files": "പ്രമാണങ്ങളുടെ എണ്ണം",
-       "skinname-cologneblue": "ക്ലോൺ നീല",
        "skinname-monobook": "മോണോബുക്ക്",
-       "skinname-modern": "നവീനം",
        "skinname-vector": "വെക്റ്റർ",
        "markaspatrolleddiff": "റോന്തുചുറ്റിയതായി അടയാളപ്പെടുത്തുക",
        "markaspatrolledtext": "ഈ താളിൽ റോന്തുചുറ്റിയതായി രേഖപ്പെടുത്തുക",
        "newimages-summary": "ചുരുക്കം",
        "newimages-legend": "അരിപ്പ",
        "newimages-label": "പ്രമാണത്തിന്റെ പേര്‌ (അഥവാ പേരിന്റെ ഭാഗം)",
-       "showhidebots": "(യന്ത്രങ്ങളെ $1)",
+       "newimages-showbots": "യന്ത്രങ്ങൾ ചെയ്ത അപ്‌ലോഡുകൾ പ്രദർശിപ്പിക്കുക",
        "noimages": "ഒന്നും കാണാനില്ല.",
        "ilsubmit": "തിരയൂ",
        "bydate": "ദിനക്രമത്തിൽ",
        "bitrate-kilobits": "$1കെ.ബി.പി.എസ്.",
        "bitrate-megabits": "$1എം.ബി.പി.എസ്.",
        "bitrate-gigabits": "$1ജി.ബി.പി.എസ്.",
-       "livepreview-loading": "ശേഖരിക്കുന്നു...",
-       "livepreview-ready": "ശേഖരിച്ചുകൊണ്ടിരിക്കുന്നു… തയ്യാർ!",
-       "livepreview-failed": "തൽസമയ പ്രിവ്യൂ പരാജയപ്പെട്ടു. സാധാരണ പ്രിവ്യൂ പരീക്ഷിക്കുക.",
-       "livepreview-error": "ബന്ധപ്പെടൽ പരാജയപ്പെട്ടു.  $1 \"$2\".\nദയവായി സാധാരണ പ്രിവ്യൂ ശ്രമിക്കുക.",
        "lag-warn-normal": "$1 {{PLURAL:$1|സെക്കന്റിനുള്ളിൽ|സെക്കന്റുകൾക്കുള്ളിൽ}} നടന്ന തിരുത്തലുകൾ ഈ പട്ടികയിൽ ഉണ്ടാകാനിടയില്ല.",
        "lag-warn-high": "ഡേറ്റാബേസ് സെർവറിന്റെ കൂടിയ താമസം മൂലം, {{PLURAL:$1|ഒരു സെക്കന്റിൽ|$1 സെക്കന്റുകളിൽ}} നടന്ന മാറ്റങ്ങൾ പട്ടികയിൽ കാണണമെന്നില്ല.",
-       "watchlistedit-numitems": "താങ്കൾ സം‌വാദത്താളുകൾ ഒഴിച്ച് {{PLURAL:$1|ഒരു താൾ|$1 താളുകൾ}} ശ്രദ്ധിക്കുന്നുണ്ട്.",
-       "watchlistedit-noitems": "താങ്കൾ നിലവിൽ ഒരു താളും ശ്രദ്ധിക്കുന്നില്ല.",
        "watchlistedit-normal-title": "ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടിക തിരുത്തുക",
        "watchlistedit-normal-legend": "ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയിൽ നിന്നും ഒഴിവാക്കുക",
        "watchlistedit-normal-explain": "താങ്കൾ ശ്രദ്ധിക്കുന്ന താളുകൾ താഴെ കൊടുത്തിരിക്കുന്നു. നീക്കം ചെയ്യേണ്ടവ തിരഞ്ഞെടുത്ത ശേഷം '''{{int:Watchlistedit-normal-submit}}''' എന്ന ബട്ടണിൽ ഞെക്കിയാൽ നീക്കം ചെയ്യപ്പെടുന്നതാണ്‌. താങ്കൾക്ക് [[Special:EditWatchlist/raw|പട്ടികയുടെ മൂല രൂപം]] തിരുത്തുകയും ചെയ്യാവുന്നതാണ്‌.",
        "watchlistedit-raw-done": "താങ്കളുടെ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടിക പുതുക്കിയിരിക്കുന്നു.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 താൾ|$1 താളുകൾ}} പട്ടികയിലേക്കു ചേർത്തിരിക്കുന്നു:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|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 തലക്കെട്ടുകൾ}} ഒഴിവാക്കി:",
+       "watchlistedit-too-many": "പ്രദർശിപ്പിക്കാൻ വളരെയധികം താളുകൾ ഉണ്ട്.",
+       "watchlisttools-clear": "ശ്രദ്ധിക്കുന്നവയുടെ പട്ടിക ശൂന്യമാക്കുക",
        "watchlisttools-view": "ബന്ധപ്പെട്ട മാറ്റങ്ങൾ പ്രദർശിപ്പിക്കുക",
        "watchlisttools-edit": "ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടിക കാണുക, തിരുത്തുക",
        "watchlisttools-raw": "താങ്കൾ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയുടെ മൂലരൂപം തിരുത്തുക",
        "compare-invalid-title": "താങ്കൾ നൽകിയ തലക്കെട്ട് അസാധുവാണ്.",
        "compare-title-not-exists": "താങ്കൾ നൽകിയ തലക്കെട്ട് നിലവിലില്ല.",
        "compare-revision-not-exists": "താങ്കൾ വ്യക്തമാക്കിയ നാൾപ്പതിപ്പ് നിലവിലില്ല.",
-       "dberr-header": "ഈ വിക്കിയിൽ പ്രശ്നമുണ്ട്",
        "dberr-problems": "ക്ഷമിക്കണം! ഈ സൈറ്റിൽ സാങ്കേതിക തകരാറുകൾ അനുഭവപ്പെടുന്നുണ്ട്.",
        "dberr-again": "കുറച്ച് മിനിട്ടുകൾ കാത്തിരുന്ന് വീണ്ടും തുറക്കുവാൻ ശ്രമിക്കുക.",
        "dberr-info": "(വിവരശേഖര സെർവറുമായി ബന്ധപ്പെടാൻ പറ്റിയില്ല: $1)",
        "htmlform-no": "ഇല്ല",
        "htmlform-yes": "ശരി",
        "htmlform-chosen-placeholder": "ഒരു ഐച്ഛികം തിരഞ്ഞെടുക്കുക",
+       "htmlform-cloner-create": "കൂടുതൽ ചേർക്കുക",
+       "htmlform-cloner-delete": "നീക്കം ചെയ്യുക",
+       "htmlform-cloner-required": "കുറഞ്ഞത് ഒരു വിലയെങ്കിലും നൽകിയിരിക്കണം.",
        "sqlite-has-fts": "പൂർണ്ണ-എഴുത്ത് തിരച്ചിൽ പിന്തുണയുള്ള $1",
        "sqlite-no-fts": "പൂർണ്ണ-എഴുത്ത് തിരച്ചിൽ പിന്തുണയില്ലാത്ത $1",
        "logentry-delete-delete": "$3 എന്ന താൾ $1 {{GENDER:$2|മായ്ച്ചിരിക്കുന്നു}}",
index c770a1f..a184e82 100644 (file)
@@ -10,7 +10,8 @@
                        "MongolWiki",
                        "Wisdom",
                        "Zorigt",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Линкүүдийн доогуур зураас зур:",
        "category_header": "\"$1\" ангийн дан хуудас",
        "subcategories": "Ангийн бүлэг",
        "category-media-header": "\"$1\" ангийн файл",
-       "category-empty": "''Ð\9eдоогийн Ð±Ð°Ð¹Ð´Ð»Ð°Ð°Ñ\80 Ñ\8dнÑ\8d Ð°Ð½Ð³Ð¸Ð»Ð°Ð»Ð´ Ñ\85Ñ\83Ñ\83даÑ\81, Ð¼ÐµÐ´Ð¸Ð° Ñ\84айл Ð±Ð°Ð¹Ñ\85гүй Ð±Ð°Ð¹Ð½а.''",
+       "category-empty": "''Ð\9eдоогооÑ\80 Ñ\8dнÑ\8d Ð°Ð½Ð³Ð¸Ð´ Ñ\85Ñ\83Ñ\83даÑ\81, Ð·Ñ\83Ñ\80гийн Ð°Ð»Ñ\8c Ð½Ñ\8c Ñ\87 Ð°Ð»Ð³а.''",
        "hidden-categories": "{{PLURAL:$1|Нуугдсан анги|Нуугдсан ангиуд}}",
        "hidden-category-category": "Нуугдсан ангиллууд",
        "category-subcat-count": "{{PLURAL:$2|Тус ангид дараах ангийн хуудсууд хамаарна.|Тус ангид дараах $2 ангийн хуудсууд хамаарна.}}",
        "vector-view-view": "Унших",
        "vector-view-viewsource": "Кодыг харах",
        "actions": "Үйлдлүүд",
-       "namespaces": "Ð\9dÑ\8dÑ\80ний Ð·Ð°Ð¹Ð½Ñ\83Ñ\83д",
+       "namespaces": "Ð¥Ñ\83Ñ\83дÑ\81Ñ\8bн Ñ\82Ó©Ñ\80өл",
        "variants": "Хувилбарууд",
        "navigation-heading": "Хажуугийн цэс",
        "errorpagetitle": "Aлдаа",
        "readonly_lag": "Хоёрдогч серверүүд анхдагчдаа гүйцэж ирэх хүртэл мэдээллийн санг автоматаар түгжлээ.",
        "internalerror": "Дотоод алдаа",
        "internalerror_info": "Дотоод алдаа: $1",
-       "fileappenderrorread": "Нэмж залгах үед \"$1\"-г уншиж чадсангүй",
-       "fileappenderror": "\"$1\"-г \"$2-нд нэмж чадсангүй.",
        "filecopyerror": "Файлыг \"$1\"-с \"$2\" руу хуулж чадсангүй.",
        "filerenameerror": "Файлын нэрийг \"$1\"-с \"$2\" болгон өөрчилж чадсангүй.",
        "filedeleteerror": "\"$1\" файлыг устгаж чадсангүй.",
        "directorycreateerror": "\"$1\" жагсаалтыг үүсгэж чадсангүй.",
        "filenotfound": "\"$1\" файл олдсонгүй.",
-       "fileexistserror": "\"$1\" файл руу бичиж болохгүй байна: ийм файл оршиж байна",
        "unexpected": "Санаандгүй утга: \"$1\"=\"$2\".",
        "formerror": "Алдаа: маягтыг явуулж чадсангүй",
        "badarticleerror": "Энэ үйлдлийг энэ хуудсан дээр гүйцэтгэх боломжгүй байна.",
        "userlogin-resetpassword-link": "Нууц үгээ мартсан уу?",
        "userlogin-loggedin": "Та {{GENDER:$1|$1}} нэрээр нэвтэрсэн байна.\nӨөр нэрээр нэвтрэх бол доорх маягтыг ашиглана уу.",
        "userlogin-createanother": "Өөр бүртгэл үүсгэх",
-       "createacct-join": "Мэдээллээ оруулна уу.",
-       "createacct-another-join": "Шинэ бүртгэлийн мэдээллээ оруулна уу.",
        "createacct-emailrequired": "Цахим шуудангийн хаяг",
        "createacct-email-ph": "Цахим шуудангийн хаягаа оруулна уу",
        "createacct-another-email-ph": "Цахим шуудангийн хаяг оруулна уу",
        "savearticle": "Хуудсыг хадгалах",
        "preview": "Урьдчилж харах",
        "showpreview": "Урьдчилж харах",
-       "showlivepreview": "Шууд байдлаар урьдчилж харах",
        "showdiff": "Өөрчлөлтүүдийг харуул",
        "anoneditwarning": "'''Анхаар:''' Та нэвтрээгүй байна.\nЭнэ хуудасны засварын түүхэнд таны IP хаяг хадгалагдана.",
        "anonpreviewwarning": "''Та нэвтрээгүй байна. Хадгалвал энэ хуудасны түүхэнд таны IP хаяг бичигдлэх болно.''",
        "search-nonefound": "Хайлтад таарсан үр дүн илэрсэнгүй.",
        "powersearch-legend": "Сонгосон хайлт",
        "powersearch-ns": "Дараах нэрний зайнуудад хайх:",
-       "powersearch-redir": "Чиглүүлэгч хуудсуудыг оролцуулах",
        "powersearch-togglelabel": "Сонгох:",
        "powersearch-toggleall": "Бүгдийг",
        "powersearch-togglenone": "Байхгүй",
        "prefs-advancedsearchoptions": "Ахимаг хэмжээний сонголтууд",
        "prefs-advancedwatchlist": "Ахимаг хэмжээний сонголтууд",
        "prefs-displayrc": "Харагдах байдлын сонголтууд",
-       "prefs-displaysearchoptions": "Харагдацийн тохиргоо",
        "prefs-displaywatchlist": "Харагдацийн тохиргоо",
        "prefs-diffs": "Ялгаанууд",
        "email-address-validity-valid": "Цахим шуудан хүчинтэй байна",
        "recentchanges-legend-heading": "'''Таних үсэг:'''",
        "recentchanges-legend-newpage": "([[Special:NewPages|жагсааж харах]])",
        "rcnotefrom": "Доорх нь '''$2'''-с хойших өөрчлөлтүүд ('''$1''' хүртэлхийг харуулав) юм.",
-       "rclistfrom": "$1-с хойших шинэ засваруудыг үзүүлэх",
+       "rclistfrom": "$3 $2-с хойших шинэ засваруудыг үзүүлэх",
        "rcshowhideminor": "Бага зэргийн засваруудыг $1",
+       "rcshowhideminor-show": "үзүүлэх",
+       "rcshowhideminor-hide": "нуух",
        "rcshowhidebots": "Роботуудыг $1",
        "rcshowhideliu": "Нийт $1 бүртгэгдсэн хэрэглэгчид",
        "rcshowhideliu-show": "үзүүлэх",
        "rcshowhideanons-hide": "нуух",
        "rcshowhidepatr": "Хянагдаж буй засваруудыг $1",
        "rcshowhidemine": "Миний засваруудыг $1",
+       "rcshowhidemine-show": "үзүүлэх",
+       "rcshowhidemine-hide": "нуух",
        "rclinks": "Сүүлийн $2 өдрийн турших $1 засварыг үзүүлэх<br />$3",
        "diff": "ялгаа",
        "hist": "түүх",
        "rc-enhanced-expand": "Дэлгэрэнгүй мэдээллийг үзүүлэх (ЖаваСкрипт хэрэглэгдэнэ)",
        "rc-enhanced-hide": "Дэлгэрэнгүй мэдээллийг нуух (ЖаваСкрипт хэрэглэгдэнэ)",
        "rc-old-title": "Анх өгсөн гарчиг нь \"$1\"",
-       "recentchangeslinked": "Холбогдох өөрчлөлтүүд",
-       "recentchangeslinked-feed": "Холбогдох өөрчлөлтүүд",
-       "recentchangeslinked-toolbox": "Холбогдох өөрчлөлтүүд",
+       "recentchangeslinked": "Өөрчлөгдчихсөн эсэх",
+       "recentchangeslinked-feed": "Өөрчлөгдчихсөн эсэх",
+       "recentchangeslinked-toolbox": "Өөрчлөгдчихсөн эсэх",
        "recentchangeslinked-title": "\"$1\"-тай холбоотой засварууд",
        "recentchangeslinked-summary": "Энэ хуудас бол тодорхой хуудаснаас (эсвэл тодорхой ангиллын доторх хуудсууд) холбогдсон хуудсуудад хийгдсэн өөрчлөлтийн жагсаалт юм.\nТаны [[Special:Watchlist|хянах жагсаалтанд]] буй хуудсууд '''тодруулагдсан''' байгаа.",
        "recentchangeslinked-page": "Хуудасны нэр:",
        "uploadstash-errclear": "Файлыг цэвэрлэхэд саад учирлаа.",
        "uploadstash-refresh": "Харагдаж буй файлуудыг сэргээн харах",
        "img-auth-accessdenied": "Хандах эрхгүй байна",
-       "img-auth-nopathinfo": "PATH_INFO байхгүй байна.\nЭнэхүү мэдээллийг явуулахад сервер тань тохирогдоогүй байна.\nCGI-д тулгуурласан ба img_auth-г дэмжихгүй байж магадгүй.\nhttps://www.mediawiki.org/wiki/Manual:Image_Authorization -г харна уу.",
+       "img-auth-nopathinfo": "PATH_INFO байхгүй байна.\nЭнэхүү мэдээллийг явуулахад сервер тань тохирогдоогүй байна.\nCGI-д тулгуурласан ба img_auth-г дэмжихгүй байж магадгүй.\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization -г харна уу.",
        "img-auth-notindir": "Тохируулсан оруулалтын директорид таны хүссэн зам байхгүй байна.",
        "img-auth-badtitle": "\"$1\"-с хүчинтэй гарчиг үүсгэж чадсангүй.",
        "img-auth-nologinnWL": "Та нэвтрээгүй байгаа бөгөөд \"$1\" нь цагаан дансанд байхгүй байна.",
        "watchlist-details": "Хяналтын жагсаалтад {{PLURAL:$1|$1 хуудас|$1 хуудаснууд}} байна.",
        "wlheader-enotif": "И-мэйл мэдэгдэл хүчинтэй боллоо.",
        "wlheader-showupdated": "Таны хамгийн сүүлд айлчилснаас хойш өөрчлөгдсөн хуудсууд '''тодоор''' бичигдсэн байгаа",
-       "watchmethod-recent": "хяналтад буй хуудсуудад шинэ өөрчлөлт орсон эсэхийг шалгаж байна",
-       "watchmethod-list": "хяналтад буй хуудсуудад саяхан өөрчлөлт орсон эсэхийг шалгаж байна",
-       "watchlistcontains": "Таны хянах жагсаалтанд $1 хуудас байна.",
-       "iteminvalidname": "'$1' зүйлд асуудал гарлаа, хүчингүй нэр...",
        "wlshowlast": "Сүүлийн $1 цагийн $2 өдрийн $3-г харуул",
        "watchlist-options": "Хянаж буй хуудсуудын жагсаалтны сонголтууд",
        "watching": "Хянаж байна...",
        "enotif_lastvisited": "$1-н хамгийн сүүлд зочилсноос хойших өөрчлөлтүүдийг харуул.",
        "enotif_lastdiff": "$1-г харж энэ өөрчлөлтийг үзнэ үү.",
        "enotif_anon_editor": "$1 бүртгэлгүй хэрэглэгч",
-       "enotif_body": "$WATCHINGUSERNAME танаа,\n\nTo change your watchlist settings, visit\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\n{{SITENAME}}-н $PAGETITLE хуудаст $PAGEEDITOR $PAGEEDITDATE-нд $CHANGEDORCREATED үйлдэл хийжээ. $PAGETITLE_URL -руу орж одоогоор хийгдээд байгаа засварыг харна уу.\n\n$NEWPAGE\n\nЗассан тойм: $PAGESUMMARY $PAGEMINOREDIT\n\nЗасвар хийсэн хүний холбогдъё гэвэл:\nемэйл: $PAGEEDITOR_EMAIL\nвики: $PAGEEDITOR_WIKI\n\nӨөр шинээр хийгдэх өөрчлөлтүүдийн талаарх уг хуудсан орж л байж мэдэх боломжтой.\nМөн та үзсэн хуудсынхаа шинээр хийгдэх өөрчлөлтүүдийг сануулах тохиргоог шинэчилж болно. \n\n\t\t\t {{SITENAME}} -н сануулгын систем\n\n--\nИмейл хаягаар шинэчлэл хийсэн талаар мэдээлэл явуулах тохиргоог \n{{canonicalurl:{{#special:Preferences}}}} хаягаар орж хийнэ үү\n\nХянаж буй хуудсын жагсаалтын тохиргоог\n{{canonicalurl:{{#special:EditWatchlist}}}} хаягаар орж хийнэ үү\n\nХянаж буй хуудын жагсаалтаас хаяг хасах тохиолдолд\n$UNWATCHURL\n\nСанал сэтгэгдэл болон тулгарсан бэрхшээлээ :\n{{canonicalurl:{{MediaWiki:Helppage}}}} хаягаар орж бичнэ үү",
+       "enotif_body": "$WATCHINGUSERNAME танаа,\n\nTo change your watchlist settings, visit\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\n{{SITENAME}}-н $PAGETITLE хуудаст $PAGEEDITOR $PAGEEDITDATE-нд $CHANGEDORCREATED үйлдэл хийжээ. $PAGETITLE_URL -руу орж одоогоор хийгдээд байгаа засварыг харна уу.\n\n$NEWPAGE\n\nЗассан тойм: $PAGESUMMARY $PAGEMINOREDIT\n\nЗасвар хийсэн хүний холбогдъё гэвэл:\nемэйл: $PAGEEDITOR_EMAIL\nвики: $PAGEEDITOR_WIKI\n\nӨөр шинээр хийгдэх өөрчлөлтүүдийн талаарх уг хуудсан орж л байж мэдэх боломжтой.\nМөн та үзсэн хуудсынхаа шинээр хийгдэх өөрчлөлтүүдийг сануулах тохиргоог шинэчилж болно. \n\n\t\t\t {{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": "Хуудсыг устга",
        "undelete-error-long": "Дараах файлыг сэргээхэд алдаа гарлаа:\n\n$1",
        "undelete-show-file-confirm": "$2-ий $3 дахь \"<nowiki>$1</nowiki>\" файлын устгагдсан засварыг үзмээр байгаадаа итгэлтэй байна уу?",
        "undelete-show-file-submit": "Тийм",
-       "namespace": "Ð\9dÑ\8dÑ\80ний Ð·Ð°Ð¹:",
+       "namespace": "Ð¥Ñ\83Ñ\83даÑ\81нÑ\8b Ñ\82Ó©Ñ\80өл:",
        "invert": "Зааснаас бусад",
        "namespace_association": "Заасантай холбоотой",
        "blanknamespace": "(Гол)",
        "blockip": "Хэрэглэгчийг түгжих",
        "blockip-legend": "Хэрэглэгчийг түгжих",
        "blockiptext": "Доорх маягтыг ашиглан тодорхой IP хаяг эсвэл хэрэглэгчийн нэрийг засвар хийхээс түгжинэ үү.\nЭнэ нь зөвхөн вандализм үйлдэх явдлаас сэргийлэхийн тулд, [[{{MediaWiki:Policy-url}}|бодлого, баримтлалын]] дагуу хийгдэх ёстой.\nДоор тодорхой шалтгаанаа бичнэ үү.",
-       "ipadressorusername": "IP хаяг буюу хэрэглэгчийн нэр",
+       "ipaddressorusername": "IP хаяг буюу хэрэглэгчийн нэр",
        "ipbexpiry": "Түгжээ нь нээгдэх хугацаа",
        "ipbreason": "Шалтгаан:",
        "ipbreason-dropdown": "*Ерөнхий түгжих шалтгаанууд\n** Худал мэдээлэл оруулсан\n** Хуудаснуудаас агуулга устгасан\n** Гадны холбоосууд руу линк оруулж спам үйлдсэн\n** Утгагүй зүйл/бувтнал оруулсан\n** Сүрдүүлсэн/зовоосон ааш авиртай\n** Олон бүртгэлийг буруу хэргээр ашигласан\n** Зөвшөөршгүй хэрэглэгчийн нэртэй",
        "import-interwiki-history": "Энэ хуудсын бүх хувилбаруудын түүхийг хуулах",
        "import-interwiki-templates": "Бүх загварыг оруулах",
        "import-interwiki-submit": "Импортлох",
-       "import-interwiki-namespace": "Зорьсон нэрний зай:",
+       "import-interwiki-namespace": "Зорьсон хуудсын төрөл:",
        "import-upload-filename": "Файлын нэр:",
        "import-comment": "Тайлбар:",
        "importtext": "[[Special:Export|экспорт багажийг]]  ашиглан файлыг эх үүсвэр викигээс татаад, өөрийн дискэнд хадгалж, энд оруулна уу.",
        "tooltip-summary": "Товч тайлбар оруулах",
        "common.css": "/* Энд тавигдсан CSS-үүд бүх арьсанд нэмэгдэх болно */",
        "common.js": "/* Энд байгаа ЖаваСкрипт хэрэглэгч бүрд ямар нэгэн хуудас нээж үзэх болгонд дуудагдах болно. */",
-       "notacceptable": "Вики сервер нь мэдээллийг таны клиентийн уншиж чадах хэлбэрт олгох боломжгүй байна.",
        "anonymous": "{{SITENAME}}-н бүртгүүлээгүй {{PLURAL:$1|хэрэглэгч|хэрэглэгчид}}",
        "siteuser": "{{SITENAME}}-н хэрэглэгч $1",
        "anonuser": "{{SITENAME}}-н бүртгэлгүй хэрэглэгч $1",
        "newimages-summary": "Энэ тусгай хуудсанд хамгийн сүүлд оруулагдсан файлуудыг үзүүлнэ.",
        "newimages-legend": "Шүүлтүүр",
        "newimages-label": "Файлын нэр (эсвэл түүний нэг хэсэг):",
-       "showhidebots": "(Роботуудыг $1)",
        "noimages": "Харах юмгүй.",
        "ilsubmit": "Хайлт",
        "bydate": "Огноогоор",
        "size-kilobytes": "$1 КБ",
        "size-megabytes": "$1 МБ",
        "size-gigabytes": "$1 ГБ",
-       "livepreview-loading": "Уншиж байна...",
-       "livepreview-ready": "Уншиж байна...Боллоо!",
-       "livepreview-failed": "Шууд урьдчилж харах боломжгүй байна! Ердийн аргаар урьдчилж харна уу.",
-       "livepreview-error": "Холбогдож чадсангүй: $1 \"$2\".\nУрьдчилж харах ердийн аргыг хэрэглэнэ үү.",
        "lag-warn-normal": "$1 {{PLURAL:$1|секундээс|секундээс}}-с өмнөх шинэ өөрчлөлтүүд энэ жагсаалтанд ороогүй байж болзошгүй.",
        "lag-warn-high": "Өгөгдлийн сангийн удаашралтаас үүдэн энэ жагсаалтанд $1 {{PLURAL:$1|секундээс|секундээс}}-с өмнөх шинэ өөрчлөлтүүд  ороогүй байж болзошгүй.",
-       "watchlistedit-numitems": "Таны хянаж буй хуудасны жагсаалтанд {{PLURAL:$1|1 зүйл|$1 зүйл}} байна (хэлэлцүүлгийн хуудсуудыг оролцуулахгүйгээр).",
-       "watchlistedit-noitems": "Таны хянаж буй хуудсуудын жагсаалт хоосон байна.",
        "watchlistedit-normal-title": "Хянах жагсаалтаа засварлах",
        "watchlistedit-normal-legend": "Хянаж буй хуудсуудын жагсаалтаас зүйлс хасах",
        "watchlistedit-normal-explain": "Хянаж буй хуудсуудын жагсаалт дахь зүйлсийг доор үзүүлэв.\nЗүйлийг авч хаяхын тулд үүний хажуу дахь хайрцгийг сонгоод \"{{int:Watchlistedit-normal-submit}}\" дээр дарна уу.\nМөн гар аргаар [[Special:EditWatchlist/raw|жагсаалтад засвар хийж болно]].",
        "compare-submit": "Харьцуулах",
        "compare-invalid-title": "Өгсөн гарчиг буруу байна.",
        "compare-title-not-exists": "Өгсөн гарчиг байхгүй байна.",
-       "dberr-header": "Энэхүү викид асуудал үүсэв",
        "dberr-problems": "Уучлаарай! Энэхүү сайтад техникийн саатал учирч байна.",
        "dberr-again": "Хэдэн минут хүлээгээд дахин ачаалж үзнэ үү.",
        "dberr-info": "(өгөгдлийн сангийн серверт хандаж чадсангүй: $1)",
        "sqlite-has-fts": "$1 (бүх текстээрх хайлтыг дэмждэг)",
        "sqlite-no-fts": "$1 (бүх текстээрх хайлтыг дэмждэггүй)",
        "logentry-delete-delete": "$3 хуудсыг $1 устгасан",
-       "logentry-delete-restore": "$3 Ñ\85Ñ\83Ñ\83дÑ\81Ñ\8bг $1 Ñ\81Ñ\8dÑ\82гÑ\8dÑ\8dÑ\81Ñ\8dн",
+       "logentry-delete-restore": "$3 Ñ\85Ñ\83Ñ\83дÑ\81Ñ\8bг $1 Ñ\81Ñ\8dÑ\80гÑ\8dÑ\8dв",
        "revdelete-restricted": "системийн операторуудад тавигдсан хязгаарлалтууд",
        "revdelete-unrestricted": "системийн операторуудаас авч хаясан хязгаарлалтууд",
        "logentry-rights-rights": "$1 $3 дахь грүпийн гишүүнчлэлээ $4 ээс $5 руу шилжүүллээ",
index c1792eb..418cbb6 100644 (file)
@@ -41,7 +41,8 @@
                        "प्रणव कुलकर्णी",
                        "प्रतिमा",
                        "शࣿरीहरि",
-                       "संतोष दहिवळ"
+                       "संतोष दहिवळ",
+                       "아라"
                ]
        },
        "tog-underline": "दुव्यांचे अधोरेखन:",
@@ -54,7 +55,6 @@
        "tog-showtoolbar": "संपादन साधनपट्टी दाखवा",
        "tog-editondblclick": "दुबार-टिचकुन पान संपादित करा",
        "tog-editsectiononrightclick": "विभाग शीर्षकावर उजव्या क्लिकने टिचकुन संपादन करणे शक्य करा",
-       "tog-rememberpassword": "माझा सनोंदप्रवेश (लॉग-ईन) या न्याहाळकावर लक्षात ठेवा (जास्तीत जास्त $1 {{PLURAL:$1|दिवसासाठी|दिवसांसाठी}})",
        "tog-watchcreations": "मी तयार केलेली पाने आणि चढविलेल्या संचिका माझ्या निरीक्षणसूचीत टाका",
        "tog-watchdefault": "मी संपादित केलेली पाने आणि संचिका माझ्या निरीक्षणसूचीत टाका",
        "tog-watchmoves": "मी स्थानांतर केलेली पाने आणि संचिका माझ्या निरीक्षणसूचीत टाका",
        "permalink": "शाश्वत दुवा",
        "print": "छापा",
        "view": "दाखवा",
+       "view-foreign": "$1 वर पहा",
        "edit": "संपादन",
        "create": "तयार करा",
        "editthispage": "हे पृष्ठ संपादित करा",
        "readonly_lag": "मुख्य विदागार दात्याच्या (मास्टर डाटाबेस सर्व्हर) बरोबरीने पोहचण्यास पराधीन-विदागारदात्यास (स्लेव्ह सर्व्हर) वेळ लागल्यामुळे, विदागार आपोआप बंद झाला आहे.",
        "internalerror": "अंतर्गत त्रुटी",
        "internalerror_info": "अंतर्गत त्रुटी: $1",
-       "fileappenderrorread": "जोडणी-दरम्यान \"$1\" वाचता आले नाही.",
-       "fileappenderror": "\"$1\" व \"$2\"ला जोडता आले नाही.",
        "filecopyerror": "\"$1\" संचिकेची \"$2\" ही प्रत करता आली नाही.",
        "filerenameerror": "\"$1\" संचिकेचे \"$2\" असे नामांतर करता आले नाही.",
        "filedeleteerror": "\"$1\" संचिका वगळता आली नाही.",
        "directorycreateerror": "\"$1\" कार्यधारीका (डिरेक्टरी) तयार केली जाऊ शकली नाही.",
        "filenotfound": "\"$1\" ही संचिका सापडत नाही.",
-       "fileexistserror": "संचिका \"$1\" वर लिहीता आले नाही: संचिका अस्तित्वात आहे.",
        "unexpected": "अनपेक्षित मूल्य: \"$1\"=\"$2\"",
        "formerror": "त्रुटी: आवेदन सादर करता आले नाही.",
        "badarticleerror": "या पानावर ही कृती करता येत नाही.",
        "userlogin-resetpassword-link": "आपला परवलीचा शब्द विसरलात?",
        "userlogin-loggedin": "आपण पुर्वीच {{GENDER:$1|$1}} म्हणून सनोंद प्रवेशित आहात.वेगळ्या सदस्यनावाने सनोंद प्रवेशासाठी खालील आवेदन वापरा.",
        "userlogin-createanother": "दुसरे नवीन खाते तयार करा",
-       "createacct-join": "खाली आपली माहिती भरा",
-       "createacct-another-join": "नविन खात्याबाबतची माहिती येथे खाली टाका.",
        "createacct-emailrequired": "विपत्र पत्ता(ई-मेल)",
        "createacct-emailoptional": "विपत्र पत्ता(ई-मेल)(ऐच्छिक)",
        "createacct-email-ph": "आपला विपत्र पत्ता(ई-मेल) टाका",
        "savearticle": "हा लेख साठवा",
        "preview": "झलक",
        "showpreview": "झलक दाखवा",
-       "showlivepreview": "थेट झलक",
        "showdiff": "बदल दाखवा",
        "anoneditwarning": "'''इशारा:''' तुम्ही विकिपीडियाचे सदस्य म्हणून सनोंद-प्रवेश (लॉग-इन) केलेला नाही. या पानाच्या संपादन इतिहासात तुमचा अंकपत्ता (आयपी) नोंदला जाईल.",
        "anonpreviewwarning": "\"'''सावधान:''' तुम्ही विकिपीडियाचे सदस्य म्हणून सनोंद-प्रवेश (लॉग-इन) केलेला नाही. या पानाच्या संपादन इतिहासात तुमचा अंकपत्ता (आय.पी. ॲड्रेस) नोंदला जाईल.\"",
        "edit-gone-missing": "नविन पृष्ठ अद्यतन करता आले नाही. ते वगळले असण्याची शक्यता आहे.",
        "edit-conflict": "वादग्रस्त संपादन",
        "edit-no-change": "तुमचे संपादन दुर्लक्षित करण्यात आले आहे, कारण मजकूरात काहीही बदल झालेला नाही.",
-       "postedit-confirmation": "आपले संपादन जतन करण्यात आले आहे.",
+       "postedit-confirmation-saved": "आपले संपादन जतन करण्यात आले आहे.",
        "edit-already-exists": "नवीन पान तयार करता येऊ शकले नाही.\nया नावाचे पान पूर्वीच अस्तित्वात आहे.",
        "defaultmessagetext": "अविचल संदेश मजकूर",
        "content-failed-to-parse": "$2 चा आशय(कंटेंट) $1 साठी पार्स करण्यात असफलता - नमुना: $3",
        "search-nonefound": "दिलेल्या पृच्छेशी जुळणारे निकाल नाहीत.",
        "powersearch-legend": "प्रगत शोध",
        "powersearch-ns": "नामविश्वांमध्ये शोधा:",
-       "powersearch-redir": "पुनर्निर्देशनांची यादी करा",
        "powersearch-togglelabel": "तपासा:",
        "powersearch-toggleall": "सर्व",
        "powersearch-togglenone": "काहीही नाही",
        "prefs-advancedsearchoptions": "प्रगत पर्याय",
        "prefs-advancedwatchlist": "प्रगत पर्याय",
        "prefs-displayrc": "दर्शन पर्याय",
-       "prefs-displaysearchoptions": "दर्शन पर्याय",
        "prefs-displaywatchlist": "दर्शन पर्याय",
        "prefs-tokenwatchlist": "ओळखचिन्ह",
        "prefs-diffs": "फरक",
        "recentchanges-legend-newpage": "([[Special:NewPages|नविन पानांची यादी]] हेही पाहा)",
        "recentchanges-legend-plusminus": "(''±१२३'')",
        "rcnotefrom": "खाली <b>$2</b> पासूनचे ('''$1''' पर्यंत) बदल दाखविले आहेत.",
-       "rclistfrom": "$1 नंतर केले गेलेले बदल दाखवा.",
+       "rclistfrom": "$3 $2 नंतर केले गेलेले बदल दाखवा.",
        "rcshowhideminor": "छोटे बदल $1",
        "rcshowhideminor-show": "दाखवा",
        "rcshowhideminor-hide": "लपवा",
        "uploadstash-refresh": "संचिकांची यादी ताजीतवानी करा",
        "invalid-chunk-offset": "अग्राह्य चंक ऑफसेट",
        "img-auth-accessdenied": "पोहोच नाकारल्या गेली.",
-       "img-auth-nopathinfo": "मार्ग माहिती आढळली नाही.\nआपला सर्व्हर ही माहिती पोचवू शकत नाही.\nतो सीजीआय-आधारित व इमेज_ऑथला समर्थन न देऊ शकणारा असू शकतो.\nhttps://www.mediawiki.org/wiki/Manual:Image_Authorization कृपया हे पहा.",
+       "img-auth-nopathinfo": "मार्ग माहिती आढळली नाही.\nआपला सर्व्हर ही माहिती पोचवू शकत नाही.\nतो सीजीआय-आधारित व इमेज_ऑथला समर्थन न देऊ शकणारा असू शकतो.\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization कृपया हे पहा.",
        "img-auth-notindir": "मागितलेला मार्ग अपलोड निर्देशिकेकरीता जोडलेला नाही.",
        "img-auth-badtitle": "\"$1\" पासून वैध शीर्षक बनवण्यात अयशस्वी.",
        "img-auth-nologinnWL": "तुम्ही प्रवेश घेतलेला नाही व \"$1\" श्वेतयादीत नाही.",
        "watchlist-details": "पहाऱ्याच्या सूचीमधील {{PLURAL:$1|$1 पान|$1 पाने}}, यात चर्चा पाने मोजलेली नाहीत.",
        "wlheader-enotif": "विपत्र अधिसूचना सुविधा शक्य केली.",
        "wlheader-showupdated": "ती पाने, जी आपण दिलेल्या शेवटच्या भेटीनंतर बदललेली आहेत, '''ठळक''' दाखवली आहेत.",
-       "watchmethod-recent": "पहाऱ्यातील पानांकरिता अलीकडील बदलांचा तपास",
-       "watchmethod-list": "अलीकडील बदलांकरिता पहाऱ्यातील पानांचा तपास",
-       "watchlistcontains": "तुमचा $1 {{PLURAL:$1|पानावर|पानांवर}} पहारा आहे.",
-       "iteminvalidname": "'$1'या बाबीसाठी समस्या, अवैध नाव...",
        "wlshowlast": "मागील $1 तास $2 दिवस $3 पहा",
        "watchlist-options": "पहाऱ्याच्या सूचीचे पर्याय",
        "watching": "पहारा देत आहे...",
        "enotif_lastvisited": "तुमच्या शेवटच्या भेटीनंतरचे बदल बघण्यासाठी $1 पहा.",
        "enotif_lastdiff": "हा बदल पहाण्याकरिता $1 पहा.",
        "enotif_anon_editor": "अनामिक सदस्य $1",
-       "enotif_body": "प्रिय $WATCHINGUSERNAME,\n\n{{SITENAME}}या लेखनावाचे $PAGETITLE (या मथळ्याचे) पान $PAGEEDITOR ने $PAGEEDITDATE ( या तारखेस) $CHANGEDORCREATED तयार केले किंवा बदलले आहे. सध्याची आवृत्ती पाहण्यासाठी खालील दुव्यावर टिचकी मारा.\n$PAGETITLE_URL\n\n$NEWPAGE\n\nसंपादकाचा आढावा : $PAGESUMMARY $PAGEMINOREDIT\n\nया संपादकास संपर्क करा :\nविपत्र: $PAGEEDITOR_EMAIL\nविकि: $PAGEEDITOR_WIKI\n\nतुम्ही पानास भेट देत नाही तोपर्यंत,या पानावर पुढे होणाऱ्या कोणत्याही क्रियांची इतर कोणतीही वेगळी सूचना तुम्हाला देण्यात येणार नाही. तुमच्या निरीक्षणसूचीमध्ये असलेल्या पानांच्या सूचना-पताकांचे तुम्ही पुर्नयोजन करु शकता.\n\nतुमची मैत्रीपूर्ण {{SITENAME}} सूचना प्रणाली\n\n--\n\nतुमच्या निरीक्षणसूचीमध्ये पानांची मांडणावळ (कोंदण)तुम्ही बदलू शकता, त्यासाठी {{canonicalurl:{{#special:EditWatchlist}}}} या पानावर जा.\n\nहे पान तुमच्या निरीक्षणसूचीमधून काढून टाकण्यासाठी खालील दुव्यावर टिचकी मारा.\n$UNWATCHURL\n\nपुढील साहाय्य आणि प्रतिक्रिया:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "प्रिय $WATCHINGUSERNAME,\n\n{{SITENAME}}या लेखनावाचे $PAGETITLE (या मथळ्याचे) पान $PAGEEDITOR ने $PAGEEDITDATE ( या तारखेस) $CHANGEDORCREATED तयार केले किंवा बदलले आहे. सध्याची आवृत्ती पाहण्यासाठी खालील दुव्यावर टिचकी मारा.\n$PAGETITLE_URL\n\n$NEWPAGE\n\nसंपादकाचा आढावा : $PAGESUMMARY $PAGEMINOREDIT\n\nया संपादकास संपर्क करा :\nविपत्र: $PAGEEDITOR_EMAIL\nविकि: $PAGEEDITOR_WIKI\n\nतुम्ही पानास भेट देत नाही तोपर्यंत,या पानावर पुढे होणाऱ्या कोणत्याही क्रियांची इतर कोणतीही वेगळी सूचना तुम्हाला देण्यात येणार नाही. तुमच्या निरीक्षणसूचीमध्ये असलेल्या पानांच्या सूचना-पताकांचे तुम्ही पुर्नयोजन करु शकता.\n\nतुमची मैत्रीपूर्ण {{SITENAME}} सूचना प्रणाली\n\n--\n\nतुमच्या निरीक्षणसूचीमध्ये पानांची मांडणावळ (कोंदण)तुम्ही बदलू शकता, त्यासाठी {{canonicalurl:{{#special:EditWatchlist}}}} या पानावर जा.\n\nहे पान तुमच्या निरीक्षणसूचीमधून काढून टाकण्यासाठी खालील दुव्यावर टिचकी मारा.\n$UNWATCHURL\n\nपुढील साहाय्य आणि प्रतिक्रिया:\n$HELPPAGE",
        "created": "तयार केले",
        "changed": "बदलले",
        "deletepage": "पान वगळा",
        "blockip": "हा अंकपत्ता अडवा",
        "blockip-legend": "सदस्यास प्रतिबंध करा",
        "blockiptext": "एखाद्या विशिष्ट अंकपत्त्याची किंवा सदस्याची लिहिण्याची क्षमता प्रतिबंधित  करण्याकरिता खालील सारणी वापरा.\nहे केवळ उच्छेद टाळण्याच्याच दृष्टीने आणि [[{{MediaWiki:Policy-url}}|निती]]स अनुसरून केले पाहिजे.\nखाली विशिष्ट कारण भरा(उदाहरणार्थ,ज्या पानांवर उच्छेद माजवला गेला त्यांची उद्धरणे देऊन).",
-       "ipadressorusername": "अंकपत्ता किंवा सदस्यनाम:",
+       "ipaddressorusername": "अंकपत्ता किंवा सदस्यनाम:",
        "ipbexpiry": "समाप्ति:",
        "ipbreason": "कारण:",
        "ipbreason-dropdown": "*प्रतिबंधनाची सामान्य कारणे\n** चुकीची माहिती भरणे\n** पानांवरील मजकूर काढणे\n** बाह्यसंकेतस्थळाचे चिखलणी(स्पॅमींग) दुवे देणे\n** पानात अटरफटर/वेडगळ भरणे\n** धमकावणारे/उपद्रवी वर्तन\n** असंख्य खात्यांचा गैरवापर\n** अस्वीकार्य सदस्यनाम",
        "tooltip-undo": "\"उलटक्रिया\" हे संपादन उलटविते व संपादन खिडकी उघडते.\nत्यामुळे तुम्ही बदलांचा आढावा देऊ शकता.",
        "tooltip-preferences-save": "माझ्या पसंती जतन करा",
        "tooltip-summary": "त्रोटक सारांश लिहा",
-       "notacceptable": "विकि विदादाता तुमचा घेता वाचू शकेल अशा स्वरूपात(संरचनेत) विदा पुरवू शकत नाही.",
        "anonymous": "{{SITENAME}} वरील अनामिक {{PLURAL:$1|सदस्य|सदस्य}}",
        "siteuser": "<!--{{SITENAME}}-->मराठी विकिपीडियाचा सदस्य $1",
        "anonuser": "{{SITENAME}} वरील अनामी सदस्य $1",
        "newimages-summary": "हे विशेष पान शेवटी चढविलेल्या संचिका दर्शविते.",
        "newimages-legend": "गाळक",
        "newimages-label": "संचिकानाम (किंवा त्याचा भाग):",
-       "showhidebots": "(सांगकामे $1)",
        "noimages": "बघण्यासारखे येथे काही नाही.",
        "ilsubmit": "शोधा",
        "bydate": "तारखेनुसार",
        "size-kilobytes": "$1 कि.बा.",
        "size-megabytes": "$1 मे.बा.",
        "size-gigabytes": "$1 गि.बा.",
-       "livepreview-loading": "चढवत आहे…",
-       "livepreview-ready": "चढवत आहे… तयार!",
-       "livepreview-failed": "प्रत्यक्ष ताजी झलक अयश्स्वी! नेहमीची झलक पहा.",
-       "livepreview-error": "संपर्कात अयशस्वी: $1 \"$2\".नेहमीची झलक पहा.",
        "lag-warn-normal": "$1 {{PLURAL:$1|सेकंदाच्या|सेकंदांच्या}} आतले बदल या यादी नसण्याची शक्यता आहे.",
        "lag-warn-high": "विदा विदादात्यास लागणाऱ्या अत्युच्च कालावधी मुळे, $1 {{PLURAL:$1|सेकंदापेक्षा|सेकंदांपेक्षा}} नवे बदल या सूचित कदाचित दाखवले नाही जाणार.",
-       "watchlistedit-numitems": "चर्चा पाने सोडून, {{PLURAL:$1|1 शीर्षक पान|$1 शीर्षक पाने}} तुमच्या पहाऱ्याच्या सूचीमध्ये आहेत.",
-       "watchlistedit-noitems": "नित्य पहाण्याच्या सूचित कोणतेही शीर्षक पान नोंदलेले नाही.",
        "watchlistedit-normal-title": "पहाऱ्याची सूचीचे संपादन करा",
        "watchlistedit-normal-legend": "शीर्षकपाने नित्य पहाण्याच्या सूचीतून काढा",
        "watchlistedit-normal-explain": "तुमच्या पहार्‍याच्या सूचीतील अंतर्भूत नामावळी खाली निर्देशित केली आहे. शीर्षक वगळण्याकरिता, त्या पुढील खिडकी निवडा, आणि शीर्षक वगळावर टिचकी मारा. तुम्ही [[Special:EditWatchlist/raw|कच्ची यादी सुद्धा संपादित]] करू शकता.",
        "compare-invalid-title": "तुम्ही नमूद केलेले शीर्षक अग्राह्य आहे.",
        "compare-title-not-exists": "या नावाने काहीही अस्तित्वात नाही.",
        "compare-revision-not-exists": "आपण नमूद करत असलेली आवृत्ती अस्तित्वात नाही.",
-       "dberr-header": "या विकीत एक चूक आहे",
        "dberr-problems": "माफ करा, हे संकेतस्थळ सध्या तांत्रिक अडचणींना सामोरे जात आहे.",
        "dberr-again": "थोडा वेळ थांबून पुन्हा पहा.",
        "dberr-info": "( विदादाताशी संपर्क साधण्यात  असमर्थ : $1)",
index b63aec0..de5046f 100644 (file)
                        "SNN95",
                        "Yosri",
                        "Zamwan",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라",
+                       "Pizza1016"
                ]
        },
        "tog-underline": "Garis bawah pautan:",
        "tog-hideminor": "Sembunyikan suntingan kecil dalam laman perubahan terkini",
-       "tog-hidepatrolled": "Sorokkan suntingan yang telah dironda daripada senarai perubahan terkini",
+       "tog-hidepatrolled": "Sorokkan suntingan yang telah dironda daripada laman 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": "Perubahan kumpulan mengikut laman dalam perubahan terkini dan senarai pantau",
@@ -29,7 +31,6 @@
        "tog-showtoolbar": "Tunjukkan palang sunting (perlukan JavaScript)",
        "tog-editondblclick": "Dwiklik untuk sunting laman (JavaScript)",
        "tog-editsectiononrightclick": "Bolehkan penyuntingan bahagian dengan mengklik kanan pada tajuk bahagian",
-       "tog-rememberpassword": "Ingat log masuk saya di pelayar ini (tidak melebihi $1 {{PLURAL:$1|hari|hari}})",
        "tog-watchcreations": "Tambahkan laman yang saya buat dan fail yang saya muat naik ke dalam senarai pantau",
        "tog-watchdefault": "Tambahkan laman dan fail yang saya sunting ke dalam senarai pantau",
        "tog-watchmoves": "Tambahkan laman dan fail yang saya pindahkan ke dalam senarai pantau",
        "faq": "Soalan Lazim",
        "faqpage": "Project:Soalan Lazim",
        "vector-action-addsection": "Buka topik",
-       "vector-action-delete": "Hapuskan",
-       "vector-action-move": "Pindahkan",
-       "vector-action-protect": "Lindungi",
-       "vector-action-undelete": "Batal hapus",
+       "vector-action-delete": "Hapus",
+       "vector-action-move": "Pindah",
+       "vector-action-protect": "Lindung",
+       "vector-action-undelete": "Nyahhapus",
        "vector-action-unprotect": "Ubah perlindungan",
        "vector-view-create": "Cipta",
        "vector-view-edit": "Sunting",
        "printableversion": "Versi boleh cetak",
        "permalink": "Pautan kekal",
        "print": "Cetak",
-       "view": "Paparkan",
+       "view": "Lihat",
+       "view-foreign": "Lihat di $1",
        "edit": "Sunting",
+       "edit-local": "Sunting huraian tempatan",
        "create": "Cipta",
+       "create-local": "Tambahkan huraian tempatan",
        "editthispage": "Sunting laman ini",
        "create-this-page": "Cipta laman ini",
-       "delete": "Hapuskan",
+       "delete": "Hapus",
        "deletethispage": "Hapuskan laman ini",
-       "undeletethispage": "Nyahhapuskan halaman ini",
+       "undeletethispage": "Nyahhapuskan laman ini",
        "undelete_short": "Nyahhapus {{PLURAL:$1|satu suntingan|$1 suntingan}}",
-       "viewdeleted_short": "Papar {{PLURAL:$1|satu|$1}} suntingan dihapuskan",
+       "viewdeleted_short": "Lihat {{PLURAL:$1|satu|$1}} suntingan dihapuskan",
        "protect": "Lindung",
        "protect_change": "ubah",
        "protectthispage": "Lindungi laman ini",
        "unprotectthispage": "Ubah tahap perlindungan laman ini",
        "newpage": "Laman baru",
        "talkpage": "Bincangkan laman ini",
-       "talkpagelinktext": "Perbualan",
-       "specialpage": "Laman Khas",
+       "talkpagelinktext": "Perbincangan",
+       "specialpage": "Laman khas",
        "personaltools": "Alatan peribadi",
        "postcomment": "Bahagian baru",
        "articlepage": "Lihat laman kandungan",
        "viewhelppage": "Lihat laman bantuan",
        "categorypage": "Lihat laman kategori",
        "viewtalkpage": "Lihat perbincangan",
-       "otherlanguages": "Bahasa lain",
+       "otherlanguages": "Dalam bahasa lain",
        "redirectedfrom": "(Dilencongkan dari $1)",
        "redirectpagesub": "Laman lencongan",
        "lastmodifiedat": "Laman ini diubah buat kali terakhir pada $2, $1.",
        "jumptonavigation": "pandu arah",
        "jumptosearch": "cari",
        "view-pool-error": "Maaf, pelayan terlebih bebanan pada masa ini.\nTerlalu ramai pengguna cuba melihat laman ini.\nSila tunggu sebentar sebelum cuba mencapai laman ini lagi.\n\n$1",
+       "generic-pool-error": "Maaf, semua pelayan terlebih bebanan ketika ini.\n\nTerlalu ramai pengguna yang sedang cuba mengakses sumber ini.\n\nSila tunggu sebentar sebelum cuba mengakses sumber ini semula.",
        "pool-timeout": "Menunggu sebentar untuk dikunci",
        "pool-queuefull": "Giliran kolam telah penuh",
        "pool-errorunknown": "Ralat tak diketahui",
        "portal-url": "Project:Portal Masyarakat",
        "privacy": "Dasar privasi",
        "privacypage": "Project:Dasar privasi",
-       "badaccess": "Tidak dibenarkan",
+       "badaccess": "Ralat kebenaran",
        "badaccess-group0": "Anda tidak dibenarkan melaksanakan tindakan ini.",
-       "badaccess-groups": "Tindakan ini hanya boleh dilakukan oleh pengguna dari {{PLURAL:$2|kumpulan|kumpulan-kumpulan}} berikut: $1.",
+       "badaccess-groups": "Tindakan ini hanya boleh dilakukan oleh pengguna-pengguna dalam {{PLURAL:$2|kumpulan|kumpulan-kumpulan}} berikut: $1.",
        "versionrequired": "MediaWiki versi $1 diperlukan",
        "versionrequiredtext": "MediaWiki versi $1 diperlukan untuk menggunakan laman ini. Sila lihat [[Special:Version|laman versi]].",
        "ok": "OK",
        "feed-atom": "Atom",
        "feed-rss": "RSS",
        "red-link-title": "$1 (tidak wujud)",
-       "sort-descending": "Isih tertib menurun",
-       "sort-ascending": "Isih tertib menaik",
+       "sort-descending": "Menyusun secara menurun",
+       "sort-ascending": "Menyusun secara menaik",
        "nstab-main": "Laman",
        "nstab-user": "Laman pengguna",
        "nstab-media": "Laman media",
        "readonly_lag": "Pangkalan data telah dikunci secara automatik sementara semua pelayan pangkalan data diselaraskan.",
        "internalerror": "Ralat dalaman",
        "internalerror_info": "Ralat dalaman: $1",
-       "fileappenderrorread": "Tidak dapat membaca \"$1\" semasa tambah.",
-       "fileappenderror": "Tidak dapat menambah \"$1\" kepada \"$2\".",
        "filecopyerror": "Fail \"$1\" tidak dapat disalin ke \"$2\".",
        "filerenameerror": "Nama fail \"$1\" tidak dapat ditukarkan kepada \"$2\".",
        "filedeleteerror": "Fail \"$1\" tidak dapat dihapuskan.",
        "directorycreateerror": "Direktori \"$1\" gagal diciptakan.",
        "filenotfound": "Fail \"$1\" tidak dijumpai.",
-       "fileexistserror": "File \"$1\" tidak dapat ditulis: fail telah pun wujud",
        "unexpected": "Nilai tanpa diduga: \"$1\"=\"$2\".",
-       "formerror": "Ralat: borang tidak dapat dikirim.",
+       "formerror": "Ralat: Borang tidak dapat dikirim.",
        "badarticleerror": "Tindakan ini tidak boleh dilaksanakan pada laman ini.",
        "cannotdelete": "Laman atau fail $1 tidak dapat dihapuskan.\nIa mungkin telah pun dihapuskan oleh orang lain.",
        "cannotdelete-title": "Laman \"$1\" tidak dapat dihapuskan",
        "logout": "Log keluar",
        "userlogout": "Log keluar",
        "notloggedin": "Belum log masuk",
-       "userlogin-noaccount": "Belum buka akaun?",
+       "userlogin-noaccount": "Tidak mempunyai akaun?",
        "userlogin-joinproject": "Sertai {{SITENAME}}",
        "nologin": "Belum mempunyai akaun? '''$1'''.",
        "nologinlink": "Buka akaun baru",
        "userlogin-helplink2": "Bantuan untuk log masuk",
        "userlogin-loggedin": "Anda sudah log masuk sebagai {{GENDER:$1|$1}}. Gunakan borang di bawah untuk log masuk sebagai pengguna lain.",
        "userlogin-createanother": "Buka satu lagi akaun",
-       "createacct-join": "Isikan keterangan anda di bawah.",
-       "createacct-another-join": "Masukkan maklumat akaun baru di bawah.",
        "createacct-emailrequired": "Alamat e-mel",
        "createacct-emailoptional": "Alamat e-mel (pilihan)",
        "createacct-email-ph": "Isikan alamt e-mel anda",
        "savearticle": "Simpan",
        "preview": "Pralihat",
        "showpreview": "Paparkan pralihat",
-       "showlivepreview": "Pralihat langsung",
        "showdiff": "Lihat perubahan",
        "anoneditwarning": "'''Amaran:''' Anda tidak log masuk. Alamat IP anda akan direkodkan dalam sejarah suntingan laman ini.",
        "anonpreviewwarning": "''Anda belum log masuk. Jika anda menyimpan laman ini, alamat IP anda akan direkodkan dalam sejarah penyuntingan laman ini.''",
        "edit-gone-missing": "Laman tersebut telah dihapuskan dan tidak dapat dikemaskinikan.",
        "edit-conflict": "Percanggahan penyuntingan.",
        "edit-no-change": "Suntingan anda diabaikan kerana tiada perubahan dibuat pada teks tersebut.",
-       "postedit-confirmation": "Suntingan anda telah disimpan.",
+       "postedit-confirmation-created": "Halaman telah diwujudkan.",
+       "postedit-confirmation-restored": "Halaman telah dipulihkan.",
+       "postedit-confirmation-saved": "Suntingan anda telah disimpan.",
        "edit-already-exists": "Tidak dapat mencipta laman baru kerana ia telah wujud.",
        "defaultmessagetext": "Teks mesej asal",
        "content-failed-to-parse": "Kandungan $2 tidak dapat dihuraikan untuk model $1: $3",
        "expensive-parserfunction-warning": "Amaran: Laman ini mengandungi terlalu banyak panggilan fungsi penghurai yang intensif.\n\nHad panggilan ialah $2, sekarang terdapat $1 panggilan.",
        "expensive-parserfunction-category": "Laman yang mengandungi terlalu banyak panggilan fungsi penghurai yang intensif",
        "post-expand-template-inclusion-warning": "Amaran: Saiz penyertaan templat terlalu besar.\nSesetengah templat tidak akan disertakan.",
-       "post-expand-template-inclusion-category": "Laman-laman yang melebihi had saiz penyertaan templat",
+       "post-expand-template-inclusion-category": "Laman yang melebihi had saiz penyertaan templat",
        "post-expand-template-argument-warning": "Amaran: Laman ini mengandungi sekurang-kurangnya satu argumen templat yang mempunyai saiz pengembangan yang terlalu besar.\nArgumen-argumen ini telah ditinggalkan.",
        "post-expand-template-argument-category": "Laman yang mengandungi templat dengan argumen yang tidak lengkap",
        "parser-template-loop-warning": "Gelung templat dikesan: [[$1]]",
        "mergelog": "Log penggabungan",
        "pagemerge-logentry": "menggabungkan [[$1]] ke dalam [[$2]] (semakan sehingga $3)",
        "revertmerge": "Pisahkan",
-       "mergelogpagetext": "Yang berikut ialah senarai terkini bagi penggabungan sejarah sesebuah laman ke dalam lamana yang lain.",
+       "mergelogpagetext": "Yang berikut ialah senarai terkini bagi penggabungan sejarah sesebuah laman ke dalam laman yang lain.",
        "history-title": "Sejarah semakan bagi \"$1\"",
        "difference-title": "Perbezaan antara semakan-semakan \"$1\"",
        "difference-title-multipage": "Perbezaan antara laman \"$1\" dan \"$2\"",
        "search-nonefound": "Tiada hasil yang sepadan dengan pertanyaan.",
        "powersearch-legend": "Carian lanjutan",
        "powersearch-ns": "Cari dalam ruang nama:",
-       "powersearch-redir": "Termasuk lencongan",
        "powersearch-togglelabel": "Pilih:",
        "powersearch-toggleall": "Semua",
        "powersearch-togglenone": "Tiada",
        "prefs-emailconfirm-label": "Pengesahan e-mel:",
        "youremail": "E-mel:",
        "username": "{{GENDER:$1|Nama pengguna}}:",
-       "uid": "ID {{GENDER:$1|Pengguna}}:",
        "prefs-memberingroups": "{{GENDER:$2|Ahli}} {{PLURAL:$1|kumpulan|kumpulan-kumpulan}}:",
        "prefs-memberingroups-type": "$1",
        "prefs-registration": "Waktu pendaftaran:",
        "prefs-advancedsearchoptions": "Pilihan lanjutan",
        "prefs-advancedwatchlist": "Pilihan lanjutan",
        "prefs-displayrc": "Pilihan paparan",
-       "prefs-displaysearchoptions": "Pilihan paparan",
        "prefs-displaywatchlist": "Pilihan paparan",
        "prefs-diffs": "Beza",
        "prefs-help-prefershttps": "Keutamaan inu akan berkuatkuasa pada lain kali anda log masuk.",
        "action-createpage": "mencipta laman",
        "action-createtalk": "mencipta laman perbincangan",
        "action-createaccount": "mencipta akaun pengguna ini",
+       "action-history": "melihat sejarah halaman ini",
        "action-minoredit": "menanda suntingan ini sebagai suntingan kecil",
        "action-move": "memindahkan laman ini",
        "action-move-subpages": "memindahkan laman ini dan sublaman-sublamannya",
        "recentchanges-label-minor": "Ini ialah suntingan kecil",
        "recentchanges-label-bot": "Suntingan ini dilakukan oleh bot",
        "recentchanges-label-unpatrolled": "Suntingan ini belum dirondai",
-       "recentchanges-label-plusminus": "Saiz halaman telah berubah sebanyak jumlah bait ini",
+       "recentchanges-label-plusminus": "Saiz laman telah berubah sebanyak jumlah bait ini",
        "recentchanges-legend-heading": "'''Petunjuk:'''",
-       "recentchanges-legend-newpage": "(lihat juga [[Special:NewPages|senarai halaman baru]])",
+       "recentchanges-legend-newpage": "(lihat juga [[Special:NewPages|senarai laman baru]])",
        "rcnotefrom": "Yang berikut adalah semua suntingan sejak <b>$2</b> (yang dipaparkan sehingga <b>$1</b>).",
-       "rclistfrom": "Papar perubahan sejak $1",
+       "rclistfrom": "Paparkan perubahan sejak $3 $2",
        "rcshowhideminor": "$1 suntingan kecil",
        "rcshowhideminor-show": "Paparkan",
        "rcshowhideminor-hide": "Sorokkan",
        "uploadstash-refresh": "Segarkan semula senarai fail",
        "invalid-chunk-offset": "Ofset ketulan tidak sah",
        "img-auth-accessdenied": "Capaian ditolak",
-       "img-auth-nopathinfo": "PATH_INFO tertinggal.\nPelayan anda tidak ditetapkan untuk menyampaikan maklumat ini.\nIa barangkali berdasarkan CGI dan tidak boleh menyokong img_auth.\nRujuk https://www.mediawiki.org/wiki/Manual:Image_Authorization",
+       "img-auth-nopathinfo": "PATH_INFO tertinggal.\nPelayan anda tidak ditetapkan untuk menyampaikan maklumat ini.\nIa barangkali berdasarkan CGI dan tidak boleh menyokong img_auth.\nRujuk https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization",
        "img-auth-notindir": "Laluan yang diminta tiada dalam direktori muat naik yang telah dikonfigurasikan.",
        "img-auth-badtitle": "Tajuk yang sah tidak dapat dibina daripada \"$1\".",
        "img-auth-nologinnWL": "Anda belum log masuk dan \"$1\" tiada dalam senarai putih.",
        "unusedtemplateswlh": "pautan-pautan lain",
        "randompage": "Laman rawak",
        "randompage-nopages": "Tiada laman dalam {{PLURAL:$2|ruang|ruang-ruang}} nama berikut: $1.",
-       "randomincategory": "Halaman pilihan rawak dalam kategori",
+       "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.",
        "statistics-users-active": "Pengguna aktif",
        "statistics-users-active-desc": "Pengguna yang aktif sejak {{PLURAL:$1|semalam|$1 hari lalu}}",
        "statistics-mostpopular": "Laman dilihat terbanyak",
-       "pageswithprop": "Halaman dengan sifat halaman",
-       "pageswithprop-legend": "Halaman dengan sifat halaman",
+       "pageswithprop": "Laman dengan sifat laman",
+       "pageswithprop-legend": "Laman dengan sifat laman",
        "pageswithprop-text": "Halaman ini menyenaraikan halaman-halaman yang menggunakan sifat halaman yang tertentu.",
        "pageswithprop-prop": "Nama sifat:",
        "pageswithprop-submit": "Pergi",
        "pageswithprop-prophidden-binary": "nilai sifat binari tersorok ($1)",
        "doubleredirects": "Lencongan berganda",
        "doubleredirectstext": "Yang berikut ialah senarai laman yang melencong ke laman lencongan lain. Setiap baris mengandungi pautan ke laman lencongan pertama dan kedua, serta baris pertama bagi teks lencongan kedua, lazimnya merupakan laman sasaran \"sebenar\", yang sepatutnya ditujui oleh lencongan pertama.\nMasukan yang <del>dipotong</del> telah diselesaikan.",
-       "double-redirect-fixed-move": "[[$1]] dilencongkan ke [[$2]]",
-       "double-redirect-fixed-maintenance": "Membetulkan dwilecongan daripada [[$1]] kepada [[$2]].",
+       "double-redirect-fixed-move": "[[$1]] telah dipindahkan.\nIa dikemaskinikan secara automatik dan sekarang melencong ke [[$2]].",
+       "double-redirect-fixed-maintenance": "Membetulkan dwilecongan dari [[$1]] ke [[$2]] dalam kerja kemaskinian.",
        "double-redirect-fixer": "Pembaiki lencongan",
        "brokenredirects": "Lencongan rosak",
        "brokenredirectstext": "Lencongan-lencongan berikut menuju ke laman yang tidak wujud:",
        "mostlinkedtemplates": "Templat dipaut terbanyak",
        "mostcategories": "Rencana dengan kategori terbanyak",
        "mostimages": "Imej dipaut terbanyak",
-       "mostinterwikis": "Halaman yang paling banyak pautan antara wiki",
+       "mostinterwikis": "Laman yang paling banyak pautan interwiki",
        "mostrevisions": "Rencana dengan semakan terbanyak",
        "prefixindex": "Indeks awalan",
        "prefixindex-namespace": "Semua laman dengan awalan (ruang nama $1)",
        "log-title-wildcard": "Cari semua tajuk yang bermula dengan teks ini",
        "showhideselectedlogentries": "Tunjukkan/sorokkan entri-entri log yang terpilih",
        "allpages": "Semua laman",
-       "alphaindexline": "$1 hingga $2",
        "nextpage": "Halaman berikutnya ($1)",
        "prevpage": "Halaman sebelumnya ($1)",
        "allpagesfrom": "Tunjukkan laman bermula pada:",
        "cachedspecial-viewing-cached-ts": "Anda sedang melihat versi dalam cache laman ini yang mungkin tidak lengkap sepenuhnya.",
        "cachedspecial-refresh-now": "Lihat yang terkini.",
        "categories": "Kategori",
-       "categoriespagetext": "{{PLURAL:$1|Kategori|Kategori-kategori}} berikut mengandungi laman-laman atau media.\n[[Special:UnusedCategories|Kategori yang tidak digunakan]] tidak dipaparkan di sini.\nLihat juga [[Special:WantedCategories|kategori yang dikehendaki]].",
+       "categoriespagetext": "{{PLURAL:$1|Kategori|Kategori-kategori}} berikut mengandungi laman atau media.\n[[Special:UnusedCategories|Kategori yang tidak digunakan]] tidak dipaparkan di sini.\nLihat juga [[Special:WantedCategories|kategori yang dikehendaki]].",
        "categoriesfrom": "Paparkan kategori bermula daripada:",
        "special-categories-sort-count": "susun mengikut tertib bilangan",
        "special-categories-sort-abc": "susun mengikut tertib abjad",
        "listgrouprights-removegroup-self": "Keluar daripada {{PLURAL:$2|kumpulan|kumpulan-kumpulan}}: $1",
        "listgrouprights-addgroup-self-all": "Menyertai semua kumpulan",
        "listgrouprights-removegroup-self-all": "Keluar daripada semua kumpulan",
+       "listgrouprights-namespaceprotection-header": "Sekatan ruang nama",
+       "listgrouprights-namespaceprotection-namespace": "Ruang nama",
+       "trackingcategories": "Kategori penjejak",
+       "trackingcategories-msg": "Kategori penjejak",
+       "trackingcategories-name": "Nama pesanan",
+       "trackingcategories-nodesc": "Tiada keterangan tersedia.",
        "mailnologin": "Tiada alamat e-mel",
        "mailnologintext": "Anda perlu [[Special:UserLogin|log masuk]]\nterlebih dahulu dan mempunyai alamat e-mel yang sah dalam\n[[Special:Preferences|laman keutamaan]] untuk mengirim e-mel kepada pengguna lain.",
        "emailuser": "Kirim e-mel kepada pengguna ini",
        "unwatchthispage": "Berhenti memantau",
        "notanarticle": "Bukan laman kandungan",
        "notvisiblerev": "Semakan ini telah dihapuskan",
-       "watchlist-details": "$1 laman dipantau (tidak termasuk laman perbincangan).",
+       "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'''.",
-       "watchmethod-recent": "menyemak laman yang dipantau dalam suntingan-suntingan terkini",
-       "watchmethod-list": "menyemak suntingan terkini pada laman-laman yang dipantau",
-       "watchlistcontains": "Terdapat $1 laman dalam senarai pantau anda.",
-       "iteminvalidname": "Terdapat masalah dengan item '$1', nama tidak sah...",
        "wlnote2": "Yang berikut adalah perubahan dalam {{PLURAL:$1|sejam|<strong>$1</strong> jam}} yang lepas, setakat $2, $3.",
        "wlshowlast": "Tunjukkan $1 jam / $2 hari yang lalu / $3.",
        "watchlist-options": "Pilihan senarai pantau",
        "enotif_lastvisited": "Lihat $1 untuk semua perubahan sejak kunjungan terakhir anda.",
        "enotif_lastdiff": "Rujuk $1 untuk melihat perubahan ini.",
        "enotif_anon_editor": "pengguna tanpa nama $1",
-       "enotif_body": "$WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nRingkasan penyunting: $PAGESUMMARY $PAGEMINOREDIT\n\nHubungi penyunting:\nmel: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nTiada lagi pemberitahuan lanjut sekiranya terdapat kegiatan selanjutnya melainkan anda mengunjungi halaman berkenaan apabila log masuk. Anda juga boleh menetapkan semula tanda-tanda pemberitahuan untuk kesemua halaman dalam senarai pantau anda.\n\nSistem pemberitahuan {{SITENAME}} yang mesra\n\n--\nUntuk mengubah tetapan pemberitahuan melalui e-mel anda, kunjungi\n{{canonicalurl:{{#special:Preferences}}}}\n\nUntuk mengubah tetapan senarai pantau anda, kunjungi\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nUntuk menggugurkan halaman ini daripada senarai pantau anda, kunjungi\n$UNWATCHURL\n\nMaklum balas dan bantuan selanjutnya:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "$WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nRingkasan penyunting: $PAGESUMMARY $PAGEMINOREDIT\n\nHubungi penyunting:\nmel: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nTiada lagi pemberitahuan lanjut sekiranya terdapat kegiatan selanjutnya melainkan anda mengunjungi halaman berkenaan apabila log masuk. Anda juga boleh menetapkan semula tanda-tanda pemberitahuan untuk kesemua halaman dalam senarai pantau anda.\n\nSistem pemberitahuan {{SITENAME}} yang mesra\n\n--\nUntuk mengubah tetapan pemberitahuan melalui e-mel anda, kunjungi\n{{canonicalurl:{{#special:Preferences}}}}\n\nUntuk mengubah tetapan senarai pantau anda, kunjungi\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nUntuk menggugurkan halaman ini daripada senarai pantau anda, kunjungi\n$UNWATCHURL\n\nMaklum balas dan bantuan selanjutnya:\n$HELPPAGE",
        "created": "dicipta",
        "changed": "diubah",
        "deletepage": "Hapus laman",
        "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.",
-       "deleting-backlinks-warning": "'''Amaran:''' Terdapat halaman-halaman lain yang berpaut atau bertransklusi dengan halaman yang hendak anda hapus itu.",
+       "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",
        "rollbacklink": "undur",
        "protect-locked-blocked": "Anda telah disekat, justeru tidak boleh menukar peringkat perlindungan.\nIni adalah tetapan semasa bagi laman '''$1''':",
        "protect-locked-dblock": "Anda tidak boleh menukar peringkat perlindungan kerana pangkalan data sedang dikunci.\nIni adalah tetapan semasa bagi laman '''$1''':",
        "protect-locked-access": "Anda tidak mempunyai keizinan untuk menukar peringkat perlindungan.\nIni adalah tetapan semasa bagi laman '''$1''':",
-       "protect-cascadeon": "Laman ini dilindungi kerana ia terkandung dalam {{PLURAL:$1|laman|laman-laman}} berikut, yang dilindungi secara melata. Anda boleh menukar peringkat perlindunan laman ini, akan tetapi ia tidak akan menjejaskan perlindungan melata tersebut.",
+       "protect-cascadeon": "Laman ini dilindungi kerana ia terkandung dalam {{PLURAL:$1|laman|laman-laman}} berikut, yang dilindungi secara melata. Penukaran peringkat perlindungan laman ini tidak akan menjejaskan perlindungan melata tersebut.",
        "protect-default": "Benarkan semua pengguna",
        "protect-fallback": "Benarkan pengguna yang berizin \"$1\" sahaja",
        "protect-level-autoconfirmed": "Benarkan pengguna yang diautosahkan sahaja",
        "contributions-title": "Sumbangan oleh $1",
        "mycontris": "Sumbangan",
        "contribsub2": "Untuk {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "Akaun pengguna \"$1\" tidak berdaftar.",
        "nocontribs": "Tiada sebarang perubahan yang sepadan dengan kriteria-kriteria ini.",
        "uctop": "(terkini)",
        "month": "Sebelum bulan:",
        "sp-contributions-newbies": "Tunjukkan sumbangan daripada akaun baru sahaja",
        "sp-contributions-newbies-sub": "Bagi akaun-akaun baru",
        "sp-contributions-newbies-title": "Sumbangan oleh pengguna baru",
-       "sp-contributions-blocklog": "Log sekatan",
+       "sp-contributions-blocklog": "log sekatan",
        "sp-contributions-deleted": "sumbangan dihapuskan",
        "sp-contributions-uploads": "muat naik",
        "sp-contributions-logs": "log",
        "sp-contributions-search": "Cari sumbangan",
        "sp-contributions-username": "Alamat IP atau nama pengguna:",
        "sp-contributions-toponly": "Hanya paparkan suntingan yang merupakan semakan terkini",
+       "sp-contributions-newonly": "Hanya paparkan suntingan yang merupakan ciptaan laman",
        "sp-contributions-submit": "Cari",
        "whatlinkshere": "Pautan ke laman ini",
        "whatlinkshere-title": "Laman yang mengandungi pautan ke \"$1\"",
        "blockip": "Sekat pengguna",
        "blockip-legend": "Sekat pengguna",
        "blockiptext": "Gunakan borang di bawah untuk menyekat\npenyuntingan daripada alamat IP atau pengguna tertentu.\nTindakan ini perlu dilakukan untuk menentang vandalisme sahaja dan selaras\ndengan [[{{MediaWiki:Policy-url}}|dasar {{SITENAME}}]].\nSila masukkan sebab sekatan di bawah (umpamannya, sebutkan laman yang telah\ndirosakkan).",
-       "ipadressorusername": "Alamat IP atau nama pengguna:",
+       "ipaddressorusername": "Alamat IP atau nama pengguna:",
        "ipbexpiry": "Tamat:",
        "ipbreason": "Sebab:",
        "ipbreason-dropdown": "*Sebab lazim\n** Memasukkan maklumat palsu\n** Membuang kandungan daripada laman\n** Memasukkan pautan spam ke tapak web luar\n** Memasukkan karut-marut ke dalam laman\n** Mengugut/mengganggu pengguna lain\n** Menyalahgunakan berbilang akaun\n** Nama pengguna yang tidak sesuai",
        "monobook.css": "/* CSS yang terletak di sini akan mempengaruhi pengguna kulit Monobook */",
        "modern.css": "/* CSS yang terletak di sini akan mempengaruhi pengguna kulit Moden */",
        "vector.css": "/* CSS yang terletak di sini akan mempengaruhi pengguna kulit Vector */",
-       "notacceptable": "Pelayan wiki ini tidak mampu menyediakan data dalam format yang boleh dibaca oleh pelanggan anda.",
        "anonymous": "{{PLURAL:$1|Pengguna|Pengguna-pengguna}} {{SITENAME}} tanpa nama",
        "siteuser": "Pengguna {{SITENAME}}, $1",
        "anonuser": "Pengguna {{SITENAME}} tanpa nama $1",
        "pageinfo-hidden-categories": "Kategori tersembunyi ($1)",
        "pageinfo-templates": "Templat tertransklusi ($1)",
        "pageinfo-transclusions": "{{PLURAL:$1|Halaman|Halaman-halaman}} yang tertransklusi pada ($1)",
-       "pageinfo-toolboxlink": "Maklumat halaman",
+       "pageinfo-toolboxlink": "Maklumat laman",
        "pageinfo-redirectsto": "Melencong ke",
        "pageinfo-redirectsto-info": "maklumat",
        "pageinfo-contentpage": "Dikira sebagai halaman kandungan",
        "newimages-summary": "Laman khas ini memaparkan senarai fail muat naik terakhir.",
        "newimages-legend": "Penapis",
        "newimages-label": "Nama fail (atau sebahagian daripadanya):",
-       "showhidebots": "($1 bot)",
        "noimages": "Tiada imej.",
        "ilsubmit": "Cari",
        "bydate": "mengikut tarikh",
        "autosumm-replace": "Mengganti laman dengan '$1'",
        "autoredircomment": "Melencong ke [[$1]]",
        "autosumm-new": "Mencipta laman baru dengan kandungan '$1'",
-       "livepreview-loading": "Memuatkan...",
-       "livepreview-ready": "Memuat … Sedia!",
-       "livepreview-failed": "Pralihat langsung gagal! Sila gunakan pralihat biasa.",
-       "livepreview-error": "Gagal membuat sambungan: $1 \"$2\". Sila gunakan pralihat biasa.",
        "lag-warn-normal": "Sebarang perubahan baru yang melebihi $1 saat mungkin tidak ditunjukkan dalam senarai ini.",
        "lag-warn-high": "Disebabkan oleh kelambatan pelayan pangkalan data, sebarang perubahan baru yang melebihi $1 saat mungkin tidak ditunjukkan dalam senarai ini.",
-       "watchlistedit-numitems": "Senarai pantau anda mengandungi $1 tajuk (tidak termasuk laman perbincangan).",
-       "watchlistedit-noitems": "Tiada tajuk dalam senarai pantau anda.",
        "watchlistedit-normal-title": "Sunting senarai pantau",
        "watchlistedit-normal-legend": "Buang tajuk-tajuk ini dari senarai pantau",
        "watchlistedit-normal-explain": "Tajuk-tajuk dalam senarai pantau anda ditunjukkan di bawah.\nUntuk membuang mana-mana tajuk, tanda kotak yang terletak di sebelahnya, dan klik \"Buang Tajuk\". Anda juga boleh [[Special:EditWatchlist/raw|menyunting senarai mentah]].",
        "compare-invalid-title": "Tajuk yang anda nyatakan tidak sah.",
        "compare-title-not-exists": "Tajuk yang anda nyatakan tidak wujud.",
        "compare-revision-not-exists": "Semakan yang anda nyatakan tidak wujud.",
-       "dberr-header": "Wiki ini dilanda masalah",
        "dberr-problems": "Harap maaf. Tapak web ini dilanda masalah teknikal.",
        "dberr-again": "Cuba tunggu selama beberapa minit dan muat semula.",
        "dberr-info": "(Tidak dapat menghubungi pelayan pangkalan data: $1)",
        "htmlform-chosen-placeholder": "Pilih satu pilihan",
        "sqlite-has-fts": "$1 dengan sokongan carian teks penuh",
        "sqlite-no-fts": "$1 tanpa sokongan carian teks penuh",
-       "logentry-delete-delete": "$1 telah {{GENDER:$2|menghapuskan}} halaman $3",
-       "logentry-delete-restore": "$1 telah {{GENDER:$2|memulihkan}} halaman $3",
+       "logentry-delete-delete": "$1 telah {{GENDER:$2|menghapuskan}} laman $3",
+       "logentry-delete-restore": "$1 telah {{GENDER:$2|memulihkan}} laman $3",
        "logentry-delete-event": "$1 telah {{GENDER:$2|mengubah}} keterlihatan $5 peristiwa log di $3: $4",
        "logentry-delete-revision": "$1 telah {{GENDER:$2|mengubah}} keterlihatan $5 semakan di halaman $3: $4",
        "logentry-delete-event-legacy": "$1 telah {{GENDER:$2|mengubah}} keterlihatan peristiwa log di $3",
        "revdelete-uname-unhid": "nama pengguna terdedah",
        "revdelete-restricted": "mengenakan sekatan pada penyelia",
        "revdelete-unrestricted": "menarik sekatan daripada penyelia",
-       "logentry-move-move": "$1 telah {{GENDER:$2|memindahkan}} halaman $3 ke $4",
-       "logentry-move-move-noredirect": "$1 telah {{GENDER:$2|memindahkan}} halaman $3 ke $4 tanpa meninggalkan lencongan",
-       "logentry-move-move_redir": "$1 telah {{GENDER:$2|memindahkan}} halaman $3 ke $4 melalui lencongan",
-       "logentry-move-move_redir-noredirect": "$1 telah {{GENDER:$2|memindahkan}} halaman $3 ke $4 melalui lencongan tanpa meninggalkan lencongan",
+       "logentry-move-move": "$1 telah {{GENDER:$2|memindahkan}} laman $3 ke $4",
+       "logentry-move-move-noredirect": "$1 telah {{GENDER:$2|memindahkan}} laman $3 ke $4 tanpa meninggalkan lencongan",
+       "logentry-move-move_redir": "$1 telah {{GENDER:$2|memindahkan}} laman $3 ke $4 melalui lencongan",
+       "logentry-move-move_redir-noredirect": "$1 telah {{GENDER:$2|memindahkan}} laman $3 ke $4 melalui lencongan tanpa meninggalkan lencongan",
        "logentry-patrol-patrol": "$1 telah {{GENDER:$2|menanda}} semakan $4 di halaman $3 sebagai dironda",
        "logentry-patrol-patrol-auto": "$1 telah {{GENDER:$2|menanda}} semakan $4 di halaman $3 sebagai dironda secara automatik",
        "logentry-newusers-newusers": "Akaun pengguna $1 telah {{GENDER:$2|dibuka}}",
index 6a4aa18..328e7c2 100644 (file)
@@ -6,7 +6,9 @@
                        "Kaganer",
                        "Malafaya",
                        "Roderick Mallia",
-                       "Urhixidur"
+                       "Urhixidur",
+                       "아라",
+                       "CharlieTheCabbie"
                ]
        },
        "tog-underline": "Ħoloq sottolinjati:",
        "tog-hidepatrolled": "Aħbi l-modifiki verifikati fit-tibdil riċenti",
        "tog-newpageshidepatrolled": "Aħbi l-paġni verifikati mil-lista tal-paġni l-ġodda",
        "tog-extendwatchlist": "Espandi l-lista ta' osservazzjoni biex turi t-tibdil kollu, u mhux biss dak riċenti",
-       "tog-usenewrc": "Iġbor il-modifiki skont il-paġna fit-tibdil riċenti u fil-lista ta' osservazzjonijiet (bżonn tal-Javascript)",
+       "tog-usenewrc": "Iġbor il-tibdil skont paġna fil-tibdil riċenti u lista' ta paġni osservati",
        "tog-numberheadings": "Numerazzjoni awtomatika tat-titli tas-sezzjonijiet",
-       "tog-showtoolbar": "Uri l-kolonna tal-għodda għall-immodifikar (bżonn tal-JavaScript)",
+       "tog-showtoolbar": "Uri tal-għodda għall-modifikar il-paġni",
        "tog-editondblclick": "Immodifika l-paġni permezz ta' klikk doppju (bżonn tal-JavaScript)",
        "tog-editsectiononrightclick": "L-immodifikar ta' sezzjonijiet bi klikk lemini fuq it-titli tas-sezzjonijiet (bżonn tal-JavaScript)",
-       "tog-rememberpassword": "Ftakar il-login tiegħi fuq dan il-browżer (għal massimu ta' {{PLURAL:$1|ġurnata|$1 ġurnata}})",
        "tog-watchcreations": "Żid il-paġni li noħloq u l-fajls li ntella' fil-lista ta' osservazzjoni tiegħi",
        "tog-watchdefault": "Żid il-paġni u l-fajls li nimmodifika fil-lista ta' osservazzjoni personali",
        "tog-watchmoves": "Żid il-paġni u fajls li mmexxi fil-lista ta' osservazzjoni tiegħi",
@@ -34,7 +35,7 @@
        "tog-shownumberswatching": "Uri n-numru ta' utenti li qegħdin isegwu din il-paġna",
        "tog-oldsig": "Firma attwali:",
        "tog-fancysig": "Interpreta l-firma bħala test tal-wiki (mingħajr ħolqa awtomatika)",
-       "tog-uselivepreview": "Attiva l-funzjoni ''Live preview'' (bżonn tal-JavaScript; sperimentali)",
+       "tog-uselivepreview": "Attiva l-funzjoni ''Previżjoni jgħixu'' (bżonn tal-JavaScript; sperimentali)",
        "tog-forceeditsummary": "Nebbaħni meta ndaħħal taqsira tal-modifika vojta",
        "tog-watchlisthideown": "Aħbi l-modifiki tiegħi mil-lista ta' osservazzjoni",
        "tog-watchlisthidebots": "Aħbi l-modifiki tal-bots mil-lista ta' osservazzjoni",
@@ -50,7 +51,7 @@
        "tog-prefershttps": "Dejjem uża l-konnessjoni sigura meta tidħol fil-kont",
        "underline-always": "Dejjem",
        "underline-never": "Qatt",
-       "underline-default": "Żomm l-issettjar tal-browser",
+       "underline-default": "Jżommu tieghek l-issettjar għal tal-browser jew tas-ġilda",
        "editfont-style": "Stil tat-tipa tal-kaxxa tal-editjar:",
        "editfont-default": "Żomm l-issettjar tal-browser",
        "editfont-monospace": "Tipa monospazja",
        "newwindow": "(tinfetaħ f'tieqa ġdida)",
        "cancel": "Annulla",
        "moredotdotdot": "Aktar...",
-       "morenotlisted": "Oħrajn mhux imniżżla...",
+       "morenotlisted": "Oħrajn mhux imniżżla.",
        "mypage": "Paġna",
        "mytalk": "Diskussjoni",
        "anontalk": "Diskussjoni għal dan l-IP",
        "permalink": "Ħolqa permanenti",
        "print": "Ipprintja",
        "view": "Dehra",
+       "view-foreign": "Tara fuq $1",
        "edit": "Editja",
+       "edit-local": "Timmodifika deskrizzjoni lokali",
        "create": "Oħloq",
+       "create-local": "Żid deskrizzjoni lokali",
        "editthispage": "Immodifika din il-paġna",
        "create-this-page": "Oħloq din il-paġna",
        "delete": "Ħassar",
        "readonly_lag": "Id-databażi ġiet awtomatikament magħluqa sakemm id-databażi inferjuri tas-server jilħqu ma' dak superjuri",
        "internalerror": "Problema interna",
        "internalerror_info": "Problema interna: $1",
-       "fileappenderrorread": "Ma setax jinqara \"$1\" waqt it-tehmiża.",
-       "fileappenderror": "Ma setax jiġi mehmuż \"$1\" ma' \"$2\".",
        "filecopyerror": "Ma setax jiġi kkuppjat il-fajl \"$1\" f' \"$2\".",
        "filerenameerror": "Il-fajl \"$1\" ma setax jiġi msemmi mill-ġdid għal \"$2\".",
        "filedeleteerror": "Il-fajl \"$1\" ma setax jiġi mħassar.",
        "directorycreateerror": "Id-direttorju \"$1\" ma setax jiġi maħluq.",
        "filenotfound": "Il-fajl \"$1\" ma nstabx.",
-       "fileexistserror": "Il-fajl \"$1\" ma setax jiġi miktub: fajl diġà jeżisti",
        "unexpected": "Valur mhux mistenni: \"$1\"=\"$2\".",
        "formerror": "Problema: il-formula ma setgħatx tiġi proċessata",
        "badarticleerror": "Din l-azzjoni ma setgħetx isseħħ fuq din il-paġna.",
        "gotaccountlink": "Idħol",
        "userlogin-resetlink": "Insejt kif tidħol fil-kont tiegħek?",
        "userlogin-resetpassword-link": "Irrisettja l-password",
-       "createacct-join": "Daħħal l-informazzjoni tiegħek hawn taħt.",
        "createacct-emailrequired": "Indirizz elettroniku",
        "createacct-emailoptional": "Indirizz elettroniku (fakultattiv)",
        "createacct-email-ph": "Daħħal l-indirizz elettroniku tiegħek",
        "savearticle": "Salva l-paġna",
        "preview": "Dehra proviżorja",
        "showpreview": "Dehra proviżorja",
-       "showlivepreview": "Funzjoni ''Live preview''",
        "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.",
        "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.''",
        "permissionserrorstext": "Inti m'għandhekx dritt li tagħmel hekk, għar-{{PLURAL:$1|raġuni|raġunijiet}} segwenti:",
        "permissionserrorstext-withaction": "M'għandekx il-permessi neċessarji biex $2, minħabba r-{{PLURAL:$1|raġuni|raġunijiet}} segwenti:",
        "recreate-moveddeleted-warn": "'''Twissija: Inti qiegħed toħloq mill-ġdid paġna li ġiet imħassra.'''\n\nAċċerta ruħek jekk huwiex opportun li tkompli timmodifika din il-paġna.\nIr-reġistru tat-tħassir u tal-mixi huwa pprovdut għal aktar konvenjenza:",
-       "moveddeleted-notice": "Din il-paġna ġiet imħassra. Ir-reġistri tat-tħassir u tal-mixi għal din il-paġna huma provduti hawn taħt bħala referenza.",
+       "moveddeleted-notice": "Din il-paġna ġiet imħassra. \nIr-reġistri tat-tħassir u jimxu għal din il-paġna huma provduti hawn taħt bħala referenza.",
        "log-fulllog": "Uri r-reġistru sħiħ",
        "edit-hook-aborted": "Il-modifika ġiet abbandunata mill-''hook''.\nMa ngħatat l-ebda spjegazzjoni.",
        "edit-gone-missing": "Il-paġna ma tistax tiġi aġġornata.\nJidher li din ġiet imħassra.",
        "edit-conflict": "Kunflitt tal-editjar.",
        "edit-no-change": "Il-modifika li għamilt ġiet injorata, minħabba li ebda bidla ma saret lejn it-test.",
-       "postedit-confirmation": "Il-modifika tiegħek ġiet salvata.",
+       "postedit-confirmation-saved": "Il-modifika tiegħek ġiet salvata.",
        "edit-already-exists": "Ma tistax tinħoloq din il-paġna.\nDin teżisti diġà.",
        "editwarning-warning": "Jekk tħalli din il-paġna jista' jwassal sabiex titlef kwalunkwe tibdil li tkun għamilt. Jekk int tinsab fil-kont tiegħek, tista' tneħħi dan l-avviż fis-sezzjoni \"Modifiki\" tal-preferenzi tiegħek.",
        "content-model-wikitext": "test tal-wiki",
        "searchmenu-exists": "'''Hemm paġna bl-isem ta' \"[[:$1]]\" fuq din il-wiki'''",
        "searchmenu-new": "'''Oħloq il-paġna \"[[:$1]]\" fuq din il-wiki!'''",
        "searchprofile-articles": "Paġni ta' kontenut",
-       "searchprofile-project": "Paġni ta' għajnuna u ta' proġett",
        "searchprofile-images": "Multimedja",
        "searchprofile-everything": "Kollox",
        "searchprofile-advanced": "Avvanzata",
        "searchprofile-articles-tooltip": "Fittex f'$1",
-       "searchprofile-project-tooltip": "Fittex f'$1",
        "searchprofile-images-tooltip": "Fittex għal fajls",
        "searchprofile-everything-tooltip": "Fittex kullimkien (inklużi l-paġni ta' diskussjoni)",
        "searchprofile-advanced-tooltip": "Fittex fi spazji tal-isem personalizzati",
        "search-nonefound": "It-tfittxija ma tat l-ebda riżultat.",
        "powersearch-legend": "Tfittxija avvanzata",
        "powersearch-ns": "Fittex fl-ispazju tal-isem:",
-       "powersearch-redir": "Uri r-rindirizzi",
        "powersearch-togglelabel": "Agħżel:",
        "powersearch-toggleall": "Kollha",
        "powersearch-togglenone": "Ebda",
        "prefs-emailconfirm-label": "Konferma tal-ittra-e:",
        "youremail": "E-mail:",
        "username": "{{GENDER:$1|Isem tal-utent}}:",
-       "uid": "{{GENDER:$1|ID tal-utent}}:",
        "prefs-memberingroups": "{{GENDER:$2|Membru}} tal-{{PLURAL:$1|grupp|gruppi}}:",
        "prefs-memberingroups-type": "$1",
        "prefs-registration": "Ħin ta' reġistrazzjoni:",
        "prefs-advancedsearchoptions": "Opzjonijiet avvanzati",
        "prefs-advancedwatchlist": "Opzjonijiet avvanzati",
        "prefs-displayrc": "Opzjonijiet ta' viżwalizazzjoni",
-       "prefs-displaysearchoptions": "Opzjonijiet ta' viżwalizazzjoni",
        "prefs-displaywatchlist": "Opzjonijiet ta' viżwalizazzjoni",
        "prefs-diffs": "Differenzi",
        "email-address-validity-valid": "L-indirizz elettroniku jidher validu",
        "recentchanges-label-plusminus": "Id-daqs tal-paġna nbidel b'dan in-numru ta' bytes",
        "recentchanges-legend-newpage": "(ara wkoll il-[[Special:NewPages|lista tal-paġni l-ġodda]])",
        "rcnotefrom": "Ħawn taħt jinsabu l-modifiki minn '''$2''' (sa '''$1''').",
-       "rclistfrom": "Uri l-modifiki ġodda jibdew minn $1",
+       "rclistfrom": "Uri l-modifiki ġodda jibdew minn $3 $2",
        "rcshowhideminor": "$1 modifiki żgħar",
        "rcshowhidebots": "$1 bot",
        "rcshowhideliu": "Utenti reġistrati: $1",
        "uploadstash-errclear": "It-tħassir tal-fajls ma rnexxiex.",
        "uploadstash-refresh": "Erġa' ġedded il-lista tal-fajls",
        "img-auth-accessdenied": "Aċċess miċħud",
-       "img-auth-nopathinfo": "PATH_INFO nieqes.\nIs-server tiegħek mhuwiex issettjat sabiex jgħaddi din l-informazzjoni.\nJista' jkun li huwa bbażat fuq CGI u ma jistax isostni img_auth.\nŻur https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "PATH_INFO nieqes.\nIs-server tiegħek mhuwiex issettjat sabiex jgħaddi din l-informazzjoni.\nJista' jkun li huwa bbażat fuq CGI u ma jistax isostni img_auth.\nŻur https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Id-destinazzjoni rikjesta mhijiex fid-direttorju tat-tlugħ konfigurat.",
        "img-auth-badtitle": "Ma setax jinbena titlu validu minn \"$1\".",
        "img-auth-nologinnWL": "M'intix fil-kont tiegħek u \"$1\" mhuwiex fil-lista l-bajda.",
        "log-title-wildcard": "Tfittxija ta' titli li jibdew b'dan it-test",
        "showhideselectedlogentries": "Uri/aħbi d-daħliet magħżula tar-reġistru",
        "allpages": "Il-paġni kollha",
-       "alphaindexline": "minn $1 sa $2",
        "nextpage": "Il-paġna li jmiss ($1)",
        "prevpage": "Il-paġna ta' qabel ($1)",
        "allpagesfrom": "Uri l-paġni li jibdew minn:",
        "usermessage-summary": "Messaġġ tas-sistema",
        "usermessage-editor": "Messaġġier tas-sistema",
        "watchlist": "Lista ta' osservazzjoni tiegħi",
-       "mywatchlist": "Lista ta' osservazzjonijiet",
+       "mywatchlist": "Lista ta' paġni osservati",
        "watchlistfor2": "Tal-utent $1 $2",
        "nowatchlist": "Il-lista ta' osservazzjoni tiegħek hija vojta.",
        "watchlistanontext": "Sabiex tara u timmodifika l-lista ta' osservazzjoni tiegħek, hemm bżonn li $1.",
        "watchlist-details": "Il-lista ta' osservazzjoni fiha {{PLURAL:$1|paġna waħda (u l-paġna ta' diskussjoni tagħha)|$1 paġni (u l-paġni ta' diskussjoni tagħhom)}}.",
        "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'''",
-       "watchmethod-recent": "Kontroll ta' modifiki riċenti għall-osservati speċjali.",
-       "watchmethod-list": "Kontroll tal-osservati speċjali għal modifiki riċenti",
-       "watchlistcontains": "Il-lista ta' osservazzjoni fiha {{PLURAL:$1|paġna|$1 paġni}}.",
-       "iteminvalidname": "Problema bil-paġna'$1', l-isem mhux validu...",
        "wlshowlast": "Uri l-aħħar $1 siegħat $2 ġranet $3",
        "watchlist-options": "Opzjonijiet tal-lista ta' osservazzjoni",
        "watching": "Imsegwi...",
        "enotif_lastvisited": "Ara $1 għal modifiki kollha mill-aħħar żjara.",
        "enotif_lastdiff": "Ara $1 biex tara din l-modifika.",
        "enotif_anon_editor": "utent anonimu $1",
-       "enotif_body": "Għażiż/a $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nTaqsira tal-editur: $PAGESUMMARY $PAGEMINOREDIT\n\nIkkuntatja lill-editur:\nittre: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nMhux se jkun hemm iktar notifiki oħra f'każ ta' aktar modifiki sakemm ma żżurx din il-paġna. Huwa possibbli li tippersonalizza s-sistema ta' notifikazzjoni għall-paġni kollha fil-lista ta' osservazzjoni tiegħek.\n\nIs-sistema ta' notifika ta' {{SITENAME}}\n\n--\nBiex tbiddel it-tqegħid tan-notifiki permezz tal-posta elettronika, żur\n{{canonicalurl:{{#special:Preferences}}}}\n\nBiex tbiddel t-tqegħid tal-lista ta' osservazzjonijiet, żur\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nBiex tħassar il-paġna minn fuq il-lista ta' osservazzjonijiet, żur\n$UNWATCHURL\n\nBiex tgħaddi kumment u biex tikseb iktar għajnuna:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Għażiż/a $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nTaqsira tal-editur: $PAGESUMMARY $PAGEMINOREDIT\n\nIkkuntatja lill-editur:\nittre: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nMhux se jkun hemm iktar notifiki oħra f'każ ta' aktar modifiki sakemm ma żżurx din il-paġna. Huwa possibbli li tippersonalizza s-sistema ta' notifikazzjoni għall-paġni kollha fil-lista ta' osservazzjoni tiegħek.\n\nIs-sistema ta' notifika ta' {{SITENAME}}\n\n--\nBiex tbiddel it-tqegħid tan-notifiki permezz tal-posta elettronika, żur\n{{canonicalurl:{{#special:Preferences}}}}\n\nBiex tbiddel t-tqegħid tal-lista ta' osservazzjonijiet, żur\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nBiex tħassar il-paġna minn fuq il-lista ta' osservazzjonijiet, żur\n$UNWATCHURL\n\nBiex tgħaddi kumment u biex tikseb iktar għajnuna:\n$HELPPAGE",
        "created": "inħolqot",
        "changed": "modifikata",
        "deletepage": "Ħassar il-paġna",
        "namespace_association": "Spazju tal-isem assoċjat",
        "tooltip-namespace_association": "Agħżel din il-kaxxa sabiex tinkludi l-paġna ta' diskussjoni jew l-oġġett tal-ispazju tal-isem assoċjat mal-ispazju tal-isem magħżul",
        "blanknamespace": "(Prinċipali)",
-       "contributions": "Kontribuzzjonijiet tal-{{GENDER:$1|utent}}",
+       "contributions": "Kontributi tal-{{GENDER:$1|utent}}",
        "contributions-title": "Kontribuzzjonijiet tal-utent għal $1",
-       "mycontris": "Kontribuzzjonijiet",
+       "mycontris": "Kontributi",
        "contribsub2": "Għal $1 ($2)",
        "nocontribs": "L-Ebda modifiki li jisodisfa l-kriterji tat-tfittxija.",
        "uctop": "(l-aħħar fil-paġna)",
        "blockip": "Imblokka lil utent",
        "blockip-legend": "Imblokka 'l-utent",
        "blockiptext": "Uża l-formola t'hawn taħt sabiex biex tibblokkja l-aċċess tal-kitba lil IP speċifiku jew utent.\nIl-blokk irid ikun użat biss sabiex jitnaqqas iċ-ċans ta' vandaliżmu, u għandu josservja b'mod strett il-[[{{MediaWiki:Policy-url}}|politika ta' {{SITENAME}}]].\nIndika r-raġuni speċifika għalfejn tixtieq tipproċedi bil-blokk (per eżempju, billi turi l-paġni partikolari li ġew ivvandalizzati).",
-       "ipadressorusername": "Indirizz tal-IP jew isem tal-utent:",
+       "ipaddressorusername": "Indirizz tal-IP jew isem tal-utent:",
        "ipbexpiry": "Skadenza tal-imblokk:",
        "ipbreason": "Raġuni:",
        "ipbreason-dropdown": "*Raġunijiet komuni dwar blokki\n** Iddaħħal informazzjoni falza\n** Tneħħi kontenut mill-paġni\n** Links kummerċjali ma' siti esterni\n** Iddaħal kontenut bla sens\n** Komportament intimidanti jew molestiku\n** Abbuż minn aktar minn kont wieħed\n** isem ta' utent mhux aċċettabli",
        "tooltip-preferences-save": "Salva l-preferenzi",
        "tooltip-summary": "Daħħal taqsira żgħira",
        "common.css": "/* CSS li tpoġġa hawnhekk irrid jiġi applikat fl-iskins kollha */",
-       "cologneblue.css": "/* CSS li tpoġġa hawnhekk se jaffetwa dawk l-utenti li jagħmlu użu mill-aspett grafiku Cologne Blue */",
        "monobook.css": "/* CSS li tpoġġa hawnhekk se jaffetwa dawk l-utenti li jagħmlu użu mill-iskin ''Monobook'' */",
-       "modern.css": "/* CSS li tpoġġa hawnhekk se jaffetwa dawk l-utenti li jagħmlu użu mill-aspett grafiku Modern */",
        "common.js": "/* Kull ''JavaScript'' hawnhekk jiġi mniżżel għal kull utent f'kull tniżżil ta' paġna. */",
-       "cologneblue.js": "/* Kull ''JavaScript'' hawnhekk jiġi mniżżel għal dawk l-utenti li qegħdin jagħmlu użu mill-iskin ''Cologne Blue'' */",
        "monobook.js": "/* Kull ''JavaScript'' hawnhekk jiġi mniżżel għal dawk l-utenti li qegħdin jagħmlu użu mill-iskin ''Monobook'' */",
-       "modern.js": "/* Kull ''JavaScript'' hawnhekk jiġi mniżżel għal dawk l-utenti li qegħdin jagħmlu użu mill-iskin ''Modern''*/",
-       "notacceptable": "Is-Server tal-wiki m'għandux format li l-klijent tiegħek ikun jista' jaqra.",
        "anonymous": "{{PLURAL:$1|Utent anonimu|Utenti anonimi}} ta' {{SITENAME}}",
        "siteuser": "$1, utent tal-{{SITENAME}}",
        "anonuser": "$1, utent anonimu ta' {{SITENAME}}",
        "pageinfo-protect-cascading": "Protezzjoni li tintiret minn hawnhekk",
        "pageinfo-protect-cascading-yes": "Iva",
        "pageinfo-protect-cascading-from": "Protezzjoni li tintiret minn",
-       "skinname-cologneblue": "Cologne Blue",
        "skinname-monobook": "Monobook",
-       "skinname-modern": "Modern",
        "markaspatrolleddiff": "Marka l-modifiki bħalha verifikati",
        "markaspatrolledtext": "Immarka din il-paġna bħala verifikata",
        "markedaspatrolled": "Markat bħalha verifikat",
        "newimages-summary": "Din il-paġna speċjali turi l-aħħar fajls li ġew mtella' riċentament.",
        "newimages-legend": "Filtru",
        "newimages-label": "Isem tal-fajl (jew parti minnu):",
-       "showhidebots": "($1 bots)",
        "noimages": "M'hawn xejn x'tara.",
        "ilsubmit": "Fittex",
        "bydate": "data",
        "size-kilobytes": "$1 KB",
        "size-megabytes": "$1 MB",
        "size-gigabytes": "$1 GB",
-       "livepreview-loading": "Tniżżil fil-progress…",
-       "livepreview-ready": "Tniżżil… Lest!",
-       "livepreview-failed": "Problema fil-funżjoni tal-previżjoni lajv.\nUża previżjoni standard.",
-       "livepreview-error": "Impossibli toħloq konnessjoni: $1 \"$2\". Uża previżjoni standard.",
        "lag-warn-normal": "It-tibdil li hu aktar riċenti minn $1 {{PLURAL:$1|sekonda|sekonda}}, jista' li ma jiġix inkluż fil-lista.",
        "lag-warn-high": "Minħabba li l-aġġornament tas-server huwa eċċessivament bil-mod, il-modifiki fl-aħħar $1 {{PLURAL:$1|sekonda|sekonda}} ma jistgħux jiġu nklużi fil-lista.",
-       "watchlistedit-numitems": "Il-lista ta' osservazzjoni tiegħek fiha {{PLURAL:$1|titlu|$1 titli}}, minbarra l-paġni ta' diskussjoni.",
-       "watchlistedit-noitems": "Il-lista ta' osservazzjoni tiegħek hija vojta.",
        "watchlistedit-normal-title": "Modifika l-lista tal-osservazzjonijiet speċjali",
        "watchlistedit-normal-legend": "Neħħi titli mil-lista tal-osservazzjonijiet speċjali",
        "watchlistedit-normal-explain": "Titli fil-lista ta' osservazzjoni tiegħek huma murija hawn taħt.\nBiex tneħħi titlu, agħżel il-kaxxa ħdejn l-istess titlu, u agħfas \"{{int:Watchlistedit-normal-submit}}\".\nInt tista' wkoll [[Special:EditWatchlist/raw|timmodifika l-lista f'format testwali]].",
        "compare-invalid-title": "It-titlu li speċifikajt huwa invalidu.",
        "compare-title-not-exists": "It-titlu li speċifikajt ma jeżistix.",
        "compare-revision-not-exists": "Ir-reviżjoni li speċifikajt ma teżistix.",
-       "dberr-header": "Din il-wiki għandha problema",
        "dberr-problems": "Jiddispjaċina! Dan is-sit għandu diffikultajiet tekniċi.",
        "dberr-again": "Prova stenna ftit minuti u erġa' tella' l-paġna.",
        "dberr-info": "(Impossibbli li jsir kuntratt mas-server tad-databażi: $1)",
index 62bb75b..b0ab19f 100644 (file)
@@ -6,7 +6,8 @@
                        "MCruz",
                        "Malafaya",
                        "Romaine",
-                       "Urhixidur"
+                       "Urhixidur",
+                       "아라"
                ]
        },
        "tog-underline": "Sublinhar lhigaçones:",
@@ -19,7 +20,6 @@
        "tog-showtoolbar": "Amostrar barra d'eidiçon (JavaScrit)",
        "tog-editondblclick": "Eiditar páiginas quando houbir un clique duplo (JavaScrit)",
        "tog-editsectiononrightclick": "Posseblitar l'eidiçon de cachos por clique cul boton dreito ne l títalo de la seçon (JavaScrit)",
-       "tog-rememberpassword": "Recordar la mie palabra-chabe antre sessones (for a maximum of $1 {{PLURAL:$1|day|days}})",
        "tog-watchcreations": "Ajuntar las páiginas que you criar a las minhas páiginas begiadas",
        "tog-watchdefault": "Ajuntar las páiginas que you eiditar a las minhas páiginas begiadas",
        "tog-watchmoves": " Ajuntar las páiginas que you mober a las minhas páiginas begiadas",
        "filedeleteerror": "Nun fui possible apagar l fexeiro \"$1\".",
        "directorycreateerror": "Nun fui possible criar la diretorie \"$1\".",
        "filenotfound": "Nun fui possible achar l fexeiro \"$1\".",
-       "fileexistserror": "Nun fui possible grabar ne l fexeiro \"$1\": yá eisiste",
        "unexpected": "Balor nun sperado: \"$1\"=\"$2\".",
        "formerror": "Erro: Nun fui possible ambiar l formulário",
        "badarticleerror": "Esta acion nun puode ser feita nesta páigina.",
        "searchall": "todos",
        "powersearch-legend": "Percura abançada",
        "powersearch-ns": "Percurar ne ls spácios nominales:",
-       "powersearch-redir": "Listar ancaminamientos",
        "preferences": "Perfréncias",
        "mypreferences": "Las mies perfréncias",
        "prefs-skin": "Maçcarilha",
        "recentchanges-feed-description": "Acumpanha las redadeiras altaraçones de l biqui por esta semiente.",
        "recentchanges-legend-newpage": "$1 - nuoba páigina",
        "rcnotefrom": "Alteraçones feitas zde <b>$2</b> (amostradas até <b>$1</b>).",
-       "rclistfrom": "Amostrar las noubas altaraçones a partir de $1",
+       "rclistfrom": "Amostrar las noubas altaraçones a partir de $3 $2",
        "rcshowhideminor": "$1 eidiçones pequerrixas",
        "rcshowhidebots": "$1 robós",
        "rcshowhideliu": "$1 outelizadores registrados",
        "table_pager_last": "Redadeira páigina",
        "table_pager_limit": "Amostrar $1 antradas por páigina",
        "table_pager_empty": "Sien resultados",
-       "livepreview-loading": "A cargar...",
-       "livepreview-ready": "A cargar... Pronto!",
        "watchlistedit-raw-titles": "Títalos",
        "watchlisttools-view": "Ber altaraçones amportantes",
        "watchlisttools-edit": "Ber i eiditar ls mius begiados",
index 435236c..e64eb1c 100644 (file)
@@ -18,7 +18,8 @@
                        "Thitaung",
                        "Umherirrender",
                        "Zawthet",
-                       "ကိုရာဝီ"
+                       "ကိုရာဝီ",
+                       "아라"
                ]
        },
        "tog-underline": "လင့်ကို မျဉ်းသားသည့် ပုံစံ -",
@@ -31,7 +32,6 @@
        "tog-showtoolbar": "ပြုပြင်ရန် ကိရိယာများ (JavaScript လိုအပ်သည်)",
        "tog-editondblclick": "ကလစ်နှစ်ခါနှိပ်လျှင် စာမျက်နှာအားပြုပြင်ပါ (JavaScript လိုအပ်သည်)",
        "tog-editsectiononrightclick": "အပိုင်းလိုက်ခေါင်းစဉ်များကို ညာကလစ်နှိပ်ခြင်းဖြင့် အပိုင်းလိုက် တည်းဖြတ်ခြင်းကို အသုံးပြုရန်",
-       "tog-rememberpassword": "ဤကွန်ပျူတာတွင် ကျွန်ုပ်ကိုမှတ်ထားရန် (အများဆုံး $1 {{PLURAL:$1|ရက်|ရက်}}ကြာ)",
        "tog-watchcreations": "ကျွန်ုပ်စတင်ရေးသားခဲ့သည့်စာမျက်နှာများနှင့် အပ်လုပ်တင်ခဲ့သည့် ဖိုင်များကို စောင့်​ကြည့်​စာ​ရင်း​ထဲ ပေါင်းထည့်ရန်",
        "tog-watchdefault": "ကျွန်ုပ် တည်းဖြတ်ခဲ့သည့် စာမျက်နှာများနှင့် ဖိုင်များကို စောင့်ကြည့်စာရင်းသို့  ပေါင်းထည့်ပါ။",
        "tog-watchmoves": "ကျွန်ုပ်ရွှေ့လိုက်သော စာမျက်နှာများနှင့် ဖိုင်များကို စောင့်ကြည့်စာရင်းသို့ ပေါင်းထည့်ရန်",
        "missingarticle-diff": "(ကွဲပြားချက် - $1, $2)",
        "internalerror": "အတွင်းပိုင်းအမှား",
        "internalerror_info": "အတွင်းပိုင်းအမှား - $1",
-       "fileappenderror": "\"$1\" ကို \"$2\" ဖြင့်ဖော်ပြ၍မရပါ။",
        "filecopyerror": "ဖိုင် \"$1\" ကို \"$2\" သို့ ကော်ပီကူးမရပါ။",
        "filerenameerror": "ဖိုင် \"$1\" ကို \"$2\" သို့ အမည်ပြောင်းမရပါ။",
        "filedeleteerror": "ဖိုင် \"$1\" ကို ဖျက်မရပါ။",
        "savearticle": "ဤစာမျက်နှာကို သိမ်းရန်",
        "preview": "နမူနာ",
        "showpreview": "န​မူ​နာ​ပြ​ရန်",
-       "showlivepreview": "နမူနာအရှင်",
        "showdiff": "ပြင်​ဆင်​ထား​သည်​များ​ကို​ ပြရန်",
        "anoneditwarning": "'''သတိပေးချက် - ''' သင်သည် logged in ဝင်မထားပါ။\nဤစာမျက်နှာ၏ တည်းဖြတ်မှတ်တမ်းတွင် သင့် IP address ကို မှတ်သားထားမည် ဖြစ်သည်။",
        "anonpreviewwarning": "သင်သည် logged in ဝင်မထားပါ။ သိမ်းဆည်းမည် ဆိုပါက သင်၏IP အား ဤစာမျက်နှာ မှတ်တမ်းတွင် မှတ်သားထားမည်ဖြစ်ပါသည်။",
        "search-nonefound": "စုံစမ်းမှုနှင့်ကိုက်ညီသော ရလဒ်မရှိပါ။",
        "powersearch-legend": "အထူးပြု ရှာဖွေရန်",
        "powersearch-ns": "အမည်ညွှန်းတို့တွင် ရှာရန် -",
-       "powersearch-redir": "ပြန်ညွှန်းသည့် လင့်များကို စာရင်းပြုစုရန်",
        "powersearch-togglelabel": "စစ်ဆေးရန် -",
        "powersearch-toggleall": "အားလုံး",
        "powersearch-togglenone": "အမည်ညွှန်းမရှိ",
        "prefs-advancedsearchoptions": "အဆင့်မြင့် ရွေးချယ်မှု",
        "prefs-advancedwatchlist": "အဆင့်မြင့် ရွေးချယ်မှု",
        "prefs-displayrc": "ပြသရန် ရွေးချယ်မှု",
-       "prefs-displaysearchoptions": "ပြသရန် ရွေးချယ်မှု",
        "prefs-displaywatchlist": "ပြသရန် ရွေးချယ်မှု",
        "prefs-diffs": "ကွဲပြားချက်",
        "email-address-validity-valid": "အီးမေးလိပ်စာ တရားဝင်ပုံပေါ်သည်",
        "recentchanges-label-bot": "ဤတည်းဖြတ်မှုကို ဘော့က လုပ်ဆောင်သွားသည်။",
        "recentchanges-label-unpatrolled": "ဤတည်းဖြတ်မှုကို မစောင့်ကြပ်မစစ်ဆေးရသေးပါ",
        "rcnotefrom": "အောက်ပါတို့သည် '''$2''' ကတည်းက အ​ပြောင်းအလဲများ ြဖစ်သည် ('''$1''' ခု ြပထားသည်)။",
-       "rclistfrom": "$1 မှစသော အပြောင်းအလဲအသစ်များကို ပြရန်",
+       "rclistfrom": "$3 $2 မှစသော အပြောင်းအလဲအသစ်များကို ပြရန်",
        "rcshowhideminor": "အရေးမကြီးသော ပြင်ဆင်မှု $1ရန်",
        "rcshowhidebots": "ဘော့ $1ရန်",
        "rcshowhideliu": "logged-in ဝင်နေသော အသုံးပြုသူ $1ရန်",
        "compare-rev1": "မူ တစ်",
        "compare-rev2": "မူ နှစ်",
        "compare-submit": "နှိုင်းယှဉ်ရန်",
-       "dberr-header": "ဤဝီကီတွင် ပြဿနာတစ်ခု ရှိနေသည်",
        "dberr-problems": "ဝမ်းနည်းပါသည်။ ဤဆိုက်သည် နည်းပညာပိုင်းဆိုင်ရာ အခက်အခဲများ ကြုံတွေ့နေရပါသည်။",
        "htmlform-required": "ဤတန်ဖိုး လိုအပ်သည်",
        "htmlform-submit": "ထည့်သွင်းရန်",
index f3dd7f5..d4630c2 100644 (file)
@@ -10,7 +10,8 @@
                        "Sura",
                        "Tupikovs",
                        "Urhixidur",
-                       "Игорь Бродский"
+                       "Игорь Бродский",
+                       "아라"
                ]
        },
        "tog-underline": "Сюлмавома петнень алга черькстамс:",
@@ -23,7 +24,6 @@
        "tog-showtoolbar": "Невтемс кедьёнкслазнэнть сёрмадома шкасто",
        "tog-editondblclick": "Кавксть лепштязь совамс сёрмадовксонь витнеме-петнеме",
        "tog-editsectiononrightclick": "Витнемс секциятнень-пелькстнэнь, лепштямс сёрмадовксонть лемензэ лангс чеерень витьёнсе повнесэ",
-       "tog-rememberpassword": "Кирдемс мельсэ совамо валом те бравзерсэнть (сех кувать $1 {{PLURAL:$1|чи|чить}})",
        "tog-watchcreations": "Совавтомс ванома лемрисьмезэнь монь теевть лопатнень ды сень, мезе йовкстан",
        "tog-watchdefault": "Совавтомс монь витевть лопатнень ванома лемрисьмезэнь",
        "tog-watchmoves": "Совавтомс монь одов лемдявт лопатнень-керьмазтнэнь ванома лемрисьмезэнь",
        "missingarticle-diff": "(Мейсэ явовить: $1, $2)",
        "internalerror": "Потмоильведькс",
        "internalerror_info": "Потмоильведькс: $1",
-       "fileappenderrorread": "\"$1\" файлась эзь ловново поладомо шкастонзо.",
-       "fileappenderror": "\"$1\" файлась эзь поладово \"$2\" файлантень.",
        "filecopyerror": "\"$1\" файлась эзь ванстово од \"$2\" файлакс.",
        "filerenameerror": "Файлантень а маштови \"$1\" максомс од лем \"$2\".",
        "filedeleteerror": "\"$1\" файлась шукшпряв эзь ливтеве.",
        "directorycreateerror": "\"$1\" директориясь а тееви.",
        "filenotfound": "\"$1\" файлась а муеви.",
-       "fileexistserror": "Файлась \"$1\" а сёрмадови: ули уш истямо",
        "unexpected": "Апак учонь вейкетстямо: \"$1\"=\"$2\".",
        "formerror": "Ильведевкс: Формась а кучови",
        "badarticleerror": "Те лопасонть вешезь тевесь а тееви.",
        "savearticle": "Ванстомс лопанть",
        "preview": "Васнянь неевтезэ",
        "showpreview": "Максомс васнянь невтевкс",
-       "showlivepreview": "Эряй васнянь невтевкс",
        "showdiff": "Невтемс мезе полавтовсь",
        "anoneditwarning": "'''Ванок:''' Зярс эзить сова. IP адресэть совавтови те лопанть витнема-петнема икелькс умантень.",
        "missingcommenttext": "Инеськеть мелеть-арьсемат путта тезэнь алов.",
        "search-nonefound": "Те вешнема лангс мезеяк эзь муеве.",
        "powersearch-legend": "Седе келейстэ вешнема",
        "powersearch-ns": "Вешнемс не лемпотмотнестэ:",
-       "powersearch-redir": "Лия таркав ютавтоматнень сёрмалема",
        "powersearch-toggleall": "Весе",
        "powersearch-togglenone": "Арась мезе невтемс",
        "search-external": "Ушо йондонь вешнема",
        "recentchanges-label-unpatrolled": "",
        "recentchanges-legend-newpage": "(вантаять [[Special:NewPages|од лопань лемрисьме]])",
        "rcnotefrom": "Ало невтезь  '''$2''' лиякстомтомасто саезь ('''$1''' видс).",
-       "rclistfrom": "Невтемс од витьнематнень $1-нть эйстэ саезь.",
+       "rclistfrom": "Невтемс од витьнематнень $3 $2-нть эйстэ саезь.",
        "rcshowhideminor": "$1 апокшкэ витнемат-петнемат",
        "rcshowhidebots": "$1 ботт",
        "rcshowhideliu": "$1 совавтозь теицят",
        "table_pager_empty": "Ресултатт арасть",
        "autosumm-replace": "Лопась полавтови '$1' марто",
        "autosumm-new": "Шкавсь-теевсь од лопа $1 марто",
-       "livepreview-loading": "Йоракшны…",
-       "livepreview-ready": "Йоракшны… Йоразь!",
        "watchlistedit-normal-title": "Витнемс-петнемс ванстома лопанть",
        "watchlistedit-normal-submit": "Нардамс конякстнэнь",
        "watchlistedit-normal-done": "{{PLURAL:$1|1=1 конякс|$1 конякст}} нардазь ваномань лопастот:",
        "compare-rev1": "Версия 1",
        "compare-rev2": "Версия 2",
        "compare-submit": "Аравтомс карадо каршо",
-       "dberr-header": "Те викисэнть проблема",
        "htmlform-submit": "Максомс",
        "htmlform-reset": "Саемс мекев полавтоматнень",
        "htmlform-selectorother-other": "Лия",
index 77019c3..5c20f00 100644 (file)
@@ -8,7 +8,8 @@
                        "Mjbmr",
                        "Parthava (on mzn.wikipedia.org)",
                        "Spacebirdy",
-                       "محک"
+                       "محک",
+                       "아라"
                ]
        },
        "tog-underline": "پیوندون زیر خط دکشی بواشه",
@@ -21,7 +22,6 @@
        "tog-showtoolbar": "دچی‌ین جعبه نوار ابزار ره سِراق هدائن",
        "tog-editondblclick": "دچی ین ولگون با دتا کلیک (نیازمند جاوااسکریپت)",
        "tog-editsectiononrightclick": "به کار دمبدائن دچی‌ین قسمت‌ئون با راست کیلیک<br />عناوین قسمت‌ئون ِرو (جاوااسکریپت)",
-       "tog-rememberpassword": "مه رمز ره (تا حداکثر $1 {{PLURAL:$1|روز|روز}}) این مرورگر دله یاد دار",
        "tog-watchcreations": "ایضافه بین صفحه‌ئونی که من دِرِس هاکردمه به پیگیری‌ئون ِرج.",
        "tog-watchdefault": "اضافه هاکردن صفحه‌هایی که چیمبه به منه پیگری ِرج",
        "tog-watchmoves": "صفحه‌ئونی که کشمبه ره منه پِگیری ِرج دله بنویس",
        "readonly_lag": "پایگاه داده به طور خودکار زلفین بزه‌بیّه تا پشتیبون ِنسخه‌ئون با اصلی نسخه هماهنگ بواشِن",
        "internalerror": "خطای دله‌یی",
        "internalerror_info": "خطای دله‌یی: $1",
-       "fileappenderrorread": "طی پست امکان بخوندستن «$1» وجود نداشته.",
-       "fileappenderror": "نیّه «$1» ره به «$2» پُست هاکرده.",
        "filecopyerror": "نیّه پروندهٔ «$1» جه روی «$2» نسخه‌برداری بواشه.",
        "filerenameerror": "نیّه پروندهٔ «$1» به «$2» تغییرنوم پیداهاکنه.",
        "filedeleteerror": "نیّه پروندهٔ «$1» پاک بواشه.",
        "directorycreateerror": "امکان بساتن پوشه $1 وجود نداشته.",
        "filenotfound": "پروندهٔ «$1» پیدانیّه.",
-       "fileexistserror": "امکان بنویشتن روی پرونده $1 وجود ندانّه: پرونده از قبل وجود داشته.",
        "unexpected": "مقدار غیرمنتظره: «$1»=«$2».",
        "formerror": "خطا: ننشنه فرم ره برسنی‌ین",
        "badarticleerror": "ننشنه این کار ره این صفحه دله هاکردن.",
        "savearticle": "جادکتن ِصفحه",
        "preview": "پیش‌پیش سِراق هدائن",
        "showpreview": "پیش‌پیش سِراق هدائن",
-       "showlivepreview": "آنلاین پیش‌پیش سِراق هدائن",
        "showdiff": "تغییرات ِسراق هدائن",
        "anoneditwarning": "'''هشدار:''' شِما هنتا عضو نَیینی.\nشمه آی‌پی آدرِس تاریخچه دله موندنه.",
        "anonpreviewwarning": "''شما هنتا عضو نَیینی، اگه اتچی بنویسین، شمه آی‌پی ِلینگِ‌رج اینجه موندنه.''",
        "search-interwiki-more": "(ویشتر)",
        "powersearch-legend": "ململ بَیی دور هایتن",
        "powersearch-ns": "بچرخستن اینان دله:",
-       "powersearch-redir": "",
        "mypreferences": "مه خاستنی‌ئون",
        "prefs-edits": "تعداد دچی‌یه‌ئون:",
        "prefs-rc": "تازه دگاردسته‌ئون",
        "recentchanges-label-newpage": "اینتا ویرایش اته نو صفحه ایجاد هاکرده",
        "recentchanges-label-minor": "اینتا ویرایش خله جزئی بیه",
        "recentchanges-label-bot": "اینتا ویرایش‌ره اته ربات انجام هدائه",
-       "rclistfrom": "نِمایش تازه‌دگاردسته‌ئون با شروع از $1",
+       "rclistfrom": "نِمایش تازه‌دگاردسته‌ئون با شروع از $3 $2",
        "rcshowhideminor": "پچیک دچی‌یه‌ئون $1",
        "rcshowhidebots": "ربوت‌ئون $1",
        "rcshowhideliu": "ثبت‌نوم هاکرده کارورون $1",
index 55a4489..e17ea9c 100644 (file)
@@ -7,7 +7,8 @@
                        "Ricardo gs",
                        "Rob Church <robchur@gmail.com>",
                        "Shirayuki",
-                       "Teòtlalili"
+                       "Teòtlalili",
+                       "아라"
                ]
        },
        "tog-underline": "Mokìnxòîkuilòtzàswis tzòwilistìn:",
@@ -18,7 +19,6 @@
        "tog-usenewrc": "Molōloāzqueh in tlapatlaliztli in yancuīc tlapatlaliztli āmapan īhuān in tlachiyaliztli tlapōhualāmapan (monequi JavaScript)",
        "tog-showtoolbar": "Motlaīxtlatīz in tlachihchīhualōni pāntli",
        "tog-editondblclick": "Tiquimpatlāz in zāzanilli intlā ōme tiquimpachoa",
-       "tog-rememberpassword": "Ticpiyāz moMotlatequitiltilīltōca īhuān motlahtōlichtacāyo inīn chīuhpōhualhuazco (īxquich {{PLURAL:$1|tōnalli}})",
        "tog-watchcreations": "Moaquiāz in āmatl mā niquinyōcoya īhuān in tlahcuilōlli mā niquinquetza īpan notlachiyaliz",
        "tog-watchdefault": "Moaquiāz āmatl īhuān tlahcuilōlli mā niquinpatla in notlachiyaliz",
        "tog-watchmoves": "Moaquiāz āmatl īhuān tlahcuilōlli mā niquinzaca in notlachiyaliz",
        "filerenameerror": "Ahmo ōmohuelītic tlazaca \"$1\" īhuīc \"$2\".",
        "filedeleteerror": "Ahmo ōmohuelītic tlapoloa \"$1\".",
        "filenotfound": "Ahmo ōmohuelītic tlanāmiqui \"$1\".",
-       "fileexistserror": "Ahmo ōmohuelītih tlahcuiloa \"$1\" tlahcuilōlhuīc: tlahcuilōlli ia",
        "cannotdelete": "Ahmo ōhuelītic mopoloa in zāzanilli \"$1\".\nHueli tlein āquin ōquipolo achtopa.",
        "badtitle": "Ahcualli tōcāitl",
        "badtitletext": "Zāzanilli ticnequi in ītōca cah ahcualli, ahtlein quipiya nozo ahcualtzonhuiliztli interwiki tōcāhuicpa.\nHueliz quimpiya tlahtōl tlein ahmo mohuelītih motequitiltia tōcāpan.",
        "savearticle": "Ticpiyāz",
        "preview": "Xiquitta achtochīhualiztli",
        "showpreview": "Xiquitta achtochīhualiztli",
-       "showlivepreview": "Niman achtochīhualiztli",
        "showdiff": "Tiquinttāz tlapatlaliztli",
        "missingcommenttext": "Timitztlātlauhtiah xitlanitlahcuiloa.",
        "summary-preview": "Tlahcuilōltōn achtochīhualiztli:",
        "searchall": "mochīntīn",
        "powersearch-legend": "Chicāhuac tlatēmoliztli",
        "powersearch-ns": "Tlatēmōz tōcātzimpan:",
-       "powersearch-redir": "Quimpiya tlacuepaliztli",
        "powersearch-toggleall": "Mochi",
        "powersearch-togglenone": "Ahtlein",
        "search-external": "Tlatēmotiliztli calāmpa",
        "recentchanges-summary": "Xiquinttāz in achi yancuīc ahmo occequīntīn tlapatlaliztli huiquipan inīn zāzanilpan.",
        "recentchanges-label-newpage": "Inīn tlapatlaliztli ōquiyōcox cē yancuīc āmatl",
        "recentchanges-label-minor": "Inīn tlapatlaliztli tepitōn",
-       "rclistfrom": "Xiquinttāz yancuīc tlapatlaliztli īhuīcpa $1",
+       "rclistfrom": "Xiquinttāz yancuīc tlapatlaliztli īhuīcpa $3 $2",
        "rcshowhideminor": "$1 tlapatlalitzintli",
        "rcshowhidebots": "$1 tepoztlācah",
        "rcshowhideliu": "$1 tēmachiyōmacalli tlatequitiltilīltin",
        "unwatching": "Ahtlachiyacah...",
        "enotif_impersonal_salutation": "tlatequitiltilīlli īpan {{SITENAME}}",
        "enotif_anon_editor": "ahtōcātlatequitiltilīlli $1",
-       "enotif_body": "Māhuiztic $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nTlapatlani ītlahtōlpehuallo:  $PAGESUMMARY $PAGEMINOREDIT\n\nXicnotzāz in tlapatlani:\nīnetitlanizyeyān:$PAGEEDITOR_EMAIL\nīhuiqui:$PAGEEDITOR_WIKI\n\nAhmo occēppa mitztlamachiztīz intlā yancuīc tlapatlaliztli, zā mā tiquittaz inīn āmatl. Tihueliti ticcencahulīz in tēmachiztīlizpāmitl in mochintin motlachixāmatl in motlachiyaliz.\n\nIn {{SITENAME}} icnīuhtīliztica motēmachiztīliztlacentetilīz.\n\nIntlā ticnequi ticpatlaz in maltzinteyōtl monetitlanizyeyān, xiquihitta:\n{{canonicalurl:{{#special:Preferences}}}}\n\n\nIntlā ticnequi ticpatlaz in motlachiyaliz tlaēlēhuiliztli, xiquihitta:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nIntlā ticnequi ticpolōz in āmatl ītech motlachiyaliz, xiquihitta:\n$UNWATCHURL\n\nMotlahtōlcaquiliztīlōni īhuān ocachi tēpalēhuiliztli, xiquihitta:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Māhuiztic $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nTlapatlani ītlahtōlpehuallo:  $PAGESUMMARY $PAGEMINOREDIT\n\nXicnotzāz in tlapatlani:\nīnetitlanizyeyān:$PAGEEDITOR_EMAIL\nīhuiqui:$PAGEEDITOR_WIKI\n\nAhmo occēppa mitztlamachiztīz intlā yancuīc tlapatlaliztli, zā mā tiquittaz inīn āmatl. Tihueliti ticcencahulīz in tēmachiztīlizpāmitl in mochintin motlachixāmatl in motlachiyaliz.\n\nIn {{SITENAME}} icnīuhtīliztica motēmachiztīliztlacentetilīz.\n\nIntlā ticnequi ticpatlaz in maltzinteyōtl monetitlanizyeyān, xiquihitta:\n{{canonicalurl:{{#special:Preferences}}}}\n\n\nIntlā ticnequi ticpatlaz in motlachiyaliz tlaēlēhuiliztli, xiquihitta:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nIntlā ticnequi ticpolōz in āmatl ītech motlachiyaliz, xiquihitta:\n$UNWATCHURL\n\nMotlahtōlcaquiliztīlōni īhuān ocachi tēpalēhuiliztli, xiquihitta:\n$HELPPAGE",
        "created": "ōmochīuh",
        "changed": "ōmotlacuep",
        "deletepage": "Ticpolōz inīn zāzanilli",
        "whatlinkshere-hideimages": "$1 tlahcuilōltzonhuīliztli",
        "blockip": "Tiquitzacuilīz tlatequitiltilīlli",
        "blockip-legend": "Tiquitzacuilīz tlatequitiltilīlli",
-       "ipadressorusername": "IP nozo tlatequitiltilīlli ītōcā:",
+       "ipaddressorusername": "IP nozo tlatequitiltilīlli ītōcā:",
        "ipbexpiry": "Motlamia:",
        "ipbreason": "Īxtlamatiliztli:",
        "ipbsubmit": "Tiquitzacuilīz inīn tlatequitiltilīlli",
        "show-big-image": "Mochi cuallōtl",
        "newimages": "Yancuīc īxipcān",
        "imagelisttext": "Nicān {{PLURAL:$1|mopiya|mopiyah}} '''$1''' īxiptli $2 iuhcopa.",
-       "showhidebots": "($1 tepoztlācah)",
        "noimages": "Ahtlein ic tlatta.",
        "ilsubmit": "Tlatēmōz",
        "bydate": "tōnalcopa",
        "size-kilobytes": "$1 KB",
        "size-megabytes": "$1 MB",
        "size-gigabytes": "$1 GB",
-       "livepreview-loading": "Tēmohua...",
-       "livepreview-ready": "Motemocah... ¡Ye!",
-       "watchlistedit-numitems": "Motlachiyaliz {{PLURAL:$1|quipiya cē zāzanilli|quimpiya $1 zāzaniltin}}, ahtle tēixnāmiquiliztli.",
        "watchlistedit-normal-title": "Ticpatlāz motlachiyaliz",
        "watchlistedit-raw-added": "{{PLURAL:$1|Ōmocentili cē zāzanilli|Ōmocentilih $1 zāzaniltin}}:",
        "watchlisttools-view": "Tiquinttāz huēyi tlapatlaliztli",
index 4f19e96..5e6e0c3 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Hiong3-eng5",
                        "Ianbu",
-                       "Kaihsu"
+                       "Kaihsu",
+                       "아라"
                ]
        },
        "tog-underline": "Liân-kiat oē té-sûn:",
        "tog-hidepatrolled": "Am chòe-kīn sûn koè--ê  kái-piàn",
        "tog-newpageshidepatrolled": "Sin-ia̍h ê chheng-toaⁿ am sûn koè--ê",
        "tog-extendwatchlist": "thián-khui kàm-sī-toaⁿ, khoàⁿ choân-pō͘  kái ê, m̄-nā choè-kīn niā.",
-       "tog-usenewrc": "Ka-kiông pán ê chòe-kīn-ê-kái-piàn (su-iàu JavaScript)",
+       "tog-usenewrc": "共文章最近有改的佮監視列表囥做伙",
        "tog-numberheadings": "Phiau-tê chū-tōng pian-hō",
-       "tog-showtoolbar": "Hián-sī pian-chi̍p ke-si-tiâu (su-iàu JavaScript)",
-       "tog-editondblclick": "Siang-ji̍h ia̍h-bīn to̍h ē-tàng pian-chi̍p (su-iàu JavaScript)",
-       "tog-editsectiononrightclick": "Chiàⁿ-ji̍h (right click) toāⁿ-lo̍h (section) phiau-tê to̍h ē-tàng pian-chi̍p toāⁿ-lo̍h (su-iàu JavaScript)",
-       "tog-watchcreations": "Kā goá khui ê ia̍h ka-ji̍p kàm-sī-toaⁿ lāi-té",
-       "tog-watchdefault": "Kā goá pian-chi̍p kòe ê ia̍h ka-ji̍p kàm-sī-toaⁿ lāi-té",
-       "tog-watchmoves": "Kā goá soá ê ia̍h ka-ji̍p kàm-sī-toaⁿ",
-       "tog-watchdeletion": "Kā goá thâi tiāu ê ia̍h ka-ji̍p kàm-sī-toaⁿ",
+       "tog-showtoolbar": "Hián-sī pian-chi̍p ke-si-tiâu",
+       "tog-editondblclick": "連揤兩个就通編輯",
+       "tog-editsectiononrightclick": "Chiàⁿ ji̍h toāⁿ-lo̍h phiau-tê to̍h ē-tàng pian-chi̍p toāⁿ-lo̍h",
+       "tog-watchcreations": "Kā goá khui ê ia̍h kah chiūⁿ-chái ê tóng-àn ka-ji̍p kàm-sī-toaⁿ lāi-té",
+       "tog-watchdefault": "Kā goá pian-chi̍p kòe ê ia̍h kah tóng-àn ka-ji̍p kàm-sī-toaⁿ lāi-té",
+       "tog-watchmoves": "Kā goá soá ê ia̍h kah tóng-àn ka-ji̍p kàm-sī-toaⁿ",
+       "tog-watchdeletion": "Kā goá thâi tiāu ê ia̍h kah tóng-àn ka-ji̍p kàm-sī-toaⁿ",
        "tog-minordefault": "Chiām-tēng bī-lâi ê siu-kái lóng sī sió-siu-ká",
        "tog-previewontop": "Sûn-khoàⁿ ê lōe-iông tī pian-chi̍p keh-á thâu-chêng",
        "tog-previewonfirst": "Thâu-pái pian-chi̍p seng khoàⁿ-māi",
@@ -29,8 +30,8 @@
        "tog-enotifrevealaddr": "Hō͘ pat-lâng khoàⁿ ê tio̍h oá ê tiān-chú-phoe tē-chí",
        "tog-shownumberswatching": "Hián-sī tng leh khoàⁿ ê iōng-chiá sò͘-bo̍k",
        "tog-oldsig": "Chit-má ê chhiam-miâ:",
-       "tog-fancysig": "Chhiam-miâ mài chò liân-kiat",
-       "tog-uselivepreview": "Ēng sui khoàⁿ-māi (ài ū JavaScript) (chhì-giām--ê)",
+       "tog-fancysig": "共我的簽名當做文章文字,(無需要自動連結)",
+       "tog-uselivepreview": "Ēng sui khoàⁿ-māi (chhì-giām--ê)",
        "tog-forceeditsummary": "Pian-chi̍p khài-iàu bô thiⁿ ê sî-chūn, kā goá thê-chhéⁿ",
        "tog-watchlisthideown": "Kàm-sī-toaⁿ bián hián-sī goá ê pian-chi̍p",
        "tog-watchlisthidebots": "Kàm-sī-toaⁿ bián hián-sī ki-khì pian-chi̍p",
        "tog-diffonly": "Diff ē-pêng bián hián-sī ia̍h ê loē-iông",
        "tog-showhiddencats": "Hián-sī chhàng khí--lâi ê lūi-pia̍t",
        "tog-norollbackdiff": "ká tńg-khí liáu bián-koán cheng-chha goā-chē",
+       "tog-useeditwarning": "我若猶未保存修改的頁就跳開,愛共我講。",
+       "tog-prefershttps": "我登入的時陣愛用安全連線",
        "underline-always": "Tiāⁿ-tio̍h",
        "underline-never": "Tiāⁿ-tio̍h mài",
-       "underline-default": "Tòe liû-lám-khì ê default",
+       "underline-default": "Tòe liû-lám-khì ê siat-piān",
        "editfont-style": "Pian-chi̍p sî ēng ê jī-thé hêng-sek:",
        "editfont-default": "Tòe liû-lám-khì ê default",
        "editfont-monospace": "Monospaced jī-thé",
        "oct": "10g",
        "nov": "11g",
        "dec": "12g",
+       "january-date": "1月$1",
+       "february-date": "2月$1",
+       "march-date": "3月$1",
+       "april-date": "4月$1",
+       "may-date": "5月$1",
+       "june-date": "6月$1",
+       "july-date": "7月$1",
+       "august-date": "8月$1",
+       "september-date": "9月$1",
+       "october-date": "10月$1",
+       "november-date": "11月$1",
+       "december-date": "12月$1",
        "pagecategories": "{{PLURAL:$1|Lūi-pia̍t|Lūi-pia̍t}}",
        "category_header": "Tī \"$1\" chit ê lūi-pia̍t ê bûn-chiuⁿ",
        "subcategories": "Ē-lūi-pia̍t",
        "newwindow": "(ē khui sin thang-á hián-sī)",
        "cancel": "Chhú-siau",
        "moredotdotdot": "Iáu-ū",
-       "mypage": "Góa ê ia̍h",
+       "morenotlisted": "這毋是完整的表",
+       "mypage": "Ia̍h",
        "mytalk": "Góa ê thó-lūn",
        "anontalk": "Chit ê IP ê thó-lūn-ia̍h",
        "navigation": "Se̍h chām",
        "vector-action-move": "Sóa khì",
        "vector-action-protect": "Pó-hō·",
        "vector-action-undelete": "chhú-siau thâi tiàu",
-       "vector-action-unprotect": "Chhú-siau pó-hō·",
+       "vector-action-unprotect": "kái pó-hō·",
        "vector-view-create": "Khai-sí siá",
        "vector-view-edit": "Siu-kái",
        "vector-view-history": "khoàⁿ le̍k-sú",
        "actions": "Tōng-chok",
        "namespaces": "Miâ-khong-kan",
        "variants": "piàn-thé",
+       "navigation-heading": "導覽目錄",
        "errorpagetitle": "Chhò-gō·",
        "returnto": "Tò-tńg khì $1.",
        "tagline": "Ùi {{SITENAME}}",
        "permalink": "Éng-kiú liân-kiat",
        "print": "Ìn-soat",
        "view": "Khoàⁿ",
+       "view-foreign": "佇$1遐看",
        "edit": "Siu-kái",
+       "edit-local": "改這位的說明",
        "create": "Khai-sí siá",
+       "create-local": "加這搭的說明",
        "editthispage": "Siu-kái chit ia̍h",
        "create-this-page": "Khai-sí siá chit ia̍h",
        "delete": "Thâi",
        "deletethispage": "Thâi chit ia̍h",
-       "undelete_short": "Kiù {{PLURAL:$1|$1|$1}} ê siu-kái",
+       "undeletethispage": "取消刣掉這頁",
+       "undelete_short": "Kiù {{PLURAL:$1|$1|$1}} ê thâi-tiāu ê",
        "viewdeleted_short": "Khoàⁿ {{PLURAL:$1|chi̍t-ê thâi tiàu--ê pian-chi̍p|$1 ê thâi tiàu--ê pian-chi̍p}}",
        "protect": "Pó-hō·",
        "protect_change": "kái-piàn",
        "protectthispage": "Pó-hō· chit ia̍h",
-       "unprotect": "Chhú-siau pó-hō·",
-       "unprotectthispage": "Chhú-siau pó-hō· chit ia̍h",
+       "unprotect": "kái pó-hō·",
+       "unprotectthispage": "kái chit ia̍h ê pó-hō͘",
        "newpage": "Sin ia̍h",
        "talkpage": "Thó-lūn chit ia̍h",
        "talkpagelinktext": "thó-lūn",
        "specialpage": "Te̍k-sû-ia̍h",
        "personaltools": "Kò-jîn kang-khū",
-       "postcomment": "Hoat-piáu phêng-lūn",
+       "postcomment": "加一段",
        "articlepage": "Khoàⁿ loē-iông ia̍h",
        "talk": "thó-lūn",
        "views": "Khoàⁿ",
        "redirectedfrom": "(Tùi $1 choán--lâi)",
        "redirectpagesub": "Choán-ia̍h",
        "lastmodifiedat": "Chit ia̍h tī $1,  $2 ū kái--koè",
-       "viewcount": "Pún-ia̍h kàu taⁿ ū $1 pái access.",
+       "viewcount": "Chit ia̍h kàu taⁿ, hō͘ lâng khoàⁿ $1 pái.",
        "protectedpage": "Siū pó-hō͘ ê ia̍h",
        "jumpto": "Thiàu khì:",
        "jumptonavigation": "Se̍h chām",
        "jumptosearch": "chhiau-chhoē",
        "view-pool-error": "Pháiⁿ-sè, chit-má chú-ki siuⁿ koè bô-êng.\nSiuⁿ koè chē lâng beh khoàⁿ chit ia̍h.\nChhiáⁿ sio-tán chi̍t-ē,  chiah koh lâi khoàⁿ chit ia̍h.\n\n$1",
+       "generic-pool-error": "Pháiⁿ-sè, chit-má chú-ki siuⁿ koè bô-êng.\nSiuⁿ chē lâng beh khoàⁿ chit ia̍h.\nChhiáⁿ sio-tán chi̍t-ē,  chiah koh lâi khoàⁿ chit ia̍h.",
        "pool-timeout": "Chhiau-koè só-tēng ê sî-kan",
        "pool-queuefull": "Tūi-lia̍t pâi moá ah",
        "pool-errorunknown": "M̄-chai siáⁿ chhò-gō͘",
+       "pool-servererror": "無提供系統服務總數的統計。",
        "aboutsite": "hían-sī",
        "aboutpage": "Project:koan-hē",
-       "copyright": "Tī $1 tiâu-kiāⁿ chi hā khó sú-iōng loē-iông",
+       "copyright": "Tû liáu ū lēng-goā kóng, nā bô loē-iông sī chiàu $1 tiâu-kiāⁿ tō thang sú-iōng.",
        "copyrightpage": "{{ns:project}}:Pán-khoân",
        "currentevents": "Sin-bûn sū-kiāⁿ",
        "currentevents-url": "Project:Sin-bûn sū-kiāⁿ",
        "nospecialpagetext": "<strong>Bô lí beh tih ê te̍k-sû-ia̍h。</strong>\n\n[[Special:SpecialPages|{{int:specialpages}}]] sī só͘-ū ê te̍k-sû-ia̍h lia̍t-pió.",
        "error": "Chhò-gō·",
        "databaseerror": "Chu-liāu-khò· chhò-gō·",
-       "databaseerror-query": "揣:",
-       "databaseerror-function": "功能:",
+       "databaseerror-query": "揣:$1",
+       "databaseerror-function": "功能:$1",
+       "databaseerror-error": "chhò-gō͘",
        "laggedslavemode": "'''提醒:'''頁內容可能毋是上新的。",
        "readonly": "Chu-liāu-khò· só tiâu leh",
        "enterlockreason": "Phah beh hong-só ê lí-iû, pau-koah ko͘-kè siáⁿ-mi̍h sî-chūn ē kái-tû hong-só.",
        "readonly_lag": "佇附屬的資料庫更新到主要資料庫資料的時陣,資料庫會自動鎖定。",
        "internalerror": "Loē-pō͘ ê chhò-ngō͘",
        "internalerror_info": "Loē-pō͘ ê chhò-ngō͘: $1",
-       "fileappenderrorread": "Ka-ji̍p(append) ê sî bô-hoat-tō͘ thak \"$1\".",
-       "fileappenderror": "Bô-hoat-tō͘ kā \"$1\" chiap khì \"$2\".",
        "filecopyerror": "Bô-hoat-tō· kā tóng-àn \"$1\" khó·-pih khì \"$2\".",
        "filerenameerror": "Bô-hoat-tō· kā tóng-àn \"$1\" kái-miâ chò \"$2\".",
        "filedeleteerror": "Bô-hoat-tō· kā tóng-àn \"$1\" thâi tiāu",
        "directorycreateerror": "Bô-hoat-tō͘ khui bo̍k-lo̍k \"$1\".",
        "filenotfound": "Chhōe bô tóng-àn \"$1\".",
-       "fileexistserror": "Bô-hoat-tō͘ chûn-ji̍p tóng-àn \"$1\": í-keng ū chit ê tóng-àn",
        "unexpected": "Koài-koài ê pió-tat: \"$1\"=\"$2\"。",
        "formerror": "Chhò-gō·: bô-hoat-tō· kā pió sàng chhut khì.",
        "badarticleerror": "Bē-tàng tiàm chit ia̍h chip-hêng chit ê tōng-chok.",
        "recentchanges-label-newpage": "Chit ê siu-kái ē sán-seng sin ia̍h",
        "recentchanges-label-minor": "Che sī sió siu-kái",
        "rcnotefrom": "Ē-kha sī <b>$2</b> kàu taⁿ ê kái-piàn (ke̍k-ke hián-sī <b>$1</b> hāng).",
-       "rclistfrom": "Hián-sī tùi $1 kàu taⁿ ê sin kái-piàn",
+       "rclistfrom": "Hián-sī tùi $3 $2 kàu taⁿ ê sin kái-piàn",
        "rcshowhideminor": "$1 sió siu-kái",
        "rcshowhideliu": "$1 teng-ji̍p ê iōng-chiá",
        "rcshowhideanons": "$1 bû-bêng-sī",
        "log": "記錄",
        "logempty": "Log lāi-bīn bô sio-tùi ê hāng-bo̍k.",
        "allpages": "Só·-ū ê ia̍h",
-       "alphaindexline": "$1 kàu $2",
        "nextpage": "Āu 1 ia̍h ($1)",
        "prevpage": "前一頁($1)",
        "allpagesfrom": "Tùi chit ia̍h khai-sí hián-sī:",
        "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.",
-       "watchmethod-recent": "tng teh kíam-cha choè-kīn ê siu-kái, khoàⁿ ū kàm-sī ê ia̍h bô",
-       "watchmethod-list": "tng teh kiám-cha kàm-sī ê ia̍h khoàⁿ chòe-kīn ū siu-kái bô",
-       "watchlistcontains": "Lí ê kàm-sī-toaⁿ siu $1 ia̍h.",
        "wlshowlast": "Hián-sī chêng $1 tiám-cheng $2 ji̍t $3",
        "deletepage": "Thâi ia̍h",
        "confirm": "Khak-tēng",
        "whatlinkshere-next": "{{PLURAL:$1|āu|āu $1 ê}}",
        "whatlinkshere-links": "← Liân kàu chia",
        "blockip": "Hong-só iōng-chiá",
-       "ipadressorusername": "IP Chū-chí a̍h iōng-chiá miâ:",
+       "ipaddressorusername": "IP Chū-chí a̍h iōng-chiá miâ:",
        "ipbreason": "Lí-iû:",
        "ipbsubmit": "Hong-só chit ūi iōng-chiá",
        "badipaddress": "Bô-hāu ê IP chū-chí",
        "autosumm-blank": "Kā ia̍h ê loē-iông the̍h tiāu",
        "autoredircomment": "Choán khì [[$1]]",
        "autosumm-new": "Sin ia̍h: $1",
-       "watchlistedit-numitems": "Lí ê kàm-sī-toaⁿ ū $1 ia̍h, thó-lūn-ia̍h bô sǹg chāi-lāi.",
        "watchlistedit-normal-submit": "Mài kàm-sī",
        "watchlistedit-normal-done": "Í-keng ū $1 ia̍h ùi lí ê kám-sī-toaⁿ soá cháu:",
        "watchlisttools-edit": "Khoàⁿ koh kái kàm-sī-toaⁿ",
index d1d2251..9d0feae 100644 (file)
@@ -8,7 +8,8 @@
                        "E. abu Filumena",
                        "PiRSquared17",
                        "SabineCretella",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Sottolinia 'e jonte:",
@@ -20,7 +21,6 @@
        "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-rememberpassword": "Ricurda 'a registrazzione pe' cchiu sessione (ppe 'numassimo 'e $1 {{PLURAL:$1|juorno|juorne}})",
        "underline-always": "Sèmpe",
        "underline-never": "Màje",
        "sunday": "dumméneca",
        "recentchanges-label-newpage": "Chista modifica ha criato 'na nova paggena",
        "recentchanges-label-minor": "Chisto è nu cagnamiénto piccerillo",
        "recentchanges-label-unpatrolled": "Chista modifica nun è stata 'ncora verificata",
-       "rclistfrom": "Faje vedé 'e cagnamiénte fatte a partì 'a $1",
+       "rclistfrom": "Faje vedé 'e cagnamiénte fatte a partì 'a $3 $2",
        "rcshowhideminor": "$1 'e cagnamiénte piccerille",
        "rcshowhidebots": "$1 'e bot",
        "rcshowhideliu": "$1 ll'utente reggìstrate",
index 7908796..e49fb90 100644 (file)
@@ -39,7 +39,8 @@
                        "Stigmj",
                        "Teak",
                        "Wouterkoch",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Strek under lenker:",
@@ -47,7 +48,7 @@
        "tog-hidepatrolled": "Skjul patruljerte redigeringer i siste endringer",
        "tog-newpageshidepatrolled": "Skjul patruljerte sider fra listen over nye sider",
        "tog-extendwatchlist": "Utvid overvåkningslisten til å vise alle endringer, ikke bare de siste",
-       "tog-usenewrc": "Gruppeendringer per side i siste endringer samt overvåkingsliste",
+       "tog-usenewrc": "Grupper endringer etter side i siste endringer og overvåkingslisten",
        "tog-numberheadings": "Autonummerer overskrifter",
        "tog-showtoolbar": "Vis verktøylinje",
        "tog-editondblclick": "Rediger sider ved å dobbeltklikke",
        "permalink": "Permanent lenke",
        "print": "Skriv ut",
        "view": "Vis",
-       "view-foreign": "Se på $1",
+       "view-foreign": "Vis på $1",
        "edit": "Rediger",
        "edit-local": "Rediger lokal beskrivelse",
        "create": "Opprett",
        "jumptonavigation": "navigasjon",
        "jumptosearch": "søk",
        "view-pool-error": "Beklager, serverne er overbelastet for øyeblikket.\nFor mange brukere forsøker å se denne siden.\nVennligst vent en stund før du prøver å besøke denne siden på nytt.\n\n$1",
+       "generic-pool-error": "Beklager, serverne er overbelastet for øyeblikket.\nFor mange brukere forsøker å se denne ressursen.\nVennligst vent en stund før du forøker å laste denne ressursen på nytt.",
        "pool-timeout": "Tidsavbudd mens man ventet på låsing",
        "pool-queuefull": "Prosesskøen er full",
        "pool-errorunknown": "Ukjent feil",
        "readonly_lag": "Databasen er automatisk skrivebeskyttet så slavetjenerne kan ta igjen mestertjeneren",
        "internalerror": "Intern feil",
        "internalerror_info": "Intern feil: $1",
-       "fileappenderrorread": "Klarte ikke å lese «$1» når data skulle tilføyes.",
-       "fileappenderror": "Kunne ikke legge «$1» til «$2».",
        "filecopyerror": "Klarte ikke å kopiere filen «$1» til «$2».",
        "filerenameerror": "Klarte ikke å døpe om filen «$1» til «$2».",
        "filedeleteerror": "Klarte ikke å slette filen «$1».",
        "directorycreateerror": "Klarte ikke å opprette mappe «$1».",
        "filenotfound": "Klarte ikke å finne filen «$1».",
-       "fileexistserror": "Klarte ikke å skrive til filen «$1»: filen finnes fra før",
        "unexpected": "Uventet verdi: «$1»=«$2».",
        "formerror": "Feil: klarte ikke å sende skjema",
        "badarticleerror": "Handlingen kan ikke utføres på denne siden.",
        "userlogin-helplink2": "Hjelp med innlogging",
        "userlogin-loggedin": "Du er allerede logget inn som {{GENDER:$1|$1}}.\nBruk skjemaet nedenfor for å logge inn som en annen bruker.",
        "userlogin-createanother": "Opprett ny konto",
-       "createacct-join": "Skriv inn informasjonen din under.",
-       "createacct-another-join": "Legg inn den nye kontoens informasjon under.",
        "createacct-emailrequired": "E-postadresse",
        "createacct-emailoptional": "E-postadresse (valgfritt)",
        "createacct-email-ph": "Skriv inn e-postadressen din",
        "savearticle": "Lagre siden",
        "preview": "Forhåndsvisning",
        "showpreview": "Forhåndsvisning",
-       "showlivepreview": "Levende forhåndsvisning",
        "showdiff": "Vis endringer",
        "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.''",
        "edit-gone-missing": "Kunne ikke oppdatere siden fordi den har blitt slettet.",
        "edit-conflict": "Redigeringskonflikt.",
        "edit-no-change": "Redigeringen din ble ignorert fordi det ikke var noen endringer.",
-       "postedit-confirmation": "Redigeringen din ble lagret.",
+       "postedit-confirmation-created": "Siden har blitt opprettet.",
+       "postedit-confirmation-restored": "Siden har blitt gjenopprettet.",
+       "postedit-confirmation-saved": "Redigeringen din ble lagret.",
        "edit-already-exists": "Kunne ikke opprette ny side fordi den finnes fra før.",
        "defaultmessagetext": "Standard meldingstekst",
        "content-failed-to-parse": "Klarte ikke å tolke innholdet $2 for innholdsmodellen $1: $3",
        "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",
        "expansion-depth-exceeded-category": "Sider hvor hvor ekspansjonsdybden er overskredet",
+       "expansion-depth-exceeded-category-desc": "Dette er en kategori for sider hvor ekspansjonsdybden er overskredet.",
        "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)",
        "searchmenu-exists": "* Siden '''[[$1]]'''",
        "searchmenu-new": "'''Opprett siden ''[[:$1]]'' på denne wikien.'''\n<strong>Opprett siden \"[[:$1]]\" på denne wikien!</strong> {{PLURAL:$2|0=|Se også siden oppnådd gjennom søket ditt.|Se også de oppnådde søkeresultatene.}}",
        "searchprofile-articles": "Innholdssider",
-       "searchprofile-project": "Hjelp- og prosjektsider",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Alt",
        "searchprofile-advanced": "Avansert",
        "searchprofile-articles-tooltip": "Søk i $1",
-       "searchprofile-project-tooltip": "Søk i $1",
        "searchprofile-images-tooltip": "Søk etter filer",
        "searchprofile-everything-tooltip": "Søk i alt innhold (inkldert diskusjonssider)",
        "searchprofile-advanced-tooltip": "Søk i visse navnerom",
        "search-nonefound": "Ingen resultater passet til søket.",
        "powersearch-legend": "Avansert søk",
        "powersearch-ns": "Søk i navnerom:",
-       "powersearch-redir": "Vis omdirigeringer",
        "powersearch-togglelabel": "Merk:",
        "powersearch-toggleall": "Alle",
        "powersearch-togglenone": "Ingen",
        "prefs-emailconfirm-label": "E-postbekreftelse:",
        "youremail": "E-post:",
        "username": "{{GENDER:$1|Brukernavn}}:",
-       "uid": "{{GENDER:$1|Bruker-ID}}:",
        "prefs-memberingroups": "{{GENDER:$2|Medlem}} i følgende {{PLURAL:$1|gruppe|grupper}}:",
        "prefs-registration": "Registreringstid:",
        "yourrealname": "Virkelig navn:",
        "prefs-advancedsearchoptions": "Avanserte alternativer",
        "prefs-advancedwatchlist": "Avanserte alternativer",
        "prefs-displayrc": "Visningsalternativer",
-       "prefs-displaysearchoptions": "Visningsalternativer",
        "prefs-displaywatchlist": "Visningsalternativer",
        "prefs-tokenwatchlist": "Merke",
        "prefs-diffs": "Forskjeller",
        "right-move": "Flytte sider",
        "right-move-subpages": "Flytte sider med undersider",
        "right-move-rootuserpages": "Flytte hovedbrukersider",
+       "right-move-categorypages": "Flytte kategorisider",
        "right-movefile": "Flytte filer",
        "right-suppressredirect": "Behøver ikke å opprette omdirigeringer ved sideflytting",
        "right-upload": "Laste opp filer",
        "action-createpage": "opprette sider",
        "action-createtalk": "opprette diskusjonssider",
        "action-createaccount": "opprette denne kontoen",
+       "action-history": "se historikken til denne siden",
        "action-minoredit": "merke denne redigeringen som mindre",
        "action-move": "flytte denne siden",
        "action-move-subpages": "flytte denne siden og dens undersider",
        "action-move-rootuserpages": "flytte hovedbrukersider",
+       "action-move-categorypages": "flytte kategorisider",
        "action-movefile": "flytte denne filen",
        "action-upload": "laste opp denne filen",
        "action-reupload": "overskrive den nåværende filen",
        "recentchanges-legend-newpage": "(se også [[Special:NewPages|liste av nye sider]])",
        "recentchanges-legend-plusminus": "«(±123)»",
        "rcnotefrom": "Nedenfor er endringene gjort siden <strong>$2</strong> (frem til <strong>$1</strong> vises).",
-       "rclistfrom": "Vis nye endringer med start fra $1",
+       "rclistfrom": "Vis nye endringer fra og med $3 $2",
        "rcshowhideminor": "$1 mindre endringer",
        "rcshowhideminor-show": "Vis",
        "rcshowhideminor-hide": "Skjul",
        "uploadstash-refresh": "Oppdater listen over filer",
        "invalid-chunk-offset": "Ugyldig delforskyvning",
        "img-auth-accessdenied": "Ingen tilgang",
-       "img-auth-nopathinfo": "Manglende PATH_INFO.\nTjeneren din er ikke satt opp til å gi denne informasjonen.\nDen er kanskje CGI-basert og støtter ikke img_auth.\nhttps://www.mediawiki.org/wiki/Manual:Image_Authorization Se bildeautorisasjon.",
+       "img-auth-nopathinfo": "Manglende PATH_INFO.\nTjeneren din er ikke satt opp til å gi denne informasjonen.\nDen er kanskje CGI-basert og støtter ikke img_auth.\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization Se bildeautorisasjon.",
        "img-auth-notindir": "Den ønskede stien finnes ikke i den oppsatte opplastingsmappa.",
        "img-auth-badtitle": "Kunne ikke lage en gyldig tittel ut fra «$1».",
        "img-auth-nologinnWL": "Du er ikke logget inn, og «$1» er ikke på hvitelista.",
        "pageswithprop-prophidden-binary": "skjult verdi for binæregenskap ($1)",
        "doubleredirects": "Doble omdirigeringer",
        "doubleredirectstext": "Denne siden lister opp de sidene som er omdirigeringer til andre omdirigeringssider.\nHver rad inneholder lenker til første og andre omdirigering, samt målet for den andre omdirigeringen, som vanligvis er den «virkelige» målsiden som den første omdirigeringen burde peke til.\n<del>Gjennomstrøkne</del> sider har blitt fikset.",
-       "double-redirect-fixed-move": "[[$1]] har blitt flyttet, og er nå en omdirigering til [[$2]]",
-       "double-redirect-fixed-maintenance": "Fikser dobbel omdirigering fra [[$1]] til [[$2]].",
+       "double-redirect-fixed-move": "[[$1]] har blitt flyttet.\nDen ble automatisk oppdatert og er nå en omdirigering til [[$2]].",
+       "double-redirect-fixed-maintenance": "Fikser automatisk dobbel omdirigering fra [[$1]] til [[$2]] som en del av en vedlikeholdsoppgave.",
        "double-redirect-fixer": "Omdirigeringsfikser",
        "brokenredirects": "Brutte omdirigeringer",
        "brokenredirectstext": "Følgende omdirigeringer peker til ikkeeksisterende sider:",
        "log-title-wildcard": "Søk i titler som starter med denne teksten",
        "showhideselectedlogentries": "Vis/skjul de valgte logghendelsene",
        "allpages": "Alle sider",
-       "alphaindexline": "$1 til $2",
        "nextpage": "Neste side ($1)",
        "prevpage": "Forrige side ($1)",
        "allpagesfrom": "Vis sider fra og med:",
        "listgrouprights-namespaceprotection-namespace": "Navnerom",
        "listgrouprights-namespaceprotection-restrictedto": "Rettighet(er) som tillater at brukeren redigerer",
        "trackingcategories": "Sporingskategori",
-       "trackingcategories-summary": "Denne siden lister sporingskategorier som er automatisk befolket av Mediawiki-programvaren. Deres navn kan bli endret ved å redigere de tilhørende systembeskjedene i {{ns:8}}-navnerommet.",
+       "trackingcategories-summary": "Denne siden lister sporingskategorier som er automatisk befolket av Mediawiki-programvaren. Navnene deres kan endres ved å redigere de tilhørende systembeskjedene i {{ns:8}}-navnerommet.",
        "trackingcategories-msg": "Sporingskategori",
        "trackingcategories-name": "Beskjednavn",
        "trackingcategories-desc": "Kategori-inklusjonskriterium",
        "watchnologin": "Ikke logget inn",
        "addwatch": "Legg til i overvåkningslisten",
        "addedwatchtext": "Siden «[[:$1]]» er lagt til [[Special:Watchlist|overvåkningslisten]] din.\nFremtidige endringer til denne siden og den tilhørende diskusjonssiden blir listet opp der.",
+       "addedwatchtext-short": "Siden «$1» har blitt lagt til i overvåkningslisten din.",
        "removewatch": "Fjern fra overvåkningslisten",
        "removedwatchtext": "Siden «[[:$1]]» er fjernet fra [[Special:Watchlist|overvåkningslisten din]].",
+       "removedwatchtext-short": "Siden «$1» har blitt fjernet fra overvåkningslisten din.",
        "watch": "Overvåk",
        "watchthispage": "Overvåk denne siden",
        "unwatch": "Avslutt overvåkning",
        "watchlist-details": "{{PLURAL:$1|Én side|$1 sider}} på din overvåkningsliste, teller ikke 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'''",
-       "watchmethod-recent": "sjekker siste endringer for sider i overvåkningslisten",
-       "watchmethod-list": "sjekker siste endringer for sider i overvåkningslisten",
-       "watchlistcontains": "Overvåkningslisten inneholder $1 {{PLURAL:$1|side|sider}}.",
-       "iteminvalidname": "Problem med «$1», ugyldig navn&nbsp;…",
        "wlnote2": "Nedenfor er endringene {{PLURAL:$1|den siste timen|de siste <strong>$1</strong> timene}}, per $2 $3.",
        "wlshowlast": "Vis siste $1 timer $2 dager $3",
        "watchlist-options": "Alternativ for overvåkningslisten",
        "enotif_lastvisited": "Se $1 for alle endringer siden ditt forrige besøk.",
        "enotif_lastdiff": "Se $1 for å se denne endringen.",
        "enotif_anon_editor": "anonym bruker $1",
-       "enotif_body": "Kjære $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nRedigeringssammendrag: $PAGESUMMARY $PAGEMINOREDIT\n\nKontakt brukeren:\ne-post: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nDet vil ikke komme flere varsler om endringer på denne siden med mindre du besøker den mens du er innlogget. Du kan også fjerne varslingsflagg for alle overvåkede sider i overvåkningslisten din.\n\n             Ditt vennlige varslingssystem for {{SITENAME}}\n\n--\nFor å endre innstillingene for e-postvarsler, se\n{{canonicalurl:{{#special:Preferences}}}}\n\nFor å endre innstillingene for overvåkningslisten, se\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nFor å slette en side fra overvåkningssiden, se\n$UNWATCHURL\n\nTilbakemelding og videre assistanse:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Kjære $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nRedigeringssammendrag: $PAGESUMMARY $PAGEMINOREDIT\n\nKontakt brukeren:\ne-post: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nDet vil ikke komme flere varsler om endringer på denne siden med mindre du besøker den mens du er innlogget. Du kan også fjerne varslingsflagg for alle overvåkede sider i overvåkningslisten din.\n\n             Ditt vennlige varslingssystem for {{SITENAME}}\n\n--\nFor å endre innstillingene for e-postvarsler, se\n{{canonicalurl:{{#special:Preferences}}}}\n\nFor å endre innstillingene for overvåkningslisten, se\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nFor å slette en side fra overvåkningssiden, se\n$UNWATCHURL\n\nTilbakemelding og videre assistanse:\n$HELPPAGE",
        "created": "opprettet",
        "changed": "endret",
        "deletepage": "Slett side",
        "blockip": "Blokker 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.",
-       "ipadressorusername": "IP-adresse eller brukernavn",
+       "ipaddressorusername": "IP-adresse eller brukernavn",
        "ipbexpiry": "Varighet:",
        "ipbreason": "Årsak:",
        "ipbreason-dropdown": "*Vanlige blokkeringsgrunner\n** Legger inn feilinformasjon\n** Fjerner innhold fra sider\n** Lenkespam\n** Legger inn vås\n** Truende oppførsel\n** Misbruk av flere kontoer\n** Uakseptabelt brukernavn",
        "movepagetalktext": "Den tilhørende diskusjonssiden vil automatisk bli flyttet sammen med siden '''med mindre:'''\n*Det allerede finnes en diskusjonsside som ikke er tom under det nye navnet, eller\n*Du fjerner markeringen i boksen nedenfor.\n\nI disse tilfellene er du nødt til å flytte eller flette siden manuelt, om ønskelig.",
        "movearticle": "Flytt side:",
        "moveuserpage-warning": "'''Advarsel:''' Du er i ferd med å flytte en brukerside. Merk at kun siden vil bli flyttet; brukernavnet vil ''ikke'' bli endret.",
+       "movecategorypage-warning": "<strong>Advarsel:</strong> Du er i ferd med å flytte en kategoriside. Merk at kun siden blir flyttet, og at sider i det gamle kategorinavnet <em>ikke</em> blir omkategorisert til det nye navnet.",
        "movenologintext": "Du må være registrert bruker og være [[Special:UserLogin|logget på]] for å flytte en side.",
        "movenotallowed": "Du har ikke tillatelse til å flytte sider.",
        "movenotallowedfile": "Du har ikke tillatelse til å flytte filer.",
        "cant-move-user-page": "Du har ikke tillatelse til å flytte brukersider (bortsett fra undersider).",
        "cant-move-to-user-page": "Du har ikke tillatelse til å flytte brukersider (bortsett fra undersider).",
+       "cant-move-category-page": "Du har ikke tillatelse til å flytte kategorisider.",
+       "cant-move-to-category-page": "Du har ikke tillatelse til å flytte en side til en kategoriside.",
        "newtitle": "Til ny tittel:",
        "move-watch": "Overvåk kilde- og målsiden",
        "movepagebtn": "Flytt side",
        "tooltip-undo": "«Angre» tilbakestiller denne endringen og åpner redigeringsskjemaet i forhåndsvisningsmodus. Det tillater en å legge til en begrunnelse i redigeringsforklaringen.",
        "tooltip-preferences-save": "Lagre innstillinger",
        "tooltip-summary": "Skriv et kort sammendrag",
-       "interlanguage-link-title": "$1 &ndash; $2",
+       "interlanguage-link-title": "$1  $2",
        "common.css": "/* CSS plassert i denne fila vil gjelde for alle utseender. */",
-       "cologneblue.css": "/* CSS i denne fila vil gjelde alle som bruker drakta Kølnerblå */",
        "monobook.css": "/* CSS i denne fila vil gjelde alle som bruker drakta Monobook */",
-       "modern.css": "/* CSS i denne fila vil gjelde alle som bruker drakta Modern */",
        "common.js": "/* Javascript i denne fila vil gjelde for alle drakter. */",
-       "cologneblue.js": "/* Javascript i denne fila vil gjelde for brukere av drakta Kølnerblå */",
        "monobook.js": "/* Javascript i denne fila vil gjelde for brukere av drakta Monobook */",
-       "modern.js": "/* Javascript i denne fila vil gjelde for brukere av drakta Modern */",
-       "notacceptable": "Tjeneren har ingen mulige måter å vise data i din nettleser.",
        "anonymous": "{{PLURAL:$1|Anonym bruker|Anonyme brukere}} av {{SITENAME}}",
        "siteuser": "{{SITENAME}}-bruker $1",
        "anonuser": "{{SITENAME}}s anonyme bruker $1",
        "pageinfo-category-pages": "Antall sider",
        "pageinfo-category-subcats": "Antall underkategorier",
        "pageinfo-category-files": "Antall filer",
-       "skinname-cologneblue": "Kølnerblå",
        "skinname-monobook": "Monobook",
-       "skinname-modern": "Moderne",
        "markaspatrolleddiff": "Merk som patruljert",
        "markaspatrolledtext": "Merk denne siden som patruljert",
        "markedaspatrolled": "Merket som patruljert",
        "newimages-summary": "Denne spesialsiden viser de sist opplastede filene.",
        "newimages-legend": "Filnavn",
        "newimages-label": "Filnavn (helt eller delvis):",
-       "showhidebots": "($1 roboter)",
+       "newimages-showbots": "Vis opplastinger av botter",
        "noimages": "Ingenting å se.",
        "ilsubmit": "Søk",
        "bydate": "etter dato",
        "autosumm-replace": "Erstatter siden med «$1»",
        "autoredircomment": "Omdirigerer til [[$1]]",
        "autosumm-new": "Ny side: $1",
-       "livepreview-loading": "Laster…",
-       "livepreview-ready": "Laster&nbsp;… Klar!",
-       "livepreview-failed": "Levende forhåndsvisning mislyktes. Prøv vanlig forhåndsvisning.",
-       "livepreview-error": "Tilkobling mislyktes: $1 «$2»\nPrøv vanlig forhåndsvisning.",
        "lag-warn-normal": "Endringer nyere enn $1 {{PLURAL:$1|sekund|sekunder}} vises muligens ikke i denne listen.",
        "lag-warn-high": "På grunn av stor databaseforsinkelse, vil ikke endringer som er nyere enn $1 {{PLURAL:$1|sekund|sekunder}} vises i denne listen.",
-       "watchlistedit-numitems": "Overvåkningslisten din inneholder {{PLURAL:$1|én tittel|$1 titler}}, ikke inkludert diskusjonssider.",
-       "watchlistedit-noitems": "Overvåkningslisten din inneholder ingen titler.",
        "watchlistedit-normal-title": "Rediger overvåkningsliste",
        "watchlistedit-normal-legend": "Fjern titler fra overvåkninglisten",
        "watchlistedit-normal-explain": "Titler på overvåkningslisten din vises nedenfor.\nFor å fjerne en tittel, merk av boksen ved siden av den og klikk på «{{int:Watchlistedit-normal-submit}}».\nDu kan også [[Special:EditWatchlist/raw|redigere den rå overvåkningslisten]].",
        "watchlistedit-raw-done": "Overvåkningslisten din er oppdatert.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Én tittel|$1 titler}} ble lagt til:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Én tittel|$1 titler}} ble fjernet:",
+       "watchlistedit-clear-title": "Rensket overvåkningslisten",
+       "watchlistedit-clear-legend": "Rensk overvåkninslisten",
+       "watchlistedit-clear-explain": "Alle titlene blir fjernet fra overvåkningslisten din",
+       "watchlistedit-clear-titles": "Titler:",
+       "watchlistedit-clear-submit": "Rensk overvåkningslisten (dette er permanent!)",
+       "watchlistedit-clear-done": "Overvåkningslisten din har blitt rensket.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|Én tittel|$1 titler}} ble fjernet:",
+       "watchlistedit-too-many": "Det er for mange sider til å vise dem her.",
+       "watchlisttools-clear": "Rensk overvåkningslisten",
        "watchlisttools-view": "Vis relevante endringer",
        "watchlisttools-edit": "Vis og rediger overvåkningsliste",
        "watchlisttools-raw": "Rediger rå overvåkningsliste",
        "compare-invalid-title": "Tittelen du oppga er ugyldig.",
        "compare-title-not-exists": "Tittelen du oppga eksisterer ikke.",
        "compare-revision-not-exists": "Versjonen du oppga eksisterer ikke.",
-       "dberr-header": "Wikien har et problem",
        "dberr-problems": "Siden har tekniske problemer.",
        "dberr-again": "Prøv å oppdatere siden om noen minutter.",
        "dberr-info": "(Kan ikke kontakte databasetjeneren: $1)",
        "htmlform-no": "Nei",
        "htmlform-yes": "Ja",
        "htmlform-chosen-placeholder": "Velg et alternativ",
+       "htmlform-cloner-create": "Legg til mer",
+       "htmlform-cloner-delete": "Fjern",
+       "htmlform-cloner-required": "Minst én verdi kreves.",
        "sqlite-has-fts": "$1 med støtte for fulltekstsøk",
        "sqlite-no-fts": "$1 uten støtte for fulltekstsøk",
        "logentry-delete-delete": "$1 {{GENDER:$2|slettet}} siden $3",
index ec46435..1fc788b 100644 (file)
@@ -13,7 +13,8 @@
                        "Slomox",
                        "Urhixidur",
                        "Ævar Arnfjörð Bjarmason <avarab@gmail.com>",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Verwiezingen onderstrepen",
        "readonly_lag": "De databanke is automaties beveilig, zodat de ondergeschikten servers zich kunnen synchroniseren mit de sentrale server.",
        "internalerror": "Interne fout",
        "internalerror_info": "Interne fout: $1",
-       "fileappenderrorread": "\"$1\" kon niet elezen wörden tiejens t inlaojen.",
-       "fileappenderror": "Kon \"$1\" niet bie \"$2\" doon.",
        "filecopyerror": "Kon bestaand \"$1\" niet naor \"$2\" kopiëren.",
        "filerenameerror": "Bestaandsnaamwieziging \"$1\" naor \"$2\" niet meugelik.",
        "filedeleteerror": "Kon bestaand \"$1\" niet vortdoon.",
        "directorycreateerror": "Map \"$1\" kon niet an-emaakt wörden.",
        "filenotfound": "Kon bestaand \"$1\" niet vienen.",
-       "fileexistserror": "Kon niet schrieven naor t bestaand \"$1\": t bestaand besteet al",
        "unexpected": "Onverwachten weerde: \"$1\"=\"$2\".",
        "formerror": "Fout: kon formulier niet versturen",
        "badarticleerror": "Disse haandeling kan op disse zied niet uutevoerd wörden.",
        "userlogin-resetpassword-link": "Joew wachtwoord vergeten?",
        "userlogin-loggedin": "Je bin al an-emeld as {{GENDER:$1|$1}}.\nGebruuk t onderstaonde formulier um an te melden as n aandere gebruker.",
        "userlogin-createanother": "n Aandere gebrukerskonto anmaken",
-       "createacct-join": "Geef joew gegevens hieronder op.",
-       "createacct-another-join": "Vul hieronder de informasie van de nieje gebruker in.",
        "createacct-emailrequired": "Netpostadres",
        "createacct-emailoptional": "Netpostadres (niet verplicht)",
        "createacct-email-ph": "Geef joew netpostadres op",
        "savearticle": "Zied opslaon",
        "preview": "Naokieken",
        "showpreview": "Bewarking naokieken",
-       "showlivepreview": "Drekte weergave",
        "showdiff": "Verschil bekieken",
        "anoneditwarning": "'''Waorschuwing:''' je bin niet an-emeld.\nJoew IP-adres zal op-esleugen wörden a'j wiezigingen op disse zied anbrengen.",
        "anonpreviewwarning": "''Je bin niet an-emeld.''\n''Deur de bewarking op te slaon wörden joew IP-adres op-esleugen in de ziedgeschiedenisse.''",
        "edit-gone-missing": "De zied kon niet bie-ewörken wörden.\nt Schient dat t vortedaon is.",
        "edit-conflict": "Tegelieke bewörken.",
        "edit-no-change": "Joew bewarking is enegeerd, umdat der gien wieziging an de tekste edaon is.",
-       "postedit-confirmation": "Joew bewarking is op-esleugen",
+       "postedit-confirmation-saved": "Joew bewarking is op-esleugen",
        "edit-already-exists": "De zied kon niet an-emaakt wörden.\nt Besteet al.",
        "defaultmessagetext": "Standardtekste",
        "content-failed-to-parse": "Kon de inhoud van t MIME-type $2 veur t model $1 niet verwarken: $3.",
        "search-nonefound": "Der bin gien resultaoten veur de zeukopdrachte.",
        "powersearch-legend": "Uutebreid zeuken",
        "powersearch-ns": "Zeuken in naamruumten:",
-       "powersearch-redir": "Deurverwiezingen bekieken",
        "powersearch-togglelabel": "Selekteren:",
        "powersearch-toggleall": "Alle",
        "powersearch-togglenone": "Gien",
        "prefs-emailconfirm-label": "Netpostbevestiging:",
        "youremail": "Netpostadres (niet verplicht) *",
        "username": "{{GENDER:$1|Gebrukersnaam}}:",
-       "uid": "{{GENDER:$1|Gebrukersnummer}}:",
        "prefs-memberingroups": "{{GENDER:$2|Lid}} van {{PLURAL:$1|groep|groepen}}:",
        "prefs-registration": "Registrasiedaotum:",
        "yourrealname": "Echte naam (niet verplicht)",
        "prefs-advancedsearchoptions": "Aandere instellingen",
        "prefs-advancedwatchlist": "Aandere instellingen",
        "prefs-displayrc": "Weergave-instellingen",
-       "prefs-displaysearchoptions": "Weergave-instellingen",
        "prefs-displaywatchlist": "Weergave-instellingen",
        "prefs-tokenwatchlist": "Token",
        "prefs-diffs": "Verschillen",
        "recentchanges-label-plusminus": "Disse ziedgrootte is mit dit antal bytes ewiezigd",
        "recentchanges-legend-newpage": "(zie oek de [[Special:NewPages|lieste mit nieje ziejen]])",
        "rcnotefrom": "Dit bin de wiezigingen sinds <strong>$2</strong> (maximum van <strong>$1</strong> wiezigingen).",
-       "rclistfrom": "Bekiek wiezigingen vanaof $1",
+       "rclistfrom": "Bekiek wiezigingen vanaof $3 $2",
        "rcshowhideminor": "$1 kleine wiezigingen",
+       "rcshowhideminor-show": "Bekieken",
+       "rcshowhideminor-hide": "Verbargen",
        "rcshowhidebots": "$1 botgebrukers",
+       "rcshowhidebots-show": "Bekieken",
+       "rcshowhidebots-hide": "Verbargen",
        "rcshowhideliu": "$1 eregistreerden gebrukers",
+       "rcshowhideliu-show": "Bekieken",
+       "rcshowhideliu-hide": "Verbargen",
        "rcshowhideanons": "$1 anonieme gebrukers",
+       "rcshowhideanons-show": "Bekieken",
+       "rcshowhideanons-hide": "Verbargen",
        "rcshowhidepatr": "$1 nao-ekeken bewarkingen",
+       "rcshowhidepatr-show": "Bekieken",
+       "rcshowhidepatr-hide": "Verbargen",
        "rcshowhidemine": "$1 mien bewarkingen",
+       "rcshowhidemine-show": "Bekieken",
+       "rcshowhidemine-hide": "Verbargen",
        "rclinks": "Bekiek de leste $1 wiezigingen van de aofgeleupen $2 dagen<br />$3",
        "diff": "wiezig",
        "hist": "gesch",
        "uploadstash-refresh": "Lieste mit bestaanden biewarken",
        "invalid-chunk-offset": "Ongeldig startpunt",
        "img-auth-accessdenied": "Toegang eweigerd",
-       "img-auth-nopathinfo": "PATH_INFO ontbrik.\nJoew server is niet in-esteld um disse informasie deur te geven.\nMisschien gebruukt t CGI, en dan wörden img_auth niet ondersteund.\nZie https://www.mediawiki.org/wiki/Manual:Image_Authorization veur meer informasie.",
+       "img-auth-nopathinfo": "PATH_INFO ontbrik.\nJoew server is niet in-esteld um disse informasie deur te geven.\nMisschien gebruukt t CGI, en dan wörden img_auth niet ondersteund.\nZie https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization veur meer informasie.",
        "img-auth-notindir": "t Op-evreugen pad is niet bekend in de in-estelden inlaojmap",
        "img-auth-badtitle": "Kon gien geldige ziednaam maken van \"$1\".",
        "img-auth-nologinnWL": "Je bin niet an-emeld en \"$1\" steet niet op de witte lieste.",
        "log-title-wildcard": "Zeuk naor titels die beginnen mit disse tekste:",
        "showhideselectedlogentries": "Ekeuzen logboekregels laoten zien of verbargen",
        "allpages": "Alle ziejen",
-       "alphaindexline": "$1 tot $2",
        "nextpage": "Volgende zied ($1)",
        "prevpage": "Veurige zied ($1)",
        "allpagesfrom": "Laot ziejen zien vanaof:",
        "watchlist-details": "Der {{PLURAL:$1|steet één zied|staon $1 ziejen}} op joew volglieste, zonder de overlegziejen mee-erekend.",
        "wlheader-enotif": "Je kriegen bericht per netpost",
        "wlheader-showupdated": "Ziejen die sinds joew leste bezeuk bie-ewörken bin, staon '''vet-edrokt'''.",
-       "watchmethod-recent": "leste wiezigingen an t naokieken op ziejen die'j volgen",
-       "watchmethod-list": "Kik joew nao volglieste veur de leste wiezigingen",
-       "watchlistcontains": "Der {{PLURAL:$1|steet 1 zied|staon $1 ziejen}} op joew volglieste.",
-       "iteminvalidname": "Verkeerde naam '$1'",
        "wlshowlast": "Laot de veurbieje $1 uur $2 dagen $3 zien",
        "watchlist-options": "Opsies veur de volglieste",
        "watching": "Volg...",
        "enotif_lastvisited": "Zie $1 veur alle wiezigingen sinds joew leste bezeuk.",
        "enotif_lastdiff": "Zie $1 um disse wieziging te bekieken.",
        "enotif_anon_editor": "anonieme gebruker $1",
-       "enotif_body": "Huj $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nSamenvatting van de wieziging: $PAGESUMMARY $PAGEMINOREDIT\n\nKontaktgevevens van de auteur:\nNetpost: $PAGEEDITOR_EMAIL\nWiki: $PAGEEDITOR_WIKI\n\nJe kriegen veerder gien berichten, behalven a'j disse zied bezeuken terwiel je an-emeld bin. Op joew volglieste ku'j veur alle ziejen die'j volgen de waorschuwingsinstellingen deraof haolen.\n\nGroeten van t {{SITENAME}}-waorschuwingssysteem.\n\n--\nJe kunnen joew netpostinstellingen wiezigen op:\n{{canonicalurl:{{#special:Preferences}}}}\n\nJe kunnen de volgliestinstellingen wiezigen op:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nJe kunnen de zied van joew volglieste aofhaolen deur op de volgende verwiezing te klikken:\n$UNWATCHURL\n\nOpmarkingen en veerdere hulpe:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Huj $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nSamenvatting van de wieziging: $PAGESUMMARY $PAGEMINOREDIT\n\nKontaktgevevens van de auteur:\nNetpost: $PAGEEDITOR_EMAIL\nWiki: $PAGEEDITOR_WIKI\n\nJe kriegen veerder gien berichten, behalven a'j disse zied bezeuken terwiel je an-emeld bin. Op joew volglieste ku'j veur alle ziejen die'j volgen de waorschuwingsinstellingen deraof haolen.\n\nGroeten van t {{SITENAME}}-waorschuwingssysteem.\n\n--\nJe kunnen joew netpostinstellingen wiezigen op:\n{{canonicalurl:{{#special:Preferences}}}}\n\nJe kunnen de volgliestinstellingen wiezigen op:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nJe kunnen de zied van joew volglieste aofhaolen deur op de volgende verwiezing te klikken:\n$UNWATCHURL\n\nOpmarkingen en veerdere hulpe:\n$HELPPAGE",
        "created": "an-emaakt",
        "changed": "ewiezigd",
        "deletepage": "Vortdoon",
        "blockip": "Gebruker blokkeren",
        "blockip-legend": "n Gebruker of IP-adres blokkeren",
        "blockiptext": "Gebruuk dit formulier um n IP-adres of gebrukersnaam te blokkeren. \nt Is bedoeld um vandalisme te veurkoemen en mut akkederen mit t [[{{MediaWiki:Policy-url}}|beleid]]. \nGeef hieronder n reden op (bieveurbeeld op welke ziejen de vandalisme epleegd is).",
-       "ipadressorusername": "IP-adres of gebrukersnaam",
+       "ipaddressorusername": "IP-adres of gebrukersnaam",
        "ipbexpiry": "Verlöp nao",
        "ipbreason": "Reden:",
        "ipbreason-dropdown": "*Algemene redens veur t blokkeren\n** verkeerde informasie invoeren\n** ziejen leegmaken\n** ongewunste verwiezingen plaotsen\n** onzinteksten schrieven\n** targerieje of naor gedrag\n** misbruuk vanaof meerdere profielen\n** ongewunste gebrukersnaam",
        "tooltip-preferences-save": "Vuurkeuren opsloan",
        "tooltip-summary": "Voer ne korte samenvatting in",
        "interlanguage-link-title": "$1 – $2",
-       "notacceptable": "De wikiserver kan de gegevens niet leveren in n vorm die joew kliënt kan lezen.",
        "anonymous": "Anonieme {{PLURAL:$1|gebruker|gebrukers}} van {{SITENAME}}",
        "siteuser": "{{SITENAME}}-gebruker $1",
        "anonuser": "Anonieme {{SITENAME}}-gebruker $1",
        "newimages-summary": "Op disse spesiale zied staon de bestaanden die der as lest bie-ekeumen bin.",
        "newimages-legend": "Bestaandsnaam",
        "newimages-label": "Bestaandsnaam (of deel dervan):",
-       "showhidebots": "(Bots $1)",
        "noimages": "Niks te zien.",
        "ilsubmit": "Zeuk",
        "bydate": "op daotum",
        "autoredircomment": "deurverwiezing naor [[$1]]",
        "autosumm-new": "Nieje zied: '$1'",
        "size-kilobytes": "$1 kB",
-       "livepreview-loading": "An t laojen…",
-       "livepreview-ready": "An t laojen… ree!",
-       "livepreview-failed": "Rechtstreeks naokieken is niet meugelik!\nKiek de zied op de normale maniere nao.",
-       "livepreview-error": "Verbiending niet meugelik: $1 \"$2\"\nKiek de zied op de normale maniere nao.",
        "lag-warn-normal": "Wiezigingen die niejer bin as $1 {{PLURAL:$1|seconde|seconden}} staon misschien nog niet in de lieste.",
        "lag-warn-high": "De databanke is aorig zwaor belast. Wiezigingen die niejer bin as $1 {{PLURAL:$1|sekonde|sekonden}} staon daorumme misschien nog niet in de lieste.",
-       "watchlistedit-numitems": "Der {{PLURAL:$1|steet 1 zied|staon $1 ziejen}} op joew volglieste, zonder overlegziejen.",
-       "watchlistedit-noitems": "Joew volglieste is leeg.",
        "watchlistedit-normal-title": "Volglieste bewarken",
        "watchlistedit-normal-legend": "Disse ziejen van mien volglieste aofhaolen.",
        "watchlistedit-normal-explain": "Ziejen die op joew volglieste staon, zie'j hieronder.\nUm n zied van joew volglieste aof te haolen mu'j t vakjen dernaost anklikken, en klik dan op \"{{int:Watchlistedit-normal-submit}}\".\nJe kunnen oek [[Special:EditWatchlist/raw|de roewe lieste bewarken]].",
        "compare-invalid-title": "De titel die'j op-egeven hebben, is ongeldig.",
        "compare-title-not-exists": "De titel die'j op-egeven hebben, besteet niet.",
        "compare-revision-not-exists": "De versie die'j op-egeven hebben, besteet niet.",
-       "dberr-header": "Disse wiki hef wat kuren",
        "dberr-problems": "t Spiet ons, mer disse webstee hef op t moment wat techniese problemen.",
        "dberr-again": "Wach n paor minuten en probeer t daornao opniej.",
        "dberr-info": "(Kan gien verbiending maken mit de databankeserver: $1)",
index 2f1c2a0..a2f5334 100644 (file)
@@ -9,7 +9,8 @@
                        "The Evil IP address",
                        "Urhixidur",
                        "Zylbath",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Verwies ünnerstrieken",
@@ -22,7 +23,6 @@
        "tog-showtoolbar": "Editeer-Warktüüchlist wiesen",
        "tog-editondblclick": "Sieden mit Dubbelklick ännern (JavaScript)",
        "tog-editsectiononrightclick": "En Afsatz mit en Rechtsklick ännern (Javascript)",
-       "tog-rememberpassword": "Duersam inloggen (för maximaal $1 {{PLURAL:$1|Dag|Daag}})",
        "tog-watchcreations": "Nee schrevene Sieden op miene Oppasslist setten",
        "tog-watchdefault": "Op ne’e un ännerte Sieden oppassen",
        "tog-watchmoves": "Sieden, de ik schuuv, to de Oppasslist todoon",
        "readonly_lag": "De Datenbank is automaatsch sperrt worrn, dat sik de opdeelten Datenbankservers mit den Hööft-Datenbankserver afglieken köönt.",
        "internalerror": "Internen Fehler",
        "internalerror_info": "Internen Fehler: $1",
-       "fileappenderrorread": "$1 kunn nich leest warrn wiel dat Hentofögen.",
-       "fileappenderror": "Dat weer nich mööglich, \"$1\" an \"$2\" totofögen.",
        "filecopyerror": "De Software kunn de Datei ‚$1‘ nich na ‚$2‘ koperen.",
        "filerenameerror": "De Software kunn de Datei ‚$1‘ nich na ‚$2‘ ümnömen.",
        "filedeleteerror": "De Software kunn de Datei ‚$1‘ nich wegsmieten.",
        "directorycreateerror": "Kunn Orner „$1“ nich anleggen.",
        "filenotfound": "De Software kunn de Datei ‚$1‘ nich finnen.",
-       "fileexistserror": "Kunn de Datei „$1“ nich schrieven: de gifft dat al",
        "unexpected": "Unvermoodten Weert: ‚$1‘=‚$2‘.",
        "formerror": "Fehler: De Software kunn dat Formular nich verarbeiden",
        "badarticleerror": "Disse Aktschoon kann op disse Siet nich anwennt warrn.",
        "savearticle": "Siet spiekern",
        "preview": "Vörschau",
        "showpreview": "Vörschau wiesen",
-       "showlivepreview": "Live-Vörschau",
        "showdiff": "Ünnerscheed wiesen",
        "anoneditwarning": "'''Wohrschau:''' Du büst nich anmellt. Diene IP-Adress warrt in de Versionshistorie vun de Siet fasthollen.",
        "anonpreviewwarning": "''Du büst nich anmellt. Wenn du nu afspiekerst, dükert dien IP-Adress in de Versionsgeschicht op.''",
        "search-nonefound": "För de Söökanfraag geev dat keen Resultaten.",
        "powersearch-legend": "Betere Söök",
        "powersearch-ns": "Söök in Naamrüüm:",
-       "powersearch-redir": "Redirects wiesen",
        "powersearch-togglelabel": "Utwählen:",
        "powersearch-toggleall": "All",
        "powersearch-togglenone": "Keen",
        "prefs-advancedsearchoptions": "Anner Instellungen",
        "prefs-advancedwatchlist": "Anner Instellungen",
        "prefs-displayrc": "Weddergaav-Instellungen",
-       "prefs-displaysearchoptions": "Weddergaav-Instellungen",
        "prefs-displaywatchlist": "Weddergaav-Instellungen",
        "prefs-diffs": "Ünnerscheed",
        "email-address-validity-valid": "E-Mail-Adress lett good",
        "recentchanges-label-bot": "Düsse Ännern worr maakt vun en Bot",
        "recentchanges-label-unpatrolled": "Düsse Ännern is noch nich kontrolleert worrn",
        "rcnotefrom": "Dit sünd de Ännern siet <b>$2</b> (bet to <b>$1</b> wiest).",
-       "rclistfrom": "Wies ne’e Ännern siet $1",
+       "rclistfrom": "Wies ne’e Ännern siet $3 $2",
        "rcshowhideminor": "$1 lütte Ännern",
        "rcshowhidebots": "$1 Bots",
        "rcshowhideliu": "$1 inloggte Brukers",
        "watchlist-details": "{{PLURAL:$1|Ene Siet is|$1 Sieden sünd}} op dien Oppasslist (ahn Diskuschoonssieden).",
        "wlheader-enotif": "Benarichtigen per E-Mail is anstellt.",
        "wlheader-showupdated": "Sieden, de siet dien letzten Besöök ännert worrn sünd, warrt '''fett''' wiest.",
-       "watchmethod-recent": "letzte Ännern no Oppasslist pröven",
-       "watchmethod-list": "Oppasslist na letzte Ännern nakieken",
-       "watchlistcontains": "Diene Oppasslist bargt {{PLURAL:$1|ene Siet|$1 Sieden}}.",
-       "iteminvalidname": "Problem mit den Indrag '$1', ungülligen Naam...",
        "wlshowlast": "Wies de letzten $1 Stünnen $2 Daag $3",
        "watchlist-options": "Optionen för de Oppasslist",
        "watching": "warrt op de Oppasslist ropsett...",
        "tooltip-summary": "Giff en korte Tosamenfattung in",
        "common.css": "/** CSS-Kood hier binnen warrt för all Stilvörlagen (Skins) inbunnen */",
        "monobook.css": "/* disse Datei ännern üm de Monobook-Stilvörlaag för de ganze Siet antopassen */",
-       "notacceptable": "Dat Wiki-Server kann kene Daten in enen Format levern, dat dien Klient lesen kann.",
        "anonymous": "{{PLURAL:$1|Anonym Bruker|Anonyme Brukers}} vun {{SITENAME}}",
        "siteuser": "{{SITENAME}}-Bruker $1",
        "anonuser": "{{SITENAME}} anonym  Bruker user $1",
        "autosumm-replace": "Siet leddig maakt un ‚$1‘ rinschreven",
        "autoredircomment": "Redirect sett na [[$1]]",
        "autosumm-new": "Ne’e Sied anleggt: ‚$1‘",
-       "livepreview-loading": "Läädt…",
-       "livepreview-ready": "Läädt… Trech!",
-       "livepreview-failed": "Live-Vörschau klapp nich!\nVersöök de normale Vörschau.",
-       "livepreview-error": "Verbinnen klapp nich: $1 „$2“\nVersöök de normale Vörschau.",
        "lag-warn-normal": "Ännern, de jünger as {{PLURAL:$1|ene Sekunn|$1 Sekunnen}} sünd, warrt in de List noch nich wiest.",
        "lag-warn-high": "De Datenbank is temlich dull utlast. Ännern, de jünger as $1 {{PLURAL:$1|Sekunn|Sekunnen}} sünd, warrt in de List noch nich wiest.",
-       "watchlistedit-numitems": "Du hest {{PLURAL:$1|ene Siet|$1 Sieden}} op diene Oppasslist, Diskuschoonssieden nich tellt.",
-       "watchlistedit-noitems": "Diene Oppasslist is leddig.",
        "watchlistedit-normal-title": "Oppasslist ännern",
        "watchlistedit-normal-legend": "Sieden vun de Oppasslist rünnernehmen",
        "watchlistedit-normal-explain": "Dit sünd all de Sieden op diene Oppasslist. Sieden ruttonehmen, krüüz de Kassens blangen de Sieden an un klick op „{{int:Watchlistedit-normal-submit}}“. Du kannst diene Oppasslist ok in [[Special:EditWatchlist/raw|Listenform ännern]].",
        "compare-rev1": "Version 1",
        "compare-rev2": "Version 2",
        "compare-submit": "Verglieken",
-       "dberr-header": "Dit Wiki hett en Problem",
        "dberr-problems": "Deit uns leed. Disse Websteed hett opstunns en beten technische Problemen.",
        "dberr-again": "Tööv en poor Minuten un versöök dat denn noch wedder.",
        "dberr-info": "(Kunn nich mit’n Datenbank-Server verbinnen: $1)",
index 90a29ab..c05c0dd 100644 (file)
@@ -13,7 +13,8 @@
                        "RajeshPandey",
                        "Reedy",
                        "ne.wikipedia.org sysops",
-                       "सरोज कुमार ढकाल"
+                       "सरोज कुमार ढकाल",
+                       "아라"
                ]
        },
        "tog-underline": "सम्बन्ध निम्न रेखाङ्कन:",
        "tog-hidepatrolled": "गस्ती(patrolled)सम्पादनहरु हालका परिवर्तनहरुमा लुकाउने",
        "tog-newpageshidepatrolled": "गस्ती गरिएका पृष्ठहरू नयाँ पृष्ठ सूचीबाट लुकाउने",
        "tog-extendwatchlist": "निगरानी सूचीलाई सबै परिवर्तनहरू देखाउने गरी बढाउने , हालैको  बाहेक",
-       "tog-usenewrc": "पृष्ठका भर्खरका परिवर्तन र अवलोकन सूचीको आधारमा सामूहिक परिवर्तनहरु ( जाभास्क्रिप्ट चाहिन्छ)",
+       "tog-usenewrc": "पृष्ठका भर्खरका परिवर्तन र अवलोकन सूचीको आधारमा सामूहिक परिवर्तनहरु",
        "tog-numberheadings": "शीर्षकहरुलाई स्वत:अङ्कित गर्नुहोस्",
        "tog-showtoolbar": "सम्पादन औजारबट्टा देखाउने",
        "tog-editondblclick": "दोहोरो क्लिकमा पृष्ठ सम्पादन गर्ने",
        "tog-editsectiononrightclick": "शीर्षकमा दाहिने क्लिकद्वारा खण्ड सम्पादन सक्षम पार्ने",
-       "tog-rememberpassword": "यस ब्राउजरमा मेरो प्रवेशलाई सम्झनुहोस् (अधिकतम $1 {{PLURAL:$1|दिन|दिनहरु}} सम्म)",
        "tog-watchcreations": "मेरो निगरानी सूचीमा मैले सृजना गरेको पृष्ठ र अपलोड जोड्ने",
        "tog-watchdefault": "मैले सम्पादन गरेको पृष्ठ र फाइल निगरानी सूचीमा थप्ने",
        "tog-watchmoves": "मैले सारेका पृष्ठहरू र फाइलहरूलाई निगरानी सूचीमा थप्ने",
        "permalink": "स्थायीलिङ्क",
        "print": "छाप्नुहोस्",
        "view": "अवलोकन गर्ने",
+       "view-foreign": " $1 हेर्नुहोस",
        "edit": "परिवर्तन",
+       "edit-local": "स्थानिय वर्णन सम्पादन गर्नुहोस्",
        "create": "सृजना गर्नुहोस्",
+       "create-local": "स्थानीय वर्णन थप्नुहोस",
        "editthispage": "यो पृष्ठ सम्पादन गर्नुहोस",
        "create-this-page": "यो पृष्ठ बनाउने",
        "delete": "मेट्ने",
        "jumptonavigation": "अन्वेषण",
        "jumptosearch": "खोज्नुहोस्",
        "view-pool-error": "माफ गर्नुहोस् , यस समयमा सर्भरहरुमा कार्यभार उच्च रहेको छ।\nअति धेरै प्रयोगकर्ताहरु यो पृष्ट हेर्ने प्रयास गरी रहनु भएको छ।\nकृपया यो पृष्ठ पुन: हेर्नु अगाडि केही समय पर्खिदिनुहोस् ।\n\n$1",
+       "generic-pool-error": "माफ गर्नुहोस् , यस समयमा सर्भरहरुमा कार्यभार उच्च रहेको छ।\nअति धेरै प्रयोगकर्ताहरु यो पृष्ट हेर्ने प्रयास गरी रहनु भएको छ।\nकृपया यो सामग्री  हेर्नु अगाडि केही समय पर्खिदिनुहोस् ।",
        "pool-timeout": "समय सकियो बन्द गर्ने प्रतीक्षामा",
        "pool-queuefull": "प्रतीक्षा पंक्ति भरियो",
        "pool-errorunknown": "अज्ञात त्रुटि",
        "readonly_lag": "डेटाबेस स्वतः बन्द गरिएकोछ जबकि अधिनस्थ डेटाबेस सर्वरले मूल पहिल्याउँदछ।",
        "internalerror": "आन्तरिक त्रुटि",
        "internalerror_info": "आन्तरिक त्रुटि: $1",
-       "fileappenderrorread": "जोड़ने बेलामा \"$1\" पढ्न सकिएन।",
-       "fileappenderror": " \"$2\".लाई\"$1\" मा जोडन सकिएन ।",
        "filecopyerror": "फाइल  \"$1\" लाई \"$2\" मा प्रतिलिपि गर्न सकिएन ।",
        "filerenameerror": "फाइल \"$1\" को नाम \"$2\" मा परिवर्तन गर्न सकिएन ।",
        "filedeleteerror": "फाइल \"$1\"  मेट्न सकिएन ।",
        "directorycreateerror": "डाइरेक्टरी \"$1\" निर्माण गर्न सकिएन ।",
        "filenotfound": "\"$1\" फाइल भेटिएन ।",
-       "fileexistserror": "फाइल  \"$1 लेख्न सकिएन : फाइल पहिले देखि रहेको छ",
        "unexpected": "अप्रत्यासित मान :\"$1\"=\"$2\" ।",
        "formerror": "त्रुटी : फर्म बुझाउन सकिएन",
        "badarticleerror": "यो कार्य यस पृष्ठमा गर्न मिल्दैन।",
        "userlogin-resetpassword-link": "पासवर्ड भुल्नुभयो?",
        "userlogin-helplink2": "प्रवेश गर्नको लागि सहयोग",
        "userlogin-createanother": "अर्को खाता खोल्नुहोस्",
-       "createacct-join": "तपाईँका जानकारीहरू तल थप्नुहोस् ।",
-       "createacct-another-join": "नयाँ खाताको जानकारी तल थप्नुहोस ।",
        "createacct-emailrequired": "इमेल ठेगाना",
        "createacct-emailoptional": "इमेल ठेगाना (ऐच्छिक)",
        "createacct-email-ph": "तपाईँको इमेल ठेगाना भर्नुहोस्",
        "savearticle": "संग्रह गर्ने",
        "preview": "पूर्वावलोकन",
        "showpreview": "पूर्वालोकन देखाउनुहोस्",
-       "showlivepreview": "प्रत्यक्ष पूर्वालोकन",
        "showdiff": "परिवर्तन देखाउनुहोस्",
        "anoneditwarning": "'''चेतावनी:''' तपाईँले प्रवेश गर्नु भएको छैन।\nतपाईँको IP ठेगाना पृष्ठसम्पादन इतिहासमा दर्तागरिने छ ।",
        "anonpreviewwarning": "''तपाईंले प्रवेश गर्नु भएको छैन। संग्रह (Save) गरेको खण्डमा पृष्ठको इतिहासमा तपाईंको IP ठेगाना अंकित गरिनेछ।''",
        "edit-gone-missing": "पृष्ठ अद्यतन गर्न सकिएन\nयो मेटिएको जस्तो देखिन्छ ।",
        "edit-conflict": "द्वन्द्व सम्पादन गर्ने ।",
        "edit-no-change": "तपाईँको सम्पादन वेवास्ता गरियो, किनकि कुनै पनि पाठ परिवर्तन गरिएन ।",
-       "postedit-confirmation": "तपाईंको सम्पादन संग्रह गरिएको थियो ।",
+       "postedit-confirmation-created": "पृष्ठ सिर्जना गरियो ।",
+       "postedit-confirmation-restored": "पृष्ठ पूर्वरूपमा फर्कायो ।",
+       "postedit-confirmation-saved": "तपाईंको सम्पादन संग्रह गरिएको छ ।",
        "edit-already-exists": "नयाँ पृष्ठ बनाउन सकिएन ।\nयो पहिले देखि नै रहेको छ।",
        "defaultmessagetext": "डिफल्ट सन्देश पाठ",
        "invalid-content-data": "अमान्य सामग्री डेटा",
+       "content-not-allowed-here": "सामग्री \"$1\"  [[$2]] पृष्ठमा राख्न अनुमती छैन ।",
+       "editpage-notsupportedcontentformat-title": "सामग्री प्रकार समर्थित छैन",
        "content-model-wikitext": "विकिपाठ",
        "content-model-text": "साधारण पाठ",
        "content-model-javascript": "जाभास्क्रिप्ट",
        "rev-suppressed-text-unhide": "यस पृष्ठको पुनरावलोकन '''दबाइएकोछ'''।\nयसको पूर्ण विवरण [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}}को दबाइएको लगमा पाउन सकिन्छ]।\nयदि चाहनु भयो भनें प्रबन्धकको हैसियतमा [यो पुनरावलोकन $1] हेर्न सक्नुहुन्छ।",
        "rev-deleted-text-view": "यस पृष्ठको संशोधन '''मेटिएकोछ'''।\nतपाईंले हेर्न सक्नुहुन्छ; [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} मेटिएको लगमा विवरण पाउन सकिन्छ]।",
        "rev-suppressed-text-view": "यस पृष्ठको पुनरावलोकन '''दबिएकोछ'''।\nप्रबन्धकको हैसियतमा हेर्न सक्नुहुन्छ; [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}}को दबिएको लगमा विवरण पाउन सकिन्छ]",
-       "rev-deleted-no-diff": "तपाईंले यसको भिन्नता पाउन सक्नुहुन्न किन भनें यस पृष्ठको पुनरावलोकन '''मेटाइएकोछ'''।\nयसको विवरण [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}}को मेटाइएको लगमा पाउन सक्नुहुन्छ]।",
+       "rev-deleted-no-diff": "तपाईंले यसको भिन्नता पाउन सक्नुहुन्न किनभने यस पृष्ठको पुनरावलोकन '''मेटाइएको छ'''।\nयसको विवरण [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}}को मेटाइएको लगमा पाउन सक्नुहुन्छ]।",
        "rev-suppressed-no-diff": "तपाईं यसको भिन्नता हेर्न सक्नुहुन्न किनभनें यसको एउटा संशोधन '''मेटाइएको'''छ।",
        "rev-deleted-unhide-diff": "यस पृष्ठको पुनरावलोकनहरु मध्ये एउटा भिन्नता '''मेटाइएकोछ'''।\nयसको पूर्ण विवरण [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}}को मेटाइएको लगमा पाउन सकिन्छ]।\nयदि चाहनु भयो भनें प्रबन्धकको हैसियतमा [यो भिन्नता $1] हेर्न सक्नुहुन्छ।",
        "rev-suppressed-unhide-diff": "यस पृष्ठको पुनरावलोकनहरु मध्ये एउटा भिन्नता '''दबिएकोछ'''।\nयसको पूर्ण विवरण [{{fullurl:{{#Special:Log}}/suppress|पृष्ठ={{FULLPAGENAMEE}}}}को दबिएको लगमा पाउन सकिन्छ]।\nयदि चाहनु भयो भनें प्रबन्धकको हैसियतमा [यो भिन्नता $1] हेर्न सक्नुहुन्छ।",
        "revertmerge": "नमिलाउने",
        "mergelogpagetext": "एउटा पृष्ठको इतिहास अर्कोमा भर्खरै मिलाइएको सूची तल दिइन्छ।",
        "history-title": "\"$1\" को पुनरावृत्ति इतिहास",
-       "difference-multipage": "(पà¥\83षà¥\8dठहरà¥\81मा भिन्नता)",
+       "difference-multipage": "(पà¥\83षà¥\8dठहरà¥\82मा भिन्नता)",
        "lineno": "पंक्ति $1:",
        "compareselectedversions": "छानिएका संस्करणहरू दाँज्नुहोस्",
        "showhideselectedversions": "छानिएका पुनरावलोकनहरु देखाउने/लुकाउने",
        "search-nonefound": "तपाईँको क्वेरीसँग मेल खाने नतिजाहरू भेटिएनन्",
        "powersearch-legend": "उन्नत खोज",
        "powersearch-ns": "नेमस्पेसेजहरुमा खोज्ने :",
-       "powersearch-redir": "अनुप्रेषित सूचीकृत गर्ने",
        "powersearch-togglelabel": "जाँच्ने :",
        "powersearch-toggleall": "सबै",
        "powersearch-togglenone": "कुनै पनि होइन",
        "prefs-emailconfirm-label": "इ-मेल एकिन प्रक्रिया :",
        "youremail": "ईमेल",
        "username": "{{GENDER:$1|प्रयोगकर्ता नाम}}:",
-       "uid": "{{GENDER:$1|प्रयोगकर्ता}} ID:",
        "prefs-memberingroups": "निम्न {{PLURAL:$1|समूह | समूहहरू}}को {{GENDER:$2|सदस्य}} :",
        "prefs-memberingroups-type": "$1",
        "prefs-registration": "दर्ता समय:",
        "prefs-advancedsearchoptions": "उन्नत विकल्पहरू",
        "prefs-advancedwatchlist": "उन्नत विकल्पहरू",
        "prefs-displayrc": "प्रदर्शन विकल्पहरू",
-       "prefs-displaysearchoptions": "प्रदर्शन विकल्पहरू",
        "prefs-displaywatchlist": "प्रदर्शन विकल्पहरू",
        "prefs-tokenwatchlist": "टोकन",
        "prefs-diffs": "diffs(भिन्नता)",
        "right-edituserjs": "प्रयोकर्ताको  JS फाइलहरु सम्पादनगर्ने",
        "right-editmyusercss": "तपाईँको आफ्नो CSS फाइलहरू सम्पादन गर्नुहोस्",
        "right-editmyuserjs": "तपाईँको आफ्नो जाभा स्क्रिप्ट फाइलहरू सम्पादन गर्ने",
+       "right-viewmywatchlist": "तपाईँको निगरानी सुची हेर्नुहोस्",
+       "right-editmyoptions": "तपाईँका अभिरुचीहरू सम्पादन गर्नुहोस्",
        "right-rollback": "पछिल्लो प्रयोगकर्ताको सम्पादनहरुको छरितो रुपमा पछाडि पर्काउने",
        "right-markbotedits": "पछाडि फर्काउने सम्पादनहरुलाई बोट सम्पादनकारुपमा चिनो लगाउने",
        "right-noratelimit": "दर सीमाले  असर नपार्ने",
        "right-sendemail": "अन्य प्रयोगकर्ताहरुलाई इमेल गर्ने",
        "right-passwordreset": "पासवर्ड परिवर्तन गर्ने ईमेलहरु हेर्नुहोस",
        "newuserlogpage": "प्रयोगकर्ता श्रृजना लग",
+       "newuserlogpagetext": "यो प्रयोगकर्ता सिर्जनाको लग हो ।",
        "rightslog": "प्रयोगकर्ता अधिकार लग",
        "rightslogtext": "यो प्रयोगकर्ता अधिकारहरुको परिवर्तन लग हो ।",
        "action-read": "यो पृष्ठ पढ्ने",
        "action-userrights-interwiki": "अरु विकिका प्रयोगकर्ताहरुको प्रयोगकर्ता अधिकारलाई सम्पादन गर्ने",
        "action-siteadmin": "डेटाबेस बन्दगर्ने वा खोल्ने",
        "action-sendemail": "इमेलहरु पठाउने",
+       "action-editmywatchlist": "तपाईँको निगरानी सुची सम्पादन गर्नुहोस",
+       "action-viewmywatchlist": "तपाईँको निगरानी सुची हेर्नुहोस",
+       "action-viewmyprivateinfo": "तपाईँको व्यक्तिगत जानकारी हेर्नुहोस",
+       "action-editmyprivateinfo": "तपाईँको व्यक्तिगत जानकारी सम्पादन गर्नुहोस",
        "nchanges": "$1 {{PLURAL:$1|परिवर्तन|परिवर्तनहरु}}",
        "enhancedrc-history": "इतिहास",
        "recentchanges": "नयाँ परिवर्तनहरू",
        "recentchanges-feed-description": "यो फिडमा रहेको विकीको सवैभन्दा अन्तिम परिवर्तनहरुको जानकारी राख्नुहोस्",
        "recentchanges-label-newpage": "यो सम्पादनले नयाँ पृष्ठ निर्माण गरेको छ",
        "recentchanges-label-minor": "यो साधारण सम्पादन हो",
-       "recentchanges-label-bot": "यो सम्पादन बोट द्वारा गरिएको थियो",
+       "recentchanges-label-bot": "यो सम्पादन बोटद्वारा गरिएको थियो",
        "recentchanges-label-unpatrolled": "यो सम्पादन अहिले सम्म पट्रोल गरिएको छैन",
        "recentchanges-legend-newpage": "([[Special:NewPages|list of new pages]] यो पनि हेर्नुहोस्)",
        "recentchanges-legend-plusminus": "(''±१२३'')",
        "rcnotefrom": "'''$2''' देखिका परिवर्तनहरु तल ('''$1''' सम्मका देखाइन्छ)।",
-       "rclistfrom": "$1 देखिका नयाँ परिवर्तनहरू देखाउनु",
+       "rclistfrom": "$3 $2 देखिका नयाँ परिवर्तनहरू देखाउनु",
        "rcshowhideminor": "$1 सामान्य सम्पादन",
        "rcshowhideminor-show": "देखाउनुहोस्",
        "rcshowhideminor-hide": "लुकाउनुहोस्",
        "logempty": "लगमा मिल्ने वस्तु भेटिएन ।",
        "log-title-wildcard": "पाठबाट सुरुहुने शीर्षकहरु खोज्नुहोस्",
        "allpages": "सबै पृष्ठहरू",
-       "alphaindexline": "$1 लाई $2 मा",
        "nextpage": "अर्को पृष्ठ ($1)",
        "prevpage": "पहिलो पृष्ठ ($1)",
        "allpagesfrom": "यहाँदेखि शुरु हुने पृष्ठहरू देखाउनुहोस्:",
        "watchlist-details": "तपाईको निगरानी सूचीमा रहेका{{PLURAL:$1|$1 पृष्ठ|$1 पृष्ठहरु}}वार्तालापमा पृष्ठमा गनिएका छैनन् ।",
        "wlheader-enotif": "ईमेल जानकारी सक्रिय गरियो ।",
        "wlheader-showupdated": "तपाईँले पछिल्लो पल्ट भ्रमण गरेपछि परिवर्तन भएका पृष्ठहरूलाई <strong>गाढा<strong> गरेर देखाइएको छ ।",
-       "watchmethod-recent": "निगरानी सुचीमा रहेका पृष्ठमा गरिएका सम्पादनहरु जाँच्दै",
-       "watchmethod-list": "सम्पदान गरिएका निगरानी सुचीमा रहेका पृष्ठहरुको सम्पादन जाँच्दै",
-       "watchlistcontains": "तपाईको निगरानी सुचीमा $1 {{PLURAL:$1|पृष्ठ|पृष्ठहरु}}रहेका छन् ।",
-       "iteminvalidname": "वस्तु '$1'मा समस्या , अमान्य नाम...",
        "wlshowlast": "पछिल्ला $2 दिनहरूका $3 $1 घण्टाहरूका देखाउनुहोस्",
        "watchlist-options": "निगरानि सूची विकल्प",
        "watching": "निगरानी गर्दै...",
        "enotif_lastvisited": "अघिल्लो हेराइपछिका सबै परिवर्तनहरुको निम्ति हेर्नुहोस्: $1",
        "enotif_lastdiff": "यस परिवर्तनको निम्ति यो $1 हेर्नुहोस्",
        "enotif_anon_editor": "अज्ञात  प्रयोगकर्ता  $1",
-       "enotif_body": "प्रिय $WATCHINGUSERNAME,\n\n\n{{SITENAME}}को पृष्ठ $PAGETITLE  $PAGEEDITDATE को दिन $PAGEEDITORद्वारा $CHANGEDORCREATED, \nहालको संशोधनको निम्ति  हेर्नुहोस्  $PAGETITLE_URL ।\n\n$NEWPAGE\n\nसम्पादकको सारांश: $PAGESUMMARY $PAGEMINOREDIT\n\nसम्पादकसित सम्पर्क राख्नुहोस्:\nमेल: $PAGEEDITOR_EMAIL\nविकि: $PAGEEDITOR_WIKI\n\nतपाईं यस पृष्ठमा नगएसम्म अब उसो कुनै परिवर्तन भएका खण्डमा कुनै सूचना दिनेछैन।\nतपाईंका सम्पूर्ण निगरानी पृष्ठहरुको लागि तपाईंले सूचना पताकालाई निगरानी सूचीमा पुनर्बहाली गर्न सक्नुहुन्छ। \n\n             तपाईंको मित्र {{SITENAME}} सूचना प्रणाली\n--\nइमेल सूचना व्यवस्था परिवर्तन गर्न, जानुहोस्\n{{canonicalurl:{{#special:Preferences}}}}\n\nनिगरानी सूची व्यवस्थित गर्न, जानुहोस्\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nनिगरानी सूची मेट्न, जानुहोस्\n$UNWATCHURL\n\nप्रतिक्रिया र अन्य सहयोगको निम्ति:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "प्रिय $WATCHINGUSERNAME,\n\n\n{{SITENAME}}को पृष्ठ $PAGETITLE  $PAGEEDITDATE को दिन $PAGEEDITORद्वारा $CHANGEDORCREATED, \nहालको संशोधनको निम्ति  हेर्नुहोस्  $PAGETITLE_URL ।\n\n$NEWPAGE\n\nसम्पादकको सारांश: $PAGESUMMARY $PAGEMINOREDIT\n\nसम्पादकसित सम्पर्क राख्नुहोस्:\nमेल: $PAGEEDITOR_EMAIL\nविकि: $PAGEEDITOR_WIKI\n\nतपाईं यस पृष्ठमा नगएसम्म अब उसो कुनै परिवर्तन भएका खण्डमा कुनै सूचना दिनेछैन।\nतपाईंका सम्पूर्ण निगरानी पृष्ठहरुको लागि तपाईंले सूचना पताकालाई निगरानी सूचीमा पुनर्बहाली गर्न सक्नुहुन्छ। \n\n             तपाईंको मित्र {{SITENAME}} सूचना प्रणाली\n--\nइमेल सूचना व्यवस्था परिवर्तन गर्न, जानुहोस्\n{{canonicalurl:{{#special:Preferences}}}}\n\nनिगरानी सूची व्यवस्थित गर्न, जानुहोस्\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nनिगरानी सूची मेट्न, जानुहोस्\n$UNWATCHURL\n\nप्रतिक्रिया र अन्य सहयोगको निम्ति:\n$HELPPAGE",
        "created": "बनाइएको",
        "changed": "परिवर्तन भइसकेको",
        "deletepage": "पृष्ठ मेट्नुहोस्",
        "blockip": "प्रयोगकर्तालाइ निषेध गर्ने",
        "blockip-legend": "प्रयोगकर्ता रोक्नुहोस",
        "blockiptext": "विशेष IP ठेगाना अथवा प्रयोगकर्तालाई रोक लगाउन निम्न प्रपत्र (form) प्रयोग गर्नुहोस्।\nयसो गर्नुको कारण [[{{MediaWiki:Policy-url}}|नीति]] अनुरुप विकिमा गरिने बर्बरताका कार्य रोक्नु मात्र हो।\nविशेष कारण देखाउँदै तलको प्रपत्र भर्नुहोस्  (उदाहरण, बर्बरताको कार्य गरिएको पृष्ठ दर्शाउँदै)",
-       "ipadressorusername": " ip ठेगाना या प्रयोगकर्ता नाम :",
+       "ipaddressorusername": " ip ठेगाना या प्रयोगकर्ता नाम :",
        "ipbexpiry": "समाप्ति:",
        "ipbreason": "कारण:",
        "ipbreason-dropdown": "*रोक लगाउनुका समान्य कारणहरु\n** झूटो सूचना दिइएको\n** पृष्ठहरुबाट सामाग्रीहरु हटाइएको\n** बाहिरी जालक्षेत्र (sites)सित नचाहिंदो लिङ्क गराइएको \n** पृष्ठहरुमा बकवास/गाली-गलौच हालिएको\n** भय फैलाउने व्यवहार/उत्पीडन (सताउने कार्य)\n** धेरै गलत खाताहरु\n** प्रयोगकर्ता नाम अस्वीकार्य",
        "modern.css": "/* यहाँ राखिएको CSS ले मोनोबुक मोडर्न प्रयोगकर्ताहरुलाई प्रभावित गर्ने छ  */",
        "vector.css": "/* यहाँ राखिएको CSS ले भेक्टर स्किनको प्रयोगकर्ताहरुलाई प्रभावित गर्ने छ  */",
        "print.css": "/* यहाँ राखिएको CSS मुद्रण नतिजालाई प्रभावित गर्छ  */",
-       "notacceptable": "विकि सर्भर तपाइको क्लाइन्टलाइ जुन प्रकारको डाटा चाहिन्छ त्यस प्रकारले दिन सक्दैन।",
        "anonymous": "{{SITENAME}} का {{PLURAL:$1||}} नाम नभएका सदस्य",
        "siteuser": "{{SITENAME}} प्रयोगकर्ता $1",
        "anonuser": "{{SITENAME}} अनाम प्रयोगकर्ता $1",
        "newimages-summary": "यस विशेष पृष्ठले अन्तिम उर्ध्वभरण गरिका फाइलहरु देखाउँछ ।",
        "newimages-legend": "फिल्टर",
        "newimages-label": "फाइल अथवा (यसको एउटा अंश)को नाम:",
-       "showhidebots": "($1 बोटहरु)",
        "noimages": "हेर्नको लागि केही छैन.",
        "ilsubmit": "खोज्नुहोस्",
        "bydate": "मिति अनुसार",
        "size-kilobytes": "$1 किलोबाइटहरु",
        "size-megabytes": "$1 मेगाबाइटहरु",
        "size-gigabytes": "$1 गिगाबाइटहरु",
-       "livepreview-loading": "लोड हुदैछ...",
-       "livepreview-ready": "लोड हुँदैछ ...तयार  भयो!",
-       "livepreview-failed": "प्रत्यक्ष पूर्वरुप असफल भयो !\nसाधारण पूर्वरुप हेर्न प्रयास गर्नुहोस् ।",
-       "livepreview-error": "निम्न जडान गर्न सकिएन: $1 \"$2\".\nसाधारण पूर्वरुप हेर्न प्रयास गर्नुहोस् ।",
        "lag-warn-normal": " $1 {{PLURAL:$1|सेकेन्ड |सेकेन्डहरु}} भन्दा नयाँ परिवर्तनहरु यस सुचीमा नदेखाइन सक्छ ।",
        "lag-warn-high": "डेटावेस सर्भरको धेरै ढिलाइको कारणले  $1 {{PLURAL:$1|सेकेन्ड|सेकेन्डहरु}} पछिका परिवर्तनहरु नदेखिन सक्छ ।",
-       "watchlistedit-numitems": "तपाईको निगरानी सुचीमा वार्तालाप पृष्ठहरु बाहेकका {{PLURAL:$1|१ शिर्षक|$1 शिर्षकरु}} रहेका छन् ।",
-       "watchlistedit-noitems": "तपाईको निगरानी सुचीमा शिर्षकहरु छैनन् ।",
        "watchlistedit-normal-title": " निगरानी सूची सम्पादन गर्ने",
        "watchlistedit-normal-legend": "शीर्षकहरु निगरानी सूचीबाट हटाउने",
        "watchlistedit-normal-submit": "शीर्षकहरू हटाउने:",
        "watchlistedit-raw-done": "तपाईको निगरानी सुची अद्यावधिक गरिएको छ।",
        "watchlistedit-raw-added": "{{PLURAL:$1|१ शिर्षक|$1 शिर्षकरु}} थपियो:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|१ शिर्षक|$1 शिर्षकरु}} हटाइयो:",
+       "watchlistedit-clear-titles": "शीर्षकहरू :",
+       "watchlistedit-clear-done": "तपाईको निगरानी सुची हटाइएको छ।",
        "watchlisttools-view": "मिल्दो परिवर्तनहरु हेर्ने",
        "watchlisttools-edit": "निगरानी सूची हेर्नुहोस् र सम्पादन गर्नुहोस्",
        "watchlisttools-raw": "कच्चा निगरानी सूची सम्पादन गर्नुहोस् ।",
        "compare-invalid-title": "तपाईले खुलाउनु भएको शिर्षक अमान्य छ।",
        "compare-title-not-exists": "तपाईले खुलाउनु भएको शिर्षक उपलब्ध छैन ।",
        "compare-revision-not-exists": "तपाईले खुलाउनु भएको संस्करण उपलब्ध छैन ।",
-       "dberr-header": "यो विकिमा समस्या छ",
        "dberr-problems": "क्षमा पाउँ! यो साइटमा तकनीकी गड़बड़ी आइपरेकोछ।",
        "dberr-again": "केही समय पर्खिएर पुन: लोड हुन दिनुहोस् ।",
        "dberr-info": "(डेटाबेस सर्वर $1सित सम्पर्क साध्न सकिंदैन)",
        "feedback-submit": "प्रतिकृया बुझाउनुहोस्",
        "feedback-error2": "त्रुटि: सम्पादन असफल",
        "feedback-close": "गरियो",
+       "searchsuggest-search": "खोज",
        "api-error-badaccess-groups": "यस विकिमा तपाईंलाई फाइल अपलोड गर्ने अनुमति छैन।",
        "api-error-copyuploaddisabled": "यस सर्वरमा URL द्वारा अपलोड गर्ने व्यवस्था निस्क्रिय गरिएकोछ।",
        "api-error-duplicate": "यस साइटमा पहिलेबाट यस्तै सामग्री {{PLURAL:$1|भएको [$2 अर्को फाइल छ]|भएका  [$2 केहि अरु फाइलहरु छन्]}} ।",
        "api-error-unknownerror": "अज्ञात त्रुटि: \"$1\".",
        "api-error-uploaddisabled": "यस विकिमा अपलोड निस्क्रिय गरिएकोछ।",
        "expand_templates_output": "परिणाम",
+       "expand_templates_ok": "ठीक",
        "expand_templates_generate_rawhtml": "सुद्ध HTML देखाउने",
        "expand_templates_preview": "पूर्वावलोकन"
 }
index d09be24..2620837 100644 (file)
@@ -54,7 +54,9 @@
                        "Wiki13",
                        "Wikiklaas",
                        "Wolf Lambert",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라",
+                       "Mar(c)"
                ]
        },
        "tog-underline": "Koppelingen onderstrepen:",
        "jumptonavigation": "navigatie",
        "jumptosearch": "zoeken",
        "view-pool-error": "De servers zijn op het moment helaas overbelast.\nTe veel gebruikers proberen deze pagina te bekijken.\nWacht even voordat u opnieuw toegang probeert te krijgen tot deze pagina.\n\n$1",
+       "generic-pool-error": "De servers zijn op het moment helaas overbelast.\nTe veel gebruikers proberen deze pagina te bekijken.\nWacht even voordat u opnieuw toegang probeert te krijgen tot deze pagina.",
        "pool-timeout": "De maximaal te wachten tijd voor het wachten op een lock is verstreken",
        "pool-queuefull": "De wachtrij van de poel is vol",
        "pool-errorunknown": "Er is een onbekende fout opgetreden",
        "readonly_lag": "De database is automatisch vergrendeld terwijl de ondergeschikte databaseservers synchroniseren met de hoofdserver.",
        "internalerror": "Interne fout",
        "internalerror_info": "Interne fout: $1",
-       "fileappenderrorread": "\"$1\" kon niet gelezen worden tijdens het toevoegen.",
-       "fileappenderror": "Het was niet mogelijk \"$1\" toe te voegen aan \"$2\".",
        "filecopyerror": "Bestand \"$1\" kon niet naar \"$2\" gekopieerd worden.",
        "filerenameerror": "\"$1\" kon niet hernoemd worden naar \"$2\".",
        "filedeleteerror": "Bestand \"$1\" kon niet verwijderd worden.",
        "directorycreateerror": "De map \"$1\" kon niet aangemaakt worden.",
        "filenotfound": "Bestand \"$1\" kon niet gevonden worden.",
-       "fileexistserror": "Schrijven naar bestand \"$1\" onmogelijk: het bestand bestaat al.",
        "unexpected": "Onverwachte waarde: \"$1\"=\"$2\".",
        "formerror": "Fout: formulier kon niet verzonden worden",
        "badarticleerror": "Deze handeling kan niet op deze pagina worden uitgevoerd.",
        "virus-unknownscanner": "onbekend antivirusprogramma:",
        "logouttext": "'''U bent nu afgemeld.'''\n\nSommige pagina's kunnen blijven weergegeven alsof u nog aangemeld bent, totdat u uw browsercache leegt.",
        "welcomeuser": "Welkom, $1!",
-       "welcomecreation-msg": "Uw gebruiker is aangemaakt.\nVergeet niet uw [[Special:Preferences|voorkeuren voor {{SITENAME}}]] aan te passen.",
+       "welcomecreation-msg": "Uw account is aangemaakt.\nIndien gewenst kunt u uw [[Special:Preferences|voorkeuren]] voor {{SITENAME}} aanpassen.",
        "yourname": "Gebruikersnaam:",
        "userlogin-yourname": "Gebruikersnaam",
        "userlogin-yourname-ph": "Geef uw gebruikersnaam op",
        "userlogin-signwithsecure": "Beveiligde verbinding gebruiken",
        "yourdomainname": "Uw domein:",
        "password-change-forbidden": "U kunt uw wachtwoord niet wijzigen in deze wiki.",
-       "externaldberror": "Er is een fout opgetreden bij het aanmelden bij de database of u hebt geen toestemming uw externe gebruiker bij te werken.",
+       "externaldberror": "Er is een fout opgetreden bij het aanmelden bij de database of u hebt geen toestemming uw externe account bij te werken.",
        "login": "Aanmelden",
        "nav-login-createaccount": "Aanmelden / registreren",
        "loginprompt": "U moet cookies ingeschakeld hebben om u te kunnen aanmelden bij {{SITENAME}}.",
        "logout": "Afmelden",
        "userlogout": "Afmelden",
        "notloggedin": "Niet aangemeld",
-       "userlogin-noaccount": "Hebt u geen gebruiker?",
+       "userlogin-noaccount": "Hebt u geen account?",
        "userlogin-joinproject": "Word lid van {{SITENAME}}",
-       "nologin": "Nog geen gebruikersnaam? $1.",
+       "nologin": "Hebt u geen account? $1.",
        "nologinlink": "Registreren",
        "createaccount": "Registreren",
-       "gotaccount": "Hebt u al een gebruikersnaam? $1.",
+       "gotaccount": "Hebt u al een account? $1.",
        "gotaccountlink": "Aanmelden",
        "userlogin-resetlink": "Bent u uw aanmeldgegevens vergeten?",
        "userlogin-resetpassword-link": "Wachtwoord vergeten?",
        "userlogin-helplink2": "Hulp bij aanmelden",
        "userlogin-loggedin": "U bent al aangemeld als {{GENDER:$1|$1}}.\nGebruik het onderstaande formulier om aan te melden als een andere gebruiker.",
-       "userlogin-createanother": "Gebruiker aanmaken",
-       "createacct-join": "Geef uw gegevens hieronder op.",
-       "createacct-another-join": "Geef hieronder de informatie voor de nieuwe gebruiker op.",
+       "userlogin-createanother": "Een andere account aanmaken",
        "createacct-emailrequired": "E-mailadres",
        "createacct-emailoptional": "E-mailadres (optioneel)",
        "createacct-email-ph": "Geef uw e-mailadres op",
        "invalidemailaddress": "Het e-mailadres is niet aanvaard, omdat het een ongeldige opmaak heeft.\nGeef een geldig e-mailadres op of laat het veld leeg.",
        "cannotchangeemail": "Het e-mailadres voor een gebruiker kan op deze wiki niet gewijzigd worden.",
        "emaildisabled": "Deze site kan geen e-mails verzenden.",
-       "accountcreated": "Gebruiker aangemaakt",
-       "accountcreatedtext": "De gebruiker [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|overleg]]) is aangemaakt.",
+       "accountcreated": "Account aangemaakt",
+       "accountcreatedtext": "Het gebruikersaccount voor [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|overleg]]) is aangemaakt.",
        "createaccount-title": "Gebruikers registreren voor {{SITENAME}}",
        "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.",
        "savearticle": "Pagina opslaan",
        "preview": "Voorvertoning",
        "showpreview": "Bewerking ter controle bekijken",
-       "showlivepreview": "Bewerking ter controle bekijken",
        "showdiff": "Wijzigingen bekijken",
        "anoneditwarning": "'''Waarschuwing:''' u bent niet aangemeld.\nUw IP-adres wordt opgeslagen als u wijzigingen op deze pagina maakt.",
        "anonpreviewwarning": "''U bent niet aangemeld.''\n''Door uw bewerking op te slaan wordt uw IP-adres opgeslagen in de paginageschiedenis.''",
        "edit-gone-missing": "De pagina is niet bijgewerkt.\nDeze lijkt verwijderd te zijn.",
        "edit-conflict": "Bewerkingsconflict.",
        "edit-no-change": "Uw bewerking is genegeerd, omdat er geen wijziging aan de tekst is gemaakt.",
-       "postedit-confirmation": "Uw bewerking is opgeslagen",
+       "postedit-confirmation-created": "De pagina is gemaakt.",
+       "postedit-confirmation-restored": "De pagina is hersteld.",
+       "postedit-confirmation-saved": "Uw bewerking is opgeslagen",
        "edit-already-exists": "De pagina is niet aangemaakt.\nDeze bestaat al.",
        "defaultmessagetext": "Standaardinhoud",
        "content-failed-to-parse": "Het was niet mogelijk de inhoud van het MIME-type $2 voor het model $1 te verwerken: $3.",
        "parser-template-recursion-depth-warning": "De recursiediepte voor sjablonen is overschreden ($1)",
        "language-converter-depth-warning": "De dieptelimiet voor de taalconvertor is overschreden ($1)",
        "node-count-exceeded-category": "Pagina's waar het maximaal aantal nodes is overschreden",
+       "node-count-exceeded-category-desc": "Een categorie voor pagina's waar het aantal knooppunten is overschreden.",
        "node-count-exceeded-warning": "Op de pagina is het maximale aantal nodes overschreden",
        "expansion-depth-exceeded-category": "Pagina's waar de expansiediepte is overschreden",
+       "expansion-depth-exceeded-category-desc": "Dit is een categorie voor pagina's waar de expansiediepte is overschreden.",
        "expansion-depth-exceeded-warning": "De pagina bevat te veel sjablonen",
        "parser-unstrip-loop-warning": "Er is een \"unstrip\"-lus gedetecteerd",
        "parser-unstrip-recursion-limit": "De recursielimiet ($1) voor \"unstrip\" is overschreden",
        "searchmenu-exists": "* Pagina '''[[$1]]'''",
        "searchmenu-new": "<strong>Maak de pagina \"[[:$1]]\" op deze wiki!</strong> {{PLURAL:$2|0=|Zie ook de pagina met uw zoekresultaat. |Zie ook de lijst met gevonden zoekresultaten}}",
        "searchprofile-articles": "Inhoudelijke pagina's",
-       "searchprofile-project": "Hulp- en projectpagina's",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Alles",
        "searchprofile-advanced": "Uitgebreid",
        "searchprofile-articles-tooltip": "Zoeken in $1",
-       "searchprofile-project-tooltip": "Zoeken in $1",
        "searchprofile-images-tooltip": "Zoeken naar bestanden",
        "searchprofile-everything-tooltip": "Alle inhoud doorzoeken (inclusief overlegpagina's)",
        "searchprofile-advanced-tooltip": "Zoeken in opgegeven naamruimten",
        "search-nonefound": "Er zijn geen resultaten voor uw zoekopdracht.",
        "powersearch-legend": "Uitgebreid zoeken",
        "powersearch-ns": "Zoeken in naamruimten:",
-       "powersearch-redir": "Doorverwijzingen weergeven",
        "powersearch-togglelabel": "Selecteren:",
        "powersearch-toggleall": "Alle",
        "powersearch-togglenone": "Geen",
        "prefs-emailconfirm-label": "E-mailbevestiging:",
        "youremail": "Uw e-mailadres:",
        "username": "{{GENDER:$1|Gebruikersnaam}}:",
-       "uid": "{{GENDER:$1|Gebruikersnummer}}:",
        "prefs-memberingroups": "{{GENDER:$2|Lid}} van {{PLURAL:$1|groep|groepen}}:",
        "prefs-registration": "Registratiedatum:",
        "yourrealname": "Uw echte naam:",
        "prefs-advancedsearchoptions": "Gevorderde instellingen",
        "prefs-advancedwatchlist": "Gevorderde instellingen",
        "prefs-displayrc": "Weergaveopties",
-       "prefs-displaysearchoptions": "Weergaveopties",
        "prefs-displaywatchlist": "Weergaveopties",
        "prefs-tokenwatchlist": "Token",
        "prefs-diffs": "Verschillen",
        "right-move": "Pagina's hernoemen",
        "right-move-subpages": "Pagina's inclusief subpagina's verplaatsen",
        "right-move-rootuserpages": "Gebruikerspagina's van het hoogste niveau hernoemen",
+       "right-move-categorypages": "Categoriepagina's hernoemen",
        "right-movefile": "Bestanden hernoemen",
        "right-suppressredirect": "Geen doorverwijzingen achterlaten bij het hernoemen van pagina's",
        "right-upload": "Bestanden uploaden",
        "action-createpage": "pagina's aan te maken",
        "action-createtalk": "overlegpagina's aan te maken",
        "action-createaccount": "deze gebruiker aan te maken",
+       "action-history": "de geschiedenis van deze pagina te bekijken",
        "action-minoredit": "deze bewerking als klein te markeren",
        "action-move": "deze pagina te hernoemen",
        "action-move-subpages": "deze pagina en bijbehorende subpagina's te hernoemen",
        "action-move-rootuserpages": "gebruikerspagina's van het hoogste niveau te hernoemen",
+       "action-move-categorypages": "categoriepagina's te hernoemen",
        "action-movefile": "dit bestand te hernoemen",
        "action-upload": "dit bestand te uploaden",
        "action-reupload": "dit bestaande bestand te overschrijven",
        "recentchanges-legend-newpage": "Zie ook de [[Special:NewPages|Lijst met nieuwe pagina's]].",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Wijzigingen sinds <strong>$3 om $4</strong> (maximaal <strong>$1</strong> {{PLURAL:$1|wijziging|wijzigingen}}).",
-       "rclistfrom": "Wijzigingen bekijken vanaf $1",
+       "rclistfrom": "Wijzigingen bekijken vanaf $3 $2",
        "rcshowhideminor": "Kleine wijzigingen $1",
        "rcshowhideminor-show": "weergeven",
        "rcshowhideminor-hide": "verbergen",
        "uploadstash-refresh": "Lijst met bestanden bijwerken",
        "invalid-chunk-offset": "Ongeldige chunkoffset",
        "img-auth-accessdenied": "Toegang geweigerd",
-       "img-auth-nopathinfo": "PATH_INFO ontbreekt.\nUw server is niet ingesteld om deze gegevens door te geven.\nMisschien gebruikt deze CGI, en dan wordt img_auth niet ondersteund.\nZie https://www.mediawiki.org/wiki/Manual:Image_Authorization voor meer informatie.",
+       "img-auth-nopathinfo": "PATH_INFO ontbreekt.\nUw server is niet ingesteld om deze gegevens door te geven.\nMisschien gebruikt deze CGI, en dan wordt img_auth niet ondersteund.\nZie https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization voor meer informatie.",
        "img-auth-notindir": "Het opgegeven pad is niet de ingestelde uploadmap.",
        "img-auth-badtitle": "Het was niet mogelijk een geldige paginanaam te maken van \"$1\".",
        "img-auth-nologinnWL": "U bent niet aangemeld en \"$1\" staat niet op de witte lijst.",
        "pageswithprop-prophidden-binary": "binaire eigenschapswaarde verborgen ($1)",
        "doubleredirects": "Dubbele doorverwijzingen",
        "doubleredirectstext": "Deze lijst bevat pagina's die doorverwijzen naar andere doorverwijspagina's.\nElke rij bevat koppelingen naar de eerste en de tweede doorverwijspagina en een koppeling naar de doelpagina van de tweede doorverwijspagina.\nMeestal is de laatste pagina het eigenlijke doel, waar de eerste pagina naar zou moeten doorverwijzen.\n<del>Doorgehaalde regels</del> geven aan dat het probleem al is opgelost.",
-       "double-redirect-fixed-move": "[[$1]] is verplaatst en is nu een doorverwijzing naar [[$2]]",
-       "double-redirect-fixed-maintenance": "Correctie dubbele doorverwijzing van [[$1]] naar [[$2]].",
+       "double-redirect-fixed-move": "[[$1]] is verplaatst.\nHet is automatisch bijgewerkt en verwijst nu naar [[$2]].",
+       "double-redirect-fixed-maintenance": "Automatische dubbele doorverwijzing van [[$1]] naar [[$2]] herstellen in een onderhoudstaak.",
        "double-redirect-fixer": "Doorverwijzingen opschonen",
        "brokenredirects": "Defecte doorverwijzingen",
        "brokenredirectstext": "De onderstaande doorverwijzingen verwijzen naar niet-bestaande pagina's.",
        "log-title-wildcard": "Pagina's zoeken die met deze tekens beginnen",
        "showhideselectedlogentries": "Geselecteerde logboekregels weergeven of verbergen",
        "allpages": "Alle pagina's",
-       "alphaindexline": "$1 tot $2",
        "nextpage": "Volgende pagina ($1)",
        "prevpage": "Vorige pagina ($1)",
        "allpagesfrom": "Pagina's bekijken vanaf:",
        "watchnologin": "U bent niet aangemeld",
        "addwatch": "Toevoegen aan volglijst",
        "addedwatchtext": "De pagina \"[[:$1]]\" is toegevoegd aan uw [[Special:Watchlist|volglijst]].\nToekomstige bewerkingen van deze pagina en de bijbehorende overlegpagina worden daar weergegeven.",
+       "addedwatchtext-short": "De pagina \"$1\" is aan uw volglijst toegevoegd.",
        "removewatch": "Verwijderen uit volglijst",
        "removedwatchtext": "De pagina \"[[:$1]]\" is van [[Special:Watchlist|uw volglijst]] verwijderd.",
+       "removedwatchtext-short": "De pagina \"$1\" is van uw volglijst verwijderd.",
        "watch": "Volgen",
        "watchthispage": "Pagina volgen",
        "unwatch": "Niet volgen",
        "watchlist-details": "Er {{PLURAL:$1|staat één pagina|staan $1 pagina's}} op uw volglijst. Overlegpagina's worden niet meegeteld.",
        "wlheader-enotif": "U wordt per e-mail gewaarschuwd.",
        "wlheader-showupdated": "Pagina's die zijn bewerkt sinds uw laatste bezoek worden '''vet''' weergegeven.",
-       "watchmethod-recent": "controleer recente wijzigingen op pagina's op volglijst",
-       "watchmethod-list": "controleer pagina's op volglijst op wijzigingen",
-       "watchlistcontains": "Er {{PLURAL:$1|staat één pagina|staan $1 pagina's}} op uw volglijst.",
-       "iteminvalidname": "Probleem met object '$1', ongeldige naam…",
        "wlnote2": "Hieronder staan de veranderingen in {{PLURAL:$1|het|de}} laatste {{PLURAL:$1|uur|<strong> $1 </strong>uren}}, sinds $2, $3.",
        "wlshowlast": "Laatste $1 uur, $2 dagen bekijken ($3)",
        "watchlist-options": "Opties voor volglijst",
        "enotif_lastvisited": "Zie $1 voor alle wijzigingen sinds uw laatste bezoek.",
        "enotif_lastdiff": "Ga naar $1 om deze wijziging te bekijken.",
        "enotif_anon_editor": "anonieme gebruiker $1",
-       "enotif_body": "Beste $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nSamenvatting van de wijziging: $PAGESUMMARY $PAGEMINOREDIT\n\nContactgegevens van de auteur:\nE-mailadres: $PAGEEDITOR_EMAIL\nWiki: $PAGEEDITOR_WIKI\n\nTenzij u deze pagina bezoekt, komen er geen verdere berichten. Als u bent aangemeld, kunt u op uw volglijst voor alle gevolgde pagina's de waarschuwingsinstellingen opschonen.\n\nGroet van uw {{SITENAME}}-waarschuwingssysteem.\n\n--\nU kunt uw e-mailinstellingen wijzigen op:\n{{canonicalurl:{{#special:Preferences}}}}\n\nU kunt uw volglijstinstellingen wijzigen op:\n{{canonicalurl:Special:Watchlist/edit}}\n\nU kunt de pagina van uw volglijst verwijderen via de volgende koppeling:\n$UNWATCHURL\n\nTerugkoppeling en verdere assistentie:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Beste $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nSamenvatting van de wijziging: $PAGESUMMARY $PAGEMINOREDIT\n\nContactgegevens van de auteur:\nE-mailadres: $PAGEEDITOR_EMAIL\nWiki: $PAGEEDITOR_WIKI\n\nTenzij u deze pagina bezoekt, komen er geen verdere berichten. Als u bent aangemeld, kunt u op uw volglijst voor alle gevolgde pagina's de waarschuwingsinstellingen opschonen.\n\nGroet van uw {{SITENAME}}-waarschuwingssysteem.\n\n--\nU kunt uw e-mailinstellingen wijzigen op:\n{{canonicalurl:{{#special:Preferences}}}}\n\nU kunt uw volglijstinstellingen wijzigen op:\n{{canonicalurl:Special:Watchlist/edit}}\n\nU kunt de pagina van uw volglijst verwijderen via de volgende koppeling:\n$UNWATCHURL\n\nTerugkoppeling en verdere assistentie:\n$HELPPAGE",
        "created": "aangemaakt",
        "changed": "gewijzigd",
        "deletepage": "Pagina verwijderen",
        "blockip": "Gebruiker blokkeren",
        "blockip-legend": "Gebruiker blokkeren",
        "blockiptext": "Gebruik het onderstaande formulier om schrijftoegang voor een gebruiker of IP-adres in te trekken.\nDoe dit alleen als bescherming tegen vandalisme en in overeenstemming met het [[{{MediaWiki:Policy-url}}|beleid]].\nGeef hieronder een reden op (bijvoorbeeld welke pagina's gevandaliseerd zijn).",
-       "ipadressorusername": "IP-adres of gebruikersnaam:",
+       "ipaddressorusername": "IP-adres of gebruikersnaam:",
        "ipbexpiry": "Vervalt (maak een keuze):",
        "ipbreason": "Reden:",
        "ipbreason-dropdown": "*Veelvoorkomende redenen voor blokkades\n** Foutieve informatie invoeren\n** Verwijderen van informatie uit pagina's\n** Spamkoppeling naar externe websites\n** Invoegen van nonsens in pagina's\n** Intimiderend gedrag\n** Misbruik door meerdere gebruikers\n** Onaanvaardbare gebruikersnaam",
        "movepagetalktext": "De bijbehorende overlegpagina krijgt automatisch een andere naam, '''tenzij''':\n* De overlegpagina onder de nieuwe naam al bestaat;\n* U het onderstaande vinkje deselecteert.\n\nIn die gevallen moet u de pagina handmatig hernoemen of samenvoegen.",
        "movearticle": "Te hernoemen pagina:",
        "moveuserpage-warning": "'''Waarschuwing:''' u gaat een gebruikerspagina hernoemen. Houd er rekening mee dat alleen de pagina wordt hernoemd, ''niet'' de gebruiker.",
+       "movecategorypage-warning": "<strong>Waarschuwing:</strong> U staat op het punt een categoriepagina te hernoemen. Houdt u er rekening mee dat alleen de categoriepagina zelf hernoemd zal worden; pagina's in de oude categorie zullen <em>niet</em> automatisch naar de nieuwe worden verplaatst.",
        "movenologintext": "U moet [[Special:UserLogin|aangemeld]] zijn om een pagina te hernoemen.",
        "movenotallowed": "U hebt geen rechten om pagina's te hernoemen.",
        "movenotallowedfile": "U hebt geen rechten om bestanden te hernoemen.",
        "cant-move-user-page": "U hebt geen rechten om gebruikerspagina's te hernoemen (met uitzondering van subpagina's).",
        "cant-move-to-user-page": "U hebt geen rechten om een pagina naar een gebruikerspagina te hernoemen. Hernoemen naar een subpagina is wel mogelijk.",
+       "cant-move-category-page": "U hebt geen rechten om categoriepagina's te hernoemen.",
+       "cant-move-to-category-page": "U hebt geen rechten om een pagina naar een categoriepagina te hernoemen.",
        "newtitle": "Naar de nieuwe paginanaam:",
        "move-watch": "Bronpagina en doelpagina volgen",
        "movepagebtn": "Pagina hernoemen",
        "tooltip-summary": "Voer een korte samenvatting in",
        "interlanguage-link-title": "$1 – $2",
        "common.css": "/** CSS die hier wordt geplaatst heeft invloed op alle skins */",
-       "cologneblue.css": "/* CSS die hier wordt geplaatst heeft alleen invloed op de skin Keuls blauw */",
        "monobook.css": "/* CSS die hier wordt geplaatst heeft alleen invloed op de skin Monobook */",
-       "modern.css": "/* CSS die hier wordt geplaatst heeft alleen invloed op de skin Modern */",
        "vector.css": "/* CSS die hier wordt geplaatst heeft alleen invloed op de skin Vector */",
        "print.css": "/* CSS die hier wordt geplaatst heeft alleen invloed op de printuitvoer */",
        "noscript.css": "/ * CSS die hier wordt geplaatst heeft invloed voor gebruikers die JavaScript hebben uitgeschakeld * /",
        "group-sysop.css": "/* CSS die hier wordt geplaatst heeft alleen invloed op beheerders */",
        "group-bureaucrat.css": "/* CSS die hier wordt geplaatst heeft alleen invloed op bureaucraten */",
        "common.js": "/* JavaScript die hier wordt geplaatst heeft invloed op alle pagina's voor alle gebruikers */",
-       "cologneblue.js": "/* JavaScript die hier wordt geplaatst heeft alleen invloed op gebruikers die de skin Keuls blauw gebruiken */",
        "monobook.js": "/* JavaScript die hier wordt geplaatst heeft alleen invloed op gebruikers die de skin Monobook gebruiken */",
-       "modern.js": "/* JavaScript die hier wordt geplaatst heeft alleen invloed op gebruikers die de skin Modern gebruiken */",
        "vector.js": "/* JavaScript die hier wordt geplaatst heeft alleen invloed op gebruikers die de skin Vector gebruiken */",
        "group-autoconfirmed.js": "/* JavaScript die hier wordt geplaatst heeft alleen invloed op automatisch bevestigde gebruikers */",
        "group-user.js": "/* JavaScript die hier wordt geplaatst heeft alleen invloed op geregistreerde gebruikers */",
        "group-bot.js": "/* JavaScript die hier wordt geplaatst heeft alleen invloed op robots */",
        "group-sysop.js": "/* JavaScript die hier wordt geplaatst heeft alleen invloed op beheerders */",
        "group-bureaucrat.js": "/* JavaScript die hier wordt geplaatst heeft alleen invloed op bureaucraten */",
-       "notacceptable": "De wikiserver kan de gegevens niet leveren in een vorm die uw browser kan lezen.",
        "anonymous": "Anonieme {{PLURAL:$1|gebruiker|gebruikers}} van {{SITENAME}}",
        "siteuser": "{{SITENAME}}-gebruiker $1",
        "anonuser": "anonieme {{SITENAME}}-gebruiker $1",
        "pageinfo-category-pages": "Aantal pagina's",
        "pageinfo-category-subcats": "Aantal subcategorieën",
        "pageinfo-category-files": "Aantal bestanden",
-       "skinname-cologneblue": "Keuls blauw",
        "skinname-monobook": "Monobook",
-       "skinname-modern": "Modern",
        "skinname-vector": "Vector",
        "markaspatrolleddiff": "Als gecontroleerd markeren",
        "markaspatrolledtext": "Deze pagina als gecontroleerd markeren",
        "newimages-summary": "Op deze speciale pagina worden de meest recent toegevoegde bestanden weergegeven.",
        "newimages-legend": "Bestandsnaam",
        "newimages-label": "Bestandsnaam (of deel daarvan):",
-       "showhidebots": "(Bots $1)",
+       "newimages-showbots": "Uploads door bots weergeven",
        "noimages": "Er is niets te zien.",
        "ilsubmit": "Zoeken",
        "bydate": "op datum",
        "autoredircomment": "Verwijst door naar [[$1]]",
        "autosumm-new": "Nieuwe pagina aangemaakt met '$1'",
        "size-kilobytes": "$1 kB",
-       "livepreview-loading": "Bezig met laden…",
-       "livepreview-ready": "Bezig met laden… Klaar!",
-       "livepreview-failed": "Live voorvertoning mislukt!\nProbeer de normale voorvertoning.",
-       "livepreview-error": "Verbinden mislukt: $1 \"$2\".\nProbeer normale voorvertoning te gebruiken.",
        "lag-warn-normal": "Wijzigingen in de afgelopen {{PLURAL:$1|seconde|$1 seconden}} worden misschien niet weergegeven in deze lijst.",
        "lag-warn-high": "Door een hoge database-servertoevoer zijn wijzigingen nieuwer dan $1 {{PLURAL:$1|seconde|seconden}} mogelijk niet beschikbaar in de lijst.",
-       "watchlistedit-numitems": "Uw volglijst bevat {{PLURAL:$1|1 pagina|$1 pagina’s}}, zonder overlegpagina’s.",
-       "watchlistedit-noitems": "Uw volglijst bevat geen pagina’s.",
        "watchlistedit-normal-title": "Volglijst bewerken",
        "watchlistedit-normal-legend": "Pagina’s van uw volglijst verwijderen",
        "watchlistedit-normal-explain": "Hieronder worden de pagina’s op uw volglijst weergegeven.\nKlik op het vinkvakje ernaast en daarna op \"{{int:Watchlistedit-normal-submit}}\" om een pagina te verwijderen.\nU kunt ook de [[Special:EditWatchlist/raw|ruwe lijst bewerken]].",
        "watchlistedit-normal-done": "Er {{PLURAL:$1|is één pagina|zijn $1 pagina’s}} verwijderd van uw volglijst:",
        "watchlistedit-raw-title": "Ruwe volglijst bewerken",
        "watchlistedit-raw-legend": "Ruwe volglijst bewerken",
-       "watchlistedit-raw-explain": "Hieronder staan pagina’s op uw volglijst.\nU kunt de lijst bewerken door pagina’s te verwijderen en toe te voegen.\nEén pagina per regel.\nAls u klaar bent, klik dan op \"{{int:Watchlistedit-raw-submit}}\".\nU kunt ook [[Special:EditWatchlist|het standaard bewerkingsscherm gebruiken]].",
-       "watchlistedit-raw-titles": "Paginas:",
+       "watchlistedit-raw-explain": "Hieronder staan de pagina's op uw volglijst.\nU kunt de lijst bewerken door pagina's te verwijderen en toe te voegen;\néén pagina per regel.\nAls u klaar bent, klik dan op \"{{int:Watchlistedit-raw-submit}}\".\nU kunt ook [[Special:EditWatchlist|het standaard bewerkingsscherm gebruiken]].",
+       "watchlistedit-raw-titles": "Pagina's:",
        "watchlistedit-raw-submit": "Volglijst bijwerken",
        "watchlistedit-raw-done": "Uw volglijst is bijgewerkt.",
-       "watchlistedit-raw-added": "Er {{PLURAL:$1|is 1 pagina|zijn $1 pagina’s}} toegevoegd:",
-       "watchlistedit-raw-removed": "Er {{PLURAL:$1|is 1 pagina|zijn $1 pagina’s}} verwijderd:",
+       "watchlistedit-raw-added": "Er {{PLURAL:$1|is 1 pagina|zijn $1 pagina's}} toegevoegd:",
+       "watchlistedit-raw-removed": "Er {{PLURAL:$1|is 1 pagina|zijn $1 pagina's}} verwijderd:",
+       "watchlistedit-clear-title": "Volglijst wissen",
+       "watchlistedit-clear-legend": "Volglijst wissen",
+       "watchlistedit-clear-explain": "Alle titels zullen van uw volglijst worden verwijderd",
+       "watchlistedit-clear-titles": "Titels:",
+       "watchlistedit-clear-submit": "Volglijst wissen (dit is definitief!)",
+       "watchlistedit-clear-done": "Uw volglijst is gewist.",
+       "watchlistedit-clear-removed": "Er {{PLURAL:$1|is 1 pagina|zijn $1 pagina's}} verwijderd:",
+       "watchlistedit-too-many": "Er zijn te veel pagina's om hier weer te geven.",
+       "watchlisttools-clear": "Volglijst wissen",
        "watchlisttools-view": "Relevante wijzigingen bekijken",
        "watchlisttools-edit": "Volglijst bekijken en bewerken",
        "watchlisttools-raw": "Ruwe volglijst bewerken",
        "compare-invalid-title": "De opgegeven pagina is ongeldig.",
        "compare-title-not-exists": "De titel die u hebt opgegeven bestaat niet.",
        "compare-revision-not-exists": "De versie die u hebt opgegeven bestaat niet.",
-       "dberr-header": "Deze wiki heeft een probleem",
        "dberr-problems": "Onze excuses. Deze site ondervindt op het moment technische problemen.",
        "dberr-again": "Wacht een aantal minuten en probeer het daarna opnieuw.",
        "dberr-info": "(Kan geen verbinding maken met de databaseserver: $1)",
        "htmlform-no": "Nee",
        "htmlform-yes": "Ja",
        "htmlform-chosen-placeholder": "Selecteer een optie",
+       "htmlform-cloner-create": "Meer toevoegen",
+       "htmlform-cloner-delete": "Verwijderen",
+       "htmlform-cloner-required": "Ten minste één waarde is vereist.",
        "sqlite-has-fts": "Versie $1 met ondersteuning voor \"full-text\" zoeken",
        "sqlite-no-fts": "Versie $1 zonder ondersteuning voor \"full-text\" zoeken",
        "logentry-delete-delete": "$1 {{GENDER:$2|heeft}} de pagina $3 verwijderd",
        "logentry-patrol-patrol": "$1 {{GENDER:$2|heeft}} versie $4 van pagina $3 gemarkeerd als gecontroleerd",
        "logentry-patrol-patrol-auto": "$1 {{GENDER:$2|heeft}} versie $4 van pagina $3 automatisch gemarkeerd als gecontroleerd",
        "logentry-newusers-newusers": "Gebruiker $1 {{GENDER:$2|is}} aangemaakt",
-       "logentry-newusers-create": "Gebruiker $1 {{GENDER:$2|is}} aangemaakt",
+       "logentry-newusers-create": "Gebruikersaccount $1 {{GENDER:$2|is}} aangemaakt",
        "logentry-newusers-create2": "Gebruiker $3 {{GENDER:$2|is}} aangemaakt door $1",
        "logentry-newusers-byemail": "Gebruiker $3 {{GENDER:$2|is}} aangemaakt door $1 en het wachtwoord is per e-mail verzonden",
-       "logentry-newusers-autocreate": "De gebruiker $1 {{GENDER:$2|is}} automatisch aangemaakt",
+       "logentry-newusers-autocreate": "Gebruikersaccount $1 {{GENDER:$2|is}} automatisch aangemaakt",
        "logentry-rights-rights": "$1 {{GENDER:$2|heeft}} groepslidmaatschap voor $3 gewijzigd van $4 naar $5",
        "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",
index e13aeed..73132c3 100644 (file)
@@ -19,7 +19,8 @@
                        "Njardarlogar",
                        "Pcoombe",
                        "Ranveig",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Strek under lenkjer:",
@@ -32,7 +33,6 @@
        "tog-showtoolbar": "Vis endringsverktøyline",
        "tog-editondblclick": "Endre sider med dobbeltklikk",
        "tog-editsectiononrightclick": "Endre avsnitt ved å høgreklikke på avsnittsoverskrifter",
-       "tog-rememberpassword": "Hugs innlogginga mi med denne nettlesaren (for høgst {{PLURAL:$1|éin dag|$1 dagar}})",
        "tog-watchcreations": "Legg til sidene eg opprettar og filene eg lastar opp på overvakingslista mi",
        "tog-watchdefault": "Legg til sidene og filene eg endrar på overvakingslista mi",
        "tog-watchmoves": "Legg til sidene og filene eg flytter på overvakingslista mi",
        "readonly_lag": "Databasen er mellombels skriveverna for at databasetenarane skal kunna synkronisere seg mot kvarandre",
        "internalerror": "Intern feil",
        "internalerror_info": "Intern feil: $1",
-       "fileappenderrorread": "Klarte ikkje å lese «$1» når data skulle leggast til.",
-       "fileappenderror": "Kunne ikkje leggja \"$1\" til \"$2\".",
        "filecopyerror": "Kunne ikkje kopiere fila frå «$1» til «$2».",
        "filerenameerror": "Kunne ikkje døype om fila frå «$1» til «$2».",
        "filedeleteerror": "Kunne ikkje slette fila «$1».",
        "directorycreateerror": "Kunne ikkje opprette mappa «$1».",
        "filenotfound": "Kunne ikkje finne fila «$1».",
-       "fileexistserror": "Kunne ikkje skrive til fila «$1», ho eksisterer allereie",
        "unexpected": "Uventa verdi: «$1»=«$2».",
        "formerror": "Feil: Kunne ikkje sende skjema",
        "badarticleerror": "Handlinga kan ikkje utførast på denne sida.",
        "gotaccountlink": "Logg inn",
        "userlogin-resetlink": "Har du gløymd påloggingsopplysingane dine?",
        "userlogin-resetpassword-link": "Gløymt passordet ditt?",
-       "createacct-join": "Skriv inn informasjonen din under.",
-       "createacct-another-join": "Skriv inn informasjonen til den nye kontoen under",
        "createacct-emailrequired": "E-postadresse:",
        "createacct-emailoptional": "E-postadresse (valfritt)",
        "createacct-email-ph": "Skriv inn e-postadressa di",
        "savearticle": "Lagra sida",
        "preview": "Førehandsvising",
        "showpreview": "Førehandsvis",
-       "showlivepreview": "Levande førehandsvising",
        "showdiff": "Sjå skilnader",
        "anoneditwarning": "'''Åtvaring:''' Du er ikkje innlogga.\nIP-adressa di vert lagra i endringshistorikken til sida.",
        "anonpreviewwarning": "''Du er ikkje innlogga. Lagrar du vil IP-adressa di verta ført opp i endringshistorikken til denne sida.''",
        "edit-gone-missing": "Kunne ikkje oppdatere sida.\nDet ser ut til at ho er sletta.",
        "edit-conflict": "Endringskonflikt.",
        "edit-no-change": "Endringa di vart ignorert fordi det ikkje vart gjort endringar i teksten.",
-       "postedit-confirmation": "Endringa di vart lagra.",
+       "postedit-confirmation-saved": "Endringa di vart lagra.",
        "edit-already-exists": "Kunne ikkje opprette ny side fordi ho alt eksisterer.",
        "defaultmessagetext": "Standard meldingstekst",
        "content-failed-to-parse": "Klarte ikkje å tolke innhaldet «$2» for innhaldsmodellen «$1»: $3",
        "editundo": "angre",
        "diff-empty": "(Ingen skilnad)",
        "diff-multi-sameuser": "({{PLURAL:$1|Éin mellomversjon|$1 mellomversjonar}} av den same brukaren er ikkje {{PLURAL:$1|vist|viste}})",
+       "diff-multi-otherusers": "({{PLURAL:$1|Éin mellomliggjande versjon|$1 mellomliggjande versjonar}} av {{PLURAL:$2|éin annan brukar|$2 brukarar}} er ikkje {{PLURAL:$1|vist|viste}})",
        "diff-multi-manyusers": "({{PLURAL:$1|Ein mellomversjon|$1 mellomversjonar}} av meir enn $2 {{PLURAL:$2|brukar|brukarar}}  er ikkje {{PLURAL:$1|vist|viste}})",
        "difference-missing-revision": "{{PLURAL:$2|Éin versjon|$2 versjonar}} av skilnaden ($1) vart ikkje {{PLURAL:$2|funnen|funne}}.\n\nDette skriv seg som oftast frå at ein har fylgt ei forelda versjonslenkje til ei side som er sletta.\nDetaljar kan ein finna i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} sletteloggen].",
        "searchresults": "Søkjeresultat",
        "search-nonefound": "Ingen resultat svarte til førespurnaden.",
        "powersearch-legend": "Avansert søk",
        "powersearch-ns": "Søk i namnerom:",
-       "powersearch-redir": "Vis omdirigeringar",
        "powersearch-togglelabel": "Hak av:",
        "powersearch-toggleall": "Alle",
        "powersearch-togglenone": "Ingen",
        "prefs-advancedsearchoptions": "Avanserte val",
        "prefs-advancedwatchlist": "Avanserte val",
        "prefs-displayrc": "Val for vising",
-       "prefs-displaysearchoptions": "Val for vising",
        "prefs-displaywatchlist": "Val for vising",
        "prefs-diffs": "Skilnader",
        "prefs-help-prefershttps": "Denne innstillinga vil verta verksam neste gongen du loggar inn.",
        "recentchanges-legend-heading": "'''Tyding:'''",
        "recentchanges-legend-newpage": "(sjå dessutan [[Special:NewPages|lista over nye sider]])",
        "rcnotefrom": "Nedanfor er endringane gjorde sidan <strong>$2</strong> viste (opp til <strong>$1</strong> stykke)",
-       "rclistfrom": "Vis nye endringar sidan $1",
+       "rclistfrom": "Vis nye endringar sidan $3 $2",
        "rcshowhideminor": "$1 småplukk",
        "rcshowhideminor-show": "Vis",
        "rcshowhideminor-hide": "Gøym",
        "uploadstash-refresh": "Oppdater fillista",
        "invalid-chunk-offset": "Ugild delforskuving",
        "img-auth-accessdenied": "Tilgjenge avslått",
-       "img-auth-nopathinfo": "PATH_INFO saknar.\nFiltenaren din er ikkje sett opp for å gje denne informasjonen.\nHan kan vera CGI-basert og ikkje stø img_auth.\nSjå https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "PATH_INFO saknar.\nFiltenaren din er ikkje sett opp for å gje denne informasjonen.\nHan kan vera CGI-basert og ikkje stø img_auth.\nSjå https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Den ynskte filstien er ikkje i den oppsette opplastingskatalogen",
        "img-auth-badtitle": "Kan ikkje laga ein gyldig ttitel ut frå \"$1\".",
        "img-auth-nologinnWL": "Du er ikkje logga inn, og \"$1\" er ikkje på kvitlista.",
        "listgrouprights-removegroup-self": "Kan ta vekk {{PLURAL:$2|gruppe|grupper}} frå eigen konto: $1",
        "listgrouprights-addgroup-self-all": "Kan leggja til alle gruppene til sin eigen konto",
        "listgrouprights-removegroup-self-all": "Kan ta vekk alle gruppene frå sin eigen konto",
+       "trackingcategories": "Sporingskategoriar",
+       "trackingcategories-summary": "Denne sida listar opp sporingskategoriar som automatisk får innhald av MediaWiki-programvara. Namna deira kan endrast gjennom å endra dei relevante systemmeldingane i {{ns:8}}-namnerommet.",
+       "trackingcategories-msg": "Sporingskategori",
+       "trackingcategories-name": "Meldingsnamn",
+       "trackingcategories-desc": "Inkluderingsgrunnlag",
+       "noindex-category-desc": "Sida vert ikkje indeksert av robotar av di ho inneheld trylleordet <code><nowiki>__NOINDEX__</nowiki></code> og er i eit namnerom der dette flagget er tillate.",
        "mailnologin": "Inga avsendaradresse",
        "mailnologintext": "Du lyt vera [[Special:UserLogin|innlogga]] og ha ei gyldig e-postadresse sett i [[Special:Preferences|brukarinnstillingane]] for å sende e-post åt andre brukarar.",
        "emailuser": "Send e-post åt denne brukaren",
        "watchlist-details": "{{PLURAL:$1|Éi side|$1 sider}} er overvaka, utanom diskusjonssider.",
        "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'''",
-       "watchmethod-recent": "sjekkar siste endringar for dei overvaka sidene",
-       "watchmethod-list": "sjekkar om dei overvaka sidene har blitt endra i det siste",
-       "watchlistcontains": "Overvakingslista di inneheld {{PLURAL:$1|éi side|$1 sider}}.",
-       "iteminvalidname": "Problem med «$1», ugyldig namn...",
        "wlshowlast": "Vis siste $1 timane $2 dagane $3",
        "watchlist-options": "Alternativ for overvakingslista",
        "watching": "Overvakar...",
        "enotif_lastvisited": "Sjå $1 for alle endringane sidan siste vitjing.",
        "enotif_lastdiff": "Sjå $1 for å sjå denne endringa.",
        "enotif_anon_editor": "anonym brukar $1",
-       "enotif_body": "Kjære $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nEndringssamandraget var: $PAGESUMMARY $PAGEMINOREDIT\n\nKontakt brukaren:\ne-post: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nDu får ikkje fleire endringsvarsel før du vitjar sida på nytt. Du kan dessutan nullstilla varselflagga for alle sidene på overvakingslista di.\n\nHelsing det venlege meldingssystemet ditt for {{SITENAME}}\n\n--\nFor å endra innstillingane dine for e-postvarsling, vitja\n{{canonicalurl:{{#special:Preferences}}}}\n\nFor å endra innstillingane for overvakingslista di, vitja\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nFor å fjerna sida frå overvakingslista di, vitja\n$UNWATCHURL\n\nAttendemelding og hjelp:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Kjære $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nEndringssamandraget var: $PAGESUMMARY $PAGEMINOREDIT\n\nKontakt brukaren:\ne-post: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nDu får ikkje fleire endringsvarsel før du vitjar sida på nytt. Du kan dessutan nullstilla varselflagga for alle sidene på overvakingslista di.\n\nHelsing det venlege meldingssystemet ditt for {{SITENAME}}\n\n--\nFor å endra innstillingane dine for e-postvarsling, vitja\n{{canonicalurl:{{#special:Preferences}}}}\n\nFor å endra innstillingane for overvakingslista di, vitja\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nFor å fjerna sida frå overvakingslista di, vitja\n$UNWATCHURL\n\nAttendemelding og hjelp:\n$HELPPAGE",
        "created": "oppretta",
        "changed": "endra",
        "deletepage": "Slett sida",
        "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]].",
-       "ipadressorusername": "IP-adresse eller brukarnamn",
+       "ipaddressorusername": "IP-adresse eller brukarnamn",
        "ipbexpiry": "Opphøyrstid:",
        "ipbreason": "Årsak:",
        "ipbreason-dropdown": "*Vanlege grunnar for blokkering\n** Legg inn usann tekst/tull\n** Fjernar innhald frå sider\n** Legg inn reklamelenkjer til eksterne nettstader\n** Sjikane/plaging av andre brukarar\n** Misbruk ved hjelp av fleire brukarkontoar\n** Uansvarleg brukarnamn",
        "cologneblue.js": "/* Javascript i denne fila vil gjelde for brukarar av drakta Kølnerblå */",
        "monobook.js": "/* Javascript i denne fila vil gjelde for brukarar av drakta Monobook */",
        "modern.js": "* Javascript i denne fila vil gjelde for brukarar av drakta Modern */",
-       "notacceptable": "Wikitenaren kan ikkje gje data i noko format som programmet ditt kan lesa.",
        "anonymous": "{{PLURAL:$1|anonym brukar|anonyme brukarar}} av {{SITENAME}}",
        "siteuser": "{{SITENAME}}-brukaren $1",
        "anonuser": "{{SITENAME}} anonym brukar $1",
        "newimages-summary": "Denne spesialsida syner dei sist opplasta filene.",
        "newimages-legend": "Filnamn",
        "newimages-label": "Filnamn (eller ein del av det):",
-       "showhidebots": "($1 robotar)",
        "noimages": "Her er ingen filer som kan visast.",
        "ilsubmit": "Søk",
        "bydate": "etter dato",
        "autosumm-replace": "Erstattar innhaldet på sida med «$1»",
        "autoredircomment": "Omdirigerer til [[$1]]",
        "autosumm-new": "Oppretta sida med «$1»",
-       "livepreview-loading": "Lastar inn&nbsp;…",
-       "livepreview-ready": "Lastar inn… Ferdig!",
-       "livepreview-failed": "Levande førehandsvising var mislykka. Prøv vanleg førehandsvising.",
-       "livepreview-error": "Tilkoplinga var mislykka: $1 «$2». Prøv vanleg førehandsvising.",
        "lag-warn-normal": "Endringar som er nyare enn {{PLURAL:$1|sekund|sekund}} er ikkje viste på denne lista.",
        "lag-warn-high": "På grunn av stor databaseforseinking, er ikkje endringar som er nyare enn {{PLURAL:$1|sekund|sekund}} viste på denne lista.",
-       "watchlistedit-numitems": "Overvakingslista di inneheld {{PLURAL:$1|éi side|$1 sider}} (diskusjonssider ikkje medrekna).",
-       "watchlistedit-noitems": "Overvakingslista di er tom.",
        "watchlistedit-normal-title": "Endre overvakingslista",
        "watchlistedit-normal-legend": "Fjern sider frå overvakingslista",
        "watchlistedit-normal-explain": "Sidene på overvakingslista di er viste nedanfor.\nFor å fjerne ei side, kryss av boksen ved sida av sida du vil fjerne og klikk på «{{int:Watchlistedit-normal-submit}}».\nDu kan òg [[Special:EditWatchlist/raw|endre overvakingslista i råformat]].",
        "version-hook-subscribedby": "Brukt av",
        "version-version": "(versjon $1)",
        "version-license": "Lisens",
+       "version-ext-colheader-credits": "Forfattarar",
        "version-poweredby-credits": "Denne wikien er driven av '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
        "version-poweredby-others": "andre",
        "version-poweredby-translators": "translatewiki.net-omsetjarar",
        "redirect-lookup": "Sjå etter:",
        "redirect-value": "Verdi",
        "redirect-user": "Brukar-ID",
+       "redirect-page": "Side-ID",
        "redirect-revision": "Sideversjon",
        "redirect-file": "Filnamn",
        "redirect-not-exists": "Fann ikkje verdi",
        "compare-invalid-title": "Tittelen du oppgav er ugild.",
        "compare-title-not-exists": "Tittelen du oppgav finst ikkje.",
        "compare-revision-not-exists": "Versjonen du oppgav finst ikkje.",
-       "dberr-header": "Denne wikien har eit problem",
        "dberr-problems": "Nettstaden har tekniske problem.",
        "dberr-again": "Venta nokre minutt og last sida inn på nytt.",
        "dberr-info": "(Kan ikkje kontakta databasetenaren: $1)",
+       "dberr-info-hidden": "(får ikkje kontakt med databasetenaren)",
        "dberr-usegoogle": "Du kan søkja gjennom Google i mellomtida.",
        "dberr-outofdate": "Merk at versjonane deira av innhaldet vårt kan vera forelda.",
        "dberr-cachederror": "Dette er ein mellomlagra kopi av den etterspurde sida og er mogelegvis ikkje den gjeldande versjonen av henne.",
        "expand_templates_input": "Inntekst:",
        "expand_templates_output": "Resultat",
        "expand_templates_xml_output": "XML-resultat",
+       "expand_templates_html_output": "Rå HTML-utdata",
        "expand_templates_ok": "OK",
        "expand_templates_remove_comments": "Fjern kommentarar",
        "expand_templates_remove_nowiki": "Ikkje vis <nowiki>-merke i resultatet",
        "expand_templates_generate_xml": "Vis parsertre som XML",
+       "expand_templates_generate_rawhtml": "Vis rå HTML",
        "expand_templates_preview": "Førehandsvising"
 }
index 9c33f5b..10c2889 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Kaganer",
                        "Mohau",
-                       "Urhixidur"
+                       "Urhixidur",
+                       "아라"
                ]
        },
        "tog-underline": "Tsenya mothalafase go dihlomaganyo:",
@@ -11,7 +12,6 @@
        "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-rememberpassword": "Gopola sedi yaka ya go tsena khomphutha ye (bogolo bja  $1 bja {{PLURAL:$1| ya letšatši le|ya matšatši}})",
        "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",
        "filerenameerror": "Gara kgona go fetola leina la faele \"$1\" goba \"$2\".",
        "filedeleteerror": "Gara kgona go phumula faele \"$1\".",
        "filenotfound": "Gara kgona go humana faele \"$1\".",
-       "fileexistserror": "Gara kgona go ngawala faele \"$1\":faele e gona",
        "badtitle": "Taetlile ya bošula",
        "badtitletext": "Letlakala le ga la dumelelwa, ga le na ditlhaka, goba hlomaganyo ya bogare-dipolelo goba bogare-wiki taetlele ga ya loka. Ekaba mohlomong taetlele enale hlaka goba dihlaka tšago sedumelelwe.",
        "viewsource": "Lebelela mothopo",
        "search-nonefound": "Gago dipheto tšago sepelelana le \"query\".",
        "powersearch-legend": "Fetleka ya tšwetše",
        "powersearch-ns": "Fetleka go di \"namespace\"",
-       "powersearch-redir": "Lenano la di \"redirect\"",
        "preferences": "Dikgatlhegelo",
        "mypreferences": "Dikgatlhegelo tša ka",
        "prefs-edits": "Palo ya diphetogo:",
        "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''').",
-       "rclistfrom": "Laêtša dipheto tše mfsa go thoma go $1",
+       "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",
        "table_pager_last": "Letlakala la mafelelo",
        "table_pager_empty": "Ga gona sepheto",
        "autosumm-new": "Tlhodile letlakala ka '$1'",
-       "watchlistedit-numitems": "Lenano la gago la ditlhapetšo le na le  {{PLURAL:$1|thaetlele ye tee|di thaetlele tše $1}}, re sa bale matlakala a dipolelo.",
-       "watchlistedit-noitems": "Lenano la gago la ditlhapetšo ga lena dithaetlele.",
        "watchlistedit-normal-title": "Felotal lenano la ditlhapetšo",
        "watchlistedit-normal-legend": "Tloša dithaetlele go lenano la ditlhapetšo",
        "watchlistedit-normal-submit": "Tloša thaetlele",
index 8d7979c..a7dafa9 100644 (file)
@@ -11,7 +11,8 @@
                        "Nemo bis",
                        "Spacebirdy",
                        "Горан Анђелковић",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Soslinhar los ligams :",
        "readonly_lag": "La banca de donadas es estada automaticament clavada pendent que los servidors segondaris ratrapan lor retard sul servidor principal.",
        "internalerror": "Error intèrna",
        "internalerror_info": "Error intèrna: $1",
-       "fileappenderrorread": "Impossible de legir « $1 » al moment de l’insercion",
-       "fileappenderror": "Impossible d'apondre « $1 » a « $2 ».",
        "filecopyerror": "Impossible de copiar lo fichièr « $1 » cap a « $2 ».",
        "filerenameerror": "Impossible de tornar nomenar lo fichièr « $1 » en « $2 ».",
        "filedeleteerror": "Impossible de suprimir lo fichièr « $1 ».",
        "directorycreateerror": "Impossible de crear lo dorsièr « $1 ».",
        "filenotfound": "Impossible de trobar lo fichièr « $1 ».",
-       "fileexistserror": "Impossible d’escriure dins lo dorsièr « $1 » : lo fichièr existís",
        "unexpected": "Valor imprevista : « $1 » = « $2 ».",
        "formerror": "Error: Impossible de sometre lo formulari",
        "badarticleerror": "Aquesta accion pòt pas èsser efectuada sus aquesta pagina.",
        "userlogin-helplink2": "Ajuda a la connexion",
        "userlogin-loggedin": "Sètz ja connectat en tant que {{GENDER:$1|$1}}.\nUtilizatz lo formulari çaijós per vos connectar amb un autre utilizaire.",
        "userlogin-createanother": "Crear un autre compte",
-       "createacct-join": "Entratz vòstras informacions çaijós.",
-       "createacct-another-join": "Picar las informacions del novèl compte çaijós.",
        "createacct-emailrequired": "Adreça electronica",
        "createacct-emailoptional": "Adreça de corrièr electronic (facultativa)",
        "createacct-email-ph": "Entratz vòstra adreça de corrièr electronic",
        "savearticle": "Salvar",
        "preview": "Previsualizar",
        "showpreview": "Previsualizacion",
-       "showlivepreview": "Apercebut rapid",
        "showdiff": "Veire los cambiaments",
        "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.''",
        "edit-gone-missing": "A pas pogut metre a jorn la pagina.\nSembla que siá estada suprimida.",
        "edit-conflict": "Modificar lo conflicte.",
        "edit-no-change": "Vòstra modificacion es estada ignorada perque cap de cambiament es pas estat fach dins lo tèxte.",
-       "postedit-confirmation": "Vòstra modificacion es estada salvada.",
+       "postedit-confirmation-created": "La pagina es estada creada.",
+       "postedit-confirmation-restored": "La pagina es estada restablida.",
+       "postedit-confirmation-saved": "Vòstra modificacion es estada salvada.",
        "edit-already-exists": "La pagina novèla a pogut èsser creada .\nExistís ja.",
        "defaultmessagetext": "Messatge per defaut",
        "content-failed-to-parse": "Fracàs de l'analisi del contengut de $2 pel modèl $1: $3",
        "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-redir": "Lista de las redireccions",
        "powersearch-togglelabel": "Marcar :",
        "powersearch-toggleall": "Tot",
        "powersearch-togglenone": "Pas cap",
        "prefs-advancedsearchoptions": "Opcions avançadas",
        "prefs-advancedwatchlist": "Opcions avançadas",
        "prefs-displayrc": "Opcions d'afichatge",
-       "prefs-displaysearchoptions": "Opcions d'afichatge",
        "prefs-displaywatchlist": "Opcions d'afichatge",
        "prefs-tokenwatchlist": "Geton",
        "prefs-diffs": "Diferéncias",
        "recentchanges-legend-heading": "'''Legenda :'''",
        "recentchanges-legend-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).",
-       "rclistfrom": "Afichar las modificacions novèlas dempuèi lo $1.",
+       "rclistfrom": "Afichar las modificacions novèlas dempuèi lo $3 $2",
        "rcshowhideminor": "$1 los cambiaments menors",
        "rcshowhideminor-show": "Afichar",
        "rcshowhideminor-hide": "Amagar",
        "uploadstash-refresh": "Actualizar la lista dels fichièrs",
        "invalid-chunk-offset": "Offset de segment invalid",
        "img-auth-accessdenied": "Accès refusat",
-       "img-auth-nopathinfo": "PATH_INFO mancant. Vòstre servidor es pas parametrat per passar aquesta informacion.\nBenlèu que fonciona en CGI e supòrta pas img_atuh. Consultatz https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "PATH_INFO mancant. Vòstre servidor es pas parametrat per passar aquesta informacion.\nBenlèu que fonciona en CGI e supòrta pas img_atuh. Consultatz https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Lo camin demandat es pas lo repertòri de telecargament configurat.",
        "img-auth-badtitle": "Impossible de construire un títol valid a partir de « $1 ».",
        "img-auth-nologinnWL": "Sètz pas connectat e « $1 » es pas dins la lista blanca.",
        "unwatchedpages": "Paginas pas seguidas",
        "listredirects": "Lista de las redireccions",
        "listduplicatedfiles": "Lista de fichièrs en doble",
+       "listduplicatedfiles-entry": "[[:File:$1|$1]] a [[$3|{{PLURAL:$2|un doblon|$2 doblons}}]].",
        "unusedtemplates": "Modèls inutilizats",
        "unusedtemplatestext": "Aquesta pagina lista totas las paginas de l’espaci de noms {{ns:template}} que son pas enclusas dins cap d'autra pagina.\nDoblidetz pas de verificar se i a pas d’autre ligam cap als modèls abans de los suprimir.",
        "unusedtemplateswlh": "autres ligams",
        "pageswithprop-prophidden-binary": "valor de proprietat binària amagada ($1)",
        "doubleredirects": "Redireccions doblas",
        "doubleredirectstext": "Vaquí una lista de las paginas que redirigisson cap a de paginas que son elas-meteissas de paginas de redireccion.\nCada entrada conten de ligams cap a la primièra e la segonda redireccions, e mai la primièra linha de tèxte de la segonda pagina, çò que provesís, de costuma, la « vertadièra » pagina cibla, cap a la quala la primièra redireccion deuriá redirigir.\nLas entradas <del>barradas</del> son estadas resolgudas.",
-       "double-redirect-fixed-move": "[[$1]] es estat renomenat, aquò es ara una redireccion cap a [[$2]]",
-       "double-redirect-fixed-maintenance": "Correccion de  la doble redireccion de [[$1]] a [[$2]]",
+       "double-redirect-fixed-move": "[[$1]] es estat desplaçat.\nEs estat mes a jorn automaticament e redirigís ara cap a [[$2]].",
+       "double-redirect-fixed-maintenance": "Correccion automatica de la dobla redireccion de [[$1]] cap a [[$2]] dins un prètzfach de mantenença.",
        "double-redirect-fixer": "Corrector de redireccion",
        "brokenredirects": "Redireccions copadas",
        "brokenredirectstext": "Aquestas redireccions mènan cap a de paginas qu'existisson pas :",
        "log-title-wildcard": "Recercar de títols que començan per aqueste tèxte",
        "showhideselectedlogentries": "Afichar/amagar las entradas de jornal seleccionadas",
        "allpages": "Totas las paginas",
-       "alphaindexline": "$1 a $2",
        "nextpage": "Pagina seguenta ($1)",
        "prevpage": "Pagina precedenta ($1)",
        "allpagesfrom": "Afichar las paginas a partir de :",
        "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'''.",
-       "watchmethod-recent": "verificacion dels darrièrs cambiaments per i trobar de paginas seguidas",
-       "watchmethod-list": "verificacion de las paginas seguidas per de modificacions recentas",
-       "watchlistcontains": "Vòstra lista de seguiment conten $1 {{PLURAL:$1|pagina|paginas}}.",
-       "iteminvalidname": "Problèma amb l'article « $1 » : lo nom es invalid...",
        "wlshowlast": "Far veire las darrièras $1 oras, los darrièrs $2 jorns, o $3.",
        "watchlist-options": "Opcions de la lista de seguiment",
        "watching": "Seguit...",
        "enotif_lastvisited": "Consultatz $1 per totes los cambiaments dempuèi vòstra darrièra visita.",
        "enotif_lastdiff": "Consultatz $1 per veire aquesta modificacion.",
        "enotif_anon_editor": "utilizaire anonim $1",
-       "enotif_body": "Car $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nResumit del contributor :\n$PAGESUMMARY $PAGEMINOREDIT\n\nContactatz aqueste contributor :\ncorrièl : $PAGEEDITOR_EMAIL\nwiki : $PAGEEDITOR_WIKI\n\nI aurà pas d’autras notificacions en cas de cambiaments ulteriors, levat se visitatz aquela pagina un còp connectat. Podètz tanben reïnicializar las bandièras de notificacion per totas las paginas de vòstra lista de seguiment.\n\nVòstre sistèma de notificacion de {{SITENAME}}\n\n--\nPour modificar los paramètres de notificacion per corrièl, visitatz {{canonicalurl:{{#special:Preferences}}}}\n\nPer modificar los paramètres de vòstra lista de seguiment, visitatz\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPer suprimir la pagina de vòstra lista de seguiment, visitatz\n$UNWATCHURL\n\nRetorn e assisténcia :\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Car $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nResumit del contributor :\n$PAGESUMMARY $PAGEMINOREDIT\n\nContactatz aqueste contributor :\ncorrièl : $PAGEEDITOR_EMAIL\nwiki : $PAGEEDITOR_WIKI\n\nI aurà pas d’autras notificacions en cas de cambiaments ulteriors, levat se visitatz aquela pagina un còp connectat. Podètz tanben reïnicializar las bandièras de notificacion per totas las paginas de vòstra lista de seguiment.\n\nVòstre sistèma de notificacion de {{SITENAME}}\n\n--\nPour modificar los paramètres de notificacion per corrièl, visitatz {{canonicalurl:{{#special:Preferences}}}}\n\nPer modificar los paramètres de vòstra lista de seguiment, visitatz\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPer suprimir la pagina de vòstra lista de seguiment, visitatz\n$UNWATCHURL\n\nRetorn e assisténcia :\n$HELPPAGE",
        "created": "creada",
        "changed": "modificada",
        "deletepage": "Suprimir la pagina",
        "blockip": "Blocar en escritura",
        "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).",
-       "ipadressorusername": "Adreça IP o nom d’utilizaire :",
+       "ipaddressorusername": "Adreça IP o nom d’utilizaire :",
        "ipbexpiry": "Durada del blocatge :",
        "ipbreason": "Motiu :",
        "ipbreason-dropdown": "* Motius de blocatge mai frequents\n** Vandalisme\n** Insercion d’informacions faussas\n** Supression de contengut sens justificacion\n** Insercion repetida de ligams extèrnes publicitaris (spam)\n** Insercion de contengut sens cap de sens\n** Temptativa d’intimidacion o agarriment\n** Abús d’utilizacion de comptes multiples\n** Nom d’utilizaire inacceptable, injuriós o difamant",
        "monobook.js": "/* Tot JavaScript aicí serà cargat amb las paginas accedidas pels utilizaires de l’abilhatge MonoBook unicament. */",
        "modern.js": "/* Tot JavaScript aicí serà cargat amb las paginas accedidas pels utilizaires de l’abilhatge Modern unicament. */",
        "vector.js": "/* Tot JavaScript aicí serà cargat amb las paginas accedidas pels utilizaires de l’abilhatge Vector unicament. */",
-       "notacceptable": "Aqueste servidor wiki pòt pas fornir las donadas dins un format que vòstre client es capable de legir.",
        "anonymous": "{{PLURAL:$1|Utilizaire anonim|Utilizaires anonims}} de {{SITENAME}}",
        "siteuser": "Utilizaire $1 de {{SITENAME}}",
        "anonuser": "l'utilizaire anonim $1 de {{SITENAME}}",
        "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) :",
-       "showhidebots": "($1 bòts)",
        "noimages": "Cap d'imatge d'afichar pas.",
        "ilsubmit": "Cercar",
        "bydate": "per data",
        "size-kilobytes": "$1 Ko",
        "size-megabytes": "$1 Mo",
        "size-gigabytes": "$1 Go",
-       "livepreview-loading": "Cargament…",
-       "livepreview-ready": "Cargament… Acabat!",
-       "livepreview-failed": "L’apercebut rapid a pas capitat!\nEnsajatz la previsualizacion normala.",
-       "livepreview-error": "Impossible de se connectar : $1 \"$2\"\nEnsajatz la previsualizacion normala.",
        "lag-warn-normal": "Los cambiaments que datan de mens de $1 {{PLURAL:$1|segonda|segondas}} pòdon aparéisser pas dins aquesta lista.",
        "lag-warn-high": "En rason d’una fòrta carga de las bancas de donadas, los cambiaments que datan de mens de $1 {{PLURAL:$1|segonda|segondas}} pòdon aparéisser pas dins aquesta lista.",
-       "watchlistedit-numitems": "Vòstra lista de seguiment conten {{PLURAL:$1|una pagina|$1 paginas}}, sens comptar las paginas de discussion",
-       "watchlistedit-noitems": "Vòstra lista de seguiment conten pas cap de pagina.",
        "watchlistedit-normal-title": "Modificacion de la lista de seguiment",
        "watchlistedit-normal-legend": "Levar de paginas de la lista de seguiment",
        "watchlistedit-normal-explain": "Las paginas que seguissètz son visiblas çaijós, classadas per espaci de noms. Per levar una pagina (e sa pagina de discussion) de la lista, seleccionatz la casa al costat puèi clicatz sul boton en bas. Tanben la podètz [[Special:EditWatchlist/raw|modificar en mòde brut]].",
        "compare-invalid-title": "Lo títol qu'avètz especificat es incorrècte.",
        "compare-title-not-exists": "Lo títol qu'avètz especificat existís pas",
        "compare-revision-not-exists": "La revision qu'avètz especificada existís pas.",
-       "dberr-header": "Aqueste wiki a un problèma",
        "dberr-problems": "O planhèm ! Aqueste site rencontra de dificultats tecnicas.",
        "dberr-again": "Ensajatz d'esperar qualques minutas e tornatz cargar.",
        "dberr-info": "(Se pòt pas connectar al servidor de la banca de donadas : $1)",
index 457a856..15f95f9 100644 (file)
                        "Odisha1",
                        "Sambiwiki",
                        "Shisir 1945",
-                       "ଶିତିକଣ୍ଠ ଦାଶ"
+                       "ଶିତିକଣ୍ଠ ଦାଶ",
+                       "아라"
                ]
        },
        "tog-underline": "ତଳେ ଥିବା ଲିଙ୍କ:",
-       "tog-hideminor": "à¬\9bà­\8bà¬\9f à¬\9bà­\8bà¬\9f à¬¨à¬\97ଦ à¬¬à¬¦à¬³ ସବୁକୁ ଲୁଚାଇବେ",
+       "tog-hideminor": "ନିà¬\95à¬\9fରà­\87 à¬¹à­\8bà¬\87ଥିବା à¬\9bà­\8bà¬\9f à¬¬à¬¦à¬³ସବୁକୁ ଲୁଚାଇବେ",
        "tog-hidepatrolled": "ନଗଦ ବଦଳରେ ଥିବା ଜଗାହୋଇଥିବା ବଦଳ ସବୁକୁ ଲୁଚାଇବେ",
        "tog-newpageshidepatrolled": "ନୂଆ ପୃଷ୍ଠାତାଲିକାରୁ ଜଗାହୋଇଥିବା ବଦଳସବୁକୁ ଲୁଚାଇବେ",
-       "tog-extendwatchlist": "à¬\95à­\87ବଳ à¬¨à¬\97ଦ à¬¨à­\81ହà­\87à¬\81, à¬¸à¬¬à­\81ଯାà¬\95 à¬¬à¬¦à¬³à¬\95à­\81 à¬¦à­\87à¬\96ାà¬\87ବା à¬¨à¬¿à¬®à¬¨à­\8dତà­\87 à¬¦à­\87à¬\96ଣାତାଲିà¬\95ାà¬\95à­\81 à¬¬à¬¢à¬¼ାଇବେ",
+       "tog-extendwatchlist": "à¬\95à­\87ବଳ à¬¨à¬\97ଦ à¬¹à¬¿à¬\81 à¬¨à­\81ହà­\87à¬\81, à¬¸à¬¬à­\81ଯାà¬\95 à¬¬à¬¦à¬³à¬\95à­\81 à¬¦à­\87à¬\96ାà¬\87ବା à¬ªà¬¾à¬\87à¬\81 à¬¦à­\87à¬\96ଣାତାଲିà¬\95ାà¬\95à­\81 à¬ªà­\82ରା à¬¦à­\87à¬\96ାଇବେ",
        "tog-usenewrc": "ନଗଦ ବଦଳରେ ପୃଷ୍ଠା ଅନୁଯାୟୀ ଗୋଷ୍ଠୀ ବଦଳ ଏବଂ ଦେଖଣା",
        "tog-numberheadings": "ଆପେଆପେ-ସଂଖ୍ୟାର ନାମଗୁଡ଼ିକ",
        "tog-showtoolbar": "ସମ୍ପାଦନା ଟୁଲବାର ଦେଖାଇବେ",
        "tog-editondblclick": "ଦୁଇଥର କ୍ଲିକରେ ପୃଷ୍ଠା ବଦଳାଇବେ",
        "tog-editsectiononrightclick": "ବିଭାଗ ନାମରେ ଡାହାଣ କ୍ଲିକ କରି ବିଭାଗ ସମ୍ପାଦନାକୁ ସଚଳ କରିବେ",
-       "tog-rememberpassword": "ଏହି ବ୍ରାଉଜରରେ (ସର୍ବାଧିକ $1 {{PLURAL:$1|day|ଦିନ}}) ପାଇଁ ମୋ ଲଗ-ଇନ ମନେରଖିଥିବେ",
        "tog-watchcreations": "ମୋ ତିଆରି ପୃଷ୍ଠାସବୁକୁ ଏବଂ ମୋ ଅପଲୋଡ଼ଗୁଡ଼ିକୁ ମୋର ଦେଖଣାତାଲିକାରେ ଯୋଡ଼ନ୍ତୁ",
        "tog-watchdefault": "ମୁଁ ବଦଳେଇଥିବା ପୃଷ୍ଠା ଏବଂ ଫାଇଲଗୁଡ଼ିକୁ ମୋର ଦେଖଣାତାଲିକାରେ ଯୋଡ଼ନ୍ତୁ",
        "tog-watchmoves": "ମୁଁ ଘୁଞ୍ଚାଇଥିବା ପୃଷ୍ଠା ଏବଂ ଫାଇଲଗୁଡ଼ିକୁ ମୋର ଦେଖଣାତାଲିକାରେ ଯୋଡ଼ନ୍ତୁ",
@@ -41,7 +41,7 @@
        "tog-uselivepreview": "ସାଥେ ସାଥେ ଚାଲିଥିବା ଦେଖଣା ବ୍ୟବହାର କରିବେ (ପରୀକ୍ଷାରେ ଅଛି)",
        "tog-forceeditsummary": "ଖାଲି ସମ୍ପାଦନା ସାରକଥାକୁ ଯିବା ବେଳେ ମୋତେ ଜଣାଇବେ",
        "tog-watchlisthideown": "ମୋ ଦେଖଣା ତାଲିକାରେ ମୋ ନିଜର ସମ୍ପାଦନାଗୁଡ଼ିକ ଲୁଚାଇବେ",
-       "tog-watchlisthidebots": "ଦà­\87à¬\96ଣା à¬¤à¬¾à¬²à¬¿à¬\95ାରà­\87 à¬¬à¬\9f à¬¦à­\87à¬\87 à¬¬à¬¦à¬³ à¬\97à­\81ଡ଼ିà¬\95 ଲୁଚାଇବେ",
+       "tog-watchlisthidebots": "ଦà­\87à¬\96ଣା à¬¤à¬¾à¬²à¬¿à¬\95ାରà­\87 à¬¸à­\8dà­±à­\9fà¬\82à¬\9aାଳà¬\95 (Bot)ର à¬¸à¬®à­\8dପାଦନାମାନ ଲୁଚାଇବେ",
        "tog-watchlisthideminor": "ଦେଖଣା ତାଲିକାରେ ଛୋଟ ଛୋଟ ବଦଳ ଗୁଡ଼ିକ ଲୁଚାଇବେ",
        "tog-watchlisthideliu": "ଲଗ ଇନ କରିଥିବା ସଭ୍ୟମାନଙ୍କ ଦେଇ କରାହୋଇଥିବା ବଦଳଗୁଡ଼ିକ ଲୁଚାଇବେ",
        "tog-watchlisthideanons": "ଅଜଣା ସଭ୍ୟମାନଙ୍କ ଦେଇ କରାହୋଇଥିବା ବଦଳଗୁଡ଼ିକ ଲୁଚାଇବେ",
        "permalink": "ସବୁଦିନିଆ ଲିଙ୍କ",
        "print": "ପ୍ରିଣ୍ଟ କରିବେ",
        "view": "ଦେଖଣା",
+       "view-foreign": "$1ରେ ଦେଖନ୍ତୁ",
        "edit": "ସମ୍ପାଦନା (Edit)",
+       "edit-local": "ସ୍ଥାନୀୟ ବିବରଣ ସମ୍ପାଦନା କରନ୍ତୁ",
        "create": "ତିଆରି କରନ୍ତୁ",
+       "create-local": "ନିଜର ସ୍ଥାନୀୟ ବିବରଣ ଯୋଡ଼ନ୍ତୁ",
        "editthispage": "ଏହି ପୃଷ୍ଠାଟିକୁ ବଦଳାଇବେ",
        "create-this-page": "ଏହି ପୃଷ୍ଠା ତିଆରି କରିବେ",
        "delete": "ଲିଭାଇବେ",
        "pool-errorunknown": "ଅଜଣା ଅସୁବିଧା",
        "aboutsite": "{{SITENAME}} ବାବଦରେ",
        "aboutpage": "Project:ବାବଦରେ",
-       "copyright": "à¬\85ଲà¬\97ା à¬­à¬¾à¬¬à­\87 à¬\89ଲà­\8dଲà­\87à¬\96 à¬¨ à¬\95ରାଯିବ à¬¯à¬¾à¬\8fà¬\81 à¬\8fହା $1 à¬°à­\87 à¬¸à¬°à­\8dବସà­\8dଵତà­\8dଵ à¬¸à¬\82ରà¬\95à­\8dଷିତ",
+       "copyright": "ଯଦି à¬\89ଲà­\8dଲà­\87à¬\96 à¬¹à­\8bà¬\87ନାହିà¬\81 à¬\8fହା $1 à¬\85ଧà­\80ନରà­\87 à¬¬à¬¿à¬¤à¬°à¬¿à¬¤ à¥¤",
        "copyrightpage": "{{ns:project}}:କପିରାଇଟ",
        "currentevents": "ଏବେକାର ଘଟଣା",
        "currentevents-url": "Project:ଏବେକାର ଘଟଣା",
        "toc": "ବିଷୟସୂଚୀ",
        "showtoc": "ଦେଖାଇବେ",
        "hidetoc": "ଲୁଚାନ୍ତୁ",
-       "collapsible-collapse": "à¬\9aାପିଦà­\87ବà­\87",
-       "collapsible-expand": "ବଢ଼ାଇବେ",
+       "collapsible-collapse": "ଲà­\81à¬\9aାà¬\87ବà­\87",
+       "collapsible-expand": "ଦà­\87à¬\96ାଇବେ",
        "thisisdeleted": "$1 କୁ ଦେଖିବେ ଅବା ପୁନସ୍ଥାପନ କରିବେ?",
        "viewdeleted": "ଦେଖିବା $1?",
        "restorelink": "{{PLURAL:$1|ଗୋଟିଏ ଲିଭାଯାଇଥିବା ବଦଳ|$1ଟି ଲିଭାଯାଇଥିବା ବଦଳ}}",
        "readonly_lag": "ଏହି ଡାଟାବେସଟିରେ ଆପେ ଆପେ ତାଲା ପଡ଼ିଯାଇଅଛି, ଇତିମଧ୍ୟରେ ସାନ ଡାଟାବେସଟି ମୁଖ୍ୟ ଡାଟାବେସ ସହିତ ଯୋଗାଯୋଗ କରୁଅଛି",
        "internalerror": "ଭିତରର ଭୁଲ",
        "internalerror_info": "ଭିତରର ଭୁଲ : $1",
-       "fileappenderrorread": "ଯୋଡ଼ିବା ବେଳେ \"$1\"କୁ ପଢ଼ିପାରିଲୁଁ ନାହିଁ ।",
-       "fileappenderror": "\"$1\" ସହ \"$2\" କୁ ଯୋଡ଼ିପାରିଲୁଁ ନାହିଁ ।",
        "filecopyerror": "\"$1\" ରୁ \"$2\" କୁ ନକଲ କରିପାରିଲୁଁ ନାହିଁ ।",
        "filerenameerror": "\"$1\" ରୁ \"$2\" କୁ ନାମ ବଦଳ କରିପାରିଲୁଁ ନାହିଁ ।",
        "filedeleteerror": "\"$1\" ଫାଇଲଟି ଲିଭାଇ ପାରିଲୁଁ ନାହିଁ ।",
        "directorycreateerror": "\"$1\" ସୂଚିଟି ତିଆରି କରିପାରିଲୁଁ ନାହିଁ ।",
        "filenotfound": "\"$1\" ଫାଇଲଟି ପାଇଲୁ ନାହିଁ ।",
-       "fileexistserror": "\"$1\" ଫାଇଲଟି ଲେଖିପାରିଲୁଁ ନାହିଁ: ଏହା ଆଗରୁ ଅଛି",
        "unexpected": "ଅଜଣା ନାମ ମିଳିଲା: \"$1\"=\"$2\" ।",
        "formerror": "ଭୁଲ: ଫର୍ମଟି ପଠାଇ ପାରିଲୁଁ ନାହିଁ",
        "badarticleerror": "ଏହି ପୃଷ୍ଠାରେ ଏହି କାମଟି ହୋଇପାରିବ ନାହିଁ ।",
        "invalidtitle-knownnamespace": "\"$2\" ନେମସ୍ପେସ ଏବଂ \"$3\" ଲେଖାଥିବା ଅବୈଧ ଶୀର୍ଷକ ।",
        "invalidtitle-unknownnamespace": "\"$1\" ନେମ୍ସ୍ପେସ ଏବଂ \"$2\" ଲେଖାଥିବା ଅବୈଧ ଶୀର୍ଷକ ।",
        "exception-nologin": "ଲଗ‌‌ ଇନ କରିନାହାନ୍ତି",
-       "exception-nologin-text": "ଏହା କରିବାକୁ ହେଲେ ଆପଣଙ୍କୁ ଏହି ଉଇକିରେ ଲଗଇନ କରିବାକୁ ପଡିବ ।",
+       "exception-nologin-text": "ଏହି ପୃଷ୍ଠା ପଢ଼ିବା ପାଇଁ ଦୟାକରି [[Special:Userlogin|ଲଗ ଇନ]] କରନ୍ତୁ ।",
+       "exception-nologin-text-manual": "ଏହି ପୃଷ୍ଠା ଦେଖିବା ନିମନ୍ତେ $1 କରନ୍ତୁ ।",
        "virus-badscanner": "ମନ୍ଦ ସଂରଚନା: ଅଜଣା ଭାଇରସ ସ୍କାନର: ''$1''",
        "virus-scanfailed": "ସ୍କାନ କରିବା ବିଫଳ ହେଲା (କୋଡ଼ $1)",
        "virus-unknownscanner": "ଅଜଣା ଆଣ୍ଟିଭାଇରସ:",
-       "logouttext": "'''ଲଗ-ଆଉଟ ହୋଇଗଲା ।'''\n\nଆପଣ ଅଚିହ୍ନା ଭାବରେ {{SITENAME}}କୁ ଯାଇପାରିବେ, କିମ୍ବା  ଆଗରୁ ଲଗ-ଇନ କରିଥିବା Usernameରେ <span class='plainlinks'>[$1 ଆଉଥରେ ଲଗ-ଇନ କରିପାରିବେ]</span> ।\nଜାଣିରଖନ୍ତୁ, କିଛି ପୃଷ୍ଠା ଲଗ-ଆଉଟ କଲାପରେ ବି ଆଗପରି ଦେଖାଯାଇପାରେ,  ବ୍ରାଉଜରର Cache (ଅସ୍ଥାୟୀ ସ୍ମୃତି) ହଟାଇଲା ଯାଏଁ ଏହା ଏମିତି ରହିବ ।",
+       "logouttext": "<strong>ଲଗ-ଆଉଟ ହୋଇଗଲା ।</strong>\n\nଆପଣ ନିଜର ବ୍ରାଉଜରର ଅସ୍ଥାୟୀ ସ୍ମତି (cache) ନ ଲିଭାଇବା ଯାଏ ହୁଏତ କିଛି ପୃଷ୍ଠାରେ ଲଗ-ଇନ ହୋଇ ରହିପାରେ ।",
        "welcomeuser": "ସ୍ଵାଗତ, $1!",
        "welcomecreation-msg": "ଆପଣଙ୍କ ଖାତାଟି ଖୋଲାଗଲା\nନିଜର [[Special:Preferences|{{SITENAME}} ପସନ୍ଦସବୁକୁ]] ବଦଳାଇବାକୁ ଭୁଲିବେ ନାହିଁ ।",
        "yourname": "ବ୍ୟବହାରକାରୀଙ୍କ ନାମ:",
        "gotaccountlink": "ଲଗ ଇନ (Log in)",
        "userlogin-resetlink": "ଲଗଇନ ତଥ୍ୟ ସବୁ ଭୁଲିଗେଲେକି?",
        "userlogin-resetpassword-link": "ପାସୱାର୍ଡ଼ ଭୁଲିଯାଇଛନ୍ତି ?",
+       "userlogin-helplink2": "ଲଗ ଇନ ପାଇଁ ସହଯୋଗ କରନ୍ତୁ",
+       "userlogin-loggedin": "ଆପଣ {{GENDER:$1|$1}} ନାମରେ ଲଗ ଇନ କରିଛନ୍ତି । ତଳ ଫର୍ମଟି ବ୍ୟବହାର କରି ଆଉ ଜଣେ ସଭ୍ୟ ଭାବେ ଲଗ ଇନ କରନ୍ତୁ ।",
+       "userlogin-createanother": "ଆଉ ଏକ ଖାତା ତିଆରି କରନ୍ତୁ",
        "createacct-emailrequired": "ଇମେଲ ଠିକଣା",
        "createacct-emailoptional": "ଇମେଲ ଠିକଣା (ଇଚ୍ଛାଧୀନ)",
        "createacct-email-ph": "ଆପଣଙ୍କ ଇମେଲ ଠିକଣା ନିବେଶ କରନ୍ତୁ",
        "createaccountreason": "କାରଣ:",
        "createacct-reason": "କାରଣ",
        "createacct-reason-ph": "ଆପଣ ଅନ୍ୟଏକ ଖାତା କାହିଁକି ତିଆରି କରୁଛନ୍ତି",
+       "createacct-captcha": "ନିରାପତ୍ତା ଯାଞ୍ଚ",
        "createacct-imgcaptcha-ph": "ଉପରେ ଲେଖାଥିବା ଲେଖାଟି ଲେଖନ୍ତୁ",
        "createacct-submit": "ନିଜର ନୂଆ ଖାତାଟିଏ ଖୋଲନ୍ତୁ",
        "createacct-another-submit": "ଆଉ ଏକ ଖାତା ଖୋଲନ୍ତୁ",
        "createacct-benefit-heading": "{{SITENAME}} ଆପଣଙ୍କ ଭଳି ଲୋକମାନଙ୍କ ଦ୍ୱାରା ଗଢ଼ା ।",
        "createacct-benefit-body1": "{{PLURAL:$1|ସମ୍ପାଦନା|ସମ୍ପାଦନାମାନ}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|ପୃଷ୍ଠା|ପୃଷ୍ଠାମାନ}}",
+       "createacct-benefit-body3": "ନଗଦ {{PLURAL:$1|ଅବଦାନକାରୀ|ଅବଦାନକାରୀଗଣ}}",
        "badretype": "ଆପଣ ଦେଇଥିବା ପାସବାର୍ଡ଼ଟି ମେଳଖାଉନାହିଁ ।",
        "userexists": "ଆପଣ ଦେଇଥିବା ଇଉଜର ନାମ ଆଗରୁ ଅଛି ।\nଦୟାକରି ଅଲଗା ନାମଟିଏ ବାଛନ୍ତୁ ।",
        "loginerror": "ଲଗ‌‌ଇନ ଭୁଲ",
+       "createacct-error": "ଖାତା ଖୋଲିବାରେ ଅସୁବିଧା ଘଟିଲା",
        "createaccounterror": "$1 ନାମରେ ଖାତାଟିଏ ଖୋଲାଯାଇପାରିଲା ନାହିଁ",
        "nocookiesnew": "ଇଉଜର ନାମଟି ତିଆରି କରିଦିଆଗଲା, ହେଲେ ଆପଣ ଲଗ ଇନ କରିନାହାନ୍ତି ।\n{{SITENAME}} ସଭ୍ୟମାନଙ୍କୁ ଲଗ ଇନ କରିବା ନିମନ୍ତେ କୁକି ବ୍ୟବହାର କରିଥାଏ । ଆପଣଙ୍କ କୁକି ଅଚଳ କରାଯାଇଅଛି ।\nଦୟାକରି ତାହାକୁ ସଚଳ କରନ୍ତୁ ଓ ତାହା ପରେ ଆପଣଙ୍କ ନୂଆ ଇଉଜର ନାମ ଓ ପାସୱାର୍ଡ଼ ସହିତ ଲଗ ଇନ କରନ୍ତୁ ।",
        "nocookieslogin": "{{SITENAME}} ସଭ୍ୟ ମାନଙ୍କୁ ଲଗ ଇନ କରାଇବା ପାଇଁ କୁକି ବ୍ୟବହାର କରିଥାଏ ।\nଆପଣଙ୍କର କୁକି ଅଚଳ ହୋଇଅଛି ।\nଦୟାକରି ତାହାକୁ ସଚଳ କରି ଆଉଥରେ ଚେଷ୍ଟା କରନ୍ତୁ ।",
        "passwordtooshort": "ପାସୱାର୍ଡ଼ଟି ଅତି କମରେ {{PLURAL:$1|ଗୋଟିଏ ଅକ୍ଷର|$1ଟି ଅକ୍ଷର}}ର ହୋଇଥିବା ଲୋଡ଼ା ।",
        "password-name-match": "ଆପଣଙ୍କ ପାସୱାର୍ଡ଼ଟି ଆପଣଙ୍କ ଇଉଜର ନାମ ଠାରୁ ଅଲଗା ହେବା ଉଚିତ ।",
        "password-login-forbidden": "ଏହି ଇଉଜର ନାମ ଓ ପାସୱାର୍ଡ଼ର ବ୍ୟବହାରକୁ ବାରଣ କରାଯାଇଅଛି ।",
-       "mailmypassword": "ପାସୱାର୍ଡ଼ଟିକୁ ଇମେଲ କରି ପଠାଇବେ",
+       "mailmypassword": "ପାସୱାର୍ଡ଼ଟି ରିସେଟ କରିବେ",
        "passwordremindertitle": "{{SITENAME}} ପାଇଁ ନୂଆ ଅଳ୍ପ କାଳର ପାସୱାର୍ଡ଼",
        "passwordremindertext": "କେହିଜଣେ (ବୋଧେ ଆପଣ, $1 IP ଠିକଣାରୁ) \nନୂଆ ପାସବାର୍ଡ଼ଟିଏ ପାଇଁ {{SITENAME}} ($4) ରେ ଆବେଦନ କରିଅଛନ୍ତି । \"$2\"ଙ୍କ ପାଇଁ ଏକ ଅସ୍ଥାୟୀ ପାସବାର୍ଡ଼\nତିଆରି କରିଦିଆଗଲା ଓ ତାହାକୁ \"$3\" ପାଇଁ ଖଞ୍ଜି ଦିଆଗଲା । ଯଦି ଏହା ଆପଣଙ୍କର\nଇଛା ତେବେ ଆପଣଙ୍କୁ ଲଗ ଇନ କରି ନୂଆ ପାସବାର୍ଡ଼ଟିଏ ଏବେ ଦେବାକୁ ପଡ଼ିବ ।\nYour temporary password will expire in {{PLURAL:$5|one day|$5 days}}.\n\nIf someone else made this request, or if you have remembered your password,\nand you no longer wish to change it, you may ignore this message and\ncontinue using your old password.",
        "noemail": "ସଭ୍ୟ \"$1\"ଙ୍କ ପାଇଁ କିଛି ବି ଇ-ମେଲ ଆଇ.ଡି. ସାଇତାଯାଇନାହିଁ  ।",
        "noemailcreate": "ଆପଣଙ୍କୁ ଏକ ସଚଳ ଇ-ମେଲ ଠିକଣା ଦେବାକୁ ପଡ଼ିବ",
        "passwordsent": "\"$1\" ପାଇଁ ଥୟ କରାଯାଇଥିବା ଇ-ମେଲକୁ ନୂଆ ପାସୱାର୍ଡ଼ଟିଏ ପଠାଇଦିଆଗଲା ।\nତାହା ମିଳିଲା ପରେ ଆଉଥରେ ଲଗ ଇନ କରନ୍ତୁ ।",
        "blocked-mailpassword": "ଆପଣଙ୍କ IP ଠିକଣାଟି ସମ୍ପାଦନାରେ ଭାଗ ନେବାରୁ ଅଟକାଯାଇଛି, ତେଣୁ ପାସୱାର୍ଡ଼ ଫେରନ୍ତା କାମ ବ୍ୟବହାର କରି ଅବ୍ୟବହାରକୁ ରୋକିବା ଅନୁମୋଦିତ ନୁହେଁ ।",
-       "eauthentsent": "ଆପଣଙ୍କ ବଛା ଇ-ମେଲ ଠିକଣାକୁ ଏକ ଥୟ କରିବା ଇ-ମେଲଟିଏ ପଠାଇଦିଆଗଲା ।\nଖାତାଟି ଆପଣଙ୍କର ବୋଲି ଥୟ କରିବା ନିମନ୍ତେ ଆଉ କେଉଁ ଇ-ମେଲ ଆପଣଙ୍କ ଖାତାକୁ ପଠାହେବା ଆଗରୁ ଆପଣଙ୍କୁ ସେହି ଇ-ମେଲରେ ଥିବା ସୂଚନା ଅନୁସରଣ କରିବାକୁ ପଡ଼ିବ ।",
+       "eauthentsent": "ଆପଣ ଦେଇଥିବା ଇ-ମେଲ ଠିକଣାକୁ ଏକ ମେଲଟିଏ ପଠାଗଲା ।\nଆହୁରି ଅଧିକ ଇ-ମେଲ ଆପଣଙ୍କ ଖାତାକୁ ପଠାହେବା ଆଗରୁ, ଏହି ଖାତାଟି ନିଜର ବୋଲି ଥୟ କରିବା ପାଇଁ ପଠାଯାଇଥିବା ଇ-ମେଲରେ ଥିବା ସୂଚନା ଅନୁସାରେ କାମ କରନ୍ତୁ ।",
        "throttled-mailpassword": "ଗତ {{PLURAL:$1|ଏକ ଘଣ୍ଟାରେ|$1 ଘଣ୍ଟାରେ}} ଆପଣଙ୍କୁ ଏକ ପୁନଃସ୍ଥାପନ ଇମେଲଟିଏ ପଠାଯାଇଛି ।\nଅବ୍ୟବହାରକୁ ରୋକିବା ନିମନ୍ତେ, {{PLURAL:$1|ଏକ ଘଣ୍ଟାରେ|$1 ଘଣ୍ଟାରେ}} କେବଳ ଗୋଟିଏ ଇମେଲ ହିଁ ପଠାହେବ ।",
        "mailerror": "ମେଲ ପଠାଇବାରେ ଭୁଲ : $1",
        "acct_creation_throttle_hit": "ଏହି ଉଇକିର ଦେଖଣାହାରୀ ମାନେ ଆପଣଙ୍କ IP ଠିକଣା ବ୍ୟବହାର କରି ବିଗତ ଦିନରେ {{PLURAL:$1|ଖାତାଟିଏ|$1 ଗୋଟି ଖାତା}} ତିଆରି କରିଛନ୍ତି ଯାହା ସେହି ସମୟସୀମା ଭିତରେ ସବୁଠାରୁ ଅଧିକ ଥିଲା ।\nତେଣୁ, ଏହି IP ଠିକଣାର ଦେଖଣାହାରୀ ଗଣ ଏବେ ଆଉ ଅଧିକ ଖାତା ଖୋଲିପାରିବେ ନାହିଁ ।",
-       "emailauthenticated": "$2 à¬¤à¬¾à¬°à¬¿à¬\96 $3 à¬\98à¬\9fିà¬\95ା à¬¬à­\87ଳà­\87 à¬\86ପଣà¬\99à­\8dà¬\95 à¬\87-ମà­\87ଲ à¬ à¬¿à¬\95ଣାà¬\9fି à¬\85ନà­\81ମà­\8bଦିତ ହେଲା ।",
-       "emailnotauthenticated": "à¬\86ପଣà¬\99à­\8dà¬\95 à¬\87-ମà­\87ଲ à¬ à¬¿à¬\95ଣାà¬\9fି à¬\85ନà­\81ମà­\8bଦିତ à¬¹à­\8bà¬\87ନାହିà¬\81 à¥¤\nà¬\8fହି à¬¸à¬¬à­\81 à¬¸à­\81ବିଧାà¬\95à­\81 à¬¨à­\87à¬\87 à¬\95ିà¬\9bି à¬¬à¬¿ à¬\87-ମà­\87ଲ à¬\86ପଣà¬\99à­\8dà¬\95à­\81 ପଠାଯିବ ନାହିଁ ।",
+       "emailauthenticated": "$2 à¬¤à¬¾à¬°à¬¿à¬\96 $3 à¬\98à¬\9fିà¬\95ା à¬¸à¬®à­\9fରà­\87 à¬\86ପଣà¬\99à­\8dà¬\95 à¬\87-ମà­\87ଲ à¬ à¬¿à¬\95ଣାà¬\9fି à¬¥à­\9f ହେଲା ।",
+       "emailnotauthenticated": "à¬\86ପଣà¬\99à­\8dà¬\95 à¬\87-ମà­\87ଲ à¬ à¬¿à¬\95ଣାà¬\9fି à¬\8f à¬¯à¬¾à¬\8f à¬¥à­\9f à¬¹à­\8bà¬\87ନାହିà¬\81 à¥¤\nà¬\8fହି à¬¸à¬¬à­\81 à¬¸à­\81ବିଧାà¬\95à­\81 à¬¨à­\87à¬\87 à¬\86ପଣà¬\99à­\8dà¬\95à­\81 à¬\95à­\8cଣସି à¬\87-ମà­\87ଲ ପଠାଯିବ ନାହିଁ ।",
        "noemailprefs": "ଆପଣଙ୍କ ପସନ୍ଦ ଭିତରେ ଏକ ଇ-ମେଲ ଠିକଣା ଦିଅନ୍ତୁ ଯାହା ଏହି ସବୁ ସୁବିଧାକୁ ସଚଳ କରାଇବ ।",
        "emailconfirmlink": "ଆପଣଙ୍କ ଇମେଲ ଆଇ.ଡି.ଟି ଠିକ ବୋଲି ଥୟ କରନ୍ତୁ",
        "invalidemailaddress": "ଏହି ଇ-ମେଲ ଠିକଣାଟି ସଠିକ ସଜାଣିରେ ନଥିବାରୁ ଏହାକୁ ଗ୍ରହଣ କରାଯାଇପାରିବ ନାହିଁ ।\nଦୟାକରି ଏକ ସଚଳ ଓ ଠିକ ସଜାଣିରେ ଥିବା ଇ-ମେଲ ଠିକଣା ଦିଅନ୍ତୁ ।",
        "cannotchangeemail": "ଖାତାରେ ଥିବା ଇମେଲ ଏହି ଉଇକିରେ ବଦଳାଯାଇପାରିବ ନାହିଁ ।",
        "emaildisabled": "ଏହି ସାଇଟ ଇ-ମେଲ ପଠାଇ ପାରିବ ନାହିଁ ।",
        "accountcreated": "ଖାତାଟି ଖୋଲାହୋଇଗଲା",
-       "accountcreatedtext": "$1 ପାଇଁ ନୂଆ ଖାତାଟିଏ ତିଆରି ହୋଇଗଲା ।",
+       "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|ଆଲୋଚନା]])ଙ୍କ ନିମନ୍ତେ ସଭ୍ୟ ଖାତାଟିଏ ତିଆରି ହେଲା ।",
        "createaccount-title": "{{SITENAME}} ପାଇଁ ଖାତା ଖୋଲା",
        "createaccount-text": "କେହି ଜଣେ ଆପଣଙ୍କ ଇ-ମେଲ ଠିକଣାରେ {{SITENAME}} ($4) ରେ \"$2\" ନାମରେ, \"$3\" ପାସୱାର୍ଡ଼ରେ ଖାତାଟିଏ ତିଆରି କରିଅଛି ।\nଆପଣ ଏବେ ଲଗ ଇନ କରି ନିଜର ପାସବାର୍ଡ଼ଟିକୁ ବଦଳାଇଦିଅନ୍ତୁ ।\n\nଯଦି ଭୁଲରେ ଏହି ଖାତାଟି ତିଆରି କରାଯାଇଥାଏ, ତେବେ ଏହି ସୂଚନାଟିକୁ ଅଣଦେଖା କରିବେ ।",
-       "login-throttled": "à¬\86ପଣ à¬¬à¬¹à­\81 à¬¥à¬° à¬²à¬\97 à¬\87ନ à¬\95ରିବାର à¬\89ଦà­\8dà­\9fମ à¬\95ରିà¬\85à¬\9bନà­\8dତି à¥¤\nଦà­\9fାà¬\95ରି à¬\86à¬\89ଥରà­\87 à¬\9aà­\87ଷà­\8dà¬\9fା à¬\95ରିବା à¬\86à¬\97ରà­\81 à¬\95ିà¬\9bି à¬\95ାଳ ଅପେକ୍ଷା କରନ୍ତୁ ।",
+       "login-throttled": "à¬\86ପଣ à¬¨à¬¿à¬\95à¬\9fରà­\87 à¬\96à­\81ବ à¬\85ଧିà¬\95 à¬¥à¬° à¬²à¬\97 à¬\87ନ à¬\95ରିବାà¬\95à­\81 à¬\9aà­\87ଷà­\8dà¬\9fା à¬\95ରିà¬\9bନà­\8dତି à¥¤\nà¬\86à¬\89 à¬\85ଧିà¬\95 à¬¥à¬° à¬\9aà­\87ଷà­\8dà¬\9fା à¬\95ରିବା à¬\86à¬\97ରà­\81 à¬¦à­\9fାà¬\95ରି $1 à¬ªà¬¾à¬\87à¬\81 ଅପେକ୍ଷା କରନ୍ତୁ ।",
        "login-abort-generic": "ଆପଣଙ୍କ ଲଗ ଇନ ଅସଫଳ ହେଲା - ନାକଚ କରିଦିଆଗଲା",
        "loginlanguagelabel": "ଭାଷା: $1",
        "suspicious-userlogout": "ଲଗ ଆଉଟ କରିବା ନିମନ୍ତେ ଆପଣ କରିଥିବା ଆବେଦନ ନାକଚ କରିଦିଆଗଲା କାରଣ ଲାଗୁଅଛି ଯେ ଏହା ଏକ ଅସ୍ଥିର ବ୍ରାଉଜରରୁ ପଠାଯାଇଅଛି ଅବା ପ୍ରକ୍ସି ଧରାଯାଇଅଛି ।",
+       "createacct-another-realname-tip": "ପ୍ରକୃତ ନାମ ଦେବା ଆପଣଙ୍କ ଉପରେ ନିର୍ଭର କରେ ।\nଯଦି ଆପଣ ଏହା ଦିଅନ୍ତି, ତେବେ ଏହା ଆପଣଙ୍କ କାମ ପାଇଁ ଶ୍ରେୟ ଦେବାରେ ବ୍ୟବହାର କରାଯାଇପାରିବ ।",
        "pt-login": "ଲଗ-ଇନ",
        "pt-login-button": "ଲଗ-ଇନ",
        "pt-createaccount": "ଖାତାଟିଏ ଖୋଲନ୍ତୁ",
        "retypenew": "ପାସୱାର୍ଡ଼ ଆଉଥରେ ଦିଅନ୍ତୁ:",
        "resetpass_submit": "ପାସୱାର୍ଡ଼ଟିଏ ଦେଇ ଲଗ ଇନ କରନ୍ତୁ",
        "changepassword-success": "ଆପଣଙ୍କ ପାସୱାର୍ଡ଼ଟି ସଫଳତା ପୂର୍ବକ ବଦଳାଇ ଦିଆଗଲା !",
+       "changepassword-throttled": "ଆପଣ ନିକଟରେ ଖୁବ ଅଧିକ ଥର ଲଗ ଇନ କରିବାକୁ ଚେଷ୍ଟା କରିଛନ୍ତି ।\nଆଉ ଅଧିକ ଥର ଚେଷ୍ଟା କରିବା ଆଗରୁ ଦୟାକରି $1 ପାଇଁ ଅପେକ୍ଷା କରନ୍ତୁ ।",
        "resetpass_forbidden": "ପାସୱାର୍ଡ଼ମାନ ବଦଳା ଯାଇପାରିବ ନାହିଁ",
        "resetpass-no-info": "ଏହି ପୃଷ୍ଠାଟିକୁ ସିଧା ଖୋଲିବା ନିମନ୍ତେ ଆପଣଙ୍କୁ ଲଗ ଇନ କରିବାକୁ ପଡ଼ିବ ।",
        "resetpass-submit-loggedin": "ପାସୱାର୍ଡ଼ ବଦଳାନ୍ତୁ",
        "resetpass-submit-cancel": "ନାକଚ",
        "resetpass-wrong-oldpass": "ଅସ୍ଥାୟୀ ବା ଏବେକାର ପାସୱାର୍ଡ଼ଟି ଭୁଲ ଅଟେ ।\nଆପଣ ବୋଧ ହୁଏ ଆଗରୁ ସଫଳ ଭାବରେ ନିଜର ପାସୱାର୍ଡ଼ଟି ବଦଳାଇଦେଇଛନ୍ତି ବା ନୂଆ ଅସ୍ଥାୟୀ ପାସୱାର୍ଡ଼ଟିଏ ପାଇଁ ଆବେଦନ କରିଅଛନ୍ତି ।",
+       "resetpass-recycled": "ଆପଣଙ୍କର ଏବେକାର ପାସୱାର୍ଡ଼ ଭିନ୍ନ ଆଉ ଏକ ପାସୱାର୍ଡ଼ ଦେଇ ଏହାକୁ ରିସେଟ କରିଦିଅନ୍ତୁ ।",
+       "resetpass-temp-emailed": "ଇମେଲରେ ପଠାଯାଇଥିବା ଏକ ଅସ୍ଥାୟୀ କୋଡ଼ ଦେଇ  ଆପଣ ଲଗ ଇନ କରିଛନ୍ତି ।\nଲଗ ଇନ ସମାପ୍ତ କରିବା ପାଇଁ ଆପଣଙ୍କୁ ଏଠାରେ ନୂଆ ପାସୱାର୍ଡ଼ଟିଏ ଦେବାକୁ ପଡ଼ିବ:",
        "resetpass-temp-password": "ଅସ୍ଥାୟୀ ପାସୱାର୍ଡ଼:",
+       "resetpass-abort-generic": "ଏକ ଏକ୍ସଟେନସନ ଦ୍ୱାରା ପାସୱାର୍ଡ଼ ବଦଳ କରିବା ରଦ୍ଦ କରାଯାଇଛି ।",
+       "resetpass-expired": "ଆପଣଙ୍କ ପାସୱାର୍ଡ଼ ଅଚଳ ହୋଇଯାଇଛି । ଦୟାକରି ନୂଆ ପାସୱାର୍ଡ଼ଟିଏ ଦିଅନ୍ତୁ ।",
        "passwordreset": "ପାସୱାର୍ଡ଼ ପୁନସ୍ଥାପନ କରନ୍ତୁ",
+       "passwordreset-text-one": "ଏକ ଅସ୍ଥାୟୀ ପାସୱାର୍ଡ଼ ପାଇବା ପାଇଁ ଏହି ଫର୍ମଟି ସମ୍ପୂର୍ଣ୍ଣ ଭାବେ ପୂରଣ କରନ୍ତୁ ।",
        "passwordreset-legend": "ପାସୱାର୍ଡ଼ ପୁନସ୍ଥାପନ କରନ୍ତୁ",
        "passwordreset-disabled": "ପାସୱାର୍ଡ଼କୁ ପୁରାପୁରି ମୂଳକୁ ଫେରାଇବା ଏହି ଉଇକିରେ ଅଚଳ କରାଯାଇଅଛି ।",
        "passwordreset-emaildisabled": "ଏହି ଉଇକିରେ ଇମେଲ ସୁବିଧା ଅଚଳ କରାଯାଇଅଛି ।",
        "passwordreset-capture-help": "ଯଦି ଆପଣ ଘରଟିକୁ ଦେଖନ୍ତି ତେବେ (ଅସ୍ଥାୟୀ ପାସୱାର୍ଡ଼ ସହିତ) ଇ-ମେଲଟି ଆପଣଙ୍କୁ ଦେଖାଯିବ ଓ ବାକି ସଭ୍ୟମାନଙ୍କୁ ଚାଲିଯିବ ।",
        "passwordreset-email": "ଇ-ମେଲ ଠିକଣା:",
        "passwordreset-emailtitle": "{{SITENAME}} ର ଖାତା ସବିଶେଷ",
-       "passwordreset-emailtext-ip": "କେହି ଜଣେ (ବୋଧେ ଆପଣ, $1 IP ଠିକଣାରୁ) \n{{SITENAME}} ($4) ସାଇଟରେ ଥିବା ଆପଣଙ୍କ ଖାତାର ସବିଶେଷ ଜାଣିବାକୁ ଅନୁରୋଧ କରିଛନ୍ତି । ଏହି ଇମେଲ ଠିକଣା ସହିତ ତଳଲିଖିତ ବ୍ୟବହାରକାରୀଙ୍କ {{PLURAL:$3|ଖାତା|ଖାତାସମୂହ}} ଯୋଡ଼ା:\n\n$2\n\n{{PLURAL:$3|ଏହି ଅସ୍ଥାୟୀ ପାସୱାର୍ଡ଼ଟି|ଏହି ଅସ୍ଥାୟୀ ପାସୱାର୍ଡ଼ସବୁ}} {{PLURAL:$5|ଦିନକରେ|$5 ଦିନରେ ଅଚଳ}} ହୋଇଯିବ ।\nଆପଣ ଏବେ ଲଗ ଇନ କରି ନୂଆ ପାସୱାର୍ଡ଼ଟିଏ ବାଛନ୍ତୁ । ଯହି ଆଉ କେହି ଜଣେ ଏହି ଅନୁରୋଧ କରିଥାନ୍ତି\nକିମ୍ବା ଆପଣ ଏବେ ନିଜର ମୂଳ ପାସୱାର୍ଡ଼ ମନେ ପକାଇ ପାରିଥାନ୍ତି ତେବେ ଏହି ପାସୱାର୍ଡ଼ଟିକୁ ଆଉ ବଦଳାଇବା ଲୋଡ଼ା ନାହିଁ ।\nଆପଣ ନିଜ ପୁରୁଣା ପାସୱାର୍ଡ଼ଟି ଆଗପରି ବ୍ୟବହାର କରିପାରନ୍ତି ।",
-       "passwordreset-emailtext-user": "{{SITENAME}}ରେ ଥିବା ବ୍ୟବହାରକାରୀ $1 {{SITENAME}} ($4) ସାଇଟରେ ଥିବା ଆପଣଙ୍କ ଖାତାର ସବିଶେଷ ଜାଣିବାକୁ ଅନୁରୋଧ କରିଛନ୍ତି । ଏହି ଇମେଲ ଠିକଣା ସହିତ ତଳଲିଖିତ ବ୍ୟବହାରକାରୀଙ୍କ {{PLURAL:$3|ଖାତା|ଖାତାସମୂହ}} ଯୋଡ଼ା:\n\n$2\n\n{{PLURAL:$3|ଏହି ଅସ୍ଥାୟୀ ପାସୱାର୍ଡ଼ଟି|ଏହି ଅସ୍ଥାୟୀ ପାସୱାର୍ଡ଼ସବୁ}} {{PLURAL:$5|ଦିନକରେ|$5 ଦିନରେ ଅଚଳ}} ହୋଇଯିବ ।\nଆପଣ ଏବେ ଲଗ ଇନ କରି ନୂଆ ପାସୱାର୍ଡ଼ଟିଏ ବାଛନ୍ତୁ । ଯହି ଆଉ କେହି ଜଣେ ଏହି ଅନୁରୋଧ କରିଥାନ୍ତି\nକିମ୍ବା ଆପଣ ଏବେ ନିଜର ମୂଳ ପାସୱାର୍ଡ଼ ମନେ ପକାଇ ପାରିଥାନ୍ତି ତେବେ ଏହି ପାସୱାର୍ଡ଼ଟିକୁ ଆଉ ବଦଳାଇବା ଲୋଡ଼ା ନାହିଁ ।\nଆପଣ ନିଜ ପୁରୁଣା ପାସୱାର୍ଡ଼ଟି ଆଗପରି ବ୍ୟବହାର କରିପାରନ୍ତି ।",
+       "passwordreset-emailtext-ip": "କେହିଜଣେ (ବୋଧେ ଆପଣ, $1 IP addressରୁ) {{SITENAME}} ($4)ରେ ପାସୱାର୍ଡ଼ ରି-ସେଟ କରିବା ପାଇଁ ଅନୁରୋଧ କରିଛନ୍ତି । ଉକ୍ତ ଇମେଲ ଠିକଣା ସହିତ ଏହି {{PLURAL:$3|ସଭ୍ୟ ଖାତାଟି|ସଭ୍ୟ ଖାତାମାନ}} ସମ୍ବନ୍ଧିତ:\n\n$2\n\n{{PLURAL:$3|ଏହି ଅସ୍ଥାୟୀ ପାସୱାର୍ଡ଼ଟି|ଏହି ଅସ୍ଥାୟୀ ପାସୱାର୍ଡ଼ମାନ}} {{PLURAL:$5|ଦିନକ|$5 ଦିନ}}ରେ ଅଚଳ ହୋଇଯିବ ।\nଆପଣ ଏବେ ଲଗ ଇନ କରି ନୂଆ ପାସୱାର୍ଡ଼ଟିଏ ବାଛନ୍ତୁ । ଯଦି ଆଉ କେହି ଏହି ଅନୁରୋଧ କରିଥାନ୍ତି କିମ୍ବା ନିଜର ପୁରୁଣା ପାସୱାର୍ଡ଼ଟି ମନେପଡ଼ିଲା, ଏବଂ ଆଉ ପାସୱାର୍ଡ଼ଟି ବଦଳାଇବାକୁ ଚାହୁଁନାହାଁନ୍ତି ତାହେଲେ ଏହି ମେଲଟିକୁ ଅଣଦେଖା କରି ନିଜର ପୁରୁଣା ପାସୱାର୍ଡ଼ ବ୍ୟବହାର କରନ୍ତୁ ।",
+       "passwordreset-emailtext-user": "$1 ନାମକ ସଭ୍ୟଜଣକ {{SITENAME}}ରେ {{SITENAME}} ($4) ପାଇଁ ଆପଣଙ୍କ ପାସ ୱାର୍ଡ଼ ରିସେଟ କରିବାର ଅନୁରୋଧ କରିଛନ୍ତି । ତଳ {{PLURAL:$3|ଖାତାଟି|ଖାତାମାନ}} ଉକ୍ତ ଇମେଲ ସହିତ ସମ୍ବନ୍ଧିତ:\n\n$2\n\n{{PLURAL:$3|ଏହି ଅସ୍ଥାୟୀ ପାସୱାର୍ଡ଼ଟି|ଏହି ଅସ୍ଥାୟୀ ପାସୱାର୍ଡ଼ମାନ}} {{PLURAL:$5|ଦିନକ|$5 ଦିନ}}ରେ ଅଚଳ ହୋଇଯିବ ।\nଆପଣ ଲଗ ଇନ କରି ନୂଆ ପାସୱାର୍ଡ଼ଟିଏ ବାଛନ୍ତୁ । ଯଦି ଆଉ କେହି ଏହି ଅନୁରୋଧଟି କରିଥାନ୍ତି କିମ୍ବା ଆପଣଙ୍କର ନିଜ ପୁରୁଣା ପାସୱାର୍ଡ଼ଟି ମନେପଡ଼ିଗଲା ତେବେ ଆପଣଙ୍କୁ ଆଉ ପାସୱାର୍ଡ଼ ବଦଳାଇବାର ଆବଶ୍ୟକତା ନାହିଁ । ଆପଣ ଏହି ମେସେଜଟିକୁ ଅଣଦେଖା କରି ନିଜର ପୁରୁଣା ପାସୱାର୍ଡ଼ ବ୍ୟବହାର କରୁଥାନ୍ତୁ ।",
        "passwordreset-emailelement": "ଇଉଜର ନାମ: $1\nଅସ୍ଥାୟୀ ପାସୱାର୍ଡ଼: $2",
        "passwordreset-emailsent": "ଏକ ପାସୱାର୍ଡ଼ ପୁନଃସ୍ଥାପନ ଇମେଲ ପଠାଇଦିଆଯାଇଅଛି ।",
        "passwordreset-emailsent-capture": "ତଳେ ଦେଖାଯାଉଥିବା ଭଳି, ପାସୱାର୍ଡ଼ ପୁନଃସ୍ଥାପନ ଇମେଲଟିଏ ପଠାଇଦିଆଯାଇଛି ।",
-       "passwordreset-emailerror-capture": "à¬\97à­\8bà¬\9fିà¬\8f à¬®à¬¨à­\87ପà¬\95ାà¬\87ବା à¬\87-ମà­\87ଲ à¬¤à¬¿à¬\86ରି à¬\95ରାଯାà¬\87ଥିଲା, à¬¯à¬¾à¬¹à¬¾à¬\95ି à¬¤à¬³à­\87 à¬\85à¬\9bି, à¬\95ିନà­\8dତà­\81 à¬\8fହାà¬\95à­\81 à¬¬à­\8dà­\9fବହାରà¬\95ାରà­\80à¬\95à­\81 à¬ªà¬ à¬¾à¬\87ବାରà­\87 à¬\85ସଫଳ à¬¹à­\87ଲା :$1",
+       "passwordreset-emailerror-capture": "ପାସୱାରà­\8dଡ଼ à¬¬à¬¦à¬³à¬¾à¬\87ବା à¬¸à­\82à¬\9aନା à¬¸à¬¹ à¬\87ମà­\87ଲà¬\9fିà¬\8f à¬¤à¬¿à¬\86ରି à¬¹à­\8bà¬\87à¬\9bି, à¬¯à¬¾à¬¹à¬¾ à¬¤à¬³à­\87 à¬¦à­\87à¬\96ିପାରିବà­\87 à¥¤ à¬\95ିନà­\8dତà­\81 à¬\8fହାà¬\95à­\81 {{GENDER:$2|ସଭà­\8dà­\9f}}à¬\99à­\8dà¬\95à­\81 à¬ªà¬ à¬¾à¬\87ବାରà­\87 à¬¬à¬¿à¬«à¬³ à¬¹à­\87ଲà­\81, à¬\95ାରଣ: $1",
        "changeemail": "ଇ-ମେଲ ଠିକଣା ବଦଳାଇବେ",
        "changeemail-header": "ଖାତା ଇ-ମେଲ ଠିକଣା ବଦଳାଇବେ",
        "changeemail-text": "ଆପଣା ଇ-ମେଲ ଠିକଣା ବଦଳାଇବା ନିମନ୍ତେ ଏହି ଆବେଦନ ପତ୍ରଟି ପୂରଣ କରନ୍ତୁ । ଆପଣଙ୍କୁ ଏହି ବଦଳ ଥୟ କରିବା ପାଇଁ ନିଜର ପାସୱାର୍ଡ଼ ଦେବାକୁ ପଡ଼ିବ ।",
        "changeemail-password": "ଆପଣଙ୍କ {{SITENAME}} ପାସୱାର୍ଡ",
        "changeemail-submit": "ଇ-ମେଲ ପରିର୍ବତ୍ତନ କରନ୍ତୁ",
        "changeemail-cancel": "ନାକଚ",
+       "changeemail-throttled": "ଆପଣ ଏକାଧିକ ଥର ଲଗ ଇନ କରିବାକୁ ଚେଷ୍ଟା କରିଥାଇପାରନ୍ତି ।\nଆଉଥରେ ଚେଷ୍ଟା କରିବା ଆଗରୁ ଦୟାକରି $1 ଅପେକ୍ଷା କରନ୍ତୁ ।",
+       "resettokens": "ଟୋକନ ରିସେଟ କରନ୍ତୁ",
+       "resettokens-no-tokens": "ରିସେଟ କରିବା ପାଇଁ ଆଉ ଟୋକନ ନାହିଁ ।",
+       "resettokens-legend": "ଟୋକନ ରିସେଟ କରନ୍ତୁ",
+       "resettokens-tokens": "ଟୋକନମାନ:",
+       "resettokens-token-label": "$1 (ବର୍ତ୍ତମାନ: $2)",
+       "resettokens-done": "ଟୋକନ ରିସେଟ ହେଲା ।",
+       "resettokens-resetbutton": "ବଛାଯାଇଥିବା ଟୋକନ ରିସେଟ କରନ୍ତୁ",
        "bold_sample": "ମୋଟା ଲେଖା",
        "bold_tip": "ମୋଟା ଲେଖା",
        "italic_sample": "ତେରେଛା ଲେଖା",
        "hr_tip": "ସମାନ୍ତରାଳ ରେଖା (ବେଳେବେଳେ ବ୍ୟବହାର କରିବେ)",
        "summary": "ସାରକଥା:",
        "subject": "ବିଷୟ/ଶିରୋନାମା",
-       "minoredit": "à¬\8fହା à¬\96à­\81ବ à¬\9bà­\8bà¬\9f à¬¬à¬¦à¬³à¬\9fିà¬\8f",
+       "minoredit": "à¬\8fହା à¬\8fà¬\95 à¬¸à¬¾à¬®à¬¾à¬¨à­\8dà­\9f à¬¸à¬®à­\8dପାଦନା",
        "watchthis": "ଏହି ପୃଷ୍ଠାଟିକୁ ଦେଖିବେ",
        "savearticle": "ସାଇତିବେ [Save]",
        "preview": "ସାଇତିବା ଆଗରୁ ଦେଖନ୍ତୁ",
        "showpreview": "ଦେଖଣା [Preview]",
-       "showlivepreview": "ଜୀବନ୍ତ ଦେଖଣା",
        "showdiff": "ବଦଳଗୁଡ଼ିକ ଦେଖାଇବେ",
        "anoneditwarning": "'''ସାବଧାନ:''' ଆପଣ ଲଗ-ଇନ କରିନାହାନ୍ତି ।\nଏହି ପୃଷ୍ଠାର ଇତିହାସରେ ଆପଣଙ୍କ IP Address ଟି ସାଇତା ହୋଇଯିବ ।",
        "anonpreviewwarning": "''ଆପଣ ଲଗ ଇନ କରି ନାହାନ୍ତି । ବଦଳକରି ସାଇତିଲେ ଆପଣଙ୍କର IP ଠିକଣା ଏହି ପୃଷ୍ଠାର ଇତିହାସରେ ସାଇତା ହୋଇଯିବ ।''",
        "loginreqlink": "ଲଗ-ଇନ (Log in)",
        "loginreqpagetext": "ବାକି ପୃଷ୍ଠାମାନ ଦେଖିବା ନିମନ୍ତେ ଆପଣଙ୍କୁ $1 କରିବାକୁ ପଡ଼ିବ ।",
        "accmailtitle": "ପାସୱାର୍ଡ଼ଟି ପଠାଇ ଦିଆଗଲା ।",
-       "accmailtext": "[[User talk:$1|$1]]ଙ୍କ ନିମନ୍ତେ ଏକ ଯାହିତାହି ପାସୱାର୍ଡ଼ $2ଙ୍କ ନିକଟକୁ ପଠାଗଲା ।\n\nଏହି ପାସୱାର୍ଡ଼ଟି ''[[Special:ChangePassword|ପାସୱାର୍ଡ଼ ବଦଳାଇବା]]'' ପୃଷ୍ଠାରେ ଲଗଇନ କରି କରାଯାଇପାରିବ ।",
+       "accmailtext": "[[User talk:$1|$1]] ପାଇଁ $2କୁ ଏକ ଆପେ ଆପେ ତିଆରି ପାସୱାର୍ଡ଼ ପଠାଗଲା । ଏହା ଲଗ ଇନ କଲା ପରେ<em>[[Special:ChangePassword|ପାସୱାର୍ଡ଼ ବଦଳ]]</em> ପୃଷ୍ଠାରେ ବଦଳାଯାଇପାରିବ ।",
        "newarticle": "(ନୁଆ)",
        "newarticletext": "ଆପଣ ଖୋଲିଥିବା ଲିଙ୍କଟିରେ ଏଯାଏଁ କିଛିବି ପୃଷ୍ଠା ନାହିଁ ।\nଏହି ପୃଷ୍ଠାଟିକୁ ତିଆରି କରିବା ପାଇଁ ତଳ ବାକ୍ସରେ ଟାଇପ କରନ୍ତୁ (ଅଧିକ ଜାଣିବା ପାଇଁ [$1 ସାହାଯ୍ୟ ପୃଷ୍ଠା] ଦେଖନ୍ତୁ) ।\nଯଦି ଆପଣ ଏଠାକୁ ଭୁଲରେ ଆସିଯାଇଥାନ୍ତି ତେବେ ଆପଣଙ୍କ ବ୍ରାଉଜରର '''Back''' ପତିଟି ଦବାନ୍ତୁ ।",
        "anontalkpagetext": "----''ଏହା ଏକ ଖାତା ଖୋଲିନଥିବା ବା ଖାତା ବ୍ୟବହାର କରିନଥିବା ଜଣେ ବେନାମି ସଭ୍ୟଙ୍କର ଆଲୋଚନା ପୃଷ୍ଠା ।''\nତେଣୁ ଆମ୍ଭେ ସଂଖ୍ୟା ଦେଇ ସୂଚୀତ IP ଠିକଣା ଦେଇ ତାଙ୍କୁ ଜାଣିବା ।\nଏହି ପ୍ରକାରର ଗୋଟିଏ IP ଠିକଣା ବହୁ ସଭ୍ୟଙ୍କ ଦେଇ ବ୍ୟବହାର କରାଯାଇପାରେ । \nଯଦି ଆପଣ ଜଣେ ଅଜଣା ସଭ୍ୟ ଓ ଭାବୁଛନ୍ତି ଇଆଡୁ ସିଆଡୁ ମତାମତ ସବୁ ଆପଣଙ୍କ ପାଇଁ ଦିଆଯାଇଛି ତେବେ ଦୟାକରି [[Special:UserLogin/signup|ନୂଆ ଖାତାଟିଏ ଖୋଲନ୍ତୁ]] କିମ୍ବା [[Special:UserLogin|ଆଗରୁ ଥିବା ଖାତାରେ ଲଗ ଇନ କରନ୍ତୁ]] ଯାହା ବେନାମି ସଭ୍ୟଙ୍କୁ ନେଇ ଉପୁଜିଥିବା ଦ୍ଵନ୍ଦର ସମାଧାନ କରିବ ।",
        "edit-gone-missing": "ଏହି ପୃଷ୍ଠାଟିକୁ ସତେଜ କରାଯାଇପାରିବ ନାହିଁ ।\nଏହାକୁ ଲିଭାଇ ଦିଆଗଲା ପରି ମନେ ହେଉଛି ।",
        "edit-conflict": "ବଦଳାଇବା ଦ୍ଵନ୍ଦ.",
        "edit-no-change": "ଆପଣଙ୍କ ସମ୍ପାଦନାକୁ ଅଣଦେଖା କରାଗଲା, କାରଣ ଲେଖାରେ କିଛି ବି ବଦଳ କରାଯାଇନଥିଲା ।",
-       "postedit-confirmation": "ଆପଣଙ୍କ ବଦଳ ସାଇତା ଗଲା ।",
+       "postedit-confirmation-created": "ଏହି ପୃଷ୍ଠାଟି ତିଆରି କରାଗଲା ।",
+       "postedit-confirmation-restored": "ଏହି ପୃଷ୍ଠାଟି ପୁନସ୍ଥାପନ କରାଗଲା ।",
+       "postedit-confirmation-saved": "ଆପଣଙ୍କ ବଦଳ ସାଇତା ଗଲା ।",
        "edit-already-exists": "ନୂଆ ପୃଷ୍ଠାଟିଏ ତିଆରି କରିପାରିଲୁଁ ନାହିଁ ।\nଏହା ଆଗରୁ ଅଛି ।",
        "defaultmessagetext": "ଡିଫଲ୍ଟ ମେସେଜ ଲେଖାଗୁଡିକ",
        "content-failed-to-parse": "$1 ପ୍ରକାର ପାଇଁ $2 ଲେଖାକୁ ବର୍ଣ୍ଣନା କରିପାରିଲା ନାହିଁ: $3",
        "invalid-content-data": "ଅବୈଧ ଆଧାର ତଥ୍ୟ",
        "content-not-allowed-here": "\"$1\" ବିଷୟଗୁଡିକ [[$2]]ପୃଷ୍ଠାରେ ରହିପାରିବ ନାହିଁ",
-       "editwarning-warning": "ଏହି ପୃଷ୍ଠାକୁ ଛାଡ଼ି ଚାଲିଗଲେ ହୁଏ ତ ଆପଣ କରିଥିବା କିଛି ସମ୍ପାଦନା ହରାଇ ପାରନ୍ତି ।\nଯଦି ଆପଣ ଲଗ ଇନ କରିଥାନ୍ତି ତେବେ ଆପଣଙ୍କ ପସନ୍ଦର \"ସମ୍ପାଦନା\" ଭାଗରେ ଏହି ଚେତାବନୀଟିକୁ ଅଚଳ କରିପାରିବେ ।",
+       "editwarning-warning": "ଏହି ପୃଷ୍ଠାଟି ଛାଡ଼ି ଚାଲିଗଲେ ଆପଣ ଆଗରୁ କରିଥିବା ସମ୍ପାଦନା ହରାଇବେ । ଯଦି ଆପଣ ଲଗ ଇନ କରିଥାନ୍ତି ନିଜ ପସନ୍ଦ ପୃଷ୍ଠାର \"{{int:prefs-editing}}\" ବିଭାଗରେ ଏହି ଚେତାବନୀଟି ନିଷ୍କ୍ରିୟ କରିପାରିବେ ।",
+       "editpage-notsupportedcontentformat-title": "କଣ୍ଟେଣ୍ଟର ସଂରଚନା ସମର୍ଥିତ ନୁହେଁ",
        "content-model-wikitext": "ଉଇକିଟେକ୍ସଟ",
        "content-model-text": "ଖାଲି ଲେଖା",
        "content-model-javascript": "ଜାଭାସ୍କ୍ରିପ୍ଟ",
        "undo-success": "ଏହି ସମ୍ପାଦନା ପଛକୁ ଫେରାଯାଇପାରିବ ନାହିଁ ।\nଦୟାକରି ତୁଳନା କରି ପରଖିନିଅନ୍ତୁ ଯେ ଆପଣ ଏହାହିଁ କରିବାକୁ ଚାହୁଁଥିଲେ, ଆଉ ସମ୍ପାଦନା ଶେଷ କରିବା ପାଇଁ ତଳେ ଥିବା ବଦଳ ସାଇତି ରଖନ୍ତୁ ।",
        "undo-failure": "ଏହି ସମ୍ପାଦନା ପଛକୁ ଫେରାଯାଇ ପାରିବ ନାହିଁ କାରଣ ମଝିରେ ଘଟିଥିବା ଅନେକ ଛୋଟ ଛୋଟ ବଦଳ ଅସୁବିଧା ତିଆରି କରୁଅଛି ।",
        "undo-norev": "ଏହି ସମ୍ପାଦନାଟି ପଛକୁ ଫେରାଯାଇପାରିବ ନାହିଁ କାରଣ ଏହା ଆଉ ନାହିଁ ବା ଲିଭାଇଦିଆଯାଇଅଛି ।",
+       "undo-nochange": "ଏହି ସମ୍ପାଦନା ପଛକୁ ଫେରାଇଦିଆଯାଇଥିବା ଭଳି ଲାଗୁଛି ।",
        "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|ଆଲୋଚନା]]) ଙ୍କ ଦେଇ କରାଯାଇଥିବା $1 ସଙ୍କଳନଟି ପଛକୁ ଫେରାଇନିଆଗଲା",
+       "undo-summary-username-hidden": "ଜଣେ ଅଜଣା ସଭ୍ୟଙ୍କ ଦେଇ ହୋଇଥିବା $1 ସଂସ୍କରଣଟି ପଛକୁ ଫେରାନ୍ତୁ",
        "cantcreateaccounttitle": "ଖାତାଟିଏ ତିଆରି କରାଯାଇପାରିବ ନାହିଁ",
        "cantcreateaccount-text": "[[User:$3|$3]]ଙ୍କ ଦେଇ ('''$1''') IP ଠିକଣାରୁ ଖାତା ଖୋଲିବାକୁ ବାରଣ କରାଯାଇଅଛି ।\n\n$3ଙ୍କ ଦେଇ ଦିଆଯାଇଥିବା କାରଣ ହେଲା ''$2''",
        "viewpagelogs": "ଏହି ପୃଷ୍ଠା ପାଇଁ ଲଗଗୁଡ଼ିକୁ ଦେଖନ୍ତୁ ।",
        "last": "ଆଗ",
        "page_first": "ପ୍ରଥମ",
        "page_last": "ଶେଷ",
-       "histlegend": "à¬\85ଲà¬\97ା à¬¬à¬\9bା:ସà¬\99à­\8dà¬\95ଳନ à¬¸à¬¬à­\81ର à¬°à­\87ଡ଼ିà¬\93 à¬¬à¬¾à¬\95à­\8dସà¬\95à­\81 à¬¬à¬¾à¬\9bି à¬¤à­\81ଳନା à¬\95ରନà­\8dତà­\81 à¬\93 à¬\8fଣà­\8dà¬\9fର à¬¦à¬¬à¬¾à¬¨à­\8dତà­\81 à¬¬à¬¾ à¬¤à¬³à­\87 à¬¥à¬¿à¬¬à¬¾ à¬¬à¬\9fନ à¬¦à¬¬à¬¾à¬¨à­\8dତà­\81 à¥¤<br />\nସାରà¬\95ଥା: '''({{int:cur}})''' = à¬¨à¬\97ଦ à¬¸à¬\99à­\8dà¬\95ଳନରà­\87 à¬¥à¬¿à¬¬à¬¾ à¬¤à¬«à¬¾à¬¤, '''({{int:last}})''' = à¬\86à¬\97 à¬¸à¬\99à­\8dà¬\95ଳନ à¬­à¬¿à¬¤à¬°à­\87 à¬¤à¬«à¬¾à¬¤, '''{{int:minoreditletter}}''' = à¬\9fିà¬\95à­\87 à¬¬à¬¦à¬³ ।",
+       "histlegend": "ଭିନà­\8dନ à¬¬à¬\9bା: à¬¬à¬¾à¬\9bିବା à¬ªà¬¾à¬\87à¬\81 à¬\97à­\8bଲ à¬¬à¬¾à¬\9bିବା à¬\98ରà­\87 à¬\95à­\8dଲିà¬\95 à¬\95ରି à¬\8fଣà­\8dà¬\9fର à¬\85ଥବା à¬¤à¬³à­\87 à¬¥à¬¿à¬¬à¬¾ à¬¬à¬\9fନ à¬¦à¬¬à¬¾à¬¨à­\8dତà­\81 à¥¤<br />\nନିରà­\8dଦà­\8dଦà­\87ଶିà¬\95ା: <strong>({{int:cur}})</strong> = à¬\97ତ à¬¸à¬\82ସà­\8dମରଣମାନà¬\99à­\8dà¬\95 à¬®à¬§à­\8dà­\9fରà­\87 à¬¤à¬«à¬¾à¬¤, <strong>({{int:last}})</strong> = à¬\86à¬\97ର à¬¸à¬\82ସà­\8dମରଣମାନà¬\99à­\8dà¬\95 à¬®à¬§à­\8dà­\9fରà­\87 à¬¤à¬«à¬¾à¬¤, <strong>{{int:minoreditletter}}</strong> = à¬\9bà­\8bà¬\9fମà­\8bà¬\9f à¬¸à¬®à­\8dପାଦନା ।",
        "history-fieldset-title": "ଇତିହାସ ଖୋଜିବା",
        "history-show-deleted": "କେବଳ ଲିଭାଯାଇଥିବା",
        "histfirst": "ସବୁଠୁ ପୁରୁଣା",
        "revdelete-confirm": "ଦୟାକରି ଥୟ କରନ୍ତୁ ଯେ ଆପଣ ଏହା କରିବାକୁ ଚାହୁଁଛନ୍ତି, ଆପଣ ଏହାର ପରିଣାମ ଜାଣନ୍ତି ଓ ଆପଣ [[{{MediaWiki:Policy-url}}|ନୀତି]] ଅନୁସାରେ ଏହା କରୁଛନ୍ତି ।",
        "revdelete-suppress-text": "ଦବାଇ ରଖିବା '''କେବଳ''' ଏହି ତଳଲିଖିତ କ୍ଷେତ୍ରରେ ବ୍ୟବହାର କରାଯିବ:\n* ସମ୍ଭାବିତ ଅପମାନଜଣକ ତଥ୍ୟ\n* ଭୁଲ ବ୍ୟକ୍ତିଗତ ତଥ୍ୟ\n*: ''ଘର ଠିକଣା ଓ ଟେଲିଫୋନ ନମ୍ବର, ଭୋଟର ପରିଚୟ ନମ୍ବର, ଆଦି''",
        "revdelete-legend": "ଦେଖଣା ବାରଣ ସବୁ ଥୟ କରନ୍ତୁ",
-       "revdelete-hide-text": "ସà¬\99à­\8dà¬\95ଳନ à¬²à­\87à¬\96ା à¬²à­\81à¬\9aାà¬\87ଦିà¬\85ନà­\8dତà­\81",
+       "revdelete-hide-text": "ସà¬\82ସà­\8dà¬\95ରଣ à¬²à­\87à¬\96ା",
        "revdelete-hide-image": "ଫାଇଲ ଭିତର ପଦାର୍ଥସବୁ ଲୁଚାଇଦିଅନ୍ତୁ",
        "revdelete-hide-name": "କାମ ଓ ଲକ୍ଷ ସବୁ ଲୁଚାଇଦିଅନ୍ତୁ",
-       "revdelete-hide-comment": "ବଦଳ à¬¸à¬¾à¬°à¬\95ଥା à¬²à­\81à¬\9aାà¬\87ଦିà¬\85ନ୍ତୁ",
-       "revdelete-hide-user": "ସମà­\8dପାଦà¬\95à¬\99à­\8dà¬\95ର à¬\87à¬\89à¬\9cର ନାମ /IP ଲୁଚାଇଦିଅନ୍ତୁ",
+       "revdelete-hide-comment": "ସାରà¬\95ଥା à¬¸à¬®à­\8dପାଦନା à¬\95ରନ୍ତୁ",
+       "revdelete-hide-user": "ସମà­\8dପାଦà¬\95à¬\99à­\8dà¬\95ର à¬¸à¬­à­\8dà­\9f ନାମ /IP ଲୁଚାଇଦିଅନ୍ତୁ",
        "revdelete-hide-restricted": "ପରିଚାଳକ ଓ ବାକିମାନଙ୍କ ଠାରୁ ତଥ୍ୟକୁ ଦବାଇଦିଅନ୍ତୁ",
        "revdelete-radio-same": "(ବଦଳାନ୍ତୁ ନାହିଁ)",
-       "revdelete-radio-set": "ହà¬\81",
-       "revdelete-radio-unset": "ନାହିà¬\81",
+       "revdelete-radio-set": "ଲà­\81à¬\9aାଯାà¬\87à¬\9bି",
+       "revdelete-radio-unset": "ଦà­\87à¬\96ାଯାà¬\89à¬\9bି",
        "revdelete-suppress": "ପରିଚାଳକ ଓ ବାକିମାନଙ୍କ ଠାରୁ ତଥ୍ୟକୁ ଦବାଇଦିଅନ୍ତୁ",
        "revdelete-unsuppress": "ଆଉଥରେ ସ୍ଥାପିତ ସଙ୍କଳନସବୁରେ ଥିବା ବାରଣକୁ ବାହାର କରିଦିଅନ୍ତୁ",
        "revdelete-log": "କାରଣ:",
        "compareselectedversions": "ବଛାହୋଇଥିବା ସଙ୍କଳନ ଗୁଡ଼ିକୁ ତଉଲିବେ",
        "showhideselectedversions": "ବଛା ହୋଇଥିବା ସଙ୍କଳନ ଗୁଡ଼ିକୁ ଦେଖାଇବେ/ଲୁଚାଇବେ",
        "editundo": "ପଛକୁ ଫେରିବା",
+       "diff-empty": "(କିଛି ବି ଫରକ ନାହିଁ)",
        "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": "ଖୋଜା ଫଳାଫଳ",
        "searchmenu-exists": "'''ଏହି ଉଇକିରେ \"[[:$1]]\" ନାଆଁରେ ପୃଷ୍ଠାଟିଏ ଅଛି ।'''",
        "searchmenu-new": "'''ଏହି ପ୍ରସଙ୍ଗଟି ଆଗରୁ ନାହିଁ, ତେଣୁ ''[[:$1]]'' ନାମରେ ପ୍ରସଙ୍ଗଟିଏ ଏଠାରେ ଗଢ଼ନ୍ତୁ!'''",
        "searchprofile-articles": "ସୂଚୀ ପୃଷ୍ଠା",
-       "searchprofile-project": "ସାହାଯ୍ୟ ଓ ପ୍ରକଳ୍ପ ପୃଷ୍ଠା",
        "searchprofile-images": "ମଲ୍ଟିମିଡ଼ିଆ",
        "searchprofile-everything": "ସବୁକିଛି",
        "searchprofile-advanced": "ଉନ୍ନତ",
        "searchprofile-articles-tooltip": "$1ରେ ଖୋଜିବେ",
-       "searchprofile-project-tooltip": "$1ରେ ଖୋଜିବେ",
        "searchprofile-images-tooltip": "ଫାଇଲ ସବୁ ପାଇଁ ଖୋଜିବେ",
        "searchprofile-everything-tooltip": "ପ୍ରସଙ୍ଗ ସବୁକୁ ଖୋଜିବେ (ଆଲୋଚନା ସହ)",
        "searchprofile-advanced-tooltip": "ନିଜେ ତିଆରିକରିହେବା ଭଳି ନେମସ୍ପେସରେ ଖୋଜିବେ",
        "search-nonefound": "ଆପଣ ଖୋଜିଥିବା ପ୍ରଶ୍ନ ପାଇଁ କିଛି ଫଳ ମିଳିଲା ନାହିଁ ।",
        "powersearch-legend": "ଗହିର ଖୋଜା",
        "powersearch-ns": "ନେମସ୍ପେସରେ ଖୋଜିବେ",
-       "powersearch-redir": "ପୁନପ୍ରେରଣ ପୃଷ୍ଠାସମୂହର ତାଲିକା ତିଆରିବେ",
        "powersearch-togglelabel": "ଯାଞ୍ଚ କରିବା:",
        "powersearch-toggleall": "ସବୁ",
        "powersearch-togglenone": "କିଛି ନାହିଁ",
        "prefs-emailconfirm-label": "ଇ-ମେଲ ସଜାଣି:",
        "youremail": "ଇ-ମେଲ:",
        "username": "{{GENDER:$1|Username}}:",
-       "uid": "{{GENDER:$1|User}} ID:",
        "prefs-memberingroups": "{{PLURAL:$1|group|groups}}:ର {{GENDER:$2|Member}}",
        "prefs-registration": "ନାମଲେଖା ବେଳା:",
        "yourrealname": "ପ୍ରକୃତ ନାମ:",
        "badsig": "ମୂଳ ସନ୍ତକଟି ଅଚଳ ଅଟେ ।\nHTML ଟାଗ ପରଖିନିଅନ୍ତୁ ।",
        "badsiglength": "ଆପଣଙ୍କ ସନ୍ତକଟି ଖୁବ ଲମ୍ବା ।\nଏହା ବୋଧ ହୁଏ $1 {{PLURAL:$1|ଗୋଟି ଅକ୍ଷର|ଗୋଟି ଅକ୍ଷର}}ରୁ ଅଧିକ ।",
        "yourgender": "ଲିଙ୍ଗ:",
-       "gender-unknown": "ଲà­\81à¬\9aାଯାà¬\87ଥିବା",
-       "gender-male": "ପà­\81ରà­\81ଷ",
-       "gender-female": "ନାରà­\80",
-       "prefs-help-gender": "à¬\87à¬\9aà­\8dà¬\9bାଧିନ: à¬¸à¬«à­\8dà¬\9fà­±à­\87ରରà­\87 à¬²à¬¿à¬\99à­\8dà¬\97ବାà¬\9aà¬\95 à¬¸à¬®à­\8dବà­\8bଧନ à¬¨à¬¿à¬®à¬¨à­\8dତà­\87 à¬¬à­\8dà­\9fବହାର à¬\95ରାଯାà¬\87ଥାà¬\8f à¥¤\nà¬\8fହି à¬¤à¬¥à­\8dà­\9f à¬¸à¬¾à¬§à¬¾à¬°à¬£à¬°à­\87 à¬ªà­\8dରà¬\95ାଶିତ ।",
+       "gender-unknown": "à¬\9cଣାà¬\87ବାà¬\95à­\81 à¬\9aାହà­\87à¬\81 à¬¨à¬¾à¬¹à¬¿à¬\81",
+       "gender-male": "ସà­\87 (ପà­\81ରà­\81ଷ) à¬\89à¬\87à¬\95ିପà­\83ଷà­\8dଠା à¬¸à¬®à­\8dପାଦନା à¬\95ରନà­\8dତି",
+       "gender-female": "ସà­\87 (ନାରà­\80) à¬\89à¬\87à¬\95ିପà­\83ଷà­\8dଠା à¬¸à¬®à­\8dପାଦନା à¬\95ରନà­\8dତି",
+       "prefs-help-gender": "à¬\8fହି à¬ªà¬¸à¬¨à­\8dଦ à¬\87à¬\9aà­\8dà¬\9bାଧà­\80ନ à¥¤\nà¬\86ମର à¬¸à¬«à­\8dà¬\9fୱାର à¬\86ପଣà¬\99à­\8dà¬\95à­\81 à¬¸à¬®à­\8dବà­\8bଧନ à¬\95ଲାବà­\87ଳà­\87 à¬²à¬¿à¬\99à­\8dà¬\97ବାà¬\9aà¬\95 à¬¶à¬¬à­\8dଦ à¬¬à­\8dà­\9fବହାର à¬\95ରିଥାà¬\8f à¥¤\nà¬\8fହି à¬¸à­\82à¬\9aନା à¬¸à¬®à¬¸à­\8dତà­\87 à¬ªà¬¢à¬¼à¬¿à¬ªà¬¾à¬°à¬¿à¬¬à­\87 ।",
        "email": "ଇ-ମେଲ",
        "prefs-help-realname": "ପ୍ରକୃତ ନାମ ଦେବା ଆପଣଙ୍କ ଉପରେ ନିର୍ଭର କରେ ।\nଯଦି ଆପଣ ଏହା ଦିଅନ୍ତି, ତେବେ ଏହା ଆପଣଙ୍କ କାମ ପାଇଁ ଶ୍ରେୟ ଦେବାରେ ବ୍ୟବହାର କରାଯାଇପାରିବ ।",
        "prefs-help-email": "ଇ-ମେଲ ଠିକଣାଟି ଇଚ୍ଛାଧୀନ, କିନ୍ତୁ ଆପଣ ଯଦି ପାସୱାର୍ଡ଼ଟି ଭୁଲିଗଲେ ତାହା ଆଉଥରେ ତିଆରିବା ପାଇଁ ଏହା କାମରେ ଲାଗିବ ।",
        "prefs-advancedsearchoptions": "ଉନ୍ନତ ବିକଳ୍ପସମୂହ",
        "prefs-advancedwatchlist": "ଉନ୍ନତ ବିକଳ୍ପସମୂହ",
        "prefs-displayrc": "ଦେଖଣା ବିକଳ୍ପ",
-       "prefs-displaysearchoptions": "ଦେଖଣା ବିକଳ୍ପ",
        "prefs-displaywatchlist": "ଦେଖଣା ବିକଳ୍ପ",
        "prefs-tokenwatchlist": "ଟୋକନ୍‌",
        "prefs-diffs": "ତଫାତସବୁ",
        "right-move": "ପୃଷ୍ଠାସବୁ ଘୁଞ୍ଚେଇବା",
        "right-move-subpages": "ପୃଷ୍ଠା ସହିତ ସେମାନଙ୍କର ସାନପୃଷ୍ଠାସବୁକୁ ଘୁଞ୍ଚାଇଦେବେ",
        "right-move-rootuserpages": "ମୂଳ ସଭ୍ୟ ପୃଷ୍ଠାସବୁକୁ ଘୁଞ୍ଚାଇଦେବେ",
+       "right-move-categorypages": "ଶ୍ରେଣୀମାନଙ୍କୁ ଘୁଞ୍ଚାନ୍ତୁ",
        "right-movefile": "ଫାଇଲସବୁକୁ ଘୁଞ୍ଚାଇଦେବେ",
        "right-suppressredirect": "ପୃଷ୍ଠାସବୁକୁ ଘୁଞ୍ଚାଇବା ବେଳେ ମୂଳ ପୃଷ୍ଠାର ଫେରନ୍ତା ପୃଷ୍ଠା ତିଆରି କରିବେ ନାହିଁ",
        "right-upload": "ଫାଇଲ ଅପଲୋଡ଼ କରିବେ",
        "right-reupload-shared": "ବଣ୍ଟାଯାଇଥିବା ସ୍ଥାନୀୟ ମାଧ୍ୟମ ଭଣ୍ଡାରର ଫାଇଲ ଗୁଡ଼ିକ ଭରିଦେବେ",
        "right-upload_by_url": "ଏକ URLରୁ ଫାଇଲ ଅପଲୋଡ଼ କରିବେ",
        "right-purge": "ଥୟ କରିବା ବିନା ପୃଷ୍ଠାର ସାଇଟ ଅସ୍ଥାୟୀ ସ୍ମୃତିକୁ ସତେଜ କରିବେ",
-       "right-autoconfirmed": "ଅଧା-କିଳାଯାଇଥିବା ପୃଷ୍ଠାସବୁକୁ ବଦଳାଇବେ",
+       "right-autoconfirmed": "IP-ସମ୍ବନ୍ଧିତ ରେଟ ଲିମିଟ ଦ୍ୱାରା ପ୍ରଭାବିତ ହେବେନାହିଁ",
        "right-bot": "ଏକ ଆପେଆପେ ହେବା ପ୍ରକ୍ରିୟା ଭାବରେ ଗଣିବେ",
        "right-nominornewtalk": "ଆଲୋଚନା ପୃଷ୍ଠାସବୁରେ ଛୋଟ ଛୋଟ ବଦଳ ହେଲେ ତାହା ନୂଆ ଚିଟାଉ ପଠାଇବ",
        "right-apihighlimits": "API ଖୋଜାର ସର୍ବାଧିକ ସୀମା ବ୍ୟବହାର କରିବେ",
        "right-hideuser": "ସାଧାରଣରୁ ଲୁଚାଇ ଏକ ଇଉଜର ନାମକୁ ଅଟକାଇବେ",
        "right-ipblock-exempt": "IP ଅଟକ, ଆପେଆପେ-ଅଟକ ଓ ସୀମା ଅଟକସବୁକୁ ଅଲଗା ଦିଗଗାମୀ କରିବେ",
        "right-proxyunbannable": "ପ୍ରକ୍ସିର ଆପେଆପେ ହେଉଥିବା ଅଟକସବୁକୁ ଅଲଗା ଦିଗଗାମୀ କରିବେ",
-       "right-unblockself": "ସà­\87ମାନà¬\99à­\8dà¬\95à­\81 à¬\85à¬\9fà¬\95ରà­\81 à¬¬à¬¾à¬¹à¬¾à¬° କରିବେ",
-       "right-protect": "à¬\95ିଳିବା à¬¸à­\8dତରà¬\95à­\81 à¬¬à¬¦à¬³à¬¾à¬\87ବà­\87 à¬\93 à¬\95ିଳାଯାà¬\87ଥିବା à¬ªà­\83ଷà­\8dଠାମାନà¬\99à­\8dà¬\95ର à¬¸à¬®à­\8dପାଦନା à¬\95ରିବà­\87",
+       "right-unblockself": "à¬\9cଣà¬\99à­\8dà¬\95à­\81 à¬\85à¬\9fà¬\95ରà­\81 à¬\9aାଡ଼କରିବେ",
+       "right-protect": "ନିରାପତà­\8dତା à¬¬à¬¢à¬¼à¬¾à¬\87 à¬\95à­\8dà­\9fାସà¬\95à­\87ଡ଼-ନିରାପତà­\8dତା à¬ªà­\83ଷà­\8dଠାମାନà¬\99à­\8dà¬\95à­\81 à¬¬à¬¦à¬³à¬¾à¬¨à­\8dତà­\81",
        "right-editprotected": "କିଳାଯାଇଥିବା ପୃଷ୍ଠାମାନଙ୍କର ସମ୍ପାଦନା କରିବେ (କ୍ୟାସକେଡ଼କରା କିଳଣା ବିନା)",
        "right-editinterface": "ସଭ୍ୟଙ୍କ ଇଣ୍ଟରଫେସ ବଦଳାଇବେ",
        "right-editusercssjs": "ବାକି ସଭ୍ୟମାନଙ୍କର CSS ଓ ଜାଭାସ୍କ୍ରିପ୍ଟ ଫାଇଲ ସବୁକୁ ବଦଳାଇବେ",
        "action-protect": "ଏହି ପୃଷ୍ଠାର କିଳିବା ସ୍ତରକୁ ବଦଳାଇବେ",
        "action-rollback": "ଏକ ନିର୍ଦ୍ଦିଷ୍ଟ ପୃଷ୍ଠାକୁ ବଦଳାଇଥିବା ଶେଷ ସଭ୍ୟଙ୍କ ସମ୍ପାଦନାକୁ ସଙ୍ଗେସଙ୍ଗେ ପୁରାପୁରି ପଛକୁ ଫେରାଇଦେବେ",
        "action-import": "ଆଉ ଏକ ଉଇକିରୁ ଏହି ପୃଷ୍ଠାଟି ଆଣିବେ",
-       "action-importupload": "à¬\8fà¬\95 à¬«à¬¾à¬\87ଲ à¬\85ପଲà­\8bଡ଼ରà­\81 à¬\8fହି à¬ªà­\83ଷà­\8dଠାà¬\9fି ଆଣିବେ",
+       "action-importupload": "à¬\8fà¬\95 à¬«à¬¾à¬\87ଲ à¬\85ପଲà­\8bଡ଼ରà­\81 à¬ªà­\83ଷà­\8dଠାମାନ ଆଣିବେ",
        "action-patrol": "ବାକି ମାନଙ୍କ ବଦଳକୁ ଜଗାଯାଇଥିବା ବଦଳ ବୋଲି ଚିହ୍ନିତ କରିବେ",
        "action-autopatrol": "ଆପଣା ସମ୍ପାଦନାସବୁକୁ ଜଗାଯାଇଛି ବୋଲି ଚିହ୍ନିତ କରିବେ",
        "action-unwatchedpages": "ଦେଖାଯାଇନଥିବା ପୃଷ୍ଠାର ଏକ ତାଲିକା ଦେଖାଇବେ",
        "action-siteadmin": "ଡାଟାବେସକୁ କିଳିବେ ଓ ଖୋଲିବେ",
        "action-sendemail": "ଇ-ମେଲ ପଠାଇବେ",
        "nchanges": "$1 {{PLURAL:$1|ବଦଳ|ବଦଳସବୁ}}",
+       "enhancedrc-history": "ଇତିହାସ",
        "recentchanges": "ନଗଦ ବଦଳ",
        "recentchanges-legend": "ଏବେ କରାଯାଇଥିବା ଅଦଳବଦଳ",
        "recentchanges-summary": "ଏହି ପୃଷ୍ଠାରେ ଏହି ଉଇକିରେ ନଗଦ ବଦଳର ନିଘା ରଖିବେ",
        "recentchanges-feed-description": "ଏହି ଉଇକିରେ ଏହି ଫିଡ଼ଟିର ନଗଦ ବଦଳ ଦେଖାଇବେ ।",
-       "recentchanges-label-newpage": "à¬\8fହି à¬¬à¬¦à¬³ à¬¨à­\82à¬\86 à¬«à¬°à¬¦à¬\9fିà¬\8f à¬¤à¬¿à¬\86ରିà¬\95ଲା",
-       "recentchanges-label-minor": "à¬\8fହା à¬\97à­\8bà¬\9fିà¬\8f à¬\9bà­\8bà¬\9f à¬¬à¬¦à¬³",
+       "recentchanges-label-newpage": "à¬\8fହି à¬¸à¬®à­\8dପାଦନା à¬¯à­\8bà¬\97à­\81à¬\81 à¬¨à­\82à¬\86 à¬ªà­\83ଷà­\8dଠାà¬\9fିà¬\8f à¬¤à¬¿à¬\86ରି à¬¹à­\87ଲା",
+       "recentchanges-label-minor": "à¬\8fହା à¬\8fà¬\95 à¬¸à¬¾à¬®à¬¾à¬¨à­\8dà­\9f à¬¸à¬®à­\8dପାଦନା",
        "recentchanges-label-bot": "ଏହି ବଦଳଟି ଜଣେ '''ବଟ'''ଙ୍କ ଦେଇ କରାଯାଇଥିଲା",
        "recentchanges-label-unpatrolled": "ଏହି ବଦଳଟିକୁ ଏ ଯାଏଁ ପରଖା ଯାଇନାହିଁ",
-       "rcnotefrom": "'''$2''' ପରର ବଦଳସବୁ ତଳେ ଦିଆଗଲା ('''$1''' ଯାଏଁ ଦେଖାଯାଇଛି) ।",
-       "rclistfrom": "$1ରୁ ଆରମ୍ଭ କରି ନୂଆ ବଦଳଗୁଡ଼ିକ ଦେଖାଇବେ",
-       "rcshowhideminor": "$1 ଟି ଛୋଟମୋଟ ବଦଳ",
-       "rcshowhidebots": "$1 ଜଣ ବଟ",
-       "rcshowhideliu": "$1 ଜଣ ନାଆଁ ଲେଖାଇଥିବା ଇଉଜର",
-       "rcshowhideanons": "$1 ଜଣ ବେନାମି ସଭ୍ୟ",
-       "rcshowhidepatr": "$1ଟି ଜଗାହୋଇଥିବା ବଦଳ",
-       "rcshowhidemine": "$1 ମୁଁ କରିଥିବା ବଦଳ",
+       "rcnotefrom": "<strong>$2</strong> ପର ଠାରୁ (<strong>$1</strong> ଯାଏଁ ଏଠାରେ ଅଛି) ସମସ୍ତ ବଦଳ ତଳେ ଦେଖିପାରିବେ:",
+       "rclistfrom": "$3 $2ରୁ ଆରମ୍ଭ କରି ନୂଆ ବଦଳଗୁଡ଼ିକ ଦେଖାଇବେ",
+       "rcshowhideminor": "ଛୋଟମୋଟ ବଦଳ $1",
+       "rcshowhideminor-show": "ଦେଖାଇବେ",
+       "rcshowhideminor-hide": "ଲୁଚାଇବେ",
+       "rcshowhidebots": "ସ୍ୱୟଂଚାଳକ&nbsp;(Bot)&nbsp;ଦ୍ୱାରା&nbsp;ସମ୍ପାଦନା $1",
+       "rcshowhidebots-show": "ଦେଖାଇବେ",
+       "rcshowhidebots-hide": "ଲୁଚାଇବେ",
+       "rcshowhideliu": "ପଞ୍ଜୀକୃତ ସଭ୍ୟ $1",
+       "rcshowhideliu-show": "ଦେଖାଇବେ",
+       "rcshowhideliu-hide": "ଲୁଚାଇବେ",
+       "rcshowhideanons": "ବେନାମି ସଭ୍ୟ $1",
+       "rcshowhideanons-show": "ଦେଖାଇବେ",
+       "rcshowhideanons-hide": "ଲୁଚାଇବେ",
+       "rcshowhidepatr": "ପରିକ୍ଷୀତ ବଦଳ $1",
+       "rcshowhidepatr-show": "ଦେଖାଇବେ",
+       "rcshowhidepatr-hide": "ଲୁଚାଇବେ",
+       "rcshowhidemine": "ମୋର ସମ୍ପାଦନା $1",
+       "rcshowhidemine-show": "ଦେଖାଇବେ",
+       "rcshowhidemine-hide": "ଲୁଚାଇବେ",
        "rclinks": "ଗଲା $2 ଦିନର $1 ବଦଳଗୁଡ଼ିକୁ ଦେଖାଇବେ<br />$3",
        "diff": "ଅଦଳ ବଦଳ",
        "hist": "ଇତିହାସ",
        "rc_categories_any": "ଯେ କୌଣସି",
        "rc-change-size-new": "ବଦଳପରେ $1 {{PLURAL:$1|byte|bytes}}",
        "newsectionsummary": "/* $1 */ ନୂଆ ଭାଗ",
-       "rc-enhanced-expand": "ପà­\81ରା à¬¦à­\87à¬\96ାà¬\87ବà­\87 (à¬\9cାଭାସà­\8dà¬\95à­\8dରିପà­\8dà¬\9f à¬¦à¬°à¬\95ାର)",
+       "rc-enhanced-expand": "ସବିଶà­\87ଷ à¬¦à­\87à¬\96ାନà­\8dତà­\81",
        "rc-enhanced-hide": "ବେଶି କଥାସବୁ ଲୁଚାଇଦିଅ",
        "rc-old-title": "ପ୍ରକୃତରେ \"$1\" ଭାବେ ତିଆରି କରାଯାଇକଥିଲା",
        "recentchangeslinked": "ଏଇମାତ୍ର ବଦଳାଯାଇଥିବା ପୃଷ୍ଠାର ଲିଙ୍କ",
-       "recentchangeslinked-feed": "ଯà­\8bଡ଼ାଥିବା ବଦଳ",
-       "recentchangeslinked-toolbox": "ଯà­\8bଡ଼ାଥିବା ବଦଳ",
-       "recentchangeslinked-title": "\"$1\" à¬¸à¬¾à¬\81à¬\97ରà­\87 à¬\9cà­\8bଡ଼ାଥିବା ବଦଳ",
+       "recentchangeslinked-feed": "ସମà­\8dପରà­\8dà¬\95ିତ ବଦଳ",
+       "recentchangeslinked-toolbox": "ସମà­\8dପରà­\8dà¬\95ିତ ବଦଳ",
+       "recentchangeslinked-title": "\"$1\" à¬¸à¬¹ à¬¸à¬®à­\8dବନà­\8dଧିତ ବଦଳ",
        "recentchangeslinked-summary": "ଏଇଟି କିଛିସମୟ ଆଗରୁ ନିର୍ଦ୍ଦିଷ୍ଟ ପୃଷ୍ଠାରୁ ଲିଙ୍କ ହୋଇଥିବା ଆଉ ବଦଳାଯାଇଥିବା (ଅବା ଗୋଟିଏ ନିର୍ଦ୍ଦିଷ୍ଟ ଶ୍ରେଣୀର) ପୃଷ୍ଠାସବୁର ତାଲିକା ।  [[Special:Watchlist|ମୋର ଦେଖାତାଲିକା]]ର ପୃଷ୍ଠା ସବୁ '''ବୋଲଡ଼'''।",
        "recentchangeslinked-page": "ଫରଦର ନାଆଁ",
-       "recentchangeslinked-to": "ଦିà¬\86ଯାà¬\87ଥିବା à¬«à¬°à¬¦à¬°à­\87 à¬¯à­\8bଡ଼ା à¬¬à¬¾à¬\95ି à¬«à¬°à¬¦à¬®à¬¾à¬¨à¬\99à­\8dà¬\95ର à¬¬à¬¦à¬³ à¬¸à¬¬à­\81 à¬¦à­\87à¬\96ାନà­\8dତà­\81 à¥¤",
+       "recentchangeslinked-to": "à¬\8fହାର à¬¬à¬¦à¬³à¬°à­\87 à¬¦à¬¿à¬\86ଯାà¬\87ଥିବା à¬ªà­\83ଷà­\8dଠା à¬¸à¬¹ à¬¯à­\8bଡ଼ା à¬¬à¬¾à¬\95ି à¬ªà­\83ଷà­\8dଠାମାନà¬\99à­\8dà¬\95ର à¬¬à¬¦à¬³à¬®à¬¾à¬¨ à¬¦à­\87à¬\96ାନà­\8dତà­\81",
        "upload": "ଫାଇଲ ଅପଲୋଡ଼ କରିବେ",
        "uploadbtn": "ଫାଇଲ ଅପଲୋଡ଼ କରିବେ",
        "reuploaddesc": "ଅପଲୋଡ଼କୁ ନାକଚ କରିବେ ଓ ଅପଲୋଡ଼ ଫର୍ମକୁ ଫେରିବେ",
        "upload-tryagain": "ବଦଳିଥିବ ଫାଇଲ ବଖାଣ ପଠାଇବା",
        "uploadnologin": "ଲଗ‌‌ ଇନ କରିନାହାନ୍ତି",
-       "uploadnologintext": "ଫାà¬\87ଲ à¬\85ପଲà­\8bଡ଼ à¬\95ରିବା à¬¨à¬¿à¬®à¬¨à­\8dତà­\87 à¬\86ପଣà¬\99à­\8dà¬\95à­\81 [[Special:UserLogin|ଲà¬\97 à¬\87ନ]] à¬\95ରିବାà¬\95à­\81 à¬ªà¬¡à¬¼à¬¿ବ ।",
+       "uploadnologintext": "à¬\85ପଲà­\8bଡ଼ à¬\95ରିବା à¬ªà¬¾à¬\87à¬\81 $1 à¬\95ରିବାà¬\95à­\81 à¬¹à­\87ବ ।",
        "upload_directory_missing": "ଅପଲୋଡ଼ ସୂଚି ($1)ଟି ମିଳୁନାହିଁ ଓ ୱେବସର୍ଭର ଦେଇ ତିଆରି କରାଯାଇପାରିଲା ନାହିଁ ।",
        "upload_directory_read_only": "ଅପଲୋଡ଼ ସୂଚି ($1)ଟି ସବୁ ୱେବସର୍ଭରରେ ଲେଖାଯାଇ ପାରିବ ନାହିଁ ।",
        "uploaderror": "ଅପଲୋଡ଼ କରିବାରେ ଅସୁବିଧା",
        "uploadstash-refresh": "ଫାଇଲମାନଙ୍କର ତାଲିକାକୁ ସତେଜ କରିବେ",
        "invalid-chunk-offset": "ଅବୈଧ ଖରାପ ଅଫସେଟ",
        "img-auth-accessdenied": "ଭିତରକୁ ପଶିବାକୁ ବାରଣ କରାଗଲା",
-       "img-auth-nopathinfo": "ପଥ_ବିବରଣୀ ମିଳୁ ନାହିଁ।\nଆପଣଙ୍କ ସର୍ଭରରେ ଏହି ତଥ୍ୟଟିକୁ ପଠାଇବା ନିମନ୍ତେ ବ୍ୟବସ୍ଥା କରାଯାଇନାହିଁ ।\nଏହା ସିଜିଆଇ-ଆଧାରିତ ହୋଇପାରେ ଓ ଆଇଏମଜି_ଅଉଥରେ କାମକରୁନଥାଇପାରେ  ।\nhttps://www.mediawiki.org/wiki/Manual:Image_Authorization ଦେଖନ୍ତୁ ।",
+       "img-auth-nopathinfo": "ପଥ_ବିବରଣୀ ମିଳୁ ନାହିଁ।\nଆପଣଙ୍କ ସର୍ଭରରେ ଏହି ତଥ୍ୟଟିକୁ ପଠାଇବା ନିମନ୍ତେ ବ୍ୟବସ୍ଥା କରାଯାଇନାହିଁ ।\nଏହା ସିଜିଆଇ-ଆଧାରିତ ହୋଇପାରେ ଓ ଆଇଏମଜି_ଅଉଥରେ କାମକରୁନଥାଇପାରେ  ।\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization ଦେଖନ୍ତୁ ।",
        "img-auth-notindir": "ଅନୁରୋଧ କରାଯାଇଥିବା ପଥ ସଂରଚିତ ଅପଲୋଡ଼ ତାଲିକା ନୁହେଁ ।",
        "img-auth-badtitle": "\"$1\"ରୁ ଏକ ସଠିକ ଶିରୋନାମା ଗଠନ କରିବାରେ ଅସଫଳ ହେଲୁଁ ।",
        "img-auth-nologinnWL": "ଆପଣ ଲଗ ଇନ କରି ନାହାନ୍ତି ଓ \"$1\" ଏକ ଅନୁମୋଦିତ ତାଲିକାରେ ନାହିଁ ।",
        "license-nopreview": "(ସାଇତିବା ଆଗଦେଖଣା ମିଳୁନାହିଁ)",
        "upload_source_url": "(ଏକ ବୈଧ ସାଧାରଣରେ ଖୋଲାଯାଇପାରୁଥିବା URL)",
        "upload_source_file": "(ଆପଣଙ୍କ କମ୍ପୁଟରରେ ଥିବା ଏକ ଫାଇଲ)‌",
-       "listfiles-summary": "à¬\8fହି à¬¬à¬¿à¬¶à­\87ଷ à¬ªà­\83ଷà­\8dଠାà¬\9fି à¬¸à¬¬à­\81ଯାà¬\95 à¬\85ପଲà­\8bଡ଼ à¬\95ରାଯାà¬\87ଥିବା à¬«à¬¾à¬\87ଲ à¬¦à­\87à¬\96ାà¬\87ଥାà¬\8f à¥¤\nବà¬\9bାହà­\87ବା à¬¬à­\87ଳà­\87 à¬\95à­\87ବଳ à¬¸à¬­à­\8dà­\9fà¬\99à­\8dà¬\95 à¬¦à­\87à¬\87 à¬¨à¬\97ଦ à¬\85ପଲà­\8bଡ଼ à¬\95ରାଯାà¬\87ଥିବା à¬«à¬¾à¬\87ଲ à¬¦à­\87à¬\96ାଯାଇଥାଏ ।",
+       "listfiles-summary": "à¬\8fହି à¬¬à¬¿à¬¶à­\87ଷ à¬ªà­\83ଷà­\8dଠାà¬\9fି à¬\85ପଲà­\8bଡ଼ à¬¹à­\8bà¬\87ଥିବା à¬¸à¬®à¬¸à­\8dତ à¬«à¬¾à¬\87ଲ à¬¦à­\87à¬\96ାଇଥାଏ ।",
        "listfiles_search_for": "ମାଧ୍ୟମ ନାମଟି ଖୋଜିବେ:",
        "imgfile": "ଫାଇଲ",
        "listfiles": "ଫାଇଲ ତାଲିକା",
        "listfiles_size": "ଆକାର",
        "listfiles_description": "ବିବରଣୀ",
        "listfiles_count": "ସଂସ୍କରଣ",
+       "listfiles-latestversion": "ବର୍ତ୍ତମାନର ସଂସ୍କରଣ",
+       "listfiles-latestversion-yes": "ହଁ",
+       "listfiles-latestversion-no": "ନାଁ",
        "file-anchor-link": "ଫାଇଲ",
        "filehist": "ଫାଇଲ ଇତିହାସ",
        "filehist-help": "ଏହା ଫାଇଲଟି ସେତେବେଳେ ଯେମିତି ଦିଶୁଥିଲା ତାହା ଦେଖିବା ପାଇଁ ତାରିଖ/ବେଳା ଉପରେ କ୍ଲିକ କରନ୍ତୁ",
        "unusedtemplateswlh": "ଅନ୍ୟ ସଂଯୋଗ",
        "randompage": "ଯାହିତାହି ପୃଷ୍ଠା",
        "randompage-nopages": "ତଳେ ଥିବା {{PLURAL:$2|ନେମସ୍ପେସ|ନେମସ୍ପେସ}}: $1ରେ ଗୋଟିଏ ବି ପୃଷ୍ଠା ନାହିଁ ।",
+       "randomincategory-selectcategory-submit": "ଯାଆନ୍ତୁ",
        "randomredirect": "ଯାହିତାହି ପୁନପ୍ରେରଣ",
        "randomredirect-nopages": "\"$1\" ନାମରେ ଗୋଟିଏ ବି ପୁନପ୍ରେରଣ ନାହିଁ ।",
        "statistics": "ହିସାବ",
        "pageswithprop-submit": "ଯିବା",
        "doubleredirects": "ଯୋଡ଼ା ପୁନପ୍ରେରଣ",
        "doubleredirectstext": "ଏହି ପୃଷ୍ଠା ବାକି ବହୁବିକଳ୍ପ ପୃଷ୍ଠାମାନଙ୍କ ସହ ଯୋଡ଼ିଥାଏ ।\nପ୍ରତ୍ୟେକ ଧାଡ଼ିରେ ପ୍ରଥମ ଓ ଶେଷ ପୁନପ୍ରେରଣ ସହ ଯୋଡ଼ିବା ଲିଙ୍କ ରହିଥାଏ, ଆହୁରି ମଧ୍ୟ ଏଥିରେ ଦ୍ଵିତୀୟ ପୁନପ୍ରେରଣର ଲକ୍ଷ ସହ ଯୋଡ଼ିବାର ଲିଙ୍କ ଥାଏ , ଯାହାକି ସାଧାରଣତ \"ପ୍ରକୃତ\" ଲକ୍ଷ ପୃଷ୍ଠା ହୋଇଥାଏ, ଯାହାକୁ ପ୍ରଥମ ପୁନପ୍ରେରଣ ପୃଷ୍ଠା ଯୋଡ଼ିଥାଏ ।\n<del>କଟାହୋଇଥିବା</del> ନିବେଶସବୁ ସଜଡ଼ାଗଲା ।",
-       "double-redirect-fixed-move": "[[$1]]à¬\95à­\81 à¬\98à­\81à¬\9eà­\8dà¬\9aାଯାà¬\87à¬\85à¬\9bି à¥¤\nà¬\8fବà­\87 à¬\8fହା [[$2]]à¬\95à­\81 à¬ªà­\81ନପà­\8dରà­\87ରିତ à¬¹à­\8bà¬\87ଥାà¬\8f ।",
-       "double-redirect-fixed-maintenance": "[[$1]] à¬°à­\81 [[$2]] à¬\95à­\81 à¬¦à­\81à¬\87à¬\9fି à¬ªà­\81ନପà­\8dରà­\87ରଣରà­\87 à¬¥à¬¿à¬¬à¬¾ à¬\85ସà­\81ବିଧା à¬¸à­\81ଧାରିଦà­\87ଲà­\81à¬\81 à¥¤",
+       "double-redirect-fixed-move": "[[$1]]à¬\95à­\81 à¬\98à­\81à¬\9eà­\8dà¬\9aାଯାà¬\87à¬\85à¬\9bି à¥¤\nà¬\8fବà­\87 à¬\86ପà­\87 à¬\86ପà­\87 à¬\85ପଡà­\87à¬\9f à¬¹à­\8bà¬\87ଥାà¬\8f à¬\8fବà¬\82 à¬\8fବà­\87 [[$2]]à¬\95à­\81 à¬ªà­\81ନପà­\8dରà­\87ରିତ à¬¹à­\8bà¬\87à¬\9bି ।",
+       "double-redirect-fixed-maintenance": "[[$1]] à¬°à­\81 [[$2]] à¬¯à¬¾à¬\8fà¬\81 à¬¥à¬¿à¬¬à¬¾ à¬¦à­\81à¬\87à¬\9fି à¬\85ନାବଶà­\8dà­\9fà¬\95 à¬ªà­\81ନରà­\8dପà­\8dରà­\87ରଣ à¬°à¬\95à­\8dଷଣାବà­\87à¬\95à­\8dଷଣା à¬\95ଲାବà­\87ଳà­\87 à¬¸à¬\9cାଡ଼ିଦà­\87ଲà­\81 à¥¤",
        "double-redirect-fixer": "ପୁନପ୍ରେରଣ ସୁଧାରକ",
        "brokenredirects": "ଭଙ୍ଗା ପୁନପ୍ରେରଣ",
        "brokenredirectstext": "ତଳଲିଖିତ ପୁନପ୍ରେରଣ ସବୁ ସ୍ଥିତିହିନ ପୃଷ୍ଠାମାନଙ୍କୁ ପୁନପ୍ରେରିତ ହୋଇଥାଏ :",
        "protectedpages-indef": "କେବଳ ଆସିମୀତ କାଳ ପାଇଁ କିଳିବା",
        "protectedpages-cascade": "କିଲାଯାଇଥିବା ପୃଷ୍ଠାସବୁକୁ ଏକାଠି ସଜାଇ ରଖୁଅଛୁଁ",
        "protectedpagesempty": "ଏହି ସବୁ ସଜାଣି ସହ ଗୋଟିଏ ବି ପୃଷ୍ଠା ଏବେ କିଳାଯାଇ ନାହିଁ ।",
+       "protectedpages-timestamp": "ସମୟ",
+       "protectedpages-page": "ପୃଷ୍ଠା",
+       "protectedpages-expiry": "ଅଚଳ ହେବ",
+       "protectedpages-unknown-performer": "ଅଜଣା ସଭ୍ୟ",
        "protectedtitles": "କିଳାଯାଇଥିବା ଶିରୋନାମାମାନ",
        "protectedtitlesempty": "ଏହି ସବୁ ସଜାଣି ସହ ଗୋଟିଏ ବି ପୃଷ୍ଠା ଏବେ କିଳାଯାଇ ନାହିଁ ।",
        "listusers": "ବ୍ୟବହାରକାରୀଙ୍କ ତାଲିକା",
        "listusers-editsonly": "କେବଳ କିଛି ସମ୍ପାଦନା କରିଥିବା ସଭ୍ୟମାନଙ୍କୁ ଦେଖାଇବେ",
        "listusers-creationsort": "ତିଆରି ତାରିଖ ଅନୁସାରେ ସଜାଇବେ",
-       "usereditcount": "$1 à¬\9fି {{PLURAL:$1|ବଦଳ}}",
+       "usereditcount": "$1 à¬\97à­\8bà¬\9fି {{PLURAL:$1|ସମà­\8dପାଦନା|ସମà­\8dପାଦନା}}",
        "usercreated": "$1 ତାରିଖ ଦିନ $2 ବେଳେ {{GENDER:$3|ତିଆରି କରାଗଲା}}",
        "newpages": "ନୂଆ ପୃଷ୍ଠା",
        "newpages-username": "ବ୍ୟବହାରକାରୀଙ୍କ ନାମ:",
        "log-title-wildcard": "ଏହି ଲେଖାରେ ଆରମ୍ଭ ହୋଇଥିବା ଶିରୋନାମାସବୁ ଖୋଜିବେ",
        "showhideselectedlogentries": "ବାଛିଥିବା ତାଲିକାକୁ ଦେଖାଇବେ/ଲୁଚାଇବେ",
        "allpages": "ସବୁ ପୃଷ୍ଠା",
-       "alphaindexline": "$1 ରୁ $2",
        "nextpage": "ପର ପୃଷ୍ଠା ($1)",
        "prevpage": "ଆଗ ପୃଷ୍ଠା ($1)",
        "allpagesfrom": "ଏହି ନାଆଁରେ ଆରମ୍ଭ ହେଉଥିବା ପୃଷ୍ଠାଗୁଡ଼ିକୁ ଦେଖାଇବେ:",
        "activeusers-noresult": "ଜଣେ ବି ସଭ୍ୟ ମିଳିଲେ ନାହିଁ ।",
        "listgrouprights": "ସଭ୍ୟ ଗୋଠ ଅଧିକାରସମୂହ",
        "listgrouprights-summary": "ତଳେ ଉଇକି ସ୍ଥିର କରାଯାଇଥିବା ଏକ ଏକ ବ୍ୟବହାରକାରୀ ଗୋଠର ତାଲିକା ଦିଆଯାଇଛି, ସେଥିରେ ସେମାନଙ୍କ ବ୍ୟବହାର ଅଧିକାର ବାବଦରେ ମଧ୍ୟ ଦିଆଯାଇଛି ।\nସେଥିରେ ବୋଧେ [[{{MediaWiki:Listgrouprights-helppage}}|ଅଧିକ ବ୍ୟକ୍ତିଗତ ବିବରଣୀ ଥାଇପାରେ]] ।",
-       "listgrouprights-key": "* <span class=\"listgrouprights-granted\">à¬\85ନà­\81ମà­\8bଦିତ à¬\85ଧିà¬\95ାର</span>\n* <span class=\"listgrouprights-revoked\">ଫà­\87ରାà¬\87 à¬¨à¬¿à¬\86ଯାଇଥିବା ଅଧିକାର</span>",
+       "listgrouprights-key": "* <span class=\"listgrouprights-granted\">à¬\85ନà­\81ମà­\8bଦିର à¬\85ଧିà¬\95ାର</span>\n* <span class=\"listgrouprights-revoked\">à¬\85à¬\9fà¬\95ାଯାଇଥିବା ଅଧିକାର</span>",
        "listgrouprights-group": "ଗୋଠ",
        "listgrouprights-rights": "ଅଧିକାର",
        "listgrouprights-helppage": "Help:ଗୋଠ ଅଧିକାର",
        "listgrouprights-removegroup-self": "{{PLURAL:$2|ଗୋଠଟିଏ|ଗୋଟି ଗୋଠ}} ନିଜ ଖାତାରୁ ହଟାଇବେ: $1",
        "listgrouprights-addgroup-self-all": "ନିଜ ଖାତାରେ ସବୁଯାକ ଗୋଠ ଯୋଡ଼ିବେ",
        "listgrouprights-removegroup-self-all": "ନିଜ ଖାତାରୁ ସବୁଯାକ ଗୋଠ ହଟାଇଦେବେ",
+       "listgrouprights-namespaceprotection-namespace": "ନେମସ୍ପେସ",
+       "listgrouprights-namespaceprotection-restrictedto": "ସଭ୍ୟଙ୍କୁ ସମ୍ପାଦନା ପାଇଁ ଦିଆଯାଇଥିବା ଅଧିକାର",
+       "trackingcategories": "ଶ୍ରେଣୀମାନ ତଦାରଖ କରାଯାଉଛି",
+       "trackingcategories-name": "ନାମ ମେସେଜ କରନ୍ତୁ",
+       "trackingcategories-nodesc": "କୌଣସି ବିବରଣ ନାହିଁ ।",
+       "trackingcategories-disabled": "ଶ୍ରେଣୀ ନିଷ୍କ୍ରିୟ କରାଯାଇଛି",
        "mailnologin": "ଗୋଟିଏ ବି ପଠାଇବା ଠିକଣା ନାହିଁ",
        "mailnologintext": "ଆପଣ ନିଜ [[Special:Preferences|ପସନ୍ଦସବୁ]]ରେ [[Special:UserLogin|ଲଗ ଇନ]] କରିଥିଲେ ଓ ନିଜର ଏକ ସଚଳ ଇ-ମେଲ ଠିକଣା ଥିଲେ ଯାଇ ବାକି ସବୁ ସଭ୍ୟଙ୍କୁ ଇ-ମେଲ ପଠାଇପାରିବେ ।",
        "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 ଟି ପୃଷ୍ଠା|$1 ଟି ପୃଷ୍ଠା}} ଅଛି, ଆଲୋଚନା ପୃଷ୍ଠାମାନଙ୍କୁ ଅଲଗା ଗଣାଯାଇନାହିଁ ।",
        "wlheader-enotif": "ଇମେଲ ସୂଚନା ସଚଳ କରାଗଲା ।",
        "wlheader-showupdated": "ଆପଣ ଶେଷଥର ଦେଖିଥିବା ପୃଷ୍ଠାଗୁଡ଼ିକ '''ମୋଟା ଅକ୍ଷର'''ରେ ଦେଖାଯାଉଅଛି ।",
-       "watchmethod-recent": "ଏଡଖାଯାଇଥିବା ପୃଷ୍ଠାର ନଗଦ ବଦଳ ପରଖୁଛୁଁ",
-       "watchmethod-list": "ନଗଦ ବଦଳ ନିମନ୍ତେ ଦେଖାଯାଇଥିବା ପୃଷ୍ଠାମାନ ପରଖୁଛୁଁ",
-       "watchlistcontains": "ଆପଣଙ୍କ ଦେଖଣାତାଲିକାରେ $1 {{PLURAL:$1|ଗୋଟି ପୃଷ୍ଠା|ଗୋଟି ପୃଷ୍ଠା}} ରହିଅଛି ।",
-       "iteminvalidname": "'$1' ଯୋଗୁଁ କିଛି ଅସୁବିଧା ହେଉଅଛି, ଭୁଲ ନାମ...",
        "wlshowlast": "ଶେଷ $1 ଘଣ୍ଟା $2 ଦିନ $3 ଦେଖାଇବେ",
        "watchlist-options": "ଦେଖଣା ବିକଳ୍ପସବୁ",
        "watching": "ଦେଖୁଛି...",
        "contributions-title": "$1 ପାଇଁ ବ୍ୟବହାରକାରୀଙ୍କ ଦାନ",
        "mycontris": "ଅବଦାନ",
        "contribsub2": "$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": "ଲଗସବୁ",
        "blockip": "ସଭ୍ୟଙ୍କୁ ଅଟକାଇବେ",
        "blockip-legend": "ସଭ୍ୟଙ୍କୁ ବାସନ୍ଦ କରିବେ",
        "blockiptext": "ଏକ ନିର୍ଦିଷ୍ଟ IP ଠିକଣା ବା ବ୍ୟବହାରକାରୀଙ୍କ ଲେଖିବା ସୁବିଧାକୁ ବାରାଁ କରିବା ନିମନ୍ତେ ଏହି ତଳ ଫର୍ମଟି ବ୍ୟବହାର କରନ୍ତୁ ।\nଏହା କେବଳ ଅପବ୍ୟବହାରକୁ ରୋକିବା ନିମନ୍ତେ କରାଯାଇଥାଏ, ଏହା [[{{MediaWiki:Policy-url}}|ନୀତି]] ଅନୁସାରେ କରାଯାଇଥାଏ ।\nଏହା ତଳେ ଏକ ନିର୍ଦିଷ୍ଟ କାରଣ ଦିଅନ୍ତୁ (ଯଥା, ଯେଉଁସବୁ ପୃଷ୍ଠାରେ କିଛି ପ୍ରକାରର ଅପବ୍ୟବହାର କରାଯାଇଛି) ।",
-       "ipadressorusername": "ବ୍ୟବହାରକାରୀଙ୍କର IP ଠିକଣା ବା ଇଉଜର ନାମ:",
+       "ipaddressorusername": "ବ୍ୟବହାରକାରୀଙ୍କର IP ଠିକଣା ବା ଇଉଜର ନାମ:",
        "ipbexpiry": "ମିଆଦ:",
        "ipbreason": "କାରଣ:",
        "ipbreason-dropdown": "*ସାଧାରଣ ଅଟକ କାରଣ\n** ଭୁଲ ବିବରଣୀ ଦେବା\n** ପୃଷ୍ଠାରୁ ବିବରଣୀ କାଢିବା\n** ଅନନୁମୋଦିତ ବାହାର ସାଇଟର ଲିଙ୍କ ସ୍ପାମ କରିବା\n** ଅଯଥା କଥା ପୃଷ୍ଠାରେ ପୁରାଇବା\n** ଧମକାଣି/ଅପମାନ\n** ଏକାଧିକ ଖାତାରେ ଅସଦାଆଚରଣ\n** ଗ୍ରହଣ ଅଯୋଗ୍ୟ ଇଉଜର ନାମ",
        "allmessages-prefix": "ଉପସର୍ଗ ଦେଇ ଛଣା:",
        "allmessages-language": "ଭାଷା:",
        "allmessages-filter-submit": "ଯିବା",
+       "allmessages-filter-translate": "ଅନୁବାଦ କରନ୍ତୁ",
        "thumbnail-more": "ବିସ୍ତାର",
        "filemissing": "ଫାଇଲ ମିଳୁନାହିଁ",
        "thumbnail_error": "ନଖଦେଖଣା ତିଆରିବାରେ ଅସୁବିଧା: $1",
        "tooltip-n-mainpage-description": "ପ୍ରଧାନ ପୃଷ୍ଠା",
        "tooltip-n-portal": "ଏହି ପ୍ରକଳ୍ପଟିରେ ଖୋଜା ଖୋଜି ପାଇଁ ଆପଣ କେମିତି ସାହାଯ୍ୟ କରିପାରିବେ",
        "tooltip-n-currentevents": "ନଗଦ କାମର ପଛପଟେ ଚାଲିଥିବା କାମର ତଥ୍ୟ",
-       "tooltip-n-recentchanges": "ୱିà¬\95ିରà­\87 à¬\8fହିମାତà­\8dର à¬\95ରାଯାà¬\87ଥିବା à¬\85ଦଳ à¬¬à¬¦à¬³",
+       "tooltip-n-recentchanges": "à¬\89à¬\87à¬\95ିରà­\87 à¬¹à­\8bà¬\87ଥିବା à¬¨à¬\97ଦ à¬¬à¬¦à¬³à¬° à¬¤à¬¾à¬²à¬¿à¬\95ା",
        "tooltip-n-randompage": "ଯାହିତାହି ପୃଷ୍ଠାଟିଏ ଖୋଲ",
        "tooltip-n-help": "ଖୋଜି ପାଇବା ଭଳି ଜାଗା",
        "tooltip-t-whatlinkshere": "ଏଠାରେ ଯୋଡ଼ାଯାଇଥିବା ପୃଷ୍ଠାସବୁର ତାଲିକା",
        "tooltip-ca-nstab-template": "ଟେମ୍ପଲେଟଟି ଦେଖିବା",
        "tooltip-ca-nstab-help": "ସହାଯୋଗ ପୃଷ୍ଠାଟି ଦେଖନ୍ତୁ",
        "tooltip-ca-nstab-category": "ଶ୍ରେଣୀ ପୃଷ୍ଠାଟିକୁ ଦେଖାଇବେ",
-       "tooltip-minoredit": "à¬\8fହାà¬\95à­\81 à¬\8fà¬\95 à¬\9bà­\8bà¬\9f à¬¬à¬¦à¬³ ଭାବେ ଗଣିବେ",
+       "tooltip-minoredit": "à¬\8fହାà¬\95à­\81 à¬\8fà¬\95 à¬¸à¬¾à¬®à¬¾à¬¨à­\8dà­\9f à¬¸à¬®à­\8dପାଦନା ଭାବେ ଗଣିବେ",
        "tooltip-save": "ବଦଳଗୁଡ଼ିକ ସାଇତିବେ",
-       "tooltip-preview": "ସାà¬\87ତିବା à¬\86à¬\97ରà­\81 à¬\95ରିଥିବା à¬¬à¬¦à¬³ ପରଖିନିଅନ୍ତୁ!",
+       "tooltip-preview": "ସାà¬\87ତିବା à¬\86à¬\97ରà­\81 à¬¨à¬¿à¬\9cର à¬¸à¬®à­\8dପାଦନା ପରଖିନିଅନ୍ତୁ!",
        "tooltip-diff": "ଏହି ଲେଖାରେ ଆପଣ କରିଥିବା ବଦଳଗୁଡିକୁ ଦେଖନ୍ତୁ ।",
        "tooltip-compareselectedversions": "ଏହି ଫରଦର ଦୁଇଟି ବଛାଯାଇଥିବା ସଁକଳନକୁ ତଉଲିବା",
        "tooltip-watch": "ଆପଣଙ୍କ ଦେଖାତାଲିକାରେ ଏଇ ପୃଷ୍ଠାଟି ମିଶାଇବେ",
        "tooltip-recreate": "ଏହି ପୃଷ୍ଠାଟି ଲିଭାଇଦିଆଯାଇଥିଲେ ବି ଆଉଥରେ ତିଆରି କରନ୍ତୁ",
        "tooltip-upload": "ଅପଲୋଡ଼ କରନ୍ତୁ",
        "tooltip-rollback": "\"ଫେରିବା\" ଏହି ଫରଦରେ ଶେଷ ଦାତାଙ୍କ ଦେଇ କରାଯାଇଥିବା ସବୁଯାକ ବଦଳକୁ  ଏକାଥରକରେ ପଛକୁ ଫେରାଇଦେବ",
-       "tooltip-undo": "\"à¬\95ରନାହିà¬\81\" à¬\86à¬\97ରà­\81 à¬\95ରାଯାà¬\87ଥିବା à¬¬à¬¦à¬³à¬\9fିà¬\95à­\81 à¬ªà¬\9bà¬\95à­\81 à¬²à­\87à¬\89à¬\9fାà¬\87ଦିà¬\8f à¬\86à¬\89 à¬¬à¬¦à¬³ à¬«à¬°à¬®à¬\9fିà¬\95à­\81 à¬¦à­\87à¬\96ଣା à¬­à¬¾à¬¬à¬°à­\87 à¬\96à­\8bଲà­\87 à¥¤ à¬\8fହା à¬\86ପଣà¬\99à­\8dà¬\95à­\81 à¬¸à¬¾à¬°à¬\95ଥାରà­\87 à¬\97à­\8bà¬\9fିà¬\8f à¬\95ାରଣ à¬²à­\87à¬\96ିବାà¬\95à­\81 à¬\85ନà­\81ମତି ଦିଏ ।",
+       "tooltip-undo": "\"à¬\95ରନାହିà¬\81\" à¬¦à¬¬à¬¾à¬\87ଲà­\87 à¬\86à¬\97ରà­\81 à¬¹à­\8bà¬\87ଥିବା à¬¸à¬®à­\8dପାଦନାà¬\9fିà¬\8f à¬ªà¬\9bà¬\95à­\81 à¬²à­\87à¬\89à¬\9fିଯାà¬\8f à¬\93 à¬¤à¬¾à¬¹à¬¾ à¬¸à¬®à­\8dପାଦନା à¬ªà­\83ଷà­\8dଠାà¬\9fିà¬\95à­\81 '''ଦà­\87à¬\96ଣା''' à¬­à¬¾à¬¬à­\87 à¬\96à­\8bଲà­\87 à¥¤ à¬\86ପଣà¬\99à­\8dà¬\95à­\81 à¬\8fହା à¬¸à¬¾à¬°à¬\95ଥାରà­\87 à¬\95ାରଣà¬\9fିà¬\8f à¬²à­\87à¬\96ିବାର à¬¸à­\81ଯà­\8bà¬\97 ଦିଏ ।",
        "tooltip-preferences-save": "ଆପଣା ପସନ୍ଦ ସାଇତିବେ",
        "tooltip-summary": "ଛୋଟ ସାରକଥାଟିଏ ଦିଅନ୍ତୁ",
-       "notacceptable": "ଆପଣଙ୍କ ସହଯୋଗୀ ପଢ଼ିପାରିବା ଢଙ୍ଗରେ ଉଇକି ସର୍ଭର ତଥ୍ୟ ଦେଇପାରିବ ନାହିଁ ।",
        "anonymous": "{{SITENAME}}ର ଅଜଣା {{PLURAL:$1|ଜଣ ବ୍ୟବହାରକାରୀ |ଜଣ ବ୍ୟବହାରକାରୀଗଣ}}",
        "siteuser": "{{SITENAME}} ବ୍ୟବହାରକାରୀ $1",
        "anonuser": "{{SITENAME}} ବେନାମି ବ୍ୟବହାରକାରୀ $1",
        "pageinfo-length": "ପୃଷ୍ଠା ଲମ୍ବ(ବାଇଟରେ)",
        "pageinfo-article-id": "ପୃଷ୍ଠା ଆଇଡ଼ି",
        "pageinfo-language": "ପୃଷ୍ଠା ବିଷୟବସ୍ତୁର ଭାଷା",
-       "pageinfo-robot-policy": "à¬\96à­\8bà¬\9cିବା à¬\87à¬\9eà­\8dà¬\9cିନ à¬¸à­\8dଥିତି",
-       "pageinfo-robot-index": "ସà­\82à¬\9aà­\80ପତà­\8dର à¬\95ରିହà­\87à¬\89ଥିବା",
-       "pageinfo-robot-noindex": "ସà­\82à¬\9aà­\80ପତà­\8dର à¬\95ରିହà­\87à¬\89ନଥିବା",
+       "pageinfo-robot-policy": "ସà­\8dà­±à­\9fà¬\82à¬\9aାଳà¬\95 (bot) à¬¦à­\8dୱାରା à¬¸à­\82à¬\9aà­\80 à¬¨à¬¿à¬°à­\8dମିତ",
+       "pageinfo-robot-index": "à¬\85ନà­\81ମà­\8bଦିତ",
+       "pageinfo-robot-noindex": "à¬\85ନà­\81ନମà­\8bଦିତ",
        "pageinfo-views": "ଦେଖଣା ସଂଖ୍ୟା",
        "pageinfo-watchers": "ପୃଷ୍ଠା ଦେଖଣାହାରି ସଂଖ୍ୟା",
        "pageinfo-few-watchers": "$1ରୁ କମ {{PLURAL:$1|ଦେଖଣାକାରୀ|ଦେଖଣାକାରୀଗଣ}}",
-       "pageinfo-redirects-name": "ଏହି ପୃଷ୍ଠାକୁ ଲେଉଟାଣି ଅଛି",
+       "pageinfo-redirects-name": "ଏହି ପୃଷ୍ଠା ସହ ସମ୍ବନ୍ଧିତ ପୁନର୍ପ୍ରେରଣ",
        "pageinfo-subpages-name": "ଏହି ପୃଷ୍ଠାରେ ଥିବା ଉପପୃଷ୍ଠା",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|redirect|redirects}}; $3 {{PLURAL:$3|non-redirect|non-redirects}})",
        "pageinfo-firstuser": "ପୃଷ୍ଠା ତିଆରିକରିଛନ୍ତି",
        "svg-long-desc": "SVG ଫାଇଲ, ସାଧାରଣ ମାପ $1 × $2 ପିକ୍ସେଲ, ଫାଇଲ ଆକାର: $3",
        "svg-long-desc-animated": "Animated SVG ଫାଇଲ, ସାଧାରଣ ମାପ $1 × $2 ପିକ୍ସେଲ, ଫାଇଲ ଆକାର: $3",
        "svg-long-error": "ଅବୈଧ SVG ଫାଇଲ: $1",
-       "show-big-image": "ପà­\81ରା à¬¬à¬¡à¬¼ à¬\86à¬\95ାରରà­\87",
+       "show-big-image": "ମà­\82ଳ à¬«à¬¾à¬\87ଲ",
        "show-big-image-preview": "ଏହି ଦେଖଣାର ଆକାର: $1 ।",
        "show-big-image-other": "ବାକି {{PLURAL:$2|ରେଜୋଲୁସନ|ରେଜୋଲୁସନ}}: $1.",
        "show-big-image-size": "$1 × $2 ପିକ୍ସେଲ",
        "newimages-summary": "ଏହି ବିଶେଷ ପୃଷ୍ଠାଟି ଶେଷ ଅପଲୋଡ଼ ହୋଇଥିବା ଫାଇଲମାନ ଦେଖାଇଥାଏ ।",
        "newimages-legend": "ଛାଣିବା",
        "newimages-label": "ଫାଇଲ ନାମ (କିମ୍ବା ତାହାର ଏକ ଭାଗ):",
-       "showhidebots": "($1 ଜଣ ବଟ)",
        "noimages": "ଦେଖିବାକୁ କିଛି ନାହିଁ ।",
        "ilsubmit": "ଖୋଜିବା",
        "bydate": "ତାରିଖ ଅନୁସାରେ",
        "hours-ago": "$1 {{PLURAL:$1|ଘଣ୍ଟା}} ଆଗରୁ",
        "minutes-ago": "$1 {{PLURAL:$1|ମିନିଟ|ମିନିଟ}} ଆଗରୁ",
        "seconds-ago": "$1 {{PLURAL:$1|ସେକେଣ୍ଡ|ସେକେଣ୍ଡ}} ଆଗରୁ",
+       "monday-at": "ସୋମବାର, $1 ବେଳେ",
+       "tuesday-at": "ମଙ୍ଗଳବାର, $1 ବେଳେ",
+       "wednesday-at": "ବୁଧବାର, $1 ବେଳେ",
+       "thursday-at": "ଗୁରୁବାର, $1 ବେଳେ",
+       "friday-at": "ଶୁକ୍ରବାର, $1 ବେଳେ",
+       "saturday-at": "ଶନିବାର, $1 ବେଳେ",
+       "sunday-at": "ରବିବାର, $1 ବେଳେ",
+       "yesterday-at": "ଗତକାଲି, $1 ବେଳେ",
        "bad_image_list": "ଗଢ଼ଣଟି ଏମିତି ହେବ:\n\nକେବଳ (ଯେଉଁ ଧାଡ଼ିଗୁଡ଼ିକ * ରୁ ଆରମ୍ଭ ହୋଇଥାଏ) ସେହି ସବୁକୁ ହିସାବକୁ ନିଆଯିବ ।\nଗୋଟିଏ ଧାଡ଼ିର ପ୍ରଥମ ଲିଙ୍କଟି ଗୋଟିଏ ଖରାପ ଫାଇଲର ଲିଙ୍କ ହୋଇଥିବା ଦରକାର ।\nପ୍ରଥମ ଲିଙ୍କ ପରର ସବୁ ଲିଙ୍କକୁ ନିଆରା ବୋଲି ଧରାଯିବ । ମାନେ, ସେଇସବୁ ପୃଷ୍ଠାଦରେ ଯେଉଁଠି ଫାଇଲଟି ଧାଡ଼ି ଭିତରେ ରହିଥିବ ।",
        "metadata": "ମେଟାଡାଟା",
        "metadata-help": "ଏହି ଫରଦଟିରେ ଗୁଡ଼ାଏ ଅଧିକ କଥା ଅଛି, ବୋଧହୁଏ ଡିଜିଟାଲ କାମେରା କିମ୍ବା ସ୍କାନରରେ ନିଆଯାଇଛି । ଯଦି ଫାଇଲଟି ତାର ମୂଳ ଭାଗଠୁ ବଦଳାଜାଇଥାଏ ତେବେ କିଛି ଅଁଶ ଠିକ ଭାବେ ଦେଖାଯାଇ ନପାରେ ।",
        "exif-locationdest": "ଅବସ୍ଥିତି ଅଙ୍କାଯାଇଛି",
        "exif-locationdestcode": "ଅଙ୍କାଯାଇଥିବା ସ୍ଥାନର କୋଡ଼",
        "exif-objectcycle": "ମାଧ୍ୟମଟି ଦିନର କେତେ ବେଳେ ରଖିବାକୁ ସ୍ଥିର କରାଯାଇଛି",
-       "exif-contact": "ଯୋଗାଯୋଗ ସୂଚନାବଳି",
+       "exif-contact": "ଯୋଗାଯୋଗ ସୂଚନା",
        "exif-writer": "ଲେଖକ",
        "exif-languagecode": "ଭାଷା",
        "exif-iimversion": "IIM ସଂସ୍କରଣ",
        "exif-compression-3": "CCITT ଗୋଠ ୩ ଫାକ୍ସ ଏନକୋଡ଼ିଙ୍ଗ",
        "exif-compression-4": "CCITT ଗୋଠ ୪ ଫାକ୍ସ ଏନକୋଡ଼ିଙ୍ଗ",
        "exif-copyrighted-true": "ସତ୍ଵାଧିକାର ଥିବା",
-       "exif-copyrighted-false": "ପବà­\8dଲିà¬\95 à¬¡à­\8bମà­\87ନ",
+       "exif-copyrighted-false": "à¬\95ପିରାà¬\87à¬\9f à¬¤à¬¥à­\8dà­\9f à¬¦à¬¿à¬\86ଯାà¬\87ନାହିà¬\81",
        "exif-unknowndate": "ଅଜଣା ତାରିଖ",
        "exif-orientation-1": "ସାଧାରଣ",
        "exif-orientation-2": "ଭୂସମାନ୍ତର ଭାବେ ବୁଲାଇଦିଆଯାଇଛି",
        "imgmultipagenext": "ପର ପୃଷ୍ଠା →",
        "imgmultigo": "ଯିବା!",
        "imgmultigoto": "$1 ପୃଷ୍ଠାକୁ ଯିବେ",
+       "img-lang-default": "(ଡିଫଲ୍ଟ ଭାଷା)",
        "ascending_abbrev": "ସାନରୁ ବଡ କ୍ରମରେ",
        "descending_abbrev": "ବଖାଣ",
        "table_pager_next": "ପର ପୃଷ୍ଠା",
        "autosumm-replace": "ବିଷୟବସ୍ତୁକୁ \"$1\" ଦେଇ ପ୍ରତିବଦଳ କଲେ",
        "autoredircomment": "[[$1]]କୁ ପୃଷ୍ଠାଟି ଘୁଞ୍ଚାଇଦିଆଗଲା",
        "autosumm-new": "\"$1\" ନାଆଁରେ ପୃଷ୍ଠାଟିଏ ତିଆରିକଲେ",
-       "livepreview-loading": "ଖୋଲୁଅଛି...",
-       "livepreview-ready": "ଖୋଲୁଅଛି...ଏବେ ସଜିଲ!",
-       "livepreview-failed": "ସିଧା ଦେଖଣା ବିଫଳ ହେଲା!\nସାଧାରଣ ଦେଖଣା ପାଇଁ ଚେଷ୍ଟା କରନ୍ତୁ ।",
-       "livepreview-error": "ଏହିସବୁ କାମ ପାଇଁ ଯୋଡ଼ିପାରୁନାହୁଁ $1 \"$2\" \nସାଧାରଣ ଦେଖଣା ପାଇଁ ଚେଷ୍ଟା କରନ୍ତୁ ।",
        "lag-warn-normal": "$1 {{PLURAL:$1|ସେକେଣ୍ଡ|ସେକେଣ୍ଡ}}ରୁ ନୂଆ ବଦଳ ଏହି ତାଲିକାରେ ଦେଖାଯାଉ ନାହିଁ ।",
        "lag-warn-high": "ଅଧିକ ଡାଟାବେସ ସର୍ଭର ପଛୁଆ ଅବସ୍ଥା ହେତୁ $1 {{PLURAL:$1|ସେକେଣ୍ଡ|ସେକେଣ୍ଡ}}ରୁ ନୂଆ ବଦଳସବୁ ଏହି ତାଲିକାରେ ଦେଖାଯିବ ନାହିଁ ।",
-       "watchlistedit-numitems": "ଆପଣଙ୍କ ଦେଖଣାତାଲିକାରେ ଅଲୋଚନାକୁ ଛାଡ଼ି {{PLURAL:$1|ନାମଟିଏ|$1 ଗୋଟି ନାମ}} ଅଛି ।",
-       "watchlistedit-noitems": "ଆପଣଙ୍କ ଦେଖଣାତାଲିକାରେ ଗୋଟିଏ ବି ନାମ ନାହିଁ ।",
        "watchlistedit-normal-title": "ଦେଖଣାତାଲିକା ସମ୍ପାଦନା କରିବେ",
        "watchlistedit-normal-legend": "ଦେଖିଥିବା ପୃଷ୍ଠାଗୁଡିକରୁ ଶିରୋନାମା ହଟାଇବେ ।",
        "watchlistedit-normal-explain": "ଆପଣଙ୍କର ଦେଖଣା ତାଲିକାର ଶିରୋନାମାଗୁଡିକ ତଳେ ଦେଖା ଯାଇଛି ।\nଶିରୋନାମା  ହଟାଇବାକୁ ଚାହୁଁଥିଲେ, ଏହାର ପାଖରେ ଥିବା ବାକ୍ସରେ ଟିକ ମାରନ୍ତୁ ଏବଂ \"{{int:Watchlistedit-normal-submit}}\"ରେ କ୍ଲିକ କରନ୍ତୁ ।\nଆପଣ [[Special:EditWatchlist/raw|edit the raw list]] ମଧ୍ୟ କରିପାରିବେ ।",
        "watchlistedit-raw-done": "ଆପଣଙ୍କ ଦେଖଣା ତାଲିକାଟି ଅପଡେଟ ହେଇଯାଇଛି ।",
        "watchlistedit-raw-added": "{{PLURAL:$1|ନାମଟିଏ|$1 ଗୋଟି ନାମ}} ଯୋଗ କରାଗଲା:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|ନାମଟିଏ|$1 ଗୋଟି ନାମ}} କାଢ଼ିଦିଆଗଲା:",
+       "watchlistedit-clear-titles": "ନାମ:",
        "watchlisttools-view": "ଦରକାରୀ ବଦଳଗୁଡ଼ିକ ଦେଖାଇବେ",
        "watchlisttools-edit": "ଦେଖିବା ତାଲିକାଟିକୁ ଦେଖିବେ ଓ ବଦଳାଇବେ",
        "watchlisttools-raw": "ଫାଙ୍କା ଦେଖଣା ତାଲିକାଟିର ସମ୍ପାଦନା କରିବେ",
        "version-hook-name": "ହୁକ ନାମ",
        "version-hook-subscribedby": "କାହା ଦେଇ ମଗାଯାଇଛି",
        "version-version": "(ଭାଗ $1)",
-       "version-license": "ଲାଇସେନ୍ସ",
+       "version-license": "ମିଡ଼ିଆଉଇକି ସ୍ୱତ୍ୱ",
+       "version-ext-license": "ଲାଇସେନ୍ସ",
+       "version-ext-colheader-name": "ଏକ୍ସଟେନସନ",
+       "version-ext-colheader-version": "ସଂସ୍କରଣ",
+       "version-ext-colheader-license": "ଲାଇସେନ୍ସ",
+       "version-ext-colheader-description": "ବର୍ଣନା",
+       "version-ext-colheader-credits": "ଲେଖକମାନେ",
        "version-poweredby-credits": "ଏହି ଉଇକିଟି '''[https://www.mediawiki.org/ ମିଡ଼ିଆଉଇକି]''' ଦେଇ ପରିଚାଳିତ, ସତ୍ଵାଧିକାର © ୨୦୦୧-$1 $2 ।",
        "version-poweredby-others": "ବାକିସବୁ",
        "version-credits-summary": "ଆମେ ଏହି ଲୋକମାନଙ୍କୁ [[Special:Version|MediaWiki]]ରେ ସେମାନକର ଅବଦାନ ପାଇଁ ଚିହ୍ନିବାକୁ ଚାହୁଁଛୁ ।",
        "version-entrypoints": "ନିବେଶ ହେଉଥିବା ସ୍ଥାନର URLଗୁଡିକ",
        "version-entrypoints-header-entrypoint": "ପ୍ରବେଶ ବିନ୍ଦୁ",
        "version-entrypoints-header-url": "ଇଉଆରଏଲ",
+       "redirect-submit": "ଯାଆନ୍ତୁ",
+       "redirect-lookup": "ଖୋଜନ୍ତୁ:",
+       "redirect-value": "ମୂଲ୍ୟ:",
+       "redirect-user": "ସଭ୍ୟ ଆଇଡ଼ି",
+       "redirect-page": "ପୃଷ୍ଠା ଆଇଡ଼ି",
+       "redirect-revision": "ପୃଷ୍ଠା ସଂସ୍କରଣ",
+       "redirect-file": "ଫାଇଲ ନାମ",
+       "redirect-not-exists": "ମୂଳ୍ୟ ମିଳିଲା ନାହିଁ",
        "fileduplicatesearch": "ଏହାର ନକଲ ପୃଷ୍ଠା ଖୋଜିବେ ।",
        "fileduplicatesearch-summary": "ହାସ୍ ମୂଲ୍ୟକୁ ନେଇ ଦୁଇଥର ଥିବା ଫାଇଲ ଖୋଜନ୍ତୁ ।",
        "fileduplicatesearch-legend": "ନକଲ ପାଇଁ ଖୋଜନ୍ତୁ ।",
        "fileduplicatesearch-result-n": "\"$1\" ଫାଇଲର {{PLURAL:$2|1 ଗୋଟି ଏକାଭଳି|$2 ଗୋଟି ଏକାଭଳି}} ଫାଇଲ ଅଛି ।",
        "fileduplicatesearch-noresults": "\"$1\" ନାମରେ ଗୋଟିଏ ବି ଫାଇଲ ମିଳିଲା ନାହିଁ ।",
        "specialpages": "ବିଶେଷ ପୃଷ୍ଠା",
+       "specialpages-note-top": "ଲିଜେଣ୍ଡ",
        "specialpages-note": "* ସାଧାରଣ ବିଶେଷ ପୃଷ୍ଠାମାନ ।\n* <span class=\"mw-specialpagerestricted\">କିଳାଯାଇଥିବା ବିଶେଷ ପୃଷ୍ଠାମାନ ।</span>",
        "specialpages-group-maintenance": "ରକ୍ଷଣାବେକ୍ଷଣା ବିବରଣୀ",
        "specialpages-group-other": "ବାକି ବିଶେଷ ପୃଷ୍ଠା",
        "tags-tag": "ଚିହ୍ନ ନାମ",
        "tags-display-header": "ବଦଳ ତାଲିକାରେ ଦେଖଣା",
        "tags-description-header": "ଅର୍ଥର ପୁରା ବିବରଣୀ",
+       "tags-active-header": "ସକ୍ରିୟ କି?",
        "tags-hitcount-header": "ଚିହ୍ନିତ ବଦଳ",
+       "tags-active-yes": "ହଁ",
+       "tags-active-no": "ନାଁ",
        "tags-edit": "ସମ୍ପାଦନା",
        "tags-hitcount": "$1 {{PLURAL:$1|ବଦଳ|ବଦଳସବୁ}}",
        "comparepages": "ବଦଳ ତୁଳନା କରିବେ",
        "compare-invalid-title": "ଆପଣ ଦର୍ଶାଇଥିବା ଶିରୋନାମା ବୈଧ ନୁହେଁ ।",
        "compare-title-not-exists": "ଆପଣ ଦର୍ଶାଇଥିବା ଶିରୋନାମାଟି ଆଦୌ ନାହିଁ ।",
        "compare-revision-not-exists": "ଆପଣ ଦର୍ଶାଇଥିବା ପୁନରାବୃତ୍ତି ଆଦୌ ନାହିଁ ।",
-       "dberr-header": "ଏହି ଉଇକିରେ କିଛି ଅସୁବିଧା ଅଛି ।",
        "dberr-problems": "କ୍ଷମାକରିବେ !  ଏହି ସାଇଟରେ ଟିକେ ବୈଷୟିକ ତ୍ରୁଟି ଦେଖାଦେଇଛି ।",
        "dberr-again": "କିଛି ମିନିଟ ଅପେକ୍ଷା କରିବା ସହ ଆଉ ଥରେ ଲୋଡ କରନ୍ତୁ ।",
        "dberr-info": "(ଡାଟାବେସ ସର୍ଭର ସହ ଯୋଗାଯୋଗ କରିପାରିଲୁ ନାହିଁ: $1)",
+       "dberr-info-hidden": "(ଡାଟାବେସ ସର୍ଭର ସହ ଯୋଗାଯୋଗ କରିପାରିଲୁ ନାହିଁ)",
        "dberr-usegoogle": "ଏହି ସମୟ ଭିତରେ ଆପଣ ଗୁଗଲରେ ଖୋଜି ପାରିବେ ।",
        "dberr-outofdate": "ଜାଣିରଖନ୍ତୁ ଯେ ଆମ ବିଷୟବସ୍ତୁକୁ ନେଇ ସେମାନେ ତିଆରିଥିବା ସୂଚି ବହୁପୁରାତନ ହୋଇପାରେ ।",
        "dberr-cachederror": "ଏହା ଅନୁରୋଧ କରାଯାଇଥିବା ପୃଷ୍ଠାର ଏକ ଆଗରୁ ସାଇତାଥିବା ନକଲ ଓ ସତେଜ ହୋଇ ନଥାଇପାରେ ।",
        "htmlform-selectorother-other": "ବାକି",
        "htmlform-no": "ନାହିଁ",
        "htmlform-yes": "ହଁ",
+       "htmlform-chosen-placeholder": "ବିକଳ୍ପଟିଏ ବାଛନ୍ତୁ",
+       "htmlform-cloner-create": "ଅଧିକ ଯୋଡ଼ନ୍ତୁ",
+       "htmlform-cloner-delete": "ବାହାର କରନ୍ତୁ",
+       "htmlform-cloner-required": "ଅତି କମରେ ଗୋଟିଏ ମୂଲ୍ୟ ଲୋଡ଼ା",
        "sqlite-has-fts": "ପୁରା ଟେକ୍ସ୍ଟ ଖୋଜା ସହଯୋଗ ସହିତ $1",
        "sqlite-no-fts": "ପୁରା ଟେକ୍ସ୍ଟ ଖୋଜା ସହଯୋଗ ବିନା $1",
-       "logentry-delete-delete": "$1 $3 ପୃଷ୍ଠାଟି ଲିଭାଇଦେଲେ",
-       "logentry-delete-restore": "$1 $3 ପୃଷ୍ଠାଟି ପୁନସ୍ଥାପନ କଲେ",
+       "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 ରେ ଇତିହାସର ଘଟଣାସବୁର ଦେଖଣା ବଦଳାଇଦେଲେ",
index 5d4d64e..0b11f46 100644 (file)
@@ -5,7 +5,8 @@
                        "Amire80",
                        "Bouron",
                        "HalanTul",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Æрвитæнты бын хахх:",
@@ -18,7 +19,6 @@
        "tog-showtoolbar": "Æвдисын ивыны панел (домы JavaScript)",
        "tog-editondblclick": "Фæрстæ дыкъæппæй ив (домы JavaScript)",
        "tog-editsectiononrightclick": "Хайы сæрыл рахис æркъæппæй ивыны фадат баиу кæнын (домы JavaScript)",
-       "tog-rememberpassword": "Бахъуыды мæ кæнæд ацы браузер ($1 {{PLURAL:$1|бонмæ|бонмæ}})",
        "tog-watchcreations": "Æз цы фæрстæ аразын æмæ цы файлтæ бавгæнын, уыдон мæ цæстдард уæт.",
        "tog-watchdefault": "Æз цы фæрстæ æмæ цы файлтæ ивын, уыдон мæ цæстдард уæт",
        "tog-watchmoves": "Æз цы фæрсты нæмттæ æмæ цы файлтæ ивын, уыдон мæ цæстдард уæт",
        "readonly_lag": "Рарддон йæхæдæг сæхгæд ис, цалынмæ дыггагон севертæ нæ ссинхронизаци кæной фыццагонтимæ",
        "internalerror": "Мидæггаг рæдыд",
        "internalerror_info": "Мидæггаг рæдыд: $1",
-       "fileappenderrorread": "Нæ рауадис бафæрсын \"$1\" æфтауыны рæстæджы.",
-       "fileappenderror": "Нæ рауадис бафтауын \"$1\" \"{{grammar:allative|$2}}\".",
        "filecopyerror": "Файл «$1» файл {{grammar:allative|«$2»}} къопи кæнын нæ рауад.",
        "filerenameerror": "Нæ рауадис фæивын \"$1\" файлы ном \"$2\"-мæ.",
        "filedeleteerror": "Нæ уайы файл «$1» схафын.",
        "directorycreateerror": "Директори «$1» саразын нæ рауадис.",
        "filenotfound": "Файл «$1» ссарын нæ рауадис.",
-       "fileexistserror": "Нæй фыссæн \"$1\" файлы: Файл ис.",
        "unexpected": "Æнæмбæлон нысаниуæг: «$1»=«$2».",
        "formerror": "Рæдыд: формæ арвитын нæ рауадис.",
        "badarticleerror": "Ацы архайд нæ арæзт кæны ацы фарсыл.",
        "gotaccountlink": "Бахизын",
        "userlogin-resetlink": "Ферох дæ сты дæ бахизæнтæ?",
        "userlogin-resetpassword-link": "Дæ пароль ногæй сæвæр",
-       "createacct-join": "Дæ информаци дæлдæр бафысс.",
        "createacct-emailrequired": "Электрон посты адрис",
        "createacct-emailoptional": "Электрон посты адрис (фæндон)",
        "createacct-email-ph": "Бафысс дæ электрон посты адрис",
        "savearticle": "Бавæрын",
        "preview": "Разæркаст",
        "showpreview": "Фенын",
-       "showlivepreview": "Тагъд разæркаст",
        "showdiff": "Иртасын",
        "anoneditwarning": "'''Сындæггай:''' Ды системæйы нæ дæ.\nДæ IP адрес фыст æрцæудзæнис фарсы историйы.",
        "anonpreviewwarning": "''Ды системæмæ хызт нæ дæ. Бавæрд дын дæ IP адрис ныффысдзæн фарсы историйы.''",
        "showingresultsheader": "{{PLURAL:$5|Фæстиуæг '''$1''' '''$3'''-йæ|Фæстиуджытæ '''$1 - $2''' '''$3'''-йæ}} '''{{grammar:dative|$4}}'''",
        "search-nonefound": "Ницы разындис домæнæн",
        "powersearch-legend": "Сæрмагонд агуырд",
-       "powersearch-redir": "Рарвыстытæ æвдисын",
        "powersearch-toggleall": "Иууылдæр",
        "preferences": "Уагæвæрдтæ",
        "mypreferences": "Уагæвæрдтæ",
        "prefs-advancedsearchoptions": "Фылдæр фадæттæ",
        "prefs-advancedwatchlist": "Фылдæр фадæттæ",
        "prefs-displayrc": "Æвдисыны фадæттæ",
-       "prefs-displaysearchoptions": "Æвдисыны фадæттæ",
        "prefs-displaywatchlist": "Æвдисыны фадæттæ",
        "prefs-diffs": "Иртасæнтæ",
        "email-address-validity-valid": "E-mail раст зыны",
        "recentchanges-label-bot": "Ацы ивд бот сарæзта",
        "recentchanges-label-unpatrolled": "Ацы ивд нырмæ нæу фидар гонд",
        "rcnotefrom": "Бындæр сты æвдыст ивдтытæ '''$2'''-æй ('''{{grammar:genitive|$1}}''' йонг).",
-       "rclistfrom": "Равдисын ивдтытæ амæй фæстæ: $1",
+       "rclistfrom": "Равдисын ивдтытæ амæй фæстæ: $3 $2",
        "rcshowhideminor": "$1 чысыл ивдтытæ",
        "rcshowhidebots": "$1 роботты",
        "rcshowhideliu": "$1 регистрацигонд архайæджы",
        "watchthispage": "Цæст дарын ацы фарсмæ",
        "unwatch": "Нал дарын цæст",
        "watchlist-details": "{{PLURAL:$1|$1 фарсмæ|$1 фарсмæ}} дæ цæст дарыс, тæрхоны фæрстæ нæ нымайгæйæ.",
-       "watchlistcontains": "Дæ цæст $1 {{PLURAL:$1|фарсмæ|фарсмæ}} дарыс.",
        "wlshowlast": "Фæстæг $1 сахаты, $2 боны дæргъы; $3.",
        "watchlist-options": "Цæстдард рæгъы фадæттæ",
        "watching": "Цæстдард фæрсты номхыгъдмæ афтауын...",
        "tooltip-undo": "\"Раивын\" æздæхы ацы ивд æмæ æвдисы ивæн фарс разбакаст уавæры. Уый дын дæ бавæрдæн фсон скæныны фадат дæтты.",
        "tooltip-preferences-save": "Уаг бавæрын",
        "tooltip-summary": "Бафысс чысыл æмбарынгæнæн",
-       "notacceptable": "Ацы викийæн йæ бон нæу радтын рардтæ ахæм форматы, цæмæй цæ дæ клиент фæрса.",
        "anonymous": "{{grammar:genitive|{{SITENAME}}}} æнæном {{PLURAL:$1|архайæг|архайджытæ}}",
        "siteuser": "{{grammar:genitive|{{SITENAME}}}} архайæг $1",
        "anonuser": "{{grammar:genitive|{{SITENAME}}}} æнæном архайæг $1",
        "size-kilobytes": "$1 КБ",
        "size-megabytes": "$1 МБ",
        "size-gigabytes": "$1 ГБ",
-       "livepreview-loading": "Æвгæд цæуы...",
-       "livepreview-ready": "Æвгæд цæуы...Цæттæ!",
-       "livepreview-failed": "Тагъд разæркастæй пайда кæнæн нæй. Хуымæтæджы разæркастæй пайда кæн.",
-       "watchlistedit-noitems": "Дæ цæстдард афтид у.",
        "watchlistedit-normal-title": "Цæстдард ивæн",
        "watchlistedit-normal-submit": "Схафын фыстытæ",
        "watchlistedit-raw-titles": "Сæртæ:",
index c0c971e..3746ad8 100644 (file)
@@ -19,7 +19,8 @@
                        "VibhasKS",
                        "Xqt",
                        "Ævar Arnfjörð Bjarmason",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "ਲਿੰਕ ਹੇਠ-ਲਾਈਨ:",
@@ -32,7 +33,6 @@
        "tog-showtoolbar": "ਸੋਧ ਸੰਦਬਕਸਾ ਵੇਖੋ",
        "tog-editondblclick": "ਦੋ ਵਾਰ ਕਲਿੱਕ ਕਰਨ 'ਤੇ ਸਫ਼ੇ ਸੋਧੋ",
        "tog-editsectiononrightclick": "ਸੈਕਸ਼ਨ ਸਿਰਲੇਖਾਂ ’ਤੇ ਸੱਜੀ ਕਲਿੱਕ ਨਾਲ਼ ਸੋਧ ਚਾਲੂ ਕਰੋ (ਜਾਵਾਸਕਰਿਪਟ ਲੋੜੀਂਦੀ ਹੈ)",
-       "tog-rememberpassword": "ਇਸ ਬਰਾਊਜ਼ਰ ਉੱਤੇ ਮੇਰਾ ਦਾਖ਼ਲਾ ਯਾਦ ਰੱਖੋ (ਵੱਧ ਤੋਂ ਵੱਧ $1 {{PLURAL:$1|ਦਿਨ|ਦਿਨਾਂ}} ਲਈ)",
        "tog-watchcreations": "ਮੇਰੇ ਵਲੋਂ ਬਣਾਏ ਗਏ ਸਫ਼ੇ ਅਤੇ ਅੱਪਲੋਡ ਕੀਤੀਆਂ ਫ਼ਾਈਲਾਂ ਮੇਰੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿੱਚ ਪਾਓ",
        "tog-watchdefault": "ਮੇਰੇ ਵੱਲੋਂ ਸੋਧੇ ਗਏ ਸਫ਼ੇ ਅਤੇ ਫ਼ਾਈਲਾਂ ਮੇਰੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿੱਚ ਪਾਓ",
        "tog-watchmoves": "ਮੇਰੇ ਵੱਲੋਂ ਬਦਲੇ ਸਿਰਲੇਖਾਂ ਵਾਲ਼ੇ ਸਫ਼ੇ ਅਤੇ ਫ਼ਾਈਲਾਂ ਮੇਰੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿੱਚ ਪਾਓ",
        "readonly_lag": "ਜਦੌਂ ਤਕ ਅਧੀਨ ਡੇਟਾਬੇਸ ਸਰਵਰ ਸੁਤੰਤਰ ਡੈਟਾਬੇਸ ਸਰਵਰ ਦੀ ਪਕੜ ਵਿਚ ਨਹੀਂ ਆ ਜਾਂਦੇ ਡੈਟਾਬੇਸ ਸਵੈ ਜਕੜਿਆ ਗਿਆ ਹੈ।",
        "internalerror": "ਅੰਦਰੂਨੀ ਗ਼ਲਤੀ",
        "internalerror_info": "ਅੰਦਰੂਨੀ ਗ਼ਲਤੀ: $1",
-       "fileappenderrorread": "ਅੰਤਕਾ ਜੋੜਨ ਲਗਿਆਂ \"$1\"ਪੜ੍ਹਿਆ ਨਹੀਂ ਜਾ ਸਕਿਆ।",
-       "fileappenderror": "''$1'' ''$2'' ਨਾਲ਼ ਜੋੜਿਆ ਨਹੀ ਜਾ ਸਕਦਾ",
        "filecopyerror": "ਫ਼ਾਈਲ '''$1'' '$2''' ਵਿੱਚ ਕਾਪੀ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕੀ।",
        "filerenameerror": "ਫ਼ਾਈਲ ''$1'' ਦਾ ਨਾਂ ''$2'' ਨਹੀਂ ਸਾ ਸਕਿਆ।",
        "filedeleteerror": "''$1'' ਫ਼ਾਈਲ ਹਟਾਈ ਨਹੀਂ ਜਾ ਸਕੀ।",
        "directorycreateerror": "ਡਾਇਰੈਕਟਰੀ ''$1'' ਬਣਾਈ ਨਹੀਂ ਜਾ ਸਕੀ।",
        "filenotfound": "ਫ਼ਾਈਲ ''$1'' ਲੱਭੀ ਨਹੀਂ ਜਾ ਸਕੀ।",
-       "fileexistserror": "ਫ਼ਾਈਲ \"$1\" ਉੱਤੇ ਲਿਖ ਨਹੀਂ ਸਕਦੇ: ਫ਼ਾਈਲ ਮੌਜੂਦ ਹੈ।",
        "unexpected": "ਅਣਉਮੀਦਿਆ ਮੁੱਲ: \"$1\"=\"$2\"।",
        "formerror": "ਗ਼ਲਤੀ: ਫ਼ਾਰਮ ਪੇਸ਼ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ",
        "badarticleerror": "ਇਹ ਕਾਰਵਾਈ ਇਸ ਸਫ਼ੇ ਤੇ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ।",
        "userlogin-resetlink": "ਆਪਣੀ ਲਾਗਇਨ ਜਾਣਕਾਰੀ ਭੁੱਲ ਗਏ ਹੋ?",
        "userlogin-resetpassword-link": "ਆਪਣਾ ਪਾਸਵਰਡ ਭੁੱਲ ਗਏ ਹੋ?",
        "userlogin-createanother": "ਹੋਰ ਖਾਤਾ ਬਣਾਓ",
-       "createacct-join": "ਆਪਣੀ ਜਾਣਕਾਰੀ ਹੇਠਾਂ ਦਿਉ।",
-       "createacct-another-join": "ਆਪਣੇ ਅਕਾਊਂਟ ਦੀ ਜਾਣਕਾਰੀ ਹੇਠਾਂ ਦਿਉ।",
        "createacct-emailrequired": "ਈਮੇਲ ਪਤਾ",
        "createacct-emailoptional": "ਈਮੇਲ ਪਤਾ (ਚੋਣਵਾਂ)",
        "createacct-email-ph": "ਆਪਣਾ ਈਮੇਲ ਪਤਾ ਦਿਉ",
        "loginlanguagelabel": "ਭਾਸ਼ਾ: $1",
        "suspicious-userlogout": "ਤੁਹਾਡੀ ਵਿਦਾਇਗੀ ਦੀ ਬੇਨਤੀ ਨਕਾਰ ਦਿੱਤੀ ਗਈ ਕਿਉਂਕਿ ਲੱਗਦਾ ਹੈ ਕਿ ਇਹ ਕਿਸੇ ਟੁੱਟੇ ਹੋਏ ਬਰਾਊਜ਼ਰ ਜਾਂ ਕੈਸ਼ ਹੋਈ ਪ੍ਰਾਕਸੀ ਤੋਂ ਭੇਜੀ ਗਈ ਸੀ।",
        "createacct-another-realname-tip": "ਅਸਲੀ ਨਾਂ ਚੋਣਵਾਂ ਹੈ।\nਜੇਕਰ ਤੁਸੀਂ ਇਹ ਦਿੱਤਾ ਹੈ ਤਾਂ ਤੁਹਾਡੇ ਕੰਮ ਵਾਸਤੇ ਗੁਣ ਦੇ ਤੌਰ ਉੱਤੇ ਵਰਤਿਆ ਜਾਵੇਗਾ।",
+       "pt-login": "ਲਾਗ ਇਨ",
        "pt-login-button": "ਲਾਗ ਇਨ",
+       "pt-createaccount": "ਖਾਤਾ ਬਣਾਓ",
+       "pt-userlogout": "ਲਾਗ ਆਉਟ",
        "php-mail-error-unknown": "PHP ਦੇ ਮੇਲ() ਕਰਜ ਵਿੱਚ ਅਣਜਾਣ ਦੋਸ਼",
        "user-mail-no-addy": "ਬਿਨਾਂ ਈ-ਮੇਲ ਪਤਾ ਦਿੱਤੇ ਈ-ਮੇਲ ਭੇਜਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ।",
        "user-mail-no-body": "ਖ਼ਾਲੀ ਜਾਂ ਬਹੁਤੀ ਛੋਟੀ ਸਮੱਗਰੀ ਨਾਲ਼ ਈਮੇਲ ਭੇਜਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ ਗਈ",
        "savearticle": "ਸਫ਼ਾ ਸੰਭਾਲੋ",
        "preview": "ਝਲਕ",
        "showpreview": "ਝਲਕ ਵਿਖਾਓ",
-       "showlivepreview": "ਲਾਈਵ ਝਲਕ",
        "showdiff": "ਤਬਦੀਲੀਆਂ ਵਖਾਓ",
        "anoneditwarning": "'''ਖ਼ਬਰਦਾਰ:''' ਤੁਸੀਂ ਲਾਗਇਨ ਨਹੀਂ ਕੀਤਾ ਹੋਇਆ। ਤੁਹਾਡਾ IP ਪਤਾ ਇਸ ਸਫ਼ੇ ਦੇ ਅਤੀਤ ਵਿੱਚ ਰਿਕਾਰਡ ਕੀਤਾ ਜਾਵੇਗਾ।",
        "anonpreviewwarning": "''ਤੁਸੀਂ ਲਾਗਇਨ ਨਹੀਂ ਕੀਤਾ ਹੋਇਆ। ਤਬਦੀਲੀ ਸਾਂਭਣ ਨਾਲ਼ ਤੁਹਾਡਾ IP ਪਤਾ ਸਫ਼ੇ ਦੇ ਸੋਧ ਅਤੀਤ ਵਿਚ ਰਿਕਾਰਡ ਹੋ ਜਾਵੇਗਾ।''",
        "edit-gone-missing": "ਇਹ ਸਫ਼ਾ ਅੱਪਡੇਟ ਨਹੀਂ ਹੋ ਸਕਿਆ।\nਜਾਪਦਾ ਹੈ ਕਿ ਇਹ ਹਟਾਇਆ ਜਾ ਚੁੱਕਾ ਹੈ।",
        "edit-conflict": "ਸੋਧ ਤਕਰਾਰ",
        "edit-no-change": "ਤੁਹਾਡੀ ਸੋਧ ਨਜ਼ਰਅੰਦਾਜ਼ ਕਰ ਦਿੱਤੀ ਗਈ ਹੈ ਕਿਉਂਕਿ ਲਿਖਤ ਵਿਚ ਕੋਈ ਤਬਦੀਲੀ ਨਹੀਂ ਕੀਤੀ ਗਈ।",
-       "postedit-confirmation": "ਤੁਹਾਡੀ ਸੋਧ ਸਾਂਭੀ ਗਈ ਹੈ।",
+       "postedit-confirmation-saved": "ਤੁਹਾਡੀ ਸੋਧ ਸਾਂਭੀ ਗਈ ਹੈ।",
        "edit-already-exists": "ਨਵਾਂ ਸਫ਼ਾ ਨਹੀਂ ਬਣਾਇਆ ਜਾ ਸਕਿਆ।\nਇਹ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ।",
        "defaultmessagetext": "ਮੂਲ ਸੰਦੇਸ਼ ਲਿਖਤ",
        "invalid-content-data": "ਗ਼ਲਤ ਸਮੱਗਰੀ",
        "search-nonefound": "ਤੁਹਾਡੀ ਖੋਜ ਨਾਲ ਮੇਲ ਖਾਂਦੇ ਕੋਈ ਨਤੀਜੇ ਨਹੀਂ ਮਿਲੇ।",
        "powersearch-legend": "ਤਕਨੀਕੀ ਖੋਜ",
        "powersearch-ns": "ਨੇਮ-ਸਪੇਸ ਵਿੱਚ ਖੋਜ:",
-       "powersearch-redir": "ਰੀ-ਡਿਰੈਕਟ ਸੂਚੀਬੱਧ ਕਰੋ",
        "powersearch-togglelabel": "ਜਾਂਚੋ:",
        "powersearch-toggleall": "ਸਭ",
        "powersearch-togglenone": "ਕੋਈ ਨਹੀਂ",
        "prefs-advancedsearchoptions": "ਤਕਨੀਕੀ ਚੋਣਾਂ",
        "prefs-advancedwatchlist": "ਤਕਨੀਕੀ ਚੋਣਾਂ",
        "prefs-displayrc": "ਵੇਖਾਉਣ ਚੋਣਾਂ",
-       "prefs-displaysearchoptions": "ਵੇਖਾਉਣ ਚੋਣਾਂ",
        "prefs-displaywatchlist": "ਵੇਖਾਉਣ ਚੋਣਾਂ",
        "prefs-tokenwatchlist": "ਟੋਕਨ",
        "prefs-diffs": "ਫ਼ਰਕ",
        "recentchanges-legend-newpage": "$1 - ਨਵਾਂ ਸਫ਼ਾ",
        "recentchanges-legend-plusminus": "(''±੧੨੩'')",
        "rcnotefrom": "'''$2''' ਤੱਕ ('''$1''' ਤੱਕ ਦਿੱਸਦੇ) ਬਦਲਾਵ ਹੇਠ ਦਿੱਤੀਆਂ ਹਨ।",
-       "rclistfrom": "$1 ਤੋਂ ਸ਼ੁਰੂ ਕਰਕੇ ਨਵੀਆਂ ਸੋਧਾਂ ਵਖਾਓ",
+       "rclistfrom": "$3 $2 ਤੋਂ ਸ਼ੁਰੂ ਕਰਕੇ ਨਵੀਆਂ ਸੋਧਾਂ ਵਖਾਓ",
        "rcshowhideminor": "ਛੋਟੀਆਂ ਤਬਦੀਲੀਆਂ $1",
        "rcshowhidebots": "$1 ਬੌਟ",
        "rcshowhideliu": "$1 ਦਾਖ਼ਲ ਹੋਏ ਵਰਤੋਂਕਾਰ",
        "notanarticle": "ਕੋਈ ਸਮੱਗਰੀ ਸਫ਼ਾ ਨਹੀਂ ਹੈ",
        "notvisiblerev": "ਇੱਕ ਵੱਖਰੇ ਮੈਂਬਰ ਦੀ ਬਣਾਈ ਆਖ਼ਰੀ ਰੀਵਿਜ਼ਨ ਮਿਟਾਈ ਜਾ ਚੁੱਕੀ ਹੈ",
        "watchlist-details": "ਗੱਲ-ਬਾਤ ਸਫ਼ੇ ਨਾ ਗਿਣਦੇ ਹੋਏ, ਤੁਹਾਡੀ ਨਿਗਰਾਨੀ-ਸੂਚੀ ਵਿਚ{{PLURAL:$1|$1 ਸਫ਼ਾ ਹੈ|$1 ਸਫ਼ੇ ਹਨ}}।",
-       "watchlistcontains": "ਤੁਹਾਡੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚ $1 {{PLURAL:$1|ਸਫ਼ਾ ਹੈ|ਸਫ਼ੇ ਹਨ}}।",
        "wlshowlast": "ਪਿਛਲੇ $1 ਘੰਟੇ $2 ਦਿਨ $3 ਵਖਾਓ",
        "watchlist-options": "ਨਿਗਰਾਨੀ-ਲਿਸਟ ਦੀਆਂ ਚੋਣਾਂ",
        "watching": "ਨਿਗ੍ਹਾ (ਵਾਚ) ਰੱਖੀ ਜਾ ਰਹੀ ਹੈ...",
        "unblock": "ਵਰਤੋਂਕਾਰ 'ਤੇ ਲੱਗੀ ਪਾਬੰਦੀ ਹਟਾਓ",
        "blockip": "ਵਰਤੋਂਕਾਰ ’ਤੇ ਪਾਬੰਦੀ ਲਾਓ",
        "blockip-legend": "ਵਰਤੋਂਕਾਰ 'ਤੇ ਪਾਬੰਦੀ ਲਾਓ",
-       "ipadressorusername": "IP ਐਡਰੈਸ ਜਾਂ ਯੂਜ਼ਰ ਨਾਂ:",
+       "ipaddressorusername": "IP ਐਡਰੈਸ ਜਾਂ ਯੂਜ਼ਰ ਨਾਂ:",
        "ipbexpiry": "ਮਿਆਦ:",
        "ipbreason": "ਕਾਰਨ:",
        "ipbcreateaccount": "ਖਾਤਾ ਬਣਾਉਣ 'ਤੇ ਰੋਕ ਲਾਓ",
        "table_pager_empty": "ਕੋਈ ਨਤੀਜਾ ਨਹੀਂ",
        "autosumm-blank": "ਸਫ਼ੇ ਨੂੰ ਖ਼ਾਲੀ ਕੀਤਾ",
        "autosumm-new": "\"$1\" ਨਾਲ਼ ਸਫ਼ਾ ਬਣਾਇਆ",
-       "livepreview-loading": "ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ...",
-       "livepreview-ready": "ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ... ਤਿਆਰ!",
-       "livepreview-failed": "ਲਾਈਵ ਝਲਕ ਫੇਲ੍ਹ ਹੋਈ!\nਸਧਾਰਨ ਝਲਕ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ।",
-       "watchlistedit-numitems": "ਗੱਲ-ਬਾਤ ਸਫ਼ਿਆਂ ਤੋਂ ਬਿਨਾਂ, ਤੁਹਾਡੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿੱਚ {{PLURAL:$1|1 ਸਿਰਲੇਖ ਹੈ|$1 ਸਿਰਲੇਖ ਹਨ}}।",
-       "watchlistedit-noitems": "ਤੁਹਾਡੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿੱਚ ਕੋਈ ਸਿਰਲੇਖ ਨਹੀਂ ਹਨ।",
        "watchlistedit-normal-title": "ਨਿਗਰਾਨੀ-ਲਿਸਟ ਸੋਧੋ",
        "watchlistedit-normal-legend": "ਸਿਰਲੇਖਾਂ ਨੂੰ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿੱਚੋਂ ਹਟਾਓ",
        "watchlistedit-normal-submit": "ਸਿਰਲੇਖ ਹਟਾਓ",
        "compare-invalid-title": "ਤੁਹਾਡੇ ਵੱਲੋਂ ਦਿੱਤਾ ਗਿਆ ਸਿਰਲੇਖ ਗ਼ਲਤ ਹੈ।",
        "compare-title-not-exists": "ਦਿੱਤਾ ਗਿਆ ਸਿਰਲੇਖ ਮੌਜੁਦ ਨਹੀਂ ਹੈ।",
        "compare-revision-not-exists": "ਦਿੱਤੀ ਗਈ ਰਿਵੀਜਨ ਮੌਜੂਦ ਨਹੀਂ ਹੈ।",
-       "dberr-header": "ਇਸ ਵਿਕੀ ਵਿਚ ਔਕੜ ਹੈ",
        "dberr-problems": "ਅਫ਼ਸੋਸ! ਇਸ ਸਾਈਟ 'ਤੇ ਕੁਝ ਤਕਨੀਕੀ ਔਕੜਾਂ ਆ ਰਹੀਆਂ ਹਨ।",
        "dberr-again": "ਕੁਝ ਮਿੰਟਾਂ ਲਈ ਉਡੀਕ ਕਰਨ ਅਤੇ ਮੁੜ ਲੋਡ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ",
        "dberr-usegoogle": "ਉਨੀ ਦੇਰ ਤੱਕ ਤੁਸੀਂ ਗੂਗਲ ਰਾਹੀਂ ਲੱਭਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰ ਸਕਦੇ ਹੋ।",
index 6d8a599..9b49369 100644 (file)
@@ -5,7 +5,8 @@
                        "Kaganer",
                        "Katimawan2005",
                        "Urhixidur",
-                       "Val2397"
+                       "Val2397",
+                       "아라"
                ]
        },
        "tog-underline": "Gulisan lang panglalam deng suglung:",
@@ -18,7 +19,6 @@
        "tog-showtoolbar": "Ipakit ya panaliling toolbar (JavaScript)",
        "tog-editondblclick": "Alilan la reng bulung kapamilatan ning makataduang pamagpindut (JavaScript)",
        "tog-editsectiononrightclick": "Paganan ya ing pamag-edit seksiyon (section editing) kapamilata'ning pamag right click kareng pamagat da reng seksiyon (JavaScript)",
-       "tog-rememberpassword": "↓Tandanan ya ing kanakung login keng computer a ini (for a maximum of $1 {{PLURAL:$1|day|days}})",
        "tog-watchcreations": "Idagdag la deng bulung a lelengan ku kareng babanten",
        "tog-watchdefault": "Idagdag la reng bulung a inalilan ku kareng babanten",
        "tog-watchmoves": "Idagdag la reng bulung a inalis ku kareng babanten",
        "filedeleteerror": "E ne abura ing file a  \"$1\".",
        "directorycreateerror": "E ne agawa ing directory \"$1\".",
        "filenotfound": "E ne apaintun ing simpan a \"$1\".",
-       "fileexistserror": "E makasulat king simpan a \"$1\": ating simpan a anti kaniti",
        "unexpected": "Epi-adian a alaga: \"$1\"=\"$2\".",
        "formerror": "Kamalian:eya mipalub ing misulat",
        "badarticleerror": "Ing pamipamuk e malyaring daptan kening bulung a ini.",
        "savearticle": "Isikap ya ing bulung",
        "preview": "↓Ipasinag",
        "showpreview": "Pakit ya ing pasinag",
-       "showlivepreview": "Kasalungsungan (live) a preview",
        "showdiff": "Pakit la reng miyalilan",
        "anoneditwarning": "'''Kapiadian:''' Eka maka-login.  Mitala ya ing kekang IP address king amlat pamanalili (edit history) ning bulung a ini.",
        "missingsummary": "'''Kapabaluan:''' Ala kang binieng sampulung (summary) da reng me-edit.\nNung i-click meng pasibayu ing Save, ma-save ya ing kekang in-edit a alang anti kaniti.",
        "showingresultsnum": "Ing/ding {{PLURAL:$3|'''1''' a resulta|'''$3''' resulta}} manibatan king #'''$2'''.",
        "powersearch-legend": "Espesial a pamanintun",
        "powersearch-ns": "Maintun ka kareng namespace:",
-       "powersearch-redir": "Ilista la reng redirect (pamanaliling direccion).",
        "search-external": "Pamanintun king kilual",
        "searchdisabled": "Makapatda/e gagana ing pamanintun king {{SITENAME}}.\nSamantala, maliari kang maintun kapamilatan ning Google.\nPakitandanan mung maliaring e no makapanaun deng karelang index king kalamnan ning {{SITENAME}}.",
        "preferences": "Pinili",
        "recentchanges-summary": "Talukyan mo reng tawling diling mengayalilan king bulung a ini.",
        "recentchanges-feed-description": "Talukian mo reng bayung diling mengayalili king wiki king feed a ini.",
        "rcnotefrom": "Atilu king lalam deng miyalilan manibat anyang <b>$2</b> (angga king <b>$1</b> makalto).",
-       "rclistfrom": "Pakit la reng bayung miyalilan manibat anyang $1",
+       "rclistfrom": "Pakit la reng bayung miyalilan manibat anyang $3 $2",
        "rcshowhideminor": "$1 malating edit",
        "rcshowhidebots": "$1 la reng bot",
        "rcshowhideliu": "$1 talagamit a maka-log in",
        "watchlist-details": "{{PLURAL:$1|$1 bulung|$1 bulung}} king kekang watchlist, e la kayabe deng ''talk pages''.",
        "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.",
-       "watchmethod-recent": "sisimen/susurian la reng bayung mengayalili para kareng bulung a babanten",
-       "watchmethod-list": "susurian la reng bulung a babanten para kareng bayung mengayalili",
-       "watchlistcontains": "Atin yang $1 {{PLURAL:$1|a bulung|bulung}} ing kekang tala ring babanten (watchlist).",
-       "iteminvalidname": "Maki prublema king '$1', e maliari ing lagyu...",
        "wlshowlast": "Pakit la reng tauling $1 oras $2 aldo $3",
        "watchlist-options": "Deng maliaring gawan kareng listaan da reng babanten (''watchlist'')",
        "watching": "Babanten...",
        "enotif_lastvisited": "Lon me ing $1 para kareng eganaganang miyalilan\nmanibat anyang tawli kang linabas.",
        "enotif_lastdiff": "Lon me ing $1 ba meng akit ining miyalilan.",
        "enotif_anon_editor": "talagamit a e migpakilala $1",
-       "enotif_body": "Kakaluguran kung $WATCHINGUSERNAME,\n\n\nIning bulung a {{SITENAME}} a maki bansag a $PAGETITLE me$CHANGEDORCREATED ya aniang $PAGEEDITDATE kapamilata'nang $PAGEEDITOR. Lon me ing $PAGETITLE_URL para king salukuyan a bersion.\n\n$NEWPAGE\n\nSampulung ning talapatuntun (Editor's summary): $PAGESUMMARY $PAGEMINOREDIT\n\nSulatanan ya ing talapatuntun:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nAlang aliwang kapabaluan nung ating karagdagang mibayu, puera namu nung puntalan me ing bulung a ini.\nMaliari mo muring isubli king sadia (reset) deng markang pamipabalu (notification flag) karen ngang bulung a babanten mu king kekang tala ring babanten (watchlist).\n\n             Ing talabie kapabaluan ning {{SITENAME}} a magmalasakit keka\n--\nBa mong ayalilan deng pakatuldu king kekang tala ring babanten (watchlist settings), munta ka king\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nKeni ka magparalang puna/komentu at maniad karagdagang saup:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Kakaluguran kung $WATCHINGUSERNAME,\n\n\nIning bulung a {{SITENAME}} a maki bansag a $PAGETITLE me$CHANGEDORCREATED ya aniang $PAGEEDITDATE kapamilata'nang $PAGEEDITOR. Lon me ing $PAGETITLE_URL para king salukuyan a bersion.\n\n$NEWPAGE\n\nSampulung ning talapatuntun (Editor's summary): $PAGESUMMARY $PAGEMINOREDIT\n\nSulatanan ya ing talapatuntun:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nAlang aliwang kapabaluan nung ating karagdagang mibayu, puera namu nung puntalan me ing bulung a ini.\nMaliari mo muring isubli king sadia (reset) deng markang pamipabalu (notification flag) karen ngang bulung a babanten mu king kekang tala ring babanten (watchlist).\n\n             Ing talabie kapabaluan ning {{SITENAME}} a magmalasakit keka\n--\nBa mong ayalilan deng pakatuldu king kekang tala ring babanten (watchlist settings), munta ka king\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nKeni ka magparalang puna/komentu at maniad karagdagang saup:\n$HELPPAGE",
        "created": "melalang",
        "changed": "miyalilan",
        "deletepage": "Buran ya ing bulung",
        "blockip": "Sabatan ya ing talagamit",
        "blockip-legend": "Sabatan ya ing talagamit",
        "blockiptext": "Gamitan me ing form king lalam ba yang sabatan king pamaglub\ning particular a IP address o lagyu ning talagamit (username).\nMalyari mung gawan iti bang milisya king pamanyira (vandalism),\nat agpang king [[{{MediaWiki:Policy-url}}|patakaran]].\nIsulat me ing particular a sangkan king lalam (alimbawa, sabyan\nmu nung sanu retang bulung a sinira da).",
-       "ipadressorusername": "IP Address o lagyungtalagamit (username):",
+       "ipaddressorusername": "IP Address o lagyungtalagamit (username):",
        "ipbexpiry": "Mayari:",
        "ipbreason": "Sangkan:",
        "ipbreason-dropdown": "*Keraklan a sangkan king pamaniabat\n** Mangibiling e tutung impormasiun\n** Maglakong laman kareng bulung\n** Maniuglung spam\n** Manyingit alang kabaldugan a sulat o e dapat misulat kareng bulung\n** Mamatakut o maniaul\n** Mamabusu kareng dakal a account\n** E katanggap-tanggap a lagyungtalagamit (username)",
        "common.css": "/** CSS mikabit keni maging mabisa ya karing eganaganang pabalat */",
        "monobook.css": "/* CSS a mikabit keni miapectuan la reng gagamit king Monobook a pabalat */",
        "common.js": "/* Agiang nanung JavaScript a atiu keni misampa la kareng eganaganang gagamit balang misampang bulung. */",
-       "notacceptable": "E makapamieng data king ayus (format) a abasa ning kekang client ing wiki server.",
        "anonymous": "Ing/Deng gagamit king {{SITENAME}} a e pepakilala.",
        "siteuser": "talagamit ning {{SITENAME}} $1",
        "lastmodifiedatby": "Ining bulung tauli neng elilan $3 aniang $2, $1.",
        "newimages": "Pirinan kareng bayung simpan (new files)",
        "imagelisttext": "Ing makatuki tala yang '''$1''' {{PLURAL:$1|simpan|simpan}} a misamasan $2.",
        "newimages-summary": "Ining bulung a makabukud papakit no reng simpan (file) a tauling milulan.",
-       "showhidebots": "($1 bot)",
        "noimages": "Ala kang akit.",
        "ilsubmit": "Manintun",
        "bydate": "agpang keng aldo",
        "autosumm-replace": "Ing '$1' alilan ne ing bulung",
        "autoredircomment": "Lilipat ya king [[$1]]",
        "autosumm-new": "Bayung bulung: $1",
-       "livepreview-loading": "Máglulan…",
-       "livepreview-ready": "Máglulan… Makasadia ne!",
        "lag-warn-normal": "Mapalyaring e la lunto king listaan a ini deng miyalilan a mas bayu king $1 segundu",
-       "watchlistedit-noitems": "Ala yang bansag ing kekang tala ring babanten (watchlist).",
        "watchlistedit-normal-title": "I-edit ya ing tala ring babanten (watchlist)",
        "watchlistedit-normal-legend": "Ilako la reng bansag king tala ring babanten (watchlist)",
        "watchlistedit-normal-submit": "Ilako la reng bansag",
index 7f2d560..31f6ecb 100644 (file)
@@ -2,7 +2,8 @@
        "@metadata": {
                "authors": [
                        "Geoleplubo",
-                       "Hercule"
+                       "Hercule",
+                       "아라"
                ]
        },
        "tog-underline": "Loïens soulinés:",
@@ -14,7 +15,6 @@
        "tog-showtoolbar": "Afiquer chés otis pou l'édichon (i feut JavaScript)",
        "tog-editondblclick": "Éditer ches paches aveuc un doube buke (i feut JavaScript)",
        "tog-editsectiononrightclick": "Pérmet l'édichion del sekchion par un droé buke su ch'tite del sekchion (i feut JavaScript)",
-       "tog-rememberpassword": "Warder min lodjine su chl'ordinateu-lo (pour un maximum éd $1 {{PLURAL:$1|jour|jours}})",
        "tog-watchcreations": "Ajouter chés paches qu'éj crée et pi chés fichiés qu'éj téléquertche édseur em lisse à suire",
        "tog-watchdefault": "Ajouter chés paches pi chés fichiés qu'éj cange édseur em lisse à suire.",
        "tog-watchmoves": "Ajouter chés paches pi chés fichiés qu'éj déplache édseur m'lisse à suire.",
        "filedeleteerror": "Éj pux poin défacer ch'fichié \"$1\".",
        "directorycreateerror": "Éj pux poin créer ch'répértoère \"$1\".",
        "filenotfound": "Éj pux poin trouvoér ch'fichié \"$1\".",
-       "fileexistserror": "Éj pux poin écrire su ch'fichié \"$1\": ech fichié écsiste",
        "unexpected": "Valeur poin prévue: \"$1\"=\"$2\".",
        "badarticleerror": "Os n'povez poin foaire cha su l'pache-lo.",
        "badtitle": "Méchant tite",
        "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:",
-       "powersearch-redir": "Lisse d'chés érdirécchons",
        "preferences": "Préférinches",
        "mypreferences": "Mes préférinches",
        "timezoneregion-europe": "Urope",
        "recentchanges-label-bot": "Chol modificacion ale o té foaite pèr un robot.",
        "recentchanges-label-unpatrolled": "Chol modificacion ale n’o poin coèr té controlée.",
        "rcnotefrom": "Vlo chés modificacions foaites édpuis l' '''$2''' (dousqu'à '''$1''' au plus).",
-       "rclistfrom": "Montrer chés nouvieus cangemints d'puis $1",
+       "rclistfrom": "Montrer chés nouvieus cangemints d'puis $3 $2",
        "rcshowhideminor": "$1 tiotes éditions",
        "rcshowhidebots": "$1 bots",
        "rcshowhideliu": "$1 lodjés uzeus",
        "compare-rev1": "Canjemint 1",
        "compare-rev2": "Canjemint 2",
        "compare-submit": "Aconparer",
-       "dberr-header": "Ech wiki-lo il o dés problémes",
        "htmlform-reset": "n'poin foaire chés canjemints"
 }
index d1e3b9a..9f15208 100644 (file)
        "search-interwiki-more": "(weidere)",
        "searchall": "all",
        "powersearch-ns": "Guck uff in Blatznaame:",
-       "powersearch-redir": "Lischt vun Weiterleidinge",
        "powersearch-toggleall": "All",
        "powersearch-togglenone": "Ken",
        "search-external": "Guck im Gewebb",
        "unwatchthispage": "Nimmi watsche",
        "notanarticle": "Ken Blatt",
        "watchlist-details": "{{PLURAL:$1|$1 Blatt|$1 Bledder}} uff dei Watch-Lischt, ohne Gschwetz-Bledder",
-       "watchlistcontains": "Dei Watsch-Lischt hot $1 {{PLURAL:$1|Blatt|Bledder}}.",
        "wlshowlast": "Zeig die Enneringe vun de letscht $1 Schtund, $2 Daag odder $3.",
        "watching": "Watsche…",
        "unwatching": "Nimmi watsche...",
        "table_pager_limit_submit": "Geh los",
        "autosumm-blank": "Des Blatt iss leer gmacht worre.",
        "autosumm-new": "Des Blatt is gschtaert warre: „$1“",
-       "livepreview-loading": "Laade…",
        "watchlistedit-normal-title": "Watsch-Lischt ennere",
        "version": "Version",
        "version-specialpages": "Besunnere Bledder",
index acad21d..4a7cb6d 100644 (file)
@@ -6,18 +6,19 @@
                        "M-sch",
                        "Manuae",
                        "SPS",
-                       "Xqt"
+                       "Xqt",
+                       "아라"
                ]
        },
        "tog-underline": "Lingg unnaschdraische",
        "tog-hideminor": "Vaschdegg klääne Bearwaidunge",
        "tog-hidepatrolled": "Vaschdegg gsischdede Ännarunge",
        "tog-extendwatchlist": "Zaisch alle Ännarunge unn ned nur die ledschde",
-       "tog-showtoolbar": "Wergzaisch fas Beawaide zaische (dodezu brauchd's JavaScript)",
+       "tog-showtoolbar": "Wergzaisch fas Schaffe zaische",
        "tog-previewontop": "Vorbligg owwahalwb vum Beaawaidungsfenschda zaische",
        "tog-previewonfirst": "Zaischen Vorbligg baim erschdemol Schaffe",
-       "tog-oldsig": "Voahonneni Unnaschfrid",
-       "tog-uselivepreview": "Uuvazeschada Vorbligg (bneedischd JavaScript) (vasugswais)",
+       "tog-oldsig": "Voahonneni Unnaschrifd",
+       "tog-uselivepreview": "Uuvazeschada Vorbligg (vasugswais)",
        "tog-showhiddencats": "Zaisch vaschdeglde Grubbe",
        "underline-always": "Imma",
        "underline-never": "Gaaned",
        "oct": "Ogd",
        "nov": "Nov",
        "dec": "Dez",
+       "january-date": "$1. Janua",
+       "february-date": "$1. Februa",
+       "march-date": "$1. Meaz",
+       "april-date": "$1. Abril",
+       "may-date": "$1. Mai",
+       "june-date": "$1. Juni",
+       "august-date": "$1. Auguschd",
+       "september-date": "$1. Sebdemba",
+       "october-date": "$1. Ogdowa",
+       "november-date": "$1. Nowemba",
+       "december-date": "$1. Dezemba",
        "pagecategories": "{{PLURAL:$1|Sachgrubb|Sachgrubbe}}",
        "category_header": "Saide inde Sachgrubb „$1“",
        "subcategories": "Unnagrubbe",
        "navigation": "Nawigadzion",
        "and": "&#32;unn",
        "qbfind": "Finne",
-       "qbbrowse": "Duaschschdewere",
-       "qbedit": "Beawaide",
+       "qbbrowse": "Schdewere",
+       "qbedit": "Schaffe",
        "qbpageoptions": "Die Said",
        "qbmyoptions": "Moi Saide",
        "faq": "Ofd gschdeldi Froche",
        "vector-action-protect": "Schidze",
        "vector-action-undelete": "Zriggbringe",
        "vector-view-create": "Õleesche",
-       "vector-view-edit": "Beawaide",
+       "vector-view-edit": "Drõ schaffe",
        "vector-view-history": "Dadaigschischd",
        "vector-view-view": "Lese",
        "vector-view-viewsource": "Gwelltegschd zaische",
        "permalink": "Schdendischa Lingg",
        "print": "Drugge",
        "view": "Ogugge",
-       "edit": "Beawaide",
+       "edit": "Schaffe",
+       "edit-local": "Gugg uff $1",
        "create": "Õleesche",
-       "editthispage": "Die Said beawaide",
+       "editthispage": "Onde Said schaffe",
        "create-this-page": "Mach die Said",
        "delete": "Lesche",
        "deletethispage": "Lesch die Said",
+       "undeletethispage": "Said widdaheaschdelle",
        "undelete_short": "{{PLURAL:$1|ä Ännarung|$1 Ännarunge}} widdaheaschdelle",
        "viewdeleted_short": "Zaisch {{PLURAL:$1|ä gleschdi Ännarung|$1 gleschde Ännarunge}}",
        "protect": "schidze",
        "redirectedfrom": "(Nochgschiggd worre vun $1)",
        "redirectpagesub": "Nochschigg-Said",
        "lastmodifiedat": "Die Said ischs ledschde Mol gännad worre õm $1, õm $2.",
-       "viewcount": "Die Said isch bis jedz {{PLURAL:$1|$1|$1}} mol uffgrufe worre.",
+       "viewcount": "Die Said isch bis jedz {{PLURAL:$1|ämol1|$1 mol}} uffgrufe worre.",
        "protectedpage": "Said schidze",
        "jumpto": "Hubs uff:",
        "jumptonavigation": "Nawigadzion",
        "pool-errorunknown": "Ubkonnde Irrdumm",
        "aboutsite": "Iwwa {{SITENAME}}",
        "aboutpage": "Project:Iwwa",
-       "copyright": "Was do drin schded isch unna $1 vafieschba.",
+       "copyright": "Was do drin schded isch unna $1 vafieschba, wonn nedd onnaschda vameagd.",
        "copyrightpage": "{{ns:project}}:Urhewareschd",
        "currentevents": "Aggduelli Gscheniss",
        "currentevents-url": "Project: Leschdi Gschneniss",
        "disclaimers": "Hafdungsausschluß",
        "disclaimerpage": "Project:Impressum",
-       "edithelp": "Unaschdizung fas Beawaide",
+       "edithelp": "Unaschdizung fas Schaffe",
        "mainpage": "Schdadsaid",
        "mainpage-description": "Schdadsaid",
        "policy-url": "Project:Grundsedz",
        "ok": "Alla gud",
        "retrievedfrom": "Vun \"$1\"",
        "youhavenewmessages": "Du hoschd $1 ($2).",
-       "newmessagesdifflinkplural": "ledschdi {{PLURAL:$1|Ännarung|Ännarunge}}",
+       "newmessagesdifflinkplural": "ledschdi {{PLURAL:$1|Ännarung|999=Ännarunge}}",
        "youhavenewmessagesmulti": "Do hoschd ä Nochrischd grischd: $1",
-       "editsection": "beawaide",
-       "editold": "beawaide",
+       "editsection": "schaffe",
+       "editold": "schaffe",
        "viewsourceold": "Gwelltegschd õgugge",
-       "editlink": "beawaide",
+       "editlink": "schaffe",
        "viewsourcelink": "Gwell õgugge",
        "editsectionhint": "Deel ännare: $1",
        "toc": "Inhald",
        "nosuchspecialpage": "Schbezialsaid hodds nedd",
        "error": "Irrdumm",
        "databaseerror": "Daadebongg-Irrdumm",
+       "databaseerror-error": "Fehla: $1",
+       "laggedslavemode": "<strong>Baßma uff:</strong> Die Said hodd viellaischd die ledschde Ännarunge nedd.",
        "readonly": "Daadebongg blogiead",
        "missing-article": "De Tegschd fa „$1“ $2 isch inde Daadebongg nedd gfunne worre.\n\nNoamalawees heeßd des, dass die Said gleschd worre isch.\n\nWonnse des awwa nedd isch, hoschd villaischdn Irdumm inde Daadebongg gfunne.\nBidde meldsm [[Special:ListUsers/sysop|Adminischdrador]], un gebbde URL dzu õ.",
        "missingarticle-rev": "(Ausgawenumma#: $1)",
        "missingarticle-diff": "(Unnaschied: $1, $2)",
        "internalerror": "Inderna Irrdumm",
        "internalerror_info": "Inderna Irrdumm: $1",
-       "fileappenderrorread": "Beim dzugiesche hoddma „$1“ nedd lese kenne.",
-       "fileappenderror": "\"$1\" hoddma nedd zu \"$2\" dzugiesche kenne.",
        "filecopyerror": "\"$1\" hoddma nedd zu \"$2\" kobiere kenne.",
        "filerenameerror": "Die Said \"$1\" hoddma nedd uff \"$2\" umbenenne kenne.",
        "filedeleteerror": "\"$1\" hoddma nedd lesche kenne.",
        "directorycreateerror": "S'Vazaischnis \"$1\" hoddma nedd mache kenne.",
        "filenotfound": "\"$1\" hoddma nedd finne kenne.",
-       "fileexistserror": "\"$1\" hodds schun: do hoddma nix schraiwe kenne.",
        "unexpected": "Uueawadeda Wead: \"$1\"=\"$2\".",
        "formerror": "Irrdumm: hoddma nedd mache kenne.",
        "badarticleerror": "Des geed nedd uffde Said.",
        "virus-unknownscanner": "Uubekonnda Viresucha:",
        "welcomeuser": "Willkumme, $1!",
        "yourname": "Middawaidanõme:",
+       "userlogin-yourname": "Middawaida",
+       "userlogin-yourname-ph": "Gebb doin Nome oi",
+       "createacct-another-username-ph": "Middawaida",
        "yourpassword": "Kennword:",
+       "userlogin-yourpassword": "Password",
+       "userlogin-yourpassword-ph": "Gebb doi Password oi",
+       "createacct-yourpassword-ph": "Gebbä Password oi",
        "yourpasswordagain": "Kennword nomol oigewe:",
+       "createacct-yourpasswordagain": "Password bschdedische",
+       "createacct-yourpasswordagain-ph": "Bschdedisch doi Password",
        "remembermypassword": "Moi Kennword uffm Brausa merge (hegschdns fa $1 {{PLURAL:$1|Daach|Daach}})",
        "login": "Õmelde",
        "nav-login-createaccount": "Õmelde / Kondo õleesche",
        "userloginnocreate": "Oilogge",
        "logout": "Uffhere",
        "userlogout": "Uffhere",
+       "userlogin-noaccount": "Hoschd kä Kondo?",
        "nologin": "Hoschd noch kä Kondo? $1",
        "nologinlink": "E Kondo õleesche",
        "createaccount": "Kondo õleesche",
        "savearticle": "Said schbaischere",
        "preview": "Voaschau",
        "showpreview": "Voaschau zaische",
-       "showlivepreview": "Live-Voaschau",
        "showdiff": "Ännarunge zaische",
        "anoneditwarning": "'''Baßma uff:''' Du bischd ned õgemeld. Doi IP-Adress werd inde Gschischd vum Adiggl gschbaischad.",
        "summary-preview": "Iwwabligg:",
        "updated": "(Gännad)",
        "note": "'''Hiwes:'''",
        "previewnote": "'''Deng'g drõõ, dasses nua e Vorschau isch.'''\nDoi Ännarunge sinn noch nedd gschbaischadd worre!",
-       "editing": "Õm $1 beawaide",
+       "editing": "Õm $1 schaffe",
        "creating": "Magsch $1",
-       "editingsection": "$1 beawaide (de Deel)",
-       "editingcomment": "$1 beawaide (de Deel)",
+       "editingsection": "$1 schaffe (Deel)",
+       "editingcomment": "$1 schaffe (Deel)",
        "editconflict": "Schdraid ums Ännare: $1",
        "yourtext": "Doin Tegschd",
        "storedversion": "Gschbaischerdi Version",
        "revdelete-show-file-submit": "Ja",
        "revdelete-hide-image": "Vaschdegglde Inhald",
        "revdelete-hide-name": "Vaschdeggls",
-       "revdelete-hide-comment": "Vaschdeggls Resimee",
-       "revdelete-hide-user": "Vaschdeggl Middawaidanome/IP",
+       "revdelete-hide-comment": "Ännas Resimee",
+       "revdelete-hide-user": "Middawaidanome/IP-Address",
        "revdelete-radio-same": "(dudo nix ännare)",
-       "revdelete-radio-set": "Ja",
-       "revdelete-radio-unset": "",
+       "revdelete-radio-set": "Vaschdegld",
+       "revdelete-radio-unset": "Sischdba",
        "revdelete-log": "Grund:",
        "revdelete-submit": "Uff die {{PLURAL:$1|gewehld Asugab|gewehldi Ausgawe}} owende",
        "revdel-restore": "Sischdbakaid ännare",
        "shown-title": "Zaisch $1 {{PLURAL:$1|Eagewnis}} bro Said",
        "viewprevnext": "Gugg ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''Dohods ä Said \"[[:$1]]\".'''",
-       "searchmenu-new": "'''Mach die Said „[[:$1]]“ im Wiki.'''",
+       "searchmenu-new": "<strong>Mach die Said „[[:$1]]“ im Wiki!</strong> {{PLURAL:$2|0=|Gugg a uffde Said, wu middoina Such gfunne worre isch.|Gugg a uffde gfunnene Sucheagewnis.}}",
        "searchprofile-articles": "Inhald",
-       "searchprofile-project": "Hilf- un Brojegdsaide",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Alles",
        "searchprofile-advanced": "Foadgschridde",
        "searchprofile-articles-tooltip": "In $1 gugge",
-       "searchprofile-project-tooltip": "In $1 gugge",
        "searchprofile-images-tooltip": "Gugg noch Bilda",
        "searchprofile-everything-tooltip": "Such iwwaraal (a wuma dischbedierd)",
        "searchprofile-advanced-tooltip": "Gugg in õnnare Nõmensreum",
        "search-section": "(Abschnidd $1)",
        "search-suggest": "Hoschd gemäänd: $1",
        "search-interwiki-caption": "Schweschterprojekt",
-       "search-interwiki-default": "$1 Ergebnis:",
+       "search-interwiki-default": "Eagewnis vun $1:",
        "search-interwiki-more": "(meh)",
        "search-relatedarticle": "Vawond",
        "searcheverything-enable": "Gugg iwwaraal",
        "search-nonefound": "Kä Eagewnis vunde Õfroch.",
        "powersearch-legend": "Erwaiterte Such",
        "powersearch-ns": "In de Namensraim suche:",
-       "powersearch-redir": "Waiderlaidunge aazaische",
        "powersearch-togglelabel": "Wehl:",
        "powersearch-toggleall": "Alli",
        "powersearch-togglenone": "Kään",
        "default": "Schdondad",
        "youremail": "E-Mail:",
        "username": "{{GENDER:$1|Middawaida}}:",
-       "uid": "{{GENDER:$1|Middawaida}}-Numma:",
        "prefs-memberingroups": "{{GENDER:$2|Middglied}} vun {{PLURAL:$1|Grubb|Grubbe}}:",
        "yourrealname": "Birschalischa Nõme:",
        "yourlanguage": "Schbrooch:",
        "yournick": "Naiji Unnaschfrid",
-       "yourgender": "Gschleschd:",
-       "gender-unknown": "Ghoim gkalde",
-       "gender-male": "Männlisch",
-       "gender-female": "Waiblisch",
+       "yourgender": "Wasfa'ä Gschleschd bischdn?",
+       "gender-unknown": "Do saach isch nix",
+       "gender-male": "Isch binnen Monn",
+       "gender-female": "Isch binä Fraa",
        "prefs-help-email": "E-mail muss ned soi, awwa wead fas naijsedze vum Kennwoad bneedischd, wonns vagesse hoschd.",
        "prefs-help-email-others": "Konschd a wehle, ob õnnare disch iwwan Lingg uff doina Dischbedier-Said õschbresche kennen.\nDoi Address werd ned gzaischd, wõnse midda babbln.",
        "prefs-diffs": "Unaschied",
        "right-undelete": "Said widdaheaschdelle",
        "newuserlogpage": "Naijõmeldungs-Logbuch",
        "rightslog": "Middawaidareschd-Logbuch",
-       "action-edit": "die Said beawaide",
+       "action-edit": "onde Said schaffe",
        "nchanges": "$1 {{PLURAL:$1|Ännarung|Ännarunge}}",
        "recentchanges": "Ledschdi Ännarunge",
        "recentchanges-legend": "Wehl ä Õzaisch fa die ledschde Ännarunge",
        "recentchanges-label-minor": "S'ische glenni Beawaidung",
        "recentchanges-label-bot": "Ännarunge duaschn Bod",
        "recentchanges-label-unpatrolled": "Die Ännarung isch noch nedd iwwabriefd worre",
-       "rcnotefrom": "Unne sinn Ännarunge said '''$2''' (bis '''$1''').",
-       "rclistfrom": "Zaisch die ledschde Ännarunge ab $1",
+       "rcnotefrom": "Unne sinn Ännarunge said <strong>$2<-strong> (bis <strong>$1<-strong>).",
+       "rclistfrom": "Zaisch die ledschde Ännarunge ab $3 $2",
        "rcshowhideminor": "Glenni Ännarunge $1",
        "rcshowhidebots": "Bots $1",
        "rcshowhideliu": "Õgmelde Middawaida $1",
        "randompage": "Irschndn Adiggl",
        "statistics": "Schdadischdigge",
        "statistics-pages": "Saide",
-       "brokenredirects-edit": "beawaide",
+       "brokenredirects-edit": "schaffe",
        "brokenredirects-delete": "lesche",
        "withoutinterwiki-submit": "Zaische",
        "nbytes": "$1 {{PLURAL:$1|Byte|Bytes}}",
        "ncategories": "$1 {{PLURAL:$1|Sachgrubb|Sachgrubbe}}",
        "ninterwikis": "$1 {{PLURAL:$1|interwiki|interwikis}}",
        "nlinks": "$1 {{PLURAL:$1|Lingg|Linggs}}",
-       "nmembers": "$1 {{PLURAL:$1|Middawaida|Middawaida}}",
+       "nmembers": "$1 {{PLURAL:$1|Oidraach|Oidrääch}}",
        "nrevisions": "$1 {{PLURAL:$1|Ännarung|Ännarunge}}",
        "nimagelinks": "Used on $1 {{PLURAL:$1|Said|Saide}}",
        "ntransclusions": "oigsedzd uff $1 {{PLURAL:$1|Said|Saide}}",
        "booksources-go": "Geh",
        "log": "Logbischa",
        "allpages": "Alle Saide",
-       "alphaindexline": "vun $1 bis $2",
        "prevpage": "Voriche Said ($1)",
        "allpagesfrom": "Saide aazaische wu aafange mid:",
        "allpagesto": "Saide aazaische wu ufhere mid:",
        "watch": "Beowachde",
        "watchthispage": "Die Said beowachde",
        "unwatch": "Nemme beowachde",
-       "watchlist-details": "S hodd {{PLURAL:$1|$1 Said|$1 Saide}} uff doina Beowachdungslischd, Dischbediersaide zeeln nedd.",
+       "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",
        "watchlist-options": "Meschlischkaide vunde Beowachdungslischd",
        "watching": "Beowachde ...",
        "protect_expiry_old": "Zaidraum licht in de Vergangehääd.",
        "protect-text": "Du kannscht de Schutzstatus vun de Said '''$1''' aagucke un ännere.",
        "protect-locked-access": "Doi Kondo hodd kä Reschd um de Schudzsdadus vunna Said zu ännare.\nDo hodds die Oischdellunge vunde Said '''$1''':",
-       "protect-cascadeon": "Die Said isch gschizd, wail se {{PLURAL:$1|zu derre Said ghert|zu denne Saide ghert}}, wu e Kaskadesperrung gelt.\nDer Schutzstatus vun derre Said kannscht ännere, awwer des hot kää Aifluss uff d Kaskadesperrung.",
+       "protect-cascadeon": "Die Said isch gschizd, wail se {{PLURAL:$1|zu derre Said kead|zu denne Saide kead}}, wuä Kaskadeschberrung gild.\nÄnnarunge vum Saideschudz hodd awwa kän Oifluß uff die Kaskadeschberrung.",
        "protect-default": "Alle Middawaida erlauwe",
        "protect-fallback": "Bloß fa Laid mid \"$1\" Bereschdischung",
        "protect-level-autoconfirmed": "Naiji un nedd õgmeld Middawaida schberre",
        "protect-cantedit": "Du kannscht de Schutzstatus vun derre Said nit ännere, wail Du nid d Berechdichung dezu hoscht.",
        "restriction-type": "Berechdichung:",
        "restriction-level": "Schudsewene:",
-       "restriction-edit": "Beawaide",
+       "restriction-edit": "Schaffe",
        "restriction-move": "Verschiewe",
        "undelete": "Widderherschdelle",
        "undeletebtn": "Widderherschdelle",
        "tooltip-pt-login": "Du konnschd disch õmelde, awwa mugschd ned",
        "tooltip-pt-logout": "Uffhere",
        "tooltip-ca-talk": "Iwwa d Inhaldssaid dischbediere",
-       "tooltip-ca-edit": "Du konnschd die Said beawaide.\nBidde nemmde Vorschau-Gnobb vorm Schbaischare",
+       "tooltip-ca-edit": "Du konnschd onde Said schaffe.\nBidde nemmde Vorschau-Gnobb vorm Schbaischare",
        "tooltip-ca-addsection": "N'naije Abschnidd õleche",
        "tooltip-ca-viewsource": "Die Said isch gschizd. Du konnschdda de Gwelltegschd õgugge.",
        "tooltip-ca-history": "Ledschdi Ausgawe vunde Said",
        "file-nohires": "Ke heheri Ufflesung vafieschba.",
        "svg-long-desc": "SVG-Datei, Grundgreß $1 × $2 Pixels, Dadaigreß: $3",
        "show-big-image": "Uaschbringlischi Dadai",
-       "showhidebots": "(Bots $1)",
        "ilsubmit": "Such",
        "bad_image_list": "Uffbau: bloß Zaile, wu midm * õfonge werren briggsischdischd.\nDe erschd Lingg mussn Lingg zu änna uuerwinschde Dadai soi.\nÕnnare Linggs inde glaische Zail werren als Ausnõhm gnumme, des heesd, Saide, wu inde Dadai vorkumme dirfn.",
        "metadata": "Medadaade",
        "namespacesall": "alle",
        "monthsall": "alle",
        "watchlisttools-view": "Die wischdische Ännarunge õgugge",
-       "watchlisttools-edit": "Beowachdunglischd õgugge un beawaide",
-       "watchlisttools-raw": "Im große Tegschdfeld beawaide",
+       "watchlisttools-edit": "Beowachdunglischd õgugge un drõ schaffe",
+       "watchlisttools-raw": "Im große Tegschdfeld schaffe",
        "duplicate-defaultsort": "'''Baßma uff:''' De Schlissl \"$2\" dudde frijare Schlissl \"$1\" iwwaschraiwe.",
        "specialpages": "Schbezialsaide",
        "specialpages-group-other": "Onare bsundare Saide",
index b2cdaa1..e9f3e3f 100644 (file)
                        "Ymar",
                        "Žekřil71pl",
                        "לערי ריינהארט",
-                       "Pan Cube"
+                       "Pan Cube",
+                       "Wedkarski",
+                       "아라",
+                       "Matik7",
+                       "Vengir"
                ]
        },
        "tog-underline": "Podkreślenie linków:",
        "jumptonavigation": "nawigacji",
        "jumptosearch": "wyszukiwania",
        "view-pool-error": "Niestety w chwili obecnej serwery są przeciążone.\nZbyt wielu użytkowników próbuje wyświetlić tę stronę.\nPoczekaj chwilę przed ponowną próbą dostępu do tej strony.\n\n$1",
+       "generic-pool-error": "Niestety w chwili obecnej serwery są przeciążone.\nZbyt wielu użytkowników próbuje wyświetlić tę stronę.\nPoczekaj chwilę przed ponowną próbą dostępu do tej strony.",
        "pool-timeout": "Zbyt długi czas oczekiwania na blokadę",
        "pool-queuefull": "Kolejka zadań jest pełna",
        "pool-errorunknown": "Błąd nieznany",
        "readonly_lag": "Baza danych została automatycznie zablokowana na czas potrzebny do wykonania synchronizacji zmian między serwerem głównym i serwerami pośredniczącymi.",
        "internalerror": "Błąd wewnętrzny",
        "internalerror_info": "Błąd wewnętrzny – $1",
-       "fileappenderrorread": "Błąd odczytu „$1” w trakcie dołączania.",
-       "fileappenderror": "Nie udało się dołączyć „$1” do „$2”.",
        "filecopyerror": "Nie można skopiować pliku „$1” do „$2”.",
        "filerenameerror": "Nie można zmienić nazwy pliku „$1” na „$2”.",
        "filedeleteerror": "Nie można usunąć pliku „$1”.",
        "directorycreateerror": "Nie udało się utworzyć katalogu „$1”.",
        "filenotfound": "Nie można znaleźć pliku „$1”.",
-       "fileexistserror": "Nie udało się zapisać do pliku „$1” ponieważ plik istnieje",
        "unexpected": "Nieoczekiwana wartość „$1”=„$2”.",
        "formerror": "Błąd – nie można wysłać formularza",
        "badarticleerror": "Dla tej strony ta operacja nie może być wykonana.",
        "userlogin-helplink2": "Pomoc przy logowaniu",
        "userlogin-loggedin": "Zalogowano jako {{GENDER:$1|$1}}.\nUżyj poniższego formularza, aby zalogować się jako inny użytkownik.",
        "userlogin-createanother": "Załóż nowe konto",
-       "createacct-join": "Wpisz poniżej swoje dane.",
-       "createacct-another-join": "Wprowadź szczegóły nowego konta poniżej.",
        "createacct-emailrequired": "Adres e‐mail",
        "createacct-emailoptional": "Adres e-mail (opcjonalnie)",
        "createacct-email-ph": "Wpisz swój adres e-mail",
        "savearticle": "Zapisz",
        "preview": "Podgląd",
        "showpreview": "Pokaż podgląd",
-       "showlivepreview": "Dynamiczny podgląd",
        "showdiff": "Podgląd zmian",
        "anoneditwarning": "'''Uwaga:''' Nie jesteś {{GENDER:|zalogowany|zalogowana}}.\nTwój adres IP zostanie zapisany w historii edycji strony.",
        "anonpreviewwarning": "''Nie jesteś zalogowany. Jeśli zapiszesz zmiany, w historii edycji strony zostanie umieszczony Twój adres IP.''",
        "edit-gone-missing": "Nie udało się zaktualizować strony.\nZdaje się, że została skasowana.",
        "edit-conflict": "Konflikt edycji.",
        "edit-no-change": "Twoja edycja została zignorowana, ponieważ nie zmienił{{GENDER:|eś|aś|eś(‐aś)}} niczego w tekście.",
-       "postedit-confirmation": "Twoja edycja została zapisana.",
+       "postedit-confirmation-created": "Strona została utworzona.",
+       "postedit-confirmation-restored": "Strona została przywrócona.",
+       "postedit-confirmation-saved": "Twoja edycja została zapisana.",
        "edit-already-exists": "Nie udało się stworzyć nowej strony.\nStrona już istnieje.",
        "defaultmessagetext": "Domyślny tekst komunikatu",
        "content-failed-to-parse": "Format zawartości typu $2 (dla modelu: $1) nieprawidłowy: $3",
        "parser-template-recursion-depth-warning": "Przekroczno limit głębokości rekurencji szablonu ($1)",
        "language-converter-depth-warning": "Przekroczono ograniczenie ($1) głębokości zagnieżdżenia konwersji językowej",
        "node-count-exceeded-category": "Strony, gdzie przekroczono liczbę węzłów",
+       "node-count-exceeded-category-desc": "Kategoria dla stron, na których przekroczono liczbę węzłów.",
        "node-count-exceeded-warning": "Strona przekroczyła liczbę węzłów",
        "expansion-depth-exceeded-category": "Strony z przekroczoną głębokością rozbudowy",
        "expansion-depth-exceeded-warning": "Strona przekroczyła głębokość rozbudowy",
        "logdelete-selected": "Zaznaczone {{PLURAL:$1|zdarzenie|zdarzenia}} z rejestru:",
        "revdelete-text-text": "Usunięte wersje będą nadal widoczne w historii strony, ale niektóre fragmenty ich treści nie będą dostępne dla wszystkich.",
        "revdelete-text-file": "Usunięte wersje pliku będą nadal widoczne w historii pliku, ale niektóre fragmenty ich treści nie będą dostępne dla wszystkich.",
+       "logdelete-text": "Usunięte wpisy rejestru nadal będą widoczne w rejestrze, ale niektóre fragmenty ich treści nie będą dostępne dla wszystkich.",
+       "revdelete-text-others": "Pozostali administratorzy {{grammar:genitive|{{SITENAME}}}} nadal będą posiadali dostęp do ukrytej treści i będą w stanie odtworzyć ją ponownie za pomocą tego samego interfejsu, jeśli nie zostaną ustawione dodatkowe ograniczenia.",
        "revdelete-confirm": "Potwierdź, że chcesz to zrobić zgodnie z [[{{MediaWiki:Policy-url}}|zasadami]] i że rozumiesz konsekwencje.",
        "revdelete-suppress-text": "Ukrywanie powinno być używane '''wyłącznie''' w sytuacji:\n* Informacji, która może być zniesławieniem\n* Ujawnienie danych osobowych\n*: ''adres domowy, numer telefonu, numer PESEL itp''",
        "revdelete-legend": "Ustaw ograniczenia widoczności",
        "shown-title": "Pokaż po $1 {{PLURAL:$1|wyniku|wyniki|wyników}} na stronę",
        "viewprevnext": "Zobacz ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "* Strona '''[[$1]]'''",
-       "searchmenu-new": "<strong>Utwórz stronę „[[:$1]]” na tej wiki!<strong> {{PLURAL:$2|0=|Zobacz też stronę z wynikami wyszukiwania.|Zobacz też wyniki wyszukiwania.}}",
+       "searchmenu-new": "<strong>Utwórz stronę „[[:$1]]” na tej wiki!</strong> {{PLURAL:$2|0=|Zobacz też stronę z wynikami wyszukiwania.|Zobacz też wyniki wyszukiwania.}}",
        "searchprofile-articles": "Strony",
-       "searchprofile-project": "Strony pomocy i projektu",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Wszystko",
        "searchprofile-advanced": "Zaawansowane",
        "searchprofile-articles-tooltip": "Szukanie w przestrzeni nazw $1",
-       "searchprofile-project-tooltip": "Szukanie w przestrzeniach nazw $1",
        "searchprofile-images-tooltip": "Szukanie plików",
        "searchprofile-everything-tooltip": "Szukanie w całej zawartości (także strony dyskusji)",
        "searchprofile-advanced-tooltip": "Szukanie w wybranych przestrzeniach nazw",
        "search-nonefound": "Brak wyników spełniających kryteria podane w zapytaniu.",
        "powersearch-legend": "Wyszukiwanie zaawansowane",
        "powersearch-ns": "Przeszukaj przestrzenie nazw:",
-       "powersearch-redir": "Pokaż przekierowania",
        "powersearch-togglelabel": "Zaznacz",
        "powersearch-toggleall": "wszystko",
        "powersearch-togglenone": "nic",
        "prefs-personal": "Dane użytkownika",
        "prefs-rc": "Ostatnie zmiany",
        "prefs-watchlist": "Obserwowane",
-       "prefs-watchlist-days": "Liczba dni widocznych na liście obserwowanych",
+       "prefs-watchlist-days": "Liczba dni widocznych na liście obserwowanych:",
        "prefs-watchlist-days-max": "Maksimum $1 {{PLURAL:$1|dzień|dni}}",
        "prefs-watchlist-edits": "Liczba edycji pokazywanych w rozszerzonej liście obserwowanych:",
        "prefs-watchlist-edits-max": "Maksymalnie 1000",
        "prefs-emailconfirm-label": "Potwierdzenie adresu e‐mail:",
        "youremail": "Twój adres e‐mail:",
        "username": "{{GENDER:$1|Nazwa użytkownika}}:",
-       "uid": "{{GENDER:$1|Identyfikator użytkownika}}:",
        "prefs-memberingroups": "{{GENDER:$2|Członek}} {{PLURAL:$1|grupy|grup}}:",
        "prefs-registration": "Data rejestracji:",
        "yourrealname": "Imię i nazwisko:",
        "prefs-advancedsearchoptions": "Zaawansowane",
        "prefs-advancedwatchlist": "Zaawansowane",
        "prefs-displayrc": "Opcje wyświetlania",
-       "prefs-displaysearchoptions": "Opcje wyświetlania",
        "prefs-displaywatchlist": "Opcje wyświetlania",
        "prefs-tokenwatchlist": "Token",
        "prefs-diffs": "Zmiany",
        "right-move": "Przenoszenie stron",
        "right-move-subpages": "Przenoszenie stron razem z ich podstronami",
        "right-move-rootuserpages": "Przenoszenie stron użytkowników",
+       "right-move-categorypages": "Przenoszenie stron kategorii",
        "right-movefile": "Przenoszenie plików",
        "right-suppressredirect": "Przenoszenie stron bez tworzenia przekierowania w miejscu starej nazwy",
        "right-upload": "Przesyłanie plików na serwer",
        "action-createpage": "tworzenia stron",
        "action-createtalk": "tworzenia stron dyskusji",
        "action-createaccount": "utworzenia tego konta użytkownika",
+       "action-history": "przeglądania historii tej strony",
        "action-minoredit": "do oznaczenia tej edycji jako drobna zmiana",
        "action-move": "przeniesienia tej strony",
        "action-move-subpages": "przeniesienia tej strony oraz jej podstron",
        "action-move-rootuserpages": "przenoszenia stron użytkowników (bez podstron)",
+       "action-move-categorypages": "przenoszenia stron kategorii",
        "action-movefile": "przeniesienia tego pliku",
        "action-upload": "przesłania tego pliku",
        "action-reupload": "nadpisania tego pliku",
        "recentchanges-legend-newpage": "(zobacz też [[Special:NewPages|listę nowych stron]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Poniżej pokazano zmiany wykonane po '''$2''' (nie więcej niż '''$1''' pozycji).",
-       "rclistfrom": "Pokaż nowe zmiany od $1",
+       "rclistfrom": "Pokaż nowe zmiany od $3 $2",
        "rcshowhideminor": "$1 drobne zmiany",
        "rcshowhideminor-show": "Pokaż",
        "rcshowhideminor-hide": "Ukryj",
        "uploadstash-refresh": "Odśwież listę plików",
        "invalid-chunk-offset": "Nieprawidłowe przesunięcie fragmentu",
        "img-auth-accessdenied": "Odmowa dostępu",
-       "img-auth-nopathinfo": "Brak PATH_INFO.\nSerwer nie został skonfigurowany, tak aby przekazywał tę informację.\nMożliwe, że jest oparty na CGI i nie może obsługiwać img_auth.\nWięcej o informacji o autoryzacji grafik na https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "Brak PATH_INFO.\nSerwer nie został skonfigurowany, tak aby przekazywał tę informację.\nMożliwe, że jest oparty na CGI i nie może obsługiwać img_auth.\nWięcej o informacji o autoryzacji grafik na https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Żądana ścieżka nie jest w obrębie katalogu skonfigurowanego do przesyłania plików.",
        "img-auth-badtitle": "Nie można wygenerować prawidłowego tytuł z „$1”.",
        "img-auth-nologinnWL": "Nie jesteś zalogowany, a „$1” nie jest na białej liście.",
        "upload-disallowed-here": "Nie możesz nadpisać tego pliku.",
        "filerevert": "Przywracanie $1",
        "filerevert-legend": "Przywracanie poprzedniej wersji pliku",
-       "filerevert-intro": "Zamierzasz przywrócić '''[[Media:$1|$1]]''' do [wersji $4 z $3, $2].",
+       "filerevert-intro": "Zamierzasz przywrócić '''[[Media:$1|$1]]''' do [$4 wersji z $3, $2].",
        "filerevert-comment": "Powód",
        "filerevert-defaultcomment": "Przywrócono wersję z $2, $1",
        "filerevert-submit": "Przywróć",
-       "filerevert-success": "Plik '''[[Media:$1|$1]]''' został cofnięty do [wersji $4 z $3, $2].",
+       "filerevert-success": "Plik '''[[Media:$1|$1]]''' został cofnięty do [$4 wersji z $3, $2].",
        "filerevert-badversion": "Brak poprzedniej lokalnej wersji tego pliku z podaną datą.",
        "filedelete": "Usuwanie „$1”",
        "filedelete-legend": "Usuń plik",
        "unwatchedpages": "Nieobserwowane strony",
        "listredirects": "Lista przekierowań",
        "listduplicatedfiles": "Lista plików mających duplikaty",
+       "listduplicatedfiles-summary": "To jest lista plików, dla których najnowsza wersja pliku jest duplikatem najnowszej wersji innego pliku. Uwzględniane są tylko pliki lokalne.",
        "listduplicatedfiles-entry": "[[:File:$1|$1]] ma [[$3|{{PLURAL:$2|jeden duplikat|$2 duplikaty|$2 duplikatów}}]].",
        "unusedtemplates": "Nieużywane szablony",
        "unusedtemplatestext": "Poniżej znajduje się lista wszystkich stron znajdujących się w przestrzeni nazw {{ns:template}}, które nie są używane przez inne strony.\nSprawdź inne linki do szablonów, zanim usuniesz tę stronę.",
        "pageswithprop-prophidden-binary": "binarna wartość własności ukryta ($1)",
        "doubleredirects": "Podwójne przekierowania",
        "doubleredirectstext": "Lista zawiera strony z przekierowaniami do stron, które przekierowują do innej strony.\nKażdy wiersz zawiera linki do pierwszego i drugiego przekierowania oraz link, do którego prowadzi drugie przekierowanie. Ostatni link prowadzi zazwyczaj do strony, do której powinna w rzeczywistości przekierowywać pierwsza strona.\n<del>Skreślenie</del> oznacza naprawienie przekierowania.",
-       "double-redirect-fixed-move": "Naprawa podwójnego przekierowania [[$1]] → [[$2]]",
-       "double-redirect-fixed-maintenance": "Naprawiono podwójne przekierowanie z [[$1]] do [[$2]].",
+       "double-redirect-fixed-move": "Strona [[$1]] została przeniesiona. Przekierowanie wskazujące na stary tytuł zostało automatycznie zaktualizowane i przekierowuje teraz na stronę [[$2]].",
+       "double-redirect-fixed-maintenance": "Automatyczna naprawa podwójnego przekierowania podczas prac konserwacyjnych z [[$1]] na [[$2]].",
        "double-redirect-fixer": "Naprawiacz przekierowań",
        "brokenredirects": "Zerwane przekierowania",
        "brokenredirectstext": "Poniższe przekierowania wskazują na nieistniejące strony.",
        "deadendpagestext": "Poniższe strony nie posiadają odnośników do innych stron znajdujących się w {{GRAMMAR:MS.lp|{{SITENAME}}}}.",
        "protectedpages": "Strony zabezpieczone",
        "protectedpages-indef": "Tylko strony zabezpieczone na zawsze",
-       "protectedpages-summary": "Ta strona zawiera listę stron, które są obecnie chronione. Aby uzyskać listę tytułów, których utworzenie jest zabronione, zobacz [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
+       "protectedpages-summary": "Ta strona zawiera listę stron, które są obecnie chronione. Aby uzyskać listę tytułów, których utworzenie jest zabronione, zobacz: [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "protectedpages-cascade": "Tylko strony zabezpieczone rekursywnie",
        "protectedpages-noredirect": "Ukryj przekierowania",
        "protectedpagesempty": "Żadna strona nie jest obecnie zabezpieczona z podanymi parametrami.",
        "log-title-wildcard": "Szukaj tytułów zaczynających się od tego tekstu",
        "showhideselectedlogentries": "Pokaż/ukryj zaznaczone wpisy rejestru",
        "allpages": "Wszystkie strony",
-       "alphaindexline": "od $1 do $2",
        "nextpage": "Następna strona ($1)",
        "prevpage": "Poprzednia strona ($1)",
        "allpagesfrom": "Strony o tytułach rozpoczynających się od",
        "listgrouprights-namespaceprotection-namespace": "Przestrzeń nazw",
        "listgrouprights-namespaceprotection-restrictedto": "Uprawnienia pozwalające użytkownikom na edytowanie",
        "trackingcategories": "Śledzenie kategorii",
+       "trackingcategories-summary": "Ta strona zawiera listę kategorii monitorujących wypełnianych automatycznie przez oprogramowanie MediaWiki. Nazwy kategorii można zmienić edytując odpowiednie komunikaty systemowe znajdujące się w przestrzeni nazw {{ns:8}}.",
        "trackingcategories-msg": "Śledzenie kategorii",
        "trackingcategories-name": "Nazwa komunikatu",
        "trackingcategories-desc": "Kryteria włączenia kategorii",
        "noindex-category-desc": "Ta strona nie jest indeksowana przez roboty, ponieważ ma wpisane magiczne słowo <code><nowiki>__NOINDEX__</nowiki></code> i znajduje się w przestrzeni nazw, w której ta flaga jest dozwolona.",
        "post-expand-template-inclusion-category-desc": "Po rozwinięciu wszystkich szablonów, rozmiar strony jest większe niż <code>$wgMaxArticleSize</code>, więc niektóre szablony nie zostały rozwinięte.",
        "expensive-parserfunction-category-desc": "Na stronie używanych jest zbyt wiele wymagających funkcji parsera (takich jak <code>#ifexist</code>). Więcej informacji na stronie [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "broken-file-category-desc": "Kategoria dodawana do stron zawierających nieprawidłowe odwołania do plików (odwołania do nieistniejących plików).",
+       "hidden-category-category-desc": "To jest kategoria z <code><nowiki>__HIDDENCAT__</nowiki></code>, co zapobiega wyświetlaniu jej w sekcji z kategoriami na stronie.",
        "trackingcategories-nodesc": "Opis nie jest dostępny.",
        "trackingcategories-disabled": "Kategoria jest wyłączona",
        "mailnologin": "Brak adresu",
        "watchnologin": "Nie jesteś zalogowany",
        "addwatch": "Dodaj do listy obserwowanych",
        "addedwatchtext": "Strona „[[:$1|$1]]” została dodana do Twojej [[Special:Watchlist|listy obserwowanych]].\nKażda zmiana treści tej strony lub związanej z nią strony dyskusji zostanie odnotowana na tej liście.",
+       "addedwatchtext-short": "Strona „$1” została dodana do twojej listy obserwowanych.",
        "removewatch": "Usuń z listy obserwowanych",
        "removedwatchtext": "Strona „[[:$1]]” została usunięta z Twojej [[Special:Watchlist|listy obserwowanych]].",
+       "removedwatchtext-short": "Strona „$1” została usunięta z twojej listy obserwowanych.",
        "watch": "Obserwuj",
        "watchthispage": "Obserwuj",
        "unwatch": "Nie obserwuj",
        "watchlist-details": "Lista obserwowanych przez Ciebie stron zawiera {{PLURAL:$1|$1 pozycję|$1 pozycje|$1 pozycji}}, nie licząc oddzielnie stron dyskusji.",
        "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.",
-       "watchmethod-recent": "poszukiwanie ostatnich zmian wśród obserwowanych stron",
-       "watchmethod-list": "poszukiwanie obserwowanych stron wśród ostatnich zmian",
-       "watchlistcontains": "Na liście obserwowanych przez Ciebie stron {{PLURAL:$1|znajduje się 1 pozycja|znajdują się $1 pozycje|znajduje się $1 pozycji}}.",
-       "iteminvalidname": "Problem z pozycją „$1” – niepoprawna nazwa...",
        "wlnote2": "Poniżej pokazano zmiany wykonane w ciągu {{PLURAL:$1|ostatniej godziny|ostatnich <strong>$1</strong> godzin}}, licząc od $2, $3.",
        "wlshowlast": "Pokaż ostatnie $1 godzin, $2 dni ($3)",
        "watchlist-options": "Opcje obserwowanych",
        "enotif_lastvisited": "Zobacz na stronie $1 wszystkie zmiany od Twojej ostatniej wizyty.",
        "enotif_lastdiff": "Zobacz na stronie $1 tę zmianę.",
        "enotif_anon_editor": "użytkownik anonimowy $1",
-       "enotif_body": "Szanowny $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nOpis zmiany: $PAGESUMMARY $PAGEMINOREDIT\n\nKontakt do autora:\nmail – $PAGEEDITOR_EMAIL\nwiki – $PAGEEDITOR_WIKI\n\nW przypadku kolejnych zmian nowe powiadomienia nie zostaną wysłane, dopóki nie odwiedzisz tej strony jako zalogowany. Możesz także zresetować wszystkie flagi powiadomień na swojej liście stron obserwowanych.\n\nWiadomość z systemu powiadomień {{GRAMMAR:D.lp|{{SITENAME}}}}\n\n--\nW celu zmiany ustawień swojej listy obserwowanych odwiedź\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nUsunięcie strony z listy obserwowanych możliwe jest na stronie\n$UNWATCHURL\n\nPomoc\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Szanowny $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nOpis zmiany: $PAGESUMMARY $PAGEMINOREDIT\n\nKontakt do autora:\nmail – $PAGEEDITOR_EMAIL\nwiki – $PAGEEDITOR_WIKI\n\nW przypadku kolejnych zmian nowe powiadomienia nie zostaną wysłane, dopóki nie odwiedzisz tej strony jako zalogowany. Możesz także zresetować wszystkie flagi powiadomień na swojej liście stron obserwowanych.\n\nWiadomość z systemu powiadomień {{GRAMMAR:D.lp|{{SITENAME}}}}\n\n--\nW celu zmiany ustawień swojej listy obserwowanych odwiedź\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nUsunięcie strony z listy obserwowanych możliwe jest na stronie\n$UNWATCHURL\n\nPomoc\n$HELPPAGE",
        "created": "utworzona",
        "changed": "zmieniona",
        "deletepage": "Usuń stronę",
        "blockip": "Zablokuj użytkownika",
        "blockip-legend": "Zablokuj użytkownika",
        "blockiptext": "Użyj poniższego formularza do zablokowania możliwości edycji spod określonego adresu IP lub konkretnemu użytkownikowi.\nBlokować należy jedynie po to, by zapobiec wandalizmom, zgodnie z [[{{MediaWiki:Policy-url}}|przyjętymi zasadami]].\nPodaj powód (np. umieszczając nazwy stron, na których dopuszczono się wandalizmu).",
-       "ipadressorusername": "Adres IP lub nazwa użytkownika",
+       "ipaddressorusername": "Adres IP lub nazwa użytkownika",
        "ipbexpiry": "Upływa",
        "ipbreason": "Powód",
        "ipbreason-dropdown": "*Najczęstsze przyczyny blokad\n** Ataki na innych użytkowników\n** Naruszenie praw autorskich\n** Niedozwolona nazwa użytkownika\n** Open proxy lub Tor\n** Spamowanie\n** Usuwanie treści stron\n** Wprowadzanie fałszywych informacji\n** Wulgaryzmy\n** Wypisywanie bzdur na stronach",
        "movepagetalktext": "Powiązana strona dyskusji, jeśli istnieje, będzie przeniesiona automatycznie, chyba że:\n*niepusta strona dyskusji już jest pod nową nazwą\n*usuniesz zaznaczenie z poniższego pola wyboru\n\nW takich przypadkach treść dyskusji można przenieść tylko ręcznie.",
        "movearticle": "Przeniesienie strony",
        "moveuserpage-warning": "'''Uwaga!''' Masz zamiar przenieść stronę użytkownika. Miej na uwadze, że zostanie przeniesiona tylko strona, a '''nazwa użytkownika pozostanie niezmieniona'''.",
+       "movecategorypage-warning": "<strong>Uwaga!</strong> Masz zamiar przenieść stronę opisu kategorii. Miej na uwadze, że strony, które należały do starej kategorii, <em>nie</em> zostaną przeniesione do nowej.",
        "movenologintext": "Przenoszenie stron jest możliwe dopiero po zarejestrowaniu się i [[Special:UserLogin|zalogowaniu]].",
        "movenotallowed": "Nie masz uprawnień do przenoszenia stron.",
        "movenotallowedfile": "Nie masz uprawnień do przenoszenia plików.",
        "cant-move-user-page": "Nie masz uprawnień do przenoszenia stron użytkowników (za wyjątkiem podstron).",
        "cant-move-to-user-page": "Nie masz uprawnień do przenoszenia strony do strony użytkownika (za wyjątkiem podstron użytkownika).",
+       "cant-move-category-page": "Nie masz uprawnień do przenoszenia stron kategorii.",
+       "cant-move-to-category-page": "Nie masz uprawnień do przenoszenia strony do strony kategorii.",
        "newtitle": "Nowy tytuł",
        "move-watch": "Obserwuj",
        "movepagebtn": "Przenieś stronę",
        "tooltip-summary": "Wpisz krótki opis",
        "interlanguage-link-title": "$1 – $2",
        "common.css": "/* Umieszczony tutaj kod CSS zostanie zastosowany we wszystkich skórkach */",
-       "cologneblue.css": "/* Umieszczony tutaj kod CSS wpłynie na wygląd skórki Błękit */",
        "monobook.css": "/* Umieszczony tutaj kod CSS wpłynie na wygląd skórki Książka */",
-       "modern.css": "/* Umieszczony tutaj kod CSS wpłynie na wygląd skórki Nowoczesna */",
        "vector.css": "/* Umieszczony tutaj kod CSS wpłynie na wygląd skórki Wektor */",
        "print.css": "/* Umieszczony tutaj kod CSS wpłynie na wygląd wydruku */",
        "noscript.css": "/* Umieszczony tu arkusz stylów CSS będzie wykorzystywany dla użytkowników z wyłączoną obsługą JavaScript */",
        "group-sysop.css": "/* Umieszczony tutaj kod CSS dotyczyć będzie tylko administratorów */",
        "group-bureaucrat.css": "/* Umieszczony tutaj kod CSS dotyczyć będzie tylko biurokratów */",
        "common.js": "/* Umieszczony tutaj kod JavaScript zostanie załadowany przez każdego użytkownika, podczas każdego ładowania strony. */",
-       "cologneblue.js": "/* Umieszczony tutaj kod JavaScript zostanie załadowany wyłącznie przez użytkowników korzystających ze skórki Błękit */",
        "monobook.js": "/* Umieszczony tutaj kod JavaScript zostanie załadowany wyłącznie przez użytkowników korzystających ze skórki Książka */",
-       "modern.js": "/* Umieszczony tutaj kod JavaScript zostanie załadowany wyłącznie przez użytkowników korzystających ze skórki Nowoczesna */",
        "vector.js": "/* Umieszczony tutaj kod JavaScript zostanie załadowany wyłącznie przez użytkowników korzystających ze skórki Wektor */",
-       "notacceptable": "Serwer wiki nie może dostarczyć danych w formacie, którego Twoja przeglądarka oczekuje.",
        "anonymous": "{{PLURAL:$1|Anonimowy użytkownik|Anonimowi użytkownicy}} {{GRAMMAR:D.lp|{{SITENAME}}}}",
        "siteuser": "{{GENDER:$2|użytkownik|użytkowniczka}} {{GRAMMAR:D.lp|{{SITENAME}}}} – $1",
        "anonuser": "niezalogowany użytkownik {{GRAMMAR:D.lp|{{SITENAME}}}} – $1",
        "pageinfo-category-pages": "Liczba stron",
        "pageinfo-category-subcats": "Liczba podkategorii",
        "pageinfo-category-files": "Liczba plików",
-       "skinname-cologneblue": "Błękit",
        "skinname-monobook": "Książka",
-       "skinname-modern": "Nowoczesna",
        "skinname-vector": "Wektor",
        "markaspatrolleddiff": "oznacz edycję jako „sprawdzoną”",
        "markaspatrolledtext": "Oznacz tę stronę jako „sprawdzoną”",
        "nextdiff": "następna edycja →",
        "mediawarning": "'''Uwaga!''' Plik w tym formacie może zawierać złośliwy kod.\nJeśli go otworzysz, możesz zarazić swój system.",
        "imagemaxsize": "Ograniczenie wielkości obrazków:<br /><em>(na stronach opisu plików)</em>",
-       "thumbsize": "Rozmiar miniaturki",
+       "thumbsize": "Rozmiar miniaturki:",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|strona|strony|stron}}",
        "file-info": "rozmiar pliku: $1, typ MIME: $2",
        "file-info-size": "$1 × $2 pikseli, rozmiar pliku: $3, typ MIME: $4",
        "newimages-summary": "Na tej stronie specjalnej prezentowane są ostatnio przesłane pliki.",
        "newimages-legend": "Filtruj",
        "newimages-label": "Nazwa pliku (lub jej fragment)",
-       "showhidebots": "($1 boty)",
+       "newimages-showbots": "Pokaż pliki przesłane przez boty",
        "noimages": "Brak plików do pokazania.",
        "ilsubmit": "Szukaj",
        "bydate": "według daty",
        "size-kilobytes": "$1&nbsp;KB",
        "size-megabytes": "$1&nbsp;MB",
        "size-gigabytes": "$1&nbsp;GB",
-       "livepreview-loading": "Trwa ładowanie…",
-       "livepreview-ready": "Trwa ładowanie… Gotowe!",
-       "livepreview-failed": "Podgląd na żywo nie zadziałał! Spróbuj podglądu standardowego.",
-       "livepreview-error": "Nieudane połączenie: $1 „$2” Spróbuj podglądu standardowego.",
        "lag-warn-normal": "Zmiany nowsze niż $1 {{PLURAL:$1|sekunda|sekundy|sekund}} mogą nie być widoczne na tej liście.",
        "lag-warn-high": "Z powodu dużego obciążenia serwerów bazy danych, zmiany nowsze niż $1 {{PLURAL:$1|sekunda|sekundy|sekund}} mogą nie być widoczne na tej liście.",
-       "watchlistedit-numitems": "Lista obserwowanych przez Ciebie stron zawiera {{PLURAL:$1|1 stronę|$1 strony|$1 stron}}, nie licząc stron dyskusji.",
-       "watchlistedit-noitems": "Twoja lista obserwowanych jest pusta.",
        "watchlistedit-normal-title": "Edytuj listę obserwowanych stron",
        "watchlistedit-normal-legend": "Usuń strony z listy obserwowanych",
        "watchlistedit-normal-explain": "Poniżej znajduje się lista obserwowanych przez Ciebie stron.\nAby usunąć stronę z listy zaznacz znajdujące się obok niej pole i naciśnij „{{int:Watchlistedit-normal-submit}}”.\nMożesz także skorzystać z [[Special:EditWatchlist/raw|tekstowego edytora listy obserwowanych]].",
        "watchlistedit-raw-done": "Lista obserwowanych stron została uaktualniona.",
        "watchlistedit-raw-added": "Dodano {{PLURAL:$1|1 pozycję|$1 pozycje|$1 pozycji}} do listy obserwowanych:",
        "watchlistedit-raw-removed": "Usunięto {{PLURAL:$1|1 pozycję|$1 pozycje|$1 pozycji}} z listy obserwowanych:",
+       "watchlistedit-clear-title": "Wyczyść listę obserwowanych",
+       "watchlistedit-clear-legend": "Wyczyść listę",
+       "watchlistedit-clear-explain": "Wszystkie strony z listy obserwowanych zostaną usunięte",
+       "watchlistedit-clear-titles": "Tytuły:",
+       "watchlistedit-clear-submit": "Wyczyść listę obserwowanych (to jest nieodwracalne!)",
+       "watchlistedit-clear-done": "Twoja lista obserwowanych została wyczyszczona.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|1 strona została usunięta|$1 stron zostało usunięte}}:",
+       "watchlistedit-too-many": "To zbyt wiele stron do wyświetlenia ich tutaj.",
+       "watchlisttools-clear": "wyczyść listę",
        "watchlisttools-view": "pokaż zmiany na liście obserwowanych",
        "watchlisttools-edit": "edycja listy",
        "watchlisttools-raw": "tekstowy edytor listy",
        "compare-invalid-title": "Tytuł jest nieprawidłowy.",
        "compare-title-not-exists": "Podany tytuł nie istnieje.",
        "compare-revision-not-exists": "Wybrana wersja nie istnieje.",
-       "dberr-header": "Ta wiki nie działa poprawnie",
        "dberr-problems": "Przepraszamy! Witryna ma problemy techniczne.",
        "dberr-again": "Spróbuj przeładować stronę za kilka minut.",
        "dberr-info": "(Brak komunikacji z serwerem bazy danych – $1)",
        "htmlform-no": "Nie",
        "htmlform-yes": "Tak",
        "htmlform-chosen-placeholder": "Wybierz opcję",
+       "htmlform-cloner-create": "Dodaj więcej",
+       "htmlform-cloner-delete": "Usuń",
+       "htmlform-cloner-required": "Wymagana jest co najmniej jedna wartość.",
        "sqlite-has-fts": "$1 z obsługą pełnotekstowego wyszukiwania",
        "sqlite-no-fts": "$1 bez obsługi pełnotekstowego wyszukiwania",
        "logentry-delete-delete": "$1 {{GENDER:$2|usunął|usunęła}} stronę $3",
index 9cbeff5..64e3008 100644 (file)
@@ -12,7 +12,9 @@
                        "The Evil IP address",
                        "Ævar Arnfjörð Bjarmason <avarab@gmail.com>, Jens Frank",
                        "לערי ריינהארט",
-                       "Shirayuki"
+                       "Shirayuki",
+                       "아라",
+                       "Kolega2357"
                ]
        },
        "tog-underline": "Anliure con la sotliniadura",
        "readonly_lag": "La base ëd dat a l'é staita blocà n'automàtich antramentr che le màchine dël sircùit secondari as buto an pari con cole dël prinsipal",
        "internalerror": "Eror intern",
        "internalerror_info": "Eror antern: $1",
-       "fileappenderrorread": "As peul pa les-se «$1» durant la gionta.",
-       "fileappenderror": "A l'é pa podusse taché «$1» a «$2».",
        "filecopyerror": "A l'é pa stàit possìbil copié l'archivi «$1» coma «$2».",
        "filerenameerror": "A l'é pa podusse cangeje nòm a l'archivi «$1» an «$2».",
        "filedeleteerror": "A l'é pa podusse scancelé l'archivi «$1».",
        "directorycreateerror": "A l'é pa podusse creé ël dossié «$1».",
        "filenotfound": "A l'é pa trovasse l'archivi «$1».",
-       "fileexistserror": "As peul pa scriv-se l'archivi «$1»: a-i é già.",
        "unexpected": "Valor che i së spetavo pa: «$1»=«$2».",
        "formerror": "Eror: A l'é nen podusse mandé ël formolari.",
        "badarticleerror": "N'operassion parèj as peul pa fesse ansima a sta pàgina-sì.",
        "userlogin-helplink2": "Agiut a la conession",
        "userlogin-loggedin": "A l'é già rintrà an ël sistema tanme {{GENDER:$1|$1}}.\nCh'a deuvra ël formolari sì-sota për rintré coma n'àutr n'utent.",
        "userlogin-createanother": "Creé n'àutr cont",
-       "createacct-join": "Ch'a anserissa soe anformassion sì-sota.",
-       "createacct-another-join": "Anserì j'anformassion dël cont neuv sì-sota.",
        "createacct-emailrequired": "Adrëssa ëd pòsta eletrònica",
        "createacct-emailoptional": "Adrëssa ëd pòsta eletrònica (opsional)",
        "createacct-email-ph": "Ch'a buta soa adrëssa ëd pòsta eletrònica",
        "savearticle": "Salvé la pàgina",
        "preview": "Previsualisassion",
        "showpreview": "Mostré na preuva",
-       "showlivepreview": "Funsion ''Preuva dal viv''",
        "showdiff": "Smon-me le modìfiche",
        "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.",
        "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.''",
        "edit-gone-missing": "As peul nen agiornesse la pàgina.\nA smija che a sia stàita scancelà.",
        "edit-conflict": "Conflit ëd modìfiche.",
        "edit-no-change": "Soa modìfica a l'é stàita ignorà, përchè gnun cambiament a l'é stàit fàit al test.",
-       "postedit-confirmation": "Soa modìfica a l'é stàita salvà.",
+       "postedit-confirmation-saved": "Soa modìfica a l'é stàita salvà.",
        "edit-already-exists": "La neuva pàgina a l'ha nen podù creesse.\nA esist già.",
        "defaultmessagetext": "Test che a-i sarìa se a-i fusso pa 'd modìfiche",
        "content-failed-to-parse": "Faliment ëd l'anàlisi dël contnù ëd $2 për ël model $1: $3",
        "search-nonefound": "A-i é gnun arzultà për l'arserca.",
        "powersearch-legend": "Arserca avansà",
        "powersearch-ns": "Sërché ant jë spassi nominaj:",
-       "powersearch-redir": "Smon-e le ridiression",
        "powersearch-togglelabel": "Buté na marca:",
        "powersearch-toggleall": "Tùit",
        "powersearch-togglenone": "Gnun",
        "prefs-advancedsearchoptions": "Opsion avansà",
        "prefs-advancedwatchlist": "Opsion avansà",
        "prefs-displayrc": "Opsion ëd visualisassion",
-       "prefs-displaysearchoptions": "Opsion ëd visualisassion",
        "prefs-displaywatchlist": "Opsion ëd visualisassion",
        "prefs-tokenwatchlist": "Geton",
        "prefs-diffs": "Diferense",
        "recentchanges-legend-newpage": "(vëdde ëdcò [[Special:NewPages|lista dle pàgine neuve]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Ambelessì sota a-i é la lista dle modìfiche da <strong>$2</strong> (mostrà fin-a a <strong>$1</strong>).",
-       "rclistfrom": "Mostré le modìfiche a parte da $1",
+       "rclistfrom": "Mostré le modìfiche a parte da $3 $2",
        "rcshowhideminor": "$1 le modìfiche cite",
        "rcshowhideminor-show": "Smon-e",
        "rcshowhideminor-hide": "Stërmé",
        "uploadstash-refresh": "Agiorné la lista dj'archivi",
        "invalid-chunk-offset": "Inissi dël segment pa bon",
        "img-auth-accessdenied": "Acess negà",
-       "img-auth-nopathinfo": "PATH_INFO mancant.\nSò servent a l'é nen ampostà për passé costa anformassion.\nPeul desse ch'a sia basà an sij CGI e a peul pa mantnì img_auth.\nVarda https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "PATH_INFO mancant.\nSò servent a l'é nen ampostà për passé costa anformassion.\nPeul desse ch'a sia basà an sij CGI e a peul pa mantnì img_auth.\nVarda https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Ël senté ciamà a l'é pa ant ël dossié configurà për carié.",
        "img-auth-badtitle": "As peul pa fesse un tìtol bon për \"$1\".",
        "img-auth-nologinnWL": "A l'é pa intrà ant ël sistema e \"$1\" a l'é pa ant la lista bianca.",
        "pageswithprop-prophidden-binary": "valor ëd propietà binaria stërmà ($1)",
        "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à.\nAdess a l'é na ridiression a [[$2]].",
+       "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-fixer": "Coretor ëd ridiression",
        "brokenredirects": "Ridiression nen giuste",
        "watchlist-details": "A l'é dëmentrè ch'as ten sot-euj {{PLURAL:$1|$1 pàgina|$1 pàgine}}, nen contand 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'''",
-       "watchmethod-recent": "contròl a j'ùltime modìfiche fàite a le pàgine che as ten sot-euj",
-       "watchmethod-list": "contròl ëd le pàgine che as ten sot-euj për vëdde se a-i sio staje dle modìfiche recente",
-       "watchlistcontains": "Soa lista dla ròba ch'as ten sot-euj a l'ha andrinta {{PLURAL:$1|na pàgina|$1 pàgine}}.",
-       "iteminvalidname": "Problema con l'element '$1', nòm nen vàlid...",
        "wlnote2": "Sì-sota a-i son le modìfiche {{PLURAL:$1|ant l'ùltima ora|ant j'ùltime <strong>$1</strong> ore}}, a parte da $2, $3.",
        "wlshowlast": "Smon-e j'ùltime $1 ore $2 dì $3",
        "watchlist-options": "Opsion ëd la lista dla ròba ch'as ten sot-euj",
        "enotif_lastvisited": "Che as varda $1 për ës-ciaré tute le modìfiche da 'nt l'ùltima vira che a l'é passà.",
        "enotif_lastdiff": "Ch'a varda $1 për visioné sta modìfica.",
        "enotif_anon_editor": "utent anònim $1",
-       "enotif_body": "Car $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nResumé dl'editor: $PAGESUMMARY $PAGEMINOREDIT\n\nPër contaté l'editor:\npòsta eletrònica: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nA-i sarà pì gnun-a notìfica an cas d'àutre atività se chiel a vìsita nen costa pàgina da colegà. Che as visa che a peul cangeje la configurassion dle notìfiche a le pàgine che as ten sot-euj ansima a soa lista dla ròba ch'as ten sot-euj.\n\nComunicassion dël sistema ëd notìfica da {{SITENAME}}\n\n--\nPër cangé la configurassion ëd soe notìfiche an pòsta eletrònica, che a vada ansima a\n{{canonicalurl:{{#special:Preferences}}}}\n\nPër cangé la configurassion ëd lòn che as ten sot-euj che a vada ansima a\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPër scancelé la pàgina da lòn ch'a ten sot-euj, ch'a vìsita\n$UNWATCHURL\n\nComunicassion ëd servissi e pì d'agiut:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Car $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nResumé dl'editor: $PAGESUMMARY $PAGEMINOREDIT\n\nPër contaté l'editor:\npòsta eletrònica: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nA-i sarà pì gnun-a notìfica an cas d'àutre atività se chiel a vìsita nen costa pàgina da colegà. Che as visa che a peul cangeje la configurassion dle notìfiche a le pàgine che as ten sot-euj ansima a soa lista dla ròba ch'as ten sot-euj.\n\nComunicassion dël sistema ëd notìfica da {{SITENAME}}\n\n--\nPër cangé la configurassion ëd soe notìfiche an pòsta eletrònica, che a vada ansima a\n{{canonicalurl:{{#special:Preferences}}}}\n\nPër cangé la configurassion ëd lòn che as ten sot-euj che a vada ansima a\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPër scancelé la pàgina da lòn ch'a ten sot-euj, ch'a vìsita\n$UNWATCHURL\n\nComunicassion ëd servissi e pì d'agiut:\n$HELPPAGE",
        "created": "creà",
        "changed": "modificà",
        "deletepage": "Scancelé la pàgina",
        "cantrollback": "As peul pa tornesse a na version pì veja: l'ùltima modìfica a l'ha fala l'ùnich utent che a l'abia travajà a cost artìcol-sì.",
        "alreadyrolled": "As peulo pa anulé j'ultime modìfiche ëd [[:$1]] fàite da [[User:$2|$2]] ([[User talk:$2|Talk]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\ncheidun d'àutr a l'ha già modificà ò pura anulà le modìfiche a sta pàgina-sì.\n\nL'ùltima modìfica a la pàgina a l'é stàita fàita da [[User:$3|$3]] ([[User talk:$3|Talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Ël coment dla modìfica a l'era: \"''$1''\".",
-       "revertpage": "Gavà via le modìfiche ëd [[Special:Contributions/$2|$2]] ([[User talk:$2|Talk]]); ël contnù a l'é stàit tirà andarè a l'ùltima version dl'utent [[User:$1|$1]]",
+       "revertpage": "Gavà via le modìfiche ëd [[Special:Contributions/$2|$2]] ([[User talk:$2|ciaciarade]]), ël contnù a l'é stàit tirà andaré a l'ùltima version dl'utent [[User:$1|$1]]",
        "revertpage-nouser": "Révoca dle modìfiche da part ëd n'utent ëstërmà a l'ùltima version ëd {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Modìfiche anulà da $1; tirà andré a l'ùltima version da $2.",
        "sessionfailure-title": "Eror ëd session",
        "blockip": "Bloché l'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).",
-       "ipadressorusername": "Adrëssa IP ò stranòm",
+       "ipaddressorusername": "Adrëssa IP ò stranòm",
        "ipbexpiry": "Fin-a al",
        "ipbreason": "Rason:",
        "ipbreason-dropdown": "*Motiv sòlit për ij blocagi\n** Avej butà d'anformassion fàosse\n** Avej gavà dël contnù da 'nt le pàgine\n** Avèj butà dla rumenta porcherìa coma anliure d'areclam\n** Avèj butà test sensa sust ant le pàgine\n** Avèj un deuit da bërsach con la gent\n** Avèj dovrà vàire cont fòra dij deuit\n** Stranòm ch'as peul nen acetesse",
        "monobook.css": "/* cangé st'archivi-sì për modifiché la formatassion dël sit antregh */",
        "common.js": "/* Ël còdes JavaScript ch'as buta ambelessì a ven carià da vira utent për vira pàgina */",
        "monobook.js": "/* Ës messagi-sì as dovrìa pa pì dovrelo; a sò pòst ch'a dòvra [[MediaWiki:common.js]] */",
-       "notacceptable": "Ës servent ëd la wiki a-i la fa pa a fornì dij dat ant na forma che sò programa local a peula lese.",
        "anonymous": "{{PLURAL:$1|Utent|Utent}} anònim ëd {{SITENAME}}",
        "siteuser": "$1, utent ëd {{SITENAME}}",
        "anonuser": "l'utent anònim $1 ëd {{SITENAME}}",
        "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):",
-       "showhidebots": "($1 trigomiro)",
        "noimages": "Pa gnente da vëdde.",
        "ilsubmit": "Arserché",
        "bydate": "për data",
        "size-kilobytes": "$1 KByte",
        "size-megabytes": "$1 MByte",
        "size-gigabytes": "$1 GByte",
-       "livepreview-loading": "Antramentr ch'as caria…",
-       "livepreview-ready": "Antramentr ch'as caria… Carià.",
-       "livepreview-failed": "La preuva dal viv a l'é falìa!\nCh'a preuva an manera sòlita.",
-       "livepreview-error": "Conession falìa: $1 «$2».\nCh'a preuva an manera sòlita.",
        "lag-warn-normal": "Le modìfiche pì neuve ëd $1 {{PLURAL:$1|second}} a podrìo nen ess-ie ant sta lista-sì.",
        "lag-warn-high": "Për via che la màchina serventa a tarda a dene 'd rispòste, le modìfiche fàite men che $1 {{PLURAL:$1|second}} fa a podrìo ëdcò nen ess-ie ant sta lista-sì.",
-       "watchlistedit-numitems": "A l'é antramentr ch'a ten sot-euj {{PLURAL:$1|1 tìtol|$1 tìtoj}}, nen contand le pàgine ëd discussion.",
-       "watchlistedit-noitems": "A-i é pa gnun tìtol ch'as ten-a sot-euj.",
        "watchlistedit-normal-title": "Modifiché la lista ëd lòn ch'as ten sot-euj",
        "watchlistedit-normal-legend": "Gavé via ij tìtoj da 'nt la lista ëd lòn ch'as ten sot-euj",
        "watchlistedit-normal-explain": "Ij tìtoj ch'a ten sot-euj a son ësmonù ambelessì-sota.\nPër gavene via un, ch'a-j fasa la crosëtta ant la casela ch'a l'ha aranda, e peuj ch'ai bata ansima a «{{int:Watchlistedit-normal-submit}}». As peul ëdcò [[Special:EditWatchlist/raw|modifiché la lista ampressa]].",
        "compare-invalid-title": "Ël tìtol ch'a l'ha spessificà a va pa bin.",
        "compare-title-not-exists": "Ël tìtol ch'a l'ha spessificà a esist pa.",
        "compare-revision-not-exists": "La revision che a l'ha spessificà a esist pa.",
-       "dberr-header": "Sta wiki-sì a l'ha un problema",
        "dberr-problems": "An dëspias! Ës sit a l'ha dle dificoltà técniche.",
        "dberr-again": "Ch'a speta chèiche minute e ch'a preuva torna a carié.",
        "dberr-info": "(Conession al servent ëd base ëd dàit impossìbil: $1)",
index 0fe712b..941ef81 100644 (file)
@@ -6,7 +6,8 @@
                        "Khalid Mahmood",
                        "Rachitrali",
                        "Reedy",
-                       "ZaDiak"
+                       "ZaDiak",
+                       "아라"
                ]
        },
        "tog-underline": "حوڑ تھلے لین:",
@@ -19,7 +20,6 @@
        "tog-showtoolbar": "ایڈٹ ٹولبار وکھاؤ",
        "tog-editondblclick": "صفیاں تے ڈبل کلک کرن تے تبدیلیاں لیاؤ",
        "tog-editsectiononrightclick": "سیکشن سرخی تے تبدیلی لیاؤ سجی کلک نال",
-       "tog-rememberpassword": "اس براؤزر تے میرا ورتن ناں یاد رکھو ($1 {{PLURAL:$1|دن|دناں}} واسطے)",
        "tog-watchcreations": "جیہڑے صفے میں بناندا واں اوہ میری اکھ تھلے لسٹ چ کر دیو",
        "tog-watchdefault": "جیہڑے صفے میں لکھداں اوہ میری اکھ تھلے لسٹ چ کر دیو",
        "tog-watchmoves": "جیڈے صفحے میں لے چلداں اوہ میری اکھ تھلے کر دیو",
        "readonly_lag": "ایہ ڈیٹابیس اپنے آپ تالے چ اندی اے تے اودوں تھلواں ڈیٹا بیس اتلے نوں جا رلدا اے۔",
        "internalerror": "اندر دا مسئلا",
        "internalerror_info": "اندر دا مسئلا: $1",
-       "fileappenderrorread": "\"$1\" پڑھیا ناں جا سکیا جوڑدیاں",
-       "fileappenderror": "\"$1\"  \"$2\" نال جوڑیا نئیں جاسکدا۔",
        "filecopyerror": "\"$1\" توں  \"$2\" تک فائل کاپی ناں ہوسکی۔",
        "filerenameerror": "\"$1\" دا ناں بدل کے \"$2\" نا رکھیا جاسکیا۔",
        "filedeleteerror": "فائل \"$1\" نا مٹائی جاسکی۔",
        "directorycreateerror": "ڈائریکٹری \"$1\" نئیں بنا جاسکی۔",
        "filenotfound": "فائل \"$1\" نا لبی جاسکی۔",
-       "fileexistserror": "\"$1\" xjNg fNlF gkel ojvkrl: xjNg hlKl jc.",
        "unexpected": "امید ناء ہون والا مل:\"$1\"=\"$2\".",
        "formerror": "مسئلا: فارم نا پیجیا سکیا",
        "badarticleerror": "اے کم اس صفحے تے نئیں ہو سکدا۔",
        "savearticle": "کم بچاؤ",
        "preview": "وکھاؤ",
        "showpreview": "کچا کم ویکھو",
-       "showlivepreview": "جیندا کچا کم",
        "showdiff": "تبدیلیاں وکھاؤ",
        "anoneditwarning": "'''خبردار''' تسی اندر نہیں آۓ\nتواڈا ''آئی پی'' پتہ فائل فائل وچ لکھیا جاۓ گا۔",
        "anonpreviewwarning": "''تسی ہلے لاگ ان نئیں ہوۓ،۔ کم بچاؤ گے تے تواڈا IP پتہ صفحے دی تریخ چ لکھ لیا جاۓ گا۔''",
        "search-nonefound": "سوال نال رلدے کوئی نتارے نئیں سن۔",
        "powersearch-legend": "ہور کھوج",
        "powersearch-ns": "ناں الیاں جگہاں چ لبو:",
-       "powersearch-redir": "ریڈائریکٹس دی لسٹ وکھاؤ",
        "powersearch-togglelabel": "ویکھو:",
        "powersearch-toggleall": "سارے",
        "powersearch-togglenone": "کوئی نئیں",
        "prefs-advancedsearchoptions": "ہور چنوتیاں",
        "prefs-advancedwatchlist": "ہور چنوتیاں",
        "prefs-displayrc": "چنوتیاں دسو",
-       "prefs-displaysearchoptions": "چنوتیاں دسو",
        "prefs-displaywatchlist": "چنوتیاں دسو",
        "prefs-diffs": "ڈفز",
        "email-address-validity-valid": "ای_میل پتہ ٹھیک لگدا اے۔",
        "recentchanges-label-bot": "ایس تبدیلی نوں بوٹ نے کیتا اے۔",
        "recentchanges-label-unpatrolled": "ایس تبدیلی تے ہلے گشت نئیں ہوئی۔",
        "rcnotefrom": "ہلے تک '''$2''' توں '''$1''' تبدیلیاں تھلے دتیاں گئیاں نیں۔",
-       "rclistfrom": "$1 توں ہونے آلیاں نویاں تبدیلیاں وکھاؤ",
+       "rclistfrom": "$3 $2 توں ہونے آلیاں نویاں تبدیلیاں وکھاؤ",
        "rcshowhideminor": "$1 معمولی تبدیلیاں",
        "rcshowhidebots": "$1 بوٹ",
        "rcshowhideliu": "$1 ورتن آلے اندر نیں",
        "uploadstash-refresh": "فائلاں دی لسٹ تازی کرو۔",
        "invalid-chunk-offset": "ناں چلن والا چنک افسیٹ",
        "img-auth-accessdenied": "اپڑنن روک",
-       "img-auth-nopathinfo": "گمی راہ بارے دس۔\nتواڈا سرور ایس جانکاری نوں نئیں گزار سکدا۔\nاے ۓۂـ- بیسد ہوسکدی اے یا تے img_auth نوں سپورٹ کردی اے۔\nویکھو https://www.mediawiki.org/wiki/Manual:Image_Authorization",
+       "img-auth-nopathinfo": "گمی راہ بارے دس۔\nتواڈا سرور ایس جانکاری نوں نئیں گزار سکدا۔\nاے ۓۂـ- بیسد ہوسکدی اے یا تے img_auth نوں سپورٹ کردی اے۔\nویکھو https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization",
        "img-auth-notindir": "پچھیا گیا راہ بنائی گئی ڈائریکٹری چ نئیں اے۔",
        "img-auth-badtitle": "\"$1\" توں اک پکا سرناواں بنان چ ہار",
        "img-auth-nologinnWL": "تسیں لاگان نئیں ہووے \"$1\"  چٹی لسٹ چ نئیں۔",
        "watchlist-details": "{{PLURAL:$1|$1 صفحہ|$1 صفحہ}} تواڈی اکھ تھلے گلاں باتاں شامل نہیں۔",
        "wlheader-enotif": "ای-میل نوٹیفیکیشن قابل",
        "wlheader-showupdated": " صفے جیہڑے بدلے کۓ تھواڈے آخری وار آن مکرون  اونان نوں موٹا کرکے دسیا گیا اے۔",
-       "watchmethod-recent": "نیڑے ہویاں تبدیلیاں چائیدے صفیاں دیاں ویکھے جان والے صفیاں لئی۔",
-       "watchmethod-list": "ویکھے کے صفے نیڑے ہون والیاں تبدیلیاں دی پڑتال",
-       "watchlistcontains": "تھواڈی اکھ تھلے رکھی لسٹ چ $1 {{PLURAL:$1|صفہ|صفے}}  نیں۔",
-       "iteminvalidname": "'$1' نال رپھڑ، ناں غلط",
        "wlshowlast": "آخری $1 گھنٹے $2 دن $3 وکھاؤ",
        "watchlist-options": "نظر تھلے رکھن دیاں راہواں",
        "watching": "نظر تھلے۔۔۔۔",
        "enotif_lastvisited": "$1 تبدیلیاں ویکھو اپنے آخری واری آن مکروں",
        "enotif_lastdiff": "$1 ویکھو ایس تبدیلی نون ویکھن لئی۔",
        "enotif_anon_editor": "گم نام ورتن آلا $1",
-       "enotif_body": " $پیارے ورتن والے,\n\n\nThe {{SITENAME}} page $PAGETITLE has been $CHANGEDORCREATED on $PAGEEDITDATE by $PAGEEDITOR, see $PAGETITLE_URL for the current revision.\n{{سائیٹناں}}  صفہ $صفہ سرناواں نوں $بدلیابنادتاگیا جے $صفہتبدیلیتریخ نوں $صفہ لکھاری نے، $صفہسرفاواں_یو آر ایل ویکھو ہن دی ریوین لئی۔\n$نواںصفہ$\n\nلکھاری سمری: $صفہ سمری $نکیصفہتبدیلی\n\n\n\nلکھن والے نوں لکھو:\nmail: $صفہلکھاری_ایمیل\nوکی: $صفہلکھاری_وکی\n\nہور گلاں ایس بارے نئیں دسیاں جان گیاں جد تک تسین ایتھے فیر نئیں آندے.\nتسیں فیر سیٹ کرسکدے اپنے اپنے سارے ویکھے صفیاں لئی اپنی اکھ تھلے رکھی لسٹ چ۔\n\t\t\t تواڈا {{سائیٹناں}} بیلی نوٹیفیکیشن پربندھ\n\n--\nاپنی ای-میل نوٹیفیکیشن سیٹنگ ویکھن لئی، تھلے دسے گے پتے تے جاؤ\n{{canonicalurl:{{#خاص:تانگاں}}}}\n\nاپنی اکھتھلے رکھی لسٹ چ تبدیلی لئی ویکھو\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\n\nاپنی اکھ تھلے رکھی لسٹ چوں صفے نوں مٹان لئی\n$UNWATCHURL\n\nفیڈبیک تے ہور مدد لئی:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": " $پیارے ورتن والے,\n\n\nThe {{SITENAME}} page $PAGETITLE has been $CHANGEDORCREATED on $PAGEEDITDATE by $PAGEEDITOR, see $PAGETITLE_URL for the current revision.\n{{سائیٹناں}}  صفہ $صفہ سرناواں نوں $بدلیابنادتاگیا جے $صفہتبدیلیتریخ نوں $صفہ لکھاری نے، $صفہسرفاواں_یو آر ایل ویکھو ہن دی ریوین لئی۔\n$نواںصفہ$\n\nلکھاری سمری: $صفہ سمری $نکیصفہتبدیلی\n\n\n\nلکھن والے نوں لکھو:\nmail: $صفہلکھاری_ایمیل\nوکی: $صفہلکھاری_وکی\n\nہور گلاں ایس بارے نئیں دسیاں جان گیاں جد تک تسین ایتھے فیر نئیں آندے.\nتسیں فیر سیٹ کرسکدے اپنے اپنے سارے ویکھے صفیاں لئی اپنی اکھ تھلے رکھی لسٹ چ۔\n\t\t\t تواڈا {{سائیٹناں}} بیلی نوٹیفیکیشن پربندھ\n\n--\nاپنی ای-میل نوٹیفیکیشن سیٹنگ ویکھن لئی، تھلے دسے گے پتے تے جاؤ\n{{canonicalurl:{{#خاص:تانگاں}}}}\n\nاپنی اکھتھلے رکھی لسٹ چ تبدیلی لئی ویکھو\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\n\nاپنی اکھ تھلے رکھی لسٹ چوں صفے نوں مٹان لئی\n$UNWATCHURL\n\nفیڈبیک تے ہور مدد لئی:\n$HELPPAGE",
        "created": "بن گیا",
        "changed": "بدلیا",
        "deletepage": "صفہ مٹاؤ",
        "blockip": "اس ورتن والے نو روکو",
        "blockip-legend": "ورتن آلے نوں روکو",
        "blockiptext": "تھلے دتا گیا فارم ورتو کسے خاص آئی پی پتے یا ورتن ناں  نوں لکھن روک لئی۔ ایہ صرف ونڈالزم توں بچن لئی اے، تے [[{{MediaWiki:Policy-url}}|policy]] دے نال اے۔ \nتھلے خاص وجہاں دسو (ادھارن لئی خاص صفیاں دی دس دیو جیہڑے خراب کیتے گۓ۔)",
-       "ipadressorusername": "آئی پی پتہ یا ورتن آلے دا ناں:",
+       "ipaddressorusername": "آئی پی پتہ یا ورتن آلے دا ناں:",
        "ipbexpiry": "انت:",
        "ipbreason": "وجہ:",
        "ipbreason-dropdown": "*روکن دیاں عام وجہاں\n** غلط جانکاری دینا\n** صفیاں توں مواد مٹانا\n** بارلیاں ویب سائٹاں نال غلط جوڑ جوڑنا\n** خراب / احمفانہ مواد صفیاں چ پانا\n** دوجیاں نوں ڈرانا\n** کھاتیاں نوں خراب کرنا\n** ناں منیا جان والا ورتن ناں ورتنا",
        "tooltip-undo": "\"واپس\" تے کلک کرن نال توانوں صفحہ کچا وکھایا جاۓ گا۔\nاس نال تسی واپس کرن دی وجہ لکھ سکو گے۔",
        "tooltip-preferences-save": "تانگاں بچاؤ",
        "tooltip-summary": "اک نکی سمری پاؤ",
-       "notacceptable": "وکی سرور توانوں اوس فارمیٹ چ ڈیٹا نئیں دے سکدا جیدے چ اوہ پڑھ سکے۔",
        "anonymous": "{{SITENAME}} دے گمنام {{PLURAL:$1|ورتن والا|ورتنوالے}}۔",
        "siteuser": "{{SITENAME}} ورتن والا $1",
        "anonuser": "{{SITENAME}} گمنام ورتن والا $1",
        "newimages-summary": "اے خاص صفہ آخری چڑھائیاں فائلاں دسدا اے۔",
        "newimages-legend": "فلٹر",
        "newimages-label": "ففائل ناں (یا ایدا انگ)",
-       "showhidebots": "(بوٹ $1)",
        "noimages": "ویکھن آسطے کج نئیں۔",
        "ilsubmit": "کھوجو",
        "bydate": "تریخ نال",
        "autosumm-replace": "\"$1\" نال مواد بدلو",
        "autoredircomment": "صفے نوں [[$1]] ول ریڈائرکٹ کرو",
        "autosumm-new": "\"$1\" نال صفہ بنایا گیا۔",
-       "livepreview-loading": "لوڈنگ",
-       "livepreview-ready": "لوڈنگ۔۔۔۔۔۔تیار!",
-       "livepreview-failed": "لائیو وکھالہ ناکام!\nنارمل وکھالے دی کوشش کرو۔",
-       "livepreview-error": "جوڑن چ ناکام: $1 \"$2\"\nنارمل وکھالہ کوشش کرو۔",
        "lag-warn-normal": "$1 توں نویاں تبدیلیاں {{PLURAL:$1|سکنٹ}}",
        "lag-warn-high": "تیز ڈیٹاسرور لاگ ، $1 توں نویاں تبدیلیاں {{PLURAL:$1|سکنٹ|سکنٹ}} ہوسکدا اے ایس لسٹ ناں دسے جان۔",
-       "watchlistedit-numitems": "تھواڈے اکھ تھلے رکھے صفیاں گل بات والے صفے کڈکے {{PLURAL:$1|1 سرخی|$1 سرخی}} نیں۔",
-       "watchlistedit-noitems": "تھواڈی اکھ تھلے رکھے صفیاں دی لسٹ خالی اے۔",
        "watchlistedit-normal-title": " اکھ تھلے رکھی ہوئی نو تبدیل کرو",
        "watchlistedit-normal-legend": "اکھ تھلیوں ہٹا لو",
        "watchlistedit-normal-explain": "تواڈی اکھ تھلے رکھی لسٹ دے سرناویں تھلے دتے گۓ نیں۔\nاک سرناویں نوں ہٹان لئی، اوس توں اگلے ڈبے نوں ویکھو تے \n\"{{int:Watchlistedit-normal-submit}}\" تے کلک کرو۔\nتسیں [[Special:EditWatchlist/raw|کچی لسٹ تبدیل کرو]]",
        "compare-invalid-title": "سرخی جیہڑی تساں چنی اے ایدی اجازت نئیں۔",
        "compare-title-not-exists": "ٹائیٹل جیہڑا تساں چنیاں اوہ ہے ای نئیں۔",
        "compare-revision-not-exists": "دوبارہ وکھالہ جیہڑا تساں دسیا اے ہے ای نئیں۔",
-       "dberr-header": "ایس وکی چ کوئی مسلہ اے۔",
        "dberr-problems": "معاف کرنا ! ایس صفے تے تکنیکی مسلے آرۓ نیں۔",
        "dberr-again": "تھو ڑے منٹ انتظار کرو تے دوبارہ لوڈ کرو۔",
        "dberr-info": "(ڈیٹابیس سرور نال میل نئیں ہوسکیا:$1)",
index 0b373c3..3e282a2 100644 (file)
@@ -8,7 +8,8 @@
                        "Reedy",
                        "Sinopeus",
                        "Urhixidur",
-                       "ZaDiak"
+                       "ZaDiak",
+                       "아라"
                ]
        },
        "tog-underline": "Υπογράμμιση συνδεσμίων:",
        "filedeleteerror": "Το σβήσεμαν τ' αρχείου \"$1\" 'κ εγέντον.",
        "directorycreateerror": "Η κατηγορία \"$1\" 'κ εγέντον.",
        "filenotfound": "Τ' αρχείον \"$1\" 'κ ευρέθεν.",
-       "fileexistserror": "Τ' αρχείον \"$1\" 'κ εγράφτεν: τ' αρχείον υπάρχει",
        "unexpected": "Άχρηστον αξία: \"$1\"=\"$2\".",
        "badarticleerror": "Αβούτη η ενέργειαν 'κ επορεί να ίνεται σ'αβούτεν τη σελίδαν.",
        "cannotdelete": "Ατό (\"$1\") να σβύεται 'κ ίνεται.\nΓιαμ ενεσβύεν ασ'άλλτς;",
        "searchall": "ούλαι",
        "powersearch-legend": "Αναλυτικόν αράεμαν",
        "powersearch-ns": "Αράεμαν σα τόπε τ' ονοματίων:",
-       "powersearch-redir": "Κατάλογον με διπλά συνδέσμ",
        "powersearch-toggleall": "Όλια",
        "powersearch-togglenone": "Τιδέν",
        "search-external": "Εύρον σα εξ μερέαν",
        "recentchanges-legend": "Επιλογάς υστερνιδίων αλλαγίων",
        "recentchanges-feed-description": "Τ' ασ' όλεα καινούρεα αλλαγάς τη wiki ωρία σ' αβούτεν την περίληψην.",
        "rcnotefrom": "Αφκά καικά ευρίουνταν τ' αλλαγάς ασό <b>$2</b> (εμφάνιση <b>$1</b> αλλαγίων max).",
-       "rclistfrom": "Δείξον τ' αλλαγάς ασα $1 μαναχόν",
+       "rclistfrom": "Δείξον τ' αλλαγάς ασα $3 $2 μαναχόν",
        "rcshowhideminor": "$1 τα μικρά αλλαγάς",
        "rcshowhidebots": "$1 bots",
        "rcshowhideliu": "$1 χρήστες με λογαρίαν",
index f8ffe39..1e61f41 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Kaganer",
                        "Nertiks",
-                       "Peteris"
+                       "Peteris",
+                       "아라"
                ]
        },
        "tog-underline": "Autengīnsenin paglaubasnā",
@@ -16,7 +17,6 @@
        "tog-showtoolbar": "Waidinnais sawinzlin stēisan pagaptin (JavaScript)",
        "tog-editondblclick": "Redigīs pāusans pra dwigubban pellis gnesnan (JavaScript)",
        "tog-editsectiononrightclick": "Ermazīnginais redigīsnan stēisan pāusas sekciōnin pra tikrōman pellis knuppas gnesnan na tenesses tītelin",
-       "tog-rememberpassword": "Pamēnais enēisenes infōrmaciōnins en šismu kōmputerin (per maksimum of $1 {{PLURAL:$1|deinā|dēinans}})",
        "tog-watchcreations": "Preidāis pāusans kawīdans as teīke prei majjan listin stēisan nadirītan",
        "tog-watchdefault": "Preidāis pāusans kawīdans as redigijja prei majjan listin stēisan nadirītan",
        "tog-watchmoves": "Preidāis pāusans, kawīdans as praskajjina prei majjan listin stēisan nadirītan",
        "filedeleteerror": "Ni mazīngi āupausintun zūrbrukin \"$1\"",
        "directorycreateerror": "Ni mazīngi teīktun fōlderan \"$1\"",
        "filenotfound": "Ni mazīngi aupaltun zūrbrukin \"$1\"",
-       "fileexistserror": "Ni mazīngi enpeisātun en zūrbrukin \"$1\" beggi stawīds zūrbrukis jāu ast",
        "unexpected": "Nigēista wērtibi: \"$1\"=\"$2\".",
        "formerror": "Blānda: ni mazīngi tērpautun fōrmularan",
        "badarticleerror": "Dīlasenis ni mazzi būtwei izpilnintan nō šin pāusan.",
        "savearticle": "Enpeisāis pāusan",
        "preview": "Pirmādira",
        "showpreview": "Waidinnais pirmādiran",
-       "showlivepreview": "Dināmiska pirmādira",
        "showdiff": "Waidinnais kitawīdinsnans",
        "anoneditwarning": "'''Nōda:''' Tū ni assei engūbun. Twajā IP adressi wīrst būwusi enpeisātan en šisse pāusas redigīsnas istōrijan.",
        "missingsummary": "'''Nōda:''' Ni assei enwedduns ebpeisāsenin stēisan kitawīdinsnan.\nIk tū ni kwaitēi din enwestun, gnetteis etkūmps knuppan \"Enpeisāis\".",
        "search-nonefound": "Nisatausnā stēisan rezultātan izpilnintan prasīsenes kritērijans.",
        "powersearch-legend": "Paplatintā laukīsna",
        "powersearch-ns": "Laukīs en tītelin plattibimans:",
-       "powersearch-redir": "Waidinnais prawessenins",
        "powersearch-toggleall": "Wisāi",
        "powersearch-togglenone": "Nika",
        "search-external": "Izwinaīna laukisnā",
        "recentchanges-label-unpatrolled": "Šis redigīsenis ni ast dabber izbandātan",
        "recentchanges-legend-newpage": "$1 - nāunan pāusan",
        "rcnotefrom": "Zemmais ast kitawīdisnas ezze '''$2''' (ērgi '''$1''' waidīntan).",
-       "rclistfrom": "Waidinnais nāunans kitawīdinsnans pagaūnintei ezze $1",
+       "rclistfrom": "Waidinnais nāunans kitawīdinsnans pagaūnintei ezze $3 $2",
        "rcshowhideminor": "$1 malkas kitawīdisnas",
        "rcshowhidebots": "$1 bōtai",
        "rcshowhideliu": "$1 engūbusis tērpautajai",
        "watchlist-details": "Ast {{PLURAL:$1|$1 pāusan|$1 pāusai}} en twajjai listin stēisan nadirītan, ni gīrbawintei diskusiōnis pāusans.",
        "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..",
-       "watchmethod-recent": "Izbandasnā stēisan panzdauman kitawīdisnan sirzdau nadirītans pāusans",
-       "watchmethod-list": "Izbandasnā stēisan nadirītan pāusan laukīntei panzdaumans kitawīdisnans",
-       "watchlistcontains": "En twajjai listin stēisan nadirītan ast $1 {{PLURAL:$1|pāusan|pāusai}}.",
-       "iteminvalidname": "Prōblamans sen elamēntan \"$1\", nitikrōmiska pabilisnā...",
        "wlshowlast": "Waidinnais panzdaumans $1 stūndins, $2 dēinans ($3)",
        "watchlist-options": "Nadirītan listis mazīngiskwas",
        "watching": "As nadirēi...",
        "tooltip-upload": "Pagaūneis enkraūsnan",
        "tooltip-rollback": "\"Etwārtai wartinnais\" sen ainan gnessenin etwartinna wissans šisse pāusas kitawīdisnans segītans pra panzdauman redigīntin.",
        "tooltip-undo": "\"Naikinnais redigīsenin\" etwārtai wartinna šin redigīsenin be etwerre redigīsenes langstan en pirmādiras wīdu.\nSta preiwērpja enpeisātun brewīnslin en kitawīdisnan ebpeisāseņu.",
-       "notacceptable": "Wiki sērwerin ni mazzi preistatīntun dātan en fōrmatu palaipsītasmu pra twajjan lasātlin.",
        "anonymous": "{{PLURAL:$1|Anōnims tērpautajs|Anōnimai tērpautajai}} stesse {{SITENAME}}",
        "siteuser": "Tērpautajs stesse {{SITENAME}} - $1",
        "anonuser": "{{SITENAME}} anōnims tērpautajs $1",
        "autosumm-blank": "Pāusan skistīntan",
        "autoredircomment": "Prawessenis en [[$1]]",
        "autosumm-new": "Ast teīkuns(si) nāunan pāusan \"$1\"",
-       "livepreview-loading": "Krausnā...",
-       "livepreview-ready": "Krausnā...Gattawan!",
-       "livepreview-failed": "Dināmiska pirmādira ni dīlai! Bandais jāukun pirmādiran.",
-       "livepreview-error": "Seisnā ni izpalla: $1, \"$2\".\nBandais jāukun pirmādiran.",
        "lag-warn-normal": "Kitawīdinsnas nāunaisis nikāi $1{{PLURAL:$1|sekūndi|sekūndis}} mazzi ni būtwei waidīntan en listei.",
        "lag-warn-high": "Dātanbazis sērweres debīkas wīlausnas paggan, kitawīdinsnas nāunaisis nikāi $1{{PLURAL:$1|sekūndi|sekūndis}} mazzi ni būtwei waidīntan en listei.",
-       "watchlistedit-numitems": "Twajā nadirītan listi turri ēn sin {{PLURAL:$1|1 tītelin|$1 tītelins}}, izīmtun diskusiōnis pāusans.",
-       "watchlistedit-noitems": "Twajā nadirītan listi ni turri ēn sin tītelins.",
        "watchlistedit-normal-title": "Redigīs listin stēisan nadirītan",
        "watchlistedit-normal-legend": "Āupausinais tītelins iz listin stēisan nadirītan",
        "watchlistedit-normal-explain": "Zemmais ast listi stēisan pāusan nadirītan prō tin.\nKai āupausinlai nadirītan pāusan iz listin, ebzentlis laūkan pagār prei tītelin be gnetteis \"Āupausinais ebzentlitans\".\nTū mazzi dīgi tērpautun [[Special:EditWatchlist/raw|nadirītan listis tekstiskan pagaptin]].",
        "tags-hitcount-header": "Pazentlitas kitawīdinsnas",
        "tags-edit": "redigīs",
        "tags-hitcount": "$1 {{PLURAL:$1|kitawīdisna|kitawīdisnas}}",
-       "dberr-header": "Šī wīki ni dīlai tikrōmiskai",
        "dberr-again": "Bandais etkūmps kraūtun šin pāusan pa delli minūtins.",
        "dberr-info": "(Ni mazīngi sēitun si sen dātanbazis sērwerin: $1)",
        "dberr-usegoogle": "En šissei kērdan tu mazzi laukītun sen Google.",
index 64d0965..1212ab8 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Ahmed-Najib-Biabani-Ibrahimkhel",
                        "Kaganer",
-                       "Umherirrender"
+                       "Umherirrender",
+                       "아라"
                ]
        },
        "tog-underline": "کرښنې تړنې:",
        "missingarticle-diff": "(توپير: $1، $2)",
        "internalerror": "کورنۍ تېروتنه",
        "internalerror_info": "کورنۍ تېروتنه: $1",
-       "fileappenderrorread": "د پايملون په وخت کې \"$1\" و نه لوستل شو.",
-       "fileappenderror": "د \"$1\" پايملون \"$2\" ته ترسره نه شو..",
        "filecopyerror": "د \"$1\" په نامه دوتنه مو \"$2\" ته و نه لمېسلای شوه.",
        "filerenameerror": "د \"$1\" په نامه د دوتنې نوم \"$2\" ته بدل نه شو.",
        "filedeleteerror": "د \"$1\" دوتنه ړنگه نه شوه.",
        "directorycreateerror": "د \"$1\" په نامه ليکلړ جوړ نه شو.",
        "filenotfound": "د \"$1\" دوتنه مو و نه موندله.",
-       "fileexistserror": "د \"$1\" په نامه دوتنه نه ليکل کېږي: دوتنه د پخوا نه دلته شته",
        "unexpected": "نا اټکله شمېره: \"$1\"=\"$2\".",
        "formerror": "ستونزه: فورمه مو و نه سپارل شوه",
        "badarticleerror": "په دې مخ دا کړنه نه شي ترسره کېدلای.",
        "userlogin-resetpassword-link": "پټنوم مو هېر شوی؟",
        "userlogin-helplink2": "په ننوتلو کې مرسته",
        "userlogin-createanother": "بل گڼون جوړول",
-       "createacct-join": "خپل مالومات مو لاندې ورکړئ.",
-       "createacct-another-join": "د نوي گڼون مالومات مو لاندې ورکړئ.",
        "createacct-emailrequired": "برېښليک پته",
        "createacct-emailoptional": "برېښليک پته (اختياري)",
        "createacct-email-ph": "برېښليک پته مو وټاپۍ",
        "savearticle": "مخ خوندي کول",
        "preview": "مخليدنه",
        "showpreview": "مخليدنه",
-       "showlivepreview": "ژوندۍ مخکتنه",
        "showdiff": "بدلونونه ښکاره کول",
        "anoneditwarning": "'''يادونه:''' تاسې غونډال ته نه ياست ننوتي. ستاسې IP پته به د دې مخ د سمونونو په پېښليک کې ثبت شي.",
        "anonpreviewwarning": "''تاسې غونډال ته نه ياست ننوتي. خوندي کولو سره به ستاسې IP پته به د دې مخ د سمونونو په پېښليک کې ثبت شي.''",
        "edit-gone-missing": "د دې مخ اوسمهالول و نه کړای شول.\nداسې ښکاري چې دا مخ ړنگ شوی.",
        "edit-conflict": "د سمولو خنډ",
        "edit-no-change": "ستاسې سمون بابېزه وګڼل شو، دا ځکه چې تاسې په متن کې کوم بدلون نه دی راوستلی.",
-       "postedit-confirmation": "ستاسې سمون خوندي شو.",
+       "postedit-confirmation-saved": "ستاسې سمون خوندي شو.",
        "edit-already-exists": "په دې نوم يو نوی مخ جوړ نه شو.\nپدې نوم د پخوا نه يو مخ شته.",
        "defaultmessagetext": "تلواليزه پيغام متن",
        "content-model-wikitext": "ويکي متن",
        "search-nonefound": "ستاسې دغوښتنې اړونده پايلې و نه موندل شوې.",
        "powersearch-legend": "ژوره پلټنه",
        "powersearch-ns": "په نوم-تشيالونو کې پلټنه:",
-       "powersearch-redir": "مخ گرځونې په لړليک کې اوډل",
        "powersearch-togglelabel": "نښه کول:",
        "powersearch-toggleall": "ټول",
        "powersearch-togglenone": "هېڅ",
        "prefs-advancedsearchoptions": "پرمختللې خوښنې",
        "prefs-advancedwatchlist": "پرمختللې خوښنې",
        "prefs-displayrc": "د ښکارېدو خوښنې",
-       "prefs-displaysearchoptions": "د ښکارېدنې خوښنې",
        "prefs-displaywatchlist": "د ښکارېدنې خوښنې",
        "prefs-diffs": "توپيرونه",
        "email-address-validity-valid": "برېښليک پته سمه ښکاري",
        "recentchanges-legend-heading": "'''لنډونونه:'''",
        "recentchanges-legend-newpage": "([[Special:NewPages|د نويو مخونو لړليک]] هم وگورئ)",
        "rcnotefrom": "دلته لاندې د <strong>$2</strong> څخه راپدېخوا پېښ شوي بدلونونه راغلي (تر <strong>$1</strong> پورې ښکاري).",
-       "rclistfrom": "هغه نوي بدلونونه ښکاره کول چې له $1 نه پيلېږي",
+       "rclistfrom": "هغه نوي بدلونونه ښکاره کول چې له $3 $2 نه پيلېږي",
        "rcshowhideminor": "وړې سمونې $1",
        "rcshowhideminor-show": "ښکاره کول",
        "rcshowhideminor-hide": "پټول",
        "filestatus": "د رښتو دريځ:",
        "filesource": "سرچينه:",
        "ignorewarning": "گواښنه بې پامه گڼل او دوتنه خوندي کول",
-       "ignorewarnings": "Ù\87ر Ú\89Ù\88Ù\84 Ú«واښونه له پامه غورځول",
+       "ignorewarnings": "Ù\87ر Ú\89Ù\88Ù\84 Ú¯واښونه له پامه غورځول",
        "minlength1": "پکار ده چې د دوتنو نومونه لږ تر لږه يو حرف ولري.",
        "illegalfilename": "د دوتنې نوم \"$1\" په داسې تورو ليکلی دی چې د یو مخ د سرليک په توگه يې پرېښه نه ده شوې.\nمهرباني وکړۍ د دوتنې نوم مو بدل کړۍ او بيا مو د دوتنې د پورته کولو هڅه وکړۍ.",
        "badfilename": "ددغې دوتنې نوم \"$1\" ته واوړېده.",
        "fileexists": "د پخوا نه پدې نوم يوه دوتنه شته، که تاسو ډاډه نه ياست او يا هم که تاسو غواړۍ چې بدلون پکې راولۍ، لطفاً <strong>[[:$1]]</strong> وگورۍ.\n[[$1|بټنوک]]",
        "fileexists-extension": "په همدې نوم يوه بله دوتنه د پخوا نه شته: [[$2|thumb]]\n* د پورته کېدونکې دوتنې نوم: <strong>[[:$1]]</strong>\n* د پخوا نه شته دوتنه: <strong>[[:$2]]</strong>\nلطفاً يو داسې نوم وټاکی چې د پخوانۍ دوتنې سره توپير ولري.",
        "fileexists-forbidden": "د پخوا نه پدې نوم يوه دوتنه شته، او په دې نوم بله دوتنه نه پورته کېږي.\nکه تاسې بيا هم د خپلې دوتنې پورته کول غواړۍ، نو لطفاً بېرته وګرځۍ او همدغه دوتنه بيا په يوه نوي نوم پورته کړی.\n[[File:$1|thumb|center|$1]]",
-       "file-exists-duplicate": "Ù\87Ù\85دا Ø¯Ù\88تÙ\86Ù\87 Ø¯ {{PLURAL:$1|Ù\84اÙ\86دÙ\8aÙ\86Û\8d Ø¯Ù\88تÙ\86Û\90\84اÙ\86دÙ\8aÙ\86Ù\8aÙ\88 Ø¯Ù\88تÙ\86Ù\88}} ØºØ¨Ø±Ú«ه لمېسه ده:",
-       "uploadwarning": "د Ù¾Ù\88رتÙ\87 Ú©Ù\88Ù\84Ù\88 Ú«واښ",
+       "file-exists-duplicate": "Ù\87Ù\85دا Ø¯Ù\88تÙ\86Ù\87 Ø¯ {{PLURAL:$1|Ù\84اÙ\86دÙ\8aÙ\86Û\8d Ø¯Ù\88تÙ\86Û\90\84اÙ\86دÙ\8aÙ\86Ù\8aÙ\88 Ø¯Ù\88تÙ\86Ù\88}} ØºØ¨Ø±Ú¯ه لمېسه ده:",
+       "uploadwarning": "د Ù¾Ù\88رتÙ\87 Ú©Ù\88Ù\84Ù\88 Ú¯واښ",
        "savefile": "دوتنه خوندي کړه",
        "uploadedimage": "\"[[$1]]\" پورته شوه",
        "uploaddisabled": "پورته کول ناچارن شوي",
        "watchthisupload": "همدا دوتنه کتل",
        "upload-success-subj": "دوتنه پورته کېدل په برياليتوب سره ترسره شو",
        "upload-failure-subj": "د پورته کېدو ستونزه",
-       "upload-warning-subj": "د Ù¾Ù\88رتÙ\87 Ú©Ù\88Ù\84Ù\88 Ú«واښ",
+       "upload-warning-subj": "د Ù¾Ù\88رتÙ\87 Ú©Ù\88Ù\84Ù\88 Ú¯واښ",
        "upload-proto-error": "ناسم پروتوکول",
        "upload-file-error": "کورنۍ ستونزه",
        "upload-http-error": "د HTTP يوه ستونزه رامېنځ ته شوې: $1",
        "log-title-wildcard": "هغه سرليکونه پلټل چې په دې متن پيلېږي",
        "showhideselectedlogentries": "د ټاکلو يادښتونو ښکارېدنه بدلول",
        "allpages": "ټول مخونه",
-       "alphaindexline": "$1 تر $2",
        "nextpage": "بل مخ ($1)",
        "prevpage": "تېر مخ ($1)",
        "allpagesfrom": "هغه مخونه کتل چې پېلېږي په:",
        "watchlist-details": "ستاسې کتنلړ کې {{PLURAL:$1|$1 مخ دی|$1 مخونه دي}}، د خبرو اترو مخونه مو بېل نه دي شمېرلي.",
        "wlheader-enotif": "برېښليک خبرونه چارنه شوې.",
        "wlheader-showupdated": "هغه مخونه چې ستاسې د کتلو نه وروسته بدلون موندلی په '''روڼ''' ليک په نښه شوي.",
-       "watchlistcontains": "ستاسې کتنلړ $1 {{PLURAL:$1|مخ|مخونه}} لري.",
-       "iteminvalidname": "د '$1' توکي سره ستونزه، ناسم نوم ...",
        "wlshowlast": "وروستي $1 ساعتونه $2 ورځې $3 ښکاره کړه",
        "watchlist-options": "د کتنلړ خوښنې",
        "watching": "د کتلو په حال کې...",
        "enotif_lastvisited": "د ټولو هغو بدلونونو د کتلو لپاره چې ستاسې د وروستي ځل راتگ نه وروسته پېښې شوي، $1 وگورۍ.",
        "enotif_lastdiff": "د همدغه بدلون د کتلو لپاره $1 وگورۍ.",
        "enotif_anon_editor": "ورکنومی کارن $1",
-       "enotif_body": "قدرمن/قدرمنې $WATCHINGUSERNAME,\n\n\nپه $PAGEEDITDATE نېټه، د  $PAGEEDITOR لخوا د {{SITENAME}} مخ $PAGETITLE ته $CHANGEDORCREATED، د اوسنۍ بڼې لپاره $PAGETITLE_URL وگورۍ.\n\n$NEWPAGE\n\nد سمونگر لنډيز: $PAGESUMMARY $PAGEMINOREDIT\n\nContact the editor:\nبرېښليک: $PAGEEDITOR_EMAIL\nويکي: $PAGEEDITOR_WIKI\n\nد لا نورو بدلونونو په پېښېدو سره به تاسې ته د خبراوي بل برېښليک نه درلېږل کېږي، تر څو چې تاسې د همدې مخ نه کتنه و نه کړۍ.\nتاسې دا هم کولای شی چې په خپل کتنلړ کې د ټولو کتل شويو مخونو د خبراوي بيرغونه بيا له سره پرځای کړۍ.\n\n             ستاسې ملگری\n\nد {{SITENAME}} د خبرولو غونډال\n\n--\nد خپل کتنلړ د امستنو د بدلون لپاره،\n{{canonicalurl:{{#special:EditWatchlist}}}} نه ليدنه وکړۍ\n\nد خپل کتنلړ د مخونو د ړنگولو لپاره،\n$UNWATCHURL  نه ليدنه وکړۍ\n\nانگېرنې او نورې مرستې:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "قدرمن/قدرمنې $WATCHINGUSERNAME,\n\n\nپه $PAGEEDITDATE نېټه، د  $PAGEEDITOR لخوا د {{SITENAME}} مخ $PAGETITLE ته $CHANGEDORCREATED، د اوسنۍ بڼې لپاره $PAGETITLE_URL وگورۍ.\n\n$NEWPAGE\n\nد سمونگر لنډيز: $PAGESUMMARY $PAGEMINOREDIT\n\nContact the editor:\nبرېښليک: $PAGEEDITOR_EMAIL\nويکي: $PAGEEDITOR_WIKI\n\nد لا نورو بدلونونو په پېښېدو سره به تاسې ته د خبراوي بل برېښليک نه درلېږل کېږي، تر څو چې تاسې د همدې مخ نه کتنه و نه کړۍ.\nتاسې دا هم کولای شی چې په خپل کتنلړ کې د ټولو کتل شويو مخونو د خبراوي بيرغونه بيا له سره پرځای کړۍ.\n\n             ستاسې ملگری\n\nد {{SITENAME}} د خبرولو غونډال\n\n--\nد خپل کتنلړ د امستنو د بدلون لپاره،\n{{canonicalurl:{{#special:EditWatchlist}}}} نه ليدنه وکړۍ\n\nد خپل کتنلړ د مخونو د ړنگولو لپاره،\n$UNWATCHURL  نه ليدنه وکړۍ\n\nانگېرنې او نورې مرستې:\n$HELPPAGE",
        "created": "جوړ شو",
        "changed": "بدلېدلی",
        "deletepage": "مخ ړنگول",
        "unblock": "کارن له بنديزه وېستل",
        "blockip": "په کارن بنديز لگول",
        "blockip-legend": "په کارن بنديز لگول",
-       "ipadressorusername": "IP پته يا کارن نوم",
+       "ipaddressorusername": "IP پته يا کارن نوم",
        "ipbexpiry": "د پای نېټه:",
        "ipbreason": "سبب:",
        "ipbreason-dropdown": "*د بنديز ټولگړي سببونه\n** د ناسمو مالوماتو خپرول\n** د مخونو د مېنځپانگې ړنگول\n** په مخونو کې د باندنيو وېبځايونو بېکاره سپام تړنې ځايول\n** په مخونو کې بې مانا/چټياټ ځايول\n** په مخونو کې ناندرۍ راپارېدنې/د تاوتريخوالي خپرېدو ته هڅول\n** د گڼ شمېر گڼونونو نه ناوړه گټه اخيستل\n** نه مننونکی کارن-نوم کارول",
        "newimages-summary": "همدا ځانگړی مخ، وروستنۍ پورته شوې دوتنې ښکاره کوي.",
        "newimages-legend": "چاڼگر",
        "newimages-label": "د دوتنې نوم (يا د دې برخه):",
-       "showhidebots": "($1 روباټ)",
        "noimages": "د کتلو لپاره څه نشته.",
        "ilsubmit": "پلټل",
        "bydate": "د نېټې له مخې",
        "size-exabytes": "$1 اېکسبي بايټ",
        "size-zetabytes": "$1 زېبي بايټ",
        "size-yottabytes": "$1 يوبي بايټ",
-       "livepreview-loading": "برسېرېدنې کې دی...",
-       "livepreview-ready": "برسېرېدنه ... چمتو ده!",
-       "watchlistedit-noitems": "ستاسې کتنلړ کې هېڅ کوم سرليک نشته.",
        "watchlistedit-normal-title": "کتنلړ سمول",
        "watchlistedit-normal-legend": "د کتنلړ نه سرليکونه لرې کول",
        "watchlistedit-normal-submit": "سرليکونه لرې کول",
        "compare-rev1": "۱ بڼه",
        "compare-rev2": "۲ بڼه",
        "compare-submit": "پرتلل",
-       "dberr-header": "دا ويکي يوه ستونزه لري",
        "dberr-problems": "اوبخښۍ! دم مهال دا وېبپاڼه د تخنيکي ستونزو سره مخامخ شوې.",
        "dberr-usegoogle": "تاسې کولای شی چې هم مهاله د گووگل له لخوا هم د پلټنې هڅه وکړۍ.",
        "htmlform-invalid-input": "ستاسې ځينې ورکړېينې ستونزې لري",
index 7ec8f3f..9593b2b 100644 (file)
@@ -70,7 +70,8 @@
                        "Yves Marques Junqueira",
                        "לערי ריינהארט",
                        "555",
-                       "Fabsouza1"
+                       "Fabsouza1",
+                       "아라"
                ]
        },
        "tog-underline": "Sublinhar links:",
        "readonly_lag": "O banco de dados foi automaticamente bloqueado enquanto os servidores secundários se sincronizam com o principal",
        "internalerror": "Erro interno",
        "internalerror_info": "Erro interno: $1",
-       "fileappenderrorread": "Não foi possível ler \"$1\" durante a anexação.",
-       "fileappenderror": "Não foi possível adicionar \"$1\" a \"$2\".",
        "filecopyerror": "Não foi possível copiar o arquivo \"$1\" para \"$2\".",
        "filerenameerror": "Não foi possível renomear o arquivo \"$1\" para \"$2\".",
        "filedeleteerror": "Não foi possível eliminar o arquivo \"$1\".",
        "directorycreateerror": "Não foi possível criar o diretório \"$1\".",
        "filenotfound": "Não foi possível encontrar o arquivo \"$1\".",
-       "fileexistserror": "Não foi possível escrever no arquivo \"$1\": ele já existe",
        "unexpected": "Valor não esperado: \"$1\"=\"$2\".",
        "formerror": "Erro: Não foi possível enviar o formulário",
        "badarticleerror": "Esta ação não pode ser realizada nesta página.",
        "userlogin-helplink2": "Ajuda com o login",
        "userlogin-loggedin": "Você já está conectado como {{GENDER:$1|$1}}.\nUse o formulário abaixo para iniciar sessão como outro usuário.",
        "userlogin-createanother": "Crie uma outra conta",
-       "createacct-join": "Insira suas informações abaixo.",
-       "createacct-another-join": "Preeencha as informações para a nova conta",
        "createacct-emailrequired": "Endereço de e-mail",
        "createacct-emailoptional": "Endereço de e-mail (opcional)",
        "createacct-email-ph": "Confirme seu endereço de e-mail",
        "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": "Logado",
+       "pt-login-button": "Entrar",
        "pt-createaccount": "Crie uma conta",
        "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.",
        "savearticle": "Salvar página",
        "preview": "Pré-visualização",
        "showpreview": "Mostrar previsão",
-       "showlivepreview": "Pré-visualização em tempo real",
        "showdiff": "Mostrar alterações",
        "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.''",
        "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": "Sua edição foi salva",
+       "postedit-confirmation-saved": "Sua edição foi salva",
        "edit-already-exists": "Não foi possível criar uma nova página.\nEla já existia.",
        "defaultmessagetext": "Texto da mensagem padrão",
        "content-failed-to-parse": "Falha ao analisar o conteúdo $2 para o modelo $1: $3",
        "revdelete-text-text": "Revisões apagadas continuarão a aparecer na página de histórico, mas parte de seus conteúdos estarão inacessíveis ao público.",
        "revdelete-text-file": "Versões dos arquivos apagados continuarão a aparecer no arquivo de histórico, mas parte de seus conteúdos estarão inacessíveis ao público.",
        "logdelete-text": "Eventos de log apagados continuarão a aparecer nos logs, mas parte de seus conteúdos estarão inacessíveis ao público.",
-       "revdelete-text-others": "Outros administradores do {{SITENAME}} continuarão sendo capazes de acessar o conteúdo oculto e desocultá-lo pela mesma interface, a menos que restrições adicionais tenham sido feitas.",
+       "revdelete-text-others": "Outros administradores do site {{SITENAME}} continuarão capazes de acessar o conteúdo oculto e podem apagá-lo pela mesma interface, a menos que restrições adicionais tenham sido feitas.",
        "revdelete-confirm": "Por favor confirme que pretende executar esta ação, que compreende as suas consequências e que o faz em concordância com as [[{{MediaWiki:Policy-url}}|políticas e recomendações]].",
        "revdelete-suppress-text": "A supressão deverá ser usada '''apenas''' para os seguintes casos:\n* Informação potencialmente difamatória\n* Informação pessoal inapropriada\n*: ''endereços de domicílio e números de telefone, números da segurança social, etc''",
        "revdelete-legend": "Definir restrições de visualização",
        "searchmenu-exists": "<strong>Há uma página com o nome \"[[:$1]]\" neste wiki.</strong> {{PLURAL:$2|0=|Veja também os outros resultados da pesquisa encontrados.}}",
        "searchmenu-new": "<strong>Criar a página \"[[:$1]]\" nesta wiki!</strong>{{PLURAL:$2|0=| Veja também a página encontrada com sua pesquisa.|Veja também os resultados das pesquisas encontradas.}}",
        "searchprofile-articles": "Páginas de conteúdo",
-       "searchprofile-project": "Ajuda e páginas de projeto",
        "searchprofile-images": "Multimídia",
        "searchprofile-everything": "Tudo",
        "searchprofile-advanced": "Avançado",
        "searchprofile-articles-tooltip": "Pesquisar em $1",
-       "searchprofile-project-tooltip": "Pesquisar em $1",
        "searchprofile-images-tooltip": "Pesquisar arquivos",
        "searchprofile-everything-tooltip": "Pesquisar em todo o conteúdo (incluindo páginas de discussão)",
        "searchprofile-advanced-tooltip": "Personalizar os espaços nominais onde pesquisar",
        "search-nonefound": "Não há resultados que correspondam à consulta.",
        "powersearch-legend": "Pesquisa avançada",
        "powersearch-ns": "Pesquisar nos espaços nominais:",
-       "powersearch-redir": "Listar redirecionamentos",
        "powersearch-togglelabel": "Selecionar:",
        "powersearch-toggleall": "Todos",
        "powersearch-togglenone": "Nenhum",
        "prefs-emailconfirm-label": "Confirmação do e-mail:",
        "youremail": "Seu e-mail:",
        "username": "Nome de {{GENDER:$1|usuário|usuária}}:",
-       "uid": "ID de {{GENDER:$1|usuário|usuária}}:",
        "prefs-memberingroups": "{{GENDER:$2|Membro}} {{PLURAL:$1|do grupo|dos grupos}}:",
        "prefs-registration": "Hora de registro:",
        "yourrealname": "Nome verdadeiro:",
        "prefs-advancedsearchoptions": "Opções avançadas",
        "prefs-advancedwatchlist": "Opções avançadas",
        "prefs-displayrc": "Opções de exibição",
-       "prefs-displaysearchoptions": "Opções de exibição",
        "prefs-displaywatchlist": "Opções de exibição",
        "prefs-tokenwatchlist": "Senha",
        "prefs-diffs": "Diferenças",
        "recentchanges-legend-heading": "'''Legenda''':",
        "recentchanges-legend-newpage": "(veja também a [[Special:NewPages|lista de páginas novas]])",
        "recentchanges-legend-plusminus": "(''±123'')",
-       "rcnotefrom": "Abaixo estão mostradas as alterações de <strong>$2</strong> (até <strong>$1</strong>).",
-       "rclistfrom": "Mostrar as novas alterações a partir das $1",
+       "rcnotefrom": "Abaixo estão mostradas as alterações desde <strong>$2</strong> (até <strong>$1</strong>).",
+       "rclistfrom": "Mostrar as novas alterações a partir das $3 $2",
        "rcshowhideminor": "$1 edições menores",
        "rcshowhideminor-show": "Exibir",
        "rcshowhideminor-hide": "Ocultar",
        "uploadstash-refresh": "Atualizar a lista de arquivos",
        "invalid-chunk-offset": "Deslocamento de fragmento inválido",
        "img-auth-accessdenied": "Acesso negado",
-       "img-auth-nopathinfo": "PATH_INFO em falta.\nO seu servidor não está configurado para passar esta informação.\nPode ser baseado em CGI e não consegue suportar img_auth.\nConsulte a documentação em [//www.mediawiki.org/wiki/Manual:Image_Authorization Image Authorization].",
+       "img-auth-nopathinfo": "PATH_INFO em falta.\nO seu servidor não está configurado para passar esta informação.\nPode ser baseado em CGI e não consegue suportar img_auth.\nConsulte a documentação em [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization Image Authorization].",
        "img-auth-notindir": "O caminho solicitado não está no diretório configurado para envios.",
        "img-auth-badtitle": "Não é possível criar um título válido a partir de \"$1\".",
        "img-auth-nologinnWL": "Você não está logado e \"$1\" não está na lista branca.",
        "pageswithprop-prophidden-binary": "Valor de propriedade binária oculta ($1)",
        "doubleredirects": "Redirecionamentos duplos",
        "doubleredirectstext": "Esta página lista as páginas que redirecionam para outros redirecionamentos.\nCada linha contém links para o primeiro e o segundo redirecionamentos, juntamente com o alvo do segundo redirecionamento, que é geralmente a verdadeira página de destino, para a qual o primeiro redirecionamento deveria apontar.\nEntradas <del>riscadas</del> foram resolvidas.",
-       "double-redirect-fixed-move": "[[$1]] foi movido e agora é um redirecionamento para [[$2]]",
-       "double-redirect-fixed-maintenance": "Corrigindo redirecionamento duplo de [[$1]] para [[$2]].",
+       "double-redirect-fixed-move": "[[$1]] foi movido\nEle foi atualizado automaticamente e agora é um redirecionamento para [[$2]]",
+       "double-redirect-fixed-maintenance": "Corrigindo automaticamente o redirecionamento duplo de [[$1]] para [[$2]] em uma tarefa de manutenção.",
        "double-redirect-fixer": "Corretor de redirecionamentos",
        "brokenredirects": "Redirecionamentos quebrados",
        "brokenredirectstext": "Os seguintes redirecionamentos ligam para páginas inexistentes:",
        "log-title-wildcard": "Procurar por títulos que sejam iniciados com o seguinte texto",
        "showhideselectedlogentries": "Exibir/ocultar os itens de registros selecionados",
        "allpages": "Todas as páginas",
-       "alphaindexline": "De $1 até $2",
        "nextpage": "Próxima página ($1)",
        "prevpage": "Página anterior ($1)",
        "allpagesfrom": "Primeira página na listagem:",
        "emailuser": "Enviar-lhe um e-mail",
        "emailuser-title-target": "Enviar e-mail para {{GENDER:$1|este usuário|esta usuária}}",
        "emailuser-title-notarget": "Enviar e-mail",
-       "emailpage": "Contactar usuário",
+       "emailpage": "Enviar e-mail ao usuário",
        "emailpagetext": "Você pode usar o formulário a seguir para enviar um e-mail para {{GENDER:$1|este usuário|esta usuária}}.\nO endereço de e-mail que você inseriu em [[Special:Preferences|suas preferências de usuário]] irá aparecer como o endereço do remetente da mensagem, com o destinatário podendo responder diretamente para você.",
        "defemailsubject": "E-mail do usuário \"$1\" da {{SITENAME}}",
        "usermaildisabled": "O e-mail do usuário foi desativado",
        "emailccsubject": "Cópia de sua mensagem para $1: $2",
        "emailsent": "E-mail enviado",
        "emailsenttext": "Sua mensagem foi enviada.",
-       "emailuserfooter": "Este e-mail foi enviado por $1 para $2 através da opção de \"contactar usuário\" da {{SITENAME}}.",
+       "emailuserfooter": "Este e-mail foi enviado por $1 para $2 através da opção de \"enviar e-mail ao usuário\" da {{SITENAME}}.",
        "usermessage-summary": "Deixar mensagem de sistema.",
        "usermessage-editor": "Mensagens de sistema",
        "watchlist": "Páginas vigiadas",
        "watchlist-details": "{{PLURAL:$1|$1 página|$1 páginas}} na sua lista de páginas vigiadas, excluindo páginas de discussão.",
        "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'''",
-       "watchmethod-recent": "verificando edições recentes para as páginas vigiadas",
-       "watchmethod-list": "verificando páginas vigiadas para edições recentes",
-       "watchlistcontains": "Sua lista de páginas vigiadas contém $1 {{PLURAL:$1|página|páginas}}.",
-       "iteminvalidname": "Problema com item '$1', nome inválido...",
        "wlnote2": "A seguir estão as mudanças nas últimas {{PLURAL:$1|hora|<strong>$1</strong> horas}}, a partir de $2, $3.",
        "wlshowlast": "Ver últimas $1 horas $2 dias $3",
        "watchlist-options": "Opções da lista de páginas vigiadas",
        "enotif_lastvisited": "Consulte $1 para todas as alterações efetuadas desde a sua última visita.",
        "enotif_lastdiff": "Acesse $1 para ver esta alteração.",
        "enotif_anon_editor": "usuário anônimo $1",
-       "enotif_body": "{{GENDER:$WATCHINGUSERNAME|Caro|Cara|Caro(a)}},\n\n$PAGEINTRO $NEWPAGE\n\nResumo do editor: $PAGESUMMARY $PAGEMINOREDIT\n\nContate o editor:\ne-mail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nAté que visite esta página, você não receberá mais notificações das alterações futuras.\nVocê pode também reativar as notificações para todas páginas na sua lista de páginas vigiadas.\n\nO seu sistema de notificação amigável da {{SITENAME}}\n\n--\nPara alterar as suas preferências das notificações por correio electrônico, visite\n{{canonicalurl:{{#special:Preferences}}}}\n\nPara alterar as suas preferências das páginas vigiadas, visite\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPara retirar a página da lista de páginas vigiadas, visite\n$UNWATCHURL\n\nPara comentários e pedidos de ajuda:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "{{GENDER:$WATCHINGUSERNAME|Caro|Cara|Caro(a)}},\n\n$PAGEINTRO $NEWPAGE\n\nResumo do editor: $PAGESUMMARY $PAGEMINOREDIT\n\nContate o editor:\ne-mail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nAté que visite esta página, você não receberá mais notificações das alterações futuras.\nVocê pode também reativar as notificações para todas páginas na sua lista de páginas vigiadas.\n\nO seu sistema de notificação amigável da {{SITENAME}}\n\n--\nPara alterar as suas preferências das notificações por correio electrônico, visite\n{{canonicalurl:{{#special:Preferences}}}}\n\nPara alterar as suas preferências das páginas vigiadas, visite\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPara retirar a página da lista de páginas vigiadas, visite\n$UNWATCHURL\n\nPara comentários e pedidos de ajuda:\n$HELPPAGE",
        "created": "criada",
        "changed": "alterada",
        "deletepage": "Eliminar página",
        "sp-contributions-search": "Navegar pelas contribuições",
        "sp-contributions-username": "Endereço de IP ou usuário:",
        "sp-contributions-toponly": "Mostrar somente as edições que sejam a última alteração",
-       "sp-contributions-newonly": "Mostre somente as edições que criaram uma nova página.",
+       "sp-contributions-newonly": "Mostrar somente as edições que criaram uma nova página.",
        "sp-contributions-submit": "Pesquisar",
        "whatlinkshere": "Páginas afluentes",
        "whatlinkshere-title": "Páginas que têm links para \"$1\"",
        "blockip": "Bloquear usuário",
        "blockip-legend": "Bloquear usuário",
        "blockiptext": "Utilize o formulário abaixo para bloquear o acesso à escrita de um endereço específico de IP ou nome de usuário.\nIsto só deve ser feito para prevenir vandalismo, e de acordo com a [[{{MediaWiki:Policy-url}}|política]]. Preencha com um motivo específico a seguir (por exemplo, citando páginas que sofreram vandalismo).",
-       "ipadressorusername": "Endereço de IP ou nome de usuário:",
+       "ipaddressorusername": "Endereço de IP ou nome de usuário:",
        "ipbexpiry": "Expiração:",
        "ipbreason": "Motivo:",
        "ipbreason-dropdown": "*Razões comuns para um bloqueio\n** Inserindo informações falsas\n** Removendo o conteúdo de páginas\n** Fazendo \"spam\" de sítios externos\n** Inserindo conteúdo sem sentido/incompreensível nas páginas\n** Comportamento intimidador/inoportuno\n** Uso abusivo de contas múltiplas\n** Nome de usuário inaceitável",
        "blockipsuccesssub": "Bloqueio bem sucedido",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] foi {{GENDER:$1|bloqueado|bloqueada}}.<br />\nConsulte a [[Special:BlockList|lista de bloqueios]].",
        "ipb-blockingself": "Você está prestes a bloquear-se a si próprio. Você tem a certeza de que pretende fazê-lo?",
-       "ipb-confirmhideuser": "Você está prestes a bloquear um utilizador com \"Ocultar nome de utilizador/IP\" ativado. Isto irá suprimir o nome do usuário de todas as listas e entradas dos registos. Tem a certeza de que pretende fazê-lo?",
+       "ipb-confirmhideuser": "Você está prestes a bloquear um usuário com \"Ocultar nome de usuário/IP\" ativado. Isto irá suprimir o nome do usuário de todas as listas e entradas dos registos. Tem a certeza de que pretende fazê-lo?",
        "ipb-confirmaction": "Se você tem certeza que realmente quer fazer isto, por favor verifique o campo \"{{int:ipb-confirm}}\" no final.",
        "ipb-edit-dropdown": "Editar motivos de bloqueio",
        "ipb-unblock-addr": "Desbloquear $1",
        "contribslink": "contribs",
        "emaillink": "enviar um e-mail",
        "autoblocker": "Você foi automaticamente bloqueado, pois o seu Endereço IP foi recentemente usado por \"[[User:$1|$1]]\". \nO motivo apresentado para o bloqueio de $1 é: \"$2\".",
-       "blocklogpage": "Registro de bloqueio",
+       "blocklogpage": "Registro de bloqueios",
        "blocklog-showlog": "Este usuário já foi bloqueado anteriormente.\nO registro de bloqueio é fornecido abaixo, para referência:",
        "blocklog-showsuppresslog": "O usuário foi bloqueado e ocultado anteriormente.\nO registro de supressão é fornecido abaixo para referência:",
        "blocklogentry": "bloqueou \"[[$1]]\" por $2. $3",
        "movepage-moved-noredirect": "A criação de um redirecionamento foi suprimida.",
        "articleexists": "Uma página com este título já existe, ou o título que escolheu é inválido.\nPor favor, escolha outro nome.",
        "cantmove-titleprotected": "Você não pode mover uma página para tal denominação uma vez que o novo título se encontra protegido contra criação",
-       "movetalk": "Mover também a página de discussão associada.",
+       "movetalk": "Mover também a página de discussão associada",
        "move-subpages": "Mover subpáginas (até $1)",
        "move-talk-subpages": "Mover subpáginas da página de discussão (até $1)",
        "movepage-page-exists": "A página $1 já existe e não pode ser substituída.",
        "common.css": "/** o código CSS colocado aqui será aplicado a todos os temas */",
        "monobook.css": "/* o código CSS colocado aqui terá efeito nos usuários do tema Monobook */",
        "common.js": "/* Códigos JavaScript aqui colocados serão carregados por todos aqueles que acessarem alguma página deste wiki */",
-       "cologneblue.js": "/* Qualquer JavaScript aqui colocado afetará os usuários do skin Azul colonial */",
        "monobook.js": "/* Qualquer JavaScript aqui colocado afetará os usuários do skin MonoBook */",
-       "modern.js": "/* Qualquer JavaScript aqui colocado afetará os usuários do skin Moderno */",
        "vector.js": "/* Qualquer JavaScript aqui colocado afetará os usuários do skin Vector */",
-       "notacceptable": "O servidor não pode fornecer os dados em um formato que o seu cliente possa ler.",
        "anonymous": "{{PLURAL:$1|Usuário anônimo|Usuários anônimos}} da {{SITENAME}}",
-       "siteuser": "{{GENDER:$2|um utilizador|uma utilizadora|um utilizador}} da {{SITENAME}} ($1)",
+       "siteuser": "{{GENDER:$2|um usuário|uma usuária|um usuário}} da {{SITENAME}} ($1)",
        "anonuser": "usuário anônimo $1 da {{SITENAME}}",
        "lastmodifiedatby": "Esta página foi modificada pela última vez à(s) $2 de $1 por $3.",
        "othercontribs": "Baseado no trabalho de $1.",
        "pageinfo-category-pages": "Número de páginas",
        "pageinfo-category-subcats": "Número de subcategorias",
        "pageinfo-category-files": "Número de arquivos",
-       "skinname-cologneblue": "Azul colonial",
        "skinname-monobook": "MonoBook",
-       "skinname-modern": "Moderno",
        "markaspatrolleddiff": "Marcar como patrulhada",
        "markaspatrolledtext": "Marcar esta página como patrulhada",
        "markedaspatrolled": "Marcado como verificado",
        "newimages-summary": "Esta página especial mostra os arquivos mais recentemente enviados",
        "newimages-legend": "Filtrar",
        "newimages-label": "Nome de arquivo (ou parte dele):",
-       "showhidebots": "($1 robôs)",
        "noimages": "Nada para ver.",
        "ilsubmit": "Pesquisar",
        "bydate": "por data",
        "autosumm-replace": "Página substituída por '$1'",
        "autoredircomment": "Redirecionando para [[$1]]",
        "autosumm-new": "Criou página com '$1'",
-       "livepreview-loading": "Carregando…",
-       "livepreview-ready": "Carregando… Pronto!",
-       "livepreview-failed": "A previsão instantânea falhou!\nTente a previsão comum.",
-       "livepreview-error": "Falha ao conectar: $1 \"$2\"\nTente a previsão comum.",
        "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-numitems": "A sua lista de páginas vigiadas possui {{PLURAL:$1|um título|$1 títulos}}, além das respectivas páginas de discussão.",
-       "watchlistedit-noitems": "A sua lista de páginas vigiadas não possui títulos.",
        "watchlistedit-normal-title": "Editar lista de páginas vigiadas",
        "watchlistedit-normal-legend": "Remover títulos da lista de páginas vigiadas",
        "watchlistedit-normal-explain": "Os títulos das páginas de sua lista de vigiadas são exibidos abaixo.\nPara remover um título, marque a caixa ao lado do mesmo e clique \"{{int:Watchlistedit-normal-submit}}\".\nVocê pode também [[Special:EditWatchlist/raw|editar a lista de páginas vigiadas em forma de texto]].",
        "compare-invalid-title": "O título que você especificou é inválido.",
        "compare-title-not-exists": "O título que você especificou não existe.",
        "compare-revision-not-exists": "A revisão que você especificou não existe.",
-       "dberr-header": "Este wiki tem um problema",
        "dberr-problems": "Desculpe! Este sítio está passando por dificuldades técnicas.",
        "dberr-again": "Experimente esperar alguns minutos e atualizar.",
-       "dberr-info": "(Não foi possível contactar o servidor de base de dados: $1)",
+       "dberr-info": "(Não foi possível contatar o servidor de base de dados: $1)",
        "dberr-info-hidden": "(Não foi possível contatar o banco de dados do servidor)",
        "dberr-usegoogle": "Você pode tentar pesquisar no Google entretanto.",
        "dberr-outofdate": "Note que os seus índices relativos ao nosso conteúdo podem estar desatualizados.",
        "logentry-move-move": "$1 moveu a página $3 para $4",
        "logentry-move-move-noredirect": "$1 moveu a página $3 para $4 sem deixar um redirecionamento",
        "logentry-move-move_redir": "$1 moveu a página $3 para $4 através de um redirecionamento",
-       "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|moveu}} a página $3 para $4 sem um redirecionamento",
+       "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|moveu}} a página $3 para $4 sobre um redirecionamento sem deixar um redirecionamento",
        "logentry-patrol-patrol": "$1 {{GENDER:$2|marcou}} a revisão $4 da página $3 como patrulhada",
        "logentry-patrol-patrol-auto": "$1 {{GENDER:$2|marcou}} automaticamente a revisão $4 da página $3 como patrulhada",
        "logentry-newusers-newusers": "A conta de usuário $1 foi {{GENDER:$2|criada}}",
index da4f0e9..663a782 100644 (file)
@@ -59,7 +59,8 @@
                        "Waldir",
                        "Yves Marques Junqueira",
                        "לערי ריינהארט",
-                       "555"
+                       "555",
+                       "아라"
                ]
        },
        "tog-underline": "Sublinhar ligações:",
        "navigation-heading": "Menu de navegação",
        "errorpagetitle": "Erro",
        "returnto": "Voltar para $1.",
-       "tagline": "Da {{SITENAME}}",
+       "tagline": "De {{SITENAME}}",
        "help": "Ajuda",
        "search": "Pesquisa",
        "searchbutton": "Pesquisar",
        "edit": "Editar",
        "edit-local": "Editar descrição local",
        "create": "Criar",
+       "create-local": "Adicionar descrição do local",
        "editthispage": "Editar esta página",
        "create-this-page": "Criar esta página",
        "delete": "Eliminar",
        "viewhelppage": "Ver página de ajuda",
        "categorypage": "Ver página da categoria",
        "viewtalkpage": "Ver discussão",
-       "otherlanguages": "Noutras línguas",
+       "otherlanguages": "Noutros idiomas",
        "redirectedfrom": "(Redireccionado de $1)",
        "redirectpagesub": "Página de redirecionamento",
        "lastmodifiedat": "Esta página foi modificada pela última vez à(s) $2 de $1.",
        "jumptonavigation": "navegação",
        "jumptosearch": "pesquisa",
        "view-pool-error": "Desculpe, mas de momento os servidores estão sobrecarregados.\nHá demasiados utilizadores a tentar visionar esta página.\nEspere um pouco antes de tentar aceder à página novamente, por favor.\n\n$1",
+       "generic-pool-error": "Desculpe, os servidores estão sobrecarregados nesse momento.\nDemasiados utilizadores estão tentando visualizar este recurso.\nPor favor, espere um pouco antes de tentar acessar este recurso novamente.",
        "pool-timeout": "Tempo limite de espera para o bloqueio excedido",
        "pool-queuefull": "A fila de processos está cheia",
        "pool-errorunknown": "Erro desconhecido",
+       "pool-servererror": "O serviço ''pool counter'' não está disponível ($1).",
        "aboutsite": "Sobre a {{SITENAME}}",
        "aboutpage": "Project:Sobre",
        "copyright": "Conteúdo disponibilizado nos termos da $1, salvo indicação em contrário.",
        "nstab-help": "Ajuda",
        "nstab-category": "Categoria",
        "nosuchaction": "Operação não existe",
-       "nosuchactiontext": "A operação especificada pela URL é inválida.\nÉ possível que tenha escrito mal a URL ou seguido um link incorreto.\nIsto pode também indicar um defeito no software da {{SITENAME}}.",
+       "nosuchactiontext": "A operação especificada pela URL é inválida.\nÉ possível que tenha escrito mal a URL ou seguido uma ligação incorreta.\nIsto pode também indicar um defeito no software da {{SITENAME}}.",
        "nosuchspecialpage": "Esta página especial não existe",
        "nospecialpagetext": "<strong>Solicitou uma página especial inválida.</strong>\n\nEncontra uma lista das páginas especiais válidas em [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Erro",
        "readonly": "Base de dados bloqueada (limitada a leituras)",
        "enterlockreason": "Introduza um motivo para bloquear, incluindo uma estimativa de quando será desbloqueada",
        "readonlytext": "A base de dados está bloqueada para impedir a inserção e modificação de dados, provavelmente para uma manutenção de rotina, após a qual a situação será normalizada.\n\nO administrador que a bloqueou deu a seguinte explicação: $1",
-       "missing-article": "A base de dados não encontrou o texto de uma página que deveria ter encontrado, com o nome \"$1\" $2.\n\nGeralmente, esta situação ocorre ao clicar um link para diferenças desatualizado ou para o histórico de uma página que tenha sido removida.\n\nSe nenhuma destas situações se verifica, pode ter encontrado um defeito no programa.\nAnote a URL e reporte este incidente a um [[Special:ListUsers/sysop|administrador]], por favor.",
+       "missing-article": "A base de dados não encontrou o texto de uma página que deveria ter encontrado, com o nome \"$1\" $2.\n\nGeralmente, esta situação ocorre ao clicar numa ligação para diferenças desatualizada ou para o histórico de uma página que tenha sido removida.\n\nSe nenhuma destas situações se verifica, pode ter encontrado um defeito no programa.\nAnote a URL e reporte este incidente a um [[Special:ListUsers/sysop|administrador]], por favor.",
        "missingarticle-rev": "(revisão#: $1)",
        "missingarticle-diff": "(Dif.: $1, $2)",
        "readonly_lag": "A base de dados foi automaticamente bloqueada enquanto os servidores secundários se sincronizam com o primário",
        "internalerror": "Erro interno",
        "internalerror_info": "Erro interno: $1",
-       "fileappenderrorread": "Não foi possível ler \"$1\" durante a anexação.",
-       "fileappenderror": "Não foi possível adicionar \"$1\" a \"$2\".",
        "filecopyerror": "Não foi possível copiar o ficheiro \"$1\" para \"$2\".",
        "filerenameerror": "Não foi possível alterar o nome do ficheiro \"$1\" para \"$2\".",
        "filedeleteerror": "Não foi possível eliminar o ficheiro \"$1\".",
        "directorycreateerror": "Não foi possível criar o diretório \"$1\".",
        "filenotfound": "Não foi possível encontrar o ficheiro \"$1\".",
-       "fileexistserror": "Não foi possível gravar no ficheiro \"$1\": ele já existe",
        "unexpected": "Valor não esperado: \"$1\"=\"$2\".",
        "formerror": "Erro: Não foi possível enviar o formulário",
        "badarticleerror": "Esta operação não pode ser realizada nesta página.",
        "delete-hook-aborted": "A eliminação foi cancelada por um \"hook\".\nNão foi dada nenhuma explicação.",
        "no-null-revision": "Não foi possível criar uma nova revisão nula para a página \"$1\"",
        "badtitle": "Título inválido",
-       "badtitletext": "O título de página solicitado era inválido, vazio, ou um link interlínguas ou interwikis incorrecto.\nTalvez contenha um ou mais caracteres que não podem ser usados em títulos.",
+       "badtitletext": "O título de página solicitado era inválido, vazio, ou a ligação interlínguas estava incorreta.\nTalvez contenha um ou mais caracteres que não podem ser usados em títulos.",
        "perfcached": "Os seguintes dados encontram-se armazenados na ''cache'' e podem não estar atualizados. No máximo {{PLURAL:$1|um resultado é disponível|$1 resultados são disponíveis}} na ''cache''.",
        "perfcachedts": "Os seguintes dados encontram-se armazenados na ''cache'' e foram atualizados pela última vez a $1. No máximo {{PLURAL:$4|um resultado está disponível|$4 resultados estão disponíveis}} na ''cache''.",
        "querypage-no-updates": "As atualizações estão presentemente desativadas para esta página.\nPor enquanto, os dados aqui presentes não poderão ser atualizados.",
        "welcomecreation-msg": "A sua conta foi criada.\nNão se esqueça de personalizar as suas [[Special:Preferences|preferências]].",
        "yourname": "Nome de utilizador:",
        "userlogin-yourname": "Nome de utilizador(a):",
-       "userlogin-yourname-ph": "Digite seu nome de utilizador(a)",
-       "createacct-another-username-ph": "Digite o nome de utilizador",
+       "userlogin-yourname-ph": "Digite seu nome de utilizador(a)",
+       "createacct-another-username-ph": "Digite o nome de utilizador(a)",
        "yourpassword": "Palavra-chave:",
        "userlogin-yourpassword": "Palavra-chave",
-       "userlogin-yourpassword-ph": "Digite sua palavra-chave",
+       "userlogin-yourpassword-ph": "Digite sua palavra-chave",
        "createacct-yourpassword-ph": "Digite uma palavra-chave",
        "yourpasswordagain": "Repita a palavra-chave:",
        "createacct-yourpasswordagain": "Confirme a palavra-chave",
        "userlogin-helplink2": "Ajuda na autenticação",
        "userlogin-loggedin": "Já está {{GENDER:$1|autenticado|autenticada|autenticado}} com o nome $1.\nUse o formulário abaixo para iniciar uma sessão com outro nome.",
        "userlogin-createanother": "Criar outra conta",
-       "createacct-join": "Insira a sua informação abaixo.",
-       "createacct-another-join": "Digite a informação da nova conta abaixo.",
        "createacct-emailrequired": "Endereço de email",
        "createacct-emailoptional": "Endereço de email (opcional)",
-       "createacct-email-ph": "Digite seu endereço de email",
-       "createacct-another-email-ph": "Digite o endereço de e-mail",
+       "createacct-email-ph": "Digite o seu endereço de correio electrónico",
+       "createacct-another-email-ph": "Digite o endereço de correio electrónico",
        "createaccountmail": "Usar uma palavra passe aleatória e temporária e enviar para o endereço de correio eletrónico especificado",
        "createacct-realname": "Nome verdadeiro (opcional)",
        "createaccountreason": "Motivo:",
        "passwordremindertitle": "Nova palavra-chave temporária na {{SITENAME}}",
        "passwordremindertext": "Alguém (provavelmente você, a partir do endereço IP $1) solicitou uma palavra-chave nova para a sua conta na {{SITENAME}} ($4).\nFoi criada a palavra-chave temporária \"$3\" para o utilizador \"$2\".\nSe o pedido foi feito por si, entre agora na sua conta e escolha uma palavra-chave nova.\nA palavra-chave temporária expira após {{PLURAL:$5|um dia|$5 dias}}.\n\nCaso outra pessoa tenha feito o pedido, ou se entretanto se recordou da sua palavra-chave e já não deseja alterá-la, ignore esta mensagem e continue a utilizar a palavra-chave antiga.",
        "noemail": "Não foi registado um endereço de correio eletrónico para o utilizador \"$1\".",
-       "noemailcreate": "Tem de fornecer um endereço de correio eletrónico válido",
+       "noemailcreate": "Tem de fornecer um endereço de correio eletrónico válido.",
        "passwordsent": "Foi enviada uma palavra-chave nova para o endereço de correio eletrónico do utilizador \"$1\".\nVolte a autenticar-se após recebê-la, por favor.",
        "blocked-mailpassword": "O seu endereço IP foi bloqueado e, portanto, não será possível utilizar a função de recuperação da palavra-chave, para prevenir o uso abusivo.",
        "eauthentsent": "Foi enviada uma mensagem de confirmação para o endereço de correio eletrónico que especificou.\nAntes que seja enviada qualquer outra mensagem para a conta, terá de seguir as instruções na mensagem enviada, de modo a confirmar que a conta lhe pertence.",
        "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-chave.",
        "changeemail-no-info": "Tem de autenticar-se para aceder diretamente a esta página.",
        "changeemail-oldemail": "Correio eletrónico atual:",
-       "changeemail-newemail": "Correio eletrónico novo:",
+       "changeemail-newemail": "Novo endereço de correio eletrónico:",
        "changeemail-none": "(nenhum)",
        "changeemail-password": "A sua senha na wiki {{SITENAME}}:",
        "changeemail-submit": "Alterar correio eletrónico",
        "bold_tip": "Texto a negrito",
        "italic_sample": "Texto em itálico",
        "italic_tip": "Texto em itálico",
-       "link_sample": "Título do link",
-       "link_tip": "Link interno",
-       "extlink_sample": "http://www.example.com link externo",
-       "extlink_tip": "Link externo (lembre-se do prefixo http://)",
+       "link_sample": "Título da ligação",
+       "link_tip": "Ligação interna",
+       "extlink_sample": "http://www.example.com ligação externa",
+       "extlink_tip": "Ligação externa (lembre-se do prefixo http://)",
        "headline_sample": "Texto do cabeçalho",
        "headline_tip": "Seção de nível 2",
        "nowiki_sample": "Inserir texto não-formatado aqui",
        "image_sample": "Exemplo.jpg",
        "image_tip": "Ficheiro incorporado",
        "media_sample": "Exemplo.ogg",
-       "media_tip": "Link para ficheiro",
+       "media_tip": "Ligação para ficheiro",
        "sig_tip": "A sua assinatura, com hora e data",
        "hr_tip": "Linha horizontal (utilize moderadamente)",
        "summary": "Resumo:",
        "savearticle": "Gravar página",
        "preview": "Antevisão",
        "showpreview": "Antever resultado",
-       "showlivepreview": "Antevisão em tempo real",
        "showdiff": "Mostrar alterações",
        "anoneditwarning": "'''Aviso''': Não se encontra autenticado.\nO seu endereço IP será registado no histórico de edições desta página.",
        "anonpreviewwarning": "''Não está autenticado. Gravar registará o seu endereço IP no histórico de edições da página.''",
        "accmailtitle": "Palavra-chave enviada.",
        "accmailtext": "Uma palavra-chave gerada aleatoriamente para [[User talk:$1|$1]] foi enviada para $2.\n\nEla pode ser alterada na página [[Special:ChangePassword|de alteração da palavra-chave]] após autenticação.",
        "newarticle": "(Nova)",
-       "newarticletext": "Seguiu um link para uma página que ainda não existe.\nPara criá-la, escreva o seu conteúdo na caixa abaixo (consulte a [$1 página de ajuda] para mais detalhes).\nSe chegou aqui por engano, clique o botão '''voltar''' (ou ''back'') do seu browser.",
+       "newarticletext": "Seguiu uma ligação para uma página que ainda não existe.\nPara criá-la, escreva o seu conteúdo na caixa abaixo (consulte a [$1 página de ajuda] para mais detalhes).\nSe chegou aqui por engano, clique o botão '''voltar''' (ou ''back'') do seu navegador.",
        "anontalkpagetext": "----''Esta é a página de discussão de um utilizador anónimo que ainda não criou uma conta ou não a utiliza, pelo que temos de utilizar o endereço IP para identificá-lo(a).\nUm endereço IP pode ser partilhado por vários utilizadores.\nSe é um utilizador anónimo e sente que lhe foram direccionados comentários irrelevantes, por favor [[Special:UserLogin/signup|crie uma conta]] ou [[Special:UserLogin|autentique-se]] para evitar futuras confusões com outros utilizadores anónimos.''",
        "noarticletext": "Ainda não existe texto nesta página.\nPode [[Special:Search/{{PAGENAME}}|pesquisar o título desta página]] noutras páginas,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} procurar registos relacionados]\nou [{{fullurl:{{FULLPAGENAME}}|action=edit}} editar esta página]</span>.",
        "noarticletext-nopermission": "Ainda não existe texto nesta página.\nPode [[Special:Search/{{PAGENAME}}|pesquisar o título desta página]] noutras páginas, ou <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} procurar nos registos relacionados]</span>, mas não tem permissão para criar esta página.",
-       "missing-revision": "A revisão #$1 da página denominada \"{{FULLPAGENAME}}\" não existe.\n\nIsto é geralmente causado por seguir um link de histórico desatualizado para uma página que foi eliminada.\nOs detalhes podem ser encontrados no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminação].",
+       "missing-revision": "A revisão #$1 da página denominada \"{{FULLPAGENAME}}\" não existe.\n\nIsto é geralmente causado por seguir uma ligação de histórico desatualizada para uma página que foi eliminada.\nOs detalhes podem ser encontrados no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminação].",
        "userpage-userdoesnotexist": "A conta \"<nowiki>$1</nowiki>\" não se encontra registada.\nVerifique se deseja realmente criar ou editar esta página, por favor.",
        "userpage-userdoesnotexist-view": "A conta de utilizador \"$1\" não está registada.",
        "blocked-notice-logextract": "Este utilizador está bloqueado.\nPara referência, o último registo de bloqueio é apresentado abaixo:",
        "nocreate-loggedin": "Não possui permissão para criar novas páginas.",
        "sectioneditnotsupported-title": "Edição de seções não é suportada",
        "sectioneditnotsupported-text": "A edição de seções não é suportada nesta página de edição.",
-       "permissionserrors": "Erros de permissões",
+       "permissionserrors": "Erro de permissão",
        "permissionserrorstext": "Não possui permissão para fazer isso, {{PLURAL:$1|pelo seguinte motivo|pelos seguintes motivos}}:",
        "permissionserrorstext-withaction": "Não possui permissão para $2, {{PLURAL:$1|pelo seguinte motivo|pelos seguintes motivos}}:",
        "recreate-moveddeleted-warn": "'''Aviso: Está a recriar uma página anteriormente eliminada.'''\n\nVerifique se é apropriado continuar a editar esta página.\nPara sua conveniência, é apresentado de seguida o registo de eliminação e de movimento da página:",
        "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": "A sua edição foi gravada.",
+       "postedit-confirmation-created": "A página foi criada.",
+       "postedit-confirmation-restored": "A página foi restaurada.",
+       "postedit-confirmation-saved": "A sua edição foi gravada.",
        "edit-already-exists": "Não foi possível criar uma página nova.\nEla já existia.",
        "defaultmessagetext": "Texto da mensagem padrão",
        "content-failed-to-parse": "Falha ao analisar conteúdo $2 para modelo $1:$3",
        "post-expand-template-argument-category": "Páginas com omissão de argumentos para predefinições",
        "parser-template-loop-warning": "Ciclo de predefinições detectado: [[$1]]",
        "parser-template-recursion-depth-warning": "Foi excedido o limite da profundidade de recursividade nas predefinições ($1)",
-       "language-converter-depth-warning": "O limite de profundidade do conversor de línguas excedeu a ($1)",
+       "language-converter-depth-warning": "O limite de profundidade do conversor de idiomas excedeu a ($1)",
        "node-count-exceeded-category": "Páginas em que o total de nós é excedido",
+       "node-count-exceeded-category-desc": "Uma categoria para páginas onde a contagem dos nós foi excedida.",
        "node-count-exceeded-warning": "A página excedeu o total de nós",
        "expansion-depth-exceeded-category": "Páginas em que a profundidade de expansão é excedida",
+       "expansion-depth-exceeded-category-desc": "Uma categoria para páginas onde a profundidade de expansão foi excedida.",
        "expansion-depth-exceeded-warning": "A página excedeu a profundidade de expansão",
        "parser-unstrip-loop-warning": "Foi detectado um ciclo infinito unstrip",
        "parser-unstrip-recursion-limit": "Limite de recursão do unstrip excedido ($1)",
        "revdelete-no-file": "O ficheiro especificado não existe.",
        "revdelete-show-file-confirm": "Tem a certeza de que quer ver uma revisão eliminada do ficheiro \"<nowiki>$1</nowiki>\" de $2 às $3?",
        "revdelete-show-file-submit": "Sim",
+       "revdelete-selected-text": "{{PLURAL:$1|Revisão seleccionada|Revisões seleccionadas}} de [[:$2]]:",
+       "revdelete-selected-file": "{{PLURAL:$1|Versão do ficheiro seleccionada|Versões do ficheiro seleccionadas}} de [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|Evento do registo selecionado|Eventos do registo selecionados}}:",
        "revdelete-text-text": "Revisões eliminadas ainda aparecerão no histórico da página, mas parte do seu conteúdo estará inacessível para o público.",
        "revdelete-text-file": "Versões eliminadas do ficheiro ainda aparecerão no histórico da página, mas parte do seu conteúdo estará inacessível para o público.",
        "mergehistory-from": "Página de origem:",
        "mergehistory-into": "Página de destino:",
        "mergehistory-list": "Histórico de edições fundíveis",
-       "mergehistory-merge": "As seguintes edições de [[:$1]] podem ser fundidas em [[:$2]].\nUsando os botões de opção, pode escolher fundir apenas as edições até àquela que marcar.\nNote que, se usar os links de navegação, os botões de opção voltarão aos valores originais.",
+       "mergehistory-merge": "As seguintes edições de [[:$1]] podem ser fundidas em [[:$2]].\nUsando os botões de opção, pode escolher fundir apenas as edições até àquela que marcar.\nNote que, se usar as ligações de navegação, os botões de opção voltarão aos valores originais.",
        "mergehistory-go": "Mostrar edições que podem ser fundidas",
        "mergehistory-submit": "Fundir edições",
        "mergehistory-empty": "Não existem revisões fundíveis.",
        "diff-multi-sameuser": "(Há {{PLURAL:$1|uma edição intermédia|$1 edições intermédias}} do mesmo utilizador que não estão a ser apresentadas)",
        "diff-multi-otherusers": "(Há {{PLURAL:$1|uma revisão intermédia|$1 revisões intermédias}} de {{PLURAL:$2|outro utilizador|$2 utilizadores}} que não {{PLURAL:$1|está a ser apresentada|estão a ser apresentadas}})",
        "diff-multi-manyusers": "({{PLURAL:$1|Uma edição intermédia|$1 edições intermédias}} de mais de {{PLURAL:$2|um utilizador|$2 utilizadores}} não {{PLURAL:$1|apresentada|apresentadas}})",
-       "difference-missing-revision": "{{PLURAL:$2|Uma revisão|$2 revisões}} desta diferença ($1) não {{PLURAL:$2|foi encontrada|foram encontradas}}.\n\nIsto é geralmente causado por seguir um link de histórico desatualizado para uma página que foi eliminada.\nOs detalhes podem ser encontrados no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminação].",
+       "difference-missing-revision": "{{PLURAL:$2|Uma revisão|$2 revisões}} desta diferença ($1) não {{PLURAL:$2|foi encontrada|foram encontradas}}.\n\nIsto é geralmente causado por seguir uma ligação de histórico desatualizada para uma página que foi eliminada.\nOs detalhes podem ser encontrados no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminação].",
        "searchresults": "Resultados da pesquisa",
        "searchresults-title": "Resultados da pesquisa de \"$1\"",
        "toomanymatches": "Foram devolvidos demasiados resultados; tente outro termo de pesquisa, por favor",
        "searchmenu-exists": "<strong>Há uma página com o nome \"[[:$1]]\" nesta wiki.</strong> {{PLURAL:$2|0=|Veja também os outros resultados encontrados.}}",
        "searchmenu-new": "<strong>Crie a página \"[[:$1]]\" nesta wiki!</strong> {{PLURAL:$2|0=|Veja também a página encontrada na pesquisa.|Veja também os resultados da pesquisa.}}",
        "searchprofile-articles": "Páginas de conteúdo",
-       "searchprofile-project": "Páginas de ajuda e de projeto",
        "searchprofile-images": "Multimédia",
        "searchprofile-everything": "Todas",
        "searchprofile-advanced": "Personalizar",
        "searchprofile-articles-tooltip": "Pesquisar em $1",
-       "searchprofile-project-tooltip": "Pesquisar em $1",
        "searchprofile-images-tooltip": "Pesquisar ficheiros",
        "searchprofile-everything-tooltip": "Pesquisar em todo o conteúdo (incluindo páginas de discussão)",
        "searchprofile-advanced-tooltip": "Personalizar os espaços nominais onde pesquisar",
        "search-redirect": "(redirecionamento de $1)",
        "search-section": "(seção $1)",
        "search-file-match": "(coincide com o conteúdo do ficheiro)",
-       "search-suggest": "Será que queria dizer: $1",
+       "search-suggest": "Será que você quis dizer: $1",
        "search-interwiki-caption": "Projetos irmãos",
        "search-interwiki-default": "Resultados de $1:",
        "search-interwiki-more": "(mais)",
        "search-nonefound": "A pesquisa não produziu resultados.",
        "powersearch-legend": "Pesquisa avançada",
        "powersearch-ns": "Pesquisar nos espaços nominais:",
-       "powersearch-redir": "Listar redirecionamentos",
        "powersearch-togglelabel": "Marcar:",
        "powersearch-toggleall": "Todos",
        "powersearch-togglenone": "Nenhum",
        "rows": "Linhas:",
        "columns": "Colunas:",
        "searchresultshead": "Pesquisar",
-       "stub-threshold": "Links para páginas curtas terão <a href=\"#\" class=\"stub\">este formato</a> se elas ocuparem menos de (bytes):",
+       "stub-threshold": "Ligações para páginas curtas terão <a href=\"#\" class=\"stub\">este formato</a> se ocuparem menos de (bytes):",
        "stub-threshold-disabled": "Desativado",
        "recentchangesdays": "Dias a apresentar nas mudanças recentes:",
        "recentchangesdays-max": "Máximo: $1 {{PLURAL:$1|dia|dias}}",
        "prefs-emailconfirm-label": "Confirmação do endereço:",
        "youremail": "Correio eletrónico:",
        "username": "Nome de {{GENDER:$1|utilizador|utilizadora}}:",
-       "uid": "Identificação de {{GENDER:$1|utilizador|utilizadora}}:",
        "prefs-memberingroups": "{{GENDER:$2|Membro}} {{PLURAL:$1|do grupo|dos grupos}}:",
        "prefs-registration": "Hora de registo:",
        "yourrealname": "Nome verdadeiro:",
        "email": "Correio eletrónico",
        "prefs-help-realname": "O fornecimento do nome verdadeiro é opcional.\nSe optar por revelá-lo, ele será utilizado para atribuir-lhe crédito pelo seu trabalho.",
        "prefs-help-email": "Opcional: o endereço de correio eletrónico é opcional, mas será necessário para redefinir a palavra-chave caso esqueça a antiga.",
-       "prefs-help-email-others": "Também pode optar por permitir que outros entrem em contacto consigo por correio eletrónico, através de um link nas suas páginas de utilizador ou de discussão, sem revelar o seu endereço de correio eletrónico.",
+       "prefs-help-email-others": "Também pode optar por permitir que outros entrem em contacto consigo por correio eletrónico, através de uma ligação nas suas páginas de utilizador ou de discussão, sem revelar o seu endereço de correio eletrónico.",
        "prefs-help-email-required": "É necessário o endereço de correio eletrónico.",
        "prefs-info": "Informações básicas",
        "prefs-i18n": "Internacionalização",
        "prefs-advancedsearchoptions": "Opções avançadas",
        "prefs-advancedwatchlist": "Opções avançadas",
        "prefs-displayrc": "Opções de visionamento",
-       "prefs-displaysearchoptions": "Opções de apresentação",
        "prefs-displaywatchlist": "Opções de apresentação",
        "prefs-tokenwatchlist": "Chave",
        "prefs-diffs": "Diferenças",
        "prefs-tabs-navigation-hint": "Dica: Pode usar as setas direita e esquerda do teclado para navegar entre os separadores.",
        "email-address-validity-valid": "Parece válido",
        "email-address-validity-invalid": "Endereço válido necessário!",
-       "userrights": "Privilégios dos utilizadores",
+       "userrights": "Gestão de privilégios do utilizador",
        "userrights-lookup-user": "Gerir grupos de utilizadores",
        "userrights-user-editname": "Introduza um nome de utilizador:",
        "editusergroup": "Editar grupos do utilizador",
        "right-move": "Mover páginas",
        "right-move-subpages": "Mover páginas com as suas subpáginas",
        "right-move-rootuserpages": "Mover páginas raiz de utilizadores",
+       "right-move-categorypages": "Mover categorias",
        "right-movefile": "Mover ficheiros",
        "right-suppressredirect": "Não criar um redirecionamento do nome antigo quando uma página é movida",
        "right-upload": "Carregar ficheiros",
        "action-createpage": "criar páginas",
        "action-createtalk": "criar páginas de discussão",
        "action-createaccount": "criar esta conta de utilizador",
+       "action-history": "ver histórico desta página",
        "action-minoredit": "marcar esta edição como uma edição menor",
        "action-move": "mover esta página",
        "action-move-subpages": "mover esta página e as respectivas subpáginas",
        "action-move-rootuserpages": "mover páginas raiz de utilizadores",
+       "action-move-categorypages": "mover categorias",
        "action-movefile": "mover este ficheiro",
        "action-upload": "enviar este ficheiro",
        "action-reupload": "sobrepor este ficheiro existente",
        "recentchanges-legend-newpage": "([[Special:NewPages|lista de páginas novas]])",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "rcnotefrom": "Abaixo estão as mudanças desde <strong>$2</strong> (mostradas até <strong>$1</strong>).",
-       "rclistfrom": "Mostrar as novas mudanças a partir das $1",
+       "rclistfrom": "Mostrar as novas mudanças a partir das $3 $2",
        "rcshowhideminor": "$1 edições menores",
        "rcshowhideminor-show": "Mostrar",
        "rcshowhideminor-hide": "Esconder",
        "recentchangeslinked-feed": "Alterações relacionadas",
        "recentchangeslinked-toolbox": "Alterações relacionadas",
        "recentchangeslinked-title": "Alterações relacionadas com \"$1\"",
-       "recentchangeslinked-summary": "Lista das mudanças recentes a todas as páginas para as quais a página fornecida contém links (ou de todas as que pertencem à categoria fornecida).\nAs suas [[Special:Watchlist|páginas vigiadas]] aparecem a '''negrito'''.",
+       "recentchangeslinked-summary": "Lista das mudanças recentes a todas as páginas para as quais a página fornecida contém ligações (ou de todas as que pertencem à categoria fornecida).\nAs suas [[Special:Watchlist|páginas vigiadas]] aparecem a '''negrito'''.",
        "recentchangeslinked-page": "Nome da página:",
-       "recentchangeslinked-to": "Inversamente, mostrar mudanças às páginas que contêm links para esta",
+       "recentchangeslinked-to": "Inversamente, mostrar mudanças às páginas que contêm ligações para esta",
        "upload": "Carregar ficheiro",
        "uploadbtn": "Carregar ficheiro",
        "reuploaddesc": "Cancelar o envio e voltar ao formulário de carregamento",
        "upload_directory_read_only": "O servidor de internet não possui permissão de escrita no diretório de carregamento de ficheiros ($1).",
        "uploaderror": "Erro ao carregar",
        "upload-recreate-warning": "'''Aviso: Um ficheiro com esse nome foi eliminado ou movido.'''\n\nPara sua conveniência, é apresentado de seguida o registo de eliminação e de movimento da página:",
-       "uploadtext": "Utilize o formulário abaixo para fazer upload de ficheiros novos.\nPara ver ou pesquisar ficheiros anteriormente enviados, consulte a [[Special:FileList|lista de ficheiros]].\nOs reenvios de um ficheiro são também registados no [[Special:Log/upload|registo de uploads]] e as eliminações no [[Special:Log/delete|registo de eliminações]].\n\nPara utilizar um ficheiro numa página, depois de ter feito o upload, insira um link com um dos seguintes formatos:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:ficheiro.jpg]]</nowiki></code>''' para mostrar uma imagem nas suas dimensões originais;\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:ficheiro.png|200px|thumb|left|texto]]</nowiki></code>''' para mostrar uma imagem com a dimensão horizontal de 200 pixels, dentro de uma caixa, na margem esquerda, contendo 'texto' como descrição (pode usar subconjuntos destas características);\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:ficheiro.ogg]]</nowiki></code>''' para apresentar um link direto para o ficheiro em vez de mostrá-lo, quer este tenha por conteúdo uma imagem ou outros dados.",
+       "uploadtext": "Utilize o formulário abaixo para fazer o carregamento de novos ficheiros.\nPara ver ou pesquisar ficheiros anteriormente enviados, consulte a [[Special:FileList|lista de ficheiros]].\nOs reenvios de um ficheiro são também registados no [[Special:Log/upload|registo de carregamentos]] e as eliminações no [[Special:Log/delete|registo de eliminações]].\n\nPara utilizar um ficheiro numa página, depois de ter feito o upload, insira uma ligação com um dos seguintes formatos:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:ficheiro.jpg]]</nowiki></code>''' para mostrar uma imagem nas suas dimensões originais;\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:ficheiro.png|200px|thumb|left|texto]]</nowiki></code>''' para mostrar uma imagem com a dimensão horizontal de 200 pixels, dentro de uma caixa, na margem esquerda, contendo 'texto' como descrição (pode usar subconjuntos destas características);\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:ficheiro.ogg]]</nowiki></code>''' para apresentar uma ligação direta para o ficheiro em vez de mostrá-lo, quer este tenha por conteúdo uma imagem ou outros dados.",
        "upload-permitted": "Tipos de ficheiro permitidos: $1.",
        "upload-preferred": "Tipos de ficheiro preferidos: $1.",
        "upload-prohibited": "Tipos de ficheiro proibidos: $1.",
        "uploadstash-refresh": "Atualizar a lista de ficheiros",
        "invalid-chunk-offset": "Deslocamento de fragmento inválido",
        "img-auth-accessdenied": "Acesso negado",
-       "img-auth-nopathinfo": "PATH_INFO em falta.\nO seu servidor não está configurado para passar esta informação.\nPode ser baseado em CGI e não consegue suportar img_auth.\nConsulte a documentação em https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "PATH_INFO em falta.\nO seu servidor não está configurado para passar esta informação.\nPode ser baseado em CGI e não consegue suportar img_auth.\nConsulte a documentação em https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "O endereço especificado não conduz ao diretório de carregamento de ficheiros configurado.",
        "img-auth-badtitle": "Não é possível construir um título válido a partir de \"$1\".",
        "img-auth-nologinnWL": "Não está autenticado e o ficheiro \"$1\" não está na lista branca.",
        "filehist-filesize": "Tamanho do ficheiro",
        "filehist-comment": "Comentário",
        "imagelinks": "Uso do ficheiro",
-       "linkstoimage": "{{PLURAL:$1|A seguinte página contém|As seguintes $1 páginas contêm}} links para este ficheiro:",
-       "linkstoimage-more": "Mais de {{PLURAL:$1|uma página contém|$1 páginas contêm}} links para este ficheiro.\nA lista abaixo apresenta apenas {{PLURAL:$1|a primeira página|as primeiras $1 páginas}}.\nEncontra-se disponível uma [[Special:WhatLinksHere/$2|lista completa]].",
-       "nolinkstoimage": "Nenhuma página contém links para este ficheiro.",
-       "morelinkstoimage": "Ver a [[Special:WhatLinksHere/$1|lista completa]] de páginas que contêm links para este ficheiro.",
+       "linkstoimage": "{{PLURAL:$1|A seguinte página contém ligação|As seguintes $1 páginas contêm ligações}} para este ficheiro:",
+       "linkstoimage-more": "Mais de {{PLURAL:$1|uma página contém ligação|$1 páginas contêm ligações}} para este ficheiro.\nA lista abaixo apresenta apenas {{PLURAL:$1|a primeira página|as primeiras $1 páginas}}.\nEncontra-se disponível uma [[Special:WhatLinksHere/$2|lista completa]].",
+       "nolinkstoimage": "Nenhuma página contém ligação para este ficheiro.",
+       "morelinkstoimage": "Ver a [[Special:WhatLinksHere/$1|lista completa]] de páginas que contêm ligações para este ficheiro.",
        "linkstoimage-redirect": "$1 (redirecionamento de ficheiro) $2",
        "duplicatesoffile": "{{PLURAL:$1|O seguinte ficheiro é duplicado|Os seguintes $1 ficheiros são duplicados}} deste ficheiro ([[Special:FileDuplicateSearch/$2|mais detalhes]]):",
        "sharedupload": "Este ficheiro provém de $1 e pode ser usado por outros projetos.",
        "listduplicatedfiles-summary": "Esta é uma lista de ficheiros cuja suas versões mais recentes são duplicatas da versão mais recente de outros ficheiros. Somente os ficheiros locais são considerados.",
        "listduplicatedfiles-entry": "[[:File:$1|$1]] possui [[$3|{{PLURAL:$2|uma duplicata|$2 duplicatas}}]].",
        "unusedtemplates": "Predefinições não utilizadas",
-       "unusedtemplatestext": "Esta página lista todas as páginas no espaço nominal {{ns:template}} que não são incluídas em nenhuma outra página. Lembre-se de verificar a existência de outros links para as predefinições, antes de eliminá-las.",
-       "unusedtemplateswlh": "outros links",
+       "unusedtemplatestext": "Esta página lista todas as páginas no espaço nominal {{ns:template}} que não são incluídas em nenhuma outra página. Lembre-se de verificar a existência de outras ligações para as predefinições, antes de eliminá-las.",
+       "unusedtemplateswlh": "outras ligações",
        "randompage": "Página aleatória",
        "randompage-nopages": "Não há páginas {{PLURAL:$2|no seguinte espaço nominal|nos seguintes espaços nominais}}: $1.",
        "randomincategory": "Página aleatória na categoria",
        "pageswithprop-prophidden-long": "foi ocultado o valor da propriedade por ser um texto muito longo ($1)",
        "pageswithprop-prophidden-binary": "foi ocultado o valor da propriedade por ser binário ($1)",
        "doubleredirects": "Redirecionamentos duplos",
-       "doubleredirectstext": "Esta página lista todas as páginas que redirecionam para outras páginas de redirecionamento.\nCada linha contém links para o primeiro e segundo redirecionamentos, bem como o destino do segundo redirecionamento, geralmente contendo a verdadeira página de destino, que devia ser o destino do primeiro redirecionamento.\n<del>Entradas cortadas</del> já foram solucionadas.",
-       "double-redirect-fixed-move": "[[$1]] foi movido.\nAgora redirecciona para [[$2]].",
-       "double-redirect-fixed-maintenance": "A corrigir redirecionamento duplo de [[$1]] para [[$2]].",
+       "doubleredirectstext": "Esta página lista todas as páginas que redirecionam para outras páginas de redirecionamento.\nCada linha contém ligações para o primeiro e segundo redirecionamentos, bem como o destino do segundo redirecionamento, geralmente contendo a verdadeira página de destino, que devia ser o destino do primeiro redirecionamento.\n<del>Entradas cortadas</del> já foram solucionadas.",
+       "double-redirect-fixed-move": "[[$1]] foi movida.\nEla foi actualizada automaticamente e agora redirecciona para [[$2]].",
+       "double-redirect-fixed-maintenance": "A corrigir automaticamente o redirecionamento duplo de [[$1]] para [[$2]], em um trabalho de manutenção.",
        "double-redirect-fixer": "Corretor de redirecionamentos",
        "brokenredirects": "Redirecionamentos quebrados",
-       "brokenredirectstext": "Os seguintes redirecionamentos ligam para páginas inexistentes:",
+       "brokenredirectstext": "Os seguintes redirecionamentos contêm ligações para páginas inexistentes:",
        "brokenredirects-edit": "editar",
        "brokenredirects-delete": "eliminar",
-       "withoutinterwiki": "Páginas sem links interlínguas",
-       "withoutinterwiki-summary": "As seguintes páginas não têm ligação para versões noutras línguas.",
+       "withoutinterwiki": "Páginas sem ligações interlínguas",
+       "withoutinterwiki-summary": "As seguintes páginas não têm ligação para versões noutros idiomas.",
        "withoutinterwiki-legend": "Prefixo",
        "withoutinterwiki-submit": "Mostrar",
        "fewestrevisions": "Páginas com menos revisões",
        "ntransclusions": "usada {{PLURAL:$1|numa página|em $1 páginas}}",
        "specialpage-empty": "Não existem dados para apresentar.",
        "lonelypages": "Páginas órfãs",
-       "lonelypagestext": "As seguintes páginas não são destino de links nem são transcluídas a partir de outras páginas na {{SITENAME}}.",
+       "lonelypagestext": "As seguintes páginas não são destino de ligação nem são transcluídas a partir de outras páginas na {{SITENAME}}.",
        "uncategorizedpages": "Páginas não categorizadas",
        "uncategorizedcategories": "Categorias não categorizadas",
        "uncategorizedimages": "Ficheiros não categorizados",
        "shortpages": "Páginas curtas",
        "longpages": "Páginas longas",
        "deadendpages": "Páginas sem saída",
-       "deadendpagestext": "As seguintes páginas não contêm links para outras páginas na {{SITENAME}}.",
+       "deadendpagestext": "As seguintes páginas não contêm ligações para outras páginas em {{SITENAME}}.",
        "protectedpages": "Páginas protegidas",
        "protectedpages-indef": "Apenas proteções indefinidas",
        "protectedpages-summary": "Esta página lista páginas existentes que estão protegidas. Para ver os títulos cuja criação está impossibilitada, consulte [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "ancientpages": "Páginas mais antigas",
        "move": "Mover",
        "movethispage": "Mover esta página",
-       "unusedimagestext": "Os seguintes ficheiros existem mas não são usados na wiki.\nNo entanto, outros sites na internet podem ter links para um ficheiro através de uma URL direta e, por isso, podem estar listados ficheiros que estão a ser ativamente usados por entidades externas.",
+       "unusedimagestext": "Os seguintes ficheiros existem mas não são usados na wiki.\nNo entanto, outros sítios na Internet podem ter ligação para um ficheiro através de uma URL direta e, por isso, podem estar listados ficheiros que estão a ser ativamente usados por entidades externas.",
        "unusedcategoriestext": "As seguintes categorias existem, embora nenhuma página ou categoria faça uso delas.",
        "notargettitle": "Sem alvo",
        "notargettext": "Especifique sobre que página alvo ou utilizador pretende executar esta função.",
        "booksources": "Fontes bibliográficas",
        "booksources-search-legend": "Pesquisar referências bibliográficas",
        "booksources-go": "Prosseguir",
-       "booksources-text": "É apresentada abaixo uma lista de links para outros sites na internet que vendem livros novos e usados e talvez possuam informações adicionais sobre os livros que procura:",
+       "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:",
        "speciallogtitlelabel": "Alvo (página ou utilizador):",
        "log-title-wildcard": "Procurar títulos iniciados por este texto",
        "showhideselectedlogentries": "Mostrar ou ocultar as entradas selecionadas",
        "allpages": "Todas as páginas",
-       "alphaindexline": "$1 até $2",
        "nextpage": "Página seguinte ($1)",
        "prevpage": "Página anterior ($1)",
        "allpagesfrom": "Apresentar páginas desde:",
        "linksearch-ns": "Espaço nominal:",
        "linksearch-ok": "Prosseguir",
        "linksearch-text": "É possível usar caracteres de substituição ''(wildcards)'', tais como \"*.wikipedia.org\".\nÉ necessário, pelo menos, um domínio de topo, por exemplo \"*.org\".<br />\n{{PLURAL:$2|Protocolo suportado|Protocolos suportados}}: <code>$1</code> (será utilizado http:// se não for especificado um protocolo).",
-       "linksearch-line": "Link para $1 na página $2",
+       "linksearch-line": "Ligação para $1 na página $2",
        "linksearch-error": "Caracteres de substituição ''(wildcards)'' só podem ser usados no início do endereço.",
        "listusersfrom": "Mostrar utilizadores começando por:",
        "listusers-submit": "Mostrar",
        "listgrouprights-removegroup-self-all": "Remover a própria conta de todos os grupos",
        "listgrouprights-namespaceprotection-header": "Restrições do campo nominal",
        "listgrouprights-namespaceprotection-namespace": "Campo nominal",
+       "listgrouprights-namespaceprotection-restrictedto": "Direito(s) do utilizador para editar",
+       "trackingcategories": "Monitoramento de categorias",
+       "trackingcategories-summary": "Esta página lista as categorias monitoradas que foram geradas automaticamente pelo software MediaWiki. Seus nomes podem ser alterados ao editar sua mensagem correspondente no domínio {{ns:8}}.",
+       "trackingcategories-msg": "Categoria monitorada",
        "trackingcategories-name": "Nome da mensagem",
+       "trackingcategories-desc": "Critérios de inclusão",
+       "noindex-category-desc": "A página não é indexada por robôs porque contém a palavra mágica <code><nowiki>__NOINDEX__</nowiki></code> e está num domínio onde o estatuto é permitido.",
+       "index-category-desc": "A página contém a palavra mágica <code><nowiki>__INDEX__</nowiki></code> (e está num espaço nominal em que essa marca é permitida) e, portanto, será indexada pelos bots mesmo quando normalmente não o seria.",
+       "post-expand-template-inclusion-category-desc": "A expansão de todas as predefinições faria com que o tamanho da página ultrapassasse <code>$wgMaxArticleSize</code>, pelo que algumas predefinições não foram expandidas.",
+       "post-expand-template-argument-category-desc": "A expansão de um argumento de prefefinição (algo em chavetas triplas, como <code>{{{Foo}}}</code> ) torna a página maior do que <code>$wgMaxArticleSize</code>.",
+       "expensive-parserfunction-category-desc": "Demasiadas funções do analisador custosas (como <code>#ifexist</code>) incluídas numa página. Consulte [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "broken-file-category-desc": "Categoria adicionada se a página contém um link quebrado para um ficheiro (um link para incorporar um ficheiro que não existe).",
+       "hidden-category-category-desc": "Esta é uma categoria com a marca <code><nowiki>__HIDDENCAT__</nowiki></code>, que faz com que ela não apareça na caixa de links de categoria nas páginas, por omissão.",
+       "trackingcategories-nodesc": "Nenhuma descrição disponível.",
+       "trackingcategories-disabled": "A categoria está desactivada.",
        "mailnologin": "Não existe endereço de envio",
        "mailnologintext": "Precisa de estar [[Special:UserLogin|autenticado]] e ter um endereço de correio válido nas suas [[Special:Preferences|preferências]], para poder enviar correio eletrónico a outros utilizadores.",
        "emailuser": "Enviar correio eletrónico a este utilizador",
        "watchnologin": "Não está autenticado(a)",
        "addwatch": "Adicionar às páginas vigiadas",
        "addedwatchtext": "A página \"[[:$1]]\" foi adicionada à sua [[Special:Watchlist|lista de páginas vigiadas]].\nModificações futuras desta página e da respetiva página de discussão serão listadas lá.",
+       "addedwatchtext-short": "A página \"$1\" foi adicionada à sua lista de vigiadas.",
        "removewatch": "Remover das páginas vigiadas",
        "removedwatchtext": "A página \"[[:$1]]\" foi removida da sua lista de [[Special:Watchlist|páginas vigiadas]].",
+       "removedwatchtext-short": "A página \"$1\" foi removida da sua lista de vigiadas.",
        "watch": "Vigiar",
        "watchthispage": "Vigiar esta página",
        "unwatch": "Desinteressar-se",
        "unwatchthispage": "Parar de vigiar esta página",
        "notanarticle": "Não é uma página de conteúdo",
        "notvisiblerev": "Edição eliminada",
-       "watchlist-details": "{{PLURAL:$1|Existe $1 página|Existem $1 páginas}} na sua lista de páginas vigiadas, excluindo páginas de discussão.",
+       "watchlist-details": "{{PLURAL:$1|Existe $1 página|Existem $1 páginas}} em sua lista de páginas vigiadas, excluindo-se as páginas de discussão.",
        "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'''.",
-       "watchmethod-recent": "a procurar páginas vigiadas nas mudanças recentes",
-       "watchmethod-list": "a procurar mudanças recentes nas páginas vigiadas",
-       "watchlistcontains": "A sua lista de páginas vigiadas contém $1 {{PLURAL:$1|página|páginas}}.",
-       "iteminvalidname": "Problema com item '$1', nome inválido...",
        "wlnote2": "Estão listadas abaixo as mudanças realizadas {{PLURAL:$1|na última hora|nas últimas <strong>$1</strong> horas}}, a partir de $2, $3.",
        "wlshowlast": "Ver últimas $1 horas $2 dias $3",
        "watchlist-options": "Opções da lista de páginas vigiadas",
        "enotif_lastvisited": "Consulte $1 para todas as alterações efetuadas desde a sua última visita.",
        "enotif_lastdiff": "Consulte $1 para ver esta alteração.",
        "enotif_anon_editor": "utilizador anónimo $1",
-       "enotif_body": "{{GENDER:$WATCHINGUSERNAME|Caro|Cara|Caro(a)}} $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nResumo da edição: $PAGESUMMARY $PAGEMINOREDIT\n\nContacte o editor:\ncorreio eletrónico: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nAté se autenticar e visitar novamente esta página, não receberá mais notificações das alterações futuras. Também pode reativar as notificações para todas páginas na sua lista de páginas vigiadas.\n\nO seu sistema de notificação amigável da {{SITENAME}}\n\n--\nPara alterar as suas preferências de notificação por correio eletrónico, visite\n{{canonicalurl:{{#special:Preferences}}}}\n\nPara alterar as suas preferências das páginas vigiadas, visite\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPara retirar a página da lista de páginas vigiadas, visite\n$UNWATCHURL\n\nPara comentários e pedidos de ajuda:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "{{GENDER:$WATCHINGUSERNAME|Caro|Cara|Caro(a)}} $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nResumo da edição: $PAGESUMMARY $PAGEMINOREDIT\n\nContacte o editor:\ncorreio eletrónico: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nAté se autenticar e visitar novamente esta página, não receberá mais notificações das alterações futuras. Também pode reativar as notificações para todas páginas na sua lista de páginas vigiadas.\n\nO seu sistema de notificação amigável da {{SITENAME}}\n\n--\nPara alterar as suas preferências de notificação por correio eletrónico, visite\n{{canonicalurl:{{#special:Preferences}}}}\n\nPara alterar as suas preferências das páginas vigiadas, visite\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPara retirar a página da lista de páginas vigiadas, visite\n$UNWATCHURL\n\nPara comentários e pedidos de ajuda:\n$HELPPAGE",
        "created": "criada",
        "changed": "alterada",
        "deletepage": "Eliminar página",
        "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.",
-       "deleting-backlinks-warning": "'''Aviso:''' Há [[Special:WhatLinksHere/{{FULLPAGENAME}}|páginas]] que contêm links para a página que está prestes a eliminar ou que a transcluem.",
+       "deleting-backlinks-warning": "'''Aviso:''' Há [[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": "Voltar",
        "rollbacklink": "voltar",
        "undeleterevdel": "O restauro não será efetuado se resulta na remoção parcial da versão mais recente da página ou ficheiro.\nNestes casos, deverá desmarcar ou revelar a versão eliminada mais recente.",
        "undeletehistorynoadmin": "Esta página foi eliminada. O motivo de eliminação é apresentado no sumário abaixo, junto dos detalhes do utilizador que editou esta página antes de eliminar. O texto atual destas edições eliminadas encontra-se agora apenas disponível para administradores.",
        "undelete-revision": "Edição eliminada da página $1 (das $5 de $4), por $3:",
-       "undeleterevision-missing": "Edição inválida ou não encontrada.\nPode ter usado um link incorreto ou talvez a revisão tenha sido restaurada ou removida do arquivo.",
+       "undeleterevision-missing": "Edição inválida ou não encontrada.\nPode ter usado uma ligação incorreta ou talvez a revisão tenha sido restaurada ou removida do arquivo.",
        "undelete-nodiff": "Não foram encontradas edições anteriores.",
        "undeletebtn": "Restaurar",
        "undeletelink": "ver/restaurar",
        "contributions-title": "Contribuições {{GENDER:$1|do utilizador|da utilizadora}} $1",
        "mycontris": "Contribuições",
        "contribsub2": "Para {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "A conta de utilizador \"$1\" não está registrada.",
        "nocontribs": "Não foram encontradas alterações com este critério.",
        "uctop": "(atual)",
        "month": "Até o mês:",
        "sp-contributions-uploads": "carregamentos",
        "sp-contributions-logs": "registos",
        "sp-contributions-talk": "discussão",
-       "sp-contributions-userrights": "gestão de privilégios de utilizador",
+       "sp-contributions-userrights": "gestão de privilégios do utilizador",
        "sp-contributions-blocked-notice": "Este utilizador está bloqueado neste momento.\nPara referência é apresentado abaixo o último registo de bloqueio:",
        "sp-contributions-blocked-notice-anon": "Este endereço IP está bloqueado neste momento.\nPara referência é apresentado abaixo o último registo de bloqueio:",
        "sp-contributions-search": "Pesquisar contribuições",
        "sp-contributions-newonly": "Mostrar só edições que são criações de páginas",
        "sp-contributions-submit": "Pesquisar",
        "whatlinkshere": "Páginas afluentes",
-       "whatlinkshere-title": "Páginas que têm links para \"$1\"",
+       "whatlinkshere-title": "Páginas que têm ligações para \"$1\"",
        "whatlinkshere-page": "Página:",
        "linkshere": "As seguintes páginas têm ligação a '''[[:$1]]''':",
        "nolinkshere": "Não existem afluentes para '''[[:$1]]''' com as condições especificadas.",
-       "nolinkshere-ns": "Não existem links para '''[[:$1]]''' no espaço nominal selecionado.",
+       "nolinkshere-ns": "Não existem ligações para '''[[:$1]]''' no espaço nominal selecionado.",
        "isredirect": "página de redirecionamento",
        "istemplate": "inclusão",
-       "isimage": "link para o ficheiro",
+       "isimage": "ligação para ficheiro",
        "whatlinkshere-prev": "{{PLURAL:$1|anterior|$1 anteriores}}",
        "whatlinkshere-next": "{{PLURAL:$1|próximo|próximos $1}}",
-       "whatlinkshere-links": "← links",
+       "whatlinkshere-links": "← ligações",
        "whatlinkshere-hideredirs": "$1 redirecionamentos",
        "whatlinkshere-hidetrans": "$1 transclusões",
-       "whatlinkshere-hidelinks": "$1 links",
-       "whatlinkshere-hideimages": "$1 links para ficheiros",
+       "whatlinkshere-hidelinks": "$1 ligações",
+       "whatlinkshere-hideimages": "$1 ligações para ficheiros",
        "whatlinkshere-filters": "Filtros",
        "autoblockid": "Bloqueio automático nº$1",
        "block": "Bloquear utilizador",
        "blockip": "Bloquear utilizador",
        "blockip-legend": "Bloquear utilizador",
        "blockiptext": "Utilize o formulário abaixo para bloquear o acesso de escrita a um endereço IP específico ou a um nome de utilizador.\nIsto só deve ser feito para prevenir vandalismo e de acordo com a [[{{MediaWiki:Policy-url}}|política]]. Indique a seguir um motivo de bloqueio específico (por exemplo, indicando as páginas que foram alvo de vandalismo).",
-       "ipadressorusername": "Endereço IP ou nome de utilizador:",
+       "ipaddressorusername": "Endereço IP ou nome de utilizador:",
        "ipbexpiry": "Expiração:",
        "ipbreason": "Motivo:",
-       "ipbreason-dropdown": "*Razões comuns para um bloqueio\n** Inserção de informações falsas\n** Remoção de conteúdos de páginas\n** Inserção de \"spam\" para sites externos\n** Inserção de conteúdo sem sentido/incompreensível nas páginas\n** Comportamento intimidador/inoportuno\n** Uso abusivo de contas múltiplas\n** Nome de utilizador inaceitável",
+       "ipbreason-dropdown": "*Razões comuns para um bloqueio\n** Inserção de informações falsas\n** Remoção de conteúdos de páginas\n** Inserção de \"spam\" para sítios externos\n** Inserção de conteúdo sem sentido/incompreensível nas páginas\n** Comportamento intimidador/inoportuno\n** Uso abusivo de contas múltiplas\n** Nome de utilizador inaceitável",
        "ipb-hardblock": "Impedir que utilizadores autenticados editem a partir deste endereço IP",
        "ipbcreateaccount": "Impedir criação de contas de utilizador",
        "ipbemailban": "Impedir utilizador de enviar correio eletrónico",
        "anononlyblock": "apenas anón.",
        "noautoblockblock": "bloqueio automático desativado",
        "createaccountblock": "criação de conta bloqueada",
-       "emailblock": "correio eletrónico bloqueado",
+       "emailblock": "correio electrónico desactivado",
        "blocklist-nousertalk": "impedido de editar a própria página de discussão",
        "ipblocklist-empty": "A lista de bloqueios encontra-se vazia.",
        "ipblocklist-no-results": "O endereço IP ou nome de utilizador procurado não se encontra bloqueado.",
        "block-log-flags-anononly": "apenas utilizadores anónimos",
        "block-log-flags-nocreate": "criação de contas impossibilitada",
        "block-log-flags-noautoblock": "bloqueio automático desativado",
-       "block-log-flags-noemail": "correio eletrónico bloqueado",
+       "block-log-flags-noemail": "correio electrónico desactivado",
        "block-log-flags-nousertalk": "impossibilitado de editar a própria página de discussão",
        "block-log-flags-angry-autoblock": "ativado o bloqueio automático melhorado",
-       "block-log-flags-hiddenname": "nome de utilizador ocultado",
+       "block-log-flags-hiddenname": "nome de utilizador oculto",
        "range_block_disabled": "A funcionalidade de administrador para o bloqueio de gamas de IPs está desativada.",
        "ipb_expiry_invalid": "Tempo de expiração inválido.",
        "ipb_expiry_temp": "Bloqueios com nome de utilizador ocultado devem ser permanentes.",
        "lockedbyandtime": "(por $1 em $2 às $3)",
        "move-page": "Mover $1",
        "move-page-legend": "Mover página",
-       "movepagetext": "Usando o formulário abaixo pode mover esta página e todo o seu histórico de edições para uma página nova com outro nome.\nA página original será transformada num redirecionamento para a página nova.\nPode corrigir de forma automática os redirecionamentos existentes que apontam para a página original.\nCaso escolha não o fazer, após a operação certifique-se de que dela não resultaram  [[Special:DoubleRedirects|redirecionamentos duplos]] ou [[Special:BrokenRedirects|quebrados]].\nÉ da sua responsabilidade verificar que os links continuam a apontar para onde é suposto que apontem.\n\nNote que a página '''não''' será movida se já existir uma página com o novo título, a menos que esta última seja um redirecionamento sem qualquer histórico de edições.\nIsto significa que pode mover uma página de volta para o seu nome original se a tiver movido por engano e que não pode mover uma página para cima de outra já existente.\n\n'''CUIDADO!'''\nNuma página popular esta operação pode representar uma mudança drástica e inesperada;\ncertifique-se de que compreende as consequências da mudança antes de prosseguir, por favor.",
-       "movepagetext-noredirectfixer": "Usando o formulário abaixo, pode alterar o nome de uma página e mover todo o histórico desta para o nome novo.\nA página antiga é transformada numa página de redirecionamento para a nova.\nVerifique a existência de [[Special:DoubleRedirects|redirecionamentos duplos]] ou [[Special:BrokenRedirects|quebrados]].\nÉ da sua responsabilidade certificar-se de que os links continuam a apontar para onde é suposto.\n\nNote que a página '''não''' será movida se já existir uma página com o nome novo, a menos que esta página já existente esteja vazia ou seja uma página de redirecionamento e não tenha um histórico de edições.\nIsto também significa que, se se tiver enganado, pode alterar o nome da página movida de volta para o seu nome original; e que não pode sobrescrever o conteúdo de uma página existente.\n\n'''Aviso!'''\nPara páginas populares, esta operação pode representar uma mudança drástica e inesperada;\ncertifique-se de que compreende as consequências da operação antes de continuar.",
+       "movepagetext": "Usando o formulário abaixo pode mover esta página e todo o seu histórico de edições para uma página nova com outro nome.\nA página original será transformada num redirecionamento para a página nova.\nPode corrigir de forma automática os redirecionamentos existentes que apontam para a página original.\nCaso escolha não o fazer, após a operação certifique-se de que dela não resultaram  [[Special:DoubleRedirects|redirecionamentos duplos]] ou [[Special:BrokenRedirects|quebrados]].\nÉ da sua responsabilidade verificar que as ligações continuam a apontar para onde é suposto que apontem.\n\nNote que a página '''não''' será movida se já existir uma página com o novo título, a menos que esta última seja um redirecionamento sem qualquer histórico de edições.\nIsto significa que pode mover uma página de volta para o seu nome original se a tiver movido por engano e que não pode mover uma página para cima de outra já existente.\n\n'''CUIDADO!'''\nNuma página popular esta operação pode representar uma mudança drástica e inesperada;\ncertifique-se de que compreende as consequências da mudança antes de prosseguir, por favor.",
+       "movepagetext-noredirectfixer": "Usando o formulário abaixo, pode alterar o nome de uma página e mover todo o histórico desta para o nome novo.\nA página antiga é transformada numa página de redirecionamento para a nova.\nVerifique a existência de [[Special:DoubleRedirects|redirecionamentos duplos]] ou [[Special:BrokenRedirects|quebrados]].\nÉ da sua responsabilidade certificar-se de que as ligações continuam a apontar para onde é suposto.\n\nNote que a página '''não''' será movida se já existir uma página com o nome novo, a menos que esta página já existente esteja vazia ou seja uma página de redirecionamento e não tenha um histórico de edições.\nIsto também significa que, se se tiver enganado, pode alterar o nome da página movida de volta para o seu nome original; e que não pode sobrescrever o conteúdo de uma página existente.\n\n'''Aviso!'''\nPara páginas populares, esta operação pode representar uma mudança drástica e inesperada;\ncertifique-se de que compreende as consequências da operação antes de continuar.",
        "movepagetalktext": "Se existir uma página de discussão associada, ela será automaticamente movida, '''a não ser que:'''\n*já exista uma página de discussão com o novo título que não esteja vazia, ou\n*desmarque a correspondente caixa de seleção abaixo.\n\nNestes casos, terá de mover a página de discussão manualmente, ou fundi-la com a existente, se assim desejar.",
        "movearticle": "Mover página",
        "moveuserpage-warning": "'''Aviso:''' Está prestes a mover uma página de utilizador. Note que a página será apenas movida, ''sem'' alterar o nome do utilizador.",
+       "movecategorypage-warning": "<strong>Aviso:</strong> Está prestes a mover uma categoria. Por favor, note que apenas moverá a página da categoria e quaisquer páginas que estejam listadas <em>não</em> serão recategorizadas na nova.",
        "movenologintext": "Precisa de ser um utilizador registado e [[Special:UserLogin|autenticado]] para poder mover uma página.",
        "movenotallowed": "Não tem permissão para mover páginas.",
        "movenotallowedfile": "Não possui permissão para mover ficheiros.",
        "cant-move-user-page": "Não tem permissão para mover páginas de utilizador (pode mover sub-páginas).",
        "cant-move-to-user-page": "Não tem permissão para mover uma página para uma página de utilizador (pode movê-la para uma subpágina de utilizador).",
+       "cant-move-category-page": "Não possui permissão para mover categorias.",
+       "cant-move-to-category-page": "Não possui permissão para mover uma página para uma categoria.",
        "newtitle": "Para novo título",
        "move-watch": "Vigiar esta página",
        "movepagebtn": "Mover página",
        "movepage-moved-noredirect": "A criação de um redirecionamento foi suprimida.",
        "articleexists": "Uma página com este nome já existe, ou o nome que escolheu é inválido.\nEscolha outro nome, por favor.",
        "cantmove-titleprotected": "Não pode mover uma página para esse destino, porque o novo título foi protegido para evitar a sua criação",
-       "movetalk": "Mover também a página de discussão associada.",
+       "movetalk": "Mover também a página de discussão associada",
        "move-subpages": "Mover subpáginas (até $1)",
        "move-talk-subpages": "Mover subpáginas da página de discussão (até $1)",
        "movepage-page-exists": "A página $1 já existe e não pode ser substituída.",
        "selfmove": "Os títulos de origem e destino são iguais;\nnão é possível mover uma página para ela mesma.",
        "immobile-source-namespace": "Não é possível mover páginas no espaço nominal \"$1\"",
        "immobile-target-namespace": "Não é possível mover páginas para o espaço nominal \"$1\"",
-       "immobile-target-namespace-iw": "Um link interwikis não é um destino válido para uma movimentação de página.",
+       "immobile-target-namespace-iw": "Uma ligação interlíngua não é um destino válido para uma movimentação de página.",
        "immobile-source-page": "Esta página não pode ser movida.",
        "immobile-target-page": "Não é possível mover para esse título de destino.",
        "bad-target-model": "O destino pretendido usa um modelo de conteúdo diferente. Não é possível converter de $1 para $2.",
        "importfailed": "A importação falhou: $1",
        "importunknownsource": "Tipo da fonte de importação desconhecido",
        "importcantopen": "Não foi possível abrir o ficheiro a importar",
-       "importbadinterwiki": "Link interwikis incorrecto",
+       "importbadinterwiki": "Ligação interlíngua incorreta",
        "importsuccess": "Importação completa!",
        "importnosources": "Não foram definidas fontes de importação transwikis e o carregamento direto de históricos encontra-se desativado.",
        "importnofile": "Nenhum ficheiro de importação foi carregado.",
        "import-invalid-interwiki": "Não é possível importar da wiki especificada.",
        "import-error-edit": "A página \"$1\" não foi importada porque você não tem permissão para editá-la.",
        "import-error-create": "A página \"$1\" não foi importada porque você não tem permissão para criá-la.",
-       "import-error-interwiki": "A página \"$1\" não pode ser importada pois seu nome está reservado para um link externo (interwiki).",
+       "import-error-interwiki": "A página \"$1\" não pode ser importada pois o seu nome está reservado para um ligação externa (interlíngua).",
        "import-error-special": "A página \"$1\" não pode ser importada porque ela pertence a um espaço nominal especial que não permite páginas.",
        "import-error-invalid": "A página \"$1\" não pode ser importada porque seu nome é inválido.",
        "import-error-unserialize": "Revisão $2 da página \"$1\" não pode ser desserializada. Foi relatado que a revisão usava o modelo de conteúdo $3 serializado como $4.",
        "tooltip-pt-watchlist": "Lista de mudanças nas páginas que está a vigiar",
        "tooltip-pt-mycontris": "Lista das suas contribuições",
        "tooltip-pt-login": "É encorajado a autenticar-se, apesar de não ser obrigatório.",
-       "tooltip-pt-logout": "Terminar esta sessão na wiki",
+       "tooltip-pt-logout": "Sair da conta",
        "tooltip-ca-talk": "Discussão sobre o conteúdo da página",
        "tooltip-ca-edit": "Pode editar esta página.\nUtilize o botão \"Antever resultado\" antes de gravar, por favor.",
        "tooltip-ca-addsection": "Iniciar uma nova seção",
        "tooltip-n-recentchanges": "A lista de mudanças recentes nesta wiki.",
        "tooltip-n-randompage": "Carregar página aleatória",
        "tooltip-n-help": "Um local reservado para auxílio.",
-       "tooltip-t-whatlinkshere": "Lista de todas as páginas que contêm links para esta",
-       "tooltip-t-recentchangeslinked": "Mudanças recentes nas páginas para as quais esta contém links",
+       "tooltip-t-whatlinkshere": "Lista de todas as páginas que contêm ligações para esta",
+       "tooltip-t-recentchangeslinked": "Mudanças recentes nas páginas para as quais esta contém ligação",
        "tooltip-feed-rss": "''Feed'' RSS desta página",
        "tooltip-feed-atom": "''Feed'' Atom desta página",
        "tooltip-t-contributions": "Ver as contribuições deste utilizador",
        "tooltip-t-upload": "Upload de ficheiros",
        "tooltip-t-specialpages": "Lista de páginas especiais",
        "tooltip-t-print": "Versão para impressão desta página",
-       "tooltip-t-permalink": "Link permanente para esta versão desta página",
+       "tooltip-t-permalink": "Ligação permanente para esta versão desta página",
        "tooltip-ca-nstab-main": "Ver a página de conteúdo",
        "tooltip-ca-nstab-user": "Ver a página de utilizador",
        "tooltip-ca-nstab-media": "Ver a página de multimédia",
        "tooltip-summary": "Introduza um resumo breve",
        "interlanguage-link-title": "$1 — $2",
        "common.css": "/* Código CSS colocado aqui será aplicado a todos os temas */",
-       "cologneblue.css": "/* Código CSS colocado aqui afectará os utilizadores do tema Azul colonial */",
        "monobook.css": "/* Código CSS colocado aqui afectará os utilizadores do tema Monobook */",
-       "modern.css": "/* Código CSS colocado aqui afectará os utilizadores do tema Moderno */",
        "vector.css": "/* Código CSS colocado aqui afectará os utilizadores do tema Vector */",
        "print.css": "/* Código CSS colocado aqui afectará as impressões */",
        "noscript.css": "/* Os estilos CSS colocados aqui afetarão os utilizadores que tenham o JavaScript desativado em seus navegadores */",
        "common.js": "/* Código Javascript colocado aqui será carregado para todos os utilizadores em cada carregamento de página */",
-       "cologneblue.js": "/* Código Javascript colocado aqui será carregado para utilizadores do tema Azul colonial */",
        "monobook.js": "/* Código Javascript colocado aqui será carregado para utilizadores do tema Monobook */",
-       "modern.js": "/* Código Javascript colocado aqui será carregado para utilizadores do tema Moderno */",
        "vector.js": "/* Código Javascript colocado aqui será carregado para utilizadores do tema Vector */",
-       "notacceptable": "O servidor não pode fornecer os dados num formato que o seu cliente possa ler.",
        "anonymous": "{{PLURAL:$1|Utilizador anónimo|Utilizadores anónimos}} da {{SITENAME}}",
        "siteuser": "$1 da {{SITENAME}}",
        "anonuser": "utilizador anónimo $1 da {{SITENAME}}",
        "creditspage": "Créditos da página",
        "nocredits": "Não há informação disponível sobre os créditos desta página.",
        "spamprotectiontitle": "Filtro de proteção contra spam",
-       "spamprotectiontext": "A página que deseja gravar foi bloqueada pelo filtro de ''spam''.\nEste bloqueio foi provavelmente causado por um link para um site externo que consta da lista negra.",
+       "spamprotectiontext": "A página que deseja gravar foi bloqueada pelo filtro de ''spam''.\nEste bloqueio foi provavelmente causado por uma ligação para um sítio externo que consta da lista negra.",
        "spamprotectionmatch": "O seguinte texto activou o filtro de spam: $1",
        "spambot_username": "MediaWiki limpeza de spam",
-       "spam_reverting": "A reverter para a última revisão que não contém links para $1",
-       "spam_blanking": "Todas as revisões continham links para $1; a esvaziar",
-       "spam_deleting": "Todas as revisões continham links para $1; a eliminar",
+       "spam_reverting": "A reverter para a última revisão que não contém ligação para $1",
+       "spam_blanking": "Todas as revisões continham ligações para $1; a esvaziar",
+       "spam_deleting": "Todas as revisões continham ligações para $1; a eliminar",
        "simpleantispam-label": "Verificação contra spam.\n<strong>NÃO</strong> preencha isto!",
        "pageinfo-title": "Informações sobre \"$1\"",
        "pageinfo-not-current": "Desculpe, é impossível fornecer esta informação para revisões antigas.",
        "pageinfo-category-pages": "Número de páginas",
        "pageinfo-category-subcats": "Número de subcategorias",
        "pageinfo-category-files": "Número de ficheiros",
-       "skinname-cologneblue": "Azul colonial",
        "skinname-monobook": "MonoBook",
-       "skinname-modern": "Moderno",
        "skinname-vector": "Vector",
        "markaspatrolleddiff": "Marcar como patrulhada",
        "markaspatrolledtext": "Marcar esta página como patrulhada",
        "newimages-summary": "Esta página especial mostra os ficheiros mais recentemente enviados.",
        "newimages-legend": "Filtrar",
        "newimages-label": "Nome de ficheiro (ou parte dele):",
-       "showhidebots": "($1 robôs)",
+       "newimages-showbots": "Mostrar carregamentos feitos por robôs",
        "noimages": "Nada para ver.",
        "ilsubmit": "Pesquisar",
        "bydate": "por data",
        "saturday-at": "Sábado às $1",
        "sunday-at": "Domingo às $1",
        "yesterday-at": "Ontem às $1",
-       "bad_image_list": "O formato é o seguinte:\n\nSó são reconhecidos elementos na forma de lista (linhas começadas por *).\nO primeiro link em cada linha deve apontar para o ficheiro que se pretende bloquear.\nQuaisquer outros links nessa mesma linha são considerados excepções (ou seja, páginas de onde se pode aceder ao ficheiro).",
+       "bad_image_list": "O formato é o seguinte:\n\nSó são reconhecidos elementos na forma de lista (linhas começadas por *).\nO primeiro link em cada linha deve apontar para o ficheiro que se pretende bloquear.\nQuaisquer outras ligações nessa mesma linha são considerados excepções (ou seja, páginas de onde se pode aceder ao ficheiro).",
        "metadata": "Metadados",
        "metadata-help": "Este ficheiro contém informação adicional, provavelmente acrescentada pela câmara digital ou pelo digitalizador usados para criá-lo.\nCaso o ficheiro tenha sido modificado a partir do seu estado original, alguns detalhes poderão não refletir completamente as mudanças efetuadas.",
        "metadata-expand": "Mostrar detalhes adicionais",
        "exif-originaldocumentid": "Identificação exclusiva do documento original",
        "exif-licenseurl": "URL da licença",
        "exif-morepermissionsurl": "Informações para licenciamento alternativo",
-       "exif-attributionurl": "Ao reutilizar esta obra, coloque um link para",
+       "exif-attributionurl": "Ao reutilizar esta obra, faça a atribuição a",
        "exif-preferredattributionname": "Ao reutilizar esta obra, faça a atribuição a",
        "exif-pngfilecomment": "Comentário de ficheiro PNG",
        "exif-disclaimer": "Exoneração de responsabilidade",
        "monthsall": "todos",
        "confirmemail": "Confirmar endereço de correio eletrónico",
        "confirmemail_noemail": "Não tem um endereço de correio eletrónico válido nas suas [[Special:Preferences|preferências de utilizador]].",
-       "confirmemail_text": "A {{SITENAME}} requer que valide o seu endereço de correio eletrónico antes de usar as funcionalidades de correio.\nClique o botão abaixo para enviar uma mensagem de confirmação para o seu endereço.\nA mensagem incluirá uma URL que contém um código;\ninsira a URL no seu browser para confirmar que o seu endereço de correio eletrónico é válido.",
+       "confirmemail_text": "{{SITENAME}} requer que valide o seu endereço de correio eletrónico antes de usar as funcionalidades de correio.\nClique o botão abaixo para enviar uma mensagem de confirmação para o seu endereço.\nA mensagem incluirá uma URL que contém um código;\ninsira a URL no seu navegador para confirmar que o seu endereço de correio eletrónico é válido.",
        "confirmemail_pending": "Um código de confirmação já lhe foi enviado;\ncaso tenha criado a conta recentemente, é recomendado que aguarde alguns minutos até o receber antes de tentar pedir um novo código.",
        "confirmemail_send": "Enviar código de confirmação",
        "confirmemail_sent": "Correio de confirmação enviado.",
        "confirmemail_success": "O seu endereço de correio eletrónico foi confirmado.\nPode agora [[Special:UserLogin|autenticar-se]] e desfrutar da wiki.",
        "confirmemail_loggedin": "O seu endereço de correio eletrónico foi confirmado.",
        "confirmemail_subject": "Confirmação de endereço de correio eletrónico da {{SITENAME}}",
-       "confirmemail_body": "Alguém, provavelmente você a partir do endereço IP $1,\nregistou uma conta \"$2\" com este endereço de correio eletrónico na {{SITENAME}}.\n\nPara confirmar que esta conta é realmente sua e ativar\nas funcionalidades de correio eletrónico na {{SITENAME}},\nabra o seguinte link no seu browser:\n\n$3\n\nSe a conta *não* é sua, abra o seguinte link para cancelar\na confirmação do endereço de correio eletrónico:\n\n$5\n\nEste código de confirmação expira a $4.",
-       "confirmemail_body_changed": "Alguém, provavelmente você a partir do endereço IP $1,\nalterou o endereço de correio eletrónico da conta \"$2\" para este na {{SITENAME}}.\n\nPara confirmar que esta conta é realmente sua e reativar\nas funcionalidades de correio eletrónico na {{SITENAME}},\nabra o seguinte link no seu browser:\n\n$3\n\nCaso a conta *não* lhe pertença, abra o seguinte link\npara cancelar a confirmação do endereço de correio eletrónico:\n\n$5\n\nEste código de confirmação expira a $4.",
-       "confirmemail_body_set": "Alguém, provavelmente você a partir do endereço IP $1,\ndefiniu o seu endereço de correio eletrónico como correio da conta \"$2\" na {{SITENAME}}.\n\nPara confirmar que esta conta é realmente sua e reativar\nas funcionalidades de correio eletrónico na {{SITENAME}},\nabra o seguinte link no seu browser:\n\n$3\n\nCaso a conta *não* lhe pertença, abra o seguinte link\npara cancelar a confirmação do endereço de correio eletrónico:\n\n$5\n\nEste código de confirmação expira a $4.",
+       "confirmemail_body": "Alguém, provavelmente você a partir do endereço IP $1,\nregistou uma conta \"$2\" com este endereço de correio electrónico em {{SITENAME}}.\n\nPara confirmar que esta conta é realmente sua e activar\nas funcionalidades de correio electrónico em {{SITENAME}}, abra a seguinte ligação no seu navegador:\n\n$3\n\nSe a conta *não* é sua, abra a seguinte ligação para cancelar a confirmação do endereço de correio electrónico:\n\n$5\n\nEste código de confirmação expira a $4.",
+       "confirmemail_body_changed": "Alguém, provavelmente você a partir do endereço IP $1,\nalterou o endereço de correio eletrónico da conta \"$2\" para este em {{SITENAME}}.\n\nPara confirmar que esta conta é realmente sua e reativar\nas funcionalidades de correio eletrónico em {{SITENAME}},\nabra o seguinte ligação no seu navegador:\n\n$3\n\nCaso a conta *não* lhe pertença, abra a seguinte ligação\npara cancelar a confirmação do endereço de correio eletrónico:\n\n$5\n\nEste código de confirmação expira a $4.",
+       "confirmemail_body_set": "Alguém, provavelmente você a partir do endereço IP $1,\ndefiniu o seu endereço de correio eletrónico como correio da conta \"$2\" em {{SITENAME}}.\n\nPara confirmar que esta conta é realmente sua e reativar\nas funcionalidades de correio eletrónico em {{SITENAME}},\nabra a seguinte ligação no seu navegador:\n\n$3\n\nCaso a conta *não* lhe pertença, abra a seguinte ligação\npara cancelar a confirmação do endereço de correio eletrónico:\n\n$5\n\nEste código de confirmação expira a $4.",
        "confirmemail_invalidated": "Confirmação de endereço de correio eletrónico cancelada",
        "invalidateemail": "Cancelar confirmação do correio eletrónico",
        "scarytranscludedisabled": "[Transclusão interwikis foi impossibilitada]",
        "autosumm-replace": "Página substituída por '$1'",
        "autoredircomment": "Redirecionamento para [[$1]]",
        "autosumm-new": "Criou página com: '$1'",
-       "livepreview-loading": "A carregar…",
-       "livepreview-ready": "A carregar... Terminado!",
-       "livepreview-failed": "A antevisão instantânea falhou!\nTente a antevisão normal.",
-       "livepreview-error": "Falha ao ligar: $1 \"$2\"\nTente a antevisão normal.",
        "lag-warn-normal": "Alterações realizadas {{PLURAL:$1|no último segundo|nos últimos $1 segundos}} podem não constar desta lista.",
        "lag-warn-high": "Devido a latência elevada no acesso ao servidor da base de dados, as alterações realizadas {{PLURAL:$1|no último segundo|nos últimos $1 segundos}} podem não constar desta lista.",
-       "watchlistedit-numitems": "A sua lista de páginas vigiadas contém {{PLURAL:$1|uma página|$1 páginas}}, excluindo páginas de discussão.",
-       "watchlistedit-noitems": "A sua lista de páginas vigiadas está vazia.",
        "watchlistedit-normal-title": "Editar lista de páginas vigiadas",
        "watchlistedit-normal-legend": "Remover páginas da lista de páginas vigiadas",
        "watchlistedit-normal-explain": "As suas páginas vigiadas são listadas abaixo.\nPara remover uma página, marque a caixa de seleção correspondente e clique o botão \"{{int:Watchlistedit-normal-submit}}\".\nTambém pode [[Special:EditWatchlist/raw|editar a lista de páginas vigiadas em forma de texto]].",
        "watchlistedit-raw-done": "A sua lista de páginas vigiadas foi atualizada.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Foi adicionada uma página|Foram adicionadas $1 páginas}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Foi removida uma página|Foram removidas $1 páginas}}:",
+       "watchlistedit-clear-title": "Lista de páginas vigiadas limpa",
+       "watchlistedit-clear-legend": "Limpar 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": "Páginas:",
+       "watchlistedit-clear-submit": "Limpar páginas vigiadas (isto é permanente!)",
+       "watchlistedit-clear-done": "A sua lista de páginas vigiadas foi limpa.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|1 página foi removida|$1 páginas foram removidas}}:",
+       "watchlistedit-too-many": "Existem demasiadas páginas para exibir.",
+       "watchlisttools-clear": "Limpar lista de páginas vigiadas",
        "watchlisttools-view": "Ver alterações relevantes",
        "watchlisttools-edit": "Ver e editar a lista de páginas vigiadas",
        "watchlisttools-raw": "Editar a lista de páginas vigiadas em forma de texto",
        "specialpages-group-spam": "Ferramentas anti-spam",
        "blankpage": "Página em branco",
        "intentionallyblankpage": "Esta página foi intencionalmente deixada em branco",
-       "external_image_whitelist": " # Deixe esta linha exatamente como ela está<pre>\n# Coloque fragmentos de expressões regulares (apenas a parte entre //) abaixo\n# Estas serão comparadas com as URLs das imagens externas (com link direto)\n# As que corresponderem serão apresentadas como imagens, caso contrário apenas será apresentado um link para a imagem\n# As linhas que começam com um símbolo de cardinal (#) são tratadas como comentários\n# Esta lista não distingue maiúsculas de minúsculas\n\n# Coloque todos os fragmentos de expressões regulares (regex) acima desta linha. Deixe esta linha exatamente como ela está</pre>",
+       "external_image_whitelist": " # Deixe esta linha exatamente como ela está<pre>\n# Coloque fragmentos de expressões regulares (apenas a parte entre //) abaixo\n# Estas serão comparadas com as URL das imagens externas (com ligação direta)\n# As que corresponderem serão apresentadas como imagens, caso contrário apenas será apresentado um link para a imagem\n# As linhas que começam com um símbolo de cardinal (#) são tratadas como comentários\n# Esta lista não distingue maiúsculas de minúsculas\n\n# Coloque todos os fragmentos de expressões regulares (regex) acima desta linha. Deixe esta linha exatamente como ela está</pre>",
        "tags": "Etiquetas de modificação válidas",
        "tag-filter": "Filtro de [[Special:Tags|etiquetas]]:",
        "tag-filter-submit": "Filtrar",
        "compare-invalid-title": "O título que especificou é inválido.",
        "compare-title-not-exists": "O título que especificou não existe.",
        "compare-revision-not-exists": "A revisão que especificou não existe.",
-       "dberr-header": "Esta wiki tem um problema",
        "dberr-problems": "Desculpe! Este site está com dificuldades técnicas.",
        "dberr-again": "Experimente esperar alguns minutos e atualizar.",
        "dberr-info": "(Não foi possível contactar o servidor da base de dados: $1)",
        "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 é necessário.",
        "sqlite-has-fts": "$1 com suporte de pesquisa de texto completo",
        "sqlite-no-fts": "$1 sem suporte de pesquisa de texto completo",
        "logentry-delete-delete": "$1 apagou a página $3",
index 4e4872d..e8173ea 100644 (file)
        "jumptonavigation": "Part of the \"jump to\" navigation links. Hidden by default in monobook skin. The format is: [[MediaWiki:Jumpto/{{SUBPAGENAME}}|{{int:jumpto}}]] {{int:jumptonavigation}}, [[MediaWiki:Jumptosearch/{{SUBPAGENAME}}|{{int:jumptosearch}}]].\n\n{{Identical|Navigation}}",
        "jumptosearch": "Part of the \"jump to\" navigation links. Hidden by default in monobook skin. The format is: [[MediaWiki:Jumpto/{{SUBPAGENAME}}|{{int:jumpto}}]] [[MediaWiki:Jumptonavigation/{{SUBPAGENAME}}|{{int:jumptonavigation}}]], {{int:jumptosearch}}.\n\n{{Identical|Search}}",
        "view-pool-error": "Error message. Parameters:\n* $1 - probably unused",
+       "generic-pool-error": "Error message",
        "pool-timeout": "Part of {{msg-mw|view-pool-error}}.\n\nFor explanation of 'lock' see [[w:Lock_(computer_science)|wikipedia]].",
        "pool-queuefull": "Part of {{msg-mw|view-pool-error}}\n\n\"Pool\" refers to a pool of processes.",
        "pool-errorunknown": "Part of {{msg-mw|view-pool-error}}.\n{{Identical|Unknown error}}",
        "versionrequired": "This message is not used in the MediaWiki core, but was introduced with the reason that it could be useful for extensions.\n\nParameters:\n* $1 - MediaWiki version number\nSee also:\n* {{msg-mw|Versionrequiredtext}}",
        "versionrequiredtext": "This message is not used in the MediaWiki core, but was introduced with the reason that it could be useful for extensions.\n\nParameters:\n* $1 - MediaWiki version number\nSee also:\n* {{msg-mw|Versionrequired}}",
        "ok": "{{Identical|OK}}",
-       "pagetitle": "{{Optional}}\n{{doc-important|You most probably do not need to translate this message.}}\nDo '''not''' replace SITENAME with a translation of Wikipedia or some encycopedic additions. The message has to be neutral for all projects.\n\nParameters:\n* $1 - page title or any one of the following messages:\n** {{msg-mw|Contributions-title}}\n** {{msg-mw|Searchresults-title}}\n** {{msg-mw|Sp-contributions-newbies-title}}",
+       "pagetitle": "{{Optional}}\n{{doc-important|You most probably do not need to translate this message.}}\nDo '''not''' replace SITENAME with a translation of Wikipedia or some encyclopedic additions. The message has to be neutral for all projects.\n\nParameters:\n* $1 - page title or any one of the following messages:\n** {{msg-mw|Contributions-title}}\n** {{msg-mw|Searchresults-title}}\n** {{msg-mw|Sp-contributions-newbies-title}}",
        "pagetitle-view-mainpage": "{{optional}}",
        "backlinksubtitle": "{{optional}}\nAppears in subtitle. Parameters:\n* $1 - a link to the page (HTML)",
        "retrievedfrom": "Message which appears in the source of every page, but it is hidden. It is shown when printing.\n\nParameters:\n* $1 - a link back to the current page: {{FULLURL:{{FULLPAGENAME}}}}",
        "readonly_lag": "Error message displayed when the database is locked.",
        "internalerror": "{{Identical|Internal error}}",
        "internalerror_info": "Parameters:\n* $1 - error message",
-       "fileappenderrorread": "\"Append\" is a computer procedure, explained on [[w:Append|Wikipedia]]. Parameters:\n* $1 - probably filename",
-       "fileappenderror": "Parameters:\n* $1 - file name\n* $2 - file name",
        "filecopyerror": "Parameters:\n* $1 - source file name\n* $2 - destination file name",
        "filerenameerror": "Parameters:\n* $1 - old file name\n* $2 - new file name",
        "filedeleteerror": "Parameters:\n* $1 - file name",
        "directorycreateerror": "Parameters:\n* $1 - directory name",
        "filenotfound": "Parameters:\n* $1 - file name",
-       "fileexistserror": "Parameters:\n* $1 - file name",
        "unexpected": "This message indicates the value $2 is unexpected for $1. Parameters:\n* $1 - name\n* $2 - value",
        "formerror": "Generic error message show to a user when they try to submit information that could not be processed for any reason.",
        "badarticleerror": "Used as error message in moving page.\n\nSee also:\n* {{msg-mw|Articleexists}}\n* {{msg-mw|Bad-target-model}}",
        "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-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-join": "Subheading of vertical-layout create account form encouraging user to join the wiki.\n\nSee example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]",
-       "createacct-another-join": "Subheading of create account form when one user creates an account for another.",
        "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}}",
        "createacct-email-ph": "Placeholder in vertical-layout create account form for email field.\n\nSee example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]",
        "savearticle": "Text on the Save page button. See also {{msg-mw|showpreview}} and {{msg-mw|showdiff}} for the other buttons.\n\nSee also:\n* {{msg-mw|Savearticle}}\n* {{msg-mw|Accesskey-save}}\n* {{msg-mw|Tooltip-save}}\n{{Identical|Save page}}",
        "preview": "The title of the Preview page shown after clicking the \"Show preview\" button in the edit page. Since this is a heading, it should probably be translated as a noun and not as a verb.\n\n{{Identical|Preview}}",
        "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}}",
-       "showlivepreview": "An edit preview without needing to reload the edit form.",
        "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}}",
        "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}}",
        "anonpreviewwarning": "See also:\n* {{msg-mw|Anoneditwarning}}",
        "edit-gone-missing": "Used as error message.\n\nSee also:\n* {{msg-mw|edit-hook-aborted}}\n* {{msg-mw|edit-conflict}}\n* {{msg-mw|edit-no-change}}\n* {{msg-mw|edit-already-exists}}",
        "edit-conflict": "An 'Edit conflict' happens when more than one edit is being made to a page at the same time. This would usually be caused by separate individuals working on the same page. However, if the system is slow, several edits from one individual could back up and attempt to apply simultaneously - causing the conflict.\n\nSee also:\n* {{msg-mw|edit-hook-aborted}}\n* {{msg-mw|edit-gone-missing}}\n* {{msg-mw|edit-no-change}}\n* {{msg-mw|edit-already-exists}}",
        "edit-no-change": "Used as error message.\n\nSee also:\n* {{msg-mw|edit-hook-aborted}}\n* {{msg-mw|edit-gone-missing}}\n* {{msg-mw|edit-conflict}}\n* {{msg-mw|edit-already-exists}}",
-       "postedit-confirmation": "{{gender}}\nConfirmation message that is displayed upon successful edit.\n\nParameters:\n* $1 - (Optional) the current user, for GENDER support",
+       "postedit-confirmation-created": "{{gender}}\nShown after a user creates a new page. Parameters:\n* $1 - the current user, for GENDER support",
+       "postedit-confirmation-restored": "{{gender}}\nShown after a user restores a page to a previous revision. Parameters:\n* $1 - the current user, for GENDER support",
+       "postedit-confirmation-saved": "{{gender}}\nShown after a user saves a page. Parameters:\n* $1 - the current user, for GENDER support",
        "edit-already-exists": "Used as error message.\n\nSee also:\n* {{msg-mw|edit-hook-aborted}}\n* {{msg-mw|edit-gone-missing}}\n* {{msg-mw|edit-conflict}}\n* {{msg-mw|edit-no-change}}",
        "addsection-preload": "{{notranslate}}",
        "addsection-editintro": "{{notranslate}}",
        "invalid-content-data": "Error message indicating that the page's content can not be saved because it is invalid. This may occurr for content types with internal consistency constraints.",
        "content-not-allowed-here": "Error message indicating that the desired content model is not supported in given localtion.\n* $1 - the human readable name of the content model: {{msg-mw|Content-model-wikitext}}, {{msg-mw|Content-model-javascript}}, {{msg-mw|Content-model-css}} or {{msg-mw|Content-model-text}}\n* $2 - the title of the page in question",
        "editwarning-warning": "Uses {{msg-mw|Prefs-editing}}",
-       "editpage-notsupportedcontentformat-title": "Title of error page shown when using an incompatible format on EditPage",
-       "editpage-notsupportedcontentformat-text": "Error message shown when using an incompatible format on EditPage. Parameters:\n* $1 - the format id\n* $2 - the content model name",
+       "editpage-notsupportedcontentformat-title": "Title of error page shown when using an incompatible format on EditPage.\n\nUsed as title for the following error message:\n* {{msg-mw|Editpage-notsupportedcontentformat-text}}.",
+       "editpage-notsupportedcontentformat-text": "Error message shown when using an incompatible format on EditPage.\n\nThe title for this error is {{msg-mw|Editpage-notsupportedcontentformat-title}}.\n\nParameters:\n* $1 - the format id\n* $2 - the content model name",
        "content-model-wikitext": "Name for the wikitext content model, used when decribing what type of content a page contains.\n\nThis message is substituted in:\n*{{msg-mw|Bad-target-model}}\n*{{msg-mw|Content-not-allowed-here}}",
        "content-model-text": "Name for the plain text content model, used when decribing what type of content a page contains.\n\nThis message is substituted in:\n*{{msg-mw|Bad-target-model}}\n*{{msg-mw|Content-not-allowed-here}}\n{{Identical|Plain text}}",
        "content-model-javascript": "Name for the JavaScript content model, used when decribing what type of content a page contains.\n\nThis message is substituted in:\n*{{msg-mw|Bad-target-model}}\n*{{msg-mw|Content-not-allowed-here}}",
        "parser-template-recursion-depth-warning": "Parameters:\n* $1 - limit value of recursion depth",
        "language-converter-depth-warning": "Error message shown when a page uses too deeply nested language conversion syntax. Parameters:\n* $1 - the value of the depth limit",
        "node-count-exceeded-category": "This message is used as a category name for a [[mw:Help:Tracking categories|tracking category]] where pages are placed automatically if the node-count of the preprocessor exceeds the limit.\n\nSee also:\n* {{msg-mw|Node-count-exceeded-warning}}",
+       "node-count-exceeded-category-desc": "Node count exceeded category description. Shown on [[Special:TrackingCategories]].\n\nSee also:\n* {{msg-mw|Node-count-exceeded-category}}",
        "node-count-exceeded-warning": "Error message shown when a page exceeded the node-count limit of the preprocessor.\n\nParameters:\n* $1 - (Unused) the value of the node-count limit\n* $2 - (Unused) the value of the max node-count limit\nSee also:\n* {{msg-mw|Node-count-exceeded-category}}",
        "expansion-depth-exceeded-category": "This message is used as a category name for a [[mw:Help:Tracking categories|tracking category]] where pages are placed automatically if the [[meta:Help:Expansion_depth|expansion depth]] of the preprocessor exceeds the limit.",
+       "expansion-depth-exceeded-category-desc": "Expansion depth exceeded category description. Shown on [[Special:TrackingCategories]].\n\nSee also:\n* {{msg-mw|Expansion-depth-exceeded-category}}",
        "expansion-depth-exceeded-warning": "Error message shown when a page exceeded the [[meta:Help:Expansion_depth|expansion depth limit]] of the preprocessor.\n\nParameters:\n* $1 - (Unused) the value of the depth limit\n* $2 - (Unused) the value of the max depth limit\nSee also:\n* {{msg-mw|Expansion-depth-exceeded-category}}",
        "parser-unstrip-loop-warning": "{{Doc-important|Do not translate function name <code>unstrip</code>.}}\nThis error is shown when a parser extension tag such as <code><nowiki><pre></nowiki></code> includes a reference to itself in its own output.\n\nThe reference must be to the exact same invocation of the tag at the same location in the source, merely writing <code><nowiki><pre><pre></pre></pre></nowiki></code> will not do it.\n\nThis is usually impossible and unlikely to happen by accident, so translation is not essential.\n\n\"Unstrip\" refers to the internal function of the parser, called \"unstrip\", which recursively puts the output of parser functions in the place of the parser function call and which would enter an infinite loop in the situation above.\n\nSee also:\n*{{msg-mw|Parser-unstrip-recursion-limit}}",
        "parser-unstrip-recursion-limit": "{{doc-important|Do not translate function name <code>unstrip</code>.}}\nThis message is shown when the recursion limit for nested parser extension tags is exceeded.\n\nThis warning may be encountered due to input text like <code><nowiki><ref><ref><ref>...</ref></ref></ref></nowiki></code>.\n\nParameters:\n* $1 - the depth limit\n\n\"Unstrip\" refers to the internal function of the parser, called 'unstrip', which recursively puts the output of parser functions in the place of the parser function call and which would enter an infinite loop in the situation above.\n\nSee also:\n* {{msg-mw|Parser-unstrip-loop-warning}}",
        "previousrevision": "See also:\n* {{msg-mw|Nextrevision}}",
        "nextrevision": "See also:\n* {{msg-mw|Previousrevision}}",
        "currentrevisionlink": "{{Identical|Current revision}}",
-       "cur": "Link in page history",
+       "cur": "Link in page history ([https://translatewiki.net/w/i.php?title=MediaWiki:Cur/qqq&action=history example])",
        "next": "Link in page history\n\n{{Identical|Next}}",
        "last": "Link in page history\n\n{{Identical|Last}}",
        "page_first": "This is part of the navigation message on the top and bottom of Special pages which are lists of things in alphabetical order, e.g. the '[[Special:Categories|Categories]]' special page. It is followed by the message {{msg-mw|Viewprevnext}}.\n{{Identical|First}}",
        "searchmenu-new": "An option shown in a menu beside search form offering a red link to the not yet existing page having the specified title (when using the default MediaWiki search engine).\n\nParameters:\n* $1 - page title\n* $2 - the number of search results found",
        "searchmenu-new-nocreate": "{{notranslate}}",
        "searchprofile-articles": "A quick link in the advanced search box on [[Special:Search]]. Clicking on this link starts a search in the content pages of the wiki.\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 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\n{{Identical|Content page}}",
-       "searchprofile-project": "Used as an option in [[Special:Search]].\n\nSee also:\n* {{msg-mw|Searchprofile-project|message}}\n* {{msg-mw|Searchprofile-project-tooltip|tooltip}}",
        "searchprofile-images": "An option in the [[Special:Search]].\n\nSee also:\n* {{msg-mw|Searchprofile-images|message}}\n* {{msg-mw|Searchprofile-images-tooltip|tooltip}}\n{{Identical|Muitimedia}}",
        "searchprofile-everything": "Used as an option in [[Special:Search]].\n\nSee also:\n* {{msg-mw|Searchprofile-everything|message}}\n* {{msg-mw|Searchprofile-everything-tooltip|tooltip}}",
        "searchprofile-advanced": "Used as an option in [[Special:Search]].\n\nSee also:\n* {{msg-mw|Searchprofile-advanced|message}}\n* {{msg-mw|Searchprofile-advanced-tooltip|tooltip}}\n{{Identical|Advanced}}",
        "searchprofile-articles-tooltip": "Used as tooltip for the option {{msg-mw|Searchprofile-articles}} in [[Special:Search]].\n* $1 - list of namespaces\nSee also:\n* {{msg-mw|Searchprofile-articles|message}}\n* {{msg-mw|Searchprofile-articles-tooltip|tooltip}}\n{{Identical|Search in $1}}",
-       "searchprofile-project-tooltip": "Used as tooltip for the option {{msg-mw|Searchprofile-project}} in [[Special:Search]].\n* $1 - list of namespaces\nSee also:\n* {{msg-mw|Searchprofile-project|message}}\n* {{msg-mw|Searchprofile-project-tooltip|tooltip}}\n{{Identical|Search in $1}}",
        "searchprofile-images-tooltip": "Used as tooltip for the option {{msg-mw|Searchprofile-images}} in the [[Special:Search]].\nSee also:\n* {{msg-mw|Searchprofile-images|message}}\n* {{msg-mw|Searchprofile-images-tooltip|tooltip}}",
        "searchprofile-everything-tooltip": "Used as tooltip for the option {{msg-mw|Searchprofile-everything}} in [[Special:Search]].\n\nSee also:\n* {{msg-mw|Searchprofile-everything|message}}\n* {{msg-mw|Searchprofile-everything-tooltip|tooltip}}",
        "searchprofile-advanced-tooltip": "Used as tooltip for the option {{msg-mw|Searchprofile-advanced}} in [[Special:Search]].\n\nSee also:\n* {{msg-mw|Searchprofile-advanced|message}}\n* {{msg-mw|Searchprofile-advanced-tooltip|tooltip}}",
        "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]]",
-       "powersearch-redir": "Used in the extended search form at [[Special:Search]]",
        "powersearch-togglelabel": "Used in [{{canonicalurl:Special:Search|advanced=1}} Advanced search]. Synonym: \"Select\" as verb.\n{{Identical|Check}}",
        "powersearch-toggleall": "\"All\" refers to namespaces. It is used in Advanced search: {{canonicalurl:Special:Search|advanced=1}}\n{{Identical|All}}",
        "powersearch-togglenone": "\"None\" refers to namespaces. It is used in Advanced search: {{canonicalurl:Special:Search|advanced=1}}\n{{Identical|None}}",
        "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}}",
        "username": "Username field in [[Special:Preferences]]. $1 is the current user name for GENDER distinction (depends on sex setting).\n\n{{Identical|Username}}",
-       "uid": "User ID field in [[Special:Preferences]]. $1 is the current user name for GENDER distinction (depends on sex setting).\n\n{{Identical|User ID}}",
        "prefs-memberingroups": "This message is shown on [[Special:Preferences]], first tab.\n\nParameters:\n* $1 - number of user groups\n* $2 - the username for GENDER\nSee also:\n* {{msg-mw|Prefs-memberingroups-type}}",
        "prefs-memberingroups-type": "{{optional}}\nParameters:\n* $1 - list of group names\n* $2 - list of group member names. Label for these is {{msg-mw|Prefs-memberingroups}}",
        "prefs-registration": "Used in [[Special:Preferences]].",
        "prefs-advancedsearchoptions": "Used in [[Special:Preferences]], tab \"Search options\".\n{{Identical|Advanced options}}",
        "prefs-advancedwatchlist": "Used in [[Special:Preferences]], tab \"Watchlist\".\n{{Identical|Advanced options}}",
        "prefs-displayrc": "\"Display\" is a noun that specifies the kind of \"options\". So translate as \"options about display\", not as \"display the options\".\n\nUsed in [[Special:Preferences]], tab \"Recent changes\". The display options refer to:\n* {{msg-mw|Recentchangesdays}}\n* {{msg-mw|Recentchangescount}}",
-       "prefs-displaysearchoptions": "\"Display\" is a noun that specifies the kind of \"options\". So translate as \"options about display\", not as \"display the options\".\n\nUsed in [[Special:Preferences]], tab \"Search options\". The display options refer to:\n* {{msg-mw|Vector-simplesearch-preference}}",
        "prefs-displaywatchlist": "\"Display\" is a noun that specifies the kind of \"options\". So translate as \"options about display\", not as \"display the options\".\n\nUsed in [[Special:Preferences]], tab \"Watchlist\". The display options refer to:\n* {{msg-mw|Prefs-watchlist-days}}\n* {{msg-mw|Prefs-watchlist-edits}}",
        "prefs-tokenwatchlist": "Section heading.\nUsed in [[Special:Preferences]], tab \"Watchlist\".\n{{Identical|Token}}",
        "prefs-diffs": "Used in [[Special:Preferences]], tab \"Misc\".",
        "group": "{{Identical|Group}}",
        "group-user": "{{doc-group|user}}\n{{Identical|User}}",
        "group-autoconfirmed": "{{doc-group|autoconfirmed}}\nOn Wikimedia sites autoconfirmed users are users which are older than 4 days. After those 4 days, they have more rights.",
-       "group-bot": "{{doc-group|bot}}",
-       "group-sysop": "{{doc-group|sysop}}",
+       "group-bot": "{{doc-group|bot}}\n{{Identical|Bot}}",
+       "group-sysop": "{{doc-group|sysop}}\n{{Identical|Administrator}}",
        "group-bureaucrat": "{{doc-group|bureaucrat}}",
        "group-suppress": "{{doc-group|suppress}}\nThis is an optional (disabled by default) user group, meant for the [[mw:RevisionDelete|RevisionDelete]] feature, to change the visibility of revisions through [[Special:RevisionDelete]].\n\n{{Identical|Oversight}}",
        "group-all": "The name of the user group that contains all users, including anonymous users\n\n{{Identical|All}}",
        "right-move": "{{doc-right|move}}\nThe right to move any page that is not protected from moving.\n{{Identical|Move page}}",
        "right-move-subpages": "{{doc-right|move-subpages}}",
        "right-move-rootuserpages": "{{doc-right|move-rootuserpages}}",
+       "right-move-categorypages": "{{doc-right|move-categorypages}}",
        "right-movefile": "{{doc-right|movefile}}",
        "right-suppressredirect": "{{doc-right|suppressredirect}}",
        "right-upload": "{{doc-right|upload}}\nThe right to [[Special:Upload|upload]] a file (this includes images, media, audio, ...).\n{{Identical|Upload file}}",
        "action-createpage": "{{Doc-action|createpage}}\n{{Identical|Create page}}",
        "action-createtalk": "{{Doc-action|createtalk}}",
        "action-createaccount": "{{Doc-action|createaccount}}",
+       "action-history": "{{Doc-action|history}}",
        "action-minoredit": "{{Doc-action|minoredit}}",
        "action-move": "{{Doc-action|move}}",
        "action-move-subpages": "{{Doc-action|move-subpages}}",
        "action-move-rootuserpages": "{{Doc-action|move-rootuserpages}}",
+       "action-move-categorypages": "{{Doc-action|move-categorypages}}",
        "action-movefile": "{{doc-action|movefile}}",
        "action-upload": "{{Doc-action|upload}}",
        "action-reupload": "{{Doc-action|reupload}}",
        "recentchanges-legend-newpage": "Used as legend in [[Special:RecentChanges]]. Preceded by {{msg-mw|Recentchanges-label-newpage}}.",
        "recentchanges-legend-plusminus": "{{optional}}\nA plus/minus sign with a number for the legend.",
        "rcnotefrom": "This message is displayed at [[Special:RecentChanges]] when viewing recentchanges from some specific time.\n\nThe corresponding message is {{msg-mw|Rclistfrom}} (split into date and time).\n\nParameters:\n* $1 - the maximum number of changes that are displayed\n* $2 - a date and time\n* $3 - (Optional) a date\n* $4 - (Optional) a time",
-       "rclistfrom": "Used on [[Special:RecentChanges]]. Parameters:\n* $1 - (Optional) date and time. The date and the time adds to the rclistfrom description.\n* $2 - time. The time adds to the rclistfrom link description (with split of date and time).\n* $3 - date. The date adds to the rclistfrom link description (with split of date and time).\n\nThe corresponding message is {{msg-mw|Rcnotefrom}}.",
-       "rcshowhideminor": "Option text in [[Special:RecentChanges]]. Parameters:\n* $1 - the \"show/hide\" command, with the text taken from either {{msg-mw|rcshowhideminor-show}} or {{msg-mw|rcshowhideminor-hide}}",
+       "rclistfrom": "Used on [[Special:RecentChanges]]. Parameters:\n* $1 - (Currently not use) date and time. The date and the time adds to the rclistfrom description.\n* $2 - time. The time adds to the rclistfrom link description (with split of date and time).\n* $3 - date. The date adds to the rclistfrom link description (with split of date and time).\n\nThe corresponding message is {{msg-mw|Rcnotefrom}}.",
+       "rcshowhideminor": "Option text in [[Special:RecentChanges]]. Parameters:\n* $1 - the \"show/hide\" command, with the text taken from either {{msg-mw|rcshowhideminor-show}} or {{msg-mw|rcshowhideminor-hide}}\n{{Identical|Minor edit}}",
        "rcshowhideminor-show": "{{doc-actionlink}}\nOption text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhideminor}}.\n\nSee also:\n* {{msg-mw|rcshowhideminor-hide}}\n{{Identical|Show}}",
        "rcshowhideminor-hide": "{{doc-actionlink}}\nOption text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhideminor}}.\n\nSee also:\n* {{msg-mw|rcshowhideminor-show}}\n{{Identical|Hide}}",
        "rcshowhidebots": "Option text in [[Special:RecentChanges]]. Parameters:\n* $1 - the \"show/hide\" command, with the text taken from either {{msg-mw|rcshowhidebots-show}} or {{msg-mw|rcshowhidebots-hide}}\n{{Identical|$1 bots}}",
        "rcshowhideliu-show": "{{doc-actionlink}}\nOption text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhideliu}}.\n\nSee also:\n* {{msg-mw|rcshowhideliu-hide}}\n{{Identical|Show}}",
        "rcshowhideliu-hide": "{{doc-actionlink}}\nOption text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhideliu}}.\n\nSee also:\n* {{msg-mw|rcshowhideliu-show}}\n{{Identical|Hide}}",
        "rcshowhideanons": "Option text in [[Special:RecentChanges]]. Parameters:\n* $1 - the \"show/hide\" command, with the text taken from either {{msg-mw|Rcshowhideanons-show}} or {{msg-mw|Rcshowhideanons-hide}}\n{{Identical|Anonymous user}}",
-       "rcshowhideanons-show": "{{doc-actionlink}}\nOption text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhideanons}}.\n\nSee also:\n* {{msg-mw|rcshowhideanons-hide}}\n{{Identical|Hide}}",
+       "rcshowhideanons-show": "{{doc-actionlink}}\nOption text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhideanons}}.\n\nSee also:\n* {{msg-mw|rcshowhideanons-hide}}\n{{Identical|Show}}",
        "rcshowhideanons-hide": "{{doc-actionlink}}\nOption text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhideanons}}.\n\nSee also:\n* {{msg-mw|rcshowhideanons-show}}\n{{Identical|hide}}",
        "rcshowhidepatr": "Option text in [[Special:RecentChanges]]. Parameters:\n* $1 - the \"show/hide\" command, with the text taken from either {{msg-mw|rcshowhidepatr-show}} or {{msg-mw|rcshowhidepatr-hide}}",
        "rcshowhidepatr-show": "{{doc-actionlink}}\nOption text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhidepatr}}.\n\nSee also:\n* {{msg-mw|rcshowhidepatr-hide}}\n{{Identical|Show}}",
        "statistics-articles": "Used in [[Special:Statistics]].\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 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\n{{Identical|Content page}}",
        "statistics-pages": "Used in [[Special:Statistics]]\n{{Identical|Page}}",
        "statistics-pages-desc": "Tooltip shown over ''Pages'' (or as a note below it) in [[Special:Statistics]]",
-       "statistics-files": "Used in [[Special:Statistics]]",
+       "statistics-files": "Used in [[Special:Statistics]].\n{{Identical|Uploaded file}}",
        "statistics-edits": "Used in [[Special:Statistics]]",
        "statistics-edits-average": "Used in [[Special:Statistics]]",
        "statistics-views-total": "Used in [[Special:Statistics]]",
        "showhideselectedlogentries": "Text of the button which brings up the [[mw:RevisionDelete|RevisionDelete]] menu on [[Special:Log]].",
        "allpages": "{{doc-special|AllPages}}\nFirst part of the navigation bar for the special page [[Special:AllPages]] and [[Special:PrefixIndex]].\nThe other parts are {{msg-mw|Prevpage}} and {{msg-mw|Nextpage}}.\n{{Identical|All pages}}",
        "allpages-summary": "{{doc-specialpagesummary|allpages}}",
-       "alphaindexline": "Used on [[Special:AllPages]] if the main namespace contains more than 960 pages. Indicates the page range displayed behind the link. \"from page $1 to page $2\". $1 is the source page name. $1 is the target page name.",
        "nextpage": "Third part of the navigation bar for the special page [[Special:AllPages]] and [[Special:PrefixIndex]]. $1 is a page title. The other parts are {{msg-mw|Allpages}} and {{msg-mw|Prevpage}}.\n\n{{Identical|Next page}}",
        "prevpage": "Second part of the navigation bar for the special page [[Special:AllPages]] and [[Special:PrefixIndex]]. $1 is a page title. The other parts are {{msg-mw|Allpages}} and {{msg-mw|Nextpage}}.\n\n{{Identical|Previous page}}",
        "allpagesfrom": "Option in [[Special:AllPages]].\n\nSee also:\n* {{msg-mw|allpagesto}}",
        "linksearch-line": "Text for the results of a search using [[Special:LinkSearch]].\n\n*$1 is the address of an external link\n*$2 is the page containing the external link",
        "linksearch-error": "Error message generated by [[Special:LinkSearch]].\n\nYou can apparently use 'URL' instead of 'hostname'.",
        "listusersfrom": "identical with {{msg-mw|activeusers-from}}",
-       "listusers-submit": "Text displayed in the submission button of the [[Special:ListUsers]] form.\n{{Identical|Go}}\n{{Identical|Show}}",
+       "listusers-submit": "Text displayed in the submission button of the [[Special:ListUsers]] form.\n{{Identical|Show}}",
        "listusers-noresult": "identical with {{msg-mw|activeusers-noresult}}",
        "listusers-blocked": "Used on [[Special:ActiveUsers]] when a user has been blocked. Parameters:\n* $1 - (Optional) a user name for use with GENDER\n{{Identical|Blocked}}",
        "activeusers": "Title of [[Special:ActiveUsers]]",
        "watchnologin": "Used as error page title.\n\nThe error message for this title is:\n* {{msg-mw|Watchnologintext}}\n{{Identical|Not logged in}}",
        "addwatch": "Link to a dialog box, displayed at the end of the list of categories at the foot of each page.\n\nSee also:\n* {{msg-mw|Removewatch}}",
        "addedwatchtext": "Explanation shown when clicking on the {{msg-mw|Watch}} tab. Parameters:\n* $1 - page title\nSee also:\n* {{msg-mw|Addedwatch}}",
+       "addedwatchtext-short": "Explanation shown when watching item from [[Special:UnwatchedPages]].\n\nSee also:\n* {{msg-mw|Removedwatchtext-short}}\n* {{msg-mw|Addedwatchtext}}",
        "removewatch": "Link to a dialog box, displayed at the end of the list of categories at the foot of each page.\n\nSee also:\n* {{msg-mw|Addwatch}}",
        "removedwatchtext": "After a page has been removed from a user's watchlist by clicking the {{msg-mw|Unwatch}} tab at the top of an article, this message appears just below the title of the article.\n\nParameters:\n* $1 - the title of the article\nSee also:\n* {{msg-mw|Removedwatch}}\n* {{msg-mw|Addedwatchtext}}",
+       "removedwatchtext-short": "Explanation shown when unwatching item from [[Special:UnwatchedPages]].\n\nSee also:\n* {{msg-mw|Addedwatchtext-short}}.\n* {{msg-mw|Removedwatchtext}}.",
        "watch": "{{doc-actionlink}}\nName of the Watch tab. Should be in the imperative mood.\n\nSee also:\n* {{msg-mw|Watch}}\n* {{msg-mw|Accesskey-ca-watch}}\n* {{msg-mw|Tooltip-ca-watch}}",
        "watchthispage": "Used as link text.\n\nSee also:\n* {{msg-mw|Unwatchthispage|link text}}\n* {{msg-mw|Notanarticle|error message}}\n{{Identical|Watch this page}}",
        "unwatch": "{{doc-actionlink}}\nLabel of \"Unwatch\" tab.\n\nSee also:\n* {{msg-mw|Unwatch}}\n* {{msg-mw|Accesskey-ca-unwatch}}\n* {{msg-mw|Tooltip-ca-unwatch}}",
        "watchlist-details": "Message on [[Special:Watchlist]]. Parameters:\n* $1 - number of pages in your watchlist\nThis is paired with the message {{msg-mw|Nowatchlist}} which appears instead of Watchlist-details when $1 is 0.\nSee also:\n* {{msg-mw|Watchlist-options|fieldset}}\n* {{msg-mw|Wlheader-enotif|watchlist header}}\n* {{msg-mw|enotif reset|Submit button text}}\n* {{msg-mw|Watchlistcontains}}",
        "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.",
-       "watchmethod-recent": "See also:\n* {{msg-mw|Watchmethod-list}}",
-       "watchmethod-list": "See also:\n* {{msg-mw|Watchmethod-recent}}",
-       "watchlistcontains": "Parameters:\n* $1 - number of pages in your watchlist\nSee also:\n* {{msg-mw|Watchlist-details}}",
-       "iteminvalidname": "Parameters:\n* $1 - item name",
        "wlnote2": "Used on [[Special:Watchlist]] when a maximum number of hours or days is specified.\n\nParameters:\n* $1 - the number of hours for which the changes are shown\n* $2 - a date alone\n* $3 - a time alone\nSee also:\n* {{msg-mw|Wlnote}}",
        "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).",
        "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}}",
        "enotif_lastvisited": "Parameters:\n* $1 - a URL which points to diff\nSee also:\n* {{msg-mw|Enotif lastdiff}}",
        "enotif_lastdiff": "Email notification text to the latest page differences. Parameters:\n* $1 - a link which points to a diff, shown as a plain link\nSee also:\n* {{msg-mw|Enotif lastvisited}}",
        "enotif_anon_editor": "User name in an email notification when referring to an anonymous user. Parameters:\n* $1 - the anonymous user name (i.e. an IP address).",
-       "enotif_body": "Text of a notification email sent when a watched page has been edited or deleted.\n[[File:Screenshot_MediaWiki_e-mail_notifier.PNG|150px|right]]\n\nRefers to {{msg-mw|Helppage}}.\n\nParameters:\n*$WATCHINGUSERNAME is the username of the user receiving the notification.\n*$PAGEINTRO is the first line of the message, saying what happened. It currently can be either of:\n**{{msg-mw|Enotif body intro deleted}}\n**{{msg-mw|Enotif body intro created}}\n**{{msg-mw|Enotif body intro moved}}\n**{{msg-mw|Enotif body intro restored}}\n**{{msg-mw|Enotif body intro changed}} (for all the other cases).\n*$NEWPAGE consists of either\n**if the page is new (in older releases), {{msg-mw|Enotif newpagetext}}\n**if the page has a previous revision,\n***{{msg-mw|Enotif lastdiff}}\n***a newline\n***{{msg-mw|Enotif lastvisited}}\n*$PAGEEDITOR_EMAIL and $PAGEEDITOR_WIKI are links respectively to the email user special page and user page for the user who performed the action.\n*$PAGEEDITOR is the username of the user who performed the action.\n\nThe subject of the email is one of the following messages:\n*{{msg-mw|Enotif subject deleted}}\n*{{msg-mw|Enotif subject created}}\n*{{msg-mw|Enotif subject moved}}\n*{{msg-mw|Enotif subject restored}}\n*{{msg-mw|Enotif subject changed}}",
+       "enotif_body": "Text of a notification email sent when a watched page has been edited or deleted.\n[[File:Screenshot_MediaWiki_e-mail_notifier.PNG|150px|right]]\n\nRefers to {{msg-mw|Helppage}}.\n\nParameters:\n*$WATCHINGUSERNAME is the username of the user receiving the notification.\n*$PAGEINTRO is the first line of the message, saying what happened. It currently can be either of:\n**{{msg-mw|Enotif body intro deleted}}\n**{{msg-mw|Enotif body intro created}}\n**{{msg-mw|Enotif body intro moved}}\n**{{msg-mw|Enotif body intro restored}}\n**{{msg-mw|Enotif body intro changed}} (for all the other cases).\n*$NEWPAGE consists of either\n**if the page is new (in older releases), {{msg-mw|Enotif newpagetext}}\n**if the page has a previous revision,\n***{{msg-mw|Enotif lastdiff}}\n***a newline\n***{{msg-mw|Enotif lastvisited}}\n*$PAGEEDITOR_EMAIL and $PAGEEDITOR_WIKI are links respectively to the email user special page and user page for the user who performed the action.\n*$PAGEEDITOR is the username of the user who performed the action.\n*$HELPPAGE is the full URL to the help page, defined by {{msg-mw|helppage}}.\n\nThe subject of the email is one of the following messages:\n*{{msg-mw|Enotif subject deleted}}\n*{{msg-mw|Enotif subject created}}\n*{{msg-mw|Enotif subject moved}}\n*{{msg-mw|Enotif subject restored}}\n*{{msg-mw|Enotif subject changed}}",
        "created": "{{Optional}}\nPossible value for $CHANGEDORCREATED in the following messages:\n* {{msg-mw|enotif_subject}}\n* {{msg-mw|enotif_body}}\n{{Identical|Created}}",
        "changed": "{{Optional}}\nPossible value for $CHANGEDORCREATED in the following messages:\n* {{msg-mw|Enotif subject}}\n* {{msg-mw|Enotif body}}",
        "deletepage": "Used as Submit button text.\n{{Identical|Delete page}}",
        "blockip": "Used as the text of a link in the sidebar toolbox. Clicking this link takes you to [[Special:Block]], with a relevant username or IP address (e.g. \"Username\" on [[User talk:Username]], [[Special:Contributions/Username]], etc.) already filled in.\n\n{{Identical|Block user}}",
        "blockip-legend": "Legend/Header for the fieldset around the input form of [[Special:Block]].\n\n{{Identical|Block user}}",
        "blockiptext": "Used in the {{msg-mw|Blockip}} form in [[Special:Block]].\n\nRefers to {{msg-mw|Policy-url}}.\n\nThis message may follow the message {{msg-mw|Ipb-otherblocks-header}} and other block messages.\n\nSee also:\n* {{msg-mw|Unblockiptext}}",
-       "ipadressorusername": "{{Identical|IP address or username}}",
+       "ipaddressorusername": "{{Identical|IP address or username}}",
        "ipbexpiry": "{{Identical|Expiry}}",
        "ipbreason": "Label of the block reason dropdown in [[Special:BlockIP]] and the unblock reason textfield in [{{fullurl:Special:IPBlockList|action=unblock}} Special:IPBlockList?action=unblock].\n\n{{Identical|Reason}}",
        "ipbreason-dropdown": "Used as item list for dropdown on [[Special:Block]].\n\nThe label for this dropdown is {{msg-mw|Ipbreason}}.",
        "blocklogpage": "{{doc-logpage}}\n\nThe page name of [[Special:Log/block]]. Also appears in the drop down menu of [[Special:Log]] pages and in the action links of Special:Contributions/''Username'' pages (e.g. \"For Somebody (talk | block log | logs)\").\n\n{{Identical|Block log}}",
        "blocklog-showlog": "Parameters:\n* $1 - (Optional) the blocked user. Can be used for GENDER\nSee also:\n* {{msg-mw|Blocklog-showsuppresslog}}\n* {{msg-mw|Globalblocking-showlog}}",
        "blocklog-showsuppresslog": "Parameters:\n* $1 - (Optional) the blocked user. Can be used for GENDER",
-       "blocklogentry": "This is the text of an entry in the Block log, and recent changes, after hour (and date, only in the Block log) and sysop name:\n* $1 - the blocked user or IP (with link to contributions and talk)\n* $2 - the duration of the block (hours, days etc.) or the specified expiry date\n* $3 - contains \"(details) (''reason'')\"\nSee also:\n* {{msg-mw|Unblocklogentry}}\n* {{msg-mw|Reblock-logentry}}",
+       "blocklogentry": "This is the text of an entry in the Block log, and recent changes, after hour (and date, only in the Block log) and sysop name:\n* $1 - the blocked user or IP (with link to contributions and talk)\n* $2 - the duration of the block (hours, days etc.) or the specified expiry date\n* $3 - contains \"(details) (''reason'')\", or empty string\nSee also:\n* {{msg-mw|Unblocklogentry}}\n* {{msg-mw|Reblock-logentry}}",
        "reblock-logentry": "This is the text of an entry in the Block log (and Recent Changes), after hour (and date, only in the Block log) and sysop name.\n\nParameters:\n* $1 - the user being reblocked\n* $2 - the expiry time of the block\n* $3 - extra parameters like \"account creation blocked\" (they are automatically between brackets)",
        "blocklogtext": "Appears on top of [[Special:Log/block]].",
        "unblocklogentry": "This is the text of an entry in the Block log (and Recent Changes), after hour (and date, only in the Block log) and sysop name:\n* $1 is the user being unblocked",
        "movepagetalktext": "Text on the special 'Move page'. This text only appears if the talk page is not empty.",
        "movearticle": "The text before the name of the page that you are moving. Can be translated as \"Page that is going to be moved\". Used in [[Special:MovePage]].\n\nSee also:\n* {{msg-mw|move-page-legend|legend for the form}}\n* {{msg-mw|newtitle|label for new title}}\n* {{msg-mw|movereason|label for textarea}}\n* {{msg-mw|movetalk|label for checkbox}}\n* {{msg-mw|move-leave-redirect|label for checkbox}}\n* {{msg-mw|fix-double-redirects|label for checkbox}}\n* {{msg-mw|move-subpages|label for checkbox}}\n* {{msg-mw|move-talk-subpages|label for checkbox}}\n* {{msg-mw|move-watch|label for checkbox}}\n{{Identical|Move page}}",
        "moveuserpage-warning": "Used as warning in [[Special:MovePage]], when moving a user page.",
-       "movenologintext": "Text of message on special page 'Permissions Errors', which appears when somebody tries to move a page without being logged in.\n\nSee also:\n* {{msg-mw|cant-move-user-page}}\n* {{msg-mw|cant-move-to-user-page}}\n* {{msg-mw|movenotallowedfile}}\n* {{msg-mw|movenotallowed}}",
-       "movenotallowed": "Used as error message.\n\nSee also:\n* {{msg-mw|cant-move-user-page}}\n* {{msg-mw|cant-move-to-user-page}}\n* {{msg-mw|movenotallowedfile}}\n* {{msg-mw|movenologintext}}",
-       "movenotallowedfile": "Used as error message.\n\nSee also:\n* {{msg-mw|cant-move-user-page}}\n* {{msg-mw|cant-move-to-user-page}}\n* {{msg-mw|movenotallowed}}\n* {{msg-mw|movenologintext}}",
-       "cant-move-user-page": "Used as error message.\n\nSee also:\n* {{msg-mw|cant-move-to-user-page}}\n* {{msg-mw|movenotallowedfile}}\n* {{msg-mw|movenotallowed}}\n* {{msg-mw|movenologintext}}",
-       "cant-move-to-user-page": "Used as error message.\n\nSee also:\n* {{msg-mw|cant-move-user-page}}\n* {{msg-mw|movenotallowedfile}}\n* {{msg-mw|movenotallowed}}\n* {{msg-mw|movenologintext}}",
+       "movecategorypage-warning": "Used as warning in [[Special:MovePage]], when moving a category page.",
+       "movenologintext": "Text of message on special page 'Permissions Errors', which appears when somebody tries to move a page without being logged in.\n\nSee also:\n* {{msg-mw|cant-move-user-page}}\n* {{msg-mw|cant-move-to-user-page}}\n* {{msg-mw|cant-move-category-page}}\n* {{msg-mw|cant-move-to-category-page}}\n* {{msg-mw|movenotallowedfile}}\n* {{msg-mw|movenotallowed}}",
+       "movenotallowed": "Used as error message.\n\nSee also:\n* {{msg-mw|cant-move-user-page}}\n* {{msg-mw|cant-move-to-user-page}}\n* {{msg-mw|cant-move-category-page}}\n* {{msg-mw|cant-move-to-category-page}}\n* {{msg-mw|movenotallowedfile}}\n* {{msg-mw|movenologintext}}",
+       "movenotallowedfile": "Used as error message.\n\nSee also:\n* {{msg-mw|cant-move-user-page}}\n* {{msg-mw|cant-move-to-user-page}}\n* {{msg-mw|cant-move-category-page}}\n* {{msg-mw|cant-move-to-category-page}}\n* {{msg-mw|movenotallowed}}\n* {{msg-mw|movenologintext}}",
+       "cant-move-user-page": "Used as error message.\n\nSee also:\n* {{msg-mw|cant-move-to-user-page}}\n* {{msg-mw|cant-move-category-page}}\n* {{msg-mw|cant-move-to-category-page}}\n* {{msg-mw|movenotallowedfile}}\n* {{msg-mw|movenotallowed}}\n* {{msg-mw|movenologintext}}",
+       "cant-move-to-user-page": "Used as error message.\n\nSee also:\n* {{msg-mw|cant-move-user-page}}\n* {{msg-mw|cant-move-category-page}}\n* {{msg-mw|cant-move-to-category-page}}\n* {{msg-mw|movenotallowedfile}}\n* {{msg-mw|movenotallowed}}\n* {{msg-mw|movenologintext}}",
+       "cant-move-category-page": "Used as error message.\n\nSee also:\n* {{msg-mw|cant-move-user-page}}\n* {{msg-mw|cant-move-to-user-page}}\n* {{msg-mw|cant-move-to-category-page}}\n* {{msg-mw|movenotallowedfile}}\n* {{msg-mw|movenotallowed}}\n* {{msg-mw|movenologintext}}",
+       "cant-move-to-category-page": "Used as error message.\n\nSee also:\n* {{msg-mw|cant-move-user-page}}\n* {{msg-mw|cant-move-to-user-page}}\n* {{msg-mw|cant-move-category-page}}\n* {{msg-mw|movenotallowedfile}}\n* {{msg-mw|movenotallowed}}\n* {{msg-mw|movenologintext}}",
        "newtitle": "Used in the special page \"[[Special:MovePage]]\". The text for the inputbox to give the new page title.\n\nSee also:\n* {{msg-mw|Move-page-legend|legend for the form}}\n* {{msg-mw|Movearticle|label for old title}}\n* {{msg-mw|Movereason|label for textarea}}\n* {{msg-mw|Movetalk|label for checkbox}}\n* {{msg-mw|Move-leave-redirect|label for checkbox}}\n* {{msg-mw|Fix-double-redirects|label for checkbox}}\n* {{msg-mw|Move-subpages|label for checkbox}}\n* {{msg-mw|Move-talk-subpages|label for checkbox}}\n* {{msg-mw|Move-watch|label for checkbox}}",
        "move-watch": "The text of the checkbox to watch the pages you are moving from and to. If checked, both the destination page and the original page will be added to the watchlist, even if you decide not to leave a redirect behind.\n\nSee also:\n* {{msg-mw|Move-page-legend|legend for the form}}\n* {{msg-mw|Movearticle|label for old title}}\n* {{msg-mw|Newtitle|label for new title}}\n* {{msg-mw|Movereason|label for textarea}}\n* {{msg-mw|Movetalk|label for checkbox}}\n* {{msg-mw|Move-leave-redirect|label for checkbox}}\n* {{msg-mw|Fix-double-redirects|label for checkbox}}\n* {{msg-mw|Move-subpages|label for checkbox}}\n* {{msg-mw|Move-talk-subpages|label for checkbox}}",
        "movepagebtn": "Button label on the special 'Move page'.\n\n{{Identical|Move page}}",
        "movenosubpage": "See also:\n* {{msg-mw|movesubpage|section header}}\n* {{msg-mw|movenosubpage|without subpage}}\n* {{msg-mw|movesubpagetext|with subpages}}",
        "movereason": "Used in [[Special:MovePage]]. The text for the inputbox to give a reason for the page move.\n\nSee also:\n* {{msg-mw|Move-page-legend|legend for the form}}\n* {{msg-mw|Movearticle|label for old title}}\n* {{msg-mw|Newtitle|label for new title}}\n* {{msg-mw|Movetalk|label for checkbox}}\n* {{msg-mw|Move-leave-redirect|label for checkbox}}\n* {{msg-mw|Fix-double-redirects|label for checkbox}}\n* {{msg-mw|Move-subpages|label for checkbox}}\n* {{msg-mw|Move-talk-subpages|label for checkbox}}\n* {{msg-mw|Move-watch|label for checkbox}}\n{{Identical|Reason}}",
        "move-redirect-text": "{{ignored}}The text that's added to a redirected page when that redirect is created.",
+       "category-move-redirect-override": "{{ignored}}The text that's added to a redirected category page when that redirect is created.",
        "revertmove": "{{Identical|Revert}}",
        "delete_and_move": "Button text on the move page when the target page already exists.",
        "delete_and_move_text": "Used when moving a page, but the destination page already exists and needs deletion.\n\nThis message is to confirm that you really want to delete the page.\n\nParameters:\n* $1 - the destination page title\n\nSee also:\n* {{msg-mw|Delete and move confirm}}",
        "interlanguage-link-title": "{{Optional}}\nFormat of a sidebar interwiki link tooltip. Parameters:\n* $1 - page name in the target wiki\n* $2 - target wiki language autonym",
        "interlanguage-link-title-langonly": "{{ignored}}Interlanguage link title. Parameters: $1 replaced with a language name.",
        "common.css": "{{optional}}\nCSS applied to all users.",
-       "cologneblue.css": "{{optional}}",
        "monobook.css": "{{optional}}\nCSS applied to users using Monobook skin.",
-       "modern.css": "{{optional}}",
        "vector.css": "{{optional}}",
        "print.css": "{{optional}}",
        "noscript.css": "{{optional}}",
        "group-sysop.css": "{{doc-group|sysop|css}}",
        "group-bureaucrat.css": "{{doc-group|bureaucrat|css}}",
        "common.js": "{{optional}}\nJS for all users.",
-       "cologneblue.js": "{{optional}}",
        "monobook.js": "{{optional}}\nJS for users using Monobook skin.",
-       "modern.js": "{{optional}}",
        "vector.js": "{{optional}}",
        "group-autoconfirmed.js": "{{doc-group|autoconfirmed|js}}",
        "group-user.js": "{{doc-group|user|js}}",
        "group-bot.js": "{{doc-group|bot|js}}",
        "group-sysop.js": "{{doc-group|sysop|js}}",
        "group-bureaucrat.js": "{{doc-group|bureaucrat|js}}",
-       "notacceptable": "Used as error message for HTTP \"406 Not acceptable\" error.",
        "anonymous": "This message is shown when viewing the credits of a page (example: {{fullurl:Main Page|action=credits}}). Note that this action is disabled by default (currently enabled on translatewiki.net).\n\nThis message appears at the very end of the list of names in the message {{msg-mw|Othercontribs}}.\n\nIf there are no anonymous users in the credits list then this message does not appear at all.\n\nParameters:\n* $1 - the number of anonymous users in the message",
        "siteuser": "This message is shown when viewing the credits of a page ([{{fullurl:Main Page|action=credits}} example]). Note that this action is disabled by default, but currently enabled on translatewiki.net. This message is the variable $3 in the message {{msg-mw|lastmodifiedatby}}. This message only appears if a user has not entered their 'real name' in their preferences. See also {{msg-mw|Siteusers}}.\n\nParameters:\n* $1 is a link to a user page with the user name as link text\n* $2 is a user name for use with GENDER (optional)",
        "anonuser": "Shown when viewing the credits of a page (example: {{canonicalurl:Main Page|action=credits}}).\n\nNote that this action is enabled by default but disabled on Wikimedia wikis.\n\nUsed as <code>$3</code> in  {{msg-mw|Lastmodifiedatby}}. This message only appears if the user is anonymous.\n\nParameters:\n* $1 - a link to the user's contributions\n\nSee also:\n* {{msg-mw|Anonusers}}\n* {{msg-mw|Siteuser}}",
        "pageinfo-templates": "The list of templates transcluded within the page. Parameters:\n* $1 is the number of templates transcluded within the current page.\nSee also:\n* {{msg-mw|Pageinfo-transclusions}}",
        "pageinfo-transclusions": "The list of pages on which this page is transcluded. Parameters:\n* $1 is the number of pages the current page is transcluded on.\nSee also:\n* {{msg-mw|Pageinfo-templates}}",
        "pageinfo-footer": "{{ignored}}Custom text for the bottom of the info page (action=info).",
-       "pageinfo-toolboxlink": "Information link for the page (like 'What links here', but to action=info for the current page instead)",
+       "pageinfo-toolboxlink": "Information link for the page (like \"What links here\", but to action=info for the current page instead).\n{{Identical|Page information}}",
        "pageinfo-redirectsto": "Key for the row shown if this page is a redirect. Verb. See [{{canonicalurl:w:Main_page|action=info}} example].",
        "pageinfo-redirectsto-info": "Text to put in parentheses for the link to the action=info of the redirect target.\n{{Identical|Info}}",
        "pageinfo-contentpage": "Key for the row shown on [{{fullurl:News|action=info}} action=info] if this page is [[mw:Manual:Article count|counted as a content page]]",
        "pageinfo-category-pages": "See also:\n* {{msg-mw|Pageinfo-category-subcats}}\n* {{msg-mw|Pageinfo-category-files}}",
        "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}}",
-       "skinname-cologneblue": "{{optional}}",
        "skinname-monobook": "{{optional}}",
-       "skinname-modern": "{{optional}}\n{{Identical|Modern}}",
        "skinname-vector": "{{optional}}",
        "markaspatrolleddiff": "{{doc-actionlink}}\nSee also:\n* {{msg-mw|Markaspatrolledtext}}",
        "markaspatrolledlink": "{{notranslate}}\nParameters:\n* $1 - link which has text {{msg-mw|Markaspatrolledtext}}",
        "file-no-thumb-animation": "We cannot animate thumbnails of this file.\n\nThis notice is shown on the image description page on animated svg files just below {{msg-mw|File-info-size}}.\n\nThis message may be overridden by a more specific message:\n* {{msg-mw|File-no-thumb-animation-gif}}.",
        "file-no-thumb-animation-gif": "Cannot animate thumbnails of this gif file, because it has too big a resolution. The cut off resolution can vary between wikis ([[mw:manual:$wgMaxAnimatedGifArea|$wgMaxAnimatedGifArea]]). Note that resolution is calculated as width times height times number of frames. See {{msg-mw|file-no-thumb-animation}}.",
        "newimages": "Page title of [[Special:NewImages]].",
+       "newimagestext": "Text in [[Special:NewImages]].",
        "imagelisttext": "This is text on [[Special:NewImages]]. Parameters:\n* $1 - the number of files\n* $2 - the message {{msg-mw|Bydate}}",
        "newimages-summary": "This message is displayed at the top of [[Special:NewImages]] to explain what is shown on that special page.",
        "newimages-legend": "Caption of the fieldset for the filter on [[Special:NewImages]]\n\n{{Identical|Filter}}",
        "newimages-label": "Caption of the filter editbox on [[Special:NewImages]]",
-       "showhidebots": "This is shown on the special page [[Special:NewImages]]. The format is \"{{int:showhidebots|[[MediaWiki:Hide/{{SUBPAGENAME}}|{{int:hide}}]]}}\" or \"{{int:showhidebots|[[MediaWiki:Show/{{SUBPAGENAME}}|{{int:show}}]]}}\"\n\n{{Identical|$1 bots}}",
+       "newimages-showbots": "Used as label for a checkbox. When checked, [[Special:NewImages]] will also display uploads by users in the bots group.",
        "noimages": "This is shown on the special page [[Special:NewImages]], when there aren't any recently uploaded files.",
        "ilsubmit": "Used as label for input box in the MIMESearch form on [[Special:MIMESearch]].\n\nSee also:\n* {{msg-mw|Mimesearch|page title}}\n* {{msg-mw|Mimetype|label for input box}}\n{{Identical|Search}}",
        "bydate": "{{Identical|Date}}",
        "variantname-shi-tfng": "{{optional}}",
        "variantname-shi-latn": "{{optional}}",
        "variantname-shi": "{{optional}}",
+       "variantname-uz": "{{optional}}",
+       "variantname-uz-latn": "{{optional}}",
+       "variantname-uz-cyrl": "{{optional}}",
        "metadata": "The title of a section on an image description page, with information and data about the image. For example of message in use see [[commons:File:Titan-crystal_bar.JPG|Commons]].\n{{Identical|Metadata}}",
        "metadata-help": "This message is followed by a table with metadata.",
        "metadata-expand": "On an image description page, there is mostly a table containing data (metadata) about the image. The most important data are shown, but if you click on this link, you can see more data and information. For the link to hide back the less important data, see {{msg-mw|Metadata-collapse}}.",
        "metadata-collapse": "On an image description page, there is mostly a table containing data (metadata) about the image. The most important data are shown, but if you click on the link {{msg-mw|Metadata-expand}}, you can see more data and information. This message is for the link to hide back the less important data.",
-       "metadata-fields": "{{doc-important|覅翻译列表项,只翻译上头个文本!畀 \"<code>* make</code>\" 搭别个列表项正确保留。}}\nThe sentences are for explanation only and are not shown to the user.",
+       "metadata-fields": "{{doc-important|Do not translate list items, only translate the text! So leave \"<code>* make</code>\" and the other items exactly as they are.}}\nThe sentences are for explanation only and are not shown to the user.",
        "metadata-langitem": "{{optional}}\nThis is used for constructing the list of translations when a metadata property is translated into multiple languages.\n\nParameters:\n* $1 - the value of the property (in one language)\n* $2 - the language name that this translation is for (or language code if language name cannot be determined)\n* $3 - (Unused) the language code",
        "metadata-langitem-default": "{{optional}}\nSimilar to \"metadata-langitem\" but for the case where a multilingual property has a default specified that does not specify what language the default is in. $1 is the value of the property.",
        "exif-imagewidth": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n{{Identical|Width}}",
        "exif-componentsconfiguration": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThis contains how the information in the picture is stored. This is most commonly Y, Cr, Cb to specify luma, red, blue. RGB is also possible to specify Red, Green, Blue.\n{{Related|Exif-componentsconfiguration}}",
        "exif-compressedbitsperpixel": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].",
        "exif-pixelydimension": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n{{Identical|Image width}}",
-       "exif-pixelxdimension": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].",
+       "exif-pixelxdimension": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n{{Identical|Image height}}",
        "exif-usercomment": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nComments by user. Sometimes used like ImageDescription when the ImageDescription contained non-ascii characters. (Technically ImageDescription is supposed to contain ascii characters. In practise utf-8 is used in ImageDescription, so this field isn't used too much.)",
        "exif-relatedsoundfile": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nSome cameras offer the option to record an audio \"memo\" for the photo they just took. If the user did that, the name of the file is labelled with this message.",
        "exif-datetimeoriginal": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThe date and time when the original image data was generated. For example if it was a painting from 1773, scanned in to a computer in 2007, the datetimeoriginal would be 1773 and {{msg-mw|exif-datetimedigitized}} would have the 2007 date.",
        "exif-gpsdifferential": "Label for EXIF information. Indicates whether differential correction is applied to the GPS receiver.",
        "exif-coordinate-format": "{{optional}}\nFor formatting GPS latitude coordinates. Parameters:\n* $1 - degrees\n* $2 - minutes\n* $3 - seconds (up to two decimal places)\n* $4 - direction (N, S, W, or E)\n* $5 - (Unused) coordinate as a single positive or negative real number",
        "exif-jpegfilecomment": "This is not a true exif tag, but the contents of the JPEG COM segment. This often contains a file source, but can potentially contain any comment about the file. This is similar to {{msg-mw|exif-usercomment}}, {{msg-mw|exif-pngfilecomment}}, and {{msg-mw|exif-giffilecomment}}.",
-       "exif-keywords": "List of keywords for the photograph (or other media).\n\nThis can come from IPTC-iim 2:25 keyword field, or XMP's dc:subject field.",
+       "exif-keywords": "List of keywords for the photograph (or other media).\n\nThis can come from IPTC-iim 2:25 keyword field, or XMP's dc:subject field.\n{{Identical|Keyword}}",
        "exif-worldregioncreated": "The world region (generally that means continent, but could also include 'World' as a whole) where the media was created.",
        "exif-countrycreated": "Country that the picture was taken in. Note this is where it was taken, not what country is depicted in the picture.",
        "exif-countrycodecreated": "ISO Code for the country that the picture was taken in. Note this is where it was taken, not what country is depicted in the picture.",
        "exif-flash-function-1": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n{{Related|Exif-flash}}",
        "exif-flash-redeye-1": "{{Related|Exif-flash}}",
        "exif-focalplaneresolutionunit-2": "See also:\n* {{msg-mw|Exif-focalplaneresolutionunit}}",
-       "exif-sensingmethod-1": "{{Related|Exif-sensingmethod}}",
+       "exif-sensingmethod-1": "{{Related|Exif-sensingmethod}}\n{{Identical|Undefined}}",
        "exif-sensingmethod-2": "{{Related|Exif-sensingmethod}}",
        "exif-sensingmethod-3": "{{Related|Exif-sensingmethod}}",
        "exif-sensingmethod-4": "{{Related|Exif-sensingmethod}}",
        "descending_abbrev": "Abbreviation of descending order.\nSee also:\n* {{msg-mw|Ascending abbrev}}\n* {{msg-mw|Descending abbrev}}",
        "table_pager_next": "Used as image button text of pager. See [[Support|example]] (the bottom of the page).\n{{Identical|Next page}}",
        "table_pager_prev": "Used as image button text of pager. See [[Support|example]] (the bottom of the page).\n{{Identical|Previous page}}",
-       "table_pager_first": "Used as image button text of pager. See [[Support|example]] (the bottom of the page).",
-       "table_pager_last": "Used as image button text of pager. See [[Support|example]] (the bottom of the page).",
+       "table_pager_first": "Used as image button text of pager. See [[Support|example]] (the bottom of the page).\n{{Identical|First page}}",
+       "table_pager_last": "Used as image button text of pager. See [[Support|example]] (the bottom of the page).\n{{Identical|Last page}}",
        "table_pager_limit": "Do not use PLURAL in this message, because ''$1'' is not the actual number. ''$1'' is a limit selector drop-down list.",
        "table_pager_limit_label": "Used as label for input field.",
        "table_pager_limit_submit": "{{Identical|Go}}",
        "bitrate-exabits": "{{optional}}\nBitrate (of a file, typically) in exabits (1 exabits = 1000×1000×1000×1000×1000×1000 bits).",
        "bitrate-zetabits": "{{optional}}\nBitrate (of a file, typically) in zetabits (1 zetabits = 1000×1000×1000×1000×1000×1000×1000 bits).",
        "bitrate-yottabits": "{{optional}}\nBitrate (of a file, typically) in yottabits (1 yottabits = 1000×1000×1000×1000×1000×1000×1000×1000 bits).",
-       "livepreview-loading": "{{Identical|Loading}}",
-       "livepreview-ready": "See also:\n* {{msg-mw|Livepreview-loading}}\n* {{msg-mw|Livepreview-failed}}\n* {{msg-mw|Livepreview-error}}",
-       "livepreview-failed": "Used as error message.\n\nSee also:\n* {{msg-mw|Livepreview-failed}}\n* {{msg-mw|Livepreview-error}}",
-       "livepreview-error": "Used as error message. Parameters:\n* $1 - ...\n* $2 - ...\nSee also:\n* {{msg-mw|Livepreview-failed}}\n* {{msg-mw|Livepreview-error}}",
        "lag-warn-normal": "Used as warning about slave lag. Parameters:\n* $1 - number of seconds\nSee also:\n* {{msg-mw|Lag-warn-high}}",
        "lag-warn-high": "Used as warning about slave lag. Parameters:\n* $1 - number of seconds\nSee also:\n* {{msg-mw|Lag-warn-normal}}",
        "editwatchlist-summary": "{{doc-specialpagesummary|editwatchlist}}",
-       "watchlistedit-numitems": "Message on [[Special:EditWatchlist]]. This is paired with the message {{Msg-mw|Watchlistedit-noitems}} which appears instead of this message when $1 is 0.",
-       "watchlistedit-noitems": "Message on [[Special:EditWatchlist]], which only appears when a user's watchlist is empty.",
        "watchlistedit-normal-title": "Title of [[Special:Watchlist/edit|special page]].",
        "watchlistedit-normal-legend": "Heading of dialogue box on [[Special:Watchlist/edit]]",
        "watchlistedit-normal-explain": "An introduction/explanation about the [[Special:Watchlist/edit|normal edit watchlist function]].\n\nRefers to {{msg-mw|Watchlistedit-normal-submit}}.",
        "watchlistedit-raw-done": "A message which appears after the raw watchlist has been updated using [[Special:Watchlist/raw]].",
        "watchlistedit-raw-added": "Message on [[Special:EditWatchlist/raw]].\n\nThe message appears after at least 1 message is added to the raw watchlist.\n\nFollowed by list of page titles which are added.\n\nParameters:\n* $1 - number of page titles which are added\nSee also:\n* {{msg-mw|Watchlistedit-normal-done}}\n* {{msg-mw|Watchlistedit-raw-removed}}",
        "watchlistedit-raw-removed": "Message on [[Special:EditWatchlist/raw]].\n\nThe message appears after at least 1 message is deleted from the raw watchlist.\n\nFollowed by list of page titles which are removed.\n\nParameters:\n* $1 - number of page titles which are removed\nSee also:\n* {{msg-mw|Watchlistedit-normal-done}}\n* {{msg-mw|Watchlistedit-raw-added}}",
+       "watchlistedit-clear-title": "Used as page title in [[Special:Watchlist/clear]].",
+       "watchlistedit-clear-legend": "Heading of dialog box on [[Special:Watchlist/clear]].\n{{Identical|Clear watchlist}}\n\nThis feature previously existed using the message {{msg-mw|clearwatchlist}}.",
+       "watchlistedit-clear-explain": "Used as intro text on [[Special:Watchlist/clear]].\n\nPreceded by the fieldset label {{msg-mw|Watchlistedit-clear-legend}}.\n\nFollowed by the button {{msg-mw|Watchlistedit-clear-submit}}.",
+       "watchlistedit-clear-titles": "Text above edit box containing items being watched on [[Special:Watchlist/clear]].\n{{Identical|Title}}",
+       "watchlistedit-clear-submit": "Text of submit button on [[Special:Watchlist/clear]].\n{{Identical|Clear watchlist}}",
+       "watchlistedit-clear-done": "A message which appears after the watchlist has been cleared using [[Special:Watchlist/clear]].",
+       "watchlistedit-clear-removed": "Message on [[Special:EditWatchlist/clear]].\n\nThe message appears once the watchlist has been cleared.",
+       "watchlistedit-too-many": "Message on [[Special:EditWatchlist]] that is used when there are too many titles to display.\n\nShown instead of list of the pages.",
+       "watchlisttools-clear": "[[Special:Watchlist]]: Navigation link under the title.\n{{Identical|Clear watchlist}}",
        "watchlisttools-view": "[[Special:Watchlist]]: Navigation link under the title.\n\nSee also:\n* {{msg-mw|watchlisttools-edit}}\n* {{msg-mw|watchlisttools-raw}}",
        "watchlisttools-edit": "[[Special:Watchlist]]: Navigation link under the title.\n\nSee also:\n* {{msg-mw|Watchlisttools-view}}\n* {{msg-mw|Watchlisttools-raw}}",
        "watchlisttools-raw": "[[Special:Watchlist]]: Navigation link under the title.\n\nSee also:\n* {{msg-mw|watchlisttools-view}}\n* {{msg-mw|watchlisttools-edit}}\n{{Identical|Edit raw watchlist}}",
        "compare-invalid-title": "Used as error message in [[Special:ComparePages]].",
        "compare-title-not-exists": "Used as error message in [[Special:ComparePages]].",
        "compare-revision-not-exists": "Used as error message in [[Special:ComparePages]].",
-       "dberr-header": "This message does not allow any wiki nor html markup.",
        "dberr-problems": "This message does not allow any wiki nor html markup.",
        "dberr-again": "This message does not allow any wiki nor html markup.",
        "dberr-info": "This message does not allow any wiki nor html markup. Parameters:\n* $1 - database server name\nSee also:\n* {{msg-mw|Dberr-info-hidden}} - hides database server name",
        "htmlform-no": "Used in form, such as with radio buttons, for generic yes / no questions.\n{{Identical|No}}",
        "htmlform-yes": "Used in form, such as with radio buttons, for generic yes / no questions.\n{{Identical|Yes}}",
        "htmlform-chosen-placeholder": "Used as initial placeholder text in select multiple \"chosen\" input boxes",
+       "htmlform-cloner-create": "Used as the text for the button that adds a row to a multi-input HTML form element.\n\nSee also:\n* {{msg-mw|htmlform-cloner-delete}}\n* {{msg-mw|htmlform-cloner-required}}",
+       "htmlform-cloner-delete": "Used as the text for the button that removes a row from a multi-input HTML form element\n\nSee also:\n* {{msg-mw|htmlform-cloner-create}}\n* {{msg-mw|htmlform-cloner-required}}\n{{Identical|Remove}}",
+       "htmlform-cloner-required": "Used as an error message in HTML forms.\n\nSee also:\n* {{msg-mw|htmlform-required}}\n* {{msg-mw|htmlform-cloner-create}}\n* {{msg-mw|htmlform-cloner-delete}}",
        "sqlite-has-fts": "Shown on [[Special:Version]].\nParameters:\n* $1 - version",
        "sqlite-no-fts": "Shown on [[Special:Version]].\nParameters:\n* $1 - version",
        "logentry-delete-delete": "{{Logentry|[[Special:Log/delete]]}}",
index 44600b8..4cb40b3 100644 (file)
@@ -7,7 +7,9 @@
                        "Omnipaedista",
                        "Reedy",
                        "The Evil IP address",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라",
+                       "Fitoschido"
                ]
        },
        "tog-underline": "T'inkikunata uranpi sikwiy",
@@ -20,7 +22,6 @@
        "tog-showtoolbar": "Llamk'apuna sillwita rikuchiy",
        "tog-editondblclick": "P'anqakunata llamk'apuy iskaylla ñit'iywan",
        "tog-editsectiononrightclick": "Rakirilla llamk'apuyta saqillay paña butunta rakirip sutinpi ñit'ispa",
-       "tog-rememberpassword": "Ruraqpa sutiyta yaykuna rimaytapas yuyaykuy kay llika wamp'unapi ({{PLURAL:$1|huk p'unchawkama|$1 p'unchawkama}})",
        "tog-watchcreations": "Qallarisqay p'anqakunata churkusqay willañiqikunatapas watiqay",
        "tog-watchdefault": "Hukchasqay p'anqakunata willañiqikunatapas watiqay",
        "tog-watchmoves": "Astasqay p'anqakunata willañiqikunatapas watiqay",
        "readonly_lag": "Willañiqintinqa mit'alla hark'asqam, sirwiqkuna kikinpachachastin.",
        "internalerror": "Ukhu pantasqa",
        "internalerror_info": "Ukhu pantasqa: $1",
-       "fileappenderrorread": "Manam atinichu \"$1\"-ta ñawiriyta chupanchachkaspa.",
-       "fileappenderror": "Manam atinichu \"$1\"-ta \"$2\"-man yapayta.",
        "filecopyerror": "Manam atinichu willañiqita \"$1\"-manta \"$2\"-man iskaychayta.",
        "filerenameerror": "Manam atinichu willañiqip sutinta \"$1\"-manta \"$2\"-man hukchayta.",
        "filedeleteerror": "Manam atinichu \"$1\" sutiyuq willañiqita qulluyta.",
        "directorycreateerror": "Manam atinichu \"$1\" sutiyuq willañiqi churanata kamayta.",
        "filenotfound": "Manam tarinichu \"$1\" sutiyuq willañiqita.",
-       "fileexistserror": "Manam atinichu \"$1\" sutiyuq willañiqiman qillqamuyta: willañiqiqa kachkanñam",
        "unexpected": "Mana suyaykusqa chani: \"$1\"=\"$2\".",
        "formerror": "Pantasqa: manam atinichu hunt'ana p'anqata kachayta",
        "badarticleerror": "Kay p'anqapiqa manam saqillanchu kay hina rurayta.",
        "userlogin-resetpassword-link": "Yaykuna rimaykita qunqarqankichu?",
        "userlogin-helplink2": "Yaykuywan yanapay",
        "userlogin-createanother": "Huk rakiqunata kamariy",
-       "createacct-join": "Kay qatiqpi willaykita yaykuchiy.",
        "createacct-emailrequired": "E-chaski imamayta",
        "createacct-emailoptional": "E-chaski imamayta (munaspayki)",
        "createacct-email-ph": "E-chaski imamaytaykita yaykuchiy",
        "savearticle": "P'anqata waqaychay",
        "preview": "Manaraq waqaychaspa qhawariy",
        "showpreview": "Ñawpaqta qhawallay",
-       "showlivepreview": "Kawsaqlla qhawariy",
        "showdiff": "Hukchasqakunata rikuchiy",
        "anoneditwarning": "''Paqtataq:'' Manaraqmi ruraqpa sutiykita qumurqunkichu. IP huchhaykim kay p'anqap hukchay hallch'ayninpi waqaychasqa kanqa.",
        "anonpreviewwarning": "''Manam ruraqpa sutiykiwan yaykusqa kachkankichu. Imatapas waqaychaptiykiqa, IP huchhaykim hallch'asqa kanqa kay p'anqap llamk'apuy wiñay kawsayninpi.''",
        "edit-gone-missing": "Manam atirqanichu p'anqata musuqchayta.\nQullusqachá.",
        "edit-conflict": "Tuylla llamk'apuymanta sasachakuy.",
        "edit-no-change": "Manapuni hukchaptiykim, llamk'apusqayki manam hallch'asqachu.",
-       "postedit-confirmation": "Llamk'apusqaykiqa waqaychasqañam.",
+       "postedit-confirmation-created": "P'anqaqa kamarisqañam.",
+       "postedit-confirmation-restored": "P'anqaqa musuqmanta kamarisqañam.",
+       "postedit-confirmation-saved": "Llamk'apusqaykiqa waqaychasqañam.",
        "edit-already-exists": "Manam atinichu musuq p'anqata kamariyta.\nKachkañam.",
        "defaultmessagetext": "Ñawpaq qillqa",
        "content-failed-to-parse": "Manam atinichu $2 samiqta $1 kikinchapaq kuskiyta: $3",
        "pagemerge-logentry": "[[$1]]-ta [[$2]]-man huñusqa (llamk'apusqakuna $3-kama)",
        "revertmerge": "Huñusqata kutichiy",
        "mergelogpagetext": "Kay qatiqpiqa aswan ñaqha huk p'anqa wiñay kawsaymanta huk p'anqa wiñay kawsayman huñusqakunatam rikunki.",
-       "history-title": "\"$1\" p'anqata hukchasqakunap wiñay kawsaynin",
+       "history-title": "«$1» p’anqata hukchasqakunap wiñay kawsaynin",
        "difference-title": "$1 nisqapaq musuqchasqapura wakin kaynin",
        "difference-title-multipage": "$1, $2 sutiyuq willañiqipura wakin kaynin",
        "difference-multipage": "(P'anqakunaqa manam kaqllachu)",
        "search-nonefound": "Maskaypaq kay hina kachun nisqakamaqa manam kanchu taripasqakuna.",
        "powersearch-legend": "Ñawparikusqa maskay",
        "powersearch-ns": "Kay suti k'itikunapi maskay:",
-       "powersearch-redir": "Pusapunakunata rikuchiy",
        "powersearch-togglelabel": "Llanchiy:",
        "powersearch-toggleall": "Tukuy",
        "powersearch-togglenone": "Mana imapas",
        "prefs-emailconfirm-label": "E-chaskita takyachiy:",
        "youremail": "E-chaski imamaytayki",
        "username": "{{GENDER:$1|Ruraqpa sutin}}:",
-       "uid": "{{GENDER:$1|Ruraqpa}} ID-nin:",
        "prefs-memberingroups": "Kay {{PLURAL:$1|huñuman|huñukunaman}} {{GENDER:$2|kapuq}}:",
        "prefs-registration": "Hallch'ay pacha:",
        "yourrealname": "Chiqap sutiyki*",
        "prefs-advancedsearchoptions": "Ñawparikusqa akllanakuna",
        "prefs-advancedwatchlist": "Ñawparikusqa akllanakuna",
        "prefs-displayrc": "Akllanakunata rikuchiy",
-       "prefs-displaysearchoptions": "Akllanakunata rikuchiy",
        "prefs-displaywatchlist": "Akllanakunata rikuchiy",
        "prefs-tokenwatchlist": "Llawi",
        "prefs-diffs": "Wakin kaykuna",
        "recentchanges-legend-heading": "'''Sut'ichana:'''",
        "recentchanges-legend-newpage": "([[Special:NewPages|musuq p'anqakunatapas]] qhaway)",
        "rcnotefrom": "Kay qatiqpiqa '''$2'''-mantapacha ('''$1'''-kama) hukchasqakunatam rikunki.",
-       "rclistfrom": "$1-manta musuq hukchasqakunata rikuchiy",
+       "rclistfrom": "$3 $2-manta musuq hukchasqakunata rikuchiy",
        "rcshowhideminor": "$1 uchuylla llamk'apusqakunata",
        "rcshowhidebots": "$1 rurana antachakunata",
        "rcshowhideliu": "$1 hallch'asqa ruraqkunata",
        "uploadstash-refresh": "Willañiqi sutisuyuta musuqchay",
        "invalid-chunk-offset": "Mana allin willañiqi raki churkuy",
        "img-auth-accessdenied": "Manam chayman saqisqachu",
-       "img-auth-nopathinfo": "Manam kanchu PATH_INFO.\nSirwiqniykiqa manam churasqachu kaymanta willananpaq.\nCGI nisqawanchá tiksichasqa, chayrayku manachá img_auth nisqata q'imiyta atinchu.\nhttps://www.mediawiki.org/wiki/Manual:Image_Authorization nisqata qhaway.",
+       "img-auth-nopathinfo": "Manam kanchu PATH_INFO.\nSirwiqniykiqa manam churasqachu kaymanta willananpaq.\nCGI nisqawanchá tiksichasqa, chayrayku manachá img_auth nisqata q'imiyta atinchu.\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization nisqata qhaway.",
        "img-auth-notindir": "Mañakusqa ñanqa manam churaykusqa churkuna churanapi kachkanchu.",
        "img-auth-badtitle": "Manam atinichu \"$1\" nisqamanta chaniyuq sutita rurayta.",
        "img-auth-nologinnWL": "Manam yaykusqa kachkankichu, \"$1\" nisqataq manam yuraq sutisuyupi kachkanchu.",
        "log-title-wildcard": "Kaywan qallariq p'anqa sutikunata maskay",
        "showhideselectedlogentries": "Akllasqa hallch'asqakunata rikuchiy/pakay",
        "allpages": "Tukuy p'anqakuna",
-       "alphaindexline": "$1-ta $2-man",
        "nextpage": "Qatiq p'anqa ($1)",
        "prevpage": "Ñawpaq p'anqa ($1)",
        "allpagesfrom": "Rikuchiy kaywan qallariq p'anqakunata:",
        "watchlist-details": "Watiqana sutisuyuykipiqa {{PLURAL:$1|huk p'anqam|$1 p'anqakunam}}, rimanakuna p'anqakunata mana yupaspa.",
        "wlheader-enotif": "E-chaskimanta musyachinaman arí nisqañam.",
        "wlheader-showupdated": "Qayna watukamusqaykimantapacha hukchasqa p'anqakunataqa '''yanasapa''' nisqapim rikunki.",
-       "watchmethod-recent": "watiqasqayki p'anqakunapaq ñaqha hukchasqakunata llanchispa",
-       "watchmethod-list": "watiqasqayki p'anqakunata ñaqha hukchasqakunapaq llanchispa",
-       "watchlistcontains": "Watiqana sutisuyuykipiqa $1 {{PLURAL:$1|p'anqam|p'anqakunam}} kachkan.",
-       "iteminvalidname": "'$1' nisqa qillqaqa sasachakunmi, sutinqa manam allinchu...",
        "wlshowlast": "$1 ura, $2 p'unchaw $3-mantapacha hukchasqakunata rikuchiy",
        "watchlist-options": "Watiqana sutisuyupaq allinkachinakuna",
        "watching": "Watiqasqakunaman yapaspa...",
        "enotif_lastvisited": "$1 sutiyuq p'anqata qhaway qayna watukamusqaykimantapacha tukuy hukchasqakunata rikunaykipaq.",
        "enotif_lastdiff": "$1 sutiyuq p'anqata qhaway kay hukchasqata rikunaykipaq.",
        "enotif_anon_editor": "sutinnaq ruraq $1",
-       "enotif_body": "Munakusqa $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nLlamk'apuqpa willasqan: $PAGESUMMARY $PAGEMINOREDIT\n\nLlamk'apuqta tapuy:\ne-chaski: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nKay p'anqata mana musuqmanta watukamuptiykiqa, manam huk ruraykunamanta willasqaykichu. Tukuy watiqasqayki p'anqakunapaq musyachina sananchakunatapas kutichiytam atinkiman.\n\nTukuy sunquwan, {{SITENAME}}pa e-chaski musyachina llikan\n\n--\nE-chaski willaykuy allinkachinakunata hukchanaykipaqqa kay p'anqatam qhaway:\n{{canonicalurl:{{#special:Preferences}}}} \n\nWatiqana sutisuyuykipaq allinkachinakunata hukchanaykipaqqa kay p'anqatam qhaway:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nP'anqata watiqana sutisuyuykimanta qichunaykipaqqa kay p'anqatam qhaway:\n$UNWATCHURL\n\nYanapasunaykipaq:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Munakusqa $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nLlamk'apuqpa willasqan: $PAGESUMMARY $PAGEMINOREDIT\n\nLlamk'apuqta tapuy:\ne-chaski: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nKay p'anqata mana musuqmanta watukamuptiykiqa, manam huk ruraykunamanta willasqaykichu. Tukuy watiqasqayki p'anqakunapaq musyachina sananchakunatapas kutichiytam atinkiman.\n\nTukuy sunquwan, {{SITENAME}}pa e-chaski musyachina llikan\n\n--\nE-chaski willaykuy allinkachinakunata hukchanaykipaqqa kay p'anqatam qhaway:\n{{canonicalurl:{{#special:Preferences}}}} \n\nWatiqana sutisuyuykipaq allinkachinakunata hukchanaykipaqqa kay p'anqatam qhaway:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nP'anqata watiqana sutisuyuykimanta qichunaykipaqqa kay p'anqatam qhaway:\n$UNWATCHURL\n\nYanapasunaykipaq:\n$HELPPAGE",
        "created": "kamarirqan",
        "changed": "hukchasqa",
        "deletepage": "Kay p'anqata qulluy",
        "blockip": "Ruraqta hark'ay",
        "blockip-legend": "Ruraqta hark'ay",
        "blockiptext": "Kay qatiq hunt'ana p'anqata llamk'achiy huk sapaq IP huchhamanta icha ruraqpa rakiqunanmanta qillqay atiyta hark'anapaq.\nKayqa rurasqa kachun wandalismullatam hark'anapaq, [[{{MediaWiki:Policy-url}}|{{SITENAME}}pa kawpayninkamallam]].\nWillariy imaraykum hark'anki (ahinataq: sapaq wandaluchasqa p'anqakunamanta willaspa).",
-       "ipadressorusername": "IP huchha icha ruraqpa sutin",
+       "ipaddressorusername": "IP huchha icha ruraqpa sutin",
        "ipbexpiry": "Hark'ay kaykama:",
        "ipbreason": "Kayrayku:",
        "ipbreason-dropdown": "*Hark'anapaq sapsi raykukuna\n** Llulla willayta qillqamuy\n** P'anqata samiqninmanta ch'usaqchay\n** ''Spam'' nisqa millay t'inkikunata yapay\n** Q'upata, mana ima chaniyuqtapas yapay\n** Huk ruraqkunata manchachiy icha k'amiy\n** Achka rakiqunakunawan millayta ruray\n** Mana chaskinalla ruraqpa sutin",
        "cologneblue.js": "/* Ima kaypi qillqamusqa JavaScript nisqa wakichi qillqapas ''Cologne Blue skin'' nisqa qarata llamk'achiq ruraqkunapaq chaqnasqa kanqa */",
        "monobook.js": "/* Ima kaypi qillqamusqa JavaScript nisqa wakichi qillqapas MonoBook nisqata llamk'achiq ruraqkunapaq chaqnasqa kanqa */",
        "modern.js": "/* Ima kaypi qillqamusqa JavaScript nisqa wakichi qillqapas ''Modern skin'' nisqa qarata llamk'achiq ruraqkunapaq chaqnasqa kanqa */",
-       "notacceptable": "Wiki sirwiqqa manam willakunata quyta atinchu mink'akuqniykip (wamp'unaykip) hap'iyta atisqan chantapi.",
        "anonymous": "{{SITENAME}}pi sutinnaq {{PLURAL:$1|ruraq|ruraqkuna}}",
        "siteuser": "{{SITENAME}}-pa $1 sutiyuq ruraqnin",
        "anonuser": "{{SITENAME}} rakiqunannaq ruraq $1",
        "newimages-summary": "Kay sapaq p'anqapiqa ñaqha churkusqa willañiqikunatam rikunki.",
        "newimages-legend": "Ch'illchina",
        "newimages-label": "Willañiqip sutin (icha sutinpa rakin):",
-       "showhidebots": "($1 rurana antacha)",
        "noimages": "Manam ima rikunallapas kanchu.",
        "ilsubmit": "Maskay",
        "bydate": "p'unchawkama",
        "autosumm-replace": "P'anqap tukuy samiqnin '$1'-wan huknachasqa",
        "autoredircomment": "[[$1]]-man pusapusqa",
        "autosumm-new": "Musuq p'anqa kamarisqa kaywan: $1",
-       "livepreview-loading": "Chaqnamuspa…",
-       "livepreview-ready": "Chaqnamuspa… Kamarisqa!",
-       "livepreview-failed": "Kawsaqlla ñawpaq qhawariyqa manam tukuyta atinchu!\nSapsilla ñawpaq qhawariyta tukuykachay.",
-       "livepreview-error": "Manam atinichu t'inkiyta: $1 \"$2\".\nSapsilla ñawpaq qhawariyta tukuykachay.",
        "lag-warn-normal": "Qhipaq $1 {{PLURAL:$1|sikundupi|sikundukunapi}} hukchasqakunaqa manachá rikch'akunqachu kay sutisuyupi.",
        "lag-warn-high": "Willañiqintin sirwiq nisyuta ruranayuq kachkaptinmi, qhipaq $1 {{PLURAL:$1|sikundupi|sikundukunapi}} hukchasqakunaqa manachá rikch'akunqachu kay sutisuyupi.",
-       "watchlistedit-numitems": "Watiqana sutisuyuykiqa {{PLURAL:$1|huk p'anqayuqmi|$1 p'anqayuqmi}} kachkan, rimanakuy p'anqakunata mana yupaptinchik.",
-       "watchlistedit-noitems": "Manam ima p'anqatapas watiqachkankichu.",
        "watchlistedit-normal-title": "Watiqana sutisuyuta llamk'apuy",
        "watchlistedit-normal-legend": "P'anqa sutikunata watiqana sutisuyumanta qichuy",
        "watchlistedit-normal-explain": "Kay qatiqpiqa watiqana sutisuyuykipi p'anqa sutikunatam rikunki. P'anqa sutita qichunaykipaqqa chay sutip kinrayninpi kaq k'itichata ñit'iywan sananchaspa \"{{int:Watchlistedit-normal-submit}}\" nisqata ñit'iy. [[Special:EditWatchlist/raw|Chawa watiqana sutisuyuta llamk'apuy]] nisqata ñit'iytapas atinkim.",
        "compare-invalid-title": "Qusqayki p'anqap sutinqa manam allinchu.",
        "compare-title-not-exists": "Qusqayki p'anqap sutinqa manam kanchu.",
        "compare-revision-not-exists": "Qusqayki p'anqa musuqchasqaqa manam kanchu.",
-       "dberr-header": "Kay wikiqa sasachakuyniyuqmi",
        "dberr-problems": "Achachaw! Kay tiyayqa allwiya sasachakuykunayuqmi kachkan.",
        "dberr-again": "Ratullata suyaspa musuqmanta chaqnaspa huk kutita ruraykachay.",
        "dberr-info": "(Manam atinichu willañiqintin sirwiqwan willanakuyta: $1)",
index 357aba6..fe3d236 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "AlimanRuna",
                        "Ebe123",
-                       "Sylvain2803"
+                       "Sylvain2803",
+                       "아라"
                ]
        },
        "tog-underline": "Tinkikunana uraypi aspishpa rikuchina",
@@ -15,7 +16,6 @@
        "tog-numberheadings": "Uma killkaykunata yupayta churak antawata llankachina",
        "tog-showtoolbar": "Llamkana antakunata rikuchina (Javascriptwanlla)",
        "tog-editondblclick": "Ishkayta klik rurashpa pankapi killkanata kallarina (JavaScriptwanlla)",
-       "tog-rememberpassword": "Ñukapak shuti, yaykuna yupaytapash kay wampunapi kipaka churankapak yuyana ({{PLURAL:$1|puncha|punchakuna}}kamanlla)",
        "tog-watchcreations": "Ñukapak wacharishka pankakunata rikuna",
        "tog-watchdefault": "Ñukapak shukchishka pankakunata rikuna",
        "tog-watchmoves": "Ñukapak shuk shutiman apakushka pankakunata rikuna",
        "missingarticle-rev": "(Killkay#: $1)",
        "internalerror": "Antawa ukupi pantay tiyarka",
        "internalerror_info": "Antawa ukupi pantay tiyarka: $1",
-       "fileappenderrorread": "Pankata wiñachishpa $1-ta na tarinata usharkanchikchu",
-       "fileappenderror": "$1-ta $2-man yapanata na atirkanchikchu",
        "filecopyerror": "$1-ta $2-man ishkachanata na atirkanchikchu",
        "filerenameerror": "$1-man $2 shutita karana na atirkanchikchu",
        "filedeleteerror": "\"$1\" archivuta pichanata na atirkanchikchu.",
        "directorycreateerror": "$1 allichina ukuta na wachachinata atirkanchikchu",
        "filenotfound": "\"$1\" archivuta tarinata na atirkanchikchu.",
-       "fileexistserror": "$1 archivupi na killkanata ushapankichu: shuk shina shutiyuk archivuta ñami tiyan",
        "unexpected": "Chayta na shuyashkachu karka: \"$1\"=\"$2\".",
        "badarticleerror": "Kay pankapi chayta na ruranachu.",
        "cannotdelete": "$1 shutiyuk pankata (archivucha) na pichanata atirkanchikchu.\nShina kakpika, shuk rurakka ña pankata pichankacha.",
        "search-nonefound": "Kikinka maskashka rimaykunaka mana tiyanchu.",
        "powersearch-legend": "Ashtawan alli maskana",
        "powersearch-ns": "Chay shutipak kitikunapi maskana :",
-       "powersearch-redir": "Kutinpushaykunata rikuchiy",
        "preferences": "Akllaykuna",
        "mypreferences": "Ñukapak munaykuna",
        "youremail": "E-chaski:",
        "recentchanges-label-bot": "Kay killkata shuk killkachik-antakami rurarka",
        "recentchanges-label-unpatrolled": "Chay killkayka mana kutin rikushkachu kan",
        "rcnotefrom": "Katikka tukuy '''$2''' manta mushuk killkaykunata rikuchinchik ('''$1'''-kamanlla)",
-       "rclistfrom": "$1-manta mushuk killkaykunata rikuchiy",
+       "rclistfrom": "$3 $2-manta mushuk killkaykunata rikuchiy",
        "rcshowhideminor": "uchilla killkaykunata $1",
        "rcshowhidebots": "$1 rurana antakuna (''bots'')",
        "rcshowhideliu": "$1 shutiyuk rurakkunaka kaypimi kan",
index 344c9f2..b1b19df 100644 (file)
        "readonly_lag": "La banca da datas èn vegnidas bloccadas automaticamain per ch'ils servers da bancas da datas derasads (slaves) pon vegnir sincronisads cun il server da bancas da datas principal (master).",
        "internalerror": "Errur interna",
        "internalerror_info": "Errur interna: $1",
-       "fileappenderrorread": "Betg pussaivel da leger \"$1\" durant agiuntar.",
-       "fileappenderror": "Betg pussaivel dad agiuntar \"$1\" a \"$2\".",
        "filecopyerror": "Betg pussaivel da copiar la datotca \"$1\" a \"$2\".",
        "filerenameerror": "Betg pussaivel da renumnar la datotca \"$1\" a \"$2\".",
        "filedeleteerror": "Betg pussaivel da stizzar la datoteca \"$1\".",
        "directorycreateerror": "Betg pussaivel da crear l'ordinatur \"$1\".",
        "filenotfound": "Betg pussaivel da chattar la datoteca \"$1\".",
-       "fileexistserror": "Betg pussaivel da scriver la datoteca \"$1\": La datoteca exista gia.",
        "unexpected": "Valur nunspetgada: \"$1\"=\"$2\".",
        "formerror": "Errur: betg pussaivel da trametter il formular",
        "badarticleerror": "Questa acziun na po betg vegnir exequida sin questa pagina.",
        "userlogin-resetpassword-link": "Has emblidà tes pled-clav?",
        "userlogin-loggedin": "Ti es gia t'annunzià sco {{GENDER:$1|$1}}.\nDovra il suandant formular per t'annunziar cun in auter conto.",
        "userlogin-createanother": "Crear in auter conto",
-       "createacct-join": "Endatescha tias infurmaziuns sutvart.",
-       "createacct-another-join": "Endatescha sutvart las infurmaziuns dal nov conto.",
        "createacct-emailrequired": "Adressa dad e-mail",
        "createacct-emailoptional": "Adressa dad e-mail (opziunal)",
        "createacct-email-ph": "Endatescha ti'adressa dad e-mail",
        "savearticle": "Memorisar la pagina",
        "preview": "Prevista",
        "showpreview": "Mussar prevista",
-       "showlivepreview": "Prevista directa",
        "showdiff": "Mussar midadas",
        "anoneditwarning": "Vus essas betg annunziads. Empè dal num d'utilisader vign l'adressa dad IP registrada en la historia da las versiuns.",
        "anonpreviewwarning": "''Ti n'es betg t'annunzià. Cun memorisar vegn perquai tia adressa IP registrada en la cronologia da la pagina.''",
        "search-nonefound": "Per il term tschertgà èn nagins resultats vegnids chattads.",
        "powersearch-legend": "Tschertga extendida",
        "powersearch-ns": "Tschertgar en tips da pagina:",
-       "powersearch-redir": "Mussar renviaments",
        "powersearch-togglelabel": "Tscherna:",
        "powersearch-toggleall": "Tuts",
        "powersearch-togglenone": "Nagins",
        "prefs-advancedsearchoptions": "Opziuns extendidas",
        "prefs-advancedwatchlist": "Opziuns extendidas",
        "prefs-displayrc": "Opziuns da visualisar",
-       "prefs-displaysearchoptions": "Opziuns da visualisar",
        "prefs-displaywatchlist": "Opziuns da visualisar",
        "prefs-diffs": "Cumparegliaziun da versiuns",
        "email-address-validity-valid": "L'adressa da e-mail para dad esser valida",
        "uploadstash-refresh": "Actualisar la glista da las datotecas",
        "invalid-chunk-offset": "Offset dal segment nunvalid",
        "img-auth-accessdenied": "Refusà l'access",
-       "img-auth-nopathinfo": "PATH_INFO manca.\nTes server n'è betg configurà per surdar questa infurmaziun.\nEl basa forsa sin CGI è na sustegna betg img_auth.\nConsultescha https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "PATH_INFO manca.\nTes server n'è betg configurà per surdar questa infurmaziun.\nEl basa forsa sin CGI è na sustegna betg img_auth.\nConsultescha https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Il percurs dumandà n'è betg en l'ordinatur da transferir configurà.",
        "img-auth-badtitle": "Nunpussaivel da construir in titel valid da \"$1\".",
        "img-auth-nologinnWL": "Ti n'ès betg t'annunzia ed \"$1\" n'è betg sin la glista alva.",
        "watchlist-details": "Ti has {{PLURAL:$1|$1 pagina|$1 paginas}} sin tia glista d'observaziun, paginas da discussiun exclusas.",
        "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'''",
-       "watchmethod-recent": "intercurir las davosas midadas per la glista d'observaziun",
-       "watchmethod-list": "intercurir las paginas observadas davart novas midadas",
-       "watchlistcontains": "Tia glista d'observaziun cuntegna $1 {{PLURAL:$1|pagina|paginas}}.",
-       "iteminvalidname": "Problem cun endataziun '$1', num nunvalid...",
        "wlshowlast": "Mussar: las ultimas $1 uras, ils ultims $2 dis u $3.",
        "watchlist-options": "Opziuns per la glista d'observaziun",
        "watching": "observ...",
        "blockip": "Bloccar l'utilisader",
        "blockip-legend": "Bloccar l'utilisader",
        "blockiptext": "Utilisescha il formular sutvart per bloccar ina adressa IP u in utilisader uschia ch'el na po betg pli far midadas.\nTi duessas be far quai per impedir vandalissem e en ina moda confurma a las [[{{MediaWiki:Policy-url}}|directivas]].\nInditgescha sutvart in motiv (per exempel pos ti inditgar paginas ch'èn vegnidas destruidas).",
-       "ipadressorusername": "Adressa IP u num d'utilisader:",
+       "ipaddressorusername": "Adressa IP u num d'utilisader:",
        "ipbexpiry": "Bloccà enfin:",
        "ipbreason": "Motiv:",
        "ipbreason-dropdown": "*Motivs generals per bloccar\n** Inserir infurmaziuns faussas\n** Stizzar cuntegn da paginas\n** Inserir colliaziuns da spam a paginas externas\n** Inserir nonsens en paginas\n** Sedepurtar nunconvegnent u mulestant\n** Abus da plirs contos\n** Num d'utilisader nunacceptabel",
        "common.css": "",
        "monobook.css": "/* editescha quest file per adattar il skin momobook per l'entira pagina */",
        "monobook.js": "",
-       "notacceptable": "ll server dal wiki na po betg furnir datas en in format che tes apparat po leger.",
        "anonymous": "{{PLURAL:$1|In utilisader anonim|Utilisaders anonims}} da {{SITENAME}}",
        "siteuser": "utilisader $1 da {{SITENAME}}",
        "anonuser": "Utilisader anonim $1 da {{SITENAME}}",
        "newimages-summary": "Questa pagina speziala mussa las davosas datotecas ch'èn vegnidas chargiadas si.",
        "newimages-legend": "Filter",
        "newimages-label": "Num da la datoteca (u ina part da quel):",
-       "showhidebots": "($1 bots)",
        "noimages": "Chattà naginas datotecas.",
        "ilsubmit": "Tschertgar",
        "bydate": "tenor data",
        "autosumm-replace": "Replazzà il cuntegn cun \"$1\"",
        "autoredircomment": "Creà renviament a [[$1]]",
        "autosumm-new": "Creà la pagina cun \"$1\"",
-       "livepreview-loading": "Chargiar…",
-       "livepreview-ready": "Chargiar… Pront!",
-       "livepreview-failed": "Errur cun la prevista dinamica!\nEmprova cun la prevista normala.",
-       "livepreview-error": "Betg pussaivel da far la connexiun: $1 \"$2\".\nEmprova cun la prevista normala",
        "lag-warn-normal": "Midadas pli novas che $1 {{PLURAL:$1|secunda|secundas}} vegnan eventualmain betg mussadas.",
        "lag-warn-high": "Causa da la gronda chargia da lavur sin il server da bancas da datas vegnan las modificaziuns da las {{PLURAL:$1|ultima secunda|ultimas $1 secundas}} anc betg mussadas en questa glista.",
-       "watchlistedit-numitems": "Tia glista d'observaziun cuntegna {{PLURAL:$1|1 endataziun|$1 endataziuns}}; las paginas da discussiun na vegnan betg dumbradas.",
-       "watchlistedit-noitems": "Tia glista d'observaziun na cuntegna naginas endataziuns.",
        "watchlistedit-normal-title": "Modifitgar la glista d'observaziun",
        "watchlistedit-normal-legend": "Allontanar da la glista d'observaziun",
        "watchlistedit-normal-explain": "Las endataziuns da tia glista d'observaziun èn mussadas sutvart. \nPer allontanar ina endataziun, tscherna il quadert dasperas e clicca sin \"{{int:Watchlistedit-normal-submit}}\".\nTi pos era modifitgar tia glista d'observaziun en il [[Special:EditWatchlist/raw|format da glistas]].",
        "compare-invalid-title": "Il titel che ti has spezifitgà è nunvalid.",
        "compare-title-not-exists": "Il titel che ti has inditgà n'exista betg.",
        "compare-revision-not-exists": "La versiun che ti has inditgà n'exista betg.",
-       "dberr-header": "Questa wiki ha in problem",
        "dberr-problems": "Stgisa! Questa pagina ha actualmain difficultads tecnicas.",
        "dberr-again": "Spetga in per minutas ed emprova alura da chargiar danovamain.",
        "dberr-info": "(Betg pussaivel da contactar il server da la banca da datas: $1)",
index ffbf58c..64676fd 100644 (file)
@@ -21,7 +21,8 @@
                        "Strainu",
                        "TTO",
                        "Urhixidur",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Sublinierea legăturilor:",
@@ -33,7 +34,7 @@
        "tog-numberheadings": "Numerotează automat secțiunile",
        "tog-showtoolbar": "Afișează bara de unelte pentru modificare",
        "tog-editondblclick": "Modifică paginile prin dublu clic",
-       "tog-editsectiononrightclick": "Activează modificarea secţiunilor prin clic dreapta pe titlul secțiunii",
+       "tog-editsectiononrightclick": "Activează modificarea secțiunilor prin clic dreapta pe titlul secțiunii",
        "tog-watchcreations": "Adaugă paginile pe care le creez și fișierele pe care le încarc la lista mea de pagini urmărite",
        "tog-watchdefault": "Adaugă paginile și fișierele pe care le modific la lista mea de urmărire",
        "tog-watchmoves": "Adaugă paginile și fișierele pe care le redenumesc la lista mea de urmărire",
        "jumptonavigation": "navigare",
        "jumptosearch": "căutare",
        "view-pool-error": "Ne pare rău, dar serverele sunt supraîncărcare în acest moment.\nPrea mulți utilizatori încearcă să vizualizeze această pagină.\nVă rugăm să așteptați un moment înainte de a reîncerca accesarea paginii.\n\n$1",
+       "generic-pool-error": "Ne pare rău, dar serverele sunt supraîncărcate în acest moment.\nPrea mulți utilizatori încearcă să vizualizeze această resursă.\nVă rugăm să așteptați un moment înainte de a reîncerca accesarea acestei resurse.",
        "pool-timeout": "Timpul alocat așteptării pentru blocare a expirat",
        "pool-queuefull": "Coada de așteptare este plină",
        "pool-errorunknown": "Eroare necunoscută",
+       "pool-servererror": "Serviciul de contorizare a rezervei nu este disponibil ($1).",
        "aboutsite": "Despre {{SITENAME}}",
        "aboutpage": "Project:Despre",
        "copyright": "Conținutul este disponibil sub $1, exceptând cazurile în care se specifică altfel.",
        "readonly_lag": "Baza de date a fost închisă automatic în timp ce serverele secundare ale bazei de date îl urmează pe cel principal.",
        "internalerror": "Eroare internă",
        "internalerror_info": "Eroare internă: $1",
-       "fileappenderrorread": "Citirea fișierului „$1” nu a putut fi executată în timpul adăugării.",
-       "fileappenderror": "Nu se poate adăuga \"$1\" în \"$2\".",
        "filecopyerror": "Fișierul \"$1\" nu a putut fi copiat la \"$2\".",
        "filerenameerror": "Fișierul \"$1\" nu a putut fi mutat la \"$2\".",
        "filedeleteerror": "Fișierul \"$1\" nu a putut fi șters.",
        "directorycreateerror": "Nu se poate crea directorul \"$1\".",
        "filenotfound": "Fișierul „$1” nu a putut fi găsit.",
-       "fileexistserror": "Imposibil de scris fișierul „$1”: fișierul există deja.",
        "unexpected": "Valoare neașteptată: „$1”=„$2”.",
        "formerror": "Eroare: datele nu au putut fi trimise",
        "badarticleerror": "Această acțiune nu poate fi efectuată pe această pagină.",
        "userlogin-helplink2": "Ajutor la autentificare",
        "userlogin-loggedin": "Sunteți deja {{GENDER:$1|autentificat|autentificată}} ca {{GENDER:$1|$1}}.\nUtilizați formularul de mai jos pentru a vă autentifica cu alt nume de utilizator.",
        "userlogin-createanother": "Creează un alt cont",
-       "createacct-join": "Introduceți-vă informațiile mai jos.",
-       "createacct-another-join": "Introduceți, mai jos, informațiile noului cont.",
        "createacct-emailrequired": "Adresă de e-mail",
        "createacct-emailoptional": "Adresă de e-mail (opțională)",
        "createacct-email-ph": "Introduceți adresa dumnevoastră de e-mail",
        "savearticle": "Salvare pagină",
        "preview": "Previzualizare",
        "showpreview": "Previzualizare",
-       "showlivepreview": "Previzualizare live",
        "showdiff": "Afișare diferențe",
        "anoneditwarning": "'''Atenție:''' Nu v-ați autentificat. Adresa IP vă va fi înregistrată în istoricul acestei pagini.",
        "anonpreviewwarning": "''Nu v-ați autentificat. Dacă salvați pagina adresa dumneavoastră IP va fi înregistrată în istoric.''",
        "edit-gone-missing": "Pagina nu s-a putut actualiza.\nSe pare că a fost ștearsă.",
        "edit-conflict": "Conflict de modificare.",
        "edit-no-change": "Modificarea dvs. a fost ignorată deoarece nu s-a efectuat nicio schimbare.",
-       "postedit-confirmation": "Modificarea dumneavoastră a fost salvată.",
+       "postedit-confirmation-created": "Pagina a fost creată.",
+       "postedit-confirmation-restored": "Pagina a fost restaurată.",
+       "postedit-confirmation-saved": "Modificarea dumneavoastră a fost salvată.",
        "edit-already-exists": "Pagina nouă nu a putut fi creată.\nEa există deja.",
        "defaultmessagetext": "Textul implicit",
        "content-failed-to-parse": "Nu s-a putut analiza conținutul de tip $2 pentru modelul $1: $3",
        "parser-template-recursion-depth-warning": "Limită de adâncime a recursiei depășită ($1)",
        "language-converter-depth-warning": "Limita adâncimii convertorului de limbă a fost depășită ($1)",
        "node-count-exceeded-category": "Pagini unde numărul de noduri este depășit",
+       "node-count-exceeded-category-desc": "O categorie pentru paginile în care numărul de noduri este depășit.",
        "node-count-exceeded-warning": "Pagina a depășit numărul de noduri",
        "expansion-depth-exceeded-category": "Pagini unde profunzimea de expansiune este depășită",
+       "expansion-depth-exceeded-category-desc": "Aceasta este o categorie pentru paginile în care a fost depășită profunzimea de expansiune.",
        "expansion-depth-exceeded-warning": "Pagina depășește profunzimea de expansiune",
        "parser-unstrip-loop-warning": "Buclă nedetașabilă detectată",
        "parser-unstrip-recursion-limit": "Limita de recursivitate nedetașabilă depășită ($1)",
        "search-result-size": "$1 ({{PLURAL:$2|1 cuvânt|$2 cuvinte}})",
        "search-result-category-size": "$1 {{PLURAL:$1|element|elemente}} ($2 {{PLURAL:$2|categorie|categorii}}, $3 {{PLURAL:$3|fișier|fișiere}})",
        "search-result-score": "Relevanță: $1%",
-       "search-redirect": "(redirecționare către $1)",
+       "search-redirect": "(redirecționare de la $1)",
        "search-section": "(secțiunea $1)",
        "search-file-match": "(se regăsește în conținutul fișierului)",
        "search-suggest": "V-ați referit la: $1",
        "search-nonefound": "Nu sunt rezultate conforme interogării.",
        "powersearch-legend": "Căutare avansată",
        "powersearch-ns": "Căutare în spațiile de nume:",
-       "powersearch-redir": "Afișează redirecționările",
        "powersearch-togglelabel": "Selectare:",
        "powersearch-toggleall": "Tot",
        "powersearch-togglenone": "Nimic",
        "prefs-watchlist": "Listă de urmărire",
        "prefs-watchlist-days": "Numărul de zile care apar în lista paginilor urmărite:",
        "prefs-watchlist-days-max": "Maxim $1 {{PLURAL:$1|zi|zile}}",
-       "prefs-watchlist-edits": "Numărul de editări care apar în lista extinsă a paginilor urmărite:",
+       "prefs-watchlist-edits": "Numărul de modificări care apar în lista extinsă a paginilor urmărite:",
        "prefs-watchlist-edits-max": "Număr maxim: 1000",
        "prefs-watchlist-token": "Jeton pentru lista de pagini urmărite:",
        "prefs-misc": "Parametri diverși",
        "prefs-emailconfirm-label": "Confirmare e-mail:",
        "youremail": "Adresă de e-mail:",
        "username": "{{GENDER:$1|Nume de utilizator}}:",
-       "uid": "ID {{GENDER:$1|utilizator|utilizatoare}}:",
        "prefs-memberingroups": "{{GENDER:$2|Membru|Membră}} în {{PLURAL:$1|grupul|grupurile}}:",
        "prefs-registration": "Data înregistrării:",
        "yourrealname": "Nume real:",
        "prefs-advancedsearchoptions": "Opțiuni avansate",
        "prefs-advancedwatchlist": "Opțiuni avansate",
        "prefs-displayrc": "Opțiuni de afișare",
-       "prefs-displaysearchoptions": "Opțiuni de afișare",
        "prefs-displaywatchlist": "Opțiuni de afișare",
        "prefs-tokenwatchlist": "Jeton",
        "prefs-diffs": "Diferențe",
        "right-move": "Redenumește paginile",
        "right-move-subpages": "Redenumește paginile cu tot cu subpagini",
        "right-move-rootuserpages": "Redenumește pagina principală a unui utilizator",
+       "right-move-categorypages": "Redenumește paginile categoriilor",
        "right-movefile": "Redenumește fișiere",
        "right-suppressredirect": "Nu creează o redirecționare de la vechiul nume atunci când redenumește o pagină",
        "right-upload": "Încarcă fișiere",
        "action-createpage": "creați pagini",
        "action-createtalk": "creați pagini de discuție",
        "action-createaccount": "creați acest cont de utilizator",
+       "action-history": "vizualizați istoricul acestei pagini",
        "action-minoredit": "marcați această modificare ca minoră",
        "action-move": "redenumiți această pagină",
        "action-move-subpages": "redenumiți această pagină și subpaginile sale",
        "action-move-rootuserpages": "redenumiți pagina principală a unui utilizator",
+       "action-move-categorypages": "redenumiți paginile categoriilor",
        "action-movefile": "redenumiți acest fișier",
        "action-upload": "încărcați acest fișier",
        "action-reupload": "suprascrieți fișierul existent",
        "recentchanges-legend-newpage": "(vedeți și [[Special:NewPages|lista cu pagini noi]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Dedesubt sunt modificările începând cu <b>$2</b> (maximum <b>$1</b> afișate).",
-       "rclistfrom": "Se afișează modificările începând cu $1",
+       "rclistfrom": "Se afișează modificările începând cu $3, $2",
        "rcshowhideminor": "$1 modificările minore",
        "rcshowhideminor-show": "Arată",
        "rcshowhideminor-hide": "Ascunde",
        "uploadstash-refresh": "Reîmprospătează lista de fișiere",
        "invalid-chunk-offset": "Decalaj de segment nevalid",
        "img-auth-accessdenied": "Acces interzis",
-       "img-auth-nopathinfo": "PATH_INFO lipsește.\nServerul dumneavoastră nu a fost setat pentru a trece aceste informații.\nS-ar putea să fie bazat pe CGI și să nu suporte img_auth.\nVedeți https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "PATH_INFO lipsește.\nServerul dumneavoastră nu a fost setat pentru a trece aceste informații.\nS-ar putea să fie bazat pe CGI și să nu suporte img_auth.\nVedeți https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Adresa cerută nu este în directorul pentru încărcări configurat.",
        "img-auth-badtitle": "Nu s-a putut construi un titlu valid din \"$1\".",
        "img-auth-nologinnWL": "Nu sunteți autentificat și \"$1\" nu este pe lista albă.",
        "pageswithprop-prophidden-binary": "valoarea proprietății binare ascunsă ($1)",
        "doubleredirects": "Redirecționări duble",
        "doubleredirectstext": "Această listă conține pagini care redirecționează la alte pagini de redirecționare.\nFiecare rând conține legături la primele două redirecționări, precum și ținta celei de-a doua redirecționări, care este de obicei pagina țintă \"reală\", către care ar trebui să redirecționeze prima pagină.\nIntrările <del>tăiate</del> au fost rezolvate.",
-       "double-redirect-fixed-move": "[[$1]] a fost mutat, acum este un redirect către [[$2]]",
-       "double-redirect-fixed-maintenance": "Reparat dubla redirecționare de la [[$1]] înspre [[$2]].",
+       "double-redirect-fixed-move": "[[$1]] a fost redenumită.\nA fost actualizată automat, iar acum redirecționează către [[$2]].",
+       "double-redirect-fixed-maintenance": "Reparat în mod automat dubla redirecționare de la [[$1]] înspre [[$2]] în cadrul sarcinii de mentenanță.",
        "double-redirect-fixer": "Corector de redirecționări",
        "brokenredirects": "Redirecționări greșite",
        "brokenredirectstext": "Următoarele redirecționări conduc spre articole inexistente:",
        "log-title-wildcard": "Caută titluri care încep cu acest text",
        "showhideselectedlogentries": "Arată/ascunde intrările selectate din jurnal",
        "allpages": "Toate paginile",
-       "alphaindexline": "$1 către $2",
        "nextpage": "Pagina următoare ($1)",
        "prevpage": "Pagina anterioară ($1)",
        "allpagesfrom": "Afișează paginile pornind de la:",
        "listgrouprights-namespaceprotection-namespace": "Spațiu de nume",
        "listgrouprights-namespaceprotection-restrictedto": "Drept(uri) care permit(e) utilizatorului modificări",
        "trackingcategories": "Categorii de urmărire",
-       "trackingcategories-summary": "Această pagină conține categorii de urmărire care sunt populate în mod automat de către software-ul MediaWiki. Numele acestora se pot schimba modificând mesajele de sistem relevante din spațiul de nume {{ns:8}}.",
+       "trackingcategories-summary": "Această pagină conține categorii de urmărire care sunt populate în mod automat de către software-ul MediaWiki. Numele acestora se poate schimba modificând mesajele de sistem relevante din spațiul de nume {{ns:8}}.",
        "trackingcategories-msg": "Categorie de urmărire",
        "trackingcategories-name": "Numele mesajului",
        "trackingcategories-desc": "Criteriile de includere în categorie",
        "noindex-category-desc": "Pagina conține cuvântul magic <code><nowiki>__NOINDEX__</nowiki></code> (aflându-se într-un spațiu de nume care permite acest marcaj) și, drept urmare, nu este indexată de roboți.",
        "index-category-desc": "Pagina conține cuvântul magic <code><nowiki>__INDEX__</nowiki></code> (aflându-se într-un spațiu de nume care permite acest marcaj) și, ca urmare, este indexată de roboți, deși în mod normal acest lucru nu s-ar fi întâmplat.",
        "post-expand-template-inclusion-category-desc": "După extinderea tuturor formatelor, dimensiunea paginii a depășit <code>$wgMaxArticleSize</code>, astfel că anumite formate nu au fost extinse.",
-       "post-expand-template-argument-category-desc": "După extinderea argumentului unui format (ceva plasat între acolade triple, precum <code>{{{Foo}}})</code>, pagina a depășit <code>$wgMaxArticleSize</code>.",
+       "post-expand-template-argument-category-desc": "După extinderea argumentului unui format (ceva plasat între acolade triple, precum <code>{{{Foo}}}</code>), pagina a depășit <code>$wgMaxArticleSize</code>.",
+       "expensive-parserfunction-category-desc": "Prea multe funcții costisitoare de analiză (precum <code>#ifexist</code>) incluse într-o pagină. Vedeți [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
        "broken-file-category-desc": "Categorie adăugată dacă pagina conține o legătură întreruptă către un fișier (o legătură folosită pentru încorporarea unui fișier atunci când fișierul nu există).",
        "hidden-category-category-desc": "Această categorie conține <code><nowiki>__HIDDENCAT__</nowiki></code>, ceea ce împiedică în mod implicit afișarea ei în zona cu legături către categorii din cadrul paginilor.",
        "trackingcategories-nodesc": "Nicio descriere disponibilă.",
        "watchlistanontext": "Vă rugăm să vă $1 pentru a vizualiza sau edita elementele din lista dumneavoastră de pagini urmărite.",
        "watchnologin": "Nu sunteți autentificat",
        "addwatch": "Adăugă la lista de pagini urmărite",
-       "addedwatchtext": "Pagina „[[:$1]]” a fost adăugată la lista dumneavoastră de [[Special:Watchlist|pagini urmărite]].\nModificările viitoare efectuate asupra acestei pagini dar și asupra paginii de discuție asociată vor fi listate acolo.",
+       "addedwatchtext": "Pagina „[[:$1]]” a fost adăugată în lista dumneavoastră de [[Special:Watchlist|pagini urmărite]].\nModificările viitoare efectuate asupra acestei pagini dar și asupra paginii de discuție asociată vor fi listate acolo.",
+       "addedwatchtext-short": "Pagina „$1” a fost adăugată în lista dumneavoastră de pagini urmărite.",
        "removewatch": "Elimină din lista de pagini urmărite",
        "removedwatchtext": "Pagina „[[:$1]]” a fost eliminată din [[Special:Watchlist|lista de pagini urmărite]].",
+       "removedwatchtext-short": "Pagina „$1” a fost eliminată din lista de pagini urmărite.",
        "watch": "Urmărire",
        "watchthispage": "Urmărește pagina",
        "unwatch": "Nu mai urmări",
        "watchlist-details": "{{PLURAL:$1|O pagină|$1 pagini urmărite|$1 de pagini urmărite}}, fără a include separat paginile de discuție.",
        "wlheader-enotif": "Notificarea prin e-mail este activată.",
        "wlheader-showupdated": "Paginile care au fost modificate după ultima dumneavoastră vizită sunt afișate '''îngroșat'''.",
-       "watchmethod-recent": "căutarea schimbărilor recente pentru paginile urmărite",
-       "watchmethod-list": "căutarea paginilor urmărite pentru schimbări recente",
-       "watchlistcontains": "Lista de pagini urmărite conține $1 {{PLURAL:$1|element|elemente|de elemente}}.",
-       "iteminvalidname": "E o problemă cu elementul '$1', numele este invalid...",
        "wlnote2": "Mai jos se află schimbările din {{PLURAL:$1|ultima oră|ultimele <strong>$1</strong> ore|ultimele <strong>$1</strong> de ore}}, așa cum era situația la $2, $3.",
        "wlshowlast": "Arată ultimele $1 ore $2 zile $3",
        "watchlist-options": "Opțiuni listă de pagini urmărite",
        "enotif_lastvisited": "Vedeți $1 pentru toate modificările de la ultima dvs. vizită.",
        "enotif_lastdiff": "Apasă $1 pentru a vedea această schimbare.",
        "enotif_anon_editor": "utilizator anonim $1",
-       "enotif_body": "Domnule/Doamnă $WATCHINGUSERNAME,\n$PAGEINTRO $NEWPAGE\n\nDescrierea lăsată de utilizator: $PAGESUMMARY $PAGEMINOREDIT\n\nPuteți contacta utilizatorul:\ne-mail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nNu veți mai primi notificări în cazul unei viitoare activități până când nu veți vizitați pagina ca utilizator autentificat. Puteți de asemenea reseta notificările pentru toate pagini pe care le urmăriți.\n\nAl dumneavoastră amic, sistemul de notificare de la {{SITENAME}}\n\n--\nPentru a modifica setările notificării prin e-mail, vizitați\n{{canonicalurl:{{#special:Preferences}}}}\n\nPentru a modifica setările listei de pagini urmărite, vizitați\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPentru a nu mai urmări pagina, vizitați\n$UNWATCHURL\n\nAsistență și suport:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Domnule/Doamnă $WATCHINGUSERNAME,\n$PAGEINTRO $NEWPAGE\n\nDescrierea lăsată de utilizator: $PAGESUMMARY $PAGEMINOREDIT\n\nPuteți contacta utilizatorul:\ne-mail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nNu veți mai primi notificări în cazul unei viitoare activități până când nu veți vizitați pagina ca utilizator autentificat. Puteți de asemenea reseta notificările pentru toate pagini pe care le urmăriți.\n\nAl dumneavoastră amic, sistemul de notificare de la {{SITENAME}}\n\n--\nPentru a modifica setările notificării prin e-mail, vizitați\n{{canonicalurl:{{#special:Preferences}}}}\n\nPentru a modifica setările listei de pagini urmărite, vizitați\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPentru a nu mai urmări pagina, vizitați\n$UNWATCHURL\n\nAsistență și suport:\n$HELPPAGE",
        "created": "creată",
        "changed": "modificată",
        "deletepage": "Șterge pagina",
        "blockip": "Blocare utilizator",
        "blockip-legend": "Blocare utilizator/adresă IP",
        "blockiptext": "Pentru a bloca un utilizator completați rubricile de mai jos.<br />\n'''Respectați [[{{MediaWiki:Policy-url}}|politica de blocare]].'''<br />\nPrecizați motivul blocării; de exemplu indicați paginile vandalizate de acest utilizator.",
-       "ipadressorusername": "Adresă IP sau nume de utilizator",
+       "ipaddressorusername": "Adresă IP sau nume de utilizator",
        "ipbexpiry": "Expiră",
        "ipbreason": "Motiv:",
        "ipbreason-dropdown": "*Motivele cele mai frecvente\n** Introducere de informații false\n** Ștergere conținut fără explicații\n** Introducere de legături externe de publicitate (spam)\n** Creare pagini fără sens\n** Tentative de intimidare\n** Abuz utilizare conturi multiple\n** Nume de utilizator inacceptabil",
        "movepagetalktext": "Pagina de discuții asociată, dacă există, va fi redenumită\nautomat odată cu aceasta în '''afara următoarelor cazuri''':\n* există deja o pagină de discuții cu conținut (care nu este goală) sub noul nume, sau\n* nu bifați căsuța de mai jos.\n\nÎn oricare din cazurile de mai sus va trebui să redenumiți sau să unificați\nmanual paginile de discuții, dacă doriți acest lucru.",
        "movearticle": "Pagina de redenumit:",
        "moveuserpage-warning": "'''Atenție''': sunteți pe cale să redenumiți o pagină de utilizator. Vă rugăm să rețineți că singura redenumită va fi pagina, nu și utilizatorul.",
+       "movecategorypage-warning": "<strong>Atenție:</strong> Sunteți pe cale să redenumiți pagina unei categorii. Rețineți că doar pagina va fi redenumită, iar orice alte pagini conținute în vechea categorie <em>nu</em> vor fi transferate în cea nouă.",
        "movenologintext": "Trebuie să fiți un utilizator înregistrat și [[Special:UserLogin|autentificat]] pentru a redenumi o pagină.",
        "movenotallowed": "Nu aveți permisiunea de a redenumi pagini.",
        "movenotallowedfile": "Nu aveți permisiunea de a redenumi fișiere.",
        "cant-move-user-page": "Nu aveți permisiunea de a redenumi pagini de utilizator (cu excepția subpaginilor).",
        "cant-move-to-user-page": "Nu aveți permisiunea de a redenumi o pagină într-o pagină de utilizator (cu excepția subpaginii utilizatorului).",
+       "cant-move-category-page": "Nu aveți permisiunea de a redenumi paginile categoriilor.",
+       "cant-move-to-category-page": "Nu aveți permisiunea de a redenumi o pagină într-o pagină a unei categorii.",
        "newtitle": "Titlul nou",
        "move-watch": "Urmărește această pagină",
        "movepagebtn": "Redenumește pagina",
        "tooltip-pt-watchlist": "Lista paginilor pe care le monitorizați",
        "tooltip-pt-mycontris": "Listă de contribuții",
        "tooltip-pt-login": "Sunteți încurajat să vă autentificați, deși acest lucru nu este obligatoriu.",
-       "tooltip-pt-logout": "Închideți sesiunea de lucru",
+       "tooltip-pt-logout": "Închide sesiunea de lucru",
        "tooltip-ca-talk": "Discuții despre această pagină",
        "tooltip-ca-edit": "Puteți modifica această pagină. Înainte de a o salva vă rugăm s-o previzualizați.",
        "tooltip-ca-addsection": "Adaugă o nouă secțiune.",
        "modern.css": "/* CSS plasate aici vor afecta utilizatorii stilului Modern */",
        "vector.css": "/* CSS plasate aici vor afecta utilizatorii stilului Vector */",
        "print.css": "/* CSS plasate aici vor afecta modul în care paginile vor fi imprimate */",
-       "notacceptable": "Serverul wiki nu poate oferi date într-un format pe care clientul tău să-l poată citi.",
        "anonymous": "{{PLURAL:$1|Utilizator anonim|Utilizatori anonimi}} ai {{SITENAME}}",
        "siteuser": "Utilizator {{SITENAME}} $1",
        "anonuser": "utlizator anonim $1 al {{SITENAME}}",
        "newimages-summary": "Această pagină specială arată ultimele fișiere încărcate.",
        "newimages-legend": "Filtru",
        "newimages-label": "Numele fișierului (sau parte din el):",
-       "showhidebots": "($1 roboți)",
+       "newimages-showbots": "Arată încărcările roboților",
        "noimages": "Nimic de văzut.",
        "ilsubmit": "Caută",
        "bydate": "după dată",
        "autosumm-replace": "Pagină înlocuită cu „$1”",
        "autoredircomment": "Redirecționat înspre [[$1]]",
        "autosumm-new": "Pagină nouă: $1",
-       "livepreview-loading": "Încărcare…",
-       "livepreview-ready": "Încărcare… Gata!",
-       "livepreview-failed": "Previzualizarea directă a eșuat! Încearcă previzualizarea normală.",
-       "livepreview-error": "Conectarea a eșuat: $1 „$2”.\nÎncearcă previzualizarea normală.",
        "lag-warn-normal": "Modificările mai noi de $1 {{PLURAL:$1|secondă|seconde}} pot să nu apară în listă.",
        "lag-warn-high": "Serverul bazei de date este suprasolicitat, astfel încît modificările făcute în ultimele $1 {{PLURAL:$1|secundă|secunde}} pot să nu apară în listă.",
-       "watchlistedit-numitems": "Lista ta de pagini urmărite conține {{PLURAL:$1|1 titlu|$1 titluri}}, excluzând paginile de discuții.",
-       "watchlistedit-noitems": "Lista de pagini urmărite este goală.",
        "watchlistedit-normal-title": "Modificare listă pagini urmărite",
        "watchlistedit-normal-legend": "Ștergere titluri din lista de urmărire",
        "watchlistedit-normal-explain": "Lista de mai jos cuprinde paginile pe care le urmăriți.\nPentru a elimina un titlu, bifați-l și apăsați „{{int:Watchlistedit-normal-submit}}”.\nPuteți modifica și direct [[Special:EditWatchlist/raw|lista brută]].",
        "watchlistedit-raw-done": "Lista paginilor urmărite a fost actualizată.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 titlu a fost adăugat|$1 titluri au fost adăugate}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 titlu a fost șters|$1 titluri au fost șterse}}:",
+       "watchlistedit-clear-title": "Listă de pagini urmărite golită",
+       "watchlistedit-clear-legend": "Golire listă de pagini urmărite",
+       "watchlistedit-clear-explain": "Toate titlurile vor fi înlăturate din lista dumnevoastră de pagini urmărite",
+       "watchlistedit-clear-titles": "Titluri:",
+       "watchlistedit-clear-submit": "Golește lista de pagini urmărite (ireversibil!)",
+       "watchlistedit-clear-done": "Lista dumnevoastră de pagini urmărite a fost golită.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|1 titlu a|$1 titlu au|$1 de titluri au}} fost înlăturat{{PLURAL:$1||e|e}}:",
+       "watchlistedit-too-many": "Sunt prea multe pagini care trebuie afișate aici.",
+       "watchlisttools-clear": "Golește lista de pagini urmărite",
        "watchlisttools-view": "Vizualizează schimbările relevante",
        "watchlisttools-edit": "Vezi și modifică lista paginilor urmărite",
        "watchlisttools-raw": "Modifică lista brută a paginilor urmărite",
        "compare-invalid-title": "Titlul specificat nu este corect.",
        "compare-title-not-exists": "Titlul specificat nu există.",
        "compare-revision-not-exists": "Versiunea specificată nu există.",
-       "dberr-header": "Acest site are o problemă",
        "dberr-problems": "Ne cerem scuze! Acest site întâmpină dificultăți tehnice.",
        "dberr-again": "Așteptați câteva minute și încercați din nou.",
        "dberr-info": "(Nu se poate contacta serverul bazei de date: $1)",
        "htmlform-no": "Nu",
        "htmlform-yes": "Da",
        "htmlform-chosen-placeholder": "Alegeți o opțiune",
+       "htmlform-cloner-create": "Adăugă mai mult",
+       "htmlform-cloner-delete": "Elimină",
+       "htmlform-cloner-required": "Este necesară cel puțin o valoare.",
        "sqlite-has-fts": "$1 cu suport de căutare în tot textul",
        "sqlite-no-fts": "$1 fără suport de căutare în tot textul",
        "logentry-delete-delete": "$1 {{GENDER:$2|a șters}} pagina $3",
index e9d5c78..dca8ad2 100644 (file)
@@ -4,7 +4,8 @@
                        "Joetaras",
                        "Kaganer",
                        "McDutchie",
-                       "Reder"
+                       "Reder",
+                       "아라"
                ]
        },
        "tog-underline": "Collegaminde sottolinèate:",
@@ -17,7 +18,6 @@
        "tog-showtoolbar": "Fà vedè 'a barra de le cangiaminde",
        "tog-editondblclick": "Cange le pàggene cu 'nu doppie clic",
        "tog-editsectiononrightclick": "Abbilite le cangiaminde d'a sezione ausanne 'u pulsande destre d'u sciorge cazzanne sus a 'u titole",
-       "tog-rememberpassword": "Arrecuèrdete 'u nome mije sus a stu browser (pe 'nu massime de $1 {{PLURAL:$1|sciurne}})",
        "tog-watchcreations": "Mitte le pàggene ca je agghie ccrejate jndr'à le pàggene condrollate",
        "tog-watchdefault": "Mitte le pàggene ca je agghie cangiate jndr'à le pàggene condrollate",
        "tog-watchmoves": "Mitte le pàggene ca je agghie spustate jndr'à le pàggene condrollate",
        "readonly_lag": "'U database ha state automaticamende blocchete purcè le server de le database ca depennene da 'u master onne sciute in eccezzione",
        "internalerror": "Errore inderne",
        "internalerror_info": "Errore inderne: $1",
-       "fileappenderrorread": "Non ge se pò leggere \"$1\" mendre ca appende.",
-       "fileappenderror": "Non ge se pò 'nzeccà \"$1\" a \"$2\".",
        "filecopyerror": "Non ge pozze cupià 'u fail \"$1\" jndr'à \"$2\".",
        "filerenameerror": "Non ge pozze cangià 'u nome d'u fail \"$1\" jndr'à \"$2\".",
        "filedeleteerror": "Non ge pozze scangillà 'u fail \"$1\".",
        "directorycreateerror": "Non ge pozze ccrejà 'a cartelle \"$1\".",
        "filenotfound": "Non ge stoche a iacchje 'u fail \"$1\".",
-       "fileexistserror": "Non ge pozze scrivere sus a 'u file \"$1\": 'u file esiste già",
        "unexpected": "Valore inattese: \"$1\"=\"$2\".",
        "formerror": "Errore: non ge riesche a reggistrà 'u form",
        "badarticleerror": "Quest'azione non ge pò essere fatte sus 'a sta pàgene.",
        "userlogin-resetpassword-link": "T'è scurdate 'a passuord toje?",
        "userlogin-loggedin": "Tu ste jndre ggià cumme a {{GENDER:$1|$1}}.\nAuse 'u module aqquà sotte pe trasè cumme a 'n'otre utende.",
        "userlogin-createanother": "Ccreje 'n'otre cunde",
-       "createacct-join": "Mitte le 'mbormaziune tune aqquà sotte.",
-       "createacct-another-join": "Mitte le 'mbormaziune d'u cunde nuève aqquà sotte.",
        "createacct-emailrequired": "Indirizze email",
        "createacct-emailoptional": "Indirizze email (opzionale)",
        "createacct-email-ph": "Mitte l'indirizze email tune",
        "savearticle": "Registre 'a vôsce",
        "preview": "Andeprime",
        "showpreview": "Vide l'andeprime",
-       "showlivepreview": "Andeprime da 'u vive",
        "showdiff": "Fa vedè le cangiaminde",
        "anoneditwarning": "'''Attenziò:''' Tu non ge sinde colleghete..\nL'indirizze IP tue avène reggistrete jndr'à le cangiaminde de sta pàgene.",
        "anonpreviewwarning": "''Tu non ge sì collegate. Reggistranne le cangiaminde jndr'à sta pàgene iesse l'indirizze IP tune jndr'à storie.''",
        "edit-gone-missing": "Non ge puè cangià sta pàgene.\nPare proprie ca l'onne scangellete.",
        "edit-conflict": "conflitte de cangiaminde.",
        "edit-no-change": "'U cangiamende ca p fatte, avène scettate purcè 'u teste non g'à cangete manghe de 'na virgola.",
-       "postedit-confirmation": "'U cangiamende tune ha state reggistrate.",
+       "postedit-confirmation-saved": "'U cangiamende tune ha state reggistrate.",
        "edit-already-exists": "Non ge puè ccrejà 'na pàgene nove purcè esiste già!",
        "defaultmessagetext": "Messàgge de teste de base",
        "content-failed-to-parse": "L'analise d'u condenute $2 pu modelle $1 ha fallite: $3",
        "search-nonefound": "Non ge stonne resultete ca soddisfecene l'inderrogazione.",
        "powersearch-legend": "Ricerche avanzete",
        "powersearch-ns": "Cirche jndr'à le namespace:",
-       "powersearch-redir": "Liste de le ridirezionaminde",
        "powersearch-togglelabel": "Verifiche:",
        "powersearch-toggleall": "Tutte",
        "powersearch-togglenone": "Ninde",
        "prefs-advancedsearchoptions": "Opzione avanzate",
        "prefs-advancedwatchlist": "Opzione avanzate",
        "prefs-displayrc": "Fà vedè l'opzione",
-       "prefs-displaysearchoptions": "Fà vedè l'opzione",
        "prefs-displaywatchlist": "Fà vedè l'opzione",
        "prefs-tokenwatchlist": "Gettone",
        "prefs-diffs": "Diff",
        "recentchanges-legend-heading": "'''Leggende:'''",
        "recentchanges-legend-newpage": "('ndruche pure [[Special:NewPages|elenghe de le pàggene nuève]])",
        "rcnotefrom": "Sotte stonne le cangiaminde da '''$2''' ('nzigne a '''$1''' fatte vedè).",
-       "rclistfrom": "Fà vedè le urteme cangiaminde partenne da $1",
+       "rclistfrom": "Fà vedè le urteme cangiaminde partenne da $3 $2",
        "rcshowhideminor": "$1 cangiaminde stuèdeche",
        "rcshowhidebots": "$1 bot",
        "rcshowhideliu": "$1 utinde reggistrate",
        "uploadstash-refresh": "Aggiorne l'elenghe de le file",
        "invalid-chunk-offset": "distanze d'u chunk invalide",
        "img-auth-accessdenied": "Accesse negate",
-       "img-auth-nopathinfo": "No se iacchie PATH_INFO.\n'U server tune non g'è 'mbostate o non ge passe sta 'mbormazione.\nPò essere ca jè basate sus a 'u CGI e non ge pò supportà img_auth.\nVide https://www.mediawiki.org/wiki/Manual:Image_Authorization",
+       "img-auth-nopathinfo": "No se iacchie PATH_INFO.\n'U server tune non g'è 'mbostate o non ge passe sta 'mbormazione.\nPò essere ca jè basate sus a 'u CGI e non ge pò supportà img_auth.\nVide https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization",
        "img-auth-notindir": "'U percorse richieste non ge stè jndr'à cartelle de carecamende configurate",
        "img-auth-badtitle": "Non ge se pò costruì 'nu titele valide da \"$1\".",
        "img-auth-nologinnWL": "Tu non ge sì collegate e \"$1\" non ge stè jndr'à lista vianghe.",
        "watchlist-details": "{{PLURAL:$1|$1 pàgene|$1 pàggene}} jndr'à liste de le pàggene condrollete, scartanne le pàggene de le 'ngazzaminde.",
        "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'''",
-       "watchmethod-recent": "verifiche de le cangiaminde recende pe le pàggene condrollete",
-       "watchmethod-list": "stoche a condrolle le pàggene condrollete pe le urteme cangiaminde",
-       "watchlistcontains": "'A liste de le pàggene condrollete toje condene $1 {{PLURAL:$1|pàgene|pàggene}}.",
-       "iteminvalidname": "Probbleme cu 'a vosce '$1', nome invalide...",
        "wlshowlast": "Vide l'urteme $1 ore $2 sciurne $3",
        "watchlist-options": "Opzione d'a liste de le pàggene condrollete",
        "watching": "Fà vedè...",
        "enotif_lastvisited": "Vide $1 pe tutte le cangiaminde da l'urtema visita toje.",
        "enotif_lastdiff": "Vide $1 pe vedè stu cangiamende.",
        "enotif_anon_editor": "Utende anonime $1",
-       "enotif_body": "Care $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nRiepileghe de le cangiaminde: $PAGESUMMARY $PAGEMINOREDIT\n\nCondatte 'u cangiatore:\nmail: $PAGEEDITOR_EMAIL\nuicchi: $PAGEEDITOR_WIKI\n\nNon ge stonne otre notifiche ce tu face otre attivitate senze ca tu visite sta pàgene.\nTu puè pure azzerà 'a spunde de le notifiche pe tutte le pàggene condrollate jndr'à l'elenghe tune.\n\nStatte Bbuene, 'u sisteme de notificaziune de {{SITENAME}}\n\n--\nPe cangià le 'mbostaziune de notifeche de l'email toje, vè vide\n{{canonicalurl:{{#special:Preferences}}}}\n\nPe cangià le 'mbostaziune de l'elenghe de le pàggene condrollate tune, vè vide\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPe scangellà 'a pàgene da l'elenghe de le pàggene condrollate, vè vide\n$UNWATCHURL\n\nSegnalaziune e otre assistenze:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Care $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nRiepileghe de le cangiaminde: $PAGESUMMARY $PAGEMINOREDIT\n\nCondatte 'u cangiatore:\nmail: $PAGEEDITOR_EMAIL\nuicchi: $PAGEEDITOR_WIKI\n\nNon ge stonne otre notifiche ce tu face otre attivitate senze ca tu visite sta pàgene.\nTu puè pure azzerà 'a spunde de le notifiche pe tutte le pàggene condrollate jndr'à l'elenghe tune.\n\nStatte Bbuene, 'u sisteme de notificaziune de {{SITENAME}}\n\n--\nPe cangià le 'mbostaziune de notifeche de l'email toje, vè vide\n{{canonicalurl:{{#special:Preferences}}}}\n\nPe cangià le 'mbostaziune de l'elenghe de le pàggene condrollate tune, vè vide\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPe scangellà 'a pàgene da l'elenghe de le pàggene condrollate, vè vide\n$UNWATCHURL\n\nSegnalaziune e otre assistenze:\n$HELPPAGE",
        "created": "ccrejete",
        "changed": "cangete",
        "deletepage": "Scangille 'a pàgene",
        "blockip": "Blocche l'utende",
        "blockip-legend": "Bluecche l'utende",
        "blockiptext": "Ause 'a schermata de sotte pe bloccà l'accesse in scritture de 'nu specifiche indirizze IP o utende.\nQuiste avessa essere fatte sulamende pe prevenìe 'u vandalisme e in accorde cu [[{{MediaWiki:Policy-url}}|le reghele]].\nMitte pure 'nu mutive specifiche aqquà sotte (pe esembije, nnomene 'a pàgene addò è acchiate 'u vandalisme).",
-       "ipadressorusername": "Indirizze IP o nome de l'utende:",
+       "ipaddressorusername": "Indirizze IP o nome de l'utende:",
        "ipbexpiry": "More:",
        "ipbreason": "Mutive:",
        "ipbreason-dropdown": "*Mutive comune de blocche\n** Inzerimende de 'mbormaziune fause\n** Scangellamende de condenute da le vôsce\n** Collegaminde pubblecetarie a site fore de Uicchipèdie\n** Inzerimende de studecarie jndr'à le vôsce\n** Menacce e intimidaziune\n** Abbuse de cunde utende multiple\n** Nome de l'utende inaccettabbele",
        "group-bot.js": "/* Ogne JavaScript aqquà avène carecate pe le bot */",
        "group-sysop.js": "/* Ogne JavaScript aqquà avène carecate pe le utinde amministrature */",
        "group-bureaucrat.js": "/* Ogne JavaScript aqquà avène carecate pe le utinde burocrate */",
-       "notacceptable": "'U server Uicchi non ge pò vedè le date jndr'à 'u formate ca 'u cliende tue pò leggere.",
        "anonymous": "{{PLURAL:$1|utende|utinde}} anonime de {{SITENAME}}",
        "siteuser": "Utende de {{SITENAME}} $1",
        "anonuser": "Utende anonime de {{SITENAME}} $1",
        "newimages-summary": "Sta pàgena speciale face vedè l'urteme file carecate.",
        "newimages-legend": "Filtre",
        "newimages-label": "Nome d'u fail (o 'nu stuezze de jidde):",
-       "showhidebots": "($1 bot)",
        "noimages": "Non ge stè ninde da vedè.",
        "ilsubmit": "Cirche",
        "bydate": "pe date",
        "bitrate-exabits": "$1Ebps",
        "bitrate-zetabits": "$1Zbps",
        "bitrate-yottabits": "$1Ybps",
-       "livepreview-loading": "Stoche a careche…",
-       "livepreview-ready": "Stoche a careche… Agghje fenìte!",
-       "livepreview-failed": "L'andeprima live ha fallite! Pruève cu quedda normale.",
-       "livepreview-error": "Non ge tè riuscite a connettere: $1 \"$2\".\nPrueve l'andeprima normele.",
        "lag-warn-normal": "Le cangiaminde cchiù nuève de $1 {{PLURAL:$1|seconde|seconde}} pò essere ca non ge se vedene jndr'à sta liste.",
        "lag-warn-high": "Pe colpe d'u timbe de lag ierte d'u server de database, le cangiaminde cchiù nuève de $1 {{PLURAL:$1|seconde|seconde}} pò essere ca non ge se vedene jndr'à sta liste.",
-       "watchlistedit-numitems": "'A liste de le pàggene condrollate tène {{PLURAL:$1|1 titele|$1 titele}}, 'scudenne le pàggne de le 'ngazzaminde.",
-       "watchlistedit-noitems": "'A lista de le pàggene condrollete toja no tène 'na vosce.",
        "watchlistedit-normal-title": "Vide le pàggene condrollete",
        "watchlistedit-normal-legend": "Live le titele da 'a liste de le pàggene condrollete",
        "watchlistedit-normal-explain": "Le titele sus a 'a liste de le pàggene condrollate avènene fatte vedè aqquà sotte. <br />\nPe luà 'nu titele, smarche 'a sckatele affianghe a jidde e cazze \"{{int:Watchlistedit-normal-submit}}\".<br />\nTu puè pure [[Special:EditWatchlist/raw|cangià 'a liste a mane]].",
        "compare-invalid-title": "'U titele ca è specificate jè invalide.",
        "compare-title-not-exists": "'U titele ca è specificate non g'esiste.",
        "compare-revision-not-exists": "'A revisione ca è specificate non g'esiste.",
-       "dberr-header": "Sta Uicchi tène 'nu probbleme",
        "dberr-problems": "Simw spiacende! Stu site stè 'ngondre de le diffcoltà tecniche.",
        "dberr-again": "Aspitte quacche minute e pò recareche.",
        "dberr-info": "(Non ge riuscime a condattà 'u server d'u database: $1)",
index 05a8e8e..912777f 100644 (file)
                        "Александр Сигачёв",
                        "ОйЛ",
                        "Умар",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "Meshkov.a",
+                       "아라",
+                       "Eroha"
                ]
        },
        "tog-underline": "Подчёркивание ссылок:",
        "category-empty": "''Эта категория в данный момент пуста.''",
        "hidden-categories": "{{PLURAL:$1|1=Скрытая категория|Скрытые категории}}",
        "hidden-category-category": "Скрытые категории",
-       "category-subcat-count": "{{PLURAL:$2|Эта категория содержит только следующую подкатегорию.|Эта категория содержит $1 {{PLURAL:$1|подкатегорию|подкатегорий|подкатегории}} из $2 всего.}}",
+       "category-subcat-count": "{{PLURAL:$2|1=Эта категория содержит только следующую подкатегорию.|В этой категории отображается $1 {{PLURAL:$1|подкатегория|подкатегорий|подкатегории}} из имеющихся $2.}}",
        "category-subcat-count-limited": "В этой категории {{PLURAL:$1|$1 подкатегория|$1 подкатегорий|$1 подкатегории}}.",
        "category-article-count": "{{PLURAL:$2|1=Эта категория содержит единственную страницу.|{{PLURAL:$1|Показана $1 страница|Показано $1 страниц|Показаны $1 страницы}} из $2, {{PLURAL:$2|находящейся|находящихся}} в данной категории.}}",
        "category-article-count-limited": "В этой категории {{PLURAL:$1|$1 страница|$1 страниц|$1 страницы|1=только одна страница}}.",
        "jumptonavigation": "навигация",
        "jumptosearch": "поиск",
        "view-pool-error": "Извините, сейчас серверы перегружены.\nПоступило слишком много запросов на просмотр этой страницы.\nПожалуйста, подождите и повторите попытку обращения к странице позже.\n\n$1",
+       "generic-pool-error": "Извините, в настоящий момент серверы перегружены.\nСлишком много пользователей пытаются просмотреть этот ресурс.\nПожалуйста, подождите и повторите попытку обращения к нему позже.",
        "pool-timeout": "Истекло время ожидания блокировки",
        "pool-queuefull": "Накопитель запросов полон",
        "pool-errorunknown": "Неизвестная ошибка",
        "readonly_lag": "База данных автоматически заблокирована от изменений на время, пока вторичные сервера базы данных не синхронизируются с первичным.",
        "internalerror": "Внутренняя ошибка",
        "internalerror_info": "Внутренняя ошибка: $1",
-       "fileappenderrorread": "Не удалось прочитать «$1» во время дополнения.",
-       "fileappenderror": "Не удалось присоединить «$1» к «$2».",
        "filecopyerror": "Невозможно скопировать файл «$1» в «$2».",
        "filerenameerror": "Невозможно переименовать файл «$1» в «$2».",
        "filedeleteerror": "Невозможно удалить файл «$1».",
        "directorycreateerror": "Невозможно создать директорию «$1».",
        "filenotfound": "Невозможно найти файл «$1».",
-       "fileexistserror": "Невозможно записать в файл «$1»: файл существует.",
        "unexpected": "Неподходящее значение: «$1»=«$2».",
        "formerror": "Ошибка: невозможно передать данные формы",
        "badarticleerror": "Это действие не может быть выполнено на данной странице.",
        "userlogin-helplink2": "Помощь по входу",
        "userlogin-loggedin": "Вы уже вошли как {{GENDER:$1|$1}}.\nИспользуйте форму ниже, чтобы войти под другой учётной записью.",
        "userlogin-createanother": "Создать другую учётную запись",
-       "createacct-join": "Введите свои данные ниже.",
-       "createacct-another-join": "Введите данные новой учётной записи ниже.",
        "createacct-emailrequired": "Адрес электронной почты",
        "createacct-emailoptional": "Адрес электронной почты (необязательно)",
        "createacct-email-ph": "Введите свой адрес электронной почты",
        "savearticle": "Записать страницу",
        "preview": "Предпросмотр",
        "showpreview": "Предварительный просмотр",
-       "showlivepreview": "Быстрый предпросмотр",
        "showdiff": "Внесённые изменения",
        "anoneditwarning": "'''Внимание!''' Вы не авторизовались на сайте.\nВ истории изменений этой страницы будет записан ваш IP-адрес.",
        "anonpreviewwarning": "''Вы не представились системе. Сохранение приведёт к записи вашего IP-адреса в историю изменений страницы.''",
        "edit-gone-missing": "Невозможно обновить страницу.\nВероятно, она была удалена.",
        "edit-conflict": "Конфликт редактирования.",
        "edit-no-change": "Ваша правка была отклонена, так как в тексте не было сделано изменений.",
-       "postedit-confirmation": "Ваша правка сохранена.",
+       "postedit-confirmation-created": "Страница создана.",
+       "postedit-confirmation-restored": "Страница была восстановлена.",
+       "postedit-confirmation-saved": "Ваша правка сохранена.",
        "edit-already-exists": "Невозможно создать новую страницу.\nОна уже существует.",
        "defaultmessagetext": "Текст по умолчанию",
        "content-failed-to-parse": "Содержимое $2 не соответствует типу $1: $3.",
        "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)",
        "searchmenu-exists": "'''В этой вики есть страница «[[:$1]]»'''",
        "searchmenu-new": "<strong>Создать страницу «[[:$1]]» в этом вики-проекте!</strong>\n{{PLURAL:$2|0=|См. также страницу, найденную по результатами вашего поиска.|См. также найденные результаты поиска.}}",
        "searchprofile-articles": "Основные страницы",
-       "searchprofile-project": "Страницы справки и проекта",
        "searchprofile-images": "Мультимедиа",
        "searchprofile-everything": "Везде",
        "searchprofile-advanced": "Расширенный",
        "searchprofile-articles-tooltip": "Поиск в $1",
-       "searchprofile-project-tooltip": "Поиск в $1",
        "searchprofile-images-tooltip": "Поиск файлов",
        "searchprofile-everything-tooltip": "Поиск на всех страницах (включая страницы обсуждений)",
        "searchprofile-advanced-tooltip": "Искать в заданных пространствах имён",
        "search-nonefound": "Соответствий запросу не найдено.",
        "powersearch-legend": "Расширенный поиск",
        "powersearch-ns": "Поиск в пространствах имён:",
-       "powersearch-redir": "Выводить перенаправления",
        "powersearch-togglelabel": "Отметить:",
        "powersearch-toggleall": "Все",
        "powersearch-togglenone": "Ничего",
        "prefs-emailconfirm-label": "Подтверждение электронной почты:",
        "youremail": "Электронная почта:",
        "username": "{{GENDER:$1|Имя участника|Имя участницы}}:",
-       "uid": "Код {{GENDER:$1|участника|участницы}}:",
        "prefs-memberingroups": "{{GENDER:$2|Член|Член}} {{PLURAL:$1|1=группы|групп}}:",
        "prefs-registration": "Время регистрации:",
        "yourrealname": "Настоящее имя:",
        "prefs-dateformat": "Формат даты",
        "prefs-timeoffset": "Смещение поясного времени",
        "prefs-advancedediting": "Общие параметры",
-       "prefs-editor": "редактор",
-       "prefs-preview": "предварительный просмотр",
+       "prefs-editor": "Редактор",
+       "prefs-preview": "Ð\9fредварительный просмотр",
        "prefs-advancedrc": "Расширенные настройки",
        "prefs-advancedrendering": "Расширенные настройки",
        "prefs-advancedsearchoptions": "Расширенные настройки",
        "prefs-advancedwatchlist": "Расширенные настройки",
        "prefs-displayrc": "Настройки отображения",
-       "prefs-displaysearchoptions": "Настройки отображения",
        "prefs-displaywatchlist": "Настройки отображения",
        "prefs-tokenwatchlist": "Токен",
        "prefs-diffs": "Разница версий",
        "right-move": "переименование страниц",
        "right-move-subpages": "переименование страниц с их подстраницами",
        "right-move-rootuserpages": "переименование корневых страниц участников",
+       "right-move-categorypages": "Переименование страниц категорий",
        "right-movefile": "переименование файлов",
        "right-suppressredirect": "не создавать перенаправление со старого имени при переименовании страницы",
        "right-upload": "загрузка файлов",
        "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": "перезапись существующего файла",
        "recentchanges-legend-newpage": "(см. также [[Special:NewPages|список новых страниц]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Ниже перечислены изменения с <strong>$2</strong> (показано не более <strong>$1</strong>).",
-       "rclistfrom": "Показать изменения с $1.",
+       "rclistfrom": "Показать изменения с $3 $2.",
        "rcshowhideminor": "$1 малые правки",
        "rcshowhideminor-show": "Показать",
        "rcshowhideminor-hide": "Скрыть",
        "uploadstash-refresh": "Обновить список файлов",
        "invalid-chunk-offset": "Недопустимое смещение фрагмента",
        "img-auth-accessdenied": "Доступ запрещён",
-       "img-auth-nopathinfo": "Отсутствует <code>PATH_INFO</code>.\nВаш сервер не настроен для передачи этих сведений.\nВозможно, он работает на основе CGI и не поддерживает <code>img_auth</code>.\nСм. https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "Отсутствует <code>PATH_INFO</code>.\nВаш сервер не настроен для передачи этих сведений.\nВозможно, он работает на основе CGI и не поддерживает <code>img_auth</code>.\nСм. https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Запрашиваемый путь не относится к настроенной папке загрузок.",
        "img-auth-badtitle": "Невозможно построить правильный заголовок из «$1».",
        "img-auth-nologinnWL": "Вы не вошли в систему, а «$1» не входит в белый список.",
        "pageswithprop-prophidden-binary": "значение двоичного свойства скрыто ($1)",
        "doubleredirects": "Двойные перенаправления",
        "doubleredirectstext": "На этой странице представлен список перенаправлений на другие перенаправления.\nКаждая строка содержит ссылки на первое и второе перенаправления, а также целевую страницу второго перенаправления, в которой обычно указывается название страницы, куда должно ссылаться первое перенаправление.\n<del>Зачёркнутые</del> записи были исправлены.",
-       "double-redirect-fixed-move": "СÑ\82Ñ\80аниÑ\86а [[$1]] Ð±Ñ\8bла Ð¿ÐµÑ\80еименована, Ñ\81ейÑ\87аÑ\81 Ð¾Ð½Ð° Ð¿ÐµÑ\80енапÑ\80авлÑ\8fеÑ\82 Ð½Ð° [[$2]]",
-       "double-redirect-fixed-maintenance": "Ð\98Ñ\81пÑ\80авление Ð´Ð²Ð¾Ð¹Ð½Ð¾Ð³Ð¾ Ð¿ÐµÑ\80енапÑ\80авлениÑ\8f Ñ\81 [[$1]] Ð½Ð° [[$2]].",
+       "double-redirect-fixed-move": "СÑ\82Ñ\80аниÑ\86а [[$1]] Ð±Ñ\8bла Ð¿ÐµÑ\80емеÑ\89ена.\nÐ\9eна Ð°Ð²Ñ\82омаÑ\82иÑ\87еÑ\81ки Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð° Ð¸ Ñ\82епеÑ\80Ñ\8c Ð¾Ð½Ð° Ð¿ÐµÑ\80енапÑ\80авлÑ\8fеÑ\82 Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 [[$2]].",
+       "double-redirect-fixed-maintenance": "Ð\90вÑ\82омаÑ\82иÑ\87еÑ\81кое Ð¸Ñ\81пÑ\80авление Ð´Ð²Ð¾Ð¹Ð½Ð¾Ð³Ð¾ Ð¿ÐµÑ\80енапÑ\80авлениÑ\8f Ñ\81 [[$1]] Ð½Ð° [[$2]] Ð² Ñ\80абоÑ\82е Ð¿Ð¾ Ñ\82еÑ\85ниÑ\87еÑ\81комÑ\83 Ð¾Ð±Ñ\81лÑ\83живаниÑ\8e.",
        "double-redirect-fixer": "Исправитель перенаправлений",
        "brokenredirects": "Разорванные перенаправления",
        "brokenredirectstext": "Следующие перенаправления указывают на несуществующие страницы:",
        "log-title-wildcard": "Найти заголовки, начинающиеся с данных символов",
        "showhideselectedlogentries": "Показать/скрыть выбранные записи журнала",
        "allpages": "Все страницы",
-       "alphaindexline": "от $1 до $2",
        "nextpage": "Следующая страница ($1)",
        "prevpage": "Предыдущая страница ($1)",
        "allpagesfrom": "Вывести страницы, начинающиеся на:",
        "watchnologin": "Нужно представиться системе",
        "addwatch": "Добавить в список наблюдения",
        "addedwatchtext": "Страница «[[:$1]]» была добавлена в ваш [[Special:Watchlist|список наблюдения]].\nТам будут отмечаться последующие изменения этой страницы, а также связанной с ней страницы обсуждения.",
+       "addedwatchtext-short": "Страница «$1» была добавлена в ваш список наблюдения.",
        "removewatch": "Удалить из списка наблюдения",
        "removedwatchtext": "Страница «[[:$1]]» была удалена из вашего [[Special:Watchlist|списка наблюдения]].",
+       "removedwatchtext-short": "Страница «$1» была удалена из вашего списка наблюдения.",
        "watch": "Следить",
        "watchthispage": "Наблюдать за этой страницей",
        "unwatch": "Не следить",
        "watchlist-details": "В вашем списке наблюдения $1 {{PLURAL:$1|страница|страниц|страницы}}, не считая страниц обсуждений.",
        "wlheader-enotif": "Уведомления по эл. почте включены.",
        "wlheader-showupdated": "Страницы, изменившиеся с вашего последнего их посещения, выделены '''жирным''' шрифтом.",
-       "watchmethod-recent": "просмотр последних изменений для наблюдаемых страниц",
-       "watchmethod-list": "просмотр наблюдаемых страниц для последних изменений",
-       "watchlistcontains": "Ваш список наблюдения содержит $1 {{PLURAL:$1|страница|страниц|страницы}}.",
-       "iteminvalidname": "Проблема с элементом «$1», недопустимое название…",
        "wlnote2": "Ниже приведены изменения за {{PLURAL:$1|последний час|последние <strong>$1</strong> часов|последние <strong>$1</strong> часа}} на $2 $3.",
        "wlshowlast": "Показать за последние $1 часов $2 дней $3",
        "watchlist-options": "Настройки списка наблюдения",
        "enotif_lastvisited": "См. $1 для просмотра всех изменений, произошедших с вашего последнего посещения.",
        "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Система оповещения {{grammar:genitive|{{SITENAME}}}}\n\n--\nИзменение настройки уведомлений\n{{canonicalurl:{{#special:Preferences}}}}\n\nИзменение настройки вашего списка наблюдения\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nУдалить страницы из вашего списка наблюдения\n$UNWATCHURL\n\nОбратная связь и помощь\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Здравствуйте, $WATCHINGUSERNAME!\n\n$PAGEINTRO $NEWPAGE\n\nКраткое описание изменения: $PAGESUMMARY $PAGEMINOREDIT\n\nОбратиться к изменившему:\nэл. почта: $PAGEEDITOR_EMAIL\nвики: $PAGEEDITOR_WIKI\n\nЕсли вы не зайдёте на эту страницу под своей учётной записью, в случае её дальнейших изменений уведомлений больше не будет. Вы можете также отключить опцию уведомления для всех страниц в вашем списке наблюдения.\n\nСистема оповещения {{grammar:genitive|{{SITENAME}}}}\n\n--\nИзменение настройки уведомлений\n{{canonicalurl:{{#special:Preferences}}}}\n\nИзменение настройки вашего списка наблюдения\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nУдалить страницы из вашего списка наблюдения\n$UNWATCHURL\n\nОбратная связь и помощь\n$HELPPAGE",
        "created": "создана",
        "changed": "изменена",
        "deletepage": "Удалить страницу",
        "blockip": "Заблокировать",
        "blockip-legend": "Блокировка участника",
        "blockiptext": "Используйте форму ниже, чтобы заблокировать возможность записи с определённого IP-адреса.\nЭто может быть сделано только для предотвращения вандализма и только в соответствии с [[{{MediaWiki:Policy-url}}|правилами]].\nНиже укажите конкретную причину (к примеру, процитируйте некоторые страницы с признаками вандализма).",
-       "ipadressorusername": "IP-адрес или имя участника:",
+       "ipaddressorusername": "IP-адрес или имя участника:",
        "ipbexpiry": "Закончится через:",
        "ipbreason": "Причина:",
        "ipbreason-dropdown": "* Стандартные причины блокировок\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|представиться системе]],\nчтобы иметь возможность переименовать страницы.",
        "movenotallowed": "У вас нет разрешения переименовывать страницы.",
        "movenotallowedfile": "У вас нет разрешения переименовывать файлы.",
        "cant-move-user-page": "У вас нет разрешения переименовывать основные страницы участников.",
        "cant-move-to-user-page": "У вас нет прав переименовывать страницу в страницу участника (можно переименовать в подстраницу).",
+       "cant-move-category-page": "У вас нет разрешения переименовывать страницы категорий.",
+       "cant-move-to-category-page": "У вас нет разрешения переименовывать страницы в страницу категории.",
        "newtitle": "Новое название",
        "move-watch": "Включить эту страницу в список наблюдения",
        "movepagebtn": "Переименовать страницу",
        "tooltip-summary": "Введите краткое описание",
        "interlanguage-link-title": "$1 — $2",
        "common.css": "/* Размещённый здесь CSS будет применяться ко всем темам оформления */",
-       "cologneblue.css": "/* Размещённый здесь CSS будет применяться к теме оформления Cologne Blue */",
        "monobook.css": "/* Размещённый здесь CSS будет применяться к теме оформления Monobook */",
-       "modern.css": "/* Размещённый здесь CSS будет применяться к теме оформления Modern */",
        "vector.css": "/* Размещённый здесь CSS будет применяться к векторной теме оформления  */",
        "print.css": "/* Размещённый здесь CSS будет применяться к версии для печати */",
        "noscript.css": "/* Размещённый здесь CSS будет применяться для участников с отключенным JavaScript  */",
        "group-sysop.css": "/* Размещённый здесь CSS будет применяться только для администраторов */",
        "group-bureaucrat.css": "/* Размещённый здесь CSS будет применяться только для бюрократов */",
        "common.js": "/* Размещённый здесь код JavaScript будет загружаться пользователям при обращении к каждой странице */",
-       "cologneblue.js": "/* Размещённый здесь код JavaScript будет загружаться пользователям, использующим тему оформления Cologne Blue */",
        "monobook.js": "/* Размещённый здесь код JavaScript будет загружаться пользователям, использующим тему оформления MonoBook */",
-       "modern.js": "/* Размещённый здесь код JavaScript будет загружаться пользователям, использующим тему оформления Modern */",
        "vector.js": "/* Размещённый здесь код JavaScript будет загружаться пользователям, использующим тему оформления Vector */",
        "group-autoconfirmed.js": "/* Размещённый здесь код JavaScript будет загружаться только участникам, имеющим статус автоподтверждённых (autoconfirmed) */",
        "group-bot.js": "/* Размещённый здесь код JavaScript будет загружаться только участникам, имеющим статус ботов (bots) */",
        "group-sysop.js": "/* Размещённый здесь код JavaScript будет загружаться только участникам, имеющим статус администраторов (sysops) */",
        "group-bureaucrat.js": "/* Размещённый здесь код JavaScript будет загружаться только участникам, имеющим статус бюрократов (bureaucrats) */",
-       "notacceptable": "Вики-сервер не может предоставить данные в формате, который мог бы прочитать ваш браузер.<br />\nThe wiki server can't provide data in a format your client can read.",
        "anonymous": "{{PLURAL:$1|1=Анонимный участник|Анонимные участники}} {{grammar:genitive|{{SITENAME}}}}",
        "siteuser": "{{GENDER:$2|участник|участница}} {{grammar:genitive|{{SITENAME}}}} $1",
        "anonuser": "анонимный участник {{grammar:genitive|{{SITENAME}}}} $1",
        "pageinfo-category-pages": "Количество страниц",
        "pageinfo-category-subcats": "Количество подкатегорий",
        "pageinfo-category-files": "Количество файлов",
-       "skinname-cologneblue": "Кёльнская тоска",
-       "skinname-modern": "Современное",
        "skinname-vector": "Векторное",
        "markaspatrolleddiff": "Отметить как проверенную",
        "markaspatrolledtext": "Отметить эту статью как проверенную",
        "newimages-summary": "На этой служебной странице показаны недавно загруженные файлы.",
        "newimages-legend": "Фильтр",
        "newimages-label": "Имя файла (или его часть):",
-       "showhidebots": "($1 ботов)",
+       "newimages-showbots": "Показать загрузки ботов",
        "noimages": "Изображения отсутствуют.",
        "ilsubmit": "Найти",
        "bydate": "по дате",
        "bitrate-megabits": "$1 Мб/с",
        "bitrate-gigabits": "$1 Гб/с",
        "bitrate-terabits": "$1 Тб/с",
-       "livepreview-loading": "Загрузка…",
-       "livepreview-ready": "Загрузка… Готово!",
-       "livepreview-failed": "Не удалось использовать быстрый предпросмотр. Попробуйте воспользоваться обычным предпросмотром.",
-       "livepreview-error": "Не удалось установить соединение: $1 «$2». Попробуйте воспользоваться обычным предпросмотром.",
        "lag-warn-normal": "Изменения, сделанные менее {{PLURAL:$1|$1 секунды|$1 секунд|1=секунды}} назад, могут не отображаться в этом списке.",
        "lag-warn-high": "Из-за большого отставания в синхронизации серверов баз данных изменения, сделанные менее {{PLURAL:$1|$1 секунды|$1 секунд|1=секунды}} назад, могут не отображаться в этом списке.",
-       "watchlistedit-numitems": "Ваш список наблюдения содержит $1 {{PLURAL:$1|запись|записей|записи}}, не считая страниц обсуждений.",
-       "watchlistedit-noitems": "Ваш список наблюдения не содержит записей.",
        "watchlistedit-normal-title": "Изменение списка наблюдения",
        "watchlistedit-normal-legend": "Удаление записей из списка наблюдения",
        "watchlistedit-normal-explain": "Ниже перечислены страницы, находящиеся в вашем списке наблюдения.\nДля удаления записей отметьте соответствующие позиции и нажмите кнопку «{{int:Watchlistedit-normal-submit}}».\nВы также можете [[Special:EditWatchlist/raw|править список как текст]].",
        "watchlistedit-raw-done": "Ваш список наблюдения сохранён.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Была добавлена|Было добавлено|Были добавлены}} $1 {{PLURAL:$1|запись|записей|записи}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Была удалена|Было удалено|Были удалены}} $1 {{PLURAL:$1|запись|записей|записи}}:",
+       "watchlistedit-clear-title": "Список наблюдения очищен",
+       "watchlistedit-clear-legend": "Очистить список наблюдения",
+       "watchlistedit-clear-explain": "Все записи будут удалены из вашего списка наблюдения",
+       "watchlistedit-clear-titles": "Заголовки:",
+       "watchlistedit-clear-submit": "Очистить список наблюдения (это необратимо!)",
+       "watchlistedit-clear-done": "Ваш список наблюдения очищен.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|Была удалена|Было удалено|Были удалены}} $1 {{PLURAL:$1|запись|записей|записи}}:",
+       "watchlistedit-too-many": "Слишком много страниц для того, чтобы показать их здесь.",
+       "watchlisttools-clear": "Очистить список наблюдения",
        "watchlisttools-view": "Изменения на страницах из списка",
        "watchlisttools-edit": "Смотреть и редактировать список",
        "watchlisttools-raw": "Редактировать как обычный текст",
        "compare-invalid-title": "Указанное вами название недопустимо.",
        "compare-title-not-exists": "Не существует указанного вами названия.",
        "compare-revision-not-exists": "Указанной вами версии не существует.",
-       "dberr-header": "Эта вики испытывает затруднения",
        "dberr-problems": "Извините! На данном сайте возникли технические трудности.",
        "dberr-again": "Попробуйте обновить страницу через несколько минут.",
        "dberr-info": "(невозможно соединиться с сервером баз данных: $1)",
        "htmlform-float-invalid": "Указанное вами значение не является числом.",
        "htmlform-int-toolow": "Указанное вами значение ниже минимального — $1",
        "htmlform-int-toohigh": "указанное вами значение выше максимального — $1",
-       "htmlform-required": "Это значение необходимо",
+       "htmlform-required": "это значение необходимо",
        "htmlform-submit": "Отправить",
        "htmlform-reset": "Отменить изменения",
        "htmlform-selectorother-other": "Иное",
        "htmlform-no": "Нет",
        "htmlform-yes": "Да",
        "htmlform-chosen-placeholder": "Выберите вариант",
+       "htmlform-cloner-create": "Добавить ещё",
+       "htmlform-cloner-delete": "Удалить",
+       "htmlform-cloner-required": "Требуется по крайней мере одно значение.",
        "sqlite-has-fts": "$1 с поддержкой полнотекстового поиска",
        "sqlite-no-fts": "$1 без поддержки полнотекстового поиска",
        "logentry-delete-delete": "$1 {{GENDER:$2|удалил|удалила}} страницу $3",
index d2e5017..4fdf3dc 100644 (file)
@@ -7,7 +7,8 @@
                        "Kaganer",
                        "Nemo bis",
                        "Reedy",
-                       "Tkalyn"
+                       "Tkalyn",
+                       "아라"
                ]
        },
        "tog-underline": "Підкреслёвати одказы:",
@@ -20,7 +21,6 @@
        "tog-showtoolbar": "Вказати панел інштрументів",
        "tog-editondblclick": "Едітовати двоїтым кликом",
        "tog-editsectiononrightclick": "Дозволити едітованя секції сторінкы через кликаня правов клапков мышкы на надписы сторінок",
-       "tog-rememberpassword": "Запамнятати моє приголошіня на тім переглядачу (максімално $1 {{PLURAL:$1|день|днів}})",
        "tog-watchcreations": "Придавати сторінкы створены мнов тай файлы мнов наладованы до мого списку слїдованых",
        "tog-watchdefault": "Придавати мнов едітованы сторінкы і файлы до списку слїдованых",
        "tog-watchmoves": "Придавати переменованы сторінкы і файлы до мого списку слїдованых",
        "readonly_lag": "Датабаза автоматічно заблокована од змін, докы ся другый датабазовый сервер не сінхронізує з мастером",
        "internalerror": "Інтерна хыба",
        "internalerror_info": "Інтерна хыба: $1",
-       "fileappenderrorread": "В часї придаваня ся не вдало прочітати  \"$1\".",
-       "fileappenderror": "Не вдало ся придати «$1» до «$2».",
        "filecopyerror": "Не было можне копіровати файл «$1» на «$2».",
        "filerenameerror": "Не было можне переменовати файл «$1» на «$2».",
        "filedeleteerror": "Не было можне змазаты файл «$1».",
        "directorycreateerror": "Не мож вытворити адресарь «$1».",
        "filenotfound": "Не было можне найти файл «$1».",
-       "fileexistserror": "Не дасть ся записати до файлу «$1»: файл екзістує.",
        "unexpected": "Несподїване значіня: «$1»=«$2».",
        "formerror": "Хыба: небыло можне одослати формуларь",
        "badarticleerror": "Тота дїя не може быти выконана на тій сторінцї.",
        "userlogin-resetpassword-link": "Забыли сьте гесло?",
        "userlogin-loggedin": "Уж сьте {{GENDER:$1|приголошеный|приголошена}} як $1.\nХоснуйте формулар долов жебы сьте ся приголосили як другый хоснователь.",
        "userlogin-createanother": "Створити інше конто",
-       "createacct-join": "Ниже уведьте вашы інформації",
-       "createacct-another-join": "Ниже уведьте інформації нового конта",
        "createacct-emailrequired": "Адреса електронічной пошты",
        "createacct-emailoptional": "Адреса електронічной пошты (не обовязково)",
        "createacct-email-ph": "Уведьте вашу адресу електронічной пошты",
        "savearticle": "Уложыти сторінку",
        "preview": "Нагляд",
        "showpreview": "Указати нагляд",
-       "showlivepreview": "Швыдкый нагляд",
        "showdiff": "Указати зміны",
        "anoneditwarning": "'''Увага''': Не сьте приголошены. Ваша IP-адреса буде записана до історії змін той сторінкы.",
        "anonpreviewwarning": "''Не сьте приголошеный(а). Уложінём буде ваша IP адреса записана в історії  той сторінкы.''",
        "edit-gone-missing": "Сторінку ся не вдало обновити.\nАсі была змазана.",
        "edit-conflict": "Конфлікт едітованя.",
        "edit-no-change": "Ваша едітація была іґнорована, бо ся не зробила жадна зміна тексту.",
-       "postedit-confirmation": "Ваше едітованя было уложене.",
+       "postedit-confirmation-saved": "Ваше едітованя было уложене.",
        "edit-already-exists": "Не вдало ся створити нову сторінку, бо она уж існує.",
        "defaultmessagetext": "Преднаставленый текст повідомлїня",
        "content-failed-to-parse": "Не вдало ся проаналізовати $2 як тіп $1: $3",
        "search-nonefound": "На вашу пожадавку не были найджены жадны резултаты.",
        "powersearch-legend": "Росшырене гляданя",
        "powersearch-ns": "Глядати у просторах назв:",
-       "powersearch-redir": "Список напрямлинь",
        "powersearch-togglelabel": "Позначіти:",
        "powersearch-toggleall": "Вшыткы",
        "powersearch-togglenone": "Жадный",
        "prefs-advancedsearchoptions": "Розшырены можности",
        "prefs-advancedwatchlist": "Розшырены можности",
        "prefs-displayrc": "Наставлїня  взгляду",
-       "prefs-displaysearchoptions": "Наставлїня  взгляду",
        "prefs-displaywatchlist": "Наставлїня  взгляду",
        "prefs-tokenwatchlist": "Кліч",
        "prefs-diffs": "Порівнаня верзії",
        "recentchanges-legend-heading": "'''Леґенда:'''",
        "recentchanges-legend-newpage": "$1 — нова сторінка",
        "rcnotefrom": "Долов суть вказаны зміны од <strong>$2</strong> (до <strong>$1</strong>).",
-       "rclistfrom": "Вказати едітованя почінаючі з $1.",
+       "rclistfrom": "Вказати едітованя почінаючі з $3 $2.",
        "rcshowhideminor": "$1 маленькы едітованя",
        "rcshowhideminor-show": "Вказати",
        "rcshowhideminor-hide": "Сховати",
        "uploadstash-refresh": "Обновити список файлів",
        "invalid-chunk-offset": "Неприступный посув фраґмента.",
        "img-auth-accessdenied": "Приступ одопертый",
-       "img-auth-nopathinfo": "Ваш сервер не є наштелёваный так, жебы давав тоту інформацію.\nМоже фунґує помочов CGI і img_auth на нім не може фунґовати.\nПосмотьте https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "Ваш сервер не є наштелёваный так, жебы давав тоту інформацію.\nМоже фунґує помочов CGI і img_auth на нім не може фунґовати.\nПосмотьте https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Пожадована стежка не є в конфіґурованім адресарю із наладованыма файлами.",
        "img-auth-badtitle": "З „$1“  ся не дасть створити платна назва сторінкы.",
        "img-auth-nologinnWL": "Не сьте приголошеный і „$1“ не є на білім списку.",
        "watchlist-details": "{{PLURAL:$1|Єдна слїдована сторінка|слїдованы сторінкы|слїдованых сторінок}} (не рахувчі діскузны сторінкы).",
        "wlheader-enotif": "Упозорнїня  ел. поштов є запнуте.",
        "wlheader-showupdated": "Сторінкы, котры ся змінили од вашой послїднёй навщівы суть вказаны '''грубо'''",
-       "watchmethod-recent": "глядають ся слїдованы сторінкы міджі послїднїма змінами",
-       "watchmethod-list": "глядають ся найновшы едітованя слїдованых сторінок",
-       "watchlistcontains": "На своїм списку слїдованых сторінок маєте $1 {{PLURAL:$1|положку|положкы|положок}}.",
-       "iteminvalidname": "Проблем з положков „$1“, неплатна назва…",
        "wlshowlast": "Вказати зміны за послїднїх $1 годин $2 днїв $3",
        "watchlist-options": "Наставлїна списку слїдованых",
        "watching": "Придаваня до списку слїдованя...",
        "enotif_lastvisited": "Видьте $1 про список вшыткых змін од минулой навщівы.",
        "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\tПоздравує вас ваш посылач голошіня {{grammar:2sg|{{SITENAME}}}}\n\n--\nЗмінити наштелёваня імейловых повідомлїнь можете на\n{{canonicalurl:{{#special:Preferences}}}}\n\nНаштелёваня слїдованых сторінок можете змінити на\n{{canonicalurl:Special:Watchlist/edit}}\n\nСторінку можете зо своїх слїдованых вышмарити на\n$UNWATCHURL\n\nПорада і контакт:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Честованый хоснователю $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nЗгорнутя едітованя: $PAGESUMMARY $PAGEMINOREDIT\n\nХоснователя, котрый зміну учінив, можете контактовати:\nімейлом: $PAGEEDITOR_EMAIL\nна вікі: $PAGEEDITOR_WIKI\n\nПокы сторінку не навщівите, не будуть вам заганяны далшы повідомлїня о змінах той сторінкы. Тыж собі можете вынуловати признакы у своїм списку слїдованых сторінок.\n\n\tПоздравує вас ваш посылач голошіня {{grammar:2sg|{{SITENAME}}}}\n\n--\nЗмінити наштелёваня імейловых повідомлїнь можете на\n{{canonicalurl:{{#special:Preferences}}}}\n\nНаштелёваня слїдованых сторінок можете змінити на\n{{canonicalurl:Special:Watchlist/edit}}\n\nСторінку можете зо своїх слїдованых вышмарити на\n$UNWATCHURL\n\nПорада і контакт:\n$HELPPAGE",
        "created": "створена",
        "changed": "змінена",
        "deletepage": "Змазати сторінку",
        "blockip": "Заблоковати хоснователя",
        "blockip-legend": "Блокованя хоснователя",
        "blockiptext": "Тот формуларь служыть про заблокованя едітованя з конкретной IP адресы або мена хоснователя.\nТото бы мало быти хосноване лем в згодї з [[{{MediaWiki:Policy-url}}|правилами]].\nЗадайте причіну ниже (наприклад вкажте, котры сторінкы были пошкоджены).",
-       "ipadressorusername": "IP-адреса або мено хоснователя:",
+       "ipaddressorusername": "IP-адреса або мено хоснователя:",
        "ipbexpiry": "Кінчіть:",
        "ipbreason": "Причіна:",
        "ipbreason-dropdown": "*Часты причіны блокованя\n** Вкладаня неправдивых інформацій\n** Одстранёваня обсягу сторінок\n** Вкладаня рекламных екстерных одказів\n** Вкладаня незмыслїв\n** Застрашованя або выгрожованя\n** Знеужываня веце конт\n** Невгодне мено хоснователя",
        "tooltip-undo": "Зрушыти зміны і вказати попереднїй перегляд. Дозволює придати прічіну до ресуме.",
        "tooltip-preferences-save": "Уложыти наставлїня",
        "tooltip-summary": "Задайте курте згорнутя",
-       "notacceptable": "Тот вікі сервер не годен подати дата у форматї, котрый бы ваш кліент быв годен прочітати.",
        "anonymous": "анонімный {{PLURAL:$1|хоснователь|хоснователя|хоснователї}} {{GRAMMAR:2sg|{{SITENAME}}}}",
        "siteuser": "хоснователь {{grammar:2sg|{{SITENAME}}}} $1",
        "anonuser": "анонімный хоснователь {{grammar:2sg|{{SITENAME}}}} $1",
        "newimages-summary": "На тій шпеціалній сторінцї ся зображують остатнї наладованы файлы.",
        "newimages-legend": "Філтер",
        "newimages-label": "Назва файлу (або єй часть):",
-       "showhidebots": "($1 ботів)",
        "noimages": "Не є што зобразити.",
        "ilsubmit": "Глядати",
        "bydate": "за датумом",
        "autosumm-replace": "Обсяг сторінкы нагородженый текстом „$1“",
        "autoredircomment": "Напрямлїня на [[$1]]",
        "autosumm-new": "Створена сторінка: $1",
-       "livepreview-loading": "Наладовованя...",
-       "livepreview-ready": "Наладовованя… Готово!",
-       "livepreview-failed": "Швыдкый нагляд не є доступный! Спробуйте хосновати звычайный нагляд.",
-       "livepreview-error": "Не успішне споїня: $1 \"$2\". Хоснуйте звычайный нагляд.",
        "lag-warn-normal": "Зміны за  {{PLURAL:$1|послїдню секунду|послїднї  $1 секунды|послїднїх $1 секунд}} не мусять быти у тім списку вказаны.",
        "lag-warn-high": "Зато же датабазовый сервер є теперь незвычайно затяженый, не мусять быти зміны за  {{PLURAL:$1|послїдню секунду|послїднї $1 секунды|послїднїх $1 секунд}} у тім списку вказаны.",
-       "watchlistedit-numitems": "Ваш список слїдованых сторінок обсягує  (мімо діскузных сторінок) {{PLURAL:$1|1 положку|$1 положкы|$1 положок}}.",
-       "watchlistedit-noitems": "Ваш список слїдованых сторінок не обсягує жадну положку.",
        "watchlistedit-normal-title": "Едітованя списку слїдованых сторінок",
        "watchlistedit-normal-legend": "Вымазаня надписів зо список слїдованых сторінок",
        "watchlistedit-normal-explain": "Положкы вашого списка слїдованых сторінок суть вказаны ниже.\nТоту сторінку можете із списка одстранити так, же означіте єй коцочку і кликнете \"{{int:Watchlistedit-normal-submit}}\".\nТыж можете [[Special:EditWatchlist/raw|едітовати список в текстовій формі]].",
        "compare-invalid-title": "Вами задана назва є неправилна.",
        "compare-title-not-exists": "Зазначена назва не екзістує.",
        "compare-revision-not-exists": "Зазначена ревізія не екзістує.",
-       "dberr-header": "Тота вікі має даякы проблемы",
        "dberr-problems": "Перебачте! Тот сервер має теперь технічны проблемы.",
        "dberr-again": "Спробуйте обновити сторінку за пару мінут.",
        "dberr-info": "(не годен навязати споїня з датабазовым сервером: $1)",
index 5190593..a7784c1 100644 (file)
@@ -19,7 +19,8 @@
                        "Shreekant Hegde",
                        "Shubha",
                        "Vibhijain",
-                       "రాకేశ్వర"
+                       "రాకేశ్వర",
+                       "아라"
                ]
        },
        "tog-underline": "परिसन्धेः अधो रेखाङ्कनम्:",
        "jumptonavigation": "सञ्चरणं",
        "jumptosearch": "अन्वेषणम्",
        "view-pool-error": "क्षम्यताम् ! सद्यः वितरकस्य (server) उपरि बहु कार्यभारः अस्ति । \nबहवः जनाः एतत् पृष्ठं पश्यन्तः सन्ति । \nएतत् पृष्ठं पुनर्द्रष्टुं पतिक्षा क्रियताम् । $1",
+       "generic-pool-error": "क्षम्यताम् ! सद्यः वितरकस्य (server) उपरि बहु कार्यभारः अस्ति । \nबहवः जनाः एतत् पृष्ठं पश्यन्तः सन्ति । \nएतत् पृष्ठं पुनर्द्रष्टुं पतिक्षा क्रियताम् ।",
        "pool-timeout": "संरक्षणार्थं कालावधिः समाप्ता",
        "pool-queuefull": "Pool इति पङ्कतिः पूर्णा अस्ति ।",
        "pool-errorunknown": "अज्ञातदोषः",
        "viewsourcelink": "स्रोतः दृश्यताम्",
        "editsectionhint": "सम्पादनविभागः: $1",
        "toc": "अन्तर्विषयाः",
-       "showtoc": "दरà¥\8dश्यताम्",
+       "showtoc": "दà¥\83श्यताम्",
        "hidetoc": "गोप्यताम्",
        "collapsible-collapse": "सङ्कुच्यताम्",
        "collapsible-expand": "विस्तीर्यताम्",
        "readonly_lag": "सहायकतन्त्रांशः (slave database) यावत् मुख्यतन्त्रांशात् किमपि स्वीकुर्यात्, तावत् मुख्यतन्त्रांशः तन्त्रांशमाध्यमेन स्वयमेव कीलितः अभवत्",
        "internalerror": "आन्तरिकः दोषः",
        "internalerror_info": "आन्तरिकः दोषः: $1",
-       "fileappenderrorread": "योजनकाले \"$1\" पठितुं न शक्यते ।",
-       "fileappenderror": "$1 इत्येनं $2 इत्येन सह योजयितुं न शक्यते ।",
        "filecopyerror": "Could not copy file \"$1\" to \"$2\".",
        "filerenameerror": "$1 सञ्चिकायाः $2 इति पुनर्नामकरणं निष्फलम् ।",
        "filedeleteerror": "$1 इति सञ्चिका अपाकर्तुं न शक्यते ।",
        "directorycreateerror": "'''$1''' इति विभागः रचितुं न शक्यते ।",
        "filenotfound": "'\"$1\"' सञ्चिका न लब्धा ।",
-       "fileexistserror": "$1 सञ्चिकायां नोल्लेखितं : सञ्चिका वर्तते इति ।",
        "unexpected": "अनपेक्षितं मूल्यम् : \"$1\"=\"$2\"",
        "formerror": "दोषः : प्रपत्रं (form) न प्रेषितम्",
        "badarticleerror": "अस्मिन् पृष्ठे एषा क्रिया कर्तुं न शक्यते ।",
        "userlogin-helplink2": "प्रवेशविषयकं साहाय्यम्",
        "userlogin-loggedin": "भवाता/भवत्या पूर्वस्मादेव {{GENDER:$1|$1}} योजकत्वेन प्रवेशः प्राप्तः अस्ति । भिन्नयोजकत्वेन प्रवेष्टुं निम्नप्रपत्रं पूरयतु ।",
        "userlogin-createanother": "अन्यसदस्यता प्राप्यताम्",
-       "createacct-join": "स्वविषये अधः लिख्यताम् ।",
-       "createacct-another-join": "नवीनसदस्यतायाः विषये अधः लिख्यताम् ।",
        "createacct-emailrequired": "ई-पत्रसङ्केतः",
        "createacct-emailoptional": "ई-पत्रसङ्केतः (ऐच्छिकः)",
        "createacct-email-ph": "स्वस्य ई-पत्रसङ्केतं लिखतु",
        "savearticle": "पृष्ठं रक्ष्यताम्",
        "preview": "प्राग्दृश्यम्",
        "showpreview": "प्राग्दृश्यं दृश्यताम्",
-       "showlivepreview": "प्रत्यक्षं प्राग्दृश्यम्",
        "showdiff": "परिवर्तनानि दृश्यन्ताम्",
        "anoneditwarning": "'''पूर्वसूचना''' भवता/भवत्या प्रवेशः न कृतः !\nअत्र सम्पादनं कर्तुं प्रवेशः अनिवार्यः । अन्यथा अस्य पृष्ठस्य इतिहासे भवतः/भवत्याः अन्तर्जालसंविदः (IP) सङ्ख्या अङ्किता भवति ।",
        "anonpreviewwarning": "''भवता/भवत्या प्रवेशः न स्वीकृतः । अस्य पृष्ठस्य परिवर्तनस्य इतिहासे भवतः/भवत्याः अन्तर्जालसंविदः (IP) उल्लेखो भविष्यति ।''",
        "edit-gone-missing": "अस्मिन् पृष्ठे परिवर्तनं नाभूत् ।\nएतत् पृष्ठं पुरा एव केनापि अपाकृतम् इति भाति ।",
        "edit-conflict": "सम्पादनयोः अन्तर्विरोधः ।",
        "edit-no-change": "भवता/भवत्या कृतं सम्पादम् अवगणितम् । कारणं लेखे न किमपि परिवर्तनं जातमस्ति ।",
-       "postedit-confirmation": "सम्पादनं रक्षितम् ।",
+       "postedit-confirmation-created": "नूतनपृष्ठस्य रचना अभवत् ।",
+       "postedit-confirmation-restored": "एतत् पृष्ठं पुनः सङ्ग्रहितम् ।",
+       "postedit-confirmation-saved": "सम्पादनं रक्षितम् ।",
        "edit-already-exists": "नूतनपृष्ठस्य निर्माणं नाभूत् ।\nपूर्वस्मादेव एतत् पृष्ठं विद्यते ।",
        "defaultmessagetext": "मूलसन्देशः",
        "content-failed-to-parse": "$1 कृते $2 इत्यस्य विभाजनं विफलम् अभवत् । दोषः : $3",
        "invalid-content-data": "अयोग्यः लेखः",
-       "content-not-allowed-here": "[[$2]] à¤ªà¥\83षà¥\8dठà¥\87 \"$1\" à¤¸à¤¾à¤®à¤\97à¥\8dरà¥\80 à¤\85नà¥\81मता नास्ति",
+       "content-not-allowed-here": "[[$2]] à¤ªà¥\83षà¥\8dठà¥\87 \"$1\" à¤¸à¤¾à¤®à¤\97à¥\8dरà¥\80 à¤¸à¥\8dथापितà¥\81मà¥\8d à¤\85नà¥\81मतिà¤\83 नास्ति",
        "editwarning-warning": "एतत् पृष्ठं त्यक्तवा यदि गमिष्यति, तर्हि भवता/भवत्या कृतस्य सम्पादनस्य रक्षणं न भविष्यति ।\n\nभवता/भवत्या यदि प्रवेशः प्राप्तः अस्ति, तर्हि एषा सूचना अत्र \"{{int:prefs-editing}}\" निगूढितुं शक्यते ।",
        "editpage-notsupportedcontentformat-title": "लेखस्य प्रारूपम् अयोग्यम्",
        "editpage-notsupportedcontentformat-text": "लेखस्य सामग्र्याः $1 इति प्रारूपं $2 सामग्री-उदाहरणानुगुणं नास्ति ।",
        "revdelete-reasonotherlist": "अन्यानि कारणानि",
        "revdelete-edit-reasonlist": "सम्पादनस्य अपाकरणाय कारणानि",
        "revdelete-offender": "संस्करणकर्ता",
-       "suppressionlog": "निग्रहणानां संरक्षणाऽवलिः",
-       "suppressionlogtext": "à¤\85धà¤\83 à¤\85वरà¥\8bधितपà¥\83षà¥\8dठानामà¥\8d, à¤\85पाà¤\95रणà¥\80यपà¥\83षà¥\8dठानाà¤\82 à¤\9a à¤\86वलिà¤\83 à¤\85सà¥\8dति à¥¤ à¤\8fषा à¤\86वलिà¤\83 à¤ªà¥\8dरबनà¥\8dधà¤\95à¥\87भà¥\8dयà¤\83 à¤¨à¤¿à¤\97à¥\82ढिता à¤\85सà¥\8dति à¥¤\nसदà¥\8dयà¤\83à¤\95ालà¥\80ना अवरोधितपृष्ठानाम्, अपाकरणीयपृष्ठानां च आवलिं द्रष्टुम् [[Special:BlockList|अवरोधितावलिः]] पश्यतु ।",
+       "suppressionlog": "निà¤\97à¥\8dरहणानाà¤\82 à¤¸à¤\82रà¤\95à¥\8dषणाऽऽवलिà¤\83",
+       "suppressionlogtext": "à¤\85धà¤\83 à¤\85वरà¥\8bधितपà¥\83षà¥\8dठानामà¥\8d, à¤\85पाà¤\95रणà¥\80यपà¥\83षà¥\8dठानाà¤\82 à¤\9a à¤\86वलिà¤\83 à¤\85सà¥\8dति à¥¤ à¤\8fषा à¤\86वलिà¤\83 à¤ªà¥\8dरबनà¥\8dधà¤\95à¥\87भà¥\8dयà¤\83 à¤¨à¤¿à¤\97à¥\82ढिता à¤\85सà¥\8dति à¥¤\nनà¥\82तनानामà¥\8d अवरोधितपृष्ठानाम्, अपाकरणीयपृष्ठानां च आवलिं द्रष्टुम् [[Special:BlockList|अवरोधितावलिः]] पश्यतु ।",
        "mergehistory": "पृष्ठयोः इतिहासस्य विलीनिकरणं करोतु",
        "mergehistory-header": "एकस्य पृष्ठस्य इतिहासेन सह नवीनपृष्ठस्य इतिहासम् एकत्रीकर्तुम् एतत् पृष्ठं साहाय्यं करोति । अत्र इतिहासः क्रमशः भवेत् इति अवधेयम् ।",
        "mergehistory-box": "द्वयोः पृष्ठयोः इतिहासः एकत्रीक्रियताम् :",
        "mergehistory-from": "स्रोतपृष्ठम् :",
        "mergehistory-into": "लक्षितपृष्ठम् :",
        "mergehistory-list": "विलीनयोग्यसम्पादनस्य इतिहासः",
-       "mergehistory-merge": "[[:$1]] इत्यस्य निम्नसंस्करणानि [[:$2]] इत्यनेन सह संयोजयितुं शक्यन्ते । निर्दिष्टकालस्य, तस्मात् पूर्वतनस्य च संस्करणानि एकत्रीकर्तुं रेडियो-कुड्मलस्य उपयोगं करोतु । \nसूचनायाः, सञ्चरणस्य (navigation) च उपयोगकर्तारः एते स्तम्भाः पुनः पूर्ववत् भविष्यति ।",
+       "mergehistory-merge": "[[:$1]] à¤\87तà¥\8dयसà¥\8dय à¤¨à¤¿à¤®à¥\8dनसà¤\82सà¥\8dà¤\95रणानि [[:$2]] à¤\87तà¥\8dयनà¥\87न à¤¸à¤¹ à¤¸à¤\82यà¥\8bà¤\9cयितà¥\81à¤\82 à¤¶à¤\95à¥\8dयनà¥\8dतà¥\87 à¥¤ à¤¨à¤¿à¤°à¥\8dदिषà¥\8dà¤\9fà¤\95ालसà¥\8dय, à¤¤à¤¸à¥\8dमातà¥\8d à¤ªà¥\82रà¥\8dवतनसà¥\8dय à¤\9a à¤¸à¤\82सà¥\8dà¤\95रणानि à¤\8fà¤\95तà¥\8dरà¥\80à¤\95रà¥\8dतà¥\81à¤\82 à¤°à¥\87डियà¥\8b-à¤\95à¥\81डà¥\8dमलसà¥\8dय à¤\89पयà¥\8bà¤\97à¤\82 à¤\95रà¥\8bतà¥\81 à¥¤ \nसà¥\82à¤\9aनायाà¤\83, à¤¸à¤\9eà¥\8dà¤\9aरणसà¥\8dय (navigation) à¤\9a à¤\89पयà¥\8bà¤\97à¤\95रà¥\8dतारà¤\83 à¤\8fतà¥\87 à¤¸à¥\8dतमà¥\8dभाà¤\83 à¤ªà¥\81नà¤\83 à¤ªà¥\82रà¥\8dववतà¥\8d à¤­à¤µà¤¿à¤·à¥\8dयनà¥\8dति à¥¤",
        "mergehistory-go": "विलीनयोग्यसम्पादनानि दर्शयतु",
-       "mergehistory-submit": "à¤\85वतरणà¤\82 योजयतु ।",
+       "mergehistory-submit": "सà¤\82सà¥\8dà¤\95रणानि à¤¸à¤\82योजयतु ।",
        "mergehistory-empty": "अवतरणानि संयोजयितुं न शक्यते ।",
-       "mergehistory-success": "$3 {{PLURAL:$3|revision|revisions}} of [[:$1]] successfully merged into [[:$2]].",
-       "mergehistory-fail": "à¤\87तिहासविलà¥\80नता à¤¨à¥\88व à¤¶à¤\95à¥\8dयतà¥\87 à¥¤ à¤ªà¥\81à¤\9fà¤\82 à¤\95ालà¤\82 à¤µà¥\8dयापà¥\8dतिà¤\82 à¤\9a à¤ªà¤°à¤¿à¤¶à¥\80लयतु ।",
-       "mergehistory-no-source": "पूलपुटं $1 अस्तित्वं नास्ति ।",
-       "mergehistory-no-destination": "लक्षितपुटं $1 अस्तित्वे नास्ति ।",
-       "mergehistory-invalid-source": "मà¥\82लपà¥\81à¤\9fसà¥\8dय à¤®à¤¾à¤¨à¥\8dयशà¥\80रà¥\8dषिà¤\95ा à¤¸à¥\8dयातà¥\8d ।",
-       "mergehistory-invalid-destination": "लà¤\95à¥\8dषितपà¥\81à¤\9fà¤\82 à¤®à¤¾à¤¨à¤¿à¤¤à¤¶à¥\80रà¥\8dषिà¤\95ायà¥\81तà¤\82 à¤­à¤µà¥\87तà¥\8d ।",
-       "mergehistory-autocomment": "लीनं [[:$1]] into [[:$2]]",
-       "mergehistory-comment": "लीनं [[:$1]]    [[:$2]] : $3",
-       "mergehistory-same-destination": "मà¥\82लपà¥\81à¤\9fà¤\82 à¤²à¤\95à¥\8dषितपà¥\81à¤\9fà¤\82 à¤\9a à¤¸à¤®à¤¾à¤¨à¤\82 à¤¨ à¤­à¤µà¥\87त् ।",
+       "mergehistory-success": "[[:$1]] इत्यस्य $3 {{PLURAL:$3|संस्करणं|संस्करणानि}} [[:$2]] इत्यत्र स्वस्ति (successfully) विलिनीकृतानि ।",
+       "mergehistory-fail": "à¤\87तिहासविलà¥\80नता à¤¨à¥\88व à¤¶à¤\95à¥\8dयतà¥\87 à¥¤ à¤ªà¥\83षà¥\8dठसमà¥\8dबदà¥\8dधानि, à¤\95ालसमà¥\8dबदà¥\8dधानि à¤µà¤¿à¤\95लà¥\8dपानि à¤ªà¥\81नà¤\83 à¤ªà¤¶à¥\8dयतु ।",
+       "mergehistory-no-source": "$1 इति स्रोतपृष्ठं न विद्यते ।",
+       "mergehistory-no-destination": "$1 इति लक्षितपृष्ठं न विद्यते ।",
+       "mergehistory-invalid-source": "मà¥\82लपà¥\83षà¥\8dठसà¥\8dय à¤¯à¥\8bà¤\97à¥\8dयà¤\82 à¤¶à¥\80रà¥\8dषà¤\95मà¥\8d à¤\86वशà¥\8dयà¤\95मà¥\87व ।",
+       "mergehistory-invalid-destination": "लà¤\95à¥\8dषितपà¥\83षà¥\8dठसà¥\8dय à¤¯à¥\8bà¤\97à¥\8dयà¤\82 à¤¶à¥\80रà¥\8dषà¤\95मà¥\8d à¤\86वशà¥\8dयà¤\95मà¥\87व ।",
+       "mergehistory-autocomment": "[[:$1]] इत्येनं [[:$2]] इत्यस्मिन् विलीनं कृतम्",
+       "mergehistory-comment": "[[:$1]] इत्येनं [[:$2]] इत्यस्मिन् विलीनं कृतम् : $3",
+       "mergehistory-same-destination": "मà¥\82लपà¥\83षà¥\8dठ-लà¤\95à¥\8dषितपà¥\83षà¥\8dठà¥\87 à¤¸à¤®à¤¾à¤¨à¥\87 à¤¨ à¤­à¤µà¥\87ताम् ।",
        "mergehistory-reason": "कारणम् :",
-       "mergelog": "नामाभिलà¥\87à¤\96à¤\82 à¤¯à¥\8bà¤\9cयतà¥\81 à¥¤",
-       "pagemerge-logentry": "[[$1]]  तु [[$2]] मध्ये विलीनम् (अवतरणं $3 पर्यन्तम् ) ।",
+       "mergelog": "सà¤\82सà¥\8dà¤\95रणà¤\82 à¤µà¤¿à¤²à¥\80यतामà¥\8d",
+       "pagemerge-logentry": "[[:$1]] इत्येनं [[:$2]] इत्यस्मिन् विलीनं कृतम् ($3 परिवर्तनानि)",
        "revertmerge": "पृथक्क्रियताम्",
-       "mergelogpagetext": "à¤\85तिनà¥\82तनविलà¥\80नसà¥\8dय à¤\86वलà¥\80 à¤\85धà¥\8b à¤¦à¤¤à¥\8dता à¤¯à¤¸à¥\8dय à¤\87तिहासà¤\83 à¤\85नà¥\8dयसà¥\8dमिनà¥\8d à¤\85सà¥\8dति ।",
+       "mergelogpagetext": "यà¥\87षाà¤\82 à¤ªà¥\83षà¥\8dठानामà¥\8d à¤\87तिहासà¤\83 à¤\85धà¥\81ना à¤\8fव à¤µà¤¿à¤²à¥\80नà¥\80à¤\95à¥\83तà¤\83, à¤¤à¥\87षाà¤\82 à¤ªà¥\83षà¥\8dठानामà¥\8d à¤\86वलिà¤\83 à¤\85धà¤\83 à¤ªà¥\8dरदतà¥\8dता ।",
        "history-title": "\"$1\" इत्यस्य आवर्तनेतिहासः",
-       "difference-title": "\"$1\" à¤\87तà¥\8dयसà¥\8dय à¤\85वतरणमधà¥\8dयà¥\87 à¤µà¥\8dयतà¥\8dयासà¤\83 à¥¤",
-       "difference-title-multipage": "\"$1\" à¤¤à¤¥à¤¾ \"$2\" à¤ªà¥\81à¤\9fयà¥\8bà¤\83 à¤®à¤§à¥\8dयà¥\87 à¤µà¥\8dयतà¥\8dयासà¤\83 à¥¤",
-       "difference-multipage": "पुटेषु व्यत्यासः ।",
+       "difference-title": "\"$1\" à¤\87तà¥\8dयसà¥\8dय à¤¸à¤\82सà¥\8dà¤\95रणà¥\87 à¤­à¥\87दà¤\83",
+       "difference-title-multipage": "\"$1\" à¤¤à¤¥à¤¾ \"$2\" à¤ªà¥\83षà¥\8dठयà¥\8bà¤\83 à¤®à¤§à¥\8dयà¥\87 à¤­à¥\87दà¤\83",
+       "difference-multipage": "(पृष्ठयोः भेदः)",
        "lineno": "पङ्क्तिः $1:",
        "compareselectedversions": "चितानाम् आवृत्तीनां तुलना क्रियताम्",
-       "showhideselectedversions": "à¤\9aितावतरणानि à¤¦à¤°à¥\8dशयतà¥\81/à¤\97à¥\8bपयतà¥\81 à¥¤",
+       "showhideselectedversions": "à¤\9aितसà¤\82सà¥\8dà¤\95रणानि à¤¦à¥\83शà¥\8dयतामà¥\8d/à¤\97à¥\8bपà¥\8dयतामà¥\8d",
        "editundo": "पूर्ववत्",
-       "diff-multi-manyusers": "({{PLURAL:$2|योजकेन|$2 योजकैः}} कृता {{PLURAL:$1|मध्यमा आवृत्तिः|$1 मध्यमा आवृत्तयः}} न दर्शिताः ।)",
-       "difference-missing-revision": "{{PLURAL:$2|One revision|$2 पुनरावृत्तेः }} व्यत्यासः ($1) {{PLURAL:$2|was|were}} न दृष्टः ।\nकारणम् अत्र दृश्यते । [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
+       "diff-empty": "(भेदः नास्ति)",
+       "diff-multi-sameuser": "(अनेन योजकेनैव {{PLURAL:$1|कृतम् एकं संस्करणं न प्रदर्श्यते|क्रितानि $1 संस्करणानि न प्रदर्श्यन्ते}})",
+       "diff-multi-otherusers": "({{PLURAL:$2|एकेन अन्ययोजकेन|$2 योजकैः}} {{PLURAL:$1|कृतम् एकं संस्करणं न प्रदर्श्यते|क्रितानि $1 संस्करणानि न प्रदर्श्यन्ते}})",
+       "diff-multi-manyusers": "{{PLURAL:$2|एकेन योजकेन कृतं|$2 योजकैः कृतानि}} ({{PLURAL:$1|मध्यस्थम् एकं संस्करणं न प्रदर्शितम् ।|मध्यस्थानि $1 परिवर्तनानि न प्रदर्शितानि ।}})",
+       "difference-missing-revision": "एतस्य भेदस्य {{PLURAL:$2|एकं संस्करणं|$2 संस्करणानि}} ($1) न {{PLURAL:$2|प्राप्तम्|प्राप्तानि}} ।\n\nअपाकृतानां पृष्ठानां संस्करणानाम् अन्वेषणकाले प्रायशः एतादृशं भवति । अधिकं ज्ञातुं [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} अपाकृतानाम् आवलि)] पश्यतु ।",
        "searchresults": "अन्वेषणपरिणामाः",
        "searchresults-title": "\"$1\" कृते अन्वेषणपरिणामाः",
-       "toomanymatches": "à¤\85तà¥\8dयधिà¤\95ाà¤\83 à¤®à¥\87लाà¤\83 à¤ªà¥\8dरतà¥\8dयाà¤\97ताà¤\83 à¥¤ à¤\85नà¥\8dयपà¥\8dरशà¥\8dनà¥\87न à¤¯à¤¤à¤¤à¤¾à¤®à¥\8d à¥¤",
-       "titlematches": "पà¥\81à¤\9fशà¥\80रà¥\8dषिà¤\95ामà¥\87लाà¤\83 à¥¤",
-       "textmatches": "पà¥\81à¤\9fपाठसà¥\8dय à¤®à¥\87लाà¤\83",
-       "notextmatches": "न à¤\95सà¥\8dयापि à¤ªà¥\83षà¥\8dठसà¥\8dय à¤ªà¤¾à¤ à¤\83 à¤\85सà¥\8dय à¤¸à¤®à¤®à¤¸à¥\8dति",
+       "toomanymatches": "बहवà¤\83 à¤ªà¤°à¤¿à¤£à¤¾à¤®à¤¾à¤\83 à¤ªà¥\8dरापà¥\8dताà¤\83, à¤\95à¥\83पया à¤¶à¤¬à¥\8dदà¤\82 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतà¥\8dय à¤ªà¥\81नà¤\83 à¤\85नà¥\8dविषà¥\8dयतामà¥\8d",
+       "titlematches": "पà¥\83षà¥\8dठशà¥\80रà¥\8dषà¤\95à¤\82 à¤®à¥\87लà¤\83 (matches)",
+       "textmatches": "पà¥\83षà¥\8dठपाठà¤\83 à¤®à¥\87लà¤\83 (matches)",
+       "notextmatches": "à¤\8fषà¤\83 à¤¶à¤¬à¥\8dदà¤\83 à¤¨ à¤\95सà¥\8dमिà¤\82शà¥\8dà¤\9aिदपि à¤ªà¥\83षà¥\8dठà¥\87 à¤\85नà¥\8dतरà¥\8dभवति à¥¤",
        "prevn": "पूर्वतनम् {{PLURAL:$1|$1}}",
        "nextn": "अग्रिमम् {{PLURAL:$1|$1}}",
        "prevn-title": "पूर्वतन{{PLURAL:$1|परिणामः|परिणामाः}}",
        "nextn-title": "अग्रिम{{PLURAL:$1|परिणामः|परिणामाः}}",
-       "shown-title": "पà¥\8dरतà¥\8dयà¥\87à¤\95सà¥\8dमिनà¥\8d à¤ªà¥\83षà¥\8dठà¥\87 $1 {{PLURAL:$1|फलितमà¥\8d|फलितानि}} à¤¦à¤°à¥\8dशà¥\8dयतामà¥\8d",
+       "shown-title": "पà¥\8dरतà¥\8dयà¥\87à¤\95सà¥\8dमिनà¥\8d à¤ªà¥\83षà¥\8dठà¥\87 $1 {{PLURAL:$1|परिणामà¤\83 à¤¦à¥\83शà¥\8dयतामà¥\8d|परिणामाà¤\83 à¤¦à¥\83शà¥\8dयनà¥\8dतामà¥\8d}}",
        "viewprevnext": "दृश्यताम् ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "<strong>अस्मिन् विकि-जालस्थाने \"[[:$1]]\" नामकं पृष्ठं विद्यते ।</strong> {{PLURAL:$2|0=|अन्यपरिणामाः दृश्यन्ताम्}}",
-       "searchmenu-new": "<strong> अस्मिन् विकिजालस्थाने \"[[:$1]]\" इदं पृष्ठं सृज्यताम् ।\n</strong>\n{{PLURAL:$2|0=|तव अन्वेषणस्य परिणामोऽपि दृश्यताम् ।|तव अन्वेषणस्य परिणामाः अपि दृश्यन्ताम्}}",
+       "searchmenu-new": "<strong> अस्मिन् विकि-जालस्थाने \"[[:$1]]\" इदं पृष्ठं सृज्यताम् ।\n</strong>\n{{PLURAL:$2|0=|तव अन्वेषणस्य परिणामोऽपि दृश्यताम् ।|तव अन्वेषणस्य परिणामाः अपि दृश्यन्ताम्}}",
        "searchprofile-articles": "विषयसहितानि पृष्ठानि",
-       "searchprofile-project": "साहाय्यं, प्रकल्पपृष्ठानि च",
        "searchprofile-images": "माध्यमसमुच्चयः",
        "searchprofile-everything": "सर्वम्",
        "searchprofile-advanced": "प्रगतम्",
        "searchprofile-articles-tooltip": "$1 स्थले अन्विष्यताम्",
-       "searchprofile-project-tooltip": "$1 स्थले अन्विष्यताम्",
        "searchprofile-images-tooltip": "सञ्चिकाः अन्विष्यन्ताम्",
        "searchprofile-everything-tooltip": "सर्वत्र अन्विष्यताम् (चर्चापृष्ठानि अपि)",
        "searchprofile-advanced-tooltip": "नामाकाशेषु अन्विष्यताम्",
        "search-result-size": "$1 ({{PLURAL:$2|1 शब्दः|$2 शब्दाः}})",
        "search-result-category-size": "{{PLURAL:$1|1 योजकः|$1 योजकाः}} ({{PLURAL:$2|1 उपवर्गः|$2 उपवर्गाः}}, {{PLURAL:$3|1 सञ्चिका|$3 सञ्चिकाः}})",
-       "search-result-score": "सम्बन्धः $1% ।",
+       "search-result-score": "सम्बन्धः : $1%",
        "search-redirect": "($1 तः अनुप्रेषितम्)",
        "search-section": "(विभागः $1)",
+       "search-file-match": "(सञ्चिकापाठेन सह मेलः अस्ति)",
        "search-suggest": "किं भवतः/भवत्याः आशयः एवमस्ति : $1",
        "search-interwiki-caption": "बन्धु-प्रकल्पाः",
-       "search-interwiki-default": "$1 परिणामाः :",
+       "search-interwiki-default": "$1 à¤¤à¤\83 à¤ªà¤°à¤¿à¤£à¤¾à¤®à¤¾à¤\83 :",
        "search-interwiki-more": "(अधिकानि)",
-       "search-relatedarticle": "सम्बद्धानि ।",
-       "searcheverything-enable": "सरà¥\8dवनामावà¤\95ाशà¥\87 à¤\85नà¥\8dविषतà¥\81 à¥¤",
+       "search-relatedarticle": "सम्बद्धानि",
+       "searcheverything-enable": "सरà¥\8dवसà¥\8dमिनà¥\8d à¤¨à¤¾à¤®à¤¾à¤\95ाशà¥\87 à¤\85नà¥\8dविषà¥\8dयतामà¥\8d",
        "searchrelated": "सम्बद्धानि",
        "searchall": "सर्वाणि",
-       "showingresults": "निम्नगतक्रमाङ्कस्य '''$2''' तः आरभ्य अधिकतमं परिणामः'''$1''' {{PLURAL:$1| दर्शितः}}।",
-       "showingresultsnum": "निम्नगतक्रमाङ्क'''$2'''तः आरभ्य अधिकतमः '''$3''' परिणामः {{PLURAL:$3|दर्शितः}}।",
+       "showingresults": "#'''$2''' क्रमाङ्कात् आरभ्य {{PLURAL:$1|'''$1''' परिणामः अधः प्रदर्शितः|'''$1''' परिणामाः अधः प्रदर्शिताः}}।",
+       "showingresultsinrange": "#'''$2''' क्रमाङ्कात् आरभ्य #'''$3''' क्रमाङ्कपर्यन्तं {{PLURAL:$1|'''$1''' परिणामः अधः प्रदर्शितः|'''$1''' परिणामाः अधः प्रदर्शिताः}}।",
+       "showingresultsnum": "#'''$2''' क्रमाङ्कात् आरभ्य {{PLURAL:$3|'''1''' परिणामः अधः प्रदर्शितः|'''$3''' परिणामाः अधः प्रदर्शिताः}}।",
        "showingresultsheader": "'''$4''' इत्येतस्मै {{PLURAL:$5|'''$1''' परिणामः '''$3''' इत्येषु|'''$1 - $2''' परिणामाः '''$3''' इत्येषु}}",
        "search-nonefound": "भवतः/भवत्याः अपेक्षानुगुणं परिणामः न विद्यते ।",
        "powersearch-legend": "प्रगतम् अन्वेषणम्",
-       "powersearch-ns": "नामाकाशेषु अन्विष्यताम्:",
-       "powersearch-redir": "अनुप्रेषणानां सूचिका दर्श्यताम्",
-       "powersearch-togglelabel": "आयीका:",
+       "powersearch-ns": "नामाकाशेषु अन्विष्यताम् :",
+       "powersearch-togglelabel": "परीक्ष्यताम् :",
        "powersearch-toggleall": "सर्वम्",
-       "powersearch-togglenone": "नासà¥\8dति",
+       "powersearch-togglenone": "नà¥\88à¤\95मपि",
        "search-external": "बाह्यान्वेषणम्",
-       "searchdisabled": "{{SITENAME}} अन्वेषणं निष्क्रियम्\nअश्मिन् समये भवान् गूगल माध्यमेन अन्वेषणं कर्तुं शक्नोति\nस्मरयतु यत् {{SITENAME}} इति स्थलस्य क्रमाङ्का नैव अद्यातना  इति सोच्यते।",
+       "searchdisabled": "{{SITENAME}} इत्यत्र अन्वेषणं कर्तुं न शक्यते ।\nतावता गुगल-माध्यमेन अन्वेषणं कर्तुं शक्यते ।\n'''पूर्वसूचना'''गुगल-जालस्थाने {{SITENAME}} इत्यस्य पुरातना सूचना भवितुम् अर्हति ।",
+       "search-error": "$1 इति अन्वेषणकाले दोषः प्राप्तः :",
        "preferences": "इष्टतमानि",
        "mypreferences": "इष्टतमानि",
        "prefs-edits": "सम्पादनानां सख्याः",
+       "prefsnologintext2": "स्वस्य इष्टतमानि परिवर्तितुं कृपया $1 इत्येनं नुदतु ।",
        "prefs-skin": "त्वक्",
        "skin-preview": "प्राग्दृश्यम्",
-       "datedefault": "वरà¥\80याà¤\82सि à¤¨à¤¾à¤¸्ति",
-       "prefs-labs": "पà¥\8dरयà¥\8bà¤\97शालालà¤\95à¥\8dषणानि à¥¤",
-       "prefs-user-pages": "यà¥\8bà¤\9cà¤\95पà¥\81à¤\9fानि à¥¤",
-       "prefs-personal": "यà¥\8bà¤\9cà¤\95सà¥\8dय à¤°à¥\82परà¥\87à¤\96ा",
+       "datedefault": "à¤\87षà¥\8dà¤\9fतमानि à¤¨ à¤¸à¤¨्ति",
+       "prefs-labs": "पà¥\8dरयà¥\8bà¤\97शालावà¥\88शिषà¥\8dà¤\9fà¥\8dयमà¥\8d",
+       "prefs-user-pages": "यà¥\8bà¤\9cतपà¥\83षà¥\8dठानि",
+       "prefs-personal": "यà¥\8bà¤\9cà¤\95सà¥\8dय à¤µà¤¿à¤µà¤°à¤£à¤®à¥\8d",
        "prefs-rc": "सद्यो जातानि परिवर्तनानि",
-       "prefs-watchlist": "निरà¥\80à¤\95à¥\8dषासà¥\82à¤\9aà¥\80",
-       "prefs-watchlist-days": "दà¥\83षà¥\8dà¤\9fि à¤¸à¥\82à¤\9aà¥\80 à¤¦à¤°à¥\8dशनारà¥\8dथà¥\87  à¤¦à¤¿à¤µà¤¸à¤¾à¤¨à¤¿",
-       "prefs-watchlist-days-max": "अधिकतमानि $1 {{PLURAL:$1|दिनानि}}",
-       "prefs-watchlist-edits": "विसà¥\8dतà¥\83तावलà¥\8bà¤\95नावलà¥\8dयाà¤\82 à¤ªà¥\8dरदरà¥\8dशयितà¥\81मà¥\8d à¤\85तà¥\8dयधिà¤\95परिवरà¥\8dतनानि à¥¤",
-       "prefs-watchlist-edits-max": "अधिकतम संख्या: १०००",
-       "prefs-watchlist-token": "à¤\85वलà¥\8bà¤\95नावलà¥\8dयाà¤\83 à¤ªà¥\8dरतà¥\80à¤\95à¤\83 à¥¤",
-       "prefs-misc": "विविधà¤\83",
+       "prefs-watchlist": "à¤\85वà¥\87à¤\95à¥\8dषणावलिà¤\83",
+       "prefs-watchlist-days": "à¤\85नà¥\87à¤\95à¥\8dषणावलà¥\8dयाà¤\82 à¤¦à¤°à¥\8dशनियानि à¤¦à¤¿à¤¨à¤¾à¤¨à¤¿ :",
+       "prefs-watchlist-days-max": "$1 अधिकतम{{PLURAL:$1|दिनं|दिनानि}}",
+       "prefs-watchlist-edits": "à¤\85सà¥\8dयाà¤\82 à¤µà¤¿à¤¸à¥\8dतà¥\83त-à¤\85वà¥\87à¤\95à¥\8dषणावलà¥\8dयाà¤\82 à¤ªà¥\8dरदरà¥\8dशयितà¥\81à¤\82 à¤®à¤¹à¤¤à¥\8dतमपरिवरà¥\8dतनानाà¤\82 à¤¸à¤\99à¥\8dà¤\96à¥\8dया :",
+       "prefs-watchlist-edits-max": "अधिकतमसङ्ख्याः : १०००",
+       "prefs-watchlist-token": "à¤\85वà¥\87à¤\95à¥\8dषणावलà¥\8dयाà¤\83 à¤ªà¥\8dरतà¥\80à¤\95à¤\83",
+       "prefs-misc": "विविधमà¥\8d",
        "prefs-resetpass": "कूटशब्दः परिवर्त्यताम्",
-       "prefs-changeemail": "विदà¥\8dयà¥\81नà¥\8dमानपतà¥\8dरसà¤\99à¥\8dà¤\95à¥\87तà¤\82 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतयतà¥\81 à¥¤",
-       "prefs-setemail": "विदà¥\8dयà¥\81नà¥\8dमानपतà¥\8dरसà¤\99à¥\8dà¤\95à¥\87तà¤\82 à¤¯à¥\8bà¤\9cयतà¥\81 à¥¤",
-       "prefs-email": "à¤\87मà¥\87ल à¤µà¥\88à¤\95लà¥\8dपिà¤\95ाः",
+       "prefs-changeemail": "à¤\88-पतà¥\8dरसà¤\99à¥\8dà¤\95à¥\87तà¤\83 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतà¥\8dयतामà¥\8d",
+       "prefs-setemail": "à¤\88-पतà¥\8dरसà¤\99à¥\8dà¤\95à¥\87तà¤\83 à¤²à¤¿à¤\96à¥\8dयतामà¥\8d",
+       "prefs-email": "à¤\88पतà¥\8dर-विà¤\95लà¥\8dपाः",
        "prefs-rendering": "स्वरूपम्",
-       "saveprefs": "सà¤\82रà¤\95à¥\8dषà¥\8dयतामà¥\8d",
-       "restoreprefs": "समà¤\97à¥\8dराà¤\83 à¤µà¥\8dयवसà¥\8dथादय à¤µà¥\8dयवसà¥\8dथानà¥\81सारà¤\82 à¤ªà¥\81नà¤\83 à¤¸à¤\82रà¤\95à¥\8dषà¥\8dयतामà¥\8d",
+       "saveprefs": "रक्ष्यताम्",
+       "restoreprefs": "मà¥\82लवà¥\8dयवसà¥\8dथापनानà¥\81à¤\97à¥\81णà¤\82 (default settings) à¤¸à¤°à¥\8dवà¥\87 à¤µà¤¿à¤\95लà¥\8dपाà¤\83 à¤­à¤µà¤¨à¥\8dतà¥\81 (सरà¥\8dवà¥\87षà¥\81 à¤µà¤¿à¤­à¤¾à¤\97à¥\87षà¥\81)",
        "prefs-editing": "सम्पादनम्",
-       "rows": "पà¤\82à¤\95à¥\8dति",
-       "columns": "à¤\85ध: à¤ªà¤\82à¤\95à¥\8dतà¥\8dयाà¤\83",
+       "rows": "पà¤\99à¥\8dà¤\95तयà¤\83 :",
+       "columns": "सà¥\8dतमà¥\8dभाà¤\83 :",
        "searchresultshead": "अन्वेषणम्",
-       "stub-threshold": "<a href=\"#\" class=\"stub\">आधारानुबन्धानां </a>अधिकतमाकारः ।",
+       "stub-threshold": "<a href=\"#\" class=\"stub\">stub link</a> इत्यस्य प्रारूपणस्य (formatting) कृते प्रारम्भिकसोपान formatting (bytes):",
        "stub-threshold-disabled": "निष्क्रियः",
-       "recentchangesdays": "दिवसानि पर्यन्तो सद्यावधि-परिवर्तनानि दृश्यतु:",
-       "recentchangesdays-max": "अधिकतम $1 {{PLURAL:$1|दिवसः|दिवसानि}}",
-       "recentchangescount": "सम्पादन संख्यकानि व्यवस्थानुसारेण दृश्यतु:",
-       "prefs-help-recentchangescount": "अत्र सद्यः परिवर्तनानि, पुटेतिहासाः, प्रवेशाः च अन्तर्गताः ।",
-       "savedprefs": "आद्यताः संरक्षिताः ।",
-       "timezonelegend": "समय मण्डल:",
-       "localtime": "स्थानीय समय:",
-       "timezoneuseserverdefault": "विकिनिश्चितं ($1) उपयुज्यताम् ।",
-       "timezoneuseoffset": "अन्ये (समयान्तरं निर्दिशतु )",
-       "servertime": "वितारकसमयः ।",
-       "guesstimezone": "जालदर्शिकातः पूरयतु ।",
-       "timezoneregion-africa": "कालद्वीप",
+       "recentchangesdays": "नूतनपरिवर्तनेषु प्रदर्शनीयानि दिनानि :",
+       "recentchangesdays-max": "$1 अधिकतम{{PLURAL:$1|दिनं|दिनानि}}",
+       "recentchangescount": "फलकेषु सामान्यतया यानि परिवर्तनानि अभवन्, तेषां सङ्ख्या :",
+       "prefs-help-recentchangescount": "अत्र नूतनपरिवर्तनानि, पृष्ठेतिहासः, संरक्षितावल्यश्च अन्तर्भवन्ति ।",
+       "prefs-help-watchlist-token2": "भवतः/भवत्याः अवेक्षणावल्याः वेब-करस्य (web feed) गुप्तकुञ्चिका अस्त्येषा । \nएषा कुञ्चिका यस्य पार्श्वे भविष्यति, सः तव अवेक्षणावलिं द्रष्टुं प्रभविष्यति । अतः एनां गुप्ततया स्थाप्यताम् ।\n[[Special:ResetTokens|गुप्तकुञ्चिकां परिवर्तयितुम् अत्र नुद्यताम् ।]]।",
+       "savedprefs": "भवतः/भवत्याः इष्टतमानि रक्षितानि ।",
+       "timezonelegend": "समयवलयः (time zone) :",
+       "localtime": "स्थानीयसमय:",
+       "timezoneuseserverdefault": "विकि-मूलविकल्पान् स्थापयन्तु ($1)",
+       "timezoneuseoffset": "अन्यम् (समयान्तरं निर्दिशतु )",
+       "servertime": "वितरकसमयः :",
+       "guesstimezone": "गवेक्षणे पूरयतु",
+       "timezoneregion-africa": "कालद्वीपः",
        "timezoneregion-america": "अमेरिका",
-       "timezoneregion-antarctica": "à¤\85à¤\82टार्कटिका",
+       "timezoneregion-antarctica": "à¤\85णà¥\8dटार्कटिका",
        "timezoneregion-arctic": "आर्कटिक",
-       "timezoneregion-asia": "जम्बुमहाद्वीप",
-       "timezoneregion-atlantic": "à¤\8fà¤\9fलाà¤\82à¤\9fिà¤\95 à¤®à¤¹à¤¾à¤¸à¤¾à¤\97र",
+       "timezoneregion-asia": "जम्बुमहाद्वीप",
+       "timezoneregion-atlantic": "à¤\8fà¤\9fलाणà¥\8dà¤\9fिà¤\95-महासाà¤\97रà¤\83",
        "timezoneregion-australia": "ऑस्ट्रेलिया",
        "timezoneregion-europe": "यूरोप",
-       "timezoneregion-indian": "हिंद महासागर",
-       "timezoneregion-pacific": "प्रशांत महासागर",
-       "allowemail": "अन्योपयोजकानां विद्युन्मानसङ्केतं निष्कियं करोतु ।",
-       "prefs-searchoptions": "अन्वेषणविकल्पाः",
-       "prefs-namespaces": "नामाकाशः :",
-       "defaultns": "अन्यथा एतेषु नामाकाशेषु अन्विषतु ।",
-       "default": "यदभावे",
-       "prefs-files": "सञ्चिका",
-       "prefs-custom-css": "सि.एस्.एस्.रचयतु ।",
-       "prefs-custom-js": "जावालिपिं रचयतु ।",
-       "prefs-common-css-js": "सर्वावरणानां कृते विभक्त सि.एस्.एस्./ जावालिपिः ।",
-       "prefs-reset-intro": "आद्यतानां पुनर्निदेशार्थम् एतत्पुटम् उपयोक्तुं शकोति । एतत् अकृतं न भवति ।",
-       "prefs-emailconfirm-label": "विद्युन्मानसङ्केतस्य दृढीकरणम् ।",
-       "youremail": "ई-पत्रसङ्केतः",
-       "username": "योजकनामन्:",
-       "uid": "प्रयोक्तृ-क्रमांकः :",
-       "prefs-memberingroups": "{{PLURAL:$1|समूहस्य|समूहानां}}  सदस्यः:",
-       "prefs-registration": "पंजीकरण कालः:",
-       "yourrealname": "वास्तविकनाम:",
-       "yourlanguage": "भाषा:",
-       "yourvariant": "भाषासामग्रीणां संस्करणम् ।",
+       "timezoneregion-indian": "हिन्द-महासागरः",
+       "timezoneregion-pacific": "प्रशान्त-महासागरः",
+       "allowemail": "अन्ययोजकैः प्रेषितानि ई-पत्राणि अनुमतिं ददातु",
+       "prefs-searchoptions": "अन्विष्यताम्",
+       "prefs-namespaces": "नामाकाशाः",
+       "defaultns": "अन्यथा एतेषु नामाकाशेषु अन्विषतु :",
+       "default": "पूर्वनिर्दिष्टम्",
+       "prefs-files": "सञ्चिका:",
+       "prefs-custom-css": "स्वानुकुलसम्पादितं CSS",
+       "prefs-custom-js": "स्वानुकुलसम्पादितं JavaScript",
+       "prefs-common-css-js": "सर्वासां त्वचां (of skins) कृते CSS/JavaScript:",
+       "prefs-reset-intro": "भवान्/भवती अस्य पृष्ठस्य साहाय्येन स्वस्य इष्टतमविकल्पान् मूलविकि-विकल्पसदृशं स्थापयितुं (कर्तुं) शक्नोति ।\nपरन्तु ततः भवान्/भवती पूर्ववत् स्थितिं प्राप्तुं न शक्ष्यति ।",
+       "prefs-emailconfirm-label": "ई-पत्रं दृढीक्रियताम् :",
+       "youremail": "ई-पत्रसङ्केतः :",
+       "username": "{{GENDER:$1|योजकनाम}} :",
+       "prefs-memberingroups": "{{PLURAL:$1|समूहस्य|समूहानां}} {{GENDER:$2|सदस्यः/सदस्याः}} :",
+       "prefs-registration": "पञ्जीकरणस्य कालः :",
+       "yourrealname": "वास्तविकनाम :",
+       "yourlanguage": "भाषा :",
+       "yourvariant": "भाषायाः सामग्रीवैविध्यम् :",
        "prefs-help-variant": " विक्यां प्रदर्शितुं भवति ।",
-       "yournick": "नà¥\82तनाà¤\83 à¤¹à¤¸à¥\8dताà¤\95à¥\8dषराà¤\83:",
-       "prefs-help-signature": "सà¤\82भाषणपà¥\83षà¥\8dठà¤\97ताà¤\83 à¤¸à¤\82वादाà¤\83 \"<nowiki>~~~~</nowiki>\" à¤\87ति à¤²à¤¿à¤\96ितà¥\8dवा à¤¹à¤¸à¥\8dताà¤\95à¥\8dषरà¥\8bपà¥\87ताà¤\83 à¤\95रà¥\8dतà¥\8dतवà¥\8dयाà¤\83। à¤\8fतानि à¤\9aिहà¥\8dनानि à¤ªà¥\83षà¥\8dठरà¤\95à¥\8dषणपशà¥\8dà¤\9aातà¥\8d à¤­à¤µà¤¤à¤\83 à¤¹à¤¸à¥\8dताà¤\95à¥\8dषरानà¥\8d à¤¸à¤®à¤¯à¤®à¥\81दà¥\8dराà¤\82 à¤\9a à¤ªà¥\8dरदरà¥\8dशयिषà¥\8dयनà¥\8dति।",
-       "badsig": "à¤\85मानà¥\8dयाà¤\83 (तà¥\8dरà¥\81à¤\9fिपà¥\82रà¥\8dणाà¤\83) à¤¹à¤¿ à¤\8fतà¥\87 à¤\85पà¤\95à¥\8dवाà¤\83 à¤¹à¤¸à¥\8dताà¤\95à¥\8dषराà¤\83।\nà¤\8fà¤\9aà¤\9fà¥\80à¤\8fमà¤\8fलà¥\8d-à¤\9fà¥\88à¤\97 à¤\87तà¥\8dयà¥\87तानि à¤ªà¥\81नरà¥\80à¤\95à¥\8dषितवà¥\8dयानि à¤­à¤µà¤¤à¤¾।",
-       "badsiglength": "भवतà¤\83 à¤¹à¤¸à¥\8dताà¤\95à¥\8dषराà¤\83 à¤¤à¥\81 à¤\85तà¥\80व à¤¦à¥\80रà¥\8dà¤\98ाà¤\83।\nà¤\8fतà¥\87 $1 {{PLURAL:$1|à¤\85à¤\95à¥\8dषरातà¥\8d|à¤\85à¤\95à¥\8dषरà¥\87भà¥\8dयà¤\83}} à¤¦à¥\80रà¥\8dà¤\98ाà¤\83 à¤¨ à¤­à¤µà¤¿à¤¤à¤µà¥\8dयाà¤\83।",
-       "yourgender": "लिà¤\82à¤\97मà¥\8d (Gender):",
-       "gender-unknown": "à¤\85निरà¥\8dदिषà¥\8dà¤\9fमà¥\8d",
-       "gender-male": "पà¥\81रà¥\81ष",
-       "gender-female": "सà¥\8dतà¥\8dरà¥\80",
-       "prefs-help-gender": "वà¥\88à¤\95लà¥\8dपिà¤\95à¤\83 : à¤\85यà¤\82 à¤¤à¤¨à¥\8dतà¥\8dराà¤\82शà¤\83 à¤²à¤¿à¤\99à¥\8dà¤\97ानà¥\81सारसमà¥\8dबà¥\8bधनसà¥\8dय à¤\89पयà¥\8bà¤\9cà¤\95à¤\83 ।",
-       "email": "विदà¥\8dयà¥\81तà¥\8dपतà¥\8dरवà¥\8dयवसà¥\8dथा",
-       "prefs-help-realname": "निà¤\9cनामधà¥\87यसà¥\8dय à¤\89लà¥\8dलà¥\87à¤\96à¤\83 à¤\86वशà¥\8dयà¤\95à¤\83 à¤¨à¤¾à¤¸à¥\8dति à¥¤ \nयदि à¤¦à¤¦à¤¾à¤¤à¤¿ à¤¤à¤°à¥\8dहि à¤\85सà¥\8dय à¤ªà¥\8dरयà¥\8bà¤\97à¤\83 à¤­à¤µà¤¤à¤\83 à¤¯à¥\8bà¤\97दानारà¥\8dथà¤\82 à¤­à¤µà¤¤à¥\87 à¤¶à¥\8dरà¥\87यà¤\82 à¤¦à¤¾à¤¤à¥\81मà¥\8d à¤\89पयà¥\81à¤\95à¥\8dतà¤\83 à¤­à¤µति ।",
+       "yournick": "नà¥\82तनहसà¥\8dताà¤\95à¥\8dषरमà¥\8d :",
+       "prefs-help-signature": "समà¥\8dभाषणपà¥\83षà¥\8dठà¥\87षà¥\81 à¤\9fिपà¥\8dपणà¥\80à¤\82 à¤²à¤¿à¤\96ितà¥\8dवा à¤\85नà¥\8dतà¥\87 \"<nowiki>~~~~</nowiki>\" à¤²à¤¿à¤\96तà¥\81 à¥¤ à¤\85नà¥\87न à¤¸à¥\8dवसà¥\8dय à¤¹à¤¸à¥\8dताà¤\95à¥\8dषरà¥\87ण à¤¸à¤¹ à¤\9fिपà¥\8dपणà¥\80लà¥\87à¤\96नà¤\95ालसà¥\8dयापि à¤\89लà¥\8dलà¥\87à¤\96à¤\83 à¤­à¤µà¤¿à¤·à¥\8dयति ।",
+       "badsig": "à¤\85यà¥\8bà¤\97à¥\8dयà¤\82 à¤ªà¥\8dरारà¥\82परहितà¤\82 (raw) à¤¹à¤¸à¥\8dताà¤\95à¥\8dषरमà¥\8d à¥¤\nHTML à¤\9aिहà¥\8dनà¤\82 à¤ªà¤¶à¥\8dयतà¥\81 ।",
+       "badsiglength": "हसà¥\8dताà¤\95à¥\8dषरà¤\82 à¤¬à¤¹à¥\81लमà¥\8dबमानमà¥\8d à¤\85सà¥\8dति à¥¤\nहसà¥\8dताà¤\95à¥\8dषरà¤\82 $1 {{PLURAL:$1|à¤\85à¤\95à¥\8dषरातà¥\8d|à¤\85à¤\95à¥\8dषरà¥\87भà¥\8dयà¤\83}} à¤¦à¥\80रà¥\8dà¤\98à¤\82 à¤¨ à¤­à¤µà¥\87तà¥\8d ।",
+       "yourgender": "सà¥\8dवपरिà¤\9aयà¤\82 à¤\95थà¤\82 à¤¦à¤¾à¤¤à¥\81मà¥\8d à¤\87à¤\9aà¥\8dà¤\9bति ?",
+       "gender-unknown": "सà¥\8dवपरिà¤\9aयà¤\82 à¤¦à¤¾à¤¤à¥\81à¤\82 à¤¨à¥\87à¤\9aà¥\8dà¤\9bामि",
+       "gender-male": "सà¤\83 à¤µà¤¿à¤\95ि-पà¥\83षà¥\8dठानि à¤¸à¤®à¥\8dपादयति",
+       "gender-female": "सा à¤µà¤¿à¤\95ि-पà¥\83षà¥\8dठानि à¤¸à¤®à¥\8dपादयति",
+       "prefs-help-gender": "à¤\8fततà¥\8d à¤µà¤¿à¤µà¤°à¤£à¤®à¥\8d à¤\90à¤\9aà¥\8dà¤\9bिà¤\95मà¥\8d à¤\85सà¥\8dति à¥¤ à¤\8fतसà¥\8dमिनà¥\8d à¤¤à¤¨à¥\8dतà¥\8dराà¤\82शà¥\87\nलिà¤\99à¥\8dà¤\97ाधारà¥\87ण à¤­à¤µà¤¤à¤\83/भवतà¥\8dयाà¤\83 à¤¸à¤®à¥\8dबà¥\8bधनारà¥\8dथमà¥\8d à¤\85सà¥\8dयà¥\8bपयà¥\8bà¤\97à¤\83 à¤­à¤µà¤¤à¤¿ à¥¤\nà¤\8fततà¥\8d à¤µà¤¿à¤µà¤°à¤£à¤\82 à¤¸à¤¾à¤°à¥\8dवà¤\9cनिà¤\95à¤\82 à¤­à¤µà¤¿à¤·à¥\8dयति ।",
+       "email": "à¤\88-पतà¥\8dरमà¥\8d",
+       "prefs-help-realname": "वासà¥\8dतविà¤\95नाम à¤\90à¤\9aà¥\8dà¤\9bà¤\95मà¥\8d à¤\85सà¥\8dति à¥¤ à¤­à¤µà¤¾à¤¨à¥\8d/भवतà¥\80 à¤\8fनà¤\82 à¤µà¤¿à¤\95लà¥\8dपà¤\82 à¤¸à¤®à¤°à¥\8dथयति à¤\9aà¥\87तà¥\8d, à¤­à¤µà¤¤à¤\83/भवतà¥\8dयाà¤\83 à¤¯à¥\8bà¤\97दानशà¥\8dरà¥\87यसà¥\8dय à¤\89लà¥\8dलà¥\87à¤\96समयà¥\87 à¤\85सà¥\8dय à¤\89पयà¥\8bà¤\97à¤\83 à¤­à¤µà¤¿à¤·à¥\8dयति ।",
        "prefs-help-email": "ई-पत्रसङ्केतः अनिवार्यः नास्ति । किन्तु कूटशब्दः विस्मर्यते चेत् तस्य परिवर्तनाय आवश्यकः भवति ।",
        "prefs-help-email-others": "योजकपृष्ठ-सम्भाषणपृष्ठयोः माध्यमेन,  ई-पत्रमाध्यमेन वा अन्ये योजकाः भवतः/भवत्याः सम्पर्कं कर्तुं शक्नुयुः ।\nसम्पर्केऽस्मिन् भवतः/भवत्याः ई-पत्रसङ्केतम् अन्ययोजकाः ज्ञातुं न प्रभवतन्ति ।",
-       "prefs-help-email-required": "विदà¥\8dयà¥\81नà¥\8dमानपतà¥\8dरसà¤\99à¥\8dà¤\95à¥\87तà¤\83 à¤\86वशà¥\8dयà¤\95ः ।",
+       "prefs-help-email-required": "à¤\88-पतà¥\8dरसà¤\99à¥\8dà¤\95à¥\87तà¤\83 à¤\85निवारà¥\8dयः ।",
        "prefs-info": "मूलसूचनाः",
-       "prefs-i18n": "अन्ताराष्ट्रिकरणम् ।",
-       "prefs-signature": "हस्ताक्षर",
+       "prefs-i18n": "अन्ताराष्ट्रिकरणम्",
+       "prefs-signature": "हस्ताक्षरम्",
        "prefs-dateformat": "दिनाङ्कस्य प्रारूपः",
-       "prefs-timeoffset": "समयान्तरम् ।",
-       "prefs-advancedediting": "उन्नतविकल्पाः",
-       "prefs-advancedrc": "उन्नतविकल्पाः",
-       "prefs-advancedrendering": "उन्नतविकल्पाः",
-       "prefs-advancedsearchoptions": "उन्नतविकल्पाः",
-       "prefs-advancedwatchlist": "उन्नतविकल्पाः",
-       "prefs-displayrc": "प्रदर्शनविकल्पाः",
-       "prefs-displaysearchoptions": "प्रदर्शनविकल्पाः",
-       "prefs-displaywatchlist": "प्रदर्शनविकल्पाः",
+       "prefs-timeoffset": "समयान्तरम्",
+       "prefs-advancedediting": "सामान्यविकल्पाः",
+       "prefs-editor": "योजकः",
+       "prefs-preview": "प्राग्दृश्यम्",
+       "prefs-advancedrc": "विशेषविकल्पाः",
+       "prefs-advancedrendering": "विशेषविकल्पाः",
+       "prefs-advancedsearchoptions": "विशेषविकल्पाः",
+       "prefs-advancedwatchlist": "विशेषविकल्पाः",
+       "prefs-displayrc": "प्रदर्शन-विकल्पाः",
+       "prefs-displaywatchlist": "प्रदर्शन-विकल्पाः",
+       "prefs-tokenwatchlist": "स्तोकम् (token)",
        "prefs-diffs": "अन्तरम्",
-       "email-address-validity-valid": "प्रयुक्तः विद्युन्मानपत्रसङ्केतः मानितः ।",
-       "email-address-validity-invalid": "मान्यः विद्युन्मानपत्रसङ्केतः योजनीयः ।",
-       "userrights": "योजकाधिकारस्य प्रबन्धनम् ।",
-       "userrights-lookup-user": "योजकसमूहं प्रबन्धयतु ।",
-       "userrights-user-editname": "योजकनाम योजयतु ।",
-       "editusergroup": "योजकसमूहं सम्पादयतु ।",
-       "editinguser": "'''[[User:$1|$1]]''' $2 इति योजकस्य योजकाधिकारः परिवर्त्यते ।",
-       "userrights-editusergroup": "योजकसमूहं सम्पादयतु ।",
-       "saveusergroups": "योजकसमूहं संरक्षतु ।",
-       "userrights-groupsmember": "अस्य सदस्यः  ।",
-       "userrights-groupsmember-auto": "अस्य निश्चितसदस्यः ।",
-       "userrights-groups-help": "अस्य सदस्यस्य समूहसदस्यत्वं परिवर्तयितुं शक्यते । \n* मञ्जूषा अङ्किता चेत् योजकः अस्य समूहस्य सदस्यः अस्ति ।\n* मञ्जूषा अनङ्किता चेत् योजकः अस्य समूहस्य सदस्यः न \n* कदाचित् भवता समूहः योजितः चेत् अपनेतुं नैव शक्नोति इति * चिह्नं सूचयति ।",
+       "prefs-help-prefershttps": "आगामिप्रेवेशकाले एतत् परिवर्तनं सक्रियं भवष्यति ।",
+       "prefs-tabs-navigation-hint": "परामर्शः : पट्टीकयोः (tabs) मध्ये गमनागमनं कर्तुं भवान्/भवती वामतीरकुड्मलस्य, दक्षिणतीरकुण्मलस्य च उपयोगं कर्तुं शक्नोति ।",
+       "email-address-validity-valid": "ई-पत्रसङ्केतः मान्यः अस्ति इति प्रतियते",
+       "email-address-validity-invalid": "मान्यः ई-पत्रसङ्केतः लिख्यताम्",
+       "userrights": "योजकाधिकारस्य प्रबन्धनम्",
+       "userrights-lookup-user": "योजकसमूहस्य प्रबन्धनं करोतु",
+       "userrights-user-editname": "प्रयोक्तृनाम दीयताम्",
+       "editusergroup": "योजकसमूहः सम्पाद्यताम्",
+       "editinguser": "'''[[User:$1|$1]]''' इत्यस्य योजकस्य योजकाधिकारः परिवर्त्यते । $2",
+       "userrights-editusergroup": "योजकसमूहः सम्पाद्यताम्",
+       "saveusergroups": "योजकसमूहः रक्ष्यताम्",
+       "userrights-groupsmember": "अस्य सदस्यः :",
+       "userrights-groupsmember-auto": "निम्न{{PLURAL:$1|समूहस्य|समूहानाम्}} अन्तर्निहिः सदस्यः :",
+       "userrights-groups-help": "अस्य सदस्यस्य समूहसदस्यत्वं परिवर्तयितुं शक्यते । \n* अङ्कनपेटिका (check box) अङ्किता चेत्, योजकः अस्य समूहस्य सदस्यः अस्ति ।\n* अङ्कनपेटिका अनङ्किता चेत्, योजकः अस्य समूहस्य सदस्यः नास्ति ।\n* एकवारं समूहः योजितः अपाकृतः वा चेत्, पुनः पूर्ववत् कर्तुं न शक्यते इति * चिह्नं सूचयति ।",
        "userrights-reason": "कारणम् :",
-       "userrights-no-interwiki": "अन्यविकिषु योजकाधिकारं सम्पादयितुं ते अनुमतिः नास्ति ।",
-       "userrights-nodatabase": "$1 मूलपाठाः न सन्ति अथवा स्थानीयाः ।",
-       "userrights-nologin": "[[Special:UserLogin|log in]] प्रशासकस्थानेन प्रविश्य योजकाधिकारान् निर्देष्टुं शक्नोति ।",
-       "userrights-notallowed": "योजकाधिकारान् अपनेतुं ते स्थानस्य अनुमतिः नास्ति ।",
-       "userrights-changeable-col": "परिवर्तनार्हाः समूहाः ।",
-       "userrights-unchangeable-col": "परिवर्तनार्हाः समूहाः ।",
+       "userrights-no-interwiki": "अन्यविकि-जालस्थानेषु योजकाधिकारं सम्पादयितुं ते अनुमतिः नास्ति ।",
+       "userrights-nodatabase": "$1 दत्तांशनिधिः न विद्यते । अथवा तु सः स्थानीयः नास्ति ।",
+       "userrights-nologin": "योजकान् अधिकारं दातुं प्रबन्धकत्वेन प्रवेशः आवश्यकः । [[Special:UserLogin|प्रविश्यताम्]]",
+       "userrights-notallowed": "योजकेभ्यः अधिकारं दातम्, अपाकर्तुं च ते अनुमतिः नास्ति ।",
+       "userrights-changeable-col": "परिवर्तनार्हाः समूहाः",
+       "userrights-unchangeable-col": "परिवर्तनम् अनर्हाः समूहाः",
+       "userrights-conflict": "सदस्याधिकारस्य परिवर्तनेषु अन्तर्विरोधः अस्ति ! कृपया स्वकृतानि परिवर्तनानि पुनरवलोक्य संरक्ष्यताम् ।",
+       "userrights-removed-self": "भवता/भवत्या सफलतया स्वाधिकाराः अपाकृताः । अतः भवान्/भवती एतत् पृष्ठं द्रष्टुं न प्रभवति ।",
        "group": "समूहः :",
-       "group-user": "योजकः",
-       "group-autoconfirmed": "स्वदृढितयोजकाः ।",
-       "group-bot": "सà¥\8dवयà¤\82 à¤¸à¤\95à¥\8dरियाà¤\83 à¥¤",
-       "group-sysop": "पà¥\8dरबà¤\82धकाः",
-       "group-bureaucrat": "सà¥\8dवयमà¥\8d à¤\85धिà¤\95ारिणà¤\83 à¥¤",
-       "group-suppress": "अलक्ष्यम् ।",
+       "group-user": "यà¥\8bà¤\9cà¤\95ाà¤\83",
+       "group-autoconfirmed": "स्वदृढितयोजकाः",
+       "group-bot": "बà¥\89à¤\9fà¥\8dसà¥\8d",
+       "group-sysop": "पà¥\8dरबनà¥\8dधकाः",
+       "group-bureaucrat": "à¤\85धिà¤\95ारिणà¤\83",
+       "group-suppress": "अलक्ष्यम्",
        "group-all": "(सर्वे)",
-       "group-user-member": "{{GENDER:$1|योजक}}",
-       "group-autoconfirmed-member": "{{GENDER:$1|सà¥\8dवसà¥\8dथानदà¥\83ढितà¤\83 योजकः}}",
-       "group-bot-member": "{{GENDER:$1|सà¥\8dवयà¤\82 à¤¸à¤\95à¥\8dरियà¤\83}}",
-       "group-sysop-member": "{{GENDER:$1|पà¥\8dरशासकः}}",
-       "group-bureaucrat-member": "{{GENDER:$1|सà¥\8dवयमà¥\8d à¤\85धिà¤\95ारà¥\80}}",
+       "group-user-member": "{{GENDER:$1|योजक}}",
+       "group-autoconfirmed-member": "{{GENDER:$1|सà¥\8dवदà¥\83ढितयोजकः}}",
+       "group-bot-member": "{{GENDER:$1|बà¥\89à¤\9fà¥\8d}}",
+       "group-sysop-member": "{{GENDER:$1|पà¥\8dरबनà¥\8dधकः}}",
+       "group-bureaucrat-member": "{{GENDER:$1|अधिकारी}}",
        "group-suppress-member": "{{GENDER:$1|अलक्ष्यम्}}",
-       "grouppage-user": "{{ns:project}}:योजक",
-       "grouppage-autoconfirmed": "{{ns:project}}: स्वयंदृढितयोजकाः ।",
-       "grouppage-bot": "{{ns:project}}: स्वयंसक्रियाः।",
-       "grouppage-sysop": "{{ns:project}}:प्रचालकाः",
-       "grouppage-bureaucrat": "{{ns:project}}: स्वयम् अधिकारिणः ।",
-       "grouppage-suppress": "{{ns:project}}: अक्ष्यम् ।",
-       "right-read": "पुटानि पठतु ।",
-       "right-edit": "पुटसम्पादनं करोतु ।",
-       "right-createpage": "पुटनिर्माणं करोतु ।(यानि चर्च्यानि न सन्ति)",
-       "right-createtalk": "चर्च्यपुटानां निर्माणं करोतु ।",
-       "right-createaccount": "नूतनयोजकस्थानं निर्मातु ।",
-       "right-minoredit": "सम्पादनं लघुचिह्नया निर्दिशतु ।",
-       "right-move": "पुटं चालयतु ।",
-       "right-move-subpages": "उपपुटैः सह पुटं चालयतु ।",
-       "right-move-rootuserpages": "मूलयोजकपुटानि चालयतु ।",
-       "right-movefile": "सञ्चिकाः चालयतु ।",
-       "right-suppressredirect": "पुटचालनावसरे मूलपुटेभ्यः पुनर्निदेशं न सृजतु ।",
-       "right-upload": "सञ्चिकाः उत्तारयतु ।",
-       "right-reupload": "स्थितसञ्चिकाः पुनर्लिखतु ।",
-       "right-reupload-own": "एकेन उत्तारितसञ्चिकाः पुनर्लिखतु ।",
-       "right-reupload-shared": "विभक्तमाध्यमकोशगतसञ्चिकाः अतिसञ्चरतु ।",
-       "right-upload_by_url": "अन्तर्जालस्थानात् सञ्चिकाः उत्तारयतु ।",
-       "right-purge": "दृढतारहितपुटस्य क्षेत्राधारं पुनातु ।",
-       "right-autoconfirmed": "अल्परक्षितपुटनि सम्पादयतु ।",
-       "right-bot": "स्वचालितप्रक्रियाः इव उपचारितः भवतु ।",
-       "right-nominornewtalk": "चर्चापुटानां लघुसम्पादनं न भवतु । नूतनसन्देशान् चोदयतु ।",
-       "right-apihighlimits": "API प्रश्नेषु उन्नतसीमम् उपयोजयतु ।",
-       "right-writeapi": "श्वेतं API उपयोगः ।",
-       "right-delete": "पुटानि परिमार्जयतु ।",
-       "right-bigdelete": "दीर्घेतिहासयुक्तपुटानि परिमार्जयतु ।",
-       "right-deletelogentry": "निर्दिष्टनामाभिलेकप्रवेशं परिमार्जयतु अपरिमार्जयतु च ।",
-       "right-deleterevision": "निर्दिष्टावरतरणस्य पुटानि अपमर्जतु, अनपमर्जतु ।",
-       "right-deletedhistory": " तत्सम्बद्धपाठैः विनाअपमर्जितेतिहासप्रवेशस्य दर्शनम् ।",
-       "right-deletedtext": "अपमर्जितावतरणेषु परिवर्तनं, अपमर्जितपाठान् च अवलोकयतु ।",
-       "right-browsearchive": "अपमर्जितपुटानि अन्विषतु ।",
-       "right-undelete": "पुटम् अनपमर्जतु ।",
-       "right-suppressrevision": "प्रशासकेभ्यः सङ्गुप्तावतरणानि पुनरालोक्य पुनरानयतु ।",
-       "right-suppressionlog": "स्वायत्तनामाबिलेखं पश्यतु ।",
-       "right-block": "अन्ययोजकान् सम्पादनेन अवरोधतु ।",
-       "right-blockemail": "योजकस्य विद्युन्मानसन्देशप्रेषणम् अवरोधतु ।",
-       "right-hideuser": "योजकनाम अवरोधतु । तेन सर्वजनोपयोगात् गोपयतु ।",
-       "right-ipblock-exempt": "IP अवरोधं मार्गयतु, स्वयम् अवरोधः, निर्दिष्टावरोधः ।",
-       "right-proxyunbannable": "अन्येषां स्वयंचालितावरोधं परिहरतु ।",
-       "right-unblockself": "स्वयम् अनवरोधं करोतु ।",
-       "right-protect": "सुरक्षास्तरान् परिवर्तयतु । सुरक्षितपुटानि सम्पादयतु ।",
-       "right-editprotected": "सुरक्षितपुटानि सम्पादयतु ।",
-       "right-editinterface": "योजकमाध्यमं सम्पादयतु ।",
-       "right-editusercssjs": "अन्ययोजकान् सम्पादयतु । सि.एस्.एस्. जावलालिपिसञ्चिकाः च ।",
-       "right-editusercss": "अन्ययोजकान् सम्पादयतु सि.एस्.एस्. सञ्चिकाः ।",
-       "right-edituserjs": "अन्ययोजकान सम्पादयतु जावालिपिसञ्चिकाः ।",
+       "grouppage-user": "{{ns:project}}:योजकाः",
+       "grouppage-autoconfirmed": "{{ns:project}}:स्वदृढितयोजकाः",
+       "grouppage-bot": "{{ns:project}}:बॉट्स्",
+       "grouppage-sysop": "{{ns:project}}:प्रबन्धकाः",
+       "grouppage-bureaucrat": "{{ns:project}}:अधिकारिणः",
+       "grouppage-suppress": "{{ns:project}}:अलक्ष्यम्",
+       "right-read": "पृष्ठानि पठ्यताम्",
+       "right-edit": "पृष्ठानि सम्पाद्यताम्",
+       "right-createpage": "पृष्ठानि निर्मियताम् ।(येषां सम्भाषणपृष्ठं न स्यात् ।)",
+       "right-createtalk": "सम्भाषणपृष्ठानि निर्मियताम्",
+       "right-createaccount": "नूतनप्रयोक्तृवृत्तान्तं रच्यताम्",
+       "right-minoredit": "लघुसम्पादनत्वेन अङ्कितं करोतु",
+       "right-move": "पृष्ठं चाल्यताम्",
+       "right-move-subpages": "उपपृष्ठैः सह पृष्ठं चालयतु",
+       "right-move-rootuserpages": "मूलयोजकपुष्ठानि चाल्यताम्",
+       "right-move-categorypages": "वर्गपृष्ठानि चाल्यताम्",
+       "right-movefile": "सञ्चिकाः चाल्यताम्",
+       "right-suppressredirect": "पृष्ठं यदा चालयति, तदा मूलपृष्ठात् प्रतिप्रेषणं मास्तु ।",
+       "right-upload": "उपारोहण(upload)सञ्चिकाः",
+       "right-reupload": "वर्तमानसञ्चिकाः नवीनसञ्चिकाभिः परिवर्त्यताम्",
+       "right-reupload-own": "अन्येन उपारोहिताः (upload) सञ्चिकाः नवीनसञ्चिकाभिः परिवर्त्यताम्",
+       "right-reupload-shared": "विभक्तमाध्यमेन (shared media) स्थानीय-उपारोहिताः सञ्चिकाः नवीनसञ्चाकाभिः परिवर्त्यताम्",
+       "right-upload_by_url": "सर्वासङ्केतात् (URL) उपारोहिताः सञ्चिकाः",
+       "right-purge": "पृष्ठस्य उपस्मृतिं (cache) रिक्तीक्रियताम्",
+       "right-autoconfirmed": "सार्वसङ्केत()आधारितेन मूल्यनियन्त्रणेन सह अस्य सम्बन्धः नास्ति",
+       "right-bot": "स्वसञ्चालितप्रणालित्वेन एतां स्वीक्रियताम्",
+       "right-nominornewtalk": "सम्भाषणपृष्ठस्य लघुपरिवर्तनानां विषये मा सूच्यताम्",
+       "right-apihighlimits": "API प्रश्नेषु उन्नतसीमाः उपयोज्यताम्",
+       "right-writeapi": "योग्यस्य API इत्यस्य उपयोगं करोतु",
+       "right-delete": "पृष्ठानि अपाक्रियताम्",
+       "right-bigdelete": "दीर्घेतिहासयुक्तपृष्ठानि अपाक्रियताम्",
+       "right-deletelogentry": "योग्यसंरक्षितावल्याः निवेशान् (entries) अपाक्रियताम्, अनपाक्रियतां च",
+       "right-deleterevision": "योग्यपृष्ठस्य संस्करणानि अपाक्रियताम्",
+       "right-deletedhistory": "अपाकृत-निवेशानाम् इतिहासं पश्यतु (तत्सम्बद्धपाठं विना)",
+       "right-deletedtext": "अपाकृतपाठाः, अपाकृतसंस्करणयोः परिवर्तनानि च पश्यतु",
+       "right-browsearchive": "अपाकृतपृष्ठानि अन्विष्यताम्",
+       "right-undelete": "इदं पृष्ठं न अपाक्रियताम्",
+       "right-suppressrevision": "प्रबन्धकैः निगूढितानि संस्करणानि पुनःपश्यतु, पुनस्थापयतु च",
+       "right-suppressionlog": "वैयक्तिकसंस्करणानि दृश्यताम्",
+       "right-block": "अस्य योजकस्य सम्पादनानि अवरुध्यताम्",
+       "right-blockemail": "ई-पत्रप्रेषयितुम् एनं योजकम् अवरुद्ध्यताम्",
+       "right-hideuser": "प्रयोक्तृनाम अवरुध्यताम्, तत् अन्ययोजकेभ्यः गोप्यतां च",
+       "right-ipblock-exempt": "स्वयम् अवरोधितं, समूहावरोधिम् अन्तर्जालसङ्केतम् (IP) अवगण्य अग्रे गच्छतु",
+       "right-proxyunbannable": "प्रतिनिधीनां (of prxies) स्वयम्-अवरोधान् अवगण्य अग्रे गच्छतु",
+       "right-unblockself": "स्वं अनवरुध्यताम्",
+       "right-protect": "सुरक्षास्तरं परिवर्त्यतां, क्रमबद्धानि सुरक्षितपृष्ठानि सम्पाद्यतां च",
+       "right-editprotected": "\"{{int:protect-level-sysop}}\"-त्वेन संरक्षितानि पृष्ठानि सम्पाद्यताम्",
+       "right-editsemiprotected": "\"{{int:protect-level-autoconfirmed}}\"-त्वेन संरक्षितानि पृष्ठानि सम्पाद्यताम्",
+       "right-editinterface": "योजकमाध्यमं सम्पाद्यताम्",
+       "right-editusercssjs": "अन्यस्य योजकस्य CSS, JavaScript सञ्चिकाः सम्पाद्यताम्",
+       "right-editusercss": "अन्यस्य योजकस्य CSS सञ्चिकाः सम्पाद्यताम्",
+       "right-edituserjs": "अन्यस्य योजकस्य JavaScript सञ्चिकाः सम्पाद्यताम्",
+       "right-editmyusercss": "स्वस्य CSS सञ्चिकाः सम्पाद्यताम्",
+       "right-editmyuserjs": "स्वस्य JavaScript सञ्चिकाः सम्पाद्यताम्",
+       "right-viewmywatchlist": "स्वस्य अवेक्षणावलिः दृष्यताम्",
        "right-rollback": "अन्तिमयोजकस्य सम्पादनं शीघ्रं प्रचालयतु यः निर्दिष्टपुटं सम्पादितवान् ।",
        "right-markbotedits": "प्रतिचालितसम्पादनानि स्वचालितसम्पदनं इव  अङ्कितानिकरोतु ।",
        "right-noratelimit": "मूल्यनियत्या प्रभावितं नस्यात् ।",
        "recentchanges-label-unpatrolled": "एतावता अस्य सम्पादनस्य परिशीलिनं नाभूत् ।",
        "recentchanges-legend-heading": "'''विकल्पविषयकम्'''",
        "rcnotefrom": "<strong>$2</strong> तः आरभ्य (<strong>$1</strong> पर्यन्तं) जातानि परिवर्तनानि अधः प्रदर्शितानि ।",
-       "rclistfrom": "$1 पश्चात् जातानि नूतनानि परिवर्तनानि दृश्यन्ताम्",
+       "rclistfrom": "$3 $2 पश्चात् जातानि नूतनानि परिवर्तनानि दृश्यन्ताम्",
        "rcshowhideminor": "$1 लघुसम्पादनानि",
-       "rcshowhideminor-show": "दरà¥\8dश्यताम्",
+       "rcshowhideminor-show": "दà¥\83श्यताम्",
        "rcshowhideminor-hide": "गोप्यताम्",
        "rcshowhidebots": "$1 बोट् इत्येतानि",
+       "rcshowhidebots-show": "दृश्यताम्",
+       "rcshowhidebots-hide": "गोप्यताम्",
        "rcshowhideliu": "$1 पञ्जीकृताः योजकाः",
+       "rcshowhideliu-show": "दृश्यताम्",
+       "rcshowhideliu-hide": "गोप्यताम्",
        "rcshowhideanons": "अनामकाः योजकाः $1",
        "rcshowhideanons-show": "दृश्यताम्",
+       "rcshowhideanons-hide": "गोप्यताम्",
        "rcshowhidepatr": "$1 ईक्षितसम्पादनानि",
+       "rcshowhidepatr-show": "दृश्यताम्",
+       "rcshowhidepatr-hide": "गोप्यताम्",
        "rcshowhidemine": "$1 मम सम्पादनानि",
+       "rcshowhidemine-show": "दृश्यताम्",
+       "rcshowhidemine-hide": "गोप्यताम्",
        "rclinks": "अन्तिमेषु $2 दिनेषु जातानि अन्तिमानि $1 परिवर्तनानि दृश्यन्ताम् <br />$3",
        "diff": "भेदः",
        "hist": "इतिहासः",
        "uploadstash-refresh": "सञ्चिकावलीं संस्करोतु ।",
        "invalid-chunk-offset": "अमान्यं चङ्क् आफ्सेट्",
        "img-auth-accessdenied": "अभिगमनम् अपलपितम् ।",
-       "img-auth-nopathinfo": "पथसूची विनष्टा ।\nते वितारकः सूचनाः प्रेषयितुं संसिद्धः न ।\nएतत् CGI अवलम्बितं स्यात् अपि च img_auth अनुमोदनं न करोति ।\nSee https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "पथसूची विनष्टा ।\nते वितारकः सूचनाः प्रेषयितुं संसिद्धः न ।\nएतत् CGI अवलम्बितं स्यात् अपि च img_auth अनुमोदनं न करोति ।\nSee https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "सुदृढितायाम् उत्तारणनिदेशिकायाम् अभ्यर्थितपथः नास्ति ।",
        "img-auth-badtitle": "\"$1\"तः मान्यशीर्षिकां निर्मातुं न शक्यते ।",
        "img-auth-nologinnWL": "नामाभिलेखेन न प्रविष्टः अपिच $1 तु श्वेतावली न ।",
        "log-title-wildcard": "अनेन पाठेन आरब्धानि शीर्षकानि अन्विषतु ।",
        "showhideselectedlogentries": "चितप्रवेशावलीः प्रदर्शयतु/गोपयतु ।",
        "allpages": "सर्वाणि पृष्ठानि",
-       "alphaindexline": "$1 तः $2 पर्यन्तम्",
        "nextpage": "($1)अग्रिमपुटम् ।",
        "prevpage": "पूर्वपृष्ठम् ($1)",
        "allpagesfrom": "इत्यस्मात् आरभ्यमाणानि पृष्ठानि दर्श्यन्ताम्:",
        "linksearch-line": " $1 इति $2 इत्यस्मात् परिसन्धितमस्ति",
        "linksearch-error": "वन्यपत्राणि आतिथेयस्य नाम्ना समं केवलं प्रभान्ति ।",
        "listusersfrom": "एतस्मात् आरभमाणान् योजकान् दर्शयतु ।",
-       "listusers-submit": "दरà¥\8dश्यताम्",
+       "listusers-submit": "दà¥\83श्यताम्",
        "listusers-noresult": "योजकः न प्राप्तः ।",
        "listusers-blocked": "अवरुद्धम् ।",
        "activeusers": "सक्रिययोजकानाम् आवली ।",
        "watchlist-details": "सम्भाषणपृष्ठानि विहाय {{PLURAL:$1|$1 पृष्ठं|$1 पृष्ठानि}} भवतः/भवत्याः अवेक्षणाऽऽवलिः ।",
        "wlheader-enotif": "विद्युन्मानपत्रस्य सूचनाः सक्रियाः ।",
        "wlheader-showupdated": "भवतः सन्दर्शनस्य पश्चात् परिवर्तितानि पुटानि स्थूलाक्षरैः निर्दिष्टानि ।",
-       "watchmethod-recent": "अवलोकितपुटानां सद्यः सम्पादनस्य परीक्षणम् ।",
-       "watchmethod-list": "सद्यः सम्पादनार्थम् अवलोकितपुटानां परीक्षणम् ।",
-       "watchlistcontains": "भवतः अवलोकनावली $1 युक्तास्ति ।{{PLURAL:$1|page|pages}}.",
-       "iteminvalidname": "समस्या  '$1' इत्यनेन अस्ति । अमान्यं नाम ।",
        "wlshowlast": "अन्तिमाः $1 होराः, अन्तिमानि $2 दिनानि $3 दृश्यन्ताम्",
        "watchlist-options": "अवेक्षणाऽऽवलेः विकल्पाः",
        "watching": "निरीक्षते...",
        "enotif_lastvisited": "भवतः पूवसन्दर्शनस्य पश्चात् सवृत्तपरिवर्तनार्थं $1 पश्यतु ।",
        "enotif_lastdiff": "एतत्परिवर्तनं दृष्टुं $1 पश्यतु ।",
        "enotif_anon_editor": "अनामकः योजकः $1",
-       "enotif_body": "Dear $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nEditor's summary: $PAGESUMMARY $PAGEMINOREDIT\n\nContact the editor:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nThere will be no other notifications in case of further activity unless you visit this page. You could also reset the notification flags for all your watched pages on your watchlist.\n\n\t\t\t Your friendly {{SITENAME}} notification system\n\n--\nTo change your e-mail notification settings, visit\n{{canonicalurl:{{#special:Preferences}}}}\n\nTo change your watchlist settings, visit\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nTo delete the page from your watchlist, visit\n$UNWATCHURL\n\nFeedback and further assistance:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Dear $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nEditor's summary: $PAGESUMMARY $PAGEMINOREDIT\n\nContact the editor:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nThere will be no other notifications in case of further activity unless you visit this page. You could also reset the notification flags for all your watched pages on your watchlist.\n\n\t\t\t Your friendly {{SITENAME}} notification system\n\n--\nTo change your e-mail notification settings, visit\n{{canonicalurl:{{#special:Preferences}}}}\n\nTo change your watchlist settings, visit\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nTo delete the page from your watchlist, visit\n$UNWATCHURL\n\nFeedback and further assistance:\n$HELPPAGE",
        "created": "सृष्टम् ।",
        "changed": "परिवर्तितम् ।",
        "deletepage": "पृष्ठं निराकरोतु।",
        "blockip": "प्रयोक्तारं निरुध्नातु",
        "blockip-legend": "योजकम् अवरुणद्धु ।",
        "blockiptext": "विशिष्टं  IP सङ्केतम् अथवा योजकनाम लेखानाधिकारस्य प्राप्तये निम्नदत्तपत्रस्य उपयोगं करोतु ।\nकेवलं नाशकत्वम् अवरोद्धुं एतस्य उपयोगं करोतु । [[{{MediaWiki:Policy-url}}|नीतिः]] इत्यानुसारं करणीयम् ।\nअधः विशिष्टं कारणमपि लिखतु ।",
-       "ipadressorusername": "आइ.पी.सङ्केतः अथवा योजकनाम :",
+       "ipaddressorusername": "आइ.पी.सङ्केतः अथवा योजकनाम :",
        "ipbexpiry": "समाप्तिः :",
        "ipbreason": "कारणम् :",
        "ipbreason-dropdown": "* अवरोधस्य सामान्यानि कारणानि ।  \n** मिथ्या योजकनाम । \n** एकाधिकयोजकस्थानं निर्मीय तेषां दुरुपयोगः । \n** असत्यविषयानाम् उत्तारणम् । \n** पुटेषु अवकरपूरणम् । \n** पुटेभ्यः पदार्थान् अपनयनम् । \n** बाह्यजालस्थानाम् असम्बद्धानुबन्धानाम् संयोजनम् । \n** योजकानां पीडनम् ।",
        "tooltip-undo": "'\"पूर्ववत्\"' इति अन्तिमसम्पादनम् अपाकरोति, सम्पादनप्रारूपं प्राग्दृश्यरूपेण उद्घाटयति, नवीनसम्पादनानन्तरं सम्पादनपृष्ठं प्राग्दृश्यत्वेन प्रदर्शयति च । \n\nअस्य सारांशे अपाकरणस्य कारणमपि लिखितुं शक्यते ।",
        "tooltip-preferences-save": "आद्यताः रक्षतु ।",
        "tooltip-summary": "सङ्क्षिप्तसारांशः योज्यताम्",
-       "notacceptable": "भवतः ग्रहकस्य पठनेच्छारूपेण विकिवितारकः दत्तपाठं प्रकल्पितुं नैव शक्नोति ।",
        "anonymous": "{{SITENAME}} इत्यस्य {{PLURAL:$1||}} अनामकयोजकः ।",
        "siteuser": "{{SITENAME}} योजक $1",
        "anonuser": "{{SITENAME}} अज्ञात योजक $1",
        "pageinfo-category-pages": "पृष्ठानां सङ्ख्या",
        "pageinfo-category-subcats": "उपवर्गानां सङ्ख्या",
        "pageinfo-category-files": "सञ्चिकानां सङ्ख्या",
-       "skinname-cologneblue": "नील",
        "skinname-monobook": "पुस्तक",
        "markaspatrolleddiff": "आरक्षितमिति अङ्कयतु ।",
        "markaspatrolledtext": "एतपुटम् आरक्षितमिति अङ्कयतु ।",
        "newimages-summary": "एतत् विशेषपुटम् सद्यः उत्तारितसञ्चिकाः दर्शयति ।",
        "newimages-legend": "शोधनी ।",
        "newimages-label": "सञ्चिकानाम (अथवा अस्य भागः)",
-       "showhidebots": "(स्वयं चालकः $1)",
        "noimages": "शून्यदर्शनम् ।",
        "ilsubmit": "अन्वेषणम्",
        "bydate": "दिनाङ्कानुगुणम्",
        "autosumm-replace": "\"$1\" इत्यनेन सह आधेस्य विनिमयः कृतः ।",
        "autoredircomment": "[[$1]] प्रति पुटं पुनर्निदिष्टम् ।",
        "autosumm-new": "$1 नवीन पृष्ठं निर्मीत अस्ती",
-       "livepreview-loading": "सम्पूर्यमाणः.....",
-       "livepreview-ready": "सम्पूरणं सज्जम् ।",
-       "livepreview-failed": "साक्षात् पूर्वावलोकनं निष्पलम् ।\nसामान्यपूर्वावलोकनं यतताम् ।",
-       "livepreview-error": "$1 \"$2\" तः सम्पर्कः न सिद्धः ।\nसामान्यपूर्वावलोकनं यतताम् ।",
        "lag-warn-normal": "$1 {{PLURAL:$1|क्षणम्|क्षणानि}} इति काले सम्भूतपरिवर्तन प्रायः अस्यां सूचिकायां न दर्शितम् ।",
        "lag-warn-high": "अत्युन्नतदत्तांशवितारकस्य विलम्बत्वेन {{PLURAL:$1|क्षणम्|क्षणानि}} तः पूर्वं सम्भूतपरिवर्तनं सूचिकायां न दृश्यते ।",
-       "watchlistedit-numitems": "भवतः अवलोकनावली {{PLURAL:$1|1 शीर्षकम्|$1 शीर्षकानि}}, अन्तर्भूता, सम्भाषणपुटरहिता ।",
-       "watchlistedit-noitems": "भवतः अवलोकनावली शीर्षकैः रहिता ।",
        "watchlistedit-normal-title": "अवलोकनावलीं सम्पादयतु ।",
        "watchlistedit-normal-legend": "अवलोकनावलीतः शीर्षकानि अपनयतु ।",
        "watchlistedit-normal-explain": "भवतः अवलोकनावल्याः शीर्षकानि अधः दर्शितानि । \nशीर्षकम् अपनेतुम् अस्य पार्श्वे विद्यमानमञ्जूषाम् अर्गलयतु । पश्चात् {{int:Watchlistedit-normal-submit}}\" एतत् तुदतु ।\nभवान् [[Special:EditWatchlist/raw|अपक्वावलोकनावलीं सम्पादयतु ]] कर्तुं शक्नोति ।",
        "compare-invalid-title": "सूचिता शीर्षिका अमान्या वर्तते ।",
        "compare-title-not-exists": "निर्दिष्टं शीर्षकं न विद्यते ।",
        "compare-revision-not-exists": "निर्दिष्टं संस्करनं न विद्यते ।",
-       "dberr-header": "अस्मिन् विकिमध्ये काचित् समस्या विद्यते",
        "dberr-problems": "क्षम्यताम् ! अस्मिन् जालपुटे तान्त्रिकसमस्याः अनुभूयमानाः सन्ति ।",
        "dberr-again": "किञ्चित् कालं प्रतीक्ष्य पुनः उपारोप्यताम् ।",
        "dberr-info": "(दत्ताशं वितारकं सम्पर्कयितुं नैव शक्यते $1 )",
index 59cc68a..6452b2b 100644 (file)
@@ -8,22 +8,23 @@
                        "Kaganer",
                        "Meno25",
                        "Nemo bis",
-                       "Urhixidur"
+                       "Urhixidur",
+                       "아라"
                ]
        },
-       "tog-underline": "ЫйÑ\8bннÑ\8cÑ\8bкÑ\82аÑ\80Ñ\8b аннынан тардыы:",
+       "tog-underline": "СигÑ\8dлÑ\8dÑ\80и аннынан тардыы:",
        "tog-hideminor": "Кыра көннөрүүлэри көрдөрбөккө",
        "tog-hidepatrolled": "Ботурууллааччы көрбүт көннөрүүтүн саҥа көннөрүүлэр тиһиктэригэр көрдөрүмэ",
        "tog-newpageshidepatrolled": "Ботуруулламмыт сирэйдэри саҥа сирэйдэр тиһиктэригэр көрдөрүмэ",
-       "tog-extendwatchlist": "Кэтээһин тупсарыллыбыт испииһэгэ. Бары уларытыылар көстөллөр (бүтэһиктэр эрэ буолбатах)",
+       "tog-extendwatchlist": "Кэтээһин тупсарыллыбыт тиһигэ. Бары уларытыылар көстөллөр (бүтэһиктэр эрэ буолбатах)",
        "tog-usenewrc": "Саҥа уларытыы уонна кэтэбил тиһиктэригэр уларыйыылары бөлөхтүүргэ",
-       "tog-numberheadings": "Ð\91аÑ\81 Ñ\82Ñ\8bллаÑ\80Ñ\8b нүөмэрдээ",
-       "tog-showtoolbar": "Көннөрүү үстүрүмүөннэрин көрдөр",
-       "tog-editondblclick": "ХоһÑ\83лаÑ\82ан Ð¸ÐºÐºÐ¸Ñ\82Ñ\8d Ð±Ð°Ñ\82Ñ\82аан Ñ\81иÑ\80Ñ\8dйи Ñ\83лаÑ\80Ñ\8bÑ\82Ñ\8bÑ\8b",
-       "tog-editsectiononrightclick": "СиÑ\8dкÑ\81ийÑ\8d Ð±Ð°Ò»Ñ\8bгаÑ\80 Ñ\83ҥа Ñ\82имÑ\8dÒ\95инÑ\8dн Ð±Ð°Ñ\82Ñ\82аан Ñ\81иÑ\8dкÑ\81ийÑ\8dни ÐºÓ©Ð½Ð½Ó©Ñ\80Ò¯Ò¯",
+       "tog-numberheadings": "ТүһүмÑ\8dÑ\85Ñ\82Ñ\8dÑ\80 Ð°Ð°Ñ\82Ñ\82аÑ\80Ñ\8bн нүөмэрдээ",
+       "tog-showtoolbar": "Көннөрүү хапталын көрдөр",
+       "tog-editondblclick": "Хоһулатан баттаан сирэйи уларытыы",
+       "tog-editsectiononrightclick": "ТүһүмÑ\8dÑ\85 Ð±Ð°Ò»Ñ\8bн Ñ\83ҥа Ñ\82имÑ\8dÒ\95инÑ\8dн Ð±Ð°Ñ\82Ñ\82аан Ñ\82үһүмÑ\8dÒ\95и Ñ\83лаÑ\80Ñ\8bÑ\82Ñ\8bÑ\8b",
        "tog-watchcreations": "Суруйбут ыстатыйаларбын уонна укпут билэлэрбин кэтээн көрүүгэ киллэрэн ис",
        "tog-watchdefault": "Уларыппыт сирэйдэрбин уонна билэлэрбин кэтээн көрүү тиһигэр киллэрэн ис",
-       "tog-watchmoves": "Аатын уларыппыт сирэйдэрбин уонна билэлэрбин кэтээн көрүү испииһэгэр киллэрэн ис",
+       "tog-watchmoves": "Аатын уларыппыт сирэйдэрбин уонна билэлэрбин кэтээн көрүү тиһигэр киллэрэн ис",
        "tog-watchdeletion": "Соппут сирэйдэрбин уонна билэлэрбин кэтээн көрүү тиһигэр киллэрэн ис",
        "tog-minordefault": "Уларытыылары атын этиллибэтэҕинэ кыра уларытыы курдук бэлиэтээ",
        "tog-previewontop": "Хайдах буоларын уларытар түннүк үрдүнэн (иннигэр) көрдөр",
        "tog-enotifminoredits": "Кыра да уларытыы киирдэҕинэ эл. почтанан биллэрээр",
        "tog-enotifrevealaddr": "Мин почтам аадырыһын биллэриилэргэ көрдөр",
        "tog-shownumberswatching": "Сирэйи кэтээн көрөр дьон ахсаанын көрдөр",
-       "tog-oldsig": "Ð\91ааÑ\80 илии баттааһын:",
-       "tog-fancysig": "Ð\91Ñ\8dйÑ\8d Ð¸Ð»Ð¸Ð¸ Ð±Ð°Ñ\82Ñ\82ааһÑ\8bна (Ñ\8bйÑ\8bннÑ\8cÑ\8bга суох)",
+       "tog-oldsig": "Ð\91илиҥҥи илии баттааһын:",
+       "tog-fancysig": "Ð\91Ñ\8dйÑ\8d Ð¸Ð»Ð¸Ð¸ Ð±Ð°Ñ\82Ñ\82ааһÑ\8bна (Ñ\81игÑ\8dÑ\82Ñ\8d суох)",
        "tog-uselivepreview": "Хайдах буолуохтааҕын тутатына эрдэ көрүү (тургутуу быһыытынан)",
        "tog-forceeditsummary": "Тугу уларыппытым туһунан суруйбатахпына сэрэт",
-       "tog-watchlisthideown": "Кэтээн көрүү испииһэгэр бэйэм уларытыыларбын көрдөрүмэ",
-       "tog-watchlisthidebots": "Кэтээн көрүү испииһэгэр робот уларытыытын көрдөрүмэ",
+       "tog-watchlisthideown": "Кэтээн көрүү тиһигэр бэйэм уларытыыларбын көрдөрүмэ",
+       "tog-watchlisthidebots": "Кэтээн көрүү тиһигэр робот уларытыытын көрдөрүмэ",
        "tog-watchlisthideminor": "Кыра уларытыылары кэтээмэ",
-       "tog-watchlisthideliu": "Бэлиэтэммит кыттааччылар уларытыыларын кэтиир испииһэккэ көрдөрүмэ",
-       "tog-watchlisthideanons": "Ааттарын эппэтэх кыттааччылар уларытыыларын кэтээһин испииһэгэр көрдөрүмэ",
+       "tog-watchlisthideliu": "Бэлиэтэммит кыттааччылар уларытыыларын кэтиир тиһиккэ көрдөрүмэ",
+       "tog-watchlisthideanons": "Ааттарын эппэтэх кыттааччылар уларытыыларын кэтээһин тиһигэр көрдөрүмэ",
        "tog-watchlisthidepatrolled": "Ботурууллааччы көрбүт көннөрүүтүн кэтээһин испииһэгэр көрдөрүмэ",
        "tog-ccmeonemails": "Атын кыттааччыларга суруйбут суруктарбын бэйэбэр эмиэ ыыт",
        "tog-diffonly": "Икки барылы тэҥнииргэ сирэй иһин көрдөрүмэ",
        "tog-showhiddencats": "Кистэммит категориялары көрдөр",
        "tog-norollbackdiff": "Төннөрүү кэнниттэн барыллар уратыларын көрдөрүмэ",
-       "tog-useeditwarning": "ЭÑ\80Ñ\8dдÑ\8dÑ\8dкÑ\81ийÑ\8dлииÑ\80 Ñ\81иÑ\80Ñ\8dйÑ\82Ñ\8dн Ñ\83лаÑ\80Ñ\8bÑ\82Ñ\8bÑ\8bлаÑ\80бÑ\8bн Ð±Ð¸Ð³Ñ\8dÑ\80гÑ\8dппÑ\8dккÑ\8d тахсаары гыннахпына сэрэтээр",
+       "tog-useeditwarning": "УлаÑ\80Ñ\8bÑ\82Ñ\8bÑ\8bлаÑ\80бÑ\8bн Ð±Ð¸Ð³Ñ\8dÑ\80гÑ\8dппÑ\8dккÑ\8d Ñ\81иÑ\80Ñ\8dйÑ\82Ñ\8dн тахсаары гыннахпына сэрэтээр",
        "tog-prefershttps": "Манна киирэргэ куруук көмүскэллээх холбонууну туттарга",
        "underline-always": "Куруук",
        "underline-never": "Аннынан тардыма",
        "category-article-count": "{{PLURAL:$2|Бу категория манна эрэ көстүбүт субкатегориялаах.|$2 категорияттан {{PLURAL:$1|субкатегорията|$1 субкатегориялара}} көрдөрүлүннүлэр.}}",
        "category-article-count-limited": "Бу категорияҕа {{PLURAL:$1|1 эрэ сирэй|$1 сирэй}} баар.",
        "category-file-count": "{{PLURAL:$2|Бу категория манна эрэ көстүбүт билэлээх.|$2 категорияттан {{PLURAL:$1|билэтэ|$1 билэлэрэ}} көрдөрүлүннүлэр.}}",
-       "category-file-count-limited": "Бу категорияҕа  {{PLURAL:$1|биир билэ|$1 билэ}} баар.",
+       "category-file-count-limited": "Бу категорияҕа  {{PLURAL:$1|соҕотох билэ|$1 билэ}} баар.",
        "listingcontinuesabbrev": "(салгыыта)",
-       "index-category": "Индекстаммыт сирэйдэр",
+       "index-category": "Индекстэммит сирэйдэр",
        "noindex-category": "Индексктаммыт сирэйдэр суохтар",
        "broken-file-category": "Билэҕэ сигэлэрэ алҕастаах сирэйдэр",
        "about": "Бу туһунан",
        "namespaces": "Аат даллара",
        "variants": "Барыллар",
        "navigation-heading": "Навигация",
-       "errorpagetitle": "СÑ\8bÑ\8bһа",
+       "errorpagetitle": "Ð\90лÒ\95аÑ\81",
        "returnto": "Төттөрү $1 сирэйгэ.",
        "tagline": "{{SITENAME}} диэн сиртэн ылыллыбыт",
        "help": "Көмө",
        "searchbutton": "Бул",
        "go": "Бар",
        "searcharticle": "Көрдөр",
-       "history": "Ð\98Ñ\81Ñ\82оÑ\80иÑ\8fта",
-       "history_short": "Ð\98Ñ\81Ñ\82оÑ\80иÑ\8f",
+       "history": "УÑ\81Ñ\82Ñ\83оÑ\80Ñ\83йата",
+       "history_short": "УÑ\81Ñ\82Ñ\83оÑ\80Ñ\83йа",
        "updatedmarker": "Кэнники киириим кэнниттэн уларыйыылар",
-       "printableversion": "Ð\91Ñ\8dÑ\87Ñ\8dÑ\8dÑ\82Ñ\82ииÑ\80гÑ\8d Ð°Ð½Ð°Ð°Ð½ ÐºÓ©Ñ\80Ò¯Ò¯",
-       "permalink": "Ð\9aÑ\83Ñ\80Ñ\83Ñ\83к Ð±Ð°Ð°Ñ\80 Ñ\8bйÑ\8bннÑ\8cÑ\8bк",
+       "printableversion": "Ð\91Ñ\8dÑ\87Ñ\8dÑ\8dÑ\82Ñ\82ииÑ\80гÑ\8d Ð°Ð½Ð°Ð»Ð»Ð°Ð°Ñ\85 Ð±Ð°Ñ\80Ñ\8bл",
+       "permalink": "Ð\9aÑ\83Ñ\80Ñ\83Ñ\83к Ð±Ð°Ð°Ñ\80 Ñ\81игÑ\8d",
        "print": "Бэчээттээ",
        "view": "Көрүү",
        "view-foreign": "Манна көрүү: $1",
        "create-this-page": "Бу сирэйи ай",
        "delete": "Соттор",
        "deletethispage": "Бу сирэйи соттор",
-       "undeletethispage": "Бу сирэйи сөргүт (төннөр)",
-       "undelete_short": "Төттөрү аҕал {{PLURAL:$1|биир уларытыыны|$1 уларытыылары}}",
+       "undeletethispage": "Бу сирэйи сөргүт",
+       "undelete_short": "{{PLURAL:$1|Биир уларытыыны|$1 уларытыыны}} сөргүт",
        "viewdeleted_short": "{{PLURAL:$1|Соҕотох сотторуллубут көннөрүүнү|$1 сотторуллубут көннөрүүнү}} көрүү",
        "protect": "Уларыппат гын",
        "protect_change": "уларытыы",
        "protectthispage": "Бу сирэйи уларыппат гын",
-       "unprotect": "УлаÑ\80Ñ\8bÑ\82аÑ\80Ñ\8b ÐºÓ©Ò¥Ò¯Ð»Ð»Ñ\8dÑ\8d",
+       "unprotect": "Ð\9aөмүÑ\81кÑ\8dлин Ñ\83лаÑ\80Ñ\8bÑ\82",
        "unprotectthispage": "Бу сирэй көмүскэлин уларыт",
        "newpage": "Саҥа сирэй",
        "talkpage": "Бу сирэйи ырыт",
        "talkpagelinktext": "Ырытыы",
        "specialpage": "Анал сирэй",
-       "personaltools": "ТÑ\83Ñ\81 Ð±Ñ\8dйÑ\8d Ñ\82Ñ\83Ñ\82Ñ\82аÑ\80 Ñ\82Ñ\83Ñ\80Ñ\83оÑ\80Ñ\83Ñ\83лаÑ\80а",
-       "postcomment": "Саҥа Ñ\81алаа",
+       "personaltools": "ТÑ\83Ñ\81 Ð±Ñ\8dйÑ\8d Ñ\82Ñ\83Ñ\82Ñ\82аÑ\80 Ñ\82Ñ\8dÑ\80иллÑ\8dÑ\80Ñ\8d",
+       "postcomment": "Саҥа Ñ\82үһүмÑ\8dÑ\85",
        "articlepage": "Ыстатыйаны көр",
        "talk": "Ырытыы",
-       "views": "Көрүүлэр",
+       "views": "Көрүү",
        "toolbox": "Сэп-сэбиргэл",
        "userpage": "Кыттааччы туһунан сирэй",
        "projectpage": "Бырайыак сирэйэ",
        "jumptonavigation": "навигация",
        "jumptosearch": "көрдөөһүн",
        "view-pool-error": "Балаама, билигин бары сиэрбэрдэр туолан тураллар.\nБу сирэйи наһаа элбэх киһи көрүөн баҕарбыт.\nБука диэн, кэтэһэ түһэн баран өссө боруобалаар.\n\n$1",
+       "generic-pool-error": "Балаама, билигин бары сиэрбэрдэр туолан тураллар.\nБу сирэйи наһаа элбэх киһи көрө сатыыр.\nБука диэн, кэтэһэ түһэн баран өссө киирэн көрөөр.",
        "pool-timeout": "Хааччахтааһыны кэтэһии болдьоҕо ааста",
        "pool-queuefull": "Көрдөбүллэри хомуйуу туолбут",
        "pool-errorunknown": "Биллибэт алҕас",
        "badaccess": "Сатаан киирбэтэ",
        "badaccess-group0": "Эн бу дьайыыны оҥорор кыаҕыҥ суох.",
        "badaccess-groups": "Дьайыыны $1 {{PLURAL:$2|бөлөххө|бөлөхтөртөн биирдэстэригэр}} киирэр кыттааччыларылар эрэ оҥорор кыахтаахтар.",
-       "versionrequired": "MediaWiki $1 -Ñ\81 Ð±Ð¸Ñ\8dÑ\80Ñ\81ийÑ\8dÑ\82Ñ\8d Ð½Ð°Ð°Ð´Ð°",
+       "versionrequired": "MediaWiki $1 -Ñ\81 Ð±Ð°Ñ\80Ñ\8bла Ð¸Ñ\80дÑ\8dнÑ\8dÑ\80",
        "versionrequiredtext": "Бу сирэйи туттарга MediaWiki $1 -с барыла наада. [[Special:Version|Барыллар тустарынан сирэйи]] көр.",
        "ok": "Сөп",
        "retrievedfrom": "\"$1\" -н кэллэ",
        "readonly_lag": "Билии олоҕун хос сиэрбэрдэрэ сүрүн сиэрбэри кытта мэнэйдэһэр кэмнэригэр билии олоҕо хатанна",
        "internalerror": "Ис алҕас (внутренняя ошибка)",
        "internalerror_info": "Ис алҕас: $1",
-       "fileappenderrorread": "Эбии кэмигэр «$1» кыайан ааҕыллыбата.",
-       "fileappenderror": "Маны \"$1\" манна \"$2\" холбуур табыллыбата.",
        "filecopyerror": "\"$1\" диэн билэ \"$2\"-а кыайан төгүллэммэт.",
        "filerenameerror": "\"$1\" диэн билэ аатын \"$2\" диэҥҥэ кыайан уларытыллыбат.",
        "filedeleteerror": "\"$1\" диэн билэ кыайан сотторуллубат.",
        "directorycreateerror": "\"$1\" диэн ыйдарыы кыайан оҥоһуллубата.",
        "filenotfound": "\"$1\" диэн билэни кыайан булбатым.",
-       "fileexistserror": "\"$1\" билэ сатаан суруллубата: маннык билэ баар эбит",
        "unexpected": "Барсыбат суолталаах: \"$1\"=\"$2\".",
        "formerror": "Сыыһа: халыып кыайан ылыллыбата",
        "badarticleerror": "Бу дьайыы бу сирэйгэ кыайан оҥоһуллубат.",
        "userlogin-helplink2": "Киирэргэ көмө",
        "userlogin-loggedin": "Маннык аатынан киирбиккин {{GENDER:$1|$1}}.\nАтын аатынан киирэргэ аллара көстөр форманы туһан.",
        "userlogin-createanother": "Атын аатынан бэлиэтэн",
-       "createacct-join": "Аллара суруй.",
-       "createacct-another-join": "Саҥа бэлиэ-аат туһунан аллара суруй.",
        "createacct-emailrequired": "Email аадырыс",
        "createacct-emailoptional": "Email аадырыс (булгуччута суох)",
        "createacct-email-ph": "Эл аадырыскын суруй",
        "savearticle": "Уларытыыны бигэргэтии",
        "preview": "Холоон көрүү",
        "showpreview": "Уларытыах иннинэ көрүү",
-       "showlivepreview": "Түргэнник эрдэ көрүү",
        "showdiff": "Уларытыылар",
        "anoneditwarning": "'''Болҕой:''' Системаҕа киирбэтэххин. Онон аатыҥ оннугар IP аадаырыһыҥ бу сирэй историятыгар киириэ.",
        "anonpreviewwarning": "''Эн тиһиккэ ааккын эппэттэххин. Уларытыыгын бигэргэттэххинэ IP-аадырыһыҥ сирэй устуоруйатыгар суруллуо.''",
        "edit-gone-missing": "Сирэйи саҥардар кыах суох.\nАрааһа сотуллубут быһыылаах.",
        "edit-conflict": "Көннөрүүлэр утарсыылара.",
        "edit-no-change": "Эн көннөрүүҥ киирбэтэ, тоҕо диэтэххэ тугу да уларыппатаххын.",
-       "postedit-confirmation": "Көннөрүүҥ бигэргэннэ.",
+       "postedit-confirmation-created": "Сирэй оҥоһулунна.",
+       "postedit-confirmation-restored": "Сирэй сөргүтүлүннэ.",
+       "postedit-confirmation-saved": "Көннөрүүҥ бигэргэннэ.",
        "edit-already-exists": "Саҥа сирэйи оҥорор табыллыбат.\nМаннык сирэй баар эбит.",
        "defaultmessagetext": "Туспа этиллибэтэҕинэ суруллар тиэкис",
        "content-failed-to-parse": "$2 иһинээҕитэ $1 көрүҥэр сөп түбэспэт: $3.",
        "searchmenu-exists": "'''Бу биикигэ бу сирэй маннык ааттаах \"[[$1]]\"'''",
        "searchmenu-new": "<strong>Бу биикигэ \"[[:$1]]\" сирэйи айарга!</strong>{{PLURAL:$2|0=|Эбии көрдөөһүн түмүгэр көстүбүт сирэйи көр.|Эбии көрдөөһүн түмүктэрин көр.}}",
        "searchprofile-articles": "Ыстатыйалар истэрэ",
-       "searchprofile-project": "Көмө уонна Бырайыак сирэйдэрэ",
        "searchprofile-images": "Мультимедиа",
        "searchprofile-everything": "Барыта",
        "searchprofile-advanced": "Дириҥэтиллибит",
        "searchprofile-articles-tooltip": "Манна $1 көрдөөһүн",
-       "searchprofile-project-tooltip": "Манна $1 көрдөөһүн",
        "searchprofile-images-tooltip": "Билэлэри көрдөөһүн",
        "searchprofile-everything-tooltip": "Сирэйдэргэ барытыгар (ырытыы гиэннэригэр эмиэ) көрдөөһүн",
        "searchprofile-advanced-tooltip": "Этиллибит аат далларыгар көрдөөһүн",
        "searchrelated": "сибээстэммит",
        "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> көрдөрүлүннэ.",
        "showingresultsnum": "Манна {{PLURAL:$3|түмүк|түмүктэр}} {{PLURAL:$3|көрдөрөлүннэ|көрдөрүлүннүлэр}} <strong>$3</strong>, мантан саҕалаан №&nbsp;<strong>$2</strong>.",
        "showingresultsheader": "'''$4''' анаммыт {{PLURAL:$5|мантан '''$3''' түмүгэ - '''$1'''|мантан '''$3''' түмүктэрэ '''$1 - $2'''}}",
        "search-nonefound": "Көрдөбүлгэ эппиэттиир билэлэр көстүбэтилэр.",
        "powersearch-legend": "Дириҥэтэн көрдөөһүн",
        "powersearch-ns": "Аат далыгар көрдөө:",
-       "powersearch-redir": "Утаарыылар тиһиликтэрэ",
        "powersearch-togglelabel": "Бэлиэтээ:",
        "powersearch-toggleall": "Барытын",
        "powersearch-togglenone": "Бэлиэтээмэ",
        "preferences": "Уларытыылар",
        "mypreferences": "Туруоруулар",
        "prefs-edits": "Көннөрүү ахсаана:",
+       "prefsnologintext2": "Туруоруулары уларытарга $1 наада.",
        "prefs-skin": "Тас көстүү",
        "skin-preview": "Хайдах буолара",
        "datedefault": "Көннөрү көстүүтэ",
        "recentchangesdays-max": "(улааппыта $1 күн)",
        "recentchangescount": "Саҥа уларытыылар көрдөрүллэр ахсааннара:",
        "prefs-help-recentchangescount": "Бу саҥа көннөрүүлэри, сирэй устуоруйаларын уонна сурунааллары көрдөрөр.",
+       "prefs-help-watchlist-token2": "Бу кэтиир тиһигиҥ ситим-ханаалын кистэлэҥ күлүүһэ.\nБу күлүүһүнэн ким баҕарар эн кэтиир тиһиккин көрүөн сөп, онон кимиэхэ да биэримэ. [[Special:ResetTokens|Маны баттаан уларытыаххын сөп]].",
        "savedprefs": "Эн туруорууларыҥ олохтоннулар.",
        "timezonelegend": "Олохтоох кэм:",
        "localtime": "Олохтоох кэмим:",
        "prefs-emailconfirm-label": "Эл. почтаны бигэргэтии:",
        "youremail": "E-mail-ыҥ:",
        "username": "{{GENDER:$1|Бэлиэтэммит аатыҥ}}:",
-       "uid": "{{GENDER:$1|Кыттааччы}} ID-та:",
        "prefs-memberingroups": "Бу {{PLURAL:$1|бөлөххө|бөлөхтөргө}} {{GENDER:$2|киирэр}}:",
        "prefs-registration": "Бэлиэтэнии кэмэ:",
        "prefs-registration-date-time": "$1",
        "yourgender": "Хайата Эйиэхэ сөп түбэһэрий?",
        "gender-unknown": "Ыйбат инибин",
        "gender-male": "Кини биики сирэйдэри уларытар",
-       "gender-female": "Ð\94Ñ\8cаÑ\85тар",
-       "prefs-help-gender": "Ð\91Ñ\83лгÑ\83Ñ\87Ñ\87Ñ\83Ñ\82а Ñ\81Ñ\83оÑ\85. Ð\91Ñ\8bÑ\80агÑ\8bÑ\80аамма Ñ\81оÑ\80оÑ\85 Ð´Ñ\8cоҥҥо Ñ\82Ñ\83һаайÑ\8bллÑ\8bбÑ\8bÑ\82 Ð±Ð¸Ð»Ð»Ñ\8dÑ\80иилÑ\8dÑ\80игÑ\8dÑ\80 Ñ\8dбÑ\8dÑ\82Ñ\8dÑ\80 ÐºÐ¸Ð½Ð¸Ð»Ñ\8dÑ\80гÑ\8d Ñ\81Ñ\8bÒ»Ñ\8bаннааÑ\85 Ñ\8dÑ\82иилÑ\8dÑ\80игÑ\8dÑ\80 ÐºÑ\8bÑ\82ааÑ\87Ñ\87Ñ\8b Ð´Ñ\8cаÑ\85Ñ\82аÑ\80Ñ\8bÑ\82Ñ\82ан Ñ\8dÑ\80 ÐºÐ¸Ò»Ð¸Ñ\82иÑ\82Ñ\82Ñ\8dн ÐºÓ©Ñ\80өн Ñ\8dÑ\82ии Ñ\82Ñ\83Ñ\82Ñ\83лÑ\83н Ñ\83лаÑ\80Ñ\8bÑ\82ан Ð±Ð¸Ñ\8dÑ\80иÑ\8dн Ñ\81өп. Туора дьоҥҥо көстөр бэлиэтээһин.",
+       "gender-female": "Ð\9aини Ð±Ð¸Ð¸ÐºÐ¸ Ñ\81иÑ\80Ñ\8dйдÑ\8dÑ\80и Ñ\83лаÑ\80Ñ\8bтар",
+       "prefs-help-gender": "Ð\9cанÑ\8b Ñ\82Ñ\83Ñ\80Ñ\83оÑ\80аÑ\80 Ð±Ñ\83лгÑ\83Ñ\87Ñ\87Ñ\83Ñ\82а Ñ\81Ñ\83оÑ\85. \nÐ\91Ñ\8bÑ\80агÑ\8bÑ\80аамма Ñ\81оÑ\80оÑ\85 Ð´Ñ\8cоҥҥо Ñ\82Ñ\83һаайÑ\8bллÑ\8bбÑ\8bÑ\82 Ð±Ð¸Ð»Ð»Ñ\8dÑ\80иилÑ\8dÑ\80игÑ\8dÑ\80 Ñ\8dбÑ\8dÑ\82Ñ\8dÑ\80 ÐºÐ¸Ð½Ð¸Ð»Ñ\8dÑ\80гÑ\8d Ñ\81Ñ\8bÒ»Ñ\8bаннааÑ\85 Ñ\8dÑ\82иилÑ\8dÑ\80игÑ\8dÑ\80 ÐºÑ\8bÑ\82ааÑ\87Ñ\87Ñ\8b Ð´Ñ\8cаÑ\85Ñ\82аÑ\80Ñ\8bÑ\82Ñ\82ан Ñ\8dбÑ\8dÑ\82Ñ\8dÑ\80 Ñ\8dÑ\80 ÐºÐ¸Ò»Ð¸Ñ\82иÑ\82Ñ\82Ñ\8dн ÐºÓ©Ñ\80өн Ñ\8dÑ\82ии Ñ\82Ñ\83Ñ\82Ñ\83лÑ\83н Ñ\83лаÑ\80Ñ\8bÑ\82ан Ð±Ð¸Ñ\8dÑ\80иÑ\8dн Ñ\81өп. \nТуора дьоҥҥо көстөр бэлиэтээһин.",
        "email": "Почта",
        "prefs-help-realname": "Сурукка киирбит аатыҥ (булгуччута суох): ким бу сирэйи уларыппытын көрдөрөргө туттуллар",
        "prefs-help-email": "Электроннай аадырыһы суруйар булгуччута суох, ол эрээри киирии тылгын умуннаххына санатарга көмөлөһүө.",
        "prefs-advancedsearchoptions": "Дириҥэтиллибит туруоруулар",
        "prefs-advancedwatchlist": "Дириҥэтиллибит туруоруулар",
        "prefs-displayrc": "Туруоруулары көрдөр",
-       "prefs-displaysearchoptions": "Көстүүтүн туруоруулара",
        "prefs-displaywatchlist": "Көстүүтүн туруоруулара",
        "prefs-diffs": "Уратылара",
        "prefs-help-prefershttps": "Аныгыскы киириигэр үлэлиир буолуо.",
+       "prefs-tabs-navigation-hint": "Сүбэ: Көмпүүтэриҥ клаватууратын стрелкаларын туһанан кыбытыктан кыбытыкка көһүөххүн сөп.",
        "email-address-validity-valid": "Сөп курдук көстөр",
        "email-address-validity-invalid": "Алҕаһа суох аадырыс ирдэнэр",
        "userrights": "Кыттааччылар бырааптарын салайыы",
        "right-move": "Сирэйдэр ааттарын уларытыы",
        "right-move-subpages": "Сирэйдэр ааттарын иһигэр киирэр сирэйдэри кытта уларытыы",
        "right-move-rootuserpages": "Кыттааччылар сирэйдэрин аатын уларытыы",
+       "right-move-categorypages": "Категория сирэйдэрин аатын уларытыы",
        "right-movefile": "билэлэр ааттарын уларытыы",
        "right-suppressredirect": "Аатын уларытарга урукку ааттан утаарыы сирэй кыайан оҥоһуллубат",
        "right-upload": "Билэлэри киллэр",
        "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-block": "кыттааччы уларытыыны оҥорорун бобуу",
        "action-protect": "бу сирэй харысхалын таһымын уларытыы",
        "action-rollback": "бы сирэйи көннөрбүт бүтэһик киһи уларытыыларын түргэнник суох гыныы",
-       "action-import": "бу сирэйи атын биикиттэн киллэрии",
-       "action-importupload": "бу сирэйи эрдэ суруллубут билэттэн киллэрии",
+       "action-import": "сирэйдэри атын биикиттэн киллэрии",
+       "action-importupload": "сирэйдэри эрдэ хачайданан ылбыт (суруллубут) билэттэн киллэрии",
        "action-patrol": "атыттар көннөрүүлэрин ботуруулламмыт курдук бэлиэтээ",
        "action-autopatrol": "бэйэ көннөрүүтүн ботуруулламмыт курдук бэлиэтээһин",
        "action-unwatchedpages": "ким да кэтээбэт сирэйдэрин тиһиктэрин көрүү",
        "action-viewmyprivateinfo": "бэйэҥ тускунан көрүү",
        "action-editmyprivateinfo": "бэйэҥ тускунан суруллубуту уларыт",
        "nchanges": "$1 {{PLURAL:$1|уларытыы|уларытыылар}}",
+       "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|тиһэх сылдьыыгыттан}}",
        "enhancedrc-history": "устуоруйата",
        "recentchanges": "Кэнники уларытыылар",
        "recentchanges-legend": "Кэлиҥҥи уларытыылар хайдах көстөллөрүн туруоруу",
        "recentchanges-label-minor": "Бу улахан суолтата суох уларытыы",
        "recentchanges-label-bot": "Бу уларытыыны робот оҥорбут",
        "recentchanges-label-unpatrolled": "Бу уларытыы өссө ботурууллана илик",
-       "recentchanges-legend-newpage": "$1 — саҥа сирэй",
-       "rcnotefrom": "Мантан '''$2''' маныаха '''$1''' дылы уларыыйылар көрдөрүлүннүлэр.",
-       "rclistfrom": "Бу кэм $1 кэнниттэн оҥоһуллубуттары көрдөр",
+       "recentchanges-label-plusminus": "Сирэй кээмэйэ бачча баайтынан уларыйбыт",
+       "recentchanges-legend-heading": "'''Легендата:'''",
+       "recentchanges-legend-newpage": "(өссө көр: [[Special:NewPages|Саҥа сирэйдэр тиһиктэрэ]])",
+       "rcnotefrom": "Улартыылар бу кэмтэн ыла көрдөрүлүннүлэр: <strong>$2</strong> (мантан элбэх көрдөрүллүбэтэ: <strong>$1</strong>).",
+       "rclistfrom": "Бу кэм $3 $2 кэнниттэн оҥоһуллубуттары көрдөр",
        "rcshowhideminor": "$1 кыра уларыйыылары",
+       "rcshowhideminor-show": "Көрдөр",
+       "rcshowhideminor-hide": "Кистээ",
        "rcshowhidebots": "$1 робот",
-       "rcshowhideliu": "Аатын билиһиннэрбит кыттааччылары $1",
+       "rcshowhidebots-show": "Көрдөр",
+       "rcshowhidebots-hide": "Кистээ",
+       "rcshowhideliu": "Бэлиэтэммит кыттааччылар ахсааннара $1",
+       "rcshowhideliu-show": "Көрдөр",
+       "rcshowhideliu-hide": "Кистээ",
        "rcshowhideanons": "Ааттарын эппэтэх кыттааччылары $1",
+       "rcshowhideanons-show": "Көрдөр",
+       "rcshowhideanons-hide": "Кистээ",
        "rcshowhidepatr": "$1 бэрэбиэркэлэммит уларытыылар",
+       "rcshowhidepatr-show": "Көрдөр",
+       "rcshowhidepatr-hide": "Кистээ",
        "rcshowhidemine": "Мин уларытыыларбын $1",
+       "rcshowhidemine-show": "Көрдөр",
+       "rcshowhidemine-hide": "Кистээ",
        "rclinks": "$2 күҥҥэ бүтэһик $1 уларытыыны көрдөр;<br />$3.",
        "diff": "уратыта",
        "hist": "история",
        "fileexists-shared-forbidden": "Маннык ааттаах ойуу уопсай ыскылаакка баар эбит.\nОл да буоллар билэни киллэриэххин баҕарар буоллаххына төннөн атыннык ааттаа. [[File:$1|thumb|center|$1]]",
        "file-exists-duplicate": "Бу билэ атын {{PLURAL:$1|билэ дубликаата|билэлэр дубликааттара}} буолар:",
        "file-deleted-duplicate": "Маннык билэ ([[:$1]]) урут сотуллубут эбит. Суруттарыаҥ иннинэ бастаан тоҕо сотуллубутун көр.",
+       "file-deleted-duplicate-notitle": "Маннык билэ урут сотуллубут эбит, аата бобуллубут.\nБилэни саҥаттан киллэриэҥ иннинэ бобуллубут билэлэри көрөр кыахтаах киһиэхэ тахсан тоҕо бобуллубутун быһаарыс.",
        "uploadwarning": "Сэрэтии",
        "uploadwarning-text": "Бука диэн аллара баар билэ туһунан суругу уларыт уонна өссө хатылаа.",
        "savefile": "Билэни суруттарыы",
        "uploaddisabledtext": "Билэлэри суруттарар көҥүллэммэт.",
        "php-uploaddisabledtext": "PHP туруорууларыгар билэни киллэрии араарыллыбыт. Бука диэн, file_uploads туруоруутун көр.",
        "uploadscripted": "Бу билэ HTML эбэтэр скрипт куодтаах эбит. Интэриниэт көрдөрөр бырагыраамма ону сыыһа ааҕыан сөп.",
+       "uploadscriptednamespace": "Бу SVG-билэ алҕастаах аат даллаах эбит: '$1'",
+       "uploadinvalidxml": "Хачайдаммит билэҕэ XML анаалыстанар кыаҕа суох.",
        "uploadvirus": "Бу билэ вирустаах! Көр: $1",
        "uploadjava": "Билэ Java .class билэлээх ZIP-архыып эбит.\nКуттал суох буолбатын диэн Java-билэрэри манна угар бобуллар.",
        "upload-source": "Билэ бастакы торума",
        "uploadstash-refresh": "Билэлэр тиһиктэрин саҥардан биэр",
        "invalid-chunk-offset": "Бобуллубут сыҕарыйыы",
        "img-auth-accessdenied": "Киирии бобуллубут",
-       "img-auth-nopathinfo": "PATH_INFO суох.\nЭн сиэрбэриҥ маннык сибидиэнньэни ыытарга туруоруллубатах эбит.\nБаҕар кини CGI олоҕурара буолуо ол иһин img_auth өйөөбөтө буолуо.\nМаны https://www.mediawiki.org/wiki/Manual:Image_Authorization көр.",
+       "img-auth-nopathinfo": "PATH_INFO суох.\nЭн сиэрбэриҥ маннык сибидиэнньэни ыытарга туруоруллубатах эбит.\nБаҕар кини CGI олоҕурара буолуо ол иһин 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_size": "Кээмэйэ",
        "listfiles_description": "Быһаарыыта",
        "listfiles_count": "Барыллар",
+       "listfiles-show-all": "Ойуу эргэ барылларын эмиэ киллэр",
        "listfiles-latestversion": "Билиҥҥи барыла",
        "listfiles-latestversion-yes": "Сөп",
        "listfiles-latestversion-no": "Суох",
        "download": "хачайдаан ылыы",
        "unwatchedpages": "Ким да кэтээбэт сирэйдэрэ",
        "listredirects": "Көһөрүүлэр испииһэктэрэ",
+       "listduplicatedfiles": "Дубликааттаах билэлэр тиһиктэрэ",
+       "listduplicatedfiles-summary": "Бу тиһиккэ тиһэх барыллара атын билэлэр дубликааттарынан ааҕыллар билэлэр көрдөрүллүннүлэр. Локал билэлэр эрэ ааҕылыннылар.",
+       "listduplicatedfiles-entry": "[[:File:$1|$1]] билэ [[$3|{{PLURAL:$2|соҕотох дубликааттаах|$2 дубликааттаах}}]].",
        "unusedtemplates": "Туттуллубат халыыптар",
        "unusedtemplatestext": "Манна атын сирэйдэргэ туруоруллубатах {{ns:template}} сирэйдэр көстөллөр.\nСотоору гынар буоллаххына ол халыыпкар атын билэлэр сигэммэтэхтэрин бэрэбиэркэлээ.",
        "unusedtemplateswlh": "атын ыйынньыктар",
        "pageswithprop-prophidden-binary": "бинаар суолта кистэммит ($1)",
        "doubleredirects": "Хос көһөрөөһүн",
        "doubleredirectstext": "Бу сирэйгэ атын сиргэ утаарар хос утаарыылар тиһиктэрэ көстөр.\nХас устуруока аайы бастакы уонна иккис утаарыга сигэ баар, ону таһынан иккис утаарыыга баар сирэй аадырыһа (аата) баар, ол аата бастакы утаарыы дьиҥинэн ханна утаарыахтааҕа көстөр.\n<del>Сотуллубут</del> суруктар көннөрүллүбүттэр.",
-       "double-redirect-fixed-move": "[[$1]] сирэй аата уларытыллыбыт, билигин манна утаарар [[$2]]",
-       "double-redirect-fixed-maintenance": "[[$1]] сирэйтэн [[$2]] сирэйгэ хос утаарыыны көннөрүү.",
+       "double-redirect-fixed-move": "[[$1]] сирэй аата уларытыллыбыт.\nАптамаатынан саҥардыллыбыт уонна бу сирэйгэ утаарар [[$2]].",
+       "double-redirect-fixed-maintenance": "[[$1]] сирэйтэн [[$2]] сирэйгэ хос утаарыыны көннөрүү оҥоһулла сылдьар.",
        "double-redirect-fixer": "Утаарыылары көннөрөөччү",
        "brokenredirects": "Быстыбыт көһөрүүлэр",
        "brokenredirectstext": "Бу утаарыы сирэйдэрэ суох ыстатыйаларга сигэнэллэр (ыыталлар):",
        "ninterwikis": "$1 интервики-сигэ",
        "nlinks": "$1 {{PLURAL:$1|сигэлээх|сигэлэрдээх}}",
        "nmembers": "$1 {{PLURAL:$1|кыттааччы|кыттааччылаах}}",
+       "nmemberschanged": "$1 → $2 {{PLURAL:$2|эбийиэк|эбийиэктээх}}",
        "nrevisions": "$1 {{PLURAL:$1|барыллаах|барыл баар}}",
        "nviews": "$1 көрүүлээх",
        "nimagelinks": "$1 {{PLURAL:$1|сирэйгэ|ахсааннаах сирэйгэ}} туттуллар",
        "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": "Баччаҕа {{GENDER:$3|бэлиэтэммит}} $1,  $2",
        "newpages": "Саҥа ыстатыйалар",
        "log-title-wildcard": "Бу сурук бэлиэлэриттэн (буукубалартан) саҕаланар ааттары бул",
        "showhideselectedlogentries": "Талыллыбыт суруктары кистээ/көрдөр",
        "allpages": "Сирэйдэр барыта",
-       "alphaindexline": "мантан $1 маныаха дылы $2",
        "nextpage": "Аныгыскы сирэй ($1)",
        "prevpage": "Бу иннинээҕи сирэй ($1)",
        "allpagesfrom": "Мантан саҕаланар сирэйдэри көрдөр:",
        "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": "Сирэйгэ __INDEX__ диэн «аптаах тыл» баар эбит (сирэй ону көҥүллүүр аат далыгар баар эбит), онон көрдүүр роботтар кинини болҕомтоҕо ылыа да суох түгэннэргэ көрөллөр эбит.",
+       "post-expand-template-inclusion-category-desc": "Халыыптары барытын көрөдөрдөххө сирэй кээмэйэ маннааҕар улаатыа <code>$wgMaxArticleSize</code>, ол иһин сорох халыыптар көрдөрүллүбэтилэр.",
+       "post-expand-template-argument-category-desc": "Халыып аргуменын арыйдахха (фигурнай ускуопка иһигэр баары, холобур, <code>{{{Foo}}})</code>, сирэй маннааҕар улахан буолуо: <code>$wgMaxArticleSize</code>.",
+       "expensive-parserfunction-category-desc": "Сирэйгэ наһаа элбэх ресурсаны сиир функция туттуллубут (холобур, маннык <code>#ifexist</code>). Сиһилии — бу сирэйгэ: [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "broken-file-category-desc": "Бу категория билэҕэ алҕастаах сигэ баар буоллаҕына эбиллэр (суох билэҕэ сигэнии).",
+       "hidden-category-category-desc": "Маннык бэлиэлээх категория <code><nowiki>__HIDDENCAT__</nowiki></code> кинини категория салаатыгар көстөрүн бобор.",
+       "trackingcategories-nodesc": "Ойуулааһына суох.",
+       "trackingcategories-disabled": "Араарыллыбыт категория",
        "mailnologin": "Аадырыһа суох",
        "mailnologintext": "Атын кыттааччылары кытта e-mail көмөтүнэн суруйсуоххун баҕарар буоллаххына бэйэҕин [[Special:UserLogin|билиһиннэриэхтээххин]]  уонна e-mail аадырыскын [[Special:Preferences|туруорууларгар]] суруйуохтааххын.",
        "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 сирэйи кэтиигин|$1 сирэй эн кэтэбилгэр сылдьар}}.",
        "wlheader-enotif": "Эл. почтанан биллэрии холбоммут.",
        "wlheader-showupdated": "Бүтэһик киирииҥ кэннэ уларыйбыт сирэйдэр '''модьу''' бичигинэн бэлиэтэннилэр.",
-       "watchmethod-recent": "кэтээн көрүү бүтэһик уларыйыыларын көрүү",
-       "watchmethod-list": "кэтээһин бүтэһик уларыйыылара",
-       "watchlistcontains": "$1 сирэйи кэтээн көрөҕүн.",
-       "iteminvalidname": "'$1' моһуогурда, аата сатаммата...",
+       "wlnote2": "Манна {{PLURAL:$1|кэнники чааска|кэнники <strong>$1</strong> чааска}} оҥоһуллубут уларытыылар көстөллөр, $2 $3.",
        "wlshowlast": "бүтэһик $1 чааска $2 күҥҥэ $3 көрдөр",
        "watchlist-options": "Кэтээн көрүү туруоруутун уларытыы",
        "watching": "Кэтээ...",
        "enotif_lastvisited": "Бутэһик киирииҥ кэнниттэн оҥоһуллубут уларыйыылары барытын көрөргө манна киир: $1.",
        "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{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Аламай күн сырдыгынан, $WATCHINGUSERNAME!\n\n$PAGEINTRO $NEWPAGE\n\nУларытыы кылгас ис хоһооно: $PAGESUMMARY $PAGEMINOREDIT\n\nУларыппыт киһиэхэ суруйуоххун сөп:\nэл. почта: $PAGEEDITOR_EMAIL\nбиики: $PAGEEDITOR_WIKI\n\nБу сирэйи бэлиэтэммит ааккынан киирэн көрбөтөххүнэ уларыйбытын туһунан биллэриилэр кэлиэхтэрэ суоҕа. Биллэриилэри аналлаах сирэйгэ отой арааран кэбиһиэххин эмиэ сөп.\n\n             Бары үтүөнү кытта, {{SITENAME}} биллэрэр тиһигэ\n\n--\nБиллэрии кэлэрин салайыы\n{{canonicalurl:{{#special:Preferences}}}}\n\nКэтиир тиһиги уларытыы\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nКэтиир тиһиктэн сирэйдэри сотуу\n$UNWATCHURL\n\nКөмө\n$HELPPAGE",
        "created": "айыллыбыт",
        "changed": "уларыппыт (уларытыллыбыт)",
        "deletepage": "Сирэйи сот",
        "deletecomment": "Төрүөтэ:",
        "deleteotherreason": "Атын/эбии биричиинэлэр:",
        "deletereasonotherlist": "Атын биричиинэ",
-       "deletereason-dropdown": "*Common сотуу биричиинэтэ\n** ааптар ирдээһинэ\n** ааптар быраабын күөмчүлээһин\n** Алдьатыы (Вандализм)",
+       "deletereason-dropdown": "* Сотуу үксүгэр туттуллар төрүөттэрэ\n** спам\n** вандааллааһын\n** ааптар быраабын күөмчүлээһин\n** ааптар ирдэбилинэн\n** үлэлээбэт утаарыы",
        "delete-edit-reasonlist": "Сотуу төрүөтүн уларытыы",
        "delete-toobig": "Бу сирэй уларытыыларын историята уһун, хас да ($1) {{PLURAL:$1|хат көрүүлээх|хат көрүүлэрдээх}}. Маннык сирэйдэри сотор хааччахтанар, тоҕо диэххэ алҕас {{SITENAME}} алдьаныан сөп.",
        "delete-warning-toobig": "Бу сирэй уларыылара уһун историялаах, хас да ($1) {{PLURAL:$1|хат көрүүлээх|хат көрүүлэрдээх}}. Маны соттоххуна, {{SITENAME}} билэтин тиһигин алдьатыан сөп; салгыыр буоллаххына сэрэнэн үлэлээ.",
+       "deleting-backlinks-warning": "'''Сэрэтии.''' Сотоору гынар сирэйгэр [[Special:WhatLinksHere/{{FULLPAGENAME}}|атын сирэйдэр]] сигэнэллэр эбит.",
        "rollback": "Уруккутугар төннөр",
        "rollback_short": "Төннөрүү",
        "rollbacklink": "төннөр",
        "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": "([[User talk:$2|Ырытыы]]) көннөрүүлэрэ: [[Special:Contributions/$2|$2]] бу торумҥа: [[User:$1|$1]] төннөрүлүннүлэр",
-       "revertpage-nouser": "Аата кистэммит киһи уларытыылара суох оҥоһуллан, ыстатыйа бу киһи барылыгар төннөрүлүннэ [[User:$1|$1]]",
+       "revertpage-nouser": "Аата кистэммит киһи уларытыылара суох оҥоһуллан, ыстатыйа бу киһи барылыгар төннөрүлүннэ: {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "$1 көннөрүүлэр бу торумҥа төннөрүлүннүлэр: $2.",
        "sessionfailure-title": "Сиэссийэ алҕаһа",
        "sessionfailure": "Арааһа туох эрэ сатаммата, дьайыыҥ оҥоһуллубата. Браузергар \"Төнүн\" тимэҕи баттаа уонна бу иннинээҕи сирэйгин иккистээн киллэрэн көр.",
        "contributions": "{{GENDER:$1|Кыттааччы}} суруйуута (кылаата)",
        "contributions-title": "$1 кыттааччы киллэрбит уларытыылара",
        "mycontris": "Суруйуу тиһигэ",
-       "contribsub2": "Вклад $1 ($2)",
+       "contribsub2": "$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\"",
        "blockip": "IP аадырыстан киириини бобуу",
        "blockip-legend": "Кыттааччыны хааччахтааһын",
        "blockiptext": "Ханнык эмит IP-ттан суруйары манна баар форманы туһанан боп.\nВандализмы утаран уонна [[{{MediaWiki:Policy-url}}]]\nбыраабылалрын тутуһан эрэ бобуохтааххын.\nХайаан да бобуу төрүөтүн кэпсээ (холобур, вандализм баар сирэйдэриттэн\nбыһа тардан манна көрдөр).",
-       "ipadressorusername": "IP аадырыһа эбэтэр кыттааччы аата:",
+       "ipaddressorusername": "IP аадырыһа эбэтэр кыттааччы аата:",
        "ipbexpiry": "Түмүктэниэ:",
        "ipbreason": "Төрүөтэ:",
        "ipbreason-dropdown": "* Бобуу сүрүн биричиинэлэрэ\n** Сымыйаны суруйуу\n** Сирэй иһинээҕитин суох оҥоруу\n** Тас саайтарга спам-ыйынньыктары олордуу\n** Туох да суолтата суох тиэкиһи суруйуу\n** Кыттааччыларга суоһурҕаныы, күөмчүлээһин\n** Хас да аатынан киирэн куһаҕаны оҥоруу\n** Бүрүкүтэ суох ааттаныы",
        "blockipsuccesstext": "[[Special:Contributions/$1|«$1»]] бобуллубут/хааччахтаммыт.<br />\n[[Special:BlockList|Бобуллубут IP-лар тиһиктэрин]] көр.",
        "ipb-blockingself": "Эн бэйэҕин хааччахтаан эрэҕин! Ону өйдүүгүн дуо?",
        "ipb-confirmhideuser": "Кытааччыны хааччахтаан уонна аатын кистээн эрэҕин. Аата мантан инньэ тиһиктэргэ уонна сурунаалларга көстүбэт буолуо. Бигэргэтэҕин дуо?",
+       "ipb-confirmaction": "Бигэргэтэр буоллаххына, манна бэлиэтээ «{{int:ipb-confirm}}».",
        "ipb-edit-dropdown": "Бобуу биричиинэтин уларыт",
        "ipb-unblock-addr": "$1 бобуутун суох гын",
        "ipb-unblock": "Кыттаачыны эбэтэр IP-ны бобуллубуттар испииһэктэриттэн таһаар",
        "change-blocklink": "хааччахтааһыны уларытыы",
        "contribslink": "вклад",
        "emaillink": "суругу ыыт",
-       "autoblocker": "Эн IP-ҥ \"[[User:$1|$1]]\" кыттааччыны кытта биир буолан, эн эмиэ хааччахтаныыга түбэстиҥ. Кини хааччахтаммыт төрүөтэ: \"$2\"",
+       "autoblocker": "Эн IP-гын \"[[User:$1|$1]]\" кыттааччы туһаммыт буолан, эн эмиэ хааччахтаныыга түбэспиккин. \n$1 хааччахтаныытын төрүөтэ: \"$2\"",
        "blocklogpage": "Хааччахтааһын/бобуу сурунаала",
        "blocklog-showlog": "Бу кыттааччы бэлиэр хааччахтаммыт. Хааччах сурунаала аллара көстөр:",
        "blocklog-showsuppresslog": "Бу кыттааччы бэлиэр хааччахтаммыт уонна аата кистэммит. Аат кистээһин сурунаала аллара көстөр:",
        "range_block_disabled": "Дьаһабыллар диапазоннары боболлоро көҥүллэммэт.",
        "ipb_expiry_invalid": "Сатаммат кэми туруордуҥ.",
        "ipb_expiry_temp": "Аатын кистиэһиннээх бобуу больдьоҕо суох буолуохтаах.",
-       "ipb_hide_invalid": "Ð\91Ñ\83 Ð°Ð°Ñ\82Ñ\8b ÐºÐ¸Ñ\81Ñ\82ииÑ\80 Ñ\82абÑ\8bллÑ\8bбаÑ\82а, Ð±Ð°Ò\95аÑ\80 ÐºÐ¸Ð½Ð¸ Ð°Ð°Ñ\82Ñ\8bÑ\82Ñ\82ан Ð½Ð°Ò»Ð°Ð° Ñ\8dлбÑ\8dÑ\85 ÐºÓ©Ð½Ð½Ó©Ñ\80Ò¯Ò¯ Ð¾Ò¥Ð¾Ò»Ñ\83ллÑ\83бÑ\83Ñ\82а Ð±Ñ\83олÑ\83о.",
+       "ipb_hide_invalid": "Ð\91Ñ\83 Ð°Ð°Ñ\82Ñ\8b ÐºÐ¸Ñ\81Ñ\82ииÑ\80 Ñ\82абÑ\8bллÑ\8bбаÑ\82а, ÐºÐ¸Ð½Ð¸ Ð°Ð°Ñ\82Ñ\8bÑ\82Ñ\82ан {{PLURAL:$1|бииÑ\80 ÐºÓ©Ð½Ð½Ó©Ñ\80Ò¯Ò¯|$1 ÐºÓ©Ð½Ð½Ó©Ñ\80Ò¯Ò¯}} Ð¾Ò¥Ð¾Ò»Ñ\83ллÑ\83бÑ\83Ñ\82.",
        "ipb_already_blocked": "\"$1\" номнуо бобуллубут",
        "ipb-needreblock": "$1 бэлиэр хааччахтаммыт. Хааччахтааһын туруорууларын уларытыаххын баҕараҕын дуо?",
        "ipb-otherblocks-header": "Атын {{PLURAL:$1|хааччахтааһын|хааччахтааһыннар}}",
        "movepagetalktext": "Холбонуллубут ырытыы (баар буоллаҕына) эмиэ аатын уларытыа. Ол сатаммат түбэлтэлэрэ:\n*Маннык ааттаах кураанах буолбатах ырытыы баар буоллаҕына\n*Манна бэлиэ туруорбатаххына.\n\nИти түгэннэргэ сирэйдэри бэйэҥ көһөрүөхтээххин эбэтэр холбуохтааххын.",
        "movearticle": "Бу аатын уларыт:",
        "moveuserpage-warning": "'''Болҕой:''' Эн кыттааччы тус сирэйин аатын уларытаары гынныҥ. Инньэ гыннаххына сирэй аата эрэ уларыйыа, кыттааччы бэйэтин аата уларыйыа '''суоҕа'''.",
+       "movecategorypage-warning": "<strong>Сэрэтии:</strong> Категория сирэйин көһөрөөрү гынныҥ. Бука диэн, өйдөө, бу эрэ сирэй көһүө, эргэ категория атын сирэйдэрэ саҥа категорияҕа <em>киириэхтэрэ суоҕа</em>.",
        "movenologintext": "Эн аакын [[Special:UserLogin|билиһиннэрдэххинэ]] эрэ сирэй аатын уларытар кыахтаныаҥ.",
        "movenotallowed": "Cирэйдэр ааттарын уларытар кыаҕыҥ суох.",
        "movenotallowedfile": "Билэлэр ааттарын уларытар кыаҕыҥ суох.",
        "cant-move-user-page": "Эн кыттааччылар сүрүн сирэйдэрин аатын уларытар кыаҕыҥ суох.",
        "cant-move-to-user-page": "Эн кыттааччы аатын далыгар сирэйдэри уларытар кыаҕыҥ суох (анныкы сирэйдэриттэн ураты).",
+       "cant-move-category-page": "Категория сирэйин аатын уларытар кыаҕыҥ суох эбит.",
+       "cant-move-to-category-page": "Сирэй аатын уларытан категория сирэйэ гынар кыаҕыҥ суох эбит.",
        "newtitle": "Саҥа аата:",
        "move-watch": "Кэтээн көрөргө",
        "movepagebtn": "Аатын уларыт",
        "allmessages-prefix": "Префиксынан сиидэлиир:",
        "allmessages-language": "Тыла:",
        "allmessages-filter-submit": "Көс",
+       "allmessages-filter-translate": "Тылбаас",
        "thumbnail-more": "Улаатыннар",
        "filemissing": "Билэ көстүбэтэ",
        "thumbnail_error": "Кыра ойууну оҥоруу сатаммата: $1",
        "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|аналлаах сурунаалга]] суруллаллар.",
        "importuploaderrortemp": "Хачайдааhын тохтотулунна. Быстах кэмҥэ уурар сир көстүбэтэ.",
        "import-parse-failure": "Импортааһын кэмигэр ошибка разбора XML",
        "import-noarticle": "Импортанар сирэй суох!",
-       "import-nonewrevisions": "ТÑ\83оÑ\85 Ð±Ð°Ð°Ñ\80 Ñ\82оÑ\80Ñ\83мнаÑ\80 Ð±Ñ\83 Ð¸Ð½Ð½Ð¸Ð½Ñ\8d Ð¸Ð¼Ð¿Ð¾Ñ\80Ñ\82аммÑ\8bÑ\82Ñ\82аÑ\80/импоÑ\80Ñ\82аннÑ\8bлаÑ\80.",
+       "import-nonewrevisions": "Ð\91ииÑ\80 Ð´Ð° Ñ\83лаÑ\80Ñ\8bÑ\82Ñ\8bÑ\8b Ð¸Ð¼Ð¿Ð¾Ñ\80Ñ\82аммаÑ\82а (бÑ\83 Ð¸Ð½Ð½Ð¸Ð½Ñ\8d Ñ\82аҥаÑ\81Ñ\82аммÑ\8bÑ\82Ñ\82аÑ\80, Ð±Ð¸Ð¸Ñ\82Ñ\8dÑ\80 Ð°Ð»Ò\95аÑ\81Ñ\82ааÑ\85 Ð±Ñ\83олан ÐºÓ©Ñ\82Ò¯Ñ\82үллүбүÑ\82Ñ\82Ñ\8dÑ\80).",
        "xml-error-string": "$1 - $2 строка, $3 колонка ($4 байт): $5",
        "import-upload": "XML-дааннайдары киллэр",
        "import-token-mismatch": "Арахсан хаалбыт. Өссө киирэн көр.",
        "import-error-interwiki": "\"$1\" сирэй импортаммата, тоҕо диэтэххэ бу аат тас сигэлэргэ (интервикаҕа) аналлаах эбит.",
        "import-error-special": "\"$1\" сирэй импортаммата, тоҕо диэтэххэ кини баар аат далыгар саҥа сирэйдэри оҥорор көҥүллэммэт эбит.",
        "import-error-invalid": "\"$1\" сирэй импортаммата, тоҕо диэтэххэ маннык аат туттуллара бобуллубут.",
+       "import-error-unserialize": "«$1» сирэй $2 барыла структуураланар (десериализация) кыаҕа суох. Барылга иһинээҕитин модела маннык: $3, маннык серияланар: $4.",
        "import-options-wrong": "Алҕастаах {{PLURAL:$2|опция|опциялар}}: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "Тирэх сирэй ыйыллыбыт аата алҕастаах.",
        "import-rootpage-nosubpage": "\"$1\" тирэх сирэй аатын далыгар сирэй үөдүҥнэрэ (подстраницалар) көҥүллэммэттэр",
        "monobook.css": "/* Манна оҥоһуллубут CSS Monobook диэн скиҥҥа туһаныллыа */",
        "common.js": "/* Оҥоһуллубут JavaScript ханнык баҕарар киһи манна киирдэҕинэ үлэлээн кэлиэ. */",
        "monobook.js": "/* Эргэрбит; маны туһан:[[MediaWiki:common.js]] */",
-       "notacceptable": "Биики-сиэрбэр эн браузерыҥ ааҕар формаатын кыайан көрдөрбөт.<br /> The wiki server can't provide data in a format your client can read.",
        "anonymous": "{{SITENAME}} ааттамматах {{PLURAL:$1|кыттааччыта|кыттааччылара}}",
        "siteuser": "{{SITENAME}} кыттааччыта $1",
        "anonuser": "{{SITENAME}} бэйэтин билиһиннэрбэтэх кыттааччыта $1",
        "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": "Көрдүүр сулууспалар туруктара",
-       "pageinfo-robot-index": "Индекстанар",
-       "pageinfo-robot-noindex": "Индекстаммат",
+       "pageinfo-content-model": "Сирэй иһинээҕитин модела",
+       "pageinfo-robot-policy": "Роботтар көрдөөһүннэрин туруга",
+       "pageinfo-robot-index": "Көҥүллэммит",
+       "pageinfo-robot-noindex": "Араарыллыбыт",
        "pageinfo-views": "Көрүү ахсаана",
        "pageinfo-watchers": "Кэтээнэр сирэйдэр ахсааннара",
        "pageinfo-few-watchers": "$1 кыттааччыттан аҕыйах кэтээччи",
        "pageinfo-category-pages": "Сирэй ахсаана",
        "pageinfo-category-subcats": "Субкатегория ахсаана",
        "pageinfo-category-files": "Билэ ахсаана",
-       "skinname-modern": "Билиҥҥи",
        "markaspatrolleddiff": "Бэрэбиэркэлэммит курдук бэлиэтээ",
        "markaspatrolledtext": "Бу ыстатыйаны бэрэбиэркэлэммит курдук бэлиэтээ",
        "markedaspatrolled": "Бэрэбиэркэлэммит курдук бэлиэтэннэ",
        "svg-long-desc": "SVG билэ, номинальнай кээмэйэ $1 × $2 пииксэл, билэ кээмэйэ: $3",
        "svg-long-desc-animated": "$1 × $2 пииксэллээх анимацияламмыт SVG-билэ, кээмэйэ: $3",
        "svg-long-error": "Алҕастаах SVG-билэ: $1",
-       "show-big-image": "Ð\9eйÑ\83Ñ\83 Ð±Ñ\8dйÑ\8dÑ\82ин Ñ\82олоÑ\80Ñ\83 ÐºÑ\8dÑ\8dмÑ\8dйэ",
+       "show-big-image": "Ð\91илÑ\8d Ð±Ñ\8dйÑ\8dÑ\82э",
        "show-big-image-preview": "Бигэргэтиэх иннинэ көрүү улахана: $1.",
        "show-big-image-other": "Атын {{PLURAL:$2|түмүк|түмүктэр}}: $1.",
        "show-big-image-size": "$1 × $2 пииксэл",
        "newimages-summary": "Бу анал сирэй киллэриллибит билэлэр испииһэктэрин көрдөрөр.",
        "newimages-legend": "Фильтр",
        "newimages-label": "Билэ аата (эбэтэр сорҕото):",
-       "showhidebots": "($1 робот)",
+       "newimages-showbots": "Руобаттар хачайдааһыннарын көрдөр",
        "noimages": "Ойуу суох.",
        "ilsubmit": "Көрдөт",
        "bydate": "айыллыбыт кэминэн",
        "exif-compression-3": "CCITT Group 3, факс куодтааһына",
        "exif-compression-4": "CCITT Group 4, факс куодтааһына",
        "exif-copyrighted-true": "Ааптар быраабынан араҥаччыланар",
-       "exif-copyrighted-false": "Ð\91аÑ\80-дÑ\8cон Ð±Ð°Ñ\81 Ð±Ð¸Ð»Ð¸Ð¸Ñ\82Ñ\8d",
+       "exif-copyrighted-false": "Ð\91аÑ\81 Ð±Ð¸Ð»Ð¸Ð¸Ñ\82Ñ\8d Ñ\87опÑ\87Ñ\83ламмаÑ\82аÑ\85",
        "exif-unknowndate": "Күнэ-ыйа биллибэт",
        "exif-orientation-1": "Нуорма",
        "exif-orientation-2": "Сытыары көстүбүт",
        "confirmemail_subject": "{{SITENAME}}: эл. почта аадырыһын бигэргэтии",
        "confirmemail_body": "Ким эрэ, баҕар эн буолуо бу IP-ттан: $1, {{SITENAME}} сиэрбэригэр\n«$2» диэн ааты бэлиэтээтэ уонна бу электроннай аадырыһы ыйда.\n\nМаны сөбүлэһэр буоллаххына бу ыйынньыгы: $3 баттаан\n{{SITENAME}} аадырыскын туһанарын көҥүллүүргүн бигэргэт (болдьоҕо $4 дылы).\n\nОттон бу туһунан тугу да билбэт буоллаххына бу ыйынньыгынан баран эл. почтаҕын сотон кэбис:\n\n$5",
        "confirmemail_body_changed": "Ким эрэ (баҕар эн буолуо) маннык IP-ттан: $1\nбу аадырыһы «$2» диэн {{SITENAME}} кыттаччыта бэйэтин саҥа аадырыһын курдук эттэ.\n\nБу кытааччы аата кырдьык эйиэнэ буоларын бигэргэтэр буоллаххына,\nуонна {{SITENAME}} саайтан эйиэхэ сурук кэлэрин сөбүлэһэр буоллаххына, аллара баар сигэни арый.\n\n$3\n\nӨскө бу аат эйиэхэ сыһыана суох буоллаҕына, бу сигэнэн бараҥҥын,\nаадырыс бигэргэтиитин уурат\n\n$5\n\nБигэргэтии куода баччаҕа дылы болдьохтоох: $4.",
-       "confirmemail_body_set": "Ð\9aим Ñ\8dÑ\80Ñ\8d (баÒ\95аÑ\80 Ñ\8dн Ð±Ñ\83олÑ\83о) Ð¼Ð°Ð½Ð½Ñ\8bк IP-Ñ\82Ñ\82ан: $1\nбÑ\83 Ð°Ð°Ð´Ñ\8bÑ\80Ñ\8bÒ»Ñ\8b Â«$2» Ð´Ð¸Ñ\8dн {{SITENAME}} ÐºÑ\8bÑ\82Ñ\82ааÑ\87Ñ\87Ñ\8bÑ\82а Ð±Ñ\8dйÑ\8dÑ\82ин Ð°Ð°Ð´Ñ\8bÑ\80Ñ\8bÒ»Ñ\8bн ÐºÑ\83Ñ\80дÑ\83к Ñ\8dÑ\82Ñ\82Ñ\8d.\n\nÐ\91Ñ\83 ÐºÑ\8bÑ\82ааÑ\87Ñ\87Ñ\8b ÐºÑ\8bÑ\80дÑ\8cÑ\8bк Ð­Ð½ Ð±Ñ\8dйÑ\8dÒ¥ Ð±Ñ\83олаÑ\80Ñ\8bн Ð±Ð¸Ð³Ñ\8dÑ\80гÑ\8dÑ\82Ñ\8dÑ\80 Ð±Ñ\83оллаÑ\85Ñ\85Ñ\8bна,\nÑ\83онна {{SITENAME}} Ñ\81аайÑ\82ан Ñ\8dйиÑ\8dÑ\85Ñ\8d Ñ\81Ñ\83Ñ\80Ñ\83к ÐºÑ\8dлÑ\8dÑ\80ин Ñ\81өбүлÑ\8dÒ»Ñ\8dÑ\80 Ð±Ñ\83оллаÑ\85Ñ\85Ñ\8bна, Ð°Ð»Ð»Ð°Ñ\80а Ð±Ð°Ð°Ñ\80 Ñ\81игÑ\8dни Ð±Ð°Ñ\82Ñ\82аа:\n\n$3\n\nÓ¨Ñ\81кө Ð±Ñ\83 Ð°Ð°Ñ\82 Ñ\8dйиÑ\8dÑ\85Ñ\8d Ñ\81Ñ\8bÒ»Ñ\8bана Ñ\81Ñ\83оÑ\85 буоллаҕына, бу сигэнэн бараҥҥын,\nаадырыс бигэргэтиитин уурат:\n\n$5\n\nБигэргэтии куода баччаҕа дылы болдьохтоох: $4.",
+       "confirmemail_body_set": "Ð\9aим Ñ\8dÑ\80Ñ\8d (баÒ\95аÑ\80 Ñ\8dн Ð±Ñ\83олÑ\83о) Ð¼Ð°Ð½Ð½Ñ\8bк IP-Ñ\82Ñ\82ан: $1\nбÑ\83 Ð°Ð°Ð´Ñ\8bÑ\80Ñ\8bÒ»Ñ\8b Â«$2» Ð´Ð¸Ñ\8dн {{SITENAME}} ÐºÑ\8bÑ\82Ñ\82ааÑ\87Ñ\87Ñ\8bÑ\82а Ð±Ñ\8dйÑ\8dÑ\82ин Ð°Ð°Ð´Ñ\8bÑ\80Ñ\8bÒ»Ñ\8bн ÐºÑ\83Ñ\80дÑ\83к Ñ\8dÑ\82Ñ\82Ñ\8d.\n\nÐ\9cанÑ\8b Ð±Ð¸Ð³Ñ\8dÑ\80гÑ\8dÑ\82Ñ\8dÑ\80 Ð±Ñ\83оллаÑ\85Ñ\85Ñ\8bна,\nÑ\83онна {{SITENAME}} Ñ\81иÑ\82им-Ñ\81иÑ\80иÑ\82Ñ\82Ñ\8dн Ñ\8dйиÑ\8dÑ\85Ñ\8d Ñ\81Ñ\83Ñ\80Ñ\83к ÐºÑ\8dлÑ\8dÑ\80ин Ñ\81өбүлÑ\8dÒ»Ñ\8dÑ\80 Ð±Ñ\83оллаÑ\85Ñ\85Ñ\8bна, Ð°Ð»Ð»Ð°Ñ\80а Ð±Ð°Ð°Ñ\80 Ñ\81игÑ\8dни Ð±Ð°Ñ\82Ñ\82аа:\n\n$3\n\nÓ¨Ñ\81кө Ð±Ñ\83 Ð°Ð°Ñ\82 Ñ\8dйиÑ\8dÑ\85Ñ\8d Ñ\81Ñ\8bÒ»Ñ\8bана *Ñ\81Ñ\83оÑ\85* буоллаҕына, бу сигэнэн бараҥҥын,\nаадырыс бигэргэтиитин уурат:\n\n$5\n\nБигэргэтии куода баччаҕа дылы болдьохтоох: $4.",
        "confirmemail_invalidated": "Электроннай почта аадырыһын бигэргэтиини суох оҥоһулунна",
        "invalidateemail": "Эл. почта бигэргэтээһинин араарга",
        "scarytranscludedisabled": "[Interwiki transcluding араҕыста]",
        "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": "Аныгыскы сирэй",
        "autoredircomment": "Утаарыы: [[$1]]",
        "autosumm-new": "'$1' ыйааһыннаах саҥа сирэй оҥоһулунна",
        "size-bytes": "$1 байт",
-       "livepreview-loading": "Киллэрии бара турар…",
-       "livepreview-ready": "Суруттарыы… Бэлэм!",
-       "livepreview-failed": "Түргэн инники көрүү моһуогурда! Көннөрү инники көрүүнү туһан.",
-       "livepreview-error": "Холбоммото: $1 \"$2\". Көннөрү инники көрүүнү туһан.",
        "lag-warn-normal": "$1 {{PLURAL:$1|сөкүүндэ|сөкүүндэ}} иһинэн оҥоһуллубут уларытыылар манна көстүө суохтарын сөп.",
        "lag-warn-high": "Синхронизация лаппа хойутуур буолан кэнники $1 {{PLURAL:$1|сөкүүндэ|сөкүүндэ}} иһинэн оҥоһуллубут уларытыылар манна көстүө суохтарын сөп.",
-       "watchlistedit-numitems": "Эн кэтиир тиһигиҥ {{PLURAL:$1|1 суруктаах|$1 пууннаах}}, ырытыы сирэйэ ааҕыллыбата.",
-       "watchlistedit-noitems": "Эн кэтиир тиһигиҥ кураанах.",
        "watchlistedit-normal-title": "Кэтэбил тиһигин уларытыы",
        "watchlistedit-normal-legend": "Кэтэбил тиһигиттэн пууннары сотуу",
        "watchlistedit-normal-explain": "Манна кэтиир сирэйдэриҥ тиһигэ көстөр.\nБиири эмит сотоору гынар буоллаххына кинини бэлиэтээ, онтон \"{{int:Watchlistedit-normal-submit}}\" тимэҕи баттаа.\nӨссө манна [[Special:EditWatchlist/raw|тиһиги тиэкис быһыытынан уларытыаххын]] сөп.",
        "watchlistedit-raw-done": "Саҥа испииһэк бигэргэтилиннэ.",
        "watchlistedit-raw-added": "Тиһиккэ {{PLURAL:$1|1 пуун эбилиннэ|$1 пуун эбии киирдэ}}:",
        "watchlistedit-raw-removed": "Испииһэктэн {{PLURAL:$1|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 сурук}} сотулунна:",
+       "watchlistedit-too-many": "Манна кыайан көстүбэт элбэх сирэй.",
+       "watchlisttools-clear": "Кэтэбил тиһигин сот",
        "watchlisttools-view": "Атыҥҥа сабыдыаллаах уларытыылар",
        "watchlisttools-edit": "Кэтэбил испииһэгин көрүү/уларытыы",
        "watchlisttools-raw": "\"Сиикэй\" испииһэги уларытыы",
        "version-hook-name": "Перехватчик аата",
        "version-hook-subscribedby": "Суруттарыыта:",
        "version-version": "(Торум $1)",
-       "version-license": "Лиссиэнзийэ",
+       "version-license": "MediaWiki лиссиэнсийэтэ",
+       "version-ext-license": "Лиссиэнсийэ",
+       "version-ext-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/ MediaWiki]''', copyright © 2001-$1 $2.",
        "version-poweredby-others": "атыттар",
        "version-poweredby-translators": "translatewiki.net тылбаасчыттара",
        "version-entrypoints": "Киирэр аадырыстар (URL)",
        "version-entrypoints-header-entrypoint": "Киирии сирэ",
        "version-entrypoints-header-url": "URL",
-       "redirect": "Билэттэн, кыттааччыттан эбэтэр барыл идентификаторыттан утаарыы",
+       "redirect": "Билэттэн, кыттааччыттан, сирэйтэн эбэтэр барыл идентификаторыттан утаарыы",
        "redirect-legend": "Билэҕэ эбэтэр сирэйгэ утаарыы",
+       "redirect-summary": "Бу аналлаах сирэй билэҕэ (билэ аатыттан), сирэйгэ (барыл эбэтэр сирэй идентификааторыттан) эбэтэр кыттааччы сирэйигэр (кыттааччы идентификаторыттан) утаарар. Туһаныы: \n[[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], \n[[{{#Special:Redirect}}/revision/328429]] эбэтэр\n[[{{#Special:Redirect}}/user/101]].",
        "redirect-submit": "Толор",
        "redirect-lookup": "Көрдөт:",
        "redirect-value": "Суолтата:",
        "redirect-user": "Кыттааччы нүөмэрэ",
+       "redirect-page": "Сирэй нүөмэрэ",
        "redirect-revision": "Сирэй барыла",
        "redirect-file": "Билэ аата",
        "redirect-not-exists": "Суолта көстүбэтэ",
        "fileduplicatesearch-result-n": "\"$1\" билэ {{PLURAL:$2|1 хатылааһыннаах эбит|$2 хатылааһыннардаах эбит}}.",
        "fileduplicatesearch-noresults": "«$1» диэн билэ суох эбит.",
        "specialpages": "Анал сирэйдэр",
-       "specialpages-note": "* Көннөрү анал сирэйдэр.\n* <strong class=\"mw-specialpagerestricted\">Хааччахтардаах анал сирэйдэр.</strong>\n* <span class=\"mw-specialpagecached\">Кээстэммит анал сирэйдэр (эргэрбит буолуохтарын сөп).</span>",
+       "specialpages-note-top": "Легендата",
+       "specialpages-note": "* Көннөрү анал сирэйдэр.\n* <span class=\"mw-specialpagerestricted\">Хааччахтардаах анал сирэйдэр.</span>",
        "specialpages-group-maintenance": "Техническэй отчуоттар",
        "specialpages-group-other": "Атын аналлаах сирэйдэр",
        "specialpages-group-login": "Киирии / бэлиэтэнии",
        "tags-tag": "Бэлиэ (тиэк) аата",
        "tags-display-header": "Уларыйыы тиһиктэригэр хайдах көстөрө",
        "tags-description-header": "Суолта толору ис хоһооно",
+       "tags-active-header": "Үлэлиир дуо?",
        "tags-hitcount-header": "Бэлиэтэммит бэлиэлэр",
+       "tags-active-yes": "Сөп",
+       "tags-active-no": "Суох",
        "tags-edit": "уларытыы",
        "tags-hitcount": "$1 {{PLURAL:$1|уларытыы|уларытыылар}}",
        "comparepages": "Сирэйдэри тэҥнииргэ",
        "compare-invalid-title": "Суруллубут аат туттуллара сатаммат.",
        "compare-title-not-exists": "Ыйбыт аатыҥ суох эбит.",
        "compare-revision-not-exists": "Ыйбыт барылыҥ суох эбит.",
-       "dberr-header": "Бу биики туга эрэ сатаммата",
        "dberr-problems": "Баалаама! Бу саайт техническэй ыарахаттары көрсүбүт.",
        "dberr-again": "Аҕыйах мүнүүтэннэн саҥардан көрөөр.",
        "dberr-info": "(Билэ тиһигин кытта ситим быстыбыт: $1)",
+       "dberr-info-hidden": "(Билэ тиһигин кытта ситим суох)",
        "dberr-usegoogle": "Онуоха-маныаха дылы Google көмөтүнэн көрдүөххүн сөп.",
        "dberr-outofdate": "Индэксэ эргэрбит буолуон сөбүн умнума.",
        "dberr-cachederror": "Сирэй кээштэммит барыла көстөр, баҕар эргэрбит буолуон сөп.",
        "htmlform-no": "Суох",
        "htmlform-yes": "Сөп",
        "htmlform-chosen-placeholder": "Барылы тал",
+       "htmlform-cloner-create": "Өссө эп",
+       "htmlform-cloner-delete": "Сот",
+       "htmlform-cloner-required": "Саатар биирин толоруохтаах эбиккин.",
        "sqlite-has-fts": "$1 толору тиэкистээх көрдөөһүнү өйүүр",
        "sqlite-no-fts": "$1 толору тиэкистээх көрдөөһүнү өйөөбөт",
        "logentry-delete-delete": "$3 сирэйи $1 соппут",
        "logentry-delete-restore": "$3 сирэйи $1 сөргүппүт",
        "logentry-delete-event": "Сурунаал $5 суругун көстүүтүн манна $3 $1 уларыппыт: $4",
-       "logentry-delete-revision": "Сурунаал $5 суругун көстүүтүн бу сирэйгэ $3 $1 уларыппыт: $4",
+       "logentry-delete-revision": "$3 сирэй $5 барылын көстүүтүн бу сирэйгэ $1 уларыппыт: $4",
        "logentry-delete-event-legacy": "$3 сурунаал суруктарын көстүүтүн $1 уларыппыт",
        "logentry-delete-revision-legacy": "$3 сирэй барылларын көстүүтүн $1 уларыппыт",
        "logentry-suppress-delete": "$3 сирэйи $1 баттаабыт",
        "api-error-overwrite": "Баар билэни уларытар сатаммат.",
        "api-error-stashfailed": "Ис алҕас: сиэрбэр быстах кэмҥэ оҥоһуллубут билэни кыайан бигэргэппэтэх.",
        "api-error-publishfailed": "Ис алҕас: сиэрбэр быстах билэни кыайан бигэргэппэтэх.",
+       "api-error-stasherror": "Билэни угарга алҕас таҕыста.",
        "api-error-timeout": "Сиэрбэр кэтэһэр кэмҥэ хоруйдаабата.",
        "api-error-unclassified": "Биллибэт алҕас таҕыста",
        "api-error-unknown-code": "Биллибэт алҕас: «$1»",
        "duration-centuries": "$1 үйэ",
        "duration-millennia": "$1 тыһыынча сыл",
        "rotate-comment": "Ойуу $1 кыраадыс чаһы хоту эргитиллибит",
+       "limitreport-title": "Анализатор дааннайдара:",
+       "limitreport-cputime": "Процессору туһаныы",
+       "limitreport-cputime-value": "$1 сөкүүндэ",
+       "limitreport-walltime-value": "$1 {{PLURAL:$1|сөкүүндэ|сөкүүндэ}}",
+       "limitreport-ppvisitednodes": "Препроцессор көрбүт сирдэрин ахсаана",
+       "limitreport-ppgeneratednodes": "Препроцессор оҥорбут түмүктэрин (node) ахсаана",
+       "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Парсер функциялара эмиэ тэнитиллэллэр. Холобур, <nowiki>{{</nowiki>#language:...}} уонна переменнайдар <nowiki>{{</nowiki>CURRENTDAY}} уо.&nbsp;д.&nbsp;а. — уопсайынан, хос фигурнай скобка иһигэр баар барыта.\nБу дьайыы сыыһата суох, MediaWiki көмөтүнэн оҥоһуллар.",
+       "expand_templates_intro": "Бу аналлаах сирэй тиэкис туох баар халыыптарын тэнитэн көрдөрөр.\nПарсер функциялара эмиэ тэнитиллэллэр. \n<code><nowiki>{{</nowiki>#language:...}}</code> уонна переменнайдар <code><nowiki>{{</nowiki>CURRENTDAY}}</code>. \nУопсайынан, бу барыта хос фигурнай ускуопка иһигэр баар.",
        "expand_templates_title": "{{FULLPAGENAME}} сирэй аата уонна да атын сибидиэнньэлэр:",
        "expand_templates_input": "Киирэр сурук:",
        "expand_templates_output": "Түмүк",
        "expand_templates_xml_output": "XML тахсыыта",
+       "expand_templates_html_output": "HTML-таһаарыы",
        "expand_templates_ok": "OK",
        "expand_templates_remove_comments": "Ырытыылары сот",
        "expand_templates_remove_nowiki": "Түмүккэ <nowiki> бэлиэни аахсыма",
        "expand_templates_generate_xml": "XML-ы мас курдук көрдөр",
+       "expand_templates_generate_rawhtml": "HTML-ы көрдөр",
        "expand_templates_preview": "Холоон көрүү"
 }
index 969eee0..99d07b5 100644 (file)
@@ -10,7 +10,9 @@
                        "Rillke",
                        "Salvator",
                        "Samar88",
-                       "Srabony90"
+                       "Srabony90",
+                       "아라",
+                       "Shirayuki"
                ]
        },
        "tog-underline": "Joṛaoko latarre dag udugoḱma:",
@@ -23,7 +25,6 @@
        "tog-showtoolbar": "Joṛaoakanaḱ ṭulbar udugoḱma",
        "tog-editondblclick": "Bar dhao lin kate sakam torjomão reaḱ ạidari emogoḱma",
        "tog-editsectiononrightclick": "Pahaṭa reaḱ pahaṭa guṭkathare jojom seć lin hotete <br /> pahaṭa sompadon lạgitte ektiạr em hoyoḱma (JavaScript)",
-       "tog-rememberpassword": "Noa sendrare amaḱ boloḱ reaḱ katha (katha cạbi) disạimẽ (jạstite $1 {{PLURAL:$1din reaḱ din reaḱ}} lạgit)",
        "tog-watchcreations": "Ińaḱ tear sakam ar rakaṕ páelko ińaḱ ńelogoḱ tạlikare ńeloḱ ma",
        "tog-watchdefault": "Ińaḱ purạoakanaḱ sakam ar phayelko do ińaḱ ńeloḱ tạlikare joṛaoḱma",
        "tog-watchmoves": "Ińaḱ ocoḱ sakam ar phayelko inyaḱ nojor sakamre joṛaḱma",
        "readonly_lag": "Ḍaṭabes do aćhote tege bondo hoe akana, je lekate udhin reaḱ ḍaṭabes sarvarkor mukhiạ ḍaṭabes sarvar lekate heć daṛeaḱ.",
        "internalerror": "Bhitri reaḱ bhul",
        "internalerror_info": "Bhitri reaḱ vul: $1",
-       "fileappenderrorread": "Jońṛao oktere \"$1\" baṅ paṛhaolena.",
-       "fileappenderror": "\"$1\" do \"$2\" saõte joṛao baṅ ganoḱ kana.",
        "filecopyerror": "\"$1\" rẽt khon \"$2\" rẽt baṅ kopilena.",
        "filerenameerror": "\"$1\" rẽt reaḱ ńutum bodol kate \"$2\" em baṅ hoyoḱ kana.",
        "filedeleteerror": "$1 sakam do baṅ get́ giḍiḱ lena",
        "directorycreateerror": "\"$1\" dayrekṭori do baṅ tearlena.",
        "filenotfound": "\"$1\" rẽt do baṅ sendra ńamoḱ kana.",
-       "fileexistserror": "\"$1\" rẽtre baṅ oloḱ kana: Rẽt do lahare menaḱa.",
        "unexpected": "Baṅ asakan mạn: \"$1\"=\"$2\".",
        "formerror": "Vul: forom do baṅ jimạlena.",
        "badarticleerror": "Noa sakamre kạmiko do baṅ puraolena.",
        "savearticle": "Sakam dohoeme",
        "preview": "Ńel, Unuduḱ",
        "showpreview": "Unuduḱ",
-       "showlivepreview": "Jewet uduk",
        "showdiff": "Bodolko ńeloḱma",
        "anoneditwarning": "'''Sabdhan:''' amdo begor logkatem bolowakana.\nAmaḱ IP ṭhikana do noa sakam sompadon jạṛre rekorḍoḱa.",
        "anonpreviewwarning": "\"Am do bhitri bam bolo akana. Noa sakamre amaḱ kạmiko jạre IP ṭhiikạ̣nare rukhiyạ ḱa.\"",
        "accmailtitle": "Uku nambar do kulena.",
        "accmailtext": "[[User talk:$1 $1]] lạgit́te aćte benaoen uku nambar do $2 kul hoena.\nBhitri bolo kateḱ noa nãwã ekaunṭ lạgit uku nambar \"[[Special:ChangePassword Change password]]\" sakam khonem bodol daṛyakya.",
        "newarticle": "(Nãwa)",
-       "newarticletext": "Am do oka mitṭen joṛaoem pańja akada, onaṭak do bạnuḱa.\nOna sakam tear lạgit́te, latar reaḱ baksore ol ehoṕmẽ (arhõ jạsti baḍae lạgit́te [[{{mediaWiki:Helppage}}help page] pańjaemẽ).\nAm do judi nonḍe vulkatem heć akan khan, tobe amaḱ sendrakore '''back''' baṭon linmẽ.",
+       "newarticletext": "Am do oka mitṭen joṛaoem pańja akada, onaṭak do bạnuḱa.\nOna sakam tear lạgit́te, latar reaḱ baksore ol ehoṕmẽ (arhõ jạsti baḍae lạgit́te [$1 help page] pańjaemẽ).\nAm do judi nonḍe vulkatem heć akan khan, tobe amaḱ sendrakore '''back''' baṭon linmẽ.",
        "noarticletext": "Nitoḱ noa sakamre do ol bạnuḱa.\n\nYou can [[Special:Search/{{PAGENAME}}|search for this page title]] in other pages,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs],\nor [{{fullurl:{{FULLPAGENAME}}|action=edit}} edit this page]</span>.",
        "noarticletext-nopermission": "Noa sakamre do nitoḱ o̠l banuḱa.\n\nYou can [[Special:Search/{{PAGENAME}}|search for this page title]] in other pages,\nor <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs]</span>.",
        "userpage-userdoesnotexist": "\"<nowiki>$1</nowiki>\" ńutuman jahãe beoharićaḱ ekaunṭ do baṅ resṭri hoeakana. Daya kate biḍạo katet́ ńelmẽ noa sakam do benoa/sompadonem menet́ kana se baṅ.",
        "prefs-files": "Rẽtko",
        "youremail": "E-mail:",
        "username": "Beoharićaḱ ńutum:",
-       "uid": "Beoharićaḱ cinhạo nombor",
        "yourrealname": "Sạri ńutum",
        "yourlanguage": "Pạrsi:",
        "gender-male": "Baba hoṛ",
        "recentchanges-label-bot": "Noa sompadon do bot darate purauena",
        "recentchanges-label-unpatrolled": "Noa sompadon do ńit́ hạbić baṅ ńel ńamakana",
        "rcnotefrom": "$2 habić bodolak ko do latare ńeloḱkana",
-       "rclistfrom": "Nãwã  bodolko uduḱme $1 khon ehoṕkate",
+       "rclistfrom": "Nãwã  bodolko uduḱme $3 $2 khon ehoṕkate",
        "rcshowhideminor": "$1 kaṭic culuń tońge",
        "rcshowhidebots": " boṭko $1",
        "rcshowhideliu": "Beoharićaḱ boloḱ $1",
        "booksources-go": "Calaḱme",
        "log": "Cạbiko",
        "allpages": "joto sakam",
-       "alphaindexline": "$1 hạbić $2",
        "allarticles": "Sanam sakam",
        "allpagessubmit": "Calaḱme",
        "categories": "rokom sokom",
index 5b43419..fd8d734 100644 (file)
@@ -5,7 +5,8 @@
                        "L2212",
                        "Marzedu",
                        "Node ue",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Sutalìnea is cullegamentos",
@@ -18,7 +19,6 @@
        "tog-showtoolbar": "Ammustra s'amusta de is ainas pro is acontzos (esigit JavaScript)",
        "tog-editondblclick": "Acontza pàginas cun dòpiu click (esigit JavaScript)",
        "tog-editsectiononrightclick": "Abilita s'acontzu de is setziones cun dòpiu click in is tìtulos de is setziones (esigit JavaScript)",
-       "tog-rememberpassword": "Ammenta sa sessione in custu navigadore (pro unu màssimu de $1 {{PLURAL:$1|die|dies}})",
        "tog-watchcreations": "Aciungi is pàginas chi apo creadu a sa watchlist mea",
        "tog-watchdefault": "Aciungi is pàginas chi apo acontzadu a sa watchlist mea",
        "tog-watchmoves": "Aciungi is pàginas chi apo mòvidu a sa watchlist mea",
        "savearticle": "Sarva sa pàgina",
        "preview": "Antiprima",
        "showpreview": "Ammustra s'antiprima",
-       "showlivepreview": "Funtzione ''Live preview''",
        "showdiff": "Ammustra is mudàntzias",
        "anoneditwarning": "'''Atentzione:''' Non ses identificadu (log in).\nS'indiritzu IP tuo at a èsser registradu in sa stòria de custa pàgina.",
        "anonpreviewwarning": "''Non ses identificadu. Sarbende s'indiritzu IP tuo at a èsser registradu in sa stòria de sa pàgina.''",
        "showingresultsheader": "{{PLURAL:$5|Resultadu '''$1''' de '''$3'''|Resultadus '''$1 - $2''' de '''$3'''}} pro '''$4'''",
        "powersearch-legend": "Chirca delantada",
        "powersearch-ns": "Chirca in su nùmene-logu:",
-       "powersearch-redir": "Lista re-indiritzamentos",
        "powersearch-togglelabel": "Seletziona:",
        "powersearch-toggleall": "Totu",
        "powersearch-togglenone": "Nudda",
        "recentchanges-label-bot": "Custu acontzu est stadu fatu dae unu bot",
        "recentchanges-legend-newpage": "$1 - pàgina noa",
        "rcnotefrom": "Sas chi sighint sunt sas mudàntzias dae '''$2''' (fintzas a '''$1''').",
-       "rclistfrom": "Ammustra mudàntzias dae $1",
+       "rclistfrom": "Ammustra mudàntzias dae $3 $2",
        "rcshowhideminor": "$1 acontzos minores",
        "rcshowhidebots": "$1 bots",
        "rcshowhideliu": "$1 usuàrios intraus",
index fa7ca49..d9f2b27 100644 (file)
@@ -11,7 +11,8 @@
                        "Sarvaturi",
                        "Tonyfroio",
                        "Urhixidur",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Suttalìnia li culligamenti:",
@@ -24,7 +25,6 @@
        "tog-showtoolbar": "Ammustra la barra dî strumenta pi lu canciamentu",
        "tog-editondblclick": "Duppiu click pi canciari l'artìculu (richiedi Javascript)",
        "tog-editsectiononrightclick": "Abbìlita lu canciamentu dî sezzioni tràmiti duppiu click supra lu tìtulu dâ sezzioni (richiedi Javascript)",
-       "tog-rememberpassword": "Arricorda la password supra stu navigaturi (pi ô massimu $1 {{PLURAL:$1|jornu|jorna}})",
        "tog-watchcreations": "Agghiunci li pàggini criati a l'ossirvati spiciali",
        "tog-watchdefault": "Agghiunci li pàggini canciati a l'ossirvati spiciali",
        "tog-watchmoves": "Agghiunci li pàggini spustati a l'ossirvati spiciali",
        "readonly_lag": "Lu database hà statu bluccatu automaticamenti, mentri li server cu li database slave si sincrunìzzanu cu lu master",
        "internalerror": "Erruri nternu",
        "internalerror_info": "Erruri nternu: $1",
-       "fileappenderrorread": "Nu fu pussìbbili di lèggiri \"$1\" nta mentri lu juncìa.",
-       "fileappenderror": "Nun è possibi junciri \"$1\" a \"$2\".",
        "filecopyerror": "Mpussìbbili cupiari lu file \"$1\" n \"$2\".",
        "filerenameerror": "Mpussìbbili rinuminari lu file \"$1\" 'n \"$2\".",
        "filedeleteerror": "Mpussìbbili cancillari lu file \"$1\".",
        "directorycreateerror": "Mpussìbbili criari la directory \"$1\".",
        "filenotfound": "File \"$1\" nun attruvatu.",
-       "fileexistserror": "Mpussìbbili scrìviri lu file \"$1\": lu file esisti già",
        "unexpected": "Valuri mpruvistu: \"$1\"=\"$2\".",
        "formerror": "Erruri: mpussìbbili mannari lu mòdulu",
        "badarticleerror": "Opirazzioni nun cunzintita pi sta pàggina.",
        "userlogin-noaccount": "Nun ci l'hai nu cuntu?",
        "userlogin-joinproject": "Scrìviti a {{SITENAME}}",
        "nologin": "Nun nn'aviti nu cuntu pi ccà? '''$1'''.",
-       "nologinlink": "Criati nu cuntu sùbbitu",
+       "nologinlink": "Arriggistràtivi",
        "createaccount": "Criati un cuntu novu",
        "gotaccount": "Hai già nu cuntu? '''$1'''.",
        "gotaccountlink": "Trasi",
        "userlogin-resetlink": "T'ascurdasti li dittagli pâ trasuta?",
        "userlogin-resetpassword-link": "Reinizzializza la tò password",
-       "createacct-join": "Nzirisci li tò nfurnazzioni ccà",
+       "userlogin-helplink2": "Aiutu pâ trasuta",
        "createacct-emailrequired": "Nnirizzu e-mail",
        "createacct-emailoptional": "Nnirizzu e-mail (facurtativu)",
        "createacct-email-ph": "Nzirisci lu tò nnirizzu e-mail",
        "login-abort-generic": "La trasuta nun arriniscìu - Annullata",
        "loginlanguagelabel": "Lingua: $1",
        "suspicious-userlogout": "La tò dumanna di discunnissioni fu niàta prichì pari ca veni di nu browser nun funziunanti o nu proxy di caching.",
+       "pt-login": "Trasi",
+       "pt-login-button": "Trasi",
+       "pt-createaccount": "Criati un cuntu novu",
+       "pt-userlogout": "Nesci",
        "changepassword": "Cancia la password",
-       "resetpass_announce": "Hai effittuatu l'accessu cu na password timpurània ca t'hà statu mannata via email. Pi tirminari l'accessu, hai a nziriri na password nova ccà:",
+       "resetpass_announce": "Pi tirminari l'accessu, hai a nziriri na password nova ccà:",
        "resetpass_text": "<!-- Agghiunci lu testu ccà -->",
        "resetpass_header": "Rimposta la password",
        "oldpassword": "Password vecchia:",
        "newpassword": "Password nova:",
        "retypenew": "Scrivi n'àutra vota la password",
        "resetpass_submit": "Mposta la password e accedi",
-       "changepassword-success": "Lu canciu password hà statu effittuatu cu successu! Ora stai effittuannu l'accessu...",
+       "changepassword-success": "Lu canciu password hà statu effittuatu cu successu!",
+       "changepassword-throttled": "Facisti troppi tintativi.\nAspetta $1 prima d'arripruvari n'àutra vota.",
        "resetpass_forbidden": "Li password nun ponnu èssiri canciati sùpira sta wiki",
        "resetpass-no-info": "Pi tràsiri nta sta pàggina hà èssiri riggistratu",
        "resetpass-submit-loggedin": "Cancia la password",
        "savearticle": "sarva la pàggina",
        "preview": "visuali",
        "showpreview": "ammustra la visuali prima di sarvari",
-       "showlivepreview": "Funzioni ''Live preview''",
        "showdiff": "Ammustra li canciamenti",
        "anoneditwarning": "'''Accura''': nun hai esiquitu lu login. Lu tò ndirizzu IP veni riggistratu ntâ cronoluggìa di sta pàggina.",
        "anonpreviewwarning": "''Nun trasisti comu utiliggaturi loggatu. Sarbannu, lu tò nnirizzu IP veni arriggistratu ntâ storia dî canciamenti.''",
        "edit-gone-missing": "Mpussìbbili aggiurnari la pàggina.\nPari ca fu scancillata.",
        "edit-conflict": "Cunflittu di edizzioni.",
        "edit-no-change": "La mudifica fu ignurata pirchì nu foru appurtati canci ntô testu.",
-       "postedit-confirmation": "Lu canciamentu fu sarbatu.",
+       "postedit-confirmation-saved": "Lu canciamentu fu sarbatu.",
        "edit-already-exists": "Mpussìbbili criari na nova pàggina.\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",
        "searchmenu-exists": "* Pàggina '''[[$1]]'''",
        "searchmenu-new": "'''Crea la pàggina \"[[:$1]]\" supra sta wiki!'''",
        "searchprofile-articles": "Pàggini di cuntinutu",
-       "searchprofile-project": "Pàggini d'ajutu e dô pruggettu",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Tuttu",
        "searchprofile-advanced": "Avanzata",
        "searchprofile-articles-tooltip": "Cerca nti $1",
-       "searchprofile-project-tooltip": "Cerca nti $1",
        "searchprofile-images-tooltip": "Cerca file",
        "searchprofile-everything-tooltip": "Cerca unnegghiè (puru ntî pàggini di discussioni)",
        "searchprofile-advanced-tooltip": "Cerca ntê namespace pirsunalizzati",
        "search-nonefound": "La circata nun desi nuddu risurtatu.",
        "powersearch-legend": "Ricerca avanzata",
        "powersearch-ns": "Cerca ntê namespace:",
-       "powersearch-redir": "Elenca redirect",
        "powersearch-togglelabel": "Silizziona:",
        "powersearch-toggleall": "Tutti",
        "powersearch-togglenone": "Nuddu",
        "prefs-emailconfirm-label": "Conferma dâ e-mail:",
        "youremail": "Lu tò nnirizzu email:",
        "username": "Nomu d'utenti:",
-       "uid": "ID utenti:",
        "prefs-memberingroups": "Cumpunenti {{PLURAL:$1|dû gruppu|dî gruppi}}:",
        "prefs-registration": "Data di riggistrazioni:",
        "yourrealname": "Lu tò nomu veru*",
        "recentchanges-label-plusminus": "La diminsioni dâ pàggina canciau di stu nùmmuru di bytes",
        "recentchanges-legend-newpage": "$1 - pàggina nova",
        "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 $1",
+       "rclistfrom": "Ammustra li canciamenti novi a pàrtiri di $3 $2",
        "rcshowhideminor": "$1 li canciamenti nichi",
        "rcshowhidebots": "$1 li bot",
        "rcshowhideliu": "$1 l'utilizzatura cû nomu",
        "logempty": "Lu log nun cunteni elementi currispunnenti â ricerca.",
        "log-title-wildcard": "Attrova tituli chi ncignanu cu",
        "allpages": "Tutti li paggini",
-       "alphaindexline": "di $1 a $2",
        "nextpage": "Pàggina doppu ($1)",
        "prevpage": "Pàggina pricidenti ($1)",
        "allpagesfrom": "Ammustra li pàggini a pàrtiri di:",
        "watchlist-details": "La lista dê pàggini taliati cunteni {{PLURAL:$1|na pàggina (cu la rispittiva pàggina di discussioni)|$1 pàggini (cu li rispittivi pàggini di discussioni)}}.",
        "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'''",
-       "watchmethod-recent": "cuntrollu dî canciamenti ricenti pi l'ossirvati spiciali",
-       "watchmethod-list": "cuntrollu di l'ossirvati spiciali pi canciamenti ricenti",
-       "watchlistcontains": "La tò lista di ossirvati spiciali cunteni {{PLURAL:$1|na pàggina|$1 pàggini}}.",
-       "iteminvalidname": "Prubbremi cu la pàggina '$1', nomu nun vàlidu...",
        "wlshowlast": "Ammustra l'ùrtimi $1 uri $2 jorna $3",
        "watchlist-options": "Opzioni ussirvati spiciali",
        "watching": "Junta a l'ussirvati spiciali...",
        "enotif_lastvisited": "Cunzurta $1 pi vìdiri tutti li canciamenti dâ tò ùrtima vìsita.",
        "enotif_lastdiff": "Vìdiri $1 pi visualizzari lu canciamentu.",
        "enotif_anon_editor": "utenti anonimu $1",
-       "enotif_body": "Gintili $WATCHINGUSERNAME,\n\nla pàggina $PAGETITLE di {{SITENAME}} hà stata $CHANGEDORCREATED 'n data $PAGEEDITDATE di $PAGEEDITOR; la virsioni attuali s'attrova a lu ndirizzu $PAGETITLE_URL.\n\n$NEWPAGE\n\nRiassuntu dû canciamentu, nziritu di l'auturi: $PAGESUMMARY $PAGEMINOREDIT\n\nCuntatta l'auturi dû canciamentu:\nvia e-mail: $PAGEEDITOR_EMAIL\nsupra lu situ: $PAGEEDITOR_WIKI\n\nNun vèninu mannati àutri canciamenti 'n caso di ultiriuri canciamenti, a menu ca tu nun vìsiti la pàggina. Noltri, è pussìbbili rimpustari l'avvisu di nutìfica pi tutti li pàggini ntâ lista di l'ussirvati spiciali.\n\n             Lu sistema di nutìfica di {{SITENAME}}, a lu tò sirvizziu\n\n--\nPi mudificari li mpustazzioni dâ lista di l'ussirvati spiciali, vìsita\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPi dari lu tò feedback e arricèviri ultiriuri assistenza:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Gintili $WATCHINGUSERNAME,\n\nla pàggina $PAGETITLE di {{SITENAME}} hà stata $CHANGEDORCREATED 'n data $PAGEEDITDATE di $PAGEEDITOR; la virsioni attuali s'attrova a lu ndirizzu $PAGETITLE_URL.\n\n$NEWPAGE\n\nRiassuntu dû canciamentu, nziritu di l'auturi: $PAGESUMMARY $PAGEMINOREDIT\n\nCuntatta l'auturi dû canciamentu:\nvia e-mail: $PAGEEDITOR_EMAIL\nsupra lu situ: $PAGEEDITOR_WIKI\n\nNun vèninu mannati àutri canciamenti 'n caso di ultiriuri canciamenti, a menu ca tu nun vìsiti la pàggina. Noltri, è pussìbbili rimpustari l'avvisu di nutìfica pi tutti li pàggini ntâ lista di l'ussirvati spiciali.\n\n             Lu sistema di nutìfica di {{SITENAME}}, a lu tò sirvizziu\n\n--\nPi mudificari li mpustazzioni dâ lista di l'ussirvati spiciali, vìsita\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPi dari lu tò feedback e arricèviri ultiriuri assistenza:\n$HELPPAGE",
        "created": "criatu",
        "changed": "canciatu",
        "deletepage": "Elìmina la pàggina",
        "blockip": "Blocca l'utenti",
        "blockip-legend": "Blocca l'utenti",
        "blockiptext": "Usa lu mòdulu cassutta pi bluccari la pussibbilità di scrìviri pi n'utenti o pi nu ndirizzu IP spicìficu. Chistu s'havi a fari sulu pi privèniri lu vannalismu e secunnu la [[{{MediaWiki:Policy-url}}|pulìtica di {{SITENAME}}]]. Scrivi na raggiùni valida ccà sutta (pi asempiu, cita li pàggini chi foru vannalizzati).",
-       "ipadressorusername": "Ndirizzu IP o nomu utenti:",
+       "ipaddressorusername": "Ndirizzu IP o nomu utenti:",
        "ipbexpiry": "Durata dû bloccu:",
        "ipbreason": "Mutivu:",
        "ipbreason-dropdown": "*Mutivi cchiù cumuni pî blocchi\n** Nzerimentu di nformazziuni falsi\n** Cancillazzioni di cuntinuti dê pàggini\n** Liami prumozziunalu a siti sterni\n** Nzserimentu di cuntinuti privi di sensu\n** Cumportamenti ntimidatori o molestie\n** Usu ndebitu di cchiù cunti\n** Nomu utenti nun accittabbili",
        "monobook.css": "/* Li stili CSS nziriti ccà s'àpplicanu a l'utenti chi usanu la skin Monobook */",
        "common.js": "/* Lu còdici JavaScript nziritu ccà veni carricatu di ognuna pàggina, pi tutti l'utenti. */",
        "monobook.js": "/* Lu còdici JavaScript nzirutu ccà veni carricatu di l'utenti c'ùsanu la skin MonoBook */",
-       "notacceptable": "Lu server wiki nun pò furniri dati nta un furmatu liggìbbili dû tò client.",
        "anonymous": "{{PLURAL:$1|Utenti anònimu|Utenti anònimi}} di {{SITENAME}}",
        "siteuser": "$1, utenti di {{SITENAME}}",
        "lastmodifiedatby": "Sta pàggina hà statu canciata pi l'ùrtima vota lu $2, $1 di $3.",
        "spam_reverting": "Ripristinata l'ùrtima virsioni priva di culligamenti a $1",
        "spam_blanking": "Pàggina svacantata, tutti li virsioni cuntinìanu culligamenti a $1",
        "pageinfo-toolboxlink": "Nfurmazzioni ncapu la pàggina",
-       "skinname-cologneblue": "Cologne Blu",
        "skinname-monobook": "MonoBook",
-       "skinname-modern": "Mudernu",
        "markaspatrolleddiff": "Segna lu canciamentu comu virificatu",
        "markaspatrolledtext": "Segna sta pàggina comu virificata",
        "markedaspatrolled": "Canciamentu virificatu",
        "newimages-summary": "Sta pàggina spiciali ammustra li file caricati di cchiù picca tempu.",
        "newimages-legend": "Nomu file",
        "newimages-label": "Nomu file (o nu pezzu d'iddu):",
-       "showhidebots": "($1 li bot)",
        "noimages": "Nenti a vìdiri.",
        "ilsubmit": "Va' cerca",
        "bydate": "pi data",
        "autosumm-replace": "Pàggina sustituita cu '$1'",
        "autoredircomment": "Rinnirizzamentu â pàggina [[$1]]",
        "autosumm-new": "Criata pàggina cu '$1'",
-       "livepreview-loading": "Carricamentu 'n cursu...",
-       "livepreview-ready": "Carricamentu n cursu… Prontu.",
-       "livepreview-failed": "Erruri ntâ funzioni Live preview. Usari l'antiprima standard.",
-       "livepreview-error": "Mpussìbbili effittuari lu culligamentu: $1 \"$2\" Usari l'antiprima standard.",
        "lag-warn-normal": "Li canciamenti appurtati {{PLURAL:$1|nta l'ùrtimu secundu|nta l'ùrtimi $1 secundi}} ponnu nun èssiri nta sta lista.",
        "lag-warn-high": "A càusa di nu ritardu eccissivu nta l'aggiurnamentu dô server di databbasi, li canciamenti appurtati {{PLURAL:$1|nta l'ùrtimu secundu|nta l'ùrtimi $1 secundi}} ponnu nun èssiri nta sta lista.",
-       "watchlistedit-numitems": "La lista dê pàggini taliati cunteni {{PLURAL:$1|na pàggina (cu la rispettiva pàggina di discussioni)|$1 pàggini (cu li rispettivi pàggini di discussioni)}}.",
-       "watchlistedit-noitems": "La lista dê pàggini taliati è vacanti.",
        "watchlistedit-normal-title": "Cancia pàggini taliati",
        "watchlistedit-normal-legend": "Eliminazzioni di pàggini dâ lista dê pàggini taliati",
        "watchlistedit-normal-explain": "Ccà sutta sugnu alincati tutti li pàggine taliati. Pi eliminari una o cchiù pàggini dâ lista, silizziunari li casiddi accantu e fari clic supra lu buttuni 'Elìmina pàggini' 'n fundu all'alencu. Accura ca è puru possibbili [[Special:EditWatchlist/raw|canciari la lista 'n forma testuali]].",
        "tags-hitcount-header": "Canciamenti che hanno tag",
        "tags-edit": "cancia",
        "tags-hitcount": "$1 {{PLURAL:$1|canciamentu|canciamenti}}",
-       "dberr-header": "Sta wiki havi nu prublema",
        "dberr-problems": "Spiacenti! Stu situ sta havennu prublema tecnici.",
        "dberr-again": "Prova a aspittari na para di minuti e ricaricari.",
        "dberr-info": "(Impussibili cuntattari lu server dô database: $1)",
index 2f06c0b..1fa5fa8 100644 (file)
@@ -15,7 +15,8 @@
                        "Urhixidur",
                        "Ushanka",
                        "sco.wikipedia.org editors",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Unnerline airtins:",
@@ -24,7 +25,7 @@
        "tog-newpageshidepatrolled": "Skauk patrolled pages frae the new page leet",
        "tog-extendwatchlist": "Mak watchleet bigger tae shaw aw chynges, no just the maist recent",
        "tog-usenewrc": "Groop chynges bi page in recent chynges n watchleet",
-       "tog-numberheadings": "Auto-nummer heidins",
+       "tog-numberheadings": "Autæ-nummer heidins",
        "tog-showtoolbar": "Shaw eidit tuilbaur",
        "tog-editondblclick": "Eidit pages oan dooble-clap (JavaScript)",
        "tog-editsectiononrightclick": "Enable section editin bi richt-clapin on section teitles",
        "tog-watchdefault": "Eik pages n files that Ah eedit til ma watchleet",
        "tog-watchmoves": "Eik pages n files that Ah muiv til ma watchleet",
        "tog-watchdeletion": "Eik pages n files that Ah get rid o til ma watchleet",
-       "tog-minordefault": "Mairk aa edits \"smaa\" bi defaut",
+       "tog-minordefault": "Mairk aa eedits \"smaa\" bi defaut",
        "tog-previewontop": "Shaw luikower afore eedit kist n naw efter it",
        "tog-previewonfirst": "Shaw luikower oan firstwhile eidit",
        "tog-enotifwatchlistpages": "Wab-mail me whan ae page or file on ma watchleet is chynged",
        "tog-enotifusertalkpages": "Send me ae wab-mail whan ma uiser tauk page is chynged",
        "tog-enotifminoredits": "Send me ae wab-mail fer wee eedits o pages n files ava",
        "tog-enotifrevealaddr": "Shaw ma email address in notification mails",
-       "tog-shownumberswatching": "Shaw the nummer o watching uisers",
+       "tog-shownumberswatching": "Shaw the nummer o watchin uisers",
        "tog-oldsig": "Exeestin signatur:",
        "tog-fancysig": "Treat signature as wikitext (wioot aen autæmatic airtin)",
        "tog-uselivepreview": "Uise live luik ower (experimental)",
@@ -50,7 +51,7 @@
        "tog-watchlisthideliu": "Skauk eidits bi loggit in uisers fae the watchleet",
        "tog-watchlisthideanons": "Skauk eidits bi nameless uisers fae the watchleet",
        "tog-watchlisthidepatrolled": "Skauk patrolled eidits fae the watchleet",
-       "tog-ccmeonemails": "Gie me copies o emails A write tae ither uisers",
+       "tog-ccmeonemails": "Gie me copies o emails Ah write tae ither uisers",
        "tog-diffonly": "Dinna shaw page contents ablo diffs",
        "tog-showhiddencats": "Shaw Skauk't categeries",
        "tog-norollbackdiff": "Lave oot diff efter rowin back",
@@ -67,7 +68,7 @@
        "monday": "Monanday",
        "tuesday": "Tysday",
        "wednesday": "Wadensday",
-       "thursday": "Fuirsday",
+       "thursday": "Thursday",
        "friday": "Fryday",
        "saturday": "Setturday",
        "sun": "Sun",
@@ -88,7 +89,7 @@
        "september": "September",
        "october": "October",
        "november": "November",
-       "december": "December",
+       "december": "Dizember",
        "january-gen": "Januair",
        "february-gen": "Febuair",
        "march-gen": "Mairch",
        "october-date": "$1 October",
        "november-date": "$1 November",
        "december-date": "$1 Dezember",
-       "pagecategories": "{{PLURAL:$1|Category|Categories}}",
-       "category_header": "Pages in category \"$1\"",
-       "subcategories": "Subcategories",
-       "category-media-header": "Eetems in category \"$1\"",
-       "category-empty": "''This category haes no pages or eetems at the meenit.''",
+       "pagecategories": "{{PLURAL:$1|Categerie|Categeries}}",
+       "category_header": "Pages in categerie \"$1\"",
+       "subcategories": "Subcategeries",
+       "category-media-header": "Eetems in categerie \"$1\"",
+       "category-empty": "''This categerie haes nae pages or media at the meenit.''",
        "hidden-categories": "{{PLURAL:$1|Skauk't categerie|Skauk't categeries}}",
        "hidden-category-category": "Skauk't cætegories",
-       "category-subcat-count": "{{PLURAL:$2|This category juist haes the follaein subcategory.|This category haes the follaein {{PLURAL:$1|subcategory|$1 subcategories}}, oot o $2 awthegither.}}",
-       "category-subcat-count-limited": "This category haes the follaein {{PLURAL:$1|subcategory|$1 subcategories}}.",
-       "category-article-count": "{{PLURAL:$2|This category contains the ae follaein page.|The follaein {{PLURAL:$1|page|$1 pages}} is in this category, oot o $2 total.}}",
-       "category-article-count-limited": "The follaein {{PLURAL:$1|page|$1 pages}} is in this category.",
-       "category-file-count": "{{PLURAL:$2|This category hauds juist the ae follaein file.|The follaein {{PLURAL:$1|file|$1 files}}s is in this category, oot o $2 total.}}",
-       "category-file-count-limited": "The follaein {{PLURAL:$1|file is|$1 files is}} in this category.",
+       "category-subcat-count": "{{PLURAL:$2|This categerie juist haes the follaein subcategerie.|This categerie haes the follaein {{PLURAL:$1|subcategerie|$1 subcategeries}}, oot o $2 awthegither.}}",
+       "category-subcat-count-limited": "This categerie haes the follaein {{PLURAL:$1|subcategerie|$1 subcategeries}}.",
+       "category-article-count": "{{PLURAL:$2|This categerie contains the ae follaein page.|The follaein {{PLURAL:$1|page|$1 pages}} is in this categerie, oot o $2 awthegither.}}",
+       "category-article-count-limited": "The follaein {{PLURAL:$1|page|$1 pages}} is in this categerie.",
+       "category-file-count": "{{PLURAL:$2|This categerie hauds juist the ae follaein file.|The follaein {{PLURAL:$1|file|$1 files}}s is in this category, oot o $2 awthegither.}}",
+       "category-file-count-limited": "The follaein {{PLURAL:$1|file is|$1 files ar}} in this categerie.",
        "listingcontinuesabbrev": "cont.",
        "index-category": "Index't pages",
        "noindex-category": "Noindexed pages",
        "broken-file-category": "Pages wi broken file links",
-       "about": "Aboot",
+       "about": "Aneat",
        "article": "Content page",
-       "newwindow": "(opens in new windae)",
+       "newwindow": "(apens in new windae)",
        "cancel": "Cancel",
        "moredotdotdot": "Mair...",
        "morenotlisted": "This leet isna complete.",
        "anontalk": "Tauk fer this IP address",
        "navigation": "Navigation",
        "and": "&#32;n",
-       "qbfind": "Rake",
+       "qbfind": "Fynd",
        "qbbrowse": "Brouse",
        "qbedit": "Eidit",
        "qbpageoptions": "This page",
        "qbmyoptions": "Ma pages",
-       "faq": "ASQ",
-       "faqpage": "Project:ASQ",
+       "faq": "ASS",
+       "faqpage": "Project:ASS",
        "vector-action-addsection": "Eik topic",
        "vector-action-delete": "Delyte",
        "vector-action-move": "Muiv",
        "vector-action-protect": "Fend",
        "vector-action-undelete": "Ondelyte",
        "vector-action-unprotect": "Chynge protection",
-       "vector-view-create": "Mak",
+       "vector-view-create": "Ceaut",
        "vector-view-edit": "Eedit",
        "vector-view-history": "See histerie",
        "vector-view-view": "Read",
        "navigation-heading": "Navigâtion menu",
        "errorpagetitle": "Mistak",
        "returnto": "Return til $1.",
-       "tagline": "Frae {{SITENAME}}",
+       "tagline": "Fae {{SITENAME}}",
        "help": "Help",
        "search": "Rake",
        "searchbutton": "Rake",
        "searcharticle": "Gang",
        "history": "Page histerie",
        "history_short": "Histerie",
-       "updatedmarker": "chynged sin ma hindermast visit",
+       "updatedmarker": "updatit sin ma hintmast visit",
        "printableversion": "Prent version",
        "permalink": "Permanent airtin",
        "print": "Prent",
        "view": "See",
        "edit": "Eedit",
-       "create": "Mak",
+       "create": "Ceaut",
        "editthispage": "Eedit this page",
-       "create-this-page": "Mak this page",
+       "create-this-page": "Creaut this page",
        "delete": "Delyte",
        "deletethispage": "Delyte this page",
        "undeletethispage": "Ondelyte this page",
        "categorypage": "See categerie page",
        "viewtalkpage": "See tauk",
        "otherlanguages": "In ither leids",
-       "redirectedfrom": "(Reguidit frae $1)",
+       "redirectedfrom": "(Reguidit fae $1)",
        "redirectpagesub": "Reguidal page",
-       "lastmodifiedat": "This page wis hindermaist chynged $2, $1.",
-       "viewcount": "This page haes been accesst $1 {{PLURAL:$1|once|$1 times}}.",
+       "lastmodifiedat": "This page wis hintmaist chynged oan $2, $1.",
+       "viewcount": "This page haes been accesst $1 {{PLURAL:$1|yince|$1 times}}.",
        "protectedpage": "Protectit page",
        "jumpto": "Jump til:",
        "jumptonavigation": "navigation",
        "pool-queuefull": "Pool line is ful",
        "pool-errorunknown": "Onknawn mistak.",
        "pool-servererror": "The puil coonter service is na available ($1).",
-       "aboutsite": "Aboot {{SITENAME}}",
-       "aboutpage": "Project:Aboot",
+       "aboutsite": "Aneat {{SITENAME}}",
+       "aboutpage": "Project:Aneat",
        "copyright": "Content is available unner $1 onless itherwise noted.",
-       "copyrightpage": "{{ns:project}}:Copyrichts",
+       "copyrightpage": "{{ns:project}}:Copierichts",
        "currentevents": "Gaun oan the nou",
        "currentevents-url": "Project:Gaun oan the nou",
        "disclaimers": "Disclamation",
        "disclaimerpage": "Project:General_disclamation",
-       "edithelp": "Editin help",
+       "edithelp": "Eeditin help",
        "mainpage": "Main Page",
        "mainpage-description": "Main Page",
-       "policy-url": "Project:Policy",
+       "policy-url": "Project:Policie",
        "portal": "Commonty yett",
        "portal-url": "Project:Commonty Yett",
-       "privacy": "Privacy policy",
-       "privacypage": "Project:Privacy policy",
-       "badaccess": "Permeission mishanter",
+       "privacy": "Preevacie policie",
+       "privacypage": "Project:Privacie policie",
+       "badaccess": "Permeession mistak",
        "badaccess-group0": "Ye'r no permited tae dae whit ye hae requestit!",
        "badaccess-groups": "The action that ye hae requestit is leemitit til uisers in {{PLURAL:$2|the groop|yin o the groops}}: $1.",
        "versionrequired": "Version $1 o MediaWiki needit",
-       "versionrequiredtext": "Version $1 o MediaWiki is requirit tae uise this page. Tak a keek at the [[Special:Version|version page]].",
+       "versionrequiredtext": "Version $1 o MediaWiki is needit tae uise this page. Tak ae keek at the [[Special:Version|version page]].",
        "ok": "Okay",
-       "retrievedfrom": "Taen frae \"$1\"",
-       "youhavenewmessages": "Ye hae $1 ($2).",
+       "retrievedfrom": "Taen fae \"$1\"",
+       "youhavenewmessages": "{{PLURAL:$3|Ye hae}} $1 ($2).",
        "youhavenewmessagesfromusers": "{{PLURAL:$4|Ye hae}} $1 fae {{PLURAL:$3|anither uiser|$3 uisers}} ($2).",
        "youhavenewmessagesmanyusers": "Ye hae $1 fae moni uisers ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|ae new message|999=new messages}}",
        "editsectionhint": "Eedit section: $1",
        "toc": "Contents",
        "showtoc": "shaw",
-       "hidetoc": "scouk",
+       "hidetoc": "skauk",
        "collapsible-collapse": "Collapse.",
        "collapsible-expand": "Mak mair muckle",
        "thisisdeleted": "See or restore $1?",
        "viewdeleted": "See $1?",
        "restorelink": "{{PLURAL:$1|yin delytit eidit|$1 delytit eidits}}",
        "feedlinks": "Feed:",
-       "feed-invalid": "This feeds subscrieve's teep isnae habile.",
-       "feed-unavailable": "Syndication feeds isna available",
+       "feed-invalid": "Onhebile subscreeption feed type.",
+       "feed-unavailable": "Syndication feeds arna available",
        "site-rss-feed": "$1 RSS Feed",
        "site-atom-feed": "$1 Atom Feed",
        "page-rss-feed": "\"$1\" RSS Feed",
        "sort-ascending": "Sort ascending.",
        "nstab-main": "Page",
        "nstab-user": "Uiser page",
-       "nstab-media": "Eetem page",
+       "nstab-media": "Media page",
        "nstab-special": "Byordinar page",
        "nstab-project": "Waurk page",
        "nstab-image": "Eemage",
        "nstab-mediawiki": "Message",
        "nstab-template": "Template",
        "nstab-help": "Help page",
-       "nstab-category": "Category",
+       "nstab-category": "Categerie",
        "nosuchaction": "Nae sic action",
        "nosuchactiontext": "The action speceefieed bi the URL isna recognised\nYe micht hae mistyped the URL, or follaed ae wrang link\nThis micht forby be caused bi ae bug in the saffware uised bi {{SITENAME}}.",
        "nosuchspecialpage": "Nae sic byordinar page",
        "missing-article": "The database didna fynd the tex o ae page that it shid hae foond, cawed \"$1\" $2.\n\nMaistlie this is caused bi follaein aen ootdated diff or histerie airtin til ae page that's been delytit.\n\nGif this isna the case, ye micht hae foond ae bug in the saffware.\nPlease lat aen [[Special:ListUsers/sysop|admeenistrater]] ken aneat this, makin ae myndin o the URL.",
        "missingarticle-rev": "(reveesion#: $1)",
        "missingarticle-diff": "(Diff: $1, $2)",
-       "readonly_lag": "The database haes been autaematically lockit while the sclave database servers catch up tae the maister",
-       "internalerror": "Internal mishanter",
+       "readonly_lag": "The database haes been autaematiclie lockit while the sclave database servers catch up tae the maister",
+       "internalerror": "Internal mistak",
        "internalerror_info": "Internal mistak: $1",
-       "fileappenderrorread": "Coudna read \"$1\" durin append.",
-       "fileappenderror": "Coudna append \"$1\" til \"$2\".",
        "filecopyerror": "Cuidna copie file \"$1\" til \"$2\".",
        "filerenameerror": "Cuidna rename file \"$1\" til \"$2\".",
        "filedeleteerror": "Cuidna delyte file \"$1\".",
-       "directorycreateerror": "Culdnae mak directory \"$1\".",
-       "filenotfound": "Cuidna fin file \"$1\".",
-       "fileexistserror": "Culdnae write tae file \"$1\": file is already here",
+       "directorycreateerror": "Couldna creat directerie \"$1\".",
+       "filenotfound": "Coudna fynd file \"$1\".",
        "unexpected": "Vailyie isnae expectit: \"$1\"=\"$2\".",
        "formerror": "Mistak: cuidna haun in form",
        "badarticleerror": "This action canna be duin tae this page.",
        "cannotdelete-title": "Canna delyte page \"$1\"",
        "delete-hook-aborted": "Delytion stappit bi huik.\nIt gae nae explanâtion.",
        "no-null-revision": "Coudna mak new null reveesion fer page \"$1\"",
-       "badtitle": "Bad teitle",
+       "badtitle": "Bad teetle",
        "badtitletext": "The requestit page teitle wis onvalid, tuim, or ae wranglie airtit inter-leid or inter-wiki teitle. It micht contain yin or mair chairacters that canna be uised in teitles.",
        "perfcached": "The follaein data is cached n michtna be richt up til date. Ae maist muckle o {{PLURAL:$1|yin result is|$1 results ar}} available in the cache.",
        "perfcachedts": "The follaein data is cached, n wis hindermaist updated $1. Ae maist muckkle o {{PLURAL:$4|yin result is|$4 results ar}} available in the cache.",
-       "querypage-no-updates": "Updates for this page ar disablit at the meenit. Data here wilnae be refreshit at the meenit.",
+       "querypage-no-updates": "Updates fer this page ar disablit at the meenit. Data here will nae be refreshit at the meenit.",
        "viewsource": "See soorce",
        "viewsource-title": "See soorce fer $1",
-       "actionthrottled": "Action devalit",
+       "actionthrottled": "Action throtlit",
        "actionthrottledtext": "Aes aen anti-spam meisur, ye'r limitit fae daein this action ower monie times in aen ower short time, n ye'v exceedit this limit. Please try again in ae few minutes.",
        "protectedpagetext": "This page haes been protected fer tae hider eeditin or ither actions.",
        "viewsourcetext": "Ye can leuk at n copie the soorce o this page:",
        "mycustomjsprotected": "Ye dinna hae permeession tae eidit this JavaScript page.",
        "myprivateinfoprotected": "Ye dinna hae permeession tae eidit yer private information.",
        "mypreferencesprotected": "Ye dinna hae permeession tae eidit yer preferences.",
-       "ns-specialprotected": "Byordinar pages canna be editit.",
+       "ns-specialprotected": "Byordinar pages canna be eeditit.",
        "titleprotected": "This teetle haes been protectit fae bein makit bi [[User:$1|$1]].\nThe groonds fer this ar: ''$2''.",
        "filereadonlyerror": "Canna modify the file \"$1\" cause the file repository \"$2\" is in read-yinly mode.\n\nThe administrater that lock't it affered this explanation: \"$3\".",
        "invalidtitle-knownnamespace": "Onvalit title wi namespace \"$2\" n tex \"$3\"",
        "logouttext": "<strong>Ye'r nou loggit oot.</strong>\n\nMynd that some pages micht continue tae be displeyed aes gif ye were still loggit in, til ye clear yer brouser cache.",
        "welcomeuser": "Weelcome, $1!",
        "welcomecreation-msg": "Yer accoont haes been cræftit.\nYe can chynge yer {{SITENAME}} [[Special:Preferences|preeferences]] gif ye like.",
-       "yourname": "Yer uiser name",
+       "yourname": "Uisername:",
        "userlogin-yourname": "Uisername",
        "userlogin-yourname-ph": "Enter yer uisername",
        "createacct-another-username-ph": "Enter the uisername",
        "userlogin-joinproject": "Jyn {{SITENAME}}",
        "nologin": "Dinna hae aen accoont? $1.",
        "nologinlink": "Cræft aen accoont",
-       "createaccount": "Mak new accoont",
+       "createaccount": "Creaut accoont",
        "gotaccount": "Awreadie hae aen accoont? $1.",
        "gotaccountlink": "Log in",
-       "userlogin-resetlink": "Forgotten yer login details?",
+       "userlogin-resetlink": "Fergotten yer login details?",
        "userlogin-resetpassword-link": "Fergot yer password?",
        "userlogin-helplink2": "Heelp wi loggin in",
        "userlogin-loggedin": "Ye'r awreadie loggit in as {{GENDER:$1|$1}}.\nUise the form ablow tae log in as anither uiser.",
        "userlogin-createanother": "Mak anither accoont",
-       "createacct-join": "Enter yer information ablow.",
-       "createacct-another-join": "Enter the new accoont's information ablow.",
        "createacct-emailrequired": "Wab-mail address",
        "createacct-emailoptional": "Wab-mail address (optional)",
        "createacct-email-ph": "Enter yer wab-mail address",
        "createacct-benefit-body1": "{{PLURAL:$1|eidit|eidits}}",
        "createacct-benefit-body2": "{{PLURAL:$1|page|pages}}.",
        "createacct-benefit-body3": "recent {{PLURAL:$1|contreebuter|contreebuters}}",
-       "badretype": "The passwords ye entered disna match.",
+       "badretype": "The passwairds ye entered dinna match.",
        "userexists": "The uiser name ye entered is awreadie in uiss. Please chuise ae different name.",
-       "loginerror": "Login mishanter",
+       "loginerror": "Login mistak",
        "createacct-error": "Accoont cræftin mistak",
        "createaccounterror": "Coudna mak accoont: $1",
        "nocookiesnew": "The uiser accoont wis cræftit, but ye'r naw loggit in. {{SITENAME}} uises cookies tae log uisers in. Ye hae cookies disabled. Please enable them, than log in wi yer new uisername n passwaird.",
        "nocookieslogin": "{{SITENAME}} uises cookies tae log in uisers. Ye hae cookies disabled. Please enable thaim an gie it anither shot.",
        "nocookiesfornew": "The uiser accoont wisna cræftit, aes we couda confirm its soorce.\nEnsure that ye have cookies enabled, relaid this page n gie it anither shote.",
-       "noname": "Ye hivna specifee'd a valid uisername.",
+       "noname": "Ye'v na speceefie'd ae valid uisername.",
        "loginsuccesstitle": "Login fine",
-       "loginsuccess": "Ye're nou loggit in tae {{SITENAME}} as \"$1\".",
+       "loginsuccess": "<strong>Ye're nou loggit in tae {{SITENAME}} aes \"$1\".</strong>",
        "nosuchuser": "Thaur's nae sic uiser aes \"$1\".\nUiser names ar case-sensiteeve.\nCheck yer speelin, or [[Special:UserLogin/signup|mak ae new accoont]].",
-       "nosuchusershort": "The'r nae sic uiser as \"$1\". Check yer spellin.",
+       "nosuchusershort": "Thaur's nae sic uiser aes \"$1\". Check yer spellin.",
        "nouserspecified": "Ye hae tae merk up ae uisername.",
        "login-userblocked": "Uiser \"$1\" is blockit. Log-in naw permitit.",
-       "wrongpassword": "The password ye entered is wrang. Please gie it anither shot.",
-       "wrongpasswordempty": "The password ye entered is blank. Please gie it anither shot.",
+       "wrongpassword": "The passwaird ye entered is wrang. Please gie it anither shot.",
+       "wrongpasswordempty": "The passwaird ye entered is blank. Please gie it anither shot.",
        "passwordtooshort": "Yer password is ower short.\nIt maun hae at laest {{PLURAL:$1|1 chairacter|$1 chairacters}}.",
        "password-name-match": "Yer passwaird maun be different fae yer uisername.",
        "password-login-forbidden": "The uise o this uisername n passwaird haes been ferbidden.",
        "mailmypassword": "Reset password",
-       "passwordremindertitle": "Password reminder frae {{SITENAME}}",
+       "passwordremindertitle": "New temprie passwaird fer {{SITENAME}}",
        "passwordremindertext": "Somebodie (liklie ye, fae IP address $1) requested ae new\npasswaird fer {{SITENAME}} ($4). Ae temporarie passwaird fer uiser \"$2\" haes been cræftit n wis set til \"$3\". Gif this wis yer intent, ye will need tae log in n chuise ae new passwaird nou.\nYer temporarie passwaird will expire in {{PLURAL:$5|yin day|$5 days}}.\n\nGif some ither bodie makit this request, or gif ye hae myndit yer passwaird, n ye nae langer wish tae chynge it, ye can ignore this message n continue uisin yer auld passwaird.",
        "noemail": "Thaur's nae wab-mail address recordit fer uiser \"$1\".",
        "noemailcreate": "Ye need tae provide ae valid wab-mail address.",
-       "passwordsent": "A new password haes been sent tae the e-mail address registert for \"$1\". Please log in again efter ye receive it.",
+       "passwordsent": "Ae new passwaird haes been sent tae the e-mail address registert fer \"$1\". Please log in again efter ye get it.",
        "blocked-mailpassword": "Yer IP address is blockit fae eeditin, sae it\ncanna uise the passwaird recoverie function, for tae hinder abuiss.",
        "eauthentsent": "Ae confirmation wab-mail haes been sent til the speceefied wab-mail address.\nAfore oni ither wab-mail is sent til the accoont, ye'll hae tae follae the instructions in the wab-mail, sae as tae confirm that the accoont is reallie yers.",
        "throttled-mailpassword": "Ae password reset wab-mail haes awreadie been sent, wiin the laist {{PLURAL:$1|hoor|$1 hoors}}.\nTae hinder abuiss, yinly the yin password reset wab-mail will be sent per {{PLURAL:$1|hoor|$1 hoors}}.",
        "mailerror": "Mistak sendin mail: $1",
-       "acct_creation_throttle_hit": "Veesitors tae this wiki uisin yer IP address haev created $1 {{PLURAL:$1|accoont|accoonts}} the day, which is the maist permeettit in that lang.\nSae veesitors uisin this IP address canna mak ony mair accoonts juist noo.",
+       "acct_creation_throttle_hit": "Veesiters tae this wiki uisin yer IP address hae creautit $1 {{PLURAL:$1|accoont|accoonts}} the day, this is the maist alloued in that lang.\nSae veesiters uisin this IP address canna creaut onie mair accoonts juist nou.",
        "emailauthenticated": "Yer wab-mail address wis confirmed oan $2 at $3.",
        "emailnotauthenticated": "Yer wab-mail address isna yet confirmed.\nNae wab-mail will be sent fer oni o the follaein features.",
-       "noemailprefs": "Nae email address haes been specifee'd, the follaein featurs willna wirk.",
-       "emailconfirmlink": "Check yer e-mail address",
+       "noemailprefs": "Specifie aen email address in yer preferances fer thir featurs tae wairk.",
+       "emailconfirmlink": "Conferm yer e-mail address",
        "invalidemailaddress": "The wab-mail address canna be acceptit sin it seems tae be formattit wrang.\nPlease enter ae weel-formattit address or mak that field tuim.",
        "cannotchangeemail": "Accoont wab-mail addresses canna be chynged oan this wiki.",
        "emaildisabled": "This site canna send wab-mails.",
        "accountcreated": "Accoont cræftit",
        "accountcreatedtext": "The uiser accoont fer [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|tauk]]) haes been cræftit.",
-       "createaccount-title": "Accoont makin for {{SITENAME}}",
+       "createaccount-title": "Accoont creaution fer {{SITENAME}}",
        "createaccount-text": "Somebodie cræftit aen accoont fer yer wab-mail address oan {{SITENAME}} ($4) named \"$2\", wi passwaird \"$3\".\nYe shid log in n chynge yer passwaird nou.\n\nYe can ignore this message, gif this accoont wis cræftit bi mistak.",
        "login-throttled": "Ye'v makit ower monie recynt login attempts.\nPlease wait $1 afore giein it anither gae.",
        "login-abort-generic": "Yer login wisna successful - Aborted",
        "php-mail-error-unknown": "Onken't mistak in PHP's mail() function.",
        "user-mail-no-addy": "Tried tae send wab-mail wiout ae wab-mail address.",
        "user-mail-no-body": "Tried tae send wab-mail wi ae tuim or onreasonably short body o tex.",
-       "changepassword": "Chynge password",
+       "changepassword": "Chynge passwaird",
        "resetpass_announce": "Tae finish loggin in, ye maun set ae new passwaird.",
-       "resetpass_header": "Chynge accoont password",
+       "resetpass_header": "Chynge accoont passwaird",
        "oldpassword": "Auld passwaird",
        "newpassword": "New passwaird:",
        "retypenew": "Retype new passwaird:",
        "resetpass_submit": "Set passwaird n log in",
        "changepassword-success": "Yer passwaird chynge wis braw!",
        "changepassword-throttled": "Ye'v makit ower monie recynt login attempts.\nPlease wait $1 afore giein it anither gae.",
-       "resetpass_forbidden": "Passwords canna be chynged",
+       "resetpass_forbidden": "Passwairds canna be chynged",
        "resetpass-no-info": "Ye maun be loggit in tae access this page directly.",
        "resetpass-submit-loggedin": "Chynge passwaird",
        "resetpass-submit-cancel": "Cancel",
        "bold_tip": "Baud tex",
        "italic_sample": "Italic tex",
        "italic_tip": "Italic tex",
-       "link_sample": "Airtin teitle",
+       "link_sample": "Airtin teetle",
        "link_tip": "Internal airtin",
-       "extlink_sample": "http://www.example.com airtin teitle",
+       "extlink_sample": "http://www.example.com airtin teetle",
        "extlink_tip": "External link (mynd the http:// prefix)",
        "headline_sample": "Heidline tex",
        "headline_tip": "Level 2 heidline",
        "image_sample": "Exemplar.jpg",
        "image_tip": "Embeddit eemage",
        "media_sample": "Exemplar.ogg",
-       "media_tip": "Media file airtin",
+       "media_tip": "File airtin",
        "sig_tip": "Yer seignatur wi timestamp",
        "hr_tip": "Horizontal line (dinna ower uise)",
        "summary": "Ootline:",
-       "subject": "Subject/headline:",
+       "subject": "Subject/heidline:",
        "minoredit": "This is ae smaa eedit",
-       "watchthis": "Leuk ower this page",
+       "watchthis": "Watch this page",
        "savearticle": "Hain page",
        "preview": "Luikower",
        "showpreview": "Shaw luikower",
-       "showlivepreview": "Live leuk ower",
        "showdiff": "Shaw chynges",
        "anoneditwarning": "<strong>Warnishment:</strong>Ye'r naw loggit in. Yer IP address will be recordit in this page's eedit histerie.",
        "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 a comment ablo.",
+       "missingcommenttext": "Please enter ae comment ablo.",
        "missingcommentheader": "<strong>Mynd:</strong> Ye'v na gien ae subject/heidline fer this comment.\nGif ye clap \"{{int:savearticle}}\" again, yer eedit will be hained wioot yin.",
        "summary-preview": "Ootline leuk ower:",
-       "subject-preview": "Subject/headline leuk ower:",
+       "subject-preview": "Subject/heidline leuk ower:",
        "blockedtitle": "Uiser is blockit",
        "blockedtext": "<strong>Yer uisername or IP address haes been blockit.</strong>\n\nThe block wis makit bi $1.\nThe raison gieen is <em>$2</em>.\n\n* Stairt o block: $8\n* Expirie o block: $6\n* Intended blockee: $7\n\nYe can contact $1 or anither [[{{MediaWiki:Grouppage-sysop}}|admeenistrater]] tae discuss the block.\nYe canna uise the \"wab-mail this uiser\" feature onless ae valid wab-mail address is speceefied in yer [[Special:Preferences|accoont preferences]] n ye'v naw been blockit fae uisin it.\nYer current IP address is $3, n the block ID is #$5.\nPlease incluide aw the abuin details in onie speirins that ye mak.",
        "autoblockedtext": "Yer IP address haes been autæmateeclie blockit cause it wis uised bi anither uiser that wis blockit bi $1.\nThe raison gien is:\n\n:<em>$2</em>\n\n* Stairt o block: $8\n* Expirie o block: $6\n* Intended blockee: $7\n\nYe can contact $1 or yin o the ither [[{{MediaWiki:Grouppage-sysop}}|admeenistraters]] tae discuss the block.\n\nMynd that ye canna uise the \"wab-mail this uiser\" feature onless ye hae ae valid wab-mail address registered in yer [[Special:Preferences|uiser preeferances]] n ye'v na been blockit fae uisin it.\n\nYer current IP address is $3, n the block ID is #$5.\nPlease incluid aw abuin details in onie speirins that ye mak.",
        "confirmedittext": "Ye maun confirm yer wab-mail address afore eeditin pages. Please set n validate yer wab-mail address throogh yer [[Special:Preferences|uiser settins]].",
        "nosuchsectiontitle": "Canna find section",
        "nosuchsectiontext": "Ye tried tae eedit ae section that disna exeest.\nIt micht hae been muived or delytit while ye were luikin at the page.",
-       "loginreqtitle": "Login Requirit!",
+       "loginreqtitle": "Login needit!",
        "loginreqlink": "log in",
        "loginreqpagetext": "Please $1 tae see ither pages.",
        "accmailtitle": "Passwaird sent.",
        "usercssyoucanpreview": "<strong>Tip:</strong> Uise the \"{{int:showpreview}}\" button tae test yer new CSS afore hainin.",
        "userjsyoucanpreview": "<strong>Tip:</strong> Uise the \"{{int:showpreview}}\" button tae test yer new JavaScript afore hainin.",
        "usercsspreview": "<strong>Mynd that ye'r yinly previewing yer uiser CSS.\nIt haesna been hained yet!</strong>",
-       "userjspreview": "'''Mynd that ye're juist testin/previewing yer uiser JavaScript; it haesna been hained yet!'''",
+       "userjspreview": "'''Mynd that ye're juist testin/previewin yer uiser JavaScript; it haesna been hained yet!'''",
        "sitecsspreview": "<strong>Mynd that ye'r yinly previewing this CSS.\nIt's no been hained yet!</strong>",
        "sitejspreview": "<strong>Mynd that ye'r yinly previewing this JavaScript code.\nIt's no been hained yet!</strong>",
        "userinvalidcssjstitle": "<strong>Warnishmant</strong> Thaur's na ae skin \"$1\". Mynd that yer ain .css n .js pages uise ae lowercase teetle, e.g. {{ns:user}}:Foo/vector.css in steid o {{ns:user}}:Foo/Vector.css.",
        "session_fail_preview_html": "<strong>Sairrie! We coudna process yer eedit cause o ae loss o session data.</strong>\n\n<em>Cause {{SITENAME}} haes raw HTML enabled, the owerluik is skaukt aes ae precaution again JavaScript attacks.</em>\n\n<strong>Gif this is ae legeetimate eedit attempt, please gei it anither gae.</strong>\nGif it still disna wairk, try [[Special:UserLogout|loggin oot]] n loggin back in.",
        "token_suffix_mismatch": "<strong>Yer eedit haes been rejectit cause yer client makit ae richt mess o the punctuation chairacters in the eedit token.</strong>\nThe eedit haes been rejectit tae hinder rot o the page tex.\nThis whiles happens when ye'r uisin ae broken wab-based anonymoos proxie service.",
        "edit_form_incomplete": "<strong>Some pairts o the eedit form didna reach the server; dooble-check that yer edits ar intact n gie it anither gae.</strong>",
-       "editing": "Editin $1",
+       "editing": "Eeditin $1",
        "creating": "Makin $1",
-       "editingsection": "Editin $1 (section)",
+       "editingsection": "Eeditin $1 (section)",
        "editingcomment": "Editin $1 (new section)",
        "editconflict": "Eidit conflict: $1",
        "explainconflict": "Some ither body haes chynged this page syne ye stertit eiditin it.\nThe upper tex area hauds the page tex aes it currentlie exeests.\nYer chynges is shawn in the lower tex area.\nYe'll hae tae merge yer chynges intil the exeestin tex.\n<strong>Juist</strong> the tex in the upper tex area will be hained whan ye press \"{{int:savearticle}}\".",
        "storedversion": "Storit version",
        "nonunicodebrowser": "<strong>Warnishmant: Yer brouser isna unicode compliant.</strong> Ae wairkaroond is in place tae lat ye sauflie eedit airticles: non-ASCII chairacters will kythe in the eedit kist aes hexadecimal codes.",
        "editingold": "<strong>Warnishment:</strong> Ye'r eiditin aen oot-o-date reveesion o this page. Gin ye hain it, onie chynges makit sin this reveesion will be lost.",
-       "yourdiff": "Differs",
+       "yourdiff": "Differances",
        "copyrightwarning": "Please mynd that aw contreebutions til {{SITENAME}} is conseedert tae be released unner the $2 (see $1 for details). Gif ye dinna want yer writin tae be eeditit wioot mercie n redistreebuted at will, than dinna haun it it here.<br /> Forbye thon, ye'r promisin us that ye wrat this yersel, or copied it fae ae publeec domain or siclike free resoorce. <strong>Dinna haun in copierichtit wark wioot permeession!</strong>",
        "copyrightwarning2": "Please mynd that aa contreebutions til {{SITENAME}} micht be eeditit, chynged, or remuived bi ither contreebuters.\nGin ye dinna want yer writin tae be eeditit wioot mercie n redistreebuted at will, than dinna haun it in here.<br />\nYe'r promisin us forbye that ye wrat this yersel, or copied it fae ae\npubleec domain or siclike free resoorce (see $1 fer details).\n<strong>Dinna haun in copierichtit wark wioot permeession!</strong>",
        "longpageerror": "<strong>Mistak: The tex ye'v submitted is {{PLURAL:$1|yin kilobyte|$1 kilobytes}} lang, n this is langer than the maist muckle o {{PLURAL:$2|yin kilobyte|$2 kilobytes}}.</strong>\nIt canna be hained.",
        "sectioneditnotsupported-title": "Section eiditin isna supported",
        "sectioneditnotsupported-text": "Section eiditing isna supported in this page.",
        "permissionserrors": "Permission mistak",
-       "permissionserrorstext": "Ye dinnae hae the richts tae dae that, acause o the followin {{PLURAL:$1|grund|grunds}}:",
+       "permissionserrorstext": "Ye dinnae hae the richts tae dae that, cause o the follaein {{PLURAL:$1|grund|grunds}}:",
        "permissionserrorstext-withaction": "Ye dinna hae the richts tae $2, fer the follaein {{PLURAL:$1|raison|raisons}}:",
        "recreate-moveddeleted-warn": "<strong>Warnishment: Ye'r recræftin ae page that haes been delytit.</strong>\n\nYe shid check that it is guid tae keep eeditin this page.\nThe delytion n muiv log fer this page is providit here fer conveeniance:",
        "moveddeleted-notice": "This page haes been delytit. \nThe delytion n muiv log fer the page ar gien ablo fer referance.",
        "edit-gone-missing": "Coudna update the page.\nIt appears tae hae been delytit.",
        "edit-conflict": "Eedit confleect.",
        "edit-no-change": "Yer eedit wis ignored cause nae chynge wis makit til the tex.",
-       "postedit-confirmation": "Yer eedit wis hained.",
+       "postedit-confirmation-saved": "Yer eedit wis hained.",
        "edit-already-exists": "Coudna mak ae new page.\nIt awreadie exists.",
        "defaultmessagetext": "Defaut message tex",
        "content-failed-to-parse": "Failed tae parse $2 content fer $1 model: $3",
        "post-expand-template-inclusion-warning": "<strong>Warnishment Template incluid size is owermuckle. \nSome templates will na be incluidit.",
        "post-expand-template-inclusion-category": "Pages whaur template include size is exceeded",
        "post-expand-template-argument-warning": "<strong>Warnishment:</strong> This page hauds at least the ae template argument that haes aen ower muckle expansion size.\nThir arguments hae been left oot.",
-       "post-expand-template-argument-category": "Pages containing omitted template arguments",
+       "post-expand-template-argument-category": "Pages containing omittit template arguments",
        "parser-template-loop-warning": "Template luip detected: [[$1]]",
        "parser-template-recursion-depth-warning": "Template recursion depth limit owershote ($1)",
        "language-converter-depth-warning": "Leid converter depth limit owershote ($1)",
        "parser-unstrip-recursion-limit": "Unstrip recursion limit owershote ($1)",
        "converter-manual-rule-error": "mistak detected in manual leid conversion rule",
        "undo-success": "The eidit can be ondun. Please check the chynges albo tae check that this is whit ye wint tae dae, n than hain the chynges albo tae be duin ondaein the eidit.",
-       "undo-failure": "The edit culdnae be undone acause o conflictin edits inatween.",
+       "undo-failure": "The eedit coudna be ondun cause o confleectin eedits inatween.",
        "undo-norev": "The eedit coudna be ondun cause it disna exeest or wis delytit.",
        "undo-nochange": "The edit appears tae hae awready been ondone.",
        "undo-summary": "Ondae reveesion $1 bi [[Special:Contributions/$2|$2]] ([[User talk:$2|Tauk]])",
        "undo-summary-username-hidden": "Ondae reveesion $1 bi ae skauk't uiser",
-       "cantcreateaccounttitle": "Canna mak accoont",
+       "cantcreateaccounttitle": "Canna creaut accoont",
        "cantcreateaccount-text": "Accoont cræftin fae this IP address ('''$1''') haes been blockit bi [[User:$3|$3]].\n\nThe raison fer this, gien bi $3 is ''$2''",
        "cantcreateaccount-range-text": "Accoont cræftin fae IP addresses in the range '''$1''', that inclædes yer IP address ('''$4'''), haes been blockit bi [[User:$3|$3]].\n\nThe raison gien bi $3 is ''$2''",
        "viewpagelogs": "Leuk at logs fer this page",
        "nextrevision": "Newer reveesion →",
        "currentrevisionlink": "Latest reveesion",
        "cur": "nou",
-       "next": "neist",
-       "last": "hind",
+       "next": "neix",
+       "last": "afore",
        "page_first": "first",
-       "page_last": "hindermaist",
+       "page_last": "hintmaist",
        "histlegend": "Diff selection: Maurk the radio kists o the reveesions tae compare n hit enter or the button at the bottom.<br />\nLegend: <strong>({{int:cur}})</strong> = differance wi laitest reveesion, <strong>({{int:last}})</strong> = differance wi preceedin reveesion, <strong>{{int:minoreditletter}}</strong> = smaa eidit.",
        "history-fieldset-title": "Brouse histerie",
        "history-show-deleted": "Delytit yinlie",
        "histfirst": "auldest",
        "histlast": "newest",
        "historysize": "({{PLURAL:$1|1 byte|$1 bytes}})",
-       "historyempty": "(empie)",
+       "historyempty": "(tuim)",
        "history-feed-title": "Reveesion histerie",
        "history-feed-description": "Reveesion histerie fer this page oan the wiki",
        "history-feed-item-nocomment": "$1 at $2",
        "history-feed-empty": "The requestit page disnae exeest.\nIt micht hae been delytit fae the wiki, or the name micht hae been chynged.\nTry [[Special:Search|rakin oan the wiki]] fer new pages ye micht be interestit in.",
        "rev-deleted-comment": "(eedit ootline remuived)",
-       "rev-deleted-user": "(uisername removit)",
+       "rev-deleted-user": "(uisername remuivit)",
        "rev-deleted-event": "(log action remuived)",
        "rev-deleted-user-contribs": "[uisername or IP address remuived - eidit skauk't fae contreebutions]",
        "rev-deleted-text-permission": "This page reveesion haes been <strong>delytit</strong>.\nDetails can be foond in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} delytion log].",
        "revdel-restore": "chynge veesibeelitie",
        "pagehist": "Page histerie",
        "deletedhist": "Delytit histerie",
-       "revdelete-hide-current": "Mistak skaukin the eitem dated $2, $1: This is the current reveesion.\nIt cannna be skauk't.",
-       "revdelete-show-no-access": "Mistak shawin the eitem dated $2, $1: This eitem haes been maurked \"restreected\".\nYe dinna hae access til it.",
-       "revdelete-modify-no-access": "Mistak modifiein the eitem dated $2, $1: This eitem haes been maurked \"restreected\".\nYe dinna hae access til it.",
+       "revdelete-hide-current": "Mistak skaukin the eetem datit $2, $1: This is the nou reveesion.\nIt cannna be skauk't.",
+       "revdelete-show-no-access": "Mistak shawin the eetem datit $2, $1: This eetem haes been maurkit \"restreectit\".\nYe dinna hae access tae it.",
+       "revdelete-modify-no-access": "Mistak modifiein the eetem datit $2, $1: This eetem haes been maurkit \"restreectit\".\nYe dinna hae access tae it.",
        "revdelete-modify-missing": "Mistak modifiein item ID $1: It is missing fae the database!",
        "revdelete-no-change": "<strong>Warnishment:</strong> The eetem dated $2, $1 awreadie haed the requested veesibeelitie settins.",
-       "revdelete-concurrent-change": "Mistak modifiein the eitem dated $2, $1: Its status appears tae'v been chynged bi some ither bodie while ye attempted tae modifie it.\nPlease check the logs.",
+       "revdelete-concurrent-change": "Mistak modifiein the eetem datit $2, $1: Its status seems tae'v been chynged bi some ither bodie while ye ettled tae modifie it.\nPlease check the logs.",
        "revdelete-only-restricted": "Mistak skaukin the eetem dated $2, $1: Ye canna suppress eetems fae sicht bi admeenistraters wioot selectin yin o the ither veesibeelitie opties ava.",
        "revdelete-reason-dropdown": "*Commyn delyte raisons\n** Copiericht violation\n** Galus comment or personal information\n** Galus uisername\n** Potentiallie libelous information",
        "revdelete-otherreason": "Ither/addeetional raison:",
        "mergehistory-autocomment": "Merged [[:$1]] intil [[:$2]]",
        "mergehistory-comment": "Merged [[:$1]] intil [[:$2]]: $3",
        "mergehistory-same-destination": "Soorce n destination pages canna be the same",
-       "mergehistory-reason": "Raeson:",
+       "mergehistory-reason": "Raison:",
        "mergelog": "Merge log.",
        "pagemerge-logentry": "merged [[$1]] intil [[$2]] (reveesions up til $3)",
-       "revertmerge": "Unmerge",
+       "revertmerge": "Onmerge",
        "mergelogpagetext": "Ablow is ae leet o the maist recent merges o yin page histerie intil anither.",
        "history-title": "Reveesion histerie o \"$1\"",
        "difference-title": "Difference atween reveesions o \"$1\"",
        "diff-multi-otherusers": "({{PLURAL:$1|yin intermeediate reveesion|$1 intermeediate reveesions}} bi {{PLURAL:$2|yin ither uiser|$2 uisers}} no shawn)",
        "diff-multi-manyusers": "({{PLURAL:$1|Yin intermeediate reveesion|$1 intermeediate reveesions}} bi mair than $2 {{PLURAL:$2|uiser|uisers}} no shawn)",
        "difference-missing-revision": "{{PLURAL:$2|Yin reveesion|$2 reveesions}} o this difference ($1) {{PLURAL:$2|wis|were}} na foond.\n\nThis is usuallie caused bi follaein aen ootdated diff airtin til ae page that's been delytit.\nDetails can be foond in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} delytion log].",
-       "searchresults": "Rake results",
+       "searchresults": "Rake ootcomes",
        "searchresults-title": "Rake ootcome fer \"$1\"",
        "toomanymatches": "Ower moni matches were returned, please try ae different speirin",
-       "titlematches": "Airticle teitle matches",
+       "titlematches": "Page teetle matches",
        "textmatches": "Page tex matches",
        "notextmatches": "Nae page tex matches",
        "prevn": "foregaun {{PLURAL:$1|$1}}",
-       "nextn": "neist {{PLURAL:$1|$1}}",
-       "prevn-title": "Previous $1 {{PLURAL:$1|ootcome|ootcomes}}",
-       "nextn-title": "Next $1 {{PLURAL:$1|ootcome|ootcomes}}",
+       "nextn": "neix {{PLURAL:$1|$1}}",
+       "prevn-title": "Aforegaun $1 {{PLURAL:$1|ootcome|ootcomes}}",
+       "nextn-title": "Neix $1 {{PLURAL:$1|ootcome|ootcomes}}",
        "shown-title": "Shaw $1 {{PLURAL:$1|ootcome|ootcomes}} per page",
        "viewprevnext": "See the ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "<strong>Thaur's ae page named \"[[:$1]]\" oan this wiki.</strong> {{PLURAL:$2|0=|See the ither rake ootcomes foond aes weel.}}",
        "searchprofile-articles": "Content pages",
        "searchprofile-project": "Heelp n Waurk pages",
        "searchprofile-images": "Multimedia",
-       "searchprofile-everything": "Everything",
+       "searchprofile-everything": "Awthing",
        "searchprofile-advanced": "Advanced",
        "searchprofile-articles-tooltip": "Rake in $1",
        "searchprofile-project-tooltip": "Rake in $1",
        "searchprofile-images-tooltip": "Rake fer files",
        "searchprofile-everything-tooltip": "Rake aw o content (inclædin tauk pages)",
        "searchprofile-advanced-tooltip": "Rake in custom namespaces",
-       "search-result-size": "$1 ({{PLURAL:$2|1 word|$2 words}})",
-       "search-result-category-size": "{{PLURAL:$1|1 member|$1 members}} ({{PLURAL:$2|1 subcategory|$2 subcategories}}, {{PLURAL:$3|1 file|$3 files}})",
+       "search-result-size": "$1 ({{PLURAL:$2|1 waird|$2 wairds}})",
+       "search-result-category-size": "{{PLURAL:$1|1 memmer|$1 memmers}} ({{PLURAL:$2|1 subcategerie|$2 subcategeries}}, {{PLURAL:$3|1 file|$3 files}})",
        "search-result-score": "Relevanc: $1%",
        "search-redirect": "(reguide $1)",
        "search-section": "(section $1)",
        "search-interwiki-more": "(mair)",
        "search-relatedarticle": "Relatit",
        "searcheverything-enable": "Rake in aw namespaces",
-       "searchrelated": "related",
+       "searchrelated": "relatit",
        "searchall": "aw",
-       "showingresults": "Shawin ablo up tae {{PLURAL:$1|'''1''' result|'''$1''' results}} stertin wi #'''$2'''.",
+       "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>.",
-       "showingresultsnum": "Shawin ablo {{PLURAL:$3|'''1''' result|'''$3''' results}} stertin wi #'''$2'''.",
+       "showingresultsnum": "Shawin ablo {{PLURAL:$3|'''1''' ootcome|'''$3''' ootcomes}} stertin wi #'''$2'''.",
        "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:",
-       "powersearch-redir": "Leet redirects",
        "powersearch-togglelabel": "Chec':",
        "powersearch-toggleall": "Aw",
        "powersearch-togglenone": "Nane",
        "search-external": "Eixternal rake",
-       "searchdisabled": "Rakin throu {{SITENAME}} is disabled for performance raesons. Ye can rake via Google juist nou. Mynd that thair indexes o {{SITENAME}} content micht be oot o date.",
+       "searchdisabled": "Rakin throu {{SITENAME}} is disabled fer performance raisons. Ye can rake bi wa o Google juist nou. Mynd that thair indexes o {{SITENAME}} content micht be oot o date.",
        "search-error": "Ae mistak haes occurred while rakin: $1",
        "preferences": "Ma preferences",
        "mypreferences": "Ma preferences",
        "prefs-edits": "Nummer o eidits:",
        "prefsnologintext2": "Please $1 tae chynge yer preferences.",
-       "prefs-skin": "Huil",
+       "prefs-skin": "Skin",
        "skin-preview": "First Leuk",
-       "datedefault": "Nae preference",
+       "datedefault": "Nae preferance",
        "prefs-labs": "Labs featurs",
        "prefs-user-pages": "Uiser pages",
        "prefs-personal": "Uiser data",
        "prefs-watchlist-edits": "Mucklest nummer o chynges tae shaw in expanded watchleet:",
        "prefs-watchlist-edits-max": "Mucklest nummer: 1000",
        "prefs-watchlist-token": "Watchleet token:",
-       "prefs-misc": "Antrin settins",
+       "prefs-misc": "Ither",
        "prefs-resetpass": "Chynge passwaird",
        "prefs-changeemail": "Chynge Wab-mail address",
        "prefs-setemail": "Set ae wab-mail address",
        "prefs-rendering": "Appearence",
        "saveprefs": "Hain preferences",
        "restoreprefs": "Restore aw defaut settins (in aw sections)",
-       "prefs-editing": "Editin",
+       "prefs-editing": "Eeditin",
        "rows": "Raws:",
-       "searchresultshead": "Rake result settins",
+       "searchresultshead": "Rake ootcome settins",
        "stub-threshold": "Threeshaud fer <a href=\"#\" class=\"stub\">stub airtin</a> formattin (bytes):",
-       "stub-threshold-disabled": "Tuckie",
+       "stub-threshold-disabled": "Disablt",
        "recentchangesdays": "Days tae shaw in recynt chynges:",
        "recentchangesdays-max": "Mucklest $1 {{PLURAL:$1|day|days}}",
        "recentchangescount": "Nummer o eedits tae shaw bi defaut:",
        "timezoneuseserverdefault": "Uise wiki defaut ($1)",
        "timezoneuseoffset": "Ither (speceefie affset)",
        "servertime": "Server time the nou",
-       "guesstimezone": "Fill in frae brouser",
+       "guesstimezone": "Fill in fae brouser",
        "timezoneregion-africa": "Africae",
        "timezoneregion-america": "Americae",
        "timezoneregion-antarctica": "Antairctica",
        "timezoneregion-australia": "Australie",
        "timezoneregion-europe": "Europ",
        "timezoneregion-pacific": "Paceefic Ocean",
-       "allowemail": "Allou email frae ither uisers",
+       "allowemail": "Allou email fae ither uisers",
        "prefs-searchoptions": "Rake",
        "defaultns": "Itherwise rake in thir namespaces:",
        "default": "defaut",
        "prefs-emailconfirm-label": "Wab-mail confirmation:",
        "youremail": "Yer email:",
        "username": "{{GENDER:$1|Uisername}}:",
-       "uid": "{{GENDER:$1|Uiser}} ID:",
        "prefs-memberingroups": "{{GENDER:$2|Memmer}} o {{PLURAL:$1|groop|groops}}:",
        "prefs-registration": "Regeestration time:",
        "yourrealname": "Yer real name:",
        "yournick": "New seegnatur:",
        "prefs-help-signature": "Comments oan talk pages shid be signed wi \"<nowiki>~~~~</nowiki>\", this will be convertit intil yer signatur n ae timestamp.",
        "badsig": "Raw signature nae guid; check HTML tags.",
-       "badsiglength": "Yer nickname is ower lang; it haes tae be $1 {{PLURAL:$1|character|characters}} or less.",
+       "badsiglength": "Yer signatur is ower lang; it haes tae be $1 {{PLURAL:$1|chairacter|chairacters}} or less.",
        "yourgender": "Hou dae ye prefer tae be described?",
        "gender-unknown": "Ah prefer tae na say",
        "gender-male": "He eedits wiki pages",
        "prefs-advancedsearchoptions": "Advanced opties",
        "prefs-advancedwatchlist": "Advanced opties",
        "prefs-displayrc": "Displey opties",
-       "prefs-displaysearchoptions": "Displey opties",
        "prefs-displaywatchlist": "Displey opties",
        "prefs-diffs": "Diffs",
        "prefs-help-prefershttps": "This preeferance will tak effect oan yer nex login.",
        "email-address-validity-valid": "Wab-mail address appears tae be valid",
        "email-address-validity-invalid": "Enter ae valid wab-mail address",
        "userrights": "Uiser richts managemant",
-       "userrights-lookup-user": "Manish uiser boorachs",
-       "userrights-user-editname": "Enter a uisername:",
+       "userrights-lookup-user": "Manage uiser groops",
+       "userrights-user-editname": "Enter ae uisername:",
        "editusergroup": "Eidit uiser boorach",
        "editinguser": "Chynging uiser richts o uiser <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Eedit uiser groops",
        "saveusergroups": "Hain uiser groops",
-       "userrights-groupsmember": "Member o:",
+       "userrights-groupsmember": "Memmer o:",
        "userrights-groupsmember-auto": "Impleecit memmer o:",
        "userrights-groups-help": "Ye can alter the groops this uiser is in:\n* Ae checkit kist means that the uiser is in that groop.\n* Aen oncheckit kist means that the uiser's na in that groop.\n* Ae * indeecates that ye canna remuiv the groop yince ye'v eikit it, or vice versa.",
        "userrights-reason": "Raison:",
        "nchanges": "$1 {{PLURAL:$1|chynge|chynges}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|sin laist veesit}}",
        "enhancedrc-history": "histeri",
-       "recentchanges": "Recent chynges",
+       "recentchanges": "Recynt chynges",
        "recentchanges-legend": "Recynt chynges opties",
-       "recentchanges-summary": "Follae the maist recent chynges tae the wiki on this page.",
+       "recentchanges-summary": "Follae the maist recynt chynges tae the wiki oan this page.",
        "recentchanges-noresult": "Naw chynges durin the gien period matchin thir guidins.",
-       "recentchanges-feed-description": "Follae the maist recent chynges tae the wiki in this feed.",
-       "recentchanges-label-newpage": "This edit created a freish page",
+       "recentchanges-feed-description": "Follae the maist recynt chynges tae the wiki in this feed.",
+       "recentchanges-label-newpage": "This eedit creautit ae new page",
        "recentchanges-label-minor": "This is ae smaa eedit",
        "recentchanges-label-bot": "This eedit wis performed bi ae bot",
-       "recentchanges-label-unpatrolled": "This edit haes nae yet bin patrolled",
+       "recentchanges-label-unpatrolled": "This eedit haes no bin patrolled yet",
        "recentchanges-label-plusminus": "The page size chynged bi this nummer o bytes",
        "recentchanges-legend-newpage": "(see [[Special:NewPages|leet o new pages]] ava)",
        "rcnotefrom": "Ablo ar the chynges sin <strong>$2</strong> (up til <strong>$1</strong> shawn).",
-       "rclistfrom": "Shaw new chynges stertin frae $1",
-       "rcshowhideminor": "$1 smaa edits",
+       "rclistfrom": "Shaw new chynges stertin fae $3 $2",
+       "rcshowhideminor": "$1 smaa eedits",
        "rcshowhideminor-show": "Shaw",
        "rcshowhideminor-hide": "Skauk",
        "rcshowhidebots": "$1 bots",
        "rcshowhideanons": "$1 anonymous uisers",
        "rcshowhideanons-show": "Shaw",
        "rcshowhideanons-hide": "Skauk",
-       "rcshowhidepatr": "$1 patrolled edits",
+       "rcshowhidepatr": "$1 patrolled eedits",
        "rcshowhidepatr-show": "Shaw",
        "rcshowhidepatr-hide": "Skauk",
-       "rcshowhidemine": "$1 ma edits",
+       "rcshowhidemine": "$1 ma eedits",
        "rcshowhidemine-show": "Shaw",
        "rcshowhidemine-hide": "Skauk",
        "rclinks": "Shaw last $1 chynges in last $2 days<br />$3",
        "diff": "diff",
        "hist": "hist",
        "hide": "Skauk",
-       "show": "shaw",
+       "show": "Shaw",
        "minoreditletter": "s",
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 watchin {{PLURAL:$1|uiser|uisers}}]",
        "rc_categories": "Limit til categeries (separate wi \"|\")",
-       "rc_categories_any": "Ony",
+       "rc_categories_any": "Onie",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} efter chynge",
        "rc-enhanced-expand": "Shaw details",
        "rc-enhanced-hide": "Skauk details",
        "uploadbtn": "Uplaid file",
        "reuploaddesc": "Gang back til the uplaid form.",
        "upload-tryagain": "Haunn in modified file descreeption",
-       "uploadnologin": "Nae loggit in",
+       "uploadnologin": "No loggit in",
        "uploadnologintext": "Please $1 tae uplaid files.",
        "upload_directory_missing": "The uplaid directerie ($1) is missin n coudna be cræftit bi the wabserver.",
        "upload_directory_read_only": "The uplaid directerie ($1) is naw writable bi the wabserver.",
        "upload-permitted": "Permitit file types: $1.",
        "upload-prohibited": "Proheebited file types: $1.",
        "uploadlogpage": "Uplaid log",
-       "uploadlogpagetext": "Ablo is a leet o the maist recent file uplaids.",
+       "uploadlogpagetext": "Ablo is ae leet o the maist recynt file uplaids.\nSee the [[Special:NewFiles|gallerie o new files]] fer ae mair veesual luikower.",
        "filedesc": "Ootline",
        "fileuploadsummary": "Ootline:",
        "filereuploadsummary": "File chynges:",
-       "filestatus": "Copyricht status:",
+       "filestatus": "Copiericht status:",
        "filesource": "Soorce:",
        "ignorewarning": "Ignore warnishment n hain file oniewey.",
-       "ignorewarnings": "Ignore ony warnins",
+       "ignorewarnings": "Ignore onie warnishmants",
        "minlength1": "Filenames maun be at least yin letter.",
        "illegalfilename": "The filename \"$1\" haes chairacters that's naw permitit in page teitles. Please rename the file n gie uplaidin it anither shote.",
        "filename-toolong": "Filenames canna be langer than 240 bytes.",
        "tmp-create-error": "Coudna cræft temperie file.",
        "tmp-write-error": "Mistak writin temperie file.",
        "large-file": "It's recommended that files ar nae muckler than $1;\nthis file is $2.",
-       "largefileserver": "This file is bigger nor the server is confeigurt tae allou.",
+       "largefileserver": "This file is bigger than the server is confeeegurt tae allou.",
        "emptyfile": "The file that ye uplaided seems tae be tuim.\nThis micht be cause o ae typeower in the filename.\nPlease check whether ye reallie want tae uplaid this file.",
        "windows-nonascii-filename": "This wiki disna support filenames wi speecial chairacters.",
        "fileexists": "Ae file wi this name exeests aareadies, please check <strong>[[:$1]]</strong> gif ye'r no sair that ye want tae chynge it.\n[[$1|thumb]]",
        "uploadwarning": "Uplaid warnishment",
        "uploadwarning-text": "Please modeefie the file descreeption ablo n gie it anither gae.",
        "savefile": "Hain file",
-       "uploadedimage": "uplaidit \"$1\"",
+       "uploadedimage": "uplaidit \"[[$1]]\"",
        "overwroteimage": "uplaided ae new version o \"[[$1]]\"",
-       "uploaddisabled": "Sorry, uplaidin is disabled.",
+       "uploaddisabled": "Sarrie, uplaidin is disablit.",
        "copyuploaddisabled": "Uplaid bi URL disabled.",
        "uploaddisabledtext": "File uplaids ar disabled.",
        "php-uploaddisabledtext": "File uplaids ar disabled in PHP.\nPlease check the file_uploads settin.",
-       "uploadscripted": "This file hauds HTML or script code that micht be wrang interpretit bi a wab brouser.",
+       "uploadscripted": "This file hauds HTML or script code that micht be wranglie interpretit bi ae wab brouser.",
        "uploadscriptednamespace": "This SVG file contains aen illegal namespace \"$1\"",
        "uploadinvalidxml": "The XML in the uplaided file coudna be parsed.",
        "uploadvirus": "The file hauds a virus! Details: $1",
        "uploadstash-refresh": "Refresh the leet o files",
        "invalid-chunk-offset": "Onvalid chunk affset",
        "img-auth-accessdenied": "Access denied.",
-       "img-auth-nopathinfo": "Missin PATH_INFO.\nYer server isna set up tae pass this information.\nIt micht be CGI-based n canna support img_auth.\nSee https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "Missin PATH_INFO.\nYer server is no set up tae pass this information.\nIt micht be CGI-based n canna support img_auth.\nSee https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Requested path isna in the confeegured uplaid directerie.",
        "img-auth-badtitle": "Onable tae cræft ae valid title fae \"$1\".",
        "img-auth-nologinnWL": "Ye'r naw loggit in n \"$1\" isna in the whiteleet.",
        "upload-curl-error6-text": "The URL gien coudna be reached.\nPlease dooble-check that the URL is correct n the site is up.",
        "upload-curl-error28": "Uplaid timeoot",
        "upload-curl-error28-text": "The site tuik ower lang tae respond.\nPlease check that the site is up, wait ae short while n gei it anither gae.\nYe micht want tae try at ae less busie time.",
-       "license": "Licensing:",
+       "license": "Licensin:",
        "license-header": "Licensin",
-       "nolicense": "Nane selected",
+       "nolicense": "Nane selectit",
        "license-nopreview": "(Luikower naw available)",
        "upload_source_url": "(ae valid, publeeclie accessible URL)",
        "upload_source_file": "(ae file oan yer computer)",
        "filehist-revert": "revert",
        "filehist-current": "current",
        "filehist-datetime": "Date/Time",
-       "filehist-thumb": "Thumbnail",
+       "filehist-thumb": "Thummnail",
        "filehist-thumbtext": "Thumbnail fer version aes o $1",
        "filehist-nothumb": "Naw thummnail",
        "filehist-user": "Uiser",
        "listduplicatedfiles": "Leet o files wi dupleecates",
        "listduplicatedfiles-summary": "This is ae leet o files whaur the maist recynt version o the file is ae duplicate o the maist recynt version o some ither file. Yinlie local files ar conseederit.",
        "listduplicatedfiles-entry": "[[:File:$1|$1]] haes [[$3|{{PLURAL:$2|ae dupleecate|$2 dupleecates}}]].",
-       "unusedtemplates": "Templates that arena uised",
+       "unusedtemplates": "Onuised templates",
        "unusedtemplatestext": "This page leets aw pages in the {{ns:template}} namespace that's naw incuidit in anither page. Mynd n check fer ither airtins til the templates afore delytin thaim.",
        "unusedtemplateswlh": "ither airtins",
-       "randompage": "Wale page allevolie",
+       "randompage": "Random page",
        "randompage-nopages": "Thaur's naw pages in the follaein {{PLURAL:$2|namespace|namespaces}}: $1.",
        "randomincategory": "Random page in categerie",
        "randomincategory-invalidcategory": "\"$1\" isna ae valid categerie name.",
        "pageswithprop-prophidden-binary": "binarie propertie value skaukt ($1)",
        "doubleredirects": "Dooble reguidals",
        "doubleredirectstext": "This page leets pages that reguide til ither reguidal pages.\nIlka raw contains airtins til the first n seicont reguidals, n the tairget o the seicont reguidal ava, this is uisuallie the \"real\" tairget page whaur the first reguidal shid poynt.\n<del>Crossed oot</del> entries hae been solved.",
-       "double-redirect-fixed-move": "[[$1]] haes been muived.\nIt nou reguides til [[$2]].",
-       "double-redirect-fixed-maintenance": "Fixin dooble reguidal fae [[$1]] til [[$2]].",
+       "double-redirect-fixed-move": "[[$1]] haes been muived.\nIt wis autæmaticlie updatit n nou it reguides tae [[$2]].",
+       "double-redirect-fixed-maintenance": "Autæmaticlie fixin dooble reguidal fae [[$1]] tae [[$2]] in ae maintenance job.",
        "double-redirect-fixer": "Reguidal fixer",
        "brokenredirects": "Brucken reguidals",
        "brokenredirectstext": "The folling redirects link til non-existent pages:",
        "withoutinterwiki-submit": "Shaw",
        "fewestrevisions": "Pages wi the fewest reeveesions",
        "nbytes": "$1 {{PLURAL:$1|byte|bytes}}",
-       "ncategories": "$1 {{PLURAL:$1|category|categories}}",
+       "ncategories": "$1 {{PLURAL:$1|categerie|categeries}}",
        "nlinks": "$1 {{PLURAL:$1|airtin|airtins}}",
-       "nmembers": "$1 {{PLURAL:$1|membir|membirs}}",
+       "nmembers": "$1 {{PLURAL:$1|memmer|memmers}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|memmer|memmers}}",
        "nrevisions": "$1 {{PLURAL:$1|reveesion|reveesions}}",
        "nviews": "$1 {{PLURAL:$1|luik|luiks}}",
        "specialpage-empty": "Thaur's naw ootcomes fer this report.",
        "lonelypages": "Orphant pages",
        "lonelypagestext": "The follaein pages'r naw linkt fae or transcluided intil ither pages in {{SITENAME}}.",
-       "uncategorizedpages": "Uncategoreised pages",
-       "uncategorizedcategories": "Uncategoreised categories",
+       "uncategorizedpages": "Oncategerised pages",
+       "uncategorizedcategories": "Oncategerised categeries",
        "uncategorizedimages": "Oncategerized files",
        "uncategorizedtemplates": "Oncategerized templates",
-       "unusedcategories": "Unuised categories",
+       "unusedcategories": "Onuised categeries",
        "unusedimages": "Unuised eemages",
-       "wantedcategories": "Wantit categories",
+       "wantedcategories": "Wantit categeries",
        "wantedpages": "Wantit pages",
        "wantedpages-badtitle": "Onvalid title in ootcome set: $1",
        "wantedfiles": "Wantit files",
        "wantedfiletext-cat": "The follaein files ar uised but dinna exeest. Files fae foreign repositeries micht be leetit despite exeestin. Onie sic false poseeteeves will be <del>struck oot</del>. Addeetionallie, pages that embed files that dinna exeest ar leetit in [[:$1]].",
        "wantedfiletext-nocat": "The follaein files ar uised but dinna exeest. Files fae foreign repositeries micht be leetit despite exeestin. Onie sic false poseeteeves will be <del>struck oot</del>.",
        "wantedtemplates": "Wantit templates",
-       "mostlinked": "Maist airtit-til pages",
-       "mostlinkedcategories": "Maist airtit-til categories",
+       "mostlinked": "Maist airtit-tae pages",
+       "mostlinkedcategories": "Maist airtit-tae categeries",
        "mostlinkedtemplates": "Maist linkt-til templates",
        "mostcategories": "Airticles wi the maist categeries",
        "mostimages": "Maist uised eemages",
        "mostinterwikis": "Pages wi the maist interwikis",
-       "mostrevisions": "Maist revised airticles",
+       "mostrevisions": "Pages wi the maist luikowers",
        "prefixindex": "Aw pages wi prefix",
        "prefixindex-namespace": "Aw pages wi preefix ($1 namespace)",
        "prefixindex-strip": "Strip preefix in leet",
        "move": "Muiv",
        "movethispage": "Muiv this page",
        "unusedimagestext": "The follaein files exeest but arna embeddit in onie page.\nPlease mynd that ither wab sites micht link til ae file wi ae direct URL, n sae micht still be leetit here despite being in acteeve uiss.",
-       "unusedcategoriestext": "The follaein category pages exists, tho nae ither airticle or category maks uiss o thaim.",
+       "unusedcategoriestext": "The follaein categerie pages exeest, tho nae ither page or categerie maks uiss o thaim.",
        "notargettitle": "Nae target",
-       "notargettext": "Ye hivna specifee'd a tairget page or uiser tae perform this function on.",
+       "notargettext": "Ye'v na speceefie'd ae tairget page or uiser tae perform this function oan.",
        "nopagetitle": "Naw sic tairget page",
        "nopagetext": "The tairget page that ye'v speeceefied disna exeest.",
        "pager-newer-n": "{{PLURAL:$1|newer 1|newer $1}}",
-       "pager-older-n": "{{PLURAL:$1|older 1|older $1}}",
+       "pager-older-n": "{{PLURAL:$1|aulder 1|aulder $1}}",
        "suppress": "Owersicht",
        "querypage-disabled": "This speecial page is disablit fer performance raisons.",
        "booksources": "Buik soorces",
        "log": "Logs",
        "all-logs-page": "Aw public logs",
        "alllogstext": "Combined displey o aw available logs o {{SITENAME}}.\nYe can narrae doon the whit ye see bi selectin ae log type, the uisername (case-sensiteeve), or the affected page (case-sensiteeve ava).",
-       "logempty": "Nae matchin items in log.",
+       "logempty": "Nae matchin eetems in log.",
        "log-title-wildcard": "Rake titles stairtin wi this tex",
        "showhideselectedlogentries": "Chynge veesibeelitie o selectit log entries",
        "allpages": "Aw pages",
-       "alphaindexline": "$1 til $2",
-       "nextpage": "Neist page ($1)",
-       "prevpage": "Page afore ($1)",
+       "nextpage": "Neis page ($1)",
+       "prevpage": "Aforegaun page ($1)",
        "allpagesfrom": "Shaw pages stairtin at:",
        "allpagesto": "Displey pages endin at:",
-       "allarticles": "Aa airticles",
-       "allinnamespace": "Aa pages ($1 namespace)",
+       "allarticles": "Aw pages",
+       "allinnamespace": "Aw pages ($1 namespace)",
        "allpagessubmit": "Gang",
        "allpagesprefix": "Shaw pages wi prefix:",
-       "allpagesbadtitle": "The page teitle gien wis wrang or haed a cross-lied or cross-wiki prefix. It micht hae ane or twa characters that canna be uised in teitles",
-       "allpages-bad-ns": "{{SITENAME}} disna hae a namespace \"$1\".",
+       "allpagesbadtitle": "The page teetle gien wis onvalit or haed ae cross-lied or cross-wiki prefix. It micht hae ane or twa chairacters that canna be uised in teetles",
+       "allpages-bad-ns": "{{SITENAME}} disna hae ae namespace \"$1\".",
        "allpages-hide-redirects": "Skauk reguidals",
        "cachedspecial-viewing-cached-ttl": "Ye'r seein ae cached version o this page, this can be up til $1 auld.",
        "cachedspecial-viewing-cached-ts": "Ye'r seein ae cached version o this page, this micht naw be compleatelie actual.",
        "cachedspecial-refresh-now": "See latest.",
-       "categories": "Categories",
+       "categories": "Categeries",
        "categoriespagetext": "The follaein {{PLURAL:$1|categerie contains|categeries contain}} pages or media.\n[[Special:UnusedCategories|Onuised categeries]] arna shawn here.\nSee [[Special:WantedCategories|wanted categeries]] ava.",
        "categoriesfrom": "Displey categeries stairtin at:",
        "special-categories-sort-count": "sairt bi coont",
        "linksearch-ns": "Namespace:",
        "linksearch-ok": "Rake",
        "linksearch-text": "Wildcairds like \"*.wikipedia.org\" can be uised.\nNeeds at least ae top-level domain, fer example \"*.org\".<br />\nSupported {{PLURAL:$2|protocol|protocols}}: <code>$1</code> (defaults to http:// gif naw protocol is speceefied).",
-       "linksearch-line": "$1 is linked from $2",
+       "linksearch-line": "$1 is airtit fae $2",
        "linksearch-error": "Wildcards micht appear yinlie at the stairt o the hoastname.",
        "listusersfrom": "Displey uisers stairtin at:",
        "listusers-submit": "Shaw",
        "listgrouprights-group": "Groop",
        "listgrouprights-rights": "Richts",
        "listgrouprights-helppage": "Help:Groop richts",
-       "listgrouprights-members": "(leet o members)",
+       "listgrouprights-members": "(leet o memmers)",
        "listgrouprights-addgroup": "Eik {{PLURAL:$2|groop|groops}}: $1",
        "listgrouprights-removegroup": "Remuiv {{PLURAL:$2|grop|groops}}: $1",
        "listgrouprights-addgroup-all": "Eik aw groops",
        "trackingcategories-msg": "The Trackin Categerie",
        "trackingcategories-name": "The Message name",
        "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 permitit), n sae it's na 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 permitit), 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 na makit muckler.",
+       "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).",
        "usermessage-editor": "Seestem messenger",
        "watchlist": "Ma watchleet",
        "mywatchlist": "Ma watchleet",
-       "watchlistfor2": "For $1 $2",
+       "watchlistfor2": "Fer $1 $2",
        "nowatchlist": "Ye'v nae eitems oan yer watchleet.",
        "watchlistanontext": "Please $1 tae see or eedit eetems oan yer watchlet.",
        "watchnologin": "Nae loggit in",
        "removewatch": "Remuiv fae watchleet",
        "removedwatchtext": "The page \"[[:$1]]\" haes been remuied fae [[Special:Watchlist|yer watchleet]].",
        "watch": "Watch",
-       "watchthispage": "Leuk ower this page",
-       "unwatch": "Unwatch",
+       "watchthispage": "Watch this page",
+       "unwatch": "Onwatch",
        "unwatchthispage": "Stap watchin",
        "notanarticle": "Naw ae content page",
        "notvisiblerev": "The last reeveesion bi ae differant uiser haes been delytit",
-       "watchlist-details": "{{PLURAL:$1|$1 page|$1 pages}} oan yer watchleet, na coontin tauk pages.",
+       "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'''.",
-       "watchmethod-recent": "checkin recent eedits fer watched pages",
-       "watchmethod-list": "checking watched pages fer recent eedits",
-       "watchlistcontains": "Yer watchleet contains $1 {{PLURAL:$1|page|pages}}.",
-       "iteminvalidname": "Proablem wi eetem '$1', onvalit name...",
        "wlnote2": "Ablo ar the chynges in the hainmaist {{PLURAL:$1|hoor|<strong>$1</strong> hours}}, aes o $3, $2.",
-       "wlshowlast": "Shaw lest $1 hours $2 days $3",
-       "watchlist-options": "Watchleet options",
+       "wlshowlast": "Shaw hainmaist $1 hoors $2 days $3",
+       "watchlist-options": "Watchleet opties",
        "watching": "Watchin...",
-       "unwatching": "Unwatchin...",
+       "unwatching": "Onwatchin...",
        "watcherrortext": "Ae mistak occurred while chyngin yer watchleet settins fer \"$1\".",
-       "enotif_reset": "Merk aa pages visitit",
+       "enotif_reset": "Maurk aw pages aes veesitit",
        "enotif_impersonal_salutation": "{{SITENAME}} uiser",
        "enotif_subject_deleted": "{{SITENAME}} page $1 haes been {{GENDER:$2|delytit}} bi $2",
        "enotif_subject_created": "{{SITENAME}} page $1 haes been {{GENDER:$2|cræftit}} bi $2",
        "enotif_lastvisited": "Hae ae leuk at $1 fer aa chynges sin yer laist veesit.",
        "enotif_lastdiff": "See $1 tae see this chynge.",
        "enotif_anon_editor": "anonymoos uiser $1",
-       "enotif_body": "Dear $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nEediter's ootline: $PAGESUMMARY $PAGEMINOREDIT\n\nContact the eediter:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nThaur'll be naw ither annooncemants in case o further acteevitie onless ye veesit this page while loggit in. Ye coud forby reset the annooncemant flags fer aw yer watched pages oan yer watchleet.\n\nYer freendlie {{SITENAME}} annooncemant system\n\n--\nTaae chynge yer wab-mail annooncemant settins, veesit\n{{canonicalurl:{{#special:Preferences}}}}\n\nTae chynge yer watchleet settins, veesit\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nTae delyte the page fae yer watchleet, veesit\n$UNWATCHURL\n\nFeedback n further asseestance:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Dear $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nEediter's ootline: $PAGESUMMARY $PAGEMINOREDIT\n\nContact the eediter:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nThaur'll be naw ither annooncemants in case o further acteevitie onless ye veesit this page while loggit in. Ye coud forby reset the annooncemant flags fer aw yer watched pages oan yer watchleet.\n\nYer freendlie {{SITENAME}} annooncemant system\n\n--\nTae chynge yer wab-mail annooncemant settins, veesit\n{{canonicalurl:{{#special:Preferences}}}}\n\nTae chynge yer watchleet settins, veesit\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nTae delyte the page fae yer watchleet, veesit\n$UNWATCHURL\n\nFeedback n further asseestance:\n$HELPPAGE",
        "created": "cræftit",
        "changed": "chynged",
        "deletepage": "Delyte page",
        "dellogpagetext": "Ablo is ae leet o the maist recynt delytions.",
        "deletionlog": "delytion log",
        "reverted": "Revertit til aulder reveesion",
-       "deletecomment": "Raeson:",
+       "deletecomment": "Raison:",
        "deleteotherreason": "Ither/addeetional raison:",
-       "deletereasonotherlist": "Ither raeson",
+       "deletereasonotherlist": "Ither raison",
        "deletereason-dropdown": "* Commyn delyte raisons\n** Spam\n** Vandaleesm\n** Copiericht violation\n** Writer request\n** Broken reguidal",
        "delete-edit-reasonlist": "Eedit delytion raisons",
        "delete-toobig": "This page haes ae muckle eedit histerie, ower $1 {{PLURAL:$1|reveesion|reveesions}}.\nDelytion o sic pages haes been restrictit tae stap accidental disruption o {{SITENAME}}.",
        "delete-warning-toobig": "This page haes ae muckle eedit histerie, ower $1 {{PLURAL:$1|reveesion|reveesions}}.\nDelytin it micht disrupt database operations o {{SITENAME}};\nproceed wi caution.",
        "deleting-backlinks-warning": "'''Warnishment:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Ither pages]] airt til or transcluide the page ye'r aboot tae delyte.",
-       "rollback": "Row back edits",
+       "rollback": "Row back eedits",
        "rollback_short": "Rowback",
        "rollbacklink": "rowback",
        "rollbacklinkcount": "rowback $1 {{PLURAL:$1|eedit|eedits}}",
        "modifiedarticleprotection": "chynged protection level fer \"[[$1]]\"",
        "unprotectedarticle": "remuied protection fae \"[[$1]]\"",
        "movedarticleprotection": "muived protection settins fae \"[[$2]]\" til \"[[$1]]\"",
-       "protect-title": "Protectin \"$1\"",
+       "protect-title": "Chynge protection level fer \"$1\"",
        "protect-title-notallowed": "See protection level o \"$1\"",
-       "prot_1movedto2": "[[$1]] flittit til [[$2]]",
+       "prot_1movedto2": "[[$1]] muivit tae [[$2]]",
        "protect-badnamespace-text": "Pages in this namespace canna be protected.",
        "protect-norestrictiontypes-text": "This page canna be protected aes thaur's naw restreection types available.",
-       "protectcomment": "Raeson:",
+       "protectcomment": "Raison:",
        "protectexpiry": "Expires:",
        "protect_expiry_invalid": "Expirie time is onvalit.",
        "protect_expiry_old": "Expirie time is in the past.",
        "protect-locked-dblock": "Protection levels canna be chynged cause o aen acteeve database lock.\nHere ar the settins fer the page <strong>$1</strong> nou:",
        "protect-locked-access": "Yer accont disna hae permeession tae chynge page protection levels.\nHere ar the settins fer the page <strong>$1</strong> the nou:",
        "protect-cascadeon": "This page is nou protected cause it is incluided in the follaein {{PLURAL:$1|page, this haes|pages, thir hae}} cascadin protection turned oan.\nChynges til this page's protection level will na affect the cascadin protection.",
-       "protect-default": "Allow aw uisers",
+       "protect-default": "Allou aw uisers",
        "protect-fallback": "permit yinlie uisers wi \"$1\" permission",
        "protect-level-autoconfirmed": "Allou yinly autæconfirmed uisers",
        "protect-level-sysop": "Allou admeenistraters yinly",
        "maximum-size": "Mucklest size:",
        "restriction-edit": "Eidit",
        "restriction-move": "Muiv",
-       "restriction-create": "Mak",
+       "restriction-create": "Creaut",
        "restriction-upload": "Uplaid",
        "restriction-level-sysop": "fulie protected",
        "restriction-level-autoconfirmed": "semie protected",
        "sp-contributions-newbies": "Shaw contreebutions o freish accoonts ainlie",
        "sp-contributions-newbies-sub": "Fer new accoonts",
        "sp-contributions-newbies-title": "Uiser contreebutions fer new accoonts",
-       "sp-contributions-blocklog": "block log",
+       "sp-contributions-blocklog": "the block log",
        "sp-contributions-suppresslog": "suppressed uiser contreebutions",
        "sp-contributions-deleted": "delytit uiser contreebutions",
-       "sp-contributions-uploads": "uploads",
+       "sp-contributions-uploads": "uplaids",
        "sp-contributions-logs": "logs",
        "sp-contributions-talk": "tauk",
        "sp-contributions-userrights": "uiser richts management",
        "isredirect": "reguidal page",
        "istemplate": "transclusion",
        "isimage": "file airtin",
-       "whatlinkshere-prev": "{{PLURAL:$1|previous|previous $1}}",
-       "whatlinkshere-next": "{{PLURAL:$1|next|next $1}}",
+       "whatlinkshere-prev": "{{PLURAL:$1|aforegaun|aforegaun $1}}",
+       "whatlinkshere-next": "{{PLURAL:$1|neix|neix $1}}",
        "whatlinkshere-links": "← airtins",
-       "whatlinkshere-hideredirs": "$1 redirects",
+       "whatlinkshere-hideredirs": "$1 reguidals",
        "whatlinkshere-hidetrans": "$1 transclusions",
        "whatlinkshere-hidelinks": "$1 airtins",
        "whatlinkshere-hideimages": "$1 file airtins",
        "blockip": "Block 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).",
-       "ipadressorusername": "IP Address or uisername",
+       "ipaddressorusername": "IP address or uisername:",
        "ipbexpiry": "Expirie:",
-       "ipbreason": "Raeson:",
+       "ipbreason": "Raison:",
        "ipbreason-dropdown": "*Commyn block raisons\n** Insertin false information\n** Remuivin content fae pages\n** Spammin airtins til ootby steids\n** Insertin nonsense/gibberish intil pages\n** Inteemidatin behavier/harassment\n** Abuisin multiple accoonts\n** Onacceptable uisername",
        "ipb-hardblock": "Stap loggit-in uisers fae eeditin fae this IP address",
        "ipbcreateaccount": "Stap accoont cræftin",
        "ipbemailban": "Stap uiser fae sendin wab-mail",
        "ipbenableautoblock": "Autæmateeclie block the laist IP address uised bi this uiser, n onie subsequent IP addresses that thay attempt tae eedit fae",
        "ipbsubmit": "Block this uiser",
-       "ipbother": "Ither time",
-       "ipboptions": "2 hours:2 hours,1 day:1 day,3 days:3 days,1 week:1 week,2 weeks:2 weeks,1 month:1 month,3 months:3 months,6 months:6 months,1 year:1 year,indefinite:infinite",
+       "ipbother": "Ither time:",
+       "ipboptions": "2 hoors:2 hours,1 day:1 day,3 days:3 days,1 week:1 week,2 weeks:2 weeks,1 month:1 month,3 months:3 months,6 months:6 months,1 year:1 year,indefinite:infinite",
        "ipbhidename": "Skauk uisername fae eedits n leets",
        "ipbwatchuser": "Watch this uiser's uiser n tauk pages",
        "ipb-disableusertalk": "Stap this uiser fae eeditin thair ain tauk page while blockit",
        "ipblocklist-otherblocks": "Ither {{PLURAL:$1|block|blocks}}",
        "infiniteblock": "infeenite",
        "expiringblock": "dies oan $1 at $2",
-       "anononlyblock": "anon. juist",
+       "anononlyblock": "anon. yinlie",
        "noautoblockblock": "autæblock disabled",
-       "createaccountblock": "accoont-makkin blockit",
+       "createaccountblock": "account creaution disablt",
        "emailblock": "wab-mail disabled",
        "blocklist-nousertalk": "canna eedit yer ain tauk page",
        "ipblocklist-empty": "The block leet is tuim.",
        "blocklogentry": "blockit [[$1]] wi aen expirie time o $2 $3",
        "reblock-logentry": "chynged block settins fer [[$1]] wi ae diein time o $2 $3",
        "blocklogtext": "This is ae log o uiser blockin n onblockin actions. Autaematiclie blockit IP addresses isna leetit. See the [[Special:BlockList|block leet]] fer the leet o bans n blocks oan the nou.",
-       "unblocklogentry": "unblockit $1",
+       "unblocklogentry": "onblockit $1",
        "block-log-flags-anononly": "anonymos uisers yinlie",
-       "block-log-flags-nocreate": "accoont-makkin blockit",
+       "block-log-flags-nocreate": "account creaution disablt",
        "block-log-flags-noautoblock": "autæblock disabled",
        "block-log-flags-noemail": "wab-mail disabled",
        "block-log-flags-nousertalk": "canna eedit yer ain tauk page",
        "block-log-flags-angry-autoblock": "enhanced autæblock enabled",
        "block-log-flags-hiddenname": "uisername skaukt",
-       "range_block_disabled": "The administrator abeility tae mak range blocks is disabled.",
+       "range_block_disabled": "The admeenistrater abeelitie tae creaut range blocks is disablt.",
        "ipb_expiry_invalid": "Expirie time is onvalit.",
        "ipb_expiry_temp": "Skaukt uisername blocks maun be permanent.",
        "ipb_hide_invalid": "Onable tae suppress this accoont; it haes mair than {{PLURAL:$1|yin eedit|$1 eedits}}.",
        "locknoconfirm": "Ye didna tick the confirmation kist.",
        "lockdbsuccesssub": "Database lock fine",
        "unlockdbsuccesssub": "Database lowsed",
-       "lockdbsuccesstext": "The database haes been lockit. <br />Mynd an tak the lock aff efter yer maintenance is feinisht.",
+       "lockdbsuccesstext": "The database haes been lockit. <br />Mynd an [[Special:UnlockDB|tak the lock aff]] efter yer maintenance is compleate.",
        "unlockdbsuccesstext": "The database haes bin lowsed.",
        "lockfilenotwritable": "The database lock file isna writable.\nTae lock or lowse the database, this needs tae be writable bi the wab server.",
-       "databasenotlocked": "The database isna lockit.",
+       "databasenotlocked": "The database is no lockit.",
        "lockedbyandtime": "(bi {{GENDER:$1|$1}} oan $2 at $3)",
        "move-page": "Muiv $1",
        "move-page-legend": "Muiv page",
        "newtitle": "Til new teitle",
        "move-watch": "Watch soorce page n tairget page",
        "movepagebtn": "Muiv page",
-       "pagemovedsub": "Flittin succeedit",
+       "pagemovedsub": "Muiv succeedit",
        "movepage-moved": "<strong>\"$1\" has been muived til \"$2\"</strong>",
        "movepage-moved-redirect": "Ae reguidal haes been cræftit.",
        "movepage-moved-noredirect": "The cræftin o ae reguidal haes been suppressed.",
-       "articleexists": "A page o that name aareadies exists, or the name ye'v waled isna guid. Please wale anither name.",
+       "articleexists": "Ae page o that name awreadie exeests, or the name that ye'v chosen is no valit. Please chuise anither name.",
        "cantmove-titleprotected": "Ye canna muiv ae page til this location cause the new title haes been protected fae cræftin",
        "movetalk": "Muiv associated tauk page",
        "move-subpages": "Muiv subpages (up til $1)",
        "movepage-page-unmoved": "The page $1 coudna be muived til $2.",
        "movepage-max-pages": "The mmucklest o $1 {{PLURAL:$1|page|pages}} haes been muived n naw mair will be muived autæmateeclie.",
        "movelogpage": "Muiv log",
-       "movelogpagetext": "A leet o pages that's flitted is ablo.",
+       "movelogpagetext": "Ae leet o aw page muives is ablo.",
        "movesubpagetext": "This page haes $1 {{PLURAL:$1|subpage|subpages}} shawn ablo.",
        "movenosubpage": "This page haes naw subpages.",
-       "movereason": "Raeson:",
+       "movereason": "Raison:",
        "revertmove": "revert",
        "delete_and_move": "Delyte n muiv",
        "delete_and_move_text": "==Delytion caad fer==\n\nThe destination airticle \"[[:$1]]\" aareadies exists. Div ye want tae delyte it fer tae mak wey fer the muiv?",
        "allmessagesname": "Name",
        "allmessagesdefault": "Defaut message tex",
        "allmessagescurrent": "Message tex the nou",
-       "allmessagestext": "This is ae leet o system messages available in the MediaWiki namespace.\nPlease veesit [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] n [//translatewiki.net translatewiki.net] gif ye wish tae contreebute til the generic MediaWiki localisation.",
-       "allmessagesnotsupportedDB": "'''{{ns:special}}:AllMessages''' nae supportit acause '''$wgUseDatabaseMessages''' is aff.",
+       "allmessagestext": "This is ae leet o seestem messages available in the MediaWiki namespace.\nPlease veesit [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] n [//translatewiki.net translatewiki.net] gif ye wish tae contreebute tae the generic MediaWiki localisation.",
+       "allmessagesnotsupportedDB": "This page canna be uised cause <strong>$wgUseDatabaseMessages</strong> haes been disablt.",
        "allmessages-filter": "Filter b custymization state:",
        "allmessages-filter-unmodified": "Onmodified",
        "allmessages-filter-all": "Aw",
        "allmessages-language": "Leid:",
        "allmessages-filter-submit": "Gang",
        "allmessages-filter-translate": "Owerset",
-       "thumbnail-more": "Eik",
+       "thumbnail-more": "Mak Muckler",
        "filemissing": "File missin",
        "thumbnail_error": "Mistak makin thummnail: $1",
        "thumbnail_error_remote": "Mistak message fae $1:\n$2",
        "tooltip-pt-anonuserpage": "The uiser page fer the IP address that ye'r eeditin aes",
        "tooltip-pt-mytalk": "Yer tauk page",
        "tooltip-pt-anontalk": "Discussion aneat eedits fae this IP address",
-       "tooltip-pt-preferences": "Ma preferences",
+       "tooltip-pt-preferences": "Ma preferances",
        "tooltip-pt-watchlist": "Ae leet o pages ye'r moniterin fer chynges",
        "tooltip-pt-mycontris": "Leet o yer contreebutions",
-       "tooltip-pt-login": "It's a guid idea tae log i, but ye dinna hae tae.",
+       "tooltip-pt-login": "It's ae guid idea tae log in, but ye dinna hae tae.",
        "tooltip-pt-logout": "Log oot",
        "tooltip-ca-talk": "Discussion aneat the content page",
        "tooltip-ca-edit": "Ye can eedit this page. Please uise the luikower button afore hainin",
        "tooltip-ca-undelete": "Restore the eedits dun oan this page afore it wis delytit",
        "tooltip-ca-move": "Muiv this page",
        "tooltip-ca-watch": "Eik this page til yer watchleet",
-       "tooltip-ca-unwatch": "Remove this page frum yer watchleet",
+       "tooltip-ca-unwatch": "Remuiv this page fae yer watchleet",
        "tooltip-search": "Rake {{SITENAME}}",
        "tooltip-search-go": "Gang til ae page wi this exact name gif exeests",
        "tooltip-search-fulltext": "Rake the pages fer this tex",
        "tooltip-n-mainpage": "Gang til the Main Page",
        "tooltip-n-mainpage-description": "Gang til the Main Page",
        "tooltip-n-portal": "Aneat the project, whit ye can dae, whaur tae fynd things",
-       "tooltip-n-currentevents": "Fin' background speirins oan current events",
-       "tooltip-n-recentchanges": "The leet o recent chynges in the wiki",
+       "tooltip-n-currentevents": "Fynd backgroond speirins oan the nou events",
+       "tooltip-n-recentchanges": "Ae leet o recynt chynges in the wiki",
        "tooltip-n-randompage": "Laid ae random page",
        "tooltip-n-help": "The steid tae fynd oot",
-       "tooltip-t-whatlinkshere": "List o' a' wiki pages that link 'ere",
+       "tooltip-t-whatlinkshere": "Ae leet o aw wiki pages that airt here",
        "tooltip-t-recentchangeslinked": "Recynt chynges in pages linkt fae this page",
        "tooltip-feed-rss": "RSS feed fer this page",
        "tooltip-feed-atom": "Atom feed fer this page",
        "tooltip-t-contributions": "See ae leet o this uiser's contreebutions",
        "tooltip-t-emailuser": "Send ae wab-mail til this uiser",
        "tooltip-t-upload": "Uplaid files",
-       "tooltip-t-specialpages": "Leet o byordinar pages",
-       "tooltip-t-print": "Printable version o' this page",
+       "tooltip-t-specialpages": "Ae leet o aw byordinar pages",
+       "tooltip-t-print": "Prentable version o this page",
        "tooltip-t-permalink": "Permanent link til this reveesion o the page",
-       "tooltip-ca-nstab-main": "Leuk at content page",
+       "tooltip-ca-nstab-main": "Leuk at the content page",
        "tooltip-ca-nstab-user": "See the uiser page",
        "tooltip-ca-nstab-media": "See the media page",
        "tooltip-ca-nstab-special": "This is ae byordinair page, ye canna eedit the page itsel",
        "tooltip-ca-nstab-template": "See the template",
        "tooltip-ca-nstab-help": "See the heelp page",
        "tooltip-ca-nstab-category": "See the categerie page",
-       "tooltip-minoredit": "Mairk this as a smaa edit",
+       "tooltip-minoredit": "Maurk this aes ae smaa eedit",
        "tooltip-save": "Hain yer chynges",
        "tooltip-preview": "Luikower yer chynges, please uise this afore hainin!",
        "tooltip-diff": "Shaw the chynges that ye makit til the tex.",
        "tooltip-undo": "\"Ondae\" reverts this eedit n apens the eedit form in luikower mode. It permits addin ae raison in the owerview.",
        "tooltip-preferences-save": "Hain preeferances",
        "tooltip-summary": "Enter ae short owerview",
-       "notacceptable": "The wiki server canna provide data in a format yer client can read.",
        "anonymous": "Nameless {{PLURAL:$1|uiser|uisers}} o {{SITENAME}}",
        "siteuser": "{{SITENAME}} uiser $1",
        "anonuser": "{{SITENAME}} anonymoos uiser $1",
        "pageinfo-category-pages": "Nummer o pages",
        "pageinfo-category-subcats": "Nummer o subcategeries",
        "pageinfo-category-files": "Nummer o files",
-       "markaspatrolleddiff": "Merk as patrolled",
-       "markaspatrolledtext": "Merk this airticle as patrolled",
-       "markedaspatrolled": "Merkit as patrolled",
+       "markaspatrolleddiff": "Maurk aes patrolled",
+       "markaspatrolledtext": "Maurk this page aes patrolled",
+       "markedaspatrolled": "Maurkit aes patrolled",
        "markedaspatrolledtext": "The selected reveesion o [[:$1]] haes been maurked aes patrolled.",
        "rcpatroldisabled": "Recynt chynges patrol disabled",
        "rcpatroldisabledtext": "The Recynt Chynges Patrol featur is disabled the nou.",
        "imagemaxsize": "Eemage size leemit:<br /><em>(fer file descreeption pages)</em>",
        "thumbsize": "Thummnail size:",
        "file-info-size": "$1 × $2 pixels, file size: $3, MIME type: $4",
-       "file-nohires": "Na higher resolution available.",
-       "svg-long-desc": "SVG file, nominally $1 × $2 pixels, file size: $3",
+       "file-nohires": "Nae heier resolution available.",
+       "svg-long-desc": "SVG file, nominallie $1 × $2 pixels, file size: $3",
        "svg-long-desc-animated": "Animated SVG file, nominallie $1 × $2 pixels, file size: $3",
        "svg-long-error": "Onvalit SVG file: $1",
        "show-big-image": "Oreeginal file",
        "file-info-png-repeat": "pleyed $1 {{PLURAL:$1|time|times}}",
        "file-no-thumb-animation": "<strong>Mynd: Due til techneecal limitations, thummnails o this file will na be animated.</strong>",
        "file-no-thumb-animation-gif": "<strong>Mynd: Due til techneecal limitations, thummnails o hei resolution GIF eemages sic aes this will na be animated.</strong>",
-       "newimages": "Gallery o new files",
+       "newimages": "Gallerie o new files",
        "imagelisttext": "Ablo is a leet o $1 {{PLURAL:$1|eemage|eemages}} sortit $2.",
        "newimages-summary": "This byordinair page shaws the last uplaidit files.",
        "newimages-label": "Filename (or ae pairt o it):",
        "exif-imagedescription": "Eemage title",
        "exif-software": "Saffware uised",
        "exif-artist": "Writer",
-       "exif-copyright": "Copyricht hauder",
+       "exif-copyright": "Copiericht hauder",
        "exif-flashpixversion": "Supportit Flashpix version",
        "exif-colorspace": "Colour space",
        "exif-componentsconfiguration": "Meanin o ilka component",
        "exif-urgency-high": "Hei ($1)",
        "exif-urgency-other": "Uiser-defined prioritie ($1)",
        "watchlistall2": "aw",
-       "namespacesall": "aa",
+       "namespacesall": "aw",
        "monthsall": "aw",
        "confirmemail": "Confirm wab-mail address",
-       "confirmemail_noemail": "Ye dinna hae a valid email address set in yer [[Special:Preferences|uiser preferences]].",
+       "confirmemail_noemail": "Ye dinna hae ae valid email address set in yer [[Special:Preferences|uiser preferances]].",
        "confirmemail_text": "This wiki needs ye tae validate yer wab-mail address\nafore uisin wab-mail featurs. Acteevate the button ablo tae send a confirmation\nmail til yer address. The mail will incluide ae link containin ae code; laid the\n link in yer brouser tae confirm that yer wab-mail address is guid.",
        "confirmemail_pending": "Ae confirmation code haes awreadie been wab-mailed til ye;\ngif ye recantlie cræftit yer accoont, ye micht wish tae wait ae few minutes fer it tae arrive afore speirin fer ae new code.",
        "confirmemail_send": "Mail ae confirmation code",
        "confirmemail_invalid": "Onvalid confirmation code.\nThe code micht hae expired.",
        "confirmemail_needlogin": "Please $1 fer tae confirm yer wab-mail address.",
        "confirmemail_success": "Yer wab-mail address haes been confirmed. Ye can nou [[Special:UserLogin|login]]  n enjoy the wiki.",
-       "confirmemail_loggedin": "Yer e-mail address haes noo been confirmed.",
+       "confirmemail_loggedin": "Yer e-mail address haes nou been confirmed.",
        "confirmemail_subject": "{{SITENAME}} wab-mail address confirmation",
        "confirmemail_body": "Somebodie, maist likely ye, fae IP address $1,\nhaes registered aen accoont \"$2\" wi this wab-mail address oan {{SITENAME}}.\n\nTae confirm that this accoont reallie is yers n acteevate wab-mail featurs oan {{SITENAME}}, apen this link in yer brouser:\n\n$3\n\nGif ye div *naw* register the accoont, follae this link\ntae cancel the wab-mail address confirmation:\n\n$5\n\nThis confirmation code will expire oan $4.",
        "confirmemail_body_changed": "Somebodie, proabablie ye, from IP address $1,\nhaes chynged the wab-mail address o the accoont \"$2\" til this address oan {{SITENAME}}.\n\nTae confirm that this accoont reallie dis belang til ye n reacteevate\nwab-mail featurs oan {{SITENAME}}, apen this link in yer brouser:\n\n$3\n\nGif the account dis *na* belang til ye, follae this link\ntae cancel the wab-mail address confirmation:\n\n$5\n\nThis confirmation code will die oan $4.",
        "table_pager_limit": "Shaw $1 eetems per page",
        "table_pager_limit_label": "Eetems per page:",
        "table_pager_limit_submit": "Gang",
-       "table_pager_empty": "Nae results",
+       "table_pager_empty": "Nae ootcomes",
        "autosumm-blank": "Blanked the page",
        "autosumm-replace": "Replacin page wi '$1'",
        "autoredircomment": "Reguidin til [[$1]]",
        "autosumm-new": "Cræftit page wi \"$1\"",
-       "livepreview-loading": "Laidin...",
-       "livepreview-ready": "Laidin... Readie!",
-       "livepreview-failed": "Live luikower failed!\nGie normal luikower ae gae.",
-       "livepreview-error": "Failed tae connect: $1 \"$2\".\nGie normal luikower ae gae.",
        "lag-warn-normal": "Chynges newer than $1 {{PLURAL:$1|seicont|seiconts}} micht na be shawn in this leet.",
        "lag-warn-high": "Cause o hei database server lag, chynges newer than $1 {{PLURAL:$1|seicont|seiconts}} micht na be shawn in this leet.",
-       "watchlistedit-numitems": "Yer watchleet contains {{PLURAL:$1|1 title|$1 titles}}, na coontin tauk pages.",
-       "watchlistedit-noitems": "Yer watchleet contains naw titles.",
        "watchlistedit-normal-title": "Eedit watchleet",
        "watchlistedit-normal-legend": "Remuiv titles fae watchleet",
        "watchlistedit-normal-explain": "Titles oan yer watchleet ar shawn ablo.\nTae remuiv ae title, check the kist nex til it, n clap \"{{int:Watchlistedit-normal-submit}}\".\nYe can [[Special:EditWatchlist/raw|eedit the raw leet]] aes weel.",
        "specialpages-group-media": "Media reports n uplaids",
        "specialpages-group-users": "Uisers n richts",
        "specialpages-group-highuse": "Hei uiss pages",
-       "specialpages-group-pages": "leet o pages",
+       "specialpages-group-pages": "Leets o pages",
        "specialpages-group-pagetools": "Page tuils",
        "specialpages-group-wiki": "Data n tuils",
        "specialpages-group-redirects": "Reguidin byordinair pages",
        "compare-invalid-title": "The title that ye speceefied is onvalit.",
        "compare-title-not-exists": "The title that ye speceefied disna exeest.",
        "compare-revision-not-exists": "The reveesion that ye speceefied disna exeest.",
-       "dberr-header": "This wiki haes ae proablem",
        "dberr-problems": "Sairrie! This site is expereeancin techneecal diffeculties.",
        "dberr-again": "Gie it ae few minutes n than relaid.",
        "dberr-info": "(Canna contact the database server: $1)",
index 9f77a37..67d9eab 100644 (file)
@@ -6,7 +6,8 @@
                        "Felis",
                        "Jun Misugi",
                        "Kaganer",
-                       "Midnight Gambler"
+                       "Midnight Gambler",
+                       "아라"
                ]
        },
        "tog-underline": "Sotturìnia li cullegamenti:",
        "filedeleteerror": "Impussìbiri canzillà lu file \"$1\".",
        "directorycreateerror": "Impussìbiri crià la directory \"$1\".",
        "filenotfound": "File \"$1\" no acciappaddu.",
-       "fileexistserror": "Impussìbiri ischribì lu file \"$1\": lu file isisthì già",
        "unexpected": "Varori impribisthu: \"$1\"=\"$2\".",
        "formerror": "Errori: impussìbiri invià lu mòdulu",
        "badarticleerror": "Operazioni no cunsintidda pa chistha pàgina.",
        "nav-login-createaccount": "Intra / registhrazioni",
        "loginprompt": "Pa intrà a {{SITENAME}} è nezzessàriu abirità li cookie.",
        "userlogin": "Intra o cria una noba registhrazioni",
+       "userloginnocreate": "Intra",
        "logout": "Esci",
        "userlogout": "Esci",
        "notloggedin": "Intradda no effettuadda",
        "gotaccountlink": "Intra",
        "userlogin-resetlink": "Hai immintiggaddu li minuddi d'intradda?",
        "createaccountmail": "via postha erettrònica",
+       "createaccountreason": "Mutibu:",
+       "createacct-reason": "Mutibu",
        "badretype": "Li paràuri d'órdhini insiriddi nò cuinzidhini tra èddi.",
        "userexists": "L'innòmu utenti insiriddu è già utirizaddu. Pa pazieri chirria un'innòmu utenti dibessu.",
        "loginerror": "Errori i' l'intradda",
        "changepassword-success": "La paràura d'órdhini tóia è isthadda mudìfiggadda. Abà sei intrendi...",
        "resetpass_forbidden": "No è pussìbiri mudifiggà li paràuri d'órdhini in {{SITENAME}}.",
        "passwordreset-username": "Innòmu utenti:",
+       "changeemail-none": "(nisciunu)",
        "resettokens-tokens": "Token:",
        "bold_sample": "Grassetu",
        "bold_tip": "Grassetu",
        "savearticle": "Saivvà la pagina",
        "preview": "Antiprimma",
        "showpreview": "Visuarizza antiprimma",
-       "showlivepreview": "Funzioni ''Live preview''",
        "showdiff": "Musthra ciambamenti",
        "anoneditwarning": "'''Attinzioni:''' Intradda nò effettuadda. I' la cronologia di la pàgina sarà rigisthraddu l'indirizzu IP tóiu.",
        "missingsummary": "'''Promimória:''' Nò hai ippizzificaddu l'oggettu di la mudìfigga. Turrendi à incalchà '''Saivva la pàgina''' lu mudìfigga sarà saivvadda cun l'oggettu bioddu.",
        "rev-deleted-text-permission": "Chistha versioni di la pàgina è isthadda buggadda da l'archìbi visìbiri a lu pùbbriggu.\nCunsulthà lu [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} rigisthru di canzilladdura] pa althri dettàgli.",
        "rev-deleted-text-view": "Chistha versioni di la pàgina è isthadda buggadda da l'archìbi visìbiri a lu pùbbriggu.\nLu testhu pò assé visuarizzaddu soru da l'amministhradori di lu situ.\nCunsulthà lu [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} rigisthru di canzilladdura] pa althri dettàgli.",
        "rev-delundel": "musthrà/cuà",
+       "rev-showdeleted": "musthra",
        "revisiondelete": "Canzella o ricùpara versioni",
        "revdelete-nooldid-title": "Versioni nò ippizzificadda",
        "revdelete-nooldid-text": "No ài ippizzificaddu la o li versioni di la pàgina i' li quari eseguì chistha funzioni; pò assé chi nò esisthini.",
        "revdelete-show-file-submit": "Si",
        "logdelete-selected": "{{PLURAL:$1|Eventu di lu rigisthru sciubaraddu|Eventi di lu rigisthru sciubaraddi}}:",
        "revdelete-legend": "Impustha li sighenti limitazioni i'li versioni canzilladdi:",
-       "revdelete-hide-text": "Cua lu testhu di la versioni",
+       "revdelete-hide-text": "Testhu di la versioni",
        "revdelete-hide-image": "Cua li cuntinuddi di lu file",
        "revdelete-hide-name": "Cua azioni e oggettu di la matessi",
        "revdelete-hide-comment": "Cua l'oggettu di la mudìfigga",
        "revdelete-hide-restricted": "Apprica chisthi limitazioni puru a l'amministhradori e brocca chistha interfàccia",
        "revdelete-suppress": "Cua l'infuimmazioni puru a l'amministhradori",
        "revdelete-unsuppress": "Elimina li limitazioni i' li ribisioni turraddi che primma",
-       "revdelete-log": "Cummentu pa lu rigisthru:",
+       "revdelete-log": "Mutibu:",
        "revdelete-submit": "Apprica a la ribisioni isciubaradda",
        "revdelete-success": "'''Visibiriddai di la ribisioni impusthadda.'''",
        "logdelete-success": "'''Visibiriddai di l'eventu impusthadda.'''",
        "revdel-restore": "Ciamba la visibiriddai",
+       "revdelete-reasonotherlist": "Althra mutibazioni",
        "mergehistory": "Unioni cronologi",
        "mergehistory-box": "Unì la cronologia di dui pàgini:",
        "mergehistory-from": "Pàgina d'orìgini:",
        "mergehistory-no-destination": "La pàgina dI disthinazioni $1 nò isisthi.",
        "mergehistory-invalid-source": "La pàgina d'orìgini débi abé un tìturu currettu.",
        "mergehistory-invalid-destination": "La pàgina di disthinazioni débi abé un tìturu currettu.",
+       "mergehistory-reason": "Mutibu:",
        "mergelog": "Rigisthru di l'unioni",
        "pagemerge-logentry": "ha uniddu [[$1]] a [[$2]] (ribisioni finz'a $3)",
        "revertmerge": "Anulla unioni",
        "search-nonefound": "Nisciuni risulthaddi pa la to' zercha",
        "powersearch-legend": "Zercha abanzadda",
        "powersearch-ns": "Zercha i' li tipi di pàgina:",
-       "powersearch-redir": "Listha rinvii",
        "powersearch-toggleall": "Tutti",
        "powersearch-togglenone": "Nisciunu",
        "searchdisabled": "Abà no pói zirchà in {{SITENAME}}; proba cun Google o sìmiri, ma ammèntaddi chi li cuntinuddi di {{SITENAME}} poni assé no aggiornaddi.",
        "servertime": "Ora di lu server:",
        "guesstimezone": "Usa l'ora di lu tóiu nabiggadori",
        "allowemail": "Cunsenti lu rizzibimentu di postha erettrònica d'althri utenti (1)",
-       "prefs-searchoptions": "Opzioni di zercha",
+       "prefs-searchoptions": "Zercha",
        "prefs-namespaces": "Tipu di pagina",
        "defaultns": "Namespace pridifiniddi pa zirchà:",
        "default": "pridifiniddu",
        "userrights-editusergroup": "Mudìfigga gruppi utenti",
        "saveusergroups": "Sàivva gruppi utenti",
        "userrights-groupsmember": "Appartheni a li gruppi:",
-       "userrights-reason": "Mutibu di la mudìffiga:",
+       "userrights-reason": "Mutibu:",
        "userrights-no-interwiki": "Nò ài lu primmissu pa mudìfiggà li diritti di l'utenti i' althri siti.",
        "userrights-nodatabase": "La bancadati $1 nò isisthi o nò è in lucari.",
        "userrights-nologin": "Débi [[Special:UserLogin|intrà]] cumenti amministhradori pa assignà li diritti utenti.",
        "group-bureaucrat": "Buròcrati",
        "group-suppress": "Ibbàgli",
        "group-all": "(utenti)",
-       "group-user-member": "Utenti",
+       "group-user-member": "{{GENDER:$1|utenti}}",
        "group-autoconfirmed-member": "Utenti autocunfèimmaddu",
-       "group-bot-member": "Bot",
+       "group-bot-member": "{{GENDER:$1|bot}}",
        "group-sysop-member": "Amministhradori",
        "group-bureaucrat-member": "Buròcrati",
        "group-suppress-member": "Ibbàgliu",
        "rightslogtext": "Chisthu è lu rigisthru di lu mudìfigghi a li diritti assignaddi a l'utenti.",
        "action-edit": "mudìfiggà chistha pàgina",
        "nchanges": "$1 {{PLURAL:$1|mudìfigga|mudìfigghi}}",
+       "enhancedrc-history": "cronologia",
        "recentchanges": "Ulthimi mudìfigghi",
        "recentchanges-legend": "Opzioni ùlthimi mudìfigghi",
        "recentchanges-summary": "Chistha pàgina prisinta li mudìfigghi più rizzenti a li cuntinuddi di lu situ.",
        "recentchanges-label-bot": "Chistha è una mudìfigga pa unu bot",
        "recentchanges-label-unpatrolled": "Mudìfigga nò ancora contrulladda",
        "rcnotefrom": "Inogghi so erencaddi li mudìfigghi arriggaddi a parthì da '''$2''' (finz'a '''$1''').",
-       "rclistfrom": "Musthra li mudìfigghi arriggaddi à partì da $1",
+       "rclistfrom": "Musthra li mudìfigghi arriggaddi à partì da $3 $2",
        "rcshowhideminor": "$1 li mudìfigghi minori",
        "rcshowhidebots": "$1 li bot",
        "rcshowhideliu": "$1 li utenti registhraddi",
        "listfiles_user": "Utenti",
        "listfiles_size": "Misuri in byte",
        "listfiles_description": "Deschrizioni",
+       "listfiles-latestversion-yes": "Sì",
        "file-anchor-link": "Immàgina",
        "filehist": "Cronologia di lu file",
        "filehist-help": "Fà clic i' un gruppu data/ora pa vidé lu file cumenti era i' lu mamentu indicaddu.",
        "filerevert": "Turra che primma $1",
        "filerevert-legend": "Ricupara file",
        "filerevert-intro": "N'isthai pa ricuparà lu file '''[[Media:$1|$1]]''' a la [versioni $4 di lu $2, $3].",
-       "filerevert-comment": "Oggettu:",
+       "filerevert-comment": "Mutibu:",
        "filerevert-defaultcomment": "Turradda che primma la versioni di lu $1, $2",
        "filerevert-submit": "Turra che primma",
        "filerevert-success": "'''Lu file [[Media:$1|$1]]''' è isthaddu ricuparaddu a la [versioni $4 di lu $2, $3].",
        "brokenredirects-delete": "canzella",
        "withoutinterwiki": "Pàgini chena cullegamenti p'althri linghi",
        "withoutinterwiki-summary": "Li sighenti pàgini so chena cullegamenti a versioni in althri linghi (interwiki):",
+       "withoutinterwiki-legend": "Prefissu",
        "withoutinterwiki-submit": "Musthra",
        "fewestrevisions": "Pàgini cun mancu ribisioni",
        "nbytes": "$1 {{PLURAL:$1|byte|byte}}",
        "ncategories": "$1 {{PLURAL:$1|categuria|categuri}}",
+       "ninterwikis": "$1 {{PLURAL:$1|interwiki}}",
        "nlinks": "$1 {{PLURAL:$1|cullegamentu|cullegamenti}}",
        "nmembers": "$1 {{PLURAL:$1|erementu|erementi}}",
        "nrevisions": "$1 {{PLURAL:$1|ribisioni|ribisioni}}",
        "protectedpages": "Pàgini prutiggiddi",
        "protectedpages-noredirect": "Cuà rinvii",
        "protectedpagesempty": "Abà nò vi so pàgini prutiggiddi.",
+       "protectedpages-page": "Pàgina",
+       "protectedpages-reason": "Mutibu",
+       "protectedpages-unknown-timestamp": "Ischunisciddu",
        "protectedtitles": "Tìturi prutiggiddi",
        "protectedtitlesempty": "Abà nò vi so tìturi prutiggiddi.",
        "listusers": "Erencu di li utenti",
        "watchlist-details": "La listha di l'abbaidaddi ippiziari cunteni {{PLURAL:$1|una pagina (e la rippettiba pagina di dischussioni)|$1 pagini (e li rippettibi pagini di dischussioni)}}.",
        "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'''",
-       "watchmethod-recent": "cuntrollu di li mudìfigghi rizzenti pa l'abbaidaddi ippiziari",
-       "watchmethod-list": "cuntrollu di l'abbaidaddi ippiziari pa mudìfigghi rizzenti",
-       "watchlistcontains": "La listha di l'abbaidaddi ippiziari cunteni {{PLURAL:$1|una pàgina|$1 pàgini}}.",
-       "iteminvalidname": "Probremi cu' la pàgina '$1', innòmmu nò vàriddu...",
        "wlshowlast": "Musthra li ulthimi $1 ori $2 dì $3",
        "watchlist-options": "Opzioni abbaidaddi ippiziari",
        "watching": "Aggiunta a l'abbaidaddi ippiziari...",
        "enotif_lastvisited": "Cunsultha $1 pa vidé tutti li mudìfigghi da l'ulthima visita tóia.",
        "enotif_lastdiff": "Vidé $1 pa visuarizzà la mudìfigga.",
        "enotif_anon_editor": "utenti anònimu $1",
-       "enotif_body": "Gintiri $WATCHINGUSERNAME,\n\n\nLa pàgina $PAGETITLE di {{SITENAME}} è isthadda $CHANGEDORCREATED in data $PAGEEDITDATE da $PAGEEDITOR; la versioni attuari s'acciappa a l'indirizzu $PAGETITLE_URL.\n\n$NEWPAGE\n\nRiassuntu di la mudìfigga, insiriddu da l'autori: $PAGESUMMARY $PAGEMINOREDIT\n\nCuntatta l'autori di la mudìfigga:\nvia postha erettrònica: $PAGEEDITOR_EMAIL\ni' lu situ: $PAGEEDITOR_WIKI\n\nNò sarani inviaddi althri nutìfichi in casu d'althri ciambamenti, arumancu chi tu nò visiti la pàgina. Daboi, è pussìbiri rimpusthà l'abbisu di nutìfica pa tutti li pàgini i' la listha di l'abbaidaddi ippiziari.\n\n             Lu sisthema di nutìfica di {{SITENAME}}\n\n--\nPa mudìfiggà l'impusthazioni di la listha di l'abbaidaddi ippiziari, visita\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPa dì cosa ni pensi e dumandà assisthènzia:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Gintiri $WATCHINGUSERNAME,\n\n\nLa pàgina $PAGETITLE di {{SITENAME}} è isthadda $CHANGEDORCREATED in data $PAGEEDITDATE da $PAGEEDITOR; la versioni attuari s'acciappa a l'indirizzu $PAGETITLE_URL.\n\n$NEWPAGE\n\nRiassuntu di la mudìfigga, insiriddu da l'autori: $PAGESUMMARY $PAGEMINOREDIT\n\nCuntatta l'autori di la mudìfigga:\nvia postha erettrònica: $PAGEEDITOR_EMAIL\ni' lu situ: $PAGEEDITOR_WIKI\n\nNò sarani inviaddi althri nutìfichi in casu d'althri ciambamenti, arumancu chi tu nò visiti la pàgina. Daboi, è pussìbiri rimpusthà l'abbisu di nutìfica pa tutti li pàgini i' la listha di l'abbaidaddi ippiziari.\n\n             Lu sisthema di nutìfica di {{SITENAME}}\n\n--\nPa mudìfiggà l'impusthazioni di la listha di l'abbaidaddi ippiziari, visita\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPa dì cosa ni pensi e dumandà assisthènzia:\n$HELPPAGE",
        "created": "criadda",
        "changed": "ciambadda",
        "deletepage": "Canzella pàgina",
        "protect-level-sysop": "Soru amministhradori",
        "protect-summary-cascade": "ricussiba",
        "protect-expiring": "ischadènzia: $1 (UTC)",
+       "protect-expiry-indefinite": "infiniddu",
        "protect-cascade": "Prutizioni ricussiba (isthendi la prutizioni a tutti li pàgini incrusi in chistha)",
        "protect-cantedit": "Nò è pussìbiri mudìfiggà li libelli di prutizioni pa la pàgina parchí nò si diponi di pimmissi nezzessàri pa mudìfiggà la pàgina.",
        "protect-expiry-options": "2 ori:2 hours,1 dì:1 day,3 dì:3 days,1 chedda:1 week,2 cheddi:2 weeks,1 mesi:1 month,3 mesi:3 months,6 mesi:6 months,1 anni:1 year,infiniddu:infinite",
        "undelete-missing-filearchive": "Impussìbiri ricuparà l'ID $1 di l'archìbiu file parchí nò è prisenti i' la bancadati. Pudia assé isthaddu già ricuparaddu.",
        "undelete-error-short": "Errori i' lu ricùparu di lu file: $1",
        "undelete-error-long": "Si so verifiggaddi di l'errori annullendi la canzilladdura di lu file:\n\n$1",
+       "undelete-show-file-submit": "Sì",
        "namespace": "Tipu di pàgina:",
        "invert": "invirthi la isciubaradda",
        "blanknamespace": "(Prinzipari)",
        "whatlinkshere-hideimages": "$1 liadduri a file",
        "whatlinkshere-filters": "Filthri",
        "blockip": "Brocca utenti",
-       "ipadressorusername": "Indirizzu IP o innòmu utenti:",
+       "ipaddressorusername": "Indirizzu IP o innòmu utenti:",
        "ipbexpiry": "Ischadènzia di lu broccu:",
        "ipbreason": "Mutibu di lu broccu:",
        "ipbcreateaccount": "Impidisci la criazioni d'althri registhrazioni",
        "export-submit": "Ippurtha",
        "export-addcattext": "Aggiungi pàgini da la categuria:",
        "export-addcat": "Aggiungi",
+       "export-addns": "Aggiungì",
        "export-download": "Dumanda lu saivvamentu cumenti file",
        "allmessages": "Imbasciaddi di sisthema",
        "allmessagesname": "Nommu",
        "tooltip-rollback": "\"Turra che primma\" annulla li mudìfigghi a chistha pagina di l'ulthimu cuntributori cu' un soru clic.",
        "tooltip-undo": "\"Annulla\"  pilmitti d'annullà chistha mudifigga e abbri lu modulu di mudifigga d'antiprimma. Pilmitti d'insirì una mutibazioni i' l'oggettu di la mudifigga.",
        "tooltip-summary": "Ischribbi un riassuntu corthu",
-       "notacceptable": "Lu server wiki nò è bonu a frunì li dati i' un fuimmaddu liggìbiri da lu nabiggadori utirizaddu.",
        "anonymous": "{{PLURAL:$1|Utenti anonimu|utenti anonimi}} di {{SITENAME}}",
        "siteuser": "$1, utenti di {{SITENAME}}",
        "lastmodifiedatby": "Chistha pàgina è isthadda mudìfiggadda pa l'ulthima voltha lu $2, $1 da $3.",
        "spambot_username": "MediaWiki buggadda spam",
        "spam_reverting": "Turradda a l'ulthima versioni chena cullegamenti a $1",
        "spam_blanking": "Pàgina ibbiuddadda, tutti li ribisioni abìani cullegamenti a $1",
+       "pageinfo-contentpage-yes": "Sì",
+       "pageinfo-protect-cascading-yes": "Sì",
        "markaspatrolleddiff": "Signa la mudìffiga cumenti verifiggadda",
        "markaspatrolledtext": "Signa chistha pàgina cumenti verifiggadda",
        "markedaspatrolled": "Signaddu cumenti verifiggaddu",
        "show-big-image": "File d'orìgini",
        "newimages": "Galleria di li file nobi",
        "imagelisttext": "Inogghi una listha di '''$1''' {{PLURAL:$1|file|file}} ordhinaddi pa $2.",
-       "showhidebots": "($1 li bot)",
        "noimages": "Nò v'è nudda da vidé.",
        "ilsubmit": "Zercha",
        "bydate": "data",
        "exif-flash": "Caratterìsthiga e cundizioni di lu lampu",
        "exif-flashenergy": "Putènzia di lu lampu",
        "exif-contrast": "Cuntrollu cuntrasthu",
+       "exif-languagecode": "Linga",
+       "exif-iimcategory": "Categuria",
        "exif-orientation-1": "Noimmari",
        "exif-componentsconfiguration-0": "assenti",
        "exif-subjectdistance-value": "$1 metri",
        "recreate": "Ricrea",
        "confirm_purge_button": "Cunfèimma",
        "confirm-purge-top": "Vói pulì la mimória cache di chistha pàgina?",
+       "quotation-marks": "«$1»",
        "imgmultipageprev": "← pàgina prizzidenti",
        "imgmultipagenext": "pàgina sighenti →",
        "imgmultigo": "Vai",
        "autosumm-replace": "Pàgina susthituidda cun '$1'",
        "autoredircomment": "Rinviu à la pàgina [[$1]]",
        "autosumm-new": "Criadda pàgina cun '$1'",
-       "livepreview-loading": "Carrigghendi…",
-       "livepreview-ready": "Carrigghendi… Prontu!",
-       "livepreview-failed": "Errori i' la funzioni Live preview. Usà l'antiprimma standard.",
-       "livepreview-error": "Impussìbiri effettuà lu cullegamentu: $1 \"$2\". Usà l'antiprimma standard.",
        "lag-warn-normal": "Li mudìfigghi arriggaddi {{PLURAL:$1|i' l'ulthimu sigundu|i' l'ulthimi $1 sigundi}} pudiani nò apparì in chistha listha.",
        "lag-warn-high": "Pa un ritardhu mannu di l'elaburaddori sivvidori di la bancadati, li mudìfigghi arriggaddi i' l'ulthimi $1 sigundi pudiani nò apparì in chistha listha.",
-       "watchlistedit-numitems": "La listha di l'abbaidaddi ippiziari cunteni {{PLURAL:$1|una pàgina (e la rippettiba pàgina di dischussioni)|$1 pàgini (e li rippettibi pàgini di dischussioni)}}.",
-       "watchlistedit-noitems": "La listha di l'abbaidaddi ippiziari è biodda.",
        "watchlistedit-normal-title": "Mudìfigga abbaidaddi ippiziari",
        "watchlistedit-normal-legend": "Eliminiazioni di pàgini da l'abbaidaddi ippiziari",
        "watchlistedit-normal-explain": "Inogghi so erencaddi tutti li pàgini abbaidaddi. Pà canzellà una o più pàgini di la listha, isciubarà li caselli reratibi e fà clic i' lu buttoni '''Elimina pàgini''' in giossu a l'erencu. Pói puru [[Special:EditWatchlist/raw|mudìfiggalla in fuimmaddu testhu]].",
        "specialpages": "Pagini ippiziari",
        "specialpages-group-login": "Intra / registhrazioni",
        "tag-filter": "[[Special:Tags|Tag]] filthru:",
+       "tags-active-yes": "Sì",
        "tags-edit": "mudifigga",
        "htmlform-submit": "Invia",
        "htmlform-reset": "Annulla mudifigghi",
        "htmlform-selectorother-other": "Althru",
+       "htmlform-yes": "Sì",
        "rightsnone": "(nisciunu)"
 }
index 0987b6d..fca4c06 100644 (file)
@@ -10,7 +10,8 @@
                        "Teak",
                        "The Evil IP address",
                        "Trondtr",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Liŋkkaid vuolláisárgun",
@@ -21,7 +22,6 @@
        "tog-showtoolbar": "Čájet rievdadangaskaomiid",
        "tog-editondblclick": "Rievdat siidduid duppaldeaddilemiin (JavaScript)",
        "tog-editsectiononrightclick": "Rievdat osiid nu ahte deaddilat bajilčállaga sáhpána olgeš boaluin (JavaScript)",
-       "tog-rememberpassword": "Muite mu dieđuid dán dihtoris (for a maximum of $1 {{PLURAL:$1|day|days}})",
        "tog-watchcreations": "Lasit siidduid maid lean álggahan mu čuovvunlistui",
        "tog-watchdefault": "Lasit čuovvunlistui siidduid maid lean ođasmahttán",
        "tog-watchmoves": "Lasit čuovvunlistui siidduid maid lean sirdán",
        "filedeleteerror": "Fiilla <b>$1</b> sihkkun ii lihkosmuvvan.",
        "directorycreateerror": "Logahallama ”$1” ráhkadeapmi ii lihkosmuvvan.",
        "filenotfound": "Fiila <b>$1</b> ii dihtton.",
-       "fileexistserror": "Fiilii ”$1” čállin ii lihkosmuvvan: fiila lea anus.",
        "formerror": "Skovi dieđut eai dohkke.",
        "badarticleerror": "Doaimma ii leat vejolaš dahkat dán siiddus.",
        "cannotdelete": "Siiddu dahje fiilla sihkkon ii lihkosmuvvan. Muhtun eará lea sáhttán sihkkut dan.",
        "savearticle": "Vurke siiddu",
        "preview": "Siiddu ovdalgihtiigeahččan",
        "showpreview": "Geahča ovdalgiihtii",
-       "showlivepreview": "Ovdalgeahčastan",
        "showdiff": "Čájet rievdadusaid",
        "anoneditwarning": "'''Váruhus:''' It leat loggen sisa. Du IP-čujuhus báhcá dán siiddu rievdadushistorjái.",
        "missingsummary": "It leat čállán čoahkkáigeasu. Jus válljet Vurke ođđasit, de rievdadusat maid ráhkadit vurkejuvvo čoahkkáigeasuhaga.",
        "showingresults": "{{PLURAL:$1|'''Okta''' boađus|'''$1''' bohtosa}} bohtosa'''$2''' rájes.",
        "showingresultsnum": "Vuolábealde {{PLURAL:$3|lea '''okta''' ohcanboađus|leat '''$3''' ohcanbohtosa}} '''$2.''' bohtosa rájes.",
        "powersearch-ns": "Oza nammagomuvuođain:",
-       "powersearch-redir": "Listu ođđasitstivremiin",
        "powersearch-togglelabel": "Rievdat válljema:",
        "powersearch-toggleall": "Buot",
        "powersearch-togglenone": "Ii mihkkege",
        "recentchanges-summary": "Dán siiddus sáhtát čuovvut varas rievdadusaid {{SITENAME}}s.",
        "recentchanges-feed-description": "Dán siiddus sáhtat čuovvut varas {{GRAMMAR:illative|{{SITENAME}}}} rievdadusaid.",
        "rcnotefrom": "Vuolábealde leat rievdadusat '''$2''' rájes. Eanemusta '''$1''' mearkkastaga čájehuvvo.",
-       "rclistfrom": "Čájet ođđa rievdadusat $1 rájes",
+       "rclistfrom": "Čájet ođđa rievdadusat $3 $2 rájes",
        "rcshowhideminor": "$1 unna rievdádusat",
        "rcshowhidebots": "$1 bohtat",
        "rcshowhideliu": "$1 čálligoahtán geavaheaddjit",
        "watchlist-details": "Du čuovvunlisttus {{PLURAL:$1|lea $1 siidu|leat $1 siiddu}}. Lohkui eai leat váldojuvvon ságastallansiidduid.",
        "wlheader-enotif": "E-poastaalmmuhusat leat anus.",
        "wlheader-showupdated": "Siiddut, mat leat rievdaduvvon du maŋimus geavahangearddi maŋŋá leat merkojuvvon '''buoiddes teavsttain'''",
-       "watchmethod-recent": "dárkistuvvo varas rievdadusat čuovvunlisttu siidduide",
-       "watchmethod-list": "dárkistuvvo čuovvunlisttu siidduid varas rievdadusat",
-       "watchlistcontains": "Du čuovvunlisttus {{PLURAL:$1|lea okta siidu|leat $1 siiddu}}.",
-       "iteminvalidname": "Siidduin $1 ledje váttisvuođat! Siiddu namas lea feaila.",
        "wlshowlast": "Čájet maŋimus $1 diimmu dahje $2 beaivvi $3",
        "watching": "Lasihuvvo čuovvunlistui...",
        "unwatching": "Sihkojuvvo čuovvunlisttus...",
        "size-kilobytes": "$1 KiB",
        "size-megabytes": "$1 MiB",
        "size-gigabytes": "$1 GiB",
-       "watchlistedit-noitems": "Du čuovvunlistu lea guoros",
        "watchlistedit-normal-title": "Čuovvunlisttu ođasmahttin",
        "watchlistedit-raw-titles": "Siiddut",
        "watchlistedit-raw-submit": "Beaivit čuovvunlisttu",
index 6e34c69..7d92e0c 100644 (file)
@@ -5,7 +5,8 @@
                        "Kaganer",
                        "SeriCtam",
                        "Teak",
-                       "Urhixidur"
+                       "Urhixidur",
+                       "아라"
                ]
        },
        "tog-underline": "Squóráam linkám:",
@@ -16,7 +17,6 @@
        "tog-showtoolbar": "Cohuatlöx ticpatlöx toolbar (JavaScript)",
        "tog-editondblclick": "Ticpatlöx páhinám 2 clickám mii (JavaScript)",
        "tog-editsectiononrightclick": "Ton ticpatlöx seccion pok clickám mii<br /> seccion titelám iti (JavaScript)",
-       "tog-rememberpassword": "Qualtiinii he quimx canj jan ordinator iti (for a maximum of $1 {{PLURAL:$1|day|days}})",
        "tog-watchcreations": "Plusöx páhinám he hun he listade cáminot",
        "tog-watchdefault": "Plusöx páhinám he ticpatlöx he listade cáminot",
        "tog-watchmoves": "Plusöx páhinám he yacom he listade cáminot",
        "filedeleteerror": "Nedelatomöx ciúchan \"$1\".",
        "directorycreateerror": "Necreatöx directoran \"$1\".",
        "filenotfound": "Neyahöx ciúchan \"$1\".",
-       "fileexistserror": "Necoccebj caitomde ciúchan \"$1\": ciúchan coccebj",
        "unexpected": "Value neqance: \"$1\"=\"$2\".",
        "formerror": "Römj: nesubmit listade fillöx",
        "badarticleerror": "Jan accion neperformon jan páhina iti.",
        "savearticle": "Xuniim páhina",
        "preview": "Cuáxiit",
        "showpreview": "Cohuatlöx cuáxiit",
-       "showlivepreview": "Live cuáxiit",
        "showdiff": "Cohuatlöx quiix",
        "anoneditwarning": "'''Attencion:''' Me necaápo. Menadressade IP coccebj recordöx históriade jan páhina iti.",
        "missingsummary": "'''Attencion:''' Me necoccebj providöx abvuatlde ticpatlöx zo. Clicköx 'Xuniim páhina' xuniim meticpatlöx sans abvuatlde ticpatlöx.",
        "recentchanges-summary": "Caitom camjöx cmaa quiíx zode Wiki zo jan páhina iti.",
        "recentchanges-feed-description": "Caitom camjöx cmaa quiíx zode Wiki zo jan fiiyt iti.",
        "rcnotefrom": "!-cmaa coccebj quiíx zode '''$2''' (plusöxiti '''$1''' visi).",
-       "rclistfrom": "Cohuatlöx hunquiix startom $1 'de",
+       "rclistfrom": "Cohuatlöx hunquiix startom $3 $2 'de",
        "rcshowhideminor": "$1 editám bajlöxám",
        "rcshowhidebots": "$1 cibotám",
        "rcshowhideliu": "$1 caitom caápo",
index ab96568..389e4dd 100644 (file)
@@ -5,7 +5,8 @@
                        "Kaganer",
                        "Reedy",
                        "Zordsdavini",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Pabrauktė nūruodas:",
@@ -16,7 +17,6 @@
        "tog-showtoolbar": "Ruodītė redagavėma rakondinė (JavaScript)",
        "tog-editondblclick": "Poslapiu redagavėms dvėgobu paspaudėmu (JavaScript)",
        "tog-editsectiononrightclick": "Ijongtė skėrsneliu redagavėma paspaudos skėrsnelė pavadėnėma<br />dešėniouju pelies klavėšu (JavaScript)",
-       "tog-rememberpassword": "Atmintė prėsėjongėma infuormacėjė šėtom kuompioterī (daugiausē $1 {{PLURAL:$1|dėina|dėinuom}})",
        "tog-watchcreations": "Pridietė poslapius, katrūs sokorio, i keravuojamu sāraša",
        "tog-watchdefault": "Pridietė poslapius, katrūs taisau, i keravuojamu sāraša",
        "tog-watchmoves": "Pridietė poslapius, katrūs parkelio, i keravuojamu sāraša",
        "filecopyerror": "Nepavīkst kopėjoutė faila ėš „$1“ i „$2“.",
        "filerenameerror": "Nepavīkst parvardėntė faila ėš „$1“ i „$2“.",
        "filenotfound": "Nepavīkst rastė faila „$1“.",
-       "fileexistserror": "Nepavīkst irašītė i faila „$1“: tas fails jau īr",
        "unexpected": "Natėkieta raikšmie: „$1“=„$2“.",
        "cannotdelete": "Nepavīka ėštrintė nuruodīta poslapė a faila \"$1\". (Mažo kažkas padarė pėrmesnis šėta)",
        "badtitle": "Bluogs pavadėnėms",
        "protectedpagetext": "Šėts poslapis īr ožrakints, saugont anū nū redagavėma.",
        "viewsourcetext": "Tomsta galėt veizietė ėr kopėjoutė poslapė kuoda:",
        "protectedinterface": "Šėtom poslapi īr pruogramėnės ironguos sasajuos teksts katros īr apsauguots, kū neprietelē anū nasogadėntu.",
-       "editinginterface": "'''Diemesė:''' Tamsta keitat poslapi, katros īr nauduojams programėnės irongas sōsajės tekstė. Pakeitėmā tamė poslapū tēpuogi pakeis nauduotuojė sōsajės ėšruoda ė kėtėims nauduotujams. Jēgo nuorėt pargoldītė, siūluom pasėnauduotė [//translatewiki.net/wiki/Main_Page?setlang=bat-smg „translatewiki.net“], „MediaWiki“ lokalėzacėjės pruojėktu.",
+       "editinginterface": "<strong>Diemesė:</strong> Tamsta keitat poslapi, katros īr nauduojams programėnės irongas sōsajės tekstė. Pakeitėmā tamė poslapū tēpuogi pakeis nauduotuojė sōsajės ėšruoda ė kėtėims nauduotujams. Jēgo nuorėt pargoldītė, siūluom pasėnauduotė [//translatewiki.net „translatewiki.net“], „MediaWiki“ lokalėzacėjės pruojėktu.",
        "namespaceprotected": "Tamsta netorėt teisiu keistė poslapiu '''$1''' srėtī.",
        "ns-specialprotected": "Specēlė̅ jė poslapē negal būtė keitamė.",
        "logouttext": "'''Daba Tamsta esat atsėjongės.'''\n\nGalat ė tuoliau nauduotė {{SITENAME}} anuonimėškā aba <span class='plainlinks'>[$1 prisėjonkat]</span> ėš naujė šėtuo patiu a kėto nauduotuojė vardu.\nPastebiejims: katruos nekatruos poslapiuos ė tuoliau gal ruodītė būktā būtomiet prisėjongės lėgė tuol, kumet ėšvalīsėt sava naršīklės dietovė (''cache'').",
        "savearticle": "Ėšsauguotė poslapė",
        "preview": "Parveiza",
        "showpreview": "Ruodītė parveiza",
-       "showlivepreview": "Tėisiuogėnė parvaiza",
        "showdiff": "Ruodītė skėrtomus",
        "anoneditwarning": "'''Diemesė:''' Tomsta nesat prisėjungės. Jūsa IP adresos būs irašīts i šiuo poslapė istuorėjė.",
        "missingsummary": "'''Priminėms:''' Tamsta nenuruodiet pakeitėma kuomentara. Jēgo viel paspausėt ''Ėšsauguotė'', Tamstas pakeitėms bus ėšsauguots ba anuo.",
        "recreate-moveddeleted-warn": "'''Parspiejėms: Tamsta ikeliat faila, katros onkstiau bova ėštrėnts.'''\n\nTamsta torietomiet nusprēstė, a īr naudėnga tuoliau ikeldinietė ta faila.\nTuo faila pašalinėma istuorėjė īr pateikta dielē patuogoma:",
        "moveddeleted-notice": "Tas poslapis bova ėštrėnts.\nĖštrėnta poslapė versėju sārašos īr pateikts paveiziejėmō žemiau.",
        "edit-conflict": "Redagavėma kuonflėktos",
-       "postedit-confirmation": "Tamstas padėrbts pakeitėms ėšsauguots īr.",
+       "postedit-confirmation-saved": "Tamstas padėrbts pakeitėms ėšsauguots īr.",
        "post-expand-template-inclusion-warning": "Perspiejėms: Šabluonu īterpėma dėdoms īr par dėdelis.\nKāp katrėi šabluonā nebus ītrauktė.",
        "post-expand-template-inclusion-category": "Poslapē, kur šabluonu īterpėma dėdoms viršėjams",
        "post-expand-template-argument-warning": "Perspiejėms: Tas poslapis tor nuors vėina šabluona argomenta, katros tor per dėdli ėšplietėma dėdoma.\nTė argomentā bova praleistė.",
        "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ė:",
-       "powersearch-redir": "Itrauktė paradresavėmus",
        "powersearch-togglelabel": "Pažīmietė:",
        "powersearch-toggleall": "Vėskon",
        "powersearch-togglenone": "Nieka",
        "prefs-files": "Failā",
        "youremail": "El. pašts:",
        "username": "Nauduotuojė vards:",
-       "uid": "Nauduotuojė ID:",
        "prefs-memberingroups": "{{PLURAL:$1|Gropės|Gropiu}} narīs:",
        "prefs-registration": "Ožsėregėstravėma čiesos:",
        "yourrealname": "Tėkros vards:",
        "recentchanges-label-unpatrolled": "Tas keitėms da nebova patikrints",
        "recentchanges-label-plusminus": "Ton baitu skaitliom pakeists straipsnė apmiers",
        "rcnotefrom": "Žemiau īr pakeitėma pradedant nū <b>$2</b> (ruodom lėgė <b>$1</b> pakeitėmu).",
-       "rclistfrom": "Ruodītė naujus pakeitėmus pradedant nū $1",
+       "rclistfrom": "Ruodītė naujus pakeitėmus pradedant nū $3 $2",
        "rcshowhideminor": "$1 mažus pakeitėmus",
        "rcshowhidebots": "$1 robuotus",
        "rcshowhideliu": "$1 prėsėjongusiūm nauduotuojūm pakeitėmus",
        "log-title-wildcard": "Ėiškuotė pavadinėmu, katrė prasėded šėtuo teksto",
        "showhideselectedlogentries": "Ruodītė/kavuotė sāraša ponktus, katrūs pasėrėnkot",
        "allpages": "Vėsė straipsnē",
-       "alphaindexline": "Nu $1 lėg $2",
        "nextpage": "Kėts poslapis ($1)",
        "prevpage": "Unkstesnis poslapis ($1)",
        "allpagesfrom": "Ruodītė poslapius pradedont nu:",
        "watchlist-details": "Keravuojama $1 {{PLURAL:$1|poslapis|$1 poslapē|$1 poslapiu}} neskaitlioujant aptarėmu poslapiu.",
        "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ā'''",
-       "watchmethod-recent": "tėkrėnamė vielībė̅jė pakeitėmā keravuojamiems poslapiams",
-       "watchmethod-list": "Ėiškuoma vielībūju pakeitėmu keravuojamūs poslapiūs",
-       "watchlistcontains": "Tamstas kervuojamu sārašė īr $1 {{PLURAL:$1|poslapis|poslapē|poslapiu}}.",
        "wlshowlast": "Ruodītė paskotėniu $1 adīnu, $2 dėinū a $3 pakeitėmus",
        "watchlist-options": "Keravuojamu sāroša pasėrinkėmā",
        "watching": "Itraukiama i keravuojamu sāraša...",
        "blockip": "Ožblokoutė nauduotuoja",
        "blockip-legend": "Blokoutė nauduotuoja",
        "blockiptext": "Nauduokėt šėta fuorma noriedamė oždraustė redagavėma teises nuruodīto IP adreso a nauduotuojo. Tas torietu būt atlėikama tam, kū sostabdītomiet vandalėzma, ė vagol [[{{ns:project}}:Puolitėka|puolitėka]].\nŽemiau nuruodīkėt tėkslē prižastė.",
-       "ipadressorusername": "IP adresos a nauduotuojė vards",
+       "ipaddressorusername": "IP adresos a nauduotuojė vards",
        "ipbexpiry": "Galiuojėma čiesos",
        "ipbreason": "Prīžastis:",
        "ipbreason-dropdown": "*Dažniausės bluokavėma prižastīs\n** Melagėngas infuormacėjės rašīms\n** Torėnė trīnims ėš poslapiu\n** Spaminims\n** Zaunu/bikuo rašīms i poslapios\n** Gondinėmā/Pėktžuodiavėmā\n** Pėktnaudžiavėms paskėruomis\n** Netėnkams nauduotuojė vards",
        "newimages": "Naujausiu abruozdieliu galerėjė",
        "imagelisttext": "Žemiau īr '''$1''' failu sārašos, sorūšiouts $2.",
        "newimages-label": "Faila vards (ar anuo dalis):",
-       "showhidebots": "($1 robotos)",
        "ilsubmit": "Ėiškoutė",
        "bydate": "palē data",
        "sp-newimages-showfrom": "Ruodītė naujus abruozdielius pradedant nū $2, $1",
        "autosumm-replace": "Poslapis keitams so '$1'",
        "autoredircomment": "Nukreipama i [[$1]]",
        "autosumm-new": "Naus poslapis: $1",
-       "livepreview-loading": "Kraunama īr…",
-       "livepreview-ready": "Ikeliama… Padarīta!",
        "lag-warn-normal": "Pakeitėmā, naujesnė kāp $1 {{PLURAL:$1|sekondė|sekondės|sekondiu}}, tamė sārašė gal būtė neruodomė.",
        "lag-warn-high": "Dielē dėdlė doumenū bazės pasėlikėma pakeitėmā, naujesnė nēgo $1 {{PLURAL:$1|sekondė|sekondės|sekondiu}}, tamė sarašė gal būtė neruodomė.",
-       "watchlistedit-numitems": "Tamstas keravuojamu sārašė īr $1 poslapiu neskaitliuojant aptarėmu poslapiu.",
-       "watchlistedit-noitems": "Tamstas keravuojamu sārašė nė juokiū poslapiu.",
        "watchlistedit-normal-title": "Keistė keravuojamu sāroša",
        "watchlistedit-normal-legend": "Šalėntė poslapios ėš keravuojamu sāraša",
        "watchlistedit-normal-explain": "Žemiau īr ruodomė poslapē Tamstas keravuojamu sārašė.\nNuoriedamė pašalėntė poslapi, pri anuo oždiekėt varnale ė paspauskėt „Šalėntė poslapios“.\nTamsta tēpuogi galėt [[Special:EditWatchlist/raw|redagoutė grīnaji keravuojamu sāraša]].",
index 43abbc2..118f7cf 100644 (file)
@@ -5,7 +5,8 @@
                        "Kolega2357",
                        "Nemo bis",
                        "OC Ripper",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Podvuci linkove:",
@@ -32,7 +33,7 @@
        "tog-shownumberswatching": "Prikaži broj korisnika koji prate",
        "tog-oldsig": "Postojeći potpis:",
        "tog-fancysig": "Smatraj potpis kao wikitekst (bez automatskog linka)",
-       "tog-uselivepreview": "Koristite pretpregled uživo (potreban JavaScript) (eksperimentalno)",
+       "tog-uselivepreview": "Koristi pretpregled uživo (eksperimentalno)",
        "tog-forceeditsummary": "Opomeni me pri unosu praznog sažetka",
        "tog-watchlisthideown": "Sakrij moje izmjene sa spiska praćenih članaka",
        "tog-watchlisthidebots": "Sakrij izmjene botova sa spiska praćenih članaka",
@@ -45,6 +46,7 @@
        "tog-showhiddencats": "Prikaži skrivene kategorije",
        "tog-norollbackdiff": "Nakon povrata zanemari prikaz razlika",
        "tog-useeditwarning": "Upozori me kad napuštam stranicu za uređivanje bez snimanja izmjena",
+       "tog-prefershttps": "Uvijek koristi sigurnu vezu kod prijave",
        "underline-always": "Uvijek",
        "underline-never": "Nikad",
        "underline-default": "prema skinu ili postavkama preglednika",
        "newwindow": "(otvara se u novom prozoru)",
        "cancel": "Odustani - Одустани",
        "moredotdotdot": "Još...",
-       "morenotlisted": "Više nije prikazano...",
+       "morenotlisted": "Ovaj spisak nije kompletan.",
        "mypage": "Moja stranica",
        "mytalk": "Moj razgovor / Мој разговор",
        "anontalk": "Razgovor za ovu IP adresu",
        "permalink": "Trajni link",
        "print": "Štampa",
        "view": "Vidi",
+       "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": "Stvori ovu stranicu",
        "delete": "Obrisati - Обрисати",
        "jumptonavigation": "navigacija",
        "jumptosearch": "pretraga",
        "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": "Ž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.",
        "pool-timeout": "Zaustavi čekanje za zaključavanje",
        "pool-queuefull": "Red na pool je prenapunjen",
        "pool-errorunknown": "nepoznata greška",
        "versionrequiredtext": "Potrebna je verzija $1 MediaWikija da bi se koristila ova stranica. Pogledaj [[Special:Version|verziju]].",
        "ok": "da",
        "retrievedfrom": "Dobavljeno iz \"$1\"",
-       "youhavenewmessages": "Imate / Имате $1 ($2).",
+       "youhavenewmessages": "Imate $1 ($2).",
        "youhavenewmessagesfromusers": "Imate $1 od {{PLURAL:$3|drugog korisnika|$3 korisnika|$3 korisnika}} ($2).",
        "youhavenewmessagesmanyusers": "Imate $1 od mnogo korisnika ($2).",
-       "newmessageslinkplural": "{{PLURAL:$1|novu poruku|$1 nove poruke|$1 novih poruka}}",
-       "newmessagesdifflinkplural": "{{PLURAL:$1|posljednje uređivanje|$ posljednja uređivanja|$ posljednjih uređivanja}}",
+       "newmessageslinkplural": "{{PLURAL:$1|novu poruku|999=nove poruke}}",
+       "newmessagesdifflinkplural": "{{PLURAL:$1|posljednju izmenu|999=posljednje izmjene}}",
        "youhavenewmessagesmulti": "Imate nove poruke na $1",
        "editsection": "uredi",
        "editold": "uredi",
        "nospecialpagetext": "<strong>Zatražili ste nevaljanu posebnu stranicu.</strong>\n\nLista valjanih posebnih stranica se može naći na [[Special:SpecialPages|{{int:specialpages}}]].",
        "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 \nsoftverska pogreš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 ne mora sadržavati posljednja ažuriranja.",
        "readonly": "Baza podataka je zaključana",
        "enterlockreason": "Unesite razlog za zaključavanje, uključujući procjenu vremena otključavanja",
        "readonly_lag": "Baza podataka je zaključana dok se sekundarne baze podataka na serveru ne sastave sa glavnom.",
        "internalerror": "Interna pogreška",
        "internalerror_info": "Interna greška: $1",
-       "fileappenderrorread": "Nije se mogao pročitati \"$1\" tokom dodavanja.",
-       "fileappenderror": "Ne može se primijeniti \"$1\" na \"$2\".",
        "filecopyerror": "Ne može se kopirati \"$1\" na \"$2\".",
        "filerenameerror": "Ne može se promjeniti ime datoteke \"$1\" u \"$2\".",
        "filedeleteerror": "Ne može se izbrisati datoteka \"$1\".",
        "directorycreateerror": "Nije moguće napraviti direktorijum \"$1\".",
        "filenotfound": "Ne može se naći datoteka \"$1\".",
-       "fileexistserror": "Nemoguće je stvoriti datoteku \"$1\": datoteka već postoji",
        "unexpected": "Neočekivana vrijednost: \"$1\"=\"$2\".",
        "formerror": "Greška: ne može se poslati formular",
        "badarticleerror": "Ova akcija ne može biti izvršena na ovoj stranici.",
        "cannotdelete": "Ne može se obrisati stranica ili datoteka \"$1\".\nMoguće je da ju je neko drugi već obrisao.",
        "cannotdelete-title": "Brisanje stranice \"$1\" nije moguće",
        "delete-hook-aborted": "Brisanje prekinuto softverskim priključkom (hook).\nNema obrazloženja ili poruke o grešci.",
+       "no-null-revision": "Nije se mogla stvoriti nova ništavna revizija za stranicu \"$1\"",
        "badtitle": "Loš naslov",
        "badtitletext": "Zatražena stranica je bila nevaljana, prazna ili neispravno povezana s među-jezičkim ili inter-wiki naslovom.\nMože sadržavati jedno ili više slova koja se ne mogu koristiti u naslovima.",
        "perfcached": "Sledeći podaci su keširani i mogu biti zastareli. Keš sadrži najviše {{PLURAL:$1|jedan rezultat|$1 rezultata|$1 rezultata}}.",
        "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": "Ova stranica ili aktivnost zahtijeva da budete prijavljeni na ovom wikiju.",
+       "exception-nologin-text": "Molimo [[Special:Userlogin|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:",
-       "logouttext": "'''Sad ste odjavljeni.'''\n\nMožete nastaviti da koristite {{SITENAME}} anonimno, ili se ponovo <span class='plainlinks'>[$1 prijaviti]</span> kao isti ili kao drugi korisnik.\nObratite pažnju da neke stranice mogu nastaviti da se prikazuju kao da ste još uvijek prijavljeni, dok ne očistite keš svog preglednika.",
+       "logouttext": "'''Sad ste odjavljeni.'''\n\nObratite pažnju da neke stranice mogu nastaviti da se prikazuju kao da ste još uvijek prijavljeni, dok ne očistite keš svog preglednika.",
        "welcomeuser": "Dobro došli, $1!",
        "welcomecreation-msg": "Vaš korisnički račun je napravljen.\nNe zaboravite izmijeniti vlastite [[Special:Preferences|{{SITENAME}} postavke]].",
        "yourname": "Vaše korisničko ime / Ваше корисничко име",
        "gotaccount": "Imate račun? '''$1'''.",
        "gotaccountlink": "Prijavite se / Пријавите се",
        "userlogin-resetlink": "Zaboravili ste detalje vaše prijave?",
-       "userlogin-resetpassword-link": "Resetirajte svoju lozinku/zaporku",
-       "createacct-join": "Unesite svoje informacije ispod",
-       "createacct-another-join": "Dolje unesite informacije o novom računu.",
+       "userlogin-resetpassword-link": "Zaboravili ste lozinku/zaporku?",
+       "userlogin-helplink2": "Pomoć pri prijavljivanju",
+       "userlogin-loggedin": "Već ste prijavljeni kao {{GENDER:$1|$1}}.\nKoristite donji obrazac da biste se prijavili kao drugi korisnik.",
+       "userlogin-createanother": "Stvori još jedan račun",
        "createacct-emailrequired": "E-mail adresa",
        "createacct-emailoptional": "E-mail adresa (opcionalno)",
        "createacct-email-ph": "Unesite svoju E-mail adresu",
        "createacct-another-email-ph": "Postavite E-mail adresu",
-       "createaccountmail": "Koristite privremenu slučajno stvorenu lozinku i pošaljite na dolje specificiranu e-mail adresu",
+       "createaccountmail": "Koristite privremenu, slučajno stvorenu šifru/lozinku i pošaljite na navedenu adrеsu e-pošte",
        "createacct-realname": "Stvarno ime (opcionalno)",
        "createaccountreason": "Razlog:",
        "createacct-reason": "Razlog",
        "passwordtooshort": "Lozinka mora imati najmanje {{PLURAL:$1|1 znak|$1 znakova}}.",
        "password-name-match": "Vaša lozinka mora biti različita od Vašeg korisničkog imena.",
        "password-login-forbidden": "Korištenje ovog korisničkog imena i lozinke je zabranjeo.",
-       "mailmypassword": "Pošalji mi novu lozinku putem E-maila",
+       "mailmypassword": "Resetiraj lozinku/zaporku",
        "passwordremindertitle": "Nova privremena lozinka za {{SITENAME}}",
        "passwordremindertext": "Neko (vjerovatno Vi, sa IP adrese $1) je zahtjevao da vam pošaljemo novu šifru za {{SITENAME}}  ($4). Privremena šifra za korisnika \"$2\" je napravljena i glasi \"$3\". Ako ste to željeli, sad treba da se prijavite i promjenite šifru.\nVaša privremena šifra će isteči za {{PLURAL:$5|$5 dan|$5 dana}}.\n\nAko je neko drugi napravio ovaj zahtjev ili ako ste se sjetili vaše šifre i ne želite više da je promjenite, možete da ignorišete ovu poruku i da nastavite koristeći vašu staru šifru.",
        "noemail": "Ne postoji adresa e-maila za korisnika \"$1\".",
        "noemailcreate": "Morate da navedete valjanu e-mail adresu",
        "passwordsent": "Nova šifra je poslata na e-mail adresu 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 poslan je e-mail s potvrdom.\nPrije nego što pošaljemo daljnje poruke, molimo vas da otvorite e-mail i slijedite u njemu sadržana uputstva da potvrdite da ste upravo vi kreirali korisnički račun.",
+       "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}}.",
        "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 e-mail adresa je autentificirana na $2 u $3.",
-       "emailnotauthenticated": "Vaša e-mail adresa još nije autentificirana.\nNijedan e-mail neće biti poslan za bilo koju uslugu od slijedećih.",
+       "emailauthenticated": "Vaša adresa e-pošte potvrđena je $2 u $3.",
+       "emailnotauthenticated": "Vaša adresa e-pošte još nije potvrđena.\nNijedna e-poruka neće biti poslana za bilo koju uslugu od sljedećih.",
        "noemailprefs": "Unesite e-mail adresu za osposobljavanje slijedećih usluga.",
        "emailconfirmlink": "Potvrdite Vašu e-mail adresu",
        "invalidemailaddress": "Ova e-mail adresa ne može biti prihvaćena jer je u neodgovarajućem obliku.\nMolimo vas da unesete ispravnu adresu ili ostavite prazno polje.",
        "cannotchangeemail": "Na ovom wikiju ne možete promeniti e-mail adresu računa.",
        "emaildisabled": "Ova web-stranica ne može da šalje e-poruke.",
        "accountcreated": "Korisnički nalog kreiran / Кориснички налог креиран",
-       "accountcreatedtext": "Korisnički račun za $1 je kreiran. Кориснички налог за $1 је креиран.",
+       "accountcreatedtext": "Korisnički račun za [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|razgovor]]) je napravljen.",
        "createaccount-title": "Pravljenje korisničkog računa za {{SITENAME}}",
        "createaccount-text": "Neko je napravio korisnički račun za vašu e-mail adresu na {{SITENAME}} ($4) sa imenom \"$2\", i sa šifrom \"$3\".\nTrebali biste se prijaviti i promjeniti šifru.\n\nMožete ignorisati ovu poruku, ako je korisnički račun napravljen greškom.",
-       "login-throttled": "Previše puta ste se pokušali prijaviti.\nMolimo Vas da sačekate prije nego što pokušate ponovo.",
+       "login-throttled": "Previše puta ste se pokušali prijaviti.\nMolimo Vas da sačekate $1 prije nego što pokušate ponovo.",
        "login-abort-generic": "Vaša prijava nije bila uspješna – Prekinuto",
        "loginlanguagelabel": "Jezik: $1",
        "suspicious-userlogout": "Vaš zahtjev za odjavu je odbijen jer je poslan preko pokvarenog preglednika ili keširanog proksija.",
+       "createacct-another-realname-tip": "Pravo ime nije obavezno.\nAko izaberete da date ime, biće korišteno za pripisivanje za vaš rad.",
        "pt-login": "Prijavi me / Пријави ме",
        "pt-login-button": "Prijavi me / Пријави ме",
        "pt-createaccount": "Napraviti novi nalog / Направити нови налог",
        "user-mail-no-addy": "Pokušaj slanja e-maila bez e-mail adrese.",
        "user-mail-no-body": "Pokušano slanje e-maila s praznim ili nerazumno kratkim sadržajem.",
        "changepassword": "Promijeni lozinku",
-       "resetpass_announce": "Prijavili ste se sa privremenim kodom koji ste dobili na e-mail.\nDa biste završili prijavu, morate unijeti novu šifru ovdje:",
+       "resetpass_announce": "Da biste završili prijavu, podesite novu lozinku ovde.",
        "resetpass_header": "Obnovi lozinku za račun",
        "oldpassword": "Stara šifra:",
        "newpassword": "Nova šifra:",
        "retypenew": "Ukucajte ponovo novu šifru:",
        "resetpass_submit": "Odredi lozinku i prijavi se",
        "changepassword-success": "Vaša šifra je uspiješno promjenjena! Prijava u toku...",
+       "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 lozinku",
        "resetpass-submit-cancel": "Odustani",
        "resetpass-wrong-oldpass": "Privremena ili trenutna lozinka nije valjana.\nMožda ste već uspješno promijenili Vašu lozinku ili ste tražili novu privremenu lozinku.",
+       "resetpass-recycled": "Molimo resetirajte vašu lozinku/zaporku u nešto drugo od vaše trenutne lozinke/zaporke.",
+       "resetpass-temp-emailed": "Prijavili ste se sa privremenim kodom iz e-pošte.\nDa biste završili prijavljivanje morate postaviti novu lozinku ovde:",
        "resetpass-temp-password": "Privremena lozinka:",
        "resetpass-abort-generic": "Promjenu lozinke/zaporke je prekinula ekstenzija.",
+       "resetpass-expired": "Vaša lozinka je istekla. Postavite novu lozinku da biste se prijavili.",
+       "resetpass-expired-soft": "Vaša lozinka je istekla i morate postaviti novu. Postavite novu lozinku ili kliknite „{{int:resetpass-submit-cancel}}“ da je postavite kasnije.",
+       "resetpass-validity-soft": "Vaša loznika nije valjana: $1\n\nMolimo da sada odaberete novu lozinku ili kliknete \"{{int:resetpass-submit-cancel}}\" kako bi je resetirali kasnije.",
        "passwordreset": "Ponovno postavi lozinku",
        "passwordreset-text-one": "Dovršite ovaj obrazac kako biste resetirali svoju lozinku/zaporku.",
        "passwordreset-text-many": "{{PLURAL:$1|Ispunite jedno od polja kako bi ste resetirali svoju lozinku/zaporku.}}",
        "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.",
+       "resettokens-no-tokens": "Nema tokena za resetiranje.",
+       "resettokens-legend": "Resetiranje tokena",
+       "resettokens-tokens": "Tokeni:",
+       "resettokens-token-label": "$1 (trenutna vrijednost: $2)",
+       "resettokens-watchlist-token": "Token za web feed (Atom/RSS) [[Special:Watchlist|promjena za vašem spisku praćenja]]",
+       "resettokens-done": "Tokeni resetirani.",
+       "resettokens-resetbutton": "Resetiraj odabrane tokene",
        "bold_sample": "Podebljan tekst",
        "bold_tip": "Podebljan tekst",
        "italic_sample": "Kurzivan tekst",
        "savearticle": "Sačuvaj - Сачувај",
        "preview": "Pretpregled / Претпреглед",
        "showpreview": "Pretpregled - Претпреглед",
-       "showlivepreview": "Pretpregled uživo",
        "showdiff": "Prikaži izmjene - Прикажи измене",
        "anoneditwarning": "'''Upozorenje:''' Niste prijavljeni.\nVaša IP adresa će biti zabilježena u historiji ove stranice.",
        "anonpreviewwarning": "''Niste prijavljeni. Vaša IP adresa će biti zabilježena u historiji ove stranice.''",
        "confirmedittext": "Morate potvrditi Vašu e-mail adresu prije nego počnete mijenjati stranice.\nMolimo da postavite i verifikujete Vašu e-mail adresu putem Vaših [[Special:Preferences|korisničkih opcija]].",
        "nosuchsectiontitle": "Ne mogu pronaći sekciju",
        "nosuchsectiontext": "Pokušali ste uređivati sekciju koja ne postoji.\nMožda je premještena ili obrisana dok ste pregledavali stranicu.",
-       "loginreqtitle": "Potrebno je da se [[{{ns:-1}}:Userlogin|prijavite]]",
+       "loginreqtitle": "Potrebno je prijavljivanje",
        "loginreqlink": "prijavi se",
        "loginreqpagetext": "Morate $1 da bi ste vidjeli druge stranice.",
        "accmailtitle": "Šifra je poslana!\n\n\nШифра је послата!",
-       "accmailtext": "Šifra za nalog '$1' je poslana na adresu $2.\n\n\nШифра за налог '$1' је послата на адресу $2.",
+       "accmailtext": "Nasumično odabrana šifra za [[User talk:$1|$1]] je poslata na adresu $2.\n\nŠifra/lozinka za ovaj novi račun može biti promijenjena na stranici ''[[Special:ChangePassword|izmjene šifre]]'' nakon prijave.",
        "newarticle": "(Novi)",
        "newarticletext": "Preko linka ste došli na stranicu koja još uvijek ne postoji.\n* Ako želite stvoriti stranicu, počnite tipkati u okviru dolje (v. [$1 stranicu za pomoć] za više informacija).\n* Ukoliko ste došli greškom, pritisnike dugme '''Nazad''' ('''back''') na vašem pregledniku.",
        "anontalkpagetext": "----''Ovo je stranica za razgovor za anonimnog korisnika koji još nije napravio račun ili ga ne koristi.\nZbog toga moramo da koristimo brojčanu IP adresu kako bismo identifikovali njega ili nju.\nTakvu adresu može dijeliti više korisnika.\nAko ste anonimni korisnik i mislite da su vam upućene nebitne primjedbe, molimo Vas da [[Special:UserLogin/signup|napravite račun]] ili se [[Special:UserLogin|prijavite]] da biste izbjegli buduću zabunu sa ostalim anonimnim korisnicima.''",
        "copyrightwarning": "Molimo da uzmete u obzir kako se smatra da su svi doprinosi u {{SITENAME}} izdani pod $2 (v. $1 za detalje).\nUkoliko ne želite da vaše pisanje bude nemilosrdno uređivano i redistribuirano po tuđoj volji, onda ga nemojte ovdje objavljivati.<br />\nTakođer obećavate kako ste ga napisali sami ili kopirali iz izvora u javnoj domeni ili sličnog slobodnog izvora.\n'''NEMOJTE SLATI RAD ZAŠTIĆEN AUTORSKIM PRAVIMA BEZ DOZVOLE!'''",
        "copyrightwarning2": "Zapamtite da svaki doprinos na stranici {{SITENAME}} može biti izmijenjen, promijenjen ili uklonjen od strane ostalih korisnika. Ako ne želite da ovo desi sa Vašim tekstom, onda ga nemojte slati ovdje.<br />\nTakođer nam garantujete da ste ovo Vi napisali, ili da ste ga kopirali iz javne domene ili sličnog slobodnog izvora informacija (pogledajte $1 za više detalja).\n'''NE ŠALJITE DJELA ZAŠTIĆENA AUTORSKIM PRAVOM BEZ DOZVOLE!'''",
        "longpageerror": "'''Greška: tekst koji ste uneli je veličine {{PLURAL:$1|jedan kilobajt|$1 kilobajta|$1 kilobajta}}, što je veće od {{PLURAL:$2|dozvoljenog jednog kilobajta|dozvoljena $2 kilobajta|dozvoljenih $2 kilobajta}}.'''\nStranica ne može biti sačuvana.",
-       "readonlywarning": "<font color=\"#FF0000\">'''PAŽNJA:'''</font> Baza je upravo zaključana zbog održavanja,\ntako da nećete moći da snimite svoje izmene upravo sada. Možda želite da iskopirate i nalepite\ntekst u tekst editor i snimite ga za kasnije.\n<br>\n<font color=\"#FF0000\">'''ПАЖЊА:'''</font> База је управо закључана због одржавања,\nтако да нећете моћи да снимите своје измене управо сада. Можда желите да ископирате и налепите\nтекст у текст едитор и снимите га за касније.",
+       "readonlywarning": "<strong>Upozorenje: baza podataka je zaključana radi održavanja, tako da trenutno nećete moći da sačuvate izmene.</strong>\nMožda biste želeli sačuvati tekst za kasnije u nekoj tekstualnoj datoteci.\n\nAdministrator koji je zaključao bazu dao je sledeće objašnjenje: $1",
        "protectedpagewarning": "'''PAŽNJA: Ova stranica je zaključana tako da samo korisnici sa administratorskim privilegijama mogu da je mijenjaju.'''\nPosljednja stavka u registru je prikazana ispod kao referenca:",
        "semiprotectedpagewarning": "'''Pažnja:''' Ova stranica je zaključana tako da je samo registrovani korisnici mogu uređivati.\nPosljednja stavka registra je prikazana ispod kao referenca:",
        "cascadeprotectedwarning": "'''Upozorenje:''' Ova stranica je zaključana tako da je samo administratori mogu mijenjati, jer je ona uključena u {{PLURAL:$1|ovu, lančanu povezanu, zaštićenu stranicu|sljedeće, lančano povezane, zaštićene stranice}}:",
        "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": "Vaša izmjena je snimljena.",
+       "postedit-confirmation-saved": "Vaša izmjena je snimljena.",
        "edit-already-exists": "Stranica nije mogla biti kreirana.\nIzgleda da već postoji.",
        "defaultmessagetext": "Uobičajeni tekst poruke",
        "content-failed-to-parse": "Ne mogu da raščlanim sadržaj tipa $2 za model $1: $3",
        "invalid-content-data": "Neispravni podaci sadržaja",
        "content-not-allowed-here": "Sadržaj modela „$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 \"Uređivanje\" vaših postavki.",
+       "editwarning-warning": "Ako napustite ovu stranicu, izgubićete sve izmene koje ste napravili.\nAko ste prijavljeni, možete onemogućiti ovo upozorenje u svojim podešavanjima, u odeljku \"{{int:prefs-editing}}\".",
+       "editpage-notsupportedcontentformat-title": "Format sadržaja nije podržan",
+       "editpage-notsupportedcontentformat-text": "Format sadržaja $1 nije podržan modelom sadržaja $2.",
        "content-model-wikitext": "wikitekst",
        "content-model-text": "obični tekst",
        "content-model-javascript": "JavaScript",
        "undo-success": "Izmjena se može vratiti.\nMolimo da provjerite usporedbu ispod da budete sigurni da to želite učiniti, a zatim spremite promjene da bi ste završili vraćanje izmjene.",
        "undo-failure": "Izmjene se ne mogu vratiti zbog konflikta sa izmjenama u međuvremenu.",
        "undo-norev": "Izmjena se ne može vratiti jer ne postoji ranija ili je obrisana.",
+       "undo-nochange": "Ovo je uređivanje izgleda već bilo poništeno.",
        "undo-summary": "Poništena izmjena $1 [[Special:Contributions/$2|korisnika $2]] ([[User talk:$2|razgovor]])",
        "undo-summary-username-hidden": "Poništi izmjenu $1 od skrivenog korisnika",
        "cantcreateaccounttitle": "Nije moguće napraviti korisnički račun",
        "cantcreateaccount-text": "Pravljenje korisničkog računa sa ove IP adrese ('''$1''') je blokirano od strane [[User:$3|$3]].\n\nRazlog koji je naveo $3 je ''$2''",
+       "cantcreateaccount-range-text": "Stvaranje računa od IP adresa iz pojasa'''$1''', koji uključuje vašu IP adresu ('''$4'''), je blokirao/la [[User:$3|$3]].\n\nRazlog koji je dao/la $3 je ''$2''",
        "viewpagelogs": "Pogledaj protokole ove stranice",
        "nohistory": "Ne postoji historija izmjena za ovu stranicu.",
        "currentrev": "Trenutna revizija",
        "revdelete-no-file": "Navedena datoteka ne postoji.",
        "revdelete-show-file-confirm": "Da li ste sigurni da želite pogledati obrisanu reviziju datoteke \"<nowiki>$1</nowiki>\" od $2 u $3?",
        "revdelete-show-file-submit": "Da",
+       "revdelete-selected-text": "{{PLURAL:$1|Izabrana izmjena|Izabrane izmjene}} [[:$2]]:",
+       "revdelete-selected-file": "{{PLURAL:$1|Izabrana verzija datoteke|Izabrane verzije datoteke}} [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|Označena stavka registra|Označene stavke registra}}:",
+       "revdelete-text-text": "Izbrisane revizije će se još pojavljivati u historiji stranice, ali dijelovi njihovog sadržaja neće biti javno dostupni.",
+       "revdelete-text-file": "Izbrisane verzije datoteke će se još pojavljivati u historiji datoteke, ali dijelovi sadržaja neće biti dostupni javnosti.",
+       "logdelete-text": "Izbrisane stavke u registru događaja će se još pojavljivati u registrima, ali dijelovi njihovog sadržaja neće biti javno dostupni.",
+       "revdelete-text-others": "Drugi administratori {{SITENAME}} će još uvijek moći pristupiti skrivenom sadržaju i mogu ga ponovno odbrisati kroz isti interfejs, ukoliko nisu postavljena dodatna ograničenja.",
        "revdelete-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": "Ograničenja bi trebala biti korištena '''samo''' u sljedećim slučajevima:\n* Osjetljive korisničke informacije\n*: ''kućne adrese, brojevi telefona, brojevi bankovnih kartica itd.''",
+       "revdelete-suppress-text": "Sakrivanje izmjena bi se trebalo koristiti <strong>samo</strong> za sljedeće slučajeve:\n* potencijalno klevetničke informacije\n* neprimjerene lične informacije\n*: <em>kućne adrese i telefonski brojevi, matični i lični identifikacijski brojevi itd.</em>",
        "revdelete-legend": "Postavi ograničenja vidljivosti",
-       "revdelete-hide-text": "Sakrij tekst revizije",
+       "revdelete-hide-text": "Tekst revizije",
        "revdelete-hide-image": "Sakrij sadržaj datoteke",
        "revdelete-hide-name": "Sakrij akciju i cilj",
-       "revdelete-hide-comment": "Sakrij izmjene komentara",
+       "revdelete-hide-comment": "Opis izmjene",
        "revdelete-hide-user": "Sakrij korisničko ime / IP adresu korisnika koji je uređivao stranicu",
        "revdelete-hide-restricted": "Ograniči podatke za administratore kao i za druge korisnike",
        "revdelete-radio-same": "(ne mijenjaj)",
-       "revdelete-radio-set": "Da",
-       "revdelete-radio-unset": "Ne",
+       "revdelete-radio-set": "Sakriveno",
+       "revdelete-radio-unset": "Vidljivo",
        "revdelete-suppress": "Sakrij podatke od administratora kao i od drugih",
        "revdelete-unsuppress": "Ukloni ograničenja na vraćenim revizijama",
        "revdelete-log": "Razlog:",
        "showhideselectedversions": "Pokaži/sakrij odabrane verzije",
        "editundo": "ukloni ovu izmjenu - уклони ову измену",
        "diff-empty": "(nema razlike)",
+       "diff-multi-sameuser": "({{PLURAL:$1|Nije prikazana jedna međuverzija|Nisu prikazane $1 međuverzije|Nije prikazano $1 međuverzija}} istog korisnika)",
+       "diff-multi-otherusers": "({{PLURAL:$1|Nije prikazana jedna međuverzija|Nisu prikazane $1 međuverzije|Nije prikazano $1 međuverzija}} {{PLURAL:$2|jednog|$2}} korisnika)",
        "diff-multi-manyusers": "({{PLURAL:$1|Nije prikazana jedna međuverzija|Nisu prikazane $1 međuverzije|Nije prikazano $1 međuverzija}}) od strane {{PLURAL:$2|korisnika|korisnika}}",
        "difference-missing-revision": "Ne mogu da pronađem {{PLURAL:$2|jednu izmenu|$2 izmene|$2 izmena}} od ove razlike ($1).\n\nOvo se obično dešava kada pratite zastarjelu vezu do stranice koja je obrisana.\nViše informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} evidenciji brisanja].",
        "searchresults": "Rezultati pretrage",
        "textmatches": "Tekst stranice odgovara",
        "notextmatches": "Tekst stranice ne odgovara",
        "prevn": "prethodna {{PLURAL:$1|$1}}",
-       "nextn": "sljedećih - следећих $1",
+       "nextn": "{{PLURAL:$1|slijedeći $1|slijedećih $1}}",
        "prevn-title": "{{PLURAL:$1|Prethodni $1 rezultat|Prethodna $1 rezultata|Prethodnih $1 rezultata}}",
        "nextn-title": "{{PLURAL:$1|Slijedeći $1 rezultat|Slijedeća $1 rezultata|Slijedećih $1 rezultata}}",
        "shown-title": "Pokaži $1 {{PLURAL:$1|rezultat|rezultata}} po stranici",
        "viewprevnext": "Pogledaj ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''Postoji stranica pod nazivom \"[[:$1]]\" na ovoj wiki'''",
-       "searchmenu-new": "'''Napravi stranicu \"[[:$1|$1]]\" na ovoj wiki!'''",
+       "searchmenu-new": "<strong>Napravi stranicu \"[[:$1]]\" na ovoj wiki!</strong> {{PLURAL:$2|0=|Pogledajte također straniu pronađenu vašom pretragom.|Pogledajte također i vaše rezultate pretrage.}}",
        "searchprofile-articles": "Stranice sadržaja",
        "searchprofile-project": "Stranice pomoći i projekta",
        "searchprofile-images": "Multimedija",
        "search-result-score": "Relevantnost: $1%",
        "search-redirect": "(preusmjeravanje $1)",
        "search-section": "(sekcija $1)",
+       "search-file-match": "(odgovara sadržaju datoteke)",
        "search-suggest": "Da li ste mislili: $1",
        "search-interwiki-caption": "Srodni projekti",
-       "search-interwiki-default": "$1 rezultati:",
+       "search-interwiki-default": "Rezultati od $1:",
        "search-interwiki-more": "(više)",
        "search-relatedarticle": "Povezano",
        "searcheverything-enable": "Pretraga u svim imenskim prostorima",
        "searchrelated": "povezano",
        "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>.",
        "showingresultsnum": "Dolje {{PLURAL:$3|je prikazan '''1''' rezultat|su prikazana '''$3''' rezultata|je prikazano '''$3''' 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:",
-       "powersearch-redir": "Pokaži spisak preusmjerenja",
        "powersearch-togglelabel": "Označi:",
        "powersearch-toggleall": "Sve",
        "powersearch-togglenone": "Ništa",
        "preferences": "Postavke / Подешавања",
        "mypreferences": "Moje postavke / Моја подешавања",
        "prefs-edits": "Broj izmjena:",
+       "prefsnologintext2": "Molimo $1 kako bi promijenili vaše postavke.",
        "prefs-skin": "Izgled (skin)",
        "skin-preview": "Pretpregled",
        "datedefault": "Bez preferenci",
        "prefs-email": "E-mail opcije",
        "prefs-rendering": "Izgled",
        "saveprefs": "Snimi postavke",
-       "restoreprefs": "Vrati sve pretpostavljene postavke",
+       "restoreprefs": "Vrati sve na podrazumijevano (u svim odjeljcima)",
        "prefs-editing": "Uređivanje",
        "rows": "Redova:",
        "columns": "Kolona:",
        "recentchangesdays-max": "(najviše $1 {{PLURAL:$1|dan|dana}})",
        "recentchangescount": "Broj uređivanja za prikaz po pretpostavkama:",
        "prefs-help-recentchangescount": "Ovo uključuje nedavne izmjene, historije stranice i registre.",
+       "prefs-help-watchlist-token2": "Ovo je tajni ključ prema sažetku Vašeg popisa praćenja. Svaki suradnik kojem je poznat, moći će čitati Vaš popis praćenih stranica. Ne dijelite ga ni s kim. [[Special:ResetTokens|Kliknite ovdje ako ga želite ponovo postaviti]].",
        "savedprefs": "Vaša postavke su snimljene.",
        "timezonelegend": "Vremenska zona / Временска зона",
        "localtime": "Lokalno vrijeme:",
        "prefs-help-signature": "Komentari na stranicama za razgovor trebaju biti potpisani sa \"<nowiki>~~~~</nowiki>\" koje će biti pretvoreno u vaš potpis i vrijeme.",
        "badsig": "Loš sirovi potpis.\nProvjerite HTML tagove.",
        "badsiglength": "Vaš potpis je predug.\nMora biti manji od $1 {{PLURAL:$1|znaka|znaka|znakova}}.",
-       "yourgender": "Spol:",
-       "gender-unknown": "neodređen",
-       "gender-male": "Muški",
-       "gender-female": "Ženski",
-       "prefs-help-gender": "Opcionalno: koristi se za ispravke gramatičkog roda u porukama softvera.\nOva informacija će biti javna.",
+       "yourgender": "Kako želite da se predstavite?",
+       "gender-unknown": "Preferiram da se ne odredim",
+       "gender-male": "On uređuje wiki stranice",
+       "gender-female": "Ona uređuje wiki stranice",
+       "prefs-help-gender": "Postavljanje ove preferencije nije obavezno.\nSoftver koristi ovu vrijednost kako bi vam se obratio i spomenuo vas drugima koristeći vaš gramatički rod.\nOva informacija će biti javna.",
        "email": "E-mail",
        "prefs-help-realname": "Pravo ime nije obavezno.\nAko izaberete da date ime, biće korišteno za pripisivanje Vašeg rada.",
-       "prefs-help-email": "* E-mail (nije obavezno): omogućuje drugima da Vas kontaktiraju na korisničkoj strani ili strani za razgovor bez javnog pokazivanja Vaše elektronske adrese. Ako zaboravite šifru možemo Vam na ovu adresu poslati novu, privremenu. <br/>\n\n* Е-пошта (није обавезно): Омогућује другима да Вас контактирају на корисничкој страни или страни за разговор без јавног показивања Ваше електронске адресе. Ако заборавите шифру, можемо Вам на ову адресу послати нову, привремену.",
+       "prefs-help-email": "E-mail adresa je opcionalna, ali je potrebna jer omogućava da Vam se pošalje nova šifra u slučaju da je izgubite ili zaboravite.",
        "prefs-help-email-others": "Također možete da odaberete da vas drugi kontaktiraju putem vaše korisničke stranice ili stranice za razgovor bez otkrivanja vašeg identiteta.",
        "prefs-help-email-required": "Neophodno je navesti e-mail adresu.",
        "prefs-info": "Osnovne informacije",
        "prefs-signature": "Potpis",
        "prefs-dateformat": "Format datuma",
        "prefs-timeoffset": "Vremenska razlika",
-       "prefs-advancedediting": "Općenito",
+       "prefs-advancedediting": "Opće opcije",
        "prefs-editor": "Uređivač",
        "prefs-preview": "Pretpregled",
        "prefs-advancedrc": "Napredne opcije",
        "prefs-advancedsearchoptions": "Napredne opcije",
        "prefs-advancedwatchlist": "Napredne opcije",
        "prefs-displayrc": "Postavke displeja",
-       "prefs-displaysearchoptions": "Postavke displeja",
        "prefs-displaywatchlist": "Postavke prikaza",
        "prefs-diffs": "Razlike",
+       "prefs-help-prefershttps": "Ova mogućnost će stupiti na snagu kod vaše sljedeće prijave.",
+       "prefs-tabs-navigation-hint": "Savjet: Možete koristi lijevu i desnu navigacijsku tipku kako biste se kretali između tabova u popisu tabova.",
        "email-address-validity-valid": "E-mail adresa izgleda valjano",
        "email-address-validity-invalid": "Unesite valjanu e-mail adresu",
        "userrights": "Postavke korisničkih prava",
        "userrights-no-interwiki": "Nemate dopuštenja da uređujete korisnička prava na drugim wikijima.",
        "userrights-nodatabase": "Baza podataka $1 ne postoji ili nije lokalna baza.",
        "userrights-nologin": "Morate se [[Special:UserLogin|prijaviti]] sa administratorskim računom da bi ste mogli postavljati korisnička prava.",
-       "userrights-notallowed": "Vaš račun Vam ne daje dozvolu da postavljate i uklanjate korisnička 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",
        "right-hideuser": "Blokiranje korisničkog imena, i njegovo sakrivanje od javnosti",
        "right-ipblock-exempt": "Zaobilaženje IP blokada, autoblokada i blokada IP grupe",
        "right-proxyunbannable": "Zaobilaženje automatskih blokada proxy-ja",
-       "right-unblockself": "Deblokiranje samog sebe",
+       "right-unblockself": "Deblokiraj samog sebe",
        "right-protect": "Promjena nivoa zaštite i uređivanje kaskadno zaštićenih stranica",
        "right-editprotected": "Uređivanje stranice zaštićenih kao \"{{int:protect-level-sysop}}\"",
        "right-editsemiprotected": "Uređivanje stranica zaštićenih kao  \"{{int:protect-level-autoconfirmed}}\"",
        "action-block": "blokiranje uređivanja ovog korisnika",
        "action-protect": "promijeniti nivo zaštite ove stranice",
        "action-rollback": "brzo vraćanje izmjena posljednjeg korisnika koji je mijenjao određenu stranicu",
-       "action-import": "uvoženje ove stranice s drugog wikija",
-       "action-importupload": "uvoženje ove stranice postavljanjem datoteke",
+       "action-import": "uvoženje stranica s drugog wikija",
+       "action-importupload": "uvoženje stranica postavljanjem datoteke",
        "action-patrol": "označavanje tuđih izmjena patroliranim",
        "action-autopatrol": "označavanje vlastitih izmjena kao patroliranih",
        "action-unwatchedpages": "pregled spiska nenadgledanih strana",
        "action-viewmyprivateinfo": "pogledajte svoje privatne informacije",
        "action-editmyprivateinfo": "uredite svoje privatne informacije",
        "nchanges": "$1 {{PLURAL:$1|izmjena|izmjene|izmjena}}",
+       "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|izmjena od Vaše posljedne posjete}}",
+       "enhancedrc-history": "historija",
        "recentchanges": "Nedavne izmjene / Скорашње измене",
        "recentchanges-legend": "Postavke za Nedavne promjene",
        "recentchanges-summary": "Na ovoj stranici možete pratiti nedavne izmjene.",
        "recentchanges-label-minor": "Ovo je manja izmjena",
        "recentchanges-label-bot": "Ovu je izmjenu učinio bot",
        "recentchanges-label-unpatrolled": "Ova izmjena još nije patrolirana",
-       "recentchanges-legend-newpage": "$1 - nova stranica",
-       "rcnotefrom": "Ispod {{PLURAL:$1|je '''$1''' izmjena|su '''$1''' zadnje izmjene|su '''$1''' zadnjih izmjena}} u {{PLURAL:$2|posljednjem '''$2''' danu|posljednja '''$2''' dana|posljednjih '''$2''' dana}}, od $4, $5.",
-       "rclistfrom": "Prikaži nove poruke od / Прикажи нове поруке од $1",
+       "recentchanges-label-plusminus": "Veličina stranice promijenila se za ovoliko bajtova",
+       "recentchanges-legend-heading": "'''Legenda:'''",
+       "recentchanges-legend-newpage": "(također pogledajte [[Special:NewPages|spisak novih stranica]])",
+       "rcnotefrom": "Ispod su izmjene od <strong>$2</strong> (do <strong>$1</strong> prikazano).",
+       "rclistfrom": "Prikaži nove poruke od / Прикажи нове поруке од $3 $2",
        "rcshowhideminor": "$1 male izmjene / мале измене",
+       "rcshowhideminor-show": "Pokaži",
+       "rcshowhideminor-hide": "Sakrij",
        "rcshowhidebots": "$1 botove / ботове",
-       "rcshowhideliu": "$1 prijavljene korisnike",
+       "rcshowhidebots-show": "Pokaži",
+       "rcshowhidebots-hide": "Sakrij",
+       "rcshowhideliu": "$1 registrovanih korisnika",
+       "rcshowhideliu-show": "Pokaži",
+       "rcshowhideliu-hide": "Sakrij",
        "rcshowhideanons": "$1 anonimne / анонимне",
+       "rcshowhideanons-show": "Pokaži",
+       "rcshowhideanons-hide": "Sakrij",
        "rcshowhidepatr": "$1 označene / означене",
+       "rcshowhidepatr-show": "Pokaži",
+       "rcshowhidepatr-hide": "Sakrij",
        "rcshowhidemine": "$1 vlastite izmjene / сопствене измене",
-       "rclinks": "<br>\nPrikaži zadnjih / Прикажи последњих $1 promjena / промена<br>\nu zadnjih / у последњних $2 dana / дана<br />\n<br>\n$3\n<br>",
+       "rcshowhidemine-show": "Pokaži",
+       "rcshowhidemine-hide": "Sakrij",
+       "rclinks": "Prikaži najskorijih $1 izmjena u posljednjih $2 dana<br />$3",
        "diff": "razl-разл",
        "hist": "his-пов",
        "hide": "Sakrij",
        "rc_categories_any": "Sve",
        "rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajta|bajtova}} posle izmene",
        "newsectionsummary": "/* $1 */ nova sekcija",
-       "rc-enhanced-expand": "Pokaži detalje (neophodan JavaScript)",
+       "rc-enhanced-expand": "Pokaži detalje",
        "rc-enhanced-hide": "Sakrij detalje",
        "rc-old-title": "prvobitno kreirano kao \"$1\"",
        "recentchangeslinked": "Srodne izmjene / Сродне измене",
        "fileexists-shared-forbidden": "Datoteka sa ovim imenom već postoji u zajedničkoj ostavi; molimo Vas da se vratite i pošaljete ovu datoteku pod novim imenom. [[File:$1|thumb|center|$1]]",
        "file-exists-duplicate": "Ova datoteka je dvojnik {{PLURAL:$1|slijedećoj datoteci|slijedećim datotekama}}:",
        "file-deleted-duplicate": "Datoteka koje je identična ovoj datoteci ([[:$1]]) je ranije bila obrisana. Trebate provjeriti historiju brisanja te datoteke prije nego što nastavite sa njenim ponovnim postavljanjem.",
+       "file-deleted-duplicate-notitle": "Datoteka identična ovoj datoteci je prethodno bila izbrisana, a naslov je bio sakriven.\nPrije nego što nastavite ponovno postavljanje trebali biste pitati nekoga sa mogućnošću pregleda sakrivenih podataka o datotekama.",
        "uploadwarning": "Upozorenje pri slanju",
        "uploadwarning-text": "Molimo izmijeniti opis datoteke ispod i pokušajte kasnije.",
        "savefile": "Snimi datoteku",
        "uploaddisabledtext": "Postavljanje datoteka je onemogućeno.",
        "php-uploaddisabledtext": "Postavljanje datoteka preko PHP je onemogućeno. \nMolimo provjerite postavku za postavljanje datoteka.",
        "uploadscripted": "Ova datoteka sadrži HTML ili skriptni kod koji može izazvati grešku kod internet preglednika.",
+       "uploadscriptednamespace": "Ova SVG datoteka sadrži pogrešan imenski prostor „$1“",
+       "uploadinvalidxml": "XML u postavljenoj datoteci nije mogao biti parsiran.",
        "uploadvirus": "Fajl sadrži virus!  Detalji:  $1",
        "uploadjava": "Datoteka je ZIP datoteka koja sadrži Java .class datoteku.\nPostavljanje Java datoteka nije dopušteno, jer one mogu prouzrokovati zaobilaženje sigurnosnih ograničenja.",
        "upload-source": "Izvorna datoteka",
        "uploadstash-refresh": "Osvježi spisak datoteka",
        "invalid-chunk-offset": "Nevaljana točka nastavka snimanja",
        "img-auth-accessdenied": "Pristup onemogućen",
-       "img-auth-nopathinfo": "Nedostaje PATH_INFO.\nVaš server nije podešen da prosleđuje ovakve podatke.\nMožda je zasnovan na CGI-ju koji ne podržava img_auth.\nPogledajte https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "Nedostaje PATH_INFO.\nVaš server nije podešen da prosleđuje ovakve podatke.\nMožda je zasnovan na CGI-ju koji ne podržava img_auth.\nPogledajte https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Zahtjevana putanja nije u direktorijumu podešenom za postavljanje.",
        "img-auth-badtitle": "Ne mogu napraviti valjani naslov iz \"$1\".",
        "img-auth-nologinnWL": "Niste prijavljeni i \"$1\" nije na spisku dozvoljenih.",
        "license-nopreview": "(Pregled nije dostupan)",
        "upload_source_url": "(valjani, javno dostupni URL)",
        "upload_source_file": "(datoteka na Vašem kompjuteru)",
-       "listfiles-summary": "Ova posebna stranica pokazuje sve postavljene datoteke.\nKad je filtriran po korisniku, popis prikazuje samo one datoteke čiju je posljednju verziju postavio taj korisnik.",
+       "listfiles-summary": "Ova posebna stranica prikazuje sve postavljene datoteke.",
        "listfiles_search_for": "Traži ime medija:",
        "imgfile": "datoteka",
        "listfiles": "Spisak slika",
        "listfiles_size": "Veličina",
        "listfiles_description": "Opis",
        "listfiles_count": "Verzije",
+       "listfiles-show-all": "Uključi starije verzije slika",
+       "listfiles-latestversion": "Trenutna verzija",
+       "listfiles-latestversion-yes": "Da",
+       "listfiles-latestversion-no": "Ne",
        "file-anchor-link": "Datoteka",
        "filehist": "Historija datoteke",
        "filehist-help": "Kliknite na datum/vrijeme da vidite kako je tada izgledala datoteka/fajl.",
        "download": "učitaj",
        "unwatchedpages": "Nepraćene stranice",
        "listredirects": "Spisak preusmjerenja",
+       "listduplicatedfiles": "Spisak datoteka sa duplikatima",
+       "listduplicatedfiles-summary": "Ovo je popis datoteka gdje su najskorije verzije datoteke duplikati najskorijih verzija neke druge datoteke. Samo se lokalne datoteke uzimaju u obzir.",
+       "listduplicatedfiles-entry": "[[:File:$1|$1]] ima [[$3|{{PLURAL:$2|duplikat|$2 duplikata}}]].",
        "unusedtemplates": "Nekorišteni šabloni",
        "unusedtemplatestext": "Ova stranica prikazuje sve stranice u imenskom prostoru {{ns:template}} koji se ne koriste.\nPrije brisanja provjerite da li druge stranice vode na te šablone.",
        "unusedtemplateswlh": "ostali linkovi",
        "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-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 / Статистике",
        "pageswithprop-text": "Ova stranica navodi stranice sa specifičnim svojstvom stranice.",
        "pageswithprop-prop": "Naziv svojstva:",
        "pageswithprop-submit": "Idi",
+       "pageswithprop-prophidden-long": "vrijednost svojstva dugog teksta sakrivena ($1)",
+       "pageswithprop-prophidden-binary": "vrijednost binarnog svojstva sakrivena ($1)",
        "doubleredirects": "Dvostruka preusmjerenja",
        "doubleredirectstext": "Ova stranica prikazuje stranice koje preusmjeravaju na druga preusmjerenja.\nSvaki red sadrži veze na prvo i drugo preusmjerenje, kao i na prvu liniju teksta drugog preusmjerenja, što obično daje \"pravi\" ciljni članak, na koji bi prvo preusmjerenje i trebalo da pokazuje.\n<del>Precrtane</del> stavke su riješene.",
-       "double-redirect-fixed-move": "[[$1]] je premješten, sada je preusmjerenje na [[$2]]",
-       "double-redirect-fixed-maintenance": "Popravak dvostrukih datoteka od [[$1]] do [[$2]].",
+       "double-redirect-fixed-move": "[[$1]] je bio premješten.\nAutomatski je ažuriran i sada preusmjeruje na [[$2]]",
+       "double-redirect-fixed-maintenance": "Automatski popravak dvostrukih datoteka od [[$1]] do [[$2]] u poslu održavanja.",
        "double-redirect-fixer": "Popravljač preusmjerenja",
        "brokenredirects": "Pokvarena preusmjerenja",
        "brokenredirectstext": "Slijedeća preusmjerenja vode na nepostojeće stranice:",
        "ninterwikis": "$1 {{PLURAL:$1|međuviki|međuvikija|međuvikija}}",
        "nlinks": "$1 {{PLURAL:$1|link|linka|linkova}}",
        "nmembers": "$1 {{PLURAL:$1|član|članova}}",
+       "nmemberschanged": "$1 → $2 {{PLURAL:$2|član|članova}}",
        "nrevisions": "$1 {{PLURAL:$1|revizija|revizije|revizija}}",
        "nviews": "$1 {{PLURAL:$1|pregled|pregleda}}",
        "nimagelinks": "Koristi se na $1 {{PLURAL:$1|stranici|stranice|stranica}}",
        "mostrevisions": "Stranice sa najviše izmjena",
        "prefixindex": "Sve stranice sa prefiksom",
        "prefixindex-namespace": "Sve stranice s predmetkom (imenski prostor $1)",
+       "prefixindex-strip": "Sakrij prefiks u spisku",
        "shortpages": "Kratke stranice",
        "longpages": "Duge stranice / Дуге странице",
        "deadendpages": "Članci bez internih linkova / Чланци без интерних линкова",
        "deadendpagestext": "Slijedeće stranice nisu povezane s drugim stranicama na {{SITENAME}}.",
        "protectedpages": "Zaštićene stranice / Заштићене странице",
        "protectedpages-indef": "Samo neograničena zaštićenja",
+       "protectedpages-summary": "Ovaj stranica navodi popis postojećih stranica koje su trenutno zaštićene. Za popis stranica zaštićenih od stvaranja, vidi [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "protectedpages-cascade": "Samo prenosive zaštite",
+       "protectedpages-noredirect": "Sakrij preusmjerenja",
        "protectedpagesempty": "Trenutno nijedna stranica nije zaštićena s ovim parametrima.",
+       "protectedpages-timestamp": "Vremenska oznaka",
+       "protectedpages-page": "Stranica",
+       "protectedpages-expiry": "Istječe",
+       "protectedpages-performer": "Zaštitio/la",
+       "protectedpages-params": "Nivo zaštite",
+       "protectedpages-reason": "Razlog",
+       "protectedpages-unknown-timestamp": "Nepoznato",
+       "protectedpages-unknown-performer": "Nepoznati korisnik",
        "protectedtitles": "Zaštićeni naslovi",
        "protectedtitlesempty": "Nema naslova zaštićenih članaka sa ovim parametrima.",
        "listusers": "Spisak korisnika",
        "watchlist-details": "{{PLURAL:$1|$1 stranica praćena|$1 stranice praćene|$1 stranica praćeno}} ne računajući stranice za razgovor.",
        "wlheader-enotif": "* Obavještavanje e-poštom je omogućeno.",
        "wlheader-showupdated": "* Stranice koje su izmijenjene od kad ste ih posljednji put posjetili su prikazane '''podebljanim slovima'''",
-       "watchmethod-recent": "provjerava se da li ima praćenih stranica u nedavnim izmjenama",
-       "watchmethod-list": "provjerava se da li ima nedavnih izmjena u praćenim stranicama",
-       "watchlistcontains": "Vaš spisak praćenih članaka sadrži $1 {{PLURAL:$1|stranicu|stranica}}.",
-       "iteminvalidname": "Problem sa '$1', neispravno ime...",
        "wlshowlast": "Prikaži posljednjih $1 sati $2 dana $3",
        "watchlist-options": "Opcije liste praćenja",
        "watching": "Pratim... / Додавање на списак надгледања...",
        "enotif_lastvisited": "Pogledajte $1 za sve izmjene od vaše posljednje posjete.",
        "enotif_lastdiff": "Vidi $1 da pregledate ovu promjenu.",
        "enotif_anon_editor": "anonimni korisnik $1",
-       "enotif_body": "Poštovani $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nSažetak urednika: $PAGESUMMARY $PAGEMINOREDIT\n\nKontaktirajte urednika:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nNeće biti drugih obavještenja u slučaju daljnjih izmjena osima ako posjetite stranicu.\nTakođer možete poništiti oznake obavijesti za sve praćene stranice koje imate na vašem spisku praćenja.\n\n             Vaš prijateljski {{SITENAME}} sistem obavještavanja\n\n--\nZa promjenu vaših postavki e-mail obavijesti, posjetite\n{{canonicalurl:{{#special:Preferences}}}}\n\nZa promjenu postavki vašeg praćenja, posjetite\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nDa obrišete stranicu sa vašeg spiska praćenja, posjetite\n$UNWATCHURL\n\nPovratne informacije i daljnja pomoć:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Poštovani $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nSažetak urednika: $PAGESUMMARY $PAGEMINOREDIT\n\nKontaktirajte urednika:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nNeće biti drugih obavještenja u slučaju daljnjih izmjena osima ako posjetite stranicu.\nTakođer možete poništiti oznake obavijesti za sve praćene stranice koje imate na vašem spisku praćenja.\n\n             Vaš prijateljski {{SITENAME}} sistem obavještavanja\n\n--\nZa promjenu vaših postavki e-mail obavijesti, posjetite\n{{canonicalurl:{{#special:Preferences}}}}\n\nZa promjenu postavki vašeg praćenja, posjetite\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nDa obrišete stranicu sa vašeg spiska praćenja, posjetite\n$UNWATCHURL\n\nPovratne informacije i daljnja pomoć:\n$HELPPAGE",
        "created": "Napravljen - Направљен",
        "changed": "promijenjena",
        "deletepage": "Izbrišite stranicu",
        "blockip": "Blokiraj korisnika",
        "blockip-legend": "Blokiranje korisnika",
        "blockiptext": "Upotrebite donji upitnik da biste uklonili prava pisanja sa određene IP adrese ili korisničkog imena.  \nOvo bi trebalo da bude urađeno samo da bi se spriječio vandalizam, i u skladu sa [[{{MediaWiki:Policy-url}}|smjernicama]]. \nUnesite konkretan razlog ispod (na primjer, navodeći koje konkretne stranice su vandalizovane).",
-       "ipadressorusername": "IP adresa ili korisničko ime:",
+       "ipaddressorusername": "IP adresa ili korisničko ime:",
        "ipbexpiry": "Ističe:",
        "ipbreason": "Razlog:",
        "ipbreason-dropdown": "*Najčešći razlozi blokiranja\n**Unošenje netačnih informacija\n**Uklanjanje sadržaja stranica\n**Postavljanje spam vanjskih linkova\n**Ubacivanje gluposti/grafita\n**Osobni napadi (ili napadačko ponašanje)\n**Čarapare (zloupotreba više korisničkih računa)\n**Neprihvatljivo korisničko ime",
        "tooltip-undo": "Vraća ovu izmjenu i otvara formu uređivanja u modu pretpregleda.\nDozvoljava unošenje razloga za to u sažetku.",
        "tooltip-preferences-save": "Snimi postavke",
        "tooltip-summary": "Unesite kratki sažetak",
-       "notacceptable": "Viki server ne može da pruži podatke u onom formatu koji Vaš klijent može da pročita.",
        "anonymous": "{{PLURAL:$1|Anonimni korisnik|$1 anonimna korisnika|$1 anonimnih korisnika}} projekta {{SITENAME}}",
        "siteuser": "{{SITENAME}} korisnik $1",
        "anonuser": "{{SITENAME}} anonimni korisnik $1",
        "newimages-summary": "Ova posebna stranica prikazuje posljednje postavljene datoteke.",
        "newimages-legend": "Filter",
        "newimages-label": "Ime datoteke (ili dio imena):",
-       "showhidebots": "($1 botove)",
        "noimages": "Ništa za prikazati.",
        "ilsubmit": "Traži / Тражи",
        "bydate": "po datumu",
        "autosumm-replace": "Zamjena stranice sa '$1'",
        "autoredircomment": "Preusmjereno na [[$1]]",
        "autosumm-new": "Napravljena stranica sa '$1'",
-       "livepreview-loading": "Učitavanje...",
-       "livepreview-ready": "Učitavanje... Spreman!",
-       "livepreview-failed": "Pregled uživo nije uspio! Pokušajte normalni pregled.",
-       "livepreview-error": "Spajanje nije uspjelo: $1 \"$2\".\nPokušajte normalni pregled.",
        "lag-warn-normal": "Promjene načinjene prije manje od $1 {{PLURAL:$1|sekunde|sekunde|sekundi}} možda neće biti prikazane na ovom spisku.",
        "lag-warn-high": "Zbog dužeg zastoja baze podataka na serveru, izmjene novije od $1 {{PLURAL:$1|sekunde|sekunde|sekundi}} možda neće biti prikazane na ovom spisku.",
-       "watchlistedit-numitems": "Vaš spisak praćenja sadrži {{PLURAL:$1|1 naslov|$1 naslova}}, izuzimajući stranice za razgovor.",
-       "watchlistedit-noitems": "Vaš spisak praćenja ne sadrži naslove.",
        "watchlistedit-normal-title": "Uredi spisak praćenja",
        "watchlistedit-normal-legend": "Ukloni naslove iz spiska praćenja",
        "watchlistedit-normal-explain": "Naslovi na Vašem spisku praćenja su prikazani ispod.\nDa bi ste uklonili naslov, označite kutiju pored naslova, i kliknite \"{{int:Watchlistedit-normal-submit}}\".\nTakođer možete [[Special:EditWatchlist/raw|napredno urediti spisak]].",
        "compare-invalid-title": "Naslov koji ste unijeli je nevaljan.",
        "compare-title-not-exists": "Navedeni naslov ne postoji.",
        "compare-revision-not-exists": "Navedena revizija ne postoji.",
-       "dberr-header": "Ovaj wiki ima problem",
        "dberr-problems": "Žao nam je! Ova stranica ima tehničke poteškoće.",
        "dberr-again": "Pokušajte pričekati nekoliko minuta i ponovno učitati.",
        "dberr-info": "(Ne može se spojiti server baze podataka: $1)",
index 1ddfd4c..07849a4 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Dalinanir",
                        "Ebe123",
-                       "Zanatos"
+                       "Zanatos",
+                       "아라"
                ]
        },
        "tog-underline": "krrj du izdayn:",
@@ -16,7 +17,6 @@
        "tog-showtoolbar": "sbaynd tizikrt n tbddil(JavaScript)",
        "tog-editondblclick": "Ẓrig tisniwin ad s uklik snat wal ( ira mayad JavaScript)",
        "tog-editsectiononrightclick": "Yan uklik s tsga tafasi f uzwl n w-ayyaw bac ad tsbadlt ɣtad (ira JavaScript)",
-       "tog-rememberpassword": "Askti nu ukcum ɣ Urdinaturad (Iɣ kullu tggut $1 {{PLURAL:$1|Ass|Ass}})",
        "tog-watchcreations": "Zaydn tasniwin lli skrɣ i umuɣ n tilli ssuġiɣ.",
        "tog-watchdefault": "Zaydn tasniwin lli tżrigɣ i umuɣ n tilli tsaggaɣ",
        "tog-watchmoves": "Zayd tisniwin lli smattayɣ i tilli tsggaɣ.",
        "missingarticle-diff": "(lfarq: $1, $2)",
        "internalerror": "khata ghogns",
        "internalerror_info": "khata ghogns :$1",
-       "fileappenderrorread": "Ur as nufa anɣr \"$1\"",
-       "fileappenderror": "orimkn anzayd \"$1\" s \"$2\".",
        "filecopyerror": "orimkin ankopi \"$1\" s \"$2\".",
        "filerenameerror": "ur as tufit ad tsmmut \"$1\" s \"$2\".",
        "filedeleteerror": "Ur as yuffi ad ikkis asddaw ad « $1 ».",
        "directorycreateerror": "Ur as tufit an tgt asddaw « $1 ».",
        "filenotfound": "Ur as tufit ad taft \"$1\"",
-       "fileexistserror": "Ur as tufit ad tarat ɣ usdaw \"$1\" : asdaw ur illi",
        "unexpected": "Azal (atig) llis ur nql: « $1 » = « $2 ».",
        "formerror": "Anzri: ur as tufit an tgt tifrkit",
        "badarticleerror": "Tigawt ad ur  as tufi ad ttuyskar ɣ tasna yad.",
        "savearticle": "Ẓṛig d tḥbut",
        "preview": "Iẓṛi amzwaru",
        "showpreview": "Iẓṛi amzwaru",
-       "showlivepreview": "Iẓṛi izrbn",
        "showdiff": "Mel imbddln lli ifttun",
        "anoneditwarning": "Han  ''' ur ttuyssant ''' rad ibayn IP nk ɣ umzrut n tasna yad, ur sul  iḥba tamagit nk",
        "anonpreviewwarning": "ur ittuyssan mat tgit. Iɣ tgdl tawuri nk, tansa nk IP rad tbayn ɣ umzruy n imbdln n tasna yad.",
        "search-nonefound": "Ur ittuykfa walu maygan zund ɣayli trit",
        "powersearch-legend": "Amsigl imzwarn",
        "powersearch-ns": "Icnubbucn ɣ tɣulin",
-       "powersearch-redir": "Afsr n ismmatayn (Tifilit n ismmatayn)",
        "powersearch-togglelabel": "Sti",
        "powersearch-toggleall": "Kullu",
        "powersearch-togglenone": "Walu",
        "recentchanges-label-bot": "Ambddl ad iskr robot",
        "recentchanges-label-unpatrolled": "Ambddl ad ura jju ittmẓra",
        "rcnotefrom": "Had imbddln lli ittuyskarn z '''$2''' ('''$1''' ɣ uggar).",
-       "rclistfrom": "Mel imbdeltn imaynutn z $1",
+       "rclistfrom": "Mel imbdeltn imaynutn z $3 $2",
        "rcshowhideminor": "$1 iẓṛign fssusnin",
        "rcshowhidebots": "$1 butn",
        "rcshowhideliu": "$1 midn li ttuyqqiyadnin",
index b4c9787..2b0e7f7 100644 (file)
@@ -21,7 +21,8 @@
                        "බිඟුවා",
                        "රොමානිස් සැමුවෙල්",
                        "ශ්වෙත",
-                       "සුරනිමල"
+                       "සුරනිමල",
+                       "아라"
                ]
        },
        "tog-underline": "සබැඳි යටීර කිරීම:",
@@ -34,7 +35,6 @@
        "tog-showtoolbar": "සංස්කරණ මෙවලම්තීරුව පෙන්වන්න",
        "tog-editondblclick": "ද්විත්ව-ක්ලික් කිරීම මගින් පිටු සංස්කරණය අරඹන්න",
        "tog-editsectiononrightclick": "ඡේද ශීර්ෂ මත දකුණු-ක්ලික් කිරීමෙන් ඡේද සංස්කරණය සක්‍රීය කරන්න (ජාවාස්ක්‍රිප්ට්)",
-       "tog-rememberpassword": "මගේ ප්‍රවිෂ්ටය මෙම ගවේශකයෙහි උපරිම ලෙස {{PLURAL:$1|දිනයක්|දින $1ක්}} මතක තබා ගන්න",
        "tog-watchcreations": "මම තනන පිටු හා මම උඩුගත කරන ගොනු මාගේ මුරලැයිස්තුවට එක් කරන්න",
        "tog-watchdefault": "මම සංස්කරණය කරන පිටු හා ගොනු මාගේ මුර ලැයිස්තුවට එක් කරන්න",
        "tog-watchmoves": "මම ගෙනයන පිටු හා ගොනු මාගේ මුර ලැයිස්තුවට එක් කරන්න",
        "permalink": "ස්ථාවර සබැඳුම",
        "print": "මුද්‍රණය කරන්න",
        "view": "දසුන",
+       "view-foreign": "$1 බලන්න",
        "edit": "සංස්කරණය",
+       "edit-local": "ස්ථානික විස්තරය සංස්කරනය කරන්න",
        "create": "තනන්න",
+       "create-local": "ස්ථානීය විස්තරයක් එක් කරන්න",
        "editthispage": "මෙම පිටුව සංස්කරණය කරන්න",
        "create-this-page": "මෙම පිටුව තනන්න",
        "delete": "මකන්න",
        "jumptonavigation": "සංචලනය",
        "jumptosearch": "සොයන්න",
        "view-pool-error": "සමාවන්න, ස'වරයන් මෙම අවස්ථාවෙහිදී අධිපූරණය වී ඇත.\nපමණට වඩා පරිශීලක පිරිසක් මෙම පිටුව නැරඹීමට උත්සහ දරති.\nමද වේලාවක් පමාවී නැවත උත්සාහ කරන්න.\n\n$1",
+       "generic-pool-error": "සමාවන්න, මේ මොහොතේ සර්වරයන් උපරිමව භාවිතා කෙරෙමින් පවතී. \nබොහෝ පිරිසක් මෙම පිටුව නැරඹීමට උත්සහ දරති.\nකරුණාකර මද වේලාවක් ප්‍රමාද වී නැවත උත්සාහ කරන්න.",
        "pool-timeout": "අගුල සඳහා බලාපොරොත්තුවෙන් සිටීම කල් ඉකුත්වනලදී",
        "pool-queuefull": "පොරොත්තු ලේඛනය පිරී ඇත",
        "pool-errorunknown": "හඳුනා නොගත් දෝෂය",
        "readonly_lag": "ගෝල(slave) දත්තසංචිත සර්වරයන්හි ක්‍රියාශීලිත්වය  ගුරු(master) සර්වර මට්ටමට පත් වන තෙක් දත්තසංචිතය ස්වයංක්‍රීව අගළුලා ඇත",
        "internalerror": "අභ්‍යන්තර දෝෂය",
        "internalerror_info": "අභ්‍යන්තර දෝෂය: $1",
-       "fileappenderrorread": "එක්කිරීමේදී \"$1\" නියවීමට නොහැකි විය.",
-       "fileappenderror": "\"$2\" වෙත \"$1\" යා කල නොහැක.",
        "filecopyerror": "\"$1\" ගොනුව \"$2\" වෙත පිටපත් කිරීමට නොහැකි විය.",
        "filerenameerror": "\"$1\" ගොනුව \"$2\" බවට යළි-නම්-කිරීම සිදු කල නොහැකි විය.",
        "filedeleteerror": "\"$1\" ගොනුව මකා-දැමිය නොහැකි විය.",
        "directorycreateerror": "\"$1\" නාමාවලිය තැනීම කල නොහැකි විය.",
        "filenotfound": "\"$1\" ගොනුව සොයා ගත නොහැකි විය.",
-       "fileexistserror": "\"$1\" ගොනුව වෙත ලිවීම කල නොහැකි විය: ගොනුව පවතියි",
        "unexpected": "අනපේක්‍ෂිත අගය: \"$1\"=\"$2\".",
        "formerror": "දෝෂය: ආකෘති-පත්‍රය ඉදිරිපත් කල නොහැකි විය",
        "badarticleerror": "මෙම පිටුව විෂයයෙහි මෙම කාර්යය ඉටු නල නොහැකි විය.",
        "userlogin-resetpassword-link": "ඔබේ මුරපදය නැති වුනාද?",
        "userlogin-loggedin": "ඔබ දැනටමත් {{GENDER:$1|}} ලෙස පිවිසී ඇත.\nනව පරිශීලකයෙකු ලෙස ඇතුළු වීමට පහත ආකෘතිය පුරවන්න.",
        "userlogin-createanother": "තවත් ගිණුමක් ආරම්භ කරන්න",
-       "createacct-join": "ඔබගේ තොරතුරු පහත ඇතුළු කරන්න.",
-       "createacct-another-join": "නව ගිණුමේ දත්ත පහත ඇතුළු කරන්න.",
        "createacct-emailrequired": "වි-තැපෑල ලිපිනය",
        "createacct-emailoptional": "වි-තැපෑල ලිපිනය (විකල්ප)",
        "createacct-email-ph": "ඔබගේ වි-තැපෑල ලිපිනය ඇතුළු කරන්න",
        "savearticle": "පිටුව සුරකින්න",
        "preview": "පෙරදසුන",
        "showpreview": "පෙරදසුන පෙන්වන්න",
-       "showlivepreview": "තත්කාල පෙර-දසුන",
        "showdiff": "වෙනස්කිරීම් පෙන්වන්න",
        "anoneditwarning": "'''අවවාදයයි:''' ඔබ පරිශීලකයෙකු වශයෙන් පද්ධතියට ප්‍රවිෂ්ට වී නොමැත.\nඔබගේ අයිපී යොමුව මෙම පිටුවෙහි සංස්කරණ ඉතිහාසයෙහි වාර්තාගත වෙනු ඇත",
        "anonpreviewwarning": "අවවාදයයි: ඔබ පරිශීලකයෙකු වශයෙන් පද්ධතියට ප්‍රවිෂ්ට වී නොමැත. එමනිසා මෙම පිටුවෙහි සංස්කරණ ඉතිහාසයෙහි, ඔබගේ අන්තර්ජාල ලිපිනය සටහන් කරගැනීමට සිදුවනු ඇත.",
        "edit-gone-missing": "පිටුව යාවත්කාල කිරීම සිදුකල නොහැකි විය.\nඑය මකා දමා ඇති බවක් පෙනේ.",
        "edit-conflict": "සංස්කරණ ගැටුම.",
        "edit-no-change": "පෙළට කිසිදු වෙනසක් සිදු නොකල  බැවින් ඔබගේ සංස්කරණය නොසලකාහරින ලදි.",
-       "postedit-confirmation": "ඔබගේ සංස්කරණය සුරකින ලදී.",
+       "postedit-confirmation-saved": "ඔබගේ සංස්කරණය සුරකින ලදී.",
        "edit-already-exists": "නව පිටුවක් තැනිය නොහැකි විය.\nඑය දැනටමත් පවතියි.",
        "defaultmessagetext": "සාමාන්‍ය පණිවුඩ පෙළ",
        "invalid-content-data": "වලංගු නොවන අන්තර්ගත දත්ත",
        "search-nonefound": "විමසුම හා ගැලපෙන ප්‍රතිඵල කිසිවක් නොමැත.",
        "powersearch-legend": "වැඩිමනත් ගවේෂණය",
        "powersearch-ns": "නාමඅවකාශයන්හි ගවේෂණය කරන්න:",
-       "powersearch-redir": "යළි-යොමු ලැයිස්තුගත කරන්න",
        "powersearch-togglelabel": "පිරික්සන්න:",
        "powersearch-toggleall": "සියල්ල",
        "powersearch-togglenone": "කිසිවක් නොමැත",
        "prefs-emailconfirm-label": "විද්‍යුත්-ලිපිනය තහවුරුකිරීම:",
        "youremail": "විද්‍යුත් තැපෑල:",
        "username": "{{GENDER:$1|පරිශීලක නාමය}}:",
-       "uid": "{{GENDER:$1|පරිශීලක}} අනන්‍යාංකය:",
        "prefs-memberingroups": "ඉදිරියේ දැක්වෙන {{PLURAL:$1|කණ්ඩායමෙහි|කණ්ඩායම් වල}} {{GENDER:$2|සාමාජිකයෙකි}}:",
        "prefs-registration": "ලියාපදිංචිවූ වේලාව:",
        "yourrealname": "සැබෑ නාමය:",
        "prefs-advancedsearchoptions": "ප්‍රගත විකල්පයන්",
        "prefs-advancedwatchlist": "වැඩිදුර සැකසුම් තෝරාගැනීම",
        "prefs-displayrc": "දර්ශන සැකසුම් තෝරාගැනීම",
-       "prefs-displaysearchoptions": "විකල්ප පෙන්වන්න",
        "prefs-displaywatchlist": "විකල්ප පෙන්වන්න",
        "prefs-tokenwatchlist": "ටෝකනය",
        "prefs-diffs": "වෙනස",
        "recentchanges-label-unpatrolled": "මෙම සංස්කරණය තවම විමර්ශනය කර නොමැත",
        "recentchanges-legend-newpage": "$1 -  නව පිටුව",
        "rcnotefrom": "'''$2''' න් පසු සිදුවී ඇති වෙනස්කම් මෙහි පහත දැක්වේ ('''$1''' ක ප්‍රමාණයක උපරිමයක් පෙන්වා ඇත).",
-       "rclistfrom": "$1 සිට බලපැවැත්වෙන මෑත වෙනස්වීම් පෙන්වන්න",
+       "rclistfrom": "$3 $2 සිට බලපැවැත්වෙන මෑත වෙනස්වීම් පෙන්වන්න",
        "rcshowhideminor": "සුළු සංස්කරණ $1",
        "rcshowhideminor-show": "පෙන්වන්න",
        "rcshowhideminor-hide": "සඟවන්න",
        "uploadstash-refresh": "ගොනු ලැයිස්තුව යළි-පුබුදුවන්න",
        "invalid-chunk-offset": "වලංගු නොවන ලොකු කොටසක මුද්‍රිත ඡායාරූපයක්",
        "img-auth-accessdenied": "ප්‍රවේශය තහනම් කර ඇත",
-       "img-auth-nopathinfo": "PATH_INFO සපයා නොමැත.\nමෙම තොරතුරු සැපයීම සඳහා ඔබගේ සේවා දායකයේ පරිස්ථිතීන් සකසා නොමැත.\nඑය CGI-පාදක වූවක් විය හැකි අතර img_auth සඳහා සහය නොදක්වයි.\nhttps://www.mediawiki.org/wiki/Manual:Image_Authorization බලන්න.",
+       "img-auth-nopathinfo": "PATH_INFO සපයා නොමැත.\nමෙම තොරතුරු සැපයීම සඳහා ඔබගේ සේවා දායකයේ පරිස්ථිතීන් සකසා නොමැත.\nඑය CGI-පාදක වූවක් විය හැකි අතර img_auth සඳහා සහය නොදක්වයි.\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization බලන්න.",
        "img-auth-notindir": "ඉල්ලුම් කළ පෙත වින්‍යසගත උඩුගත කිරීම් නාමාවලියේ නැත.",
        "img-auth-badtitle": "\"$1\" මඟින් වලංගු මාතෘකාවක් ගොඩනැගිය නොහැකිය.",
        "img-auth-nologinnWL": "ඔබ ඇතුල් වී නොමැති අතර \"$1\" සුදු ලැයිස්තුවේ නොමැත.",
        "logempty": "ලඝු-සටහනෙහි ගැලපෙන අයිතමයන් කිසිවක් නොමැත.",
        "log-title-wildcard": "මෙම පෙළෙන් ඇරඹෙන ශීර්ෂ සඳහා ගවේෂණය කරන්න",
        "allpages": "සියළු පිටු",
-       "alphaindexline": "$1 සි‍ට $2 වෙත",
        "nextpage": "මීළඟ පිටුව ($1)",
        "prevpage": "පෙර පිටුව ($1)",
        "allpagesfrom": "මෙහිදී ඇරඹෙන පිටු පෙන්වන්න:",
        "watchlist-details": "සාකච්ඡා පිටු නොගිණුනු කල, ඔබගේ මුර ලැයිස්තුවෙහි {{PLURAL:$1|එක් පිටුවක්|පිටු $1 ක්}} ඇත.",
        "wlheader-enotif": "විද්‍යුත්-තැපැල් දැනුම්දීම සක්‍රීය කෙරිණි.",
        "wlheader-showupdated": "ඔබ විසින් ඒවාට අවසන් වරට පිවිසුනු පසුව වෙනස්කෙරුනු පිටු  '''තදකුරු''' වලින් පෙන්වා ඇත",
-       "watchmethod-recent": "මුර-කෙරෙන පිටු සඳහා මෑත සංස්කරණයන් පරික්‍ෂා කරමින්",
-       "watchmethod-list": "මෑත සංස්කරණයන් සඳහා මුර-කෙරෙන පිටු පරික්‍ෂා කරමින්",
-       "watchlistcontains": "ඔබගේ මුර-ලැයිස්තුවෙහි  {{PLURAL:$1|එක් පිටුවක්|පිටු $1 ක්}} අඩංගුය.",
-       "iteminvalidname": "'$1' අයිතමය පිළිබඳ ගැටළුවක් ඇත, අනීතික නමකි...",
        "wlshowlast": "පසුගිය පැය $1 දින $2 $3 පෙන්වන්න",
        "watchlist-options": "තෝරාගතහැකි මුර ලැයිස්තු සැකසුම්",
        "watching": "මුර කරමින්...",
        "enotif_lastvisited": "ඔබගේ අවසාන පිවිසුමට පසු සිදුවූ සියළු වෙනස්වීම් නැරඹුමට $1 බලන්න.",
        "enotif_lastdiff": "මෙම වෙනස නැරඹීම සඳහා $1 බලන්න.",
        "enotif_anon_editor": "නිර්නාමික පරිශීලක $1",
-       "enotif_body": "හිතවත් $WATCHINGUSERNAME,\n\n\n{{SITENAME}} මත ඇති $PAGETITLE පිටුව $PAGEEDITOR විසින් $PAGEEDITDATE වැනි දින $CHANGEDORCREATED, වර්තමාන සංශෝධනය සදහා $PAGETITLE_URL බලන්න.\n\n$NEWPAGE\n\nEditor's summary: $PAGESUMMARY $PAGEMINOREDIT\n\nContact the editor:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nThere will be no other notifications in case of further changes unless you visit this page.\nYou could also reset the notification flags for all your watched pages on your watchlist.\n\n             Your friendly {{SITENAME}} notification system\n\n--\nTo change your email notification settings, visit\n{{canonicalurl:{{#special:Preferences}}}}\n\nTo change your watchlist settings, visit\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nTo delete the page from your watchlist, visit\n$UNWATCHURL\n\nFeedback and further assistance:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "හිතවත් $WATCHINGUSERNAME,\n\n\n{{SITENAME}} මත ඇති $PAGETITLE පිටුව $PAGEEDITOR විසින් $PAGEEDITDATE වැනි දින $CHANGEDORCREATED, වර්තමාන සංශෝධනය සදහා $PAGETITLE_URL බලන්න.\n\n$NEWPAGE\n\nEditor's summary: $PAGESUMMARY $PAGEMINOREDIT\n\nContact the editor:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nThere will be no other notifications in case of further changes unless you visit this page.\nYou could also reset the notification flags for all your watched pages on your watchlist.\n\n             Your friendly {{SITENAME}} notification system\n\n--\nTo change your email notification settings, visit\n{{canonicalurl:{{#special:Preferences}}}}\n\nTo change your watchlist settings, visit\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nTo delete the page from your watchlist, visit\n$UNWATCHURL\n\nFeedback and further assistance:\n$HELPPAGE",
        "created": "තනන ලදි",
        "changed": "වෙනස්කරන ලදි",
        "deletepage": "පිටුව මකා දමන්න",
        "blockip": "පරිශීලකයා වාරණය කරන්න",
        "blockip-legend": "වාරණයකල පරිශීලක",
        "blockiptext": "විශේෂිත අන්තර්ජාල ලිපිනයකින් හෝ ප්‍රතිශීලක නාමයකින් ලිවීම් ප්‍රවේශය වාරණය කෙරුමට පහත ආකෘති පත්‍රය භාවිතා කරන්න.\nවන්ධල්‍යය වැලැක්වීමේ හුදු  අභිලාෂයෙන් හා, [[{{MediaWiki:Policy-url}}|ප්‍රතිපත්ති]] ප්‍රකාරව මෙය සිදුකල යුත්තේය.\nවිශේෂිත  හේතුවක් මෙහි පහත ඇතුලත් කරන්න (නිදසුනක් ලෙස, වන්ධල්‍ය්‍යට ලක්වුනු විශේෂිත පිටු හඳුන්වමින්).",
-       "ipadressorusername": "පරිශීලක නාමය හෝ IP ලිපිනය:",
+       "ipaddressorusername": "පරිශීලක නාමය හෝ IP ලිපිනය:",
        "ipbexpiry": "කල් ඉකුත්වීම:",
        "ipbreason": "හේතුව:",
        "ipbreason-dropdown": "*සාමාන්‍ය වාරණ හේතූන්\n** සාවද්‍ය තොරතුරු බහාලීම\n** පිටුවලින් අන්තර්ගතය ඉවත්කිරීම\n** බාහිර අඩවි වෙත අයාචිත-තැපැල් සබැඳියන්\n** විප්‍රලාප /පල්හෑලි පිටු තුලට බහාලීම\n** තැතිගන්වනසුළු  හැසිරීම/හිරිහැරකිරීම\n** බහුගණ ගිනුම් අපයෙදුම\n** නොපිළිගතහැකි පරිශීලකනාමය",
        "cologneblue.js": "/* මෙහි ඕනෑම ජාවාස්ක්‍රිප්ට් එකක් සිහිල්-සුවඳ-පැන් ඡවිය භාවිතා කරන පරිශීලකයන්හට ප්‍රවේශනය කෙරේ */",
        "monobook.js": "/* මෙහි ඕනෑම ජාවාස්ක්‍රිප්ට් එකක් ඒකායන ඡවිය භාවිතා කරන පරිශීලකයන්හට ප්‍රවේශනය කෙරේ */",
        "modern.js": "/* මෙහි ඕනෑම ජාවාස්ක්‍රිප්ට් එකක් නූතන ඡවිය භාවිතා කරන පරිශීලකයන්හට ප්‍රවේශනය කෙරේ */",
-       "notacceptable": "ඔබගේ සේවාලාභියාට කියැවිය හැකි ආකෘතියකින් දත්ත සැපැයීමට විකි සේවාදායකයට නොහැක.",
        "anonymous": "{{SITENAME}} හි නිර්නාමික {{PLURAL:$1|පරිශීලකයා|පරිශීලකයෝ}}",
        "siteuser": "{{SITENAME}} පරිශීලක $1",
        "anonuser": "{{SITENAME}} නිර්නාමික පරිශීලක $1",
        "newimages-summary": "මෙම විශේෂ පිටුව, අවසානයට උඩුගත කෙරුණු ගොනු පෙන්වයි.",
        "newimages-legend": "පෙරහන",
        "newimages-label": "ගොනු නාමය (හෝ එයින් කොටසක්):",
-       "showhidebots": "(රොබෝ $1 දෙනෙක්)",
        "noimages": "පෙනෙන්නට කිසිවක් නොමැත.",
        "ilsubmit": "ගවේෂණය",
        "bydate": "දිනය මගිනි",
        "size-kilobytes": "$1 කි.බ.",
        "size-megabytes": "$1 මෙ.බ.",
        "size-gigabytes": "$1 ගි.බ.",
-       "livepreview-loading": "බා ගැනෙමින්…",
-       "livepreview-ready": "බා ගැනෙමින්… සූදානම්!",
-       "livepreview-failed": "තත්කාල පෙර-දසුන අසමත් විය! සාමාන්‍ය පෙර-දසුන  වෑයම් කරන්න.",
-       "livepreview-error": "මෙය හා සම්බන්ධ වීම අසාර්ථක විය: $1 \"$2\".\nසාමාන්‍ය පෙර-දසුන අත්හදා බලන්න.",
        "lag-warn-normal": "{{PLURAL:$1|තත්පරයකට|තත්පර $1 කට}} වඩා නැවුම් වෙනස්වීම්, ලැයිස්තුවෙහි පෙන්නුම් නොවීමට ඉඩ ඇත.",
        "lag-warn-high": "දත්තසංචිත ස'වරයේ අධි විලම්බය නිසා, වෙනස්වීමට පසු ගතවූයේ  {{PLURAL:$1|එක් තත්පරයක්|තත්පර $1 ක්}} පමණක් නම්, ලැයිස්තුවෙහි අන්තර්ගතවී නොතිබිය හැක.",
-       "watchlistedit-numitems": "සාකච්ඡා පිටු ගණනය නොකල විට, ඔබගේ මුර-ලැයිස්තුවෙහි  {{PLURAL:$1|ශීර්ෂ එකක්|ශීර්ෂ $1 ක්}} අඩංගු වේ.",
-       "watchlistedit-noitems": "ඔබගේ මුර-ලැයිස්තුවේ ශීර්ෂ කිසිවක් නොමැත.",
        "watchlistedit-normal-title": "මුර-ලැයිස්තුව සංස්කරණය කරන්න",
        "watchlistedit-normal-legend": "මුර-ලැයිස්තුවෙන් ශීර්ෂයන් ඉවත් කරන්න",
        "watchlistedit-normal-explain": "ඔබගේ මුර-ලැයිස්තුවෙහි සිරස්තලයන් පහත දක්වා ඇත.\nසිරස්තලයක් ඉවත් කිරීමට, එය‍ට යාබද කොටුව තෝරාගෙන, සිරස්තල ඉවත්කරන්න යන්න මත ක්ලික් කරන්න.\n[[Special:EditWatchlist/raw|නොනිමි ලැයිස්තුව සංස්කරණය කිරීම]] වුවද ඔබ විසින් සිදු කල හැක.",
        "watchlistedit-raw-done": "ඔබගේ මුර-ලැයිස්තුව යාවත්කාලීන කරන ලදි.",
        "watchlistedit-raw-added": "{{PLURAL:$1|ශීර්ෂ 1 ක් |ශීර්ෂ  $1 ක් }} එක් කරන ලදි:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|ශීර්ෂ 1 ක්|ශීර්ෂ  $1 ක්}} ඉවත් කරන ලදි:",
+       "watchlistedit-clear-titles": "ශීර්ෂයන්:",
        "watchlisttools-view": "අදාල වෙනස්වීම් නරඹන්න",
        "watchlisttools-edit": "මුර ලැයිස්තුව නැරඹීම හා සංස්කරණය",
        "watchlisttools-raw": "නොනිමි මුර ලැයිස්තුව සංස්කරණය කරන්න",
        "compare-invalid-title": "ඔබ සඳහන් කළ මාතෘකාව වලංගු නොවේ.",
        "compare-title-not-exists": "ඔබ විසින් විශේෂණය කෙරූ මාතෘකාව නොපවතියි.",
        "compare-revision-not-exists": "ඔබ විසින් විශේෂණය කෙරූ සංශෝධනය නොපවතියි.",
-       "dberr-header": "මෙම විකියෙහි ගැටළුවක් පවතියි",
        "dberr-problems": "සමාවන්න! මෙම අඩවිය තාක්ෂණික ගැටළු අත්දකියි.",
        "dberr-again": "විනාඩි කිහිපයක් කල්ගතකර යළි-බාගැනුම උත්සාහ කරන්න.",
        "dberr-info": "(දත්තගබඩා සේවාදායකය හා සම්බන්ධ වීම‍ට නොහැක: $1)",
index 9f75070..f9e4885 100644 (file)
@@ -25,7 +25,8 @@
                        "Urhixidur",
                        "Valasek",
                        "Wizzard",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Podčiarkovať odkazy:",
        "readonly_lag": "Databáza bola automaticky zamknutá pokým záložné databázové servery nedoženú hlavný server",
        "internalerror": "Vnútorná chyba",
        "internalerror_info": "Vnútorná chyba: $1",
-       "fileappenderrorread": "Počas pridávania sa nepodarilo prečítať „$1“.",
-       "fileappenderror": "Nepodarilo sa pridať „$1“ k „$2“.",
        "filecopyerror": "Nebolo možné skopírovať súbor „$1“ na „$2“.",
        "filerenameerror": "Nebolo možné premenovať súbor „$1“ na „$2“.",
        "filedeleteerror": "Nebolo možné vymazať súbor „$1“.",
        "directorycreateerror": "Nebolo možné vytvoriť adresár „$1“.",
        "filenotfound": "Nebolo možné nájsť súbor „$1“.",
-       "fileexistserror": "Nebolo možné zapisovať do súboru „$1“: súbor existuje",
        "unexpected": "Neočakávaná hodnota: „$1“=„$2“.",
        "formerror": "Chyba: nepodarilo sa odoslať formulár",
        "badarticleerror": "Na tejto stránke túto činnosť nemožno vykonať.",
        "userlogin-helplink2": "Pomoc s prihlásením",
        "userlogin-loggedin": "Ste už {{GENDER:$1|prihĺasený|prihlásená}} ako $1.\nPomocou formulára nižšie sa môžete prihlásiť ako iný redaktor.",
        "userlogin-createanother": "Vytvoriť ďalší účet",
-       "createacct-join": "Vyplňte svoje údaje.",
-       "createacct-another-join": "Vyplňte údaje nového účtu.",
        "createacct-emailrequired": "E-mailová adresa",
        "createacct-emailoptional": "E-mailová adresa (nepovinné)",
        "createacct-email-ph": "Zadajte vašu e-mailovú adresu",
        "savearticle": "Uložiť stránku",
        "preview": "Náhľad",
        "showpreview": "Zobraziť náhľad",
-       "showlivepreview": "Živý 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.",
        "anonpreviewwarning": "''Nie ste prihlásený. Uložením zaznamenáte svoju IP adresu do histórie úprav tejto stránky.''",
        "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": "Vaša úprava bola uložená.",
+       "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",
        "content-failed-to-parse": "Nepodarilo sa spracovať obsah $2 pre model $1: $3",
        "search-nonefound": "Vyhľadávanie nenašlo žiadne výsledky.",
        "powersearch-legend": "Pokročilé hľadanie",
        "powersearch-ns": "Hľadať v menných priestoroch:",
-       "powersearch-redir": "Vypísať presmerovania",
        "powersearch-togglelabel": "Skontrolovať:",
        "powersearch-toggleall": "Všetky",
        "powersearch-togglenone": "Žiadne",
        "prefs-emailconfirm-label": "Potvrdenie emailu:",
        "youremail": "Váš e-mail²",
        "username": "{{GENDER:$1|Používateľské meno}}:",
-       "uid": "ID {{GENDER:$1|používateľa}}:",
        "prefs-memberingroups": "{{GENDER:$2|Člen|Členovia}} {{PLURAL:$1|skupiny|skupín}}:",
        "prefs-registration": "Čas registrácie:",
        "yourrealname": "Skutočné meno *:",
        "prefs-advancedsearchoptions": "Rozšírené možnosti",
        "prefs-advancedwatchlist": "Rozšírené možnosti",
        "prefs-displayrc": "Možnosti zobrazenia",
-       "prefs-displaysearchoptions": "Možnosti zobrazenia",
        "prefs-displaywatchlist": "Možnosti zobrazenia",
        "prefs-diffs": "Rozdiely",
        "prefs-help-prefershttps": "Táto voľba sa prejaví pri vašom ďalšom prihlásení.",
        "recentchanges-legend-heading": "'''Legenda:'''",
        "recentchanges-legend-newpage": "(pozri tiež [[Special:NewPages|zoznam nových stránok]])",
        "rcnotefrom": "Nižšie sú zobrazené úpravy od <strong>$2</strong> (do <strong>$1</strong>).",
-       "rclistfrom": "Zobraziť nové úpravy počnúc od $1",
+       "rclistfrom": "Zobraziť nové úpravy počnúc od $3 $2",
        "rcshowhideminor": "$1 drobné úpravy",
        "rcshowhideminor-show": "Zobraziť",
        "rcshowhideminor-hide": "Skryť",
        "uploadstash-refresh": "Obnoviť zoznam súborov",
        "invalid-chunk-offset": "Neplatný posun bloku",
        "img-auth-accessdenied": "Prístup zamietnutý",
-       "img-auth-nopathinfo": "Váš server nie je nastavený tak, aby poskytoval tieto informácie.\nMôže byť založený na CGI a nedokáže podporovať img_auth.\nPozri https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "Váš server nie je nastavený tak, aby poskytoval tieto informácie.\nMôže byť založený na CGI a nedokáže podporovať img_auth.\nPozri https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Požadovaná cesta nie je v nastavenom adresári na nahrávanie.",
        "img-auth-badtitle": "Nepodarilo sa zostaviť platný názov z „$1“.",
        "img-auth-nologinnWL": "Nie ste prihlásený a „$1“ nie je na bielej listine.",
        "log-title-wildcard": "Hľadať názvy začínajúce týmto textom",
        "showhideselectedlogentries": "Zobraziť/skryť vybraté položky záznamu",
        "allpages": "Všetky stránky",
-       "alphaindexline": "$1 do $2",
        "nextpage": "Ďalšia stránka ($1)",
        "prevpage": "Predchádzajúca stránka ($1)",
        "allpagesfrom": "Zobraziť stránky od:",
        "listgrouprights-removegroup-self": "Z vlastného účtu je možné odstrániť {{PLURAL:$2|skupinu|skupiny}}: $1",
        "listgrouprights-addgroup-self-all": "Do vlastného účtu je možné pridať všetky skupiny",
        "listgrouprights-removegroup-self-all": "Z vlastného účtu je možné odstrániť všetky skupiny",
+       "listgrouprights-namespaceprotection-header": "Obmedzenia menných priestorov",
+       "listgrouprights-namespaceprotection-namespace": "Menný priestor",
+       "listgrouprights-namespaceprotection-restrictedto": "Práva umožňujúce redaktorovi upravovať",
+       "trackingcategories": "Sledovacie kategórie",
+       "trackingcategories-summary": "Táto stránka obsahuje zoznam sledovacích kategórií, ktoré automaticky pridáva softvér MediaWiki. Ich mená je možné zmeniť úpravou príslušných systémových hlásení v mennom priestore {{ns:8}}.",
        "trackingcategories-msg": "Sledovacia kategória",
        "trackingcategories-name": "Názov správy",
        "trackingcategories-desc": "Kritériá pre zaradenie do kategórie",
+       "noindex-category-desc": "Stránka nieje indexovaná robotmi, pretože obsahuje magické slovo <code><nowiki>__NOINDEX__</nowiki></code> a je v mennom priestore, v ktorom je tento príznak povolený.",
        "trackingcategories-nodesc": "Popis nie je k dispozícii.",
        "trackingcategories-disabled": "Kategória je vypnutá",
        "mailnologin": "Žiadna adresa na zaslanie",
        "watchlist-details": "{{PLURAL:$1|Jedna sledovaná stránka|$1 sledované stránky|$1 sledovaných stránok}}, nepočítajúc diskusné stránky.",
        "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'''.",
-       "watchmethod-recent": "kontrolujú sa sledované stránky v posledných úpravách",
-       "watchmethod-list": "kontrolujú posledné úpravy v sledovaných stránkach",
-       "watchlistcontains": "Váš zoznam sledovaných obsahuje {{PLURAL:$1|jednu stránku|$1 stránky|$1 stránok}}.",
-       "iteminvalidname": "Problém s položkou „$1“, neplatné meno...",
        "wlshowlast": "Zobraziť posledných $1 hodín $2 dní $3",
        "watchlist-options": "Nastavenia zoznamu sledovaných",
        "watching": "Pridávam do zoznamu sledovaných...",
        "sp-contributions-newbies-sub": "Príspevky nováčikov",
        "sp-contributions-newbies-title": "Príspevky nových používateľov",
        "sp-contributions-blocklog": "záznam blokovaní",
+       "sp-contributions-suppresslog": "utajené príspevky redaktora",
        "sp-contributions-deleted": "zmazané príspevky používateľa",
        "sp-contributions-uploads": "nahrané súbory",
        "sp-contributions-logs": "záznamy",
        "blockip": "Zablokovať používateľa",
        "blockip-legend": "Zablokovať používateľa",
        "blockiptext": "Použite tento formulár na zablokovanie možnosti zápisov uskutočnených z konkrétnej IP adresy alebo od používateľa.\nMali by ste to urobiť len v prípade bránenia vandalizmu a v súlade so [[{{MediaWiki:Policy-url}}|zásadami a smernicami {{GRAMMAR:genitív|{{SITENAME}}}}]].\nNižšie uveďte konkrétny dôvod (napríklad uveďte konkrétne stránky, ktoré padli za obeť vandalizmu).",
-       "ipadressorusername": "IP adresa/meno používateľa:",
+       "ipaddressorusername": "IP adresa/meno používateľa:",
        "ipbexpiry": "Ukončenie:",
        "ipbreason": "Dôvod:",
        "ipbreason-dropdown": "* Bežné dôvody blokovania\n** Zámerné vkladanie chybných informácií\n** Mazanie obsahu stránok\n** Spam odkazy na externé stránky\n** Vkladanie nezmyslov do stránok\n** Zastrašujúce správanie/obťažovanie\n** Zneužívanie viacerých účtov\n** Neprípustné používateľské meno",
        "group-bot.js": "/* Tu sa nachádzajúci JavaScript sa načíta len robotom */",
        "group-sysop.js": "/* Tu sa nachádzajúci JavaScript sa načíta len správcom */",
        "group-bureaucrat.js": "/* Tu sa nachádzajúci JavaScript sa načíta len byrokratom */",
-       "notacceptable": "Wiki server nedokáže poskytovať dáta vo formáte, v akom ich váš klient vie čítať.",
        "anonymous": "$1 {{PLURAL:$1|anonymný používateľ|anonymní používatelia|anonymných používateľov}} {{GRAMMAR:genitív|{{SITENAME}}}}",
        "siteuser": "používateľ {{GRAMMAR:genitív|{{SITENAME}}}} $1",
        "anonuser": "anonymný používateľ {{GRAMMAR:genitív|{{SITENAME}}}} $1",
        "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ť):",
-       "showhidebots": "($1 botov)",
        "noimages": "Niet čo zobraziť.",
        "ilsubmit": "Hľadať",
        "bydate": "podľa dátumu",
        "imgmultigo": "Vykonať",
        "imgmultigoto": "Prejsť na stránku $1",
        "img-lang-default": "(predvolený jazyk)",
+       "img-lang-info": "Vykresliť tento obrázok v jazyku $1 $2",
        "img-lang-go": "Vykonať",
        "ascending_abbrev": "vzostupne",
        "descending_abbrev": "zostupne",
        "autosumm-replace": "Nahrádzam stránku textom „$1“",
        "autoredircomment": "Presmerovanie na [[$1]]",
        "autosumm-new": "Vytvorená stránka „$1“",
-       "livepreview-loading": "Načítava sa…",
-       "livepreview-ready": "Načítavanie dokončené!",
-       "livepreview-failed": "Živý náhľad sa nepodarilo zrealizovať!\nSkúste obyčajný náhľad.",
-       "livepreview-error": "Nepodarilo sa pripojiť: $1 „$2“\nSkúste obyčajný náhľad.",
        "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-numitems": "Váš zoznam sledovaných stránok obsahuje {{PLURAL:$1|jednu stránku|$1 stránky|$1 stránok}} nepočítajúc diskusné stránky.",
-       "watchlistedit-noitems": "Váš zoznam sledovaných stránok obsahuje žiadne stránky.",
        "watchlistedit-normal-title": "Upraviť zoznam sledovaných stránok",
        "watchlistedit-normal-legend": "Odstrániť všetky stránky zo zoznamu sledovaných stránok",
        "watchlistedit-normal-explain": "Nižšie sú zobrazené stránky z vášho zoznamu sledovaných stránok.\nAk chcete odstrániť položku, začiarknite políčko vedľa nej a kliknite na „{{int:Watchlistedit-normal-submit}}“. Tiež môžete [[Special:EditWatchlist/raw|upravovať nespracovaný zoznam]].",
        "compare-invalid-title": "Názov, ktorý ste zadali nie je platný.",
        "compare-title-not-exists": "Názov, ktorý ste zadali neexistuje.",
        "compare-revision-not-exists": "Revízia, ktorú ste zadali, neexistuje.",
-       "dberr-header": "Táto wiki má problém",
        "dberr-problems": "Prepáčte! Táto stránka má práve technické problémy.",
        "dberr-again": "Skúste niekoľko minút počkať a potom opäť načítať stránku.",
        "dberr-info": "(Spojenie s databázovým serverom neúspešné: $1)",
index 9d532d8..bc2de72 100644 (file)
@@ -7,7 +7,9 @@
                        "Matej1234",
                        "Smihael",
                        "Vadgt",
-                       "Yerpo"
+                       "Yerpo",
+                       "아라",
+                       "MaGa"
                ]
        },
        "tog-underline": "Podčrtavanje povezav:",
@@ -20,8 +22,8 @@
        "tog-showtoolbar": "Prikaži urejevalno orodno vrstico",
        "tog-editondblclick": "Omogoči urejanje strani z dvojnim klikom",
        "tog-editsectiononrightclick": "Omogoči urejanje razdelkov z desnim klikanjem njihovih naslovov",
-       "tog-watchcreations": "Vse ustvarjene strani in moje naložene datoteke dodaj na spisek nadzorov",
-       "tog-watchdefault": "Dodaj na spisek nadzorov vse članke in datoteke, ki sem jih spremenil/-a",
+       "tog-watchcreations": "Na spisek nadzorov dodaj vse ustvarjene strani in moje naložene datoteke",
+       "tog-watchdefault": "Na spisek nadzorov dodaj vse članke in datoteke, ki sem jih spremenil/-a",
        "tog-watchmoves": "Dodaj strani in datoteke, ki jih premaknem, na moj spisek nadzorov",
        "tog-watchdeletion": "Dodaj strani in datoteke, ki jih izbrišem, na moj spisek nadzorov",
        "tog-minordefault": "Vsa urejanja označi kot manjša",
@@ -39,8 +41,8 @@
        "tog-watchlisthideown": "Na spisku nadzorov skrij moja urejanja",
        "tog-watchlisthidebots": "Na spisku nadzorov skrij urejanja botov",
        "tog-watchlisthideminor": "Na spisku nadzorov skrij manjša urejanja",
-       "tog-watchlisthideliu": "Skrij urejanja prijavljenih uporabnikov na spisku nadzorov",
-       "tog-watchlisthideanons": "Skrij urejanja anonimnih uporabnikov na spisku nadzorov",
+       "tog-watchlisthideliu": "Na spisku nadzorov skrij urejanja prijavljenih uporabnikov",
+       "tog-watchlisthideanons": "Na spisku nadzorov skrij urejanja anonimnih uporabnikov",
        "tog-watchlisthidepatrolled": "Na spisku nadzorov skrij pregledana urejanja",
        "tog-ccmeonemails": "Pošlji mi kopijo e-pošt, ki jih pošljem drugim uporabnikom",
        "tog-diffonly": "Pod primerjavo ne prikaži vsebine strani",
        "jumptonavigation": "navigacija",
        "jumptosearch": "iskanje",
        "view-pool-error": "Žal so strežniki trenutno preobremenjeni.\nPreveč uporabnikov skuša obiskati to stran.\nProsimo za potrpežljivost, obiščite nas spet kmalu.\n\n$1",
+       "generic-pool-error": "Žal so strežniki trenutno preobremenjeni.\nPreveč uporabnikov si skuša ogledati ta vir.\nProsimo za potrpežljivost, obiščite nas spet kmalu.",
        "pool-timeout": "Časovno obdobje čakanja na zaklep",
        "pool-queuefull": "Čakalna vrsta zaloge je polna",
        "pool-errorunknown": "Neznana napaka",
        "readonly_lag": "Podatkovna zbirka se je samodejno zaklenila, dokler se podrejeni strežniki ne uskladijo z glavnim.",
        "internalerror": "Notranja napaka",
        "internalerror_info": "Notranja napaka: $1",
-       "fileappenderrorread": "Ni bilo mogoče prebrati »$1« med pripenjanjem.",
-       "fileappenderror": "Ne morem pripeti »$1« v »$2«.",
        "filecopyerror": "Datoteke »$1« ni mogoče prepisati v »$2«.",
        "filerenameerror": "Datoteke »$1« ni mogoče preimenovati v »$2«.",
        "filedeleteerror": "Datoteke »$1« ni mogoče izbrisati.",
        "directorycreateerror": "Ne morem ustvariti direktorija »$1«.",
        "filenotfound": "Datoteke »$1« ne najdem.",
-       "fileexistserror": "Ne morem pisati v datoteko »$1«: datoteka obstaja",
        "unexpected": "Nepričakovana vrednost: \"$1\"=\"$2\".",
        "formerror": "Napaka: obrazca ni mogoče predložiti",
        "badarticleerror": "Na tej strani dejanja ne morem izvesti. Morda je bila stran med predložitvijo vaše zahteve že izbrisana.",
        "userlogin-helplink2": "Pomoč pri prijavi",
        "userlogin-loggedin": "Prijavljeni ste že kot {{GENDER:$1|$1}}.\nUporabite spodnji obrazec, da se prijavite kot drug uporabnik.",
        "userlogin-createanother": "Ustvari drug račun",
-       "createacct-join": "Spodaj vnesite svoje informacije.",
-       "createacct-another-join": "Spodaj vnesite informacije o novem računu.",
        "createacct-emailrequired": "E-poštni naslov",
        "createacct-emailoptional": "E-poštni naslov (izbirno)",
        "createacct-email-ph": "Vnesite svoj e-poštni naslov",
        "savearticle": "Shrani stran",
        "preview": "Predogled",
        "showpreview": "Prikaži predogled",
-       "showlivepreview": "Predogled v živo",
        "showdiff": "Prikaži spremembe",
        "anoneditwarning": "'''Opozorilo''': niste prijavljeni. V zgodovino strani se bo zapisal vaš IP-naslov.",
        "anonpreviewwarning": "Niste prijavljeni. Ob spremembi strani se bo vaš IP-naslov zapisal v zgodovini urejanja te strani.",
        "edit-gone-missing": "Strani ni mogoče posodobiti.\nIzgleda, da je bila izbrisana.",
        "edit-conflict": "Navzkrižje urejanj.",
        "edit-no-change": "Vaše urejanje je bilo prezrto, saj ni vsebovalo sprememb.",
-       "postedit-confirmation": "Vaše urejanje smo shranili.",
+       "postedit-confirmation-created": "Stran je bila ustvarjena.",
+       "postedit-confirmation-restored": "Stran je bila obnovljena.",
+       "postedit-confirmation-saved": "Vaše urejanje smo shranili.",
        "edit-already-exists": "Ni bilo mogoče ustvariti nove strani, ker že obstaja.",
        "defaultmessagetext": "Prednastavljeno besedilo",
        "content-failed-to-parse": "Nisem mogel razčleniti vsebine $2 za obliko $1: $3",
        "parser-template-recursion-depth-warning": "Prekoračena globina rekurzije predlog ($1)",
        "language-converter-depth-warning": "Prekoračena globina pretvorbe jezikov ($1)",
        "node-count-exceeded-category": "Strani s prekoračenim številom vozlišč",
+       "node-count-exceeded-category-desc": "Kategorija s stranmi, na katerih je preseženo število vozlišč.",
        "node-count-exceeded-warning": "Stran je prekoračila število vozlišč",
        "expansion-depth-exceeded-category": "Strani s prekoračeno globino razširitve",
+       "expansion-depth-exceeded-category-desc": "Kategorija s stranmi, na katerih je prekoračena globina razširitve.",
        "expansion-depth-exceeded-warning": "Stran je prekoračila globino razširitve",
        "parser-unstrip-loop-warning": "Zaznal sem odvezano zanko",
        "parser-unstrip-recursion-limit": "Presežena je omejitev odvezane rekurzije ($1)",
        "searchmenu-exists": "'''Na tem wikiju obstaja stran »[[:$1]]«'''",
        "searchmenu-new": "<strong>Ustvari stran »[[:$1]]« na tem wikiju!</strong> {{PLURAL:$2|0=|Oglejte si tudi rezultate iskanja.}}",
        "searchprofile-articles": "Članki",
-       "searchprofile-project": "Pomoč in projektne strani",
        "searchprofile-images": "Večpredstavnost",
        "searchprofile-everything": "Vse",
        "searchprofile-advanced": "Napredni pogled",
        "searchprofile-articles-tooltip": "Išči v $1",
-       "searchprofile-project-tooltip": "Išči v $1",
        "searchprofile-images-tooltip": "Išči datoteke",
        "searchprofile-everything-tooltip": "Išči po vsej vsebini (vključno s pogovornimi stranmi)",
        "searchprofile-advanced-tooltip": "Iskanje v imenskih prostorih po meri",
        "search-nonefound": "Ni bilo zadetkov, ki ustrezajo poizvedbi.",
        "powersearch-legend": "Napredno iskanje",
        "powersearch-ns": "Iskanje v imenskih prostorih:",
-       "powersearch-redir": "Seznam preusmeritev",
        "powersearch-togglelabel": "Izberi:",
        "powersearch-toggleall": "Vse",
        "powersearch-togglenone": "Nič",
        "recentchangescount": "Privzeto število prikazanih urejanj:",
        "prefs-help-recentchangescount": "Vključuje zadnje spremembe, zgodovine strani in dnevniške zapise.",
        "prefs-help-watchlist-token2": "To je skrivni ključ do spletnega vira vašega spiska nadzorov. Kdor ve zanj, lahko bere vaš spisek nadzorov, zato ključa ne delite. [[Special:ResetTokens|Kliknite tukaj, če ga želite ponastaviti]].",
-       "savedprefs": "Spremembe so bile uspešno shranjene.",
+       "savedprefs": "Spremembe smo uspešno shranili.",
        "timezonelegend": "Časovni pas",
        "localtime": "Krajevni čas:",
        "timezoneuseserverdefault": "Uporabi privzeti wiki čas ($1)",
        "prefs-emailconfirm-label": "Potrditev e-pošte:",
        "youremail": "E-poštni naslov:",
        "username": "{{GENDER:$1|Uporabniško|Uporabničino}} ime:",
-       "uid": "ID {{GENDER:$1|uporabnika|uporabnice}}:",
        "prefs-memberingroups": "{{GENDER:$2|Član|Članica}} {{PLURAL:$1|naslednje skupine|naslednjih skupin}}:",
        "prefs-memberingroups-type": "$1",
        "prefs-registration": "Registriran od:",
        "prefs-advancedsearchoptions": "Napredne možnosti",
        "prefs-advancedwatchlist": "Napredne možnosti",
        "prefs-displayrc": "Možnosti prikaza",
-       "prefs-displaysearchoptions": "Možnosti prikaza",
        "prefs-displaywatchlist": "Možnosti prikaza",
        "prefs-tokenwatchlist": "Žeton",
        "prefs-diffs": "Primerjave",
        "right-move": "Premikanje strani",
        "right-move-subpages": "Premikanje strani s pripadajočimi podstranmi",
        "right-move-rootuserpages": "Premikanje korenskih uporabniških strani",
+       "right-move-categorypages": "Prestavljanje strani kategorij",
        "right-movefile": "Premikanje datotek",
        "right-suppressredirect": "Možnost izpuščanja preusmeritve pri premikanju strani",
        "right-upload": "Nalaganje datotek",
        "action-createpage": "ustvarjenje strani",
        "action-createtalk": "ustvarjanje pogovornih strani",
        "action-createaccount": "registracija tega uporabniškega računa",
+       "action-history": "ogled zgodovine strani",
        "action-minoredit": "označevanje tega urejanja kot manjšega",
        "action-move": "premik te strani",
        "action-move-subpages": "premik te strani in njenih podstrani",
        "action-move-rootuserpages": "premik korenskih uporabniških strani",
+       "action-move-categorypages": "prestavljanje strani kategorij",
        "action-movefile": "premik te datoteke",
        "action-upload": "nalaganje te datoteke",
        "action-reupload": "prepis obstoječe datoteke",
        "recentchanges-legend-heading": "'''Legenda:'''",
        "recentchanges-legend-newpage": "(glej tudi [[Special:NewPages|seznam novih strani]])",
        "rcnotefrom": "Navedene so spremembe od <strong>$2</strong> dalje (prikazujem jih do <strong>$1</strong>).",
-       "rclistfrom": "Prikaži spremembe od $1 naprej",
+       "rclistfrom": "Prikaži spremembe od $3 $2 naprej",
        "rcshowhideminor": "$1 manjša urejanja",
        "rcshowhideminor-show": "Prikaži",
        "rcshowhideminor-hide": "Skrij",
        "uploadstash-refresh": "Osveži seznam datotek",
        "invalid-chunk-offset": "Neveljaven odmik delčka",
        "img-auth-accessdenied": "Dostop zavrnjen",
-       "img-auth-nopathinfo": "Manjka PATH_INFO.\nVaš strežnik ne poda te informacije.\nMorda temelji na CGI in ne more podpirati img_auth.\nOglejte si  https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "Manjka PATH_INFO.\nVaš strežnik ne poda te informacije.\nMorda temelji na CGI in ne more podpirati img_auth.\nOglejte si  https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Zahtevana pot ni v konfigurirani mapi za nalaganje.",
        "img-auth-badtitle": "Ni mogoče sestaviti veljavnega naslova iz »$1«.",
        "img-auth-nologinnWL": "Niste prijavljeni in »$1« ni na seznamu dovoljenih datotek.",
        "morelinkstoimage": "Preglejte [[Special:WhatLinksHere/$1|več povezav]] na to datoteko.",
        "linkstoimage-redirect": "$1 (preusmeritev datoteke) $2",
        "duplicatesoffile": "{{PLURAL:$1|Sledeča datoteka je dvojnik|Sledeči datoteki sta dvojnika|Sledeče $1 datoteke so dvojniki|Sledečih $1 datotek so dvojniki}} te datoteke ([[Special:FileDuplicateSearch/$2|več podrobnosti]]):",
-       "sharedupload": "Datoteka je del projekta $1 in se lahko uporabi v drugih projektih.",
-       "sharedupload-desc-there": "Datoteka je iz projekta $1 in se lahko uporablja v drugih projektih.\nProsimo, oglejte si [$2 opisno stran datoteke] za dodatne informacije.",
-       "sharedupload-desc-here": "Datoteka je iz projekta $1 in se lahko uporablja v drugih projektih.\nPovzetek na njeni [$2 opisni strani datoteke] je prikazan spodaj.",
-       "sharedupload-desc-edit": "Datoteka je z $1 in jo morda uporabljajo drugi projekti.\nMorda želite urediti njeno opisno stran na tamkajšnji [$2 opisni strani datoteke].",
-       "sharedupload-desc-create": "Datoteka je z $1 in jo morda uporabljajo drugi projekti.\nMorda želite urediti njeno opisno stran na tamkajšnji [$2 opisni strani datoteke].",
+       "sharedupload": "Datoteka je s projekta $1 in se lahko uporabi v drugih projektih.",
+       "sharedupload-desc-there": "Datoteka je s projekta $1 in se lahko uporablja v drugih projektih.\nProsimo, oglejte si [$2 opisno stran datoteke] za dodatne informacije.",
+       "sharedupload-desc-here": "Datoteka je s projekta $1 in se lahko uporablja v drugih projektih.\nPovzetek na njeni [$2 opisni strani datoteke] je prikazan spodaj.",
+       "sharedupload-desc-edit": "Datoteka je s projekta $1 in jo morda uporabljajo drugi projekti.\nMorda želite urediti njeno opisno stran na tamkajšnji [$2 opisni strani datoteke].",
+       "sharedupload-desc-create": "Datoteka je s projekta $1 in jo morda uporabljajo drugi projekti.\nMorda želite urediti njeno opisno stran na tamkajšnji [$2 opisni strani datoteke].",
        "filepage-nofile": "Datoteka s tem imenom ne obstaja.",
        "filepage-nofile-link": "Datoteka s tem imenom ne obstaja, vendar pa jo lahko [$1 naložite].",
        "uploadnewversion-linktext": "Naložite novo različico datoteke",
        "pageswithprop-prophidden-binary": "dvojiška vrednost lastnosti je skrita ($1)",
        "doubleredirects": "Dvojne preusmeritve",
        "doubleredirectstext": "Ta stran navaja strani, ki se preusmerjajo na druge preusmeritvene strani.\nVsaka vrstica vsebuje povezavo do prve in druge preusmeritve, kakor tudi do cilja druge preusmeritve, ki je po navadi »prava« ciljna stran, na katero naj bi kazala prva preusmeritev.\n<del>Prečrtani</del> vnosi so bili razrešeni.",
-       "double-redirect-fixed-move": "Stran [[$1]] je bil premaknjen.\nSedaj je preusmeritev na [[$2]].",
-       "double-redirect-fixed-maintenance": "Popravljanje dvojne preusmeritve z [[$1]] na [[$2]].",
+       "double-redirect-fixed-move": "Stran [[$1]] smo premaknili.\nSamodejno smo jo posodobili in sedaj se preusmerja na [[$2]].",
+       "double-redirect-fixed-maintenance": "Samodejno popravljanje dvojne preusmeritve z [[$1]] na [[$2]] v vzdrževalnem delu.",
        "double-redirect-fixer": "Popravljalec preusmeritev",
        "brokenredirects": "Pretrgane preusmeritve",
        "brokenredirectstext": "Naslednje preusmeritve kažejo na neobstoječe strani:",
        "log-title-wildcard": "Iskanje po naslovih, začenši s tem besedilom",
        "showhideselectedlogentries": "Pokaži/skrij izbrane dnevniške vnose",
        "allpages": "Vse strani",
-       "alphaindexline": "$1 do $2",
        "nextpage": "Naslednja stran ($1)",
        "prevpage": "Prejšnja stran ($1)",
        "allpagesfrom": "Prikaži strani, ki se začnejo na:",
        "watchlistanontext": "Za pregled ali urejanje vsebine vašega spiska nadzorov se morate $1.",
        "watchnologin": "Niste prijavljeni",
        "addwatch": "Dodaj na spisek nadzorov",
-       "addedwatchtext": "Stran »[[:$1]]« je bila dodana na vaš [[Special:Watchlist|spisek nadzorov]].\nTam bodo navedene prihodnje spremembe te strani in pripadajoče pogovorne strani.",
+       "addedwatchtext": "Stran »[[:$1]]« smo dodali na vaš [[Special:Watchlist|spisek nadzorov]].\nTam bodo navedene prihodnje spremembe te strani in pripadajoče pogovorne strani.",
+       "addedwatchtext-short": "Stran »$1« smo dodali na vaš spisek nadzorov.",
        "removewatch": "Odstrani s spiska nadzorov",
-       "removedwatchtext": "Stran »[[:$1]]« je bila odstranjena z vašega [[Special:Watchlist|spiska nadzorov]].",
+       "removedwatchtext": "Stran »[[:$1]]« smo odstranili z vašega [[Special:Watchlist|spiska nadzorov]].",
+       "removedwatchtext-short": "Stran »$1« smo odstranili z vašega spiska nadzorov.",
        "watch": "Opazuj",
        "watchthispage": "Opazuj stran",
        "unwatch": "Prenehaj opazovati",
        "watchlist-details": "Na vašem spisku nadzorov je $1 {{PLURAL:$1|stran|strani|strani}}; pogovorne strani niso štete posebej.",
        "wlheader-enotif": "Obveščanje po elektronski pošti je omogočeno.",
        "wlheader-showupdated": "Strani, spremenjene od vašega zadnjega ogleda, so prikazane '''krepko'''.",
-       "watchmethod-recent": "med nedavnimi urejanji iščem spremljane strani",
-       "watchmethod-list": "med spremljanimi stranmi iščem nedavna urejanja",
-       "watchlistcontains": "Spremljate $1 {{PLURAL:$1|stran|strani}}.",
-       "iteminvalidname": "Težava z izbiro »$1«, neveljavno ime ...",
        "wlnote2": "Spodaj so navedene spremembe v {{PLURAL:$1|zadnji uri|zadnjih <strong>$1</strong> urah}}, od $2, $3.",
        "wlshowlast": "Prikaži zadnjih $1 ur; $2 dni; $3;",
        "watchlist-options": "Možnosti spiska nadzorov",
        "enotif_lastvisited": "Za spremembe po vašem zadnjem obisku glejte $1.",
        "enotif_lastdiff": "Glej $1 za to spremembo.",
        "enotif_anon_editor": "brezimni uporabnik $1",
-       "enotif_body": "$WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nUrejevalčev povzetek: $PAGESUMMARY $PAGEMINOREDIT\n\nNavežite stik z urejevalcem:\ne-pošta: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nMedtem ko ste prijavljeni, nadaljnjih obvestil ne boste prejemali. Na spisku nadzorov lahko tudi ponastavite zastavice obveščanj za vse spremljane strani.\n\nVaš opozorilni sistem {{GRAMMAR:rodilnik|{{SITENAME}}}}\n\n--\nZa spremembo nastavitev e-poštnih obvestil obiščite\n{{canonicalurl:{{#special:Preferences}}}}\n\nZa spremembo nastavitev spiska nadzorov obiščite\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nZa odstranitev strani z vašega spiska nadzorov obiščite\n$UNWATCHURL\n\nPovratna sporočila in pomoč:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "$WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nUrejevalčev povzetek: $PAGESUMMARY $PAGEMINOREDIT\n\nNavežite stik z urejevalcem:\ne-pošta: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nMedtem ko ste prijavljeni, nadaljnjih obvestil ne boste prejemali. Na spisku nadzorov lahko tudi ponastavite zastavice obveščanj za vse spremljane strani.\n\nVaš opozorilni sistem {{GRAMMAR:rodilnik|{{SITENAME}}}}\n\n--\nZa spremembo nastavitev e-poštnih obvestil obiščite\n{{canonicalurl:{{#special:Preferences}}}}\n\nZa spremembo nastavitev spiska nadzorov obiščite\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nZa odstranitev strani z vašega spiska nadzorov obiščite\n$UNWATCHURL\n\nPovratna sporočila in pomoč:\n$HELPPAGE",
        "created": "ustvaril",
        "changed": "spremenil",
        "deletepage": "Briši stran",
        "blockip": "Blokiranje IP-naslova ali uporabniškega imena",
        "blockip-legend": "Blokiraj uporabnika",
        "blockiptext": "Naslednji obrazec vam omogoča, da določenemu IP-naslovu ali uporabniškemu imenu preprečite urejanje.\nTo storimo le zaradi zaščite pred nepotrebnim uničevanjem in po [[{{MediaWiki:Policy-url}}|pravilih]].\nVnesite tudi razlog (''na primer'' seznam strani, ki jih je uporabnik po nepotrebnem kvaril).",
-       "ipadressorusername": "IP-naslov ali uporabniško ime",
+       "ipaddressorusername": "IP-naslov ali uporabniško ime",
        "ipbexpiry": "Pretek",
        "ipbreason": "Razlog:",
        "ipbreason-dropdown": "*Razlogi za blokado\n** vandalizem\n** dodajanje napačnih/lažnih podatkov\n** brisanje strani\n** dodajanje nepotrebnih zunanjih povezav\n** dodajanje neumnosti v besedilo\n** nadlegovanje/osebni napadi\n** neprimerno uporabniško ime",
        "movepagetalktext": "Če obstaja, bo samodejno prestavljena tudi pripadajoča pogovorna stran, '''razen kadar'''\n*pod novim imenom že obstaja neprazna pogovorna stran ali\n*ste odkljukali spodnji okvirček.\n\nČe je tako, boste morali pogovorno stran, če želite, prestaviti ali povezati ročno.",
        "movearticle": "Prestavi stran:",
        "moveuserpage-warning": "'''Opozorilo:''' Premikate uporabniško stran. To pomeni, da bo premaknjena samo stran in uporabnik ''ne'' bo preimenovan.",
+       "movecategorypage-warning": "<strong>Opozorilo:</strong> Prestavili boste stran kategorije. Pomnite, da boste prestavili samo stran; vse strani v stari kategoriji <em>ne</em> bomo prekategorizirali v novo kategorijo.",
        "movenologintext": "Za prestavljanje strani morate biti registrirani in [[Special:UserLogin|prijavljeni]].",
        "movenotallowed": "Za prestavljanje strani nimate dovoljenja.",
        "movenotallowedfile": "Nimate dovoljenja, da premikate datoteke.",
        "cant-move-user-page": "Nimate dovoljenja, da premikate uporabniške strani (razen podstrani).",
        "cant-move-to-user-page": "Nimate dovoljenja, da premikate strani na uporabniške strani (razen na uporabniške podstrani).",
+       "cant-move-category-page": "Nimate pravic za prestavljanje strani kategorij.",
+       "cant-move-to-category-page": "Nimate pravic za prestavljanje strani na stran kategorije.",
        "newtitle": "Na naslov:",
        "move-watch": "Opazuj to stran",
        "movepagebtn": "Prestavi stran",
        "tooltip-preferences-save": "Shrani nastavitve",
        "tooltip-summary": "Vnesite kratek povzetek",
        "interlanguage-link-title": "$1 – $2",
-       "notacceptable": "V obliki, ki jo lahko bere vaš odjemalec, wikistrežnik podatkov ne more ponuditi.",
        "anonymous": "{{PLURAL:$1|Brezimni uporabnik|Brezimna uporabnika|Brezimni uporabniki}} {{GRAMMAR:rodilnik|{{SITENAME}}}}",
        "siteuser": "uporabnik {{GRAMMAR:rodilnik|{{SITENAME}}}} $1",
        "anonuser": "Brezimni uporabnik {{GRAMMAR:rodilnik|{{SITENAME}}}} $1",
        "newimages-summary": "Ta posebna stran prikazuje najnovejše naložene datoteke.",
        "newimages-legend": "Filter",
        "newimages-label": "Ime datoteke (ali njen del):",
-       "showhidebots": "($1 bote)",
+       "newimages-showbots": "Prikaži nalaganja botov",
        "noimages": "Nič ni videti.",
        "ilsubmit": "Išči",
        "bydate": "po datumu",
        "autosumm-replace": "Zamenjava strani s/z '$1'",
        "autoredircomment": "preusmeritev na [[$1]]",
        "autosumm-new": "Nova stran z vsebino: $1",
-       "livepreview-loading": "Nalaganje ...",
-       "livepreview-ready": "Nalaganje ... Pripravljen!",
-       "livepreview-failed": "Predogled v živo je spodletel!\nPoskusite normalni predogled.",
-       "livepreview-error": "Povezovanje ni uspelo: $1 »$2«.\nPoskusite normalni predogled.",
        "lag-warn-normal": "Spremembe novejše od $1 {{PLURAL:$1|sekunde|sekund}} morda ne bodo prikazane na seznamu.",
        "lag-warn-high": "Zaradi visoke zasedenosti strežniških podatkovnih baz, spremembe novejše od $1 {{PLURAL:$1|sekunde|sekund}} morda ne bodo prikazane na seznamu.",
-       "watchlistedit-numitems": "Vaš spisek nadzorov vsebuje $1 {{PLURAL:$1|stran|strani}}, izključujoč pogovorne strani.",
-       "watchlistedit-noitems": "Vaš spisek nadzorov je prazen.",
        "watchlistedit-normal-title": "Uredi spisek nadzorov",
        "watchlistedit-normal-legend": "Odstrani strani iz spiska nadzorov",
        "watchlistedit-normal-explain": "Strani na vašem spisku nadzorov so prikazane spodaj.\nDa odstranite stran, označite kvadratek poleg nje in kliknite »{{int:Watchlistedit-normal-submit}}«.\nLahko tudi [[Special:EditWatchlist/raw|uredite gol spisek]].",
        "watchlistedit-normal-submit": "Odstrani strani",
        "watchlistedit-normal-done": "Z vašega spiska nadzorov {{PLURAL:$1|je bila odstranjena $1 stran|sta bili odstranjeni $1 strani|so bile odstranjene $1 strani|je bilo odstranjenih $1 strani}}:",
-       "watchlistedit-raw-title": "urejanje golega spiska nadzorov",
+       "watchlistedit-raw-title": "Urejanje golega spiska nadzorov",
        "watchlistedit-raw-legend": "Uredi gol spisek nadzorov",
        "watchlistedit-raw-explain": "Strani na vašem spisku nadzorov so prikazane spodaj in jih lahko urejate z dodajanjem in odstranjevanjem s seznama; vsak naslov je v svoji vrstici.\nKo končate, kliknite »{{int:Watchlistedit-raw-submit}}«.\nUporabite lahko tudi [[Special:EditWatchlist|standardni urejevalnik]].",
        "watchlistedit-raw-titles": "Strani:",
        "watchlistedit-raw-done": "Vaš spisek nadzorov je bil posodobljen.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Dodana je bila $1 stran|Dodani sta bili $1 strani|Dodane so bile $1 strani|Dodanih je bilo $1 strani}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Odstranjena je bila $1 stran|Odstranjeni sta bili 2 strani|Odstranjene so bile $1 strani|Odstranjenih je bilo $1 strani}}:",
-       "watchlisttools-view": "oglej si ustrezne spremembe",
-       "watchlisttools-edit": "prikaz in urejanje spiska nadzorov",
+       "watchlistedit-clear-title": "Čiščenje spiska nadzorov",
+       "watchlistedit-clear-legend": "Počistite spisek nadzorov",
+       "watchlistedit-clear-explain": "Vse naslove bomo odstranili z vašega spiska nadzorov",
+       "watchlistedit-clear-titles": "Naslovi:",
+       "watchlistedit-clear-submit": "Počisti spisek nadzorov (To je trajno!)",
+       "watchlistedit-clear-done": "Vaš spisek nadzorov smo počistili.",
+       "watchlistedit-clear-removed": "Odstranili smo $1 {{PLURAL:$1|naslov|naslova|naslove|naslovov}}:",
+       "watchlistedit-too-many": "Obstaja preveč strani, da bi jih tukaj prikazali.",
+       "watchlisttools-clear": "Počisti spisek nadzorov",
+       "watchlisttools-view": "Oglej si ustrezne spremembe",
+       "watchlisttools-edit": "Prikaz in urejanje spiska nadzorov",
        "watchlisttools-raw": "Uredi gol spisek nadzorov",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|pogovor]])",
        "unknown_extension_tag": "Neznana razširitvena etiketa »$1«",
        "compare-invalid-title": "Navedeni naslov ni veljaven.",
        "compare-title-not-exists": "Navedeni naslov ne obstaja.",
        "compare-revision-not-exists": "Navedena redakcija ne obstaja.",
-       "dberr-header": "Ta wiki ima težavo",
        "dberr-problems": "Oprostite! Ta stran se sooča s tehničnimi težavami.",
        "dberr-again": "Poskusite počakati nekaj minut in ponovno naložite stran.",
        "dberr-info": "(Ne morem se povezati s strežnikom zbirke podatkov: $1)",
        "htmlform-no": "Ne",
        "htmlform-yes": "Da",
        "htmlform-chosen-placeholder": "Izberite možnost",
+       "htmlform-cloner-create": "Dodaj več",
+       "htmlform-cloner-delete": "Odstrani",
+       "htmlform-cloner-required": "Zahtevana je vsaj ena vrednost.",
        "sqlite-has-fts": "$1 s podporo iskanju polnih besedil",
        "sqlite-no-fts": "$1 brez podpore iskanju polnih besedil",
        "logentry-delete-delete": "$1 je {{GENDER:$2|izbrisal|izbrisala|izbrisal(-a)}} stran $3",
index d26ec20..cf37864 100644 (file)
@@ -13,7 +13,8 @@
                        "Teutonius",
                        "The Evil IP address",
                        "Timpul",
-                       "Äberlausitzer"
+                       "Äberlausitzer",
+                       "아라"
                ]
        },
        "tog-underline": "Verknipfonga unterstreeicha:",
@@ -26,7 +27,6 @@
        "tog-showtoolbar": "Bearbta Werkzichleiste aozäan (beneeticht JavaScript)",
        "tog-editondblclick": "Seita mit Doppelklick bearbta (JavaScript)",
        "tog-editsectiononrightclick": "Eenzelne Obschniete per Rechtsklick bearbta (JavaScript)",
-       "tog-rememberpassword": "Notzer sull uff de Lengde oagemeldt blein (login uff diesem Rechner speichern) (for a maximum of $1 {{PLURAL:$1|day|days}})",
        "tog-watchcreations": "Salber derstallte Seyta automatisch beobachta",
        "tog-watchdefault": "Salber geänderte on neu erstellte Seyta automatisch beobachta (zu menner Beobachtungsliste hinzufügen)",
        "tog-watchmoves": "Vo merr salber verschobene Seyta autoatisch beobachta",
        "readonly": "Datenbanksperre",
        "missing-article": "Der Text von „$1“ $2 wurde nicht in der Datenbank gefunden.\n\nDie Seite ist möglicherweise gelöscht oder verschoben worden.\n\nFalls dies nicht  zutrifft, hast du eventuell einen Fehler in der Software gefunden. Bitte melde dies einem [[Special:ListUsers/sysop|Administrator]] unter Nennung der URL.",
        "missingarticle-rev": "(Versionsnummer: $1)",
-       "fileappenderror": "Konnte „$1“ ne oa „$2“ oahänga.",
        "unexpected": "Unerwarteter Wert: „$1“=„$2“.",
        "cannotdelete": "De Seite oder Datei „$1“ koan nee geläscht waan.\nMeeglicherweise wurde se bereits vu jemand anders entfernt.",
        "badtitle": "Ungültiger Tittel",
        "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-redir": "Weiterleitunga oanzeega:",
        "powersearch-toggleall": "Olle",
        "powersearch-togglenone": "Kenne",
        "searchdisabled": "De {{SITENAME}}-Suche ies deaktiviert. Du koast underdessa miet Google sucha. Bitte bedenke, doaß der Suchindex fier {{SITENAME}} veraltet sei koan.",
        "recentchanges-label-unpatrolled": "Nicht-kontrollierte Änderung",
        "recentchanges-legend-newpage": "$1 - neue Seite",
        "rcnotefrom": "Oagezeigt waan de Änderunga seit '''$2''' (max. '''$1''' Einträge).",
-       "rclistfrom": "Oack Änneronga seit $1 zeiga.",
+       "rclistfrom": "Oack Änneronga seit $3 $2 zeiga.",
        "rcshowhideminor": "Klenne Änderunga $1",
        "rcshowhidebots": "$1 boty",
        "rcshowhideliu": "Oagemeldete Benutzer $1",
        "watchlist-details": "Du beobachtest {{PLURAL:$1|1 Seite|$1 Seita}}.",
        "wlheader-enotif": "Dar E-Mail-Benoachrichtigungsdienst ies aktiviert.",
        "wlheader-showupdated": "Seyta miet noo ne gesehenen Änderunga waan '''fett''' dargestellt.",
-       "watchmethod-recent": "Ieberprifa dar letzta Beoarbeetunga fier de Beobachtungsliste",
-       "watchmethod-list": "Ieberpriefa dar Beobachtungsliste noach letzta Beoarbeetunga",
-       "watchlistcontains": "Denne Beobachtungsliste enthält $1 {{PLURAL:$1|Seite|Seita}}.",
-       "iteminvalidname": "Problem mi'm Eintrag „$1“, ungiltiger Noame.",
        "wlshowlast": "Zeige de Änneronga dar letzta $1 Stonda, $2 Taage oder $3.",
        "watchlist-options": "Oazeegeoptiona",
        "watching": "Beobachta …",
        "enotif_lastvisited": "Olle Änderunga uff a'n Blick: $1",
        "enotif_lastdiff": "Siehe $1 noach dieser Änderung.",
        "enotif_anon_editor": "Anonymer Nutzer $1",
-       "enotif_body": "Hallo $WATCHINGUSERNAME,\n\nde {{SITENAME}}-Seite „$PAGETITLE“ wurde vu $PAGEEDITOR oam $PAGEEDITDATE im $PAGEEDITTIME Seeger $CHANGEDORCREATED.\n\nAktuelle Version: $PAGETITLE_URL\n\n$NEWPAGE\n\nZusommafassung des Beoarbeeters: $PAGESUMMARY $PAGEMINOREDIT\n\nKuntakt zum Bearbeeter:\nE-Mail: $PAGEEDITOR_EMAIL\nWiki: $PAGEEDITOR_WIKI\n\nIs waan sulange kenne wettera Benachrichtigungs-E-Mails gesendet, bis du de Seite wieder besucht host. Uff denner Beobachtungsliste koast du olle Benachrichtigungsmarker zusomma zerrickesetza.\n\n             Dei freindliches {{SITENAME}}-Benoachrichtigungssystem \n\n--\nIm de Einstellunga denner Beobachtungsliste oazupoaßa, besuche: {{canonicalurl:{{#special:EditWatchlist}}}}\n\nRickmeldungen und wettere Hilfe: {{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Hallo $WATCHINGUSERNAME,\n\nde {{SITENAME}}-Seite „$PAGETITLE“ wurde vu $PAGEEDITOR oam $PAGEEDITDATE im $PAGEEDITTIME Seeger $CHANGEDORCREATED.\n\nAktuelle Version: $PAGETITLE_URL\n\n$NEWPAGE\n\nZusommafassung des Beoarbeeters: $PAGESUMMARY $PAGEMINOREDIT\n\nKuntakt zum Bearbeeter:\nE-Mail: $PAGEEDITOR_EMAIL\nWiki: $PAGEEDITOR_WIKI\n\nIs waan sulange kenne wettera Benachrichtigungs-E-Mails gesendet, bis du de Seite wieder besucht host. Uff denner Beobachtungsliste koast du olle Benachrichtigungsmarker zusomma zerrickesetza.\n\n             Dei freindliches {{SITENAME}}-Benoachrichtigungssystem \n\n--\nIm de Einstellunga denner Beobachtungsliste oazupoaßa, besuche: {{canonicalurl:{{#special:EditWatchlist}}}}\n\nRickmeldungen und wettere Hilfe: $HELPPAGE",
        "created": "erzeugt",
        "deletepage": "Seite läscha",
        "confirm": "Bestätiga",
        "blockip": "IP-Atresse/Benutzer sperra",
        "blockip-legend": "IP-Atresse/Benutzer sperra",
        "blockiptext": "Mit diesem Formular sperrst du anne IP-Atresse oder an'n Nutzernoama, su doaß vu dort kenne Änderunga meh vorgenumma waan kinna.\nDies sullte ock erfolga, im Vandalismus zu verhindern und ei Iebereinstimmung miet dann [[{{MediaWiki:Policy-url}}|Richtlinien]].\nBitte gib dann Grund fier de Sperre oa.",
-       "ipadressorusername": "IP-Atresse oder Benutzernoame:",
+       "ipaddressorusername": "IP-Atresse oder Benutzernoame:",
        "ipbreason": "Begriendung:",
        "ipbreason-dropdown": "* Allgemeene Sperrgrinde\n** Eenfiega foalscher Informationen\n** Laara vu Seita\n** Fiegt massenweise externe Links a\n** Einstalla unsinniger Inhalte ei Seita \n** bedrohliches Verhaala/Belästigung\n** Missbrauch durch mehrere Nutzerkonten\n** Ungeeigneter Nutzernoame",
        "ipbcreateaccount": "Erstellung vu Nutzerkonten verhindern",
        "tooltip-rollback": "Moacht olle letzta Änderunga dar Seite, de vum gleichen Benutzer vurgenumma waan sein, dorch ocke eenen Klick rieckgängig.",
        "tooltip-undo": "Moacht lediglich diese eene Änderung rieckgängig on zeigt doas Resultat ei dar Vorschau oa, damit ei dar Zusommafassungszeile eene Begründung angegeba waan koan.",
        "tooltip-summary": "Gib eine kurze Zusammenfassung ein",
-       "notacceptable": "Dar Wiki-Server koan de Daten ne fier dei Ausgabegerät uffbereita.",
        "anonymous": "{{PLURAL:$1|Anonymer Nutzer|Anonyme Nutzer}} uff {{SITENAME}}",
        "siteuser": "{{SITENAME}}-Benutzer $1",
        "lastmodifiedatby": "Diese Seite wurde zuletzt oam $1 im $2 Seeger vu $3 geändert.",
        "autosumm-replace": "Dar Seytainhalt wurde durch an'n andern Text ersetzt: „$1“",
        "autoredircomment": "Weiterleitung noach [[$1]] erstallt",
        "autosumm-new": "De Seite wurde neu oagelagt: „$1“",
-       "livepreview-loading": "Loada…",
-       "livepreview-ready": "Loadn … Fattig!",
-       "livepreview-failed": "Live-Vurschau ne meeglich! Bitte de normale Vurschau benutza.",
-       "livepreview-error": "Verbindung ne meeglich: $1 „$2“. Bitte de normale Vurschau benutza.",
        "lag-warn-normal": "Beoarbeetunga dar letzta {{PLURAL:$1|Sekunde|$1 Sekunden}} waan ei dieser Liste nooch ne oagezeigt.",
        "lag-warn-high": "Uff Grund huher Datenbankauslastung waan de Beoarbeetunga dar letzta {{PLURAL:$1|Sekunde|$1 Sekunden}} ei dieser Liste noo ne oagezeigt.",
-       "watchlistedit-numitems": "Denne Beobachtungsliste enthält {{PLURAL:$1|1 Eintrag |$1 Einträge}}, Dischkurseita waan nee gezählt.",
-       "watchlistedit-noitems": "Denne Beobachtungsliste ies laar.",
        "watchlistedit-normal-title": "Beobachtungsliste bearbta",
        "watchlistedit-normal-legend": "Einträge vu dar Beobachtungsliste entferna",
        "watchlistedit-normal-explain": "Dies sein de Einträge denner Beobachtungsliste. Im Einträge zu entferna, markiere de Kästchen neben den Einträga und klicke oam Ende der Seite uff „Einträge entferna“. Du koast denne Beobachtungsliste au eim [[Special:EditWatchlist/raw|Listenfurmat bearbta]].",
        "tags-tag": "Markierungsnoame",
        "tags-edit": "bearbta",
        "tags-hitcount": "$1 {{PLURAL:$1|Änderung|Änderunga}}",
-       "dberr-header": "Dieses Wiki hoot a Problem",
        "htmlform-submit": "Ieberträän",
        "htmlform-reset": "Änderunga rickgängig macha",
        "htmlform-selectorother-other": "Ondere",
index baf99aa..f90910e 100644 (file)
@@ -4,7 +4,8 @@
                        "Abshirdheere",
                        "Maax",
                        "Mimursal",
-                       "Yariiska"
+                       "Yariiska",
+                       "아라"
                ]
        },
        "tog-underline": "Linkiga hoos ka calaamadeysan:",
@@ -17,7 +18,6 @@
        "tog-showtoolbar": "Itus bedelka qalabka shaqada (waxaa loo baahanyahay JavaScript)",
        "tog-editondblclick": "wax ka bedel maqaalada labo jeer la riixay (waxaa loo baahanyahay JavaScript)",
        "tog-editsectiononrightclick": "Fasax cutub wax ka bedelida hadii batoonka midig ee dooliga <br /> dhag lagu siiyo cinwaanka korkiisa (JavaScript)",
-       "tog-rememberpassword": "Kumbuyuutarkaan ku xasuusnaaw gudagalkeyga (ilaa  $1 {{PLURAL:$1|maalin|maalmood}})",
        "tog-watchcreations": "Ku dar boggaga aan aniga sameeyay liiskayga waardiyaha",
        "tog-watchdefault": "Ku dar boggaga aan wax ka bedelo liiskayga waardiyaha",
        "tog-watchmoves": "Ku dar boggaga aan wareejiyo liiskayga waardiyaha",
@@ -44,6 +44,7 @@
        "tog-diffonly": "Kaladuwanaanshaha hoostooda qari qoraalka bogga",
        "tog-showhiddencats": "Itusi ereykoobyada qarsoon",
        "tog-norollbackdiff": "ha isticmaalin kala duwanaanshaha markii aad dib u soo celisay kadib",
+       "tog-useeditwarning": "Iidig markaan ka baxayo wax bedelidda bog ay ku jiraan isbedel aan la haydin",
        "tog-prefershttps": "Adeegso mar kasta qad aamin ah markaad soo galeeyso",
        "underline-always": "Marwalba",
        "underline-never": "Marnaba",
        "missingarticle-diff": "(Duwanaan: $1, $2)",
        "internalerror": "Qalad gudaha ah",
        "internalerror_info": "Qalad gudaha ah: $1",
-       "fileappenderrorread": "Ma akhri karin \"$1\" markii oo ku daraayay.",
-       "fileappenderror": "Ma ku dari karin \"$1\" ilaa  \"$2\".",
        "filecopyerror": "Ma koobi gareen karin faylka \"$1\" ilaa \"$2\".",
        "filerenameerror": "Maka bedeli karin magaca faylka  \"$1\" ilaa \"$2\".",
        "filedeleteerror": "Ma tirtiri karin faylka \"$1\".",
        "directorycreateerror": "Ma sameyn karin maktabad \"$1\".",
        "filenotfound": "Ma oo san helin  faylka \"$1\".",
-       "fileexistserror": "Ma ku qori karin faylka \"$1\": faylkan wuu jiraa.",
        "unexpected": "Qiimo loo maleeneenin: \"$1\"=\"$2\".",
        "formerror": "Qalad: suura gal maaha in la diraa qoraalkaan",
        "badarticleerror": "Shaqadaan ma lagu sameyn karo boggaan.",
        "logout": "Ka bax",
        "userlogout": "Ka bax",
        "notloggedin": "Gudaha kuma jirtid",
-       "userlogin-noaccount": "Akoon ma heysatid?",
+       "userlogin-noaccount": "Akoon ma lihid?",
        "userlogin-joinproject": "Ku biir {{SITENAME}}",
-       "nologin": "Akoon ma heysatid? $1.",
+       "nologin": "Akoon ma lihid? $1.",
        "nologinlink": "Akoon sameyso",
        "createaccount": "Sameey gudagale",
        "gotaccount": "Waan heystaa gudagale? '''$1'''.",
        "gotaccountlink": "Gudaha gal",
        "userlogin-resetlink": "Ma ilaawday tafaasiisha gudagalahaada?",
        "userlogin-resetpassword-link": "Dib usoo cesho erey sirtaada",
-       "createacct-join": "Gali macluumaadkaada gaarka ah.",
+       "userlogin-helplink2": "Caawinaad habka gudagalka",
        "createacct-emailoptional": "Ciwaanka e-mail-ka (dooqasho)",
        "createacct-email-ph": "Gali Ciwaankaada e-mail-ka",
        "createaccountmail": "E-mail ahaan",
        "login-throttled": "wax badan ayaa isku dayday in aad soo gasho.\nFadlan waxyar sug intii aadan soo gelin.",
        "login-abort-generic": "Ma u soo gali karin gudaha - waa la noqay",
        "loginlanguagelabel": "Luqada: $1",
+       "pt-login": "Gudaha gal",
+       "pt-createaccount": "Samayso gudagal",
        "pt-userlogout": "Ka bax",
        "user-mail-no-addy": "Isku dayday in aa dirto e-mail ayada oo ciwaan e-mail la'aan ah.",
        "changepassword": "Bedel ereysirta",
        "savearticle": "Bogga kaydi",
        "preview": "Horfiirin",
        "showpreview": "Itus horfiirinta",
-       "showlivepreview": "Horfiirin toos ah",
        "showdiff": "Itus isbedelka",
        "anoneditwarning": "'''Digniin:''' Gudaha kuma jirtid. Cinwaankaaga IP:ga waxaa lagu diiwaangelindoonaa taariikhda bedelida bogan.",
        "anonpreviewwarning": "''Ma soo gelin. Hadii aad keydisid waxaa ciwaankaada  IP:ka  lagu duubaa taariikhda bedelka boggaan.''",
        "session_fail_preview": "'''Waan ka xunahay! Wixii aad bedeshay ma'suurto galin in la'keydiyo cilad dhacday awgeed.\nFadlan markale isku day. Hadii aysan weli shaqaynin, ka bax ee markale soo gudagal.'''",
        "session_fail_preview_html": "'''Waan ka xunahay! Wixii aad bedeshay ma'suurto galin in la'keydiyo cilad dhacday awgeed.'''\n\n''Sababtoo ah {{SITENAME}}han wuxuu leeyahay HTML ceyriin ah, horfiirintiisa waxaa loo qariyey si looga hortago weerar ka yimaada JavaScriptga.''\n\n'''Hadii wax ka bedlkaan uu yahay mid xaq ah, fadlan markale isku day. Hadii aysan weli shaqaynin, is kuday inaad  ka baxdo ee markale soo gudagal.'''",
        "editing": "Waxaad bedel ku samaynaysaa $1",
-       "creating": "Sameyta $1",
+       "creating": "Samaynta «$1»",
        "editingsection": "Waxaad wax ka bedelaysaa $1 (qeyb yar)",
        "editingcomment": "Waxaad wax ka bedelaysaa $1 (qeyb yar)",
        "editconflict": "Isku dhac badalaadka: $1",
        "searchmenu-exists": "'''Wikigaan wuu ku jiraa bog la dhoho  \"[[:$1]]\" .'''",
        "searchmenu-new": "'''Ku sameey bogga  \"[[:$1]]\" wikigaan!'''",
        "searchprofile-articles": "Maqaalada kooban",
-       "searchprofile-project": "Caawin iyo Bogga mashruuca",
        "searchprofile-images": "Multimedia-ha",
        "searchprofile-everything": "Wax kasto",
        "searchprofile-advanced": "La talin",
        "searchprofile-articles-tooltip": "Ka raadi $1",
-       "searchprofile-project-tooltip": "Ka raadi $1",
        "searchprofile-images-tooltip": "Raadi faylyada",
        "searchprofile-everything-tooltip": "Raadi wax kasto oo kooban ( xattaa bogga wadahadalka)",
        "searchprofile-advanced-tooltip": "Ka raadi qeybta isticmaalada",
        "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:",
-       "powersearch-redir": "liiska inta la sii toosiyay",
        "powersearch-togglelabel": "Fiiri",
        "powersearch-toggleall": "Dhamaan",
        "powersearch-togglenone": "Waxna",
        "prefs-emailconfirm-label": "Hubinta Email-ka:",
        "youremail": "E-mail:",
        "username": "Gudagal:",
-       "uid": "Lambarka isticmaalaha:",
+       "prefs-memberingroups": "{{GENDER:$2|Xubin}} ka mid ah {{PLURAL:$1|kooxda|kooxaha}}:",
        "yourrealname": "Magacaaga runta ah:",
        "yourlanguage": "luqad:",
        "yournick": "Saxiix cusub:",
        "prefs-help-email": "E-mail waa wax aad xor u leedahay. laakiin waa loo baahanyahay hadii aad eraysirka badaleesid, hadii aad ilaawdo eraygaaga sirta ah",
        "prefs-help-email-others": "Waxaa kale oo aad u isticmaali kartaa in ee dadka kale kugula soo xiriiraan e-mail ayaga oo isticmaalaayo linki isticmaalahaada ama bogga wadahadalka.\nE-mailkaada mala sheegaayo markii ee dadka kale kula soo xiriirayaan.",
        "prefs-help-email-required": "Waxaa loo baahanyahay e-mail.",
+       "prefs-info": "Macluumaadka asaasiga ah",
        "saveusergroups": "Kaydi kooxaha isticmaalayaasha",
        "userrights-groupsmember": "Ka mid ah:",
        "userrights-reason": "Sababta:",
        "group": "Koox:",
        "group-user": "Isticmaalada",
-       "group-autoconfirmed": "Gude galayaasha la hubiyey si iskeed ah",
+       "group-autoconfirmed": "Gudagale la aqoonsaday",
        "group-bot": "botyada",
        "group-sysop": "Maamulada",
        "group-all": "(dhamaan)",
        "group-bot-member": "{{GENDER:$1|bot}}",
        "group-sysop-member": "{{GENDER:$1|maamulaha}}",
        "grouppage-user": "{{ns:project}}:Isticmaalada",
-       "grouppage-autoconfirmed": "{{ns:project}}:Adeegsade la hubiyey",
+       "grouppage-autoconfirmed": "{{ns:project}}:Gudagale la aqoonsaday",
        "grouppage-sysop": "{{ns:project}}:Maamulada",
        "right-read": "Akhri maqaalada",
        "right-edit": "Wax ka bedel bogyaalo",
+       "right-createpage": "Samaynta bogag (taasoo aan lahayn bogag wadahadal)",
+       "right-createtalk": "Samaynta bogagga wadahadalka",
+       "right-createaccount": "Samaynta akoon isticmaale cusub",
+       "right-minoredit": "Calaamaynta bedelka yar",
        "right-move": "Wareeji maqaalada",
        "right-upload": "Soo geli fayl",
+       "right-writeapi": "Adeegsiga API ee qorista",
        "right-delete": "Tirtir maqaalada",
        "right-bigdelete": "Tirtir maqaalada taariikhda dheer leh",
        "right-browsearchive": "Raadi maqaalada la tirtiray",
        "right-undelete": "Ha tirtirin bog",
+       "right-editmyusercss": "Bedel galalka CSS ee isticmaalaha laftiisa",
+       "right-editmyuserjs": "Bedel galalka JavaScript ee isticmaalaha laftiisa",
+       "right-viewmywatchlist": "Egista liiska waardiyaha",
+       "right-editmywatchlist": "Bedel liiska waardiyaha. Eeg qaybo ka mid ah dhaqdhaqaaqa in aan weli lagu kordhin haddi uusan jirin xitaa xaqaan.",
+       "right-viewmyprivateinfo": "Eegista macluumaadka gaarka ah (sida ciwaanka e-mail-ka, iyo magaca saxda ah)",
+       "right-editmyprivateinfo": "Bedel macluumaadka gaarka ah (sida. ciwaanka e-mail-ka , iyo magaca saxda ah)",
+       "right-editmyoptions": "Bedelka dooqyada",
        "newuserlogpage": "Gudagalaha Isticmaale sameeyay",
        "action-read": "akhri boggaan",
        "action-edit": "wax ka bedel boggaan",
        "action-createpage": "sameey bogyaalo",
+       "action-createtalk": "Samaynta bogagga wadahadalka",
        "action-upload": "soo geli file'kaan",
        "action-delete": "tirtir boggaan",
        "action-browsearchive": "Raadi maqaalada la tirtiray",
        "recentchanges-legend-heading": "'''Sharaxaad:'''",
        "recentchanges-legend-newpage": "(sidoo kale eeg [[Special:NewPages|liiska bogagga cusub]])",
        "rcnotefrom": "Hoostaan waa isbedaladii dhacay  '''$2''' (waxaad arkoosaa ilaa '''$1''' ).",
-       "rclistfrom": "Itusi isbedelada cusub oo ka bilaabaneyso $1",
+       "rclistfrom": "Itusi isbedelada cusub oo ka bilaabaneyso $3 $2",
        "rcshowhideminor": "$1 bedelada yar",
        "rcshowhidebots": "$1 botyaalo",
+       "rcshowhidebots-show": "I tus",
        "rcshowhideliu": "$1 isticmaalada-soo galay",
+       "rcshowhideliu-show": "I tus",
        "rcshowhideanons": "$1 isticmaalada la aqoon",
+       "rcshowhideanons-show": "I tus",
        "rcshowhidepatr": "$1 bedelada la waardiyeeyay",
+       "rcshowhidepatr-show": "I tus",
        "rcshowhidemine": "$1 wax badalkeyga",
+       "rcshowhidemine-show": "I tus",
        "rclinks": "Itusi isbadeladii  $1 ee ugu danbeeyay oo dhacay wixii ka danbeeyay $2 maalmood<br />$3",
        "diff": "duwanaan",
        "hist": "taariikh",
        "randompage": "Ku nasiibso bog",
        "brokenredirects-edit": "wax ka bedel",
        "brokenredirects-delete": "tirtir",
+       "withoutinterwiki-submit": "I tus",
        "nbytes": "$1 {{PLURAL:$1|bayt|bayt}}",
        "nmembers": " $1 {{PLURAL:$1|ka mid ah|ka mid ah}}",
        "lonelypages": "Boggaga agoonta ah",
        "booksources-go": "Soco",
        "log": "Guda galayaasha",
        "allpages": "Dhamaan bogagga",
-       "alphaindexline": "$1 ilaa $2",
        "nextpage": "Bogga ku xiga ($1)",
        "prevpage": "Bogga ka horeeyo ($1)",
        "allpagesfrom": "Soosaar boggaga ka bilaawda:",
        "listusers-submit": "I'tus",
        "listusers-noresult": "Lama helin isticmaale.",
        "listusers-blocked": "(waa la mamnuucay)",
+       "listgrouprights": "Xuquuqaha koox isticmaalada",
+       "listgrouprights-summary": "Kani waa liiska koox isticmaale yaal ah ee la aqoonsaday wikigaan, in ay leeyihiin xuquuqdaan.\nWaxaa laga yaabaa in ay halkaan ku jiraan [[{{MediaWiki:Listgrouprights-helppage}}|macluumaad dheeraad ah]] ee ku saabsan xuquuqaha kala gadisan.",
+       "listgrouprights-key": "Ciwaanka:\n* <span class=\"listgrouprights-granted\">Xuquuq la siiyey</span>\n* <span class=\"listgrouprights-revoked\">Xuquuq laga qaaday</span>",
+       "listgrouprights-group": "Kooxda",
+       "listgrouprights-rights": "Xuquuqaha",
        "listgrouprights-members": "(Inta ka mid ah liiskooda)",
        "mailnologin": "Ma'jiro cinwaan wax lagu diro",
        "mailnologintext": "Waa in aad [[Special:UserLogin|gudaha ku jirtaa]]\nkuna haysatid E-boosto sax ah [[Special:Preferences|dooqyadaada]],\nsi aad ugu dirto E-boosto isticmaalayaasha kale.",
        "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.",
-       "watchlistcontains": "Liiskaaga waardiyeynta waxaa ku jiro $1 {{PLURAL:$1|bog|boggag}}.",
        "wlshowlast": "Itus wixii ka danbeeyay $1 saacadood $2 maalmood $3",
        "watchlist-options": "Dooqyada liiska waardiyaha",
        "watching": "Daawasho...",
        "enotif_lastvisited": "Eeg $1 Dhamaan isbedeleda ilaa goortii kuugu dambaysay.",
        "enotif_lastdiff": "Eeg $1 si aad u aragto bedelkaan.",
        "enotif_anon_editor": "Aan la qoon $1",
-       "enotif_body": "Mudane $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nQaybta wax laga bedelay: $PAGESUMMARY $PAGEMINOREDIT\n\nLa xariirka Tifaftiraha:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nLama soo diri doono ogeysiin dambe hadii isbedel kale lagu sii sameeyo ilaa aad ka soo booqato bogga.\nWaxaad awoodaa inaad ka saarto liiska waardiyeha bogga.\n\n\t\t\t Nidaamka war gelinta {{SITENAME}} ee E-mailka\n\n--\nsi aad ubedesho fariinta e-mail dooqyadiisa, Booqo\n{{canonicalurl:{{#special:Preferences}}}}\n\nSi aad ubedesho liiskaada waardiyaha, Booqo\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nsi aad utirtirto liiskaada waardiyaha ee gaarka ah, Booqo\n$UNWATCHURL\n\nFaalada iyo helista caawinaad dheeraad ah:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Mudane $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nQaybta wax laga bedelay: $PAGESUMMARY $PAGEMINOREDIT\n\nLa xariirka Tifaftiraha:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nLama soo diri doono ogeysiin dambe hadii isbedel kale lagu sii sameeyo ilaa aad ka soo booqato bogga.\nWaxaad awoodaa inaad ka saarto liiska waardiyeha bogga.\n\n\t\t\t Nidaamka war gelinta {{SITENAME}} ee E-mailka\n\n--\nsi aad ubedesho fariinta e-mail dooqyadiisa, Booqo\n{{canonicalurl:{{#special:Preferences}}}}\n\nSi aad ubedesho liiskaada waardiyaha, Booqo\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nsi aad utirtirto liiskaada waardiyaha ee gaarka ah, Booqo\n$UNWATCHURL\n\nFaalada iyo helista caawinaad dheeraad ah:\n$HELPPAGE",
        "confirm": "Xaqiiji",
        "excontent": "qoraalka wuxuu ahaa: '$1'",
        "exbeforeblank": "Intii la masaxin waxaa ku qornaa: \"$1\"",
        "lastmodifiedatby": "Bogaan waxaa ugu dambeyntii wax laga bedelay $2, $1 kana bedelay $3.",
        "othercontribs": "Waxay ku saleysantahay shaqada $1.",
        "pageinfo-title": "Macluumaad ku saabsan \"$1\"",
-       "pageinfo-header-basic": "Macaaluumaadka asaasiga ah",
+       "pageinfo-header-basic": "Macluumaadka asaasiga ah",
        "pageinfo-toolboxlink": "Macluumad ku saabsan",
        "previousdiff": "← bedelkii ka duqsanaa",
        "nextdiff": "Bedelkii ugu cusbaa →",
        "metadata-help": "Faylkaan wuxuu leeyahay  faah faahin dheeraad ah,waxaa laga yaabaa in lagu  isticmaalay digital kaamiro ama skanner oo lagu sameeyo sawir ama lagu digitilays gareeyay.\nHadii faylka wax laga badalay sida oo markiisa hore ahaa, waxaa laga yaabaa in ee  faah faahinta faylkaan eesan dhameestirneen.",
        "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",
        "fileduplicatesearch-legend": "Raadi mid tusaale ah",
        "fileduplicatesearch-submit": "Raadi",
        "specialpages": "bogagga khaaska ah",
+       "specialpages-note-top": "Furaha",
        "specialpages-group-pages": "liiska maqaalada",
        "blankpage": "Bog masaxan",
        "tag-filter": "[[Special:Tags|Filtaraha]] tag:",
index eb09d2d..ae8507d 100644 (file)
@@ -23,7 +23,8 @@
                        "The Evil IP address",
                        "Urhixidur",
                        "Vinie007",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Nënvizo lidhjet:",
@@ -36,7 +37,6 @@
        "tog-showtoolbar": "Trego mjetet e redaktimit (kërkon JavaScript)",
        "tog-editondblclick": "Redakto faqet me dopio-klik (kërkon JavaScript)",
        "tog-editsectiononrightclick": "Lejo redaktimin e seksioneve duke klikuar me të djathtën mbi titullin e seksionit (kërkon JavaScript)",
-       "tog-rememberpassword": "Mbaj mend fjalëkalimin tim në këtë shfletues (më së shumti për $1 {{PLURAL:$1|ditë|ditë}})",
        "tog-watchcreations": "Shtoi faqet e krijuara dhe skedat e ngarkuara prej meje tek lista e faqeve nën mbikqyrje",
        "tog-watchdefault": "Shto faqet dhe skedat e redaktuara prej meje tek lista e faqeve nën mbikqyrje",
        "tog-watchmoves": "Shto faqet dhe skedat e zhvendosura prej meje tek lista e faqeve nën mbikqyrje",
        "readonly_lag": "Databaza është kyçur automatikisht për t'i dhënë kohë serverëve databazë slave që të arrijnë në një nivel me serverin databazë master",
        "internalerror": "Gabim i brendshëm",
        "internalerror_info": "Gabim i brendshëm: $1",
-       "fileappenderrorread": "I pamundur leximi \"$1\" gjatë procesit append.",
-       "fileappenderror": "E pamundur kryerja e procesit append \"$1\" tek \"$2.",
        "filecopyerror": "I pamundur kopjimi i skedës \"$1\" tek \"$2\".",
        "filerenameerror": "I pamundur riemërtimi i skedës \"$1\" në \"$2\".",
        "filedeleteerror": "E pamundur fshirja e skedës \"$1\".",
        "directorycreateerror": "I pamundur krijimi i direktorisë \"$1\".",
        "filenotfound": "E pamundur gjetja e skedës \"$1\".",
-       "fileexistserror": "Skeda \"$1\" nuk mund të shkruhet : Skeda ekziston.",
        "unexpected": "Vlerë e papritur: \"$1\"=\"$2\".",
        "formerror": "Gabim: Formulari nuk mund të dërgohet.",
        "badarticleerror": "Ky veprim nuk mund të bëhet në këtë faqe.",
        "gotaccountlink": "Hyni",
        "userlogin-resetlink": "Keni harruar të dhënat tuaja të identifikimit?",
        "userlogin-resetpassword-link": "Rivendos fjalëkalimin",
-       "createacct-join": "Jepni informacionin tuaj më poshtë",
        "createaccountmail": "me email",
        "createaccountreason": "Arsyeja:",
        "badretype": "Fjalëkalimet nuk janë njësoj.",
        "savearticle": "Kryej ndryshimet",
        "preview": "Shqyrto",
        "showpreview": "Shfaq për shqyrtim",
-       "showlivepreview": "Shqyrtim i menjëhershëm",
        "showdiff": "Trego ndryshimet",
        "anoneditwarning": "'''Kujdes:''' Ju nuk jeni identifikuar. \nAdresa juaj IP do të regjistrohet në historinë e redaktimeve të kësaj faqeje.",
        "anonpreviewwarning": "\"Ju nuk jeni identifikuar. Ruajtja e ndryshimeve do të bëjë që adresa juaj IP të regjistrohet në historikun e redaktimeve të kësaj faqeje.\"",
        "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:",
-       "powersearch-redir": "Trego përcjellimet",
        "powersearch-togglelabel": "Zgjedh:",
        "powersearch-toggleall": "Tâna",
        "powersearch-togglenone": "Asnji",
        "prefs-advancedsearchoptions": "Opsionet e avancuar",
        "prefs-advancedwatchlist": "Opsionet e avancuar",
        "prefs-displayrc": "Shfaq opsionet",
-       "prefs-displaysearchoptions": "Shfaq opsionet",
        "prefs-displaywatchlist": "Shfaq opsionet",
        "prefs-diffs": "Ndryshimet",
        "email-address-validity-valid": "E-mail adresa është e vlefshme.",
        "recentchanges-label-unpatrolled": "Ky editim ende nuk është patrolluar",
        "recentchanges-legend-newpage": "$1 - faqe të re",
        "rcnotefrom": "Më poshtë janë ndryshime së fundmi nga <b>$2</b> (treguar deri në <b>$1</b>).",
-       "rclistfrom": "Tregon ndryshime së fundmi duke filluar nga $1",
+       "rclistfrom": "Tregon ndryshime së fundmi duke filluar nga $3 $2",
        "rcshowhideminor": "$1 redaktimet e vogla",
        "rcshowhidebots": "$1 robotët",
        "rcshowhideliu": "$1 përdoruesit e regjistruar",
        "uploadstash-refresh": "Rifreskoni listën e skedave",
        "invalid-chunk-offset": "Kompensim cope i pavlefshëm",
        "img-auth-accessdenied": "Refuzohet hyrja",
-       "img-auth-nopathinfo": "Mungon PATH_INFO.\nShërbyesi juaj nuk e kalon këtë informacion.\nMund të jetë CGI-bazuar dhe nuk mund të mbështesë img_auth.\nShiko https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "Mungon PATH_INFO.\nShërbyesi juaj nuk e kalon këtë informacion.\nMund të jetë CGI-bazuar dhe nuk mund të mbështesë img_auth.\nShiko https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Kërkesa nuk është në drejtorinë e ngarkimeve të konfiguruara.",
        "img-auth-badtitle": "Nuk mund të krihohej një titull i vlefshëm nga \"$1\".",
        "img-auth-nologinnWL": "Ju nuk jeni i regjistruar dhe \"$1\" nuk është në listën e bardhë.",
        "watchlist-details": "{{PLURAL:$1|$1 faqe|$1 faqe}} nën mbikqyrje duke mos numëruar faqet e diskutimit.",
        "wlheader-enotif": "Njoftimi me email është lejuar.",
        "wlheader-showupdated": "Faqet që kanë ndryshuar nga vizita juaj e fundit do të tregohen të '''trasha'''",
-       "watchmethod-recent": "duke parë ndryshimet e fundit për faqet nën mbikqyrje",
-       "watchmethod-list": "duke parë faqet nën mbikqyrje për ndryshimet e fundit",
-       "watchlistcontains": "Lista mbikqyrëse e juaj ka $1 {{PLURAL:$1|faqe|faqe}}.",
-       "iteminvalidname": "Problem me artikullin '$1', titull jo i saktë...",
        "wlshowlast": "Trego $1 orët $2 ditët $3",
        "watchlist-options": "Mundësitë e listës mbikqyrëse",
        "watching": "Duke mbikqyrur...",
        "enotif_lastvisited": "Shikoni $1 për të gjitha ndryshimet që prej vizitës tuaj të fundit.",
        "enotif_lastdiff": "Shikoni $1 për ndryshime.",
        "enotif_anon_editor": "përdorues anonim $1",
-       "enotif_body": "I Nderuar $WATCHINGUSERNAME,\n\n\nKjo {{SITENAME}} faqe $PAGETITLE eshte $CHANGEDORCREATED on $PAGEEDITDATE by $PAGEEDITOR, see $PAGETITLE_URL per versioni mo i ri.\n\n$NEWPAGE\n\nEditor's summary: $PAGESUMMARY $PAGEMINOREDIT\nKontakto:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nThere will be no other notifications in case of further changes unless you visit this page.\nYou could also reset the notification flags for all your watched pages on your watchlist.\n\nYour friendly {{SITENAME}} notification system\n\n--\nTo change your email notification settings, visit\n{{canonicalurl:{{#special:Preferences}}}}\n\nTo change your watchlist settings, visit\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nTo delete the page from your watchlist, visit\n$UNWATCHURL\n\nFeedback and further assistance:\n{{canonicalurl:{{MediaWiki:Helppage}}}}\n\nFaqja $PAGETITLE tek {{SITENAME}} është $CHANGEDORCREATED më $PAGEEDITDATE nga $PAGEEDITOR, shikoni $PAGETITLE_URL për versionin e tanishëm.\n\n$NEWPAGE\n\nPërmbledhja e redaktorit: $PAGESUMMARY $PAGEMINOREDIT\n\nMund të lidheni me redaktorin nëpërmjet:\nemail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nNuk do të ketë njoftime të tjera për ndryshimet e ardhshme përveç nëse e vizitoni faqen. Gjithashtu mund të ktheni gjendjen e njoftimeve për të gjitha faqet nën mbikqyrje.\n\n             Miku juaj njoftues nga {{SITENAME}}\n\n--\nPër të ndryshuar parapëlqimet e mbikqyrjes shikoni {{canonicalurl:Special:Watchlist/edit}}\n\nPër të larguar faqen nga lista juaj mbikqyrëse, shikoni \n$UNWATCHURL\n\nPër të na dhënë përshtypjet tuaja ose për ndihmë të mëtejshme:\n{{canonicalurl:{{MediaWiki:Helpage}}}}",
+       "enotif_body": "I Nderuar $WATCHINGUSERNAME,\n\n\nKjo {{SITENAME}} faqe $PAGETITLE eshte $CHANGEDORCREATED on $PAGEEDITDATE by $PAGEEDITOR, see $PAGETITLE_URL per versioni mo i ri.\n\n$NEWPAGE\n\nEditor's summary: $PAGESUMMARY $PAGEMINOREDIT\nKontakto:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nThere will be no other notifications in case of further changes unless you visit this page.\nYou could also reset the notification flags for all your watched pages on your watchlist.\n\nYour friendly {{SITENAME}} notification system\n\n--\nTo change your email notification settings, visit\n{{canonicalurl:{{#special:Preferences}}}}\n\nTo change your watchlist settings, visit\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nTo delete the page from your watchlist, visit\n$UNWATCHURL\n\nFeedback and further assistance:\n$HELPPAGE\n\nFaqja $PAGETITLE tek {{SITENAME}} është $CHANGEDORCREATED më $PAGEEDITDATE nga $PAGEEDITOR, shikoni $PAGETITLE_URL për versionin e tanishëm.\n\n$NEWPAGE\n\nPërmbledhja e redaktorit: $PAGESUMMARY $PAGEMINOREDIT\n\nMund të lidheni me redaktorin nëpërmjet:\nemail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nNuk do të ketë njoftime të tjera për ndryshimet e ardhshme përveç nëse e vizitoni faqen. Gjithashtu mund të ktheni gjendjen e njoftimeve për të gjitha faqet nën mbikqyrje.\n\n             Miku juaj njoftues nga {{SITENAME}}\n\n--\nPër të ndryshuar parapëlqimet e mbikqyrjes shikoni {{canonicalurl:Special:Watchlist/edit}}\n\nPër të larguar faqen nga lista juaj mbikqyrëse, shikoni \n$UNWATCHURL\n\nPër të na dhënë përshtypjet tuaja ose për ndihmë të mëtejshme:\n{{canonicalurl:{{MediaWiki:Helpage}}}}",
        "created": "u krijua",
        "changed": "ndryshuar",
        "deletepage": "Grise faqen",
        "blockip": "Blloko përdorues",
        "blockip-legend": "Blloko përdoruesin",
        "blockiptext": "Përdorni formularin e mëposhtëm për të hequr lejen e shkrimit për një përdorues ose IP specifike.\nKjo duhet bërë vetëm në raste vandalizmi, dhe në përputhje me [[{{MediaWiki:Policy-url}}|rregullat e {{SITENAME}}-s]].\nPlotësoni arsyen specifike më poshtë (p.sh., tregoni faqet specifike që u vandalizuan).",
-       "ipadressorusername": "Adresë IP ose emër përdoruesi",
+       "ipaddressorusername": "Adresë IP ose emër përdoruesi",
        "ipbexpiry": "Afati",
        "ipbreason": "Arsyeja:",
        "ipbreason-dropdown": "*Arsyet më të shpeshta të bllokimit\n** Postimi i informacioneve të rreme\n** Largimi i përmbajtjes së faqes\n** Futja e lidhjeve \"spam\"\n** Futja e informatave pa kuptim në faqe\n** Sjellje arrogante/perverze\n** Përdorimi i më shumë llogarive të përdoruesve\n** Nofkë të papranueshme",
        "tooltip-preferences-save": "Ruaj parapëlqimet",
        "tooltip-summary": "Fusni një përmbledhje të shkurtër",
        "monobook.css": "/* redaktoni këtë faqe për të përshtatur pamjen Monobook për tëra faqet tuaja */",
-       "notacceptable": "Wiki server nuk mundet ti përgatit të dhënat për klintin tuaj.",
        "anonymous": "{{PLURAL:$1|Përdoruesi anonim|Përdoruesit anonimë}} të {{SITENAME}}",
        "siteuser": "Përdoruesi $1 nga {{SITENAME}}",
        "anonuser": "Përdorues anonim i {{SITENAME}} $1",
        "newimages-summary": "Kjo faqe speciale tregon skedat e ngarkuara së fundmi.",
        "newimages-legend": "Filtrues",
        "newimages-label": "Emri i skedës (ose një pjesë e tij):",
-       "showhidebots": "($1 robotët)",
        "noimages": "S'ka gjë për të parë.",
        "ilsubmit": "Kërko",
        "bydate": "datës",
        "autosumm-replace": "Faqja u zëvendësua me '$1'",
        "autoredircomment": "Përcjellim te [[$1]]",
        "autosumm-new": "Krijoi faqen me \"$1\"",
-       "livepreview-loading": "Duke punuar…",
-       "livepreview-ready": "Duke punuar… Gati!",
-       "livepreview-failed": "Parapamja e menjëhershme dështoi! Provoni parapamjen e zakonshme.",
-       "livepreview-error": "Nuk mund të kryhej lidhja: $1 \"$2\". Provoni parapamjen e zakonshme.",
        "lag-warn-normal": "Ndryshimet më të reja se $1 {{PLURAL:$1|sekond|sekonda}} mund të mos tregohen në këtë listë.",
        "lag-warn-high": "Për shkak të vonesës së regjistrit ndryshimet më të reja se $1 {{PLURAL:$1|sekond|sekonda}} mund të mos tregohen në këtë listë.",
-       "watchlistedit-numitems": "Lista mbikëqyrëse e juaj përmban {{PLURAL:$1|1 titull|$1 tituj}}, pa faqet e diskutimit.",
-       "watchlistedit-noitems": "Lista juaj mbikqyrëse nuk ka titull.",
        "watchlistedit-normal-title": "Redakto listën mbikqyrëse",
        "watchlistedit-normal-legend": "Largo titujt nga lista mbikqyrëse",
        "watchlistedit-normal-explain": "Titujt në listën mbikëqyrëse janë treguar poshtë.\nLargo titullin duke shënuar kutizën dhe pastaj shtype butonin Largoj titujt.\nJu gjithashtu mundeni ta redaktoni listën [[Special:EditWatchlist/raw|këtu]].",
        "compare-invalid-title": "Titulli që keni specifikuar është i pavlefshëm",
        "compare-title-not-exists": "Titulli që keni specifikuar nuk ekziston.",
        "compare-revision-not-exists": "Rishikimi që ju specifikuat nuk ekziston",
-       "dberr-header": "Kjo wiki ka një problem",
        "dberr-problems": "Na vjen keq! Kjo faqe po has vështirësi teknike.",
        "dberr-again": "Pritni disa minuta dhe provoni të ringarkoni faqen.",
        "dberr-info": "(Nuk mund të lidhet me serverin bazë e të dhënave : $1)",
index 002b191..aa6d614 100644 (file)
@@ -23,7 +23,8 @@
                        "Жељко Тодоровић",
                        "Милан Јелисавчић",
                        "Михајло Анђелковић",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Подвлачење веза:",
        "jumptonavigation": "навигацију",
        "jumptosearch": "претрагу",
        "view-pool-error": "Нажалост, сервери су тренутно преоптерећени.\nПревише корисника покушава да прегледа ову страницу.\nСачекајте неко време пре него што поново покушате да јој приступите.\n\n$1",
+       "generic-pool-error": "Нажалост, сервери су тренутно преоптерећени.\nПревише корисника покушава да види овај ресурс.\nСачекајте неко време пре него што поново покушате да му приступите.",
        "pool-timeout": "Истек времена чека на закључавање",
        "pool-queuefull": "Ред је пун захтева",
        "pool-errorunknown": "Непозната грешка",
        "readonly_lag": "База података је закључана док се споредни базни сервери не ускладе с главним.",
        "internalerror": "Унутрашња грешка",
        "internalerror_info": "Унутрашња грешка: $1",
-       "fileappenderrorread": "Не могу да прочитам „$1“ током качења.",
-       "fileappenderror": "Не могу да закачим „$1“ на „$2“.",
        "filecopyerror": "Не могу да умножим датотеку „$1“ у „$2“.",
        "filerenameerror": "Не могу да преименујем датотеку „$1“ у „$2“.",
        "filedeleteerror": "Не могу да обришем датотеку „$1“.",
        "directorycreateerror": "Не могу да направим фасциклу „$1“.",
        "filenotfound": "Не могу да пронађем датотеку „$1“.",
-       "fileexistserror": "Не могу да пишем по датотеци „$1“: датотека већ постоји",
        "unexpected": "Неочекивана вредност: „$1“=„$2“.",
        "formerror": "Грешка: не могу да пошаљем образац",
        "badarticleerror": "Ова радња се не може извршити на овој страници.",
        "userlogin-helplink2": "Помоћ при пријављивању",
        "userlogin-loggedin": "Већ сте пријављени као {{GENDER:$1|$1}}.\nКористите доњи образац да бисте се пријавили као други корисник.",
        "userlogin-createanother": "Отвори још један налог",
-       "createacct-join": "Унесите своје податке испод",
-       "createacct-another-join": "Унесите податке за нови налог испод.",
        "createacct-emailrequired": "Адреса е-поште",
        "createacct-emailoptional": "Адреса е-поште (опционо)",
        "createacct-email-ph": "Унесите вашу адресу е-поште",
        "retypenew": "Потврда лозинке:",
        "resetpass_submit": "Постави лозинку и пријави ме",
        "changepassword-success": "Ваша лозинка је успешно промењена!",
+       "changepassword-throttled": "Превише пута сте покушали да се пријавите.\nМолимо вас да сачекате $1 пре него што покушате поново.",
        "resetpass_forbidden": "Лозинка не може бити промењена",
        "resetpass-no-info": "Морате бити пријављени да бисте приступили овој страници.",
        "resetpass-submit-loggedin": "Промени лозинку",
        "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|Испуните једно од поља како би сте добили привремену лозинку на е-пошту.}}",
        "changeemail-password": "Ваша лозинка:",
        "changeemail-submit": "Промени",
        "changeemail-cancel": "Откажи",
+       "changeemail-throttled": "Превише пута сте покушали да се пријавите.\nМолимо вас да сачекате $1 пре него што покушате поново.",
+       "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": "Подебљан текст",
        "italic_sample": "Искошени текст",
        "savearticle": "Сачувај страницу",
        "preview": "Претпреглед",
        "showpreview": "Прикажи претпреглед",
-       "showlivepreview": "Тренутни преглед",
        "showdiff": "Прикажи измене",
        "anoneditwarning": "'''Упозорење:''' нисте пријављени.\nВаша ИП адреса ће бити забележена у историји ове странице.",
        "anonpreviewwarning": "''Нисте пријављени. Ваша ИП адреса ће бити забележена у историји ове странице.''",
        "summary-preview": "Преглед описа:",
        "subject-preview": "Преглед теме/наслова:",
        "blockedtitle": "Корисник је блокиран",
-       "blockedtext": "'''Ваше корисничко име или ИП адреса је блокирана.'''\n\nБлокирање је {{GENDER:$4|извршио|извршила}} $1.\nРазлог: ''$2''.\n\n* Датум блокирања: $8\n* Блокирање истиче: $6\n* Име корисника: $7\n\nОбратите се {{GENDER:$4|кориснику|корисници|кориснику}} $1 или [[{{MediaWiki:Grouppage-sysop}}|администратору]] да разјасните ствар.\nНе можете користити могућност „Пошаљи поруку овом кориснику“ ако нисте унели исправну е-адресу у [[Special:Preferences|подешавањима]].\nВаша блокирана ИП адреса је $3, а ИБ $5.\nНаведите све податке изнад при стварања било каквих упита.",
+       "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Наведите све податке изнад при стварању било каквих упита.",
        "blockednoreason": "разлог није наведен",
        "whitelistedittext": "За уређивање странице је потребно да будете $1.",
        "session_fail_preview": "'''Нисмо могли да обрадимо вашу измену због губитка података сесије.'''\nПокушајте поново.\nАко и даље не ради, покушајте да се [[Special:UserLogout|одјавите]] и поново пријавите.",
        "session_fail_preview_html": "'''Нисмо могли да обрадимо вашу измену због губитка података сесије.'''\n\n''Будући да је на овом викију омогућен унос HTML ознака, преглед је сакривен као мера предострожности против напада преко јаваскрипта.''\n\n'''Ако сте покушали да направите праву измену, покушајте поново.\nАко и даље не ради, покушајте да се [[Special:UserLogout|одјавите]] и поново пријавите.'''",
        "token_suffix_mismatch": "'''Ваша измена је одбачена јер је ваш прегледач убацио знакове интерпункције у новчић уређивања.\nТо се понекад догађа када се користи неисправан посредник.'''",
-       "edit_form_incomplete": "'''Неки делови обрасца за уређивање нису достигли до сервера. Проверите да ли су измене промењене и покушајте поново.'''",
+       "edit_form_incomplete": "<strong>Неки делови обрасца за уређивање нису стигли до сервера. Проверите да ли су ваше измене непромењене и покушајте поново.</strong>",
        "editing": "Уређујете $1",
        "creating": "Прављење странице $1",
        "editingsection": "Уређујете $1 (одељак)",
        "edit-gone-missing": "Не могу да ажурирам страницу.\nИзгледа да је обрисана.",
        "edit-conflict": "Сукоб измена.",
        "edit-no-change": "Ваша измена је занемарена јер није било никаквих измена у тексту.",
-       "postedit-confirmation": "Ваша измена је сачувана.",
+       "postedit-confirmation-created": "Страница је направљена.",
+       "postedit-confirmation-restored": "Страница је враћена.",
+       "postedit-confirmation-saved": "Ваша измена је сачувана.",
        "edit-already-exists": "Не могу да направим страницу.\nИзгледа да она већ постоји.",
        "defaultmessagetext": "Подразумевани текст поруке",
        "content-failed-to-parse": "Не могу да рашчланим садржај типа $2 за модел $1: $3",
        "invalid-content-data": "Неисправни подаци садржаја",
        "content-not-allowed-here": "Садржај модела „$1“ није дозвољен на страници [[$2]]",
        "editwarning-warning": "Ако напустите ову страницу, изгубићете све измене које сте направили.\nАко сте пријављени, можете онемогућити ово упозорење у својим подешавањима, у одељку „{{int:prefs-editing}}“.",
+       "editpage-notsupportedcontentformat-title": "Формат садржаја није подржан",
        "content-model-wikitext": "викитекст",
        "content-model-text": "чист текст",
        "content-model-javascript": "јаваскрипт",
        "parser-unstrip-recursion-limit": "Прекорачено је ограничење рекурзије ($1)",
        "converter-manual-rule-error": "Пронађена је грешка у правилу за ручно претварање језика",
        "undo-success": "Измена се може вратити.\nПроверите разлике испод, па сачувајте измене.",
-       "undo-failure": "Ова измена се не може поништити због конфликта измена.",
+       "undo-failure": "Ова измена се не може поништити због сукоба измена.",
        "undo-norev": "Не могу да вратим измену јер не постоји или је обрисана.",
+       "undo-nochange": "Изгледа да је измена већ поништена.",
        "undo-summary": "Поништена измена $1 {{GENDER:$2|корисника|кориснице}} [[Special:Contributions/$2|$2]] ([[User talk:$2|разговор]])",
        "undo-summary-username-hidden": "Поништи измену $1 скривеног корисника",
        "cantcreateaccounttitle": "Не могу да отворим налог",
        "revertmerge": "растави",
        "mergelogpagetext": "Испод је списак најскоријих спајања историја двеју страница.",
        "history-title": "Историја измена странице „$1“",
-       "difference-title": "Разлика између измена на страници „$1“",
+       "difference-title": "$1 — разлика између измена",
        "difference-title-multipage": "Разлика између страница „$1“ и „$2“",
        "difference-multipage": "(разлике између страница)",
        "lineno": "Ред $1:",
        "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-project": "Странице помоћи и пројеката",
        "searchprofile-images": "Датотеке",
        "searchprofile-everything": "Све",
        "searchprofile-advanced": "Напредно",
        "searchprofile-articles-tooltip": "Претражите: $1",
-       "searchprofile-project-tooltip": "Претражите: $1",
        "searchprofile-images-tooltip": "Претражите датотеке",
        "searchprofile-everything-tooltip": "Претражите сав садржај (укључујући странице за разговор)",
        "searchprofile-advanced-tooltip": "Претражите прилагођене именске просторе",
        "search-section": "(одељак $1)",
        "search-suggest": "Да ли сте мислили на: $1",
        "search-interwiki-caption": "Братски пројекти",
-       "search-interwiki-default": "$1 резултати:",
+       "search-interwiki-default": "Резултати са $1:",
        "search-interwiki-more": "(више)",
        "search-relatedarticle": "Повезано",
        "searcheverything-enable": "сви именски простори",
        "search-nonefound": "Нема поклапања.",
        "powersearch-legend": "Напредна претрага",
        "powersearch-ns": "Тражи у следећим именским просторима:",
-       "powersearch-redir": "Списак преусмерења",
        "powersearch-togglelabel": "Изабери:",
        "powersearch-toggleall": "све",
        "powersearch-togglenone": "ништа",
        "recentchangesdays-max": "(највише $1 {{PLURAL:$1|дан|дана|дана}})",
        "recentchangescount": "Број измена за приказ:",
        "prefs-help-recentchangescount": "Подразумева скорашње измене, историје страница и дневнике.",
-       "prefs-help-watchlist-token2": "Ово је тајни кључ за RSS довод вашег списка надгледања.\nСвако ко зна овај кључ биће у могућности да види ваша надгледања стога немојте га одавати никоме.\nАко је потребно можете га [[Special:ResetTokens|ресетовати]].",
+       "prefs-help-watchlist-token2": "Ово је тајни кључ за веб довод вашег списка надгледања.\nСвако ко зна овај кључ биће у могућности да види ваша надгледања стога немојте га одавати никоме.\nАко је потребно можете га [[Special:ResetTokens|ресетовати]].",
        "savedprefs": "Ваша подешавања су сачувана.",
        "timezonelegend": "Временска зона:",
        "localtime": "Локално време:",
        "prefs-emailconfirm-label": "Потврда е-адресе:",
        "youremail": "Е-адреса:",
        "username": "{{GENDER:$1|Корисничко име}}:",
-       "uid": "{{GENDER:$1|Кориснички}} ID:",
        "prefs-memberingroups": "{{PLURAL:$1|Група|Групе}}:",
        "prefs-memberingroups-type": "$1",
        "prefs-registration": "Време уписа:",
        "prefs-advancedsearchoptions": "Напредне поставке",
        "prefs-advancedwatchlist": "Напредне поставке",
        "prefs-displayrc": "Поставке приказа",
-       "prefs-displaysearchoptions": "Поставке приказа",
        "prefs-displaywatchlist": "Поставке приказа",
+       "prefs-tokenwatchlist": "Токен",
        "prefs-diffs": "Разлике",
        "prefs-help-prefershttps": "Ова подешавања ће ступити на снагу при следећој пријави.",
        "email-address-validity-valid": "Е-адреса је исправна",
        "userrights-changeable-col": "Групе које можете да промените",
        "userrights-unchangeable-col": "Групе које не можете да промените",
        "userrights-irreversible-marker": "$1*",
+       "userrights-removed-self": "Успешно сте себи скинули права. Због тога није вам дозвољен приступ овој страници.",
        "group": "Група:",
        "group-user": "Корисници",
        "group-autoconfirmed": "Аутоматски потврђени корисници",
        "right-edituserjs": "уређивање туђих JavaScript датотека",
        "right-editmyusercss": "уређивање сопствених CSS датотека",
        "right-editmyuserjs": "уређивање сопствених JavaScript датотека",
+       "right-viewmywatchlist": "vidi sopstveni spisak nadgledanja",
        "right-viewmyprivateinfo": "видите своје личне податке (нпр. адресу е-поште, право име)",
        "right-editmyprivateinfo": "уређивање сопствених личних података (нпр. адресу е-поште, право име)",
        "right-editmyoptions": "уредите своја подешавања",
        "action-createpage": "прављење страница",
        "action-createtalk": "прављење страница за разговор",
        "action-createaccount": "отварање овог корисничког налога",
+       "action-history": "гледање историје ове странице",
        "action-minoredit": "означавање ове измене као мање",
        "action-move": "премести ову страницу",
        "action-move-subpages": "премештање ове странице и њених подстраница",
        "action-block": "блокирање даљих измена овог корисника",
        "action-protect": "мењање степена заштите ове странице",
        "action-rollback": "брзо враћање измена последњег корисника који је мењао одређену страницу",
-       "action-import": "Ñ\83воз Ð¾Ð²Ðµ Ñ\81Ñ\82Ñ\80аниÑ\86е Ñ\81 Ð´Ñ\80Ñ\83гог викија",
-       "action-importupload": "Ñ\83воз Ð¾Ð²Ðµ Ñ\81Ñ\82Ñ\80аниÑ\86е Ñ\81лаÑ\9aем датотеке",
+       "action-import": "Ñ\83вожеÑ\9aе Ñ\81Ñ\82Ñ\80аниÑ\86а Ð¸Ð· Ð´Ñ\80Ñ\83гиÑ\85 викија",
+       "action-importupload": "Ñ\83вожеÑ\9aе Ñ\81Ñ\82Ñ\80аниÑ\86а Ð¸Ð· Ð¾Ñ\82пÑ\80емÑ\99ене датотеке",
        "action-patrol": "означавање туђих измена прегледаним",
        "action-autopatrol": "самоозначавање измена прегледаним",
        "action-unwatchedpages": "прегледање списка ненадгледаних страница",
        "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-label-newpage": "Нова страница",
        "recentchanges-label-minor": "Мања измена",
        "recentchanges-label-bot": "Ову измену је направио бот",
-       "recentchanges-label-unpatrolled": "Ова измена још није прегледана",
-       "recentchanges-label-plusminus": "Промена величине странице (у бајтовима)",
+       "recentchanges-label-unpatrolled": "Ова измена још није патролирана",
+       "recentchanges-label-plusminus": "Промена величине странице у бајтовима",
        "recentchanges-legend-heading": "'''Легенда:'''",
        "recentchanges-legend-newpage": "([[Special:NewPages|списак нових страница]])",
        "rcnotefrom": "Испод су измене од <strong>$2</strong> (до <strong>$1</strong> измена).",
-       "rclistfrom": "Прикажи нове измене почев од $1",
+       "rclistfrom": "Прикажи нове измене почев од $2 $3",
        "rcshowhideminor": "$1 мање измене",
        "rcshowhideminor-show": "Прикажи",
        "rcshowhideminor-hide": "Сакриј",
        "uploadstash-refresh": "Освежи списак датотека",
        "invalid-chunk-offset": "Неисправна полазна тачка",
        "img-auth-accessdenied": "Приступ је одбијен",
-       "img-auth-nopathinfo": "Недостаје PATH_INFO.\nВаш сервер није подешен да прослеђује овакве податке.\nМожда је заснован на CGI-ју који не подржава img_auth.\nПогледајте https://www.mediawiki.org/wiki/Manual:Image_Authorization?uselang=sr-ec.",
+       "img-auth-nopathinfo": "Недостаје PATH_INFO.\nВаш сервер није подешен да прослеђује овакве податке.\nМожда је заснован на CGI-ју који не подржава img_auth.\nПогледајте https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization?uselang=sr-ec.",
        "img-auth-notindir": "Захтевана путања није у подешеној фасцикли за слање.",
        "img-auth-badtitle": "Не могу да створим исправан наслов за „$1“.",
        "img-auth-nologinnWL": "Нисте пријављени и „$1“ није на списку дозвољених.",
        "download": "преузми",
        "unwatchedpages": "Ненадгледане странице",
        "listredirects": "Списак преусмерења",
-       "listduplicatedfiles": "Списак дупликата датотека",
+       "listduplicatedfiles": "Списак дуплираних датотека",
        "listduplicatedfiles-summary": "Ово је списак датотека које су дупликат неких других датотека. Само локалне датотеке су приказане.",
+       "listduplicatedfiles-entry": "[[:File:$1|$1]] има [[$3|{{PLURAL:$2|један дупликат|$2 дупликата}}]].",
        "unusedtemplates": "Некоришћени шаблони",
        "unusedtemplatestext": "Ова страница наводи све странице у именском простору {{ns:template}} које нису укључене ни на једној другој страници.\nПре брисања проверите да ли друге странице воде до тих шаблона.",
        "unusedtemplateswlh": "остале везе",
        "randompage": "Случајна страница",
        "randompage-nopages": "Нема страница у {{PLURAL:$2|следећем именском простору|следећим именским просторима}}: $1.",
        "randomincategory": "Случајна страница у категорији",
+       "randomincategory-invalidcategory": "„$1“ није ваљано име категорије",
+       "randomincategory-nopages": "Нема страница у категорији [[:Category:$1|$1]].",
        "randomincategory-selectcategory-submit": "Иди",
        "randomredirect": "Случајно преусмерење",
        "randomredirect-nopages": "Нема преусмерења у именском простору „$1”.",
        "pageswithprop-submit": "Иди",
        "doubleredirects": "Двострука преусмерења",
        "doubleredirectstext": "Ова страница приказује странице које преусмеравају на друга преусмерења.\nСваки ред садржи везе према првом и другом преусмерењу, као и одредишну страницу другог преусмерења која је обично „прави“ чланак на кога прво преусмерење треба да упућује.\n<del>Прецртани</del> уноси су већ решени.",
-       "double-redirect-fixed-move": "[[$1]] Ñ\98е Ð¿Ñ\80емеÑ\88Ñ\82ен.\nСада Ñ\98е Ð¿Ñ\80еÑ\83Ñ\81меÑ\80еÑ\9aе на [[$2]].",
-       "double-redirect-fixed-maintenance": "Ð\98Ñ\81пÑ\80авÑ\99аÑ\9aе Ð´Ð²Ð¾Ñ\81Ñ\82Ñ\80Ñ\83киÑ\85 Ð¿Ñ\80еÑ\83Ñ\81меÑ\80еÑ\9aа Ð¸Ð· [[$1]] Ñ\83 [[$2]].",
+       "double-redirect-fixed-move": "[[$1]] Ñ\98е Ð¿Ñ\80емеÑ\88Ñ\82ен.\nÐ\90Ñ\83Ñ\82омаÑ\82Ñ\81ки Ñ\98е Ð°Ð¶Ñ\83Ñ\80иÑ\80ано Ð¸ Ñ\81ада Ð¿Ñ\80еÑ\83Ñ\81меÑ\80ава на [[$2]].",
+       "double-redirect-fixed-maintenance": "Ð\90Ñ\83Ñ\82омаÑ\82Ñ\81ки Ð¸Ñ\81пÑ\80авÑ\99а Ð´Ð²Ð¾Ñ\81Ñ\82Ñ\80Ñ\83ка Ð¿Ñ\80еÑ\83Ñ\81меÑ\80еÑ\9aа Ð¸Ð· [[$1]] Ñ\83 [[$2]]. Ð\9aао Ð´ÐµÐ¾ Ð¾Ð´Ñ\80жаваÑ\9aа.",
        "double-redirect-fixer": "Исправљач преусмерења",
        "brokenredirects": "Покварена преусмерења",
        "brokenredirectstext": "Следећа преусмерења упућују на непостојеће странице:",
        "log-title-wildcard": "тражи наслове који почињу с овим текстом",
        "showhideselectedlogentries": "Прикажи/сакриј изабране записе",
        "allpages": "Све странице",
-       "alphaindexline": "$1 до $2",
        "nextpage": "Следећа страница ($1)",
        "prevpage": "Претходна страница ($1)",
        "allpagesfrom": "Прикажи странице почев од:",
        "listusers-blocked": "({{GENDER:$1|блокиран|блокирана|блокиран}})",
        "activeusers": "Списак активних корисника",
        "activeusers-intro": "Ово је списак корисника који су били активни {{PLURAL:$1|претходни дан|у последња $1 дана|у последњих $1 дана}}.",
-       "activeusers-count": "$1 {{PLURAL:$1|измена|измене|измена}} {{PLURAL:$3|претходни дан|у последња $3 дана|у последњих $3 дана}}",
+       "activeusers-count": "$1 {{PLURAL:$1|радња|радње|радњи}} {{PLURAL:$3|претходни дан|у последња $3 дана|у последњих $3 дана}}",
        "activeusers-from": "Прикажи кориснике почев од:",
        "activeusers-hidebots": "Сакриј ботове",
        "activeusers-hidesysops": "Сакриј администраторе",
        "listgrouprights-removegroup-self": "уклањање {{PLURAL:$2|групе|група}} са свог налога: $1",
        "listgrouprights-addgroup-self-all": "Додај све групе на сопствени налог",
        "listgrouprights-removegroup-self-all": "Уклони све групе са сопственог налога",
+       "listgrouprights-namespaceprotection-namespace": "Именски простор",
+       "trackingcategories-nodesc": "Опис није доступан.",
        "mailnologin": "Нема адресе за слање",
        "mailnologintext": "Морате бити [[Special:UserLogin|пријављени]] и имати исправну е-адресу у [[Special:Preferences|подешавањима]] да бисте слали е-поруке другим корисницима.",
        "emailuser": "Пошаљи е-поруку",
        "watchlistanontext": "Морате бити $1 да бисте гледали и уређивали ставке на вашем списку надгледања.",
        "watchnologin": "Нисте пријављени",
        "addwatch": "Додај на списак надгледања",
-       "addedwatchtext": "Страница „[[:$1]]“ је додата на ваш [[Special:Watchlist|списак надгледања]].\nБудуће измене ове странице и њене странице за разговор биће наведене овде.",
+       "addedwatchtext": "Страница „[[:$1]]“ је додата на ваш [[Special:Watchlist|списак надгледања]].\nБудуће измене ове странице и њене странице за разговор биће наведене тамо.",
+       "addedwatchtext-short": "Страница „$1“ је додата на ваш списак надгледања.",
        "removewatch": "Уклони са списка надгледања",
        "removedwatchtext": "Страница „[[:$1]]“ је уклоњена с вашег [[Special:Watchlist|списка надгледања]].",
+       "removedwatchtext-short": "Страница „$1“ је уклоњена с вашег списка надгледања.",
        "watch": "Надгледај",
        "watchthispage": "Надгледај ову страницу",
        "unwatch": "Прекини надгледање",
        "watchlist-details": "Имате {{PLURAL:$1|$1 страница|$1 странице|$1 страница}} на вашем списку надгледања, не рачунајући странице за разговор.",
        "wlheader-enotif": "Обавештење е-поруком је омогућено.",
        "wlheader-showupdated": "Странице које су измењене откад сте их последњи пут посетили су '''подебљане'''.",
-       "watchmethod-recent": "проверава се да ли има надгледаних страница у скорашњим изменама",
-       "watchmethod-list": "проверава се да ли има скорашњих измена у надгледаним страницама",
-       "watchlistcontains": "Ваш списак надгледања садржи $1 {{PLURAL:$1|страницу|странице|страница}}.",
-       "iteminvalidname": "Проблем са ставком „$1“. Неисправан назив.",
        "wlnote2": "Испод су приказане измене у {{PLURAL:$1|последњих један сат|последњих <strong>$1</strong> сата}} закључно са $2, $3.",
        "wlshowlast": "Прикажи последњих $1 сати, $2 дана, $3",
        "watchlist-options": "Поставке списка надгледања",
        "enotif_lastvisited": "Погледајте $1 за све измене од ваше последње посете.",
        "enotif_lastdiff": "Погледајте $1 да видите ову измену.",
        "enotif_anon_editor": "анониман корисник $1",
-       "enotif_body": "Поштовани $WATCHINGUSERNAME,\n\n\nСтраница $PAGETITLE на викију {{SITENAME}} је $CHANGEDORCREATED дана $PAGEEDITDATE од стране {{GENDER:$PAGEEDITOR|корисника|кориснице|корисника}} $PAGEEDITOR. Погледајте $PAGETITLE_URL за текућу измену.\n\n$NEWPAGE\n\nОпис: $PAGESUMMARY $PAGEMINOREDIT\n\nКонтакт:\nе-адреса: $PAGEEDITOR_EMAIL\nвики: $PAGEEDITOR_WIKI\n\nНеће бити других обавештења у случају даљих измена уколико не посетите ову страницу.\nМожете и да поништите поставке обавештења за све странице у вашем списку надгледања.\n\nСрдачан поздрав, {{SITENAME}}\n\n--\nДа бисте променили поставке у вези са е-обавештењима, посетите\n{{canonicalurl:{{#special:Preferences}}}}\n\nДа бисте променили поставке у вези са списком надгледања, посетите\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nДа бисте уклонили ову страницу са списка надгледања, посетите\n$UNWATCHURL\n\nПодршка и даља помоћ:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Поштовани $WATCHINGUSERNAME,\n\n\nСтраница $PAGETITLE на викију {{SITENAME}} је $CHANGEDORCREATED дана $PAGEEDITDATE од стране {{GENDER:$PAGEEDITOR|корисника|кориснице|корисника}} $PAGEEDITOR. Погледајте $PAGETITLE_URL за текућу измену.\n\n$NEWPAGE\n\nОпис: $PAGESUMMARY $PAGEMINOREDIT\n\nКонтакт:\nе-адреса: $PAGEEDITOR_EMAIL\nвики: $PAGEEDITOR_WIKI\n\nНеће бити других обавештења у случају даљих измена уколико не посетите ову страницу.\nМожете и да поништите поставке обавештења за све странице у вашем списку надгледања.\n\nСрдачан поздрав, {{SITENAME}}\n\n--\nДа бисте променили поставке у вези са е-обавештењима, посетите\n{{canonicalurl:{{#special:Preferences}}}}\n\nДа бисте променили поставке у вези са списком надгледања, посетите\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nДа бисте уклонили ову страницу са списка надгледања, посетите\n$UNWATCHURL\n\nПодршка и даља помоћ:\n$HELPPAGE",
        "created": "направљена",
        "changed": "измењена",
        "deletepage": "Обриши страницу",
        "exbeforeblank": "садржај пре брисања је био: „$1“",
        "delete-confirm": "Брисање странице „$1“",
        "delete-legend": "Обриши",
-       "historywarning": "'''Упозорење:''' страница коју желите да обришете има историју с приближно $1 {{PLURAL:$1|изменом|измене|измена}}:",
+       "historywarning": "<strong>Упозорење:</strong> страница коју желите да обришете има историју с приближно $1 {{PLURAL:$1|изменом|измене|измена}}:",
        "confirmdeletetext": "Управо ћете обрисати страницу, укључујући и њену историју.\nПотврдите своју намеру, да разумете последице и да ово радите у складу с [[{{MediaWiki:Policy-url}}|правилима]].",
        "actioncomplete": "Радња је завршена",
        "actionfailed": "Радња није успела",
        "movedarticleprotection": "{{GENDER:|је преместио|је преместила|је преместио}} поставке заштите са „[[$2]]“ на „[[$1]]“",
        "protect-title": "Степен заштите за „$1“",
        "protect-title-notallowed": "Преглед степена заштите за „$1“",
-       "prot_1movedto2": "{{GENDER:|је преместио|је преместила|је преместио}} [[$1]] у [[$2]]",
+       "prot_1movedto2": "је преместио [[$1]] на [[$2]]",
        "protect-badnamespace-title": "Незаштитљив именски простор",
        "protect-badnamespace-text": "Странице у овом именском простору се не могу заштитити.",
        "protect-norestrictiontypes-title": "Незаштитљива страна",
        "contributions-title": "Доприноси {{GENDER:$1|корисника|кориснице}} $1",
        "mycontris": "Доприноси",
        "contribsub2": "За {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "Кориснички налог „$1“ није регистрован.",
        "nocontribs": "Нема измена које одговарају наведеним критеријумима.",
        "uctop": "(последња)",
        "month": "од месеца (и раније):",
        "blockip": "Блокирај корисника",
        "blockip-legend": "Блокирај корисника",
        "blockiptext": "Користите доњи образац да бисте забранили приступ за писање с одређене ИП адресе или корисничког имена.\nОво би требало да вршите само ради спречавања вандализма, у складу са [[{{MediaWiki:Policy-url}}|смерницама]].\nИзаберите конкретан разлог испод (пример: навођење конкретних страница које су вандализоване).",
-       "ipadressorusername": "ИП адреса или корисничко име:",
+       "ipaddressorusername": "ИП адреса или корисничко име:",
        "ipbexpiry": "Истиче:",
        "ipbreason": "Разлог:",
        "ipbreason-dropdown": "*Најчешћи разлози за блокирање\n** Уношење лажних информација\n** Уклањање садржаја са страница\n** Постављање веза до спољашњих сајтова\n** Уношење бесмислица у странице\n** Непристојно понашање\n** Употреба више налога\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|Друга блокада|Друге блокаде}}",
        "importuploaderrortemp": "Не могу да пошаљем датотеку за увоз.\nНедостаје привремена фасцикла.",
        "import-parse-failure": "Погрешно рашчлањивање XML-а.",
        "import-noarticle": "Нема странице за увоз!",
-       "import-nonewrevisions": "Све Ð¸Ð·Ð¼ÐµÐ½Ðµ Ñ\81Ñ\83 Ð¿Ñ\80еÑ\82Ñ\85одно Ñ\83везене.",
+       "import-nonewrevisions": "Ð\98змене Ð½Ð¸Ñ\81Ñ\83 Ñ\83везене (Ñ\81ве Ñ\81Ñ\83 Ð²ÐµÑ\9b Ð±Ð¸Ð»Ðµ Ð¸Ð»Ð¸ Ð¿Ñ\80иÑ\81Ñ\83Ñ\82не Ð¸Ð»Ð¸ Ð¿Ñ\80еÑ\81коÑ\87ене Ð·Ð±Ð¾Ð³ Ð³Ñ\80еÑ\88ки).",
        "xml-error-string": "$1 у реду $2, колона $3 (бајт $4): $5",
        "import-upload": "Отпремање XML података",
        "import-token-mismatch": "Губитак података о сесији.\nПокушајте поново.",
        "tooltip-preferences-save": "Сачувај поставке",
        "tooltip-summary": "Унесите кратак опис",
        "common.css": "/** CSS постављен овде ће се одразити на све теме */",
-       "cologneblue.css": "/* CSS постављен овде ће утицати на све кориснике теме „Келнско плава“ */",
        "monobook.css": "/* CSS постављен овде ће утицати на све кориснике теме „Монобук“ */",
-       "modern.css": "/* CSS постављен овде ће утицати на све кориснике теме „Савремено“ */",
        "vector.css": "/* CSS постављен овде ће утицати на све кориснике теме „Векторско“ */",
        "print.css": "/* CSS постављен овде ће утицати на издање за штампу */",
        "noscript.css": "/* CSS постављен овде ће утицати на све кориснике којима је онемогућен јаваскрипт */",
        "group-sysop.css": "/* CSS постављен овде ће утицати само на системске операторе */",
        "group-bureaucrat.css": "/* CSS постављен овде ће утицати само на бирократе */",
        "common.js": "/* Јаваскрипт постављен овде ће се користити за све кориснике при отварању сваке странице. */",
-       "cologneblue.js": "/* Јаваскрипт постављен овде ће се учитати за све оне који користе тему „Келнско плава“ */",
        "monobook.js": "/* Јаваскрипт постављен овде ће се учитати за све оне који користе тему „Монобук“ */",
-       "modern.js": "/* Јаваскрипт постављен овде ће се учитати за све оне који користе тему „Савремено“ */",
        "vector.js": "/* Јаваскрипт постављен овде ће се учитати за све оне који користе тему „Векторско“ */",
        "group-autoconfirmed.js": "/* Јаваскрипт постављен овде ће се учитати за самопотврђене кориснике */",
        "group-bot.js": "/* Јаваскрипт постављен овде ће се учитати само за ботове */",
        "group-sysop.js": "/* Јаваскрипт постављен овде ће се учитати само за системске операторе */",
        "group-bureaucrat.js": "/* Јаваскрипт постављен овде ће се учитати само за бирократе */",
-       "notacceptable": "Сервер не може да направи податке у формату погодном за ваш клијент.",
        "anonymous": "Анонимни {{PLURAL:$1|корисник|корисници}} на пројекту {{SITENAME}}",
        "siteuser": "{{SITENAME}} корисник $1",
        "anonuser": "{{SITENAME}} анониман корисник $1",
        "spam_reverting": "Враћам на последњу измену која не садржи везе до $1",
        "spam_blanking": "Све измене садрже везе до $1. Чистим",
        "spam_deleting": "Све измене садрже везе до $1. Бришем",
-       "simpleantispam-label": "Ð\9fÑ\80овеÑ\80а Ñ\81пама. '''Ð\9dÐ\95''' попуњавај ово унутра!",
+       "simpleantispam-label": "Ð\90нÑ\82и-Ñ\81пам Ð¿Ñ\80овеÑ\80а. \n<strong>Ð\9dÐ\95</strong> попуњавај ово унутра!",
        "pageinfo-title": "Подаци о „$1“",
        "pageinfo-not-current": "Нажалост, немогуће је прибавити ове податке за старије измене.",
        "pageinfo-header-basic": "Основни подаци",
        "pageinfo-category-pages": "Број страница",
        "pageinfo-category-subcats": "Број поткатегорија",
        "pageinfo-category-files": "Број датотека",
-       "skinname-cologneblue": "Келнско плава",
        "skinname-monobook": "Монобук",
-       "skinname-modern": "Савремено",
        "skinname-vector": "Векторско",
        "markaspatrolleddiff": "Означи као патролирано",
        "markaspatrolledtext": "Означи страницу као патролирану",
        "markedaspatrollederror": "Не могу да означим као патролирано",
        "markedaspatrollederrortext": "Морате изабрати измену да бисте је означили као прегледану.",
        "markedaspatrollederror-noautopatrol": "Не можете да означите своје измене као патролиране.",
-       "markedaspatrollednotify": "Ова измена на страници „$1“ је означена као прегледана.",
-       "markedaspatrollederrornotify": "Ð\9dиÑ\98е Ñ\83Ñ\81пеÑ\88но Ð¾Ð·Ð½Ð°Ñ\87аваÑ\9aе Ð¾Ð²Ðµ Ñ\81Ñ\82Ñ\80аниÑ\86е ÐºÐ°Ð¾ Ð¿Ñ\80егледаном.",
+       "markedaspatrollednotify": "Ова измена на страници „$1“ је означена као патролирана.",
+       "markedaspatrollederrornotify": "Ð\9eзнаÑ\87аваÑ\9aе Ð¾Ð²Ðµ Ñ\81Ñ\82Ñ\80аниÑ\86е Ð¿Ð°Ñ\82Ñ\80олиÑ\80аном Ð½Ð¸Ñ\98е Ñ\83Ñ\81пело.",
        "patrol-log-page": "Дневник патролирања",
        "patrol-log-header": "Ово је дневник патролираних измена.",
        "log-show-hide-patrol": "$1 дневник патролирања",
        "newimages-summary": "Ова посебна страница приказује последње послате датотеке.",
        "newimages-legend": "Филтер",
        "newimages-label": "Назив датотеке (или њен део):",
-       "showhidebots": "($1 ботове)",
        "noimages": "Нема ништа.",
        "ilsubmit": "Претражи",
        "bydate": "по датуму",
        "size-kilobytes": "$1 kB",
        "size-megabytes": "$1 MB",
        "size-gigabytes": "$1 GB",
-       "livepreview-loading": "Учитавам…",
-       "livepreview-ready": "Учитавање… спремно!",
-       "livepreview-failed": "Неуспешно прегледање.\nПробајте обичан преглед.",
-       "livepreview-error": "Не могу да се повежем: $1 „$2“.\nПробајте обичан приказ.",
        "lag-warn-normal": "Измене новије од $1 {{PLURAL:$1|секунде|секунде|секунди}} неће бити приказане.",
        "lag-warn-high": "Због преоптерећења базе података, измене новије од $1 {{PLURAL:$1|секунда|секунде}} неће бити приказане.",
-       "watchlistedit-numitems": "Ваш списак надгледања садржи {{PLURAL:$1|један наслов|$1 наслова|$1 наслова}}, без страница за разговор.",
-       "watchlistedit-noitems": "Ваш списак надгледања не садржи странице.",
        "watchlistedit-normal-title": "Уређивање списка надгледања",
        "watchlistedit-normal-legend": "Уклањање наслова са списка надгледања",
        "watchlistedit-normal-explain": "Наслови на вашем списку надгледања су приказани испод.\nДа бисте уклонили наслов, означите кућицу до њега и кликните на „{{int:Watchlistedit-normal-submit}}“.\nМожете и да [[Special:EditWatchlist/raw|уредите сиров списак]].",
        "watchlistedit-raw-done": "Ваш списак надгледања је ажуриран.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Додат је један наслов|Додата су $1 наслова|Додато је $1 наслова}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 наслов је уклоњен|Уклоњена су $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 наслова је уклоњено}}:",
+       "watchlisttools-clear": "испразни списак ндгледања",
        "watchlisttools-view": "прикажи сродне измене",
        "watchlisttools-edit": "прикажи и уреди списак надгледања",
        "watchlisttools-raw": "измени сиров списак надгледања",
        "version-entrypoints": "Адресе улазне тачке",
        "version-entrypoints-header-entrypoint": "Улазна тачка",
        "version-entrypoints-header-url": "Адреса",
+       "redirect": "Преусмерење на датотеку, корисника, страницу или измену",
        "redirect-legend": "Преусмери на датотеку или страницу",
        "redirect-submit": "Иди",
+       "redirect-lookup": "Тип вредности:",
        "redirect-value": "Вредност:",
-       "redirect-user": "Кориснички ID:",
+       "redirect-user": "Кориснички ID",
        "redirect-page": "ID странице",
+       "redirect-revision": "Верзија странице",
        "redirect-file": "Назив датотеке",
        "redirect-not-exists": "Вредност није пронађена",
        "fileduplicatesearch": "Претрага дупликата",
        "compare-invalid-title": "Наведени наслов је неисправан.",
        "compare-title-not-exists": "Наведени наслов не постоји.",
        "compare-revision-not-exists": "Наведена измена не постоји.",
-       "dberr-header": "Овај вики не ради како треба",
        "dberr-problems": "Дошло је до техничких проблема.",
        "dberr-again": "Сачекајте неколико минута и поново учитајте страницу.",
        "dberr-info": "(не могу да се повежем са сервером базе: $1)",
        "htmlform-float-invalid": "Наведена вредност није број.",
        "htmlform-int-toolow": "Наведена вредност је испод минимума од $1",
        "htmlform-int-toohigh": "Наведена вредност је изнад максимума од $1",
-       "htmlform-required": "Ова вредност је обавезна",
+       "htmlform-required": "Ова вредност је обавезна.",
        "htmlform-submit": "Пошаљи",
        "htmlform-reset": "Врати измене",
        "htmlform-selectorother-other": "Друго",
        "htmlform-no": "Не",
        "htmlform-yes": "Да",
        "htmlform-chosen-placeholder": "Изаберите опцију",
+       "htmlform-cloner-create": "Додај још",
+       "htmlform-cloner-delete": "Уклони",
+       "htmlform-cloner-required": "Бар једна вредност је потребна.",
        "sqlite-has-fts": "$1 с подршком претраге целог текста",
        "sqlite-no-fts": "$1 без подршке претраге целог текста",
        "logentry-delete-delete": "$1 је {{GENDER:$2|обрисао|обрисала}} страницу $3",
        "duration-decades": "$1 {{PLURAL:$1|деценија|деценије|деценија}}",
        "duration-centuries": "$1 {{PLURAL:$1|век|века|векова}}",
        "duration-millennia": "$1 {{PLURAL:$1|миленијум|миленијума|миленијума}}",
-       "rotate-comment": "Слика је ротирана у смеру казаљке на сату за {{PLURAL:$1|степени}}",
+       "rotate-comment": "Слика је ротирана за $1° у смеру казаљке на сату",
        "limitreport-cputime-value": "$1 {{PLURAL:$1|секунда|секунд|секунди}}",
        "limitreport-walltime-value": "$1 {{PLURAL:$1|секунда|секунди}}",
        "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|бајт|бајта|бајтова}}",
index c40efa6..843ac2f 100644 (file)
@@ -15,7 +15,8 @@
                        "TheStefan12345",
                        "Жељко Тодоровић",
                        "Михајло Анђелковић",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Podvlačenje veza:",
        "jumptonavigation": "navigaciju",
        "jumptosearch": "pretragu",
        "view-pool-error": "Nažalost, serveri su trenutno preopterećeni.\nPreviše korisnika pokušava da pregleda ovu stranicu.\nSačekajte neko vreme pre nego što ponovo pokušate da joj pristupite.\n\n$1",
+       "generic-pool-error": "Nažalost, serveri su trenutno preopterećeni.\nPreviše korisnika pokušava da vidi ovaj resurs.\nSačekajte neko vreme pre nego što ponovo pokušate da mu pristupite.",
        "pool-timeout": "Istek vremena čeka na zaključavanje",
        "pool-queuefull": "Red je pun zahteva",
        "pool-errorunknown": "Nepoznata greška",
        "readonly_lag": "Baza podataka je zaključana dok se sporedni bazni serveri ne usklade s glavnim.",
        "internalerror": "Unutrašnja greška",
        "internalerror_info": "Unutrašnja greška: $1",
-       "fileappenderrorread": "Ne mogu da pročitam „$1“ tokom kačenja.",
-       "fileappenderror": "Ne mogu da zakačim „$1“ na „$2“.",
        "filecopyerror": "Ne mogu da umnožim datoteku „$1“ u „$2“.",
        "filerenameerror": "Ne mogu da preimenujem datoteku „$1“ u „$2“.",
        "filedeleteerror": "Ne mogu da obrišem datoteku „$1“.",
        "directorycreateerror": "Ne mogu da napravim fasciklu „$1“.",
        "filenotfound": "Ne mogu da pronađem datoteku „$1“.",
-       "fileexistserror": "Ne mogu da pišem po datoteci „$1“: datoteka već postoji",
        "unexpected": "Neočekivana vrednost: „$1“=„$2“.",
        "formerror": "Greška: ne mogu da pošaljem obrazac",
        "badarticleerror": "Ova radnja se ne može izvršiti na ovoj stranici.",
        "virus-unknownscanner": "nepoznati antivirus:",
        "logouttext": "'''Odjavljeni ste.'''\n\nImajte na umu da neke stranice mogu nastaviti da se prikazuju kao da ste još prijavljeni, sve dok ne očistite privremenu memoriju svog pregledača.",
        "welcomeuser": "Dobrodošli, $1!",
+       "welcomecreation-msg": "Vaš nalog je otvoren.\nNe zaboravite da promenite svoja [[Special:Preferences|podešavanja]].",
        "yourname": "Korisničko ime:",
        "userlogin-yourname": "Korisničko ime",
        "userlogin-yourname-ph": "Unesite vaše korisničko ime",
        "userlogin-helplink2": "Pomoć pri prijavljivanju",
        "userlogin-loggedin": "Već ste prijavljeni kao {{GENDER:$1|$1}}.\nKoristite donji obrazac da biste se prijavili kao drugi korisnik.",
        "userlogin-createanother": "Otvori još jedan nalog",
-       "createacct-join": "Unesite svoje podatke ispod.",
-       "createacct-another-join": "Unesite podatke za novi nalog ispod.",
        "createacct-emailrequired": "Adresa e-pošte",
        "createacct-emailoptional": "Adresa e-pošte (opciono)",
        "createacct-email-ph": "Unesite vašu adresu e-pоšte",
        "retypenew": "Potvrda lozinke:",
        "resetpass_submit": "Postavi lozinku i prijavi me",
        "changepassword-success": "Vaša lozinka je uspešno promenjena.",
+       "changepassword-throttled": "Previše puta ste pokušali da se prijavite.\nMolimo vas da sačekate $1 pre nego što pokušate ponovo.",
        "resetpass_forbidden": "Lozinka ne može biti promenjena",
        "resetpass-no-info": "Morate biti prijavljeni da biste pristupili ovoj stranici.",
        "resetpass-submit-loggedin": "Promeni lozinku",
        "resetpass-abort-generic": "Promenu lozinke je sprečio dodatak.",
        "resetpass-expired": "Vaša lozinka je istekla. Postavite novu lozinku da biste se prijavili.",
        "resetpass-expired-soft": "Vaša lozinka je istekla i morate postaviti novu. Postavite novu lozinku ili kliknite „{{int:resetpass-submit-cancel}}“ da je postavite kasnije.",
+       "resetpass-validity-soft": "Vaša lozinka nije valjana: $1\n\nMolimo izaberite novu ili kliknite „{{int:resetpass-submit-cancel}}“ da resetujete kasnije.",
        "passwordreset": "Obnavljanje lozinke",
        "passwordreset-text-one": "Popunite ovaj obrazac da biste resetovali lozinku.",
        "passwordreset-text-many": "{{PLURAL:$1|Ispunite jedno od polja kako bi ste dobili privremenu lozinku na e-poštu.}}",
        "changeemail-oldemail": "Trenutna e-adresa:",
        "changeemail-newemail": "Nova 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": "Resetuje tokene",
+       "resettokens-no-tokens": "Nema tokena za resetovanje.",
+       "resettokens-legend": "Resetuje tokene",
+       "resettokens-tokens": "Tokeni:",
        "resettokens-token-label": "$1 (trenutna vrednost: $2)",
+       "resettokens-watchlist-token": "Token za veb dovod (Atom/RSS) vašeg [[Special:Watchlist|spiska nadgledanja]]",
+       "resettokens-done": "Tokeni su resetovani",
+       "resettokens-resetbutton": "Resetuj izabrane tokene",
        "bold_sample": "Podebljan tekst",
        "bold_tip": "Podebljan tekst",
        "italic_sample": "Iskošeni tekst",
        "savearticle": "Sačuvaj stranicu",
        "preview": "Pregled",
        "showpreview": "Prikaži pretpregled",
-       "showlivepreview": "Trenutni pregled",
        "showdiff": "Prikaži izmene",
        "anoneditwarning": "'''Upozorenje:''' niste prijavljeni.\nVaša IP adresa će biti zabeležena u istoriji ove stranice.",
        "anonpreviewwarning": "''Niste prijavljeni. Vaša IP adresa će biti zabeležena u istoriji ove stranice.''",
        "summary-preview": "Pregled opisa:",
        "subject-preview": "Pregled teme/naslova:",
        "blockedtitle": "Korisnik je blokiran",
-       "blockedtext": "'''Vaše korisničko ime ili IP adresa je blokirana.'''\n\nBlokiranje je {{GENDER:$4|izvršio|izvršila}} $1.\nRazlog: ''$2''.\n\n* Datum blokiranja: $8\n* Blokiranje ističe: $6\n* Ime korisnika: $7\n\nObratite se {{GENDER:$4|korisniku|korisnici|korisniku}} $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 IB $5.\nNavedite sve podatke iznad pri stvaranja bilo kakvih upita.",
+       "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.",
        "blockednoreason": "razlog nije naveden",
        "whitelistedittext": "Za uređivanje stranice je potrebno da budete $1.",
        "session_fail_preview": "'''Nismo mogli da obradimo vašu izmenu zbog gubitka podataka sesije.'''\nPokušajte ponovo.\nAko i dalje ne radi, pokušajte da se [[Special:UserLogout|odjavite]] i ponovo prijavite.",
        "session_fail_preview_html": "'''Nismo mogli da obradimo vašu izmenu zbog gubitka podataka sesije.'''\n\n''Budući da je na ovom vikiju omogućen unos HTML oznaka, pregled je sakriven kao mera predostrožnosti protiv napada preko javaskripta.''\n\n'''Ako ste pokušali da napravite pravu izmenu, pokušajte ponovo.\nAko i dalje ne radi, pokušajte da se [[Special:UserLogout|odjavite]] i ponovo prijavite.'''",
        "token_suffix_mismatch": "'''Vaša izmena je odbačena jer je vaš pregledač ubacio znakove interpunkcije u novčić uređivanja.\nTo se ponekad događa kada se koristi neispravan posrednik.'''",
-       "edit_form_incomplete": "'''Neki delovi obrasca za uređivanje nisu dostigli do servera. Proverite da li su izmene promenjene i pokušajte ponovo.'''",
+       "edit_form_incomplete": "<strong>Neki delovi obrasca za uređivanje nisu stigli do servera. Proverite da li su vaše izmene nepromenjene i pokušajte ponovo.</strong>",
        "editing": "Uređujete $1",
        "creating": "Pravljenje stranice $1",
        "editingsection": "Uređujete $1 (odeljak)",
        "edit-gone-missing": "Ne mogu da ažuriram stranicu.\nIzgleda da je obrisana.",
        "edit-conflict": "Sukob izmena.",
        "edit-no-change": "Vaša izmena je zanemarena jer nije bilo nikakvih izmena u tekstu.",
-       "postedit-confirmation": "Vaša izmena je sačuvana.",
+       "postedit-confirmation-created": "Stranica je napravljena.",
+       "postedit-confirmation-restored": "Stranica je vraćena.",
+       "postedit-confirmation-saved": "Vaša izmena je sačuvana.",
        "edit-already-exists": "Ne mogu da napravim stranicu.\nIzgleda da ona već postoji.",
        "defaultmessagetext": "Podrazumevani tekst poruke",
        "content-failed-to-parse": "Ne mogu da raščlanim sadržaj tipa $2 za model $1: $3",
        "invalid-content-data": "Neispravni podaci sadržaja",
        "content-not-allowed-here": "Sadržaj modela „$1“ nije dozvoljen na stranici [[$2]]",
        "editwarning-warning": "Ako napustite ovu stranicu, izgubićete sve izmene koje ste napravili.\nAko ste prijavljeni, možete onemogućiti ovo upozorenje u svojim podešavanjima, u odeljku „{{int:prefs-editing}}“.",
+       "editpage-notsupportedcontentformat-title": "Format sadržaja nije podržan",
        "content-model-wikitext": "vikitekst",
        "content-model-text": "čist tekst",
        "content-model-javascript": "javaskript",
        "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-failure": "Ova izmena se ne može poništiti zbog konflikta izmena.",
+       "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:Contributions/$2|$2]] ([[User talk:$2|razgovor]])",
        "undo-summary-username-hidden": "Poništi izmenu $1 skrivenog korisnika",
        "cantcreateaccounttitle": "Ne mogu da otvorim nalog",
        "revertmerge": "rastavi",
        "mergelogpagetext": "Ispod je spisak najskorijih spajanja istorija dveju stranica.",
        "history-title": "Istorija izmena stranice „$1“",
-       "difference-title": "Razlika između izmena na stranici „$1“",
+       "difference-title": "$1 — razlika između izmena",
        "difference-title-multipage": "Razlika između stranica „$1“ i „$2“",
        "difference-multipage": "(razlike između stranica)",
        "lineno": "Red $1:",
        "shown-title": "Prikaži $1 {{PLURAL:$1|rezultat|rezultata|rezultata}} po stranici",
        "viewprevnext": "Pogledaj ($1 {{int:pipe-separator}} $2) ($3).",
        "searchmenu-exists": "'''Postoji i članak pod nazivom „[[:$1]]“.'''",
-       "searchmenu-new": "'''Napravite stranicu „[[:$1]]“.'''",
+       "searchmenu-new": "<strong>Napravite stranicu „[[:$1]]“!</strong> {{PLURAL:$2|0=|Vidi takođe razultate pretrage.}}",
        "searchprofile-articles": "Članci",
-       "searchprofile-project": "Stranice pomoći i projekata",
        "searchprofile-images": "Datoteke",
        "searchprofile-everything": "Sve",
        "searchprofile-advanced": "Napredno",
        "searchprofile-articles-tooltip": "Pretražite: $1",
-       "searchprofile-project-tooltip": "Pretražite: $1",
        "searchprofile-images-tooltip": "Pretražite datoteke",
        "searchprofile-everything-tooltip": "Pretražite sav sadržaj (uključujući stranice za razgovor)",
        "searchprofile-advanced-tooltip": "Pretražite prilagođene imenske prostore",
        "search-section": "(odeljak $1)",
        "search-suggest": "Da li ste mislili na: $1",
        "search-interwiki-caption": "Bratski projekti",
-       "search-interwiki-default": "$1 rezultati:",
+       "search-interwiki-default": "Rezultati sa $1:",
        "search-interwiki-more": "(više)",
        "search-relatedarticle": "Povezano",
        "searcheverything-enable": "svi imenski prostori",
        "search-nonefound": "Nema poklapanja.",
        "powersearch-legend": "Napredna pretraga",
        "powersearch-ns": "Traži u sledećim imenskim prostorima:",
-       "powersearch-redir": "Spisak preusmerenja",
        "powersearch-togglelabel": "Izaberi:",
        "powersearch-toggleall": "sve",
        "powersearch-togglenone": "ništa",
        "search-external": "Spoljna pretraga",
        "searchdisabled": "Pretraga je onemogućena.\nU međuvremenu možete tražiti preko Gugla.\nUpamtite da njegovi popisi ovog vikija mogu biti zastareli.",
+       "search-error": "Došlo je do greške prilikom pretrage: $1",
        "preferences": "Podešavanja",
        "mypreferences": "Podešavanja",
        "prefs-edits": "Broj izmena:",
        "recentchangesdays-max": "(najviše $1 {{PLURAL:$1|dan|dana|dana}})",
        "recentchangescount": "Broj izmena za prikaz:",
        "prefs-help-recentchangescount": "Podrazumeva skorašnje izmene, istorije stranica i dnevnike.",
+       "prefs-help-watchlist-token2": "Ovo je tajni ključ za veb dovod vašeg spiska nadgledanja.\nSvako ko zna ovaj ključ biće u mogućnosti da vidi vaša nadgledanja stoga nemojte ga odavati nikome.\nAko je potrebno možete ga [[Special:ResetTokens|resetovati]].",
        "savedprefs": "Vaša podešavanja su sačuvana.",
        "timezonelegend": "Vremenska zona:",
        "localtime": "Lokalno vreme:",
        "prefs-emailconfirm-label": "Potvrda e-adrese:",
        "youremail": "E-adresa:",
        "username": "{{GENDER:$1|Korisničko ime}}:",
-       "uid": "{{GENDER:$1|Korisnički}} ID:",
        "prefs-memberingroups": "{{PLURAL:$1|Grupa|Grupe}}:",
        "prefs-memberingroups-type": "$1",
        "prefs-registration": "Vreme upisa:",
        "prefs-advancedsearchoptions": "Napredne postavke",
        "prefs-advancedwatchlist": "Napredne postavke",
        "prefs-displayrc": "Postavke prikaza",
-       "prefs-displaysearchoptions": "Postavke prikaza",
        "prefs-displaywatchlist": "Postavke prikaza",
        "prefs-diffs": "Razlike",
        "prefs-help-prefershttps": "Ova podešavanja će stupiti na snagu pri sledećoj prijavi.",
        "userrights-changeable-col": "Grupe koje možete da promenite",
        "userrights-unchangeable-col": "Grupe koje ne možete da promenite",
        "userrights-irreversible-marker": "$1*",
+       "userrights-removed-self": "Uspešno ste sebi skinuli prava. Zbog toga nije vam dozvoljen pristup ovoj stranici.",
        "group": "Grupa:",
        "group-user": "Korisnici",
        "group-autoconfirmed": "Automatski potvrđeni korisnici",
        "right-editusercssjs": "uređivanje tuđih CSS i javaskript datoteka",
        "right-editusercss": "uređivanje tuđih CSS datoteka",
        "right-edituserjs": "uređivanje tuđih JavaScript datoteka",
+       "right-editmyusercss": "uređivanje sopstvenih CSS datoteka",
        "right-editmyuserjs": "uređivanje sopstvenih JavaScript datoteka",
+       "right-viewmywatchlist": "vidi sopstveni spisak nadgledanja",
        "right-viewmyprivateinfo": "vidite svoje lične podatke (npr. adresu e-pošte, pravo ime)",
        "right-editmyprivateinfo": "uređivanje sopstvenih ličnih podataka (npr. adresu e-pošte, pravo ime)",
        "right-editmyoptions": "uredite svoja podešavanja",
        "action-createpage": "pravljenje stranica",
        "action-createtalk": "pravljenje stranica za razgovor",
        "action-createaccount": "otvaranje ovog korisničkog naloga",
+       "action-history": "gledanje istorije ove stranice",
        "action-minoredit": "označavanje ove izmene kao manje",
        "action-move": "premesti ovu stranicu",
        "action-move-subpages": "premeštanje ove stranice i njenih podstranica",
        "action-block": "blokiranje daljih izmena ovog korisnika",
        "action-protect": "menjanje stepena zaštite ove stranice",
        "action-rollback": "brzo vraćanje izmena poslednjeg korisnika koji je menjao određenu stranicu",
-       "action-import": "uvoz ove stranice s drugog vikija",
-       "action-importupload": "uvoz ove stranice slanjem datoteke",
+       "action-import": "uvoženje stranica iz drugih vikija",
+       "action-importupload": "uvoženje stranica iz otpremljene datoteke",
        "action-patrol": "označavanje tuđih izmena pregledanim",
        "action-autopatrol": "samooznačavanje izmena pregledanim",
        "action-unwatchedpages": "pregledanje spiska nenadgledanih stranica",
        "action-siteadmin": "zaključavanje ili otključavanje baze podataka",
        "action-sendemail": "slanje e-poruka",
        "action-editmywatchlist": "izmeni svoj spisak nadgledanja",
+       "action-viewmywatchlist": "pregled vašeg spisak nadgledanja",
+       "action-viewmyprivateinfo": "pregledanje vaših ličnih podataka",
+       "action-editmyprivateinfo": "uređivanje vaših ličnih podataka",
        "nchanges": "$1 {{PLURAL:$1|izmena|izmene|izmena}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|izmena od vaše poslednje posete}}",
        "enhancedrc-history": "istorija",
        "recentchanges-label-newpage": "Nova stranica",
        "recentchanges-label-minor": "Manja izmena",
        "recentchanges-label-bot": "Ovu izmenu je napravio bot",
-       "recentchanges-label-unpatrolled": "Ova izmena još nije pregledana",
-       "recentchanges-label-plusminus": "Promena veličine stranice (u bajtovima)",
+       "recentchanges-label-unpatrolled": "Ova izmena još nije patrolirana",
+       "recentchanges-label-plusminus": "Promena veličine stranice u bajtovima",
        "recentchanges-legend-heading": "'''Legenda:'''",
        "recentchanges-legend-newpage": "([[Special:NewPages|spisak novih stranica]])",
        "rcnotefrom": "Ispod su izmene od <b>$2</b> (do <b>$1</b> izmena).",
-       "rclistfrom": "Prikaži nove izmene počev od $1",
+       "rclistfrom": "Prikaži nove izmene počev od $2 $3",
        "rcshowhideminor": "$1 manje izmene",
        "rcshowhideminor-show": "Prikaži",
        "rcshowhideminor-hide": "Sakrij",
        "uploadstash-refresh": "Osveži spisak datoteka",
        "invalid-chunk-offset": "Neispravna polazna tačka",
        "img-auth-accessdenied": "Pristup je odbijen",
-       "img-auth-nopathinfo": "Nedostaje PATH_INFO.\nVaš server nije podešen da prosleđuje ovakve podatke.\nMožda je zasnovan na CGI-ju koji ne podržava img_auth.\nPogledajte https://www.mediawiki.org/wiki/Manual:Image_Authorization?uselang=sr-ec.",
+       "img-auth-nopathinfo": "Nedostaje PATH_INFO.\nVaš server nije podešen da prosleđuje ovakve podatke.\nMožda je zasnovan na CGI-ju koji ne podržava img_auth.\nPogledajte https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization?uselang=sr-ec.",
        "img-auth-notindir": "Zahtevana putanja nije u podešenoj fascikli za slanje.",
        "img-auth-badtitle": "Ne mogu da stvorim ispravan naslov za „$1“.",
        "img-auth-nologinnWL": "Niste prijavljeni i „$1“ nije na spisku dozvoljenih.",
        "download": "preuzmi",
        "unwatchedpages": "Nenadgledane stranice",
        "listredirects": "Spisak preusmerenja",
+       "listduplicatedfiles": "Spisak dupliranih datoteka",
+       "listduplicatedfiles-summary": "Ovo je spisak datoteka koje su duplikat nekih drugih datoteka. Samo lokalne datoteke su prikazane.",
+       "listduplicatedfiles-entry": "[[:File:$1|$1]] ima [[$3|{{PLURAL:$2|jedan duplikat|$2 duplikata}}]].",
        "unusedtemplates": "Nekorišćeni šabloni",
        "unusedtemplatestext": "Ova stranica navodi sve stranice u imenskom prostoru {{ns:template}} koje nisu uključene ni na jednoj drugoj stranici.\nPre brisanja proverite da li druge stranice vode do tih šablona.",
        "unusedtemplateswlh": "ostale veze",
        "randompage": "Slučajna stranica",
        "randompage-nopages": "Nema stranica u {{PLURAL:$2|sledećem imenskom prostoru|sledećim imenskim prostorima}}: $1.",
        "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",
        "randomredirect": "Slučajno preusmerenje",
        "randomredirect-nopages": "Nema preusmerenja u imenskom prostoru „$1”.",
        "pageswithprop-submit": "Idi",
        "doubleredirects": "Dvostruka preusmerenja",
        "doubleredirectstext": "Ova stranica prikazuje stranice koje preusmeravaju na druga preusmerenja.\nSvaki red sadrži veze prema prvom i drugom preusmerenju, kao i odredišnu stranicu drugog preusmerenja koja je obično „pravi“ članak na koga prvo preusmerenje treba da upućuje.\n<del>Precrtani</del> unosi su već rešeni.",
-       "double-redirect-fixed-move": "[[$1]] je premešten.\nSada je preusmerenje na [[$2]].",
-       "double-redirect-fixed-maintenance": "Ispravljanje dvostrukih preusmerenja iz [[$1]] u [[$2]].",
+       "double-redirect-fixed-move": "[[$1]] je premešten.\nAutomatski je ažurirano i sada preusmerava na [[$2]].",
+       "double-redirect-fixed-maintenance": "Automatski ispravlja dvostruka preusmerenja iz [[$1]] u [[$2]]. Kao deo održavanja.",
        "double-redirect-fixer": "Ispravljač preusmerenja",
        "brokenredirects": "Pokvarena preusmerenja",
        "brokenredirectstext": "Sledeća preusmerenja upućuju na nepostojeće stranice:",
        "deadendpagestext": "Sledeće stranice nemaju veze do drugih stranica na ovom vikiju.",
        "protectedpages": "Zaštićene stranice",
        "protectedpages-indef": "Samo neograničene zaštite",
+       "protectedpages-summary": "Na ovoj stranici se nalazi spisak trenutno zaštićenih stranica. Za spisak zaštićenih naslova vidi [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "protectedpages-cascade": "Samo prenosive zaštite",
        "protectedpages-noredirect": "Sakrij preusmerenja",
        "protectedpagesempty": "Nema zaštićenih stranica s ovim parametrima.",
        "protectedpages-unknown-timestamp": "nema",
        "protectedpages-unknown-performer": "nema",
        "protectedtitles": "Zaštićeni naslovi",
+       "protectedtitles-summary": "Na ovoj stranici se nalazi spisak trenutno zaštićenih naslova. Za spisak trenutno zaštićenih stranica vidi [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Nema zaštićenih naslova s ovim parametrima.",
        "listusers": "Spisak korisnika",
        "listusers-editsonly": "Prikaži samo korisnike koji su uređivali",
        "log-title-wildcard": "traži naslove koji počinju s ovim tekstom",
        "showhideselectedlogentries": "Prikaži/sakrij izabrane zapise",
        "allpages": "Sve stranice",
-       "alphaindexline": "$1 do $2",
        "nextpage": "Sledeća stranica ($1)",
        "prevpage": "Prethodna stranica ($1)",
        "allpagesfrom": "Prikaži stranice počev od:",
        "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-count": "$1 {{PLURAL:$1|izmena|izmene|izmena}} {{PLURAL:$3|prethodni dan|u poslednja $3 dana|u poslednjih $3 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",
        "activeusers-hidesysops": "Sakrij administratore",
        "listgrouprights-removegroup-self": "uklanjanje {{PLURAL:$2|grupe|grupa}} sa svog naloga: $1",
        "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-nodesc": "Opis nije dostupan.",
        "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",
        "watchlistanontext": "Morate biti $1 da biste gledali i uređivali stavke na vašem spisku nadgledanja.",
        "watchnologin": "Niste prijavljeni",
        "addwatch": "Dodaj na spisak nadgledanja",
-       "addedwatchtext": "Stranica „[[:$1]]“ je dodata na vaš [[Special:Watchlist|spisak nadgledanja]].\nBuduće izmene ove stranice i njene stranice za razgovor biće navedene ovde.",
+       "addedwatchtext": "Stranica „[[:$1]]“ je dodata na vaš [[Special:Watchlist|spisak nadgledanja]].\nBuduće izmene ove stranice i njene stranice za razgovor biće navedene tamo.",
+       "addedwatchtext-short": "Stranica „$1“ je dodata na vaš spisak nadgledanja.",
        "removewatch": "Ukloni sa spiska nadgledanja",
        "removedwatchtext": "Stranica „[[:$1]]“ je uklonjena s vašeg [[Special:Watchlist|spiska nadgledanja]].",
+       "removedwatchtext-short": "Stranica „$1“ je uklonjena s vašeg spiska nadgledanja.",
        "watch": "Nadgledaj",
        "watchthispage": "Nadgledaj ovu stranicu",
        "unwatch": "Prekini nadgledanje",
        "watchlist-details": "Imate {{PLURAL:$1|$1 stranica|$1 stranice|$1 stranica}} na vašem spisku nadgledanja, ne računajući stranice za razgovor.",
        "wlheader-enotif": "Obaveštenje e-porukom je omogućeno.",
        "wlheader-showupdated": "Stranice koje su izmenjene otkad ste ih poslednji put posetili su '''podebljane'''.",
-       "watchmethod-recent": "proverava se da li ima nadgledanih stranica u skorašnjim izmenama",
-       "watchmethod-list": "proverava se da li ima skorašnjih izmena u nadgledanim stranicama",
-       "watchlistcontains": "Vaš spisak nadgledanja sadrži $1 {{PLURAL:$1|stranicu|stranice|stranica}}.",
-       "iteminvalidname": "Problem sa stavkom „$1“. Neispravan naziv.",
        "wlnote2": "Ispod su prikazane izmene u {{PLURAL:$1|poslednjih jedan sat|poslednjih <strong>$1</strong> sata}} zaključno sa $2, $3.",
        "wlshowlast": "Prikaži poslednjih $1 sati, $2 dana, $3",
        "watchlist-options": "Postavke spiska nadgledanja",
        "enotif_lastvisited": "Pogledajte $1 za sve izmene od vaše poslednje posete.",
        "enotif_lastdiff": "Pogledajte $1 da vidite ovu izmenu.",
        "enotif_anon_editor": "anoniman korisnik $1",
-       "enotif_body": "Poštovani $WATCHINGUSERNAME,\n\n\nStranica $PAGETITLE na vikiju {{SITENAME}} je $CHANGEDORCREATED dana $PAGEEDITDATE od strane {{GENDER:$PAGEEDITOR|korisnika|korisnice|korisnika}} $PAGEEDITOR. Pogledajte $PAGETITLE_URL za tekuću izmenu.\n\n$NEWPAGE\n\nOpis: $PAGESUMMARY $PAGEMINOREDIT\n\nKontakt:\ne-adresa: $PAGEEDITOR_EMAIL\nviki: $PAGEEDITOR_WIKI\n\nNeće biti drugih obaveštenja u slučaju daljih izmena ukoliko ne posetite ovu stranicu.\nMožete i da poništite postavke obaveštenja za sve stranice u vašem spisku nadgledanja.\n\nSrdačan pozdrav, {{SITENAME}}\n\n--\nDa biste promenili postavke u vezi sa e-obaveštenjima, posetite\n{{canonicalurl:{{#special:Preferences}}}}\n\nDa biste promenili postavke u vezi sa spiskom nadgledanja, posetite\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nDa biste uklonili ovu stranicu sa spiska nadgledanja, posetite\n$UNWATCHURL\n\nPodrška i dalja pomoć:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Poštovani $WATCHINGUSERNAME,\n\n\nStranica $PAGETITLE na vikiju {{SITENAME}} je $CHANGEDORCREATED dana $PAGEEDITDATE od strane {{GENDER:$PAGEEDITOR|korisnika|korisnice|korisnika}} $PAGEEDITOR. Pogledajte $PAGETITLE_URL za tekuću izmenu.\n\n$NEWPAGE\n\nOpis: $PAGESUMMARY $PAGEMINOREDIT\n\nKontakt:\ne-adresa: $PAGEEDITOR_EMAIL\nviki: $PAGEEDITOR_WIKI\n\nNeće biti drugih obaveštenja u slučaju daljih izmena ukoliko ne posetite ovu stranicu.\nMožete i da poništite postavke obaveštenja za sve stranice u vašem spisku nadgledanja.\n\nSrdačan pozdrav, {{SITENAME}}\n\n--\nDa biste promenili postavke u vezi sa e-obaveštenjima, posetite\n{{canonicalurl:{{#special:Preferences}}}}\n\nDa biste promenili postavke u vezi sa spiskom nadgledanja, posetite\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nDa biste uklonili ovu stranicu sa spiska nadgledanja, posetite\n$UNWATCHURL\n\nPodrška i dalja pomoć:\n$HELPPAGE",
        "created": "napravljena",
        "changed": "izmenjena",
        "deletepage": "Obriši stranicu",
        "exbeforeblank": "sadržaj pre brisanja je bio: „$1“",
        "delete-confirm": "Brisanje stranice „$1“",
        "delete-legend": "Obriši",
-       "historywarning": "'''Upozorenje:''' stranica koju želite da obrišete ima istoriju s približno $1 {{PLURAL:$1|izmenom|izmene|izmena}}:",
+       "historywarning": "<strong>Upozorenje:</strong> stranica koju želite da obrišete ima istoriju s približno $1 {{PLURAL:$1|izmenom|izmene|izmena}}:",
        "confirmdeletetext": "Upravo ćete obrisati stranicu, uključujući i njenu istoriju.\nPotvrdite svoju nameru, da razumete posledice i da ovo radite u skladu s [[{{MediaWiki:Policy-url}}|pravilima]].",
        "actioncomplete": "Radnja je završena",
        "actionfailed": "Radnja nije uspela",
        "movedarticleprotection": "{{GENDER:|je premestio|je premestila|je premestio}} postavke zaštite sa „[[$2]]“ na „[[$1]]“",
        "protect-title": "Stepen zaštite za „$1“",
        "protect-title-notallowed": "Pregled stepena zaštite za „$1“",
-       "prot_1movedto2": "{{GENDER:|je premestio|je premestila|je premestio}} [[$1]] u [[$2]]",
+       "prot_1movedto2": "je premestio [[$1]] na [[$2]]",
        "protect-badnamespace-title": "Nezaštitljiv imenski prostor",
        "protect-badnamespace-text": "Stranice u ovom imenskom prostoru se ne mogu zaštititi.",
        "protect-norestrictiontypes-title": "Nezaštitljiva strana",
        "contributions-title": "Doprinosi {{GENDER:$1|korisnika|korisnice}} $1",
        "mycontris": "Doprinosi",
        "contribsub2": "Za {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "Korisnički nalog „$1“ nije registrovan.",
        "nocontribs": "Nema izmena koje odgovaraju navedenim kriterijumima.",
        "uctop": "(poslednja)",
        "month": "od meseca (i ranije):",
        "blockip": "Blokiraj korisnika",
        "blockip-legend": "Blokiraj korisnika",
        "blockiptext": "Koristite donji obrazac da biste zabranili pristup za pisanje s određene IP adrese ili korisničkog imena.\nOvo bi trebalo da vršite samo radi sprečavanja vandalizma, u skladu sa [[{{MediaWiki:Policy-url}}|smernicama]].\nIzaberite konkretan razlog ispod (primer: navođenje konkretnih stranica koje su vandalizovane).",
-       "ipadressorusername": "IP adresa ili korisničko ime:",
+       "ipaddressorusername": "IP adresa ili korisničko ime:",
        "ipbexpiry": "Ističe:",
        "ipbreason": "Razlog:",
        "ipbreason-dropdown": "*Najčešći razlozi za blokiranje\n** Unošenje lažnih informacija\n** Uklanjanje sadržaja sa stranica\n** Postavljanje veza do spoljašnjih sajtova\n** Unošenje besmislica u stranice\n** Nepristojno ponašanje\n** Upotreba više naloga\n** Neprihvatljivo korisničko ime",
        "range_block_disabled": "Administratorska mogućnost za blokiranje raspona IP adresa je onemogućena.",
        "ipb_expiry_invalid": "Vreme isteka je neispravno.",
        "ipb_expiry_temp": "Sakrivene blokade korisnika moraju biti trajne.",
-       "ipb_hide_invalid": "Ne mogu da potisnem ovaj nalog. Možda ima previše izmena.",
+       "ipb_hide_invalid": "Ne mogu da potisnem ovaj nalog; ima više od {{PLURAL:$1|jedne izmene|$1 izmena}}.",
        "ipb_already_blocked": "„$1“ je već blokiran",
        "ipb-needreblock": "$1 je već blokiran. Želite li da promenite podešavanja?",
        "ipb-otherblocks-header": "{{PLURAL:$1|Druga blokada|Druge blokade}}",
        "importuploaderrortemp": "Ne mogu da pošaljem datoteku za uvoz.\nNedostaje privremena fascikla.",
        "import-parse-failure": "Pogrešno raščlanjivanje XML-a.",
        "import-noarticle": "Nema stranice za uvoz!",
-       "import-nonewrevisions": "Sve izmene su prethodno uvezene.",
+       "import-nonewrevisions": "Izmene nisu uvezene (sve su već bile ili prisutne ili preskočene zbog greški).",
        "xml-error-string": "$1 u redu $2, kolona $3 (bajt $4): $5",
        "import-upload": "Otpremanje XML podataka",
        "import-token-mismatch": "Gubitak podataka o sesiji.\nPokušajte ponovo.",
        "tooltip-preferences-save": "Sačuvaj postavke",
        "tooltip-summary": "Unesite kratak opis",
        "common.css": "/** CSS postavljen ovde će se odraziti na sve teme */",
-       "cologneblue.css": "/* CSS postavljen ovde će uticati na sve korisnike teme „Kelnsko plava“ */",
        "monobook.css": "/* CSS postavljen ovde će uticati na sve korisnike teme „Monobuk“ */",
-       "modern.css": "/* CSS postavljen ovde će uticati na sve korisnike teme „Savremeno“ */",
        "vector.css": "/* CSS postavljen ovde će uticati na sve korisnike teme „Vektorsko“ */",
        "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-sysop.css": "/* CSS postavljen ovde će uticati samo na sistemske operatore */",
        "group-bureaucrat.css": "/* CSS postavljen ovde će uticati samo na birokrate */",
        "common.js": "/* Javaskript postavljen ovde će se koristiti za sve korisnike pri otvaranju svake stranice. */",
-       "cologneblue.js": "/* Javaskript postavljen ovde će se učitati za sve one koji koriste temu „Kelnsko plava“ */",
        "monobook.js": "/* Javaskript postavljen ovde će se učitati za sve one koji koriste temu „Monobuk“ */",
-       "modern.js": "/* Javaskript postavljen ovde će se učitati za sve one koji koriste temu „Savremeno“ */",
        "vector.js": "/* Javaskript postavljen ovde će se učitati za sve one koji koriste temu „Vektorsko“ */",
        "group-autoconfirmed.js": "/* Javaskript postavljen ovde će se učitati za samopotvrđene korisnike */",
        "group-bot.js": "/* Javaskript postavljen ovde će se učitati samo za botove */",
        "group-sysop.js": "/* Javaskript postavljen ovde će se učitati samo za sistemske operatore */",
        "group-bureaucrat.js": "/* Javaskript postavljen ovde će se učitati samo za birokrate */",
-       "notacceptable": "Server ne može da napravi podatke u formatu pogodnom za vaš klijent.",
        "anonymous": "Anonimni {{PLURAL:$1|korisnik|korisnici}} na projektu {{SITENAME}}",
        "siteuser": "{{SITENAME}} korisnik $1",
        "anonuser": "{{SITENAME}} anoniman korisnik $1",
        "pageinfo-category-pages": "Broj stranica",
        "pageinfo-category-subcats": "Broj potkategorija",
        "pageinfo-category-files": "Broj datoteka",
-       "skinname-cologneblue": "Kelnsko plava",
        "skinname-monobook": "Monobuk",
-       "skinname-modern": "Savremeno",
        "skinname-vector": "Vektorsko",
        "markaspatrolleddiff": "Označi kao patrolirano",
        "markaspatrolledtext": "Označi stranicu kao patroliranu",
        "markedaspatrollederror": "Ne mogu da označim kao patrolirano",
        "markedaspatrollederrortext": "Morate izabrati izmenu da biste je označili kao pregledanu.",
        "markedaspatrollederror-noautopatrol": "Ne možete da označite svoje izmene kao patrolirane.",
-       "markedaspatrollednotify": "Ova izmena na stranici „$1“ je označena kao pregledana.",
-       "markedaspatrollederrornotify": "Nije uspešno označavanje ove stranice kao pregledanom.",
+       "markedaspatrollednotify": "Ova izmena na stranici „$1“ je označena kao patrolirana.",
+       "markedaspatrollederrornotify": "Označavanje ove stranice patroliranom nije uspelo.",
        "patrol-log-page": "Dnevnik patroliranja",
        "patrol-log-header": "Ovo je dnevnik patroliranih izmena.",
        "log-show-hide-patrol": "$1 dnevnik patroliranja",
        "newimages-summary": "Ova posebna stranica prikazuje poslednje poslate datoteke.",
        "newimages-legend": "Filter",
        "newimages-label": "Naziv datoteke (ili njen deo):",
-       "showhidebots": "($1 botove)",
        "noimages": "Nema ništa.",
        "ilsubmit": "Pretraži",
        "bydate": "po datumu",
        "just-now": "upravo sad",
        "hours-ago": "Pre $1 {{PLURAL:$1|sat|sata|sati}}",
        "minutes-ago": "Pre $1 {{PLURAL:$1|minut|minuta}}",
+       "seconds-ago": "Pre $1 {{PLURAL:$1|sekunda|sekundi}}",
+       "monday-at": "Ponedeljak u $1",
+       "tuesday-at": "Utorak u $1",
+       "wednesday-at": "Sreda u $1",
+       "thursday-at": "Četvrtak u $1",
+       "friday-at": "Petak u $1",
+       "saturday-at": "Subota u $1",
+       "sunday-at": "Nedelja u $1",
+       "yesterday-at": "Juče u $1",
        "bad_image_list": "Format je sledeći:\n\nRazmatraju se samo nabrajanja (redovi koji počinju sa zvezdicom).\nPrva veza u redu mora da bude veza do neispravne datoteke.\nSve daljnje veze u istom redu smatraju se izuzecima.",
        "variantname-zh-hans": "hans",
        "variantname-zh-hant": "hant",
        "imgmultipagenext": "sledeća stranica →",
        "imgmultigo": "Idi!",
        "imgmultigoto": "Idi na stranicu $1",
+       "img-lang-default": "(podrazumevani jezik)",
        "img-lang-go": "Idi",
        "ascending_abbrev": "rast.",
        "descending_abbrev": "opad.",
        "size-kilobytes": "$1 kB",
        "size-megabytes": "$1 MB",
        "size-gigabytes": "$1 GB",
-       "livepreview-loading": "Učitavam…",
-       "livepreview-ready": "Učitavanje… spremno!",
-       "livepreview-failed": "Neuspešno pregledanje.\nProbajte običan pregled.",
-       "livepreview-error": "Ne mogu da se povežem: $1 „$2“.\nProbajte običan prikaz.",
        "lag-warn-normal": "Izmene novije od $1 {{PLURAL:$1|sekunde|sekunde|sekundi}} neće biti prikazane.",
        "lag-warn-high": "Zbog preopterećenja baze podataka, izmene novije od $1 {{PLURAL:$1|sekunde|sekundi}} neće biti prikazane.",
-       "watchlistedit-numitems": "Vaš spisak nadgledanja sadrži {{PLURAL:$1|jedan naslov|$1 naslova|$1 naslova}}, bez stranica za razgovor.",
-       "watchlistedit-noitems": "Vaš spisak nadgledanja ne sadrži stranice.",
        "watchlistedit-normal-title": "Uređivanje spiska nadgledanja",
        "watchlistedit-normal-legend": "Uklanjanje naslova sa spiska nadgledanja",
        "watchlistedit-normal-explain": "Naslovi na vašem spisku nadgledanja su prikazani ispod.\nDa biste uklonili naslov, označite kućicu do njega i kliknite na „{{int:Watchlistedit-normal-submit}}“.\nMožete i da [[Special:EditWatchlist/raw|uredite sirov spisak]].",
        "watchlistedit-raw-done": "Vaš spisak nadgledanja je ažuriran.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Dodat je jedan naslov|Dodata su $1 naslova|Dodato je $1 naslova}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 naslov je uklonjen|Uklonjena su $1 naslova|Uklonjeno je $1 naslova}}:",
+       "watchlistedit-clear-legend": "Isprazni spisak nadgledanja",
+       "watchlistedit-clear-explain": "Svi naslovi će biti uklonjeni iz vašeg spiska nadgledanja.",
+       "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}}:",
+       "watchlisttools-clear": "isprazni spisak nadgledanja",
        "watchlisttools-view": "prikaži srodne izmene",
        "watchlisttools-edit": "prikaži i uredi spisak nadgledanja",
        "watchlisttools-raw": "izmeni sirov spisak nadgledanja",
        "version-hook-subscribedby": "Prijavljeno od",
        "version-version": "(izdanje $1)",
        "version-svn-revision": "(izm. $2)",
-       "version-license": "Licenca",
+       "version-license": "Medijaviki licenca",
        "version-ext-license": "Licenca",
+       "version-ext-colheader-name": "Ekstenzija",
        "version-ext-colheader-version": "Verzija",
        "version-ext-colheader-license": "Licenca",
        "version-ext-colheader-description": "Opis",
        "version-ext-colheader-credits": "Autori",
+       "version-license-title": "Licenca za $1",
        "version-poweredby-credits": "Ovaj viki pokreće '''[https://www.mediawiki.org/ Medijaviki]''', autorska prava © 2001-$1 $2.",
        "version-poweredby-others": "ostali",
+       "version-poweredby-translators": "translatewiki.net prevodioci",
        "version-credits-summary": "Želeli bismo da zahvalimo sledećim ljudima na njihovom doprinosu [[Special:Version|Medijavikiji]].",
        "version-license-info": "Medijaviki je slobodan softver možete ga redistribuirati i/ili modifikovati pod uslovima GNU-ove opšte javne licence verzija 2 ili svake sledeće koju objavi Zadužbina za slobodan softver.\n\nMedijaviki se redistribuirati u nadi da će biti od koristi, ali BEZ IKAKVE GARANCIJE čak i bez PODRAZUMEVANE GARANCIJE FUNKCIONALNOSTI ili PRIKLADNOSTI ZA ODREĐENEU NAMENU. Pogledajte GNU-ovu opštu javnu licencu za više informacija.\n\nTrebalo bi da ste primili [{{SERVER}}{{SCRIPTPATH}}/COPYING primerak GNU-ove opšte javne licence] zajedno s ovim programom. Ako niste, pišite na Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA ili [//www.gnu.org/licenses/old-licenses/gpl-2.0.html pročitajte ovde].",
        "version-software": "Instalirani softver",
        "version-entrypoints": "Adrese ulazne tačke",
        "version-entrypoints-header-entrypoint": "Ulazna tačka",
        "version-entrypoints-header-url": "Adresa",
+       "redirect": "Preusmerenje na datoteku, korisnika, stranicu ili izmenu",
        "redirect-legend": "Preusmeri na datoteku ili stranicu",
        "redirect-submit": "Idi",
+       "redirect-lookup": "Tip vrednosti:",
        "redirect-value": "Vrednost:",
+       "redirect-user": "Korisnički ID",
+       "redirect-page": "ID stranice",
        "redirect-file": "Naziv datoteke",
        "redirect-not-exists": "Vrednost nije pronađen",
        "fileduplicatesearch": "Pretraga duplikata",
        "compare-invalid-title": "Navedeni naslov je neispravan.",
        "compare-title-not-exists": "Navedeni naslov ne postoji.",
        "compare-revision-not-exists": "Navedena izmena ne postoji.",
-       "dberr-header": "Ovaj viki ne radi kako treba",
        "dberr-problems": "Došlo je do tehničkih problema.",
        "dberr-again": "Sačekajte nekoliko minuta i ponovo učitajte stranicu.",
        "dberr-info": "(ne mogu da se povežem sa serverom baze: $1)",
        "htmlform-float-invalid": "Navedena vrednost nije broj.",
        "htmlform-int-toolow": "Navedena vrednost je ispod minimuma od $1",
        "htmlform-int-toohigh": "Navedena vrednost je iznad maksimuma od $1",
-       "htmlform-required": "Ova vrednost je obavezna",
+       "htmlform-required": "Ova vrednost je obavezna.",
        "htmlform-submit": "Pošalji",
        "htmlform-reset": "Vrati izmene",
        "htmlform-selectorother-other": "Drugo",
        "htmlform-no": "Ne",
        "htmlform-yes": "Da",
        "htmlform-chosen-placeholder": "Izaberite opciju",
+       "htmlform-cloner-create": "Dodaj još",
+       "htmlform-cloner-delete": "Ukloni",
+       "htmlform-cloner-required": "Bar jedna vrednost je potrebna.",
        "sqlite-has-fts": "$1 s podrškom pretrage celog teksta",
        "sqlite-no-fts": "$1 bez podrške pretrage celog teksta",
        "logentry-delete-delete": "$1 je {{GENDER:$2|obrisao|obrisala}} stranicu $3",
        "logentry-newusers-create2": "$1 je {{GENDER:$2|otvorio|otvorila}} korisnički nalog $3",
        "logentry-newusers-byemail": "Korisnički nalog $3 je {{GENDER:$2|napravljen}} od strane $1 i lozinka je poslata na e-poštu",
        "logentry-newusers-autocreate": "Korisnički nalog $1 je automatski {{GENDER:$2|otvoren}}",
-       "logentry-rights-rights": "$1 je {{GENDER:$1|promenio|promenila}} članstvo grupe za $3 iz $4 u $5",
+       "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",
        "rightsnone": "(nema)",
        "api-error-ok-but-empty": "Unutrašnja greška: server ne odgovara.",
        "api-error-overwrite": "Zamenjivanje postojeće datoteke je zabranjeno.",
        "api-error-stashfailed": "Unutrašnja greška: server ne može da sačuva privremenu datoteku.",
+       "api-error-publishfailed": "Unutrašnja greška: server nije uspeo da objavi privremenu datoteku.",
        "api-error-timeout": "Server nije odgovorio u očekivano vreme.",
        "api-error-unclassified": "Došlo je do nepoznate greške",
        "api-error-unknown-code": "Nepoznata greška: „$1“",
        "duration-centuries": "$1 {{PLURAL:$1|vek|veka|vekova}}",
        "duration-millennia": "$1 {{PLURAL:$1|milenijum|milenijuma|milenijuma}}",
        "rotate-comment": "Slika je rotirana za $1° u smeru kazaljke na satu",
+       "limitreport-cputime-value": "$1 {{PLURAL:$1|sekunda|sekund|sekundi}}",
+       "limitreport-walltime-value": "$1 {{PLURAL:$1|sekund|sekunde|sekundi}}",
+       "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|bajt|bajta|bajtova}}",
+       "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|bajt|bajta|bajtova}}",
        "expandtemplates": "Zamena šablona",
        "expand_templates_intro": "Ova posebna stranica uzima tekst i menja sve šablone u njemu rekurzivno.\nTakođe menja funkcije parsera kao što je <code><nowiki>{{</nowiki>#language:…}}</code> i promenljive kao što je <code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nZapravo praktično sve što se nalazi između vitičastih zagrada.",
        "expand_templates_title": "Naziv konteksta; za {{STRANICA}} itd.:",
index 221ac13..9319a88 100644 (file)
@@ -6,7 +6,8 @@
                        "Kaganer",
                        "Ooswesthoesbes",
                        "Stretsh",
-                       "Urhixidur"
+                       "Urhixidur",
+                       "아라"
                ]
        },
        "tog-underline": "Poti strepi ondro den miti:",
@@ -17,7 +18,6 @@
        "tog-showtoolbar": "Sori Kenki-Wrokosani-barki (JavaScript)",
        "tog-editondblclick": "Naki tu tron fu kenki (JavaScript)",
        "tog-editsectiononrightclick": "Gi primisi fu kenki pisi-papira nanga wan naki n'a leti-anu sey na tapu wan pisi-ede (JavaScript)",
-       "tog-rememberpassword": "Memre mi psawortu (for a maximum of $1 {{PLURAL:$1|day|days}})",
        "tog-watchcreations": "Tan luku den papira di mi meki",
        "tog-watchdefault": "Tan luku den papira di mi kenki",
        "tog-watchmoves": "Tan luku den papira di mi froysi",
        "filedeleteerror": "No ben man puru a file “$1”.",
        "directorycreateerror": "No ben man meki a map “$1”.",
        "filenotfound": "Ne ben man feni a file “$1”.",
-       "fileexistserror": "No man skrifi go na file “$1”: a file de kaba",
        "unexpected": "No ben ferwakti a warti disi: \"$1\"=\"$2\".",
        "formerror": "Fowtu: no ben man seni a formulier",
        "badarticleerror": "No man du a sani disi na tapu a papira disi.",
        "savearticle": "Kibri a papira disi",
        "preview": "Luku-na-fesi",
        "showpreview": "Sori na fesi",
-       "showlivepreview": "Fusi libi si pre kenki (LIVE)",
        "showdiff": "Sori den kenki",
        "anoneditwarning": "'''Warskow:''' Yu no psa kon ete. Yu IP o kibri poti ini a kenki historia fu a papira disi.",
        "missingcommenttext": "Presi yu oponaki dyaso-ondro.",
        "recentchanges": "Laste kenki",
        "recentchanges-feed-description": "Nanga a feed disi yu kan luku den moro nyun kenki fu a wiki disi.",
        "rcnotefrom": "Kenki fu '''$2''' (e sori te go miti '''$1''' kenki).",
-       "rclistfrom": "Sori nyun kenki, bigin fu $1",
+       "rclistfrom": "Sori nyun kenki, bigin fu $3 $2",
        "rcshowhideminor": "$1 den pikin kenki",
        "rcshowhidebots": "$1 den bot",
        "rcshowhideliu": "$1 kebroikiman di psa kon",
index c043f94..cedcb88 100644 (file)
@@ -8,7 +8,8 @@
                        "Purodha",
                        "Pyt",
                        "Reedy",
-                       "Urhixidur"
+                       "Urhixidur",
+                       "아라"
                ]
        },
        "tog-underline": "Ferwiese unnerstriekje:",
@@ -21,7 +22,6 @@
        "tog-showtoolbar": "Beoarbaidengs-Reewen anwiese",
        "tog-editondblclick": "Sieden mäd Dubbeldklik beoarbaidje (JavaScript)",
        "tog-editsectiononrightclick": "Eenpelde Ousatse mäd Gjuchtsklik beoarbaidje (JavaScript)",
-       "tog-rememberpassword": "Mäd dissen Browser duurhaft ounmälded blieuwe (Maximoal foar $1 {{PLURAL:$1|Dai|Deege}})",
        "tog-watchcreations": "Aal do sälwen näi anlaide Sieden beooboachtje",
        "tog-watchdefault": "Aal do sälwen annerde Sieden beooboachtje",
        "tog-watchmoves": "Aal do sälwen ferskäuwene Sieden beooboachtje",
        "readonly_lag": "Ju Doatenboank wuud automatisk foar Skrieuwtougriepe speerd, deermäd sik do ferdeelde Doatenboankservere (slaves) mäd dän Hauddoatenboankserver (master) ouglieke konnen.",
        "internalerror": "Interne Failer",
        "internalerror_info": "Interne Failer: $1",
-       "fileappenderrorread": "„$1“ kuud unner dät Touhoopeföigjen nit leesen wäide.",
-       "fileappenderror": "Kuud „$1“ nit an „$2“ anhongje.",
        "filecopyerror": "Kuude Doatäi \"$1\" nit ätter \"$2\" kopierje.",
        "filerenameerror": "Kuude Doatäi \"$1\" nit ätter \"$2\" uumenaame.",
        "filedeleteerror": "Kuude Doatäi \"$1\" nit läskje.",
        "directorycreateerror": "Dät Ferteeknis „$1“ kuude nit anlaid wäide.",
        "filenotfound": "Kuude Doatäi \"$1\" nit fiende.",
-       "fileexistserror": "In ju Doatäi „$1“ kuude nit skrieuwen wäide, deer ju Doatäi al bestoant.",
        "unexpected": "Uunferwachteden Wäid: „$1“=„$2“.",
        "formerror": "<b style=\"color: #cc0000;\">Failer: Do Iengoawen konne nit feroarbaided wäide.</b>",
        "badarticleerror": "Disse Honnelenge kon ap disse Siede nit moaked wäide.",
        "savearticle": "Siede spiekerje",
        "preview": "Foarbekiek",
        "showpreview": "Foarbekiek wiese",
-       "showlivepreview": "Live-Foarbekiek",
        "showdiff": "Annerengen wiese",
        "anoneditwarning": "'''Woarskauenge:''' Du beoarbaidest disse Siede, man du bäst nit anmälded. Wan du spiekerst, wäd dien aktuelle IP-Adresse in ju Versionsgeskichte apteekend un is deermäd  '''eepentelk''' ientousjoon.",
        "anonpreviewwarning": "\"Du bäst nit ounmälded. Bie dät Spiekerjen wäd dien IP-Adrässe in ju Versionsgeskichte apteekend.\"",
        "search-nonefound": "Foar dien Säikanfroage wuuden neen Resultoate fuunen.",
        "powersearch-legend": "Fääre säike",
        "powersearch-ns": "Säik in Noomensruume:",
-       "powersearch-redir": "Fäärelaitengen anwiese",
        "powersearch-togglelabel": "Wääl uut:",
        "powersearch-toggleall": "Aal",
        "powersearch-togglenone": "Neen",
        "prefs-advancedsearchoptions": "Uutwiedede Optione",
        "prefs-advancedwatchlist": "Uutwiedede Optione",
        "prefs-displayrc": "Anwies-Optione",
-       "prefs-displaysearchoptions": "Anwies-Optione",
        "prefs-displaywatchlist": "Anwies-Optione",
        "prefs-diffs": "Versionsfergliek",
        "email-address-validity-valid": "Gultige E-Mail-Adrässe",
        "recentchanges-label-unpatrolled": "Nit-kontrollierde Annerenge",
        "recentchanges-legend-newpage": "$1 - näie Siede",
        "rcnotefrom": "Anwiesd wäide do Annerengen siet '''$2''' (max. '''$1''' Iendraage).",
-       "rclistfrom": "Bloot näie Annerengen siet $1 wiese.",
+       "rclistfrom": "Bloot näie Annerengen siet $3 $2 wiese.",
        "rcshowhideminor": "Litje Annerengen $1",
        "rcshowhidebots": "Bots $1",
        "rcshowhideliu": "Anmäldede Benutsere $1",
        "uploadstash-errclear": "Dät Wächhoaljen fon in foaruut spiekerde Doatäie hied naan Ärfoulch.",
        "uploadstash-refresh": "Lieste fon Doatäie aktualisierje.",
        "img-auth-accessdenied": "Tougriep ferwäigerd",
-       "img-auth-nopathinfo": "PATH_INFO failt.\nDie Server is nit deerfoar iengjucht, disse Information fääretoureeken.\nJu kuud CGI-basierd weese un unnerstutset img_auth nit.\nSjuch https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "PATH_INFO failt.\nDie Server is nit deerfoar iengjucht, disse Information fääretoureeken.\nJu kuud CGI-basierd weese un unnerstutset img_auth nit.\nSjuch https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Dät wonskede Paad is nit in dät konfigurierde Uploadferteeknis.",
        "img-auth-badtitle": "Uut „$1“ kon naan gultigen Tittel moaked wäide.",
        "img-auth-nologinnWL": "Du bäst nit anmälded un „$1“ is nit in ju wiete Lieste.",
        "watchlist-details": "Jie beooboachtje {{PLURAL:$1|1 Siede|$1 Sieden}} (Diskussionssieden wuuden hier nit meetäld).",
        "wlheader-enotif": "E-Mail-Beskeed is aktivierd.",
        "wlheader-showupdated": "Sieden, do ätter dien lääste Besäik annerd wuuden sunt, wäide '''fat''' deerstoald.",
-       "watchmethod-recent": "Uurpröiwjen fon do lääste Beoarbaidengen foar ju Beooboachtengslieste",
-       "watchmethod-list": "Uurpröiwjen fon ju Beooboachtengslieste ätter lääste Beoarbaidengen",
-       "watchlistcontains": "Jou Beooboachtengslieste änthaalt $1 {{PLURAL:$1|Siede|Sieden}}.",
-       "iteminvalidname": "Problem mäd dän Iendraach '$1', ungultige Noome...",
        "wlshowlast": "Wies do lääste $1 Uuren, $2 Deege, of $3 (in do lääste 30 Deege).",
        "watchlist-options": "Anwiesoptione",
        "watching": "Beooboachtje …",
        "enotif_lastvisited": "Aal Annerengen ap aan Blik: $1",
        "enotif_lastdiff": "$1 wiest alle Annerengen mäd aan Glap.",
        "enotif_anon_editor": "Anonyme Benutser $1",
-       "enotif_body": "Ljoowe $WATCHINGUSERNAME,\n\nJu {{SITENAME}} Siede $PAGETITLE wuude fon $PAGEEDITOR an dän $PAGEEDITDATE $CHANGEDORCREATED, sjuch $PAGETITLE_URL foar ju aktuälle Version.\n\n$NEWPAGE\n\nTouhoopefoatenge fon dän Editor: $PAGESUMMARY $PAGEMINOREDIT\n\nKontakt toun Beoarbaider:\nMail $PAGEEDITOR_EMAIL\nWiki $PAGEEDITOR_WIKI\n\nDer wäide soloange neen wiedere Mails toun Beskeed soand, bit du ju Siede wier besoacht hääst. Ap dien Beooboachtengssiede koast du aal Markere toun Beskeed touhoope touräächsätte.\n\nDien früntelk {{SITENAME}} Becheedtälsystem\n\n--\n\nUum do Ienstaaleungen fon dät E-Mail-Becheedtälsystem antoupaasjen, besäik \n{{canonicalurl:{{#special:Preferences}}}}\n\nUum do Ienstaalengen fon dien Beooboachtengslieste antoupaasjen, besäik\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nUum ju Siede fon dien Kontrollieste tou läskjen, besäik\n$UNWATCHURL\n\nTouräächmäldengen un wiedere Hälpe: {{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Ljoowe $WATCHINGUSERNAME,\n\nJu {{SITENAME}} Siede $PAGETITLE wuude fon $PAGEEDITOR an dän $PAGEEDITDATE $CHANGEDORCREATED, sjuch $PAGETITLE_URL foar ju aktuälle Version.\n\n$NEWPAGE\n\nTouhoopefoatenge fon dän Editor: $PAGESUMMARY $PAGEMINOREDIT\n\nKontakt toun Beoarbaider:\nMail $PAGEEDITOR_EMAIL\nWiki $PAGEEDITOR_WIKI\n\nDer wäide soloange neen wiedere Mails toun Beskeed soand, bit du ju Siede wier besoacht hääst. Ap dien Beooboachtengssiede koast du aal Markere toun Beskeed touhoope touräächsätte.\n\nDien früntelk {{SITENAME}} Becheedtälsystem\n\n--\n\nUum do Ienstaaleungen fon dät E-Mail-Becheedtälsystem antoupaasjen, besäik \n{{canonicalurl:{{#special:Preferences}}}}\n\nUum do Ienstaalengen fon dien Beooboachtengslieste antoupaasjen, besäik\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nUum ju Siede fon dien Kontrollieste tou läskjen, besäik\n$UNWATCHURL\n\nTouräächmäldengen un wiedere Hälpe: $HELPPAGE",
        "created": "näi anlaid",
        "changed": "annerd",
        "deletepage": "Siede läskje",
        "blockip": "Blokkierje Benutser",
        "blockip-legend": "IP-Adresse/Benutser speere",
        "blockiptext": "Mäd dit Formular speerst du ne IP-Adresse of n Benutsernoome, so dät fon deer neen Annerengen moor foarnuumen wäide konnen.\nDit skuul bloot geböäre, uum Vandalismus tou ferhinnerjen un in Uureenstimmenge mäd do [[{{MediaWiki:Policy-url}}|Gjuchtlienjen]].\nReek dän Gruund foar ju Speere oun.",
-       "ipadressorusername": "IP-Adresse of Benutsernoome:",
+       "ipaddressorusername": "IP-Adresse of Benutsernoome:",
        "ipbexpiry": "Oulooptied (Speerduur):",
        "ipbreason": "Begruundenge:",
        "ipbreason-dropdown": "* Algemeene Speergruunde\n** Ienföigjen fon falske Information\n** Loosmoakjen fon Sieden\n** Föiget massenhaft externe Links ien\n** Ienstaalen fon uunsinnige Seeken in Sieden\n** betruujend Ferhoolden/Belästigenge\n** Misbruuk truch moorere Benutserkonten\n** Uungoadelge Benutsernoome",
        "monobook.css": "/* Littikschrieuwen nit twinge */",
        "common.js": "/* Älk JavaScript hier wäd foar aal Benutsere foar älke Siede leeden. */",
        "monobook.js": "/* Ferallerd; benutsje insteede deerfon [[MediaWiki:common.js]] */",
-       "notacceptable": "Die Wiki-Server kon do Doaten foar dien Uutgoawe-Reewe nit apberaitje.",
        "anonymous": "{{PLURAL:$1|Anonymen Benutser|Anonyme Benutsere}} ap {{SITENAME}}",
        "siteuser": "{{SITENAME}}-Benutser $1",
        "anonuser": "Anonymen {{SITENAME}}-Benutser $1",
        "newimages-summary": "Disse Spezioalsiede wiest do toulääst hoochleedene Doatäie an.",
        "newimages-legend": "Filter",
        "newimages-label": "Doatäinoome (of n Paat deerfon):",
-       "showhidebots": "(Bots $1)",
        "noimages": "neen Bielden fuunen.",
        "ilsubmit": "Säik",
        "bydate": "ätter Doatum",
        "autosumm-replace": "Die Siedeninhoold wuude truch n uur Text ärsät: '$1'",
        "autoredircomment": "Fäärelaited ätter [[$1]]",
        "autosumm-new": "Ju Siede wuud näi anlaid: „$1“",
-       "livepreview-loading": "Leede …",
-       "livepreview-ready": "Leeden … Kloor!",
-       "livepreview-failed": "Live-Foarskau nit muugelk! Benutsje ju normoale Foarskau.",
-       "livepreview-error": "Ferbiendenge nit muugelk: $1 \"$2\". Benutsje ju normoale Foarskau.",
        "lag-warn-normal": "Beoarbaidengen fon {{PLURAL:$1|ju lääste Sekunde|$1 do lääste Sekunden}} wäide in disse Lieste noch nit anwiesd.",
        "lag-warn-high": "Ap Gruund fon hooge Doatenboankuutläästenge wäide do Beoarbaidengen fon {{PLURAL:$1|ju lääste Sekunde|do lääste $1 Sekunden}} in disse Lieste noch nit anwiesd.",
-       "watchlistedit-numitems": "Dien Beooboachtengslieste änthaalt {{PLURAL:$1|1 Iendraach |$1 Iendraage}}, Diskussionssieden wäide nit täld.",
-       "watchlistedit-noitems": "Dien Beooboachtengslieste is loos.",
        "watchlistedit-normal-title": "Beooboachtengslieste beoarbaidje",
        "watchlistedit-normal-legend": "Iendraage fon ju Beooboachtengslieste wächhoalje",
        "watchlistedit-normal-explain": "Dit sunt do Iendraage fon dien Beooboachtengslieste. Uum Iendraage wächtouhoaljen, markier do litje Kasten ieuwenske do Iendraage un klik ap dät Eende fon ju Siede ap „{{int:Watchlistedit-normal-submit}}“.\nDu koast dien Beooboachtengslieste uk in dät [[Special:EditWatchlist/raw|Liestenformoat beoarbaidje]].",
        "compare-rev1": "Version 1",
        "compare-rev2": "Version 2",
        "compare-submit": "Fergliek",
-       "dberr-header": "Dit Wiki häd n Problem",
        "dberr-problems": "Äntskeeldenge. Disse Siede häd apstuuns techniske Meelasje.",
        "dberr-again": "Fersäik n poor Minuten tou täiwen un dan näi tou leeden.",
        "dberr-info": "(Kon neen Ferbiendenge tou dän Doatenboank-Server moakje: $1)",
index 3ebe20f..be38bf4 100644 (file)
@@ -9,7 +9,8 @@
                        "Mssetiadi",
                        "Reedy",
                        "Urhixidur",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Gurat-handapan tutumbu",
@@ -22,7 +23,6 @@
        "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-rememberpassword": "Apalkeun login kuring dina ieu panyungsi (pikeun paling lila $1 {{PLURAL:$1|poé|poé}})",
        "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",
        "readonly_lag": "Pangkalan datana sacara otomatis dikonci nalika server pangkalan data sekundér disalin kana master",
        "internalerror": "Kasalahan internal",
        "internalerror_info": "Kasalahan internal: $1",
-       "fileappenderrorread": "Teu bisa maca \"$1\" nalika nambahkeun.",
-       "fileappenderror": "Teu bisa nambahkeun \"$1\" ka \"$2\".",
        "filecopyerror": "Teu bisa nyalin koropak \"$1\" ka \"$2\".",
        "filerenameerror": "Teu bisa ngaganti ngaran koropak \"$1\" jadi \"$2\".",
        "filedeleteerror": "Teu bisa ngahapus koropak \"$1\".",
        "directorycreateerror": "Henteu bisa nyieun diréktori \"$1\".",
        "filenotfound": "Teu bisa manggihan koropak \"$1\".",
-       "fileexistserror": "Henteu bisa muatkeun koropak \"$1\": gambar geus aya",
        "unexpected": "Peunteun di luar hontalan: \"$1\"=\"$2\".",
        "formerror": "Kasalahan: teu bisa ngirim formulir",
        "badarticleerror": "Peta ieu teu bisa dipigawé na kaca ieu.",
        "savearticle": "Simpen",
        "preview": "Pramidang",
        "showpreview": "Témbongkeun pramidang",
-       "showlivepreview": "Pramidang saharita",
        "showdiff": "Témbongkeun parobahan",
        "anoneditwarning": "'''Perhatosan:''' Anjeun can asup log. IP anjeun kacatet dina jujutan kaca ieu",
        "anonpreviewwarning": "\"Anjeun can asup log. Mun disimpen, alamat IP anjeun bakal kacatet dina jujutan ieu kaca.\"",
        "search-nonefound": "Euweuh hasil nu cocog jeung kueri.",
        "powersearch-legend": "Panéangan tuluy",
        "powersearch-ns": "Téangan di ngaranspasi:",
-       "powersearch-redir": "Daptar alihan",
        "powersearch-togglelabel": "Pariksa:",
        "powersearch-toggleall": "Kabéh",
        "powersearch-togglenone": "Henteu aya",
        "prefs-advancedsearchoptions": "Pilihan lengkep",
        "prefs-advancedwatchlist": "Pilihan lengkep",
        "prefs-displayrc": "Pilihan pidangan",
-       "prefs-displaysearchoptions": "Pilihan pidangan",
        "prefs-displaywatchlist": "Pilihan pidangan",
        "prefs-diffs": "Béda",
        "email-address-validity-valid": "Alamat surélék sigana bener",
        "recentchanges-label-unpatrolled": "Ieu éditan can karoris",
        "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 $1",
+       "rclistfrom": "Témbongkeun nu anyar robah nepi ka $3 $2",
        "rcshowhideminor": "$1 éditan minor",
        "rcshowhidebots": "$1 bot",
        "rcshowhideliu": "$1 kontributor nu asup log",
        "watchlist-details": "Aya {{PLURAL:$1|$1 kaca|$1 kaca}} nu ku anjeun diawaskeun, 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'''",
-       "watchmethod-recent": "mariksa nu anyar robah na kaca nu diawaskeun",
-       "watchmethod-list": "mariksa nu anyar robah na kaca nu diawaskeun",
-       "watchlistcontains": "Anjeun ngawaskeun $1 {{PLURAL:$1|kaca|kaca}}.",
-       "iteminvalidname": "Masalah dina '$1', ngaran teu bener...",
        "wlshowlast": "Témbongkeun $1 jam $2 poé $3 ahir",
        "watchlist-options": "Pilihan awaskeuneun",
        "watching": "Ngawaskeun...",
        "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",
-       "enotif_body": "Sadérék $WATCHINGUSERNAME,\n\nKaca $PAGETITLE na {{SITENAME}} geus $CHANGEDORCREATED tanggal $PAGEEDITDATE ku $PAGEEDITOR. Mangga tingal {{SERVER}}{{localurl:$PAGETITLE}} pikeun vérsi kiwari.\n\n$NEWPAGE\n\nRingkesan éditor: $PAGESUMMARY $PAGEMINOREDIT\n\nKontak éditor:\nsurat {{SERVER}}{{localurl:Husus:Emailuser|target=$PAGEEDITOR}}\nwiki {{SERVER}}{{localurl:Pamaké:$PAGEEDITOR}}\n\nMun anjeun teu sindang deui ka ieu kaca, parobahan salajengna moal diémbarkeun. Anjeun bisa ogé nyetél deui umbul-umbul pikeun sadaya kaca nu aya na daptar awaseun anjeun.\n\n             Sistim émbaran {{SITENAME}} pikeun anjeun\n\n--\nPikeun ngarobah setélan dabtar awaseun anjeun, sindang ka {{SERVER}}{{localurl:Husus:Watchlist|edit=yes}}\n\nAsupan jeung bantuan salajengna:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Sadérék $WATCHINGUSERNAME,\n\nKaca $PAGETITLE na {{SITENAME}} geus $CHANGEDORCREATED tanggal $PAGEEDITDATE ku $PAGEEDITOR. Mangga tingal {{SERVER}}{{localurl:$PAGETITLE}} pikeun vérsi kiwari.\n\n$NEWPAGE\n\nRingkesan éditor: $PAGESUMMARY $PAGEMINOREDIT\n\nKontak éditor:\nsurat {{SERVER}}{{localurl:Husus:Emailuser|target=$PAGEEDITOR}}\nwiki {{SERVER}}{{localurl:Pamaké:$PAGEEDITOR}}\n\nMun anjeun teu sindang deui ka ieu kaca, parobahan salajengna moal diémbarkeun. Anjeun bisa ogé nyetél deui umbul-umbul pikeun sadaya kaca nu aya na daptar awaseun anjeun.\n\n             Sistim émbaran {{SITENAME}} pikeun anjeun\n\n--\nPikeun ngarobah setélan dabtar awaseun anjeun, sindang ka {{SERVER}}{{localurl:Husus:Watchlist|edit=yes}}\n\nAsupan jeung bantuan salajengna:\n$HELPPAGE",
        "created": "geus dijieun",
        "changed": "geus robah",
        "deletepage": "Hapus kaca",
        "blockip": "Peungpeuk pamaké",
        "blockip-legend": "Peungpeuk pamaké",
        "blockiptext": "Paké formulir di handap pikeun meungpeuk aksés nulis ti alamat IP atawa ngaran pamaké husus. Ieu sakuduna ditujukeun pikeun nyegah vandalisme, sarta saluyu jeung [[{{MediaWiki:Policy-url}}|kawijakan]]. Eusi alesan nu jéntré (misal, ngarujuk kaca tinangtu nu geus diruksak).",
-       "ipadressorusername": "Alamat IP atawa ngaran pamaké",
+       "ipaddressorusername": "Alamat IP atawa ngaran pamaké",
        "ipbexpiry": "Kadaluarsa",
        "ipbreason": "Alesan:",
        "ipbcreateaccount": "Tong bisa nyieun rekening",
        "common.css": "/* CSS nu di angé ku kabeh ''skin'' */",
        "monobook.css": "/* édit koropak ieu pikeun nyaluyukeun kulit ''monobook'' pikeun sakabéh situs */",
        "common.js": "/* JavaScript nu aya didieu di angé ku kabeh ''skin'' */",
-       "notacceptable": "''Server'' wiki teu bisa nyadiakeun data dina format nu bisa dibaca ku klien anjeun.",
        "anonymous": "{{PLURAL:$1|Pamaké|Pamaké-pamaké}} anonim di {{SITENAME}}",
        "siteuser": "Pamaké $1 {{SITENAME}}",
        "lastmodifiedatby": "Kaca ieu panungtungan dirobah $2, $1 ku $3.",
        "imagelisttext": "Di handap ieu daptar '''$1''' {{PLURAL:$1|gambar|gambar}} nu disusun $2.",
        "newimages-summary": "Ieu kaca husus ngabéréndélkeun koropak nu alanyar dimuat.",
        "newimages-label": "Ngaran berkas (atawa sawaréh tina ngaranna):",
-       "showhidebots": "($1 bot)",
        "noimages": "Taya nanaon.",
        "ilsubmit": "Sungsi",
        "bydate": "dumasar titimangsa",
        "autosumm-replace": "Ngaganti kaca ku '$1'",
        "autoredircomment": "Mindahkeun ka [[$1]]",
        "autosumm-new": "Nyieun kaca anyar  $1",
-       "livepreview-loading": "Ngamuat…",
-       "livepreview-ready": "Ngamuat… Siap!",
-       "livepreview-failed": "Sawangan langsung gagal!\nCoba ku sawangan normal.",
-       "livepreview-error": "Gagal nyambungkeun: $1 \"$2\"\nCoba ku sawangan normal.",
        "lag-warn-normal": "Parobahan nu leuwih anyar ti $1 {{PLURAL:$1|detik|detik}} moal ditémbongkeun dina ieu béréndélan.",
        "lag-warn-high": "Kusabab kasibukan lag server pangkalan data, parobahan nu leuwih anyar $1 {{PLURAL:$1|detik|detik}} moal ditémbongkeun dina ieu béréndélan.",
-       "watchlistedit-numitems": "Daptar awaskeuneun anjeun ngandung {{PLURAL:$1|1 judul|$1 judul}}, teu kaasup kaca obrolan.",
-       "watchlistedit-noitems": "Daftar awaskeuneun anjeun kosong.",
        "watchlistedit-normal-title": "Édit daptar awaskeuneun",
        "watchlistedit-normal-legend": "Kaluarkeun judul ti daftar awaskeuneun",
        "watchlistedit-normal-submit": "Hapus judul",
        "compare-rev1": "Révisi 1",
        "compare-rev2": "Révisi 2",
        "compare-submit": "Bandingkeun",
-       "dberr-header": "Aya masalah dina ieu wiki",
        "dberr-problems": "Punten! Nuju aya gangguan téhnis.",
        "dberr-again": "Cobi antos sababaraha menit, lajeng dimuat ulang.",
        "dberr-info": "(Teu bisa nyambung jeung server pangkalan data: $1)",
index 0467a43..f527f8b 100644 (file)
@@ -56,7 +56,8 @@
                        "Where next Columbus",
                        "Where next Columbus?",
                        "WikiPhoenix",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Stryk under länkar:",
        "jumptonavigation": "navigering",
        "jumptosearch": "sök",
        "view-pool-error": "Tyvärr är servrarna överbelastade för tillfället.\nFör många användare försöker visa denna sida.\nVänta en liten stund och försök igen lite senare.\n\n$1",
+       "generic-pool-error": "Tyvärr är servrarna överbelastade för tillfället.\nFör många användare försöker visa denna resurs.\nVänta en liten stund innan du försöker komma åt resursen igen.",
        "pool-timeout": "Timeout i väntan på låsning",
        "pool-queuefull": "Kön är full",
        "pool-errorunknown": "Okänt fel",
        "databaseerror-error": "Fel: $1",
        "laggedslavemode": "<strong>Varning:</strong> Sidan kan sakna de senaste uppdateringarna.",
        "readonly": "Databasen är låst",
-       "enterlockreason": "Ange varför databasen låsts, inkludera en uppskattning om när låsningen kommer att hävas",
+       "enterlockreason": "Ange varför databasen låsts och inkludera en uppskattning om när låsningen kommer att hävas",
        "readonlytext": "Databasen är tillfälligt låst för nya inlägg och andra modifieringar, förmodligen på grund av rutinmässigt underhåll, efter vilket den kommer den att återgå till normalläge.\n\nDen administratör som låste den har angivit följande förklaring: $1",
        "missing-article": "Databasen hittade inte texten för en sida som den borde ha funnit, med namnet \"$1\" $2.\n\nDetta orsakas oftast av att man följer en inaktuell länk till en jämförelse mellan versioner (diff) eller en historiklänk för en sida som raderats.\n\nOm inte så är fallet, kan du ha hittat en bugg i mjukvaran.\nRapportera gärna problemet till någon [[Special:ListUsers/sysop|administratör]], ange då URL:en (webbadressen).",
        "missingarticle-rev": "(versionsnummer: $1)",
        "readonly_lag": "Databasen har automatiskt skrivskyddats medan slavdatabasservrarna synkroniseras med huvudservern.",
        "internalerror": "Internt fel",
        "internalerror_info": "Internt fel: $1",
-       "fileappenderrorread": "Kunde inte läsa \"$1\" medan data skulle tillföras.",
-       "fileappenderror": "Kunde inte bifoga \"$1\" till \"$2\".",
        "filecopyerror": "Kunde inte kopiera filen \"$1\" till \"$2\".",
        "filerenameerror": "Kunde inte byta namn på filen \"$1\" till \"$2\".",
        "filedeleteerror": "Kunde inte radera filen \"$1\".",
        "directorycreateerror": "Kunde inte skapa katalogen \"$1\".",
        "filenotfound": "Kunde inte hitta filen \"$1\".",
-       "fileexistserror": "Kan inte skriva till \"$1\": filen finns redan",
        "unexpected": "Oväntat värde: \"$1\"=\"$2\".",
        "formerror": "Fel: Kunde inte sända formulär",
        "badarticleerror": "Den åtgärden kan inte utföras på den här sidan.",
        "badtitletext": "Den begärda sidtiteln är antingen ogiltig eller tom, eller så är titeln felaktigt länkad från en annan wiki.\nDen kan innehålla ett eller flera tecken som inte får användas i sidtitlar.",
        "perfcached": "Följande data är cachad och är möjligtvis inte helt uppdaterad. Maximalt {{PLURAL:$1|ett|$1}} resultat finns {{PLURAL:$1|tillgängligt|tillgängliga}} i cachen.",
        "perfcachedts": "Följande data är cachad och uppdaterades senast $1. Maximalt {{PLURAL:$4|ett|$4}} resultat finns {{PLURAL:$4|tillgängligt|tillgängliga}} i cachen.",
-       "querypage-no-updates": "Uppdatering av den här sidan är inte aktiverad. Datan kommer i nuläget inte att uppdateras.",
+       "querypage-no-updates": "Uppdateringar för den här sidan är för närvarande inaktiverade.\nData kommer i nuläget inte att uppdateras.",
        "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.",
        "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'''  denna sida:",
+       "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 till 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": "'''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.",
        "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.",
        "userlogin-helplink2": "Hjälp med inloggning",
        "userlogin-loggedin": "Du är redan inloggad som {{GENDER:$1|$1}}.\nAnvänd formuläret nedan för att logga in som en annan användare.",
        "userlogin-createanother": "Skapa ett annat konto",
-       "createacct-join": "Ange din information nedan.",
-       "createacct-another-join": "Ange information för det nya kontot nedan.",
        "createacct-emailrequired": "E-postadress",
        "createacct-emailoptional": "E-postadress (valfritt)",
        "createacct-email-ph": "Bekräfta din e-postadress",
        "savearticle": "Spara sida",
        "preview": "Förhandsgranska",
        "showpreview": "Visa förhandsgranskning",
-       "showlivepreview": "Automatiskt uppdaterad förhandsvisning",
        "showdiff": "Visa ändringar",
        "anoneditwarning": "'''Varning:''' Du är inte inloggad.\nDin IP-adress kommer att sparas i historiken för den här sidan.",
        "anonpreviewwarning": "''Du är inte inloggad. Om du sparar kommer din IP-adress registreras på denna sidas redigeringshistorik.''",
        "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.",
+       "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.",
        "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]].",
        "previewnote": "'''Kom ihåg att detta bara är en förhandsvisning.'''\nDina ändringar har ännu inte sparats!",
        "continue-editing": "Fortsätt redigera",
        "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, pröva att [[Special:UserLogout|logga ut]] och logga in igen.'''",
+       "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.'''",
        "edit_form_incomplete": "'''Vissa delar av redigeringen kunde inte nå servern, dubbelkolla att dina ändringar är intakta och försök igen.'''",
        "edit-gone-missing": "Kunde inte uppdatera sidan.\nDet verkar som att den har raderats.",
        "edit-conflict": "Redigeringskonflikt.",
        "edit-no-change": "Din redigering ignorerades, eftersom ingen ändring gjordes i texten.",
-       "postedit-confirmation": "Din redigering sparades.",
+       "postedit-confirmation-created": "Sidan har skapats.",
+       "postedit-confirmation-restored": "Sidan har återställts.",
+       "postedit-confirmation-saved": "Din redigering sparades.",
        "edit-already-exists": "Sidan kunde inte skapas.\nDen finns redan.",
        "defaultmessagetext": "Standardtext för meddelande",
        "content-failed-to-parse": "Det gick inte att parsa $2 innehåll för $1 modell: $3",
        "parser-template-recursion-depth-warning": "Gräns för mallrekursionsdjup överskriden ($1)",
        "language-converter-depth-warning": "Gräns för språkkonverteringsdjup överskriden ($1)",
        "node-count-exceeded-category": "Sidor där antalet noder har överskridits",
+       "node-count-exceeded-category-desc": "En kategori för sidor där nod-räkningen överskrids.",
        "node-count-exceeded-warning": "Sidan har överskridit antalet nodar",
        "expansion-depth-exceeded-category": "Sidor där expansionsdjupet överskrids",
+       "expansion-depth-exceeded-category-desc": "Detta är en kategori för sidor där expansionsdjupet överskrids.",
        "expansion-depth-exceeded-warning": "Sidan överskrider expansionsdjupet",
        "parser-unstrip-loop-warning": "Tagavskalningsloop upptäcktes",
        "parser-unstrip-recursion-limit": "Tagavskalningsloop överskred rekursionsgränsen ($1)",
        "diff-multi-sameuser": "({{PLURAL:$1|En mellanliggande version|$1 mellanliggande versioner}} av samma användare visas inte)",
        "diff-multi-otherusers": "({{PLURAL:$1|En mellanliggande version|$1 mellanliggande versioner}} av {{PLURAL:$2|en annan användare|$2 användare}} visas inte)",
        "diff-multi-manyusers": "({{PLURAL:$1|En mellanliggande version|$1 mellanliggande versioner}} av mer än $2 användare visas inte)",
-       "difference-missing-revision": "{{PLURAL:$2|En revision|$2 revisioner}} av denna skillnad ($1) kunde inte hittas.\n\nDetta orsakas vanligtvis av att följa en utgången difflänk till en sida som har raderats.\nDetaljer kan hittas i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} raderingsloggen].",
+       "difference-missing-revision": "{{PLURAL:$2|En version|$2 versioner}} av denna skillnad ($1) kunde inte hittas.\n\nDetta orsakas vanligtvis av att följa en utgången difflänk till en sida som har raderats.\nDetaljer kan hittas i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} raderingsloggen].",
        "searchresults": "Sökresultat",
        "searchresults-title": "Sökresultat för \"$1\"",
        "toomanymatches": "Sökningen gav för många resultat, försök med en annan fråga",
        "search-nonefound": "Inga resultat matchade frågan.",
        "powersearch-legend": "Avancerad sökning",
        "powersearch-ns": "Sök i namnrymderna:",
-       "powersearch-redir": "Lista omdirigeringar",
        "powersearch-togglelabel": "Kryssa:",
        "powersearch-toggleall": "Alla",
        "powersearch-togglenone": "Ingen",
        "prefs-emailconfirm-label": "E-postbekräftelse:",
        "youremail": "E-post:",
        "username": "{{GENDER:$1|Användarnamn}}:",
-       "uid": "{{GENDER:$1|Användar}}-ID:",
        "prefs-memberingroups": "{{GENDER:$2|Medlem}} av {{PLURAL:$1|gruppen|grupperna}}:",
        "prefs-registration": "Registreringstid:",
        "yourrealname": "Riktigt namn:",
        "prefs-advancedsearchoptions": "Avancerade alternativ",
        "prefs-advancedwatchlist": "Avancerade alternativ",
        "prefs-displayrc": "Visningsalternativ",
-       "prefs-displaysearchoptions": "Visningalternativ",
        "prefs-displaywatchlist": "Visningalternativ",
        "prefs-tokenwatchlist": "Nyckel",
        "prefs-diffs": "Skillnader",
        "right-move": "Flytta sidor",
        "right-move-subpages": "Flytta sidor med deras undersidor",
        "right-move-rootuserpages": "Flytta root-användarsidor",
+       "right-move-categorypages": "Flytta kategorisidor",
        "right-movefile": "Flytta filer",
        "right-suppressredirect": "Skapa inte omdirigeringar från ursprungssidan vid sidflyttning",
        "right-upload": "Ladda upp filer",
        "action-createpage": "skapa sidor",
        "action-createtalk": "skapa diskussionssidor",
        "action-createaccount": "skapa detta användarkonto",
+       "action-history": "visa historiken för denna sida",
        "action-minoredit": "markera denna redigering som mindre",
        "action-move": "flytta denna sida",
        "action-move-subpages": "flytta denna sida, och dess undersidor",
        "action-move-rootuserpages": "flytta root-användarsidor",
+       "action-move-categorypages": "flytta kategorisidor",
        "action-movefile": "flytta den här filen",
        "action-upload": "ladda upp denna fil",
        "action-reupload": "skriva över denna existerade fil",
        "recentchanges-legend-newpage": "(se även [[Special:NewPages|listan över nya sidor]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Nedan visas ändringar sedan <strong>$2</strong> (upp till <strong>$1</strong> ändringar visas).",
-       "rclistfrom": "Visa ändringar från och med $1",
+       "rclistfrom": "Visa ändringar från och med $3 $2",
        "rcshowhideminor": "$1 mindre ändringar",
        "rcshowhideminor-show": "Visa",
        "rcshowhideminor-hide": "Dölj",
        "uploadstash-refresh": "Uppdatera listan över filer",
        "invalid-chunk-offset": "Ogiltig segmentsförskjutning",
        "img-auth-accessdenied": "Åtkomst nekad",
-       "img-auth-nopathinfo": "PATH_INFO saknas.\nDin server är inte inställd för att ge denna information.\nDen kan vara CGI-baserad och stöder inte img_auth.\n[https://www.mediawiki.org/wiki/Manual:Image_Authorization Se bildbehörighet.]",
+       "img-auth-nopathinfo": "PATH_INFO saknas.\nDin server är inte inställd för att ge denna information.\nDen kan vara CGI-baserad och stöder inte img_auth.\n[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization Se bildbehörighet.]",
        "img-auth-notindir": "Den önskade sökvägen finns inte i den inställda uppladdningskatalogen.",
        "img-auth-badtitle": "Kan inte skapa en giltig titel från \"$1\"",
        "img-auth-nologinnWL": "Du är inte inloggad och \"$1\" finns inte i vitlistan.",
        "pageswithprop-prophidden-binary": "dold binärt egenskapsvärde ($1)",
        "doubleredirects": "Dubbla omdirigeringar",
        "doubleredirectstext": "Det här är en lista över sidor som dirigerar om till andra omdirigeringssidor. \nVarje rad innehåller länkar till den första och andra omdirigeringsidan, samt till målet för den andra omdirigeringen. Målet för den andra omdirigeringen är ofta den \"riktiga\" sidan, som den första omdirigeringen egentligen ska leda till.\n<del>Överstrukna</del> poster har åtgärdats.",
-       "double-redirect-fixed-move": "[[$1]] har flyttats, och är nu en omdirigering till [[$2]]",
-       "double-redirect-fixed-maintenance": "Fixar dubbel omdirigering från [[$1]] till [[$2]].",
+       "double-redirect-fixed-move": "[[$1]] har flyttats.\nDen uppdaterades automatiskt och är nu en omdirigering till [[$2]].",
+       "double-redirect-fixed-maintenance": "Fixar automatiskt dubbel omdirigering från [[$1]] till [[$2]] i ett underhållsjobb.",
        "double-redirect-fixer": "Omdirigeringsrättaren",
        "brokenredirects": "Trasiga omdirigeringar",
        "brokenredirectstext": "Följande omdirigeringar länkar till ej existerande sidor:",
        "log-title-wildcard": "Sök efter sidtitlar som börjar med texten",
        "showhideselectedlogentries": "Visa/Dölj markerade loggposter",
        "allpages": "Alla sidor",
-       "alphaindexline": "$1 till $2",
        "nextpage": "Nästa sida ($1)",
        "prevpage": "Föregående sida ($1)",
        "allpagesfrom": "Visa sidor från och med:",
        "watchnologin": "Inte inloggad",
        "addwatch": "Lägg till i bevakningslistan",
        "addedwatchtext": "Sidan \"[[:$1]]\" har lagts till på din [[Special:Watchlist|bevakningslista]].\nFramtida ändringar av den här sidan och dess diskussionssida kommer att listas där.",
+       "addedwatchtext-short": "Sidan \"$1\" har lagts till i din bevakningslista.",
        "removewatch": "Ta bort från bevakningslistan",
        "removedwatchtext": "Sidan \"[[:$1]]\" har tagits bort från [[Special:Watchlist|din bevakningslista]].",
+       "removedwatchtext-short": "Sidan \"$1\" har tagits bort från din bevakningslista.",
        "watch": "Bevaka",
        "watchthispage": "Bevaka denna sida",
        "unwatch": "Avbevaka",
        "watchlist-details": "Du har {{PLURAL:$1|en sida|$1 sidor}} på din bevakningslista (diskussionssidor är inte separat medräknade).",
        "wlheader-enotif": "E-postmeddelanden är aktiverade.",
        "wlheader-showupdated": "Sidor som har ändrats sedan ditt senaste besök visas i '''fetstil.'''",
-       "watchmethod-recent": "letar efter bevakade sidor bland senaste ändringar",
-       "watchmethod-list": "letar efter nyligen gjorda ändringar bland bevakade sidor",
-       "watchlistcontains": "Din bevakningslista innehåller $1 {{PLURAL:$1|sida|sidor}}.",
-       "iteminvalidname": "Problem med ''$1'', ogiltigt namn...",
        "wlnote2": "Nedan finns ändringarna från {{PLURAL:$1|den senaste timmen|de senaste <strong>$1</strong> timmarna}}, med början den $2 kl. $3.",
        "wlshowlast": "Visa senaste $1 timmarna $2 dygnen $3",
        "watchlist-options": "Alternativ för bevakningslistan",
        "enotif_lastvisited": "På $1 återfinner du alla ändringar sedan ditt senaste besök.",
        "enotif_lastdiff": "Se denna ändring på $1",
        "enotif_anon_editor": "anonym användare $1",
-       "enotif_body": "Hej $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nAngiven sammanfattning av redigeringen: $PAGESUMMARY $PAGEMINOREDIT\n\nKontakta användaren:\ne-post: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nSåvida du inte besöker sidan, kommer du inte att få flera meddelanden om aktivitet på sidan när du är inloggad. Du kan också ta bort flaggan för meddelanden om ändringar på alla sidor i din bevakningslista.\n\nHälsningar från {{SITENAME}}s meddelandesystem\n\n--\nFör att ändra inställningarna för dina uppdateringar via e-post, besök\n{{canonicalurl:{{#special:Preferences}}}}\n\nFör att ändra inställningarna i din bevakningslista, besök\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nFör att radera sidan från din bevakningslista, besök\n$UNWATCHURL\n\nFeedback och ytterligare hjälp:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Hej $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nAngiven sammanfattning av redigeringen: $PAGESUMMARY $PAGEMINOREDIT\n\nKontakta användaren:\ne-post: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nSåvida du inte besöker sidan, kommer du inte att få flera meddelanden om aktivitet på sidan när du är inloggad. Du kan också ta bort flaggan för meddelanden om ändringar på alla sidor i din bevakningslista.\n\nHälsningar från {{SITENAME}}s meddelandesystem\n\n--\nFör att ändra inställningarna för dina uppdateringar via e-post, besök\n{{canonicalurl:{{#special:Preferences}}}}\n\nFör att ändra inställningarna i din bevakningslista, besök\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nFör att radera sidan från din bevakningslista, besök\n$UNWATCHURL\n\nFeedback och ytterligare hjälp:\n$HELPPAGE",
        "created": "skapad",
        "changed": "ändrad",
        "deletepage": "Radera sida",
        "blockip": "Blockera användare",
        "blockip-legend": "Blockera användare",
        "blockiptext": "Använd formuläret nedan för att blockera möjligheten att redigera sidor från en specifik IP-adress eller ett användarnamn.\nDetta bör endast göras för att förhindra vandalisering, och i överensstämmelse med gällande [[{{MediaWiki:Policy-url}}|policy]].\nAnge orsak nedan (exempelvis genom att nämna sidor som blivit vandaliserade).",
-       "ipadressorusername": "IP-adress eller användarnamn:",
+       "ipaddressorusername": "IP-adress eller användarnamn:",
        "ipbexpiry": "Varaktighet:",
        "ipbreason": "Anledning:",
        "ipbreason-dropdown": "*Vanliga motiv till blockering\n** Infogar falsk information\n** Tar bort sidinnehåll\n** Länkspam till externa sajter\n** Lägger till nonsens på sidor\n** Hotfullt beteende/trakasserier\n** Missbruk av flera användarkonton\n** Oacceptabelt användarnamn",
        "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.",
        "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.",
        "cant-move-user-page": "Du har inte behörighet att flytta användarsidor (bortsett från undersidor).",
        "cant-move-to-user-page": "Du har inte behörighet att flytta en sida till en användarsida (förutom till en användarundersida).",
+       "cant-move-category-page": "Du har inte behörighet att flytta kategorisidor.",
+       "cant-move-to-category-page": "Du har inte behörighet att en sida till en kategorisida.",
        "newtitle": "Till nya titeln:",
        "move-watch": "Bevaka denna sida",
        "movepagebtn": "Flytta sidan",
        "group-bot.js": "/* JavaScript här kommer att laddas för robotar */",
        "group-sysop.js": "/* JavaScript här kommer att laddas för administratörer */",
        "group-bureaucrat.js": "/* JavaScript här kommer att laddas för byråkrater */",
-       "notacceptable": "Den här wiki-servern kan inte erbjuda data i ett format som din klient kan läsa.",
        "anonymous": "{{PLURAL:$1|Anonym användare|Anonyma användare}} på {{SITENAME}}",
        "siteuser": "användaren $1 på {{SITENAME}}",
        "anonuser": "{{SITENAME}} anonym användare $1",
        "newimages-summary": "Den här specialsidan visar de senast uppladdade filerna.",
        "newimages-legend": "Filter",
        "newimages-label": "Filnamn (eller en del av det):",
-       "showhidebots": "($1 robotar)",
+       "newimages-showbots": "Visa uppladdningar av botar",
        "noimages": "Ingenting att se.",
        "ilsubmit": "Sök",
        "bydate": "efter datum",
        "size-kilobytes": "$1 kbyte",
        "size-megabytes": "$1 Mbyte",
        "size-gigabytes": "$1 Gbyte",
-       "livepreview-loading": "Laddar…",
-       "livepreview-ready": "Laddar… Färdig!",
-       "livepreview-failed": "Live preview misslyckades!\nPröva vanlig förhandsgranskning istället.",
-       "livepreview-error": "Lyckades inte ansluta: $1 \"$2\"\nPröva vanlig förhandsgranskning istället.",
        "lag-warn-normal": "Ändringar under {{PLURAL:$1|den senaste sekunden|de $1 senaste sekunderna}} kanske inte visas i den här listan.",
        "lag-warn-high": "På grund av omfattande fördröjning i databasen visas kanske inte ändringar nyare än $1 {{PLURAL:$1|sekund|sekunder}} i den här listan.",
-       "watchlistedit-numitems": "Din bevakningslista innehåller {{PLURAL:$1|1 sida|$1 sidor}}, utöver diskussionsidor.",
-       "watchlistedit-noitems": "Din bevakningslista innehåller inga sidor.",
        "watchlistedit-normal-title": "Redigera bevakningslista",
        "watchlistedit-normal-legend": "Ta bort sidor från bevakningslistan",
        "watchlistedit-normal-explain": "Titlar på din bevakningslista visas nedan.\nFör att ta bort en titel, markera rutan bredvid den och klicka på \"{{int:Watchlistedit-normal-submit}}\".\nDu kan också [[Special:EditWatchlist/raw|redigera listan i råformat]].",
        "watchlistedit-raw-done": "Din bevakningslista har uppdaterats.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 sida|$1 sidor}} lades till:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 sida|$1 sidor}} togs bort:",
+       "watchlistedit-clear-title": "Rensa bevakningslistan",
+       "watchlistedit-clear-legend": "Rensa bevakningslistan",
+       "watchlistedit-clear-explain": "Alla titlar kommer att tas bort från din bevakningslista",
+       "watchlistedit-clear-titles": "Titlar:",
+       "watchlistedit-clear-submit": "Rensa bevakningslistan (Detta är permanent!)",
+       "watchlistedit-clear-done": "Din bevakningslista har rensats.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|1 titel|$1 titlar}} togs bort:",
+       "watchlistedit-too-many": "Det finns för många sidor att visa här.",
+       "watchlisttools-clear": "Rensa bevakningslistan",
        "watchlisttools-view": "Visa relevanta ändringar",
        "watchlisttools-edit": "Visa och redigera bevakningslistan",
        "watchlisttools-raw": "Redigera bevakningslistan i råformat",
        "compare-invalid-title": "Titeln du angav är ogiltig.",
        "compare-title-not-exists": "Titeln du angav finns inte.",
        "compare-revision-not-exists": "Versionen du angav finns inte.",
-       "dberr-header": "Den här wikin har ett problem",
        "dberr-problems": "Ursäkta! Denna sajt har just nu tekniska problem.",
        "dberr-again": "Pröva med att vänta några minuter och ladda om.",
        "dberr-info": "(Kan inte kontakta databasservern: $1)",
        "htmlform-no": "Nej",
        "htmlform-yes": "Ja",
        "htmlform-chosen-placeholder": "Välj ett alternativ",
+       "htmlform-cloner-create": "Lägg till mer",
+       "htmlform-cloner-delete": "Ta bort",
+       "htmlform-cloner-required": "Det krävs minst ett värde.",
        "sqlite-has-fts": "$1 med stöd för fulltextsökning",
        "sqlite-no-fts": "$1 utan stöd för fulltextsökning",
        "logentry-delete-delete": "$1 {{GENDER:$2|raderade}} sidan $3",
index a7cccea..660df9c 100644 (file)
                        "Nemo bis",
                        "Robert Ullmann",
                        "Stephenwanjau",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라",
+                       "Baba Tabita"
                ]
        },
        "tog-underline": "Wekea mstari viungo:",
-       "tog-hideminor": "Ficha mabadilisho madogo ya hivi karibuni",
+       "tog-hideminor": "Ficha maharirio madogo katika mabadiliko ya hivi karibuni",
        "tog-hidepatrolled": "Ficha kurasa zilizofanyiwa doria kwenye mabadiliko ya karibuni",
        "tog-newpageshidepatrolled": "Ficha kurasa zilizofanyiwa doria kwenye orodha ya kurasa mpya",
        "tog-extendwatchlist": "Tanua orodha ya maangalizi ili kuonyesha mabadiliko yote yaliyofanyika, si hilo la mwisho tu.",
@@ -24,7 +26,6 @@
        "tog-showtoolbar": "Onyesha mwambaa wa zana za kuhariria",
        "tog-editondblclick": "Hariri ukurasa kwa kubonyeza mara mbili",
        "tog-editsectiononrightclick": "Wezesha sehemu ya kuandikia kwa kubonyeza kitufe cha kulia cha puku yako juu ya sehemu ya majina husika (JavaScript)",
-       "tog-rememberpassword": "Kumbuka kuingia kwangu pamoja na neno la siri katika kivinjari hiki (kwa muda usiozidi {{PLURAL:$1|siku}} $1)",
        "tog-watchcreations": "Ongeza kurasa nilizoumba katika maangalizi yangu",
        "tog-watchdefault": "Ongeza kurasa zote nilizohariri katika maangalizi yangu",
        "tog-watchmoves": "Ongeza kurasa zote nilizohamisha katika maangalizi yangu",
        "newwindow": "(Itafungua kwa dirisha jipya)",
        "cancel": "Batilisha",
        "moredotdotdot": "Zaidi...",
+       "morenotlisted": "Orodha hii haijakamilika.",
        "mypage": "Ukurasa",
        "mytalk": "Majadiliano",
        "anontalk": "Majadiliano ya IP hii",
        "readonly_lag": "Kihifadhidata kimejifunga chenyewe wakati seva za kifadhidata joli imedakwa na seva ya utawala",
        "internalerror": "Hitilafu ya ndani",
        "internalerror_info": "Hitilafu ya ndani: $1",
-       "fileappenderrorread": "Haikuweza kusoma \"$1\" wakati wa kuambatanisha.",
-       "fileappenderror": "Haikuweza kuongeza \"$1\" hadi \"$2\".",
        "filecopyerror": "Haikuweza kunakili faili \"$1\" kwa \"$2\".",
        "filerenameerror": "Haikuweza kubadilisha jina la faili \"$1\" kwa \"$2\".",
        "filedeleteerror": "Haikuweza kufuta faili \"$1\".",
        "directorycreateerror": "Haikuweza kuanzisha saraka ya \"$1\".",
        "filenotfound": "Haikuweza kutafuta faili \"$1\".",
-       "fileexistserror": "Haiwezi kuandika kwa faili \"$1\": faili liliopo",
        "unexpected": "Jambo lisilotegemewa: \"$1\"=\"$2\".",
        "formerror": "Hitilafu: haikufaulu kuweka fomu",
        "badarticleerror": "Ukurasa huu hauwezi kutendewa kitendo hiki.",
        "namespaceprotected": "Huna ruhusa ya kuhariri kurasa za eneo la wiki la '''$1'''.",
        "customcssprotected": "Huna ruksa ya kuhariri ukurasa huu wa CSS, kwa sababu una mapendekezo ya binafsi ya mtumiaji mwingine.",
        "customjsprotected": "Huna ruksa ya kuhariri ukurasa huu wa JavaScript, kwa sababu una mapendendekezo ya binafsi ya mtumiaji mwingine.",
+       "mycustomcssprotected": "Huna ruhusa ya kuhariri ukurasa huo wa CSS.",
+       "mycustomjsprotected": "Huna ruhusa kuhariri ukurasa huo wa JavaScript.",
+       "myprivateinfoprotected": "Huna ruhusa kuhariri habari yako ya binafsi.",
+       "mypreferencesprotected": "Huna ruhusa kuhariri mapendekezo yako.",
        "ns-specialprotected": "Kurasa maalumu haziwezi kuhaririwa.",
        "titleprotected": "Jina hili limekingwa lisiumbwe na [[User:$1|$1]].\nSababu zilizotolewa ni \"''$2''\".",
        "exception-nologin": "Hujaingia",
        "createacct-another-username-ph": "Weka jina la mtumiaji",
        "yourpassword": "Neno la siri:",
        "userlogin-yourpassword": "Neno la siri",
-       "userlogin-yourpassword-ph": "Weka neno lako la siri",
+       "userlogin-yourpassword-ph": "Ingiza neno lako la siri",
        "createacct-yourpassword-ph": "Weka neno la siri",
        "yourpasswordagain": "Andika tena neno la siri",
+       "createacct-yourpasswordagain": "Thibitisha neno la siri",
        "createacct-yourpasswordagain-ph": "Weka neno la siri tena",
        "remembermypassword": "Kumbuka kuingia kwangu katika kivinjari hiki (kwa muda usiozidi {{PLURAL:$1|siku}} $1)",
        "yourdomainname": "Tovuti yako:",
        "gotaccount": "Unayo akaunti tayari? '''$1'''",
        "gotaccountlink": "Ingia",
        "userlogin-resetlink": "Umesahau maelezo yako ya kuingia?",
+       "userlogin-resetpassword-link": "Je, umesahau neno la siri?",
        "createacct-emailrequired": "Anwani ya barua pepe",
        "createacct-emailoptional": "Anwani ya barua pepe (si lazima)",
        "createacct-email-ph": "Weka anwani yako ya barua pepe",
        "createacct-another-email-ph": "Weka anwani ya barua pepe",
-       "createaccountmail": "Kwa barua pepe",
+       "createaccountmail": "Tumia neno la siri la muda tu na kulituma kwa anwani ya barua pepe ilivyoingizwa",
        "createacct-realname": "Jina la kweli (si lazima)",
        "createaccountreason": "Sababu:",
        "createacct-reason": "Sababu",
        "login-abort-generic": "Kuingia kwako hakujafaulu: Iliachishwa",
        "loginlanguagelabel": "Lugha: $1",
        "suspicious-userlogout": "Ombi lako la kutoka kwenye akaunti yako limehiniwa, kwa sababu inaonekana kwamba ombi lilitumwa na kivinjari kilichoharibika au seva ya kuwakilisha yenye kache.",
+       "pt-login": "Ingia",
+       "pt-login-button": "Ingia",
+       "pt-userlogout": "Toka",
        "php-mail-error-unknown": "Hitilafu isiyojulikana katika ufanyajikazi wa barua za PHP ().",
        "user-mail-no-addy": "Umejaribu kutuma barua pepe bila anwani ya barua pepe.",
        "changepassword": "Badilisha neno la siri",
        "savearticle": "Hifadhi ukurasa",
        "preview": "Hakiki",
        "showpreview": "Onyesha hakikisho la mabadiliko",
-       "showlivepreview": "Tazama moja kwa moja",
        "showdiff": "Onyesha mabadiliko",
        "anoneditwarning": "'''Ilani:''' Wewe hujaingia rasmi kwenye tovuti. Anwani ya IP ya tarakilishi yako itahifadhiwa katika historia ya uhariri wa ukurasa huu.",
        "anonpreviewwarning": "''Hujaingia rasmi kwenye tovuti. Ukihifadhi ukurasa anwani ya IP ya tarakilishi yako itahifadhiwa katika historia ya uhariri wa ukurasa huu.''",
        "edit-gone-missing": "Haikuwezakana kusasisha ukurasa.\nInaonekana kwamba ukurasa umefutwa.",
        "edit-conflict": "Mgongano wa kuhariri.",
        "edit-no-change": "Uhariri wako haukufanikiwa, kwa sababu hapakuwa na mabadiliko yoyote kwenye maandishi.",
+       "postedit-confirmation-saved": "Haririo lako limehifadhiwa.",
        "edit-already-exists": "Haikufanikiwa kuanzisha ukurasa mpya.\nUkurasa wa jina hilo unapatikana tayari.",
        "defaultmessagetext": "Ujumbe uliopo",
        "editwarning-warning": "Ukitoka kwenye ukurasa huu labda utapoteza madabiliko uliyoyafanya.\nUnaweza kuondoa ilani hii ukienda kwenye sehemu ya \"{{int:prefs-editing}}\" kwenye mapendekezo yako.",
        "revdelete-hide-text": "Ficha maandishi ya pitio",
        "revdelete-hide-image": "Ficha yaliyomo kwenye faili",
        "revdelete-hide-name": "Ficha tendo na shabaha",
-       "revdelete-hide-comment": "Ficha muhtasari wa kuhariri",
-       "revdelete-hide-user": "Ficha jina la mhariri/anwani ya IP ya mhariri",
+       "revdelete-hide-comment": "Hariri muhtasari",
+       "revdelete-hide-user": "jina la mhariri/anwani ya IP ya mhariri",
        "revdelete-hide-restricted": "Wakabidhi (vilevile wengine) wasiweze kuona data",
        "revdelete-radio-same": "(isibadilishwe)",
-       "revdelete-radio-set": "Halionekani",
-       "revdelete-radio-unset": "Linaonekana",
+       "revdelete-radio-set": "Imefichwa",
+       "revdelete-radio-unset": "Huonekana",
        "revdelete-suppress": "Wakabidhi (vilevile wengine) wasiweze kuona data",
        "revdelete-unsuppress": "Uzuio wa kuona mapitio uondolewe, mapitio yanaporudishwa",
        "revdelete-log": "Sababu:",
        "pagehist": "Historia ya ukurasa",
        "deletedhist": "Historia iliyofutwa",
        "revdelete-hide-current": "Hitilafu ya kuficha pitio lililotengenezwa saa $2, tarehe $1: hilo ndilo pitio la sasa hivi.\nHaliwezi kufichwa.",
+       "revdelete-show-no-access": "Huruhusiwi kuona hii.",
        "revdelete-reason-dropdown": "*Sababu za kufuta zinazotokea mara kwa mara\n** Ukiukaji wa hakimiliki\n** Taarifa za mtu binafsi zisizofaa\n** Taarifa zinazowezekana kwamba ni za kukashifu",
        "revdelete-otherreason": "Sababu nyingine:",
        "revdelete-reasonotherlist": "Sababu nyingine",
        "search-nonefound": "Hakuna matokeo ya kutafuta ulizio ule.",
        "powersearch-legend": "Tafuta kwa hali ya juu",
        "powersearch-ns": "Tafuta kwenye maeneo ya wiki yafuatayo:",
-       "powersearch-redir": "Orodhesha kurasa za kuelekeza",
        "powersearch-togglelabel": "Chagua:",
        "powersearch-toggleall": "Chagua yote",
        "powersearch-togglenone": "Usichague",
        "prefs-emailconfirm-label": "Kuhakikisha barua pepe:",
        "youremail": "Barua pepe yako:",
        "username": "Jina la mtumiaji:",
-       "uid": "Namba ya mtumiaji:",
        "prefs-memberingroups": "Mwanachama wa {{PLURAL:$1|kundi la|makundi ya}}:",
        "prefs-registration": "Wakati wa kusajili:",
        "yourrealname": "Jina lako halisi:",
        "prefs-help-signature": "Unapoandika kwenye kurasa za majadiliano tafadhali utie sahihi kwa kuandika \"<nowiki>~~~~</nowiki>\"; itaonekana jina lako pamoja na saa na tarehe ya kuhifadhi.",
        "badsig": "Umeweka sahihi batili.\nAngalia mabano ya HTML.",
        "badsiglength": "Sahihi uliyoweka ni ndefu mno.\nHaiwezi kuzidi {{PLURAL:$1|tarakimu|tarakimu}} $1.",
-       "yourgender": "Jinsi:",
-       "gender-unknown": "Haitajwi",
-       "gender-male": "Mume",
-       "gender-female": "Mke",
+       "yourgender": "Unapendelea kutajwa vipi?",
+       "gender-unknown": "Napendelea nisiseme",
+       "gender-male": "Anahariri kurasa za wiki",
+       "gender-female": "Anahariri kurasa za wiki",
        "prefs-help-gender": "Si lazima: inatumika kwenye lugha zinazokuwa na mtindo wa kuitana tofauti kwa ajili ya wanaume na wanawake, ili bidhaa pepe itumie mtindo sahihi.\nTaarifa hii itakuwa wazi.",
        "email": "Barua pepe",
        "prefs-help-realname": "Jina la kweli si lazima. Ukichagua kutaja jina lako hapa, litatumiwa kuonyesha kwamba ndiyo ulifanya kazi unayochangia.",
        "prefs-dateformat": "Jinsi inayoandikwa tarehe",
        "prefs-timeoffset": "Kuweka saa tofauti na saa ya seva",
        "prefs-advancedediting": "Hitiari za hali ya juu",
+       "prefs-editor": "Mhariri",
        "prefs-preview": "Hakiki",
        "prefs-advancedrc": "Hitiari za hali ya juu",
        "prefs-advancedrendering": "Hitiari za hali ya juu",
        "prefs-advancedsearchoptions": "Hitiari za hali ya juu",
        "prefs-advancedwatchlist": "Hitiari za hali ya juu",
        "prefs-displayrc": "Hitiari za kutandaza",
-       "prefs-displaysearchoptions": "Mapendekezo ya kuzinza",
        "prefs-displaywatchlist": "Mapendekezo ya kuzinza",
        "prefs-diffs": "Tofauti",
        "email-address-validity-valid": "Anwani ya barua pepe inaonekana kuwa sawa",
        "right-editusercssjs": "Hariri mafaili ya CSS na Hatijava ya watumiaji wengine",
        "right-editusercss": "Hariri mafaili ya CSS ya watumiaji wengine",
        "right-edituserjs": "Hariri mafaili ya JavaScript ya watumiaji wengine",
+       "right-editmyoptions": "Hariri mapendekezo yako binafsi",
        "right-import": "Kuleta kurasa kutoka kwa wiki zingine",
        "right-importupload": "Ingiza kurasa kutoka kwa faili lililopakiwa",
        "right-unwatchedpages": "Kutazama orodha ya kurasa zisizofuatiliwa",
        "action-userrights-interwiki": "kuhariri wezo za watumiaji kwenye wiki zingine",
        "action-siteadmin": "kufunga na kufungua hifadhidata",
        "action-sendemail": "tuma barua pepe",
+       "action-editmywatchlist": "hariri maangalizi yako",
+       "action-viewmywatchlist": "angalia orodha ya maangalizi yako",
+       "action-viewmyprivateinfo": "angalia habari yako binafsi",
+       "action-editmyprivateinfo": "hariri habari yako binafsi",
        "nchanges": "{{PLURAL:$1|badiliko|mabadiliko}} $1",
        "enhancedrc-history": "historia",
        "recentchanges": "Mabadiliko ya karibuni",
        "recentchanges-label-unpatrolled": "Haririo hili bado halijafanyiwa doria",
        "recentchanges-legend-newpage": "$1 - ukurasa mpya",
        "rcnotefrom": "Hapo chini yaonekana mabadiliko tangu '''$2''' (tunaonyesha hadi '''$1''').",
-       "rclistfrom": "Onyesha mabadiliko mapya kuanzia $1",
+       "rclistfrom": "Onyesha mabadiliko mapya kuanzia $3 $2",
        "rcshowhideminor": "$1 mabadiliko madogo",
+       "rcshowhideminor-show": "Onyesha",
+       "rcshowhideminor-hide": "Ficha",
        "rcshowhidebots": "roboti $1",
+       "rcshowhidebots-show": "Onyesha",
+       "rcshowhidebots-hide": "Ficha",
        "rcshowhideliu": "watumiaji $1 waliojisajili",
+       "rcshowhideliu-show": "Onyesha",
+       "rcshowhideliu-hide": "Ficha",
        "rcshowhideanons": "$1 watumiaji bila majina",
+       "rcshowhideanons-show": "Onyesha",
+       "rcshowhideanons-hide": "Ficha",
        "rcshowhidepatr": "$1 masahihisho yanayofanywa doria",
+       "rcshowhidepatr-show": "Onyesha",
+       "rcshowhidepatr-hide": "Ficha",
        "rcshowhidemine": "$1 masahihisho yangu",
+       "rcshowhidemine-show": "Onyesha",
+       "rcshowhidemine-hide": "Ficha",
        "rclinks": "Onyesha mabadiliko $1 yaliyofanywa wakati wa siku $2 zilizopita<br />$3",
        "diff": "tofauti",
        "hist": "hist",
        "listfiles_size": "Ukubwa",
        "listfiles_description": "Maelezo",
        "listfiles_count": "Matoleo",
+       "listfiles-latestversion-yes": "Ndiyo",
+       "listfiles-latestversion-no": "Hapana",
        "file-anchor-link": "Faili",
        "filehist": "Historia ya faili",
        "filehist-help": "Bonyeza tarehe/saa kuona faili kama ilivyoonekana wakati huo.",
        "protectedpages-indef": "Ulinzi kwa muda usiojulikana tu",
        "protectedpages-cascade": "Mpangilio wa ulindaji tu",
        "protectedpagesempty": "Hakuna kurasa zinazolindwa kwa sasa kwa vigezo hivi.",
+       "protectedpages-page": "Ukurasa",
+       "protectedpages-unknown-timestamp": "Haijulikani",
+       "protectedpages-unknown-performer": "Mtumiaji asiyejulikana",
        "protectedtitles": "Majina yanayozuluiwa",
        "protectedtitlesempty": "Hakuna vichwa vinavyolindwa kwa vigezo hivi kwa sasa.",
        "listusers": "Orodha ya Watumiaji",
        "logempty": "Vitu vyenye vipengele hivi havipo kwenye kumbukumbu.",
        "log-title-wildcard": "Tafuta kurasa zenye vichwa vinavyoanza na maandishi haya",
        "allpages": "Kurasa zote",
-       "alphaindexline": "$1 hadi $2",
        "nextpage": "Ukurasa ujao ($1)",
        "prevpage": "Ukurasa uliotangulia ($1)",
        "allpagesfrom": "Onyesha kurasa zinazoanza kutoka:",
        "listgrouprights-removegroup-self": "Kuondoa {{PLURAL:$2|kundi|makundi}} kutoka katika akaunti ya binafsi: $1",
        "listgrouprights-addgroup-self-all": "Kuongeza makundi yote katika akaunti ya binafsi",
        "listgrouprights-removegroup-self-all": "Kuondoa makundi yote kutoka akaunti ya binafsi",
+       "trackingcategories-name": "Kichwa cha ujumbe",
        "mailnologin": "Hakuna anwani wa kutuma",
        "mailnologintext": "Ukitaka kutuma barua pepe kwa watumiaji wengine inabidi uwe [[Special:UserLogin|umeshaingia kwenye akaunti yako]] na pia uwe na anwani ya barua pepe sahihi pale [[Special:Preferences|mapendekezo yako]].",
        "emailuser": "Mtumie mtumiaji huyu barua pepe",
        "watchlist-details": "Unafuatilia {{PLURAL:$1|ukurasa $1|kurasa $1}} bila kuzingatia kurasa za majadiliano.",
        "wlheader-enotif": "Huduma ya kuarifu kwa barua pepe imewezeshwa.",
        "wlheader-showupdated": "Kurasa zilizobadilika tangu ulivyotembelea mara ya mwisho zinaonyeshwa katika hali ya '''kukooza'''",
-       "watchmethod-recent": "kupitia madabiliko ya karibuni ili kupata kurasa za maangalizi",
-       "watchmethod-list": "Kupitia kurasa za maangalizi ili kupata madabiliko ya karibuni",
-       "watchlistcontains": "Orodha ya maangalizi yako ina {{PLURAL:$1|pages|kurasa}}.",
-       "iteminvalidname": "Shida na kitu  '$1' ,  jina batili...",
        "wlshowlast": "Onyesha kutoka masaa $1 siku $2 $3",
        "watchlist-options": "Hitiari za maangalizi",
        "watching": "Unafuatilia...",
        "enotif_lastvisited": "Tazama $1 kwa mabadiliko yote tangu ziara yako ya mwisho.",
        "enotif_lastdiff": "Tazama badiliko hili hapo $1.",
        "enotif_anon_editor": "mtumiaji bila jina $1",
-       "enotif_body": "Mpendwa $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nMuhtasari wa mhariri: $PAGESUMMARY $PAGEMINOREDIT\n\nUwasiliane na mhariri kwa njia hizi:\nbarua pepe: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nHutapata taarifa za mabadiliko mengine yatakayotokea kwenye ukurasa huu hadi utakapotazama ukurasa wakati umeingia akaunti yako.\nAu unaweza kuweka upya maombi ya kupewa taarifa kwa ajili ya kurasa zote zilizopo kwenye orodha yako ya maangalizi.\n\n             Kutoka kwa mashine ya kutoa taarifa ya {{SITENAME}}\n\n--\nUkitaka kubadilisha mapendekezo yako kuhusu kutolewa taarifa, nenda\n{{canonicalurl:{{#special:Preferences}}}}\n\nUkitaka kubadilisha mapendekezo yako yanayohusika orodha ya maangalizi yako, nenda\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nUkitaka kutoa ukurasa huu kwenye orodha ya maangalizi yako, nenda\n$UNWATCHURL\n\nKutoa maoni yako au kupata msaada mwingine:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Mpendwa $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nMuhtasari wa mhariri: $PAGESUMMARY $PAGEMINOREDIT\n\nUwasiliane na mhariri kwa njia hizi:\nbarua pepe: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nHutapata taarifa za mabadiliko mengine yatakayotokea kwenye ukurasa huu hadi utakapotazama ukurasa wakati umeingia akaunti yako.\nAu unaweza kuweka upya maombi ya kupewa taarifa kwa ajili ya kurasa zote zilizopo kwenye orodha yako ya maangalizi.\n\n             Kutoka kwa mashine ya kutoa taarifa ya {{SITENAME}}\n\n--\nUkitaka kubadilisha mapendekezo yako kuhusu kutolewa taarifa, nenda\n{{canonicalurl:{{#special:Preferences}}}}\n\nUkitaka kubadilisha mapendekezo yako yanayohusika orodha ya maangalizi yako, nenda\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nUkitaka kutoa ukurasa huu kwenye orodha ya maangalizi yako, nenda\n$UNWATCHURL\n\nKutoa maoni yako au kupata msaada mwingine:\n$HELPPAGE",
        "created": "alianzisha",
        "changed": "alibadilisha",
        "deletepage": "Futa ukurasa",
        "protect-default": "Kubalia watumiaji wote",
        "protect-fallback": "Lazimisha ruhusa \"$1\"",
        "protect-level-autoconfirmed": "Zuia watumiaji wapya au wale ambao hawajajisajilisha",
-       "protect-level-sysop": "Wakabidhi tu",
+       "protect-level-sysop": "Ruhusa kwa wakabidhi tu",
        "protect-summary-cascade": "ulindaji kwa kurasa chini yake",
        "protect-expiring": "itakwisha $1 (UTC)",
        "protect-expiring-local": "inaisha $1",
        "blockip": "Zuia mtumiaji",
        "blockip-legend": "Kumzuia mtumiaji",
        "blockiptext": "Tumia fomu iliyopo chini kumzuia mtu asihariri kwa kupitia anwani fulani wa IP au kwa kutumia jina fulani la mtumiaji.\nNia ya kumzuia mtu inatakiwa kuwa kuzuia uharibifu tu, na ifanikiwe kutokana na masharti ya [[{{MediaWiki:Policy-url}}|sera]].\nAndika sababu ya kuzuia chini (kwa mfano, kwa kutaja mifano ya kurasa zilizoharibiwa).",
-       "ipadressorusername": "Anwani ya IP au jina la mtumiaji:",
+       "ipaddressorusername": "Anwani ya IP au jina la mtumiaji:",
        "ipbexpiry": "Itakwisha:",
        "ipbreason": "Sababu:",
        "ipbreason-dropdown": "*Sababu za kawaida za kuzuia\n** Kuingiza habari za uongo\n** Kuondosha yaliyomo katika kurasa\n** Viungo vya nje visivyotakiwa\n** Kuingiza upuuzi/ujinga sioeleweka kwenye makala\n** Adabu mbaya/kero\n** Kusumbua akaunti nyinginyingi\n** Jina la mutumiaji lisilokubalika",
        "blocklist": "Watumiaji waliozuiliwa",
        "ipblocklist": "Watumiaji waliozuiliwa",
        "ipblocklist-legend": "Tafuta mtumiaji aliyezuiwa",
+       "blocklist-tempblocks": "Ficha kuzuia kwa muda",
+       "blocklist-addressblocks": "Ficha kuzuia kwa IP mojamoja",
        "blocklist-timestamp": "Tarehe na saa",
        "blocklist-target": "Lengo",
        "blocklist-expiry": "Itakwisha",
+       "blocklist-by": "mkabidhi aliyezuia",
        "blocklist-reason": "Sababu",
        "ipblocklist-submit": "Tafuta",
        "ipblocklist-otherblocks": "{{PLURAL:$1|Uzuio mwingine|Zuio zingine}}",
        "newimages-summary": "Ukurasa maalum huu unaonyesha mafaili yaliyopakiwa hivi karibuni.",
        "newimages-legend": "Chuja",
        "newimages-label": "Jina la faili (au sehemu yake):",
-       "showhidebots": "(roboti $1)",
        "noimages": "Hakuna picha.",
        "ilsubmit": "Tafuta",
        "bydate": "kwa tarehe",
        "autosumm-replace": "Maandishi yaliyokuwepo yalichukuliwa nafasi na '$1'",
        "autoredircomment": "Ukurasa umeelekezwa kwenda [[$1]]",
        "autosumm-new": "Ukurasa ulianzishwa kwa kuandika '$1'",
-       "livepreview-loading": "Inapakizwa...",
-       "livepreview-ready": "Inapakizwa... Tayari!",
-       "livepreview-failed": "Hakikisho la kisasa hakufaulu!\nJaribu hakikisho la kawaida.",
-       "livepreview-error": "Imeshindikana kuunganisha: $1 \"$2\".\nJaribu hakikisho la kawaida.",
        "lag-warn-normal": "Huenda mabadiliko yaliyowekwa tangu sekunde $1 {{PLURAL:$1|iliyopita|zilizopita}} hayataonyeshwa katika orodha hii.",
        "lag-warn-high": "Kutokana na seva ya hifadhidata kukawia sana, huenda mabadiliko yaliyowekwa tangu sekunde $1 {{PLURAL:$1|iliyopita|zilizopita}} yanaweza yasioneshwe kwenye orodha hii.",
-       "watchlistedit-numitems": "Orodha ya maangalizi yako ina {{PLURAL:$1|ukurasa 1|kurasa $1}}, bila kuhesabu kurasa za majadiliano.",
-       "watchlistedit-noitems": "Orodha ya maangalizi yako haina kitu.",
        "watchlistedit-normal-title": "Kuhariri orodha ya maangalizi",
        "watchlistedit-normal-legend": "Kuondoa majina kwenye orodha ya maangalizi",
        "watchlistedit-normal-explain": "Majina kwenye orodha ya maangalizi yako yapo chini.\nIli kuondoa jina, weka alama katika kisanduku chake, na bonyeza \"{{int:Watchlistedit-normal-submit}}\".\nUnaweza pia [[Special:EditWatchlist/raw|kuhariri orodha ya ghafi]].",
        "compare-invalid-title": "Jina la ukurasa uliloliandika ni batili.",
        "compare-title-not-exists": "Jina la ukurasa ulilotaja halipatikani.",
        "compare-revision-not-exists": "Pitio ulilotaja halipatikani.",
-       "dberr-header": "Wiki imekuta tatizo",
        "dberr-problems": "Kumradhi! Tovuti hii inapata matatatizo wakati huu.",
        "dberr-again": "Jaribu tena baada ya kusubiri dakika chache.",
        "dberr-info": "(Hamna mawasiliano na seva ya hifadhidata: $1)",
index 7dbd0b6..64158b3 100644 (file)
@@ -15,7 +15,8 @@
                        "Pimke",
                        "Przemub",
                        "Tchoř",
-                       "Timpul"
+                       "Timpul",
+                       "아라"
                ]
        },
        "tog-underline": "Podsztrychńyńcy linkůw:",
@@ -28,7 +29,6 @@
        "tog-showtoolbar": "Pokoż gurt werkcojgůw (JavaScript)",
        "tog-editondblclick": "Edycyjo napoczynajům dwa klikńyńća (JavaScript)",
        "tog-editsectiononrightclick": "Klikńyńće prawym kneflym myszy na titlu tajli<br />napoczyno jigo sprowjańy(JavaScript)",
-       "tog-rememberpassword": "Pamjyntej můj ausdruk na tym kůmputrze (nojdalij bez $1 {{PLURAL:$1|dźyń|dńůw}})",
        "tog-watchcreations": "Dowům pozůr na zajty, kere żech naszkryfloł",
        "tog-watchdefault": "Dowům pozůr na zajty, kere żech sprowjoł",
        "tog-watchmoves": "Dowům pozůr na zajty, kere żech przećepnył",
        "readonly_lag": "Baza danych zostoła automatyczńy zawarto na czas potrzebny na synchrońizacyjo zmjan mjyndzy serwerym głůwnym a serwerami postrzedńiczůncymi.",
        "internalerror": "Wewnyntrzny feler",
        "internalerror_info": "Wewnytrzny feler: $1",
-       "fileappenderrorread": "Feler uodczytu \"$1\".",
-       "fileappenderror": "Ńy idźe skopjować plika \"$1\" do \"$2\".",
        "filecopyerror": "Ńy idźe skopjować plika \"$1\" do \"$2\".",
        "filerenameerror": "Ńy idźe zmjyńić mjana plika \"$1\" na \"$2\".",
        "filedeleteerror": "Ńy idźe wyćepać plika \"$1\".",
        "directorycreateerror": "Ńy idźe utworzić katalogu \"$1\".",
        "filenotfound": "Ńy idźe znejść plika \"$1\".",
-       "fileexistserror": "Ńy idźe sprowjać we pliku \"$1\": plik istńeje",
        "unexpected": "Ńyspodźewano wartość: \"$1\"=\"$2\".",
        "formerror": "Feler: ńy idźe wysłać formulazra",
        "badarticleerror": "Tyj uoperacyje ńy idźe zrobić lo tyj zajty.",
        "userlogin-resetpassword-link": "Ńy pamjyntosz hasła?",
        "userlogin-loggedin": "Zalogowano kej {{GENDER:$1|$1}}. Użyj formulara půńiżyj, coby zalogować śe kej inkszy używocz.",
        "userlogin-createanother": "Twůrz inksze kůnto",
-       "createacct-join": "Wszkryflej půńiżyj swoje dane.",
-       "createacct-another-join": "Wszkryflej půńiżyj szczegůły nowygo kůnta.",
        "createacct-emailrequired": "E-brif",
        "createacct-emailoptional": "E-brif (uopcjůnalne)",
        "createacct-email-ph": "Wszkryflej swůj adres do e-brifa",
        "savearticle": "Spamjyntej",
        "preview": "Uobźyrańy",
        "showpreview": "Uobźyrej",
-       "showlivepreview": "Dynamiczny podglůnd",
        "showdiff": "Pozdrzyj na půmjyńańy",
        "anoneditwarning": "Ńy jeżeś terozki zalogowany. We gyszichće sprowjyń tyj zajty bydźe naszkryflůny twůj ausdruk IP.",
        "anonpreviewwarning": "Ńy jeżeś zalogowany. Twój IP ausdruk uostańy spamjyntany, eli ty bydźesz sprowjać zajte.",
        "edit-gone-missing": "Ńy idźe zaktualizować zajty.\nZdowo śe, co zostoła wyćepano.",
        "edit-conflict": "Kůnflikt sprowjyń.",
        "edit-no-change": "Twoje sprowjyńe uostoło zignorowane pů takymu, aże ńic żeś we tekśće ńy zmjyńůł.",
-       "postedit-confirmation": "Spamjyntano twoje sprowjyńe.",
+       "postedit-confirmation-saved": "Spamjyntano twoje sprowjyńe.",
        "edit-already-exists": "Ńy idźe utworzić nowyj zajty.\nTako zajta już sam je.",
        "defaultmessagetext": "Tekst důmyślny",
        "expensive-parserfunction-warning": "Dej pozůr: ta zajta mo za dużo uodwouań do funkcyji parsera, kere mocno uobćůnżajům systym.\n\nPowinno być myńi jak $2 {{PLURAL:$2|wywołańy|wywołańo|wywołań}}, a terozki {{PLURAL:$1|je $1 wywołańy|sům $1 wywołańo|je $1 wywołań}}.",
        "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:",
-       "powersearch-redir": "Pokoż przekerowańa",
        "powersearch-togglelabel": "Uoznocz:",
        "powersearch-toggleall": "Wszyjsko",
        "powersearch-togglenone": "żodno",
        "recentchanges-label-bot": "To sprowjyńy bůło zrobjůne uod bota",
        "recentchanges-label-unpatrolled": "To sprowjyńy ńy bůło jeszcze uowjerzůne",
        "rcnotefrom": "Půńiżej pokazano půmjyńańo zrobjůne pů <b>$2</b> (ńy wjyncyj kej <b>$1</b> pozycji).",
-       "rclistfrom": "Ukoż půmjyńańa uod $1",
+       "rclistfrom": "Ukoż půmjyńańa uod $3 $2",
        "rcshowhideminor": "$1 drobne půmjyńańa",
        "rcshowhidebots": "$1 boty",
        "rcshowhideliu": "$1 zaregisztrowanych",
        "watchlist-details": "Na pozorliśće {{PLURAL:$1|je 1 artikel|sům $1 artikle|je $1 artikli}} ńy rachujůnc zajtůw godek.",
        "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'''",
-       "watchmethod-recent": "šnupańy za půmjyńanymi na uostatku w zajtach, na kere dowoš pozůr",
-       "watchmethod-list": "šnupańy w zajtach, na kere dowoš pozůr pośrůd půmjyńanych na uostatku",
-       "watchlistcontains": "Lista zajtůw, na kere dowoš pozůr mo {{PLURAL:$1|jedna pozycja|$1 pozycje|$1 pozycyji}}.",
-       "iteminvalidname": "Problym ze pozycjům „$1”, felerne mjano...",
        "wlshowlast": "Pokož uostatńy $1 godźin $2 dńi ($3)",
        "watchlist-options": "Uopcyje artikli na kere dowosz pozůr",
        "watching": "Dowom pozor...",
        "enotif_lastvisited": "Uobejřij na zajće $1 wšyjstke půmjyńańo uod Twojej uostatńij wizyty.",
        "enotif_lastdiff": "Uobejřij na zajće $1 te pomjyńeńe.",
        "enotif_anon_editor": "užytkowńik anůnimowy $1",
-       "enotif_body": "Drogi/o $WATCHINGUSERNAME,\n\nzajta $PAGETITLE we {{GRAMMAR:MS.lp|{{SITENAME}}}} zostoua $CHANGEDORCREATED $PAGEEDITDATE bez užytkowńika $PAGEEDITOR. Uobejřij na zajće $PAGETITLE_URL aktualno wersja.\n\n$NEWPAGE\n\nOpis pomjyńeńa: $PAGESUMMARY $PAGEMINOREDIT\n\nSkůntaktuj śe s autorym:\ne-brif: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nW připadku kolejnych půmjyńań nowe powjadůmjyńo ńy bydům wysuane, dopůki ńy uodwjydziš tyi zajty.\nMožeš tyž zresetować wšyjstke flagi powjadůmjyń na swojej liśće zajtůw, na kere dowoš pozůr.\n\n\tWjadůmość systymu powjadůmjyń {{GRAMMAR:D.lp|{{SITENAME}}}}\n\n--\nKejbyś chćou půmjyńić štalowańo swojej listy zajtůw, na kere dowoš pozůr, uodwjydź\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPomoc:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Drogi/o $WATCHINGUSERNAME,\n\nzajta $PAGETITLE we {{GRAMMAR:MS.lp|{{SITENAME}}}} zostoua $CHANGEDORCREATED $PAGEEDITDATE bez užytkowńika $PAGEEDITOR. Uobejřij na zajće $PAGETITLE_URL aktualno wersja.\n\n$NEWPAGE\n\nOpis pomjyńeńa: $PAGESUMMARY $PAGEMINOREDIT\n\nSkůntaktuj śe s autorym:\ne-brif: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nW připadku kolejnych půmjyńań nowe powjadůmjyńo ńy bydům wysuane, dopůki ńy uodwjydziš tyi zajty.\nMožeš tyž zresetować wšyjstke flagi powjadůmjyń na swojej liśće zajtůw, na kere dowoš pozůr.\n\n\tWjadůmość systymu powjadůmjyń {{GRAMMAR:D.lp|{{SITENAME}}}}\n\n--\nKejbyś chćou půmjyńić štalowańo swojej listy zajtůw, na kere dowoš pozůr, uodwjydź\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPomoc:\n$HELPPAGE",
        "created": "utwořono",
        "changed": "pomjyńono",
        "deletepage": "Wyćep artikel",
        "blockip": "Zawrzij sprowjorza",
        "blockip-legend": "Zawrzij sprowjorza",
        "blockiptext": "Tyn formularz służy do zawjerańo sprowjyń spod uokreślůnygo adresu IP abo kůnkretnymu użytkowńikowi.\nZawjerać noleży jydyńy po to, by zapobjec wandalizmům, zgodńy ze [[{{MediaWiki:Policy-url}}|przijyntymi reglůma]].\nPodej powůd (np. umjeszczajůnc mjana zajtůw, na kerych dopuszczůno śe wandalizmu).",
-       "ipadressorusername": "Adres IP abo mjano użytkowńika",
+       "ipaddressorusername": "Adres IP abo mjano użytkowńika",
        "ipbexpiry": "Wygaso:",
        "ipbreason": "Čymu:",
        "ipbreason-dropdown": "*Nojczynstsze powody zawjerańo uod sprawjyń\n** Ataki na inkszych użytkowńikůw\n** Naruszyńy praw autorskych\n** Ńydozwolůne mjano użytkowńika\n** Open proxy/Tor\n** Spamowańy\n** Ůsuwańy treśći zajtůw\n** Wprowadzańy fołszywych informacyji\n** Wulgaryzmy\n** Wypisywańy gůpot na zajtach",
        "tooltip-rollback": "\"cofej\" jednym klikńyńćym rewertuje půmjyńańa uod uostatnigo sprowjorza.",
        "tooltip-undo": "\"anuluj půmjyńańa\" cofo to půmjyńańy a uodwjyro uokno sprowjańa we trybje widoku.\nIdzie naszkryflać powůd we popiśe půmjyńań.",
        "tooltip-summary": "Krůtko popisz",
-       "notacceptable": "Serwer wiki ńy je w stańy dostarčyć danych we formaće, kerygo Twoja přyglůndarka uočekuje.",
        "anonymous": "{{PLURAL:$1|Anůńimowy użytkowńik|Anůńimowe użytkowńiki}} {{SITENAME}}",
        "siteuser": "Užytkowńik {{GRAMMAR:D.lp|{{SITENAME}}}} – $1",
        "lastmodifiedatby": "Uostatńy sprowjyńy tej zajty: $2, $1 (autor půmjyńań: $3)",
        "newimages-summary": "Na tyj ekstra zajće prezyntowane sům uostatńo wćepńynte pliki.",
        "newimages-legend": "Filtruj",
        "newimages-label": "Mjano plika (abo jygo tajla):",
-       "showhidebots": "($1 boty)",
        "noimages": "Brak plikůw do pokozańo.",
        "ilsubmit": "Šnupej",
        "bydate": "wedle daty",
        "autosumm-replace": "POZŮR! Zastůmpjyńy treśći hasua bardzo krůtkym tekstym: „$1”",
        "autoredircomment": "Překerowańy do [[$1]]",
        "autosumm-new": "Wćepano nowo zajta: \"$1\"",
-       "livepreview-loading": "Trwo uadowańy…",
-       "livepreview-ready": "Trwo uadowańe… Gotowe!",
-       "livepreview-failed": "Podglůnd na žywo ńy zadźouou! Poprůbuj podglůndu standardowygo.",
-       "livepreview-error": "Ńyudane pouůnčyńe: $1 „$2”. Poprůbuj podglůndu standardowygo.",
        "lag-warn-normal": "Na tyj liśće zmjany nowsze jak {{PLURAL:$1|sekůnda|sekůnd}} můgům ńy być widoczne.",
        "lag-warn-high": "S kuli srogigo uobćůnżyńo serwerůw bazy danych, na tyj liśće zmjany nowše jak {{PLURAL:$1|sekůnda|sekůnd}} můgům ńy być widoczne.",
-       "watchlistedit-numitems": "Twoja lista artikli na kere dowoš pozůr mo {{PLURAL:$1|1 titel|$1 title|$1 titlůw}}, ńy ličůnc zajtůw godki.",
-       "watchlistedit-noitems": "Twoja lista artikli na kere dowoš pozůr je pusto.",
        "watchlistedit-normal-title": "Sprowjej lista zajtůw na kere dowom pozůr",
        "watchlistedit-normal-legend": "Wyćep zajty s listy artikli na kere dowoš pozůr",
        "watchlistedit-normal-explain": "Půńiżyj mosz lista artikli na kere dowosz pozůr.\nCoby wyćepać z ńij jako zajta, zaznocz pole przi ńij i naćiś knefel „{{int:Watchlistedit-normal-submit}}”.\nMożesz tyż skorzistać ze [[Special:EditWatchlist/raw|tekstowygo sprowjorza listy artikli na kere dowosz pozůr]].",
index f580715..7117def 100644 (file)
@@ -32,7 +32,8 @@
                        "செல்வா",
                        "மதனாஹரன்",
                        "බිඟුවා",
-                       "Thamiziniyan"
+                       "Thamiziniyan",
+                       "아라"
                ]
        },
        "tog-underline": "இணைப்புகளுக்கு அடிக்கோடிடு",
        "readonly_lag": "இரண்டாம் நிலை தரவுத்தளங்கள் தலைமை தரவுத்தளத்துடன் இணைந்துக் கொள்ளும் வரை தரவுத்தளம் தானியகக்மாக பூட்டப்பட்டுள்ளது",
        "internalerror": "உள்ளகத் தவறு",
        "internalerror_info": "உள்ளகத் தவறு: $1",
-       "fileappenderrorread": "கடையிணைப்புச் செய்யும் போது \"$1\" கோப்பை படிக்க முடியவில்லை.",
-       "fileappenderror": "\"$1\" கோப்பை \"$2\" கோப்பில்  கடையிணைப்புச் செய்ய முடியவில்லை.",
        "filecopyerror": "\"$1\" இலிருந்து \"$2\" க்கு கோப்பை நகல் செய்ய முடியவில்லை.",
        "filerenameerror": "\"$1\" இலிருந்து \"$2\" க்கு கோப்பை பெயர்மாற்ற முடியவில்லை.",
        "filedeleteerror": "\"$1\" கோப்பை நீக்க முடியவில்லை.",
        "directorycreateerror": "\"$1\" அடைவை உருவாக்க முடியவில்லை.",
        "filenotfound": "\"$1\" கோப்பைக் கண்டுபிடிக்க முடியவில்லை.",
-       "fileexistserror": "\"$1\" கோப்புக்கு எழுத்தப்படமுடியவில்லை:கோப்பு ஏற்கனவே உள்ளது",
        "unexpected": "எதிர்பாராத பெறுமானம்: \"$1\"=\"$2\".",
        "formerror": "தவறு: படிவத்தை சமர்ப்பிக்க முடியவில்லை",
        "badarticleerror": "இச்செயற்பாட்டை இப்பக்கத்தில் செயற்படுத்த முடியாது.",
        "userlogin-resetlink": "உங்கள் புகுபதிகைக் குறிப்புகளை மறந்துவிட்டீர்களா?",
        "userlogin-resetpassword-link": "உங்கள் கடவுச் சொல்லை மறந்து விட்டீர்களா?",
        "userlogin-createanother": "மற்றொரு கணக்கு ஒன்றை உருவாக்கவும்",
-       "createacct-join": "உங்களின் தகவலை கீழிடவும்",
-       "createacct-another-join": "கீழே புதிய கணக்கிற்கான தகவல்களை உள்ளிடவும்.",
        "createacct-emailrequired": "மின்னஞ்சல் முகவரி",
        "createacct-emailoptional": "மின்னஞ்சல் முகவரி (விருப்பத்தேர்வு)",
        "createacct-email-ph": "உங்கள் மின்னஞ்சல் முகவரியை உள்ளிடுக",
        "savearticle": "பக்கத்தைச் சேமி",
        "preview": "முன்தோற்றம்",
        "showpreview": "முன்தோற்றம் காட்டு",
-       "showlivepreview": "நேரடி முந்தோற்றம்",
        "showdiff": "மாற்றங்களைக் காட்டு",
        "anoneditwarning": "'''எச்சரிக்கை:''' நீங்கள் புகுபதிகை செய்யவில்லை.\nஉங்கள் ஐ.பி. முகவரி இப்பக்கத்தின் தொகுப்பு வரலாற்றில் பதிவு செய்யப்படும்.",
        "anonpreviewwarning": "நீங்கள் புகுபதிகை செய்யவில்லை. இந்த பக்கத்தை சேமித்தால் உஙகள் ஐ.பி. முகவரி இதன் வரலாற்றுப் பக்கத்தில் பதிவாகும்.",
        "edit-gone-missing": "இப்பக்கத்தை நிகழ்நிலைப் படுத்தமுடியவில்லை.\nஇது நீக்கப்பட்டதாக இருக்கலாம்.",
        "edit-conflict": "முரண்பாடுகளைத் தொகுக்கவும்.",
        "edit-no-change": "வாசகங்களுக்கு எந்த மாற்றமும் செய்யப்படவில்லை என்பதனால் உங்கள் தொகுப்பு புறக்கணிக்கப்பட்டது.",
-       "postedit-confirmation": "உங்களது தொகுப்பு சேமிக்கப்பட்டது.",
+       "postedit-confirmation-saved": "உங்களது தொகுப்பு சேமிக்கப்பட்டது.",
        "edit-already-exists": "புதிய பக்கமொன்றை உருவாக்க முடியாது.\nஇப்பக்கம் ஏற்கனவே உள்ளது.",
        "defaultmessagetext": "இயல்பிருப்பு தகவல் உரை",
        "invalid-content-data": "செல்லாத உள்ளடக்கத் தரவு",
        "search-nonefound": "உங்கள் வினவலுக்கான முடிவுகள் எதுவும் இல்லை.",
        "powersearch-legend": "மேம்பட்ட தேடல்",
        "powersearch-ns": "பெயர்வெளிகளில் தேடவும்",
-       "powersearch-redir": "வழிமாற்றுகளைப் பட்டியலிடவும்",
        "powersearch-togglelabel": "சரிபார்க்கவும்:",
        "powersearch-toggleall": "அனைத்தும்",
        "powersearch-togglenone": "ஏதுமில்லை",
        "prefs-advancedsearchoptions": "மேம்பட்ட விருப்பத்தேர்வுகள்",
        "prefs-advancedwatchlist": "மேம்பட்ட விருப்பத்தேர்வுகள்",
        "prefs-displayrc": "விருப்பத்தேர்வுகளைக் காட்டு",
-       "prefs-displaysearchoptions": "விருப்பத்தேர்வுகளைக் காட்டு",
        "prefs-displaywatchlist": "விருப்பத்தேர்வுகளைக் காட்டு",
        "prefs-diffs": "வித்தியாசங்கள்",
        "prefs-help-prefershttps": "இந்த விருப்பத்தேர்வு உங்களின் அடுத்த புகுபதிகையிலிருந்து செயல்பாட்டுக்கு வரும்.",
        "recentchanges-label-unpatrolled": "இந்த  தொகுப்பு  இன்னும் ரோந்திடப்படவில்லை",
        "recentchanges-legend-newpage": "$1 - புதிய பக்கம்",
        "rcnotefrom": "கீழே காணப்படுவது '''$2''' இலிருந்து செய்யப்பட்ட மாற்றங்களாகும் ('''$1''' வரைக் காட்டப்பட்டுள்ளது).",
-       "rclistfrom": "$1 தொடக்கம் செய்யப்பட்ட புதிய மாற்றங்களைக் காட்டவும்",
+       "rclistfrom": "$3 $2 தொடக்கம் செய்யப்பட்ட புதிய மாற்றங்களைக் காட்டவும்",
        "rcshowhideminor": "சிறிய தொகுப்புகளை $1",
        "rcshowhidebots": "தானியங்கிகளை $1",
        "rcshowhideliu": "புகுபதிகை செய்த பயனர்களை $1",
        "uploadstash-refresh": "கோப்புகள் உள்ள பட்டியலை புதுப்பி",
        "invalid-chunk-offset": "செல்லாத chunk offset",
        "img-auth-accessdenied": "அனுமதி மறுக்கப்பட்டது",
-       "img-auth-nopathinfo": "PATH_INFO காணவில்லை.\nஉங்கள் வழங்கி இந்தத் தகவலை அனுப்ப அமைக்கப்படவில்லை\nஇது சிஜிஐ (CGI)- அடிப்படையிலானதாகவோ img_auth-ஐ ஆதரக்காததாகவோ இருக்கலாம் .\nபார்க்கவும் https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "PATH_INFO காணவில்லை.\nஉங்கள் வழங்கி இந்தத் தகவலை அனுப்ப அமைக்கப்படவில்லை\nஇது சிஜிஐ (CGI)- அடிப்படையிலானதாகவோ img_auth-ஐ ஆதரக்காததாகவோ இருக்கலாம் .\nபார்க்கவும் https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "கோரிய பாதை இந்த குறிப்பிட்ட தகவலேற்று கோப்புறையில் இல்லை.",
        "img-auth-badtitle": "செல்லத்தக்க தலைப்பு \"$1\" ஐ கட்ட இயலவில்லை.",
        "img-auth-nologinnWL": "நீங்கள் புகுபதிகை செய்யவில்லை, மேலும் \"$1\"  அனுமதிக்கப்பெற்ற பட்டியலில் இல்லை",
        "watchlist-details": "பேச்சுப் பக்கங்களைத் தவிர்த்து, {{PLURAL:$1|$1 பக்கம் கவனிக்கப்பட்டது.|$1 பக்கங்கள் கவனிக்கப்பட்டன.}}",
        "wlheader-enotif": "மின்னஞ்சல் அறிவிப்புகள் செயல்படுத்தப்பட்டுள்ளன.",
        "wlheader-showupdated": "உங்கள் கடைசி வருகைக்குப் பின்னர் மாற்றங்கள் செய்யப்பட்ட பக்கங்கள் '''தடித்த எழுத்துக்களில்''' காட்டப்பட்டுள்ளன",
-       "watchmethod-recent": "கவனிக்கப்படுகின்ற பக்கங்களுக்காக, அண்மைய தொகுப்புகள் தேடிப் பார்க்கப்படுகிறன",
-       "watchmethod-list": "அண்மைய தொகுப்புகளுக்காக, கவனிக்கப்படுகின்ற பக்கங்கள் தேடிப் பார்க்கப்படுகிறன",
-       "watchlistcontains": "உங்கள் கவனிப்புப் பட்டியல் {{PLURAL:$1|ஒரு பக்கத்தைக்|$1 பக்கங்களைக்}} கொண்டுள்ளது.",
-       "iteminvalidname": "விடயம் '$1' தொடர்பில் பிரச்சினை உள்ளது, செல்லுபடியாகாத பெயர்...",
        "wlshowlast": "கடைசி $1 மணித்தியாலங்கள் $2 நாட்களைக் காட்டு $3",
        "watchlist-options": "கவனிப்பு பட்டியலின் விருப்பத் தேர்வுகள்",
        "watching": "கவனிக்கப்படுகிறது...",
        "enotif_lastvisited": "உங்கள் கடைசி வருகைக்குப் பின்னர் நடைபெற்றுள்ள மாற்றங்களைக் காண $1 பக்கத்தைப் பார்க்கவும்.",
        "enotif_lastdiff": "மாற்றங்களைக் காண  $1 பக்கத்தைப் பார்.",
        "enotif_anon_editor": "அடையாளம் காட்டாத பயனர் $1",
-       "enotif_body": "வணக்கம் $WATCHINGUSERNAME,\n\n\n{{SITENAME}} தளத்தின் $PAGETITLE பக்கம் $PAGEEDITDATE அன்று $PAGEEDITOR என்ற பெயருடைய பயனரால் $CHANGEDORCREATED, இப்பக்கத்தின் தற்போதைய பதிப்பை $PAGETITLE_URL என்ற இணைப்பின் வழிச் சென்று காணலாம்.\n\n\n$NEWPAGE\n\nதொகுப்புச் சுருக்கம்: $PAGESUMMARY $PAGEMINOREDIT\n\nதொகுத்தவரை அணுக:\nமின்னஞ்சல்: $PAGEEDITOR_EMAIL\nவிக்கி: $PAGEEDITOR_WIKI\n\nஇப்பக்கத்தை நீங்கள் மீண்டும் பார்க்கும் வரையும் அதில் செய்யப்படும் மாற்றங்கள் தொடர்பான அறிவிப்புகள் வழங்கப்படமாட்டாது. உங்கள் கவனிப்புப் பட்டியலிலுள்ள பக்கங்களுக்கான அறிவித்தல் குறிகளை உங்கள் கவனிப்புப் பட்டியலிலேயே மாற்றலாம்.\n\n             உங்கள் தோழமையுள்ள {{SITENAME}} தளத்தின் அறிவித்தல் அமைப்பு\n\n--\nஉங்கள் கவனிப்புப் பட்டியல் அமைவுகளை மாற்ற\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nபின்னூட்டம், மேலதிக உதவிகளுக்கு:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "வணக்கம் $WATCHINGUSERNAME,\n\n\n{{SITENAME}} தளத்தின் $PAGETITLE பக்கம் $PAGEEDITDATE அன்று $PAGEEDITOR என்ற பெயருடைய பயனரால் $CHANGEDORCREATED, இப்பக்கத்தின் தற்போதைய பதிப்பை $PAGETITLE_URL என்ற இணைப்பின் வழிச் சென்று காணலாம்.\n\n\n$NEWPAGE\n\nதொகுப்புச் சுருக்கம்: $PAGESUMMARY $PAGEMINOREDIT\n\nதொகுத்தவரை அணுக:\nமின்னஞ்சல்: $PAGEEDITOR_EMAIL\nவிக்கி: $PAGEEDITOR_WIKI\n\nஇப்பக்கத்தை நீங்கள் மீண்டும் பார்க்கும் வரையும் அதில் செய்யப்படும் மாற்றங்கள் தொடர்பான அறிவிப்புகள் வழங்கப்படமாட்டாது. உங்கள் கவனிப்புப் பட்டியலிலுள்ள பக்கங்களுக்கான அறிவித்தல் குறிகளை உங்கள் கவனிப்புப் பட்டியலிலேயே மாற்றலாம்.\n\n             உங்கள் தோழமையுள்ள {{SITENAME}} தளத்தின் அறிவித்தல் அமைப்பு\n\n--\nஉங்கள் கவனிப்புப் பட்டியல் அமைவுகளை மாற்ற\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nபின்னூட்டம், மேலதிக உதவிகளுக்கு:\n$HELPPAGE",
        "created": "தொடக்கப்பட்டது",
        "changed": "மாற்றப்பட்டது",
        "deletepage": "பக்கத்தை நீக்கு",
        "blockip": "பயனரைத் தடு",
        "blockip-legend": "பயனரைத் தடு",
        "blockiptext": "ஒரு குறிப்பிட்ட ஐபி முகவரி அல்லது பயனரிடமிருந்து எழுத்து அணுக்கத்தைத் தடுப்பதற்குக் கீழேயுள்ள படிவத்தை உபயோகிக்கவும். இது விசமத்தனத்தைத் தடுப்பதற்கும் [[{{MediaWiki:Policy-url}}|{{SITENAME}} கொள்கை]]க்கு எற்புடைய வகையிலும் மட்டுமே பயன்படுத்தப்பட வேண்டும்.\nகுறிப்பிட்ட காரணமொன்றைக் கீழே நிரப்புக (எடுத்துக்காட்டாக, விசமத்தனம் செய்யப்பட்ட பக்கங்களை எடுத்துக் காட்டவும்).",
-       "ipadressorusername": "ஐ.பி. அல்லது பயனர் பெயர்:",
+       "ipaddressorusername": "ஐ.பி. அல்லது பயனர் பெயர்:",
        "ipbexpiry": "காலாவதி:",
        "ipbreason": "காரணம்:",
        "ipbreason-dropdown": "*பொதுவான தடைக் காரணங்கள்\n** பொய்யான தகவல்களை இடல்\n** பக்கங்களிலிருந்து உள்ளடக்கங்களை நீக்கல்\n** எரித இணைப்புகளை வெளியிணைப்பாக கொடுத்தல்\n** பக்கங்களுக்கு அர்த்தமற்ற உள்ளடக்கங்களை இணைத்தல்\n** பொறுப்பற்ற நடிவடிக்கைகள்\n** ஒரு பயனர் பல கணக்குகளைப் பேணல்\n** ஏற்றுக்கொள்ளப்படமுடியாத பயனர் பெயர்",
        "tooltip-preferences-save": "விருப்பங்களை சேமி",
        "tooltip-summary": "குறுகிய சுருக்கத்தை உள்ளிடவும்.",
        "interlanguage-link-title": "$1 - $2",
-       "notacceptable": "உங்களது சேவையாளர் வாசிக்க கூடிய விதத்தில் இந்த விக்கியால தரவுகளை வழங்க முடியாது.",
        "anonymous": "{{SITENAME}} தளத்தின் அடையாளம் காட்டாத {{PLURAL:$1|பயனர்|பயனர்கள்}}",
        "siteuser": "{{SITENAME}} தளத்தின் பயனர் $1",
        "anonuser": "$1 அறியபாடாத பயனர்  {{SITENAME}}",
        "newimages-summary": "இச்சிறப்புப் பக்கம் கடைசியாக பதிவேற்றப்பட்ட பக்கங்களைப் பட்டியலிடுகிறது.",
        "newimages-legend": "வடிகட்டி",
        "newimages-label": "கோப்பின் பெயர் (அல்லது அதன் பகுதி):",
-       "showhidebots": "(தானியங்கிகளை $1)",
        "noimages": "பார்வைக்கு ஓன்றுமில்லை.",
        "ilsubmit": "தேடுக",
        "bydate": "நாள் வழி",
        "autosumm-replace": "பக்கத்தை '$1' கொண்டு பிரதியீடு செய்தல்",
        "autoredircomment": "[[$1]] நோக்கி நகர்த்தல்",
        "autosumm-new": "\"$1\"-இப்பெயரில் புதிய பக்கம் உருவாக்கப்பட்டுள்ளது",
-       "livepreview-loading": "ஏற்றப்படுகிறது…",
-       "livepreview-ready": "ஏற்றப்படுகிறது… தயார்!",
-       "livepreview-failed": "நேரடி முன்தோற்றம் தோல்வி! இயல்பான முன்தோற்றத்தைப் பயன்படுத்து",
-       "livepreview-error": "இணைக்க முடியவில்லை: $1 \"$2\". பொதுவான முன்தோற்றத்தை முயல்க.",
        "lag-warn-normal": "$1 {{PLURAL:$1|விநாடிக்குள்|விநாடிகளுக்குள்}} ஏற்பட்ட புதிய மாற்றங்கள் இந்த பட்டியலில் காட்டப்படாமல் இருக்கலாம்.",
        "lag-warn-high": "அதிகமான தரவுத்தள இடைமாற்று காரணமாக $1 {{PLURAL:$1|விநாடிக்குள்|விநாடிகளுக்குள்}} ஏற்பட்ட புதிய மாற்றங்கள் இந்த பட்டியலில் காட்டப்படாமல் இருக்கலாம்.",
-       "watchlistedit-numitems": "பேச்சுப் பக்கங்களைக் கணக்கிடாமல், உங்கள் கவனிப்புப் பட்டியலில் {{PLURAL:$1|ஒரு பக்கம் உள்ளது|$1 பக்கங்கள் உள்ளன}}.",
-       "watchlistedit-noitems": "உங்கள் கவனிப்புப் பட்டியலில் தலைப்புகள் ஏதுமில்லை.",
        "watchlistedit-normal-title": "கவனிப்புப் பட்டியலைத் தொகு",
        "watchlistedit-normal-legend": "கவனிப்புப் பட்டியலிலிருந்து தலைப்புகளை நீக்கு",
        "watchlistedit-normal-explain": "உங்கள் கவனிப்புப் பட்டியலில் உள்ள தலைப்புகள் கீழே காட்டப்பட்டுள்ளன.\nதலைப்பொன்றை நீக்குவதற்கு அதற்கு முன்னால் காணப்படும் பெட்டியை தேர்ந்தெடுத்து இதை சொடுக்கவும்\"{{int:Watchlistedit-normal-submit}}\".\nமேலும் [[Special:EditWatchlist/raw|விக்கி நிரலெதுவுமற்ற பட்டியலை தொகுக்கலாம்]]",
        "compare-invalid-title": "நீங்கள் குறிப்பிட்ட தலைப்பு செல்லாதது.",
        "compare-title-not-exists": "நீங்கள் குறிப்பிட்ட தலைப்பு இல்லை.",
        "compare-revision-not-exists": "நீங்கள் குறிப்பிட்ட பரிசீலனை இல்லை.",
-       "dberr-header": "இந்த விக்கிக்குஒரு கோளாறு உள்ளது",
        "dberr-problems": "மன்னிக்கவும்! இந்த தளம், தொழில்நுட்ப பிரச்சினைகளுக்கு உள்ளாகியுள்ளது..",
        "dberr-again": "சில நிமிடங்கள் காத்திரு மற்றும் மறுபடியும் முயற்சிக்கவும்",
        "dberr-info": "(தரவுதள சேவகனை தொடர்பு கொள்ள முடியாது:  $1 )",
index 1bab928..3c54cb6 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "NamwikiTL",
                        "VASANTH S.N.",
-                       "VinodSBangera"
+                       "VinodSBangera",
+                       "아라"
                ]
        },
        "tog-underline": "ಲಿಂಕ್’ಲೆದ ತಿರ್ತ್ ಗೆರೆ(ಅಂಡರ್ ಲೈನ್) ಪಾಡ್’ಲೆ",
@@ -14,7 +15,6 @@
        "tog-showtoolbar": "ಸಂಪಾದನೆದ ಉಪಕರಣನ್(ಎಡಿಟ್ ಟೂಲ್ ಬಾರ್) ತೊಜ್ಪಾಲೆ (JavaScript)",
        "tog-editondblclick": "ರಡ್ಡ್ ಸರಿ ಕ್ಲಿಕ್ ಮಲ್ತ್’ದ್ ಪುಟೊನು ಸಂಪಾದನೆ ಮಲ್ಪುಲೆ (JavaScript)",
        "tog-editsectiononrightclick": "ಪುಟೊತ ವಿಭಾಗೊಲೆನ್ ಐತ ಹೆಡ್ಡಿಂಗ್’ನ್ ರೈಟ್ ಕ್ಲಿಕ್ ಮಲ್ತ್’ದ್ ಸಂಪಾದನೆ ಮಲ್ಪುಲೆಕ ಉಪ್ಪಡ್ (JavaScript)",
-       "tog-rememberpassword": "ಈ ಕಂಪ್ಯೂಟರ್’ಡ್ ಎನ್ನ ಲಾಗಿನ್ನ್ ನೆನಪುಡು ದೀಲ (for a maximum of $1 {{PLURAL:$1|day|days}})",
        "tog-watchcreations": "ಯಾನ್ ಶುರು ಮಲ್ತಿನ ಪುಟೊಲೆನ್ ಯೆನ್ನ ವೀಕ್ಷಣಾಪಟ್ಟಿಗ್ ಸೇರ್ಪಾಲೆ",
        "tog-watchdefault": "ಯಾನ್ ಸಂಪಾದನೆ ಮನ್ಪುನಂಚಿನ ಪುಟೊಲೆನ್ ವೀಕ್ಷಣಾಪಟ್ಟಿಗ್ ಸೇರ್ಪಾಲೆ",
        "tog-watchmoves": "ಯಾನ್ ಮೂವ್ ಮಲ್ತಿನಂಚಿನ ಪುಟೊಲೆನ್ ಎನ್ನ ವೀಕ್ಷಣಾಪಟ್ಟಿಗ್ ಸೇರ್ಪಾಲೆ",
        "filedeleteerror": "\"$1\" ಫೈಲ್ ನ್ ದೆತ್ತ್ ಪಾಡೆರೆ ಆವೊ೦ದಿಜ್ಜಿ.",
        "directorycreateerror": "\"$1\" ಡೈರೆಕ್ಟರಿನ್ ಉ೦ಡು ಮಲ್ಪೆರೆ ಆವೊ೦ದಿಜ್ಜಿ.",
        "filenotfound": "\"$1\" ಫೈಲ್ ನ್ ನಾಡಿಯೆರೆ ಆಯಿಜಿ.",
-       "fileexistserror": "\"$1\" ಫೈಲ್ ಗ್ ಬರೆಯೆರೆ ಆವೊ೦ದಿಜ್ಜಿ: ಈ ಫೈಲ್ ದು೦ಬೇ ಉ೦ಡು.",
        "unexpected": "ಅನಿರೀಕ್ಷಿತ ಮೌಲ್ಯ: \"$1\"=\"$2\".",
        "formerror": "ದೋಷ: ಅರ್ಜಿನ್ ಕಡಪುಡಿಯೆರ್ ಆಯಿಜಿ",
        "badarticleerror": "ಈ ಪುಟಡ್ ಈರ್ ಪ್ರಯತ್ನಿಸಾನ ಕಾರ್ಯ ಸಾದ್ಯ ಇಜ್ಜಿ",
        "savearticle": "ಪುಟೊನು ಒರಿಪಾಲೆ",
        "preview": "ಮುನ್ನೋಟ",
        "showpreview": "ಮುನ್ನೋಟ ತೊಜ್ಪಾವ್",
-       "showlivepreview": "ಪ್ರತ್ಯಕ್ಷ ಮುನ್ನೋಟ",
        "showdiff": "ಬದಲಾವಣೆಲೆನ್ ತೊಜ್ಪಾವ್",
        "anoneditwarning": "'''ಜಾಗ್ರತೆ:''' ಈರ್ ಇತ್ತೆ ಲಾಗ್ ಇನ್ ಆತಿಜರ್.\nಈರ್ನ ಐ.ಪಿ ಎಡ್ರೆಸ್ ಈ ಪುಟೊತ ಬದಲಾವಣೆ ಇತಿಹಾಸೊಡು ದಾಖಲಾಪು೦ಡು.",
        "anonpreviewwarning": "ಈರ್ ಇತ್ತೆ ಲಾಗ್ ಇನ್ ಆತಿಜರ್. ಈರ್ನ ಐ.ಪಿ ಎಡ್ರೆಸ್ ಈ ಪುಟೊತ ಬದಲಾವಣೆ ಇತಿಹಾಸೊಡು ದಾಖಲಾಪು೦ಡು",
        "recentchanges-feed-description": "ಈ ಫೀಡ್’ಡ್ ವಿಕಿಕ್ ಇಂಚಿಪ್ಪ ಆತಿನಂಚಿನ ಬದಲಾವಣೆಲೆನ್ ಟ್ರ್ಯಾಕ್ ಮಲ್ಪುಲೆ.",
        "recentchanges-label-newpage": "ಇರ್ನ ಈ ಬದಲಾವಣೆ ಪೊಸ ಪುಟೊನು ಸುರು ಮಲ್ಪುಂಡು",
        "recentchanges-label-minor": "ಉಂದು ಎಲ್ಯ ಬದಲಾವಣೆ",
-       "rclistfrom": "$1 ರ್ದ್ ಶುರುವಾತಿನ ಪೊಸ ಬದಲಾವಣೆಲೆನ್ ತೊಜ್ಪಾವು",
+       "rclistfrom": "$3 $2 ರ್ದ್ ಶುರುವಾತಿನ ಪೊಸ ಬದಲಾವಣೆಲೆನ್ ತೊಜ್ಪಾವು",
        "rcshowhideminor": "$1 ಎಲ್ಯೆಲ್ಯ ಬದಲಾವಣೆಲು",
        "rcshowhidebots": "$1 ಬಾಟ್",
        "rcshowhideliu": "ಲಾಗ್-ಇನ್ ಆತಿನಂಚಿನ ಸದಸ್ಯೆರ್ $1",
index 7267f20..7b9d9ce 100644 (file)
@@ -37,7 +37,7 @@
        "tog-watchdefault": "నేను మార్చే పేజీలను మరియు దస్త్రాలను నా వీక్షణ జాబితాకు చేర్చు",
        "tog-watchmoves": "నేను తరలించిన పేజీలను మరియు దస్త్రాలను నా వీక్షణ జాబితాకు చేర్చు",
        "tog-watchdeletion": "నేను తొలగించిన పేజీలను మరియు దస్త్రాలను నా వీక్షణ జాబితాకు చేర్చు",
-       "tog-minordefault": "డిఫాలà±\8dà°\9fà±\81గా నా మార్పులను చిన్న మార్పులుగా గుర్తించు",
+       "tog-minordefault": "à°\85à°ªà±\8dà°°à°®à±\87à°¯à°\82గా నా మార్పులను చిన్న మార్పులుగా గుర్తించు",
        "tog-previewontop": "వ్యాసం మార్పుల మునుచూపును ఎడిట్ పెట్టె పైన చూపు",
        "tog-previewonfirst": "మొదటి  దిద్దుబాటు చేసినపుడు వ్యాసపు మునుచూపు చూపించు",
        "tog-enotifwatchlistpages": "నా వీక్షణాజాబితా లోని పేజీ లేదా దస్త్రం మారినపుడు నాకు ఈ-మెయిలు పంపు",
@@ -63,7 +63,7 @@
        "tog-prefershttps": "లాగిన్ అయి ఉన్నప్పుడెల్లా భద్ర కనెక్షనునే వాడు",
        "underline-always": "ఎల్లప్పుడూ",
        "underline-never": "ఎప్పటికీ వద్దు",
-       "underline-default": "à°°à±\82à°ªà±\81 à°¯à±\8aà°\95à±\8dà°\95 à°²à±\87దా à°µà°¿à°¹à°¾à°°à°¿à°£à°¿ à°¯à±\8aà°\95à±\8dà°\95 అప్రమేయం",
+       "underline-default": "à°\85à°²à°\82à°\95ారపà±\81 à°²à±\87దా à°µà°¿à°¹à°¾à°°à°¿à°£à°¿ అప్రమేయం",
        "editfont-style": "దిద్దుబాటు పెట్టె ఫాంటు శైలి:",
        "editfont-default": "విహరిణి అప్రమేయం",
        "editfont-monospace": "మోనోస్పేస్‍డ్ ఫాంట్",
        "readonly_lag": "అనుచర (స్లేవ్) డేటాబేసు సర్వర్లు, ప్రధాన (మాస్టరు) సర్వరును అందుకునేందుకుగాను, డేటాబేసు ఆటోమాటిక్‌గా లాకు అయింది.",
        "internalerror": "అంతర్గత లోపం",
        "internalerror_info": "అంతర్గత లోపం: $1",
-       "fileappenderrorread": "చేరుస్తున్నప్పుడు \"$1\"ని చదవలేకపోయాం.",
-       "fileappenderror": "\"$1\" ని \"$2\" తో కూర్చలేకపోయాం",
        "filecopyerror": "ఫైలు \"$1\" ను \"$2\" కు కాపీ చెయ్యలేకపోయాం.",
        "filerenameerror": "ఫైలు \"$1\" పేరును \"$2\"గా మార్చలేకపోయాం.",
        "filedeleteerror": "ఫైలు \"$1\"ని తొలగించలేకపోయాం.",
        "directorycreateerror": "\"$1\" అనే డైరెక్టరీని సృష్టించలేక పోయాం.",
        "filenotfound": "ఫైలు \"$1\" కనబడలేదు.",
-       "fileexistserror": "\"$1\" అనే ఫైలులోకి రాయలేకపోతున్నాం. అది ఈసరికే ఉంది.",
        "unexpected": "అనుకోని విలువ: \"$1\"=\"$2\".",
        "formerror": "లోపం: ఈ ఫారాన్ని పంపించలేకపోయాం.",
        "badarticleerror": "ఈ పేజీపై ఈ పని చేయడం కుదరదు.",
        "userlogin-helplink2": "లాగినవడంలో సహాయం",
        "userlogin-loggedin": "మీరు ఈసరికే {{GENDER:$1|$1}} గా లాగిన్ అయి ఉన్నారు.\nవేరే వాడుకరిగా లాగినయేందుకు కింది ఫారమును వాడండి.",
        "userlogin-createanother": "మరొక ఖాతాను సృష్టించండి",
-       "createacct-join": "మీ సమాచారాన్ని క్రింద ఇవ్వండి.",
-       "createacct-another-join": "కొత్త ఖాతా యొక్క సమాచారాన్ని క్రింద ఇవ్వండి.",
        "createacct-emailrequired": "ఈమెయిలు చిరునామా",
        "createacct-emailoptional": "ఈమెయిలు చిరునామా (ఐచ్చికం)",
        "createacct-email-ph": "మీ ఈమెయిలు చిరునామాను ఇవ్వండి",
        "nocookiesnew": "ఖాతాని సృష్టించాం, కానీ మీరు ఇంకా లోనికి ప్రవేశించలేదు.\nవాడుకరుల ప్రవేశానికి {{SITENAME}} కూకీలను వాడుతుంది.\nమీరు కూకీలని అచేతనం చేసివున్నారు.\nదయచేసి వాటిని చేతనంచేసి, మీ కొత్త వాడుకరి పేరు మరియు సంకేతపదాలతో లోనికి ప్రవేశించండి.",
        "nocookieslogin": "వాడుకరుల ప్రవేశానికై {{SITENAME}} కూకీలను వాడుతుంది.\nమీరు కుకీలని అచేతనం చేసివున్నారు.\nవాటిని చేతనంచేసి ప్రయత్నించండి.",
        "nocookiesfornew": "మూలాన్ని కనుక్కోలేకపోయాం కాబట్టి, ఈ వాడుకరి ఖాతాను సృష్టించలేకపోయాం.\nమీ కంప్యూటర్లో కూకీలు చేతనమై ఉన్నాయని నిశ్చయించుకొని, ఈ పేజీని తిరిగి లోడు చేసి, మళ్ళీ ప్రయత్నించండి.",
-       "noname": "మీరు సరైన వాడుకరిపేరు ఇవ్వలేదు.",
+       "noname": "మీరు సరైన వాడుకరి పేరు ఇవ్వలేదు.",
        "loginsuccesstitle": "ప్రవేశం విజయవంతమైంది",
        "loginsuccess": "<strong>మీరు ఇప్పుడు {{SITENAME}}లోనికి \"$1\"గా ప్రవేశించారు.</strong>",
        "nosuchuser": "\"$1\" అనే పేరుతో వాడుకరులు లేరు.\nవాడుకరి పేర్లు కేస్ సెన్సిటివ్.\nఅక్షరక్రమం సరిచూసుకోండి, లేదా [[Special:UserLogin/signup|కొత్త ఖాతా సృష్టించుకోండి]].",
        "savearticle": "పేజీని భద్రపరచు",
        "preview": "మునుజూపు",
        "showpreview": "మునుజూపు చూపు",
-       "showlivepreview": "తక్షణ మునుజూపు",
        "showdiff": "తేడాలను చూపించు",
        "anoneditwarning": "<strong>హెచ్చరిక:</strong> మీరు లాగినవలేదు.\nఈ పేజీ దిద్దుబాటు చరిత్రలో మీ ఐపీ చిరునామా నమోదవుతుంది.",
        "anonpreviewwarning": "<em>మీరు లాగినవలేదు. భద్రపరిస్తే ఈ పేజీ యొక్క దిద్దుబాటు చరిత్రలో మీ ఐపీ చిరునామా నమోదవుతుంది.</em>",
        "edit-gone-missing": "పేజీని తాజాకరించలేకపోయాం.\nదాన్ని తొలగించినట్టున్నారు.",
        "edit-conflict": "దిద్దుబాటు ఘర్షణ.",
        "edit-no-change": "పాఠ్యంలో మార్పులేమీ చెయ్యలేదు కాబట్టి, మీ మార్పును పట్టించుకోవట్లేదు.",
-       "postedit-confirmation": "మీ మార్పు భద్రమయ్యింది.",
+       "postedit-confirmation-created": "పేజీ సృష్టించబడినది.",
+       "postedit-confirmation-saved": "మీ మార్పు భద్రమయ్యింది.",
        "edit-already-exists": "కొత్త పేజీని సృష్టించలేకపోయాం.\nఅది ఇప్పటికే ఉంది.",
        "defaultmessagetext": "అప్రమేయ సందేశపు పాఠ్యం",
        "content-failed-to-parse": "$1 మోడల్ కొరకు $2 పాఠ్యాన్ని పార్స్ చెయ్యలేకపోయాం: $3",
        "search-nonefound": "మీ ప్రశ్నకి సరిపోలిన ఫలితాలేమీ లేవు.",
        "powersearch-legend": "నిశితమైన అన్వేషణ",
        "powersearch-ns": "ఈ పేరుబరుల్లో వెతుకు:",
-       "powersearch-redir": "దారిమార్పులను చూపించు",
        "powersearch-togglelabel": "ఎంచుకోండి:",
        "powersearch-toggleall": "అన్నీ",
        "powersearch-togglenone": "ఏదీకాదు",
        "prefs-emailconfirm-label": "ఈ-మెయిల్ నిర్ధారణ:",
        "youremail": "ఈమెయిలు:",
        "username": "{{GENDER:$1|వాడుకరి పేరు}}:",
-       "uid": "{{GENDER:$1|వాడుకరి}} ID:",
        "prefs-memberingroups": "ఈ {{PLURAL:$1|గుంపులో|గుంపులలో}} {{GENDER:$2|సభ్యుడు|సభ్యురాలు}}:",
        "prefs-registration": "నమోదైన సమయం:",
        "yourrealname": "అసలు పేరు:",
        "prefs-advancedsearchoptions": "ఉన్నత ఎంపికలు",
        "prefs-advancedwatchlist": "ఉన్నత ఎంపికలు",
        "prefs-displayrc": "ప్రదర్శన ఎంపికలు",
-       "prefs-displaysearchoptions": "ప్రదర్శన ఎంపికలు",
        "prefs-displaywatchlist": "ప్రదర్శన ఎంపికలు",
        "prefs-tokenwatchlist": "టోకెన్",
        "prefs-diffs": "తేడాలు",
        "right-move": "పేజీలను తరలించడం",
        "right-move-subpages": "పేజీలను వాటి ఉపపేజీలతో బాటుగా తరలించడం",
        "right-move-rootuserpages": "వాడుకరుల ప్రధాన పేజీలను తరలించగలగడం",
+       "right-move-categorypages": "వర్గ పేజీలను తరలించు",
        "right-movefile": "ఫైళ్ళను తరలించడం",
        "right-suppressredirect": "పేజీని తరలించేటపుడు పాత పేరు నుండి దారిమార్పును సృష్టించకుండా ఉండటం",
        "right-upload": "దస్త్రాలను ఎక్కించడం",
        "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": "ఈ ఫైలుని తిరగవ్రాసే",
        "uploadstash-refresh": "దస్త్రాల జాబిజాను తాజాకరించు",
        "invalid-chunk-offset": "చెల్లని చంక్ ఆఫ్‍సెట్",
        "img-auth-accessdenied": "అనుమతిని నిరాకరించారు",
-       "img-auth-nopathinfo": "PATH_INFO లేదు.\nమీ సర్వరు ఈ సమాచారాన్ని పంపించేందుకు అనువుగా అమర్చి లేదు.\nఅది CGI ఆధారితమై ఉండొచ్చు. అంచేత img_auth కు అనుకూలంగా లేదు.\nhttps://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.",
+       "img-auth-nopathinfo": "PATH_INFO లేదు.\nమీ సర్వరు ఈ సమాచారాన్ని పంపించేందుకు అనువుగా అమర్చి లేదు.\nఅది CGI ఆధారితమై ఉండొచ్చు. అంచేత img_auth కు అనుకూలంగా లేదు.\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization చూడండి.",
        "img-auth-notindir": "అభ్యర్థించిన తోవ ఎక్కింపు సంచయంలో లేదు.",
        "img-auth-badtitle": "\"$1\" నుండి సరైన శీర్షికని నిర్మించలేకపోయాం.",
        "img-auth-nologinnWL": "మీరు లాగినయి లేరు. పైగా \"$1\" అనేది తెల్లజాబితాలో లేదు.",
        "log-title-wildcard": "ఈ పాఠ్యంతో మొదలయ్యే పుస్తకాల కొరకు వెతుకు",
        "showhideselectedlogentries": "ఎంచుకున్న చిట్టా పద్దులను చూపించు/దాచు",
        "allpages": "అన్ని పేజీలు",
-       "alphaindexline": "$1 నుండి $2 వరకు",
        "nextpage": "తరువాతి పేజీ ($1)",
        "prevpage": "మునుపటి పేజీ ($1)",
        "allpagesfrom": "ఇక్కడ మొదలు పెట్టి పేజీలు చూపించు:",
        "watchnologin": "లాగిన్‌ అయిలేరు",
        "addwatch": "వీక్షణ జాబితాలో చేర్చు",
        "addedwatchtext": "\"[[:$1]]\" అనే పుట మీ [[Special:Watchlist|వీక్షణ జాబితా]]లో చేరింది.\nభవిష్యత్తులో ఈ పుటకి మరియు సంబంధిత చర్చాపుటకి జరిగే మార్పులు అక్కడ కనిపిస్తాయి.",
+       "addedwatchtext-short": "\"$1\" పేజీ మీ వీక్షణజాబితాకు చేర్చబడినది.",
        "removewatch": "వీక్షణ జాబితా నుండి తొలగించు",
        "removedwatchtext": "\"[[:$1]]\" అనే పేజీ [[Special:Watchlist|మీ వీక్షణ జాబితా]] నుండి తొలగించబడినది.",
+       "removedwatchtext-short": "\"$1\" పేజీ మీ వీక్షణ జాబితానుండి తొలగించబడినది.",
        "watch": "వీక్షించు",
        "watchthispage": "ఈ పుట మీద కన్నేసి ఉంచు",
        "unwatch": "వీక్షించవద్దు",
        "watchlist-details": "మీ వీక్షణ జాబితాలో {{PLURAL:$1|ఒక పేజీ ఉంది|$1 పేజీలు ఉన్నాయి}}, చర్చా పేజీలని వదిలేసి.",
        "wlheader-enotif": "ఈ-మెయిలు గమనికలు పంపబడతాయి.",
        "wlheader-showupdated": "మీ గత సందర్శన తరువాత మారిన పేజీలు <strong>బొద్దు</strong>గా చూపించబడ్డాయి.",
-       "watchmethod-recent": "వీక్షణ జాబితాలోని పేజీల కొరకు ఇటీవలి మార్పులు పరిశీలించబడుతున్నాయి",
-       "watchmethod-list": "ఇటీవలి మార్పుల కొరకు వీక్షణ జాబితాలోని పేజీలు పరిశీలించబడుతున్నాయి",
-       "watchlistcontains": "మీ వీక్షణ జాబితాలో {{PLURAL:$1|ఒక పేజీ ఉంది|$1 పేజీలు ఉన్నాయి}}.",
-       "iteminvalidname": "'$1' తో ఇబ్బంది, సరైన పేరు కాదు...",
        "wlnote2": "$2, $3 సమయానికి, గత {{PLURAL:$1|గంటలో|<strong>$1</strong> గంటల్లో}}, జరిగిన మార్పులు కింద ఇవ్వబడ్డాయి.",
        "wlshowlast": "గత $1 గంటల $2 రోజుల $3 చూపించు",
        "watchlist-options": "వీక్షణ జాబితా ఎంపికలు",
        "enotif_lastvisited": "మీ గత సందర్శన తరువాత జరిగిన మార్పుల కొరకు $1 చూడండి.",
        "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{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "ప్రియమైన $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nచేర్పరి సారాంశం: $PAGESUMMARY $PAGEMINOREDIT\n\nచేర్పరిని సంప్రదించండి:\nమెయిలు: $PAGEEDITOR_EMAIL\nవికీ: $PAGEEDITOR_WIKI\n\nమీరు లాగినై ఈ పేజీకి వెళ్తే తప్ప ఇక ముందు జరిగే కార్యకలాపాల గురించిన వార్తలను మీకు పంపించము. మీ వీక్షణజాబితా లోని అన్ని పేజీలకు ఉన్న గమనింపు జెండాలను మార్చుకోవచ్చు.\n\nమీ స్నేహపూర్వక {{SITENAME}} గమనింపుల వ్యవస్థ\n\n--\nమీ ఈమెయిలు గమనింపుల అమరికలను మార్చుకునేందుకు, చూడండి\n{{canonicalurl:{{#special:Preferences}}}}\n\nమీ వీక్షణ జాబితా అమరికలను మార్చుకునేందుకు, చూడండి\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nమీ వీక్షణ జాబితా నుండి పేజీని తొలగించేందుకు, చూడండి\n$UNWATCHURL\n\nఫీడుబ్యాకుకు, ఇతర సహాయం కోసం:\n$HELPPAGE",
        "created": "సృష్టించారు",
        "changed": "మార్చారు",
        "deletepage": "పేజీని తొలగించు",
        "contributions-title": "$1 యొక్క మార్పులు-చేర్పులు",
        "mycontris": "మార్పుచేర్పులు",
        "contribsub2": "{{GENDER:$3|$1}} ($2) కొరకు",
+       "contributions-userdoesnotexist": "వాడుకరి ఖాతా \"$1\" నమోదుకాలేదు.",
        "nocontribs": "ఈ విధమైన మార్పులేమీ దొరకలేదు.",
        "uctop": "(ప్రస్తుత)",
        "month": "ఈ నెల నుండి (అంతకు ముందువి):",
        "blockip": "వాడుకరి నిరోధం",
        "blockip-legend": "వాడుకరి నిరోధం",
        "blockiptext": "ఏదైనా ప్రత్యేక ఐపీ చిరునామానో లేదా వాడుకరిపేరునో రచనలు చెయ్యకుండా నిరోధించాలంటే కింది ఫారాన్ని వాడండి.\nకేవలం దుశ్చర్యల నివారణ కోసం మాత్రమే దీన్ని వాడాలి, అదికూడా [[{{MediaWiki:Policy-url}}|విధానాన్ని]] అనుసరించి మాత్రమే.\nస్పష్టమైన కారణాన్ని కింద రాయండి (ఉదాహరణకు, దుశ్చర్యలకు పాల్పడిన పేజీలను ఉదహరించండి).",
-       "ipadressorusername": "ఐపీ చిరునామా లేదా వాడుకరిపేరు:",
+       "ipaddressorusername": "ఐపీ చిరునామా లేదా వాడుకరిపేరు:",
        "ipbexpiry": "అంతమయ్యే గడువు",
        "ipbreason": "కారణం:",
        "ipbreason-dropdown": "*సాధారణ నిరోధ కారణాలు\n** తప్పు సమాచారాన్ని చొప్పించడం\n** పేజీల్లోని సమాచారాన్ని తీసెయ్యడం\n** బయటి సైట్లకు లంకెలతో స్పాము చెయ్యడం\n** పేజీల్లోకి చెత్తను ఎక్కించడం\n** బెదిరింపు ప్రవర్తన/వేధింపులు\n** అనేక ఖాతాలను సృష్టించి దుశ్చర్యకు పాల్పడడం\n** అనుచితమైన వాడుకరి పేరు\n** అదుపు తప్పిన బాటు",
        "tooltip-undo": "\"రద్దుచేయి\" ఈ మార్పుని రద్దుచేసి, దిద్దుబాటు ఫారాన్ని మునుజూపులో తెరుస్తుంది.\nసారాంశానికి కారణాన్ని చేర్చే వీలుకల్పిస్తుంది.",
        "tooltip-preferences-save": "అభిరుచులను భద్రపరచు",
        "tooltip-summary": "చిన్న సారాంశాన్ని ఇవ్వండి",
-       "notacceptable": "ఈ వికీ సర్వరు మీ క్లయంటు చదవగలిగే రీతిలో డేటాను ఇవ్వలేదు.",
        "anonymous": "{{SITENAME}} యొక్క అజ్ఞాత {{PLURAL:$1|వాడుకరి|వాడుకరులు}}",
        "siteuser": "{{SITENAME}} వాడుకరి $1",
        "anonuser": "{{SITENAME}} అజ్ఞాత వాడుకరి $1",
        "newimages-summary": "ఇటీవలే ఎగుమతైన ఫైళ్ళను ఈ ప్రత్యేక పేజీ చూపిస్తుంది.",
        "newimages-legend": "పడపోత",
        "newimages-label": "ఫైలుపేరు (లేదా దానిలోని భాగం):",
-       "showhidebots": "($1 బాట్లు)",
+       "newimages-showbots": "బాట్లు చేసిన అప్లోడ్లు చూపించు",
        "noimages": "చూసేందుకు ఏమీ లేదు.",
        "ilsubmit": "వెతుకు",
        "bydate": "తేదీ వారీగ",
        "autosumm-replace": "పేజీని '$1' తో మారుస్తున్నాం",
        "autoredircomment": "[[$1]]కు దారిమళ్ళించారు",
        "autosumm-new": "'$1' తో కొత్త పేజీని సృష్టించారు",
-       "livepreview-loading": "లోడవుతోంది...",
-       "livepreview-ready": "లోడవుతోంది… సిద్ధం!",
-       "livepreview-failed": "టైపు చేస్తుండగా ప్రీవ్యూ సృష్టించడం కుదరలేదు! మామూలు ప్రీవ్యూను ప్రయత్నించండి.",
-       "livepreview-error": "అనుసంధానం కుదరలేదు: $1 \"$2\". మామూలు ప్రీవ్యూ ప్రయత్నించి చూడండి.",
        "lag-warn-normal": "$1 {{PLURAL:$1|క్షణం|క్షణాల}} లోపు జరిగిన మార్పులు ఈ జాబితాలో కనిపించకపోవచ్చు.",
        "lag-warn-high": "అధిక వత్తిడి వలన డేటాబేసు సర్వరు వెనుకబడింది, $1 {{PLURAL:$1|క్షణం|క్షణాల}} కంటే కొత్తవైన మార్పులు ఈ జాబితాలో కనిపించకపోవచ్చు.",
-       "watchlistedit-numitems": "మీ వీక్షణ జాబితాలో చర్చాపేజీలు కాకుండా {{PLURAL:$1|1 శీర్షిక|$1 శీర్షికలు}} ఉన్నాయి.",
-       "watchlistedit-noitems": "మీ వీక్షణ జాబితాలో శీర్షికలేమీ లేవు.",
        "watchlistedit-normal-title": "వీక్షణ జాబితాను మార్చు",
        "watchlistedit-normal-legend": "వీక్షణ జాబితా నుండి శీర్షికలను తీసివెయ్యి",
        "watchlistedit-normal-explain": "మీ వీక్షణ జాబితాలోని శీర్షికలను ఈ క్రింద చూపించాం.\nఏదైనా శీర్షికను తీసివేసేందుకు, దాని పక్కనున్న పెట్టెను చెక్ చేసి, \"{{int:Watchlistedit-normal-submit}}\"ని నొక్కండి.\nమీరు [[Special:EditWatchlist/raw|ముడి జాబితాను కూడా మార్చవచ్చు]].",
        "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": "మీ వీక్షణ జాబితాను శుభ్రం చేశాం.",
+       "watchlisttools-clear": "వీక్షణజాబితాను శుభ్రం చేయి",
        "watchlisttools-view": "సంబంధిత మార్పులను చూడండి",
        "watchlisttools-edit": "వీక్షణ జాబితాను చూడండి లేదా మార్చండి",
        "watchlisttools-raw": "ముడి వీక్షణ జాబితాలో మార్పులు చెయ్యి",
        "compare-invalid-title": "మీరు ఇచ్చిన శీర్షిక చెల్లనిది.",
        "compare-title-not-exists": "మీరు పేర్కొన్న శీర్షిక లేనే లేదు.",
        "compare-revision-not-exists": "మీరు పేర్కొన్న కూర్పు లేనే లేదు.",
-       "dberr-header": "ఈ వికీ సమస్యాత్మకంగా ఉంది",
        "dberr-problems": "క్షమించండి! ఈ సైటు సాంకేతిక సమస్యలని ఎదుర్కొంటుంది.",
        "dberr-again": "కొన్ని నిమిషాలాగి మళ్ళీ ప్రయత్నించండి.",
        "dberr-info": "(డాటాబేసు సర్వరుని సంధానించలేకున్నాం: $1)",
        "htmlform-no": "కాదు",
        "htmlform-yes": "అవును",
        "htmlform-chosen-placeholder": "ఒక ఐచ్ఛికాన్ని ఎంచుకోండి",
+       "htmlform-cloner-create": "ఇంకా చేర్చు",
+       "htmlform-cloner-delete": "తొలగించు",
+       "htmlform-cloner-required": "కనీసం ఒక విలువు అయినా ఇవ్వాలి.",
        "sqlite-has-fts": "$1 పూర్తి-పాఠ్య అన్వేషణ తోడ్పాటుతో",
        "sqlite-no-fts": "$1 పూర్తి-పాఠ్య అన్వేషణ తోడ్పాటు లేకుండా",
        "logentry-delete-delete": "$1 $3 పేజీని {{GENDER:$2|తొలగించారు}}",
index 3f09e74..1d84b32 100644 (file)
@@ -9,14 +9,15 @@
                        "Kaganer",
                        "Soroush",
                        "Urhixidur",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
-       "tog-underline": "Ð\97еÑ\80пайвандҳо Ñ\85аÑ\82 ÐºÐ°Ñ\88ида Ñ\88аванд:",
-       "tog-hideminor": "Ð\9dиÑ\88он Ð½Ð°Ð´Ð¾Ð´Ð°Ð½Ð¸ Ñ\82аÒ\93йиÑ\80оÑ\82и Ò·Ñ\83зÑ\8aи Ð´Ð°Ñ\80 Ñ\84еҳÑ\80иÑ\81Ñ\82и Ñ\82аÒ\93йиÑ\80оÑ\82и Ð¾Ñ\85иÑ\80",
+       "tog-underline": "Ð\9fайвандҳо Ñ\85аÑ\82каÑ\88ида:",
+       "tog-hideminor": "Ð\9fÓ¯Ñ\88идани Ð²Ð¸Ñ\80оиÑ\88оÑ\82и Ò·Ñ\83зÑ\8aи Ð´Ð°Ñ\80 Ñ\82аÒ\93йиÑ\80оÑ\82и Ð¾Ñ\85иÑ\80ин",
        "tog-hidepatrolled": "Пинҳон кардани вироишҳои гаштхӯрда дар тағйироти охир",
        "tog-newpageshidepatrolled": "Пинҳони саҳифаҳои гаштхӯрда аз феҳристи саҳифаҳои нав",
-       "tog-extendwatchlist": "Густариши феҳристи пайгириҳо барои нишон додани ҳамаи тағйиротҳо, на танҳо аз ҳама охирин",
+       "tog-extendwatchlist": "Густариши феҳристи пайгириҳо барои нишон додани ҳамаи тағйирот, на танҳо аз ҳама охирин",
        "tog-usenewrc": "Гурӯҳбандии тағийрот бар пояи сафҳа дар тағийроти охир ва феҳристи пайгириҳо",
        "tog-numberheadings": "шуморагузори~и худкори инвонҳо",
        "tog-showtoolbar": "Намоиши навори абзори вироиш",
        "filedeleteerror": "Парванда \"$1\" ҳазф натавонист шуд.",
        "directorycreateerror": "Имкони эҷоди пӯшаи \"$1\" вуҷуд надорад.",
        "filenotfound": "Парвандаи \"$1\" ёфт нашуд.",
-       "fileexistserror": "Имкони навиштан рӯи парвандаи \"$1\" вуҷуд надорад: парванда аз қабл вуҷуд дорад",
        "unexpected": "Миқдори ғайри мунтазир: \"$1\"=\"$2\".",
        "formerror": "Хато: наметавон формро фиристод",
        "badarticleerror": "Наметавон ин амалро бар ин саҳифа анҷом дод.",
        "userlogin-helplink2": "Роҳнамои вуруд",
        "userlogin-loggedin": "Шумо дар ҳол чун {{GENDER:$1|$1}} вуруд шудаед.\nБо истифода аз форми зер чун корбари дигар вориди систем шавед.",
        "userlogin-createanother": "Эҷоди ҳисоби дигар",
-       "createacct-join": "Маълумоти худро дар зер ворид кунед.",
-       "createacct-another-join": "Маълумоти ҳисоби нави худро дар зер ворид кунед.",
        "createacct-emailrequired": "Нишонаи email",
        "createacct-emailoptional": "Нишони email (ихтиёрӣ)",
        "createacct-email-ph": "Нишони email худро ворид кунед",
        "savearticle": "Саҳифа захира шавад",
        "preview": "Пешнамоиш",
        "showpreview": "Пеш намоиш",
-       "showlivepreview": "Пешнамоиши зинда",
        "showdiff": "Намоиши тағйирот",
        "anoneditwarning": "'''Огоҳӣ:''' Шумо вуруд накардаед. Суроғаи IP Шумо дар вироишоти ин саҳифа сабт хоҳад шуд.",
        "anonpreviewwarning": "<em>Шумо вориди нашудаед. Захиракунӣ IP нишонаи шуморо дар таърихи вироиши ин саҳифа захира хоҳад кард.</em>",
        "edit-gone-missing": "Наметавон саҳифаро барӯз кард.\nБа назар мерасад, ки ҳазв шуда бошад.",
        "edit-conflict": "Бархурди вироиш.",
        "edit-no-change": "Вироиши шумо нодида гирифта шуд, зеро тағйире дар матн дода нашуда буд.",
-       "postedit-confirmation": "Вироиши шумо захира шуд.",
+       "postedit-confirmation-saved": "Вироиши шумо захира шуд.",
        "edit-already-exists": "Саҳифаи нав эҷод нашуд.\nҚаблан ин саҳифа вуҷуд дорад.",
        "defaultmessagetext": "Матни пайёми пешфарз",
        "content-model-wikitext": "викиматн",
        "search-nonefound": "Натиҷаи муносиб бо дархост пайдо нашуд.",
        "powersearch-legend": "Ҷустуҷӯи пешрафта",
        "powersearch-ns": "Ҷустуҷӯ дар фазоҳои ном:",
-       "powersearch-redir": "Феҳрист кардани масирҳо",
        "powersearch-togglelabel": "Баррасӣ:",
        "powersearch-toggleall": "Ҳама",
        "powersearch-togglenone": "Ҳеҷ",
        "prefs-advancedsearchoptions": "Ихтиёроти пешрафта",
        "prefs-advancedwatchlist": "Ихтиёроти пешрафта",
        "prefs-displayrc": "Ихтиёроти намоиш",
-       "prefs-displaysearchoptions": "Ихтиёроти намоиш",
        "prefs-displaywatchlist": "Ихтиёроти намоиш",
        "prefs-tokenwatchlist": "Рамз",
        "prefs-diffs": "Тафовут",
        "recentchanges-label-bot": "Ин вироишро робот анҷом додааст",
        "recentchanges-label-unpatrolled": "Ин вироиш ҳанӯз гаштзанӣ нашудааст",
        "rcnotefrom": "Дар зер тағйиротҳои охирин аз <b>$2</b> (то <b>$1</b> нишон дода шудааст).",
-       "rclistfrom": "Нишон додани тағйиротҳои нав сар карда аз $1",
+       "rclistfrom": "Нишон додани тағйиротҳои нав сар карда аз $3 $2",
        "rcshowhideminor": "$1 вироишҳои хурд",
        "rcshowhideminor-show": "Намоиш",
        "rcshowhideminor-hide": "Пинҳон",
        "emailuser-title-notarget": "Фиристодани пайём ба корбар",
        "emailpage": "Почтаи электронӣ ба корбар",
        "emailpagetext": "Агар ин корбар нишонаи почтаи электронии мӯътабаре дар тарҷиҳоти ворид карда бошад, форми зерин як пайғоме мефиристад.\nНишонаи почтаи электроние, ки шумо дар тарҷиҳоти корбариатон ворид кардаед, дар нишони фиристандаи нома \"From\" хоҳад омад, то ки гиранда тавонад ба шумо посух диҳад.",
-       "defemailsubject": "Ð\92икипедиа e-mail",
+       "defemailsubject": "Ð\9fайÑ\91ми {{SITENAME}} Ð°Ð· ÐºÐ¾Ñ\80баÑ\80 \"$1\"",
        "noemailtitle": "Нишонаи почтаи электронӣ мавҷуд нест",
-       "noemailtext": "Ин корбар, нишонаи мӯътабари почтаи электрониро мушаххас накарда аст, ё тасмим гирифааст, аз корбарони дигар почтаи электронӣ дарёфт накунад.",
+       "noemailtext": "Ин корбар нишонаи мӯътабари почтаи электрониро мушаххас накардааст.",
        "emailusername": "Номи корбарӣ:",
        "emailusernamesubmit": "Ирсол",
        "emailfrom": "Аз:",
        "nowatchlist": "Дар феҳристи пайгириҳои шумо ҳеҷ мавриде нест.",
        "watchlistanontext": "Лутфан барои мушоҳида ва вироиши феҳристи пайгириҳои худ аз $1 истифода кунед.",
        "watchnologin": "Вуруд нашуда",
-       "addedwatchtext": "Ð\98н Ñ\81аҳиÑ\84а \"[[:$1]]\" Ð²Ð° [[Special:Watchlist|Ñ\84еҳÑ\80иÑ\81Ñ\82и Ð½Ð°Ð·Ð°Ñ\80оÑ\82и]] Ð¨Ñ\83мо Ð¸Ð»Ð¾Ð²Ð° Ñ\88Ñ\83д.\nÐ\94игаÑ\80гÑ\83ниҳои Ð¾Ñ\8fндаи Ð¸Ð½ Ñ\81аҳиÑ\84а Ð²Ð° Ñ\81аҳиÑ\84и Ð±Ð°Ò³Ñ\81и Ð°Ð»Ð¾Ò\9bаманд Ð´Ð°Ñ\80 Ñ\80ӯиÑ\85аÑ\82и Ð¾Ð½Ò·Ð¾ Ñ\85оҳад Ñ\88Ñ\83д,\nва Ñ\81аҳиÑ\84а '''Ò\93аÑ\84Ñ\81''' Ð´Ð°Ñ\80 [[Special:RecentChanges|Ñ\80ӯиÑ\85аÑ\82и Ñ\82аÒ\93йиÑ\80оÑ\82и Ð¾Ñ\85иÑ\80ин]] Ð±Ð°Ñ\80ои Ð±Ð¾ Ð¾Ñ\81они Ð´Ð°Ñ\80Ñ\91Ñ\84Ñ\82 ÐºÐ°Ñ\80дан Ñ\85оҳад Ð±Ð° Ð½Ð°Ð·Ð°Ñ\80 Ñ\80аÑ\81ид.\n\nÐ\90гаÑ\80 Ñ\88Ñ\83мо Ð´ÐµÑ\80Ñ\82аÑ\80 Ð°Ð· Ñ\84еҳÑ\80иÑ\81Ñ\82и Ð½Ð°Ð·Ð°Ñ\80оÑ\82аÑ\82он Ð¸Ð½ Ñ\81аҳиÑ\84аÑ\80о Ò³Ð°Ð·Ð² ÐºÐ°Ñ\80дан Ñ\85оҳед, Ð´Ð°Ñ\80 Ð¼ÐµÐ½Ñ\8e \"Ð\9dазаÑ\80 Ð½Ð°ÐºÐ°Ñ\80дан\"-Ñ\80о Ð¿Ð°Ñ\85Ñ\88 ÐºÑ\83нед.",
+       "addedwatchtext": "Ð\98н Ñ\81аҳиÑ\84а \"[[:$1]]\" Ð±Ð° [[Special:Watchlist|Ñ\84еҳÑ\80иÑ\81Ñ\82и Ð½Ð°Ð·Ð°Ñ\80оÑ\82и]] Ñ\88Ñ\83мо Ð¸Ð»Ð¾Ð²Ð° Ñ\88Ñ\83д.\nÐ\94игаÑ\80гÑ\83ниҳои Ð¾Ñ\8fндаи Ð¸Ð½ Ñ\81аҳиÑ\84а Ð²Ð° Ñ\81аҳиÑ\84аи Ð±Ð°Ò³Ñ\81и Ð°Ð»Ð¾Ò\9bаманд Ð´Ð°Ñ\80 Ñ\80ӯиÑ\85аÑ\82и Ð¾Ð½Ò·Ð¾ Ñ\85оҳад Ñ\88Ñ\83д.",
        "removedwatchtext": "Саҳифаи \"[[:$1]]\" аз [[Special:Watchlist|феҳристи пайгириҳои шумо]] бардошта шуд.",
        "watch": "Назар кардан",
        "watchthispage": "Пайгирии ин саҳифа",
        "notanarticle": "Мақола нест",
        "notvisiblerev": "Нусха ҳазф шуд",
        "watchlist-details": "{{PLURAL:$1|$1 саҳифа|$1 саҳифаҳо}} дар феҳристи пайгириҳои шумо, бидуни ҳисоби саҳифаҳои баҳс.",
-       "wlheader-enotif": "Иттилоорасонии тариқи почтаи электронӣ (E-mail) имконпазир аст.",
+       "wlheader-enotif": "Иттилоорасонии тариқи почтаи электронӣ (E-mail) фаъол шудааст.",
        "wlheader-showupdated": "Саҳифаҳое, ки пас аз охирин сар заданатон ба онҳо тағйир кардаанд '''пурранг''' нишон дода шудаанд",
-       "watchmethod-recent": "баррасии вироишҳои охир барои саҳифаҳои пайгиришуда",
-       "watchmethod-list": "баррасии саҳифаҳои пайгиришуда барои вироишҳои охир",
-       "watchlistcontains": "Феҳристи пайгириҳои шумо $1 {{PLURAL:$1|саҳифаро|саҳифаҳоро}} дар бар мегирад.",
-       "iteminvalidname": "Мушкилӣ бо мавриди '$1', номи номӯътабар аст...",
        "wlshowlast": "Намоиши охирин $1 соат $2 рӯзҳо $3",
        "watchlist-options": "Ихтиёроти феҳристи пайгириҳо",
        "watching": "Пайгири...",
        "enotif_lastvisited": "Барои дидани ҳамаи тағйирот аз охирин боре, ки сар задаед $1ро бубинед.",
        "enotif_lastdiff": "Барои намоиши ин тағйир $1ро бубинед.",
        "enotif_anon_editor": "корбари ношинос $1",
-       "enotif_body": "Мӯҳтарам $WATCHINGUSERNAME,\n\n\nСаҳифаи $PAGETITLE дар {{SITENAME}} аз тарафаи $PAGEEDITOR дар $PAGEEDITDATE  $CHANGEDORCREATED шуд, барои нусхаи кунунӣ, нигаред ба $PAGETITLE_URL.\n\n$NEWPAGE\n\nТавзеҳи вироишгар: $PAGESUMMARY $PAGEMINOREDIT\n\nТамос бо вироишгар:\nпочати электронӣ: $PAGEEDITOR_EMAIL\nвики: $PAGEEDITOR_WIKI\n\nТо ҳангоме, ки ба саҳифа сар назадаед, дар сурати рух додани эҳтимолӣ, тағйироти бештар эълоне барои шумо фиристода нахоҳад шуд. Шумо ҳамчунин метавонед дар саҳифаи пайгириҳои худ парчамҳои марбут огоҳирасонии тариқи почтаи электониро сифр кунед.\n\n             Хоксори шумо {{SITENAME}} сомонаи огоҳирасонӣ\n\n--\nБарои танзимоти феҳристи пайгириҳоятон биравед ба\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nПешниҳодот ва кӯмаки бештар:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Мӯҳтарам $WATCHINGUSERNAME,\n\n\nСаҳифаи $PAGETITLE дар {{SITENAME}} аз тарафаи $PAGEEDITOR дар $PAGEEDITDATE  $CHANGEDORCREATED шуд, барои нусхаи кунунӣ, нигаред ба $PAGETITLE_URL.\n\n$NEWPAGE\n\nТавзеҳи вироишгар: $PAGESUMMARY $PAGEMINOREDIT\n\nТамос бо вироишгар:\nпочати электронӣ: $PAGEEDITOR_EMAIL\nвики: $PAGEEDITOR_WIKI\n\nТо ҳангоме, ки ба саҳифа сар назадаед, дар сурати рух додани эҳтимолӣ, тағйироти бештар эълоне барои шумо фиристода нахоҳад шуд. Шумо ҳамчунин метавонед дар саҳифаи пайгириҳои худ парчамҳои марбут огоҳирасонии тариқи почтаи электониро сифр кунед.\n\n             Хоксори шумо {{SITENAME}} сомонаи огоҳирасонӣ\n\n--\nБарои танзимоти феҳристи пайгириҳоятон биравед ба\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nПешниҳодот ва кӯмаки бештар:\n$HELPPAGE",
        "created": "эҷод шуд",
        "changed": "тағйирёфта",
        "deletepage": "Ҳазфи саҳифа",
        "protect-default": "Иҷоза ба ҳамаи корбарон",
        "protect-fallback": "Сатҳи дастрасӣ \"$1\" лозим аст",
        "protect-level-autoconfirmed": "Бастани корбарони ҷадид ва сабтиномнашуда",
-       "protect-level-sysop": "Танҳо Ð±Ð°Ñ\80ои мудирон",
+       "protect-level-sysop": "Ð\98ҷозаÑ\82и Ñ\82анҳо мудирон",
        "protect-summary-cascade": "обшорӣ",
        "protect-expiring": "замони саромадан $1 (UTC)",
        "protect-expiry-indefinite": "номуайян",
        "blockip": "Бастани корбар",
        "blockip-legend": "Бастани корбар",
        "blockiptext": "Барои бастани дастрасии вироиши нишонаи IP ё номи корбарӣ мушаххас аз форми зерин истифода кунед.\nИн кор фақат бояд барои ҷилавгирӣ аз харобкори ва мувофиқи бо [[{{MediaWiki:Policy-url}}|сиёсати қатъи дастрасӣ]] анҷом шавад.\nДалели мушаххас барои ин корро дар зер зикр кунед (барои мисол, зикри саҳифаҳое, ки харобкорӣ шудаанд).",
-       "ipadressorusername": "IP нишона ё номи корбар:",
+       "ipaddressorusername": "IP нишона ё номи корбар:",
        "ipbexpiry": "Хотима:",
        "ipbreason": "Сабаб:",
        "ipbreason-dropdown": "*Сабабҳои умумии бастан\n** Ворид кардани иттилооти нодуруст\n** Пок кардани иттилооти муфид аз саҳифаҳо\n** Истифода бурдани пайвандҳои спам ба сомонаҳои беруна\n** Ворид кардани навиштаҳои беманънӣ ба саҳифаҳо\n** Рафтори баъд/масхаракунии дигар корбарон\n** Сӯиистифода аз чанд ҳисоби корбарӣ\n** Номи корбарии номуносиб",
        "blocklist-reason": "Сабаб",
        "ipblocklist-submit": "Ҷустуҷӯ",
        "infiniteblock": "бе поён",
-       "expiringblock": "$1 $2 ба поён мерасад",
+       "expiringblock": "дар $1 соати $2 ба поён мерасад",
        "anononlyblock": "фақат корбарони гумном",
        "noautoblockblock": "бастани худкор ғайрифаъол аст",
        "createaccountblock": "имкони эҷоди ҳисоб баста шудааст",
        "tooltip-undo": "\"Ботил\" ин вироишро ботил мекунад ва форми вироишро дар ҳолати пешнамоиш боз мекунад.\nИн имкони илова кардани як сабаберо дар хулоса медиҳад.",
        "tooltip-preferences-save": "Захираи тарҷиҳот",
        "tooltip-summary": "Хулосаи кӯтоҳ ворид кунед",
-       "notacceptable": "Коргузори ин вики аз ирсоли дода ба шакле ки барномаи шумо битавонад намоиш диҳад, пешкаш карда наметавонад.",
        "anonymous": "{{PLURAL:$1|корбари|корбарони}} гумномӣ {{SITENAME}}",
        "siteuser": "Википедиа user $1",
        "lastmodifiedatby": "Ин саҳифа охирин маротиба дар $2, $1 аз тарафи $3 тағйир дода шудааст.",
        "imagelisttext": "Дар зер феҳристи '''$1''' {{PLURAL:$1|парвандаи|парвандаҳои}} ба тартиб оварда шуда, омадааст $2.",
        "newimages-summary": "Ин саҳифаи вижа охирин парвандаҳои боршударо намоиш медиҳад.",
        "newimages-legend": "Филтр",
-       "showhidebots": "($1 ботҳо)",
        "noimages": "Чизе барои дидан нест.",
        "ilsubmit": "Ҷустуҷӯи",
        "bydate": "аз рӯи сана",
        "autosumm-replace": "Ивазкунии саҳифа бо '$1'",
        "autoredircomment": "Тағйири масир ба [[$1]]",
        "autosumm-new": "Саҳифаи нав бо \"$1\" эҷод шуд",
-       "livepreview-loading": "Дар ҳоли бор шудан…",
-       "livepreview-ready": "Бор шудан… Омода!",
-       "livepreview-failed": "Пешнамоиши зинда ба мушкилӣ бархӯрд! Лутфан аз пешнамоиши оддӣ истифода кунед.",
-       "livepreview-error": "Иртибот ба мушкилӣ бархӯрд: $1 \"$2\". Аз пешнамоиши оддӣ истифода кунед.",
        "lag-warn-normal": "Мумкин аст тағйироти тозатар аз $1 сония дар ин феҳрист нишон дода нашавад.",
        "lag-warn-high": "Мумкин аст, ба хотири пасафтодагии зиёд коргузори додаҳо, тағйироти тоза аз $1 сония дар ин феҳрист нишон нашуда бошанд.",
-       "watchlistedit-numitems": "Феҳристи пайгириҳои шумо шомили {{PLURAL:$1|1 саҳифа|$1 саҳифаҳо}}, ба ғайр аз саҳифаҳои баҳс аст.",
-       "watchlistedit-noitems": "Феҳристи пайгириҳои шумо холӣ аст.",
        "watchlistedit-normal-title": "Вироиши феҳристи пайгириҳо",
        "watchlistedit-normal-legend": "Ҳазфи унвонҳо аз феҳристи пайгириҳо",
        "watchlistedit-normal-explain": "Унвонҳои мавҷуд дар феҳристи пайгириҳои шумо дар поён намоиш дода шудаанд.\nБарои ҳазфи як унвон, ҷаъбаи кӯчаки канори онро тик бизанид.\nШумо метавонед [[Special:EditWatchlist/raw|феҳристи хоми пайгириҳоро вироиш кунед]].",
index 63b720b..2d38b3c 100644 (file)
@@ -2,7 +2,8 @@
        "@metadata": {
                "authors": [
                        "Kaganer",
-                       "Liangent"
+                       "Liangent",
+                       "아라"
                ]
        },
        "tog-underline": "Zerpajvandho xat kaşida şavand:",
@@ -15,7 +16,6 @@
        "tog-showtoolbar": "Namoişi navori abzori viroiş (JavaScript)",
        "tog-editondblclick": "Viroiş namudani sahifaho hangomi du karat paxş namudani tugmai muşak (JavaScript)",
        "tog-editsectiononrightclick": "Ba kor andoxtani viroişi sarlavhahoi qismatho bo kliki rost (ÇavaSkript)",
-       "tog-rememberpassword": "Vurudi manro dar in mururgar dar xotir nigoh dor (haddi aksar to $1 {{PLURAL:$1|rūz|rūz}})",
        "tog-watchcreations": "Doxil namudani sahifahoe, ki man soxtaam ba fehristi nazaroti man",
        "tog-watchdefault": "Sahifahoi eçodkardaamro ba fehristi pajgiriam ilova kuned",
        "tog-watchmoves": "Sahifahoi kūconidaamro ba fehristi pajgirihojam ilova kuned",
        "filedeleteerror": "Parvanda \"$1\" hazf natavonist şud.",
        "directorycreateerror": "Imkoni eçodi pūşai \"$1\" vuçud nadorad.",
        "filenotfound": "Parvandai \"$1\" joft naşud.",
-       "fileexistserror": "Imkoni naviştan rūi parvandai \"$1\" vuçud nadorad: parvanda az qabl vuçud dorad",
        "unexpected": "Miqdori ƣajri muntazir: \"$1\"=\"$2\".",
        "formerror": "Xato: nametavon formro firistod",
        "badarticleerror": "Nametavon in amalro bar in sahifa ançom dod.",
        "savearticle": "Sahifa zaxira şavad",
        "preview": "Peşnamoiş",
        "showpreview": "Peş namoiş",
-       "showlivepreview": "Peşnamoişi zinda",
        "showdiff": "Namoişi taƣjirot",
        "anoneditwarning": "'''Ogohī:''' Şumo vurud nakardaed. Suroƣai IP Şumo dar viroişoti in sahifa sabt xohad şud.",
        "missingsummary": "'''Jodovarī:''' Şumo xulosai viroiş nanaviştaed.\nAgar dubora tugmai \"Zaxira\"-ro klik kuned, viroişaton biduni xulosa zaxira xohad şud.",
        "showingresultsnum": "Namoişi {{PLURAL:$3|'''1''' natiça|'''$3''' natoiç}} oƣoz az #'''$2'''.",
        "powersearch-legend": "Çustuçūi peşrafta",
        "powersearch-ns": "Çustuçū dar fazohoi nom:",
-       "powersearch-redir": "Fehrist kardani masirho",
        "search-external": "Çustuçūi xoriçī",
        "searchdisabled": "Çustuçu dar {{SITENAME}} ƣajrifa'ol karda şudaast. Şumo metavoned tariqi Google dar hol çustuçū kuned. Tavaççūh kuned, ki natoiçi çustuçū {{SITENAME}} metavonad barūz naboşad.",
        "preferences": "Tarçihot",
        "recentchanges-summary": "Nazorati taƣjirothoi navtarin dar Vikipedia dar hamin sahifa ast.",
        "recentchanges-feed-description": "Radjobiji oxirin taƣjiroti in viki dar in xurd.",
        "rcnotefrom": "Dar zer taƣjirothoi oxirin az <b>$2</b> (to <b>$1</b> nişon doda şudaast).",
-       "rclistfrom": "Nişon dodani taƣjirothoi nav sar karda az $1",
+       "rclistfrom": "Nişon dodani taƣjirothoi nav sar karda az $3 $2",
        "rcshowhideminor": "$1 viroişhoi xurd",
        "rcshowhidebots": "$1 botho",
        "rcshowhideliu": "$1 korbaroni vurudşuda",
        "watchlist-details": "{{PLURAL:$1|$1 sahifai|$1 sahifahoi}} dar fehristi pajgirihoi şumo, biduni hisobi sahifahoi bahs.",
        "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",
-       "watchmethod-recent": "barrasiji viroişhoi oxir baroi sahifahoi pajgirişuda",
-       "watchmethod-list": "barrasiji sahifahoi pajgirişuda baroi viroişhoi oxir",
-       "watchlistcontains": "Fehristi pajgirihoi şumo $1 {{PLURAL:$1|sahifaro|sahifahoro}} dar bar megirad.",
-       "iteminvalidname": "Muşkilī bo mavridi '$1', nomi nomū'tabar ast...",
        "wlshowlast": "Namoişi oxirin $1 soat $2 rūzho $3",
        "watchlist-options": "Ixtijoroti fehristi pajgiriho",
        "watching": "Pajgiri...",
        "tooltip-upload": "Şurū' ba borguzorī",
        "tooltip-rollback": "\"Vogard\" viroiş(ho)ro ba in sahifai oxirin hissaguzor bo jak klik megardonad",
        "tooltip-undo": "\"Botil\" in viroişro botil mekunad va formi viroişro dar holati peşnamoiş boz mekunad.\nIn imkoni ilova kardani jak sababero dar xulosa medihad.",
-       "notacceptable": "Korguzori in viki az irsoli doda ba şakle ki barnomai şumo bitavonad namoiş dihad, peşkaş karda nametavonad.",
        "anonymous": "{{PLURAL:$1|korbari|korbaroni}} gumnomī {{SITENAME}}",
        "siteuser": "Vikipedia user $1",
        "lastmodifiedatby": "In sahifa oxirin marotiba dar $2, $1 az tarafi $3 taƣjir doda şudaast.",
        "autosumm-blank": "Sahifaro xolī kard",
        "autosumm-replace": "Ivazkuniji sahifa bo '$1'",
        "autoredircomment": "Taƣjiri masir ba [[$1]]",
-       "livepreview-loading": "Dar holi bor şudan…",
-       "livepreview-ready": "Bor şudan… Omoda!",
-       "livepreview-failed": "Peşnamoişi zinda ba muşkilī barxūrd! Lutfan az peşnamoişi oddī istifoda kuned.",
-       "livepreview-error": "Irtibot ba muşkilī barxūrd: $1 \"$2\". Az peşnamoişi oddī istifoda kuned.",
-       "watchlistedit-numitems": "Fehristi pajgirihoi şumo şomili {{PLURAL:$1|1 sahifa|$1 sahifaho}}, ba ƣajr az sahifahoi bahs ast.",
-       "watchlistedit-noitems": "Fehristi pajgirihoi şumo xolī ast.",
        "watchlistedit-normal-title": "Viroişi fehristi pajgiriho",
        "watchlistedit-normal-legend": "Hazfi unvonho az fehristi pajgiriho",
        "watchlistedit-normal-explain": "Unvonhoi mavçud dar fehristi pajgirihoi şumo dar pojon namoiş doda şudaand.\nBaroi hazfi jak unvon, ça'bai kūcaki kanori onro tik bizanid.\nŞumo metavoned [[Special:EditWatchlist/raw|fehristi xomi pajgirihoro viroiş kuned]].",
index a89842f..98c4e37 100644 (file)
@@ -19,7 +19,8 @@
                        "Woraponboonkerd",
                        "לערי ריינהארט",
                        "จักรกฤช วงศ์สระหลวง (Jakkrit Vongsraluang) / PaePae",
-                       "วรากร อึ้งวิเชียร (Varakorn Ungvichian)"
+                       "วรากร อึ้งวิเชียร (Varakorn Ungvichian)",
+                       "아라"
                ]
        },
        "tog-underline": "การขีดเส้นใต้ลิงก์:",
@@ -37,7 +38,7 @@
        "tog-watchmoves": "เพิ่มและไฟล์ที่ฉันเปลี่ยนชื่อเข้ารายการเฝ้าดู",
        "tog-watchdeletion": "เพิ่มหน้าและไฟล์ที่ฉันลบเข้ารายการเฝ้าดู",
        "tog-minordefault": "กำหนดให้การแก้ไขทุกครั้งเป็นการแก้ไขเล็กน้อยโดยปริยาย",
-       "tog-previewontop": "à¹\81สà¸\94à¸\87à¸\95ัวอยà¹\88าà¸\87à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\9aนกล่องแก้ไข",
+       "tog-previewontop": "à¹\83หà¹\89à¸\95ัวอยà¹\88าà¸\87à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¹\81สà¸\94à¸\87à¸\81à¹\88อนกล่องแก้ไข",
        "tog-previewonfirst": "แสดงตัวอย่างการแก้ไขสำหรับการแก้ไขครั้งแรก",
        "tog-enotifwatchlistpages": "อีเมลหาเมื่อหน้าหรือไฟล์ในรายการเฝ้าดูมีการเปลี่ยนแปลง",
        "tog-enotifusertalkpages": "อีเมลหาเมื่อหน้าคุยกับผู้ใช้ของฉันมีการเปลี่ยนแปลง",
        "vector-action-addsection": "เพิ่มหัวข้อใหม่",
        "vector-action-delete": "ลบ",
        "vector-action-move": "เปลี่ยนชื่อ",
-       "vector-action-protect": "à¸\9bà¹\89อà¸\87à¸\81ัà¸\99",
+       "vector-action-protect": "ลà¹\87อà¸\81",
        "vector-action-undelete": "กู้คืน",
-       "vector-action-unprotect": "à¹\80à¸\9bลีà¹\88ยà¸\99à¸\84à¹\88าà¸\81ารà¸\9bà¹\89อà¸\87à¸\81ัà¸\99",
+       "vector-action-unprotect": "à¹\80à¸\9bลีà¹\88ยà¸\99à¸\81ารลà¹\87อà¸\81",
        "vector-view-create": "สร้าง",
        "vector-view-edit": "แก้ไข",
        "vector-view-history": "ดูประวัติ",
        "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": "เกิดข้อผิดพลาดไม่ทราบสาเหตุ",
        "portal-url": "Project:ศูนย์รวมชุมชน",
        "privacy": "นโยบายสิทธิส่วนบุคคล",
        "privacypage": "Project:นโยบายสิทธิส่วนบุคคล",
-       "badaccess": "มีข้อผิดพลาดในการใช้สิทธิ",
+       "badaccess": "มีข้อผิดพลาดในการใช้สิทธิ",
        "badaccess-group0": "คุณไม่ได้รับอนุญาตให้ดำเนินการตามที่ขอ",
        "badaccess-groups": "ปฏิบัติการที่คุณขอนี้สงวนไว้เฉพาะผู้ใช้ใน{{PLURAL:$2|กลุ่ม|กลุ่ม}}: $1",
        "versionrequired": "ต้องการมีเดียวิกิรุ่น $1",
        "readonly_lag": "ฐานข้อมูลถูกล็อกอัตโนมัติขณะที่เซิร์ฟเวอร์ฐานข้อมูลรองกำลังปรับปรุงตามฐานข้อมูลหลัก",
        "internalerror": "เกิดความผิดพลาดภายใน",
        "internalerror_info": "เกิดความผิดพลาดภายใน: $1",
-       "fileappenderrorread": "ไม่สามารถอ่าน \"$1\" ระหว่างการผนวกไฟล์",
-       "fileappenderror": "ไม่สามารถต่อท้าย \"$2\" ด้วย \"$1\"",
        "filecopyerror": "ไม่สามารถคัดลอกไฟล์ \"$1\" ไปที่ \"$2\"",
        "filerenameerror": "ไม่สามารถเปลี่ยนชื่อไฟล์ \"$1\" เป็น \"$2\"",
        "filedeleteerror": "ไม่สามารถลบไฟล์ \"$1\"",
        "directorycreateerror": "ไม่สามารถสร้างไดเรกทอรี \"$1\"",
        "filenotfound": "ไม่พบไฟล์ \"$1\"",
-       "fileexistserror": "ไม่สามารถเขียนไฟล์ \"$1\" ได้ เนื่องจากมีไฟล์อยู่แล้ว",
        "unexpected": "ผลที่ไม่คาดคิด: \"$1\"=\"$2\"",
        "formerror": "ผิดพลาด: ไม่สามารถส่งแบบได้",
        "badarticleerror": "การกระทำนี้ไม่สามารถทำในหน้านี้ได้",
        "viewsource-title": "ดูโค้ดสำหรับ $1",
        "actionthrottled": "การกระทำนี้ถูกระงับไว้ชั่วคราว",
        "actionthrottledtext": "เพื่อเป็นมาตรการป้องกันสแปม คุณจึงถูกจำกัดมิให้กระทำสิ่งนี้ไม่ให้ติดต่อกันหลายครั้งเกินไปในช่วงระยะเวลาสั้น ๆ ซึ่งขณะนี้คุณได้กระทำเกินขีดจำกัดแล้ว กรุณารอสักครู่แล้วลองอีกครั้ง",
-       "protectedpagetext": "หน้านี้ถูกป้องกันมิให้แก้ไขหรือปฏิบัติการอื่น",
+       "protectedpagetext": "หà¸\99à¹\89าà¸\99ีà¹\89à¸\96ูà¸\81ลà¹\87อà¸\81à¹\80à¸\9eืà¹\88อà¸\9bà¹\89อà¸\87à¸\81ัà¸\99มิà¹\83หà¹\89à¹\81à¸\81à¹\89à¹\84à¸\82หรือà¸\9bà¸\8fิà¸\9aัà¸\95ิà¸\81ารอืà¹\88à¸\99",
        "viewsourcetext": "คุณสามารถดูและคัดลอกโค้ดของหน้านี้:",
        "viewyourtext": "คุณสามารถดูและคัดลอกต้นฉบับ'''การแก้ไขของคุณ'''ในหน้านี้ได้",
        "protectedinterface": "หน้านี้เป็นข้อความอินเตอร์เฟซสำหรับซอฟต์แวร์บนวิกินี้ และถูกป้องกันเพื่อมิให้มีการกระทำผิด\nในการเพิ่มหรือเปลี่ยนแปลงการแปลสำหรับทุกวิกิ โปรดใช้ [//translatewiki.net/ translatewiki.net] โครงการแปลมีเดียวิกิเป็นภาษาถิ่น",
        "editinginterface": "'''คำเตือน:''' คุณกำลังแก้ไขหน้าที่ใช้เพื่อให้ข้อความอินเตอร์เฟซแก่ซอฟต์แวร์\nการเปลี่ยนแปลงหน้านี้จะกระทบต่อลักษณะของอินเตอร์เฟซผู้ใช้แก่ผู้ใช้อื่นบนวิกินี้\nในการเพิ่มหรือเปลี่ยนแปลงคำแปลสำหรับทุกวิกิ โปรดใช้ [//translatewiki.net/wiki/Main_Page?setlang=th translatewiki.net] โครงการแปลมีเดียวิกิเป็นภาษาถิ่น",
        "cascadeprotected": "หน้านี้ได้รับการป้องกันจากการแก้ไข เนื่องจากหน้านี้ถูกใช้เป็นส่วนหนึ่งใน{{PLURAL:$1|หน้า $2 ซึ่งได้รับการป้องกันแบบ \"ทบทุกลำดับขั้น\"|หน้าซึ่งได้รับการป้องกันแบบ \"ทบทุกลำดับขั้น\" ดังต่อไปนี้: $2}}",
-       "namespaceprotected": "คุณไม่มีสิทธิแก้ไขหน้าในเนมสเปซ '''$1'''",
+       "namespaceprotected": "คุณไม่มีสิทธิแก้ไขหน้าในเนมสเปซ <strong>$1</strong>",
        "customcssprotected": "คุณไม่มีสิทธิแก้ไขหน้าสไตล์ CSS นี้ เนื่องจากหน้านี้มีการตั้งค่าส่วนบุคคลของผู้ใช้อื่น",
        "customjsprotected": "คุณไม่มีสิทธิแก้ไขหน้าจาวาสคริปต์นี้ เนื่องจากหน้านี้มีการตั้งค่าส่วนบุคคลของผู้ใช้อื่น",
        "mycustomcssprotected": "คุณไม่ได้รับอนุญาตให้แก้ไขหน้าซีเอสเอสนี้",
        "myprivateinfoprotected": "คุณไม่ได้รับอนุญาตให้แก้ไขข้อมูลส่วนตัวของคุณ",
        "mypreferencesprotected": "คุณไม่ได้รับอนุญาตให้แก้ไขการตั้งค่าของคุณ",
        "ns-specialprotected": "หน้าพิเศษไม่สามารถแก้ไขได้",
-       "titleprotected": "ชื่อเรื่องนี้ถูกป้องกันมิให้สร้างโดย [[User:$1|$1]] \nเหตุผลที่ให้ไว้คือ ''$2''",
+       "titleprotected": "ชื่อเรื่องนี้ถูกป้องกันมิให้สร้างโดย [[User:$1|$1]] \nเหตุผลที่ให้ไว้คือ ''<em>$2</em>''",
        "filereadonlyerror": "ไม่สามารถแก้ไขไฟล์ \"$1\" เพราะที่เก็บไฟล์ \"$2\" อยู่ในภาวะอ่านอย่างเดียว\nผู้ดูแลระบบที่ล็อกให้คำอธิบายว่า: \"$3\"",
        "invalidtitle-knownnamespace": "ชื่อเรื่องที่มีเนมสเปซ \"$2\" กับข้อความ \"$3\" ไม่ถูกต้อง",
        "invalidtitle-unknownnamespace": "ชื่อเรื่องที่ไม่ทราบเนมสเปซหมายเลข $1 กับข้อความ \"$2\" ไม่ถูกต้อง",
        "nologin": "ไม่มีบัญชีหรือ $1",
        "nologinlink": "สร้างบัญชี",
        "createaccount": "สร้างบัญชี",
-       "gotaccount": "มีบัญชีแล้วใช่ไหม '''$1'''",
+       "gotaccount": "มีบัญชีแล้วใช่ไหม $1",
        "gotaccountlink": "ล็อกอิน",
        "userlogin-resetlink": "ลืมรายละเอียดล็อกอินของคุณหรือ",
        "userlogin-resetpassword-link": "ลืมรหัสผ่านหรือ",
        "userlogin-helplink2": "วิธีใช้เรื่องการล็อกอิน",
        "userlogin-loggedin": "คุณล็อกอินในชื่อ {{GENDER:$1|$1}} แล้ว\nใช้แบบด้านล่างเพื่อล็อกอินเป็นอีกผู้ใช้หนึ่ง",
        "userlogin-createanother": "สร้างอีกบัญชี",
-       "createacct-join": "กรอกสารสนเทศของคุณด้านล่าง",
-       "createacct-another-join": "กรอกข้อมูลของบัญชีใหม่ด้านล่าง",
        "createacct-emailrequired": "ที่อยู่อีเมล",
        "createacct-emailoptional": "ที่อยู่อีเมล (เลือกไม่ใส่ได้)",
        "createacct-email-ph": "กรอกที่อยู่อีเมล",
        "noemail": "ไม่มีที่อยู่อีเมลบันทึกไว้สำหรับผู้ใช้ \"$1\"",
        "noemailcreate": "คุณจำต้องใส่ที่อยู่อีเมลให้ถูกต้อง",
        "passwordsent": "รหัสผ่านใหม่ถูกส่งไปยังที่อยู่อีเมลที่ลงทะเบียนไว้ของ \"$1\"\nกรุณาล็อกอินอีกครั้งหลังได้รับอีเมล",
-       "blocked-mailpassword": "à¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88à¹\84อà¸\9eีà¸\82อà¸\87à¸\84ุà¸\93à¸\96ูà¸\81à¸\9aลà¹\87อà¸\81มิà¹\83หà¹\89à¹\81à¸\81à¹\89à¹\84à¸\82 à¸\89ะà¸\99ัà¹\89à¸\99 à¸\88ึà¸\87à¹\84มà¹\88à¹\84à¸\94à¹\89รัà¸\9aอà¸\99ุà¸\8dาà¸\95à¹\83หà¹\89à¹\83à¸\8aà¹\89à¸\9fัà¸\87à¸\81à¹\8cà¸\8aัà¸\99à¸\82อà¸\81ูà¹\89รหัสà¸\9cà¹\88าà¸\99à¹\80à¸\9eืà¹\88อà¸\9bà¹\89อà¸\87à¸\81ัà¸\99à¸\81ารà¸\81ระà¸\97ำผิด",
+       "blocked-mailpassword": "à¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88à¹\84อà¸\9eีà¸\82อà¸\87à¸\84ุà¸\93à¸\96ูà¸\81à¸\9aลà¹\87อà¸\81มิà¹\83หà¹\89à¹\81à¸\81à¹\89à¹\84à¸\82 à¸\97ำà¹\83หà¹\89à¹\84มà¹\88สามารà¸\96à¸\97ำà¹\80รืà¹\88อà¸\87à¸\82อรหัสà¸\9cà¹\88าà¸\99à¹\83หมà¹\88à¹\84à¸\94à¹\89 à¹\80à¸\9eืà¹\88อà¸\9bà¹\89อà¸\87à¸\81ัà¸\99à¸\81ารà¹\83à¸\8aà¹\89à¹\83à¸\99à¸\97าà¸\87à¸\97ีà¹\88ผิด",
        "eauthentsent": "อีเมลยืนยันได้ถูกส่งไปที่อยู่อีเมลที่เสนอ ก่อนที่อีเมลจะถูกส่งไปที่ชื่อบัญชีนั้น คุณต้องปฏิบัติตามคำแนะนำในอีเมลเพื่อยืนยันว่าบัญชีนั้นเป็นของคุณจริง ๆ",
        "throttled-mailpassword": "อีเมลตั้งรหัสผ่านใหม่ถูกส่งไปแล้วใน $1 ชั่วโมงที่ผ่านมา \nอีเมลตั้งรหัสผ่านใหม่จะส่งไปหนึ่งครั้งต่อ $1 ชั่วโมงเท่านั้น เพื่อป้องกันการกระทำที่ไม่ถูกต้อง",
        "mailerror": "ข้อผิดพลาดในการส่งเมล: $1",
        "savearticle": "บันทึก",
        "preview": "ตัวอย่าง",
        "showpreview": "ดูตัวอย่าง",
-       "showlivepreview": "แสดงตัวอย่างทันที",
        "showdiff": "แสดงความเปลี่ยนแปลง",
        "anoneditwarning": "'''คำเตือน:''' คุณมิได้ล็อกอิน เลขที่อยู่ไอพีของคุณจะถูกบันทึกไว้ในประวัติการแก้ไขของหน้านี้",
        "anonpreviewwarning": "'''คุณมิได้ล็อกอิน การบันทึกจะเก็บเลขที่อยู่ไอพีของคุณในประวัติการแก้ไขของหน้านี้'''",
        "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โปรดแสดงรายละเอียดข้างต้นทั้งหมดนี้ในการอภิปรายเกี่ยวกับการบล็อกของคุณด้วย",
-       "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ยระà¸\9aุà¹\80หà¸\95ุà¸\9cลวà¹\88า\n\n:''$2''\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อหารือà¸\81ารà¸\9aลà¹\87อà¸\81à¸\99ีà¹\89 \nà¸\84ุà¸\93à¹\84มà¹\88สามารà¸\96à¹\83à¸\8aà¹\89à¸\84ุà¸\93ลัà¸\81ษà¸\93ะ 'สà¹\88à¸\87อีà¹\80มลหาà¸\9cูà¹\89à¹\83à¸\8aà¹\89รายà¸\99ีà¹\89à¹\84à¸\94à¹\89' à¸\88à¸\99à¸\81วà¹\88าà¸\88ะระà¸\9aุà¸\97ีà¹\88อยูà¹\88อีà¹\80มลà¸\97ีà¹\88à¸\96ูà¸\81à¸\95à¹\89อà¸\87à¹\83à¸\99[[Special:Preferences|à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าà¸\9aัà¸\8dà¸\8aี]]à¸\82อà¸\87à¸\84ุà¸\93 à¹\81ละà¸\84ุà¸\93มิà¹\84à¸\94à¹\89à¸\96ูà¸\81à¸\9aลà¹\87อà¸\81à¹\84มà¹\88à¹\83หà¹\89ใช้\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ราะมีà¸\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อหารือà¸\81ารà¸\9aลà¹\87อà¸\81à¸\99ีà¹\89 \nà¸\84ุà¸\93à¹\84มà¹\88สามารà¸\96à¹\83à¸\8aà¹\89à¸\84ุà¸\93ลัà¸\81ษà¸\93ะ \"สà¹\88à¸\87อีà¹\80มลหาà¸\9cูà¹\89à¹\83à¸\8aà¹\89รายà¸\99ีà¹\89à¹\84à¸\94à¹\89\" à¸\88à¸\99à¸\81วà¹\88าà¸\88ะระà¸\9aุà¸\97ีà¹\88อยูà¹\88อีà¹\80มลà¸\97ีà¹\88à¸\96ูà¸\81à¸\95à¹\89อà¸\87à¹\83à¸\99[[Special:Preferences|à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าà¸\9aัà¸\8dà¸\8aี]]à¸\82อà¸\87à¸\84ุà¸\93 à¹\81ละà¸\84ุà¸\93มิà¹\84à¸\94à¹\89à¸\96ูà¸\81หà¹\89ามใช้\nเลขที่อยู่ไอพีปัจจุบันของคุณคือ $3 และหมายเลขการบล็อกคือ #$5 \nโปรดรวมรายละเอียดข้างต้นทั้งหมดในการสอบถามใด ๆ",
        "blockednoreason": "ไม่ได้ให้เหตุผลไว้",
        "whitelistedittext": "คุณต้อง$1เพื่อแก้ไขหน้า",
        "confirmedittext": "คุณต้องยืนยันที่อยู่อีเมลของคุณก่อนแก้ไขหน้า โปรดกำหนดที่อยู่อีเมลของคุณและทำให้ถูกต้องผ่าน[[Special:Preferences|การตั้งค่าผู้ใช้]]",
        "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": "บัญชีผู้ใช้ \"<nowiki>$1</nowiki>\" มิได้ลงทะเบียน กรุณาตรวจสอบก่อนว่าคุณต้องการสร้างหรือแก้ไขหน้านี้",
+       "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''",
        "edit-gone-missing": "ไม่สามารถอัปเดตหน้าดังกล่าวได้\nเนื่องจากหน้านี้ถูกลบไปแล้ว",
        "edit-conflict": "แก้ชนกัน",
        "edit-no-change": "การแก้ไขของคุณถูกเพิกเฉย เพราะไม่มีการเปลี่ยนแปลงใด ๆ",
-       "postedit-confirmation": "บันทึกการแก้ไขของคุณแล้ว",
+       "postedit-confirmation-created": "หน้าถูกสร้างขึ้น",
+       "postedit-confirmation-restored": "หน้าถูกกู้คืน",
+       "postedit-confirmation-saved": "บันทึกการแก้ไขของคุณแล้ว",
        "edit-already-exists": "ไม่สามารถสร้างหน้าใหม่ได้\nเพราะมีหน้านี้แล้ว",
        "defaultmessagetext": "ข้อความสารโดยปริยาย",
        "content-failed-to-parse": "แจงส่วนเนื้อหา $2 ของตัวแบบ $1 ล้มเหลว: $3",
        "parser-template-loop-warning": "ตรวจพบแม่แบบกลับมาเรียกตัวเอง: [[$1]]",
        "parser-template-recursion-depth-warning": "เรียกแม่แบบซ้อนหลายชั้นเกินขีดจำกัด ($1)",
        "language-converter-depth-warning": "คำสั่งในการแปลงภาษาลึกเกิน $1 ลำดับ",
+       "node-count-exceeded-category": "หน้าที่จำนวนปมเกิน",
+       "node-count-exceeded-warning": "หน้าเกินจำนวนปม",
        "expansion-depth-exceeded-category": "หน้าที่ความลึกการขยายเกิน",
        "expansion-depth-exceeded-warning": "หน้าเกินความลึกการขยาย",
        "parser-unstrip-loop-warning": "พบวงวน unstrip",
        "parser-unstrip-recursion-limit": "ขีดจำกัดการเรียกซ้ำ unstrip เกิน ($1)",
+       "converter-manual-rule-error": "พบข้อผิดพลาดในกฎการแปลงผันภาษาด้วยมือ",
        "undo-success": "การแก้ไขนี้สามารถย้อนกลับได้ กรุณาตรวจสอบข้อแตกต่างด้านล่างให้แน่ใจว่านี่คือสิ่งที่คุณต้องการทำ จากนั้นให้บันทึกการเปลี่ยนแปลงด้านล่างเพื่อเสร็จสิ้นขั้นตอน",
        "undo-failure": "การแก้ไขนี้ไม่สามารถย้อนกลับได้ เนื่องจากขัดแย้งกับการแก้ไขปัจจุบัน",
        "undo-norev": "ไม่สามารถย้อนการแก้ไขนี้ เพราะไม่มีหรือถูกลบไปแล้ว",
        "revdelete-success": "'''ปรับทัศนวิสัยรุ่นสำเร็จ'''",
        "revdelete-failure": "'''ไม่สามารถปรับทัศนวิสัยของรุ่นได้:'''\n$1",
        "logdelete-success": "'''ตั้งทัศนวิสัยปูมสำเร็จ'''",
-       "logdelete-failure": "'''à¹\84มà¹\88สามารà¸\96à¸\95ัà¹\89à¸\87à¸\97ัศà¸\99วิสัยà¸\82อà¸\87à¸\9bุมได้:'''\n$1",
+       "logdelete-failure": "'''à¹\84มà¹\88สามารà¸\96à¸\95ัà¹\89à¸\87à¸\97ัศà¸\99วิสัยà¸\82อà¸\87à¸\9bูมได้:'''\n$1",
        "revdel-restore": "เปลี่ยนทัศนวิสัย",
        "pagehist": "ประวัติหน้า",
        "deletedhist": "ประวัติที่ถูกลบ",
-       "revdelete-hide-current": "à¹\80à¸\81ิà¸\94à¸\84วามà¸\9cิà¸\94à¸\9eลาà¸\94à¹\83à¸\99à¸\81ารà¸\8bà¹\88อà¸\99รุà¹\88à¸\99à¹\80มืà¹\88อวันที่ $2 เวลา $1: นี่คือรุ่นการแก้ไขปัจจุบัน\nไม่สามารถซ่อนได้",
-       "revdelete-show-no-access": "à¹\80à¸\81ิà¸\94à¸\84วามà¸\9cิà¸\94à¸\9eลาà¸\94à¹\83à¸\99à¸\81ารà¹\81สà¸\94à¸\87รุà¹\88à¸\99à¹\80มืà¹\88อวัà¸\99à¸\97ีà¹\88 $2 à¹\80วลา $1: à¸\89à¸\9aัà¸\9aà¸\9bรัà¸\9aà¸\9bรุà¸\87à¸\99ีà¹\89à¸\96ูà¸\81à¸\81ำหà¸\99à¸\94à¹\83หà¹\89 \"ถูกจำกัด\"\nคุณไม่มีสิทธิเข้าถึงรุ่นดังกล่าว",
-       "revdelete-modify-no-access": "à¹\80à¸\81ิà¸\94à¸\84วามà¸\9cิà¸\94à¸\9eลาà¸\94à¹\83à¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82รุà¹\88à¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¹\80มืà¹\88อวัà¸\99à¸\97ีà¹\88 $2 à¹\80วลา $1: à¸£à¸¸à¹\88à¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\99ีà¹\89à¸\96ูà¸\81à¸\81ำหà¸\99à¸\94à¹\83หà¹\89 \"ถูกจำกัด\"\nคุณไม่มีสิทธิเข้าถึงรุ่นดังกล่าว",
-       "revdelete-modify-missing": "à¹\80à¸\81ิà¸\94à¸\82à¹\89อà¸\9cิà¸\94à¸\9eลาà¸\94à¹\83à¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82รุà¹\88à¸\99หมายเลข $1: รายการนี้สูญหายจากฐานข้อมูล!",
-       "revdelete-no-change": "'''à¸\84ำà¹\80à¸\95ือà¸\99:''' à¸£à¸¸à¹\88à¸\99à¹\80มืà¹\88อวันที่ $2 เวลา $1 ตั้งค่าทัศนวิสัยตามที่ขออยู่แล้ว",
-       "revdelete-concurrent-change": "à¹\80à¸\81ิà¸\94à¸\82à¹\89อà¸\9cิà¸\94à¸\9eลาà¸\94à¹\83à¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82รุà¹\88à¸\99à¹\80มืà¹\88อวัà¸\99à¸\97ีà¹\88 $2 à¹\80วลา $1: à¸\94ูà¹\80หมือà¸\99มีà¸\9cูà¹\89อืà¹\88à¸\99à¹\80à¸\9bลีà¹\88ยà¸\99สà¸\96าà¸\99ะà¸\82อà¸\87รุà¹\88à¸\99à¸\82à¸\93ะà¸\97ีà¹\88à¸\84ุà¸\93à¸\9eยายามà¹\81à¸\81à¹\89à¹\84à¸\82\nà¸\81รุà¸\93าตรวจสอบปูม",
-       "revdelete-only-restricted": "à¹\80à¸\81ิà¸\94à¸\82à¹\89อà¸\9cิà¸\94à¸\9eลาà¸\94à¹\83à¸\99à¸\81ารà¸\8bà¹\88อà¸\99รุà¹\88à¸\99à¹\80มืà¹\88อวันที่ $2 เวลา $1: คุณไม่สามารถยับยั้งผู้ดูแลระบบมิให้ดูรุ่นนี้ได้โดยไม่เลือกตัวเลือกทัศนวิสัยอื่นด้วย",
-       "revdelete-reason-dropdown": "*à¹\80หà¸\95ุà¸\9cลà¸\81ารลà¸\9aà¸\97ัà¹\88วà¹\84à¸\9b\n** à¸¥à¸°à¹\80มิà¸\94ลิà¸\82สิà¸\97à¸\98ิà¹\8c\n** à¸\84วามà¹\80หà¹\87à¸\99à¹\84มà¹\88à¹\80หมาะสมหรือà¸\82à¹\89อมูลสà¹\88วà¸\99à¸\9aุà¸\84à¸\84ล\n** à¸\8aืà¹\88อà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¹\84มà¹\88à¹\80หมาะสม\n** à¸\82à¹\89อมูลที่อาจหมิ่นประมาท",
+       "revdelete-hide-current": "à¹\80à¸\81ิà¸\94à¸\84วามà¸\9cิà¸\94à¸\9eลาà¸\94à¹\83à¸\99à¸\81ารà¸\8bà¹\88อà¸\99รายà¸\81ารลà¸\87วันที่ $2 เวลา $1: นี่คือรุ่นการแก้ไขปัจจุบัน\nไม่สามารถซ่อนได้",
+       "revdelete-show-no-access": "à¹\80à¸\81ิà¸\94à¸\84วามà¸\9cิà¸\94à¸\9eลาà¸\94à¹\83à¸\99à¸\81ารà¹\81สà¸\94à¸\87รายà¸\81ารลà¸\87วัà¸\99à¸\97ีà¹\88 $2 à¹\80วลา $1: à¸£à¸²à¸¢à¸\81ารà¸\99ีà¹\89à¸\96ูà¸\81à¸\97ำà¹\80à¸\84รืà¹\88อà¸\87หมายà¹\80à¸\9bà¹\87à¸\99 \"ถูกจำกัด\"\nคุณไม่มีสิทธิเข้าถึงรุ่นดังกล่าว",
+       "revdelete-modify-no-access": "à¹\80à¸\81ิà¸\94à¸\84วามà¸\9cิà¸\94à¸\9eลาà¸\94à¹\83à¸\99à¸\81ารà¸\94ัà¸\94à¹\81à¸\9bรรายà¸\81ารลà¸\87วัà¸\99à¸\97ีà¹\88 $2 à¹\80วลา $1: à¸£à¸²à¸¢à¸\81ารà¸\99ีà¹\89à¸\96ูà¸\81à¸\97ำà¹\80à¸\84รืà¹\88อà¸\87หมายà¹\80à¸\9bà¹\87à¸\99 \"ถูกจำกัด\"\nคุณไม่มีสิทธิเข้าถึงรุ่นดังกล่าว",
+       "revdelete-modify-missing": "à¹\80à¸\81ิà¸\94à¸\82à¹\89อà¸\9cิà¸\94à¸\9eลาà¸\94à¹\83à¸\99à¸\81ารà¸\94ัà¸\94à¹\81à¸\9bรรายà¸\81ารหมายเลข $1: รายการนี้สูญหายจากฐานข้อมูล!",
+       "revdelete-no-change": "'''à¸\84ำà¹\80à¸\95ือà¸\99:''' à¸£à¸²à¸¢à¸\81ารลà¸\87วันที่ $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à¸\84ุà¸\93à¸\9eยายามà¸\94ัà¸\94à¹\81à¸\9bร\nà¹\82à¸\9bรà¸\94ตรวจสอบปูม",
+       "revdelete-only-restricted": "à¹\80à¸\81ิà¸\94à¸\82à¹\89อà¸\9cิà¸\94à¸\9eลาà¸\94à¹\83à¸\99à¸\81ารà¸\8bà¹\88อà¸\99รายà¸\81ารลà¸\87วันที่ $2 เวลา $1: คุณไม่สามารถยับยั้งผู้ดูแลระบบมิให้ดูรุ่นนี้ได้โดยไม่เลือกตัวเลือกทัศนวิสัยอื่นด้วย",
+       "revdelete-reason-dropdown": "*à¹\80หà¸\95ุà¸\9cลà¸\81ารลà¸\9aà¸\97ัà¹\88วà¹\84à¸\9b\n** à¸¥à¸°à¹\80มิà¸\94ลิà¸\82สิà¸\97à¸\98ิà¹\8c\n** à¸\84วามà¹\80หà¹\87à¸\99à¹\84มà¹\88à¹\80หมาะสมหรือสารสà¸\99à¹\80à¸\97ศสà¹\88วà¸\99à¸\9aุà¸\84à¸\84ล\n** à¸\8aืà¹\88อà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¹\84มà¹\88à¹\80หมาะสม\n** à¸ªà¸²à¸£à¸ªà¸\99à¹\80à¸\97ศที่อาจหมิ่นประมาท",
        "revdelete-otherreason": "เหตุผลอื่น/เพิ่มเติม:",
        "revdelete-reasonotherlist": "เหตุผลอื่น",
        "revdelete-edit-reasonlist": "แก้ไขเหตุผลการลบ",
        "mergehistory-same-destination": "หน้าต้นทางและปลายทางเป็นหน้าเดียวกันไม่ได้",
        "mergehistory-reason": "เหตุผล:",
        "mergelog": "ปูมการรวมหน้า",
-       "pagemerge-logentry": "รวม [[$1]] à¹\80à¸\82à¹\89าà¸\81ัà¸\9a [[$2]] (รุà¹\88à¸\99à¸\82ึà¹\89à¸\99อยูà¹\88à¸\81ัà¸\9a $3)",
+       "pagemerge-logentry": "รวม [[$1]] à¹\80à¸\82à¹\89าà¸\81ัà¸\9a [[$2]] (รุà¹\88à¸\99à¸\96ึà¸\87 $3)",
        "revertmerge": "ยกเลิกการรวมหน้า",
        "mergelogpagetext": "ด้านล่างนี้เป็นรายการการรวมประวัติของหน้าหนึ่งเข้ากับของอีกหน้าหนึ่งล่าสุด",
        "history-title": "ประวัติรุ่นปรับปรุงของ \"$1\"",
        "searchresults-title": "ผลการค้นหาสำหรับ \"$1\"",
        "toomanymatches": "พบตรงกันมากเกินไป กรุณาลองใช้คำค้นหาอื่น",
        "titlematches": "พบชื่อเรื่องหน้าตรงกัน",
-       "textmatches": "à¸\9eà¸\9aà¸\84ำà¸\99ีà¹\89ในหน้า",
-       "notextmatches": "ไม่พบข้อความในหน้า",
+       "textmatches": "à¸\9eà¸\9aà¸\82à¹\89อà¸\84วามà¸\95รà¸\87ในหน้า",
+       "notextmatches": "à¹\84มà¹\88à¸\9eà¸\9aà¸\82à¹\89อà¸\84วามà¸\95รà¸\87à¹\83à¸\99หà¸\99à¹\89า",
        "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-project": "คำอธิบายและหน้าโครงการ",
        "searchprofile-images": "มัลติมีเดีย",
        "searchprofile-everything": "ทุกอย่าง",
        "searchprofile-advanced": "ชั้นสูง",
        "searchprofile-articles-tooltip": "ค้นหาใน $1",
-       "searchprofile-project-tooltip": "ค้นหาใน $1",
        "searchprofile-images-tooltip": "ค้นหาไฟล์",
        "searchprofile-everything-tooltip": "ค้นเนื้อหาทั้งหมด (รวมหน้าอภิปราย)",
        "searchprofile-advanced-tooltip": "ค้นหาในเนมสเปซที่เลือกเอง",
        "searcheverything-enable": "ค้นหาในทุกเนมสเปซ",
        "searchrelated": "สัมพันธ์",
        "searchall": "ทั้งหมด",
-       "showingresults": "à¹\81สà¸\94à¸\87 $1 à¸£à¸²à¸¢à¸\81าร à¹\80ริà¹\88มà¸\95ัà¹\89à¸\87à¹\81à¸\95à¹\88รายà¸\81ารà¸\97ีà¹\88 '''$2'''",
-       "showingresultsinrange": "à¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¹\81สà¸\94à¸\87à¸\9cลมาà¸\81สุà¸\94 {{PLURAL:$1|<strong>1</strong>|<strong>$1</strong>}} ในพิสัย #<strong>$2</strong> ถึง #<strong>$3</strong>",
-       "showingresultsnum": "à¹\81สà¸\94à¸\87 $3 à¸£à¸²à¸¢à¸\81าร à¹\80ริà¹\88มà¸\95ัà¹\89à¸\87à¹\81à¸\95à¹\88รายà¸\81ารà¸\97ีà¹\88  '''$2'''",
-       "showingresultsheader": "{{PLURAL:$5|ผลการค้นหา '''$1''' จาก '''$3'''|ผลการค้นหา '''$1 - $2''' จาก '''$3'''}} สำหรับ '''$4'''",
+       "showingresults": "à¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¹\81สà¸\94à¸\87 <strong>1</strong> à¸\9cลลัà¸\9eà¸\98à¹\8c à¹\80ริà¹\88มà¸\95ัà¹\89à¸\87à¹\81à¸\95à¹\88รายà¸\81ารà¸\97ีà¹\88 <strong>$2</strong>",
+       "showingresultsinrange": "à¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¹\81สà¸\94à¸\87มาà¸\81สุà¸\94 {{PLURAL:$1|<strong>1</strong>|<strong>$1</strong>}} à¸\9cลลัà¸\9eà¸\98à¹\8c ในพิสัย #<strong>$2</strong> ถึง #<strong>$3</strong>",
+       "showingresultsnum": "à¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¹\81สà¸\94à¸\87 <strong>$3</strong> à¸\9cลลัà¸\9eà¸\98à¹\8c à¹\80ริà¹\88มà¸\95ัà¹\89à¸\87à¹\81à¸\95à¹\88รายà¸\81ารà¸\97ีà¹\88 <strong>$2</strong>",
+       "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": "ค้นหาในเนมสเปซ:",
-       "powersearch-redir": "รายการหน้าเปลี่ยนทาง",
        "powersearch-togglelabel": "เลือก:",
        "powersearch-toggleall": "ทั้งหมด",
        "powersearch-togglenone": "ไม่เลือก",
        "prefsnologintext2": "โปรด$1เพื่อเปลี่ยนการตั้งค่าของคุณ",
        "prefs-skin": "หน้าตา",
        "skin-preview": "แสดงตัวอย่าง",
-       "datedefault": "à¸\84à¹\88าà¸\95ัà¹\89à¸\87à¸\95à¹\89à¸\99",
+       "datedefault": "à¹\84มà¹\88มีà¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88า",
        "prefs-labs": "คุณสมบัติทดลอง",
        "prefs-user-pages": "หน้าผู้ใช้",
        "prefs-personal": "โพรไฟล์ผู้ใช้",
        "prefs-emailconfirm-label": "การยืนยันอีเมล:",
        "youremail": "อีเมล:",
        "username": "{{GENDER:$1|ชื่อผู้ใช้}}:",
-       "uid": "รหัสประจำตัว{{GENDER:$1|ผู้ใช้}}:",
        "prefs-memberingroups": "{{GENDER:$2|สมาชิก}}ใน{{PLURAL:$1|กลุ่ม|กลุ่ม}}:",
        "prefs-registration": "เวลาลงทะเบียน:",
        "yourrealname": "ชื่อจริง:",
        "prefs-advancedsearchoptions": "ตัวเลือกขั้นสูง",
        "prefs-advancedwatchlist": "ตัวเลือกขั้นสูง",
        "prefs-displayrc": "ตัวเลือกผลแสดง",
-       "prefs-displaysearchoptions": "ตัวเลือกผลแสดง",
        "prefs-displaywatchlist": "ตัวเลือกผลแสดง",
        "prefs-tokenwatchlist": "โทเค็น",
        "prefs-diffs": "ผลต่าง",
        "action-createpage": "สร้างหน้า",
        "action-createtalk": "สร้างหน้าอภิปราย",
        "action-createaccount": "สร้างบัญชีผู้ใช้นี้",
+       "action-history": "ดูประวัติของหน้านี้",
        "action-minoredit": "ทำเครื่องหมายการแก้ไขนี้เป็นการแก้ไขเล็กน้อย",
        "action-move": "ย้ายหน้านี้",
        "action-move-subpages": "ย้ายหน้านี้ รวมทั้งหน้าย่อย",
        "recentchanges-legend-heading": "'''คำอธิบายสัญลักษณ์:'''",
        "recentchanges-legend-newpage": "(ดูเพิ่มที่[[Special:NewPages|รายชื่อหน้าใหม่]])",
        "rcnotefrom": "ด้านล่างเป็นการเปลี่ยนแปลงตั้งแต่ <strong>$2</strong> (มากสุด <strong>$1</strong> รายการ)",
-       "rclistfrom": "แสดงการเปลี่ยนแปลงใหม่เริ่มตั้งแต่ $1",
+       "rclistfrom": "แสดงการเปลี่ยนแปลงใหม่เริ่มตั้งแต่ $3 $2",
        "rcshowhideminor": "$1การแก้ไขเล็กน้อย",
        "rcshowhideminor-show": "แสดง",
        "rcshowhideminor-hide": "ซ่อน",
        "uploaddisabledtext": "ปิดใช้งานการอัปโหลดไฟล์",
        "php-uploaddisabledtext": "เปิดการใช้งานการอัปโหลดไฟล์ในพีเอชพี\nกรุณาตรวจสอบการตั้งค่า file_uploads",
        "uploadscripted": "ไฟล์นี้มีส่วนประกอบของโค้ดเอชทีเอ็มแอลหรือสคริปต์ ซึ่งอาจก่อให้เกิดความผิดพลาดในการแสดงผลของเว็บเบราว์เซอร์",
+       "uploadscriptednamespace": "ไฟล์ SVG นี้มีเนมสเปซไม่ถูกต้อง \"$1\"",
        "uploadvirus": "ไฟล์นี้มีไวรัส! รายละเอียด: $1",
        "upload-source": "ไฟล์ต้นทาง",
        "sourcefilename": "ชื่อไฟล์ต้นทาง:",
        "uploadstash-errclear": "การล้างไฟล์ไม่สำเร็จ",
        "uploadstash-refresh": "ฟื้นฟูรายการไฟล์",
        "img-auth-accessdenied": "การเข้าถึงถูกจำกัด",
-       "img-auth-nopathinfo": "ค่า PATH_INFO สูญหาย\nเซิร์ฟเวอร์ของคุณอาจไม่ได้ถูกตั้งให้ส่งข้อมูลนี้\nหรือเซิร์ฟเวอร์อาจเป็นแบบ CGI-based และไม่สนับสนุนข้อมูล img_auth\nดูที่ https://www.mediawiki.org/wiki/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\" ไม่ได้อยู่ในรายชื่อผู้ใช้ที่ดี (whitelist)",
        "pageswithprop-submit": "ไป",
        "doubleredirects": "หน้าเปลี่ยนทางซ้ำซ้อน",
        "doubleredirectstext": "หน้านี้แสดงรายการหน้าที่เปลี่ยนทางไปยังหน้าเปลี่ยนทางอื่น\nแต่ละแถวมีการเชื่อมโยงไปยังการเปลี่ยนทางครั้งแรกและครั้งที่สอง เช่นเดียวกับเป้าหมายของการเปลี่ยนทางครั้งที่สอง ซึ่งมักเป็นหน้าเป้าหมาย \"ที่แท้จริง\" ที่การเปลี่ยนแปลงครั้งแรกควรชี้ไป\nหน่วยที่<del>ขีดฆ่า</del> คือ รายการที่ได้แก้ไขแล้ว",
-       "double-redirect-fixed-move": "[[$1]] à¹\84à¸\94à¹\89ยà¹\89ายà¹\81ลà¹\89ว \nขณะนี้เปลี่ยนทางไปยัง [[$2]]",
-       "double-redirect-fixed-maintenance": "การแก้ไขการเปลี่ยนทางซ้ำซ้อนจาก [[$1]] ไปยัง [[$2]]",
+       "double-redirect-fixed-move": "[[$1]] à¸\96ูà¸\81ยà¹\89ายà¹\81ลà¹\89ว à¸¡à¸µà¸\81ารà¸\9bรัà¸\9aอัà¸\95à¹\82à¸\99มัà¸\95ิà¹\81ละขณะนี้เปลี่ยนทางไปยัง [[$2]]",
+       "double-redirect-fixed-maintenance": "การแก้ไขการเปลี่ยนทางซ้ำซ้อนจาก [[$1]] ไปยัง [[$2]] โดยอัตโนมัติในงานบำรุงรักษา",
        "double-redirect-fixer": "ตัวซ่อมหน้าเปลี่ยนทาง",
        "brokenredirects": "หน้าเปลี่ยนทางเสีย",
        "brokenredirectstext": "หน้าเปลี่ยนทางต่อไปนี้เชื่อมโยงไปยังหน้าที่ยังไม่ถูกสร้าง:",
        "log-title-wildcard": "ค้นหาชื่อเรื่องด้วยข้อความนี้",
        "showhideselectedlogentries": "แสดง/ซ่อนหน่วยปูมที่เลือก",
        "allpages": "หน้าทั้งหมด",
-       "alphaindexline": "$1 ถึง $2",
        "nextpage": "หน้าถัดไป ($1)",
        "prevpage": "หน้าก่อนหน้า ($1)",
        "allpagesfrom": "แสดงหน้าโดยเริ่มจาก:",
        "allinnamespace": "หน้าทุกหน้า (เนมสเปซ $1)",
        "allpagessubmit": "ดู",
        "allpagesprefix": "แสดงหน้าที่ขึ้นต้นด้วย:",
-       "allpagesbadtitle": "à¸\8aืà¹\88อà¹\80รืà¹\88อà¸\87à¸\99ีà¹\89à¹\84มà¹\88à¸\96ูà¸\81à¸\95à¹\89อà¸\87 à¸­à¸²à¸\88สะà¸\81à¸\94à¸\9cิà¸\94 à¸¥à¸´à¸\87à¸\81à¹\8cมาà¸\88าà¸\81ภาษาอืà¹\88à¸\99หรือวิà¸\81ิอืà¹\88à¸\99 หรือมีตัวอักษรที่ไม่สามารถใช้เป็นชื่อเรื่องได้",
+       "allpagesbadtitle": "à¸\8aืà¹\88อà¹\80รืà¹\88อà¸\87à¸\99ีà¹\89à¹\84มà¹\88à¸\96ูà¸\81à¸\95à¹\89อà¸\87 à¸­à¸²à¸\88สะà¸\81à¸\94à¸\9cิà¸\94 à¸«à¸£à¸·à¸­à¹\80à¸\9bà¹\87à¸\99ลิà¸\87à¸\81à¹\8cà¸\82à¹\89ามภาษา หรือมีตัวอักษรที่ไม่สามารถใช้เป็นชื่อเรื่องได้",
        "allpages-bad-ns": "{{SITENAME}} ไม่มีเนมสเปซ \"$1\"",
        "allpages-hide-redirects": "ซ่อนการเปลี่ยนทาง",
        "cachedspecial-viewing-cached-ttl": "คุณกำลังดูรุ่นที่เก็บหน่วยความจำแคชของหน้านี้ ซึ่งอาจมีอายุ $1",
        "listgrouprights-removegroup-self": "ลบ{{PLURAL:$2|กลุ่ม|กลุ่ม}}ออกจากบัญชี: $1",
        "listgrouprights-addgroup-self-all": "เพิ่มทุกกลุ่มเข้าไปในบัญชีนี้",
        "listgrouprights-removegroup-self-all": "นำทุกกลุ่มออกจากบัญชีนี้",
+       "listgrouprights-namespaceprotection-header": "การจำกัดเนมสเปซ",
+       "listgrouprights-namespaceprotection-namespace": "เนมสเปซ",
+       "listgrouprights-namespaceprotection-restrictedto": "สิทธิอนุญาตให้ผู้ใช้แก้ไข",
+       "trackingcategories": "หมวดหมู่ค้นหาและติดตาม",
+       "trackingcategories-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> อยู่ (และอยู่ในเนมสเปซซึ่งอนุญาตตัวบ่งชี้นี้) ฉะนั้น โรบอตจึงทำดัชนี้ได้ ซึ่งปกติไม่สามารถทำได้",
        "hidden-category-category-desc": "นี่คือหมวดหมู่ที่ติด <code><nowiki>__HIDDENCAT__</nowiki></code> ซึ่งป้องกันมิให้แสดงในกล่องลิงก์หมวดหมู่ในหน้าโดยปริยาย",
        "mailnologin": "ไม่มีที่อยู่ส่ง",
        "mailnologintext": "คุณต้อง[[Special:UserLogin|ล็อกอิน]]และมีที่อยู่อีเมลที่สมเหตุสมผลใน[[Special:Preferences|การตั้งค่า]]ของคุณ ในการส่งอีเมลหาผู้ใช้อื่น",
        "unwatchthispage": "เลิกเฝ้าดูหน้านี้",
        "notanarticle": "ไม่ใช่หน้าเนื้อหา",
        "notvisiblerev": "รุ่นล่าสุดโดยผู้ใช้อีกคนถูกลบแล้ว",
-       "watchlist-details": "มี $1 à¸«à¸\99à¹\89าà¹\83à¸\99รายà¸\81ารà¹\80à¸\9dà¹\89าà¸\94ูà¸\82อà¸\87à¸\84ุà¸\93 à¹\84มà¹\88รวมหน้าอภิปราย",
+       "watchlist-details": "มี $1 à¸«à¸\99à¹\89าà¹\83à¸\99รายà¸\81ารà¹\80à¸\9dà¹\89าà¸\94ูà¸\82อà¸\87à¸\84ุà¸\93 à¹\84มà¹\88à¸\99ัà¸\9aà¹\81ยà¸\81หน้าอภิปราย",
        "wlheader-enotif": "การแจ้งเตือนผ่านอีเมลถูกเปิดใช้งาน",
        "wlheader-showupdated": "หน้าที่มีการเปลี่ยนแปลงตั้งแต่คุณเข้าชมล่าสุดแสดงใน'''ตัวหนา'''",
-       "watchmethod-recent": "ตรวจสอบการปรับปรุงล่าสุดกับหน้าเฝ้าดู",
-       "watchmethod-list": "ตรวจสอบหน้าเฝ้าดูกับการแก้ไขล่าสุด",
-       "watchlistcontains": "รายการเฝ้าดูของคุณมี $1 หน้า",
-       "iteminvalidname": "เกิดปัญหากับรายการ '$1' ชื่อไม่ถูกต้อง...",
        "wlnote2": "ด้านล่างเป็นการเปลี่ยนแปลงล่าสุดในช่วง <strong>$1</strong> ชั่วโมงล่าสุด จนถึงวันที่ $2 เวลา $3 น.",
        "wlshowlast": "แสดง $1 ชั่วโมง $2 วันล่าสุด $3",
        "watchlist-options": "ตัวเลือกรายการเฝ้าดู",
        "enotif_lastvisited": "ดู $1 สำหรับการเปลี่ยนแปลงทั้งหมดตั้งแต่คุณเข้าชมครั้งล่าสุด",
        "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{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "เรียน $WATCHINGUSERNAME\n\n$PAGEINTRO $NEWPAGE\n\nคำอธิบายอย่างย่อของผู้เขียน: $PAGESUMMARY $PAGEMINOREDIT\n\nติดต่อผู้เขียน:\nเมล: $PAGEEDITOR_EMAIL\nวิกิ: $PAGEEDITOR_WIKI\n\nจะไม่มีประกาศอื่นหากมีกิจกรรมเพิ่มเติม เว้นเสียแต่คุณจะเข้าชมหน้านี้ คุณยังสามารถตั้งค่าตัวบ่งชี้ประกาศใหม่สำหรับหน้าที่คุณเฝ้าดูทุกหน้าในรายการเฝ้าดูของคุณ\n\nระบบประกาศ {{SITENAME}} ที่เป็นมิตรของคุณ\n\n--\nในการเปลี่ยนการตั้งค่าประกาศอีเมลของคุณ โปรดดู\n{{canonicalurl:{{#special:Preferences}}}}\n\nในการเปลี่ยนการตั้งค่ารายการเฝ้าดูของคุณ โปรดดู\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nในการลบหน้าจากรายการเฝ้าดูของคุณ โปรดดู\n$UNWATCHURL\n\nผลป้อนกลับและความช่วยเหลือเพิ่มเติม:\n$HELPPAGE",
        "created": "ถูกสร้าง",
        "changed": "ถูกเปลี่ยนแปลง",
        "deletepage": "ลบหน้า",
        "contributions-title": "เรื่องที่เขียนโดย $1",
        "mycontris": "เรื่องที่เขียน",
        "contribsub2": "สำหรับ {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "บัญชีผู้ใช้ \"$1\" ยังไม่ได้ลงทะเบียน",
        "nocontribs": "ไม่พบการเปลี่ยนแปลงตรงกับเงื่อนไขเหล่านี้",
        "uctop": "(ปัจจุบัน)",
        "month": "ตั้งแต่เดือน (และก่อนหน้า):",
        "blockip": "บล็อกผู้ใช้",
        "blockip-legend": "บล็อกผู้ใช้",
        "blockiptext": "ใช้แบบด้านล่างเพื่อบล็อกสิทธิเข้าถึงการเขียนของเลขที่อยู่ไอพีหรือชื่อผู้ใช้โดยเจาะจง การบล็อกนี้ควรดำเนินการเพื่อป้องกันการก่อกวนเท่านั้น และให้สอดคล้องกับ[[{{MediaWiki:Policy-url}}|นโยบาย]]\nกรอกเหตุผลโดยเจาะจงด้านล่าง (เช่น อ้างถึงหน้าที่ถูกก่อกวน)",
-       "ipadressorusername": "เลขที่อยู่ไอพีหรือชื่อผู้ใช้",
+       "ipaddressorusername": "เลขที่อยู่ไอพีหรือชื่อผู้ใช้",
        "ipbexpiry": "หมดอายุ",
        "ipbreason": "เหตุผล:",
        "ipbreason-dropdown": "*สาเหตุการบล็อกทั่วไป\n** ใส่ข้อมูลเท็จ\n** ลบเนื้อหาในหน้าออก\n** ใส่ลิงก์สแปม\n** ใส่ข้อความไร้สาระ/ขยะเข้ามา\n** พฤติกรรมข่มขู่/รังควาน\n** ใช้หลายบัญชีในทางที่ผิด\n** ชื่อผู้ใช้ที่ไม่อาจยอมรับได้",
        "tooltip-preferences-save": "บันทึกการตั้งค่า",
        "tooltip-summary": "ใส่คำอธิบายอย่างย่อสั้น ๆ",
        "common.css": "/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ทุกสกิน */",
-       "cologneblue.css": "/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ใช้สกินโคโลญจ์บลู */",
        "monobook.css": "/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ใช้สกินโมโนบุ๊ก */",
-       "modern.css": "/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ใช้สกินโมเดิร์น */",
        "vector.css": "/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ใช้สกินเวกเตอร์ */",
        "print.css": "/* สไตล์ชีตในหน้านี้จะส่งผลแก่ข้อมูลส่งออกเป็นสิ่งพิมพ์ */",
        "noscript.css": "/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ปิดการใช้งานจาวาสคริปต์ */",
        "group-sysop.css": "/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ดูแลเท่านั้น */",
        "group-bureaucrat.css": "/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ดูแลสิทธิแต่งตั้งเท่านั้น */",
        "common.js": "/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ทุกคนในทุกหน้า */",
-       "cologneblue.js": "/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ที่ใช้สกินโคโลญจ์บลู */",
        "monobook.js": "/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ที่ใช้สกินโมโนบุ๊ก */",
-       "modern.js": "/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ที่ใช้สกินโมเดิร์น */",
        "vector.js": "/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ที่ใช้สกินเวกเตอร์ */",
        "group-autoconfirmed.js": "/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ทั่วไปเท่านั้น */",
        "group-bot.js": "/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่บอตเท่านั้น */",
        "group-sysop.js": "/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ดูแลเท่านั้น */",
        "group-bureaucrat.js": "/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ดูแลสิทธิแต่งตั้งเท่านั้น */",
-       "notacceptable": "เซิร์ฟเวอร์ของวิกิไม่สามารถให้ข้อมูลในรูปแบบที่ไคลเอนต์สามารถอ่านได้",
        "anonymous": "{{PLURAL:$1|ผู้ใช้|ผู้ใช้}}นิรนามของ{{SITENAME}}",
        "siteuser": "ผู้ใช้ $1 จาก {{SITENAME}}",
        "anonuser": "ผู้ใช้นิรนามจาก {{SITENAME}} $1",
        "spam_reverting": "ย้อนกลับไปรุ่นก่อนหน้าที่ไม่มีลิงก์ไปยังเว็บ $1",
        "spam_blanking": "รุ่นการปรับปรุงทุกรุ่นประกอบไปด้วยลิงก์ไปยังเว็บ $1 (ทำหน้าว่าง)",
        "spam_deleting": "ทุกรุ่นที่มีลิงก์ไปยัง $1 กำลังลบ",
+       "simpleantispam-label": "การตรวจสอบสแปม\n<strong>อย่า</strong>กรอกช่องนี้!",
        "pageinfo-title": "ข้อมูลสำหรับ \"$1\"",
        "pageinfo-not-current": "ขออภัย ไม่สามารถให้ข้อมูลนี้สำหรับรุ่นเก่าได้",
        "pageinfo-header-basic": "ข้อมูลเบื้องต้น",
        "pageinfo-category-pages": "จำนวนหน้า",
        "pageinfo-category-subcats": "จำนวนหมวดหมู่ย่อย",
        "pageinfo-category-files": "จำนวนไฟล์",
-       "skinname-cologneblue": "โคโลญจ์บลู",
        "skinname-monobook": "โมโนบุ๊ก",
-       "skinname-modern": "โมเดิร์น",
        "skinname-vector": "เวกเตอร์",
        "markaspatrolleddiff": "ทำเครื่องหมายว่าตรวจสอบแล้ว",
        "markaspatrolledtext": "ทำเครื่องหมายว่าหน้านี้ถูกตรวจสอบแล้ว",
        "newimages-summary": "หน้าพิเศษนี้แสดงไฟล์ที่ถูกอัปโหลดล่าสุด",
        "newimages-legend": "ตัวกรอง",
        "newimages-label": "ชื่อไฟล์ (หรือส่วนหนึ่งของชื่อ):",
-       "showhidebots": "($1 บอต)",
+       "newimages-showbots": "แสดงไฟล์ที่บอตอัปโหลด",
        "noimages": "ไม่มีให้ดู",
        "ilsubmit": "สืบค้น",
        "bydate": "ตามวันที่",
        "confirmemail_send": "ส่งรหัสยืนยันทางอีเมล",
        "confirmemail_sent": "ส่งอีเมลสำหรับการยืนยันแล้ว",
        "confirmemail_oncreate": "รหัสยืนยันถูกส่งไปยังที่อยู่อีเมลของคุณ\nรหัสนี้ไม่กำหนดให้ต้องล็อกอิน แต่คุณต้องระบุรหัสก่อนเปิดใช้งานคุณลักษณะที่อาศัยอีเมลทั้งหมดในวิกินี้",
-       "confirmemail_sendfailed": "{{SITENAME}}à¹\84มà¹\88สามารà¸\96สà¹\88à¸\87อีà¹\80มลยืà¸\99ยัà¸\99à¹\84à¸\94à¹\89\nà¹\82à¸\9bรà¸\94à¸\95รวà¸\88สอà¸\9aà¸\97ีà¹\88อยูà¹\88อีà¹\80มลวà¹\88าà¹\84มà¹\88มีอัà¸\81à¸\82ระà¸\97ีà¹\88à¹\84มà¹\88ถูกต้อง\n\nข้อความตีกลับ: $1",
+       "confirmemail_sendfailed": "{{SITENAME}}à¹\84มà¹\88สามารà¸\96สà¹\88à¸\87อีà¹\80มลยืà¸\99ยัà¸\99à¹\84à¸\94à¹\89\nà¹\82à¸\9bรà¸\94à¸\95รวà¸\88สอà¸\9aà¸\97ีà¹\88อยูà¹\88อีà¹\80มลวà¹\88าอัà¸\81à¸\82ระà¸\97ัà¹\89à¸\87หมà¸\94ถูกต้อง\n\nข้อความตีกลับ: $1",
        "confirmemail_invalid": "รหัสยืนยันไม่ถูกต้อง \nรหัสอาจหมดอายุแล้ว",
        "confirmemail_needlogin": "คุณต้อง $1 เพื่อยืนยันที่อยู่อีเมลของคุณ",
        "confirmemail_success": "อีเมลคุณได้รับการยืนยันแล้ว\nคุณอาจ[[Special:UserLogin|ล็อกอิน]]ตอนนี้และสนุกกับการแก้ไขวิกิ",
        "bitrate-exabits": "$1 เอกซะบิตต่อวินาที",
        "bitrate-zetabits": "$1 เซตตะบิตต่อวินาที",
        "bitrate-yottabits": "$1 ยอตตะบิตต่อวินาที",
-       "livepreview-loading": "กำลังค้นหา…",
-       "livepreview-ready": "กำลังค้นหา… เสร็จ!",
-       "livepreview-failed": "แสดงตัวอย่างทันทีไม่ได้ ให้ลองใช้การแสดงตัวอย่างแบบธรรมดา",
-       "livepreview-error": "เชื่อมต่อไม่ได้: $1 \"$2\" ให้ลองใช้แสดงตัวอย่างแบบธรรมดา",
        "lag-warn-normal": "การปรับปรุงที่ใหม่กว่า $1 วินาที อาจไม่แสดงผลในรายการนี้",
        "lag-warn-high": "เนื่องจากปัญหาการล่าช้าของเซิร์ฟเวอร์ฐานข้อมูล การปรับปรุงที่ใหม่กว่า $1 วินาที อาจไม่แสดงผลในรายการนี้",
-       "watchlistedit-numitems": "รายการเฝ้าดูมี $1 รายการ ไม่รวมหน้าพูดคุย",
-       "watchlistedit-noitems": "ไม่มีชื่อเรื่องใดในรายการเฝ้าดู",
        "watchlistedit-normal-title": "แก้ไขรายการเฝ้าดู",
        "watchlistedit-normal-legend": "ลบชื่อเรื่องออกจากรายการเฝ้าดู",
        "watchlistedit-normal-explain": "ชื่อเรื่องในรายการเฝ้าดูของคุณแสดงด้านล่าง \nถ้าต้องการลบออก ให้คลิกเลือกที่กล่องด้านข้างแต่ละชื่อ และคลิก \"{{int:Watchlistedit-normal-submit}}\" \nหรืออาจจะ[[Special:EditWatchlist/raw|แก้ไขรายการทั้งหมด]]",
        "compare-invalid-title": "ชื่อเรื่องที่คุณระบุไม่ถูกต้อง",
        "compare-title-not-exists": "ชื่อเรื่องที่คุณระบุไม่มีอยู่",
        "compare-revision-not-exists": "รุ่นที่คุณระบุไม่มีอยู่",
-       "dberr-header": "วิกินี้กำลังประสบปัญหา",
        "dberr-problems": "ขออภัย เว็บไซต์นี้กำลังพบกับข้อผิดพลาดทางเทคนิค",
        "dberr-again": "กรุณารอสักครู่แล้วจึงโหลดใหม่",
        "dberr-info": "(ไม่สามารถติดต่อเซิร์ฟเวอร์ฐานข้อมูลได้: $1)",
index 77b3223..9a27692 100644 (file)
@@ -8,7 +8,8 @@
                        "Kaganer",
                        "Reedy",
                        "Runningfridgesrule",
-                       "The Evil IP address"
+                       "The Evil IP address",
+                       "아라"
                ]
        },
        "tog-underline": "Çykgytlaryň aşagyny çyz:",
@@ -21,7 +22,6 @@
        "tog-showtoolbar": "Redaktirleme mahalynda gural panelini görkez (JavaScript)",
        "tog-editondblclick": "Sahypany jübüt tyklap, redaktirläp başla (JavaScript)",
        "tog-editsectiononrightclick": "Bölümleri bölümiň adyna sag tyklap redaktirlemäge mümkinçilik döret (JavaScript)",
-       "tog-rememberpassword": "Sessiýamy şu brauzerde ýatda sakla  (iň köp $1 {{PLURAL:$1|günläp|günläp}})",
        "tog-watchcreations": "Döreden sahypalarymy gözegçilik sanawyma goş",
        "tog-watchdefault": "Redaktirlän sahypalarymy gözegçilik sanawyma goş",
        "tog-watchmoves": "Adyny üýtgeden sahypalarymy gözegçilik sanawyma goş",
        "and": "&#32;we",
        "qbfind": "Tap",
        "qbbrowse": "Göz aýla",
-       "qbedit": "Redaktirle",
+       "qbedit": "Düzet",
        "qbpageoptions": "Bu sahypa",
        "qbmyoptions": "Meniň sahypalarym",
        "faq": "KSS",
        "readonly_lag": "Ätiýaçlyk serwerler esasy serwere boýunça täzelenýärkä, maglumat bazasy awtomatik usulda gulplandy.",
        "internalerror": "Içerki säwlik",
        "internalerror_info": "Içerki säwlik: $1",
-       "fileappenderrorread": "Goşmaça goşulýan mahaly \"$1\" okatdyrmady.",
-       "fileappenderror": "\"$1\" faýlyny \"$2\" faýlyna goşup bolmady.",
        "filecopyerror": "\"$1\" faýlyny  \"$2\" faýlyna göçürip bolmady.",
        "filerenameerror": "\"$1\" faýlynyň adyny \"$2\" diýip üýtgedip bolmady.",
        "filedeleteerror": "\"$1\" faýlyny öçürip bolmady.",
        "directorycreateerror": "\"$1\" direktoriýasyny döredip bolmady",
        "filenotfound": "\n\"$1\" faýly tapylmady.",
-       "fileexistserror": "\"$1\" faýlyna ýazyp bolmady: faýl onsuzam bar",
        "unexpected": "Garaşylmadyk baha: \"$1\"=\"$2\".",
        "formerror": "Säwlik: formy iberip bolmady",
        "badarticleerror": "Bu işi bu sahypada amala aşyryp bolmaýar.",
        "savearticle": "Sahypany ýazdyr",
        "preview": "Deslapky syn",
        "showpreview": "Deslapky syny görkez",
-       "showlivepreview": "Gönümel deslapky syn",
        "showdiff": "Üýtgeşmeleri görkez",
        "anoneditwarning": "'''Üns beriň:''' Hasaba girmänsiňiz. Şonuň üçin hem IP adresiňiz bu sahypanyň özgerdişler geçmişine ýazylyp alynar.",
        "anonpreviewwarning": "''Sessiýa açmadyňyz. Ýazdyrsaňyz, sahypanyň redaktirleme geçmişine IP adresiňiz ýazylar.''",
        "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:",
-       "powersearch-redir": "Gönükdirmeleri sanawla",
        "powersearch-togglelabel": "Belle:",
        "powersearch-toggleall": "Ählisi",
        "powersearch-togglenone": "Hiç biri",
        "prefs-advancedsearchoptions": "Giňeldilen opsiýalar",
        "prefs-advancedwatchlist": "Giňeldilen opsiýalar",
        "prefs-displayrc": "Görkeziş opsiýalary",
-       "prefs-displaysearchoptions": "Görkeziş opsiýalary",
        "prefs-displaywatchlist": "Görkeziş opsiýalary",
        "prefs-diffs": "Tapawutlar",
        "userrights": "Ulanyjy hukuklary dolandyryşy",
        "recentchanges-label-unpatrolled": "Bu özgerdişe heniz patrullyk edilmändir",
        "recentchanges-legend-newpage": "$1 - täze sahypa",
        "rcnotefrom": "<strong>$2</strong> senesinden soňky üýtgetmeler aşakda görkezilýär (<strong>$1</strong> sanysyna çenli).",
-       "rclistfrom": "$1 senesinden bäri edilen özgerdişleri görkez",
+       "rclistfrom": "$3 $2 senesinden bäri edilen özgerdişleri görkez",
        "rcshowhideminor": "ujypsyzja özgerdişleri $1",
        "rcshowhidebots": "botlary $1",
        "rcshowhideliu": "Hasaba alnan ulanyjylary $1",
        "upload-too-many-redirects": "URL aşa köp gönükdirmani özünde jemleýär",
        "upload-http-error": "HTTP säwligi ýüze çykdy: $1",
        "img-auth-accessdenied": "Barmak gadagan",
-       "img-auth-nopathinfo": "PATH_INFO ýok.\nSerweriňiz bu maglumaty geçirmeklik üçin sazlanmandyr.\nCGI esaslanýan hem-de img_auth-y goldamaýan bolmagy mümkin.\nhttps://www.mediawiki.org/wiki/Manual:Image_Authorization sahypasyna serediň.",
+       "img-auth-nopathinfo": "PATH_INFO ýok.\nSerweriňiz bu maglumaty geçirmeklik üçin sazlanmandyr.\nCGI esaslanýan hem-de img_auth-y goldamaýan bolmagy mümkin.\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization sahypasyna serediň.",
        "img-auth-notindir": "Talap edlýän ýol sazlanan ýükleme direktoriýasynda däl.",
        "img-auth-badtitle": "\"$1\" bilen dogry bir at gurup bolanok.",
        "img-auth-nologinnWL": "Sessiýa açmansyňyz, \"$1\" bolsa ak sanawda däl.",
        "watchlist-details": "Çekişme sahypalaryny hasap etmäniňde, gözegçilik sanawyňyzda {{PLURAL:$1|$1 sahypa|$1 sahypa}} bar.",
        "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.",
-       "watchmethod-recent": "soňky özgerdişlerdäki gözegçilikde saklaýan sahypalaryňyz barlanylýar",
-       "watchmethod-list": "gözegçilikde saklaýan sahypalaryňyzdaky soňky özgerdişler barlanylýar",
-       "watchlistcontains": "Gözegçilik sanawyňyzda $1 sany {{PLURAL:$1|sahypa|sahypa}} bar.",
-       "iteminvalidname": "'$1' elementinde problema bar, nädogry at...",
        "wlshowlast": "Soňky $1 sagady $2 güni görkez $3",
        "watchlist-options": "Gözegçilik sanawynyň opsiýalary",
        "watching": "Gözegçilige alynýar...",
        "enotif_lastvisited": "Iň soňky gezek baryp göreliňiz bäri bolan ähli üýtgeşmeleri görmek üçin serediň: $1",
        "enotif_lastdiff": "Bu üýtgeşmäni görmek üçin serediň: $1",
        "enotif_anon_editor": "anonim ulanyjy $1",
-       "enotif_body": "Hormatly $WATCHINGUSERNAME,\n\n{{SITENAME}} saýtyndaky $PAGETITLE sahypasy $PAGEEDITDATE senesinde $PAGEEDITOR tarapyndan $CHANGEDORCREATED. Sahypanyň häzirki wersiýasyny $PAGETITLE_URL adresinden görüp bilersiňiz.\n\n$NEWPAGE\n\nRedaktoryň düşündirişi: $PAGESUMMARY $PAGEMINOREDIT\n\nRedaktor bilen habarlaşmak üçin:\ne-poçta: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nBu sahypany baryp görýänçäňiz onuň bilen baglanyşykly üýtgeşmeler size habar ediljek däldir.\nŞeýle hem gözegçilik sanawyňyzdaky ähli sahypalaryň habar beriş belliklerini aýyryp bilersiňiz.\n\n               {{SITENAME}} saýtynyň habar beriş ulgamy.\n\n--\nGözegçilik sanawy sazlamalaryňyzy üýtgetmek üçin:\n{{canonicalurl:Special:Watchlist/edit}}\n\nSahypany gözegçilik sanawyňyzdan öçürmek üçin:\n$UNWATCHURL\n\nSeslenme we goşmaça kömek:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Hormatly $WATCHINGUSERNAME,\n\n{{SITENAME}} saýtyndaky $PAGETITLE sahypasy $PAGEEDITDATE senesinde $PAGEEDITOR tarapyndan $CHANGEDORCREATED. Sahypanyň häzirki wersiýasyny $PAGETITLE_URL adresinden görüp bilersiňiz.\n\n$NEWPAGE\n\nRedaktoryň düşündirişi: $PAGESUMMARY $PAGEMINOREDIT\n\nRedaktor bilen habarlaşmak üçin:\ne-poçta: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nBu sahypany baryp görýänçäňiz onuň bilen baglanyşykly üýtgeşmeler size habar ediljek däldir.\nŞeýle hem gözegçilik sanawyňyzdaky ähli sahypalaryň habar beriş belliklerini aýyryp bilersiňiz.\n\n               {{SITENAME}} saýtynyň habar beriş ulgamy.\n\n--\nGözegçilik sanawy sazlamalaryňyzy üýtgetmek üçin:\n{{canonicalurl:Special:Watchlist/edit}}\n\nSahypany gözegçilik sanawyňyzdan öçürmek üçin:\n$UNWATCHURL\n\nSeslenme we goşmaça kömek:\n$HELPPAGE",
        "created": "döredildi",
        "changed": "üýtgedildi",
        "deletepage": "Sahypany öçür",
        "blockip": "Ulanyjyny blokirle",
        "blockip-legend": "Ulanyjyny blokirle",
        "blockiptext": "Aşakdaky formdan peýdalanyp, belli bir IP-niň ýa-da ulanyjy adynyň ýazmak hukugyny blokirläp bilersiňiz.\nBu diňe wandalizmiň öňüni almak üçin hem-de [[{{MediaWiki:Policy-url}}|kadalara]] laýyklykda edilmelidir.\nAşakda blokirlemäniň takyk sebäbini ýazyň (meselem: wandalizm eden sahypalaryny görkeziň).",
-       "ipadressorusername": "IP adresi ýa-da ulanyjy ady:",
+       "ipaddressorusername": "IP adresi ýa-da ulanyjy ady:",
        "ipbexpiry": "Gutarýan wagty:",
        "ipbreason": "Sebäp:",
        "ipbreason-dropdown": "*Adaty blokirleme sebäpleri\n** Ýalan maglumat girizmek\n** Sahypalaryň mazmunyny aýyrmak\n** Daşarky saýtlara spam çykgydy goýmak\n** Sahypalara manysyz/düşnüksiz sözler girizmek\n** Haýbat atyjy hereket/Yrsaramak\n** Birden köp hasaby betniýetli ulanmak\n** Kabul edip bolmajak ulanyjy ady",
        "tooltip-undo": "\"Yzyna al\" bu özgerdişi yzyna getirýär we özgerdiş formuny synlaw modunda açýar. Yzyna almagyň sebäbini ýazmaga mümkinçilik berýär.",
        "tooltip-preferences-save": "Ileri tutmalary ýazdyr",
        "tooltip-summary": "Gysgaça düşündiriş giriziň",
-       "notacceptable": "Bu wiki serweri brauzeriňiziň okap biljek formatynda maglumat üpjün edip bilmeýär.",
        "anonymous": "{{SITENAME}} anonim {{PLURAL:$1|ulanyjysy|ulanyjylary}}",
        "siteuser": "{{SITENAME}} ulanyjysy $1",
        "anonuser": "{{SITENAME}} anonim ulanyjysy $1",
        "newimages-summary": "Bu ýörite sahypa iň soňky ýüklenen faýllary görkezýär.",
        "newimages-legend": "Filtr",
        "newimages-label": "Faýlyň ady (ýa-da bir bölegi):",
-       "showhidebots": "(botlary $1)",
        "noimages": "Görmäge zat ýok.",
        "ilsubmit": "Gözle",
        "bydate": "sene boýunça",
        "autosumm-replace": "Mazmun '$1' bilen çalşyryldy",
        "autoredircomment": "[[$1]] sahypasyna gönükdirildi",
        "autosumm-new": "Sahypa döretdi, mazmuny: '$1'",
-       "livepreview-loading": "Ýüklenýär...",
-       "livepreview-ready": "Ýüklenýär... Taýýar!",
-       "livepreview-failed": "Gönümel deslapky syn şowsuz boldy! Adaty deslapky syny synap görüň.",
-       "livepreview-error": "Birigip bolmady: $1 \"$2\".\nAdaty deslapky syny synap görüň.",
        "lag-warn-normal": "$1 {{PLURAL:$1|sekuntdan|sekuntdan}} täzeki üýtgeşmeler bu sanawda görkezilmän biler.",
        "lag-warn-high": "Maglumat bazasyndaky uly gijikme zerarly, $1 {{PLURAL:$1|sekuntdan|sekuntdan}} täzeki üýtgeşmeler bu sanawda görkezilmän biler.",
-       "watchlistedit-numitems": "Gözegçilik sanawyňyzda çekişme sahypalaryny hasap etmäniňde {{PLURAL:$1|1 sany at|$1 sany at}} bar.",
-       "watchlistedit-noitems": "Gözegçilik sanawyňyzda hiç hili at ýok.",
        "watchlistedit-normal-title": "Gözegçilik sanawyny redaktirle",
        "watchlistedit-normal-legend": "Gözegçilik sanawyndan atlary aýyr",
        "watchlistedit-normal-explain": "Gözegçilik sanawyňyzdaky atlar aşakda görkezilýär.\nAt aýyrmak üçin gapdalyndaky gutujygy belläp, \"{{int:Watchlistedit-normal-submit}}\" düwmesine basyň.\n[[Special:EditWatchlist/raw|Işlenmedik sanawy hem redaktirläp]] bilersiňiz.",
        "compare-rev1": "Wersiýa 1",
        "compare-rev2": "Wersiýa 2",
        "compare-submit": "Deňeşdir",
-       "dberr-header": "Bu wikiniň bir problemasy bar",
        "dberr-problems": "Bagyşlaň! Bu saýtda tehniki kynçylyklar ýüze çykdy.",
        "dberr-again": "Birnäçe minut garaşyň we gaýtadan ýükläp görüň.",
        "dberr-info": "(Maglumat bazasynyň serwerine birigip bolanok: $1)",
index 72cb110..395ba26 100644 (file)
@@ -11,7 +11,8 @@
                        "Namayan",
                        "Sky Harbor",
                        "tl.wikipedia.org sysops",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Pagsasalungguhit ng link:",
        "readonly_lag": "Automatikong kinandado ang kalipunan ng datos habang humahabol ang mga aliping serbidor sa pinunong kalipunan nito",
        "internalerror": "Kamaliang panloob",
        "internalerror_info": "Kamaliang panloob: $1",
-       "fileappenderrorread": "Hindi mabasa ang \"$1\" habang inilalakip.",
-       "fileappenderror": "Hindi mailakip ang \"$1\" sa \"$2\".",
        "filecopyerror": "Hindi makopya ang talaksang \"$1\" sa \"$2\".",
        "filerenameerror": "Hindi mapalitan ang pangalan ng talaksang \"$1\" sa \"$2\".",
        "filedeleteerror": "Hindi mabura ang talaksang \"$1\".",
        "directorycreateerror": "Hindi malikha ang direktoryong \"$1\".",
        "filenotfound": "Hindi mahanap ang talaksang \"$1\".",
-       "fileexistserror": "Hindi makapagsulat sa talaksang \"$1\": umiiral ang talaksan",
        "unexpected": "Hindi inaasahang halaga: \"$1\"=\"$2\".",
        "formerror": "Kamalian: hindi maipadala ang pormularyo",
        "badarticleerror": "Hindi maisasagawa ang gawaing ito sa pahinang ito.",
        "virus-unknownscanner": "hindi kilalang panlaban sa birus:",
        "logouttext": "<strong>Nakaalis ka na sa pagkaka-login.</strong>\n\nTandaan na may ilang mga pahina na patuloy na nagpapakita na parang hindi ka naka-login, hanggang alisin mo ang iyong <i>browser cache</i>.",
        "welcomeuser": "Mabuhay, $1!",
-       "welcomecreation-msg": "Nilikha na ang iyong kuwenta.\nHuwag kalimutang baguhin ang iyong [[Special:Preferences|mga kagustuhan sa {{SITENAME}}]].",
+       "welcomecreation-msg": "Nilikha na ang iyong account.\nHuwag kalimutang baguhin ang iyong [[Special:Preferences|mga kagustuhan sa {{SITENAME}}]].",
        "yourname": "Bansag:",
        "userlogin-yourname": "Pangalan",
        "userlogin-yourname-ph": "Ilagay ang iyong pangalan",
        "userlogin-signwithsecure": "Gumamit ng ligtas na koneksyon",
        "yourdomainname": "Dominyo mo:",
        "password-change-forbidden": "Hindi mo maaaring palitan ang mga password sa wiking ito.",
-       "externaldberror": "Maaaring may kamalian sa pagpapatotoo ng kalipunan ng mga dato o kaya hindi ka pinahintulutang isapanahon ng iyong panlabas na kuwenta o patnugutan.",
+       "externaldberror": "Maaaring may kamalian sa pagpapatotoo ng database o kaya hindi ka pinahintulutang isapanahon ng iyong panlabas na account.",
        "login": "Lumagda",
        "nav-login-createaccount": "Lumagda / lumikha ng account",
        "loginprompt": "Dapat na pinapahintulutan mo ang mga kuki (''cookie'') upang makalagda sa {{SITENAME}}.",
        "userlogin": "Lumagda / lumikha ng account",
        "userloginnocreate": "Lumagda",
-       "logout": "Umalis sa pagkakalagda",
-       "userlogout": "Umalis sa pagkakalagda",
+       "logout": "Umalis sa pagkaka-login",
+       "userlogout": "Umalis sa pagkaka-login",
        "notloggedin": "Hindi nakalagda",
-       "userlogin-noaccount": "Wala ka pa bang akawnt?",
+       "userlogin-noaccount": "Wala ka pa bang account?",
        "userlogin-joinproject": "Sumali sa {{SITENAME}}",
        "nologin": "Wala ka pang account? $1.",
        "nologinlink": "Lumikha ng account",
-       "createaccount": "Lumikha ng akawnt",
+       "createaccount": "Lumikha ng account",
        "gotaccount": "May account ka na ba? $1.",
        "gotaccountlink": "Lumagda",
        "userlogin-resetlink": "Nakalimutan mo ang iyong mga detalyeng pang-login?",
        "userlogin-resetpassword-link": "Nakalimutan ba ang iyong password?",
        "userlogin-helplink2": "Tulong sa pag-login",
        "userlogin-loggedin": "Naka-login ka na bilang {{GENDER:$1|$1}}. Gamitin ang form sa ibaba upang maka-login bilang ibang tagagamit o user.",
-       "userlogin-createanother": "Lumikha ng iba pang akawnt",
-       "createacct-join": "Ilagay ang iyong impormasyon sa ibaba.",
-       "createacct-another-join": "Ilagay ang impormasyon ng bagong akawnt sa ibaba.",
+       "userlogin-createanother": "Lumikha ng iba pang account",
        "createacct-emailrequired": "Direksiyong e-liham:",
        "createacct-emailoptional": "Email (hindi kailangan)",
        "createacct-email-ph": "Ipasok ang iyong email address",
        "createacct-realname": "Tunay na pangalan (maaaring wala)",
        "createaccountreason": "Dahilan:",
        "createacct-reason": "Dahilan",
-       "createacct-reason-ph": "Bakit ka gagawa ng isa pang akawnt?",
+       "createacct-reason-ph": "Bakit ka gagawa ng isa pang account?",
        "createacct-captcha": "Siyasatin ang seguridad",
        "createacct-imgcaptcha-ph": "Ilagay ang tekstong makikita sa itaas.",
-       "createacct-submit": "Likhain ang iyong akawnt",
-       "createacct-another-submit": "Lumikha ng ibang akawnt",
+       "createacct-submit": "Likhain ang iyong account",
+       "createacct-another-submit": "Lumikha ng ibang account",
        "createacct-benefit-heading": "{{SITENAME}} ay nilikha ng mga taong iyong katulad.",
        "createacct-benefit-body1": "{{PLURAL:$1|pagbabago|mga pagbabago}}",
        "createacct-benefit-body2": "{{PLURAL:$1|pahina|mga pahina}}",
        "badretype": "Hindi magkatugma ang ipinasok mong mga password.",
        "userexists": "May gumagamit na ng ipinasok na bansag.\nPumili po ng ibang pangalan.",
        "loginerror": "Kamalian sa paglagda",
-       "createacct-error": "May pagkakamali sa paglikha ng akawnt",
+       "createacct-error": "May pagkakamali sa paglikha ng account",
        "createaccounterror": "Hindi mailikha ang account: $1",
-       "nocookiesnew": "Nalikha ang kuwenta ng tagagamit, ngunit hindi ka nakalagda.\nGumagamit ang {{SITENAME}} ng mga kuki (''cookies'') upang makalagda ang mga tagagamit.\nHindi pinapagana ng pambasa-basa mo ang mga kuki.\nPaganahin ito ang subukang lumagda na kasama ang bagong bansag (''username'') at hudyat (''password'').",
+       "nocookiesnew": "Nalikha ang account ng tagagamit, ngunit hindi ka nakalogin.\nGumagamit ang {{SITENAME}} ng cookies upang makalogin ang mga tagagamit.\nHindi pinapagana ng browser mo ang cookies.\nPaganahin ito at subukang lumagda na kasama ang bagong pangalan at password.",
        "nocookieslogin": "Gumagamit ang {{SITENAME}} ng mga kuki (''cookies'') para mailagda ang mga tagagamit.\nHindi mo pinagagana ang mga kuki.\nPaki-andar mo ang mga ito at sumubok uli.",
-       "nocookiesfornew": "Hindi nalikha ang kuwenta ng tagagamit, dahil hindi namin matiyak ang pinagmulan nito. \nTiyaking mayroon kang pinagaganang mga kuki, ikarga muli ang pahinang ito at subukan muli.",
+       "nocookiesfornew": "Hindi nalikha ang account ng tagagamit, dahil hindi namin matiyak ang pinagmulan nito. \nTiyaking mayroon kang pinagaganang cookies, ikarga muli ang pahinang ito at subukan muli.",
        "nocookiesforlogin": "{{int:nocookieslogin}}",
        "noname": "Hindi mo tinukoy ang isang tanggap na pangalan ng tagagamit.",
        "loginsuccesstitle": "Matagumpay ang paglagda",
        "loginsuccess": "'''Nakalagda ka na sa {{SITENAME}} bilang si \"$1\".'''",
-       "nosuchuser": "Walang tagagamit na may pangalang \"$1\".\nMaselan sa pagtitipa ang mga pangalan ng tagagamit.\nSuriin ang iyong pagbabaybay, o [[Special:UserLogin/signup|lumikha ng bagong kuwenta]].",
+       "nosuchuser": "Walang tagagamit na may pangalang \"$1\".\nMaselan sa pagtitipa ang mga pangalan ng tagagamit.\nSuriin ang iyong pagbabaybay, o [[Special:UserLogin/signup|lumikha ng bagong account]].",
        "nosuchusershort": "Walang tagagamit na may pangalang \"$1\".\nPakitingnan ang iyong pagbabaybay.",
        "nouserspecified": "Kailangang tukuyin mo ang isang pangalang pantagagamit.",
        "login-userblocked": "Hinarang ang tagagamit na ito.  Hindi pinahihintulutan ang paglalagda.",
        "passwordremindertext": "Mayroong (na maaaring ikaw, mula sa adres ng IP na $1) humiling ng isang bagong\npassword para sa {{SITENAME}} ($4). Isang pansamantalang password ang nilikha\npara sa tagagamit na \"$2\" at itinakda sa \"$3\".  Kung ito ang iyong pakay,\nkailangan mo na ngayong mag-login at pumili ng isang bagong password.\nMawawala/magtatapos ang bisa ang pansamantala mong password sa loob ng {{PLURAL:$5|isang araw|$5 araw}}.\n\nKung ibang tao ang humiling nito, o kung naalala mo na ang iyong password,\nat hindi mo na ibig pang baguhin ito, maaari mong huwag pansinin ang mensaheng ito at\nmagpatuloy sa paggamit ng iyong lumang password.",
        "noemail": "Walang nakatalang adres ng e-liham para sa tagagamit na \"$1\".",
        "noemailcreate": "Kailangan mong magbigay ng may-bisang direksiyong e-liham",
-       "passwordsent": "Isang bagong hudyat ang ipinadala sa adres ng e-liham na nakatala para kay \"$1\".\nLumagda/Tumala lang po muli pagkaraan mong matanggap ito.",
+       "passwordsent": "Isang bagong password ang ipinadala sa email address na nakatala para kay \"$1\".\nPaki login muli pagkaraan mong matanggap ito.",
        "blocked-mailpassword": "Hinarangan sa paggawa ng mga pagbabago ang iyong adres ng IP, at kaya hindi rin pinapahintulutang gumamit ng tungkuling makabawi ng hudyat para maiwasan ang pangaabuso.",
-       "eauthentsent": "Nagpadala ng isang email na pangkompirmasyon doon sa tinukoy na email address.\nBago magpadala ng iba email sa akawnt, kailangan mong sundin ang mga tagubiling nasa loob ng email, para mapatunayang iyo talaga ang akawnt.",
+       "eauthentsent": "Nagpadala ng isang email na pangkompirmasyon doon sa tinukoy na email address.\nBago magpadala ng iba email sa account, kailangan mong sundin ang mga tagubiling nasa loob ng email, para mapatunayang iyo talaga ang account.",
        "throttled-mailpassword": "Nagpadala na ng isang paalalang pang-password, nitong huling {{PLURAL:$1|oras|$1 oras}}.\nPara maiwasin ang pangaabuso, isang paalalang pang-password lamang ang ipapadala bawat {{PLURAL:$1|oras|$1 oras}}.",
        "mailerror": "Kamalian sa pagpapadala ng liham: $1",
-       "acct_creation_throttle_hit": "Ang mga panauhin sa wiking ito na gumagamit ng direksiyong IP mo ay nakalikha na ng {{PLURAL:$1|1 kuwenta|$1 kuwenta}} sa loob ng huling araw, na siyang pinakamataas na pinapahintulutan sa loob ng sakop ng panahong ito.\nBilang kinalabasan, ang mga panauhing gumagamit ng ganitong direksiyong IP ay hindi na muna makakalikha ng anumang karagdagang kuwenta sa ngayon.",
+       "acct_creation_throttle_hit": "Ang mga panauhin sa wiking ito na gumagamit ng IP address mo ay nakalikha na ng $1 account sa loob ng huling araw, na siyang pinakamataas na pinapahintulutan sa loob ng sakop ng panahong ito.\nBilang kinalabasan, ang mga panauhing gumagamit ng ganitong IP address ay hindi na muna makakalikha ng anumang karagdagang account sa ngayon.",
        "emailauthenticated": "Napatunayan na ang iyong email address sa $2 noong $3.",
        "emailnotauthenticated": "Hindi pa napapatunayan ang iyong email address.\nWalang email na ipapadala para sa anumang sumusunod na mga tampok o features.",
        "noemailprefs": "Tumukoy ng isang direksiyong e-liham sa loob ng mga nais mo upang gumana ang mga kasangkapang-katangiang ito.",
        "cannotchangeemail": "Hindi maaaring baguhin ang mga direksiyong e-liham sa wiking ito.",
        "emaildisabled": "Ang sityong ito ay hindi makapagpapadala ng mga e-liham.",
        "accountcreated": "Nilikha na ang account",
-       "accountcreatedtext": "Nilikha na ang kuwenta ng tagagamit para kay [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]).",
+       "accountcreatedtext": "Nilikha na ang account ng tagagamit para kay [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]).",
        "createaccount-title": "Paglikha ng account para sa {{SITENAME}}",
-       "createaccount-text": "May lumikha ng kuwenta para sa iyong adres ng e-liham sa {{SITENAME}} ($4) na pinangalanang \"$2\", na may hudyat na \"$3\".\nDapat kang tumala at baguhin ang hudyat mo ngayon.\n\nMaaari mong huwag pansinin ang mensaheng ito, kung mali ang paglikha ng kuwentang ito.",
+       "createaccount-text": "May lumikha ng account para sa iyong email address sa {{SITENAME}} ($4) na pinangalanang \"$2\", na may password na \"$3\".\nDapat kang mag-login at baguhin ang password mo ngayon.\n\nMaaari mong huwag pansinin ang mensaheng ito, kung mali ang paglikha ng account na ito.",
        "login-throttled": "Masyadong madami ang kamakailan lamang mong pagsubok sa pag-login.\nMaghintay po muna ng $1 bago subukan uli.",
        "login-abort-generic": "Bigo ang paglagda mo - Pinigil",
        "loginlanguagelabel": "Wika: $1",
        "createacct-another-realname-tip": "Hindi kinakailangan ang tunay na pangalan.\nKung nais mo na ibigay ito, gagamitin ito para sa pagbibigay ng atribusyon para sa kanilang gawa.",
        "pt-login": "Mag-login",
        "pt-login-button": "Mag-login",
-       "pt-createaccount": "Lumikha ng akawnt",
+       "pt-createaccount": "Lumikha ng account",
        "pt-userlogout": "Umalis sa pagkakatala",
        "php-mail-error-unknown": "Hindi malamang kamalian sa tungkulin ng liham ng PHP ()",
        "user-mail-no-addy": "Sinubukang magpadala ng e-liham na walang tirahan na para sa e-liham.",
        "changepassword": "Baguhin ang password",
        "resetpass_announce": "Para sa ganap na pagtala, magtalaga ng panibagong password.",
        "resetpass_text": "<!-- Magdagdag ng teksto rito -->",
-       "resetpass_header": "Baguhin ang password ng akawnt",
+       "resetpass_header": "Baguhin ang password ng account",
        "oldpassword": "Lumang password:",
        "newpassword": "Bagong password:",
        "retypenew": "Ipasok muli ang bagong password:",
        "passwordreset-capture-help": "Kapag tsetsekan mo ang kahong ito, ang e-liham (may pansamantalang hudyat) ay ipapakita sa iyo at ipapadala rin sa tagagamit.",
        "passwordreset-email": "Direksiyong e-liham:",
        "passwordreset-emailtitle": "Mga detalye ng account sa {{SITENAME}}",
-       "passwordreset-emailtext-ip": "Isang tao (marahil ay ikaw, mula sa IP address na $1) ang humiling ng isang paalala sa iyong mga detalye ng kuwenta para sa {{SITENAME}} ($4). Ang sumusunod na {{PLURAL:$3|akawant ng tagagamit ay|mga akawnt ng tagagamit ay}} may kaugnayan sa email address na ito:\n\n$2\n\n{{PLURAL:$3|Ang pansamantalang hudyat na ito|Ang mga pansamantalang hudyat na ito}} ay mawawalan ng bisa sa loob ng {{PLURAL:$5|isang araw|$5 araw}}.\nDapat kang mag-login at pumili ng isang bagong password ngayon. Kung ibang tao ang gumawa ng kahilingang ito, o kung naalala mo na ang orihinal mong password, at hindi mo na nais palitan ito, maaari mong huwag nang pansinin ang mensaheng ito at magpatuloy sa paggamit ng luma mong password.",
+       "passwordreset-emailtext-ip": "Isang tao (marahil ay ikaw, mula sa IP address na $1) ang humiling ng isang paalala sa iyong mga detalye ng account para sa {{SITENAME}} ($4). Ang sumusunod na {{PLURAL:$3|account ng tagagamit ay|mga account ng tagagamit ay}} may kaugnayan sa email address na ito:\n\n$2\n\n{{PLURAL:$3|Ang pansamantalang password na ito|Ang mga pansamantalang password na ito}} ay mawawalan ng bisa sa loob ng {{PLURAL:$5|isang araw|$5 araw}}.\nDapat kang mag-login at pumili ng isang bagong password ngayon. Kung ibang tao ang gumawa ng kahilingang ito, o kung naalala mo na ang orihinal mong password, at hindi mo na nais palitan ito, maaari mong huwag nang pansinin ang mensaheng ito at magpatuloy sa paggamit ng luma mong password.",
        "passwordreset-emailtext-user": "Ang tagagamit na si $1 sa {{SITENAME}} ay humiling ng isang paalala ng iyong mga akawnt ng detalye para sa {{SITENAME}}\n($4). Ang sumusunod na pangtagagamit na {{PLURAL:$3|akawnt ay|mga akawnt ay}} may kaugnayan sa tirahang ito ng e-liham:\n\n$2\n\n{{PLURAL:$3|Ang pansamantalang hudyat na ito|Ang pansamantalang mga hudyat na ito}} mawawalan ng bias sa loob ng {{PLURAL:$5|isang araw|$5 mga araw}}.\nDapat kang lumagda at pumili ng isang hudyat ngayon. Kung ibang tao ang gumawa ng kahilingang ito, o kung naalala mo na ang iyong orihinal na hudyat, at hindi mo na nais palitan pa ito, maaari mong huwag nang pansinin ang mensaheng ito at magpatuloy sa paggamit ng iyong lumang hudyat.",
        "passwordreset-emailelement": "Pangalan ng tagagamit: $1\nPansamantalang password: $2",
        "passwordreset-emailsent": "Naipadala na ang isang e-liham na pampaalala.",
        "savearticle": "Itala ang pahina",
        "preview": "Paunang tingin",
        "showpreview": "Ipakita ang paunang tingin",
-       "showlivepreview": "Buhay na paunang tingin",
        "showdiff": "Ipakita ang mga pagbabago",
        "anoneditwarning": "'''Babala:''' Hindi ka nakalagda.\nMatatala ang iyong direksiyong IP sa kasaysayan ng pagbabago ng pahinang ito.",
        "anonpreviewwarning": "''Hindi ka nakalagda.  Itatala sa inyong pagtatala ang inyong direksiyong IP sa kasaysayan ng pagbabago ng pahinang ito.''",
        "accmailtext": "Ipinadala na sa $2 ang isang hudyat na nilikha ng pagkakataon para kay [[User talk:$1|$1]].  Maaari itong baguhin sa pahinang ''[[Special:ChangePassword|palitan ng hudyat]]'' kapag lumagdang papasok.",
        "newarticle": "(Bago)",
        "newarticletext": "Sinundan mo ang isang kawing para sa isang pahinang hindi pa umiiral.\nPara likhain ang pahina, magsimulang magmakinilya sa loob ng kahong nasa ibaba (tingnan ang [$1 pahina ng tulong] para sa mas maraming kabatiran).\nKung napunta ka rito dahil sa pagkakamali, pakipindot ang pinduntang '''balik''' ('''''back''''') ng iyong pantingin-tingin (''browser'').",
-       "anontalkpagetext": "Ito ang pahinang usapan para sa isang hindi nakikilalang tagagamit na hindi pa lumilikha ng kuwenta, o kaya hindi ito ginagamit.\nKaya't kinailangan naming gamitin ang may bilang na direksiyonng IP para makilala siya.\nMaaaring pagsaluhan ng ilang mga tagagamit ang ganiyang  direksiyong IP.\nKung isa kang hindi nagpapakilalang tagagamit at nakadaramang may mga walang saysay na komentong patungkol sa iyo, [[Special:UserLogin/signup|pakilikha ng isang kuwenta]] o [[Special:UserLogin|lumagda]] para maiwasan ang kalituhan o mapagkamalan ka bilang ibang hindi nakikilalang mga tagagamit sa hinaharap.",
+       "anontalkpagetext": "Ito ang pahinang usapan para sa isang hindi nakikilalang tagagamit na hindi pa lumilikha ng account, o kaya hindi ito ginagamit.\nKaya't kinailangan naming gamitin ang may bilang na IP address para makilala siya.\nMaaaring pagsaluhan ng ilang mga tagagamit ang ganiyang  IP address.\nKung isa kang hindi nagpapakilalang tagagamit at nakadaramang may mga walang saysay na komentong patungkol sa iyo, [[Special:UserLogin/signup|pakilikha ng isang account]] o [[Special:UserLogin|lumagda]] para maiwasan ang kalituhan o mapagkamalan ka bilang ibang hindi nakikilalang mga tagagamit sa hinaharap.",
        "noarticletext": "Kasalukuyang walang teksto sa loob ng pahinang ito.\nMaaari mong [[Special:Search/{{PAGENAME}}|hanapin ang pamagat ng pahinang ito]] sa loob iba pang mga pahina,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} maghanap sa kaugnay na mga talaan],\no [{{fullurl:{{FULLPAGENAME}}|action=edit}} baguhin ang pahinang ito]</span>.",
        "noarticletext-nopermission": "Kasalukuyang walang teksto sa pahinang ito.\nMaaari mong [[Special:Search/{{PAGENAME}}|hanapin ang pamagat ng pahinang ito]] sa ibang mga pahina,\no <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} maghanap sa kaugnay na mga talaan]</span>.",
        "missing-revision": "Hindi umiiral ang rebisyong #$1 ng pahinang napangalanang \"{{FULLPAGENAME}}\".\n\nKaraniwang itong dulot ng pagsunod sa isang wala na sa panahong kawing ng kasaysayan na papunta sa isang pahinang nabura na.\nMatatagpuan ang mga detalye sa loob ng [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} talaan ng pagbura].",
-       "userpage-userdoesnotexist": "Hindi nakatala ang kuwenta ng tagagamit na \"<nowiki>$1</nowiki>\".\nPakisuri kung ibig mong likhain/baguhin ang pahinang ito.",
-       "userpage-userdoesnotexist-view": "Hindi nakatala ang kuwenta ng tagagamit na \"$1\".",
+       "userpage-userdoesnotexist": "Hindi nakatala ang account ng tagagamit na \"<nowiki>$1</nowiki>\".\nPakisuri kung ibig mong likhain/baguhin ang pahinang ito.",
+       "userpage-userdoesnotexist-view": "Hindi nakatala ang account ng tagagamit na \"$1\".",
        "blocked-notice-logextract": "Kasalukuyang hinarang ang tagagamit na ito.\nAng pinakahuling entrada sa talaan  ng pagharang ay ibinigay sa baba para sa inyong pagsasangguni:",
        "clearyourcache": "'''Paunawa: Pagkatapos magsagip, maaaring kailanganing mong laktawan ang taguan ng iyong pantingin-tingin upang makita ang mga pagbabago.\n'''Firefox / Safari:''' Panatilihin ang pagpindot sa ''Shift'' habang nilalagitik ang ''Reload'', o pindutin ang ''Ctrl-F5'' o ''Ctrl-R'' (''⌘-R'' sa isang Mac)\n'''Google Chrome:''' Pindutin ang ''Ctrl-Shift-R'' (''⌘-Shift-R'' sa isang Mac)\n'''Internet Explorer:''' Panatilihin ang pagpindot sa ''Ctrl'' habang nilalagitik ang ''Refresh'', o pindutin ang ''Ctrl-F5''\n'''Opera:''' Hawiin ang taguan sa loob ng ''Tools → Preferences''",
        "usercssyoucanpreview": "'''Balato:''' Gamitin ang pindutang \"{{int:showpreview}}\" upang masubok ang bago mong CSS bago sagipin.",
        "continue-editing": "Pumunta sa pook ng pamamatnugot",
        "previewconflict": "Ipinamamalas ng paunang tinging ito ang teksto sa loob ng pangitaas na pook-patnugutan ng teksto ayon sa lilitaw na anyo nito kapag pinili mo ang pagsagip.",
        "session_fail_preview": "'''Paumanhin! Hindi namin maproseso ang iyong pagbabago hinggil sa pagkawala ng datos ng sesyon.'''\nPakiulit muli.\nKung hindi ito gumana, subukang [[Special:UserLogout|umalis sa pagkalagda]] at bumalik muli.",
-       "session_fail_preview_html": "'''Paumanhin! Hindi namin maproseso ang iyong pagbabago hinggil sa pagkawala ng datos ng sesyon.'''\n\n''Dahil naka-andar ang hilaw na HTML sa {{SITENAME}}, nakatago ang paunang tingin bilang pag-iingat sa mga paglusob ng JavaScript.''\n\n'''Kung lehitimong pagbabago ito, paki-ulit muli.'''\nKung hindi pa rin ito gumagana, subukang [[Special:UserLogout|umalis sa pagkakalagda]] at lumagda muli.",
+       "session_fail_preview_html": "'''Paumanhin! Hindi namin maproseso ang iyong pagbabago hinggil sa pagkawala ng datos ng sesyon.'''\n\n''Dahil naka-andar ang hilaw na HTML sa {{SITENAME}}, nakatago ang paunang tingin bilang pag-iingat sa mga paglusob ng JavaScript.''\n\n'''Kung lehitimong pagbabago ito, paki-ulit muli.'''\nKung hindi pa rin ito gumagana, subukang [[Special:UserLogout|mag-logout]] at mag-login muli.",
        "token_suffix_mismatch": "'''Hindi tinanggap ang iyong pagbabago dahil sinira ng kliyente ang mga karakter na bantas sa ''token'' ng mamatnugot.\nTinanggihan ang pagbabago upang maiwasan ang korapsyon ng teksto ng artikulo.\nKadalasang nangyayari ito kapag gumagamit ka ng masurot na serbisyo ng hindi-nakikilalang apoderadong (''anonymous proxy'') nasa web.",
        "edit_form_incomplete": "'''Ilan sa mga bahagi ng pormularyong pampatnugot ay hindi nakarating sa tagapaghain; suriing muli na ang iyong mga pagbabago ay buo at subukang muli.'''",
        "editing": "Binabago ang $1",
        "hiddencategories": "Ang pahinang ito ay kasapi sa {{PLURAL:$1|1 nakatagong kategorya|$1 nakatagong kategorya}}:",
        "edittools": "<!-- Ang teksto rito ay ipapakita sa ilalim ng mga pormularyo ng pagbabago at pagkarga. -->",
        "edittools-upload": "-",
-       "nocreatetext": "Naglagay ng hangganan (restriksyon/limitasyon) ang {{SITENAME}} sa kakayahang makalikha ng bagong mga pahina.\nMaaari kang bumalik at magbago ng isang umiiral na pahina, o kaya [[Special:UserLogin|lumagda o lumikha ng kuwenta (''account'')]].",
+       "nocreatetext": "Naglagay ng hangganan ang {{SITENAME}} sa kakayahang makalikha ng bagong mga pahina.\nMaaari kang bumalik at magbago ng isang umiiral na pahina, o kaya [[Special:UserLogin|maglogin o lumikha ng account]].",
        "nocreate-loggedin": "Wala kang pahintulot para lumikha ng bagong mga pahina.",
        "sectioneditnotsupported-title": "Hindi sinusuportahan ang pagpapatnugot ng seksyon",
        "sectioneditnotsupported-text": "Hindi sinusuportahan ang pagpapatnugot ng seksyon sa pahinang ito.",
        "edit-gone-missing": "Hindi maisapanahon ang pahina.\nTila binura na ito.",
        "edit-conflict": "Alitan sa pagbabago.",
        "edit-no-change": "Binalewala ang pagbabago mo, dahil walang pagbabagong ginawa sa teksto.",
-       "postedit-confirmation": "Naitala na ang iyong pagbabago.",
+       "postedit-confirmation-saved": "Naitala na ang iyong pagbabago.",
        "edit-already-exists": "Hindi makalikha ng isang bagong pahina.\nUmiiral na ito.",
        "defaultmessagetext": "Nakatakdang teksto ng mensahe",
        "editwarning-warning": "Ang paglisan mula sa pahinang ito ay maaaring makasanhi sa iyo ng pagkawala ng anumang mga pagbabagong ginawa mo.\nKung nakalagda ka, maaari mong huwag paganahin ang babalang ito sa loob ng seksyong \"May binabago\" ng mga nais mo.",
        "undo-norev": "Hindi matanggal ang pagbabago dahil hindi ito umiiral o nabura na.",
        "undo-summary": "Tanggalin ang pagbabagong $1 ni [[Special:Contributions/$2|$2]] ([[User talk:$2|Usapan]])",
        "cantcreateaccounttitle": "Hindi malikha ang account",
-       "cantcreateaccount-text": "Hinarang ni [[User:$3|$3]] ang paglikha ng kuwenta mula sa adres ng IP ('''$1''') na ito.\n\nAng dahilang ibinigay ni $3 ay ''$2''",
+       "cantcreateaccount-text": "Hinarang ni [[User:$3|$3]] ang paglikha ng acciybt mula sa IP address ('''$1''') na ito.\n\nAng dahilang ibinigay ni $3 ay ''$2''",
        "viewpagelogs": "Tingnan ang mga pagtatala para sa pahinang ito",
        "nohistory": "Walang kasaysayan ng pagbabago para sa pahinang ito.",
        "currentrev": "Pangkasalukuyang pagbabago",
        "searchmenu-exists": "'''Mayroong pahinang may pangalang \"[[:$1]]\" dito sa wiking ito'''",
        "searchmenu-new": "'''Likhain ang pahinang \"[[:$1]]\" sa wiking ito!'''",
        "searchprofile-articles": "Mga pahina ng nilalaman",
-       "searchprofile-project": "Mga pahina ng Tulong at Proyekto",
        "searchprofile-images": "Multimidya",
        "searchprofile-everything": "Lahat ng bagay",
        "searchprofile-advanced": "Mas mataas na antas",
        "searchprofile-articles-tooltip": "Hanapin sa $1",
-       "searchprofile-project-tooltip": "Hanapin sa $1",
        "searchprofile-images-tooltip": "Maghanap ng mga talaksan",
        "searchprofile-everything-tooltip": "Hanapin ang lahat ng nilalaman (kabilang ang mga pahina ng usapan)",
        "searchprofile-advanced-tooltip": "Hanapin sa pinasadyang mga espasyo ng pangalan",
        "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:",
-       "powersearch-redir": "Itala ang mga panuto",
        "powersearch-togglelabel": "Suriin:",
        "powersearch-toggleall": "Lahat",
        "powersearch-togglenone": "Wala",
        "prefs-emailconfirm-label": "Kumpirmasyon ng e-liham:",
        "youremail": "E-liham:",
        "username": "{{GENDER:$1|Bansag}}:",
-       "uid": "ID ng {{GENDER:$1|tagagamit}}:",
        "prefs-memberingroups": "{{GENDER:$2|Kasapi}} ng {{PLURAL:$1|na pangkat|na mga pangkat}}:",
        "prefs-memberingroups-type": "$1",
        "prefs-registration": "Oras ng pagtatala:",
        "prefs-advancedsearchoptions": "Masulong na mga mapagpipilian",
        "prefs-advancedwatchlist": "Masulong na mga mapagpipilian",
        "prefs-displayrc": "Ipakita ang mga pagpipilian",
-       "prefs-displaysearchoptions": "Ipakita ang mga pagpipilian",
        "prefs-displaywatchlist": "Ipakita ang mga pagpipilian",
        "prefs-tokenwatchlist": "Token o susi",
        "prefs-diffs": "Mga pagkakaiba",
        "recentchanges-label-unpatrolled": "Hindi pa napapatrulyahan ang pagbabagong ito",
        "recentchanges-legend-newpage": "$1 - bagong pahina",
        "rcnotefrom": "Nasa ibaba ang mga pagbabago mula pa noong '''$2''' (ipinapakita ang magpahanggang sa '''$1''').",
-       "rclistfrom": "Ipakita ang bagong mga pagbabago simula sa $1",
+       "rclistfrom": "Ipakita ang bagong mga pagbabago simula sa $3 $2",
        "rcshowhideminor": "$1 maliliit na mga pagbabago",
        "rcshowhideminor-show": "Ipakita",
        "rcshowhideminor-hide": "Itago",
        "uploadstash-refresh": "Sariwain ang talaan ng mga talaksan",
        "invalid-chunk-offset": "Hindi katanggap-tanggap na pagbawi ng tipak",
        "img-auth-accessdenied": "Hindi pinayagan ang pagpunta",
-       "img-auth-nopathinfo": "Nawawala ang PATH_INFO.\nAng tagapaghain mo ay hindi nakatakda na magpasa ng ganitong kabatiran.\nMaaaring pang-CGI ito at hindi sumusuporta ng img_auth.\nTingnan ang https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "Nawawala ang PATH_INFO.\nAng tagapaghain mo ay hindi nakatakda na magpasa ng ganitong kabatiran.\nMaaaring pang-CGI ito at hindi sumusuporta ng img_auth.\nTingnan ang https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Ang hiniling na daan ay wala sa loob ng isinaayos na direktoryo ng pagkarga.",
        "img-auth-badtitle": "Hindi nagawang makabuo ng tanggap na pamagat mula sa \"$1\".",
        "img-auth-nologinnWL": "Hindi ka nakalagda at ang \"$1\" ay wala sa puting talaan.",
        "log-title-wildcard": "Hanapin ang mga pamagat na nagsisimula sa tekstong ito",
        "showhideselectedlogentries": "Ipakita/itago ang napiling mga lahok sa talaan",
        "allpages": "Lahat ng pahina",
-       "alphaindexline": "$1 hanggang $2",
        "nextpage": "Susunod na pahina ($1)",
        "prevpage": "Nakaraang pahina ($1)",
        "allpagesfrom": "Pinapakita ang mga pahina na nagsisimula sa:",
        "listgrouprights-removegroup": "Maaaring tanggalin ang {{PLURAL:$2|pangkat|mga pangkat}} na: $1",
        "listgrouprights-addgroup-all": "Maaaring idagdag ang lahat ng mga pangkat",
        "listgrouprights-removegroup-all": "Maaaring tanggalin ang lahat ng mga pangkat",
-       "listgrouprights-addgroup-self": "Idagdag ang {{PLURAL:$2|pangkat|mga pangkat}} sa sariling kuwenta: $1",
-       "listgrouprights-removegroup-self": "Tanggalin ang {{PLURAL:$2|pangkat|mga pangkat}} mula sa sariling kuwenta: $1",
+       "listgrouprights-addgroup-self": "Idagdag ang {{PLURAL:$2|pangkat|mga pangkat}} sa sariling account: $1",
+       "listgrouprights-removegroup-self": "Tanggalin ang {{PLURAL:$2|pangkat|mga pangkat}} mula sa sariling account: $1",
        "listgrouprights-addgroup-self-all": "Idagdag ang lahat ng mga pangkat sa sariling account",
        "listgrouprights-removegroup-self-all": "Alisin ang lahat ng mga pangkat mula sa sariling account",
        "mailnologin": "Walang adres na mapagpapadalahan",
-       "mailnologintext": "Kailangan mong [[Special:UserLogin|lumagda]] at magkaroon ng tanggap na e-liham sa iyong [[Special:Preferences|mga kagustuhan]] para makapagpadala ng e-liham sa ibang mga tagagamit.",
+       "mailnologintext": "Kailangan mong [[Special:UserLogin|maglogin]] at magkaroon ng balidong email address sa iyong [[Special:Preferences|mga kagustuhan]] para makapagpadala ng e-mail sa ibang mga tagagamit.",
        "emailuser": "Padalhan ng e-liham ang tagagamit",
        "emailuser-title-target": "Padalhan ng elektronikong liham ang {{GENDER:$1|tagagamit}} na ito",
        "emailuser-title-notarget": "Padalhan ng e-liham ang tagagamit",
        "watchlist-details": "{{PLURAL:$1|$1 pahinang|$1 mga pahinang}} nasa iyong talaan ng mga binabantayan, hindi binibilang ang mga pahina ng usapan.",
        "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",
-       "watchmethod-recent": "sinusuri ang kamakailan lamang na mga pagbabago para sa binabantayang mga pahina",
-       "watchmethod-list": "sinusuri ang binabantayang mga pahina para sa mga kamakailan lamang na mga pagbabago",
-       "watchlistcontains": "Naglalaman ng $1 {{PLURAL:$1|pahina|mga pahina}} ang iyong talaan ng mga binabantayan.",
-       "iteminvalidname": "May suliranin ang bagay na '$1', hindi tanggap na pangalan...",
-       "wlnote2": "Nasa ibaba ang mga pagbabago sa nakaraang {{PLURAL:$1|oras|<strong>$1",
+       "wlnote2": "Nasa ibaba ang mga pagbabago sa nakaraang <strong>$1</strong> oras, noon pang $2, $3.",
        "wlshowlast": "Ipakita ang huling $1 mga oras $2 mga araw $3",
        "watchlist-options": "Mga pagpipilian para sa talaan ng mga binabantayan",
        "watching": "Isinasama sa mga binabantayan...",
        "enotif_lastvisited": "Tingnan ang $1 para sa lahat ng mga pagbabago magmula noong huling pagdalaw mo.",
        "enotif_lastdiff": "Tingnan ang $1 para makita ang pagbabagong ito.",
        "enotif_anon_editor": "hindi nakikilalang tagagamit $1",
-       "enotif_body": "Mahal naming $WATCHINGUSERNAME,\n\n\nAng pahinang $PAGETITLE ng {{SITENAME}} ay $CHANGEDORCREATED ni $PAGEEDITOR noong $PAGEEDITDATE, tingnan ang $PAGETITLE_URL para sa pangkasalukuyang rebisyon.\n\n$NEWPAGE\n\nBuod ng patnugot: $PAGESUMMARY $PAGEMINOREDIT\n\nMakipagugnayan sa patnugot:\nliham: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nWala nang iba pang mga pagpapahayag sa pagkakataon ng pagkakaroon ng karagdagang mga pagbabago maliban na lamang kung dadalawin mo ang pahinang ito.\nMaaari mo ring itakda muli ang mga watawat na pangpagpapabatid para sa lahat ng mga pahinang binabantayan mo sa loob ng iyong talaan ng mga binabantayan.\n\nAng iyong maginhawang sistema ng pagpapabatid ng {{SITENAME}}\n\n--\nUpang mabago ang mga katakdaan sa iyong talaan ng mga binabantayan, dalawin ang\n{{canonicalurl:{{#special:Preferences}}}}\n\nUpang baguhin ang mga katakdaan ng bantayan mo, dumalaw sa\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nUpang burahin ang pahina mula sa pahina mo ng mga binabantayan, dumalaw sa\n$UNWATCHURL\n\nTugon at karagdagang tulong:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Mahal naming $WATCHINGUSERNAME,\n\n\nAng pahinang $PAGETITLE ng {{SITENAME}} ay $CHANGEDORCREATED ni $PAGEEDITOR noong $PAGEEDITDATE, tingnan ang $PAGETITLE_URL para sa pangkasalukuyang rebisyon.\n\n$NEWPAGE\n\nBuod ng patnugot: $PAGESUMMARY $PAGEMINOREDIT\n\nMakipagugnayan sa patnugot:\nliham: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nWala nang iba pang mga pagpapahayag sa pagkakataon ng pagkakaroon ng karagdagang mga pagbabago maliban na lamang kung dadalawin mo ang pahinang ito.\nMaaari mo ring itakda muli ang mga watawat na pangpagpapabatid para sa lahat ng mga pahinang binabantayan mo sa loob ng iyong talaan ng mga binabantayan.\n\nAng iyong maginhawang sistema ng pagpapabatid ng {{SITENAME}}\n\n--\nUpang mabago ang mga katakdaan sa iyong talaan ng mga binabantayan, dalawin ang\n{{canonicalurl:{{#special:Preferences}}}}\n\nUpang baguhin ang mga katakdaan ng bantayan mo, dumalaw sa\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nUpang burahin ang pahina mula sa pahina mo ng mga binabantayan, dumalaw sa\n$UNWATCHURL\n\nTugon at karagdagang tulong:\n$HELPPAGE",
        "created": "nilikha",
        "changed": "binago",
        "deletepage": "Burahin ang pahina",
        "revertpage-nouser": "Ibinalik ang mga pagbabago ni (tinanggal ang bansag) patungo sa huling rebisyon ni [[User:$1|$1]]",
        "rollback-success": "Ibinalik ang mga pagbabago ni $1; ibinalik sa huling bersyon ni $2.",
        "sessionfailure-title": "Nabigong pulong",
-       "sessionfailure": "Tila mayroong suliraning may kaugnayan sa iyong sesyon/panahon ng pagkakalagda;\nKinansela ang galaw/gawaing ito bilang pagiingat laban sa pagnanakaw (panghahaydyak) ng sesyon/panahon.\nPakipindot ang pindutang \"ibalik\" (''back'') at ikarga uli ang pinanggalingan mong pahina, sumubok uli pagkaraan.",
+       "sessionfailure": "Tila mayroong suliraning may kaugnayan sa iyong sesyon ng login;\nKinansela ang gawaing ito bilang pag-iingat laban sa pagnanakaw ng sesyon.\nPakipindot ang pindutang \"ibalik\" Bumalik muli sa nakaraang pahina at ikarga uli (''reload'') ito at pagkatapos subukan muli.",
        "protectlogpage": "Talaan ng pagsasanggalang",
        "protectlogtext": "Nasa ibaba ang isang talaan ng mga pagbabago sa mga pruteksiyon ng pahina.\nTingnan ang [[Special:ProtectedPages|talaan ng pinuprutektahang mga pahina]] para sa talaan ng kasalukuyang gumaganang mga pagprutekta ng pahina.",
        "protectedarticle": "ipinagsanggalang ang \"[[$1]]\"",
        "protect-text": "Maaari mong tingnan at baguhin dito ang antas ng pananananggalang para sa pahinang '''$1'''.",
        "protect-locked-blocked": "Hindi mo maaaring baguhin ang mga antas ng panananggalang habang may pagharang/paghadlang.\nNarito ang mga pangkasalukuyang pagtatakda para sa pahinang '''$1''':",
        "protect-locked-dblock": "Hindi mababago ang mga antas ng panananggalang dahil sa isang umiiral na pagkandado ng kalipunan ng dato.\nNarito ang pangkasalukuyang mga pagtatakda para sa pahinang '''$1''':",
-       "protect-locked-access": "Wala kapahintulutan ang iyong kuwenta para makapagbago ng mga antas ng panananggalang ng pahina.\nNarito ang pangkasalukuyang mga pagtatakda para sa pahinang '''$1''':",
+       "protect-locked-access": "Wala kapahintulutan ang iyong account para makapagbago ng mga antas ng panananggalang ng pahina.\nNarito ang pangkasalukuyang mga pagtatakda para sa pahinang '''$1''':",
        "protect-cascadeon": "Kasalukuyang nakasanggalang na ang pahinang ito dahil kabilang/kasama ito sa sumusunod na {{PLURAL:$1|pahinang may|mga pahinang may}} buhay/umiiral na baita-baitang na mga panananggalang.\nMaaari mong baguhin ang antas ng panananggalang ng pahina, ngunit hindi ito makakaapekto sa baita-baitang na panananggalang.",
        "protect-default": "Pahintulutan ang lahat ng mga tagagamit",
        "protect-fallback": "Pahintulutan ang mga tagagamit lamang na may pahintulot na \"$1\"",
        "blockip": "Harangin/hadlangan ang tagagamit",
        "blockip-legend": "Iharang ang tagagamit",
        "blockiptext": "Gamitin ang mga lahok sa ibaba upang maharang ang akses sa pagsulat mula sa isang espesipikong IP address o bansag.\nGawin lamang ito para maiwasan ang bandalismo, at napapaloob sa [[{{MediaWiki:Policy-url}}|patakaran]].\nPunan ang espesipikong dahilan sa ibaba (halimbawa, magbanggit ng partikular na mga pahina na nagkaroon ng bandalismo).",
-       "ipadressorusername": "Direksyong IP o bansag:",
+       "ipaddressorusername": "Direksyong IP o bansag:",
        "ipbexpiry": "Pagkawalang-bisa:",
        "ipbreason": "Dahilan:",
-       "ipbreason-dropdown": "*Mga karaniwang dahilan sa paghaharang\n** Pagpasok ng hindi totoong impormasyon\n** Pag-alis ng nilalaman mula sa mga pahina\n** Walang-itinatanging paglalagay ng mga kawing panlabas\n** Pagpasok ng impormasyong walang kabuluhan/satsat sa mga pahina\n** Ugaling nananakot/pagligalig\n** Pagmamalabis ng maramihang kuwenta\n** Hindi kanais-nais na bansag",
+       "ipbreason-dropdown": "*Mga karaniwang dahilan sa paghaharang\n** Pagpasok ng hindi totoong impormasyon\n** Pag-alis ng nilalaman mula sa mga pahina\n** Paglalagay ng mga panlabas na link  na spam\n** Pagpasok ng impormasyong walang kabuluhan o hindi maintindihan sa mga pahina\n** Ugaling nananakot/pagligalig\n** Pagmamalabis ng maramihang account\n** Hindi kanais-nais na pangalan",
        "ipb-hardblock": "Pigilan ang nakalagdang mga tagagamit mula sa pamamatnugot mula sa tirahan ng IP na ito",
        "ipbcreateaccount": "Hadlangan ang paglikha ng account",
        "ipbemailban": "Hadlangan ang tagagamit sa pagpapadala ng e-liham",
        "tooltip-pt-watchlist": "Ang talaan ng mga pagbabago sa mga pahinang binabantayan mo",
        "tooltip-pt-mycontris": "Talaan ng mga ambag mo",
        "tooltip-pt-login": "Hinihimok kang lumagda, bagaman hindi ito kinakailangan.",
-       "tooltip-pt-logout": "Umalis sa pagkakalagda",
+       "tooltip-pt-logout": "Umalis sa pagkaka-login",
        "tooltip-ca-talk": "Usapan tungkol sa nilalaman ng pahinang ito",
        "tooltip-ca-edit": "Maaaring baguhin ang pahinang ito. Paki gamit ang buton ng paunang tingin bago itala.",
        "tooltip-ca-addsection": "Magsimula ng isang bagong seksiyon",
        "tooltip-preferences-save": "Sagipin ang mga nais",
        "tooltip-summary": "Magbigay ng maikling buod",
        "common.css": "/* Ang inilagay na CSS dito ay gagamitin para sa lahat ng mga pabalat */",
-       "cologneblue.css": "/* Ang Cascading Style Sheets na inilagay dito ay makakaapekto sa mga tagagamit ng pabalat na Cologne Blue */",
        "monobook.css": "/* Ang CSS na inilagay dito ay makakaapekto sa mga tagagamit ng pabalat na Monobook */",
-       "modern.css": "/* Ang CSS na iniligay dito ay makakaapekto sa tagagamit ng Makabagong (''Modern'') pabalat */",
        "vector.css": "/* Ang inilagay na CSS dito ay makakaapekto sa mga tagagamit ng pabalat na Vector */",
        "print.css": "/* Ang CSS na inilagay dito ay makakaapekto sa kalalabasan o resulta ng paglilimbag */",
        "noscript.css": "/* Ang inilagay na Cascading Style Sheets dito ay makakaapekto sa mga tagagamit na hindi nagpapagana ng JavaScript */",
        "group-sysop.css": "/* Ang inilagay na Mga Pilas ng Estilong Lumalagaslas (Cascading Style Sheets) dito ay makakaapekto lamang sa mga tagapagpaandar ng sistema */",
        "group-bureaucrat.css": "/* Ang inilagay na Mga Pilas ng Estilong Lumalagaslas (Cascading Style Sheets o CSS) dito ay makakaapekto lamang sa mga burokrata */",
        "common.js": "/* Ang anumang JavaScript dito ay ikakarga para sa lahat ng mga tagagamit ng bawat pahinang ikinarga. */",
-       "cologneblue.js": "/* Ang anumang JavaScript dito ay ikakarga para sa mga tagagamit ng pabalat na Cologne Blue */",
        "monobook.js": "/* Ang anumang JavaScript dito ay ikakarga para sa mga tagagamit na gumagamit ng pabalat na MonoBook */",
-       "modern.js": "/* Ang anumang JavaScript dito ay ikakarga para sa mga tagagamit na gumagamit ng Modernong pabalat */",
        "vector.js": "/* Ang anumang JavaScript dito ay ikakarga para sa mga tagagamit na gumagamit ng pabalat na Vector */",
        "group-autoconfirmed.js": "/* Ang anumang JavaScript dito ay ikakarga para sa mga tagagamit na kusang natiyak lamang */",
        "group-bot.js": "/* Ang anumang JavaScript dito ay ikakarga para sa mga bot lamang */",
        "group-sysop.js": "/* Ang anumang JavaScript dito ay ikakarga para sa mga tagapagpaandar ng sistema lamang */",
        "group-bureaucrat.js": "/* Ang anumang JavaScript dito ay ikakarga para sa mga burokrata lamang */",
-       "notacceptable": "Hindi makapagbigay ng dato ang serbidor ng wiki sa anyong mababasa ng iyong kliyente.",
        "anonymous": "Hindi kilalang {{PLURAL:$1|tagagamit|mga tagagamit}} ng {{SITENAME}}",
        "siteuser": "Tagagamit $1 ng {{SITENAME}}",
        "anonuser": "Hindi nakikilalang tagagamit na $1 ng {{SITENAME}}",
        "pageinfo-magic-words": "{{PLURAL:$1|Salita|Mga salita}}ng mahiwaga ($1)",
        "pageinfo-hidden-categories": "Nakatagong {{PLURAL:$1|kategorya|mga kategorya}} ($1)",
        "pageinfo-templates": "{{PLURAL:$1|Suleras|Mga suleras}} ($1) na nasa transklusyon (kasama sa maraming mga lugar)",
-       "skinname-cologneblue": "Cologne Blue",
        "skinname-monobook": "MonoBook",
-       "skinname-modern": "Makabago (Moderno)",
        "skinname-vector": "Vector",
        "markaspatrolleddiff": "Tatakan bilang napatrolya na",
        "markaspatrolledtext": "Tatakan ang pahinang ito bilang napatrolya na",
        "newimages-summary": "Nagpapakita ang natatanging pahinang ito ng huling naikargang mga talaksan.",
        "newimages-legend": "Pansala",
        "newimages-label": "Pangalan ng talaksan (o bahagi nito):",
-       "showhidebots": "($1 mga ''bot'')",
        "noimages": "Walang makikita dito.",
        "ilsubmit": "Hanapin",
        "bydate": "ayon sa petsa",
        "confirmemail": "Patotohanan ang adres ng e-liham",
        "confirmemail_noemail": "Wala kang nakatakdang tanggap na adres ng e-liham sa iyong [[Special:Preferences|mga kagustuhan ng tagagamit]].",
        "confirmemail_text": "Pinagagawa ng {{SITENAME}} na patotohanan mo ang iyong adres ng e-liham bago gamitin ang mga kasangkapang-katangian ng e-liham.  Pindutin at buhayin ang pindutan sa ibaba para makapagpadala ng isang makapagpapatotoong e-liham (kompirmasyon) patungo sa iyong adres.\nMakakasama sa liham ang isang kawing na naglalaman ng kodigo;\nIkarga ang kawing sa iyong pantingin-tingin (''browser'') para mapatotohanang katanggap-tanggap ang iyong adres ng e-liham.",
-       "confirmemail_pending": "Naipadala na sa iyong e-liham ang kodigo ng pagpapatotoo (kumpirmasyon); kung kamakailan mo lamang nilikha ang iyong kuwenta, maaaring ibigin mong maghintay ng ilang minuto para makarating muna ito bago subuking humiling ng isang bagong kodigo.",
+       "confirmemail_pending": "Naipadala na sa iyong e-mail ang kodigo ng pagpapatotoo (kumpirmasyon); kung kamakailan mo lamang nilikha ang iyong account, maaaring maghintay ng ilang minuto para makarating muna ito bago subuking humiling ng isang bagong kodigo.",
        "confirmemail_send": "Magpadala ng isang kodigo ng pagpapatotoo (kumpirmasyon)",
        "confirmemail_sent": "Naipadala na ang magpapatotoong e-liham (kumpirmasyon).",
        "confirmemail_oncreate": "Nagpadala na ng isang kodigo ng pagpapatotoo (kumpirmasyon) patungo sa iyong adres ng e-liham.  Hindi kailangan ang kodigong ito para makalagda, ngunit kailangan mong ibigay muna ito bago paganahin/paandarin ang anumang pang e-liham na kasangkapang-katangiang nasa loob ng wiki.",
        "confirmemail_sendfailed": "Hindi maipadala ng {{SITENAME}} ang iyong liham ng pagpapatotoo (kumpirmasyon).\nPakisuri ang iyong adres ng e-liham kung may mga hindi tanggap na mga panitik/karakter.\n\nIbinalik ng tagapagpadala ang: $1",
        "confirmemail_invalid": "Hindi tamang kodigo ng kumpirmasyon.  Maaaring lumagpas na sa taning ang kodigo.",
        "confirmemail_needlogin": "Kailangan mong $1 upang kumpirmahin/mapatotohanan ang iyong adres ng e-liham.",
-       "confirmemail_success": "Nakumpirma/napatotohanan na ang adres ng e-liham mo. Maaari ka ng [[Special:UserLogin|lumagda]] at maglibang sa wiki.",
+       "confirmemail_success": "Napatotohanan na ang email address mo. Maaari ka ng [[Special:UserLogin|mag-login]] at ikalugod ang wiki.",
        "confirmemail_loggedin": "Natiyak na ngayon ang tirahan ng e-liham mo.",
        "confirmemail_subject": "Kumpirmasyon/pagpapatotoong pang-adres ng e-liham ng {{SITENAME}}",
-       "confirmemail_body": "May isa, maaaring ikaw, na mula sa direksiyong IP na $1,\nang nagtala ng isang kuwentang \"$2\" na mayroong ganitong direksiyong e-liham sa {{SITENAME}}.\n\nPara patotohanang ikaw nga ang may-ari ng kuwentang ito at para buhayin ang mga kasangkapang-katanginan ng e-liham sa {{SITENAME}}, buksan ang kawing na ito sa iyong pambasa-basa (''browser''):\n\n$3\n\nKung *hindi* mo itinala ang kuwenta, sundan mo ang kawing na ito\npara kanselahin o huwag nang ituloy ang pagpapatotoo (kumpirmasyon) ng direksiyong e-liham:\n\n$5\n\nMagwawalang-saysay ang kodigo ng pagpapatotoong ito sa $4.",
-       "confirmemail_body_changed": "May isa, maaaring ikaw, na mula sa adres ng IP na $1,\nang nagbago ng adres ng e-liham ng akawnt na \"$2\" sa ganitong adres sa {{SITENAME}}.\n\nPara patotohanang ikaw nga ang may-ari ng kuwentang ito at para buhaying muli ang mga kasangkapang-katanginan ng e-liham sa {{SITENAME}}, buksan ang kawing na ito sa iyong pantingin-tingin:\n\n$3\n\nKung *hindi* iyo ang akawnt, sundan mo ang kawing na ito\npara huwag nang ituloy ang pagpapatotoo ng adres ng e-liham:\n\n$5\n\nMagwawakas ang kodigo ng pagpapatotoong ito sa $4.",
+       "confirmemail_body": "May isang tao, malamang ikaw, na mula sa IP address na $1,\nang nagtala ng isang account na \"$2\" na mayroong ganitong email address sa {{SITENAME}}.\n\nPara patotohanang ikaw nga ang may-ari ng account ito at para buhayin ang mga tampok (features) sa email sa {{SITENAME}}, buksan ang link na ito sa iyong browser:\n\n$3\n\nKung *hindi* mo itinala ang account, sundan mo ang link na ito\npara kanselahin o huwag nang ituloy ang pagpapatotoo ng email address:\n\n$5\n\nMagwawalang-saysay ang kodigo ng pagpapatotoong ito sa $4.",
+       "confirmemail_body_changed": "May isang tao, malamang ikaw, na mula sa IP address na $1,\nang nagtala ng isang account na \"$2\" na mayroong ganitong email address sa {{SITENAME}}.\n\nPara patotohanang ikaw nga ang may-ari ng account ito at para buhayin ang mga tampok (features) sa email sa {{SITENAME}}, buksan ang link na ito sa iyong browser:\n\n$3\n\nKung *hindi* mo itinala ang account, sundan mo ang link na ito\npara kanselahin o huwag nang ituloy ang pagpapatotoo ng email address:\n\n$5\n\nMagwawalang-saysay ang kodigo ng pagpapatotoong ito sa $4.",
        "confirmemail_body_set": "May isang tao, maaaring ikaw, mula sa tirahan ng IP na $1,\nang nagtakda ng tirahan ng e-liham ng akawnt na \"$2\" papunta sa tirahang ito sa {{SITENAME}}.\n\nUpang tiyakin na ang akawnt na ito ay talagang sa iyo at muling buhayin\nang mga tampok ng e-liham sa {{SITENAME}}, buksan ang kawing na ito sa iyong pantingin-tingin:\n\n$3\n\nKung ang akawnt ay *hindi* iyo, sundan ang kawing na ito\nupang huwag ituloy ang pagpapatunay ng tirahan ng e-liham:\n\n$5\n\nMawawalan ng bisa ang kodigong ito ng pagpapatunay pagsapit ng $4.",
        "confirmemail_invalidated": "Hindi itinuloy/kinansela ang pagpapatotoo ng e-liham",
        "invalidateemail": "Huwag ituloy/kanselahin ang pagpapatotoo ng e-liham",
        "bitrate-exabits": "$1Ebps",
        "bitrate-zetabits": "$1Zbps",
        "bitrate-yottabits": "$1Ybps",
-       "livepreview-loading": "Ikinakarga...",
-       "livepreview-ready": "Ikinakarga… Handa na!",
-       "livepreview-failed": "Nabigo ang umiiral na paunang tingin!  Subukan ang normal/pangkaraniwang paunang tingin.",
-       "livepreview-error": "Hindi matagumpay ang pagkonekta: $1 \"$2\".\nSubukan ang karaniwang paunang tingin.",
        "lag-warn-normal": "Maaaring hindi naipapakita sa talaang ito ang mga pagbabagong mas bago pa kaysa $1 {{PLURAL:$1|segundo|mga segundo}}.",
        "lag-warn-high": "Dahil mataas na bilang ng mga naiiwanan/antas ng kabagalan ng serbidor ng kalipunan ng dato,\nmaaaring hindi naipapakita sa talaang ito ang mga pagbabagong mas bago pa kaysa $1 {{PLURAL:$1|segundo|mga segundo}}.",
-       "watchlistedit-numitems": "Naglalaman ang iyong talaan ng mga binabantayan ng {{PLURAL:$1|1 pamagat|$1 mga pamagat}}, hindi kabilang ang mga pahina ng usapan.",
-       "watchlistedit-noitems": "Hindi naglalaman ng mga pamagat ang iyong talaan ng mga binabantayan.",
        "watchlistedit-normal-title": "Baguhin ang talaan ng mga binabantayan",
        "watchlistedit-normal-legend": "Tanggalin ang mga pamagat mula sa binabantayan",
        "watchlistedit-normal-explain": "Ipinapakita sa ibaba ang mga pamagat na nasa talaan mo ng mga binabantayan.\nUpang matanggal ang isang pamagat, lagyan ng tsek ang kahong katabi nito, at pindutin ang \"{{int:Watchlistedit-normal-submit}}\".\nMaaari mo ring [[Special:EditWatchlist/raw|baguhin ang hilaw na talaan]].",
        "specialpages-note": "* Normal na natatanging mga pahina.\n* <span class=\"mw-specialpagerestricted\">Pinaghihigpitang natatanging mga pahina.</span>",
        "specialpages-group-maintenance": "Mga pagpapanatiling ulat",
        "specialpages-group-other": "Iba pang natatanging mga pahina",
-       "specialpages-group-login": "Mag-login / lumikha ng akawnt",
+       "specialpages-group-login": "Mag-login / lumikha ng account",
        "specialpages-group-changes": "Mga huling binago at mga tala",
        "specialpages-group-media": "Mga ulat ng midya at mga pagkarga",
        "specialpages-group-users": "Mga tagagamit at mga karapatan",
        "compare-invalid-title": "Hindi katanggap-tanggap ang tinukoy mong pamagat.",
        "compare-title-not-exists": "Hindi umiiral ang tinukoy mong pamagat.",
        "compare-revision-not-exists": "Hindi umiiral ang tinukoy mong rebisyon.",
-       "dberr-header": "May isang suliranin ang wiking ito",
        "dberr-problems": "Paumanhin! Dumaranas ng mga kahirapang teknikal ang sityong ito.",
        "dberr-again": "Subuking maghintay ng ilang mga minuto at muling magkarga.",
        "dberr-info": "(Hindi makaugnay sa tagapaghain ng kalipunan ng dato: $1)",
index 24b58a4..8cc4d3d 100644 (file)
@@ -4,7 +4,8 @@
                        "Erdemaslancan",
                        "Ganbarzada",
                        "Tuzkozbir",
-                       "Гусейн"
+                       "Гусейн",
+                       "아라"
                ]
        },
        "tog-underline": "Линки жинтоно ријә быкәш:",
        "missingarticle-diff": "(Фәрг: $1, $2)",
        "internalerror": "Дыләтонә ғәләт",
        "internalerror_info": "Дыләтонә ғәләт: $1",
-       "fileappenderrorread": "Әловон ғејд карде быәдә\"$1\" һанде ныбе.",
        "formerror": "Сәһв: Че формә мәлумотон әкс карде ғерри мымкуне.",
        "cannotdelete-title": "Сәһифә әбыни рәдд кардеј \"$1\"",
        "badtitle": "Роныдоә ном",
        "savearticle": "Сәһифә огәтеј",
        "preview": "Сыфтәнә нишо дој",
        "showpreview": "Сыфтәнә нишо дој",
-       "showlivepreview": "Товинә сыфтәнә нишо дој",
        "showdiff": "Дәғандә быә дәгишон",
        "anoneditwarning": "'''Дығғәт.''' Шымә ыштәни едәштәнијоне системәдә.\nШымә IP-унвон бә ым сәһифә дәгишон тарых ғејд бәбе.",
        "loginreqlink": "ыштәни едаштеј",
        "recentchanges-label-bot": "Ым дәгиши бот кардәше",
        "recentchanges-label-unpatrolled": "Im redaktə hələ nəzərədə dəvardəni",
        "rcnotefrom": "Бә жиј доә быән дәгишон че вахтику '''$2''' (тосә '''$1''').",
-       "rclistfrom": "$1 вахтику дәгишон нишо быдә",
+       "rclistfrom": "$3 $2 вахтику дәгишон нишо быдә",
        "rcshowhideminor": "$1 гәдәлијә дәгишон",
        "rcshowhidebots": "$1 ботон",
        "rcshowhideliu": "$1 ыштәни едаштә иштирокәкон",
index d44020d..9c17de2 100644 (file)
@@ -3,11 +3,11 @@
                "authors": [
                        "Cbrown1023",
                        "Tauʻolunga",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Ngaahi fehokotaki ʻoku laineʻi ʻi lalo:",
-       "tog-rememberpassword": "Manatuʻi ʻeku kau-ki-ai ʻi he komipiuta ʻeni (for a maximum of $1 {{PLURAL:$1|day|days}})",
        "tog-watchcreations": "Tānaki ngaahi peesi ʻoku fakatupu ʻe au ki he hokohoko leʻo",
        "tog-watchdefault": "Tānaki ngaahi peesi ʻoku fatu ʻe au ki he hokohoko leʻo",
        "tog-watchmoves": "Tānaki ki heʻeku hokohoko leʻo ʻa e ngaahi peesi kuo ʻunu ʻe au",
        "savearticle": "Haofaki e pēsí",
        "preview": "Vakai pē",
        "showpreview": "Vakai pē",
-       "showlivepreview": "Vakai pē fakamoʻui",
        "showdiff": "ʻAsi mai ha ngaahi liliu",
        "anoneditwarning": "ʻOku ʻikai te ke kau-ki-ai. ʻE tohi ho tuʻasila IP ʻi he hisitōlia ʻo e fatu ʻa e pēsí ni.",
        "missingsummary": "'''Fakamanatu''': Naʻe ʻikai te ke fakaai ha fakanounou. Kapau te ke toe lomi Haofaki, ʻe haofakiʻi hoʻo fatu taʻefakanounou.",
        "showingresults": "ʻOku ʻasi ʻi lalo ʻa e ngaahi fua ʻoku kamata mo e #'''$2''' (aʻu ki he '''$1''').",
        "showingresultsnum": "ʻOku ʻasi ʻi lalo ha fua ʻe '''$3''', ʻoku kamata mo e #'''$2'''.",
        "powersearch-legend": "Kumi lakasi",
-       "powersearch-redir": "Hokohoko ʻo e ngaahi leʻei",
        "preferences": "Faʻiteliha",
        "mypreferences": "faʻiteliha ʻaʻaku",
        "prefs-skin": "Kili",
        "recentchanges": "Ngaahi toki liliu",
        "recentchanges-summary": "Fakatotolo ʻa e ngaahi toki liliu ki he wiki ʻi he pēsí ni.",
        "rcnotefrom": "ʻOku ʻasi ʻi lalo ʻa e liliu talu mei '''$2''' (aʻu ki he '''$1''').",
-       "rclistfrom": "ʻAsi mai ha ngaahi liliu foʻou ʻo kamata mei he $1",
+       "rclistfrom": "ʻAsi mai ha ngaahi liliu foʻou ʻo kamata mei he $3 $2",
        "rcshowhideminor": "$1 fatu siʻi",
        "rcshowhidebots": "$1 fatu fakamīsini",
        "rcshowhideliu": "$1 kau ʻetita ʻoku kau-ki-ai",
        "watchlist-details": "ʻOku leʻoʻi ʻa e peesi ʻe $1, ʻikai kau ki ai ʻa e ngaahi peesi alea.",
        "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",
-       "watchmethod-recent": "ʻoku siviʻi ngaahi toki fatu ki he peesi fakaleʻo",
-       "watchmethod-list": "ʻoku siviʻi ʻa e ngaahi peesi fakaleʻo ki he toki fatu",
-       "watchlistcontains": "ʻOku ʻi ai ha peesi ʻe $1 ʻi hoʻo hokohoko leʻo.",
-       "iteminvalidname": "Meʻa fihi mo e meʻa '$1', hingo taʻeʻaongaʻi...",
        "wlshowlast": "ʻAsi mai houa fakamuimui ʻe $1, ʻaho ʻe $2, $3",
        "watching": "ʻOku leʻo...",
        "unwatching": "ʻOku taʻeleʻo...",
        "tooltip-t-upload": "Hiki hake ʻa e ngaahi faile",
        "tooltip-ca-nstab-special": "Ko e peesi makehe ia, ʻoku ʻikai lava te ke fatu ia ʻe koe",
        "tooltip-undo": "\"Vete\" ʻoku toe foki ʻa e fatu ni pea fakaava ʻa e foomu fatu ʻi he anga siomuʻa.\nPea hoko ai pē hoʻo lava tānaki ha ʻuhinga ʻi he fakanounou",
-       "notacceptable": "ʻOku ʻikai lava fakaai ʻe he tauhia 'wiki' ʻa e meʻaʻilo ʻi he meʻangaohi ʻoku lava lau ʻe koe.",
        "anonymous": "Kau ʻetita taʻehingoa ʻo e {{SITENAME}}",
        "siteuser": "Ko e ʻetita {{SITENAME}} $1",
        "others": "ngaahi toe",
index 51bea03..8df60af 100644 (file)
@@ -57,7 +57,8 @@
                        "Uğur Başak",
                        "Vito Genovese",
                        "Vugar 1981",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Bağlantıların altını çiz:",
@@ -70,7 +71,6 @@
        "tog-showtoolbar": "Düzenleme araç çubuğunu göster",
        "tog-editondblclick": "Çift tıklayarak sayfaları düzenle",
        "tog-editsectiononrightclick": "Bölüm başlığına sağ tıklayarak bölümleri düzenleyebilme olanağı ver",
-       "tog-rememberpassword": "Girişimi bu tarayıcıda hatırla (en fazla $1 {{PLURAL:$1|gün|gün}} için)",
        "tog-watchcreations": "Açtığım sayfaları ve yüklediğim dosyaları izleme listeme ekle",
        "tog-watchdefault": "Düzenleme yaptığım sayfaları ve dosyaları izleme listeme ekle",
        "tog-watchmoves": "Taşıdığım sayfaları ve dosyaları izleme listeme ekle",
        "permalink": "Kalıcı bağlantı",
        "print": "Yazdır",
        "view": "Görüntüle",
+       "view-foreign": "$1 üzerinde gör",
        "edit": "Düzenle",
+       "edit-local": "Yerel açıklamayı düzenle",
        "create": "Oluştur",
+       "create-local": "Yerel açıklama ekle",
        "editthispage": "Bu sayfayı değiştir",
        "create-this-page": "Bu sayfayı oluştur",
        "delete": "Sil",
        "readonly_lag": "Yedek sunucular ana sunucu ile güncellenmeye çalışılırken veritabanı otomatik olarak kilitlendi.",
        "internalerror": "Yazılım hatası",
        "internalerror_info": "İç hata: $1",
-       "fileappenderrorread": "Ekleme yapılırken \"$1\" okunamadı.",
-       "fileappenderror": "\"$1\" dosyası \"$2\" dosyasına eklenemiyor.",
        "filecopyerror": "\"$1\"  \"$2\" dosyasına kopyalanamıyor.",
        "filerenameerror": "\"$1\" dosyasının ismi \"$2\" olarak değiştirilemedi.",
        "filedeleteerror": "\"$1\" dosyası silinemedi.",
        "directorycreateerror": "\"$1\" dizini oluşturulamadı",
        "filenotfound": "\"$1\" dosyası bulunamadı.",
-       "fileexistserror": "\"$1\" dosyasına yazılamadı: dosya zaten mevcut",
        "unexpected": "beklenmeyen değer: \"$1\"=\"$2\".",
        "formerror": "Hata: Form gönderilemiyor",
        "badarticleerror": "Bu işlem, bu sayfada yapılamaz.",
        "userlogin-helplink2": "Oturum açma konusunda yardım alın",
        "userlogin-loggedin": "Zaten {{GENDER:$1|$1}} olarak oturum açtınız.\nBaşka bir kullanıcı olarak oturum açmak için aşağıdaki formu kullanın.",
        "userlogin-createanother": "Başka bir hesap oluşturun",
-       "createacct-join": "Aşağıya bilgilerinizi girin.",
-       "createacct-another-join": "Aşağıya yeni hesabınızın bilgilerini girin.",
        "createacct-emailrequired": "E-posta adresi",
        "createacct-emailoptional": "E-posta adresi (isteğe bağlı)",
        "createacct-email-ph": "E-posta adresinizi girin",
        "savearticle": "Sayfayı kaydet",
        "preview": "Önizleme",
        "showpreview": "Önizlemeyi göster",
-       "showlivepreview": "Canlı ön izleme",
        "showdiff": "Değişiklikleri göster",
        "anoneditwarning": "'''Uyarı:''' Oturum açmadınız.\nIP adresiniz sayfanın değişiklik geçmişine kaydedilecektir.",
        "anonpreviewwarning": "''Giriş yapmadınız. Kaydederseniz, sayfanın değişiklik geçmişine IP adresiniz yazılır.''",
        "edit-gone-missing": "Sayfa güncellenemiyor.\nSilinmiş görünüyor.",
        "edit-conflict": "Değişiklik çakışması.",
        "edit-no-change": "Değişikliğiniz yoksayıldı, çünkü metinde bir değişiklik yapılmadı.",
-       "postedit-confirmation": "Değişikliğiniz kaydedildi.",
+       "postedit-confirmation-created": "Sayfa oluşturuldu.",
+       "postedit-confirmation-saved": "Değişikliğiniz kaydedildi.",
        "edit-already-exists": "Yeni sayfa oluşturulamıyor.\nSayfa zaten mevcut.",
        "defaultmessagetext": "Varsayılan mesaj metni",
        "content-failed-to-parse": "$1 modeli için $2 içerik türü çözümlenemedi: $3",
        "search-nonefound": "Sorguyla eşleşen bir sonuç yok.",
        "powersearch-legend": "Gelişmiş arama",
        "powersearch-ns": "Ad alanlarında ara:",
-       "powersearch-redir": "Yönlendirmeleri listele",
        "powersearch-togglelabel": "Seç:",
        "powersearch-toggleall": "Hepsi",
        "powersearch-togglenone": "Hiçbiri",
        "prefs-emailconfirm-label": "E-posta doğrulaması:",
        "youremail": "E-posta:",
        "username": "{{GENDER:$1|Kullanıcı adı}}:",
-       "uid": "{{GENDER:$1|Kullanıcı}} kimliği:",
        "prefs-memberingroups": "{{GENDER:$2|Üye}} {{PLURAL:$1|group|grupları}}:",
        "prefs-registration": "Kayıt zamanı:",
        "yourrealname": "Gerçek adınız:",
        "prefs-advancedsearchoptions": "Gelişmiş seçenekler",
        "prefs-advancedwatchlist": "Gelişmiş seçenekler",
        "prefs-displayrc": "Görüntü seçenekleri",
-       "prefs-displaysearchoptions": "Görüntüleme seçenekleri",
        "prefs-displaywatchlist": "Görüntüleme seçenekleri",
        "prefs-tokenwatchlist": "Anahtar",
        "prefs-diffs": "Farklar",
        "recentchanges-legend-heading": "'''Gösterge:'''",
        "recentchanges-legend-newpage": "(ayrıca bakınız [[Special:NewPages|yeni sayfalar listesi]])",
        "rcnotefrom": "'''$2''' tarihinden itibaren yapılan değişiklikler aşağıdadır (en fazla <b>$1</b> tanesi gösterilmektedir).",
-       "rclistfrom": "$1 tarihinden itibaren yeni değişiklikleri göster",
+       "rclistfrom": "$3 $2 tarihinden itibaren yeni değişiklikleri göster",
        "rcshowhideminor": "Küçük değişiklikleri $1",
        "rcshowhideminor-show": "Göster",
        "rcshowhideminor-hide": "Gizle",
        "uploadstash-refresh": "Dosya listelerini yenile",
        "invalid-chunk-offset": "Geçersiz öbek ofset",
        "img-auth-accessdenied": "Erişim engellendi",
-       "img-auth-nopathinfo": "Eksik PATH_INFO.\nSunucunuz bu bilgiyi geçirmek için ayarlanmamış.\nCGI-tabanlı ve img_auth desteklenmiyor olabilir.\nhttps://www.mediawiki.org/wiki/Manual:Image_Authorization sayfasına bakın.",
+       "img-auth-nopathinfo": "Eksik PATH_INFO.\nSunucunuz bu bilgiyi geçirmek için ayarlanmamış.\nCGI-tabanlı ve img_auth desteklenmiyor olabilir.\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization sayfasına bakın.",
        "img-auth-notindir": "İstenen yol yapılandırılmış yükleme dizininde değil.",
        "img-auth-badtitle": "\"$1\" ile geçerli bir başlık yapılamıyor.",
        "img-auth-nologinnWL": "Giriş yapmadınız ve \"$1\" beyaz listede değil.",
        "log-title-wildcard": "Bu metinle başlayan başlıklar ara",
        "showhideselectedlogentries": "Seçili günlük girdilerinin görünürlüğünü değiştir",
        "allpages": "Tüm sayfalar",
-       "alphaindexline": "$1 sayfasından $2 sayfasına kadar",
        "nextpage": "Sonraki sayfa ($1)",
        "prevpage": "Önceki sayfa ($1)",
        "allpagesfrom": "Listelemeye başlanılacak harfler:",
        "watchlist-details": "Tartışma sayfaları hariç {{PLURAL:$1|$1 sayfa|$1 sayfa}} izleme listenizdedir.",
        "wlheader-enotif": "E-posta bildirimi etkin.",
        "wlheader-showupdated": "Sayfaları son ziyaretinizden beri değişen sayfalar '''kalın''' gösterilmiştir.",
-       "watchmethod-recent": "izlediğiniz sayfalarda yapılan son değişiklikler kontrol ediliyor",
-       "watchmethod-list": "izlediğiniz sayfalarda yapılan son değişiklikler kontrol ediliyor",
-       "watchlistcontains": "İzleme listenizde $1 tane {{PLURAL:$1|sayfa|sayfa}} var.",
-       "iteminvalidname": "'$1' öğesi ile sorun, geçersiz isim...",
        "wlnote2": "Aşağıdakiler, son {{PLURAL:$1|bir saat|<strong>$1</strong> saat}} içindeki değişikliklerdir, $2, $3 tarihi itibariyle.",
        "wlshowlast": "Son $1 saati $2 günü göster $3",
        "watchlist-options": "İzleme listesi seçenekleri",
        "enotif_lastvisited": "Son ziyaretinizden bu yana olan tüm değişiklikleri görmek için $1'e bakın.",
        "enotif_lastdiff": "Bu değişikliği görmek için, $1 sayfasına bakınız.",
        "enotif_anon_editor": "anonim kullanıcı $1",
-       "enotif_body": "Sayın $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nEditörün girdiği özet: $PAGESUMMARY $PAGEMINOREDIT\n\nEditörün iletişim bilgileri:\ne-posta: $PAGEEDITOR_EMAIL\nviki: $PAGEEDITOR_WIKI\n\nBahsi geçen sayfayı oturum açarak ziyaret edinceye kadar sayfayla ilgili başka bildirim gönderilmeyecektir. Ayrıca izleme listenizdeki tüm sayfaların bildirim durumlarını sıfırlayabilirsiniz.\n\n{{SITENAME}} bildirim sistemi\n\n--\nE-posta bildirim ayarlarınızı değiştirmek için aşağıdaki sayfayı ziyaret ediniz:\n{{canonicalurl:{{#special:Preferences}}}}\n\nİzleme listesi ayarlarınızı değiştirmek için aşağıdaki sayfayı ziyaret ediniz:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nSayfayı izleme listenizden silmek için aşağıdaki sayfayı ziyaret ediniz:\n$UNWATCHURL\n\nGeri bildirim ve daha fazla yardım için:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Sayın $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nEditörün girdiği özet: $PAGESUMMARY $PAGEMINOREDIT\n\nEditörün iletişim bilgileri:\ne-posta: $PAGEEDITOR_EMAIL\nviki: $PAGEEDITOR_WIKI\n\nBahsi geçen sayfayı oturum açarak ziyaret edinceye kadar sayfayla ilgili başka bildirim gönderilmeyecektir. Ayrıca izleme listenizdeki tüm sayfaların bildirim durumlarını sıfırlayabilirsiniz.\n\n{{SITENAME}} bildirim sistemi\n\n--\nE-posta bildirim ayarlarınızı değiştirmek için aşağıdaki sayfayı ziyaret ediniz:\n{{canonicalurl:{{#special:Preferences}}}}\n\nİzleme listesi ayarlarınızı değiştirmek için aşağıdaki sayfayı ziyaret ediniz:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nSayfayı izleme listenizden silmek için aşağıdaki sayfayı ziyaret ediniz:\n$UNWATCHURL\n\nGeri bildirim ve daha fazla yardım için:\n$HELPPAGE",
        "created": "oluşturuldu",
        "changed": "değiştirildi",
        "deletepage": "Sayfayı sil",
        "protect-locked-blocked": "Engellenmiş iken koruma seviyelerini değiştiremezsiniz.\n'''$1''' sayfasının şu anki ayarları:",
        "protect-locked-dblock": "Aktif veritabanı kilidinden dolayı koruma seviyeleri değiştirilemez.\n'''$1''' sayfası için şu anki ayarlar:",
        "protect-locked-access": "Kullanıcı hesabınız sayfanın koruma düzeylerini değiştirme yetkisine sahip değil.\n'''$1''' sayfasının geçerli ayarları şunlardır:",
-       "protect-cascadeon": "Bu sayfa, kademeli koruma aktif hale getirilmiş aşağıdaki {{PLURAL:$1|$1 sayfada|$1 sayfada}} kullanıldığı için şu an koruma altındadır.\nBu sayfanın koruma seviyesini değiştirebilirsiniz; ancak bu kademeli korumaya etki etmeyecektir.",
+       "protect-cascadeon": "Bu sayfa, kademeli koruma aktif hale getirilmiş aşağıdaki {{PLURAL:$1| sayfada|sayfalarda}} kullanıldığı için şu an koruma altındadır.\nBu sayfanın koruma seviyesini değiştirebilirsiniz; ancak bu kademeli korumaya etki etmeyecektir.",
        "protect-default": "Tüm kullanıcılara izin ver",
        "protect-fallback": "Sadece \"$1\" yetkisine sahip kullanıcılara izin ver",
        "protect-level-autoconfirmed": "Yalnızca otomatik onaylanmış kullanıcılara izin verilir",
        "blockip": "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).",
-       "ipadressorusername": "IP adresi veya kullanıcı adı",
+       "ipaddressorusername": "IP adresi veya kullanıcı adı",
        "ipbexpiry": "Bitiş süresi",
        "ipbreason": "Neden:",
        "ipbreason-dropdown": "*Genel engelleme nedenleri\n** Yanlış bilgi eklemek\n** Sayfalardan içeriği çıkarmak\n** Dış sitelere spam bağlantı vermek\n** Sayfalara mantıksız/anlaşılmaz sözler eklemek\n** Tehditvari davranış/Taciz\n** Birden fazla hesabı kötüye kullanmak\n** Kabul edilemez kullanıcı adı",
        "common.css": "/* Buraya konulacak CSS kodu tüm temalarda etkin olur */",
        "monobook.css": "/* Buraya konulacak CSS kodu tüm Monobook teması kullanan tüm kullanıcılarda etkin olur */",
        "common.js": "/* Buraya konulacak JavaScript kodu sitedeki her kullanıcı için her sayfa yüklendiğinde çalışacaktır */",
-       "notacceptable": "Bu viki sunucusu istemcinizin okuyabileceği formatta bir veri sağlayamıyor.",
        "anonymous": "{{SITENAME}} sitesinin anonim {{PLURAL:$1|kullanıcısı|kullanıcıları}}",
        "siteuser": "{{SITENAME}} kullanıcısı $1",
        "anonuser": "{{SITENAME}} anonim kullanıcısı $1",
        "newimages-summary": "Bu özel sayfa, en son yüklenen dosyaları göstermektedir.",
        "newimages-legend": "Filtre",
        "newimages-label": "Dosya adı (ya da bir parçası):",
-       "showhidebots": "(botları $1)",
        "noimages": "Görecek bir şey yok.",
        "ilsubmit": "Ara",
        "bydate": "kronolojik sırayla",
        "autosumm-replace": "Sayfa içeriği '$1' ile değiştiriliyor",
        "autoredircomment": "[[$1]] sayfasına yönlendirildi",
        "autosumm-new": "Yeni sayfa: \"$1\"",
-       "livepreview-loading": "Yükleniyor...",
-       "livepreview-ready": "Yükleniyor...  Tamam!",
-       "livepreview-failed": "Canlı önizleme başarısız! Normal önizlemeyi deneyin.",
-       "livepreview-error": "Bağlantı başarısız: $1 \"$2\".\nNormal önizlemeyi deneyin.",
        "lag-warn-normal": "$1 {{PLURAL:$1|saniyeden|saniyeden}} yeni değişiklikler bu listede görünmeyebilir.",
        "lag-warn-high": "Veritabanı sunucusundaki aşırı gecikmeden dolayı, $1 {{PLURAL:$1|saniyeden|saniyeden}} yeni değişiklikler bu listede görünmeyebilir.",
-       "watchlistedit-numitems": "İzleme sayfanızda {{PLURAL:$1|1 başlık|$1 başlık}} var, tartışma sayfaları hariç.",
-       "watchlistedit-noitems": "İzleme listeniz hiçbir başlık içermemektedir.",
        "watchlistedit-normal-title": "İzleme listesini düzenle",
        "watchlistedit-normal-legend": "İzleme listesinden başlıkları kaldır",
        "watchlistedit-normal-explain": "İzleme listenizdeki başlıklar aşağıda gösterilmiştir.\nBir başlığı çıkarmak için, yanındaki kutucuğu işaretleyin ve \"{{int:Watchlistedit-normal-submit}}\" düğmesine tıklayın.\n[[Special:EditWatchlist/raw|Satır listesini]] de düzenleyebilirsiniz.",
        "compare-invalid-title": "Belirttiğiniz başlık geçersiz.",
        "compare-title-not-exists": "Belirttiğiniz başlık mevcut değil.",
        "compare-revision-not-exists": "Belirttiğiniz sürüm mevcut değil.",
-       "dberr-header": "Bu vikinin bir sorunu var",
        "dberr-problems": "Üzgünüz! Bu site teknik zorluklar yaşıyor.",
        "dberr-again": "Bir kaç dakika bekleyip tekrar yüklemeyi deneyin.",
        "dberr-info": "(Veritabanı sunucusuyla irtibat kurulamıyor: $1)",
index d086315..12cb82c 100644 (file)
@@ -2,7 +2,8 @@
        "@metadata": {
                "authors": [
                        "Ariyo",
-                       "Arjunaraoc"
+                       "Arjunaraoc",
+                       "아라"
                ]
        },
        "tog-oldsig": "Imḍa du3do:",
        "recentchanges-label-bot": "uŞuḥlofano sim muBot.",
        "recentchanges-label-unpatrolled": "This edit has not yet been patrolled",
        "rcnotefrom": "Herke komaḥwın aŞuḥlofe ḥaroye men \"\"$2\"\" (hul buSowudo \"\"$1\"\").",
-       "rclistfrom": "Maḥway li Şuḥlofe ḥaṭe men $1",
+       "rclistfrom": "Maḥway li Şuḥlofe ḥaṭe men $3 $2",
        "rcshowhideminor": "$1 minor edits",
        "rcshowhidebots": "$1 bots",
        "rcshowhideliu": "$1 Hadome d3abiri",
index d9565f5..b5a157b 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "Thuvack"
+                       "Thuvack",
+                       "아라"
                ]
        },
        "tog-underline": "Hlanganisa nkhwatiheto:",
@@ -14,7 +15,6 @@
        "tog-showtoolbar": "Komba xiangarhi xo cinca (yitirhisa ntsalo wa Java)",
        "tog-editondblclick": "Lulamisa matluka hi ku thlava kambirhi (yitirhisa ntsalo wa Java)",
        "tog-editsectiononrightclick": "Pfula ku lulamisa hi swiyenge hi ku thlava nhlokomhaka ya xiyenge (yitirhisa ntsalo wa Java)",
-       "tog-rememberpassword": "Tsundzuka ku nghena eka Khompuyuta leyi (kufikela eka $1 {{PLURAL:$1|siku|masiku}})",
        "tog-watchcreations": "Hoxa matluka lawa ndzi matumbuluxaka eka leswi ndziswi languteke",
        "tog-watchdefault": "Hoxa matluka lawa ndzi malulamisaka eka leswi ndziswi languteke",
        "tog-watchmoves": "Hoxa matluka lawa ndzi mayisaka kun'wana eka leswi ndziswi languteke",
        "readonly_lag": "The database has been automatically locked while the slave database servers catch up to the master",
        "internalerror": "Xihoxo xa le ndzeni",
        "internalerror_info": "Internal error: $1",
-       "fileappenderrorread": "Hitsandzeke ku hlaya \"$1\" eku lulamiseni loku.",
-       "fileappenderror": "Hintsndzeke ku lulamisa \"$1\" leswaku yiva \"$2\".",
        "filecopyerror": "Could not copy file \"$1\" to \"$2\".",
        "filerenameerror": "Could not rename file \"$1\" to \"$2\".",
        "filedeleteerror": "Could not delete file \"$1\".",
        "directorycreateerror": "Could not create directory \"$1\".",
        "filenotfound": "Could not find file \"$1\".",
-       "fileexistserror": "Unable to write to file \"$1\": file exists",
        "unexpected": "Unexpected value: \"$1\"=\"$2\".",
        "formerror": "Error: could not submit form",
        "badarticleerror": "This action cannot be performed on this page.",
        "recentchanges-label-bot": "Ndzulamiso lowu wu endliwe hi rhobhoto",
        "recentchanges-label-unpatrolled": "Ndzulamiso lowu awusi languteriwa",
        "rcnotefrom": "Laha hansi kuxaxametiwe ku cinca kusukela hi '''$2''' (kuya ka '''$1''').",
-       "rclistfrom": "Komba mindzilamiso leyintswa kusukela eka $1",
+       "rclistfrom": "Komba mindzilamiso leyintswa kusukela eka $3 $2",
        "rcshowhideminor": "$1 wa mindzulamiso leyi ntsanana",
        "rcshowhidebots": "$1 wati rhobhoto",
        "rcshowhideliu": "$1 wa va tirhisi lavanga kona sweswi",
index d49a0be..3812afb 100644 (file)
@@ -19,7 +19,8 @@
                        "Ерней",
                        "Ильнар",
                        "Рашат Якупов",
-                       "Умар"
+                       "Умар",
+                       "아라"
                ]
        },
        "tog-underline": "Сылтамаларның астына сызу:",
@@ -32,7 +33,6 @@
        "tog-showtoolbar": "Үзгәртү вакытында коралларның өске панеле күрсәтелсен (JavaScript кирәк)",
        "tog-editondblclick": "Битләргә ике чирттерү белән үзгәртү бите ачылсын (JavaScript кирәк)",
        "tog-editsectiononrightclick": "Бүлек исеменә тычканның уң чирттермәсе белән төрткәч үзгәртү бите ачылсын (JavaScript кирәк)",
-       "tog-rememberpassword": "Хисап язмамны бу браузерда саклансын (иң күп $1 {{PLURAL:$1|көн|көн|көн}}гә кадәр)",
        "tog-watchcreations": "Мин төзегән битләр һәм йөкләгән файллар күзәтү исемлегемә өстәлсен",
        "tog-watchdefault": "Мин үзгәрткән битләр һәм файллар күзәтү исемлегемә өстәлсен",
        "tog-watchmoves": "Мин күчергән битләр һәм файллар күзәтү исемлегемә өстәлсен",
        "readonly_lag": "Мәгълүматлар базасы, өстәмә сервер төп сервер белән синхронизацияләшкәнче, үзгәрүләрдән автомат рәвештә ябылды.",
        "internalerror": "Эчке хата",
        "internalerror_info": "Эчке хата: $1",
-       "fileappenderrorread": "Кушу вакытында «$1» укып булмады.",
-       "fileappenderror": "\"$1\" һәм \"$2\" не кушып булмады.",
        "filecopyerror": "«$2» файлына «$1» файлының копиясен ясап булмый.",
        "filerenameerror": "«$1» файлының исемен «$2» исеменә алыштырып булмый.",
        "filedeleteerror": "«$1» файлын бетереп булмый.",
        "directorycreateerror": "«$1» директориясен ясап булмый.",
        "filenotfound": "«$1» файлын табып булмый.",
-       "fileexistserror": "«$1» файлына яздырып булмый: ул инде бар.",
        "unexpected": "Көтелмәгән кыймәт: «$1»=«$2».",
        "formerror": "Хата: форма мәгълүматларын тапшырып булмый",
        "badarticleerror": "Бу биттә мондый гамәл башкарып булмый.",
        "savearticle": "Битне саклау",
        "preview": "Алдан карау",
        "showpreview": "Алдан карау",
-       "showlivepreview": "Тиз алдан карау",
        "showdiff": "Кертелгән үзгәртүләр",
        "anoneditwarning": "'''Игътибар''': Сез системага кермәгәнсез. IP адресыгыз бу битнең тарихына язылачак.",
        "anonpreviewwarning": "''Сез системада теркәлмәдегез.Сезнең тарафтан эшләнгән барлык үзгәртүләр дә сезнең IP-юлламагызны саклауга китерә.''",
        "search-nonefound": "Сорауга туры килгән җаваплар табылмады.",
        "powersearch-legend": "Өстәмә эзләү",
        "powersearch-ns": "исемнәрендә эзләү",
-       "powersearch-redir": "Юнәлтүләр күрсәтелсен",
        "powersearch-togglelabel": "Кире кагыу:",
        "powersearch-toggleall": "Барысы",
        "powersearch-togglenone": "Бирни дә юк",
        "prefs-advancedsearchoptions": "Киңәйтелгән көйләүләр",
        "prefs-advancedwatchlist": "Киңәйтелгән көйләүләр",
        "prefs-displayrc": "Күрсәтү көйләнмәләре",
-       "prefs-displaysearchoptions": "Күрсәтү көйләнмәләре",
        "prefs-displaywatchlist": "Күрсәтү көйләнмәләре",
        "prefs-diffs": "Юрамалар аермасы",
        "userrights": "Кулланучы хокуклары белән идарә итү",
        "recentchanges-label-plusminus": "Битнең зурлыгы шуның кадәрле байтка үзгәрде",
        "recentchanges-legend-newpage": "([[Special:NewPages|яңа бит]])",
        "rcnotefrom": "Астарак '''$2''' башлап ('''$1''' кадәр) үзгәртүләр күрсәтелгән.",
-       "rclistfrom": "$1 башлап яңа үзгәртүләрне күрсәт",
+       "rclistfrom": "$3 $2 башлап яңа үзгәртүләрне күрсәт",
        "rcshowhideminor": "кече үзгәртүләрне $1",
        "rcshowhideminor-show": "күрсәт",
        "rcshowhideminor-hide": "яшер",
        "unwatching": "Күзәтү исемлегемнән чыгаруы…",
        "enotif_impersonal_salutation": "{{SITENAME}} кулланучы",
        "enotif_lastvisited": "Соңгы керүегездән соң булган барлык үзгәртүләрне күрер өчен, бу сылтама аша узыгыз: $1",
-       "enotif_body": "Хөрмәтле $WATCHINGUSERNAME,\n\n«{{SITENAME}}» проектының «$PAGETITLE» бите  $PAGEEDITOR  тарафыннан  $PAGEEDITDATE  көнне  $CHANGEDORCREATED. Битне карар өчен $PAGETITLE_URL  буенча узыгыз.\n\n$NEWPAGE\n\nҮзгәртүнең кыска эчтәлеге: $PAGESUMMARY $PAGEMINOREDIT\n\nҮзгәртүчегә язу:\nэл. почта $PAGEEDITOR_EMAIL\nвики $PAGEEDITOR_WIKI\n\nБу биткә кермәсәгез, аның башка үзгәртүләре турында хат җибәрелмәячәк. Шулай ук сез күзәтү исемлегегездә булган битләр өчен хәбәр бирү флагын алып куя аласыз.\n\n             {{grammar:genitive|{{SITENAME}}}} хәбәр бирү системасы\n\n--\nХәбәр итүләр көйләүләрен үзгәртү:\n{{canonicalurl:{{#special:Preferences}}}}\n\nКүзәтү исемлеге көйләүләрен үзгәртү:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nБитне сезнең күзәтү исемлегездән бетерү:\n$UNWATCHURL\n\nЭлемтә һәм ярдәм:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Хөрмәтле $WATCHINGUSERNAME,\n\n«{{SITENAME}}» проектының «$PAGETITLE» бите  $PAGEEDITOR  тарафыннан  $PAGEEDITDATE  көнне  $CHANGEDORCREATED. Битне карар өчен $PAGETITLE_URL  буенча узыгыз.\n\n$NEWPAGE\n\nҮзгәртүнең кыска эчтәлеге: $PAGESUMMARY $PAGEMINOREDIT\n\nҮзгәртүчегә язу:\nэл. почта $PAGEEDITOR_EMAIL\nвики $PAGEEDITOR_WIKI\n\nБу биткә кермәсәгез, аның башка үзгәртүләре турында хат җибәрелмәячәк. Шулай ук сез күзәтү исемлегегездә булган битләр өчен хәбәр бирү флагын алып куя аласыз.\n\n             {{grammar:genitive|{{SITENAME}}}} хәбәр бирү системасы\n\n--\nХәбәр итүләр көйләүләрен үзгәртү:\n{{canonicalurl:{{#special:Preferences}}}}\n\nКүзәтү исемлеге көйләүләрен үзгәртү:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nБитне сезнең күзәтү исемлегездән бетерү:\n$UNWATCHURL\n\nЭлемтә һәм ярдәм:\n$HELPPAGE",
        "created": "төзергән",
        "changed": "үзгәртелде",
        "deletepage": "Битне бетерү",
        "whatlinkshere-filters": "Фильтрлар",
        "blockip": "Кулланучыны тыю",
        "blockip-legend": "Кулланучыны тыю",
-       "ipadressorusername": "IP адресы яки кулланучы исеме:",
+       "ipaddressorusername": "IP адресы яки кулланучы исеме:",
        "ipbexpiry": "Бетә:",
        "ipbreason": "Сәбәп:",
        "ipbreason-dropdown": "* Кысуның гадәттәге сәбәпләре\n** Ялган мәгълүмат кертү\n** Битләрнең эчтәлеген сөртү\n** Тышкы сайтларга спам-сылтамалар\n** Мәгънәсез текст/чүп өстәү\n** Кулланучыларны эзәрлекләү/янаулар\n** Берничә хисап язмасы белән исәпләшмәү\n** Кулланучы исеменең яраксыз булуы",
        "show-big-image": "Тулы ачыклык",
        "newimages": "Яңа сүрәтләр җыелмасы",
        "newimages-legend": "Фильтр",
-       "showhidebots": "($1 бот)",
        "ilsubmit": "Эзләү",
        "bad_image_list": "Киләчәк рәвеш кирәк:\n\nИсемлек кисәкләре генә (* символыннан башланучы юллар) саналырлар.\nЮлның беренче сылтамасы куйма өчен тыелган рәсемгә сылтама булырга тиеш.\nШул ук юлның киләчәк сылтамалары чыгармалар, рәсемгә тыелмаган битләре, саналырлар.",
        "metadata": "Мета мәгълүматлар",
        "table_pager_empty": "Нәтиҗә юк",
        "autoredircomment": "[[$1]] битенә юнәлтү",
        "autosumm-new": "Яңа бит: «$1»",
-       "livepreview-loading": "Йөкләү...",
-       "livepreview-ready": "Йөкләү... Әзер!",
        "watchlistedit-raw-titles": "Язмалар:",
        "watchlisttools-view": "Соңгы үзгәртүләрне күрсәтү",
        "watchlisttools-edit": "Күзәтү исемлегене карау һәм үзгәртү",
        "compare-rev1": "Беренче юрама",
        "compare-rev2": "Икенче юрама",
        "compare-submit": "Чагыштыр",
-       "dberr-header": "Бу вики авырлык кичерә",
        "dberr-problems": "Гафу итегез! Сайтта техник кыенлыклар чыкты.",
        "dberr-again": "Сәхифәне берничә минуттан соң яңартып карагыз.",
        "dberr-info": "(Мәгълүматлар базасы серверы белән тоташырга мөмкин түгел: $1)",
index ede71e4..206af30 100644 (file)
@@ -6,7 +6,8 @@
                        "KhayR",
                        "Reedy",
                        "Urhixidur",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Sıltamalarnıñ astına sızu:",
@@ -19,7 +20,6 @@
        "tog-showtoolbar": "Üzgärtü waqıtında qorallarnıñ öske panele kürsätelsen (JavaScript kiräk)",
        "tog-editondblclick": "Bitlärgä ike çirtterü belän üzgärtü bite açılsın (JavaScript kiräk)",
        "tog-editsectiononrightclick": "Bülek isemenä tıçqannıñ uñ çirttermäse belän törtkäç üzgärtü bite açılsın (JavaScript kiräk)",
-       "tog-rememberpassword": "Xisap yazmamnı bu brauzerda saqlansın (iñ küp $1 {{PLURAL:$1|kön|kön|kön}}gä qädär)",
        "tog-watchcreations": "Tözegän bitlärem küzätü isemlegemä östälsen",
        "tog-watchdefault": "Üzgärtkän bitlärem küzätü isemlegemä östälsen",
        "tog-watchmoves": "Küçergän bitlärem küzätü isemlegemä östälsen",
        "readonly_lag": "Mäğlümatlar bazası, östämä server töp server belän sinxronizatsiäläşkänçe, üzgärülärdän avtomat räweştä yabıldı.",
        "internalerror": "Eçke xata",
        "internalerror_info": "Eçke xata: $1",
-       "fileappenderrorread": "Quşu waqıtında «$1» uqıp bulmadı.",
-       "fileappenderror": "\"$1\" häm \"$2\" ne quşıp bulmadı.",
        "filecopyerror": "«$2» faylına «$1» faylınıñ kopiäsen yasap bulmıy.",
        "filerenameerror": "«$1» faylınıñ isemen «$2» isemenä alıştırıp bulmıy.",
        "filedeleteerror": "«$1» faylın beterep bulmıy.",
        "directorycreateerror": "«$1» direktoriäsen yasap bulmıy.",
        "filenotfound": "«$1» faylın tabıp bulmıy.",
-       "fileexistserror": "«$1» faylına yazdırıp bulmıy: ul inde bar.",
        "unexpected": "Kötelmägän qimät: «$1»=«$2».",
        "formerror": "Xata: forma mäğlümatların tapşırıp bulmıy",
        "badarticleerror": "Bu bittä mondıy ğämäl başqarıp bulmıy.",
        "savearticle": "Bitne saqlaw",
        "preview": "Aldan qaraw",
        "showpreview": "Aldan qaraw",
-       "showlivepreview": "Tiz aldan qaraw",
        "showdiff": "Kertelgän üzgärtülär",
        "anoneditwarning": "'''İğtibar''': Sez sistemağa kermägänsez. IP adresığız bu bitneñ tarixına yazılaçaq.",
        "anonpreviewwarning": "''Sez sistemada terkälmädegez.Sezneñ taraftan eşlängän barlıq üzgärtülär dä sezneñ IP-yullamağıznı saqlawğa kiterä.''",
        "search-nonefound": "Sorawğa turı kilgän cawaplar tabılmadı.",
        "powersearch-legend": "Östämä ezläw",
        "powersearch-ns": "isemnärendä ezläw",
-       "powersearch-redir": "Yünältülär kürsätelsen",
        "powersearch-togglelabel": "Kire qağıw:",
        "powersearch-toggleall": "Barısı",
        "powersearch-togglenone": "Birni dä yuq",
        "prefs-advancedsearchoptions": "Kiñäytelgän köyläwlär",
        "prefs-advancedwatchlist": "Kiñäytelgän köyläwlär",
        "prefs-displayrc": "Kürsätü köylänmäläre",
-       "prefs-displaysearchoptions": "Kürsätü köylänmäläre",
        "prefs-displaywatchlist": "Kürsätü köylänmäläre",
        "prefs-diffs": "Yuramalar ayırması",
        "userrights": "Qullanuçı xoquqları belän idarä itü",
        "recentchanges-label-newpage": "Bu üzgärtü belän yaña bit tözelde",
        "recentchanges-label-minor": "Bu keçe üzgärtü",
        "rcnotefrom": "Astaraq '''$2''' başlap ('''$1''' qädär) üzgärtülär kürsätelgän.",
-       "rclistfrom": "$1 başlap yaña üzgärtülärne kürsät",
+       "rclistfrom": "$3 $2 başlap yaña üzgärtülärne kürsät",
        "rcshowhideminor": "keçe üzgärtülärne $1",
        "rcshowhidebots": "botlarnı $1",
        "rcshowhideliu": "kergän qullanuçılarnı $1",
        "unwatching": "Küzätü isemlegemnän çığaruı…",
        "enotif_impersonal_salutation": "{{SITENAME}} qullanuçı",
        "enotif_lastvisited": "Soñğı kerüegezdän soñ bulğan barlıq üzgärtülärne kürer öçen, bu sıltama aşa uzığız: $1",
-       "enotif_body": "Xörmätle $WATCHINGUSERNAME,\n\n«{{SITENAME}}» proyektınıñ «$PAGETITLE» bite  $PAGEEDITOR  tarafınnan  $PAGEEDITDATE  könne  $CHANGEDORCREATED. Bitne qarar öçen $PAGETITLE_URL  buyınça uzığız.\n\n$NEWPAGE\n\nÜzgärtüneñ qısqa eçtälege: $PAGESUMMARY $PAGEMINOREDIT\n\nÜzgärtüçegä yazu:\nel. poçta $PAGEEDITOR_EMAIL\nwiki $PAGEEDITOR_WIKI\n\nBu bitkä kermäsägez, anıñ başqa üzgärtüläre turında xat cibärelmäyäçäk. Şulay uq sez küzätü isemlegegezdä bulğan bitlär öçen xäbär birü flağın alıp quya alasız.\n\n             {{SITENAME}} xäbär birü sisteması\n\n--\nKüzätü isemlege köyläwlären üzgärtü:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nBitne sezneñ küzätü isemlegezdän beterü:\n$UNWATCHURL\n\nElemtä häm yärdäm:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Xörmätle $WATCHINGUSERNAME,\n\n«{{SITENAME}}» proyektınıñ «$PAGETITLE» bite  $PAGEEDITOR  tarafınnan  $PAGEEDITDATE  könne  $CHANGEDORCREATED. Bitne qarar öçen $PAGETITLE_URL  buyınça uzığız.\n\n$NEWPAGE\n\nÜzgärtüneñ qısqa eçtälege: $PAGESUMMARY $PAGEMINOREDIT\n\nÜzgärtüçegä yazu:\nel. poçta $PAGEEDITOR_EMAIL\nwiki $PAGEEDITOR_WIKI\n\nBu bitkä kermäsägez, anıñ başqa üzgärtüläre turında xat cibärelmäyäçäk. Şulay uq sez küzätü isemlegegezdä bulğan bitlär öçen xäbär birü flağın alıp quya alasız.\n\n             {{SITENAME}} xäbär birü sisteması\n\n--\nKüzätü isemlege köyläwlären üzgärtü:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nBitne sezneñ küzätü isemlegezdän beterü:\n$UNWATCHURL\n\nElemtä häm yärdäm:\n$HELPPAGE",
        "created": "tözergän",
        "changed": "üzgärtelde",
        "deletepage": "Bitne beterü",
        "whatlinkshere-filters": "Filtrlar",
        "blockip": "Qullanuçını tıyu",
        "blockip-legend": "Qullanuçını tıyu",
-       "ipadressorusername": "IP adresı yäki qullanuçı iseme:",
+       "ipaddressorusername": "IP adresı yäki qullanuçı iseme:",
        "ipbexpiry": "Betä:",
        "ipbreason": "Säbäp:",
        "ipbreason-dropdown": "* Qısunıñ ğädättäge säbäpläre\n** Yalğan mäğlümat kertü\n** Bitlärneñ eçtälegen sörtü\n** Tışqı saytlarğa spam-sıltamalar\n** Mäğnäsez tekst/çüp östäw\n** Qullanuçılarnı ezärlekläw/yanawlar\n** Berniçä xisap yazması belän isäpläşmäw\n** Qullanuçı isemeneñ yaraqsız buluı",
        "show-big-image": "Tulı açıqlıq",
        "newimages": "Yaña sürätlär cıyılması",
        "newimages-legend": "Filtr",
-       "showhidebots": "($1 bot)",
        "ilsubmit": "Ezläw",
        "bydate": "waqıt buyınça",
        "bad_image_list": "Kiläçäk räweş kiräk:\n\nİsemlek kisäkläre genä (* simvolınnan başlanuçı yullar) sanalırlar.\nYulnıñ berençe sıltaması quyma öçen tıyılğan räsemgä sıltama bulırğa tieş.\nŞul uq yulnıñ kiläçäk sıltamaları çığarmalar, räsemgä tıyılmağan bitläre, sanalırlar.",
        "table_pager_empty": "Näticä yuq",
        "autoredircomment": "[[$1]] bitenä yünältü",
        "autosumm-new": "Yaña bit: «$1»",
-       "livepreview-loading": "Yökläw...",
-       "livepreview-ready": "Yökläw... Äzer!",
        "watchlistedit-raw-titles": "Yazmalar:",
        "watchlisttools-view": "Soñğı üzgärtülärne kürsätü",
        "watchlisttools-edit": "Küzätü isemlegene qaraw häm üzgärtü",
        "tag-filter-submit": "Filtrlaw",
        "tags-edit": "üzgärtü",
        "compare-submit": "Çağıştır",
-       "dberr-header": "Bu wiki awırlıq kiçerä",
        "dberr-problems": "Ğafu itegez! Saytta texnik qıyınlıqlar çıqtı.",
        "htmlform-submit": "Cibärü",
        "htmlform-reset": "Üzgärtülärne kire qaytaru",
index c0bed82..332c006 100644 (file)
@@ -7,7 +7,8 @@
                        "Krice from Tyvanet.com",
                        "Sborsody",
                        "friends at tyvawiki.org",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Холбааны шыяры:",
@@ -18,7 +19,6 @@
        "tog-numberheadings": "Эгелерин авто-санаар",
        "tog-showtoolbar": "Өскертир херекселдерни көргүзер (JavaScript)",
        "tog-editondblclick": "Арынны өскертирде ийи катап базар (JavaScript)",
-       "tog-rememberpassword": "Мени бо компьютерге сактыры ($1 {{PLURAL:$1|1=хүн|хүн}} ишти)",
        "tog-watchcreations": "Мээң чаяан арыннарымны хайгаарал даңзымче немээри.",
        "tog-watchdefault": "Мээң өскерткен арыннарымны хайгаарал даңзымче немээри.",
        "tog-watchmoves": "Мээң катап адаан арыннарымны хайгаарал даңзымче немээри.",
        "recentchanges-label-unpatrolled": "Бо өскертилге истетинмээн (патрульдаттынмаан)",
        "recentchanges-legend-newpage": "$1 — чаа арын",
        "rcnotefrom": "Адаанда <strong>$2</strong> тура (<strong>$1</strong> чедир) өскертилгелерни санаан.",
-       "rclistfrom": "$1 тура чаа өскерилгелерни көргүзер",
+       "rclistfrom": "$3 $2 тура чаа өскерилгелерни көргүзер",
        "rcshowhideminor": "Бичии өскерлиишкиннерни $1",
        "rcshowhidebots": "Роботтарны $1",
        "rcshowhideliu": "Кирген киржикчилерни $1",
index eb141f6..2e329dc 100644 (file)
@@ -8,7 +8,8 @@
                        "Reedy",
                        "Sahran",
                        "Tel'et",
-                       "بىلگە"
+                       "بىلگە",
+                       "아라"
                ]
        },
        "tog-underline": "ئۇلانما ئاستى سىزىقى:",
@@ -21,7 +22,6 @@
        "tog-showtoolbar": "تەھرىر قورال بالداقنى كۆرسەت",
        "tog-editondblclick": "قوش چەككەندە بەت تەھرىرلە",
        "tog-editsectiononrightclick": "تېمىنى ئوڭ چېكىپ ئابزاس تەھرىرلەشكە يول قوي",
-       "tog-rememberpassword": "بۇ كومپيۇتېردا كىرگىنىمنى ئەستە ساقلا(ئەڭ ئۇزۇن بولغاندا $1 {{PLURAL:$1|كۈن|كۈن}})",
        "tog-watchcreations": "مەن قۇرغان بەت ۋە يۈكلىگەن ھۆججەتلەرنى كۆزەت تىزىملىكىمگە قوش",
        "tog-watchdefault": "مەن تەھرىرلىگەن بەت ۋە ھۆججەتنى كۆزەت تىزىملىكىمگە قوش",
        "tog-watchmoves": "مەن يۆتكىگەن بەت ۋە ھۆججەتنى كۆزەت تىزىملىكىمگە قوش",
        "readonly_lag": "قوشۇمچە ساندان مۇلازىمىتىر غەملەكنى ئاساسىي مۇلازىمىتىرغا يېڭىلاۋاتىدۇ، ساندان ئۆزلۈكىدىن قۇلۇپلاندى",
        "internalerror": "ئىچكى خاتالىق",
        "internalerror_info": "ئىچكى خاتالىق: $1",
-       "fileappenderrorread": "قوشۇۋاتقاندا \"$1\" ئوقۇيالمىدى.",
-       "fileappenderror": "\"$1\" نى \"$2\" غا قوشالمىدى.",
        "filecopyerror": "\"$1\" ھۆججەتنى\"$2\" غا كۆچۈرەلمىدى.",
        "filerenameerror": "\"$1\" ھۆججەتنىڭ ئاتىنى \"$2\" غا ئۆزگەرتەلمىدى.",
        "filedeleteerror": "\"$1\" ھۆججەتنى ئۆچۈرەلمىدى.",
        "directorycreateerror": "\"$1\" مۇندەرىجىنى قۇرالمىدى.",
        "filenotfound": "\"$1\" ھۆججەتنى تاپالمىدى.",
-       "fileexistserror": "\"$1\" ھۆججەتكە يازالمىدى: ھۆججەت مەۋجۇد",
        "unexpected": "كۈتۈلمىگەن قىممەت: \"$1\"=\"$2\".",
        "formerror": "خاتالىق: جەدۋەلنى يوللىيالمىدى",
        "badarticleerror": "مەزكۇر بەتتە بۇ خىل مەشغۇلاتنى ئېلىپ بارغىلى بولمايدۇ.",
        "userlogin-resetpassword-link": "پارولىڭىزنى ئۇنتۇپ قالدىڭىزمۇ؟",
        "userlogin-loggedin": "سىز ئاللىقاچان {{GENDER:$1|$1}} ھالىتىدە تىزىمغا كىرىپ بولدىڭىز. تۆۋەندىكىلەرنى تولدۇرۇپ باشقا ئىشلەتكۈچى ھالىتىدە تىزىمغا كىرىڭ.",
        "userlogin-createanother": "باشقا ھېسابات قۇرىمەن",
-       "createacct-join": "تۆۋەنگە ئۇچۇرلىرىڭىزنى كىرگۈزۈڭ.",
-       "createacct-another-join": "يېڭى ئىشلەتكۈچىنىڭ ئۇچۇرلىرىنى كىرگۈزۈڭ.",
        "createacct-emailrequired": "ئېلخەت ئادرېسى",
        "createacct-emailoptional": "ئېلخەت ئادرېسى (ئىختىيارى)",
        "createacct-email-ph": "ئېلخەت ئادرېسىڭىزنى كىرگۈزۈڭ",
        "savearticle": "بەت ساقلا",
        "preview": "ئالدىن كۆزەت",
        "showpreview": "ئالدىن كۆزىتىشنى كۆرسەت",
-       "showlivepreview": "رىئال ۋاقىتلىق ئالدىن كۆزىتىش",
        "showdiff": "ئۆزگەرتىشنى كۆرسەت",
        "anoneditwarning": "'''ئاگاھلاندۇرۇش:''' سىز تېخى كىرمىدىڭىز.\n سىزنىڭ IP ئادرېسىڭىز بۇ بەتنىڭ تەھرىرلەش تارىخىغا خاتىرىلىنىدۇ.",
        "anonpreviewwarning": "''سىز تېخى تىزىمغا كىرمىدىڭىز. سىزنىڭ IP ئادرېسىڭىز بۇ بەتنىڭ تەھرىرلەش تارىخىغا خاتىرىلىنىدۇ.''",
        "edit-gone-missing": "بۇ بەتنى يېڭىلىيالمايدۇ.\nئۇ بايىلا ئۆچۈرۈلگەن بولۇشى مۇمكىن.",
        "edit-conflict": "تەھرىر توقۇنۇشى.",
        "edit-no-change": "تەھرىرلىگىنىڭىزگە پەرۋا قىلىنمىدى، چۈنكى تېكستتە ئۆزگىرىش بولمىدى.",
-       "postedit-confirmation": "تەھرىرلىگىنىڭىز ساقلاندى.",
+       "postedit-confirmation-saved": "تەھرىرلىگىنىڭىز ساقلاندى.",
        "edit-already-exists": "يېڭى بەت قۇرالمىدى.\nبەت بۇرۇندىن مەۋجۇد.",
        "defaultmessagetext": "كۆڭۈلدىكى ئۇچۇر تېكستى",
        "content-failed-to-parse": "$2 نى $1 گە ئانالىز قلش مەغلۇپ بولدى: $3",
        "search-nonefound": "سۈرۈشتۈرۈشكە ماس نەتىجە تېپىلمىدى.",
        "powersearch-legend": "ئالىي ئىزدەش",
        "powersearch-ns": "ئات بوشلۇقىدىن ئىزدە:",
-       "powersearch-redir": "قايتا نىشانلانغان بەت تىزىملىكى",
        "powersearch-togglelabel": "تاللا:",
        "powersearch-toggleall": "ھەممىسى",
        "powersearch-togglenone": "يوق",
        "prefs-advancedsearchoptions": "ئالىي تاللانما",
        "prefs-advancedwatchlist": "ئالىي تاللانما",
        "prefs-displayrc": "كۆرسىتىش تاللانما",
-       "prefs-displaysearchoptions": "كۆرسىتىش تاللانما",
        "prefs-displaywatchlist": "كۆرسىتىش تاللانما",
        "prefs-tokenwatchlist": "ئاچقۇچ",
        "prefs-diffs": "پەرقلەر",
        "recentchanges-label-unpatrolled": "بۇ تەھرىر تېخى كۆزىتىلمىگەن",
        "recentchanges-legend-newpage": "(بۇنىڭغىمۇ قاراڭ [[Special:NewPages|يېڭى بەتلەر تىزىملىگى]])",
        "rcnotefrom": "تۆۋەندىكىسى '''$2''' نىڭ ئۆزگەرتىشى (ئەڭ كۆپ بولغاندا '''$1''' كۆرسىتىدۇ )",
-       "rclistfrom": "$1 دىن باشلانغان يېڭى ئۆزگەرتىشنى كۆرسەت",
+       "rclistfrom": "$3 $2 دىن باشلانغان يېڭى ئۆزگەرتىشنى كۆرسەت",
        "rcshowhideminor": "$1 ئازراقلا تەھرىر",
        "rcshowhidebots": "$1 ماشىنا ئادەمنىڭ تەھرىرى",
        "rcshowhideliu": "$1 خەتلەنگەن ئىشلەتكۈچى",
        "uploadstash-refresh": "ھۆججەت تىزىمىنى يېڭىلا",
        "invalid-chunk-offset": "ئىناۋەتسىز بۆلەك چەتنىشى",
        "img-auth-accessdenied": "زىيارەت رەت قىلىندى",
-       "img-auth-nopathinfo": "يوقالغان PATH_INFO.\nمۇلازىمىتىرىڭىز بۇ ئۇچۇرنى يوللاشنى تەڭشىمىگەن.\nئۇ CGI ئاساسىدا بولغاچقا img_auth نى قوللىمايدۇ. تۆۋەندىكى ئادرېستىن كۆرۈڭ\nhttps://www.mediawiki.org/wiki/Manual:Image_Authorization",
+       "img-auth-nopathinfo": "يوقالغان PATH_INFO.\nمۇلازىمىتىرىڭىز بۇ ئۇچۇرنى يوللاشنى تەڭشىمىگەن.\nئۇ CGI ئاساسىدا بولغاچقا img_auth نى قوللىمايدۇ. تۆۋەندىكى ئادرېستىن كۆرۈڭ\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization",
        "img-auth-notindir": "سەپلەنگەن يۈكلەش مۇندەرىجىسىدىن ئىلتىماس قىلغان يولنى تاپالمىدى.",
        "img-auth-badtitle": "\"$1\" ئۈچۈن ئىناۋەتلىك ماۋزۇ قۇرالمىدى.",
        "img-auth-nologinnWL": "سىز تېخى تىزىمغا كىرمىدىڭىز، \"$1\" ئاق تىزىملىكتە ئەمەس.",
        "watchlist-details": "كۆزەت تىزىملىكىڭىزدە {{PLURAL:$1|$1 بەت|$1 بەت}}  بار، مۇنازىرە بېتىنى ئۆز ئىچىگە ئالمايدۇ.",
        "wlheader-enotif": "ئېلخەتتە ئەسكەرتىش ئىقتىدارى قوزغىتىلدى.",
        "wlheader-showupdated": "سىز ئالدىنقى قېتىم كۆرگەندىن كېيىن ئۆزگەرتىلگەن بەتلەر '''توم''' كۆرۈنىدۇ",
-       "watchmethod-recent": "كۆزىتىۋاتقان بەتنىڭ يېقىنقى ئۆزگەرتىشىنى تەكشۈر",
-       "watchmethod-list": "كۆزىتىۋاتقان بەتنىڭ يېقىنقى ئۆزگەرتىشىنى تەكشۈر",
-       "watchlistcontains": "كۆزەت تىزىملىكىڭىزدە $1 {{PLURAL:$1|بەت|بەت}} بار.",
-       "iteminvalidname": "بەت'$1'  خاتالىقى، ئاتى ئىناۋەتسىز…",
        "wlshowlast": "يېقىنقى $1 سائەت $2 كۈن $3 نىڭ ئۆزگەرتىشىنى كۆرسەت",
        "watchlist-options": "كۆزەت تىزىملىك تاللانما",
        "watching": "كۆزەت قىلىۋاتىدۇ…",
        "enotif_lastvisited": "ئالدىنقى قېتىملىق زىيارەتتىن كېيىنكى ھەممە ئۆزگەرتىشنى $1 كۆرۈڭ.",
        "enotif_lastdiff": "بۇ ئۆزگەرتىشنى كۆرمەكچى بولسىڭىز $1 كۆرۈڭ.",
        "enotif_anon_editor": "$1 ئاتسىز ئىشلەتكۈچى",
-       "enotif_body": "قەدىرلىك $WATCHINGUSERNAME،\n\nPAGEINTRO $NEWPAGE$\n\nتەھرىر ئۈزۈندىسى: PAGESUMMARY $PAGEMINOREDIT$\n\nبۇ تەھرىر بىلەن ئالاقىلىشىڭ:\n\nئېلخەت: $PAGEEDITOR_EMAIL\n\nۋىكى: $PAGEEDITOR_WIKI\n\nسىز بۇ بەتنى زىيارەت قىلىشتىن ئىلگىرى، كەلگۈسىدىكى ئۆزگەرتىش سىزگە ئۇقتۇرۇش قىلىنمايدۇ.  سىز كۆزىتىۋاتقان بەت تىزىمىنىڭ ئۇقتۇرۇش بەلگىسىنى قايتا تەڭشىسىڭىزمۇ بولىدۇ.\n\n{{SITENAME}} ئۇقتۇرۇش سىستېمىسى\n\n--\nكۆزەت تىزىمى تەڭشىكىڭىزنى ئۆزگەرتسىڭىز،\n{{canonicalurl:{{#special:Preferences}}}}نى زىيارەت قىلىڭ\n\nكۆزەت تىزىمىڭىزدىكى شۇ بەتنى ئۆچۈرمەكچى بولسىڭىز،\n$UNWATCHURL نى زىيارەت قىلىڭ\n\nقايتما ئىنكاس ياكى تېخىمۇ كۆپ ياردەمگە ئېرىشمەكچى بولسىڭىز:\n{{canonicalurl:{{MediaWiki:Helppage}}}} نى زىيارەت قىلىڭ",
+       "enotif_body": "قەدىرلىك $WATCHINGUSERNAME،\n\nPAGEINTRO $NEWPAGE$\n\nتەھرىر ئۈزۈندىسى: PAGESUMMARY $PAGEMINOREDIT$\n\nبۇ تەھرىر بىلەن ئالاقىلىشىڭ:\n\nئېلخەت: $PAGEEDITOR_EMAIL\n\nۋىكى: $PAGEEDITOR_WIKI\n\nسىز بۇ بەتنى زىيارەت قىلىشتىن ئىلگىرى، كەلگۈسىدىكى ئۆزگەرتىش سىزگە ئۇقتۇرۇش قىلىنمايدۇ.  سىز كۆزىتىۋاتقان بەت تىزىمىنىڭ ئۇقتۇرۇش بەلگىسىنى قايتا تەڭشىسىڭىزمۇ بولىدۇ.\n\n{{SITENAME}} ئۇقتۇرۇش سىستېمىسى\n\n--\nكۆزەت تىزىمى تەڭشىكىڭىزنى ئۆزگەرتسىڭىز،\n{{canonicalurl:{{#special:Preferences}}}}نى زىيارەت قىلىڭ\n\nكۆزەت تىزىمىڭىزدىكى شۇ بەتنى ئۆچۈرمەكچى بولسىڭىز،\n$UNWATCHURL نى زىيارەت قىلىڭ\n\nقايتما ئىنكاس ياكى تېخىمۇ كۆپ ياردەمگە ئېرىشمەكچى بولسىڭىز:\n$HELPPAGE نى زىيارەت قىلىڭ",
        "created": "قۇرغان",
        "changed": "ئۆزگەردى",
        "deletepage": "بەت ئۆچۈر",
        "blockip": "چەكلەنگەن ئىشلەتكۈچى",
        "blockip-legend": "چەكلەنگەن ئىشلەتكۈچى",
        "blockiptext": "تۆۋەندىكى جەدۋەلنى ئىشلىتىپ بەلگىلىك IP ئادرېس ياكى ئىشلەتكۈچى ئاتىدىن كەلگەن يېزىش زىيارىتىنى چەكلەشكە بولىدۇ.\nپەقەت بۇزغۇنچىلىكنىڭ ئالدىنى ئېلىش ھەمدە [[{{MediaWiki:Policy-url}}|تاكتىكا]].\nسىغا ئۇيغۇن بولغان ئەھۋالدا ئاندىن بۇ مەشغۇلاتنى ئېلىپ بېرىشقا بولىدۇ. تۆۋەندە ئەمەلىي سەۋەب (مەسىلەن، بۇزۇۋېتىلگەن بەتتىن بىرنى نەقىل ئېلىش)تىن بىرنى كىرگۈزۈڭ.",
-       "ipadressorusername": "IP ئادرېس ياكى ئىشلەتكۈچى ئاتى:",
+       "ipaddressorusername": "IP ئادرېس ياكى ئىشلەتكۈچى ئاتى:",
        "ipbexpiry": "مۇددىتى:",
        "ipbreason": "سەۋەب:",
        "ipbreason-dropdown": "*ئادەتتىكى چەكلەش سەۋەبى\n** ساختا ئۇچۇر قوشۇش\n** بەت مەزمۇنىنى چىقىرىۋېتىش\n** سىرتقى ئەخلەت ئۇلانما قوشۇش\n** بەتكە تۇترۇقسىز گەپ قوشۇش\n**  باشقىلارغا ھەيۋە قىلىش/مەجبۇرلاش\n** كۆپ ھېساباتنى قالايمىغان ئىشلىتىش\n** قوبۇل قىلغىلى بولمايدىغان ئىشلەتكۈچى ئاتى",
        "group-bot.js": "/* Any JavaScript here will be loaded for bots only */",
        "group-sysop.js": "/* Any JavaScript here will be loaded for sysops only */",
        "group-bureaucrat.js": "/* Any JavaScript here will be loaded for bureaucrats only */",
-       "notacceptable": "wiki مۇلازىمىتىرى سىزنىڭ خېرىدار تەرىپىڭىز ئوقۇيالايدىغان سانلىق مەلۇمات فورماتى بىلەن تەمىنلىيەلمەيدۇ.",
        "anonymous": " {{SITENAME}} نىڭ ئىمزاسىز {{PLURAL:$1|ئىشلەتكۈچى|ئىشلەتكۈچى}}",
        "siteuser": "{{SITENAME}} ئىشلەتكۈچى $1",
        "anonuser": "{{SITENAME}} ئاتسىز ئىشلەتكۈچى $1",
        "newimages-summary": "بۇ ئالاھىدە بەتتە ئەڭ ئاخىرىدا يۈكلەنگەن ھۆججەت كۆرسىتىلىدۇ.",
        "newimages-legend": "سۈزگۈچ",
        "newimages-label": "ھۆججەت ئاتى (ياكى ئۇنىڭ پارچىسى):",
-       "showhidebots": "($1 ماشىنا ئادەم)",
        "noimages": "كۆرۈدىغان ھېچنېمە يوق.",
        "ilsubmit": "ئىزدەش",
        "bydate": "چېسلا بويىچە",
        "autosumm-replace": "ئالماشتۇرۇلغان مەزمۇن '$1'",
        "autoredircomment": "قايتا نىشانلانغان بەت [[$1]]",
        "autosumm-new": "قۇرۇلغان بەت '$1'",
-       "livepreview-loading": "يۈكلەۋاتىدۇ…",
-       "livepreview-ready": "يۈكلەۋاتىدۇ… تەييارلاندى!",
-       "livepreview-failed": "رىئال ئالدىن كۆزىتىش مەغلۇپ بولدى! نورمال ئالدىن كۆزىتىشنى سىناڭ.",
-       "livepreview-error": "ئۇلىنىش مەغلۇپ بولدى: $1 \"$2\".\nنورمال ئالدىن كۆزىتىشنى سىناڭ.",
        "lag-warn-normal": "ئۆتكەن $1 {{PLURAL:$1|سېكۇنت|سېكۇنت}} ئىچىدىكى ئۆزگەرتىش تىزىملىكتە كۆرسىتىلمەسلىكى مۇمكىن.",
        "lag-warn-high": "ساندان ئۆتە كېچىككەنلىكتىن، ئۆتكەن $1 {{PLURAL:$1|سېكۇنت|سېكۇنت}} ئىچىدىكى ئۆزگەرتىش تىزىملىكتە كۆرسىتىلمەسلىكى مۇمكىن.",
-       "watchlistedit-numitems": "كۆزەت تىزىملىكىڭىزدە{{PLURAL:$1|1 ماۋزۇ|$1 ماۋزۇ}}, بار، مۇنازىرە بېتى بۇنىڭ سىرتىدا.",
-       "watchlistedit-noitems": "كۆزەت تىزىملىكىڭىزنىڭ ماۋزۇسى يوق",
        "watchlistedit-normal-title": "كۆزەت تىزىملىك تەھرىرى",
        "watchlistedit-normal-legend": "كۆزەت تىزىملىكىدىن ماۋزۇنى چىقىرىۋەت",
        "watchlistedit-normal-explain": "كۆزەت تىزىملىكىڭىزدىكى ماۋزۇ تۆۋەندە كۆرسىتىلىدۇ.\nماۋزۇنى بىرنى چىقىرىۋېتىشتە، ئۇنىڭ ئالدىدىكى تاللاشنى چىقىرىۋېتىپ، ئاندىن ماۋزۇ چىقىرىۋەتنى چېكىڭ.\nسىز [[Special:EditWatchlist/raw|/ئەسلى كۆزەت تىزىملىكى تەھرىر]]لىيەلەيسىز.",
        "compare-invalid-title": "سىز بەلگىلىگەن تېما ئىناۋەتسىز.",
        "compare-title-not-exists": "سىز بەلگىلىگەن تېما مەۋجۇت ئەمەس.",
        "compare-revision-not-exists": "سىز بەلگىلىگەن تۈزىتىلگەن نەشرى مەۋجۇت ئەمەس.",
-       "dberr-header": "بۇ wiki مەسىلىگە يولۇقتى",
        "dberr-problems": "كەچۈرۈڭ! بۇ بېكەتتە تېخنىكىلىق قىيىنچىلىق كۆرۈلدى.",
        "dberr-again": "بىر قانچە مىنۇت كۈتۈپ ئاندىن قايتا يۈكلەڭ.",
        "dberr-info": "(ساندان مۇلازىمىتىرىغا ئۇلىنالمىدى:  $1)",
index b2b3e1d..89ee4eb 100644 (file)
@@ -45,7 +45,8 @@
                        "Ата",
                        "Дар'я Козлова",
                        "Максим Підліснюк",
-                       "Тест"
+                       "Тест",
+                       "아라"
                ]
        },
        "tog-underline": "Підкреслювати посилання:\nПідкреслювання посилань:",
        "category-empty": "''Ця категорія зараз порожня.''",
        "hidden-categories": "{{PLURAL:$1|1=Прихована категорія|Приховані категорії|Прихованих категорій}}",
        "hidden-category-category": "Приховані категорії",
-       "category-subcat-count": "Показано $1 {{PLURAL:$1|підкатегорію з|підкатегорії з|підкатегорій із}} $2.",
+       "category-subcat-count": "{{PLURAL:$2|Ця категорія має тільки таку підкатегорію.|Ця категорія має $1 {{PLURAL:$1|таку підкатегорію з|такі підкатегорії з|таких підкатегорій із}} $2.}}",
        "category-subcat-count-limited": "У цій категорії {{PLURAL:$1|$1 підкатегорія|$1 підкатегорії|$1 підкатегорій}}.",
        "category-article-count": "Показано $1 {{PLURAL:$1|сторінку|сторінки|сторінок}} цієї категорії (із $2).",
        "category-article-count-limited": "У цій категорії {{PLURAL:$1|$1 сторінка|$1 сторінки|$1 сторінок}}.",
        "jumptonavigation": "навігація",
        "jumptosearch": "пошук",
        "view-pool-error": "Вибачте, сервери зараз перевантажені.\nНадійшло дуже багато запитів на перегляд цієї сторінки.\nБудь ласка, почекайте і повторіть спробу отримати доступ пізніше.\n\n$1",
+       "generic-pool-error": "Вибачте, сервери зараз перевантажені.\nНадійшло дуже багато запитів на перегляд цієї сторінки.\nБудь ласка, почекайте і повторіть спробу отримати доступ пізніше.",
        "pool-timeout": "Час очікування блокування вичерпано",
        "pool-queuefull": "Сервер запитів заповнений",
        "pool-errorunknown": "Невідома помилка",
        "readonly_lag": "База даних автоматично заблокована від змін, доки вторинний сервер БД не синхронізується з первинним.",
        "internalerror": "Внутрішня помилка",
        "internalerror_info": "Внутрішня помилка: $1",
-       "fileappenderrorread": "Не вдалося прочитати \"$1\" під час додавання.",
-       "fileappenderror": "Не вдалося приєднати «$1» до «$2».",
        "filecopyerror": "Неможливо скопіювати файл «$1» в «$2».",
        "filerenameerror": "Неможливо перейменувати файл «$1» в «$2».",
        "filedeleteerror": "Неможливо вилучити файл «$1».",
        "directorycreateerror": "Неможливо створити директорію «$1».",
        "filenotfound": "Неможливо знайти файл «$1».",
-       "fileexistserror": "Неможливо записати до файлу «$1»: файл існує.",
        "unexpected": "Неочікуване значення: «$1»=«$2».",
        "formerror": "Помилка: неможливо передати дані форми",
        "badarticleerror": "Ця дія не може бути виконана на цій сторінці.",
        "userlogin-helplink2": "Допомога з входом у систему",
        "userlogin-loggedin": "Ви вже увійшли як {{GENDER:$1|$1}}.\nВикористайте нижче форму для входу як інший користувач.",
        "userlogin-createanother": "Створити інший обліковий запис",
-       "createacct-join": "Введіть вашу інформацію нижче.",
-       "createacct-another-join": "Введіть нижче дані нового облікового запису.",
        "createacct-emailrequired": "Адреса електронної пошти",
        "createacct-emailoptional": "Адреса електронної пошти (не обов'язково)",
        "createacct-email-ph": "Введіть Вашу адресу електронної пошти",
        "savearticle": "Зберегти сторінку",
        "preview": "Попередній перегляд",
        "showpreview": "Попередній перегляд",
-       "showlivepreview": "Швидкий попередній перегляд",
        "showdiff": "Показати зміни",
        "anoneditwarning": "'''Увага''': Ви не увійшли до системи. Ваша IP-адреса буде записана до історії змін цієї сторінки.",
        "anonpreviewwarning": "''Ви не увійшли в систему. Якщо ви виконаєте збереження, то в історію сторінки буде записана ваша IP-адреса.''",
        "edit-gone-missing": "Неможливо оновити сторінку.\nІмовірно, вона була вилучена.",
        "edit-conflict": "Конфлікт редагувань.",
        "edit-no-change": "Ваше редагування відхилене, оскільки в тексті не було зроблено змін.",
-       "postedit-confirmation": "Ваше редагування збережено",
+       "postedit-confirmation-created": "Створено сторінку.",
+       "postedit-confirmation-restored": "Сторінка була відновлена.",
+       "postedit-confirmation-saved": "Ваше редагування збережено",
        "edit-already-exists": "Неможливо створити нову сторінку.\nВона вже існує.",
        "defaultmessagetext": "Текст «за замовчування»",
        "content-failed-to-parse": "Не вдалось проаналізувати $2 як тип $1: $3",
        "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) для парсера.",
        "searchmenu-exists": "'''У цій вікі є сторінка з назвою «[[:$1]]»'''",
        "searchmenu-new": "<strong>Створити сторінку «[[:$1]]» у цьому вікі-проекті!</strong>\n{{PLURAL:$2|0=|Див. також сторінку, знайдену по результатами вашого пошуку.|Див. також знайдені результати пошуку.}}",
        "searchprofile-articles": "Статті",
-       "searchprofile-project": "Сторінки довідки і проекту",
        "searchprofile-images": "Мультимедіа",
        "searchprofile-everything": "Усюди",
        "searchprofile-advanced": "Вибірково",
        "searchprofile-articles-tooltip": "Пошук у $1",
-       "searchprofile-project-tooltip": "Пошук у $1",
        "searchprofile-images-tooltip": "Пошук файлів",
        "searchprofile-everything-tooltip": "Пошук на всіх сторінках (включаючи сторінки обговорення)",
        "searchprofile-advanced-tooltip": "Шукати в заданих просторах назв",
        "search-nonefound": "Не знайдено результатів, що відповідають запиту.",
        "powersearch-legend": "Розширений пошук",
        "powersearch-ns": "Пошук у просторах назв:",
-       "powersearch-redir": "Показувати перенаправлення",
        "powersearch-togglelabel": "Позначити:",
        "powersearch-toggleall": "Усі",
        "powersearch-togglenone": "Жодний",
        "prefs-emailconfirm-label": "Підтвердження електронної пошти:",
        "youremail": "Адреса електронної пошти:",
        "username": "{{GENDER:$1|Ім'я користувача|Ім'я користувачки}}:",
-       "uid": "Ідентифікатор {{GENDER:$1|користувача}}:",
        "prefs-memberingroups": "{{GENDER:$2|Член}} {{PLURAL:$1|1=групи|груп}}:",
        "prefs-memberingroups-type": "$1",
        "prefs-registration": "Час реєстрації:",
        "prefs-advancedsearchoptions": "Розширені налаштування",
        "prefs-advancedwatchlist": "Розширені налаштування",
        "prefs-displayrc": "Налаштування показу",
-       "prefs-displaysearchoptions": "Налаштування показу",
        "prefs-displaywatchlist": "Налаштування показу",
        "prefs-tokenwatchlist": "Жетон",
        "prefs-diffs": "Різниці версій",
        "right-move": "Перейменування сторінок",
        "right-move-subpages": "Перейменування сторінок і їх підсторінок",
        "right-move-rootuserpages": "Перейменувати кореневі сторінки користувачів",
+       "right-move-categorypages": "Перейменування сторінок категорії.",
        "right-movefile": "перейменувати файли",
        "right-suppressredirect": "Нестворення перенаправлення зі старої назви на нову при перейменуванні сторінки",
        "right-upload": "Завантаження файлів",
        "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": "перезапис існуючого файлу",
        "recentchanges-legend-newpage": "(див. також [[Special:NewPages|список нових сторінок]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Нижче відображені редагування з <strong>$2</strong> (до <strong>$1</strong>).",
-       "rclistfrom": "Показати редагування починаючи з $1.",
+       "rclistfrom": "Показати редагування починаючи з $3 $2.",
        "rcshowhideminor": "$1 незначні редагування",
        "rcshowhideminor-show": "показати",
        "rcshowhideminor-hide": "приховати",
        "uploadstash-refresh": "Оновити список файлів",
        "invalid-chunk-offset": "Неприпустимий зсув фрагмента",
        "img-auth-accessdenied": "Відмовлено в доступі",
-       "img-auth-nopathinfo": "Відсутній PATH_INFO.\nВаш сервер не налаштовано для передачі цих даних.\nМожливо, він працює на основі CGI та не підтримує img_auth.\nПерегляньте [https://www.mediawiki.org/wiki/Manual:Image_Authorization Відкриття доступу до зображень]",
+       "img-auth-nopathinfo": "Відсутній PATH_INFO.\nВаш сервер не налаштовано для передачі цих даних.\nМожливо, він працює на основі CGI та не підтримує img_auth.\nПерегляньте [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization Відкриття доступу до зображень]",
        "img-auth-notindir": "Проханий шлях не відноситься до теки завантажень, вказаної в налаштуваннях.",
        "img-auth-badtitle": "Не можна побудувати правильний заголовок з «$1».",
        "img-auth-nologinnWL": "Ви не ввійшли в систему, а «$1» не входить у білий список.",
        "pageswithprop-prophidden-binary": "двійкове значення властивості приховано ($1)",
        "doubleredirects": "Подвійні перенаправлення",
        "doubleredirectstext": "На цій сторінці наведено список перенаправлень на інші перенаправлення.\nКожен рядок містить посилання на перше та друге перенаправлення, а також перший рядок тексту другого перенаправлення, що зазвичай містить «реальне» перенаправлення на необхідну сторінку, куди повинно вказувати й перше перенаправлення.\n<del>Закреслені</del> записи були виправлені.",
-       "double-redirect-fixed-move": "СÑ\82оÑ\80Ñ\96нка Â«[[$1]]» Ð±Ñ\83ла Ð¿ÐµÑ\80ейменована, Ð·Ð°Ñ\80аз Ð²Ð¾Ð½Ð° є перенаправленням на «[[$2]]»",
-       "double-redirect-fixed-maintenance": "Ð\92ипÑ\80авленнÑ\8f Ð¿Ð¾Ð´Ð²Ñ\96йного Ð¿ÐµÑ\80енапÑ\80авленнÑ\8f Ð· [[$1]] Ð½Ð° [[$2]].",
+       "double-redirect-fixed-move": "СÑ\82оÑ\80Ñ\96нка Â«[[$1]]» Ð±Ñ\83ла Ð¿ÐµÑ\80емÑ\96Ñ\89ена.\nÐ\92она Ð°Ð²Ñ\82омаÑ\82иÑ\87но Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð° Ñ\96 Ñ\82епеÑ\80 є перенаправленням на «[[$2]]»",
+       "double-redirect-fixed-maintenance": "Ð\90вÑ\82омаÑ\82иÑ\87не Ð²Ð¸Ð¿Ñ\80авленнÑ\8f Ð¿Ð¾Ð´Ð²Ñ\96йного Ð¿ÐµÑ\80енапÑ\80авленнÑ\8f Ð· [[$1]] Ð½Ð° [[$2]] Ð² Ñ\80обоÑ\82Ñ\96 Ð¿Ð¾ Ñ\82еÑ\85нÑ\96Ñ\87номÑ\83 Ð¾Ð±Ñ\81лÑ\83говÑ\83ваннÑ\8e.",
        "double-redirect-fixer": "Redirect fixer",
        "brokenredirects": "Розірвані перенаправлення",
        "brokenredirectstext": "Такі перенаправлення вказують на неіснуючі сторінки:",
        "log-title-wildcard": "Знайти заголовки, що починаються з цих символів",
        "showhideselectedlogentries": "Показати/приховати виділені записи журналу",
        "allpages": "Усі сторінки",
-       "alphaindexline": "від $1 до $2",
        "nextpage": "Наступна сторінка ($1)",
        "prevpage": "Попередня сторінка ($1)",
        "allpagesfrom": "Показати сторінки, що починаються з:",
        "watchnologin": "Ви не ввійшли до системи",
        "addwatch": "Додати до списку спостереження",
        "addedwatchtext": "Сторінку «[[:$1]]» додано до вашого [[Special:Watchlist|списку спостереження]].\nПодальші редагування цієї сторінки (та пов'язаної з нею сторінки обговорення) відображатимуться в цьому списку.",
+       "addedwatchtext-short": "Сторінка \" $1 \" була додана до вашого списку спостереження.",
        "removewatch": "Видалити зі списку спостереження",
        "removedwatchtext": "Сторінку «[[:$1]]» вилучено з вашого [[Special:Watchlist|списку спостереження]].",
+       "removedwatchtext-short": "Сторінка \"$1\" була видалена із вашого списку спостереження.",
        "watch": "Спостерігати",
        "watchthispage": "Спостерігати за цією сторінкою",
        "unwatch": "Скас. спостереження",
        "watchlist-details": "У вашому списку спостереження $1 {{PLURAL:$1|сторінка|сторінки|сторінок}} (не враховуючи сторінок обговорення).",
        "wlheader-enotif": "Сповіщення електронною поштою ввімкнено.",
        "wlheader-showupdated": "Сторінки, що змінилися після вашого останнього їх відвідування, виділені '''жирним''' шрифтом.",
-       "watchmethod-recent": "перегляд останніх редагувань статей за якими ведеться спостереження",
-       "watchmethod-list": "перегляд статей за якими ведеться спостереження",
-       "watchlistcontains": "Ваш список спостереження містить $1 {{PLURAL:$1|сторінку|сторінки|сторінок}}.",
-       "iteminvalidname": "Проблема з елементом «$1», недопустима назва…",
        "wlnote2": "Нижче наведено зміни за {{PLURAL:$1|останню годину|останні <strong>$1</strong> години|останні <strong>$1</strong> годин}} на $2 $3.",
        "wlshowlast": "Показати зміни за останні $1 годин $2 днів $3",
        "watchlist-options": "Налаштування списку спостереження",
        "enotif_lastvisited": "Див. $1 для перегляду всіх змін, що відбулися після вашого останнього перегляду.",
        "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Ваша дружня система сповіщення {{grammar:genitive|{{SITENAME}}}}\n\n--\nЗміна налаштувань повідомлень електронною поштою\n{{canonicalurl:{{#special:Preferences}}}}\n\nЩоб змінити налаштування списку спостереження, перейдіть за посиланням\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nЩоб вилучити сторінку зі списку спостереження, відвідайте сторінку\n$UNWATCHURL\n\nЗворотній зв'язок і допомога:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Шановний $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nКороткий опис змін: $PAGESUMMARY $PAGEMINOREDIT\n\nЗвернутись до редагувальника:\nелектронною поштою: $PAGEEDITOR_EMAIL\nчерез вікі: $PAGEEDITOR_WIKI\n\nЯкщо ви не відвідаєте цю сторінку під своїм обліковим записом, то в подальшому не будете отримувати сповіщень про наступні дії. Ви також можете вимкнути налаштування сповіщень для усіх сторінок зі списку спостереження.\n\nВаша дружня система сповіщення {{grammar:genitive|{{SITENAME}}}}\n\n--\nЗміна налаштувань повідомлень електронною поштою\n{{canonicalurl:{{#special:Preferences}}}}\n\nЩоб змінити налаштування списку спостереження, перейдіть за посиланням\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nЩоб вилучити сторінку зі списку спостереження, відвідайте сторінку\n$UNWATCHURL\n\nЗворотній зв'язок і допомога:\n$HELPPAGE",
        "created": "створена",
        "changed": "змінена",
        "deletepage": "Вилучити сторінку",
        "contributions-title": "Внесок користувача $1",
        "mycontris": "Внесок",
        "contribsub2": "Для {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "Обліковий запис користувача  «$1» не зареєстровано.",
        "nocontribs": "Редагувань, що задовольняють заданим умовам не знайдено.",
        "uctop": "(поточна)",
        "month": "До місяця (включно):",
        "blockip": "Блокування",
        "blockip-legend": "Блокування користувача",
        "blockiptext": "Використовуйте форму нижче, щоб заблокувати можливість редагування зазначеній IP-адресі або користувачу.\nЦе слід робити лише для запобігання порушенням і у відповідності до [[{{MediaWiki:Policy-url}}|правил]].\nОбов'язково заповніть причину нижче, бажано дати інформативну вичерпну інформацію (наприклад, послатися на конкретні правила, дати посилання на редагування користувача, які призвели до блокування). Можна конкретизувати причину блокування на сторінці обговорення користувача.\n* Якщо ви блокуєте обліковий запис бота, переконайтеся, що ви вимкнули автоблокування (для запобігання автоматичного блокування облікових записів власника бота або інших ботів).\n* Зверніть увагу, що IP-адреси у більшості випадків не варто блокувати на більший за декілька днів термін, щоб під блокування не підпали інші користувачі з таким самим IP. Винятки — частий довготривалий вандалізм.",
-       "ipadressorusername": "IP-адреса або ім'я користувача:",
+       "ipaddressorusername": "IP-адреса або ім'я користувача:",
        "ipbexpiry": "Термін:",
        "ipbreason": "Причина:",
        "ipbreason-dropdown": "* Типові причини блокування\n** Вставка неправильної інформації\n** Видалення змісту сторінок\n** Спам, рекламні посилання\n** Вставка нісенітниці/лайки в текст\n** Залякуюча поведінка/переслідування\n** Зловживання кількома обліковими записами\n** Неприйнятне ім'я користувача",
        "movepagetalktext": "Приєднана сторінка обговорення також буде автоматично перейменована, '''окрім таких випадків:'''\n* Непорожня сторінка обговорення з такою назвою вже існує або\n* Ви не поставили галочку в полі нижче.\n\nУ цих випадках ви будете змушені перейменувати чи об'єднати сторінки вручну в разі необхідності",
        "movearticle": "Перейменувати сторінку",
        "moveuserpage-warning": "'''Увага:''' Ви збираєтеся перейменувати сторінку користувача. Будь ласка, зверніть увагу, що  буде перейменовано тільки сторінку, але користувача '''не''' буде перейменовано.",
+       "movecategorypage-warning": "<strong>Увага:</strong> Ви збираєтесь перейменувати сторінку категорії. Будь ласка, зауважте, що це перейменує лише цю сторінку, <em>не</em> перемістивши сторінки, що входять до категорії до категорії з новою назвою.",
        "movenologintext": "Ви повинні [[Special:UserLogin|ввійти до системи]], щоб перейменувати сторінку.",
        "movenotallowed": "У вас нема дозволу перейменовувати сторінки.",
        "movenotallowedfile": "У вас немає прав перейменовувати файли.",
        "cant-move-user-page": "У вас нема дозволу перейменовувати сторінки користувачів.",
        "cant-move-to-user-page": "У вас нема дозволу перейменовувати сторінки на сторінки простору «Користувач» (окрім підсторінок)",
+       "cant-move-category-page": "У вас немає прав перейменовувати сторінки категорій.",
+       "cant-move-to-category-page": "У вас немає дозволу перейменовувати сторінку на сторінку категорії.",
        "newtitle": "Нова назва:",
        "move-watch": "Спостерігати за цією сторінкою",
        "movepagebtn": "Перейменувати сторінку",
        "tooltip-summary": "Введіть короткий опис",
        "interlanguage-link-title": "$1 — $2",
        "common.css": "/** Розміщений тут CSS буде застосовуватися до всіх тем оформлення */",
-       "cologneblue.css": "/* Розміщений тут CSS-код буде використаний для користувачів з налаштованою темою оформлення Кельнське блакитне */",
        "monobook.css": "/* Розміщений тут CSS буде застосовуватися до всіх тем оформлення Monobook */",
-       "modern.css": "/* Розміщений тут CSS-код буде використаний в темі оформлення Сучасне */",
        "vector.css": "/* Розміщений тут CSS-код буде використаний в темі оформлення Векторне */",
        "print.css": "/* Розміщений тут CSS-код буде використаний для друкованої версії */",
        "noscript.css": "/* Розміщений тут CSS-код буде використаний для користувачів у яких вимкнено JavaScript */",
        "group-sysop.css": "/* Розміщений тут CSS-код буде використаний тільки для адміністраторів */",
        "group-bureaucrat.css": "/* Розміщений тут CSS-код буде використаний тільки для бюрократів */",
        "common.js": "/* Розміщений тут код JavaScript буде завантажений всім користувачам при зверненні до будь-якої сторінки */",
-       "cologneblue.js": "/* Розміщений тут код JavaScript буде завантажений для всіх користувачів, що використовують тему оформлення Кельнське синє */",
        "monobook.js": "/* Розміщений тут код JavaScript буде завантажений для всіх користувачів, що використовують тему оформлення Моно-книга */",
-       "modern.js": "/* Розміщений тут код JavaScript буде завантажений для всіх користувачів, що використовують тему оформлення Сучасне */",
        "vector.js": "/* Розміщений тут код JavaScript буде завантажений для всіх користувачів, що використовують векторну тему оформлення */",
        "group-autoconfirmed.js": "/* Розміщений тут код JavaScript буде завантажений тільки для автопідтверджених користувачів */",
        "group-bot.js": "/* Розміщений тут код JavaScript буде завантажений тільки для ботів */",
        "group-sysop.js": "/* Розміщений тут код JavaScript буде завантажений тільки для адміністраторів */",
        "group-bureaucrat.js": "/* Розміщений тут код JavaScript буде завантажений тільки для бюрократів */",
-       "notacceptable": "Вікі-сервер не може подати дані в форматі, який міг би прочитати ваш браузер.<br />\nThe wiki server can't provide data in a format your client can read.",
        "anonymous": "{{PLURAL:$1|1=Анонімний користувач|Анонімні користувачі}} {{grammar:genitive|{{SITENAME}}}}",
        "siteuser": "Користувач {{grammar:genitive|{{SITENAME}}}} $1",
        "anonuser": "анонімний користувач {{grammar:genitive|{{SITENAME}}}} $1",
        "pageinfo-category-pages": "Кількість сторінок",
        "pageinfo-category-subcats": "Кількість підкатегорій",
        "pageinfo-category-files": "Кількість файлів",
-       "skinname-cologneblue": "Кельнське синє",
        "skinname-monobook": "Моно-книга",
-       "skinname-modern": "Сучасне",
        "skinname-vector": "Векторне",
        "markaspatrolleddiff": "Позначити як перевірену",
        "markaspatrolledtext": "Позначити цю сторінку як перевірену",
        "newimages-summary": "Ця спеціальна сторінка показує останні завантажені файли.",
        "newimages-legend": "Фільтр",
        "newimages-label": "Назва файлу (або її частина):",
-       "showhidebots": "($1 ботів)",
+       "newimages-showbots": "Показати завантаження ботами",
        "noimages": "Файли відсутні.",
        "ilsubmit": "Шукати",
        "bydate": "за датою",
        "size-kilobytes": "$1 КБ",
        "size-megabytes": "$1 МБ",
        "size-gigabytes": "$1 ГБ",
-       "livepreview-loading": "Завантаження…",
-       "livepreview-ready": "Завантаження… Готово!",
-       "livepreview-failed": "Не вдалося використати швидкий попередній перегляд. Спробуйте скористатися звичайним попереднім переглядом.",
-       "livepreview-error": "Не вдалося встановити з'єднання: $1 «$2». Спробуйте скористатися звичайним попереднім переглядом.",
        "lag-warn-normal": "Зміни, зроблені менш ніж $1 {{PLURAL:$1|секунду|секунди|секунд}} тому, можуть не відображатися в цьому переліку.",
        "lag-warn-high": "Зміни, зроблені менш ніж $1 {{PLURAL:$1|секунду|секунди|секунд}} тому, можуть не відображатися в цьому переліку внаслідок значної затримки сервера БД.",
-       "watchlistedit-numitems": "Ваш список спостереження містить {{PLURAL:$1|$1 запис|$1 записи|$1 записів}}, не включаючи сторінок обговорення.",
-       "watchlistedit-noitems": "Ваш список спостереження порожній.",
        "watchlistedit-normal-title": "Редагування списку спостереження",
        "watchlistedit-normal-legend": "Вилучення заголовків зі списку спостереження",
        "watchlistedit-normal-explain": "Далі наведені заголовки з вашого списку спостереження.\nДля вилучення сторінки зі списку необхідно поставити галочку в квадратику біля нього і натиснути «{{int:Watchlistedit-normal-submit}}».\nВи можете також [[Special:EditWatchlist/raw|редагувати список як текстові рядки]].",
        "watchlistedit-raw-done": "Ваш список спостереження збережений.",
        "watchlistedit-raw-added": "{{PLURAL:$1|$1 заголовок був доданий|$1 заголовки були додані|$1 заголовків були додані}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|$1 заголовок був вилучений|$1 заголовки були вилучені|$1 заголовків були вилучені}}:",
+       "watchlistedit-clear-title": "Список спостереження очищено",
+       "watchlistedit-clear-legend": "Очистити список спостереження",
+       "watchlistedit-clear-explain": "Усі сторінки буде вилучено з Вашого списку спостереження",
+       "watchlistedit-clear-titles": "Сторінки:",
+       "watchlistedit-clear-submit": "Очистити список спостереження (це безповоротньо!)",
+       "watchlistedit-clear-done": "Ваш список спостереження було очищено.",
+       "watchlistedit-too-many": "Забагато сторінок для відображення тут.",
+       "watchlisttools-clear": "Очистити список спостереження",
        "watchlisttools-view": "Зміни на сторінках зі списку",
        "watchlisttools-edit": "Переглянути/редагувати список",
        "watchlisttools-raw": "Редагувати як текст",
        "compare-invalid-title": "Зазначена назва неприпустима.",
        "compare-title-not-exists": "Зазначена назва не існує.",
        "compare-revision-not-exists": "Зазначеної версії не існує.",
-       "dberr-header": "Ця вікі має проблеми",
        "dberr-problems": "Вибачте! На цьому сайті виникли технічні труднощі.",
        "dberr-again": "Спробуйте оновити сторінку за кілька хвилин.",
        "dberr-info": "(неможливо з'єднатися з сервером баз даних: $1)",
        "htmlform-no": "Ні",
        "htmlform-yes": "Так",
        "htmlform-chosen-placeholder": "Виберіть параметр",
+       "htmlform-cloner-create": "Додати більше",
+       "htmlform-cloner-delete": "Вилучити",
+       "htmlform-cloner-required": "Необхідно принаймні одне значення.",
        "sqlite-has-fts": "$1 з підтримкою повнотекстового пошуку",
        "sqlite-no-fts": "$1 без підтримки повнотекстового пошуку",
        "logentry-delete-delete": "$1 {{GENDER:$2|вилучив|вилучила}} сторінку $3",
index 94c3000..1128468 100644 (file)
@@ -17,7 +17,8 @@
                        "زكريا",
                        "سمرقندی",
                        "محبوب عالم",
-                       "පසිඳු කාවින්ද"
+                       "පසිඳු කාවින්ද",
+                       "아라"
                ]
        },
        "tog-underline": "ربط کی خط کشیدگی:",
@@ -30,7 +31,6 @@
        "tog-showtoolbar": "تدوینی اوزاردان دکھائیے",
        "tog-editondblclick": "طقین پر صفحات کی ترمیم کیجئے",
        "tog-editsectiononrightclick": "سطری عنوانات پر دایاں طق کے ذریعے سطری ترمیم کاری فعال بناؤ",
-       "tog-rememberpassword": "اِس متصفح پر میرے داخلِ نوشتگی معلومات یاد رکھو (زیادہ سے زیادہ $1 {{PLURAL:$1|دِن|ایام}} کیلئے)",
        "tog-watchcreations": "میرے تخلیق کردہ صفحات اور میری زبر اثقال کردہ ملفات کو میری زیر نظر فہرست میں شامل کیا کیجئے",
        "tog-watchdefault": "میرے تدوین شدہ صفحات اور ملفات کو میری زیر نظر فہرست میں شامل کیا کیجئے",
        "tog-watchmoves": "میرے منتقل کردہ صفحات اور ملفات کو میری زیر نظر فہرست میں شامل کیا کیجئے",
        "filedeleteerror": "مسل \"$1\" کو حذف نہیں کیا جاسکا.",
        "directorycreateerror": "رہنامچہ \"$1\" تخلیق نہیں کیا جاسکا.",
        "filenotfound": "مسل \"$1\" ڈھونڈا نہ جاسکا.",
-       "fileexistserror": "مسل \"$1\" کو لکھنے سے قاصر، مسل پہلے سے موجود",
        "unexpected": "غیرمتوقع قدر: \"$1\"=\"$2\"",
        "formerror": "خطا: ورقہ بھیجا نہ جاسکا.",
        "badarticleerror": "اس صفحہ پر یہ عمل انجام نہیں دیا جاسکتا۔",
        "gotaccount": "پہلے سے کھاتہ بنا ہوا ہے? '''$1'''.",
        "gotaccountlink": "داخل ہوجائیے",
        "userlogin-resetlink": "داخلِ نوشتہ ہونے کی تفاصیل بھول گئے ہیں؟",
-       "createacct-join": "اپنی معلومات نیچے لکھیں۔",
        "createacct-emailrequired": "ای میل پتہ",
        "createacct-emailoptional": "ای میل ایڈریس (اختیاری)",
        "createacct-email-ph": "اپنا برقی پتہ لکھیں",
        "savearticle": "محفوظ",
        "preview": "نمائش",
        "showpreview": "نمائش",
-       "showlivepreview": "براہِراست پیش منظر",
        "showdiff": "تبدیلیاں دکھاؤ",
        "anoneditwarning": "آپ {{SITENAME}} میں داخل نہیں ہوۓ لہذا آپکا IP پتہ اس صفحہ کے تاریخچہ ء ترمیم میں محفوظ ہوجاۓ گا۔",
        "missingsummary": "'''انتباہ:''' آپ نے ترمیمی خلاصہ مہیّا نہیں کیا.\nاگر آپ نے محفوظ کا بٹن دوبارہ دبایا تو آپ کی ترمیم بغیر کسی خلاصہ کے محفوظ ہوجائے گی.",
        "search-nonefound": "استفسار کے مطابق نتائج نہیں ملے.",
        "powersearch-legend": "پیشرفتہ تلاش",
        "powersearch-ns": "جائے نام میں تلاش:",
-       "powersearch-redir": "فہرستِ رجوع مکرر",
        "powersearch-togglelabel": "جانچ",
        "powersearch-toggleall": "تمام",
        "powersearch-togglenone": "کوئی نہیں",
        "recentchanges-label-bot": "یہ ایک روبالہ سے سرانجام شدہ ترمیم ہے",
        "recentchanges-label-unpatrolled": "اس ترمیم کی اب تک مراجعت نہیں کی گئی",
        "rcnotefrom": "ذیل میں '''$2''' سے کی گئی تبدیلیاں ہیں ('''$1''' تبدیلیاں دکھائی جارہی ہیں)۔",
-       "rclistfrom": "$1 سےنئی تبدیلیاں دکھانا شروع کریں",
+       "rclistfrom": "$3 $2 سےنئی تبدیلیاں دکھانا شروع کریں",
        "rcshowhideminor": "معمولی ترامیم $1",
        "rcshowhidebots": "خودکار صارف $1",
        "rcshowhideliu": "داخل شدہ صارف $1",
        "watchthispage": "یہ صفحہ زیر نظر کیجیۓ",
        "unwatch": "زیرنظرمنسوخ",
        "watchlist-details": "آپ کی زیرِنظرفہرست پر {{PLURAL:$1|$1 صفحہ ہے|$1 صفحات ہیں}}، اِس میں تبادلۂ خیال صفحات کی تعداد شامل نہیں.",
-       "watchlistcontains": "آپ کی زیرنظرفہرست میں $1 صفحات ہیں۔",
        "wlshowlast": "دکھائیں آخری $1 گھنٹے $2 دن $3",
        "watchlist-options": "اختیارات برائے زیرِنظرفہرست",
        "created": "بنا دیا گیا",
index ae11274..6ae2b30 100644 (file)
        "userlogin-resetpassword-link": "Unutib qoʻydingizmi?",
        "userlogin-loggedin": "Siz {{GENDER:$1|$1}} nomi bilan kirgansiz.\nBoshqa hisob raqami orqali kirish uchun quyidagi formadan foydalaning.",
        "userlogin-createanother": "Boshqa hisob yaratish",
-       "createacct-join": "Maʼlumotlaringizni quyiga yozing",
-       "createacct-another-join": "Yangi hisob yozuvi maʼlumotlarini quyida koʻrsating.",
        "createacct-emailrequired": "Elektron pochta manzilingiz",
        "createacct-emailoptional": "Elektron pochta manzili (majburiy emas)",
        "createacct-email-ph": "Elektron pochta manzilingizni kiriting",
        "savearticle": "Saqlash",
        "preview": "Ko‘rib chiqish",
        "showpreview": "Koʻrib chiqish",
-       "showlivepreview": "Tezkor koʻrib chiqish",
        "showdiff": "O‘zgarishlarni ko‘rsatish",
        "anoneditwarning": "'''Diqqat:''' Siz tizimga kirmagansiz. Ushbu sahifa tarixida Sizning IP manzilingiz yozib qolinadi.",
        "missingcommenttext": "Iltimos sharh qoldiring.",
        "moveddeleted-notice": "Bu sahifa oʻchirilgan.\nMaʼlumot uchun quyida oʻchirish va qayta nomlash jurnallaridan mos yozuvlar keltirilgan.",
        "log-fulllog": "Qaydlarni toʻliq koʻrish",
        "edit-conflict": "Tahrirlash toʻqnashuvi.",
-       "postedit-confirmation": "Tahriringiz saqlandi.",
+       "postedit-confirmation-saved": "Tahriringiz saqlandi.",
        "defaultmessagetext": "Boshlang'ich matn",
        "post-expand-template-inclusion-warning": "'''Diqqat:''' Qo'llanilayotgan andozalarning jami hajmi juda katta.\nAyrim andozalar qo'shilmaydi.",
        "post-expand-template-inclusion-category": "Qo'llaniladigan andozalarning mumkin bo'lgan miqdoridan oshgan sahifalar",
        "viewpagelogs": "Ushbu sahifaga doir qaydlarni koʻrsat",
        "nohistory": "Ushbu sahifa uchun oʻzgarishlar tarixi mavjud emas.",
        "currentrev": "Hozirgi koʻrinishi",
-       "currentrev-asof": "$1dagi, joriy koʻrinishi",
-       "revisionasof": "$1 paytdagi koʻrinishi",
-       "revision-info": "$1; $2 dagi versiya",
+       "currentrev-asof": "$2, $3 dagi (joriy) koʻrinishi",
+       "revisionasof": "$2, $3 dagi koʻrinishi",
+       "revision-info": "$4, $5 dagi $2 versiyasi",
        "previousrevision": "←Avvalgi koʻrinishi",
        "nextrevision": "Yangiroq koʻrinishi→",
        "currentrevisionlink": "Hozirgi koʻrinishi",
        "search-nonefound": "Talabga javob beradigan natija topilmadi.",
        "powersearch-legend": "Kengaytirilgan qidiruv",
        "powersearch-ns": "Quyidagi nomfazolardan qidir:",
-       "powersearch-redir": "Qayta yoʻnaltirishlarni koʻrsatish",
        "powersearch-togglelabel": "Belgilash:",
        "powersearch-toggleall": "Hammasini",
        "powersearch-togglenone": "Hech qaysini",
        "prefs-advancedsearchoptions": "Qoʻshimcha moslamalar",
        "prefs-advancedwatchlist": "Qoʻshimcha moslamalar",
        "prefs-displayrc": "Tasvirlash moslamalari",
-       "prefs-displaysearchoptions": "Tasvirlash moslamalari",
        "prefs-displaywatchlist": "Tasvirlash moslamalari",
        "prefs-diffs": "Versiyalar farqi",
        "userrights-user-editname": "Foydalanuvchi nomingizni kiriting:",
        "recentchanges-label-plusminus": "Sahifa vazni qanchaga oʻzgargani (bayt)",
        "recentchanges-legend-heading": "'''Izoh:'''",
        "recentchanges-legend-newpage": "([[Special:NewPages|alohida roʻyxat]])",
-       "rcnotefrom": "Quyida <strong>$2</strong> dan boshlab boʻlgan oʻzgarishlar keltirilgan (<strong>$1</strong> tasi koʻrsatildi).",
-       "rclistfrom": "$3, $2 dan keyingi yangi oʻzgarishlarni koʻrsatish",
+       "rcnotefrom": "Quyida <strong>$2</strong> dan keyin amalga oshirilgan oʻzgarishlar keltirilgan (oxirgi <strong>$1</strong> tasi)",
+       "rclistfrom": "$3, $2 dan keyingi oʻzgarishlarni koʻrsat",
        "rcshowhideminor": "Kichik tahrirlarni $1",
        "rcshowhideminor-show": "koʻrsat",
        "rcshowhideminor-hide": "yashir",
        "enotif_lastvisited": "Oxirgi tashrifingizdan keyin sodir boʻlgan barcha oʻzgarishlarni koʻrish uchun $1 ga qarang.",
        "enotif_lastdiff": "Oʻzgarishlar bilan tanishish uchun $1 ga qarang.",
        "enotif_anon_editor": "anonim foydalanuvchi $1",
-       "enotif_body": "Hurmatli $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nO‘zgarish bo‘yicha qisqacha izoh: $PAGESUMMARY $PAGEMINOREDIT\n\nTahrirlovchiga murojaat qilish:\nel. pochta: $PAGEEDITOR_EMAIL\nviki: $PAGEEDITOR_WIKI\n\nAgar siz sahifaga o‘tib ko‘rmasangiz, u holda uning keyingi o‘zgarishlari bo‘yicha boshqa bildirish xabarlari kelmaydi. Siz, shuningdek o‘z kuzatuv ro‘yxatingizda barcha sahifalar uchun xabar berish moslamasini o‘chirishingiz mumkin.\n\n{{SITENAME}}ning xabar berish tizimi\n\n--\nXabar berish moslamalarini o‘zgartirish uchun quyidagi havola bo‘yicha o‘ting\n{{canonicalurl:{{#special:Preferences}}}}\n\nOʻz kuzatuv roʻyxatingiz moslamalarini o‘zgartirish uchun quyidagi havola bo‘yicha o‘ting\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nOʻz kuzatuv roʻyxatingizdan sahifani o‘chirish uchun quyidagi havola bo‘yicha o‘ting\n$UNWATCHURL\n\nQayta aloqa va yordam\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Hurmatli $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nO‘zgarish bo‘yicha qisqacha izoh: $PAGESUMMARY $PAGEMINOREDIT\n\nTahrirlovchiga murojaat qilish:\nel. pochta: $PAGEEDITOR_EMAIL\nviki: $PAGEEDITOR_WIKI\n\nAgar siz sahifaga o‘tib ko‘rmasangiz, u holda uning keyingi o‘zgarishlari bo‘yicha boshqa bildirish xabarlari kelmaydi. Siz, shuningdek o‘z kuzatuv ro‘yxatingizda barcha sahifalar uchun xabar berish moslamasini o‘chirishingiz mumkin.\n\n{{SITENAME}}ning xabar berish tizimi\n\n--\nXabar berish moslamalarini o‘zgartirish uchun quyidagi havola bo‘yicha o‘ting\n{{canonicalurl:{{#special:Preferences}}}}\n\nOʻz kuzatuv roʻyxatingiz moslamalarini o‘zgartirish uchun quyidagi havola bo‘yicha o‘ting\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nOʻz kuzatuv roʻyxatingizdan sahifani o‘chirish uchun quyidagi havola bo‘yicha o‘ting\n$UNWATCHURL\n\nQayta aloqa va yordam\n$HELPPAGE",
        "created": "yaratildi",
        "changed": "o‘zgartirildi",
        "deletepage": "Sahifani o'chirish",
        "unblock": "Foydalanuvchiga yo'l ochish",
        "blockip": "Foydalanuvchini chetlashtir",
        "blockip-legend": "Foydalanuvchini muhosara qilish",
-       "ipadressorusername": "IP-manzil yoki foydalanuvchi nomi:",
+       "ipaddressorusername": "IP-manzil yoki foydalanuvchi nomi:",
        "ipbexpiry": "Tugaydi:",
        "ipbreason": "Sabab:",
        "ipbreason-dropdown": "* Chetlashtirishning odatiy sabablari\n** Yolgʻon maʼlumot kiritish\n** Sahifa matnini toʻliq oʻchirish\n** Tashqi saytlarga spam-havolalar\n** Maʼnosiz matn/axlat qoʻshish\n** Foydalanuvchilarga tahdid qilish, ularni taʼqib qilish\n** Bir nechta hisob yozuvlaridan oʻz manfaatlarida foydalanish\n** Nomaqbul foydalanuvchi nomi",
        "show-big-image": "Toʻliq hajmdagi tasvir",
        "noimages": "Tasvir mavjud emas.",
        "ilsubmit": "Qidirish",
+       "variantname-uz-latn": "lotincha",
+       "variantname-uz-cyrl": "кириллча",
        "metadata": "Metama’lumot",
        "metadata-expand": "Batafsil axborotni koʻrsatish",
        "metadata-collapse": "Batafsil axborotni yashirish",
index a6080a7..23d8abd 100644 (file)
@@ -16,7 +16,8 @@
                        "Shirayuki",
                        "Urhixidur",
                        "Vajotwo",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Sotołinea i cołegamenti:",
@@ -29,7 +30,6 @@
        "tog-showtoolbar": "Mostra ła bara de i strumenti de modifega (el richiede JavaScript)",
        "tog-editondblclick": "Modifega de łe pajine tramite dopio clic (el richiede JavaScript)",
        "tog-editsectiononrightclick": "Modifega de łe sesion tramite clic destro sol titoło (el richiede JavaScript)",
-       "tog-rememberpassword": "Tiente in mente la me password so sto computer (par un massimo de $1 {{PLURAL:$1|zorno|zorni}})",
        "tog-watchcreations": "Xonta łe pàjine creae e i file cargai a łe tegnùe d'ocio",
        "tog-watchdefault": "Xonta łe pàjine e i file modifegai a łe tegnùe d'ocio",
        "tog-watchmoves": "Xonta łe pàjine e i file spostai a łe tegnùe d'ocio",
        "readonly_lag": "El database xè sta blocà automaticamente par consentire a i server co i database slave de sincronizarse con el master",
        "internalerror": "Erore interno",
        "internalerror_info": "Erore interno: $1",
-       "fileappenderrorread": "No xè sta posibiłe lezare \"$1\" durante l'azunta.",
-       "fileappenderror": "Inposibiłe zontare \"$1\" a \"$2\".",
        "filecopyerror": "Inposibiłe copiare el file \"$1\" en \"$2\".",
        "filerenameerror": "Inposibiłe rinominare el file \"$1\" en \"$2\".",
        "filedeleteerror": "Inposibiłe scansełare el file \"$1\".",
        "directorycreateerror": "Inposibiłe creare ła directory \"$1\".",
        "filenotfound": "File \"$1\" no trovà.",
-       "fileexistserror": "Inposibiłe scrivare el file \"$1\": el file esiste zà",
        "unexpected": "Vałore inprevisto: \"$1\"=\"$2\".",
        "formerror": "Erore: inposibiłe inviare el moduło",
        "badarticleerror": "Operasion no consentia par sta pajina.",
        "gotaccountlink": "Entra",
        "userlogin-resetlink": "Desmentegà i to dati d'aceso?",
        "userlogin-resetpassword-link": "Te gheto desmentegà ła paroła d'ordine?",
-       "createacct-join": "Meti le to informassion qua soto.",
        "createacct-emailrequired": "Indirisso e-mail",
        "createacct-emailoptional": "Indiriso e-mail (opsionałe)",
        "createacct-email-ph": "Inserissi el to indirizo de e-mail",
        "savearticle": "Salva sta pagina",
        "preview": "Anteprima",
        "showpreview": "Varda anteprima",
-       "showlivepreview": "Anteprima in tenpo reàl",
        "showdiff": "Mostra canbiamenti",
        "anoneditwarning": "'''Ocio:''' Nò te sì entrà co' un nome utente.\nIn te ła storia de ła pajina restarà el to indiriso IP.",
        "anonpreviewwarning": "\"No te ghe eseguio el login. Salvando el to indiriso IP sarà rejistrà ne ła cronołosia de sta voxe.\"",
        "edit-gone-missing": "No se riesse a agiornar la pàxena.\nPararìa che la sìpia stà scancelà.",
        "edit-conflict": "Conflito de modifica.",
        "edit-no-change": "La to modifica la xe stà ignorà, parché no ti gà canbià gnente nel testo.",
-       "postedit-confirmation": "La modifica la xe stà salvà.",
+       "postedit-confirmation-saved": "La modifica la xe stà salvà.",
        "edit-already-exists": "No se pol crear na pagina nova.\nLa esiste de zà.",
        "defaultmessagetext": "Testo predefinìo",
        "content-failed-to-parse": "Inposibiłe anałixare $2 pa'l modèl $1: $3",
        "search-nonefound": "La riserca no la gà catà gnente.",
        "powersearch-legend": "Riserca avansà",
        "powersearch-ns": "Serca ne i namespace:",
-       "powersearch-redir": "Elenca redirect",
        "powersearch-togglelabel": "Selessiona:",
        "powersearch-toggleall": "Tuti quanti",
        "powersearch-togglenone": "Nissun",
        "prefs-advancedsearchoptions": "Preferense avansade",
        "prefs-advancedwatchlist": "Preferense avansade",
        "prefs-displayrc": "Preferense de visualixassion",
-       "prefs-displaysearchoptions": "Opzioni de visualixassion",
        "prefs-displaywatchlist": "Opzioni de visualixassion",
        "prefs-diffs": "Difarense",
        "email-address-validity-valid": "L'indiriso de posta eletronega pararìa vałido",
        "recentchanges-label-plusminus": "La dimension de la pagina la xe canbià de sto nùmaro de byte",
        "recentchanges-legend-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 $1",
+       "rclistfrom": "Fà védar i canbiamenti fati dal $3 $2",
        "rcshowhideminor": "$1 i canbiamenti picenini",
        "rcshowhidebots": "$1 i bot",
        "rcshowhideliu": "$1 i utenti registrài",
        "uploadstash-refresh": "Axorna 'l elenco de i file",
        "invalid-chunk-offset": "Offset de ła parte nó vałido",
        "img-auth-accessdenied": "Acesso negà",
-       "img-auth-nopathinfo": "Manca el PATH_INFO.\nEl to server no'l xe mia configurà par pasar sta informasion.\nMagari el xe basà su CGI e no'l suporta img_auth.\nVarda https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "Manca el PATH_INFO.\nEl to server no'l xe mia configurà par pasar sta informasion.\nMagari el xe basà su CGI e no'l suporta img_auth.\nVarda https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "El percorso richiesto no'l se cata in te la cartèla de caricamento configurà.",
        "img-auth-badtitle": "No se riesse a costruir un titolo valido da \"$1\".",
        "img-auth-nologinnWL": "No te sì autenticà e \"$1\" no'l xe mia in te la lista bianca.",
        "watchlist-details": "Te sì drio tegner d'ocio {{PLURAL:$1|una pagina (e la so pagina de discussion)|$1 pagine (e le so pagine de discussion)}}.",
        "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'''",
-       "watchmethod-recent": "controło de łe ultime modifeghe par i osservati speciałi",
-       "watchmethod-list": "controło de i osservati speciałi par modifeghe recenti",
-       "watchlistcontains": "La lista de i osservati speciałi la contien {{PLURAL:$1|una pagina|$1 pagine}}.",
-       "iteminvalidname": "Problemi con la voxe '$1', nome mìa vałido...",
        "wlshowlast": "Mostra le ultime $1 ore $2 zorni $3",
        "watchlist-options": "Inpostassion de le pagine tegnùe d'ocio",
        "watching": "Taco a tegner d'ocio...",
        "enotif_lastvisited": "Varda $1 par tute le modifiche da la to ultima visita.",
        "enotif_lastdiff": "Varda $1 par visualizar la modifica.",
        "enotif_anon_editor": "utente anonimo $1",
-       "enotif_body": "Caro/a $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nOgeto del intervento, inserio dal autor: $PAGESUMMARY $PAGEMINOREDIT\n\nContata l'autor:\nvia posta eletronega: $PAGEEDITOR_EMAIL\nso'l sito: $PAGEEDITOR_WIKI\n\nNó vegnarà inviae altre notifeghe in caxo de ulteriori atività, se nó te vixiti ła pàjina. Inoltre, xe posibiłe modifegar łe inpostasion de notifega par tute łe pàjine inte ła lista de łe tegnùe d'ocio.\n\n             El sistema de notifega de {{SITENAME}}, al to servisio\n\n--\nPar modifegar łe inpostasion de łe notifeghe via posta eletronega, varda \n{{canonicalurl:{{#special:Preferences}}}}\n\nPar modifegar ła lista de łe tegnùe d'ocio, varda \n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPar cavar ła pàjina da ła lista de łe tegnùe d'ocio, varda\n$UNWATCHURL\n\nPar comentare e risevere ajuto:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Caro/a $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nOgeto del intervento, inserio dal autor: $PAGESUMMARY $PAGEMINOREDIT\n\nContata l'autor:\nvia posta eletronega: $PAGEEDITOR_EMAIL\nso'l sito: $PAGEEDITOR_WIKI\n\nNó vegnarà inviae altre notifeghe in caxo de ulteriori atività, se nó te vixiti ła pàjina. Inoltre, xe posibiłe modifegar łe inpostasion de notifega par tute łe pàjine inte ła lista de łe tegnùe d'ocio.\n\n             El sistema de notifega de {{SITENAME}}, al to servisio\n\n--\nPar modifegar łe inpostasion de łe notifeghe via posta eletronega, varda \n{{canonicalurl:{{#special:Preferences}}}}\n\nPar modifegar ła lista de łe tegnùe d'ocio, varda \n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPar cavar ła pàjina da ła lista de łe tegnùe d'ocio, varda\n$UNWATCHURL\n\nPar comentare e risevere ajuto:\n$HELPPAGE",
        "created": "creà",
        "changed": "canbià",
        "deletepage": "Scancela pagina",
        "blockip": "Bloco utente",
        "blockip-legend": "Bloca l'utente",
        "blockiptext": "Dòpara el moduło qua soto par blocar l'accesso in scritura a un speçifico utente o indirizo IP. El bloco el gà de èssar operà par prevegner ati de vandalismo e in streta osservansa de ła [[{{MediaWiki:Policy-url}}|policy de {{SITENAME}}]]. Speçifica in detałio el motivo del bloco nel canpo seguente (ad es. indicando i titołi de łe pàxene ogeto de vandalismo).",
-       "ipadressorusername": "Indirizo IP o nome utente",
+       "ipaddressorusername": "Indirizo IP o nome utente",
        "ipbexpiry": "Scadensa",
        "ipbreason": "Motivassion:",
        "ipbreason-dropdown": "*Motivazion piassè comuni par i blocchi\n** Inserimento de informazion false\n** Rimozion de contenuti da le pagine\n** Colegamenti promozionali a siti foresti\n** Inserimento de contenuti privi de senso\n** Conportamenti intimidatori o molestie\n** Uso indebito de più account\n** Nome utente non cònsono",
        "tooltip-undo": "El \"Tira indrìo\" el parmete de anular sto canbiamento e el verze la pagina da canbiar in modalità de anteprima. Se pole métarghe anca na motivassion.",
        "tooltip-preferences-save": "Salve le preferense",
        "tooltip-summary": "Inserissi un breve riassunto",
-       "notacceptable": "El server wiki no'l xè in grado di fornire i dati in un formato łeggibiłe dal client utilixà.",
        "anonymous": "{{PLURAL:$1|Utente anonimo|Utenti anonimi}} de {{SITENAME}}",
        "siteuser": "$1, utente de {{SITENAME}}",
        "anonuser": "Utente anonimo $1 de {{SITENAME}}",
        "newimages-summary": "Sta pagina speciale la mostra i file cargà piassè reçentemente.",
        "newimages-legend": "Filtro",
        "newimages-label": "Nome del file (o na parte de élo):",
-       "showhidebots": "($1 i bot)",
        "noimages": "No ghè gnente da vardare.",
        "ilsubmit": "Serca",
        "bydate": "data",
        "autosumm-replace": "Pagina sostituìa con '$1'",
        "autoredircomment": "Rimando a la pagina [[$1]]",
        "autosumm-new": "Pagina creà co '$1'",
-       "livepreview-loading": "Caricamento in corso…",
-       "livepreview-ready": "Caricamento in corso… Pronto.",
-       "livepreview-failed": "Eror ne la funzion Live preview.\nDoparar l'anteprima standard.",
-       "livepreview-error": "Inpossibile efetuar el colegamento: $1 \"$2\"\nDoparar l'anteprima standard.",
        "lag-warn-normal": "Le modifiche fate {{PLURAL:$1|ne l'ultimo secondo|nei ultimi $1 secondi}} no podarìa no èssarghe gnancora su sta lista.",
        "lag-warn-high": "Par via de un ecessivo ritardo ne l'agiornamento del server de database, le modifiche fate {{PLURAL:$1|ne l'ultimo secondo|nei ultimi $1 secondi}} le podarìa no èssarghe mìa su sta lista.",
-       "watchlistedit-numitems": "La lista dei osservati speciali la contien {{PLURAL:$1|una pagina (e la rispetiva pagina de discussion)|$1 pagine (e le rispetive pagine de discussion)}}.",
-       "watchlistedit-noitems": "La lista dei osservati speciali la xe voda.",
        "watchlistedit-normal-title": "Modifica osservati speciali",
        "watchlistedit-normal-legend": "Elimina de pagine dai osservati speciali",
        "watchlistedit-normal-explain": "De seguito xe elencà tute le pagine tegnùe d'ocio. \nPar cavar una o più pagine da la lista, seleziona le casele relative e struca el boton \"{{int:Watchlistedit-normal-submit}}\". \nNota che se pol anca [[Special:EditWatchlist/raw|modificar la lista in formato testual]].",
        "compare-invalid-title": "El titoło che te ghè indicà nó 'l xe mia valido.",
        "compare-title-not-exists": "El titoło che te ghe spesifegà nó 'l existe.",
        "compare-revision-not-exists": "Ła revixion che te ghe spesifegà nó ła existe.",
-       "dberr-header": "Sta wiki la ga un problema",
        "dberr-problems": "Sto sito al momento el gà qualche problema tènico.",
        "dberr-again": "Próa a spetar un par de minuti e ricargar la pàxena.",
        "dberr-info": "(No se riesse a métarse in contato col server del database: $1)",
index 26f0ebd..dcb3994 100644 (file)
@@ -6,7 +6,8 @@
                        "Kaganer",
                        "Sura",
                        "Triple-ADHD-AS",
-                       "Игорь Бродский"
+                       "Игорь Бродский",
+                       "아라"
                ]
        },
        "tog-underline": "Jonoštada kosketused:",
@@ -19,7 +20,6 @@
        "tog-showtoolbar": "Ozutada redaktiruindan panel'",
        "tog-editondblclick": "Redaktiruida lehtpoled kaksitadud plokul",
        "tog-editsectiononrightclick": "Redaktiruida sekcijad hiren oiktal plokul pälkirjutesele",
-       "tog-rememberpassword": "Muštta minun kävutajan nimi neciš kompjuteras (enintään $1 {{PLURAL:$1|päivä|päivää}})",
        "tog-watchcreations": "Ližata kaik minai sätud lehtpoled da failad minun kaclendkirjuteshe",
        "tog-watchdefault": "Ližata kaik minai toižetadud lehtpoled da failad minun kaclendkirjuteshe",
        "tog-watchmoves": "Ližata kaik minai udesnimitadud lehtpoled da failad minun kaclendkirjuteshe",
        "readonly_lag": "Andmusiden baz om luklostadud avtomatižešti pordoks aigad, kuni sinhroniziruiše ezmäškerdaine da toškerdaine serverad",
        "internalerror": "Südäipetuz",
        "internalerror_info": "Südäipetuz: $1",
-       "fileappenderrorread": "Ei voind lugeda \"$1\" ližamižen aigan",
-       "fileappenderror": "Ei voi ližata «$1»-failad «$2»-failha.",
        "filecopyerror": "Ei voi kopiruida \"$1\"-failad \"$2\"-tahoze.",
        "filerenameerror": "Ei voi udesnimitada \"$1\"-failad \"$2\"-tahoze.",
        "filedeleteerror": "Ei voi čuta poiš \"$1\"-failad.",
        "directorycreateerror": "Ei voi säta \"$1\"-failhodrad.",
        "filenotfound": "Ei voi löuta \"$1\"-failad.",
-       "fileexistserror": "Ei voi kirjutada \"$1\"-failha: mugoi fail om wikiš",
        "unexpected": "Varastamatoi znamočend: \"$1\"=\"$2\".",
        "formerror": "Petuz: ei voi oigeta forman admusid",
        "badarticleerror": "Necidä ei sa tehta necil lehtpolel.",
        "savearticle": "Kirjutada lehtpol' muštho",
        "preview": "Ezikacund",
        "showpreview": "Ozutada ezikacund",
-       "showlivepreview": "Hered ezikacund",
        "showdiff": "Ozutada toižetused",
        "anoneditwarning": "'''Homaikat:''' Tö et olgoi kirjutanus sistemha.\nTeiden IP-adres om kirjutadud necen lehtpolen redaktiruindan istorijaha.",
        "missingsummary": "'''Muštatez:''' Tö et olgoi andnuded toižetusiden lühüdad ümbrikacundad.\nKu tö valičet völ kerdan \"Kirjutada lehtpol'\", ka teiden toižetused kirjutase ningoižeta ümbrikacundata.",
        "edit-gone-missing": "Ei voi udištada lehtpol't.\nVoib olda, se om jo čutud.",
        "edit-conflict": "Redakcijoiden konflikt.",
        "edit-no-change": "Teiden redakcii ignoriruidihe, sikš miše tekst ei ole toižetadud.",
-       "postedit-confirmation": "Teiden redakcii om kirjutadud muštho.",
+       "postedit-confirmation-saved": "Teiden redakcii om kirjutadud muštho.",
        "edit-already-exists": "Ei voi säta uz' lehtpol'.\nWikiš om jo mugoi lehtpol'.",
        "defaultmessagetext": "Tekst augotižjärgendusen mödhe",
        "content-model-text": "koveritoi tekst",
        "search-nonefound": "Ecmižhe ei löudnus rezul'tatoid.",
        "powersearch-legend": "Levitoittud ecind",
        "powersearch-ns": "Ecind nimiavaruziš:",
-       "powersearch-redir": "Ozutada oigendused",
        "powersearch-togglelabel": "Kodvda:",
        "powersearch-toggleall": "Kaik",
        "powersearch-togglenone": "Ei ole nimidä",
        "prefs-advancedsearchoptions": "Ližaopcijad",
        "prefs-advancedwatchlist": "Ližaopcijad",
        "prefs-displayrc": "Nägun opcijad",
-       "prefs-displaysearchoptions": "Nägun opcijad",
        "prefs-displaywatchlist": "Nägun opcijad",
        "prefs-tokenwatchlist": "Token",
        "prefs-diffs": "Erod",
        "recentchanges-label-unpatrolled": "Necidä redakcijad ei völ patruliruinugoi",
        "recentchanges-legend-newpage": "$1 - uz' lehtpol'",
        "rcnotefrom": "Alemba oma anttud toižetused '''$2'''-späi ( '''$1'''-hesai).",
-       "rclistfrom": "Ozutada uded toižetused dataspäi $1 augotaden",
+       "rclistfrom": "Ozutada uded toižetused dataspäi $3 $2 augotaden",
        "rcshowhideminor": "$1 pened redakcijad",
        "rcshowhidebots": "$1 botad",
        "rcshowhideliu": "$1 sistemha kirjutadud kävutajad",
        "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.",
-       "watchmethod-recent": "ozutadas kaceltud lehtpoliden tantoižed toižetused",
-       "watchmethod-list": "kaceltud lehtpoliden kodvind tantoižid toižetusid ectes",
-       "watchlistcontains": "Teiden kaclendnimikirjuteses om $1 {{PLURAL:$1|lehtpol'|lehtpol't}}.",
-       "iteminvalidname": "'$1'-elemental om problem, sen nimi om vär...",
        "wlshowlast": "Ozutada jäl'gmäižiš $1 časuiš da $2 päiviš $3",
        "watchlist-options": "Kaclendnimikirjutesen järgendused",
        "watching": "Ližaduz kaclendnimikirjuteshe...",
        "enotif_lastvisited": "Kc. $1, miše nähta kaik teiden jäl'gmäižen vizitan jäl'ghe tehtud toižetused.",
        "enotif_lastdiff": "Kc. $1, miše kacelta toižetusid.",
        "enotif_anon_editor": "anonimine kävutai $1",
-       "enotif_body": "Kalliž $WATCHINGUSERNAME,\n\n\n{{SITENAME}}-saitan $PAGETITLE-lehtpol' om $CHANGEDORCREATED $PAGEEDITDATE; toižetusen avtor om $PAGEEDITOR, kc. $PAGETITLE_URL, miše nägištada jäl'gmäine versii.\n\n$NEWPAGE\n\nToižetajan ümbrikacund: $PAGESUMMARY $PAGEMINOREDIT\n\nSäkat pagin toižetusiden avtoranke:\ne-počt: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nKu tö et tuleskekoi necile lehtpolile, ka sistem ei oigendaškande enamba teile tedotusid toižetusiš.\nTö voižit mugažo saubata tedotusiden opcii kaikiden lehtpoliden täht teiden kaclendnimikirjuteses.\n\n             {{SITENAME}}-saitan ustavakaz tedotuzsistem\n\n--\n\nMiše toižetada teiden e-počtan järgendused, mängat tänna:\n{{canonicalurl:{{#special:Preferences}}}}\n\nMiše toižetada teiden kaclendnimikirjutesen järgendused, mängat tänna:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nMiše čuta lehtpol' teiden kaclendnimikirjutesespäi, mängat tänna:\n$UNWATCHURL\n\nPid'oitelend da joksii abu:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Kalliž $WATCHINGUSERNAME,\n\n\n{{SITENAME}}-saitan $PAGETITLE-lehtpol' om $CHANGEDORCREATED $PAGEEDITDATE; toižetusen avtor om $PAGEEDITOR, kc. $PAGETITLE_URL, miše nägištada jäl'gmäine versii.\n\n$NEWPAGE\n\nToižetajan ümbrikacund: $PAGESUMMARY $PAGEMINOREDIT\n\nSäkat pagin toižetusiden avtoranke:\ne-počt: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nKu tö et tuleskekoi necile lehtpolile, ka sistem ei oigendaškande enamba teile tedotusid toižetusiš.\nTö voižit mugažo saubata tedotusiden opcii kaikiden lehtpoliden täht teiden kaclendnimikirjuteses.\n\n             {{SITENAME}}-saitan ustavakaz tedotuzsistem\n\n--\n\nMiše toižetada teiden e-počtan järgendused, mängat tänna:\n{{canonicalurl:{{#special:Preferences}}}}\n\nMiše toižetada teiden kaclendnimikirjutesen järgendused, mängat tänna:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nMiše čuta lehtpol' teiden kaclendnimikirjutesespäi, mängat tänna:\n$UNWATCHURL\n\nPid'oitelend da joksii abu:\n$HELPPAGE",
        "created": "om sätud",
        "changed": "om toižetadud",
        "deletepage": "Čuta lehtpol' poiš",
        "blockip": "Blokiruida kävutajad",
        "blockip-legend": "Blokiruida kävutajad",
        "blockiptext": "Kävutagat alemba anttud form, miše blokiruida kirjutandan voimuz märitud IP-adresaspäi.\nNece sab tehta vaiše sen täht, miše borcuidas vandalizmanke, kut om kirjutadud [[{{MediaWiki:Policy-url}}|ohjandimiš]].\nKirjutagat sü alemba (ozutesikš, citiruigat vandaliziruidud lehtpoled).",
-       "ipadressorusername": "IP-adres vai kävutajan nimi:",
+       "ipaddressorusername": "IP-adres vai kävutajan nimi:",
        "ipbexpiry": "Lopindan strok:",
        "ipbreason": "Sü:",
        "ipbreason-dropdown": "*Blokiruindan päsüd\n** Väran informacijan andand\n** Lehtpoliden südäimišton čudand\n** Spamkosketused irdsaitoihe\n** Hamatoman tekstan da rujon kirjutamine lehtpolile\n** Toižiden kävutajiden pöl'gästoitand\n** Erazvuiččiden registracijoiden kävutand ühtel ristitul\n** Paha kävutajan nimi",
        "newimages-summary": "Necil specialižel lehtpolel ozutadas tantoi jügutoittud failoid.",
        "newimages-legend": "Fil'tr",
        "newimages-label": "Failan nimi (vai sen pala):",
-       "showhidebots": "($1 botad)",
        "noimages": "Ei ole uzid kuvid.",
        "ilsubmit": "Ectä",
        "bydate": "datan mödhe",
        "size-kilobytes": "$1 kb",
        "size-megabytes": "$1 mb",
        "size-gigabytes": "$1 gb",
-       "livepreview-loading": "Ozutase…",
-       "livepreview-ready": "Jügutoitmine… Vaumiž!",
-       "livepreview-failed": "Ei voi kävutada heredad ezikacundad! Kävutagat normaline ezikacund.",
-       "livepreview-error": "Ei voi säta sidod saitha: $1 \"$2\".\nKävutagat normaline ezikacund.",
-       "watchlistedit-numitems": "Teiden kaclendnimikirjuteses om {{PLURAL:$1|1 kirjutuz|$1 kirjutust}} lodulehtpolita.",
-       "watchlistedit-noitems": "Teiden kaclendnimikirjuteses ei ole kirjutusid.",
        "watchlistedit-normal-title": "Redaktiruida kaclendnimikirjutez",
        "watchlistedit-normal-legend": "Heitta kirjutesid kaclendnimikirjutesespäi",
        "watchlistedit-normal-submit": "Čuta poiš kirjutesed",
        "compare-rev1": "Ezmäine versii",
        "compare-rev2": "Toine versii",
        "compare-submit": "Rindatada",
-       "dberr-header": "Necil wikil om problemoid",
        "dberr-problems": "Pakičem armahtust! Necil saital om tehnižid problemoid.",
        "dberr-again": "Varastagat pordon aigad da udištagat lehtpol'.",
        "dberr-info": "(Ei voi säta sidod admusiden baziden serveranke: $1)",
index 9c4243d..c9c3699 100644 (file)
@@ -23,7 +23,9 @@
                        "Vinhtantran",
                        "Vương Ngân Hà",
                        "Withoutaname",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라",
+                       "Tranquanganh"
                ]
        },
        "tog-underline": "Gạch chân liên kết:",
        "jumptonavigation": "chuyển hướng",
        "jumptosearch": "tìm kiếm",
        "view-pool-error": "Xin lỗi, máy chủ hiện đang bị quá tải.\nCó quá nhiều thành viên đang cố gắng xem trang này.\nXin hãy đợi một lát rồi thử truy cập lại vào trang.\n\n$1",
+       "generic-pool-error": "Xin lỗi, các máy chủ hiện đang bị quá tải.\nCó quá nhiều người dùng đang cố gắng xem tài nguyên này.\nXin hãy đợi một lát rồi thử truy cập lại vào tài nguyên.",
        "pool-timeout": "Hết thời gian chờ đợi khóa",
        "pool-queuefull": "Đầy hàng đợi khối ứng dụng (pool queue)",
        "pool-errorunknown": "Lỗi lạ",
        "readonly_lag": "Cơ sở dữ liệu bị khóa tự động trong khi các máy chủ cập nhật thông tin của nhau.",
        "internalerror": "Lỗi nội bộ",
        "internalerror_info": "Lỗi nội bộ: $1",
-       "fileappenderrorread": "Không đọc được “$1” trong việc bổ sung.",
-       "fileappenderror": "Không thể nối “$1” vào “$2”.",
        "filecopyerror": "Không thể chép tập tin “$1” đến “$2”.",
        "filerenameerror": "Không thể đổi tên tập tin “$1” thành “$2”.",
        "filedeleteerror": "Không thể xóa tập tin “$1”.",
        "directorycreateerror": "Không thể tạo được danh mục “$1”.",
        "filenotfound": "Không tìm thấy tập tin “$1”.",
-       "fileexistserror": "Không thể ghi ra tập tin “$1”: tập tin đã tồn tại",
        "unexpected": "Không hiểu giá trị: “$1”=“$2”.",
        "formerror": "Lỗi: không gửi mẫu đi được.",
        "badarticleerror": "Không thể thực hiện được tác vụ như thế tại trang này.",
        "userlogin-helplink2": "Trợ giúp đăng nhập",
        "userlogin-loggedin": "Bạn đã đăng nhập với tên {{GENDER:$1}}$1.\nHãy sử dụng biểu mẫu ở dưới để đăng nhập với tài khoản người dùng khác.",
        "userlogin-createanother": "Mở thêm tài khoản",
-       "createacct-join": "Nhập thông tin của bạn bên dưới.",
-       "createacct-another-join": "Nhập thông tin của tài khoản mới dưới đây.",
        "createacct-emailrequired": "Địa chỉ thư điện tử",
        "createacct-emailoptional": "Địa chỉ thư điện tử (tùy chọn)",
        "createacct-email-ph": "Nhập địa chỉ thư điện tử của bạn",
        "passwordreset-capture": "Xem thư điện tử có mật khẩu tạm",
        "passwordreset-capture-help": "Nếu bạn kiểm hộp này, bạn sẽ xem thư điện tử có mật khẩu tạm lúc khi nó được gửi cho người dùng.",
        "passwordreset-email": "Địa chỉ thư điện tử:",
-       "passwordreset-emailtitle": "Thông tin tài khoản tại {{SITENAM}}",
+       "passwordreset-emailtitle": "Thông tin tài khoản tại {{SITENAME}}",
        "passwordreset-emailtext-ip": "Ai đó (có thể là bạn, từ địa chỉ IP $1) đã yêu cầu tái tạo mật khẩu của bạn \ntại {{SITENAME}} ($4). {{PLURAL:$3|Tài khoản|Các tài khoản}} dưới đây gắn liền \nvới địa chỉ thư điện tử này:\n\n$2\n\n{{PLURAL:$3|Mật khẩu|Các mật khẩu}} tạm này sẽ hết hạn trong vòng {{PLURAL:$5|một ngày|$5 ngày}}. Bạn nên đăng nhập\nngay bây giờ để chọn mật khẩu mới. Nếu bạn không phải là người yêu cầu\nhoặc đã nhớ lại mật khẩu hiện hành, và bạn không còn\nmuốn thay đổi nó, xin vui lòng bỏ qua thông điệp này và tiếp tục sử dụng\nmật khẩu cũ.",
        "passwordreset-emailtext-user": "Thành viên $1 tại {{SITENAME}} đã yêu cầu tái tạo mật khẩu tại {{SITENAME}} \n($4). {{PLURAL:$3|Tài khoản|Các tài khoản}} dưới đây gắn liền với địa chỉ thư điện tử này:\n\n$2\n\n{{PLURAL:$3|Mật khẩu|Các mật khẩu}} tạm này sẽ hết hạn trong vòng {{PLURAL:$5|một ngày|$5 ngày}}. Bạn nên đăng nhập\nngay bây giờ để chọn mật khẩu mới. Nếu bạn không phải là người yêu cầu hoặc đã nhớ lại mật khẩu hiện hành, và bạn không còn\nmuốn thay đổi nó, xin vui lòng bỏ qua thông điệp này và tiếp tục sử dụng\nmật khẩu cũ.",
        "passwordreset-emailelement": "Tên người dùng: $1\nMật khẩu tạm: $2",
        "savearticle": "Lưu trang",
        "preview": "Xem trước",
        "showpreview": "Xem trước",
-       "showlivepreview": "Xem trước nhanh",
        "showdiff": "Xem thay đổi",
        "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.",
        "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.''",
        "edit-gone-missing": "Không thể cập nhật trang.\nDường như trang này đã bị xóa.",
        "edit-conflict": "Sửa đổi mâu thuẫn.",
        "edit-no-change": "Sửa đổi của bạn không được tính đến, vì nó không làm thay đổi nội dung.",
-       "postedit-confirmation": "Sửa đổi của bạn đã được lưu.",
+       "postedit-confirmation-created": "Trang đã được tạo ra.",
+       "postedit-confirmation-restored": "Trang đã được phục hồi.",
+       "postedit-confirmation-saved": "Sửa đổi của bạn đã được lưu.",
        "edit-already-exists": "Không thể tạo trang mới.\nNó đã tồn tại.",
        "defaultmessagetext": "Nội dung mặc định",
        "content-failed-to-parse": "Thất bại phân tích nội dung $2 cho mô hình $1: $3",
        "parser-template-loop-warning": "Phát hiện bản mẫu lặp vòng: [[$1]]",
        "parser-template-recursion-depth-warning": "Bản mẫu đã vượt quá giới hạn về độ sâu đệ quy ($1)",
        "language-converter-depth-warning": "Đã vượt quá giới hạn độ sâu của bộ chuyển đổi ngôn ngữ ($1)",
-       "node-count-exceeded-category": "Những trang có số nốt vượt quá giới hạn cho phép",
+       "node-count-exceeded-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á",
-       "expansion-depth-exceeded-category": "Những trang có độ sâu bung bản mẫu vượt quá giới hạn cho phép",
+       "expansion-depth-exceeded-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-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)",
        "searchmenu-exists": "* Trang '''[[$1]]'''",
        "searchmenu-new": "'''Tạo trang “[[:$1]]” trên wiki này!''' {{PLURAL:$2|0=|Hãy xem {{PLURAL:$2|kết quả|các kết quả}} tìm kiếm:}}",
        "searchprofile-articles": "Trang nội dung",
-       "searchprofile-project": "Trang trợ giúp và trang dự án",
        "searchprofile-images": "Đa phương tiện",
        "searchprofile-everything": "Tất cả",
        "searchprofile-advanced": "Nâng cao",
        "searchprofile-articles-tooltip": "Tìm trong $1",
-       "searchprofile-project-tooltip": "Tìm trong $1",
        "searchprofile-images-tooltip": "Tìm tập tin",
        "searchprofile-everything-tooltip": "Tìm tất cả nội dung (gồm cả các trang thảo luận)",
        "searchprofile-advanced-tooltip": "Tìm trong không gian tên tùy chọn",
        "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:",
-       "powersearch-redir": "Liệt kê cả trang đổi hướng",
        "powersearch-togglelabel": "Chọn:",
        "powersearch-toggleall": "Tất cả",
        "powersearch-togglenone": "Không",
        "prefs-emailconfirm-label": "Xác nhận thư điện tử:",
        "youremail": "Thư điện tử:",
        "username": "{{GENDER:$1}}Tên người dùng:",
-       "uid": "{{GENDER:$1}}Số thứ tự thành viên:",
        "prefs-memberingroups": "{{GENDER:$2}}Thành viên của {{PLURAL:$1|nhóm|các nhóm}}:",
        "prefs-registration": "Lúc mở tài khoản:",
        "yourrealname": "Tên thật:",
        "prefs-advancedsearchoptions": "Tùy chọn nâng cao",
        "prefs-advancedwatchlist": "Tùy chọn nâng cao",
        "prefs-displayrc": "Tùy chọn hiển thị",
-       "prefs-displaysearchoptions": "Tùy chọn hiển thị",
        "prefs-displaywatchlist": "Tùy chọn hiển thị",
        "prefs-tokenwatchlist": "Dấu hiệu",
        "prefs-diffs": "Khác biệt",
        "right-move": "Di chuyển trang",
        "right-move-subpages": "Di chuyển trang cùng với các trang con của nó",
        "right-move-rootuserpages": "Di chuyển các trang cá nhân chính",
+       "right-move-categorypages": "Di chuyển trang thể loại",
        "right-movefile": "Di chuyển tập tin",
        "right-suppressredirect": "Không tạo đổi hướng từ tên cũ khi di chuyển trang",
        "right-upload": "Tải tập tin lên",
        "action-createpage": "tạo trang",
        "action-createtalk": "tạo trang thảo luận",
        "action-createaccount": "mở tài khoản này",
+       "action-history": "xem lịch sử của trang này",
        "action-minoredit": "đánh dấu đây là sửa đổi nhỏ",
        "action-move": "di chuyển trang này",
        "action-move-subpages": "di chuyển trang này và các trang con",
        "action-move-rootuserpages": "di chuyển trang cá nhân chính",
+       "action-move-categorypages": "di chuyển trang thể loại",
        "action-movefile": "di chuyển tập tin này",
        "action-upload": "tải tập tin này lên",
        "action-reupload": "ghi đè lên tập tin có sẵn này",
        "recentchanges-legend-heading": "'''Chú giải:'''",
        "recentchanges-legend-newpage": "(xem thêm [[Special:NewPages|danh sách các trang mới]])",
        "recentchanges-legend-plusminus": "(''±123'')",
-       "rcnotefrom": "Thay đổi từ <strong>$2</strong> (hiển thị tối đa <strong>$1</strong> thay đổi).",
-       "rclistfrom": "Hiển thị các thay đổi từ $1.",
+       "rcnotefrom": "Các thay đổi từ <strong>$2</strong> (hiển thị tối đa <strong>$1</strong> thay đổi).",
+       "rclistfrom": "Xem các thay đổi từ $2 $3 trở về sau",
        "rcshowhideminor": "$1 sửa đổi nhỏ",
        "rcshowhideminor-show": "Hiện",
        "rcshowhideminor-hide": "Ẩn",
        "uploadstash-refresh": "Làm mới danh sách tập tin",
        "invalid-chunk-offset": "Khúc lệch (chunk offset) không hợp lệ",
        "img-auth-accessdenied": "Không cho phép truy cập",
-       "img-auth-nopathinfo": "Thiếu PATH_INFO.\nMáy chủ của bạn không được thiết lập để truyền thông tin này.\nCó thể do nó dựa trên CGI và không hỗ trợ img_auth.\nXem [https://www.mediawiki.org/wiki/Manual:Image_Authorization hướng dẫn điều khiển truy cập hình ảnh].",
+       "img-auth-nopathinfo": "Thiếu PATH_INFO.\nMáy chủ của bạn không được thiết lập để truyền thông tin này.\nCó thể do nó dựa trên CGI và không hỗ trợ img_auth.\nXem [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization hướng dẫn điều khiển truy cập hình ảnh].",
        "img-auth-notindir": "Đường dẫn yêu cầu không nằm trong thư mục cấu hình tải lên.",
        "img-auth-badtitle": "Không thể tạo tựa đề hợp lệ từ “$1”.",
        "img-auth-nologinnWL": "Bạn chưa đăng nhập và “$1” không nằm trong danh sách trắng.",
        "pageswithprop-prophidden-binary": "giá trị thuộc tính nhị phân bị ẩn ($1)",
        "doubleredirects": "Đổi hướng kép",
        "doubleredirectstext": "Trang này liệt kê các trang đổi hướng đến một trang đổi hướng khác.\nMỗi hàng có chứa các liên kết đến trang đổi hướng thứ nhất và thứ hai, cũng như mục tiêu của trang đổi hướng thứ hai, thường là trang đích “thực sự”, là nơi mà trang đổi hướng đầu tiên nên trỏ đến.\nCác mục <del>bị gạch bỏ</del> là các trang đã được sửa.",
-       "double-redirect-fixed-move": "[[$1]] đã được đổi tên, giờ nó là trang đổi hướng đến [[$2]]",
-       "double-redirect-fixed-maintenance": "Giải quyết đổi hướng kép từ [[$1]] đến [[$2]].",
+       "double-redirect-fixed-move": "[[$1]] đã được đổi tên.\nNó được cập nhật tự động và giờ là trang đổi hướng đến [[$2]].",
+       "double-redirect-fixed-maintenance": "Tự động giải quyết đổi hướng kép từ [[$1]] đến [[$2]] trong một công việc bảo trì.",
        "double-redirect-fixer": "Người sửa trang đổi hướng",
        "brokenredirects": "Đổi hướng sai",
        "brokenredirectstext": "Các trang đổi hướng sau đây liên kết đến trang không tồn tại:",
        "mostinterwikis": "Trang có nhiều liên kết liên wiki nhất",
        "mostrevisions": "Trang được sửa đổi nhiều lần nhất",
        "prefixindex": "Tất cả các trang trùng với tiền tố",
-       "prefixindex-namespace": "Tất cả các trang trùng với tiền tố (không gian $1)",
+       "prefixindex-namespace": "Tất cả các trang trùng với tiền tố (không gian tên $1)",
        "prefixindex-strip": "Ẩn tiền tố trong danh sách",
        "shortpages": "Trang ngắn nhất",
        "longpages": "Trang dài nhất",
        "protectedpages-cascade": "Chỉ hiển thị khóa theo tầng",
        "protectedpages-noredirect": "Ẩn trang đổi hướng",
        "protectedpagesempty": "Hiện không có trang nào bị khóa với các thông số này.",
-       "protectedpages-timestamp": "Dấu thời gian",
+       "protectedpages-timestamp": "Thời gian",
        "protectedpages-page": "Trang",
        "protectedpages-expiry": "Hết hạn",
        "protectedpages-performer": "Người dùng khóa",
        "log-title-wildcard": "Tìm các tựa trang bắt đầu bằng các chữ này",
        "showhideselectedlogentries": "Thay đổi mức khả kiến của các mục nhật trình đã chọn",
        "allpages": "Mọi trang",
-       "alphaindexline": "$1 đến $2",
        "nextpage": "Trang sau ($1)",
        "prevpage": "Trang trước ($1)",
        "allpagesfrom": "Xem trang từ:",
        "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.",
+       "addedwatchtext-short": "Trang “$1” đã được thêm vào danh sách theo dõi của bạn.",
        "removewatch": "Gỡ khỏi danh sách theo dõi",
        "removedwatchtext": "Trang “[[:$1]]” đã được đưa ra khỏi [[Special:Watchlist|danh sách theo dõi]] của bạn.",
+       "removedwatchtext-short": "Trang “$1” đã được xóa khỏi danh sách theo dõi của bạn.",
        "watch": "Theo dõi",
        "watchthispage": "Theo dõi trang này",
        "unwatch": "Ngừng theo dõi",
        "watchlist-details": "Bạn đang theo dõi {{PLURAL:$1}}$1 trang, không kể riêng các trang thảo luận.",
        "wlheader-enotif": "Đã bật thông báo qua thư điện tử.",
        "wlheader-showupdated": "Các trang đã thay đổi kể từ lần cuối bạn xem chúng được in '''đậm'''",
-       "watchmethod-recent": "Dưới đây hiện thay đổi mới với các trang theo dõi.",
-       "watchmethod-list": "Dưới đây hiện danh sách các trang theo dõi.",
-       "watchlistcontains": "Danh sách theo dõi của bạn có $1 {{PLURAL:$1|trang|trang}}.",
-       "iteminvalidname": "Tên trang “$1” không hợp lệ…",
        "wlnote2": "Bên dưới có các thay đổi vào <strong>$1</strong> giờ qua, vào lúc $3 $2.",
        "wlshowlast": "Hiển thị $1 giờ $2 ngày gần đây $3",
        "watchlist-options": "Tùy chọn về danh sách theo dõi",
        "enotif_lastvisited": "Xem $1 để biết các thay đổi diễn ra từ lần xem cuối cùng của bạn.",
        "enotif_lastdiff": "Vào $1 để xem sự thay đổi này.",
        "enotif_anon_editor": "người dùng vô danh $1",
-       "enotif_body": "Xin chào $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nTóm lược sửa đổi: $PAGESUMMARY $PAGEMINOREDIT\n\nLiên lạc với người viết trang qua:\nthư: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nSẽ không có thông báo nào khác nếu có sự thay đổi tiếp theo trừ khi bạn xem trang đó lúc khi đăng nhập. Bạn cũng có thể thiết lập lại việc nhắc nhở cho tất cả các trang nằm trong danh sách theo dõi của bạn.\n\nHệ thống báo tin {{SITENAME}} thân thiện của bạn\n\n--\nĐể thay đổi các thiết lập thư điện tử thông báo, mời xem:\n{{canonicalurl:{{#special:Preferences}}}}\n\nĐể thay đổi các thiết lập danh sách theo dõi, mời xem:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nĐể xóa trang ra khỏi danh sách theo dõi của bạn, mời xem:\n$UNWATCHURL\n\nPhản hồi và cần sự hỗ trợ:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Xin chào $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nTóm lược sửa đổi: $PAGESUMMARY $PAGEMINOREDIT\n\nLiên lạc với người viết trang qua:\nthư: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nSẽ không có thông báo nào khác nếu có sự thay đổi tiếp theo trừ khi bạn xem trang đó lúc khi đăng nhập. Bạn cũng có thể thiết lập lại việc nhắc nhở cho tất cả các trang nằm trong danh sách theo dõi của bạn.\n\nHệ thống báo tin {{SITENAME}} thân thiện của bạn\n\n--\nĐể thay đổi các thiết lập thư điện tử thông báo, mời xem:\n{{canonicalurl:{{#special:Preferences}}}}\n\nĐể thay đổi các thiết lập danh sách theo dõi, mời xem:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nĐể xóa trang ra khỏi danh sách theo dõi của bạn, mời xem:\n$UNWATCHURL\n\nPhản hồi và cần sự hỗ trợ:\n$HELPPAGE",
        "created": "viết mới",
        "changed": "thay đổi",
        "deletepage": "Xóa trang",
        "contributions-title": "Đóng góp của thành viên $1",
        "mycontris": "Đóng góp",
        "contribsub2": "Của {{GENDER:$3}}$1 ($2)",
+       "contributions-userdoesnotexist": "Chưa có tài khoản với tên “$1”.",
        "nocontribs": "Không tìm thấy thay đổi nào khớp với yêu cầu.",
        "uctop": "(hiện tại)",
        "month": "Từ tháng (trở về trước):",
        "blockip": "Cấm 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).",
-       "ipadressorusername": "Địa chỉ IP hay tên thành viên:",
+       "ipaddressorusername": "Địa chỉ IP hay tên thành viên:",
        "ipbexpiry": "Thời hạn:",
        "ipbreason": "Lý do:",
        "ipbreason-dropdown": "*Một số lý do cấm thường gặp\n** Phá hoại\n** Thêm thông tin sai lệch\n** Xóa nội dung trang\n** Đăng liên kết thư rác dẫn đến trang Web bên ngoài\n** Cho thông tin rác vào trang\n** Có thái độ dọa dẫm/quấy rối\n** Lạm dụng nhiều tài khoản\n** Tên thành viên không thể chấp nhận",
        "movepagetalktext": "Trang thảo luận đi kèm sẽ được tự động di chuyển theo '''trừ khi''':\n*Đã tồn tại một trang thảo luận không trống tại tên mới, hoặc\n*Bạn không đánh vào ô bên dưới.\n\nTrong những trường hợp đó, bạn phải di chuyển hoặc hợp nhất trang theo kiểu thủ công nếu muốn.",
        "movearticle": "Di chuyển trang:",
        "moveuserpage-warning": "'''Cảnh báo:''' Bạn sắp di chuyển trang cá nhân của người dùng. Xin lưu ý rằng chỉ có trang này sẽ được di chuyển, còn người dùng sẽ ''không'' đổi tên.",
+       "movecategorypage-warning": "<strong>Cảnh báo:</strong> Bạn sắp sửa di chuyển một trang thể loại. Lưu ý rằng chỉ trang này sẽ được di chuyển, còn trang nào được xếp vào thể loại cũ sẽ <em>không</em> được xếp vào thể loại mới.",
        "movenologintext": "Bạn phải là thành viên đã mở tài khoản và [[Special:UserLogin|đăng nhập]] mới di chuyển trang được.",
        "movenotallowed": "Bạn không có quyền di chuyển trang.",
        "movenotallowedfile": "Bạn không có đủ quyền để di chuyển tập tin.",
        "cant-move-user-page": "Bạn không có quyền di chuyển trang cá nhân (ngoại trừ trang con).",
        "cant-move-to-user-page": "Bạn không có quyền di chuyển một trang đến trang cá nhân (ngoại trừ đến trang con của trang cá nhân).",
+       "cant-move-category-page": "Bạn không có quyền di chuyển trang thể loại.",
+       "cant-move-to-category-page": "Bạn không có quyền di chuyển một trang vào không gian tên Thể loại.",
        "newtitle": "Tên mới",
        "move-watch": "Theo dõi trang này",
        "movepagebtn": "Di chuyển trang",
        "tooltip-summary": "Hãy nhập câu tóm lược",
        "interlanguage-link-title": "$1 – $2",
        "common.css": "/* Mã CSS đặt ở đây sẽ áp dụng cho mọi hình dạng */",
-       "cologneblue.css": "/* Mã CSS tại đây sẽ ảnh hưởng đến những người dùng sử dụng hình dạng Xanh Cologne */",
        "monobook.css": "/* Mã CSS đặt ở đây sẽ ảnh hưởng đến thành viên sử dụng hình dạng MonoBook */",
-       "modern.css": "/* Mã CSS tại đây sẽ ảnh hưởng đến những người dùng sử dụng hình dạng Hiện đại */",
        "vector.css": "/* Mã CSS đặt ở đây sẽ ảnh hưởng đến thành viên sử dụng hình dạng Vectơ */",
        "print.css": "/* Mã CSS tại đây sẽ ảnh hưởng đến bản để in */",
        "noscript.css": "/* Mã CSS tại đây sẽ ảnh hưởng đến những người dùng tắt JavaScript */",
        "group-sysop.css": "/* Mã CSS tại đây sẽ chỉ ảnh hưởng đến các bảo quản viên */",
        "group-bureaucrat.css": "/* Mã CSS tại đây sẽ chỉ ảnh hưởng đến các hành chính viên */",
        "common.js": "/* Bất kỳ mã JavaScript ở đây sẽ được tải cho tất cả các thành viên khi tải một trang nào đó lên. */",
-       "cologneblue.js": "/* Mã JavaScript tại đây sẽ được tải khi người dùng sử dụng hình dạng Xanh Cologne */",
        "monobook.js": "/* Mã JavaScript tại đây sẽ được tải khi người dùng sử dụng bề ngoài MonoBook */",
-       "modern.js": "/* Mã JavaScript tại đây sẽ được tải khi người dùng sử dụng bề ngoài Hiện đại */",
        "vector.js": "/* Mã JavaScript tại đây sẽ được tải khi người dùng sử dụng bề ngoài Vectơ */",
        "group-autoconfirmed.js": "/* Mã JavaScript tại đây sẽ chỉ được tải cho các thành viên tự động xác nhận */",
        "group-user.js": "/* Mã JavaScript tại đây sẽ chỉ được tải cho các thành viên có tài khoản */",
        "group-bot.js": "/* Mã JavaScript tại đây sẽ chỉ được tải cho các bot */",
        "group-sysop.js": "/* Mã JavaScript tại đây sẽ chỉ được tải cho các bảo quản viên */",
        "group-bureaucrat.js": "/* Mã JavaScript tại đây sẽ chỉ được tải cho các hành chính viên */",
-       "notacceptable": "Máy chủ không thể cho ra định dạng dữ liệu tương thích với phần mềm của bạn.",
        "anonymous": "{{PLURAL:$1|Người dùng|Người dùng}} vô danh của {{SITENAME}}",
        "siteuser": "thành viên $1 của {{SITENAME}}",
        "anonuser": "người dùng vô danh $1 tại {{SITENAME}}",
        "pageinfo-category-pages": "Số trang",
        "pageinfo-category-subcats": "Số thể loại con",
        "pageinfo-category-files": "Số tập tin",
-       "skinname-cologneblue": "Xanh Cologne",
-       "skinname-modern": "Hiện đại",
        "skinname-vector": "Vectơ",
        "markaspatrolleddiff": "Đánh dấu tuần tra",
        "markaspatrolledtext": "Đánh dấu tuần tra trang này",
        "newimages-summary": "Trang đặc biệt này hiển thị các tập tin được tải lên gần đây nhất.",
        "newimages-legend": "Bộ lọc",
        "newimages-label": "Tên tập tin (hoặc một phần tên):",
-       "showhidebots": "($1 robot)",
+       "newimages-showbots": "Xem các tập tin do bot tải lên",
        "noimages": "Chưa có hình.",
        "ilsubmit": "Tìm kiếm",
        "bydate": "theo ngày",
-       "sp-newimages-showfrom": "Trưng bày những tập tin mới, bắt đầu từ lúc $2, ngày $1",
+       "sp-newimages-showfrom": "Trưng bày các tập tin từ $2 $1 trở về sau",
        "video-dims": "$1, $2×$3",
        "seconds-abbrev": "$1 s",
        "minutes-abbrev": "$1 min",
        "bitrate-exabits": "$1 Ebps",
        "bitrate-zetabits": "$1 Zbps",
        "bitrate-yottabits": "$1 Ybps",
-       "livepreview-loading": "Đang tải…",
-       "livepreview-ready": "Đang tải… Xong!",
-       "livepreview-failed": "Không thể xem trước trực tiếp! Hãy dùng thử chế độ xem trước thông thường.",
-       "livepreview-error": "Không thể kết nối: $1 “$2”. Hãy dùng thử chế độ xem trước thông thường.",
        "lag-warn-normal": "Những thay đổi trong vòng $1 {{PLURAL:||}}giây trở lại đây có thể chưa xuất hiện trong danh sách.",
        "lag-warn-high": "Do độ trễ của máy chủ cơ sở dữ liệu, những thay đổi trong vòng $1 {{PLURAL:$1||}}giây trở lại đây có thể chưa xuất hiện trong danh sách.",
-       "watchlistedit-numitems": "Danh sách theo dõi của bạn có $1 {{PLURAL:$1|tựa đề|tựa đề}}, không tính các trang thảo luận.",
-       "watchlistedit-noitems": "Danh sách các trang bạn theo dõi hiện không có gì.",
        "watchlistedit-normal-title": "Sửa các trang tôi theo dõi",
        "watchlistedit-normal-legend": "Gỡ trang khỏi danh sách",
        "watchlistedit-normal-explain": "Tên các trang bạn theo dõi được hiển thị dưới đây. Để xóa một tên trang, chọn vào hộp kiểm bên cạnh nó, rồi nhấn “{{int:Watchlistedit-normal-submit}}”. Bạn cũng có thể [[Special:EditWatchlist/raw|sửa danh sách theo dạng thô]].",
        "watchlistedit-raw-done": "Danh sách các trang bạn theo dõi đã được cập nhật.",
        "watchlistedit-raw-added": "$1 {{PLURAL:$1|tựa đề|tựa đề}} đã được thêm vào:",
        "watchlistedit-raw-removed": "$1 {{PLURAL:$1|tựa đề|tựa đề}} đã được xóa khỏi danh sách:",
+       "watchlistedit-clear-title": "Đã xóa sạch danh sách theo dõi",
+       "watchlistedit-clear-legend": "Xóa sạch danh sách theo dõi",
+       "watchlistedit-clear-explain": "Tất cả các tiêu đề sẽ được xóa khỏi danh sách theo dõi của bạn.",
+       "watchlistedit-clear-titles": "Các tiêu đề:",
+       "watchlistedit-clear-submit": "Xóa sạch danh sách theo dõi (không thể lùi lại!)",
+       "watchlistedit-clear-done": "Đã xóa sạch danh sách theo dõi của bạn.",
+       "watchlistedit-clear-removed": "$1 tựa đề đã được xóa khỏi danh sách:",
+       "watchlistedit-too-many": "Danh sách có quá nhiều trang để hiển thị.",
+       "watchlisttools-clear": "Xóa sạch danh sách theo dõi",
        "watchlisttools-view": "Xem thay đổi trên các trang theo dõi",
        "watchlisttools-edit": "Xem và sửa danh sách theo dõi",
        "watchlisttools-raw": "Sửa danh sách theo dõi dạng thô",
        "compare-invalid-title": "Tên trang chỉ định không hợp lệ.",
        "compare-title-not-exists": "Tên trang chỉ định không tồn tại.",
        "compare-revision-not-exists": "Phiên bản chỉ định không tồn tại.",
-       "dberr-header": "Wiki này đang gặp trục trặc",
        "dberr-problems": "Xin lỗi! Trang này đang gặp phải những khó khăn về kỹ thuật.",
        "dberr-again": "Xin thử đợi vài phút rồi tải lại trang.",
        "dberr-info": "(Không thể liên lạc với máy chủ cơ sở dữ liệu: $1)",
        "htmlform-no": "Không",
        "htmlform-yes": "Có",
        "htmlform-chosen-placeholder": "Chọn một tùy chọn",
+       "htmlform-cloner-create": "Tiếp tục thêm",
+       "htmlform-cloner-delete": "Loại bỏ",
+       "htmlform-cloner-required": "Cần ít nhất một giá trị.",
        "sqlite-has-fts": "$1 với sự hỗ trợ tìm kiếm toàn văn",
        "sqlite-no-fts": "$1 không có hỗ trợ tìm kiếm toàn văn",
        "logentry-delete-delete": "$1 {{GENDER:$2}}đã xóa trang “$3”",
index 98ebca7..1ea9513 100644 (file)
@@ -5,13 +5,13 @@
                        "Bua333",
                        "Matma Rex",
                        "Midnight Gambler",
-                       "Silvicola"
+                       "Silvicola",
+                       "아라"
                ]
        },
        "tog-underline": "Linggs undârschdrajchn:",
        "tog-hideminor": "Glaane ändrungn ned ôôdsajchn",
        "tog-hidepatrolled": "Ned dsajchn in dâ „Ledschdâ Ändrungn“, was an andrar schon brüüfd had",
-       "tog-rememberpassword": "Uf dem Ghombjuudâr schdändich ôôgmäld blajwn (for a maximum of $1 {{PLURAL:$1|day|days}})",
        "tog-watchcreations": "Ale fon miir sälwâr gmachdn sajdn soln uf mâj beoobachdungs-lischdn",
        "tog-watchdefault": "Ale fon miir gändârdnd sajdn soln uf mâj beoobachdungs-lischdn",
        "tog-watchmoves": "Ale fon miir fârschoobnen sajdn soln uf mâj beoobachdungs-lischdn",
        "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:",
-       "powersearch-redir": "Wajdälajdunga oodsajng",
        "powersearch-togglelabel": "Wääl aus:",
        "powersearch-toggleall": "Ale dsam",
        "powersearch-togglenone": "Gôôr ghane",
        "recentchanges-label-bot": "Ändrung durch an Bot",
        "recentchanges-label-unpatrolled": "Net-kondrollierde Ändrung",
        "rcnotefrom": "Oozeichd werrn däi Ändrunga seid '''$2''' (max. '''$1''' Eidrääch).",
-       "rclistfrom": "Bloos di ändrunga dsajchn sajd $1",
+       "rclistfrom": "Bloos di ändrunga dsajchn sajd $3 $2",
        "rcshowhideminor": "Glenâre Ändrungn $1",
        "rcshowhidebots": "Bods (bearbajdâr, dii ajchendlich brograme san) $1",
        "rcshowhideliu": "Ôôgmäldâde bearbajdâr $1",
index 08e736b..ecc53f1 100644 (file)
@@ -7,7 +7,8 @@
                        "Malafaya",
                        "Reedy",
                        "Smeira",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Dislienükön yümis:",
@@ -20,7 +21,6 @@
        "tog-showtoolbar": "Jonön redakamastumemi",
        "tog-editondblclick": "Dälön redakön padis pö drän telik mugaknopa",
        "tog-editsectiononrightclick": "Dälön redakami diläda me klik mugaknopa detik su dilädatiäds",
-       "tog-rememberpassword": "Dakipolös nunädamanünis obik in bevüresodatävöm at (muiko {{PLURAL:$1|del|dels}} $1)",
        "tog-watchcreations": "Läükön padis fa ob pejafölis e ragivis fa ob pelöpükölis lä galädalised obik",
        "tog-watchdefault": "Läükön padis e ragivis fa ob peredakölis la galädalised obik",
        "tog-watchmoves": "Läükön padis e ragivis fa ob petopätükölis lä galädalised obik",
        "readonly_lag": "Vük pefärmükon itjäfidiko du dünanünöms slafik kosädons ko mastanünöm.",
        "internalerror": "Pöl ninik",
        "internalerror_info": "Pöl ninik: $1",
-       "fileappenderror": "No emögos ad lüükön ragivi \"$1\" ad \"$2\".",
        "filecopyerror": "No emögos ad kopiedön ragivi \"$1\" ad \"$2\".",
        "filerenameerror": "No eplöpos ad votanemön ragivi: \"$1\" ad: \"$2\".",
        "filedeleteerror": "No emögos ad moükön ragivi \"$1\".",
        "directorycreateerror": "No eplöpos ad jafön ragiviäri: \"$1\".",
        "filenotfound": "No eplöpos ad tuvön ragivi: \"$1\".",
-       "fileexistserror": "No eplöpos ad dakipön ragivi: \"$1\": ragiv ya dabinon",
        "unexpected": "Völad no pespetöl: „$1“=„$2“.",
        "formerror": "PÖL: no emögos ad bevobön fometi at.",
        "badarticleerror": "Dun at no kanon paledunön su pad at.",
        "gotaccountlink": "Nunädolös obi",
        "userlogin-resetlink": "Eglömol-li nünis kala olik?",
        "userlogin-resetpassword-link": "Dönuvälön letavödi olik",
-       "createacct-join": "Penolös nünis olik dono.",
        "createacct-emailrequired": "Ladet leäktronik",
        "createaccountmail": "me pot leäktronik",
        "createaccountreason": "Kod:",
        "savearticle": "Dakipolöd padi",
        "preview": "Büologed",
        "showpreview": "Jonolöd padalogoti",
-       "showlivepreview": "Büologed vifik",
        "showdiff": "Jonolöd votükamis",
        "anoneditwarning": "'''Nuned:''' No enunädol oli. Ladet-IP olik poregistaron su redakamajenotem pada at.",
        "missingsummary": "'''Noet:''' No epenol redakamipläni. If ovälol dönu knopi: Dakipolöd, redakam olik podakipon nen plän.",
        "edit-gone-missing": "No eplöpos ad votükön padi.\nJiniko pemoükon.",
        "edit-conflict": "Redakamakonflit.",
        "edit-no-change": "Redakam olik penedemon, bi vödemivotükams nonik pedunons.",
-       "postedit-confirmation": "Redakam olik pedakipolon.",
+       "postedit-confirmation-saved": "Redakam olik pedakipolon.",
        "edit-already-exists": "No kanoy jafön padi nulik.\nOn ya dabinon.",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
        "search-nonefound": "Sukaseks nonik dabinons.",
        "powersearch-legend": "Suk komplitikum",
        "powersearch-ns": "Sukön in nemaspads:",
-       "powersearch-redir": "Lisedön lüodükömis",
        "powersearch-togglelabel": "Välön:",
        "powersearch-toggleall": "Valik",
        "powersearch-togglenone": "Nonik",
        "recentchanges-label-unpatrolled": "Redakam at no nog pekontrolon",
        "recentchanges-legend-newpage": "$1 - pad nulik",
        "rcnotefrom": "Is palisedons votükams sis '''$2''' (jü '''$1''').",
-       "rclistfrom": "Jonön votükamis nulik, primölo tü düp $1",
+       "rclistfrom": "Jonön votükamis nulik, primölo tü düp $3 $2",
        "rcshowhideminor": "$1 votükamis pülik",
        "rcshowhidebots": "$1 elis bot",
        "rcshowhideliu": "$1 gebanis penunädöl",
        "watchlist-details": "{{PLURAL:$1|pad $1|pads $1}} su galädalised, plä bespikapads.",
        "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'''",
-       "watchmethod-recent": "vestigam redakamas brefabüik padas galädaliseda",
-       "watchmethod-list": "vestigam votükamas brefabüik padas galädaliseda",
-       "watchlistcontains": "Galädalised olik labon {{PLURAL:$1|padi|padis}} $1.",
-       "iteminvalidname": "Fikul tefü el '$1': nem no lonöföl...",
        "wlshowlast": "Jonolöd: düpis lätik $1, delis lätik $2, $3",
        "watchlist-options": "Paramets galädaliseda",
        "watching": "Papladon ini galädalised...",
        "enotif_lastvisited": "Logolös eli $1 ad tuvön lisedi votükamas valik pos visit lätik ola.",
        "enotif_lastdiff": "Logolös eli $1 ad tuvön votükami at.",
        "enotif_anon_editor": "geban nennemik: $1",
-       "enotif_body": "O $WATCHINGUSERNAME löfik!\n\n\nPad: $PAGETITLE in {{SITENAME}} $CHANGEDORCREATED tü $PAGEEDITDATE fa geban: $PAGEEDITOR; otuvol fomami anuik in $PAGETITLE_URL.\n\n$NEWPAGE\n\nNaböfodönuam redakana: $PAGESUMMARY $PAGEMINOREDIT\n\nKanol penön gebane:\npot leäktronik: $PAGEEDITOR_EMAIL\npad in vük: $PAGEEDITOR_WIKI\n\nVotükams fütürik no ponunons ole if no ovisitol dönu padi at.\nKanol i geükön nunamastänis padas valik galädaliseda olik.\n\n             Nunamasit flenöfik ela {{SITENAME}} olik\n\n--\nAd votükön parametami galädaliseda olik, loglös\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nKüpets e yuf pluik:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "O $WATCHINGUSERNAME löfik!\n\n\nPad: $PAGETITLE in {{SITENAME}} $CHANGEDORCREATED tü $PAGEEDITDATE fa geban: $PAGEEDITOR; otuvol fomami anuik in $PAGETITLE_URL.\n\n$NEWPAGE\n\nNaböfodönuam redakana: $PAGESUMMARY $PAGEMINOREDIT\n\nKanol penön gebane:\npot leäktronik: $PAGEEDITOR_EMAIL\npad in vük: $PAGEEDITOR_WIKI\n\nVotükams fütürik no ponunons ole if no ovisitol dönu padi at.\nKanol i geükön nunamastänis padas valik galädaliseda olik.\n\n             Nunamasit flenöfik ela {{SITENAME}} olik\n\n--\nAd votükön parametami galädaliseda olik, loglös\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nKüpets e yuf pluik:\n$HELPPAGE",
        "created": "pejafon",
        "changed": "pevotüköl",
        "deletepage": "Moükolöd padi",
        "blockip": "Blokön gebani",
        "blockip-legend": "Blokön gebani",
        "blockiptext": "Gebolös padi at ad blokön redakamagitäti gebananema u ladeta-IP semikas. Atos söton padunön teiko ad vitön vandalimi, e bai [[{{MediaWiki:Policy-url}}|dunalesets {{SITENAME}}]]. Penolös dono kodi patik pro blokam (a. s., mäniotolös padis pedobüköl).",
-       "ipadressorusername": "Ladet-IP u gebananem",
+       "ipaddressorusername": "Ladet-IP u gebananem",
        "ipbexpiry": "Dü",
        "ipbreason": "Kod:",
        "ipbreason-dropdown": "*Blokamakods suvik:\n** Läükam nünas neverätik\n** Moükam ninäda se pads\n** Läükam yümas plödik tu mödikis (el „spam“)\n** Penam vödas/vödemas nesiämik su pads\n** Kondöt tu komipälik u dredüköl\n** Geb dobik kalas mödik\n** Gebananem no zepabik",
        "common.css": "/** El CSS isio peplädöl pogebon pro padafomäts valik */",
        "monobook.css": "/* El CSS isio pepladöl otefon gebanis padafomäta: Monobook */",
        "common.js": "/* El JavaScript isik alseimik pogebon pro gebans valik pö padilogam valik. */",
-       "notacceptable": "Dünanünömi vüka no fägon ad blünön nünodis ma fomät, keli nünöm olik kanon reidön.",
        "anonymous": "{{PLURAL:$1|Geban|Gebans}} nennemik ela {{SITENAME}}",
        "siteuser": "Geban ela {{SITENAME}}: $1",
        "lastmodifiedatby": "Pad at pävotükon lätiküno tü dÜp $1, ün $2, fa el $3.",
        "newimages-summary": "Pad patik at lisedon ragivis pelöpüköl lätik.",
        "newimages-legend": "Sul",
        "newimages-label": "Ragivanem (u dil ona):",
-       "showhidebots": "($1 mäikamenis)",
        "noimages": "Nos ad logön.",
        "ilsubmit": "Sukolöd",
        "bydate": "ma dät",
        "autosumm-replace": "Pad pepläadon me '$1'",
        "autoredircomment": "Lüodükon lü [[$1]]",
        "autosumm-new": "Ejafon padi ko: '$1'",
-       "livepreview-loading": "Pabelodon…",
-       "livepreview-ready": "Pabelodon… Efinikon!",
-       "livepreview-failed": "Büologed vifik no eplöpon! Gebolös büologedi kösömik.",
-       "livepreview-error": "Yümätam no eplöpon: $1 „$2“. Steifülolös me büologed kösömik.",
        "lag-warn-normal": "Votükams ün {{PLURAL:$1|sekun|sekuns}} lätik $1 ba no polisedons is.",
-       "watchlistedit-numitems": "Galädalised olik labon {{PLURAL:$1|tiädi bal|tiädis $1}}, fakipü bespikapads.",
-       "watchlistedit-noitems": "Galädalised olik keninükon tiädis nonik.",
        "watchlistedit-normal-title": "Redakön galädalisedi",
        "watchlistedit-normal-legend": "Moükön tiädis se galädalised",
        "watchlistedit-normal-explain": "Tiäds su galädalised olik palisedons dono.\nAd moükön tiädi, välolös bugili nilü on e klikolös: \"{{int:Watchlistedit-normal-submit}}\".\nKanol i [[Special:EditWatchlist/raw|redakön lisedafonäti]].",
        "compare-rev1": "Revid 1",
        "compare-rev2": "Revid 2",
        "compare-submit": "Leigodolöd",
-       "dberr-header": "Vük at labon säkädi",
        "dberr-problems": "Säkusadolös! Bevüresodatopäd at nu labon säkädis kaenik.",
        "dberr-again": "Steifülolös dönu pos stebedüp minutas anik.",
        "dberr-info": "(No eplöpos ad kosikön ko dünanünöm nünodema: $1)",
index 6e239e0..c1aeb63 100644 (file)
@@ -7,7 +7,8 @@
                        "Comp1089",
                        "Erdemaslancan",
                        "Paivud",
-                       "Trần Nguyễn Minh Huy"
+                       "Trần Nguyễn Minh Huy",
+                       "아라"
                ]
        },
        "tog-underline": "Link underlining",
        "search-nonefound": "Cüsümühse mukaizõssi eb õõ mitäid löütettü.",
        "powersearch-legend": "Etenennü ettsü",
        "powersearch-ns": "Etsi nimiruumõssa:",
-       "powersearch-redir": "Spiiska mešaitussijõ",
        "preferences": "Koozid",
        "mypreferences": "Minu koozid",
        "skin-preview": "Prestavleńńa",
        "recentchanges-label-bot": "Kase kõrjauz on robotaka lootu",
        "recentchanges-label-unpatrolled": "Kasta kõrjaussa eb tarkisõtti veel",
        "rcnotefrom": "Alapallõ õlla lugõtõltu muuttamizõd $2-lt ($1-lõssaa)",
-       "rclistfrom": "Näüt uuvvõd muutuhsõd $1 alguss",
+       "rclistfrom": "Näüt uuvvõd muutuhsõd $3 $2 alguss",
        "rcshowhideminor": "$1 peened muutussõd",
        "rcshowhidebots": "$1 botid",
        "rcshowhideliu": "$1 süäme cirjutõnnud cäüttijäd",
index cdbadcd..19909f8 100644 (file)
@@ -7,7 +7,8 @@
                        "Reedy",
                        "Sulev Iva (Võrok)",
                        "Trixt",
-                       "Võrok"
+                       "Võrok",
+                       "아라"
                ]
        },
        "tog-underline": "Lingiq ala tõmmadaq",
@@ -20,7 +21,6 @@
        "tog-showtoolbar": "Näütäq toimõndusõ tüüriistaripa",
        "tog-editondblclick": "Toimõndaq artikliid topõltklõpsu pääle",
        "tog-editsectiononrightclick": "Lupaq lõikõ toimõndaq hüäpoolidsõ klõpsutusõga lõigu päälkirä pääl",
-       "tog-rememberpassword": "Salasõna miildejätmine tulõvaidsis kõrros (kõgõ inämb $1 {{PLURAL:$1|pääväs|pääväs}})",
        "tog-watchcreations": "Panõq muq luuduq leheq ja üleslaadiduq teedüstüq muq perräkaemisnimekirjä",
        "tog-watchdefault": "Panõq perräkaemisnimekirjä muq muudõduq leheq ja teedüstüq",
        "tog-watchmoves": "Panõq muq ümbrenõstõduq leheq ja teedüstüq muq perräkaemisnimekirjä",
        "readonly_lag": "Teedüskogo panti automaatsõhe kinniq, et kõik teedüskogoserveriq saasiq kätte kõik värskiq muutmisõq",
        "internalerror": "Sisemäne viga",
        "internalerror_info": "Viga: $1",
-       "fileappenderrorread": "Teedüstüt \"$1\" saa-as manopandmisõ aol lukõq.",
-       "fileappenderror": "Teedüstüt \"$1\" saa-as manoq pandaq teedüstüle \"$2\".",
        "filecopyerror": "Es saaq teedüstüt \"$1\" teedüstüs \"$2\" kopidaq.",
        "filerenameerror": "Es saaq teedüstüt \"$1\" teedüstüs \"$2\" ümbre nimetäq.",
        "filedeleteerror": "Teedüstüt nimega \"$1\" saa-i ärq kistutaq.",
        "directorycreateerror": "Saa-s luvvaq kausta \"$1\".",
        "filenotfound": "Lövvä es teedüstüt \"$1\".",
-       "fileexistserror": "Saa-i kirotaq teedüstühe \"$1\": teedüstü om olõman",
        "unexpected": "Uutmaldaq väärtüs: \"$1\"=\"$2\".",
        "formerror": "Viga: vormi saa es pästäq",
        "badarticleerror": "Taad tallitust saa ei seo leheküle pääl tetäq.",
        "savearticle": "Pästäq",
        "preview": "Proovikaehus",
        "showpreview": "Näütäq proovikaehust",
-       "showlivepreview": "Kipõkaehus",
        "showdiff": "Näütäq muutmiisi",
        "anoneditwarning": "'''Hoiatus:''' sa olõ-i nimega sisse lännüq, seo lehe aolukku pandas su puutri aadrõs.",
        "missingsummary": "'''Miildetulõtus:'''sa olõ-i kirotanuq uma toimõndamisõ kokkovõtõt. Ku klõpsahtat viil kõrra nuppi Pästäq, sis pästetäs su toimõndus ilma kokkovõttõldaq.",
        "search-nonefound": "Perräküsümisele löüdä-äs vastust.",
        "powersearch-legend": "Laendõt otsminõ",
        "powersearch-ns": "Otsminõ nimeruumõst:",
-       "powersearch-redir": "Loeq üles ümbresaatmisõq",
        "search-external": "Väline otsminõ",
        "searchdisabled": "{{SITENAME}} otsminõ parhillaq ei tüütäq. Niikavva, ku otsminõ jälq tüüle saa, võit pruukiq otsmisõs alanolõvat Google'i otsikasti, a näide teedüs {{SITENAME}} sisust pruugi-i ollaq alasi kõgõ värskimb.",
        "preferences": "Säädmine",
        "recentchanges-label-bot": "Seo muutmisõ tekk' robot",
        "recentchanges-label-unpatrolled": "Seod muutmist olõ-õi viil üle kaet",
        "rcnotefrom": "Tan ommaq muutmisõq kuupääväst '''$2''' pääle (näüdätäs kooniq '''$1''' muutmist).",
-       "rclistfrom": "Näütäq muutmiisi kuupääväst $1 pääle",
+       "rclistfrom": "Näütäq muutmiisi kuupääväst $3 $2 pääle",
        "rcshowhideminor": "$1 väikuq parandusõq",
        "rcshowhidebots": "$1 robodiq",
        "rcshowhideliu": "$1 nimega pruukjat",
        "watchlist-details": "Perräkaemisnimekirän om {{PLURAL:$1|$1 leht|$1 lehte}}, rehkendämäldä arotuslehti.",
        "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'''",
-       "watchmethod-recent": "kontrollitas perräkaetavidõ lehti perämäidsi muutmiisi",
-       "watchmethod-list": "perräkaetavidõ lehti perämädseq muutmisõq",
-       "watchlistcontains": "Perräkaemisnimekirän om $1 {{PLURAL:$1|leht|lehte}}.",
-       "iteminvalidname": "Hädä lehega '$1'! Lehe nimen om viga.",
        "wlshowlast": "Näütäq viimädseq $1 tunni $2 päivä $3",
        "watchlist-options": "Perräkaemisnimekirä säädmine",
        "watching": "Pandas perräkaemisnimekirjä...",
        "enotif_lastvisited": "Lehel $1 ommaq kõik päält suq perämäst käümist tettüq muutmisõq.",
        "enotif_lastdiff": "Taa muutusõ nägemises kaeq: $1.",
        "enotif_anon_editor": "nimeldä pruukja $1",
-       "enotif_body": "Hüä $WATCHINGUSERNAME,\n\n{{SITENAME}} lehte $PAGETITLE $CHANGEDORCREATED $PAGEEDITDATE $PAGEEDITOR, parhillast kujjo kaeq $PAGETITLE_URL.\n\n$NEWPAGE\n\nMuutja kokkovõtõq: $PAGESUMMARY $PAGEMINOREDIT\n\nKirodaq muutjalõ:\ne-post: $PAGEEDITOR_EMAIL\nviki: $PAGEEDITOR_WIKI\n\nInämb seo lehe kotsilõ teedäqandmiisi saadõta-i. Võit ka kõik su perräkaetavidõ lehti muutmisõ kuulutusõq ärq keeldäq.\n\n{{SITENAME}} teedäqandmiskõrraldus\n\nPerräkaemisnimekirä säädmiisi saat muutaq lehe pääl: {{canonicalurl:Special:Watchlist/edit}}\n\nAs'a kotsilõ mano kaiaq ja küssü saat lehe päält: {{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Hüä $WATCHINGUSERNAME,\n\n{{SITENAME}} lehte $PAGETITLE $CHANGEDORCREATED $PAGEEDITDATE $PAGEEDITOR, parhillast kujjo kaeq $PAGETITLE_URL.\n\n$NEWPAGE\n\nMuutja kokkovõtõq: $PAGESUMMARY $PAGEMINOREDIT\n\nKirodaq muutjalõ:\ne-post: $PAGEEDITOR_EMAIL\nviki: $PAGEEDITOR_WIKI\n\nInämb seo lehe kotsilõ teedäqandmiisi saadõta-i. Võit ka kõik su perräkaetavidõ lehti muutmisõ kuulutusõq ärq keeldäq.\n\n{{SITENAME}} teedäqandmiskõrraldus\n\nPerräkaemisnimekirä säädmiisi saat muutaq lehe pääl: {{canonicalurl:Special:Watchlist/edit}}\n\nAs'a kotsilõ mano kaiaq ja küssü saat lehe päält: $HELPPAGE",
        "created": "lehe loonuq",
        "changed": "lehte muutnuq",
        "deletepage": "Kistudaq lehekülg ärq",
        "whatlinkshere-filters": "Sõglaq",
        "blockip": "Piäq puutri võrgoaadrõs kinniq",
        "blockiptext": "Taa vorm om kimmä puutri võrgoaadrõsi päält tettüisi kirotuisi kinniqpidämises. '''Taad tohis tetäq õnnõ lehti ts'urkmisõ vasta ni [[{{MediaWiki:Policy-url}}|{{SITENAME}} sisekõrra perrä]]'''. Kimmähe tulõ täütäq ka rida \"põhjus\". Sinnäq võinuq pandaq nt lingiq noilõ lehile, midä rikuti.",
-       "ipadressorusername": "Puutri võrgoaadrõs vai pruukjanimi",
+       "ipaddressorusername": "Puutri võrgoaadrõs vai pruukjanimi",
        "ipbexpiry": "Tähtaig",
        "ipbreason": "Põhjus:",
        "ipbreason-dropdown": "*Hariliguq kinniqpidämise põhjusõq\n** Võlss teedüse kirotaminõ\n** Lehti sisu ärqkistutaminõ\n** Reklaamilinkõ pandminõ\n** Mõttõlda jutu vai prahi pandminõ\n** Segämine ja ts'urkminõ\n** Mitmõ pruukjanime võlsspruukminõ\n** Sündümäldäq pruukjanimi",
        "monobook.css": "/* Taa lehe pääl om Monobook-vällänägemist muutvit kujonduisi. */",
        "common.js": "/* Taa lehe kuud pandas mano egäle lehelaatmisõlõ */",
        "monobook.js": "/* Olõi soovitõt; pruugiq [[MediaWiki:common.js]] */",
-       "notacceptable": "Wikiserver saa-i näüdädäq teedüst sääntsen moodun, midä su programm saasiq lukõq.",
        "anonymous": "{{SITENAME}} {{PLURAL:$1|nimeldä pruukja|nimeldä pruukjaq}}",
        "siteuser": "{{SITENAME}} pruukja $1",
        "lastmodifiedatby": "Taad lehte toimõnd' viimäte ”$3” $2 kell $1.",
        "show-big-image": "Algteedüstü",
        "newimages": "Vahtsõq pildiq",
        "imagelisttext": "Pilte nimekirän $1 (sordiduq $2).",
-       "showhidebots": "($1 robodiq)",
        "noimages": "Olõ-i vahtsit pilte.",
        "ilsubmit": "Otsminõ",
        "bydate": "kuupäävä perrä",
        "autosumm-replace": "Asõmalõ panti '$1'",
        "autoredircomment": "Ümbresaatminõ lehele [[$1]]",
        "autosumm-new": "Vahtsõnõ leht: $1",
-       "livepreview-loading": "Laat…",
-       "livepreview-ready": "Laat… Valmis!",
-       "livepreview-failed": "Kipõkaehus lää-s käümä!\nProoviq harilikku kaehust.",
-       "livepreview-error": "Ütistämine lää-s kõrda: $1 \"$2\"\nProoviq harilikku kaehust.",
        "lag-warn-normal": "Muutmiisi, miä ommaq vahtsõmbaq ku $1 sekundit, pruugi-i taan nimekirän nätäq ollaq.",
        "lag-warn-high": "Teedüskogoserveri aiglusõ peräst pruugi-i $1 sekundist värskimbit muutmiisi nimekirän nätäq ollaq.",
-       "watchlistedit-numitems": "Su perräkaemisnimekirän om {{PLURAL:$1|1 päälkiri|$1 päälkirjä}}, arotusleheq vällä arvaduq.",
-       "watchlistedit-noitems": "Perräkaemisnimekirän olõ-i üttegi päälkirjä.",
        "watchlistedit-normal-title": "Toimõndaq perräkaemisnimekirjä",
        "watchlistedit-normal-legend": "Kistudaq päälkiräq perräkaemisnimekiräst ärq",
        "watchlistedit-normal-submit": "Kistudaq päälkiräq ärq",
index 489f860..13ea5e4 100644 (file)
@@ -4,7 +4,8 @@
                        "Lucyin",
                        "Srtxg",
                        "Urhixidur",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Sorlignî les loyéns:",
@@ -17,7 +18,6 @@
        "tog-showtoolbar": "Mostrer l' bår d' usteyes e môde candjmint (JavaScript)",
        "tog-editondblclick": "Candjî les pådjes avou on dobe-clitch (JavaScript)",
        "tog-editsectiononrightclick": "Candjî les seccions avou on dobe-clitch sol tite (JavaScript)",
-       "tog-rememberpassword": "Rimimbrer m' sicret inte les sessions (nén dpus ki po $1 {{PLURAL:$1|djoû|djoûs}})",
        "tog-watchcreations": "Mete les pådjes ki dj' askepeye dins l' djivêye des pådjes shuvowes",
        "tog-watchdefault": "Shuve les årtikes ki dj' fwai ou ki dj' candje",
        "tog-watchmoves": "Radjouter a m' djivêye des shuvous les pådjes ki dji displaece",
        "savearticle": "Schaper l' pådje",
        "preview": "Vey divant",
        "showpreview": "Vey divant",
-       "showlivepreview": "Vey divant",
        "showdiff": "Vey les candjmints",
        "anoneditwarning": "'''Asteme:''' Vos n' estoz nén elodjî.\nVoste adresse IP serè rashiowe dins l' istwere di cisse pådje ci.",
        "anonpreviewwarning": "''Vos n' estoz nén elodjî. Si vos schapez c' est voste adresse IP ki serè wårdêye dins l' istwere des candjmints.''",
        "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:",
-       "powersearch-redir": "Håyner les rdjiblaedjes",
        "powersearch-togglelabel": "Tchoezi:",
        "powersearch-toggleall": "Totafwait",
        "powersearch-togglenone": "Disclitchî tot",
        "prefs-advancedsearchoptions": "Sipepieuzès tchuzes",
        "prefs-advancedwatchlist": "Sipepieuzès tchuzes",
        "prefs-displayrc": "Tchuzes di håynaedje",
-       "prefs-displaysearchoptions": "Tchuzes di håynaedje",
        "prefs-displaywatchlist": "Tchuzes di håynaedje",
        "prefs-diffs": "Diferinces",
        "email-address-validity-valid": "L' adresse emile a l' air d' esse valide",
        "recentchanges-label-bot": "Ci candjmint la a stî fwait pa on robot",
        "recentchanges-label-unpatrolled": "Ci candjmint la n' a nén co stî patrouyî",
        "rcnotefrom": "Chal pa dzo les candjmints dispoy li '''$2''' (disk' a '''$1''' di mostrés).",
-       "rclistfrom": "Mostrer les candjmints k' i gn a yeu a pårti do $1",
+       "rclistfrom": "Mostrer les candjmints k' i gn a yeu a pårti do $3 $2",
        "rcshowhideminor": "$1 candjmints mineurs",
        "rcshowhidebots": "$1 robots",
        "rcshowhideliu": "$1 uzeus eredjîstrés",
        "watchlist-details": "Vos avoz {{PLURAL:$1|$1 pådje shuvowe|$1 pådjes shuvowes}} (sins conter les pådjes di copene).",
        "wlheader-enotif": "Li notifiaedje pa emile est en alaedje.",
        "wlheader-showupdated": "Les pådjes k' ont candjî dispoy vosse dierinne vizite sont metowes e '''cråssès letes'''",
-       "watchmethod-recent": "Cwerant après les pådjes k' ont stî candjeyes dierinnmint ki sont eto des pådjes shuvowes",
-       "watchmethod-list": "Cwerant après les pådjes shuvowes k' ont stî candjeyes dierinnmint",
-       "watchlistcontains": "I gn a {{PLURAL:$1|$1 pådje|$1 pådjes}} e vosse djivêye des pådjes a shuve.",
-       "iteminvalidname": "Åk n' a nén stî avou «$1», li no n' est nén valide...",
        "wlshowlast": "Mostrer les dierin(nè)s $1 eures, $2 djoûs ou $3",
        "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.",
-       "enotif_body": "Binamé $WATCHINGUSERNAME,\n\nLi pådje «$PAGETITLE» so {{SITENAME}} a stî $CHANGEDORCREATED li $PAGEEDITDATE pa $PAGEEDITOR,\nloukîz $PAGETITLE_URL pol modêye do moumint.\n\n$NEWPAGE\n\nComintaire do candjeu: $PAGESUMMARY $PAGEMINOREDIT\n\nContak do candjeu:\nemile: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nI n' årè nén d' ôtes notifiaedjes po ds ôtes candjmints di ç' minme pådje ci tant k' vos n' l' åroz nén vizitêye.\nVos ploz eto rimete a noû les drapeas di notifiaedje po totes les pådjes di vosse djivêye des pådjes a shuve.\n\n\nVosse binamé sistinme di notifiaedje so {{SITENAME}}\n\n--\nPo candjî l' apontiaedje di vos notifiaedjes pa emile, loukîz\n{{canonicalurl:{{#special:Preferences}}}}\n\nPo candjî l' apontiaedje di vosse djivêye a shuve, loukîz\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPo rsaetchî l' pådje di vosse djivêye a shuve, alez so\n$UNWATCHURL\n\nPo pus d' aidance:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Binamé $WATCHINGUSERNAME,\n\nLi pådje «$PAGETITLE» so {{SITENAME}} a stî $CHANGEDORCREATED li $PAGEEDITDATE pa $PAGEEDITOR,\nloukîz $PAGETITLE_URL pol modêye do moumint.\n\n$NEWPAGE\n\nComintaire do candjeu: $PAGESUMMARY $PAGEMINOREDIT\n\nContak do candjeu:\nemile: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nI n' årè nén d' ôtes notifiaedjes po ds ôtes candjmints di ç' minme pådje ci tant k' vos n' l' åroz nén vizitêye.\nVos ploz eto rimete a noû les drapeas di notifiaedje po totes les pådjes di vosse djivêye des pådjes a shuve.\n\n\nVosse binamé sistinme di notifiaedje so {{SITENAME}}\n\n--\nPo candjî l' apontiaedje di vos notifiaedjes pa emile, loukîz\n{{canonicalurl:{{#special:Preferences}}}}\n\nPo candjî l' apontiaedje di vosse djivêye a shuve, loukîz\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPo rsaetchî l' pådje di vosse djivêye a shuve, alez so\n$UNWATCHURL\n\nPo pus d' aidance:\n$HELPPAGE",
        "created": "ahivêye",
        "changed": "candjeye",
        "deletepage": "Disfacer l' pådje",
        "autoblockid": "Blocaedje otomatike #$1",
        "blockip": "Bloker èn uzeu",
        "blockiptext": "Rimplixhoz les tchamps chal pa dzo po bloker\nl' accès e scrijhaedje d' èn uzeu dné ou a pårt d' ene\nadresse IP dnêye. Çouci èn doet esse fwait ki po-z arester les\nvandales, et çoula doet esse fwait tot shuvant les\n[[{{MediaWiki:Policy-url}}|rîles]].\nDinez ene råjhon do blocaedje (eg: dijhoz les pådjes k' ont\nstî vandalijheyes).",
-       "ipadressorusername": "Adresse IP ou no d' uzeu",
+       "ipaddressorusername": "Adresse IP ou no d' uzeu",
        "ipbexpiry": "Tins do blocaedje",
        "ipbreason": "Råjhon:",
        "ipbsubmit": "Bloker cist uzeu",
        "tooltip-summary": "Dinez on ptit rascourti",
        "common.css": "/* li côde CSS metou chal serè eployî pa totes les peas et tos les uzeus */",
        "monobook.css": "/* li côde CSS metou chal serè eployî pa tos les uzeus eployant l' pea «monobook» */",
-       "notacceptable": "Li sierveu wiki èn vos pout nén dner les dnêyes dins ene cogne ki vosse cliyint sait lére.",
        "anonymous": "{{PLURAL:$1|Uzeu anonime|Uzeus anonimes}} di {{SITENAME}}",
        "siteuser": "$1, {{GENDER:$2|uzeu d'|uzeuse di}} {{SITENAME}}",
        "anonuser": "$1, uzeu anonime di {{SITENAME}}",
        "show-big-image": "Imådje a si grandeur d' oridjinne",
        "newimages": "Galreye des nouvès imådjes",
        "imagelisttext": "Chal pa dzo c' est ene djivêye di '''$1''' {{PLURAL:$1|imådje relîte|imådjes relîtes}} $2.",
-       "showhidebots": "($1 robots)",
        "noimages": "I n' a rén a vey.",
        "ilsubmit": "Cweri",
        "bydate": "pazès dates",
        "size-kilobytes": "$1 Ko",
        "size-megabytes": "$1 Mo",
        "size-gigabytes": "$1 Go",
-       "livepreview-loading": "Tcherdjant...",
        "watchlistedit-raw-titles": "Tites:",
        "watchlisttools-edit": "Vey et candjî l' djivêye des shuvous",
        "version": "Modêye des programes",
index 9d39d40..b8df457 100644 (file)
@@ -7,7 +7,8 @@
                        "Kaganer",
                        "Wiki indio",
                        "לערי ריינהארט",
-                       "Kolega2357"
+                       "Kolega2357",
+                       "아라"
                ]
        },
        "tog-underline": "Bagisa ha ilarom an mga sumpay:",
@@ -20,7 +21,6 @@
        "tog-showtoolbar": "Igpakita an edit toolbar",
        "tog-editondblclick": "Igliwat in mga pakli ha doble nga klik",
        "tog-editsectiononrightclick": "Tugoti in pagliwat hin seksyon ha pag klik-ha-tuo dida hin mga ngaran o titulo hin seksyon",
-       "tog-rememberpassword": "Hinumdomi an akon pan-sakob dinhi nga browser (para hin maximum nga $1 {{PLURAL:$1|nga adlaw|nga mga adlaw}})",
        "tog-watchcreations": "Igdugang in mga pakli nga akon ginhimo ngan mga paypay nga akon ginkarga ngadto han akon angay timan-an",
        "tog-watchdefault": "Igdugang in mga pakli ngan mga paypay nga akon ginliwat ngadto han akon angay timan-an",
        "tog-watchmoves": "Igdugang in mga pakli nga mga paypay nga akon ginpamalhin ngadto han akon angay timan-an",
        "readonly_lag": "Ginlugaring pagtranka han database samtang an mga nasunod nga mga database nga server naglalanat pa han agaron",
        "internalerror": "Sayop ha sulod",
        "internalerror_info": "Sayop ha sulod: $1",
-       "fileappenderrorread": "Diri nababasahan an ''$1'' han pagdugang.",
-       "fileappenderror": "Diri nadudugngan an ''$1'' ha ''$2''.",
        "filecopyerror": "Diri nakokopya an paypay nga ''$1'' ha ''$2''.",
        "filerenameerror": "Diri nababalyuan an ngaran han paypay nga ''$1'' ha ''$2''.",
        "filedeleteerror": "Diri napapara an paypay nga ''$1''.",
        "directorycreateerror": "Waray makahimo han direktoryo nga \"$1\".",
        "filenotfound": "Diri nabibilngan an paypay nga \"$1\"",
-       "fileexistserror": "Diri nasusuratan ha paypay nga ''$1'': Aada na an paypay.",
        "unexpected": "Diri ginlalauman nga balor: \"$1\"=\"$2\".",
        "formerror": "Sayop: Diri nasusumite an porma.",
        "badarticleerror": "Ini nga pagbuhat diri mahihimo dinhi nga pakli",
        "userlogin-resetpassword-link": "¿Nangalimot ka han imo tigaman-pansulod?",
        "userlogin-loggedin": "Nakalog-in kana komo hi {{GENDER:$1|$1}}.\nGamiti an porma ha ubos para makalog-in komo iba nga gumaramit.",
        "userlogin-createanother": "Paghimo hin iba nga akawnt",
-       "createacct-join": "Igbutang an imo impormasyon ha ubos.",
-       "createacct-another-join": "Igbutang an impormasyon han bag-o nga akwant ha ilarom.",
        "createacct-emailrequired": "Email address",
        "createacct-emailoptional": "Email address (opsyonal)",
        "createacct-email-ph": "Igbutang an imo email address",
        "savearticle": "Igtipig an pakli",
        "preview": "Pahiuna nga pagawas",
        "showpreview": "Pakit-a an pahiuna nga pagawas",
-       "showlivepreview": "Buhi nga pahiuna nga pagawas",
        "showdiff": "Igpakita an mga ginliwat",
        "anoneditwarning": "'''Pahimatngon:''' Diri ka pa naka log-in.\nAn imo IP address in maitatala ha kaagi hinin pakli han pagliwat.",
        "anonpreviewwarning": "''Diri ka naka-log in.  Mahisusurat an imo IP address ngada ha kanan pakli kaagi hit pagliwat kun igtipig nimo.''",
        "search-nonefound": "Waray resulta an nakakabaton han pakiana.",
        "powersearch-legend": "Abansado nga pagbiling",
        "powersearch-ns": "Pamiling ha mga ngaran-lat'ang:",
-       "powersearch-redir": "Talaan hin mga redirect",
        "powersearch-togglelabel": "Panginano-a:",
        "powersearch-toggleall": "Ngatanan",
        "powersearch-togglenone": "Waray",
        "prefs-advancedsearchoptions": "Abansado nga mga pagpipilian",
        "prefs-advancedwatchlist": "Abansado nga mga pagpipilian",
        "prefs-displayrc": "Mga pirilion hiunong han ginpapakita",
-       "prefs-displaysearchoptions": "Mga pirilion hiunong han ginpapakita",
        "prefs-displaywatchlist": "Mga pirilion hiunong han ginpapakita",
        "prefs-tokenwatchlist": "Token",
        "prefs-diffs": "Mga kaibhan",
        "recentchanges-label-bot": "Ini nga pagliwat in ginbuhat han bot",
        "recentchanges-label-unpatrolled": "Ini nga pagliwat in diri pa nakapatrol",
        "rcnotefrom": "An ha ubos in mga pagbabag-o tikanng '''$''' (kutob ngadto ha '''$1''' nga ginpakita).",
-       "rclistfrom": "Pakit-a an mga ginbag-ohan tikang han $1",
+       "rclistfrom": "Pakit-a an mga ginbag-ohan tikang han $3 $2",
        "rcshowhideminor": "$1 gudti nga mga pagliwat",
        "rcshowhidebots": "$1 mga bot",
        "rcshowhideliu": "$1 an mga rehistrado nga gumaramit",
        "size-kilobytes": "$1 nga KB",
        "size-megabytes": "$1 nga MB",
        "size-gigabytes": "$1 nga GB",
-       "livepreview-loading": "Ginkakarga. . .",
-       "livepreview-ready": "Ginkakarga. . . Pag-andam!",
-       "watchlistedit-numitems": "An imo talaan hin binabantayan hin may sulod nga {{PLURAL:$1|1 ka titulo|$1 ka mga titulo}}, diri lakip an mga pakli nga hiruhimangraw.",
-       "watchlistedit-noitems": "An imo talaan han binabantayan in waray sulod nga mga titulo.",
        "watchlistedit-normal-title": "Igliwat an talaan han binabantayan",
        "watchlistedit-normal-legend": "Igtanggal an mga titulo tikang ha talaan hit binabantayan",
        "watchlistedit-normal-submit": "Igtanggal an mga titulo",
        "compare-rev1": "Pagliwat 1",
        "compare-rev2": "Pagliwat 2",
        "compare-submit": "Igkumpara",
-       "dberr-header": "Ini nga wiki mayda problema",
        "dberr-problems": "Pasayloi! Ini nga sityo in nageeksperyensya hin mga pagkuri teknikal.",
        "htmlform-submit": "Isumite",
        "htmlform-reset": "Igbalik an mga pinamalyuan",
index 88b9da1..74e59c4 100644 (file)
@@ -6,7 +6,8 @@
                        "Maax",
                        "Reedy",
                        "SF-Language",
-                       "Urhixidur"
+                       "Urhixidur",
+                       "아라"
                ]
        },
        "tog-underline": "Rëddaatu lëkkalekaay yi :",
@@ -19,7 +20,6 @@
        "tog-showtoolbar": "Wone bànqaasu njëlu coppite bi (JavaScript)",
        "tog-editondblclick": "Cuq cuqaatal ngir soppi aw xët (JavaScript)",
        "tog-editsectiononrightclick": "Soppi ab xaaj cib cuqub ndeyjoor ci kojam  (JavaScript)",
-       "tog-rememberpassword": "Fattalikul sama baatujàll  (for a maximum of $1 {{PLURAL:$1|day|days}})",
        "tog-watchcreations": "Yokk ci sama limu toppte xët yi may sos",
        "tog-watchdefault": "Yokk ci sama limu toppte xët yi may soppi",
        "tog-watchmoves": "Yokk ci sama limu toppte xët yi may tuddaat",
        "readonly_lag": "Dàttub njoxe bi daa caabi boppam ngir may ñaareelu joxekaay yi dap joxekaay bu njëkk bi.",
        "internalerror": "Njuumte gu biir",
        "internalerror_info": "Njuumte gu biir : $1",
-       "fileappenderror": "Maneesul a yokk \"$1\" ci \"$2\".",
        "filecopyerror": "Duppig dencukaay bii di « $1 » jëm « $2 » antuwul.",
        "filerenameerror": "Tuddewaatug « $1 » niki « $2 » antuwul.",
        "filedeleteerror": "Farug dencukaay bii di « $1 » antuwul.",
        "directorycreateerror": "Sosug wayndare bii di « $1 » antuwul.",
        "filenotfound": "Gisug dencukaay bii di « $1 » antuwul.",
-       "fileexistserror": "Mbind mi ci wii wayndare « $1 » antuwul : dencukaay bi am na ba noppi",
        "formerror": "Tolof-tolof:Maneesu la yonnee mbind mi",
        "badarticleerror": "Jii jëf defuwul ci wii xët.",
        "cannotdelete": "Farug xët walla dencukaay bi antuwul. (xayna  keneen def na ko ba noppi.)",
        "savearticle": "Wattu xët wi",
        "preview": "Wonendi",
        "showpreview": "Wonendi",
-       "showlivepreview": "Wonendi gu gaaw",
        "showdiff": "Wone samay soppi",
        "anoneditwarning": "'''Moytul :''' Duggoo. Sa màkkaanub IP di nañu ko dugal ci jaar-jaaru xët wii.",
        "missingsummary": "'''Fattali :''' Defoo ab tënk ci coppite yi nga amal. Soo cuqaate ci «Denc xët wi», say coppite di nañ dugg te duñ am tënk, maanaam duñ xam loo soppi.",
        "search-nonefound": "Ceet gi jurul dara.",
        "powersearch-legend": "Ceet gu xóot",
        "powersearch-ns": "Seet ci barabi tur yi :",
-       "powersearch-redir": "Limu jubluwaat yi",
        "powersearch-togglelabel": "Fal:",
        "powersearch-toggleall": "Yépp",
        "powersearch-togglenone": "Dara",
        "recentchanges-label-unpatrolled": "Coppite bii kenn fugloogu ko",
        "recentchanges-legend-newpage": "$1 - xët wu bees",
        "rcnotefrom": "Yii ñooy coppite yi dalee '''$2''' (ba '''$1''').",
-       "rclistfrom": "Wone coppite yi mujj yi dooree $1.",
+       "rclistfrom": "Wone coppite yi mujj yi dooree $3 $2",
        "rcshowhideminor": "$1 Coppite yu néewal",
        "rcshowhidebots": "$1 bot yi",
        "rcshowhideliu": "$1 jëfandikukat yu bindu",
        "unwatchthispage": "Bul toppati",
        "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>",
-       "watchmethod-recent": "saytug coppite yu mujj yu xët yi ngay topp",
-       "watchmethod-list": "saytug xët yi ñuy topp ngir ay coppite yu mujj",
-       "watchlistcontains": "Sa limu toppte am na '''$1''' {{PLURAL:$1|xët|xët}}.",
-       "iteminvalidname": "Ay jafe-jafe ak xët wii di « $1 » : tur bi baaxul.",
        "wlshowlast": "wone $1 waxtu yu mujj, $2 bess yu mujj, walla $3.",
        "watchlist-options": "Tànneefi limu toppte bi",
        "watching": "Topp...",
        "cologneblue.js": "/* Bépp JavaScript buñ fi duggal jëfandikukat yiy jëfandikoo col gu Cologne Blue keppa koy yeb */",
        "monobook.js": "/*Bépp JavaScript buñ fi duggal jëfandikukat yiy jëfandikoo col gu Monobook keppa koy yeb. */",
        "modern.js": "/* Bépp JavaScript buñ fi duggal jëfandikukat yiy jëfandikoo col gu Modern keppa koy yeb */",
-       "notacceptable": "Bii joxekaay bu wiki manuta jébbal ay njoxe cib kem bu sa client mana jàng.",
        "anonymous": "Benn walla ay jëfandikukat yu binduwul yu {{SITENAME}}",
        "siteuser": "$1, Jëfandikukatu {{SITENAME}}",
        "lastmodifiedatby": "$3 moo mujje soppi xët wi ci $1, ci $2.",
        "pipe-separator": "&#32;•&#32;",
        "autoredircomment": "Jubluwaat fii [[$1]]",
        "autosumm-new": "Xët wu bees : $1",
-       "watchlistedit-numitems": "Sa xëtu toppte am na {{PLURAL:$1|aw xët|$1 ciy xët}}, soo ci gennee xëtu waxtaanukaay yi",
-       "watchlistedit-noitems": "Sa limu toppte amul benn xët.",
        "watchlistedit-normal-title": "Coppiteg xëtu toppte gi",
        "watchlistedit-normal-legend": "Dindi ay xët yi limu toppte gi",
        "watchlistedit-normal-explain": "xët yu sa limu toppte ñooy gisu fii ci suuf.\nNgir dindi am xët (ak xëtu waxtaanukaayam) ci lim gi, kligal ci néeg moomu ci wetam te nga klig ci suuf.\nMan nga tamit  [[Special:EditWatchlist/raw|soppi ko]].",
index 6bb3170..e0b3a91 100644 (file)
@@ -9,7 +9,8 @@
                        "Xiaomingyan",
                        "Yfdyh000",
                        "乌拉跨氪",
-                       "十弌"
+                       "十弌",
+                       "아라"
                ]
        },
        "tog-underline": "鏈接下橫線:",
        "readonly_lag": "从数据库服务器垃拉从主服务器上更新,数据库已经拨自动锁定",
        "internalerror": "内部错误",
        "internalerror_info": "内部错误:$1",
-       "fileappenderrorread": "当附加时无法读取\"$1\"。",
-       "fileappenderror": "“$1”附加到“$2”弗来三。",
        "filecopyerror": "弗好拿文件“$1”复制到“$2”。",
        "filerenameerror": "拿文件“$1”重命名为“$2”失败。",
        "filedeleteerror": "弗好删除文件“$1”。",
        "directorycreateerror": "创建目录“$1”失败。",
        "filenotfound": "寻弗着文件 \"$1\"。",
-       "fileexistserror": "弗好写入文件“$1”:文件已存在",
        "unexpected": "非正常值:“$1”=“$2”。",
        "formerror": "错误:提交表单失败",
        "badarticleerror": "呒处垃拉箇只页面进行箇只操作。",
        "userlogin-resetpassword-link": "转设密码",
        "userlogin-loggedin": "你侬用{{GENDER:$1|$1}}登进来哉。用下向个表以别样身份登进。",
        "userlogin-createanother": "建别样账号",
-       "createacct-join": "下向打进你侬个信息。",
-       "createacct-another-join": "下向打进新账号个信息。",
        "createacct-emailrequired": "电子信地址",
        "createacct-emailoptional": "电子信地址(填弗填由你)",
        "createacct-email-ph": "畀你侬个电子信地址打进去",
        "savearticle": "保存页面",
        "preview": "望望相",
        "showpreview": "显示望望相",
-       "showlivepreview": "实时预览",
        "showdiff": "显示变化",
        "anoneditwarning": "'''警告:''' 你侬朆登进来。\n你侬个IP地址会记进箇页个编史里。",
        "anonpreviewwarning": "''侬弗曾登录。侬个IP位址会得记录拉此页个编辑历史里向。''",
        "search-nonefound": "查询呒有结果。",
        "powersearch-legend": "高级搜索",
        "powersearch-ns": "垃拉箇眼名字空间里向搜索:",
-       "powersearch-redir": "重定向列表",
        "powersearch-togglelabel": "选择:",
        "powersearch-toggleall": "全选",
        "powersearch-togglenone": "侪弗选",
        "recentchanges-feed-description": "跟踪此订阅垃拉 wiki 高头个最近更改。",
        "recentchanges-label-newpage": "建新页来编",
        "recentchanges-label-minor": "箇是小编写",
-       "rclistfrom": "显示 $1 以来个新改动",
+       "rclistfrom": "显示 $3 $2 以来个新改动",
        "rcshowhideminor": "$1小编写",
        "rcshowhidebots": "$1机器人",
        "rcshowhideliu": "$1登录个用户",
        "unwatchthispage": "停止监控",
        "notanarticle": "弗是內容頁",
        "watchlist-details": "弗包括讨论页,有 $1 页徕你侬关注表里向。",
-       "watchlistcontains": "倷个监控列表包括{{PLURAL:$1|1|$1}}只页面。",
        "wlshowlast": "显示上 $1 个钟头 $2 日 $3",
        "watchlist-options": "监控列表选项",
        "watching": "监控……",
index c06e3dc..0cd9595 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Huuchin",
                        "ОйЛ",
-                       "לערי ריינהארט"
+                       "לערי ריינהארט",
+                       "아라"
                ]
        },
        "tog-underline": "Заалһиг татас татх:",
@@ -16,7 +17,6 @@
        "tog-showtoolbar": "Ора зер-зев үзлх (JavaScript кергтә)",
        "tog-editondblclick": "Давхр индстлһар чиклх (JavaScript кергтә)",
        "tog-editsectiononrightclick": "Һарчига барун индстлһар хүвиг чиклх (JavaScript кергтә)",
-       "tog-rememberpassword": "Намаг эн тоолдврт тодлх ($1 {{PLURAL:$1|1=өдрт|өдрмүдт}} икәр биш)",
        "tog-watchcreations": "Би эврәннь немгдсн халхс шинҗллһнә сеткүлд немх",
        "tog-watchdefault": "Би эврәннь чиклсн халхс шинҗллһнә сеткүлд немх",
        "tog-watchmoves": "Би эврәннь көндсн халхс шинҗллһнә сеткүлд немх",
        "searchall": "цуг",
        "powersearch-legend": "Күчн хәәлһн",
        "powersearch-ns": "Эн нернә у дотран хәәх:",
-       "powersearch-redir": "Авч одлһуд үзүлх",
        "powersearch-togglenone": "Уга",
        "preferences": "Дурллһн",
        "mypreferences": "Көгүд",
        "recentchanges-label-minor": "Эн баһ чинртә сольлһн",
        "recentchanges-label-bot": "Эн сольлһн көдлвр (робот) кехв",
        "recentchanges-legend-newpage": "$1 — шин халх",
-       "rclistfrom": "Тер цагас авн сольлһн үзүлх: $1.",
+       "rclistfrom": "Тер цагас авн сольлһн үзүлх: $3 $2.",
        "rcshowhideminor": "баһ чикллһиг $1",
        "rcshowhidebots": "көдлврүдиг $1",
        "rcshowhideliu": "демнчнриг $1",
        "watchlist-options": "Шинҗллһнә сеткүлин көгүд",
        "watching": "Шинҗллһнә бүтлклд немлһн...",
        "unwatching": "Шинҗлһнә бүрткләс һарһлһн...",
-       "enotif_body": "Мендвт, күндтә $WATCHINGUSERNAME,\n\n$PAGEEDITDATE цагт {{SITENAME}} төсвин $PAGETITLE халхиг $PAGEEDITOR $CHANGEDORCREATED. Ода болсн халхна янз үзҗ седхлә, $PAGETITLE_URL хәләтн.\n\n$NEWPAGE\n\nСольлһнә учр-утх: $PAGESUMMARY $PAGEMINOREDIT\n\nСольлчд бичг йовуллһн:\ne-mail'ар $PAGEEDITOR_EMAIL\nбикиһәр $PAGEEDITOR_WIKI\n\nЭн халх орхла биш, терүнә дәкәд сольлһн болхла, медүллһн бәәх уга. Тааһар шинҗлсн халхс сольлһна туск медүллһн унтраҗ чаднат.\n\n             {{grammar:genitive|{{SITENAME}}}} зәңгллһнә церглт\n\n--\nТана шинҗллһнә сеткүлин көгүдиг сольҗ седхлә, эниг дахтн:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nХәрү холва болн тус:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "Мендвт, күндтә $WATCHINGUSERNAME,\n\n$PAGEEDITDATE цагт {{SITENAME}} төсвин $PAGETITLE халхиг $PAGEEDITOR $CHANGEDORCREATED. Ода болсн халхна янз үзҗ седхлә, $PAGETITLE_URL хәләтн.\n\n$NEWPAGE\n\nСольлһнә учр-утх: $PAGESUMMARY $PAGEMINOREDIT\n\nСольлчд бичг йовуллһн:\ne-mail'ар $PAGEEDITOR_EMAIL\nбикиһәр $PAGEEDITOR_WIKI\n\nЭн халх орхла биш, терүнә дәкәд сольлһн болхла, медүллһн бәәх уга. Тааһар шинҗлсн халхс сольлһна туск медүллһн унтраҗ чаднат.\n\n             {{grammar:genitive|{{SITENAME}}}} зәңгллһнә церглт\n\n--\nТана шинҗллһнә сеткүлин көгүдиг сольҗ седхлә, эниг дахтн:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nХәрү холва болн тус:\n$HELPPAGE",
        "created": "бүтәв",
        "changed": "сольв",
        "deletepage": "Эн халхиг һарһҗ",
        "whatlinkshere-hidelinks": "заалһудиг $1",
        "whatlinkshere-filters": "Шүрс",
        "blockip": "Демнчиг бүслх",
-       "ipadressorusername": "IP хайг аль демнчна нернь:",
+       "ipaddressorusername": "IP хайг аль демнчна нернь:",
        "ipbreason": "Учр:",
        "ipboptions": "2 часуд:2 hours,1 өдр:1 day,3 өдрмүд:3 days,1 долан хонг:1 week,2 долан хонгуд:2 weeks,1 сар:1 month,3 сармуд:3 months,6 сармуд:6 months,1 җил:1 year,мөнк:infinite",
        "ipblocklist": "Бүслсн болн демнчнр",
        "table_pager_empty": "Ашнь уга",
        "autosumm-blank": "Халх цеврүлв",
        "autosumm-new": "Шин халх: «$1»",
-       "livepreview-loading": "Белднә...",
-       "livepreview-ready": "Белднә... Болһсн!",
-       "watchlistedit-numitems": "Тана шинҗллһнә сеткүл {{PLURAL:$1|1=1 гешүтә|$1 гешүдтә}}, меткән халхста.",
-       "watchlistedit-noitems": "Тана шинҗллһнә сеткүл хоосн бәәнә.",
        "watchlistedit-normal-title": "Шинҗллһнә сеткүлиг чиклх",
        "watchlisttools-view": "Бүртклин халхна сольлһн",
        "watchlisttools-edit": "Сеткүлиг хәләх аль чиклх",
index fa22e76..ecf364b 100644 (file)
@@ -11,7 +11,8 @@
                        "Machirkholi",
                        "Malafaya",
                        "Reedy",
-                       "გიორგიმელა"
+                       "გიორგიმელა",
+                       "아라"
                ]
        },
        "tog-underline": "რცხუეფიშ ათოღაზუა:",
        "search-nonefound": "თქვანი მოგორაფილიშ მუთუნნერ მანგი მოღალუქ ვეძირჷ.",
        "powersearch-legend": "გოძინელ გორუა",
        "powersearch-ns": "დოგორ ჯოხოეფიშ ოფირჩას:",
-       "powersearch-redir": "გინოწურაფეფიშ ერკებულიშ ძირაფა",
        "preferences": "კონფიგურაცია",
        "mypreferences": "ჩქიმ კონფიგურაციეფი",
        "youremail": "ელ-ფოშტა:",
        "recentchanges-label-bot": "თე რედაქტირაფა ბოტიშ ნაღოლემი რე",
        "recentchanges-label-unpatrolled": "თე რედაქტირაფა დიო ხოლო ვა რე პატრულირაფირი",
        "rcnotefrom": "თუდო მოჸუნაფილიე თირაფეფ, ”’$2””-შე (ძირაფილიე ”’$1”’)",
-       "rclistfrom": "ახალ თირაფეფიშ ძირაფა დოჭყაფილ $1-შე",
+       "rclistfrom": "ახალ თირაფეფიშ ძირაფა დოჭყაფილ $3 $2-შე",
        "rcshowhideminor": "$1 ჭიჭე რედაქტირაფეფ",
        "rcshowhidebots": "ბოტეფიშ  $1",
        "rcshowhideliu": "$1 მიშულირ მახვარებუეფ",
index 0353e53..55e7fd2 100644 (file)
@@ -10,7 +10,8 @@
                        "Yidel",
                        "ווארצגאנג",
                        "לערי ריינהארט",
-                       "פוילישער"
+                       "פוילישער",
+                       "아라"
                ]
        },
        "tog-underline": "שטרייכט אונטער לינקען",
        "readonly_lag": "די דאטעבאזע איז געווארן אויטאמטיש אפגעשפארט כדי צו דערמעגליכן פאר די אונטער דאטע באזע סערווערס צו ווערן דערהיינטיגט פון דעם אויבער סערווער.",
        "internalerror": "אינערווייניגער פֿעלער",
        "internalerror_info": "אינערווייניגער פֿעלער: $1",
-       "fileappenderrorread": "קען נישט לייענען \"$1\" בײַם צוגעבן.",
-       "fileappenderror": "האט נישט געקענט צולייגן \"$1\" צו \"$2\".",
        "filecopyerror": "האט נישט געקענט קאפירן \"$1\" צו \"$2\".",
        "filerenameerror": "נאמען טויש פֿאַר \"$1\" צו \"$2\" איז נישט אדורכגעגאנגען.",
        "filedeleteerror": "אויסמעקן \"$1\" נישט דורך.",
        "directorycreateerror": "קען נישט באשאפן דירעקטארי \"$1\".",
        "filenotfound": "קען נישט געפינען טעקע \"$1\".",
-       "fileexistserror": "קען נישט שרײַבן צו טעקע \"$1\": טעקע עקסיסטירט שוין",
        "unexpected": "אומערווארטערטער ווערד: \"$1\"=\"$2\"",
        "formerror": "פֿעלער: קען נישט שיקן פֿארעם.",
        "badarticleerror": "מען קען נישט טאן די אקציע וואס איר ווילט אויף דעם בלאט.",
        "userlogin-helplink2": "הילף מיט ארײַנלאגירן",
        "userlogin-loggedin": "איר זענט שוין אריינלאגירט ווי {{GENDER:$1|$1}}.\nניצט די פארעם אונטן כדי אריינלאגירן ווי אן אנדער באניצער.",
        "userlogin-createanother": "שאפֿן נאך א קאנטע",
-       "createacct-join": "גיט ארײַן אײַער אינפֿארמאציע אונטן.",
-       "createacct-another-join": "ארײַנגעבן דער נײַער קאנטעס אינפארמאציע אונטן.",
        "createacct-emailrequired": "בליצפּאָסט אַדרעס",
        "createacct-emailoptional": "בליצפאסט אדרעס (אפציאנאל)",
        "createacct-email-ph": "קלאַפט ארײַן אײַער בליצפּאָסט אַדרעס",
        "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|דערגאַנצט איינע פֿון די פֿעלדער כדי צו באקומען א פראוויזאריש פאַסווארט דור כן פאסט.}}",
        "savearticle": "אױפֿהיטן בלאַט",
        "preview": "פֿאראויסקוק",
        "showpreview": "ווײַזן פֿאָרױסקוק",
-       "showlivepreview": "זאפֿארטיגער פאראויסקוק",
        "showdiff": "ווײַז די ענדערונגען",
        "anoneditwarning": "'''ווארענונג:''' איר זענט נישט אריינלאגירט אין אייער קאנטע. אייער איי פי אדרעס וועט ווערן דאקומענטירט אין דעם בלאטס היסטאריע פון ענדערונגען. אויב זארגט איר זיך פאר פריוואטקייטן, ביטע טוט זיך אריינלאגירן.",
        "anonpreviewwarning": "''איר זענט נישט אַרײַנלאגירט. אויפֿהיטן וועט ארײַנשרײַבן אײַער IP אַדרעס אין דער רעדאַקטירונג היסטאריע פונעם בלאַט.''",
        "edit-gone-missing": "נישט מעגלעך צו דערהיינטיגן דעם בלאט.\nס'ווייזט אויס אז ער איז אויסגעמעקט.",
        "edit-conflict": "רעדאקטירן קאנפֿליקט.",
        "edit-no-change": "מ'האט איגנארירט אײַער רעדאַקטירונג, ווײַל קיין שום ענדערונג איז נישט געמאַכט צום טעקסט.",
-       "postedit-confirmation": "אייער רעדאקטירונג איז געווארן אויפגעהיטן.",
+       "postedit-confirmation-created": "דער בלאט איז געווארן געשאפן.",
+       "postedit-confirmation-restored": "דער בלאט איז געווארן צוריקגעשטעלט.",
+       "postedit-confirmation-saved": "אייער רעדאקטירונג איז געווארן אויפגעהיטן.",
        "edit-already-exists": "נישט מעגליך צו שאַפֿן נייעם בלאט.\nער עקזיסטירט שוין.",
        "defaultmessagetext": "גרונטלעכער מעלדונג טעקסט",
        "content-failed-to-parse": "פארזן $2 אינהאלט פאר $1 מאדעל דורכגעפאלן: $3",
        "revdelete-show-file-confirm": "צי זענט איר זעכער איר ווילט באַקוקן אַן אויסגעמעקטע רעוויזיע פון דער טעקע \"<nowiki>$1</nowiki>\" פון $2 בשעה $3?",
        "revdelete-show-file-submit": "יא",
        "revdelete-selected-text": "'''{{PLURAL:$2|אויסדערוויילטע רעוויזיע| אויסדערוויילטע רעוויזיעס}} פון [[:$1]]:'''",
+       "revdelete-selected-file": "'''{{PLURAL:$1|אויסדערוויילטע טעקע ווערסיע| אויסדערוויילטע טעקע ווערסיעס}} פון [[:$2]]:'''",
        "logdelete-selected": "{{PLURAL:$1| אויסדערוויילטע לאג אקציע|אויסדערוויילטע לאג אקציעס}}:",
        "revdelete-confirm": "זייט אזוי גוט און באשטעטיקט אז דאס איז טאקע אייער כוונה, אז איר פארשטייט די קאנסעקווענצן, און אז איר טוט דאס לויט  [[{{MediaWiki:Policy-url}}|דער פאליסי]].",
        "revdelete-suppress-text": "אונטערדרוקן זאל בלויז גענוצט ווערן '''נאר''' אין די פאלגנדע פעלער:\n* אינפארמאציע וואס קען זיין מוציא שם רע\n* אויפדעקונג פון פריוואטקייט אינפארמאציע\n*: ''היים אדרעסן, טעלעפאן נומערן, נאציאנאלע אידענטיפיקאציע נומערן, א.א.וו.''",
        "searchmenu-exists": "'''ס'איז פֿאַראַן א בלאַט מיטן נאמען \"[[:$1]]\" אין דער וויקי'''",
        "searchmenu-new": "<strong>באַשאַפֿן דעם בלאַט \"[[:$1]]\" אויף דער וויקי!</strong> {{PLURAL:$2|0=|זעט אויך דעם בלאט געפֿונען מיט אײַער זוך.|זעט אויך די זוך רעזולטאטן געפֿונען.}}",
        "searchprofile-articles": "אינהאלט בלעטער",
-       "searchprofile-project": "הילף און פראיעקט בלעטער",
        "searchprofile-images": "מולטימעדיע",
        "searchprofile-everything": "אלץ",
        "searchprofile-advanced": "פֿארגעשריטן",
        "searchprofile-articles-tooltip": "זוכן אין $1",
-       "searchprofile-project-tooltip": "זוכן אין $1",
        "searchprofile-images-tooltip": "זוכן טעקעס",
        "searchprofile-everything-tooltip": "זוך אינעם גאנצען אינהאלט (אריינגערעכנט רעדן בלעטער)",
        "searchprofile-advanced-tooltip": "זוכן אין צוגעשטעלטע ָנאָמענטיילן",
        "search-nonefound": "נישטא קיין רעזולטאטן פֿאַר דער שאלה.",
        "powersearch-legend": "ווײַטהאלטן זוכן",
        "powersearch-ns": "זוכן אין נאמענטיילן:",
-       "powersearch-redir": "ווײַז ווײַטערפֿירונג בלעטער",
        "powersearch-togglelabel": "קאנטראלירן:",
        "powersearch-toggleall": "אלע",
        "powersearch-togglenone": "קיין",
        "prefs-emailconfirm-label": "ע-פאסט באַשטעטיקונג:",
        "youremail": "ע-פאסט:",
        "username": "{{GENDER:$1|באַניצער־נאָמען}}:",
-       "uid": "{{GENDER:$1|באַנוצער־נומער}}:",
        "prefs-memberingroups": "{{GENDER:$2|מיטגליד}} אין {{PLURAL:$1|גרופע|גרופעס}}:",
        "prefs-registration": "אײַנשרײַבן צײַט:",
        "yourrealname": "עכטער נאמען *:",
        "prefs-advancedsearchoptions": "פֿארגעשריטענע אפציעס",
        "prefs-advancedwatchlist": "פֿארגעשריטענע אפציעס",
        "prefs-displayrc": "ווײַזן אפציעס",
-       "prefs-displaysearchoptions": "ווײַזן אפציעס",
        "prefs-displaywatchlist": "ווײַזן אפציעס",
        "prefs-tokenwatchlist": "טאקן",
        "prefs-diffs": "צווישנשיידן",
        "right-move": "באוועג בלעטער",
        "right-move-subpages": "באַוועגן בלעטער מיט זייערע אונטערבלעטער",
        "right-move-rootuserpages": "באַוועגן באַניצער הויפטבלעטער",
+       "right-move-categorypages": "באוועגן קאטעגאריע בלעטער",
        "right-movefile": "באַוועגן טעקעס",
        "right-suppressredirect": "נישט שאַפֿן א ווײַטערפֿירונג פֿונעם אַלטן בלאַט בײַם באַוועגן אַ בלאַט",
        "right-upload": "ארויפלאדן טעקעס",
        "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": "איבערשרײַבן די עקזיסטירנדע טעקע",
        "recentchanges-legend-newpage": "(זעט אויך [[Special:NewPages|די רשימה פון נייע בלעטער]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "פֿאלגנד זענען די ענדערונגען זײַט <strong>$2</strong> (ביז <strong>$1</strong>).",
-       "rclistfrom": "װײַזן נײַע ענדערונגען פֿון $1",
+       "rclistfrom": "װײַזן נײַע ענדערונגען פֿון $3 $2",
        "rcshowhideminor": "$1 מינערדיגע ענדערונגען",
        "rcshowhideminor-show": "ווײַזן",
        "rcshowhideminor-hide": "באהאלטן",
        "unwatchedpages": "בלעטער וואס זענען נישט אויפגעפאסט",
        "listredirects": "ליסטע פון ווײַטערפֿירונגען",
        "listduplicatedfiles": "ליסטע פון טעקעס מיט דופליקאטן",
+       "listduplicatedfiles-entry": "[[:טעקע:$1|$1]] האט [[$3|{{PLURAL:$2|א דופליקאט|$2 דופליקאטן}}]].",
        "unusedtemplates": "נישט באניצטע מוסטערן",
        "unusedtemplatestext": "דער בלאט ווײַזט אלע בלעטער אינעם {{ns:template}} נאמענטייל וואס זענען נישט אײַנגעשלאסן אין אן אנדער בלאט. געדענקט צו באקוקן אנדערע בלעטער פאר לינקען צו די מוסטערן איידער איר מעקט זיי אויס.",
        "unusedtemplateswlh": "אנדערע פֿאַרבינדונגען",
        "pageswithprop-prophidden-binary": "בינארישער אייגנשאפט־ווערט באהאלטן ($1)",
        "doubleredirects": "געטאפלטע ווײַטערפֿירונגען",
        "doubleredirectstext": "דער בלאט רעכנט אויס בלעטער וואס פירן ווייטער צו אנדערע ווייטערפירן בלעטער.\nיעדע שורה אנטהאלט א לינק צום ערשטן און צווייטן ווייטערפירונג, ווי אויך די ציל פון דער צווייטער ווייטערפירונג, וואס רוב מאל געפינט זיך די ריכטיגע ציל וואו די ערשטע ווייטערפירונג זאל ווייזן.\n<del>אויסגעשטראכענע</del> טעמעס זענען שוין געלייזט.",
-       "double-redirect-fixed-move": "[[$1]] איז געווארן באוועגט, און איז יעצט א ווייטערפֿירונג צו [[$2]]",
-       "double-redirect-fixed-maintenance": "פֿ×\90ַררע×\9b×\98×\9f ×\92×¢×\98×\90פ×\9c×\98×¢ ×\95×\95ײַ×\98ערפֿ×\99ר×\95× ×\92 ×¤Ö¿×\95×\9f [[$1]] ×¦×\95 [[$2]].",
+       "double-redirect-fixed-move": "[[$1]] איז געווארן באוועגט.\nער איז געווארן דערהיינטיקט אויטאמאטיש און איז יעצט א ווייטערפֿירונג צו [[$2]].",
+       "double-redirect-fixed-maintenance": "×\90×\95×\99×\98×\90×\9e×\90×\98×\99ש ×¤Ö¿×\90ַררע×\9b×\98×\9f ×\92×¢×\98×\90פ×\9c×\98×¢ ×\95×\95ײַ×\98ערפֿ×\99ר×\95× ×\92 ×¤Ö¿×\95×\9f [[$1]] ×¦×\95 [[$2]] ×\90×\99×\9f ×\90×\9f ×\90×\95×\99פ×\94×\90×\9c×\98×\95× ×\92 ×\90×\95×\99פ×\92×\90×\91×¢.",
        "double-redirect-fixer": "מתקן ווײַטערפֿירונגען",
        "brokenredirects": "צעבראָכענע ווײַטערפֿירונגען",
        "brokenredirectstext": "די פֿאלגנדע ווײַטערפֿירונגען פֿאַרבינדן צו בלעטער וואס עקזיסטירן נאך נישט:",
        "protectedpages-timestamp": "צײַטשטעמפל",
        "protectedpages-page": "בלאַט",
        "protectedpages-expiry": "גייט אויס",
+       "protectedpages-performer": "געשטיצט דורך",
+       "protectedpages-params": "שוץ־פאראמעטערס",
        "protectedpages-reason": "אורזאַך",
        "protectedpages-unknown-timestamp": "אומבאַוואוסט",
        "protectedpages-unknown-performer": "אומבאוואוסטער באניצער",
        "log-title-wildcard": "זוכן טיטלען וואס הייבן אָן מיט דעם טעקסט",
        "showhideselectedlogentries": "ווײַזן/באַהאַלטן געקליבענע לאגבוך אקציעס",
        "allpages": "אַלע בלעטער",
-       "alphaindexline": "$1 ביז $2",
        "nextpage": "קומענדיקער בלאַט ($1)",
        "prevpage": "פֿריִערדיקער בלאַט ($1)",
        "allpagesfrom": "ווייזן בלעטער אנגעהויבן פון:",
        "listgrouprights-addgroup-self-all": "צולייגן אַלע גרופעס צו אייגענער קאנטע",
        "listgrouprights-removegroup-self-all": "אראָפנעמען אַלע גרופעס פֿון אייגענער קאנטע",
        "listgrouprights-namespaceprotection-namespace": "נאָמענטייל",
+       "trackingcategories-name": "מעלדונג נאמען",
+       "trackingcategories-desc": "קאטעגאריע אײַנשליסן קריטעריע",
        "mailnologin": "נישטא קיין אדרעס צו שיקן",
        "mailnologintext": "איר ברויכט זײַן [[Special:UserLogin|אַרײַנלאגירט]] און האָבן א גילטיגן ע־פאסט אַדרעס אין אײַער [[Special:Preferences|פרעפֿערענצן]] צו שיקן ע־פאסט צו אַנדערע באַניצער.",
        "emailuser": "שיקן ע-פאסט צו דעם באַניצער",
        "watchlist-details": "{{PLURAL:$1|$1 בלאט|$1 בלעטער}} אין אייער אויפֿפאסן ליסטע, נישט רעכענען  רעדן בלעטער.",
        "wlheader-enotif": "ע-פאסט מעלדונג ערמעגליכט.",
        "wlheader-showupdated": "בלעטער געענדערט זײַט אײַער לעצטן וויזיט זען געוויזן '''דיק'''.",
-       "watchmethod-recent": "קאנטראלירן לעצטע ענדערונגען פֿאַר אויפֿגעפאַסטע בלעטער",
-       "watchmethod-list": "קאנטראלירן בלעטער אין אַכטונג־ליסטע פֿאַר לעצטע ענדערונגען",
-       "watchlistcontains": "אייער אויפֿפאסונג ליסטע אנטהאלט {{PLURAL:$1|איין בלאט|$1 בלעטער}}.",
-       "iteminvalidname": "פּראָבלעם מיט '$1', אומגילטיקער נאָמען ...",
        "wlshowlast": "(ווײַזן די לעצטע $1 שעה'ן | $2 טעג | $3)",
        "watchlist-options": "אויפֿפאַסן ליסטע ברירות",
        "watching": "אויפפאסענדונג…",
        "enotif_lastvisited": "זעט $1 פֿאַר אלע ענדערונגען זינט אײַער לעצטן וויזיט.",
        "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\nאייער פֿריינטליכע  {{SITENAME}} מעלדונגען סיסטעם\n\n--\nצו ענדערן אייער ע־פאסט נאטיפיקאציע שטעלונגען, באזוכט\n{{canonicalurl:{{#special:Preferences}}}}\n\nצו ענדערן אייער אויפֿפאסונג ליסטע, באזוכט\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nכדי אויסמעקן דעם בלאט פון אײַער אויפֿפאַסונג ליסטע, באַזוכט\n$UNWATCHURL\n\nפאר מער הילף:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "טײַערער $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nענדערערס קורץ ווארט: $PAGESUMMARY $PAGEMINOREDIT\n\nפארבינדט זיך צום שרייבער:\nע-פאסט: $PAGEEDITOR_EMAIL\nוויקי: $PAGEEDITOR_WIKI\n\nעס וועט מער נישט זיין קיין מעלדונגען אין פאל פון נאך אקטיוויטעט נאר אויב איר וועט באזוכן דעם בלאט ווען אריינלאגירט.\nאיר קענט אויך צוריקשטעלן די מעלדונגען פאנען פון אלע אייערע אויפֿגעפאסטע בלעטער אין אייער אויפפאסונג ליסטע.\n\nאייער פֿריינטליכע  {{SITENAME}} מעלדונגען סיסטעם\n\n--\nצו ענדערן אייער ע־פאסט נאטיפיקאציע שטעלונגען, באזוכט\n{{canonicalurl:{{#special:Preferences}}}}\n\nצו ענדערן אייער אויפֿפאסונג ליסטע, באזוכט\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nכדי אויסמעקן דעם בלאט פון אײַער אויפֿפאַסונג ליסטע, באַזוכט\n$UNWATCHURL\n\nפאר מער הילף:\n$HELPPAGE",
        "created": "געשאַפֿן",
        "changed": "געטוישט",
        "deletepage": "מעק אויס בלאט",
        "blockip": "בלאקירן באַניצער",
        "blockip-legend": "בלאקירן באַניצער",
        "blockiptext": "באניצט די פארעם דא אונטן כדי צו בלאקירן שרײַבן רעכטן פֿון איינגעשריבענע באניצער אדער סתם ספעציפישע איי פי אדרעסן.\n\nאזאלכע בלאקירונגען מוזן דורכגעפירט ווערן בלויז צו פֿאַרמײַדן וואַנדאַליזם, און לויט די [[{{MediaWiki:Policy-url}}|פארשריפטן און פאליסיס]].\n\nביטע שרײַבט ארויס קלאָר די ספעציפֿישע סיבה (למשל, ציטירן וועלכע בלעטער מ'האט וואַנדאַליזירט).",
-       "ipadressorusername": "IP אדרעס אדער באַניצער נאמען:",
+       "ipaddressorusername": "IP אדרעס אדער באַניצער נאמען:",
        "ipbexpiry": "אויסגיין:",
        "ipbreason": "אורזאַך:",
        "ipbreason-dropdown": "* פֿארשפרייטע בלאקירן סיבות\n** ארײַנלייגן פֿאלשע אינפֿארמאציע\n** אויסמעקן אינהאַלט פֿון בלעטער\n** פֿארפֿלייצן לינקען צו דרויסנדיקע ערטער\n** ארײַנלייגן שטותים/טאָטעריש אין בלעטער\n** סטראשעט און שטערט\n** קרומבאניצן מערערע קאנטעס\n** באַניצער נאָמען פראבלעמאַטיש",
        "movenotallowedfile": "איר האט נישט קיין רשות צו באוועגן טעקעס.",
        "cant-move-user-page": "איר זענט נישט דערלויבט צו באַוועגן באַניצער בלעטער (אחוץ אונטערבלעטער).",
        "cant-move-to-user-page": "איר זענט נישט דערלויבט צו באַוועגן א בלאַט צו א באַניצער בלאַט (אַחוץ צו א באַניצער אונטערבלאַט).",
+       "cant-move-category-page": "איר זענט נישט דערלויבט צו באוועגן קאטעגאריע בלעטער.",
        "newtitle": "צו נייעם קעפל:",
        "move-watch": "אויפֿפאַסן אויף דעם בלאַט",
        "movepagebtn": "באַוועגן בלאַט",
        "tooltip-preferences-save": "היטן פרעפֿערענצן",
        "tooltip-summary": "אײַנגעבן א קורצע רעזומע",
        "common.css": "/* CSS געשריבן דא וועט אפילירן און באיינפלוסן אלע סקינס */",
-       "cologneblue.css": "/* CSS געשטעלט דא ווירקט נאר אויפן קעלנישן־בלוי סקין */",
        "monobook.css": "/* סטייל דא געלייגט וועט באאיינפלוסן דעם Monobook סקין */",
-       "modern.css": "/* CSS געשטעלט דא ווירקט אויפן מאדערנעם סקין */",
        "vector.css": "/* CSS געשטעלט דא ווירקט נאר אויפן וועקטאר סקין */",
        "common.js": "/* אלע סקריפטן פון JavaScript דא געשריבן וועט לויפן פאר אלע באנוצער ווען זיי וועלן לאדירן דעם בלאט */",
-       "notacceptable": "דער וויקי סערווער קען נישט צושטעלן דאַטן אין אַ פֿאָרמאַט וואָס אײַער קליענט קען לייענען.",
        "anonymous": "{{PLURAL:$1|אַנאנימער באַניצער| אַנאנימע באַניצערס}} פֿון {{SITENAME}}",
        "siteuser": "באַניצער {{SITENAME}} $1",
        "anonuser": "{{SITENAME}} אַנאנימער באַניצער $1",
        "pageinfo-category-pages": "צאָל בלעטער",
        "pageinfo-category-subcats": "צאָל אונטערקאטעגאריעס",
        "pageinfo-category-files": "צאָל טעקעס",
-       "skinname-cologneblue": "קעלניש בלוי",
        "skinname-monobook": "מאנאבוק",
-       "skinname-modern": "מאדערן",
        "skinname-vector": "וועקטאר",
        "markaspatrolleddiff": "באצייכענען אלס פאטראלירט",
        "markaspatrolledtext": "באצייכענען בלאט אלס פאטראלירט",
        "newimages-summary": "דער באַזונדערער בלאַט ווײַזט די לעצטע ארויפֿגעלאָדענע טעקעס.",
        "newimages-legend": "פֿילטער",
        "newimages-label": "טעקע נאָמען (אדער אַ טײל דערפֿון):",
-       "showhidebots": "($1 ראָבאָטן)",
        "noimages": "נישטא קיין בילדער.",
        "ilsubmit": "זוכן",
        "bydate": "לויטן דאטום",
        "confirm-watch-top": "צולייגן דעם בלאט צו אייער אויפֿפאסונג ליסטע?",
        "confirm-unwatch-button": "יאָ",
        "confirm-unwatch-top": "אראפנעמען דעם בלאט פון אייער אויפפאסונג ליסטע?",
+       "quotation-marks": "„$1“",
        "imgmultipageprev": "→ פֿריערדיגער בלאַט",
        "imgmultipagenext": "צום קומענדיגן בלאט ←",
        "imgmultigo": "גייט!",
        "imgmultigoto": "אריבער צו בלאט $1",
+       "img-lang-default": "(גרונטשפראך)",
+       "img-lang-go": "גיין",
        "ascending_abbrev": "ארויף",
        "descending_abbrev": "נידערן",
        "table_pager_next": "נעקסטער בלאט",
        "autosumm-replace": "פֿאַרבײַט דעם בלאַט מיט '$1'",
        "autoredircomment": "ווייטערפירן צו [[$1]]",
        "autosumm-new": "געשאַפֿן בלאַט מיט '$1'",
-       "livepreview-loading": "לאדנדיג…",
-       "livepreview-ready": "לאדנדיג… גרייט!",
-       "livepreview-failed": "גיכער פֿאראויסקוק דורכגעפֿאלן.\nפרובירט נארמאלן פֿאראויסקוק.",
-       "livepreview-error": "פֿארבינדונג נישט מעגלעך: $1 \"$2\".\nפרובירט נארמאלן פֿאראויסקוק.",
-       "watchlistedit-numitems": "אײַער אויפֿפאַסונג ליסטע אַנטהאַלט {{PLURAL:$1|1 טיטל|$1 טיטלען}}, אויסשליסנדיק שמועסבלעטער.",
-       "watchlistedit-noitems": "אײַער אויפֿפאַסן ליסטע איז ליידיג.",
        "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": "טיטלען:",
+       "watchlisttools-clear": "ליידיקן די אויפפאסן ליסטע",
        "watchlisttools-view": "ווייזן שייכדיגע ענדערונגען",
        "watchlisttools-edit": "זען און רעדאקטירן די אויפֿפאסונג ליסטע",
        "watchlisttools-raw": "רעדאקטירן די רויע אויפֿפאסונג ליסטע",
        "version-hook-name": "נאמען פון hook",
        "version-version": "(ווערסיע $1)",
        "version-license": "מעדיעוויקי ליצענץ",
+       "version-ext-license": "ליצענץ",
        "version-poweredby-others": "אַנדערע",
        "version-poweredby-translators": "translatewiki.net איבערזעצער",
        "version-credits-summary": "מיר ווילן אנערקענען די פֿאלגנדע מענטשן פֿאר זייער בײַשטײַערוג צו [[Special:Version|מעדיעוויקי]].",
        "fileduplicatesearch-info": "$1 × $2 פיקסעל<br />טעקע גרייס: $3<br /> טיפ MIME: $4",
        "fileduplicatesearch-noresults": "קיין טעקע מיטן נאמען \"$1\" נישט געטראפֿן.",
        "specialpages": "ספּעציעלע זײַטן",
+       "specialpages-note-top": "לעגענדע",
        "specialpages-note": "* נארמאַלע באַזונדערע בלעטער.\n* <span class=\"mw-specialpagerestricted\">באַגרענעצטע באַזונדערע בלעטער.</span>",
        "specialpages-group-maintenance": "אויפֿהאַלטונג באַריכטן",
        "specialpages-group-other": "אַנדערע ספעציעלע בלעטער",
        "compare-invalid-title": "דעם טיטל איר האט ספעציפֿירט איז אומגילטיק.",
        "compare-title-not-exists": "דעם טיטל וואס איר האט ספעציפֿירט עקזיסטירט נישט",
        "compare-revision-not-exists": "די רעוויזיע וואס איר האט ספעציפֿירט עקזיסטירט נישט.",
-       "dberr-header": "די וויקי האט א פראבלעם",
        "dberr-problems": "אנטשולדיגט! דער דאזיקער סייט האט טעכנישע פראבלעמען.",
        "dberr-again": "וואַרט א פאָר מינוט און לאָדנט אָן ווידער.",
        "dberr-info": "(קען נישט פֿאַרבינדן מיטן דאַטנבאַזע באַדינער: $1)",
        "htmlform-selectorother-other": "אַנדער",
        "htmlform-no": "ניין",
        "htmlform-yes": "יא",
+       "htmlform-cloner-create": "צולייגן נאך",
+       "htmlform-cloner-delete": "אַראָפּנעמען",
        "sqlite-has-fts": "$1 מיט פולן-טעקסט זוכן שטיץ",
        "sqlite-no-fts": "$1 אָן פֿולן-טעקסט זוכן שטיץ",
        "logentry-delete-delete": "$1 {{GENDER:$2|האט אויסגעמעקט}} בלאט $3",
index a86663d..0dcc31d 100644 (file)
@@ -4,7 +4,8 @@
                        "Demmy",
                        "Kaganer",
                        "Meno25",
-                       "Urhixidur"
+                       "Urhixidur",
+                       "아라"
                ]
        },
        "tog-underline": "Ìfàlàsábẹ́ àwọn àjápọ̀:",
@@ -17,7 +18,6 @@
        "tog-showtoolbar": "Ìfihàn pẹpẹ irinṣẹ́ àtúnṣe",
        "tog-editondblclick": "Ṣ'àtúnṣe àwọn ojúewé ní kíkàn lẹ́mẹjì",
        "tog-editsectiononrightclick": "Ìgbàláyè àtúnṣe abala nípa klííkì ọ̀tún lórí àkọlé abala",
-       "tog-rememberpassword": "Ṣè'rántí àkọọ́lẹ̀ ìwọlé mi lórí agbétàkùn yìí (fún {{PLURAL:$1|ọjọ́|ọjọ́}} $1 pípẹ́jùlọ)",
        "tog-watchcreations": "Ṣ'àfikún ojúewé tí mo dá àti àwọn fáìlì tí mo rùsókè mọ́ ìmójútó mi",
        "tog-watchdefault": "Ṣ'àfikún àwọn ojúewé àti fáìlì tí mo ṣ'àtúnse mọ́ ìmójútó mi",
        "tog-watchmoves": "Ṣ'àfikún àwọn ojúewé ati fáìlì tí mo yípò mọ́ ìmójútó mi",
        "readonly_lag": "Ibùdó dátà ti jẹ́ títìpa fúnrararẹ̀ kí àwọn ẹ̀rọ awọ̀fà ẹrú ibùdó dátà le baà yára bíi ti àwọn ẹ̀rọ awọ̀fà ọ̀gà.",
        "internalerror": "Àsìṣe inú",
        "internalerror_info": "Àsìṣe inú: $1",
-       "fileappenderrorread": "\"$1\" kò ṣe é kà lásìkò ìlẹ̀mọ́.",
-       "fileappenderror": "Kò le so \"$1\" pọ̀ mọ́ \"$2\".",
        "filecopyerror": "Àwòkọ faili \"$1\" sí \"$2\" kò ṣe é ṣe.",
        "filerenameerror": "Àtúnsọlórúkọ fáìlì \"$1\" sí \"$2\" kò ṣe é ṣe.",
        "filedeleteerror": "Ìparẹ́ fáìlì \"$1\" kò ṣe é ṣe.",
        "directorycreateerror": "Kò le dá àpò \"$1\".",
        "filenotfound": "Kò sí fáìlì \"$1\".",
-       "fileexistserror": "Ìṣòro kíkọ sí inú fáìlì \"$1\": fáìlì ọ̀hún wà",
        "unexpected": "Iye àìretí: \"$1\"=\"$2\".",
        "formerror": "Àsìṣe: fọ́ọ̀mù kò ṣe fi ránṣẹ́",
        "badarticleerror": "Ìgbéṣẹ̀ yìí kò ṣe é ṣe lórí ojúewé yìí.",
        "userlogin-resetpassword-link": "Ṣé ẹ ti gbàgbé ọ̀rọ̀ìpamọ́ yín?",
        "userlogin-loggedin": "Ẹ pilẹ̀ ti jáwọlé bíi {{GENDER:$1|$1}}.\nẸ lo fọ́ọ̀mù ìsàlẹ̀ látí jáwọlé gẹ́gẹ́ bíi oníṣe míràn.",
        "userlogin-createanother": "Ìdá àkópamọ́ míràn",
-       "createacct-join": "Ẹ kọ ìsọ̀rọ̀nípa yín sísàlẹ̀",
        "createacct-emailrequired": "Àdírẹ̀sì email",
        "createacct-emailoptional": "Àdírẹ̀sì email (kò pọndandan)",
        "createacct-email-ph": "Ẹ kọ àdírẹ̀sì email yín",
        "login-abort-generic": "Ìwọlé yín kò yọrísírere - ó ti jẹ́ kíkáwọ́dà",
        "loginlanguagelabel": "Èdè: $1",
        "suspicious-userlogout": "Ìtọrọ tí ẹ ṣe láti bọ́sóde jẹ̀ kíkọ̀ nítorípé ó dà bí pé ó jẹ́ fífiránṣẹ́ látọ̀dọ̀ awòtakùn (browser) àìdára tàbí ẹ̀rọ-ìwọ̀fà ìmúpamọ́ onígbàdíẹ̀.",
+       "pt-login": "Ìjáwọlé",
+       "pt-login-button": "Ìjáwọlé",
+       "pt-createaccount": "Ìdásílẹ̀ àpamọ́",
+       "pt-userlogout": "Ìjáde",
        "php-mail-error-unknown": "Àsìṣe àìmọ̀ nínú ìgbéṣe mail() ti PHP",
        "user-mail-no-addy": "Ó fẹ́ fi e-mail ránṣẹ́ láìsí àdírẹ́sì e-mail.",
        "user-mail-no-body": "Ò fẹ́ fi email tí kò ní ọ̀rọ̀ kankan nínú ránsẹ́.",
        "changepassword": "Ìyípadà ọ̀rọ̀ìpamọ́",
-       "resetpass_announce": "Ẹ ti wọlé pẹ̀lú àmìọ̀rọ̀ e-mail ìgbàdíẹ̀.\nLáti parí ìmúwọlẹ́, ẹ gbọ́dọ̀ ṣètò ọ̀rọ̀ìpamọ́ tuntun níbí:",
+       "resetpass_announce": "Láti parí ìjáwọlẹ́, ẹ gbọ́dọ̀ ṣètò ọ̀rọ̀ìpamọ́ tuntun.",
        "resetpass_header": "Ẹ ṣ'àyípadà ọ̀rọ̀ìpamọ́",
        "oldpassword": "Ọ̀rọ̀ìpamọ́ titẹ́lẹ̀:",
        "newpassword": "Ọ̀rọ̀ìpamọ́ tuntun:",
        "retypenew": "Àtúntẹ̀ ọ̀rọ̀ìpamọ́ tuntun:",
        "resetpass_submit": "Ẹ ṣe àtúntò ọ̀rọ̀ìpamọ́ kí ẹ tó wọlé",
        "changepassword-success": "Ìyípadà ọ̀rọ̀ìpamọ́ yín ti já sí rere!",
+       "changepassword-throttled": "Ẹ ti gbìyànjú lọ́pọ̀ bó ṣe yẹ lọ láti jáwọlé.\nẸ jọ̀wọ́ ẹ dúró fún $1 ná kí ẹ tó tún gbìyànjú lẹ́ẹ̀kan síi.",
        "resetpass_forbidden": "Àwọn ọ̀rọ̀ìpamọ́ kò ṣe é yípadà",
        "resetpass-no-info": "Ẹ gbọ́dọ̀ wọlẹ́ láti le lọ sí ojúewé yìí tààrà.",
        "resetpass-submit-loggedin": "Ìyípadà ọ̀rọ̀ìpamọ́",
        "savearticle": "Ìmúpamọ́ ojúewé",
        "preview": "Àyẹ̀wò",
        "showpreview": "Àkọ́yẹ̀wò",
-       "showlivepreview": "Àkọ́yẹ̀wò lẹ́sẹ̀kẹsẹ̀",
        "showdiff": "Ìfihàn àwọn àtúnṣe",
        "anoneditwarning": "'''Ìkìlọ̀:''' Ẹ kò tíì wọlé.\nÀdírẹ́ẹ̀sì IP yín yíò jẹ́ kíkọpamọ́ sínú ìwé ìtàn àtúnṣe ojúewé yìí.",
        "anonpreviewwarning": "''Ẹ kò tíì wọlé. Àdírẹ́ẹ̀sì IP yín yíò jẹ́ kíkọsílẹ̀ sínú ìwé ìtàn àtúnṣe ojúewé yìí tí ẹ bá ṣàmúpamọ́ rẹ̀.''",
        "edit-gone-missing": "A kò le ṣe títúnṣe ojúewé.\nÓ dà bíi pé a ti paárẹ́.",
        "edit-conflict": "Ìtakora áwọn àtúnṣe",
        "edit-no-change": "A ṣe àìkàsí àtúnṣe yín, nítorípé ìkọ̀wé kò ní àtúnṣe kankan.",
-       "postedit-confirmation": "Àtúnṣe yín ti jẹ́ gbígbépamọ́.",
+       "postedit-confirmation-saved": "Àtúnṣe yín ti jẹ́ gbígbépamọ́.",
        "edit-already-exists": "A kò le è ṣè'dá ojúewé tuntun.\nÓ pilẹ̀ ti wà.",
        "defaultmessagetext": "Ìkọ ìránṣẹ́ àtìbẹ̀rẹ̀",
        "content-failed-to-parse": "Ìkùnà láti ṣàtúwò àkóónú $2 fún àfijúwe $1: $3",
        "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è:",
-       "powersearch-redir": "Àkójọ àwọn àtúnjúwe",
        "powersearch-togglelabel": "Ìyẹ̀wò:",
        "powersearch-toggleall": "Gbogbo wọn",
        "powersearch-togglenone": "Ìkankan",
        "prefs-emailconfirm-label": "E-mail ìmúdájú:",
        "youremail": "E-mail:",
        "username": "{{GENDER:$1|Orúkọ oníṣe}}:",
-       "uid": "Nọmba ìdámọ̀ {{GENDER:$1|oníṣe}}:",
        "prefs-memberingroups": "{{GENDER:$2|Ọ̀kan}} nínú {{PLURAL:$1|ẹgbẹ́|àwọn ẹgbẹ́}}:",
        "prefs-registration": "Àsìkò ìforúkọsílẹ́:",
        "yourrealname": "Orúkọ ganangan:",
        "prefs-advancedsearchoptions": "Àwọn àṣàyàn onígíga",
        "prefs-advancedwatchlist": "Àwọn àṣàyàn onígíga",
        "prefs-displayrc": "Ìfihàn àwọn àṣàyàn",
-       "prefs-displaysearchoptions": "Ìfihàn àwọn àṣàyàn",
        "prefs-displaywatchlist": "Ìfihàn àwọn àṣàyàn",
        "prefs-diffs": "Àwọn ìyàtọ̀",
        "email-address-validity-valid": "Àdírẹ́ẹ̀sì e-mail dà bí èyí tótọ́",
        "recentchanges-legend-heading": "'''Ìtumọ̀:'''",
        "recentchanges-legend-newpage": "(ẹ tún wo [[Special:NewPages|àtòjọ àwọn ojúewé tuntun]])",
        "rcnotefrom": "Àwọn àtúnṣe láti ''''$2''' (títí dé '''$1''' hàn) lábẹ́.",
-       "rclistfrom": "Àfihàn àwọn àtúnṣe tuntun nípa bíbẹ̀rẹ̀ láti $1",
+       "rclistfrom": "Àfihàn àwọn àtúnṣe tuntun nípa bíbẹ̀rẹ̀ láti $3 $2",
        "rcshowhideminor": "$1 àwọn àtúnṣe kékéèké",
        "rcshowhidebots": "$1 àwọn bot",
        "rcshowhideliu": "$1 àwọn oníṣe aforúkọsílẹ̀",
        "uploadstash-errclear": "Ìparẹ́ àwọn fáìlì náà kò yorísírere.",
        "uploadstash-refresh": "Àtúnraṣe àtòjọ àwọn fáìlì",
        "img-auth-accessdenied": "Ìdínà igbàwọlé",
-       "img-auth-nopathinfo": "Kò sí PATH_INFO.\nẸ̀rọ-ìwọ̀fà yín kò létò láti mú dátà yìí kọjá.\nO ṣe é ṣe kó jẹ́ ti CGI tí kò ní ìtìlẹ́yìn fún img_auth.\nẸ wo [https://www.mediawiki.org/wiki/Manual:Image_Authorization àṣẹ àwòrán.]",
+       "img-auth-nopathinfo": "Kò sí PATH_INFO.\nẸ̀rọ-ìwọ̀fà yín kò létò láti mú dátà yìí kọjá.\nO ṣe é ṣe kó jẹ́ ti CGI tí kò ní ìtìlẹ́yìn fún img_auth.\nẸ wo [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization àṣẹ àwòrán.]",
        "img-auth-notindir": "Ojúọ̀nà tí ẹ tọrọ kò ní nínú àpò ìrùsókè alátòsílẹ̀.",
        "img-auth-badtitle": "Àkọlé oníìbámu kò ṣe é dá láti \"$1\".",
        "img-auth-nologinnWL": "Ẹ kò tíì wọlẹ́ bẹ́ẹ̀sìni \"$1\" kò sí nínú àtòjọ funfun.",
        "log-title-wildcard": "Wá àkọlé tó bẹ̀rẹ̀ pẹ̀lú ìkọ yìí",
        "showhideselectedlogentries": "Ìfihàn/ìbòmọ́lẹ̀ àwọn ohun inú àkọọ́lẹ̀ àṣàyàn",
        "allpages": "Gbogbo ojúewé",
-       "alphaindexline": "$1 dé $2",
        "nextpage": "Ojúewé tókàn ($1)",
        "prevpage": "Ojúewé tókọjá ($1)",
        "allpagesfrom": "Ìfihàn àwọn ojúewé nípa bíbẹ̀rẹ̀ láti:",
        "watchlist-details": "{{PLURAL:$1|Ojúewé $1|Àwọn ojúewé $1}} ló wà nínú ìmójútó yín, tí a kò bá ka àwọn ojúewé ọ̀rọ̀.",
        "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'''",
-       "watchmethod-recent": "únwo àwọn àtúnṣe tuntun fún àwọn ojúewé mímójútó",
-       "watchmethod-list": "únwo àwọn ojúewé mímójútó fún àwọn àtúnṣe tuntun",
-       "watchlistcontains": "Àwọn ìmójútó yín ní {{PLURAL:$1|ojúewé|àwọn ojúewé}} $1 nínú.",
-       "iteminvalidname": "Ìṣòro wà pẹ̀lú '$1', orúkọ àìtọ́...",
        "wlshowlast": "Ìfihàn wákàtí $1 sẹ́yìn ọjọ́ $2 sẹ́yìn $3",
        "watchlist-options": "Àṣàyàn ìmójútọ́",
        "watching": "Ó ún mójútó...",
        "enotif_lastvisited": "Ẹ wo $1 fún gbogbo àwọn àtúnṣe látìgbà ìbẹ̀wò yín gbẹ̀yìn.",
        "enotif_lastdiff": "Ẹ wo $1 láti wo àtúnṣe yìí.",
        "enotif_anon_editor": "oníṣe aláìlórúkọ $1",
-       "enotif_body": "$WATCHINGUSERNAME ọ̀wọ́n,\n\n$PAGEINTRO $NEWPAGE\n\nÀkótán olùtúnṣe: $PAGESUMMARY $PAGEMINOREDIT\n\nÌpàdé pẹ̀lú olùtúnṣe:\nlẹ́tà: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nKò ní sí ìfitọ́nilétí míràn mọ́ fún àyípadà ọjọ́ọwájú àyàfi tí ẹ bá ṣàbẹ̀wò ojúewé yìí.\nẸ sì tún le ṣe àtúntò àwọn àmì ìfitọ́nilétí fún gbogbo àwọn ojúewé mímójútó nínú ìmójútó yín.\n\nSístẹ́mù ìfitọ́nilétí {{SITENAME}} yín \n\n---\nLáti ṣàyípadà ìtò ìṣeàkíyèsí e-mail yín, ẹ lọ sí\n{{canonicalurl:{{#special:Preferences}}}}\n\nLáti ṣèyípadà ìtò ìmójútó yín, ẹ lọ sí\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nLáti ṣèparẹ́ ojúewé náà kúrò nínú ìmjútó yín, ẹ lọ sí\n$UNWATCHURL\n\nFún ìrànwọ́ àti ìbérè:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "$WATCHINGUSERNAME ọ̀wọ́n,\n\n$PAGEINTRO $NEWPAGE\n\nÀkótán olùtúnṣe: $PAGESUMMARY $PAGEMINOREDIT\n\nÌpàdé pẹ̀lú olùtúnṣe:\nlẹ́tà: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nKò ní sí ìfitọ́nilétí míràn mọ́ fún àyípadà ọjọ́ọwájú àyàfi tí ẹ bá ṣàbẹ̀wò ojúewé yìí.\nẸ sì tún le ṣe àtúntò àwọn àmì ìfitọ́nilétí fún gbogbo àwọn ojúewé mímójútó nínú ìmójútó yín.\n\nSístẹ́mù ìfitọ́nilétí {{SITENAME}} yín \n\n---\nLáti ṣàyípadà ìtò ìṣeàkíyèsí e-mail yín, ẹ lọ sí\n{{canonicalurl:{{#special:Preferences}}}}\n\nLáti ṣèyípadà ìtò ìmójútó yín, ẹ lọ sí\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nLáti ṣèparẹ́ ojúewé náà kúrò nínú ìmjútó yín, ẹ lọ sí\n$UNWATCHURL\n\nFún ìrànwọ́ àti ìbérè:\n$HELPPAGE",
        "created": "dídá",
        "changed": "títúnṣẹ",
        "deletepage": "Ìparẹ́ ojúewé",
        "blockip": "Dínà oníṣe",
        "blockip-legend": "Ìdínà oníṣẹ",
        "blockiptext": "Ẹ lo fọ́ọ̀mù ìsàlẹ̀ láti dínà ìle kọ láti ọ̀dọ̀ àdírẹ́ẹ̀sì IP pàtó kan tàbí orúkọ oníṣe.\nẸyí gbọ́dọ̀ jẹ́ síṣe láti dínà ìṣèbàjẹ́ nìkan, àtí gẹ́gẹ́bí [[{{MediaWiki:Policy-url}}|ètò ìsiṣẹ́]].\nẸ sọ ìdí pàtó nísàlẹ̀ (fún àpẹrẹ, ìtọ́kasí àwọn ojúewé pàtó tí wọ́n jẹ́ bíbàjẹ́).",
-       "ipadressorusername": "Àdírẹ́ẹ̀sì IP tàbí orúkọ oníṣe:",
+       "ipaddressorusername": "Àdírẹ́ẹ̀sì IP tàbí orúkọ oníṣe:",
        "ipbexpiry": "Ìwásópin:",
        "ipbreason": "Ìdíẹ̀:",
        "ipbreason-dropdown": "*Àwọn ìdí fún ìdínà\n** Àròyé tí kò jẹ́ òtítọ́\n** Yíyọ àkóónú kúrò nínú ojúewé\n** Kíkọ àjápọ̀ sí àwọn ibi tí kò ní ìbámu mọ́ ojúewé\n** Ìkọkúkọ sínú ojúewé\n** Iwùwà ìpayà sí ẹlòmíràn\n** Ìlòkulò ọ̀pọ̀lọpọ̀ àpamọ́\n** Lílo orúkọ oníṣe tí kò tọ́",
        "tooltip-undo": "\"Dápadà\" ṣèyíṣẹ́yìn àtúnṣe yìí, yíò ṣí fọ́ọ̀mù àtúnṣe bíi àkọ́bojúwò. Ó gba ààyè láti sọ ìdí nínú àkótán.",
        "tooltip-preferences-save": "Ìmúpamọ́ àwọn ìfẹ́ràn",
        "tooltip-summary": "Ẹ kọ àkótán kúkúrú kan",
-       "notacceptable": "Ẹ̀rọ-ìpèsè wiki kò le pèsè dátà irú èyí tí ẹ̀rọ-ìbárà yín le kà.",
        "anonymous": "{{PLURAL:$1|Oníṣe|Àwọn oníṣe}} aláìlórúkọ ti {{SITENAME}}",
        "siteuser": "Oníṣe $1 lórí {{SITENAME}}",
        "anonuser": "Oníṣe aláìlórúkọ $1 {{SITENAME}}",
        "newimages-summary": "Ojúewé pàtàkì yìí ṣe àfihàn àwọn fáìlì ìrùsókè gbẹ̀yìn.",
        "newimages-legend": "Ajọ̀",
        "newimages-label": "Orúkọ faili (tàbí apá kan rẹ̀):",
-       "showhidebots": "(àwọn bot $1)",
        "noimages": "Kò sí àwòrán.",
        "ilsubmit": "Ṣàwárí",
        "bydate": "bíi ọjọ́ọdún",
        "autosumm-replace": "Dípò àkóónú pẹ̀lú \"$1\"",
        "autoredircomment": "Ti ṣàtunjúwe ojúewé sí [[$1]]",
        "autosumm-new": "Ṣ'èdá ojúewé pẹ̀lú \"$1\"",
-       "livepreview-loading": "Óúnbọ̀wá...",
-       "livepreview-ready": "Úngbéyọ... Ti ṣetán!",
-       "livepreview-failed": "Àkọ́yẹ̀wò ẹsẹ̀kẹsẹ̀ kùnà!\nẸ lo àkóyẹ̀wò onídéédé.",
-       "livepreview-error": "Ó kùnà láti sorapọ̀: $1 \"$2\".\nẸ lo àkóyẹ̀wò onídéédé.",
        "lag-warn-normal": "Àwọn àtúnṣe tí kò pẹ́ ju {{PLURAL:$1|ìṣẹ́jú-àáyá|ìṣẹ́jú-àáyá}} $1 lọ le mọ́ hàn nínú àtòjọ yìí.",
-       "watchlistedit-numitems": "Ìmójútó yín ní {{PLURAL:$1|àkọlé 1|àkọlé $1}}, láìka àwọn ojúewé ọ̀rọ̀.",
-       "watchlistedit-noitems": "Ìmójútó yín kò ní àwọn àkọlé kankan.",
        "watchlistedit-normal-title": "Àtúnṣe ìmójútó",
        "watchlistedit-normal-legend": "Ìyọkúrò àwọn àkọlé láti inú ìmójútó",
        "watchlistedit-normal-submit": "Ìyọkúrò àwọn àkọlé",
        "compare-invalid-title": "Àkọlè tí ẹ nàkasí kò tọ́.",
        "compare-title-not-exists": "Àkọlé tí ẹ tọ́kasí kò sí.",
        "compare-revision-not-exists": "Àtúnyẹ̀wò tí ẹ tọ́kasí kò sí.",
-       "dberr-header": "Wiki yìí ní ìsòro",
        "dberr-problems": "Àforìjì! Ibiìtakùn yìí únkojú ìsòro ìṣìṣẹ́ẹ̀rọ.",
        "dberr-again": "Ẹ mú sùúrù fún ìṣẹ́jú díẹ̀ kí ẹ tó tún ṣe ìrùsókè.",
        "dberr-info": "(Kò le farakan ẹ̀rọ-ìpèsè ibùdó dátà: $1)",
index a50176f..4c37bd6 100644 (file)
@@ -15,7 +15,9 @@
                        "Wong128hk",
                        "Xiaomingyan",
                        "Yfdyh000",
-                       "Cwek"
+                       "Cwek",
+                       "아라",
+                       "Ktchankt"
                ]
        },
        "tog-underline": "連結加底線:",
        "editfont-monospace": "固定間距字型",
        "editfont-sansserif": "無腳字型",
        "editfont-serif": "有腳字型",
-       "sunday": "星期日",
-       "monday": "星期一",
-       "tuesday": "星期二",
-       "wednesday": "星期三",
-       "thursday": "星期四",
-       "friday": "星期五",
-       "saturday": "星期六",
+       "sunday": "禮拜日",
+       "monday": "禮拜一",
+       "tuesday": "禮拜二",
+       "wednesday": "禮拜三",
+       "thursday": "禮拜四",
+       "friday": "禮拜五",
+       "saturday": "禮拜六",
        "sun": "日",
        "mon": "一",
        "tue": "二",
        "december-date": "12月$1號",
        "pagecategories": "屬於$1類",
        "category_header": "\"$1\" 類中嘅版",
-       "subcategories": "類",
+       "subcategories": "類",
        "category-media-header": " \"$1\" 類嘅媒體",
-       "category-empty": "''呢類無任何版或媒體檔。''",
+       "category-empty": "<em>呢類無任何版或媒體檔。</em>",
        "hidden-categories": "屬於$1隱類",
        "hidden-category-category": "隱藏類",
        "category-subcat-count": "{{PLURAL:$2|呢類淨係有下面嘅細類。|呢類有下面嘅$1個細類,總共有$2類。}}",
-       "category-subcat-count-limited": "å\91¢å\80\8bé¡\9eå\88¥å\85¥é\82\8aæ\9c\89$1å\80\8bç´°é¡\9eå\88¥。",
+       "category-subcat-count-limited": "å\91¢å\80\8bé¡\9eå\85¥é\82\8aæ\9c\89$1å\80\8bç´°é¡\9e。",
        "category-article-count": "{{PLURAL:$2|呢類淨係有下面嘅版。|呢類有下面嘅$1版,總共有$2版。}}",
-       "category-article-count-limited": "å\91¢å\80\8bé¡\9eå\88¥å\85¥é\82\8aæ\9c\89$1ç\89\88ã\80\82",
+       "category-article-count-limited": "呢個類入邊有$1版。",
        "category-file-count": "{{PLURAL:$2|呢類淨係有下面嘅檔案。|呢類有下面嘅$1個檔案,總共有$2個檔案。}}",
-       "category-file-count-limited": "å\91¢å\80\8bé¡\9eå\88¥å\85¥é\82\8aæ\9c\89$1å\80\8bæª\94æ¡\88ã\80\82",
+       "category-file-count-limited": "呢個類入邊有$1個檔案。",
        "listingcontinuesabbrev": "續",
        "index-category": "做咗索引嘅版",
        "noindex-category": "未做索引嘅版",
        "faq": "FAQ",
        "faqpage": "Project:FAQ",
        "vector-action-addsection": "加主題",
-       "vector-action-delete": "å\88ªé\99¤",
-       "vector-action-move": "移動",
+       "vector-action-delete": "å\89·èµ°",
+       "vector-action-move": "",
        "vector-action-protect": "保護",
-       "vector-action-undelete": "å\8e»ç\9d\87å\88ªé\99¤å\92\97å\98\85é \81é\9d¢",
+       "vector-action-undelete": "å\8f\96æ¶\88å\89·èµ°",
        "vector-action-unprotect": "解除保護",
-       "vector-view-create": "建ç«\8b",
-       "vector-view-edit": "編輯",
+       "vector-view-create": "é\96\8b",
+       "vector-view-edit": "",
        "vector-view-history": "睇吓歷史",
        "vector-view-view": "閱",
        "vector-view-viewsource": "睇吓原始碼",
        "actions": "動作",
        "namespaces": "空間名",
        "variants": "變換",
-       "errorpagetitle": "錯誤",
+       "errorpagetitle": "出錯",
        "returnto": "返去$1 。",
        "tagline": "出自{{SITENAME}}",
-       "help": "幫",
+       "help": "幫",
        "search": "搵嘢",
        "searchbutton": "搵嘢",
        "go": "去",
        "print": "印",
        "view": "去睇",
        "edit": "改",
-       "create": "建ç«\8b",
-       "editthispage": "編輯呢頁",
+       "create": "é\96\8b",
+       "editthispage": "改呢版",
        "create-this-page": "建立呢頁",
-       "delete": "å\88ªé\99¤",
-       "deletethispage": "å\88ªé\99¤å\91¢é \81",
-       "undelete_short": "å\8f\8då\88ªé\99¤$1次修改",
+       "delete": "å\89·èµ°",
+       "deletethispage": "å\89·èµ°å\91¢ç\89\88",
+       "undelete_short": "å\8f\96æ¶\88å\89·èµ°$1次修改",
        "viewdeleted_short": "去睇$1次刪除咗嘅修改",
        "protect": "保護",
        "protect_change": "改",
        "readonly_lag": "當從伺服器追緊主伺服器時,資料庫會自動被鎖",
        "internalerror": "內部錯誤",
        "internalerror_info": "內部錯誤: $1",
-       "fileappenderrorread": "當附加嗰陣讀唔到 \"$1\"。",
-       "fileappenderror": "附加唔到 \"$1\" 去 \"$2\"。",
        "filecopyerror": "檔案 \"$1\" 抄唔到去 \"$2\"。",
        "filerenameerror": "檔案 \"$1\" 唔改得做 \"$2\"。",
        "filedeleteerror": "檔案 \"$1\" 唔刪得。",
        "directorycreateerror": "目錄 \"$1\" 開唔到。",
        "filenotfound": "檔案 \"$1\" 搵唔到。",
-       "fileexistserror": "檔案 \"$1\" 寫唔到: 檔案已經存在",
        "unexpected": "意外數值。 \"$1\"=\"$2\"。",
        "formerror": "錯誤:表格交唔到",
        "badarticleerror": "喺呢頁唔可以做呢個動作。",
        "savearticle": "儲存呢頁",
        "preview": "預覽",
        "showpreview": "顯示預覽",
-       "showlivepreview": "實時預覽",
        "showdiff": "顯示差異",
        "anoneditwarning": "'''警告:'''你重未登入。你嘅 IP 位址會喺呢個頁面嘅修訂歷史中記錄落嚟。",
        "anonpreviewwarning": "''你重未登入,你嘅 IP 位址會喺呢個頁面嘅修訂歷史中記錄落嚟。''",
        "search-nonefound": "響個查詢度無結果配合。",
        "powersearch-legend": "進階搵嘢",
        "powersearch-ns": "喺以下嘅空間名度搵:",
-       "powersearch-redir": "彈去清單",
        "powersearch-togglelabel": "检查:",
        "powersearch-toggleall": "全部",
        "powersearch-togglenone": "無",
        "prefs-advancedsearchoptions": "進階選項",
        "prefs-advancedwatchlist": "進階選項",
        "prefs-displayrc": "顯示選項",
-       "prefs-displaysearchoptions": "顯示選項",
        "prefs-displaywatchlist": "顯示選項",
        "prefs-diffs": "差異",
        "email-address-validity-valid": "電郵地址睇嚟有效",
        "recentchanges-label-unpatrolled": "呢次編輯重未巡查過",
        "recentchanges-legend-newpage": "$1 - 新版",
        "rcnotefrom": "以下係自'''$2'''嘅更改(顯示到'''$1''')。",
-       "rclistfrom": "顯示由$1嘅新更改",
+       "rclistfrom": "顯示由$3 $2嘅新更改",
        "rcshowhideminor": "$1小編輯",
        "rcshowhidebots": "$1機械人",
        "rcshowhideliu": "$1登入咗嘅用戶",
        "uploadstash-errclear": "清除檔案唔成功。",
        "uploadstash-refresh": "更新檔案清單",
        "img-auth-accessdenied": "拒絕通行",
-       "img-auth-nopathinfo": "PATH_INFO唔見咗。\n你嘅伺服器重未設定呢個資料。\n佢可能係CGI為本,唔支援img_auth。\n睇吓 https://www.mediawiki.org/wiki/Manual:Image_Authorization。",
+       "img-auth-nopathinfo": "PATH_INFO唔見咗。\n你嘅伺服器重未設定呢個資料。\n佢可能係CGI為本,唔支援img_auth。\n睇吓 https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization。",
        "img-auth-notindir": "所請求嘅路徑唔響個已經設定咗嘅上載目錄。",
        "img-auth-badtitle": "唔能夠由\"$1\"整一個有效標題。",
        "img-auth-nologinnWL": "你而家無登入,\"$1\"唔響個白名單度。",
        "watchlist-details": "唔計討論頁,有 $1 版響你個監視清單度。",
        "wlheader-enotif": "電子郵件通知已經啟用。",
        "wlheader-showupdated": "'''粗體字'''嘅頁響你上次嚟之後被人改過",
-       "watchmethod-recent": "睇緊最近修改中有邊頁監視緊",
-       "watchmethod-list": "睇緊被監視頁有乜新修改",
-       "watchlistcontains": "你嘅監視清單裏面有$1頁。",
-       "iteminvalidname": "項目'$1'出錯,無效嘅名稱...",
        "wlshowlast": "顯示最近 $1 個鐘 $2 日 $3 嘅修改",
        "watchlist-options": "監視清單選項",
        "watching": "監視緊...",
        "enotif_lastvisited": "你上次視察以嚟嘅修改請睇$1。",
        "enotif_lastdiff": "睇$1去睇吓呢一次更改。",
        "enotif_anon_editor": "匿名用戶$1",
-       "enotif_body": "$WATCHINGUSERNAME先生/小姐你好,\n\n{{SITENAME}}嘅頁面$PAGETITLE已經由$PAGEEDITOR喺$PAGEEDITDATE$CHANGEDORCREATED,現時修訂請睇$PAGETITLE_URL。\n\n$NEWPAGE\n\n編輯者留低嘅撮要:$PAGESUMMARY $PAGEMINOREDIT\n\n聯絡呢個編輯者:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\n今後唔會再有進一步嘅通知,除非你再來呢版。你亦都可以喺你嘅監視清單度復位所有監視頁面嘅通知標誌。\n\n            {{SITENAME}}通知系統\n\n--\n要修改你嘅監視清單設定,請睇{{canonicalurl:{{#special:EditWatchlist}}}}\n\n要刪除你嘅監視清單度嘅呢一版,請睇$UNWATCHURL\n\n回饋及更多幫助:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "$WATCHINGUSERNAME先生/小姐你好,\n\n{{SITENAME}}嘅頁面$PAGETITLE已經由$PAGEEDITOR喺$PAGEEDITDATE$CHANGEDORCREATED,現時修訂請睇$PAGETITLE_URL。\n\n$NEWPAGE\n\n編輯者留低嘅撮要:$PAGESUMMARY $PAGEMINOREDIT\n\n聯絡呢個編輯者:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\n今後唔會再有進一步嘅通知,除非你再來呢版。你亦都可以喺你嘅監視清單度復位所有監視頁面嘅通知標誌。\n\n            {{SITENAME}}通知系統\n\n--\n要修改你嘅監視清單設定,請睇{{canonicalurl:{{#special:EditWatchlist}}}}\n\n要刪除你嘅監視清單度嘅呢一版,請睇$UNWATCHURL\n\n回饋及更多幫助:\n$HELPPAGE",
        "created": "建立過",
        "changed": "修改過",
        "deletepage": "刪除頁面",
        "blockip": "封鎖用戶",
        "blockip-legend": "封鎖用戶",
        "blockiptext": "使用以下嘅表格嚟去阻止指定嘅IP地址或用戶名嘅寫權限。\n僅當僅當為咗避免有版畀人惡意破壞嘅時候先可以使用,而且唔可以違反[[{{MediaWiki:Policy-url}}|政策]]。\n喺下面填寫阻止嘅確切原因(比如:引用咗某啲已經破壞咗嘅頁面)。",
-       "ipadressorusername": "IP地址或用戶名:",
+       "ipaddressorusername": "IP地址或用戶名:",
        "ipbexpiry": "期限:",
        "ipbreason": "原因:",
        "ipbreason-dropdown": "*共用封鎖原因\n** 插入錯嘅資料\n** 響頁面度拎走\n** 亂加入外部連結\n** 響頁度加入冇意義嘅嘢\n** 嚇人/騷擾\n** 濫用多個戶口\n** 唔能夠接受嘅用戶名",
        "monobook.js": "/* 響每一次個頁面載入時,用 Monobook 畫面嘅用戶都會載入呢度任何嘅JavaScript */",
        "modern.js": "/* 響每一次個頁面載入時,用摩登畫面嘅用戶都會載入呢度任何嘅JavaScript */",
        "vector.js": "/* 響每一次個頁面載入時,用域達畫面嘅用戶都會載入呢度任何嘅JavaScript */",
-       "notacceptable": "呢個 wiki 伺服器唔能夠畀一個可以讀嘅資料畀個客。",
        "anonymous": "{{SITENAME}}嘅匿名{{PLURAL:$1|用戶|用戶}}",
        "siteuser": "{{SITENAME}}嘅用戶$1",
        "anonuser": "{{SITENAME}}嘅匿名用戶$1",
        "newimages-summary": "呢個特別頁顯示最後上載咗嘅檔案。",
        "newimages-legend": "過濾",
        "newimages-label": "檔名(或佢嘅一部份):",
-       "showhidebots": "($1 機械人)",
        "noimages": "冇嘢去睇。",
        "ilsubmit": "搵嘢",
        "bydate": "以時間",
        "autosumm-replace": "用「$1」取代內容",
        "autoredircomment": "跳緊轉呢版到[[$1]]",
        "autosumm-new": "開咗新版「$1」",
-       "livepreview-loading": "載入緊…",
-       "livepreview-ready": "載入緊… 預備好!",
-       "livepreview-failed": "實時預覽失敗!\n試吓標準預覽。",
-       "livepreview-error": "連接失敗: $1 \"$2\"。\n試吓標準預覽。",
        "lag-warn-normal": "新過$1秒嘅更改可能唔會響呢個表度顯示。",
        "lag-warn-high": "由於資料庫嘅過度延遲,新過$1秒嘅更改可能唔會響呢個表度顯示。",
-       "watchlistedit-numitems": "你嘅監視清單總共有$1個標題,當中唔包括對話版。",
-       "watchlistedit-noitems": "你嘅監視清單並無標題。",
        "watchlistedit-normal-title": "編輯監視清單",
        "watchlistedit-normal-legend": "響監視清單度拎走",
        "watchlistedit-normal-explain": "響你張監視清單度嘅標題響下面度顯示。要拎走一個標題,響佢前面剔一剔,跟住要撳『{{int:Watchlistedit-normal-submit}}』。你亦都可以[[Special:EditWatchlist/raw|編輯原始清單]]。",
        "compare-rev1": "修訂1",
        "compare-rev2": "修訂2",
        "compare-submit": "比較",
-       "dberr-header": "呢個 wiki 出咗問題",
        "dberr-problems": "對唔住!呢一版出現咗一啲技術性問題。",
        "dberr-again": "試吓等多幾分種然後開試。",
        "dberr-info": "(唔能夠連繫個資料伺服器: $1)",
index 881547e..ff2b119 100644 (file)
@@ -2,7 +2,8 @@
        "@metadata": {
                "authors": [
                        "NJ",
-                       "Ooswesthoesbes"
+                       "Ooswesthoesbes",
+                       "아라"
                ]
        },
        "tog-underline": "Lienks onderstreepn:",
@@ -15,7 +16,6 @@
        "tog-showtoolbar": "Bewerkiengswerkbalke weerheven (JavaScript vereist)",
        "tog-editondblclick": "Dubbelklikkn voe bewerkn (JavaScript vereist)",
        "tog-editsectiononrightclick": "Bewerken van deêlpahina's meulijk maeken mie een rechtermuusklik op een tussenkopje (JavaScript vereist)",
-       "tog-rememberpassword": "Anmeldhehevens ontouwen (maximaal $1 {{PLURAL:$1|dag|daege}})",
        "tog-watchcreations": "Pahina's die ak anmik automaotisch volhen",
        "tog-watchdefault": "Pahina's die ak bewerk automaotisch volhen",
        "tog-watchmoves": "Pahina's die ak verplekke automaotisch volhen",
        "filedeleteerror": "Bestand “$1” kon nie verwiederd worn.",
        "directorycreateerror": "Map “$1” kon nie anemikt worn.",
        "filenotfound": "Bestand “$1” wier nie evon'n.",
-       "fileexistserror": "Schrieven ni bestand “$1” onmeuhlijk: bestand besti a",
        "unexpected": "Onverwachte waerde: \"$1\"=\"$2\".",
        "formerror": "Fout: formulier kon nie worn verzon'n",
        "badarticleerror": "Dit kan mee deêze bladzie nie gedaen ore.",
        "savearticle": "Bewaer bladzie",
        "preview": "Naekieken",
        "showpreview": "Naekieke",
-       "showlivepreview": "Bewerkieng ter controle bekieken",
        "showdiff": "Bekiek veranderiengen",
        "anoneditwarning": "'''Waerschuwienge:''' Je bin nie angemolde. Je IP-adres komt in de bewerkiengsgeschiedenisse van deêze bladzie te staen.",
        "missingsummary": "'''Herinnerieng:''' je ei hin saemenvattieng opeheven voe je bewerkieng. A je nog een keêr op ''Pagina opslaen'' klik wor de bewerkieng zonder saemenvattieng opeslogen.",
        "recentchanges-label-bot": "Deêze bewarkienge is uutgevoerd deur 'n bot",
        "recentchanges-label-unpatrolled": "Deêze bewarkienge is nog nie gecontroleerd",
        "rcnotefrom": "Wiezigiengen sins '''$2''' (mie een maximum van '''$1''' wiezigiengen).",
-       "rclistfrom": "Bekiek de wiezigingen sins $1",
+       "rclistfrom": "Bekiek de wiezigingen sins $3 $2",
        "rcshowhideminor": "$1 kleine bewerkiengen",
        "rcshowhidebots": "bots $1",
        "rcshowhideliu": "$1 angemelde gebrukers",
        "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.",
-       "watchlistcontains": "Uw volglieste bevat $1 {{PLURAL:$1|bladzie|bladzies}}.",
        "wlshowlast": "Laetste $1 uur, $2 daegen bekieken ($3)",
        "watchlist-options": "Opties vò volglieste",
        "actioncomplete": "Actie uutgevoerd",
index b186e78..16c064a 100644 (file)
@@ -73,7 +73,9 @@
                        "燃玉",
                        "范",
                        "阿pp",
-                       "Hudafu"
+                       "Hudafu",
+                       "아라",
+                       "Mywood"
                ]
        },
        "tog-underline": "链接下划线:",
        "searcharticle": "前往",
        "history": "页面历史",
        "history_short": "历史",
-       "updatedmarker": "æ\88\91ä¸\8a次访é\97®å\90\8eç\9a\84ä¿®æ\94¹",
+       "updatedmarker": "æ\9b´æ\96°äº\8eæ\88\91ä¸\8a次访é\97®å\90\8e",
        "printableversion": "打印版本",
        "permalink": "永久链接",
        "print": "打印",
        "jumptonavigation": "导航",
        "jumptosearch": "搜索",
        "view-pool-error": "对不起,服务器当前正超负荷运转。过多用户正尝试查看本页面。请在再次尝试访问本页面前稍等片刻。\n\n$1",
+       "generic-pool-error": "对不起,服务器目前超负荷运转。太多用户尝试查看本页面。请稍等片刻再重新尝试。",
        "pool-timeout": "等待锁超时",
        "pool-queuefull": "请求队列已满",
        "pool-errorunknown": "未知错误",
        "sort-descending": "降序",
        "sort-ascending": "升序",
        "nstab-main": "页面",
-       "nstab-user": "用户页",
+       "nstab-user": "用户页",
        "nstab-media": "媒体文件页面",
        "nstab-special": "特殊页面",
        "nstab-project": "项目页面",
        "readonly_lag": "附属数据库服务器正在将缓存更新到主服务器上,数据库已被自动锁定",
        "internalerror": "内部错误",
        "internalerror_info": "内部错误:$1",
-       "fileappenderrorread": "当附加时无法读取\"$1\"。",
-       "fileappenderror": "无法将“$1”附加到“$2”。",
        "filecopyerror": "无法将文件“$1”复制到“$2”。",
        "filerenameerror": "无法将文件“$1”重命名为“$2”。",
        "filedeleteerror": "无法删除文件“$1”。",
        "directorycreateerror": "无法创建目录“$1”。",
        "filenotfound": "找不到文件“$1”。",
-       "fileexistserror": "无法写入文件“$1”:文件已存在",
        "unexpected": "非正常值:“$1”=“$2”。",
        "formerror": "错误:无法提交表单",
        "badarticleerror": "无法在此页进行该操作。",
        "userlogin-helplink2": "登录帮助",
        "userlogin-loggedin": "您已经以{{GENDER:$1|$1}}的身份登录。使用下面的表格以其他用户的身份登录。",
        "userlogin-createanother": "创建另一个账户",
-       "createacct-join": "请在下面输入你的信息。",
-       "createacct-another-join": "在下方输入新帐户信息。",
        "createacct-emailrequired": "电子邮件地址",
        "createacct-emailoptional": "电子邮件地址(可选)",
        "createacct-email-ph": "请输入你的电子邮件地址",
        "savearticle": "保存页面",
        "preview": "预览",
        "showpreview": "显示预览",
-       "showlivepreview": "实时预览",
        "showdiff": "显示更改",
        "anoneditwarning": "<strong>警告:</strong>您没有登录。您的IP地址将被记录在该页面的编辑历史中。",
        "anonpreviewwarning": "''你没有登录。保存会记录你的IP地址于该页面的编辑历史中。''",
        "templatesused": "该页面使用的{{PLURAL:$1|模板}}:",
        "templatesusedpreview": "本预览使用的{{PLURAL:$1|模板}}:",
        "templatesusedsection": "该段落使用的{{PLURAL:$1|模板}}:",
-       "template-protected": "(保护)",
+       "template-protected": "(保护)",
        "template-semiprotected": "(半保护)",
        "hiddencategories": "该页面属于$1个隐藏分类:",
        "edittools": "<!-- 这里的文字将显示在编辑和上传表格下面。 -->",
        "edit-gone-missing": "不能更新页面。\n它可能刚刚被删除。",
        "edit-conflict": "编辑冲突。",
        "edit-no-change": "因为没有文字更改,你的编辑已被忽略。",
-       "postedit-confirmation": "你的编辑已保存。",
+       "postedit-confirmation-created": "页面已创建。",
+       "postedit-confirmation-restored": "页面已创建。",
+       "postedit-confirmation-saved": "你的编辑已保存。",
        "edit-already-exists": "不可以建立一个新页面。\n它已经存在。",
        "defaultmessagetext": "默认消息文本",
        "content-failed-to-parse": "未能将 $2 内容转换为 $1:$3",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
        "expensive-parserfunction-warning": "<strong>警告:</strong>这个页面有太多高昂的语法功能调用。\n\n它应该少过$2次呼叫,现在有$1次呼叫。",
-       "expensive-parserfunction-category": "有过多高开销函数解析器调用的页面",
+       "expensive-parserfunction-category": "有过多高开销解析器函数调用的页面",
        "post-expand-template-inclusion-warning": "'''警告:'''包含模板大小过大。\n一些模板将不会包含。",
        "post-expand-template-inclusion-category": "模板包含大小超限的页面",
        "post-expand-template-argument-warning": "'''警告:'''本页面包含至少一个模板参数有过大扩展大小。这些参数会被略过。",
        "parser-template-loop-warning": "检查到模板循环:[[$1]]",
        "parser-template-recursion-depth-warning": "模板递归深度越限($1)",
        "language-converter-depth-warning": "字词转换器深度越限($1)",
-       "node-count-exceeded-category": "页面的节点数超出限制",
+       "node-count-exceeded-category": "节点数超限的页面",
+       "node-count-exceeded-category-desc": "节点数溢出页面的分类。",
        "node-count-exceeded-warning": "页面超出了节点数",
-       "expansion-depth-exceeded-category": "扩展深度超出限制的页面",
+       "expansion-depth-exceeded-category": "展开深度超限的页面",
+       "expansion-depth-exceeded-category-desc": "这是超出拓展深度页面的分类。",
        "expansion-depth-exceeded-warning": "页面超过了扩展深度",
        "parser-unstrip-loop-warning": "检测到回圈",
        "parser-unstrip-recursion-limit": "递归超过限制 ($1)",
        "revertmerge": "解除合并",
        "mergelogpagetext": "下面是最近的页面历史合并的列表。",
        "history-title": "“$1”的版本历史",
-       "difference-title": "“$1”版本间的差异",
+       "difference-title": "â\80\9c$1â\80\9dç\9a\84ç\89\88æ\9c¬é\97´ç\9a\84å·®å¼\82",
        "difference-title-multipage": "页面“$1”与“$2”之间的差异",
        "difference-multipage": "(页面间的差异)",
        "lineno": "第$1行:",
        "searchmenu-exists": "'''本wiki上有名为“[[:$1]]”的页面。'''",
        "searchmenu-new": "<strong>在本Wiki上新建名为“[[:$1]]”的页面!</strong>{{PLURAL:$2|0=|另请查看您的搜索找的结果。|另请查看搜索结果。}}",
        "searchprofile-articles": "内容页面",
-       "searchprofile-project": "帮助和项目页面",
        "searchprofile-images": "多媒体",
        "searchprofile-everything": "全部",
        "searchprofile-advanced": "高级",
        "searchprofile-articles-tooltip": "在$1中搜索",
-       "searchprofile-project-tooltip": "在$1中搜索",
        "searchprofile-images-tooltip": "搜索文件",
        "searchprofile-everything-tooltip": "搜索所有内容(包括讨论页面)",
        "searchprofile-advanced-tooltip": "在自定义名字空间中搜索",
        "search-nonefound": "找不到和查询相匹配的结果。",
        "powersearch-legend": "高级搜索",
        "powersearch-ns": "搜索名字空间:",
-       "powersearch-redir": "列出重定向",
        "powersearch-togglelabel": "选择:",
        "powersearch-toggleall": "全选",
        "powersearch-togglenone": "全不选",
        "skin-preview": "预览",
        "datedefault": "默认格式",
        "prefs-labs": "实验室特性",
-       "prefs-user-pages": "用户页",
+       "prefs-user-pages": "用户页",
        "prefs-personal": "用户资料",
        "prefs-rc": "最近更改",
        "prefs-watchlist": "监视列表",
        "prefs-emailconfirm-label": "电子邮件确认:",
        "youremail": "电子邮件:",
        "username": "{{GENDER:$1|用户名}}:",
-       "uid": "{{GENDER:$1|用户}}ID:",
        "prefs-memberingroups": "{{GENDER:$2|用户}}{{PLURAL:$1|组}}:",
        "prefs-registration": "注册时间:",
        "yourrealname": "真实姓名:",
        "badsig": "错误的原始签名。请检查HTML标签。",
        "badsiglength": "签名过长。请不超过$1个字符。",
        "yourgender": "您希望使用什么性别称呼?",
-       "gender-unknown": "我不愿意指明(被称为“他/她”)",
+       "gender-unknown": "我不愿意指明",
        "gender-male": "他",
        "gender-female": "她",
-       "prefs-help-gender": "该设置为可选项。软件根据该值在称呼您及对他人提及您时使用适当的语法性别。该信息会被公开。",
+       "prefs-help-gender": "该设置为可选项。软件根据该值在称呼您及对他人提及您时使用适当的语法性别。该信息会被公开。",
        "email": "电子邮件",
        "prefs-help-realname": "真实姓名是选填项目。如果你选择提供它,它将会用于贡献署名。",
        "prefs-help-email": "电子邮件是可选项,但是在您忘记密码时很有用。",
        "prefs-advancedsearchoptions": "高级选项",
        "prefs-advancedwatchlist": "高级选项",
        "prefs-displayrc": "显示",
-       "prefs-displaysearchoptions": "显示",
        "prefs-displaywatchlist": "显示",
        "prefs-tokenwatchlist": "密钥",
        "prefs-diffs": "差异对比",
        "right-move": "移动页面",
        "right-move-subpages": "移动页面及其子页面",
        "right-move-rootuserpages": "移动根用户页面",
+       "right-move-categorypages": "移动分类页面",
        "right-movefile": "移动文件",
        "right-suppressredirect": "移动页面时不创建来源页面的重定向",
        "right-upload": "上传文件",
        "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-unwatchedpages": "查看未受监视页面的列表",
        "action-mergehistory": "合并本页面的历史",
        "action-userrights": "编辑所有用户的权限",
-       "action-userrights-interwiki": "编辑其它wiki的用户的用户权限",
+       "action-userrights-interwiki": "编辑其他wiki用户的用户权限",
        "action-siteadmin": "锁定或解锁数据库",
        "action-sendemail": "电邮联系其他用户",
        "action-editmywatchlist": "编辑你的监视列表",
        "action-viewmywatchlist": "查看你的监视列表",
        "action-viewmyprivateinfo": "查看您的私人信息",
        "action-editmyprivateinfo": "编辑你的私人信息",
-       "nchanges": "$1更改",
+       "nchanges": "$1更改",
        "enhancedrc-since-last-visit": "{{PLURAL:$1|上次访问后}}$1个",
        "enhancedrc-history": "历史",
        "recentchanges": "最近更改",
        "recentchanges-legend-newpage": "(见[[Special:NewPages|新页面列表]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "下面是<strong>$2</strong>之后的更改(最多显示<strong>$1</strong>个)。",
-       "rclistfrom": "显示$1之后的新更改",
+       "rclistfrom": "显示$3 $2之后的新更改",
        "rcshowhideminor": "$1小编辑",
        "rcshowhideminor-show": "显示",
        "rcshowhideminor-hide": "隐藏",
        "filetype-mime-mismatch": "文件扩展名“.$1”与检测到的文件MIME类型($2)不匹配。",
        "filetype-badmime": "“$1”类型的文件已被禁止上传。",
        "filetype-bad-ie-mime": "无法上传该文件,因为Internet Explorer会将它检测为“$1”,这是一种禁止且带有潜在危险的文件类型。",
-       "filetype-unwanted-type": "'''\".$1\"'''是一种不需要的文件类型。\n建议的{{PLURAL:$3|一种|多种}}文件类型有$2。",
+       "filetype-unwanted-type": "'''“.$1”'''是一种不需要的文件类型。\n建议的{{PLURAL:$3|一种|多种}}文件类型有$2。",
        "filetype-banned-type": "'''\".$1\"'''{{PLURAL:$4|不是一个允许的文件类型|不是一个允许的文件类型}}。\n允许 {{PLURAL:$3|文件类型是}} $2。",
        "filetype-missing": "该文件名称并没有扩展名(例如“.jpg”)。",
        "empty-file": "您所提交的文件为空文件。",
        "uploadscriptednamespace": "此SVG文件包含非法名字空间“$1”",
        "uploadinvalidxml": "上传文件中的XML无法解析。",
        "uploadvirus": "该文件包含病毒!\n详情:$1",
-       "uploadjava": "该文件是 ZIP 文件,其中包含 Java 的.class 文件。\n不允许上传的 Java 文件,因为他们可能会跳过的安全限制。",
+       "uploadjava": "该文件是 ZIP 文件,其中包含 Java 的.class 文件。上传Java文件不被允许,因为它们可能绕过限制,从而引起安全问题。",
        "upload-source": "来源文件",
        "sourcefilename": "源文件名:",
        "sourceurl": "来源网址:",
        "uploadstash-refresh": "更新文件清单",
        "invalid-chunk-offset": "无效区块偏移量",
        "img-auth-accessdenied": "拒绝访问",
-       "img-auth-nopathinfo": "PATH_INFO缺失。\n您的服务器尚未设置传送该信息。\n它可能基于CGI,因而不支持img_auth。\n请参见 [https://www.mediawiki.org/wiki/Manual:Image_Authorization 图片授权]。",
+       "img-auth-nopathinfo": "PATH_INFO缺失。\n您的服务器尚未设置传送该信息。\n它可能基于CGI,因而不支持img_auth。\n请参见 [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization 图片授权]。",
        "img-auth-notindir": "在已设置的上传目录中找不到请求的路径。",
        "img-auth-badtitle": "无法为“$1”创建合法的标题。",
        "img-auth-nologinnWL": "您尚未登录,且“$1”不在白名单上。",
        "pageswithprop-prophidden-binary": "已隐藏二进制属性值($1)",
        "doubleredirects": "双重重定向",
        "doubleredirectstext": "本页面列出重定向至其他重定向页面的页面。每行含有第一及第二重定向的链接和第二重定向的目标(这通常是第一重定向应该指向的“实际”目标页面)。<del>带删除线的</del>条目已经被解决。",
-       "double-redirect-fixed-move": "[[$1]]已被移动。它现在重定向至[[$2]]。",
-       "double-redirect-fixed-maintenance": "修复双重重定向自[[$1]]至[[$2]]。",
+       "double-redirect-fixed-move": "[[$1]]已被移动。它已自动更新,并且现在重定向至[[$2]]。",
+       "double-redirect-fixed-maintenance": "在维护工作中自动修复双重重定向自[[$1]]至[[$2]]。",
        "double-redirect-fixer": "重定向修复器",
        "brokenredirects": "受损重定向",
        "brokenredirectstext": "以下重定向链接至不存在的页面:",
        "log-title-wildcard": "搜索以该文字开头的标题",
        "showhideselectedlogentries": "显示/隐藏所选日志项",
        "allpages": "所有页面",
-       "alphaindexline": "$1到$2",
        "nextpage": "下一页($1)",
        "prevpage": "上一页($1)",
        "allpagesfrom": "显示页面开始于:",
        "watchnologin": "未登录",
        "addwatch": "添加至监视列表",
        "addedwatchtext": "已将页面“[[:$1]]”加入您的[[Special:Watchlist|监视列表]]。此后本页面及其讨论页的若有更改将在监视列表中显示。",
+       "addedwatchtext-short": "页面“$1”已加入您的监视列表。",
        "removewatch": "从监视列表中删除",
        "removedwatchtext": "页面“[[:$1]]”已从[[Special:Watchlist|你的监视列表]]中删除。",
+       "removedwatchtext-short": "页面“$1”已从您的监视列表移除。",
        "watch": "监视",
        "watchthispage": "监视本页",
        "unwatch": "取消监视",
        "watchlist-details": "不计讨论页,您的监视列表中共有$1个页面。",
        "wlheader-enotif": "已启用电子邮件通知。",
        "wlheader-showupdated": "您上次访问后发生更改的页面'''加粗'''显示",
-       "watchmethod-recent": "检查被监视页面的最近编辑",
-       "watchmethod-list": "查看监视页中的最新修改",
-       "watchlistcontains": "您的监视列表包含$1个页面。",
-       "iteminvalidname": "页面'$1'错误,无效命名...",
        "wlnote2": "下面是最近{{PLURAL:$1|<strong>$1</strong>小时}}的更改,截至$2 $3。",
        "wlshowlast": "显示过去$1小时$2天$3",
        "watchlist-options": "监视列表选项",
        "enotif_lastvisited": "请浏览 $1 查看在你上次访问后的所有更改。",
        "enotif_lastdiff": "请浏览 $1 查看该更改。",
        "enotif_anon_editor": "匿名用户$1",
-       "enotif_body": "亲爱的$WATCHINGUSERNAME:\n\n你好!\n\n$PAGEINTRO$NEWPAGE\n编辑摘要:$PAGESUMMARY $PAGEMINOREDIT\n\n你可以通过以下方式联系编者:\n电子邮件:$PAGEEDITOR_EMAIL\n用户页面:$PAGEEDITOR_WIKI\n\n在你登录并访问该页面之前,我们不会发送新增更改的通知。\n你也可以重设你的监视列表中所有监视页面的通知标志。\n\n{{SITENAME}}通知系统\n--\n更改邮件通知设置:\n{{canonicalurl:{{#special:Preferences}}}}\n更改监视列表设置:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n从监视列表中删除该页面:\n$UNWATCHURL\n反馈与其他帮助:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "亲爱的$WATCHINGUSERNAME:\n\n你好!\n\n$PAGEINTRO$NEWPAGE\n编辑摘要:$PAGESUMMARY $PAGEMINOREDIT\n\n你可以通过以下方式联系编者:\n电子邮件:$PAGEEDITOR_EMAIL\n用户页面:$PAGEEDITOR_WIKI\n\n在你登录并访问该页面之前,我们不会发送新增更改的通知。\n你也可以重设你的监视列表中所有监视页面的通知标志。\n\n{{SITENAME}}通知系统\n--\n更改邮件通知设置:\n{{canonicalurl:{{#special:Preferences}}}}\n更改监视列表设置:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n从监视列表中删除该页面:\n$UNWATCHURL\n反馈与其他帮助:\n$HELPPAGE",
        "created": "创建",
        "changed": "更改",
        "deletepage": "删除页面",
        "protect-summary-cascade": "联锁",
        "protect-expiring": "终止于$1(UTC)",
        "protect-expiring-local": "$1到期",
-       "protect-expiry-indefinite": "限期",
+       "protect-expiry-indefinite": "限期",
        "protect-cascade": "保护本页中包含的页面(连锁保护)",
        "protect-cantedit": "您无法更改这个页面的保护等级,因为您没有权限去编辑它。",
        "protect-othertime": "其它时间:",
        "blockip": "封禁用户",
        "blockip-legend": "封禁用户",
        "blockiptext": "使用下方的表单来禁止来自特定IP地址或用户名的写访问。\n只有在为了防止破坏,并符合[[{{MediaWiki:Policy-url}}|方针]]的情况下才可采取此行动。\n请在下面输入一个具体的理由(例如引述一个被破坏的页面)。",
-       "ipadressorusername": "IP地址或用户名:",
+       "ipaddressorusername": "IP地址或用户名:",
        "ipbexpiry": "期限:",
        "ipbreason": "原因:",
        "ipbreason-dropdown": "*常见封禁原因\n** 插入虚假信息\n** 删除页面内容\n** 添加垃圾外部链接\n** 插入无意义文字\n** 恐吓行为/骚扰\n** 滥用多个账户\n** 不能接受的用户名",
        "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": "在编辑及列表中隐藏用户名",
-       "ipbwatchuser": "监视该用户的用户及讨论页面",
+       "ipbwatchuser": "监视该用户的用户页和讨论页",
        "ipb-disableusertalk": "阻止用户在封禁期间编辑自己的讨论页",
        "ipb-change-block": "使用这些设置重新封禁用户",
        "ipb-confirm": "确认封禁",
        "ipblocklist-submit": "搜索",
        "ipblocklist-localblock": "本地封禁",
        "ipblocklist-otherblocks": "其他{{PLURAL:$1|封禁}}",
-       "infiniteblock": "限期",
+       "infiniteblock": "限期",
        "expiringblock": "$1 $2到期",
        "anononlyblock": "仅匿名用户",
        "noautoblockblock": "自动封禁停用",
        "movepagetalktext": "有关的讨论页将被自动与该页面一起移动,'''除非''':\n*新页面已经有一个包含内容的讨论页,或者\n*您不勾选下面的复选框。\n\n在这些情况下,您在必要时必须手工移动或合并页面。",
        "movearticle": "移动页面:",
        "moveuserpage-warning": "'''警告:'''你将移动一个用户页面。请注意,只有该页面会被移动,该用户''不''会被更名。",
+       "movecategorypage-warning": "<strong>警告:</strong>您将移动分类页面。请注意只有此页面将会移动,旧有分类的任何页面将<em>不会</em>同步移动。",
        "movenologintext": "您必须是一名登记用户并且[[Special:UserLogin|登录]]\n后才可移动一个页面。",
        "movenotallowed": "你没有权限移动页面。",
        "movenotallowedfile": "你没有权限移动文件。",
        "cant-move-user-page": "你没有权限移动用户页面(子页面除外)。",
        "cant-move-to-user-page": "你没有权限移动页面至用户页面(用户子页面除外)。",
+       "cant-move-category-page": "您没有权限移动分类页面。",
+       "cant-move-to-category-page": "您没有权限移动页面至分类页面。",
        "newtitle": "新标题:",
        "move-watch": "监视来源页面和目标页面",
        "movepagebtn": "移动页面",
        "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-summary": "请输入简短的摘要",
        "interlanguage-link-title": "$1 – $2",
        "common.css": "/* 放置于这里的CSS将应用于所有皮肤 */",
-       "cologneblue.css": "/* 放置于这里的CSS将影响使用科隆香水蓝皮肤的用户 */",
        "monobook.css": "/* 放置于这里的CSS将影响使用MonoBook皮肤的用户 */",
-       "modern.css": "/* 放置于这里的CSS将影响使用现代皮肤的用户 */",
        "vector.css": "/* 放置于这里的CSS将影响使用Vector皮肤的用户 */",
        "print.css": "/* 放置于这里的CSS将影响打印输出 */",
        "noscript.css": "/* 放置于这里的CSS将影响停用JavaScript的用户 */",
        "group-sysop.css": "/* 放置于这里的CSS将只影响管理员 */",
        "group-bureaucrat.css": "/* 放置于这里的CSS将只影响机行政员 */",
        "common.js": "/* 这里的任何JavaScript将为所有用户在每次页面载入时加载。 */",
-       "cologneblue.js": "/* 这里的任何JavaScript将为使用科隆香水蓝皮肤的用户加载 */",
        "monobook.js": "/* 这里的任何JavaScript将为使用MonoBook皮肤的用户加载 */",
-       "modern.js": "/* 这里的任何JavaScript将为使用现代皮肤的用户加载 */",
        "vector.js": "/* 这里的任何JavaScript将为使用Vector皮肤的用户加载 */",
        "group-autoconfirmed.js": "/* 这里的任何JavaScript将只为自动确认用户加载 */",
        "group-bot.js": "/* 这里的任何JavaScript将只为机器人加载 */",
        "group-sysop.js": "/* 这里的任何JavaScript将只为管理员加载 */",
        "group-bureaucrat.js": "/* 这里的任何JavaScript将只为行政员加载 */",
-       "notacceptable": "该网站服务器不能提供您的客户端能识别的数据格式。",
        "anonymous": "{{SITENAME}}匿名{{PLURAL:$1|用户}}",
        "siteuser": "{{SITENAME}}用户$1",
        "anonuser": "{{SITENAME}}匿名用户$1",
        "pageinfo-category-pages": "页面数",
        "pageinfo-category-subcats": "子分类数",
        "pageinfo-category-files": "文件数",
-       "skinname-cologneblue": "科隆香水蓝",
-       "skinname-modern": "现代",
        "markaspatrolleddiff": "标记为已巡查",
        "markaspatrolledtext": "标记此页面为已巡查",
        "markedaspatrolled": "标记为已检查",
        "newimages-summary": "本特殊页面展示最后上传的文件。",
        "newimages-legend": "过滤",
        "newimages-label": "文件名(或它的一部份):",
-       "showhidebots": "($1机器人)",
+       "newimages-showbots": "显示机器人上传",
        "noimages": "无可查看文件。",
        "ilsubmit": "搜索",
        "bydate": "按日期",
        "autosumm-blank": "清空页面",
        "autosumm-replace": "以“$1”替换内容",
        "autoredircomment": "重定向页面至[[$1]]",
-       "autosumm-new": "以“$1”为内容创建页面",
+       "autosumm-new": "创建页面,内容为“$1”",
        "size-bytes": "$1字节",
-       "livepreview-loading": "正在载入...",
-       "livepreview-ready": "正在载入... 完成!",
-       "livepreview-failed": "实时预览失败!\n尝试标准预览。",
-       "livepreview-error": "连接失败:$1“$2”。\n尝试标准预览。",
        "lag-warn-normal": "过去$1秒内的更改未必会在这个列表中显示。",
        "lag-warn-high": "由于数据库的过度延迟,过去$1秒的更改未必会在这个列表中显示。",
-       "watchlistedit-numitems": "不计讨论页面,您的监视列表包含$1个标题。",
-       "watchlistedit-noitems": "你的监视列表中没有标题。",
        "watchlistedit-normal-title": "编辑监视列表",
        "watchlistedit-normal-legend": "删除监视列表中的标题",
        "watchlistedit-normal-explain": "你的监视列表中的标题显示在下方。要删除标题,请勾选它前面选择框并单击“{{int:Watchlistedit-normal-submit}}”。你也可以[[Special:EditWatchlist/raw|编辑原始列表]]。",
        "watchlistedit-raw-done": "您的监视列表已经更新。",
        "watchlistedit-raw-added": "$1个标题被添加:",
        "watchlistedit-raw-removed": "$1个标题被删除:",
+       "watchlistedit-clear-title": "清空监视列表",
+       "watchlistedit-clear-legend": "清空监视列表",
+       "watchlistedit-clear-explain": "所有标题将从您的监视列表中移除",
+       "watchlistedit-clear-titles": "标题:",
+       "watchlistedit-clear-submit": "清空监视列表(永久!)",
+       "watchlistedit-clear-done": "您的监视列表已清空。",
+       "watchlistedit-clear-removed": "$1个标题已移除:",
+       "watchlistedit-too-many": "这里显示了太多页面。",
+       "watchlisttools-clear": "清空监视列表",
        "watchlisttools-view": "查看相关更改",
        "watchlisttools-edit": "查看并编辑监视列表",
        "watchlisttools-raw": "编辑原始监视列表",
        "compare-invalid-title": "您指定的标题无效。",
        "compare-title-not-exists": "您指定的标题不存在。",
        "compare-revision-not-exists": "你指定的版本不存在。",
-       "dberr-header": "本wiki出现了问题",
        "dberr-problems": "抱歉!本网站出现了一些技术问题。",
        "dberr-again": "请等待几分钟后重试。",
        "dberr-info": "(无法连接到数据库服务器:$1)",
        "htmlform-no": "否",
        "htmlform-yes": "是",
        "htmlform-chosen-placeholder": "选择选项",
+       "htmlform-cloner-create": "添加更多",
+       "htmlform-cloner-delete": "移除",
+       "htmlform-cloner-required": "至少一个值是必需的。",
        "sqlite-has-fts": "带全文搜索的版本$1",
        "sqlite-no-fts": "不带全文搜索的版本$1",
        "logentry-delete-delete": "$1删除页面$3",
index f307296..d4f20e0 100644 (file)
                        "Xiaomingyan",
                        "Yfdyh000",
                        "Yuyu",
-                       "乌拉跨氪"
+                       "乌拉跨氪",
+                       "아라",
+                       "Vincent Liu"
                ]
        },
-       "tog-underline": "é\80£çµ\90å\8a åº\95ç·\9aï¼\9a",
-       "tog-hideminor": "隱藏最近更改中的小修改",
+       "tog-underline": "連結底線:",
+       "tog-hideminor": "隱藏最近變更中的小修訂",
        "tog-hidepatrolled": "隱藏最近更改中巡查過的編輯",
        "tog-newpageshidepatrolled": "隱藏新頁面清單中巡查過的頁面",
-       "tog-extendwatchlist": "展開監視列表以顯示所有更改,不只是最近的",
-       "tog-usenewrc": "在最近更改和監視列表中整合同一頁的修改",
+       "tog-extendwatchlist": "展開監視列表以顯示含最近以外的所有變更",
+       "tog-usenewrc": "依頁面分類顯示最近變更和監視列表中的修改",
        "tog-numberheadings": "標題自動編號",
-       "tog-showtoolbar": "顯示編輯工具",
-       "tog-editondblclick": "雙擊編輯頁面",
-       "tog-editsectiononrightclick": "å\85\81許å\8f³æ\93\8aæ¨\99é¡\8c編輯段è\90½",
+       "tog-showtoolbar": "顯示編輯工具",
+       "tog-editondblclick": "啟用滑鼠雙擊編輯頁面",
+       "tog-editsectiononrightclick": "å\95\9fç\94¨æ»\91é¼ å\8f³é\8dµé»\9eé\81¸ç« ç¯\80æ¨\99é¡\8c編輯",
        "tog-watchcreations": "將我建立的頁面和上傳的檔案加入監視列表",
-       "tog-watchdefault": "將我更改的頁面和檔案加入監視列表",
+       "tog-watchdefault": "將我編輯的頁面和檔案加入監視列表",
        "tog-watchmoves": "將我移動的頁面和檔案加入監視列表",
        "tog-watchdeletion": "將我刪除的頁面和檔案加入監視列表",
-       "tog-minordefault": "預設將所有編輯標記為小修改",
-       "tog-previewontop": "在編輯框上方顯示預覽",
+       "tog-minordefault": "預設標記所有的編輯為小修訂",
+       "tog-previewontop": "顯示預覽於編輯框上方",
        "tog-previewonfirst": "第一次編輯時顯示預覽",
-       "tog-enotifwatchlistpages": "當我監視列表中的頁面或檔案有變更時,發送電子郵件通知我",
-       "tog-enotifusertalkpages": "我的對話頁有變更時,發送電子郵件通知我",
-       "tog-enotifminoredits": "頁面和檔案的小修改也發電子郵件給我",
+       "tog-enotifwatchlistpages": "ç\95¶æ\88\91ç\9a\84ç\9b£è¦\96å\88\97表中ç\9a\84é \81é\9d¢æ\88\96æª\94æ¡\88æ\9c\89è®\8aæ\9b´æ\99\82ï¼\8cç\99¼é\80\81é\9b»å­\90é\83µä»¶é\80\9aç\9f¥æ\88\91",
+       "tog-enotifusertalkpages": "當我的對話頁面有變更時,發送電子郵件通知我",
+       "tog-enotifminoredits": "當頁面與檔案有小修訂時,發送電子郵件通知我",
        "tog-enotifrevealaddr": "在通知信件中顯示我的電子郵件位址",
-       "tog-shownumberswatching": "顯示正在監視的使用者數",
-       "tog-oldsig": "有簽名:",
-       "tog-fancysig": "將簽名視為圍記文字(Wikitext)(不會自動產生連結)",
-       "tog-uselivepreview": "使用即時預覽(實驗性)",
-       "tog-forceeditsummary": "未輸入編輯摘要時提醒我",
-       "tog-watchlisthideown": "監視列表中隱藏我的編輯",
-       "tog-watchlisthidebots": "監視列表中隱藏機器人的編輯",
-       "tog-watchlisthideminor": "監視列表中隱藏小修改",
-       "tog-watchlisthideliu": "監視列表中隱藏已登入使用者的編輯",
-       "tog-watchlisthideanons": "監視列表中隱藏匿名使用者的編輯",
-       "tog-watchlisthidepatrolled": "監視清單中隱藏已巡查的編輯",
-       "tog-ccmeonemails": "ç\95¶æ\88\91å¯\84é\9b»å­\90é\83µä»¶çµ¦å\85¶ä»\96使ç\94¨è\80\85æ\99\82ï¼\8cä¹\9få¯\84ä¸\80份å\89¯æ\9c¬å\88°æ\88\91ç\9a\84信箱",
+       "tog-shownumberswatching": "顯示正在監視的使用者數",
+       "tog-oldsig": "有簽名:",
+       "tog-fancysig": "將簽名視為 Wikitext 語言 (不自動產生連結)",
+       "tog-uselivepreview": "使用即時預覽 (測試中)",
+       "tog-forceeditsummary": "未填寫編輯摘要時提示我",
+       "tog-watchlisthideown": "隱藏監視列表中我的編輯",
+       "tog-watchlisthidebots": "隱藏監視列表中機器人的編輯",
+       "tog-watchlisthideminor": "隱藏監視列表中的小修訂",
+       "tog-watchlisthideliu": "隱藏監視列表中已登入使用者的編輯",
+       "tog-watchlisthideanons": "隱藏監視列表中匿名使用者的編輯",
+       "tog-watchlisthidepatrolled": "隱藏監視列表中已巡查的編輯",
+       "tog-ccmeonemails": "ç\99¼é\80\81é\83µä»¶çµ¦ä»\96人æ\99\82ï¼\8cä¹\9fé\80\81ä¸\80份å\89¯æ\9c¬å\88°æ\88\91ç\9a\84é\9b»å­\90é\83µä»¶信箱",
        "tog-diffonly": "比對版本差異時下面不顯示頁面內容",
        "tog-showhiddencats": "顯示隱藏分類",
-       "tog-norollbackdiff": "å\9b\9eé\80\80å¾\8cä¸\8då\81\9a差異比對",
-       "tog-useeditwarning": "當離開頁面時編輯仍未儲存,請提醒我",
+       "tog-norollbackdiff": "å\9f·è¡\8cé\82\84å\8e\9få¾\8cç\95¥é\81\8e差異比對",
+       "tog-useeditwarning": "未儲存離開編輯頁面時警告我",
        "tog-prefershttps": "登入時始終使用安全連線",
-       "underline-always": "總是使用",
-       "underline-never": "不使用",
-       "underline-default": "外觀或瀏覽器預設",
+       "underline-always": "永遠使用",
+       "underline-never": "不使用",
+       "underline-default": "外觀或瀏覽器預設",
        "editfont-style": "編輯區字型樣式:",
-       "editfont-default": "瀏覽器預設",
+       "editfont-default": "瀏覽器預設",
        "editfont-monospace": "等距字型",
        "editfont-sansserif": "無襯線字型",
        "editfont-serif": "襯線字型",
        "thu": "四",
        "fri": "五",
        "sat": "六",
-       "january": "1月",
-       "february": "2月",
-       "march": "3月",
-       "april": "4月",
-       "may_long": "5月",
-       "june": "6月",
-       "july": "7月",
-       "august": "8月",
-       "september": "9月",
-       "october": "10月",
-       "november": "11月",
-       "december": "12月",
+       "january": "月",
+       "february": "月",
+       "march": "月",
+       "april": "月",
+       "may_long": "月",
+       "june": "月",
+       "july": "月",
+       "august": "月",
+       "september": "月",
+       "october": "月",
+       "november": "十一月",
+       "december": "十二月",
        "january-gen": "一月",
        "february-gen": "二月",
        "march-gen": "三月",
        "october-gen": "十月",
        "november-gen": "十一月",
        "december-gen": "十二月",
-       "jan": "1月",
-       "feb": "2月",
-       "mar": "3月",
-       "apr": "4月",
-       "may": "5月",
-       "jun": "6月",
-       "jul": "7月",
-       "aug": "8月",
-       "sep": "9月",
-       "oct": "10月",
-       "nov": "11月",
-       "dec": "12月",
-       "january-date": "1月$1日",
-       "february-date": "2月$1日",
-       "march-date": "3月$1日",
-       "april-date": "4月$1日",
-       "may-date": "5月$1日",
-       "june-date": "6月$1日",
-       "july-date": "7月$1日",
-       "august-date": "8月$1日",
-       "september-date": "9月$1日",
-       "october-date": "10月$1日",
-       "november-date": "11月$1日",
-       "december-date": "12月$1日",
-       "pagecategories": "{{PLURAL:$1|分類}}",
-       "category_header": "「$1」分類中的頁面",
+       "jan": "1 月",
+       "feb": "2 月",
+       "mar": "3 月",
+       "apr": "4 月",
+       "may": "5 月",
+       "jun": "6 月",
+       "jul": "7 月",
+       "aug": "8 月",
+       "sep": "9 月",
+       "oct": "10 月",
+       "nov": "11 月",
+       "dec": "12 月",
+       "january-date": "一月 $1 日",
+       "february-date": "二月 $1 日",
+       "march-date": "三月 $1 日",
+       "april-date": "四月 $1 日",
+       "may-date": "五月 $1 日",
+       "june-date": "六月 $1 日",
+       "july-date": "七月 $1 日",
+       "august-date": "八月 $1 日",
+       "september-date": "九月 $1 日",
+       "october-date": "十月 $1 日",
+       "november-date": "十一月 $1 日",
+       "december-date": "十二月 $1 日",
+       "pagecategories": "{{PLURAL:$1|分類|分類}}",
+       "category_header": "分類 \"$1\" 中的頁面",
        "subcategories": "子分類",
-       "category-media-header": "「$1」分類中的媒體",
-       "category-empty": "''此分類目前未包含頁面或媒體。''",
+       "category-media-header": "分類 \"$1\" 中的媒體",
+       "category-empty": "<em>此分類目前未包含頁面或媒體。</em>",
        "hidden-categories": "{{PLURAL:$1|隱藏分類}}",
        "hidden-category-category": "隱藏分類",
-       "category-subcat-count": "{{PLURAL:$2|此分類有以下一個子分類。|此分類有 $2 個子分類,以下列出了 $1 個。}}",
-       "category-subcat-count-limited": "此分類以下 $1 個子分類。",
-       "category-article-count": "{{PLURAL:$2|此分類有以下一個頁面。|此分類有 $2 個頁面,以下列出了 $1 個。}}",
-       "category-article-count-limited": "此分類以下 $1 個頁面。",
-       "category-file-count": "{{PLURAL:$2|此分類有以下一個檔案。|此分類有 $2 個檔案,以下列出了 $1 個。}}",
-       "category-file-count-limited": "此分類 $1 個檔案。",
+       "category-subcat-count": "{{PLURAL:$2|此分類僅包含以下 1 個子分類。|此分類包含以下 $1 個子分類,共 $2 個。}}",
+       "category-subcat-count-limited": "此分類包含以下 $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": "已索引的頁面",
-       "noindex-category": "未索引的頁面",
+       "index-category": "已索引的頁面",
+       "noindex-category": "未索引的頁面",
        "broken-file-category": "含有損壞檔案連結的頁面",
        "about": "關於",
        "article": "內容頁面",
-       "newwindow": "(以新視窗開啟)",
+       "newwindow": "(以新視窗開啟)",
        "cancel": "取消",
        "moredotdotdot": "更多...",
-       "morenotlisted": "此列表並不完整。",
+       "morenotlisted": "此清單尚未讀取完畢。",
        "mypage": "頁面",
-       "mytalk": "討論",
-       "anontalk": "此IP的對話頁",
+       "mytalk": "對話",
+       "anontalk": "此 IP 位址的對話頁面",
        "navigation": "導覽",
-       "and": "",
+       "and": "&#32;及&#32;",
        "qbfind": "尋找",
        "qbbrowse": "瀏覽",
        "qbedit": "編輯",
-       "qbpageoptions": "頁面選項",
-       "qbmyoptions": "æ\88\91ç\9a\84é\81¸é \85",
-       "faq": "常見問題解答",
-       "faqpage": "Project:常見問題解答",
+       "qbpageoptions": "此頁面",
+       "qbmyoptions": "æ\88\91ç\9a\84é \81é\9d¢",
+       "faq": "常見問答",
+       "faqpage": "Project:FAQ",
        "vector-action-addsection": "加入主題",
        "vector-action-delete": "刪除",
        "vector-action-move": "移動",
        "vector-action-protect": "保護",
-       "vector-action-undelete": "恢復被刪頁面",
-       "vector-action-unprotect": "更改保護",
+       "vector-action-undelete": "取消刪除",
+       "vector-action-unprotect": "變更保護",
        "vector-view-create": "建立",
        "vector-view-edit": "編輯",
        "vector-view-history": "檢視歷史",
        "vector-view-view": "閱讀",
        "vector-view-viewsource": "檢視原始碼",
        "actions": "動作",
-       "namespaces": "å\90\8då­\97空間",
-       "variants": "變",
-       "navigation-heading": "å°\8eè\88ª",
+       "namespaces": "å\91½å\90\8d空間",
+       "variants": "變",
+       "navigation-heading": "å°\8e覽é\81¸å\96®",
        "errorpagetitle": "錯誤",
-       "returnto": "返回$1。",
-       "tagline": "出自{{SITENAME}}",
+       "returnto": "返回 $1。",
+       "tagline": "出自 {{SITENAME}}",
        "help": "說明",
        "search": "搜尋",
        "searchbutton": "搜尋",
-       "go": "進入",
-       "searcharticle": "進入",
+       "go": "前往",
+       "searcharticle": "執行",
        "history": "頁面歷史",
        "history_short": "歷史",
-       "updatedmarker": "我上次訪問以來的修改",
+       "updatedmarker": "自我最後一次訪問以後的更新",
        "printableversion": "可列印版",
        "permalink": "永久連結",
        "print": "列印",
        "view": "檢視",
-       "view-foreign": "於$1查閱",
+       "view-foreign": "用 $1 檢視",
        "edit": "編輯",
        "edit-local": "編輯本地說明",
        "create": "建立",
-       "create-local": "æ·»å\8a 本地說明",
+       "create-local": "æ\96°å¢\9e本地說明",
        "editthispage": "編輯本頁",
        "create-this-page": "建立本頁",
        "delete": "刪除",
-       "deletethispage": "å\88ªé\99¤æ\9c¬頁",
+       "deletethispage": "å\88ªé\99¤æ­¤頁",
        "undeletethispage": "取消刪除此頁",
-       "undelete_short": "å\8f\8då\88ªé\99¤$1項修訂",
-       "viewdeleted_short": "æ\9f¥ç\9c\8b$1項已刪除的修訂",
+       "undelete_short": "å\8f\96æ¶\88å\88ªé\99¤ $1 項修訂",
+       "viewdeleted_short": "檢è¦\96 $1 項已刪除的修訂",
        "protect": "保護",
        "protect_change": "變更",
-       "protectthispage": "ä¿\9dè­·æ\9c¬é \81",
-       "unprotect": "更改保護",
-       "unprotectthispage": "更改此頁保護",
+       "protectthispage": "ä¿\9dè­·æ­¤é \81é\9d¢",
+       "unprotect": "變更保護",
+       "unprotectthispage": "變更此頁的保護",
        "newpage": "新頁面",
-       "talkpage": "è¨\8eè«\96æ\9c¬é \81",
+       "talkpage": "è¨\8eè«\96æ­¤é \81é\9d¢",
        "talkpagelinktext": "對話",
        "specialpage": "特殊頁面",
        "personaltools": "個人工具",
-       "postcomment": "新段落",
+       "postcomment": "新章節",
        "articlepage": "檢視內容頁面",
        "talk": "討論",
        "views": "檢視",
        "toolbox": "工具",
-       "userpage": "檢視用戶頁面",
-       "projectpage": "檢視計劃頁面",
+       "userpage": "檢視使用者頁面",
+       "projectpage": "檢視專案頁面",
        "imagepage": "檢視檔案頁面",
-       "mediawikipage": "檢視使用者介面訊息",
-       "templatepage": "檢è¦\96模æ\9d¿頁面",
+       "mediawikipage": "檢視訊息頁面",
+       "templatepage": "檢è¦\96樣ç\89\88頁面",
        "viewhelppage": "檢視說明頁面",
        "categorypage": "檢視分類頁面",
        "viewtalkpage": "檢視討論頁面",
        "otherlanguages": "其他語言",
-       "redirectedfrom": "(重定向自$1)",
-       "redirectpagesub": "重向頁面",
+       "redirectedfrom": "(自 $1 重新導向)",
+       "redirectpagesub": "重新導向頁面",
        "lastmodifiedat": "此頁面最後修訂於 $1 $2。",
-       "viewcount": "æ\9c¬é \81é\9d¢å·²ç¶\93被ç\80\8f覽$1次。",
+       "viewcount": "æ­¤é \81é\9d¢å·²è¢«æª¢è¦\96é\81\8e $1 次。",
        "protectedpage": "受保護頁面",
-       "jumpto": "跳轉到:",
+       "jumpto": "前往:",
        "jumptonavigation": "導覽",
        "jumptosearch": "搜尋",
-       "view-pool-error": "抱歉,太多用戶正嘗試檢視此頁,使伺服器超出負荷。請稍候片刻再嘗試。\n\n$1",
-       "pool-timeout": "等待鎖定逾時",
-       "pool-queuefull": "請求池已滿",
+       "view-pool-error": "抱歉,太多使用者正嘗試檢視此頁面,伺服器超出負荷。\n請稍候片刻再嘗試。\n\n$1",
+       "generic-pool-error": "抱歉,太多使用者正嘗試檢視此資源,伺服器超出負荷。\n請稍候片刻再嘗試。",
+       "pool-timeout": "正在等待取消鎖定",
+       "pool-queuefull": "程序序列已滿",
        "pool-errorunknown": "未知錯誤",
-       "pool-servererror": "池計數器服務不可用($1)。",
+       "pool-servererror": "無法使用程序計數服務 ($1)。",
        "aboutsite": "關於 {{SITENAME}}",
-       "aboutpage": "Project:關於",
-       "copyright": "除非另有說明,否則本站內容均以$1條款提供。",
-       "copyrightpage": "{{ns:project}}:版權訊息",
+       "aboutpage": "Project:About",
+       "copyright": "除非額外說明,否則本站內容均使用 $1 授權條款。",
+       "copyrightpage": "{{ns:project}}:Copyrights",
        "currentevents": "新聞動態",
        "currentevents-url": "Project:新聞動態",
        "disclaimers": "免責聲明",
-       "disclaimerpage": "Project:一般免責聲明",
-       "edithelp": "編輯幫助",
+       "disclaimerpage": "Project:General disclaimer",
+       "edithelp": "編輯説明",
        "mainpage": "首頁",
        "mainpage-description": "首頁",
        "policy-url": "Project:方針",
        "portal": "社群主頁",
-       "portal-url": "Project:社群主頁",
+       "portal-url": "Project:社區專頁",
        "privacy": "隱私政策",
-       "privacypage": "Project:隱私政策",
+       "privacypage": "Project:Privacy policy",
        "badaccess": "權限錯誤",
        "badaccess-group0": "系統不允許您執行這項操作。",
-       "badaccess-groups": "æ\82¨è«\8bæ±\82ç\9a\84æ\93\8dä½\9cå\8fªæ\9c\89{{PLURAL:$2|é\80\99å\80\8b\80\99äº\9b}}ç\94¨æ\88¶ç¾¤çµ\84ç\9a\84ç\94¨æ\88能使用:$1",
-       "versionrequired": "需 MediaWiki $1 版",
-       "versionrequiredtext": "需要版本 $1 的 MediaWiki 才能使用此頁面。\n詳情請見[[Special:Version|版本頁]]。",
+       "badaccess-groups": "æ\82¨è«\8bæ±\82ç\9a\84æ\93\8dä½\9cå\8fªæ\9c\89{{PLURAL:$2|é\80\99å\80\8b\80\99äº\9b}}群çµ\84ç\9a\84使ç\94¨è\80\85能使用:$1",
+       "versionrequired": "需使用 MediaWiki $1 版",
+       "versionrequiredtext": "需使用 $1 版本的 MediaWiki 才能使用此頁面。\n請參考 [[Special:Version|版本]]。",
        "ok": "確定",
-       "retrievedfrom": "取自「$1」",
-       "youhavenewmessages": "您有$1($2)。",
-       "youhavenewmessagesfromusers": "你有來自{{PLURAL:$3|另一位使用者|$3 位使用者}}的$1($2)。",
-       "youhavenewmessagesmanyusers": "你有來自多位使用者的$1( $2 )。",
+       "retrievedfrom": "取自 \"$1\"",
+       "youhavenewmessages": "您有 $1 ($2)。",
+       "youhavenewmessagesfromusers": "你有來自{{PLURAL:$3|另一位使用者|$3 位使用者}}的 $1 ($2)。",
+       "youhavenewmessagesmanyusers": "你有來自多位使用者的 $1 ($2)。",
        "newmessageslinkplural": "{{PLURAL:$1|一個新訊息|999=新訊息}}",
-       "newmessagesdifflinkplural": "æ\96°近{{PLURAL:$1|變更}}",
+       "newmessagesdifflinkplural": "æ\9c\80近{{PLURAL:$1|變更}}",
        "youhavenewmessagesmulti": "您在 $1 有新訊息",
        "editsection": "編輯",
        "editold": "編輯",
        "toc": "目錄",
        "showtoc": "顯示",
        "hidetoc": "隱藏",
-       "collapsible-collapse": "摺叠",
+       "collapsible-collapse": "合併",
        "collapsible-expand": "展開",
-       "thisisdeleted": "檢視或恢復$1?",
+       "thisisdeleted": "檢視或還原 $1 ?",
        "viewdeleted": "檢視 $1?",
-       "restorelink": "$1個被刪除的版本",
-       "feedlinks": "訂閱:",
+       "restorelink": "$1 個已刪除的編輯",
+       "feedlinks": "訂閱",
        "feed-invalid": "無效的訂閱類型。",
-       "feed-unavailable": "聯合訂閱並無提供",
-       "site-rss-feed": "$1的RSS訂閱",
-       "site-atom-feed": "$1的 Atom 訂閱",
-       "page-rss-feed": "「$1」的RSS訂閱",
-       "page-atom-feed": "「$1」的Atom訂閱",
-       "red-link-title": "$1(頁面未存在)",
-       "sort-descending": "倒序排列",
-       "sort-ascending": "升序排序",
+       "feed-unavailable": "目前未提供 RSS 或 Atom",
+       "site-rss-feed": "$1 的 RSS feed",
+       "site-atom-feed": "$1 的 Atom feed",
+       "page-rss-feed": "訂閱 \"$1\" 的 RSS feed",
+       "page-atom-feed": "訂閱 \"$1\" 的 Atom feed",
+       "red-link-title": "$1 (頁面不存在)",
+       "sort-descending": "降冪排序",
+       "sort-ascending": "昇冪排序",
        "nstab-main": "頁面",
        "nstab-user": "使用者頁面",
        "nstab-media": "媒體頁面",
        "nstab-special": "特殊頁面",
-       "nstab-project": "計劃頁面",
+       "nstab-project": "專案頁面",
        "nstab-image": "檔案",
        "nstab-mediawiki": "訊息",
-       "nstab-template": "模æ\9d¿",
-       "nstab-help": "幫助頁面",
+       "nstab-template": "樣ç\89\88",
+       "nstab-help": "說明頁面",
        "nstab-category": "分類",
-       "nosuchaction": "這個命令不存在",
-       "nosuchactiontext": "該URL所指定的動作無效。\n您可能打錯URL,或點了錯誤連結。\n這也可能是{{SITENAME}}所使用的軟件出現了錯誤。",
-       "nosuchspecialpage": "此特殊頁面不存在",
-       "nospecialpagetext": "<strong>您請求的特殊頁面無效。</strong>\n\n[[Special:SpecialPages|{{int:specialpages}}]]中載有所有有效特殊頁面的列表。",
+       "nosuchaction": "無此動作",
+       "nosuchactiontext": "URL 所指定的動作無效。\n您的 URL 可能輸入錯誤,或點選了錯誤的連結。\n這也可能是 {{SITENAME}} 使用的系統出現問題。",
+       "nosuchspecialpage": "無此特殊頁面",
+       "nospecialpagetext": "<strong>您請求的特殊頁面無效。</strong>\n\n欲取得有效的特殊頁面清單可至 [[Special:SpecialPages|{{int:specialpages}}]]。",
        "error": "錯誤",
        "databaseerror": "資料庫錯誤",
-       "databaseerror-text": "出現資料庫查詢錯誤。\n這可能表示軟件中存在錯誤。",
+       "databaseerror-text": "出現資料庫查詢錯誤。\n這可能表示系統有問題存在。",
        "databaseerror-textcl": "資料庫查詢錯誤。",
        "databaseerror-query": "查詢:$1",
        "databaseerror-function": "功能:$1",
        "databaseerror-error": "錯誤:$1",
-       "laggedslavemode": "'''警告:'''頁面可能不包含最近的更新。",
-       "readonly": "資料庫禁止訪問",
-       "enterlockreason": "請輸入禁止訪問原因, 包括估計重新開放的時間",
-       "readonlytext": "資料庫目前禁止輸入新內容及更改,\n這很可能是由於資料庫正在維修,之後即可恢復。\n\n管理員有如下解釋:$1",
-       "missing-article": "è³\87æ\96\99庫æ\89¾ä¸\8då\88°æ\96\87å­\97ã\80\8c$1ã\80\8d $2ã\80\82\n\né\80\9a常é\80\99æ\98¯ç\94±æ\96¼ä¿®è¨\82æ­·å\8f²é \81é\9d¢ä¸\8aé\81\8eæ\99\82ç\9a\84é\80£çµ\90å\88°å·²ç¶\93被å\88ªé\99¤ç\9a\84é \81é\9d¢æ\89\80å°\8eè\87´ç\9a\84ã\80\82\n\nå¦\82æ\9e\9cæ\83\85æ³\81ä¸\8dæ\98¯é\80\99樣ï¼\8cæ\82¨å\8f¯è\83½æ\89¾å\88°äº\86è»\9fé«\94å\85§ç\9a\84ä¸\80å\80\8bç¨\8bå¼\8fé\8c¯èª¤ã\80\82\nè«\8bè¨\98é\8c\84 URL ä½\8då\9d\80ï¼\8c並å\90\91[[Special:ListUsers/sysop|管ç\90\86å\93¡]]報告此問題。",
-       "missingarticle-rev": "(修訂#: $1)",
-       "missingarticle-diff": "(差異: $1, $2)",
-       "readonly_lag": "附屬資料庫伺服器正在將快取更新到主伺服器,資料庫已被自動鎖定",
+       "laggedslavemode": "<strong>警告:</strong>頁面可能不包含最近的更新。",
+       "readonly": "資料庫已鎖定",
+       "enterlockreason": "請輸入鎖定的原因,包括估計重新開放的時間",
+       "readonlytext": "資料庫目前已鎖定無法新增或修改資料,\n可能正在進行例行的資料庫維修作業,完成之後即可恢復正常。\n\n鎖定資料庫的管理員說明:$1",
+       "missing-article": "è³\87æ\96\99庫æ\9f¥ç\84¡é \90æ\9c\9fç\9a\84é \81é\9d¢æ\96\87å­\97ï¼\8cé \81é\9d¢ \"$1\" $2ã\80\82\n\né\80\9a常æ\98¯å\9b æ\82¨é\80£çµ\90å\88°äº\86å·²é\81\8eæ\9c\9f(已被å\88ªé\99¤)ç\9a\84å·®ç\95°æ\88\96æ­·å\8f²é \81é\9d¢ã\80\82\n\nè\8b¥é\80\99ä¸\8dæ\98¯æ\82¨æ\89\80é\81\87å\88°ç\9a\84æ\83\85æ³\81ï¼\8cæ\82¨å\8f¯è\83½æ\89¾å\88°äº\86ä¸\80å\80\8b系統ç\9a\84å\95\8fé¡\8cã\80\82\nè«\8bè¨\98é\8c\84 URL ä½\8då\9d\80ï¼\8c並å\90\91 [[Special:ListUsers/sysop|管ç\90\86å\93¡]] 報告此問題。",
+       "missingarticle-rev": "(修訂#:$1)",
+       "missingarticle-diff": "(差異:$1, $2)",
+       "readonly_lag": "資料庫已自動鎖定,正在等候次要資料庫同步資料到主要資料庫",
        "internalerror": "內部錯誤",
        "internalerror_info": "內部錯誤:$1",
-       "fileappenderrorread": "當附加時無法讀取「$1」。",
-       "fileappenderror": "不能附加「$1」到「$2」。",
-       "filecopyerror": "無法複製檔案「$1」到「$2」。",
-       "filerenameerror": "無法重新命名檔案「$1」到「$2」。",
-       "filedeleteerror": "無法刪除「$1」檔案。",
-       "directorycreateerror": "無法建立目錄「$1」。",
-       "filenotfound": "找不到「$1」檔案。",
-       "fileexistserror": "無法寫入檔案\"$1\": 檔案已存在",
-       "unexpected": "不正常值:\"$1\"=\"$2\"。",
-       "formerror": "錯誤:無法提交表單",
+       "filecopyerror": "無法複製檔案 \"$1\" 至 \"$2\"。",
+       "filerenameerror": "無法重新命名檔案 \"$1\" 為 \"$2\"。",
+       "filedeleteerror": "無法刪除檔案 \"$1\"。",
+       "directorycreateerror": "無法建立目錄 \"$1\"。",
+       "filenotfound": "找不到檔案 \"$1\"。",
+       "unexpected": "預期之外的資料:\"$1\"=\"$2\"。",
+       "formerror": "錯誤:無法送出表單。",
        "badarticleerror": "無法在此頁進行該操作。",
-       "cannotdelete": "無法刪除頁面或圖片「$1」。\n它可能已經被其他人刪除了。",
-       "cannotdelete-title": "無法刪除頁面「$1」",
-       "delete-hook-aborted": "刪除被勾點中止。\n它沒有提供解釋。",
-       "no-null-revision": "ç\84¡æ³\95å\89µå»ºå°\8d\"$1\"é \81é\9d¢新的空白修訂",
-       "badtitle": "錯誤的標題",
-       "badtitletext": "æ\89\80è«\8bæ±\82é \81é\9d¢ç\9a\84æ¨\99é¡\8cæ\98¯ç\84¡æ\95\88ç\9a\84ã\80\81ä¸\8då­\98å\9c¨ï¼\8cè·¨èª\9eè¨\80æ\88\96è·¨wikié\80£çµ\90ç\9a\84æ¨\99é¡\8cé\8c¯èª¤ã\80\82å®\83å\8f¯è\83½å\8c\85å\90«ä¸\80å\80\8bæ\88\96æ\9b´å¤\9aç\9a\84ä¸\8dè\83½ç\94¨æ\96¼æ¨\99é¡\8cç\9a\84å­\97符。",
-       "perfcached": "ä¸\8bå\88\97æ\98¯å¿«å\8f\96è³\87æ\96\99ï¼\8cå\9b æ­¤å\8f¯è\83½ä¸\8dæ\98¯æ\9c\80æ\96°ç\9a\84ã\80\82æ\9c\80å¤\9a{{PLURAL:$1|å\8fªæ\9c\89\80\8bçµ\90æ\9e\9c|$1å\80\8bçµ\90æ\9e\9c}}å\8f¯ç\94¨。",
-       "perfcachedts": "ä¸\8bå\88\97æ\98¯å¿«å\8f\96è³\87æ\96\99ï¼\8cå\85¶æ\9c\80å¾\8cæ\9b´æ\96°æ\99\82é\96\93æ\98¯$1ã\80\82å\8fªæ\9c\89{{PLURAL:$4|ä¸\80å\80\8bçµ\90æ\9e\9c|$4å\80\8bçµ\90æ\9e\9c}}æ\9c\83被顯示ã\80\82 A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
-       "querypage-no-updates": "目前禁止對此頁面進行更新。\n此處的資料將不能被立即重新整理。",
+       "cannotdelete": "無法刪除頁面或檔案 \"$1\"。\n它可能已經被其他人刪除。",
+       "cannotdelete-title": "無法刪除頁面 \"$1\"",
+       "delete-hook-aborted": "刪除已被 Hook 中止。\n且未回應無任何說明。",
+       "no-null-revision": "ç\84¡æ³\95å°\8dé \81é\9d¢ \"$1\" å»ºç«\8b新的空白修訂",
+       "badtitle": "無效的標題",
+       "badtitletext": "æ\8c\87å®\9aç\9a\84é \81é\9d¢æ¨\99é¡\8cæ\98¯ç\84¡æ\95\88ã\80\81空ç\99½ï¼\8cæ\88\96æ\9cªæ­£ç¢ºé\80£çµ\90ç\9a\84è·¨èª\9eè¨\80æ\88\96è·¨ Wiki ç\9a\84æ¨\99é¡\8cã\80\82\næ¨\99é¡\8c中å\8f¯è\83½å\8c\85å\90«ç\84¡æ³\95使ç\94¨å\9c¨æ¨\99é¡\8cç\9a\84å­\97å\85\83。",
+       "perfcached": "以ä¸\8bç\82ºå¿«å\8f\96è³\87æ\96\99ï¼\8cå\8f¯è\83½ä¸\8dæ\98¯æ\9c\80æ\96°ç\9a\84ã\80\82 å¿«å\8f\96è³\87æ\96\99æ\9c\80å¤\9aå\8f¯å\84²å­\98 {{PLURAL:$1|1 ç­\86çµ\90æ\9e\9c|$1 ç­\86çµ\90æ\9e\9c}}。",
+       "perfcachedts": "以ä¸\8bç\82ºå¿«å\8f\96è³\87æ\96\99ï¼\8cæ\9c\80å¾\8cæ\9b´æ\96°æ\99\82é\96\93ç\82º $1ã\80\82 å¿«å\8f\96è³\87æ\96\99æ\9c\80å¤\9aå\8f¯å\84²å­\98 {{PLURAL:$4|1 ç­\86çµ\90æ\9e\9c|$4 ç­\86çµ\90æ\9e\9c}}ã\80\82",
+       "querypage-no-updates": "目前已停用此頁面的更新功能。\n在此頁面的資料不會被立即更新。",
        "viewsource": "檢視原始碼",
        "viewsource-title": "檢視 $1 的原始碼",
-       "actionthrottled": "å\8b\95ä½\9cå·²å£\93å\88",
-       "actionthrottledtext": "基於反垃圾的考量,您現在於這段短時間之中限制去作這一個動作,而您已經超過這個上限。\n請在數分鐘後再嘗試。",
-       "protectedpagetext": "該頁面已被保護以防止編輯或其他操作。",
-       "viewsourcetext": "{{GENDER:|你|妳|你}}可以檢視並複製本頁面的原始碼。",
-       "viewyourtext": "æ\82¨å\8f¯ä»¥æ\9f¥ç\9c\8b並è¤\87製'''æ\82¨å°\8dæ­¤é \81é\9d¢ä½\9cå\87ºç·¨è¼¯å¾\8c'''ç\9a\84æº\90代碼:",
-       "protectedinterface": "該頁提供此wiki軟體的介面文字,它已被保護以防止惡意修改。\n如欲修改所有wiki的翻譯,請到[//translatewiki.net/ translatewiki.net]上的MediaWiki本地化計畫。",
-       "editinginterface": "'''警告:'''您正在編輯的頁面是用於提供軟體的介面文字。\n改變此頁將影響其他在此wiki上的用戶介面外觀。\n如欲修改所有wiki的翻譯,請到[//translatewiki.net/ translatewiki.net]上的MediaWiki本地化計畫。",
-       "cascadeprotected": "這個頁面已經被保護,因為這個頁面被以下已標註\"聯鎖保護\"的{{PLURAL:$1|一個|多個}}被保護頁面包含:\n$2",
-       "namespaceprotected": "您並沒有權限編輯'''$1'''名字空間的頁面。",
-       "customcssprotected": "你並無權限編輯此CSS頁面,因為它包含了其他用戶的個人設置。",
-       "customjsprotected": "你並無權限去編輯此JavaScript頁面,因為他包含了另一位用戶的個人設定。",
-       "mycustomcssprotected": "你沒有編輯這CSS頁面的權限。",
-       "mycustomjsprotected": "你沒有編輯這JavaScript頁面的權限。",
-       "myprivateinfoprotected": "您沒有權限來編輯您的個人信息。",
-       "mypreferencesprotected": "您沒有權限編輯您的設定。",
-       "ns-specialprotected": "特殊頁面是不可以編輯的。",
-       "titleprotected": "這個標題已經被[[User:$1|$1]]保護以防止建立。理由是''$2''。",
-       "filereadonlyerror": "ç\84¡æ³\95ä¿®æ\94¹æ\96\87件ã\80\8c$1ã\80\8då\9b ç\82ºæ\96\87件庫ã\80\8c$2ã\80\8dè\99\95æ\96¼å\94¯è®\80模å¼\8fã\80\82 ï¼\81\n管ç\90\86å\93¡é\8e\96å®\9aå®\83ç\9a\84解é\87\8bæ\98¯ï¼\9aã\80\8c$3ã\80\8d。",
-       "invalidtitle-knownnamespace": "使用名字空間「$2」和文本「$3」的無效標題",
-       "invalidtitle-unknownnamespace": "使用未知名字空間編號$1和文本“$2”的無效標題",
+       "actionthrottled": "å·²é\99\90å\88¶å\8b\95ä½\9c",
+       "actionthrottledtext": "您在短時間內執行此動作太多次,已超出系統上限,基於反濫用的考量,將限制您的動作。\n請稍後數分鐘後再試。",
+       "protectedpagetext": "此頁面已設為保護防止編輯或其他操作。",
+       "viewsourcetext": "您可以檢視並複製此頁面的原始碼。",
+       "viewyourtext": "æ\82¨å\8f¯ä»¥æª¢è¦\96並è¤\87製此é \81é\9d¢ä¸­<strong>æ\82¨ç·¨è¼¯</strong>ç\9a\84å\8e\9få§\8b碼:",
+       "protectedinterface": "本頁用來提供此 Wiki 軟體介面上的文字,並且已被設為保護以防止惡意修改。\n如欲增加或修改 Wiki 的翻譯,請至 [//translatewiki.net/ translatewiki.net] 上的 MediaWiki 在地化專案。",
+       "editinginterface": "<strong>警告:</strong>您正在編輯的頁面是用來提供軟體介面上的文字。\n更改此頁將影響其他在此 Wiki 上的使用者介面外觀。\n如欲修改 Wiki 的翻譯,請至 [//translatewiki.net/ translatewiki.net]上的 MediaWiki 在地化專案。",
+       "cascadeprotected": "此頁面被保護無法編輯,因為此頁面被以下開啟 \"連鎖保護\" 選項的{{PLURAL:$1|一頁|數頁}}保護頁面引用:\n$2",
+       "namespaceprotected": "您沒有權限編輯 <strong>$1</strong> 命名空間的頁面。",
+       "customcssprotected": "您並沒有權限編輯此 CSS 頁面,因為此頁面包含了其他使用者的個人設定。",
+       "customjsprotected": "您並沒有權限編輯此 JavaScript 頁面,因為此頁面包含了其他使用者的個人設定。",
+       "mycustomcssprotected": "您沒有權限編輯此 CSS 頁面。",
+       "mycustomjsprotected": "您沒有權限編輯此 JavaScript 頁面。",
+       "myprivateinfoprotected": "您沒有權限編輯您的私人資訊。",
+       "mypreferencesprotected": "您沒有權限編輯您的偏好設定。",
+       "ns-specialprotected": "特殊頁面無法編輯。",
+       "titleprotected": "此標題已經被 [[User:$1|$1]] 保護以防止建立,原因是 \"<em>$2</em>\"。",
+       "filereadonlyerror": "ç\84¡æ³\95ä¿®æ\94¹æª\94æ¡\88 \"$1\" å\9b ç\82ºæª\94æ¡\88庫 \"$2\" ç\9b®å\89\8dè\99\95æ\96¼å\94¯è®\80模å¼\8fã\80\82\n\né\8e\96å®\9aç\9a\84管ç\90\86å\93¡èªªæ\98\8eï¼\9a\"$3\"。",
+       "invalidtitle-knownnamespace": "無效的標題,命名空間 \"$2\" 與名稱 \"$3\"",
+       "invalidtitle-unknownnamespace": "無效的標題,不明的命名空間編號 $1 與名稱 \"$2\"",
        "exception-nologin": "未登入",
-       "exception-nologin-text": "你需要[[Special:Userlogin|登錄]]此wiki查閲此頁或進行操作。",
-       "exception-nologin-text-manual": "請$1以便能夠訪問此頁或行動。",
-       "virus-badscanner": "損壞設定: 未知的病毒掃瞄器: ''$1''",
-       "virus-scanfailed": "掃瞄失敗 (代碼 $1)",
-       "virus-unknownscanner": "未知的防病毒:",
-       "logouttext": "您已經登出。\n\n請注意,如果你再次登入,此頁或會繼續顯示,直到您清除瀏覽器緩存。",
-       "welcomeuser": "歡迎,$1!",
-       "welcomecreation-msg": "您的帳號已建立。\n不要忘記變更您的[[Special:Preferences| {{SITENAME}} 的偏好設定]]。",
+       "exception-nologin-text": "您需要先 [[Special:Userlogin|登入]] 檢視或者編輯此頁面。",
+       "exception-nologin-text-manual": "請先 $1 以存取此頁面或操作。",
+       "virus-badscanner": "錯誤的設定:不明的病毒掃瞄程式:<em>$1</em>",
+       "virus-scanfailed": "掃瞄失敗 (代碼 $1)",
+       "virus-unknownscanner": "不明的防毒程式:",
+       "logouttext": "<strong>您現在已登出。</strong>\n\n請注意,某些頁面會以登入的狀態持續顯示,直到您清除瀏覽器快取為止。",
+       "welcomeuser": "歡迎光臨,$1!",
+       "welcomecreation-msg": "您的帳號已建立。\n可至 [[Special:Preferences|偏好設定]] 更新您在 {{SITENAME}} 的個人化設定。",
        "yourname": "使用者名稱:",
-       "userlogin-yourname": "使用者名稱",
+       "userlogin-yourname": "使用者名稱",
        "userlogin-yourname-ph": "輸入您的使用者名稱",
        "createacct-another-username-ph": "輸入帳號名稱",
        "yourpassword": "您的密碼:",
        "yourpasswordagain": "再次輸入密碼:",
        "createacct-yourpasswordagain": "確認密碼",
        "createacct-yourpasswordagain-ph": "再次輸入密碼",
-       "remembermypassword": "在這個瀏覽器上記住我的登入資訊(可維持 $1 {{PLURAL:$1|天}})",
-       "userlogin-remembermypassword": "保持我的登入狀態",
+       "remembermypassword": "在瀏覽器上記住我的登入資訊 (上限 $1 {{PLURAL:$1|天}})",
+       "userlogin-remembermypassword": "記住我的登入狀態",
        "userlogin-signwithsecure": "使用安全連線",
        "yourdomainname": "您的網域:",
-       "password-change-forbidden": "您不可變更此圍記(Wiki)上的密碼。",
-       "externaldberror": "這可能是由於驗證資料庫錯誤,或是您被禁止更新您的外部帳號。",
+       "password-change-forbidden": "您不可變更此 Wiki 上的密碼。",
+       "externaldberror": "這可能是由於資料庫驗證錯誤,或是不允許您更新外部帳號。",
        "login": "登入",
-       "nav-login-createaccount": "登入/建立新帳號",
+       "nav-login-createaccount": "登入/建立帳號",
        "loginprompt": "您必須允許瀏覽器紀錄 Cookie 才能成功登入 {{SITENAME}}。",
-       "userlogin": "登入/建立新帳號",
+       "userlogin": "登入/建立帳號",
        "userloginnocreate": "登入",
        "logout": "登出",
        "userlogout": "登出",
        "notloggedin": "未登入",
        "userlogin-noaccount": "沒有帳號嗎?",
-       "userlogin-joinproject": "å\8f\83è\88\87 {{SITENAME}}",
-       "nologin": "您還沒有帳號嗎?$1。",
+       "userlogin-joinproject": "å\8a å\85¥ {{SITENAME}}",
+       "nologin": "您還沒有帳號嗎? $1。",
        "nologinlink": "建立帳號",
        "createaccount": "建立帳號",
-       "gotaccount": "已經擁有帳號?$1。",
+       "gotaccount": "您已經擁有帳號了嗎? $1。",
        "gotaccountlink": "登入",
-       "userlogin-resetlink": "忘記了您的登入細節?",
-       "userlogin-resetpassword-link": "忘記您的密碼?",
-       "userlogin-helplink2": "登入幫助",
-       "userlogin-loggedin": "您已作為{{GENDER:$1|$1}}登錄。\n利用以下表單以作為另一賬戶登錄。",
-       "userlogin-createanother": "建立另一賬戶",
-       "createacct-join": "輸入您的基本資料:",
-       "createacct-another-join": "在下方輸入新帳號的資訊。",
-       "createacct-emailrequired": "電子郵件",
-       "createacct-emailoptional": "電子郵件(可選)",
-       "createacct-email-ph": "設定信件位址",
-       "createacct-another-email-ph": "輸入信件位址",
-       "createaccountmail": "使用一個臨時的隨機密碼,並將它發送到指定的電子郵件地址",
-       "createacct-realname": "真實姓名(可選)",
-       "createaccountreason": "理由:",
+       "userlogin-resetlink": "您忘記了登入的詳細資訊?",
+       "userlogin-resetpassword-link": "忘記密碼?",
+       "userlogin-helplink2": "登入協助",
+       "userlogin-loggedin": "您目前已登入 {{GENDER:$1|$1}} 使用者,\n請使用下列表單改登入另一位使用者。",
+       "userlogin-createanother": "建立另一個帳號",
+       "createacct-emailrequired": "電子郵件位址",
+       "createacct-emailoptional": "電子郵件位址 (選填)",
+       "createacct-email-ph": "輸入您的電子郵件位址",
+       "createacct-another-email-ph": "輸入電子郵件位址",
+       "createaccountmail": "使用臨時的隨機密碼,並將它發送到指定的電子郵件地址",
+       "createacct-realname": "真實姓名 (選填)",
+       "createaccountreason": "原因:",
        "createacct-reason": "原因",
        "createacct-reason-ph": "您為什麼要建立另一個帳號",
        "createacct-captcha": "安全驗證",
        "createacct-imgcaptcha-ph": "輸入您在上方看到的文字",
-       "createacct-submit": "建立帳號",
+       "createacct-submit": "建立您的帳號",
        "createacct-another-submit": "建立另一帳號",
-       "createacct-benefit-heading": "{{SITENAME}}是由像您一樣的人建立。",
-       "createacct-benefit-body1": "{{PLURAL:$1|次編輯}}",
-       "createacct-benefit-body2": "$1個頁面",
-       "createacct-benefit-body3": "位近期{{PLURAL:$1|貢獻者}}",
-       "badretype": "您所輸入的密碼並不符合。",
+       "createacct-benefit-heading": "{{SITENAME}} 是由像您一樣貢獻的人所建立的。",
+       "createacct-benefit-body1": " {{PLURAL:$1|次編輯}}",
+       "createacct-benefit-body2": " $1 頁",
+       "createacct-benefit-body3": " 位最近的{{PLURAL:$1|貢獻者}}",
+       "badretype": "兩次輸入的密碼並不相同。",
        "userexists": "您所輸入的使用者名稱已存在,請另選一個名稱。",
        "loginerror": "登入錯誤",
        "createacct-error": "帳號建立錯誤",
        "createaccounterror": "無法建立帳號:$1",
-       "nocookiesnew": "已成功建立新帳號!偵測到您已關閉 Cookies,請開啟它並登入。",
-       "nocookieslogin": "本站利用 Cookies 進行使用者登入,偵測到您已關閉 Cookies,請開啟它並重新登入。",
+       "nocookiesnew": "使用者帳號已建立成功,但您尚未登入。\n要登入 {{SITENAME}} 使用者需使用 Cookies,\n您的 Cookies 未尚開啟。\n請在開啟後使用您新的使用者名稱及密碼登入。",
+       "nocookieslogin": "要登入 {{SITENAME}} 使用者需使用 Cookies,\n您的 Cookies 未尚開啟。\n請在開啟後重試。",
        "nocookiesfornew": "這個使用者的帳號未建立,我們不能確認它的來源。\n請確認您已開啟 Cookie,重新載入後再試。",
-       "noname": "{{GENDER:|你|妳|你}}沒有輸入一個有效的使用者名稱。",
+       "noname": "您輸入的使用者名稱無效。",
        "loginsuccesstitle": "登入成功",
-       "loginsuccess": "{{GENDER:|你|妳|你}}正在以「$1」的身份在 {{SITENAME}} 登入。",
-       "nosuchuser": "æ\89¾ä¸\8då\88°ç\94¨æ\88¶ \"$1\"ã\80\82\nç\94¨æ\88¶å\90\8d稱æ\98¯æ\9c\89大å°\8f寫å\8d\80å\88\86ç\9a\84ã\80\82\n檢æ\9f¥æ\82¨ç\9a\84æ\8b¼å¯«ï¼\8cæ\88\96è\80\85ç\94¨ä¸\8bé\9d¢ç\9a\84表格[[Special:UserLogin/signup|建ç«\8bä¸\80å\80\8bæ\96°è³¬號]]。",
-       "nosuchusershort": "æ²\92æ\9c\89ä¸\80å\80\8bå\90\8dç\82ºã\80\8c$1ã\80\8dç\9a\84ç\94¨æ\88¶ã\80\82è«\8b檢æ\9f¥æ\82¨è¼¸å\85¥ç\9a\84æ\96\87å­\97æ\98¯å\90¦æ\9c\89é\8c¯èª¤。",
-       "nouserspecified": "{{GENDER:|你|妳|你}}需要指定一個用戶名。",
-       "login-userblocked": "這位用戶已被封鎖。不容許登入。",
+       "loginsuccess": "<strong>{{GENDER:|你|妳|你}}正使用 \"$1\" 的身份登入 {{SITENAME}}。</strong>",
+       "nosuchuser": "æ\9f¥ç\84¡ä½¿ç\94¨è\80\85 \"$1\"ã\80\82\n使ç\94¨è\80\85å\90\8d稱æ\9c\89大å°\8f寫å\8d\80å\88\86ï¼\8c\nè«\8b檢æ\9f¥æ\82¨æ\8b¼å¯«æ\98¯å\90¦æ­£ç¢ºï¼\8cæ\88\96è\80\85 [[Special:UserLogin/signup|建ç«\8bæ\96°å¸³號]]。",
+       "nosuchusershort": "æ\9f¥ç\84¡ä½¿ç\94¨è\80\85 \"$1\"ï¼\8c\nè«\8b檢æ\9f¥æ\82¨æ\8b¼å¯«æ\98¯å\90¦æ­£ç¢º。",
+       "nouserspecified": "您必須指定一個使用者名稱。",
+       "login-userblocked": "這位使用者已被封鎖,不允許登入。",
        "wrongpassword": "您輸入的密碼錯誤,請再試一次。",
-       "wrongpasswordempty": "沒有輸入密碼!請重試。",
-       "passwordtooshort": "您的密碼不能少於$1個字元。",
-       "password-name-match": "您的密碼必須跟您的用戶名不相同。",
-       "password-login-forbidden": "這個用戶名稱及密碼的使用是被禁止的。",
+       "wrongpasswordempty": "輸入的密碼是空的。\n請再試一次。",
+       "passwordtooshort": "您的密碼至少需要 $1 個字元。",
+       "password-name-match": "您的密碼不可以跟使用者名稱相同。",
+       "password-login-forbidden": "此使用者名稱和密碼已被禁止使用。",
        "mailmypassword": "重設密碼",
-       "passwordremindertitle": "{{SITENAME}}的新臨時密碼",
-       "passwordremindertext": "有人(可能是您,來自IP位址$1)已請求{{SITENAME}}的新密碼 ($4)。\n用戶\"$2\"的一個新臨時密碼現在已被設定好為\"$3\"。\n如果這個動作是您所指示的,您便需要立即登入並選擇一個新的密碼。\n您的臨時密碼會於{{PLURAL:$5|一|$5}}天內過期。\n\n如果是其他人發出了該請求,或者您已經記起了您的密碼並不準備改變它,\n您可以忽略此消息並繼續使用您的舊密碼。",
-       "noemail": "用戶「$1」沒有登記電子郵件地址。",
+       "passwordremindertitle": "{{SITENAME}} 的新臨時密碼",
+       "passwordremindertext": "不明人士 (可能是您自己,來自 IP 位址 $1) 要求重設在 {{SITENAME}} ($4) 的密碼。\n給使用者 \"$2\" 的臨時密碼設為 \"$3\"。\n如果這個動作是您做的,您需要立即登入並設定一個新的密碼,\n您的臨時密碼將於{{PLURAL:$5|一|$5}}天內過期。\n\n如果不是您要求重設密碼,或您已想起密碼,並不準備修改,\n您可以忽略此訊息並且繼續使用您原本的密碼。",
+       "noemail": "使用者 \"$1\" 未登記電子郵件地址。",
        "noemailcreate": "您需要提供一個有效的電子郵件地址",
-       "passwordsent": "用戶「$1」的新密碼已經寄往所登記的電子郵件地址。\n請在收到後再登入。",
-       "blocked-mailpassword": "您的IP地址處於查封狀態而不允許編輯,為了安全起見,密碼恢復功能已被禁用。",
-       "eauthentsent": "ä¸\80å°\81確èª\8dä¿¡å·²é\81\9eé\80\81è\87³æ\82¨è¨­å®\9aç\9a\84é\9b»é\83µä½\8då\9d\80ã\80\82\nå\9c¨ç\99¼é\80\81å\85¶å®\83é\83µä»¶å\88°æ­¤è³¬æ\88¶å\89\8dï¼\8cæ\82¨å¿\85é \88é¦\96å\85\88ä¾\9dç\85§é\80\99å°\81信中ç\9a\84æ\8c\87å°\8e確èª\8dé\80\99å\80\8bé\9b»å­\90é\83µä»¶ä¿¡ç®±ç\9c\9f實æ\9c\89æ\95\88。",
-       "throttled-mailpassword": "密碼提醒已經在前$1小時內發送。\n為防止濫用,限定在$1小時內僅發送一次密碼提醒。",
-       "mailerror": "發送郵件錯誤$1",
-       "acct_creation_throttle_hit": "在這個wiki上的訪客利用您的IP地址在昨天創建了$1個賬戶,是在這段時間中的上限。\n結果利用這個IP地址的訪客在這段時間中不能創建更多的賬戶。",
-       "emailauthenticated": "您的電子郵件位址已於$2在$3確認。",
-       "emailnotauthenticated": "您的電郵位址尚未確認。\n將不會發送與以下功能相關的電郵。",
-       "noemailprefs": "å\9c¨æ\82¨ç\9a\84å\8f\83æ\95¸è¨­ç½®ä¸­æ\8c\87å®\9aä¸\80å\80\8bé\9b»å­\90é\83µä»¶å\9c°å\9d\80以使ç\94¨æ­¤功能。",
+       "passwordsent": "使用者 \"$1\" 的新密碼已寄出至當出登記的電子郵件地址,\n請稍後收到信件後再登入。",
+       "blocked-mailpassword": "您的 IP 位址已被封鎖不允許編輯,密碼復原的功能也同樣被禁止使用以防止被濫用。",
+       "eauthentsent": "以ç\99¼é\80\81ä¸\80å°\81確èª\8dä¿¡å\88°æ\82¨æ\89\80設å®\9aç\9a\84é\9b»å­\90é\83µä»¶å\9c°å\9d\80ã\80\82\nå\9c¨æ\9cªæ\94¶å\88°å\85¶å®\83é\9b»å­\90é\83µä»¶å\89\8dï¼\8cæ\82¨å¿\85é \88å\85\88ä¾\9dç\85§ä¿¡ä»¶ä¸­ç\9a\84æ\8c\87示ï¼\8c確èª\8dé\80\99å\80\8b帳è\99\9f確實æ\98¯æ\82¨æ\9c¬äºº。",
+       "throttled-mailpassword": "密碼重設的電子郵件已經在最近 $1 小時內送出。\n為防止濫用,$1 小時內只能發送一次密碼重設信件。",
+       "mailerror": "發送郵件錯誤$1",
+       "acct_creation_throttle_hit": "使用您目前的 IP 位址的參觀者在最近一天建立了 {{PLURAL:$1|1 個帳號|$1 個帳號}},已超出系統允許的上限。\n因此,目前無法讓使用此 IP 位址的參觀者建立帳號。",
+       "emailauthenticated": "您的電子郵件位址已確認於 $2 的 $3。",
+       "emailnotauthenticated": "您的電子郵件地址尚未確認,\n尚不會發送以下功能的電子郵件給您。",
+       "noemailprefs": "å\9c¨æ\82¨ç\9a\84å\81\8f好設å®\9a中設å®\9aé\9b»å­\90é\83µä»¶å\9c°å\9d\80ï¼\8cè®\93æ\82¨å\8f¯ä»¥ä½¿ç\94¨é\80\99äº\9b功能。",
        "emailconfirmlink": "確認您的電子郵件位址",
-       "invalidemailaddress": "郵箱地址格式不正確,請輸入正確的郵箱位址或清空該輸入框。",
-       "cannotchangeemail": "此圍記(Wiki)不允許對帳號的電子郵件位址進行變更。",
+       "invalidemailaddress": "無法接受格式不正確的電子郵件地址,\n請輸入正確的電子郵件地址格式或略過填寫該欄位。",
+       "cannotchangeemail": "此 Wiki 不允許更改帳號的電子郵件位址。",
        "emaildisabled": "此網站不能發送電子郵件。",
        "accountcreated": "已建立帳號",
-       "accountcreatedtext": "[[{{ns:User}}:$1|$1]]([[{{ns:User talk}}:$1|討論]])的賬戶已經被建立。",
-       "createaccount-title": "在{{SITENAME}}中建立新賬戶",
-       "createaccount-text": "有人在{{SITENAME}}中利用您的電郵創建了一個名為 \"$2\" 的新賬戶($4),密碼是 \"$3\" 。您應該立即登入並更改密碼。\n\n如果該賬戶建立錯誤的話,您可以忽略此訊息。",
-       "login-throttled": "æ\82¨å·²ç¶\93å\98\97試å¤\9a次ç\9a\84ç\99»å\85¥å\8b\95ä½\9cã\80\82\nè«\8bç¨\8dç­\89$1後再試。",
-       "login-abort-generic": "登入錯誤 - 中止",
+       "accountcreatedtext": "使用者帳號 [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|對話]]) 已建立。",
+       "createaccount-title": "{{SITENAME}} 的帳號建立",
+       "createaccount-text": "不明人士使用您的電子郵件位址在 {{SITENAME}} ($4) 建立了一個帳號名稱為 \"$2\",密碼為 \"$3\"。\n您應該立即登入並更改密碼。\n\n如果該帳號是建立錯誤的話,您可以忽略此訊息。",
+       "login-throttled": "æ\82¨å·²ç¶\93å\98\97試太å¤\9a次ç\9a\84ç\99»å\85¥å\8b\95ä½\9cã\80\82\nè«\8bç¨\8dç­\89 $1 後再試。",
+       "login-abort-generic": "您登入失敗 - 已中止",
        "loginlanguagelabel": "語言:$1",
-       "suspicious-userlogout": "æ\82¨ç\99»å\87ºç\9a\84è¦\81æ±\82å·²ç¶\93被æ\8b\92çµ\95ï¼\8cå\9b ç\82ºå®\83å\8f¯è\83½æ\98¯ç\94±å·²æ\90\8då£\9eç\9a\84ç\80\8f覽å\99¨æ\88\96è\80\85å¿«å\8f\96代ç\90\86å\82³é\80\81。",
-       "createacct-another-realname-tip": "真實姓名為選填。\n如果您選擇提供,它將用於貢獻署名。",
+       "suspicious-userlogout": "æ\82¨ç\99»å\87ºç\9a\84è«\8bæ±\82被æ\8b\92çµ\95ï¼\8cå\8f¯è\83½æ\98¯å\9b æ\82¨ä½¿ç\94¨äº\86æ\9c\89å\95\8fé¡\8cç\9a\84ç\80\8f覽å\99¨æ\88\96è\80\85å¿«å\8f\96代ç\90\86伺æ\9c\8då\99¨。",
+       "createacct-another-realname-tip": "真實姓名為選填欄位。\n若您提供真實姓名,它會用於使用者貢獻署名。",
        "pt-login": "登入",
        "pt-login-button": "登入",
-       "pt-createaccount": "建立帳",
+       "pt-createaccount": "建立帳",
        "pt-userlogout": "登出",
-       "php-mail-error-unknown": "在 PHP 的 mail() 參數中的未知錯誤",
-       "user-mail-no-addy": "嘗試不帶電郵地址發送電郵。",
-       "user-mail-no-body": "試圖發送空的或主體不合理短的電子郵件。",
+       "php-mail-error-unknown": "PHP 的 mail() 函數發生不明錯誤。",
+       "user-mail-no-addy": "試圖發送沒有電子郵件地址的電子郵件。",
+       "user-mail-no-body": "試圖發送一個空的或異常簡短的電子郵件。",
        "changepassword": "變更密碼",
        "resetpass_announce": "要完成登入,您必須設定一個新密碼。",
        "resetpass_text": "<!-- 在此處加入文字 -->",
        "newpassword": "新密碼:",
        "retypenew": "確認密碼:",
        "resetpass_submit": "設定密碼並登入",
-       "changepassword-success": "您的密碼已成功變更!",
-       "changepassword-throttled": "您近期嘗試了多次登錄。請等待$1后再試。",
+       "changepassword-success": "您的密碼已變更成功!",
+       "changepassword-throttled": "您最近嘗試了太多次登入。\n請等待 $1 後再試。",
        "resetpass_forbidden": "無法變更密碼",
-       "resetpass-no-info": "æ\82¨å¿\85é \88ç\99»å\85¥å¾\8cç\9b´æ\8e¥é\80²å\85¥這個頁面。",
+       "resetpass-no-info": "æ\82¨å¿\85é \88ç\9b´æ\8e¥ç\99»å\85¥å­\98å\8f\96這個頁面。",
        "resetpass-submit-loggedin": "變更密碼",
        "resetpass-submit-cancel": "取消",
-       "resetpass-wrong-oldpass": "無效的臨時或現有的密碼。\n您可能已成功地更改了您的密碼,或者已經請求一個新的臨時密碼。",
-       "resetpass-recycled": "請將您的密碼重置為不同一個。",
-       "resetpass-temp-emailed": "您是透過一個臨時的發送到郵件中的代碼登入的。要完成登入,您必須在這裡設定一個新密碼:",
+       "resetpass-wrong-oldpass": "無效的臨時或現有密碼。\n您可能早已成功地更改了您的密碼,或者已經請求一個新的臨時密碼。",
+       "resetpass-recycled": "請重設您的密碼為一個與目前不同的密碼。",
+       "resetpass-temp-emailed": "您使用臨時電子郵件發送的代碼登入。\n要完成登入,您必須在這裡設定一個新密碼:",
        "resetpass-temp-password": "臨時密碼:",
-       "resetpass-abort-generic": "æ\93´å\85\85å\85\83件已中止äº\86æ\9b´æ\94¹å¯\86碼操作。",
-       "resetpass-expired": "您的密碼已過期。請設置新密碼以登錄。",
-       "resetpass-expired-soft": "您的密碼已過期,現需重置。請設置新密碼以登錄,或點擊“{{int:resetpass-submit-cancel}}”以稍後重置。",
-       "resetpass-validity-soft": "您的密碼無效:$1 \n\n請選擇一個新密碼,或點擊「{{int:resetpass-submit-cancel}}」以稍後重置。",
+       "resetpass-abort-generic": "æ\93´å\85\85å¥\97件已中止äº\86è®\8aæ\9b´å¯\86碼ç\9a\84操作。",
+       "resetpass-expired": "您的密碼已過期。請設定一個新的密碼以登入。",
+       "resetpass-expired-soft": "您的密碼已過期,需要重新設定。請現在設定您的新密碼,或點選 \"{{int:resetpass-submit-cancel}}\" 稍後再重設。",
+       "resetpass-validity-soft": "您的密碼無效:$1 \n\n請現在設定您的新密碼,或點選 \"{{int:resetpass-submit-cancel}}\" 稍後再重設。",
        "passwordreset": "重新設定密碼",
-       "passwordreset-text-one": "完成此表格以é\87\8dæ\96°è¨­å®\9aæ\82¨ç\9a\84å¯\86碼ã\80\82",
-       "passwordreset-text-many": "{{PLURAL:$1|鍵入一個電郵位址以便遞送新密碼。}}",
+       "passwordreset-text-one": "完成此表å\96®ï¼\8cé\80\8fé\81\8eé\9b»å­\90é\83µä»¶å\82³é\80\81è\87¨æ\99\82å¯\86碼以é\87\8dæ\96°è¨­å®\9aæ\82¨ç\9a\84å¯\86碼ã\80\82",
+       "passwordreset-text-many": "{{PLURAL:$1|請完成此表單以透過電子郵件接收臨時密碼。}}",
        "passwordreset-legend": "重設密碼",
-       "passwordreset-disabled": "此圍記(Wiki)已禁用重設密碼。",
-       "passwordreset-emaildisabled": "此圍記(Wiki)已禁用電子郵件功能。",
+       "passwordreset-disabled": "此 Wiki 已停用重設密碼。",
+       "passwordreset-emaildisabled": "此 Wiki 已停用電子郵件功能。",
        "passwordreset-username": "使用者名稱:",
-       "passwordreset-domain": "域名:",
-       "passwordreset-capture": "檢視產生的電子郵件嗎?",
-       "passwordreset-capture-help": "如果您選中此框,電子郵件(包括臨時密碼)將顯示,並發送給用戶。",
+       "passwordreset-domain": "網域名稱:",
+       "passwordreset-capture": "檢視電子郵件內容?",
+       "passwordreset-capture-help": "若您勾選此核選方塊,電子郵件 (包含臨時密碼) 將直接顯示,並發送給使用者。",
        "passwordreset-email": "電子郵件位址:",
-       "passwordreset-emailtitle": "在{{SITENAME}}上的詳細訊息",
-       "passwordreset-emailtext-ip": "有人(可能是你,來自$1這個IP)要求重置{{SITENAME}}($4)的密碼。該用戶{{PLURAL:$3|是}}與以下電郵地址有關:\n\n$2\n\n{{PLURAL:$3|這個臨時密碼|這些臨時密碼}}會在{{PLURAL:$5|一天|$5天}}到期。\n你應該現在登入並選擇一個新的密碼。如果不是你作出這個請求,又或你已經記\n起你原來的密碼,你可以忽略本信息並使用你原來的密碼。",
-       "passwordreset-emailtext-user": "用戶$1要求重置在{{SITENAME}}($4)的密碼。該用戶{{PLURAL:$3|是}}與以下\n電郵地址有關:\n\n$2\n\n{{PLURAL:$3|這個臨時密碼|這些臨時密碼}}會在{{PLURAL:$5|一天|$5天}}到期。\n你應該現在登入並選擇一個新的密碼。如果不是你作出這個請求,又或你已經記\n起你原來的密碼,你可以忽略本信息並使用你原來的密碼。",
+       "passwordreset-emailtitle": "於 {{SITENAME}} 的帳號詳細資訊",
+       "passwordreset-emailtext-ip": "不明人士 (可能是您自己,來自 IP 位址 $1) 要求重設在 {{SITENAME}} ($4) 的密碼,下列是與此電子郵件地址有關的使用者{{PLURAL:$3|帳號}}:\n\n$2\n\n{{PLURAL:$3|這個臨時密碼|這些臨時密碼}}將會在{{PLURAL:$5|一天|$5 天}}內到期,\n您應立即登入並更改新的密碼。如果不是您要求重設密碼,或您已想起密碼,並不準備修改,\n您可以忽略此訊息並且繼續使用您原本的密碼。",
+       "passwordreset-emailtext-user": "使用者 $1 要求重設在 {{SITENAME}} ($4) 的密碼,下列是與此電子郵件地址有關的使用者{{PLURAL:$3|帳號}}:\n\n$2\n\n{{PLURAL:$3|這個臨時密碼|這些臨時密碼}}將會在{{PLURAL:$5|一天|$5 天}}內到期,\n您應立即登入並更改新的密碼。如果不是您要求重設密碼,或您已想起密碼,並不準備修改,\n您可以忽略此訊息並且繼續使用您原本的密碼。",
        "passwordreset-emailelement": "使用者名稱:$1\n臨時密碼:$2",
        "passwordreset-emailsent": "已發送重設密碼的電子郵件。",
        "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-none": "(無)",
+       "changeemail-password": "您於 {{SITENAME}} 的密碼:",
        "changeemail-submit": "變更電子郵件",
        "changeemail-cancel": "取消",
-       "changeemail-throttled": "您近期嘗試了太多次登錄。請等待$1后再試。",
+       "changeemail-throttled": "您最近嘗試了太多次登入。\n請等待 $1 後再試。",
        "resettokens": "重設密鑰",
-       "resettokens-text": "你可以在這裡重設與您的帳戶私隱有關連的密鑰。\n\n如果您意外地與任何一個人分享這些密鑰,或者您的帳戶被入侵、受到破壞,您應該重設密鑰。",
+       "resettokens-text": "您可以在此重設用來存取您帳號相關隱私資料的密鑰。\n\n若您不小心將您的密鑰分享給其他人或您的帳號已遭到入侵、破壞,應該要重設此密鑰。",
        "resettokens-no-tokens": "沒有可重設的密鑰。",
-       "resettokens-legend": "重設密鑰",
-       "resettokens-tokens": "密鑰:",
-       "resettokens-token-label": "$1(現時為$2)",
-       "resettokens-watchlist-token": "請於[[Special:Watchlist|監視列表]]中更改網上訂閱(Atom或RSS)的權杖",
+       "resettokens-legend": "重設密鑰",
+       "resettokens-tokens": "密鑰",
+       "resettokens-token-label": "$1 (目前為 $2)",
+       "resettokens-watchlist-token": "用來訂閱 [[Special:Watchlist|監視列表]] Atom/RSS 的密鑰",
        "resettokens-done": "已重設密鑰。",
-       "resettokens-resetbutton": "重設所選的密鑰",
+       "resettokens-resetbutton": "重設已選擇的密鑰",
        "bold_sample": "粗體文字",
        "bold_tip": "粗體文字",
        "italic_sample": "斜體文字",
        "link_sample": "連結標題",
        "link_tip": "內部連結",
        "extlink_sample": "http://www.example.com 連結標題",
-       "extlink_tip": "外部連結(加前綴 http://)",
-       "headline_sample": "標題文字",
-       "headline_tip": "2級標題文字",
-       "nowiki_sample": "在此插入非格式文字",
-       "nowiki_tip": "插入非格式文字",
-       "image_tip": "嵌入檔案",
+       "extlink_tip": "外部連結 (記得以 http:// 開頭)",
+       "headline_sample": "第 1 層標題文字",
+       "headline_tip": "第 2 層標題文字",
+       "nowiki_sample": "插入非格式化文字",
+       "nowiki_tip": "忽略 Wiki 格式化語法",
+       "image_tip": "附加檔案",
        "media_tip": "檔案連結",
-       "sig_tip": "帶有時間的簽名",
-       "hr_tip": "水平線 (小心使用)",
+       "sig_tip": "您的簽名與日期時間",
+       "hr_tip": "水平線 (少用)",
        "summary": "摘要:",
-       "subject": "主題:",
-       "minoredit": "這是一個小修",
-       "watchthis": "ç\9b£è¦\96æ\9c¬é \81",
-       "savearticle": "儲存本頁",
+       "subject": "主題/標題:",
+       "minoredit": "這是一個小修",
+       "watchthis": "ç\9b£è¦\96æ­¤é \81é\9d¢",
+       "savearticle": "儲存頁面",
        "preview": "預覽",
        "showpreview": "顯示預覽",
-       "showlivepreview": "即時預覽",
        "showdiff": "顯示差異",
-       "anoneditwarning": "'''警告:'''您沒有登入。\n您的IP位址將記錄在此頁的編輯歷史中。",
-       "anonpreviewwarning": "''您沒有登入。保存頁面將會把您的IP位址記錄在此頁的編輯歷史中。''",
-       "missingsummary": "'''提示:''' 您沒有提供一個編輯摘要。如果您再次單擊「{{int:savearticle}}」,您的編輯將不帶編輯摘要儲存。",
-       "missingcommenttext": "請在下輸入評論。",
-       "missingcommentheader": "'''提示:''' 您沒有為此評論提供一個標題。如果您再次單擊「{{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}}|管理員]]討論此次封禁。若您已在[[Special:Preferences|帳號設置]]中配置了一個有效的電子郵件地址,且未被封禁電子郵件功能,則您可通過“發送電子郵件給這位用戶”功能來聯絡相關管理員。您當前的IP地址是$3,此次封禁的ID爲#$5。請在您的查詢中註明上述所有信息。",
-       "autoblockedtext": "{{GENDER:|你|妳|你}}的IP地址已經被自動查封,由於先前的另一位用戶被$1所查封。\n而查封的原因是:\n\n:''$2''\n\n* 這次查封的開始時間是:$8\n* 這次查封的到期時間是:$6\n* 對於被查封者:$7\n\n{{GENDER:|你|妳|你}}可以聯絡$1或者其他的[[{{MediaWiki:Grouppage-sysop}}|管理員]],討論這次查封。\n除非{{GENDER:|你|妳|你}}已經在{{GENDER:|你|妳|你}}的[[Special:Preferences|賬號參數設置]]中設定了一個有效的電子郵件地址,否則{{GENDER:|你|妳|你}}是不能使用「電郵這位用戶」的功能。當設定了一個有效的電子郵件地址後,這個功能是不會封鎖的。\n\n您現時正在使用的 IP 地址是 $3,查封ID是 #$5。 請在{{GENDER:|你|妳|你}}的查詢中註明以上所有的資料。",
-       "blockednoreason": "無給出原因",
-       "whitelistedittext": "您必須先$1才可編輯頁面。",
-       "confirmedittext": "å\9c¨ç·¨è¼¯æ­¤é \81ä¹\8bå\89\8dæ\82¨å¿\85é \88確èª\8dæ\82¨ç\9a\84é\83µç®±ä½\8då\9d\80ã\80\82è«\8bé\80\8fé\81\8e[[Special:Preferences|å\81\8f好設å®\9a]]設å®\9a並é©\97è­\89æ\82¨ç\9a\84é\83µç®±å\9c°址。",
-       "nosuchsectiontitle": "找不到段落",
+       "anoneditwarning": "<strong>警告:</strong>您尚未登入。\n您的 IP 位址將記錄在此頁的編輯歷史中。",
+       "anonpreviewwarning": "<em>您尚未登入。儲存頁面會將您的 IP 位址記錄在此頁面的編輯歷史中。</em>",
+       "missingsummary": "<strong>提醒:</strong>您未填寫編輯摘要。\n若您再點選 \"{{int:savearticle}}\" 一次,將略過摘要直接儲存您的編輯。",
+       "missingcommenttext": "請在下輸入評論。",
+       "missingcommentheader": "<strong>提醒:</strong>您未填寫此評論的主旨/標題。\n若您再點選 \"{{int:savearticle}}\" 一次,將略過主旨/標題直接儲存您的評論。",
+       "summary-preview": "摘要預覽",
+       "subject-preview": "主旨/標題預覽:",
+       "blockedtitle": "使用者已被封鎖",
+       "blockedtext": "<strong>您的使用者名稱或 IP 位址以被封鎖。</strong>\n\n您被 $1 封鎖,\n原因爲 <em>$2</em>。\n\n* 封鎖開始時間:$8\n* 封鎖結束時間:$6\n* 相關封鎖對象:$7\n\n您可以聯繫 $1 或其他的 [[{{MediaWiki:Grouppage-sysop}}|管理員]] 討論封鎖的相關問題。\n若您已在 [[Special:Preferences|偏好設定]] 中設定了一個有效的電子郵件地址,且尚未被封鎖郵件功能,則您可透過 \"發送電子郵件給這位使用者\" 的功能來聯絡相關管理員。\n您目刖的 IP 位址是 $3,此次封鎖的 ID 爲 #$5。\n請您在詢問時附註以上詳細訊息。",
+       "autoblockedtext": "因先前的另一位使用者被 $1 封鎖,您的 IP 位址已被自動封鎖。\n原因是:\n\n:<em>$2</em>\n\n* 封鎖開始時間:$8\n* 封鎖結束時間:$6\n* 相關封鎖對象:$7\n\n您可以聯繫 $1 或其他的 [[{{MediaWiki:Grouppage-sysop}}|管理員]] 討論封鎖的相關問題。\n若您已在 [[Special:Preferences|偏好設定]] 中設定了一個有效的電子郵件地址,且尚未被封鎖郵件功能,則您可透過 \"發送電子郵件給這位使用者\" 的功能來聯絡相關管理員。\n您目刖的 IP 位址是 $3,此次封鎖的 ID 爲 #$5。\n請您在詢問時附註以上詳細訊息。",
+       "blockednoreason": "未說明原因",
+       "whitelistedittext": "請先 $1 才可編輯頁面。",
+       "confirmedittext": "å\9c¨ç·¨è¼¯æ­¤é \81ä¹\8bå\89\8dæ\82¨å¿\85é \88確èª\8dæ\82¨ç\9a\84é\9b»å­\90é\83µä»¶ä½\8då\9d\80ã\80\82\nè«\8bé\80\8fé\81\8e [[Special:Preferences|å\81\8f好設å®\9a]] è¨­å®\9a並é©\97è­\89æ\82¨ç\9a\84é\9b»å­\90é\83µä»¶ä½\8d址。",
+       "nosuchsectiontitle": "找不到章節",
        "nosuchsectiontext": "您嘗試編輯的章節並不存在。\n可能在您查看頁面時已經移動或刪除。",
        "loginreqtitle": "需要登入",
        "loginreqlink": "登入",
-       "loginreqpagetext": "您必須$1才能檢視其它頁面。",
+       "loginreqpagetext": "您必須 $1 才能檢視其它頁面。",
        "accmailtitle": "密碼已寄出",
-       "accmailtext": "[[User talk:$1|$1]]的隨機產生密碼已經寄到$2。其可於登入後予以'''[[Special:ChangePassword|更改]]'''。",
-       "newarticle": "(新)",
-       "newarticletext": "您進入了一個尚未建立的頁面。\n要建立該頁面,請在下面的編輯框中輸入內容(詳情參見[$1 幫助])。\n如果您是不小心來到此頁面,直接點擊您瀏覽器中的「返回」按鈕返回。",
-       "anontalkpagetext": "---- ''這是一個還未建立賬號的匿名用戶的對話頁。我們因此只能用IP地址來與他/她聯絡。該IP地址可能由幾名用戶共享。如果您是一名匿名用戶並認為本頁上的評語與您無關,請[[Special:UserLogin/signup|創建新賬號]]或[[Special:UserLogin|登入]]以避免在未來於其他匿名用戶混淆。''",
-       "noarticletext": "此頁面目前沒有內容,您可以在其它頁面[[Special:Search/{{PAGENAME}}|搜尋此頁標題]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜尋有關日誌],\n或[{{fullurl:{{FULLPAGENAME}}|action=edit}} 編輯此頁]</span>。",
-       "noarticletext-nopermission": "此頁目前沒有內容。\n您可以在其它頁[[Special:Search/{{PAGENAME}}|搜尋此頁標題]],或<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜尋有關日誌]</span>,但您沒有權限建立此頁。",
-       "missing-revision": "「{{FULLPAGENAME}}」的#$1修訂版本不存在。\n\n這通常是因為過時的頁面歷史鏈接被刪除。\n詳情請閱[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 刪除日誌]。",
-       "userpage-userdoesnotexist": "用戶「$1」尚未註冊。\n請在建立/編輯這個頁面前先檢查一下。",
-       "userpage-userdoesnotexist-view": "未曾建立用戶名「$1」。",
-       "blocked-notice-logextract": "這位用戶現正被封鎖。\n下面有最近的封鎖紀錄以供參考:",
-       "clearyourcache": "'''注意:'''在保存以後,您必須繞過瀏覽器緩存才能看到所作出的改變。\n* '''火狐(Firefox)/Safari:'''按住“Shift”鍵再點擊“刷新”,或按下“Ctrl-F5”或“Ctrl-R”(Mac上為“⌘-R”)\n* '''谷歌瀏覽器(Google Chrome):'''按下“Ctrl-Shift-R”(Mac上為“⌘-Shift-R”)\n* '''Internet Explorer:'''按住“Ctrl”鍵再點擊“刷新”,或按下“Ctrl-F5”\n* '''Opera:'''在“工具→首選項”中清除緩存",
-       "usercssyoucanpreview": "'''提示:''' 在保存前請用「{{int:showpreview}}」按鈕來測試您新的 CSS 。",
-       "userjsyoucanpreview": "'''提示:''' 在保存前請用「{{int:showpreview}}」按鈕來測試您新的 JavaScript 。",
-       "usercsspreview": "'''記住您只是在預覽您的個人 CSS。'''\n'''還沒有儲存﹗'''",
-       "userjspreview": "'''記住您只是在測試/預覽您的個人 JavaScript。'''\n'''還沒有儲存﹗'''",
-       "sitecsspreview": "'''記住你現在只是預覽此 CSS。'''\n'''還沒有儲存!'''",
-       "sitejspreview": "'''記住你現在只是預覽此 JavaScript 代碼。'''\n'''還沒有儲存!'''",
-       "userinvalidcssjstitle": "'''警告:''' 不存在面板「$1」。\n注意自訂的 .css 和 .js 頁要使用小寫標題,例如,{{ns:user}}:Foo/vector.css 不同於 {{ns:user}}:Foo/Vector.css。",
-       "updated": "(已更新)",
-       "note": "'''注意:'''",
-       "previewnote": "'''請記住這只是預覽。'''\n您的變更尚未儲存!",
-       "continue-editing": "往編輯框",
-       "previewconflict": "這個預覽顯示了上面文字編輯區中的內容。它將在{{GENDER:|你|妳|你}}選擇保存後出現。",
-       "session_fail_preview": "'''很抱歉!由於部份資料遺失,我們無法處理您的編輯。'''\n請再試一次。\n如果仍然失敗,請[[Special:UserLogout|登出]]後重新登入。",
-       "session_fail_preview_html": "'''抱歉!部份資料已遺失,我們無法處理您的編輯。'''\n\n''由於{{SITENAME}}已經開放原始 HTML 碼,預覽已經隱藏以預防 JavaScript 的攻擊。''\n\n'''如果這個編輯過程沒有問題,請再試一次。如果仍然有問題,請[[Special:UserLogout|登出]]後再重新登入一次。'''",
-       "token_suffix_mismatch": "'''由於您用戶端中的編輯信符毀損了一些標點符號字元,為防止編輯的文字損壞,您的編輯已經被拒絕。'''\n這種情況通常出現於使用含有很多臭蟲、以網絡為主的匿名代理服務的時候。",
-       "edit_form_incomplete": "編輯表單的某些部分沒有到達伺服器 ;請檢查您的編輯內容是否完整並再試一次。",
-       "editing": "編輯「$1」",
-       "creating": "建立「$1」",
-       "editingsection": "編輯「$1」(段落)",
-       "editingcomment": "編輯「$1」(新段落)",
+       "accmailtext": "[[User talk:$1|$1]] 的隨機密碼已經寄送至 $2,可登入後至 <em>[[Special:ChangePassword|變更密碼]] 頁面更改</em>。",
+       "newarticle": "(新)",
+       "newarticletext": "您正連結至一頁不存在頁面。\n要建立該頁面,請在下方的編輯框中輸入內容 (詳情請參考 [$1 説明頁面])。\n如果您是不小心來到此頁面,請點選瀏覽器的 <strong>返回</strong> 按鈕。",
+       "anontalkpagetext": "----\n<em>此討論頁面是給尚未建立帳號的匿名使用者使用</em>\n因此我們必須使用 IP 位址來辨識身份,但相同的 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}}|搜尋此頁面標題]],或 <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜尋相關日誌]</span>,但您沒有權限建立此頁面。",
+       "missing-revision": "頁面名稱 \"{{FULLPAGENAME}}\" 的 #$1 修訂版本不存在。\n\n通常是因連結到過期的歷史頁面,該頁面已被刪除。\n詳情請參考 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 刪除日誌]。",
+       "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> 中清除快取。",
+       "usercssyoucanpreview": "<strong>提示:</strong>在儲存之前使用 \"{{int:showpreview}}\" 按鈕來測試您的新 CSS。",
+       "userjsyoucanpreview": "<strong>提示:</strong>在儲存之前使用 \"{{int:showpreview}}\" 按鈕來測試您的新 JavaScript。",
+       "usercsspreview": "<strong>您目前正預覽您的使用者 CSS,CSS 還尚未儲存!</strong>",
+       "userjspreview": "<strong>您目前正預覽您的使用者 JavaScript,JavaScript 還尚未儲存!</strong>",
+       "sitecsspreview": "<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>",
+       "previewnote": "<strong>您目前正在預覽,您的變更還尚未儲存!</strong>",
+       "continue-editing": "å\89\8då¾\80編輯æ¡\86",
+       "previewconflict": "此預覽顯示了您於上方文字編輯框中的內容儲存之後將會顯示的結果。",
+       "session_fail_preview": "<strong>很抱歉!由於連線階段的資料遺失,我們無法處理您的編輯動作。</strong>\n請再試一次。\n如果仍然失敗,請 [[Special:UserLogout|登出]] 後重新登入。",
+       "session_fail_preview_html": "<strong>很抱歉!由於連線階段的資料遺失,我們無法處理您的編輯動作。</strong>\n\n<em>由於 {{SITENAME}} 開啟了原始 HTML 模式,將不會顯示預覽畫面以避免 JavaScript 攻擊。</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": "有人在{{GENDER:|你|妳|你}}開始編輯後更改了頁面。\n上面的文字框內顯示的是目前本頁的內容。\n{{GENDER:|你|妳|你}}所做的修改顯示在下面的文字框中。\n{{GENDER:|你|妳|你}}應當將{{GENDER:|你|妳|你}}所做的修改加入現有的內容中。\n'''只有'''在上面文字框中的內容會在{{GENDER:|你|妳|你}}點擊「{{int:savearticle}}」後被保存。",
+       "explainconflict": "在您開始編輯之後已有其他人儲存了此頁面。\n上方的文字框內顯示了目前頁面中的文字內容,\n您所變更的文字內容顯示在下方文字框中。\n您須要將您所變更的文字內容合併到已儲存的文字內容當中。\n若您直接點選 \"{{int:savearticle}}\" <strong>只有</strong> 上方文字框中的內容會被儲存。",
        "yourtext": "您的文字",
-       "storedversion": "已儲存修訂版本",
-       "nonunicodebrowser": "'''警告: 您的瀏覽器不兼容Unicode編碼。'''這裡有一個工作區將使您能安全地編輯頁面: 非ASCII字元將以十六進製編碼模式出現在編輯框中。",
-       "editingold": "'''警告:{{GENDER:|你|妳|你}}正在編輯的是本頁的舊版本。'''\n如果{{GENDER:|你|妳|你}}保存它的話,在本版本之後的任何修改都會遺失。",
+       "storedversion": "已儲存修訂",
+       "nonunicodebrowser": "<strong>警告:您的瀏覽器不相容 Unicode。</strong>\n暫時解決的方式是先在您可安全編輯頁面的地方編輯:非 ASCII 字元在編輯框中會以 16 進位編碼顯示。",
+       "editingold": "<strong>警告:您目前正編輯頁面的舊修訂版本。</strong>\n若您儲存,在此修訂之後變更的任何內容將會遺失。",
        "yourdiff": "差異",
-       "copyrightwarning": "請注意您對{{SITENAME}}的所有貢獻都被認為是在$2下發佈,請檢視在$1的細節。\n如果您不希望您的文字被任意修改和再散佈,請不要提交。<br />\n您同時也要向我們保證您所提交的內容是您自己所作,或得自一個不受版權保護或相似自由的來源。\n'''不要在未獲授權的情況下發表!'''<br />",
-       "copyrightwarning2": "請注意您對{{SITENAME}}的所有貢獻\n都可能被其他貢獻者編輯,修改或刪除。\n如果您不希望您的文字被任意修改和再散佈,請不要提交。<br />\n您同時也要向我們保證您所提交的內容是您自己所作,或得自一個不受版權保護或相似自由的來源(參閱$1的細節)。\n'''不要在未獲授權的情況下發表!'''",
-       "longpageerror": "'''錯誤:您所提交的文本長度有{{PLURAL:$1|1|$1}}KB,這大於{{PLURAL:$2|1|$2}}KB的最大值。 '''\n因此,該文本無法保存。",
-       "readonlywarning": "'''警告: 資料庫被鎖定以進行維護,所以您目前將無法保存您的修改。'''\n您可先複製您的文字並保存到文字檔案,然後等一會兒再修改。\n\n鎖定資料庫的管理員有如下解釋:$1",
-       "protectedpagewarning": "'''警告:本頁已經被保護,只有擁有管理員許可權的用戶才可修改。'''\n最近的日誌在下面提供以便參考:",
-       "semiprotectedpagewarning": "'''注意:'''本頁面被保護,僅限註冊用戶編輯。\n最近的日誌在下面提供以便參考:",
-       "cascadeprotectedwarning": "'''警告:'''本頁已經被保護,只有擁有管理員權限的用戶才可修改,因為本頁已被以下連鎖保護的{{PLURAL:$1|一個|多個}}頁面所包含:",
-       "titleprotectedwarning": "'''警告:本頁面已被保護,需要[[Special:ListGroupRights|指定權限]]方可創建。'''\n最近的日誌在下面提供以便參考:",
-       "templatesused": "此頁面包含以下{{PLURAL:$1|模板}}:",
-       "templatesusedpreview": "此次預覽中使用的{{PLURAL:$1|模板}}有:",
-       "templatesusedsection": "在這個段落上使用的{{PLURAL:$1|模板}}有:",
-       "template-protected": "(保護)",
-       "template-semiprotected": "(半保護)",
-       "hiddencategories": "這個頁面是屬於$1個隱藏分類的成員:",
+       "copyrightwarning": "請注意,所有於 {{SITENAME}} 所做的貢獻會依據 $2 授權條款發佈 (詳情請見 $1)。\n若您不希望您的著作被任意修改與散佈,請勿在此發表文章。<br />\n您同時向我們保証在此的著作內容是您自行撰寫,或是取自不受版權保護的公開領域或自由資源。\n<strong>請勿在未經授權的情況下發表文章!</strong>",
+       "copyrightwarning2": "請注意,所有於 {{SITENAME}} 所做的貢獻可能會被其他貢獻者編輯,修改或刪除。\n若您不希望您的著作被任意修改與散佈,請勿在此發表文章。<br />\n您同時向我們保証在此的著作內容是您自行撰寫,或是取自不受版權保護的公開領域或自由資源 (詳情請見 $1)。\n<strong>請勿在未經授權的情況下發表文章!</strong>",
+       "longpageerror": "<strong>錯誤:您所送出的文字內容共有 {{PLURAL:$1|1 KB|$1 KB}},已超出系統上限 {{PLURAL:$2|1 KB|$2 KB}}。</strong>\n\n無法儲存。",
+       "readonlywarning": "<strong>警告:資料庫已被鎖定以進行維護,因此無法儲存您目前所做的編輯動作。</strong>\n您可先複製您的文字並貼上到文字檔案中儲存,稍後再儲存您編輯。\n\n鎖定資料庫的管理員有以下說明:$1",
+       "protectedpagewarning": "<strong>警告:本頁已經被保護,只有擁有管理員權限的使用者才可編輯。</strong>\n以下提供最近的日誌以便參考:",
+       "semiprotectedpagewarning": "<strong>注意:</strong>本頁已經被保護,只有已註冊的使用者才可編輯。\n以下提供最近的日誌以便參考:",
+       "cascadeprotectedwarning": "<strong>警告:</strong>本頁已經被保護,只有擁有管理員權限的使用者才可編輯,此頁面被下列頁面引用因此連鎖保護:",
+       "titleprotectedwarning": "<strong>警告:本頁面已被保護,需要 [[Special:ListGroupRights|特殊權限]] 方可建立。</strong>\n以下提供最近的日誌以便參考:",
+       "templatesused": "此頁面使用了以下{{PLURAL:$1|樣版}}:",
+       "templatesusedpreview": "此預覽使用了以下{{PLURAL:$1|樣版}}:",
+       "templatesusedsection": "此頁面使用了以下{{PLURAL:$1|樣版}}:",
+       "template-protected": "(受保護)",
+       "template-semiprotected": "(受半保護)",
+       "hiddencategories": "此頁面屬於 {{PLURAL:$1|1 個隱藏分類|$1 個隱藏分類}}的成員:",
        "edittools": "<!-- 此處的文字將被顯示在編輯和上傳表單以下。 -->",
-       "nocreatetext": "{{SITENAME}}限制了創建新頁面的功能。{{GENDER:|你|妳|你}}可以返回並編輯已有的頁面,或者[[Special:UserLogin|登錄或創建新賬戶]]。",
-       "nocreate-loggedin": "您並無許可權去創建新頁面。",
-       "sectioneditnotsupported-title": "ä¸\8dæ\94¯æ\8c\81段è\90½ç·¨è¼¯",
-       "sectioneditnotsupported-text": "æ­¤é \81é\9d¢ä¸\8dæ\94¯æ\8c\81段è\90½ç·¨è¼¯。",
+       "nocreatetext": "{{SITENAME}} 已限制建立新頁面的功能。 {{GENDER:|你|妳|你}}可返回並編輯既有的頁面,或者 [[Special:UserLogin|登入或建立新帳號]]。",
+       "nocreate-loggedin": "您沒有權限建立新的頁面。",
+       "sectioneditnotsupported-title": "ä¸\8dæ\94¯æ\8f´ç·¨è¼¯ç« ç¯\80",
+       "sectioneditnotsupported-text": "æ­¤é \81é\9d¢ä¸\8dæ\94¯æ\8f´ç·¨è¼¯ç« ç¯\80。",
        "permissionserrors": "權限錯誤",
-       "permissionserrorstext": "根據以下的{{PLURAL:$1|原因}},您並無權限去做以下的動作:",
-       "permissionserrorstext-withaction": "根據以下的{{PLURAL:$1|原因}},您並無權限去做$2:",
-       "recreate-moveddeleted-warn": "'''警告: {{GENDER:|你|妳|你}}現在重新建立一個先前曾經刪除過的頁面。'''\n\n{{GENDER:|你|妳|你}}應該要考慮一下繼續編輯這一個頁面是否合適。\n為方便起見,這一個頁面的刪除記錄已經在下面提供:",
-       "moveddeleted-notice": "這個頁面已經刪除。\n這個頁面的刪除和移動日誌已在下面提供以便參考。",
+       "permissionserrorstext": "由於下列{{PLURAL:$1|原因}},您沒有權限進行目前的動作:",
+       "permissionserrorstext-withaction": "由於下列{{PLURAL:$1|原因}},您沒有權限進行 $2 的動作:",
+       "recreate-moveddeleted-warn": "<strong>警告:您正重新建立先前已刪除的頁面。</strong>\n\n您應考慮是否繼續編輯此頁。\n在此提供刪除與移動日誌方便作為參考:",
+       "moveddeleted-notice": "此頁面已刪除。\n下方提供此頁面的刪除和移動日誌以便參考。",
        "log-fulllog": "檢視完整日誌",
-       "edit-hook-aborted": "編輯被鈎取消。\n它並無給出解釋。",
-       "edit-gone-missing": "不能更新頁面。\n它可能剛剛被刪除。",
+       "edit-hook-aborted": "編輯已被 Hook 中止。\n且未回應無任何說明。",
+       "edit-gone-missing": "無法更新頁面。\n該頁面可能已被刪除。",
        "edit-conflict": "編輯衝突。",
-       "edit-no-change": "您的編輯已經略過,因為文字無任何改動。",
-       "postedit-confirmation": "您的編輯已儲存。",
-       "edit-already-exists": "不可以建立一個新頁面。\n它已經存在。",
+       "edit-no-change": "因您未更動任何文字,已忽略此次編輯。",
+       "postedit-confirmation-created": "已建立頁面。",
+       "postedit-confirmation-restored": "已還原頁面。",
+       "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": "離開這個頁面可能會令您失去之前作出的所有更改。若您已經登入,您可在偏好設定的「{{int:prefs-editing}}」部份裡關閉此警告。",
-       "editpage-notsupportedcontentformat-title": "內容格式尚無法支援",
-       "editpage-notsupportedcontentformat-text": "內容模型$2尚無法支援內容格式$1。",
+       "content-not-allowed-here": "頁面 [[$2]] 不允許使用 \"$1\" 語法內容",
+       "editwarning-warning": "離開此頁面可能會令您遺失之前所作的所有更改。\n若您已經登入,您可在偏好設定的 \"{{int:prefs-editing}}\" 項目關閉此警告。",
+       "editpage-notsupportedcontentformat-title": "不支援此內容格式",
+       "editpage-notsupportedcontentformat-text": "內容語法 $2 不支援使用 $1 格式的內容。",
        "content-model-wikitext": "維基文字",
        "content-model-text": "純文字",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
-       "expensive-parserfunction-warning": "警告: 這個頁面有太多耗費的語法功能呼叫。\n\n它應該少過$2次呼叫,現在有$1次呼叫。",
-       "expensive-parserfunction-category": "頁面中有太多耗費的語法功能呼叫",
-       "post-expand-template-inclusion-warning": "警告:包括模板在內的大小過大。\n一些模板將不會包括在內。",
-       "post-expand-template-inclusion-category": "模板包含上限已經超過的頁面",
-       "post-expand-template-argument-warning": "警告: 這個頁面有最少一個模參數有過大擴展大小。\n這些參數會被略過。",
-       "post-expand-template-argument-category": "包含着略過模板參數的頁面",
-       "parser-template-loop-warning": "已偵測迴歸模板: [[$1]]",
-       "parser-template-recursion-depth-warning": "已超過迴歸模板深度限制 ($1)",
-       "language-converter-depth-warning": "已超過字詞轉換器深度限制($1)",
-       "node-count-exceeded-category": "頁面的節點數超出限制",
-       "node-count-exceeded-warning": "頁面超出節點數",
-       "expansion-depth-exceeded-category": "擴展深度超出限制的頁面",
-       "expansion-depth-exceeded-warning": "頁面超出擴展深度",
-       "parser-unstrip-loop-warning": "檢測到迴圈",
-       "parser-unstrip-recursion-limit": "遞歸超過限制 ($1)",
-       "converter-manual-rule-error": "手動語言轉換規則中檢測到錯誤",
-       "undo-success": "該編輯可以被撤銷。請檢查以下對比以核實這正是您想做的,然後儲存以下更改以完成撤銷編輯。",
-       "undo-failure": "由於中途的編輯不一致,此編輯不能撤銷。",
-       "undo-norev": "由於其修訂版本不存在或已刪除,此編輯不能撤銷。",
-       "undo-nochange": "是次編輯似乎已經被撤銷。",
-       "undo-summary": "取消由[[Special:Contributions/$2|$2]] ([[User talk:$2|對話]])所作出的修訂 $1",
-       "undo-summary-username-hidden": "隱藏的用戶撤銷$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": "引用樣板後大小超出限制的頁面",
+       "post-expand-template-argument-warning": "<strong>警告:</strong>此頁面有一個以上的樣版參數過長。\n過長的參數會被直接忽略。",
+       "post-expand-template-argument-category": "樣版參數有部份被忽略的頁面",
+       "parser-template-loop-warning": "偵測到樣版遞迴:[[$1]]",
+       "parser-template-recursion-depth-warning": "超出樣版遞迴深度限制 ($1)",
+       "language-converter-depth-warning": "已超出語言轉換器深度限制 ($1)",
+       "node-count-exceeded-category": "節點數量超出限制的頁面",
+       "node-count-exceeded-category-desc": "用來顯示超過節點數量頁面的分類。",
+       "node-count-exceeded-warning": "頁面超出節點數量限制",
+       "expansion-depth-exceeded-category": "展開深度超出限制的頁面",
+       "expansion-depth-exceeded-category-desc": "這是超出展開深度頁面的分類。",
+       "expansion-depth-exceeded-warning": "頁面超出展開深度限制",
+       "parser-unstrip-loop-warning": "偵測到 Unstrip 迴圈",
+       "parser-unstrip-recursion-limit": "Unstrip 遞迴超出限制 ($1)",
+       "converter-manual-rule-error": "手動語言轉換規則時偵測到錯誤",
+       "undo-success": "此編輯可以被還原。\n請檢查以下比較表,確認您是否要還原,然後儲存以下變更以完成編輯還原。",
+       "undo-failure": "由於編輯的修訂間有衝突,此編輯不能還原。",
+       "undo-norev": "此編輯不存在或已被刪除,無法還原。",
+       "undo-nochange": "此編輯已被還原。",
+       "undo-summary": "取消由 [[Special:Contributions/$2|$2]] ([[User talk:$2|對話]]) 所作出的修訂 $1",
+       "undo-summary-username-hidden": "還原隱藏使用者的修訂 $1",
        "cantcreateaccounttitle": "無法建立帳號",
-       "cantcreateaccount-text": "從這個 IP 位址 (<b>$1</b>) 建立帳號已經被 [[User:$3|$3]] 禁止。\n\n當中被 $3 封禁的原因是 ''$2''",
-       "cantcreateaccount-range-text": "於此IP位址段'''$1'''之賬戶註冊被[[User:$3|$3]]禁止,其亦包括您所使用之IP位址('''$4''')。\n$3所述禁止原因為“$2”。",
-       "viewpagelogs": "æ\9f¥è©¢é\80\99å\80\8b頁面的日誌",
-       "nohistory": "æ²\92æ\9c\89æ\9c¬é \81的修訂記錄。",
-       "currentrev": "最新修訂版本",
-       "currentrev-asof": "$1的最新修訂版本",
-       "revisionasof": "$1的修訂版本",
-       "revision-info": "在$1由$2所做的修訂版本",
+       "cantcreateaccount-text": "來自這個 IP 位址 (<strong>$1</strong>) 建立的帳號已經被 [[User:$3|$3]] 封鎖。\n\n $3 封鎖的原因是 <em>$2</em>",
+       "cantcreateaccount-range-text": "來自 IP 位址範圍 '''$1''',包含您的 IP 位置 ('''$4''') 所建立的帳號已經被 [[User:$3|$3]] 封鎖。\n\n $3 封鎖的原因是 ''$2''",
+       "viewpagelogs": "檢è¦\96æ­¤頁面的日誌",
+       "nohistory": "æ­¤é \81æ²\92æ\9c\89ä»»ä½\95的修訂記錄。",
+       "currentrev": "最新修訂",
+       "currentrev-asof": "於 $1 的最新修訂",
+       "revisionasof": "於 $1 的修訂",
+       "revision-info": "於 $1 由 $2 所做的修訂",
        "previousrevision": "←上個修訂",
-       "nextrevision": "下修訂→",
+       "nextrevision": "下修訂→",
        "currentrevisionlink": "最新修訂",
        "cur": "目前",
-       "next": "å¾\8cç¹¼",
-       "last": "å\85\88å\89\8d",
-       "page_first": "最前",
-       "page_last": "最後",
-       "histlegend": "差異選擇:標記要比較修訂版本的單選按鈕並點擊底部的按鈕進行比較。<br />\n說明:'''({{int:cur}})''' 指與最新修訂版本比較,'''({{int:last}})''' 指與前一個修訂修訂版本比較,'''{{int:minoreditletter}}''' = 小修改。",
+       "next": "å¾\8cç­\86",
+       "last": "å\89\8dç­\86",
+       "page_first": "第一頁",
+       "page_last": "最後",
+       "histlegend": "比較選擇的版本差異:選要比較修訂版本的單選方塊並點選網頁底部的按鈕進行比較。<br />\n符號說明:<strong>({{int:cur}})</strong> = 與最新的修訂版本比較,<strong>({{int:last}})</strong> = 與前一筆修訂版本比較,<strong>{{int:minoreditletter}}</strong> = 小修訂。",
        "history-fieldset-title": "瀏覽歷史",
-       "history-show-deleted": "å\83\85é\99\90å·²å\88ªé\99¤",
-       "histfirst": "最早版本",
-       "histlast": "最新版本",
-       "historysize": "($1 位元組)",
-       "historyempty": "(空)",
+       "history-show-deleted": "å\8fªé¡¯ç¤ºå·²å\88ªé\99¤ç\9a\84ä¿®è¨\82",
+       "histfirst": "最",
+       "histlast": "最新",
+       "historysize": "($1 位元組)",
+       "historyempty": "(空)",
        "history-feed-title": "修訂歷史",
-       "history-feed-description": "本站上此頁的修訂歷史",
-       "history-feed-item-nocomment": "$1  $2",
-       "history-feed-empty": "所請求的頁面不存在。它可能已被刪除或重新命名。\n嘗試[[Special:Search|搜索本站]]獲得相關的新建頁面。",
-       "rev-deleted-comment": "(編輯摘要已除)",
-       "rev-deleted-user": "(用戶名已移除)",
-       "rev-deleted-event": "(日誌已除)",
-       "rev-deleted-user-contribs": "[用戶名或IP地址已移除 - 從貢獻中隱藏編輯]",
-       "rev-deleted-text-permission": "該頁面修訂已被'''刪除'''。在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 刪除日誌]中可以找到詳細的訊息。",
-       "rev-deleted-text-unhide": "æ\9c¬é \81é\9d¢ç\89\88æ\9c¬å·²è¢«'''å\88ªé\99¤'''ã\80\82詳æ\83\85è«\8bè¦\8b[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} å\88ªé\99¤æ\97¥èª\8c\80\82å¦\82æ\9e\9cä½ æ\83³ç¹¼çº\8cæ\93\8dä½\9cï¼\8cä½ ä»\8dç\84¶å\8f¯ä»¥[$1 æ\9f¥ç\9c\8bæ\9c¬ç\89\88æ\9c¬]。",
-       "rev-suppressed-text-unhide": "該頁面修訂已經被'''監督隱藏'''。在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 監督日誌]中可以找到詳細的信息。如果您想繼續的話,您可以仍然[$1 去查看這次修訂]。",
-       "rev-deleted-text-view": "該頁面修訂已經被'''刪除'''。您可以查看它。在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 刪除日誌]中可以找到詳細的信息。",
-       "rev-suppressed-text-view": "該頁面修訂已經被'''監督隱藏'''。您可以查看它。在[{{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": "該差異對比其中的一個修訂版本已經被'''刪除'''。在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 刪除日誌]中可以找到更多的信息。如果您想繼續的話,您仍然可以[$1 查看這次修訂]。",
-       "rev-suppressed-unhide-diff": "該頁面的其中一次修訂已經被'''監督隱藏'''。\n在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 監督日誌]中可以找到更多的資料。如果您想繼續的話,您可以仍然[$1 去查看這次修訂]。",
-       "rev-deleted-diff-view": "差異對比中的一次修訂已被'''刪除'''。您可以對比此差異。詳細信息可在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 刪除日誌]中找到。",
-       "rev-suppressed-diff-view": "差異對比中的一次修訂已被'''監督隱藏'''。您可以對比此差異。詳細信息可在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 監督日誌]中找到。",
-       "rev-delundel": "顯示/隱藏",
+       "history-feed-description": "本 Wiki 上此頁面的修訂歷史",
+       "history-feed-item-nocomment": "$1  $2",
+       "history-feed-empty": "請求的頁面不存在,\n可能已被刪除或重新命名。\n請嘗試 [[Special:Search|搜尋本站]] 取得其他相關的新頁面。",
+       "rev-deleted-comment": "(已移除編輯摘要)",
+       "rev-deleted-user": "(已移除使用者名稱)",
+       "rev-deleted-event": "(已移除日誌)",
+       "rev-deleted-user-contribs": "[使用者名稱或 IP 位址已移除 - 已隱藏貢獻清單中的編輯]",
+       "rev-deleted-text-permission": "此頁面修訂已被 <strong>刪除</strong>。\n可至 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 刪除日誌] 取得詳細資訊。",
+       "rev-deleted-text-unhide": "æ­¤é \81é\9d¢ä¿®è¨\82已被 <strong>å\88ªé\99¤</strong>ã\80\82\nå\8f¯è\87³ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} å\88ªé\99¤æ\97¥èª\8c] å\8f\96å¾\97詳細è³\87è¨\8aã\80\82\nè\8b¥æ\82¨è¦\81ç¹¼çº\8cï¼\8cæ\82¨ä»\8då\8f¯ [$1 æª¢è¦\96此修è¨\82。",
+       "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": "檢視差異的其中一個修訂已被 <strong>刪除</strong>。\n您可繼續檢視差異,可至 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 刪除日誌] 取得詳細資訊。",
+       "rev-suppressed-diff-view": "檢視差異的其中一個修訂已被 <strong>禁止顯示</strong>。\n您可繼續檢視差異,可至 [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 禁止顯示日誌] 取得詳細資訊。",
+       "rev-delundel": "更改顯示設定",
        "rev-showdeleted": "顯示",
-       "revisiondelete": "刪除/恢復刪除修訂",
+       "revisiondelete": "刪除/取消刪除修訂",
        "revdelete-nooldid-title": "無效的目標修訂",
-       "revdelete-nooldid-text": "您尚未指定一個目標修訂去進行這個功能、\n所指定的修訂不存在,或者您嘗試去隱藏現時的修訂。",
+       "revdelete-nooldid-text": "您尚未指定目標修訂執行此動作、指定的修訂不存在,或您嘗試隱藏目前的修訂。",
        "revdelete-no-file": "指定的檔案不存在。",
-       "revdelete-show-file-confirm": "{{GENDER:|你|妳|你}}是否真的是想去檢視於$2 $3刪除「<nowiki>$1</nowiki>」的檔案修訂?",
+       "revdelete-show-file-confirm": "您是否要檢視檔案 \"<nowiki>$1</nowiki>\" 已刪除的修訂於 $2 $3?",
        "revdelete-show-file-submit": "是",
-       "revdelete-selected-text": "已選定[[:$2]]之$1個版本:",
-       "revdelete-selected-file": "已選定檔案[[:$2]]之$1個版本:",
-       "logdelete-selected": "{{PLURAL:$1|選取的日誌項目}}:",
-       "revdelete-text-text": "已刪除修訂版本仍將出現於頁面歷史中,唯將不公開內容訪問。",
-       "revdelete-text-file": "已刪除檔案版本仍將出現於檔案歷史中,唯將不公開內容訪問。",
-       "logdelete-text": "已刪除日誌活動仍將出現於日誌中,唯將不公開內容訪問。",
-       "revdelete-text-others": "æ\96¼{{SITENAME}}ä¹\8bå\85¶ä»\96管ç\90\86å\93¡ä»\8dæ\9c\89æ¬\8aé\99\90訪å\95\8fé\9a±è\97\8få\85§å®¹ï¼\8c亦å\8f¯æ\96¼å\90\8cä¸\80ç\95\8cé\9d¢æ\81¢å¾©å\88ªé\99¤ï¼\8cé\99¤é\9d\9e設å®\9aé¡\8då¤\96æ¢\9d件ã\80\82",
-       "revdelete-confirm": "請確認您肯定去做的話,您就要明白到後果,以及這個程序符合[[{{MediaWiki:Policy-url}}|政策]]。",
-       "revdelete-suppress-text": "禁制應'''僅'''於下述情形之一時使用:\n* 潛在誹謗性資訊\n* 不合適個人資料\n*: ''住家地址、電話號碼、社群保安號碼等。''",
-       "revdelete-legend": "設定可見性之限制",
+       "revdelete-selected-text": "已選擇 [[:$2]] 中的{{PLURAL:$1|一筆|多筆}}修訂:",
+       "revdelete-selected-file": "已選擇 [[:$2]] 中的{{PLURAL:$1|一個|多個}}檔案版本:",
+       "logdelete-selected": "已選擇{{PLURAL:$1|一筆|多筆}}日誌活動:",
+       "revdelete-text-text": "已刪除的修訂仍會出現於頁面歷史中,但內容將不開放存取。",
+       "revdelete-text-file": "已刪除的檔案版本仍會出現於檔案歷史中,但內容將不開放存取。",
+       "logdelete-text": "已刪除的日誌活動仍會出現於日誌中,但內容將不開放存取。",
+       "revdelete-text-others": "å\9c¨ {{SITENAME}} ä¸\8aç\9a\84å\85¶ä»\96管ç\90\86å\93¡ä»\8dæ\9c\89æ¬\8aé\99\90å\8f¯ä»¥å­\98å\8f\96é\9a±è\97\8fç\9a\84å\85§å®¹ï¼\8cä¸\94è\83½å¤ å\8f\96æ¶\88å\88ªé\99¤ï¼\8cé\99¤é\9d\9eæ\9c\89é¡\8då¤\96ç\9a\84設å®\9aé\99\90å\88¶ã\80\82",
+       "revdelete-confirm": "請確認您是否明白此動作會造成的後果,\n以及您所做的動作是否符合 [[{{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": "編輯者的用戶名/IP位址",
-       "revdelete-hide-restricted": "同時廢止由操作員以及其他用戶的資料",
-       "revdelete-radio-same": "(不更改)",
+       "revdelete-hide-user": "編輯者的使用者名稱/IP 位址",
+       "revdelete-hide-restricted": "禁止顯示資料給管理者及其他使用者",
+       "revdelete-radio-same": "(請勿更改)",
        "revdelete-radio-set": "隱藏",
-       "revdelete-radio-unset": "可見",
-       "revdelete-suppress": "同時廢止由操作員以及其他用戶的資料",
-       "revdelete-unsuppress": "在已恢復的修訂中移除限制",
-       "revdelete-log": "理由:",
-       "revdelete-submit": "應用於選取的{{PLURAL:$1|修訂}}",
-       "revdelete-success": "'''修訂的可見性已經成功更新。'''",
-       "revdelete-failure": "'''修訂的可見性無法更新:'''\n$1",
-       "logdelete-success": "'''事件的可見性已經成功設定。'''",
-       "logdelete-failure": "'''事件的可見性無法設定:'''\n$1",
-       "revdel-restore": "變更可見性",
+       "revdelete-radio-unset": "顯示",
+       "revdelete-suppress": "禁止顯示資料給管理者及其他使用者",
+       "revdelete-unsuppress": "移除已還原修訂上的顯示限制",
+       "revdelete-log": "原因:",
+       "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": "正在隱藏於$1 $2之項目錯誤:這個是現時的修訂,不可以隱藏。",
-       "revdelete-show-no-access": "æ­£å\9c¨é¡¯ç¤ºæ\96¼$1 $2ä¹\8bé \85ç\9b®é\8c¯èª¤ï¼\9aé\80\99å\80\8bé \85ç\9b®å·²ç¶\93æ¨\99示ç\82º\"å·²é\99\90å\88¶\"ï¼\8cæ\82¨å°\8då®\83並ç\84¡é\80\9aè¡\8cæ¬\8a。",
-       "revdelete-modify-no-access": "正在更改於$1 $2之項目錯誤:這個項目已經標示為\"已限制\",您對它並無通行權。",
-       "revdelete-modify-missing": "正在更改項目ID $1錯誤:它在資料庫中遺失!",
-       "revdelete-no-change": "警告:於$1 $2之項目已經請求了可見性的設定。",
-       "revdelete-concurrent-change": "正在更改於$1 $2之項目錯誤:當我們嘗試更改它的設定時,已經被另一些人更改過。請檢查紀錄。",
-       "revdelete-only-restricted": "在隱藏$1 $2的項目時發生錯誤:您不能在選擇了另一可見性選項後廢止管理員查看該項目。",
-       "revdelete-reason-dropdown": "*常用刪除理由\n** 侵犯版權\n** 不合適的評論或個人資料\n** 不當的用戶名\n** 潛在誹謗的資料",
-       "revdelete-otherreason": "其它/附加的理由:",
-       "revdelete-reasonotherlist": "其它理由",
-       "revdelete-edit-reasonlist": "編輯å\88ªé\99¤å\9f\8bç\94±",
-       "revdelete-offender": "修訂版本編輯者:",
-       "suppressionlog": "ç\9b£ç\9d£日誌",
-       "suppressionlogtext": "該列表列出對管理員隱藏的刪除與封禁。另參見[[Special:BlockList|封鎖名單]]以查詢當前的封禁列表。",
+       "deletedhist": "已刪除歷史",
+       "revdelete-hide-current": "隱藏於 $1 $2 的項目錯誤:此為目前的修訂,不可隱藏。",
+       "revdelete-show-no-access": "檢è¦\96æ\96¼ $1 $2 ç\9a\84é \85ç\9b®é\8c¯èª¤ï¼\9aæ­¤é \85ç\9b®å·²è¨­ç\82º \"å·²é\99\90å\88¶\"ã\80\82\næ\82¨æ²\92æ\9c\89æ¬\8aé\99\90å­\98å\8f\96。",
+       "revdelete-modify-no-access": "修改於 $1 $2 的項目錯誤:此項目已設為 \"已限制\"。\n您沒有權限存取。",
+       "revdelete-modify-missing": "修改項目 ID $1 錯誤:資料庫中無該資料!",
+       "revdelete-no-change": "<strong>警告:</strong>於 $1 $2 的項目已請求修改顯示設定。",
+       "revdelete-concurrent-change": "修改於 $1 $2 的項目錯誤:在您嘗試修改之前,狀態已被修改。\n請檢查日誌。",
+       "revdelete-only-restricted": "在隱藏於 $1 $2 的項目時發生錯誤:您不可在未選擇顯示設定的情況下禁止管理員檢視項目。",
+       "revdelete-reason-dropdown": "*常見的刪除原因\n** 侵犯版權\n** 不合適的評論或個人資訊\n** 不當的使用者名稱\n** 隱含誹謗的資訊",
+       "revdelete-otherreason": "其它/額外的原因:",
+       "revdelete-reasonotherlist": "其它原因",
+       "revdelete-edit-reasonlist": "編輯å\88ªé\99¤å\8e\9få\9b ",
+       "revdelete-offender": "修訂者:",
+       "suppressionlog": "ç¦\81止顯示日誌",
+       "suppressionlogtext": "以下清單為管理員透過刪除或封鎖所隱藏的內容。\n請至 [[Special:BlockList|封鎖清單]] 取得目前已封鎖的清單。",
        "mergehistory": "合併頁面歷史",
-       "mergehistory-header": "這一頁可以講您合併一個來源頁面的歷史到另一個新頁面中。\n請確認這次更改會繼續保留該頁面先前的歷史版本。",
-       "mergehistory-box": "合併兩個頁面的修訂:",
-       "mergehistory-from": "來源頁面:",
-       "mergehistory-into": "目的頁面:",
-       "mergehistory-list": "可合併的編輯歷史",
-       "mergehistory-merge": "以ä¸\8b[[:$1]]ç\9a\84ä¿®è¨\82å\8f¯ä»¥å\90\88ä½µå\88°[[:$2]]ã\80\82ç\94¨è©²é\81¸é \85æ\8c\89é\88\95æ¬\84å\8e»å\90\88ä½µå\8fªæ\9c\89å\9c¨æ\8c\87å®\9aæ\99\82é\96\93以å\89\8dæ\89\80å\89µå»ºç\9a\84ä¿®è¨\82ã\80\82è¦\81ç\95\99æ\84\8fç\9a\84æ\98¯ä½¿ç\94¨å°\8eè\88ªé\80£çµ\90便æ\9c\83é\87\8d設é\80\99ä¸\80æ¬\84。",
+       "mergehistory-header": "這頁可以讓您合併一個來源頁面的歷史到另一個新頁面中。\n請確認這次更改會繼續保留該頁面先前的歷史版本。",
+       "mergehistory-box": "合併兩個頁面的修訂",
+       "mergehistory-from": "來源頁面",
+       "mergehistory-into": "目標頁面:",
+       "mergehistory-list": "可合併的編輯歷史",
+       "mergehistory-merge": "ä¸\8bå\88\97 [[:$1]] ç\9a\84ä¿®è¨\82å\8f¯ä»¥å\90\88ä½µè\87³ [[:$2]]ã\80\82\n使ç\94¨å\96®é\81¸æ\96¹å¡\8aé\81¸æ\93\87è¦\81å\90\88ä½µæ\8c\87å®\9aç\9a\84ä¿®å®\9aæ\88\96å\9c¨æ\8c\87å®\9aæ\99\82é\96\93以å\89\8dç\9a\84ä¿®å®\9aã\80\82\n注æ\84\8fï¼\8cè\8b¥æ­¤æ\99\82使ç\94¨å°\8e覽é\80£çµ\90æ\9c\83å\8f\96æ¶\88æ­¤å\8b\95ä½\9c。",
        "mergehistory-go": "顯示可以合併的編輯",
        "mergehistory-submit": "合併修訂",
        "mergehistory-empty": "沒有可以合併的修訂",
-       "mergehistory-success": "[[:$1]]的$3次修訂已經成功地合併到[[:$2]]。",
+       "mergehistory-success": "[[:$1]] 中 $3 次修訂已經成功地合併至 [[:$2]]。",
        "mergehistory-fail": "不可以進行歷史合併,請重新檢查該頁面以及時間參數。",
-       "mergehistory-no-source": "來源頁面$1不存在。",
-       "mergehistory-no-destination": "目的頁面$1不存在。",
-       "mergehistory-invalid-source": "來源頁面必須是一個有效的標題。",
-       "mergehistory-invalid-destination": "目的頁面必須是一個有效的標題。",
-       "mergehistory-autocomment": "已經合併[[:$1]]去到[[:$2]]",
-       "mergehistory-comment": "已經合併[[:$1]]去到[[:$2]]: $3",
-       "mergehistory-same-destination": "來源頁面與目的頁面不可以相同",
-       "mergehistory-reason": "理由:",
+       "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]]到[[$2]] (修訂截至$3)",
+       "pagemerge-logentry": "已合併 [[$1]] 至 [[$2]] (修訂更新至 $3)",
        "revertmerge": "解除合併",
-       "mergelogpagetext": "以下是一個最近由一個頁面的修訂歷史合併到另一個頁面的列表。",
-       "history-title": "「$1」的修訂歷史",
-       "difference-title": "$1:修訂版本之間的差異",
-       "difference-title-multipage": "頁面「$1」與「$2」之間的差異",
-       "difference-multipage": "(頁面間的差異)",
-       "lineno": "第 $1 行:",
-       "compareselectedversions": "比較選定的修訂版本",
-       "showhideselectedversions": "顯示/隱藏選定的修訂版本",
-       "editundo": "原",
-       "diff-empty": "(沒有差異)",
-       "diff-multi-sameuser": "(未顯示同用戶所作出之$1次版本)",
-       "diff-multi-otherusers": "(未顯示$2位用戶所作出之$1次版本)",
-       "diff-multi-manyusers": "(由多於$2名用戶作出的{{PLURAL:$1|一個中途修訂版本|$1個中途修訂版本}} 未被顯示)",
+       "mergelogpagetext": "以下是最近合併頁面歷史的清單。",
+       "history-title": "\"$1\" 的修訂歷史",
+       "difference-title": "$1:修訂間的差異",
+       "difference-title-multipage": "頁面 \"$1\" 與 \"$2\" 間的差異",
+       "difference-multipage": "(頁面間的差異)",
+       "lineno": "行 $1:",
+       "compareselectedversions": "比較已選擇的修訂",
+       "showhideselectedversions": "更改已選擇修訂的顯示設定",
+       "editundo": "原",
+       "diff-empty": "(無差異)",
+       "diff-multi-sameuser": "(未顯示相同使用者於中間所作的 $1 次修訂)",
+       "diff-multi-otherusers": "(未顯示由 $2 位使用者於中間所作的 $1 次修訂)",
+       "diff-multi-manyusers": "(未顯示由超過 $2 位使用者於中間所作的 $1 次修訂)",
        "difference-missing-revision": "{{PLURAL:$2|1次修訂|$2 次修訂}}差異($1)不存在。\n\n這通常是因為過時的頁面修訂差異鏈接被刪除。\n詳情請閱[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 刪除日誌]。",
        "searchresults": "搜尋結果",
-       "searchresults-title": "對「$1」的搜尋結果",
-       "toomanymatches": "過多的匹配已回應,請嘗試一個不同的查詢",
-       "titlematches": "é \81é\9d¢æ¨\99é¡\8cç\9b¸ç¬¦",
-       "textmatches": "é \81é\9d¢å\85§å®¹ç\9b¸ç¬¦",
-       "notextmatches": "沒有頁面內容匹配",
-       "prevn": "前 $1 ",
-       "nextn": "後 {{PLURAL:$1|$1}} ",
-       "prevn-title": "前 $1 結果",
-       "nextn-title": "後 $1 結果",
-       "shown-title": "每頁顯示 $1 結果",
-       "viewprevnext": "檢視($1 {{int:pipe-separator}} $2)($3)",
-       "searchmenu-exists": "'''在這個 wiki 上已有一頁面叫做「[[:$1]]」。'''",
-       "searchmenu-new": "<strong>於此wiki建立這個頁面「[[:$1]]」!</strong>請參見已發現之$2條搜尋結果。",
+       "searchresults-title": "\"$1\" 的搜尋結果",
+       "toomanymatches": "太多符合條件的結果,請嘗試使用較複雜的查詢",
+       "titlematches": "é \81é\9d¢æ¨\99é¡\8c符å\90\88",
+       "textmatches": "é \81é\9d¢å\85§å®¹ç¬¦å\90\88",
+       "notextmatches": "沒有符合的頁面內容",
+       "prevn": "前 $1 ",
+       "nextn": "後 {{PLURAL:$1|$1}} ",
+       "prevn-title": "前 $1 結果",
+       "nextn-title": "後 $1 結果",
+       "shown-title": "每頁顯示 $1 結果",
+       "viewprevnext": "檢視 ($1 {{int:pipe-separator}} $2) ($3)",
+       "searchmenu-exists": "<strong>此 Wiki 已有名稱為 \"[[:$1]]\" 的頁面。</strong> {{PLURAL:$2|0=|或請參考其他搜尋結果。}}",
+       "searchmenu-new": "<strong>於此 Wiki 建立頁面 \"[[:$1]]\"!</strong>{{PLURAL:$2|0=|或請參考您輸入的條件找到的搜尋結果。|或請參考其他搜尋結果。}}",
        "searchprofile-articles": "內容頁面",
-       "searchprofile-project": "幫助和計劃頁面",
        "searchprofile-images": "多媒體",
        "searchprofile-everything": "全部",
        "searchprofile-advanced": "進階",
-       "searchprofile-articles-tooltip": "在$1中搜尋",
-       "searchprofile-project-tooltip": "在$1中搜尋",
+       "searchprofile-articles-tooltip": "在 $1 中搜尋",
        "searchprofile-images-tooltip": "搜尋檔案",
-       "searchprofile-everything-tooltip": "搜尋全部(包括討論頁面)",
-       "searchprofile-advanced-tooltip": "在自訂名字空間中搜尋",
-       "search-result-size": "$1 ($2個字)",
-       "search-result-category-size": "$1個成員($2個子分類,$3個檔案)",
-       "search-result-score": "相關度$1%",
-       "search-redirect": "(重定向 $1)",
-       "search-section": "(段落 $1)",
-       "search-file-match": "(匹配檔案內容)",
-       "search-suggest": "{{GENDER:|你|妳|你}}是不是要找:$1",
-       "search-interwiki-caption": "å§\8a妹è¨\88å\8a\83",
-       "search-interwiki-default": "來自$1之結果:",
-       "search-interwiki-more": "(更多)",
+       "searchprofile-everything-tooltip": "搜尋所有內容 (包含對話頁面)",
+       "searchprofile-advanced-tooltip": "搜尋自訂命名空間",
+       "search-result-size": "$1 ($2 個字)",
+       "search-result-category-size": "$1 位成員 ($2 個子分類,$3 個檔案)",
+       "search-result-score": "相關度$1%",
+       "search-redirect": "(重新導向至 $1)",
+       "search-section": "(章節 $1)",
+       "search-file-match": "(符合檔案內容)",
+       "search-suggest": "您指的是不是:$1",
+       "search-interwiki-caption": "å§\90妹å°\88æ¡\88",
+       "search-interwiki-default": "來自 $1 的結果:",
+       "search-interwiki-more": "(更多)",
        "search-relatedarticle": "相關",
-       "searcheverything-enable": "在所有名字空間中搜尋",
+       "searcheverything-enable": "搜尋所有命名空間",
        "searchrelated": "相關",
-       "searchall": "所有",
-       "showingresults": "ä¸\8bé\9d¢é¡¯ç¤ºå¾\9e第 <b>$2</b> æ¢\9dé\96\8bå§\8bç\9a\84 <b>$1</b> æ¢\9dçµ\90æ\9e\9c:",
-       "showingresultsinrange": "以下顯示於#<strong>$2</strong>至#<strong>$3</strong>之<strong>$1</strong>個搜尋結果。",
-       "showingresultsnum": "ä¸\8bé\9d¢é¡¯ç¤ºå¾\9e第 '''$2''' æ¢\9dé\96\8bå§\8bç\9a\84 '''{{PLURAL:$3|1|$3}}''' æ¢\9dçµ\90æ\9e\9cã\80\82",
-       "showingresultsheader": "對'''$4'''的{{PLURAL:$5|第 '''$1''' 至第 '''$3''' 項結果|第 '''$1 - $2''' 項,共 '''$3''' 項結果}}",
-       "search-nonefound": "在查詢中無結果相符。",
+       "searchall": "全部",
+       "showingresults": "以ä¸\8b顯示å¾\9e第 <strong>$2</strong> ç­\86é\96\8bå§\8bï¼\8cå\85± {{PLURAL:$1|<strong>1</strong> ç­\86çµ\90æ\9e\9c|<strong>$1</strong> ç­\86çµ\90æ\9e\9c}}:",
+       "showingresultsinrange": "以下顯示從第 <strong>$2</strong> 筆至第 <strong>$3</strong> 筆中的 {{PLURAL:$1|<strong>1</strong> 筆結果|<strong>$1</strong> 筆結果}}:",
+       "showingresultsnum": "以ä¸\8b顯示å¾\9e第 <strong>$2</strong> ç­\86é\96\8bå§\8bï¼\8cå\85± {{PLURAL:$3|<strong>1</strong> ç­\86çµ\90æ\9e\9c|<strong>$3</strong> ç­\86çµ\90æ\9e\9c}}ï¼\9a",
+       "showingresultsheader": "<strong>$4</strong> 的 {{PLURAL:$5|第 <strong>$1</strong> 筆結果,共 <strong>$3</strong> 筆|第 <strong>$1 - $2</strong>,共 <strong>$3</strong> 筆}}",
+       "search-nonefound": "無符合查詢條件的結果。",
        "powersearch-legend": "進階搜尋",
-       "powersearch-ns": "在以下的名字空間中搜尋:",
-       "powersearch-redir": "重定向清單",
-       "powersearch-togglelabel": "核取:",
-       "powersearch-toggleall": "所有",
+       "powersearch-ns": "搜尋以下命名空間:",
+       "powersearch-togglelabel": "請選擇:",
+       "powersearch-toggleall": "全部",
        "powersearch-togglenone": "無",
        "search-external": "外部搜尋",
-       "searchdisabled": "{{SITENAME}}由於性能方面的原因,全文搜索已被暫時停用。您可以暫時透過Google搜索。請留意他們的索引可能會過時。",
+       "searchdisabled": "{{SITENAME}} 已停用搜尋功能。\n您可以改透過 Google 搜尋。\n請注意,在 Google 中搜尋到的 {{SITENAME}} 頁面內容可能不是最新的。",
        "search-error": "搜尋時發生錯誤:$1",
        "preferences": "偏好設定",
        "mypreferences": "偏好設定",
        "prefs-edits": "編輯次數:",
-       "prefsnologintext2": "請$1以進入用戶設定。",
+       "prefsnologintext2": "請 $1 以更改您的偏好設定。",
        "prefs-skin": "外觀",
        "skin-preview": "預覽",
        "datedefault": "預設值",
        "prefs-labs": "實驗中的功能",
        "prefs-user-pages": "使用者頁面",
-       "prefs-personal": "使用者概況表",
-       "prefs-rc": "近期變更",
+       "prefs-personal": "使用者基本資料",
+       "prefs-rc": "最近變更",
        "prefs-watchlist": "監視列表",
        "prefs-watchlist-days": "監視列表中顯示的天數:",
-       "prefs-watchlist-days-max": "最多$1{{PLURAL:$1|天}}",
-       "prefs-watchlist-edits": "擴充監視列表中顯示變更次數的上限:",
-       "prefs-watchlist-edits-max": "æ\9c\80大æ\95¸é\87\8f:1000",
+       "prefs-watchlist-days-max": "最多 $1 {{PLURAL:$1|天}}",
+       "prefs-watchlist-edits": "展開監視列表中顯示的變更數量上限:",
+       "prefs-watchlist-edits-max": "æ\95¸é\87\8fä¸\8aé\99\90:1000",
        "prefs-watchlist-token": "監視列表密鑰:",
-       "prefs-misc": "雜項",
+       "prefs-misc": "其他",
        "prefs-resetpass": "變更密碼",
        "prefs-changeemail": "變更電子郵件",
        "prefs-setemail": "設定電子郵件位址",
        "prefs-email": "電子郵件選項",
        "prefs-rendering": "外觀",
        "saveprefs": "儲存",
-       "restoreprefs": "還原所有預設設定(所有部分)",
+       "restoreprefs": "還原所有預設設定 (所有項目)",
        "prefs-editing": "編輯",
        "rows": "行數:",
        "columns": "列數:",
        "searchresultshead": "搜尋",
-       "stub-threshold": "<a href=\"#\" class=\"stub\">短頁面連結</a>格式門檻值 (位元組):",
+       "stub-threshold": "<a href=\"#\" class=\"stub\">短頁面連結</a>格式門檻值 (位元組):",
        "stub-threshold-disabled": "已停用",
-       "recentchangesdays": "近期變更的顯示日數:",
-       "recentchangesdays-max": "最多$1{{PLURAL:$1|天}}",
+       "recentchangesdays": "最近變更的顯示日數:",
+       "recentchangesdays-max": "最多 $1 {{PLURAL:$1|天}}",
        "recentchangescount": "預設顯示的編輯數:",
-       "prefs-help-recentchangescount": "é\80\99å\80\8bå\8c\85æ\8b¬æ\9c\80è¿\91æ\9b´æ\94¹、頁面歷史以及日誌。",
-       "prefs-help-watchlist-token2": "這是一個秘密的密鑰,用於訂源您的監視列表。\n知道它的人將能夠讀取您的監視列表,所以您不應該分享它。[[Special:ResetTokens|如有需要重設此密鑰,請點擊這裡]]。",
+       "prefs-help-recentchangescount": "é\80\99å\8c\85å\90«æ\9c\80è¿\91è®\8aæ\9b´、頁面歷史以及日誌。",
+       "prefs-help-watchlist-token2": "訂閱您的監視列表所需的密鑰。\n任何人只要知道密鑰就能夠讀取您的監視列表,所以請勿任意與它人共享。\n若有需要 [[Special:ResetTokens|您可重設密鑰]]。",
        "savedprefs": "您的偏好設定已儲存。",
        "timezonelegend": "時區:",
        "localtime": "當地時間:",
-       "timezoneuseserverdefault": "使用預設($1)",
-       "timezoneuseoffset": "其他 (指定偏移)",
+       "timezoneuseserverdefault": "使用 Wiki 預設值 ($1)",
+       "timezoneuseoffset": "其他 (指定時差)",
        "servertime": "伺服器時間:",
-       "guesstimezone": "從瀏覽器填寫",
+       "guesstimezone": "使用瀏覽器設定值",
        "timezoneregion-africa": "非洲",
        "timezoneregion-america": "美洲",
        "timezoneregion-antarctica": "南極洲",
        "timezoneregion-europe": "歐洲",
        "timezoneregion-indian": "印度洋",
        "timezoneregion-pacific": "太平洋",
-       "allowemail": "接受來自其他使用者的信件",
+       "allowemail": "啟用來自其他使用者的郵件通知功能",
        "prefs-searchoptions": "搜尋",
-       "prefs-namespaces": "頁面名稱空間",
-       "defaultns": "否則在這些名字空間搜尋:",
+       "prefs-namespaces": "命名空間",
+       "defaultns": "或搜尋命名空間:",
        "default": "預設",
        "prefs-files": "檔案",
-       "prefs-custom-css": "自CSS",
-       "prefs-custom-js": "自JavaScript",
-       "prefs-common-css-js": "共用 CSS/JavaScript 於所有的外觀中:",
-       "prefs-reset-intro": "您可以利用這個頁面去重設您的參數設置到網站預設值。這個動作無法復原。",
+       "prefs-custom-css": "自訂 CSS",
+       "prefs-custom-js": "自訂 JavaScript",
+       "prefs-common-css-js": "所有外觀共用的 CSS/JavaScript:",
+       "prefs-reset-intro": "您可以使用此頁面重設您的偏好設定為網站預設值。\n這個動作將無法復原。",
        "prefs-emailconfirm-label": "電子郵件確認:",
        "youremail": "電子郵件:",
        "username": "{{GENDER:$1|使用者名稱}}:",
-       "uid": "{{GENDER:$1|使用者 ID}}:",
-       "prefs-memberingroups": "{{PLURAL:$1|群組}}{{GENDER:$2|成員}}:",
+       "prefs-memberingroups": "{{GENDER:$2|所屬}}{{PLURAL:$1|群組}}:",
        "prefs-registration": "註冊時間:",
        "yourrealname": "真實姓名:",
        "yourlanguage": "語言:",
        "yourvariant": "內容語言變體:",
        "prefs-help-variant": "您希望用於顯示本站內容的語種或拼寫語系。",
-       "yournick": "新簽名:",
-       "prefs-help-signature": "在討論頁面上的評論應該要用「<nowiki>~~~~</nowiki>」簽名,這樣便會轉換成{{GENDER:|你|妳|你}}的簽名以及一個時間截記。",
+       "yournick": "æ\96°ç\9a\84ç°½å\90\8dï¼\9a",
+       "prefs-help-signature": "在對話頁面上評論時應使用 \"<nowiki>~~~~</nowiki>\" 簽名,\n該符號會轉換成您的簽名與時間。",
        "badsig": "錯誤的原始簽名。請檢查HTML標籤。",
        "badsiglength": "您的簽名過長。\n它的長度不可超過$1個字元。",
-       "yourgender": "您希望如何顯示性别?",
-       "gender-unknown": "我不想指定",
-       "gender-male": "",
-       "gender-female": "女",
-       "prefs-help-gender": "此設定為可選。\n軟件將使用此設定顯示正確的稱呼。\n此項資料將會被公開。",
+       "yourgender": "您希望如何被描述?",
+       "gender-unknown": "我不想說明",
+       "gender-male": "他編輯了 Wiki 頁面",
+       "gender-female": "她編輯äº\86 Wiki é \81é\9d¢",
+       "prefs-help-gender": "此偏好設定為選填欄位。\n系統會使用您選擇的方式稱呼您,對他人提及您時也會使用適當語法稱呼。\n此項資訊會被公開。",
        "email": "電子郵件",
-       "prefs-help-realname": "真實姓名是可選的。\n如果您選擇提供它,它會用於貢獻署名。",
-       "prefs-help-email": "电子邮件是可选项,但是在您忘记密码时很有用。",
-       "prefs-help-email-others": "您亦可以在您沒有公開自己的用戶身分時透過您的用戶頁或用戶討論頁與您聯繫。",
+       "prefs-help-realname": "真實姓名為選填欄位。\n若您提供真實姓名,它會用於使用者貢獻署名。",
+       "prefs-help-email": "電子郵件地址為選填欄位。\n但在重設密碼時會使用,而您很有可能會忘記密。",
+       "prefs-help-email-others": "您亦可以選擇讓其他使用者用電子郵件與您聯繫,透過您的使用者或對話頁面上方的連結。\n您的電子郵件位址不會實際告知給其他要聯絡您的使用者。",
        "prefs-help-email-required": "電子郵件地址是必填項目。",
-       "prefs-info": "基本資",
+       "prefs-info": "基本資",
        "prefs-i18n": "國際化",
        "prefs-signature": "簽名",
        "prefs-dateformat": "日期格式",
-       "prefs-timeoffset": "時間偏移",
+       "prefs-timeoffset": "時",
        "prefs-advancedediting": "一般選項",
        "prefs-editor": "編輯器",
        "prefs-preview": "預覽",
        "prefs-advancedsearchoptions": "進階選項",
        "prefs-advancedwatchlist": "進階選項",
        "prefs-displayrc": "顯示選項",
-       "prefs-displaysearchoptions": "顯示選項",
        "prefs-displaywatchlist": "顯示選項",
        "prefs-tokenwatchlist": "密鑰",
        "prefs-diffs": "差異",
-       "prefs-help-prefershttps": "此選項將於您下次登入時生效。",
+       "prefs-help-prefershttps": "此偏好設定將於您下次登入時生效。",
        "prefs-tabs-navigation-hint": "提示:您可通過左、右鍵於選項卡之間切換。",
        "email-address-validity-valid": "電子郵件位址有效",
        "email-address-validity-invalid": "請提供一個有效的電子郵件位址",
        "userrights": "使用者權限管理",
        "userrights-lookup-user": "管理使用者群組",
        "userrights-user-editname": "輸入使用者名稱:",
-       "editusergroup": "編輯用戶群組",
+       "editusergroup": "編輯使用者群組",
        "editinguser": "變更使用者 '''[[User:$1|$1]]''' 的使用者權限 $2",
        "userrights-editusergroup": "編輯使用者群組",
        "saveusergroups": "儲存使用者群組",
-       "userrights-groupsmember": "屬於:",
-       "userrights-groupsmember-auto": "固有屬於:",
-       "userrights-groups-help": "æ\82¨å\8f¯ä»¥æ\94¹å\8b\95é\80\99ä½\8dç\94¨æ\88¶æ\89\80屬ç\9a\84群çµ\84ï¼\9a\n* å·²å\89\94é\81¸ç\9a\84æ ¸å\8f\96æ\96¹å¡\8a代表該ç\94¨æ\88¶å±¬æ\96¼è©²ç¾¤çµ\84ã\80\82\n* æ\9cªå\89\94é\81¸ç\9a\84æ ¸å\8f\96æ\96¹å¡\8a代表該ç\94¨æ\88¶ä¸\8dæ\98¯å±¬æ\96¼è©²ç¾¤çµ\84ã\80\82\n* æ\9c\89 * é \85ç\9b®è¡¨ç¤ºä¸\80æ\97¦æ\82¨å\8a å\85¥è©²ç¾¤çµ\84ä¹\8bå¾\8c便ä¸\8dè\83½ç§»é\99¤å®\83,反之亦然。",
+       "userrights-groupsmember": "所屬群組:",
+       "userrights-groupsmember-auto": "所屬隱含群組:",
+       "userrights-groups-help": "æ\82¨å\8f¯ä»¥æ\9b´æ\94¹æ­¤ä½¿ç\94¨è\80\85æ\89\80屬ç\9a\84群çµ\84ï¼\9a\n* å·²å\8b¾é\81¸ç\9a\84æ ¸é\81¸æ\96¹å¡\8a代表該使ç\94¨è\80\85屬æ\96¼è©²ç¾¤çµ\84ã\80\82\n* æ\9cªå\8b¾é\81¸ç\9a\84æ ¸é\81¸æ\96¹å¡\8a代表該使ç\94¨è\80\85ä¸\8d屬æ\96¼è©²ç¾¤çµ\84ã\80\82\n* æ\9c\89 * è\99\9fæ¨\99示代表ä¸\80æ\97¦å\8a å\85¥è©²ç¾¤çµ\84å¾\8c便ä¸\8dè\83½ç§»é\99¤,反之亦然。",
        "userrights-reason": "原因:",
-       "userrights-no-interwiki": "您並沒有權限去編輯在其它wiki上的用戶權限。",
-       "userrights-nodatabase": "資料庫$1不存在或並非為本地的。",
-       "userrights-nologin": "您必須要以操作員賬戶[[Special:UserLogin|登入]]之後才可以指定用戶權限。",
+       "userrights-no-interwiki": "您沒有權限去編輯其它使用者在 Wiki 上的權限。",
+       "userrights-nodatabase": "資料庫 $1 不存在或不在本地主機的。",
+       "userrights-nologin": "您必須 [[Special:UserLogin|登入]] 管理員帳號以指定使用者權限。",
        "userrights-notallowed": "你無權加入或刪除使用者權限。",
-       "userrights-changeable-col": "您可以更改的群組",
-       "userrights-unchangeable-col": "您不可以更改的群組",
-       "userrights-conflict": "使用者權限更改發生衝突!請檢視並確認你的更改。",
+       "userrights-changeable-col": "您可變更的群組",
+       "userrights-unchangeable-col": "您不可變更的群組",
+       "userrights-conflict": "使用者權限更改發生衝突!請重新檢視並確認你的更改。",
        "userrights-removed-self": "您已成功移除自己的權限,故此您沒法再次訪問此頁。",
        "group": "群組:",
        "group-user": "使用者",
        "group-sysop": "管理員",
        "group-bureaucrat": "行政員",
        "group-suppress": "監督",
-       "group-all": "(全部)",
+       "group-all": "(全部)",
        "group-user-member": "{{GENDER:$1|使用者}}",
        "group-autoconfirmed-member": "自動確認使用者",
        "group-bot-member": "機器人",
        "grouppage-suppress": "{{ns:project}}:監督員",
        "right-read": "閱讀頁面",
        "right-edit": "編輯頁面",
-       "right-createpage": "建立頁面(不含討論頁面)",
+       "right-createpage": "建立頁面 (不含討論頁面)",
        "right-createtalk": "建立討論頁面",
        "right-createaccount": "建立新的使用者帳號",
-       "right-minoredit": "標示成小編輯",
+       "right-minoredit": "標示編輯為小修訂",
        "right-move": "移動頁面",
        "right-move-subpages": "移動頁面與其子頁面",
        "right-move-rootuserpages": "移動根使用者頁面",
+       "right-move-categorypages": "移動分類頁面",
        "right-movefile": "移動檔案",
-       "right-suppressredirect": "ç\95¶ç§»å\8b\95é \81é\9d¢æ\99\82ä¸\8d建ç«\8bä¾\86æº\90é \81é\9d¢ä¹\8bé\87\8då®\9aå\90\91",
+       "right-suppressredirect": "移å\8b\95é \81é\9d¢æ\99\82ä¸\8d建ç«\8bä¾\86æº\90ç\9a\84é\87\8dæ\96°å°\8eå\90\91é \81é\9d¢",
        "right-upload": "上傳檔案",
        "right-reupload": "覆蓋現有的檔案",
-       "right-reupload-own": "覆蓋由同一位上載的檔案",
-       "right-reupload-shared": "於本地無視共用媒體檔案庫上的檔案",
-       "right-upload_by_url": "由一個URL上載檔案",
-       "right-purge": "ä¸\8dé\9c\80è¦\81確èª\8dä¹\8bä¸\8bæ¸\85é\99¤ç¶²ç«\99快取",
-       "right-autoconfirmed": "不受基於IP的頻率限制",
-       "right-bot": "視為一個自動程序",
-       "right-nominornewtalk": "小編輯不引發新訊息提示",
-       "right-apihighlimits": "在API查詢中使用更高的上限",
-       "right-writeapi": "使用API編寫",
+       "right-reupload-own": "覆蓋自己上傳的檔案",
+       "right-reupload-shared": "覆蓋共用媒體檔案庫於本地的檔案",
+       "right-upload_by_url": "使用 URL 上傳檔案",
+       "right-purge": "ä¸\8dé \88確èª\8då\8d³æ¸\85é\99¤ç¶²ç«\99ç\9a\84é \81é\9d¢快取",
+       "right-autoconfirmed": "不受 IP-based 的註冊頻率限制",
+       "right-bot": "將其視為自動程序",
+       "right-nominornewtalk": "不顯示討論頁面中小修訂的新訊息提示",
+       "right-apihighlimits": "使用 API 查詢的最高上限值",
+       "right-writeapi": "使用寫入 API",
        "right-delete": "刪除頁面",
-       "right-bigdelete": "刪除大量歷史之頁面",
-       "right-deletelogentry": "刪除及恢復特定的日誌項目",
-       "right-deleterevision": "å\88ªé\99¤å\8f\8aå\90\8cæ\81¢å¾©é \81é\9d¢ä¸­ç\9a\84æ\8c\87å®\9a修訂",
-       "right-deletedhistory": "檢視已刪除之歷史項目,不含關聯的文本",
-       "right-deletedtext": "檢視已刪除修訂中之已刪除的字以及更改",
-       "right-browsearchive": "搜尋已刪除頁面",
-       "right-undelete": "å\8f\8d刪除頁面",
-       "right-suppressrevision": "檢視及恢復由操作員隱藏之修訂",
-       "right-suppressionlog": "檢視非公開日誌",
-       "right-block": "封鎖其他用戶防止編輯",
-       "right-blockemail": "封鎖用戶不可發電郵",
-       "right-hideuser": "封鎖用戶名,對公眾隱藏",
-       "right-ipblock-exempt": "ç¹\9eé\81\8eIPå°\81é\8e\96ã\80\81è\87ªå\8b\95å°\81é\8e\96以å\8f\8aç¯\84å\9c\8då°\81é\8e\96",
-       "right-proxyunbannable": "ç¹\9eé\81\8eProxyç\9a\84è\87ªå\8b\95å°\81é\8e\96",
+       "right-bigdelete": "刪除有大量歷史記錄的頁面",
+       "right-deletelogentry": "刪除及取消刪除指定的日誌項目",
+       "right-deleterevision": "å\88ªé\99¤å\8f\8aå\8f\96æ¶\88å\88ªé\99¤æ\8c\87å®\9aç\9a\84é \81é\9d¢修訂",
+       "right-deletedhistory": "檢視已刪除的歷史項目,不含關聯的文字",
+       "right-deletedtext": "檢視已刪除修訂中已刪除的文字及變更",
+       "right-browsearchive": "搜尋已刪除頁面",
+       "right-undelete": "å\8f\96æ¶\88刪除頁面",
+       "right-suppressrevision": "複查與還原由管理員隱藏的修訂",
+       "right-suppressionlog": "檢視非公開日誌",
+       "right-block": "封鎖其他使用者的編輯權限",
+       "right-blockemail": "封鎖使用者發送電子郵件的權限",
+       "right-hideuser": "封鎖使用者名稱,避免公開顯示",
+       "right-ipblock-exempt": "ç\95¥é\81\8e IP å°\81é\8e\96ã\80\81è\87ªå\8b\95å°\81é\8e\96å\8f\8aç¯\84å\9c\8då°\81é\8e\96檢æ\9f¥",
+       "right-proxyunbannable": "ç\95¥é\81\8e Proxy è\87ªå\8b\95å°\81é\8e\96檢æ\9f¥",
        "right-unblockself": "解除封鎖自己",
-       "right-protect": "更改保護等級以及編輯被連鎖保護的頁面",
-       "right-editprotected": "編輯保護層級為「{{int:protect-level-sysop}}」的頁面",
-       "right-editsemiprotected": "編輯保護層級為「{{int:protect-level-autoconfirmed}}」的頁面",
-       "right-editinterface": "編輯用戶界面",
-       "right-editusercssjs": "編輯其他用戶的CSS和JavaScript檔案",
-       "right-editusercss": "編輯其他用戶的CSS檔案",
-       "right-edituserjs": "編輯其他用戶的JavaScript檔案",
-       "right-editmyusercss": "編輯你自己的用戶CSS檔",
-       "right-editmyuserjs": "編輯你自己的用戶JavaScript檔",
-       "right-viewmywatchlist": "檢視的監視列表",
-       "right-editmywatchlist": "編輯您的監視列表。請注意即使沒有這種權利,某些操作仍將添加頁面。",
-       "right-viewmyprivateinfo": "檢視自己的私隱資料(如電郵地址及真實姓名)",
-       "right-editmyprivateinfo": "編輯自己的私隱資料(如電郵地址及真實姓名)",
-       "right-editmyoptions": "編輯您的設定",
-       "right-rollback": "快速復原上位用戶對某一頁面之編輯",
-       "right-markbotedits": "標示復原編輯作機械人編輯",
-       "right-noratelimit": "沒有使用頻率限制",
-       "right-import": "由其它wiki中匯入頁面",
-       "right-importupload": "由檔案上載中匯入頁面",
-       "right-patrol": "標示他人的編輯爲已巡查",
+       "right-protect": "更改保護層級及編輯被連鎖保護的頁面",
+       "right-editprotected": "編輯保護層級為 \"{{int:protect-level-sysop}}\" 的頁面",
+       "right-editsemiprotected": "編輯保護層級為 \"{{int:protect-level-autoconfirmed}}\" 的頁面",
+       "right-editinterface": "編輯使用者介面",
+       "right-editusercssjs": "編輯其他使用者的 CSS 和 JavaScript 檔案",
+       "right-editusercss": "編輯其他使用者的 CSS 檔案",
+       "right-edituserjs": "編輯其他使用者的 JavaScript 檔案",
+       "right-editmyusercss": "編輯自己的使用者 CSS 檔",
+       "right-editmyuserjs": "編輯自己的使用者 JavaScript 檔",
+       "right-viewmywatchlist": "檢視自己的監視列表",
+       "right-editmywatchlist": "編輯自己的監視列表。注意,即使無此權限,某些操作仍會新增頁面至監視列表。",
+       "right-viewmyprivateinfo": "檢視自己的私隱資料 (如:電子郵件地址及真實姓名)",
+       "right-editmyprivateinfo": "編輯自己的私隱資料 (如:電子郵件地址及真實姓名)",
+       "right-editmyoptions": "編輯自己的偏好設定",
+       "right-rollback": "快速還原最後一位使用者對某一頁面的編輯",
+       "right-markbotedits": "標示還原編輯為機械人編輯",
+       "right-noratelimit": "不受使用頻率限制",
+       "right-import": "由其他 Wiki 匯入頁面",
+       "right-importupload": "由檔案上匯入頁面",
+       "right-patrol": "標示他人的編輯爲已巡查",
        "right-autopatrol": "將自己的編輯自動標示為已巡查的",
-       "right-patrolmarks": "檢視最近巡查標記更改",
-       "right-unwatchedpages": "檢視未監視頁面",
+       "right-patrolmarks": "檢視最近變更的巡查標記",
+       "right-unwatchedpages": "檢視未監視頁面",
        "right-mergehistory": "合併頁面歷史",
-       "right-userrights": "編輯所有用戶的權限",
-       "right-userrights-interwiki": "編輯在其它wiki上的用戶權限",
+       "right-userrights": "編輯所有使用者的權限",
+       "right-userrights-interwiki": "編輯使用者在其它 Wiki 上的權限",
        "right-siteadmin": "鎖定和解除鎖定資料庫",
-       "right-override-export-depth": "匯出含有五層深度連結頁面之頁面",
-       "right-sendemail": "ç\99¼é\9b»å­\90é\83µä»¶çµ¦å\85¶ä»\96ç\94¨æ\88",
-       "right-passwordreset": "æ\9f¥ç\9c\8bé\87\8dç½®å¯\86碼郵件",
-       "newuserlogpage": "使用者建立日誌",
-       "newuserlogpagetext": "這是一個最近被創建用戶的新日誌",
+       "right-override-export-depth": "匯出頁面包含連結內容,深度上限為 5 層",
+       "right-sendemail": "ç\99¼é\80\81é\9b»å­\90é\83µä»¶çµ¦å\85¶ä»\96使ç\94¨è\80\85",
+       "right-passwordreset": "檢è¦\96é\87\8d設å¯\86碼é\9b»å­\90郵件",
+       "newuserlogpage": "建立使用者日誌",
+       "newuserlogpagetext": "此為建立使用者的日誌。",
        "rightslog": "使用者權限日誌",
-       "rightslogtext": "以下記錄了用戶權限的更改記錄。",
-       "action-read": "閱讀這個頁面",
-       "action-edit": "編輯這個頁面",
-       "action-createpage": "建ç«\8bé\80\99å\80\8bé \81é\9d¢",
+       "rightslogtext": "此為更改使用者權限的日誌。",
+       "action-read": "閱讀頁面",
+       "action-edit": "編輯頁面",
+       "action-createpage": "建立頁面",
        "action-createtalk": "建立討論頁面",
-       "action-createaccount": "建立這個用戶賬戶",
-       "action-minoredit": "標示這個編輯為小的",
-       "action-move": "移動這個頁面",
-       "action-move-subpages": "移動這個頁面跟它的子頁面",
-       "action-move-rootuserpages": "移動根用戶頁面",
-       "action-movefile": "移動這個檔案",
-       "action-upload": "上載這個檔案",
-       "action-reupload": "覆蓋這個現有的檔案",
-       "action-reupload-shared": "覆蓋在共用檔案庫上的檔案",
-       "action-upload_by_url": "由一個URL中上載檔案",
-       "action-writeapi": "用來寫API",
-       "action-delete": "刪除這個頁面",
-       "action-deleterevision": "刪除這次修訂",
-       "action-deletedhistory": "檢視這個頁面的刪除歷史",
-       "action-browsearchive": "搜尋已刪除的頁面",
-       "action-undelete": "反刪除這個頁面",
-       "action-suppressrevision": "翻查和恢復這次隱藏修訂",
-       "action-suppressionlog": "檢視這個私有日誌",
-       "action-block": "封鎖這位用戶的編輯",
-       "action-protect": "更改這個頁面的保護等級",
-       "action-rollback": "快速回退最後對特定頁面作出的編輯的用戶的所有編輯",
+       "action-createaccount": "建立此使用者帳號",
+       "action-history": "檢視此頁面歷史",
+       "action-minoredit": "標示此編輯為小修訂",
+       "action-move": "移動此頁面",
+       "action-move-subpages": "移動此頁面與它的子頁面",
+       "action-move-rootuserpages": "移動使用者根頁面",
+       "action-move-categorypages": "移動分類頁面",
+       "action-movefile": "移動此檔案",
+       "action-upload": "上傳此檔案",
+       "action-reupload": "覆蓋此現有的檔案",
+       "action-reupload-shared": "覆蓋此共用檔案庫上的檔案",
+       "action-upload_by_url": "使用 URL 上傳此檔案",
+       "action-writeapi": "使用寫入 API",
+       "action-delete": "刪除此頁面",
+       "action-deleterevision": "刪除此修訂",
+       "action-deletedhistory": "檢視此頁面的刪除歷史",
+       "action-browsearchive": "搜尋已刪除頁面",
+       "action-undelete": "取消刪除此頁面",
+       "action-suppressrevision": "複查與還原此隱藏修訂",
+       "action-suppressionlog": "檢視此非公開日誌",
+       "action-block": "封鎖此使用者的編輯權限",
+       "action-protect": "變更此頁面的保護層級",
+       "action-rollback": "快速還原最後一位使用者對某一頁面的編輯",
        "action-import": "由其他 Wiki 匯入頁面",
        "action-importupload": "由檔案上傳匯入頁面",
-       "action-patrol": "標示其它的編輯為已巡查的",
-       "action-autopatrol": "將您的編輯標示為已巡查的",
-       "action-unwatchedpages": "檢視未被監視的頁面",
-       "action-mergehistory": "合併這個頁面的歷史",
-       "action-userrights": "編輯所有的權限",
-       "action-userrights-interwiki": "編輯在其它wiki上用戶的權限",
+       "action-patrol": "標示其它人的編輯為已巡查",
+       "action-autopatrol": "標示您的編輯為已巡查",
+       "action-unwatchedpages": "檢視未監視的頁面列表",
+       "action-mergehistory": "合併頁面的歷史",
+       "action-userrights": "編輯所有使用者的權限",
+       "action-userrights-interwiki": "編輯在其它 Wiki 上的使用者權限",
        "action-siteadmin": "鎖定和解除鎖定資料庫",
-       "action-sendemail": "發送電",
-       "action-editmywatchlist": "編輯您的監視列表",
+       "action-sendemail": "發送電子郵件",
+       "action-editmywatchlist": "編輯您的監視列表",
        "action-viewmywatchlist": "查看您的監視列表",
        "action-viewmyprivateinfo": "查看您的個人資料",
        "action-editmyprivateinfo": "編輯您的個人資料",
-       "nchanges": "$1次更改",
-       "enhancedrc-since-last-visit": "自上次訪問已有$1",
+       "nchanges": "$1 次變更",
+       "enhancedrc-since-last-visit": "自上次訪問已有 $1",
        "enhancedrc-history": "歷史",
        "recentchanges": "最近變更",
-       "recentchanges-legend": "近期變更選項",
-       "recentchanges-summary": "追蹤該圍記(Wiki)的近期變更。",
-       "recentchanges-noresult": "在所選擇的時間裡沒有任何更改與所給條件吻合。",
-       "recentchanges-feed-description": "è¨\82é\96±è©²å\9c\8dè¨\98ï¼\88Wikiï¼\89ç\9a\84è¿\91æ\9c\9f變更。",
-       "recentchanges-label-newpage": "é\80\99次編輯建ç«\8bäº\86ä¸\80å\80\8bæ\96°é \81é\9d¢",
-       "recentchanges-label-minor": "這是一個小編輯",
-       "recentchanges-label-bot": "這次編輯是由機器人進行",
-       "recentchanges-label-unpatrolled": "這次編輯尚未巡查過",
-       "recentchanges-label-plusminus": "更改前後頁面位元組大小的變化",
+       "recentchanges-legend": "最近變更選項",
+       "recentchanges-summary": "追蹤 Wiki 中此頁面的最近變更。",
+       "recentchanges-noresult": "於指定時間內沒有符合條件的變更。",
+       "recentchanges-feed-description": "追蹤此è¨\82é\96±ä¸­è©² Wiki ç\9a\84æ\9c\80è¿\91變更。",
+       "recentchanges-label-newpage": "該編輯建ç«\8bæ\96°é \81é\9d¢",
+       "recentchanges-label-minor": "該編輯是一個小修訂",
+       "recentchanges-label-bot": "該編輯由機器人執行",
+       "recentchanges-label-unpatrolled": "該編輯尚未巡查",
+       "recentchanges-label-plusminus": "該頁面變更的大小 (位元組)",
        "recentchanges-legend-heading": "'''說明:'''",
-       "recentchanges-legend-newpage": "(見[[Special:NewPages|新頁面列表]])",
-       "recentchanges-legend-plusminus": "(''±123'')",
-       "rcnotefrom": "ä¸\8bé\9d¢æ\98¯è\87ª<strong>$2</strong>èµ·ä¹\8bæ\9b´æ\94¹ï¼\88è\87³å¤\9a顯示<strong>$1</strong>å\80\8bï¼\89。",
-       "rclistfrom": "顯示自 $1 以來的新變更",
-       "rcshowhideminor": "$1小編輯",
+       "recentchanges-legend-newpage": "(請參考 [[Special:NewPages|最新頁面]])",
+       "recentchanges-legend-plusminus": "(<em>±123</em>)",
+       "rcnotefrom": "以ä¸\8bç\82ºè\87ª <strong>$2</strong> ä»¥ä¾\86ç\9a\84è®\8aæ\9b´ (æ\9c\80å¤\9a顯示 <strong>$1</strong> ç­\86)。",
+       "rclistfrom": "顯示自 $3 $2 以來的最近變更",
+       "rcshowhideminor": "$1 小修訂",
        "rcshowhideminor-show": "顯示",
        "rcshowhideminor-hide": "隱藏",
-       "rcshowhidebots": "$1機器人的編輯",
+       "rcshowhidebots": "$1 機器人",
        "rcshowhidebots-show": "顯示",
        "rcshowhidebots-hide": "隱藏",
-       "rcshowhideliu": "$1已註冊用戶",
+       "rcshowhideliu": "$1 已註冊的使用者",
        "rcshowhideliu-show": "顯示",
        "rcshowhideliu-hide": "隱藏",
-       "rcshowhideanons": "$1匿名用戶的編輯",
+       "rcshowhideanons": "$1 匿名的使用者",
        "rcshowhideanons-show": "顯示",
        "rcshowhideanons-hide": "隱藏",
-       "rcshowhidepatr": "$1巡查過的編輯",
+       "rcshowhidepatr": "$1 巡查過的編輯",
        "rcshowhidepatr-show": "顯示",
        "rcshowhidepatr-hide": "隱藏",
-       "rcshowhidemine": "$1我的編輯",
+       "rcshowhidemine": "$1 我的編輯",
        "rcshowhidemine-show": "顯示",
        "rcshowhidemine-hide": "隱藏",
-       "rclinks": "顯示最近$2天內最新的$1次改動。<br />$3",
+       "rclinks": "顯示最近 $2 天內的 $1 次更改。<br />$3",
        "diff": "差異",
        "hist": "歷史",
        "hide": "隱藏",
        "minoreditletter": "小",
        "newpageletter": "新",
        "boteditletter": "機",
-       "number_of_watching_users_pageview": "[$1 位使用者在監視]",
-       "rc_categories": "分類界限(以\"|\"分割)",
+       "number_of_watching_users_pageview": "[$1 位正在監視的使用者]",
+       "rc_categories": "分類限制 (以 \"|\" 分隔)",
        "rc_categories_any": "任意",
-       "rc-change-size-new": "更改後$1字節",
-       "newsectionsummary": "/* $1 */ 新段落",
-       "rc-enhanced-expand": "顯示細節",
-       "rc-enhanced-hide": "隱藏細節",
-       "rc-old-title": "æ\9c\80å\88\9d建ç«\8bç\82ºã\80\8c$1ã\80\8d",
+       "rc-change-size-new": "變更後為 $1 位元組",
+       "newsectionsummary": "/* $1 */ 新章節",
+       "rc-enhanced-expand": "顯示詳細資訊",
+       "rc-enhanced-hide": "隱藏詳細資訊",
+       "rc-old-title": "æ\9c\80å\88\9d建ç«\8bç\9a\84å\90\8d稱ç\82º \"$1\"",
        "recentchangeslinked": "相關變更",
        "recentchangeslinked-feed": "相關變更",
        "recentchangeslinked-toolbox": "相關變更",
-       "recentchangeslinked-title": "與「$1」有關的變更",
-       "recentchangeslinked-summary": "這一個特殊頁面列示''由''所給出的一個頁面之連結到頁面的最近更改(或者是對於指定分類的成員)。\n在[[Special:Watchlist|您的監視列表]]中的頁面會以'''粗體'''顯示。",
-       "recentchangeslinked-page": "頁面名稱:",
-       "recentchangeslinked-to": "顯示連到所給出的頁面",
+       "recentchangeslinked-title": "與 \"$1\" 相關的變更",
+       "recentchangeslinked-summary": "此頁面列出指定頁面連結到的所有頁面中 (或指定分類中的所有成員) 有做變更的頁面清單。\n有在 [[Special:Watchlist|您的監視列表]] 中的頁面會以 <strong>粗體</strong> 標示。",
+       "recentchangeslinked-page": "頁面名稱",
+       "recentchangeslinked-to": "改顯示連結至指定頁面的變更",
        "upload": "上傳檔案",
        "uploadbtn": "上傳檔案",
-       "reuploaddesc": "取消上載並返回上載表單",
-       "upload-tryagain": "提交修改後的檔案描述",
+       "reuploaddesc": "取消上傳並返回上傳表單",
+       "upload-tryagain": "送出修改後的檔案描述",
        "uploadnologin": "未登入",
-       "uploadnologintext": "您必須先$1才能上載檔案。",
-       "upload_directory_missing": "上傳目錄($1)遺失,不能由網頁伺服器建立。",
-       "upload_directory_read_only": "上傳目錄($1)不存在或無寫權限。",
+       "uploadnologintext": "您必須先 $1 才能上傳檔案。",
+       "upload_directory_missing": "缺少上傳目錄 ($1) 且網頁伺服器沒有權限建立。",
+       "upload_directory_read_only": "網頁伺服器沒有上傳目錄 ($1) 的寫入權限。",
        "uploaderror": "上傳錯誤",
-       "upload-recreate-warning": "'''警告:一個相同名字的檔案曾經被刪除或者移動至別處。'''\n\n這個頁面的刪除和移動日誌在這裏提供以便參考:",
-       "uploadtext": "使用下面的表單來上傳檔案。\n要檢視或搜尋以前上傳的檔案,可以進入[[Special:FileList|檔案上傳清單]],(重新)上傳也將在[[Special:Log/upload|上傳日誌]]中記錄,而刪除將在[[Special:Log/delete|刪除日誌]]中記錄。\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": "å\87\86許的檔案類型:$1。",
+       "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> 直接連結到圖片而不顯示預覽",
+       "upload-permitted": "å\85\81許的檔案類型:$1。",
        "upload-preferred": "建議的檔案類型:$1。",
        "upload-prohibited": "禁止的檔案類型:$1。",
        "uploadlogpage": "上傳日誌",
-       "uploadlogpagetext": "以ä¸\8bæ\98¯æ\9c\80è¿\91ä¸\8aè¼\89ç\9a\84æª\94æ¡\88ç\9a\84ä¸\80覽表ã\80\82\n檢è¦\96[[Special:NewFiles|æ\96°æª\94æ¡\88ç\95«å»\8a]]å\8e»ç\9c\8bæ\9b´å¯\8cå\9c\96ç\89\87ç\9a\84總覽。",
+       "uploadlogpagetext": "以ä¸\8bæ¸\85å\96®ç\82ºæ\9c\80è¿\91ä¸\8aå\82³ç\9a\84æª\94æ¡\88ã\80\82\nè«\8b檢è¦\96 [[Special:NewFiles|æ\9c\80æ\96°æª\94æ¡\88å\9c\96庫]] ä»¥è¦\96覺å\8c\96ç\9a\84æ\96¹å¼\8f檢è¦\96。",
        "filename": "檔案名稱",
        "filedesc": "檔案摘要",
        "fileuploadsummary": "檔案摘要:",
        "filesource": "來源:",
        "ignorewarning": "忽略警告並儲存檔案",
        "ignorewarnings": "忽略所有警告",
-       "minlength1": "檔案名字必須至少有一個字母。",
-       "illegalfilename": "檔案名「$1」包含有頁面標題所禁止的字符。請改名後重新上傳。",
-       "filename-toolong": "æ\96\87件å\90\8dä¸\8dè\83½è¶\85é\81\8e240å­\97ç¯\80。",
-       "badfilename": "檔案名已被改為「$1」。",
-       "filetype-mime-mismatch": "檔案擴展名 \".$1\" 不配所偵測檔案的MIME類型 ($2)。",
-       "filetype-badmime": "MIME類別「$1」不是容許的檔案格式。",
-       "filetype-bad-ie-mime": "不可以上傳這個檔案,因為 Internet Explorer 會將它偵測為「$1」,它是一種不容許以及有潛在危險性之檔案類型。",
-       "filetype-unwanted-type": "'''\".$1\"'''是一種不需要的檔案類型。\n建議的{{PLURAL:$3|一種|多種}}檔案類型有$2。",
-       "filetype-banned-type": "'''「.$1」'''{{PLURAL:$4|不是允許的檔案類型|是不允許的檔案類型}}。 \n允許的{{PLURAL:$3|檔案類型|檔案類型}} $2。",
-       "filetype-missing": "該檔案名稱並沒有副檔名 (像 \".jpg\")。",
-       "empty-file": "您所提交的檔案為空檔案。",
-       "file-too-large": "您所提交的檔案過大。",
-       "filename-tooshort": "檔案名過短。",
-       "filetype-banned": "此類檔案被禁止。",
-       "verification-error": "檔案未通過驗證。",
-       "hookaborted": "您所嘗試的修改被擴展鈎捨棄。",
-       "illegal-filename": "檔案名非法。",
+       "minlength1": "檔案名稱必須至少一個字元。",
+       "illegalfilename": "檔案名稱 \"$1\" 包含頁面標題所禁止使用的字元。\n請重新命名後再上傳。",
+       "filename-toolong": "æª\94æ¡\88å\90\8d稱ä¸\8då\8f¯è¶\85é\81\8e 240 å\80\8bä½\8då\85\83çµ\84。",
+       "badfilename": "已變更檔案名稱為 \"$1\"。",
+       "filetype-mime-mismatch": "檔案副檔名 \".$1\" 不符合偵測到的檔案 MIME 類型 ($2)。",
+       "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-missing": "該檔案沒有副檔名 (如 \".jpg\")。",
+       "empty-file": "您所送出的檔案為空的。",
+       "file-too-large": "您所送出的檔案過大。",
+       "filename-tooshort": "檔案名過短。",
+       "filetype-banned": "此類型檔案已禁止使用。",
+       "verification-error": "æ­¤æª\94æ¡\88æ\9cªé\80\9aé\81\8eé©\97è­\89ã\80\82",
+       "hookaborted": "您所嘗試的修改被擴展套件中止。",
+       "illegal-filename": "不允許使用的檔案名稱。",
        "overwrite": "不允許覆蓋現有檔案。",
-       "unknown-error": "發生未知錯誤。",
+       "unknown-error": "發生不明錯誤。",
        "tmp-create-error": "無法建立臨時檔案。",
-       "tmp-write-error": "臨時檔案寫入發生錯誤。",
-       "large-file": "建議檔案大小不能超過 $1;本檔案大小為 $2。",
-       "largefileserver": "這個檔案的大小比伺服器配置允許的大小還要大。",
-       "emptyfile": "您所上傳的檔案不存在。這可能是由於檔案名鍵入錯誤。請檢查您是否真的要上傳此檔案。",
-       "windows-nonascii-filename": "本維基不支持帶特殊字符的檔案名。",
-       "fileexists": "已存在相同名稱的檔案,如果您無法確定您是否要改變它,請檢查<strong>[[:$1]]</strong>。 [[$1|thumb]]",
-       "filepageexists": "這個檔案的描述頁已於<strong>[[:$1]]</strong>建立,但是這個名稱的檔案尚未存在。因此您所輸入的摘要不會顯示在該描述頁中。如要摘要在該處中出現,您必需手動編輯它。\n[[$1|thumb]]",
-       "fileexists-extension": "一個相似檔名的檔案已經存在: [[$2|thumb]]\n* 上載檔案的檔名: <strong>[[:$1]]</strong>\n* 現有檔案的檔名: <strong>[[:$2]]</strong>\n請選擇一個不同的名字。",
-       "fileexists-thumbnail-yes": "這個檔案好像是一幅圖片的縮圖版本''(縮圖)''。 [[$1|thumb]]\n請檢查清楚該檔案<strong>[[:$1]]</strong>。\n如果檢查後的檔案是同原本圖片的大小是一樣的話,就不用再上載多一幅縮圖。",
-       "file-thumbnail-no": "æ­¤å\9c\96ç\89\87ç\9a\84æª\94æ¡\88å\90\8d稱以<strong>$1</strong>é\96\8bå§\8bã\80\82å®\83好å\83\8fæ\9f\90å¹\85å\9c\96ç\89\87ç\9a\84縮å°\8fç\89\88æ\9c¬''ï¼\88縮å\9c\96ï¼\89''ã\80\82\nå¦\82æ\9e\9c{{GENDER:|ä½ |妳|ä½ }}æ\9c\89該å\9c\96ç\89\87ç\9a\84å®\8cæ\95´å¤§å°\8fç\89\88æ\9c¬ï¼\8cè«\8bä¸\8aè¼\89å®\83ï¼\9bå\90¦å\89\87è«\8bä¿®æ\94¹æª\94å\90\8d。",
-       "fileexists-forbidden": "已存在相同名稱的檔案,且不能覆蓋;請返回並用一個新的名稱來上傳此檔案。[[File:$1|thumb|center|$1]]",
-       "fileexists-shared-forbidden": "å\9c¨å\85±äº«æª\94æ¡\88庫中已å­\98å\9c¨æ­¤å\90\8d稱ç\9a\84æª\94æ¡\88ã\80\82\nå¦\82æ\9e\9c{{GENDER:|ä½ |妳|ä½ }}ä»\8dç\84¶æ\83³å\8e»ä¸\8aè¼\89å®\83ç\9a\84話ï¼\8cè«\8bè¿\94å\9b\9e並ç\94¨ä¸\80å\80\8bæ\96°ç\9a\84å\90\8d稱ä¾\86ä¸\8aå\82³æ­¤æª\94æ¡\88ã\80\82[[File:$1|thumb|center|$1]]",
-       "file-exists-duplicate": "這個檔案是跟以下的{{PLURAL:$1|一|多}}個檔案重覆:",
-       "file-deleted-duplicate": "一個相同名稱的檔案 ([[:$1]]) 在先前刪除過。您應該在重新上傳之前檢查一下該檔案之刪除紀錄。",
-       "file-deleted-duplicate-notitle": "此前同內容檔案已刪除並將之取消標題。您應詢問與既有檔案之相關用戶以複查再度上載之相關問題。",
-       "uploadwarning": "上警告",
+       "tmp-write-error": "寫入臨時檔案發生錯誤。",
+       "large-file": "建議的檔案大小上限為 $1;\n此檔案為 $2。",
+       "largefileserver": "此檔案大小超出伺服器設定的允許範圍。",
+       "emptyfile": "您上傳的檔案為空的。\n可能是檔案名輸入錯誤。\n請檢查您是否真的要上傳空檔案。",
+       "windows-nonascii-filename": "本 Wiki 不支援使用特殊符號的檔案名稱。",
+       "fileexists": "已存在相同名稱的檔案,若您不確定是否要變更它,請檢查 <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": "此檔案似乎已為縮小的圖片 <em>(縮圖)</em>。\n[[$1|thumb]]\n請檢查檔案 <strong>[[:$1]]</strong>。\n若原始圖片確實為此尺寸,則無須另外上傳縮圖。",
+       "file-thumbnail-no": "æª\94æ¡\88å\90\8d稱以 <strong>$1</strong> ç\82ºé\96\8bé ­ã\80\82\nä¼¼ä¹\8eå·²ç\82ºç¸®å°\8fç\9a\84å\9c\96ç\89\87 <em>(縮å\9c\96)</em>ã\80\82\nè\8b¥æ\82¨æ\9c\89å\8e\9få§\8b大å°\8fç\9a\84å\9c\96ç\89\87ï¼\8cæ\87\89ä¸\8aå\82³å\8e\9få§\8bå\9c\96ç\89\87ï¼\8cå\90¦å\89\87è«\8bè®\8aæ\9b´æª\94å\90\8d稱。",
+       "fileexists-forbidden": "已存在相同名稱的檔案,且無法覆蓋。\n若您仍要上傳此檔案,請返回上一頁並使用其他名稱。\n[[File:$1|thumb|center|$1]]",
+       "fileexists-shared-forbidden": "å\85±ç\94¨æª\94æ¡\88庫中已å­\98å\9c¨æ­¤å\90\8d稱ç\9a\84æª\94æ¡\88ã\80\82\nè\8b¥æ\82¨ä»\8dè¦\81ä¸\8aå\82³æ­¤æª\94æ¡\88ï¼\8cè«\8bè¿\94å\9b\9eä¸\8aä¸\80é \81並使ç\94¨å\85¶ä»\96å\90\8d稱ã\80\82\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": "儲存檔案",
-       "uploadedimage": "已上載「[[$1]]」",
-       "overwroteimage": "已經上傳「[[$1]]」的新版本",
-       "uploaddisabled": "上傳己停用。",
-       "copyuploaddisabled": "通過網址上傳功能未開通。",
-       "uploaddisabledtext": "檔案上傳不可用。",
-       "php-uploaddisabledtext": "PHP 檔案上載已經停用。請檢查 file_uploads 設定。",
-       "uploadscripted": "該檔案包含可能被網路瀏覽器錯誤解釋的 HTML 或腳本代碼。",
-       "uploadscriptednamespace": "此SVG檔案中包含非法命名空間「$1」",
-       "uploadinvalidxml": "上載檔案中的XML無法解析。",
-       "uploadvirus": "該æª\94æ¡\88å\8c\85å\90«æ\9c\89ç\97\85æ¯\92ï¼\81\n詳æ\83\85:$1",
-       "uploadjava": "該檔案是 ZIP 檔案,其中包含 Java 的.class 檔案。\n不允許上傳 Java 檔案,是因為他們可能會跳過安全限制。",
+       "uploadedimage": "已上傳 \"[[$1]]\"",
+       "overwroteimage": "已上傳新版本的 \"[[$1]]\"",
+       "uploaddisabled": "己停用上傳。",
+       "copyuploaddisabled": "己停用使用 URL 上傳。",
+       "uploaddisabledtext": "已停用檔案上傳。",
+       "php-uploaddisabledtext": "PHP 已停用檔案上傳。\n請檢查 file_uploads 設定。",
+       "uploadscripted": "此檔案包含可能會被網頁瀏覽器錯誤執行的 HTML 或 Script。",
+       "uploadscriptednamespace": "此 SVG 檔案使用了非法的命名空間 \"$1\"。",
+       "uploadinvalidxml": "無法解析已上傳檔案中的 XML。",
+       "uploadvirus": "該æª\94æ¡\88å\90«æ\9c\89ç\97\85æ¯\92ï¼\81\n詳細è³\87è¨\8a:$1",
+       "uploadjava": "該檔案為包含 Java .class 檔案的 ZIP 檔案。\n因 Java 檔案可能跳過安全檢查造成安全性問題,不允許上傳 Java 檔案。",
        "upload-source": "來源檔案",
-       "sourcefilename": "來源檔案名:",
-       "sourceurl": "來源網址:",
-       "destfilename": "目標檔案名:",
-       "upload-maxfilesize": "檔案最大限制大小:$1",
+       "sourcefilename": "來源檔案名:",
+       "sourceurl": "來源 URL:",
+       "destfilename": "目標檔案名:",
+       "upload-maxfilesize": "檔案大小限制:$1",
        "upload-description": "檔案描述",
-       "upload-options": "上選項",
-       "watchthisupload": "監視這個檔案",
-       "filewasdeleted": "之前已經有一個同名檔案被上傳後又被刪除了。在上傳此檔案之前您需要檢查$1。",
-       "filename-bad-prefix": "您上傳的檔案名稱是以'''「$1」'''作為開頭,通常這種沒有含意的檔案名稱是由數碼相機中自動編排。請在您的檔案中重新選擇一個更加有意義的檔案名稱。",
+       "upload-options": "上選項",
+       "watchthisupload": "監視檔案",
+       "filewasdeleted": "先前已有同樣名稱的檔案上傳,後來被刪除。\n您應在上傳此檔案前檢查 $1。",
+       "filename-bad-prefix": "您上傳的檔案名稱以 <strong>\"$1\"</strong> 開頭,是不具任何描述意義的名稱,通常由數位相機自動產生。\n請替您的檔案使用一個更具描述意義的名稱。",
        "upload-success-subj": "上傳成功",
-       "upload-success-msg": "æ\82¨å\9c¨[$2]ç\9a\84ä¸\8aä¼ å·²ç»\8fæ\88\90å\8a\9fï¼\8cå\8f¯ä»¥å\9c¨è¿\99é\87\8cæ\89¾å\88°:[[:{{ns:file}}:$1]]",
+       "upload-success-msg": "æ\82¨å·²æ\88\90å\8a\9f使ç\94¨ [$2] ä¸\8aå\82³æª\94æ¡\88ï¼\8cå\8f¯æ\96¼æ­¤è\99\95å\8f\96å¾\97æª\94æ¡\88:[[:{{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": "協議錯誤",
-       "upload-proto-error-text": "é\81 ç¨\8bä¸\8aå\82³è¦\81æ±\82 URL ä»¥ <code>http://</code> æ\88\96 <code>ftp://</code> é\96\8bé ­。",
+       "upload-warning-msg": "您使用 [$2] 上傳的檔案發生問題。 您可以返回 [[Special:Upload/stash/$1|上傳表單]] 更正此問題。",
+       "upload-proto-error": "通訊協定不正確",
+       "upload-proto-error-text": "é\81 ç«¯ä¸\8aå\82³æª\94æ¡\88é\9c\80è¦\81使ç\94¨ä»¥ <code>http://</code> æ\88\96 <code>ftp://</code> é\96\8bé ­ç\9a\84 URL。",
        "upload-file-error": "內部錯誤",
-       "upload-file-error-text": "當試圖在伺服器上創建臨時檔案時發生內部錯誤。請與[[Special:ListUsers/sysop|管理員]]聯繫。",
-       "upload-misc-error": "未知的上傳錯誤",
-       "upload-misc-error-text": "在上傳時發生未知的錯誤。請驗証使用了正確並可訪問的 URL,然後進行重試。如果問題仍然存在,請與[[Special:ListUsers/sysop|管理員]]聯繫。",
-       "upload-too-many-redirects": "在網址中有太多重新定向",
-       "upload-http-error": "已發生一個HTTP錯誤:$1",
-       "upload-copy-upload-invalid-domain": "不能從該域名上載檔案副本。",
-       "backend-fail-stream": "無法流傳送文件「$1」。",
-       "backend-fail-backup": "ç\84¡æ³\95å\82\99份æ\96\87件ã\80\8c$1ã\80\8d。",
-       "backend-fail-notexists": "æ¢\9dç\9b®$1不存在。",
-       "backend-fail-hashes": "比較無法獲取文件hashes",
-       "backend-fail-notsame": "「$1」已存在不同的檔案。",
-       "backend-fail-invalidpath": "「$1」不是有效的存儲路徑。",
-       "backend-fail-delete": "無法刪除「$1」檔案。",
-       "backend-fail-describe": "無法修改檔案「$1」的元數據。",
-       "backend-fail-alreadyexists": "檔案「$1」已存在。",
-       "backend-fail-store": "ç\84¡æ³\95å\9c¨$2å­\98å\84²æ\96\87件$1。",
-       "backend-fail-copy": "ç\84¡æ³\95è¤\87製æ\96\87件$1å\88°$2。",
-       "backend-fail-move": "ç\84¡æ³\95移å\8b\95æ\96\87件$1å\88°$2。",
-       "backend-fail-opentemp": "無法打開臨時文件。",
-       "backend-fail-writetemp": "無法寫臨時文件。",
-       "backend-fail-closetemp": "無法創建臨時文件。",
-       "backend-fail-read": "找不到檔案「$1」。",
-       "backend-fail-create": "無法寫入檔案「$1」。",
-       "backend-fail-maxsize": "ç\84¡æ³\95寫å\85¥æª\94æ¡\88ã\80\8c$1ã\80\8dâ\80\8bâ\80\8bï¼\8cå\9b ç\82ºå®\83大æ\96¼$2å­\97ç¯\80。",
-       "backend-fail-readonly": "「$1」儲存後端目前是唯讀模式,因為:「$2」",
-       "backend-fail-synced": "æ\96\87件ã\80\8c$1ã\80\8då\9c¨å\85§é\83¨å­\98å\84²å¾\8c端æ\98¯ä¸\8dä¸\80è\87´ç\9a\84å\8d\80å\9f\9f。",
-       "backend-fail-connect": "ç\84¡æ³\95é\80£çµ\90è\87³å­\98å\84²å¾\8cæ\96¹ã\80\8c$1ã\80\8d。",
-       "backend-fail-internal": "å­\98å\84²å¾\8cæ\96¹ã\80\8c$1ã\80\8dç\99¼ç\94\9fäº\86ä¸\80å\80\8bæ\9cªç\9f¥錯誤。",
-       "backend-fail-contenttype": "無法確定檔案的內容類型以存儲於「$1」。",
+       "upload-file-error-text": "嘗試在伺服器上建立臨時檔案時發生內部錯誤。\n請連絡 [[Special:ListUsers/sysop|管理員]]。",
+       "upload-misc-error": "不明的上傳錯誤",
+       "upload-misc-error-text": "上傳時發生不明錯誤。\n請檢查您的 URL 是否有效且可存取,然後再重試一次。\n如果仍有問題,請聯絡 [[Special:ListUsers/sysop|管理員]]。",
+       "upload-too-many-redirects": "URL 中包含太多重新導向資訊",
+       "upload-http-error": "發生 HTTP 錯誤:$1",
+       "upload-copy-upload-invalid-domain": "此網域不允許複製上傳的檔案。",
+       "backend-fail-stream": "無法傳輸檔案 \"$1\"。",
+       "backend-fail-backup": "ç\84¡æ³\95å\82\99份æª\94æ¡\88 \"$1\"。",
+       "backend-fail-notexists": "æª\94æ¡\88 $1 不存在。",
+       "backend-fail-hashes": "無法取得檔案雜湊值(Hash)進行比較。",
+       "backend-fail-notsame": "於 \"$1\" 已存在另一個不相同的檔案。",
+       "backend-fail-invalidpath": "\"$1\" 不是有效的儲存路徑。",
+       "backend-fail-delete": "無法刪除檔案 \"$1\"。",
+       "backend-fail-describe": "無法修改檔案 \"$1\" 的資料定義。",
+       "backend-fail-alreadyexists": "檔案 \"$1\" 已存在。",
+       "backend-fail-store": "ç\84¡æ³\95å\84²å­\98æª\94æ¡\88 \"$1\" æ\96¼ \"$2\"。",
+       "backend-fail-copy": "ç\84¡æ³\95è¤\87製æª\94æ¡\88 \"$1\" è\87³ \"$2\"。",
+       "backend-fail-move": "ç\84¡æ³\95移å\8b\95æª\94æ¡\88 \"$1\" è\87³ \"$2\"。",
+       "backend-fail-opentemp": "無法開啟暫存檔案。",
+       "backend-fail-writetemp": "無法寫入暫存檔案。",
+       "backend-fail-closetemp": "無法關閉暫存檔案。",
+       "backend-fail-read": "無法讀取檔案 \"$1\"。",
+       "backend-fail-create": "無法寫入檔案 \"$1\"。",
+       "backend-fail-maxsize": "ç\94±æ\96¼æª\94æ¡\88大å°\8fè¶\85é\81\8e $2 ä½\8då\85\83çµ\84ï¼\8cç\84¡æ³\95寫å\85¥æª\94æ¡\88 \"$1\"â\80\8bâ\80\8b。",
+       "backend-fail-readonly": "儲存庫的後端 \"$1\" 目前為唯讀模式。原因為:\"<em>$2</em>\"",
+       "backend-fail-synced": "æª\94æ¡\88 \"$1\" è\88\87å\85§é\83¨å\84²å­\98庫å¾\8c端å\85§ç\9a\84ç\8b\80æ\85\8bä¸\8dä¸\80è\87´。",
+       "backend-fail-connect": "ç\84¡æ³\95é\80£çµ\90è\87³å\84²å­\98庫å¾\8c端 \"$1\"。",
+       "backend-fail-internal": "å\84²å­\98庫å¾\8c端 \"$1\" ç\99¼ç\94\9fäº\86ä¸\8dæ\98\8eç\9a\84錯誤。",
+       "backend-fail-contenttype": "無法辨識儲存於 \"$1\" 的檔案內容類型。",
        "backend-fail-batchsize": "存儲後端被給予了「$1」次檔案 {{PLURAL:$1|操作}} ;限制是$2次{{PLURAL:$2|操作}}。",
-       "backend-fail-usable": "ç\94±æ\96¼æ²\92æ\9c\89足夠ç\9a\84æ¬\8aé\99\90æ\88\96缺å°\91è·¯å¾\91/容å\99¨ï¼\8cæ\89\80以ç\84¡æ³\95è®\80å\8f\96æ\88\96寫å\85¥æª\94æ¡\88 $1 。",
-       "filejournal-fail-dbconnect": "ç\84¡æ³\95é\80£æ\8e¥å\88°å¾\8c端å­\98å\84²ç\9a\84æ\97¥èª\8cè³\87æ\96\99庫\" $1 \"。",
-       "filejournal-fail-dbquery": "ç\84¡æ³\95æ\9b´æ\96°å¾\8c端å­\98å\84²ç\9a\84æ\97¥èª\8cè³\87æ\96\99庫\" $1 \"。",
-       "lockmanager-notlocked": "ç\84¡æ³\95解é\8e\96ã\80\8c$1ã\80\8dï¼\9bå®\83æ²\92æ\9c\89被鎖定。",
-       "lockmanager-fail-closelock": "無法關閉「$1」的鎖文件。",
-       "lockmanager-fail-deletelock": "無法刪除「$1」的鎖文件。",
-       "lockmanager-fail-acquirelock": "無法為「$1」獲取鎖。",
-       "lockmanager-fail-openlock": "無法打開「$1」的鎖文件。",
-       "lockmanager-fail-releaselock": "無法為「$1」釋放鎖。",
+       "backend-fail-usable": "ç\94±æ\96¼æ¬\8aé\99\90ä¸\8d足æ\88\96ç\9b®é\8c\84/容å\99¨é\81ºå¤±ï¼\8cç\84¡æ³\95è®\80å\8f\96æ\88\96寫å\85¥æª\94æ¡\88 \"$1\"。",
+       "filejournal-fail-dbconnect": "ç\84¡æ³\95é\80£æ\8e¥å\88°å\84²å­\98庫å¾\8c端 \"$1\" ç\9a\84æ\97¥èª\8cè³\87æ\96\99庫。",
+       "filejournal-fail-dbquery": "ç\84¡æ³\95æ\9b´æ\96°å\84²å­\98庫å¾\8c端 \"$1\" ç\9a\84æ\97¥èª\8cè³\87æ\96\99庫。",
+       "lockmanager-notlocked": "ç\84¡æ³\95解é\99¤é\8e\96å®\9a \"$1\"ï¼\9b該æª\94æ¡\88並æ\9cª被鎖定。",
+       "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 檢查時遇到一個錯誤。",
-       "zip-wrong-format": "指定的檔案不是ZIP檔案。",
-       "zip-bad": "該檔案是已損壞或以其它方式無法讀取的 ZIP 檔案。\n不能正確檢查安全。",
-       "zip-unsupported": "該檔案是 ZIP 檔案,其中使用 MediaWiki 不支持的ZIP功能。\n不能正確檢查安全。",
-       "uploadstash": "上傳貯藏",
-       "uploadstash-summary": "é\80\99å\80\8bé \81é\9d¢æ\8f\90ä¾\9bå·²ç¶\93ä¸\8aå\82³ï¼\88æ\88\96è\80\85ä¸\8aå\82³ä¸­ï¼\89ä½\86æ\9cªç\99¼ä½\88å\88°wikiä¹\8bæª\94æ¡\88å­\98å\8f\96ã\80\82é\80\99äº\9bæª\94æ¡\88é\99¤äº\86ä¸\8aå\82³ç\9a\84ç\94¨æ\88¶ä¹\8bå¤\96ä¸\8dæ\9c\83被å\85¶ä»\96人å\8f¯è¦\8bã\80\82",
-       "uploadstash-clear": "清除貯藏檔案",
-       "uploadstash-nofiles": "{{GENDER:|你|妳|你}}沒有已貯藏的檔案。",
-       "uploadstash-badtoken": "進行這個動作不成功,或者{{GENDER:|你|妳|你}}的編輯資訊已經過期。請再試。",
-       "uploadstash-errclear": "清除檔案不成功。",
+       "lockmanager-fail-db-release": "無法釋放資料庫 $1 的鎖定狀態。",
+       "lockmanager-fail-svr-acquire": "無法取得伺服器 $1 的鎖定狀態。",
+       "lockmanager-fail-svr-release": "無法釋放伺服器 $1 的鎖定狀態。",
+       "zip-file-open-error": "開啟檔案進行 ZIP 檢查時發生錯誤。",
+       "zip-wrong-format": "指定的檔案不是 ZIP 檔案。",
+       "zip-bad": "ZIP 檔案已損毀或無法讀取,\n無法正常執行安全檢查。",
+       "zip-unsupported": "ZIP 檔案使用了 MediaWiki 目前不支援的功能。\n無法正常執行安全檢查。",
+       "uploadstash": "上傳儲藏庫",
+       "uploadstash-summary": "æ­¤é \81é\9d¢å\8f¯å­\98å\8f\96å·²ä¸\8aå\82³æ\88\96é\82\84å\9c¨ä¸\8aå\82³ç¨\8båº\8fä½\86å°\9aæ\9cªå\9c¨ Wiki å\85¬é\96\8bç\9a\84æª\94æ¡\88ï¼\8cé\80\99äº\9bæª\94æ¡\88é\99¤äº\86ä¸\8aå\82³ç\9a\84使ç\94¨è\80\85æ\9c¬èº«å¤\96ï¼\8cå\85¶ä»\96人å°\9aç\84¡æ³\95æ\9f¥ç\9c\8bã\80\82",
+       "uploadstash-clear": "清除儲藏庫檔案",
+       "uploadstash-nofiles": "您沒有儲藏的檔案。",
+       "uploadstash-badtoken": "執行動作失敗,您的編輯資訊可能已經過期,請重新再試。",
+       "uploadstash-errclear": "清除檔案失敗。",
        "uploadstash-refresh": "更新檔案清單",
-       "invalid-chunk-offset": "無效區塊偏移量",
+       "invalid-chunk-offset": "無效區塊位置",
        "img-auth-accessdenied": "拒絕存取",
-       "img-auth-nopathinfo": "PATH_INFO缺失。\n您的服務器尚未設置傳送該信息。\n它可能是基於CGI的,因而不支持img_auth。\n請參見 https://www.mediawiki.org/wiki/Manual:Image_Authorization",
-       "img-auth-notindir": "所請求的路徑不在已經設定的上載目錄。",
-       "img-auth-badtitle": "不能夠由「$1」建立一個有效標題。",
-       "img-auth-nologinnWL": "您而家並未登入,「$1」不在白名單上。",
-       "img-auth-nofile": "檔案「$1」不存在。",
-       "img-auth-isdir": "您嘗試過存取一個目錄「$1」。\n只是可以存取檔案。",
-       "img-auth-streaming": "串流「$1」中。",
-       "img-auth-public": "img_auth.php的功能是由一個公共wiki中輸出檔案。\n這個wiki是已經設定做一個公共wiki。\n基於保安最佳化,img_auth.php已經停用。",
-       "img-auth-noread": "用戶無權讀取「$1」。",
-       "http-invalid-url": "無效的URL:$1",
-       "http-invalid-scheme": "不支援含有「$1」的URL。",
-       "http-request-error": "未知的錯誤令到HTTP請求失敗。",
-       "http-read-error": "HTTP讀取錯誤。",
-       "http-timed-out": "HTTP請求已過時。",
-       "http-curl-error": "擷取URL時出錯:$1",
-       "http-bad-status": "進行HTTP請求時出現問題:$1 $2",
-       "upload-curl-error6": "無法訪問 URL",
-       "upload-curl-error6-text": "無法訪問所提供的 URL。請再次檢查該 URL 是否正確,並且網站的訪問是否正常。",
-       "upload-curl-error28": "上傳時",
-       "upload-curl-error28-text": "網站回應時間過長。請檢查此網站的訪問是否正常,過一會再進行嘗試。您可能需要在網路訪問空閒時間再次進行嘗試。",
-       "license": "授權:",
-       "license-header": "授權",
-       "nolicense": "未選定",
-       "license-nopreview": "(無預覽可用)",
-       "upload_source_url": " (一個有效的,可公開訪問的 URL)",
-       "upload_source_file": " (在您電腦上的一個檔案)",
+       "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\" 並未在允許清單上。",
+       "img-auth-nofile": "檔案 \"$1\" 不存在。",
+       "img-auth-isdir": "您正嘗試存取目錄 \"$1\",\n僅允許存取檔案。",
+       "img-auth-streaming": "傳輸 \"$1\" 中。",
+       "img-auth-public": "img_auth.php 的用途是讓非公開的 Wiki 可輸出檔案,\n此 Wiki 已設定為公開的 Wiki。\n基於安全性的考量,已停用 img_auth.php。",
+       "img-auth-noread": "使用者沒有權限讀取 \"$1\"。",
+       "http-invalid-url": "無效的 URL:$1",
+       "http-invalid-scheme": "不支援 \"$1\" 協定的 URL。",
+       "http-request-error": "發生不明錯誤,HTTP 請求失敗。",
+       "http-read-error": "HTTP 讀取錯誤。",
+       "http-timed-out": "HTTP 請求已逾時。",
+       "http-curl-error": "擷取 URL 時錯誤:$1",
+       "http-bad-status": "進行 HTTP 請求發生問題:$1 $2",
+       "upload-curl-error6": "無法連線 URL",
+       "upload-curl-error6-text": "無法連線指定的 URL。\n請重新檢查 URL 是否正確,且確認網站是否正常運作。",
+       "upload-curl-error28": "上傳時",
+       "upload-curl-error28-text": "網站超出回應時間限制。\n請檢查該網站是否正常運作,並稍候一會再試一次。\n建議您可在非網路尖峰時段再嘗試連線。",
+       "license": "授權條款:",
+       "license-header": "授權條款",
+       "nolicense": "尚未選擇",
+       "license-nopreview": "(不可預覽)",
+       "upload_source_url": "(有效,可公開存取的 URL)",
+       "upload_source_file": "(在您電腦上的檔案)",
        "listfiles-summary": "此特殊頁面顯示所有上傳過的檔案。",
-       "listfiles_search_for": "æ\8c\89æª\94æ¡\88å\90\8d稱æ\90\9cç´¢:",
+       "listfiles_search_for": "æ\90\9cå°\8båª\92é«\94å\90\8d稱:",
        "imgfile": "檔案",
        "listfiles": "檔案列表",
        "listfiles_thumb": "縮圖",
        "listfiles_size": "大小",
        "listfiles_description": "描述",
        "listfiles_count": "版本",
-       "listfiles-show-all": "包圖片的舊版本",
+       "listfiles-show-all": "包圖片的舊版本",
        "listfiles-latestversion": "目前版本",
        "listfiles-latestversion-yes": "是",
        "listfiles-latestversion-no": "否",
        "file-anchor-link": "檔案",
        "filehist": "檔案歷史",
-       "filehist-help": "點擊日期/時間以檢視當時出現過的檔案。",
+       "filehist-help": "點選日期/時間以檢視該時間的檔案版本。",
        "filehist-deleteall": "刪除全部",
        "filehist-deleteone": "刪除",
-       "filehist-revert": "恢復",
+       "filehist-revert": "還原",
        "filehist-current": "目前",
-       "filehist-datetime": "日期時間",
+       "filehist-datetime": "日期/時間",
        "filehist-thumb": "縮圖",
-       "filehist-thumbtext": "於$1的縮圖版本",
+       "filehist-thumbtext": "於 $1 版本的縮圖",
        "filehist-nothumb": "沒有縮圖",
        "filehist-user": "使用者",
-       "filehist-dimensions": "維度",
+       "filehist-dimensions": "尺寸",
        "filehist-filesize": "檔案大小",
        "filehist-comment": "註解",
-       "imagelinks": "檔案使用情況",
-       "linkstoimage": "以ä¸\8bç\9a\84$1å\80\8bé \81é\9d¢é\80£æ\8e¥å\88°æ\9c¬æª\94æ¡\88:",
+       "imagelinks": "檔案使用",
+       "linkstoimage": "ä¸\8bå\88\97 $1 å\80\8bé \81é\9d¢é\80£çµ\90å\88°æ­¤æª\94æ¡\88ï¼\9a",
        "linkstoimage-more": "超過$1個頁面連接到這個檔案。\n此處只列出首$1個連接到此檔案的頁面。\n您也可以查看[[Special:WhatLinksHere/$2|完整的清單]]。",
        "nolinkstoimage": "沒有頁面連接到本檔案。",
        "morelinkstoimage": "檢視連接到這個檔案的[[Special:WhatLinksHere/$1|更多連結]]。",
-       "linkstoimage-redirect": "$1 (檔案重定向) $2",
-       "duplicatesoffile": "以下的$1個檔案跟這個檔案重覆([[Special:FileDuplicateSearch/$2|更多細節]]):",
-       "sharedupload": "該檔案來自於$1,它可能在其它計劃項目中被應用。",
-       "sharedupload-desc-there": "該檔案來自於$1,它可能在其它計劃項目中被應用。\n請參閱在[$2 檔案描述頁面]以了解其相關資訊。",
-       "sharedupload-desc-here": "該檔案來自於$1,它可能在其它計劃項目中被應用。\n它在[$2 檔案描述頁面]那邊上的描述於下面顯示。",
-       "sharedupload-desc-edit": "該檔案來自$1,它可能在其它計劃項目中被使用。\n或許您可以在其[$2 檔案描述頁面]上編輯說明。",
-       "sharedupload-desc-create": "該檔案來自$1,它可能在其它計劃項目中被使用。\n或許您可以在那邊的[$2 檔案描述頁面]上編輯其說明。",
+       "linkstoimage-redirect": "$1 (檔案重新導向至) $2",
+       "duplicatesoffile": "以下 $1 個檔案與此檔案重覆 ([[Special:FileDuplicateSearch/$2|了解詳細資訊]]):",
+       "sharedupload": "此檔案來自 $1 且可能被其他專案所使用。",
+       "sharedupload-desc-there": "此檔案來自 $1 且可能被其他專案所使用。\n請參考 [$2 檔案描述頁面] 了解進一步資訊。",
+       "sharedupload-desc-here": "此檔案來自 $1 且可能被其他專案所使用。\n以下為該檔案於 [$2 檔案描述頁面] 的內容描述。",
+       "sharedupload-desc-edit": "此檔案來自 $1 且可能被其他專案所使用。\n您可在該檔案的 [$2 檔案描述頁面] 上編輯內容描述。",
+       "sharedupload-desc-create": "此檔案來自 $1 且可能被其他專案所使用。\n若您想要編輯內容描述可至 [$2 檔案描述頁面]。",
        "filepage-nofile": "不存在此名稱的檔案。",
-       "filepage-nofile-link": "不存在此名稱的檔案,但您可以[$1 上傳它]。",
-       "uploadnewversion-linktext": "上傳檔案的新版本",
-       "shared-repo-from": "出自$1",
-       "shared-repo": "一個共用檔案庫",
+       "filepage-nofile-link": "不存在此名稱的檔案,您可以 [$1 上傳]。",
+       "uploadnewversion-linktext": "上傳檔案的新版本",
+       "shared-repo-from": "來自 $1",
+       "shared-repo": "共用檔案庫",
        "shared-repo-name-wikimediacommons": "維基共享資源",
-       "upload-disallowed-here": "您不可以覆蓋此檔案。",
-       "filerevert": "恢復$1",
-       "filerevert-legend": "恢復檔案",
-       "filerevert-intro": "您現正在恢復檔案'''[[Media:$1|$1]]'''到[$4 於$2 $3的版本]。",
-       "filerevert-comment": "理由:",
-       "filerevert-defaultcomment": "已經恢復到於$1 $2的版本",
-       "filerevert-submit": "恢復",
-       "filerevert-success": "'''[[Media:$1|$1]]'''已經恢復到[$4 於$2 $3的版本]。",
-       "filerevert-badversion": "這個檔案所提供的時間截記並無先前的本地版本。",
-       "filedelete": "刪除$1",
+       "upload-disallowed-here": "您無法覆蓋此檔案。",
+       "filerevert": "還原 $1",
+       "filerevert-legend": "還原檔案",
+       "filerevert-intro": "您現正在還原檔案 <strong>[[Media:$1|$1]]</strong> 至 [$4 於 $2 $3 的版本]。",
+       "filerevert-comment": "原因:",
+       "filerevert-defaultcomment": "已還原到於 $1 $2 的版本",
+       "filerevert-submit": "還原",
+       "filerevert-success": "<strong>[[Media:$1|$1]]</strong> 已經還原到 [$4 於 $2 $3 的版本]。",
+       "filerevert-badversion": "查無此檔案先前於指定時間的本地版本。",
+       "filedelete": "刪除 $1",
        "filedelete-legend": "刪除檔案",
-       "filedelete-intro": "您現正刪除檔案'''[[Media:$1|$1]]'''。",
-       "filedelete-intro-old": "{{GENDER:|你|妳|你}}現正刪除'''[[Media:$1|$1]]'''於[$4 $2 $3]的版本。",
-       "filedelete-comment": "理由:",
+       "filedelete-intro": "您現正要刪除檔案 <strong>[[Media:$1|$1]]</strong> 與其所有歷史版本。",
+       "filedelete-intro-old": "您現正要刪除 <strong>[[Media:$1|$1]]</strong> 於 [$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** 侵犯版權\n** 重覆檔案",
-       "filedelete-edit-reasonlist": "編輯å\88ªé\99¤å\9f\8bç\94±",
-       "filedelete-maintenance": "ç\95¶å\9c¨ç¶­è­·æ\99\82å·²ç¶\93æ\9a«æ\99\82å\81\9cç\94¨æª\94æ¡\88å\88ªé\99¤å\92\8cæ\81¢å¾©。",
-       "filedelete-maintenance-title": "ç\84¡æ³\95å\88ªé\99¤æ\96\87件",
+       "filedelete-success": "已刪除 <strong>$1</strong>。",
+       "filedelete-success-old": "已刪除 <strong>[[Media:$1|$1]]</strong> 於 $2 $3 的版本。",
+       "filedelete-nofile": "<strong>$1</strong> 不存在。",
+       "filedelete-nofile-old": "查無 <strong>$1</strong> 擁有指定的屬性的封存版本。",
+       "filedelete-otherreason": "其它/額外的原因:",
+       "filedelete-reason-otherlist": "其它原因",
+       "filedelete-reason-dropdown": "*常見的刪除原因\n** 侵犯版權\n** 檔案重覆",
+       "filedelete-edit-reasonlist": "編輯å\88ªé\99¤å\8e\9få\9b ",
+       "filedelete-maintenance": "維護æ\9c\9fé\96\93æª\94æ¡\88å\88ªé\99¤å\92\8cé\82\84å\8e\9fæ\9a«å\81\9c使ç\94¨。",
+       "filedelete-maintenance-title": "ç\84¡æ³\95å\88ªé\99¤æª\94æ¡\88",
        "mimesearch": "MIME 搜尋",
-       "mimesearch-summary": "æ\9c¬é \81é\9d¢å\95\9fç\94¨æª\94æ¡\88MIMEé¡\9eå\9e\8bé\81\8e濾å\99¨ã\80\82輸å\85¥ï¸°內容類型/子類型,如 <code>image/jpeg</code>。",
-       "mimetype": "MIME 類型:",
+       "mimesearch-summary": "æ\9c¬é \81é\9d¢å\8f¯æ\90\9cå°\8bæª\94æ¡\88ç\9a\84 MIME é¡\9eå\9e\8bã\80\82\n輸å\85¥æ ¼å¼\8fï¼\9a內容類型/子類型,如 <code>image/jpeg</code>。",
+       "mimetype": "MIME 類型",
        "download": "下載",
-       "unwatchedpages": "未監視的頁面",
-       "listredirects": "重定向清單",
+       "unwatchedpages": "未監視的頁面",
+       "listredirects": "重新導向頁面清單",
        "listduplicatedfiles": "重複檔案列表",
        "listduplicatedfiles-summary": "以下列表中某檔案之最新版本與其他檔案之最新版本重複。進包含本地檔案",
-       "listduplicatedfiles-entry": "檔案[[:File:$1|$1]]與[[$3|其他$2個重複]]。",
-       "unusedtemplates": "æ\9cªä½¿ç\94¨ç\9a\84模æ\9d¿",
-       "unusedtemplatestext": "æ\9c¬é \81é\9d¢å\88\97å\87º{{ns:template}}å\90\8då­\97空é\96\93ä¸\8bæ\89\80æ\9c\89æ\9cªè¢«å\85¶ä»\96é \81é\9d¢ä½¿ç\94¨ç\9a\84é \81é\9d¢ã\80\82è«\8bå\9c¨å\88ªé\99¤é\80\99äº\9b模æ\9d¿å\89\8d檢æ\9f¥å\85¶ä»\96é\80£å\85¥è©²æ¨¡æ\9d¿ç\9a\84頁面。",
+       "listduplicatedfiles-entry": "[[:File:$1|$1]] 有[[$3|其他 $2 個重複檔案]]。",
+       "unusedtemplates": "æ\9cªä½¿ç\94¨ç\9a\84樣ç\89\88",
+       "unusedtemplatestext": "æ­¤é \81é\9d¢å\88\97å\87ºæ\89\80æ\9c\89æ\96¼ {{ns:template}} å\91½å\90\8d空é\96\93ä¸\8bæ\9cªè¢«å\85¶ä»\96é \81é\9d¢å¼\95ç\94¨ç\9a\84樣ç\89\88ã\80\82\nå\9c¨å\88ªé\99¤å\89\8dï¼\8cä»\8dé\9c\80檢æ\9f¥æ\98¯å\90¦æ\9c\89é\80£çµ\90é\80\99äº\9b樣ç\89\88ç\9a\84å\85¶ä»\96頁面。",
        "unusedtemplateswlh": "其他連結",
        "randompage": "隨機頁面",
-       "randompage-nopages": "在以下的{{PLURAL:$2|名字空間}}中沒有頁面:$1",
+       "randompage-nopages": "在{{PLURAL:$2|命名空間}}中沒有任何頁面:$1。",
        "randomincategory": "分類中的隨機頁面",
        "randomincategory-invalidcategory": "\"$1\" 不是一個有效的分類名稱。",
        "randomincategory-nopages": "[[:Category:$1]]中沒有頁面。",
        "randomincategory-selectcategory": "從分類中獲取隨機頁面:$1 $2",
-       "randomincategory-selectcategory-submit": "顯示",
-       "randomredirect": "隨機重向",
-       "randomredirect-nopages": "在「$1」名字空間中沒有重定向頁面。",
+       "randomincategory-selectcategory-submit": "執行",
+       "randomredirect": "隨機重新導向",
+       "randomredirect-nopages": "在命名空間 \"$1\" 中沒有重新導向頁面。",
        "statistics": "統計",
        "statistics-header-pages": "頁面統計",
        "statistics-header-edits": "編輯統計",
        "statistics-header-views": "檢視統計",
-       "statistics-header-users": "使用者統計",
+       "statistics-header-users": "使用者統計資訊",
        "statistics-header-hooks": "其它統計",
        "statistics-articles": "內容頁面",
        "statistics-pages": "頁面",
-       "statistics-pages-desc": "在圍記(Wiki)上的所有頁面,包括討論頁、重新導向等。",
+       "statistics-pages-desc": "在 Wiki 上所有的頁面,包含對話頁面、重新導向頁面...等。",
        "statistics-files": "已經上傳的檔案",
-       "statistics-edits": "自從{{SITENAME}}設定的頁面編輯數",
-       "statistics-edits-average": "每一頁面的平均編輯數",
+       "statistics-edits": "自 {{SITENAME}} 成立以來的頁面編輯數",
+       "statistics-edits-average": "每平均編輯數",
        "statistics-views-total": "檢視總數",
        "statistics-views-total-desc": "不存在頁面和特殊頁面的查看數未計入",
        "statistics-views-peredit": "每次編輯檢視數",
-       "statistics-users": "已註冊[[Special:ListUsers|使用者]]",
-       "statistics-users-active": "活使用者",
-       "statistics-users-active-desc": "在前$1天中操作過的用戶",
+       "statistics-users": "已註冊的 [[Special:ListUsers|使用者]]",
+       "statistics-users-active": "活使用者",
+       "statistics-users-active-desc": "在最近 $1 天操作過的使用者",
        "statistics-mostpopular": "被查閱次數最多的頁面",
-       "pageswithprop": "æ\9c\89é \81é\9d¢屬性的頁面",
+       "pageswithprop": "æ\93\81æ\9c\89屬性的頁面",
        "pageswithprop-legend": "有頁面屬性的頁面",
-       "pageswithprop-text": "此頁列出所有頁面使用了特定的頁面屬性。",
+       "pageswithprop-text": "此頁面用來查詢使用了指定屬性的頁面。",
        "pageswithprop-prop": "屬性名稱:",
-       "pageswithprop-submit": "進入",
-       "pageswithprop-prophidden-long": "長文本屬性值已被隱藏($1)",
-       "pageswithprop-prophidden-binary": "已隱藏二進位屬性值($1)",
-       "doubleredirects": "雙重的重新導向",
+       "pageswithprop-submit": "執行",
+       "pageswithprop-prophidden-long": "已隱藏過長的屬性值 ($1)",
+       "pageswithprop-prophidden-binary": "已隱藏二進位屬性值 ($1)",
+       "doubleredirects": "雙重的重新導向頁面",
        "doubleredirectstext": "這一頁列出所有重定向頁面重定向到另一個重定向頁的頁面。每一行都包含到第一和第二個重定向頁面的連結,以及第二個重定向頁面的目標,通常顯示的都會是\"真正\"的目標頁面,也就是第一個重定向頁面應該指向的頁面。\n<del>已劃去</del>的為已經解決之項目。",
-       "double-redirect-fixed-move": "[[$1]]已經完成移動,它現在重新定向到[[$2]]。",
-       "double-redirect-fixed-maintenance": "修復å¾\9e[[$1]]å\88°[[$2]]ç\9a\84雙重重定向。",
+       "double-redirect-fixed-move": "[[$1]] 已完成移動。\n此頁面已自動更新並重新導向至 [[$2]]。",
+       "double-redirect-fixed-maintenance": "ä½\9cç\82ºç¶­è­·å·¥ä½\9cè\87ªå\8b\95修復æ\96¼[[$1]]è\87³[[$2]]ä¹\8b雙重重定向。",
        "double-redirect-fixer": "重新導向修正器",
-       "brokenredirects": "中斷的重新導向",
+       "brokenredirects": "損壞的重新導向頁面",
        "brokenredirectstext": "以下的重新導向頁面連結到不存在的頁面:",
        "brokenredirects-edit": "編輯",
        "brokenredirects-delete": "刪除",
        "withoutinterwiki": "未有語言連結的頁面",
-       "withoutinterwiki-summary": "以ä¸\8bç\9a\84é \81é\9d¢æ\98¯æ\9cªæ\9c\89èª\9eè¨\80é\80£çµ\90å\88°å\85¶å®\83èª\9eè¨\80ç\89\88æ\9c¬。",
-       "withoutinterwiki-legend": "å\89\8d綴",
+       "withoutinterwiki-summary": "ä¸\8bå\88\97æ\98¯æ²\92æ\9c\89é\80£çµ\90å\88°å\85¶å®\83èª\9eè¨\80ç\89\88æ\9c¬ç\9a\84é \81é\9d¢。",
+       "withoutinterwiki-legend": "å­\97é¦\96",
        "withoutinterwiki-submit": "顯示",
        "fewestrevisions": "最少修訂的頁面",
        "nbytes": "$1 個位元組",
        "ncategories": "$1 個分類",
-       "ninterwikis": "$1 個跨維基",
-       "nlinks": "$1個連結",
-       "nmembers": "$1個成員",
-       "nmemberschanged": "$1 → $2個成員",
-       "nrevisions": "$1修訂",
-       "nviews": "$1次瀏覽",
-       "nimagelinks": "用於$1個頁面中",
-       "ntransclusions": "用於$1個頁面中",
-       "specialpage-empty": "這個報告的結果為空。",
+       "ninterwikis": "$1 個 Interwiki 連結",
+       "nlinks": "$1 個連結",
+       "nmembers": "$1 個成員",
+       "nmemberschanged": "$1 → $2 個成員",
+       "nrevisions": "$1 次修訂",
+       "nviews": "$1 次檢視",
+       "nimagelinks": "被 $1 個頁面使用",
+       "ntransclusions": "被 $1 個頁面使用",
+       "specialpage-empty": "此報表無查無任何結果。",
        "lonelypages": "孤立頁面",
-       "lonelypagestext": "以ä¸\8bé \81é\9d¢å°\9aæ\9cªè¢«{{SITENAME}}中ç\9a\84å\85¶å®\83é \81é\9d¢é\80£çµ\90æ\88\96被ä¹\8bå\8c\85å\90«。",
+       "lonelypagestext": "ä¸\8bå\88\97é \81é\9d¢å°\9aæ\9cªè¢« {{SITENAME}} ä¸­ç\9a\84å\85¶å®\83é \81é\9d¢é\80£çµ\90æ\88\96å¼\95ç\94¨。",
        "uncategorizedpages": "待分類頁面",
        "uncategorizedcategories": "待分類類別",
        "uncategorizedimages": "待分類檔案",
-       "uncategorizedtemplates": "å¾\85å\88\86é¡\9e模æ\9d¿",
+       "uncategorizedtemplates": "å¾\85å\88\86é¡\9e樣ç\89\88",
        "unusedcategories": "未使用的分類",
-       "unusedimages": "未使用圖片",
+       "unusedimages": "未使用的檔案",
        "popularpages": "熱點頁面",
        "wantedcategories": "需要的分類",
-       "wantedpages": "待撰頁面",
+       "wantedpages": "需要的頁面",
        "wantedpages-badtitle": "在結果組上的無效標題: $1",
        "wantedfiles": "需要的檔案",
        "wantedfiletext-cat": "以下檔案被使用,但不存在。外部儲存庫的文件儘管現有,但可能會在此列出,任何此類的誤報將被<del>剔除</del>。此外,內嵌了不存在的檔案的網頁將在[[:$1]]列出。",
        "wantedfiletext-nocat": "以下檔案被使用,但不存在。外部儲存庫的文件儘管現有,但可能會在此列出,任何此類的誤報將被<del>剔除</del>。",
-       "wantedtemplates": "é\9c\80è¦\81ç\9a\84模æ\9d¿",
+       "wantedtemplates": "é\9c\80è¦\81ç\9a\84樣ç\89\88",
        "mostlinked": "最多連結頁面",
        "mostlinkedcategories": "最多連結分類",
-       "mostlinkedtemplates": "最多連結模板",
+       "mostlinkedtemplates": "最多連結的樣版",
        "mostcategories": "最多分類頁面",
        "mostimages": "最多連結檔案",
-       "mostinterwikis": "最多跨維基頁面",
+       "mostinterwikis": "最多 Interwiki 連結的頁面",
        "mostrevisions": "最多修訂頁面",
-       "prefixindex": "所有有前綴的頁面",
-       "prefixindex-namespace": "帶有前綴的頁面(屬於$1名字空間)",
-       "prefixindex-strip": "於列表中省略前綴",
-       "shortpages": "頁面",
-       "longpages": "é\95·頁面",
-       "deadendpages": "斷連頁面",
-       "deadendpagestext": "以下頁面沒有連結到{{SITENAME}}中的其它頁面。",
+       "prefixindex": "所有頁面與字首",
+       "prefixindex-namespace": "所有含字首的頁面 ($1 命名空間)",
+       "prefixindex-strip": "於清單中省略字首",
+       "shortpages": "過短的頁面",
+       "longpages": "é\81\8eé\95·ç\9a\84頁面",
+       "deadendpages": "無連結頁面",
+       "deadendpagestext": "以下在 {{SITENAME}} 中的頁面未連結到其他頁面。",
        "protectedpages": "受保護頁面",
-       "protectedpages-indef": "只有無期之保護頁面",
-       "protectedpages-summary": "æ­¤é \81é\9d¢å\88\97å\87ºç\95¶å\89\8då\8f\97ä¿\9dè­·ä¹\8bé \81é\9d¢ã\80\82欲訪å\95\8få\8f\97ç\99½ç´\99ä¿\9dè­·ä¹\8bæ¨\99é¡\8cå\88\97表ï¼\8cè«\8bå\8f\83è¦\8b[[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]]。",
-       "protectedpages-cascade": "只有連鎖之保護頁面",
-       "protectedpages-noredirect": "隱藏重定向",
+       "protectedpages-indef": "只顯示無限期的保護頁面",
+       "protectedpages-summary": "æ­¤é \81é\9d¢å\88\97å\87ºç\9b®å\89\8då\8f\97ä¿\9dè­·ç\9a\84é \81é\9d¢ã\80\82 æ¬²æ\9f¥è©¢å\8f\97ä¿\9dè­·æ¨\99é¡\8cæ¸\85å\96®ï¼\8cè«\8bå\8f\83è\80\83 [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]]。",
+       "protectedpages-cascade": "只顯示連鎖的保護頁面",
+       "protectedpages-noredirect": "隱藏重新導向頁面",
        "protectedpagesempty": "在這些參數下沒有頁面正在保護。",
-       "protectedpages-timestamp": "æ\99\82é\96\93æ\88³",
+       "protectedpages-timestamp": "æ\97¥æ\9c\9fæ\99\82é\96\93",
        "protectedpages-page": "頁面",
-       "protectedpages-expiry": "過期",
-       "protectedpages-performer": "保護用戶",
+       "protectedpages-expiry": "期限",
+       "protectedpages-performer": "保護使用者",
        "protectedpages-params": "保護參數",
        "protectedpages-reason": "原因",
        "protectedpages-unknown-timestamp": "未知",
-       "protectedpages-unknown-performer": "未知用戶",
+       "protectedpages-unknown-performer": "不明的使用者",
        "protectedtitles": "受保護標題",
-       "protectedtitles-summary": "æ­¤é \81é\9d¢å\88\97å\87ºç\95¶å\89\8då\8f\97ç\99½ç´\99ä¿\9dè­·ä¹\8bæ¨\99é¡\8cã\80\82欲訪å\95\8få\8f\97ä¿\9dè­·é \81é\9d¢ä¹\8bå\88\97表ï¼\8cè«\8bå\8f\83è¦\8b[[{{#special:ProtectedPages}}|{{int:protectedpages}}]]。",
+       "protectedtitles-summary": "æ­¤é \81é\9d¢å\88\97å\87ºç\9b®å\89\8då\8f\97ä¿\9dè­·ç\9a\84æ¨\99é¡\8cã\80\82 æ¬²æ\9f¥è©¢å\8f\97ä¿\9dè­·é \81é\9d¢æ¸\85å\96®ï¼\8cè«\8bå\8f\83è\80\83 [[{{#special:ProtectedPages}}|{{int:protectedpages}}]]。",
        "protectedtitlesempty": "在這些參數之下並無標題正在保護。",
-       "listusers": "用戶列表",
-       "listusers-editsonly": "只顯示有編輯的用戶",
-       "listusers-creationsort": "建立日期排序",
+       "listusers": "使用者清單",
+       "listusers-editsonly": "只顯示有編輯的使用者",
+       "listusers-creationsort": "建立日期排序",
        "listusers-desc": "使用降冪排序",
        "usereditcount": "$1 次{{PLURAL:$1|編輯}}",
-       "usercreated": "$1 $2{{GENDER:$3|創建}}",
+       "usercreated": "於 $1 $2 {{GENDER:$3|建立}}",
        "newpages": "最新頁面",
        "newpages-username": "使用者名稱:",
        "ancientpages": "最舊頁面",
        "move": "移動",
        "movethispage": "移動本頁",
-       "unusedimagestext": "下列檔案未有嵌入任何頁面但它仍然存在。\n請注意其它網站可能直接透過 URL 連結此檔案,所以這裡列出的圖片有可能依然被使用。",
-       "unusedcategoriestext": "é\9b\96ç\84¶æ²\92æ\9c\89被å\85¶å®\83é \81é\9d¢æ\88\96è\80\85å\88\86é¡\9eæ\89\80æ\8e¡ç\94¨ï¼\8cä½\86å\88\97表中ç\9a\84å\88\86é¡\9eé \81ä¾\9dç\84¶å­\98å\9c¨ã\80\82",
+       "unusedimagestext": "下列為未被任何頁面使用的檔案。\n請注意,其它網站可能直接透過 URL 連結至檔案,所以這裡列出的檔案仍有可能被使用。",
+       "unusedcategoriestext": "ä¸\8bå\88\97å\88\86é¡\9eæ²\92æ\9c\89被å\85¶å®\83é \81é\9d¢æ\88\96è\80\85å\88\86é¡\9eæ\89\80使ç\94¨ã\80\82",
        "notargettitle": "無目標",
-       "notargettext": "您還沒有指定一個目標頁面或用戶以進行此項操作。",
+       "notargettext": "您尚未指定目標頁面或使用者以進行此項操作。",
        "nopagetitle": "無目標頁面",
        "nopagetext": "您所指定的目標頁面並不存在。",
-       "pager-newer-n": "新$1次",
-       "pager-older-n": "è\88\8a$1次",
+       "pager-newer-n": "較新 $1 筆",
+       "pager-older-n": "è¼\83è\88\8a $1 ç­\86",
        "suppress": "監督",
        "querypage-disabled": "此特殊頁面基於效能的原因已經被停用。",
-       "booksources": "網路書源",
-       "booksources-search-legend": "尋找網路書源",
+       "booksources": "圖書資源",
+       "booksources-search-legend": "尋找圖書資源",
        "booksources-isbn": "國際標準書號:",
-       "booksources-go": "送出",
+       "booksources-go": "執行",
        "booksources-text": "以下是一份銷售新書或二手書的列表,並可能有{{GENDER:|你|妳|你}}正尋找的書的進一步訊息:",
        "booksources-invalid-isbn": "提供的ISBN號碼並不正確,請檢查原始複製來源號碼是否有誤。",
        "specialloguserlabel": "操作者:",
-       "speciallogtitlelabel": "目標(標題或用戶):",
+       "speciallogtitlelabel": "目標 (標題或使用者):",
        "log": "日誌",
        "all-logs-page": "所有公開日誌",
-       "alllogstext": "綜合顯示 {{SITENAME}} 的上傳、刪除、保護、查封以及站務日誌。",
-       "logempty": "在日誌中不存在匹配項。",
-       "log-title-wildcard": "搜尋以這個文字開始的標題",
-       "showhideselectedlogentries": "顯示/隱藏所選的日誌項目",
+       "alllogstext": "合併顯示所有 {{SITENAME}} 中所有類型的日誌。\n您可以點選下拉式選單選擇日誌的類型,指定使用者名稱 (區分大小寫) 或影響的頁面 (區分大小寫)。",
+       "logempty": "無符合條件的日誌。",
+       "log-title-wildcard": "搜尋以此欄位文字為字首的標題",
+       "showhideselectedlogentries": "顯示/隱藏已選擇的日誌項目",
        "allpages": "所有頁面",
-       "alphaindexline": "$1 到 $2",
-       "nextpage": "下一頁($1)",
-       "prevpage": "上一頁($1)",
+       "nextpage": "下一頁 ($1)",
+       "prevpage": "上一頁 ($1)",
        "allpagesfrom": "顯示從此處開始的頁面:",
        "allpagesto": "顯示從此處結束的頁面:",
        "allarticles": "所有頁面",
-       "allinnamespace": "所有頁面(屬於$1名字空間)",
-       "allpagessubmit": "提交",
-       "allpagesprefix": "顯示有此前綴的頁面:",
-       "allpagesbadtitle": "給定的頁面標題是非法的,或者具有一個內部語言或內部 wiki 的前綴。它可能包含一個或更多的不能用於標題的字元。",
-       "allpages-bad-ns": "在{{SITENAME}}中沒有一個叫做「$1」的名字空間。",
-       "allpages-hide-redirects": "隱藏重定向頁",
+       "allinnamespace": "所有頁面 ($1 命名空間)",
+       "allpagessubmit": "執行",
+       "allpagesprefix": "顯示以此為字首頁面:",
+       "allpagesbadtitle": "指定的頁面標題無效、包含內部語言或內部 Wiki 的字首。\n它可能包含一個或多個的不能用於標題的字元。",
+       "allpages-bad-ns": "{{SITENAME}} 沒有 \"$1\" 命名空間。",
+       "allpages-hide-redirects": "隱藏重新導向頁面",
        "cachedspecial-viewing-cached-ttl": "你正在瀏覽本頁的緩存版本,至多可能存在$1的延遲。",
        "cachedspecial-viewing-cached-ts": "您正在閱讀此頁的緩存版本,這可能不是完整的版本。",
        "cachedspecial-refresh-now": "查看最新。",
        "categories": "頁面分類",
-       "categoriespagetext": "以ä¸\8bç\9a\84{{PLURAL:$1|å\88\86é¡\9e}}中å\8c\85å\90«äº\86é \81é\9d¢æ\88\96åª\92é«\94ã\80\82\n[[Special:UnusedCategories|æ\9cªç\94¨å\88\86é¡\9e]]ä¸\8dæ\9c\83å\9c¨é\80\99è£\8få\88\97示ã\80\82\nè«\8bå\90\8cæ\99\82å\8f\83é\96±[[Special:WantedCategories|需要的分類]]。",
+       "categoriespagetext": "ä¸\8bå\88\97ç\82ºå\8c\85å\90«é \81é\9d¢æ\88\96åª\92é«\94ç\9a\84{{PLURAL:$1|å\88\86é¡\9e}}ã\80\82\n[[Special:UnusedCategories|æ\9cªä½¿ç\94¨ç\9a\84å\88\86é¡\9e]] ä¸\8dæ\9c\83å\9c¨æ­¤é¡¯ç¤ºã\80\82\nè«\8bå\8f\83è\80\83 [[Special:WantedCategories|需要的分類]]。",
        "categoriesfrom": "顯示由此項起之分類:",
        "special-categories-sort-count": "按數量排列",
        "special-categories-sort-abc": "按字母排列",
-       "deletedcontributions": "已刪除的用戶貢獻",
-       "deletedcontributions-title": "已刪除的用戶貢獻",
+       "deletedcontributions": "已刪除的使用者貢獻",
+       "deletedcontributions-title": "已刪除的使用者貢獻",
        "sp-deletedcontributions-contribs": "貢獻",
        "linksearch": "外部鏈接搜索",
        "linksearch-pat": "搜尋網址:",
-       "linksearch-ns": "å\90\8då­\97空間:",
+       "linksearch-ns": "å\91½å\90\8d空間:",
        "linksearch-ok": "搜尋",
        "linksearch-text": "可使用通配符,如“*.wikipedia.org”。至少需要一個頂級域名,例如“*.org”。<br />\n支持的{{PLURAL:$2|協議}}:<code>$1</code>(若沒有指定協議,預設為http://)。",
        "linksearch-line": "$1 連自 $2",
        "linksearch-error": "萬用字元僅可在主機名稱的開頭使用。",
-       "listusersfrom": "給定顯示用戶條件:",
+       "listusersfrom": "顯示使用者開始自:",
        "listusers-submit": "顯示",
-       "listusers-noresult": "æ\89¾ä¸\8då\88°ç\94¨æ\88。",
-       "listusers-blocked": "(已封禁)",
-       "activeusers": "活躍用戶列表",
-       "activeusers-intro": "這個是在最近$1天之內有一些動作的用戶列表。",
-       "activeusers-count": "最近$3天內有$1次編輯",
-       "activeusers-from": "顯示用戶開始於:",
+       "listusers-noresult": "æ\9f¥ç\84¡ä½¿ç\94¨è\80\85。",
+       "listusers-blocked": "(已封鎖)",
+       "activeusers": "活動的使用者清單",
+       "activeusers-intro": "此清單為最近 $1 天有活動的使用者。",
+       "activeusers-count": "最近 $3 天內有 $1 次動作",
+       "activeusers-from": "顯示使用者開始自:",
        "activeusers-hidebots": "隱藏機器人",
        "activeusers-hidesysops": "隱藏管理員",
-       "activeusers-noresult": "æ\89¾ä¸\8då\88°ç\94¨æ\88。",
-       "listgrouprights": "用戶群組權限",
-       "listgrouprights-summary": "以下面是一個在這個wiki中定義出來的用戶權限清單,以及它們的存取權。\n更多有關個別權限的細節可以在[[{{MediaWiki:Listgrouprights-helppage}}|這裏]]找到。",
-       "listgrouprights-key": "* <span class=\"listgrouprights-granted\">已授予的權限</span>\n* <span class=\"listgrouprights-revoked\">被吊銷的權限</span>",
+       "activeusers-noresult": "æ\9f¥ç\84¡ä½¿ç\94¨è\80\85。",
+       "listgrouprights": "使用者群組權限",
+       "listgrouprights-summary": "以下為此 Wiki 的使用者群組清單,以及相關的存取權限。\n您可以在 [[{{MediaWiki:Listgrouprights-helppage}}|詳細資訊]] 找到有關個別權限的資訊。",
+       "listgrouprights-key": "說明:\n* <span class=\"listgrouprights-granted\">已授予的權限</span>\n* <span class=\"listgrouprights-revoked\">已撤銷的權限</span>",
        "listgrouprights-group": "群組",
        "listgrouprights-rights": "權限",
        "listgrouprights-helppage": "Help:群組權限",
-       "listgrouprights-members": "(成員清單)",
+       "listgrouprights-members": "(成員清單)",
        "listgrouprights-addgroup": "加入的{{PLURAL:$2|一個|多個}}群組: $1",
        "listgrouprights-removegroup": "移除的{{PLURAL:$2|一個|多個}}群組: $1",
        "listgrouprights-addgroup-all": "加入所有群組",
        "listgrouprights-removegroup-self-all": "在自己的賬戶中移除所有群組",
        "listgrouprights-namespaceprotection-header": "命名空間限制",
        "listgrouprights-namespaceprotection-namespace": "命名空間",
-       "listgrouprights-namespaceprotection-restrictedto": "允許用戶編輯權限",
+       "listgrouprights-namespaceprotection-restrictedto": "允許使用者編輯的權限",
        "trackingcategories": "跟蹤分類",
-       "trackingcategories-summary": "當前頁面收錄由MediaWiki軟體自動加入的跟蹤分類。名稱可經由{{ns:8}}名字空間對於系統資訊修改之。",
+       "trackingcategories-summary": "此頁面列出由 MediaWiki 系統自動產生用來追蹤頁面的分類,這些分類的名稱可由命名空間 {{ns:8}} 中的相關系統訊息中修改。",
        "trackingcategories-msg": "跟蹤分類",
-       "trackingcategories-name": "è³\87è¨\8aå\90\8d",
+       "trackingcategories-name": "è¨\8aæ\81¯å\90\8d稱",
        "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": "å±\95é\96\8b模æ\9d¿å\8f\83æ\95¸ï¼\88ä¸\89é\9a\8aè\8a±æ\8b¬å¼§å\85§ï¼\8cä¾\8bå¦\82<code>{{{Foo}}}</code>ï¼\89å¾\8cï¼\8cé \81é\9d¢å¤§æ\96¼<code>$wgMaxArticleSize</code>。",
+       "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": "å\9c¨å±\95é\96\8b模樣ç\89\88å\8f\83æ\95¸ä¹\8bå¾\8c (æ\9c\89äº\9bæ\96¼ä¸\89æ\8b¬è\99\9f中ï¼\8cå¦\82 <code>{{{Foo}}}</code>)ï¼\8cé \81é\9d¢å¤§å°\8fè¶\85é\81\8e<code>$wgMaxArticleSize</code> è¨­å®\9aç\9a\84é\99\90å\88。",
        "expensive-parserfunction-category-desc": "頁面包含太多高開銷函數解析器(例如<code>#ifexist</code>)。參見[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit]。",
        "broken-file-category-desc": "黨頁面包含受損檔案連接(連入被嵌入之不存在檔案)時。",
        "hidden-category-category-desc": "此分類帶有<code><nowiki>__HIDDENCAT__</nowiki></code>,它預設防止於頁面分類連接盒中顯示。",
        "trackingcategories-nodesc": "並無說明。",
        "trackingcategories-disabled": "分類被禁用",
-       "mailnologin": "無電郵地址",
-       "mailnologintext": "您必須先[[Special:UserLogin|登入]]\n並在[[Special:Preferences|偏好設定]]\n中有一個有效的 e-mail 地址才可以電郵其他用戶。",
-       "emailuser": "E-mail該用戶",
-       "emailuser-title-target": "電郵這位{{GENDER:$1|用戶}}",
-       "emailuser-title-notarget": "E-mail用戶",
-       "emailpage": "E-mail用戶",
-       "emailpagetext": "您可以ç\94¨ä¸\8bé\9d¢ç\9a\84表格å\8e»å¯\84ä¸\80å°\81é\9b»é\83µçµ¦é\80\99ä½\8d{{Gender:$1|ç\94¨æ\88¶}}ã\80\82\næ\82¨å\9c¨[[Special:Preferences|æ\82¨ç\9a\84å\8f\83æ\95¸è¨­ç½®]]中æ\89\80輸å\85¥ç\9a\84é\9b»å­\90é\83µä»¶å\9c°å\9d\80å°\87å\87ºç\8f¾å\9c¨é\83µä»¶ã\80\8cç\99¼ä»¶äººã\80\8dä¸\80æ¬\84中ï¼\8cé\80\99樣該ç\94¨æ\88¶å°±å\8f¯ä»¥å\9b\9eè¦\86æ\82¨ã\80\82",
-       "defemailsubject": "{{SITENAME}}來自用戶「$1」的電子郵件",
-       "usermaildisabled": "用戶電郵已停用",
-       "usermaildisabledtext": "您不可以發送電郵到這個wiki上的其他用戶",
-       "noemailtitle": "無e-mail地址",
-       "noemailtext": "該用戶還沒有指定一個有效的e-mail地址。",
-       "nowikiemailtext": "這位用戶選擇不接收其他用戶的電子郵件。",
-       "emailnotarget": "收件人不存在或無效的用戶名。",
-       "emailtarget": "輸入收件人用戶名",
-       "emailusername": "用戶名:",
-       "emailusernamesubmit": "提交",
-       "email-legend": "發一封電子郵件至另一位{{SITENAME}}用戶",
-       "emailfrom": "件人:",
+       "mailnologin": "沒有發送位址",
+       "mailnologintext": "您必須先 [[Special:UserLogin|登入]]\n並在 [[Special:Preferences|偏好設定]]\n中設定一個有效的電子郵件地址才可以發送信件給其他使用者。",
+       "emailuser": "寄信給此使用者",
+       "emailuser-title-target": "寄信給此{{GENDER:$1|使用者}}",
+       "emailuser-title-notarget": "寄信給使用者",
+       "emailpage": "E-mail 給使用者",
+       "emailpagetext": "您可以使ç\94¨ä»¥ä¸\8b表格ç\99¼é\80\81é\9b»å­\90é\83µä»¶çµ¦é\80\99ä½\8d {{Gender:$1|使ç\94¨è\80\85}}ã\80\82\næ\82¨å\9c¨ [[Special:Preferences|å\81\8f好設å®\9a]] ä¸­æ\89\80輸å\85¥ç\9a\84é\9b»å­\90é\83µä»¶å\9c°å\9d\80å°\87æ\9c\83ä½\9cç\82ºé\83µä»¶ç\9a\84 \"å¯\84件人\"ï¼\8cå\9b æ­¤è©²ä½¿ç\94¨è\80\85å\8f¯ç\9b´æ\8e¥å\9b\9eè¦\86æ\82¨ã\80\82",
+       "defemailsubject": "來自使用者 \"$1\" 於 {{SITENAME}} 發送的電子郵件",
+       "usermaildisabled": "使用者電子郵件已停用",
+       "usermaildisabledtext": "您不可發送信件到這個 Wiki 上的其他使用者",
+       "noemailtitle": "沒有電子郵件地址",
+       "noemailtext": "此使用者尚未指定一個有效的電子郵件地址。",
+       "nowikiemailtext": "此使用者選擇不接收其他使用者的信件。",
+       "emailnotarget": "收件人不存在或無效的使用者名稱。",
+       "emailtarget": "輸入收件人使用者名稱",
+       "emailusername": "使用者名稱:",
+       "emailusernamesubmit": "送出",
+       "email-legend": "發送電子郵件給另一位 {{SITENAME}} 使用者",
+       "emailfrom": "件人:",
        "emailto": "收件人:",
        "emailsubject": "主題:",
        "emailmessage": "訊息:",
        "emailsend": "發送",
-       "emailccme": "將我的消息的副本發送一份到我的電郵信箱。",
-       "emailccsubject": "您發送給$1的訊息的副本:$2",
+       "emailccme": "發送一份副本到我的電子郵件信箱。",
+       "emailccsubject": "您發送給 $1 的訊息副本:$2",
        "emailsent": "電子郵件已發送",
-       "emailsenttext": "您的電子郵件已經發出。",
-       "emailuserfooter": "這封電郵是由$1寄給$2經{{SITENAME}}的「電郵用戶」功能發出的。",
+       "emailsenttext": "您的電子郵件訊息已經送出。",
+       "emailuserfooter": "這封電子郵件是由 $1 透過 {{SITENAME}} 的 \"發送信件給使用者\" 功能寄給 $2。",
        "usermessage-summary": "給系統消息。",
        "usermessage-editor": "系統界面",
        "watchlist": "監視列表",
        "watchlistanontext": "請$1以檢視或編輯您的監視列表。",
        "watchnologin": "未登入",
        "addwatch": "加至監視列表",
-       "addedwatchtext": "已將頁面「[[:$1]]」加入您的[[Special:Watchlist|監視列表]]。將來此頁面及其討論頁如有更動都會在那裡列出。",
+       "addedwatchtext": "已將頁面 \"[[:$1]]\" 加入您的 [[Special:Watchlist|監視列表]]。若此頁面及其對話頁面有任何更動都會在監視列表中列出。",
+       "addedwatchtext-short": "已將頁面 \"$1\" 加入您的監視列表。",
        "removewatch": "停止監視",
        "removedwatchtext": "[[:$1]]已經從[[Special:Watchlist|您的監視頁面]]中移除。",
+       "removedwatchtext-short": "已將頁面 \"$1\" 從您的監視列表移除。",
        "watch": "監視",
        "watchthispage": "監視本頁",
        "unwatch": "取消監視",
        "unwatchthispage": "停止監視",
        "notanarticle": "不是頁面",
-       "notvisiblerev": "上次由不同用戶所作的修訂版本已經刪除",
-       "watchlist-details": "不包含討論頁,您的監視列表上有$1個頁面。",
+       "notvisiblerev": "最後一次由其他使用者所作的修訂已經被刪除",
+       "watchlist-details": "您的監視列表上共有 $1 個頁面 (不包含對話頁面)。",
        "wlheader-enotif": "已經啟動電子郵件通知功能。",
-       "wlheader-showupdated": "在{{GENDER:|你|妳|你}}上次檢視後有被修改過的頁面會顯示為'''粗體'''。",
-       "watchmethod-recent": "檢查被監視頁面的最近編輯",
-       "watchmethod-list": "檢查最近編輯的被監視頁面",
-       "watchlistcontains": "您的監視列表包含$1個頁面。",
-       "iteminvalidname": "頁面 '$1' 錯誤,無效命名...",
-       "wlnote2": "以下是新近<strong>$1</strong>小時的更改,截至$2 $3。",
-       "wlshowlast": "顯示最近$1小時;$2天;$3的修改。",
+       "wlheader-showupdated": "在您最後一次檢視過後修改的頁面會以 <strong>粗體</strong> 顯示。",
+       "wlnote2": "以下為截至 $2 $3 最近 <strong>$1</strong> 小時的變更。",
+       "wlshowlast": "顯示最近 $1 小時,$2 天,$3 的修改",
        "watchlist-options": "監視列表選項",
        "watching": "正在監視...",
        "unwatching": "正在停止監視...",
        "watcherrortext": "更改「$1」的監視列表設定時發生錯誤。",
-       "enotif_reset": "將所有頁面標為已閱讀",
-       "enotif_impersonal_salutation": "{{SITENAME}}用戶",
-       "enotif_subject_deleted": "{{SITENAME}}的「$1」頁面被$2刪除",
-       "enotif_subject_created": "{{SITENAME}}的「$1」頁面被$2建立",
-       "enotif_subject_moved": "{{SITENAME}}的「$1」頁面被$2移動",
-       "enotif_subject_restored": "{{SITENAME}}的「$1」頁面被$2恢復",
-       "enotif_subject_changed": "{{SITENAME}}的「$1」頁面被$2修改",
-       "enotif_body_intro_deleted": "{{SITENAME}}的「$1」頁面於$PAGEEDITDATE被$2刪除,請見$3。",
-       "enotif_body_intro_created": "{{SITENAME}}的「$1」頁面於$PAGEEDITDATE被$2建立,請見$3瀏覽當前版本。。",
-       "enotif_body_intro_moved": "{{SITENAME}}的「$1」頁面於$PAGEEDITDATE被$2移動,請見$3瀏覽當前版本。",
-       "enotif_body_intro_restored": "{{SITENAME}}的「$1」頁面於$PAGEEDITDATE被$2恢復,請見$3瀏覽當前版本。",
-       "enotif_body_intro_changed": "{{SITENAME}}的「$1」頁面於$PAGEEDITDATE被$2修改,請見 $3 瀏覽當前版本。",
-       "enotif_lastvisited": "請參閱 $1 檢視你上次訪問後的所有更改。",
-       "enotif_lastdiff": "請參閱 $1 檢視該更改。",
-       "enotif_anon_editor": "匿名用戶$1",
-       "enotif_body": "$WATCHINGUSERNAME閣下,\n\n$PAGEINTRO $NEWPAGE\n\n編輯摘要:$PAGESUMMARY $PAGEMINOREDIT\n\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{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_reset": "將所有頁面標為已檢視",
+       "enotif_impersonal_salutation": "{{SITENAME}} 使用者",
+       "enotif_subject_deleted": "{{SITENAME}} $2 已刪除頁面 $1",
+       "enotif_subject_created": "{{SITENAME}} $2 已建立頁面 $1",
+       "enotif_subject_moved": "{{SITENAME}} $2 已移動頁面 $1",
+       "enotif_subject_restored": "{{SITENAME}} $2 已還原頁面 $1",
+       "enotif_subject_changed": "{{SITENAME}} $2 已修改頁面 $1",
+       "enotif_body_intro_deleted": "{{SITENAME}} $2 已刪除頁面 $1 於 $PAGEEDITDATE,詳見 $3。",
+       "enotif_body_intro_created": "{{SITENAME}} $2 已建立頁面 $1 於 $PAGEEDITDATE,詳見目前的修訂 $3。",
+       "enotif_body_intro_moved": "{{SITENAME}} $2 已移動頁面 $1 於 $PAGEEDITDATE,詳見目前的修訂 $3。",
+       "enotif_body_intro_restored": "{{SITENAME}} $2 已還原頁面 $1 於 $PAGEEDITDATE,詳見目前的修訂 $3。",
+       "enotif_body_intro_changed": "{{SITENAME}} $2 已修改頁面 $1 於 $PAGEEDITDATE,詳見目前的修訂 $3。",
+       "enotif_lastvisited": "請參考 $1 檢視自您上次檢視後所有的變更。",
+       "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",
        "created": "建立了",
        "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}}]]。",
+       "historywarning": "<strong>警告:</strong>您正要刪除的頁面內含有約 $1 次{{PLURAL:$1|的修訂}}歷史:",
+       "confirmdeletetext": "您正要刪除一個頁面或圖片以及其所有歷史。\n請確定您了解要進行此項操作所造成的後果,同時確認您的行為符合[[{{MediaWiki:Policy-url}}]] 規範。",
        "actioncomplete": "操作完成",
        "actionfailed": "操作失敗",
-       "deletedtext": "「$1」已經被刪除。最近刪除的記錄請參見$2。",
-       "dellogpage": "刪除紀錄",
-       "dellogpagetext": "以下是最近的刪除的列表。",
-       "deletionlog": "刪除紀錄",
-       "reverted": "恢復到早期版本",
-       "deletecomment": "理由:",
-       "deleteotherreason": "其它/附加的理由:",
+       "deletedtext": "已刪除 \"$1\"。\n請參考 $2 檢視最近的刪除記錄。",
+       "dellogpage": "刪除日誌",
+       "dellogpagetext": "以下為最近刪除記錄的列表。",
+       "deletionlog": "刪除日誌",
+       "reverted": "還原到較早的版本",
+       "deletecomment": "原因:",
+       "deleteotherreason": "其它/額外的原因:",
        "deletereasonotherlist": "其它理由",
-       "deletereason-dropdown": "* 常見刪除理由\n** 濫發電郵\n** 破壞\n** 侵犯版權\n** 作者請求\n** 損壞重定向頁",
+       "deletereason-dropdown": "*常見的刪除原因\n** 濫發廣告訊息\n** 破壞資料\n** 侵犯版權\n** 作者請求\n** 損壞的重新導向頁面",
        "delete-edit-reasonlist": "編輯刪除理由",
        "delete-toobig": "這個頁面有一個十分大量的編輯歷史,超過$1次修訂。刪除此類頁面的動作已經被限制,以防止在{{SITENAME}}上的意外擾亂。",
        "delete-warning-toobig": "這個頁面有一個十分大量的編輯歷史,超過$1次修訂。刪除它可能會擾亂{{SITENAME}}的資料庫操作;在繼續此動作前請小心。",
-       "deleting-backlinks-warning": "'''警告:'''您要刪除的頁面有[[Special:WhatLinksHere/{{FULLPAGENAME}}|其他頁面]]連接至此或包含此頁面。",
-       "rollback": "回退編輯",
-       "rollback_short": "回退",
-       "rollbacklink": "原",
-       "rollbacklinkcount": "回退 $1 次編輯",
+       "deleting-backlinks-warning": "<strong>警告:</strong>您正要刪除的頁面有[[Special:WhatLinksHere/{{FULLPAGENAME}}|其他頁面]]連結或引用。",
+       "rollback": "還原編輯",
+       "rollback_short": "還原",
+       "rollbacklink": "原",
+       "rollbacklinkcount": "還原 $1 次編輯",
        "rollbacklinkcount-morethan": "回退多過 $1 次{{PLURAL:$1|編輯}}",
-       "rollbackfailed": "無法回退",
-       "cantrollback": "無法恢復編輯;最後的貢獻者是本篇的唯一作者。",
-       "alreadyrolled": "無法回退由[[User:$2|$2]]([[User talk:$2|討論]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]在[[:$1]]上的編輯;其他人已經編輯或者回退了該頁。\n\n該頁最後的編輯者是[[User:$3|$3]]([[User talk:$3|討論]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]])。",
+       "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}}]])。",
        "editcomment": "編輯摘要: \"''$1''\"。",
-       "revertpage": "已恢復由[[Special:Contributions/$2|$2]]([[User talk:$2|對話]])的編輯至[[User:$1|$1]]的最後一個修訂版本",
-       "revertpage-nouser": "已由隱藏的使用者恢復編輯到上個{{GENDER:$1|[[User:$1|$1]]}}的修訂版本",
-       "rollback-success": "已恢復 $1 的編輯;\n更變更回 $2 的最後修訂版本。",
+       "revertpage": "已還原 [[Special:Contributions/$2|$2]] ([[User talk:$2|對話]]) 的編輯為最後由 [[User:$1|$1]] 所修訂的版本",
+       "revertpage-nouser": "已還隱藏使用者的編輯為最後 {{GENDER:$1|[[User:$1|$1]]}} 修訂的版本",
+       "rollback-success": "已還原 $1 做的編輯;\n更變回最後由 $2 修訂的版本。",
        "sessionfailure-title": "登入資訊失敗",
        "sessionfailure": "似乎您的登錄會話有問題;\n為了防止會話劫持,這個操作已經被取消。\n請返回先前的頁面,重新載入該頁面,然後重試。",
        "protectlogpage": "保護日誌",
-       "protectlogtext": "ä¸\8bé\9d¢æ\98¯é \81é\9d¢ä¿\9dè­·ä¿®æ\94¹å\88\97表ã\80\82\nè«\8bå\8f\83è\80\83[[Special:ProtectedPages|ä¿\9dè­·é \81é\9d¢æ¸\85å\96®]]以檢è¦\96ç\9b®å\89\8dé\80²è¡\8cç\9a\84é \81é\9d¢ä¿\9dè­·。",
-       "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": "此頁不可被保護因沒有任何限制可用。",
+       "protectlogtext": "以ä¸\8bç\82ºè®\8aæ\9b´é \81é\9d¢ä¿\9dè­·ç\9a\84å\88\97表ã\80\82\nè«\8bå\8f\83è\80\83 [[Special:ProtectedPages|å\8f\97ä¿\9dè­·é \81é\9d¢å\88\97表]] æª¢è¦\96ç\9b®å\89\8då\8f\97ä¿\9dè­·é \81é\9d¢。",
+       "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": "終止時間已過去。",
+       "protectcomment": "原因:",
+       "protectexpiry": "期限:",
+       "protect_expiry_invalid": "無效的期限。",
+       "protect_expiry_old": "期限已結束。",
        "protect-unchain-permissions": "解除鎖定更多的保護選項",
-       "protect-text": "{{GENDER:|你|妳|你}}可以在這裡瀏覽和修改對頁面'''$1'''的保護級別。",
-       "protect-locked-blocked": "您不能在被查封時更改保護級別。\n以下是'''$1'''現時的保護級別:",
-       "protect-locked-dblock": "在資料庫鎖定時無法更改保護級別。\n以下是'''$1'''現時的保護級別:",
-       "protect-locked-access": "您的賬戶權限不能修改保護級別。\n以下是'''$1'''現時的保護級別:",
-       "protect-cascadeon": "以下$1個頁面包含着本頁面的同時,啟動了連鎖保護,因此本頁面目前也被保護。您可以設定本頁面的保護級別,但這並不會對連鎖保護有所影響。",
-       "protect-default": "容許æ\89\80æ\9c\89ç\94¨æ\88",
-       "protect-fallback": "僅允許有「$1」權限的用戶",
-       "protect-level-autoconfirmed": "僅允許自動確認使用者",
+       "protect-text": "您可以在此檢視與修改頁面 <strong>$1</strong> 的保護層級。",
+       "protect-locked-blocked": "頁面被封鎖,無法更改保護層級。\n以下為頁面 <strong>$1</strong> 目前的設定:",
+       "protect-locked-dblock": "資料庫被鎖定,無法更改保護層級。\n以下為頁面 <strong>$1</strong> 目前的設定:",
+       "protect-locked-access": "您的帳號沒有權限更改保護層級。\n以下為頁面 <strong>$1</strong> 目前的設定:",
+       "protect-cascadeon": "此頁面目前受保護,因頁面被下列啟動連鎖保護的 $1 個頁面引用。\n更改此頁面的保護層級不會影響連鎖保護的作用。",
+       "protect-default": "å\85\81許æ\89\80æ\9c\89使ç\94¨è\80\85",
+       "protect-fallback": "僅允許有 \"$1\" 權限的使用者",
+       "protect-level-autoconfirmed": "僅允許已自動確認的使用者",
        "protect-level-sysop": "僅允許管理員",
-       "protect-summary-desc": "[$1=$2]($3)",
+       "protect-summary-desc": "[$1=$2] ($3)",
        "protect-summary-cascade": "連鎖",
-       "protect-expiring": "終止於 $1 (UTC)",
-       "protect-expiring-local": "$1到期",
+       "protect-expiring": "期限至 $1 (UTC)",
+       "protect-expiring-local": "期限至 $1",
        "protect-expiry-indefinite": "無限期",
-       "protect-cascade": "保護本頁中包含的頁面 (連鎖保護)",
-       "protect-cantedit": "您無法更改這個頁面的保護等級,因為您沒有權限去編輯它。",
+       "protect-cascade": "保護本頁中包含的頁面 (連鎖保護)",
+       "protect-cantedit": "您沒有編輯權限,無法更改此頁面的保護層級。",
        "protect-othertime": "其它時間:",
        "protect-othertime-op": "其它時間",
-       "protect-existing-expiry": "現時到期之時間: $2 $3",
-       "protect-otherreason": "其它/附加的理由:",
+       "protect-existing-expiry": "已設定期限:$2 $3",
+       "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",
-       "restriction-type": "權限:",
-       "restriction-level": "限制級別:",
-       "minimum-size": "最小大小",
-       "maximum-size": "最大大小:",
-       "pagesize": "(位元組)",
+       "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",
+       "restriction-type": "權限",
+       "restriction-level": "限制層級:",
+       "minimum-size": "大小下限",
+       "maximum-size": "大小上限:",
+       "pagesize": "(位元組)",
        "restriction-edit": "編輯",
        "restriction-move": "移動",
        "restriction-create": "建立",
        "restriction-level-sysop": "全保護",
        "restriction-level-autoconfirmed": "半保護",
        "restriction-level-all": "任何級別",
-       "undelete": "æ\81¢å¾©è¢«å\88ª頁面",
+       "undelete": "檢è¦\96å·²å\88ªé\99¤ç\9a\84頁面",
        "undeletepage": "檢視與還原已刪除的頁面",
        "undeletepagetitle": "'''以下包含[[:$1]]的已刪除之修訂版本'''。",
        "viewdeletedpage": "檢視已刪除的頁面",
        "undelete-fieldset-title": "還原修訂",
        "undeleteextrahelp": "恢復整個頁面時,請清除所有複選框後按 '''''{{int:undeletebtn}}''''' 。\n恢復特定版本時,請選擇相應版本前的複選框後按'''''{{int:undeletebtn}}''''' 。\n按 '''''{{int:undeletereset}}''''' 將清除評論內容及所有複選框。",
        "undeleterevisions": "$1版本存檔",
-       "undeletehistory": "如果您恢復了該頁面,所有版本都會被恢復到修訂歷史中。\n如果本頁刪除後有一個同名的新頁面建立,被恢復的版本將會出現在先前的歷史中。",
+       "undeletehistory": "若您還原該頁面,所有的修訂歷史也會一併還原。\n若刪除之後已有使用相同名稱建立的新頁面,還原的修訂歷史會出現在此頁面之前的歷史中。",
        "undeleterevdel": "如果把最新修訂部份刪除,反刪除便無法進行。如果遇到這種情況,您必須反選或反隱藏最新已刪除的修訂。",
-       "undeletehistorynoadmin": "這個頁面已經被刪除,刪除原因顯示在下方編輯摘要中。被刪除前的所有修訂版本,連同刪除前貢獻用戶等等細節只有管理員可以看見。",
-       "undelete-revision": "$1由$3(在$4 $5)所編寫的已刪除修訂版本:",
+       "undeletehistorynoadmin": "此頁面已經被刪除。\n以下為刪除原因的摘要並包含刪除之前有那些使用者曾編輯此頁面。\n只有管理者可以檢視實際被刪除的修訂內容。",
+       "undelete-revision": "由 $3 刪除的 $1 (於 $4 $5) 修訂:",
        "undeleterevision-missing": "此版本的內容不正確或已經遺失。可能連結錯誤、被移除或已經被恢復。",
        "undelete-nodiff": "找不到先前的修訂版本。",
        "undeletebtn": "還原",
        "undeletelink": "檢視/還原",
        "undeleteviewlink": "檢視",
        "undeleteinvert": "反向選擇",
-       "undeletecomment": "理由:",
+       "undeletecomment": "原因:",
        "undeletedrevisions": "$1個修訂版本已經恢復",
        "undeletedrevisions-files": "$1 個版本和 $2 個檔案被恢復",
        "undeletedfiles": "$1 個檔案被恢復",
        "undelete-error-long": "當進行反刪除檔案時遇到錯誤:\n\n$1",
        "undelete-show-file-confirm": "確定要檢視在 $2 $3 ,\"<nowiki>$1</nowiki>\"的已刪除修訂版本嗎?",
        "undelete-show-file-submit": "是",
-       "namespace": "å\90\8då­\97空間:",
+       "namespace": "å\91½å\90\8d空間:",
        "invert": "反向選擇",
-       "tooltip-invert": "選中此複選框以隱藏選定命名空間內頁面更改(以及相關的命名空間,如果選中)",
-       "namespace_association": "關聯名字空間",
-       "tooltip-namespace_association": "選中此框可包括與選定名字空間相關的討論或主題命名空間",
-       "blanknamespace": "(主)",
-       "contributions": "{{GENDER:$1|用戶}}貢獻",
+       "tooltip-invert": "勾選此核選方塊以隱藏在已選擇命名空間中的頁面變更 (若有勾擇相關命名空間)",
+       "namespace_association": "相關命名空間",
+       "tooltip-namespace_association": "勾選此核選方塊以包含已選擇命名空間相關的對話或主題命名空間",
+       "blanknamespace": "(主要)",
+       "contributions": "{{GENDER:$1|使用者}}貢獻",
        "contributions-title": "$1 的使用者貢獻",
        "mycontris": "我的貢獻",
-       "contribsub2": "{{GENDER:$3|$1}} 的貢獻 ($2)",
-       "contributions-userdoesnotexist": "用戶賬戶「$1」未曾註冊。",
+       "contribsub2": "{{GENDER:$3|$1}} 的貢獻 ($2)",
+       "contributions-userdoesnotexist": "使用者帳號 \"$1\" 尚未註冊。",
        "nocontribs": "沒有找到符合特徵的更改。",
-       "uctop": "(最新修改)",
+       "uctop": "(目前)",
        "month": "截止月份:",
        "year": "截止年份:",
-       "sp-contributions-newbies": "å\8fªé¡¯ç¤ºæ\96°å»ºç«\8bä¹\8bç\94¨æ\88的貢獻",
+       "sp-contributions-newbies": "å\8fªé¡¯ç¤ºæ\96°å¸³è\99\9f的貢獻",
        "sp-contributions-newbies-sub": "新手",
-       "sp-contributions-newbies-title": "新手的用戶貢獻",
-       "sp-contributions-blocklog": "封記錄",
-       "sp-contributions-suppresslog": "已隱藏的用戶貢獻",
-       "sp-contributions-deleted": "已刪除的用戶貢獻",
+       "sp-contributions-newbies-title": "新帳號的使用者貢獻",
+       "sp-contributions-blocklog": "封記錄",
+       "sp-contributions-suppresslog": "已禁止顯示的使用者貢獻",
+       "sp-contributions-deleted": "已刪除的使用者貢獻",
        "sp-contributions-uploads": "上傳",
        "sp-contributions-logs": "日誌",
        "sp-contributions-talk": "對話",
-       "sp-contributions-userrights": "用戶權限管理",
-       "sp-contributions-blocked-notice": "這位用戶現時正在被封鎖中。\n最近的封鎖日誌項目在下面提供以便參考:",
-       "sp-contributions-blocked-notice-anon": "這個IP地址現時正在被封鎖中。\n最近的封鎖日誌項目在下面提供以便參考:",
+       "sp-contributions-userrights": "使用者權限管理",
+       "sp-contributions-blocked-notice": "此使用者目前已被封鎖。\n以下為最近的封鎖紀錄以供參考:",
+       "sp-contributions-blocked-notice-anon": "此 IP 位址目前已被封鎖。\n以下為最近的封鎖紀錄以供參考:",
        "sp-contributions-search": "搜尋貢獻記錄",
-       "sp-contributions-username": "IP位址或用戶名稱:",
+       "sp-contributions-username": "IP 位址或使用者名稱:",
        "sp-contributions-toponly": "只顯示最新修訂版本的編輯",
        "sp-contributions-newonly": "僅顯示建立頁面之編輯",
        "sp-contributions-submit": "搜尋",
        "whatlinkshere": "連入頁面",
-       "whatlinkshere-title": "連結到「$1」的頁面",
+       "whatlinkshere-title": "連結到 \"$1\" 的頁面",
        "whatlinkshere-page": "頁面:",
        "linkshere": "以下頁面連結到[[:$1]]:",
        "nolinkshere": "沒有頁面連結到[[:$1]]。",
-       "nolinkshere-ns": "å\9c¨æ\89\80é\81¸ç\9a\84å\90\8då­\97空é\96\93å\85§æ²\92æ\9c\89é \81é\9d¢é\80£çµ\90å\88°[[:$1]]。",
+       "nolinkshere-ns": "å·²é\81¸æ\93\87ç\9a\84å\91½å\90\8d空é\96\93中æ²\92æ\9c\89é \81é\9d¢é\80£çµ\90å\88° [[:$1]]。",
        "isredirect": "重新導向頁面",
-       "istemplate": "å\8c\85å\90«",
+       "istemplate": "å¼\95ç\94¨",
        "isimage": "檔案連結",
-       "whatlinkshere-prev": "前$1個",
-       "whatlinkshere-next": "後$1個",
+       "whatlinkshere-prev": "前 $1 筆",
+       "whatlinkshere-next": "後 $1 筆",
        "whatlinkshere-links": "← 連入",
-       "whatlinkshere-hideredirs": "$1重定向",
-       "whatlinkshere-hidetrans": "$1嵌入",
-       "whatlinkshere-hidelinks": "$1連結",
-       "whatlinkshere-hideimages": "$1檔案連結",
+       "whatlinkshere-hideredirs": "$1 重新導向頁面",
+       "whatlinkshere-hidetrans": "$1 引用",
+       "whatlinkshere-hidelinks": "$1 連結",
+       "whatlinkshere-hideimages": "$1 檔案連結",
        "whatlinkshere-filters": "搜尋",
        "autoblockid": "自動查封 #$1",
-       "block": "封使用者",
-       "unblock": "解使用者",
-       "blockip": "封使用者",
-       "blockip-legend": "封使用者",
-       "blockiptext": "用下面的表單來禁止來自某一特定IP地址的修改許可權。\n只有在為防止破壞,及符合[[{{MediaWiki:Policy-url}}|守則]]的情況下才可採取此行動。\n請在下面輸入一個具體的理由(例如引述一個被破壞的頁面)。",
-       "ipadressorusername": "IP地址或用戶名:",
+       "block": "封使用者",
+       "unblock": "解除封鎖使用者",
+       "blockip": "封使用者",
+       "blockip-legend": "封使用者",
+       "blockiptext": "填寫以下單據可封鎖特定 IP 位置或使用者名稱的存取權限。\n這個動作應用來避免破壞行為,可根據 [[{{MediaWiki:Policy-url}}|管理政策]]。\n請在下方填寫一個具體的原因 (例如:引述一段破壞頁面的事實)。",
+       "ipaddressorusername": "IP 位址或使用者名稱:",
        "ipbexpiry": "期限:",
        "ipbreason": "原因:",
-       "ipbreason-dropdown": "*一般的封禁理由\n** 屢次增加不實資料\n** 刪除頁面內容\n** 外部連結廣告\n** 在頁面中增加無意義文字\n** 無禮的行為、攻擊/騷擾別人\n** 濫用多個賬號\n** 不能接受的用戶名",
-       "ipb-hardblock": "é\98²æ­¢å·²ç\99»å\85¥ç\94¨æ\88¶å¾\9e該IPå\9c°å\9d\80編輯",
+       "ipbreason-dropdown": "*常見的封鎖原因\n** 填寫不實資訊\n** 刪除頁面內容\n** 散佈外部廣告連結\n** 在頁面填寫無意義文字\n** 無禮的行為、攻擊/騷擾別人\n** 濫用多個帳號\n** 使用不受歡迎的使用者名稱",
+       "ipb-hardblock": "é\81¿å\85\8d使ç\94¨æ­¤ IP ä½\8då\9d\80ç\99»å\85¥ç\9a\84使ç\94¨è\80\85編輯",
        "ipbcreateaccount": "阻止創建新賬號",
-       "ipbemailban": "é\98»æ­¢ç\94¨æ\88¶å\82³é\80\81é\9b»é\83µ",
-       "ipbenableautoblock": "自動查封此用戶最後所用的IP位址,以及後來試圖編輯所用的所有位址",
+       "ipbemailban": "é\81¿å\85\8d使ç\94¨è\80\85ç\99¼é\80\81é\9b»å­\90é\83µä»¶",
+       "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",
-       "ipbhidename": "在編輯及列表中隱藏用戶名",
-       "ipbwatchuser": "監視這位用戶的用戶頁面以及其對話頁面",
-       "ipb-disableusertalk": "禁止被封禁用戶編輯自己的討論頁",
-       "ipb-change-block": "利用這些設定重新封鎖用戶",
-       "ipb-confirm": "確認封",
+       "ipbhidename": "在編輯及清單中隱藏使用者名稱",
+       "ipbwatchuser": "監視這位使用者的使用者頁面以及其對話頁面",
+       "ipb-disableusertalk": "避免在封鎖此使用者的期間編輯自己的對話頁面",
+       "ipb-change-block": "使用現有設定重新封鎖使用者",
+       "ipb-confirm": "確認封",
        "badipaddress": "無效IP地址",
-       "blockipsuccesssub": "查封成功",
-       "blockipsuccesstext": "[[Special:Contributions/$1|$1]]已經被查封。<br />\n參看[[Special:BlockList|被封IP地址列表]]以覆審查封。",
-       "ipb-blockingself": "你要封禁自己!確認要這樣做嗎?",
-       "ipb-confirmhideuser": "你要封禁用戶並隱藏其用戶名,這會隱藏在所有列表及日誌中涉及此用戶之用戶名。你確定要這樣做嗎?",
+       "blockipsuccesssub": "封鎖成功",
+       "blockipsuccesstext": "[[Special:Contributions/$1|$1]] 已經被封鎖。<br />\n請參考 [[Special:BlockList|封鎖清單]] 以檢查目前的封鎖。",
+       "ipb-blockingself": "您要封鎖自己!您確定要這樣做嗎?",
+       "ipb-confirmhideuser": "您要封鎖一位使用者並且 \"隱藏\" 該使用者,這會禁止顯示所有出現在清單及記錄中的使用者名稱。\n你確定要這樣做?",
        "ipb-confirmaction": "如果您確信這樣做,請檢查底部的「{{int:ipb-confirm}}」部分。",
-       "ipb-edit-dropdown": "編輯查封原因",
-       "ipb-unblock-addr": "解$1",
-       "ipb-unblock": "解除禁封用戶名或IP地址",
-       "ipb-blocklist": "檢è¦\96ç\8f¾æ\9c\89ç\9a\84å°\81ç¦\81",
+       "ipb-edit-dropdown": "編輯封鎖原因",
+       "ipb-unblock-addr": "解除封鎖 $1",
+       "ipb-unblock": "解除封鎖使用者名稱或 IP 位址",
+       "ipb-blocklist": "檢è¦\96ç\9b®å\89\8dç\9a\84å°\81é\8e\96",
        "ipb-blocklist-contribs": "$1的貢獻",
-       "unblockip": "解封用戶",
-       "unblockiptext": "用下面的表單來恢復先前被查封的IP位址或用戶的寫權限。",
+       "unblockip": "解除封鎖使用者",
+       "unblockiptext": "填寫以下單據以取消先前封鎖的 IP 位址或使用者名稱。",
        "ipusubmit": "移除這個封鎖",
-       "unblocked": "[[User:$1|$1]] 的封已經解除。",
+       "unblocked": "[[User:$1|$1]] 的封已經解除。",
        "unblocked-range": "$1已被解封",
-       "unblocked-id": "å°\81ç¦\81 $1 å·²ç¶\93被移é\99¤",
-       "blocklist": "å°\81ç¦\81ç\94¨æ\88",
-       "ipblocklist": "被封用戶列表",
-       "ipblocklist-legend": "搜尋一位已經被查封的用戶",
-       "blocklist-userblocks": "隱藏用戶封禁",
-       "blocklist-tempblocks": "隱藏臨時封禁",
-       "blocklist-addressblocks": "隱藏單一IP封禁",
-       "blocklist-rangeblocks": "隱藏IP段封禁",
-       "blocklist-timestamp": "時間",
+       "unblocked-id": "å·²ç¶\93移é\99¤ $1 ç\9a\84å°\81é\8e\96ã\80\82",
+       "blocklist": "å·²å°\81é\8e\96ç\9a\84使ç\94¨è\80\85",
+       "ipblocklist": "已封鎖的使用者",
+       "ipblocklist-legend": "搜尋已封鎖的使用者",
+       "blocklist-userblocks": "隱藏帳號封鎖",
+       "blocklist-tempblocks": "隱藏暫時封鎖",
+       "blocklist-addressblocks": "隱藏單一 IP 封鎖",
+       "blocklist-rangeblocks": "隱藏 IP 範圍封鎖",
+       "blocklist-timestamp": "æ\97¥æ\9c\9fæ\99\82é\96\93",
        "blocklist-target": "目標",
-       "blocklist-expiry": "過期",
-       "blocklist-by": "封管理員",
-       "blocklist-params": "封參數",
+       "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": "ç¦\81止編輯è\87ªå·±ç\9a\84ç\94¨æ\88¶è¨\8eè«\96é \81",
-       "ipblocklist-empty": "查封列表為空。",
-       "ipblocklist-no-results": "æ\89\80è¦\81æ±\82ç\9a\84IPå\9c°å\9d\80\94¨æ\88¶å\90\8dæ²\92æ\9c\89被æ\9f¥å°\81。",
+       "anononlyblock": "限匿名使用者",
+       "noautoblockblock": "停用自動封鎖",
+       "createaccountblock": "停用帳號建立",
+       "emailblock": "停用電子郵件",
+       "blocklist-nousertalk": "ç\84¡æ³\95編輯è\87ªå·±ç\9a\84å°\8d話é \81é\9d¢",
+       "ipblocklist-empty": "封鎖清單無任何資訊。",
+       "ipblocklist-no-results": "æ\8c\87å®\9aç\9a\84 IP ä½\8då\9d\80æ\88\96使ç\94¨è\80\85å\90\8d稱å°\9aæ\9cªè¢«å°\81é\8e\96。",
        "blocklink": "查封",
-       "unblocklink": "解除封",
-       "change-blocklink": "變更封",
+       "unblocklink": "解除封",
+       "change-blocklink": "變更封",
        "contribslink": "貢獻",
-       "emaillink": "傳送電郵",
-       "autoblocker": "因為您與「[[User:$1|$1]]」共享同一IP位址而被自動封禁。\n$1被封禁的理由是「$2」",
+       "emaillink": "發送電子郵件",
+       "autoblocker": "您的 IP 位址因最近被 [[User:$1|$1]] 使用過而被自動封鎖。\n封鎖 $1 的原因為 \"$2\"",
        "blocklogpage": "查封日誌",
-       "blocklog-showlog": "這位用戶曾經被封鎖過。在下列提供封鎖記錄以便參考:",
-       "blocklog-showsuppresslog": "這位用戶曾經被封鎖和隱藏過。在下列提供廢止記錄以便參考:",
-       "blocklogentry": "å°\81ç¦\81[[$1]]ï¼\8cå\88°æ\9c\9fæ\99\82é\96\93ç\88²$2$3",
-       "reblock-logentry": "更改[[$1]]的封禁設置,到期時間爲$2$3",
-       "blocklogtext": "這是關於用戶封禁和解除封禁操作的記錄。被自動封禁的IP地址沒有被列出。請參閱[[Special:BlockList|被查封的IP地址和用戶列表]]。",
+       "blocklog-showlog": "此使用者先前被封鎖過。\n以下為封鎖紀錄以供參考:",
+       "blocklog-showsuppresslog": "此使用者先前被封鎖並且隱藏過。\n以下為禁止顯示紀錄以供參考:",
+       "blocklogentry": "å·²å°\81é\8e\96 [[$1]] ç\9a\84æ\9c\9fé\99\90è\87³ $2 $3",
+       "reblock-logentry": "更改 [[$1]] 的封鎖期限至 $2 $3",
+       "blocklogtext": "此為使用者的封鎖及取消封鎖記錄。\n不包自動封鎖的 IP 位址。\n請參考 [[Special:BlockList|封鎖清單]] 以查看目前的封鎖。",
        "unblocklogentry": "已解封 $1",
-       "block-log-flags-anononly": "僅限匿名用戶",
-       "block-log-flags-nocreate": "建ç«\8b帳è\99\9få·²ç¦\81ç\94¨",
-       "block-log-flags-noautoblock": "停用自動封",
-       "block-log-flags-noemail": "禁止電子郵件",
-       "block-log-flags-nousertalk": "ç¦\81止編輯è\87ªå·±ç\9a\84ç\94¨æ\88¶è¨\8eè«\96é \81",
+       "block-log-flags-anononly": "僅限匿名使用者",
+       "block-log-flags-nocreate": "å\81\9cç\94¨å¸³è\99\9f建ç«\8b",
+       "block-log-flags-noautoblock": "停用自動封",
+       "block-log-flags-noemail": "停用電子郵件",
+       "block-log-flags-nousertalk": "ç\84¡æ³\95編輯è\87ªå·±ç\9a\84å°\8d話é \81é\9d¢",
        "block-log-flags-angry-autoblock": "加強自動封鎖已啟用",
-       "block-log-flags-hiddenname": "隱藏用戶名稱",
-       "range_block_disabled": "只有管理員才能創建禁止查封的範圍。",
+       "block-log-flags-hiddenname": "隱藏使用者名稱",
+       "range_block_disabled": "管理員可建立範圍封鎖的權限以被關閉。",
        "ipb_expiry_invalid": "無效的終止時間。",
-       "ipb_expiry_temp": "隱藏用戶名封鎖必須是永久性的。",
-       "ipb_hide_invalid": "不能抑制此賬戶;它擁有多於$1次編輯。",
-       "ipb_already_blocked": "已經封鎖「$1」",
+       "ipb_expiry_temp": "隱藏使用者名稱的封鎖不可設定期限。",
+       "ipb_hide_invalid": "無法禁止顯示此帳號;它擁有超過 $1 次的編輯。",
+       "ipb_already_blocked": "已經封鎖 \"$1\"。",
        "ipb-needreblock": "$1已經被封鎖。您是否想更改這個設定?",
        "ipb-otherblocks-header": "其他{{PLURAL:$1|封鎖}}",
-       "unblock-hideuser": "由於其用戶名已隱藏,你無法解封這個用戶。",
-       "ipb_cant_unblock": "錯誤: 找不到查封ID$1。可能已經解除封禁。",
-       "ipb_blocked_as_range": "錯誤: 該IP $1 無直接查封,不可以解除封禁。但是它是在 $2 的查封範圍之內,該段範圍是可以解除封禁的。",
+       "unblock-hideuser": "由於此使用者名稱已被設為隱藏,您無法解除封鎖這個使用者。",
+       "ipb_cant_unblock": "錯誤:查無封鎖 ID $1,可能已被解除封鎖。",
+       "ipb_blocked_as_range": "錯誤:IP 位址 $1 並不是直接被封鎖,因此無法直接解除封鎖。\n此 IP 位址在 $2 的封鎖範圍之中,您可以解決此範圍的封鎖。",
        "ip_range_invalid": "無效的IP範圍。",
-       "ip_range_toolarge": "大於 /$1 的封鎖範圍是不容許的。",
+       "ip_range_toolarge": "不允許封鎖範圍大於 /$1。",
        "proxyblocker": "代理封鎖器",
-       "proxyblockreason": "您的IP位址是一個開放的代理,它已經被封鎖。請聯繫您的網際網路服務提供商或技術支援者並告知告知他們該嚴重的安全問題。",
+       "proxyblockreason": "因您的 IP 位址是開放代理伺服器,已被封鎖。\n請聯繫您的網路服務供應商或您所在組織的技術支援,告知他們此嚴重的安全性問題。",
        "sorbsreason": "您的IP位址在{{SITENAME}}中被 DNSBL列為屬於開放代理服務器。",
-       "sorbs_create_account_reason": "由於您的IP位址在{{SITENAME}}中被 DNSBL列為屬於開放代理服務器,所以您無法建立賬號。",
-       "xffblockreason": "您或您使用的代理伺服器X-Forwarded-For字段所包含的一個IP地址已被封禁。原始封禁理由:$1",
-       "cant-see-hidden-user": "您現正嘗試封鎖的用戶已經被封鎖或隱藏。\n您現在沒有隱藏用戶的權限,您不可以檢視或者編輯這位用戶的封鎖。",
-       "ipbblocked": "您無法封禁或解封其他用戶,因為您自己已被封禁",
-       "ipbnounblockself": "您不容許自我解除封禁",
+       "sorbs_create_account_reason": "您連線到 {{SITENAME}} 的 IP 位址被 DNSBL 列為開放代理伺服。\n您不能建立帳號。",
+       "xffblockreason": "您的 IP 位址使用 X-Forwarded-For 標頭,您或您使用的代理伺服器已被封鎖。\n封鎖的原因為:$1",
+       "cant-see-hidden-user": "您欲封鎖的使用者已經被封鎖並且隱藏。\n您沒有隱藏使用者的權限,您無法檢視或編輯該使用者的封鎖狀態。",
+       "ipbblocked": "因您已被封鎖,故無法封鎖或解除封鎖其他使用者。",
+       "ipbnounblockself": "不允許解除封鎖自己。",
        "lockdb": "禁止更改資料庫",
        "unlockdb": "開放更改資料庫",
-       "lockdbtext": "鎖住資料庫將禁止所有用戶進行編輯頁面、更改參數、編輯監視列表以及其他需要更改資料庫的操作。\n請確認您的決定,並且保證您在維護工作結束後會重新開放資料庫。",
-       "unlockdbtext": "é\96\8bæ\94¾è³\87æ\96\99庫å°\87æ\9c\83æ\81¢å¾©æ\89\80æ\9c\89ç\94¨æ\88¶é\80²è¡\8c編輯é \81é\9d¢ã\80\81ä¿®æ\94¹å\8f\83æ\95¸ã\80\81編輯ç\9b£è¦\96å\88\97表以å\8f\8aå\85¶ä»\96é\9c\80è¦\81æ\9b´æ\94¹è³\87æ\96\99庫ç\9a\84æ\93\8dä½\9cã\80\82\nè«\8b確èª\8dæ\82¨ç\9a\84決å®\9aã\80\82",
+       "lockdbtext": "鎖定資料庫將會中止所有使用者編輯頁面、更改偏好設定、編輯監視清單與其他需要更動到資料庫的操作。\n請確認您是否要這樣做,並在維護作業結束時解除資料庫的鎖定。",
+       "unlockdbtext": "å\8f\96æ¶\88é\8e\96å®\9aè³\87æ\96\99庫æ\9c\83æ\81¢å¾©æ\89\80æ\9c\89使ç\94¨è\80\85編輯é \81é\9d¢ã\80\81æ\9b´æ\94¹å\81\8f好設å®\9aã\80\81編輯ç\9b£è¦\96æ¸\85å\96®è\88\87å\85¶ä»\96é\9c\80è¦\81æ\9b´å\8b\95å\88°è³\87æ\96\99庫ç\9a\84æ\93\8dä½\9cã\80\82\nè«\8b確èª\8dæ\82¨æ\98¯å\90¦è¦\81é\80\99樣å\81\9aã\80\82",
        "lockconfirm": "是的,我確實想要封鎖資料庫。",
        "unlockconfirm": "是的,我確實想要開放資料庫。",
        "lockbtn": "資料庫上鎖",
        "lockedbyandtime": "在$2的$3由$1",
        "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'''警告!'''\n對一個經常被訪問的頁面而言這可能是一個重大與唐突的更改;\n請在行動前先確定您了解其所可能帶來的後果。",
-       "movepagetalktext": "有關的對話頁(如果有的話)將被自動與該頁面一起移動,'''除非''':\n*您將頁面移動到不同的名字空間;\n*新頁面已經有一個包含內容的對話頁,或者\n*您不勾選下面的覆選框。\n\n在這些情況下,您在必要時必須手工移動或合併頁面。",
+       "movepagetext": "使用以下表單來重新命名一個頁面的名稱,並將所有頁面的歷史記錄一併移至新的頁面,\n舊標題的頁面將會變成重新導向頁面,導向至使用新標題的頁面。\n您可以選擇自動更新將所有導向至舊頁面的重新導向頁面改導向到新的頁面,\n若您選擇不使用自動更新,請記得檢查 [[Special:DoubleRedirects|雙重的重新導向頁面]] 或 [[Special:BrokenRedirects|損壞的重新導向頁面]],\n您有責任讓連結維持有效並且能夠繼續連結到正確的新頁面。\n\n請注意,若新的頁面名稱已經被使用,則此頁面將<strong>不會</strong>被移動,除非新名稱存在的是重新導向頁面且沒有任何的編修記錄。\n這個意思指的是,您可將因失誤而移動至其他名稱的頁面復原為舊的名稱,並且您不可以覆蓋任何已存在的頁面。\n\n<strong>警告!</strong>\n這個動作對受歡迎的頁面可能是一個重大與唐突的更改;\n請在行動前確認您已了解可能帶來後果。",
+       "movepagetext-noredirectfixer": "使用以下表單來重新命名一個頁面的名稱,並將所有頁面的歷史記錄一併移至新的頁面,\n舊標題的頁面將會變成重新導向頁面,導向至使用新標題的頁面。\n請記得檢查 [[Special:DoubleRedirects|雙重導向頁面]] 或 [[Special:BrokenRedirects|中斷的導向頁面]],\n您有責任讓連結維持有效並且能夠繼續連結到正確的新頁面。\n\n請注意,若新的頁面名稱已經被使用,則此頁面將<strong>不會</strong>被移動,除非新名稱存在的是重新導向頁面且沒有任何的編修記錄。\n這個意思指的是,您可將因失誤而移動至其他名稱的頁面復原為舊的名稱,並且您不可以覆蓋任何已存在的頁面。\n\n<strong>警告!</strong>\n這個動作對受歡迎的頁面可能是一個重大與唐突的更改;\n請在行動前確認您已了解可能帶來後果。",
+       "movepagetalktext": "相關的的對話頁面 (如果有的話) 會自動與該頁面一起移動,<strong>除非:</strong>\n*新的名稱已有一個存在的對話頁面,或\n*您未勾選此核選方塊。\n\n在上述情況下,若有必要您必須手動移動或合併已存在的頁面。",
        "movearticle": "移動頁面:",
-       "moveuserpage-warning": "'''警告:'''您將會移動一個用戶頁面。請留意該頁面在移動後該用戶的名字是''不會''變更的。",
-       "movenologintext": "您必須是一名登記用戶並且[[Special:UserLogin|登入]]\n後才可移動一個頁面。",
-       "movenotallowed": "您並沒有許可權去移動頁面。",
-       "movenotallowedfile": "您並沒有許可權去移動檔案。",
-       "cant-move-user-page": "您並沒有許可權去移動用戶頁面(它的子頁面除外)。",
-       "cant-move-to-user-page": "您並沒有許可權去移動到用戶頁面(它的子頁面除外)。",
-       "newtitle": "新標題:",
-       "move-watch": "監視來源以及目標頁",
+       "moveuserpage-warning": "<strong>警告:</strong> 您正要移動使用者頁面,請注意只有使用者頁面會變更名稱,並<em>不會</em>重新命名使用者。",
+       "movecategorypage-warning": "<strong>警告:</strong>您將要移動分類頁面。請注意此操作只頁面,舊分類中的頁面將<em>不會</em>移動到新的分類。",
+       "movenologintext": "您必須是已註冊的使用者並且 [[Special:UserLogin|登入]] 才可移動頁面。",
+       "movenotallowed": "您沒有權限移動頁面。",
+       "movenotallowedfile": "您沒有權限移動檔案。",
+       "cant-move-user-page": "您沒有權限移動使用者頁面 (除使用者子頁面外)。",
+       "cant-move-to-user-page": "您沒有權限移動頁面至使用者頁面 (除使用者子頁面外)。",
+       "cant-move-category-page": "您沒有權限移動分類頁面。",
+       "cant-move-to-category-page": "您沒有權限移動頁面至分類頁面。",
+       "newtitle": "新標題:",
+       "move-watch": "監視來源以及目標頁面",
        "movepagebtn": "移動頁面",
        "pagemovedsub": "移動成功",
-       "movepage-moved": "'''「$1」已經移動到「$2」'''",
-       "movepage-moved-redirect": "一個重新定向已經被創建。",
-       "movepage-moved-noredirect": "å·²ç\93å£\93å\88¶å\89µå»ºé\87\8dæ\96°å®\9aå\90\91。",
+       "movepage-moved": "<strong>已移動 \"$1\" 至 \"$2\"</strong>",
+       "movepage-moved-redirect": "已建立重新導向頁面。",
+       "movepage-moved-noredirect": "å·²ç¦\81止建ç«\8bé\87\8dæ\96°å°\8eå\90\91é \81é\9d¢。",
        "articleexists": "該名字的頁面已經存在,或者您選擇的名字無效。請再選一個名字。",
        "cantmove-titleprotected": "您不可以移動這個頁面到這個位置,因為該新標題已經被保護以防止建立。",
-       "movetalk": "移動關聯的對話頁",
-       "move-subpages": "移動子頁面(上至$1頁)",
-       "move-talk-subpages": "移å\8b\95å­\90å°\8d話é \81é\9d¢ï¼\88ä¸\8aè\87³$1é \81ï¼\89",
+       "movetalk": "移動相關的對話頁面",
+       "move-subpages": "移動子頁面 (共 $1 頁)",
+       "move-talk-subpages": "移å\8b\95å°\8d話é \81é\9d¢ç\9a\84å­\90é \81é\9d¢ (å\85± $1 é \81)",
        "movepage-page-exists": "頁面 $1 已經存在,不可以自動地覆寫。",
        "movepage-page-moved": "頁面 $1 已經移動到 $2。",
        "movepage-page-unmoved": "頁面 $1 不可以移動到 $2。",
        "movesubpagetext": "這個頁面有$1個子頁面列示如下。",
        "movenosubpage": "這個頁面沒有子頁面。",
        "movereason": "原因",
-       "revertmove": "恢復該移動",
+       "revertmove": "還原",
        "delete_and_move": "刪除並移動",
        "delete_and_move_text": "==需要刪除==\n\n目標頁面\"[[:$1]]\"已經存在。{{GENDER:|你|妳|你}}確認需要刪除原頁面並以進行移動嗎?",
        "delete_and_move_confirm": "是的,刪除此頁面",
        "delete_and_move_reason": "刪除以便移動[[$1]]",
        "selfmove": "原始標題與目標標題相同,您不能移動一頁覆蓋本身。",
-       "immobile-source-namespace": "不可以在空間名「$1」上移動頁面",
+       "immobile-source-namespace": "無法移動在命名空間 \"$1\" 中的頁面",
        "immobile-target-namespace": "不可以將頁面移動到「$1」空間名中",
-       "immobile-target-namespace-iw": "垮維基連結在移動頁面中是無效的目標。",
+       "immobile-target-namespace-iw": "Interwiki 連結在移動頁面中是無效的目標。",
        "immobile-source-page": "這個頁面不能移動。",
        "immobile-target-page": "無法移動至目標標題中。",
        "bad-target-model": "所需的目的地使用不同的內容模式。不可以從$1轉換到 $2 。",
-       "imagenocrossnamespace": "ä¸\8då\8f¯ä»¥ç§»å\8b\95æª\94æ¡\88å\88°é\9d\9eæª\94æ¡\88å\90\8då­\97空間",
-       "nonfile-cannot-move-to-file": "ä¸\8då\8f¯ä»¥ç§»å\8b\95é\9d\9eæª\94æ¡\88å\88°æª\94æ¡\88å\90\8då­\97空間",
+       "imagenocrossnamespace": "ä¸\8då\8f¯ä»¥ç§»å\8b\95æª\94æ¡\88å\88°é\9d\9eæª\94æ¡\88å\91½å\90\8d空間",
+       "nonfile-cannot-move-to-file": "ä¸\8då\8f¯ä»¥ç§»å\8b\95é\9d\9eæª\94æ¡\88å\88°æª\94æ¡\88å\91½å\90\8d空間",
        "imagetypemismatch": "該新副檔名不匹配它的類型",
        "imageinvalidfilename": "目標檔案名稱是無效的",
-       "fix-double-redirects": "更新指到原先標題的任何重新定向",
+       "fix-double-redirects": "更新導向到原標題的任何重新導向頁面",
        "move-leave-redirect": "留下重新定向",
-       "protectedpagemovewarning": "'''警告:'''這個頁面已經被保護,只有擁有管理員權限的用戶才可以移動它。\n最近的日誌在下面提供以便參考:",
-       "semiprotectedpagemovewarning": "'''注意:'''這個頁面已經被保護,只有已經註冊的用戶才可以移動它。\n最近的日誌在下面提供以便參考:",
+       "protectedpagemovewarning": "<strong>警告:</strong>本頁已經被保護,只有擁有管理員權限的使用者才可移動。\n以下提供最近的日誌以便參考:",
+       "semiprotectedpagemovewarning": "<strong>注意:</strong>本頁已經被保護,只有已註冊的使用者才可移動。\n以下提供最近的日誌以便參考:",
        "move-over-sharedrepo": "== 檔案已存在 ==\n[[:$1]]已於共享資源存在,將檔案移動到此標題會覆蓋共享資源中的檔案。",
        "file-exists-sharedrepo": "同名檔案已於共享資源存在。\n請選擇另一個檔案名。",
        "export": "匯出頁面",
        "export-submit": "匯出",
        "export-addcattext": "由分類中加入頁面:",
        "export-addcat": "新增",
-       "export-addnstext": "ç\94±å\90\8då­\97空é\96\93中加入頁面:",
+       "export-addnstext": "ç\94±å\91½å\90\8d空é\96\93加入頁面:",
        "export-addns": "新增",
        "export-download": "另存為檔案",
-       "export-templates": "å\8c\85å\90«æ¨¡æ\9d¿",
+       "export-templates": "å\8c\85å\90«æ¨£ç\89\88",
        "export-pagelinks": "包含到這個深度連結之頁面:",
        "allmessages": "系統界面",
        "allmessagesname": "名稱",
        "allmessagesdefault": "預設的訊息文字",
        "allmessagescurrent": "現時的訊息文字",
-       "allmessagestext": "這裡列出所有可定製的系統界面。\n如果想貢獻正宗的MediaWiki本地化的話,請參閱[https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki本地化]以及[//translatewiki.net translatewiki.net]。",
+       "allmessagestext": "此處列出所有在 MediaWiki 命名空間中系統訊息。\n若您想參與官方的 MediaWiki 在地化,請參考 [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki 在地化] 與 [//translatewiki.net translatewiki.net]。",
        "allmessagesnotsupportedDB": "這個頁面無法使用,因為'''$wgUseDatabaseMessages'''已被設定關閉。",
        "allmessages-filter-legend": "搜尋",
        "allmessages-filter": "以自定狀況過濾:",
        "allmessages-filter-unmodified": "未修改",
-       "allmessages-filter-all": "所有",
+       "allmessages-filter-all": "全部",
        "allmessages-filter-modified": "曾修改",
-       "allmessages-prefix": "以å\89\8d綴é\81\8e濾:",
+       "allmessages-prefix": "以å­\97é¦\96æ\90\9cå°\8b:",
        "allmessages-language": "語言:",
-       "allmessages-filter-submit": "å¾\80",
+       "allmessages-filter-submit": "å\9f·è¡\8c",
        "allmessages-filter-translate": "翻譯",
        "thumbnail-more": "放大",
        "filemissing": "無法找到檔案",
-       "thumbnail_error": "å\89µå»º縮圖錯誤: $1",
+       "thumbnail_error": "建ç«\8b縮圖錯誤: $1",
        "thumbnail_error_remote": "$1發出的電子郵件:\n$2",
        "djvu_page_error": "DjVu頁面超出範圍",
        "djvu_no_xml": "無法在DjVu檔案中擷取XML",
-       "thumbnail-temp-create": "ç\84¡æ³\95å\89µå»ºè\87¨æ\99\82縮ç\95¥å\9c\96æ\96\87件",
+       "thumbnail-temp-create": "ç\84¡æ³\95建ç«\8bè\87¨æ\99\82縮å\9c\96æª\94æ¡\88",
        "thumbnail-dest-create": "無法將縮略圖保存到目標地點",
        "thumbnail_invalid_params": "不正確的縮圖參數",
        "thumbnail_dest_directory": "無法建立目標目錄",
        "import-interwiki-text": "選擇一個 wiki 和頁面標題以進行匯入。\n修訂日期和編輯者名字將同時被儲存。\n所有的跨 wiki 匯入操作被記錄在[[Special:Log/import|匯入日誌]]。",
        "import-interwiki-source": "來源維基/頁面:",
        "import-interwiki-history": "複製此頁的所有歷史修訂版本",
-       "import-interwiki-templates": "å\8c\85å\90«æ\89\80æ\9c\89模æ\9d¿",
+       "import-interwiki-templates": "å\8c\85å\90«æ\89\80æ\9c\89樣ç\89\88",
        "import-interwiki-submit": "匯入",
-       "import-interwiki-namespace": "目的名字空間:",
+       "import-interwiki-namespace": "目標命名空間:",
        "import-interwiki-rootpage": "目標根頁(可選):",
        "import-upload-filename": "檔案名稱:",
        "import-comment": "註解:",
        "importfailed": "匯入失敗: <nowiki>$1</nowiki>",
        "importunknownsource": "未知的源匯入類型",
        "importcantopen": "無法打開匯入檔案",
-       "importbadinterwiki": "損壞的內部 wiki 連結",
+       "importbadinterwiki": "損壞的 Interwiki 連結",
        "importsuccess": "匯入完成!",
        "importnosources": "跨Wiki匯入源沒有定義,同時不允許直接的歷史上傳。",
        "importnofile": "沒有上傳匯入檔案。",
        "import-parse-failure": "XML匯入語法失敗",
        "import-noarticle": "沒有頁面作匯入!",
        "import-nonewrevisions": "並無修訂導入(全數已存在,或出錯而跳過)。",
-       "xml-error-string": "$1 於行$2,欄$3 ($4位元組): $5",
+       "xml-error-string": "$1 於行 $2,欄 $3 ($4 位元組):$5",
        "import-upload": "上傳XML資料",
        "import-token-mismatch": "小節資料遺失。請再嘗試。",
        "import-invalid-interwiki": "不能在指定的wiki匯入。",
        "import-error-edit": "「$1」無法導入,因為您不准編輯它。",
-       "import-error-create": "「$1」無法導入,因為您不准創造它。",
-       "import-error-interwiki": "頁面\"$1\"未能導入,這是因為他的頁面名稱預留了供跨維基連結使用。",
-       "import-error-special": "「$1」未能導入因為該頁面使用一個不能創建頁面的特殊名字空間。",
+       "import-error-create": "您沒有建立頁面的權限,無法匯入頁面 \"$1\"。",
+       "import-error-interwiki": "頁面\"$1\"未能導入,這是因為他的頁面名稱預留了供跨維基連結( Interwiki)使用。",
+       "import-error-special": "無法匯入頁面 \"$1\",匯入的頁面屬於不允許頁面的特殊命名空間。",
        "import-error-invalid": "「$1」不能導入,因為名字無效。",
        "import-error-unserialize": "頁面「$1」的修訂版本「$2」不能反序列。該修訂版本是以$3內容模式序列為$4。",
        "import-error-bad-location": "於此wiki使用的內容模式$3的修訂版本$2並無可能存儲為「$1」,這是因為此種模式於該頁面無法支援。",
        "import-options-wrong": "{{PLURAL:$2|選項}}出錯:<nowiki>$1</nowiki>",
        "import-rootpage-invalid": "指定的根頁標題無效。",
-       "import-rootpage-nosubpage": "å\90\8då­\97空é\96\93ã\80\8c$1ã\80\8d的根頁面不允許子頁面。",
+       "import-rootpage-nosubpage": "å\91½å\90\8d空é\96\93 \"$1\" 的根頁面不允許子頁面。",
        "importlogpage": "匯入日誌",
        "importlogpagetext": "來自其它 wiki 的行政性的帶編輯歷史匯入頁面。",
-       "import-logentry-upload": "透過檔案上傳匯入$1",
-       "import-logentry-upload-detail": "$1個修訂",
-       "import-logentry-interwiki": "跨wiki$1",
-       "import-logentry-interwiki-detail": "來自$2的$1個修訂",
-       "javascripttest": "JavaScript測試",
-       "javascripttest-title": "運行$1測試。",
-       "javascripttest-pagetext-noframework": "這個頁面預留了作JavaScript測試。",
-       "javascripttest-pagetext-unknownframework": "未知的測試框架「$1」。",
-       "javascripttest-pagetext-frameworks": "è«\8bé\81¸æ\93\87以ä¸\8bå\85¶ä¸­ä¸\80å\80\8b測試æ¡\86æ\9e:$1",
-       "javascripttest-pagetext-skins": "選擇行測試的外觀:",
-       "javascripttest-qunit-intro": "請看mediawiki.org的[$1 測試說明]",
-       "javascripttest-qunit-heading": "MediaWiki JavaScript QUnit æ¸¬è©¦å¥\97件",
+       "import-logentry-upload": "透過檔案上傳匯入 $1",
+       "import-logentry-upload-detail": "$1 個修訂",
+       "import-logentry-interwiki": "跨 Wiki $1",
+       "import-logentry-interwiki-detail": "來自 $2 的 $1 個修訂",
+       "javascripttest": "JavaScript 測試",
+       "javascripttest-title": "執行 $1 測試。",
+       "javascripttest-pagetext-noframework": "此頁面保留用來作為 JavaScript 測試使用。",
+       "javascripttest-pagetext-unknownframework": "不明的測試 Framework \"$1\"。",
+       "javascripttest-pagetext-frameworks": "è«\8bé\81¸æ\93\87ä¸\8bå\88\97ä¸\80種測試 Framework:$1",
+       "javascripttest-pagetext-skins": "選擇行測試的外觀:",
+       "javascripttest-qunit-intro": "請參考 mediawiki.org 的 [$1 測試說明文件]。",
+       "javascripttest-qunit-heading": "MediaWiki JavaScript QUnit æ¸¬è©¦å·¥å\85·",
        "tooltip-pt-userpage": "您的使用者頁面",
-       "tooltip-pt-anonuserpage": "您編輯本站所用IP的對應用戶頁",
-       "tooltip-pt-mytalk": "您的對話頁",
+       "tooltip-pt-anonuserpage": "您編輯使用的 IP 位址所對應的使用者頁面",
+       "tooltip-pt-mytalk": "您的對話頁",
        "tooltip-pt-anontalk": "對於來自此IP地址編輯的對話",
        "tooltip-pt-preferences": "您的偏好設定",
        "tooltip-pt-watchlist": "您所監視頁面的變更列表",
        "tooltip-pt-mycontris": "您的貢獻列表",
-       "tooltip-pt-login": "建議您登入,儘管並非必須。",
+       "tooltip-pt-login": "雖可不登入,但仍建議您登入。",
        "tooltip-pt-logout": "登出",
        "tooltip-ca-talk": "關於頁面正文的討論",
        "tooltip-ca-edit": "您可以編輯此頁,請在儲存之前先預覽一下。",
-       "tooltip-ca-addsection": "開始一個新節",
+       "tooltip-ca-addsection": "開始一個新節",
        "tooltip-ca-viewsource": "該頁面已被保護。您可以檢視該頁原始碼",
        "tooltip-ca-history": "本頁面的早前修訂版本",
        "tooltip-ca-protect": "保護這個頁面",
        "tooltip-p-logo": "訪問首頁",
        "tooltip-n-mainpage": "訪問首頁",
        "tooltip-n-mainpage-description": "訪問首頁",
-       "tooltip-n-portal": "關於本計劃、您可以做什麼、在哪裡可以找到",
+       "tooltip-n-portal": "關於本專案、您可以做什麼、哪裡可以找到事情",
        "tooltip-n-currentevents": "提供目前新聞事件的背景資料",
-       "tooltip-n-recentchanges": "列出此維基中的最近修改",
+       "tooltip-n-recentchanges": "列出此 Wiki 中的最近變更清單",
        "tooltip-n-randompage": "隨機載入一個頁面",
-       "tooltip-n-help": "å°\8bæ±\82幫助",
+       "tooltip-n-help": "å°\8bæ±\82å\8d\94助",
        "tooltip-t-whatlinkshere": "列出所有與本頁相連的頁面",
-       "tooltip-t-recentchangeslinked": "頁面連出所有頁面的變更",
+       "tooltip-t-recentchangeslinked": "此頁面連結到其他頁面的最近變更",
        "tooltip-feed-rss": "訂閱本頁面歷史的RSS資訊",
        "tooltip-feed-atom": "訂閱本頁面歷史的 Atom Feed",
-       "tooltip-t-contributions": "檢視該用戶的貢獻列表",
-       "tooltip-t-emailuser": "向該用戶發送電子郵件",
+       "tooltip-t-contributions": "檢視該使用者的貢獻列表",
+       "tooltip-t-emailuser": "發送電子郵件給這個使用者",
        "tooltip-t-upload": "上傳檔案",
        "tooltip-t-specialpages": "全部特殊頁面的列表",
        "tooltip-t-print": "該頁面的可列印版本",
        "tooltip-t-permalink": "這個頁面修訂版本的永久連結",
        "tooltip-ca-nstab-main": "檢視頁面內容",
        "tooltip-ca-nstab-user": "檢視使用者頁面",
-       "tooltip-ca-nstab-media": "檢è¦\96å¤\9aåª\92é«\94æª\94æ¡\88è³\87è¨\8a頁面",
+       "tooltip-ca-nstab-media": "檢è¦\96åª\92é«\94頁面",
        "tooltip-ca-nstab-special": "本頁面會隨著資料庫的數據即時更新,任何人均不能直接編輯",
-       "tooltip-ca-nstab-project": "檢視計劃頁面",
+       "tooltip-ca-nstab-project": "檢視專案頁面",
        "tooltip-ca-nstab-image": "檢視檔案頁面",
        "tooltip-ca-nstab-mediawiki": "檢視系統資訊",
-       "tooltip-ca-nstab-template": "檢è¦\96模æ\9d¿",
-       "tooltip-ca-nstab-help": "檢視幫助頁面",
+       "tooltip-ca-nstab-template": "檢è¦\96樣ç\89\88",
+       "tooltip-ca-nstab-help": "檢視說明頁面",
        "tooltip-ca-nstab-category": "檢視分類頁面",
-       "tooltip-minoredit": "標記為小修",
+       "tooltip-minoredit": "標記為小修",
        "tooltip-save": "保存您的修改",
        "tooltip-preview": "預覽您的編輯,請先使用本功能再保存!",
        "tooltip-diff": "顯示您對頁面的貢獻",
        "tooltip-watchlistedit-raw-submit": "更新監視列表",
        "tooltip-recreate": "重建該頁面,無論是否被刪除。",
        "tooltip-upload": "開始上傳",
-       "tooltip-rollback": "按「復原」恢復上一位貢獻者對本頁面的編輯",
-       "tooltip-undo": "「復原」可以在編輯模式上開啟編輯表格以便恢復。它容許在摘要中加入原因。",
-       "tooltip-preferences-save": "儲存使用偏好",
+       "tooltip-rollback": "點選 \"還原\" 還原至上位貢獻者對此頁面的編輯",
+       "tooltip-undo": "\"還原\" 可還原此編輯並以預覽模式開啟編輯表單,讓您可在摘要中加入原因。",
+       "tooltip-preferences-save": "儲存偏好設定",
        "tooltip-summary": "輸入一個簡短的摘要",
        "interlanguage-link-title": "$1 – $2",
-       "common.css": "/* 此處的 CSS 將應用於所有的面板 */",
-       "cologneblue.css": "/* 此處的 CSS 將影響使用科隆香水藍面板的用戶 */",
-       "monobook.css": "/* 此處的 CSS 將影響使用 Monobook 面板的用戶 */",
-       "modern.css": "/* 此處的 CSS 將影響使用 Modern 面板的用戶 */",
-       "vector.css": "/* 此處的 CSS 將影響使用 Vector 面板的用戶 */",
-       "print.css": "/* 此處的 CSS 將影響打印輸出 */",
-       "noscript.css": "/* 此處的 CSS 將影響沒有啓用 JavaScript 的用戶 */",
-       "group-autoconfirmed.css": "/* 此處的 CSS 將只會影響自動確認用戶 */",
-       "group-bot.css": "/* 此處的 CSS 將只會影響機器人 */",
-       "group-sysop.css": "/* 此處的 CSS 將只會影響管理員 */",
-       "group-bureaucrat.css": "/* 此處的 CSS 將只會影響行政員 */",
-       "common.js": "/* 此處的JavaScript將載入於所有用戶每一個頁面。 */",
-       "cologneblue.js": "/* 此處的JavaScript將載入於使用科隆香水藍面板的用戶 */",
-       "monobook.js": "/* 此處的JavaScript將載入於使用Monobook面板的用戶 */",
-       "modern.js": "/* 此處的JavaScript將載入於使用Modern面板的用戶 */",
-       "vector.js": "/* 此處的JavaScript將載入於使用Vector面板的用戶 */",
-       "notacceptable": "該網站伺服器不能提供您的客戶端能識別的數據格式。",
-       "anonymous": "{{SITENAME}}的匿名{{PLURAL:$1|用戶}}",
-       "siteuser": "{{SITENAME}}用戶$1",
-       "anonuser": "{{SITENAME}}匿名用戶$1",
+       "common.css": "/* 此 CSS 會套用至所有的介面外觀 */",
+       "monobook.css": "/* 此 CSS 會影響使用 Monobook 介面外觀的使用者 */",
+       "vector.css": "/* 此 CSS 會影響使用 Vector 介面外觀的使用者 */",
+       "print.css": "/* 此 CSS 會影響列印版輸出 */",
+       "noscript.css": "/* 此 CSS 會影響沒有啓用 JavaScript 的使用者 */",
+       "group-autoconfirmed.css": "/* 此 CSS 會影響自動確認的使用者 */",
+       "group-bot.css": "/* 此 CSS 會影響機器人 */",
+       "group-sysop.css": "/* 此 CSS 會影響管理員 */",
+       "group-bureaucrat.css": "/* 此 CSS 會影響行政員 */",
+       "common.js": "/* 此 JavaScript 會用於使用者載入的每一個頁面。 */",
+       "monobook.js": "/* 此 JavaScript 會用於使用 Monobook 介面外觀使用者 */",
+       "vector.js": "/* 此 JavaScript 會用於使用 Vector 介面外觀使用者 */",
+       "anonymous": "{{SITENAME}} 的匿名{{PLURAL:$1|使用者}}",
+       "siteuser": "{{SITENAME}} 使用者 $1",
+       "anonuser": "{{SITENAME}}匿名使用者 $1",
        "lastmodifiedatby": "此頁由 $3 於 $1 $2 的最後更改。",
        "othercontribs": "在$1的工作基礎上。",
        "others": "其他",
-       "siteusers": "{{SITENAME}}{{PLURAL:$2|用戶}}$1",
-       "anonusers": "{{SITENAME}}匿名{{PLURAL:$2|用戶}}$1",
+       "siteusers": "{{SITENAME}} {{PLURAL:$2|使用者}}$1",
+       "anonusers": "{{SITENAME}} 匿名{{PLURAL:$2|使用者}}$1",
        "creditspage": "頁面致謝",
        "nocredits": "該頁沒有致謝名單訊息。",
        "spamprotectiontitle": "垃圾過濾器",
-       "spamprotectiontext": "您要保存的文字被垃圾過濾器阻止。\n這可能是由於一個連往匹配黑名單的外部站點的連結引起的。",
+       "spamprotectiontext": "您欲儲存的文字內容已被垃圾過濾器封鎖,\n可能因您的內容包含了已封鎖的外部連結。",
        "spamprotectionmatch": "觸發了我們的垃圾過濾器的文本如下:$1",
        "spambot_username": "MediaWiki 廣告清除",
-       "spam_reverting": "恢復到不包含連結至$1的最近修訂版本",
+       "spam_reverting": "還原到未包含連結至 $1 的最新修訂",
        "spam_blanking": "所有包含連結至$1的修訂,清空",
        "spam_deleting": "所有包含連結至$1的修訂,刪除中",
        "simpleantispam-label": "反濫發電郵檢查。\n'''不要'''加入這個!",
        "pageinfo-title": "「$1」的信息",
        "pageinfo-not-current": "抱歉,無法提供之前修訂版本的資訊。",
-       "pageinfo-header-basic": "基本資",
+       "pageinfo-header-basic": "基本資",
        "pageinfo-header-edits": "編輯歷史",
        "pageinfo-header-restrictions": "保護頁面",
        "pageinfo-header-properties": "頁面屬性",
        "pageinfo-display-title": "顯示標題",
        "pageinfo-default-sort": "預設排序字:",
-       "pageinfo-length": "頁面長度 (以位元組為單位)",
+       "pageinfo-length": "頁面長度 (位元組)",
        "pageinfo-article-id": "頁面編號",
        "pageinfo-language": "頁面內容語言",
        "pageinfo-content-model": "頁面內容模型",
        "pageinfo-views": "觀看次數",
        "pageinfo-watchers": "頁面監視者數目",
        "pageinfo-few-watchers": "少於$1名監視者",
-       "pageinfo-redirects-name": "重定向到此頁的數字",
+       "pageinfo-redirects-name": "重新導向至此頁面的數量",
        "pageinfo-subpages-name": "此頁面的子頁面",
-       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|重定向}}; $3 {{PLURAL:$3|非重定向}})",
+       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|筆重新導向頁面}}; $3 {{PLURAL:$3|筆非重新導向頁面}})",
        "pageinfo-firstuser": "頁面的建立者",
        "pageinfo-firsttime": "頁面創建日期",
        "pageinfo-lastuser": "最近編輯者",
        "pageinfo-authors": "作者總數",
        "pageinfo-recent-edits": "最近編輯次數 (過去$1內)",
        "pageinfo-recent-authors": "最近作者數目",
-       "pageinfo-magic-words": "魔術{{PLURAL:$1|字}}($1)",
-       "pageinfo-hidden-categories": "隱藏{{PLURAL:$1|分類}}($1)",
-       "pageinfo-templates": "使用的模板($1)",
-       "pageinfo-transclusions": "使用的頁面($1)",
+       "pageinfo-magic-words": "魔術{{PLURAL:$1|字}} ($1)",
+       "pageinfo-hidden-categories": "隱藏{{PLURAL:$1|分類}} ($1)",
+       "pageinfo-templates": "引用的樣版 ($1)",
+       "pageinfo-transclusions": "頁面被引用於 ($1)",
        "pageinfo-toolboxlink": "頁面資訊",
-       "pageinfo-redirectsto": "重向至",
+       "pageinfo-redirectsto": "重新導向至",
        "pageinfo-redirectsto-info": "資訊",
        "pageinfo-contentpage": "計算為內容頁",
        "pageinfo-contentpage-yes": "是",
        "pageinfo-category-pages": "頁面數量",
        "pageinfo-category-subcats": "子分類數量",
        "pageinfo-category-files": "編輯數量",
-       "skinname-cologneblue": "科隆香水藍",
-       "skinname-modern": "現代",
        "markaspatrolleddiff": "標記為已巡查",
        "markaspatrolledtext": "標記此頁面為已巡查",
        "markedaspatrolled": "標記為已檢查",
        "markedaspatrolledtext": "[[:$1]]的已選定修訂版本已被標識為已巡查。",
-       "rcpatroldisabled": "最新更改檢查被關閉",
+       "rcpatroldisabled": "已停用最近變更檢查",
        "rcpatroldisabledtext": "最新更改檢查的功能目前已關閉。",
        "markedaspatrollederror": "不能標誌為已檢查",
        "markedaspatrollederrortext": "{{GENDER:|你|妳|你}}需要指定某個版本才能標誌為已檢查。",
        "filedelete-old-unregistered": "所指定的檔案修訂「$1」在資料庫中不存在。",
        "filedelete-current-unregistered": "所指定的檔案「$1」在資料庫中不存在。",
        "filedelete-archive-read-only": "存檔目錄「$1」在網頁伺服器中不可寫。",
-       "previousdiff": "←上一版本",
-       "nextdiff": "下一版本→",
-       "mediawarning": "'''警告''': 該檔案類型可能包含惡意代碼。\n執行它可能對您的系統帶來危險。",
-       "imagemaxsize": "å½±å\83\8f大å°\8fé\99\90å\88¶ï¼\9a<br />''ï¼\88ç\94¨å\9c¨æª\94æ¡\88æ\8f\8fè¿°é \81é\9d¢ä¸­ï¼\89''",
-       "thumbsize": "縮圖大小:",
-       "widthheightpage": "$1 × $2, $3頁",
-       "file-info": "檔案大小: $1, MIME 類型: $2",
-       "file-info-size": "$1 × $2 像素,檔案大小:$3,MIME類型:$4",
-       "file-info-size-pages": "$1 × $2像素,檔案大小: $3,檔案類型: $4, $5 {{PLURAL:$5|頁}}",
+       "previousdiff": "← 較舊編輯",
+       "nextdiff": "較新編輯 →",
+       "mediawarning": "<strong>警告</strong>:此檔案類型可能包含惡意代碼。\n若執行可能對您的系統造成損害。",
+       "imagemaxsize": "å\9c\96ç\89\87大å°\8fé\99\90å\88¶ï¼\9a<br /><em>(ç\94¨æ\96¼æª\94æ¡\88æ\8f\8fè¿°é \81é\9d¢)</em>",
+       "thumbsize": "縮圖大小:",
+       "widthheightpage": "$1 × $2,$3 頁",
+       "file-info": "檔案大小:$1,MIME 類型:$2",
+       "file-info-size": "$1 × $2 像素,檔案大小:$3,MIME 類型:$4",
+       "file-info-size-pages": "$1 × $2 像素,檔案大小:$3,MIME 類型:$4,$5 {{PLURAL:$5|頁}}",
        "file-nohires": "無更高解像度可提供。",
        "svg-long-desc": "SVG 檔案,表面大小:$1 × $2 像素,檔案大小:$3",
        "svg-long-desc-animated": "SVG 動畫檔案,表面大小:$1 × $2 像素,檔案大小:$3",
-       "svg-long-error": "無效的SVG檔案:$1",
+       "svg-long-error": "無效的 SVG 檔案:$1",
        "show-big-image": "原始檔案",
-       "show-big-image-preview": "此預覽的大小:$1.",
+       "show-big-image-preview": "預覽大小:$1。",
        "show-big-image-other": "其他{{PLURAL:$2||}}解析度:$1。",
        "show-big-image-size": "$1 × $2 像素",
        "file-info-gif-looped": "循環",
-       "file-info-gif-frames": "$1",
+       "file-info-gif-frames": "$1 畫格",
        "file-info-png-looped": "循環",
-       "file-info-png-repeat": "已播放$1次",
-       "file-info-png-frames": "$1",
-       "file-no-thumb-animation": "'''注意: 由於技術限制,不能播放此檔案縮圖的動畫。'''",
-       "file-no-thumb-animation-gif": "'''注意: 由於技術限制,不能播放此高解析度GIF圖像縮圖的動畫。'''",
-       "newimages": "æ\96°å»ºå\9c\96ç\89\87ç\95«å»\8a",
+       "file-info-png-repeat": "已播放 $1 次",
+       "file-info-png-frames": "$1 畫格",
+       "file-no-thumb-animation": "<strong>注意:由於技術限制,此檔案縮圖無動畫效果。</strong>",
+       "file-no-thumb-animation-gif": "<strong>注意:由於技術限制,此類型高解析度 GIF 圖片無動畫效果。</strong>",
+       "newimages": "æ\9c\80æ\96°æª\94æ¡\88å\9c\96庫",
        "imagelisttext": "以下是按$2排列的'''$1'''個檔案列表。",
-       "newimages-summary": "這個特殊頁面中顯示最後已上傳的檔案。",
+       "newimages-summary": "此特殊頁面中顯示最新上傳的檔案。",
        "newimages-legend": "搜尋",
-       "newimages-label": "檔案名稱(或它的一部份):",
-       "showhidebots": "(機器人$1)",
+       "newimages-label": "檔案名稱 (或部份):",
+       "newimages-showbots": "顯示機械人上載",
        "noimages": "無可檢視圖片。",
        "ilsubmit": "搜尋",
        "bydate": "按日期",
        "sp-newimages-showfrom": "從$1 $2開始顯示新檔案",
-       "seconds": "$1秒",
-       "minutes": "$1分鍾",
-       "hours": "$1小時",
-       "days": "$1天",
-       "weeks": "{{PLURAL:$1|$1}}",
-       "months": "{{PLURAL:$1|$1個月}}",
-       "years": "{{PLURAL:$1|$1年}}",
-       "ago": "$1前",
+       "seconds": "$1 秒",
+       "minutes": "$1 分鍾",
+       "hours": "$1 小時",
+       "days": "$1 天",
+       "weeks": "{{PLURAL:$1|$1 週}}",
+       "months": "{{PLURAL:$1|$1 個月}}",
+       "years": "{{PLURAL:$1|$1 年}}",
+       "ago": "$1 前",
        "just-now": "剛才",
-       "hours-ago": "$1小時前",
-       "minutes-ago": "$1分鐘前",
-       "seconds-ago": "$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",
+       "hours-ago": "$1 小時前",
+       "minutes-ago": "$1 分鐘前",
+       "seconds-ago": "$1 秒前",
+       "monday-at": "於星期一 $1",
+       "tuesday-at": "於星期二 $1",
+       "wednesday-at": "於星期三 $1",
+       "thursday-at": "於星期四 $1",
+       "friday-at": "於星期五 $1",
+       "saturday-at": "於星期六 $1",
+       "sunday-at": "於星期日 $1",
+       "yesterday-at": "昨天 $1",
        "bad_image_list": "請按照下列格式編寫:\n\n只有(以 * 開頭)列出的項目會被考慮。\n每一行的第一個連結必須是損毀檔案的連結。\n然後同一行後方的連結會被視為例外,即是該檔案可以在哪些頁面內被顯示。",
        "variantname-zh-hans": "‪中文(简体)",
        "variantname-zh-hant": "‪繁體中文",
        "variantname-zh": "不轉換",
        "variantname-gan-hans": "‪中文(简体)",
        "variantname-gan-hant": "‪中文(繁體)",
-       "metadata": "元數據",
-       "metadata-help": "此檔案中包含有擴展的訊息。這些訊息可能是由數位相機或掃描儀在創建或數字化過程中所添加的。\n\n如果此檔案的源檔案已經被修改,一些訊息在修改後的檔案中將不能完全反映出來。",
+       "metadata": "資料定義",
+       "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",
        "exif-imagewidth": "寬度",
        "exif-imagelength": "高度",
-       "exif-bitspersample": "每象素比特數",
-       "exif-compression": "壓縮方",
-       "exif-photometricinterpretation": "素合成",
+       "exif-bitspersample": "每像素位元",
+       "exif-compression": "壓縮方",
+       "exif-photometricinterpretation": "素合成",
        "exif-orientation": "方位",
-       "exif-samplesperpixel": "象素數",
-       "exif-planarconfiguration": "數據排列",
-       "exif-ycbcrsubsampling": "黃色洋紅二次抽樣比率",
+       "exif-samplesperpixel": "像素數量",
+       "exif-planarconfiguration": "資料排列",
+       "exif-ycbcrsubsampling": "黃色洋紅二次抽樣比率",
        "exif-ycbcrpositioning": "黃色和洋紅配置",
-       "exif-xresolution": "水準分辨率",
-       "exif-yresolution": "垂直分辨率",
-       "exif-stripoffsets": "å\9c\96ç\89\87æ\95¸æ\93\9aå\8d\80",
+       "exif-xresolution": "水平解析度",
+       "exif-yresolution": "垂直解析度",
+       "exif-stripoffsets": "å½±å\83\8fè³\87æ\96\99ä½\8dç½®",
        "exif-rowsperstrip": "每帶行數",
        "exif-stripbytecounts": "每壓縮帶位元組數",
        "exif-jpeginterchangeformat": "JPEG SOI 偏移",
-       "exif-jpeginterchangeformatlength": "JPEG 數據位元組",
+       "exif-jpeginterchangeformatlength": "JPEG 資料位元組",
        "exif-whitepoint": "白點色度",
        "exif-primarychromaticities": "主要色度",
-       "exif-ycbcrcoefficients": "顏色空間轉換矩陣系數",
-       "exif-referenceblackwhite": "黑白參照值對",
-       "exif-datetime": "檔案更改日期和時間",
-       "exif-imagedescription": "å\9c\96ç\89\87標題",
-       "exif-make": "ç\85§ç\9b¸æ©\9f製é\80 å\95\86",
-       "exif-model": "ç\85§ç\9b¸æ©\9få\9e\8bè\99\9f",
-       "exif-software": "用軟體",
+       "exif-ycbcrcoefficients": "色彩空間轉置矩陣系數",
+       "exif-referenceblackwhite": "黑白參考值",
+       "exif-datetime": "檔案修改日期時間",
+       "exif-imagedescription": "å½±å\83\8f標題",
+       "exif-make": "相機製造商",
+       "exif-model": "相機型號",
+       "exif-software": "使用軟體",
        "exif-artist": "作者",
-       "exif-copyright": "版權所有",
+       "exif-copyright": "版權所有",
        "exif-exifversion": "Exif 版本",
        "exif-flashpixversion": "支援的 Flashpix 版本",
-       "exif-colorspace": "顏色空間",
-       "exif-componentsconfiguration": "æ¯\8få\88\86é\87\8få\90«ç¾©",
-       "exif-compressedbitsperpixel": "å\9c\96ç\89\87壓縮模式",
+       "exif-colorspace": "色彩空間",
+       "exif-componentsconfiguration": "æ¯\8få\83\8fç´ å\85§å\90«",
+       "exif-compressedbitsperpixel": "å½±å\83\8f壓縮模式",
        "exif-pixelydimension": "圖片寬度",
        "exif-pixelxdimension": "圖片高度",
-       "exif-usercomment": "用戶註釋",
-       "exif-relatedsoundfile": "相關的音檔案",
-       "exif-datetimeoriginal": "æ\95¸æ\93\9aç\94¢ç\94\9fæ\99\82é\96\93",
-       "exif-datetimedigitized": "數字化處理時間",
-       "exif-subsectime": "日期時間秒",
-       "exif-subsectimeoriginal": "原始日期時間秒",
-       "exif-subsectimedigitized": "數字化日期時間秒",
+       "exif-usercomment": "使用者評論",
+       "exif-relatedsoundfile": "相關的音檔案",
+       "exif-datetimeoriginal": "è³\87æ\96\99ç\94¢ç\94\9fç\9a\84æ\97¥æ\9c\9fæ\99\82é\96\93",
+       "exif-datetimedigitized": "數位化的日期時間",
+       "exif-subsectime": "DateTime 次秒",
+       "exif-subsectimeoriginal": "DateTimeOriginal 次秒",
+       "exif-subsectimedigitized": "DateTimeDigitized 次秒",
        "exif-exposuretime": "曝光時間",
-       "exif-exposuretime-format": "$1 秒 ($2)",
-       "exif-fnumber": "光圈(F值)",
+       "exif-exposuretime-format": "$1 秒 ($2)",
+       "exif-fnumber": "光圈",
        "exif-exposureprogram": "曝光模式",
-       "exif-spectralsensitivity": "感光",
+       "exif-spectralsensitivity": "光譜靈敏度",
        "exif-isospeedratings": "ISO 速率",
-       "exif-shutterspeedvalue": "APEX快門速度",
-       "exif-aperturevalue": "APEX光圈",
-       "exif-brightnessvalue": "APEX亮度",
-       "exif-exposurebiasvalue": "曝光補償",
+       "exif-shutterspeedvalue": "APEX 快門速度",
+       "exif-aperturevalue": "APEX 光圈",
+       "exif-brightnessvalue": "APEX 亮度",
+       "exif-exposurebiasvalue": "APEX 曝光補償",
        "exif-maxaperturevalue": "最大陸地光圈",
-       "exif-subjectdistance": "物距",
-       "exif-meteringmode": "測模式",
+       "exif-subjectdistance": "主體距離",
+       "exif-meteringmode": "測模式",
        "exif-lightsource": "光源",
        "exif-flash": "閃光燈",
        "exif-focallength": "焦距",
        "exif-subjectarea": "主體區域",
        "exif-flashenergy": "閃光燈強度",
-       "exif-focalplanexresolution": "X軸焦平面分辨率",
-       "exif-focalplaneyresolution": "Y軸焦平面分辨率",
-       "exif-focalplaneresolutionunit": "焦平面分辨率單位",
-       "exif-subjectlocation": "主é¡\8c位置",
+       "exif-focalplanexresolution": "X 軸焦平面解析度",
+       "exif-focalplaneyresolution": "Y 軸焦平面解析度",
+       "exif-focalplaneresolutionunit": "焦平面解析度單位",
+       "exif-subjectlocation": "主é«\94位置",
        "exif-exposureindex": "曝光指數",
        "exif-sensingmethod": "感光模式",
-       "exif-filesource": "檔案源",
+       "exif-filesource": "檔案源",
        "exif-scenetype": "場景類型",
-       "exif-customrendered": "è\87ªè¨\82å\9c\96ç\89\87處理",
+       "exif-customrendered": "è\87ªè¨\82å½±å\83\8f處理",
        "exif-exposuremode": "曝光模式",
        "exif-whitebalance": "白平衡",
-       "exif-digitalzoomratio": "數變焦比率",
-       "exif-focallengthin35mmfilm": "35毫米膠片焦距",
-       "exif-scenecapturetype": "景拍攝類型",
+       "exif-digitalzoomratio": "數變焦比率",
+       "exif-focallengthin35mmfilm": "35 毫米膠片焦距",
+       "exif-scenecapturetype": "景拍攝類型",
        "exif-gaincontrol": "場景控制",
        "exif-contrast": "對比度",
        "exif-saturation": "飽和度",
-       "exif-sharpness": "é\8a³å\8c\96",
+       "exif-sharpness": "é\8a³å\88©åº¦",
        "exif-devicesettingdescription": "設備設定描述",
        "exif-subjectdistancerange": "主體距離範圍",
-       "exif-imageuniqueid": "å\94¯ä¸\80å\9c\96ç\89\87ID",
-       "exif-gpsversionid": "GPS 標籤(tag)版本",
+       "exif-imageuniqueid": "å\94¯ä¸\80å½±å\83\8f ID",
+       "exif-gpsversionid": "GPS 標籤版本",
        "exif-gpslatituderef": "北緯或南緯",
        "exif-gpslatitude": "緯度",
        "exif-gpslongituderef": "東經或西經",
        "exif-gpslongitude": "經度",
-       "exif-gpsaltituderef": "海拔正負參照",
+       "exif-gpsaltituderef": "海拔參考值",
        "exif-gpsaltitude": "海拔",
-       "exif-gpstimestamp": "GPS 時間(原子時鐘)",
+       "exif-gpstimestamp": "GPS 時間 (原子鐘)",
        "exif-gpssatellites": "測量使用的衛星",
        "exif-gpsstatus": "接收器狀態",
        "exif-gpsmeasuremode": "測量模式",
        "exif-gpsdop": "測量精度",
        "exif-gpsspeedref": "速度單位",
        "exif-gpsspeed": "GPS 接收器速度",
-       "exif-gpstrackref": "運動方位參照",
-       "exif-gpstrack": "運動方位",
-       "exif-gpsimgdirectionref": "å\9c\96ç\89\87æ\96¹ä½\8då\8f\83ç\85§",
-       "exif-gpsimgdirection": "å\9c\96ç\89\87æ\96¹ä½\8d",
-       "exif-gpsmapdatum": "使ç\94¨å\9c°ç\90\86測繪æ\95¸æ\93\9a",
-       "exif-gpsdestlatituderef": "目標緯度參",
+       "exif-gpstrackref": "移動方向參考值",
+       "exif-gpstrack": "移動方向",
+       "exif-gpsimgdirectionref": "å½±å\83\8fæ\96¹å\90\91å\8f\83è\80\83å\80¼",
+       "exif-gpsimgdirection": "å½±å\83\8fæ\96¹å\90\91",
+       "exif-gpsmapdatum": "使ç\94¨å¤§å\9c°æ¸¬é\87\8fè³\87æ\96\99",
+       "exif-gpsdestlatituderef": "目標緯度參考值",
        "exif-gpsdestlatitude": "目標緯度",
-       "exif-gpsdestlongituderef": "目標經度的參照",
+       "exif-gpsdestlongituderef": "目標經度參考值",
        "exif-gpsdestlongitude": "目標經度",
-       "exif-gpsdestbearingref": "目標方位參",
+       "exif-gpsdestbearingref": "目標方位參考值",
        "exif-gpsdestbearing": "目標方位",
-       "exif-gpsdestdistanceref": "目標距離參",
+       "exif-gpsdestdistanceref": "目標距離參考值",
        "exif-gpsdestdistance": "目標距離",
-       "exif-gpsprocessingmethod": "GPS 處理方名稱",
+       "exif-gpsprocessingmethod": "GPS 處理方名稱",
        "exif-gpsareainformation": "GPS 區域名稱",
        "exif-gpsdatestamp": "GPS 日期",
-       "exif-gpsdifferential": "GPS å·®å\8b\95修正",
+       "exif-gpsdifferential": "GPS å·®å\88\86修正",
        "exif-jpegfilecomment": "JPEG 檔案備註",
        "exif-keywords": "關鍵字",
        "exif-worldregioncreated": "圖片拍攝地",
        "exif-countrycreated": "圖片拍攝國家",
-       "exif-countrycodecreated": "拍攝的國家代碼",
-       "exif-provinceorstatecreated": "省市",
-       "exif-citycreated": "照片中的城市",
-       "exif-sublocationcreated": "該城市的子地點",
-       "exif-worldregiondest": "世界區域顯示",
-       "exif-countrydest": "顯示國家",
-       "exif-countrycodedest": "顯示國家代碼",
-       "exif-provinceorstatedest": "省或狀態顯示",
+       "exif-countrycodecreated": "圖片拍攝國家代碼",
+       "exif-provinceorstatecreated": "圖片拍攝省市",
+       "exif-citycreated": "圖片拍攝城市",
+       "exif-sublocationcreated": "圖片拍攝城市詳細地點",
+       "exif-worldregiondest": "顯示世界區域",
+       "exif-countrydest": "顯示國家",
+       "exif-countrycodedest": "顯示國家代碼",
+       "exif-provinceorstatedest": "顯示省或州",
        "exif-citydest": "顯示城市",
-       "exif-sublocationdest": "城市的子地點",
+       "exif-sublocationdest": "顯示城市詳細地點",
        "exif-objectname": "簡稱",
        "exif-specialinstructions": "特別說明",
        "exif-headline": "標題",
-       "exif-credit": "署名/提供者",
+       "exif-credit": "製作/提供者",
        "exif-source": "來源",
        "exif-editstatus": "圖片編輯狀態",
        "exif-urgency": "緊急性",
        "exif-fixtureidentifier": "夾具名稱",
        "exif-locationdest": "位置描述",
-       "exif-locationdestcode": "位置所示的代碼",
+       "exif-locationdestcode": "位置代碼描述",
        "exif-objectcycle": "媒體的時間",
-       "exif-contact": "è\81¯ç¹«ä¿¡æ\81¯",
+       "exif-contact": "è\81¯çµ¡è³\87è¨\8a",
        "exif-writer": "作家",
        "exif-languagecode": "語言",
        "exif-iimversion": "IIM版本",
        "exif-serialnumber": "相機的序號",
        "exif-cameraownername": "相機持有人",
        "exif-label": "標籤",
-       "exif-datetimemetadata": "元數據最後修改日期",
+       "exif-datetimemetadata": "資料定義最後修改日期",
        "exif-nickname": "非正式圖片名",
        "exif-rating": "評分(最高5分)",
        "exif-rightscertificate": "權利管理證書",
        "exif-morepermissionsurl": "替代的許可信息",
        "exif-attributionurl": "當重用時,請連結至",
        "exif-preferredattributionname": "當重用時,請署名",
-       "exif-pngfilecomment": "PNG文件注釋",
+       "exif-pngfilecomment": "PNG 檔案備註",
        "exif-disclaimer": "免責聲明",
        "exif-contentwarning": "內容警告",
        "exif-giffilecomment": "GIF註釋",
        "exif-lightsource-12": "日光熒光燈(色溫 D 5700    7100K)",
        "exif-lightsource-13": "日溫白色熒光燈(N 4600    5400K)",
        "exif-lightsource-14": "冷白色熒光燈(W 3900    4500K)",
-       "exif-lightsource-15": "白色熒光 (WW 3200    3700K)",
+       "exif-lightsource-15": "白色熒光 (WW 3200 – 3700K)",
        "exif-lightsource-17": "標準燈光A",
        "exif-lightsource-18": "標準燈光B",
        "exif-lightsource-19": "標準燈光C",
        "exif-flash-return-2": "頻閃觀測器未偵測到光",
        "exif-flash-return-3": "頻閃觀測器偵測到光",
        "exif-flash-mode-1": "強制閃光燈開火",
-       "exif-flash-mode-2": "強制壓制閃光燈",
+       "exif-flash-mode-2": "強制閃光抑制",
        "exif-flash-mode-3": "自動模式",
        "exif-flash-function-1": "無閃光燈功能",
        "exif-flash-redeye-1": "紅眼減退模式",
        "exif-gpsdestdistance-k": "公里",
        "exif-gpsdestdistance-m": "英里",
        "exif-gpsdestdistance-n": "海里",
-       "exif-gpsdop-excellent": "優( $1 )",
+       "exif-gpsdop-excellent": "良好 ($1)",
        "exif-gpsdop-good": "良( $1 )",
-       "exif-gpsdop-moderate": "中( $1 )",
+       "exif-gpsdop-moderate": "中( $1 )",
        "exif-gpsdop-fair": "一般($1)",
-       "exif-gpsdop-poor": "( $1 )",
+       "exif-gpsdop-poor": "不佳( $1 )",
        "exif-objectcycle-a": "限於上午",
        "exif-objectcycle-p": "限於下午",
        "exif-objectcycle-b": "上午與下午",
        "exif-iimcategory-spo": "體育",
        "exif-iimcategory-war": "戰爭,衝突和動盪",
        "exif-iimcategory-wea": "天氣",
-       "exif-urgency-normal": "正常( $1 )",
+       "exif-urgency-normal": "正常 ($1)",
        "exif-urgency-low": "低( $1 )",
-       "exif-urgency-high": "高( $1 )",
-       "exif-urgency-other": "用戶定義( $1 )",
+       "exif-urgency-high": "高 ($1)",
+       "exif-urgency-other": "使用者自訂優先權 ($1)",
        "watchlistall2": "全部",
        "namespacesall": "全部",
        "monthsall": "全部",
        "confirmemail": "確認郵箱位址",
-       "confirmemail_noemail": "您沒有在您的[[Special:Preferences|用戶設定]]裡面輸入一個有效的 email 位址。",
+       "confirmemail_noemail": "您尚未於 [[Special:Preferences|偏好設定]] 輸入一個有效的電子郵件地址。",
        "confirmemail_text": "{{SITENAME}}要求您在使用郵件功能之前驗證您的郵箱位址。\n點擊以下按鈕可向您的郵箱發送一封確認郵件。該郵件包含有一行代碼連結;\n請在您的瀏覽器中加載此連結以確認您的郵箱位址是有效的。",
-       "confirmemail_pending": "一個確認碼已經被發送到您的郵箱,您可能需要等幾分鐘才能收到。如果無法收到,請再申請一個新的確認碼。",
+       "confirmemail_pending": "確認碼已發送至您的電子郵件,\n若您才剛建立好您的帳號,可能需要稍後幾分鐘才能收到。\n若沒有收到,請再重新申請一次確認碼。",
        "confirmemail_send": "郵發確認代碼",
        "confirmemail_sent": "確認郵件已發送。",
        "confirmemail_oncreate": "一個確認代碼已經被發送到您的郵箱。該代碼並不要求您進行登入,\n但若您要啟用在此 wiki 上的任何基於電子郵件的功能,您必須先提交此代碼。",
        "confirmemail_success": "您的郵箱已經被確認。您現在可以[[Special:UserLogin|登錄]]並使用此網站了。",
        "confirmemail_loggedin": "您的郵箱位址現下已被確認。",
        "confirmemail_subject": "{{SITENAME}}郵箱位址確認",
-       "confirmemail_body": "擁有IP位址$1的用戶(可能是您)在{{SITENAME}}創建了賬戶\"$2\",並提交了您的電子郵箱位址。\n\n請確認這個賬戶是屬於您的,並同時啟用在{{SITENAME}}上的\n電子郵件功能。請在瀏覽器中打開下面的連結:\n\n$3\n\n如果您*未*註冊賬戶,\n請打開下面的連結去取消電子郵件確認:\n\n$5\n\n確認碼會在$4過期。",
-       "confirmemail_body_changed": "擁有IP位址$1的用戶(可能是您)在{{SITENAME}}更改了賬戶\"$2\"的電子郵箱位址。\n\n請確認這個賬戶是屬於您的,並同時重新啟用在{{SITENAME}}上的\n電子郵件功能。請在瀏覽器中打開下面的連結:\n\n$3\n\n如果這個賬戶*不是*屬於您的,\n請打開下面的連結去取消電子郵件確認:\n\n$5\n\n確認碼會在$4過期。",
-       "confirmemail_body_set": "ä¾\86è\87ªIPå\9c°å\9d\80 $1 ç\9a\84人 (å\8f¯è\83½æ\98¯ä½ ) å·²å°\87帳æ\88¶ \"$2\" ç\9a\84é\9b»é\83µå\9c°å\9d\80設å®\9aç\82º {{SITENAME}}ã\80\82\n\nè«\8bç\94¨ç\80\8f覽å\99¨æ\89\93é\96\8b以ä¸\8bç\9a\84é\80£æ\8e¥ï¼\8c以確èª\8dä½ å°\8dé\80\99å\80\8b帳æ\88¶ç\9a\84æ\93\81æ\9c\89æ¬\8aï¼\8c並å°\87ä¸\8aè¿°é\9b»é\83µå\9c°å\9d\80è·\9f帳æ\88¶å»ºç«\8bé\97\9cè\81¯ã\80\82\n\n$3\n\nå¦\82æ\9e\9cé\80\99帳æ\88¶*ä¸\8d\98¯ä½ ç\9a\84ï¼\8cè«\8bé»\9eæ­¤é\8f\88æ\8e¥å\8f\96æ¶\88é\9b»å­\90é\83µä»¶å\9c°å\9d\80確èª\8dï¼\9a\n\n$5\n\n確èª\8d碼æ\9c\83å\9c¨é\80\99å\80\8bæ\99\82é\96\93é\81\8eæ\9c\9fï¼\9a$4",
+       "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": "ä¸\8dæ\98\8e人士 (å\8f¯è\83½æ\98¯æ\82¨è\87ªå·±ï¼\8cä¾\86è\87ª IP ä½\8då\9d\80 $1)  å·²å°\87å\9c¨ {{SITENAME}} å¸³è\99\9f \"$2\" ç\9a\84é\9b»å­\90é\83µä»¶å\9c°å\9d\80設å®\9aè\87³æ­¤ã\80\82\n\nè«\8b確èª\8dé\80\99å\80\8b帳è\99\9fæ\98¯å±¬æ\96¼æ\82¨ç\9a\84ï¼\8c並使ç\94¨ç\80\8f覽å\99¨é\96\8bå\95\9fä¸\8bæ\96¹é\80£çµ\90以å\95\9fç\94¨å\9c¨ {{SITENAME}} ä¸\8aç\9a\84é\9b»å­\90é\83µä»¶å\8a\9fè\83½ï¼\9a\n\n$3\n\nè\8b¥æ\82¨ *æ\9cª* è¨»å\86\8a此帳è\99\9fï¼\8c\nè«\8bé\96\8bå\95\9fä¸\8bæ\96¹é\80£çµ\90å\8f\96æ¶\88é\9b»å­\90é\83µä»¶ç¢ºèª\8dï¼\9a\n\n$5\n\n此確èª\8d代碼æ\9c\83æ\96¼ $4 é\81\8eæ\9c\9fã\80\82",
        "confirmemail_invalidated": "電郵地址確認已取消",
        "invalidateemail": "取消電郵確認",
-       "scarytranscludedisabled": "[跨wiki轉換代碼不可用]",
-       "scarytranscludefailed": "[模æ\9d¿$1讀取失敗]",
-       "scarytranscludefailed-httpstatus": "[模æ\9d¿$1è®\80å\8f\96失æ\95\97ï¼\9aHTTP$2]",
+       "scarytranscludedisabled": "[Interwiki 轉換代碼不可用]",
+       "scarytranscludefailed": "[樣ç\89\88 $1 讀取失敗]",
+       "scarytranscludefailed-httpstatus": "[樣ç\89\88 $1 è®\80å\8f\96失æ\95\97ï¼\9aHTTP $2]",
        "scarytranscludetoolong": "[URL 地址太長]",
-       "deletedwhileediting": "'''警告:'''此頁在您開始編輯之後已經被刪除﹗",
-       "confirmrecreate": "在您開始編輯這個頁面後,用戶[[User:$1|$1]] ([[User talk:$1|對話]])以下列原因刪除了這個頁面:\n: ''$2''\n請確認在您重新創建頁面前三思。",
-       "confirmrecreate-noreason": "在您開始編輯後,用戶[[User:$1|$1]] ([[User talk:$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": "重建",
        "confirm_purge_button": "確定",
        "confirm-purge-top": "要清除此頁面的快取嗎?",
        "comma-separator": "、",
        "colon-separator": ":",
        "word-separator": "",
-       "parentheses": "($1)",
+       "parentheses": " ($1)",
        "quotation-marks": "「$1」",
        "imgmultipageprev": "← 上一頁",
        "imgmultipagenext": "下一頁 →",
        "imgmultigo": "確定!",
        "imgmultigoto": "到第$1頁",
-       "img-lang-default": "(預設語言)",
+       "img-lang-default": "(預設語言)",
        "img-lang-info": "於$1呈現此圖像。$2",
        "img-lang-go": "走",
        "ascending_abbrev": "升",
        "table_pager_first": "第一頁",
        "table_pager_last": "最末頁",
        "table_pager_limit": "每頁顯示 $1 筆記錄",
-       "table_pager_limit_label": "每頁項目數︰",
+       "table_pager_limit_label": "每頁數︰",
        "table_pager_limit_submit": "送出",
        "table_pager_empty": "沒有結果",
        "autosumm-blank": "清空頁面",
        "autosumm-replace": "以「$1」替換內容",
-       "autoredircomment": "重定向頁面到[[$1]]",
-       "autosumm-new": "以內容「$1」創建新頁面",
+       "autoredircomment": "重新導向頁面至 [[$1]]",
+       "autosumm-new": "已建立頁面,內容為 \"$1\"",
        "size-bytes": "$1 位元組",
-       "livepreview-loading": "正在載入…",
-       "livepreview-ready": "正在載入… 完成!",
-       "livepreview-failed": "實時預覽失敗!\n嘗試標準預覽。",
-       "livepreview-error": "連接失敗: $1 \"$2\"。\n嘗試標準預覽。",
        "lag-warn-normal": "過去$1秒內的更改未必會在這個清單中顯示。",
        "lag-warn-high": "由於資料庫的過度延遲,過去$1秒內的更改未必會在這個清單中顯示。",
-       "watchlistedit-numitems": "您的監視列表中共有$1個標題,當中不包括對話頁面。",
-       "watchlistedit-noitems": "您的監視列表並無標題。",
        "watchlistedit-normal-title": "編輯監視列表",
        "watchlistedit-normal-legend": "從監視列表中移除標題",
        "watchlistedit-normal-explain": "在您的監視列表中的標題在下面顯示。要移除一個標題,在它前面剔一下,接著點擊「{{int:Watchlistedit-normal-submit}}」。您亦可以[[Special:EditWatchlist/raw|編輯原始監視列表]]。",
        "watchlistedit-raw-done": "您的監視列表已經更新。",
        "watchlistedit-raw-added": "已經加入了$1個標題:",
        "watchlistedit-raw-removed": "已經移除了$1個標題:",
-       "watchlisttools-view": "檢視有關更改",
+       "watchlistedit-clear-title": "已清除監視列表",
+       "watchlistedit-clear-legend": "清除監視列表",
+       "watchlistedit-clear-explain": "所有標題將會從你的監視列表中刪除",
+       "watchlistedit-clear-titles": "標題:",
+       "watchlistedit-clear-submit": "清除監視列表(這是永久!)",
+       "watchlistedit-clear-done": "您的監視列表已經清除。",
+       "watchlistedit-clear-removed": "已經移除了$1個標題:",
+       "watchlistedit-too-many": "有太多的頁面要在此處顯示。",
+       "watchlisttools-clear": "清除監視列表",
+       "watchlisttools-view": "檢視相關更改",
        "watchlisttools-edit": "檢視並編輯監視列表",
        "watchlisttools-raw": "編輯原始監視列表",
-       "signature": "[[{{ns:user}}:$1|$2]]([[{{ns:user_talk}}:$1|討論]])",
+       "signature": "[[{{ns:user}}:$1|$2]]([[{{ns:user_talk}}:$1|對話]])",
        "unknown_extension_tag": "不明的擴展標籤「$1」",
        "duplicate-defaultsort": "警告: 預設的排序鍵「$2」覆蓋先前的預設排序鍵「$1」。",
        "version": "版本",
-       "version-extensions": "已經安裝的擴展",
+       "version-extensions": "已安裝的擴充套件",
        "version-specialpages": "特殊頁面",
-       "version-parserhooks": "èª\9eæ³\95é\88\8e",
+       "version-parserhooks": "èª\9eæ³\95é\80£çµ\90(Hook)",
        "version-variables": "變數",
-       "version-antispam": "垃圾防止",
+       "version-antispam": "垃圾訊息防止",
        "version-skins": "外觀",
        "version-other": "其他",
        "version-mediahandlers": "媒體處理器",
-       "version-hooks": "é\88\8e",
-       "version-parser-extensiontags": "èª\9eæ³\95æ\93´å±\95標籤",
-       "version-parser-function-hooks": "èª\9eæ³\95å\87½æ\95¸é\88\8e",
-       "version-hook-name": "é\88\8eå\90\8d",
-       "version-hook-subscribedby": "利用於",
-       "version-version": "(版本 $1)",
-       "version-license": "MediaWiki許可證",
-       "version-ext-license": "授權",
-       "version-ext-colheader-name": "æ\93´å±\95",
+       "version-hooks": "é\80£çµ\90(Hooks)",
+       "version-parser-extensiontags": "èª\9eæ³\95æ\93´å\85\85標籤",
+       "version-parser-function-hooks": "èª\9eæ³\95å\87½æ\95¸é\80£çµ\90",
+       "version-hook-name": "é\80£çµ\90å\90\8d稱",
+       "version-hook-subscribedby": "署名",
+       "version-version": "($1)",
+       "version-license": "MediaWiki 授權條款",
+       "version-ext-license": "授權條款",
+       "version-ext-colheader-name": "æ\93´å\85\85å¥\97件",
        "version-ext-colheader-version": "版本",
-       "version-ext-colheader-license": "許可證",
+       "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/ MediaWiki]'''驅動,版權所有 © 2001-$1 $2。",
+       "version-license-title": "$1 的授權條款",
+       "version-license-not-found": "查無此擴充套件的詳細授權條款資訊。",
+       "version-credits-title": "$1 的製作群",
+       "version-credits-not-found": "查無此擴充套件的詳細製作群資訊。",
+       "version-poweredby-credits": "此 Wiki 由 <strong>[https://www.mediawiki.org/ MediaWiki]</strong> 開發,版權所有 © 2001-$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通用公共授權的副本];如果沒有,請寫信至自由軟件基金會:51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA,或[//www.gnu.org/licenses/old-licenses/gpl-2.0.html 線上閱讀]。",
-       "version-software": "已經安裝的軟",
+       "version-poweredby-translators": " translatewiki.net 翻譯人員",
+       "version-credits-summary": "我們感謝以下人士為 [[Special:Version|MediaWiki]] 作出的貢獻。",
+       "version-license-info": "MediaWiki 為自由軟體;您可依據自由軟體基金會所發表的 GNU 通用公共授權條款規定,將本程式重新發佈與/或修改;無論您依據的是本授權條款的第二版或 (您可自行選擇) 之後的任何版本。\n\n本程式發佈的目的是希望可以提供幫助,但不負任何擔保責任;亦無隱含對適售性或 特定用途的適用性的情形擔保。詳情請參照 GNU 通用公共授權。\n\n您應已隨本程式收到 [{{SERVER}}{{SCRIPTPATH}}/COPYING GNU 通用公共授權條款的副本];如果沒有,請信件通知自由軟體基金會,51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA,或 [//www.gnu.org/licenses/old-licenses/gpl-2.0.html 線上閱讀]。",
+       "version-software": "已經安裝的軟",
        "version-software-product": "產品",
        "version-software-version": "版本",
-       "version-entrypoints": "入口URL",
-       "version-entrypoints-header-entrypoint": "入口",
+       "version-entrypoints": "入口 URL",
+       "version-entrypoints-header-entrypoint": "入口",
        "version-entrypoints-header-url": "URL",
        "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath 條目路徑]",
-       "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": "依檔案、使用者、頁面或修訂 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": "值:",
-       "redirect-user": "用戶ID:",
-       "redirect-page": "頁面ID",
-       "redirect-revision": "頁面修訂ID",
+       "redirect-user": "使用者 ID",
+       "redirect-page": "頁面 ID",
+       "redirect-revision": "頁面修訂 ID",
        "redirect-file": "檔案名稱",
        "redirect-not-exists": "找不到",
-       "fileduplicatesearch": "選擇重覆檔案",
-       "fileduplicatesearch-summary": "用重覆檔案的切細值去找出檔案是否重覆。",
-       "fileduplicatesearch-legend": "æ\89¾重覆",
+       "fileduplicatesearch": "搜尋重覆檔案",
+       "fileduplicatesearch-summary": "依據雜湊值(Hash)來搜尋重複的檔案。",
+       "fileduplicatesearch-legend": "æ\90\9cå°\8b重覆",
        "fileduplicatesearch-filename": "檔案名稱:",
        "fileduplicatesearch-submit": "搜尋",
        "fileduplicatesearch-info": "$1 × $2 像素<br />檔案大小:$3<br />MIME 類型:$4",
-       "fileduplicatesearch-result-1": "檔案「$1」無完全相同的重覆。",
-       "fileduplicatesearch-result-n": "檔案「$1」有$2項完全相同的重覆。",
-       "fileduplicatesearch-noresults": "æ²\92æ\9c\89ç\99¼ç\8f¾å\90\8dç\82ºã\80\8c$1ã\80\8dç\9a\84æ\96\87件。",
+       "fileduplicatesearch-result-1": "檔案 $1 無重覆的檔案。",
+       "fileduplicatesearch-result-n": "檔案 $1 有 $2 筆重覆的檔案。",
+       "fileduplicatesearch-noresults": "æ\9f¥ç\84¡å\90\8d稱ç\82º \"$1\" ç\9a\84æª\94æ¡\88。",
        "specialpages": "特殊頁面",
-       "specialpages-note-top": "圖例",
-       "specialpages-note": "* 標準特殊頁面。\n* <span class=\"mw-specialpagerestricted\">用於重新整理的特殊頁面(可能過時)。</span>",
-       "specialpages-group-maintenance": "維護報",
+       "specialpages-note-top": "說明",
+       "specialpages-note": "* 一般特殊頁面。\n* <span class=\"mw-specialpagerestricted\">受限制的特殊頁面。</span>",
+       "specialpages-group-maintenance": "維護報",
        "specialpages-group-other": "其它特殊頁面",
        "specialpages-group-login": "登入/建立新帳號",
-       "specialpages-group-changes": "最近更改和日誌",
-       "specialpages-group-media": "媒體報告和上傳",
-       "specialpages-group-users": "用戶和權限",
-       "specialpages-group-highuse": "高度使用頁面",
+       "specialpages-group-changes": "最近變更與日誌",
+       "specialpages-group-media": "媒體上傳與報表",
+       "specialpages-group-users": "使用者與權限",
+       "specialpages-group-highuse": "用頁面",
        "specialpages-group-pages": "頁面清單",
        "specialpages-group-pagetools": "頁面工具",
        "specialpages-group-wiki": "資料和工具",
-       "specialpages-group-redirects": "é\87\8dæ\96°å®\9aå\90\91特殊頁面",
-       "specialpages-group-spam": "反垃圾工具",
+       "specialpages-group-redirects": "é\87\8dæ\96°å°\8eå\90\91ç\9b¸é\97\9c特殊頁面",
+       "specialpages-group-spam": "反垃圾訊息工具",
        "blankpage": "空白頁面",
-       "intentionallyblankpage": "這個頁面是為空白",
+       "intentionallyblankpage": "此頁面被故意設為空白。",
        "external_image_whitelist": " #留下這行一樣的文字<pre>\n#在下面(//之中間部份)輸入正規表達式\n#這些將會跟外部(已超連結的)圖片配合\n#那些配合到出來的會顯示成圖片,否則就只會顯示成連結\n#有 # 開頭的行會當成註解\n#大小寫並無區分\n\n#在這行上面輸入所有的regex。留下這行一樣的文字</pre>",
-       "tags": "有效標籤",
-       "tag-filter": "[[Special:Tags|標籤]]過濾器:",
+       "tags": "有效變更標籤",
+       "tag-filter": "[[Special:Tags|標籤]]搜尋:",
        "tag-filter-submit": "搜尋",
-       "tag-list-wrapper": "([[Special:Tags|$1個標籤]]:$2)",
+       "tag-list-wrapper": "([[Special:Tags|標籤]]:$2)",
        "tags-title": "標籤",
        "tags-intro": "這個頁面列示出在軟件中已標示的編輯,以及它們的解釋。",
        "tags-tag": "標籤名稱",
        "tags-display-header": "在更改清單中的出現方式",
-       "tags-description-header": "解釋完整描述",
+       "tags-description-header": "完整含意說明",
        "tags-active-header": "存檔?",
        "tags-hitcount-header": "已加上標籤的更改",
        "tags-active-yes": "是",
        "tags-active-no": "否",
        "tags-edit": "編輯",
-       "tags-hitcount": "$1次更改",
+       "tags-hitcount": "$1 次變更",
        "comparepages": "比較頁面",
-       "compare-page1": "第1頁",
-       "compare-page2": "第2頁",
-       "compare-rev1": "修訂版本1",
-       "compare-rev2": "修訂版本2",
+       "compare-page1": "第 1 頁",
+       "compare-page2": "第 2 頁",
+       "compare-rev1": "修訂 1",
+       "compare-rev2": "修訂 2",
        "compare-submit": "比較",
        "compare-invalid-title": "所指定標題無效。",
        "compare-title-not-exists": "所指定的話題不存在。",
        "compare-revision-not-exists": "所指定的修訂不存在。",
-       "dberr-header": "這個 wiki 出現了問題",
        "dberr-problems": "歉!這個網站出現了一些技術上的問題。",
        "dberr-again": "嘗試等候數分鐘後,然後再試。",
-       "dberr-info": "(無法連繫到資料庫伺服器: $1)",
-       "dberr-info-hidden": "(無法與資料庫伺服器聯繫)",
+       "dberr-info": "(無法連線資料庫伺服器:$1)",
+       "dberr-info-hidden": "(無法連線資料庫伺服器)",
        "dberr-usegoogle": "在現階段您可以嘗試透過 Google 搜尋。",
        "dberr-outofdate": "留意他們索引出來之內容可能不是最新的。",
        "dberr-cachederror": "這個是所要求出來的快取複本,可能不是最新的。",
        "htmlform-int-toohigh": "您所指定的值高於最大值$1",
        "htmlform-required": "此值是必填項",
        "htmlform-submit": "提交",
-       "htmlform-reset": "撤銷更改",
+       "htmlform-reset": "還原更改",
        "htmlform-selectorother-other": "其他",
        "htmlform-no": "否",
        "htmlform-yes": "是",
        "htmlform-chosen-placeholder": "選項",
+       "htmlform-cloner-create": "新增更多",
+       "htmlform-cloner-delete": "移除",
+       "htmlform-cloner-required": "至少必須填寫一筆資料。",
        "sqlite-has-fts": "帶全文搜尋的版本$1",
        "sqlite-no-fts": "不帶全文搜尋的版本$1",
-       "logentry-delete-delete": "$1刪除頁面$3",
-       "logentry-delete-restore": "$1恢復頁面$3",
-       "logentry-delete-event": "$1已更改$3中$5項日誌的可見性:$4",
-       "logentry-delete-revision": "$1已{{GENDER:$2|更改}}$3中{{PLURAL:$5|$5個歷史版本|$5個歷史版本}}的可見性:$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|更改}}$3中{{PLURAL:$5|$5項日誌|$5項日誌}}的可見性:$4",
-       "logentry-suppress-revision": "$1已不可見地{{GENDER:$2|更改}}$3中{{PLURAL:$5|$5個歷史版本|$5個歷史版本}}的可見性:$4",
-       "logentry-suppress-event-legacy": "$1已不可見地{{GENDER:$2|更改}}$3中日誌的可見性",
-       "logentry-suppress-revision-legacy": "$1已不可見地{{GENDER:$2|更改}}$3中歷史版本的可見性",
+       "logentry-delete-delete": "$1 刪除頁面 $3",
+       "logentry-delete-restore": "$1 還原頁面 $3",
+       "logentry-delete-event": "$1 {{GENDER:$2|已更改}} $3 中 {{PLURAL:$5|1 筆日誌|$5 筆日誌}}的可見性:$4",
+       "logentry-delete-revision": "$1 {{GENDER:$2|已更改}}頁面 $3 中 {{PLURAL:$5|1 筆修訂|$5 筆修訂}}的可見性:$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|已暗中更改}} $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-uname-hid": "隱藏用戶名",
-       "revdelete-content-unhid": "恢復內容",
-       "revdelete-summary-unhid": "恢復編輯摘要",
-       "revdelete-uname-unhid": "恢復用戶名",
-       "revdelete-restricted": "已應用限制至操作員",
-       "revdelete-unrestricted": "已移除對於操作員的限制",
-       "logentry-move-move": "$1移動$3頁面至$4",
-       "logentry-move-move-noredirect": "$1移動$3頁面至$4,不留重定向",
-       "logentry-move-move_redir": "$1通過重定向移動$3頁面至$4",
-       "logentry-move-move_redir-noredirect": "$1通過重定向移動$3頁面至$4,不留重定向",
-       "logentry-patrol-patrol": "$1{{GENDER:$2|標記}}頁面$3的版本$4為已巡查",
-       "logentry-patrol-patrol-auto": "$1自動{{GENDER:$2|標記}}頁面$3的版本$4為已巡查",
-       "logentry-newusers-newusers": "已{{GENDER:$2|建立}}用戶「$1」",
-       "logentry-newusers-create": "已{{GENDER:$2|建立}}用戶「$1」",
-       "logentry-newusers-create2": "用戶「$1」建立用戶「$3」",
-       "logentry-newusers-byemail": "$1建立用戶$3並電郵密碼給他",
-       "logentry-newusers-autocreate": "用戶$1被自動{{GENDER:$2|建立}}",
-       "logentry-rights-rights": "$1將$3的權限從$4改為$5",
-       "logentry-rights-rights-legacy": "$1更改$3的權限",
-       "logentry-rights-autopromote": "$1的權限自動從$4改為$5",
-       "rightsnone": "",
-       "feedback-bugornote": "如果您準備好了詳細描述一個技術問題,請[$1 報告一個bug]。或者,您可以使用下面的簡易表單。您的評論將被添加到頁面“[$3 $2]”,並帶有您的用戶名和使用的瀏覽器。",
+       "revdelete-uname-hid": "隱藏使用者名稱",
+       "revdelete-content-unhid": "取消隱藏內容",
+       "revdelete-summary-unhid": "取消隱藏編輯摘要",
+       "revdelete-uname-unhid": "取消隱藏使用者名稱",
+       "revdelete-restricted": "已套用對管理員的限制",
+       "revdelete-unrestricted": "已移除對管理員的限制",
+       "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 {{GENDER:$2|已移動}}頁面 $3 覆蓋重新導向頁面至 $4,未留重新導向頁面",
+       "logentry-patrol-patrol": "$1 {{GENDER:$2|已標記}}頁面 $3 的修訂 $4 為已巡查",
+       "logentry-patrol-patrol-auto": "$1 已自動{{GENDER:$2|標記}}頁面 $3 的修訂 $4 為已巡查",
+       "logentry-newusers-newusers": "已{{GENDER:$2|建立}}使用者帳號 $1",
+       "logentry-newusers-create": "已{{GENDER:$2|建立}}使用者帳號 $1",
+       "logentry-newusers-create2": "$1 {{GENDER:$2|已建立}}使用者帳號 $3",
+       "logentry-newusers-byemail": "$1 {{GENDER:$2|已建立}}使用者帳號 $3 並且以電子郵件通知密碼",
+       "logentry-newusers-autocreate": "已自動{{GENDER:$2|建立}}使用者帳號 $1",
+       "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",
+       "rightsnone": "(無)",
+       "feedback-bugornote": "如果您準備要詳細描述一個技術問題,請至 [$1 回報問題]。\n或您可以使用以下的簡易表單回報問題,您的使用者名稱與評論將被新增到頁面 \"[$3 $2]\"。",
        "feedback-subject": "主旨:",
        "feedback-message": "訊息:",
        "feedback-cancel": "取消",
        "api-error-unknownerror": "未知錯誤:$1。",
        "api-error-uploaddisabled": "本wiki的上傳檔案功能已停用。",
        "api-error-verification-error": "本檔案可能已損壞,或副檔名錯誤。",
-       "duration-seconds": "$1秒",
-       "duration-minutes": "$1",
-       "duration-hours": "$1小時",
-       "duration-days": "$1天",
-       "duration-weeks": "$1週",
-       "duration-years": "$1年",
-       "duration-decades": "$1十年",
-       "duration-centuries": "$1世紀",
-       "duration-millennia": "$1千年",
+       "duration-seconds": "$1 秒",
+       "duration-minutes": "$1 分鐘",
+       "duration-hours": "$1 小時",
+       "duration-days": "$1 天",
+       "duration-weeks": "$1 週",
+       "duration-years": "$1 年",
+       "duration-decades": "$1{{PLURAL:$1|0 年|0 年}}",
+       "duration-centuries": "$1 世紀",
+       "duration-millennia": "$1 千年",
        "rotate-comment": "順時針旋轉圖像$1{{PLURAL:$1|度}}",
        "limitreport-title": "分析器分析資料:",
-       "limitreport-cputime": "CPU使用時間",
-       "limitreport-cputime-value": "$1秒",
+       "limitreport-cputime": "CPU 使用時間",
+       "limitreport-cputime-value": "$1 秒",
        "limitreport-walltime": "實際使用時間",
-       "limitreport-walltime-value": "$1秒",
-       "limitreport-ppvisitednodes": "預處理器訪問節點數",
-       "limitreport-ppgeneratednodes": "é \90è\99\95ç\90\86å\99¨ç\94\9fæ\88\90ç¯\80é»\9eè¨\88數",
-       "limitreport-postexpandincludesize": "展開後大小",
+       "limitreport-walltime-value": "$1 秒",
+       "limitreport-ppvisitednodes": "預處理器訪問節點數",
+       "limitreport-ppgeneratednodes": "é \90è\99\95ç\90\86å\99¨ç\94¢ç\94\9fç¯\80é»\9e次數",
+       "limitreport-postexpandincludesize": "展開後的引用大小",
        "limitreport-postexpandincludesize-value": "$1/$2 個{{PLURAL:$2|位元組}}",
-       "limitreport-templateargumentsize": "模æ\9d¿參數大小",
+       "limitreport-templateargumentsize": "樣ç\89\88參數大小",
        "limitreport-templateargumentsize-value": "$1/$2 個{{PLURAL:$2|位元組}}",
        "limitreport-expansiondepth": "最高展開深度",
-       "limitreport-expensivefunctioncount": "高開銷分析函數數位",
-       "expandtemplates": "å±\95é\96\8b模æ\9d¿",
-       "expand_templates_intro": "本特殊頁面用於將一些文字中的模版展開,包括模版中引用的模版。同時也展開解譯器函數如<nowiki>{{</nowiki>#language:...}},以及變數如<nowiki>{{</nowiki>CURRENTDAY}}&mdash;實際上,幾乎所有在雙括弧中的內容都被展開。",
+       "limitreport-expensivefunctioncount": "高分析函數次數",
+       "expandtemplates": "å±\95é\96\8b樣ç\89\88",
+       "expand_templates_intro": "本特殊頁面會將文字中的樣版展開,可以包含支援的分析程式語法,如 <code><nowiki>{{</nowiki>#language:…}}</code> 與變數如 <code><nowiki>{{</nowiki>CURRENTDAY}}</code>。\n實際上,絕大部分在雙括號中的內容都會被展開。",
        "expand_templates_title": "上下文標題,用於 {{FULLPAGENAME}} 等:",
        "expand_templates_input": "輸入文字:",
        "expand_templates_output": "結果:",
-       "expand_templates_xml_output": "XML輸出",
-       "expand_templates_html_output": "原始HTML輸出",
+       "expand_templates_xml_output": "XML 輸出",
+       "expand_templates_html_output": "原始 HTML 輸出",
        "expand_templates_ok": "確定",
-       "expand_templates_remove_comments": "移除注釋",
-       "expand_templates_remove_nowiki": "在結果中隱藏<nowiki>標記",
-       "expand_templates_generate_xml": "顯示XML語法樹",
-       "expand_templates_generate_rawhtml": "顯示原始HTML",
+       "expand_templates_remove_comments": "移除評論",
+       "expand_templates_remove_nowiki": "在結果中禁止顯示 <nowiki> 標籤",
+       "expand_templates_generate_xml": "顯示 XML 解析樹",
+       "expand_templates_generate_rawhtml": "顯示原始 HTML",
        "expand_templates_preview": "預覽"
 }
index f06b278..55ed354 100644 (file)
@@ -98,7 +98,6 @@ $defaultDateFormat = 'dmy';
 
 $bookstoreList = array(
        "AddALL" => "http://www.addall.com/New/Partner.cgi?query=$1&type=ISBN",
-       "PriceSCAN" => "http://www.pricescan.com/books/bookDetail.asp?isbn=$1",
        "Barnes & Noble" => "http://search.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=$1",
        "Amazon.com" => "http://www.amazon.com/exec/obidos/ISBN=$1",
        "Amazon.co.uk" => "http://www.amazon.co.uk/exec/obidos/ISBN=$1"
index 9ed4447..b2627ff 100644 (file)
  */
 
 /**
 * Initial translation by Pasok Internet Volunteers
 * http://forum.pasok.gr
 * version 1.0 (initial release)
 *
 * The project for the translation of MediaWiki into Greek
 * was undertaken by a group of ICT volunteers working under
 * the auspices of the Greek political party PASOK.
 *
 * The idea behind this effort was  to provide an extensible,
 * easy-to-use and non-intimidating tool for content development
 * and project management, to be used throughout the administrative
 * and political structure of PASOK by staff, volunteers, party members
 * and elected officials (all of whom possess varying degrees of ICT skills).
 *
 * The PASOK ICT team and the volunteers who worked on this project are
 * now returning the translated interface to the Open-Source Community
 * with over 98% of the messages translated into user-friendly Greek.
 *
 * We hope that it will be used as a tool by other civil society organizations
 * in Greece, and that it will enhance the collective creation and the dissemination
 * of knowledge - an essential component of the democratic process.
 */
+ * Initial translation by Pasok Internet Volunteers
+ * http://forum.pasok.gr
+ * version 1.0 (initial release)
+ *
+ * The project for the translation of MediaWiki into Greek
+ * was undertaken by a group of ICT volunteers working under
+ * the auspices of the Greek political party PASOK.
+ *
+ * The idea behind this effort was  to provide an extensible,
+ * easy-to-use and non-intimidating tool for content development
+ * and project management, to be used throughout the administrative
+ * and political structure of PASOK by staff, volunteers, party members
+ * and elected officials (all of whom possess varying degrees of ICT skills).
+ *
+ * The PASOK ICT team and the volunteers who worked on this project are
+ * now returning the translated interface to the Open-Source Community
+ * with over 98% of the messages translated into user-friendly Greek.
+ *
+ * We hope that it will be used as a tool by other civil society organizations
+ * in Greece, and that it will enhance the collective creation and the dissemination
+ * of knowledge - an essential component of the democratic process.
+ */
 
 $namespaceNames = array(
        NS_MEDIA            => 'Μέσο',
index 6d40d8a..39036d7 100644 (file)
@@ -189,7 +189,6 @@ $dateFormats = array(
  */
 $bookstoreList = array(
        'AddALL' => 'http://www.addall.com/New/Partner.cgi?query=$1&type=ISBN',
-       'PriceSCAN' => 'http://www.pricescan.com/books/bookDetail.asp?isbn=$1',
        'Barnes & Noble' => 'http://search.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=$1',
        'Amazon.com' => 'http://www.amazon.com/gp/search/?field-isbn=$1'
 );
@@ -509,7 +508,7 @@ $linkPrefixCharset = 'a-zA-Z\\x{80}-\\x{10ffff}';
 /**
  * List of filenames for some ui images that can be overridden per language
  * basis if needed.
-*/
+ */
 $imageFiles = array(
        'button-bold'     => 'button_bold.png',
        'button-italic'   => 'button_italic.png',
index f6fda25..49c2cbc 100644 (file)
@@ -143,7 +143,6 @@ $bookstoreList = array(
        'minu Raamat' => 'http://www.raamat.ee/advanced_search_result.php?keywords=$1',
        'Raamatukoi' => 'http://www.raamatukoi.ee/cgi-bin/index?valik=otsing&paring=$1',
        'AddALL' => 'http://www.addall.com/New/Partner.cgi?query=$1&type=ISBN',
-       'PriceSCAN' => 'http://www.pricescan.com/books/bookDetail.asp?isbn=$1',
        'Barnes & Noble' => 'http://search.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=$1',
        'Amazon.com' => 'http://www.amazon.com/exec/obidos/ISBN=$1'
 );
index 773d3a2..48507d4 100644 (file)
@@ -48,7 +48,6 @@ $bookstoreList = array(
        'Barnes & Noble' => 'http://search.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=$1',
        'Bhinneka.com bookstore' => 'http://www.bhinneka.com/Buku/Engine/search.asp?fisbn=$1',
        'Gramedia Cyberstore (via Google)' => 'http://www.google.com/search?q=%22ISBN+:+$1%22+%22product_detail%22+site:www.gramediacyberstore.com+OR+site:www.gramediaonline.com+OR+site:www.kompas.com&hl=id',
-       'PriceSCAN' => 'http://www.pricescan.com/books/bookDetail.asp?isbn=$1',
 );
 
 $magicWords = array(
index 2448648..3b55e9a 100644 (file)
@@ -132,8 +132,6 @@ $dateFormats = array(
         'zh both' => 'Y年n月j日 (D) H時i分',
 );
 
-$linkTrail = '/^([a-z]+)(.*)$/sD';
-
 $digitTransformTable = array(
        '0' => '〇',
        '1' => '一',
index d0bf617..91b30fe 100644 (file)
  */
 
 /**
 * @license http://www.gnu.org/copyleft/fdl.html GNU Free Documentation License
 * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License
 *
 * @see http://meta.wikimedia.org/w/index.php?title=LanguageNn.php&action=history
 * @see http://nn.wikipedia.org/w/index.php?title=Brukar:Dittaeva/LanguageNn.php&action=history
 */
+ * @license http://www.gnu.org/copyleft/fdl.html GNU Free Documentation License
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License
+ *
+ * @see http://meta.wikimedia.org/w/index.php?title=LanguageNn.php&action=history
+ * @see http://nn.wikipedia.org/w/index.php?title=Brukar:Dittaeva/LanguageNn.php&action=history
+ */
 
 
 $datePreferences = array(
index f2052fa..6c55ed0 100644 (file)
@@ -192,5 +192,3 @@ $dateFormats = array(
        'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
 );
 
-$linkTrail = '/^([a-z]+)(.*)$/sD';
-
index a13055b..de694e4 100644 (file)
@@ -101,7 +101,6 @@ $bookstoreList = array(
        'Яндекс.Маркет' => 'http://market.yandex.ru/search.xml?text=$1',
        'Amazon.com' => 'http://www.amazon.com/exec/obidos/ISBN=$1',
        'AddALL' => 'http://www.addall.com/New/Partner.cgi?query=$1&type=ISBN',
-       'PriceSCAN' => 'http://www.pricescan.com/books/bookDetail.asp?isbn=$1',
        'Barnes & Noble' => 'http://shop.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=$1'
 );
 
index 04dfabb..96f640c 100644 (file)
@@ -193,7 +193,6 @@ $specialPageAliases = array(
 
 $bookstoreList = array(
        'AddALL' => 'http://www.addall.com/New/Partner.cgi?query=$1&type=ISBN',
-       'PriceSCAN' => 'http://www.pricescan.com/books/bookDetail.asp?isbn=$1',
        'Barnes & Noble' => 'http://search.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=$1',
        '亞馬遜' => 'http://www.amazon.com/exec/obidos/ISBN=$1',
        '博客來書店' => 'http://www.books.com.tw/exep/prod/booksfile.php?item=$1',
@@ -230,6 +229,3 @@ $dateFormats = array(
        'yue ymd both' => 'Y-n-j H:i',
 );
 
-
-$linkTrail = '/^([a-z]+)(.*)$/sD';
-
index 7f02fe7..b6606f6 100644 (file)
@@ -373,7 +373,6 @@ $dateFormats = array(
 
 $bookstoreList = array(
        'AddALL' => 'http://www.addall.com/New/Partner.cgi?query=$1&type=ISBN',
-       'PriceSCAN' => 'http://www.pricescan.com/books/bookDetail.asp?isbn=$1',
        'Barnes & Noble' => 'http://search.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=$1',
        '亚马逊' => 'http://www.amazon.com/exec/obidos/ISBN=$1',
        '卓越亚马逊' => 'http://www.amazon.cn/mn/advancedSearchApp?isbn=$1',
index 65d57e0..c9ea0f9 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * @author Niklas Laxström, Tim Starling
  *
@@ -54,7 +53,7 @@ class CLDRPluralRuleConverter {
         * for the level 4 operators, since they return boolean and don't accept
         * boolean inputs.
         */
-       static $precedence = array(
+       private static $precedence = array(
                'or' => 2,
                'and' => 3,
                'is' => 4,
@@ -97,6 +96,7 @@ class CLDRPluralRuleConverter {
         */
        public static function convert( $rule ) {
                $parser = new self( $rule );
+
                return $parser->doConvert();
        }
 
@@ -119,13 +119,13 @@ class CLDRPluralRuleConverter {
 
                // Iterate through all tokens, saving the operators and operands to a
                // stack per Dijkstra's shunting yard algorithm.
-               /** @var CLDRPluralRuleConverter_Operator $token */
+               /** @var CLDRPluralRuleConverterOperator $token */
                while ( false !== ( $token = $this->nextToken() ) ) {
                        // In this grammar, there are only binary operators, so every valid
                        // rule string will alternate between operator and operand tokens.
                        $expectOperator = !$expectOperator;
 
-                       if ( $token instanceof CLDRPluralRuleConverter_Expression ) {
+                       if ( $token instanceof CLDRPluralRuleConverterExpression ) {
                                // Operand
                                if ( $expectOperator ) {
                                        $token->error( 'unexpected operand' );
@@ -172,7 +172,7 @@ class CLDRPluralRuleConverter {
        /**
         * Fetch the next token from the input string.
         *
-        * @return CLDRPluralRuleConverter_Fragment The next token
+        * @return CLDRPluralRuleConverterFragment The next token
         */
        protected function nextToken() {
                if ( $this->pos >= $this->end ) {
@@ -192,6 +192,7 @@ class CLDRPluralRuleConverter {
                if ( $length !== 0 ) {
                        $token = $this->newNumber( substr( $this->rule, $this->pos, $length ), $this->pos );
                        $this->pos += $length;
+
                        return $token;
                }
 
@@ -200,6 +201,7 @@ class CLDRPluralRuleConverter {
                if ( $op2 === '..' || $op2 === '!=' ) {
                        $token = $this->newOperator( $op2, $this->pos, 2 );
                        $this->pos += 2;
+
                        return $token;
                }
 
@@ -207,7 +209,8 @@ class CLDRPluralRuleConverter {
                $op1 = $this->rule[$this->pos];
                if ( $op1 === ',' || $op1 === '=' || $op1 === '%' ) {
                        $token = $this->newOperator( $op1, $this->pos, 1 );
-                       $this->pos ++;
+                       $this->pos++;
+
                        return $token;
                }
 
@@ -235,6 +238,7 @@ class CLDRPluralRuleConverter {
                        if ( isset( self::$precedence[$bothWords] ) ) {
                                $token = $this->newOperator( $bothWords, $this->pos, $nextTokenPos - $this->pos );
                                $this->pos = $nextTokenPos;
+
                                return $token;
                        }
                }
@@ -243,13 +247,15 @@ class CLDRPluralRuleConverter {
                if ( isset( self::$precedence[$word1] ) ) {
                        $token = $this->newOperator( $word1, $this->pos, strlen( $word1 ) );
                        $this->pos += strlen( $word1 );
+
                        return $token;
                }
 
                // The single-character operand symbols
                if ( strpos( self::OPERAND_SYMBOLS, $word1 ) !== false ) {
                        $token = $this->newNumber( $word1, $this->pos );
-                       $this->pos ++;
+                       $this->pos++;
+
                        return $token;
                }
 
@@ -258,6 +264,7 @@ class CLDRPluralRuleConverter {
                        // Samples are like comments, they have no effect on rule evaluation.
                        // They run from the first sample indicator to the end of the string.
                        $this->pos = $this->end;
+
                        return false;
                }
 
@@ -269,7 +276,7 @@ class CLDRPluralRuleConverter {
         * a fragment with rpn and type members describing the result of that
         * operation.
         *
-        * @param CLDRPluralRuleConverter_Operator $op
+        * @param CLDRPluralRuleConverterOperator $op
         */
        protected function doOperation( $op ) {
                if ( count( $this->operands ) < 2 ) {
@@ -286,10 +293,10 @@ class CLDRPluralRuleConverter {
         *
         * @param string $text
         * @param int $pos
-        * @return CLDRPluralRuleConverter_Expression The numerical expression
+        * @return CLDRPluralRuleConverterExpression The numerical expression
         */
        protected function newNumber( $text, $pos ) {
-               return new CLDRPluralRuleConverter_Expression( $this, 'number', $text, $pos, strlen( $text ) );
+               return new CLDRPluralRuleConverterExpression( $this, 'number', $text, $pos, strlen( $text ) );
        }
 
        /**
@@ -298,10 +305,10 @@ class CLDRPluralRuleConverter {
         * @param string $type
         * @param int $pos
         * @param int $length
-        * @return CLDRPluralRuleConverter_Operator The operator
+        * @return CLDRPluralRuleConverterOperator The operator
         */
        protected function newOperator( $type, $pos, $length ) {
-               return new CLDRPluralRuleConverter_Operator( $this, $type, $pos, $length );
+               return new CLDRPluralRuleConverterOperator( $this, $type, $pos, $length );
        }
 
        /**
diff --git a/languages/utils/CLDRPluralRuleConverterExpression.php b/languages/utils/CLDRPluralRuleConverterExpression.php
new file mode 100644 (file)
index 0000000..1ee6b4c
--- /dev/null
@@ -0,0 +1,41 @@
+<?php
+/**
+ * @author Niklas Laxström, Tim Starling
+ *
+ * @copyright Copyright © 2010-2012, Niklas Laxström
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ *
+ * @file
+ * @since 1.20
+ */
+
+/**
+ * Helper for CLDRPluralRuleConverter.
+ * An expression object, representing a region of the input string (for error
+ * messages), the RPN notation used to evaluate it, and the result type for
+ * validation.
+ */
+class CLDRPluralRuleConverterExpression extends CLDRPluralRuleConverterFragment {
+       /** @var string */
+       public $type;
+
+       /** @var string */
+       public $rpn;
+
+       function __construct( $parser, $type, $rpn, $pos, $length ) {
+               parent::__construct( $parser, $pos, $length );
+               $this->type = $type;
+               $this->rpn = $rpn;
+       }
+
+       public function isType( $type ) {
+               if ( $type === 'range' && ( $this->type === 'range' || $this->type === 'number' ) ) {
+                       return true;
+               }
+               if ( $type === $this->type ) {
+                       return true;
+               }
+
+               return false;
+       }
+}
diff --git a/languages/utils/CLDRPluralRuleConverterFragment.php b/languages/utils/CLDRPluralRuleConverterFragment.php
new file mode 100644 (file)
index 0000000..df299cb
--- /dev/null
@@ -0,0 +1,34 @@
+<?php
+/**
+ * @author Niklas Laxström, Tim Starling
+ *
+ * @copyright Copyright © 2010-2012, Niklas Laxström
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ *
+ * @file
+ * @since 1.20
+ */
+
+/**
+ * Helper for CLDRPluralRuleConverter.
+ * The base class for operators and expressions, describing a region of the input string.
+ */
+class CLDRPluralRuleConverterFragment {
+       public $parser, $pos, $length, $end;
+
+       function __construct( $parser, $pos, $length ) {
+               $this->parser = $parser;
+               $this->pos = $pos;
+               $this->length = $length;
+               $this->end = $pos + $length;
+       }
+
+       public function error( $message ) {
+               $text = $this->getText();
+               throw new CLDRPluralRuleError( "$message at position " . ( $this->pos + 1 ) . ": \"$text\"" );
+       }
+
+       public function getText() {
+               return substr( $this->parser->rule, $this->pos, $this->length );
+       }
+}
diff --git a/languages/utils/CLDRPluralRuleConverterOperator.php b/languages/utils/CLDRPluralRuleConverterOperator.php
new file mode 100644 (file)
index 0000000..de17f29
--- /dev/null
@@ -0,0 +1,114 @@
+<?php
+/**
+ * @author Niklas Laxström, Tim Starling
+ *
+ * @copyright Copyright © 2010-2012, Niklas Laxström
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ *
+ * @file
+ * @since 1.20
+ */
+
+/**
+ * Helper for CLDRPluralRuleConverter.
+ * An operator object, representing a region of the input string (for error
+ * messages), and the binary operator at that location.
+ */
+class CLDRPluralRuleConverterOperator extends CLDRPluralRuleConverterFragment {
+       /** @var string The name */
+       public $name;
+
+       /**
+        * Each op type has three characters: left operand type, right operand type and result type
+        *
+        *   b = boolean
+        *   n = number
+        *   r = range
+        *
+        * A number is a kind of range.
+        *
+        * @var array
+        */
+       private static $opTypes = array(
+               'or' => 'bbb',
+               'and' => 'bbb',
+               'is' => 'nnb',
+               'is-not' => 'nnb',
+               'in' => 'nrb',
+               'not-in' => 'nrb',
+               'within' => 'nrb',
+               'not-within' => 'nrb',
+               'mod' => 'nnn',
+               ',' => 'rrr',
+               '..' => 'nnr',
+       );
+
+       /**
+        * Map converting from the abbrevation to the full form.
+        *
+        * @var array
+        */
+       private static $typeSpecMap = array(
+               'b' => 'boolean',
+               'n' => 'number',
+               'r' => 'range',
+       );
+
+       /**
+        * Map for converting the new operators introduced in Rev 33 to the old forms
+        */
+       private static $aliasMap = array(
+               '%' => 'mod',
+               '!=' => 'not-in',
+               '=' => 'in'
+       );
+
+       /**
+        * Initialize a new instance of a CLDRPluralRuleConverterOperator object
+        *
+        * @param CLDRPluralRuleConverter $parser The parser
+        * @param string $name The operator name
+        * @param int $pos The length
+        * @param int $length
+        */
+       function __construct( $parser, $name, $pos, $length ) {
+               parent::__construct( $parser, $pos, $length );
+               if ( isset( self::$aliasMap[$name] ) ) {
+                       $name = self::$aliasMap[$name];
+               }
+               $this->name = $name;
+       }
+
+       /**
+        * Compute the operation
+        *
+        * @param CLDRPluralRuleConverterExpression $left The left part of the expression
+        * @param CLDRPluralRuleConverterExpression $right The right part of the expression
+        * @return CLDRPluralRuleConverterExpression The result of the operation
+        */
+       public function operate( $left, $right ) {
+               $typeSpec = self::$opTypes[$this->name];
+
+               $leftType = self::$typeSpecMap[$typeSpec[0]];
+               $rightType = self::$typeSpecMap[$typeSpec[1]];
+               $resultType = self::$typeSpecMap[$typeSpec[2]];
+
+               $start = min( $this->pos, $left->pos, $right->pos );
+               $end = max( $this->end, $left->end, $right->end );
+               $length = $end - $start;
+
+               $newExpr = new CLDRPluralRuleConverterExpression( $this->parser, $resultType,
+                       "{$left->rpn} {$right->rpn} {$this->name}",
+                       $start, $length );
+
+               if ( !$left->isType( $leftType ) ) {
+                       $newExpr->error( "invalid type for left operand: expected $leftType, got {$left->type}" );
+               }
+
+               if ( !$right->isType( $rightType ) ) {
+                       $newExpr->error( "invalid type for right operand: expected $rightType, got {$right->type}" );
+               }
+
+               return $newExpr;
+       }
+}
diff --git a/languages/utils/CLDRPluralRuleConverter_Expression.php b/languages/utils/CLDRPluralRuleConverter_Expression.php
deleted file mode 100644 (file)
index 8352e72..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-
-/**
- * @author Niklas Laxström, Tim Starling
- *
- * @copyright Copyright © 2010-2012, Niklas Laxström
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
- *
- * @file
- * @since 1.20
- */
-
-/**
- * Helper for CLDRPluralRuleConverter.
- * An expression object, representing a region of the input string (for error
- * messages), the RPN notation used to evaluate it, and the result type for
- * validation.
- */
-class CLDRPluralRuleConverter_Expression extends CLDRPluralRuleConverter_Fragment {
-       /** @var string */
-       public $type;
-
-       /** @var string */
-       public $rpn;
-
-       function __construct( $parser, $type, $rpn, $pos, $length ) {
-               parent::__construct( $parser, $pos, $length );
-               $this->type = $type;
-               $this->rpn = $rpn;
-       }
-
-       public function isType( $type ) {
-               if ( $type === 'range' && ( $this->type === 'range' || $this->type === 'number' ) ) {
-                       return true;
-               }
-               if ( $type === $this->type ) {
-                       return true;
-               }
-               return false;
-       }
-}
diff --git a/languages/utils/CLDRPluralRuleConverter_Fragment.php b/languages/utils/CLDRPluralRuleConverter_Fragment.php
deleted file mode 100644 (file)
index 88795a0..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-
-/**
- * @author Niklas Laxström, Tim Starling
- *
- * @copyright Copyright © 2010-2012, Niklas Laxström
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
- *
- * @file
- * @since 1.20
- */
-
-/**
- * Helper for CLDRPluralRuleConverter.
- * The base class for operators and expressions, describing a region of the input string.
- */
-class CLDRPluralRuleConverter_Fragment {
-       public $parser, $pos, $length, $end;
-
-       function __construct( $parser, $pos, $length ) {
-               $this->parser = $parser;
-               $this->pos = $pos;
-               $this->length = $length;
-               $this->end = $pos + $length;
-       }
-
-       public function error( $message ) {
-               $text = $this->getText();
-               throw new CLDRPluralRuleError( "$message at position " . ( $this->pos + 1 ) . ": \"$text\"" );
-       }
-
-       public function getText() {
-               return substr( $this->parser->rule, $this->pos, $this->length );
-       }
-}
diff --git a/languages/utils/CLDRPluralRuleConverter_Operator.php b/languages/utils/CLDRPluralRuleConverter_Operator.php
deleted file mode 100644 (file)
index c42953c..0000000
+++ /dev/null
@@ -1,114 +0,0 @@
-<?php
-
-/**
- * @author Niklas Laxström, Tim Starling
- *
- * @copyright Copyright © 2010-2012, Niklas Laxström
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
- *
- * @file
- * @since 1.20
- */
-
-/**
- * Helper for CLDRPluralRuleConverter.
- * An operator object, representing a region of the input string (for error
- * messages), and the binary operator at that location.
- */
-class CLDRPluralRuleConverter_Operator extends CLDRPluralRuleConverter_Fragment {
-       /** @var string The name */
-       public $name;
-
-       /**
-        * Each op type has three characters: left operand type, right operand type and result type
-        *
-        *   b = boolean
-        *   n = number
-        *   r = range
-        *
-        * A number is a kind of range.
-        *
-        * @var array
-        */
-       static $opTypes = array(
-               'or' => 'bbb',
-               'and' => 'bbb',
-               'is' => 'nnb',
-               'is-not' => 'nnb',
-               'in' => 'nrb',
-               'not-in' => 'nrb',
-               'within' => 'nrb',
-               'not-within' => 'nrb',
-               'mod' => 'nnn',
-               ',' => 'rrr',
-               '..' => 'nnr',
-       );
-
-       /**
-        * Map converting from the abbrevation to the full form.
-        *
-        * @var array
-        */
-       static $typeSpecMap = array(
-               'b' => 'boolean',
-               'n' => 'number',
-               'r' => 'range',
-       );
-
-       /**
-        * Map for converting the new operators introduced in Rev 33 to the old forms
-        */
-       static $aliasMap = array(
-               '%' => 'mod',
-               '!=' => 'not-in',
-               '=' => 'in'
-       );
-
-       /**
-        * Initialize a new instance of a CLDRPluralRuleConverter_Operator object
-        *
-        * @param CLDRPluralRuleConverter $parser The parser
-        * @param string $name The operator name
-        * @param int $pos The length
-        * @param int $length
-        */
-       function __construct( $parser, $name, $pos, $length ) {
-               parent::__construct( $parser, $pos, $length );
-               if ( isset( self::$aliasMap[$name] ) ) {
-                       $name = self::$aliasMap[$name];
-               }
-               $this->name = $name;
-       }
-
-       /**
-        * Compute the operation
-        *
-        * @param CLDRPluralRuleConverter_Expression $left The left part of the expression
-        * @param CLDRPluralRuleConverter_Expression $right The right part of the expression
-        * @return CLDRPluralRuleConverter_Expression The result of the operation
-        */
-       public function operate( $left, $right ) {
-               $typeSpec = self::$opTypes[$this->name];
-
-               $leftType = self::$typeSpecMap[$typeSpec[0]];
-               $rightType = self::$typeSpecMap[$typeSpec[1]];
-               $resultType = self::$typeSpecMap[$typeSpec[2]];
-
-               $start = min( $this->pos, $left->pos, $right->pos );
-               $end = max( $this->end, $left->end, $right->end );
-               $length = $end - $start;
-
-               $newExpr = new CLDRPluralRuleConverter_Expression( $this->parser, $resultType,
-                       "{$left->rpn} {$right->rpn} {$this->name}",
-                       $start, $length );
-
-               if ( !$left->isType( $leftType ) ) {
-                       $newExpr->error( "invalid type for left operand: expected $leftType, got {$left->type}" );
-               }
-
-               if ( !$right->isType( $rightType ) ) {
-                       $newExpr->error( "invalid type for right operand: expected $rightType, got {$right->type}" );
-               }
-               return $newExpr;
-       }
-}
index 2ca3410..cc0b5d2 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * @author Niklas Laxström, Tim Starling
  *
@@ -18,4 +17,4 @@ class CLDRPluralRuleError extends MWException {
        function __construct( $message ) {
                parent::__construct( 'CLDR plural rule error: ' . $message );
        }
-}
\ No newline at end of file
+}
index 61ab947..7e7208a 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+
 /**
  * Parse and evaluate a plural rule.
  *
@@ -30,7 +31,6 @@
  * @file
  * @since 1.20
  */
-
 class CLDRPluralRuleEvaluator {
        /**
         * Evaluate a number against a set of plural rules. If a rule passes,
@@ -42,6 +42,7 @@ class CLDRPluralRuleEvaluator {
         */
        public static function evaluate( $number, array $rules ) {
                $rules = self::compile( $rules );
+
                return self::evaluateCompiled( $number, $rules );
        }
 
@@ -58,6 +59,7 @@ class CLDRPluralRuleEvaluator {
                foreach ( $rules as &$rule ) {
                        $rule = CLDRPluralRuleConverter::convert( $rule );
                }
+
                return $rules;
        }
 
@@ -75,6 +77,7 @@ class CLDRPluralRuleEvaluator {
                $number = strval( $number );
                if ( !preg_match( '/^ -? ( ([0-9]+) (?: \. ([0-9]+) )? )$/x', $number, $m ) ) {
                        wfDebug( __METHOD__ . ": invalid number input, returning 'other'\n" );
+
                        return count( $rules );
                }
                if ( !isset( $m[3] ) ) {
@@ -139,8 +142,8 @@ class CLDRPluralRuleEvaluator {
         */
        private static function doOperation( $token, $left, $right ) {
                if ( in_array( $token, array( 'in', 'not-in', 'within', 'not-within' ) ) ) {
-                       if ( !( $right instanceof CLDRPluralRuleEvaluator_Range ) ) {
-                               $right = new CLDRPluralRuleEvaluator_Range( $right );
+                       if ( !( $right instanceof CLDRPluralRuleEvaluatorRange ) ) {
+                               $right = new CLDRPluralRuleEvaluatorRange( $right );
                        }
                }
                switch ( $token ) {
@@ -164,17 +167,19 @@ class CLDRPluralRuleEvaluator {
                                if ( is_int( $left ) ) {
                                        return (int)fmod( $left, $right );
                                }
+
                                return fmod( $left, $right );
                        case ',':
-                               if ( $left instanceof CLDRPluralRuleEvaluator_Range ) {
+                               if ( $left instanceof CLDRPluralRuleEvaluatorRange ) {
                                        $range = $left;
                                } else {
-                                       $range = new CLDRPluralRuleEvaluator_Range( $left );
+                                       $range = new CLDRPluralRuleEvaluatorRange( $left );
                                }
                                $range->add( $right );
+
                                return $range;
                        case '..':
-                               return new CLDRPluralRuleEvaluator_Range( $left, $right );
+                               return new CLDRPluralRuleEvaluatorRange( $left, $right );
                        default:
                                throw new CLDRPluralRuleError( "Invalid RPN token" );
                }
diff --git a/languages/utils/CLDRPluralRuleEvaluatorRange.php b/languages/utils/CLDRPluralRuleEvaluatorRange.php
new file mode 100644 (file)
index 0000000..996c22e
--- /dev/null
@@ -0,0 +1,110 @@
+<?php
+/**
+ * @author Niklas Laxström, Tim Starling
+ *
+ * @copyright Copyright © 2010-2012, Niklas Laxström
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ *
+ * @file
+ * @since 1.20
+ */
+
+/**
+ * Evaluator helper class representing a range list.
+ */
+class CLDRPluralRuleEvaluatorRange {
+       /**
+        * The parts
+        *
+        * @var array
+        */
+       public $parts = array();
+
+       /**
+        * Initialize a new instance of CLDRPluralRuleEvaluatorRange
+        *
+        * @param int $start The start of the range
+        * @param int|bool $end The end of the range, or false if the range is not bounded.
+        */
+       function __construct( $start, $end = false ) {
+               if ( $end === false ) {
+                       $this->parts[] = $start;
+               } else {
+                       $this->parts[] = array( $start, $end );
+               }
+       }
+
+       /**
+        * Determine if the given number is inside the range.
+        *
+        * @param int $number The number to check
+        * @param bool $integerConstraint If true, also asserts the number is an integer;
+        *   otherwise, number simply has to be inside the range.
+        * @return bool True if the number is inside the range; otherwise, false.
+        */
+       function isNumberIn( $number, $integerConstraint = true ) {
+               foreach ( $this->parts as $part ) {
+                       if ( is_array( $part ) ) {
+                               if ( ( !$integerConstraint || floor( $number ) === (float)$number )
+                                       && $number >= $part[0] && $number <= $part[1]
+                               ) {
+                                       return true;
+                               }
+                       } else {
+                               if ( $number == $part ) {
+                                       return true;
+                               }
+                       }
+               }
+
+               return false;
+       }
+
+       /**
+        * Readable alias for isNumberIn( $number, false ), and the implementation
+        * of the "within" operator.
+        *
+        * @param int $number The number to check
+        * @return bool True if the number is inside the range; otherwise, false.
+        */
+       function isNumberWithin( $number ) {
+               return $this->isNumberIn( $number, false );
+       }
+
+       /**
+        * Add another part to this range.
+        *
+        * @param CLDRPluralRuleEvaluatorRange|int $other The part to add, either
+        *   a range object itself or a single number.
+        */
+       function add( $other ) {
+               if ( $other instanceof self ) {
+                       $this->parts = array_merge( $this->parts, $other->parts );
+               } else {
+                       $this->parts[] = $other;
+               }
+       }
+
+       /**
+        * Returns the string representation of the rule evaluator range.
+        * The purpose of this method is to help debugging.
+        *
+        * @return string The string representation of the rule evaluator range
+        */
+       function __toString() {
+               $s = 'Range(';
+               foreach ( $this->parts as $i => $part ) {
+                       if ( $i ) {
+                               $s .= ', ';
+                       }
+                       if ( is_array( $part ) ) {
+                               $s .= $part[0] . '..' . $part[1];
+                       } else {
+                               $s .= $part;
+                       }
+               }
+               $s .= ')';
+
+               return $s;
+       }
+}
diff --git a/languages/utils/CLDRPluralRuleEvaluator_Range.php b/languages/utils/CLDRPluralRuleEvaluator_Range.php
deleted file mode 100644 (file)
index 9732b8d..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-<?php
-/**
- * @author Niklas Laxström, Tim Starling
- *
- * @copyright Copyright © 2010-2012, Niklas Laxström
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
- *
- * @file
- * @since 1.20
- */
-
-/**
- * Evaluator helper class representing a range list.
- */
-class CLDRPluralRuleEvaluator_Range {
-       /**
-        * The parts
-        *
-        * @var array
-        */
-       public $parts = array();
-
-       /**
-        * Initialize a new instance of CLDRPluralRuleEvaluator_Range
-        *
-        * @param int $start The start of the range
-        * @param int|bool $end The end of the range, or false if the range is not bounded.
-        */
-       function __construct( $start, $end = false ) {
-               if ( $end === false ) {
-                       $this->parts[] = $start;
-               } else {
-                       $this->parts[] = array( $start, $end );
-               }
-       }
-
-       /**
-        * Determine if the given number is inside the range.
-        *
-        * @param int $number The number to check
-        * @param bool $integerConstraint If true, also asserts the number is an integer; otherwise, number simply has to be inside the range.
-        * @return bool True if the number is inside the range; otherwise, false.
-        */
-       function isNumberIn( $number, $integerConstraint = true ) {
-               foreach ( $this->parts as $part ) {
-                       if ( is_array( $part ) ) {
-                               if ( ( !$integerConstraint || floor( $number ) === (float)$number )
-                                       && $number >= $part[0] && $number <= $part[1]
-                               ) {
-                                       return true;
-                               }
-                       } else {
-                               if ( $number == $part ) {
-                                       return true;
-                               }
-                       }
-               }
-               return false;
-       }
-
-       /**
-        * Readable alias for isNumberIn( $number, false ), and the implementation
-        * of the "within" operator.
-        *
-        * @param int $number The number to check
-        * @return bool True if the number is inside the range; otherwise, false.
-        */
-       function isNumberWithin( $number ) {
-               return $this->isNumberIn( $number, false );
-       }
-
-       /**
-        * Add another part to this range.
-        *
-        * @param CLDRPluralRuleEvaluator_Range|int $other The part to add, either
-        *   a range object itself or a single number.
-        */
-       function add( $other ) {
-               if ( $other instanceof self ) {
-                       $this->parts = array_merge( $this->parts, $other->parts );
-               } else {
-                       $this->parts[] = $other;
-               }
-       }
-
-       /**
-        * Returns the string representation of the rule evaluator range.
-        * The purpose of this method is to help debugging.
-        *
-        * @return string The string representation of the rule evaluator range
-        */
-       function __toString() {
-               $s = 'Range(';
-               foreach ( $this->parts as $i => $part ) {
-                       if ( $i ) {
-                               $s .= ', ';
-                       }
-                       if ( is_array( $part ) ) {
-                               $s .= $part[0] . '..' . $part[1];
-                       } else {
-                               $s .= $part;
-                       }
-               }
-               $s .= ')';
-               return $s;
-       }
-
-}
index 02156c7..751a131 100644 (file)
@@ -36,6 +36,7 @@ class SevenZipStream {
 
        private function stripPath( $path ) {
                $prefix = 'mediawiki.compress.7z://';
+
                return substr( $path, strlen( $prefix ) );
        }
 
@@ -91,4 +92,5 @@ class SevenZipStream {
                return fseek( $this->stream, $offset, $whence );
        }
 }
+
 stream_wrapper_register( 'mediawiki.compress.7z', 'SevenZipStream' );
index 5c05b1e..e316d9e 100644 (file)
@@ -49,7 +49,6 @@ $maintClass = false;
  * @ingroup Maintenance
  */
 abstract class Maintenance {
-
        /**
         * Constants for DB access type
         * @see Maintenance::getDbType()
@@ -151,6 +150,7 @@ abstract class Maintenance {
                                return false; // previous calls should all be "requires"
                        }
                }
+
                return true;
        }
 
@@ -169,8 +169,16 @@ abstract class Maintenance {
         * @param bool $withArg Is an argument required with this option?
         * @param string $shortName Character to use as short name
         */
-       protected function addOption( $name, $description, $required = false, $withArg = false, $shortName = false ) {
-               $this->mParams[$name] = array( 'desc' => $description, 'require' => $required, 'withArg' => $withArg, 'shortName' => $shortName );
+       protected function addOption( $name, $description, $required = false,
+               $withArg = false, $shortName = false
+       ) {
+               $this->mParams[$name] = array(
+                       'desc' => $description,
+                       'require' => $required,
+                       'withArg' => $withArg,
+                       'shortName' => $shortName
+               );
+
                if ( $shortName !== false ) {
                        $this->mShortParamsMap[$shortName] = $name;
                }
@@ -197,6 +205,7 @@ abstract class Maintenance {
                } else {
                        // Set it so we don't have to provide the default again
                        $this->mOptions[$name] = $default;
+
                        return $this->mOptions[$name];
                }
        }
@@ -296,6 +305,7 @@ abstract class Maintenance {
                }
                $input = fgets( $f, $len );
                fclose( $f );
+
                return rtrim( $input );
        }
 
@@ -368,6 +378,7 @@ abstract class Maintenance {
        public function outputChanneled( $msg, $channel = null ) {
                if ( $msg === false ) {
                        $this->cleanupChanneled();
+
                        return;
                }
 
@@ -413,10 +424,14 @@ abstract class Maintenance {
                $this->addOption( 'conf', 'Location of LocalSettings.php, if not default', false, true );
                $this->addOption( 'wiki', 'For specifying the wiki ID', false, true );
                $this->addOption( 'globals', 'Output globals at the end of processing for debugging' );
-               $this->addOption( 'memory-limit', 'Set a specific memory limit for the script, "max" for no limit or "default" to avoid changing it' );
+               $this->addOption(
+                       'memory-limit',
+                       'Set a specific memory limit for the script, '
+                               . '"max" for no limit or "default" to avoid changing it'
+               );
                $this->addOption( 'server', "The protocol and server name to use in URLs, e.g. " .
-                               "http://en.wikipedia.org. This is sometimes necessary because " .
-                               "server name detection may fail in command line scripts.", false, true );
+                       "http://en.wikipedia.org. This is sometimes necessary because " .
+                       "server name detection may fail in command line scripts.", false, true );
                $this->addOption( 'profiler', 'Set to "text" or "trace" to show profiling output', false, true );
 
                # Save generic options to display them separately in help
@@ -461,6 +476,7 @@ abstract class Maintenance {
                if ( !is_null( $this->mDb ) ) {
                        $child->setDB( $this->mDb );
                }
+
                return $child;
        }
 
@@ -585,6 +601,7 @@ abstract class Maintenance {
                # it's run again and again
                if ( $this->mInputLoaded ) {
                        $this->loadSpecialVars();
+
                        return;
                }
 
@@ -630,8 +647,9 @@ abstract class Maintenance {
                                }
                        } elseif ( substr( $arg, 0, 1 ) == '-' ) {
                                # Short options
-                               for ( $p = 1; $p < strlen( $arg ); $p++ ) {
-                                       $option = $arg { $p };
+                               $argLength = strlen( $arg );
+                               for ( $p = 1; $p < $argLength; $p++ ) {
+                                       $option = $arg[$p];
                                        if ( !isset( $this->mParams[$option] ) && isset( $this->mShortParamsMap[$option] ) ) {
                                                $option = $this->mShortParamsMap[$option];
                                        }
@@ -713,7 +731,7 @@ abstract class Maintenance {
                        return;
                }
 
-               $screenWidth = 80; // TODO: Caculate this!
+               $screenWidth = 80; // TODO: Calculate this!
                $tab = "    ";
                $descWidth = $screenWidth - ( 2 * strlen( $tab ) );
 
@@ -757,7 +775,7 @@ abstract class Maintenance {
                        }
                        $this->output(
                                wordwrap( "$tab--$par: " . $info['desc'], $descWidth,
-                                               "\n$tab$tab" ) . "\n"
+                                       "\n$tab$tab" ) . "\n"
                        );
                }
                $this->output( "\n" );
@@ -772,7 +790,7 @@ abstract class Maintenance {
                                }
                                $this->output(
                                        wordwrap( "$tab--$par: " . $info['desc'], $descWidth,
-                                                       "\n$tab$tab" ) . "\n"
+                                               "\n$tab$tab" ) . "\n"
                                );
                        }
                        $this->output( "\n" );
@@ -796,7 +814,7 @@ abstract class Maintenance {
                                }
                                $this->output(
                                        wordwrap( "$tab--$par: " . $info['desc'], $descWidth,
-                                                       "\n$tab$tab" ) . "\n"
+                                               "\n$tab$tab" ) . "\n"
                                );
                        }
                        $this->output( "\n" );
@@ -871,7 +889,12 @@ abstract class Maintenance {
                $this->afterFinalSetup();
 
                $wgShowSQLErrors = true;
+
+               // @codingStandardsIgnoreStart Allow error supppression. wfSuppressWarnings()
+               // is not avaiable.
                @set_time_limit( 0 );
+               // @codingStandardsIgnoreStart
+
                $this->adjustMemoryLimit();
 
                // Per-script profiling; useful for debugging
@@ -929,10 +952,11 @@ abstract class Maintenance {
 
                if ( !is_readable( $settingsFile ) ) {
                        $this->error( "A copy of your installation's LocalSettings.php\n" .
-                                               "must exist and be readable in the source directory.\n" .
-                                               "Use --conf to specify it.", true );
+                               "must exist and be readable in the source directory.\n" .
+                               "Use --conf to specify it.", true );
                }
                $wgCommandLineMode = true;
+
                return $settingsFile;
        }
 
@@ -1086,7 +1110,6 @@ abstract class Maintenance {
                        $this->unlockSearchindex( $dbw );
                        $this->output( "\n" );
                }
-
        }
 
        /**
@@ -1108,6 +1131,7 @@ abstract class Maintenance {
                        $u->doUpdate();
                        $this->output( "\n" );
                }
+
                return $title;
        }
 
@@ -1154,6 +1178,7 @@ abstract class Maintenance {
                                return false;
                        }
                        $resp = trim( $st );
+
                        return $resp;
                }
        }
@@ -1189,6 +1214,7 @@ abstract class Maintenance {
                        return false;
                }
                print $prompt;
+
                return fgets( STDIN, 1024 );
        }
 }
@@ -1198,6 +1224,7 @@ abstract class Maintenance {
  */
 class FakeMaintenance extends Maintenance {
        protected $mSelf = "FakeMaintenanceScript";
+
        public function execute() {
                return;
        }
@@ -1222,6 +1249,7 @@ abstract class LoggedUpdateMaintenance extends Maintenance {
                        && $db->selectRow( 'updatelog', '1', array( 'ul_key' => $key ), __METHOD__ )
                ) {
                        $this->output( "..." . $this->updateSkippedMessage() . "\n" );
+
                        return true;
                }
 
@@ -1233,6 +1261,7 @@ abstract class LoggedUpdateMaintenance extends Maintenance {
                        return true;
                } else {
                        $this->output( $this->updatelogFailedMessage() . "\n" );
+
                        return false;
                }
        }
@@ -1243,6 +1272,7 @@ abstract class LoggedUpdateMaintenance extends Maintenance {
         */
        protected function updateSkippedMessage() {
                $key = $this->getUpdateKey();
+
                return "Update '{$key}' already logged as completed.";
        }
 
@@ -1252,6 +1282,7 @@ abstract class LoggedUpdateMaintenance extends Maintenance {
         */
        protected function updatelogFailedMessage() {
                $key = $this->getUpdateKey();
+
                return "Unable to log update '{$key}' as completed.";
        }
 
diff --git a/maintenance/archives/patch-drop-rc_cur_time.sql b/maintenance/archives/patch-drop-rc_cur_time.sql
new file mode 100644 (file)
index 0000000..f1bc9e8
--- /dev/null
@@ -0,0 +1,2 @@
+-- rc_cur_time is no longer used, delete the field
+ALTER TABLE /*$wgDBprefix*/recentchanges DROP COLUMN rc_cur_time;
\ No newline at end of file
diff --git a/maintenance/archives/patch-pp_sortkey.sql b/maintenance/archives/patch-pp_sortkey.sql
new file mode 100644 (file)
index 0000000..b13b605
--- /dev/null
@@ -0,0 +1,8 @@
+-- Add a 'sortkey' field to page_props so pages can be efficiently
+-- queried by the numeric value of a property.
+
+ALTER TABLE /*_*/page_props
+        ADD pp_sortkey float DEFAULT NULL;
+
+CREATE UNIQUE INDEX /*i*/pp_propname_sortkey_page
+        ON /*_*/page_props ( pp_propname, pp_sortkey, pp_page );
index 0749bbf..9ac204d 100644 (file)
@@ -52,6 +52,7 @@ class UpdateLogging {
 
                if ( $this->dbw->tableExists( 'logging_pre_1_10' ) ) {
                        echo "This script has already been run to completion\n";
+
                        return;
                }
 
@@ -158,7 +159,7 @@ EOT;
                        $srcRes = $this->dbw->select( $srcTable, '*', $conds, __METHOD__,
                                array( 'LIMIT' => $batchSize, 'ORDER BY' => 'log_timestamp' ) );
 
-                       if ( ! $srcRes->numRows() ) {
+                       if ( !$srcRes->numRows() ) {
                                # All done
                                break;
                        }
@@ -205,6 +206,7 @@ EOT;
                                }
                        }
                }
+
                return $numRowsCopied;
        }
 }
index 3333408..fba6b92 100644 (file)
@@ -33,7 +33,6 @@ require_once __DIR__ . '/Maintenance.php';
  * @ingroup Maintenance
  */
 class AttachLatest extends Maintenance {
-
        public function __construct() {
                parent::__construct();
                $this->addOption( "fix", "Actually fix the entries, will dry run otherwise" );
@@ -70,7 +69,8 @@ class AttachLatest extends Maintenance {
 
                        $revision = Revision::loadFromTimestamp( $dbw, $title, $latestTime );
                        if ( is_null( $revision ) ) {
-                               $this->output( wfWikiID() . " $pageId [[$name]] latest time $latestTime, can't find revision id\n" );
+                               $this->output( wfWikiID()
+                                       . " $pageId [[$name]] latest time $latestTime, can't find revision id\n" );
                                continue;
                        }
                        $id = $revision->getId();
index 323a870..222c538 100644 (file)
@@ -37,28 +37,30 @@ class DumpDBZip2Output extends DumpPipeOutput {
  * @ingroup Dump Maintenance
  */
 class BackupDumper {
-       var $reportingInterval = 100;
-       var $reporting = true;
-       var $pageCount = 0;
-       var $revCount = 0;
-       var $server = null; // use default
-       var $pages = null; // all pages
-       var $skipHeader = false; // don't output <mediawiki> and <siteinfo>
-       var $skipFooter = false; // don't output </mediawiki>
-       var $startId = 0;
-       var $endId = 0;
-       var $revStartId = 0;
-       var $revEndId = 0;
-       var $sink = null; // Output filters
-       var $stubText = false; // include rev_text_id instead of text; for 2-pass dump
-       var $dumpUploads = false;
-       var $dumpUploadFileContents = false;
-       var $lastTime = 0;
-       var $pageCountLast = 0;
-       var $revCountLast = 0;
-       var $ID = 0;
-
-       var $outputTypes = array(), $filterTypes = array();
+       public $reporting = true;
+       public $pages = null; // all pages
+       public $skipHeader = false; // don't output <mediawiki> and <siteinfo>
+       public $skipFooter = false; // don't output </mediawiki>
+       public $startId = 0;
+       public $endId = 0;
+       public $revStartId = 0;
+       public $revEndId = 0;
+       public $dumpUploads = false;
+       public $dumpUploadFileContents = false;
+
+       protected $reportingInterval = 100;
+       protected $pageCount = 0;
+       protected $revCount = 0;
+       protected $server = null; // use default
+       protected $sink = null; // Output filters
+       protected $lastTime = 0;
+       protected $pageCountLast = 0;
+       protected $revCountLast = 0;
+
+       protected $outputTypes = array();
+       protected $filterTypes = array();
+
+       protected $ID = 0;
 
        /**
         * The dependency-injected database to use.
@@ -69,11 +71,12 @@ class BackupDumper {
         */
        protected $forcedDb = null;
 
-       /**
-        * @var LoadBalancer
-        */
+       /** @var LoadBalancer */
        protected $lb;
 
+       // @todo Unused?
+       private $stubText = false; // include rev_text_id instead of text; for 2-pass dump
+
        function __construct( $args ) {
                $this->stderr = fopen( "php://stderr", "wt" );
 
@@ -132,50 +135,53 @@ class BackupDumper {
                foreach ( $args as $arg ) {
                        $matches = array();
                        if ( preg_match( '/^--(.+?)(?:=(.+?)(?::(.+?))?)?$/', $arg, $matches ) ) {
-                               @list( /* $full */ , $opt, $val, $param ) = $matches;
+                               wfSuppressWarnings();
+                               list( /* $full */, $opt, $val, $param ) = $matches;
+                               wfRestoreWarnings();
+
                                switch ( $opt ) {
-                               case "plugin":
-                                       $this->loadPlugin( $val, $param );
-                                       break;
-                               case "output":
-                                       if ( !is_null( $sink ) ) {
-                                               $sinks[] = $sink;
-                                       }
-                                       if ( !isset( $this->outputTypes[$val] ) ) {
-                                               $this->fatalError( "Unrecognized output sink type '$val'" );
-                                       }
-                                       $type = $this->outputTypes[$val];
-                                       $sink = new $type( $param );
-                                       break;
-                               case "filter":
-                                       if ( is_null( $sink ) ) {
-                                               $sink = new DumpOutput();
-                                       }
-                                       if ( !isset( $this->filterTypes[$val] ) ) {
-                                               $this->fatalError( "Unrecognized filter type '$val'" );
-                                       }
-                                       $type = $this->filterTypes[$val];
-                                       $filter = new $type( $sink, $param );
-
-                                       // references are lame in php...
-                                       unset( $sink );
-                                       $sink = $filter;
-
-                                       break;
-                               case "report":
-                                       $this->reportingInterval = intval( $val );
-                                       break;
-                               case "server":
-                                       $this->server = $val;
-                                       break;
-                               case "force-normal":
-                                       if ( !function_exists( 'utf8_normalize' ) ) {
-                                               $this->fatalError( "UTF-8 normalization extension not loaded. " .
-                                                       "Install or remove --force-normal parameter to use slower code." );
-                                       }
-                                       break;
-                               default:
-                                       $this->processOption( $opt, $val, $param );
+                                       case "plugin":
+                                               $this->loadPlugin( $val, $param );
+                                               break;
+                                       case "output":
+                                               if ( !is_null( $sink ) ) {
+                                                       $sinks[] = $sink;
+                                               }
+                                               if ( !isset( $this->outputTypes[$val] ) ) {
+                                                       $this->fatalError( "Unrecognized output sink type '$val'" );
+                                               }
+                                               $type = $this->outputTypes[$val];
+                                               $sink = new $type( $param );
+                                               break;
+                                       case "filter":
+                                               if ( is_null( $sink ) ) {
+                                                       $sink = new DumpOutput();
+                                               }
+                                               if ( !isset( $this->filterTypes[$val] ) ) {
+                                                       $this->fatalError( "Unrecognized filter type '$val'" );
+                                               }
+                                               $type = $this->filterTypes[$val];
+                                               $filter = new $type( $sink, $param );
+
+                                               // references are lame in php...
+                                               unset( $sink );
+                                               $sink = $filter;
+
+                                               break;
+                                       case "report":
+                                               $this->reportingInterval = intval( $val );
+                                               break;
+                                       case "server":
+                                               $this->server = $val;
+                                               break;
+                                       case "force-normal":
+                                               if ( !function_exists( 'utf8_normalize' ) ) {
+                                                       $this->fatalError( "UTF-8 normalization extension not loaded. " .
+                                                               "Install or remove --force-normal parameter to use slower code." );
+                                               }
+                                               break;
+                                       default:
+                                               $this->processOption( $opt, $val, $param );
                                }
                        }
                }
@@ -223,8 +229,8 @@ class BackupDumper {
                        } else {
                                $exporter->allLogs();
                        }
-               # Page dumps: all or by page ID range
                } elseif ( is_null( $this->pages ) ) {
+                       # Page dumps: all or by page ID range
                        if ( $this->startId || $this->endId ) {
                                $exporter->pagesByRange( $this->startId, $this->endId );
                        } elseif ( $this->revStartId || $this->revEndId ) {
@@ -232,8 +238,8 @@ class BackupDumper {
                        } else {
                                $exporter->allPages();
                        }
-               # Dump of specific pages
                } else {
+                       # Dump of specific pages
                        $exporter->pagesByName( $this->pages );
                }
 
@@ -304,6 +310,7 @@ class BackupDumper {
 
        function backupServer() {
                global $wgDBserver;
+
                return $this->server
                        ? $this->server
                        : $wgDBserver;
@@ -351,8 +358,13 @@ class BackupDumper {
                                $pageRatePart = '-';
                                $revRatePart = '-';
                        }
-                       $this->progress( sprintf( "%s: %s (ID %d) %d pages (%0.1f|%0.1f/sec all|curr), %d revs (%0.1f|%0.1f/sec all|curr), ETA %s [max %d]",
-                                       $now, wfWikiID(), $this->ID, $this->pageCount, $pageRate, $pageRatePart, $this->revCount, $revRate, $revRatePart, $etats, $this->maxCount ) );
+                       $this->progress( sprintf(
+                               "%s: %s (ID %d) %d pages (%0.1f|%0.1f/sec all|curr), "
+                                       . "%d revs (%0.1f|%0.1f/sec all|curr), ETA %s [max %d]",
+                               $now, wfWikiID(), $this->ID, $this->pageCount, $pageRate,
+                               $pageRatePart, $this->revCount, $revRate, $revRatePart, $etats,
+                               $this->maxCount
+                       ) );
                        $this->lastTime = $nowts;
                        $this->revCountLast = $this->revCount;
                }
index 6d41c18..7bfb734 100644 (file)
  * @ingroup Maintenance
  */
 class BaseDump {
-       var $reader = null;
-       var $atEnd = false;
-       var $atPageEnd = false;
-       var $lastPage = 0;
-       var $lastRev = 0;
-       var $infiles = null;
-
-       function BaseDump( $infile ) {
+       protected $reader = null;
+       protected $atEnd = false;
+       protected $atPageEnd = false;
+       protected $lastPage = 0;
+       protected $lastRev = 0;
+       protected $infiles = null;
+
+       public function __construct( $infile ) {
                $this->infiles = explode( ';', $infile );
                $this->reader = new XMLReader();
                $infile = array_shift( $this->infiles );
                if ( defined( 'LIBXML_PARSEHUGE' ) ) {
                        $this->reader->open( $infile, null, LIBXML_PARSEHUGE );
-               }
-               else {
+               } else {
                        $this->reader->open( $infile );
                }
        }
@@ -76,18 +75,24 @@ class BaseDump {
                        $this->nextPage();
                }
                if ( $this->lastPage > $page || $this->atEnd ) {
-                       $this->debug( "BaseDump::prefetch already past page $page looking for rev $rev  [$this->lastPage, $this->lastRev]" );
+                       $this->debug( "BaseDump::prefetch already past page $page "
+                               . "looking for rev $rev  [$this->lastPage, $this->lastRev]" );
+
                        return null;
                }
                while ( $this->lastRev < $rev && !$this->atEnd && !$this->atPageEnd ) {
-                       $this->debug( "BaseDump::prefetch at page $this->lastPage, rev $this->lastRev, looking for $page, $rev" );
+                       $this->debug( "BaseDump::prefetch at page $this->lastPage, rev $this->lastRev, "
+                               . "looking for $page, $rev" );
                        $this->nextRev();
                }
                if ( $this->lastRev == $rev && !$this->atEnd ) {
                        $this->debug( "BaseDump::prefetch hit on $page, $rev [$this->lastPage, $this->lastRev]" );
+
                        return $this->nextText();
                } else {
-                       $this->debug( "BaseDump::prefetch already past rev $rev on page $page  [$this->lastPage, $this->lastRev]" );
+                       $this->debug( "BaseDump::prefetch already past rev $rev on page $page "
+                               . "[$this->lastPage, $this->lastRev]" );
+
                        return null;
                }
        }
@@ -137,6 +142,7 @@ class BaseDump {
         */
        function nextText() {
                $this->skipTo( 'text' );
+
                return strval( $this->nodeContents() );
        }
 
@@ -151,16 +157,20 @@ class BaseDump {
                        return false;
                }
                while ( $this->reader->read() ) {
-                       if ( $this->reader->nodeType == XMLReader::ELEMENT &&
-                               $this->reader->name == $name ) {
+                       if ( $this->reader->nodeType == XMLReader::ELEMENT
+                               && $this->reader->name == $name
+                       ) {
                                return true;
                        }
-                       if ( $this->reader->nodeType == XMLReader::END_ELEMENT &&
-                               $this->reader->name == $parent ) {
+                       if ( $this->reader->nodeType == XMLReader::END_ELEMENT
+                               && $this->reader->name == $parent
+                       ) {
                                $this->debug( "BaseDump::skipTo found </$parent> searching for <$name>" );
+
                                return false;
                        }
                }
+
                return $this->close();
        }
 
@@ -182,15 +192,16 @@ class BaseDump {
                $buffer = "";
                while ( $this->reader->read() ) {
                        switch ( $this->reader->nodeType ) {
-                       case XMLReader::TEXT:
-//                     case XMLReader::WHITESPACE:
-                       case XMLReader::SIGNIFICANT_WHITESPACE:
-                               $buffer .= $this->reader->value;
-                               break;
-                       case XMLReader::END_ELEMENT:
-                               return $buffer;
+                               case XMLReader::TEXT:
+                               //case XMLReader::WHITESPACE:
+                               case XMLReader::SIGNIFICANT_WHITESPACE:
+                                       $buffer .= $this->reader->value;
+                                       break;
+                               case XMLReader::END_ELEMENT:
+                                       return $buffer;
                        }
                }
+
                return $this->close();
        }
 
@@ -201,6 +212,7 @@ class BaseDump {
        function close() {
                $this->reader->close();
                $this->atEnd = true;
+
                return null;
        }
 }
index d210c3a..7fca377 100644 (file)
@@ -30,52 +30,54 @@ require_once __DIR__ . '/backup.inc';
  * @ingroup Maintenance
  */
 class TextPassDumper extends BackupDumper {
-       var $prefetch = null;
-       var $input = "php://stdin";
-       var $history = WikiExporter::FULL;
-       var $fetchCount = 0;
-       var $prefetchCount = 0;
-       var $prefetchCountLast = 0;
-       var $fetchCountLast = 0;
+       public $prefetch = null;
 
-       var $maxFailures = 5;
-       var $maxConsecutiveFailedTextRetrievals = 200;
-       var $failureTimeout = 5; // Seconds to sleep after db failure
+       // when we spend more than maxTimeAllowed seconds on this run, we continue
+       // processing until we write out the next complete page, then save output file(s),
+       // rename it/them and open new one(s)
+       public $maxTimeAllowed = 0; // 0 = no limit
+
+       protected $input = "php://stdin";
+       protected $history = WikiExporter::FULL;
+       protected $fetchCount = 0;
+       protected $prefetchCount = 0;
+       protected $prefetchCountLast = 0;
+       protected $fetchCountLast = 0;
+
+       protected $maxFailures = 5;
+       protected $maxConsecutiveFailedTextRetrievals = 200;
+       protected $failureTimeout = 5; // Seconds to sleep after db failure
 
-       var $php = "php";
-       var $spawn = false;
+       protected $php = "php";
+       protected $spawn = false;
 
        /**
         * @var bool|resource
         */
-       var $spawnProc = false;
+       protected $spawnProc = false;
 
        /**
         * @var bool|resource
         */
-       var $spawnWrite = false;
+       protected $spawnWrite = false;
 
        /**
         * @var bool|resource
         */
-       var $spawnRead = false;
+       protected $spawnRead = false;
 
        /**
         * @var bool|resource
         */
-       var $spawnErr = false;
+       protected $spawnErr = false;
 
-       var $xmlwriterobj = false;
+       protected $xmlwriterobj = false;
 
-       // when we spend more than maxTimeAllowed seconds on this run, we continue
-       // processing until we write out the next complete page, then save output file(s),
-       // rename it/them and open new one(s)
-       var $maxTimeAllowed = 0;  // 0 = no limit
-       var $timeExceeded = false;
-       var $firstPageWritten = false;
-       var $lastPageWritten = false;
-       var $checkpointJustWritten = false;
-       var $checkpointFiles = array();
+       protected $timeExceeded = false;
+       protected $firstPageWritten = false;
+       protected $lastPageWritten = false;
+       protected $checkpointJustWritten = false;
+       protected $checkpointFiles = array();
 
        /**
         * @var DatabaseBase
@@ -102,6 +104,7 @@ class TextPassDumper extends BackupDumper {
 
                if ( $this->forcedDb !== null ) {
                        $this->db = $this->forcedDb;
+
                        return;
                }
 
@@ -119,14 +122,16 @@ class TextPassDumper extends BackupDumper {
                try {
                        $this->lb = wfGetLBFactory()->newMainLB();
                } catch ( Exception $e ) {
-                       throw new MWException( __METHOD__ . " rotating DB failed to obtain new load balancer (" . $e->getMessage() . ")" );
+                       throw new MWException( __METHOD__
+                               . " rotating DB failed to obtain new load balancer (" . $e->getMessage() . ")" );
                }
 
                // 2. The Connection, through the load balancer.
                try {
                        $this->db = $this->lb->getConnection( DB_SLAVE, 'dump' );
                } catch ( Exception $e ) {
-                       throw new MWException( __METHOD__ . " rotating DB failed to obtain new database (" . $e->getMessage() . ")" );
+                       throw new MWException( __METHOD__
+                               . " rotating DB failed to obtain new database (" . $e->getMessage() . ")" );
                }
        }
 
@@ -181,31 +186,31 @@ class TextPassDumper extends BackupDumper {
                $url = $this->processFileOpt( $val, $param );
 
                switch ( $opt ) {
-               case 'prefetch':
-                       require_once "$IP/maintenance/backupPrefetch.inc";
-                       $this->prefetch = new BaseDump( $url );
-                       break;
-               case 'stub':
-                       $this->input = $url;
-                       break;
-               case 'maxtime':
-                       $this->maxTimeAllowed = intval( $val ) * 60;
-                       break;
-               case 'checkpointfile':
-                       $this->checkpointFiles[] = $val;
-                       break;
-               case 'current':
-                       $this->history = WikiExporter::CURRENT;
-                       break;
-               case 'full':
-                       $this->history = WikiExporter::FULL;
-                       break;
-               case 'spawn':
-                       $this->spawn = true;
-                       if ( $val ) {
-                               $this->php = $val;
-                       }
-                       break;
+                       case 'prefetch':
+                               require_once "$IP/maintenance/backupPrefetch.inc";
+                               $this->prefetch = new BaseDump( $url );
+                               break;
+                       case 'stub':
+                               $this->input = $url;
+                               break;
+                       case 'maxtime':
+                               $this->maxTimeAllowed = intval( $val ) * 60;
+                               break;
+                       case 'checkpointfile':
+                               $this->checkpointFiles[] = $val;
+                               break;
+                       case 'current':
+                               $this->history = WikiExporter::CURRENT;
+                               break;
+                       case 'full':
+                               $this->history = WikiExporter::FULL;
+                               break;
+                       case 'spawn':
+                               $this->spawn = true;
+                               if ( $val ) {
+                                       $this->php = $val;
+                               }
+                               break;
                }
        }
 
@@ -231,6 +236,7 @@ class TextPassDumper extends BackupDumper {
                        $newFileURIs[] = $newURI;
                }
                $val = implode( ';', $newFileURIs );
+
                return $val;
        }
 
@@ -240,6 +246,7 @@ class TextPassDumper extends BackupDumper {
        function showReport() {
                if ( !$this->prefetch ) {
                        parent::showReport();
+
                        return;
                }
 
@@ -276,14 +283,19 @@ class TextPassDumper extends BackupDumper {
                                }
                                $pageRatePart = $this->pageCountPart / $deltaPart;
                                $revRatePart = $this->revCountPart / $deltaPart;
-
                        } else {
                                $fetchRatePart = '-';
                                $pageRatePart = '-';
                                $revRatePart = '-';
                        }
-                       $this->progress( sprintf( "%s: %s (ID %d) %d pages (%0.1f|%0.1f/sec all|curr), %d revs (%0.1f|%0.1f/sec all|curr), %0.1f%%|%0.1f%% prefetched (all|curr), ETA %s [max %d]",
-                                       $now, wfWikiID(), $this->ID, $this->pageCount, $pageRate, $pageRatePart, $this->revCount, $revRate, $revRatePart, $fetchRate, $fetchRatePart, $etats, $this->maxCount ) );
+                       $this->progress( sprintf(
+                               "%s: %s (ID %d) %d pages (%0.1f|%0.1f/sec all|curr), "
+                                       . "%d revs (%0.1f|%0.1f/sec all|curr), %0.1f%%|%0.1f%% "
+                                       . "prefetched (all|curr), ETA %s [max %d]",
+                               $now, wfWikiID(), $this->ID, $this->pageCount, $pageRate,
+                               $pageRatePart, $this->revCount, $revRate, $revRatePart,
+                               $fetchRate, $fetchRatePart, $etats, $this->maxCount
+                       ) );
                        $this->lastTime = $nowts;
                        $this->revCountLast = $this->revCount;
                        $this->prefetchCountLast = $this->prefetchCount;
@@ -296,35 +308,42 @@ class TextPassDumper extends BackupDumper {
        }
 
        function checkIfTimeExceeded() {
-               if ( $this->maxTimeAllowed && ( $this->lastTime - $this->timeOfCheckpoint > $this->maxTimeAllowed ) ) {
+               if ( $this->maxTimeAllowed
+                       && ( $this->lastTime - $this->timeOfCheckpoint > $this->maxTimeAllowed )
+               ) {
                        return true;
                }
+
                return false;
        }
 
        function finalOptionCheck() {
-               if ( ( $this->checkpointFiles && ! $this->maxTimeAllowed ) ||
-                       ( $this->maxTimeAllowed && !$this->checkpointFiles ) ) {
+               if ( ( $this->checkpointFiles && !$this->maxTimeAllowed )
+                       || ( $this->maxTimeAllowed && !$this->checkpointFiles )
+               ) {
                        throw new MWException( "Options checkpointfile and maxtime must be specified together.\n" );
                }
                foreach ( $this->checkpointFiles as $checkpointFile ) {
-                       $count = substr_count ( $checkpointFile, "%s" );
+                       $count = substr_count( $checkpointFile, "%s" );
                        if ( $count != 2 ) {
-                               throw new MWException( "Option checkpointfile must contain two '%s' for substitution of first and last pageids, count is $count instead, file is $checkpointFile.\n" );
+                               throw new MWException( "Option checkpointfile must contain two '%s' "
+                                       . "for substitution of first and last pageids, count is $count instead, "
+                                       . "file is $checkpointFile.\n" );
                        }
                }
 
                if ( $this->checkpointFiles ) {
                        $filenameList = (array)$this->egress->getFilenames();
                        if ( count( $filenameList ) != count( $this->checkpointFiles ) ) {
-                               throw new MWException( "One checkpointfile must be specified for each output option, if maxtime is used.\n" );
+                               throw new MWException( "One checkpointfile must be specified "
+                                       . "for each output option, if maxtime is used.\n" );
                        }
                }
        }
 
        /**
         * @throws MWException Failure to parse XML input
-        * @return true
+        * @return bool
         */
        function readDump( $input ) {
                $this->buffer = "";
@@ -338,7 +357,11 @@ class TextPassDumper extends BackupDumper {
                $parser = xml_parser_create( "UTF-8" );
                xml_parser_set_option( $parser, XML_OPTION_CASE_FOLDING, false );
 
-               xml_set_element_handler( $parser, array( &$this, 'startElement' ), array( &$this, 'endElement' ) );
+               xml_set_element_handler(
+                       $parser,
+                       array( &$this, 'startElement' ),
+                       array( &$this, 'endElement' )
+               );
                xml_set_character_data_handler( $parser, array( &$this, 'characterData' ) );
 
                $offset = 0; // for context extraction on error reporting
@@ -356,7 +379,7 @@ class TextPassDumper extends BackupDumper {
                                        'XML import parse failure',
                                        xml_get_current_line_number( $parser ),
                                        xml_get_current_column_number( $parser ),
-                                       $byte . ( is_null( $chunk ) ? null : ( '; "' . substr( $chunk, $byte -$offset, 16 ) . '"' ) ),
+                                       $byte . ( is_null( $chunk ) ? null : ( '; "' . substr( $chunk, $byte - $offset, 16 ) . '"' ) ),
                                        xml_error_string( xml_get_error_code( $parser ) ) )->escaped();
 
                                xml_parser_free( $parser );
@@ -375,15 +398,16 @@ class TextPassDumper extends BackupDumper {
                                # there's no pageID 0 so we use that. the caller is responsible
                                # for deciding what to do with a file containing only the
                                # siteinfo information and the mw tags.
-                               if ( ! $this->firstPageWritten ) {
+                               if ( !$this->firstPageWritten ) {
                                        $firstPageID = str_pad( 0, 9, "0", STR_PAD_LEFT );
                                        $lastPageID = str_pad( 0, 9, "0", STR_PAD_LEFT );
-                               }
-                               else {
+                               } else {
                                        $firstPageID = str_pad( $this->firstPageWritten, 9, "0", STR_PAD_LEFT );
                                        $lastPageID = str_pad( $this->lastPageWritten, 9, "0", STR_PAD_LEFT );
                                }
-                               for ( $i = 0; $i < count( $filenameList ); $i++ ) {
+
+                               $filenameCount = count( $filenameList );
+                               for ( $i = 0; $i < $filenameCount; $i++ ) {
                                        $checkpointNameFilledIn = sprintf( $this->checkpointFiles[$i], $firstPageID, $lastPageID );
                                        $fileinfo = pathinfo( $filenameList[$i] );
                                        $newFilenames[] = $fileinfo['dirname'] . '/' . $checkpointNameFilledIn;
@@ -475,7 +499,7 @@ class TextPassDumper extends BackupDumper {
                                // Step 2: Checking for plausibility and return the text if it is
                                //         plausible
                                $revID = intval( $this->thisRev );
-                               if ( ! isset( $this->db ) ) {
+                               if ( !isset( $this->db ) ) {
                                        throw new MWException( "No database available" );
                                }
 
@@ -494,9 +518,7 @@ class TextPassDumper extends BackupDumper {
                                                        $revLength = $row->rev_len;
                                                }
                                        }
-
-                               }
-                               else {
+                               } else {
                                        $revLength = $this->db->selectField( 'revision', 'rev_len', array( 'rev_id' => $revID ) );
                                }
 
@@ -504,12 +526,12 @@ class TextPassDumper extends BackupDumper {
                                        if ( $tryIsPrefetch ) {
                                                $this->prefetchCount++;
                                        }
+
                                        return $text;
                                }
 
                                $text = false;
                                throw new MWException( "Received text is unplausible for id " . $id );
-
                        } catch ( Exception $e ) {
                                $msg = "getting/checking text " . $id . " failed (" . $e->getMessage() . ")";
                                if ( $failures + 1 < $this->maxFailures ) {
@@ -522,7 +544,7 @@ class TextPassDumper extends BackupDumper {
                        $failures++;
 
                        // A failure in a prefetch hit does not warrant resetting db connection etc.
-                       if ( ! $tryIsPrefetch ) {
+                       if ( !$tryIsPrefetch ) {
                                // After backing off for some time, we try to reboot the whole process as
                                // much as possible to not carry over failures from one part to the other
                                // parts
@@ -561,7 +583,7 @@ class TextPassDumper extends BackupDumper {
         */
        private function getTextDb( $id ) {
                global $wgContLang;
-               if ( ! isset( $this->db ) ) {
+               if ( !isset( $this->db ) ) {
                        throw new MWException( __METHOD__ . "No database available" );
                }
                $row = $this->db->selectRow( 'text',
@@ -574,6 +596,7 @@ class TextPassDumper extends BackupDumper {
                }
                $stripped = str_replace( "\r", "", $text );
                $normalized = $wgContLang->normalize( $stripped );
+
                return $normalized;
        }
 
@@ -585,6 +608,7 @@ class TextPassDumper extends BackupDumper {
                }
                $text = $this->getTextSpawnedOnce( $id );
                wfRestoreWarnings();
+
                return $text;
        }
 
@@ -599,8 +623,7 @@ class TextPassDumper extends BackupDumper {
                                                "$IP/../multiversion/MWScript.php",
                                                "fetchText.php",
                                                '--wiki', wfWikiID() ) ) );
-               }
-               else {
+               } else {
                        $cmd = implode( " ",
                                array_map( 'wfEscapeShellArg',
                                        array(
@@ -619,11 +642,12 @@ class TextPassDumper extends BackupDumper {
                if ( !$this->spawnProc ) {
                        // shit
                        $this->progress( "Subprocess spawn failed." );
+
                        return false;
                }
                list(
                        $this->spawnWrite, // -> stdin
-                       $this->spawnRead,  // <- stdout
+                       $this->spawnRead, // <- stdout
                ) = $pipes;
 
                return true;
@@ -701,12 +725,14 @@ class TextPassDumper extends BackupDumper {
                $gotbytes = strlen( $text );
                if ( $gotbytes != $nbytes ) {
                        $this->progress( "Expected $nbytes bytes from database subprocess, got $gotbytes " );
+
                        return false;
                }
 
                // Do normalization in the dump thread...
                $stripped = str_replace( "\r", "", $text );
                $normalized = $wgContLang->normalize( $stripped );
+
                return $normalized;
        }
 
@@ -754,7 +780,7 @@ class TextPassDumper extends BackupDumper {
                        $this->buffer = "";
                        $this->thisRev = "";
                } elseif ( $name == 'page' ) {
-                       if ( ! $this->firstPageWritten ) {
+                       if ( !$this->firstPageWritten ) {
                                $this->firstPageWritten = trim( $this->thisPage );
                        }
                        $this->lastPageWritten = trim( $this->thisPage );
@@ -775,7 +801,8 @@ class TextPassDumper extends BackupDumper {
                                $newFilenames = array();
                                $firstPageID = str_pad( $this->firstPageWritten, 9, "0", STR_PAD_LEFT );
                                $lastPageID = str_pad( $this->lastPageWritten, 9, "0", STR_PAD_LEFT );
-                               for ( $i = 0; $i < count( $filenameList ); $i++ ) {
+                               $filenamesCount = count( $filenameList );
+                               for ( $i = 0; $i < $filenamesCount; $i++ ) {
                                        $checkpointNameFilledIn = sprintf( $this->checkpointFiles[$i], $firstPageID, $lastPageID );
                                        $fileinfo = pathinfo( $filenameList[$i] );
                                        $newFilenames[] = $fileinfo['dirname'] . '/' . $checkpointNameFilledIn;
@@ -786,13 +813,11 @@ class TextPassDumper extends BackupDumper {
                                $this->timeOfCheckpoint = $this->lastTime;
                                $this->firstPageWritten = false;
                                $this->checkpointJustWritten = true;
-                       }
-                       else {
+                       } else {
                                $this->egress->writeClosePage( $this->buffer );
                                $this->buffer = "";
                                $this->thisPage = "";
                        }
-
                } elseif ( $name == 'mediawiki' ) {
                        $this->egress->writeCloseStream( $this->buffer );
                        $this->buffer = "";
index dd558f3..3f8a899 100644 (file)
@@ -46,38 +46,38 @@ abstract class Benchmarker extends Maintenance {
                $bench_number = 0;
                $count = $this->getOption( 'count', 100 );
 
-               foreach( $benchs as $bench ) {
+               foreach ( $benchs as $bench ) {
                        // handle empty args
-                       if( !array_key_exists( 'args', $bench ) ) {
+                       if ( !array_key_exists( 'args', $bench ) ) {
                                $bench['args'] = array();
                        }
 
                        $bench_number++;
                        $start = microtime( true );
-                       for( $i = 0; $i < $count; $i++ ) {
+                       for ( $i = 0; $i < $count; $i++ ) {
                                call_user_func_array( $bench['function'], $bench['args'] );
                        }
                        $delta = microtime( true ) - $start;
 
                        // function passed as a callback
-                       if( is_array( $bench['function'] ) ) {
+                       if ( is_array( $bench['function'] ) ) {
                                $ret = get_class( $bench['function'][0] ) . '->' . $bench['function'][1];
                                $bench['function'] = $ret;
                        }
 
                        $this->results[$bench_number] = array(
-                               'function'  => $bench['function'],
+                               'function' => $bench['function'],
                                'arguments' => $bench['args'],
-                               'count'     => $count,
-                               'delta'     => $delta,
-                               'average'   => $delta / $count,
-                               );
+                               'count' => $count,
+                               'delta' => $delta,
+                               'average' => $delta / $count,
+                       );
                }
        }
 
        public function getFormattedResults() {
                $ret = '';
-               foreach( $this->results as $res ) {
+               foreach ( $this->results as $res ) {
                        // show function with args
                        $ret .= sprintf( "%s times: function %s(%s) :\n",
                                $res['count'],
@@ -89,6 +89,7 @@ abstract class Benchmarker extends Maintenance {
                                $res['average'] * 1000
                        );
                }
+
                return $ret;
        }
 }
index 6f800fb..bb7499b 100644 (file)
@@ -31,8 +31,7 @@ require_once __DIR__ . '/Benchmarker.php';
  *
  * @ingroup Benchmark
  */
-class bench_HTTP_HTTPS extends Benchmarker {
-
+class BenchHttpHttps extends Benchmarker {
        public function __construct() {
                parent::__construct();
                $this->mDescription = "Benchmark HTTP request vs HTTPS request.";
@@ -42,7 +41,7 @@ class bench_HTTP_HTTPS extends Benchmarker {
                $this->bench( array(
                        array( 'function' => array( $this, 'getHTTP' ) ),
                        array( 'function' => array( $this, 'getHTTPS' ) ),
-               ));
+               ) );
                print $this->getFormattedResults();
        }
 
@@ -61,5 +60,5 @@ class bench_HTTP_HTTPS extends Benchmarker {
        }
 }
 
-$maintClass = 'bench_HTTP_HTTPS';
+$maintClass = 'BenchHttpHttps';
 require_once RUN_MAINTENANCE_IF_MAIN;
index ea22b6d..8ae4f03 100644 (file)
@@ -29,7 +29,6 @@ require_once __DIR__ . '/Benchmarker.php';
  * @ingroup Benchmark
  */
 class BenchmarkDeleteTruncate extends Benchmarker {
-
        public function __construct() {
                parent::__construct();
                $this->mDescription = "Benchmarks SQL DELETE vs SQL TRUNCATE.";
@@ -76,7 +75,7 @@ class BenchmarkDeleteTruncate extends Benchmarker {
        private function insertData( $dbw ) {
                $range = range( 0, 1024 );
                $data = array();
-               foreach( $range as $r ) {
+               foreach ( $range as $r ) {
                        $data[] = array( 'text' => $r );
                }
                $dbw->insert( 'test', $data, __METHOD__ );
index 80fd962..698a0f0 100644 (file)
@@ -31,8 +31,7 @@ require_once __DIR__ . '/Benchmarker.php';
  *
  * @ingroup Maintenance
  */
-class bench_if_switch extends Benchmarker {
-
+class BenchIfSwitch extends Benchmarker {
        public function __construct() {
                parent::__construct();
                $this->mDescription = "Benchmark if elseif... versus switch case.";
@@ -42,55 +41,71 @@ class bench_if_switch extends Benchmarker {
                $this->bench( array(
                        array( 'function' => array( $this, 'doElseIf' ) ),
                        array( 'function' => array( $this, 'doSwitch' ) ),
-               ));
+               ) );
                print $this->getFormattedResults();
        }
 
        // bench function 1
        function doElseIf() {
                $a = 'z';
-               if( $a == 'a') {}
-               elseif( $a == 'b') {}
-               elseif( $a == 'c') {}
-               elseif( $a == 'd') {}
-               elseif( $a == 'e') {}
-               elseif( $a == 'f') {}
-               elseif( $a == 'g') {}
-               elseif( $a == 'h') {}
-               elseif( $a == 'i') {}
-               elseif( $a == 'j') {}
-               elseif( $a == 'k') {}
-               elseif( $a == 'l') {}
-               elseif( $a == 'm') {}
-               elseif( $a == 'n') {}
-               elseif( $a == 'o') {}
-               elseif( $a == 'p') {}
-               else {}
+               if ( $a == 'a' ) {
+               } elseif ( $a == 'b' ) {
+               } elseif ( $a == 'c' ) {
+               } elseif ( $a == 'd' ) {
+               } elseif ( $a == 'e' ) {
+               } elseif ( $a == 'f' ) {
+               } elseif ( $a == 'g' ) {
+               } elseif ( $a == 'h' ) {
+               } elseif ( $a == 'i' ) {
+               } elseif ( $a == 'j' ) {
+               } elseif ( $a == 'k' ) {
+               } elseif ( $a == 'l' ) {
+               } elseif ( $a == 'm' ) {
+               } elseif ( $a == 'n' ) {
+               } elseif ( $a == 'o' ) {
+               } elseif ( $a == 'p' ) {
+               } else {
+               }
        }
 
        // bench function 2
        function doSwitch() {
                $a = 'z';
-               switch( $a ) {
-                       case 'b': break;
-                       case 'c': break;
-                       case 'd': break;
-                       case 'e': break;
-                       case 'f': break;
-                       case 'g': break;
-                       case 'h': break;
-                       case 'i': break;
-                       case 'j': break;
-                       case 'k': break;
-                       case 'l': break;
-                       case 'm': break;
-                       case 'n': break;
-                       case 'o': break;
-                       case 'p': break;
+               switch ( $a ) {
+                       case 'b':
+                               break;
+                       case 'c':
+                               break;
+                       case 'd':
+                               break;
+                       case 'e':
+                               break;
+                       case 'f':
+                               break;
+                       case 'g':
+                               break;
+                       case 'h':
+                               break;
+                       case 'i':
+                               break;
+                       case 'j':
+                               break;
+                       case 'k':
+                               break;
+                       case 'l':
+                               break;
+                       case 'm':
+                               break;
+                       case 'n':
+                               break;
+                       case 'o':
+                               break;
+                       case 'p':
+                               break;
                        default:
                }
        }
 }
 
-$maintClass = 'bench_if_switch';
+$maintClass = 'BenchIfSwitch';
 require_once RUN_MAINTENANCE_IF_MAIN;
index 76b5e3c..44c8e03 100644 (file)
@@ -38,8 +38,7 @@ function bfNormalizeTitleStrReplace( $str ) {
  *
  * @ingroup Benchmark
  */
-class bench_strtr_str_replace extends Benchmarker {
-
+class BenchStrtrStrReplace extends Benchmarker {
        public function __construct() {
                parent::__construct();
                $this->mDescription = "Benchmark for strtr() vs str_replace().";
@@ -51,7 +50,7 @@ class bench_strtr_str_replace extends Benchmarker {
                        array( 'function' => array( $this, 'benchstr_replace' ) ),
                        array( 'function' => array( $this, 'benchstrtr_indirect' ) ),
                        array( 'function' => array( $this, 'benchstr_replace_indirect' ) ),
-               ));
+               ) );
                print $this->getFormattedResults();
        }
 
@@ -60,7 +59,7 @@ class bench_strtr_str_replace extends Benchmarker {
        }
 
        function benchstr_replace() {
-               str_replace( "_", " ", "[[MediaWiki:Some_random_test_page]]");
+               str_replace( "_", " ", "[[MediaWiki:Some_random_test_page]]" );
        }
 
        function benchstrtr_indirect() {
@@ -70,8 +69,7 @@ class bench_strtr_str_replace extends Benchmarker {
        function benchstr_replace_indirect() {
                bfNormalizeTitleStrReplace( "[[MediaWiki:Some_random_test_page]]" );
        }
-
 }
 
-$maintClass = 'bench_strtr_str_replace';
+$maintClass = 'BenchStrtrStrReplace';
 require_once RUN_MAINTENANCE_IF_MAIN;
index 078293e..b742f66 100644 (file)
@@ -29,8 +29,7 @@ require_once __DIR__ . '/Benchmarker.php';
  *
  * @ingroup Benchmark
  */
-class bench_utf8_title_check extends Benchmarker {
-
+class BenchUtf8TitleCheck extends Benchmarker {
        private $canRun;
 
        private $data;
@@ -38,6 +37,7 @@ class bench_utf8_title_check extends Benchmarker {
        public function __construct() {
                parent::__construct();
 
+               // @codingStandardsIgnoreStart Ignore long line warnings.
                $this->data = array(
                        "",
                        "United States of America", // 7bit ASCII
@@ -59,11 +59,13 @@ class bench_utf8_title_check extends Benchmarker {
                        . "Sara%20Sidle%7CSofia%20Curtis%7CS%C3%A9rie%20t%C3%A9l%C3%A9vis%C3%A9e%7CWallace%20Langham%7C"
                        . "Warrick%20Brown%7CWendy%20Simms%7C%C3%89tats-Unis"
                );
+               // @codingStandardsIgnoreEnd
 
-               $this->canRun = function_exists ( 'mb_check_encoding' );
+               $this->canRun = function_exists( 'mb_check_encoding' );
 
                if ( $this->canRun ) {
-                       $this->mDescription = "Benchmark for using a regexp vs. mb_check_encoding to check for UTF-8 encoding.";
+                       $this->mDescription = "Benchmark for using a regexp vs. mb_check_encoding " .
+                               "to check for UTF-8 encoding.";
                        mb_internal_encoding( 'UTF-8' );
                } else {
                        $this->mDescription = "CANNOT RUN benchmark using mb_check_encoding: function not available.";
@@ -75,22 +77,22 @@ class bench_utf8_title_check extends Benchmarker {
                        return;
                }
                $benchmarks = array();
-               foreach ($this->data as $val) {
+               foreach ( $this->data as $val ) {
                        $benchmarks[] = array(
                                'function' => array( $this, 'use_regexp' ),
-                               'args' => array( rawurldecode ( $val ) )
+                               'args' => array( rawurldecode( $val ) )
                        );
                        $benchmarks[] = array(
                                'function' => array( $this, 'use_regexp_non_capturing' ),
-                               'args' => array( rawurldecode ( $val ) )
+                               'args' => array( rawurldecode( $val ) )
                        );
                        $benchmarks[] = array(
                                'function' => array( $this, 'use_regexp_once_only' ),
-                               'args' => array( rawurldecode ( $val ) )
+                               'args' => array( rawurldecode( $val ) )
                        );
                        $benchmarks[] = array(
                                'function' => array( $this, 'use_mb_check_encoding' ),
-                               'args' => array( rawurldecode ( $val ) )
+                               'args' => array( rawurldecode( $val ) )
                        );
                }
                $this->bench( $benchmarks );
@@ -101,26 +103,25 @@ class bench_utf8_title_check extends Benchmarker {
 
        function use_regexp( $s ) {
                $this->isutf8 = preg_match( '/^([\x00-\x7f]|[\xc0-\xdf][\x80-\xbf]|' .
-                               '[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3})+$/', $s );
+                       '[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3})+$/', $s );
        }
 
        function use_regexp_non_capturing( $s ) {
                // Same as above with a non-capturing subgroup.
                $this->isutf8 = preg_match( '/^(?:[\x00-\x7f]|[\xc0-\xdf][\x80-\xbf]|' .
-                               '[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3})+$/', $s );
+                       '[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3})+$/', $s );
        }
 
        function use_regexp_once_only( $s ) {
                // Same as above with a once-only subgroup.
                $this->isutf8 = preg_match( '/^(?>[\x00-\x7f]|[\xc0-\xdf][\x80-\xbf]|' .
-                               '[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3})+$/', $s );
+                       '[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3})+$/', $s );
        }
 
        function use_mb_check_encoding( $s ) {
                $this->isutf8 = mb_check_encoding( $s, 'UTF-8' );
        }
-
 }
 
-$maintClass = 'bench_utf8_title_check';
+$maintClass = 'BenchUtf8TitleCheck';
 require_once RUN_MAINTENANCE_IF_MAIN;
index f8a2156..b4be12b 100644 (file)
@@ -29,8 +29,7 @@ require_once __DIR__ . '/Benchmarker.php';
  *
  * @ingroup Benchmark
  */
-class bench_wfBaseConvert extends Benchmarker {
-
+class BenchWfBaseConvert extends Benchmarker {
        public function __construct() {
                parent::__construct();
                $this->mDescription = "Benchmark for wfBaseConvert.";
@@ -58,7 +57,7 @@ class bench_wfBaseConvert extends Benchmarker {
                                'function' => 'wfBaseConvert',
                                'args' => array( $number, $inbase, $outbase, 0, true, 'gmp' )
                        ),
-               ));
+               ) );
 
                $this->output( $this->getFormattedResults() );
        }
@@ -66,12 +65,13 @@ class bench_wfBaseConvert extends Benchmarker {
        protected static function makeRandomNumber( $base, $length ) {
                $baseChars = "0123456789abcdefghijklmnopqrstuvwxyz";
                $res = "";
-               for( $i = 0; $i < $length; $i++ ) {
-                       $res .= $baseChars[mt_rand(0, $base - 1)];
+               for ( $i = 0; $i < $length; $i++ ) {
+                       $res .= $baseChars[mt_rand( 0, $base - 1 )];
                }
+
                return $res;
        }
 }
 
-$maintClass = 'bench_wfBaseConvert';
+$maintClass = 'BenchWfBaseConvert';
 require_once RUN_MAINTENANCE_IF_MAIN;
index 76cea2c..8446694 100644 (file)
@@ -31,8 +31,7 @@ require_once __DIR__ . '/Benchmarker.php';
  *
  * @ingroup Benchmark
  */
-class bench_wfIsWindows extends Benchmarker {
-
+class BenchWfIsWindows extends Benchmarker {
        public function __construct() {
                parent::__construct();
                $this->mDescription = "Benchmark for wfIsWindows.";
@@ -42,7 +41,7 @@ class bench_wfIsWindows extends Benchmarker {
                $this->bench( array(
                        array( 'function' => array( $this, 'wfIsWindows' ) ),
                        array( 'function' => array( $this, 'wfIsWindowsCached' ) ),
-               ));
+               ) );
                print $this->getFormattedResults();
        }
 
@@ -58,12 +57,13 @@ class bench_wfIsWindows extends Benchmarker {
        // bench function 2
        function wfIsWindowsCached() {
                static $isWindows = null;
-               if( $isWindows == null ) {
+               if ( $isWindows == null ) {
                        $isWindows = self::is_win();
                }
+
                return $isWindows;
        }
 }
 
-$maintClass = 'bench_wfIsWindows';
+$maintClass = 'BenchWfIsWindows';
 require_once RUN_MAINTENANCE_IF_MAIN;
index 59d3bdf..fb25b9d 100644 (file)
@@ -29,7 +29,6 @@ require_once __DIR__ . '/Benchmarker.php';
  * @ingroup Benchmark
  */
 class BenchmarkHooks extends Benchmarker {
-
        public function __construct() {
                parent::__construct();
                $this->mDescription = 'Benchmark MediaWiki Hooks.';
@@ -46,13 +45,13 @@ class BenchmarkHooks extends Benchmarker {
                $time = $this->benchHooks();
                $this->output( 'Loaded (one) hook: ' . $time . "\n" );
 
-               for( $i = 0; $i < 9; $i++ ) {
+               for ( $i = 0; $i < 9; $i++ ) {
                        $wgHooks['Test'][] = array( $this, 'test' );
                }
                $time = $this->benchHooks();
                $this->output( 'Loaded (ten) hook: ' . $time . "\n" );
 
-               for( $i = 0; $i < 90; $i++ ) {
+               for ( $i = 0; $i < 90; $i++ ) {
                        $wgHooks['Test'][] = array( $this, 'test' );
                }
                $time = $this->benchHooks();
@@ -71,6 +70,7 @@ class BenchmarkHooks extends Benchmarker {
                }
                $delta = microtime( true ) - $start;
                $pertrial = $delta / $trials;
+
                return sprintf( "Took %6.3fms",
                        $pertrial * 1000 );
        }
index cec2beb..b81f9fd 100644 (file)
@@ -47,7 +47,7 @@ class BenchmarkParse extends Maintenance {
                        false, true );
                $this->addOption( 'tpl-time',
                        'Use templates which were current at the given time (except that moves and ' .
-                               'deletes are not handled properly)',
+                       'deletes are not handled properly)',
                        false, true );
        }
 
@@ -94,7 +94,7 @@ class BenchmarkParse extends Maintenance {
                printf( "CPU time = %.3f s, wall clock time = %.3f s\n",
                        // CPU time
                        $endUsage['ru_utime.tv_sec'] + $endUsage['ru_utime.tv_usec'] * 1e-6
-                               - $startUsage['ru_utime.tv_sec'] - $startUsage['ru_utime.tv_usec'] * 1e-6,
+                       - $startUsage['ru_utime.tv_sec'] - $startUsage['ru_utime.tv_usec'] * 1e-6,
                        // Wall clock time
                        $endTime - $startTime );
        }
index 1797358..42c1eb7 100644 (file)
@@ -29,7 +29,6 @@ require_once __DIR__ . '/Benchmarker.php';
  * @ingroup Benchmark
  */
 class BenchmarkPurge extends Benchmarker {
-
        public function __construct() {
                parent::__construct();
                $this->mDescription = "Benchmark the Squid purge functions.";
@@ -69,6 +68,7 @@ class BenchmarkPurge extends Benchmarker {
                $delta = microtime( true ) - $start;
                $pertrial = $delta / $trials;
                $pertitle = $pertrial / count( $urls );
+
                return sprintf( "%4d titles in %6.2fms (%6.2fms each)",
                        count( $urls ), $pertrial * 1000.0, $pertitle * 1000.0 );
        }
@@ -83,6 +83,7 @@ class BenchmarkPurge extends Benchmarker {
                for ( $i = 0; $i < $length; $i++ ) {
                        $list[] = $this->randomUrl();
                }
+
                return $list;
        }
 
@@ -93,6 +94,7 @@ class BenchmarkPurge extends Benchmarker {
         */
        private function randomUrl() {
                global $wgServer, $wgArticlePath;
+
                return $wgServer . str_replace( '$1', $this->randomTitle(), $wgArticlePath );
        }
 
@@ -107,6 +109,7 @@ class BenchmarkPurge extends Benchmarker {
                for ( $i = 0; $i < $length; $i++ ) {
                        $str .= chr( mt_rand( ord( 'a' ), ord( 'z' ) ) );
                }
+
                return ucfirst( $str );
        }
 }
index 4590611..86c686b 100644 (file)
@@ -77,7 +77,8 @@ do {
                        print "Loading cdb file $file...";
                        try {
                                $fileHandle = CdbReader::open( $file );
-                       } catch ( CdbException $e ) {}
+                       } catch ( CdbException $e ) {
+                       }
 
                        if ( !$fileHandle ) {
                                print "not a cdb file or unable to read it\n";
index a96e9b8..fec9291 100644 (file)
@@ -44,7 +44,7 @@ class CheckBadRedirects extends Maintenance {
 
                $count = $result->numRows();
                $this->output( "Found $count redirects.\n" .
-                                               "Checking for bad redirects:\n\n" );
+                       "Checking for bad redirects:\n\n" );
 
                foreach ( $result as $row ) {
                        $title = Title::makeTitle( $row->page_namespace, $row->page_title );
index e6aea53..3921c07 100644 (file)
@@ -73,13 +73,13 @@ class CheckImages extends Maintenance {
                                }
 
                                if ( $stat['size'] != $row->img_size ) {
-                                       $this->output( "{$row->img_name}: size mismatch DB={$row->img_size}, actual={$stat['size']}\n" );
+                                       $this->output( "{$row->img_name}: size mismatch DB={$row->img_size}, "
+                                               . "actual={$stat['size']}\n" );
                                        continue;
                                }
 
                                $numGood++;
                        }
-
                } while ( $res->numRows() );
 
                $this->output( "Good images: $numGood/$numImages\n" );
index f81285f..b97e1b0 100644 (file)
@@ -31,7 +31,8 @@ class CheckLess extends Maintenance {
 
        public function __construct() {
                parent::__construct();
-               $this->mDescription = 'Checks LESS files for errors by running the LessTestSuite PHPUnit test suite';
+               $this->mDescription =
+                       'Checks LESS files for errors by running the LessTestSuite PHPUnit test suite';
        }
 
        public function execute() {
index ef88545..6ef4909 100644 (file)
@@ -38,10 +38,23 @@ class CheckSyntax extends Maintenance {
                parent::__construct();
                $this->mDescription = "Check syntax for all PHP files in MediaWiki";
                $this->addOption( 'with-extensions', 'Also recurse the extensions folder' );
-               $this->addOption( 'path', 'Specific path (file or directory) to check, either with absolute path or relative to the root of this MediaWiki installation',
-                       false, true );
-               $this->addOption( 'list-file', 'Text file containing list of files or directories to check', false, true );
-               $this->addOption( 'modified', 'Check only files that were modified (requires Git command-line client)' );
+               $this->addOption(
+                       'path',
+                       'Specific path (file or directory) to check, either with absolute path or '
+                               . 'relative to the root of this MediaWiki installation',
+                       false,
+                       true
+               );
+               $this->addOption(
+                       'list-file',
+                       'Text file containing list of files or directories to check',
+                       false,
+                       true
+               );
+               $this->addOption(
+                       'modified',
+                       'Check only files that were modified (requires Git command-line client)'
+               );
                $this->addOption( 'syntax-only', 'Check for syntax validity only, skip code style warnings' );
        }
 
@@ -53,7 +66,8 @@ class CheckSyntax extends Maintenance {
                $this->buildFileList();
 
                // ParseKit is broken on PHP 5.3+, disabled until this is fixed
-               $useParseKit = function_exists( 'parsekit_compile_file' ) && version_compare( PHP_VERSION, '5.3', '<' );
+               $useParseKit = function_exists( 'parsekit_compile_file' )
+                       && version_compare( PHP_VERSION, '5.3', '<' );
 
                $str = 'Checking syntax (using ' . ( $useParseKit ?
                        'parsekit' : ' php -l, this can take a long time' ) . ")\n";
@@ -82,7 +96,7 @@ class CheckSyntax extends Maintenance {
                $this->mIgnorePaths = array(
                        // Compat stuff, explodes on PHP 5.3
                        "includes/NamespaceCompat.php$",
-                       );
+               );
 
                $this->mNoStyleCheckPaths = array(
                        // Third-party code we don't care about
@@ -96,13 +110,14 @@ class CheckSyntax extends Maintenance {
                        "QPoll/Excel/",
                        "/geshi/",
                        "/smarty/",
-                       );
+               );
 
                if ( $this->hasOption( 'path' ) ) {
                        $path = $this->getOption( 'path' );
                        if ( !$this->addPath( $path ) ) {
                                $this->error( "Error: can't find file or directory $path\n", true );
                        }
+
                        return; // process only this path
                } elseif ( $this->hasOption( 'list-file' ) ) {
                        $file = $this->getOption( 'list-file' );
@@ -117,6 +132,7 @@ class CheckSyntax extends Maintenance {
                                $this->addPath( $path );
                        }
                        fclose( $f );
+
                        return;
                } elseif ( $this->hasOption( 'modified' ) ) {
                        $this->output( "Retrieving list from Git... " );
@@ -127,6 +143,7 @@ class CheckSyntax extends Maintenance {
                                        $this->mFiles[] = $file;
                                }
                        }
+
                        return;
                }
 
@@ -227,6 +244,7 @@ class CheckSyntax extends Maintenance {
                                return false;
                        }
                }
+
                return true;
        }
 
@@ -237,6 +255,7 @@ class CheckSyntax extends Maintenance {
         */
        private function addPath( $path ) {
                global $IP;
+
                return $this->addFileOrDir( $path ) || $this->addFileOrDir( "$IP/$path" );
        }
 
@@ -253,6 +272,7 @@ class CheckSyntax extends Maintenance {
                } else {
                        return false;
                }
+
                return true;
        }
 
@@ -299,6 +319,7 @@ class CheckSyntax extends Maintenance {
                                $this->mFailures[$file] = $errors;
                        }
                }
+
                return $ret;
        }
 
@@ -312,8 +333,10 @@ class CheckSyntax extends Maintenance {
                if ( strpos( $res, 'No syntax errors detected' ) === false ) {
                        $this->mFailures[$file] = $res;
                        $this->output( $res . "\n" );
+
                        return false;
                }
+
                return true;
        }
 
index 6df189f..777c833 100644 (file)
@@ -55,7 +55,7 @@ class CheckUsernames extends Maintenance {
                        );
 
                        foreach ( $res as $row ) {
-                               if ( ! User::isValidUserName( $row->user_name ) ) {
+                               if ( !User::isValidUserName( $row->user_name ) ) {
                                        $this->error( sprintf( "%s: %6d: '%s'\n", wfWikiID(), $row->user_id, $row->user_name ) );
                                        wfDebugLog( 'checkUsernames', $row->user_name );
                                }
index 694efaa..2dbf8bc 100644 (file)
@@ -40,8 +40,9 @@ class CleanupAncientTables extends Maintenance {
        public function execute() {
                if ( !$this->hasOption( 'force' ) ) {
                        $this->error( "This maintenance script will remove old columns and indexes.\n"
-                               . "It is recommended to backup your database first, and ensure all your data has been migrated to newer tables\n"
-                               . "If you want to continue, run this script again with the --force \n"
+                               . "It is recommended to backup your database first, and ensure all your data has\n"
+                               . "been migrated to newer tables. If you want to continue, run this script again\n"
+                               . "with --force.\n"
                        );
                }
 
@@ -82,7 +83,7 @@ class CleanupAncientTables extends Maintenance {
                        if ( $db->indexExists( 'text', $index, __METHOD__ ) ) {
                                $this->output( "Dropping index $index from the text table..." );
                                $db->query( "DROP INDEX " . $db->addIdentifierQuotes( $index )
-                                               . " ON " . $db->tableName( 'text' ) );
+                                       . " ON " . $db->tableName( 'text' ) );
                                $this->output( "done.\n" );
                        }
                }
@@ -101,7 +102,7 @@ class CleanupAncientTables extends Maintenance {
                        if ( $db->fieldExists( 'text', $field, __METHOD__ ) ) {
                                $this->output( "Dropping the $field field from the text table..." );
                                $db->query( "ALTER TABLE  " . $db->tableName( 'text' )
-                                               . " DROP COLUMN " . $db->addIdentifierQuotes( $field )  );
+                                       . " DROP COLUMN " . $db->addIdentifierQuotes( $field ) );
                                $this->output( "done.\n" );
                        }
                }
index 321f089..9e88c13 100644 (file)
@@ -71,6 +71,7 @@ class CapsCleanup extends TableCleanup {
                $lower = $wgContLang->lcfirst( $row->page_title );
                if ( $upper == $lower ) {
                        $this->output( "\"$display\" already lowercase.\n" );
+
                        return $this->progress( 0 );
                }
 
@@ -78,6 +79,7 @@ class CapsCleanup extends TableCleanup {
                $targetDisplay = $target->getPrefixedText();
                if ( $target->exists() ) {
                        $this->output( "\"$display\" skipped; \"$targetDisplay\" already exists\n" );
+
                        return $this->progress( 0 );
                }
 
@@ -98,6 +100,7 @@ class CapsCleanup extends TableCleanup {
                                }
                        }
                }
+
                return $this->progress( 0 );
        }
 }
index 01ed9ca..915a2c0 100644 (file)
@@ -56,6 +56,7 @@ class ImageCleanup extends TableCleanup {
                if ( $source == '' ) {
                        // Ye olde empty rows. Just kill them.
                        $this->killRow( $source );
+
                        return $this->progress( 1 );
                }
 
@@ -82,6 +83,7 @@ class ImageCleanup extends TableCleanup {
                                return $this->progress( 0 );
                        }
                        $this->pokeFile( $source, $safe );
+
                        return $this->progress( 1 );
                }
 
@@ -89,6 +91,7 @@ class ImageCleanup extends TableCleanup {
                        $munged = $title->getDBkey();
                        $this->output( "page $source ($munged) doesn't match self.\n" );
                        $this->pokeFile( $source, $munged );
+
                        return $this->progress( 1 );
                }
 
@@ -114,6 +117,7 @@ class ImageCleanup extends TableCleanup {
                if ( !isset( $this->repo ) ) {
                        $this->repo = RepoGroup::singleton()->getLocalRepo();
                }
+
                return $this->repo->getRootDirectory() . '/' . $this->repo->getHashPath( $name ) . $name;
        }
 
@@ -122,7 +126,12 @@ class ImageCleanup extends TableCleanup {
        }
 
        private function pageExists( $name, $db ) {
-               return $db->selectField( 'page', '1', array( 'page_namespace' => NS_FILE, 'page_title' => $name ), __METHOD__ );
+               return $db->selectField(
+                       'page',
+                       '1',
+                       array( 'page_namespace' => NS_FILE, 'page_title' => $name ),
+                       __METHOD__
+               );
        }
 
        private function pokeFile( $orig, $new ) {
@@ -130,6 +139,7 @@ class ImageCleanup extends TableCleanup {
                if ( !file_exists( $path ) ) {
                        $this->output( "missing file: $path\n" );
                        $this->killRow( $orig );
+
                        return;
                }
 
@@ -145,7 +155,7 @@ class ImageCleanup extends TableCleanup {
                $version = 0;
                $final = $new;
                $conflict = ( $this->imageExists( $final, $db ) ||
-                               ( $this->pageExists( $orig, $db ) && $this->pageExists( $final, $db ) ) );
+                       ( $this->pageExists( $orig, $db ) && $this->pageExists( $final, $db ) ) );
 
                while ( $conflict ) {
                        $this->output( "Rename conflicts with '$final'...\n" );
@@ -179,6 +189,7 @@ class ImageCleanup extends TableCleanup {
                                if ( !wfMkdirParents( $dir, null, __METHOD__ ) ) {
                                        $this->output( "RENAME FAILED, COULD NOT CREATE $dir" );
                                        $db->rollback( __METHOD__ );
+
                                        return;
                                }
                        }
@@ -205,6 +216,7 @@ class ImageCleanup extends TableCleanup {
                $test = Title::makeTitleSafe( NS_FILE, $x );
                if ( is_null( $test ) || $test->getDBkey() !== $x ) {
                        $this->error( "Unable to generate safe title from '$name', got '$x'" );
+
                        return false;
                }
 
index 84eec28..cc8b024 100644 (file)
@@ -36,7 +36,13 @@ class CleanupRemovedModules extends Maintenance {
                parent::__construct();
                $this->mDescription = 'Remove cache entries for removed ResourceLoader modules from the database';
                $this->addOption( 'batchsize', 'Delete rows in batches of this size. Default: 500', false, true );
-               $this->addOption( 'max-slave-lag', 'If the slave lag exceeds this many seconds, wait until it drops below this value. Default: 5', false, true );
+               $this->addOption(
+                       'max-slave-lag',
+                       'If the slave lag exceeds this many seconds, wait until it drops below this value. '
+                               . 'Default: 5',
+                       false,
+                       true
+               );
        }
 
        public function execute() {
index 12b1241..f4a5147 100644 (file)
@@ -35,7 +35,10 @@ class CleanupSpam extends Maintenance {
                $this->mDescription = "Cleanup all spam from a given hostname";
                $this->addOption( 'all', 'Check all wikis in $wgLocalDatabases' );
                $this->addOption( 'delete', 'Delete pages containing only spam instead of blanking them' );
-               $this->addArg( 'hostname', 'Hostname that was spamming, single * wildcard in the beginning allowed' );
+               $this->addArg(
+                       'hostname',
+                       'Hostname that was spamming, single * wildcard in the beginning allowed'
+               );
        }
 
        public function execute() {
@@ -98,6 +101,7 @@ class CleanupSpam extends Maintenance {
                $title = Title::newFromID( $id );
                if ( !$title ) {
                        $this->error( "Internal error: no page for ID $id" );
+
                        return;
                }
 
@@ -106,7 +110,8 @@ class CleanupSpam extends Maintenance {
                $currentRevId = $rev->getId();
 
                while ( $rev && ( $rev->isDeleted( Revision::DELETED_TEXT )
-                                               || LinkFilter::matchEntry( $rev->getContent( Revision::RAW ), $domain ) ) ) {
+                       || LinkFilter::matchEntry( $rev->getContent( Revision::RAW ), $domain ) )
+               ) {
                        $rev = $rev->getPrevious();
                }
 
@@ -123,19 +128,28 @@ class CleanupSpam extends Maintenance {
                                $content = $rev->getContent( Revision::RAW );
 
                                $this->output( "reverting\n" );
-                               $page->doEditContent( $content, wfMessage( 'spam_reverting', $domain )->inContentLanguage()->text(),
-                                       EDIT_UPDATE, $rev->getId() );
+                               $page->doEditContent(
+                                       $content,
+                                       wfMessage( 'spam_reverting', $domain )->inContentLanguage()->text(),
+                                       EDIT_UPDATE,
+                                       $rev->getId()
+                               );
                        } elseif ( $this->hasOption( 'delete' ) ) {
                                // Didn't find a non-spammy revision, blank the page
                                $this->output( "deleting\n" );
-                               $page->doDeleteArticle( wfMessage( 'spam_deleting', $domain )->inContentLanguage()->text() );
+                               $page->doDeleteArticle(
+                                       wfMessage( 'spam_deleting', $domain )->inContentLanguage()->text()
+                               );
                        } else {
                                // Didn't find a non-spammy revision, blank the page
                                $handler = ContentHandler::getForTitle( $title );
                                $content = $handler->makeEmptyContent();
 
                                $this->output( "blanking\n" );
-                               $page->doEditContent( $content, wfMessage( 'spam_blanking', $domain )->inContentLanguage()->text() );
+                               $page->doEditContent(
+                                       $content,
+                                       wfMessage( 'spam_blanking', $domain )->inContentLanguage()->text()
+                               );
                        }
                        $dbw->commit( __METHOD__ );
                }
index 94e90db..eb7d7b1 100644 (file)
@@ -65,9 +65,11 @@ class WatchlistCleanup extends TableCleanup {
                $title = Title::newFromText( $verified );
 
                if ( $row->wl_user == 0 || is_null( $title ) || !$title->equals( $current ) ) {
-                       $this->output( "invalid watch by {$row->wl_user} for ({$row->wl_namespace}, \"{$row->wl_title}\")\n" );
+                       $this->output( "invalid watch by {$row->wl_user} for "
+                               . "({$row->wl_namespace}, \"{$row->wl_title}\")\n" );
                        $updated = $this->removeWatch( $row );
                        $this->progress( $updated );
+
                        return;
                }
                $this->progress( 0 );
@@ -76,12 +78,16 @@ class WatchlistCleanup extends TableCleanup {
        private function removeWatch( $row ) {
                if ( !$this->dryrun && $this->hasOption( 'fix' ) ) {
                        $dbw = wfGetDB( DB_MASTER );
-                       $dbw->delete( 'watchlist', array(
+                       $dbw->delete(
+                               'watchlist', array(
                                'wl_user' => $row->wl_user,
                                'wl_namespace' => $row->wl_namespace,
                                'wl_title' => $row->wl_title ),
-                       __METHOD__ );
+                               __METHOD__
+                       );
+
                        $this->output( "- removed\n" );
+
                        return 1;
                } else {
                        return 0;
index be07142..0d3e643 100644 (file)
 
 require_once __DIR__ . '/Maintenance.php';
 
+// @codingStandardsIgnoreStart MediaWiki.NamingConventions.ValidGlobalName.wgPrefix
 global $optionsWithArgs;
+// @codingStandardsIgnoreEnd
 if ( !isset( $optionsWithArgs ) ) {
        $optionsWithArgs = array();
 }
 
 class CommandLineInc extends Maintenance {
        public function __construct() {
+               // @codingStandardsIgnoreStart MediaWiki.NamingConventions.ValidGlobalName.wgPrefix
                global $optionsWithArgs;
+               // @codingStandardsIgnoreEnd
                parent::__construct();
                foreach ( $optionsWithArgs as $name ) {
                        $this->addOption( $name, '', false, true );
@@ -48,7 +52,9 @@ class CommandLineInc extends Maintenance {
        }
 
        public function execute() {
+               // @codingStandardsIgnoreStart MediaWiki.NamingConventions.ValidGlobalName.wgPrefix
                global $args, $options;
+               // @codingStandardsIgnoreEnd
                $args = $this->mArgs;
                $options = $this->mOptions;
        }
diff --git a/maintenance/compareParserCache.php b/maintenance/compareParserCache.php
new file mode 100644 (file)
index 0000000..93fe660
--- /dev/null
@@ -0,0 +1,104 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ */
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * @ingroup Maintenance
+ */
+class CompareParserCache extends Maintenance {
+       public function __construct() {
+               parent::__construct();
+               $this->mDescription = "Parse random pages and compare output to cache.";
+               $this->addOption( 'namespace', 'Page namespace number', true, true );
+               $this->addOption( 'maxpages', 'Number of pages to try', true, true );
+       }
+
+       public function execute() {
+               $pages = $this->getOption( 'maxpages' );
+
+               $dbr = $this->getDB( DB_SLAVE );
+
+               $totalsec = 0.0;
+               $scanned = 0;
+               $withcache = 0;
+               $withdiff = 0;
+               while ( $pages-- > 0 ) {
+                       $row = $dbr->selectRow( 'page', '*',
+                               array(
+                                       'page_namespace' => $this->getOption( 'namespace' ),
+                                       'page_is_redirect' => 0,
+                                       'page_random >= ' . wfRandom()
+                               ),
+                               __METHOD__,
+                               array(
+                                       'ORDER BY' => 'page_random',
+                               )
+                       );
+
+                       if ( !$row ) {
+                               continue;
+                       }
+                       ++$scanned;
+
+                       $title = Title::newFromRow( $row );
+                       $page = WikiPage::factory( $title );
+                       $revision = $page->getRevision();
+                       $content = $revision->getContent( Revision::RAW );
+
+                       $parserOptions = $page->makeParserOptions( 'canonical' );
+
+                       $parserOutputOld = ParserCache::singleton()->get( $page, $parserOptions );
+
+                       if ( $parserOutputOld ) {
+                               $t1 = microtime( true );
+                               $parserOutputNew = $content->getParserOutput(
+                                       $title, $revision->getId(), $parserOptions, false );
+                               $sec = microtime( true ) - $t1;
+                               $totalsec += $sec;
+
+                               $this->output( "Parsed '{$title->getPrefixedText()}' in $sec seconds.\n" );
+
+                               $this->output( "Found cache entry found for '{$title->getPrefixedText()}'..." );
+                               $oldHtml = trim( preg_replace( '#<!-- .+-->#Us', '', $parserOutputOld->getText() ) );
+                               $newHtml = trim( preg_replace( '#<!-- .+-->#Us', '',$parserOutputNew->getText() ) );
+                               $diff = wfDiff( $oldHtml, $newHtml );
+                               if ( strlen( $diff ) ) {
+                                       $this->output( "differences found:\n\n$diff\n\n" );
+                                       ++$withdiff;
+                               } else {
+                                       $this->output( "No differences found.\n" );
+                               }
+                               ++$withcache;
+                       } else {
+                               $this->output( "No parser cache entry found for '{$title->getPrefixedText()}'.\n" );
+                       }
+               }
+
+               $ave = $totalsec ? $totalsec / $scanned : 0;
+               $this->output( "Checked $scanned pages; $withcache had prior cache entries.\n" );
+               $this->output( "Pages with differences found: $withdiff\n" );
+               $this->output( "Average parse time: $ave sec\n" );
+       }
+}
+
+$maintClass = "CompareParserCache";
+require_once RUN_MAINTENANCE_IF_MAIN;
index f33ff40..e67c439 100644 (file)
@@ -47,11 +47,31 @@ class CompareParsers extends DumpIterator {
                $this->addOption( 'parser1', 'The first parser to compare.', true, true );
                $this->addOption( 'parser2', 'The second parser to compare.', true, true );
                $this->addOption( 'tidy', 'Run tidy on the articles.', false, false );
-               $this->addOption( 'save-failed', 'Folder in which articles which differ will be stored.', false, true );
+               $this->addOption(
+                       'save-failed',
+                       'Folder in which articles which differ will be stored.',
+                       false,
+                       true
+               );
                $this->addOption( 'show-diff', 'Show a diff of the two renderings.', false, false );
-               $this->addOption( 'diff-bin', 'Binary to use for diffing (can also be provided by DIFF env var).', false, false );
-               $this->addOption( 'strip-parameters', 'Remove parameters of html tags to increase readability.', false, false );
-               $this->addOption( 'show-parsed-output', 'Show the parsed html if both Parsers give the same output.', false, false );
+               $this->addOption(
+                       'diff-bin',
+                       'Binary to use for diffing (can also be provided by DIFF env var).',
+                       false,
+                       false
+               );
+               $this->addOption(
+                       'strip-parameters',
+                       'Remove parameters of html tags to increase readability.',
+                       false,
+                       false
+               );
+               $this->addOption(
+                       'show-parsed-output',
+                       'Show the parsed html if both Parsers give the same output.',
+                       false,
+                       false
+               );
        }
 
        public function checkOptions() {
@@ -96,6 +116,7 @@ class CompareParsers extends DumpIterator {
                if ( !$this->stripParametersEnabled ) {
                        return $text;
                }
+
                return preg_replace( '/(<a) [^>]+>/', '$1>', $text );
        }
 
@@ -118,7 +139,9 @@ class CompareParsers extends DumpIterator {
                $content = $rev->getContent();
 
                if ( $content->getModel() !== CONTENT_MODEL_WIKITEXT ) {
-                       $this->error( "Page {$title->getPrefixedText()} does not contain wikitext but {$content->getModel()}\n" );
+                       $this->error( "Page {$title->getPrefixedText()} does not contain wikitext "
+                               . "but {$content->getModel()}\n" );
+
                        return;
                }
 
@@ -132,13 +155,21 @@ class CompareParsers extends DumpIterator {
                        $this->error( "Parsing for {$title->getPrefixedText()} differs\n" );
 
                        if ( $this->saveFailed ) {
-                               file_put_contents( $this->saveFailed . '/' . rawurlencode( $title->getPrefixedText() ) . ".txt", $text );
+                               file_put_contents(
+                                       $this->saveFailed . '/' . rawurlencode( $title->getPrefixedText() ) . ".txt",
+                                       $text
+                               );
                        }
                        if ( $this->showDiff ) {
-                               $this->output( wfDiff( $this->stripParameters( $output1->getText() ), $this->stripParameters( $output2->getText() ), '' ) );
+                               $this->output( wfDiff(
+                                       $this->stripParameters( $output1->getText() ),
+                                       $this->stripParameters( $output2->getText() ),
+                                       ''
+                               ) );
                        }
                } else {
                        $this->output( $title->getPrefixedText() . "\tOK\n" );
+
                        if ( $this->showParsedOutput ) {
                                $this->output( $this->stripParameters( $output1->getText() ) );
                        }
@@ -149,10 +180,9 @@ class CompareParsers extends DumpIterator {
                /* Look for the parser in a file appropiately named in the current folder */
                if ( !class_exists( $parserName ) && file_exists( "$parserName.php" ) ) {
                        global $wgAutoloadClasses;
-                       $wgAutoloadClasses[ $parserName ] = realpath( '.' ) . "/$parserName.php";
+                       $wgAutoloadClasses[$parserName] = realpath( '.' ) . "/$parserName.php";
                }
        }
-
 }
 
 $maintClass = "CompareParsers";
index 6e6df24..11a81eb 100644 (file)
@@ -36,14 +36,29 @@ class ConvertLinks extends Maintenance {
 
        public function __construct() {
                parent::__construct();
-               $this->mDescription = "Convert from the old links schema (string->ID) to the new schema (ID->ID).
-The wiki should be put into read-only mode while this script executes";
+               $this->mDescription =
+                       "Convert from the old links schema (string->ID) to the new schema (ID->ID)."
+                               . "The wiki should be put into read-only mode while this script executes";
 
                $this->addArg( 'logperformance', "Log performance to perfLogFilename.", false );
-               $this->addArg( 'perfLogFilename', "Filename where performance is logged if --logperformance was set (defaults to 'convLinksPerf.txt').", false );
-               $this->addArg( 'keep-links-table', "Don't overwrite the old links table with the new one, leave the new table at links_temp.", false );
-               $this->addArg( 'nokeys', "Don't create keys, and so allow duplicates in the new links table.\n
-This gives a huge speed improvement for very large links tables which are MyISAM." /* (What about InnoDB?) */, false );
+               $this->addArg(
+                       'perfLogFilename',
+                       "Filename where performance is logged if --logperformance was set "
+                               . "(defaults to 'convLinksPerf.txt').",
+                       false
+               );
+               $this->addArg(
+                       'keep-links-table',
+                       "Don't overwrite the old links table with the new one, leave the new table at links_temp.",
+                       false
+               );
+               $this->addArg(
+                       'nokeys',
+                       /* (What about InnoDB?) */
+                       "Don't create keys, and so allow duplicates in the new links table.\n"
+                               . "This gives a huge speed improvement for very large links tables which are MyISAM.",
+                       false
+               );
        }
 
        public function getDbType() {
@@ -56,22 +71,34 @@ This gives a huge speed improvement for very large links tables which are MyISAM
                $type = $dbw->getType();
                if ( $type != 'mysql' ) {
                        $this->output( "Link table conversion not necessary for $type\n" );
+
                        return;
                }
 
                global $wgContLang;
 
-               $numBadLinks = $curRowsRead = 0; # counters etc
-               $totalTuplesInserted = 0; # total tuples INSERTed into links_temp
+               # counters etc
+               $numBadLinks = $curRowsRead = 0;
+
+               # total tuples INSERTed into links_temp
+               $totalTuplesInserted = 0;
+
+               # whether or not to give progress reports while reading IDs from cur table
+               $reportCurReadProgress = true;
 
-               $reportCurReadProgress = true; # whether or not to give progress reports while reading IDs from cur table
-               $curReadReportInterval = 1000; # number of rows between progress reports
+               # number of rows between progress reports
+               $curReadReportInterval = 1000;
 
-               $reportLinksConvProgress = true; # whether or not to give progress reports during conversion
-               $linksConvInsertInterval = 1000; # number of rows per INSERT
+               # whether or not to give progress reports during conversion
+               $reportLinksConvProgress = true;
+
+               # number of rows per INSERT
+               $linksConvInsertInterval = 1000;
 
                $initialRowOffset = 0;
-               # $finalRowOffset = 0; # not used yet; highest row number from links table to process
+
+               # not used yet; highest row number from links table to process
+               # $finalRowOffset = 0;
 
                $overwriteLinksTable = !$this->hasOption( 'keep-links-table' );
                $noKeys = $this->hasOption( 'noKeys' );
@@ -80,16 +107,19 @@ This gives a huge speed improvement for very large links tables which are MyISAM
 
                # --------------------------------------------------------------------
 
-               list( $cur, $links, $links_temp, $links_backup ) = $dbw->tableNamesN( 'cur', 'links', 'links_temp', 'links_backup' );
+               list( $cur, $links, $links_temp, $links_backup ) =
+                       $dbw->tableNamesN( 'cur', 'links', 'links_temp', 'links_backup' );
 
                if ( $dbw->tableExists( 'pagelinks' ) ) {
                        $this->output( "...have pagelinks; skipping old links table updates\n" );
+
                        return;
                }
 
                $res = $dbw->query( "SELECT l_from FROM $links LIMIT 1" );
                if ( $dbw->fieldType( $res, 0 ) == "int" ) {
                        $this->output( "Schema already converted\n" );
+
                        return;
                }
 
@@ -104,7 +134,7 @@ This gives a huge speed improvement for very large links tables which are MyISAM
                } else {
                        $fh = false;
                        if ( $this->logPerformance ) {
-                               $fh = fopen ( $perfLogFilename, "w" );
+                               $fh = fopen( $perfLogFilename, "w" );
                                if ( !$fh ) {
                                        $this->error( "Couldn't open $perfLogFilename" );
                                        $this->logPerformance = false;
@@ -113,8 +143,8 @@ This gives a huge speed improvement for very large links tables which are MyISAM
                        $baseTime = $startTime = $this->getMicroTime();
                        # Create a title -> cur_id map
                        $this->output( "Loading IDs from $cur table...\n" );
-                       $this->performanceLog ( $fh, "Reading $numRows rows from cur table...\n" );
-                       $this->performanceLog ( $fh, "rows read vs seconds elapsed:\n" );
+                       $this->performanceLog( $fh, "Reading $numRows rows from cur table...\n" );
+                       $this->performanceLog( $fh, "rows read vs seconds elapsed:\n" );
 
                        $dbw->bufferResults( false );
                        $res = $dbw->query( "SELECT cur_namespace,cur_title,cur_id FROM $cur" );
@@ -129,7 +159,10 @@ This gives a huge speed improvement for very large links tables which are MyISAM
                                $curRowsRead++;
                                if ( $reportCurReadProgress ) {
                                        if ( ( $curRowsRead % $curReadReportInterval ) == 0 ) {
-                                               $this->performanceLog( $fh, $curRowsRead . " " . ( $this->getMicroTime() - $baseTime ) . "\n" );
+                                               $this->performanceLog(
+                                                       $fh,
+                                                       $curRowsRead . " " . ( $this->getMicroTime() - $baseTime ) . "\n"
+                                               );
                                                $this->output( "\t$curRowsRead rows of $cur table read.\n" );
                                        }
                                }
@@ -137,7 +170,10 @@ This gives a huge speed improvement for very large links tables which are MyISAM
                        $dbw->freeResult( $res );
                        $dbw->bufferResults( true );
                        $this->output( "Finished loading IDs.\n\n" );
-                       $this->performanceLog( $fh, "Took " . ( $this->getMicroTime() - $baseTime ) . " seconds to load IDs.\n\n" );
+                       $this->performanceLog(
+                               $fh,
+                               "Took " . ( $this->getMicroTime() - $baseTime ) . " seconds to load IDs.\n\n"
+                       );
 
                        # --------------------------------------------------------------------
 
@@ -150,7 +186,9 @@ This gives a huge speed improvement for very large links tables which are MyISAM
                        $this->performanceLog( $fh, "Processing $numRows rows from $links table...\n" );
                        $this->performanceLog( $fh, "rows inserted vs seconds elapsed:\n" );
 
-                       for ( $rowOffset = $initialRowOffset; $rowOffset < $numRows; $rowOffset += $linksConvInsertInterval ) {
+                       for ( $rowOffset = $initialRowOffset; $rowOffset < $numRows;
+                               $rowOffset += $linksConvInsertInterval
+                       ) {
                                $sqlRead = "SELECT * FROM $links ";
                                $sqlRead = $dbw->limitResult( $sqlRead, $linksConvInsertInterval, $rowOffset );
                                $res = $dbw->query( $sqlRead );
@@ -176,7 +214,8 @@ This gives a huge speed improvement for very large links tables which are MyISAM
                                        }
                                }
                                $dbw->freeResult( $res );
-                               # $this->output( "rowOffset: $rowOffset\ttuplesAdded: $tuplesAdded\tnumBadLinks: $numBadLinks\n" );
+                               # $this->output( "rowOffset: $rowOffset\ttuplesAdded: "
+                               #       . "$tuplesAdded\tnumBadLinks: $numBadLinks\n" );
                                if ( $tuplesAdded != 0 ) {
                                        if ( $reportLinksConvProgress ) {
                                                $this->output( "Inserting $tuplesAdded tuples into $links_temp..." );
@@ -185,15 +224,25 @@ This gives a huge speed improvement for very large links tables which are MyISAM
                                        $totalTuplesInserted += $tuplesAdded;
                                        if ( $reportLinksConvProgress ) {
                                                $this->output( " done. Total $totalTuplesInserted tuples inserted.\n" );
-                                               $this->performanceLog( $fh, $totalTuplesInserted . " " . ( $this->getMicroTime() - $baseTime ) . "\n" );
+                                               $this->performanceLog(
+                                                       $fh,
+                                                       $totalTuplesInserted . " " . ( $this->getMicroTime() - $baseTime ) . "\n"
+                                               );
                                        }
                                }
                        }
-                       $this->output( "$totalTuplesInserted valid titles and $numBadLinks invalid titles were processed.\n\n" );
-                       $this->performanceLog( $fh, "$totalTuplesInserted valid titles and $numBadLinks invalid titles were processed.\n" );
-                       $this->performanceLog( $fh, "Total execution time: " . ( $this->getMicroTime() - $startTime ) . " seconds.\n" );
+                       $this->output( "$totalTuplesInserted valid titles and "
+                               . "$numBadLinks invalid titles were processed.\n\n" );
+                       $this->performanceLog(
+                               $fh,
+                               "$totalTuplesInserted valid titles and $numBadLinks invalid titles were processed.\n"
+                       );
+                       $this->performanceLog(
+                               $fh,
+                               "Total execution time: " . ( $this->getMicroTime() - $startTime ) . " seconds.\n"
+                       );
                        if ( $this->logPerformance ) {
-                               fclose ( $fh );
+                               fclose( $fh );
                        }
                }
                # --------------------------------------------------------------------
@@ -222,6 +271,7 @@ This gives a huge speed improvement for very large links tables which are MyISAM
 
                if ( !( $dbConn->isOpen() ) ) {
                        $this->output( "Opening connection to database failed.\n" );
+
                        return;
                }
                $links_temp = $dbConn->tableName( 'links_temp' );
@@ -233,14 +283,14 @@ This gives a huge speed improvement for very large links tables which are MyISAM
                $this->output( "Creating temporary links table..." );
                if ( $this->hasOption( 'noKeys' ) ) {
                        $dbConn->query( "CREATE TABLE $links_temp ( " .
-                       "l_from int(8) unsigned NOT NULL default '0', " .
-                       "l_to int(8) unsigned NOT NULL default '0')" );
+                               "l_from int(8) unsigned NOT NULL default '0', " .
+                               "l_to int(8) unsigned NOT NULL default '0')" );
                } else {
                        $dbConn->query( "CREATE TABLE $links_temp ( " .
-                       "l_from int(8) unsigned NOT NULL default '0', " .
-                       "l_to int(8) unsigned NOT NULL default '0', " .
-                       "UNIQUE KEY l_from(l_from,l_to), " .
-                       "KEY (l_to))" );
+                               "l_from int(8) unsigned NOT NULL default '0', " .
+                               "l_to int(8) unsigned NOT NULL default '0', " .
+                               "UNIQUE KEY l_from(l_from,l_to), " .
+                               "KEY (l_to))" );
                }
                $this->output( " done.\n\n" );
        }
@@ -253,6 +303,7 @@ This gives a huge speed improvement for very large links tables which are MyISAM
 
        private function getMicroTime() { # return time in seconds, with microsecond accuracy
                list( $usec, $sec ) = explode( " ", microtime() );
+
                return ( (float)$usec + (float)$sec );
        }
 }
index 24be2b4..bf57244 100644 (file)
@@ -46,6 +46,7 @@ class ConvertUserOptions extends Maintenance {
 
                if ( !$dbw->fieldExists( 'user', 'user_options', __METHOD__ ) ) {
                        $this->output( "nothing to migrate. " );
+
                        return;
                }
                while ( $id !== null ) {
index 86e47af..9ed63c3 100644 (file)
@@ -373,6 +373,7 @@ class CopyFileBackend extends Maintenance {
                        $same = ( $src->getFileSha1Base36( array( 'src' => $sPath, 'latest' => 1 ) )
                                === $dst->getFileSha1Base36( array( 'src' => $dPath, 'latest' => 1 ) ) );
                }
+
                return $same;
        }
 }
index c5a7827..a9c9547 100644 (file)
@@ -89,6 +89,7 @@ class CopyJobQueue extends Maintenance {
                        $totalOK += count( $batch );
                        $dst->waitForBackups();
                }
+
                return array( $total, $totalOK );
        }
 }
index aa25ee6..79f7254 100644 (file)
@@ -31,13 +31,15 @@ require_once __DIR__ . '/Maintenance.php';
  * @ingroup Maintenance
  */
 class CreateAndPromote extends Maintenance {
-
-       static $permitRoles = array( 'sysop', 'bureaucrat', 'bot' );
+       private static $permitRoles = array( 'sysop', 'bureaucrat', 'bot' );
 
        public function __construct() {
                parent::__construct();
                $this->mDescription = "Create a new user account and/or grant it additional rights";
-               $this->addOption( "force", "If acccount exists already, just grant it rights or change password." );
+               $this->addOption(
+                       'force',
+                       'If acccount exists already, just grant it rights or change password.'
+               );
                foreach ( self::$permitRoles as $role ) {
                        $this->addOption( $role, "Add the account to the {$role} group" );
                }
@@ -67,10 +69,14 @@ class CreateAndPromote extends Maintenance {
                        $inGroups = $user->getGroups();
                }
 
-               $promotions = array_diff( array_filter( self::$permitRoles, array( $this, 'hasOption' ) ), $inGroups );
+               $promotions = array_diff(
+                       array_filter( self::$permitRoles, array( $this, 'hasOption' ) ),
+                       $inGroups
+               );
 
                if ( $exists && !$password && count( $promotions ) === 0 ) {
                        $this->output( "Account exists and nothing to do.\n" );
+
                        return;
                } elseif ( count( $promotions ) !== 0 ) {
                        $promoText = "User:{$username} into " . implode( ', ', $promotions ) . "...\n";
index d58e9a4..33da666 100644 (file)
@@ -49,9 +49,13 @@ class DeleteArchivedFilesImplementation {
                                $sha1 = LocalRepo::getHashFromKey( $key );
                        }
                        // Check if the file is used anywhere...
-                       $inuse = $dbw->selectField( 'oldimage', '1',
-                               array( 'oi_sha1' => $sha1,
-                               'oi_deleted & ' . File::DELETED_FILE => File::DELETED_FILE ),
+                       $inuse = $dbw->selectField(
+                               'oldimage',
+                               '1',
+                               array(
+                                       'oi_sha1' => $sha1,
+                                       'oi_deleted & ' . File::DELETED_FILE => File::DELETED_FILE
+                               ),
                                __METHOD__,
                                array( 'FOR UPDATE' )
                        );
index ad7b54d..286b1f2 100644 (file)
@@ -47,6 +47,7 @@ class DeleteArchivedFiles extends Maintenance {
        public function execute() {
                if ( !$this->hasOption( 'delete' ) ) {
                        $this->output( "Use --delete to actually confirm this script\n" );
+
                        return;
                }
                $force = $this->hasOption( 'force' );
index 62465ab..ed620ee 100644 (file)
@@ -30,7 +30,6 @@ class DeleteArchivedRevisionsImplementation {
 
        /**
         * Perform the delete on archived revisions.
-
         * @param object $maint An object (typically of class Maintenance)
         * that implements two methods: handleOutput() and
         * purgeRedundantText().  See Maintenance for a description of
index ffd581c..30883ba 100644 (file)
@@ -36,7 +36,8 @@ require_once __DIR__ . '/deleteArchivedRevisions.inc';
 class DeleteArchivedRevisions extends Maintenance {
        public function __construct() {
                parent::__construct();
-               $this->mDescription = "Deletes all archived revisions\nThese revisions will no longer be restorable";
+               $this->mDescription =
+                       "Deletes all archived revisions\nThese revisions will no longer be restorable";
                $this->addOption( 'delete', 'Performs the deletion' );
        }
 
@@ -53,7 +54,8 @@ class DeleteArchivedRevisions extends Maintenance {
                        $dbw = wfGetDB( DB_MASTER );
                        $res = $dbw->selectRow( 'archive', 'COUNT(*) as count', array(), __FUNCTION__ );
                        $this->output( "Found {$res->count} revisions to delete.\n" );
-                       $this->output( "Please run the script again with the --delete option to really delete the revisions.\n" );
+                       $this->output( "Please run the script again with the --delete option "
+                               . "to really delete the revisions.\n" );
                }
        }
 }
index c1cc03c..93507b3 100644 (file)
@@ -3,11 +3,11 @@
  * Deletes a batch of pages.
  * Usage: php deleteBatch.php [-u <user>] [-r <reason>] [-i <interval>] [listfile]
  * where
- *     [listfile] is a file where each line contains the title of a page to be
- *             deleted, standard input is used if listfile is not given.
- *     <user> is the username
- *     <reason> is the delete reason
- *     <interval> is the number of seconds to sleep for after each delete
+ *   [listfile] is a file where each line contains the title of a page to be
+ *     deleted, standard input is used if listfile is not given.
+ *   <user> is the username
+ *   <reason> is the delete reason
+ *   <interval> is the number of seconds to sleep for after each delete
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -79,7 +79,9 @@ class DeleteBatch extends Maintenance {
                $dbw = wfGetDB( DB_MASTER );
 
                # Handle each entry
+               // @codingStandardsIgnoreStart Ignore Generic.CodeAnalysis.ForLoopWithTestFunctionCall.NotAllowed
                for ( $linenum = 1; !feof( $file ); $linenum++ ) {
+                       // @codingStandardsIgnoreEnd
                        $line = trim( fgets( $file ) );
                        if ( $line == '' ) {
                                continue;
@@ -97,7 +99,7 @@ class DeleteBatch extends Maintenance {
                        $this->output( $title->getPrefixedText() );
                        $dbw->begin( __METHOD__ );
                        if ( $title->getNamespace() == NS_FILE ) {
-                               $img = wfFindFile( $title );
+                               $img = wfFindFile( $title, array( 'ignoreRedirect' => true ) );
                                if ( $img && $img->isLocal() && !$img->delete( $reason ) ) {
                                        $this->output( " FAILED to delete associated file... " );
                                }
index 7d8c80e..5aeeb8e 100644 (file)
@@ -34,7 +34,7 @@ class DeleteDefaultMessages extends Maintenance {
        public function __construct() {
                parent::__construct();
                $this->mDescription = "Deletes all pages in the MediaWiki namespace" .
-                                                               " which were last edited by \"MediaWiki default\"";
+                       " which were last edited by \"MediaWiki default\"";
        }
 
        public function execute() {
@@ -54,6 +54,7 @@ class DeleteDefaultMessages extends Maintenance {
                if ( $dbr->numRows( $res ) == 0 ) {
                        # No more messages left
                        $this->output( "done.\n" );
+
                        return;
                }
 
index 8175891..1a54df1 100644 (file)
@@ -130,6 +130,7 @@ class DeleteEqualMessages extends Maintenance {
                if ( $messageInfo['equalPages'] === 0 ) {
                        // No more equal messages left
                        $this->output( "\ndone.\n" );
+
                        return;
                }
 
@@ -151,6 +152,7 @@ class DeleteEqualMessages extends Maintenance {
                                $this->output( " (include --delete-talk to also delete the talk pages)" );
                        }
                        $this->output( "\n" );
+
                        return;
                }
 
@@ -170,7 +172,6 @@ class DeleteEqualMessages extends Maintenance {
                foreach ( $messageInfo['results'] as $result ) {
                        wfWaitForSlaves();
                        $dbw->ping();
-                       $dbw->begin( __METHOD__ );
                        $title = Title::makeTitle( NS_MEDIAWIKI, $result['title'] );
                        $this->output( "\n* [[$title]]" );
                        $page = WikiPage::factory( $title );
@@ -183,7 +184,6 @@ class DeleteEqualMessages extends Maintenance {
                                $error = ''; // Passed by ref
                                $page->doDeleteArticle( 'Orphaned talk page of no longer required message', false, 0, false, $error, $user );
                        }
-                       $dbw->commit( __METHOD__ );
                }
                $this->output( "\n\ndone!\n" );
        }
index 835de35..4799e5e 100644 (file)
@@ -60,7 +60,12 @@ class DeleteImageCache extends Maintenance {
 
                foreach ( $res as $row ) {
                        if ( $i % $this->report == 0 ) {
-                               $this->output( sprintf( "%s: %13s done (%s)\n", wfWikiID(), "$i/$total", wfPercent( $i / $total * 100 ) ) );
+                               $this->output( sprintf(
+                                       "%s: %13s done (%s)\n",
+                                       wfWikiID(),
+                                       "$i/$total",
+                                       wfPercent( $i / $total * 100 )
+                               ) );
                        }
                        $md5 = md5( $row->img_name );
                        $wgMemc->delete( wfMemcKey( 'Image', $md5 ) );
@@ -75,6 +80,7 @@ class DeleteImageCache extends Maintenance {
 
        private function getImageCount() {
                $dbr = wfGetDB( DB_SLAVE );
+
                return $dbr->selectField( 'image', 'COUNT(*)', array(), __METHOD__ );
        }
 }
index 9922a1d..7f1ffe4 100644 (file)
@@ -49,7 +49,8 @@ class DeleteOrphanedRevisions extends Maintenance {
 
                # Find all the orphaned revisions
                $this->output( "Checking for orphaned revisions..." );
-               $sql = "SELECT rev_id FROM {$revision} LEFT JOIN {$page} ON rev_page = page_id WHERE page_namespace IS NULL";
+               $sql = "SELECT rev_id FROM {$revision} LEFT JOIN {$page} ON rev_page = page_id "
+                       . "WHERE page_namespace IS NULL";
                $res = $dbw->query( $sql, 'deleteOrphanedRevisions' );
 
                # Stash 'em all up for deletion (if needed)
index 6bc0f7c..818ee36 100644 (file)
@@ -42,41 +42,64 @@ class DeleteRevision extends Maintenance {
                }
 
                $this->output( "Deleting revision(s) " . implode( ',', $this->mArgs ) .
-                                               " from " . wfWikiID() . "...\n" );
+                       " from " . wfWikiID() . "...\n" );
                $dbw = wfGetDB( DB_MASTER );
 
                $affected = 0;
                foreach ( $this->mArgs as $revID ) {
                        $dbw->insertSelect( 'archive', array( 'page', 'revision' ),
                                array(
-                                       'ar_namespace'  => 'page_namespace',
-                                       'ar_title'      => 'page_title',
-                                       'ar_page_id'    => 'page_id',
-                                       'ar_comment'    => 'rev_comment',
-                                       'ar_user'       => 'rev_user',
-                                       'ar_user_text'  => 'rev_user_text',
-                                       'ar_timestamp'  => 'rev_timestamp',
+                                       'ar_namespace' => 'page_namespace',
+                                       'ar_title' => 'page_title',
+                                       'ar_page_id' => 'page_id',
+                                       'ar_comment' => 'rev_comment',
+                                       'ar_user' => 'rev_user',
+                                       'ar_user_text' => 'rev_user_text',
+                                       'ar_timestamp' => 'rev_timestamp',
                                        'ar_minor_edit' => 'rev_minor_edit',
-                                       'ar_rev_id'     => 'rev_id',
-                                       'ar_text_id'    => 'rev_text_id',
-                                       'ar_deleted'    => 'rev_deleted',
-                                       'ar_len'        => 'rev_len',
-                               ), array(
+                                       'ar_rev_id' => 'rev_id',
+                                       'ar_text_id' => 'rev_text_id',
+                                       'ar_deleted' => 'rev_deleted',
+                                       'ar_len' => 'rev_len',
+                               ),
+                               array(
                                        'rev_id' => $revID,
                                        'page_id = rev_page'
-                               ), __METHOD__
+                               ),
+                               __METHOD__
                        );
                        if ( !$dbw->affectedRows() ) {
                                $this->output( "Revision $revID not found\n" );
                        } else {
                                $affected += $dbw->affectedRows();
-                               $pageID = $dbw->selectField( 'revision', 'rev_page', array( 'rev_id' => $revID ), __METHOD__ );
-                               $pageLatest = $dbw->selectField( 'page', 'page_latest', array( 'page_id' => $pageID ), __METHOD__ );
+                               $pageID = $dbw->selectField(
+                                       'revision',
+                                       'rev_page',
+                                       array( 'rev_id' => $revID ),
+                                       __METHOD__
+                               );
+                               $pageLatest = $dbw->selectField(
+                                       'page',
+                                       'page_latest',
+                                       array( 'page_id' => $pageID ),
+                                       __METHOD__
+                               );
                                $dbw->delete( 'revision', array( 'rev_id' => $revID ) );
                                if ( $pageLatest == $revID ) {
                                        // Database integrity
-                                       $newLatest = $dbw->selectField( 'revision', 'rev_id', array( 'rev_page' => $pageID ), __METHOD__, array( 'ORDER BY' => 'rev_timestamp DESC' ) );
-                                       $dbw->update( 'page', array( 'page_latest' => $newLatest ), array( 'page_id' => $pageID ), __METHOD__ );
+                                       $newLatest = $dbw->selectField(
+                                               'revision',
+                                               'rev_id',
+                                               array( 'rev_page' => $pageID ),
+                                               __METHOD__,
+                                               array( 'ORDER BY' => 'rev_timestamp DESC' )
+                                       );
+                                       $dbw->update(
+                                               'page',
+                                               array( 'page_latest' => $newLatest ),
+                                               array( 'page_id' => $pageID ),
+                                               __METHOD__
+                                       );
                                }
                        }
                }
index a3cc0ba..246d6fc 100644 (file)
@@ -59,6 +59,7 @@ if ( $ext == 'php' || $ext == 'php5' ) {
        # the php webserver will discard post data and things like login
        # will not function in the dev environment.
        require $file;
+
        return true;
 }
 $mime = false;
@@ -93,6 +94,7 @@ if ( $mime ) {
        header( "Content-Length: " . filesize( $file ) );
        // Stream that out to the browser
        fpassthru( $f );
+
        return true;
 }
 
index bf13c38..f555113 100644 (file)
@@ -939,7 +939,6 @@ collapsable
 collectionsaveascommunitypage
 collectionsaveasuserpage
 colname
-cologneblue
 colonseparator
 colorer
 colspan
index 2b637cb..47e6a89 100644 (file)
@@ -82,8 +82,10 @@ if ( defined( 'MW_CONFIG_CALLBACK' ) ) {
                // @todo FIXME: Replace this hack with general farm-friendly code
                # @todo FIXME: Wikimedia-specific stuff needs to go away to an ext
                # Maybe a hook?
+               // @codingStandardsIgnoreStart MediaWiki.NamingConventions.ValidGlobalName.wgPrefix
                global $cluster;
                $cluster = 'pmtpa';
+               // @codingStandardsIgnoreEnd
                require "$IP/../wmf-config/wgConf.php";
        }
        // Require the configuration (probably LocalSettings.php)
@@ -91,7 +93,10 @@ if ( defined( 'MW_CONFIG_CALLBACK' ) ) {
 }
 
 if ( $maintenance->getDbType() === Maintenance::DB_NONE ) {
-       if ( $wgLocalisationCacheConf['storeClass'] === false && ( $wgLocalisationCacheConf['store'] == 'db' || ( $wgLocalisationCacheConf['store'] == 'detect' && !$wgCacheDirectory ) ) ) {
+       if ( $wgLocalisationCacheConf['storeClass'] === false
+               && ( $wgLocalisationCacheConf['store'] == 'db'
+                       || ( $wgLocalisationCacheConf['store'] == 'detect' && !$wgCacheDirectory ) )
+       ) {
                $wgLocalisationCacheConf['storeClass'] = 'LCStoreNull';
        }
 }
index 02bfd60..18c78dc 100644 (file)
@@ -127,5 +127,5 @@ Fancy stuff: (Works? Add examples please.)
   --filter=<type>[:<options>] Add a filter on an output branch
 
 ENDS
-);
+       );
 }
index cf3523e..4b2ff71 100644 (file)
@@ -57,8 +57,11 @@ abstract class DumpIterator extends Maintenance {
                        $revision = new WikiRevision;
 
                        $revision->setText( file_get_contents( $this->getOption( 'file' ) ) );
-                       $revision->setTitle( Title::newFromText( rawurldecode( basename( $this->getOption( 'file' ), '.txt' ) ) ) );
+                       $revision->setTitle( Title::newFromText(
+                               rawurldecode( basename( $this->getOption( 'file' ), '.txt' ) )
+                       ) );
                        $this->handleRevision( $revision );
+
                        return;
                }
 
@@ -67,7 +70,8 @@ abstract class DumpIterator extends Maintenance {
                if ( $this->getOption( 'dump' ) == '-' ) {
                        $source = new ImportStreamSource( $this->getStdin() );
                } else {
-                       $this->error( "Sorry, I don't support dump filenames yet. Use - and provide it on stdin on the meantime.", true );
+                       $this->error( "Sorry, I don't support dump filenames yet. "
+                               . "Use - and provide it on stdin on the meantime.", true );
                }
                $importer = new WikiImporter( $source );
 
@@ -86,8 +90,9 @@ abstract class DumpIterator extends Maintenance {
                        $this->error( round( $this->count / $delta, 2 ) . " pages/sec" );
                }
 
-               # Perform the memory_get_peak_usage() when all the other data has been output so there's no damage if it dies.
-               # It is only available since 5.2.0 (since 5.2.1 if you haven't compiled with --enable-memory-limit)
+               # Perform the memory_get_peak_usage() when all the other data has been
+               # output so there's no damage if it dies. It is only available since
+               # 5.2.0 (since 5.2.1 if you haven't compiled with --enable-memory-limit)
                $this->error( "Memory peak usage of " . memory_get_peak_usage() . " bytes\n" );
        }
 
@@ -118,6 +123,7 @@ abstract class DumpIterator extends Maintenance {
                $title = $rev->getTitle();
                if ( !$title ) {
                        $this->error( "Got bogus revision with null title!" );
+
                        return;
                }
 
index 71895bd..7c17607 100644 (file)
@@ -61,5 +61,5 @@ Options:
   --spawn        Spawn a subprocess for loading text records
   --help      Display this help message
 ENDS
-);
+       );
 }
index d6c70f8..9d53f07 100644 (file)
@@ -64,7 +64,7 @@ By default, outputs relative paths against the parent directory of \$wgUploadDir
                                $this->mSharedSupplement = true;
                        }
                }
-               $this->{ $this->mAction } ( $this->mShared );
+               $this->{$this->mAction} ( $this->mShared );
                if ( $this->mSharedSupplement ) {
                        $this->fetchUsed( true );
                }
index df5a208..fc676b8 100644 (file)
@@ -37,11 +37,11 @@ class FetchText extends Maintenance {
 
        /**
         * returns a string containing the following in order:
-        *       textid
-        *       \n
-        *       length of text (-1 on error = failure to retrieve/unserialize/gunzip/etc)
-        *       \n
-        *       text  (may be empty)
+        *   textid
+        *   \n
+        *   length of text (-1 on error = failure to retrieve/unserialize/gunzip/etc)
+        *   \n
+        *   text  (may be empty)
         *
         * note that that the text string itself is *not* followed by newline
         */
@@ -59,8 +59,7 @@ class FetchText extends Maintenance {
                        if ( $text === false ) {
                                # actual error, not zero-length text
                                $textLen = "-1";
-                       }
-                       else {
+                       } else {
                                $textLen = strlen( $text );
                        }
                        $this->output( $textId . "\n" . $textLen . "\n" . $text );
@@ -83,6 +82,7 @@ class FetchText extends Maintenance {
                if ( $text === false ) {
                        return false;
                }
+
                return $text;
        }
 }
index 82c5b95..86c01f4 100644 (file)
@@ -146,10 +146,11 @@ class FindHooks extends Maintenance {
         * @return array Array of documented hooks
         */
        private function getHooksFromLocalDoc( $doc ) {
-                       $m = array();
-                       $content = file_get_contents( $doc );
-                       preg_match_all( "/\n'(.*?)':/", $content, $m );
-                       return array_unique( $m[1] );
+               $m = array();
+               $content = file_get_contents( $doc );
+               preg_match_all( "/\n'(.*?)':/", $content, $m );
+
+               return array_unique( $m[1] );
        }
 
        /**
@@ -157,29 +158,36 @@ class FindHooks extends Maintenance {
         * @return 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' );
-                       $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;
-                               }
+               // All hooks
+               $allhookdata = Http::get(
+                       'http://www.mediawiki.org/w/api.php?action=query&list=categorymembers&'
+                       . 'cmtitle=Category:MediaWiki_hooks&cmlimit=500&format=php'
+               );
+               $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;
                        }
-                       // 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;
-                               }
+               }
+               // 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;
                        }
-                       return array_diff( $allhooks, $removed );
+               }
+
+               return array_diff( $allhooks, $removed );
        }
 
        /**
@@ -190,7 +198,12 @@ class FindHooks extends Maintenance {
        private function getHooksFromFile( $file ) {
                $content = file_get_contents( $file );
                $m = array();
-               preg_match_all( '/(?:wfRunHooks|Hooks\:\:run|ContentHandler\:\:runLegacyHooks)\(\s*([\'"])(.*?)\1/', $content, $m );
+               preg_match_all(
+                       '/(?:wfRunHooks|Hooks\:\:run|ContentHandler\:\:runLegacyHooks)\(\s*([\'"])(.*?)\1/',
+                       $content,
+                       $m
+               );
+
                return $m[2];
        }
 
@@ -210,6 +223,7 @@ class FindHooks extends Maintenance {
                        }
                        closedir( $dh );
                }
+
                return $hooks;
        }
 
@@ -227,6 +241,7 @@ class FindHooks extends Maintenance {
                foreach ( $m[0] as $match ) {
                        $list[] = $match . "(" . $file . ")";
                }
+
                return $list;
        }
 
@@ -247,6 +262,7 @@ class FindHooks extends Maintenance {
                        }
                        closedir( $dh );
                }
+
                return $hooks;
        }
 
index 41458d1..0b3cdba 100644 (file)
@@ -85,6 +85,7 @@ class FixDoubleRedirects extends Maintenance {
 
                if ( !$res->numRows() ) {
                        $this->output( "No double redirects found.\n" );
+
                        return;
                }
 
@@ -106,7 +107,8 @@ class FixDoubleRedirects extends Maintenance {
                        if ( !$async ) {
                                $success = ( $dryrun ? true : $job->run() );
                                if ( !$success ) {
-                                       $this->error( "Error fixing " . $titleA->getPrefixedText() . ": " . $job->getLastError() . "\n" );
+                                       $this->error( "Error fixing " . $titleA->getPrefixedText()
+                                               . ": " . $job->getLastError() . "\n" );
                                }
                        } else {
                                $jobs[] = $job;
index 02d65ed..0c60e62 100644 (file)
@@ -34,7 +34,8 @@ require_once __DIR__ . '/Maintenance.php';
 class FixExtLinksProtocolRelative extends LoggedUpdateMaintenance {
        public function __construct() {
                parent::__construct();
-               $this->mDescription = "Fixes any entries in the externallinks table containing protocol-relative URLs";
+               $this->mDescription =
+                       "Fixes any entries in the externallinks table containing protocol-relative URLs";
        }
 
        protected function getUpdateKey() {
@@ -49,6 +50,7 @@ class FixExtLinksProtocolRelative extends LoggedUpdateMaintenance {
                $db = wfGetDB( DB_MASTER );
                if ( !$db->tableExists( 'externallinks' ) ) {
                        $this->error( "externallinks table does not exist" );
+
                        return false;
                }
                $this->output( "Fixing protocol-relative entries in the externallinks table...\n" );
@@ -79,9 +81,18 @@ class FixExtLinksProtocolRelative extends LoggedUpdateMaintenance {
                                        )
                                ), __METHOD__, array( 'IGNORE' )
                        );
-                       $db->delete( 'externallinks', array( 'el_index' => $row->el_index, 'el_from' => $row->el_from, 'el_to' => $row->el_to ), __METHOD__ );
+                       $db->delete(
+                               'externallinks',
+                               array(
+                                       'el_index' => $row->el_index,
+                                       'el_from' => $row->el_from,
+                                       'el_to' => $row->el_to
+                               ),
+                               __METHOD__
+                       );
                }
                $this->output( "Done, $count rows updated.\n" );
+
                return true;
        }
 }
index a09a742..a5418ce 100644 (file)
@@ -30,6 +30,9 @@ require_once __DIR__ . '/Maintenance.php';
  * @ingroup Maintenance
  */
 class FixSlaveDesync extends Maintenance {
+       /** @var array */
+       private $slaveIndexes;
+
        public function __construct() {
                parent::__construct();
                $this->mDescription = "";
@@ -41,7 +44,8 @@ class FixSlaveDesync extends Maintenance {
 
        public function execute() {
                $this->slaveIndexes = array();
-               for ( $i = 1; $i < wfGetLB()->getServerCount(); $i++ ) {
+               $serverCount = wfGetLB()->getServerCount();
+               for ( $i = 1; $i < $serverCount; $i++ ) {
                        if ( wfGetLB()->isNonZeroLoad( $i ) ) {
                                $this->slaveIndexes[] = $i;
                        }
@@ -66,7 +70,12 @@ class FixSlaveDesync extends Maintenance {
                $n = 0;
                $dbw = wfGetDB( DB_MASTER );
                $masterIDs = array();
-               $res = $dbw->select( 'page', array( 'page_id', 'page_latest' ), array( 'page_id<6054123' ), __METHOD__ );
+               $res = $dbw->select(
+                       'page',
+                       array( 'page_id', 'page_latest' ),
+                       array( 'page_id<6054123' ),
+                       __METHOD__
+               );
                $this->output( "Number of pages: " . $res->numRows() . "\n" );
                foreach ( $res as $row ) {
                        $masterIDs[$row->page_id] = $row->page_latest;
@@ -78,7 +87,12 @@ class FixSlaveDesync extends Maintenance {
 
                foreach ( $this->slaveIndexes as $i ) {
                        $db = wfGetDB( $i );
-                       $res = $db->select( 'page', array( 'page_id', 'page_latest' ), array( 'page_id<6054123' ), __METHOD__ );
+                       $res = $db->select(
+                               'page',
+                               array( 'page_id', 'page_latest' ),
+                               array( 'page_id<6054123' ),
+                               __METHOD__
+                       );
                        foreach ( $res as $row ) {
                                if ( isset( $masterIDs[$row->page_id] ) && $masterIDs[$row->page_id] != $row->page_latest ) {
                                        $desync[$row->page_id] = true;
@@ -87,6 +101,7 @@ class FixSlaveDesync extends Maintenance {
                        }
                }
                $this->output( "\n" );
+
                return $desync;
        }
 
@@ -122,6 +137,7 @@ class FixSlaveDesync extends Maintenance {
                if ( !$found ) {
                        $this->output( "page_id $pageID seems fine\n" );
                        $dbw->commit( __METHOD__ );
+
                        return;
                }
 
@@ -141,7 +157,8 @@ class FixSlaveDesync extends Maintenance {
                if ( count( $masterIDs ) < count( $slaveIDs ) ) {
                        $missingIDs = array_diff( $slaveIDs, $masterIDs );
                        if ( count( $missingIDs ) ) {
-                               $this->output( "Found " . count( $missingIDs ) . " lost in master, copying from slave... " );
+                               $this->output( "Found " . count( $missingIDs )
+                                       . " lost in master, copying from slave... " );
                                $dbFrom = $dbw;
                                $found = true;
                                $toMaster = true;
@@ -151,7 +168,8 @@ class FixSlaveDesync extends Maintenance {
                } else {
                        $missingIDs = array_diff( $masterIDs, $slaveIDs );
                        if ( count( $missingIDs ) ) {
-                               $this->output( "Found " . count( $missingIDs ) . " missing revision(s), copying from master... " );
+                               $this->output( "Found " . count( $missingIDs )
+                                       . " missing revision(s), copying from master... " );
                                $dbFrom = $dbw;
                                $found = true;
                                $toMaster = false;
@@ -199,11 +217,23 @@ class FixSlaveDesync extends Maintenance {
                if ( $found ) {
                        $this->output( "Fixing page_latest... " );
                        if ( $toMaster ) {
-                               # $dbw->update( 'page', array( 'page_latest' => $realLatest ), array( 'page_id' => $pageID ), __METHOD__ );
+                               /*
+                               $dbw->update(
+                                       'page',
+                                       array( 'page_latest' => $realLatest ),
+                                       array( 'page_id' => $pageID ),
+                                       __METHOD__
+                               );
+                               */
                        } else {
                                foreach ( $this->slaveIndexes as $i ) {
                                        $db = wfGetDB( $i );
-                                       $db->update( 'page', array( 'page_latest' => $realLatest ), array( 'page_id' => $pageID ), __METHOD__ );
+                                       $db->update(
+                                               'page',
+                                               array( 'page_latest' => $realLatest ),
+                                               array( 'page_id' => $pageID ),
+                                               __METHOD__
+                                       );
                                }
                        }
                        $this->output( "done\n" );
index b0609d1..5431cf2 100644 (file)
@@ -85,11 +85,11 @@ class FixTimestamps extends Maintenance {
                        if ( $sign == 0 || $sign == $expectedSign ) {
                                // Monotonic change
                                $lastNormal = $timestamp;
-                               ++ $numGoodRevs;
+                               ++$numGoodRevs;
                                continue;
                        } elseif ( abs( $delta ) <= $grace ) {
                                // Non-monotonic change within grace interval
-                               ++ $numGoodRevs;
+                               ++$numGoodRevs;
                                continue;
                        } else {
                                // Non-monotonic change larger than grace interval
@@ -100,7 +100,7 @@ class FixTimestamps extends Maintenance {
                $numBadRevs = count( $badRevs );
                if ( $numBadRevs > $numGoodRevs ) {
                        $this->error(
-               "The majority of revisions in the search interval are marked as bad.
+                               "The majority of revisions in the search interval are marked as bad.
 
                Are you sure the offset ($offset) has the right sign? Positive means the clock
                was incorrectly set forward, negative means the clock was incorrectly set back.
@@ -117,7 +117,8 @@ class FixTimestamps extends Maintenance {
 
                $fixup = -$offset;
                $sql = "UPDATE $revisionTable " .
-                       "SET rev_timestamp=DATE_FORMAT(DATE_ADD(rev_timestamp, INTERVAL $fixup SECOND), '%Y%m%d%H%i%s') " .
+                       "SET rev_timestamp="
+                               . "DATE_FORMAT(DATE_ADD(rev_timestamp, INTERVAL $fixup SECOND), '%Y%m%d%H%i%s') " .
                        "WHERE rev_id IN (" . $dbw->makeList( $badRevs ) . ')';
                $dbw->query( $sql, __METHOD__ );
                $this->output( "Done\n" );
index 097936c..878593c 100644 (file)
@@ -44,10 +44,20 @@ class FixUserRegistration extends Maintenance {
                foreach ( $res as $row ) {
                        $id = $row->user_id;
                        // Get first edit time
-                       $timestamp = $dbr->selectField( 'revision', 'MIN(rev_timestamp)', array( 'rev_user' => $id ), __METHOD__ );
+                       $timestamp = $dbr->selectField(
+                               'revision',
+                               'MIN(rev_timestamp)',
+                               array( 'rev_user' => $id ),
+                               __METHOD__
+                       );
                        // Update
                        if ( !empty( $timestamp ) ) {
-                               $dbw->update( 'user', array( 'user_registration' => $timestamp ), array( 'user_id' => $id ), __METHOD__ );
+                               $dbw->update(
+                                       'user',
+                                       array( 'user_registration' => $timestamp ),
+                                       array( 'user_id' => $id ),
+                                       __METHOD__
+                               );
                                $this->output( "$id $timestamp\n" );
                        } else {
                                $this->output( "$id NULL\n" );
index 23c134b..83e731a 100644 (file)
@@ -36,15 +36,87 @@ class GenerateJsonI18n extends Maintenance {
        public function __construct() {
                parent::__construct();
                $this->mDescription = "Build JSON messages files from a PHP messages file";
-               $this->addArg( 'phpfile', 'PHP file defining a $messages array', true );
-               $this->addArg( 'jsondir', 'Directory to write JSON files to', true );
+
+               $this->addArg( 'phpfile', 'PHP file defining a $messages array', false );
+               $this->addArg( 'jsondir', 'Directory to write JSON files to', false );
                $this->addOption( 'langcode', 'Language code; only needed for converting core i18n files',
                        false, true );
+               $this->addOption( 'extension', 'Perform default conversion on an extension',
+                       false, true );
+               $this->addOption( 'shim-only', 'Only create or update the backward-compatibility shim' );
+               $this->addOption( 'supplementary', 'Find supplementary i18n files in subdirs and convert those',
+                       false, false );
        }
 
        public function execute() {
+               global $IP;
+
                $phpfile = $this->getArg( 0 );
                $jsondir = $this->getArg( 1 );
+               $extension = $this->getOption( 'extension' );
+               $convertSupplementaryI18nFiles = $this->hasOption( 'supplementary' );
+
+               if ( $extension ) {
+                       if ( $phpfile ) {
+                               $this->error( "The phpfile is already specified, conflicts with --extension.\n", 1 );
+                       }
+                       $phpfile = "$IP/extensions/$extension/$extension.i18n.php";
+               }
+
+               if ( !$phpfile ) {
+                       $this->error( "I'm here for an argument!\n" );
+                       $this->maybeHelp( true );
+                       // dies.
+               }
+
+               if ( $convertSupplementaryI18nFiles ) {
+                       if ( is_readable( $phpfile ) ) {
+                               $this->transformI18nFile( $phpfile, $jsondir );
+                       } else {
+                               // This is non-fatal because we might want to continue searching for
+                               // i18n files in subdirs even if the extension does not include a
+                               // primary i18n.php.
+                               $this->error( "Warning: no primary i18n file was found." );
+                       }
+                       $this->output( "Searching for supplementary i18n files...\n" );
+                       $dir_iterator = new RecursiveDirectoryIterator( dirname( $phpfile ) );
+                       $iterator = new RecursiveIteratorIterator( $dir_iterator, RecursiveIteratorIterator::LEAVES_ONLY );
+                       foreach ( $iterator as $path => $fileObject ) {
+                               if ( fnmatch( "*.i18n.php", $fileObject->getFilename() ) ) {
+                                       $this->output( "Converting $path.\n" );
+                                       $this->transformI18nFile( $path );
+                               }
+                       }
+               } else {
+                       // Just convert the primary i18n file.
+                       $this->transformI18nFile( $phpfile, $jsondir );
+               }
+       }
+
+       public function transformI18nFile( $phpfile, $jsondir = null ) {
+               if ( !$jsondir ) {
+                       // Assume the json directory should be in the same directory as the
+                       // .i18n.php file.
+                       $jsondir = dirname( $phpfile ) . "/i18n";
+               }
+               if ( !is_dir( $jsondir ) ) {
+                       $this->output( "Creating directory $jsondir.\n" );
+                       $success = mkdir( $jsondir );
+                       if ( !$success ) {
+                               $this->error( "Could not create directory $jsondir\n", 1 );
+                       }
+               }
+
+               if ( $this->hasOption( 'shim-only' ) ) {
+                       $this->shimOnly( $phpfile, $jsondir );
+
+                       return;
+               }
+
+               if ( $jsondir === null ) {
+                       $this->error( 'Argument [jsondir] is required unless --shim-only is specified.' );
+                       $this->maybeHelp( true );
+               }
 
                if ( !is_readable( $phpfile ) ) {
                        $this->error( "Error reading $phpfile\n", 1 );
@@ -83,7 +155,7 @@ class GenerateJsonI18n extends Maintenance {
                        $jsonfile = "$jsondir/$langcode.json";
                        $success = file_put_contents(
                                $jsonfile,
-                               FormatJson::encode( $langmsgs, true, FormatJson::ALL_OK ) . "\n"
+                               FormatJson::encode( $langmsgs, "\t", FormatJson::ALL_OK ) . "\n"
                        );
                        if ( $success === false ) {
                                $this->error( "FAILED to write $jsonfile", 1 );
@@ -100,6 +172,35 @@ class GenerateJsonI18n extends Maintenance {
                $this->output( "Also add \$wgMessagesDirs['YourExtension'] = __DIR__ . '/i18n';\n" );
        }
 
+       protected function shimOnly( $phpfile, $jsondir ) {
+               if ( file_exists( $phpfile ) ) {
+                       if ( !is_readable( $phpfile ) ) {
+                               $this->error( "Error reading $phpfile\n", 1 );
+                       }
+
+                       $phpfileContents = file_get_contents( $phpfile );
+                       $m = array();
+                       if ( !preg_match( '!"/([^"$]+)/\$csCode.json";!', $phpfileContents, $m ) ) {
+                               $this->error( "Cannot recognize $phpfile as a shim.\n", 1 );
+                       }
+
+                       if ( $jsondir === null ) {
+                               $jsondir = $m[1];
+                       }
+
+                       $this->output( "Updating existing shim $phpfile\n" );
+               } elseif ( $jsondir === null ) {
+                       $this->error( "$phpfile does not exist.\n" .
+                               "Argument [jsondir] is required in order to create a new shim.\n", 1 );
+               } else {
+                       $this->output( "Creating new shim $phpfile\n" );
+               }
+
+               $shim = $this->doShim( $jsondir );
+               file_put_contents( $phpfile, $shim );
+               $this->output( "All done.\n" );
+       }
+
        protected function doShim( $jsondir ) {
                $shim = <<<'PHP'
 <?php
@@ -115,29 +216,35 @@ class GenerateJsonI18n extends Maintenance {
  * This shim maintains compatibility back to MediaWiki 1.17.
  */
 $messages = array();
-$GLOBALS['wgHooks']['LocalisationCacheRecache'][] = function ( $cache, $code, &$cachedData ) {
-       $codeSequence = array_merge( array( $code ), $cachedData['fallbackSequence'] );
-       foreach ( $codeSequence as $csCode ) {
-               $fileName = __DIR__ . "/{{OUT}}/$csCode.json";
-               if ( is_readable( $fileName ) ) {
-                       $data = FormatJson::decode( file_get_contents( $fileName ), true );
-                       foreach ( array_keys( $data ) as $key ) {
-                               if ( $key === '' || $key[0] === '@' ) {
-                                       unset( $data[$key] );
+if ( !function_exists( '{{FUNC}}' ) ) {
+       function {{FUNC}}( $cache, $code, &$cachedData ) {
+               $codeSequence = array_merge( array( $code ), $cachedData['fallbackSequence'] );
+               foreach ( $codeSequence as $csCode ) {
+                       $fileName = dirname( __FILE__ ) . "/{{OUT}}/$csCode.json";
+                       if ( is_readable( $fileName ) ) {
+                               $data = FormatJson::decode( file_get_contents( $fileName ), true );
+                               foreach ( array_keys( $data ) as $key ) {
+                                       if ( $key === '' || $key[0] === '@' ) {
+                                               unset( $data[$key] );
+                                       }
                                }
+                               $cachedData['messages'] = array_merge( $data, $cachedData['messages'] );
                        }
-                       $cachedData['messages'] = array_merge( $data, $cachedData['messages'] );
-               }
 
-               $cachedData['deps'][] = new FileDependency( $fileName );
+                       $cachedData['deps'][] = new FileDependency( $fileName );
+               }
+               return true;
        }
-       return true;
-};
+
+       $GLOBALS['wgHooks']['LocalisationCacheRecache'][] = '{{FUNC}}';
+}
 
 PHP;
 
                $jsondir = str_replace( '\\', '/', $jsondir );
                $shim = str_replace( '{{OUT}}', $jsondir, $shim );
+               $shim = str_replace( '{{FUNC}}', 'wfJsonI18nShim' . wfRandomString( 16 ), $shim );
+
                return $shim;
        }
 
@@ -170,6 +277,7 @@ PHP;
        protected function getAuthorsFromComment( $comment ) {
                $matches = null;
                preg_match_all( '/@author (.*?)$/m', $comment, $matches );
+
                return $matches && $matches[1] ? $matches[1] : array();
        }
 }
index 959cc8f..c43851e 100644 (file)
@@ -63,7 +63,8 @@ class GenerateSitemap extends Maintenance {
        public $fspath;
 
        /**
-        * The URL path to prepend to filenames in the index; should resolve to the same directory as $fspath
+        * The URL path to prepend to filenames in the index;
+        * should resolve to the same directory as $fspath.
         *
         * @var string
         */
@@ -145,11 +146,32 @@ class GenerateSitemap extends Maintenance {
        public function __construct() {
                parent::__construct();
                $this->mDescription = "Creates a sitemap for the site";
-               $this->addOption( 'fspath', 'The file system path to save to, e.g. /tmp/sitemap; defaults to current directory', false, true );
-               $this->addOption( 'urlpath', 'The URL path corresponding to --fspath, prepended to filenames in the index; defaults to an empty string', false, true );
-               $this->addOption( 'compress', 'Compress the sitemap files, can take value yes|no, default yes', false, true );
+               $this->addOption(
+                       'fspath',
+                       'The file system path to save to, e.g. /tmp/sitemap; defaults to current directory',
+                       false,
+                       true
+               );
+               $this->addOption(
+                       'urlpath',
+                       'The URL path corresponding to --fspath, prepended to filenames in the index; '
+                               . 'defaults to an empty string',
+                       false,
+                       true
+               );
+               $this->addOption(
+                       'compress',
+                       'Compress the sitemap files, can take value yes|no, default yes',
+                       false,
+                       true
+               );
                $this->addOption( 'skip-redirects', 'Do not include redirecting articles in the sitemap' );
-               $this->addOption( 'identifier', 'What site identifier to use for the wiki, defaults to $wgDBname', false, true );
+               $this->addOption(
+                       'identifier',
+                       'What site identifier to use for the wiki, defaults to $wgDBname',
+                       false,
+                       true
+               );
        }
 
        /**
@@ -241,6 +263,7 @@ class GenerateSitemap extends Maintenance {
                global $wgSitemapNamespaces;
                if ( is_array( $wgSitemapNamespaces ) ) {
                        $this->namespaces = $wgSitemapNamespaces;
+
                        return;
                }
 
@@ -266,7 +289,9 @@ class GenerateSitemap extends Maintenance {
         * @return string
         */
        function priority( $namespace ) {
-               return isset( $this->priorities[$namespace] ) ? $this->priorities[$namespace] : $this->guessPriority( $namespace );
+               return isset( $this->priorities[$namespace] )
+                       ? $this->priorities[$namespace]
+                       : $this->guessPriority( $namespace );
        }
 
        /**
@@ -278,7 +303,9 @@ class GenerateSitemap extends Maintenance {
         * @return string
         */
        function guessPriority( $namespace ) {
-               return MWNamespace::isSubject( $namespace ) ? $this->priorities[self::GS_MAIN] : $this->priorities[self::GS_TALK];
+               return MWNamespace::isSubject( $namespace )
+                       ? $this->priorities[self::GS_MAIN]
+                       : $this->priorities[self::GS_TALK];
        }
 
        /**
@@ -317,14 +344,17 @@ class GenerateSitemap extends Maintenance {
 
                        $fns = $wgContLang->getFormattedNsText( $namespace );
                        $this->output( "$namespace ($fns)\n" );
-                       $skippedRedirects = 0;  // Number of redirects skipped for that namespace
+                       $skippedRedirects = 0; // Number of redirects skipped for that namespace
                        foreach ( $res as $row ) {
                                if ( $this->skipRedirects && $row->page_is_redirect ) {
                                        $skippedRedirects++;
                                        continue;
                                }
 
-                               if ( $i++ === 0 || $i === $this->url_limit + 1 || $length + $this->limit[1] + $this->limit[2] > $this->size_limit ) {
+                               if ( $i++ === 0
+                                       || $i === $this->url_limit + 1
+                                       || $length + $this->limit[1] + $this->limit[2] > $this->size_limit
+                               ) {
                                        if ( $this->file !== false ) {
                                                $this->write( $this->file, $this->closeFile() );
                                                $this->close( $this->file );
@@ -349,7 +379,11 @@ class GenerateSitemap extends Maintenance {
                                                if ( $vCode == $wgContLang->getCode() ) {
                                                        continue; // we don't want default variant
                                                }
-                                               $entry = $this->fileEntry( $title->getCanonicalURL( '', $vCode ), $date, $this->priority( $namespace ) );
+                                               $entry = $this->fileEntry(
+                                                       $title->getCanonicalURL( '', $vCode ),
+                                                       $date,
+                                                       $this->priority( $namespace )
+                                               );
                                                $length += strlen( $entry );
                                                $this->write( $this->file, $entry );
                                        }
@@ -379,8 +413,10 @@ class GenerateSitemap extends Maintenance {
        function open( $file, $flags ) {
                $resource = $this->compress ? gzopen( $file, $flags ) : fopen( $file, $flags );
                if ( $resource === false ) {
-                       throw new MWException( __METHOD__ . " error opening file $file with flags $flags. Check permissions?" );
+                       throw new MWException( __METHOD__
+                               . " error opening file $file with flags $flags. Check permissions?" );
                }
+
                return $resource;
        }
 
@@ -423,6 +459,7 @@ class GenerateSitemap extends Maintenance {
         */
        function sitemapFilename( $namespace, $count ) {
                $ext = $this->compress ? '.gz' : '';
+
                return "sitemap-{$this->identifier}-NS_$namespace-$count.xml$ext";
        }
 
@@ -523,7 +560,11 @@ class GenerateSitemap extends Maintenance {
 
                $this->limit = array(
                        strlen( $this->openFile() ),
-                       strlen( $this->fileEntry( $title->getCanonicalURL(), wfTimestamp( TS_ISO_8601, wfTimestamp() ), $this->priority( $namespace ) ) ),
+                       strlen( $this->fileEntry(
+                               $title->getCanonicalURL(),
+                               wfTimestamp( TS_ISO_8601, wfTimestamp() ),
+                               $this->priority( $namespace )
+                       ) ),
                        strlen( $this->closeFile() )
                );
        }
index 52cb209..1db53f3 100644 (file)
@@ -63,7 +63,7 @@ class GetConfiguration extends Maintenance {
                $format = strtolower( $this->getOption( 'format', 'PHP' ) );
 
                $validFormat = in_array( $format, self::$outFormats );
-               if ( ! $validFormat ) {
+               if ( !$validFormat ) {
                        $this->error( "--format set to an unrecognized format", 0 );
                        $error_out = true;
                }
@@ -87,11 +87,11 @@ 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' ) ) {
-                               $this->regex .= 'i';  # case insensitive regex
+                               $this->regex .= 'i'; # case insensitive regex
                        }
                }
 
@@ -115,7 +115,7 @@ class GetConfiguration extends Maintenance {
                $res = array();
 
                # Sane default: dump any wg / wmg variable
-               if ( ! $this->regex && ! $this->getOption( 'settings' ) ) {
+               if ( !$this->regex && !$this->getOption( 'settings' ) ) {
                        $this->regex = '/^wm?g/';
                }
 
@@ -165,7 +165,7 @@ class GetConfiguration extends Maintenance {
        protected function formatVarDump( $res ) {
                $ret = '';
                foreach ( $res as $key => $value ) {
-                       ob_start();  # intercept var_dump() output
+                       ob_start(); # intercept var_dump() output
                        print "\${$key} = ";
                        var_dump( $value );
                        # grab var_dump() output and discard it from the output buffer
@@ -182,10 +182,12 @@ class GetConfiguration extends Maintenance {
                                        return false;
                                }
                        }
+
                        return true;
                } elseif ( is_scalar( $value ) ) {
                        return true;
                }
+
                return false;
        }
 }
index d618825..68c1943 100644 (file)
@@ -34,6 +34,7 @@ class GetSlaveServer extends Maintenance {
                $this->addOption( "group", "Query group to check specifically" );
                $this->mDescription = "Report the hostname of a slave server";
        }
+
        public function execute() {
                global $wgAllDBsAreLocalhost;
                if ( $wgAllDBsAreLocalhost ) {
index 9c4bdfb..7d7c1cc 100644 (file)
@@ -52,7 +52,10 @@ class GetTextMaint extends Maintenance {
                        $titleText = $title->getPrefixedText();
                        $this->error( "Page $titleText does not exist.\n", true );
                }
-               $content = $rev->getContent( $this->hasOption( 'show-private' ) ? Revision::RAW : Revision::FOR_PUBLIC );
+               $content = $rev->getContent( $this->hasOption( 'show-private' )
+                       ? Revision::RAW
+                       : Revision::FOR_PUBLIC );
+
                if ( $content === false ) {
                        $titleText = $title->getPrefixedText();
                        $this->error( "Couldn't extract the text from $titleText.\n", true );
index 61189b7..1f7cbf5 100644 (file)
@@ -42,8 +42,12 @@ class BackupReader extends Maintenance {
 
        function __construct() {
                parent::__construct();
-               $gz = in_array( 'compress.zlib', stream_get_wrappers() ) ? 'ok' : '(disabled; requires PHP zlib module)';
-               $bz2 = in_array( 'compress.bzip2', stream_get_wrappers() ) ? 'ok' : '(disabled; requires PHP bzip2 module)';
+               $gz = in_array( 'compress.zlib', stream_get_wrappers() )
+                       ? 'ok'
+                       : '(disabled; requires PHP zlib module)';
+               $bz2 = in_array( 'compress.bzip2', stream_get_wrappers() )
+                       ? 'ok'
+                       : '(disabled; requires PHP bzip2 module)';
 
                $this->mDescription = <<<TEXT
 This script reads pages from an XML file as produced from Special:Export or
@@ -67,7 +71,10 @@ TEXT;
                $this->addOption( 'dry-run', 'Parse dump without actually importing pages' );
                $this->addOption( 'debug', 'Output extra verbose debug information' );
                $this->addOption( 'uploads', 'Process file upload data if included (experimental)' );
-               $this->addOption( 'no-updates', 'Disable link table updates. Is faster but leaves the wiki in an inconsistent state' );
+               $this->addOption(
+                       'no-updates',
+                       'Disable link table updates. Is faster but leaves the wiki in an inconsistent state'
+               );
                $this->addOption( 'image-base-path', 'Import files from a specified path', false, true );
                $this->addArg( 'file', 'Dump file to import [else use stdin]', false );
        }
@@ -104,6 +111,7 @@ TEXT;
        function setNsfilter( array $namespaces ) {
                if ( count( $namespaces ) == 0 ) {
                        $this->nsFilter = false;
+
                        return;
                }
                $this->nsFilter = array_unique( array_map( array( $this, 'getNsIndex' ), $namespaces ) );
@@ -136,6 +144,7 @@ TEXT;
                        echo wfBacktrace();
                        $this->error( "Cannot get namespace of object in " . __METHOD__, true );
                }
+
                return is_array( $this->nsFilter ) && !in_array( $ns, $this->nsFilter );
        }
 
@@ -150,6 +159,7 @@ TEXT;
                $title = $rev->getTitle();
                if ( !$title ) {
                        $this->progress( "Got bogus revision with null title!" );
+
                        return;
                }
 
@@ -182,6 +192,7 @@ TEXT;
                                // bluuuh hack
                                // call_user_func( $this->uploadCallback, $revision );
                                $dbw = wfGetDB( DB_MASTER );
+
                                return $dbw->deadlockLoop( array( $revision, 'importUpload' ) );
                        }
                }
@@ -241,6 +252,7 @@ TEXT;
                }
 
                $file = fopen( $filename, 'rt' );
+
                return $this->importFromHandle( $file );
        }
 
@@ -249,6 +261,7 @@ TEXT;
                if ( self::posix_isatty( $file ) ) {
                        $this->maybeHelp( true );
                }
+
                return $this->importFromHandle( $file );
        }
 
index ae93287..b803e3d 100644 (file)
@@ -46,6 +46,7 @@ function findFiles( $dir, $exts, $recurse = false ) {
                                        $files = array_merge( $files, findFiles( $dir . '/' . $file, $exts, true ) );
                                }
                        }
+
                        return $files;
                } else {
                        return array();
@@ -63,9 +64,10 @@ function findFiles( $dir, $exts, $recurse = false ) {
  */
 function splitFilename( $filename ) {
        $parts = explode( '.', $filename );
-       $ext = $parts[ count( $parts ) - 1 ];
-       unset( $parts[ count( $parts ) - 1 ] );
+       $ext = $parts[count( $parts ) - 1];
+       unset( $parts[count( $parts ) - 1] );
        $fname = implode( '.', $parts );
+
        return array( $fname, $ext );
 }
 
@@ -110,9 +112,11 @@ function findAuxFile( $file, $auxExtension, $maxStrip = 1 ) {
        return false;
 }
 
-# FIXME: Access the api in a saner way and performing just one query (preferably batching files too).
+# @todo FIXME: Access the api in a saner way and performing just one query
+# (preferably batching files too).
 function getFileCommentFromSourceWiki( $wiki_host, $file ) {
-       $url = $wiki_host . '/api.php?action=query&format=xml&titles=File:' . rawurlencode( $file ) . '&prop=imageinfo&&iiprop=comment';
+       $url = $wiki_host . '/api.php?action=query&format=xml&titles=File:'
+               . rawurlencode( $file ) . '&prop=imageinfo&&iiprop=comment';
        $body = Http::get( $url );
        if ( preg_match( '#<ii comment="([^"]*)" />#', $body, $matches ) == 0 ) {
                return false;
@@ -122,7 +126,8 @@ function getFileCommentFromSourceWiki( $wiki_host, $file ) {
 }
 
 function getFileUserFromSourceWiki( $wiki_host, $file ) {
-       $url = $wiki_host . '/api.php?action=query&format=xml&titles=File:' . rawurlencode( $file ) . '&prop=imageinfo&&iiprop=user';
+       $url = $wiki_host . '/api.php?action=query&format=xml&titles=File:'
+               . rawurlencode( $file ) . '&prop=imageinfo&&iiprop=user';
        $body = Http::get( $url );
        if ( preg_match( '#<ii user="([^"]*)" />#', $body, $matches ) == 0 ) {
                return false;
index 54fd4e2..3dd4a9e 100644 (file)
@@ -4,7 +4,8 @@
  * using the web-based interface.
  *
  * "Smart import" additions:
- * - aim: preserve the essential metadata (user, description) when importing medias from an existing wiki
+ * - aim: preserve the essential metadata (user, description) when importing media
+ *   files from an existing wiki.
  * - process:
  *      - interface with the source wiki, don't use bare files only (see --source-wiki-url).
  *      - fetch metadata from source wiki for each file to import.
@@ -87,16 +88,24 @@ if ( isset( $options['check-userblock'] ) ) {
 }
 
 # Get --from
-$from = @$options['from'];
+wfSuppressWarnings();
+$from = $options['from'];
+wfRestoreWarnings();
 
 # Get sleep time.
-$sleep = @$options['sleep'];
+wfSuppressWarnings();
+$sleep = $options['sleep'];
+wfRestoreWarnings();
+
 if ( $sleep ) {
        $sleep = (int)$sleep;
 }
 
 # Get limit number
-$limit = @$options['limit'];
+wfSuppressWarnings();
+$limit = $options['limit'];
+wfRestoreWarnings();
+
 if ( $limit ) {
        $limit = (int)$limit;
 }
@@ -167,7 +176,8 @@ if ( $count > 0 ) {
                } else {
                        if ( isset( $options['skip-dupes'] ) ) {
                                $repo = $image->getRepo();
-                               $sha1 = File::sha1Base36( $file ); # XXX: we end up calculating this again when actually uploading. that sucks.
+                               # XXX: we end up calculating this again when actually uploading. that sucks.
+                               $sha1 = File::sha1Base36( $file );
 
                                $dupes = $repo->findBySha1( $sha1 );
 
@@ -210,7 +220,8 @@ if ( $count > 0 ) {
                        if ( $commentExt ) {
                                $f = findAuxFile( $file, $commentExt );
                                if ( !$f ) {
-                                       echo " No comment file with extension {$commentExt} found for {$file}, using default comment. ";
+                                       echo " No comment file with extension {$commentExt} found "
+                                               . "for {$file}, using default comment. ";
                                } else {
                                        $commentText = file_get_contents( $f );
                                        if ( !$commentText ) {
@@ -254,7 +265,13 @@ if ( $count > 0 ) {
 
                if ( isset( $options['dry'] ) ) {
                        echo "done.\n";
-               } elseif ( $image->recordUpload2( $archive->value, $summary, $commentText, $props, $timestamp ) ) {
+               } elseif ( $image->recordUpload2(
+                       $archive->value,
+                       $summary,
+                       $commentText,
+                       $props,
+                       $timestamp
+               ) ) {
                        # We're done!
                        echo "done.\n";
 
@@ -273,25 +290,24 @@ if ( $count > 0 ) {
                        }
 
                        if ( $doProtect ) {
-                                       # Protect the file
-                                       echo "\nWaiting for slaves...\n";
-                                       // Wait for slaves.
-                                       sleep( 2.0 ); # Why this sleep?
-                                       wfWaitForSlaves();
-
-                                       echo "\nSetting image restrictions ... ";
-
-                                       $cascade = false;
-                                       $restrictions = array();
-                                       foreach ( $title->getRestrictionTypes() as $type ) {
-                                               $restrictions[$type] = $protectLevel;
-                                       }
+                               # Protect the file
+                               echo "\nWaiting for slaves...\n";
+                               // Wait for slaves.
+                               sleep( 2.0 ); # Why this sleep?
+                               wfWaitForSlaves();
+
+                               echo "\nSetting image restrictions ... ";
+
+                               $cascade = false;
+                               $restrictions = array();
+                               foreach ( $title->getRestrictionTypes() as $type ) {
+                                       $restrictions[$type] = $protectLevel;
+                               }
 
-                                       $page = WikiPage::factory( $title );
-                                       $status = $page->doUpdateRestrictions( $restrictions, array(), $cascade, '', $user );
-                                       echo ( $status->isOK() ? 'done' : 'failed' ) . "\n";
+                               $page = WikiPage::factory( $title );
+                               $status = $page->doUpdateRestrictions( $restrictions, array(), $cascade, '', $user );
+                               echo ( $status->isOK() ? 'done' : 'failed' ) . "\n";
                        }
-
                } else {
                        echo "failed. (at recordUpload stage)\n";
                        $svar = 'failed';
@@ -311,14 +327,21 @@ if ( $count > 0 ) {
 
        # Print out some statistics
        echo "\n";
-       foreach ( array( 'count' => 'Found', 'limit' => 'Limit', 'ignored' => 'Ignored',
-               'added' => 'Added', 'skipped' => 'Skipped', 'overwritten' => 'Overwritten',
-               'failed' => 'Failed' ) as $var => $desc ) {
+       foreach (
+               array(
+                       'count' => 'Found',
+                       'limit' => 'Limit',
+                       'ignored' => 'Ignored',
+                       'added' => 'Added',
+                       'skipped' => 'Skipped',
+                       'overwritten' => 'Overwritten',
+                       'failed' => 'Failed'
+               ) as $var => $desc
+       ) {
                if ( $$var > 0 ) {
                        echo "{$desc}: {$$var}\n";
                }
        }
-
 } else {
        echo "No suitable files could be found for import.\n";
 }
@@ -337,28 +360,37 @@ USAGE: php importImages.php [options] <dir>
 <dir> : Path to the directory containing images to be imported
 
 Options:
---extensions=<exts>     Comma-separated list of allowable extensions, defaults to \$wgFileExtensions
---overwrite             Overwrite existing images with the same name (default is to skip them)
---limit=<num>           Limit the number of images to process. Ignored or skipped images are not counted.
---from=<name>           Ignore all files until the one with the given name. Useful for resuming
-                        aborted imports. <name> should be the file's canonical database form.
---skip-dupes            Skip images that were already uploaded under a different name (check SHA1)
---search-recursively    Search recursively for files in subdirectories
+--extensions=<exts>     Comma-separated list of allowable extensions, defaults
+                        to \$wgFileExtensions.
+--overwrite             Overwrite existing images with the same name (default
+                        is to skip them).
+--limit=<num>           Limit the number of images to process. Ignored or
+                        skipped images are not counted.
+--from=<name>           Ignore all files until the one with the given name.
+                        Useful for resuming aborted imports. <name> should be
+                        the file's canonical database form.
+--skip-dupes            Skip images that were already uploaded under a different
+                        name (check SHA1).
+--search-recursively    Search recursively for files in subdirectories.
 --sleep=<sec>           Sleep between files. Useful mostly for debugging.
---user=<username>       Set username of uploader, default 'Maintenance script'
+--user=<username>       Set username of uploader, default 'Maintenance script'.
 --check-userblock       Check if the user got blocked during import.
 --comment=<text>        Set file description, default 'Importing file'.
 --comment-file=<file>   Set description to the content of <file>.
---comment-ext=<ext>     Causes the description for each file to be loaded from a file with the same name
-                        but the extension <ext>. If a global description is also given, it is appended.
---license=<code>        Use an optional license template
---dry                   Dry run, don't import anything
---protect=<protect>     Specify the protect value (autoconfirmed,sysop)
---summary=<summary>     Upload summary, description will be used if not provided
---timestamp=<timestamp> Override upload time/date, all MediaWiki timestamp formats are accepted
---unprotect             Unprotects all uploaded images
---source-wiki-url       If specified, take User and Comment data for each imported file from this URL.
-                        For example, --source-wiki-url="http://en.wikipedia.org/"
+--comment-ext=<ext>     Causes the description for each file to be loaded from a
+                        file with the same name, but the extension <ext>. If a
+                        global description is also given, it is appended.
+--license=<code>        Use an optional license template.
+--dry                   Dry run, don't import anything.
+--protect=<protect>     Specify the protect value (autoconfirmed,sysop).
+--summary=<summary>     Upload summary, description will be used if not
+                        provided.
+--timestamp=<timestamp> Override upload time/date, all MediaWiki timestamp
+                        formats are accepted.
+--unprotect             Unprotects all uploaded images.
+--source-wiki-url       If specified, take User and Comment data for each
+                        imported file from this URL. For example,
+                        --source-wiki-url="http://en.wikipedia.org/."
 
 TEXT;
        exit( 1 );
index fd768b3..7705ec9 100644 (file)
@@ -65,13 +65,12 @@ class ImportSiteScripts extends Maintenance {
                        $content = ContentHandler::makeContent( $text, $wikiPage->getTitle() );
                        $wikiPage->doEditContent( $content, "Importing from $url", 0, false, $user );
                }
-
        }
 
        protected function fetchScriptList() {
                $data = array(
                        'action' => 'query',
-                       'format' => 'php',//'json',
+                       'format' => 'php', //'json',
                        'list' => 'allpages',
                        'apnamespace' => '8',
                        'aplimit' => '500',
@@ -100,7 +99,6 @@ class ImportSiteScripts extends Maintenance {
                } while ( isset( $result['query-continue'] ) );
 
                return $pages;
-
        }
 }
 
index c7df6c3..f73dd1c 100644 (file)
@@ -60,33 +60,29 @@ if ( count( $args ) < 1 || isset( $options['help'] ) ) {
                                        $content = ContentHandler::makeContent( $text, $title );
                                        $page->doEditContent( $content, $comment, $flags, false, $user );
                                        echo "done.\n";
-
                                } else {
                                        echo "invalid username.\n";
                                }
-
                        } else {
                                echo "page exists.\n";
                        }
-
                } else {
                        echo "invalid title.\n";
                }
-
        } else {
                echo "does not exist.\n";
        }
-
 }
 
 function titleFromFilename( $filename ) {
        $parts = explode( '/', $filename );
-       $parts = explode( '.', $parts[ count( $parts ) - 1 ] );
+       $parts = explode( '.', $parts[count( $parts ) - 1] );
+
        return $parts[0];
 }
 
 function showHelp() {
-print <<<EOF
+       print <<<EOF
 USAGE: php importTextFile.php <options> <filename>
 
 <filename> : Path to the file containing page content to import
index 92268b3..c368c3f 100644 (file)
@@ -34,7 +34,10 @@ class InitSiteStats extends Maintenance {
        public function __construct() {
                parent::__construct();
                $this->mDescription = "Re-initialise the site statistics tables";
-               $this->addOption( 'update', 'Update the existing statistics (preserves the ss_total_views field)' );
+               $this->addOption(
+                       'update',
+                       'Update the existing statistics (preserves the ss_total_views field)'
+               );
                $this->addOption( 'noviews', "Don't update the page view counter" );
                $this->addOption( 'active', 'Also update active users count' );
                $this->addOption( 'use-master', 'Count using the master database' );
index 44c117e..5a3e00c 100644 (file)
@@ -29,11 +29,14 @@ if ( !function_exists( 'version_compare' ) || ( version_compare( phpversion(), '
 define( 'MW_CONFIG_CALLBACK', 'Installer::overrideConfig' );
 define( 'MEDIAWIKI_INSTALL', true );
 
-require_once dirname( __DIR__ ) . "/maintenance/Maintenance.php";
+require_once dirname( __DIR__ ) . '/maintenance/Maintenance.php';
 
 /**
  * Maintenance script to install and configure MediaWiki
  *
+ * Default values for the options are defined in DefaultSettings.php (see the mapping in CliInstaller.php)
+ * Default for --dbpath (SQLite-specific) is defined in SqliteInstaller::getGlobalDefaults
+ *
  * @ingroup Maintenance
  */
 class CommandLineInstaller extends Maintenance {
@@ -41,13 +44,26 @@ class CommandLineInstaller extends Maintenance {
                parent::__construct();
                global $IP;
 
-               $this->addArg( 'name', 'The name of the wiki', true );
+               $this->addDescription( "CLI-based MediaWiki installation and configuration.\n" .
+                       "Defaut options are indicated in parenthesis." );
+
+               $this->addArg( 'name', 'The name of the wiki (MediaWiki)', false );
 
-               $this->addArg( 'admin', 'The username of the wiki administrator (WikiSysop)', true );
+               $this->addArg( 'admin', 'The username of the wiki administrator.' );
                $this->addOption( 'pass', 'The password for the wiki administrator.', false, true );
-               $this->addOption( 'passfile', 'An alternative way to provide pass option, as the contents of this file', false, true );
+               $this->addOption(
+                       'passfile',
+                       'An alternative way to provide pass option, as the contents of this file',
+                       false,
+                       true
+               );
                /* $this->addOption( 'email', 'The email for the wiki administrator', false, true ); */
-               $this->addOption( 'scriptpath', 'The relative path of the wiki in the web server (/wiki)', false, true );
+               $this->addOption(
+                       'scriptpath',
+                       'The relative path of the wiki in the web server (/wiki)',
+                       false,
+                       true
+               );
 
                $this->addOption( 'lang', 'The language to use (en)', false, true );
                /* $this->addOption( 'cont-lang', 'The content language (en)', false, true ); */
@@ -56,31 +72,40 @@ class CommandLineInstaller extends Maintenance {
                $this->addOption( 'dbserver', 'The database host (localhost)', false, true );
                $this->addOption( 'dbport', 'The database port; only for PostgreSQL (5432)', false, true );
                $this->addOption( 'dbname', 'The database name (my_wiki)', false, true );
-               $this->addOption( 'dbpath', 'The path for the SQLite DB (/var/data)', false, true );
+               $this->addOption( 'dbpath', 'The path for the SQLite DB ($IP/data)', false, true );
                $this->addOption( 'dbprefix', 'Optional database table name prefix', false, true );
                $this->addOption( 'installdbuser', 'The user to use for installing (root)', false, true );
-               $this->addOption( 'installdbpass', 'The pasword for the DB user to install as.', false, true );
+               $this->addOption( 'installdbpass', 'The password for the DB user to install as.', false, true );
                $this->addOption( 'dbuser', 'The user to use for normal operations (wikiuser)', false, true );
-               $this->addOption( 'dbpass', 'The pasword for the DB user for normal operations', false, true );
-               $this->addOption( 'dbpassfile', 'An alternative way to provide dbpass option, as the contents of this file', false, true );
-               $this->addOption( 'confpath', "Path to write LocalSettings.php to, default $IP", false, true );
-               /* $this->addOption( 'dbschema', 'The schema for the MediaWiki DB in pg (mediawiki)', false, true ); */
-               /* $this->addOption( 'namespace', 'The project namespace (same as the name)', false, true ); */
+               $this->addOption( 'dbpass', 'The password for the DB user for normal operations', false, true );
+               $this->addOption(
+                       'dbpassfile',
+                       'An alternative way to provide dbpass option, as the contents of this file',
+                       false,
+                       true
+               );
+               $this->addOption( 'confpath', "Path to write LocalSettings.php to ($IP)", false, true );
+               /*
+               $this->addOption( 'dbschema', 'The schema for the MediaWiki DB in pg (mediawiki)', false, true );
+               $this->addOption( 'namespace', 'The project namespace (same as the "name" argument)', false, true );
+               */
                $this->addOption( 'env-checks', "Run environment checks only, don't change anything" );
        }
 
        function execute() {
                global $IP;
-               $siteName = isset( $this->mArgs[0] ) ? $this->mArgs[0] : "Don't care"; // Will not be set if used with --env-checks
-               $adminName = isset( $this->mArgs[1] ) ? $this->mArgs[1] : null;
 
-               $dbpassfile = $this->getOption( 'dbpassfile', false );
-               if ( $dbpassfile !== false ) {
-                       if ( $this->getOption( 'dbpass', false ) !== false ) {
-                               $this->error( 'WARNING: You provide the options "dbpass" and "dbpassfile". The content of "dbpassfile" overwrites "dbpass".' );
+               $siteName = $this->getArg( 0, 'MediaWiki' ); // Will not be set if used with --env-checks
+               $adminName = $this->getArg( 1 );
+
+               $dbpassfile = $this->getOption( 'dbpassfile' );
+               if ( $dbpassfile !== null ) {
+                       if ( $this->getOption( 'dbpass' ) !== null ) {
+                               $this->error( 'WARNING: You have provided the options "dbpass" and "dbpassfile". '
+                                       . 'The content of "dbpassfile" overrides "dbpass".' );
                        }
                        wfSuppressWarnings();
-                       $dbpass = file_get_contents( $dbpassfile );
+                       $dbpass = file_get_contents( $dbpassfile ); // returns false on failure
                        wfRestoreWarnings();
                        if ( $dbpass === false ) {
                                $this->error( "Couldn't open $dbpassfile", true );
@@ -88,30 +113,31 @@ class CommandLineInstaller extends Maintenance {
                        $this->mOptions['dbpass'] = trim( $dbpass, "\r\n" );
                }
 
-               $passfile = $this->getOption( 'passfile', false );
-               if ( $passfile !== false ) {
-                       if ( $this->getOption( 'pass', false ) !== false ) {
-                               $this->error( 'WARNING: You provide the options "pass" and "passfile". The content of "passfile" overwrites "pass".' );
+               $passfile = $this->getOption( 'passfile' );
+               if ( $passfile !== null ) {
+                       if ( $this->getOption( 'pass' ) !== null ) {
+                               $this->error( 'WARNING: You have provided the options "pass" and "passfile". '
+                                       . 'The content of "passfile" overrides "pass".' );
                        }
                        wfSuppressWarnings();
-                       $pass = file_get_contents( $passfile );
+                       $pass = file_get_contents( $passfile ); // returns false on failure
                        wfRestoreWarnings();
                        if ( $pass === false ) {
                                $this->error( "Couldn't open $passfile", true );
                        }
-                       $this->mOptions['pass'] = str_replace( array( "\n", "\r" ), "", $pass );
-               } elseif ( $this->getOption( 'pass', false ) === false ) {
+                       $this->mOptions['pass'] = trim( $pass, "\r\n" );
+               } elseif ( $this->getOption( 'pass' ) === null ) {
                        $this->error( 'You need to provide the option "pass" or "passfile"', true );
                }
 
-               $installer =
-                       InstallerOverrides::getCliInstaller( $siteName, $adminName, $this->mOptions );
+               $installer = InstallerOverrides::getCliInstaller( $siteName, $adminName, $this->mOptions );
 
                $status = $installer->doEnvironmentChecks();
                if ( $status->isGood() ) {
                        $installer->showMessage( 'config-env-good' );
                } else {
                        $installer->showStatusMessage( $status );
+
                        return;
                }
                if ( !$this->hasOption( 'env-checks' ) ) {
@@ -127,6 +153,6 @@ class CommandLineInstaller extends Maintenance {
        }
 }
 
-$maintClass = "CommandLineInstaller";
+$maintClass = 'CommandLineInstaller';
 
 require_once RUN_MAINTENANCE_IF_MAIN;
index 2ad9228..8efabef 100644 (file)
@@ -1,98 +1,75 @@
 # Based more or less on the public interwiki map from MeatballWiki
 # Default interwiki prefixes...
-acronym|http://www.acronymfinder.com/af-query.asp?String=exact&Acronym=$1|0
+acronym|http://www.acronymfinder.com/~/search/af.aspx?string=exact&Acronym=$1|0
 advogato|http://www.advogato.org/$1|0
-annotationwiki|http://www.seedwiki.com/page.cfm?wikiid=368&doc=$1|0
 arxiv|http://www.arxiv.org/abs/$1|0
 c2find|http://c2.com/cgi/wiki?FindPage&value=$1|0
 cache|http://www.google.com/search?q=cache:$1|0
 commons|https://commons.wikimedia.org/wiki/$1|0
-corpknowpedia|http://corpknowpedia.org/wiki/index.php/$1|0
 dictionary|http://www.dict.org/bin/Dict?Database=*&Form=Dict1&Strategy=*&Query=$1|0
-disinfopedia|http://www.disinfopedia.org/wiki.phtml?title=$1|0
-docbook|http://wiki.docbook.org/topic/$1|0
+docbook|http://wiki.docbook.org/$1|0
 doi|http://dx.doi.org/$1|0
-drumcorpswiki|http://www.drumcorpswiki.com/index.php/$1|0
+drumcorpswiki|http://www.drumcorpswiki.com/$1|0
 dwjwiki|http://www.suberic.net/cgi-bin/dwj/wiki.cgi?$1|0
 elibre|http://enciclopedia.us.es/index.php/$1|0
 emacswiki|http://www.emacswiki.org/cgi-bin/wiki.pl?$1|0
 foldoc|http://foldoc.org/?$1|0
 foxwiki|http://fox.wikis.com/wc.dll?Wiki~$1|0
 freebsdman|http://www.FreeBSD.org/cgi/man.cgi?apropos=1&query=$1|0
-gej|http://www.esperanto.de/cgi-bin/aktivikio/wiki.pl?$1|0
+gej|http://www.esperanto.de/dej.malnova/aktivikio.pl?$1|0
 gentoo-wiki|http://gentoo-wiki.com/$1|0
 google|http://www.google.com/search?q=$1|0
 googlegroups|http://groups.google.com/groups?q=$1|0
 hammondwiki|http://www.dairiki.org/HammondWiki/$1|0
-hewikisource|https://he.wikisource.org/wiki/$1|1
-hrwiki|http://www.hrwiki.org/index.php/$1|0
-imdb|http://us.imdb.com/Title?$1|0
+hrwiki|http://www.hrwiki.org/wiki/$1|0
+imdb|http://www.imdb.com/find?q=$1&tt=on|0
 jargonfile|http://sunir.org/apps/meta.pl?wiki=JargonFile&redirect=$1|0
-jspwiki|http://www.jspwiki.org/wiki/$1|0
-keiki|http://kei.ki/en/$1|0
 kmwiki|http://kmwiki.wikispaces.com/$1|0
 linuxwiki|http://linuxwiki.de/$1|0
 lojban|http://www.lojban.org/tiki/tiki-index.php?page=$1|0
 lqwiki|http://wiki.linuxquestions.org/wiki/$1|0
-lugkr|http://lug-kr.sourceforge.net/cgi-bin/lugwiki.pl?$1|0
-mathsongswiki|http://SeedWiki.com/page.cfm?wikiid=237&doc=$1|0
+lugkr|http://www.lug-kr.de/wiki/$1|0
 meatball|http://www.usemod.com/cgi-bin/mb.pl?$1|0
 mediawikiwiki|https://www.mediawiki.org/wiki/$1|0
-mediazilla|https://bugzilla.wikimedia.org/$1|1
-memoryalpha|http://www.memory-alpha.org/en/index.php/$1|0
+mediazilla|https://bugzilla.wikimedia.org/$1|0
+memoryalpha|http://en.memory-alpha.org/wiki/$1|0
 metawiki|http://sunir.org/apps/meta.pl?$1|0
 metawikimedia|https://meta.wikimedia.org/wiki/$1|0
-moinmoin|http://purl.net/wiki/moin/$1|0
-mozillawiki|http://wiki.mozilla.org/index.php/$1|0
-mw|https://www.mediawiki.org/wiki/$1|0
-oeis|http://www.research.att.com/cgi-bin/access.cgi/as/njas/sequences/eisA.cgi?Anum=$1|0
-openfacts|http://openfacts.berlios.de/index.phtml?title=$1|0
-openwiki|http://openwiki.com/?$1|0
-# patwiki|http://gauss.ffii.org/$1|0 # 2008-02-27: lots of spambots
-pmeg|http://www.bertilow.com/pmeg/$1.php|0
+mozillawiki|http://wiki.mozilla.org/$1|0
+mw|http://www.mediawiki.org/wiki/$1|0
+oeis|http://oeis.org/$1|0
+openwiki|http://openwiki.com/ow.asp?$1|0
 ppr|http://c2.com/cgi/wiki?$1|0
 pythoninfo|http://wiki.python.org/moin/$1|0
 rfc|http://www.rfc-editor.org/rfc/rfc$1.txt|0
-s23wiki|http://is-root.de/wiki/index.php/$1|0
-seattlewiki|http://seattle.wikia.com/wiki/$1|0
-seattlewireless|http://seattlewireless.net/?$1|0
+s23wiki|http://s23.org/wiki/$1|0
+seattlewireless|http://seattlewireless.net/$1|0
 senseislibrary|http://senseis.xmp.net/?$1|0
-# slashdot|http://slashdot.org/article.pl?sid=$1|0 # 2008-02-27: update me
 sourceforge|http://sourceforge.net/$1|0
+sourcewatch|http://www.sourcewatch.org/index.php?title=$1|0
 squeak|http://wiki.squeak.org/squeak/$1|0
-susning|http://www.susning.nu/$1|0
-svgwiki|http://wiki.svg.org/$1|0
-tavi|http://tavi.sourceforge.net/$1|0
 tejo|http://www.tejo.org/vikio/$1|0
 tmbw|http://www.tmbw.net/wiki/$1|0
 tmnet|http://www.technomanifestos.net/?$1|0
-tmwiki|http://www.EasyTopicMaps.com/?page=$1|0
 theopedia|http://www.theopedia.com/$1|0
 twiki|http://twiki.org/cgi-bin/view/$1|0
-uea|http://www.tejo.org/uea/$1|0
-unreal|http://wiki.beyondunreal.com/wiki/$1|0
+uea|http://uea.org/vikio/index.php/$1|0
+unreal|http://wiki.beyondunreal.com/$1|0
 usemod|http://www.usemod.com/cgi-bin/wiki.pl?$1|0
-vinismo|http://vinismo.com/en/$1|0
 webseitzwiki|http://webseitz.fluxent.com/wiki/$1|0
-why|http://clublet.com/c/c/why?$1|0
 wiki|http://c2.com/cgi/wiki?$1|0
 wikia|http://www.wikia.com/wiki/$1|0
-wikibooks|https://en.wikibooks.org/wiki/$1|1
-wikicities|http://www.wikia.com/wiki/$1|0
+wikibooks|https://en.wikibooks.org/wiki/$1|0
 wikif1|http://www.wikif1.org/$1|0
 wikihow|http://www.wikihow.com/$1|0
-wikinfo|http://www.wikinfo.org/index.php/$1|0
-# The following wik[it]* interwikis belong to the Wikimedia Family:
+wikinfo|http://wikinfo.co/English/index.php/$1|0
 wikimedia|https://wikimediafoundation.org/wiki/$1|0
-wikinews|https://en.wikinews.org/wiki/$1|1
-wikipedia|https://en.wikipedia.org/wiki/$1|1
-wikiquote|https://en.wikiquote.org/wiki/$1|1
-wikisource|https://wikisource.org/wiki/$1|1
-wikispecies|https://species.wikimedia.org/wiki/$1|1
-wikiversity|https://en.wikiversity.org/wiki/$1|1
-wikivoyage|https://en.wikivoyage.org/wiki/$1|1
-wikt|https://en.wiktionary.org/wiki/$1|1
-wiktionary|https://en.wiktionary.org/wiki/$1|1
-wlug|http://www.wlug.org.nz/$1|0
-zwiki|http://zwiki.org/$1|0
-zzz wiki|http://wiki.zzz.ee/index.php/$1|0
+wikinews|https://en.wikinews.org/wiki/$1|0
+wikipedia|https://en.wikipedia.org/wiki/$1|0
+wikiquote|https://en.wikiquote.org/wiki/$1|0
+wikisource|https://wikisource.org/wiki/$1|0
+wikispecies|https://species.wikimedia.org/wiki/$1|0
+wikiversity|https://en.wikiversity.org/wiki/$1|0
+wikivoyage|https://en.wikivoyage.org/wiki/$1|0
+wikt|https://en.wiktionary.org/wiki/$1|0
+wiktionary|https://en.wiktionary.org/wiki/$1|0
index 1d8b540..53559ef 100644 (file)
@@ -2,99 +2,77 @@
 -- Default interwiki prefixes...
 
 REPLACE INTO /*$wgDBprefix*/interwiki (iw_prefix,iw_url,iw_local) VALUES
-('acronym','http://www.acronymfinder.com/af-query.asp?String=exact&Acronym=$1',0),
+('acronym','http://www.acronymfinder.com/~/search/af.aspx?string=exact&Acronym=$1',0),
 ('advogato','http://www.advogato.org/$1',0),
-('annotationwiki','http://www.seedwiki.com/page.cfm?wikiid=368&doc=$1',0),
 ('arxiv','http://www.arxiv.org/abs/$1',0),
 ('c2find','http://c2.com/cgi/wiki?FindPage&value=$1',0),
 ('cache','http://www.google.com/search?q=cache:$1',0),
 ('commons','https://commons.wikimedia.org/wiki/$1',0),
-('corpknowpedia','http://corpknowpedia.org/wiki/index.php/$1',0),
 ('dictionary','http://www.dict.org/bin/Dict?Database=*&Form=Dict1&Strategy=*&Query=$1',0),
-('disinfopedia','http://www.disinfopedia.org/wiki.phtml?title=$1',0),
-('docbook','http://wiki.docbook.org/topic/$1',0),
+('docbook','http://wiki.docbook.org/$1',0),
 ('doi','http://dx.doi.org/$1',0),
-('drumcorpswiki','http://www.drumcorpswiki.com/index.php/$1',0),
+('drumcorpswiki','http://www.drumcorpswiki.com/$1',0),
 ('dwjwiki','http://www.suberic.net/cgi-bin/dwj/wiki.cgi?$1',0),
 ('elibre','http://enciclopedia.us.es/index.php/$1',0),
 ('emacswiki','http://www.emacswiki.org/cgi-bin/wiki.pl?$1',0),
 ('foldoc','http://foldoc.org/?$1',0),
 ('foxwiki','http://fox.wikis.com/wc.dll?Wiki~$1',0),
 ('freebsdman','http://www.FreeBSD.org/cgi/man.cgi?apropos=1&query=$1',0),
-('gej','http://www.esperanto.de/cgi-bin/aktivikio/wiki.pl?$1',0),
+('gej','http://www.esperanto.de/dej.malnova/aktivikio.pl?$1',0),
 ('gentoo-wiki','http://gentoo-wiki.com/$1',0),
 ('google','http://www.google.com/search?q=$1',0),
 ('googlegroups','http://groups.google.com/groups?q=$1',0),
 ('hammondwiki','http://www.dairiki.org/HammondWiki/$1',0),
-('hewikisource','https://he.wikisource.org/wiki/$1',1),
-('hrwiki','http://www.hrwiki.org/index.php/$1',0),
-('imdb','http://us.imdb.com/Title?$1',0),
+('hrwiki','http://www.hrwiki.org/wiki/$1',0),
+('imdb','http://www.imdb.com/find?q=$1&tt=on',0),
 ('jargonfile','http://sunir.org/apps/meta.pl?wiki=JargonFile&redirect=$1',0),
-('jspwiki','http://www.jspwiki.org/wiki/$1',0),
-('keiki','http://kei.ki/en/$1',0),
 ('kmwiki','http://kmwiki.wikispaces.com/$1',0),
 ('linuxwiki','http://linuxwiki.de/$1',0),
 ('lojban','http://www.lojban.org/tiki/tiki-index.php?page=$1',0),
 ('lqwiki','http://wiki.linuxquestions.org/wiki/$1',0),
-('lugkr','http://lug-kr.sourceforge.net/cgi-bin/lugwiki.pl?$1',0),
-('mathsongswiki','http://SeedWiki.com/page.cfm?wikiid=237&doc=$1',0),
+('lugkr','http://www.lug-kr.de/wiki/$1',0),
 ('meatball','http://www.usemod.com/cgi-bin/mb.pl?$1',0),
 ('mediawikiwiki','https://www.mediawiki.org/wiki/$1',0),
-('mediazilla','https://bugzilla.wikimedia.org/$1',1),
-('memoryalpha','http://www.memory-alpha.org/en/index.php/$1',0),
+('mediazilla','https://bugzilla.wikimedia.org/$1',0),
+('memoryalpha','http://en.memory-alpha.org/wiki/$1',0),
 ('metawiki','http://sunir.org/apps/meta.pl?$1',0),
 ('metawikimedia','https://meta.wikimedia.org/wiki/$1',0),
-('moinmoin','http://purl.net/wiki/moin/$1',0),
-('mozillawiki','http://wiki.mozilla.org/index.php/$1',0),
-('mw','https://www.mediawiki.org/wiki/$1',0),
-('oeis','http://www.research.att.com/cgi-bin/access.cgi/as/njas/sequences/eisA.cgi?Anum=$1',0),
-('openfacts','http://openfacts.berlios.de/index.phtml?title=$1',0),
-('openwiki','http://openwiki.com/?$1',0),
-('patwiki','http://gauss.ffii.org/$1',0), # 2008-02-27: lots of spambots
-('pmeg','http://www.bertilow.com/pmeg/$1.php',0),
+('mozillawiki','http://wiki.mozilla.org/$1',0),
+('mw','http://www.mediawiki.org/wiki/$1',0),
+('oeis','http://oeis.org/$1',0),
+('openwiki','http://openwiki.com/ow.asp?$1',0),
 ('ppr','http://c2.com/cgi/wiki?$1',0),
 ('pythoninfo','http://wiki.python.org/moin/$1',0),
 ('rfc','http://www.rfc-editor.org/rfc/rfc$1.txt',0),
-('s23wiki','http://is-root.de/wiki/index.php/$1',0),
-('seattlewiki','http://seattle.wikia.com/wiki/$1',0),
-('seattlewireless','http://seattlewireless.net/?$1',0),
+('s23wiki','http://s23.org/wiki/$1',0),
+('seattlewireless','http://seattlewireless.net/$1',0),
 ('senseislibrary','http://senseis.xmp.net/?$1',0),
-('slashdot','http://slashdot.org/article.pl?sid=$1',0), # 2008-02-27: update me
 ('sourceforge','http://sourceforge.net/$1',0),
+('sourcewatch','http://www.sourcewatch.org/index.php?title=$1',0),
 ('squeak','http://wiki.squeak.org/squeak/$1',0),
-('susning','http://www.susning.nu/$1',0),
-('svgwiki','http://wiki.svg.org/$1',0),
-('tavi','http://tavi.sourceforge.net/$1',0),
 ('tejo','http://www.tejo.org/vikio/$1',0),
 ('tmbw','http://www.tmbw.net/wiki/$1',0),
 ('tmnet','http://www.technomanifestos.net/?$1',0),
-('tmwiki','http://www.EasyTopicMaps.com/?page=$1',0),
 ('theopedia','http://www.theopedia.com/$1',0),
 ('twiki','http://twiki.org/cgi-bin/view/$1',0),
-('uea','http://www.tejo.org/uea/$1',0),
-('unreal','http://wiki.beyondunreal.com/wiki/$1',0),
+('uea','http://uea.org/vikio/index.php/$1',0),
+('unreal','http://wiki.beyondunreal.com/$1',0),
 ('usemod','http://www.usemod.com/cgi-bin/wiki.pl?$1',0),
-('vinismo','http://vinismo.com/en/$1',0),
 ('webseitzwiki','http://webseitz.fluxent.com/wiki/$1',0),
-('why','http://clublet.com/c/c/why?$1',0),
 ('wiki','http://c2.com/cgi/wiki?$1',0),
 ('wikia','http://www.wikia.com/wiki/$1',0),
-('wikibooks','https://en.wikibooks.org/wiki/$1',1),
-('wikicities','http://www.wikia.com/wiki/$1',0),
+('wikibooks','https://en.wikibooks.org/wiki/$1',0),
 ('wikif1','http://www.wikif1.org/$1',0),
 ('wikihow','http://www.wikihow.com/$1',0),
-('wikinfo','http://www.wikinfo.org/index.php/$1',0),
-# The following wik[it]* interwikis belong to the Wikimedia Family:
+('wikinfo','http://wikinfo.co/English/index.php/$1',0),
 ('wikimedia','https://wikimediafoundation.org/wiki/$1',0),
-('wikinews','https://en.wikinews.org/wiki/$1',1),
-('wikipedia','https://en.wikipedia.org/wiki/$1',1),
-('wikiquote','https://en.wikiquote.org/wiki/$1',1),
-('wikisource','https://wikisource.org/wiki/$1',1),
-('wikispecies','https://species.wikimedia.org/wiki/$1',1),
-('wikiversity','https://en.wikiversity.org/wiki/$1',1),
-('wikivoyage','https://en.wikivoyage.org/wiki/$1',1),
-('wikt','https://en.wiktionary.org/wiki/$1',1),
-('wiktionary','https://en.wiktionary.org/wiki/$1',1),
-('wlug','http://www.wlug.org.nz/$1',0),
-('zwiki','http://zwiki.org/$1',0),
-('zzz wiki','http://wiki.zzz.ee/index.php/$1',0);
+('wikinews','https://en.wikinews.org/wiki/$1',0),
+('wikipedia','https://en.wikipedia.org/wiki/$1',0),
+('wikiquote','https://en.wikiquote.org/wiki/$1',0),
+('wikisource','https://wikisource.org/wiki/$1',0),
+('wikispecies','https://species.wikimedia.org/wiki/$1',0),
+('wikiversity','https://en.wikiversity.org/wiki/$1',0),
+('wikivoyage','https://en.wikivoyage.org/wiki/$1',0),
+('wikt','https://en.wiktionary.org/wiki/$1',0),
+('wiktionary','https://en.wiktionary.org/wiki/$1',0)
+;
diff --git a/maintenance/jsduck/MetaTags.rb b/maintenance/jsduck/MetaTags.rb
deleted file mode 100644 (file)
index cde7d3b..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-# Custom tags for JSDuck 4.x
-# See also:
-# - https://github.com/senchalabs/jsduck/wiki/Tags
-# - https://github.com/senchalabs/jsduck/wiki/Custom-tags
-# - https://github.com/senchalabs/jsduck/wiki/Custom-tags/7f5c32e568eab9edc8e3365e935bcb836cb11f1d
-require 'jsduck/meta_tag'
-
-class SourceTag < JsDuck::MetaTag
-  def initialize
-    # This defines the name of the @tag
-    @name = 'source'
-  end
-
-  # Generate HTML output for this tag.
-  # One can make use of the #format method to easily support
-  # Markdown and {@link} tags inside the contents of the tag.
-  #
-  # @param tags All matches of this tag on one class.
-  def to_html(tags)
-    '<h3 class="pa">Source</h3>' + tags.map {|tag| format(tag) }.join("\n")
-  end
-end
-
-class ContextTag < JsDuck::MetaTag
-  def initialize
-    @name = 'context'
-  end
-
-  # @param tags All matches of this tag on one class.
-  def to_html(tags)
-    return '<h3 class="pa">Context</h3>' +  render_long_context(tags.last)
-  end
-
-  def render_long_context(tag)
-    if tag =~ /\A([^\s]+)/m
-      name = $1
-      return format("`this` : {@link #{name}}")
-    end
-  end
-end
-
-class SeeTag < JsDuck::MetaTag
-  def initialize
-    @name = 'see'
-    @multiline = true
-  end
-
-  # @param tags All matches of this tag on one class.
-  def to_html(tags)
-    doc = []
-    doc << '<h3 class="pa">Related</h3>'
-    doc << [
-        '<ul>',
-        tags.map {|tag| render_long_see(tag) },
-        '</ul>',
-      ]
-    doc
-  end
-
-  def render_long_see(tag)
-    if tag =~ /\A([^\s]+)( .*)?\Z/m
-      name = $1
-      doc = $2 ? ': ' + $2 : ''
-      return [
-        '<li>',
-        format("{@link #{name}} #{doc}"),
-        '</li>'
-      ]
-    end
-  end
-end
-
-# As of JSDuck 5 this is in core
-class FiresTag < JsDuck::MetaTag
-  def initialize
-    @name = 'fires'
-    @multiline = true
-  end
-
-  # @param tags All matches of this tag on one class.
-  def to_html(tags)
-    doc = []
-    doc << '<h3 class="pa">Fires</h3>'
-    doc << [
-        '<ul>',
-        tags.map {|tag| render_long_event(tag) },
-        '</ul>',
-      ]
-    doc
-  end
-
-  def render_long_event(tag)
-    if tag =~ /\A(\w+)( .*)?\Z/m
-      name = $1
-      doc = $2 ? ': ' + $2 : ''
-      return [
-        '<li>',
-        format("{@link #event-#{name}} #{doc}"),
-        '</li>'
-      ]
-    end
-  end
-end
index eaf0a38..d6163bd 100644 (file)
@@ -25,7 +25,8 @@
                                        "mw.Notification_",
                                        "mw.user",
                                        "mw.util",
-                                       "mw.plugin.*"
+                                       "mw.plugin.*",
+                                       "mw.cookie"
                                ]
                        },
                        {
                                        "mw.Feedback"
                                ]
                        },
+                       {
+                               "name": "Special",
+                               "classes": [
+                                       "mw.special*"
+                               ]
+                       },
                        {
                                "name": "Development",
                                "classes": [
                "groups": [
                        {
                                "name": "Plugins",
-                               "classes": ["jQuery.plugin.*"]
+                               "classes": [
+                                       "jQuery.client",
+                                       "jQuery.colorUtil",
+                                       "jQuery.plugin.*"
+                               ]
                        }
                ]
        },
index 493815e..eed76b6 100644 (file)
@@ -1,26 +1,38 @@
 {
        "--title": "MediaWiki core - Documentation",
-       "--footer": "Documentation for MediaWiki core. Generated on {DATE} by {JSDUCK} {VERSION}.",
        "--categories": "./categories.json",
        "--eg-iframe": "./eg-iframe.html",
+       "--tags": "./CustomTags.rb",
+       "--warnings": ["-nodoc(class,public)"],
        "--builtin-classes": true,
+       "--warnings-exit-nonzero": true,
+       "--external": "HTMLElement,HTMLDocument,Window,File",
+       "--footer": "Documentation for MediaWiki core. Generated on {DATE} by {JSDUCK} {VERSION}.",
        "--output": "../../docs/js",
-       "--external": "HTMLElement,HTMLDocument,Window",
        "--": [
                "./external.js",
                "../../resources/src/mediawiki",
-               "../../resources/src/mediawiki.action/mediawiki.action.edit.js",
-               "../../resources/src/mediawiki.action/mediawiki.action.view.postEdit.js",
-               "../../resources/src/mediawiki.page/mediawiki.page.startup.js",
-               "../../resources/src/mediawiki.page/mediawiki.page.watch.ajax.js",
+               "../../resources/src/mediawiki.action",
                "../../resources/src/mediawiki.api",
                "../../resources/src/mediawiki.language",
+               "../../resources/src/mediawiki.page",
+               "../../resources/src/mediawiki.special",
+               "../../resources/src/jquery/jquery.accessKeyLabel.js",
                "../../resources/src/jquery/jquery.arrowSteps.js",
                "../../resources/src/jquery/jquery.autoEllipsis.js",
                "../../resources/src/jquery/jquery.badge.js",
+               "../../resources/src/jquery/jquery.byteLength.js",
                "../../resources/src/jquery/jquery.byteLimit.js",
+               "../../resources/src/jquery/jquery.checkboxShiftClick.js",
+               "../../resources/src/jquery/jquery.client.js",
+               "../../resources/src/jquery/jquery.colorUtil.js",
+               "../../resources/src/jquery/jquery.footHovzer.js",
+               "../../resources/src/jquery/jquery.getAttrs.js",
+               "../../resources/src/jquery/jquery.hidpi.js",
                "../../resources/src/jquery/jquery.localize.js",
+               "../../resources/src/jquery/jquery.makeCollapsible.js",
                "../../resources/src/jquery/jquery.spinner.js",
+               "../../resources/src/jquery/jquery.tabIndex.js",
                "../../resources/lib/oojs",
                "../../resources/lib/oojs-ui"
        ]
index 86eae4b..7dc4afa 100644 (file)
@@ -1,88 +1,88 @@
 <!DOCTYPE html>
 <html>
 <head>
-    <meta charset="utf-8">
-    <title>MediaWiki Code Example</title>
-    <script src="modules/startup.js"></script>
-    <script>
-        function startUp() {
-            mw.config = new mw.Map();
-        }
-    </script>
-    <script src="modules/jquery/jquery.js"></script>
-    <script src="modules/mediawiki/mediawiki.js"></script>
-    <style>
-        .mw-jsduck-log {
-            position: relative;
-            min-height: 3em;
-            margin-top: 2em;
-            background: #f7f7f7;
-            border: 1px solid #e4e4e4;
-        }
+       <meta charset="utf-8">
+       <title>MediaWiki Code Example</title>
+       <script src="modules/startup.js"></script>
+       <script>
+               function startUp() {
+                       mw.config = new mw.Map();
+               }
+       </script>
+       <script src="modules/jquery/jquery.js"></script>
+       <script src="modules/mediawiki/mediawiki.js"></script>
+       <style>
+               .mw-jsduck-log {
+                       position: relative;
+                       min-height: 3em;
+                       margin-top: 2em;
+                       background: #f7f7f7;
+                       border: 1px solid #e4e4e4;
+               }
 
-        .mw-jsduck-log::after {
-            position: absolute;
-            bottom: 100%;
-            right: -1px;
-            padding: 0.5em;
-            background: #fff;
-            border: 1px solid #e4e4e4;
-            border-bottom: 0;
-            border-radius: 0.5em 0.5em 0 0;
-            font: normal 0.5em sans-serif;
-            content: 'console';
-        }
+               .mw-jsduck-log::after {
+                       position: absolute;
+                       bottom: 100%;
+                       right: -1px;
+                       padding: 0.5em;
+                       background: #fff;
+                       border: 1px solid #e4e4e4;
+                       border-bottom: 0;
+                       border-radius: 0.5em 0.5em 0 0;
+                       font: normal 0.5em sans-serif;
+                       content: 'console';
+               }
 
-        .mw-jsduck-log-line {
-            padding: 0.2em 0.5em;
-            white-space: pre-wrap;
-        }
+               .mw-jsduck-log-line {
+                       padding: 0.2em 0.5em;
+                       white-space: pre-wrap;
+               }
 
-        .mw-jsduck-log-line:nth-child(odd) {
-            background: #fff;
-        }
-    </style>
+               .mw-jsduck-log-line:nth-child(odd) {
+                       background: #fff;
+               }
+       </style>
 </head>
 <body>
-    <script>
-        /**
-         * Basic log console for the example iframe in documentation pages.
-         */
-        ( function () {
-            var pre;
-            mw.log = function () {
-                var str, i, len, line;
-                if ( !pre ) {
-                    pre = document.createElement( 'pre' );
-                    pre.className = 'mw-jsduck-log';
-                    document.body.appendChild( pre );
-                }
-                str = [];
-                for ( i = 0, len = arguments.length; i < len; i++ ) {
-                    str.push( String( arguments[ i ] ) );
-                }
-                line = document.createElement( 'div' );
-                line.className = 'mw-jsduck-log-line';
-                line.appendChild(
-                    document.createTextNode( str.join( ' , ' ) + '\n' )
-                );
-                pre.appendChild( line );
-            };
-        }() );
+<script>
+       /**
+        * Basic log console for the example iframe in documentation pages.
+        */
+       ( function () {
+               var pre;
+               mw.log = function () {
+                       var str, i, len, line;
+                       if ( !pre ) {
+                               pre = document.createElement( 'pre' );
+                               pre.className = 'mw-jsduck-log';
+                               document.body.appendChild( pre );
+                       }
+                       str = [];
+                       for ( i = 0, len = arguments.length; i < len; i++ ) {
+                               str.push( String( arguments[ i ] ) );
+                       }
+                       line = document.createElement( 'div' );
+                       line.className = 'mw-jsduck-log-line';
+                       line.appendChild(
+                                       document.createTextNode( str.join( ' , ' ) + '\n' )
+                       );
+                       pre.appendChild( line );
+               };
+       }() );
 
-        /**
-         * Method called by jsduck to execute the example code.
-         */
-        function loadInlineExample( code, options, callback ) {
-            try {
-                eval( code );
-                callback && callback( true );
-            } catch (e) {
-                mw.log( 'Uncaught exception: ' + e );
-                callback && callback( false, e );
-                throw e;
-            }
-        }
-    </script>
+       /**
+        * Method called by jsduck to execute the example code.
+        */
+       function loadInlineExample( code, options, callback ) {
+               try {
+                       eval( code );
+                       callback && callback( true );
+               } catch ( e ) {
+                       mw.log( 'Uncaught exception: ' + e );
+                       callback && callback( false, e );
+                       throw e;
+               }
+       }
+</script>
 </body>
 </html>
index 410bf75..52f8201 100644 (file)
@@ -39,7 +39,9 @@ class DatabaseLag extends Maintenance {
                if ( $this->hasOption( 'r' ) ) {
                        $lb = wfGetLB();
                        echo 'time     ';
-                       for ( $i = 1; $i < $lb->getServerCount(); $i++ ) {
+
+                       $serverCount = $lb->getServerCount();
+                       for ( $i = 1; $i < $serverCount; $i++ ) {
                                $hostname = $lb->getServerName( $i );
                                printf( "%-12s ", $hostname );
                        }
index f9390f6..31ce702 100644 (file)
@@ -29,6 +29,7 @@ class StatsOutput {
                wfSuppressWarnings();
                $return = sprintf( '%.' . $accuracy . 'f%%', 100 * $subset / $total );
                wfRestoreWarnings();
+
                return $return;
        }
 
diff --git a/maintenance/language/countMessages.php b/maintenance/language/countMessages.php
deleted file mode 100644 (file)
index 1cb24ab..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-<?php
-/**
- * Count how many messages we have defined for each language.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup MaintenanceLanguage
- */
-
-require_once __DIR__ . '/../Maintenance.php';
-
-/**
- * Maintenance script that counts how many messages we have defined
- * for each language.
- *
- * @ingroup MaintenanceLanguage
- */
-class CountMessages extends Maintenance {
-       public function __construct() {
-               parent::__construct();
-               $this->mDescription = "Count how many messages we have defined for each language";
-       }
-
-       public function execute() {
-               global $IP;
-               $dir = $this->getArg( 0, "$IP/languages/messages" );
-               $total = 0;
-               $nonZero = 0;
-               foreach ( glob( "$dir/*.php" ) as $file ) {
-                       $baseName = basename( $file );
-                       if ( !preg_match( '/Messages([A-Z][a-z_]+)\.php$/', $baseName, $m ) ) {
-                               continue;
-                       }
-
-                       $numMessages = $this->getNumMessages( $file );
-                       // print "$code: $numMessages\n";
-                       $total += $numMessages;
-                       if ( $numMessages > 0 ) {
-                               $nonZero++;
-                       }
-               }
-               $this->output( "\nTotal: $total\n" );
-               $this->output( "Languages: $nonZero\n" );
-       }
-
-       private function getNumMessages( $file ) {
-               // Separate function to limit scope
-               require $file;
-               if ( isset( $messages ) ) {
-                       return count( $messages );
-               } else {
-                       return 0;
-               }
-       }
-}
-
-$maintClass = "CountMessages";
-require_once RUN_MAINTENANCE_IF_MAIN;
index db6c315..2bb5e6b 100644 (file)
@@ -365,7 +365,7 @@ class UcdXmlReader {
                $xml = $this->open();
                $this->callback = $callback;
 
-               while ( $xml->name !== 'repertoire' && $xml->next() );
+               while ( $xml->name !== 'repertoire' && $xml->next() ) ;
 
                while ( $xml->read() ) {
                        if ( $xml->nodeType == XMLReader::ELEMENT ) {
@@ -389,7 +389,7 @@ class UcdXmlReader {
                if ( !$this->xml ) {
                        throw new MWException( __METHOD__ . ": unable to open {$this->fileName}" );
                }
-               while ( $this->xml->name !== 'ucd' && $this->xml->read() );
+               while ( $this->xml->name !== 'ucd' && $this->xml->read() ) ;
                $this->xml->read();
 
                return $this->xml;
@@ -450,7 +450,7 @@ class UcdXmlReader {
                }
 
                $xml = $this->open();
-               while ( $xml->name !== 'blocks' && $xml->read() );
+               while ( $xml->name !== 'blocks' && $xml->read() ) ;
 
                while ( $xml->read() ) {
                        if ( $xml->nodeType == XMLReader::ELEMENT ) {
index fa7e11c..9c9b7ff 100644 (file)
@@ -26,9 +26,9 @@
  */
 class Languages {
        /** @var array List of languages */
-       protected $mLanguages; #
+       protected $mLanguages;
 
-       /** @var array Raw list of the messages in each language  */
+       /** @var array Raw list of the messages in each language */
        protected $mRawMessages;
 
        /** @var array Messages in each language (except for English), divided to groups */
@@ -61,17 +61,10 @@ class Languages {
        /**
         * Load the list of languages: all the Messages*.php
         * files in the languages directory.
-        *
-        * @param bool $exif Treat the Exif messages?
         */
-       function __construct( $exif = true ) {
-               require __DIR__ . '/messageTypes.inc';
-               $this->mIgnoredMessages = $wgIgnoredMessages;
-               if ( $exif ) {
-                       $this->mOptionalMessages = array_merge( $wgOptionalMessages );
-               } else {
-                       $this->mOptionalMessages = array_merge( $wgOptionalMessages, $wgEXIFMessages );
-               }
+       function __construct() {
+               wfRunHooks( 'LocalisationIgnoredOptionalMessages',
+                       array( &$this->mIgnoredMessages, &$this->mOptionalMessages ) );
 
                $this->mLanguages = array_keys( Language::fetchLanguageNames( null, 'mwfile' ) );
                sort( $this->mLanguages );
diff --git a/maintenance/language/messageTypes.inc b/maintenance/language/messageTypes.inc
deleted file mode 100644 (file)
index 9f73c80..0000000
+++ /dev/null
@@ -1,877 +0,0 @@
-<?php
-/**
- * Several types of messages.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup MaintenanceLanguage
- */
-
-/** Ignored messages, which should exist only in the English messages file. */
-$wgIgnoredMessages = array(
-       'sidebar',
-       'accesskey-pt-userpage',
-       'accesskey-pt-anonuserpage',
-       'accesskey-pt-mytalk',
-       'accesskey-pt-anontalk',
-       'accesskey-pt-preferences',
-       'accesskey-pt-watchlist',
-       'accesskey-pt-mycontris',
-       'accesskey-pt-login',
-       'accesskey-pt-logout',
-       'accesskey-ca-talk',
-       'accesskey-ca-edit',
-       'accesskey-ca-addsection',
-       'accesskey-ca-viewsource',
-       'accesskey-ca-history',
-       'accesskey-ca-protect',
-       'accesskey-ca-unprotect',
-       'accesskey-ca-delete',
-       'accesskey-ca-undelete',
-       'accesskey-ca-move',
-       'accesskey-ca-watch',
-       'accesskey-ca-unwatch',
-       'accesskey-search',
-       'accesskey-search-go',
-       'accesskey-search-fulltext',
-       'accesskey-p-logo',
-       'accesskey-n-mainpage',
-       'accesskey-n-mainpage-description',
-       'accesskey-n-portal',
-       'accesskey-n-currentevents',
-       'accesskey-n-recentchanges',
-       'accesskey-n-randompage',
-       'accesskey-n-help',
-       'accesskey-t-whatlinkshere',
-       'accesskey-t-recentchangeslinked',
-       'accesskey-feed-rss',
-       'accesskey-feed-atom',
-       'accesskey-t-contributions',
-       'accesskey-t-emailuser',
-       'accesskey-t-permalink',
-       'accesskey-t-print',
-       'accesskey-t-upload',
-       'accesskey-t-specialpages',
-       'accesskey-ca-nstab-main',
-       'accesskey-ca-nstab-user',
-       'accesskey-ca-nstab-media',
-       'accesskey-ca-nstab-special',
-       'accesskey-ca-nstab-project',
-       'accesskey-ca-nstab-image',
-       'accesskey-ca-nstab-mediawiki',
-       'accesskey-ca-nstab-template',
-       'accesskey-ca-nstab-help',
-       'accesskey-ca-nstab-category',
-       'accesskey-minoredit',
-       'accesskey-save',
-       'accesskey-preview',
-       'accesskey-diff',
-       'accesskey-compareselectedversions',
-       'accesskey-watch',
-       'accesskey-upload',
-       'accesskey-preferences-save',
-       'accesskey-summary',
-       'accesskey-userrights-set',
-       'accesskey-blockip-block',
-       'accesskey-export',
-       'accesskey-import',
-       'accesskey-watchlistedit-normal-submit',
-       'accesskey-watchlistedit-raw-submit',
-       'addsection',
-       'talkpageheader',
-       'anonnotice',
-       'autoblock_whitelist',
-       'searchmenu-new-nocreate',
-       'googlesearch',
-       'opensearch-desc',
-       'exif-make-value',
-       'exif-model-value',
-       'exif-software-value',
-       'exif-software-version-value',
-       'history_copyright',
-       'licenses',
-       'loginstart',
-       'loginend-https',
-       'loginend',
-       'loginlanguagelinks',
-       'pear-mail-error',
-       'php-mail-error',
-       'markaspatrolledlink',
-       'newarticletextanon',
-       'newsectionheaderdefaultlevel',
-       'mainpage-nstab',
-       'newtalkseparator',
-       'noarticletextanon',
-       'number_of_watching_users_RCview',
-       'pagecategorieslink',
-       'pubmedurl',
-       'randompage-url',
-       'recentchanges-url',
-       'recentchangestext',
-       'revision-info-current',
-       'createaccount-hook-aborted',
-       'revision-nav',
-       'rfcurl',
-       'shareddescriptionfollows',
-       'signature-anon',
-       'signupstart',
-       'signupend',
-       'signupend-https',
-       'emailsender',
-       'sitenotice',
-       'sitesubtitle',
-       'sitetitle',
-       'sp-contributions-footer',
-       'sp-contributions-footer-anon',
-       'sp-contributions-footer-newbies',
-       'statistics-summary',
-       'statistics-footer',
-       'talkpagetext',
-       'uploadfooter',
-       'upload-default-description',
-       'listgrouprights-link',
-       'search-interwiki-custom',
-       'allpages-summary',
-       'booksources-summary',
-       'categories-summary',
-       'blocklist-summary',
-       'listusers-summary',
-       'longpages-summary',
-       'preferences-summary',
-       'specialpages-summary',
-       'whatlinkshere-summary',
-       'listredirects-summary',
-       'uncategorizedpages-summary',
-       'uncategorizedcategories-summary',
-       'uncategorizedimages-summary',
-       'uncategorizedtemplates-summary',
-       'popularpages-summary',
-       'wantedcategories-summary',
-       'wantedfiles-summary',
-       'wantedpages-summary',
-       'watchlist-summary',
-       'mostlinked-summary',
-       'mostlinkedcategories-summary',
-       'mostlinkedtemplates-summary',
-       'mostcategories-summary',
-       'mostimages-summary',
-       'mostinterwikis-summary',
-       'mostrevisions-summary',
-       'prefixindex-summary',
-       'shortpages-summary',
-       'newpages-summary',
-       'ancientpages-summary',
-       'unwatchedpages-summary',
-       'userrights-summary',
-       'brokenredirects-summary',
-       'deadendpages-summary',
-       'protectedpages-unknown-reason',
-       'disambiguations-summary',
-       'pageswithprop-summary',
-       'doubleredirects-summary',
-       'lonelypages-summary',
-       'unusedtemplates-summary',
-       'fewestrevisions-summary',
-       'upload-summary',
-       'wantedtemplates-summary',
-       'activeusers-summary',
-       'search-summary',
-       'editpage-head-copy-warn',
-       'editpage-tos-summary',
-       'addsection-preload',
-       'addsection-editintro',
-       'longpage-hint',
-       'javascripttest-backlink',
-       'javascripttest-qunit-name',
-       'revdelete-logentry',
-       'logdelete-logentry',
-       'revdelete-content',
-       'revdelete-summary',
-       'revdelete-uname',
-       'revdelete-hid',
-       'revdelete-unhid',
-       'revdelete-log-message',
-       'logdelete-log-message',
-       'deletedarticle',
-       'suppressedarticle',
-       'undeletedarticle',
-       'patrol-log-line',
-       'patrol-log-auto',
-       'patrol-log-diff',
-       '1movedto2',
-       '1movedto2_redir',
-       'move-redirect-suppressed',
-       'newuserlog-create-entry',
-       'newuserlog-create2-entry',
-       'newuserlog-autocreate-entry',
-       'rightslogentry',
-       'rightslogentry-autopromote',
-       'suppressedarticle',
-       'deletedarticle',
-       // 'uploadedimage',
-       // 'overwroteimage',
-       'createacct-helpusername',
-       'createacct-imgcaptcha-help',
-       'userlogout-summary',
-       'changeemail-summary',
-       'changepassword-summary',
-       'unusedcategories-summary',
-       'unusedimages-summary',
-       'deletedcontributions-summary',
-       'linksearch-summary',
-       'emailuser-summary',
-       'undelete-summary',
-       'contributions-summary',
-       'unblock-summary',
-       'movepage-summary',
-       'export-summary',
-       'import-summary',
-       'editwatchlist-summary',
-       'version-summary',
-       'tags-summary',
-       'comparepages-summary',
-       'resettokens-summary',
-       'version-db-mysql-url',
-       'version-db-mariadb-url',
-       'version-db-percona-url',
-       'version-db-postgres-url',
-       'version-db-oracle-url',
-       'version-db-sqlite-url',
-       'version-db-mssql-url',
-       'version-entrypoints-index-php',
-       'version-entrypoints-api-php',
-       'version-entrypoints-load-php',
-       'ipb-default-expiry',
-       'pageinfo-header',
-       'pageinfo-footer',
-       'createacct-benefit-head1',
-       'createacct-benefit-icon1',
-       'createacct-benefit-head2',
-       'createacct-benefit-icon2',
-       'createacct-benefit-head3',
-       'createacct-benefit-icon3',
-       'today-at',
-       'redirect-text',
-       'helppage',
-       'edithelppage',
-       'helplogin-url',
-       'autocomment-prefix',
-       'move-redirect-text',
-       'interlanguage-link-title-langonly',
-       'createaccount-hook-abort',
-);
-
-/** Optional messages, which may be translated only if changed in the target language. */
-$wgOptionalMessages = array(
-       'feed-atom',
-       'feed-rss',
-       'unit-pixel',
-       'userrights-irreversible-marker',
-       'variantname-zh-hans',
-       'variantname-zh-hant',
-       'variantname-zh-cn',
-       'variantname-zh-tw',
-       'variantname-zh-hk',
-       'variantname-zh-mo',
-       'variantname-zh-my',
-       'variantname-zh-sg',
-       'variantname-zh',
-       'variantname-gan-hans',
-       'variantname-gan-hant',
-       'variantname-gan',
-       'variantname-sr-ec',
-       'variantname-sr-el',
-       'variantname-sr',
-       'variantname-kk-arab',
-       'variantname-kk-cyrl',
-       'variantname-kk-latn',
-       'variantname-kk-tr',
-       'variantname-kk-kz',
-       'variantname-kk-cn',
-       'variantname-kk',
-       'variantname-ku-latn',
-       'variantname-ku-arab',
-       'variantname-ku',
-       'variantname-tg-cyrl',
-       'variantname-tg-latn',
-       'variantname-tg',
-       'variantname-ike-cans',
-       'variantname-ike-latn',
-       'variantname-iu',
-       'variantname-shi-tfng',
-       'variantname-shi-latn',
-       'variantname-shi',
-       'rc-change-size',
-       'resetpass_text',
-       'image_sample',
-       'media_sample',
-       'skinname-cologneblue',
-       'skinname-monobook',
-       'skinname-modern',
-       'skinname-vector',
-       'common.css',
-       'cologneblue.css',
-       'monobook.css',
-       'modern.css',
-       'vector.css',
-       'print.css',
-       'noscript.css',
-       'group-autoconfirmed.css',
-       'group-user.css',
-       'group-bot.css',
-       'group-sysop.css',
-       'group-bureaucrat.css',
-       'common.js',
-       'cologneblue.js',
-       'monobook.js',
-       'modern.js',
-       'vector.js',
-       'group-autoconfirmed.js',
-       'group-user.js',
-       'group-bot.js',
-       'group-sysop.js',
-       'group-bureaucrat.js',
-       'widthheight',
-       'exif-fnumber-format',
-       'exif-focallength-format',
-       'exif-compression-5',
-       'exif-compression-6',
-       'exif-compression-7',
-       'exif-compression-8',
-       'exif-compression-32773',
-       'exif-compression-32946',
-       'exif-compression-34712',
-       'exif-photometricinterpretation-2',
-       'exif-photometricinterpretation-6',
-       'exif-xyresolution-i',
-       'exif-xyresolution-c',
-       'exif-colorspace-1',
-       'exif-componentsconfiguration-1',
-       'exif-componentsconfiguration-2',
-       'exif-componentsconfiguration-3',
-       'exif-componentsconfiguration-4',
-       'exif-componentsconfiguration-5',
-       'exif-componentsconfiguration-6',
-       'exif-contact-value',
-       'exif-coordinate-format',
-       'exif-lightsource-20',
-       'exif-lightsource-21',
-       'exif-lightsource-22',
-       'exif-lightsource-23',
-       'exif-maxaperturevalue-value',
-       'exif-subjectnewscode-value',
-       'booksources-isbn',
-       'protect-summary-desc',
-       'sp-contributions-explain',
-       'sorbs',
-       'video-dims',
-       'seconds-abbrev',
-       'minutes-abbrev',
-       'hours-abbrev',
-       'days-abbrev',
-       'pagetitle',
-       'filename-prefix-blacklist',
-       'edittools',
-       'edittools-upload',
-       'size-bytes',
-       'size-kilobytes',
-       'size-megabytes',
-       'size-gigabytes',
-       'size-terabytes',
-       'size-petabytes',
-       'size-exabytes',
-       'size-zetabytes',
-       'size-yottabytes',
-       'bitrate-bits',
-       'bitrate-kilobits',
-       'bitrate-megabits',
-       'bitrate-gigabits',
-       'bitrate-terabits',
-       'bitrate-petabits',
-       'bitrate-exabits',
-       'bitrate-zetabits',
-       'bitrate-yottabits',
-       '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',
-       'hijri-calendar-m5',
-       'hijri-calendar-m6',
-       'hijri-calendar-m7',
-       'hijri-calendar-m8',
-       'hijri-calendar-m9',
-       'hijri-calendar-m10',
-       'hijri-calendar-m11',
-       'hijri-calendar-m12',
-       'hebrew-calendar-m1',
-       'hebrew-calendar-m2',
-       'hebrew-calendar-m3',
-       'hebrew-calendar-m4',
-       'hebrew-calendar-m5',
-       'hebrew-calendar-m6',
-       'hebrew-calendar-m6a',
-       'hebrew-calendar-m6b',
-       'hebrew-calendar-m7',
-       'hebrew-calendar-m8',
-       'hebrew-calendar-m9',
-       'hebrew-calendar-m10',
-       'hebrew-calendar-m11',
-       'hebrew-calendar-m12',
-       'hebrew-calendar-m1-gen',
-       'hebrew-calendar-m2-gen',
-       'hebrew-calendar-m3-gen',
-       'hebrew-calendar-m4-gen',
-       'hebrew-calendar-m5-gen',
-       'hebrew-calendar-m6-gen',
-       'hebrew-calendar-m6a-gen',
-       'hebrew-calendar-m6b-gen',
-       'hebrew-calendar-m7-gen',
-       'hebrew-calendar-m8-gen',
-       'hebrew-calendar-m9-gen',
-       'hebrew-calendar-m10-gen',
-       'hebrew-calendar-m11-gen',
-       'hebrew-calendar-m12-gen',
-       'version-api',
-       'version-version',
-       'version-svn-revision',
-       'semicolon-separator',
-       'comma-separator',
-       'colon-separator',
-       'pipe-separator',
-       'word-separator',
-       'ellipsis',
-       'percent',
-       'parentheses',
-       'brackets',
-       'listgrouprights-right-display',
-       'listgrouprights-right-revoked',
-       'timezone-utc',
-       'unpatrolledletter',
-       'diff-with-additional',
-       'pagetitle-view-mainpage',
-       'backlinksubtitle',
-       'prefs-registration-date-time',
-       'prefs-memberingroups-type',
-       'userrights-groupsmember-type',
-       'shared-repo-name-wikimediacommons',
-       'usermessage-template',
-       'filepage.css',
-       'metadata-langitem',
-       'metadata-langitem-default',
-       'nocookiesforlogin',
-       'version-entrypoints-articlepath',
-       'version-entrypoints-scriptpath',
-       'mergehistory-revisionrow',
-       'categoryviewer-pagedlinks',
-       'undelete-revision-row',
-       'pageinfo-redirects-value',
-       'created', // @deprecated. Remove in MediaWiki 1.23.
-       'changed', // @deprecated. Remove in MediaWiki 1.23.
-       'limitreport-ppvisitednodes-value',
-       'limitreport-ppgeneratednodes-value',
-       'limitreport-expansiondepth-value',
-       'limitreport-expensivefunctioncount-value',
-       'interlanguage-link-title',
-       'img-lang-opt',
-       'recentchanges-legend-plusminus',
-);
-
-/** Exif messages, which may be set as optional in several checks, but are generally mandatory */
-$wgEXIFMessages = array(
-       'exif-imagewidth',
-       'exif-imagelength',
-       'exif-bitspersample',
-       'exif-compression',
-       'exif-photometricinterpretation',
-       'exif-orientation',
-       'exif-samplesperpixel',
-       'exif-planarconfiguration',
-       'exif-ycbcrsubsampling',
-       'exif-ycbcrpositioning',
-       'exif-xresolution',
-       'exif-yresolution',
-       'exif-stripoffsets',
-       'exif-rowsperstrip',
-       'exif-stripbytecounts',
-       'exif-jpeginterchangeformat',
-       'exif-jpeginterchangeformatlength',
-       'exif-whitepoint',
-       'exif-primarychromaticities',
-       'exif-ycbcrcoefficients',
-       'exif-referenceblackwhite',
-       'exif-datetime',
-       'exif-imagedescription',
-       'exif-make',
-       'exif-model',
-       'exif-software',
-       'exif-artist',
-       'exif-copyright',
-       'exif-exifversion',
-       'exif-flashpixversion',
-       'exif-colorspace',
-       'exif-componentsconfiguration',
-       'exif-compressedbitsperpixel',
-       'exif-pixelydimension',
-       'exif-pixelxdimension',
-       'exif-usercomment',
-       'exif-relatedsoundfile',
-       'exif-datetimeoriginal',
-       'exif-datetimedigitized',
-       'exif-subsectime',
-       'exif-subsectimeoriginal',
-       'exif-subsectimedigitized',
-       'exif-exposuretime',
-       'exif-exposuretime-format',
-       'exif-fnumber',
-       'exif-fnumber-format',
-       'exif-exposureprogram',
-       'exif-spectralsensitivity',
-       'exif-isospeedratings',
-       'exif-shutterspeedvalue',
-       'exif-aperturevalue',
-       'exif-brightnessvalue',
-       'exif-exposurebiasvalue',
-       'exif-maxaperturevalue',
-       'exif-subjectdistance',
-       'exif-meteringmode',
-       'exif-lightsource',
-       'exif-flash',
-       'exif-focallength',
-       'exif-focallength-format',
-       'exif-subjectarea',
-       'exif-flashenergy',
-       'exif-focalplanexresolution',
-       'exif-focalplaneyresolution',
-       'exif-focalplaneresolutionunit',
-       'exif-subjectlocation',
-       'exif-exposureindex',
-       'exif-sensingmethod',
-       'exif-filesource',
-       'exif-scenetype',
-       'exif-customrendered',
-       'exif-exposuremode',
-       'exif-whitebalance',
-       'exif-digitalzoomratio',
-       'exif-focallengthin35mmfilm',
-       'exif-scenecapturetype',
-       'exif-gaincontrol',
-       'exif-contrast',
-       'exif-saturation',
-       'exif-sharpness',
-       'exif-devicesettingdescription',
-       'exif-subjectdistancerange',
-       'exif-imageuniqueid',
-       'exif-gpsversionid',
-       'exif-gpslatituderef',
-       'exif-gpslatitude',
-       'exif-gpslongituderef',
-       'exif-gpslongitude',
-       'exif-gpsaltituderef',
-       'exif-gpsaltitude',
-       'exif-gpstimestamp',
-       'exif-gpssatellites',
-       'exif-gpsstatus',
-       'exif-gpsmeasuremode',
-       'exif-gpsdop',
-       'exif-gpsspeedref',
-       'exif-gpsspeed',
-       'exif-gpstrackref',
-       'exif-gpstrack',
-       'exif-gpsimgdirectionref',
-       'exif-gpsimgdirection',
-       'exif-gpsmapdatum',
-       'exif-gpsdestlatituderef',
-       'exif-gpsdestlatitude',
-       'exif-gpsdestlongituderef',
-       'exif-gpsdestlongitude',
-       'exif-gpsdestbearingref',
-       'exif-gpsdestbearing',
-       'exif-gpsdestdistanceref',
-       'exif-gpsdestdistance',
-       'exif-gpsprocessingmethod',
-       'exif-gpsareainformation',
-       'exif-gpsdatestamp',
-       'exif-gpsdifferential',
-       'exif-coordinate-format',
-       'exif-jpegfilecomment',
-       'exif-keywords',
-       'exif-worldregioncreated',
-       'exif-countrycreated',
-       'exif-countrycodecreated',
-       'exif-provinceorstatecreated',
-       'exif-citycreated',
-       'exif-sublocationcreated',
-       'exif-worldregiondest',
-       'exif-countrydest',
-       'exif-countrycodedest',
-       'exif-provinceorstatedest',
-       'exif-citydest',
-       'exif-sublocationdest',
-       'exif-objectname',
-       'exif-specialinstructions',
-       'exif-headline',
-       'exif-credit',
-       'exif-source',
-       'exif-editstatus',
-       'exif-urgency',
-       'exif-fixtureidentifier',
-       'exif-locationdest',
-       'exif-locationdestcode',
-       'exif-objectcycle',
-       'exif-contact',
-       'exif-writer',
-       'exif-languagecode',
-       'exif-iimversion',
-       'exif-iimcategory',
-       'exif-iimsupplementalcategory',
-       'exif-datetimeexpires',
-       'exif-datetimereleased',
-       'exif-originaltransmissionref',
-       'exif-identifier',
-       'exif-lens',
-       'exif-serialnumber',
-       'exif-cameraownername',
-       'exif-label',
-       'exif-datetimemetadata',
-       'exif-nickname',
-       'exif-rating',
-       'exif-rightscertificate',
-       'exif-copyrighted',
-       'exif-copyrightowner',
-       'exif-usageterms',
-       'exif-webstatement',
-       'exif-originaldocumentid',
-       'exif-licenseurl',
-       'exif-morepermissionsurl',
-       'exif-attributionurl',
-       'exif-preferredattributionname',
-       'exif-pngfilecomment',
-       'exif-disclaimer',
-       'exif-contentwarning',
-       'exif-giffilecomment',
-       'exif-intellectualgenre',
-       'exif-subjectnewscode',
-       'exif-scenecode',
-       'exif-event',
-       'exif-organisationinimage',
-       'exif-personinimage',
-       'exif-originalimageheight',
-       'exif-originalimagewidth',
-       'exif-make-value',
-       'exif-model-value',
-       'exif-software-value',
-       'exif-software-version-value',
-       'exif-contact-value',
-       'exif-subjectnewscode-value',
-       'exif-compression-1',
-       'exif-compression-2',
-       'exif-compression-3',
-       'exif-compression-4',
-       'exif-compression-5',
-       'exif-compression-6',
-       'exif-compression-7',
-       'exif-compression-8',
-       'exif-compression-32773',
-       'exif-compression-32946',
-       'exif-compression-34712',
-       'exif-copyrighted-true',
-       'exif-copyrighted-false',
-       'exif-photometricinterpretation-2',
-       'exif-photometricinterpretation-6',
-       'exif-unknowndate',
-       'exif-orientation-1',
-       'exif-orientation-2',
-       'exif-orientation-3',
-       'exif-orientation-4',
-       'exif-orientation-5',
-       'exif-orientation-6',
-       'exif-orientation-7',
-       'exif-orientation-8',
-       'exif-planarconfiguration-1',
-       'exif-planarconfiguration-2',
-       'exif-xyresolution-i',
-       'exif-xyresolution-c',
-       'exif-colorspace-1',
-       'exif-colorspace-65535',
-       'exif-componentsconfiguration-0',
-       'exif-componentsconfiguration-1',
-       'exif-componentsconfiguration-2',
-       'exif-componentsconfiguration-3',
-       'exif-componentsconfiguration-4',
-       'exif-componentsconfiguration-5',
-       'exif-componentsconfiguration-6',
-       'exif-exposureprogram-0',
-       'exif-exposureprogram-1',
-       'exif-exposureprogram-2',
-       'exif-exposureprogram-3',
-       'exif-exposureprogram-4',
-       'exif-exposureprogram-5',
-       'exif-exposureprogram-6',
-       'exif-exposureprogram-7',
-       'exif-exposureprogram-8',
-       'exif-subjectdistance-value',
-       'exif-meteringmode-0',
-       'exif-meteringmode-1',
-       'exif-meteringmode-2',
-       'exif-meteringmode-3',
-       'exif-meteringmode-4',
-       'exif-meteringmode-5',
-       'exif-meteringmode-6',
-       'exif-meteringmode-255',
-       'exif-lightsource-0',
-       'exif-lightsource-1',
-       'exif-lightsource-2',
-       'exif-lightsource-3',
-       'exif-lightsource-4',
-       'exif-lightsource-9',
-       'exif-lightsource-10',
-       'exif-lightsource-11',
-       'exif-lightsource-12',
-       'exif-lightsource-13',
-       'exif-lightsource-14',
-       'exif-lightsource-15',
-       'exif-lightsource-17',
-       'exif-lightsource-18',
-       'exif-lightsource-19',
-       'exif-lightsource-20',
-       'exif-lightsource-21',
-       'exif-lightsource-22',
-       'exif-lightsource-23',
-       'exif-lightsource-24',
-       'exif-lightsource-255',
-       'exif-flash-fired-0',
-       'exif-flash-fired-1',
-       'exif-flash-return-0',
-       'exif-flash-return-2',
-       'exif-flash-return-3',
-       'exif-flash-mode-1',
-       'exif-flash-mode-2',
-       'exif-flash-mode-3',
-       'exif-flash-function-1',
-       'exif-flash-redeye-1',
-       'exif-focalplaneresolutionunit-2',
-       'exif-sensingmethod-1',
-       'exif-sensingmethod-2',
-       'exif-sensingmethod-3',
-       'exif-sensingmethod-4',
-       'exif-sensingmethod-5',
-       'exif-sensingmethod-7',
-       'exif-sensingmethod-8',
-       'exif-filesource-3',
-       'exif-scenetype-1',
-       'exif-customrendered-0',
-       'exif-customrendered-1',
-       'exif-exposuremode-0',
-       'exif-exposuremode-1',
-       'exif-exposuremode-2',
-       'exif-whitebalance-0',
-       'exif-whitebalance-1',
-       'exif-scenecapturetype-0',
-       'exif-scenecapturetype-1',
-       'exif-scenecapturetype-2',
-       'exif-scenecapturetype-3',
-       'exif-gaincontrol-0',
-       'exif-gaincontrol-1',
-       'exif-gaincontrol-2',
-       'exif-gaincontrol-3',
-       'exif-gaincontrol-4',
-       'exif-contrast-0',
-       'exif-contrast-1',
-       'exif-contrast-2',
-       'exif-saturation-0',
-       'exif-saturation-1',
-       'exif-saturation-2',
-       'exif-sharpness-0',
-       'exif-sharpness-1',
-       'exif-sharpness-2',
-       'exif-subjectdistancerange-0',
-       'exif-subjectdistancerange-1',
-       'exif-subjectdistancerange-2',
-       'exif-subjectdistancerange-3',
-       'exif-gpslatitude-n',
-       'exif-gpslatitude-s',
-       'exif-gpslongitude-e',
-       'exif-gpslongitude-w',
-       'exif-gpsaltitude-above-sealevel',
-       'exif-gpsaltitude-below-sealevel',
-       'exif-gpsstatus-a',
-       'exif-gpsstatus-v',
-       'exif-gpsmeasuremode-2',
-       'exif-gpsmeasuremode-3',
-       'exif-gpsspeed-k',
-       'exif-gpsspeed-m',
-       'exif-gpsspeed-n',
-       'exif-gpsdestdistance-k',
-       'exif-gpsdestdistance-m',
-       'exif-gpsdestdistance-n',
-       'exif-gpsdop-excellent',
-       'exif-gpsdop-good',
-       'exif-gpsdop-moderate',
-       'exif-gpsdop-fair',
-       'exif-gpsdop-poor',
-       'exif-objectcycle-a',
-       'exif-objectcycle-p',
-       'exif-objectcycle-b',
-       'exif-gpsdirection-t',
-       'exif-gpsdirection-m',
-       'exif-ycbcrpositioning-1',
-       'exif-ycbcrpositioning-2',
-       'exif-dc-contributor',
-       'exif-dc-coverage',
-       'exif-dc-date',
-       'exif-dc-publisher',
-       'exif-dc-relation',
-       'exif-dc-rights',
-       'exif-dc-source',
-       'exif-dc-type',
-       'exif-rating-rejected',
-       'exif-isospeedratings-overflow',
-       'exif-maxaperturevalue-value',
-       'exif-iimcategory-ace',
-       'exif-iimcategory-clj',
-       'exif-iimcategory-dis',
-       'exif-iimcategory-fin',
-       'exif-iimcategory-edu',
-       'exif-iimcategory-evn',
-       'exif-iimcategory-hth',
-       'exif-iimcategory-hum',
-       'exif-iimcategory-lab',
-       'exif-iimcategory-lif',
-       'exif-iimcategory-pol',
-       'exif-iimcategory-rel',
-       'exif-iimcategory-sci',
-       'exif-iimcategory-soi',
-       'exif-iimcategory-spo',
-       'exif-iimcategory-war',
-       'exif-iimcategory-wea',
-       'exif-urgency-normal',
-       'exif-urgency-low',
-       'exif-urgency-high',
-       'exif-urgency-other',
-);
diff --git a/maintenance/language/messages.inc b/maintenance/language/messages.inc
deleted file mode 100644 (file)
index a88d1ba..0000000
+++ /dev/null
@@ -1,4297 +0,0 @@
-<?php
-/**
- * Define the messages structure in the messages file, for an automated rewriting.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup MaintenanceLanguage
- */
-
-/** The structure of the messages, divided to blocks */
-$wgMessageStructure = array(
-       'sidebar' => array(
-               'sidebar',
-       ),
-       'toggles' => array(
-               'tog-underline',
-               'tog-hideminor',
-               'tog-hidepatrolled',
-               'tog-newpageshidepatrolled',
-               'tog-extendwatchlist',
-               'tog-usenewrc',
-               'tog-numberheadings',
-               'tog-showtoolbar',
-               'tog-editondblclick',
-               'tog-editsectiononrightclick',
-               'tog-watchcreations',
-               'tog-watchdefault',
-               'tog-watchmoves',
-               'tog-watchdeletion',
-               'tog-minordefault',
-               'tog-previewontop',
-               'tog-previewonfirst',
-               'tog-enotifwatchlistpages',
-               'tog-enotifusertalkpages',
-               'tog-enotifminoredits',
-               'tog-enotifrevealaddr',
-               'tog-shownumberswatching',
-               'tog-oldsig',
-               'tog-fancysig',
-               'tog-uselivepreview',
-               'tog-forceeditsummary',
-               'tog-watchlisthideown',
-               'tog-watchlisthidebots',
-               'tog-watchlisthideminor',
-               'tog-watchlisthideliu',
-               'tog-watchlisthideanons',
-               'tog-watchlisthidepatrolled',
-               'tog-ccmeonemails',
-               'tog-diffonly',
-               'tog-showhiddencats',
-               'tog-norollbackdiff',
-               'tog-useeditwarning',
-               'tog-prefershttps'
-       ),
-       'underline' => array(
-               'underline-always',
-               'underline-never',
-               'underline-default',
-       ),
-       'editfont' => array(
-               'editfont-style',
-               'editfont-default',
-               'editfont-monospace',
-               'editfont-sansserif',
-               'editfont-serif',
-       ),
-       'dates' => array(
-               'sunday',
-               'monday',
-               'tuesday',
-               'wednesday',
-               'thursday',
-               'friday',
-               'saturday',
-               'sun',
-               'mon',
-               'tue',
-               'wed',
-               'thu',
-               'fri',
-               'sat',
-               'january',
-               'february',
-               'march',
-               'april',
-               'may_long',
-               'june',
-               'july',
-               'august',
-               'september',
-               'october',
-               'november',
-               'december',
-               'january-gen',
-               'february-gen',
-               'march-gen',
-               'april-gen',
-               'may-gen',
-               'june-gen',
-               'july-gen',
-               'august-gen',
-               'september-gen',
-               'october-gen',
-               'november-gen',
-               'december-gen',
-               'jan',
-               'feb',
-               'mar',
-               'apr',
-               'may',
-               'jun',
-               'jul',
-               'aug',
-               'sep',
-               'oct',
-               'nov',
-               'dec',
-               'january-date',
-               'february-date',
-               'march-date',
-               'april-date',
-               'may-date',
-               'june-date',
-               'july-date',
-               'august-date',
-               'september-date',
-               'october-date',
-               'november-date',
-               'december-date',
-       ),
-       'categorypages' => array(
-               'pagecategories',
-               'pagecategorieslink',
-               'category_header',
-               'subcategories',
-               'category-media-header',
-               'category-empty',
-               'hidden-categories',
-               'hidden-category-category',
-               'category-subcat-count',
-               'category-subcat-count-limited',
-               'category-article-count',
-               'category-article-count-limited',
-               'category-file-count',
-               'category-file-count-limited',
-               'listingcontinuesabbrev',
-               'index-category',
-               'noindex-category',
-               'broken-file-category',
-               'categoryviewer-pagedlinks',
-       ),
-       'miscellaneous1' => array(
-               'about',
-               'article',
-               'newwindow',
-               'cancel',
-               'moredotdotdot',
-               'morenotlisted',
-               'mypage',
-               'mytalk',
-               'anontalk',
-               'navigation',
-               'and',
-       ),
-       'cologneblue' => array(
-               'qbfind',
-               'qbbrowse',
-               'qbedit',
-               'qbpageoptions',
-               'qbmyoptions',
-               'faq',
-               'faqpage',
-               'sitetitle',
-               'sitesubtitle',
-       ),
-       'vector' => array(
-               'vector-action-addsection',
-               'vector-action-delete',
-               'vector-action-move',
-               'vector-action-protect',
-               'vector-action-undelete',
-               'vector-action-unprotect',
-               'vector-view-create',
-               'vector-view-edit',
-               'vector-view-history',
-               'vector-view-view',
-               'vector-view-viewsource',
-               'actions',
-               'namespaces',
-               'variants',
-       ),
-       'miscellaneous2' => array(
-               'navigation-heading',
-               'errorpagetitle',
-               'returnto',
-               'tagline',
-               'help',
-               'search',
-               'searchbutton',
-               'go',
-               'searcharticle',
-               'history',
-               'history_short',
-               'updatedmarker',
-               'printableversion',
-               'permalink',
-               'print',
-               'view',
-               'edit',
-               'create',
-               'editthispage',
-               'create-this-page',
-               'delete',
-               'deletethispage',
-               'undeletethispage',
-               'undelete_short',
-               'viewdeleted_short',
-               'protect',
-               'protect_change',
-               'protectthispage',
-               'unprotect',
-               'unprotectthispage',
-               'newpage',
-               'talkpage',
-               'talkpagelinktext',
-               'specialpage',
-               'personaltools',
-               'postcomment',
-               'addsection',
-               'articlepage',
-               'talk',
-               'views',
-               'toolbox',
-               'userpage',
-               'projectpage',
-               'imagepage',
-               'mediawikipage',
-               'templatepage',
-               'viewhelppage',
-               'categorypage',
-               'viewtalkpage',
-               'otherlanguages',
-               'redirectedfrom',
-               'redirectpagesub',
-               'talkpageheader',
-               'lastmodifiedat',
-               'viewcount',
-               'protectedpage',
-               'jumpto',
-               'jumptonavigation',
-               'jumptosearch',
-               'view-pool-error',
-               'pool-timeout',
-               'pool-queuefull',
-               'pool-errorunknown',
-               'pool-servererror',
-       ),
-       'links' => array(
-               'aboutsite',
-               'aboutpage',
-               'copyright',
-               'copyrightpage',
-               'currentevents',
-               'currentevents-url',
-               'disclaimers',
-               'disclaimerpage',
-               'edithelp',
-               'edithelppage',
-               'helppage',
-               'mainpage',
-               'mainpage-description',
-               'policy-url',
-               'portal',
-               'portal-url',
-               'privacy',
-               'privacypage',
-       ),
-       'badaccess' => array(
-               'badaccess',
-               'badaccess-group0',
-               'badaccess-groups',
-       ),
-       'versionrequired' => array(
-               'versionrequired',
-               'versionrequiredtext',
-       ),
-       'miscellaneous3' => array(
-               'ok',
-               'pagetitle',
-               'pagetitle-view-mainpage',
-               'backlinksubtitle',
-               'retrievedfrom',
-               'youhavenewmessages',
-               'youhavenewmessagesfromusers',
-               'youhavenewmessagesmanyusers',
-               'newmessageslinkplural',
-               'newmessagesdifflinkplural',
-               'youhavenewmessagesmulti',
-               'newtalkseparator',
-               'editsection',
-               'editold',
-               'viewsourceold',
-               'editlink',
-               'viewsourcelink',
-               'editsectionhint',
-               'toc',
-               'showtoc',
-               'hidetoc',
-               'collapsible-collapse',
-               'collapsible-expand',
-               'thisisdeleted',
-               'viewdeleted',
-               'restorelink',
-               'feedlinks',
-               'feed-invalid',
-               'feed-unavailable',
-               'site-rss-feed',
-               'site-atom-feed',
-               'page-rss-feed',
-               'page-atom-feed',
-               'feed-atom',
-               'feed-rss',
-               'sitenotice',
-               'anonnotice',
-               'newsectionheaderdefaultlevel',
-               'red-link-title',
-               'sort-descending',
-               'sort-ascending',
-
-       ),
-       'nstab' => array(
-               'nstab-main',
-               'nstab-user',
-               'nstab-media',
-               'nstab-special',
-               'nstab-project',
-               'nstab-image',
-               'nstab-mediawiki',
-               'nstab-template',
-               'nstab-help',
-               'nstab-category',
-               'mainpage-nstab',
-       ),
-       'main' => array(
-               'nosuchaction',
-               'nosuchactiontext',
-               'nosuchspecialpage',
-               'nospecialpagetext',
-       ),
-       'errors' => array(
-               'error',
-               'databaseerror',
-               'databaseerror-text',
-               'databaseerror-textcl',
-               'databaseerror-query',
-               'databaseerror-function',
-               'databaseerror-error',
-               'laggedslavemode',
-               'readonly',
-               'enterlockreason',
-               'readonlytext',
-               'missing-article', // not used anymore in core, but kept for extensions
-               'missingarticle-rev', // not used anymore in core, but kept for extensions
-               'missingarticle-diff', // not used anymore in core, but kept for extensions
-               'readonly_lag',
-               'internalerror',
-               'internalerror_info',
-               'fileappenderrorread',
-               'fileappenderror',
-               'filecopyerror',
-               'filerenameerror',
-               'filedeleteerror',
-               'directorycreateerror',
-               'filenotfound',
-               'fileexistserror',
-               'unexpected',
-               'formerror',
-               'badarticleerror',
-               'cannotdelete',
-               'cannotdelete-title',
-               'delete-hook-aborted',
-               'no-null-revision',
-               'badtitle',
-               'badtitletext',
-               'perfcached',
-               'perfcachedts',
-               'querypage-no-updates',
-               'viewsource',
-               'viewsource-title',
-               'actionthrottled',
-               'actionthrottledtext',
-               'protectedpagetext',
-               'viewsourcetext',
-               'viewyourtext',
-               'protectedinterface',
-               'editinginterface',
-               'cascadeprotected',
-               'namespaceprotected',
-               'customcssprotected',
-               'customjsprotected',
-               'mycustomcssprotected',
-               'mycustomjsprotected',
-               'myprivateinfoprotected',
-               'mypreferencesprotected',
-               'ns-specialprotected',
-               'titleprotected',
-               'filereadonlyerror',
-               'invalidtitle-knownnamespace',
-               'invalidtitle-unknownnamespace',
-               'exception-nologin',
-               'exception-nologin-text',
-               'exception-nologin-text-manual',
-       ),
-       'virus' => array(
-               'virus-badscanner',
-               'virus-scanfailed',
-               'virus-unknownscanner',
-       ),
-       'login' => array(
-               'logouttext',
-               'welcomeuser',
-               'welcomecreation-msg',
-               'yourname',
-               'userlogin-yourname',
-               'userlogin-yourname-ph',
-               'createacct-another-username-ph',
-               'createacct-helpusername',
-               'yourpassword',
-               'userlogin-yourpassword',
-               'userlogin-yourpassword-ph',
-               'createacct-yourpassword-ph',
-               'yourpasswordagain',
-               'createacct-yourpasswordagain',
-               'createacct-yourpasswordagain-ph',
-               'remembermypassword',
-               'userlogin-remembermypassword',
-               'userlogin-signwithsecure',
-               'yourdomainname',
-               'password-change-forbidden',
-               'externaldberror',
-               'login',
-               'nav-login-createaccount',
-               'loginprompt',
-               'userlogin',
-               'userloginnocreate',
-               'logout',
-               'userlogout',
-               'userlogout-summary',
-               'notloggedin',
-               'userlogin-noaccount',
-               'userlogin-joinproject',
-               'nologin',
-               'nologinlink',
-               'createaccount',
-               'gotaccount',
-               'gotaccountlink',
-               'userlogin-resetlink',
-               'userlogin-resetpassword-link',
-               'helplogin-url',
-               'userlogin-helplink2',
-               'userlogin-loggedin',
-               'userlogin-createanother',
-               'createacct-join',
-               'createacct-another-join',
-               'createacct-emailrequired',
-               'createacct-emailoptional',
-               'createacct-email-ph',
-               'createacct-another-email-ph',
-               'createaccountmail',
-               'createacct-realname',
-               'createaccountreason',
-               'createacct-reason',
-               'createacct-reason-ph',
-               'createacct-captcha',
-               'createacct-imgcaptcha-help',
-               'createacct-imgcaptcha-ph',
-               'createacct-submit',
-               'createacct-another-submit',
-               'createacct-benefit-heading',
-               'createacct-benefit-icon1',
-               'createacct-benefit-head1',
-               'createacct-benefit-body1',
-               'createacct-benefit-icon2',
-               'createacct-benefit-head2',
-               'createacct-benefit-body2',
-               'createacct-benefit-icon3',
-               'createacct-benefit-head3',
-               'createacct-benefit-body3',
-               'badretype',
-               'userexists',
-               'loginerror',
-               'createacct-error',
-               'createaccounterror',
-               'nocookiesnew',
-               'nocookieslogin',
-               'nocookiesfornew',
-               'nocookiesforlogin',
-               'noname',
-               'loginsuccesstitle',
-               'loginsuccess',
-               'nosuchuser',
-               'nosuchusershort',
-               'nouserspecified',
-               'login-userblocked',
-               'wrongpassword',
-               'wrongpasswordempty',
-               'passwordtooshort',
-               'password-name-match',
-               'password-login-forbidden',
-               'mailmypassword',
-               'passwordremindertitle',
-               'passwordremindertext',
-               'noemail',
-               'noemailcreate',
-               'passwordsent',
-               'blocked-mailpassword',
-               'eauthentsent',
-               'throttled-mailpassword',
-               'loginstart',
-               'loginend',
-               'loginend-https',
-               'signupstart',
-               'signupend',
-               'signupend-https',
-               'mailerror',
-               'acct_creation_throttle_hit',
-               'emailauthenticated',
-               'emailnotauthenticated',
-               'noemailprefs',
-               'emailconfirmlink',
-               'invalidemailaddress',
-               'cannotchangeemail',
-               'emaildisabled',
-               'emailsender',
-               'accountcreated',
-               'accountcreatedtext',
-               'createaccount-title',
-               'createaccount-text',
-               'usernamehasherror',
-               'login-throttled',
-               'login-abort-generic',
-               'loginlanguagelabel',
-               'loginlanguagelinks',
-               'suspicious-userlogout',
-               'createacct-another-realname-tip',
-               'pt-login',
-               'pt-login-button',
-               'pt-createaccount',
-               'pt-userlogout',
-       ),
-       'mail' => array(
-               'pear-mail-error',
-               'php-mail-error',
-               'php-mail-error-unknown',
-               'user-mail-no-addy',
-               'user-mail-no-body',
-       ),
-       'resetpass' => array(
-               'changepassword',
-               'changepassword-summary',
-               'resetpass_announce',
-               'resetpass_text',
-               'resetpass_header',
-               'oldpassword',
-               'newpassword',
-               'retypenew',
-               'resetpass_submit',
-               'changepassword-success',
-               'changepassword-throttled',
-               'resetpass_forbidden',
-               'resetpass-no-info',
-               'resetpass-submit-loggedin',
-               'resetpass-submit-cancel',
-               'resetpass-wrong-oldpass',
-               'resetpass-recycled',
-               'resetpass-temp-emailed',
-               'resetpass-temp-password',
-               'resetpass-abort-generic',
-               'resetpass-expired',
-               'resetpass-expired-soft',
-               'resetpass-validity-soft',
-       ),
-       'passwordreset' => array(
-               'passwordreset',
-               'passwordreset-text-one',
-               'passwordreset-text-many',
-               'passwordreset-legend',
-               'passwordreset-disabled',
-               'passwordreset-emaildisabled',
-               'passwordreset-username',
-               'passwordreset-domain',
-               'passwordreset-capture',
-               'passwordreset-capture-help',
-               'passwordreset-email',
-               'passwordreset-emailtitle',
-               'passwordreset-emailtext-ip',
-               'passwordreset-emailtext-user',
-               'passwordreset-emailelement',
-               'passwordreset-emailsent',
-               'passwordreset-emailsent-capture',
-               'passwordreset-emailerror-capture',
-       ),
-       'changeemail' => array(
-               'changeemail',
-               'changeemail-summary',
-               'changeemail-header',
-               'changeemail-text',
-               'changeemail-no-info',
-               'changeemail-oldemail',
-               'changeemail-newemail',
-               'changeemail-none',
-               'changeemail-password',
-               'changeemail-submit',
-               'changeemail-cancel',
-               'changeemail-throttled'
-       ),
-       'resettokens' => array(
-               'resettokens',
-               'resettokens-summary',
-               'resettokens-text',
-               'resettokens-no-tokens',
-               'resettokens-legend',
-               'resettokens-tokens',
-               'resettokens-token-label',
-               'resettokens-watchlist-token',
-               'resettokens-done',
-               'resettokens-resetbutton',
-       ),
-       'toolbar' => array(
-               'bold_sample',
-               'bold_tip',
-               'italic_sample',
-               'italic_tip',
-               'link_sample',
-               'link_tip',
-               'extlink_sample',
-               'extlink_tip',
-               'headline_sample',
-               'headline_tip',
-               'nowiki_sample',
-               'nowiki_tip',
-               'image_sample',
-               'image_tip',
-               'media_sample',
-               'media_tip',
-               'sig_tip',
-               'hr_tip',
-       ),
-       'edit' => array(
-               'summary',
-               'subject',
-               'minoredit',
-               'watchthis',
-               'savearticle',
-               'preview',
-               'showpreview',
-               'showlivepreview',
-               'showdiff',
-               'anoneditwarning',
-               'anonpreviewwarning',
-               'missingsummary',
-               'missingcommenttext',
-               'missingcommentheader',
-               'summary-preview',
-               'subject-preview',
-               'blockedtitle',
-               'blockedtext',
-               'autoblockedtext',
-               'blockednoreason',
-               'whitelistedittext',
-               'confirmedittext',
-               'nosuchsectiontitle',
-               'nosuchsectiontext',
-               'loginreqtitle',
-               'loginreqlink',
-               'loginreqpagetext',
-               'accmailtitle',
-               'accmailtext',
-               'newarticle',
-               'newarticletext',
-               'newarticletextanon',
-               'talkpagetext',
-               'anontalkpagetext',
-               'noarticletext',
-               'noarticletext-nopermission',
-               'noarticletextanon',
-               'missing-revision',
-               'userpage-userdoesnotexist',
-               'userpage-userdoesnotexist-view',
-               'blocked-notice-logextract',
-               'clearyourcache',
-               'usercssyoucanpreview',
-               'userjsyoucanpreview',
-               'usercsspreview',
-               'userjspreview',
-               'sitecsspreview',
-               'sitejspreview',
-               'userinvalidcssjstitle',
-               'updated',
-               'note',
-               'previewnote',
-               'continue-editing',
-               'previewconflict',
-               'session_fail_preview',
-               'session_fail_preview_html',
-               'token_suffix_mismatch',
-               'edit_form_incomplete',
-               'editing',
-               'creating',
-               'editingsection',
-               'editingcomment',
-               'editconflict',
-               'explainconflict',
-               'yourtext',
-               'storedversion',
-               'nonunicodebrowser',
-               'editingold',
-               'yourdiff',
-               'copyrightwarning',
-               'copyrightwarning2',
-               'editpage-head-copy-warn',
-               'editpage-tos-summary',
-               'longpage-hint',
-               'longpageerror',
-               'readonlywarning',
-               'protectedpagewarning',
-               'semiprotectedpagewarning',
-               'cascadeprotectedwarning',
-               'titleprotectedwarning',
-               'templatesused',
-               'templatesusedpreview',
-               'templatesusedsection',
-               'template-protected',
-               'template-semiprotected',
-               'hiddencategories',
-               'edittools',
-               'edittools-upload',
-               'nocreatetext',
-               'nocreate-loggedin',
-               'sectioneditnotsupported-title',
-               'sectioneditnotsupported-text',
-               'permissionserrors',
-               'permissionserrorstext',
-               'permissionserrorstext-withaction',
-               'recreate-moveddeleted-warn',
-               'moveddeleted-notice',
-               'log-fulllog',
-               'edit-hook-aborted',
-               'edit-gone-missing',
-               'edit-conflict',
-               'edit-no-change',
-               'postedit-confirmation',
-               'edit-already-exists',
-               'addsection-preload',
-               'addsection-editintro',
-               'defaultmessagetext',
-               'content-failed-to-parse',
-               'invalid-content-data',
-               'content-not-allowed-here',
-               'editwarning-warning',
-               'editpage-notsupportedcontentformat-title',
-               'editpage-notsupportedcontentformat-text',
-       ),
-       'contentmodels' => array(
-               'content-model-wikitext',
-               'content-model-text',
-               'content-model-javascript',
-               'content-model-css',
-       ),
-       'parserwarnings' => array(
-               'expensive-parserfunction-warning',
-               'expensive-parserfunction-category',
-               'post-expand-template-inclusion-warning',
-               'post-expand-template-inclusion-category',
-               'post-expand-template-argument-warning',
-               'post-expand-template-argument-category',
-               'parser-template-loop-warning',
-               'parser-template-recursion-depth-warning',
-               'language-converter-depth-warning',
-               'node-count-exceeded-category',
-               'node-count-exceeded-warning',
-               'expansion-depth-exceeded-category',
-               'expansion-depth-exceeded-warning',
-               'parser-unstrip-loop-warning',
-               'parser-unstrip-recursion-limit',
-               'converter-manual-rule-error',
-       ),
-       'undo' => array(
-               'undo-success',
-               'undo-failure',
-               'undo-norev',
-               'undo-nochange',
-               'undo-summary',
-               'undo-summary-username-hidden',
-       ),
-       'cantcreateaccount' => array(
-               'cantcreateaccounttitle',
-               'cantcreateaccount-text',
-               'cantcreateaccount-range-text',
-               'createaccount-hook-aborted',
-       ),
-       'history' => array(
-               'viewpagelogs',
-               'nohistory',
-               'currentrev',
-               'currentrev-asof',
-               'revisionasof',
-               'revision-info',
-               'revision-info-current',
-               'revision-nav',
-               'previousrevision',
-               'nextrevision',
-               'currentrevisionlink',
-               'cur',
-               'next',
-               'last',
-               'page_first',
-               'page_last',
-               'histlegend',
-               'history-fieldset-title',
-               'history-show-deleted',
-               'history_copyright',
-               'histfirst',
-               'histlast',
-               'historysize',
-               'historyempty',
-       ),
-       'history-feed' => array(
-               'history-feed-title',
-               'history-feed-description',
-               'history-feed-item-nocomment',
-               'history-feed-empty',
-       ),
-       'revdelete' => array(
-               'rev-deleted-comment',
-               'rev-deleted-user',
-               'rev-deleted-event',
-               'rev-deleted-user-contribs',
-               'rev-deleted-text-permission',
-               'rev-deleted-text-unhide',
-               'rev-suppressed-text-unhide',
-               'rev-deleted-text-view',
-               'rev-suppressed-text-view',
-               'rev-deleted-no-diff',
-               'rev-suppressed-no-diff',
-               'rev-deleted-unhide-diff',
-               'rev-suppressed-unhide-diff',
-               'rev-deleted-diff-view',
-               'rev-suppressed-diff-view',
-               'rev-delundel',
-               'rev-showdeleted',
-               'revisiondelete',
-               'revdelete-nooldid-title',
-               'revdelete-nooldid-text',
-               'revdelete-no-file',
-               'revdelete-show-file-confirm',
-               'revdelete-show-file-submit',
-               'revdelete-selected-text',
-               'revdelete-selected-file',
-               'logdelete-selected',
-               'revdelete-text-text',
-               'revdelete-text-file',
-               'logdelete-text',
-               'revdelete-text-others',
-               'revdelete-confirm',
-               'revdelete-suppress-text',
-               'revdelete-legend',
-               'revdelete-hide-text',
-               'revdelete-hide-image',
-               'revdelete-hide-name',
-               'revdelete-hide-comment',
-               'revdelete-hide-user',
-               'revdelete-hide-restricted',
-               'revdelete-radio-same',
-               'revdelete-radio-set',
-               'revdelete-radio-unset',
-               'revdelete-suppress',
-               'revdelete-unsuppress',
-               'revdelete-log',
-               'revdelete-submit',
-               'revdelete-success',
-               'revdelete-failure',
-               'logdelete-success',
-               'logdelete-failure',
-               'revdel-restore',
-               'pagehist',
-               'deletedhist',
-               'revdelete-hide-current',
-               'revdelete-show-no-access',
-               'revdelete-modify-no-access',
-               'revdelete-modify-missing',
-               'revdelete-no-change',
-               'revdelete-concurrent-change',
-               'revdelete-only-restricted',
-               'revdelete-reason-dropdown',
-               'revdelete-otherreason',
-               'revdelete-reasonotherlist',
-               'revdelete-edit-reasonlist',
-               'revdelete-offender',
-       ),
-       'suppression' => array(
-               'suppressionlog',
-               'suppressionlogtext',
-       ),
-       'mergehistory' => array(
-               'mergehistory',
-               'mergehistory-header',
-               'mergehistory-box',
-               'mergehistory-from',
-               'mergehistory-into',
-               'mergehistory-list',
-               'mergehistory-merge',
-               'mergehistory-go',
-               'mergehistory-submit',
-               'mergehistory-empty',
-               'mergehistory-success',
-               'mergehistory-fail',
-               'mergehistory-no-source',
-               'mergehistory-no-destination',
-               'mergehistory-invalid-source',
-               'mergehistory-invalid-destination',
-               'mergehistory-autocomment',
-               'mergehistory-comment',
-               'mergehistory-same-destination',
-               'mergehistory-reason',
-               'mergehistory-revisionrow'
-       ),
-       'mergelog' => array(
-               'mergelog',
-               'pagemerge-logentry',
-               'revertmerge',
-               'mergelogpagetext',
-       ),
-       'diffs' => array(
-               'history-title',
-               'difference-title',
-               'difference-title-multipage',
-               'difference-multipage',
-               'lineno',
-               'compareselectedversions',
-               'showhideselectedversions',
-               'editundo',
-               'diff-empty',
-               'diff-multi-sameuser',
-               'diff-multi-otherusers',
-               'diff-multi-manyusers',
-               'difference-missing-revision',
-       ),
-       'search' => array(
-               'search-summary',
-               'searchresults',
-               'searchresults-title',
-               'toomanymatches',
-               'titlematches',
-               'textmatches',
-               'notextmatches',
-               'prevn',
-               'nextn',
-               'prevn-title',
-               'nextn-title',
-               'shown-title',
-               'viewprevnext',
-               'searchmenu-exists',
-               'searchmenu-new',
-               'searchmenu-new-nocreate',
-               'searchprofile-articles',
-               'searchprofile-project',
-               'searchprofile-images',
-               'searchprofile-everything',
-               'searchprofile-advanced',
-               'searchprofile-articles-tooltip',
-               'searchprofile-project-tooltip',
-               'searchprofile-images-tooltip',
-               'searchprofile-everything-tooltip',
-               'searchprofile-advanced-tooltip',
-               'search-result-size',
-               'search-result-category-size',
-               'search-result-score',
-               'search-redirect',
-               'search-section',
-               'search-file-match',
-               'search-suggest',
-               'search-interwiki-caption',
-               'search-interwiki-default',
-               'search-interwiki-custom',
-               'search-interwiki-more',
-               'search-relatedarticle',
-               'searcheverything-enable',
-               'searchrelated',
-               'searchall',
-               'showingresults',
-               'showingresultsinrange',
-               'showingresultsnum',
-               'showingresultsheader',
-               'search-nonefound',
-               'powersearch-legend',
-               'powersearch-ns',
-               'powersearch-redir',
-               'powersearch-togglelabel',
-               'powersearch-toggleall',
-               'powersearch-togglenone',
-               'search-external',
-               'searchdisabled',
-               'googlesearch',
-               'search-error',
-       ),
-       'opensearch' => array(
-               'opensearch-desc',
-       ),
-       'preferences' => array(
-               'preferences',
-               'preferences-summary',
-               'mypreferences',
-               'prefs-edits',
-               'prefsnologintext2',
-               'prefs-skin',
-               'skin-preview',
-               'datedefault',
-               'prefs-datetime',
-               'prefs-labs',
-               'prefs-user-pages',
-               'prefs-personal',
-               'prefs-rc',
-               'prefs-watchlist',
-               'prefs-watchlist-days',
-               'prefs-watchlist-days-max',
-               'prefs-watchlist-edits',
-               'prefs-watchlist-edits-max',
-               'prefs-watchlist-token',
-               'prefs-misc', // continue checking if used from here on (r49916)
-               'prefs-resetpass',
-               'prefs-changeemail',
-               'prefs-setemail',
-               'prefs-email',
-               'prefs-rendering',
-               'saveprefs',
-               'restoreprefs',
-               'prefs-editing',
-               'rows',
-               'columns',
-               'searchresultshead',
-               'stub-threshold',
-               'stub-threshold-disabled',
-               'recentchangesdays',
-               'recentchangesdays-max',
-               'recentchangescount',
-               'prefs-help-recentchangescount',
-               'prefs-help-watchlist-token2',
-               'savedprefs',
-               'timezonelegend',
-               'localtime',
-               'timezoneuseserverdefault',
-               'timezoneuseoffset',
-               'servertime',
-               'guesstimezone',
-               'timezoneregion-africa',
-               'timezoneregion-america',
-               'timezoneregion-antarctica',
-               'timezoneregion-arctic',
-               'timezoneregion-asia',
-               'timezoneregion-atlantic',
-               'timezoneregion-australia',
-               'timezoneregion-europe',
-               'timezoneregion-indian',
-               'timezoneregion-pacific',
-               'allowemail',
-               'prefs-searchoptions',
-               'prefs-namespaces',
-               'defaultns',
-               'default',
-               'prefs-files',
-               'prefs-custom-css',
-               'prefs-custom-js',
-               'prefs-common-css-js',
-               'prefs-reset-intro',
-               'prefs-emailconfirm-label',
-               'youremail',
-               'username',
-               'uid',
-               'prefs-memberingroups',
-               'prefs-memberingroups-type',
-               'prefs-registration',
-               'prefs-registration-date-time',
-               'yourrealname',
-               'yourlanguage',
-               'yourvariant',
-               'prefs-help-variant',
-               'yournick',
-               'prefs-help-signature',
-               'badsig',
-               'badsiglength',
-               'yourgender',
-               'gender-unknown',
-               'gender-male',
-               'gender-female',
-               'prefs-help-gender',
-               'email',
-               'prefs-help-realname',
-
-               # 3 messages depending upon $wgEmailConfirmToEdit and $wgEnableUserEmail
-               'prefs-help-email',
-               'prefs-help-email-others',
-               'prefs-help-email-required',
-
-               'prefs-info',
-               'prefs-i18n',
-               'prefs-signature',
-               'prefs-dateformat',
-               'prefs-timeoffset',
-               'prefs-advancedediting',
-               'prefs-editor',
-               'prefs-preview',
-               'prefs-advancedrc',
-               'prefs-advancedrendering',
-               'prefs-advancedsearchoptions',
-               'prefs-advancedwatchlist',
-               'prefs-displayrc',
-               'prefs-displaysearchoptions',
-               'prefs-displaywatchlist',
-               'prefs-tokenwatchlist',
-               'prefs-diffs',
-               'prefs-help-prefershttps',
-               'prefs-tabs-navigation-hint',
-       ),
-       'preferences-email' => array(
-               'email-address-validity-valid',
-               'email-address-validity-invalid',
-       ),
-       'userrights' => array(
-               'userrights',
-               'userrights-summary',
-               'userrights-lookup-user',
-               'userrights-user-editname',
-               'editusergroup',
-               'editinguser',
-               'userrights-editusergroup',
-               'saveusergroups',
-               'userrights-groupsmember',
-               'userrights-groupsmember-auto',
-               'userrights-groupsmember-type',
-               'userrights-groups-help',
-               'userrights-reason',
-               'userrights-no-interwiki',
-               'userrights-nodatabase',
-               'userrights-nologin',
-               'userrights-notallowed',
-               'userrights-changeable-col',
-               'userrights-unchangeable-col',
-               'userrights-irreversible-marker',
-               'userrights-conflict',
-               'userrights-removed-self',
-       ),
-       'group' => array(
-               'group',
-               'group-user',
-               'group-autoconfirmed',
-               'group-bot',
-               'group-sysop',
-               'group-bureaucrat',
-               'group-suppress',
-               'group-all',
-       ),
-       'group-member' => array(
-               'group-user-member',
-               'group-autoconfirmed-member',
-               'group-bot-member',
-               'group-sysop-member',
-               'group-bureaucrat-member',
-               'group-suppress-member',
-       ),
-       'grouppage' => array(
-               'grouppage-user',
-               'grouppage-autoconfirmed',
-               'grouppage-bot',
-               'grouppage-sysop',
-               'grouppage-bureaucrat',
-               'grouppage-suppress',
-       ),
-       'right' => array(
-               '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',
-               'right-writeapi',
-               'right-delete',
-               'right-bigdelete',
-               'right-deletelogentry',
-               'right-deleterevision',
-               'right-deletedhistory',
-               'right-deletedtext',
-               'right-browsearchive',
-               'right-undelete',
-               'right-suppressrevision',
-               'right-suppressionlog',
-               'right-block',
-               'right-blockemail',
-               'right-hideuser',
-               'right-ipblock-exempt',
-               'right-proxyunbannable',
-               'right-unblockself',
-               'right-protect',
-               'right-editprotected',
-               'right-editsemiprotected',
-               'right-editinterface',
-               'right-editusercssjs',
-               'right-editusercss',
-               'right-edituserjs',
-               'right-editmyusercss',
-               'right-editmyuserjs',
-               'right-viewmywatchlist',
-               'right-editmywatchlist',
-               'right-viewmyprivateinfo',
-               'right-editmyprivateinfo',
-               'right-editmyoptions',
-               'right-rollback',
-               'right-markbotedits',
-               'right-noratelimit',
-               'right-import',
-               'right-importupload',
-               'right-patrol',
-               'right-autopatrol',
-               'right-patrolmarks',
-               'right-unwatchedpages',
-               'right-mergehistory',
-               'right-userrights',
-               'right-userrights-interwiki',
-               'right-siteadmin',
-               'right-override-export-depth',
-               'right-sendemail',
-               'right-passwordreset',
-       ),
-       'newuserlog' => array(
-               'newuserlogpage',
-               'newuserlogpagetext',
-       ),
-       'rightslog' => array(
-               'rightslog',
-               'rightslogtext',
-       ),
-       'action' => array(
-               'action-read',
-               'action-edit',
-               'action-createpage',
-               'action-createtalk',
-               'action-createaccount',
-               'action-minoredit',
-               'action-move',
-               'action-move-subpages',
-               'action-move-rootuserpages',
-               'action-movefile',
-               'action-upload',
-               'action-reupload',
-               'action-reupload-shared',
-               'action-upload_by_url',
-               'action-writeapi',
-               'action-delete',
-               'action-deleterevision',
-               'action-deletedhistory',
-               'action-browsearchive',
-               'action-undelete',
-               'action-suppressrevision',
-               'action-suppressionlog',
-               'action-block',
-               'action-protect',
-               'action-rollback',
-               'action-import',
-               'action-importupload',
-               'action-patrol',
-               'action-autopatrol',
-               'action-unwatchedpages',
-               'action-mergehistory',
-               'action-userrights',
-               'action-userrights-interwiki',
-               'action-siteadmin',
-               'action-sendemail',
-               'action-editmywatchlist',
-               'action-viewmywatchlist',
-               'action-viewmyprivateinfo',
-               'action-editmyprivateinfo',
-       ),
-       'recentchanges' => array(
-               'nchanges',
-               'enhancedrc-since-last-visit',
-               'enhancedrc-history',
-               'recentchanges',
-               'recentchanges-url',
-               'recentchanges-legend',
-               'recentchanges-summary',
-               'recentchangestext',
-               'recentchanges-noresult',
-               'recentchanges-feed-description',
-               'recentchanges-label-newpage',
-               'recentchanges-label-minor',
-               'recentchanges-label-bot',
-               'recentchanges-label-unpatrolled',
-               'recentchanges-label-plusminus',
-               'recentchanges-legend-heading',
-               'recentchanges-legend-newpage',
-               'recentchanges-legend-plusminus',
-               'rcnotefrom',
-               'rclistfrom',
-               'rcshowhideminor',
-               'rcshowhideminor-show',
-               'rcshowhideminor-hide',
-               'rcshowhidebots',
-               'rcshowhidebots-show',
-               'rcshowhidebots-hide',
-               'rcshowhideliu',
-               'rcshowhideliu-show',
-               'rcshowhideliu-hide',
-               'rcshowhideanons',
-               'rcshowhideanons-show',
-               'rcshowhideanons-hide',
-               'rcshowhidepatr',
-               'rcshowhidepatr-show',
-               'rcshowhidepatr-hide',
-               'rcshowhidemine',
-               'rcshowhidemine-show',
-               'rcshowhidemine-hide',
-               'rclinks',
-               'diff',
-               'hist',
-               'hide',
-               'show',
-               'minoreditletter',
-               'newpageletter',
-               'boteditletter',
-               'unpatrolledletter',
-               'number_of_watching_users_RCview',
-               'number_of_watching_users_pageview',
-               'rc_categories',
-               'rc_categories_any',
-               'rc-change-size',
-               'rc-change-size-new',
-               'newsectionsummary',
-               'rc-enhanced-expand',
-               'rc-enhanced-hide',
-               'rc-old-title',
-       ),
-       'recentchangeslinked' => array(
-               'recentchangeslinked',
-               'recentchangeslinked-feed',
-               'recentchangeslinked-toolbox',
-               'recentchangeslinked-title',
-               'recentchangeslinked-summary',
-               'recentchangeslinked-page',
-               'recentchangeslinked-to',
-       ),
-       'upload' => array(
-               'upload',
-               'uploadbtn',
-               'reuploaddesc',
-               'upload-tryagain',
-               'uploadnologin',
-               'uploadnologintext',
-               'upload_directory_missing',
-               'upload_directory_read_only',
-               'uploaderror',
-               'upload-summary',
-               'upload-recreate-warning',
-               'uploadtext',
-               'upload-permitted',
-               'upload-preferred',
-               'upload-prohibited',
-               'uploadfooter',
-               'upload-default-description',
-               'uploadlog',
-               'uploadlogpage',
-               'uploadlogpagetext',
-               'filename',
-               'filedesc',
-               'fileuploadsummary',
-               'filereuploadsummary',
-               'filestatus',
-               'filesource',
-               'uploadedfiles',
-               'ignorewarning',
-               'ignorewarnings',
-               'minlength1',
-               'illegalfilename',
-               'filename-toolong',
-               'badfilename',
-               'filetype-mime-mismatch',
-               'filetype-badmime',
-               'filetype-bad-ie-mime',
-               'filetype-unwanted-type',
-               'filetype-banned-type',
-               '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',
-               'largefileserver',
-               'emptyfile',
-               'windows-nonascii-filename',
-               'fileexists',
-               'filepageexists',
-               'fileexists-extension',
-               'fileexists-thumbnail-yes',
-               'file-thumbnail-no',
-               'fileexists-forbidden',
-               'fileexists-shared-forbidden',
-               'file-exists-duplicate',
-               'file-deleted-duplicate',
-               'file-deleted-duplicate-notitle',
-               'uploadwarning',
-               'uploadwarning-text',
-               'savefile',
-               'uploadedimage',
-               'overwroteimage',
-               'uploaddisabled',
-               'copyuploaddisabled',
-               'uploadfromurl-queued',
-               'uploaddisabledtext',
-               'php-uploaddisabledtext',
-               'uploadscripted',
-               'uploadscriptednamespace',
-               'uploadinvalidxml',
-               'uploadvirus',
-               'uploadjava',
-               'upload-source',
-               'sourcefilename',
-               'sourceurl',
-               'destfilename',
-               'upload-maxfilesize',
-               'upload-description',
-               'upload-options',
-               'watchthisupload',
-               'filewasdeleted',
-               'filename-bad-prefix',
-               'filename-prefix-blacklist',
-               'upload-success-subj',
-               'upload-success-msg',
-               'upload-failure-subj',
-               'upload-failure-msg',
-               'upload-warning-subj',
-               'upload-warning-msg',
-       ),
-       'upload-errors' => array(
-               'upload-proto-error',
-               'upload-proto-error-text',
-               'upload-file-error',
-               'upload-file-error-text',
-               'upload-misc-error',
-               'upload-misc-error-text',
-               'upload-too-many-redirects',
-               'upload-unknown-size',
-               'upload-http-error',
-               'upload-copy-upload-invalid-domain',
-       ),
-
-       'filebackend-errors' => array(
-               'backend-fail-stream',
-               'backend-fail-backup',
-               'backend-fail-notexists',
-               'backend-fail-hashes',
-               'backend-fail-notsame',
-               'backend-fail-invalidpath',
-               'backend-fail-delete',
-               'backend-fail-describe',
-               'backend-fail-alreadyexists',
-               'backend-fail-store',
-               'backend-fail-copy',
-               'backend-fail-move',
-               'backend-fail-opentemp',
-               'backend-fail-writetemp',
-               'backend-fail-closetemp',
-               'backend-fail-read',
-               'backend-fail-create',
-               'backend-fail-maxsize',
-               'backend-fail-readonly',
-               'backend-fail-synced',
-               'backend-fail-connect',
-               'backend-fail-internal',
-               'backend-fail-contenttype',
-               'backend-fail-batchsize',
-               'backend-fail-usable'
-       ),
-
-       'filejournal-errors' => array(
-               'filejournal-fail-dbconnect',
-               'filejournal-fail-dbquery'
-       ),
-
-       'lockmanager-errors' => array(
-               'lockmanager-notlocked',
-               'lockmanager-fail-closelock',
-               'lockmanager-fail-deletelock',
-               'lockmanager-fail-acquirelock',
-               'lockmanager-fail-openlock',
-               'lockmanager-fail-releaselock',
-               'lockmanager-fail-db-bucket',
-               'lockmanager-fail-db-release',
-               'lockmanager-fail-svr-acquire',
-               'lockmanager-fail-svr-release'
-       ),
-
-       'zip' => array(
-               'zip-file-open-error',
-               'zip-wrong-format',
-               'zip-bad',
-               'zip-unsupported'
-       ),
-
-       'uploadstash' => array(
-               'uploadstash',
-               'uploadstash-summary',
-               'uploadstash-clear',
-               'uploadstash-nofiles',
-               'uploadstash-badtoken',
-               'uploadstash-errclear',
-               'uploadstash-refresh',
-               'invalid-chunk-offset',
-       ),
-
-       'img-auth' => array(
-               'img-auth-accessdenied',
-               'img-auth-desc',
-               'img-auth-nopathinfo',
-               'img-auth-notindir',
-               'img-auth-badtitle',
-               'img-auth-nologinnWL',
-               'img-auth-nofile',
-               'img-auth-isdir',
-               'img-auth-streaming',
-               'img-auth-public',
-               'img-auth-noread',
-               'img-auth-bad-query-string',
-       ),
-
-       'http-errors' => array(
-               'http-invalid-url',
-               'http-invalid-scheme',
-               'http-request-error',
-               'http-read-error',
-               'http-timed-out',
-               'http-curl-error',
-               'http-bad-status',
-       ),
-
-       'upload-curl-errors' => array(
-               'upload-curl-error6',
-               'upload-curl-error6-text',
-               'upload-curl-error28',
-               'upload-curl-error28-text',
-       ),
-       'licenses' => array(
-               'license',
-               'license-header',
-               'nolicense',
-               'licenses',
-               'license-nopreview',
-               'upload_source_url',
-               'upload_source_file',
-       ),
-       'filelist' => array(
-               'listfiles-summary',
-               'listfiles_search_for',
-               'imgfile',
-               'listfiles',
-               'listfiles_thumb',
-               'listfiles_date',
-               'listfiles_name',
-               'listfiles_user',
-               'listfiles_size',
-               'listfiles_description',
-               'listfiles_count',
-               'listfiles-show-all',
-               'listfiles-latestversion',
-               'listfiles-latestversion-yes',
-               'listfiles-latestversion-no',
-       ),
-       'filedescription' => array(
-               'file-anchor-link',
-               'filehist',
-               'filehist-help',
-               'filehist-deleteall',
-               'filehist-deleteone',
-               'filehist-revert',
-               'filehist-current',
-               'filehist-datetime',
-               'filehist-thumb',
-               'filehist-thumbtext',
-               'filehist-nothumb',
-               'filehist-user',
-               'filehist-dimensions',
-               'filehist-filesize',
-               'filehist-comment',
-               'filehist-missing',
-               'imagelinks',
-               'linkstoimage',
-               'linkstoimage-more',
-               'nolinkstoimage',
-               'morelinkstoimage',
-               'linkstoimage-redirect',
-               'duplicatesoffile',
-               'sharedupload',
-               'sharedupload-desc-there',
-               'sharedupload-desc-here',
-               'sharedupload-desc-edit',
-               'sharedupload-desc-create',
-               'shareddescriptionfollows',
-               'filepage-nofile',
-               'filepage-nofile-link',
-               'uploadnewversion-linktext',
-               'shared-repo-from',
-               'shared-repo',
-               'shared-repo-name-wikimediacommons',
-               'filepage.css',
-               'upload-disallowed-here',
-       ),
-       'filerevert' => array(
-               'filerevert',
-               'filerevert-legend',
-               'filerevert-intro',
-               'filerevert-comment',
-               'filerevert-defaultcomment',
-               'filerevert-submit',
-               'filerevert-success',
-               'filerevert-badversion',
-       ),
-       'filedelete' => array(
-               'filedelete',
-               'filedelete-legend',
-               'filedelete-intro',
-               'filedelete-intro-old',
-               'filedelete-comment',
-               'filedelete-submit',
-               'filedelete-success',
-               'filedelete-success-old',
-               'filedelete-nofile',
-               'filedelete-nofile-old',
-               'filedelete-otherreason',
-               'filedelete-reason-otherlist',
-               'filedelete-reason-dropdown',
-               'filedelete-edit-reasonlist',
-               'filedelete-maintenance',
-               'filedelete-maintenance-title',
-       ),
-       'mimesearch' => array(
-               'mimesearch',
-               'mimesearch-summary',
-               'mimetype',
-               'download',
-       ),
-       'unwatchedpages' => array(
-               'unwatchedpages',
-               'unwatchedpages-summary',
-       ),
-       'listredirects' => array(
-               'listredirects',
-               'listredirects-summary',
-       ),
-       'listduplicatedfiles' => array(
-               'listduplicatedfiles',
-               'listduplicatedfiles-summary',
-               'listduplicatedfiles-entry',
-       ),
-       'unusedtemplates' => array(
-               'unusedtemplates',
-               'unusedtemplates-summary',
-               'unusedtemplatestext',
-               'unusedtemplateswlh',
-       ),
-       'randompage' => array(
-               'randompage',
-               'randompage-nopages',
-               'randompage-url',
-       ),
-       'randomincategory' => array(
-               'randomincategory',
-               'randomincategory-invalidcategory',
-               'randomincategory-nopages',
-               'randomincategory-selectcategory',
-               'randomincategory-selectcategory-submit',
-       ),
-       'randomredirect' => array(
-               'randomredirect',
-               'randomredirect-nopages',
-       ),
-       'statistics' => array(
-               'statistics',
-               'statistics-summary',
-               'statistics-header-pages',
-               'statistics-header-edits',
-               'statistics-header-views',
-               'statistics-header-users',
-               'statistics-header-hooks',
-               'statistics-articles',
-               'statistics-pages',
-               'statistics-pages-desc',
-               'statistics-files',
-               'statistics-edits',
-               'statistics-edits-average',
-               'statistics-views-total',
-               'statistics-views-total-desc',
-               'statistics-views-peredit',
-               'statistics-users',
-               'statistics-users-active',
-               'statistics-users-active-desc',
-               'statistics-mostpopular',
-               'statistics-footer',
-       ),
-       'pageswithprop' => array(
-               'pageswithprop',
-               'pageswithprop-summary',
-               'pageswithprop-legend',
-               'pageswithprop-text',
-               'pageswithprop-prop',
-               'pageswithprop-submit',
-               'pageswithprop-prophidden-long',
-               'pageswithprop-prophidden-binary',
-       ),
-       'doubleredirects' => array(
-               'doubleredirects',
-               'doubleredirects-summary',
-               'doubleredirectstext',
-               'double-redirect-fixed-move',
-               'double-redirect-fixed-maintenance',
-               'double-redirect-fixer',
-       ),
-       'brokenredirects' => array(
-               'brokenredirects',
-               'brokenredirects-summary',
-               'brokenredirectstext',
-               'brokenredirects-edit',
-               'brokenredirects-delete',
-       ),
-       'withoutinterwiki' => array(
-               'withoutinterwiki',
-               'withoutinterwiki-summary',
-               'withoutinterwiki-legend',
-               'withoutinterwiki-submit',
-       ),
-       'fewestrevisions' => array(
-               'fewestrevisions',
-               'fewestrevisions-summary',
-       ),
-       'specialpages' => array(
-               'nbytes',
-               'ncategories',
-               'ninterwikis',
-               'nlinks',
-               'nmembers',
-               'nmemberschanged',
-               'nrevisions',
-               'nviews',
-               'nimagelinks',
-               'ntransclusions',
-               'specialpage-empty',
-               'lonelypages',
-               'lonelypages-summary',
-               'lonelypagestext',
-               'uncategorizedpages',
-               'uncategorizedpages-summary',
-               'uncategorizedcategories',
-               'uncategorizedcategories-summary',
-               'uncategorizedimages',
-               'uncategorizedimages-summary',
-               'uncategorizedtemplates',
-               'uncategorizedtemplates-summary',
-               'unusedcategories',
-               'unusedcategories-summary',
-               'unusedimages',
-               'unusedimages-summary',
-               'popularpages',
-               'popularpages-summary',
-               'wantedcategories',
-               'wantedcategories-summary',
-               'wantedpages',
-               'wantedpages-summary',
-               'wantedpages-badtitle',
-               'wantedfiles',
-               'wantedfiles-summary',
-               'wantedfiletext-cat',
-               'wantedfiletext-nocat',
-               'wantedtemplates',
-               'wantedtemplates-summary',
-               'mostlinked',
-               'mostlinked-summary',
-               'mostlinkedcategories',
-               'mostlinkedcategories-summary',
-               'mostlinkedtemplates',
-               'mostlinkedtemplates-summary',
-               'mostcategories',
-               'mostcategories-summary',
-               'mostimages',
-               'mostimages-summary',
-               'mostinterwikis',
-               'mostinterwikis-summary',
-               'mostrevisions',
-               'mostrevisions-summary',
-               'prefixindex',
-               'prefixindex-namespace',
-               'prefixindex-summary',
-               'prefixindex-strip',
-               'shortpages',
-               'shortpages-summary',
-               'longpages',
-               'longpages-summary',
-               'deadendpages',
-               'deadendpages-summary',
-               'deadendpagestext',
-               'protectedpages',
-               'protectedpages-indef',
-               'protectedpages-summary',
-               'protectedpages-cascade',
-               'protectedpages-noredirect',
-               'protectedpagesempty',
-               'protectedpages-timestamp',
-               'protectedpages-page',
-               'protectedpages-expiry',
-               'protectedpages-performer',
-               'protectedpages-params',
-               'protectedpages-reason',
-               'protectedpages-unknown-timestamp',
-               'protectedpages-unknown-performer',
-               'protectedpages-unknown-reason',
-               'protectedtitles',
-               'protectedtitles-summary',
-               'protectedtitlesempty',
-               'listusers',
-               'listusers-summary',
-               'listusers-editsonly',
-               'listusers-creationsort',
-               'listusers-desc',
-               'usereditcount',
-               'usercreated',
-               'newpages',
-               'newpages-summary',
-               'newpages-username',
-               'ancientpages',
-               'ancientpages-summary',
-               'move',
-               'movethispage',
-               'unusedimagestext',
-               'unusedcategoriestext',
-               'notargettitle',
-               'notargettext',
-               'nopagetitle',
-               'nopagetext',
-               'pager-newer-n',
-               'pager-older-n',
-               'suppress',
-               'querypage-disabled',
-       ),
-       'booksources' => array(
-               'booksources',
-               'booksources-summary',
-               'booksources-search-legend',
-               'booksources-isbn',
-               'booksources-go',
-               'booksources-text',
-               'booksources-invalid-isbn',
-       ),
-       'magicwords' => array(
-               'rfcurl',
-               'pubmedurl',
-       ),
-       'logpages' => array(
-               'specialloguserlabel',
-               'speciallogtitlelabel',
-               'log',
-               'all-logs-page',
-               'alllogstext',
-               'logempty',
-               'log-title-wildcard',
-               'showhideselectedlogentries',
-       ),
-       'allpages' => array(
-               'allpages',
-               'allpages-summary',
-               'alphaindexline',
-               'nextpage',
-               'prevpage',
-               'allpagesfrom',
-               'allpagesto',
-               'allarticles',
-               'allinnamespace',
-               'allpagessubmit',
-               'allpagesprefix',
-               'allpagesbadtitle',
-               'allpages-bad-ns',
-               'allpages-hide-redirects',
-       ),
-       'cachedspecial' => array(
-               'cachedspecial-viewing-cached-ttl',
-               'cachedspecial-viewing-cached-ts',
-               'cachedspecial-refresh-now',
-       ),
-       'categories' => array(
-               'categories',
-               'categories-summary',
-               'categoriespagetext',
-               'categoriesfrom',
-               'special-categories-sort-count',
-               'special-categories-sort-abc',
-       ),
-       'deletedcontribs' => array(
-               'deletedcontributions',
-               'deletedcontributions-summary',
-               'deletedcontributions-title',
-               'sp-deletedcontributions-contribs',
-       ),
-       'linksearch' => array(
-               'linksearch',
-               'linksearch-summary',
-               'linksearch-pat',
-               'linksearch-ns',
-               'linksearch-ok',
-               'linksearch-text',
-               'linksearch-line',
-               'linksearch-error',
-       ),
-       'listusers' => array(
-               'listusersfrom',
-               'listusers-submit',
-               'listusers-noresult',
-               'listusers-blocked',
-       ),
-       'activeusers' => array(
-               'activeusers',
-               'activeusers-summary',
-               'activeusers-intro',
-               'activeusers-count',
-               'activeusers-from',
-               'activeusers-hidebots',
-               'activeusers-hidesysops',
-               'activeusers-submit',
-               'activeusers-noresult',
-       ),
-       'listgrouprights' => array(
-               'listgrouprights',
-               'listgrouprights-summary',
-               'listgrouprights-key',
-               'listgrouprights-group',
-               'listgrouprights-rights',
-               'listgrouprights-helppage',
-               'listgrouprights-members',
-               'listgrouprights-right-display',
-               'listgrouprights-right-revoked',
-               'listgrouprights-addgroup',
-               'listgrouprights-removegroup',
-               'listgrouprights-addgroup-all',
-               'listgrouprights-removegroup-all',
-               'listgrouprights-addgroup-self',
-               'listgrouprights-removegroup-self',
-               'listgrouprights-addgroup-self-all',
-               'listgrouprights-removegroup-self-all',
-
-       ),
-       'emailuser' => array(
-               'mailnologin',
-               'mailnologintext',
-               'emailuser',
-               'emailuser-title-target',
-               'emailuser-title-notarget',
-               'emailuser-summary',
-               'emailpage',
-               'emailpagetext',
-               'usermailererror',
-               'defemailsubject',
-               'usermaildisabled',
-               'usermaildisabledtext',
-               'noemailtitle',
-               'noemailtext',
-               'nowikiemailtitle',
-               'nowikiemailtext',
-               'emailnotarget',
-               'emailtarget',
-               'emailusername',
-               'emailusernamesubmit',
-               'email-legend',
-               'emailfrom',
-               'emailto',
-               'emailsubject',
-               'emailmessage',
-               'emailsend',
-               'emailccme',
-               'emailccsubject',
-               'emailsent',
-               'emailsenttext',
-               'emailuserfooter',
-       ),
-       'usermessage' => array(
-               'usermessage-summary',
-               'usermessage-editor',
-               'usermessage-template',
-       ),
-       'watchlist' => array(
-               'watchlist',
-               'watchlist-summary',
-               'mywatchlist',
-               'watchlistfor2',
-               'nowatchlist',
-               'watchlistanontext',
-               'watchnologin',
-               'watchnologintext',
-               'addwatch',
-               'addedwatchtext',
-               'removewatch',
-               'removedwatchtext',
-               'watch',
-               'watchthispage',
-               'unwatch',
-               'unwatchthispage',
-               'notanarticle',
-               'notvisiblerev',
-               'watchlist-details',
-               'wlheader-enotif',
-               'wlheader-showupdated',
-               'watchmethod-recent',
-               'watchmethod-list',
-               'watchlistcontains',
-               'iteminvalidname',
-               'wlnote2',
-               'wlshowlast',
-               'watchlist-options',
-       ),
-       'watching' => array(
-               'watching',
-               'unwatching',
-               'watcherrortext',
-       ),
-       'enotif' => array(
-               'enotif_mailer',
-               'enotif_reset',
-               'enotif_impersonal_salutation',
-               'enotif_subject_deleted',
-               'enotif_subject_created',
-               'enotif_subject_moved',
-               'enotif_subject_restored',
-               'enotif_subject_changed',
-               'enotif_body_intro_deleted',
-               'enotif_body_intro_created',
-               'enotif_body_intro_moved',
-               'enotif_body_intro_restored',
-               'enotif_body_intro_changed',
-               'enotif_lastvisited',
-               'enotif_lastdiff',
-               'enotif_anon_editor',
-               'enotif_body',
-               'created',
-               'changed',
-       ),
-       'delete' => array(
-               'deletepage',
-               'confirm',
-               'excontent',
-               'excontentauthor',
-               'exbeforeblank',
-               'exblank',
-               'delete-confirm',
-               'delete-legend',
-               'historywarning',
-               'confirmdeletetext',
-               'actioncomplete',
-               'actionfailed',
-               'deletedtext',
-               'dellogpage',
-               'dellogpagetext',
-               'deletionlog',
-               'reverted',
-               'deletecomment',
-               'deleteotherreason',
-               'deletereasonotherlist',
-               'deletereason-dropdown',
-               'delete-edit-reasonlist',
-               'delete-toobig',
-               'delete-warning-toobig',
-               'deleting-backlinks-warning',
-       ),
-       'rollback' => array(
-               'rollback',
-               'rollback_short',
-               'rollbacklink',
-               'rollbacklinkcount',
-               'rollbacklinkcount-morethan',
-               'rollbackfailed',
-               'cantrollback',
-               'alreadyrolled',
-               'editcomment',
-               'revertpage',
-               'revertpage-nouser',
-               'rollback-success',
-       ),
-       'edittokens' => array(
-               'sessionfailure-title',
-               'sessionfailure',
-       ),
-       'protect' => array(
-               'protectlogpage',
-               'protectlogtext',
-               'protectedarticle',
-               'modifiedarticleprotection',
-               'unprotectedarticle',
-               'movedarticleprotection',
-               'protect-title',
-               'protect-title-notallowed',
-               'prot_1movedto2',
-               'protect-badnamespace-title',
-               'protect-badnamespace-text',
-               'protect-norestrictiontypes-text',
-               'protect-norestrictiontypes-title',
-               'protect-legend',
-               'protectcomment',
-               'protectexpiry',
-               'protect_expiry_invalid',
-               'protect_expiry_old',
-               'protect-unchain-permissions',
-               'protect-text',
-               'protect-locked-blocked',
-               'protect-locked-dblock',
-               'protect-locked-access',
-               'protect-cascadeon',
-               'protect-default',
-               'protect-fallback',
-               'protect-level-autoconfirmed',
-               'protect-level-sysop',
-               'protect-summary-desc',
-               'protect-summary-cascade',
-               'protect-expiring',
-               'protect-expiring-local',
-               'protect-expiry-indefinite',
-               'protect-cascade',
-               'protect-cantedit',
-               'protect-othertime',
-               'protect-othertime-op',
-               'protect-existing-expiry',
-               'protect-otherreason',
-               'protect-otherreason-op',
-               'protect-dropdown',
-               'protect-edit-reasonlist',
-               'protect-expiry-options',
-               'restriction-type',
-               'restriction-level',
-               'minimum-size',
-               'maximum-size',
-               'pagesize',
-       ),
-       'restrictions' => array(
-               'restriction-edit',
-               'restriction-move',
-               'restriction-create',
-               'restriction-upload',
-       ),
-       'restriction-levels' => array(
-               'restriction-level-sysop',
-               'restriction-level-autoconfirmed',
-               'restriction-level-all',
-       ),
-       'undelete' => array(
-               'undelete',
-               'undelete-summary',
-               'undeletepage',
-               'undeletepagetitle',
-               'viewdeletedpage',
-               'undeletepagetext',
-               'undelete-fieldset-title',
-               'undeleteextrahelp',
-               'undeleterevisions',
-               'undeletehistory',
-               'undeleterevdel',
-               'undeletehistorynoadmin',
-               'undelete-revision',
-               'undeleterevision-missing',
-               'undelete-nodiff',
-               'undeletebtn',
-               'undeletelink',
-               'undeleteviewlink',
-               'undeleteinvert',
-               'undeletecomment',
-               'undeletedrevisions',
-               'undeletedrevisions-files',
-               'undeletedfiles',
-               'cannotundelete',
-               'undeletedpage',
-               'undelete-header',
-               'undelete-search-title',
-               'undelete-search-box',
-               'undelete-search-prefix',
-               'undelete-search-submit',
-               'undelete-no-results',
-               'undelete-filename-mismatch',
-               'undelete-bad-store-key',
-               'undelete-cleanup-error',
-               'undelete-missing-filearchive',
-               'undelete-error',
-               'undelete-error-short',
-               'undelete-error-long',
-               'undelete-show-file-confirm',
-               'undelete-show-file-submit',
-               'undelete-revision-row',
-       ),
-       'nsform' => array(
-               'namespace',
-               'invert',
-               'tooltip-invert',
-               'namespace_association',
-               'tooltip-namespace_association',
-               'blanknamespace',
-       ),
-       'contributions' => array(
-               'contributions',
-               'contributions-summary',
-               'contributions-title',
-               'mycontris',
-               'contribsub2',
-               'nocontribs',
-               'uctop',
-               'month',
-               'year',
-       ),
-       'sp-contributions' => array(
-               'sp-contributions-newbies',
-               'sp-contributions-newbies-sub',
-               'sp-contributions-newbies-title',
-               'sp-contributions-blocklog',
-               'sp-contributions-deleted',
-               'sp-contributions-uploads',
-               'sp-contributions-logs',
-               'sp-contributions-talk',
-               'sp-contributions-userrights',
-               'sp-contributions-blocked-notice',
-               'sp-contributions-blocked-notice-anon',
-               'sp-contributions-search',
-               'sp-contributions-suppresslog',
-               'sp-contributions-username',
-               'sp-contributions-toponly',
-               'sp-contributions-newonly',
-               'sp-contributions-submit',
-               'sp-contributions-explain',
-               'sp-contributions-footer',
-               'sp-contributions-footer-anon',
-               'sp-contributions-footer-newbies',
-       ),
-       'whatlinkshere' => array(
-               'whatlinkshere',
-               'whatlinkshere-title',
-               'whatlinkshere-summary',
-               'whatlinkshere-page',
-               'linkshere',
-               'nolinkshere',
-               'nolinkshere-ns',
-               'isredirect',
-               'istemplate',
-               'isimage',
-               'whatlinkshere-prev',
-               'whatlinkshere-next',
-               'whatlinkshere-links',
-               'whatlinkshere-hideredirs',
-               'whatlinkshere-hidetrans',
-               'whatlinkshere-hidelinks',
-               'whatlinkshere-hideimages',
-               'whatlinkshere-filters',
-       ),
-       'block' => array(
-               'autoblockid',
-               'block',
-               'unblock',
-               'unblock-summary',
-               'blockip',
-               'blockip-legend',
-               'blockiptext',
-               'ipadressorusername',
-               'ipbexpiry',
-               'ipbreason',
-               'ipbreason-dropdown',
-               'ipb-hardblock',
-               'ipbcreateaccount',
-               'ipbemailban',
-               'ipbenableautoblock',
-               'ipbsubmit',
-               'ipbother',
-               'ipboptions',
-               'ipbhidename',
-               'ipbwatchuser',
-               'ipb-disableusertalk',
-               'ipb-change-block',
-               'ipb-confirm',
-               'badipaddress',
-               'blockipsuccesssub',
-               'blockipsuccesstext',
-               'ipb-blockingself',
-               'ipb-confirmhideuser',
-               'ipb-confirmaction',
-               'ipb-edit-dropdown',
-               'ipb-unblock-addr',
-               'ipb-unblock',
-               'ipb-blocklist',
-               'ipb-blocklist-contribs',
-               'unblockip',
-               'unblockiptext',
-               'ipusubmit',
-               'unblocked',
-               'unblocked-range',
-               'unblocked-id',
-               'blocklist',
-               'ipblocklist',
-               'ipblocklist-legend',
-               'blocklist-userblocks',
-               'blocklist-tempblocks',
-               'blocklist-addressblocks',
-               'blocklist-rangeblocks',
-               'blocklist-timestamp',
-               'blocklist-target',
-               'blocklist-expiry',
-               'blocklist-by',
-               'blocklist-params',
-               'blocklist-reason',
-               'blocklist-summary',
-               'ipblocklist-submit',
-               'ipblocklist-localblock',
-               'ipblocklist-otherblocks',
-
-               'infiniteblock',
-               'expiringblock',
-               'anononlyblock',
-               'noautoblockblock',
-               'createaccountblock',
-               'emailblock',
-               'blocklist-nousertalk',
-               'ipblocklist-empty',
-               'ipblocklist-no-results',
-               'blocklink',
-               'unblocklink',
-               'change-blocklink',
-               'contribslink',
-               'emaillink',
-               'autoblocker',
-               'blocklogpage',
-               'blocklog-showlog',
-               'blocklog-showsuppresslog',
-               'blocklogentry',
-               'reblock-logentry',
-               'blocklogtext',
-               'unblocklogentry',
-               'block-log-flags-anononly',
-               'block-log-flags-nocreate',
-               'block-log-flags-noautoblock',
-               'block-log-flags-noemail',
-               'block-log-flags-nousertalk',
-               'block-log-flags-angry-autoblock',
-               'block-log-flags-hiddenname',
-               'range_block_disabled',
-               'ipb_expiry_invalid',
-               'ipb_expiry_temp',
-               'ipb_hide_invalid',
-               'ipb_already_blocked',
-               'ipb-needreblock',
-               'ipb-otherblocks-header',
-               'unblock-hideuser',
-               'ipb_cant_unblock',
-               'ipb_blocked_as_range',
-               'ip_range_invalid',
-               'ip_range_toolarge',
-               'proxyblocker',
-               'proxyblockreason',
-               'sorbs',
-               'sorbsreason',
-               'sorbs_create_account_reason',
-               'xffblockreason',
-               'cant-see-hidden-user',
-               'ipbblocked',
-               'ipbnounblockself',
-               'ipb-default-expiry',
-       ),
-       'developertools' => array(
-               'lockdb',
-               'unlockdb',
-               'lockdbtext',
-               'unlockdbtext',
-               'lockconfirm',
-               'unlockconfirm',
-               'lockbtn',
-               'unlockbtn',
-               'locknoconfirm',
-               'lockdbsuccesssub',
-               'unlockdbsuccesssub',
-               'lockdbsuccesstext',
-               'unlockdbsuccesstext',
-               'lockfilenotwritable',
-               'databasenotlocked',
-               'lockedbyandtime',
-       ),
-       'movepage' => array(
-               'move-page',
-               'movepage-summary',
-               'move-page-legend',
-               'movepagetext',
-               'movepagetext-noredirectfixer',
-               'movepagetalktext',
-               'movearticle',
-               'moveuserpage-warning',
-               'movenologintext',
-               'movenotallowed',
-               'movenotallowedfile',
-               'cant-move-user-page',
-               'cant-move-to-user-page',
-               'newtitle',
-               'move-watch',
-               'movepagebtn',
-               'pagemovedsub',
-               'movepage-moved',
-               'movepage-moved-redirect',
-               'movepage-moved-noredirect',
-               'articleexists',
-               'cantmove-titleprotected',
-               'movetalk',
-               'move-subpages',
-               'move-talk-subpages',
-               'movepage-page-exists',
-               'movepage-page-moved',
-               'movepage-page-unmoved',
-               'movepage-max-pages',
-               'movelogpage',
-               'movelogpagetext',
-               'movesubpage',
-               'movesubpagetext',
-               'movenosubpage',
-               'movereason',
-               'move-redirect-text',
-               'revertmove',
-               'delete_and_move',
-               'delete_and_move_text',
-               'delete_and_move_confirm',
-               'delete_and_move_reason',
-               'selfmove',
-               'immobile-source-namespace',
-               'immobile-target-namespace',
-               'immobile-target-namespace-iw',
-               'immobile-source-page',
-               'immobile-target-page',
-               'bad-target-model',
-               'immobile_namespace',
-               'imagenocrossnamespace',
-               'nonfile-cannot-move-to-file',
-               'imagetypemismatch',
-               'imageinvalidfilename',
-               'fix-double-redirects',
-               'move-leave-redirect',
-               'protectedpagemovewarning',
-               'semiprotectedpagemovewarning',
-               'move-over-sharedrepo',
-               'file-exists-sharedrepo',
-       ),
-       'export' => array(
-               'export',
-               'export-summary',
-               'exporttext',
-               'exportall',
-               'exportcuronly',
-               'exportnohistory',
-               'exportlistauthors',
-               'export-submit',
-               'export-addcattext',
-               'export-addcat',
-               'export-addnstext',
-               'export-addns',
-               'export-download',
-               'export-templates',
-               'export-pagelinks',
-       ),
-       'allmessages' => array(
-               'allmessages',
-               'allmessagesname',
-               'allmessagesdefault',
-               'allmessagescurrent',
-               'allmessagestext',
-               'allmessagesnotsupportedDB',
-               'allmessages-filter-legend',
-               'allmessages-filter',
-               'allmessages-filter-unmodified',
-               'allmessages-filter-all',
-               'allmessages-filter-modified',
-               'allmessages-prefix',
-               'allmessages-language',
-               'allmessages-filter-submit',
-               'allmessages-filter-translate',
-       ),
-       'thumbnails' => array(
-               'thumbnail-more',
-               'filemissing',
-               'thumbnail_error',
-               'thumbnail_error_remote',
-               'djvu_page_error',
-               'djvu_no_xml',
-               'thumbnail-temp-create',
-               'thumbnail-dest-create',
-               'thumbnail_invalid_params',
-               'thumbnail_dest_directory',
-               'thumbnail_image-type',
-               'thumbnail_gd-library',
-               'thumbnail_image-missing',
-               'thumbnail_image-failure-limit'
-       ),
-       'import' => array(
-               'import',
-               'import-summary',
-               'importinterwiki',
-               'import-interwiki-text',
-               'import-interwiki-source',
-               'import-interwiki-history',
-               'import-interwiki-templates',
-               'import-interwiki-submit',
-               'import-interwiki-namespace',
-               'import-interwiki-rootpage',
-               'import-upload-filename',
-               'import-comment',
-               'importtext',
-               'importstart',
-               'import-revision-count',
-               'importnopages',
-               'imported-log-entries',
-               'importfailed',
-               'importunknownsource',
-               'importcantopen',
-               'importbadinterwiki',
-               'importnotext',
-               'importsuccess',
-               'importhistoryconflict',
-               'importnosources',
-               'importnofile',
-               'importuploaderrorsize',
-               'importuploaderrorpartial',
-               'importuploaderrortemp',
-               'import-parse-failure',
-               'import-noarticle',
-               'import-nonewrevisions',
-               'xml-error-string',
-               'import-upload',
-               'import-token-mismatch',
-               'import-invalid-interwiki',
-               'import-error-edit',
-               'import-error-create',
-               'import-error-interwiki',
-               'import-error-special',
-               'import-error-invalid',
-               'import-error-unserialize',
-               'import-error-bad-location',
-               'import-options-wrong',
-               'import-rootpage-invalid',
-               'import-rootpage-nosubpage',
-       ),
-       'importlog' => array(
-               'importlogpage',
-               'importlogpagetext',
-               'import-logentry-upload',
-               'import-logentry-upload-detail',
-               'import-logentry-interwiki',
-               'import-logentry-interwiki-detail',
-       ),
-       'javaccripttest' => array(
-               'javascripttest',
-               'javascripttest-backlink',
-               'javascripttest-title',
-               'javascripttest-pagetext-noframework',
-               'javascripttest-pagetext-unknownframework',
-               'javascripttest-pagetext-frameworks',
-               'javascripttest-pagetext-skins',
-               'javascripttest-qunit-name',
-               'javascripttest-qunit-intro',
-               'javascripttest-qunit-heading',
-       ),
-       'accesskeys' => array(
-               'accesskey-pt-userpage',
-               'accesskey-pt-anonuserpage',
-               'accesskey-pt-mytalk',
-               'accesskey-pt-anontalk',
-               'accesskey-pt-preferences',
-               'accesskey-pt-watchlist',
-               'accesskey-pt-mycontris',
-               'accesskey-pt-login',
-               'accesskey-pt-logout',
-               'accesskey-ca-talk',
-               'accesskey-ca-edit',
-               'accesskey-ca-addsection',
-               'accesskey-ca-viewsource',
-               'accesskey-ca-history',
-               'accesskey-ca-protect',
-               'accesskey-ca-unprotect',
-               'accesskey-ca-delete',
-               'accesskey-ca-undelete',
-               'accesskey-ca-move',
-               'accesskey-ca-watch',
-               'accesskey-ca-unwatch',
-               'accesskey-search',
-               'accesskey-search-go',
-               'accesskey-search-fulltext',
-               'accesskey-p-logo',
-               'accesskey-n-mainpage',
-               'accesskey-n-mainpage-description',
-               'accesskey-n-portal',
-               'accesskey-n-currentevents',
-               'accesskey-n-recentchanges',
-               'accesskey-n-randompage',
-               'accesskey-n-help',
-               'accesskey-t-whatlinkshere',
-               'accesskey-t-recentchangeslinked',
-               'accesskey-t-random',
-               'accesskey-feed-rss',
-               'accesskey-feed-atom',
-               'accesskey-t-contributions',
-               'accesskey-t-emailuser',
-               'accesskey-t-permalink',
-               'accesskey-t-print',
-               'accesskey-t-upload',
-               'accesskey-t-specialpages',
-               'accesskey-ca-nstab-main',
-               'accesskey-ca-nstab-user',
-               'accesskey-ca-nstab-media',
-               'accesskey-ca-nstab-special',
-               'accesskey-ca-nstab-project',
-               'accesskey-ca-nstab-image',
-               'accesskey-ca-nstab-mediawiki',
-               'accesskey-ca-nstab-template',
-               'accesskey-ca-nstab-help',
-               'accesskey-ca-nstab-category',
-               'accesskey-minoredit',
-               'accesskey-save',
-               'accesskey-preview',
-               'accesskey-diff',
-               'accesskey-compareselectedversions',
-               'accesskey-watch',
-               'accesskey-upload',
-               'accesskey-preferences-save',
-               'accesskey-summary',
-               'accesskey-userrights-set',
-               'accesskey-blockip-block',
-               'accesskey-export',
-               'accesskey-import',
-               'accesskey-watchlistedit-normal-submit',
-               'accesskey-watchlistedit-raw-submit',
-       ),
-       'tooltips' => array(
-               'tooltip-pt-userpage',
-               'tooltip-pt-anonuserpage',
-               'tooltip-pt-mytalk',
-               'tooltip-pt-anontalk',
-               'tooltip-pt-preferences',
-               'tooltip-pt-watchlist',
-               'tooltip-pt-mycontris',
-               'tooltip-pt-login',
-               'tooltip-pt-logout',
-               'tooltip-ca-talk',
-               'tooltip-ca-edit',
-               'tooltip-ca-addsection',
-               'tooltip-ca-viewsource',
-               'tooltip-ca-history',
-               'tooltip-ca-protect',
-               'tooltip-ca-unprotect',
-               'tooltip-ca-delete',
-               'tooltip-ca-undelete',
-               'tooltip-ca-move',
-               'tooltip-ca-watch',
-               'tooltip-ca-unwatch',
-               'tooltip-search',
-               'tooltip-search-go',
-               'tooltip-search-fulltext',
-               'tooltip-p-logo',
-               'tooltip-n-mainpage',
-               'tooltip-n-mainpage-description',
-               'tooltip-n-portal',
-               'tooltip-n-currentevents',
-               'tooltip-n-recentchanges',
-               'tooltip-n-randompage',
-               'tooltip-n-help',
-               'tooltip-t-whatlinkshere',
-               'tooltip-t-recentchangeslinked',
-               'tooltip-t-random',
-               'tooltip-feed-rss',
-               'tooltip-feed-atom',
-               'tooltip-t-contributions',
-               'tooltip-t-emailuser',
-               'tooltip-t-upload',
-               'tooltip-t-specialpages',
-               'tooltip-t-print',
-               'tooltip-t-permalink',
-               'tooltip-ca-nstab-main',
-               'tooltip-ca-nstab-user',
-               'tooltip-ca-nstab-media',
-               'tooltip-ca-nstab-special',
-               'tooltip-ca-nstab-project',
-               'tooltip-ca-nstab-image',
-               'tooltip-ca-nstab-mediawiki',
-               'tooltip-ca-nstab-template',
-               'tooltip-ca-nstab-help',
-               'tooltip-ca-nstab-category',
-               'tooltip-minoredit',
-               'tooltip-save',
-               'tooltip-preview',
-               'tooltip-diff',
-               'tooltip-compareselectedversions',
-               'tooltip-watch',
-               'tooltip-watchlistedit-normal-submit',
-               'tooltip-watchlistedit-raw-submit',
-               'tooltip-recreate',
-               'tooltip-upload',
-               'tooltip-rollback',
-               'tooltip-undo',
-               'tooltip-preferences-save',
-               'tooltip-summary',
-               'interlanguage-link-title',
-               'interlanguage-link-title-langonly',
-       ),
-       'stylesheets' => array(
-               'common.css',
-               'cologneblue.css',
-               'monobook.css',
-               'modern.css',
-               'vector.css',
-               'print.css',
-               'noscript.css',
-               'group-autoconfirmed.css',
-               'group-user.css',
-               'group-bot.css',
-               'group-sysop.css',
-               'group-bureaucrat.css',
-       ),
-       'scripts' => array(
-               'common.js',
-               'cologneblue.js',
-               'monobook.js',
-               'modern.js',
-               'vector.js',
-               'group-autoconfirmed.js',
-               'group-user.js',
-               'group-bot.js',
-               'group-sysop.js',
-               'group-bureaucrat.js',
-       ),
-       'metadata_cc' => array(
-               'notacceptable',
-       ),
-       'attribution' => array(
-               'anonymous',
-               'siteuser',
-               'anonuser',
-               'lastmodifiedatby',
-               'othercontribs',
-               'others',
-               'siteusers',
-               'anonusers',
-               'creditspage',
-               'nocredits',
-       ),
-       'spamprotection' => array(
-               'spamprotectiontitle',
-               'spamprotectiontext',
-               'spamprotectionmatch',
-               'spambot_username',
-               'spam_reverting',
-               'spam_blanking',
-               'spam_deleting',
-               'simpleantispam-label',
-       ),
-       'info' => array(
-               'pageinfo-header',
-               'pageinfo-title',
-               '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',
-               'pageinfo-redirects-name',
-               'pageinfo-redirects-value',
-               'pageinfo-subpages-name',
-               'pageinfo-subpages-value',
-               'pageinfo-firstuser',
-               'pageinfo-firsttime',
-               'pageinfo-lastuser',
-               'pageinfo-lasttime',
-               'pageinfo-edits',
-               'pageinfo-authors',
-               'pageinfo-recent-edits',
-               'pageinfo-recent-authors',
-               'pageinfo-magic-words',
-               'pageinfo-hidden-categories',
-               'pageinfo-templates',
-               'pageinfo-transclusions',
-               'pageinfo-footer',
-               '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'
-       ),
-       'skin' => array(
-               'skinname-cologneblue',
-               'skinname-monobook',
-               'skinname-modern',
-               'skinname-vector',
-       ),
-       'patrolling' => array(
-               'markaspatrolleddiff',
-               'markaspatrolledlink',
-               'markaspatrolledtext',
-               'markedaspatrolled',
-               'markedaspatrolledtext',
-               'rcpatroldisabled',
-               'rcpatroldisabledtext',
-               'markedaspatrollederror',
-               'markedaspatrollederrortext',
-               'markedaspatrollederror-noautopatrol',
-               'markedaspatrollednotify',
-               'markedaspatrollederrornotify',
-       ),
-       'patrol-log' => array(
-               'patrol-log-page',
-               'patrol-log-header',
-               'log-show-hide-patrol',
-       ),
-       'imagedeletion' => array(
-               'deletedrevision',
-               'filedeleteerror-short',
-               'filedeleteerror-long',
-               'filedelete-missing',
-               'filedelete-old-unregistered',
-               'filedelete-current-unregistered',
-               'filedelete-archive-read-only',
-       ),
-       'browsediffs' => array(
-               'previousdiff',
-               'nextdiff',
-       ),
-       'media-info' => array(
-               'mediawarning',
-               'imagemaxsize',
-               'thumbsize',
-               'widthheight',
-               'widthheightpage',
-               'file-info',
-               'file-info-size',
-               'file-info-size-pages',
-               'file-nohires',
-               'svg-long-desc',
-               'svg-long-desc-animated',
-               'svg-long-error',
-               'show-big-image',
-               'show-big-image-preview',
-               'show-big-image-other',
-               'show-big-image-size',
-               'file-info-gif-looped',
-               'file-info-gif-frames',
-               'file-info-png-looped',
-               'file-info-png-repeat',
-               'file-info-png-frames',
-               'file-no-thumb-animation',
-               'file-no-thumb-animation-gif',
-       ),
-       'newfiles' => array(
-               'newimages',
-               'imagelisttext',
-               'newimages-summary',
-               'newimages-legend',
-               'newimages-label',
-               'showhidebots',
-               'noimages',
-               'ilsubmit',
-               'bydate',
-               'sp-newimages-showfrom',
-       ),
-       'video-info' => array(
-               'video-dims',
-               'seconds-abbrev',
-               'minutes-abbrev',
-               'hours-abbrev',
-               'days-abbrev',
-               'seconds',
-               'minutes',
-               'hours',
-               'days',
-               'weeks',
-               'months',
-               'years',
-               'ago',
-               'just-now',
-       ),
-       'human-timestamps' => array(
-               'hours-ago',
-               'minutes-ago',
-               'seconds-ago',
-               'monday-at',
-               'tuesday-at',
-               'wednesday-at',
-               'thursday-at',
-               'friday-at',
-               'saturday-at',
-               'sunday-at',
-               'today-at',
-               'yesterday-at',
-       ),
-       'badimagelist' => array(
-               'bad_image_list',
-       ),
-       'variantname-zh' => array(
-               'variantname-zh-hans',
-               'variantname-zh-hant',
-               'variantname-zh-cn',
-               'variantname-zh-tw',
-               'variantname-zh-hk',
-               'variantname-zh-mo',
-               'variantname-zh-sg',
-               'variantname-zh-my',
-               'variantname-zh',
-       ),
-       'variantname-gan' => array(
-               'variantname-gan-hans',
-               'variantname-gan-hant',
-               'variantname-gan',
-       ),
-       'variantname-sr' => array(
-               'variantname-sr-ec',
-               'variantname-sr-el',
-               'variantname-sr',
-       ),
-       'variantname-kk' => array(
-               'variantname-kk-kz',
-               'variantname-kk-tr',
-               'variantname-kk-cn',
-               'variantname-kk-cyrl',
-               'variantname-kk-latn',
-               'variantname-kk-arab',
-               'variantname-kk',
-       ),
-       'variantname-ku' => array(
-               'variantname-ku-arab',
-               'variantname-ku-latn',
-               'variantname-ku',
-       ),
-       'variantname-tg' => array(
-               'variantname-tg-cyrl',
-               'variantname-tg-latn',
-               'variantname-tg',
-       ),
-       'variantname-iu' => array(
-               'variantname-ike-cans',
-               'variantname-ike-latn',
-               'variantname-iu',
-       ),
-       'variantname-shi' => array(
-               'variantname-shi-tfng',
-               'variantname-shi-latn',
-               'variantname-shi',
-       ),
-       'metadata' => array(
-               'metadata',
-               'metadata-help',
-               'metadata-expand',
-               'metadata-collapse',
-               'metadata-fields',
-               'metadata-langitem',
-               'metadata-langitem-default',
-       ),
-       'exif' => array(
-               'exif-imagewidth',
-               'exif-imagelength',
-               'exif-bitspersample',
-               'exif-compression',
-               'exif-photometricinterpretation',
-               'exif-orientation',
-               'exif-samplesperpixel',
-               'exif-planarconfiguration',
-               'exif-ycbcrsubsampling',
-               'exif-ycbcrpositioning',
-               'exif-xresolution',
-               'exif-yresolution',
-               'exif-resolutionunit',
-               'exif-stripoffsets',
-               'exif-rowsperstrip',
-               'exif-stripbytecounts',
-               'exif-jpeginterchangeformat',
-               'exif-jpeginterchangeformatlength',
-               'exif-whitepoint',
-               'exif-primarychromaticities',
-               'exif-ycbcrcoefficients',
-               'exif-referenceblackwhite',
-               'exif-datetime',
-               'exif-imagedescription',
-               'exif-make',
-               'exif-model',
-               'exif-software',
-               'exif-artist',
-               'exif-copyright',
-               'exif-exifversion',
-               'exif-flashpixversion',
-               'exif-colorspace',
-               'exif-componentsconfiguration',
-               'exif-compressedbitsperpixel',
-               'exif-pixelydimension',
-               'exif-pixelxdimension',
-               'exif-usercomment',
-               'exif-relatedsoundfile',
-               'exif-datetimeoriginal',
-               'exif-datetimedigitized',
-               'exif-subsectime',
-               'exif-subsectimeoriginal',
-               'exif-subsectimedigitized',
-               'exif-exposuretime',
-               'exif-exposuretime-format',
-               'exif-fnumber',
-               'exif-fnumber-format',
-               'exif-exposureprogram',
-               'exif-spectralsensitivity',
-               'exif-isospeedratings',
-               'exif-shutterspeedvalue',
-               'exif-aperturevalue',
-               'exif-brightnessvalue',
-               'exif-exposurebiasvalue',
-               'exif-maxaperturevalue',
-               'exif-subjectdistance',
-               'exif-meteringmode',
-               'exif-lightsource',
-               'exif-flash',
-               'exif-focallength',
-               'exif-focallength-format',
-               'exif-subjectarea',
-               'exif-flashenergy',
-               'exif-focalplanexresolution',
-               'exif-focalplaneyresolution',
-               'exif-focalplaneresolutionunit',
-               'exif-subjectlocation',
-               'exif-exposureindex',
-               'exif-sensingmethod',
-               'exif-filesource',
-               'exif-scenetype',
-               'exif-customrendered',
-               'exif-exposuremode',
-               'exif-whitebalance',
-               'exif-digitalzoomratio',
-               'exif-focallengthin35mmfilm',
-               'exif-scenecapturetype',
-               'exif-gaincontrol',
-               'exif-contrast',
-               'exif-saturation',
-               'exif-sharpness',
-               'exif-devicesettingdescription',
-               'exif-subjectdistancerange',
-               'exif-imageuniqueid',
-               'exif-gpsversionid',
-               'exif-gpslatituderef',
-               'exif-gpslatitude',
-               'exif-gpslongituderef',
-               'exif-gpslongitude',
-               'exif-gpsaltituderef',
-               'exif-gpsaltitude',
-               'exif-gpstimestamp',
-               'exif-gpssatellites',
-               'exif-gpsstatus',
-               'exif-gpsmeasuremode',
-               'exif-gpsdop',
-               'exif-gpsspeedref',
-               'exif-gpsspeed',
-               'exif-gpstrackref',
-               'exif-gpstrack',
-               'exif-gpsimgdirectionref',
-               'exif-gpsimgdirection',
-               'exif-gpsmapdatum',
-               'exif-gpsdestlatituderef',
-               'exif-gpsdestlatitude',
-               'exif-gpsdestlongituderef',
-               'exif-gpsdestlongitude',
-               'exif-gpsdestbearingref',
-               'exif-gpsdestbearing',
-               'exif-gpsdestdistanceref',
-               'exif-gpsdestdistance',
-               'exif-gpsprocessingmethod',
-               'exif-gpsareainformation',
-               'exif-gpsdatestamp',
-               'exif-gpsdifferential',
-               'exif-coordinate-format',
-               'exif-jpegfilecomment',
-               'exif-keywords',
-               'exif-worldregioncreated',
-               'exif-countrycreated',
-               'exif-countrycodecreated',
-               'exif-provinceorstatecreated',
-               'exif-citycreated',
-               'exif-sublocationcreated',
-               'exif-worldregiondest',
-               'exif-countrydest',
-               'exif-countrycodedest',
-               'exif-provinceorstatedest',
-               'exif-citydest',
-               'exif-sublocationdest',
-               'exif-objectname',
-               'exif-specialinstructions',
-               'exif-headline',
-               'exif-credit',
-               'exif-source',
-               'exif-editstatus',
-               'exif-urgency',
-               'exif-fixtureidentifier',
-               'exif-locationdest',
-               'exif-locationdestcode',
-               'exif-objectcycle',
-               'exif-contact',
-               'exif-writer',
-               'exif-languagecode',
-               'exif-iimversion',
-               'exif-iimcategory',
-               'exif-iimsupplementalcategory',
-               'exif-datetimeexpires',
-               'exif-datetimereleased',
-               'exif-originaltransmissionref',
-               'exif-identifier',
-               'exif-lens',
-               'exif-serialnumber',
-               'exif-cameraownername',
-               'exif-label',
-               'exif-datetimemetadata',
-               'exif-nickname',
-               'exif-rating',
-               'exif-rightscertificate',
-               'exif-copyrighted',
-               'exif-copyrightowner',
-               'exif-usageterms',
-               'exif-webstatement',
-               'exif-originaldocumentid',
-               'exif-licenseurl',
-               'exif-morepermissionsurl',
-               'exif-attributionurl',
-               'exif-preferredattributionname',
-               'exif-pngfilecomment',
-               'exif-disclaimer',
-               'exif-contentwarning',
-               'exif-giffilecomment',
-               'exif-intellectualgenre',
-               'exif-subjectnewscode',
-               'exif-scenecode',
-               'exif-event',
-               'exif-organisationinimage',
-               'exif-personinimage',
-               'exif-originalimageheight',
-               'exif-originalimagewidth',
-       ),
-       'exif-values' => array(
-               'exif-make-value',
-               'exif-model-value',
-               'exif-software-value',
-               'exif-software-version-value',
-               'exif-contact-value',
-               'exif-subjectnewscode-value',
-       ),
-       'exif-compression' => array(
-               'exif-compression-1',
-               'exif-compression-2',
-               'exif-compression-3',
-               'exif-compression-4',
-               'exif-compression-5',
-               'exif-compression-6',
-               'exif-compression-7',
-               'exif-compression-8',
-               'exif-compression-32773',
-               'exif-compression-32946',
-               'exif-compression-34712',
-       ),
-       'exif-copyrighted' => array(
-               'exif-copyrighted-true',
-               'exif-copyrighted-false',
-       ),
-       'exif-photometricinterpretation' => array(
-               'exif-photometricinterpretation-2',
-               'exif-photometricinterpretation-6',
-       ),
-       'exif-unknowndate' => array(
-               'exif-unknowndate',
-       ),
-       'exif-orientation' => array(
-               'exif-orientation-1',
-               'exif-orientation-2',
-               'exif-orientation-3',
-               'exif-orientation-4',
-               'exif-orientation-5',
-               'exif-orientation-6',
-               'exif-orientation-7',
-               'exif-orientation-8',
-       ),
-       'exif-planarconfiguration' => array(
-               'exif-planarconfiguration-1',
-               'exif-planarconfiguration-2',
-       ),
-       'exif-xyresolution' => array(
-               'exif-xyresolution-i',
-               'exif-xyresolution-c',
-       ),
-       'exif-colorspace' => array(
-               'exif-colorspace-1',
-               'exif-colorspace-65535',
-       ),
-       'exif-componentsconfiguration' => array(
-               'exif-componentsconfiguration-0',
-               'exif-componentsconfiguration-1',
-               'exif-componentsconfiguration-2',
-               'exif-componentsconfiguration-3',
-               'exif-componentsconfiguration-4',
-               'exif-componentsconfiguration-5',
-               'exif-componentsconfiguration-6',
-       ),
-       'exif-exposureprogram' => array(
-               'exif-exposureprogram-0',
-               'exif-exposureprogram-1',
-               'exif-exposureprogram-2',
-               'exif-exposureprogram-3',
-               'exif-exposureprogram-4',
-               'exif-exposureprogram-5',
-               'exif-exposureprogram-6',
-               'exif-exposureprogram-7',
-               'exif-exposureprogram-8',
-       ),
-       'exif-subjectdistance-value' => array(
-               'exif-subjectdistance-value',
-       ),
-       'exif-meteringmode' => array(
-               'exif-meteringmode-0',
-               'exif-meteringmode-1',
-               'exif-meteringmode-2',
-               'exif-meteringmode-3',
-               'exif-meteringmode-4',
-               'exif-meteringmode-5',
-               'exif-meteringmode-6',
-               'exif-meteringmode-255',
-       ),
-       'exif-lightsource' => array(
-               'exif-lightsource-0',
-               'exif-lightsource-1',
-               'exif-lightsource-2',
-               'exif-lightsource-3',
-               'exif-lightsource-4',
-               'exif-lightsource-9',
-               'exif-lightsource-10',
-               'exif-lightsource-11',
-               'exif-lightsource-12',
-               'exif-lightsource-13',
-               'exif-lightsource-14',
-               'exif-lightsource-15',
-               'exif-lightsource-17',
-               'exif-lightsource-18',
-               'exif-lightsource-19',
-               'exif-lightsource-20',
-               'exif-lightsource-21',
-               'exif-lightsource-22',
-               'exif-lightsource-23',
-               'exif-lightsource-24',
-               'exif-lightsource-255',
-       ),
-       'exif-flash' => array(
-               'exif-flash-fired-0',
-               'exif-flash-fired-1',
-               'exif-flash-return-0',
-               'exif-flash-return-2',
-               'exif-flash-return-3',
-               'exif-flash-mode-1',
-               'exif-flash-mode-2',
-               'exif-flash-mode-3',
-               'exif-flash-function-1',
-               'exif-flash-redeye-1',
-       ),
-       'exif-focalplaneresolutionunit' => array(
-               'exif-focalplaneresolutionunit-2',
-       ),
-       'exif-sensingmethod' => array(
-               'exif-sensingmethod-1',
-               'exif-sensingmethod-2',
-               'exif-sensingmethod-3',
-               'exif-sensingmethod-4',
-               'exif-sensingmethod-5',
-               'exif-sensingmethod-7',
-               'exif-sensingmethod-8',
-       ),
-       'exif-filesource' => array(
-               'exif-filesource-3',
-       ),
-       'exif-scenetype' => array(
-               'exif-scenetype-1',
-       ),
-       'exif-customrendered' => array(
-               'exif-customrendered-0',
-               'exif-customrendered-1',
-       ),
-       'exif-exposuremode' => array(
-               'exif-exposuremode-0',
-               'exif-exposuremode-1',
-               'exif-exposuremode-2',
-       ),
-       'exif-whitebalance' => array(
-               'exif-whitebalance-0',
-               'exif-whitebalance-1',
-       ),
-       'exif-scenecapturetype' => array(
-               'exif-scenecapturetype-0',
-               'exif-scenecapturetype-1',
-               'exif-scenecapturetype-2',
-               'exif-scenecapturetype-3',
-       ),
-       'exif-gaincontrol' => array(
-               'exif-gaincontrol-0',
-               'exif-gaincontrol-1',
-               'exif-gaincontrol-2',
-               'exif-gaincontrol-3',
-               'exif-gaincontrol-4',
-       ),
-       'exif-contrast' => array(
-               'exif-contrast-0',
-               'exif-contrast-1',
-               'exif-contrast-2',
-       ),
-       'exif-saturation' => array(
-               'exif-saturation-0',
-               'exif-saturation-1',
-               'exif-saturation-2',
-       ),
-       'exif-sharpness' => array(
-               'exif-sharpness-0',
-               'exif-sharpness-1',
-               'exif-sharpness-2',
-       ),
-       'exif-subjectdistancerange' => array(
-               'exif-subjectdistancerange-0',
-               'exif-subjectdistancerange-1',
-               'exif-subjectdistancerange-2',
-               'exif-subjectdistancerange-3',
-       ),
-       'exif-gpslatitude' => array(
-               'exif-gpslatitude-n',
-               'exif-gpslatitude-s',
-       ),
-       'exif-gpslongitude' => array(
-               'exif-gpslongitude-e',
-               'exif-gpslongitude-w',
-       ),
-       'exif-altituderef' => array(
-               'exif-gpsaltitude-above-sealevel',
-               'exif-gpsaltitude-below-sealevel',
-       ),
-       'exif-gpsstatus' => array(
-               'exif-gpsstatus-a',
-               'exif-gpsstatus-v',
-       ),
-       'exif-gpsmeasuremode' => array(
-               'exif-gpsmeasuremode-2',
-               'exif-gpsmeasuremode-3',
-       ),
-       'exif-gpsspeed' => array(
-               'exif-gpsspeed-k',
-               'exif-gpsspeed-m',
-               'exif-gpsspeed-n',
-       ),
-       'exif-gpsdestdistanceref' => array(
-               'exif-gpsdestdistance-k',
-               'exif-gpsdestdistance-m',
-               'exif-gpsdestdistance-n',
-       ),
-       'exif-gdop' => array(
-               'exif-gpsdop-excellent',
-               'exif-gpsdop-good',
-               'exif-gpsdop-moderate',
-               'exif-gpsdop-fair',
-               'exif-gpsdop-poor',
-       ),
-       'exif-objectcycle' => array(
-               'exif-objectcycle-a',
-               'exif-objectcycle-p',
-               'exif-objectcycle-b',
-       ),
-       'exif-gpsdirection' => array(
-               'exif-gpsdirection-t',
-               'exif-gpsdirection-m',
-       ),
-       'exif-ycbcrpositioning' => array(
-               'exif-ycbcrpositioning-1',
-               'exif-ycbcrpositioning-2',
-       ),
-       'exif-dc' => array(
-               'exif-dc-contributor',
-               'exif-dc-coverage',
-               'exif-dc-date',
-               'exif-dc-publisher',
-               'exif-dc-relation',
-               'exif-dc-rights',
-               'exif-dc-source',
-               'exif-dc-type',
-       ),
-       'exif-rating' => array(
-               'exif-rating-rejected',
-       ),
-       'exif-isospeedratings' => array(
-               'exif-isospeedratings-overflow',
-       ),
-       'exif-maxaperturevalue' => array(
-               'exif-maxaperturevalue-value',
-       ),
-       'exif-iimcategory' => array(
-               'exif-iimcategory-ace',
-               'exif-iimcategory-clj',
-               'exif-iimcategory-dis',
-               'exif-iimcategory-fin',
-               'exif-iimcategory-edu',
-               'exif-iimcategory-evn',
-               'exif-iimcategory-hth',
-               'exif-iimcategory-hum',
-               'exif-iimcategory-lab',
-               'exif-iimcategory-lif',
-               'exif-iimcategory-pol',
-               'exif-iimcategory-rel',
-               'exif-iimcategory-sci',
-               'exif-iimcategory-soi',
-               'exif-iimcategory-spo',
-               'exif-iimcategory-war',
-               'exif-iimcategory-wea',
-       ),
-       'exif-urgency' => array(
-               'exif-urgency-normal',
-               'exif-urgency-low',
-               'exif-urgency-high',
-               'exif-urgency-other',
-       ),
-       'all' => array(
-               'watchlistall2',
-               'namespacesall',
-               'monthsall',
-       ),
-       'confirmemail' => array(
-               'confirmemail',
-               'confirmemail_noemail',
-               'confirmemail_text',
-               'confirmemail_pending',
-               'confirmemail_send',
-               'confirmemail_sent',
-               'confirmemail_oncreate',
-               'confirmemail_sendfailed',
-               'confirmemail_invalid',
-               'confirmemail_needlogin',
-               'confirmemail_success',
-               'confirmemail_loggedin',
-               'confirmemail_subject',
-               'confirmemail_body',
-               'confirmemail_body_changed',
-               'confirmemail_body_set',
-               'confirmemail_invalidated',
-               'invalidateemail',
-       ),
-       'scarytransclusion' => array(
-               'scarytranscludedisabled',
-               'scarytranscludefailed',
-               'scarytranscludefailed-httpstatus',
-               'scarytranscludetoolong',
-       ),
-       'deleteconflict' => array(
-               'deletedwhileediting',
-               'confirmrecreate',
-               'confirmrecreate-noreason',
-               'recreate',
-       ),
-       'unit-pixel' => array(
-               'unit-pixel',
-       ),
-       'purge' => array(
-               'confirm_purge_button',
-               'confirm-purge-top',
-               'confirm-purge-bottom',
-       ),
-       'watch-unwatch' => array(
-               'confirm-watch-button',
-               'confirm-watch-top',
-               'confirm-unwatch-button',
-               'confirm-unwatch-top',
-       ),
-       'separators' => array(
-               'semicolon-separator',
-               'comma-separator',
-               'colon-separator',
-               'autocomment-prefix',
-               'pipe-separator',
-               'word-separator',
-               'ellipsis',
-               'percent',
-               'parentheses',
-               'brackets',
-               'quotation-marks',
-       ),
-       'imgmulti' => array(
-               'imgmultipageprev',
-               'imgmultipagenext',
-               'imgmultigo',
-               'imgmultigoto',
-       ),
-       'img-lang' => array(
-               'img-lang-opt',
-               'img-lang-default',
-               'img-lang-info',
-               'img-lang-go',
-       ),
-       'tablepager' => array(
-               'ascending_abbrev',
-               'descending_abbrev',
-               'table_pager_next',
-               'table_pager_prev',
-               'table_pager_first',
-               'table_pager_last',
-               'table_pager_limit',
-               'table_pager_limit_label',
-               'table_pager_limit_submit',
-               'table_pager_empty',
-       ),
-       'autosumm' => array(
-               'autosumm-blank',
-               'autosumm-replace',
-               'autoredircomment',
-               'autosumm-new',
-       ),
-       'autoblock_whitelist' => array(
-               'autoblock_whitelist',
-       ),
-       'sizeunits' => array(
-               'size-bytes',
-               'size-kilobytes',
-               'size-megabytes',
-               'size-gigabytes',
-               'size-terabytes',
-               'size-petabytes',
-               'size-exabytes',
-               'size-zetabytes',
-               'size-yottabytes',
-       ),
-       'bitrateunits' => array(
-               'bitrate-bits',
-               'bitrate-kilobits',
-               'bitrate-megabits',
-               'bitrate-gigabits',
-               'bitrate-terabits',
-               'bitrate-petabits',
-               'bitrate-exabits',
-               'bitrate-zetabits',
-               'bitrate-yottabits',
-       ),
-       'livepreview' => array(
-               'livepreview-loading',
-               'livepreview-ready',
-               'livepreview-failed',
-               'livepreview-error',
-       ),
-       'lagwarning' => array(
-               'lag-warn-normal',
-               'lag-warn-high',
-       ),
-       'watchlisteditor' => array(
-               'editwatchlist-summary',
-               'watchlistedit-numitems',
-               'watchlistedit-noitems',
-               'watchlistedit-normal-title',
-               'watchlistedit-normal-legend',
-               'watchlistedit-normal-explain',
-               'watchlistedit-normal-submit',
-               'watchlistedit-normal-done',
-               'watchlistedit-raw-title',
-               'watchlistedit-raw-legend',
-               'watchlistedit-raw-explain',
-               'watchlistedit-raw-titles',
-               'watchlistedit-raw-submit',
-               'watchlistedit-raw-done',
-               'watchlistedit-raw-added',
-               'watchlistedit-raw-removed',
-       ),
-       'watchlisttools' => array(
-               'watchlisttools-view',
-               'watchlisttools-edit',
-               'watchlisttools-raw',
-       ),
-       'iranian-dates' => array(
-               '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-dates' => array(
-               'hijri-calendar-m1',
-               'hijri-calendar-m2',
-               'hijri-calendar-m3',
-               'hijri-calendar-m4',
-               'hijri-calendar-m5',
-               'hijri-calendar-m6',
-               'hijri-calendar-m7',
-               'hijri-calendar-m8',
-               'hijri-calendar-m9',
-               'hijri-calendar-m10',
-               'hijri-calendar-m11',
-               'hijri-calendar-m12',
-       ),
-       'hebrew-dates' => array(
-               'hebrew-calendar-m1',
-               'hebrew-calendar-m2',
-               'hebrew-calendar-m3',
-               'hebrew-calendar-m4',
-               'hebrew-calendar-m5',
-               'hebrew-calendar-m6',
-               'hebrew-calendar-m6a',
-               'hebrew-calendar-m6b',
-               'hebrew-calendar-m7',
-               'hebrew-calendar-m8',
-               'hebrew-calendar-m9',
-               'hebrew-calendar-m10',
-               'hebrew-calendar-m11',
-               'hebrew-calendar-m12',
-               'hebrew-calendar-m1-gen',
-               'hebrew-calendar-m2-gen',
-               'hebrew-calendar-m3-gen',
-               'hebrew-calendar-m4-gen',
-               'hebrew-calendar-m5-gen',
-               'hebrew-calendar-m6-gen',
-               'hebrew-calendar-m6a-gen',
-               'hebrew-calendar-m6b-gen',
-               'hebrew-calendar-m7-gen',
-               'hebrew-calendar-m8-gen',
-               'hebrew-calendar-m9-gen',
-               'hebrew-calendar-m10-gen',
-               'hebrew-calendar-m11-gen',
-               'hebrew-calendar-m12-gen',
-       ),
-       'signatures' => array(
-               'signature',
-               'signature-anon',
-               'timezone-utc',
-       ),
-       'CoreParserFunctions' => array(
-               'unknown_extension_tag',
-               'duplicate-defaultsort',
-       ),
-       'version' => array(
-               'version',
-               'version-summary',
-               'version-extensions',
-               'version-specialpages',
-               'version-parserhooks',
-               'version-variables',
-               'version-antispam',
-               'version-skins',
-               'version-api',
-               'version-other',
-               'version-mediahandlers',
-               'version-hooks',
-               'version-parser-extensiontags',
-               'version-parser-function-hooks',
-               'version-hook-name',
-               'version-hook-subscribedby',
-               'version-version',
-               'version-svn-revision',
-               'version-license',
-               'version-ext-license',
-               'version-ext-colheader-name',
-               'version-ext-colheader-version',
-               'version-ext-colheader-license',
-               'version-ext-colheader-description',
-               'version-ext-colheader-credits',
-               'version-license-title',
-               'version-license-not-found',
-               'version-credits-title',
-               'version-credits-not-found',
-               'version-poweredby-credits',
-               'version-poweredby-others',
-               'version-poweredby-translators',
-               'version-credits-summary',
-               'version-license-info',
-               'version-software',
-               'version-software-product',
-               'version-software-version',
-               'version-db-mysql-url',
-               'version-db-mariadb-url',
-               'version-db-percona-url',
-               'version-db-postgres-url',
-               'version-db-oracle-url',
-               'version-db-sqlite-url',
-               'version-db-mssql-url',
-               'version-entrypoints',
-               'version-entrypoints-header-entrypoint',
-               'version-entrypoints-header-url',
-               'version-entrypoints-articlepath',
-               'version-entrypoints-scriptpath',
-               'version-entrypoints-index-php',
-               'version-entrypoints-api-php',
-               'version-entrypoints-load-php',
-       ),
-       'redirect' => array(
-               'redirect',
-               'redirect-legend',
-               'redirect-text',
-               'redirect-summary',
-               'redirect-submit',
-               'redirect-lookup',
-               'redirect-value',
-               'redirect-user',
-               'redirect-page',
-               'redirect-revision',
-               'redirect-file',
-               'redirect-not-exists',
-       ),
-       'fileduplicatesearch' => array(
-               'fileduplicatesearch',
-               'fileduplicatesearch-summary',
-               'fileduplicatesearch-legend',
-               'fileduplicatesearch-filename',
-               'fileduplicatesearch-submit',
-               'fileduplicatesearch-info',
-               'fileduplicatesearch-result-1',
-               'fileduplicatesearch-result-n',
-               'fileduplicatesearch-noresults',
-       ),
-       'special-specialpages' => array(
-               'specialpages',
-               'specialpages-summary',
-               'specialpages-note-top',
-               'specialpages-note',
-               'specialpages-group-maintenance',
-               'specialpages-group-other',
-               'specialpages-group-login',
-               'specialpages-group-changes',
-               'specialpages-group-media',
-               'specialpages-group-users',
-               'specialpages-group-highuse',
-               'specialpages-group-pages',
-               'specialpages-group-pagetools',
-               'specialpages-group-wiki',
-               'specialpages-group-redirects',
-               'specialpages-group-spam',
-       ),
-       'special-blank' => array(
-               'blankpage',
-               'intentionallyblankpage',
-       ),
-       'external_images' => array(
-               'external_image_whitelist',
-       ),
-       'special-tags' => array(
-               'tags',
-               'tags-summary',
-               'tag-filter',
-               'tag-filter-submit',
-               'tag-list-wrapper',
-               'tags-title',
-               'tags-intro',
-               'tags-tag',
-               'tags-display-header',
-               'tags-description-header',
-               'tags-active-header',
-               'tags-hitcount-header',
-               'tags-active-yes',
-               'tags-active-no',
-               'tags-edit',
-               'tags-hitcount',
-       ),
-       'comparepages' => array(
-               'comparepages',
-               'comparepages-summary',
-               'compare-page1',
-               'compare-page2',
-               'compare-rev1',
-               'compare-rev2',
-               'compare-submit',
-               'compare-invalid-title',
-               'compare-title-not-exists',
-               'compare-revision-not-exists',
-       ),
-       'db-error-messages' => array(
-               'dberr-header',
-               'dberr-problems',
-               'dberr-again',
-               'dberr-info',
-               'dberr-info-hidden',
-               'dberr-usegoogle',
-               'dberr-outofdate',
-               'dberr-cachederror',
-       ),
-       'html-forms' => array(
-               'htmlform-invalid-input',
-               'htmlform-select-badoption',
-               'htmlform-int-invalid',
-               'htmlform-float-invalid',
-               'htmlform-int-toolow',
-               'htmlform-int-toohigh',
-               'htmlform-required',
-               'htmlform-submit',
-               'htmlform-reset',
-               'htmlform-selectorother-other',
-               'htmlform-no',
-               'htmlform-yes',
-               'htmlform-chosen-placeholder',
-       ),
-       'sqlite' => array(
-               'sqlite-has-fts',
-               'sqlite-no-fts',
-       ),
-       'logging' => array(
-               'logentry-delete-delete',
-               'logentry-delete-restore',
-               'logentry-delete-event',
-               'logentry-delete-revision',
-               'logentry-delete-event-legacy',
-               'logentry-delete-revision-legacy',
-               'logentry-suppress-delete',
-               'logentry-suppress-event',
-               'logentry-suppress-revision',
-               'logentry-suppress-event-legacy',
-               'logentry-suppress-revision-legacy',
-               'revdelete-content-hid',
-               'revdelete-summary-hid',
-               'revdelete-uname-hid',
-               'revdelete-content-unhid',
-               'revdelete-summary-unhid',
-               'revdelete-uname-unhid',
-               'revdelete-restricted',
-               'revdelete-unrestricted',
-               'logentry-move-move',
-               'logentry-move-move-noredirect',
-               'logentry-move-move_redir',
-               'logentry-move-move_redir-noredirect',
-               'logentry-patrol-patrol',
-               'logentry-patrol-patrol-auto',
-               'logentry-newusers-newusers',
-               'logentry-newusers-create',
-               'logentry-newusers-create2',
-               'logentry-newusers-byemail',
-               'logentry-newusers-autocreate',
-               'logentry-rights-rights',
-               'logentry-rights-rights-legacy',
-               'logentry-rights-autopromote',
-               'rightsnone',
-       ),
-       'logging-irc' => array(
-               'revdelete-logentry',
-               'logdelete-logentry',
-               'revdelete-content',
-               'revdelete-summary',
-               'revdelete-uname',
-               'revdelete-hid',
-               'revdelete-unhid',
-               'revdelete-log-message',
-               'logdelete-log-message',
-               'deletedarticle',
-               'suppressedarticle',
-               'undeletedarticle',
-               'patrol-log-line',
-               'patrol-log-auto',
-               'patrol-log-diff',
-               '1movedto2',
-               '1movedto2_redir',
-               'move-redirect-suppressed',
-               'newuserlog-create-entry',
-               'newuserlog-create2-entry',
-               'newuserlog-autocreate-entry',
-               // 'uploadedimage',
-               // 'overwroteimage',
-               'rightslogentry',
-               'rightslogentry-autopromote',
-       ),
-       'feedback' => array(
-               'feedback-bugornote',
-               'feedback-subject',
-               'feedback-message',
-               'feedback-cancel',
-               'feedback-submit',
-               'feedback-adding',
-               'feedback-error1',
-               'feedback-error2',
-               'feedback-error3',
-               'feedback-thanks',
-               'feedback-close',
-               'feedback-bugcheck',
-               'feedback-bugnew',
-       ),
-       'searchsuggestions' => array(
-               'searchsuggest-search',
-               'searchsuggest-containing',
-       ),
-       'apierrors' => array(
-               'api-error-badaccess-groups',
-               'api-error-badtoken',
-               'api-error-copyuploaddisabled',
-               'api-error-duplicate',
-               'api-error-duplicate-archive',
-               'api-error-duplicate-archive-popup-title',
-               'api-error-duplicate-popup-title',
-               'api-error-empty-file',
-               'api-error-emptypage',
-               'api-error-fetchfileerror',
-               'api-error-fileexists-forbidden',
-               'api-error-fileexists-shared-forbidden',
-               'api-error-file-too-large',
-               'api-error-filename-tooshort',
-               'api-error-filetype-banned',
-               'api-error-filetype-banned-type',
-               'api-error-filetype-missing',
-               'api-error-hookaborted',
-               'api-error-http',
-               'api-error-illegal-filename',
-               'api-error-internal-error',
-               'api-error-invalid-file-key',
-               'api-error-missingparam',
-               'api-error-missingresult',
-               'api-error-mustbeloggedin',
-               'api-error-mustbeposted',
-               'api-error-noimageinfo',
-               'api-error-nomodule',
-               'api-error-ok-but-empty',
-               'api-error-overwrite',
-               'api-error-stashfailed',
-               'api-error-publishfailed',
-               'api-error-stasherror',
-               'api-error-timeout',
-               'api-error-unclassified',
-               'api-error-unknown-code',
-               'api-error-unknown-error',
-               'api-error-unknown-warning',
-               'api-error-unknownerror',
-               'api-error-uploaddisabled',
-               'api-error-verification-error',
-       ),
-       'duration' => array(
-               'duration-seconds',
-               'duration-minutes',
-               'duration-hours',
-               'duration-days',
-               'duration-weeks',
-               'duration-years',
-               'duration-decades',
-               'duration-centuries',
-               'duration-millennia'
-       ),
-       'rotation' => array(
-               'rotate-comment',
-       ),
-       'limitreport' => array(
-               'limitreport-title',
-               'limitreport-cputime',
-               'limitreport-cputime-value',
-               'limitreport-walltime',
-               'limitreport-walltime-value',
-               'limitreport-ppvisitednodes',
-               'limitreport-ppvisitednodes-value',
-               'limitreport-ppgeneratednodes',
-               'limitreport-ppgeneratednodes-value',
-               'limitreport-postexpandincludesize',
-               'limitreport-postexpandincludesize-value',
-               'limitreport-templateargumentsize',
-               'limitreport-templateargumentsize-value',
-               'limitreport-expansiondepth',
-               'limitreport-expansiondepth-value',
-               'limitreport-expensivefunctioncount',
-               'limitreport-expensivefunctioncount-value',
-       ),
-       'expandtemplates' => array(
-               'expandtemplates',
-               'expand_templates_intro',
-               'expand_templates_title',
-               'expand_templates_input',
-               'expand_templates_output',
-               'expand_templates_xml_output',
-               'expand_templates_html_output',
-               'expand_templates_ok',
-               'expand_templates_remove_comments',
-               'expand_templates_remove_nowiki',
-               'expand_templates_generate_xml',
-               'expand_templates_generate_rawhtml',
-               'expand_templates_preview',
-       ),
-       'trackingcategories' => array(
-               'trackingcategories',
-               'trackingcategories-summary',
-               'trackingcategories-msg',
-               'trackingcategories-name',
-               'trackingcategories-desc',
-               'noindex-category-desc',
-               'index-category-desc',
-               'post-expand-template-inclusion-category-desc',
-               'post-expand-template-argument-category-desc',
-               'expensive-parserfunction-category-desc',
-               'broken-file-category-desc',
-               'hidden-category-category-desc',
-               'trackingcategories-nodesc',
-               'trackcategories-disabled',
-       ),
-);
-
-/** Comments for each block */
-$wgBlockComments = array(
-       'sidebar' => "The sidebar for MonoBook is generated from this message, lines that do not
-begin with * or ** are discarded, furthermore lines that do begin with ** and
-do not contain | are also discarded, but do not depend on this behavior for
-future releases. Also note that since each list value is wrapped in a unique
-(X)HTML id it should only appear once and include characters that are legal
-(X)HTML id names.",
-       'toggles' => 'User preference toggles',
-       'underline' => '',
-       'editfont' => 'Font style option in Special:Preferences',
-       'dates' => 'Dates',
-       'categorypages' => 'Categories related messages',
-       'mainpage' => '',
-       'miscellaneous1' => '',
-       'cologneblue' => 'Cologne Blue skin',
-       'vector' => 'Vector skin',
-       'miscellaneous2' => '',
-       'links' => 'All link text and link target definitions of links into project namespace ' .
-               'that get used by other message strings, with the exception of user group pages (see grouppage).',
-       'badaccess' => '',
-       'versionrequired' => '',
-       'miscellaneous3' => '',
-       'nstab' => "Short words for each namespace, by default used in the namespace tab in monobook",
-       'main' => 'Main script and global functions',
-       'errors' => 'General errors',
-       'virus' => 'Virus scanner',
-       'login' => 'Login and logout pages',
-       'mail' => 'Email sending',
-       'passwordstrength' => 'JavaScript password checks',
-       'resetpass' => 'Change password dialog',
-       'passwordreset' => 'Special:PasswordReset',
-       'changeemail' => 'Special:ChangeEmail',
-       'resettokens' => 'Special:ResetTokens',
-       'toolbar' => 'Edit page toolbar',
-       'edit' => 'Edit pages',
-       'parserwarnings' => 'Parser/template warnings',
-       'contentmodels' => 'Content models',
-       'undo' => '"Undo" feature',
-       'cantcreateaccount' => 'Account creation failure',
-       'history' => 'History pages',
-       'history-feed' => 'Revision feed',
-       'revdelete' => 'Revision deletion',
-       'suppression' => 'Suppression log',
-       'mergehistory' => 'History merging',
-       'mergelog' => 'Merge log',
-       'diffs' => 'Diffs',
-       'search' => 'Search results',
-       'opensearch' => 'OpenSearch description',
-       'preferences' => 'Preferences page',
-       'preferences-email' => 'User preference: email validation using jQuery',
-       'userrights' => 'User rights',
-       'group' => 'Groups',
-       'group-member' => '',
-       'grouppage' => '',
-       'right' => 'Rights',
-       'action' => 'Associated actions - in the sentence "You do not have permission to X"',
-       'rightslog' => 'User rights log',
-       'recentchanges' => 'Recent changes',
-       'recentchangeslinked' => 'Recent changes linked',
-       'upload' => 'Upload',
-       'zip' => 'ZipDirectoryReader',
-       'upload-errors' => '',
-       'filebackend-errors' => 'File backend',
-       'filejournal-errors' => 'File journal errors',
-       'lockmanager-errors' => 'Lock manager',
-       'uploadstash' => 'Special:UploadStash',
-       'img-auth' => 'img_auth script messages',
-       'http-errors' => 'HTTP errors',
-       'upload-curl-errors' => 'Some likely curl errors. More could be added from ' .
-               '<http://curl.haxx.se/libcurl/c/libcurl-errors.html>',
-       'licenses' => '',
-       'filelist' => 'Special:ListFiles',
-       'filedescription' => 'File description page',
-       'filerevert' => 'File reversion',
-       'filedelete' => 'File deletion',
-       'mimesearch' => 'MIME search',
-       'unwatchedpages' => 'Unwatched pages',
-       'listduplicatedfiles' => 'List duplicated files special page',
-       'listredirects' => 'List redirects',
-       'unusedtemplates' => 'Unused templates',
-       'randompage' => 'Random page',
-       'randomincategory' => 'Random page in category',
-       'randomredirect' => 'Random redirect',
-       'statistics' => 'Statistics',
-       'pageswithprop' => '',
-       'doubleredirects' => '',
-       'brokenredirects' => '',
-       'withoutinterwiki' => '',
-       'fewestrevisions' => '',
-       'specialpages' => 'Miscellaneous special pages',
-       'booksources' => 'Book sources',
-       'magicwords' => 'Magic words',
-       'logpages' => 'Special:Log',
-       'allpages' => 'Special:AllPages',
-       'categories' => 'Special:Categories',
-       'deletedcontribs' => 'Special:DeletedContributions',
-       'linksearch' => 'Special:LinkSearch',
-       'listusers' => 'Special:ListUsers',
-       'activeusers' => 'Special:ActiveUsers',
-       'newuserlog' => 'Special:Log/newusers',
-       'listgrouprights' => 'Special:ListGroupRights',
-       'emailuser' => 'Email user',
-       'usermessage' => 'User Messenger',
-       'watchlist' => 'Watchlist',
-       'watching' => 'Displayed when you click the "watch" button and it is in the process of watching',
-       'enotif' => '',
-       'delete' => 'Delete',
-       'rollback' => 'Rollback',
-       'edittokens' => 'Edit tokens',
-       'protect' => 'Protect',
-       'restrictions' => 'Restrictions (nouns)',
-       'restriction-levels' => 'Restriction levels',
-       'undelete' => 'Undelete',
-       'nsform' => 'Namespace form on various pages',
-       'contributions' => 'Contributions',
-       'sp-contributions' => '',
-       'whatlinkshere' => 'What links here',
-       'block' => 'Block/unblock',
-       'developertools' => 'Developer tools',
-       'movepage' => 'Move page',
-       'export' => 'Export',
-       'allmessages' => 'Namespace 8 related',
-       'thumbnails' => 'Thumbnails',
-       'import' => 'Special:Import',
-       'importlog' => 'Import log',
-       'javaccripttest' => 'JavaScriptTest',
-       'accesskeys' => 'Keyboard access keys for power users',
-       'tooltips' => 'Tooltip help for the actions',
-       'stylesheets' => 'Stylesheets',
-       'scripts' => 'Scripts',
-       'metadata_cc' => 'Metadata',
-       'attribution' => 'Attribution',
-       'spamprotection' => 'Spam protection',
-       'info' => 'Info page',
-       'skin' => 'Skin names',
-       'patrolling' => 'Patrolling',
-       'patrol-log' => 'Patrol log',
-       'imagedeletion' => 'Image deletion',
-       'browsediffs' => 'Browsing diffs',
-       'newfiles' => 'Special:NewFiles',
-       'video-info' => 'Video information, used by Language::formatTimePeriod() to ' .
-               'format lengths in the above messages',
-       'human-timestamps' => 'Human-readable timestamps',
-       'badimagelist' => 'Bad image list',
-       'variantname-zh' => "Short names for language variants used for language conversion links.
-Variants for Chinese language",
-       'variantname-gan' => 'Variants for Gan language',
-       'variantname-sr' => 'Variants for Serbian language',
-       'variantname-kk' => 'Variants for Kazakh language',
-       'variantname-ku' => 'Variants for Kurdish language',
-       'variantname-tg' => 'Variants for Tajiki language',
-       'variantname-iu' => 'Variants for Inuktitut language',
-       'variantname-shi' => 'Variants for Tachelhit language',
-       'media-info' => 'Media information',
-       'metadata' => 'Metadata',
-       'exif' => 'Exif tags',
-       'exif-values' => 'Make & model, can be wikified in order to link to the camera and model name',
-       'exif-compression' => 'Exif attributes',
-       'exif-copyrighted' => '',
-       'exif-unknowndate' => '',
-       'exif-photometricinterpretation' => '',
-       'exif-orientation' => '',
-       'exif-planarconfiguration' => '',
-       'exif-xyresolution' => '',
-       'exif-colorspace' => '',
-       'exif-componentsconfiguration' => '',
-       'exif-exposureprogram' => '',
-       'exif-subjectdistance-value' => '',
-       'exif-meteringmode' => '',
-       'exif-lightsource' => '',
-       'exif-flash' => 'Flash modes',
-       'exif-focalplaneresolutionunit' => '',
-       'exif-sensingmethod' => '',
-       'exif-filesource' => '',
-       'exif-scenetype' => '',
-       'exif-customrendered' => '',
-       'exif-exposuremode' => '',
-       'exif-whitebalance' => '',
-       'exif-scenecapturetype' => '',
-       'exif-gaincontrol' => '',
-       'exif-contrast' => '',
-       'exif-saturation' => '',
-       'exif-sharpness' => '',
-       'exif-subjectdistancerange' => '',
-       'exif-gpslatitude' => 'Pseudotags used for GPSLatitudeRef and GPSDestLatitudeRef',
-       'exif-gpslongitude' => 'Pseudotags used for GPSLongitudeRef and GPSDestLongitudeRef',
-       'exif-altituderef' => 'Pseudotags used for GPSAltitudeRef',
-       'exif-gpsstatus' => '',
-       'exif-gpsmeasuremode' => '',
-       'exif-gpsspeed' => 'Pseudotags used for GPSSpeedRef',
-       'exif-gpsdestdistanceref' => 'Pseudotags used for GPSDestDistanceRef',
-       'exif-gdop' => '',
-       'exif-objectcycle' => '',
-       'exif-gpsdirection' => 'Pseudotags used for GPSTrackRef, GPSImgDirectionRef and GPSDestBearingRef',
-       'exif-ycbcrpositioning' => '',
-       'exif-dc' => '',
-       'exif-rating' => '',
-       'exif-isospeedratings' => '',
-       'exif-maxaperturevalue' => '',
-       'exif-iimcategory' => '',
-       'exif-urgency' => '',
-       'all' => "'all' in various places, this might be different for inflected languages",
-       'confirmemail' => 'Email address confirmation',
-       'scarytransclusion' => 'Scary transclusion',
-       'deleteconflict' => 'Delete conflict',
-       'unit-pixel' => '',
-       'purge' => 'action=purge',
-       'watch-unwatch' => 'action=watch/unwatch',
-       'separators' => 'Separators for various lists, etc.',
-       'imgmulti' => 'Multipage image navigation',
-       'img-lang' => 'Language selector for translatable SVGs',
-       'tablepager' => 'Table pager',
-       'autosumm' => 'Auto-summaries',
-       'autoblock_whitelist' => 'Autoblock whitelist',
-       'sizeunits' => 'Size units',
-       'bitrateunits' => 'Bitrate units',
-       'livepreview' => 'Live preview',
-       'lagwarning' => 'Friendlier slave lag warnings',
-       'watchlisteditor' => 'Watchlist editor',
-       'watchlisttools' => 'Watchlist editing tools',
-       'iranian-dates' => 'Iranian month names',
-       'hijri-dates' => 'Hijri month names',
-       'hebrew-dates' => 'Hebrew month names',
-       'signatures' => 'Signatures',
-       'CoreParserFunctions' => 'Core parser functions',
-       'version' => 'Special:Version',
-       'redirect' => 'Special:Redirect',
-       'fileduplicatesearch' => 'Special:FileDuplicateSearch',
-       'special-specialpages' => 'Special:SpecialPages',
-       'special-blank' => 'Special:BlankPage',
-       'external_images' => 'External image whitelist',
-       'special-tags' => 'Special:Tags',
-       'comparepages' => 'Special:ComparePages',
-       'db-error-messages' => 'Database error messages',
-       'html-forms' => 'HTML forms',
-       'sqlite' => 'SQLite database support',
-       'logging' => 'New logging system',
-       'logging-irc' => 'For IRC, see bug 34508. Do not change',
-       'feedback' => 'Feedback',
-       'searchsuggestions' => 'Search suggestions',
-       'apierrors' => 'API errors',
-       'duration' => 'Durations',
-       'cachedspecial' => 'SpecialCachedPage',
-       'rotation' => 'Image rotation',
-       'limitreport' => 'Limit report',
-       'expandtemplates' => 'Special:ExpandTemplates',
-       'trackingcategories' => 'Special:TrackingCategories'
-);
diff --git a/maintenance/language/rebuildLanguage.php b/maintenance/language/rebuildLanguage.php
deleted file mode 100644 (file)
index ea55a8e..0000000
+++ /dev/null
@@ -1,156 +0,0 @@
-<?php
-/**
- * Rewrite the messages array in the files languages/messages/MessagesXx.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 MaintenanceLanguage
- * @defgroup MaintenanceLanguage MaintenanceLanguage
- */
-
-require_once __DIR__ . '/../commandLine.inc';
-require_once 'languages.inc';
-require_once 'writeMessagesArray.inc';
-
-/**
- * Rewrite a messages array.
- *
- * @param Languages $languages
- * @param string $code The language code.
- * @param bool $write Write to the messages file?
- * @param bool $listUnknown List the unknown messages?
- * @param bool $removeUnknown Remove the unknown messages?
- * @param bool $removeDupes Remove the duplicated messages?
- * @param string $dupeMsgSource The source file intended to remove from the array.
- * @param string $messagesFolder Path to a folder to store the MediaWiki messages.
- */
-function rebuildLanguage( $languages, $code, $write, $listUnknown, $removeUnknown,
-       $removeDupes, $dupeMsgSource, $messagesFolder
-) {
-       $messages = $languages->getMessages( $code );
-       $messages = $messages['all'];
-       if ( $removeDupes ) {
-               $messages = removeDupes( $messages, $dupeMsgSource );
-       }
-       MessageWriter::writeMessagesToFile(
-               $messages,
-               $code,
-               $write,
-               $listUnknown,
-               $removeUnknown,
-               $messagesFolder
-       );
-}
-
-/**
- * Remove duplicates from a message array.
- *
- * @param array $oldMsgArray The input message array.
- * @param string $dupeMsgSource The source file path for duplicates.
- * @return array The output message array, with duplicates removed.
- */
-function removeDupes( $oldMsgArray, $dupeMsgSource ) {
-       if ( file_exists( $dupeMsgSource ) ) {
-               include $dupeMsgSource;
-               if ( !isset( $dupeMessages ) ) {
-                       echo "There are no duplicated messages in the source file provided.";
-                       exit( 1 );
-               }
-       } else {
-               echo "The specified file $dupeMsgSource cannot be found.";
-               exit( 1 );
-       }
-       $newMsgArray = $oldMsgArray;
-       foreach ( $oldMsgArray as $key => $value ) {
-               if ( array_key_exists( $key, $dupeMessages ) ) {
-                       unset( $newMsgArray[$key] );
-               }
-       }
-
-       return $newMsgArray;
-}
-
-# Show help
-if ( isset( $options['help'] ) ) {
-       echo <<<TEXT
-Run this script to rewrite the messages array in the files
-languages/messages/MessagesXX.php.
-Parameters:
-       * lang: Language code (default: the installation default language).
-         You can also specify "all" to check all the languages.
-       * help: Show this help.
-Options:
-       * dry-run: Do not write the array to the file.
-       * no-unknown: Do not list the unknown messages.
-       * remove-unknown: Remove unknown messages.
-       * remove-duplicates: Remove duplicated messages based on a PHP source file.
-       * messages-folder: An alternative folder with MediaWiki messages.
-
-TEXT;
-       exit( 1 );
-}
-
-# Get the language code
-if ( isset( $options['lang'] ) ) {
-       $wgCode = $options['lang'];
-} else {
-       $wgCode = $wgContLang->getCode();
-}
-
-# Get the duplicate message source
-if ( isset( $options['remove-duplicates'] ) && ( strcmp( $options['remove-duplicates'], '' ) ) ) {
-       $wgDupeMessageSource = $options['remove-duplicates'];
-} else {
-       $wgDupeMessageSource = '';
-}
-
-# Get the options
-$wgWriteToFile = !isset( $options['dry-run'] );
-$wgListUnknownMessages = !isset( $options['no-unknown'] );
-$wgRemoveUnknownMessages = isset( $options['remove-unknown'] );
-$wgRemoveDuplicateMessages = isset( $options['remove-duplicates'] );
-$messagesFolder = isset( $options['messages-folder'] ) ? $options['messages-folder'] : false;
-
-# Get language objects
-$languages = new Languages();
-
-# Write all the language
-if ( $wgCode == 'all' ) {
-       foreach ( $languages->getLanguages() as $languageCode ) {
-               rebuildLanguage(
-                       $languages,
-                       $languageCode,
-                       $wgWriteToFile,
-                       $wgListUnknownMessages,
-                       $wgRemoveUnknownMessages,
-                       $wgRemoveDuplicateMessages,
-                       $wgDupeMessageSource,
-                       $messagesFolder
-               );
-       }
-} else {
-       rebuildLanguage(
-               $languages,
-               $wgCode,
-               $wgWriteToFile,
-               $wgListUnknownMessages,
-               $wgRemoveUnknownMessages,
-               $wgRemoveDuplicateMessages,
-               $wgDupeMessageSource,
-               $messagesFolder
-       );
-}
diff --git a/maintenance/language/validate.php b/maintenance/language/validate.php
deleted file mode 100644 (file)
index f1b4079..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-<?php
-/**
- * Check language files for unrecognised variables.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup MaintenanceLanguage
- */
-
-if ( PHP_SAPI != 'cli' ) {
-       die( "Run me from the command line please.\n" );
-}
-
-if ( !isset( $argv[1] ) ) {
-       print "Usage: php {$argv[0]} <filename>\n";
-       exit( 1 );
-}
-array_shift( $argv );
-
-define( 'MEDIAWIKI', 1 );
-define( 'NOT_REALLY_MEDIAWIKI', 1 );
-
-$IP = __DIR__ . '/../..';
-
-require_once "$IP/includes/Defines.php";
-require_once "$IP/languages/Language.php";
-
-$files = array();
-foreach ( $argv as $arg ) {
-       $files = array_merge( $files, glob( $arg ) );
-}
-
-foreach ( $files as $filename ) {
-       print "$filename...";
-       $vars = getVars( $filename );
-       $keys = array_keys( $vars );
-       $diff = array_diff( $keys, Language::$mLocalisationKeys );
-       if ( $diff ) {
-               print "\nWarning: unrecognised variable(s): " . implode( ', ', $diff ) . "\n";
-       } else {
-               print " ok\n";
-       }
-}
-
-function getVars( $filename ) {
-       require $filename;
-       $vars = get_defined_vars();
-       unset( $vars['filename'] );
-
-       return $vars;
-}
diff --git a/maintenance/language/writeMessagesArray.inc b/maintenance/language/writeMessagesArray.inc
deleted file mode 100644 (file)
index aa2067e..0000000
+++ /dev/null
@@ -1,306 +0,0 @@
-<?php
-/**
- * Write a messages array as a PHP text.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup MaintenanceLanguage
- */
-
-/**
- * @ingroup MaintenanceLanguage
- */
-class MessageWriter {
-       protected static $optionalComment =
-               'only translate this message to other languages if you have to change it';
-       protected static $ignoredComment = "do not translate or duplicate this message to other languages";
-
-       protected static $messageStructure;
-       protected static $blockComments;
-       protected static $ignoredMessages;
-       protected static $optionalMessages;
-
-       /**
-        * Write a messages array as a PHP text and write it to the messages file.
-        *
-        * @param array $messages The messages array.
-        * @param string $code The language code.
-        * @param bool $write Write to the messages file?
-        * @param bool $listUnknown List the unknown messages?
-        * @param bool $removeUnknown Whether to remove unkown messages
-        * @param string $messagesFolder Path to a folder to store the MediaWiki messages.
-        *   Defaults to the current install.
-        */
-       public static function writeMessagesToFile( $messages, $code, $write, $listUnknown,
-               $removeUnknown, $messagesFolder = false
-       ) {
-               # Rewrite the messages array
-               $messages = self::writeMessagesArray( $messages, $code == 'en', false, $removeUnknown );
-               $messagesText = $messages[0];
-               $sortedMessages = $messages[1];
-
-               # Write to the file
-               if ( $messagesFolder ) {
-                       $filename = Language::getFileName( "$messagesFolder/Messages", $code );
-               } else {
-                       $filename = Language::getMessagesFileName( $code );
-               }
-
-               if ( file_exists( $filename ) ) {
-                       $contents = file_get_contents( $filename );
-               } else {
-                       $contents = '<?php
-$messages = array(
-);
-';
-               }
-
-               if ( strpos( $contents, '$messages' ) !== false ) {
-                       $contents = explode( '$messages', $contents );
-                       if ( $messagesText == '$messages' . $contents[1] ) {
-                               echo "Generated messages for language $code. Same as the current file.\n";
-                       } else {
-                               if ( $write ) {
-                                       $new = $contents[0];
-                                       $new .= $messagesText;
-                                       file_put_contents( $filename, $new );
-                                       echo "Generated and wrote messages for language $code.\n";
-                               } else {
-                                       echo "Generated messages for language $code.\n" .
-                                               "Please run the script again (without the parameter \"dry-run\") " .
-                                               "to write the array to the file.\n";
-                               }
-                       }
-                       if ( $listUnknown && isset( $sortedMessages['unknown'] ) &&
-                               !empty( $sortedMessages['unknown'] )
-                       ) {
-                               if ( $removeUnknown ) {
-                                       echo "\nThe following " . count( $sortedMessages['unknown'] ) .
-                                               " unknown messages have been removed:\n";
-                               } else {
-                                       echo "\nThere are " . count( $sortedMessages['unknown'] ) .
-                                               " unknown messages, please check them:\n";
-                               }
-                               foreach ( $sortedMessages['unknown'] as $key => $value ) {
-                                       echo "* " . $key . "\n";
-                               }
-                       }
-               } else {
-                       echo "Generated messages for language $code. There seem to be no messages array in the file.\n";
-               }
-       }
-
-       /**
-        * Write a messages array as a PHP text.
-        *
-        * @param array $messages The messages array.
-        * @param bool $ignoredComments Show comments about ignored and optional
-        *   messages? (For English.)
-        * @param string $prefix Base path for messages.inc and messageTypes.inc files
-        *   or false for default path (this directory)
-        * @param bool $removeUnknown Whether to remove unkown messages
-        *
-        * @return array Array of the PHP text and the sorted messages array.
-        */
-       public static function writeMessagesArray( $messages, $ignoredComments = false,
-               $prefix = false, $removeUnknown = false
-       ) {
-               # Load messages
-               $dir = $prefix ? $prefix : __DIR__;
-
-               require $dir . '/messages.inc';
-               self::$messageStructure = $wgMessageStructure;
-               self::$blockComments = $wgBlockComments;
-
-               require $dir . '/messageTypes.inc';
-               self::$ignoredMessages = $wgIgnoredMessages;
-               self::$optionalMessages = $wgOptionalMessages;
-
-               # Sort messages to blocks
-               $sortedMessages['unknown'] = $messages;
-               foreach ( self::$messageStructure as $blockName => $block ) {
-                       /**
-                        * @var $block array
-                        */
-                       foreach ( $block as $key ) {
-                               if ( array_key_exists( $key, $sortedMessages['unknown'] ) ) {
-                                       $sortedMessages[$blockName][$key] = $sortedMessages['unknown'][$key];
-                                       unset( $sortedMessages['unknown'][$key] );
-                               }
-                       }
-               }
-
-               # Write all the messages
-               $messagesText = "\$messages = array(
-";
-               foreach ( $sortedMessages as $block => $messages ) {
-                       # Skip if it's the block of unknown messages - handle that in the end of file
-                       if ( $block == 'unknown' ) {
-                               continue;
-                       }
-
-                       if ( $ignoredComments ) {
-                               $ignored = self::$ignoredMessages;
-                               $optional = self::$optionalMessages;
-                       } else {
-                               $ignored = array();
-                               $optional = array();
-                       }
-                       $comments = self::makeComments( array_keys( $messages ), $ignored, $optional );
-
-                       # Write the block
-                       $messagesText .= self::writeMessagesBlock( self::$blockComments[$block], $messages, $comments );
-               }
-
-               # Write the unknown messages, alphabetically sorted.
-               # Of course, we don't have any comments for them, because they are unknown.
-               if ( !$removeUnknown ) {
-                       ksort( $sortedMessages['unknown'] );
-                       $messagesText .= self::writeMessagesBlock( 'Unknown messages', $sortedMessages['unknown'] );
-               }
-               $messagesText .= ");
-";
-
-               return array( $messagesText, $sortedMessages );
-       }
-
-       /**
-        * Generates an array of comments for messages.
-        *
-        * @param array $messages Key of messages.
-        * @param array $ignored List of ingored message keys.
-        * @param array $optional List of optional message keys.
-        * @return array
-        */
-       public static function makeComments( $messages, $ignored, $optional ) {
-               # Comment collector
-               $commentArray = array();
-
-               # List of keys only
-               foreach ( $messages as $key ) {
-                       if ( in_array( $key, $ignored ) ) {
-                               $commentArray[$key] = ' # ' . self::$ignoredComment;
-                       } elseif ( in_array( $key, $optional ) ) {
-                               $commentArray[$key] = ' # ' . self::$optionalComment;
-                       }
-               }
-
-               return $commentArray;
-       }
-
-       /**
-        * Write a block of messages to PHP.
-        *
-        * @param string $blockComment The comment of whole block.
-        * @param array $messages The block messages.
-        * @param array $messageComments Optional comments for messages in this block.
-        * @param string $prefix Prefix for every line, for indenting purposes.
-        *
-        * @return string The block, formatted in PHP.
-        */
-       public static function writeMessagesBlock( $blockComment, $messages,
-               $messageComments = array(), $prefix = '' ) {
-
-               $blockText = '';
-
-               # Skip the block if it includes no messages
-               if ( empty( $messages ) ) {
-                       return '';
-               }
-
-               # Format the block comment (if exists); check for multiple lines comments
-               if ( !empty( $blockComment ) ) {
-                       if ( strpos( $blockComment, "\n" ) === false ) {
-                               $blockText .= "$prefix# $blockComment
-";
-                       } else {
-                               $blockText .= "$prefix/*
-$blockComment
-*/
-";
-                       }
-               }
-
-               # Get max key length
-               $maxKeyLength = max( array_map( 'strlen', array_keys( $messages ) ) );
-
-               # Format the messages
-               foreach ( $messages as $key => $value ) {
-                       # Add the key name
-                       $blockText .= "$prefix'$key'";
-
-                       # Add the appropriate block whitespace
-                       $blockText .= str_repeat( ' ', $maxKeyLength - strlen( $key ) );
-
-                       # Refer to the value
-                       $blockText .= ' => ';
-
-                       # Check for the appropriate apostrophe and add the value
-                       # Quote \ here, because it needs always escaping
-                       $value = addcslashes( $value, '\\' );
-
-                       # For readability
-                       $single = "'";
-                       $double = '"';
-
-                       if ( strpos( $value, $single ) === false ) {
-                               # Nothing ugly, just use '
-                               $blockText .= $single . $value . $single;
-                       } elseif ( strpos( $value, $double ) === false &&
-                               !preg_match( '/\$[a-zA-Z_\x7f-\xff]/', $value )
-                       ) {
-                               # No "-quotes, no variables that need quoting, use "
-                               $blockText .= $double . $value . $double;
-                       } else {
-                               # Something needs quoting, pick the quote which causes less quoting
-
-                               if ( substr_count( $value, $double ) + substr_count( $value, '$' ) >=
-                                       substr_count( $value, $single )
-                               ) {
-                                       $quote = $single;
-                               } else {
-                                       $quote = $double;
-                               }
-
-                               if ( $quote === $double ) {
-                                       $extra = '$';
-                               } else {
-                                       $extra = '';
-                               }
-                               $blockText .= $quote . addcslashes( $value, $quote . $extra ) . $quote;
-                       }
-
-                       # Comma
-                       $blockText .= ',';
-
-                       # Add comments, if there is any
-                       if ( array_key_exists( $key, $messageComments ) ) {
-                               $blockText .= $messageComments[$key];
-                       }
-
-                       # Newline
-                       $blockText .= "
-";
-               }
-
-               # Newline to end the block
-               $blockText .= "
-";
-
-               return $blockText;
-       }
-}
index 243f97c..da49e55 100644 (file)
@@ -67,7 +67,7 @@ class McTest extends Maintenance {
                foreach ( $servers as $server ) {
                        $this->output(
                                str_pad( $server, $maxSrvLen ),
-                               $server  # output channel
+                               $server # output channel
                        );
 
                        $mcc = new MemCachedClientforWiki( array(
@@ -107,6 +107,7 @@ class McTest extends Maintenance {
         */
        private function microtime_float() {
                list( $usec, $sec ) = explode( " ", microtime() );
+
                return ( (float)$usec + (float)$sec );
        }
 }
index a63c45b..2a6f8a8 100644 (file)
@@ -43,7 +43,12 @@ class MergeMessageFileList extends Maintenance {
 
        function __construct() {
                parent::__construct();
-               $this->addOption( 'list-file', 'A file containing a list of extension setup files, one per line.', false, true );
+               $this->addOption(
+                       'list-file',
+                       'A file containing a list of extension setup files, one per line.',
+                       false,
+                       true
+               );
                $this->addOption( 'extensions-dir', 'Path where extensions can be found.', false, true );
                $this->addOption( 'output', 'Send output to this file (omit for stdout)', false, true );
                $this->mDescription = 'Merge $wgExtensionMessagesFiles and $wgMessagesDirs from ' .
@@ -51,7 +56,10 @@ class MergeMessageFileList extends Maintenance {
        }
 
        public function execute() {
-               global $mmfl, $wgExtensionEntryPointListFiles;
+               // @codingStandardsIgnoreStart Ignore error: Global variable "$mmfl" is lacking 'wg' prefix
+               global $mmfl;
+               // @codingStandardsIgnoreEnd
+               global $wgExtensionEntryPointListFiles;
 
                if ( !count( $wgExtensionEntryPointListFiles )
                        && !$this->hasOption( 'list-file' )
@@ -117,6 +125,7 @@ class MergeMessageFileList extends Maintenance {
                if ( $fileLines === false ) {
                        $this->hasError = true;
                        $this->error( "Unable to open list file $fileName." );
+
                        return $files;
                }
                # Strip comments, discard empty lines, and trim leading and trailing
@@ -134,6 +143,7 @@ class MergeMessageFileList extends Maintenance {
                                }
                        }
                }
+
                return $files;
        }
 }
index ec936c8..efecaad 100644 (file)
@@ -49,7 +49,6 @@ class MinifyScript extends Maintenance {
                $this->mDescription = "Minify a file or set of files.\n\n" .
                        "If --outfile is not specified, then the output file names will have a .min extension\n" .
                        "added, e.g. jquery.js -> jquery.min.js.";
-
        }
 
        public function execute() {
@@ -66,6 +65,7 @@ class MinifyScript extends Maintenance {
 
                        // Minify one file
                        $this->minify( $this->getArg( 0 ), $this->getOption( 'outfile' ) );
+
                        return;
                }
 
@@ -103,6 +103,7 @@ class MinifyScript extends Maintenance {
                        $this->error( "No file extension, cannot determine type: $fileName" );
                        exit( 1 );
                }
+
                return substr( $fileName, $dotPos + 1 );
        }
 
index 5171b17..713753f 100644 (file)
@@ -82,7 +82,9 @@ class MoveBatch extends Maintenance {
 
                # Setup complete, now start
                $dbw = wfGetDB( DB_MASTER );
+               // @codingStandardsIgnoreStart Ignore avoid function calls in a FOR loop test part warning
                for ( $linenum = 1; !feof( $file ); $linenum++ ) {
+                       // @codingStandardsIgnoreEnd
                        $line = fgets( $file );
                        if ( $line === false ) {
                                break;
diff --git a/maintenance/mssql/archives/patch-user_password_expires.sql b/maintenance/mssql/archives/patch-user_password_expires.sql
new file mode 100644 (file)
index 0000000..c22b10c
--- /dev/null
@@ -0,0 +1 @@
+ALTER TABLE /*_*/mwuser ADD user_password_expires VARCHAR(14) DEFAULT NULL
\ No newline at end of file
index 4a3cdea..fb8db08 100644 (file)
@@ -45,8 +45,8 @@ CREATE TABLE /*_*/mwuser (
    user_email_token  NCHAR(32) DEFAULT '',
    user_email_token_expires varchar(14) DEFAULT NULL,
    user_registration varchar(14) DEFAULT NULL,
-   user_editcount    INT NULL DEFAULT NULL
-   user_password_expires DATETIME DEFAULT NULL
+   user_editcount    INT NULL DEFAULT NULL,
+   user_password_expires varchar(14) DEFAULT NULL
 );
 CREATE UNIQUE INDEX /*i*/user_name ON /*_*/mwuser (user_name);
 CREATE INDEX /*i*/user_email_token ON /*_*/mwuser (user_email_token);
index b22dd88..ee0ff01 100644 (file)
@@ -152,15 +152,13 @@ You might want to delete the temporary file:
 ---------------------------------------------------
 
 TEXT
-       );
+               );
 
                if ( $exitcode !== 0 ) {
                        $this->error( "Something went wrong (exit: $exitcode)\n",
                                $exitcode );
                }
-
        }
-
 }
 
 $maintClass = 'MWDocGen';
index 442163e..5247637 100755 (executable)
@@ -1,4 +1,5 @@
 #!/usr/bin/env bash
+set -e
 
 JSDUCK_MWVERSION=master
 if [[ "$1" == "--version" && "$2" != "" ]]
@@ -14,18 +15,11 @@ fi
 
 MWCORE_DIR=$(cd $(dirname $0)/..; pwd)
 
-# Support jsduck 4.x and 5.x
-JSDUCK_VERSION="$(jsduck --version | sed -e 's/[.].*//')"
-if [  "$JSDUCK_VERSION" = "JSDuck 4" ]; then
-       JSDUCK_VERSION_OPT="--meta-tags $MWCORE_DIR/maintenance/jsduck/MetaTags.rb --warnings=-no_doc"
-else
-       JSDUCK_VERSION_OPT="--tags $MWCORE_DIR/maintenance/jsduck/CustomTags.rb --warnings=-nodoc(class,public)"
-fi
-
 jsduck \
 --config=$MWCORE_DIR/maintenance/jsduck/config.json \
-$JSDUCK_VERSION_OPT \
 --footer="Documentation for branch ($JSDUCK_MWVERSION) on {DATE} by {JSDUCK} {VERSION}." \
---processes 0 --warnings-exit-nonzero \
-&& echo 'JSDuck execution finished.' \
-&& ln -s ../../resources $MWCORE_DIR/docs/js/modules
+--processes 0
+
+echo 'JSDuck execution finished.'
+
+ln -s ../../resources $MWCORE_DIR/docs/js/modules
index 5fc972c..a152091 100644 (file)
@@ -44,9 +44,9 @@ class NamespaceConflictChecker extends Maintenance {
                $this->mDescription = "";
                $this->addOption( 'fix', 'Attempt to automatically fix errors' );
                $this->addOption( 'suffix', "Dupes will be renamed with correct namespace with " .
-                                                                       "<text> appended after the article name", false, true );
+                       "<text> appended after the article name", false, true );
                $this->addOption( 'prefix', "Do an explicit check for the given title prefix " .
-                                                                       "appended after the article name", false, true );
+                       "appended after the article name", false, true );
        }
 
        public function execute() {
@@ -138,6 +138,7 @@ class NamespaceConflictChecker extends Maintenance {
                foreach ( $spaces as $name => $ns ) {
                        $ok = $this->checkNamespace( $ns, $name, $fix, $suffix ) && $ok;
                }
+
                return $ok;
        }
 
@@ -152,6 +153,7 @@ class NamespaceConflictChecker extends Maintenance {
                foreach ( $result as $row ) {
                        $prefixes[] = $row['iw_prefix'];
                }
+
                return $prefixes;
        }
 
@@ -178,6 +180,7 @@ class NamespaceConflictChecker extends Maintenance {
                                $ok = $this->resolveConflict( $row, $resolvable, $suffix ) && $ok;
                        }
                }
+
                return $ok;
        }
 
@@ -191,6 +194,7 @@ class NamespaceConflictChecker extends Maintenance {
         */
        private function checkPrefix( $key, $prefix, $fix, $suffix = '' ) {
                $this->output( "Checking prefix \"$prefix\" vs namespace $key\n" );
+
                return $this->checkNamespace( $key, $prefix, $fix, $suffix );
        }
 
@@ -231,6 +235,7 @@ class NamespaceConflictChecker extends Maintenance {
                foreach ( $result as $row ) {
                        $set[] = $row;
                }
+
                return $set;
        }
 
@@ -251,6 +256,7 @@ class NamespaceConflictChecker extends Maintenance {
                                $row->oldnamespace,
                                $row->oldtitle ) );
                        $this->output( "...  *** cannot resolve automatically; illegal title ***\n" );
+
                        return false;
                }
 
@@ -265,6 +271,7 @@ class NamespaceConflictChecker extends Maintenance {
                $id = $newTitle->getArticleID();
                if ( $id ) {
                        $this->output( "...  *** cannot resolve automatically; page exists with ID $id ***\n" );
+
                        return false;
                } else {
                        return true;
@@ -288,6 +295,7 @@ class NamespaceConflictChecker extends Maintenance {
                                $title = Title::makeTitleSafe( $row->namespace, $row->title );
                                if ( !$title ) {
                                        $this->output( "... !!! invalid title\n" );
+
                                        return false;
                                }
                                $id = $title->getArticleID();
@@ -300,6 +308,7 @@ class NamespaceConflictChecker extends Maintenance {
                        $this->output( "...  *** using suffixed form [[" . $title->getPrefixedText() . "]] ***\n" );
                }
                $this->resolveConflictOn( $row, 'page', 'page' );
+
                return true;
        }
 
@@ -326,6 +335,7 @@ class NamespaceConflictChecker extends Maintenance {
                        ),
                        __METHOD__ );
                $this->output( "ok.\n" );
+
                return true;
        }
 }
index 479dcf7..64bf1b6 100644 (file)
@@ -91,7 +91,7 @@ class NukeNS extends Maintenance {
                                        $child = $this->runChild( 'NukePage', 'nukePage.php' );
                                        $child->deleteRevisions( $revs );
                                        $this->purgeRedundantText( true );
-                                       $n_deleted ++;
+                                       $n_deleted++;
                                }
                        } else {
                                $this->output( "skip: " . $title->getPrefixedText() . "\n" );
index 435625d..eea6f7b 100644 (file)
@@ -44,6 +44,7 @@ class AlterSharedConstraints extends Maintenance {
 
                if ( $wgSharedDB == null ) {
                        $this->output( "Database sharing is not enabled\n" );
+
                        return;
                }
 
@@ -56,35 +57,38 @@ class AlterSharedConstraints extends Maintenance {
                                $ltable = "{$wgDBprefix}{$stable}";
                        }
 
-                       $result = $dbw->query( "SELECT uc.constraint_name, uc.table_name, ucc.column_name, uccpk.table_name pk_table_name, uccpk.column_name pk_column_name, uc.delete_rule, uc.deferrable, uc.deferred
-                                         FROM user_constraints uc, user_cons_columns ucc, user_cons_columns uccpk
-                                        WHERE uc.constraint_type = 'R'
-                                          AND ucc.constraint_name = uc.constraint_name
-                                          AND uccpk.constraint_name = uc.r_constraint_name
-                                          AND uccpk.table_name = '$ltable'" );
+                       $result = $dbw->query( "SELECT uc.constraint_name, uc.table_name, ucc.column_name,
+                                               uccpk.table_name pk_table_name, uccpk.column_name pk_column_name,
+                                               uc.delete_rule, uc.deferrable, uc.deferred
+                                       FROM user_constraints uc, user_cons_columns ucc, user_cons_columns uccpk
+                                       WHERE uc.constraint_type = 'R'
+                                               AND ucc.constraint_name = uc.constraint_name
+                                               AND uccpk.constraint_name = uc.r_constraint_name
+                                               AND uccpk.table_name = '$ltable'" );
                        while ( ( $row = $result->fetchRow() ) !== false ) {
 
-                                       $this->output( "Altering {$row['constraint_name']} ..." );
+                               $this->output( "Altering {$row['constraint_name']} ..." );
 
-                                       try {
-                                               $dbw->query( "ALTER TABLE {$row['table_name']} DROP CONSTRAINT {$wgDBprefix}{$row['constraint_name']}" );
-                                       } catch ( DBQueryError $exdb ) {
-                                               if ( $exdb->errno != 2443 ) {
-                                                       throw $exdb;
-                                               }
+                               try {
+                                       $dbw->query( "ALTER TABLE {$row['table_name']}
+                                                       DROP CONSTRAINT {$wgDBprefix}{$row['constraint_name']}" );
+                               } catch ( DBQueryError $exdb ) {
+                                       if ( $exdb->errno != 2443 ) {
+                                               throw $exdb;
                                        }
+                               }
 
-                                       $deleteRule = $row['delete_rule'] == 'NO ACTION' ? '' : "ON DELETE {$row['delete_rule']}";
-                                       $dbw->query( "ALTER TABLE {$row['table_name']} ADD CONSTRAINT {$wgDBprefix}{$row['constraint_name']}
+                               $deleteRule = $row['delete_rule'] == 'NO ACTION' ? '' : "ON DELETE {$row['delete_rule']}";
+                               $dbw->query( "ALTER TABLE {$row['table_name']}
+                                               ADD CONSTRAINT {$wgDBprefix}{$row['constraint_name']}
                                                FOREIGN KEY ({$row['column_name']})
                                                REFERENCES {$wgSharedDB}.$stable({$row['pk_column_name']})
                                                {$deleteRule} {$row['deferrable']} INITIALLY {$row['deferred']}" );
 
-                                       $this->output( "DONE\n" );
+                               $this->output( "DONE\n" );
                        }
                }
        }
-
 }
 
 $maintClass = "AlterSharedConstraints";
diff --git a/maintenance/oracle/archives/patch-page_links_updated.sql b/maintenance/oracle/archives/patch-page_links_updated.sql
new file mode 100644 (file)
index 0000000..5360329
--- /dev/null
@@ -0,0 +1,4 @@
+define mw_prefix='{$wgDBprefix}';
+
+ALTER TABLE &mw_prefix.page ADD page_links_updated TIMESTAMP(6) WITH TIME ZONE;
+
diff --git a/maintenance/oracle/archives/patch-rc_source.sql b/maintenance/oracle/archives/patch-rc_source.sql
new file mode 100644 (file)
index 0000000..0c80afa
--- /dev/null
@@ -0,0 +1,3 @@
+define mw_prefix='{$wgDBprefix}';
+
+ALTER TABLE &mw_prefix.recentchanges ADD rc_source VARCHAR2(16);
index 8e752da..824cc82 100644 (file)
@@ -1,3 +1,3 @@
 define mw_prefix='{$wgDBprefix}';
 
-ALTER TABLE &mw_prefix.mwuser ADD user_password_expires TIMESTAMP(6) WITH TIME ZONE NULL DEFAULT NULL;
+ALTER TABLE &mw_prefix.mwuser ADD user_password_expires TIMESTAMP(6) WITH TIME ZONE;
index f05c0cc..ff84858 100644 (file)
@@ -19,7 +19,7 @@ CREATE TABLE &mw_prefix.mwuser ( -- replace reserved word 'user'
   user_touched              TIMESTAMP(6) WITH TIME ZONE,
   user_registration         TIMESTAMP(6) WITH TIME ZONE,
   user_editcount            NUMBER,
-  user_password_expires     TIMESTAMP(6) WITH TIME ZONE NULL DEFAULT NULL
+  user_password_expires     TIMESTAMP(6) WITH TIME ZONE
 );
 ALTER TABLE &mw_prefix.mwuser ADD CONSTRAINT &mw_prefix.mwuser_pk PRIMARY KEY (user_id);
 CREATE UNIQUE INDEX &mw_prefix.mwuser_u01 ON &mw_prefix.mwuser (user_name);
@@ -28,7 +28,8 @@ CREATE INDEX &mw_prefix.mwuser_i02 ON &mw_prefix.mwuser (user_email, user_name);
 
 -- Create a dummy user to satisfy fk contraints especially with revisions
 INSERT INTO &mw_prefix.mwuser
-  VALUES (0,'Anonymous',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, '', current_timestamp, current_timestamp, 0);
+  (user_id, user_name, user_options, user_touched, user_registration, user_editcount)
+  VALUES (0,'Anonymous','', current_timestamp, current_timestamp,0);
 
 CREATE TABLE &mw_prefix.user_groups (
   ug_user   NUMBER      DEFAULT 0 NOT NULL,
@@ -73,6 +74,7 @@ CREATE TABLE &mw_prefix.page (
   page_is_new        CHAR(1)           DEFAULT '0' NOT NULL,
   page_random        NUMBER(15,14) NOT NULL,
   page_touched       TIMESTAMP(6) WITH TIME ZONE,
+  page_links_updated TIMESTAMP(6) WITH TIME ZONE,
   page_latest        NUMBER        DEFAULT 0 NOT NULL, -- FK?
   page_len           NUMBER        DEFAULT 0 NOT NULL,
   page_content_model VARCHAR2(32)
@@ -85,7 +87,7 @@ CREATE INDEX &mw_prefix.page_i03 ON &mw_prefix.page (page_is_redirect, page_name
 
 -- Create a dummy page to satisfy fk contraints especially with revisions
 INSERT INTO &mw_prefix.page
-  VALUES (0, 0, ' ', NULL, 0, 0, 0, 0, current_timestamp, 0, 0, NULL);
+  VALUES (0, 0, ' ', NULL, 0, 0, 0, 0, current_timestamp, NULL, 0, 0, NULL);
 
 /*$mw$*/
 CREATE TRIGGER &mw_prefix.page_set_random BEFORE INSERT ON &mw_prefix.page
@@ -403,7 +405,7 @@ CREATE SEQUENCE recentchanges_rc_id_seq;
 CREATE TABLE &mw_prefix.recentchanges (
   rc_id              NUMBER      NOT NULL,
   rc_timestamp       TIMESTAMP(6) WITH TIME ZONE  NOT NULL,
-  rc_cur_time        TIMESTAMP(6) WITH TIME ZONE  NOT NULL,
+  rc_cur_time        TIMESTAMP(6) WITH TIME ZONE,
   rc_user            NUMBER          DEFAULT 0 NOT NULL,
   rc_user_text       VARCHAR2(255)         NOT NULL,
   rc_namespace       NUMBER     DEFAULT 0 NOT NULL,
@@ -416,6 +418,7 @@ CREATE TABLE &mw_prefix.recentchanges (
   rc_this_oldid      NUMBER      DEFAULT 0 NOT NULL,
   rc_last_oldid      NUMBER      DEFAULT 0 NOT NULL,
   rc_type            CHAR(1)         DEFAULT '0' NOT NULL,
+  rc_source                                     VARCHAR2(16),
   rc_patrolled       CHAR(1)         DEFAULT '0' NOT NULL,
   rc_ip              VARCHAR2(15),
   rc_old_len         NUMBER,
index 044003e..7e27107 100644 (file)
@@ -40,9 +40,9 @@ class Orphans extends Maintenance {
        public function __construct() {
                parent::__construct();
                $this->mDescription = "Look for 'orphan' revisions hooked to pages which don't exist\n" .
-                                                               "and 'childless' pages with no revisions\n" .
-                                                               "Then, kill the poor widows and orphans\n" .
-                                                               "Man this is depressing";
+                       "and 'childless' pages with no revisions\n" .
+                       "Then, kill the poor widows and orphans\n" .
+                       "Man this is depressing";
                $this->addOption( 'fix', 'Actually fix broken entries' );
        }
 
@@ -79,7 +79,8 @@ class Orphans extends Maintenance {
                        $this->lockTables( $dbw );
                }
 
-               $this->output( "Checking for orphan revision table entries... (this may take a while on a large wiki)\n" );
+               $this->output( "Checking for orphan revision table entries... "
+                       . "(this may take a while on a large wiki)\n" );
                $result = $dbw->query( "
                        SELECT *
                        FROM $revision LEFT OUTER JOIN $page ON rev_page=page_id
@@ -88,8 +89,13 @@ class Orphans extends Maintenance {
                $orphans = $result->numRows();
                if ( $orphans > 0 ) {
                        global $wgContLang;
+
                        $this->output( "$orphans orphan revisions...\n" );
-                       $this->output( sprintf( "%10s %10s %14s %20s %s\n", 'rev_id', 'rev_page', 'rev_timestamp', 'rev_user_text', 'rev_comment' ) );
+                       $this->output( sprintf(
+                               "%10s %10s %14s %20s %s\n",
+                               'rev_id', 'rev_page', 'rev_timestamp', 'rev_user_text', 'rev_comment'
+                       ) );
+
                        foreach ( $result as $row ) {
                                $comment = ( $row->rev_comment == '' )
                                        ? ''
@@ -131,7 +137,8 @@ class Orphans extends Maintenance {
                        $this->lockTables( $dbw );
                }
 
-               $this->output( "\nChecking for childless page table entries... (this may take a while on a large wiki)\n" );
+               $this->output( "\nChecking for childless page table entries... "
+                       . "(this may take a while on a large wiki)\n" );
                $result = $dbw->query( "
                        SELECT *
                        FROM $page LEFT OUTER JOIN $revision ON page_latest=rev_id
@@ -176,7 +183,8 @@ class Orphans extends Maintenance {
                        $this->lockTables( $dbw, array( 'user', 'text' ) );
                }
 
-               $this->output( "\nChecking for pages whose page_latest links are incorrect... (this may take a while on a large wiki)\n" );
+               $this->output( "\nChecking for pages whose page_latest links are incorrect... "
+                       . "(this may take a while on a large wiki)\n" );
                $result = $dbw->query( "
                        SELECT *
                        FROM $page LEFT OUTER JOIN $revision ON page_latest=rev_id
diff --git a/maintenance/pageExists.php b/maintenance/pageExists.php
new file mode 100644 (file)
index 0000000..c4b208a
--- /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
+ * @ingroup Maintenance
+ */
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * @ingroup Maintenance
+ */
+class PageExists extends Maintenance {
+       public function __construct() {
+               parent::__construct();
+               $this->mDescription = "Report whether a specific page exists";
+               $this->addArg( 'title', 'Page title to check whether it exists' );
+       }
+
+       public function execute() {
+               $titleArg = $this->getArg();
+               $title = Title::newFromText( $titleArg );
+               $pageExists = $title && $title->exists();
+
+               $text = '';
+               $code = 0;
+               if ( $pageExists ) {
+                       $text = "{$title} exists.";
+               } else {
+                       $text = "{$title} doesn't exist.";
+                       $code = 1;
+               }
+               $this->output( $text );
+               $this->error( '', $code );
+       }
+}
+
+$maintClass = "PageExists";
+require_once RUN_MAINTENANCE_IF_MAIN;
+
index 7765784..9af57da 100644 (file)
@@ -62,7 +62,12 @@ class CLIParser extends Maintenance {
        public function __construct() {
                parent::__construct();
                $this->mDescription = "Parse a given wikitext";
-               $this->addOption( 'title', 'Title name for the given wikitext (Default: \'CLIParser\')', false, true );
+               $this->addOption(
+                       'title',
+                       'Title name for the given wikitext (Default: \'CLIParser\')',
+                       false,
+                       true
+               );
                $this->addArg( 'file', 'File containing wikitext (Default: stdin)', false );
        }
 
@@ -90,7 +95,8 @@ class CLIParser extends Maintenance {
 
                if ( $input_file === $php_stdin ) {
                        $ctrl = wfIsWindows() ? 'CTRL+Z' : 'CTRL+D';
-                       $this->error( basename( __FILE__ ) . ": warning: reading wikitext from STDIN. Press $ctrl to parse.\n" );
+                       $this->error( basename( __FILE__ )
+                               . ": warning: reading wikitext from STDIN. Press $ctrl to parse.\n" );
                }
 
                return file_get_contents( $input_file );
@@ -110,10 +116,10 @@ class CLIParser extends Maintenance {
         * @return Title object
         */
        protected function getTitle() {
-               $title =
-                       $this->getOption( 'title' )
+               $title = $this->getOption( 'title' )
                        ? $this->getOption( 'title' )
                        : 'CLIParser';
+
                return Title::newFromText( $title );
        }
 
index 31ce156..5d9fc1b 100644 (file)
@@ -33,7 +33,10 @@ class PatchSql extends Maintenance {
        public function __construct() {
                parent::__construct();
                $this->mDescription = "Run an SQL file into the DB, replacing prefix and charset vars";
-               $this->addArg( 'patch-name', 'Name of the patch file, either full path or in maintenance/archives' );
+               $this->addArg(
+                       'patch-name',
+                       'Name of the patch file, either full path or in maintenance/archives'
+               );
        }
 
        public function getDbType() {
index 4c8cdaa..ab0ca1e 100644 (file)
@@ -51,9 +51,24 @@ When the script has finished, it will make a note of this in the database, and
 will not run again without the --force option.
 TEXT;
 # '
-               $this->addOption( 'begin', 'Only do categories whose names are alphabetically after the provided name', false, true );
-               $this->addOption( 'max-slave-lag', 'If slave lag exceeds this many seconds, wait until it drops before continuing.  Default: 10', false, true );
-               $this->addOption( 'throttle', 'Wait this many milliseconds after each category.  Default: 0', false, true );
+               $this->addOption(
+                       'begin',
+                       'Only do categories whose names are alphabetically after the provided name',
+                       false,
+                       true
+               );
+               $this->addOption(
+                       'max-slave-lag',
+                       'If slave lag exceeds this many seconds, wait until it drops before continuing. Default: 10',
+                       false,
+                       true
+               );
+               $this->addOption(
+                       'throttle',
+                       'Wait this many milliseconds after each category. Default: 0',
+                       false,
+                       true
+               );
                $this->addOption( 'force', 'Run regardless of whether the database says it\'s been run already' );
        }
 
@@ -77,8 +92,9 @@ TEXT;
                        );
                        if ( $row ) {
                                $this->output( "Category table already populated.  Use php " .
-                               "maintenance/populateCategory.php\n--force from the command line " .
-                               "to override.\n" );
+                                       "maintenance/populateCategory.php\n--force from the command line " .
+                                       "to override.\n" );
+
                                return true;
                        }
                }
@@ -126,16 +142,17 @@ TEXT;
                }
 
                if ( $dbw->insert(
-                               'updatelog',
-                               array( 'ul_key' => 'populate category' ),
-                               __METHOD__,
-                               'IGNORE'
-                       )
-               ) {
+                       'updatelog',
+                       array( 'ul_key' => 'populate category' ),
+                       __METHOD__,
+                       'IGNORE'
+               ) ) {
                        $this->output( "Category population complete.\n" );
+
                        return true;
                } else {
                        $this->output( "Could not insert category population row.\n" );
+
                        return false;
                }
        }
index c579d4f..850a5a5 100644 (file)
@@ -51,6 +51,7 @@ class PopulateFilearchiveSha1 extends LoggedUpdateMaintenance {
 
                if ( !$dbw->fieldExists( $table, 'fa_sha1', __METHOD__ ) ) {
                        $this->output( "fa_sha1 column does not exist\n\n", true );
+
                        return false;
                }
 
index 126d22d..e9123aa 100644 (file)
@@ -33,9 +33,15 @@ class PopulateImageSha1 extends LoggedUpdateMaintenance {
                parent::__construct();
                $this->mDescription = "Populate the img_sha1 field";
                $this->addOption( 'force', "Recalculate sha1 for rows that already have a value" );
+               $this->addOption( 'multiversiononly', "Calculate only for files with several versions" );
                $this->addOption( 'method', "Use 'pipe' to pipe to mysql command line,\n" .
                        "\t\tdefault uses Database class", false, true );
-               $this->addOption( 'file', 'Fix for a specific file, without File: namespace prefixed', false, true );
+               $this->addOption(
+                       'file',
+                       'Fix for a specific file, without File: namespace prefixed',
+                       false,
+                       true
+               );
        }
 
        protected function getUpdateKey() {
@@ -47,7 +53,7 @@ class PopulateImageSha1 extends LoggedUpdateMaintenance {
        }
 
        public function execute() {
-               if ( $this->getOption( 'file' ) ) {
+               if ( $this->getOption( 'file' ) || $this->hasOption( 'multiversiononly' ) ) {
                        $this->doDBUpdates(); // skip update log checks/saves
                } else {
                        parent::execute();
@@ -71,18 +77,27 @@ class PopulateImageSha1 extends LoggedUpdateMaintenance {
                        );
                        if ( !$res ) {
                                $this->error( "No such file: $file", true );
+
                                return false;
                        }
                        $this->output( "Populating img_sha1 field for specified files\n" );
                } else {
-                       if ( $force ) {
+                       if ( $this->hasOption( 'multiversiononly' ) ) {
+                               $conds = array();
+                               $this->output( "Populating and recalculating img_sha1 field for versioned files\n" );
+                       } elseif ( $force ) {
                                $conds = array();
                                $this->output( "Populating and recalculating img_sha1 field\n" );
                        } else {
                                $conds = array( 'img_sha1' => '' );
                                $this->output( "Populating img_sha1 field\n" );
                        }
-                       $res = $dbw->select( 'image', array( 'img_name' ), $conds, __METHOD__ );
+                       if ( $this->hasOption( 'multiversiononly' ) ) {
+                               $res = $dbw->select( 'oldimage',
+                                       array( 'img_name' => 'DISTINCT(oi_name)' ), $conds, __METHOD__ );
+                       } else {
+                               $res = $dbw->select( 'image', array( 'img_name' ), $conds, __METHOD__ );
+                       }
                }
 
                $imageTable = $dbw->tableName( 'image' );
@@ -109,10 +124,12 @@ class PopulateImageSha1 extends LoggedUpdateMaintenance {
                                        "Done %d of %d, %5.3f%%  \r", $i, $numRows, $i / $numRows * 100 ) );
                                wfWaitForSlaves();
                        }
+
                        $file = wfLocalFile( $row->img_name );
                        if ( !$file ) {
                                continue;
                        }
+
                        // Upgrade the current file version...
                        $sha1 = $file->getRepo()->getFileSha1( $file->getPath() );
                        if ( strval( $sha1 ) !== '' ) { // file on disk and hashed properly
index d65635e..4c1a72e 100644 (file)
@@ -31,7 +31,12 @@ require_once __DIR__ . '/Maintenance.php';
  * @ingroup Maintenance
  */
 class PopulateLogSearch extends LoggedUpdateMaintenance {
-       static $tableMap = array( 'rev' => 'revision', 'fa' => 'filearchive', 'oi' => 'oldimage', 'ar' => 'archive' );
+       private static $tableMap = array(
+               'rev' => 'revision',
+               'fa' => 'filearchive',
+               'oi' => 'oldimage',
+               'ar' => 'archive'
+       );
 
        public function __construct() {
                parent::__construct();
@@ -51,11 +56,13 @@ class PopulateLogSearch extends LoggedUpdateMaintenance {
                $db = $this->getDB( DB_MASTER );
                if ( !$db->tableExists( 'log_search' ) ) {
                        $this->error( "log_search does not exist" );
+
                        return false;
                }
                $start = $db->selectField( 'logging', 'MIN(log_id)', false, __FUNCTION__ );
                if ( !$start ) {
                        $this->output( "Nothing to do.\n" );
+
                        return true;
                }
                $end = $db->selectField( 'logging', 'MAX(log_id)', false, __FUNCTION__ );
@@ -121,8 +128,8 @@ class PopulateLogSearch extends LoggedUpdateMaintenance {
                                        // Add item author relations...
                                        $log->addRelations( 'target_author_id', $userIds, $row->log_id );
                                        $log->addRelations( 'target_author_ip', $userIPs, $row->log_id );
-                               // RevisionDelete logs - log events
                                } elseif ( LogEventsList::typeAction( $row, $delTypes, 'event' ) ) {
+                                       // RevisionDelete logs - log events
                                        $params = LogPage::extractParams( $row->log_params );
                                        // Param format: <item CSV> [<ofield> <nfield>]
                                        if ( count( $params ) < 1 ) {
@@ -154,6 +161,7 @@ class PopulateLogSearch extends LoggedUpdateMaintenance {
                        wfWaitForSlaves();
                }
                $this->output( "Done populating log_search table.\n" );
+
                return true;
        }
 }
index e579e52..96cb1ec 100644 (file)
@@ -52,6 +52,7 @@ class PopulateLogUsertext extends LoggedUpdateMaintenance {
                $start = $db->selectField( 'logging', 'MIN(log_id)', false, __METHOD__ );
                if ( !$start ) {
                        $this->output( "Nothing to do.\n" );
+
                        return true;
                }
                $end = $db->selectField( 'logging', 'MAX(log_id)', false, __METHOD__ );
@@ -77,6 +78,7 @@ class PopulateLogUsertext extends LoggedUpdateMaintenance {
                        wfWaitForSlaves();
                }
                $this->output( "Done populating log_user_text field.\n" );
+
                return true;
        }
 }
index e29fa5f..f77978f 100644 (file)
@@ -49,6 +49,7 @@ class PopulateParentId extends LoggedUpdateMaintenance {
                $db = wfGetDB( DB_MASTER );
                if ( !$db->tableExists( 'revision' ) ) {
                        $this->error( "revision table does not exist" );
+
                        return false;
                }
                $this->output( "Populating rev_parent_id column\n" );
@@ -56,6 +57,7 @@ class PopulateParentId extends LoggedUpdateMaintenance {
                $end = $db->selectField( 'revision', 'MAX(rev_id)', false, __FUNCTION__ );
                if ( is_null( $start ) || is_null( $end ) ) {
                        $this->output( "...revision table seems to be empty, nothing to do.\n" );
+
                        return true;
                }
                # Do remaining chunk
@@ -85,10 +87,16 @@ class PopulateParentId extends LoggedUpdateMaintenance {
                                # If there are none, check the the highest ID with a lower timestamp
                                if ( !$previousID ) {
                                        # Get the highest older timestamp
-                                       $lastTimestamp = $db->selectField( 'revision', 'rev_timestamp',
-                                               array( 'rev_page' => $row->rev_page, "rev_timestamp < " . $db->addQuotes( $row->rev_timestamp ) ),
+                                       $lastTimestamp = $db->selectField(
+                                               'revision',
+                                               'rev_timestamp',
+                                               array(
+                                                       'rev_page' => $row->rev_page,
+                                                       "rev_timestamp < " . $db->addQuotes( $row->rev_timestamp )
+                                               ),
                                                __METHOD__,
-                                               array( 'ORDER BY' => 'rev_timestamp DESC' ) );
+                                               array( 'ORDER BY' => 'rev_timestamp DESC' )
+                                       );
                                        # If there is one, let the highest rev ID win
                                        if ( $lastTimestamp ) {
                                                $previousID = $db->selectField( 'revision', 'rev_id',
@@ -113,6 +121,7 @@ class PopulateParentId extends LoggedUpdateMaintenance {
                        wfWaitForSlaves();
                }
                $this->output( "rev_parent_id population complete ... {$count} rows [{$changed} changed]\n" );
+
                return true;
        }
 }
index 0e8e501..25a51d7 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once dirname( __FILE__ ) . '/Maintenance.php';
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to populate the rc_source field.
@@ -32,7 +32,8 @@ require_once dirname( __FILE__ ) . '/Maintenance.php';
 class PopulateRecentChangesSource extends LoggedUpdateMaintenance {
        public function __construct() {
                parent::__construct();
-               $this->mDescription = "Populates rc_source field of the recentchanges table with the data in rc_type.";
+               $this->mDescription =
+                       "Populates rc_source field of the recentchanges table with the data in rc_type.";
                $this->setBatchSize( 100 );
        }
 
@@ -45,6 +46,7 @@ class PopulateRecentChangesSource extends LoggedUpdateMaintenance {
                $start = $dbw->selectField( 'recentchanges', 'MIN(rc_id)', false, __METHOD__ );
                if ( !$start ) {
                        $this->output( "Nothing to do.\n" );
+
                        return true;
                }
                $end = $dbw->selectField( 'recentchanges', 'MAX(rc_id)', false, __METHOD__ );
index d5e40e4..b73ac7f 100644 (file)
@@ -49,6 +49,7 @@ class PopulateRevisionLength extends LoggedUpdateMaintenance {
                        $this->error( "archive table does not exist", true );
                } elseif ( !$db->fieldExists( 'revision', 'rev_len', __METHOD__ ) ) {
                        $this->output( "rev_len column does not exist\n\n", true );
+
                        return false;
                }
 
@@ -58,7 +59,9 @@ class PopulateRevisionLength extends LoggedUpdateMaintenance {
                $this->output( "Populating ar_len column\n" );
                $ar = $this->doLenUpdates( 'archive', 'ar_id', 'ar', Revision::selectArchiveFields() );
 
-               $this->output( "rev_len and ar_len population complete [$rev revision rows, $ar archive rows].\n" );
+               $this->output( "rev_len and ar_len population complete "
+                       . "[$rev revision rows, $ar archive rows].\n" );
+
                return true;
        }
 
@@ -75,6 +78,7 @@ class PopulateRevisionLength extends LoggedUpdateMaintenance {
                $end = $db->selectField( $table, "MAX($idCol)", false, __METHOD__ );
                if ( !$start || !$end ) {
                        $this->output( "...$table table seems to be empty.\n" );
+
                        return 0;
                }
 
@@ -132,6 +136,7 @@ class PopulateRevisionLength extends LoggedUpdateMaintenance {
                        # This should not happen, but sometimes does (bug 20757)
                        $id = $row->$idCol;
                        $this->output( "Content of $table $id unavailable!\n" );
+
                        return false;
                }
 
index 9bb510f..f06b56b 100644 (file)
@@ -50,6 +50,7 @@ class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
                        $this->error( "archive table does not exist", true );
                } elseif ( !$db->fieldExists( 'revision', 'rev_sha1', __METHOD__ ) ) {
                        $this->output( "rev_sha1 column does not exist\n\n", true );
+
                        return false;
                }
 
@@ -61,7 +62,9 @@ class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
                $this->output( "Populating ar_sha1 column legacy rows\n" );
                $ac += $this->doSha1LegacyUpdates();
 
-               $this->output( "rev_sha1 and ar_sha1 population complete [$rc revision rows, $ac archive rows].\n" );
+               $this->output( "rev_sha1 and ar_sha1 population complete "
+                       . "[$rc revision rows, $ac archive rows].\n" );
+
                return true;
        }
 
@@ -77,6 +80,7 @@ class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
                $end = $db->selectField( $table, "MAX($idCol)", false, __METHOD__ );
                if ( !$start || !$end ) {
                        $this->output( "...$table table seems to be empty.\n" );
+
                        return 0;
                }
 
@@ -103,6 +107,7 @@ class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
                        $blockEnd += $this->mBatchSize;
                        wfWaitForSlaves();
                }
+
                return $count;
        }
 
@@ -130,6 +135,7 @@ class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
                        }
                }
                $db->commit( __METHOD__ );
+
                return $count;
        }
 
@@ -149,11 +155,13 @@ class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
                        $text = $rev->getSerializedData();
                } catch ( MWException $e ) {
                        $this->output( "Data of revision with {$idCol}={$row->$idCol} unavailable!\n" );
+
                        return false; // bug 22624?
                }
                if ( !is_string( $text ) ) {
                        # This should not happen, but sometimes does (bug 20757)
                        $this->output( "Data of revision with {$idCol}={$row->$idCol} unavailable!\n" );
+
                        return false;
                } else {
                        $db->update( $table,
@@ -161,6 +169,7 @@ class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
                                array( $idCol => $row->$idCol ),
                                __METHOD__
                        );
+
                        return true;
                }
        }
@@ -175,12 +184,14 @@ class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
                        $rev = Revision::newFromArchiveRow( $row );
                } catch ( MWException $e ) {
                        $this->output( "Text of revision with timestamp {$row->ar_timestamp} unavailable!\n" );
+
                        return false; // bug 22624?
                }
                $text = $rev->getSerializedData();
                if ( !is_string( $text ) ) {
                        # This should not happen, but sometimes does (bug 20757)
                        $this->output( "Data of revision with timestamp {$row->ar_timestamp} unavailable!\n" );
+
                        return false;
                } else {
                        # Archive table as no PK, but (NS,title,time) should be near unique.
@@ -195,6 +206,7 @@ class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
                                ),
                                __METHOD__
                        );
+
                        return true;
                }
        }
index 266cb3b..abbfd3a 100644 (file)
@@ -159,11 +159,13 @@ ALTER TABLE page_restrictions ADD CONSTRAINT page_restrictions_pk PRIMARY KEY (p
 CREATE TABLE page_props (
   pp_page      INTEGER  NOT NULL  REFERENCES page (page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
   pp_propname  TEXT     NOT NULL,
-  pp_value     TEXT     NOT NULL
+  pp_value     TEXT     NOT NULL,
+  pp_sortkey   FLOAT
 );
 ALTER TABLE page_props ADD CONSTRAINT page_props_pk PRIMARY KEY (pp_page,pp_propname);
 CREATE INDEX page_props_propname ON page_props (pp_propname);
 CREATE UNIQUE INDEX pp_propname_page ON page_props (pp_propname,pp_page);
+CREATE INDEX pp_propname_sortkey_page ON page_props (pp_propname, pp_sortkey, pp_page) WHERE (pp_sortkey IS NOT NULL);
 
 CREATE SEQUENCE archive_ar_id_seq;
 CREATE TABLE archive (
@@ -406,7 +408,7 @@ CREATE SEQUENCE recentchanges_rc_id_seq;
 CREATE TABLE recentchanges (
   rc_id              INTEGER      NOT NULL  PRIMARY KEY DEFAULT nextval('recentchanges_rc_id_seq'),
   rc_timestamp       TIMESTAMPTZ  NOT NULL,
-  rc_cur_time        TIMESTAMPTZ  NOT NULL,
+  rc_cur_time        TIMESTAMPTZ      NULL,
   rc_user            INTEGER          NULL  REFERENCES mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED,
   rc_user_text       TEXT         NOT NULL,
   rc_namespace       SMALLINT     NOT NULL,
@@ -676,7 +678,7 @@ CREATE INDEX user_properties_property ON user_properties (up_property);
 CREATE TABLE l10n_cache (
   lc_lang   TEXT  NOT NULL,
   lc_key    TEXT  NOT NULL,
-  lc_value  TEXT  NOT NULL
+  lc_value  BYTEA NOT NULL
 );
 CREATE INDEX l10n_cache_lc_lang_key ON l10n_cache (lc_lang, lc_key);
 
index 25ef1a7..17d97b0 100644 (file)
@@ -41,6 +41,7 @@ class PreprocessDump extends DumpIterator {
 
        public function getStripList() {
                global $wgParser;
+
                return $wgParser->getStripList();
        }
 
@@ -87,7 +88,8 @@ class PreprocessDump extends DumpIterator {
                try {
                        $this->mPreprocessor->preprocessToObj( strval( $content->getNativeData() ), 0 );
                } catch ( Exception $e ) {
-                       $this->error( "Caught exception " . $e->getMessage() . " in " . $rev->getTitle()->getPrefixedText() );
+                       $this->error( "Caught exception " . $e->getMessage() . " in "
+                               . $rev->getTitle()->getPrefixedText() );
                }
        }
 }
index 53aeb09..9155623 100644 (file)
@@ -45,7 +45,8 @@ class PPFuzzTester {
        // public $outputTypes = array( 'OT_HTML', 'OT_WIKI', 'OT_PREPROCESS' );
        public $entryPoints = array( 'testSrvus', 'testPst', 'testPreprocess' );
        public $verbose = false;
-       static $currentTest = false;
+
+       private static $currentTest = false;
 
        function execute() {
                if ( !file_exists( 'results' ) ) {
@@ -120,6 +121,7 @@ class PPFuzzTester {
                // It's done by the MW UI, so it's a reasonably legitimate thing to do.
                global $wgContLang;
                $s = $wgContLang->normalize( $s );
+
                return $s;
        }
 
@@ -135,7 +137,8 @@ class PPFuzzTester {
 
        function pickEntryPoint() {
                $count = count( $this->entryPoints );
-               return $this->entryPoints[ mt_rand( 0, $count - 1 ) ];
+
+               return $this->entryPoints[mt_rand( 0, $count - 1 )];
        }
 }
 
@@ -181,6 +184,7 @@ class PPFuzzTest {
                                'text' => $text,
                                'finalTitle' => $finalTitle );
                }
+
                return $this->templates[$titleText];
        }
 
@@ -195,7 +199,13 @@ class PPFuzzTest {
                $options = ParserOptions::newFromUser( $wgUser );
                $options->setTemplateCallback( array( $this, 'templateHook' ) );
                $options->setTimestamp( wfTimestampNow() );
-               $this->output = call_user_func( array( $wgParser, $this->entryPoint ), $this->mainText, $this->title, $options );
+               $this->output = call_user_func(
+                       array( $wgParser, $this->entryPoint ),
+                       $this->mainText,
+                       $this->title,
+                       $options
+               );
+
                return $this->output;
        }
 
@@ -203,7 +213,8 @@ class PPFuzzTest {
                $s = "Title: " . $this->title->getPrefixedDBkey() . "\n" .
 //                     "Output type: {$this->outputType}\n" .
                        "Entry point: {$this->entryPoint}\n" .
-                       "User: " . ( $this->fancySig ? 'fancy' : 'no-fancy' ) . ' ' . var_export( $this->nickname, true ) . "\n" .
+                       "User: " . ( $this->fancySig ? 'fancy' : 'no-fancy' ) .
+                       ' ' . var_export( $this->nickname, true ) . "\n" .
                        "Main text: " . var_export( $this->mainText, true ) . "\n";
                foreach ( $this->templates as $titleText => $template ) {
                        $finalTitle = $template['finalTitle'];
@@ -214,6 +225,7 @@ class PPFuzzTest {
                        }
                }
                $s .= "Output: " . var_export( $this->output, true ) . "\n";
+
                return $s;
        }
 }
index 91c36f2..1e702de 100644 (file)
@@ -177,7 +177,6 @@ class PurgeChangedFiles extends Maintenance {
                                                        // Sanity check to avoid data loss
                                                        $repo->getBackend()->delete( array( 'src' => $file->getPath() ) );
                                                        $this->verbose( "Deleted orphan file: {$file->getPath()}.\n" );
-
                                                } else {
                                                        $this->error( "File was not deleted: {$file->getPath()}.\n" );
                                                }
@@ -185,7 +184,6 @@ class PurgeChangedFiles extends Maintenance {
 
                                        // Purge items from fileachive table (rows are likely here)
                                        $this->purgeFromArchiveTable( $repo, $file );
-
                                } elseif ( $logType === 'move' ) {
                                        // Purge the target file as well
 
@@ -232,7 +230,6 @@ class PurgeChangedFiles extends Maintenance {
                                        // Sanity check to avoid data loss
                                        $repo->getBackend()->delete( array( 'src' => $ofile->getPath() ) );
                                        $this->output( "Deleted orphan file: {$ofile->getPath()}.\n" );
-
                                } else {
                                        $this->error( "File was not deleted: {$ofile->getPath()}.\n" );
                                }
@@ -244,6 +241,7 @@ class PurgeChangedFiles extends Maintenance {
        protected function getDeletedPath( LocalRepo $repo, LocalFile $file ) {
                $hash = $repo->getFileSha1( $file->getPath() );
                $key = "{$hash}.{$file->getExtension()}";
+
                return $repo->getDeletedHashPath( $key ) . $key;
        }
 
@@ -257,7 +255,6 @@ class PurgeChangedFiles extends Maintenance {
                        $this->output( $msg );
                }
        }
-
 }
 
 $maintClass = "PurgeChangedFiles";
index 071ac09..f0b6ec7 100644 (file)
@@ -183,6 +183,7 @@ class PurgeChangedPages extends Maintenance {
                        }
                }
                $lastValueLeft = count( $rows ) ? $rows[count( $rows ) - 1]->$column : null;
+
                return array( $rows, $lastValueLeft );
        }
 }
index 8a3818a..2e19630 100644 (file)
@@ -141,7 +141,6 @@ class PurgeList extends Maintenance {
                        $u->doUpdate();
                }
        }
-
 }
 
 $maintClass = "PurgeList";
index db961d8..913e9f0 100644 (file)
@@ -74,5 +74,4 @@ function PurgeRedundantText( $delete = false ) {
 
        # Done
        $dbw->commit( __METHOD__ );
-
 }
index ca2a041..9970c1f 100644 (file)
@@ -37,7 +37,8 @@ class PurgeParserCache extends Maintenance {
                $this->addDescription( "Remove old objects from the parser cache. " .
                        "This only works when the parser cache is in an SQL database." );
                $this->addOption( 'expiredate', 'Delete objects expiring before this date.', false, true );
-               $this->addOption( 'age',
+               $this->addOption(
+                       'age',
                        'Delete objects created more than this many seconds ago, assuming $wgParserCacheExpireTime ' .
                                'has been consistent.',
                        false, true );
@@ -77,8 +78,8 @@ class PurgeParserCache extends Maintenance {
                $stars = floor( $percent / 2 );
                $this->output( '[' . str_repeat( '*', $stars ) . str_repeat( '.', 50 - $stars ) . '] ' .
                        "$percentString%\r" );
-
        }
 }
+
 $maintClass = 'PurgeParserCache';
 require_once RUN_MAINTENANCE_IF_MAIN;
index 89237a5..679cadb 100644 (file)
@@ -79,13 +79,23 @@ class ReassignEdits extends Maintenance {
 
                # Count things
                $this->output( "Checking current edits..." );
-               $res = $dbw->select( 'revision', 'COUNT(*) AS count', $this->userConditions( $from, 'rev_user', 'rev_user_text' ), __METHOD__ );
+               $res = $dbw->select(
+                       'revision',
+                       'COUNT(*) AS count',
+                       $this->userConditions( $from, 'rev_user', 'rev_user_text' ),
+                       __METHOD__
+               );
                $row = $dbw->fetchObject( $res );
                $cur = $row->count;
                $this->output( "found {$cur}.\n" );
 
                $this->output( "Checking deleted edits..." );
-               $res = $dbw->select( 'archive', 'COUNT(*) AS count', $this->userConditions( $from, 'ar_user', 'ar_user_text' ), __METHOD__ );
+               $res = $dbw->select(
+                       'archive',
+                       'COUNT(*) AS count',
+                       $this->userConditions( $from, 'ar_user', 'ar_user_text' ),
+                       __METHOD__
+               );
                $row = $dbw->fetchObject( $res );
                $del = $row->count;
                $this->output( "found {$del}.\n" );
@@ -93,7 +103,12 @@ class ReassignEdits extends Maintenance {
                # Don't count recent changes if we're not supposed to
                if ( $rc ) {
                        $this->output( "Checking recent changes..." );
-                       $res = $dbw->select( 'recentchanges', 'COUNT(*) AS count', $this->userConditions( $from, 'rc_user', 'rc_user_text' ), __METHOD__ );
+                       $res = $dbw->select(
+                               'recentchanges',
+                               'COUNT(*) AS count',
+                               $this->userConditions( $from, 'rc_user', 'rc_user_text' ),
+                               __METHOD__
+                       );
                        $row = $dbw->fetchObject( $res );
                        $rec = $row->count;
                        $this->output( "found {$rec}.\n" );
@@ -125,6 +140,7 @@ class ReassignEdits extends Maintenance {
                }
 
                $dbw->commit( __METHOD__ );
+
                return (int)$total;
        }
 
@@ -138,7 +154,9 @@ class ReassignEdits extends Maintenance {
         * @return array
         */
        private function userConditions( &$user, $idfield, $utfield ) {
-               return $user->getId() ? array( $idfield => $user->getId() ) : array( $utfield => $user->getName() );
+               return $user->getId()
+                       ? array( $idfield => $user->getId() )
+                       : array( $utfield => $user->getName() );
        }
 
        /**
@@ -172,6 +190,7 @@ class ReassignEdits extends Maintenance {
                        }
                }
                $user->load();
+
                return $user;
        }
 }
index 8b0b057..5a14967 100644 (file)
@@ -79,6 +79,7 @@ class ImageBuilder extends Maintenance {
                if ( !isset( $this->repo ) ) {
                        $this->repo = RepoGroup::singleton()->getLocalRepo();
                }
+
                return $this->repo;
        }
 
@@ -149,6 +150,7 @@ class ImageBuilder extends Maintenance {
                // Create a File object from the row
                // This will also upgrade it
                $file = $this->getRepo()->newFileFromRow( $row );
+
                return $file->getUpgraded();
        }
 
@@ -161,9 +163,11 @@ class ImageBuilder extends Maintenance {
                // This will also upgrade it
                if ( $row->oi_archive_name == '' ) {
                        $this->output( "Empty oi_archive_name for oi_name={$row->oi_name}\n" );
+
                        return false;
                }
                $file = $this->getRepo()->newFileFromRow( $row );
+
                return $file->getUpgraded();
        }
 
@@ -201,21 +205,22 @@ class ImageBuilder extends Maintenance {
 
                if ( $filename == '' ) {
                        $this->output( "Empty filename for $fullpath\n" );
+
                        return;
                }
                if ( !$this->dryrun ) {
                        $file = wfLocalFile( $filename );
                        if ( !$file->recordUpload(
-                                       '',
-                                       '(recovered file, missing upload log entry)',
-                                       '',
-                                       '',
-                                       '',
-                                       false,
-                                       $timestamp
-                               )
-                       ) {
+                               '',
+                               '(recovered file, missing upload log entry)',
+                               '',
+                               '',
+                               '',
+                               false,
+                               $timestamp
+                       ) ) {
                                $this->output( "Error uploading file $fullpath\n" );
+
                                return;
                        }
                }
index cfcb950..b04639c 100644 (file)
@@ -52,6 +52,7 @@ class RebuildLocalisationCache extends Maintenance {
                if ( $this->hasOption( 'memory-limit' ) ) {
                        return parent::memoryLimit();
                }
+
                return '1000M';
        }
 
@@ -148,7 +149,7 @@ class RebuildLocalisationCache extends Maintenance {
        /**
         * Helper function to rebuild list of languages codes. Prints the code
         * for each language which is rebuilt.
-        * @param array $codes  List of language codes to rebuild.
+        * @param array $codes List of language codes to rebuild.
         * @param LocalisationCache $lc Instance of LocalisationCacheBulkLoad (?)
         * @param bool $force Rebuild up-to-date languages
         * @return int Number of rebuilt languages
@@ -162,6 +163,7 @@ class RebuildLocalisationCache extends Maintenance {
                                $numRebuilt++;
                        }
                }
+
                return $numRebuilt;
        }
 
index 1268d20..eeee9c2 100644 (file)
@@ -42,7 +42,8 @@ class RebuildAll extends Maintenance {
        public function execute() {
                // Rebuild the text index
                if ( wfGetDB( DB_SLAVE )->getType() != 'postgres' ) {
-                       $this->output( "** Rebuilding fulltext search index (if you abort this will break searching; run this script again to fix):\n" );
+                       $this->output( "** Rebuilding fulltext search index (if you abort "
+                               . "this will break searching; run this script again to fix):\n" );
                        $rebuildText = $this->runChild( 'RebuildTextIndex', 'rebuildtextindex.php' );
                        $rebuildText->execute();
                }
@@ -53,7 +54,8 @@ class RebuildAll extends Maintenance {
                $rebuildRC->execute();
 
                // Rebuild link tables
-               $this->output( "\n\n** Rebuilding links tables -- this can take a long time. It should be safe to abort via ctrl+C if you get bored.\n" );
+               $this->output( "\n\n** Rebuilding links tables -- this can take a long time. "
+                       . "It should be safe to abort via ctrl+C if you get bored.\n" );
                $rebuildLinks = $this->runChild( 'RefreshLinks', 'refreshLinks.php' );
                $rebuildLinks->execute();
 
index 2a9bb4f..203d795 100644 (file)
@@ -69,25 +69,31 @@ class RebuildRecentchanges extends Maintenance {
                $cutoff = time() - $wgRCMaxAge;
                $dbw->insertSelect( 'recentchanges', array( 'page', 'revision' ),
                        array(
-                               'rc_timestamp'  => 'rev_timestamp',
-                               'rc_user'       => 'rev_user',
-                               'rc_user_text'  => 'rev_user_text',
-                               'rc_namespace'  => 'page_namespace',
-                               'rc_title'      => 'page_title',
-                               'rc_comment'    => 'rev_comment',
-                               'rc_minor'      => 'rev_minor_edit',
-                               'rc_bot'        => 0,
-                               'rc_new'        => 'page_is_new',
-                               'rc_cur_id'     => 'page_id',
+                               'rc_timestamp' => 'rev_timestamp',
+                               'rc_user' => 'rev_user',
+                               'rc_user_text' => 'rev_user_text',
+                               'rc_namespace' => 'page_namespace',
+                               'rc_title' => 'page_title',
+                               'rc_comment' => 'rev_comment',
+                               'rc_minor' => 'rev_minor_edit',
+                               'rc_bot' => 0,
+                               'rc_new' => 'page_is_new',
+                               'rc_cur_id' => 'page_id',
                                'rc_this_oldid' => 'rev_id',
                                'rc_last_oldid' => 0, // is this ok?
-                               'rc_type'       => $dbw->conditional( 'page_is_new != 0', RC_NEW, RC_EDIT ),
-                               'rc_source'     => $dbw->conditional( 'page_is_new != 0', $dbw->addQuotes( RecentChange::SRC_NEW ), $dbw->addQuotes( RecentChange::SRC_EDIT ) ),
-                               'rc_deleted'    => 'rev_deleted'
-                       ), array(
+                               'rc_type' => $dbw->conditional( 'page_is_new != 0', RC_NEW, RC_EDIT ),
+                               'rc_source' => $dbw->conditional(
+                                               'page_is_new != 0',
+                                               $dbw->addQuotes( RecentChange::SRC_NEW ),
+                                               $dbw->addQuotes( RecentChange::SRC_EDIT )
+                               ),
+                               'rc_deleted' => 'rev_deleted'
+                       ),
+                       array(
                                'rev_timestamp > ' . $dbw->addQuotes( $dbw->timestamp( $cutoff ) ),
                                'rev_page=page_id'
-                       ), __METHOD__,
+                       ),
+                       __METHOD__,
                        array(), // INSERT options
                        array( 'ORDER BY' => 'rev_timestamp DESC', 'LIMIT' => 5000 ) // SELECT options
                );
@@ -182,33 +188,40 @@ class RebuildRecentchanges extends Maintenance {
 
                $cutoff = time() - $wgRCMaxAge;
                list( $logging, $page ) = $dbw->tableNamesN( 'logging', 'page' );
-               $dbw->insertSelect( 'recentchanges', array( 'user', "$logging LEFT JOIN $page ON (log_namespace=page_namespace AND log_title=page_title)" ),
+               $dbw->insertSelect(
+                       'recentchanges',
+                       array(
+                               'user',
+                               "$logging LEFT JOIN $page ON (log_namespace=page_namespace AND log_title=page_title)"
+                       ),
                        array(
-                               'rc_timestamp'  => 'log_timestamp',
-                               'rc_user'       => 'log_user',
-                               'rc_user_text'  => 'user_name',
-                               'rc_namespace'  => 'log_namespace',
-                               'rc_title'      => 'log_title',
-                               'rc_comment'    => 'log_comment',
-                               'rc_minor'      => 0,
-                               'rc_bot'        => 0,
-                               'rc_patrolled'  => 1,
-                               'rc_new'        => 0,
+                               'rc_timestamp' => 'log_timestamp',
+                               'rc_user' => 'log_user',
+                               'rc_user_text' => 'user_name',
+                               'rc_namespace' => 'log_namespace',
+                               'rc_title' => 'log_title',
+                               'rc_comment' => 'log_comment',
+                               'rc_minor' => 0,
+                               'rc_bot' => 0,
+                               'rc_patrolled' => 1,
+                               'rc_new' => 0,
                                'rc_this_oldid' => 0,
                                'rc_last_oldid' => 0,
-                               'rc_type'       => RC_LOG,
-                               'rc_source'     => $dbw->addQuotes( RecentChange::SRC_LOG ),
-                               'rc_cur_id'     => $dbw->cascadingDeletes() ? 'page_id' : 'COALESCE(page_id, 0)',
-                               'rc_log_type'   => 'log_type',
+                               'rc_type' => RC_LOG,
+                               'rc_source' => $dbw->addQuotes( RecentChange::SRC_LOG ),
+                               'rc_cur_id' => $dbw->cascadingDeletes() ? 'page_id' : 'COALESCE(page_id, 0)',
+                               'rc_log_type' => 'log_type',
                                'rc_log_action' => 'log_action',
-                               'rc_logid'      => 'log_id',
-                               'rc_params'     => 'log_params',
-                               'rc_deleted'    => 'log_deleted'
-                       ), array(
+                               'rc_logid' => 'log_id',
+                               'rc_params' => 'log_params',
+                               'rc_deleted' => 'log_deleted'
+                       ),
+                       array(
                                'log_timestamp > ' . $dbw->addQuotes( $dbw->timestamp( $cutoff ) ),
                                'log_user=user_id',
                                'log_type IN(' . implode( ',', $selectLogs ) . ')'
-                       ), __METHOD__,
+                       ),
+                       __METHOD__,
                        array(), // INSERT options
                        array( 'ORDER BY' => 'log_timestamp DESC', 'LIMIT' => 5000 ) // SELECT options
                );
@@ -223,7 +236,8 @@ class RebuildRecentchanges extends Maintenance {
 
                $dbw = wfGetDB( DB_MASTER );
 
-               list( $recentchanges, $usergroups, $user ) = $dbw->tableNamesN( 'recentchanges', 'user_groups', 'user' );
+               list( $recentchanges, $usergroups, $user ) =
+                       $dbw->tableNamesN( 'recentchanges', 'user_groups', 'user' );
 
                $botgroups = User::getGroupsWithPermission( 'bot' );
                $autopatrolgroups = $wgUseRCPatrol ? User::getGroupsWithPermission( 'autopatrol' ) : array();
@@ -289,7 +303,6 @@ class RebuildRecentchanges extends Maintenance {
                        $messageMemc->delete( wfMemcKey( 'rcfeed', $feed, 'timestamp' ) ); # Good enough for now.
                }
        }
-
 }
 
 $maintClass = "RebuildRecentchanges";
index 722db26..bc85c66 100644 (file)
@@ -59,10 +59,12 @@ class RebuildTextIndex extends Maintenance {
                $this->db = wfGetDB( DB_MASTER );
                if ( $this->db->getType() == 'sqlite' ) {
                        if ( !DatabaseSqlite::getFulltextSearchModule() ) {
-                               $this->error( "Your version of SQLite module for PHP doesn't support full-text search (FTS3).\n", true );
+                               $this->error( "Your version of SQLite module for PHP doesn't "
+                                       . "support full-text search (FTS3).\n", true );
                        }
                        if ( !$this->db->checkForEnabledSearch() ) {
-                               $this->error( "Your database schema is not configured for full-text search support. Run update.php.\n", true );
+                               $this->error( "Your database schema is not configured for "
+                                       . "full-text search support. Run update.php.\n", true );
                        }
                }
 
index ae8d508..8cb23fd 100644 (file)
@@ -47,15 +47,41 @@ class RefreshImageMetadata extends Maintenance {
                $this->mDescription = 'Script to update image metadata records';
                $this->setBatchSize( 200 );
 
-               $this->addOption( 'force', 'Reload metadata from file even if the metadata looks ok', false, false, 'f' );
-               $this->addOption( 'broken-only', 'Only fix really broken records, leave old but still compatible records alone.' );
-               $this->addOption( 'verbose', 'Output extra information about each upgraded/non-upgraded file.', false, false, 'v' );
+               $this->addOption(
+                       'force',
+                       'Reload metadata from file even if the metadata looks ok',
+                       false,
+                       false,
+                       'f'
+               );
+               $this->addOption(
+                       'broken-only',
+                       'Only fix really broken records, leave old but still compatible records alone.'
+               );
+               $this->addOption(
+                       'verbose',
+                       'Output extra information about each upgraded/non-upgraded file.',
+                       false,
+                       false,
+                       'v'
+               );
                $this->addOption( 'start', 'Name of file to start with', false, true );
                $this->addOption( 'end', 'Name of file to end with', false, true );
 
-               $this->addOption( 'mime', '(Inefficient!) Only refresh files with this mime type. Can accept wild-card image/*', false, true );
-               $this->addOption( 'metadata-contains', '(Inefficient!) Only refresh files where the img_metadata field contains this string. Can be used if its known a specific property was being extracted incorrectly.', false, true );
-
+               $this->addOption(
+                       'mime',
+                       '(Inefficient!) Only refresh files with this mime type. Can accept wild-card image/*',
+                       false,
+                       true
+               );
+               $this->addOption(
+                       'metadata-contains',
+                       '(Inefficient!) Only refresh files where the img_metadata field '
+                               . 'contains this string. Can be used if its known a specific '
+                               . 'property was being extracted incorrectly.',
+                       false,
+                       true
+               );
        }
 
        public function execute() {
@@ -121,7 +147,7 @@ class RefreshImageMetadata extends Maintenance {
                                                // to weed out any inconsequential changes.
                                                $error++;
                                                $this->output( "Warning: File:{$row->img_name} used to have " .
-                                               "$oldLength bytes of metadata but now has $newLength bytes.\n" );
+                                                       "$oldLength bytes of metadata but now has $newLength bytes.\n" );
                                        } elseif ( $verbose ) {
                                                $this->output( "Refreshed File:{$row->img_name}.\n" );
                                        }
@@ -134,20 +160,17 @@ class RefreshImageMetadata extends Maintenance {
                                                if ( $newLength < $oldLength - 5 ) {
                                                        $error++;
                                                        $this->output( "Warning: File:{$row->img_name} used to have " .
-                                                       "$oldLength bytes of metadata but now has $newLength bytes. (forced)\n" );
-
+                                                               "$oldLength bytes of metadata but now has $newLength bytes. (forced)\n" );
                                                }
                                                if ( $verbose ) {
                                                        $this->output( "Forcibly refreshed File:{$row->img_name}.\n" );
                                                }
-                                       }
-                                       else {
+                                       } else {
                                                if ( $verbose ) {
                                                        $this->output( "Skipping File:{$row->img_name}.\n" );
                                                }
                                        }
                                }
-
                        }
                        $conds2 = array( 'img_name > ' . $dbw->addQuotes( $row->img_name ) );
                        wfWaitForSlaves();
@@ -155,9 +178,13 @@ class RefreshImageMetadata extends Maintenance {
 
                $total = $upgraded + $leftAlone;
                if ( $force ) {
-                       $this->output( "\nFinished refreshing file metadata for $total files. $upgraded needed to be refreshed, $leftAlone did not need to be but were refreshed anyways, and $error refreshes were suspicious.\n" );
+                       $this->output( "\nFinished refreshing file metadata for $total files. "
+                               . "$upgraded needed to be refreshed, $leftAlone did not need to "
+                               . "be but were refreshed anyways, and $error refreshes were suspicious.\n" );
                } else {
-                       $this->output( "\nFinished refreshing file metadata for $total files. $upgraded were refreshed, $leftAlone were already up to date, and $error refreshes were suspicious.\n" );
+                       $this->output( "\nFinished refreshing file metadata for $total files. "
+                               . "$upgraded were refreshed, $leftAlone were already up to date, "
+                               . "and $error refreshes were suspicious.\n" );
                }
        }
 
@@ -185,6 +212,7 @@ class RefreshImageMetadata extends Maintenance {
                if ( $like ) {
                        $conds[] = 'img_metadata ' . $dbw->buildLike( $dbw->anyString(), $like, $dbw->anyString() );
                }
+
                return $conds;
        }
 
index eca207a..0c2f722 100644 (file)
@@ -65,7 +65,8 @@ class RefreshLinks extends Maintenance {
         * @param bool $oldRedirectsOnly Only fix redirects without redirect entries
         */
        private function doRefreshLinks( $start, $newOnly = false, $maxLag = false,
-                                               $end = 0, $redirectsOnly = false, $oldRedirectsOnly = false ) {
+               $end = 0, $redirectsOnly = false, $oldRedirectsOnly = false
+       ) {
                global $wgParser, $wgUseTidy;
 
                $reportingInterval = 100;
@@ -196,6 +197,7 @@ class RefreshLinks extends Maintenance {
                        // Delete any redirect table entry for it
                        $dbw->delete( 'redirect', array( 'rd_from' => $id ),
                                __METHOD__ );
+
                        return;
                }
 
index 4ceab4f..90dc622 100644 (file)
@@ -58,12 +58,13 @@ class RemoveUnusedAccounts extends Maintenance {
                }
                $touchedSeconds = 86400 * $touched;
                foreach ( $res as $row ) {
-                       # Check the account, but ignore it if it's within a $excludedGroups group or if it's touched within the $touchedSeconds seconds.
+                       # Check the account, but ignore it if it's within a $excludedGroups
+                       # group or if it's touched within the $touchedSeconds seconds.
                        $instance = User::newFromId( $row->user_id );
                        if ( count( array_intersect( $instance->getEffectiveGroups(), $excludedGroups ) ) == 0
                                && $this->isInactiveAccount( $row->user_id, true )
                                && wfTimestamp( TS_UNIX, $row->user_touched ) < wfTimestamp( TS_UNIX, time() - $touchedSeconds )
-                               ) {
+                       ) {
                                # Inactive; print out the name and flag it
                                $del[] = $row->user_id;
                                $this->output( $row->user_name . "\n" );
@@ -85,7 +86,12 @@ class RemoveUnusedAccounts extends Maintenance {
                        $this->output( "done.\n" );
                        # Update the site_stats.ss_users field
                        $users = $dbw->selectField( 'user', 'COUNT(*)', array(), __METHOD__ );
-                       $dbw->update( 'site_stats', array( 'ss_users' => $users ), array( 'ss_row_id' => 1 ), __METHOD__ );
+                       $dbw->update(
+                               'site_stats',
+                               array( 'ss_users' => $users ),
+                               array( 'ss_row_id' => 1 ),
+                               __METHOD__
+                       );
                } elseif ( $count > 0 ) {
                        $this->output( "\nRun the script again with --delete to remove them from the database.\n" );
                }
index b76d9a1..169f512 100644 (file)
@@ -84,6 +84,7 @@ class DumpRenderer extends Maintenance {
                $title = $rev->getTitle();
                if ( !$title ) {
                        $this->error( "Got bogus revision with null title!" );
+
                        return;
                }
                $display = $title->getPrefixedText();
index 9847ccc..08be553 100644 (file)
@@ -34,9 +34,15 @@ require_once __DIR__ . '/Maintenance.php';
 class ResetUserTokens extends Maintenance {
        public function __construct() {
                parent::__construct();
-               $this->mDescription = "Reset the user_token of all users on the wiki. Note that this may log some of them out.";
+               $this->mDescription =
+                       "Reset the user_token of all users on the wiki. Note that this may log some of them out.";
                $this->addOption( 'nowarn', "Hides the 5 seconds warning", false, false );
-               $this->addOption( 'nulls', 'Only reset tokens that are currently null (string of \x00\'s)', false, false );
+               $this->addOption(
+                       'nulls',
+                       'Only reset tokens that are currently null (string of \x00\'s)',
+                       false,
+                       false
+               );
                $this->setBatchSize( 1000 );
        }
 
@@ -45,14 +51,16 @@ class ResetUserTokens extends Maintenance {
 
                if ( !$this->getOption( 'nowarn' ) ) {
                        if ( $this->nullsOnly ) {
-                               $this->output( "The script is about to reset the user_token for USERS WITH NULL TOKENS in the database.\n" );
+                               $this->output( "The script is about to reset the user_token "
+                                       . "for USERS WITH NULL TOKENS in the database.\n" );
                        } else {
                                $this->output( "The script is about to reset the user_token for ALL USERS in the database.\n" );
                                $this->output( "This may log some of them out and is not necessary unless you believe your\n" );
                                $this->output( "user table has been compromised.\n" );
                        }
                        $this->output( "\n" );
-                       $this->output( "Abort with control-c in the next five seconds (skip this countdown with --nowarn) ... " );
+                       $this->output( "Abort with control-c in the next five seconds "
+                               . "(skip this countdown with --nowarn) ... " );
                        wfCountDown( 5 );
                }
 
@@ -62,7 +70,7 @@ class ResetUserTokens extends Maintenance {
                $where = array();
                if ( $this->nullsOnly ) {
                        // Have to build this by hand, because \ is escaped in helper functions
-                       $where = array( 'user_token = \'' . str_repeat( '\0', 32) . '\'' );
+                       $where = array( 'user_token = \'' . str_repeat( '\0', 32 ) . '\'' );
                }
 
                $maxid = $dbr->selectField( 'user', 'MAX(user_id)', array(), __METHOD__ );
@@ -90,9 +98,7 @@ class ResetUserTokens extends Maintenance {
                        $max = $min + $this->mBatchSize;
 
                        wfWaitForSlaves();
-
                } while ( $min <= $maxid );
-
        }
 
        private function updateUser( $userid ) {
diff --git a/maintenance/resources/update-oojs-ui.sh b/maintenance/resources/update-oojs-ui.sh
new file mode 100755 (executable)
index 0000000..cc5988c
--- /dev/null
@@ -0,0 +1,97 @@
+#!/usr/bin/env bash
+
+# This script generates a commit that updates our distribution copy of OOjs UI
+
+if [ -z "$1" ]
+then
+       # Missing required parameter
+       echo >&2 "Usage: $0 path/to/repo/for/oojs-ui"
+       exit 1
+fi
+
+TARGET_REPO=$(cd $(dirname $0)/../..; pwd)
+TARGET_DIR=resources/lib/oojs-ui
+UI_REPO=$1
+
+function oojsuihash() {
+       grep "OOjs UI v" $TARGET_REPO/$TARGET_DIR/oojs-ui.js \
+               | head -n 1 \
+               | grep -Eo '\([a-z0-9]+\)' \
+               | sed 's/^(//' \
+               | sed 's/)$//'
+}
+
+function oojsuitag() {
+       grep "OOjs UI v" $TARGET_REPO/$TARGET_DIR/oojs-ui.js \
+               | head -n 1 \
+               | grep -Eo '\bv[0-9a-z.-]+\b'
+}
+
+function oojsuiversion() {
+       grep "OOjs UI v" $TARGET_REPO/$TARGET_DIR/oojs-ui.js \
+               | head -n 1 \
+               | grep -Eo '\bv[0-9a-z.-]+\b.*$'
+}
+
+# Prepare working tree
+cd $TARGET_REPO &&
+git reset $TARGET_DIR && git checkout $TARGET_DIR && git fetch origin &&
+git checkout -B upstream-oojsui origin/master || exit 1
+
+cd $UI_REPO || exit 1
+
+# Read the old version and check for changes
+OLDHASH=$(oojsuihash)
+if [ -z "$OLDHASH" ]
+then
+       OLDTAG=$(oojsuitag)
+fi
+if [ "$OLDHASH" == "" ]
+then
+       OLDHASH=$(git rev-parse $OLDTAG)
+       if [ $? != 0 ]
+       then
+               echo Could not find OOjs UI version
+               cd -
+               exit 1
+       fi
+fi
+if [ "$(git rev-parse $OLDHASH)" == "$(git rev-parse HEAD)" ]
+then
+       echo "No changes (already at $OLDHASH)"
+       cd -
+       exit 0
+fi
+
+# Build the distribution (using grunt-test instead of grunt-build, because we
+# want to run unit tests first, and because grunt-build is for a release build
+# and wouldn't put a git hash in the file headers)
+npm install && grunt test || exit 1
+
+# Get the list of changes
+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' ./dist/ $TARGET_REPO/$TARGET_DIR || exit 1
+
+# Read the new version
+NEWVERSION=$(oojsuiversion)
+
+# Generate commit
+cd $TARGET_REPO
+COMMITMSG=$(cat <<END
+Update OOjs UI to $NEWVERSION
+
+New changes:
+$NEWCHANGES
+END
+)
+git add -u $TARGET_DIR && git add $TARGET_DIR && git commit -m "$COMMITMSG"
+cat >&2 <<END
+
+
+Created commit with changes:
+$NEWCHANGESDISPLAY
+END
index f26350f..2c50002 100755 (executable)
@@ -1,23 +1,24 @@
 #!/usr/bin/env bash
 
-if [ "$2" != "" ]
+if [ -n "$2" ]
 then
+       # Too many parameters
        echo >&2 "Usage: $0 [<version>]"
        exit 1
 fi
 
-MW_DIR=$(cd $(dirname $0)/../..; pwd) # e.g. mediawiki-core/
-NPM_DIR=`mktemp -d 2>/dev/null || mktemp -d -t 'mw-update-oojs'` # e.g. /tmp/mw-update-oojs.rI0I5Vir
-
-# Prepare MediaWiki working copy
-cd $MW_DIR
-git reset resources/lib/oojs/ && git checkout resources/lib/oojs/ && git fetch origin || exit 1
+REPO_DIR=$(cd $(dirname $0)/../..; pwd) # Root dir of the git repo working tree
+TARGET_DIR=resources/lib/oojs # Destination relative to the root of the repo
+NPM_DIR=`mktemp -d 2>/dev/null || mktemp -d -t 'update-oojs'` # e.g. /tmp/update-oojs.rI0I5Vir
 
+# Prepare working tree
+cd $REPO_DIR &&
+git reset $TARGET_DIR && git checkout $TARGET_DIR && git fetch origin &&
 git checkout -B upstream-oojs origin/master || exit 1
 
 # Fetch upstream version
 cd $NPM_DIR
-if [ "$1" != "" ]
+if [ -n "$1" ]
 then
        npm install oojs@$1 || exit 1
 else
@@ -32,14 +33,14 @@ then
 fi
 
 # Copy file(s)
-mv ./node_modules/oojs/dist/* $MW_DIR/resources/lib/oojs/ || exit 1
-
-# Generate commit
-cd $MW_DIR || exit 1
+rsync --recursive --delete --force ./node_modules/oojs/dist $REPO_DIR/$TARGET_DIR || exit 1
 
 # Clean up temporary area
 rm -rf $NPM_DIR
 
+# Generate commit
+cd $REPO_DIR || exit 1
+
 COMMITMSG=$(cat <<END
 Update OOjs to v$OOJS_VERSION
 
@@ -48,4 +49,5 @@ Release notes:
 END
 )
 
-git commit resources/lib/oojs/ -m "$COMMITMSG" || exit 1
+# Stage deletion, modification and creation of files. Then commit.
+git add --update $TARGET_DIR && git add $TARGET_DIR && git commit -m "$COMMITMSG" || exit 1
index 1e0e441..967dda8 100644 (file)
@@ -33,8 +33,14 @@ require_once __DIR__ . '/Maintenance.php';
 class RollbackEdits extends Maintenance {
        public function __construct() {
                parent::__construct();
-               $this->mDescription = "Rollback all edits by a given user or IP provided they're the most recent edit";
-               $this->addOption( 'titles', 'A list of titles, none means all titles where the given user is the most recent', false, true );
+               $this->mDescription =
+                       "Rollback all edits by a given user or IP provided they're the most recent edit";
+               $this->addOption(
+                       'titles',
+                       'A list of titles, none means all titles where the given user is the most recent',
+                       false,
+                       true
+               );
                $this->addOption( 'user', 'A user or IP to rollback all edits for', true, true );
                $this->addOption( 'summary', 'Edit summary to use', false, true );
                $this->addOption( 'bot', 'Mark the edits as bot' );
@@ -66,6 +72,7 @@ class RollbackEdits extends Maintenance {
 
                if ( !$titles ) {
                        $this->output( 'No suitable titles to be rolled back' );
+
                        return;
                }
 
@@ -99,6 +106,7 @@ class RollbackEdits extends Maintenance {
                foreach ( $results as $row ) {
                        $titles[] = Title::makeTitle( $row->page_namespace, $row->page_title );
                }
+
                return $titles;
        }
 }
index 76340cd..af88905 100644 (file)
@@ -33,7 +33,8 @@ require_once __DIR__ . '/Maintenance.php';
 class BatchedQueryRunner extends Maintenance {
        public function __construct() {
                parent::__construct();
-               $this->mDescription = "Run a query repeatedly until it affects 0 rows, and wait for slaves in between.\n" .
+               $this->mDescription =
+                       "Run a query repeatedly until it affects 0 rows, and wait for slaves in between.\n" .
                                "NOTE: You need to set a LIMIT clause yourself.";
        }
 
index 13f526c..9b86e1b 100644 (file)
@@ -43,6 +43,7 @@ class RunJobs extends Maintenance {
                if ( $this->hasOption( 'memory-limit' ) ) {
                        return parent::memoryLimit();
                }
+
                // Don't eat all memory on the machine if we get a bad job.
                return "150M";
        }
@@ -79,7 +80,9 @@ class RunJobs extends Maintenance {
 
                $backoffs = $this->loadBackoffs(); // map of (type => UNIX expiry)
                $startingBackoffs = $backoffs; // avoid unnecessary writes
-               $backoffExpireFunc = function( $t ) { return $t > time(); };
+               $backoffExpireFunc = function ( $t ) {
+                       return $t > time();
+               };
 
                $jobsRun = 0; // counter
                $flags = JobQueueGroup::USE_CACHE;
@@ -99,7 +102,7 @@ class RunJobs extends Maintenance {
                                $this->runJobsLog( $job->toString() . " STARTING" );
 
                                // Set timer to stop the job if too much CPU time is used
-                               set_time_limit( $maxTime ?: 0 );
+                               set_time_limit( $maxTime ? : 0 );
                                // Run the job...
                                wfProfileIn( __METHOD__ . '-' . get_class( $job ) );
                                $t = microtime( true );
@@ -173,9 +176,12 @@ class RunJobs extends Maintenance {
        private function getBackoffTimeToWait( Job $job ) {
                global $wgJobBackoffThrottling;
 
-               if ( !isset( $wgJobBackoffThrottling[$job->getType()] ) ) {
+               if ( !isset( $wgJobBackoffThrottling[$job->getType()] ) ||
+                       $job instanceof DuplicateJob // no work was done
+               ) {
                        return 0; // not throttled
                }
+
                $itemsPerSecond = $wgJobBackoffThrottling[$job->getType()];
                if ( $itemsPerSecond <= 0 ) {
                        return 0; // not throttled
@@ -183,9 +189,11 @@ class RunJobs extends Maintenance {
 
                $seconds = 0;
                if ( $job->workItemCount() > 0 ) {
-                       $seconds = floor( $job->workItemCount() / $itemsPerSecond );
-                       $remainder = $job->workItemCount() % $itemsPerSecond;
-                       $seconds += ( mt_rand( 1, $itemsPerSecond ) <= $remainder ) ? 1 : 0;
+                       $exactSeconds = $job->workItemCount() / $itemsPerSecond;
+                       // use randomized rounding
+                       $seconds = floor( $exactSeconds );
+                       $remainder = $exactSeconds - $seconds;
+                       $seconds += ( mt_rand() / mt_getrandmax() < $remainder ) ? 1 : 0;
                }
 
                return (int)$seconds;
@@ -207,7 +215,7 @@ class RunJobs extends Maintenance {
                        $content = stream_get_contents( $handle );
                        flock( $handle, LOCK_UN );
                        fclose( $handle );
-                       $backoffs = json_decode( $content, true ) ?: array();
+                       $backoffs = json_decode( $content, true ) ? : array();
                }
 
                return $backoffs;
@@ -225,7 +233,7 @@ class RunJobs extends Maintenance {
                $handle = fopen( $file, 'wb+' );
                flock( $handle, LOCK_EX );
                $content = stream_get_contents( $handle );
-               $cBackoffs = json_decode( $content, true ) ?: array();
+               $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] );
index 854910f..3d16af1 100644 (file)
@@ -55,8 +55,16 @@ class ShowCacheStats extends Maintenance {
                $total = $hits + $expired + $absent + $stub;
                if ( $total ) {
                        $this->output( sprintf( "hits:              %-10d %6.2f%%\n", $hits, $hits / $total * 100 ) );
-                       $this->output( sprintf( "expired:           %-10d %6.2f%%\n", $expired, $expired / $total * 100 ) );
-                       $this->output( sprintf( "absent:            %-10d %6.2f%%\n", $absent, $absent / $total * 100 ) );
+                       $this->output( sprintf(
+                               "expired:           %-10d %6.2f%%\n",
+                               $expired,
+                               $expired / $total * 100
+                       ) );
+                       $this->output( sprintf(
+                               "absent:            %-10d %6.2f%%\n",
+                               $absent,
+                               $absent / $total * 100
+                       ) );
                        $this->output( sprintf( "stub threshold:    %-10d %6.2f%%\n", $stub, $stub / $total * 100 ) );
                        $this->output( sprintf( "total:             %-10d %6.2f%%\n", $total, 100 ) );
                } else {
@@ -70,7 +78,11 @@ class ShowCacheStats extends Maintenance {
                $total = $hits + $misses;
                if ( $total ) {
                        $this->output( sprintf( "hits:              %-10d %6.2f%%\n", $hits, $hits / $total * 100 ) );
-                       $this->output( sprintf( "misses:            %-10d %6.2f%%\n", $misses, $misses / $total * 100 ) );
+                       $this->output( sprintf(
+                               "misses:            %-10d %6.2f%%\n",
+                               $misses,
+                               $misses / $total * 100
+                       ) );
                        $this->output( sprintf( "updates:           %-10d\n", $updates ) );
                } else {
                        $this->output( "no statistics available\n" );
@@ -83,8 +95,16 @@ class ShowCacheStats extends Maintenance {
                $total = $hits + $misses + $uncacheable;
                if ( $total ) {
                        $this->output( sprintf( "hits:              %-10d %6.2f%%\n", $hits, $hits / $total * 100 ) );
-                       $this->output( sprintf( "misses:            %-10d %6.2f%%\n", $misses, $misses / $total * 100 ) );
-                       $this->output( sprintf( "uncacheable:       %-10d %6.2f%%\n", $uncacheable, $uncacheable / $total * 100 ) );
+                       $this->output( sprintf(
+                               "misses:            %-10d %6.2f%%\n",
+                               $misses,
+                               $misses / $total * 100
+                       ) );
+                       $this->output( sprintf(
+                               "uncacheable:       %-10d %6.2f%%\n",
+                               $uncacheable,
+                               $uncacheable / $total * 100
+                       ) );
                } else {
                        $this->output( "no statistics available\n" );
                }
index 5e21130..38f346b 100644 (file)
@@ -38,7 +38,10 @@ 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 complete list of all jobs in a machine-readable format, instead of statistics'
+               );
        }
 
        public function execute() {
index 49148b3..374a66e 100644 (file)
@@ -41,6 +41,7 @@ class ShowSiteStats extends Maintenance {
                parent::__construct();
                $this->mDescription = "Show the cached statistics";
        }
+
        public function execute() {
                $fields = array(
                        'ss_total_views' => 'Total views',
@@ -65,7 +66,11 @@ class ShowSiteStats extends Maintenance {
 
                // Show them
                foreach ( $fields as $field => $desc ) {
-                       $this->output( sprintf( "%-{$max_length_desc}s: %{$max_length_value}d\n", $desc, $stats->$field ) );
+                       $this->output( sprintf(
+                               "%-{$max_length_desc}s: %{$max_length_value}d\n",
+                               $desc,
+                               $stats->$field
+                       ) );
                }
        }
 }
index d43c8dc..c947a4c 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 );
@@ -53,7 +53,8 @@ class MwSql extends Maintenance {
                                $index = DB_SLAVE;
                        } else {
                                $index = null;
-                               for ( $i = 0; $i < $lb->getServerCount(); ++$i ) {
+                               $serverCount = $lb->getServerCount();
+                               for ( $i = 0; $i < $serverCount; ++$i ) {
                                        if ( $lb->getServerName( $i ) === $server ) {
                                                $index = $i;
                                                break;
@@ -87,12 +88,12 @@ class MwSql extends Maintenance {
                }
 
                $useReadline = function_exists( 'readline_add_history' )
-                               && Maintenance::posix_isatty( 0 /*STDIN*/ );
+                       && Maintenance::posix_isatty( 0 /*STDIN*/ );
 
                if ( $useReadline ) {
                        global $IP;
                        $historyFile = isset( $_ENV['HOME'] ) ?
-                                       "{$_ENV['HOME']}/.mwsql_history" : "$IP/maintenance/.mwsql_history";
+                               "{$_ENV['HOME']}/.mwsql_history" : "$IP/maintenance/.mwsql_history";
                        readline_read_history( $historyFile );
                }
 
@@ -125,7 +126,7 @@ class MwSql extends Maintenance {
                                $prompt = $newPrompt;
                                $wholeLine = '';
                        } catch ( DBQueryError $e ) {
-                               $doDie = ! Maintenance::posix_isatty( 0 );
+                               $doDie = !Maintenance::posix_isatty( 0 );
                                $this->error( $e, $doDie );
                        }
                }
index 6520e13..9729a72 100644 (file)
@@ -78,6 +78,7 @@ class Sqlite {
                                foreach ( $columns as $col ) {
                                        if ( !isset( $allowedTypes[strtolower( $col->type )] ) ) {
                                                $db->close();
+
                                                return "Table {$table->name} has column {$col->name} with non-native type '{$col->type}'";
                                        }
                                }
@@ -86,6 +87,7 @@ class Sqlite {
                        return $e->getMessage();
                }
                $db->close();
+
                return true;
        }
-};
+}
index 8a78524..edc9e14 100644 (file)
@@ -32,7 +32,10 @@ class SqliteMaintenance extends Maintenance {
        public function __construct() {
                parent::__construct();
                $this->mDescription = "Performs some operations specific to SQLite database backend";
-               $this->addOption( 'vacuum', 'Clean up database by removing deleted pages. Decreases database file size' );
+               $this->addOption(
+                       'vacuum',
+                       'Clean up database by removing deleted pages. Decreases database file size'
+               );
                $this->addOption( 'integrity', 'Check database for integrity' );
                $this->addOption( 'backup-to', 'Backup database to the given file', false, true );
                $this->addOption( 'check-syntax', 'Check SQL file(s) for syntax errors', false, true );
@@ -52,6 +55,7 @@ class SqliteMaintenance extends Maintenance {
                // Should work even if we use a non-SQLite database
                if ( $this->hasOption( 'check-syntax' ) ) {
                        $this->checkSyntax();
+
                        return;
                }
 
@@ -59,6 +63,7 @@ class SqliteMaintenance extends Maintenance {
 
                if ( $this->db->getType() != 'sqlite' ) {
                        $this->error( "This maintenance script requires a SQLite database.\n" );
+
                        return;
                }
 
@@ -98,6 +103,7 @@ class SqliteMaintenance extends Maintenance {
 
                if ( !$res || $res->numRows() == 0 ) {
                        $this->error( "Error: integrity check query returned nothing.\n" );
+
                        return;
                }
 
diff --git a/maintenance/sqlite/archives/patch-drop-rc_cur_time.sql b/maintenance/sqlite/archives/patch-drop-rc_cur_time.sql
new file mode 100644 (file)
index 0000000..350479f
--- /dev/null
@@ -0,0 +1,45 @@
+-- rc_cur_time is no longer used, delete the field
+CREATE TABLE /*_*/recentchanges_tmp (
+  rc_id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
+  rc_timestamp varbinary(14) NOT NULL default '',
+  rc_user int unsigned NOT NULL default 0,
+  rc_user_text varchar(255) binary NOT NULL,
+  rc_namespace int NOT NULL default 0,
+  rc_title varchar(255) binary NOT NULL default '',
+  rc_comment varchar(255) binary NOT NULL default '',
+  rc_minor tinyint unsigned NOT NULL default 0,
+  rc_bot tinyint unsigned NOT NULL default 0,
+  rc_new tinyint unsigned NOT NULL default 0,
+  rc_cur_id int unsigned NOT NULL default 0,
+  rc_this_oldid int unsigned NOT NULL default 0,
+  rc_last_oldid int unsigned NOT NULL default 0,
+  rc_type tinyint unsigned NOT NULL default 0,
+  rc_source varchar(16) binary not null default '',
+  rc_patrolled tinyint unsigned NOT NULL default 0,
+  rc_ip varbinary(40) NOT NULL default '',
+  rc_old_len int,
+  rc_new_len int,
+  rc_deleted tinyint unsigned NOT NULL default 0,
+  rc_logid int unsigned NOT NULL default 0,
+  rc_log_type varbinary(255) NULL default NULL,
+  rc_log_action varbinary(255) NULL default NULL,
+  rc_params blob NULL
+) /*$wgDBTableOptions*/;
+
+INSERT INTO /*_*/recentchanges_tmp
+       SELECT rc_id, rc_timestamp, rc_user, rc_user_text, rc_namespace, rc_title, rc_comment, rc_minor,
+               rc_bot, rc_new, rc_cur_id, rc_this_oldid, rc_last_oldid, rc_type, rc_source, rc_patrolled,
+               rc_ip, rc_old_len, rc_new_len, rc_deleted, rc_logid, rc_log_type, rc_log_action, rc_params
+               FROM /*_*/recentchanges;
+
+DROP TABLE /*_*/recentchanges;
+
+ALTER TABLE /*_*/recentchanges_tmp RENAME TO /*_*/recentchanges;
+
+CREATE INDEX /*i*/rc_timestamp ON /*_*/recentchanges (rc_timestamp);
+CREATE INDEX /*i*/rc_namespace_title ON /*_*/recentchanges (rc_namespace, rc_title);
+CREATE INDEX /*i*/rc_cur_id ON /*_*/recentchanges (rc_cur_id);
+CREATE INDEX /*i*/new_name_timestamp ON /*_*/recentchanges (rc_new,rc_namespace,rc_timestamp);
+CREATE INDEX /*i*/rc_ip ON /*_*/recentchanges (rc_ip);
+CREATE INDEX /*i*/rc_ns_usertext ON /*_*/recentchanges (rc_namespace, rc_user_text);
+CREATE INDEX /*i*/rc_user_text ON /*_*/recentchanges (rc_user_text, rc_timestamp);
\ No newline at end of file
index 9174d12..0f99662 100644 (file)
@@ -211,8 +211,12 @@ class CheckStorage {
                        $curIds = array();
                        if ( count( $objectRevs ) ) {
                                $headerLength = 300;
-                               $res = $dbr->select( 'text', array( 'old_id', 'old_flags', "LEFT(old_text, $headerLength) AS header" ),
-                                       array( 'old_id IN (' . implode( ',', $objectRevs ) . ')' ), __METHOD__ );
+                               $res = $dbr->select(
+                                       'text',
+                                       array( 'old_id', 'old_flags', "LEFT(old_text, $headerLength) AS header" ),
+                                       array( 'old_id IN (' . implode( ',', $objectRevs ) . ')' ),
+                                       __METHOD__
+                               );
                                foreach ( $res as $row ) {
                                        $oldId = $row->old_id;
                                        $matches = array();
@@ -223,7 +227,11 @@ class CheckStorage {
 
                                        $className = strtolower( $matches[2] );
                                        if ( strlen( $className ) != $matches[1] ) {
-                                               $this->error( 'restore text', "Error: invalid object header, wrong class name length", $oldId );
+                                               $this->error(
+                                                       'restore text',
+                                                       "Error: invalid object header, wrong class name length",
+                                                       $oldId
+                                               );
                                                continue;
                                        }
 
@@ -262,8 +270,12 @@ class CheckStorage {
                        $externalConcatBlobs = array();
                        if ( count( $concatBlobs ) ) {
                                $headerLength = 300;
-                               $res = $dbr->select( 'text', array( 'old_id', 'old_flags', "LEFT(old_text, $headerLength) AS header" ),
-                                       array( 'old_id IN (' . implode( ',', array_keys( $concatBlobs ) ) . ')' ), __METHOD__ );
+                               $res = $dbr->select(
+                                       'text',
+                                       array( 'old_id', 'old_flags', "LEFT(old_text, $headerLength) AS header" ),
+                                       array( 'old_id IN (' . implode( ',', array_keys( $concatBlobs ) ) . ')' ),
+                                       __METHOD__
+                               );
                                foreach ( $res as $row ) {
                                        $flags = explode( ',', $row->old_flags );
                                        if ( in_array( 'external', $flags ) ) {
@@ -271,7 +283,11 @@ class CheckStorage {
                                                if ( in_array( 'object', $flags ) ) {
                                                        $urlParts = explode( '/', $row->header );
                                                        if ( $urlParts[0] != 'DB:' ) {
-                                                               $this->error( 'unfixable', "Error: unrecognised external storage type \"{$urlParts[0]}", $row->old_id );
+                                                               $this->error(
+                                                                       'unfixable',
+                                                                       "Error: unrecognised external storage type \"{$urlParts[0]}",
+                                                                       $row->old_id
+                                                               );
                                                        } else {
                                                                $cluster = $urlParts[2];
                                                                $id = $urlParts[3];
@@ -283,12 +299,20 @@ class CheckStorage {
                                                                );
                                                        }
                                                } else {
-                                                       $this->error( 'unfixable', "Error: invalid flags \"{$row->old_flags}\" on concat bulk row {$row->old_id}",
+                                                       $this->error(
+                                                               'unfixable',
+                                                               "Error: invalid flags \"{$row->old_flags}\" on concat bulk row {$row->old_id}",
                                                                $concatBlobs[$row->old_id] );
                                                }
-                                       } elseif ( strcasecmp( substr( $row->header, 0, strlen( self::CONCAT_HEADER ) ), self::CONCAT_HEADER ) ) {
-                                               $this->error( 'restore text', "Error: Incorrect object header for concat bulk row {$row->old_id}",
-                                                       $concatBlobs[$row->old_id] );
+                                       } elseif ( strcasecmp(
+                                               substr( $row->header, 0, strlen( self::CONCAT_HEADER ) ),
+                                               self::CONCAT_HEADER
+                                       ) ) {
+                                               $this->error(
+                                                       'restore text',
+                                                       "Error: Incorrect object header for concat bulk row {$row->old_id}",
+                                                       $concatBlobs[$row->old_id]
+                                               );
                                        } # else good
 
                                        unset( $concatBlobs[$row->old_id] );
@@ -298,7 +322,6 @@ class CheckStorage {
 
                        // Check targets of unresolved stubs
                        $this->checkExternalConcatBlobs( $externalConcatBlobs );
-
                        // next chunk
                }
 
@@ -372,17 +395,23 @@ class CheckStorage {
                                array( 'blob_id IN( ' . implode( ',', $blobIds ) . ')' ), __METHOD__ );
                        foreach ( $res as $row ) {
                                if ( strcasecmp( $row->header, self::CONCAT_HEADER ) ) {
-                                       $this->error( 'restore text', "Error: invalid header on target $cluster/{$row->blob_id} of two-part ES URL",
-                                               $oldIds[$row->blob_id] );
+                                       $this->error(
+                                               'restore text',
+                                               "Error: invalid header on target $cluster/{$row->blob_id} of two-part ES URL",
+                                               $oldIds[$row->blob_id]
+                                       );
                                }
                                unset( $oldIds[$row->blob_id] );
-
                        }
                        $extDb->freeResult( $res );
 
                        // Print errors for missing blobs rows
                        foreach ( $oldIds as $blobId => $oldIds2 ) {
-                               $this->error( 'restore text', "Error: missing target $cluster/$blobId for two-part ES URL", $oldIds2 );
+                               $this->error(
+                                       'restore text',
+                                       "Error: missing target $cluster/$blobId for two-part ES URL",
+                                       $oldIds2
+                               );
                        }
                }
        }
@@ -403,6 +432,7 @@ class CheckStorage {
                // Write revision list
                if ( !file_put_contents( $revFileName, implode( "\n", $revIds ) ) ) {
                        echo "Error writing revision list, can't restore text\n";
+
                        return;
                }
 
@@ -419,12 +449,14 @@ class CheckStorage {
 
                if ( $exitStatus ) {
                        echo "mwdumper died with exit status $exitStatus\n";
+
                        return;
                }
 
                $file = fopen( $filteredXmlFileName, 'r' );
                if ( !$file ) {
                        echo "Unable to open filtered XML file\n";
+
                        return;
                }
 
@@ -446,6 +478,7 @@ class CheckStorage {
 
                if ( $content === null ) {
                        echo "Revision $id is broken, we have no content available\n";
+
                        return;
                }
 
@@ -457,12 +490,14 @@ class CheckStorage {
                        // be safe, we'll skip it and leave it broken
 
                        echo "Revision $id is blank in the dump, may have been broken before export\n";
+
                        return;
                }
 
                if ( !$id ) {
                        // No ID, can't import
                        echo "No id tag in revision, can't import\n";
+
                        return;
                }
 
@@ -471,6 +506,7 @@ class CheckStorage {
                $oldId = $dbr->selectField( 'revision', 'rev_text_id', array( 'rev_id' => $id ), __METHOD__ );
                if ( !$oldId ) {
                        echo "Missing revision row for rev_id $id\n";
+
                        return;
                }
 
index e824d8c..0f337ec 100644 (file)
@@ -59,12 +59,41 @@ class CompressOld extends Maintenance {
                parent::__construct();
                $this->mDescription = 'Compress the text of a wiki';
                $this->addOption( 'type', 'Set compression type to either: gzip|concat', false, true, 't' );
-               $this->addOption( 'chunksize', 'Maximum number of revisions in a concat chunk', false, true, 'c' );
-               $this->addOption( 'begin-date', 'Earliest date to check for uncompressed revisions', false, true, 'b' );
+               $this->addOption(
+                       'chunksize',
+                       'Maximum number of revisions in a concat chunk',
+                       false,
+                       true,
+                       'c'
+               );
+               $this->addOption(
+                       'begin-date',
+                       'Earliest date to check for uncompressed revisions',
+                       false,
+                       true,
+                       'b'
+               );
                $this->addOption( 'end-date', 'Latest revision date to compress', false, true, 'e' );
-               $this->addOption( 'startid', 'The id to start from (gzip -> text table, concat -> page table)', false, true, 's' );
-               $this->addOption( 'extdb', 'Store specified revisions in an external cluster (untested)', false, true );
-               $this->addOption( 'endid', 'The page_id to stop at (only when using concat compression type)', false, true, 'n' );
+               $this->addOption(
+                       'startid',
+                       'The id to start from (gzip -> text table, concat -> page table)',
+                       false,
+                       true,
+                       's'
+               );
+               $this->addOption(
+                       'extdb',
+                       'Store specified revisions in an external cluster (untested)',
+                       false,
+                       true
+               );
+               $this->addOption(
+                       'endid',
+                       'The page_id to stop at (only when using concat compression type)',
+                       false,
+                       true,
+                       'n'
+               );
        }
 
        public function execute() {
@@ -113,17 +142,26 @@ class CompressOld extends Maintenance {
                $this->output( "Starting from old_id $start...\n" );
                $dbw = wfGetDB( DB_MASTER );
                do {
-                       $res = $dbw->select( 'text', array( 'old_id', 'old_flags', 'old_text' ),
-                               "old_id>=$start", __METHOD__, array( 'ORDER BY' => 'old_id', 'LIMIT' => $chunksize, 'FOR UPDATE' ) );
+                       $res = $dbw->select(
+                               'text',
+                               array( 'old_id', 'old_flags', 'old_text' ),
+                               "old_id>=$start",
+                               __METHOD__,
+                               array( 'ORDER BY' => 'old_id', 'LIMIT' => $chunksize, 'FOR UPDATE' )
+                       );
+
                        if ( $res->numRows() == 0 ) {
                                break;
                        }
+
                        $last = $start;
+
                        foreach ( $res as $row ) {
                                # print "  {$row->old_id} - {$row->old_namespace}:{$row->old_title}\n";
                                $this->compressPage( $row, $extdb );
                                $last = $row->old_id;
                        }
+
                        $start = $last + 1; # Deletion may leave long empty stretches
                        $this->output( "$start...\n" );
                } while ( true );
@@ -136,7 +174,9 @@ class CompressOld extends Maintenance {
         * @return bool
         */
        private function compressPage( $row, $extdb ) {
-               if ( false !== strpos( $row->old_flags, 'gzip' ) || false !== strpos( $row->old_flags, 'object' ) ) {
+               if ( false !== strpos( $row->old_flags, 'gzip' )
+                       || false !== strpos( $row->old_flags, 'object' )
+               ) {
                        #print "Already compressed row {$row->old_id}\n";
                        return false;
                }
@@ -150,6 +190,7 @@ class CompressOld extends Maintenance {
                        $compress = $storeObj->store( $extdb, $compress );
                        if ( $compress === false ) {
                                $this->error( "Unable to store object" );
+
                                return false;
                        }
                }
@@ -164,6 +205,7 @@ class CompressOld extends Maintenance {
                        ), __METHOD__,
                        array( 'LIMIT' => 1 )
                );
+
                return true;
        }
 
@@ -213,12 +255,15 @@ class CompressOld extends Maintenance {
                # overwriting bulk storage concat rows. Don't compress external references, because
                # the script doesn't yet delete rows from external storage.
                $conds = array(
-                       'old_flags NOT ' . $dbr->buildLike( $dbr->anyString(), 'object', $dbr->anyString() ) . ' AND old_flags NOT '
-                               . $dbr->buildLike( $dbr->anyString(), 'external', $dbr->anyString() ) );
+                       'old_flags NOT ' . $dbr->buildLike( $dbr->anyString(), 'object', $dbr->anyString() )
+                       . ' AND old_flags NOT '
+                       . $dbr->buildLike( $dbr->anyString(), 'external', $dbr->anyString() )
+               );
 
                if ( $beginDate ) {
                        if ( !preg_match( '/^\d{14}$/', $beginDate ) ) {
                                $this->error( "Invalid begin date \"$beginDate\"\n" );
+
                                return false;
                        }
                        $conds[] = "rev_timestamp>'" . $beginDate . "'";
@@ -226,6 +271,7 @@ class CompressOld extends Maintenance {
                if ( $endDate ) {
                        if ( !preg_match( '/^\d{14}$/', $endDate ) ) {
                                $this->error( "Invalid end date \"$endDate\"\n" );
+
                                return false;
                        }
                        $conds[] = "rev_timestamp<'" . $endDate . "'";
@@ -303,8 +349,10 @@ class CompressOld extends Maintenance {
                                $usedChunk = false;
                                $primaryOldid = $revs[$i]->rev_text_id;
 
+                               // @codingStandardsIgnoreStart Ignore avoid function calls in a FOR loop test part warning
                                # Get the text of each revision and add it to the object
                                for ( $j = 0; $j < $thisChunkSize && $chunk->isHappy(); $j++ ) {
+                                       // @codingStandardsIgnoreEnd
                                        $oldid = $revs[$i + $j]->rev_text_id;
 
                                        # Get text
@@ -350,9 +398,10 @@ class CompressOld extends Maintenance {
                                if ( $usedChunk ) {
                                        if ( $extdb != "" ) {
                                                # Move blob objects to External Storage
-                                               $stored = $storeObj->store( $extdb, serialize( $chunk ));
+                                               $stored = $storeObj->store( $extdb, serialize( $chunk ) );
                                                if ( $stored === false ) {
                                                        $this->error( "Unable to store object" );
+
                                                        return false;
                                                }
                                                # Store External Storage URLs instead of Stub placeholders
@@ -406,9 +455,9 @@ class CompressOld extends Maintenance {
                        }
                        $this->output( "\n" );
                }
+
                return true;
        }
-
 }
 
 $maintClass = 'CompressOld';
index ff2a9ef..d2fe3b4 100644 (file)
@@ -296,6 +296,7 @@ class FixBug20757 extends Maintenance {
                        $this->mapCache[$pageId] = $map;
                        $this->mapCacheSize += count( $map );
                }
+
                return $this->mapCache[$pageId];
        }
 
@@ -311,7 +312,10 @@ class FixBug20757 extends Maintenance {
                $text = $secondaryRow->old_text;
                if ( in_array( 'external', $flags ) ) {
                        $url = $text;
-                       @list( /* $proto */ , $path ) = explode( '://', $url, 2 );
+                       wfSuppressWarnings();
+                       list( /* $proto */, $path ) = explode( '://', $url, 2 );
+                       wfRestoreWarnings();
+
                        if ( $path == "" ) {
                                return false;
                        }
@@ -338,6 +342,7 @@ class FixBug20757 extends Maintenance {
 
                $obj->uncompress();
                $text = $obj->getItem( $stub['hash'] );
+
                return $text !== false;
        }
 }
index 1df1501..c5213ad 100644 (file)
@@ -32,11 +32,13 @@ require_once __DIR__ . '/../Maintenance.php';
 class OrphanStats extends Maintenance {
        public function __construct() {
                parent::__construct();
-               $this->mDescription = "how some statistics on the blob_orphans table, created with trackBlobs.php";
+               $this->mDescription =
+                       "Show some statistics on the blob_orphans table, created with trackBlobs.php";
        }
 
        protected function &getDB( $cluster, $groups = array(), $wiki = false ) {
                $lb = wfGetLBFactory()->getExternalLB( $cluster );
+
                return $lb->getConnection( DB_SLAVE );
        }
 
@@ -54,12 +56,17 @@ class OrphanStats extends Maintenance {
 
                foreach ( $res as $boRow ) {
                        $extDB = $this->getDB( $boRow->bo_cluster );
-                       $blobRow = $extDB->selectRow( 'blobs', '*', array( 'blob_id' => $boRow->bo_blob_id ), __METHOD__ );
+                       $blobRow = $extDB->selectRow(
+                               'blobs',
+                               '*',
+                               array( 'blob_id' => $boRow->bo_blob_id ),
+                               __METHOD__
+                       );
 
                        $num++;
                        $size = strlen( $blobRow->blob_text );
                        $totalSize += $size;
-                       $hashes[ sha1( $blobRow->blob_text ) ] = true;
+                       $hashes[sha1( $blobRow->blob_text )] = true;
                        $maxSize = max( $size, $maxSize );
                }
                unset( $res );
@@ -67,8 +74,8 @@ class OrphanStats extends Maintenance {
                $this->output( "Number of orphans: $num\n" );
                if ( $num > 0 ) {
                        $this->output( "Average size: " . round( $totalSize / $num, 0 ) . " bytes\n" .
-                       "Max size: $maxSize\n" .
-                       "Number of unique texts: " . count( $hashes ) . "\n" );
+                               "Max size: $maxSize\n" .
+                               "Number of unique texts: " . count( $hashes ) . "\n" );
                }
        }
 }
index 27d9cb0..307d0b0 100644 (file)
@@ -27,14 +27,16 @@ require __DIR__ . '/../commandLine.inc';
 
 if ( count( $args ) < 1 ) {
        echo "Usage: php recompressTracked.php [options] <cluster> [... <cluster>...]
-Moves blobs indexed by trackBlobs.php to a specified list of destination clusters, and recompresses them in the process. Restartable.
+Moves blobs indexed by trackBlobs.php to a specified list of destination clusters,
+and recompresses them in the process. Restartable.
 
 Options:
-       --procs <procs>         Set the number of child processes (default 1)
-       --copy-only             Copy only, do not update the text table. Restart without this option to complete.
-       --debug-log <file>      Log debugging data to the specified file
-       --info-log <file>       Log progress messages to the specified file
-       --critical-log <file>   Log error messages to the specified file
+       --procs <procs>       Set the number of child processes (default 1)
+       --copy-only           Copy only, do not update the text table. Restart
+                             without this option to complete.
+       --debug-log <file>    Log debugging data to the specified file
+       --info-log <file>     Log progress messages to the specified file
+       --critical-log <file> Log error messages to the specified file
 ";
        exit( 1 );
 }
@@ -63,8 +65,15 @@ class RecompressTracked {
        public $debugLog, $infoLog, $criticalLog;
        public $store;
 
-       static $optionsWithArgs = array( 'procs', 'slave-id', 'debug-log', 'info-log', 'critical-log' );
-       static $cmdLineOptionMap = array(
+       private static $optionsWithArgs = array(
+               'procs',
+               'slave-id',
+               'debug-log',
+               'info-log',
+               'critical-log'
+       );
+
+       private static $cmdLineOptionMap = array(
                'no-count' => 'noCount',
                'procs' => 'numProcs',
                'copy-only' => 'copyOnly',
@@ -86,6 +95,7 @@ class RecompressTracked {
                                $jobOptions[$classOption] = $options[$cmdOption];
                        }
                }
+
                return new self( $jobOptions );
        }
 
@@ -109,7 +119,6 @@ class RecompressTracked {
                if ( $this->debugLog ) {
                        $this->logToFile( $msg, $this->debugLog );
                }
-
        }
 
        function info( $msg ) {
@@ -181,13 +190,16 @@ class RecompressTracked {
                $dbr = wfGetDB( DB_SLAVE );
                if ( !$dbr->tableExists( 'blob_tracking' ) ) {
                        $this->critical( "Error: blob_tracking table does not exist" );
+
                        return false;
                }
                $row = $dbr->selectRow( 'blob_tracking', '*', false, __METHOD__ );
                if ( !$row ) {
                        $this->info( "Warning: blob_tracking table contains no rows, skipping this wiki." );
+
                        return false;
                }
+
                return true;
        }
 
@@ -267,6 +279,7 @@ class RecompressTracked {
                        if ( isset( $pipes[$slaveId] ) ) {
                                $this->prevSlaveId = $slaveId;
                                $this->dispatchToSlave( $slaveId, $args );
+
                                return;
                        }
                }
@@ -434,14 +447,14 @@ class RecompressTracked {
                        $args = explode( ' ', $line );
                        $cmd = array_shift( $args );
                        switch ( $cmd ) {
-                       case 'doPage':
-                               $this->doPage( intval( $args[0] ) );
-                               break;
-                       case 'doOrphanList':
-                               $this->doOrphanList( array_map( 'intval', $args ) );
-                               break;
-                       case 'quit':
-                               return;
+                               case 'doPage':
+                                       $this->doPage( intval( $args[0] ) );
+                                       break;
+                               case 'doOrphanList':
+                                       $this->doOrphanList( array_map( 'intval', $args ) );
+                                       break;
+                               case 'quit':
+                                       return;
                        }
                        $this->waitForSlaves();
                }
@@ -609,6 +622,7 @@ class RecompressTracked {
                if ( $cluster === false ) {
                        $cluster = reset( $this->destClusters );
                }
+
                return $cluster;
        }
 
@@ -619,6 +633,7 @@ class RecompressTracked {
         */
        function getExtDB( $cluster ) {
                $lb = wfGetLBFactory()->getExternalLB( $cluster );
+
                return $lb->getConnection( DB_MASTER );
        }
 
@@ -715,6 +730,7 @@ class CgzCopyTransaction {
                $hash = $this->cgz->addItem( $text );
                $this->referrers[$textId] = $hash;
                $this->texts[$textId] = $text;
+
                return $this->cgz->isHappy();
        }
 
@@ -778,6 +794,7 @@ class CgzCopyTransaction {
                                        $this->critical( "Warning: concurrent operation detected, are there two conflicting " .
                                                "processes running, doing the same job?" );
                                }
+
                                return;
                        }
                        $this->recompress();
index e47d640..dff5cb8 100644 (file)
@@ -77,12 +77,18 @@ function resolveStub( $id, $stubText, $flags ) {
 
        if ( strtolower( get_class( $stub ) ) !== 'historyblobstub' ) {
                print "Error found object of class " . get_class( $stub ) . ", expecting historyblobstub\n";
+
                return;
        }
 
        # Get the (maybe) external row
-       $externalRow = $dbr->selectRow( 'text', array( 'old_text' ),
-               array( 'old_id' => $stub->mOldId, 'old_flags' . $dbr->buildLike( $dbr->anyString(), 'external', $dbr->anyString() ) ),
+       $externalRow = $dbr->selectRow(
+               'text',
+               array( 'old_text' ),
+               array(
+                       'old_id' => $stub->mOldId,
+                       'old_flags' . $dbr->buildLike( $dbr->anyString(), 'external', $dbr->anyString() )
+               ),
                $fname
        );
 
index d693986..f7ec662 100644 (file)
@@ -24,8 +24,9 @@
 $optionsWithArgs = array( 'start', 'limit', 'type' );
 require __DIR__ . '/../commandLine.inc';
 
-if ( !isset( $args[0] )  ) {
-       echo "Usage: php testCompression.php [--type=<type>] [--start=<start-date>] [--limit=<num-revs>] <page-title>\n";
+if ( !isset( $args[0] ) ) {
+       echo "Usage: php testCompression.php [--type=<type>] [--start=<start-date>] " .
+               "[--limit=<num-revs>] <page-title>\n";
        exit( 1 );
 }
 
index c2df0dd..a3f9386 100644 (file)
@@ -126,6 +126,7 @@ class TrackBlobs {
                                $this->textClause .= 'old_text' . $dbr->buildLike( "DB://$cluster/", $dbr->anyString() );
                        }
                }
+
                return $this->textClause;
        }
 
@@ -133,6 +134,7 @@ class TrackBlobs {
                if ( !preg_match( '!^DB://(\w+)/(\d+)(?:/([0-9a-fA-F]+)|)$!', $text, $m ) ) {
                        return false;
                }
+
                return array(
                        'cluster' => $m[1],
                        'id' => intval( $m[2] ),
@@ -305,6 +307,7 @@ class TrackBlobs {
        function findOrphanBlobs() {
                if ( !extension_loaded( 'gmp' ) ) {
                        echo "Can't find orphan blobs, need bitfield support provided by GMP.\n";
+
                        return;
                }
 
index c505b14..b9493cd 100644 (file)
@@ -71,6 +71,7 @@ class SyncFileBackend extends Maintenance {
                        if ( $this->isQuiet() ) {
                                print $id; // give a single machine-readable number
                        }
+
                        return;
                }
 
@@ -104,7 +105,7 @@ class SyncFileBackend extends Maintenance {
                }
 
                // Periodically update the position file
-               $callback = function( $pos ) use ( $startFromPosFile, $posFile, $start ) {
+               $callback = function ( $pos ) use ( $startFromPosFile, $posFile, $start ) {
                        if ( $startFromPosFile && $pos >= $start ) { // successfully advanced
                                file_put_contents( $posFile, $pos, LOCK_EX );
                        }
@@ -238,6 +239,7 @@ class SyncFileBackend extends Maintenance {
                                if ( !$fsFile ) {
                                        $this->error( "Unable to sync '$dPath': could not get local copy." );
                                        $status->fatal( 'backend-fail-internal', $src->getName() );
+
                                        return $status;
                                }
                                $fsFiles[] = $fsFile; // keep TempFSFile objects alive as needed
@@ -254,6 +256,7 @@ class SyncFileBackend extends Maintenance {
                        } else { // error
                                $this->error( "Unable to sync '$dPath': could not stat file." );
                                $status->fatal( 'backend-fail-internal', $src->getName() );
+
                                return $status;
                        }
                }
index ca610fc..1b8d618 100644 (file)
@@ -1035,11 +1035,6 @@ CREATE TABLE /*_*/recentchanges (
   rc_id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
   rc_timestamp varbinary(14) NOT NULL default '',
 
-  -- This is no longer used
-  -- Field kept in database for downgrades
-  -- @todo: add drop patch with 1.24
-  rc_cur_time varbinary(14) NOT NULL default '',
-
   -- As in revision
   rc_user int unsigned NOT NULL default 0,
   rc_user_text varchar(255) binary NOT NULL,
@@ -1429,12 +1424,13 @@ CREATE INDEX /*i*/pt_timestamp ON /*_*/protected_titles (pt_timestamp);
 CREATE TABLE /*_*/page_props (
   pp_page int NOT NULL,
   pp_propname varbinary(60) NOT NULL,
-  pp_value blob NOT NULL
+  pp_value blob NOT NULL,
+  pp_sortkey float DEFAULT NULL
 ) /*$wgDBTableOptions*/;
 
 CREATE UNIQUE INDEX /*i*/pp_page_propname ON /*_*/page_props (pp_page,pp_propname);
 CREATE UNIQUE INDEX /*i*/pp_propname_page ON /*_*/page_props (pp_propname,pp_page);
-
+CREATE UNIQUE INDEX /*i*/pp_propname_sortkey_page ON /*_*/page_props (pp_propname,pp_sortkey,pp_page);
 
 -- A table to log updates, one text key row per update.
 CREATE TABLE /*_*/updatelog (
old mode 100644 (file)
new mode 100755 (executable)
index 8c1ad17..a51564a
@@ -1,3 +1,4 @@
+#!/usr/bin/env php
 <?php
 /**
  * Run all updaters.
@@ -47,13 +48,19 @@ class UpdateMediaWiki extends Maintenance {
                $this->addOption( 'doshared', 'Also update shared tables' );
                $this->addOption( 'nopurge', 'Do not purge the objectcache table after updates' );
                $this->addOption( 'noschema', 'Only do the updates that are not done during schema updates' );
-               $this->addOption( 'schema', 'Output SQL to do the schema updates instead of doing them.  Works even when $wgAllowSchemaUpdates is false', false, true );
+               $this->addOption(
+                       'schema',
+                       'Output SQL to do the schema updates instead of doing them. Works '
+                               . 'even when $wgAllowSchemaUpdates is false',
+                       false,
+                       true
+               );
                $this->addOption( 'force', 'Override when $wgAllowSchemaUpdates disables this script' );
        }
 
        function getDbType() {
                /* If we used the class constant PHP4 would give a parser error here */
-               return 2 /* Maintenance::DB_ADMIN */;
+               return 2; /* Maintenance::DB_ADMIN */
        }
 
        function compatChecks() {
@@ -85,7 +92,11 @@ class UpdateMediaWiki extends Maintenance {
        function execute() {
                global $wgVersion, $wgLang, $wgAllowSchemaUpdates;
 
-               if ( !$wgAllowSchemaUpdates && !( $this->hasOption( 'force' ) || $this->hasOption( 'schema' ) || $this->hasOption( 'noschema' ) ) ) {
+               if ( !$wgAllowSchemaUpdates
+                       && !( $this->hasOption( 'force' )
+                               || $this->hasOption( 'schema' )
+                               || $this->hasOption( 'noschema' ) )
+               ) {
                        $this->error( "Do not run update.php on this wiki. If you're seeing this you should\n"
                                . "probably ask for some help in performing your schema updates or use\n"
                                . "the --noschema and --schema options to get an SQL file for someone\n"
@@ -131,7 +142,8 @@ class UpdateMediaWiki extends Maintenance {
                $this->output( "Depending on the size of your database this may take a while!\n" );
 
                if ( !$this->hasOption( 'quick' ) ) {
-                       $this->output( "Abort with control-c in the next five seconds (skip this countdown with --quick) ... " );
+                       $this->output( "Abort with control-c in the next five seconds "
+                               . "(skip this countdown with --quick) ... " );
                        wfCountDown( 5 );
                }
 
index 7964a21..470647a 100644 (file)
@@ -49,10 +49,16 @@ class UpdateArticleCount extends Maintenance {
                if ( $this->hasOption( 'update' ) ) {
                        $this->output( "Updating site statistics table... " );
                        $dbw = wfGetDB( DB_MASTER );
-                       $dbw->update( 'site_stats', array( 'ss_good_articles' => $result ), array( 'ss_row_id' => 1 ), __METHOD__ );
+                       $dbw->update(
+                               'site_stats',
+                               array( 'ss_good_articles' => $result ),
+                               array( 'ss_row_id' => 1 ),
+                               __METHOD__
+                       );
                        $this->output( "done.\n" );
                } else {
-                       $this->output( "To update the site statistics table, run the script with the --update option.\n" );
+                       $this->output( "To update the site statistics table, run the script "
+                               . "with the --update option.\n" );
                }
        }
 }
index 7ca04b4..19c1d24 100644 (file)
@@ -120,6 +120,7 @@ TEXT;
                        }
                        if ( $count == 0 ) {
                                $this->output( "Collations up-to-date.\n" );
+
                                return;
                        }
                        $this->output( "Fixing collation for $count rows.\n" );
@@ -150,7 +151,8 @@ TEXT;
                                        # This is an old-style row, so the sortkey needs to be
                                        # converted.
                                        if ( $row->cl_sortkey == $title->getText()
-                                               || $row->cl_sortkey == $title->getPrefixedText() ) {
+                                               || $row->cl_sortkey == $title->getPrefixedText()
+                                       ) {
                                                $prefix = '';
                                        } else {
                                                # Custom sortkey, use it as a prefix
@@ -236,6 +238,7 @@ TEXT;
                                $prefix .= " AND $equality";
                        }
                }
+
                return $cond;
        }
 
index 41988d1..796cedd 100644 (file)
@@ -36,7 +36,12 @@ class UpdateDoubleWidthSearch extends Maintenance {
                parent::__construct();
                $this->mDescription = "Script to normalize double-byte latin UTF-8 characters";
                $this->addOption( 'q', 'quiet', false, true );
-               $this->addOption( 'l', 'How long the searchindex and revision tables will be locked for', false, true );
+               $this->addOption(
+                       'l',
+                       'How long the searchindex and revision tables will be locked for',
+                       false,
+                       true
+               );
        }
 
        public function getDbType() {
@@ -67,6 +72,7 @@ class UpdateDoubleWidthSearch extends Maintenance {
                $sql = "SELECT si_page FROM $searchindex
                                 WHERE ( si_text RLIKE '$regexp' )
                                        OR ( si_title RLIKE '$regexp' )";
+
                return $dbw->query( $sql, __METHOD__ );
        }
 }
index 175447e..5b5cc04 100644 (file)
@@ -59,7 +59,12 @@ class UpdateRestrictions extends Maintenance {
                while ( $blockEnd <= $end ) {
                        $this->output( "...doing page_id from $blockStart to $blockEnd\n" );
                        $cond = "page_id BETWEEN $blockStart AND $blockEnd AND page_restrictions !=''";
-                       $res = $db->select( 'page', array( 'page_id', 'page_namespace', 'page_restrictions' ), $cond, __METHOD__ );
+                       $res = $db->select(
+                               'page',
+                               array( 'page_id', 'page_namespace', 'page_restrictions' ),
+                               $cond,
+                               __METHOD__
+                       );
                        $batch = array();
                        foreach ( $res as $row ) {
                                $oldRestrictions = array();
@@ -108,7 +113,13 @@ class UpdateRestrictions extends Maintenance {
                // Kill any broken rows from previous imports
                $db->delete( 'page_restrictions', array( 'pr_level' => '' ) );
                // Kill other invalid rows
-               $db->deleteJoin( 'page_restrictions', 'page', 'pr_page', 'page_id', array( 'page_namespace' => NS_MEDIAWIKI ) );
+               $db->deleteJoin(
+                       'page_restrictions',
+                       'page',
+                       'pr_page',
+                       'page_id',
+                       array( 'page_namespace' => NS_MEDIAWIKI )
+               );
                $this->output( "...Done!\n" );
        }
 }
index 0691bee..68a51bd 100644 (file)
@@ -42,8 +42,18 @@ class UpdateSearchIndex extends Maintenance {
                $this->mDescription = "Script for periodic off-peak updating of the search index";
                $this->addOption( 's', 'starting timestamp', false, true );
                $this->addOption( 'e', 'Ending timestamp', false, true );
-               $this->addOption( 'p', 'File for saving/loading timestamps, searchUpdate.WIKI_ID.pos by default', false, true );
-               $this->addOption( 'l', 'How long the searchindex and revision tables will be locked for', false, true );
+               $this->addOption(
+                       'p',
+                       'File for saving/loading timestamps, searchUpdate.WIKI_ID.pos by default',
+                       false,
+                       true
+               );
+               $this->addOption(
+                       'l',
+                       'How long the searchindex and revision tables will be locked for',
+                       false,
+                       true
+               );
        }
 
        public function getDbType() {
index 12c4a2c..fae9063 100644 (file)
@@ -57,8 +57,8 @@ class UpdateSpecialPages extends Maintenance {
                        }
 
                        if ( !$this->hasOption( 'override' )
-                               && $wgDisableQueryPageUpdate && in_array( $special, $wgDisableQueryPageUpdate ) )
-                       {
+                               && $wgDisableQueryPageUpdate && in_array( $special, $wgDisableQueryPageUpdate )
+                       {
                                $this->output( sprintf( "%-30s [QueryPage] disabled\n", $special ) );
                                continue;
                        }
index bd3338a..15e1174 100644 (file)
@@ -61,6 +61,7 @@ class UserDupes {
                $info = $this->db->indexInfo( 'user', 'user_name', __METHOD__ );
                if ( !$info ) {
                        $this->out( "WARNING: doesn't seem to have user_name index at all!\n" );
+
                        return false;
                }
 
@@ -102,6 +103,7 @@ class UserDupes {
        function checkDupes( $doDelete = false ) {
                if ( $this->hasUniqueIndex() ) {
                        echo wfWikiID() . " already has a unique index on its user table.\n";
+
                        return true;
                }
 
@@ -125,7 +127,8 @@ class UserDupes {
 
                if ( $this->reassigned > 0 ) {
                        if ( $doDelete ) {
-                               $this->out( "$this->reassigned duplicate accounts had edits reassigned to a canonical record id.\n" );
+                               $this->out( "$this->reassigned duplicate accounts had edits "
+                                       . "reassigned to a canonical record id.\n" );
                        } else {
                                $this->out( "$this->reassigned duplicate accounts need to have edits reassigned.\n" );
                        }
@@ -133,22 +136,27 @@ class UserDupes {
 
                if ( $this->trimmed > 0 ) {
                        if ( $doDelete ) {
-                               $this->out( "$this->trimmed duplicate user records were deleted from " . wfWikiID() . ".\n" );
+                               $this->out( "$this->trimmed duplicate user records were deleted from "
+                                       . wfWikiID() . ".\n" );
                        } else {
-                               $this->out( "$this->trimmed duplicate user accounts were found on " . wfWikiID() . " which can be removed safely.\n" );
+                               $this->out( "$this->trimmed duplicate user accounts were found on "
+                                       . wfWikiID() . " which can be removed safely.\n" );
                        }
                }
 
                if ( $this->failed > 0 ) {
                        $this->out( "Something terribly awry; $this->failed duplicate accounts were not removed.\n" );
+
                        return false;
                }
 
                if ( $this->trimmed == 0 || $doDelete ) {
                        $this->out( "It is now safe to apply the unique index on user_name.\n" );
+
                        return true;
                } else {
                        $this->out( "Run this script again with the --fix option to automatically delete them.\n" );
+
                        return false;
                }
        }
@@ -193,6 +201,7 @@ class UserDupes {
                foreach ( $result as $row ) {
                        $list[] = $row->user_name;
                }
+
                return $list;
        }
 
@@ -285,5 +294,4 @@ class UserDupes {
                $this->db->delete( 'user', array( 'user_id' => $userid ), __METHOD__ );
                $this->out( " ok" );
        }
-
 }
index 5d11352..9b8714d 100644 (file)
@@ -107,7 +107,8 @@ class UserOptions {
                        return false;
                }
 
-               $this->{ $this->mMode } ();
+               $this->{$this->mMode}();
+
                return true;
        }
 
@@ -139,7 +140,7 @@ class UserOptions {
                        array( 'user_id' ),
                        array(),
                        __METHOD__
-                       );
+               );
 
                foreach ( $result as $id ) {
 
@@ -155,15 +156,18 @@ class UserOptions {
 
                                $userValue = $user->getOption( $this->mAnOption );
                                if ( $userValue <> $defaultOptions[$this->mAnOption] ) {
+                                       // @codingStandardsIgnoreStart Ignore silencing errors is discouraged warning
                                        @$ret[$this->mAnOption][$userValue]++;
+                                       // @codingStandardsIgnoreEnd
                                }
-
                        } else {
 
                                foreach ( $defaultOptions as $name => $defaultValue ) {
                                        $userValue = $user->getOption( $name );
                                        if ( $userValue <> $defaultValue ) {
+                                               // @codingStandardsIgnoreStart Ignore silencing errors is discouraged warning
                                                @$ret[$name][$userValue]++;
+                                               // @codingStandardsIgnoreEnd
                                        }
                                }
                        }
@@ -188,7 +192,7 @@ class UserOptions {
                        array( 'user_id' ),
                        array(),
                        __METHOD__
-                       );
+               );
 
                foreach ( $result as $id ) {
 
@@ -200,7 +204,8 @@ class UserOptions {
                        if ( $curValue == $this->mOldValue ) {
 
                                if ( !$this->mQuiet ) {
-                                       print "Setting {$this->mAnOption} for $username from '{$this->mOldValue}' to '{$this->mNewValue}'): ";
+                                       print "Setting {$this->mAnOption} for $username from '{$this->mOldValue}' " .
+                                               "to '{$this->mNewValue}'): ";
                                }
 
                                // Change value
@@ -213,7 +218,6 @@ class UserOptions {
                                if ( !$this->mQuiet ) {
                                        print " OK\n";
                                }
-
                        } elseif ( !$this->mQuiet ) {
                                print "Not changing '$username' using <{$this->mAnOption}> = '$curValue'\n";
                        }
@@ -230,6 +234,7 @@ class UserOptions {
                foreach ( $def as $optname => $defaultValue ) {
                        array_push( $ret, $optname );
                }
+
                return $ret;
        }
 
@@ -238,7 +243,7 @@ class UserOptions {
        #
 
        public static function showUsageAndExit() {
-print <<<USAGE
+               print <<<USAGE
 
 This script pass through all users and change one of their options.
 The new option is NOT validated.
@@ -262,7 +267,7 @@ Options:
        --dry   : do not save user settings back to database
 
 USAGE;
-       exit( 0 );
+               exit( 0 );
        }
 
        /**
@@ -275,14 +280,14 @@ USAGE;
                        return true;
                }
 
-print <<<WARN
+               print <<<WARN
 The script is about to change the skin for ALL USERS in the database.
 Users with option <$this->mAnOption> = '$this->mOldValue' will be made to use '$this->mNewValue'.
 
 Abort with control-c in the next five seconds....
 WARN;
                wfCountDown( 5 );
+
                return true;
        }
-
 }
index a62d161..c9b1abb 100644 (file)
@@ -34,6 +34,7 @@ class WaitForSlave extends Maintenance {
                parent::__construct();
                $this->addArg( 'maxlag', 'How long to wait for the slaves, default 10 seconds', false );
        }
+
        public function execute() {
                wfWaitForSlaves( $this->getArg( 0, 10 ) );
        }
index fc7eadb..d22454f 100644 (file)
@@ -36,6 +36,16 @@ function wfInstallerMain() {
        $installer = InstallerOverrides::getWebInstaller( $wgRequest );
 
        if ( !$installer->startSession() ) {
+
+               if( $installer->request->getVal( "css" ) ) {
+                       // Do not display errors on css pages
+                       $cssDir = $installer->request->getVal( "css" );
+                       $installer->outputCss( $cssDir );
+                       exit;
+               }
+
+               $errors = $installer->getPhpErrors();
+               $installer->showError( 'config-session-error', $errors[0] );
                $installer->finish();
                exit;
        }
index d3d85bb..5758152 100644 (file)
@@ -1,8 +1,9 @@
 <?php
 /**
  * MediaWiki installer overrides.
- * Modify this file if you are a packager who needs to modify the behavior of the MediaWiki installer.
- * Altering it is preferred over changing anything in /includes.
+ * Modify this file if you are a packager who needs to modify the behavior of
+ * the MediaWiki installer. Altering it is preferred over changing anything in
+ * /includes.
  *
  * Note: this file doesn't gets included from a global scope, don't use globals directly.
  *
index 8b0d675..a9208db 100644 (file)
@@ -50,6 +50,8 @@ return array(
        // Scripts for the dynamic language specific data, like grammar forms.
        'mediawiki.language.data' => array( 'class' => 'ResourceLoaderLanguageDataModule' ),
 
+       /* MediaWiki base skinning modules */
+
        /**
         * Common skin styles, grouped into three graded levels.
         *
@@ -74,12 +76,38 @@ return array(
         *     common to MonoBook clones. And since practically every skin that currently exists within
         *     core is a MonoBook clone, all our core skins currently use this level.
         *
-        * These modules are typically loaded by addModuleStyles which has absolutely no concept of
-        * dependency management. As a result, the skins.common.* modules contain duplicate stylesheet
-        * references instead of setting 'dependencies' to the lower level the module is based on. For
-        * this reason avoid including multiple skins.common.* modules into your skin as this will
-        * result in duplicate css.
+        * These modules are typically loaded by addModuleStyles(), which has absolutely no concept of
+        * dependency management. As a result they contain duplicate stylesheet references instead of
+        * setting 'dependencies' to the lower level the module is based on. For this reason avoid
+        * including more than one of them into your skin as this will result in duplicate CSS.
         */
+       'mediawiki.skinning.elements' => array(
+               'styles' => array(
+                       'common/commonElements.css' => array( 'media' => 'screen' ),
+               ),
+               'remoteBasePath' => $GLOBALS['wgStylePath'],
+               'localBasePath' => $GLOBALS['wgStyleDirectory'],
+       ),
+       'mediawiki.skinning.content' => array(
+               'styles' => array(
+                       'common/commonElements.css' => array( 'media' => 'screen' ),
+                       'common/commonContent.css' => array( 'media' => 'screen' ),
+               ),
+               'remoteBasePath' => $GLOBALS['wgStylePath'],
+               'localBasePath' => $GLOBALS['wgStyleDirectory'],
+       ),
+       'mediawiki.skinning.interface' => array(
+               // Used in the web installer. Test it after modifying this definition!
+               'styles' => array(
+                       'common/commonElements.css' => array( 'media' => 'screen' ),
+                       'common/commonContent.css' => array( 'media' => 'screen' ),
+                       'common/commonInterface.css' => array( 'media' => 'screen' ),
+               ),
+               'remoteBasePath' => $GLOBALS['wgStylePath'],
+               'localBasePath' => $GLOBALS['wgStyleDirectory'],
+       ),
+
+       // Temporarily kept for backwards-compatibility with generated HTML
        'skins.common.elements' => array(
                'styles' => array(
                        'common/commonElements.css' => array( 'media' => 'screen' ),
@@ -96,7 +124,6 @@ return array(
                'localBasePath' => $GLOBALS['wgStyleDirectory'],
        ),
        'skins.common.interface' => array(
-               // Used in the web installer. Test it after modifying this definition!
                'styles' => array(
                        'common/commonElements.css' => array( 'media' => 'screen' ),
                        'common/commonContent.css' => array( 'media' => 'screen' ),
@@ -106,6 +133,16 @@ return array(
                'localBasePath' => $GLOBALS['wgStyleDirectory'],
        ),
 
+       '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
+               // skin over-rides common content styling.
+               'skinStyles' => array(
+                       'default' => 'resources/src/mediawiki.skinning/content.parsoid.less',
+               ),
+               'targets' => array( 'desktop', 'mobile' ),
+       ),
+
        /**
         * Skins
         * Be careful not to add 'scripts' to these modules,
@@ -116,26 +153,11 @@ return array(
         *
         * See Vector for an example.
         */
-       'skins.cologneblue' => array(
-               'styles' => array(
-                       'cologneblue/screen.css' => array( 'media' => 'screen' ),
-                       'cologneblue/print.css' => array( 'media' => 'print' ),
-               ),
-               'remoteBasePath' => $GLOBALS['wgStylePath'],
-               'localBasePath' => $GLOBALS['wgStyleDirectory'],
-       ),
-       'skins.modern' => array(
-               'styles' => array(
-                       'modern/main.css' => array( 'media' => 'screen' ),
-                       'modern/print.css' => array( 'media' => 'print' ),
-               ),
-               'remoteBasePath' => $GLOBALS['wgStylePath'],
-               'localBasePath' => $GLOBALS['wgStyleDirectory'],
-       ),
        'skins.vector.styles' => array(
                // Used in the web installer. Test it after modifying this definition!
                'styles' => array(
-                       'vector/styles.less',
+                       'vector/screen.less' => array( 'media' => 'screen' ),
+                       'vector/screen-hd.less' => array( 'media' => 'screen and (min-width: 982px)' ),
                ),
                'remoteBasePath' => $GLOBALS['wgStylePath'],
                'localBasePath' => $GLOBALS['wgStyleDirectory'],
@@ -153,37 +175,36 @@ return array(
                        'vector/vector.js',
                ),
                'position' => 'top',
-               'dependencies' => 'jquery.throttle-debounce',
-               'remoteBasePath' => $GLOBALS['wgStylePath'],
-               'localBasePath' => $GLOBALS['wgStyleDirectory'],
-       ),
-       'skins.vector.collapsibleNav' => array(
-               'scripts' => array(
-                       'vector/collapsibleNav.js',
-               ),
-               'messages' => array(
-                       'vector-collapsiblenav-more',
-               ),
                'dependencies' => array(
-                       'jquery.client',
-                       'jquery.cookie',
+                       'jquery.throttle-debounce',
                        'jquery.tabIndex',
                ),
                'remoteBasePath' => $GLOBALS['wgStylePath'],
                'localBasePath' => $GLOBALS['wgStyleDirectory'],
-               'position' => 'bottom',
        ),
 
        /* jQuery */
 
        'jquery' => array(
-               'scripts' => 'resources/lib/jquery/jquery.js',
+               'scripts' => array(
+                       'resources/lib/jquery/jquery.js',
+                       'resources/lib/jquery/jquery.migrate.js',
+               ),
                'debugRaw' => false,
                'targets' => array( 'desktop', 'mobile' ),
        ),
 
        /* jQuery Plugins */
 
+       'jquery.accessKeyLabel' => array(
+               'scripts' => 'resources/src/jquery/jquery.accessKeyLabel.js',
+               'dependencies' => array(
+                       'jquery.client',
+                       'jquery.mwExtension',
+               ),
+               'messages' => array( 'brackets', 'word-separator' ),
+               'targets' => array( 'mobile', 'desktop' ),
+       ),
        'jquery.appear' => array(
                'scripts' => 'resources/lib/jquery/jquery.appear.js',
        ),
@@ -232,6 +253,7 @@ return array(
        'jquery.colorUtil' => array(
                'scripts' => 'resources/src/jquery/jquery.colorUtil.js',
        ),
+       // Use mediawiki.cookie in new code, rather than jquery.cookie.
        'jquery.cookie' => array(
                'scripts' => 'resources/lib/jquery/jquery.cookie.js',
                'targets' => array( 'desktop', 'mobile' ),
@@ -896,13 +918,20 @@ return array(
        'mediawiki.util' => array(
                'scripts' => 'resources/src/mediawiki/mediawiki.util.js',
                'dependencies' => array(
-                       'jquery.client',
+                       'jquery.accessKeyLabel',
                        'jquery.mwExtension',
                        'mediawiki.notify',
+                       'mediawiki.toc', // bug 64765
                ),
                'position' => 'top', // For $wgPreloadJavaScriptMwUtil
                'targets' => array( 'desktop', 'mobile' ),
        ),
+       'mediawiki.cookie' => array(
+               'scripts' => 'resources/src/mediawiki/mediawiki.cookie.js',
+               'dependencies' => array(
+                       'jquery.cookie',
+               ),
+       ),
 
        /* MediaWiki Action */
 
@@ -963,11 +992,13 @@ return array(
                'scripts' => 'resources/src/mediawiki.action/mediawiki.action.view.postEdit.js',
                'styles' => 'resources/src/mediawiki.action/mediawiki.action.view.postEdit.css',
                'dependencies' => array(
-                       'jquery.cookie',
+                       'mediawiki.cookie',
                        'mediawiki.jqueryMsg'
                ),
                'messages' => array(
-                       'postedit-confirmation',
+                       'postedit-confirmation-created',
+                       'postedit-confirmation-restored',
+                       'postedit-confirmation-saved',
                ),
        ),
        'mediawiki.action.view.redirectToFragment' => array(
@@ -1061,6 +1092,8 @@ return array(
                )
        ),
 
+       'mediawiki.language.names' => array( 'class' => 'ResourceLoaderLanguageNamesModule' ),
+
        /* MediaWiki Libs */
 
        'mediawiki.libs.jpegmeta' => array(
@@ -1111,10 +1144,10 @@ return array(
        'mediawiki.page.watch.ajax' => array(
                'scripts' => 'resources/src/mediawiki.page/mediawiki.page.watch.ajax.js',
                'dependencies' => array(
-                       'mediawiki.page.startup',
                        'mediawiki.api.watch',
-                       'mediawiki.util',
                        'mediawiki.notify',
+                       'mediawiki.util',
+                       'jquery.accessKeyLabel',
                        'jquery.mwExtension',
                ),
                'messages' => array(
@@ -1270,6 +1303,25 @@ return array(
                        'jquery.throttle-debounce',
                ),
        ),
+       'mediawiki.special.unwatchedPages' => array(
+               'scripts' => 'resources/src/mediawiki.special/mediawiki.special.unwatchedPages.js',
+               'styles' => 'resources/src/mediawiki.special/mediawiki.special.unwatchedPages.css',
+               'messages' => array(
+                       'addedwatchtext-short',
+                       'removedwatchtext-short',
+                       'unwatch',
+                       'unwatching',
+                       'watch',
+                       'watcherrortext',
+                       'watching',
+               ),
+               'dependencies' => array(
+                       'mediawiki.api',
+                       'mediawiki.api.watch',
+                       'mediawiki.notify',
+                       'mediawiki.Title'
+               ),
+       ),
        'mediawiki.special.javaScriptTest' => array(
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.javaScriptTest.js',
                'messages' => array_merge( Skin::getSkinNameMessages(), array(
@@ -1396,6 +1448,10 @@ return array(
                        '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'
                ),
                'dependencies' => array(
                        'oojs',
index a86bf79..d4b67f7 100644 (file)
@@ -1,71 +1,81 @@
 /*!
- * jQuery JavaScript Library v1.8.3
+ * jQuery JavaScript Library v1.11.1
  * http://jquery.com/
  *
  * Includes Sizzle.js
  * http://sizzlejs.com/
  *
- * Copyright 2012 jQuery Foundation and other contributors
+ * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors
  * Released under the MIT license
  * http://jquery.org/license
  *
- * Date: Tue Nov 13 2012 08:20:33 GMT-0500 (Eastern Standard Time)
+ * Date: 2014-05-01T17:42Z
  */
-(function( window, undefined ) {
-var
-       // A central reference to the root jQuery(document)
-       rootjQuery,
 
-       // The deferred used on DOM ready
-       readyList,
+(function( global, factory ) {
+
+       if ( typeof module === "object" && typeof module.exports === "object" ) {
+               // For CommonJS and CommonJS-like environments where a proper window is present,
+               // execute the factory and get jQuery
+               // For environments that do not inherently posses a window with a document
+               // (such as Node.js), expose a jQuery-making factory as module.exports
+               // This accentuates the need for the creation of a real window
+               // e.g. var jQuery = require("jquery")(window);
+               // See ticket #14549 for more info
+               module.exports = global.document ?
+                       factory( global, true ) :
+                       function( w ) {
+                               if ( !w.document ) {
+                                       throw new Error( "jQuery requires a window with a document" );
+                               }
+                               return factory( w );
+                       };
+       } else {
+               factory( global );
+       }
 
-       // Use the correct document accordingly with window argument (sandbox)
-       document = window.document,
-       location = window.location,
-       navigator = window.navigator,
+// Pass this if window is not defined yet
+}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
 
-       // Map over jQuery in case of overwrite
-       _jQuery = window.jQuery,
+// Can't do this because several apps including ASP.NET trace
+// the stack via arguments.caller.callee and Firefox dies if
+// you try to trace through "use strict" call chains. (#13335)
+// Support: Firefox 18+
+//
 
-       // Map over the $ in case of overwrite
-       _$ = window.$,
+var deletedIds = [];
 
-       // Save a reference to some core methods
-       core_push = Array.prototype.push,
-       core_slice = Array.prototype.slice,
-       core_indexOf = Array.prototype.indexOf,
-       core_toString = Object.prototype.toString,
-       core_hasOwn = Object.prototype.hasOwnProperty,
-       core_trim = String.prototype.trim,
+var slice = deletedIds.slice;
 
-       // Define a local copy of jQuery
-       jQuery = function( selector, context ) {
-               // The jQuery object is actually just the init constructor 'enhanced'
-               return new jQuery.fn.init( selector, context, rootjQuery );
-       },
+var concat = deletedIds.concat;
 
-       // Used for matching numbers
-       core_pnum = /[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,
+var push = deletedIds.push;
 
-       // Used for detecting and trimming whitespace
-       core_rnotwhite = /\S/,
-       core_rspace = /\s+/,
+var indexOf = deletedIds.indexOf;
 
-       // Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)
-       rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
+var class2type = {};
+
+var toString = class2type.toString;
+
+var hasOwn = class2type.hasOwnProperty;
+
+var support = {};
 
-       // A simple way to check for HTML strings
-       // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
-       rquickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
 
-       // Match a standalone tag
-       rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
 
-       // JSON RegExp
-       rvalidchars = /^[\],:{}\s]*$/,
-       rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
-       rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
-       rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,
+var
+       version = "1.11.1",
+
+       // Define a local copy of jQuery
+       jQuery = function( selector, context ) {
+               // The jQuery object is actually just the init constructor 'enhanced'
+               // Need init if jQuery is called (just allow error to be thrown if not included)
+               return new jQuery.fn.init( selector, context );
+       },
+
+       // Support: Android<4.1, IE<9
+       // Make sure we trim BOM and NBSP
+       rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
 
        // Matches dashed string for camelizing
        rmsPrefix = /^-ms-/,
@@ -73,163 +83,48 @@ var
 
        // Used by jQuery.camelCase as callback to replace()
        fcamelCase = function( all, letter ) {
-               return ( letter + "" ).toUpperCase();
-       },
-
-       // The ready event handler and self cleanup method
-       DOMContentLoaded = function() {
-               if ( document.addEventListener ) {
-                       document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
-                       jQuery.ready();
-               } else if ( document.readyState === "complete" ) {
-                       // we're here because readyState === "complete" in oldIE
-                       // which is good enough for us to call the dom ready!
-                       document.detachEvent( "onreadystatechange", DOMContentLoaded );
-                       jQuery.ready();
-               }
-       },
-
-       // [[Class]] -> type pairs
-       class2type = {};
+               return letter.toUpperCase();
+       };
 
 jQuery.fn = jQuery.prototype = {
-       constructor: jQuery,
-       init: function( selector, context, rootjQuery ) {
-               var match, elem, ret, doc;
-
-               // Handle $(""), $(null), $(undefined), $(false)
-               if ( !selector ) {
-                       return this;
-               }
-
-               // Handle $(DOMElement)
-               if ( selector.nodeType ) {
-                       this.context = this[0] = selector;
-                       this.length = 1;
-                       return this;
-               }
-
-               // Handle HTML strings
-               if ( typeof selector === "string" ) {
-                       if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
-                               // Assume that strings that start and end with <> are HTML and skip the regex check
-                               match = [ null, selector, null ];
-
-                       } else {
-                               match = rquickExpr.exec( selector );
-                       }
-
-                       // Match html or make sure no context is specified for #id
-                       if ( match && (match[1] || !context) ) {
-
-                               // HANDLE: $(html) -> $(array)
-                               if ( match[1] ) {
-                                       context = context instanceof jQuery ? context[0] : context;
-                                       doc = ( context && context.nodeType ? context.ownerDocument || context : document );
-
-                                       // scripts is true for back-compat
-                                       selector = jQuery.parseHTML( match[1], doc, true );
-                                       if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
-                                               this.attr.call( selector, context, true );
-                                       }
-
-                                       return jQuery.merge( this, selector );
-
-                               // HANDLE: $(#id)
-                               } else {
-                                       elem = document.getElementById( match[2] );
-
-                                       // Check parentNode to catch when Blackberry 4.6 returns
-                                       // nodes that are no longer in the document #6963
-                                       if ( elem && elem.parentNode ) {
-                                               // Handle the case where IE and Opera return items
-                                               // by name instead of ID
-                                               if ( elem.id !== match[2] ) {
-                                                       return rootjQuery.find( selector );
-                                               }
-
-                                               // Otherwise, we inject the element directly into the jQuery object
-                                               this.length = 1;
-                                               this[0] = elem;
-                                       }
-
-                                       this.context = document;
-                                       this.selector = selector;
-                                       return this;
-                               }
-
-                       // HANDLE: $(expr, $(...))
-                       } else if ( !context || context.jquery ) {
-                               return ( context || rootjQuery ).find( selector );
-
-                       // HANDLE: $(expr, context)
-                       // (which is just equivalent to: $(context).find(expr)
-                       } else {
-                               return this.constructor( context ).find( selector );
-                       }
-
-               // HANDLE: $(function)
-               // Shortcut for document ready
-               } else if ( jQuery.isFunction( selector ) ) {
-                       return rootjQuery.ready( selector );
-               }
-
-               if ( selector.selector !== undefined ) {
-                       this.selector = selector.selector;
-                       this.context = selector.context;
-               }
+       // The current version of jQuery being used
+       jquery: version,
 
-               return jQuery.makeArray( selector, this );
-       },
+       constructor: jQuery,
 
        // Start with an empty selector
        selector: "",
 
-       // The current version of jQuery being used
-       jquery: "1.8.3",
-
        // The default length of a jQuery object is 0
        length: 0,
 
-       // The number of elements contained in the matched element set
-       size: function() {
-               return this.length;
-       },
-
        toArray: function() {
-               return core_slice.call( this );
+               return slice.call( this );
        },
 
        // Get the Nth element in the matched element set OR
        // Get the whole matched element set as a clean array
        get: function( num ) {
-               return num == null ?
+               return num != null ?
 
-                       // Return a 'clean' array
-                       this.toArray() :
+                       // Return just the one element from the set
+                       ( num < 0 ? this[ num + this.length ] : this[ num ] ) :
 
-                       // Return just the object
-                       ( num < 0 ? this[ this.length + num ] : this[ num ] );
+                       // Return all the elements in a clean array
+                       slice.call( this );
        },
 
        // Take an array of elements and push it onto the stack
        // (returning the new matched element set)
-       pushStack: function( elems, name, selector ) {
+       pushStack: function( elems ) {
 
                // Build a new jQuery matched element set
                var ret = jQuery.merge( this.constructor(), elems );
 
                // Add the old object onto the stack (as a reference)
                ret.prevObject = this;
-
                ret.context = this.context;
 
-               if ( name === "find" ) {
-                       ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
-               } else if ( name ) {
-                       ret.selector = this.selector + "." + name + "(" + selector + ")";
-               }
-
                // Return the newly-formed element set
                return ret;
        },
@@ -241,18 +136,14 @@ jQuery.fn = jQuery.prototype = {
                return jQuery.each( this, callback, args );
        },
 
-       ready: function( fn ) {
-               // Add the callback
-               jQuery.ready.promise().done( fn );
-
-               return this;
+       map: function( callback ) {
+               return this.pushStack( jQuery.map(this, function( elem, i ) {
+                       return callback.call( elem, i, elem );
+               }));
        },
 
-       eq: function( i ) {
-               i = +i;
-               return i === -1 ?
-                       this.slice( i ) :
-                       this.slice( i, i + 1 );
+       slice: function() {
+               return this.pushStack( slice.apply( this, arguments ) );
        },
 
        first: function() {
@@ -263,15 +154,10 @@ jQuery.fn = jQuery.prototype = {
                return this.eq( -1 );
        },
 
-       slice: function() {
-               return this.pushStack( core_slice.apply( this, arguments ),
-                       "slice", core_slice.call(arguments).join(",") );
-       },
-
-       map: function( callback ) {
-               return this.pushStack( jQuery.map(this, function( elem, i ) {
-                       return callback.call( elem, i, elem );
-               }));
+       eq: function( i ) {
+               var len = this.length,
+                       j = +i + ( i < 0 ? len : 0 );
+               return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
        },
 
        end: function() {
@@ -280,16 +166,13 @@ jQuery.fn = jQuery.prototype = {
 
        // For internal use only.
        // Behaves like an Array's method, not like a jQuery method.
-       push: core_push,
-       sort: [].sort,
-       splice: [].splice
+       push: push,
+       sort: deletedIds.sort,
+       splice: deletedIds.splice
 };
 
-// Give the init function the jQuery prototype for later instantiation
-jQuery.fn.init.prototype = jQuery.fn;
-
 jQuery.extend = jQuery.fn.extend = function() {
-       var options, name, src, copy, copyIsArray, clone,
+       var src, copyIsArray, copy, name, options, clone,
                target = arguments[0] || {},
                i = 1,
                length = arguments.length,
@@ -298,9 +181,10 @@ jQuery.extend = jQuery.fn.extend = function() {
        // Handle a deep copy situation
        if ( typeof target === "boolean" ) {
                deep = target;
-               target = arguments[1] || {};
+
                // skip the boolean and the target
-               i = 2;
+               target = arguments[ i ] || {};
+               i++;
        }
 
        // Handle case when target is a string or something (possible in deep copy)
@@ -309,9 +193,9 @@ jQuery.extend = jQuery.fn.extend = function() {
        }
 
        // extend jQuery itself if only one argument is passed
-       if ( length === i ) {
+       if ( i === length ) {
                target = this;
-               --i;
+               i--;
        }
 
        for ( ; i < length; i++ ) {
@@ -353,63 +237,17 @@ jQuery.extend = jQuery.fn.extend = function() {
 };
 
 jQuery.extend({
-       noConflict: function( deep ) {
-               if ( window.$ === jQuery ) {
-                       window.$ = _$;
-               }
-
-               if ( deep && window.jQuery === jQuery ) {
-                       window.jQuery = _jQuery;
-               }
-
-               return jQuery;
-       },
-
-       // Is the DOM ready to be used? Set to true once it occurs.
-       isReady: false,
+       // Unique for each copy of jQuery on the page
+       expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
 
-       // A counter to track how many items to wait for before
-       // the ready event fires. See #6781
-       readyWait: 1,
+       // Assume jQuery is ready without the ready module
+       isReady: true,
 
-       // Hold (or release) the ready event
-       holdReady: function( hold ) {
-               if ( hold ) {
-                       jQuery.readyWait++;
-               } else {
-                       jQuery.ready( true );
-               }
+       error: function( msg ) {
+               throw new Error( msg );
        },
 
-       // Handle when the DOM is ready
-       ready: function( wait ) {
-
-               // Abort if there are pending holds or we're already ready
-               if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
-                       return;
-               }
-
-               // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
-               if ( !document.body ) {
-                       return setTimeout( jQuery.ready, 1 );
-               }
-
-               // Remember that the DOM is ready
-               jQuery.isReady = true;
-
-               // If a normal DOM Ready event fired, decrement, and wait if need be
-               if ( wait !== true && --jQuery.readyWait > 0 ) {
-                       return;
-               }
-
-               // If there are functions bound, to execute
-               readyList.resolveWith( document, [ jQuery ] );
-
-               // Trigger any bound ready events
-               if ( jQuery.fn.trigger ) {
-                       jQuery( document ).trigger("ready").off("ready");
-               }
-       },
+       noop: function() {},
 
        // See test/unit/core.js for details concerning isFunction.
        // Since version 1.3, DOM methods and functions like alert
@@ -423,20 +261,28 @@ jQuery.extend({
        },
 
        isWindow: function( obj ) {
+               /* jshint eqeqeq: false */
                return obj != null && obj == obj.window;
        },
 
        isNumeric: function( obj ) {
-               return !isNaN( parseFloat(obj) ) && isFinite( obj );
+               // parseFloat NaNs numeric-cast false positives (null|true|false|"")
+               // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
+               // subtraction forces infinities to NaN
+               return !jQuery.isArray( obj ) && obj - parseFloat( obj ) >= 0;
        },
 
-       type: function( obj ) {
-               return obj == null ?
-                       String( obj ) :
-                       class2type[ core_toString.call(obj) ] || "object";
+       isEmptyObject: function( obj ) {
+               var name;
+               for ( name in obj ) {
+                       return false;
+               }
+               return true;
        },
 
        isPlainObject: function( obj ) {
+               var key;
+
                // Must be an Object.
                // Because of IE, we also have to check the presence of the constructor property.
                // Make sure that DOM nodes and window objects don't pass through, as well
@@ -447,8 +293,8 @@ jQuery.extend({
                try {
                        // Not own constructor property must be Object
                        if ( obj.constructor &&
-                               !core_hasOwn.call(obj, "constructor") &&
-                               !core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
+                               !hasOwn.call(obj, "constructor") &&
+                               !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
                                return false;
                        }
                } catch ( e ) {
@@ -456,107 +302,35 @@ jQuery.extend({
                        return false;
                }
 
+               // Support: IE<9
+               // Handle iteration over inherited properties before own properties.
+               if ( support.ownLast ) {
+                       for ( key in obj ) {
+                               return hasOwn.call( obj, key );
+                       }
+               }
+
                // Own properties are enumerated firstly, so to speed up,
                // if last one is own, then all properties are own.
-
-               var key;
                for ( key in obj ) {}
 
-               return key === undefined || core_hasOwn.call( obj, key );
-       },
-
-       isEmptyObject: function( obj ) {
-               var name;
-               for ( name in obj ) {
-                       return false;
-               }
-               return true;
-       },
-
-       error: function( msg ) {
-               throw new Error( msg );
-       },
-
-       // data: string of html
-       // context (optional): If specified, the fragment will be created in this context, defaults to document
-       // scripts (optional): If true, will include scripts passed in the html string
-       parseHTML: function( data, context, scripts ) {
-               var parsed;
-               if ( !data || typeof data !== "string" ) {
-                       return null;
-               }
-               if ( typeof context === "boolean" ) {
-                       scripts = context;
-                       context = 0;
-               }
-               context = context || document;
-
-               // Single tag
-               if ( (parsed = rsingleTag.exec( data )) ) {
-                       return [ context.createElement( parsed[1] ) ];
-               }
-
-               parsed = jQuery.buildFragment( [ data ], context, scripts ? null : [] );
-               return jQuery.merge( [],
-                       (parsed.cacheable ? jQuery.clone( parsed.fragment ) : parsed.fragment).childNodes );
-       },
-
-       parseJSON: function( data ) {
-               if ( !data || typeof data !== "string") {
-                       return null;
-               }
-
-               // Make sure leading/trailing whitespace is removed (IE can't handle it)
-               data = jQuery.trim( data );
-
-               // Attempt to parse using the native JSON parser first
-               if ( window.JSON && window.JSON.parse ) {
-                       return window.JSON.parse( data );
-               }
-
-               // Make sure the incoming data is actual JSON
-               // Logic borrowed from http://json.org/json2.js
-               if ( rvalidchars.test( data.replace( rvalidescape, "@" )
-                       .replace( rvalidtokens, "]" )
-                       .replace( rvalidbraces, "")) ) {
-
-                       return ( new Function( "return " + data ) )();
-
-               }
-               jQuery.error( "Invalid JSON: " + data );
+               return key === undefined || hasOwn.call( obj, key );
        },
 
-       // Cross-browser xml parsing
-       parseXML: function( data ) {
-               var xml, tmp;
-               if ( !data || typeof data !== "string" ) {
-                       return null;
-               }
-               try {
-                       if ( window.DOMParser ) { // Standard
-                               tmp = new DOMParser();
-                               xml = tmp.parseFromString( data , "text/xml" );
-                       } else { // IE
-                               xml = new ActiveXObject( "Microsoft.XMLDOM" );
-                               xml.async = "false";
-                               xml.loadXML( data );
-                       }
-               } catch( e ) {
-                       xml = undefined;
-               }
-               if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
-                       jQuery.error( "Invalid XML: " + data );
+       type: function( obj ) {
+               if ( obj == null ) {
+                       return obj + "";
                }
-               return xml;
+               return typeof obj === "object" || typeof obj === "function" ?
+                       class2type[ toString.call(obj) ] || "object" :
+                       typeof obj;
        },
 
-       noop: function() {},
-
        // Evaluates a script in a global context
        // Workarounds based on findings by Jim Driscoll
        // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
        globalEval: function( data ) {
-               if ( data && core_rnotwhite.test( data ) ) {
+               if ( data && jQuery.trim( data ) ) {
                        // We use execScript on Internet Explorer
                        // We use an anonymous function so that context is window
                        // rather than jQuery in Firefox
@@ -578,21 +352,25 @@ jQuery.extend({
 
        // args is for internal usage only
        each: function( obj, callback, args ) {
-               var name,
+               var value,
                        i = 0,
                        length = obj.length,
-                       isObj = length === undefined || jQuery.isFunction( obj );
+                       isArray = isArraylike( obj );
 
                if ( args ) {
-                       if ( isObj ) {
-                               for ( name in obj ) {
-                                       if ( callback.apply( obj[ name ], args ) === false ) {
+                       if ( isArray ) {
+                               for ( ; i < length; i++ ) {
+                                       value = callback.apply( obj[ i ], args );
+
+                                       if ( value === false ) {
                                                break;
                                        }
                                }
                        } else {
-                               for ( ; i < length; ) {
-                                       if ( callback.apply( obj[ i++ ], args ) === false ) {
+                               for ( i in obj ) {
+                                       value = callback.apply( obj[ i ], args );
+
+                                       if ( value === false ) {
                                                break;
                                        }
                                }
@@ -600,15 +378,19 @@ jQuery.extend({
 
                // A special, fast, case for the most common use of each
                } else {
-                       if ( isObj ) {
-                               for ( name in obj ) {
-                                       if ( callback.call( obj[ name ], name, obj[ name ] ) === false ) {
+                       if ( isArray ) {
+                               for ( ; i < length; i++ ) {
+                                       value = callback.call( obj[ i ], i, obj[ i ] );
+
+                                       if ( value === false ) {
                                                break;
                                        }
                                }
                        } else {
-                               for ( ; i < length; ) {
-                                       if ( callback.call( obj[ i ], i, obj[ i++ ] ) === false ) {
+                               for ( i in obj ) {
+                                       value = callback.call( obj[ i ], i, obj[ i ] );
+
+                                       if ( value === false ) {
                                                break;
                                        }
                                }
@@ -618,35 +400,25 @@ jQuery.extend({
                return obj;
        },
 
-       // Use native String.trim function wherever possible
-       trim: core_trim && !core_trim.call("\uFEFF\xA0") ?
-               function( text ) {
-                       return text == null ?
-                               "" :
-                               core_trim.call( text );
-               } :
-
-               // Otherwise use our own trimming functionality
-               function( text ) {
-                       return text == null ?
-                               "" :
-                               ( text + "" ).replace( rtrim, "" );
-               },
+       // Support: Android<4.1, IE<9
+       trim: function( text ) {
+               return text == null ?
+                       "" :
+                       ( text + "" ).replace( rtrim, "" );
+       },
 
        // results is for internal usage only
        makeArray: function( arr, results ) {
-               var type,
-                       ret = results || [];
+               var ret = results || [];
 
                if ( arr != null ) {
-                       // The window, strings (and functions) also have 'length'
-                       // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
-                       type = jQuery.type( arr );
-
-                       if ( arr.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( arr ) ) {
-                               core_push.call( ret, arr );
+                       if ( isArraylike( Object(arr) ) ) {
+                               jQuery.merge( ret,
+                                       typeof arr === "string" ?
+                                       [ arr ] : arr
+                               );
                        } else {
-                               jQuery.merge( ret, arr );
+                               push.call( ret, arr );
                        }
                }
 
@@ -657,8 +429,8 @@ jQuery.extend({
                var len;
 
                if ( arr ) {
-                       if ( core_indexOf ) {
-                               return core_indexOf.call( arr, elem, i );
+                       if ( indexOf ) {
+                               return indexOf.call( arr, elem, i );
                        }
 
                        len = arr.length;
@@ -676,16 +448,17 @@ jQuery.extend({
        },
 
        merge: function( first, second ) {
-               var l = second.length,
-                       i = first.length,
-                       j = 0;
+               var len = +second.length,
+                       j = 0,
+                       i = first.length;
 
-               if ( typeof l === "number" ) {
-                       for ( ; j < l; j++ ) {
-                               first[ i++ ] = second[ j ];
-                       }
+               while ( j < len ) {
+                       first[ i++ ] = second[ j++ ];
+               }
 
-               } else {
+               // Support: IE<9
+               // Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists)
+               if ( len !== len ) {
                        while ( second[j] !== undefined ) {
                                first[ i++ ] = second[ j++ ];
                        }
@@ -696,57 +469,56 @@ jQuery.extend({
                return first;
        },
 
-       grep: function( elems, callback, inv ) {
-               var retVal,
-                       ret = [],
+       grep: function( elems, callback, invert ) {
+               var callbackInverse,
+                       matches = [],
                        i = 0,
-                       length = elems.length;
-               inv = !!inv;
+                       length = elems.length,
+                       callbackExpect = !invert;
 
                // Go through the array, only saving the items
                // that pass the validator function
                for ( ; i < length; i++ ) {
-                       retVal = !!callback( elems[ i ], i );
-                       if ( inv !== retVal ) {
-                               ret.push( elems[ i ] );
+                       callbackInverse = !callback( elems[ i ], i );
+                       if ( callbackInverse !== callbackExpect ) {
+                               matches.push( elems[ i ] );
                        }
                }
 
-               return ret;
+               return matches;
        },
 
        // arg is for internal usage only
        map: function( elems, callback, arg ) {
-               var value, key,
-                       ret = [],
+               var value,
                        i = 0,
                        length = elems.length,
-                       // jquery objects are treated as arrays
-                       isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
+                       isArray = isArraylike( elems ),
+                       ret = [];
 
-               // Go through the array, translating each of the items to their
+               // Go through the array, translating each of the items to their new values
                if ( isArray ) {
                        for ( ; i < length; i++ ) {
                                value = callback( elems[ i ], i, arg );
 
                                if ( value != null ) {
-                                       ret[ ret.length ] = value;
+                                       ret.push( value );
                                }
                        }
 
                // Go through every key on the object,
                } else {
-                       for ( key in elems ) {
-                               value = callback( elems[ key ], key, arg );
+                       for ( i in elems ) {
+                               value = callback( elems[ i ], i, arg );
 
                                if ( value != null ) {
-                                       ret[ ret.length ] = value;
+                                       ret.push( value );
                                }
                        }
                }
 
                // Flatten any nested arrays
-               return ret.concat.apply( [], ret );
+               return concat.apply( [], ret );
        },
 
        // A global GUID counter for objects
@@ -755,7 +527,7 @@ jQuery.extend({
        // Bind a function to a context, optionally partially applying any
        // arguments.
        proxy: function( fn, context ) {
-               var tmp, args, proxy;
+               var args, proxy, tmp;
 
                if ( typeof context === "string" ) {
                        tmp = fn[ context ];
@@ -770,9 +542,9 @@ jQuery.extend({
                }
 
                // Simulated bind
-               args = core_slice.call( arguments, 2 );
+               args = slice.call( arguments, 2 );
                proxy = function() {
-                       return fn.apply( context, args.concat( core_slice.call( arguments ) ) );
+                       return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
                };
 
                // Set the guid of unique handler to the same of original handler, so it can be removed
@@ -781,6519 +553,8008 @@ jQuery.extend({
                return proxy;
        },
 
-       // Multifunctional method to get and set values of a collection
-       // The value/s can optionally be executed if it's a function
-       access: function( elems, fn, key, value, chainable, emptyGet, pass ) {
-               var exec,
-                       bulk = key == null,
-                       i = 0,
-                       length = elems.length;
-
-               // Sets many values
-               if ( key && typeof key === "object" ) {
-                       for ( i in key ) {
-                               jQuery.access( elems, fn, i, key[i], 1, emptyGet, value );
-                       }
-                       chainable = 1;
-
-               // Sets one value
-               } else if ( value !== undefined ) {
-                       // Optionally, function values get executed if exec is true
-                       exec = pass === undefined && jQuery.isFunction( value );
-
-                       if ( bulk ) {
-                               // Bulk operations only iterate when executing function values
-                               if ( exec ) {
-                                       exec = fn;
-                                       fn = function( elem, key, value ) {
-                                               return exec.call( jQuery( elem ), value );
-                                       };
+       now: function() {
+               return +( new Date() );
+       },
+
+       // jQuery.support is not used in Core but other projects attach their
+       // properties to it so it needs to exist.
+       support: support
+});
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
+       class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+function isArraylike( obj ) {
+       var length = obj.length,
+               type = jQuery.type( obj );
+
+       if ( type === "function" || jQuery.isWindow( obj ) ) {
+               return false;
+       }
+
+       if ( obj.nodeType === 1 && length ) {
+               return true;
+       }
+
+       return type === "array" || length === 0 ||
+               typeof length === "number" && length > 0 && ( length - 1 ) in obj;
+}
+var Sizzle =
+/*!
+ * Sizzle CSS Selector Engine v1.10.19
+ * http://sizzlejs.com/
+ *
+ * Copyright 2013 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2014-04-18
+ */
+(function( window ) {
+
+var i,
+       support,
+       Expr,
+       getText,
+       isXML,
+       tokenize,
+       compile,
+       select,
+       outermostContext,
+       sortInput,
+       hasDuplicate,
+
+       // Local document vars
+       setDocument,
+       document,
+       docElem,
+       documentIsHTML,
+       rbuggyQSA,
+       rbuggyMatches,
+       matches,
+       contains,
+
+       // Instance-specific data
+       expando = "sizzle" + -(new Date()),
+       preferredDoc = window.document,
+       dirruns = 0,
+       done = 0,
+       classCache = createCache(),
+       tokenCache = createCache(),
+       compilerCache = createCache(),
+       sortOrder = function( a, b ) {
+               if ( a === b ) {
+                       hasDuplicate = true;
+               }
+               return 0;
+       },
+
+       // General-purpose constants
+       strundefined = typeof undefined,
+       MAX_NEGATIVE = 1 << 31,
+
+       // Instance methods
+       hasOwn = ({}).hasOwnProperty,
+       arr = [],
+       pop = arr.pop,
+       push_native = arr.push,
+       push = arr.push,
+       slice = arr.slice,
+       // Use a stripped-down indexOf if we can't use a native one
+       indexOf = arr.indexOf || function( elem ) {
+               var i = 0,
+                       len = this.length;
+               for ( ; i < len; i++ ) {
+                       if ( this[i] === elem ) {
+                               return i;
+                       }
+               }
+               return -1;
+       },
+
+       booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
+
+       // Regular expressions
+
+       // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
+       whitespace = "[\\x20\\t\\r\\n\\f]",
+       // http://www.w3.org/TR/css3-syntax/#characters
+       characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
+
+       // Loosely modeled on CSS identifier characters
+       // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors
+       // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+       identifier = characterEncoding.replace( "w", "w#" ),
+
+       // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
+       attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace +
+               // Operator (capture 2)
+               "*([*^$|!~]?=)" + whitespace +
+               // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
+               "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
+               "*\\]",
+
+       pseudos = ":(" + characterEncoding + ")(?:\\((" +
+               // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
+               // 1. quoted (capture 3; capture 4 or capture 5)
+               "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
+               // 2. simple (capture 6)
+               "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
+               // 3. anything else (capture 2)
+               ".*" +
+               ")\\)|)",
+
+       // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+       rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
+
+       rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
+       rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
+
+       rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
+
+       rpseudo = new RegExp( pseudos ),
+       ridentifier = new RegExp( "^" + identifier + "$" ),
+
+       matchExpr = {
+               "ID": new RegExp( "^#(" + characterEncoding + ")" ),
+               "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
+               "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
+               "ATTR": new RegExp( "^" + attributes ),
+               "PSEUDO": new RegExp( "^" + pseudos ),
+               "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
+                       "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
+                       "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
+               "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
+               // For use in libraries implementing .is()
+               // We use this for POS matching in `select`
+               "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
+                       whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
+       },
+
+       rinputs = /^(?:input|select|textarea|button)$/i,
+       rheader = /^h\d$/i,
+
+       rnative = /^[^{]+\{\s*\[native \w/,
+
+       // Easily-parseable/retrievable ID or TAG or CLASS selectors
+       rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
+
+       rsibling = /[+~]/,
+       rescape = /'|\\/g,
+
+       // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
+       runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
+       funescape = function( _, escaped, escapedWhitespace ) {
+               var high = "0x" + escaped - 0x10000;
+               // NaN means non-codepoint
+               // Support: Firefox<24
+               // Workaround erroneous numeric interpretation of +"0x"
+               return high !== high || escapedWhitespace ?
+                       escaped :
+                       high < 0 ?
+                               // BMP codepoint
+                               String.fromCharCode( high + 0x10000 ) :
+                               // Supplemental Plane codepoint (surrogate pair)
+                               String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
+       };
+
+// Optimize for push.apply( _, NodeList )
+try {
+       push.apply(
+               (arr = slice.call( preferredDoc.childNodes )),
+               preferredDoc.childNodes
+       );
+       // Support: Android<4.0
+       // Detect silently failing push.apply
+       arr[ preferredDoc.childNodes.length ].nodeType;
+} catch ( e ) {
+       push = { apply: arr.length ?
+
+               // Leverage slice if possible
+               function( target, els ) {
+                       push_native.apply( target, slice.call(els) );
+               } :
+
+               // Support: IE<9
+               // Otherwise append directly
+               function( target, els ) {
+                       var j = target.length,
+                               i = 0;
+                       // Can't trust NodeList.length
+                       while ( (target[j++] = els[i++]) ) {}
+                       target.length = j - 1;
+               }
+       };
+}
 
-                               // Otherwise they run against the entire set
+function Sizzle( selector, context, results, seed ) {
+       var match, elem, m, nodeType,
+               // QSA vars
+               i, groups, old, nid, newContext, newSelector;
+
+       if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
+               setDocument( context );
+       }
+
+       context = context || document;
+       results = results || [];
+
+       if ( !selector || typeof selector !== "string" ) {
+               return results;
+       }
+
+       if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {
+               return [];
+       }
+
+       if ( documentIsHTML && !seed ) {
+
+               // Shortcuts
+               if ( (match = rquickExpr.exec( selector )) ) {
+                       // Speed-up: Sizzle("#ID")
+                       if ( (m = match[1]) ) {
+                               if ( nodeType === 9 ) {
+                                       elem = context.getElementById( m );
+                                       // Check parentNode to catch when Blackberry 4.6 returns
+                                       // nodes that are no longer in the document (jQuery #6963)
+                                       if ( elem && elem.parentNode ) {
+                                               // Handle the case where IE, Opera, and Webkit return items
+                                               // by name instead of ID
+                                               if ( elem.id === m ) {
+                                                       results.push( elem );
+                                                       return results;
+                                               }
+                                       } else {
+                                               return results;
+                                       }
                                } else {
-                                       fn.call( elems, value );
-                                       fn = null;
+                                       // Context is not a document
+                                       if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
+                                               contains( context, elem ) && elem.id === m ) {
+                                               results.push( elem );
+                                               return results;
+                                       }
                                }
+
+                       // Speed-up: Sizzle("TAG")
+                       } else if ( match[2] ) {
+                               push.apply( results, context.getElementsByTagName( selector ) );
+                               return results;
+
+                       // Speed-up: Sizzle(".CLASS")
+                       } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) {
+                               push.apply( results, context.getElementsByClassName( m ) );
+                               return results;
                        }
+               }
+
+               // QSA path
+               if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
+                       nid = old = expando;
+                       newContext = context;
+                       newSelector = nodeType === 9 && selector;
+
+                       // qSA works strangely on Element-rooted queries
+                       // We can work around this by specifying an extra ID on the root
+                       // and working up from there (Thanks to Andrew Dupont for the technique)
+                       // IE 8 doesn't work on object elements
+                       if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+                               groups = tokenize( selector );
+
+                               if ( (old = context.getAttribute("id")) ) {
+                                       nid = old.replace( rescape, "\\$&" );
+                               } else {
+                                       context.setAttribute( "id", nid );
+                               }
+                               nid = "[id='" + nid + "'] ";
 
-                       if ( fn ) {
-                               for (; i < length; i++ ) {
-                                       fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
+                               i = groups.length;
+                               while ( i-- ) {
+                                       groups[i] = nid + toSelector( groups[i] );
                                }
+                               newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context;
+                               newSelector = groups.join(",");
                        }
 
-                       chainable = 1;
+                       if ( newSelector ) {
+                               try {
+                                       push.apply( results,
+                                               newContext.querySelectorAll( newSelector )
+                                       );
+                                       return results;
+                               } catch(qsaError) {
+                               } finally {
+                                       if ( !old ) {
+                                               context.removeAttribute("id");
+                                       }
+                               }
+                       }
                }
+       }
 
-               return chainable ?
-                       elems :
+       // All others
+       return select( selector.replace( rtrim, "$1" ), context, results, seed );
+}
 
-                       // Gets
-                       bulk ?
-                               fn.call( elems ) :
-                               length ? fn( elems[0], key ) : emptyGet;
-       },
+/**
+ * Create key-value caches of limited size
+ * @returns {Function(string, Object)} Returns the Object data after storing it on itself with
+ *     property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
+ *     deleting the oldest entry
+ */
+function createCache() {
+       var keys = [];
 
-       now: function() {
-               return ( new Date() ).getTime();
+       function cache( key, value ) {
+               // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
+               if ( keys.push( key + " " ) > Expr.cacheLength ) {
+                       // Only keep the most recent entries
+                       delete cache[ keys.shift() ];
+               }
+               return (cache[ key + " " ] = value);
        }
-});
-
-jQuery.ready.promise = function( obj ) {
-       if ( !readyList ) {
+       return cache;
+}
 
-               readyList = jQuery.Deferred();
+/**
+ * Mark a function for special use by Sizzle
+ * @param {Function} fn The function to mark
+ */
+function markFunction( fn ) {
+       fn[ expando ] = true;
+       return fn;
+}
 
-               // Catch cases where $(document).ready() is called after the browser event has already occurred.
-               // we once tried to use readyState "interactive" here, but it caused issues like the one
-               // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
-               if ( document.readyState === "complete" ) {
-                       // Handle it asynchronously to allow scripts the opportunity to delay ready
-                       setTimeout( jQuery.ready, 1 );
+/**
+ * Support testing using an element
+ * @param {Function} fn Passed the created div and expects a boolean result
+ */
+function assert( fn ) {
+       var div = document.createElement("div");
 
-               // Standards-based browsers support DOMContentLoaded
-               } else if ( document.addEventListener ) {
-                       // Use the handy event callback
-                       document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+       try {
+               return !!fn( div );
+       } catch (e) {
+               return false;
+       } finally {
+               // Remove from its parent by default
+               if ( div.parentNode ) {
+                       div.parentNode.removeChild( div );
+               }
+               // release memory in IE
+               div = null;
+       }
+}
 
-                       // A fallback to window.onload, that will always work
-                       window.addEventListener( "load", jQuery.ready, false );
+/**
+ * Adds the same handler for all of the specified attrs
+ * @param {String} attrs Pipe-separated list of attributes
+ * @param {Function} handler The method that will be applied
+ */
+function addHandle( attrs, handler ) {
+       var arr = attrs.split("|"),
+               i = attrs.length;
 
-               // If IE event model is used
-               } else {
-                       // Ensure firing before onload, maybe late but safe also for iframes
-                       document.attachEvent( "onreadystatechange", DOMContentLoaded );
+       while ( i-- ) {
+               Expr.attrHandle[ arr[i] ] = handler;
+       }
+}
 
-                       // A fallback to window.onload, that will always work
-                       window.attachEvent( "onload", jQuery.ready );
+/**
+ * Checks document order of two siblings
+ * @param {Element} a
+ * @param {Element} b
+ * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
+ */
+function siblingCheck( a, b ) {
+       var cur = b && a,
+               diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
+                       ( ~b.sourceIndex || MAX_NEGATIVE ) -
+                       ( ~a.sourceIndex || MAX_NEGATIVE );
+
+       // Use IE sourceIndex if available on both nodes
+       if ( diff ) {
+               return diff;
+       }
 
-                       // If IE and not a frame
-                       // continually check to see if the document is ready
-                       var top = false;
+       // Check if b follows a
+       if ( cur ) {
+               while ( (cur = cur.nextSibling) ) {
+                       if ( cur === b ) {
+                               return -1;
+                       }
+               }
+       }
 
-                       try {
-                               top = window.frameElement == null && document.documentElement;
-                       } catch(e) {}
+       return a ? 1 : -1;
+}
 
-                       if ( top && top.doScroll ) {
-                               (function doScrollCheck() {
-                                       if ( !jQuery.isReady ) {
+/**
+ * Returns a function to use in pseudos for input types
+ * @param {String} type
+ */
+function createInputPseudo( type ) {
+       return function( elem ) {
+               var name = elem.nodeName.toLowerCase();
+               return name === "input" && elem.type === type;
+       };
+}
 
-                                               try {
-                                                       // Use the trick by Diego Perini
-                                                       // http://javascript.nwbox.com/IEContentLoaded/
-                                                       top.doScroll("left");
-                                               } catch(e) {
-                                                       return setTimeout( doScrollCheck, 50 );
-                                               }
+/**
+ * Returns a function to use in pseudos for buttons
+ * @param {String} type
+ */
+function createButtonPseudo( type ) {
+       return function( elem ) {
+               var name = elem.nodeName.toLowerCase();
+               return (name === "input" || name === "button") && elem.type === type;
+       };
+}
 
-                                               // and execute any waiting functions
-                                               jQuery.ready();
-                                       }
-                               })();
+/**
+ * Returns a function to use in pseudos for positionals
+ * @param {Function} fn
+ */
+function createPositionalPseudo( fn ) {
+       return markFunction(function( argument ) {
+               argument = +argument;
+               return markFunction(function( seed, matches ) {
+                       var j,
+                               matchIndexes = fn( [], seed.length, argument ),
+                               i = matchIndexes.length;
+
+                       // Match elements found at the specified indexes
+                       while ( i-- ) {
+                               if ( seed[ (j = matchIndexes[i]) ] ) {
+                                       seed[j] = !(matches[j] = seed[j]);
+                               }
                        }
+               });
+       });
+}
+
+/**
+ * Checks a node for validity as a Sizzle context
+ * @param {Element|Object=} context
+ * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
+ */
+function testContext( context ) {
+       return context && typeof context.getElementsByTagName !== strundefined && context;
+}
+
+// Expose support vars for convenience
+support = Sizzle.support = {};
+
+/**
+ * Detects XML nodes
+ * @param {Element|Object} elem An element or a document
+ * @returns {Boolean} True iff elem is a non-HTML XML node
+ */
+isXML = Sizzle.isXML = function( elem ) {
+       // documentElement is verified for cases where it doesn't yet exist
+       // (such as loading iframes in IE - #4833)
+       var documentElement = elem && (elem.ownerDocument || elem).documentElement;
+       return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+/**
+ * Sets document-related variables once based on the current document
+ * @param {Element|Object} [doc] An element or document object to use to set the document
+ * @returns {Object} Returns the current document
+ */
+setDocument = Sizzle.setDocument = function( node ) {
+       var hasCompare,
+               doc = node ? node.ownerDocument || node : preferredDoc,
+               parent = doc.defaultView;
+
+       // If no document and documentElement is available, return
+       if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
+               return document;
+       }
+
+       // Set our document
+       document = doc;
+       docElem = doc.documentElement;
+
+       // Support tests
+       documentIsHTML = !isXML( doc );
+
+       // Support: IE>8
+       // If iframe document is assigned to "document" variable and if iframe has been reloaded,
+       // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936
+       // IE6-8 do not support the defaultView property so parent will be undefined
+       if ( parent && parent !== parent.top ) {
+               // IE11 does not have attachEvent, so all must suffer
+               if ( parent.addEventListener ) {
+                       parent.addEventListener( "unload", function() {
+                               setDocument();
+                       }, false );
+               } else if ( parent.attachEvent ) {
+                       parent.attachEvent( "onunload", function() {
+                               setDocument();
+                       });
                }
        }
-       return readyList.promise( obj );
-};
 
-// Populate the class2type map
-jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
-       class2type[ "[object " + name + "]" ] = name.toLowerCase();
-});
+       /* Attributes
+       ---------------------------------------------------------------------- */
 
-// All jQuery objects should point back to these
-rootjQuery = jQuery(document);
-// String to Object options format cache
-var optionsCache = {};
+       // Support: IE<8
+       // Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans)
+       support.attributes = assert(function( div ) {
+               div.className = "i";
+               return !div.getAttribute("className");
+       });
 
-// Convert String-formatted options into Object-formatted ones and store in cache
-function createOptions( options ) {
-       var object = optionsCache[ options ] = {};
-       jQuery.each( options.split( core_rspace ), function( _, flag ) {
-               object[ flag ] = true;
+       /* getElement(s)By*
+       ---------------------------------------------------------------------- */
+
+       // Check if getElementsByTagName("*") returns only elements
+       support.getElementsByTagName = assert(function( div ) {
+               div.appendChild( doc.createComment("") );
+               return !div.getElementsByTagName("*").length;
        });
-       return object;
-}
 
-/*
- * Create a callback list using the following parameters:
- *
- *     options: an optional list of space-separated options that will change how
- *                     the callback list behaves or a more traditional option object
- *
- * By default a callback list will act like an event callback list and can be
- * "fired" multiple times.
- *
- * Possible options:
- *
- *     once:                   will ensure the callback list can only be fired once (like a Deferred)
- *
- *     memory:                 will keep track of previous values and will call any callback added
- *                                     after the list has been fired right away with the latest "memorized"
- *                                     values (like a Deferred)
- *
- *     unique:                 will ensure a callback can only be added once (no duplicate in the list)
- *
- *     stopOnFalse:    interrupt callings when a callback returns false
- *
- */
-jQuery.Callbacks = function( options ) {
+       // Check if getElementsByClassName can be trusted
+       support.getElementsByClassName = rnative.test( doc.getElementsByClassName ) && assert(function( div ) {
+               div.innerHTML = "<div class='a'></div><div class='a i'></div>";
 
-       // Convert options from String-formatted to Object-formatted if needed
-       // (we check in cache first)
-       options = typeof options === "string" ?
-               ( optionsCache[ options ] || createOptions( options ) ) :
-               jQuery.extend( {}, options );
+               // Support: Safari<4
+               // Catch class over-caching
+               div.firstChild.className = "i";
+               // Support: Opera<10
+               // Catch gEBCN failure to find non-leading classes
+               return div.getElementsByClassName("i").length === 2;
+       });
 
-       var // Last fire value (for non-forgettable lists)
-               memory,
-               // Flag to know if list was already fired
-               fired,
-               // Flag to know if list is currently firing
-               firing,
-               // First callback to fire (used internally by add and fireWith)
-               firingStart,
-               // End of the loop when firing
-               firingLength,
-               // Index of currently firing callback (modified by remove if needed)
-               firingIndex,
-               // Actual callback list
-               list = [],
-               // Stack of fire calls for repeatable lists
-               stack = !options.once && [],
-               // Fire callbacks
-               fire = function( data ) {
-                       memory = options.memory && data;
-                       fired = true;
-                       firingIndex = firingStart || 0;
-                       firingStart = 0;
-                       firingLength = list.length;
-                       firing = true;
-                       for ( ; list && firingIndex < firingLength; firingIndex++ ) {
-                               if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
-                                       memory = false; // To prevent further calls using add
-                                       break;
+       // Support: IE<10
+       // Check if getElementById returns elements by name
+       // The broken getElementById methods don't pick up programatically-set names,
+       // so use a roundabout getElementsByName test
+       support.getById = assert(function( div ) {
+               docElem.appendChild( div ).id = expando;
+               return !doc.getElementsByName || !doc.getElementsByName( expando ).length;
+       });
+
+       // ID find and filter
+       if ( support.getById ) {
+               Expr.find["ID"] = function( id, context ) {
+                       if ( typeof context.getElementById !== strundefined && documentIsHTML ) {
+                               var m = context.getElementById( id );
+                               // Check parentNode to catch when Blackberry 4.6 returns
+                               // nodes that are no longer in the document #6963
+                               return m && m.parentNode ? [ m ] : [];
+                       }
+               };
+               Expr.filter["ID"] = function( id ) {
+                       var attrId = id.replace( runescape, funescape );
+                       return function( elem ) {
+                               return elem.getAttribute("id") === attrId;
+                       };
+               };
+       } else {
+               // Support: IE6/7
+               // getElementById is not reliable as a find shortcut
+               delete Expr.find["ID"];
+
+               Expr.filter["ID"] =  function( id ) {
+                       var attrId = id.replace( runescape, funescape );
+                       return function( elem ) {
+                               var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
+                               return node && node.value === attrId;
+                       };
+               };
+       }
+
+       // Tag
+       Expr.find["TAG"] = support.getElementsByTagName ?
+               function( tag, context ) {
+                       if ( typeof context.getElementsByTagName !== strundefined ) {
+                               return context.getElementsByTagName( tag );
+                       }
+               } :
+               function( tag, context ) {
+                       var elem,
+                               tmp = [],
+                               i = 0,
+                               results = context.getElementsByTagName( tag );
+
+                       // Filter out possible comments
+                       if ( tag === "*" ) {
+                               while ( (elem = results[i++]) ) {
+                                       if ( elem.nodeType === 1 ) {
+                                               tmp.push( elem );
+                                       }
                                }
+
+                               return tmp;
                        }
-                       firing = false;
-                       if ( list ) {
-                               if ( stack ) {
-                                       if ( stack.length ) {
-                                               fire( stack.shift() );
+                       return results;
+               };
+
+       // Class
+       Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
+               if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) {
+                       return context.getElementsByClassName( className );
+               }
+       };
+
+       /* QSA/matchesSelector
+       ---------------------------------------------------------------------- */
+
+       // QSA and matchesSelector support
+
+       // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+       rbuggyMatches = [];
+
+       // qSa(:focus) reports false when true (Chrome 21)
+       // We allow this because of a bug in IE8/9 that throws an error
+       // whenever `document.activeElement` is accessed on an iframe
+       // So, we allow :focus to pass through QSA all the time to avoid the IE error
+       // See http://bugs.jquery.com/ticket/13378
+       rbuggyQSA = [];
+
+       if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {
+               // Build QSA regex
+               // Regex strategy adopted from Diego Perini
+               assert(function( div ) {
+                       // Select is set to empty string on purpose
+                       // This is to test IE's treatment of not explicitly
+                       // setting a boolean content attribute,
+                       // since its presence should be enough
+                       // http://bugs.jquery.com/ticket/12359
+                       div.innerHTML = "<select msallowclip=''><option selected=''></option></select>";
+
+                       // Support: IE8, Opera 11-12.16
+                       // Nothing should be selected when empty strings follow ^= or $= or *=
+                       // The test attribute must be unknown in Opera but "safe" for WinRT
+                       // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
+                       if ( div.querySelectorAll("[msallowclip^='']").length ) {
+                               rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
+                       }
+
+                       // Support: IE8
+                       // Boolean attributes and "value" are not treated correctly
+                       if ( !div.querySelectorAll("[selected]").length ) {
+                               rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
+                       }
+
+                       // Webkit/Opera - :checked should return selected option elements
+                       // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+                       // IE8 throws error here and will not see later tests
+                       if ( !div.querySelectorAll(":checked").length ) {
+                               rbuggyQSA.push(":checked");
+                       }
+               });
+
+               assert(function( div ) {
+                       // Support: Windows 8 Native Apps
+                       // The type and name attributes are restricted during .innerHTML assignment
+                       var input = doc.createElement("input");
+                       input.setAttribute( "type", "hidden" );
+                       div.appendChild( input ).setAttribute( "name", "D" );
+
+                       // Support: IE8
+                       // Enforce case-sensitivity of name attribute
+                       if ( div.querySelectorAll("[name=d]").length ) {
+                               rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
+                       }
+
+                       // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
+                       // IE8 throws error here and will not see later tests
+                       if ( !div.querySelectorAll(":enabled").length ) {
+                               rbuggyQSA.push( ":enabled", ":disabled" );
+                       }
+
+                       // Opera 10-11 does not throw on post-comma invalid pseudos
+                       div.querySelectorAll("*,:x");
+                       rbuggyQSA.push(",.*:");
+               });
+       }
+
+       if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
+               docElem.webkitMatchesSelector ||
+               docElem.mozMatchesSelector ||
+               docElem.oMatchesSelector ||
+               docElem.msMatchesSelector) )) ) {
+
+               assert(function( div ) {
+                       // Check to see if it's possible to do matchesSelector
+                       // on a disconnected node (IE 9)
+                       support.disconnectedMatch = matches.call( div, "div" );
+
+                       // This should fail with an exception
+                       // Gecko does not error, returns false instead
+                       matches.call( div, "[s!='']:x" );
+                       rbuggyMatches.push( "!=", pseudos );
+               });
+       }
+
+       rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
+       rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
+
+       /* Contains
+       ---------------------------------------------------------------------- */
+       hasCompare = rnative.test( docElem.compareDocumentPosition );
+
+       // Element contains another
+       // Purposefully does not implement inclusive descendent
+       // As in, an element does not contain itself
+       contains = hasCompare || rnative.test( docElem.contains ) ?
+               function( a, b ) {
+                       var adown = a.nodeType === 9 ? a.documentElement : a,
+                               bup = b && b.parentNode;
+                       return a === bup || !!( bup && bup.nodeType === 1 && (
+                               adown.contains ?
+                                       adown.contains( bup ) :
+                                       a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
+                       ));
+               } :
+               function( a, b ) {
+                       if ( b ) {
+                               while ( (b = b.parentNode) ) {
+                                       if ( b === a ) {
+                                               return true;
                                        }
-                               } else if ( memory ) {
-                                       list = [];
-                               } else {
-                                       self.disable();
                                }
                        }
+                       return false;
+               };
+
+       /* Sorting
+       ---------------------------------------------------------------------- */
+
+       // Document order sorting
+       sortOrder = hasCompare ?
+       function( a, b ) {
+
+               // Flag for duplicate removal
+               if ( a === b ) {
+                       hasDuplicate = true;
+                       return 0;
+               }
+
+               // Sort on method existence if only one input has compareDocumentPosition
+               var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
+               if ( compare ) {
+                       return compare;
+               }
+
+               // Calculate position if both inputs belong to the same document
+               compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
+                       a.compareDocumentPosition( b ) :
+
+                       // Otherwise we know they are disconnected
+                       1;
+
+               // Disconnected nodes
+               if ( compare & 1 ||
+                       (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
+
+                       // Choose the first element that is related to our preferred document
+                       if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
+                               return -1;
+                       }
+                       if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
+                               return 1;
+                       }
+
+                       // Maintain original order
+                       return sortInput ?
+                               ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
+                               0;
+               }
+
+               return compare & 4 ? -1 : 1;
+       } :
+       function( a, b ) {
+               // Exit early if the nodes are identical
+               if ( a === b ) {
+                       hasDuplicate = true;
+                       return 0;
+               }
+
+               var cur,
+                       i = 0,
+                       aup = a.parentNode,
+                       bup = b.parentNode,
+                       ap = [ a ],
+                       bp = [ b ];
+
+               // Parentless nodes are either documents or disconnected
+               if ( !aup || !bup ) {
+                       return a === doc ? -1 :
+                               b === doc ? 1 :
+                               aup ? -1 :
+                               bup ? 1 :
+                               sortInput ?
+                               ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
+                               0;
+
+               // If the nodes are siblings, we can do a quick check
+               } else if ( aup === bup ) {
+                       return siblingCheck( a, b );
+               }
+
+               // Otherwise we need full lists of their ancestors for comparison
+               cur = a;
+               while ( (cur = cur.parentNode) ) {
+                       ap.unshift( cur );
+               }
+               cur = b;
+               while ( (cur = cur.parentNode) ) {
+                       bp.unshift( cur );
+               }
+
+               // Walk down the tree looking for a discrepancy
+               while ( ap[i] === bp[i] ) {
+                       i++;
+               }
+
+               return i ?
+                       // Do a sibling check if the nodes have a common ancestor
+                       siblingCheck( ap[i], bp[i] ) :
+
+                       // Otherwise nodes in our document sort first
+                       ap[i] === preferredDoc ? -1 :
+                       bp[i] === preferredDoc ? 1 :
+                       0;
+       };
+
+       return doc;
+};
+
+Sizzle.matches = function( expr, elements ) {
+       return Sizzle( expr, null, null, elements );
+};
+
+Sizzle.matchesSelector = function( elem, expr ) {
+       // Set document vars if needed
+       if ( ( elem.ownerDocument || elem ) !== document ) {
+               setDocument( elem );
+       }
+
+       // Make sure that attribute selectors are quoted
+       expr = expr.replace( rattributeQuotes, "='$1']" );
+
+       if ( support.matchesSelector && documentIsHTML &&
+               ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
+               ( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
+
+               try {
+                       var ret = matches.call( elem, expr );
+
+                       // IE 9's matchesSelector returns false on disconnected nodes
+                       if ( ret || support.disconnectedMatch ||
+                                       // As well, disconnected nodes are said to be in a document
+                                       // fragment in IE 9
+                                       elem.document && elem.document.nodeType !== 11 ) {
+                               return ret;
+                       }
+               } catch(e) {}
+       }
+
+       return Sizzle( expr, document, null, [ elem ] ).length > 0;
+};
+
+Sizzle.contains = function( context, elem ) {
+       // Set document vars if needed
+       if ( ( context.ownerDocument || context ) !== document ) {
+               setDocument( context );
+       }
+       return contains( context, elem );
+};
+
+Sizzle.attr = function( elem, name ) {
+       // Set document vars if needed
+       if ( ( elem.ownerDocument || elem ) !== document ) {
+               setDocument( elem );
+       }
+
+       var fn = Expr.attrHandle[ name.toLowerCase() ],
+               // Don't get fooled by Object.prototype properties (jQuery #13807)
+               val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
+                       fn( elem, name, !documentIsHTML ) :
+                       undefined;
+
+       return val !== undefined ?
+               val :
+               support.attributes || !documentIsHTML ?
+                       elem.getAttribute( name ) :
+                       (val = elem.getAttributeNode(name)) && val.specified ?
+                               val.value :
+                               null;
+};
+
+Sizzle.error = function( msg ) {
+       throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+/**
+ * Document sorting and removing duplicates
+ * @param {ArrayLike} results
+ */
+Sizzle.uniqueSort = function( results ) {
+       var elem,
+               duplicates = [],
+               j = 0,
+               i = 0;
+
+       // Unless we *know* we can detect duplicates, assume their presence
+       hasDuplicate = !support.detectDuplicates;
+       sortInput = !support.sortStable && results.slice( 0 );
+       results.sort( sortOrder );
+
+       if ( hasDuplicate ) {
+               while ( (elem = results[i++]) ) {
+                       if ( elem === results[ i ] ) {
+                               j = duplicates.push( i );
+                       }
+               }
+               while ( j-- ) {
+                       results.splice( duplicates[ j ], 1 );
+               }
+       }
+
+       // Clear input after sorting to release objects
+       // See https://github.com/jquery/sizzle/pull/225
+       sortInput = null;
+
+       return results;
+};
+
+/**
+ * Utility function for retrieving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+getText = Sizzle.getText = function( elem ) {
+       var node,
+               ret = "",
+               i = 0,
+               nodeType = elem.nodeType;
+
+       if ( !nodeType ) {
+               // If no nodeType, this is expected to be an array
+               while ( (node = elem[i++]) ) {
+                       // Do not traverse comment nodes
+                       ret += getText( node );
+               }
+       } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+               // Use textContent for elements
+               // innerText usage removed for consistency of new lines (jQuery #11153)
+               if ( typeof elem.textContent === "string" ) {
+                       return elem.textContent;
+               } else {
+                       // Traverse its children
+                       for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+                               ret += getText( elem );
+                       }
+               }
+       } else if ( nodeType === 3 || nodeType === 4 ) {
+               return elem.nodeValue;
+       }
+       // Do not include comment or processing instruction nodes
+
+       return ret;
+};
+
+Expr = Sizzle.selectors = {
+
+       // Can be adjusted by the user
+       cacheLength: 50,
+
+       createPseudo: markFunction,
+
+       match: matchExpr,
+
+       attrHandle: {},
+
+       find: {},
+
+       relative: {
+               ">": { dir: "parentNode", first: true },
+               " ": { dir: "parentNode" },
+               "+": { dir: "previousSibling", first: true },
+               "~": { dir: "previousSibling" }
+       },
+
+       preFilter: {
+               "ATTR": function( match ) {
+                       match[1] = match[1].replace( runescape, funescape );
+
+                       // Move the given value to match[3] whether quoted or unquoted
+                       match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
+
+                       if ( match[2] === "~=" ) {
+                               match[3] = " " + match[3] + " ";
+                       }
+
+                       return match.slice( 0, 4 );
+               },
+
+               "CHILD": function( match ) {
+                       /* matches from matchExpr["CHILD"]
+                               1 type (only|nth|...)
+                               2 what (child|of-type)
+                               3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+                               4 xn-component of xn+y argument ([+-]?\d*n|)
+                               5 sign of xn-component
+                               6 x of xn-component
+                               7 sign of y-component
+                               8 y of y-component
+                       */
+                       match[1] = match[1].toLowerCase();
+
+                       if ( match[1].slice( 0, 3 ) === "nth" ) {
+                               // nth-* requires argument
+                               if ( !match[3] ) {
+                                       Sizzle.error( match[0] );
+                               }
+
+                               // numeric x and y parameters for Expr.filter.CHILD
+                               // remember that false/true cast respectively to 0/1
+                               match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
+                               match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
+
+                       // other types prohibit arguments
+                       } else if ( match[3] ) {
+                               Sizzle.error( match[0] );
+                       }
+
+                       return match;
                },
-               // Actual Callbacks object
-               self = {
-                       // Add a callback or a collection of callbacks to the list
-                       add: function() {
-                               if ( list ) {
-                                       // First, we save the current length
-                                       var start = list.length;
-                                       (function add( args ) {
-                                               jQuery.each( args, function( _, arg ) {
-                                                       var type = jQuery.type( arg );
-                                                       if ( type === "function" ) {
-                                                               if ( !options.unique || !self.has( arg ) ) {
-                                                                       list.push( arg );
+
+               "PSEUDO": function( match ) {
+                       var excess,
+                               unquoted = !match[6] && match[2];
+
+                       if ( matchExpr["CHILD"].test( match[0] ) ) {
+                               return null;
+                       }
+
+                       // Accept quoted arguments as-is
+                       if ( match[3] ) {
+                               match[2] = match[4] || match[5] || "";
+
+                       // Strip excess characters from unquoted arguments
+                       } else if ( unquoted && rpseudo.test( unquoted ) &&
+                               // Get excess from tokenize (recursively)
+                               (excess = tokenize( unquoted, true )) &&
+                               // advance to the next closing parenthesis
+                               (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
+
+                               // excess is a negative index
+                               match[0] = match[0].slice( 0, excess );
+                               match[2] = unquoted.slice( 0, excess );
+                       }
+
+                       // Return only captures needed by the pseudo filter method (type and argument)
+                       return match.slice( 0, 3 );
+               }
+       },
+
+       filter: {
+
+               "TAG": function( nodeNameSelector ) {
+                       var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
+                       return nodeNameSelector === "*" ?
+                               function() { return true; } :
+                               function( elem ) {
+                                       return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
+                               };
+               },
+
+               "CLASS": function( className ) {
+                       var pattern = classCache[ className + " " ];
+
+                       return pattern ||
+                               (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
+                               classCache( className, function( elem ) {
+                                       return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "" );
+                               });
+               },
+
+               "ATTR": function( name, operator, check ) {
+                       return function( elem ) {
+                               var result = Sizzle.attr( elem, name );
+
+                               if ( result == null ) {
+                                       return operator === "!=";
+                               }
+                               if ( !operator ) {
+                                       return true;
+                               }
+
+                               result += "";
+
+                               return operator === "=" ? result === check :
+                                       operator === "!=" ? result !== check :
+                                       operator === "^=" ? check && result.indexOf( check ) === 0 :
+                                       operator === "*=" ? check && result.indexOf( check ) > -1 :
+                                       operator === "$=" ? check && result.slice( -check.length ) === check :
+                                       operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :
+                                       operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
+                                       false;
+                       };
+               },
+
+               "CHILD": function( type, what, argument, first, last ) {
+                       var simple = type.slice( 0, 3 ) !== "nth",
+                               forward = type.slice( -4 ) !== "last",
+                               ofType = what === "of-type";
+
+                       return first === 1 && last === 0 ?
+
+                               // Shortcut for :nth-*(n)
+                               function( elem ) {
+                                       return !!elem.parentNode;
+                               } :
+
+                               function( elem, context, xml ) {
+                                       var cache, outerCache, node, diff, nodeIndex, start,
+                                               dir = simple !== forward ? "nextSibling" : "previousSibling",
+                                               parent = elem.parentNode,
+                                               name = ofType && elem.nodeName.toLowerCase(),
+                                               useCache = !xml && !ofType;
+
+                                       if ( parent ) {
+
+                                               // :(first|last|only)-(child|of-type)
+                                               if ( simple ) {
+                                                       while ( dir ) {
+                                                               node = elem;
+                                                               while ( (node = node[ dir ]) ) {
+                                                                       if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {
+                                                                               return false;
+                                                                       }
                                                                }
-                                                       } else if ( arg && arg.length && type !== "string" ) {
-                                                               // Inspect recursively
-                                                               add( arg );
+                                                               // Reverse direction for :only-* (if we haven't yet done so)
+                                                               start = dir = type === "only" && !start && "nextSibling";
                                                        }
-                                               });
-                                       })( arguments );
-                                       // Do we need to add the callbacks to the
-                                       // current firing batch?
-                                       if ( firing ) {
-                                               firingLength = list.length;
-                                       // With memory, if we're not firing then
-                                       // we should call right away
-                                       } else if ( memory ) {
-                                               firingStart = start;
-                                               fire( memory );
-                                       }
-                               }
-                               return this;
-                       },
-                       // Remove a callback from the list
-                       remove: function() {
-                               if ( list ) {
-                                       jQuery.each( arguments, function( _, arg ) {
-                                               var index;
-                                               while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
-                                                       list.splice( index, 1 );
-                                                       // Handle firing indexes
-                                                       if ( firing ) {
-                                                               if ( index <= firingLength ) {
-                                                                       firingLength--;
+                                                       return true;
+                                               }
+
+                                               start = [ forward ? parent.firstChild : parent.lastChild ];
+
+                                               // non-xml :nth-child(...) stores cache data on `parent`
+                                               if ( forward && useCache ) {
+                                                       // Seek `elem` from a previously-cached index
+                                                       outerCache = parent[ expando ] || (parent[ expando ] = {});
+                                                       cache = outerCache[ type ] || [];
+                                                       nodeIndex = cache[0] === dirruns && cache[1];
+                                                       diff = cache[0] === dirruns && cache[2];
+                                                       node = nodeIndex && parent.childNodes[ nodeIndex ];
+
+                                                       while ( (node = ++nodeIndex && node && node[ dir ] ||
+
+                                                               // Fallback to seeking `elem` from the start
+                                                               (diff = nodeIndex = 0) || start.pop()) ) {
+
+                                                               // When found, cache indexes on `parent` and break
+                                                               if ( node.nodeType === 1 && ++diff && node === elem ) {
+                                                                       outerCache[ type ] = [ dirruns, nodeIndex, diff ];
+                                                                       break;
                                                                }
-                                                               if ( index <= firingIndex ) {
-                                                                       firingIndex--;
+                                                       }
+
+                                               // Use previously-cached element index if available
+                                               } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {
+                                                       diff = cache[1];
+
+                                               // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)
+                                               } else {
+                                                       // Use the same loop as above to seek `elem` from the start
+                                                       while ( (node = ++nodeIndex && node && node[ dir ] ||
+                                                               (diff = nodeIndex = 0) || start.pop()) ) {
+
+                                                               if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {
+                                                                       // Cache the index of each encountered element
+                                                                       if ( useCache ) {
+                                                                               (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];
+                                                                       }
+
+                                                                       if ( node === elem ) {
+                                                                               break;
+                                                                       }
                                                                }
                                                        }
                                                }
-                                       });
-                               }
-                               return this;
-                       },
-                       // Control if a given callback is in the list
-                       has: function( fn ) {
-                               return jQuery.inArray( fn, list ) > -1;
-                       },
-                       // Remove all callbacks from the list
-                       empty: function() {
-                               list = [];
-                               return this;
-                       },
-                       // Have the list do nothing anymore
-                       disable: function() {
-                               list = stack = memory = undefined;
-                               return this;
-                       },
-                       // Is it disabled?
-                       disabled: function() {
-                               return !list;
-                       },
-                       // Lock the list in its current state
-                       lock: function() {
-                               stack = undefined;
-                               if ( !memory ) {
-                                       self.disable();
-                               }
-                               return this;
-                       },
-                       // Is it locked?
-                       locked: function() {
-                               return !stack;
-                       },
+
+                                               // Incorporate the offset, then check against cycle size
+                                               diff -= last;
+                                               return diff === first || ( diff % first === 0 && diff / first >= 0 );
+                                       }
+                               };
+               },
+
+               "PSEUDO": function( pseudo, argument ) {
+                       // pseudo-class names are case-insensitive
+                       // http://www.w3.org/TR/selectors/#pseudo-classes
+                       // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
+                       // Remember that setFilters inherits from pseudos
+                       var args,
+                               fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
+                                       Sizzle.error( "unsupported pseudo: " + pseudo );
+
+                       // The user may use createPseudo to indicate that
+                       // arguments are needed to create the filter function
+                       // just as Sizzle does
+                       if ( fn[ expando ] ) {
+                               return fn( argument );
+                       }
+
+                       // But maintain support for old signatures
+                       if ( fn.length > 1 ) {
+                               args = [ pseudo, pseudo, "", argument ];
+                               return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
+                                       markFunction(function( seed, matches ) {
+                                               var idx,
+                                                       matched = fn( seed, argument ),
+                                                       i = matched.length;
+                                               while ( i-- ) {
+                                                       idx = indexOf.call( seed, matched[i] );
+                                                       seed[ idx ] = !( matches[ idx ] = matched[i] );
+                                               }
+                                       }) :
+                                       function( elem ) {
+                                               return fn( elem, 0, args );
+                                       };
+                       }
+
+                       return fn;
+               }
+       },
+
+       pseudos: {
+               // Potentially complex pseudos
+               "not": markFunction(function( selector ) {
+                       // Trim the selector passed to compile
+                       // to avoid treating leading and trailing
+                       // spaces as combinators
+                       var input = [],
+                               results = [],
+                               matcher = compile( selector.replace( rtrim, "$1" ) );
+
+                       return matcher[ expando ] ?
+                               markFunction(function( seed, matches, context, xml ) {
+                                       var elem,
+                                               unmatched = matcher( seed, null, xml, [] ),
+                                               i = seed.length;
+
+                                       // Match elements unmatched by `matcher`
+                                       while ( i-- ) {
+                                               if ( (elem = unmatched[i]) ) {
+                                                       seed[i] = !(matches[i] = elem);
+                                               }
+                                       }
+                               }) :
+                               function( elem, context, xml ) {
+                                       input[0] = elem;
+                                       matcher( input, null, xml, results );
+                                       return !results.pop();
+                               };
+               }),
+
+               "has": markFunction(function( selector ) {
+                       return function( elem ) {
+                               return Sizzle( selector, elem ).length > 0;
+                       };
+               }),
+
+               "contains": markFunction(function( text ) {
+                       return function( elem ) {
+                               return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
+                       };
+               }),
+
+               // "Whether an element is represented by a :lang() selector
+               // is based solely on the element's language value
+               // being equal to the identifier C,
+               // or beginning with the identifier C immediately followed by "-".
+               // The matching of C against the element's language value is performed case-insensitively.
+               // The identifier C does not have to be a valid language name."
+               // http://www.w3.org/TR/selectors/#lang-pseudo
+               "lang": markFunction( function( lang ) {
+                       // lang value must be a valid identifier
+                       if ( !ridentifier.test(lang || "") ) {
+                               Sizzle.error( "unsupported lang: " + lang );
+                       }
+                       lang = lang.replace( runescape, funescape ).toLowerCase();
+                       return function( elem ) {
+                               var elemLang;
+                               do {
+                                       if ( (elemLang = documentIsHTML ?
+                                               elem.lang :
+                                               elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
+
+                                               elemLang = elemLang.toLowerCase();
+                                               return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
+                                       }
+                               } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
+                               return false;
+                       };
+               }),
+
+               // Miscellaneous
+               "target": function( elem ) {
+                       var hash = window.location && window.location.hash;
+                       return hash && hash.slice( 1 ) === elem.id;
+               },
+
+               "root": function( elem ) {
+                       return elem === docElem;
+               },
+
+               "focus": function( elem ) {
+                       return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
+               },
+
+               // Boolean properties
+               "enabled": function( elem ) {
+                       return elem.disabled === false;
+               },
+
+               "disabled": function( elem ) {
+                       return elem.disabled === true;
+               },
+
+               "checked": function( elem ) {
+                       // In CSS3, :checked should return both checked and selected elements
+                       // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+                       var nodeName = elem.nodeName.toLowerCase();
+                       return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
+               },
+
+               "selected": function( elem ) {
+                       // Accessing this property makes selected-by-default
+                       // options in Safari work properly
+                       if ( elem.parentNode ) {
+                               elem.parentNode.selectedIndex;
+                       }
+
+                       return elem.selected === true;
+               },
+
+               // Contents
+               "empty": function( elem ) {
+                       // http://www.w3.org/TR/selectors/#empty-pseudo
+                       // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
+                       //   but not by others (comment: 8; processing instruction: 7; etc.)
+                       // nodeType < 6 works because attributes (2) do not appear as children
+                       for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+                               if ( elem.nodeType < 6 ) {
+                                       return false;
+                               }
+                       }
+                       return true;
+               },
+
+               "parent": function( elem ) {
+                       return !Expr.pseudos["empty"]( elem );
+               },
+
+               // Element/input types
+               "header": function( elem ) {
+                       return rheader.test( elem.nodeName );
+               },
+
+               "input": function( elem ) {
+                       return rinputs.test( elem.nodeName );
+               },
+
+               "button": function( elem ) {
+                       var name = elem.nodeName.toLowerCase();
+                       return name === "input" && elem.type === "button" || name === "button";
+               },
+
+               "text": function( elem ) {
+                       var attr;
+                       return elem.nodeName.toLowerCase() === "input" &&
+                               elem.type === "text" &&
+
+                               // Support: IE<8
+                               // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
+                               ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
+               },
+
+               // Position-in-collection
+               "first": createPositionalPseudo(function() {
+                       return [ 0 ];
+               }),
+
+               "last": createPositionalPseudo(function( matchIndexes, length ) {
+                       return [ length - 1 ];
+               }),
+
+               "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
+                       return [ argument < 0 ? argument + length : argument ];
+               }),
+
+               "even": createPositionalPseudo(function( matchIndexes, length ) {
+                       var i = 0;
+                       for ( ; i < length; i += 2 ) {
+                               matchIndexes.push( i );
+                       }
+                       return matchIndexes;
+               }),
+
+               "odd": createPositionalPseudo(function( matchIndexes, length ) {
+                       var i = 1;
+                       for ( ; i < length; i += 2 ) {
+                               matchIndexes.push( i );
+                       }
+                       return matchIndexes;
+               }),
+
+               "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+                       var i = argument < 0 ? argument + length : argument;
+                       for ( ; --i >= 0; ) {
+                               matchIndexes.push( i );
+                       }
+                       return matchIndexes;
+               }),
+
+               "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+                       var i = argument < 0 ? argument + length : argument;
+                       for ( ; ++i < length; ) {
+                               matchIndexes.push( i );
+                       }
+                       return matchIndexes;
+               })
+       }
+};
+
+Expr.pseudos["nth"] = Expr.pseudos["eq"];
+
+// Add button/input type pseudos
+for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
+       Expr.pseudos[ i ] = createInputPseudo( i );
+}
+for ( i in { submit: true, reset: true } ) {
+       Expr.pseudos[ i ] = createButtonPseudo( i );
+}
+
+// Easy API for creating new setFilters
+function setFilters() {}
+setFilters.prototype = Expr.filters = Expr.pseudos;
+Expr.setFilters = new setFilters();
+
+tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
+       var matched, match, tokens, type,
+               soFar, groups, preFilters,
+               cached = tokenCache[ selector + " " ];
+
+       if ( cached ) {
+               return parseOnly ? 0 : cached.slice( 0 );
+       }
+
+       soFar = selector;
+       groups = [];
+       preFilters = Expr.preFilter;
+
+       while ( soFar ) {
+
+               // Comma and first run
+               if ( !matched || (match = rcomma.exec( soFar )) ) {
+                       if ( match ) {
+                               // Don't consume trailing commas as valid
+                               soFar = soFar.slice( match[0].length ) || soFar;
+                       }
+                       groups.push( (tokens = []) );
+               }
+
+               matched = false;
+
+               // Combinators
+               if ( (match = rcombinators.exec( soFar )) ) {
+                       matched = match.shift();
+                       tokens.push({
+                               value: matched,
+                               // Cast descendant combinators to space
+                               type: match[0].replace( rtrim, " " )
+                       });
+                       soFar = soFar.slice( matched.length );
+               }
+
+               // Filters
+               for ( type in Expr.filter ) {
+                       if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
+                               (match = preFilters[ type ]( match ))) ) {
+                               matched = match.shift();
+                               tokens.push({
+                                       value: matched,
+                                       type: type,
+                                       matches: match
+                               });
+                               soFar = soFar.slice( matched.length );
+                       }
+               }
+
+               if ( !matched ) {
+                       break;
+               }
+       }
+
+       // Return the length of the invalid excess
+       // if we're just parsing
+       // Otherwise, throw an error or return tokens
+       return parseOnly ?
+               soFar.length :
+               soFar ?
+                       Sizzle.error( selector ) :
+                       // Cache the tokens
+                       tokenCache( selector, groups ).slice( 0 );
+};
+
+function toSelector( tokens ) {
+       var i = 0,
+               len = tokens.length,
+               selector = "";
+       for ( ; i < len; i++ ) {
+               selector += tokens[i].value;
+       }
+       return selector;
+}
+
+function addCombinator( matcher, combinator, base ) {
+       var dir = combinator.dir,
+               checkNonElements = base && dir === "parentNode",
+               doneName = done++;
+
+       return combinator.first ?
+               // Check against closest ancestor/preceding element
+               function( elem, context, xml ) {
+                       while ( (elem = elem[ dir ]) ) {
+                               if ( elem.nodeType === 1 || checkNonElements ) {
+                                       return matcher( elem, context, xml );
+                               }
+                       }
+               } :
+
+               // Check against all ancestor/preceding elements
+               function( elem, context, xml ) {
+                       var oldCache, outerCache,
+                               newCache = [ dirruns, doneName ];
+
+                       // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
+                       if ( xml ) {
+                               while ( (elem = elem[ dir ]) ) {
+                                       if ( elem.nodeType === 1 || checkNonElements ) {
+                                               if ( matcher( elem, context, xml ) ) {
+                                                       return true;
+                                               }
+                                       }
+                               }
+                       } else {
+                               while ( (elem = elem[ dir ]) ) {
+                                       if ( elem.nodeType === 1 || checkNonElements ) {
+                                               outerCache = elem[ expando ] || (elem[ expando ] = {});
+                                               if ( (oldCache = outerCache[ dir ]) &&
+                                                       oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
+
+                                                       // Assign to newCache so results back-propagate to previous elements
+                                                       return (newCache[ 2 ] = oldCache[ 2 ]);
+                                               } else {
+                                                       // Reuse newcache so results back-propagate to previous elements
+                                                       outerCache[ dir ] = newCache;
+
+                                                       // A match means we're done; a fail means we have to keep checking
+                                                       if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
+                                                               return true;
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               };
+}
+
+function elementMatcher( matchers ) {
+       return matchers.length > 1 ?
+               function( elem, context, xml ) {
+                       var i = matchers.length;
+                       while ( i-- ) {
+                               if ( !matchers[i]( elem, context, xml ) ) {
+                                       return false;
+                               }
+                       }
+                       return true;
+               } :
+               matchers[0];
+}
+
+function multipleContexts( selector, contexts, results ) {
+       var i = 0,
+               len = contexts.length;
+       for ( ; i < len; i++ ) {
+               Sizzle( selector, contexts[i], results );
+       }
+       return results;
+}
+
+function condense( unmatched, map, filter, context, xml ) {
+       var elem,
+               newUnmatched = [],
+               i = 0,
+               len = unmatched.length,
+               mapped = map != null;
+
+       for ( ; i < len; i++ ) {
+               if ( (elem = unmatched[i]) ) {
+                       if ( !filter || filter( elem, context, xml ) ) {
+                               newUnmatched.push( elem );
+                               if ( mapped ) {
+                                       map.push( i );
+                               }
+                       }
+               }
+       }
+
+       return newUnmatched;
+}
+
+function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
+       if ( postFilter && !postFilter[ expando ] ) {
+               postFilter = setMatcher( postFilter );
+       }
+       if ( postFinder && !postFinder[ expando ] ) {
+               postFinder = setMatcher( postFinder, postSelector );
+       }
+       return markFunction(function( seed, results, context, xml ) {
+               var temp, i, elem,
+                       preMap = [],
+                       postMap = [],
+                       preexisting = results.length,
+
+                       // Get initial elements from seed or context
+                       elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
+
+                       // Prefilter to get matcher input, preserving a map for seed-results synchronization
+                       matcherIn = preFilter && ( seed || !selector ) ?
+                               condense( elems, preMap, preFilter, context, xml ) :
+                               elems,
+
+                       matcherOut = matcher ?
+                               // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
+                               postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
+
+                                       // ...intermediate processing is necessary
+                                       [] :
+
+                                       // ...otherwise use results directly
+                                       results :
+                               matcherIn;
+
+               // Find primary matches
+               if ( matcher ) {
+                       matcher( matcherIn, matcherOut, context, xml );
+               }
+
+               // Apply postFilter
+               if ( postFilter ) {
+                       temp = condense( matcherOut, postMap );
+                       postFilter( temp, [], context, xml );
+
+                       // Un-match failing elements by moving them back to matcherIn
+                       i = temp.length;
+                       while ( i-- ) {
+                               if ( (elem = temp[i]) ) {
+                                       matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
+                               }
+                       }
+               }
+
+               if ( seed ) {
+                       if ( postFinder || preFilter ) {
+                               if ( postFinder ) {
+                                       // Get the final matcherOut by condensing this intermediate into postFinder contexts
+                                       temp = [];
+                                       i = matcherOut.length;
+                                       while ( i-- ) {
+                                               if ( (elem = matcherOut[i]) ) {
+                                                       // Restore matcherIn since elem is not yet a final match
+                                                       temp.push( (matcherIn[i] = elem) );
+                                               }
+                                       }
+                                       postFinder( null, (matcherOut = []), temp, xml );
+                               }
+
+                               // Move matched elements from seed to results to keep them synchronized
+                               i = matcherOut.length;
+                               while ( i-- ) {
+                                       if ( (elem = matcherOut[i]) &&
+                                               (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {
+
+                                               seed[temp] = !(results[temp] = elem);
+                                       }
+                               }
+                       }
+
+               // Add elements to results, through postFinder if defined
+               } else {
+                       matcherOut = condense(
+                               matcherOut === results ?
+                                       matcherOut.splice( preexisting, matcherOut.length ) :
+                                       matcherOut
+                       );
+                       if ( postFinder ) {
+                               postFinder( null, results, matcherOut, xml );
+                       } else {
+                               push.apply( results, matcherOut );
+                       }
+               }
+       });
+}
+
+function matcherFromTokens( tokens ) {
+       var checkContext, matcher, j,
+               len = tokens.length,
+               leadingRelative = Expr.relative[ tokens[0].type ],
+               implicitRelative = leadingRelative || Expr.relative[" "],
+               i = leadingRelative ? 1 : 0,
+
+               // The foundational matcher ensures that elements are reachable from top-level context(s)
+               matchContext = addCombinator( function( elem ) {
+                       return elem === checkContext;
+               }, implicitRelative, true ),
+               matchAnyContext = addCombinator( function( elem ) {
+                       return indexOf.call( checkContext, elem ) > -1;
+               }, implicitRelative, true ),
+               matchers = [ function( elem, context, xml ) {
+                       return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+                               (checkContext = context).nodeType ?
+                                       matchContext( elem, context, xml ) :
+                                       matchAnyContext( elem, context, xml ) );
+               } ];
+
+       for ( ; i < len; i++ ) {
+               if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
+                       matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
+               } else {
+                       matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
+
+                       // Return special upon seeing a positional matcher
+                       if ( matcher[ expando ] ) {
+                               // Find the next relative operator (if any) for proper handling
+                               j = ++i;
+                               for ( ; j < len; j++ ) {
+                                       if ( Expr.relative[ tokens[j].type ] ) {
+                                               break;
+                                       }
+                               }
+                               return setMatcher(
+                                       i > 1 && elementMatcher( matchers ),
+                                       i > 1 && toSelector(
+                                               // If the preceding token was a descendant combinator, insert an implicit any-element `*`
+                                               tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
+                                       ).replace( rtrim, "$1" ),
+                                       matcher,
+                                       i < j && matcherFromTokens( tokens.slice( i, j ) ),
+                                       j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
+                                       j < len && toSelector( tokens )
+                               );
+                       }
+                       matchers.push( matcher );
+               }
+       }
+
+       return elementMatcher( matchers );
+}
+
+function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
+       var bySet = setMatchers.length > 0,
+               byElement = elementMatchers.length > 0,
+               superMatcher = function( seed, context, xml, results, outermost ) {
+                       var elem, j, matcher,
+                               matchedCount = 0,
+                               i = "0",
+                               unmatched = seed && [],
+                               setMatched = [],
+                               contextBackup = outermostContext,
+                               // We must always have either seed elements or outermost context
+                               elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
+                               // Use integer dirruns iff this is the outermost matcher
+                               dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
+                               len = elems.length;
+
+                       if ( outermost ) {
+                               outermostContext = context !== document && context;
+                       }
+
+                       // Add elements passing elementMatchers directly to results
+                       // Keep `i` a string if there are no elements so `matchedCount` will be "00" below
+                       // Support: IE<9, Safari
+                       // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
+                       for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
+                               if ( byElement && elem ) {
+                                       j = 0;
+                                       while ( (matcher = elementMatchers[j++]) ) {
+                                               if ( matcher( elem, context, xml ) ) {
+                                                       results.push( elem );
+                                                       break;
+                                               }
+                                       }
+                                       if ( outermost ) {
+                                               dirruns = dirrunsUnique;
+                                       }
+                               }
+
+                               // Track unmatched elements for set filters
+                               if ( bySet ) {
+                                       // They will have gone through all possible matchers
+                                       if ( (elem = !matcher && elem) ) {
+                                               matchedCount--;
+                                       }
+
+                                       // Lengthen the array for every element, matched or not
+                                       if ( seed ) {
+                                               unmatched.push( elem );
+                                       }
+                               }
+                       }
+
+                       // Apply set filters to unmatched elements
+                       matchedCount += i;
+                       if ( bySet && i !== matchedCount ) {
+                               j = 0;
+                               while ( (matcher = setMatchers[j++]) ) {
+                                       matcher( unmatched, setMatched, context, xml );
+                               }
+
+                               if ( seed ) {
+                                       // Reintegrate element matches to eliminate the need for sorting
+                                       if ( matchedCount > 0 ) {
+                                               while ( i-- ) {
+                                                       if ( !(unmatched[i] || setMatched[i]) ) {
+                                                               setMatched[i] = pop.call( results );
+                                                       }
+                                               }
+                                       }
+
+                                       // Discard index placeholder values to get only actual matches
+                                       setMatched = condense( setMatched );
+                               }
+
+                               // Add matches to results
+                               push.apply( results, setMatched );
+
+                               // Seedless set matches succeeding multiple successful matchers stipulate sorting
+                               if ( outermost && !seed && setMatched.length > 0 &&
+                                       ( matchedCount + setMatchers.length ) > 1 ) {
+
+                                       Sizzle.uniqueSort( results );
+                               }
+                       }
+
+                       // Override manipulation of globals by nested matchers
+                       if ( outermost ) {
+                               dirruns = dirrunsUnique;
+                               outermostContext = contextBackup;
+                       }
+
+                       return unmatched;
+               };
+
+       return bySet ?
+               markFunction( superMatcher ) :
+               superMatcher;
+}
+
+compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
+       var i,
+               setMatchers = [],
+               elementMatchers = [],
+               cached = compilerCache[ selector + " " ];
+
+       if ( !cached ) {
+               // Generate a function of recursive functions that can be used to check each element
+               if ( !match ) {
+                       match = tokenize( selector );
+               }
+               i = match.length;
+               while ( i-- ) {
+                       cached = matcherFromTokens( match[i] );
+                       if ( cached[ expando ] ) {
+                               setMatchers.push( cached );
+                       } else {
+                               elementMatchers.push( cached );
+                       }
+               }
+
+               // Cache the compiled function
+               cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
+
+               // Save selector and tokenization
+               cached.selector = selector;
+       }
+       return cached;
+};
+
+/**
+ * A low-level selection function that works with Sizzle's compiled
+ *  selector functions
+ * @param {String|Function} selector A selector or a pre-compiled
+ *  selector function built with Sizzle.compile
+ * @param {Element} context
+ * @param {Array} [results]
+ * @param {Array} [seed] A set of elements to match against
+ */
+select = Sizzle.select = function( selector, context, results, seed ) {
+       var i, tokens, token, type, find,
+               compiled = typeof selector === "function" && selector,
+               match = !seed && tokenize( (selector = compiled.selector || selector) );
+
+       results = results || [];
+
+       // Try to minimize operations if there is no seed and only one group
+       if ( match.length === 1 ) {
+
+               // Take a shortcut and set the context if the root selector is an ID
+               tokens = match[0] = match[0].slice( 0 );
+               if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
+                               support.getById && context.nodeType === 9 && documentIsHTML &&
+                               Expr.relative[ tokens[1].type ] ) {
+
+                       context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
+                       if ( !context ) {
+                               return results;
+
+                       // Precompiled matchers will still verify ancestry, so step up a level
+                       } else if ( compiled ) {
+                               context = context.parentNode;
+                       }
+
+                       selector = selector.slice( tokens.shift().value.length );
+               }
+
+               // Fetch a seed set for right-to-left matching
+               i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
+               while ( i-- ) {
+                       token = tokens[i];
+
+                       // Abort if we hit a combinator
+                       if ( Expr.relative[ (type = token.type) ] ) {
+                               break;
+                       }
+                       if ( (find = Expr.find[ type ]) ) {
+                               // Search, expanding context for leading sibling combinators
+                               if ( (seed = find(
+                                       token.matches[0].replace( runescape, funescape ),
+                                       rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
+                               )) ) {
+
+                                       // If seed is empty or no tokens remain, we can return early
+                                       tokens.splice( i, 1 );
+                                       selector = seed.length && toSelector( tokens );
+                                       if ( !selector ) {
+                                               push.apply( results, seed );
+                                               return results;
+                                       }
+
+                                       break;
+                               }
+                       }
+               }
+       }
+
+       // Compile and execute a filtering function if one is not provided
+       // Provide `match` to avoid retokenization if we modified the selector above
+       ( compiled || compile( selector, match ) )(
+               seed,
+               context,
+               !documentIsHTML,
+               results,
+               rsibling.test( selector ) && testContext( context.parentNode ) || context
+       );
+       return results;
+};
+
+// One-time assignments
+
+// Sort stability
+support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
+
+// Support: Chrome<14
+// Always assume duplicates if they aren't passed to the comparison function
+support.detectDuplicates = !!hasDuplicate;
+
+// Initialize against the default document
+setDocument();
+
+// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
+// Detached nodes confoundingly follow *each other*
+support.sortDetached = assert(function( div1 ) {
+       // Should return 1, but returns 4 (following)
+       return div1.compareDocumentPosition( document.createElement("div") ) & 1;
+});
+
+// Support: IE<8
+// Prevent attribute/property "interpolation"
+// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !assert(function( div ) {
+       div.innerHTML = "<a href='#'></a>";
+       return div.firstChild.getAttribute("href") === "#" ;
+}) ) {
+       addHandle( "type|href|height|width", function( elem, name, isXML ) {
+               if ( !isXML ) {
+                       return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
+               }
+       });
+}
+
+// Support: IE<9
+// Use defaultValue in place of getAttribute("value")
+if ( !support.attributes || !assert(function( div ) {
+       div.innerHTML = "<input/>";
+       div.firstChild.setAttribute( "value", "" );
+       return div.firstChild.getAttribute( "value" ) === "";
+}) ) {
+       addHandle( "value", function( elem, name, isXML ) {
+               if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
+                       return elem.defaultValue;
+               }
+       });
+}
+
+// Support: IE<9
+// Use getAttributeNode to fetch booleans when getAttribute lies
+if ( !assert(function( div ) {
+       return div.getAttribute("disabled") == null;
+}) ) {
+       addHandle( booleans, function( elem, name, isXML ) {
+               var val;
+               if ( !isXML ) {
+                       return elem[ name ] === true ? name.toLowerCase() :
+                                       (val = elem.getAttributeNode( name )) && val.specified ?
+                                       val.value :
+                               null;
+               }
+       });
+}
+
+return Sizzle;
+
+})( window );
+
+
+
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.pseudos;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+
+var rneedsContext = jQuery.expr.match.needsContext;
+
+var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/);
+
+
+
+var risSimple = /^.[^:#\[\.,]*$/;
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, not ) {
+       if ( jQuery.isFunction( qualifier ) ) {
+               return jQuery.grep( elements, function( elem, i ) {
+                       /* jshint -W018 */
+                       return !!qualifier.call( elem, i, elem ) !== not;
+               });
+
+       }
+
+       if ( qualifier.nodeType ) {
+               return jQuery.grep( elements, function( elem ) {
+                       return ( elem === qualifier ) !== not;
+               });
+
+       }
+
+       if ( typeof qualifier === "string" ) {
+               if ( risSimple.test( qualifier ) ) {
+                       return jQuery.filter( qualifier, elements, not );
+               }
+
+               qualifier = jQuery.filter( qualifier, elements );
+       }
+
+       return jQuery.grep( elements, function( elem ) {
+               return ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not;
+       });
+}
+
+jQuery.filter = function( expr, elems, not ) {
+       var elem = elems[ 0 ];
+
+       if ( not ) {
+               expr = ":not(" + expr + ")";
+       }
+
+       return elems.length === 1 && elem.nodeType === 1 ?
+               jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
+               jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
+                       return elem.nodeType === 1;
+               }));
+};
+
+jQuery.fn.extend({
+       find: function( selector ) {
+               var i,
+                       ret = [],
+                       self = this,
+                       len = self.length;
+
+               if ( typeof selector !== "string" ) {
+                       return this.pushStack( jQuery( selector ).filter(function() {
+                               for ( i = 0; i < len; i++ ) {
+                                       if ( jQuery.contains( self[ i ], this ) ) {
+                                               return true;
+                                       }
+                               }
+                       }) );
+               }
+
+               for ( i = 0; i < len; i++ ) {
+                       jQuery.find( selector, self[ i ], ret );
+               }
+
+               // Needed because $( selector, context ) becomes $( context ).find( selector )
+               ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
+               ret.selector = this.selector ? this.selector + " " + selector : selector;
+               return ret;
+       },
+       filter: function( selector ) {
+               return this.pushStack( winnow(this, selector || [], false) );
+       },
+       not: function( selector ) {
+               return this.pushStack( winnow(this, selector || [], true) );
+       },
+       is: function( selector ) {
+               return !!winnow(
+                       this,
+
+                       // If this is a positional/relative selector, check membership in the returned set
+                       // so $("p:first").is("p:last") won't return true for a doc with two "p".
+                       typeof selector === "string" && rneedsContext.test( selector ) ?
+                               jQuery( selector ) :
+                               selector || [],
+                       false
+               ).length;
+       }
+});
+
+
+// Initialize a jQuery object
+
+
+// A central reference to the root jQuery(document)
+var rootjQuery,
+
+       // Use the correct document accordingly with window argument (sandbox)
+       document = window.document,
+
+       // A simple way to check for HTML strings
+       // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+       // Strict HTML recognition (#11290: must start with <)
+       rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
+
+       init = jQuery.fn.init = function( selector, context ) {
+               var match, elem;
+
+               // HANDLE: $(""), $(null), $(undefined), $(false)
+               if ( !selector ) {
+                       return this;
+               }
+
+               // Handle HTML strings
+               if ( typeof selector === "string" ) {
+                       if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
+                               // Assume that strings that start and end with <> are HTML and skip the regex check
+                               match = [ null, selector, null ];
+
+                       } else {
+                               match = rquickExpr.exec( selector );
+                       }
+
+                       // Match html or make sure no context is specified for #id
+                       if ( match && (match[1] || !context) ) {
+
+                               // HANDLE: $(html) -> $(array)
+                               if ( match[1] ) {
+                                       context = context instanceof jQuery ? context[0] : context;
+
+                                       // scripts is true for back-compat
+                                       // Intentionally let the error be thrown if parseHTML is not present
+                                       jQuery.merge( this, jQuery.parseHTML(
+                                               match[1],
+                                               context && context.nodeType ? context.ownerDocument || context : document,
+                                               true
+                                       ) );
+
+                                       // HANDLE: $(html, props)
+                                       if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
+                                               for ( match in context ) {
+                                                       // Properties of context are called as methods if possible
+                                                       if ( jQuery.isFunction( this[ match ] ) ) {
+                                                               this[ match ]( context[ match ] );
+
+                                                       // ...and otherwise set as attributes
+                                                       } else {
+                                                               this.attr( match, context[ match ] );
+                                                       }
+                                               }
+                                       }
+
+                                       return this;
+
+                               // HANDLE: $(#id)
+                               } else {
+                                       elem = document.getElementById( match[2] );
+
+                                       // Check parentNode to catch when Blackberry 4.6 returns
+                                       // nodes that are no longer in the document #6963
+                                       if ( elem && elem.parentNode ) {
+                                               // Handle the case where IE and Opera return items
+                                               // by name instead of ID
+                                               if ( elem.id !== match[2] ) {
+                                                       return rootjQuery.find( selector );
+                                               }
+
+                                               // Otherwise, we inject the element directly into the jQuery object
+                                               this.length = 1;
+                                               this[0] = elem;
+                                       }
+
+                                       this.context = document;
+                                       this.selector = selector;
+                                       return this;
+                               }
+
+                       // HANDLE: $(expr, $(...))
+                       } else if ( !context || context.jquery ) {
+                               return ( context || rootjQuery ).find( selector );
+
+                       // HANDLE: $(expr, context)
+                       // (which is just equivalent to: $(context).find(expr)
+                       } else {
+                               return this.constructor( context ).find( selector );
+                       }
+
+               // HANDLE: $(DOMElement)
+               } else if ( selector.nodeType ) {
+                       this.context = this[0] = selector;
+                       this.length = 1;
+                       return this;
+
+               // HANDLE: $(function)
+               // Shortcut for document ready
+               } else if ( jQuery.isFunction( selector ) ) {
+                       return typeof rootjQuery.ready !== "undefined" ?
+                               rootjQuery.ready( selector ) :
+                               // Execute immediately if ready is not present
+                               selector( jQuery );
+               }
+
+               if ( selector.selector !== undefined ) {
+                       this.selector = selector.selector;
+                       this.context = selector.context;
+               }
+
+               return jQuery.makeArray( selector, this );
+       };
+
+// Give the init function the jQuery prototype for later instantiation
+init.prototype = jQuery.fn;
+
+// Initialize central reference
+rootjQuery = jQuery( document );
+
+
+var rparentsprev = /^(?:parents|prev(?:Until|All))/,
+       // methods guaranteed to produce a unique set when starting from a unique set
+       guaranteedUnique = {
+               children: true,
+               contents: true,
+               next: true,
+               prev: true
+       };
+
+jQuery.extend({
+       dir: function( elem, dir, until ) {
+               var matched = [],
+                       cur = elem[ dir ];
+
+               while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
+                       if ( cur.nodeType === 1 ) {
+                               matched.push( cur );
+                       }
+                       cur = cur[dir];
+               }
+               return matched;
+       },
+
+       sibling: function( n, elem ) {
+               var r = [];
+
+               for ( ; n; n = n.nextSibling ) {
+                       if ( n.nodeType === 1 && n !== elem ) {
+                               r.push( n );
+                       }
+               }
+
+               return r;
+       }
+});
+
+jQuery.fn.extend({
+       has: function( target ) {
+               var i,
+                       targets = jQuery( target, this ),
+                       len = targets.length;
+
+               return this.filter(function() {
+                       for ( i = 0; i < len; i++ ) {
+                               if ( jQuery.contains( this, targets[i] ) ) {
+                                       return true;
+                               }
+                       }
+               });
+       },
+
+       closest: function( selectors, context ) {
+               var cur,
+                       i = 0,
+                       l = this.length,
+                       matched = [],
+                       pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
+                               jQuery( selectors, context || this.context ) :
+                               0;
+
+               for ( ; i < l; i++ ) {
+                       for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {
+                               // Always skip document fragments
+                               if ( cur.nodeType < 11 && (pos ?
+                                       pos.index(cur) > -1 :
+
+                                       // Don't pass non-elements to Sizzle
+                                       cur.nodeType === 1 &&
+                                               jQuery.find.matchesSelector(cur, selectors)) ) {
+
+                                       matched.push( cur );
+                                       break;
+                               }
+                       }
+               }
+
+               return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched );
+       },
+
+       // Determine the position of an element within
+       // the matched set of elements
+       index: function( elem ) {
+
+               // No argument, return index in parent
+               if ( !elem ) {
+                       return ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1;
+               }
+
+               // index in selector
+               if ( typeof elem === "string" ) {
+                       return jQuery.inArray( this[0], jQuery( elem ) );
+               }
+
+               // Locate the position of the desired element
+               return jQuery.inArray(
+                       // If it receives a jQuery object, the first element is used
+                       elem.jquery ? elem[0] : elem, this );
+       },
+
+       add: function( selector, context ) {
+               return this.pushStack(
+                       jQuery.unique(
+                               jQuery.merge( this.get(), jQuery( selector, context ) )
+                       )
+               );
+       },
+
+       addBack: function( selector ) {
+               return this.add( selector == null ?
+                       this.prevObject : this.prevObject.filter(selector)
+               );
+       }
+});
+
+function sibling( cur, dir ) {
+       do {
+               cur = cur[ dir ];
+       } while ( cur && cur.nodeType !== 1 );
+
+       return cur;
+}
+
+jQuery.each({
+       parent: function( elem ) {
+               var parent = elem.parentNode;
+               return parent && parent.nodeType !== 11 ? parent : null;
+       },
+       parents: function( elem ) {
+               return jQuery.dir( elem, "parentNode" );
+       },
+       parentsUntil: function( elem, i, until ) {
+               return jQuery.dir( elem, "parentNode", until );
+       },
+       next: function( elem ) {
+               return sibling( elem, "nextSibling" );
+       },
+       prev: function( elem ) {
+               return sibling( elem, "previousSibling" );
+       },
+       nextAll: function( elem ) {
+               return jQuery.dir( elem, "nextSibling" );
+       },
+       prevAll: function( elem ) {
+               return jQuery.dir( elem, "previousSibling" );
+       },
+       nextUntil: function( elem, i, until ) {
+               return jQuery.dir( elem, "nextSibling", until );
+       },
+       prevUntil: function( elem, i, until ) {
+               return jQuery.dir( elem, "previousSibling", until );
+       },
+       siblings: function( elem ) {
+               return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
+       },
+       children: function( elem ) {
+               return jQuery.sibling( elem.firstChild );
+       },
+       contents: function( elem ) {
+               return jQuery.nodeName( elem, "iframe" ) ?
+                       elem.contentDocument || elem.contentWindow.document :
+                       jQuery.merge( [], elem.childNodes );
+       }
+}, function( name, fn ) {
+       jQuery.fn[ name ] = function( until, selector ) {
+               var ret = jQuery.map( this, fn, until );
+
+               if ( name.slice( -5 ) !== "Until" ) {
+                       selector = until;
+               }
+
+               if ( selector && typeof selector === "string" ) {
+                       ret = jQuery.filter( selector, ret );
+               }
+
+               if ( this.length > 1 ) {
+                       // Remove duplicates
+                       if ( !guaranteedUnique[ name ] ) {
+                               ret = jQuery.unique( ret );
+                       }
+
+                       // Reverse order for parents* and prev-derivatives
+                       if ( rparentsprev.test( name ) ) {
+                               ret = ret.reverse();
+                       }
+               }
+
+               return this.pushStack( ret );
+       };
+});
+var rnotwhite = (/\S+/g);
+
+
+
+// String to Object options format cache
+var optionsCache = {};
+
+// Convert String-formatted options into Object-formatted ones and store in cache
+function createOptions( options ) {
+       var object = optionsCache[ options ] = {};
+       jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {
+               object[ flag ] = true;
+       });
+       return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ *     options: an optional list of space-separated options that will change how
+ *                     the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible options:
+ *
+ *     once:                   will ensure the callback list can only be fired once (like a Deferred)
+ *
+ *     memory:                 will keep track of previous values and will call any callback added
+ *                                     after the list has been fired right away with the latest "memorized"
+ *                                     values (like a Deferred)
+ *
+ *     unique:                 will ensure a callback can only be added once (no duplicate in the list)
+ *
+ *     stopOnFalse:    interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( options ) {
+
+       // Convert options from String-formatted to Object-formatted if needed
+       // (we check in cache first)
+       options = typeof options === "string" ?
+               ( optionsCache[ options ] || createOptions( options ) ) :
+               jQuery.extend( {}, options );
+
+       var // Flag to know if list is currently firing
+               firing,
+               // Last fire value (for non-forgettable lists)
+               memory,
+               // Flag to know if list was already fired
+               fired,
+               // End of the loop when firing
+               firingLength,
+               // Index of currently firing callback (modified by remove if needed)
+               firingIndex,
+               // First callback to fire (used internally by add and fireWith)
+               firingStart,
+               // Actual callback list
+               list = [],
+               // Stack of fire calls for repeatable lists
+               stack = !options.once && [],
+               // Fire callbacks
+               fire = function( data ) {
+                       memory = options.memory && data;
+                       fired = true;
+                       firingIndex = firingStart || 0;
+                       firingStart = 0;
+                       firingLength = list.length;
+                       firing = true;
+                       for ( ; list && firingIndex < firingLength; firingIndex++ ) {
+                               if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
+                                       memory = false; // To prevent further calls using add
+                                       break;
+                               }
+                       }
+                       firing = false;
+                       if ( list ) {
+                               if ( stack ) {
+                                       if ( stack.length ) {
+                                               fire( stack.shift() );
+                                       }
+                               } else if ( memory ) {
+                                       list = [];
+                               } else {
+                                       self.disable();
+                               }
+                       }
+               },
+               // Actual Callbacks object
+               self = {
+                       // Add a callback or a collection of callbacks to the list
+                       add: function() {
+                               if ( list ) {
+                                       // First, we save the current length
+                                       var start = list.length;
+                                       (function add( args ) {
+                                               jQuery.each( args, function( _, arg ) {
+                                                       var type = jQuery.type( arg );
+                                                       if ( type === "function" ) {
+                                                               if ( !options.unique || !self.has( arg ) ) {
+                                                                       list.push( arg );
+                                                               }
+                                                       } else if ( arg && arg.length && type !== "string" ) {
+                                                               // Inspect recursively
+                                                               add( arg );
+                                                       }
+                                               });
+                                       })( arguments );
+                                       // Do we need to add the callbacks to the
+                                       // current firing batch?
+                                       if ( firing ) {
+                                               firingLength = list.length;
+                                       // With memory, if we're not firing then
+                                       // we should call right away
+                                       } else if ( memory ) {
+                                               firingStart = start;
+                                               fire( memory );
+                                       }
+                               }
+                               return this;
+                       },
+                       // Remove a callback from the list
+                       remove: function() {
+                               if ( list ) {
+                                       jQuery.each( arguments, function( _, arg ) {
+                                               var index;
+                                               while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+                                                       list.splice( index, 1 );
+                                                       // Handle firing indexes
+                                                       if ( firing ) {
+                                                               if ( index <= firingLength ) {
+                                                                       firingLength--;
+                                                               }
+                                                               if ( index <= firingIndex ) {
+                                                                       firingIndex--;
+                                                               }
+                                                       }
+                                               }
+                                       });
+                               }
+                               return this;
+                       },
+                       // Check if a given callback is in the list.
+                       // If no argument is given, return whether or not list has callbacks attached.
+                       has: function( fn ) {
+                               return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );
+                       },
+                       // Remove all callbacks from the list
+                       empty: function() {
+                               list = [];
+                               firingLength = 0;
+                               return this;
+                       },
+                       // Have the list do nothing anymore
+                       disable: function() {
+                               list = stack = memory = undefined;
+                               return this;
+                       },
+                       // Is it disabled?
+                       disabled: function() {
+                               return !list;
+                       },
+                       // Lock the list in its current state
+                       lock: function() {
+                               stack = undefined;
+                               if ( !memory ) {
+                                       self.disable();
+                               }
+                               return this;
+                       },
+                       // Is it locked?
+                       locked: function() {
+                               return !stack;
+                       },
                        // Call all callbacks with the given context and arguments
                        fireWith: function( context, args ) {
-                               args = args || [];
-                               args = [ context, args.slice ? args.slice() : args ];
                                if ( list && ( !fired || stack ) ) {
+                                       args = args || [];
+                                       args = [ context, args.slice ? args.slice() : args ];
                                        if ( firing ) {
                                                stack.push( args );
                                        } else {
-                                               fire( args );
+                                               fire( args );
+                                       }
+                               }
+                               return this;
+                       },
+                       // Call all the callbacks with the given arguments
+                       fire: function() {
+                               self.fireWith( this, arguments );
+                               return this;
+                       },
+                       // To know if the callbacks have already been called at least once
+                       fired: function() {
+                               return !!fired;
+                       }
+               };
+
+       return self;
+};
+
+
+jQuery.extend({
+
+       Deferred: function( func ) {
+               var tuples = [
+                               // action, add listener, listener list, final state
+                               [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
+                               [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
+                               [ "notify", "progress", jQuery.Callbacks("memory") ]
+                       ],
+                       state = "pending",
+                       promise = {
+                               state: function() {
+                                       return state;
+                               },
+                               always: function() {
+                                       deferred.done( arguments ).fail( arguments );
+                                       return this;
+                               },
+                               then: function( /* fnDone, fnFail, fnProgress */ ) {
+                                       var fns = arguments;
+                                       return jQuery.Deferred(function( newDefer ) {
+                                               jQuery.each( tuples, function( i, tuple ) {
+                                                       var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
+                                                       // deferred[ done | fail | progress ] for forwarding actions to newDefer
+                                                       deferred[ tuple[1] ](function() {
+                                                               var returned = fn && fn.apply( this, arguments );
+                                                               if ( returned && jQuery.isFunction( returned.promise ) ) {
+                                                                       returned.promise()
+                                                                               .done( newDefer.resolve )
+                                                                               .fail( newDefer.reject )
+                                                                               .progress( newDefer.notify );
+                                                               } else {
+                                                                       newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
+                                                               }
+                                                       });
+                                               });
+                                               fns = null;
+                                       }).promise();
+                               },
+                               // Get a promise for this deferred
+                               // If obj is provided, the promise aspect is added to the object
+                               promise: function( obj ) {
+                                       return obj != null ? jQuery.extend( obj, promise ) : promise;
+                               }
+                       },
+                       deferred = {};
+
+               // Keep pipe for back-compat
+               promise.pipe = promise.then;
+
+               // Add list-specific methods
+               jQuery.each( tuples, function( i, tuple ) {
+                       var list = tuple[ 2 ],
+                               stateString = tuple[ 3 ];
+
+                       // promise[ done | fail | progress ] = list.add
+                       promise[ tuple[1] ] = list.add;
+
+                       // Handle state
+                       if ( stateString ) {
+                               list.add(function() {
+                                       // state = [ resolved | rejected ]
+                                       state = stateString;
+
+                               // [ reject_list | resolve_list ].disable; progress_list.lock
+                               }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
+                       }
+
+                       // deferred[ resolve | reject | notify ]
+                       deferred[ tuple[0] ] = function() {
+                               deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments );
+                               return this;
+                       };
+                       deferred[ tuple[0] + "With" ] = list.fireWith;
+               });
+
+               // Make the deferred a promise
+               promise.promise( deferred );
+
+               // Call given func if any
+               if ( func ) {
+                       func.call( deferred, deferred );
+               }
+
+               // All done!
+               return deferred;
+       },
+
+       // Deferred helper
+       when: function( subordinate /* , ..., subordinateN */ ) {
+               var i = 0,
+                       resolveValues = slice.call( arguments ),
+                       length = resolveValues.length,
+
+                       // the count of uncompleted subordinates
+                       remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
+
+                       // the master Deferred. If resolveValues consist of only a single Deferred, just use that.
+                       deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
+
+                       // Update function for both resolve and progress values
+                       updateFunc = function( i, contexts, values ) {
+                               return function( value ) {
+                                       contexts[ i ] = this;
+                                       values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
+                                       if ( values === progressValues ) {
+                                               deferred.notifyWith( contexts, values );
+
+                                       } else if ( !(--remaining) ) {
+                                               deferred.resolveWith( contexts, values );
+                                       }
+                               };
+                       },
+
+                       progressValues, progressContexts, resolveContexts;
+
+               // add listeners to Deferred subordinates; treat others as resolved
+               if ( length > 1 ) {
+                       progressValues = new Array( length );
+                       progressContexts = new Array( length );
+                       resolveContexts = new Array( length );
+                       for ( ; i < length; i++ ) {
+                               if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
+                                       resolveValues[ i ].promise()
+                                               .done( updateFunc( i, resolveContexts, resolveValues ) )
+                                               .fail( deferred.reject )
+                                               .progress( updateFunc( i, progressContexts, progressValues ) );
+                               } else {
+                                       --remaining;
+                               }
+                       }
+               }
+
+               // if we're not waiting on anything, resolve the master
+               if ( !remaining ) {
+                       deferred.resolveWith( resolveContexts, resolveValues );
+               }
+
+               return deferred.promise();
+       }
+});
+
+
+// The deferred used on DOM ready
+var readyList;
+
+jQuery.fn.ready = function( fn ) {
+       // Add the callback
+       jQuery.ready.promise().done( fn );
+
+       return this;
+};
+
+jQuery.extend({
+       // Is the DOM ready to be used? Set to true once it occurs.
+       isReady: false,
+
+       // A counter to track how many items to wait for before
+       // the ready event fires. See #6781
+       readyWait: 1,
+
+       // Hold (or release) the ready event
+       holdReady: function( hold ) {
+               if ( hold ) {
+                       jQuery.readyWait++;
+               } else {
+                       jQuery.ready( true );
+               }
+       },
+
+       // Handle when the DOM is ready
+       ready: function( wait ) {
+
+               // Abort if there are pending holds or we're already ready
+               if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+                       return;
+               }
+
+               // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+               if ( !document.body ) {
+                       return setTimeout( jQuery.ready );
+               }
+
+               // Remember that the DOM is ready
+               jQuery.isReady = true;
+
+               // If a normal DOM Ready event fired, decrement, and wait if need be
+               if ( wait !== true && --jQuery.readyWait > 0 ) {
+                       return;
+               }
+
+               // If there are functions bound, to execute
+               readyList.resolveWith( document, [ jQuery ] );
+
+               // Trigger any bound ready events
+               if ( jQuery.fn.triggerHandler ) {
+                       jQuery( document ).triggerHandler( "ready" );
+                       jQuery( document ).off( "ready" );
+               }
+       }
+});
+
+/**
+ * Clean-up method for dom ready events
+ */
+function detach() {
+       if ( document.addEventListener ) {
+               document.removeEventListener( "DOMContentLoaded", completed, false );
+               window.removeEventListener( "load", completed, false );
+
+       } else {
+               document.detachEvent( "onreadystatechange", completed );
+               window.detachEvent( "onload", completed );
+       }
+}
+
+/**
+ * The ready event handler and self cleanup method
+ */
+function completed() {
+       // readyState === "complete" is good enough for us to call the dom ready in oldIE
+       if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) {
+               detach();
+               jQuery.ready();
+       }
+}
+
+jQuery.ready.promise = function( obj ) {
+       if ( !readyList ) {
+
+               readyList = jQuery.Deferred();
+
+               // Catch cases where $(document).ready() is called after the browser event has already occurred.
+               // we once tried to use readyState "interactive" here, but it caused issues like the one
+               // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
+               if ( document.readyState === "complete" ) {
+                       // Handle it asynchronously to allow scripts the opportunity to delay ready
+                       setTimeout( jQuery.ready );
+
+               // Standards-based browsers support DOMContentLoaded
+               } else if ( document.addEventListener ) {
+                       // Use the handy event callback
+                       document.addEventListener( "DOMContentLoaded", completed, false );
+
+                       // A fallback to window.onload, that will always work
+                       window.addEventListener( "load", completed, false );
+
+               // If IE event model is used
+               } else {
+                       // Ensure firing before onload, maybe late but safe also for iframes
+                       document.attachEvent( "onreadystatechange", completed );
+
+                       // A fallback to window.onload, that will always work
+                       window.attachEvent( "onload", completed );
+
+                       // If IE and not a frame
+                       // continually check to see if the document is ready
+                       var top = false;
+
+                       try {
+                               top = window.frameElement == null && document.documentElement;
+                       } catch(e) {}
+
+                       if ( top && top.doScroll ) {
+                               (function doScrollCheck() {
+                                       if ( !jQuery.isReady ) {
+
+                                               try {
+                                                       // Use the trick by Diego Perini
+                                                       // http://javascript.nwbox.com/IEContentLoaded/
+                                                       top.doScroll("left");
+                                               } catch(e) {
+                                                       return setTimeout( doScrollCheck, 50 );
+                                               }
+
+                                               // detach all dom ready events
+                                               detach();
+
+                                               // and execute any waiting functions
+                                               jQuery.ready();
+                                       }
+                               })();
+                       }
+               }
+       }
+       return readyList.promise( obj );
+};
+
+
+var strundefined = typeof undefined;
+
+
+
+// Support: IE<9
+// Iteration over object's inherited properties before its own
+var i;
+for ( i in jQuery( support ) ) {
+       break;
+}
+support.ownLast = i !== "0";
+
+// Note: most support tests are defined in their respective modules.
+// false until the test is run
+support.inlineBlockNeedsLayout = false;
+
+// Execute ASAP in case we need to set body.style.zoom
+jQuery(function() {
+       // Minified: var a,b,c,d
+       var val, div, body, container;
+
+       body = document.getElementsByTagName( "body" )[ 0 ];
+       if ( !body || !body.style ) {
+               // Return for frameset docs that don't have a body
+               return;
+       }
+
+       // Setup
+       div = document.createElement( "div" );
+       container = document.createElement( "div" );
+       container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px";
+       body.appendChild( container ).appendChild( div );
+
+       if ( typeof div.style.zoom !== strundefined ) {
+               // Support: IE<8
+               // Check if natively block-level elements act like inline-block
+               // elements when setting their display to 'inline' and giving
+               // them layout
+               div.style.cssText = "display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1";
+
+               support.inlineBlockNeedsLayout = val = div.offsetWidth === 3;
+               if ( val ) {
+                       // Prevent IE 6 from affecting layout for positioned elements #11048
+                       // Prevent IE from shrinking the body in IE 7 mode #12869
+                       // Support: IE<8
+                       body.style.zoom = 1;
+               }
+       }
+
+       body.removeChild( container );
+});
+
+
+
+
+(function() {
+       var div = document.createElement( "div" );
+
+       // Execute the test only if not already executed in another module.
+       if (support.deleteExpando == null) {
+               // Support: IE<9
+               support.deleteExpando = true;
+               try {
+                       delete div.test;
+               } catch( e ) {
+                       support.deleteExpando = false;
+               }
+       }
+
+       // Null elements to avoid leaks in IE.
+       div = null;
+})();
+
+
+/**
+ * Determines whether an object can have data
+ */
+jQuery.acceptData = function( elem ) {
+       var noData = jQuery.noData[ (elem.nodeName + " ").toLowerCase() ],
+               nodeType = +elem.nodeType || 1;
+
+       // Do not set data on non-element DOM nodes because it will not be cleared (#8335).
+       return nodeType !== 1 && nodeType !== 9 ?
+               false :
+
+               // Nodes accept data unless otherwise specified; rejection can be conditional
+               !noData || noData !== true && elem.getAttribute("classid") === noData;
+};
+
+
+var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
+       rmultiDash = /([A-Z])/g;
+
+function dataAttr( elem, key, data ) {
+       // If nothing was found internally, try to fetch any
+       // data from the HTML5 data-* attribute
+       if ( data === undefined && elem.nodeType === 1 ) {
+
+               var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
+
+               data = elem.getAttribute( name );
+
+               if ( typeof data === "string" ) {
+                       try {
+                               data = data === "true" ? true :
+                                       data === "false" ? false :
+                                       data === "null" ? null :
+                                       // Only convert to a number if it doesn't change the string
+                                       +data + "" === data ? +data :
+                                       rbrace.test( data ) ? jQuery.parseJSON( data ) :
+                                       data;
+                       } catch( e ) {}
+
+                       // Make sure we set the data so it isn't changed later
+                       jQuery.data( elem, key, data );
+
+               } else {
+                       data = undefined;
+               }
+       }
+
+       return data;
+}
+
+// checks a cache object for emptiness
+function isEmptyDataObject( obj ) {
+       var name;
+       for ( name in obj ) {
+
+               // if the public data object is empty, the private is still empty
+               if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
+                       continue;
+               }
+               if ( name !== "toJSON" ) {
+                       return false;
+               }
+       }
+
+       return true;
+}
+
+function internalData( elem, name, data, pvt /* Internal Use Only */ ) {
+       if ( !jQuery.acceptData( elem ) ) {
+               return;
+       }
+
+       var ret, thisCache,
+               internalKey = jQuery.expando,
+
+               // We have to handle DOM nodes and JS objects differently because IE6-7
+               // can't GC object references properly across the DOM-JS boundary
+               isNode = elem.nodeType,
+
+               // Only DOM nodes need the global jQuery cache; JS object data is
+               // attached directly to the object so GC can occur automatically
+               cache = isNode ? jQuery.cache : elem,
+
+               // Only defining an ID for JS objects if its cache already exists allows
+               // the code to shortcut on the same path as a DOM node with no cache
+               id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
+
+       // Avoid doing any more work than we need to when trying to get data on an
+       // object that has no data at all
+       if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === "string" ) {
+               return;
+       }
+
+       if ( !id ) {
+               // Only DOM nodes need a new unique ID for each element since their data
+               // ends up in the global cache
+               if ( isNode ) {
+                       id = elem[ internalKey ] = deletedIds.pop() || jQuery.guid++;
+               } else {
+                       id = internalKey;
+               }
+       }
+
+       if ( !cache[ id ] ) {
+               // Avoid exposing jQuery metadata on plain JS objects when the object
+               // is serialized using JSON.stringify
+               cache[ id ] = isNode ? {} : { toJSON: jQuery.noop };
+       }
+
+       // An object can be passed to jQuery.data instead of a key/value pair; this gets
+       // shallow copied over onto the existing cache
+       if ( typeof name === "object" || typeof name === "function" ) {
+               if ( pvt ) {
+                       cache[ id ] = jQuery.extend( cache[ id ], name );
+               } else {
+                       cache[ id ].data = jQuery.extend( cache[ id ].data, name );
+               }
+       }
+
+       thisCache = cache[ id ];
+
+       // jQuery data() is stored in a separate object inside the object's internal data
+       // cache in order to avoid key collisions between internal data and user-defined
+       // data.
+       if ( !pvt ) {
+               if ( !thisCache.data ) {
+                       thisCache.data = {};
+               }
+
+               thisCache = thisCache.data;
+       }
+
+       if ( data !== undefined ) {
+               thisCache[ jQuery.camelCase( name ) ] = data;
+       }
+
+       // Check for both converted-to-camel and non-converted data property names
+       // If a data property was specified
+       if ( typeof name === "string" ) {
+
+               // First Try to find as-is property data
+               ret = thisCache[ name ];
+
+               // Test for null|undefined property data
+               if ( ret == null ) {
+
+                       // Try to find the camelCased property
+                       ret = thisCache[ jQuery.camelCase( name ) ];
+               }
+       } else {
+               ret = thisCache;
+       }
+
+       return ret;
+}
+
+function internalRemoveData( elem, name, pvt ) {
+       if ( !jQuery.acceptData( elem ) ) {
+               return;
+       }
+
+       var thisCache, i,
+               isNode = elem.nodeType,
+
+               // See jQuery.data for more information
+               cache = isNode ? jQuery.cache : elem,
+               id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
+
+       // If there is already no cache entry for this object, there is no
+       // purpose in continuing
+       if ( !cache[ id ] ) {
+               return;
+       }
+
+       if ( name ) {
+
+               thisCache = pvt ? cache[ id ] : cache[ id ].data;
+
+               if ( thisCache ) {
+
+                       // Support array or space separated string names for data keys
+                       if ( !jQuery.isArray( name ) ) {
+
+                               // try the string as a key before any manipulation
+                               if ( name in thisCache ) {
+                                       name = [ name ];
+                               } else {
+
+                                       // split the camel cased version by spaces unless a key with the spaces exists
+                                       name = jQuery.camelCase( name );
+                                       if ( name in thisCache ) {
+                                               name = [ name ];
+                                       } else {
+                                               name = name.split(" ");
                                        }
                                }
-                               return this;
-                       },
-                       // Call all the callbacks with the given arguments
-                       fire: function() {
-                               self.fireWith( this, arguments );
-                               return this;
-                       },
-                       // To know if the callbacks have already been called at least once
-                       fired: function() {
-                               return !!fired;
+                       } else {
+                               // If "name" is an array of keys...
+                               // When data is initially created, via ("key", "val") signature,
+                               // keys will be converted to camelCase.
+                               // Since there is no way to tell _how_ a key was added, remove
+                               // both plain key and camelCase key. #12786
+                               // This will only penalize the array argument path.
+                               name = name.concat( jQuery.map( name, jQuery.camelCase ) );
                        }
-               };
 
-       return self;
-};
-jQuery.extend({
+                       i = name.length;
+                       while ( i-- ) {
+                               delete thisCache[ name[i] ];
+                       }
 
-       Deferred: function( func ) {
-               var tuples = [
-                               // action, add listener, listener list, final state
-                               [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
-                               [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
-                               [ "notify", "progress", jQuery.Callbacks("memory") ]
-                       ],
-                       state = "pending",
-                       promise = {
-                               state: function() {
-                                       return state;
-                               },
-                               always: function() {
-                                       deferred.done( arguments ).fail( arguments );
-                                       return this;
-                               },
-                               then: function( /* fnDone, fnFail, fnProgress */ ) {
-                                       var fns = arguments;
-                                       return jQuery.Deferred(function( newDefer ) {
-                                               jQuery.each( tuples, function( i, tuple ) {
-                                                       var action = tuple[ 0 ],
-                                                               fn = fns[ i ];
-                                                       // deferred[ done | fail | progress ] for forwarding actions to newDefer
-                                                       deferred[ tuple[1] ]( jQuery.isFunction( fn ) ?
-                                                               function() {
-                                                                       var returned = fn.apply( this, arguments );
-                                                                       if ( returned && jQuery.isFunction( returned.promise ) ) {
-                                                                               returned.promise()
-                                                                                       .done( newDefer.resolve )
-                                                                                       .fail( newDefer.reject )
-                                                                                       .progress( newDefer.notify );
-                                                                       } else {
-                                                                               newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
-                                                                       }
-                                                               } :
-                                                               newDefer[ action ]
-                                                       );
-                                               });
-                                               fns = null;
-                                       }).promise();
-                               },
-                               // Get a promise for this deferred
-                               // If obj is provided, the promise aspect is added to the object
-                               promise: function( obj ) {
-                                       return obj != null ? jQuery.extend( obj, promise ) : promise;
-                               }
-                       },
-                       deferred = {};
+                       // If there is no data left in the cache, we want to continue
+                       // and let the cache object itself get destroyed
+                       if ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) {
+                               return;
+                       }
+               }
+       }
 
-               // Keep pipe for back-compat
-               promise.pipe = promise.then;
+       // See jQuery.data for more information
+       if ( !pvt ) {
+               delete cache[ id ].data;
 
-               // Add list-specific methods
-               jQuery.each( tuples, function( i, tuple ) {
-                       var list = tuple[ 2 ],
-                               stateString = tuple[ 3 ];
+               // Don't destroy the parent cache unless the internal data object
+               // had been the only thing left in it
+               if ( !isEmptyDataObject( cache[ id ] ) ) {
+                       return;
+               }
+       }
 
-                       // promise[ done | fail | progress ] = list.add
-                       promise[ tuple[1] ] = list.add;
+       // Destroy the cache
+       if ( isNode ) {
+               jQuery.cleanData( [ elem ], true );
 
-                       // Handle state
-                       if ( stateString ) {
-                               list.add(function() {
-                                       // state = [ resolved | rejected ]
-                                       state = stateString;
+       // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
+       /* jshint eqeqeq: false */
+       } else if ( support.deleteExpando || cache != cache.window ) {
+               /* jshint eqeqeq: true */
+               delete cache[ id ];
 
-                               // [ reject_list | resolve_list ].disable; progress_list.lock
-                               }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
-                       }
+       // When all else fails, null
+       } else {
+               cache[ id ] = null;
+       }
+}
 
-                       // deferred[ resolve | reject | notify ] = list.fire
-                       deferred[ tuple[0] ] = list.fire;
-                       deferred[ tuple[0] + "With" ] = list.fireWith;
-               });
+jQuery.extend({
+       cache: {},
 
-               // Make the deferred a promise
-               promise.promise( deferred );
+       // The following elements (space-suffixed to avoid Object.prototype collisions)
+       // throw uncatchable exceptions if you attempt to set expando properties
+       noData: {
+               "applet ": true,
+               "embed ": true,
+               // ...but Flash objects (which have this classid) *can* handle expandos
+               "object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
+       },
 
-               // Call given func if any
-               if ( func ) {
-                       func.call( deferred, deferred );
-               }
+       hasData: function( elem ) {
+               elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
+               return !!elem && !isEmptyDataObject( elem );
+       },
 
-               // All done!
-               return deferred;
+       data: function( elem, name, data ) {
+               return internalData( elem, name, data );
        },
 
-       // Deferred helper
-       when: function( subordinate /* , ..., subordinateN */ ) {
-               var i = 0,
-                       resolveValues = core_slice.call( arguments ),
-                       length = resolveValues.length,
+       removeData: function( elem, name ) {
+               return internalRemoveData( elem, name );
+       },
 
-                       // the count of uncompleted subordinates
-                       remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
+       // For internal use only.
+       _data: function( elem, name, data ) {
+               return internalData( elem, name, data, true );
+       },
 
-                       // the master Deferred. If resolveValues consist of only a single Deferred, just use that.
-                       deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
+       _removeData: function( elem, name ) {
+               return internalRemoveData( elem, name, true );
+       }
+});
 
-                       // Update function for both resolve and progress values
-                       updateFunc = function( i, contexts, values ) {
-                               return function( value ) {
-                                       contexts[ i ] = this;
-                                       values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;
-                                       if( values === progressValues ) {
-                                               deferred.notifyWith( contexts, values );
-                                       } else if ( !( --remaining ) ) {
-                                               deferred.resolveWith( contexts, values );
-                                       }
-                               };
-                       },
+jQuery.fn.extend({
+       data: function( key, value ) {
+               var i, name, data,
+                       elem = this[0],
+                       attrs = elem && elem.attributes;
 
-                       progressValues, progressContexts, resolveContexts;
+               // Special expections of .data basically thwart jQuery.access,
+               // so implement the relevant behavior ourselves
 
-               // add listeners to Deferred subordinates; treat others as resolved
-               if ( length > 1 ) {
-                       progressValues = new Array( length );
-                       progressContexts = new Array( length );
-                       resolveContexts = new Array( length );
-                       for ( ; i < length; i++ ) {
-                               if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
-                                       resolveValues[ i ].promise()
-                                               .done( updateFunc( i, resolveContexts, resolveValues ) )
-                                               .fail( deferred.reject )
-                                               .progress( updateFunc( i, progressContexts, progressValues ) );
-                               } else {
-                                       --remaining;
+               // Gets all values
+               if ( key === undefined ) {
+                       if ( this.length ) {
+                               data = jQuery.data( elem );
+
+                               if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
+                                       i = attrs.length;
+                                       while ( i-- ) {
+
+                                               // Support: IE11+
+                                               // The attrs elements can be null (#14894)
+                                               if ( attrs[ i ] ) {
+                                                       name = attrs[ i ].name;
+                                                       if ( name.indexOf( "data-" ) === 0 ) {
+                                                               name = jQuery.camelCase( name.slice(5) );
+                                                               dataAttr( elem, name, data[ name ] );
+                                                       }
+                                               }
+                                       }
+                                       jQuery._data( elem, "parsedAttrs", true );
                                }
                        }
+
+                       return data;
                }
 
-               // if we're not waiting on anything, resolve the master
-               if ( !remaining ) {
-                       deferred.resolveWith( resolveContexts, resolveValues );
+               // Sets multiple values
+               if ( typeof key === "object" ) {
+                       return this.each(function() {
+                               jQuery.data( this, key );
+                       });
                }
 
-               return deferred.promise();
+               return arguments.length > 1 ?
+
+                       // Sets one value
+                       this.each(function() {
+                               jQuery.data( this, key, value );
+                       }) :
+
+                       // Gets one value
+                       // Try to fetch any internally stored data first
+                       elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : undefined;
+       },
+
+       removeData: function( key ) {
+               return this.each(function() {
+                       jQuery.removeData( this, key );
+               });
        }
 });
-jQuery.support = (function() {
-
-       var support,
-               all,
-               a,
-               select,
-               opt,
-               input,
-               fragment,
-               eventName,
-               i,
-               isSupported,
-               clickFn,
-               div = document.createElement("div");
 
-       // Setup
-       div.setAttribute( "className", "t" );
-       div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
 
-       // Support tests won't run in some limited or non-browser environments
-       all = div.getElementsByTagName("*");
-       a = div.getElementsByTagName("a")[ 0 ];
-       if ( !all || !a || !all.length ) {
-               return {};
-       }
+jQuery.extend({
+       queue: function( elem, type, data ) {
+               var queue;
 
-       // First batch of tests
-       select = document.createElement("select");
-       opt = select.appendChild( document.createElement("option") );
-       input = div.getElementsByTagName("input")[ 0 ];
+               if ( elem ) {
+                       type = ( type || "fx" ) + "queue";
+                       queue = jQuery._data( elem, type );
 
-       a.style.cssText = "top:1px;float:left;opacity:.5";
-       support = {
-               // IE strips leading whitespace when .innerHTML is used
-               leadingWhitespace: ( div.firstChild.nodeType === 3 ),
-
-               // Make sure that tbody elements aren't automatically inserted
-               // IE will insert them into empty tables
-               tbody: !div.getElementsByTagName("tbody").length,
-
-               // Make sure that link elements get serialized correctly by innerHTML
-               // This requires a wrapper element in IE
-               htmlSerialize: !!div.getElementsByTagName("link").length,
-
-               // Get the style information from getAttribute
-               // (IE uses .cssText instead)
-               style: /top/.test( a.getAttribute("style") ),
-
-               // Make sure that URLs aren't manipulated
-               // (IE normalizes it by default)
-               hrefNormalized: ( a.getAttribute("href") === "/a" ),
-
-               // Make sure that element opacity exists
-               // (IE uses filter instead)
-               // Use a regex to work around a WebKit issue. See #5145
-               opacity: /^0.5/.test( a.style.opacity ),
-
-               // Verify style float existence
-               // (IE uses styleFloat instead of cssFloat)
-               cssFloat: !!a.style.cssFloat,
-
-               // Make sure that if no value is specified for a checkbox
-               // that it defaults to "on".
-               // (WebKit defaults to "" instead)
-               checkOn: ( input.value === "on" ),
-
-               // Make sure that a selected-by-default option has a working selected property.
-               // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
-               optSelected: opt.selected,
-
-               // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
-               getSetAttribute: div.className !== "t",
-
-               // Tests for enctype support on a form (#6743)
-               enctype: !!document.createElement("form").enctype,
-
-               // Makes sure cloning an html5 element does not cause problems
-               // Where outerHTML is undefined, this still works
-               html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
-
-               // jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks Mode
-               boxModel: ( document.compatMode === "CSS1Compat" ),
-
-               // Will be defined later
-               submitBubbles: true,
-               changeBubbles: true,
-               focusinBubbles: false,
-               deleteExpando: true,
-               noCloneEvent: true,
-               inlineBlockNeedsLayout: false,
-               shrinkWrapBlocks: false,
-               reliableMarginRight: true,
-               boxSizingReliable: true,
-               pixelPosition: false
-       };
+                       // Speed up dequeue by getting out quickly if this is just a lookup
+                       if ( data ) {
+                               if ( !queue || jQuery.isArray(data) ) {
+                                       queue = jQuery._data( elem, type, jQuery.makeArray(data) );
+                               } else {
+                                       queue.push( data );
+                               }
+                       }
+                       return queue || [];
+               }
+       },
 
-       // Make sure checked status is properly cloned
-       input.checked = true;
-       support.noCloneChecked = input.cloneNode( true ).checked;
+       dequeue: function( elem, type ) {
+               type = type || "fx";
 
-       // Make sure that the options inside disabled selects aren't marked as disabled
-       // (WebKit marks them as disabled)
-       select.disabled = true;
-       support.optDisabled = !opt.disabled;
+               var queue = jQuery.queue( elem, type ),
+                       startLength = queue.length,
+                       fn = queue.shift(),
+                       hooks = jQuery._queueHooks( elem, type ),
+                       next = function() {
+                               jQuery.dequeue( elem, type );
+                       };
 
-       // Test to see if it's possible to delete an expando from an element
-       // Fails in Internet Explorer
-       try {
-               delete div.test;
-       } catch( e ) {
-               support.deleteExpando = false;
-       }
+               // If the fx queue is dequeued, always remove the progress sentinel
+               if ( fn === "inprogress" ) {
+                       fn = queue.shift();
+                       startLength--;
+               }
 
-       if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
-               div.attachEvent( "onclick", clickFn = function() {
-                       // Cloning a node shouldn't copy over any
-                       // bound event handlers (IE does this)
-                       support.noCloneEvent = false;
+               if ( fn ) {
+
+                       // Add a progress sentinel to prevent the fx queue from being
+                       // automatically dequeued
+                       if ( type === "fx" ) {
+                               queue.unshift( "inprogress" );
+                       }
+
+                       // clear up the last queue stop function
+                       delete hooks.stop;
+                       fn.call( elem, next, hooks );
+               }
+
+               if ( !startLength && hooks ) {
+                       hooks.empty.fire();
+               }
+       },
+
+       // not intended for public consumption - generates a queueHooks object, or returns the current one
+       _queueHooks: function( elem, type ) {
+               var key = type + "queueHooks";
+               return jQuery._data( elem, key ) || jQuery._data( elem, key, {
+                       empty: jQuery.Callbacks("once memory").add(function() {
+                               jQuery._removeData( elem, type + "queue" );
+                               jQuery._removeData( elem, key );
+                       })
                });
-               div.cloneNode( true ).fireEvent("onclick");
-               div.detachEvent( "onclick", clickFn );
        }
+});
 
-       // Check if a radio maintains its value
-       // after being appended to the DOM
-       input = document.createElement("input");
-       input.value = "t";
-       input.setAttribute( "type", "radio" );
-       support.radioValue = input.value === "t";
+jQuery.fn.extend({
+       queue: function( type, data ) {
+               var setter = 2;
 
-       input.setAttribute( "checked", "checked" );
+               if ( typeof type !== "string" ) {
+                       data = type;
+                       type = "fx";
+                       setter--;
+               }
 
-       // #11217 - WebKit loses check when the name is after the checked attribute
-       input.setAttribute( "name", "t" );
+               if ( arguments.length < setter ) {
+                       return jQuery.queue( this[0], type );
+               }
 
-       div.appendChild( input );
-       fragment = document.createDocumentFragment();
-       fragment.appendChild( div.lastChild );
+               return data === undefined ?
+                       this :
+                       this.each(function() {
+                               var queue = jQuery.queue( this, type, data );
 
-       // WebKit doesn't clone checked state correctly in fragments
-       support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
+                               // ensure a hooks for this queue
+                               jQuery._queueHooks( this, type );
 
-       // Check if a disconnected checkbox will retain its checked
-       // value of true after appended to the DOM (IE6/7)
-       support.appendChecked = input.checked;
+                               if ( type === "fx" && queue[0] !== "inprogress" ) {
+                                       jQuery.dequeue( this, type );
+                               }
+                       });
+       },
+       dequeue: function( type ) {
+               return this.each(function() {
+                       jQuery.dequeue( this, type );
+               });
+       },
+       clearQueue: function( type ) {
+               return this.queue( type || "fx", [] );
+       },
+       // Get a promise resolved when queues of a certain type
+       // are emptied (fx is the type by default)
+       promise: function( type, obj ) {
+               var tmp,
+                       count = 1,
+                       defer = jQuery.Deferred(),
+                       elements = this,
+                       i = this.length,
+                       resolve = function() {
+                               if ( !( --count ) ) {
+                                       defer.resolveWith( elements, [ elements ] );
+                               }
+                       };
 
-       fragment.removeChild( input );
-       fragment.appendChild( div );
+               if ( typeof type !== "string" ) {
+                       obj = type;
+                       type = undefined;
+               }
+               type = type || "fx";
 
-       // Technique from Juriy Zaytsev
-       // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
-       // We only care about the case where non-standard event systems
-       // are used, namely in IE. Short-circuiting here helps us to
-       // avoid an eval call (in setAttribute) which can cause CSP
-       // to go haywire. See: https://developer.mozilla.org/en/Security/CSP
-       if ( div.attachEvent ) {
-               for ( i in {
-                       submit: true,
-                       change: true,
-                       focusin: true
-               }) {
-                       eventName = "on" + i;
-                       isSupported = ( eventName in div );
-                       if ( !isSupported ) {
-                               div.setAttribute( eventName, "return;" );
-                               isSupported = ( typeof div[ eventName ] === "function" );
+               while ( i-- ) {
+                       tmp = jQuery._data( elements[ i ], type + "queueHooks" );
+                       if ( tmp && tmp.empty ) {
+                               count++;
+                               tmp.empty.add( resolve );
                        }
-                       support[ i + "Bubbles" ] = isSupported;
                }
+               resolve();
+               return defer.promise( obj );
        }
+});
+var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source;
 
-       // Run tests that need a body at doc ready
-       jQuery(function() {
-               var container, div, tds, marginDiv,
-                       divReset = "padding:0;margin:0;border:0;display:block;overflow:hidden;",
-                       body = document.getElementsByTagName("body")[0];
-
-               if ( !body ) {
-                       // Return for frameset docs that don't have a body
-                       return;
-               }
-
-               container = document.createElement("div");
-               container.style.cssText = "visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px";
-               body.insertBefore( container, body.firstChild );
+var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
 
-               // Construct the test element
-               div = document.createElement("div");
-               container.appendChild( div );
+var isHidden = function( elem, el ) {
+               // isHidden might be called from jQuery#filter function;
+               // in that case, element will be second argument
+               elem = el || elem;
+               return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
+       };
 
-               // Check if table cells still have offsetWidth/Height when they are set
-               // to display:none and there are still other visible table cells in a
-               // table row; if so, offsetWidth/Height are not reliable for use when
-               // determining if an element has been hidden directly using
-               // display:none (it is still safe to use offsets if a parent element is
-               // hidden; don safety goggles and see bug #4512 for more information).
-               // (only IE 8 fails this test)
-               div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
-               tds = div.getElementsByTagName("td");
-               tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none";
-               isSupported = ( tds[ 0 ].offsetHeight === 0 );
 
-               tds[ 0 ].style.display = "";
-               tds[ 1 ].style.display = "none";
 
-               // Check if empty table cells still have offsetWidth/Height
-               // (IE <= 8 fail this test)
-               support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
+// Multifunctional method to get and set values of a collection
+// The value/s can optionally be executed if it's a function
+var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
+       var i = 0,
+               length = elems.length,
+               bulk = key == null;
 
-               // Check box-sizing and margin behavior
-               div.innerHTML = "";
-               div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;";
-               support.boxSizing = ( div.offsetWidth === 4 );
-               support.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== 1 );
+       // Sets many values
+       if ( jQuery.type( key ) === "object" ) {
+               chainable = true;
+               for ( i in key ) {
+                       jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
+               }
 
-               // NOTE: To any future maintainer, we've window.getComputedStyle
-               // because jsdom on node.js will break without it.
-               if ( window.getComputedStyle ) {
-                       support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
-                       support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
+       // Sets one value
+       } else if ( value !== undefined ) {
+               chainable = true;
 
-                       // Check if div with explicit width and no margin-right incorrectly
-                       // gets computed margin-right based on width of container. For more
-                       // info see bug #3333
-                       // Fails in WebKit before Feb 2011 nightlies
-                       // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
-                       marginDiv = document.createElement("div");
-                       marginDiv.style.cssText = div.style.cssText = divReset;
-                       marginDiv.style.marginRight = marginDiv.style.width = "0";
-                       div.style.width = "1px";
-                       div.appendChild( marginDiv );
-                       support.reliableMarginRight =
-                               !parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );
+               if ( !jQuery.isFunction( value ) ) {
+                       raw = true;
                }
 
-               if ( typeof div.style.zoom !== "undefined" ) {
-                       // Check if natively block-level elements act like inline-block
-                       // elements when setting their display to 'inline' and giving
-                       // them layout
-                       // (IE < 8 does this)
-                       div.innerHTML = "";
-                       div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1";
-                       support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
+               if ( bulk ) {
+                       // Bulk operations run against the entire set
+                       if ( raw ) {
+                               fn.call( elems, value );
+                               fn = null;
 
-                       // Check if elements with layout shrink-wrap their children
-                       // (IE 6 does this)
-                       div.style.display = "block";
-                       div.style.overflow = "visible";
-                       div.innerHTML = "<div></div>";
-                       div.firstChild.style.width = "5px";
-                       support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
-
-                       container.style.zoom = 1;
+                       // ...except when executing function values
+                       } else {
+                               bulk = fn;
+                               fn = function( elem, key, value ) {
+                                       return bulk.call( jQuery( elem ), value );
+                               };
+                       }
                }
 
-               // Null elements to avoid leaks in IE
-               body.removeChild( container );
-               container = div = tds = marginDiv = null;
-       });
-
-       // Null elements to avoid leaks in IE
-       fragment.removeChild( div );
-       all = a = select = opt = input = fragment = div = null;
+               if ( fn ) {
+                       for ( ; i < length; i++ ) {
+                               fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
+                       }
+               }
+       }
 
-       return support;
-})();
-var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
-       rmultiDash = /([A-Z])/g;
+       return chainable ?
+               elems :
 
-jQuery.extend({
-       cache: {},
+               // Gets
+               bulk ?
+                       fn.call( elems ) :
+                       length ? fn( elems[0], key ) : emptyGet;
+};
+var rcheckableType = (/^(?:checkbox|radio)$/i);
 
-       deletedIds: [],
 
-       // Remove at next major release (1.9/2.0)
-       uuid: 0,
 
-       // Unique for each copy of jQuery on the page
-       // Non-digits removed to match rinlinejQuery
-       expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
+(function() {
+       // Minified: var a,b,c
+       var input = document.createElement( "input" ),
+               div = document.createElement( "div" ),
+               fragment = document.createDocumentFragment();
 
-       // The following elements throw uncatchable exceptions if you
-       // attempt to add expando properties to them.
-       noData: {
-               "embed": true,
-               // Ban all objects except for Flash (which handle expandos)
-               "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
-               "applet": true
-       },
+       // Setup
+       div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
 
-       hasData: function( elem ) {
-               elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
-               return !!elem && !isEmptyDataObject( elem );
-       },
+       // IE strips leading whitespace when .innerHTML is used
+       support.leadingWhitespace = div.firstChild.nodeType === 3;
 
-       data: function( elem, name, data, pvt /* Internal Use Only */ ) {
-               if ( !jQuery.acceptData( elem ) ) {
-                       return;
-               }
+       // Make sure that tbody elements aren't automatically inserted
+       // IE will insert them into empty tables
+       support.tbody = !div.getElementsByTagName( "tbody" ).length;
 
-               var thisCache, ret,
-                       internalKey = jQuery.expando,
-                       getByName = typeof name === "string",
+       // Make sure that link elements get serialized correctly by innerHTML
+       // This requires a wrapper element in IE
+       support.htmlSerialize = !!div.getElementsByTagName( "link" ).length;
 
-                       // We have to handle DOM nodes and JS objects differently because IE6-7
-                       // can't GC object references properly across the DOM-JS boundary
-                       isNode = elem.nodeType,
+       // Makes sure cloning an html5 element does not cause problems
+       // Where outerHTML is undefined, this still works
+       support.html5Clone =
+               document.createElement( "nav" ).cloneNode( true ).outerHTML !== "<:nav></:nav>";
 
-                       // Only DOM nodes need the global jQuery cache; JS object data is
-                       // attached directly to the object so GC can occur automatically
-                       cache = isNode ? jQuery.cache : elem,
+       // Check if a disconnected checkbox will retain its checked
+       // value of true after appended to the DOM (IE6/7)
+       input.type = "checkbox";
+       input.checked = true;
+       fragment.appendChild( input );
+       support.appendChecked = input.checked;
 
-                       // Only defining an ID for JS objects if its cache already exists allows
-                       // the code to shortcut on the same path as a DOM node with no cache
-                       id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
+       // Make sure textarea (and checkbox) defaultValue is properly cloned
+       // Support: IE6-IE11+
+       div.innerHTML = "<textarea>x</textarea>";
+       support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
 
-               // Avoid doing any more work than we need to when trying to get data on an
-               // object that has no data at all
-               if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && getByName && data === undefined ) {
-                       return;
-               }
+       // #11217 - WebKit loses check when the name is after the checked attribute
+       fragment.appendChild( div );
+       div.innerHTML = "<input type='radio' checked='checked' name='t'/>";
 
-               if ( !id ) {
-                       // Only DOM nodes need a new unique ID for each element since their data
-                       // ends up in the global cache
-                       if ( isNode ) {
-                               elem[ internalKey ] = id = jQuery.deletedIds.pop() || jQuery.guid++;
-                       } else {
-                               id = internalKey;
-                       }
-               }
+       // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3
+       // old WebKit doesn't clone checked state correctly in fragments
+       support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
 
-               if ( !cache[ id ] ) {
-                       cache[ id ] = {};
+       // Support: IE<9
+       // Opera does not clone events (and typeof div.attachEvent === undefined).
+       // IE9-10 clones events bound via attachEvent, but they don't trigger with .click()
+       support.noCloneEvent = true;
+       if ( div.attachEvent ) {
+               div.attachEvent( "onclick", function() {
+                       support.noCloneEvent = false;
+               });
 
-                       // Avoids exposing jQuery metadata on plain JS objects when the object
-                       // is serialized using JSON.stringify
-                       if ( !isNode ) {
-                               cache[ id ].toJSON = jQuery.noop;
-                       }
-               }
+               div.cloneNode( true ).click();
+       }
 
-               // An object can be passed to jQuery.data instead of a key/value pair; this gets
-               // shallow copied over onto the existing cache
-               if ( typeof name === "object" || typeof name === "function" ) {
-                       if ( pvt ) {
-                               cache[ id ] = jQuery.extend( cache[ id ], name );
-                       } else {
-                               cache[ id ].data = jQuery.extend( cache[ id ].data, name );
-                       }
+       // Execute the test only if not already executed in another module.
+       if (support.deleteExpando == null) {
+               // Support: IE<9
+               support.deleteExpando = true;
+               try {
+                       delete div.test;
+               } catch( e ) {
+                       support.deleteExpando = false;
                }
+       }
+})();
 
-               thisCache = cache[ id ];
 
-               // jQuery data() is stored in a separate object inside the object's internal data
-               // cache in order to avoid key collisions between internal data and user-defined
-               // data.
-               if ( !pvt ) {
-                       if ( !thisCache.data ) {
-                               thisCache.data = {};
-                       }
+(function() {
+       var i, eventName,
+               div = document.createElement( "div" );
 
-                       thisCache = thisCache.data;
-               }
+       // Support: IE<9 (lack submit/change bubble), Firefox 23+ (lack focusin event)
+       for ( i in { submit: true, change: true, focusin: true }) {
+               eventName = "on" + i;
 
-               if ( data !== undefined ) {
-                       thisCache[ jQuery.camelCase( name ) ] = data;
+               if ( !(support[ i + "Bubbles" ] = eventName in window) ) {
+                       // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)
+                       div.setAttribute( eventName, "t" );
+                       support[ i + "Bubbles" ] = div.attributes[ eventName ].expando === false;
                }
+       }
 
-               // Check for both converted-to-camel and non-converted data property names
-               // If a data property was specified
-               if ( getByName ) {
+       // Null elements to avoid leaks in IE.
+       div = null;
+})();
 
-                       // First Try to find as-is property data
-                       ret = thisCache[ name ];
 
-                       // Test for null|undefined property data
-                       if ( ret == null ) {
+var rformElems = /^(?:input|select|textarea)$/i,
+       rkeyEvent = /^key/,
+       rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/,
+       rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+       rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
 
-                               // Try to find the camelCased property
-                               ret = thisCache[ jQuery.camelCase( name ) ];
-                       }
-               } else {
-                       ret = thisCache;
-               }
+function returnTrue() {
+       return true;
+}
 
-               return ret;
-       },
+function returnFalse() {
+       return false;
+}
 
-       removeData: function( elem, name, pvt /* Internal Use Only */ ) {
-               if ( !jQuery.acceptData( elem ) ) {
-                       return;
-               }
+function safeActiveElement() {
+       try {
+               return document.activeElement;
+       } catch ( err ) { }
+}
 
-               var thisCache, i, l,
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
 
-                       isNode = elem.nodeType,
+       global: {},
 
-                       // See jQuery.data for more information
-                       cache = isNode ? jQuery.cache : elem,
-                       id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
+       add: function( elem, types, handler, data, selector ) {
+               var tmp, events, t, handleObjIn,
+                       special, eventHandle, handleObj,
+                       handlers, type, namespaces, origType,
+                       elemData = jQuery._data( elem );
 
-               // If there is already no cache entry for this object, there is no
-               // purpose in continuing
-               if ( !cache[ id ] ) {
+               // Don't attach events to noData or text/comment nodes (but allow plain objects)
+               if ( !elemData ) {
                        return;
                }
 
-               if ( name ) {
-
-                       thisCache = pvt ? cache[ id ] : cache[ id ].data;
-
-                       if ( thisCache ) {
-
-                               // Support array or space separated string names for data keys
-                               if ( !jQuery.isArray( name ) ) {
-
-                                       // try the string as a key before any manipulation
-                                       if ( name in thisCache ) {
-                                               name = [ name ];
-                                       } else {
-
-                                               // split the camel cased version by spaces unless a key with the spaces exists
-                                               name = jQuery.camelCase( name );
-                                               if ( name in thisCache ) {
-                                                       name = [ name ];
-                                               } else {
-                                                       name = name.split(" ");
-                                               }
-                                       }
-                               }
-
-                               for ( i = 0, l = name.length; i < l; i++ ) {
-                                       delete thisCache[ name[i] ];
-                               }
-
-                               // If there is no data left in the cache, we want to continue
-                               // and let the cache object itself get destroyed
-                               if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
-                                       return;
-                               }
-                       }
+               // Caller can pass in an object of custom data in lieu of the handler
+               if ( handler.handler ) {
+                       handleObjIn = handler;
+                       handler = handleObjIn.handler;
+                       selector = handleObjIn.selector;
                }
 
-               // See jQuery.data for more information
-               if ( !pvt ) {
-                       delete cache[ id ].data;
-
-                       // Don't destroy the parent cache unless the internal data object
-                       // had been the only thing left in it
-                       if ( !isEmptyDataObject( cache[ id ] ) ) {
-                               return;
-                       }
+               // Make sure that the handler has a unique ID, used to find/remove it later
+               if ( !handler.guid ) {
+                       handler.guid = jQuery.guid++;
                }
 
-               // Destroy the cache
-               if ( isNode ) {
-                       jQuery.cleanData( [ elem ], true );
+               // Init the element's event structure and main handler, if this is the first
+               if ( !(events = elemData.events) ) {
+                       events = elemData.events = {};
+               }
+               if ( !(eventHandle = elemData.handle) ) {
+                       eventHandle = elemData.handle = function( e ) {
+                               // Discard the second event of a jQuery.event.trigger() and
+                               // when an event is called after a page has unloaded
+                               return typeof jQuery !== strundefined && (!e || jQuery.event.triggered !== e.type) ?
+                                       jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
+                                       undefined;
+                       };
+                       // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
+                       eventHandle.elem = elem;
+               }
 
-               // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
-               } else if ( jQuery.support.deleteExpando || cache != cache.window ) {
-                       delete cache[ id ];
+               // Handle multiple events separated by a space
+               types = ( types || "" ).match( rnotwhite ) || [ "" ];
+               t = types.length;
+               while ( t-- ) {
+                       tmp = rtypenamespace.exec( types[t] ) || [];
+                       type = origType = tmp[1];
+                       namespaces = ( tmp[2] || "" ).split( "." ).sort();
+
+                       // There *must* be a type, no attaching namespace-only handlers
+                       if ( !type ) {
+                               continue;
+                       }
 
-               // When all else fails, null
-               } else {
-                       cache[ id ] = null;
-               }
-       },
+                       // If event changes its type, use the special event handlers for the changed type
+                       special = jQuery.event.special[ type ] || {};
 
-       // For internal use only.
-       _data: function( elem, name, data ) {
-               return jQuery.data( elem, name, data, true );
-       },
+                       // If selector defined, determine special event api type, otherwise given type
+                       type = ( selector ? special.delegateType : special.bindType ) || type;
 
-       // A method for determining if a DOM node can handle the data expando
-       acceptData: function( elem ) {
-               var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];
+                       // Update special based on newly reset type
+                       special = jQuery.event.special[ type ] || {};
 
-               // nodes accept data unless otherwise specified; rejection can be conditional
-               return !noData || noData !== true && elem.getAttribute("classid") === noData;
-       }
-});
+                       // handleObj is passed to all event handlers
+                       handleObj = jQuery.extend({
+                               type: type,
+                               origType: origType,
+                               data: data,
+                               handler: handler,
+                               guid: handler.guid,
+                               selector: selector,
+                               needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
+                               namespace: namespaces.join(".")
+                       }, handleObjIn );
 
-jQuery.fn.extend({
-       data: function( key, value ) {
-               var parts, part, attr, name, l,
-                       elem = this[0],
-                       i = 0,
-                       data = null;
+                       // Init the event handler queue if we're the first
+                       if ( !(handlers = events[ type ]) ) {
+                               handlers = events[ type ] = [];
+                               handlers.delegateCount = 0;
 
-               // Gets all values
-               if ( key === undefined ) {
-                       if ( this.length ) {
-                               data = jQuery.data( elem );
+                               // Only use addEventListener/attachEvent if the special events handler returns false
+                               if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+                                       // Bind the global event handler to the element
+                                       if ( elem.addEventListener ) {
+                                               elem.addEventListener( type, eventHandle, false );
 
-                               if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
-                                       attr = elem.attributes;
-                                       for ( l = attr.length; i < l; i++ ) {
-                                               name = attr[i].name;
+                                       } else if ( elem.attachEvent ) {
+                                               elem.attachEvent( "on" + type, eventHandle );
+                                       }
+                               }
+                       }
 
-                                               if ( !name.indexOf( "data-" ) ) {
-                                                       name = jQuery.camelCase( name.substring(5) );
+                       if ( special.add ) {
+                               special.add.call( elem, handleObj );
 
-                                                       dataAttr( elem, name, data[ name ] );
-                                               }
-                                       }
-                                       jQuery._data( elem, "parsedAttrs", true );
+                               if ( !handleObj.handler.guid ) {
+                                       handleObj.handler.guid = handler.guid;
                                }
                        }
 
-                       return data;
-               }
+                       // Add to the element's handler list, delegates in front
+                       if ( selector ) {
+                               handlers.splice( handlers.delegateCount++, 0, handleObj );
+                       } else {
+                               handlers.push( handleObj );
+                       }
 
-               // Sets multiple values
-               if ( typeof key === "object" ) {
-                       return this.each(function() {
-                               jQuery.data( this, key );
-                       });
+                       // Keep track of which events have ever been used, for event optimization
+                       jQuery.event.global[ type ] = true;
                }
 
-               parts = key.split( ".", 2 );
-               parts[1] = parts[1] ? "." + parts[1] : "";
-               part = parts[1] + "!";
+               // Nullify elem to prevent memory leaks in IE
+               elem = null;
+       },
 
-               return jQuery.access( this, function( value ) {
+       // Detach an event or set of events from an element
+       remove: function( elem, types, handler, selector, mappedTypes ) {
+               var j, handleObj, tmp,
+                       origCount, t, events,
+                       special, handlers, type,
+                       namespaces, origType,
+                       elemData = jQuery.hasData( elem ) && jQuery._data( elem );
 
-                       if ( value === undefined ) {
-                               data = this.triggerHandler( "getData" + part, [ parts[0] ] );
+               if ( !elemData || !(events = elemData.events) ) {
+                       return;
+               }
 
-                               // Try to fetch any internally stored data first
-                               if ( data === undefined && elem ) {
-                                       data = jQuery.data( elem, key );
-                                       data = dataAttr( elem, key, data );
-                               }
+               // Once for each type.namespace in types; type may be omitted
+               types = ( types || "" ).match( rnotwhite ) || [ "" ];
+               t = types.length;
+               while ( t-- ) {
+                       tmp = rtypenamespace.exec( types[t] ) || [];
+                       type = origType = tmp[1];
+                       namespaces = ( tmp[2] || "" ).split( "." ).sort();
 
-                               return data === undefined && parts[1] ?
-                                       this.data( parts[0] ) :
-                                       data;
+                       // Unbind all events (on this namespace, if provided) for the element
+                       if ( !type ) {
+                               for ( type in events ) {
+                                       jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+                               }
+                               continue;
                        }
 
-                       parts[1] = value;
-                       this.each(function() {
-                               var self = jQuery( this );
-
-                               self.triggerHandler( "setData" + part, parts );
-                               jQuery.data( this, key, value );
-                               self.triggerHandler( "changeData" + part, parts );
-                       });
-               }, null, value, arguments.length > 1, null, false );
-       },
+                       special = jQuery.event.special[ type ] || {};
+                       type = ( selector ? special.delegateType : special.bindType ) || type;
+                       handlers = events[ type ] || [];
+                       tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" );
 
-       removeData: function( key ) {
-               return this.each(function() {
-                       jQuery.removeData( this, key );
-               });
-       }
-});
+                       // Remove matching events
+                       origCount = j = handlers.length;
+                       while ( j-- ) {
+                               handleObj = handlers[ j ];
 
-function dataAttr( elem, key, data ) {
-       // If nothing was found internally, try to fetch any
-       // data from the HTML5 data-* attribute
-       if ( data === undefined && elem.nodeType === 1 ) {
+                               if ( ( mappedTypes || origType === handleObj.origType ) &&
+                                       ( !handler || handler.guid === handleObj.guid ) &&
+                                       ( !tmp || tmp.test( handleObj.namespace ) ) &&
+                                       ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
+                                       handlers.splice( j, 1 );
 
-               var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
+                                       if ( handleObj.selector ) {
+                                               handlers.delegateCount--;
+                                       }
+                                       if ( special.remove ) {
+                                               special.remove.call( elem, handleObj );
+                                       }
+                               }
+                       }
 
-               data = elem.getAttribute( name );
+                       // Remove generic event handler if we removed something and no more handlers exist
+                       // (avoids potential for endless recursion during removal of special event handlers)
+                       if ( origCount && !handlers.length ) {
+                               if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+                                       jQuery.removeEvent( elem, type, elemData.handle );
+                               }
 
-               if ( typeof data === "string" ) {
-                       try {
-                               data = data === "true" ? true :
-                               data === "false" ? false :
-                               data === "null" ? null :
-                               // Only convert to a number if it doesn't change the string
-                               +data + "" === data ? +data :
-                               rbrace.test( data ) ? jQuery.parseJSON( data ) :
-                                       data;
-                       } catch( e ) {}
+                               delete events[ type ];
+                       }
+               }
 
-                       // Make sure we set the data so it isn't changed later
-                       jQuery.data( elem, key, data );
+               // Remove the expando if it's no longer used
+               if ( jQuery.isEmptyObject( events ) ) {
+                       delete elemData.handle;
 
-               } else {
-                       data = undefined;
+                       // removeData also checks for emptiness and clears the expando if empty
+                       // so use it instead of delete
+                       jQuery._removeData( elem, "events" );
                }
-       }
+       },
 
-       return data;
-}
+       trigger: function( event, data, elem, onlyHandlers ) {
+               var handle, ontype, cur,
+                       bubbleType, special, tmp, i,
+                       eventPath = [ elem || document ],
+                       type = hasOwn.call( event, "type" ) ? event.type : event,
+                       namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];
 
-// checks a cache object for emptiness
-function isEmptyDataObject( obj ) {
-       var name;
-       for ( name in obj ) {
+               cur = tmp = elem = elem || document;
 
-               // if the public data object is empty, the private is still empty
-               if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
-                       continue;
+               // Don't do events on text and comment nodes
+               if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+                       return;
                }
-               if ( name !== "toJSON" ) {
-                       return false;
+
+               // focus/blur morphs to focusin/out; ensure we're not firing them right now
+               if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+                       return;
                }
-       }
 
-       return true;
-}
-jQuery.extend({
-       queue: function( elem, type, data ) {
-               var queue;
+               if ( type.indexOf(".") >= 0 ) {
+                       // Namespaced trigger; create a regexp to match event type in handle()
+                       namespaces = type.split(".");
+                       type = namespaces.shift();
+                       namespaces.sort();
+               }
+               ontype = type.indexOf(":") < 0 && "on" + type;
 
-               if ( elem ) {
-                       type = ( type || "fx" ) + "queue";
-                       queue = jQuery._data( elem, type );
+               // Caller can pass in a jQuery.Event object, Object, or just an event type string
+               event = event[ jQuery.expando ] ?
+                       event :
+                       new jQuery.Event( type, typeof event === "object" && event );
 
-                       // Speed up dequeue by getting out quickly if this is just a lookup
-                       if ( data ) {
-                               if ( !queue || jQuery.isArray(data) ) {
-                                       queue = jQuery._data( elem, type, jQuery.makeArray(data) );
-                               } else {
-                                       queue.push( data );
-                               }
-                       }
-                       return queue || [];
-               }
-       },
+               // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
+               event.isTrigger = onlyHandlers ? 2 : 3;
+               event.namespace = namespaces.join(".");
+               event.namespace_re = event.namespace ?
+                       new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) :
+                       null;
 
-       dequeue: function( elem, type ) {
-               type = type || "fx";
+               // Clean up the event in case it is being reused
+               event.result = undefined;
+               if ( !event.target ) {
+                       event.target = elem;
+               }
 
-               var queue = jQuery.queue( elem, type ),
-                       startLength = queue.length,
-                       fn = queue.shift(),
-                       hooks = jQuery._queueHooks( elem, type ),
-                       next = function() {
-                               jQuery.dequeue( elem, type );
-                       };
+               // Clone any incoming data and prepend the event, creating the handler arg list
+               data = data == null ?
+                       [ event ] :
+                       jQuery.makeArray( data, [ event ] );
 
-               // If the fx queue is dequeued, always remove the progress sentinel
-               if ( fn === "inprogress" ) {
-                       fn = queue.shift();
-                       startLength--;
+               // Allow special events to draw outside the lines
+               special = jQuery.event.special[ type ] || {};
+               if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
+                       return;
                }
 
-               if ( fn ) {
+               // Determine event propagation path in advance, per W3C events spec (#9951)
+               // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+               if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
 
-                       // Add a progress sentinel to prevent the fx queue from being
-                       // automatically dequeued
-                       if ( type === "fx" ) {
-                               queue.unshift( "inprogress" );
+                       bubbleType = special.delegateType || type;
+                       if ( !rfocusMorph.test( bubbleType + type ) ) {
+                               cur = cur.parentNode;
+                       }
+                       for ( ; cur; cur = cur.parentNode ) {
+                               eventPath.push( cur );
+                               tmp = cur;
                        }
 
-                       // clear up the last queue stop function
-                       delete hooks.stop;
-                       fn.call( elem, next, hooks );
+                       // Only add window if we got to document (e.g., not plain obj or detached DOM)
+                       if ( tmp === (elem.ownerDocument || document) ) {
+                               eventPath.push( tmp.defaultView || tmp.parentWindow || window );
+                       }
                }
 
-               if ( !startLength && hooks ) {
-                       hooks.empty.fire();
-               }
-       },
+               // Fire handlers on the event path
+               i = 0;
+               while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {
 
-       // not intended for public consumption - generates a queueHooks object, or returns the current one
-       _queueHooks: function( elem, type ) {
-               var key = type + "queueHooks";
-               return jQuery._data( elem, key ) || jQuery._data( elem, key, {
-                       empty: jQuery.Callbacks("once memory").add(function() {
-                               jQuery.removeData( elem, type + "queue", true );
-                               jQuery.removeData( elem, key, true );
-                       })
-               });
-       }
-});
+                       event.type = i > 1 ?
+                               bubbleType :
+                               special.bindType || type;
 
-jQuery.fn.extend({
-       queue: function( type, data ) {
-               var setter = 2;
+                       // jQuery handler
+                       handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
+                       if ( handle ) {
+                               handle.apply( cur, data );
+                       }
 
-               if ( typeof type !== "string" ) {
-                       data = type;
-                       type = "fx";
-                       setter--;
+                       // Native handler
+                       handle = ontype && cur[ ontype ];
+                       if ( handle && handle.apply && jQuery.acceptData( cur ) ) {
+                               event.result = handle.apply( cur, data );
+                               if ( event.result === false ) {
+                                       event.preventDefault();
+                               }
+                       }
                }
+               event.type = type;
 
-               if ( arguments.length < setter ) {
-                       return jQuery.queue( this[0], type );
-               }
+               // If nobody prevented the default action, do it now
+               if ( !onlyHandlers && !event.isDefaultPrevented() ) {
 
-               return data === undefined ?
-                       this :
-                       this.each(function() {
-                               var queue = jQuery.queue( this, type, data );
+                       if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&
+                               jQuery.acceptData( elem ) ) {
 
-                               // ensure a hooks for this queue
-                               jQuery._queueHooks( this, type );
+                               // Call a native DOM method on the target with the same name name as the event.
+                               // Can't use an .isFunction() check here because IE6/7 fails that test.
+                               // Don't do default actions on window, that's where global variables be (#6170)
+                               if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {
 
-                               if ( type === "fx" && queue[0] !== "inprogress" ) {
-                                       jQuery.dequeue( this, type );
-                               }
-                       });
-       },
-       dequeue: function( type ) {
-               return this.each(function() {
-                       jQuery.dequeue( this, type );
-               });
-       },
-       // Based off of the plugin by Clint Helfers, with permission.
-       // http://blindsignals.com/index.php/2009/07/jquery-delay/
-       delay: function( time, type ) {
-               time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
-               type = type || "fx";
+                                       // Don't re-trigger an onFOO event when we call its FOO() method
+                                       tmp = elem[ ontype ];
 
-               return this.queue( type, function( next, hooks ) {
-                       var timeout = setTimeout( next, time );
-                       hooks.stop = function() {
-                               clearTimeout( timeout );
-                       };
-               });
-       },
-       clearQueue: function( type ) {
-               return this.queue( type || "fx", [] );
-       },
-       // Get a promise resolved when queues of a certain type
-       // are emptied (fx is the type by default)
-       promise: function( type, obj ) {
-               var tmp,
-                       count = 1,
-                       defer = jQuery.Deferred(),
-                       elements = this,
-                       i = this.length,
-                       resolve = function() {
-                               if ( !( --count ) ) {
-                                       defer.resolveWith( elements, [ elements ] );
-                               }
-                       };
+                                       if ( tmp ) {
+                                               elem[ ontype ] = null;
+                                       }
 
-               if ( typeof type !== "string" ) {
-                       obj = type;
-                       type = undefined;
-               }
-               type = type || "fx";
+                                       // Prevent re-triggering of the same event, since we already bubbled it above
+                                       jQuery.event.triggered = type;
+                                       try {
+                                               elem[ type ]();
+                                       } catch ( e ) {
+                                               // IE<9 dies on focus/blur to hidden element (#1486,#12518)
+                                               // only reproducible on winXP IE8 native, not IE9 in IE8 mode
+                                       }
+                                       jQuery.event.triggered = undefined;
 
-               while( i-- ) {
-                       tmp = jQuery._data( elements[ i ], type + "queueHooks" );
-                       if ( tmp && tmp.empty ) {
-                               count++;
-                               tmp.empty.add( resolve );
+                                       if ( tmp ) {
+                                               elem[ ontype ] = tmp;
+                                       }
+                               }
                        }
                }
-               resolve();
-               return defer.promise( obj );
-       }
-});
-var nodeHook, boolHook, fixSpecified,
-       rclass = /[\t\r\n]/g,
-       rreturn = /\r/g,
-       rtype = /^(?:button|input)$/i,
-       rfocusable = /^(?:button|input|object|select|textarea)$/i,
-       rclickable = /^a(?:rea|)$/i,
-       rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
-       getSetAttribute = jQuery.support.getSetAttribute;
 
-jQuery.fn.extend({
-       attr: function( name, value ) {
-               return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
+               return event.result;
        },
 
-       removeAttr: function( name ) {
-               return this.each(function() {
-                       jQuery.removeAttr( this, name );
-               });
-       },
+       dispatch: function( event ) {
 
-       prop: function( name, value ) {
-               return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
-       },
+               // Make a writable jQuery.Event from the native event object
+               event = jQuery.event.fix( event );
 
-       removeProp: function( name ) {
-               name = jQuery.propFix[ name ] || name;
-               return this.each(function() {
-                       // try/catch handles cases where IE balks (such as removing a property on window)
-                       try {
-                               this[ name ] = undefined;
-                               delete this[ name ];
-                       } catch( e ) {}
-               });
-       },
+               var i, ret, handleObj, matched, j,
+                       handlerQueue = [],
+                       args = slice.call( arguments ),
+                       handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [],
+                       special = jQuery.event.special[ event.type ] || {};
 
-       addClass: function( value ) {
-               var classNames, i, l, elem,
-                       setClass, c, cl;
+               // Use the fix-ed jQuery.Event rather than the (read-only) native event
+               args[0] = event;
+               event.delegateTarget = this;
 
-               if ( jQuery.isFunction( value ) ) {
-                       return this.each(function( j ) {
-                               jQuery( this ).addClass( value.call(this, j, this.className) );
-                       });
+               // Call the preDispatch hook for the mapped type, and let it bail if desired
+               if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+                       return;
                }
 
-               if ( value && typeof value === "string" ) {
-                       classNames = value.split( core_rspace );
+               // Determine handlers
+               handlerQueue = jQuery.event.handlers.call( this, event, handlers );
 
-                       for ( i = 0, l = this.length; i < l; i++ ) {
-                               elem = this[ i ];
+               // Run delegates first; they may want to stop propagation beneath us
+               i = 0;
+               while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {
+                       event.currentTarget = matched.elem;
 
-                               if ( elem.nodeType === 1 ) {
-                                       if ( !elem.className && classNames.length === 1 ) {
-                                               elem.className = value;
+                       j = 0;
+                       while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
 
-                                       } else {
-                                               setClass = " " + elem.className + " ";
+                               // Triggered event must either 1) have no namespace, or
+                               // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
+                               if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
 
-                                               for ( c = 0, cl = classNames.length; c < cl; c++ ) {
-                                                       if ( setClass.indexOf( " " + classNames[ c ] + " " ) < 0 ) {
-                                                               setClass += classNames[ c ] + " ";
-                                                       }
+                                       event.handleObj = handleObj;
+                                       event.data = handleObj.data;
+
+                                       ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
+                                                       .apply( matched.elem, args );
+
+                                       if ( ret !== undefined ) {
+                                               if ( (event.result = ret) === false ) {
+                                                       event.preventDefault();
+                                                       event.stopPropagation();
                                                }
-                                               elem.className = jQuery.trim( setClass );
                                        }
                                }
                        }
                }
 
-               return this;
+               // Call the postDispatch hook for the mapped type
+               if ( special.postDispatch ) {
+                       special.postDispatch.call( this, event );
+               }
+
+               return event.result;
        },
 
-       removeClass: function( value ) {
-               var removes, className, elem, c, cl, i, l;
+       handlers: function( event, handlers ) {
+               var sel, handleObj, matches, i,
+                       handlerQueue = [],
+                       delegateCount = handlers.delegateCount,
+                       cur = event.target;
 
-               if ( jQuery.isFunction( value ) ) {
-                       return this.each(function( j ) {
-                               jQuery( this ).removeClass( value.call(this, j, this.className) );
-                       });
-               }
-               if ( (value && typeof value === "string") || value === undefined ) {
-                       removes = ( value || "" ).split( core_rspace );
+               // Find delegate handlers
+               // Black-hole SVG <use> instance trees (#13180)
+               // Avoid non-left-click bubbling in Firefox (#3861)
+               if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
 
-                       for ( i = 0, l = this.length; i < l; i++ ) {
-                               elem = this[ i ];
-                               if ( elem.nodeType === 1 && elem.className ) {
+                       /* jshint eqeqeq: false */
+                       for ( ; cur != this; cur = cur.parentNode || this ) {
+                               /* jshint eqeqeq: true */
+
+                               // Don't check non-elements (#13208)
+                               // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
+                               if ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click") ) {
+                                       matches = [];
+                                       for ( i = 0; i < delegateCount; i++ ) {
+                                               handleObj = handlers[ i ];
 
-                                       className = (" " + elem.className + " ").replace( rclass, " " );
+                                               // Don't conflict with Object.prototype properties (#13203)
+                                               sel = handleObj.selector + " ";
 
-                                       // loop over each item in the removal list
-                                       for ( c = 0, cl = removes.length; c < cl; c++ ) {
-                                               // Remove until there is nothing to remove,
-                                               while ( className.indexOf(" " + removes[ c ] + " ") >= 0 ) {
-                                                       className = className.replace( " " + removes[ c ] + " " , " " );
+                                               if ( matches[ sel ] === undefined ) {
+                                                       matches[ sel ] = handleObj.needsContext ?
+                                                               jQuery( sel, this ).index( cur ) >= 0 :
+                                                               jQuery.find( sel, this, null, [ cur ] ).length;
                                                }
+                                               if ( matches[ sel ] ) {
+                                                       matches.push( handleObj );
+                                               }
+                                       }
+                                       if ( matches.length ) {
+                                               handlerQueue.push({ elem: cur, handlers: matches });
                                        }
-                                       elem.className = value ? jQuery.trim( className ) : "";
                                }
                        }
                }
 
-               return this;
+               // Add the remaining (directly-bound) handlers
+               if ( delegateCount < handlers.length ) {
+                       handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });
+               }
+
+               return handlerQueue;
        },
 
-       toggleClass: function( value, stateVal ) {
-               var type = typeof value,
-                       isBool = typeof stateVal === "boolean";
+       fix: function( event ) {
+               if ( event[ jQuery.expando ] ) {
+                       return event;
+               }
 
-               if ( jQuery.isFunction( value ) ) {
-                       return this.each(function( i ) {
-                               jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
-                       });
+               // Create a writable copy of the event object and normalize some properties
+               var i, prop, copy,
+                       type = event.type,
+                       originalEvent = event,
+                       fixHook = this.fixHooks[ type ];
+
+               if ( !fixHook ) {
+                       this.fixHooks[ type ] = fixHook =
+                               rmouseEvent.test( type ) ? this.mouseHooks :
+                               rkeyEvent.test( type ) ? this.keyHooks :
+                               {};
                }
+               copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
 
-               return this.each(function() {
-                       if ( type === "string" ) {
-                               // toggle individual class names
-                               var className,
-                                       i = 0,
-                                       self = jQuery( this ),
-                                       state = stateVal,
-                                       classNames = value.split( core_rspace );
+               event = new jQuery.Event( originalEvent );
 
-                               while ( (className = classNames[ i++ ]) ) {
-                                       // check each className given, space separated list
-                                       state = isBool ? state : !self.hasClass( className );
-                                       self[ state ? "addClass" : "removeClass" ]( className );
-                               }
+               i = copy.length;
+               while ( i-- ) {
+                       prop = copy[ i ];
+                       event[ prop ] = originalEvent[ prop ];
+               }
 
-                       } else if ( type === "undefined" || type === "boolean" ) {
-                               if ( this.className ) {
-                                       // store className if set
-                                       jQuery._data( this, "__className__", this.className );
+               // Support: IE<9
+               // Fix target property (#1925)
+               if ( !event.target ) {
+                       event.target = originalEvent.srcElement || document;
+               }
+
+               // Support: Chrome 23+, Safari?
+               // Target should not be a text node (#504, #13143)
+               if ( event.target.nodeType === 3 ) {
+                       event.target = event.target.parentNode;
+               }
+
+               // Support: IE<9
+               // For mouse/key events, metaKey==false if it's undefined (#3368, #11328)
+               event.metaKey = !!event.metaKey;
+
+               return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
+       },
+
+       // Includes some event props shared by KeyEvent and MouseEvent
+       props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
+
+       fixHooks: {},
+
+       keyHooks: {
+               props: "char charCode key keyCode".split(" "),
+               filter: function( event, original ) {
+
+                       // Add which for key events
+                       if ( event.which == null ) {
+                               event.which = original.charCode != null ? original.charCode : original.keyCode;
+                       }
+
+                       return event;
+               }
+       },
+
+       mouseHooks: {
+               props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
+               filter: function( event, original ) {
+                       var body, eventDoc, doc,
+                               button = original.button,
+                               fromElement = original.fromElement;
+
+                       // Calculate pageX/Y if missing and clientX/Y available
+                       if ( event.pageX == null && original.clientX != null ) {
+                               eventDoc = event.target.ownerDocument || document;
+                               doc = eventDoc.documentElement;
+                               body = eventDoc.body;
+
+                               event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
+                               event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
+                       }
+
+                       // Add relatedTarget, if necessary
+                       if ( !event.relatedTarget && fromElement ) {
+                               event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
+                       }
+
+                       // Add which for click: 1 === left; 2 === middle; 3 === right
+                       // Note: button is not normalized, so don't use it
+                       if ( !event.which && button !== undefined ) {
+                               event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
+                       }
+
+                       return event;
+               }
+       },
+
+       special: {
+               load: {
+                       // Prevent triggered image.load events from bubbling to window.load
+                       noBubble: true
+               },
+               focus: {
+                       // Fire native event if possible so blur/focus sequence is correct
+                       trigger: function() {
+                               if ( this !== safeActiveElement() && this.focus ) {
+                                       try {
+                                               this.focus();
+                                               return false;
+                                       } catch ( e ) {
+                                               // Support: IE<9
+                                               // If we error on focus to hidden element (#1486, #12518),
+                                               // let .trigger() run the handlers
+                                       }
+                               }
+                       },
+                       delegateType: "focusin"
+               },
+               blur: {
+                       trigger: function() {
+                               if ( this === safeActiveElement() && this.blur ) {
+                                       this.blur();
+                                       return false;
+                               }
+                       },
+                       delegateType: "focusout"
+               },
+               click: {
+                       // For checkbox, fire native event so checked state will be right
+                       trigger: function() {
+                               if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) {
+                                       this.click();
+                                       return false;
                                }
+                       },
 
-                               // toggle whole className
-                               this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
+                       // For cross-browser consistency, don't fire native .click() on links
+                       _default: function( event ) {
+                               return jQuery.nodeName( event.target, "a" );
                        }
-               });
+               },
+
+               beforeunload: {
+                       postDispatch: function( event ) {
+
+                               // Support: Firefox 20+
+                               // Firefox doesn't alert if the returnValue field is not set.
+                               if ( event.result !== undefined && event.originalEvent ) {
+                                       event.originalEvent.returnValue = event.result;
+                               }
+                       }
+               }
        },
 
-       hasClass: function( selector ) {
-               var className = " " + selector + " ",
-                       i = 0,
-                       l = this.length;
-               for ( ; i < l; i++ ) {
-                       if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
-                               return true;
-                       }
-               }
+       simulate: function( type, elem, event, bubble ) {
+               // Piggyback on a donor event to simulate a different one.
+               // Fake originalEvent to avoid donor's stopPropagation, but if the
+               // simulated event prevents default then we do the same on the donor.
+               var e = jQuery.extend(
+                       new jQuery.Event(),
+                       event,
+                       {
+                               type: type,
+                               isSimulated: true,
+                               originalEvent: {}
+                       }
+               );
+               if ( bubble ) {
+                       jQuery.event.trigger( e, null, elem );
+               } else {
+                       jQuery.event.dispatch.call( elem, e );
+               }
+               if ( e.isDefaultPrevented() ) {
+                       event.preventDefault();
+               }
+       }
+};
+
+jQuery.removeEvent = document.removeEventListener ?
+       function( elem, type, handle ) {
+               if ( elem.removeEventListener ) {
+                       elem.removeEventListener( type, handle, false );
+               }
+       } :
+       function( elem, type, handle ) {
+               var name = "on" + type;
+
+               if ( elem.detachEvent ) {
+
+                       // #8545, #7054, preventing memory leaks for custom events in IE6-8
+                       // detachEvent needed property on element, by name of that event, to properly expose it to GC
+                       if ( typeof elem[ name ] === strundefined ) {
+                               elem[ name ] = null;
+                       }
+
+                       elem.detachEvent( name, handle );
+               }
+       };
+
+jQuery.Event = function( src, props ) {
+       // Allow instantiation without the 'new' keyword
+       if ( !(this instanceof jQuery.Event) ) {
+               return new jQuery.Event( src, props );
+       }
+
+       // Event object
+       if ( src && src.type ) {
+               this.originalEvent = src;
+               this.type = src.type;
+
+               // Events bubbling up the document may have been marked as prevented
+               // by a handler lower down the tree; reflect the correct value.
+               this.isDefaultPrevented = src.defaultPrevented ||
+                               src.defaultPrevented === undefined &&
+                               // Support: IE < 9, Android < 4.0
+                               src.returnValue === false ?
+                       returnTrue :
+                       returnFalse;
 
-               return false;
-       },
+       // Event type
+       } else {
+               this.type = src;
+       }
 
-       val: function( value ) {
-               var hooks, ret, isFunction,
-                       elem = this[0];
+       // Put explicitly provided properties onto the event object
+       if ( props ) {
+               jQuery.extend( this, props );
+       }
 
-               if ( !arguments.length ) {
-                       if ( elem ) {
-                               hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
+       // Create a timestamp if incoming event doesn't have one
+       this.timeStamp = src && src.timeStamp || jQuery.now();
 
-                               if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
-                                       return ret;
-                               }
+       // Mark it as fixed
+       this[ jQuery.expando ] = true;
+};
 
-                               ret = elem.value;
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+       isDefaultPrevented: returnFalse,
+       isPropagationStopped: returnFalse,
+       isImmediatePropagationStopped: returnFalse,
 
-                               return typeof ret === "string" ?
-                                       // handle most common string cases
-                                       ret.replace(rreturn, "") :
-                                       // handle cases where value is null/undef or number
-                                       ret == null ? "" : ret;
-                       }
+       preventDefault: function() {
+               var e = this.originalEvent;
 
+               this.isDefaultPrevented = returnTrue;
+               if ( !e ) {
                        return;
                }
 
-               isFunction = jQuery.isFunction( value );
+               // If preventDefault exists, run it on the original event
+               if ( e.preventDefault ) {
+                       e.preventDefault();
 
-               return this.each(function( i ) {
-                       var val,
-                               self = jQuery(this);
+               // Support: IE
+               // Otherwise set the returnValue property of the original event to false
+               } else {
+                       e.returnValue = false;
+               }
+       },
+       stopPropagation: function() {
+               var e = this.originalEvent;
 
-                       if ( this.nodeType !== 1 ) {
-                               return;
-                       }
+               this.isPropagationStopped = returnTrue;
+               if ( !e ) {
+                       return;
+               }
+               // If stopPropagation exists, run it on the original event
+               if ( e.stopPropagation ) {
+                       e.stopPropagation();
+               }
 
-                       if ( isFunction ) {
-                               val = value.call( this, i, self.val() );
-                       } else {
-                               val = value;
-                       }
+               // Support: IE
+               // Set the cancelBubble property of the original event to true
+               e.cancelBubble = true;
+       },
+       stopImmediatePropagation: function() {
+               var e = this.originalEvent;
 
-                       // Treat null/undefined as ""; convert numbers to string
-                       if ( val == null ) {
-                               val = "";
-                       } else if ( typeof val === "number" ) {
-                               val += "";
-                       } else if ( jQuery.isArray( val ) ) {
-                               val = jQuery.map(val, function ( value ) {
-                                       return value == null ? "" : value + "";
-                               });
-                       }
+               this.isImmediatePropagationStopped = returnTrue;
 
-                       hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
+               if ( e && e.stopImmediatePropagation ) {
+                       e.stopImmediatePropagation();
+               }
 
-                       // If set returns undefined, fall back to normal setting
-                       if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
-                               this.value = val;
-                       }
-               });
+               this.stopPropagation();
        }
-});
+};
 
-jQuery.extend({
-       valHooks: {
-               option: {
-                       get: function( elem ) {
-                               // attributes.value is undefined in Blackberry 4.7 but
-                               // uses .value. See #6932
-                               var val = elem.attributes.value;
-                               return !val || val.specified ? elem.value : elem.text;
-                       }
-               },
-               select: {
-                       get: function( elem ) {
-                               var value, option,
-                                       options = elem.options,
-                                       index = elem.selectedIndex,
-                                       one = elem.type === "select-one" || index < 0,
-                                       values = one ? null : [],
-                                       max = one ? index + 1 : options.length,
-                                       i = index < 0 ?
-                                               max :
-                                               one ? index : 0;
+// Create mouseenter/leave events using mouseover/out and event-time checks
+jQuery.each({
+       mouseenter: "mouseover",
+       mouseleave: "mouseout",
+       pointerenter: "pointerover",
+       pointerleave: "pointerout"
+}, function( orig, fix ) {
+       jQuery.event.special[ orig ] = {
+               delegateType: fix,
+               bindType: fix,
 
-                               // Loop through all the selected options
-                               for ( ; i < max; i++ ) {
-                                       option = options[ i ];
+               handle: function( event ) {
+                       var ret,
+                               target = this,
+                               related = event.relatedTarget,
+                               handleObj = event.handleObj;
 
-                                       // oldIE doesn't update selected after form reset (#2551)
-                                       if ( ( option.selected || i === index ) &&
-                                                       // Don't return options that are disabled or in a disabled optgroup
-                                                       ( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) &&
-                                                       ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
+                       // For mousenter/leave call the handler if related is outside the target.
+                       // NB: No relatedTarget if the mouse left/entered the browser window
+                       if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
+                               event.type = handleObj.origType;
+                               ret = handleObj.handler.apply( this, arguments );
+                               event.type = fix;
+                       }
+                       return ret;
+               }
+       };
+});
 
-                                               // Get the specific value for the option
-                                               value = jQuery( option ).val();
+// IE submit delegation
+if ( !support.submitBubbles ) {
 
-                                               // We don't need an array for one selects
-                                               if ( one ) {
-                                                       return value;
-                                               }
+       jQuery.event.special.submit = {
+               setup: function() {
+                       // Only need this for delegated form submit events
+                       if ( jQuery.nodeName( this, "form" ) ) {
+                               return false;
+                       }
 
-                                               // Multi-Selects return an array
-                                               values.push( value );
-                                       }
+                       // Lazy-add a submit handler when a descendant form may potentially be submitted
+                       jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
+                               // Node name check avoids a VML-related crash in IE (#9807)
+                               var elem = e.target,
+                                       form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
+                               if ( form && !jQuery._data( form, "submitBubbles" ) ) {
+                                       jQuery.event.add( form, "submit._submit", function( event ) {
+                                               event._submit_bubble = true;
+                                       });
+                                       jQuery._data( form, "submitBubbles", true );
                                }
+                       });
+                       // return undefined since we don't need an event listener
+               },
 
-                               return values;
-                       },
-
-                       set: function( elem, value ) {
-                               var values = jQuery.makeArray( value );
-
-                               jQuery(elem).find("option").each(function() {
-                                       this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
-                               });
-
-                               if ( !values.length ) {
-                                       elem.selectedIndex = -1;
+               postDispatch: function( event ) {
+                       // If form was submitted by the user, bubble the event up the tree
+                       if ( event._submit_bubble ) {
+                               delete event._submit_bubble;
+                               if ( this.parentNode && !event.isTrigger ) {
+                                       jQuery.event.simulate( "submit", this.parentNode, event, true );
                                }
-                               return values;
                        }
-               }
-       },
-
-       // Unused in 1.8, left in so attrFn-stabbers won't die; remove in 1.9
-       attrFn: {},
-
-       attr: function( elem, name, value, pass ) {
-               var ret, hooks, notxml,
-                       nType = elem.nodeType;
+               },
 
-               // don't get/set attributes on text, comment and attribute nodes
-               if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
-                       return;
-               }
+               teardown: function() {
+                       // Only need this for delegated form submit events
+                       if ( jQuery.nodeName( this, "form" ) ) {
+                               return false;
+                       }
 
-               if ( pass && jQuery.isFunction( jQuery.fn[ name ] ) ) {
-                       return jQuery( elem )[ name ]( value );
+                       // Remove delegated handlers; cleanData eventually reaps submit handlers attached above
+                       jQuery.event.remove( this, "._submit" );
                }
+       };
+}
 
-               // Fallback to prop when attributes are not supported
-               if ( typeof elem.getAttribute === "undefined" ) {
-                       return jQuery.prop( elem, name, value );
-               }
+// IE change delegation and checkbox/radio fix
+if ( !support.changeBubbles ) {
 
-               notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+       jQuery.event.special.change = {
 
-               // All attributes are lowercase
-               // Grab necessary hook if one is defined
-               if ( notxml ) {
-                       name = name.toLowerCase();
-                       hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
-               }
+               setup: function() {
 
-               if ( value !== undefined ) {
+                       if ( rformElems.test( this.nodeName ) ) {
+                               // IE doesn't fire change on a check/radio until blur; trigger it on click
+                               // after a propertychange. Eat the blur-change in special.change.handle.
+                               // This still fires onchange a second time for check/radio after blur.
+                               if ( this.type === "checkbox" || this.type === "radio" ) {
+                                       jQuery.event.add( this, "propertychange._change", function( event ) {
+                                               if ( event.originalEvent.propertyName === "checked" ) {
+                                                       this._just_changed = true;
+                                               }
+                                       });
+                                       jQuery.event.add( this, "click._change", function( event ) {
+                                               if ( this._just_changed && !event.isTrigger ) {
+                                                       this._just_changed = false;
+                                               }
+                                               // Allow triggered, simulated change events (#11500)
+                                               jQuery.event.simulate( "change", this, event, true );
+                                       });
+                               }
+                               return false;
+                       }
+                       // Delegated event; lazy-add a change handler on descendant inputs
+                       jQuery.event.add( this, "beforeactivate._change", function( e ) {
+                               var elem = e.target;
 
-                       if ( value === null ) {
-                               jQuery.removeAttr( elem, name );
-                               return;
+                               if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) {
+                                       jQuery.event.add( elem, "change._change", function( event ) {
+                                               if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
+                                                       jQuery.event.simulate( "change", this.parentNode, event, true );
+                                               }
+                                       });
+                                       jQuery._data( elem, "changeBubbles", true );
+                               }
+                       });
+               },
 
-                       } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
-                               return ret;
+               handle: function( event ) {
+                       var elem = event.target;
 
-                       } else {
-                               elem.setAttribute( name, value + "" );
-                               return value;
+                       // Swallow native change events from checkbox/radio, we already triggered them above
+                       if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
+                               return event.handleObj.handler.apply( this, arguments );
                        }
+               },
 
-               } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
-                       return ret;
-
-               } else {
-
-                       ret = elem.getAttribute( name );
+               teardown: function() {
+                       jQuery.event.remove( this, "._change" );
 
-                       // Non-existent attributes return null, we normalize to undefined
-                       return ret === null ?
-                               undefined :
-                               ret;
+                       return !rformElems.test( this.nodeName );
                }
-       },
-
-       removeAttr: function( elem, value ) {
-               var propName, attrNames, name, isBool,
-                       i = 0;
-
-               if ( value && elem.nodeType === 1 ) {
-
-                       attrNames = value.split( core_rspace );
-
-                       for ( ; i < attrNames.length; i++ ) {
-                               name = attrNames[ i ];
+       };
+}
 
-                               if ( name ) {
-                                       propName = jQuery.propFix[ name ] || name;
-                                       isBool = rboolean.test( name );
+// Create "bubbling" focus and blur events
+if ( !support.focusinBubbles ) {
+       jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
 
-                                       // See #9699 for explanation of this approach (setting first, then removal)
-                                       // Do not do this for boolean attributes (see #10870)
-                                       if ( !isBool ) {
-                                               jQuery.attr( elem, name, "" );
-                                       }
-                                       elem.removeAttribute( getSetAttribute ? name : propName );
+               // Attach a single capturing handler on the document while someone wants focusin/focusout
+               var handler = function( event ) {
+                               jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
+                       };
 
-                                       // Set corresponding property to false for boolean attributes
-                                       if ( isBool && propName in elem ) {
-                                               elem[ propName ] = false;
-                                       }
-                               }
-                       }
-               }
-       },
+               jQuery.event.special[ fix ] = {
+                       setup: function() {
+                               var doc = this.ownerDocument || this,
+                                       attaches = jQuery._data( doc, fix );
 
-       attrHooks: {
-               type: {
-                       set: function( elem, value ) {
-                               // We can't allow the type property to be changed (since it causes problems in IE)
-                               if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
-                                       jQuery.error( "type property can't be changed" );
-                               } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
-                                       // Setting the type on a radio button after the value resets the value in IE6-9
-                                       // Reset value to it's default in case type is set after value
-                                       // This is for element creation
-                                       var val = elem.value;
-                                       elem.setAttribute( "type", value );
-                                       if ( val ) {
-                                               elem.value = val;
-                                       }
-                                       return value;
-                               }
-                       }
-               },
-               // Use the value property for back compat
-               // Use the nodeHook for button elements in IE6/7 (#1954)
-               value: {
-                       get: function( elem, name ) {
-                               if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
-                                       return nodeHook.get( elem, name );
+                               if ( !attaches ) {
+                                       doc.addEventListener( orig, handler, true );
                                }
-                               return name in elem ?
-                                       elem.value :
-                                       null;
+                               jQuery._data( doc, fix, ( attaches || 0 ) + 1 );
                        },
-                       set: function( elem, value, name ) {
-                               if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
-                                       return nodeHook.set( elem, value, name );
+                       teardown: function() {
+                               var doc = this.ownerDocument || this,
+                                       attaches = jQuery._data( doc, fix ) - 1;
+
+                               if ( !attaches ) {
+                                       doc.removeEventListener( orig, handler, true );
+                                       jQuery._removeData( doc, fix );
+                               } else {
+                                       jQuery._data( doc, fix, attaches );
                                }
-                               // Does not return so that setAttribute is also used
-                               elem.value = value;
                        }
-               }
-       },
-
-       propFix: {
-               tabindex: "tabIndex",
-               readonly: "readOnly",
-               "for": "htmlFor",
-               "class": "className",
-               maxlength: "maxLength",
-               cellspacing: "cellSpacing",
-               cellpadding: "cellPadding",
-               rowspan: "rowSpan",
-               colspan: "colSpan",
-               usemap: "useMap",
-               frameborder: "frameBorder",
-               contenteditable: "contentEditable"
-       },
-
-       prop: function( elem, name, value ) {
-               var ret, hooks, notxml,
-                       nType = elem.nodeType;
+               };
+       });
+}
 
-               // don't get/set properties on text, comment and attribute nodes
-               if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
-                       return;
-               }
+jQuery.fn.extend({
 
-               notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+       on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
+               var type, origFn;
 
-               if ( notxml ) {
-                       // Fix name and attach hooks
-                       name = jQuery.propFix[ name ] || name;
-                       hooks = jQuery.propHooks[ name ];
+               // Types can be a map of types/handlers
+               if ( typeof types === "object" ) {
+                       // ( types-Object, selector, data )
+                       if ( typeof selector !== "string" ) {
+                               // ( types-Object, data )
+                               data = data || selector;
+                               selector = undefined;
+                       }
+                       for ( type in types ) {
+                               this.on( type, selector, data, types[ type ], one );
+                       }
+                       return this;
                }
 
-               if ( value !== undefined ) {
-                       if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
-                               return ret;
-
+               if ( data == null && fn == null ) {
+                       // ( types, fn )
+                       fn = selector;
+                       data = selector = undefined;
+               } else if ( fn == null ) {
+                       if ( typeof selector === "string" ) {
+                               // ( types, selector, fn )
+                               fn = data;
+                               data = undefined;
                        } else {
-                               return ( elem[ name ] = value );
+                               // ( types, data, fn )
+                               fn = data;
+                               data = selector;
+                               selector = undefined;
                        }
+               }
+               if ( fn === false ) {
+                       fn = returnFalse;
+               } else if ( !fn ) {
+                       return this;
+               }
 
-               } else {
-                       if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
-                               return ret;
-
-                       } else {
-                               return elem[ name ];
+               if ( one === 1 ) {
+                       origFn = fn;
+                       fn = function( event ) {
+                               // Can use an empty set, since event contains the info
+                               jQuery().off( event );
+                               return origFn.apply( this, arguments );
+                       };
+                       // Use same guid so caller can remove using origFn
+                       fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+               }
+               return this.each( function() {
+                       jQuery.event.add( this, types, fn, data, selector );
+               });
+       },
+       one: function( types, selector, data, fn ) {
+               return this.on( types, selector, data, fn, 1 );
+       },
+       off: function( types, selector, fn ) {
+               var handleObj, type;
+               if ( types && types.preventDefault && types.handleObj ) {
+                       // ( event )  dispatched jQuery.Event
+                       handleObj = types.handleObj;
+                       jQuery( types.delegateTarget ).off(
+                               handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
+                               handleObj.selector,
+                               handleObj.handler
+                       );
+                       return this;
+               }
+               if ( typeof types === "object" ) {
+                       // ( types-object [, selector] )
+                       for ( type in types ) {
+                               this.off( type, selector, types[ type ] );
                        }
+                       return this;
+               }
+               if ( selector === false || typeof selector === "function" ) {
+                       // ( types [, fn] )
+                       fn = selector;
+                       selector = undefined;
+               }
+               if ( fn === false ) {
+                       fn = returnFalse;
                }
+               return this.each(function() {
+                       jQuery.event.remove( this, types, fn, selector );
+               });
        },
 
-       propHooks: {
-               tabIndex: {
-                       get: function( elem ) {
-                               // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
-                               // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
-                               var attributeNode = elem.getAttributeNode("tabindex");
-
-                               return attributeNode && attributeNode.specified ?
-                                       parseInt( attributeNode.value, 10 ) :
-                                       rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
-                                               0 :
-                                               undefined;
-                       }
+       trigger: function( type, data ) {
+               return this.each(function() {
+                       jQuery.event.trigger( type, data, this );
+               });
+       },
+       triggerHandler: function( type, data ) {
+               var elem = this[0];
+               if ( elem ) {
+                       return jQuery.event.trigger( type, data, elem, true );
                }
        }
 });
 
-// Hook for boolean attributes
-boolHook = {
-       get: function( elem, name ) {
-               // Align boolean attributes with corresponding properties
-               // Fall back to attribute presence where some booleans are not supported
-               var attrNode,
-                       property = jQuery.prop( elem, name );
-               return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
-                       name.toLowerCase() :
-                       undefined;
-       },
-       set: function( elem, value, name ) {
-               var propName;
-               if ( value === false ) {
-                       // Remove boolean attributes when set to false
-                       jQuery.removeAttr( elem, name );
-               } else {
-                       // value is true since we know at this point it's type boolean and not false
-                       // Set boolean attributes to the same name and set the DOM property
-                       propName = jQuery.propFix[ name ] || name;
-                       if ( propName in elem ) {
-                               // Only set the IDL specifically if it already exists on the element
-                               elem[ propName ] = true;
-                       }
 
-                       elem.setAttribute( name, name.toLowerCase() );
+function createSafeFragment( document ) {
+       var list = nodeNames.split( "|" ),
+               safeFrag = document.createDocumentFragment();
+
+       if ( safeFrag.createElement ) {
+               while ( list.length ) {
+                       safeFrag.createElement(
+                               list.pop()
+                       );
                }
-               return name;
        }
-};
+       return safeFrag;
+}
 
-// IE6/7 do not support getting/setting some attributes with get/setAttribute
-if ( !getSetAttribute ) {
+var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
+               "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
+       rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
+       rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
+       rleadingWhitespace = /^\s+/,
+       rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
+       rtagName = /<([\w:]+)/,
+       rtbody = /<tbody/i,
+       rhtml = /<|&#?\w+;/,
+       rnoInnerhtml = /<(?:script|style|link)/i,
+       // checked="checked" or checked
+       rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+       rscriptType = /^$|\/(?:java|ecma)script/i,
+       rscriptTypeMasked = /^true\/(.*)/,
+       rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
 
-       fixSpecified = {
-               name: true,
-               id: true,
-               coords: true
-       };
+       // We have to close these tags to support XHTML (#13200)
+       wrapMap = {
+               option: [ 1, "<select multiple='multiple'>", "</select>" ],
+               legend: [ 1, "<fieldset>", "</fieldset>" ],
+               area: [ 1, "<map>", "</map>" ],
+               param: [ 1, "<object>", "</object>" ],
+               thead: [ 1, "<table>", "</table>" ],
+               tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+               col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
+               td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
 
-       // Use this for any attribute in IE6/7
-       // This fixes almost every IE6/7 issue
-       nodeHook = jQuery.valHooks.button = {
-               get: function( elem, name ) {
-                       var ret;
-                       ret = elem.getAttributeNode( name );
-                       return ret && ( fixSpecified[ name ] ? ret.value !== "" : ret.specified ) ?
-                               ret.value :
-                               undefined;
-               },
-               set: function( elem, value, name ) {
-                       // Set the existing or create a new attribute node
-                       var ret = elem.getAttributeNode( name );
-                       if ( !ret ) {
-                               ret = document.createAttribute( name );
-                               elem.setAttributeNode( ret );
-                       }
-                       return ( ret.value = value + "" );
-               }
-       };
+               // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
+               // unless wrapped in a div with non-breaking characters in front of it.
+               _default: support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X<div>", "</div>"  ]
+       },
+       safeFragment = createSafeFragment( document ),
+       fragmentDiv = safeFragment.appendChild( document.createElement("div") );
 
-       // Set width and height to auto instead of 0 on empty string( Bug #8150 )
-       // This is for removals
-       jQuery.each([ "width", "height" ], function( i, name ) {
-               jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
-                       set: function( elem, value ) {
-                               if ( value === "" ) {
-                                       elem.setAttribute( name, "auto" );
-                                       return value;
-                               }
-                       }
-               });
-       });
+wrapMap.optgroup = wrapMap.option;
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
 
-       // Set contenteditable to false on removals(#10429)
-       // Setting to empty string throws an error as an invalid value
-       jQuery.attrHooks.contenteditable = {
-               get: nodeHook.get,
-               set: function( elem, value, name ) {
-                       if ( value === "" ) {
-                               value = "false";
+function getAll( context, tag ) {
+       var elems, elem,
+               i = 0,
+               found = typeof context.getElementsByTagName !== strundefined ? context.getElementsByTagName( tag || "*" ) :
+                       typeof context.querySelectorAll !== strundefined ? context.querySelectorAll( tag || "*" ) :
+                       undefined;
+
+       if ( !found ) {
+               for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) {
+                       if ( !tag || jQuery.nodeName( elem, tag ) ) {
+                               found.push( elem );
+                       } else {
+                               jQuery.merge( found, getAll( elem, tag ) );
                        }
-                       nodeHook.set( elem, value, name );
                }
-       };
+       }
+
+       return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
+               jQuery.merge( [ context ], found ) :
+               found;
+}
+
+// Used in buildFragment, fixes the defaultChecked property
+function fixDefaultChecked( elem ) {
+       if ( rcheckableType.test( elem.type ) ) {
+               elem.defaultChecked = elem.checked;
+       }
 }
 
+// Support: IE<8
+// Manipulating tables requires a tbody
+function manipulationTarget( elem, content ) {
+       return jQuery.nodeName( elem, "table" ) &&
+               jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ?
 
-// Some attributes require a special call on IE
-if ( !jQuery.support.hrefNormalized ) {
-       jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
-               jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
-                       get: function( elem ) {
-                               var ret = elem.getAttribute( name, 2 );
-                               return ret === null ? undefined : ret;
-                       }
-               });
-       });
+               elem.getElementsByTagName("tbody")[0] ||
+                       elem.appendChild( elem.ownerDocument.createElement("tbody") ) :
+               elem;
 }
 
-if ( !jQuery.support.style ) {
-       jQuery.attrHooks.style = {
-               get: function( elem ) {
-                       // Return undefined in the case of empty string
-                       // Normalize to lowercase since IE uppercases css property names
-                       return elem.style.cssText.toLowerCase() || undefined;
-               },
-               set: function( elem, value ) {
-                       return ( elem.style.cssText = value + "" );
-               }
-       };
+// Replace/restore the type attribute of script elements for safe DOM manipulation
+function disableScript( elem ) {
+       elem.type = (jQuery.find.attr( elem, "type" ) !== null) + "/" + elem.type;
+       return elem;
+}
+function restoreScript( elem ) {
+       var match = rscriptTypeMasked.exec( elem.type );
+       if ( match ) {
+               elem.type = match[1];
+       } else {
+               elem.removeAttribute("type");
+       }
+       return elem;
 }
 
-// Safari mis-reports the default selected property of an option
-// Accessing the parent's selectedIndex property fixes it
-if ( !jQuery.support.optSelected ) {
-       jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
-               get: function( elem ) {
-                       var parent = elem.parentNode;
+// Mark scripts as having already been evaluated
+function setGlobalEval( elems, refElements ) {
+       var elem,
+               i = 0;
+       for ( ; (elem = elems[i]) != null; i++ ) {
+               jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) );
+       }
+}
 
-                       if ( parent ) {
-                               parent.selectedIndex;
+function cloneCopyEvent( src, dest ) {
 
-                               // Make sure that it also works with optgroups, see #5701
-                               if ( parent.parentNode ) {
-                                       parent.parentNode.selectedIndex;
-                               }
+       if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
+               return;
+       }
+
+       var type, i, l,
+               oldData = jQuery._data( src ),
+               curData = jQuery._data( dest, oldData ),
+               events = oldData.events;
+
+       if ( events ) {
+               delete curData.handle;
+               curData.events = {};
+
+               for ( type in events ) {
+                       for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+                               jQuery.event.add( dest, type, events[ type ][ i ] );
                        }
-                       return null;
                }
-       });
-}
+       }
 
-// IE6/7 call enctype encoding
-if ( !jQuery.support.enctype ) {
-       jQuery.propFix.enctype = "encoding";
+       // make the cloned public data object a copy from the original
+       if ( curData.data ) {
+               curData.data = jQuery.extend( {}, curData.data );
+       }
 }
 
-// Radios and checkboxes getter/setter
-if ( !jQuery.support.checkOn ) {
-       jQuery.each([ "radio", "checkbox" ], function() {
-               jQuery.valHooks[ this ] = {
-                       get: function( elem ) {
-                               // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
-                               return elem.getAttribute("value") === null ? "on" : elem.value;
-                       }
-               };
-       });
-}
-jQuery.each([ "radio", "checkbox" ], function() {
-       jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
-               set: function( elem, value ) {
-                       if ( jQuery.isArray( value ) ) {
-                               return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
-                       }
-               }
-       });
-});
-var rformElems = /^(?:textarea|input|select)$/i,
-       rtypenamespace = /^([^\.]*|)(?:\.(.+)|)$/,
-       rhoverHack = /(?:^|\s)hover(\.\S+|)\b/,
-       rkeyEvent = /^key/,
-       rmouseEvent = /^(?:mouse|contextmenu)|click/,
-       rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
-       hoverHack = function( events ) {
-               return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
-       };
+function fixCloneNodeIssues( src, dest ) {
+       var nodeName, e, data;
 
-/*
- * Helper functions for managing events -- not part of the public interface.
- * Props to Dean Edwards' addEvent library for many of the ideas.
- */
-jQuery.event = {
+       // We do not need to do anything for non-Elements
+       if ( dest.nodeType !== 1 ) {
+               return;
+       }
 
-       add: function( elem, types, handler, data, selector ) {
+       nodeName = dest.nodeName.toLowerCase();
 
-               var elemData, eventHandle, events,
-                       t, tns, type, namespaces, handleObj,
-                       handleObjIn, handlers, special;
+       // IE6-8 copies events bound via attachEvent when using cloneNode.
+       if ( !support.noCloneEvent && dest[ jQuery.expando ] ) {
+               data = jQuery._data( dest );
 
-               // Don't attach events to noData or text/comment nodes (allow plain objects tho)
-               if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
-                       return;
+               for ( e in data.events ) {
+                       jQuery.removeEvent( dest, e, data.handle );
                }
 
-               // Caller can pass in an object of custom data in lieu of the handler
-               if ( handler.handler ) {
-                       handleObjIn = handler;
-                       handler = handleObjIn.handler;
-                       selector = handleObjIn.selector;
-               }
+               // Event data gets referenced instead of copied if the expando gets copied too
+               dest.removeAttribute( jQuery.expando );
+       }
 
-               // Make sure that the handler has a unique ID, used to find/remove it later
-               if ( !handler.guid ) {
-                       handler.guid = jQuery.guid++;
-               }
+       // IE blanks contents when cloning scripts, and tries to evaluate newly-set text
+       if ( nodeName === "script" && dest.text !== src.text ) {
+               disableScript( dest ).text = src.text;
+               restoreScript( dest );
 
-               // Init the element's event structure and main handler, if this is the first
-               events = elemData.events;
-               if ( !events ) {
-                       elemData.events = events = {};
+       // IE6-10 improperly clones children of object elements using classid.
+       // IE10 throws NoModificationAllowedError if parent is null, #12132.
+       } else if ( nodeName === "object" ) {
+               if ( dest.parentNode ) {
+                       dest.outerHTML = src.outerHTML;
                }
-               eventHandle = elemData.handle;
-               if ( !eventHandle ) {
-                       elemData.handle = eventHandle = function( e ) {
-                               // Discard the second event of a jQuery.event.trigger() and
-                               // when an event is called after a page has unloaded
-                               return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
-                                       jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
-                                       undefined;
-                       };
-                       // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
-                       eventHandle.elem = elem;
+
+               // This path appears unavoidable for IE9. When cloning an object
+               // element in IE9, the outerHTML strategy above is not sufficient.
+               // If the src has innerHTML and the destination does not,
+               // copy the src.innerHTML into the dest.innerHTML. #10324
+               if ( support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) {
+                       dest.innerHTML = src.innerHTML;
                }
 
-               // Handle multiple events separated by a space
-               // jQuery(...).bind("mouseover mouseout", fn);
-               types = jQuery.trim( hoverHack(types) ).split( " " );
-               for ( t = 0; t < types.length; t++ ) {
+       } else if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
+               // IE6-8 fails to persist the checked state of a cloned checkbox
+               // or radio button. Worse, IE6-7 fail to give the cloned element
+               // a checked appearance if the defaultChecked value isn't also set
 
-                       tns = rtypenamespace.exec( types[t] ) || [];
-                       type = tns[1];
-                       namespaces = ( tns[2] || "" ).split( "." ).sort();
+               dest.defaultChecked = dest.checked = src.checked;
 
-                       // If event changes its type, use the special event handlers for the changed type
-                       special = jQuery.event.special[ type ] || {};
+               // IE6-7 get confused and end up setting the value of a cloned
+               // checkbox/radio button to an empty string instead of "on"
+               if ( dest.value !== src.value ) {
+                       dest.value = src.value;
+               }
 
-                       // If selector defined, determine special event api type, otherwise given type
-                       type = ( selector ? special.delegateType : special.bindType ) || type;
+       // IE6-8 fails to return the selected option to the default selected
+       // state when cloning options
+       } else if ( nodeName === "option" ) {
+               dest.defaultSelected = dest.selected = src.defaultSelected;
 
-                       // Update special based on newly reset type
-                       special = jQuery.event.special[ type ] || {};
+       // IE6-8 fails to set the defaultValue to the correct value when
+       // cloning other types of input fields
+       } else if ( nodeName === "input" || nodeName === "textarea" ) {
+               dest.defaultValue = src.defaultValue;
+       }
+}
 
-                       // handleObj is passed to all event handlers
-                       handleObj = jQuery.extend({
-                               type: type,
-                               origType: tns[1],
-                               data: data,
-                               handler: handler,
-                               guid: handler.guid,
-                               selector: selector,
-                               needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
-                               namespace: namespaces.join(".")
-                       }, handleObjIn );
+jQuery.extend({
+       clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+               var destElements, node, clone, i, srcElements,
+                       inPage = jQuery.contains( elem.ownerDocument, elem );
 
-                       // Init the event handler queue if we're the first
-                       handlers = events[ type ];
-                       if ( !handlers ) {
-                               handlers = events[ type ] = [];
-                               handlers.delegateCount = 0;
+               if ( support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
+                       clone = elem.cloneNode( true );
 
-                               // Only use addEventListener/attachEvent if the special events handler returns false
-                               if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
-                                       // Bind the global event handler to the element
-                                       if ( elem.addEventListener ) {
-                                               elem.addEventListener( type, eventHandle, false );
+               // IE<=8 does not properly clone detached, unknown element nodes
+               } else {
+                       fragmentDiv.innerHTML = elem.outerHTML;
+                       fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
+               }
 
-                                       } else if ( elem.attachEvent ) {
-                                               elem.attachEvent( "on" + type, eventHandle );
-                                       }
-                               }
-                       }
+               if ( (!support.noCloneEvent || !support.noCloneChecked) &&
+                               (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
 
-                       if ( special.add ) {
-                               special.add.call( elem, handleObj );
+                       // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
+                       destElements = getAll( clone );
+                       srcElements = getAll( elem );
 
-                               if ( !handleObj.handler.guid ) {
-                                       handleObj.handler.guid = handler.guid;
+                       // Fix all IE cloning issues
+                       for ( i = 0; (node = srcElements[i]) != null; ++i ) {
+                               // Ensure that the destination node is not null; Fixes #9587
+                               if ( destElements[i] ) {
+                                       fixCloneNodeIssues( node, destElements[i] );
                                }
                        }
+               }
 
-                       // Add to the element's handler list, delegates in front
-                       if ( selector ) {
-                               handlers.splice( handlers.delegateCount++, 0, handleObj );
+               // Copy the events from the original to the clone
+               if ( dataAndEvents ) {
+                       if ( deepDataAndEvents ) {
+                               srcElements = srcElements || getAll( elem );
+                               destElements = destElements || getAll( clone );
+
+                               for ( i = 0; (node = srcElements[i]) != null; i++ ) {
+                                       cloneCopyEvent( node, destElements[i] );
+                               }
                        } else {
-                               handlers.push( handleObj );
+                               cloneCopyEvent( elem, clone );
                        }
+               }
 
-                       // Keep track of which events have ever been used, for event optimization
-                       jQuery.event.global[ type ] = true;
+               // Preserve script evaluation history
+               destElements = getAll( clone, "script" );
+               if ( destElements.length > 0 ) {
+                       setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
                }
 
-               // Nullify elem to prevent memory leaks in IE
-               elem = null;
+               destElements = srcElements = node = null;
+
+               // Return the cloned set
+               return clone;
        },
 
-       global: {},
+       buildFragment: function( elems, context, scripts, selection ) {
+               var j, elem, contains,
+                       tmp, tag, tbody, wrap,
+                       l = elems.length,
 
-       // Detach an event or set of events from an element
-       remove: function( elem, types, handler, selector, mappedTypes ) {
+                       // Ensure a safe fragment
+                       safe = createSafeFragment( context ),
 
-               var t, tns, type, origType, namespaces, origCount,
-                       j, events, special, eventType, handleObj,
-                       elemData = jQuery.hasData( elem ) && jQuery._data( elem );
+                       nodes = [],
+                       i = 0;
 
-               if ( !elemData || !(events = elemData.events) ) {
-                       return;
-               }
+               for ( ; i < l; i++ ) {
+                       elem = elems[ i ];
 
-               // Once for each type.namespace in types; type may be omitted
-               types = jQuery.trim( hoverHack( types || "" ) ).split(" ");
-               for ( t = 0; t < types.length; t++ ) {
-                       tns = rtypenamespace.exec( types[t] ) || [];
-                       type = origType = tns[1];
-                       namespaces = tns[2];
+                       if ( elem || elem === 0 ) {
 
-                       // Unbind all events (on this namespace, if provided) for the element
-                       if ( !type ) {
-                               for ( type in events ) {
-                                       jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+                               // Add nodes directly
+                               if ( jQuery.type( elem ) === "object" ) {
+                                       jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
+
+                               // Convert non-html into a text node
+                               } else if ( !rhtml.test( elem ) ) {
+                                       nodes.push( context.createTextNode( elem ) );
+
+                               // Convert html into DOM nodes
+                               } else {
+                                       tmp = tmp || safe.appendChild( context.createElement("div") );
+
+                                       // Deserialize a standard representation
+                                       tag = (rtagName.exec( elem ) || [ "", "" ])[ 1 ].toLowerCase();
+                                       wrap = wrapMap[ tag ] || wrapMap._default;
+
+                                       tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1></$2>" ) + wrap[2];
+
+                                       // Descend through wrappers to the right content
+                                       j = wrap[0];
+                                       while ( j-- ) {
+                                               tmp = tmp.lastChild;
+                                       }
+
+                                       // Manually add leading whitespace removed by IE
+                                       if ( !support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
+                                               nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) );
+                                       }
+
+                                       // Remove IE's autoinserted <tbody> from table fragments
+                                       if ( !support.tbody ) {
+
+                                               // String was a <table>, *may* have spurious <tbody>
+                                               elem = tag === "table" && !rtbody.test( elem ) ?
+                                                       tmp.firstChild :
+
+                                                       // String was a bare <thead> or <tfoot>
+                                                       wrap[1] === "<table>" && !rtbody.test( elem ) ?
+                                                               tmp :
+                                                               0;
+
+                                               j = elem && elem.childNodes.length;
+                                               while ( j-- ) {
+                                                       if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) {
+                                                               elem.removeChild( tbody );
+                                                       }
+                                               }
+                                       }
+
+                                       jQuery.merge( nodes, tmp.childNodes );
+
+                                       // Fix #12392 for WebKit and IE > 9
+                                       tmp.textContent = "";
+
+                                       // Fix #12392 for oldIE
+                                       while ( tmp.firstChild ) {
+                                               tmp.removeChild( tmp.firstChild );
+                                       }
+
+                                       // Remember the top-level container for proper cleanup
+                                       tmp = safe.lastChild;
                                }
+                       }
+               }
+
+               // Fix #11356: Clear elements from fragment
+               if ( tmp ) {
+                       safe.removeChild( tmp );
+               }
+
+               // Reset defaultChecked for any radios and checkboxes
+               // about to be appended to the DOM in IE 6/7 (#8060)
+               if ( !support.appendChecked ) {
+                       jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked );
+               }
+
+               i = 0;
+               while ( (elem = nodes[ i++ ]) ) {
+
+                       // #4087 - If origin and destination elements are the same, and this is
+                       // that element, do not do anything
+                       if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {
                                continue;
                        }
 
-                       special = jQuery.event.special[ type ] || {};
-                       type = ( selector? special.delegateType : special.bindType ) || type;
-                       eventType = events[ type ] || [];
-                       origCount = eventType.length;
-                       namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
-
-                       // Remove matching events
-                       for ( j = 0; j < eventType.length; j++ ) {
-                               handleObj = eventType[ j ];
+                       contains = jQuery.contains( elem.ownerDocument, elem );
 
-                               if ( ( mappedTypes || origType === handleObj.origType ) &&
-                                        ( !handler || handler.guid === handleObj.guid ) &&
-                                        ( !namespaces || namespaces.test( handleObj.namespace ) ) &&
-                                        ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
-                                       eventType.splice( j--, 1 );
+                       // Append to fragment
+                       tmp = getAll( safe.appendChild( elem ), "script" );
 
-                                       if ( handleObj.selector ) {
-                                               eventType.delegateCount--;
-                                       }
-                                       if ( special.remove ) {
-                                               special.remove.call( elem, handleObj );
-                                       }
-                               }
+                       // Preserve script evaluation history
+                       if ( contains ) {
+                               setGlobalEval( tmp );
                        }
 
-                       // Remove generic event handler if we removed something and no more handlers exist
-                       // (avoids potential for endless recursion during removal of special event handlers)
-                       if ( eventType.length === 0 && origCount !== eventType.length ) {
-                               if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
-                                       jQuery.removeEvent( elem, type, elemData.handle );
+                       // Capture executables
+                       if ( scripts ) {
+                               j = 0;
+                               while ( (elem = tmp[ j++ ]) ) {
+                                       if ( rscriptType.test( elem.type || "" ) ) {
+                                               scripts.push( elem );
+                                       }
                                }
-
-                               delete events[ type ];
                        }
                }
 
-               // Remove the expando if it's no longer used
-               if ( jQuery.isEmptyObject( events ) ) {
-                       delete elemData.handle;
+               tmp = null;
 
-                       // removeData also checks for emptiness and clears the expando if empty
-                       // so use it instead of delete
-                       jQuery.removeData( elem, "events", true );
-               }
+               return safe;
        },
 
-       // Events that are safe to short-circuit if no handlers are attached.
-       // Native DOM events should not be added, they may have inline handlers.
-       customEvent: {
-               "getData": true,
-               "setData": true,
-               "changeData": true
-       },
+       cleanData: function( elems, /* internal */ acceptData ) {
+               var elem, type, id, data,
+                       i = 0,
+                       internalKey = jQuery.expando,
+                       cache = jQuery.cache,
+                       deleteExpando = support.deleteExpando,
+                       special = jQuery.event.special;
 
-       trigger: function( event, data, elem, onlyHandlers ) {
-               // Don't do events on text and comment nodes
-               if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
-                       return;
-               }
+               for ( ; (elem = elems[i]) != null; i++ ) {
+                       if ( acceptData || jQuery.acceptData( elem ) ) {
 
-               // Event object or event type
-               var cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType,
-                       type = event.type || event,
-                       namespaces = [];
+                               id = elem[ internalKey ];
+                               data = id && cache[ id ];
 
-               // focus/blur morphs to focusin/out; ensure we're not firing them right now
-               if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
-                       return;
-               }
+                               if ( data ) {
+                                       if ( data.events ) {
+                                               for ( type in data.events ) {
+                                                       if ( special[ type ] ) {
+                                                               jQuery.event.remove( elem, type );
 
-               if ( type.indexOf( "!" ) >= 0 ) {
-                       // Exclusive events trigger only for the exact event (no namespaces)
-                       type = type.slice(0, -1);
-                       exclusive = true;
-               }
+                                                       // This is a shortcut to avoid jQuery.event.remove's overhead
+                                                       } else {
+                                                               jQuery.removeEvent( elem, type, data.handle );
+                                                       }
+                                               }
+                                       }
 
-               if ( type.indexOf( "." ) >= 0 ) {
-                       // Namespaced trigger; create a regexp to match event type in handle()
-                       namespaces = type.split(".");
-                       type = namespaces.shift();
-                       namespaces.sort();
-               }
+                                       // Remove cache only if it was not already removed by jQuery.event.remove
+                                       if ( cache[ id ] ) {
 
-               if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
-                       // No jQuery handlers for this event type, and it can't have inline handlers
-                       return;
-               }
+                                               delete cache[ id ];
 
-               // Caller can pass in an Event, Object, or just an event type string
-               event = typeof event === "object" ?
-                       // jQuery.Event object
-                       event[ jQuery.expando ] ? event :
-                       // Object literal
-                       new jQuery.Event( type, event ) :
-                       // Just the event type (string)
-                       new jQuery.Event( type );
+                                               // IE does not allow us to delete expando properties from nodes,
+                                               // nor does it have a removeAttribute function on Document nodes;
+                                               // we must handle all of these cases
+                                               if ( deleteExpando ) {
+                                                       delete elem[ internalKey ];
 
-               event.type = type;
-               event.isTrigger = true;
-               event.exclusive = exclusive;
-               event.namespace = namespaces.join( "." );
-               event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
-               ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
+                                               } else if ( typeof elem.removeAttribute !== strundefined ) {
+                                                       elem.removeAttribute( internalKey );
 
-               // Handle a global trigger
-               if ( !elem ) {
+                                               } else {
+                                                       elem[ internalKey ] = null;
+                                               }
 
-                       // TODO: Stop taunting the data cache; remove global events and always attach to document
-                       cache = jQuery.cache;
-                       for ( i in cache ) {
-                               if ( cache[ i ].events && cache[ i ].events[ type ] ) {
-                                       jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );
+                                               deletedIds.push( id );
+                                       }
                                }
                        }
-                       return;
                }
+       }
+});
 
-               // Clean up the event in case it is being reused
-               event.result = undefined;
-               if ( !event.target ) {
-                       event.target = elem;
-               }
+jQuery.fn.extend({
+       text: function( value ) {
+               return access( this, function( value ) {
+                       return value === undefined ?
+                               jQuery.text( this ) :
+                               this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
+               }, null, value, arguments.length );
+       },
 
-               // Clone any incoming data and prepend the event, creating the handler arg list
-               data = data != null ? jQuery.makeArray( data ) : [];
-               data.unshift( event );
+       append: function() {
+               return this.domManip( arguments, function( elem ) {
+                       if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+                               var target = manipulationTarget( this, elem );
+                               target.appendChild( elem );
+                       }
+               });
+       },
 
-               // Allow special events to draw outside the lines
-               special = jQuery.event.special[ type ] || {};
-               if ( special.trigger && special.trigger.apply( elem, data ) === false ) {
-                       return;
-               }
+       prepend: function() {
+               return this.domManip( arguments, function( elem ) {
+                       if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+                               var target = manipulationTarget( this, elem );
+                               target.insertBefore( elem, target.firstChild );
+                       }
+               });
+       },
 
-               // Determine event propagation path in advance, per W3C events spec (#9951)
-               // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
-               eventPath = [[ elem, special.bindType || type ]];
-               if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+       before: function() {
+               return this.domManip( arguments, function( elem ) {
+                       if ( this.parentNode ) {
+                               this.parentNode.insertBefore( elem, this );
+                       }
+               });
+       },
 
-                       bubbleType = special.delegateType || type;
-                       cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
-                       for ( old = elem; cur; cur = cur.parentNode ) {
-                               eventPath.push([ cur, bubbleType ]);
-                               old = cur;
+       after: function() {
+               return this.domManip( arguments, function( elem ) {
+                       if ( this.parentNode ) {
+                               this.parentNode.insertBefore( elem, this.nextSibling );
+                       }
+               });
+       },
+
+       remove: function( selector, keepData /* Internal Use Only */ ) {
+               var elem,
+                       elems = selector ? jQuery.filter( selector, this ) : this,
+                       i = 0;
+
+               for ( ; (elem = elems[i]) != null; i++ ) {
+
+                       if ( !keepData && elem.nodeType === 1 ) {
+                               jQuery.cleanData( getAll( elem ) );
                        }
 
-                       // Only add window if we got to document (e.g., not plain obj or detached DOM)
-                       if ( old === (elem.ownerDocument || document) ) {
-                               eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
+                       if ( elem.parentNode ) {
+                               if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {
+                                       setGlobalEval( getAll( elem, "script" ) );
+                               }
+                               elem.parentNode.removeChild( elem );
                        }
                }
 
-               // Fire handlers on the event path
-               for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
+               return this;
+       },
 
-                       cur = eventPath[i][0];
-                       event.type = eventPath[i][1];
+       empty: function() {
+               var elem,
+                       i = 0;
 
-                       handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
-                       if ( handle ) {
-                               handle.apply( cur, data );
+               for ( ; (elem = this[i]) != null; i++ ) {
+                       // Remove element nodes and prevent memory leaks
+                       if ( elem.nodeType === 1 ) {
+                               jQuery.cleanData( getAll( elem, false ) );
                        }
-                       // Note that this is a bare JS function and not a jQuery handler
-                       handle = ontype && cur[ ontype ];
-                       if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {
-                               event.preventDefault();
+
+                       // Remove any remaining nodes
+                       while ( elem.firstChild ) {
+                               elem.removeChild( elem.firstChild );
+                       }
+
+                       // If this is a select, ensure that it displays empty (#12336)
+                       // Support: IE<9
+                       if ( elem.options && jQuery.nodeName( elem, "select" ) ) {
+                               elem.options.length = 0;
                        }
                }
-               event.type = type;
 
-               // If nobody prevented the default action, do it now
-               if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+               return this;
+       },
 
-                       if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
-                               !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
+       clone: function( dataAndEvents, deepDataAndEvents ) {
+               dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+               deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
 
-                               // Call a native DOM method on the target with the same name name as the event.
-                               // Can't use an .isFunction() check here because IE6/7 fails that test.
-                               // Don't do default actions on window, that's where global variables be (#6170)
-                               // IE<9 dies on focus/blur to hidden element (#1486)
-                               if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
+               return this.map(function() {
+                       return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+               });
+       },
 
-                                       // Don't re-trigger an onFOO event when we call its FOO() method
-                                       old = elem[ ontype ];
+       html: function( value ) {
+               return access( this, function( value ) {
+                       var elem = this[ 0 ] || {},
+                               i = 0,
+                               l = this.length;
 
-                                       if ( old ) {
-                                               elem[ ontype ] = null;
-                                       }
+                       if ( value === undefined ) {
+                               return elem.nodeType === 1 ?
+                                       elem.innerHTML.replace( rinlinejQuery, "" ) :
+                                       undefined;
+                       }
 
-                                       // Prevent re-triggering of the same event, since we already bubbled it above
-                                       jQuery.event.triggered = type;
-                                       elem[ type ]();
-                                       jQuery.event.triggered = undefined;
+                       // See if we can take a shortcut and just use innerHTML
+                       if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+                               ( support.htmlSerialize || !rnoshimcache.test( value )  ) &&
+                               ( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
+                               !wrapMap[ (rtagName.exec( value ) || [ "", "" ])[ 1 ].toLowerCase() ] ) {
+
+                               value = value.replace( rxhtmlTag, "<$1></$2>" );
 
-                                       if ( old ) {
-                                               elem[ ontype ] = old;
+                               try {
+                                       for (; i < l; i++ ) {
+                                               // Remove element nodes and prevent memory leaks
+                                               elem = this[i] || {};
+                                               if ( elem.nodeType === 1 ) {
+                                                       jQuery.cleanData( getAll( elem, false ) );
+                                                       elem.innerHTML = value;
+                                               }
                                        }
-                               }
+
+                                       elem = 0;
+
+                               // If using innerHTML throws an exception, use the fallback method
+                               } catch(e) {}
                        }
-               }
 
-               return event.result;
+                       if ( elem ) {
+                               this.empty().append( value );
+                       }
+               }, null, value, arguments.length );
        },
 
-       dispatch: function( event ) {
+       replaceWith: function() {
+               var arg = arguments[ 0 ];
 
-               // Make a writable jQuery.Event from the native event object
-               event = jQuery.event.fix( event || window.event );
+               // Make the changes, replacing each context element with the new content
+               this.domManip( arguments, function( elem ) {
+                       arg = this.parentNode;
 
-               var i, j, cur, ret, selMatch, matched, matches, handleObj, sel, related,
-                       handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
-                       delegateCount = handlers.delegateCount,
-                       args = core_slice.call( arguments ),
-                       run_all = !event.exclusive && !event.namespace,
-                       special = jQuery.event.special[ event.type ] || {},
-                       handlerQueue = [];
+                       jQuery.cleanData( getAll( this ) );
 
-               // Use the fix-ed jQuery.Event rather than the (read-only) native event
-               args[0] = event;
-               event.delegateTarget = this;
+                       if ( arg ) {
+                               arg.replaceChild( elem, this );
+                       }
+               });
 
-               // Call the preDispatch hook for the mapped type, and let it bail if desired
-               if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
-                       return;
-               }
+               // Force removal if there was no new content (e.g., from empty arguments)
+               return arg && (arg.length || arg.nodeType) ? this : this.remove();
+       },
 
-               // Determine handlers that should run if there are delegated events
-               // Avoid non-left-click bubbling in Firefox (#3861)
-               if ( delegateCount && !(event.button && event.type === "click") ) {
+       detach: function( selector ) {
+               return this.remove( selector, true );
+       },
 
-                       for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
+       domManip: function( args, callback ) {
 
-                               // Don't process clicks (ONLY) on disabled elements (#6911, #8165, #11382, #11764)
-                               if ( cur.disabled !== true || event.type !== "click" ) {
-                                       selMatch = {};
-                                       matches = [];
-                                       for ( i = 0; i < delegateCount; i++ ) {
-                                               handleObj = handlers[ i ];
-                                               sel = handleObj.selector;
+               // Flatten any nested arrays
+               args = concat.apply( [], args );
 
-                                               if ( selMatch[ sel ] === undefined ) {
-                                                       selMatch[ sel ] = handleObj.needsContext ?
-                                                               jQuery( sel, this ).index( cur ) >= 0 :
-                                                               jQuery.find( sel, this, null, [ cur ] ).length;
-                                               }
-                                               if ( selMatch[ sel ] ) {
-                                                       matches.push( handleObj );
-                                               }
-                                       }
-                                       if ( matches.length ) {
-                                               handlerQueue.push({ elem: cur, matches: matches });
-                                       }
+               var first, node, hasScripts,
+                       scripts, doc, fragment,
+                       i = 0,
+                       l = this.length,
+                       set = this,
+                       iNoClone = l - 1,
+                       value = args[0],
+                       isFunction = jQuery.isFunction( value );
+
+               // We can't cloneNode fragments that contain checked, in WebKit
+               if ( isFunction ||
+                               ( l > 1 && typeof value === "string" &&
+                                       !support.checkClone && rchecked.test( value ) ) ) {
+                       return this.each(function( index ) {
+                               var self = set.eq( index );
+                               if ( isFunction ) {
+                                       args[0] = value.call( this, index, self.html() );
                                }
-                       }
+                               self.domManip( args, callback );
+                       });
                }
 
-               // Add the remaining (directly-bound) handlers
-               if ( handlers.length > delegateCount ) {
-                       handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
-               }
+               if ( l ) {
+                       fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );
+                       first = fragment.firstChild;
 
-               // Run delegates first; they may want to stop propagation beneath us
-               for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
-                       matched = handlerQueue[ i ];
-                       event.currentTarget = matched.elem;
+                       if ( fragment.childNodes.length === 1 ) {
+                               fragment = first;
+                       }
 
-                       for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
-                               handleObj = matched.matches[ j ];
+                       if ( first ) {
+                               scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
+                               hasScripts = scripts.length;
 
-                               // Triggered event must either 1) be non-exclusive and have no namespace, or
-                               // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
-                               if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
+                               // Use the original fragment for the last item instead of the first because it can end up
+                               // being emptied incorrectly in certain situations (#8070).
+                               for ( ; i < l; i++ ) {
+                                       node = fragment;
 
-                                       event.data = handleObj.data;
-                                       event.handleObj = handleObj;
+                                       if ( i !== iNoClone ) {
+                                               node = jQuery.clone( node, true, true );
+
+                                               // Keep references to cloned scripts for later restoration
+                                               if ( hasScripts ) {
+                                                       jQuery.merge( scripts, getAll( node, "script" ) );
+                                               }
+                                       }
+
+                                       callback.call( this[i], node, i );
+                               }
+
+                               if ( hasScripts ) {
+                                       doc = scripts[ scripts.length - 1 ].ownerDocument;
 
-                                       ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
-                                                       .apply( matched.elem, args );
+                                       // Reenable scripts
+                                       jQuery.map( scripts, restoreScript );
 
-                                       if ( ret !== undefined ) {
-                                               event.result = ret;
-                                               if ( ret === false ) {
-                                                       event.preventDefault();
-                                                       event.stopPropagation();
+                                       // Evaluate executable scripts on first document insertion
+                                       for ( i = 0; i < hasScripts; i++ ) {
+                                               node = scripts[ i ];
+                                               if ( rscriptType.test( node.type || "" ) &&
+                                                       !jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) {
+
+                                                       if ( node.src ) {
+                                                               // Optional AJAX dependency, but won't run scripts if not present
+                                                               if ( jQuery._evalUrl ) {
+                                                                       jQuery._evalUrl( node.src );
+                                                               }
+                                                       } else {
+                                                               jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) );
+                                                       }
                                                }
                                        }
                                }
+
+                               // Fix #11809: Avoid leaking memory
+                               fragment = first = null;
                        }
                }
 
-               // Call the postDispatch hook for the mapped type
-               if ( special.postDispatch ) {
-                       special.postDispatch.call( this, event );
-               }
+               return this;
+       }
+});
 
-               return event.result;
-       },
+jQuery.each({
+       appendTo: "append",
+       prependTo: "prepend",
+       insertBefore: "before",
+       insertAfter: "after",
+       replaceAll: "replaceWith"
+}, function( name, original ) {
+       jQuery.fn[ name ] = function( selector ) {
+               var elems,
+                       i = 0,
+                       ret = [],
+                       insert = jQuery( selector ),
+                       last = insert.length - 1;
 
-       // Includes some event props shared by KeyEvent and MouseEvent
-       // *** attrChange attrName relatedNode srcElement  are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
-       props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
+               for ( ; i <= last; i++ ) {
+                       elems = i === last ? this : this.clone(true);
+                       jQuery( insert[i] )[ original ]( elems );
 
-       fixHooks: {},
+                       // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()
+                       push.apply( ret, elems.get() );
+               }
 
-       keyHooks: {
-               props: "char charCode key keyCode".split(" "),
-               filter: function( event, original ) {
+               return this.pushStack( ret );
+       };
+});
 
-                       // Add which for key events
-                       if ( event.which == null ) {
-                               event.which = original.charCode != null ? original.charCode : original.keyCode;
-                       }
 
-                       return event;
-               }
-       },
+var iframe,
+       elemdisplay = {};
 
-       mouseHooks: {
-               props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
-               filter: function( event, original ) {
-                       var eventDoc, doc, body,
-                               button = original.button,
-                               fromElement = original.fromElement;
+/**
+ * Retrieve the actual display of a element
+ * @param {String} name nodeName of the element
+ * @param {Object} doc Document object
+ */
+// Called only from within defaultDisplay
+function actualDisplay( name, doc ) {
+       var style,
+               elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
 
-                       // Calculate pageX/Y if missing and clientX/Y available
-                       if ( event.pageX == null && original.clientX != null ) {
-                               eventDoc = event.target.ownerDocument || document;
-                               doc = eventDoc.documentElement;
-                               body = eventDoc.body;
+               // getDefaultComputedStyle might be reliably used only on attached element
+               display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ?
 
-                               event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
-                               event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
-                       }
+                       // Use of this method is a temporary fix (more like optmization) until something better comes along,
+                       // since it was removed from specification and supported only in FF
+                       style.display : jQuery.css( elem[ 0 ], "display" );
 
-                       // Add relatedTarget, if necessary
-                       if ( !event.relatedTarget && fromElement ) {
-                               event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
-                       }
+       // We don't have any data stored on the element,
+       // so use "detach" method as fast way to get rid of the element
+       elem.detach();
 
-                       // Add which for click: 1 === left; 2 === middle; 3 === right
-                       // Note: button is not normalized, so don't use it
-                       if ( !event.which && button !== undefined ) {
-                               event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
-                       }
+       return display;
+}
 
-                       return event;
-               }
-       },
+/**
+ * Try to determine the default display value of an element
+ * @param {String} nodeName
+ */
+function defaultDisplay( nodeName ) {
+       var doc = document,
+               display = elemdisplay[ nodeName ];
 
-       fix: function( event ) {
-               if ( event[ jQuery.expando ] ) {
-                       return event;
-               }
+       if ( !display ) {
+               display = actualDisplay( nodeName, doc );
 
-               // Create a writable copy of the event object and normalize some properties
-               var i, prop,
-                       originalEvent = event,
-                       fixHook = jQuery.event.fixHooks[ event.type ] || {},
-                       copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
+               // If the simple way fails, read from inside an iframe
+               if ( display === "none" || !display ) {
 
-               event = jQuery.Event( originalEvent );
+                       // Use the already-created iframe if possible
+                       iframe = (iframe || jQuery( "<iframe frameborder='0' width='0' height='0'/>" )).appendTo( doc.documentElement );
 
-               for ( i = copy.length; i; ) {
-                       prop = copy[ --i ];
-                       event[ prop ] = originalEvent[ prop ];
-               }
+                       // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
+                       doc = ( iframe[ 0 ].contentWindow || iframe[ 0 ].contentDocument ).document;
 
-               // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
-               if ( !event.target ) {
-                       event.target = originalEvent.srcElement || document;
-               }
+                       // Support: IE
+                       doc.write();
+                       doc.close();
 
-               // Target should not be a text node (#504, Safari)
-               if ( event.target.nodeType === 3 ) {
-                       event.target = event.target.parentNode;
+                       display = actualDisplay( nodeName, doc );
+                       iframe.detach();
                }
 
-               // For mouse/key events, metaKey==false if it's undefined (#3368, #11328; IE6/7/8)
-               event.metaKey = !!event.metaKey;
-
-               return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
-       },
+               // Store the correct default display
+               elemdisplay[ nodeName ] = display;
+       }
 
-       special: {
-               load: {
-                       // Prevent triggered image.load events from bubbling to window.load
-                       noBubble: true
-               },
+       return display;
+}
 
-               focus: {
-                       delegateType: "focusin"
-               },
-               blur: {
-                       delegateType: "focusout"
-               },
 
-               beforeunload: {
-                       setup: function( data, namespaces, eventHandle ) {
-                               // We only want to do this special case on windows
-                               if ( jQuery.isWindow( this ) ) {
-                                       this.onbeforeunload = eventHandle;
-                               }
-                       },
+(function() {
+       var shrinkWrapBlocksVal;
 
-                       teardown: function( namespaces, eventHandle ) {
-                               if ( this.onbeforeunload === eventHandle ) {
-                                       this.onbeforeunload = null;
-                               }
-                       }
+       support.shrinkWrapBlocks = function() {
+               if ( shrinkWrapBlocksVal != null ) {
+                       return shrinkWrapBlocksVal;
                }
-       },
 
-       simulate: function( type, elem, event, bubble ) {
-               // Piggyback on a donor event to simulate a different one.
-               // Fake originalEvent to avoid donor's stopPropagation, but if the
-               // simulated event prevents default then we do the same on the donor.
-               var e = jQuery.extend(
-                       new jQuery.Event(),
-                       event,
-                       { type: type,
-                               isSimulated: true,
-                               originalEvent: {}
-                       }
-               );
-               if ( bubble ) {
-                       jQuery.event.trigger( e, null, elem );
-               } else {
-                       jQuery.event.dispatch.call( elem, e );
-               }
-               if ( e.isDefaultPrevented() ) {
-                       event.preventDefault();
-               }
-       }
-};
+               // Will be changed later if needed.
+               shrinkWrapBlocksVal = false;
 
-// Some plugins are using, but it's undocumented/deprecated and will be removed.
-// The 1.7 special event interface should provide all the hooks needed now.
-jQuery.event.handle = jQuery.event.dispatch;
+               // Minified: var b,c,d
+               var div, body, container;
 
-jQuery.removeEvent = document.removeEventListener ?
-       function( elem, type, handle ) {
-               if ( elem.removeEventListener ) {
-                       elem.removeEventListener( type, handle, false );
+               body = document.getElementsByTagName( "body" )[ 0 ];
+               if ( !body || !body.style ) {
+                       // Test fired too early or in an unsupported environment, exit.
+                       return;
                }
-       } :
-       function( elem, type, handle ) {
-               var name = "on" + type;
-
-               if ( elem.detachEvent ) {
 
-                       // #8545, #7054, preventing memory leaks for custom events in IE6-8
-                       // detachEvent needed property on element, by name of that event, to properly expose it to GC
-                       if ( typeof elem[ name ] === "undefined" ) {
-                               elem[ name ] = null;
-                       }
+               // Setup
+               div = document.createElement( "div" );
+               container = document.createElement( "div" );
+               container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px";
+               body.appendChild( container ).appendChild( div );
 
-                       elem.detachEvent( name, handle );
+               // Support: IE6
+               // Check if elements with layout shrink-wrap their children
+               if ( typeof div.style.zoom !== strundefined ) {
+                       // Reset CSS: box-sizing; display; margin; border
+                       div.style.cssText =
+                               // Support: Firefox<29, Android 2.3
+                               // Vendor-prefix box-sizing
+                               "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" +
+                               "box-sizing:content-box;display:block;margin:0;border:0;" +
+                               "padding:1px;width:1px;zoom:1";
+                       div.appendChild( document.createElement( "div" ) ).style.width = "5px";
+                       shrinkWrapBlocksVal = div.offsetWidth !== 3;
                }
-       };
 
-jQuery.Event = function( src, props ) {
-       // Allow instantiation without the 'new' keyword
-       if ( !(this instanceof jQuery.Event) ) {
-               return new jQuery.Event( src, props );
-       }
+               body.removeChild( container );
 
-       // Event object
-       if ( src && src.type ) {
-               this.originalEvent = src;
-               this.type = src.type;
+               return shrinkWrapBlocksVal;
+       };
 
-               // Events bubbling up the document may have been marked as prevented
-               // by a handler lower down the tree; reflect the correct value.
-               this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
-                       src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
+})();
+var rmargin = (/^margin/);
 
-       // Event type
-       } else {
-               this.type = src;
-       }
+var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
 
-       // Put explicitly provided properties onto the event object
-       if ( props ) {
-               jQuery.extend( this, props );
-       }
 
-       // Create a timestamp if incoming event doesn't have one
-       this.timeStamp = src && src.timeStamp || jQuery.now();
 
-       // Mark it as fixed
-       this[ jQuery.expando ] = true;
-};
+var getStyles, curCSS,
+       rposition = /^(top|right|bottom|left)$/;
 
-function returnFalse() {
-       return false;
-}
-function returnTrue() {
-       return true;
-}
+if ( window.getComputedStyle ) {
+       getStyles = function( elem ) {
+               return elem.ownerDocument.defaultView.getComputedStyle( elem, null );
+       };
 
-// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
-// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
-jQuery.Event.prototype = {
-       preventDefault: function() {
-               this.isDefaultPrevented = returnTrue;
+       curCSS = function( elem, name, computed ) {
+               var width, minWidth, maxWidth, ret,
+                       style = elem.style;
 
-               var e = this.originalEvent;
-               if ( !e ) {
-                       return;
-               }
+               computed = computed || getStyles( elem );
 
-               // if preventDefault exists run it on the original event
-               if ( e.preventDefault ) {
-                       e.preventDefault();
+               // getPropertyValue is only needed for .css('filter') in IE9, see #12537
+               ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined;
 
-               // otherwise set the returnValue property of the original event to false (IE)
-               } else {
-                       e.returnValue = false;
-               }
-       },
-       stopPropagation: function() {
-               this.isPropagationStopped = returnTrue;
+               if ( computed ) {
 
-               var e = this.originalEvent;
-               if ( !e ) {
-                       return;
-               }
-               // if stopPropagation exists run it on the original event
-               if ( e.stopPropagation ) {
-                       e.stopPropagation();
-               }
-               // otherwise set the cancelBubble property of the original event to true (IE)
-               e.cancelBubble = true;
-       },
-       stopImmediatePropagation: function() {
-               this.isImmediatePropagationStopped = returnTrue;
-               this.stopPropagation();
-       },
-       isDefaultPrevented: returnFalse,
-       isPropagationStopped: returnFalse,
-       isImmediatePropagationStopped: returnFalse
-};
+                       if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
+                               ret = jQuery.style( elem, name );
+                       }
 
-// Create mouseenter/leave events using mouseover/out and event-time checks
-jQuery.each({
-       mouseenter: "mouseover",
-       mouseleave: "mouseout"
-}, function( orig, fix ) {
-       jQuery.event.special[ orig ] = {
-               delegateType: fix,
-               bindType: fix,
+                       // A tribute to the "awesome hack by Dean Edwards"
+                       // Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right
+                       // Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
+                       // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
+                       if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
 
-               handle: function( event ) {
-                       var ret,
-                               target = this,
-                               related = event.relatedTarget,
-                               handleObj = event.handleObj,
-                               selector = handleObj.selector;
+                               // Remember the original values
+                               width = style.width;
+                               minWidth = style.minWidth;
+                               maxWidth = style.maxWidth;
 
-                       // For mousenter/leave call the handler if related is outside the target.
-                       // NB: No relatedTarget if the mouse left/entered the browser window
-                       if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
-                               event.type = handleObj.origType;
-                               ret = handleObj.handler.apply( this, arguments );
-                               event.type = fix;
+                               // Put in the new values to get a computed value out
+                               style.minWidth = style.maxWidth = style.width = ret;
+                               ret = computed.width;
+
+                               // Revert the changed values
+                               style.width = width;
+                               style.minWidth = minWidth;
+                               style.maxWidth = maxWidth;
                        }
-                       return ret;
                }
+
+               // Support: IE
+               // IE returns zIndex value as an integer.
+               return ret === undefined ?
+                       ret :
+                       ret + "";
+       };
+} else if ( document.documentElement.currentStyle ) {
+       getStyles = function( elem ) {
+               return elem.currentStyle;
        };
-});
 
-// IE submit delegation
-if ( !jQuery.support.submitBubbles ) {
+       curCSS = function( elem, name, computed ) {
+               var left, rs, rsLeft, ret,
+                       style = elem.style;
 
-       jQuery.event.special.submit = {
-               setup: function() {
-                       // Only need this for delegated form submit events
-                       if ( jQuery.nodeName( this, "form" ) ) {
-                               return false;
-                       }
+               computed = computed || getStyles( elem );
+               ret = computed ? computed[ name ] : undefined;
 
-                       // Lazy-add a submit handler when a descendant form may potentially be submitted
-                       jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
-                               // Node name check avoids a VML-related crash in IE (#9807)
-                               var elem = e.target,
-                                       form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
-                               if ( form && !jQuery._data( form, "_submit_attached" ) ) {
-                                       jQuery.event.add( form, "submit._submit", function( event ) {
-                                               event._submit_bubble = true;
-                                       });
-                                       jQuery._data( form, "_submit_attached", true );
-                               }
-                       });
-                       // return undefined since we don't need an event listener
-               },
+               // Avoid setting ret to empty string here
+               // so we don't default to auto
+               if ( ret == null && style && style[ name ] ) {
+                       ret = style[ name ];
+               }
 
-               postDispatch: function( event ) {
-                       // If form was submitted by the user, bubble the event up the tree
-                       if ( event._submit_bubble ) {
-                               delete event._submit_bubble;
-                               if ( this.parentNode && !event.isTrigger ) {
-                                       jQuery.event.simulate( "submit", this.parentNode, event, true );
-                               }
-                       }
-               },
+               // From the awesome hack by Dean Edwards
+               // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
 
-               teardown: function() {
-                       // Only need this for delegated form submit events
-                       if ( jQuery.nodeName( this, "form" ) ) {
-                               return false;
+               // If we're not dealing with a regular pixel number
+               // but a number that has a weird ending, we need to convert it to pixels
+               // but not position css attributes, as those are proportional to the parent element instead
+               // and we can't measure the parent instead because it might trigger a "stacking dolls" problem
+               if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
+
+                       // Remember the original values
+                       left = style.left;
+                       rs = elem.runtimeStyle;
+                       rsLeft = rs && rs.left;
+
+                       // Put in the new values to get a computed value out
+                       if ( rsLeft ) {
+                               rs.left = elem.currentStyle.left;
                        }
+                       style.left = name === "fontSize" ? "1em" : ret;
+                       ret = style.pixelLeft + "px";
 
-                       // Remove delegated handlers; cleanData eventually reaps submit handlers attached above
-                       jQuery.event.remove( this, "._submit" );
+                       // Revert the changed values
+                       style.left = left;
+                       if ( rsLeft ) {
+                               rs.left = rsLeft;
+                       }
                }
+
+               // Support: IE
+               // IE returns zIndex value as an integer.
+               return ret === undefined ?
+                       ret :
+                       ret + "" || "auto";
        };
 }
 
-// IE change delegation and checkbox/radio fix
-if ( !jQuery.support.changeBubbles ) {
-
-       jQuery.event.special.change = {
 
-               setup: function() {
 
-                       if ( rformElems.test( this.nodeName ) ) {
-                               // IE doesn't fire change on a check/radio until blur; trigger it on click
-                               // after a propertychange. Eat the blur-change in special.change.handle.
-                               // This still fires onchange a second time for check/radio after blur.
-                               if ( this.type === "checkbox" || this.type === "radio" ) {
-                                       jQuery.event.add( this, "propertychange._change", function( event ) {
-                                               if ( event.originalEvent.propertyName === "checked" ) {
-                                                       this._just_changed = true;
-                                               }
-                                       });
-                                       jQuery.event.add( this, "click._change", function( event ) {
-                                               if ( this._just_changed && !event.isTrigger ) {
-                                                       this._just_changed = false;
-                                               }
-                                               // Allow triggered, simulated change events (#11500)
-                                               jQuery.event.simulate( "change", this, event, true );
-                                       });
-                               }
-                               return false;
-                       }
-                       // Delegated event; lazy-add a change handler on descendant inputs
-                       jQuery.event.add( this, "beforeactivate._change", function( e ) {
-                               var elem = e.target;
 
-                               if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "_change_attached" ) ) {
-                                       jQuery.event.add( elem, "change._change", function( event ) {
-                                               if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
-                                                       jQuery.event.simulate( "change", this.parentNode, event, true );
-                                               }
-                                       });
-                                       jQuery._data( elem, "_change_attached", true );
-                               }
-                       });
-               },
+function addGetHookIf( conditionFn, hookFn ) {
+       // Define the hook, we'll check on the first run if it's really needed.
+       return {
+               get: function() {
+                       var condition = conditionFn();
 
-               handle: function( event ) {
-                       var elem = event.target;
+                       if ( condition == null ) {
+                               // The test was not ready at this point; screw the hook this time
+                               // but check again when needed next time.
+                               return;
+                       }
 
-                       // Swallow native change events from checkbox/radio, we already triggered them above
-                       if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
-                               return event.handleObj.handler.apply( this, arguments );
+                       if ( condition ) {
+                               // Hook not needed (or it's not possible to use it due to missing dependency),
+                               // remove it.
+                               // Since there are no other hooks for marginRight, remove the whole object.
+                               delete this.get;
+                               return;
                        }
-               },
 
-               teardown: function() {
-                       jQuery.event.remove( this, "._change" );
+                       // Hook needed; redefine it so that the support test is not executed again.
 
-                       return !rformElems.test( this.nodeName );
+                       return (this.get = hookFn).apply( this, arguments );
                }
        };
 }
 
-// Create "bubbling" focus and blur events
-if ( !jQuery.support.focusinBubbles ) {
-       jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
 
-               // Attach a single capturing handler while someone wants focusin/focusout
-               var attaches = 0,
-                       handler = function( event ) {
-                               jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
-                       };
+(function() {
+       // Minified: var b,c,d,e,f,g, h,i
+       var div, style, a, pixelPositionVal, boxSizingReliableVal,
+               reliableHiddenOffsetsVal, reliableMarginRightVal;
 
-               jQuery.event.special[ fix ] = {
-                       setup: function() {
-                               if ( attaches++ === 0 ) {
-                                       document.addEventListener( orig, handler, true );
-                               }
-                       },
-                       teardown: function() {
-                               if ( --attaches === 0 ) {
-                                       document.removeEventListener( orig, handler, true );
-                               }
-                       }
-               };
-       });
-}
+       // Setup
+       div = document.createElement( "div" );
+       div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
+       a = div.getElementsByTagName( "a" )[ 0 ];
+       style = a && a.style;
 
-jQuery.fn.extend({
+       // Finish early in limited (non-browser) environments
+       if ( !style ) {
+               return;
+       }
 
-       on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
-               var origFn, type;
+       style.cssText = "float:left;opacity:.5";
 
-               // Types can be a map of types/handlers
-               if ( typeof types === "object" ) {
-                       // ( types-Object, selector, data )
-                       if ( typeof selector !== "string" ) { // && selector != null
-                               // ( types-Object, data )
-                               data = data || selector;
-                               selector = undefined;
+       // Support: IE<9
+       // Make sure that element opacity exists (as opposed to filter)
+       support.opacity = style.opacity === "0.5";
+
+       // Verify style float existence
+       // (IE uses styleFloat instead of cssFloat)
+       support.cssFloat = !!style.cssFloat;
+
+       div.style.backgroundClip = "content-box";
+       div.cloneNode( true ).style.backgroundClip = "";
+       support.clearCloneStyle = div.style.backgroundClip === "content-box";
+
+       // Support: Firefox<29, Android 2.3
+       // Vendor-prefix box-sizing
+       support.boxSizing = style.boxSizing === "" || style.MozBoxSizing === "" ||
+               style.WebkitBoxSizing === "";
+
+       jQuery.extend(support, {
+               reliableHiddenOffsets: function() {
+                       if ( reliableHiddenOffsetsVal == null ) {
+                               computeStyleTests();
                        }
-                       for ( type in types ) {
-                               this.on( type, selector, data, types[ type ], one );
+                       return reliableHiddenOffsetsVal;
+               },
+
+               boxSizingReliable: function() {
+                       if ( boxSizingReliableVal == null ) {
+                               computeStyleTests();
                        }
-                       return this;
-               }
+                       return boxSizingReliableVal;
+               },
 
-               if ( data == null && fn == null ) {
-                       // ( types, fn )
-                       fn = selector;
-                       data = selector = undefined;
-               } else if ( fn == null ) {
-                       if ( typeof selector === "string" ) {
-                               // ( types, selector, fn )
-                               fn = data;
-                               data = undefined;
-                       } else {
-                               // ( types, data, fn )
-                               fn = data;
-                               data = selector;
-                               selector = undefined;
+               pixelPosition: function() {
+                       if ( pixelPositionVal == null ) {
+                               computeStyleTests();
                        }
-               }
-               if ( fn === false ) {
-                       fn = returnFalse;
-               } else if ( !fn ) {
-                       return this;
-               }
+                       return pixelPositionVal;
+               },
 
-               if ( one === 1 ) {
-                       origFn = fn;
-                       fn = function( event ) {
-                               // Can use an empty set, since event contains the info
-                               jQuery().off( event );
-                               return origFn.apply( this, arguments );
-                       };
-                       // Use same guid so caller can remove using origFn
-                       fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
-               }
-               return this.each( function() {
-                       jQuery.event.add( this, types, fn, data, selector );
-               });
-       },
-       one: function( types, selector, data, fn ) {
-               return this.on( types, selector, data, fn, 1 );
-       },
-       off: function( types, selector, fn ) {
-               var handleObj, type;
-               if ( types && types.preventDefault && types.handleObj ) {
-                       // ( event )  dispatched jQuery.Event
-                       handleObj = types.handleObj;
-                       jQuery( types.delegateTarget ).off(
-                               handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
-                               handleObj.selector,
-                               handleObj.handler
-                       );
-                       return this;
-               }
-               if ( typeof types === "object" ) {
-                       // ( types-object [, selector] )
-                       for ( type in types ) {
-                               this.off( type, selector, types[ type ] );
+               // Support: Android 2.3
+               reliableMarginRight: function() {
+                       if ( reliableMarginRightVal == null ) {
+                               computeStyleTests();
                        }
-                       return this;
-               }
-               if ( selector === false || typeof selector === "function" ) {
-                       // ( types [, fn] )
-                       fn = selector;
-                       selector = undefined;
+                       return reliableMarginRightVal;
                }
-               if ( fn === false ) {
-                       fn = returnFalse;
-               }
-               return this.each(function() {
-                       jQuery.event.remove( this, types, fn, selector );
-               });
-       },
+       });
 
-       bind: function( types, data, fn ) {
-               return this.on( types, null, data, fn );
-       },
-       unbind: function( types, fn ) {
-               return this.off( types, null, fn );
-       },
+       function computeStyleTests() {
+               // Minified: var b,c,d,j
+               var div, body, container, contents;
 
-       live: function( types, data, fn ) {
-               jQuery( this.context ).on( types, this.selector, data, fn );
-               return this;
-       },
-       die: function( types, fn ) {
-               jQuery( this.context ).off( types, this.selector || "**", fn );
-               return this;
-       },
+               body = document.getElementsByTagName( "body" )[ 0 ];
+               if ( !body || !body.style ) {
+                       // Test fired too early or in an unsupported environment, exit.
+                       return;
+               }
 
-       delegate: function( selector, types, data, fn ) {
-               return this.on( types, selector, data, fn );
-       },
-       undelegate: function( selector, types, fn ) {
-               // ( namespace ) or ( selector, types [, fn] )
-               return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
-       },
+               // Setup
+               div = document.createElement( "div" );
+               container = document.createElement( "div" );
+               container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px";
+               body.appendChild( container ).appendChild( div );
 
-       trigger: function( type, data ) {
-               return this.each(function() {
-                       jQuery.event.trigger( type, data, this );
-               });
-       },
-       triggerHandler: function( type, data ) {
-               if ( this[0] ) {
-                       return jQuery.event.trigger( type, data, this[0], true );
-               }
-       },
+               div.style.cssText =
+                       // Support: Firefox<29, Android 2.3
+                       // Vendor-prefix box-sizing
+                       "-webkit-box-sizing:border-box;-moz-box-sizing:border-box;" +
+                       "box-sizing:border-box;display:block;margin-top:1%;top:1%;" +
+                       "border:1px;padding:1px;width:4px;position:absolute";
 
-       toggle: function( fn ) {
-               // Save reference to arguments for access in closure
-               var args = arguments,
-                       guid = fn.guid || jQuery.guid++,
-                       i = 0,
-                       toggler = function( event ) {
-                               // Figure out which function to execute
-                               var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
-                               jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
+               // Support: IE<9
+               // Assume reasonable values in the absence of getComputedStyle
+               pixelPositionVal = boxSizingReliableVal = false;
+               reliableMarginRightVal = true;
 
-                               // Make sure that clicks stop
-                               event.preventDefault();
+               // Check for getComputedStyle so that this code is not run in IE<9.
+               if ( window.getComputedStyle ) {
+                       pixelPositionVal = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
+                       boxSizingReliableVal =
+                               ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
 
-                               // and execute the function
-                               return args[ lastToggle ].apply( this, arguments ) || false;
-                       };
+                       // Support: Android 2.3
+                       // Div with explicit width and no margin-right incorrectly
+                       // gets computed margin-right based on width of container (#3333)
+                       // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+                       contents = div.appendChild( document.createElement( "div" ) );
+
+                       // Reset CSS: box-sizing; display; margin; border; padding
+                       contents.style.cssText = div.style.cssText =
+                               // Support: Firefox<29, Android 2.3
+                               // Vendor-prefix box-sizing
+                               "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" +
+                               "box-sizing:content-box;display:block;margin:0;border:0;padding:0";
+                       contents.style.marginRight = contents.style.width = "0";
+                       div.style.width = "1px";
+
+                       reliableMarginRightVal =
+                               !parseFloat( ( window.getComputedStyle( contents, null ) || {} ).marginRight );
+               }
 
-               // link all the functions, so any of them can unbind this click handler
-               toggler.guid = guid;
-               while ( i < args.length ) {
-                       args[ i++ ].guid = guid;
+               // Support: IE8
+               // Check if table cells still have offsetWidth/Height when they are set
+               // to display:none and there are still other visible table cells in a
+               // table row; if so, offsetWidth/Height are not reliable for use when
+               // determining if an element has been hidden directly using
+               // display:none (it is still safe to use offsets if a parent element is
+               // hidden; don safety goggles and see bug #4512 for more information).
+               div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
+               contents = div.getElementsByTagName( "td" );
+               contents[ 0 ].style.cssText = "margin:0;border:0;padding:0;display:none";
+               reliableHiddenOffsetsVal = contents[ 0 ].offsetHeight === 0;
+               if ( reliableHiddenOffsetsVal ) {
+                       contents[ 0 ].style.display = "";
+                       contents[ 1 ].style.display = "none";
+                       reliableHiddenOffsetsVal = contents[ 0 ].offsetHeight === 0;
                }
 
-               return this.click( toggler );
-       },
-
-       hover: function( fnOver, fnOut ) {
-               return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+               body.removeChild( container );
        }
-});
 
-jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
-       "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
-       "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
+})();
 
-       // Handle event binding
-       jQuery.fn[ name ] = function( data, fn ) {
-               if ( fn == null ) {
-                       fn = data;
-                       data = null;
-               }
 
-               return arguments.length > 0 ?
-                       this.on( name, null, data, fn ) :
-                       this.trigger( name );
-       };
+// A method for quickly swapping in/out CSS properties to get correct calculations.
+jQuery.swap = function( elem, options, callback, args ) {
+       var ret, name,
+               old = {};
 
-       if ( rkeyEvent.test( name ) ) {
-               jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
+       // Remember the old values, and insert the new ones
+       for ( name in options ) {
+               old[ name ] = elem.style[ name ];
+               elem.style[ name ] = options[ name ];
        }
 
-       if ( rmouseEvent.test( name ) ) {
-               jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
-       }
-});
-/*!\r
- * Sizzle CSS Selector Engine\r
- * Copyright 2012 jQuery Foundation and other contributors\r
- * Released under the MIT license\r
- * http://sizzlejs.com/\r
- */\r
-(function( window, undefined ) {\r
-\r
-var cachedruns,\r
-       assertGetIdNotName,\r
-       Expr,\r
-       getText,\r
-       isXML,\r
-       contains,\r
-       compile,\r
-       sortOrder,\r
-       hasDuplicate,\r
-       outermostContext,\r
-\r
-       baseHasDuplicate = true,\r
-       strundefined = "undefined",\r
-\r
-       expando = ( "sizcache" + Math.random() ).replace( ".", "" ),\r
-\r
-       Token = String,\r
-       document = window.document,\r
-       docElem = document.documentElement,\r
-       dirruns = 0,\r
-       done = 0,\r
-       pop = [].pop,\r
-       push = [].push,\r
-       slice = [].slice,\r
-       // Use a stripped-down indexOf if a native one is unavailable\r
-       indexOf = [].indexOf || function( elem ) {\r
-               var i = 0,\r
-                       len = this.length;\r
-               for ( ; i < len; i++ ) {\r
-                       if ( this[i] === elem ) {\r
-                               return i;\r
-                       }\r
-               }\r
-               return -1;\r
-       },\r
-\r
-       // Augment a function for special use by Sizzle\r
-       markFunction = function( fn, value ) {\r
-               fn[ expando ] = value == null || value;\r
-               return fn;\r
-       },\r
-\r
-       createCache = function() {\r
-               var cache = {},\r
-                       keys = [];\r
-\r
-               return markFunction(function( key, value ) {\r
-                       // Only keep the most recent entries\r
-                       if ( keys.push( key ) > Expr.cacheLength ) {\r
-                               delete cache[ keys.shift() ];\r
-                       }\r
-\r
-                       // Retrieve with (key + " ") to avoid collision with native Object.prototype properties (see Issue #157)\r
-                       return (cache[ key + " " ] = value);\r
-               }, cache );\r
-       },\r
-\r
-       classCache = createCache(),\r
-       tokenCache = createCache(),\r
-       compilerCache = createCache(),\r
-\r
-       // Regex\r
-\r
-       // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace\r
-       whitespace = "[\\x20\\t\\r\\n\\f]",\r
-       // http://www.w3.org/TR/css3-syntax/#characters\r
-       characterEncoding = "(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",\r
-\r
-       // Loosely modeled on CSS identifier characters\r
-       // An unquoted value should be a CSS identifier (http://www.w3.org/TR/css3-selectors/#attribute-selectors)\r
-       // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\r
-       identifier = characterEncoding.replace( "w", "w#" ),\r
-\r
-       // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors\r
-       operators = "([*^$|!~]?=)",\r
-       attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +\r
-               "*(?:" + operators + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",\r
-\r
-       // Prefer arguments not in parens/brackets,\r
-       //   then attribute selectors and non-pseudos (denoted by :),\r
-       //   then anything else\r
-       // These preferences are here to reduce the number of selectors\r
-       //   needing tokenize in the PSEUDO preFilter\r
-       pseudos = ":(" + characterEncoding + ")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:" + attributes + ")|[^:]|\\\\.)*|.*))\\)|)",\r
-\r
-       // For matchExpr.POS and matchExpr.needsContext\r
-       pos = ":(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace +\r
-               "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)",\r
-\r
-       // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\r
-       rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),\r
-\r
-       rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),\r
-       rcombinators = new RegExp( "^" + whitespace + "*([\\x20\\t\\r\\n\\f>+~])" + whitespace + "*" ),\r
-       rpseudo = new RegExp( pseudos ),\r
-\r
-       // Easily-parseable/retrievable ID or TAG or CLASS selectors\r
-       rquickExpr = /^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,\r
-\r
-       rnot = /^:not/,\r
-       rsibling = /[\x20\t\r\n\f]*[+~]/,\r
-       rendsWithNot = /:not\($/,\r
-\r
-       rheader = /h\d/i,\r
-       rinputs = /input|select|textarea|button/i,\r
-\r
-       rbackslash = /\\(?!\\)/g,\r
-\r
-       matchExpr = {\r
-               "ID": new RegExp( "^#(" + characterEncoding + ")" ),\r
-               "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),\r
-               "NAME": new RegExp( "^\\[name=['\"]?(" + characterEncoding + ")['\"]?\\]" ),\r
-               "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),\r
-               "ATTR": new RegExp( "^" + attributes ),\r
-               "PSEUDO": new RegExp( "^" + pseudos ),\r
-               "POS": new RegExp( pos, "i" ),\r
-               "CHILD": new RegExp( "^:(only|nth|first|last)-child(?:\\(" + whitespace +\r
-                       "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +\r
-                       "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),\r
-               // For use in libraries implementing .is()\r
-               "needsContext": new RegExp( "^" + whitespace + "*[>+~]|" + pos, "i" )\r
-       },\r
-\r
-       // Support\r
-\r
-       // Used for testing something on an element\r
-       assert = function( fn ) {\r
-               var div = document.createElement("div");\r
-\r
-               try {\r
-                       return fn( div );\r
-               } catch (e) {\r
-                       return false;\r
-               } finally {\r
-                       // release memory in IE\r
-                       div = null;\r
-               }\r
-       },\r
-\r
-       // Check if getElementsByTagName("*") returns only elements\r
-       assertTagNameNoComments = assert(function( div ) {\r
-               div.appendChild( document.createComment("") );\r
-               return !div.getElementsByTagName("*").length;\r
-       }),\r
-\r
-       // Check if getAttribute returns normalized href attributes\r
-       assertHrefNotNormalized = assert(function( div ) {\r
-               div.innerHTML = "<a href='#'></a>";\r
-               return div.firstChild && typeof div.firstChild.getAttribute !== strundefined &&\r
-                       div.firstChild.getAttribute("href") === "#";\r
-       }),\r
-\r
-       // Check if attributes should be retrieved by attribute nodes\r
-       assertAttributes = assert(function( div ) {\r
-               div.innerHTML = "<select></select>";\r
-               var type = typeof div.lastChild.getAttribute("multiple");\r
-               // IE8 returns a string for some attributes even when not present\r
-               return type !== "boolean" && type !== "string";\r
-       }),\r
-\r
-       // Check if getElementsByClassName can be trusted\r
-       assertUsableClassName = assert(function( div ) {\r
-               // Opera can't find a second classname (in 9.6)\r
-               div.innerHTML = "<div class='hidden e'></div><div class='hidden'></div>";\r
-               if ( !div.getElementsByClassName || !div.getElementsByClassName("e").length ) {\r
-                       return false;\r
-               }\r
-\r
-               // Safari 3.2 caches class attributes and doesn't catch changes\r
-               div.lastChild.className = "e";\r
-               return div.getElementsByClassName("e").length === 2;\r
-       }),\r
-\r
-       // Check if getElementById returns elements by name\r
-       // Check if getElementsByName privileges form controls or returns elements by ID\r
-       assertUsableName = assert(function( div ) {\r
-               // Inject content\r
-               div.id = expando + 0;\r
-               div.innerHTML = "<a name='" + expando + "'></a><div name='" + expando + "'></div>";\r
-               docElem.insertBefore( div, docElem.firstChild );\r
-\r
-               // Test\r
-               var pass = document.getElementsByName &&\r
-                       // buggy browsers will return fewer than the correct 2\r
-                       document.getElementsByName( expando ).length === 2 +\r
-                       // buggy browsers will return more than the correct 0\r
-                       document.getElementsByName( expando + 0 ).length;\r
-               assertGetIdNotName = !document.getElementById( expando );\r
-\r
-               // Cleanup\r
-               docElem.removeChild( div );\r
-\r
-               return pass;\r
-       });\r
-\r
-// If slice is not available, provide a backup\r
-try {\r
-       slice.call( docElem.childNodes, 0 )[0].nodeType;\r
-} catch ( e ) {\r
-       slice = function( i ) {\r
-               var elem,\r
-                       results = [];\r
-               for ( ; (elem = this[i]); i++ ) {\r
-                       results.push( elem );\r
-               }\r
-               return results;\r
-       };\r
-}\r
-\r
-function Sizzle( selector, context, results, seed ) {\r
-       results = results || [];\r
-       context = context || document;\r
-       var match, elem, xml, m,\r
-               nodeType = context.nodeType;\r
-\r
-       if ( !selector || typeof selector !== "string" ) {\r
-               return results;\r
-       }\r
-\r
-       if ( nodeType !== 1 && nodeType !== 9 ) {\r
-               return [];\r
-       }\r
-\r
-       xml = isXML( context );\r
-\r
-       if ( !xml && !seed ) {\r
-               if ( (match = rquickExpr.exec( selector )) ) {\r
-                       // Speed-up: Sizzle("#ID")\r
-                       if ( (m = match[1]) ) {\r
-                               if ( nodeType === 9 ) {\r
-                                       elem = context.getElementById( m );\r
-                                       // Check parentNode to catch when Blackberry 4.6 returns\r
-                                       // nodes that are no longer in the document #6963\r
-                                       if ( elem && elem.parentNode ) {\r
-                                               // Handle the case where IE, Opera, and Webkit return items\r
-                                               // by name instead of ID\r
-                                               if ( elem.id === m ) {\r
-                                                       results.push( elem );\r
-                                                       return results;\r
-                                               }\r
-                                       } else {\r
-                                               return results;\r
-                                       }\r
-                               } else {\r
-                                       // Context is not a document\r
-                                       if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&\r
-                                               contains( context, elem ) && elem.id === m ) {\r
-                                               results.push( elem );\r
-                                               return results;\r
-                                       }\r
-                               }\r
-\r
-                       // Speed-up: Sizzle("TAG")\r
-                       } else if ( match[2] ) {\r
-                               push.apply( results, slice.call(context.getElementsByTagName( selector ), 0) );\r
-                               return results;\r
-\r
-                       // Speed-up: Sizzle(".CLASS")\r
-                       } else if ( (m = match[3]) && assertUsableClassName && context.getElementsByClassName ) {\r
-                               push.apply( results, slice.call(context.getElementsByClassName( m ), 0) );\r
-                               return results;\r
-                       }\r
-               }\r
-       }\r
-\r
-       // All others\r
-       return select( selector.replace( rtrim, "$1" ), context, results, seed, xml );\r
-}\r
-\r
-Sizzle.matches = function( expr, elements ) {\r
-       return Sizzle( expr, null, null, elements );\r
-};\r
-\r
-Sizzle.matchesSelector = function( elem, expr ) {\r
-       return Sizzle( expr, null, null, [ elem ] ).length > 0;\r
-};\r
-\r
-// Returns a function to use in pseudos for input types\r
-function createInputPseudo( type ) {\r
-       return function( elem ) {\r
-               var name = elem.nodeName.toLowerCase();\r
-               return name === "input" && elem.type === type;\r
-       };\r
-}\r
-\r
-// Returns a function to use in pseudos for buttons\r
-function createButtonPseudo( type ) {\r
-       return function( elem ) {\r
-               var name = elem.nodeName.toLowerCase();\r
-               return (name === "input" || name === "button") && elem.type === type;\r
-       };\r
-}\r
-\r
-// Returns a function to use in pseudos for positionals\r
-function createPositionalPseudo( fn ) {\r
-       return markFunction(function( argument ) {\r
-               argument = +argument;\r
-               return markFunction(function( seed, matches ) {\r
-                       var j,\r
-                               matchIndexes = fn( [], seed.length, argument ),\r
-                               i = matchIndexes.length;\r
-\r
-                       // Match elements found at the specified indexes\r
-                       while ( i-- ) {\r
-                               if ( seed[ (j = matchIndexes[i]) ] ) {\r
-                                       seed[j] = !(matches[j] = seed[j]);\r
-                               }\r
-                       }\r
-               });\r
-       });\r
-}\r
-\r
-/**\r
- * Utility function for retrieving the text value of an array of DOM nodes\r
- * @param {Array|Element} elem\r
- */\r
-getText = Sizzle.getText = function( elem ) {\r
-       var node,\r
-               ret = "",\r
-               i = 0,\r
-               nodeType = elem.nodeType;\r
-\r
-       if ( nodeType ) {\r
-               if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\r
-                       // Use textContent for elements\r
-                       // innerText usage removed for consistency of new lines (see #11153)\r
-                       if ( typeof elem.textContent === "string" ) {\r
-                               return elem.textContent;\r
-                       } else {\r
-                               // Traverse its children\r
-                               for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\r
-                                       ret += getText( elem );\r
-                               }\r
-                       }\r
-               } else if ( nodeType === 3 || nodeType === 4 ) {\r
-                       return elem.nodeValue;\r
-               }\r
-               // Do not include comment or processing instruction nodes\r
-       } else {\r
-\r
-               // If no nodeType, this is expected to be an array\r
-               for ( ; (node = elem[i]); i++ ) {\r
-                       // Do not traverse comment nodes\r
-                       ret += getText( node );\r
-               }\r
-       }\r
-       return ret;\r
-};\r
-\r
-isXML = Sizzle.isXML = function( elem ) {\r
-       // documentElement is verified for cases where it doesn't yet exist\r
-       // (such as loading iframes in IE - #4833)\r
-       var documentElement = elem && (elem.ownerDocument || elem).documentElement;\r
-       return documentElement ? documentElement.nodeName !== "HTML" : false;\r
-};\r
-\r
-// Element contains another\r
-contains = Sizzle.contains = docElem.contains ?\r
-       function( a, b ) {\r
-               var adown = a.nodeType === 9 ? a.documentElement : a,\r
-                       bup = b && b.parentNode;\r
-               return a === bup || !!( bup && bup.nodeType === 1 && adown.contains && adown.contains(bup) );\r
-       } :\r
-       docElem.compareDocumentPosition ?\r
-       function( a, b ) {\r
-               return b && !!( a.compareDocumentPosition( b ) & 16 );\r
-       } :\r
-       function( a, b ) {\r
-               while ( (b = b.parentNode) ) {\r
-                       if ( b === a ) {\r
-                               return true;\r
-                       }\r
-               }\r
-               return false;\r
-       };\r
-\r
-Sizzle.attr = function( elem, name ) {\r
-       var val,\r
-               xml = isXML( elem );\r
-\r
-       if ( !xml ) {\r
-               name = name.toLowerCase();\r
-       }\r
-       if ( (val = Expr.attrHandle[ name ]) ) {\r
-               return val( elem );\r
-       }\r
-       if ( xml || assertAttributes ) {\r
-               return elem.getAttribute( name );\r
-       }\r
-       val = elem.getAttributeNode( name );\r
-       return val ?\r
-               typeof elem[ name ] === "boolean" ?\r
-                       elem[ name ] ? name : null :\r
-                       val.specified ? val.value : null :\r
-               null;\r
-};\r
-\r
-Expr = Sizzle.selectors = {\r
-\r
-       // Can be adjusted by the user\r
-       cacheLength: 50,\r
-\r
-       createPseudo: markFunction,\r
-\r
-       match: matchExpr,\r
-\r
-       // IE6/7 return a modified href\r
-       attrHandle: assertHrefNotNormalized ?\r
-               {} :\r
-               {\r
-                       "href": function( elem ) {\r
-                               return elem.getAttribute( "href", 2 );\r
-                       },\r
-                       "type": function( elem ) {\r
-                               return elem.getAttribute("type");\r
-                       }\r
-               },\r
-\r
-       find: {\r
-               "ID": assertGetIdNotName ?\r
-                       function( id, context, xml ) {\r
-                               if ( typeof context.getElementById !== strundefined && !xml ) {\r
-                                       var m = context.getElementById( id );\r
-                                       // Check parentNode to catch when Blackberry 4.6 returns\r
-                                       // nodes that are no longer in the document #6963\r
-                                       return m && m.parentNode ? [m] : [];\r
-                               }\r
-                       } :\r
-                       function( id, context, xml ) {\r
-                               if ( typeof context.getElementById !== strundefined && !xml ) {\r
-                                       var m = context.getElementById( id );\r
-\r
-                                       return m ?\r
-                                               m.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode("id").value === id ?\r
-                                                       [m] :\r
-                                                       undefined :\r
-                                               [];\r
-                               }\r
-                       },\r
-\r
-               "TAG": assertTagNameNoComments ?\r
-                       function( tag, context ) {\r
-                               if ( typeof context.getElementsByTagName !== strundefined ) {\r
-                                       return context.getElementsByTagName( tag );\r
-                               }\r
-                       } :\r
-                       function( tag, context ) {\r
-                               var results = context.getElementsByTagName( tag );\r
-\r
-                               // Filter out possible comments\r
-                               if ( tag === "*" ) {\r
-                                       var elem,\r
-                                               tmp = [],\r
-                                               i = 0;\r
-\r
-                                       for ( ; (elem = results[i]); i++ ) {\r
-                                               if ( elem.nodeType === 1 ) {\r
-                                                       tmp.push( elem );\r
-                                               }\r
-                                       }\r
-\r
-                                       return tmp;\r
-                               }\r
-                               return results;\r
-                       },\r
-\r
-               "NAME": assertUsableName && function( tag, context ) {\r
-                       if ( typeof context.getElementsByName !== strundefined ) {\r
-                               return context.getElementsByName( name );\r
-                       }\r
-               },\r
-\r
-               "CLASS": assertUsableClassName && function( className, context, xml ) {\r
-                       if ( typeof context.getElementsByClassName !== strundefined && !xml ) {\r
-                               return context.getElementsByClassName( className );\r
-                       }\r
-               }\r
-       },\r
-\r
-       relative: {\r
-               ">": { dir: "parentNode", first: true },\r
-               " ": { dir: "parentNode" },\r
-               "+": { dir: "previousSibling", first: true },\r
-               "~": { dir: "previousSibling" }\r
-       },\r
-\r
-       preFilter: {\r
-               "ATTR": function( match ) {\r
-                       match[1] = match[1].replace( rbackslash, "" );\r
-\r
-                       // Move the given value to match[3] whether quoted or unquoted\r
-                       match[3] = ( match[4] || match[5] || "" ).replace( rbackslash, "" );\r
-\r
-                       if ( match[2] === "~=" ) {\r
-                               match[3] = " " + match[3] + " ";\r
-                       }\r
-\r
-                       return match.slice( 0, 4 );\r
-               },\r
-\r
-               "CHILD": function( match ) {\r
-                       /* matches from matchExpr["CHILD"]\r
-                               1 type (only|nth|...)\r
-                               2 argument (even|odd|\d*|\d*n([+-]\d+)?|...)\r
-                               3 xn-component of xn+y argument ([+-]?\d*n|)\r
-                               4 sign of xn-component\r
-                               5 x of xn-component\r
-                               6 sign of y-component\r
-                               7 y of y-component\r
-                       */\r
-                       match[1] = match[1].toLowerCase();\r
-\r
-                       if ( match[1] === "nth" ) {\r
-                               // nth-child requires argument\r
-                               if ( !match[2] ) {\r
-                                       Sizzle.error( match[0] );\r
-                               }\r
-\r
-                               // numeric x and y parameters for Expr.filter.CHILD\r
-                               // remember that false/true cast respectively to 0/1\r
-                               match[3] = +( match[3] ? match[4] + (match[5] || 1) : 2 * ( match[2] === "even" || match[2] === "odd" ) );\r
-                               match[4] = +( ( match[6] + match[7] ) || match[2] === "odd" );\r
-\r
-                       // other types prohibit arguments\r
-                       } else if ( match[2] ) {\r
-                               Sizzle.error( match[0] );\r
-                       }\r
-\r
-                       return match;\r
-               },\r
-\r
-               "PSEUDO": function( match ) {\r
-                       var unquoted, excess;\r
-                       if ( matchExpr["CHILD"].test( match[0] ) ) {\r
-                               return null;\r
-                       }\r
-\r
-                       if ( match[3] ) {\r
-                               match[2] = match[3];\r
-                       } else if ( (unquoted = match[4]) ) {\r
-                               // Only check arguments that contain a pseudo\r
-                               if ( rpseudo.test(unquoted) &&\r
-                                       // Get excess from tokenize (recursively)\r
-                                       (excess = tokenize( unquoted, true )) &&\r
-                                       // advance to the next closing parenthesis\r
-                                       (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {\r
-\r
-                                       // excess is a negative index\r
-                                       unquoted = unquoted.slice( 0, excess );\r
-                                       match[0] = match[0].slice( 0, excess );\r
-                               }\r
-                               match[2] = unquoted;\r
-                       }\r
-\r
-                       // Return only captures needed by the pseudo filter method (type and argument)\r
-                       return match.slice( 0, 3 );\r
-               }\r
-       },\r
-\r
-       filter: {\r
-               "ID": assertGetIdNotName ?\r
-                       function( id ) {\r
-                               id = id.replace( rbackslash, "" );\r
-                               return function( elem ) {\r
-                                       return elem.getAttribute("id") === id;\r
-                               };\r
-                       } :\r
-                       function( id ) {\r
-                               id = id.replace( rbackslash, "" );\r
-                               return function( elem ) {\r
-                                       var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");\r
-                                       return node && node.value === id;\r
-                               };\r
-                       },\r
-\r
-               "TAG": function( nodeName ) {\r
-                       if ( nodeName === "*" ) {\r
-                               return function() { return true; };\r
-                       }\r
-                       nodeName = nodeName.replace( rbackslash, "" ).toLowerCase();\r
-\r
-                       return function( elem ) {\r
-                               return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\r
-                       };\r
-               },\r
-\r
-               "CLASS": function( className ) {\r
-                       var pattern = classCache[ expando ][ className + " " ];\r
-\r
-                       return pattern ||\r
-                               (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&\r
-                               classCache( className, function( elem ) {\r
-                                       return pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute("class")) || "" );\r
-                               });\r
-               },\r
-\r
-               "ATTR": function( name, operator, check ) {\r
-                       return function( elem, context ) {\r
-                               var result = Sizzle.attr( elem, name );\r
-\r
-                               if ( result == null ) {\r
-                                       return operator === "!=";\r
-                               }\r
-                               if ( !operator ) {\r
-                                       return true;\r
-                               }\r
-\r
-                               result += "";\r
-\r
-                               return operator === "=" ? result === check :\r
-                                       operator === "!=" ? result !== check :\r
-                                       operator === "^=" ? check && result.indexOf( check ) === 0 :\r
-                                       operator === "*=" ? check && result.indexOf( check ) > -1 :\r
-                                       operator === "$=" ? check && result.substr( result.length - check.length ) === check :\r
-                                       operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :\r
-                                       operator === "|=" ? result === check || result.substr( 0, check.length + 1 ) === check + "-" :\r
-                                       false;\r
-                       };\r
-               },\r
-\r
-               "CHILD": function( type, argument, first, last ) {\r
-\r
-                       if ( type === "nth" ) {\r
-                               return function( elem ) {\r
-                                       var node, diff,\r
-                                               parent = elem.parentNode;\r
-\r
-                                       if ( first === 1 && last === 0 ) {\r
-                                               return true;\r
-                                       }\r
-\r
-                                       if ( parent ) {\r
-                                               diff = 0;\r
-                                               for ( node = parent.firstChild; node; node = node.nextSibling ) {\r
-                                                       if ( node.nodeType === 1 ) {\r
-                                                               diff++;\r
-                                                               if ( elem === node ) {\r
-                                                                       break;\r
-                                                               }\r
-                                                       }\r
-                                               }\r
-                                       }\r
-\r
-                                       // Incorporate the offset (or cast to NaN), then check against cycle size\r
-                                       diff -= last;\r
-                                       return diff === first || ( diff % first === 0 && diff / first >= 0 );\r
-                               };\r
-                       }\r
-\r
-                       return function( elem ) {\r
-                               var node = elem;\r
-\r
-                               switch ( type ) {\r
-                                       case "only":\r
-                                       case "first":\r
-                                               while ( (node = node.previousSibling) ) {\r
-                                                       if ( node.nodeType === 1 ) {\r
-                                                               return false;\r
-                                                       }\r
-                                               }\r
-\r
-                                               if ( type === "first" ) {\r
-                                                       return true;\r
-                                               }\r
-\r
-                                               node = elem;\r
-\r
-                                               /* falls through */\r
-                                       case "last":\r
-                                               while ( (node = node.nextSibling) ) {\r
-                                                       if ( node.nodeType === 1 ) {\r
-                                                               return false;\r
-                                                       }\r
-                                               }\r
-\r
-                                               return true;\r
-                               }\r
-                       };\r
-               },\r
-\r
-               "PSEUDO": function( pseudo, argument ) {\r
-                       // pseudo-class names are case-insensitive\r
-                       // http://www.w3.org/TR/selectors/#pseudo-classes\r
-                       // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\r
-                       // Remember that setFilters inherits from pseudos\r
-                       var args,\r
-                               fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\r
-                                       Sizzle.error( "unsupported pseudo: " + pseudo );\r
-\r
-                       // The user may use createPseudo to indicate that\r
-                       // arguments are needed to create the filter function\r
-                       // just as Sizzle does\r
-                       if ( fn[ expando ] ) {\r
-                               return fn( argument );\r
-                       }\r
-\r
-                       // But maintain support for old signatures\r
-                       if ( fn.length > 1 ) {\r
-                               args = [ pseudo, pseudo, "", argument ];\r
-                               return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\r
-                                       markFunction(function( seed, matches ) {\r
-                                               var idx,\r
-                                                       matched = fn( seed, argument ),\r
-                                                       i = matched.length;\r
-                                               while ( i-- ) {\r
-                                                       idx = indexOf.call( seed, matched[i] );\r
-                                                       seed[ idx ] = !( matches[ idx ] = matched[i] );\r
-                                               }\r
-                                       }) :\r
-                                       function( elem ) {\r
-                                               return fn( elem, 0, args );\r
-                                       };\r
-                       }\r
-\r
-                       return fn;\r
-               }\r
-       },\r
-\r
-       pseudos: {\r
-               "not": markFunction(function( selector ) {\r
-                       // Trim the selector passed to compile\r
-                       // to avoid treating leading and trailing\r
-                       // spaces as combinators\r
-                       var input = [],\r
-                               results = [],\r
-                               matcher = compile( selector.replace( rtrim, "$1" ) );\r
-\r
-                       return matcher[ expando ] ?\r
-                               markFunction(function( seed, matches, context, xml ) {\r
-                                       var elem,\r
-                                               unmatched = matcher( seed, null, xml, [] ),\r
-                                               i = seed.length;\r
-\r
-                                       // Match elements unmatched by `matcher`\r
-                                       while ( i-- ) {\r
-                                               if ( (elem = unmatched[i]) ) {\r
-                                                       seed[i] = !(matches[i] = elem);\r
-                                               }\r
-                                       }\r
-                               }) :\r
-                               function( elem, context, xml ) {\r
-                                       input[0] = elem;\r
-                                       matcher( input, null, xml, results );\r
-                                       return !results.pop();\r
-                               };\r
-               }),\r
-\r
-               "has": markFunction(function( selector ) {\r
-                       return function( elem ) {\r
-                               return Sizzle( selector, elem ).length > 0;\r
-                       };\r
-               }),\r
-\r
-               "contains": markFunction(function( text ) {\r
-                       return function( elem ) {\r
-                               return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\r
-                       };\r
-               }),\r
-\r
-               "enabled": function( elem ) {\r
-                       return elem.disabled === false;\r
-               },\r
-\r
-               "disabled": function( elem ) {\r
-                       return elem.disabled === true;\r
-               },\r
-\r
-               "checked": function( elem ) {\r
-                       // In CSS3, :checked should return both checked and selected elements\r
-                       // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\r
-                       var nodeName = elem.nodeName.toLowerCase();\r
-                       return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);\r
-               },\r
-\r
-               "selected": function( elem ) {\r
-                       // Accessing this property makes selected-by-default\r
-                       // options in Safari work properly\r
-                       if ( elem.parentNode ) {\r
-                               elem.parentNode.selectedIndex;\r
-                       }\r
-\r
-                       return elem.selected === true;\r
-               },\r
-\r
-               "parent": function( elem ) {\r
-                       return !Expr.pseudos["empty"]( elem );\r
-               },\r
-\r
-               "empty": function( elem ) {\r
-                       // http://www.w3.org/TR/selectors/#empty-pseudo\r
-                       // :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),\r
-                       //   not comment, processing instructions, or others\r
-                       // Thanks to Diego Perini for the nodeName shortcut\r
-                       //   Greater than "@" means alpha characters (specifically not starting with "#" or "?")\r
-                       var nodeType;\r
-                       elem = elem.firstChild;\r
-                       while ( elem ) {\r
-                               if ( elem.nodeName > "@" || (nodeType = elem.nodeType) === 3 || nodeType === 4 ) {\r
-                                       return false;\r
-                               }\r
-                               elem = elem.nextSibling;\r
-                       }\r
-                       return true;\r
-               },\r
-\r
-               "header": function( elem ) {\r
-                       return rheader.test( elem.nodeName );\r
-               },\r
-\r
-               "text": function( elem ) {\r
-                       var type, attr;\r
-                       // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)\r
-                       // use getAttribute instead to test this case\r
-                       return elem.nodeName.toLowerCase() === "input" &&\r
-                               (type = elem.type) === "text" &&\r
-                               ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === type );\r
-               },\r
-\r
-               // Input types\r
-               "radio": createInputPseudo("radio"),\r
-               "checkbox": createInputPseudo("checkbox"),\r
-               "file": createInputPseudo("file"),\r
-               "password": createInputPseudo("password"),\r
-               "image": createInputPseudo("image"),\r
-\r
-               "submit": createButtonPseudo("submit"),\r
-               "reset": createButtonPseudo("reset"),\r
-\r
-               "button": function( elem ) {\r
-                       var name = elem.nodeName.toLowerCase();\r
-                       return name === "input" && elem.type === "button" || name === "button";\r
-               },\r
-\r
-               "input": function( elem ) {\r
-                       return rinputs.test( elem.nodeName );\r
-               },\r
-\r
-               "focus": function( elem ) {\r
-                       var doc = elem.ownerDocument;\r
-                       return elem === doc.activeElement && (!doc.hasFocus || doc.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\r
-               },\r
-\r
-               "active": function( elem ) {\r
-                       return elem === elem.ownerDocument.activeElement;\r
-               },\r
-\r
-               // Positional types\r
-               "first": createPositionalPseudo(function() {\r
-                       return [ 0 ];\r
-               }),\r
-\r
-               "last": createPositionalPseudo(function( matchIndexes, length ) {\r
-                       return [ length - 1 ];\r
-               }),\r
-\r
-               "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {\r
-                       return [ argument < 0 ? argument + length : argument ];\r
-               }),\r
-\r
-               "even": createPositionalPseudo(function( matchIndexes, length ) {\r
-                       for ( var i = 0; i < length; i += 2 ) {\r
-                               matchIndexes.push( i );\r
-                       }\r
-                       return matchIndexes;\r
-               }),\r
-\r
-               "odd": createPositionalPseudo(function( matchIndexes, length ) {\r
-                       for ( var i = 1; i < length; i += 2 ) {\r
-                               matchIndexes.push( i );\r
-                       }\r
-                       return matchIndexes;\r
-               }),\r
-\r
-               "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {\r
-                       for ( var i = argument < 0 ? argument + length : argument; --i >= 0; ) {\r
-                               matchIndexes.push( i );\r
-                       }\r
-                       return matchIndexes;\r
-               }),\r
-\r
-               "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {\r
-                       for ( var i = argument < 0 ? argument + length : argument; ++i < length; ) {\r
-                               matchIndexes.push( i );\r
-                       }\r
-                       return matchIndexes;\r
-               })\r
-       }\r
-};\r
-\r
-function siblingCheck( a, b, ret ) {\r
-       if ( a === b ) {\r
-               return ret;\r
-       }\r
-\r
-       var cur = a.nextSibling;\r
-\r
-       while ( cur ) {\r
-               if ( cur === b ) {\r
-                       return -1;\r
-               }\r
-\r
-               cur = cur.nextSibling;\r
-       }\r
-\r
-       return 1;\r
-}\r
-\r
-sortOrder = docElem.compareDocumentPosition ?\r
-       function( a, b ) {\r
-               if ( a === b ) {\r
-                       hasDuplicate = true;\r
-                       return 0;\r
-               }\r
-\r
-               return ( !a.compareDocumentPosition || !b.compareDocumentPosition ?\r
-                       a.compareDocumentPosition :\r
-                       a.compareDocumentPosition(b) & 4\r
-               ) ? -1 : 1;\r
-       } :\r
-       function( a, b ) {\r
-               // The nodes are identical, we can exit early\r
-               if ( a === b ) {\r
-                       hasDuplicate = true;\r
-                       return 0;\r
-\r
-               // Fallback to using sourceIndex (in IE) if it's available on both nodes\r
-               } else if ( a.sourceIndex && b.sourceIndex ) {\r
-                       return a.sourceIndex - b.sourceIndex;\r
-               }\r
-\r
-               var al, bl,\r
-                       ap = [],\r
-                       bp = [],\r
-                       aup = a.parentNode,\r
-                       bup = b.parentNode,\r
-                       cur = aup;\r
-\r
-               // If the nodes are siblings (or identical) we can do a quick check\r
-               if ( aup === bup ) {\r
-                       return siblingCheck( a, b );\r
-\r
-               // If no parents were found then the nodes are disconnected\r
-               } else if ( !aup ) {\r
-                       return -1;\r
-\r
-               } else if ( !bup ) {\r
-                       return 1;\r
-               }\r
-\r
-               // Otherwise they're somewhere else in the tree so we need\r
-               // to build up a full list of the parentNodes for comparison\r
-               while ( cur ) {\r
-                       ap.unshift( cur );\r
-                       cur = cur.parentNode;\r
-               }\r
-\r
-               cur = bup;\r
-\r
-               while ( cur ) {\r
-                       bp.unshift( cur );\r
-                       cur = cur.parentNode;\r
-               }\r
-\r
-               al = ap.length;\r
-               bl = bp.length;\r
-\r
-               // Start walking down the tree looking for a discrepancy\r
-               for ( var i = 0; i < al && i < bl; i++ ) {\r
-                       if ( ap[i] !== bp[i] ) {\r
-                               return siblingCheck( ap[i], bp[i] );\r
-                       }\r
-               }\r
-\r
-               // We ended someplace up the tree so do a sibling check\r
-               return i === al ?\r
-                       siblingCheck( a, bp[i], -1 ) :\r
-                       siblingCheck( ap[i], b, 1 );\r
-       };\r
-\r
-// Always assume the presence of duplicates if sort doesn't\r
-// pass them to our comparison function (as in Google Chrome).\r
-[0, 0].sort( sortOrder );\r
-baseHasDuplicate = !hasDuplicate;\r
-\r
-// Document sorting and removing duplicates\r
-Sizzle.uniqueSort = function( results ) {\r
-       var elem,\r
-               duplicates = [],\r
-               i = 1,\r
-               j = 0;\r
-\r
-       hasDuplicate = baseHasDuplicate;\r
-       results.sort( sortOrder );\r
-\r
-       if ( hasDuplicate ) {\r
-               for ( ; (elem = results[i]); i++ ) {\r
-                       if ( elem === results[ i - 1 ] ) {\r
-                               j = duplicates.push( i );\r
-                       }\r
-               }\r
-               while ( j-- ) {\r
-                       results.splice( duplicates[ j ], 1 );\r
-               }\r
-       }\r
-\r
-       return results;\r
-};\r
-\r
-Sizzle.error = function( msg ) {\r
-       throw new Error( "Syntax error, unrecognized expression: " + msg );\r
-};\r
-\r
-function tokenize( selector, parseOnly ) {\r
-       var matched, match, tokens, type,\r
-               soFar, groups, preFilters,\r
-               cached = tokenCache[ expando ][ selector + " " ];\r
-\r
-       if ( cached ) {\r
-               return parseOnly ? 0 : cached.slice( 0 );\r
-       }\r
-\r
-       soFar = selector;\r
-       groups = [];\r
-       preFilters = Expr.preFilter;\r
-\r
-       while ( soFar ) {\r
-\r
-               // Comma and first run\r
-               if ( !matched || (match = rcomma.exec( soFar )) ) {\r
-                       if ( match ) {\r
-                               // Don't consume trailing commas as valid\r
-                               soFar = soFar.slice( match[0].length ) || soFar;\r
-                       }\r
-                       groups.push( tokens = [] );\r
-               }\r
-\r
-               matched = false;\r
-\r
-               // Combinators\r
-               if ( (match = rcombinators.exec( soFar )) ) {\r
-                       tokens.push( matched = new Token( match.shift() ) );\r
-                       soFar = soFar.slice( matched.length );\r
-\r
-                       // Cast descendant combinators to space\r
-                       matched.type = match[0].replace( rtrim, " " );\r
-               }\r
-\r
-               // Filters\r
-               for ( type in Expr.filter ) {\r
-                       if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\r
-                               (match = preFilters[ type ]( match ))) ) {\r
-\r
-                               tokens.push( matched = new Token( match.shift() ) );\r
-                               soFar = soFar.slice( matched.length );\r
-                               matched.type = type;\r
-                               matched.matches = match;\r
-                       }\r
-               }\r
-\r
-               if ( !matched ) {\r
-                       break;\r
-               }\r
-       }\r
-\r
-       // Return the length of the invalid excess\r
-       // if we're just parsing\r
-       // Otherwise, throw an error or return tokens\r
-       return parseOnly ?\r
-               soFar.length :\r
-               soFar ?\r
-                       Sizzle.error( selector ) :\r
-                       // Cache the tokens\r
-                       tokenCache( selector, groups ).slice( 0 );\r
-}\r
-\r
-function addCombinator( matcher, combinator, base ) {\r
-       var dir = combinator.dir,\r
-               checkNonElements = base && combinator.dir === "parentNode",\r
-               doneName = done++;\r
-\r
-       return combinator.first ?\r
-               // Check against closest ancestor/preceding element\r
-               function( elem, context, xml ) {\r
-                       while ( (elem = elem[ dir ]) ) {\r
-                               if ( checkNonElements || elem.nodeType === 1  ) {\r
-                                       return matcher( elem, context, xml );\r
-                               }\r
-                       }\r
-               } :\r
-\r
-               // Check against all ancestor/preceding elements\r
-               function( elem, context, xml ) {\r
-                       // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching\r
-                       if ( !xml ) {\r
-                               var cache,\r
-                                       dirkey = dirruns + " " + doneName + " ",\r
-                                       cachedkey = dirkey + cachedruns;\r
-                               while ( (elem = elem[ dir ]) ) {\r
-                                       if ( checkNonElements || elem.nodeType === 1 ) {\r
-                                               if ( (cache = elem[ expando ]) === cachedkey ) {\r
-                                                       return elem.sizset;\r
-                                               } else if ( typeof cache === "string" && cache.indexOf(dirkey) === 0 ) {\r
-                                                       if ( elem.sizset ) {\r
-                                                               return elem;\r
-                                                       }\r
-                                               } else {\r
-                                                       elem[ expando ] = cachedkey;\r
-                                                       if ( matcher( elem, context, xml ) ) {\r
-                                                               elem.sizset = true;\r
-                                                               return elem;\r
-                                                       }\r
-                                                       elem.sizset = false;\r
-                                               }\r
-                                       }\r
-                               }\r
-                       } else {\r
-                               while ( (elem = elem[ dir ]) ) {\r
-                                       if ( checkNonElements || elem.nodeType === 1 ) {\r
-                                               if ( matcher( elem, context, xml ) ) {\r
-                                                       return elem;\r
-                                               }\r
-                                       }\r
-                               }\r
-                       }\r
-               };\r
-}\r
-\r
-function elementMatcher( matchers ) {\r
-       return matchers.length > 1 ?\r
-               function( elem, context, xml ) {\r
-                       var i = matchers.length;\r
-                       while ( i-- ) {\r
-                               if ( !matchers[i]( elem, context, xml ) ) {\r
-                                       return false;\r
-                               }\r
-                       }\r
-                       return true;\r
-               } :\r
-               matchers[0];\r
-}\r
-\r
-function condense( unmatched, map, filter, context, xml ) {\r
-       var elem,\r
-               newUnmatched = [],\r
-               i = 0,\r
-               len = unmatched.length,\r
-               mapped = map != null;\r
-\r
-       for ( ; i < len; i++ ) {\r
-               if ( (elem = unmatched[i]) ) {\r
-                       if ( !filter || filter( elem, context, xml ) ) {\r
-                               newUnmatched.push( elem );\r
-                               if ( mapped ) {\r
-                                       map.push( i );\r
-                               }\r
-                       }\r
-               }\r
-       }\r
-\r
-       return newUnmatched;\r
-}\r
-\r
-function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\r
-       if ( postFilter && !postFilter[ expando ] ) {\r
-               postFilter = setMatcher( postFilter );\r
-       }\r
-       if ( postFinder && !postFinder[ expando ] ) {\r
-               postFinder = setMatcher( postFinder, postSelector );\r
-       }\r
-       return markFunction(function( seed, results, context, xml ) {\r
-               var temp, i, elem,\r
-                       preMap = [],\r
-                       postMap = [],\r
-                       preexisting = results.length,\r
-\r
-                       // Get initial elements from seed or context\r
-                       elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),\r
-\r
-                       // Prefilter to get matcher input, preserving a map for seed-results synchronization\r
-                       matcherIn = preFilter && ( seed || !selector ) ?\r
-                               condense( elems, preMap, preFilter, context, xml ) :\r
-                               elems,\r
-\r
-                       matcherOut = matcher ?\r
-                               // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\r
-                               postFinder || ( seed ? preFilter : preexisting || postFilter ) ?\r
-\r
-                                       // ...intermediate processing is necessary\r
-                                       [] :\r
-\r
-                                       // ...otherwise use results directly\r
-                                       results :\r
-                               matcherIn;\r
-\r
-               // Find primary matches\r
-               if ( matcher ) {\r
-                       matcher( matcherIn, matcherOut, context, xml );\r
-               }\r
-\r
-               // Apply postFilter\r
-               if ( postFilter ) {\r
-                       temp = condense( matcherOut, postMap );\r
-                       postFilter( temp, [], context, xml );\r
-\r
-                       // Un-match failing elements by moving them back to matcherIn\r
-                       i = temp.length;\r
-                       while ( i-- ) {\r
-                               if ( (elem = temp[i]) ) {\r
-                                       matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\r
-                               }\r
-                       }\r
-               }\r
-\r
-               if ( seed ) {\r
-                       if ( postFinder || preFilter ) {\r
-                               if ( postFinder ) {\r
-                                       // Get the final matcherOut by condensing this intermediate into postFinder contexts\r
-                                       temp = [];\r
-                                       i = matcherOut.length;\r
-                                       while ( i-- ) {\r
-                                               if ( (elem = matcherOut[i]) ) {\r
-                                                       // Restore matcherIn since elem is not yet a final match\r
-                                                       temp.push( (matcherIn[i] = elem) );\r
-                                               }\r
-                                       }\r
-                                       postFinder( null, (matcherOut = []), temp, xml );\r
-                               }\r
-\r
-                               // Move matched elements from seed to results to keep them synchronized\r
-                               i = matcherOut.length;\r
-                               while ( i-- ) {\r
-                                       if ( (elem = matcherOut[i]) &&\r
-                                               (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {\r
-\r
-                                               seed[temp] = !(results[temp] = elem);\r
-                                       }\r
-                               }\r
-                       }\r
-\r
-               // Add elements to results, through postFinder if defined\r
-               } else {\r
-                       matcherOut = condense(\r
-                               matcherOut === results ?\r
-                                       matcherOut.splice( preexisting, matcherOut.length ) :\r
-                                       matcherOut\r
-                       );\r
-                       if ( postFinder ) {\r
-                               postFinder( null, results, matcherOut, xml );\r
-                       } else {\r
-                               push.apply( results, matcherOut );\r
-                       }\r
-               }\r
-       });\r
-}\r
-\r
-function matcherFromTokens( tokens ) {\r
-       var checkContext, matcher, j,\r
-               len = tokens.length,\r
-               leadingRelative = Expr.relative[ tokens[0].type ],\r
-               implicitRelative = leadingRelative || Expr.relative[" "],\r
-               i = leadingRelative ? 1 : 0,\r
-\r
-               // The foundational matcher ensures that elements are reachable from top-level context(s)\r
-               matchContext = addCombinator( function( elem ) {\r
-                       return elem === checkContext;\r
-               }, implicitRelative, true ),\r
-               matchAnyContext = addCombinator( function( elem ) {\r
-                       return indexOf.call( checkContext, elem ) > -1;\r
-               }, implicitRelative, true ),\r
-               matchers = [ function( elem, context, xml ) {\r
-                       return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\r
-                               (checkContext = context).nodeType ?\r
-                                       matchContext( elem, context, xml ) :\r
-                                       matchAnyContext( elem, context, xml ) );\r
-               } ];\r
-\r
-       for ( ; i < len; i++ ) {\r
-               if ( (matcher = Expr.relative[ tokens[i].type ]) ) {\r
-                       matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];\r
-               } else {\r
-                       matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\r
-\r
-                       // Return special upon seeing a positional matcher\r
-                       if ( matcher[ expando ] ) {\r
-                               // Find the next relative operator (if any) for proper handling\r
-                               j = ++i;\r
-                               for ( ; j < len; j++ ) {\r
-                                       if ( Expr.relative[ tokens[j].type ] ) {\r
-                                               break;\r
-                                       }\r
-                               }\r
-                               return setMatcher(\r
-                                       i > 1 && elementMatcher( matchers ),\r
-                                       i > 1 && tokens.slice( 0, i - 1 ).join("").replace( rtrim, "$1" ),\r
-                                       matcher,\r
-                                       i < j && matcherFromTokens( tokens.slice( i, j ) ),\r
-                                       j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\r
-                                       j < len && tokens.join("")\r
-                               );\r
-                       }\r
-                       matchers.push( matcher );\r
-               }\r
-       }\r
-\r
-       return elementMatcher( matchers );\r
-}\r
-\r
-function matcherFromGroupMatchers( elementMatchers, setMatchers ) {\r
-       var bySet = setMatchers.length > 0,\r
-               byElement = elementMatchers.length > 0,\r
-               superMatcher = function( seed, context, xml, results, expandContext ) {\r
-                       var elem, j, matcher,\r
-                               setMatched = [],\r
-                               matchedCount = 0,\r
-                               i = "0",\r
-                               unmatched = seed && [],\r
-                               outermost = expandContext != null,\r
-                               contextBackup = outermostContext,\r
-                               // We must always have either seed elements or context\r
-                               elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ),\r
-                               // Nested matchers should use non-integer dirruns\r
-                               dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.E);\r
-\r
-                       if ( outermost ) {\r
-                               outermostContext = context !== document && context;\r
-                               cachedruns = superMatcher.el;\r
-                       }\r
-\r
-                       // Add elements passing elementMatchers directly to results\r
-                       for ( ; (elem = elems[i]) != null; i++ ) {\r
-                               if ( byElement && elem ) {\r
-                                       for ( j = 0; (matcher = elementMatchers[j]); j++ ) {\r
-                                               if ( matcher( elem, context, xml ) ) {\r
-                                                       results.push( elem );\r
-                                                       break;\r
-                                               }\r
-                                       }\r
-                                       if ( outermost ) {\r
-                                               dirruns = dirrunsUnique;\r
-                                               cachedruns = ++superMatcher.el;\r
-                                       }\r
-                               }\r
-\r
-                               // Track unmatched elements for set filters\r
-                               if ( bySet ) {\r
-                                       // They will have gone through all possible matchers\r
-                                       if ( (elem = !matcher && elem) ) {\r
-                                               matchedCount--;\r
-                                       }\r
-\r
-                                       // Lengthen the array for every element, matched or not\r
-                                       if ( seed ) {\r
-                                               unmatched.push( elem );\r
-                                       }\r
-                               }\r
-                       }\r
-\r
-                       // Apply set filters to unmatched elements\r
-                       matchedCount += i;\r
-                       if ( bySet && i !== matchedCount ) {\r
-                               for ( j = 0; (matcher = setMatchers[j]); j++ ) {\r
-                                       matcher( unmatched, setMatched, context, xml );\r
-                               }\r
-\r
-                               if ( seed ) {\r
-                                       // Reintegrate element matches to eliminate the need for sorting\r
-                                       if ( matchedCount > 0 ) {\r
-                                               while ( i-- ) {\r
-                                                       if ( !(unmatched[i] || setMatched[i]) ) {\r
-                                                               setMatched[i] = pop.call( results );\r
-                                                       }\r
-                                               }\r
-                                       }\r
-\r
-                                       // Discard index placeholder values to get only actual matches\r
-                                       setMatched = condense( setMatched );\r
-                               }\r
-\r
-                               // Add matches to results\r
-                               push.apply( results, setMatched );\r
-\r
-                               // Seedless set matches succeeding multiple successful matchers stipulate sorting\r
-                               if ( outermost && !seed && setMatched.length > 0 &&\r
-                                       ( matchedCount + setMatchers.length ) > 1 ) {\r
-\r
-                                       Sizzle.uniqueSort( results );\r
-                               }\r
-                       }\r
-\r
-                       // Override manipulation of globals by nested matchers\r
-                       if ( outermost ) {\r
-                               dirruns = dirrunsUnique;\r
-                               outermostContext = contextBackup;\r
-                       }\r
-\r
-                       return unmatched;\r
-               };\r
-\r
-       superMatcher.el = 0;\r
-       return bySet ?\r
-               markFunction( superMatcher ) :\r
-               superMatcher;\r
-}\r
-\r
-compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {\r
-       var i,\r
-               setMatchers = [],\r
-               elementMatchers = [],\r
-               cached = compilerCache[ expando ][ selector + " " ];\r
-\r
-       if ( !cached ) {\r
-               // Generate a function of recursive functions that can be used to check each element\r
-               if ( !group ) {\r
-                       group = tokenize( selector );\r
-               }\r
-               i = group.length;\r
-               while ( i-- ) {\r
-                       cached = matcherFromTokens( group[i] );\r
-                       if ( cached[ expando ] ) {\r
-                               setMatchers.push( cached );\r
-                       } else {\r
-                               elementMatchers.push( cached );\r
-                       }\r
-               }\r
-\r
-               // Cache the compiled function\r
-               cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\r
-       }\r
-       return cached;\r
-};\r
-\r
-function multipleContexts( selector, contexts, results ) {\r
-       var i = 0,\r
-               len = contexts.length;\r
-       for ( ; i < len; i++ ) {\r
-               Sizzle( selector, contexts[i], results );\r
-       }\r
-       return results;\r
-}\r
-\r
-function select( selector, context, results, seed, xml ) {\r
-       var i, tokens, token, type, find,\r
-               match = tokenize( selector ),\r
-               j = match.length;\r
-\r
-       if ( !seed ) {\r
-               // Try to minimize operations if there is only one group\r
-               if ( match.length === 1 ) {\r
-\r
-                       // Take a shortcut and set the context if the root selector is an ID\r
-                       tokens = match[0] = match[0].slice( 0 );\r
-                       if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&\r
-                                       context.nodeType === 9 && !xml &&\r
-                                       Expr.relative[ tokens[1].type ] ) {\r
-\r
-                               context = Expr.find["ID"]( token.matches[0].replace( rbackslash, "" ), context, xml )[0];\r
-                               if ( !context ) {\r
-                                       return results;\r
-                               }\r
-\r
-                               selector = selector.slice( tokens.shift().length );\r
-                       }\r
-\r
-                       // Fetch a seed set for right-to-left matching\r
-                       for ( i = matchExpr["POS"].test( selector ) ? -1 : tokens.length - 1; i >= 0; i-- ) {\r
-                               token = tokens[i];\r
-\r
-                               // Abort if we hit a combinator\r
-                               if ( Expr.relative[ (type = token.type) ] ) {\r
-                                       break;\r
-                               }\r
-                               if ( (find = Expr.find[ type ]) ) {\r
-                                       // Search, expanding context for leading sibling combinators\r
-                                       if ( (seed = find(\r
-                                               token.matches[0].replace( rbackslash, "" ),\r
-                                               rsibling.test( tokens[0].type ) && context.parentNode || context,\r
-                                               xml\r
-                                       )) ) {\r
-\r
-                                               // If seed is empty or no tokens remain, we can return early\r
-                                               tokens.splice( i, 1 );\r
-                                               selector = seed.length && tokens.join("");\r
-                                               if ( !selector ) {\r
-                                                       push.apply( results, slice.call( seed, 0 ) );\r
-                                                       return results;\r
-                                               }\r
-\r
-                                               break;\r
-                                       }\r
-                               }\r
-                       }\r
-               }\r
-       }\r
-\r
-       // Compile and execute a filtering function\r
-       // Provide `match` to avoid retokenization if we modified the selector above\r
-       compile( selector, match )(\r
-               seed,\r
-               context,\r
-               xml,\r
-               results,\r
-               rsibling.test( selector )\r
-       );\r
-       return results;\r
-}\r
-\r
-if ( document.querySelectorAll ) {\r
-       (function() {\r
-               var disconnectedMatch,\r
-                       oldSelect = select,\r
-                       rescape = /'|\\/g,\r
-                       rattributeQuotes = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,\r
-\r
-                       // qSa(:focus) reports false when true (Chrome 21), no need to also add to buggyMatches since matches checks buggyQSA\r
-                       // A support test would require too much code (would include document ready)\r
-                       rbuggyQSA = [ ":focus" ],\r
-\r
-                       // matchesSelector(:active) reports false when true (IE9/Opera 11.5)\r
-                       // A support test would require too much code (would include document ready)\r
-                       // just skip matchesSelector for :active\r
-                       rbuggyMatches = [ ":active" ],\r
-                       matches = docElem.matchesSelector ||\r
-                               docElem.mozMatchesSelector ||\r
-                               docElem.webkitMatchesSelector ||\r
-                               docElem.oMatchesSelector ||\r
-                               docElem.msMatchesSelector;\r
-\r
-               // Build QSA regex\r
-               // Regex strategy adopted from Diego Perini\r
-               assert(function( div ) {\r
-                       // Select is set to empty string on purpose\r
-                       // This is to test IE's treatment of not explictly\r
-                       // setting a boolean content attribute,\r
-                       // since its presence should be enough\r
-                       // http://bugs.jquery.com/ticket/12359\r
-                       div.innerHTML = "<select><option selected=''></option></select>";\r
-\r
-                       // IE8 - Some boolean attributes are not treated correctly\r
-                       if ( !div.querySelectorAll("[selected]").length ) {\r
-                               rbuggyQSA.push( "\\[" + whitespace + "*(?:checked|disabled|ismap|multiple|readonly|selected|value)" );\r
-                       }\r
-\r
-                       // Webkit/Opera - :checked should return selected option elements\r
-                       // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\r
-                       // IE8 throws error here (do not put tests after this one)\r
-                       if ( !div.querySelectorAll(":checked").length ) {\r
-                               rbuggyQSA.push(":checked");\r
-                       }\r
-               });\r
-\r
-               assert(function( div ) {\r
-\r
-                       // Opera 10-12/IE9 - ^= $= *= and empty values\r
-                       // Should not select anything\r
-                       div.innerHTML = "<p test=''></p>";\r
-                       if ( div.querySelectorAll("[test^='']").length ) {\r
-                               rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:\"\"|'')" );\r
-                       }\r
-\r
-                       // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\r
-                       // IE8 throws error here (do not put tests after this one)\r
-                       div.innerHTML = "<input type='hidden'/>";\r
-                       if ( !div.querySelectorAll(":enabled").length ) {\r
-                               rbuggyQSA.push(":enabled", ":disabled");\r
-                       }\r
-               });\r
-\r
-               // rbuggyQSA always contains :focus, so no need for a length check\r
-               rbuggyQSA = /* rbuggyQSA.length && */ new RegExp( rbuggyQSA.join("|") );\r
-\r
-               select = function( selector, context, results, seed, xml ) {\r
-                       // Only use querySelectorAll when not filtering,\r
-                       // when this is not xml,\r
-                       // and when no QSA bugs apply\r
-                       if ( !seed && !xml && !rbuggyQSA.test( selector ) ) {\r
-                               var groups, i,\r
-                                       old = true,\r
-                                       nid = expando,\r
-                                       newContext = context,\r
-                                       newSelector = context.nodeType === 9 && selector;\r
-\r
-                               // qSA works strangely on Element-rooted queries\r
-                               // We can work around this by specifying an extra ID on the root\r
-                               // and working up from there (Thanks to Andrew Dupont for the technique)\r
-                               // IE 8 doesn't work on object elements\r
-                               if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {\r
-                                       groups = tokenize( selector );\r
-\r
-                                       if ( (old = context.getAttribute("id")) ) {\r
-                                               nid = old.replace( rescape, "\\$&" );\r
-                                       } else {\r
-                                               context.setAttribute( "id", nid );\r
-                                       }\r
-                                       nid = "[id='" + nid + "'] ";\r
-\r
-                                       i = groups.length;\r
-                                       while ( i-- ) {\r
-                                               groups[i] = nid + groups[i].join("");\r
-                                       }\r
-                                       newContext = rsibling.test( selector ) && context.parentNode || context;\r
-                                       newSelector = groups.join(",");\r
-                               }\r
-\r
-                               if ( newSelector ) {\r
-                                       try {\r
-                                               push.apply( results, slice.call( newContext.querySelectorAll(\r
-                                                       newSelector\r
-                                               ), 0 ) );\r
-                                               return results;\r
-                                       } catch(qsaError) {\r
-                                       } finally {\r
-                                               if ( !old ) {\r
-                                                       context.removeAttribute("id");\r
-                                               }\r
-                                       }\r
-                               }\r
-                       }\r
-\r
-                       return oldSelect( selector, context, results, seed, xml );\r
-               };\r
-\r
-               if ( matches ) {\r
-                       assert(function( div ) {\r
-                               // Check to see if it's possible to do matchesSelector\r
-                               // on a disconnected node (IE 9)\r
-                               disconnectedMatch = matches.call( div, "div" );\r
-\r
-                               // This should fail with an exception\r
-                               // Gecko does not error, returns false instead\r
-                               try {\r
-                                       matches.call( div, "[test!='']:sizzle" );\r
-                                       rbuggyMatches.push( "!=", pseudos );\r
-                               } catch ( e ) {}\r
-                       });\r
-\r
-                       // rbuggyMatches always contains :active and :focus, so no need for a length check\r
-                       rbuggyMatches = /* rbuggyMatches.length && */ new RegExp( rbuggyMatches.join("|") );\r
-\r
-                       Sizzle.matchesSelector = function( elem, expr ) {\r
-                               // Make sure that attribute selectors are quoted\r
-                               expr = expr.replace( rattributeQuotes, "='$1']" );\r
-\r
-                               // rbuggyMatches always contains :active, so no need for an existence check\r
-                               if ( !isXML( elem ) && !rbuggyMatches.test( expr ) && !rbuggyQSA.test( expr ) ) {\r
-                                       try {\r
-                                               var ret = matches.call( elem, expr );\r
-\r
-                                               // IE 9's matchesSelector returns false on disconnected nodes\r
-                                               if ( ret || disconnectedMatch ||\r
-                                                               // As well, disconnected nodes are said to be in a document\r
-                                                               // fragment in IE 9\r
-                                                               elem.document && elem.document.nodeType !== 11 ) {\r
-                                                       return ret;\r
-                                               }\r
-                                       } catch(e) {}\r
-                               }\r
-\r
-                               return Sizzle( expr, null, null, [ elem ] ).length > 0;\r
-                       };\r
-               }\r
-       })();\r
-}\r
-\r
-// Deprecated\r
-Expr.pseudos["nth"] = Expr.pseudos["eq"];\r
-\r
-// Back-compat\r
-function setFilters() {}\r
-Expr.filters = setFilters.prototype = Expr.pseudos;\r
-Expr.setFilters = new setFilters();\r
-\r
-// Override sizzle attribute retrieval
-Sizzle.attr = jQuery.attr;
-jQuery.find = Sizzle;
-jQuery.expr = Sizzle.selectors;
-jQuery.expr[":"] = jQuery.expr.pseudos;
-jQuery.unique = Sizzle.uniqueSort;
-jQuery.text = Sizzle.getText;
-jQuery.isXMLDoc = Sizzle.isXML;
-jQuery.contains = Sizzle.contains;
-\r
-\r
-})( window );\r
-var runtil = /Until$/,
-       rparentsprev = /^(?:parents|prev(?:Until|All))/,
-       isSimple = /^.[^:#\[\.,]*$/,
-       rneedsContext = jQuery.expr.match.needsContext,
-       // methods guaranteed to produce a unique set when starting from a unique set
-       guaranteedUnique = {
-               children: true,
-               contents: true,
-               next: true,
-               prev: true
-       };
+       ret = callback.apply( elem, args || [] );
 
-jQuery.fn.extend({
-       find: function( selector ) {
-               var i, l, length, n, r, ret,
-                       self = this;
+       // Revert the old values
+       for ( name in options ) {
+               elem.style[ name ] = old[ name ];
+       }
 
-               if ( typeof selector !== "string" ) {
-                       return jQuery( selector ).filter(function() {
-                               for ( i = 0, l = self.length; i < l; i++ ) {
-                                       if ( jQuery.contains( self[ i ], this ) ) {
-                                               return true;
-                                       }
-                               }
-                       });
-               }
+       return ret;
+};
 
-               ret = this.pushStack( "", "find", selector );
 
-               for ( i = 0, l = this.length; i < l; i++ ) {
-                       length = ret.length;
-                       jQuery.find( selector, this[i], ret );
+var
+               ralpha = /alpha\([^)]*\)/i,
+       ropacity = /opacity\s*=\s*([^)]*)/,
 
-                       if ( i > 0 ) {
-                               // Make sure that the results are unique
-                               for ( n = length; n < ret.length; n++ ) {
-                                       for ( r = 0; r < length; r++ ) {
-                                               if ( ret[r] === ret[n] ) {
-                                                       ret.splice(n--, 1);
-                                                       break;
-                                               }
-                                       }
-                               }
-                       }
-               }
+       // swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
+       // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
+       rdisplayswap = /^(none|table(?!-c[ea]).+)/,
+       rnumsplit = new RegExp( "^(" + pnum + ")(.*)$", "i" ),
+       rrelNum = new RegExp( "^([+-])=(" + pnum + ")", "i" ),
 
-               return ret;
+       cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+       cssNormalTransform = {
+               letterSpacing: "0",
+               fontWeight: "400"
        },
 
-       has: function( target ) {
-               var i,
-                       targets = jQuery( target, this ),
-                       len = targets.length;
+       cssPrefixes = [ "Webkit", "O", "Moz", "ms" ];
 
-               return this.filter(function() {
-                       for ( i = 0; i < len; i++ ) {
-                               if ( jQuery.contains( this, targets[i] ) ) {
-                                       return true;
-                               }
-                       }
-               });
-       },
 
-       not: function( selector ) {
-               return this.pushStack( winnow(this, selector, false), "not", selector);
-       },
+// return a css property mapped to a potentially vendor prefixed property
+function vendorPropName( style, name ) {
 
-       filter: function( selector ) {
-               return this.pushStack( winnow(this, selector, true), "filter", selector );
-       },
+       // shortcut for names that are not vendor prefixed
+       if ( name in style ) {
+               return name;
+       }
 
-       is: function( selector ) {
-               return !!selector && (
-                       typeof selector === "string" ?
-                               // If this is a positional/relative selector, check membership in the returned set
-                               // so $("p:first").is("p:last") won't return true for a doc with two "p".
-                               rneedsContext.test( selector ) ?
-                                       jQuery( selector, this.context ).index( this[0] ) >= 0 :
-                                       jQuery.filter( selector, this ).length > 0 :
-                               this.filter( selector ).length > 0 );
-       },
+       // check for vendor prefixed names
+       var capName = name.charAt(0).toUpperCase() + name.slice(1),
+               origName = name,
+               i = cssPrefixes.length;
 
-       closest: function( selectors, context ) {
-               var cur,
-                       i = 0,
-                       l = this.length,
-                       ret = [],
-                       pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
-                               jQuery( selectors, context || this.context ) :
-                               0;
+       while ( i-- ) {
+               name = cssPrefixes[ i ] + capName;
+               if ( name in style ) {
+                       return name;
+               }
+       }
 
-               for ( ; i < l; i++ ) {
-                       cur = this[i];
+       return origName;
+}
 
-                       while ( cur && cur.ownerDocument && cur !== context && cur.nodeType !== 11 ) {
-                               if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
-                                       ret.push( cur );
-                                       break;
-                               }
-                               cur = cur.parentNode;
-                       }
-               }
+function showHide( elements, show ) {
+       var display, elem, hidden,
+               values = [],
+               index = 0,
+               length = elements.length;
 
-               ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
+       for ( ; index < length; index++ ) {
+               elem = elements[ index ];
+               if ( !elem.style ) {
+                       continue;
+               }
 
-               return this.pushStack( ret, "closest", selectors );
-       },
+               values[ index ] = jQuery._data( elem, "olddisplay" );
+               display = elem.style.display;
+               if ( show ) {
+                       // Reset the inline display of this element to learn if it is
+                       // being hidden by cascaded rules or not
+                       if ( !values[ index ] && display === "none" ) {
+                               elem.style.display = "";
+                       }
 
-       // Determine the position of an element within
-       // the matched set of elements
-       index: function( elem ) {
+                       // Set elements which have been overridden with display: none
+                       // in a stylesheet to whatever the default browser style is
+                       // for such an element
+                       if ( elem.style.display === "" && isHidden( elem ) ) {
+                               values[ index ] = jQuery._data( elem, "olddisplay", defaultDisplay(elem.nodeName) );
+                       }
+               } else {
+                       hidden = isHidden( elem );
 
-               // No argument, return index in parent
-               if ( !elem ) {
-                       return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
+                       if ( display && display !== "none" || !hidden ) {
+                               jQuery._data( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) );
+                       }
                }
+       }
 
-               // index in selector
-               if ( typeof elem === "string" ) {
-                       return jQuery.inArray( this[0], jQuery( elem ) );
+       // Set the display of most of the elements in a second loop
+       // to avoid the constant reflow
+       for ( index = 0; index < length; index++ ) {
+               elem = elements[ index ];
+               if ( !elem.style ) {
+                       continue;
+               }
+               if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
+                       elem.style.display = show ? values[ index ] || "" : "none";
                }
+       }
 
-               // Locate the position of the desired element
-               return jQuery.inArray(
-                       // If it receives a jQuery object, the first element is used
-                       elem.jquery ? elem[0] : elem, this );
-       },
+       return elements;
+}
 
-       add: function( selector, context ) {
-               var set = typeof selector === "string" ?
-                               jQuery( selector, context ) :
-                               jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
-                       all = jQuery.merge( this.get(), set );
+function setPositiveNumber( elem, value, subtract ) {
+       var matches = rnumsplit.exec( value );
+       return matches ?
+               // Guard against undefined "subtract", e.g., when used as in cssHooks
+               Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
+               value;
+}
 
-               return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
-                       all :
-                       jQuery.unique( all ) );
-       },
+function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
+       var i = extra === ( isBorderBox ? "border" : "content" ) ?
+               // If we already have the right measurement, avoid augmentation
+               4 :
+               // Otherwise initialize for horizontal or vertical properties
+               name === "width" ? 1 : 0,
 
-       addBack: function( selector ) {
-               return this.add( selector == null ?
-                       this.prevObject : this.prevObject.filter(selector)
-               );
-       }
-});
+               val = 0;
 
-jQuery.fn.andSelf = jQuery.fn.addBack;
+       for ( ; i < 4; i += 2 ) {
+               // both box models exclude margin, so add it if we want it
+               if ( extra === "margin" ) {
+                       val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
+               }
 
-// A painfully simple check to see if an element is disconnected
-// from a document (should be improved, where feasible).
-function isDisconnected( node ) {
-       return !node || !node.parentNode || node.parentNode.nodeType === 11;
-}
+               if ( isBorderBox ) {
+                       // border-box includes padding, so remove it if we want content
+                       if ( extra === "content" ) {
+                               val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+                       }
 
-function sibling( cur, dir ) {
-       do {
-               cur = cur[ dir ];
-       } while ( cur && cur.nodeType !== 1 );
+                       // at this point, extra isn't border nor margin, so remove border
+                       if ( extra !== "margin" ) {
+                               val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+                       }
+               } else {
+                       // at this point, extra isn't content, so add padding
+                       val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
 
-       return cur;
+                       // at this point, extra isn't content nor padding, so add border
+                       if ( extra !== "padding" ) {
+                               val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+                       }
+               }
+       }
+
+       return val;
 }
 
-jQuery.each({
-       parent: function( elem ) {
-               var parent = elem.parentNode;
-               return parent && parent.nodeType !== 11 ? parent : null;
-       },
-       parents: function( elem ) {
-               return jQuery.dir( elem, "parentNode" );
-       },
-       parentsUntil: function( elem, i, until ) {
-               return jQuery.dir( elem, "parentNode", until );
-       },
-       next: function( elem ) {
-               return sibling( elem, "nextSibling" );
-       },
-       prev: function( elem ) {
-               return sibling( elem, "previousSibling" );
-       },
-       nextAll: function( elem ) {
-               return jQuery.dir( elem, "nextSibling" );
-       },
-       prevAll: function( elem ) {
-               return jQuery.dir( elem, "previousSibling" );
-       },
-       nextUntil: function( elem, i, until ) {
-               return jQuery.dir( elem, "nextSibling", until );
-       },
-       prevUntil: function( elem, i, until ) {
-               return jQuery.dir( elem, "previousSibling", until );
-       },
-       siblings: function( elem ) {
-               return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
-       },
-       children: function( elem ) {
-               return jQuery.sibling( elem.firstChild );
-       },
-       contents: function( elem ) {
-               return jQuery.nodeName( elem, "iframe" ) ?
-                       elem.contentDocument || elem.contentWindow.document :
-                       jQuery.merge( [], elem.childNodes );
-       }
-}, function( name, fn ) {
-       jQuery.fn[ name ] = function( until, selector ) {
-               var ret = jQuery.map( this, fn, until );
+function getWidthOrHeight( elem, name, extra ) {
 
-               if ( !runtil.test( name ) ) {
-                       selector = until;
+       // Start with offset property, which is equivalent to the border-box value
+       var valueIsBorderBox = true,
+               val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+               styles = getStyles( elem ),
+               isBorderBox = support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
+
+       // some non-html elements return undefined for offsetWidth, so check for null/undefined
+       // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
+       // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
+       if ( val <= 0 || val == null ) {
+               // Fall back to computed then uncomputed css if necessary
+               val = curCSS( elem, name, styles );
+               if ( val < 0 || val == null ) {
+                       val = elem.style[ name ];
                }
 
-               if ( selector && typeof selector === "string" ) {
-                       ret = jQuery.filter( selector, ret );
+               // Computed unit is not pixels. Stop here and return.
+               if ( rnumnonpx.test(val) ) {
+                       return val;
                }
 
-               ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
+               // we need the check for style in case a browser which returns unreliable values
+               // for getComputedStyle silently falls back to the reliable elem.style
+               valueIsBorderBox = isBorderBox && ( support.boxSizingReliable() || val === elem.style[ name ] );
 
-               if ( this.length > 1 && rparentsprev.test( name ) ) {
-                       ret = ret.reverse();
-               }
+               // Normalize "", auto, and prepare for extra
+               val = parseFloat( val ) || 0;
+       }
 
-               return this.pushStack( ret, name, core_slice.call( arguments ).join(",") );
-       };
-});
+       // use the active box-sizing model to add/subtract irrelevant styles
+       return ( val +
+               augmentWidthOrHeight(
+                       elem,
+                       name,
+                       extra || ( isBorderBox ? "border" : "content" ),
+                       valueIsBorderBox,
+                       styles
+               )
+       ) + "px";
+}
 
 jQuery.extend({
-       filter: function( expr, elems, not ) {
-               if ( not ) {
-                       expr = ":not(" + expr + ")";
+       // Add in style property hooks for overriding the default
+       // behavior of getting and setting a style property
+       cssHooks: {
+               opacity: {
+                       get: function( elem, computed ) {
+                               if ( computed ) {
+                                       // We should always get a number back from opacity
+                                       var ret = curCSS( elem, "opacity" );
+                                       return ret === "" ? "1" : ret;
+                               }
+                       }
                }
+       },
 
-               return elems.length === 1 ?
-                       jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
-                       jQuery.find.matches(expr, elems);
+       // Don't automatically add "px" to these possibly-unitless properties
+       cssNumber: {
+               "columnCount": true,
+               "fillOpacity": true,
+               "flexGrow": true,
+               "flexShrink": true,
+               "fontWeight": true,
+               "lineHeight": true,
+               "opacity": true,
+               "order": true,
+               "orphans": true,
+               "widows": true,
+               "zIndex": true,
+               "zoom": true
        },
 
-       dir: function( elem, dir, until ) {
-               var matched = [],
-                       cur = elem[ dir ];
+       // Add in properties whose names you wish to fix before
+       // setting or getting the value
+       cssProps: {
+               // normalize float css property
+               "float": support.cssFloat ? "cssFloat" : "styleFloat"
+       },
 
-               while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
-                       if ( cur.nodeType === 1 ) {
-                               matched.push( cur );
-                       }
-                       cur = cur[dir];
+       // Get and set the style property on a DOM Node
+       style: function( elem, name, value, extra ) {
+               // Don't set styles on text and comment nodes
+               if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+                       return;
                }
-               return matched;
-       },
 
-       sibling: function( n, elem ) {
-               var r = [];
+               // Make sure that we're working with the right name
+               var ret, type, hooks,
+                       origName = jQuery.camelCase( name ),
+                       style = elem.style;
 
-               for ( ; n; n = n.nextSibling ) {
-                       if ( n.nodeType === 1 && n !== elem ) {
-                               r.push( n );
+               name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
+
+               // gets hook for the prefixed version
+               // followed by the unprefixed version
+               hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+               // Check if we're setting a value
+               if ( value !== undefined ) {
+                       type = typeof value;
+
+                       // convert relative number strings (+= or -=) to relative numbers. #7345
+                       if ( type === "string" && (ret = rrelNum.exec( value )) ) {
+                               value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
+                               // Fixes bug #9237
+                               type = "number";
+                       }
+
+                       // Make sure that null and NaN values aren't set. See: #7116
+                       if ( value == null || value !== value ) {
+                               return;
+                       }
+
+                       // If a number was passed in, add 'px' to the (except for certain CSS properties)
+                       if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
+                               value += "px";
                        }
+
+                       // Fixes #8908, it can be done more correctly by specifing setters in cssHooks,
+                       // but it would mean to define eight (for every problematic property) identical functions
+                       if ( !support.clearCloneStyle && value === "" && name.indexOf("background") === 0 ) {
+                               style[ name ] = "inherit";
+                       }
+
+                       // If a hook was provided, use that value, otherwise just set the specified value
+                       if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
+
+                               // Support: IE
+                               // Swallow errors from 'invalid' CSS values (#5509)
+                               try {
+                                       style[ name ] = value;
+                               } catch(e) {}
+                       }
+
+               } else {
+                       // If a hook was provided get the non-computed value from there
+                       if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
+                               return ret;
+                       }
+
+                       // Otherwise just get the value from the style object
+                       return style[ name ];
                }
+       },
 
-               return r;
-       }
-});
+       css: function( elem, name, extra, styles ) {
+               var num, val, hooks,
+                       origName = jQuery.camelCase( name );
 
-// Implement the identical functionality for filter and not
-function winnow( elements, qualifier, keep ) {
+               // Make sure that we're working with the right name
+               name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
 
-       // Can't pass null or undefined to indexOf in Firefox 4
-       // Set to 0 to skip string check
-       qualifier = qualifier || 0;
+               // gets hook for the prefixed version
+               // followed by the unprefixed version
+               hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
 
-       if ( jQuery.isFunction( qualifier ) ) {
-               return jQuery.grep(elements, function( elem, i ) {
-                       var retVal = !!qualifier.call( elem, i, elem );
-                       return retVal === keep;
-               });
+               // If a hook was provided get the computed value from there
+               if ( hooks && "get" in hooks ) {
+                       val = hooks.get( elem, true, extra );
+               }
 
-       } else if ( qualifier.nodeType ) {
-               return jQuery.grep(elements, function( elem, i ) {
-                       return ( elem === qualifier ) === keep;
-               });
+               // Otherwise, if a way to get the computed value exists, use that
+               if ( val === undefined ) {
+                       val = curCSS( elem, name, styles );
+               }
 
-       } else if ( typeof qualifier === "string" ) {
-               var filtered = jQuery.grep(elements, function( elem ) {
-                       return elem.nodeType === 1;
-               });
+               //convert "normal" to computed value
+               if ( val === "normal" && name in cssNormalTransform ) {
+                       val = cssNormalTransform[ name ];
+               }
 
-               if ( isSimple.test( qualifier ) ) {
-                       return jQuery.filter(qualifier, filtered, !keep);
-               } else {
-                       qualifier = jQuery.filter( qualifier, filtered );
+               // Return, converting to number if forced or a qualifier was provided and val looks numeric
+               if ( extra === "" || extra ) {
+                       num = parseFloat( val );
+                       return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;
                }
+               return val;
        }
+});
 
-       return jQuery.grep(elements, function( elem, i ) {
-               return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
-       });
-}
-function createSafeFragment( document ) {
-       var list = nodeNames.split( "|" ),
-       safeFrag = document.createDocumentFragment();
+jQuery.each([ "height", "width" ], function( i, name ) {
+       jQuery.cssHooks[ name ] = {
+               get: function( elem, computed, extra ) {
+                       if ( computed ) {
+                               // certain elements can have dimension info if we invisibly show them
+                               // however, it must have a current display style that would benefit from this
+                               return rdisplayswap.test( jQuery.css( elem, "display" ) ) && elem.offsetWidth === 0 ?
+                                       jQuery.swap( elem, cssShow, function() {
+                                               return getWidthOrHeight( elem, name, extra );
+                                       }) :
+                                       getWidthOrHeight( elem, name, extra );
+                       }
+               },
 
-       if ( safeFrag.createElement ) {
-               while ( list.length ) {
-                       safeFrag.createElement(
-                               list.pop()
+               set: function( elem, value, extra ) {
+                       var styles = extra && getStyles( elem );
+                       return setPositiveNumber( elem, value, extra ?
+                               augmentWidthOrHeight(
+                                       elem,
+                                       name,
+                                       extra,
+                                       support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
+                                       styles
+                               ) : 0
                        );
                }
-       }
-       return safeFrag;
-}
+       };
+});
 
-var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
-               "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
-       rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
-       rleadingWhitespace = /^\s+/,
-       rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
-       rtagName = /<([\w:]+)/,
-       rtbody = /<tbody/i,
-       rhtml = /<|&#?\w+;/,
-       rnoInnerhtml = /<(?:script|style|link)/i,
-       rnocache = /<(?:script|object|embed|option|style)/i,
-       rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
-       rcheckableType = /^(?:checkbox|radio)$/,
-       // checked="checked" or checked
-       rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
-       rscriptType = /\/(java|ecma)script/i,
-       rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,
-       wrapMap = {
-               option: [ 1, "<select multiple='multiple'>", "</select>" ],
-               legend: [ 1, "<fieldset>", "</fieldset>" ],
-               thead: [ 1, "<table>", "</table>" ],
-               tr: [ 2, "<table><tbody>", "</tbody></table>" ],
-               td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
-               col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
-               area: [ 1, "<map>", "</map>" ],
-               _default: [ 0, "", "" ]
-       },
-       safeFragment = createSafeFragment( document ),
-       fragmentDiv = safeFragment.appendChild( document.createElement("div") );
+if ( !support.opacity ) {
+       jQuery.cssHooks.opacity = {
+               get: function( elem, computed ) {
+                       // IE uses filters for opacity
+                       return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
+                               ( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
+                               computed ? "1" : "";
+               },
 
-wrapMap.optgroup = wrapMap.option;
-wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
-wrapMap.th = wrapMap.td;
+               set: function( elem, value ) {
+                       var style = elem.style,
+                               currentStyle = elem.currentStyle,
+                               opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
+                               filter = currentStyle && currentStyle.filter || style.filter || "";
+
+                       // IE has trouble with opacity if it does not have layout
+                       // Force it by setting the zoom level
+                       style.zoom = 1;
+
+                       // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
+                       // if value === "", then remove inline opacity #12685
+                       if ( ( value >= 1 || value === "" ) &&
+                                       jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
+                                       style.removeAttribute ) {
+
+                               // Setting style.filter to null, "" & " " still leave "filter:" in the cssText
+                               // if "filter:" is present at all, clearType is disabled, we want to avoid this
+                               // style.removeAttribute is IE Only, but so apparently is this code path...
+                               style.removeAttribute( "filter" );
+
+                               // if there is no filter style applied in a css rule or unset inline opacity, we are done
+                               if ( value === "" || currentStyle && !currentStyle.filter ) {
+                                       return;
+                               }
+                       }
 
-// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
-// unless wrapped in a div with non-breaking characters in front of it.
-if ( !jQuery.support.htmlSerialize ) {
-       wrapMap._default = [ 1, "X<div>", "</div>" ];
+                       // otherwise, set new filter values
+                       style.filter = ralpha.test( filter ) ?
+                               filter.replace( ralpha, opacity ) :
+                               filter + " " + opacity;
+               }
+       };
 }
 
-jQuery.fn.extend({
-       text: function( value ) {
-               return jQuery.access( this, function( value ) {
-                       return value === undefined ?
-                               jQuery.text( this ) :
-                               this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
-               }, null, value, arguments.length );
-       },
+jQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,
+       function( elem, computed ) {
+               if ( computed ) {
+                       // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+                       // Work around by temporarily setting element display to inline-block
+                       return jQuery.swap( elem, { "display": "inline-block" },
+                               curCSS, [ elem, "marginRight" ] );
+               }
+       }
+);
+
+// These hooks are used by animate to expand properties
+jQuery.each({
+       margin: "",
+       padding: "",
+       border: "Width"
+}, function( prefix, suffix ) {
+       jQuery.cssHooks[ prefix + suffix ] = {
+               expand: function( value ) {
+                       var i = 0,
+                               expanded = {},
 
-       wrapAll: function( html ) {
-               if ( jQuery.isFunction( html ) ) {
-                       return this.each(function(i) {
-                               jQuery(this).wrapAll( html.call(this, i) );
-                       });
+                               // assumes a single number if not a string
+                               parts = typeof value === "string" ? value.split(" ") : [ value ];
+
+                       for ( ; i < 4; i++ ) {
+                               expanded[ prefix + cssExpand[ i ] + suffix ] =
+                                       parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
+                       }
+
+                       return expanded;
                }
+       };
 
-               if ( this[0] ) {
-                       // The elements to wrap the target around
-                       var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
+       if ( !rmargin.test( prefix ) ) {
+               jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
+       }
+});
 
-                       if ( this[0].parentNode ) {
-                               wrap.insertBefore( this[0] );
-                       }
+jQuery.fn.extend({
+       css: function( name, value ) {
+               return access( this, function( elem, name, value ) {
+                       var styles, len,
+                               map = {},
+                               i = 0;
 
-                       wrap.map(function() {
-                               var elem = this;
+                       if ( jQuery.isArray( name ) ) {
+                               styles = getStyles( elem );
+                               len = name.length;
 
-                               while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
-                                       elem = elem.firstChild;
+                               for ( ; i < len; i++ ) {
+                                       map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
                                }
 
-                               return elem;
-                       }).append( this );
-               }
+                               return map;
+                       }
 
-               return this;
+                       return value !== undefined ?
+                               jQuery.style( elem, name, value ) :
+                               jQuery.css( elem, name );
+               }, name, value, arguments.length > 1 );
        },
-
-       wrapInner: function( html ) {
-               if ( jQuery.isFunction( html ) ) {
-                       return this.each(function(i) {
-                               jQuery(this).wrapInner( html.call(this, i) );
-                       });
+       show: function() {
+               return showHide( this, true );
+       },
+       hide: function() {
+               return showHide( this );
+       },
+       toggle: function( state ) {
+               if ( typeof state === "boolean" ) {
+                       return state ? this.show() : this.hide();
                }
 
                return this.each(function() {
-                       var self = jQuery( this ),
-                               contents = self.contents();
-
-                       if ( contents.length ) {
-                               contents.wrapAll( html );
-
+                       if ( isHidden( this ) ) {
+                               jQuery( this ).show();
                        } else {
-                               self.append( html );
+                               jQuery( this ).hide();
                        }
                });
-       },
-
-       wrap: function( html ) {
-               var isFunction = jQuery.isFunction( html );
+       }
+});
 
-               return this.each(function(i) {
-                       jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
-               });
-       },
 
-       unwrap: function() {
-               return this.parent().each(function() {
-                       if ( !jQuery.nodeName( this, "body" ) ) {
-                               jQuery( this ).replaceWith( this.childNodes );
-                       }
-               }).end();
-       },
+function Tween( elem, options, prop, end, easing ) {
+       return new Tween.prototype.init( elem, options, prop, end, easing );
+}
+jQuery.Tween = Tween;
 
-       append: function() {
-               return this.domManip(arguments, true, function( elem ) {
-                       if ( this.nodeType === 1 || this.nodeType === 11 ) {
-                               this.appendChild( elem );
-                       }
-               });
+Tween.prototype = {
+       constructor: Tween,
+       init: function( elem, options, prop, end, easing, unit ) {
+               this.elem = elem;
+               this.prop = prop;
+               this.easing = easing || "swing";
+               this.options = options;
+               this.start = this.now = this.cur();
+               this.end = end;
+               this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
        },
+       cur: function() {
+               var hooks = Tween.propHooks[ this.prop ];
 
-       prepend: function() {
-               return this.domManip(arguments, true, function( elem ) {
-                       if ( this.nodeType === 1 || this.nodeType === 11 ) {
-                               this.insertBefore( elem, this.firstChild );
-                       }
-               });
+               return hooks && hooks.get ?
+                       hooks.get( this ) :
+                       Tween.propHooks._default.get( this );
        },
+       run: function( percent ) {
+               var eased,
+                       hooks = Tween.propHooks[ this.prop ];
 
-       before: function() {
-               if ( !isDisconnected( this[0] ) ) {
-                       return this.domManip(arguments, false, function( elem ) {
-                               this.parentNode.insertBefore( elem, this );
-                       });
+               if ( this.options.duration ) {
+                       this.pos = eased = jQuery.easing[ this.easing ](
+                               percent, this.options.duration * percent, 0, 1, this.options.duration
+                       );
+               } else {
+                       this.pos = eased = percent;
                }
+               this.now = ( this.end - this.start ) * eased + this.start;
 
-               if ( arguments.length ) {
-                       var set = jQuery.clean( arguments );
-                       return this.pushStack( jQuery.merge( set, this ), "before", this.selector );
+               if ( this.options.step ) {
+                       this.options.step.call( this.elem, this.now, this );
                }
-       },
 
-       after: function() {
-               if ( !isDisconnected( this[0] ) ) {
-                       return this.domManip(arguments, false, function( elem ) {
-                               this.parentNode.insertBefore( elem, this.nextSibling );
-                       });
+               if ( hooks && hooks.set ) {
+                       hooks.set( this );
+               } else {
+                       Tween.propHooks._default.set( this );
                }
+               return this;
+       }
+};
 
-               if ( arguments.length ) {
-                       var set = jQuery.clean( arguments );
-                       return this.pushStack( jQuery.merge( this, set ), "after", this.selector );
-               }
-       },
+Tween.prototype.init.prototype = Tween.prototype;
 
-       // keepData is for internal use only--do not document
-       remove: function( selector, keepData ) {
-               var elem,
-                       i = 0;
+Tween.propHooks = {
+       _default: {
+               get: function( tween ) {
+                       var result;
 
-               for ( ; (elem = this[i]) != null; i++ ) {
-                       if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
-                               if ( !keepData && elem.nodeType === 1 ) {
-                                       jQuery.cleanData( elem.getElementsByTagName("*") );
-                                       jQuery.cleanData( [ elem ] );
-                               }
+                       if ( tween.elem[ tween.prop ] != null &&
+                               (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
+                               return tween.elem[ tween.prop ];
+                       }
 
-                               if ( elem.parentNode ) {
-                                       elem.parentNode.removeChild( elem );
-                               }
+                       // passing an empty string as a 3rd parameter to .css will automatically
+                       // attempt a parseFloat and fallback to a string if the parse fails
+                       // so, simple values such as "10px" are parsed to Float.
+                       // complex values such as "rotate(1rad)" are returned as is.
+                       result = jQuery.css( tween.elem, tween.prop, "" );
+                       // Empty strings, null, undefined and "auto" are converted to 0.
+                       return !result || result === "auto" ? 0 : result;
+               },
+               set: function( tween ) {
+                       // use step hook for back compat - use cssHook if its there - use .style if its
+                       // available and use plain properties where available
+                       if ( jQuery.fx.step[ tween.prop ] ) {
+                               jQuery.fx.step[ tween.prop ]( tween );
+                       } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
+                               jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
+                       } else {
+                               tween.elem[ tween.prop ] = tween.now;
                        }
                }
+       }
+};
 
-               return this;
+// Support: IE <=9
+// Panic based approach to setting things on disconnected nodes
+
+Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
+       set: function( tween ) {
+               if ( tween.elem.nodeType && tween.elem.parentNode ) {
+                       tween.elem[ tween.prop ] = tween.now;
+               }
+       }
+};
+
+jQuery.easing = {
+       linear: function( p ) {
+               return p;
        },
+       swing: function( p ) {
+               return 0.5 - Math.cos( p * Math.PI ) / 2;
+       }
+};
 
-       empty: function() {
-               var elem,
-                       i = 0;
+jQuery.fx = Tween.prototype.init;
 
-               for ( ; (elem = this[i]) != null; i++ ) {
-                       // Remove element nodes and prevent memory leaks
-                       if ( elem.nodeType === 1 ) {
-                               jQuery.cleanData( elem.getElementsByTagName("*") );
-                       }
+// Back Compat <1.8 extension point
+jQuery.fx.step = {};
 
-                       // Remove any remaining nodes
-                       while ( elem.firstChild ) {
-                               elem.removeChild( elem.firstChild );
-                       }
-               }
 
-               return this;
-       },
 
-       clone: function( dataAndEvents, deepDataAndEvents ) {
-               dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
-               deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
 
-               return this.map( function () {
-                       return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
-               });
-       },
+var
+       fxNow, timerId,
+       rfxtypes = /^(?:toggle|show|hide)$/,
+       rfxnum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ),
+       rrun = /queueHooks$/,
+       animationPrefilters = [ defaultPrefilter ],
+       tweeners = {
+               "*": [ function( prop, value ) {
+                       var tween = this.createTween( prop, value ),
+                               target = tween.cur(),
+                               parts = rfxnum.exec( value ),
+                               unit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
 
-       html: function( value ) {
-               return jQuery.access( this, function( value ) {
-                       var elem = this[0] || {},
-                               i = 0,
-                               l = this.length;
+                               // Starting value computation is required for potential unit mismatches
+                               start = ( jQuery.cssNumber[ prop ] || unit !== "px" && +target ) &&
+                                       rfxnum.exec( jQuery.css( tween.elem, prop ) ),
+                               scale = 1,
+                               maxIterations = 20;
 
-                       if ( value === undefined ) {
-                               return elem.nodeType === 1 ?
-                                       elem.innerHTML.replace( rinlinejQuery, "" ) :
-                                       undefined;
-                       }
+                       if ( start && start[ 3 ] !== unit ) {
+                               // Trust units reported by jQuery.css
+                               unit = unit || start[ 3 ];
 
-                       // See if we can take a shortcut and just use innerHTML
-                       if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
-                               ( jQuery.support.htmlSerialize || !rnoshimcache.test( value )  ) &&
-                               ( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
-                               !wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
+                               // Make sure we update the tween properties later on
+                               parts = parts || [];
 
-                               value = value.replace( rxhtmlTag, "<$1></$2>" );
+                               // Iteratively approximate from a nonzero starting point
+                               start = +target || 1;
 
-                               try {
-                                       for (; i < l; i++ ) {
-                                               // Remove element nodes and prevent memory leaks
-                                               elem = this[i] || {};
-                                               if ( elem.nodeType === 1 ) {
-                                                       jQuery.cleanData( elem.getElementsByTagName( "*" ) );
-                                                       elem.innerHTML = value;
-                                               }
-                                       }
+                               do {
+                                       // If previous iteration zeroed out, double until we get *something*
+                                       // Use a string for doubling factor so we don't accidentally see scale as unchanged below
+                                       scale = scale || ".5";
 
-                                       elem = 0;
+                                       // Adjust and apply
+                                       start = start / scale;
+                                       jQuery.style( tween.elem, prop, start + unit );
 
-                               // If using innerHTML throws an exception, use the fallback method
-                               } catch(e) {}
+                               // Update scale, tolerating zero or NaN from tween.cur()
+                               // And breaking the loop if scale is unchanged or perfect, or if we've just had enough
+                               } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
                        }
 
-                       if ( elem ) {
-                               this.empty().append( value );
-                       }
-               }, null, value, arguments.length );
-       },
+                       // Update tween properties
+                       if ( parts ) {
+                               start = tween.start = +start || +target || 0;
+                               tween.unit = unit;
+                               // If a +=/-= token was provided, we're doing a relative animation
+                               tween.end = parts[ 1 ] ?
+                                       start + ( parts[ 1 ] + 1 ) * parts[ 2 ] :
+                                       +parts[ 2 ];
+                       }
+
+                       return tween;
+               } ]
+       };
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+       setTimeout(function() {
+               fxNow = undefined;
+       });
+       return ( fxNow = jQuery.now() );
+}
+
+// Generate parameters to create a standard animation
+function genFx( type, includeWidth ) {
+       var which,
+               attrs = { height: type },
+               i = 0;
+
+       // if we include width, step value is 1 to do all cssExpand values,
+       // if we don't include width, step value is 2 to skip over Left and Right
+       includeWidth = includeWidth ? 1 : 0;
+       for ( ; i < 4 ; i += 2 - includeWidth ) {
+               which = cssExpand[ i ];
+               attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
+       }
+
+       if ( includeWidth ) {
+               attrs.opacity = attrs.width = type;
+       }
 
-       replaceWith: function( value ) {
-               if ( !isDisconnected( this[0] ) ) {
-                       // Make sure that the elements are removed from the DOM before they are inserted
-                       // this can help fix replacing a parent with child elements
-                       if ( jQuery.isFunction( value ) ) {
-                               return this.each(function(i) {
-                                       var self = jQuery(this), old = self.html();
-                                       self.replaceWith( value.call( this, i, old ) );
-                               });
-                       }
+       return attrs;
+}
 
-                       if ( typeof value !== "string" ) {
-                               value = jQuery( value ).detach();
-                       }
+function createTween( value, prop, animation ) {
+       var tween,
+               collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
+               index = 0,
+               length = collection.length;
+       for ( ; index < length; index++ ) {
+               if ( (tween = collection[ index ].call( animation, prop, value )) ) {
 
-                       return this.each(function() {
-                               var next = this.nextSibling,
-                                       parent = this.parentNode;
+                       // we're done with this property
+                       return tween;
+               }
+       }
+}
 
-                               jQuery( this ).remove();
+function defaultPrefilter( elem, props, opts ) {
+       /* jshint validthis: true */
+       var prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,
+               anim = this,
+               orig = {},
+               style = elem.style,
+               hidden = elem.nodeType && isHidden( elem ),
+               dataShow = jQuery._data( elem, "fxshow" );
 
-                               if ( next ) {
-                                       jQuery(next).before( value );
-                               } else {
-                                       jQuery(parent).append( value );
+       // handle queue: false promises
+       if ( !opts.queue ) {
+               hooks = jQuery._queueHooks( elem, "fx" );
+               if ( hooks.unqueued == null ) {
+                       hooks.unqueued = 0;
+                       oldfire = hooks.empty.fire;
+                       hooks.empty.fire = function() {
+                               if ( !hooks.unqueued ) {
+                                       oldfire();
                                }
-                       });
+                       };
                }
+               hooks.unqueued++;
 
-               return this.length ?
-                       this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
-                       this;
-       },
+               anim.always(function() {
+                       // doing this makes sure that the complete handler will be called
+                       // before this completes
+                       anim.always(function() {
+                               hooks.unqueued--;
+                               if ( !jQuery.queue( elem, "fx" ).length ) {
+                                       hooks.empty.fire();
+                               }
+                       });
+               });
+       }
 
-       detach: function( selector ) {
-               return this.remove( selector, true );
-       },
+       // height/width overflow pass
+       if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
+               // Make sure that nothing sneaks out
+               // Record all 3 overflow attributes because IE does not
+               // change the overflow attribute when overflowX and
+               // overflowY are set to the same value
+               opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
 
-       domManip: function( args, table, callback ) {
+               // Set display property to inline-block for height/width
+               // animations on inline elements that are having width/height animated
+               display = jQuery.css( elem, "display" );
 
-               // Flatten any nested arrays
-               args = [].concat.apply( [], args );
+               // Test default display if display is currently "none"
+               checkDisplay = display === "none" ?
+                       jQuery._data( elem, "olddisplay" ) || defaultDisplay( elem.nodeName ) : display;
 
-               var results, first, fragment, iNoClone,
-                       i = 0,
-                       value = args[0],
-                       scripts = [],
-                       l = this.length;
+               if ( checkDisplay === "inline" && jQuery.css( elem, "float" ) === "none" ) {
 
-               // We can't cloneNode fragments that contain checked, in WebKit
-               if ( !jQuery.support.checkClone && l > 1 && typeof value === "string" && rchecked.test( value ) ) {
-                       return this.each(function() {
-                               jQuery(this).domManip( args, table, callback );
-                       });
+                       // inline-level elements accept inline-block;
+                       // block-level elements need to be inline with layout
+                       if ( !support.inlineBlockNeedsLayout || defaultDisplay( elem.nodeName ) === "inline" ) {
+                               style.display = "inline-block";
+                       } else {
+                               style.zoom = 1;
+                       }
                }
+       }
 
-               if ( jQuery.isFunction(value) ) {
-                       return this.each(function(i) {
-                               var self = jQuery(this);
-                               args[0] = value.call( this, i, table ? self.html() : undefined );
-                               self.domManip( args, table, callback );
+       if ( opts.overflow ) {
+               style.overflow = "hidden";
+               if ( !support.shrinkWrapBlocks() ) {
+                       anim.always(function() {
+                               style.overflow = opts.overflow[ 0 ];
+                               style.overflowX = opts.overflow[ 1 ];
+                               style.overflowY = opts.overflow[ 2 ];
                        });
                }
+       }
 
-               if ( this[0] ) {
-                       results = jQuery.buildFragment( args, this, scripts );
-                       fragment = results.fragment;
-                       first = fragment.firstChild;
+       // show/hide pass
+       for ( prop in props ) {
+               value = props[ prop ];
+               if ( rfxtypes.exec( value ) ) {
+                       delete props[ prop ];
+                       toggle = toggle || value === "toggle";
+                       if ( value === ( hidden ? "hide" : "show" ) ) {
 
-                       if ( fragment.childNodes.length === 1 ) {
-                               fragment = first;
+                               // If there is dataShow left over from a stopped hide or show and we are going to proceed with show, we should pretend to be hidden
+                               if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
+                                       hidden = true;
+                               } else {
+                                       continue;
+                               }
                        }
+                       orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
 
-                       if ( first ) {
-                               table = table && jQuery.nodeName( first, "tr" );
+               // Any non-fx value stops us from restoring the original display value
+               } else {
+                       display = undefined;
+               }
+       }
 
-                               // Use the original fragment for the last item instead of the first because it can end up
-                               // being emptied incorrectly in certain situations (#8070).
-                               // Fragments from the fragment cache must always be cloned and never used in place.
-                               for ( iNoClone = results.cacheable || l - 1; i < l; i++ ) {
-                                       callback.call(
-                                               table && jQuery.nodeName( this[i], "table" ) ?
-                                                       findOrAppend( this[i], "tbody" ) :
-                                                       this[i],
-                                               i === iNoClone ?
-                                                       fragment :
-                                                       jQuery.clone( fragment, true, true )
-                                       );
-                               }
+       if ( !jQuery.isEmptyObject( orig ) ) {
+               if ( dataShow ) {
+                       if ( "hidden" in dataShow ) {
+                               hidden = dataShow.hidden;
                        }
+               } else {
+                       dataShow = jQuery._data( elem, "fxshow", {} );
+               }
 
-                       // Fix #11809: Avoid leaking memory
-                       fragment = first = null;
-
-                       if ( scripts.length ) {
-                               jQuery.each( scripts, function( i, elem ) {
-                                       if ( elem.src ) {
-                                               if ( jQuery.ajax ) {
-                                                       jQuery.ajax({
-                                                               url: elem.src,
-                                                               type: "GET",
-                                                               dataType: "script",
-                                                               async: false,
-                                                               global: false,
-                                                               "throws": true
-                                                       });
-                                               } else {
-                                                       jQuery.error("no ajax");
-                                               }
-                                       } else {
-                                               jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "" ) );
-                                       }
+               // store state if its toggle - enables .stop().toggle() to "reverse"
+               if ( toggle ) {
+                       dataShow.hidden = !hidden;
+               }
+               if ( hidden ) {
+                       jQuery( elem ).show();
+               } else {
+                       anim.done(function() {
+                               jQuery( elem ).hide();
+                       });
+               }
+               anim.done(function() {
+                       var prop;
+                       jQuery._removeData( elem, "fxshow" );
+                       for ( prop in orig ) {
+                               jQuery.style( elem, prop, orig[ prop ] );
+                       }
+               });
+               for ( prop in orig ) {
+                       tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
 
-                                       if ( elem.parentNode ) {
-                                               elem.parentNode.removeChild( elem );
-                                       }
-                               });
+                       if ( !( prop in dataShow ) ) {
+                               dataShow[ prop ] = tween.start;
+                               if ( hidden ) {
+                                       tween.end = tween.start;
+                                       tween.start = prop === "width" || prop === "height" ? 1 : 0;
+                               }
                        }
                }
 
-               return this;
+       // If this is a noop like .hide().hide(), restore an overwritten display value
+       } else if ( (display === "none" ? defaultDisplay( elem.nodeName ) : display) === "inline" ) {
+               style.display = display;
        }
-});
-
-function findOrAppend( elem, tag ) {
-       return elem.getElementsByTagName( tag )[0] || elem.appendChild( elem.ownerDocument.createElement( tag ) );
 }
 
-function cloneCopyEvent( src, dest ) {
+function propFilter( props, specialEasing ) {
+       var index, name, easing, value, hooks;
 
-       if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
-               return;
-       }
+       // camelCase, specialEasing and expand cssHook pass
+       for ( index in props ) {
+               name = jQuery.camelCase( index );
+               easing = specialEasing[ name ];
+               value = props[ index ];
+               if ( jQuery.isArray( value ) ) {
+                       easing = value[ 1 ];
+                       value = props[ index ] = value[ 0 ];
+               }
 
-       var type, i, l,
-               oldData = jQuery._data( src ),
-               curData = jQuery._data( dest, oldData ),
-               events = oldData.events;
+               if ( index !== name ) {
+                       props[ name ] = value;
+                       delete props[ index ];
+               }
 
-       if ( events ) {
-               delete curData.handle;
-               curData.events = {};
+               hooks = jQuery.cssHooks[ name ];
+               if ( hooks && "expand" in hooks ) {
+                       value = hooks.expand( value );
+                       delete props[ name ];
 
-               for ( type in events ) {
-                       for ( i = 0, l = events[ type ].length; i < l; i++ ) {
-                               jQuery.event.add( dest, type, events[ type ][ i ] );
+                       // not quite $.extend, this wont overwrite keys already present.
+                       // also - reusing 'index' from above because we have the correct "name"
+                       for ( index in value ) {
+                               if ( !( index in props ) ) {
+                                       props[ index ] = value[ index ];
+                                       specialEasing[ index ] = easing;
+                               }
                        }
+               } else {
+                       specialEasing[ name ] = easing;
                }
        }
-
-       // make the cloned public data object a copy from the original
-       if ( curData.data ) {
-               curData.data = jQuery.extend( {}, curData.data );
-       }
 }
 
-function cloneFixAttributes( src, dest ) {
-       var nodeName;
+function Animation( elem, properties, options ) {
+       var result,
+               stopped,
+               index = 0,
+               length = animationPrefilters.length,
+               deferred = jQuery.Deferred().always( function() {
+                       // don't match elem in the :animated selector
+                       delete tick.elem;
+               }),
+               tick = function() {
+                       if ( stopped ) {
+                               return false;
+                       }
+                       var currentTime = fxNow || createFxNow(),
+                               remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
+                               // archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
+                               temp = remaining / animation.duration || 0,
+                               percent = 1 - temp,
+                               index = 0,
+                               length = animation.tweens.length;
+
+                       for ( ; index < length ; index++ ) {
+                               animation.tweens[ index ].run( percent );
+                       }
+
+                       deferred.notifyWith( elem, [ animation, percent, remaining ]);
+
+                       if ( percent < 1 && length ) {
+                               return remaining;
+                       } else {
+                               deferred.resolveWith( elem, [ animation ] );
+                               return false;
+                       }
+               },
+               animation = deferred.promise({
+                       elem: elem,
+                       props: jQuery.extend( {}, properties ),
+                       opts: jQuery.extend( true, { specialEasing: {} }, options ),
+                       originalProperties: properties,
+                       originalOptions: options,
+                       startTime: fxNow || createFxNow(),
+                       duration: options.duration,
+                       tweens: [],
+                       createTween: function( prop, end ) {
+                               var tween = jQuery.Tween( elem, animation.opts, prop, end,
+                                               animation.opts.specialEasing[ prop ] || animation.opts.easing );
+                               animation.tweens.push( tween );
+                               return tween;
+                       },
+                       stop: function( gotoEnd ) {
+                               var index = 0,
+                                       // if we are going to the end, we want to run all the tweens
+                                       // otherwise we skip this part
+                                       length = gotoEnd ? animation.tweens.length : 0;
+                               if ( stopped ) {
+                                       return this;
+                               }
+                               stopped = true;
+                               for ( ; index < length ; index++ ) {
+                                       animation.tweens[ index ].run( 1 );
+                               }
+
+                               // resolve when we played the last frame
+                               // otherwise, reject
+                               if ( gotoEnd ) {
+                                       deferred.resolveWith( elem, [ animation, gotoEnd ] );
+                               } else {
+                                       deferred.rejectWith( elem, [ animation, gotoEnd ] );
+                               }
+                               return this;
+                       }
+               }),
+               props = animation.props;
+
+       propFilter( props, animation.opts.specialEasing );
 
-       // We do not need to do anything for non-Elements
-       if ( dest.nodeType !== 1 ) {
-               return;
+       for ( ; index < length ; index++ ) {
+               result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
+               if ( result ) {
+                       return result;
+               }
        }
 
-       // clearAttributes removes the attributes, which we don't want,
-       // but also removes the attachEvent events, which we *do* want
-       if ( dest.clearAttributes ) {
-               dest.clearAttributes();
-       }
+       jQuery.map( props, createTween, animation );
 
-       // mergeAttributes, in contrast, only merges back on the
-       // original attributes, not the events
-       if ( dest.mergeAttributes ) {
-               dest.mergeAttributes( src );
+       if ( jQuery.isFunction( animation.opts.start ) ) {
+               animation.opts.start.call( elem, animation );
        }
 
-       nodeName = dest.nodeName.toLowerCase();
+       jQuery.fx.timer(
+               jQuery.extend( tick, {
+                       elem: elem,
+                       anim: animation,
+                       queue: animation.opts.queue
+               })
+       );
 
-       if ( nodeName === "object" ) {
-               // IE6-10 improperly clones children of object elements using classid.
-               // IE10 throws NoModificationAllowedError if parent is null, #12132.
-               if ( dest.parentNode ) {
-                       dest.outerHTML = src.outerHTML;
-               }
+       // attach callbacks from options
+       return animation.progress( animation.opts.progress )
+               .done( animation.opts.done, animation.opts.complete )
+               .fail( animation.opts.fail )
+               .always( animation.opts.always );
+}
 
-               // This path appears unavoidable for IE9. When cloning an object
-               // element in IE9, the outerHTML strategy above is not sufficient.
-               // If the src has innerHTML and the destination does not,
-               // copy the src.innerHTML into the dest.innerHTML. #10324
-               if ( jQuery.support.html5Clone && (src.innerHTML && !jQuery.trim(dest.innerHTML)) ) {
-                       dest.innerHTML = src.innerHTML;
+jQuery.Animation = jQuery.extend( Animation, {
+       tweener: function( props, callback ) {
+               if ( jQuery.isFunction( props ) ) {
+                       callback = props;
+                       props = [ "*" ];
+               } else {
+                       props = props.split(" ");
                }
 
-       } else if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
-               // IE6-8 fails to persist the checked state of a cloned checkbox
-               // or radio button. Worse, IE6-7 fail to give the cloned element
-               // a checked appearance if the defaultChecked value isn't also set
-
-               dest.defaultChecked = dest.checked = src.checked;
+               var prop,
+                       index = 0,
+                       length = props.length;
 
-               // IE6-7 get confused and end up setting the value of a cloned
-               // checkbox/radio button to an empty string instead of "on"
-               if ( dest.value !== src.value ) {
-                       dest.value = src.value;
+               for ( ; index < length ; index++ ) {
+                       prop = props[ index ];
+                       tweeners[ prop ] = tweeners[ prop ] || [];
+                       tweeners[ prop ].unshift( callback );
                }
+       },
 
-       // IE6-8 fails to return the selected option to the default selected
-       // state when cloning options
-       } else if ( nodeName === "option" ) {
-               dest.selected = src.defaultSelected;
-
-       // IE6-8 fails to set the defaultValue to the correct value when
-       // cloning other types of input fields
-       } else if ( nodeName === "input" || nodeName === "textarea" ) {
-               dest.defaultValue = src.defaultValue;
-
-       // IE blanks contents when cloning scripts
-       } else if ( nodeName === "script" && dest.text !== src.text ) {
-               dest.text = src.text;
+       prefilter: function( callback, prepend ) {
+               if ( prepend ) {
+                       animationPrefilters.unshift( callback );
+               } else {
+                       animationPrefilters.push( callback );
+               }
        }
+});
 
-       // Event data gets referenced instead of copied if the expando
-       // gets copied too
-       dest.removeAttribute( jQuery.expando );
-}
-
-jQuery.buildFragment = function( args, context, scripts ) {
-       var fragment, cacheable, cachehit,
-               first = args[ 0 ];
-
-       // Set context from what may come in as undefined or a jQuery collection or a node
-       // Updated to fix #12266 where accessing context[0] could throw an exception in IE9/10 &
-       // also doubles as fix for #8950 where plain objects caused createDocumentFragment exception
-       context = context || document;
-       context = !context.nodeType && context[0] || context;
-       context = context.ownerDocument || context;
+jQuery.speed = function( speed, easing, fn ) {
+       var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
+               complete: fn || !fn && easing ||
+                       jQuery.isFunction( speed ) && speed,
+               duration: speed,
+               easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
+       };
 
-       // Only cache "small" (1/2 KB) HTML strings that are associated with the main document
-       // Cloning options loses the selected state, so don't cache them
-       // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
-       // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
-       // Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501
-       if ( args.length === 1 && typeof first === "string" && first.length < 512 && context === document &&
-               first.charAt(0) === "<" && !rnocache.test( first ) &&
-               (jQuery.support.checkClone || !rchecked.test( first )) &&
-               (jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {
+       opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+               opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
 
-               // Mark cacheable and look for a hit
-               cacheable = true;
-               fragment = jQuery.fragments[ first ];
-               cachehit = fragment !== undefined;
+       // normalize opt.queue - true/undefined/null -> "fx"
+       if ( opt.queue == null || opt.queue === true ) {
+               opt.queue = "fx";
        }
 
-       if ( !fragment ) {
-               fragment = context.createDocumentFragment();
-               jQuery.clean( args, context, fragment, scripts );
+       // Queueing
+       opt.old = opt.complete;
 
-               // Update the cache, but only store false
-               // unless this is a second parsing of the same content
-               if ( cacheable ) {
-                       jQuery.fragments[ first ] = cachehit && fragment;
+       opt.complete = function() {
+               if ( jQuery.isFunction( opt.old ) ) {
+                       opt.old.call( this );
                }
-       }
-
-       return { fragment: fragment, cacheable: cacheable };
-};
-
-jQuery.fragments = {};
-
-jQuery.each({
-       appendTo: "append",
-       prependTo: "prepend",
-       insertBefore: "before",
-       insertAfter: "after",
-       replaceAll: "replaceWith"
-}, function( name, original ) {
-       jQuery.fn[ name ] = function( selector ) {
-               var elems,
-                       i = 0,
-                       ret = [],
-                       insert = jQuery( selector ),
-                       l = insert.length,
-                       parent = this.length === 1 && this[0].parentNode;
-
-               if ( (parent == null || parent && parent.nodeType === 11 && parent.childNodes.length === 1) && l === 1 ) {
-                       insert[ original ]( this[0] );
-                       return this;
-               } else {
-                       for ( ; i < l; i++ ) {
-                               elems = ( i > 0 ? this.clone(true) : this ).get();
-                               jQuery( insert[i] )[ original ]( elems );
-                               ret = ret.concat( elems );
-                       }
 
-                       return this.pushStack( ret, name, insert.selector );
+               if ( opt.queue ) {
+                       jQuery.dequeue( this, opt.queue );
                }
        };
-});
 
-function getAll( elem ) {
-       if ( typeof elem.getElementsByTagName !== "undefined" ) {
-               return elem.getElementsByTagName( "*" );
+       return opt;
+};
 
-       } else if ( typeof elem.querySelectorAll !== "undefined" ) {
-               return elem.querySelectorAll( "*" );
+jQuery.fn.extend({
+       fadeTo: function( speed, to, easing, callback ) {
 
-       } else {
-               return [];
-       }
-}
+               // show any hidden elements after setting opacity to 0
+               return this.filter( isHidden ).css( "opacity", 0 ).show()
 
-// Used in clean, fixes the defaultChecked property
-function fixDefaultChecked( elem ) {
-       if ( rcheckableType.test( elem.type ) ) {
-               elem.defaultChecked = elem.checked;
-       }
-}
+                       // animate to the value specified
+                       .end().animate({ opacity: to }, speed, easing, callback );
+       },
+       animate: function( prop, speed, easing, callback ) {
+               var empty = jQuery.isEmptyObject( prop ),
+                       optall = jQuery.speed( speed, easing, callback ),
+                       doAnimation = function() {
+                               // Operate on a copy of prop so per-property easing won't be lost
+                               var anim = Animation( this, jQuery.extend( {}, prop ), optall );
 
-jQuery.extend({
-       clone: function( elem, dataAndEvents, deepDataAndEvents ) {
-               var srcElements,
-                       destElements,
-                       i,
-                       clone;
+                               // Empty animations, or finishing resolves immediately
+                               if ( empty || jQuery._data( this, "finish" ) ) {
+                                       anim.stop( true );
+                               }
+                       };
+                       doAnimation.finish = doAnimation;
 
-               if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
-                       clone = elem.cloneNode( true );
+               return empty || optall.queue === false ?
+                       this.each( doAnimation ) :
+                       this.queue( optall.queue, doAnimation );
+       },
+       stop: function( type, clearQueue, gotoEnd ) {
+               var stopQueue = function( hooks ) {
+                       var stop = hooks.stop;
+                       delete hooks.stop;
+                       stop( gotoEnd );
+               };
 
-               // IE<=8 does not properly clone detached, unknown element nodes
-               } else {
-                       fragmentDiv.innerHTML = elem.outerHTML;
-                       fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
+               if ( typeof type !== "string" ) {
+                       gotoEnd = clearQueue;
+                       clearQueue = type;
+                       type = undefined;
+               }
+               if ( clearQueue && type !== false ) {
+                       this.queue( type || "fx", [] );
                }
 
-               if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
-                               (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
-                       // IE copies events bound via attachEvent when using cloneNode.
-                       // Calling detachEvent on the clone will also remove the events
-                       // from the original. In order to get around this, we use some
-                       // proprietary methods to clear the events. Thanks to MooTools
-                       // guys for this hotness.
-
-                       cloneFixAttributes( elem, clone );
+               return this.each(function() {
+                       var dequeue = true,
+                               index = type != null && type + "queueHooks",
+                               timers = jQuery.timers,
+                               data = jQuery._data( this );
 
-                       // Using Sizzle here is crazy slow, so we use getElementsByTagName instead
-                       srcElements = getAll( elem );
-                       destElements = getAll( clone );
+                       if ( index ) {
+                               if ( data[ index ] && data[ index ].stop ) {
+                                       stopQueue( data[ index ] );
+                               }
+                       } else {
+                               for ( index in data ) {
+                                       if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
+                                               stopQueue( data[ index ] );
+                                       }
+                               }
+                       }
 
-                       // Weird iteration because IE will replace the length property
-                       // with an element if you are cloning the body and one of the
-                       // elements on the page has a name or id of "length"
-                       for ( i = 0; srcElements[i]; ++i ) {
-                               // Ensure that the destination node is not null; Fixes #9587
-                               if ( destElements[i] ) {
-                                       cloneFixAttributes( srcElements[i], destElements[i] );
+                       for ( index = timers.length; index--; ) {
+                               if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
+                                       timers[ index ].anim.stop( gotoEnd );
+                                       dequeue = false;
+                                       timers.splice( index, 1 );
                                }
                        }
+
+                       // start the next in the queue if the last step wasn't forced
+                       // timers currently will call their complete callbacks, which will dequeue
+                       // but only if they were gotoEnd
+                       if ( dequeue || !gotoEnd ) {
+                               jQuery.dequeue( this, type );
+                       }
+               });
+       },
+       finish: function( type ) {
+               if ( type !== false ) {
+                       type = type || "fx";
                }
+               return this.each(function() {
+                       var index,
+                               data = jQuery._data( this ),
+                               queue = data[ type + "queue" ],
+                               hooks = data[ type + "queueHooks" ],
+                               timers = jQuery.timers,
+                               length = queue ? queue.length : 0;
 
-               // Copy the events from the original to the clone
-               if ( dataAndEvents ) {
-                       cloneCopyEvent( elem, clone );
+                       // enable finishing flag on private data
+                       data.finish = true;
 
-                       if ( deepDataAndEvents ) {
-                               srcElements = getAll( elem );
-                               destElements = getAll( clone );
+                       // empty the queue first
+                       jQuery.queue( this, type, [] );
+
+                       if ( hooks && hooks.stop ) {
+                               hooks.stop.call( this, true );
+                       }
 
-                               for ( i = 0; srcElements[i]; ++i ) {
-                                       cloneCopyEvent( srcElements[i], destElements[i] );
+                       // look for any active animations, and finish them
+                       for ( index = timers.length; index--; ) {
+                               if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
+                                       timers[ index ].anim.stop( true );
+                                       timers.splice( index, 1 );
                                }
                        }
-               }
 
-               srcElements = destElements = null;
+                       // look for any animations in the old queue and finish them
+                       for ( index = 0; index < length; index++ ) {
+                               if ( queue[ index ] && queue[ index ].finish ) {
+                                       queue[ index ].finish.call( this );
+                               }
+                       }
 
-               // Return the cloned set
-               return clone;
-       },
+                       // turn off finishing flag
+                       delete data.finish;
+               });
+       }
+});
 
-       clean: function( elems, context, fragment, scripts ) {
-               var i, j, elem, tag, wrap, depth, div, hasBody, tbody, len, handleScript, jsTags,
-                       safe = context === document && safeFragment,
-                       ret = [];
+jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
+       var cssFn = jQuery.fn[ name ];
+       jQuery.fn[ name ] = function( speed, easing, callback ) {
+               return speed == null || typeof speed === "boolean" ?
+                       cssFn.apply( this, arguments ) :
+                       this.animate( genFx( name, true ), speed, easing, callback );
+       };
+});
+
+// Generate shortcuts for custom animations
+jQuery.each({
+       slideDown: genFx("show"),
+       slideUp: genFx("hide"),
+       slideToggle: genFx("toggle"),
+       fadeIn: { opacity: "show" },
+       fadeOut: { opacity: "hide" },
+       fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+       jQuery.fn[ name ] = function( speed, easing, callback ) {
+               return this.animate( props, speed, easing, callback );
+       };
+});
+
+jQuery.timers = [];
+jQuery.fx.tick = function() {
+       var timer,
+               timers = jQuery.timers,
+               i = 0;
+
+       fxNow = jQuery.now();
 
-               // Ensure that context is a document
-               if ( !context || typeof context.createDocumentFragment === "undefined" ) {
-                       context = document;
+       for ( ; i < timers.length; i++ ) {
+               timer = timers[ i ];
+               // Checks the timer has not already been removed
+               if ( !timer() && timers[ i ] === timer ) {
+                       timers.splice( i--, 1 );
                }
+       }
 
-               // Use the already-created safe fragment if context permits
-               for ( i = 0; (elem = elems[i]) != null; i++ ) {
-                       if ( typeof elem === "number" ) {
-                               elem += "";
-                       }
-
-                       if ( !elem ) {
-                               continue;
-                       }
+       if ( !timers.length ) {
+               jQuery.fx.stop();
+       }
+       fxNow = undefined;
+};
 
-                       // Convert html string into DOM nodes
-                       if ( typeof elem === "string" ) {
-                               if ( !rhtml.test( elem ) ) {
-                                       elem = context.createTextNode( elem );
-                               } else {
-                                       // Ensure a safe container in which to render the html
-                                       safe = safe || createSafeFragment( context );
-                                       div = context.createElement("div");
-                                       safe.appendChild( div );
+jQuery.fx.timer = function( timer ) {
+       jQuery.timers.push( timer );
+       if ( timer() ) {
+               jQuery.fx.start();
+       } else {
+               jQuery.timers.pop();
+       }
+};
 
-                                       // Fix "XHTML"-style tags in all browsers
-                                       elem = elem.replace(rxhtmlTag, "<$1></$2>");
+jQuery.fx.interval = 13;
 
-                                       // Go to html and back, then peel off extra wrappers
-                                       tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase();
-                                       wrap = wrapMap[ tag ] || wrapMap._default;
-                                       depth = wrap[0];
-                                       div.innerHTML = wrap[1] + elem + wrap[2];
+jQuery.fx.start = function() {
+       if ( !timerId ) {
+               timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
+       }
+};
 
-                                       // Move to the right depth
-                                       while ( depth-- ) {
-                                               div = div.lastChild;
-                                       }
+jQuery.fx.stop = function() {
+       clearInterval( timerId );
+       timerId = null;
+};
 
-                                       // Remove IE's autoinserted <tbody> from table fragments
-                                       if ( !jQuery.support.tbody ) {
+jQuery.fx.speeds = {
+       slow: 600,
+       fast: 200,
+       // Default speed
+       _default: 400
+};
 
-                                               // String was a <table>, *may* have spurious <tbody>
-                                               hasBody = rtbody.test(elem);
-                                                       tbody = tag === "table" && !hasBody ?
-                                                               div.firstChild && div.firstChild.childNodes :
-
-                                                               // String was a bare <thead> or <tfoot>
-                                                               wrap[1] === "<table>" && !hasBody ?
-                                                                       div.childNodes :
-                                                                       [];
-
-                                               for ( j = tbody.length - 1; j >= 0 ; --j ) {
-                                                       if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
-                                                               tbody[ j ].parentNode.removeChild( tbody[ j ] );
-                                                       }
-                                               }
-                                       }
 
-                                       // IE completely kills leading whitespace when innerHTML is used
-                                       if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
-                                               div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
-                                       }
+// Based off of the plugin by Clint Helfers, with permission.
+// http://blindsignals.com/index.php/2009/07/jquery-delay/
+jQuery.fn.delay = function( time, type ) {
+       time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+       type = type || "fx";
 
-                                       elem = div.childNodes;
+       return this.queue( type, function( next, hooks ) {
+               var timeout = setTimeout( next, time );
+               hooks.stop = function() {
+                       clearTimeout( timeout );
+               };
+       });
+};
 
-                                       // Take out of fragment container (we need a fresh div each time)
-                                       div.parentNode.removeChild( div );
-                               }
-                       }
 
-                       if ( elem.nodeType ) {
-                               ret.push( elem );
-                       } else {
-                               jQuery.merge( ret, elem );
-                       }
-               }
+(function() {
+       // Minified: var a,b,c,d,e
+       var input, div, select, a, opt;
 
-               // Fix #11356: Clear elements from safeFragment
-               if ( div ) {
-                       elem = div = safe = null;
-               }
+       // Setup
+       div = document.createElement( "div" );
+       div.setAttribute( "className", "t" );
+       div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
+       a = div.getElementsByTagName("a")[ 0 ];
 
-               // Reset defaultChecked for any radios and checkboxes
-               // about to be appended to the DOM in IE 6/7 (#8060)
-               if ( !jQuery.support.appendChecked ) {
-                       for ( i = 0; (elem = ret[i]) != null; i++ ) {
-                               if ( jQuery.nodeName( elem, "input" ) ) {
-                                       fixDefaultChecked( elem );
-                               } else if ( typeof elem.getElementsByTagName !== "undefined" ) {
-                                       jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
-                               }
-                       }
-               }
+       // First batch of tests.
+       select = document.createElement("select");
+       opt = select.appendChild( document.createElement("option") );
+       input = div.getElementsByTagName("input")[ 0 ];
 
-               // Append elements to a provided document fragment
-               if ( fragment ) {
-                       // Special handling of each script element
-                       handleScript = function( elem ) {
-                               // Check if we consider it executable
-                               if ( !elem.type || rscriptType.test( elem.type ) ) {
-                                       // Detach the script and store it in the scripts array (if provided) or the fragment
-                                       // Return truthy to indicate that it has been handled
-                                       return scripts ?
-                                               scripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) :
-                                               fragment.appendChild( elem );
-                               }
-                       };
+       a.style.cssText = "top:1px";
 
-                       for ( i = 0; (elem = ret[i]) != null; i++ ) {
-                               // Check if we're done after handling an executable script
-                               if ( !( jQuery.nodeName( elem, "script" ) && handleScript( elem ) ) ) {
-                                       // Append to fragment and handle embedded scripts
-                                       fragment.appendChild( elem );
-                                       if ( typeof elem.getElementsByTagName !== "undefined" ) {
-                                               // handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration
-                                               jsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName("script") ), handleScript );
-
-                                               // Splice the scripts into ret after their former ancestor and advance our index beyond them
-                                               ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
-                                               i += jsTags.length;
-                                       }
-                               }
-                       }
-               }
+       // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
+       support.getSetAttribute = div.className !== "t";
 
-               return ret;
-       },
+       // Get the style information from getAttribute
+       // (IE uses .cssText instead)
+       support.style = /top/.test( a.getAttribute("style") );
 
-       cleanData: function( elems, /* internal */ acceptData ) {
-               var data, id, elem, type,
-                       i = 0,
-                       internalKey = jQuery.expando,
-                       cache = jQuery.cache,
-                       deleteExpando = jQuery.support.deleteExpando,
-                       special = jQuery.event.special;
+       // Make sure that URLs aren't manipulated
+       // (IE normalizes it by default)
+       support.hrefNormalized = a.getAttribute("href") === "/a";
 
-               for ( ; (elem = elems[i]) != null; i++ ) {
+       // Check the default checkbox/radio value ("" on WebKit; "on" elsewhere)
+       support.checkOn = !!input.value;
 
-                       if ( acceptData || jQuery.acceptData( elem ) ) {
+       // Make sure that a selected-by-default option has a working selected property.
+       // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
+       support.optSelected = opt.selected;
 
-                               id = elem[ internalKey ];
-                               data = id && cache[ id ];
+       // Tests for enctype support on a form (#6743)
+       support.enctype = !!document.createElement("form").enctype;
 
-                               if ( data ) {
-                                       if ( data.events ) {
-                                               for ( type in data.events ) {
-                                                       if ( special[ type ] ) {
-                                                               jQuery.event.remove( elem, type );
+       // Make sure that the options inside disabled selects aren't marked as disabled
+       // (WebKit marks them as disabled)
+       select.disabled = true;
+       support.optDisabled = !opt.disabled;
 
-                                                       // This is a shortcut to avoid jQuery.event.remove's overhead
-                                                       } else {
-                                                               jQuery.removeEvent( elem, type, data.handle );
-                                                       }
-                                               }
-                                       }
+       // Support: IE8 only
+       // Check if we can trust getAttribute("value")
+       input = document.createElement( "input" );
+       input.setAttribute( "value", "" );
+       support.input = input.getAttribute( "value" ) === "";
 
-                                       // Remove cache only if it was not already removed by jQuery.event.remove
-                                       if ( cache[ id ] ) {
+       // Check if an input maintains its value after becoming a radio
+       input.value = "t";
+       input.setAttribute( "type", "radio" );
+       support.radioValue = input.value === "t";
+})();
 
-                                               delete cache[ id ];
 
-                                               // IE does not allow us to delete expando properties from nodes,
-                                               // nor does it have a removeAttribute function on Document nodes;
-                                               // we must handle all of these cases
-                                               if ( deleteExpando ) {
-                                                       delete elem[ internalKey ];
+var rreturn = /\r/g;
 
-                                               } else if ( elem.removeAttribute ) {
-                                                       elem.removeAttribute( internalKey );
+jQuery.fn.extend({
+       val: function( value ) {
+               var hooks, ret, isFunction,
+                       elem = this[0];
 
-                                               } else {
-                                                       elem[ internalKey ] = null;
-                                               }
+               if ( !arguments.length ) {
+                       if ( elem ) {
+                               hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
 
-                                               jQuery.deletedIds.push( id );
-                                       }
+                               if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
+                                       return ret;
                                }
-                       }
-               }
-       }
-});
-// Limit scope pollution from any deprecated API
-(function() {
 
-var matched, browser;
+                               ret = elem.value;
+
+                               return typeof ret === "string" ?
+                                       // handle most common string cases
+                                       ret.replace(rreturn, "") :
+                                       // handle cases where value is null/undef or number
+                                       ret == null ? "" : ret;
+                       }
 
-// Use of jQuery.browser is frowned upon.
-// More details: http://api.jquery.com/jQuery.browser
-// jQuery.uaMatch maintained for back-compat
-jQuery.uaMatch = function( ua ) {
-       ua = ua.toLowerCase();
+                       return;
+               }
 
-       var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
-               /(webkit)[ \/]([\w.]+)/.exec( ua ) ||
-               /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
-               /(msie) ([\w.]+)/.exec( ua ) ||
-               ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
-               [];
+               isFunction = jQuery.isFunction( value );
 
-       return {
-               browser: match[ 1 ] || "",
-               version: match[ 2 ] || "0"
-       };
-};
+               return this.each(function( i ) {
+                       var val;
 
-matched = jQuery.uaMatch( navigator.userAgent );
-browser = {};
+                       if ( this.nodeType !== 1 ) {
+                               return;
+                       }
 
-if ( matched.browser ) {
-       browser[ matched.browser ] = true;
-       browser.version = matched.version;
-}
+                       if ( isFunction ) {
+                               val = value.call( this, i, jQuery( this ).val() );
+                       } else {
+                               val = value;
+                       }
 
-// Chrome is Webkit, but Webkit is also Safari.
-if ( browser.chrome ) {
-       browser.webkit = true;
-} else if ( browser.webkit ) {
-       browser.safari = true;
-}
+                       // Treat null/undefined as ""; convert numbers to string
+                       if ( val == null ) {
+                               val = "";
+                       } else if ( typeof val === "number" ) {
+                               val += "";
+                       } else if ( jQuery.isArray( val ) ) {
+                               val = jQuery.map( val, function( value ) {
+                                       return value == null ? "" : value + "";
+                               });
+                       }
 
-jQuery.browser = browser;
+                       hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
 
-jQuery.sub = function() {
-       function jQuerySub( selector, context ) {
-               return new jQuerySub.fn.init( selector, context );
+                       // If set returns undefined, fall back to normal setting
+                       if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
+                               this.value = val;
+                       }
+               });
        }
-       jQuery.extend( true, jQuerySub, this );
-       jQuerySub.superclass = this;
-       jQuerySub.fn = jQuerySub.prototype = this();
-       jQuerySub.fn.constructor = jQuerySub;
-       jQuerySub.sub = this.sub;
-       jQuerySub.fn.init = function init( selector, context ) {
-               if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
-                       context = jQuerySub( context );
-               }
+});
 
-               return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
-       };
-       jQuerySub.fn.init.prototype = jQuerySub.fn;
-       var rootjQuerySub = jQuerySub(document);
-       return jQuerySub;
-};
+jQuery.extend({
+       valHooks: {
+               option: {
+                       get: function( elem ) {
+                               var val = jQuery.find.attr( elem, "value" );
+                               return val != null ?
+                                       val :
+                                       // Support: IE10-11+
+                                       // option.text throws exceptions (#14686, #14858)
+                                       jQuery.trim( jQuery.text( elem ) );
+                       }
+               },
+               select: {
+                       get: function( elem ) {
+                               var value, option,
+                                       options = elem.options,
+                                       index = elem.selectedIndex,
+                                       one = elem.type === "select-one" || index < 0,
+                                       values = one ? null : [],
+                                       max = one ? index + 1 : options.length,
+                                       i = index < 0 ?
+                                               max :
+                                               one ? index : 0;
 
-})();
-var curCSS, iframe, iframeDoc,
-       ralpha = /alpha\([^)]*\)/i,
-       ropacity = /opacity=([^)]*)/,
-       rposition = /^(top|right|bottom|left)$/,
-       // swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
-       // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
-       rdisplayswap = /^(none|table(?!-c[ea]).+)/,
-       rmargin = /^margin/,
-       rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ),
-       rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ),
-       rrelNum = new RegExp( "^([-+])=(" + core_pnum + ")", "i" ),
-       elemdisplay = { BODY: "block" },
+                               // Loop through all the selected options
+                               for ( ; i < max; i++ ) {
+                                       option = options[ i ];
 
-       cssShow = { position: "absolute", visibility: "hidden", display: "block" },
-       cssNormalTransform = {
-               letterSpacing: 0,
-               fontWeight: 400
-       },
+                                       // oldIE doesn't update selected after form reset (#2551)
+                                       if ( ( option.selected || i === index ) &&
+                                                       // Don't return options that are disabled or in a disabled optgroup
+                                                       ( support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) &&
+                                                       ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
 
-       cssExpand = [ "Top", "Right", "Bottom", "Left" ],
-       cssPrefixes = [ "Webkit", "O", "Moz", "ms" ],
+                                               // Get the specific value for the option
+                                               value = jQuery( option ).val();
 
-       eventsToggle = jQuery.fn.toggle;
+                                               // We don't need an array for one selects
+                                               if ( one ) {
+                                                       return value;
+                                               }
 
-// return a css property mapped to a potentially vendor prefixed property
-function vendorPropName( style, name ) {
+                                               // Multi-Selects return an array
+                                               values.push( value );
+                                       }
+                               }
 
-       // shortcut for names that are not vendor prefixed
-       if ( name in style ) {
-               return name;
-       }
+                               return values;
+                       },
 
-       // check for vendor prefixed names
-       var capName = name.charAt(0).toUpperCase() + name.slice(1),
-               origName = name,
-               i = cssPrefixes.length;
+                       set: function( elem, value ) {
+                               var optionSet, option,
+                                       options = elem.options,
+                                       values = jQuery.makeArray( value ),
+                                       i = options.length;
 
-       while ( i-- ) {
-               name = cssPrefixes[ i ] + capName;
-               if ( name in style ) {
-                       return name;
-               }
-       }
+                               while ( i-- ) {
+                                       option = options[ i ];
 
-       return origName;
-}
+                                       if ( jQuery.inArray( jQuery.valHooks.option.get( option ), values ) >= 0 ) {
 
-function isHidden( elem, el ) {
-       elem = el || elem;
-       return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
-}
+                                               // Support: IE6
+                                               // When new option element is added to select box we need to
+                                               // force reflow of newly added node in order to workaround delay
+                                               // of initialization properties
+                                               try {
+                                                       option.selected = optionSet = true;
 
-function showHide( elements, show ) {
-       var elem, display,
-               values = [],
-               index = 0,
-               length = elements.length;
+                                               } catch ( _ ) {
 
-       for ( ; index < length; index++ ) {
-               elem = elements[ index ];
-               if ( !elem.style ) {
-                       continue;
-               }
-               values[ index ] = jQuery._data( elem, "olddisplay" );
-               if ( show ) {
-                       // Reset the inline display of this element to learn if it is
-                       // being hidden by cascaded rules or not
-                       if ( !values[ index ] && elem.style.display === "none" ) {
-                               elem.style.display = "";
-                       }
+                                                       // Will be executed only in IE6
+                                                       option.scrollHeight;
+                                               }
+
+                                       } else {
+                                               option.selected = false;
+                                       }
+                               }
 
-                       // Set elements which have been overridden with display: none
-                       // in a stylesheet to whatever the default browser style is
-                       // for such an element
-                       if ( elem.style.display === "" && isHidden( elem ) ) {
-                               values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) );
-                       }
-               } else {
-                       display = curCSS( elem, "display" );
+                               // Force browsers to behave consistently when non-matching value is set
+                               if ( !optionSet ) {
+                                       elem.selectedIndex = -1;
+                               }
 
-                       if ( !values[ index ] && display !== "none" ) {
-                               jQuery._data( elem, "olddisplay", display );
+                               return options;
                        }
                }
        }
+});
 
-       // Set the display of most of the elements in a second loop
-       // to avoid the constant reflow
-       for ( index = 0; index < length; index++ ) {
-               elem = elements[ index ];
-               if ( !elem.style ) {
-                       continue;
-               }
-               if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
-                       elem.style.display = show ? values[ index ] || "" : "none";
+// Radios and checkboxes getter/setter
+jQuery.each([ "radio", "checkbox" ], function() {
+       jQuery.valHooks[ this ] = {
+               set: function( elem, value ) {
+                       if ( jQuery.isArray( value ) ) {
+                               return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
+                       }
                }
+       };
+       if ( !support.checkOn ) {
+               jQuery.valHooks[ this ].get = function( elem ) {
+                       // Support: Webkit
+                       // "" is returned instead of "on" if a value isn't specified
+                       return elem.getAttribute("value") === null ? "on" : elem.value;
+               };
        }
+});
 
-       return elements;
-}
+
+
+
+var nodeHook, boolHook,
+       attrHandle = jQuery.expr.attrHandle,
+       ruseDefault = /^(?:checked|selected)$/i,
+       getSetAttribute = support.getSetAttribute,
+       getSetInput = support.input;
 
 jQuery.fn.extend({
-       css: function( name, value ) {
-               return jQuery.access( this, function( elem, name, value ) {
-                       return value !== undefined ?
-                               jQuery.style( elem, name, value ) :
-                               jQuery.css( elem, name );
-               }, name, value, arguments.length > 1 );
-       },
-       show: function() {
-               return showHide( this, true );
-       },
-       hide: function() {
-               return showHide( this );
+       attr: function( name, value ) {
+               return access( this, jQuery.attr, name, value, arguments.length > 1 );
        },
-       toggle: function( state, fn2 ) {
-               var bool = typeof state === "boolean";
-
-               if ( jQuery.isFunction( state ) && jQuery.isFunction( fn2 ) ) {
-                       return eventsToggle.apply( this, arguments );
-               }
 
+       removeAttr: function( name ) {
                return this.each(function() {
-                       if ( bool ? state : isHidden( this ) ) {
-                               jQuery( this ).show();
-                       } else {
-                               jQuery( this ).hide();
-                       }
+                       jQuery.removeAttr( this, name );
                });
        }
 });
 
 jQuery.extend({
-       // Add in style property hooks for overriding the default
-       // behavior of getting and setting a style property
-       cssHooks: {
-               opacity: {
-                       get: function( elem, computed ) {
-                               if ( computed ) {
-                                       // We should always get a number back from opacity
-                                       var ret = curCSS( elem, "opacity" );
-                                       return ret === "" ? "1" : ret;
-
-                               }
-                       }
-               }
-       },
-
-       // Exclude the following css properties to add px
-       cssNumber: {
-               "fillOpacity": true,
-               "fontWeight": true,
-               "lineHeight": true,
-               "opacity": true,
-               "orphans": true,
-               "widows": true,
-               "zIndex": true,
-               "zoom": true
-       },
-
-       // Add in properties whose names you wish to fix before
-       // setting or getting the value
-       cssProps: {
-               // normalize float css property
-               "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
-       },
+       attr: function( elem, name, value ) {
+               var hooks, ret,
+                       nType = elem.nodeType;
 
-       // Get and set the style property on a DOM Node
-       style: function( elem, name, value, extra ) {
-               // Don't set styles on text and comment nodes
-               if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+               // don't get/set attributes on text, comment and attribute nodes
+               if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
                        return;
                }
 
-               // Make sure that we're working with the right name
-               var ret, type, hooks,
-                       origName = jQuery.camelCase( name ),
-                       style = elem.style;
-
-               name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
+               // Fallback to prop when attributes are not supported
+               if ( typeof elem.getAttribute === strundefined ) {
+                       return jQuery.prop( elem, name, value );
+               }
 
-               // gets hook for the prefixed version
-               // followed by the unprefixed version
-               hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+               // All attributes are lowercase
+               // Grab necessary hook if one is defined
+               if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
+                       name = name.toLowerCase();
+                       hooks = jQuery.attrHooks[ name ] ||
+                               ( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );
+               }
 
-               // Check if we're setting a value
                if ( value !== undefined ) {
-                       type = typeof value;
 
-                       // convert relative number strings (+= or -=) to relative numbers. #7345
-                       if ( type === "string" && (ret = rrelNum.exec( value )) ) {
-                               value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
-                               // Fixes bug #9237
-                               type = "number";
-                       }
+                       if ( value === null ) {
+                               jQuery.removeAttr( elem, name );
 
-                       // Make sure that NaN and null values aren't set. See: #7116
-                       if ( value == null || type === "number" && isNaN( value ) ) {
-                               return;
-                       }
+                       } else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+                               return ret;
 
-                       // If a number was passed in, add 'px' to the (except for certain CSS properties)
-                       if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
-                               value += "px";
+                       } else {
+                               elem.setAttribute( name, value + "" );
+                               return value;
                        }
 
-                       // If a hook was provided, use that value, otherwise just set the specified value
-                       if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
-                               // Wrapped to prevent IE from throwing errors when 'invalid' values are provided
-                               // Fixes bug #5509
-                               try {
-                                       style[ name ] = value;
-                               } catch(e) {}
-                       }
+               } else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+                       return ret;
 
                } else {
-                       // If a hook was provided get the non-computed value from there
-                       if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
-                               return ret;
-                       }
+                       ret = jQuery.find.attr( elem, name );
 
-                       // Otherwise just get the value from the style object
-                       return style[ name ];
+                       // Non-existent attributes return null, we normalize to undefined
+                       return ret == null ?
+                               undefined :
+                               ret;
                }
        },
 
-       css: function( elem, name, numeric, extra ) {
-               var val, num, hooks,
-                       origName = jQuery.camelCase( name );
+       removeAttr: function( elem, value ) {
+               var name, propName,
+                       i = 0,
+                       attrNames = value && value.match( rnotwhite );
 
-               // Make sure that we're working with the right name
-               name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
+               if ( attrNames && elem.nodeType === 1 ) {
+                       while ( (name = attrNames[i++]) ) {
+                               propName = jQuery.propFix[ name ] || name;
 
-               // gets hook for the prefixed version
-               // followed by the unprefixed version
-               hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+                               // Boolean attributes get special treatment (#10870)
+                               if ( jQuery.expr.match.bool.test( name ) ) {
+                                       // Set corresponding property to false
+                                       if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
+                                               elem[ propName ] = false;
+                                       // Support: IE<9
+                                       // Also clear defaultChecked/defaultSelected (if appropriate)
+                                       } else {
+                                               elem[ jQuery.camelCase( "default-" + name ) ] =
+                                                       elem[ propName ] = false;
+                                       }
 
-               // If a hook was provided get the computed value from there
-               if ( hooks && "get" in hooks ) {
-                       val = hooks.get( elem, true, extra );
-               }
+                               // See #9699 for explanation of this approach (setting first, then removal)
+                               } else {
+                                       jQuery.attr( elem, name, "" );
+                               }
 
-               // Otherwise, if a way to get the computed value exists, use that
-               if ( val === undefined ) {
-                       val = curCSS( elem, name );
+                               elem.removeAttribute( getSetAttribute ? name : propName );
+                       }
                }
+       },
 
-               //convert "normal" to computed value
-               if ( val === "normal" && name in cssNormalTransform ) {
-                       val = cssNormalTransform[ name ];
+       attrHooks: {
+               type: {
+                       set: function( elem, value ) {
+                               if ( !support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
+                                       // Setting the type on a radio button after the value resets the value in IE6-9
+                                       // Reset value to default in case type is set after value during creation
+                                       var val = elem.value;
+                                       elem.setAttribute( "type", value );
+                                       if ( val ) {
+                                               elem.value = val;
+                                       }
+                                       return value;
+                               }
+                       }
                }
+       }
+});
 
-               // Return, converting to number if forced or a qualifier was provided and val looks numeric
-               if ( numeric || extra !== undefined ) {
-                       num = parseFloat( val );
-                       return numeric || jQuery.isNumeric( num ) ? num || 0 : val;
+// Hook for boolean attributes
+boolHook = {
+       set: function( elem, value, name ) {
+               if ( value === false ) {
+                       // Remove boolean attributes when set to false
+                       jQuery.removeAttr( elem, name );
+               } else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
+                       // IE<8 needs the *property* name
+                       elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );
+
+               // Use defaultChecked and defaultSelected for oldIE
+               } else {
+                       elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true;
                }
-               return val;
-       },
 
-       // A method for quickly swapping in/out CSS properties to get correct calculations
-       swap: function( elem, options, callback ) {
-               var ret, name,
-                       old = {};
+               return name;
+       }
+};
+
+// Retrieve booleans specially
+jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
 
-               // Remember the old values, and insert the new ones
-               for ( name in options ) {
-                       old[ name ] = elem.style[ name ];
-                       elem.style[ name ] = options[ name ];
-               }
+       var getter = attrHandle[ name ] || jQuery.find.attr;
 
-               ret = callback.call( elem );
+       attrHandle[ name ] = getSetInput && getSetAttribute || !ruseDefault.test( name ) ?
+               function( elem, name, isXML ) {
+                       var ret, handle;
+                       if ( !isXML ) {
+                               // Avoid an infinite loop by temporarily removing this function from the getter
+                               handle = attrHandle[ name ];
+                               attrHandle[ name ] = ret;
+                               ret = getter( elem, name, isXML ) != null ?
+                                       name.toLowerCase() :
+                                       null;
+                               attrHandle[ name ] = handle;
+                       }
+                       return ret;
+               } :
+               function( elem, name, isXML ) {
+                       if ( !isXML ) {
+                               return elem[ jQuery.camelCase( "default-" + name ) ] ?
+                                       name.toLowerCase() :
+                                       null;
+                       }
+               };
+});
 
-               // Revert the old values
-               for ( name in options ) {
-                       elem.style[ name ] = old[ name ];
+// fix oldIE attroperties
+if ( !getSetInput || !getSetAttribute ) {
+       jQuery.attrHooks.value = {
+               set: function( elem, value, name ) {
+                       if ( jQuery.nodeName( elem, "input" ) ) {
+                               // Does not return so that setAttribute is also used
+                               elem.defaultValue = value;
+                       } else {
+                               // Use nodeHook if defined (#1954); otherwise setAttribute is fine
+                               return nodeHook && nodeHook.set( elem, value, name );
+                       }
                }
+       };
+}
 
-               return ret;
-       }
-});
+// IE6/7 do not support getting/setting some attributes with get/setAttribute
+if ( !getSetAttribute ) {
 
-// NOTE: To any future maintainer, we've window.getComputedStyle
-// because jsdom on node.js will break without it.
-if ( window.getComputedStyle ) {
-       curCSS = function( elem, name ) {
-               var ret, width, minWidth, maxWidth,
-                       computed = window.getComputedStyle( elem, null ),
-                       style = elem.style;
+       // Use this for any attribute in IE6/7
+       // This fixes almost every IE6/7 issue
+       nodeHook = {
+               set: function( elem, value, name ) {
+                       // Set the existing or create a new attribute node
+                       var ret = elem.getAttributeNode( name );
+                       if ( !ret ) {
+                               elem.setAttributeNode(
+                                       (ret = elem.ownerDocument.createAttribute( name ))
+                               );
+                       }
 
-               if ( computed ) {
+                       ret.value = value += "";
 
-                       // getPropertyValue is only needed for .css('filter') in IE9, see #12537
-                       ret = computed.getPropertyValue( name ) || computed[ name ];
+                       // Break association with cloned elements by also using setAttribute (#9646)
+                       if ( name === "value" || value === elem.getAttribute( name ) ) {
+                               return value;
+                       }
+               }
+       };
 
-                       if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
-                               ret = jQuery.style( elem, name );
+       // Some attributes are constructed with empty-string values when not defined
+       attrHandle.id = attrHandle.name = attrHandle.coords =
+               function( elem, name, isXML ) {
+                       var ret;
+                       if ( !isXML ) {
+                               return (ret = elem.getAttributeNode( name )) && ret.value !== "" ?
+                                       ret.value :
+                                       null;
                        }
+               };
 
-                       // A tribute to the "awesome hack by Dean Edwards"
-                       // Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right
-                       // Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
-                       // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
-                       if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
-                               width = style.width;
-                               minWidth = style.minWidth;
-                               maxWidth = style.maxWidth;
+       // Fixing value retrieval on a button requires this module
+       jQuery.valHooks.button = {
+               get: function( elem, name ) {
+                       var ret = elem.getAttributeNode( name );
+                       if ( ret && ret.specified ) {
+                               return ret.value;
+                       }
+               },
+               set: nodeHook.set
+       };
 
-                               style.minWidth = style.maxWidth = style.width = ret;
-                               ret = computed.width;
+       // Set contenteditable to false on removals(#10429)
+       // Setting to empty string throws an error as an invalid value
+       jQuery.attrHooks.contenteditable = {
+               set: function( elem, value, name ) {
+                       nodeHook.set( elem, value === "" ? false : value, name );
+               }
+       };
 
-                               style.width = width;
-                               style.minWidth = minWidth;
-                               style.maxWidth = maxWidth;
+       // Set width and height to auto instead of 0 on empty string( Bug #8150 )
+       // This is for removals
+       jQuery.each([ "width", "height" ], function( i, name ) {
+               jQuery.attrHooks[ name ] = {
+                       set: function( elem, value ) {
+                               if ( value === "" ) {
+                                       elem.setAttribute( name, "auto" );
+                                       return value;
+                               }
                        }
-               }
+               };
+       });
+}
 
-               return ret;
+if ( !support.style ) {
+       jQuery.attrHooks.style = {
+               get: function( elem ) {
+                       // Return undefined in the case of empty string
+                       // Note: IE uppercases css property names, but if we were to .toLowerCase()
+                       // .cssText, that would destroy case senstitivity in URL's, like in "background"
+                       return elem.style.cssText || undefined;
+               },
+               set: function( elem, value ) {
+                       return ( elem.style.cssText = value + "" );
+               }
        };
-} else if ( document.documentElement.currentStyle ) {
-       curCSS = function( elem, name ) {
-               var left, rsLeft,
-                       ret = elem.currentStyle && elem.currentStyle[ name ],
-                       style = elem.style;
+}
 
-               // Avoid setting ret to empty string here
-               // so we don't default to auto
-               if ( ret == null && style && style[ name ] ) {
-                       ret = style[ name ];
-               }
 
-               // From the awesome hack by Dean Edwards
-               // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
 
-               // If we're not dealing with a regular pixel number
-               // but a number that has a weird ending, we need to convert it to pixels
-               // but not position css attributes, as those are proportional to the parent element instead
-               // and we can't measure the parent instead because it might trigger a "stacking dolls" problem
-               if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
 
-                       // Remember the original values
-                       left = style.left;
-                       rsLeft = elem.runtimeStyle && elem.runtimeStyle.left;
+var rfocusable = /^(?:input|select|textarea|button|object)$/i,
+       rclickable = /^(?:a|area)$/i;
 
-                       // Put in the new values to get a computed value out
-                       if ( rsLeft ) {
-                               elem.runtimeStyle.left = elem.currentStyle.left;
-                       }
-                       style.left = name === "fontSize" ? "1em" : ret;
-                       ret = style.pixelLeft + "px";
+jQuery.fn.extend({
+       prop: function( name, value ) {
+               return access( this, jQuery.prop, name, value, arguments.length > 1 );
+       },
 
-                       // Revert the changed values
-                       style.left = left;
-                       if ( rsLeft ) {
-                               elem.runtimeStyle.left = rsLeft;
-                       }
-               }
+       removeProp: function( name ) {
+               name = jQuery.propFix[ name ] || name;
+               return this.each(function() {
+                       // try/catch handles cases where IE balks (such as removing a property on window)
+                       try {
+                               this[ name ] = undefined;
+                               delete this[ name ];
+                       } catch( e ) {}
+               });
+       }
+});
 
-               return ret === "" ? "auto" : ret;
-       };
-}
+jQuery.extend({
+       propFix: {
+               "for": "htmlFor",
+               "class": "className"
+       },
 
-function setPositiveNumber( elem, value, subtract ) {
-       var matches = rnumsplit.exec( value );
-       return matches ?
-                       Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
-                       value;
-}
+       prop: function( elem, name, value ) {
+               var ret, hooks, notxml,
+                       nType = elem.nodeType;
 
-function augmentWidthOrHeight( elem, name, extra, isBorderBox ) {
-       var i = extra === ( isBorderBox ? "border" : "content" ) ?
-               // If we already have the right measurement, avoid augmentation
-               4 :
-               // Otherwise initialize for horizontal or vertical properties
-               name === "width" ? 1 : 0,
+               // don't get/set properties on text, comment and attribute nodes
+               if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+                       return;
+               }
 
-               val = 0;
+               notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
 
-       for ( ; i < 4; i += 2 ) {
-               // both box models exclude margin, so add it if we want it
-               if ( extra === "margin" ) {
-                       // we use jQuery.css instead of curCSS here
-                       // because of the reliableMarginRight CSS hook!
-                       val += jQuery.css( elem, extra + cssExpand[ i ], true );
+               if ( notxml ) {
+                       // Fix name and attach hooks
+                       name = jQuery.propFix[ name ] || name;
+                       hooks = jQuery.propHooks[ name ];
                }
 
-               // From this point on we use curCSS for maximum performance (relevant in animations)
-               if ( isBorderBox ) {
-                       // border-box includes padding, so remove it if we want content
-                       if ( extra === "content" ) {
-                               val -= parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0;
-                       }
+               if ( value !== undefined ) {
+                       return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?
+                               ret :
+                               ( elem[ name ] = value );
 
-                       // at this point, extra isn't border nor margin, so remove border
-                       if ( extra !== "margin" ) {
-                               val -= parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
-                       }
                } else {
-                       // at this point, extra isn't content, so add padding
-                       val += parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0;
+                       return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ?
+                               ret :
+                               elem[ name ];
+               }
+       },
 
-                       // at this point, extra isn't content nor padding, so add border
-                       if ( extra !== "padding" ) {
-                               val += parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
+       propHooks: {
+               tabIndex: {
+                       get: function( elem ) {
+                               // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
+                               // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+                               // Use proper attribute retrieval(#12072)
+                               var tabindex = jQuery.find.attr( elem, "tabindex" );
+
+                               return tabindex ?
+                                       parseInt( tabindex, 10 ) :
+                                       rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
+                                               0 :
+                                               -1;
                        }
                }
        }
+});
 
-       return val;
+// Some attributes require a special call on IE
+// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !support.hrefNormalized ) {
+       // href/src property should get the full normalized URL (#10299/#12915)
+       jQuery.each([ "href", "src" ], function( i, name ) {
+               jQuery.propHooks[ name ] = {
+                       get: function( elem ) {
+                               return elem.getAttribute( name, 4 );
+                       }
+               };
+       });
 }
 
-function getWidthOrHeight( elem, name, extra ) {
+// Support: Safari, IE9+
+// mis-reports the default selected property of an option
+// Accessing the parent's selectedIndex property fixes it
+if ( !support.optSelected ) {
+       jQuery.propHooks.selected = {
+               get: function( elem ) {
+                       var parent = elem.parentNode;
 
-       // Start with offset property, which is equivalent to the border-box value
-       var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
-               valueIsBorderBox = true,
-               isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box";
+                       if ( parent ) {
+                               parent.selectedIndex;
 
-       // some non-html elements return undefined for offsetWidth, so check for null/undefined
-       // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
-       // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
-       if ( val <= 0 || val == null ) {
-               // Fall back to computed then uncomputed css if necessary
-               val = curCSS( elem, name );
-               if ( val < 0 || val == null ) {
-                       val = elem.style[ name ];
+                               // Make sure that it also works with optgroups, see #5701
+                               if ( parent.parentNode ) {
+                                       parent.parentNode.selectedIndex;
+                               }
+                       }
+                       return null;
                }
+       };
+}
 
-               // Computed unit is not pixels. Stop here and return.
-               if ( rnumnonpx.test(val) ) {
-                       return val;
-               }
+jQuery.each([
+       "tabIndex",
+       "readOnly",
+       "maxLength",
+       "cellSpacing",
+       "cellPadding",
+       "rowSpan",
+       "colSpan",
+       "useMap",
+       "frameBorder",
+       "contentEditable"
+], function() {
+       jQuery.propFix[ this.toLowerCase() ] = this;
+});
 
-               // we need the check for style in case a browser which returns unreliable values
-               // for getComputedStyle silently falls back to the reliable elem.style
-               valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );
+// IE6/7 call enctype encoding
+if ( !support.enctype ) {
+       jQuery.propFix.enctype = "encoding";
+}
 
-               // Normalize "", auto, and prepare for extra
-               val = parseFloat( val ) || 0;
-       }
 
-       // use the active box-sizing model to add/subtract irrelevant styles
-       return ( val +
-               augmentWidthOrHeight(
-                       elem,
-                       name,
-                       extra || ( isBorderBox ? "border" : "content" ),
-                       valueIsBorderBox
-               )
-       ) + "px";
-}
 
 
-// Try to determine the default display value of an element
-function css_defaultDisplay( nodeName ) {
-       if ( elemdisplay[ nodeName ] ) {
-               return elemdisplay[ nodeName ];
-       }
+var rclass = /[\t\r\n\f]/g;
 
-       var elem = jQuery( "<" + nodeName + ">" ).appendTo( document.body ),
-               display = elem.css("display");
-       elem.remove();
+jQuery.fn.extend({
+       addClass: function( value ) {
+               var classes, elem, cur, clazz, j, finalValue,
+                       i = 0,
+                       len = this.length,
+                       proceed = typeof value === "string" && value;
 
-       // If the simple way fails,
-       // get element's real default display by attaching it to a temp iframe
-       if ( display === "none" || display === "" ) {
-               // Use the already-created iframe if possible
-               iframe = document.body.appendChild(
-                       iframe || jQuery.extend( document.createElement("iframe"), {
-                               frameBorder: 0,
-                               width: 0,
-                               height: 0
-                       })
-               );
+               if ( jQuery.isFunction( value ) ) {
+                       return this.each(function( j ) {
+                               jQuery( this ).addClass( value.call( this, j, this.className ) );
+                       });
+               }
+
+               if ( proceed ) {
+                       // The disjunction here is for better compressibility (see removeClass)
+                       classes = ( value || "" ).match( rnotwhite ) || [];
+
+                       for ( ; i < len; i++ ) {
+                               elem = this[ i ];
+                               cur = elem.nodeType === 1 && ( elem.className ?
+                                       ( " " + elem.className + " " ).replace( rclass, " " ) :
+                                       " "
+                               );
+
+                               if ( cur ) {
+                                       j = 0;
+                                       while ( (clazz = classes[j++]) ) {
+                                               if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
+                                                       cur += clazz + " ";
+                                               }
+                                       }
 
-               // Create a cacheable copy of the iframe document on first call.
-               // IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
-               // document to it; WebKit & Firefox won't allow reusing the iframe document.
-               if ( !iframeDoc || !iframe.createElement ) {
-                       iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
-                       iframeDoc.write("<!doctype html><html><body>");
-                       iframeDoc.close();
+                                       // only assign if different to avoid unneeded rendering.
+                                       finalValue = jQuery.trim( cur );
+                                       if ( elem.className !== finalValue ) {
+                                               elem.className = finalValue;
+                                       }
+                               }
+                       }
                }
 
-               elem = iframeDoc.body.appendChild( iframeDoc.createElement(nodeName) );
+               return this;
+       },
 
-               display = curCSS( elem, "display" );
-               document.body.removeChild( iframe );
-       }
+       removeClass: function( value ) {
+               var classes, elem, cur, clazz, j, finalValue,
+                       i = 0,
+                       len = this.length,
+                       proceed = arguments.length === 0 || typeof value === "string" && value;
 
-       // Store the correct default display
-       elemdisplay[ nodeName ] = display;
+               if ( jQuery.isFunction( value ) ) {
+                       return this.each(function( j ) {
+                               jQuery( this ).removeClass( value.call( this, j, this.className ) );
+                       });
+               }
+               if ( proceed ) {
+                       classes = ( value || "" ).match( rnotwhite ) || [];
 
-       return display;
-}
+                       for ( ; i < len; i++ ) {
+                               elem = this[ i ];
+                               // This expression is here for better compressibility (see addClass)
+                               cur = elem.nodeType === 1 && ( elem.className ?
+                                       ( " " + elem.className + " " ).replace( rclass, " " ) :
+                                       ""
+                               );
 
-jQuery.each([ "height", "width" ], function( i, name ) {
-       jQuery.cssHooks[ name ] = {
-               get: function( elem, computed, extra ) {
-                       if ( computed ) {
-                               // certain elements can have dimension info if we invisibly show them
-                               // however, it must have a current display style that would benefit from this
-                               if ( elem.offsetWidth === 0 && rdisplayswap.test( curCSS( elem, "display" ) ) ) {
-                                       return jQuery.swap( elem, cssShow, function() {
-                                               return getWidthOrHeight( elem, name, extra );
-                                       });
-                               } else {
-                                       return getWidthOrHeight( elem, name, extra );
+                               if ( cur ) {
+                                       j = 0;
+                                       while ( (clazz = classes[j++]) ) {
+                                               // Remove *all* instances
+                                               while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
+                                                       cur = cur.replace( " " + clazz + " ", " " );
+                                               }
+                                       }
+
+                                       // only assign if different to avoid unneeded rendering.
+                                       finalValue = value ? jQuery.trim( cur ) : "";
+                                       if ( elem.className !== finalValue ) {
+                                               elem.className = finalValue;
+                                       }
                                }
                        }
-               },
-
-               set: function( elem, value, extra ) {
-                       return setPositiveNumber( elem, value, extra ?
-                               augmentWidthOrHeight(
-                                       elem,
-                                       name,
-                                       extra,
-                                       jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box"
-                               ) : 0
-                       );
                }
-       };
-});
 
-if ( !jQuery.support.opacity ) {
-       jQuery.cssHooks.opacity = {
-               get: function( elem, computed ) {
-                       // IE uses filters for opacity
-                       return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
-                               ( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
-                               computed ? "1" : "";
-               },
+               return this;
+       },
 
-               set: function( elem, value ) {
-                       var style = elem.style,
-                               currentStyle = elem.currentStyle,
-                               opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
-                               filter = currentStyle && currentStyle.filter || style.filter || "";
+       toggleClass: function( value, stateVal ) {
+               var type = typeof value;
 
-                       // IE has trouble with opacity if it does not have layout
-                       // Force it by setting the zoom level
-                       style.zoom = 1;
+               if ( typeof stateVal === "boolean" && type === "string" ) {
+                       return stateVal ? this.addClass( value ) : this.removeClass( value );
+               }
 
-                       // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
-                       if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
-                               style.removeAttribute ) {
+               if ( jQuery.isFunction( value ) ) {
+                       return this.each(function( i ) {
+                               jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
+                       });
+               }
+
+               return this.each(function() {
+                       if ( type === "string" ) {
+                               // toggle individual class names
+                               var className,
+                                       i = 0,
+                                       self = jQuery( this ),
+                                       classNames = value.match( rnotwhite ) || [];
 
-                               // Setting style.filter to null, "" & " " still leave "filter:" in the cssText
-                               // if "filter:" is present at all, clearType is disabled, we want to avoid this
-                               // style.removeAttribute is IE Only, but so apparently is this code path...
-                               style.removeAttribute( "filter" );
+                               while ( (className = classNames[ i++ ]) ) {
+                                       // check each className given, space separated list
+                                       if ( self.hasClass( className ) ) {
+                                               self.removeClass( className );
+                                       } else {
+                                               self.addClass( className );
+                                       }
+                               }
 
-                               // if there there is no filter style applied in a css rule, we are done
-                               if ( currentStyle && !currentStyle.filter ) {
-                                       return;
+                       // Toggle whole class name
+                       } else if ( type === strundefined || type === "boolean" ) {
+                               if ( this.className ) {
+                                       // store className if set
+                                       jQuery._data( this, "__className__", this.className );
                                }
-                       }
 
-                       // otherwise, set new filter values
-                       style.filter = ralpha.test( filter ) ?
-                               filter.replace( ralpha, opacity ) :
-                               filter + " " + opacity;
-               }
-       };
-}
+                               // If the element has a class name or if we're passed "false",
+                               // then remove the whole classname (if there was one, the above saved it).
+                               // Otherwise bring back whatever was previously saved (if anything),
+                               // falling back to the empty string if nothing was stored.
+                               this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
+                       }
+               });
+       },
 
-// These hooks cannot be added until DOM ready because the support test
-// for it is not run until after DOM ready
-jQuery(function() {
-       if ( !jQuery.support.reliableMarginRight ) {
-               jQuery.cssHooks.marginRight = {
-                       get: function( elem, computed ) {
-                               // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
-                               // Work around by temporarily setting element display to inline-block
-                               return jQuery.swap( elem, { "display": "inline-block" }, function() {
-                                       if ( computed ) {
-                                               return curCSS( elem, "marginRight" );
-                                       }
-                               });
+       hasClass: function( selector ) {
+               var className = " " + selector + " ",
+                       i = 0,
+                       l = this.length;
+               for ( ; i < l; i++ ) {
+                       if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
+                               return true;
                        }
-               };
-       }
+               }
 
-       // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
-       // getComputedStyle returns percent when specified for top/left/bottom/right
-       // rather than make the css module depend on the offset module, we just check for it here
-       if ( !jQuery.support.pixelPosition && jQuery.fn.position ) {
-               jQuery.each( [ "top", "left" ], function( i, prop ) {
-                       jQuery.cssHooks[ prop ] = {
-                               get: function( elem, computed ) {
-                                       if ( computed ) {
-                                               var ret = curCSS( elem, prop );
-                                               // if curCSS returns percentage, fallback to offset
-                                               return rnumnonpx.test( ret ) ? jQuery( elem ).position()[ prop ] + "px" : ret;
-                                       }
-                               }
-                       };
-               });
+               return false;
        }
-
 });
 
-if ( jQuery.expr && jQuery.expr.filters ) {
-       jQuery.expr.filters.hidden = function( elem ) {
-               return ( elem.offsetWidth === 0 && elem.offsetHeight === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || curCSS( elem, "display" )) === "none");
-       };
 
-       jQuery.expr.filters.visible = function( elem ) {
-               return !jQuery.expr.filters.hidden( elem );
-       };
-}
 
-// These hooks are used by animate to expand properties
-jQuery.each({
-       margin: "",
-       padding: "",
-       border: "Width"
-}, function( prefix, suffix ) {
-       jQuery.cssHooks[ prefix + suffix ] = {
-               expand: function( value ) {
-                       var i,
 
-                               // assumes a single number if not a string
-                               parts = typeof value === "string" ? value.split(" ") : [ value ],
-                               expanded = {};
+// Return jQuery for attributes-only inclusion
 
-                       for ( i = 0; i < 4; i++ ) {
-                               expanded[ prefix + cssExpand[ i ] + suffix ] =
-                                       parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
-                       }
 
-                       return expanded;
-               }
-       };
+jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
+       "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+       "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
 
-       if ( !rmargin.test( prefix ) ) {
-               jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
-       }
+       // Handle event binding
+       jQuery.fn[ name ] = function( data, fn ) {
+               return arguments.length > 0 ?
+                       this.on( name, null, data, fn ) :
+                       this.trigger( name );
+       };
 });
-var r20 = /%20/g,
-       rbracket = /\[\]$/,
-       rCRLF = /\r?\n/g,
-       rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
-       rselectTextarea = /^(?:select|textarea)/i;
 
 jQuery.fn.extend({
-       serialize: function() {
-               return jQuery.param( this.serializeArray() );
+       hover: function( fnOver, fnOut ) {
+               return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
        },
-       serializeArray: function() {
-               return this.map(function(){
-                       return this.elements ? jQuery.makeArray( this.elements ) : this;
-               })
-               .filter(function(){
-                       return this.name && !this.disabled &&
-                               ( this.checked || rselectTextarea.test( this.nodeName ) ||
-                                       rinput.test( this.type ) );
-               })
-               .map(function( i, elem ){
-                       var val = jQuery( this ).val();
 
-                       return val == null ?
-                               null :
-                               jQuery.isArray( val ) ?
-                                       jQuery.map( val, function( val, i ){
-                                               return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
-                                       }) :
-                                       { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
-               }).get();
+       bind: function( types, data, fn ) {
+               return this.on( types, null, data, fn );
+       },
+       unbind: function( types, fn ) {
+               return this.off( types, null, fn );
+       },
+
+       delegate: function( selector, types, data, fn ) {
+               return this.on( types, selector, data, fn );
+       },
+       undelegate: function( selector, types, fn ) {
+               // ( namespace ) or ( selector, types [, fn] )
+               return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
        }
 });
 
-//Serialize an array of form elements or a set of
-//key/values into a query string
-jQuery.param = function( a, traditional ) {
-       var prefix,
-               s = [],
-               add = function( key, value ) {
-                       // If value is a function, invoke it and return its value
-                       value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
-                       s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
-               };
 
-       // Set traditional to true for jQuery <= 1.3.2 behavior.
-       if ( traditional === undefined ) {
-               traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
+var nonce = jQuery.now();
+
+var rquery = (/\?/);
+
+
+
+var rvalidtokens = /(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;
+
+jQuery.parseJSON = function( data ) {
+       // Attempt to parse using the native JSON parser first
+       if ( window.JSON && window.JSON.parse ) {
+               // Support: Android 2.3
+               // Workaround failure to string-cast null input
+               return window.JSON.parse( data + "" );
        }
 
-       // If an array was passed in, assume that it is an array of form elements.
-       if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
-               // Serialize the form elements
-               jQuery.each( a, function() {
-                       add( this.name, this.value );
-               });
+       var requireNonComma,
+               depth = null,
+               str = jQuery.trim( data + "" );
 
-       } else {
-               // If traditional, encode the "old" way (the way 1.3.2 or older
-               // did it), otherwise encode params recursively.
-               for ( prefix in a ) {
-                       buildParams( prefix, a[ prefix ], traditional, add );
+       // Guard against invalid (and possibly dangerous) input by ensuring that nothing remains
+       // after removing valid tokens
+       return str && !jQuery.trim( str.replace( rvalidtokens, function( token, comma, open, close ) {
+
+               // Force termination if we see a misplaced comma
+               if ( requireNonComma && comma ) {
+                       depth = 0;
                }
-       }
 
-       // Return the resulting serialization
-       return s.join( "&" ).replace( r20, "+" );
-};
+               // Perform no more replacements after returning to outermost depth
+               if ( depth === 0 ) {
+                       return token;
+               }
 
-function buildParams( prefix, obj, traditional, add ) {
-       var name;
+               // Commas must not follow "[", "{", or ","
+               requireNonComma = open || comma;
 
-       if ( jQuery.isArray( obj ) ) {
-               // Serialize array item.
-               jQuery.each( obj, function( i, v ) {
-                       if ( traditional || rbracket.test( prefix ) ) {
-                               // Treat each array item as a scalar.
-                               add( prefix, v );
+               // Determine new depth
+               // array/object open ("[" or "{"): depth += true - false (increment)
+               // array/object close ("]" or "}"): depth += false - true (decrement)
+               // other cases ("," or primitive): depth += true - true (numeric cast)
+               depth += !close - !open;
 
-                       } else {
-                               // If array item is non-scalar (array or object), encode its
-                               // numeric index to resolve deserialization ambiguity issues.
-                               // Note that rack (as of 1.0.0) can't currently deserialize
-                               // nested arrays properly, and attempting to do so may cause
-                               // a server error. Possible fixes are to modify rack's
-                               // deserialization algorithm or to provide an option or flag
-                               // to force array serialization to be shallow.
-                               buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
-                       }
-               });
+               // Remove this token
+               return "";
+       }) ) ?
+               ( Function( "return " + str ) )() :
+               jQuery.error( "Invalid JSON: " + data );
+};
 
-       } else if ( !traditional && jQuery.type( obj ) === "object" ) {
-               // Serialize object item.
-               for ( name in obj ) {
-                       buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
-               }
 
-       } else {
-               // Serialize scalar item.
-               add( prefix, obj );
+// Cross-browser xml parsing
+jQuery.parseXML = function( data ) {
+       var xml, tmp;
+       if ( !data || typeof data !== "string" ) {
+               return null;
        }
-}
+       try {
+               if ( window.DOMParser ) { // Standard
+                       tmp = new DOMParser();
+                       xml = tmp.parseFromString( data, "text/xml" );
+               } else { // IE
+                       xml = new ActiveXObject( "Microsoft.XMLDOM" );
+                       xml.async = "false";
+                       xml.loadXML( data );
+               }
+       } catch( e ) {
+               xml = undefined;
+       }
+       if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
+               jQuery.error( "Invalid XML: " + data );
+       }
+       return xml;
+};
+
+
 var
        // Document location
        ajaxLocParts,
        ajaxLocation,
 
        rhash = /#.*$/,
+       rts = /([?&])_=[^&]*/,
        rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
        // #7653, #8125, #8152: local protocol detection
-       rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
+       rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
        rnoContent = /^(?:GET|HEAD)$/,
        rprotocol = /^\/\//,
-       rquery = /\?/,
-       rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
-       rts = /([?&])_=[^&]*/,
-       rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,
-
-       // Keep a copy of the old load method
-       _load = jQuery.fn.load,
+       rurl = /^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,
 
        /* Prefilters
         * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
@@ -7314,7 +8575,7 @@ var
        transports = {},
 
        // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
-       allTypes = ["*/"] + ["*"];
+       allTypes = "*/".concat("*");
 
 // #8138, IE may throw an exception when accessing
 // a field from window.location if document.domain has been set
@@ -7342,215 +8603,238 @@ function addToPrefiltersOrTransports( structure ) {
                        dataTypeExpression = "*";
                }
 
-               var dataType, list, placeBefore,
-                       dataTypes = dataTypeExpression.toLowerCase().split( core_rspace ),
+               var dataType,
                        i = 0,
-                       length = dataTypes.length;
+                       dataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];
 
                if ( jQuery.isFunction( func ) ) {
                        // For each dataType in the dataTypeExpression
-                       for ( ; i < length; i++ ) {
-                               dataType = dataTypes[ i ];
-                               // We control if we're asked to add before
-                               // any existing element
-                               placeBefore = /^\+/.test( dataType );
-                               if ( placeBefore ) {
-                                       dataType = dataType.substr( 1 ) || "*";
+                       while ( (dataType = dataTypes[i++]) ) {
+                               // Prepend if requested
+                               if ( dataType.charAt( 0 ) === "+" ) {
+                                       dataType = dataType.slice( 1 ) || "*";
+                                       (structure[ dataType ] = structure[ dataType ] || []).unshift( func );
+
+                               // Otherwise append
+                               } else {
+                                       (structure[ dataType ] = structure[ dataType ] || []).push( func );
                                }
-                               list = structure[ dataType ] = structure[ dataType ] || [];
-                               // then we add to the structure accordingly
-                               list[ placeBefore ? "unshift" : "push" ]( func );
                        }
                }
        };
 }
 
 // Base inspection function for prefilters and transports
-function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
-               dataType /* internal */, inspected /* internal */ ) {
-
-       dataType = dataType || options.dataTypes[ 0 ];
-       inspected = inspected || {};
-
-       inspected[ dataType ] = true;
-
-       var selection,
-               list = structure[ dataType ],
-               i = 0,
-               length = list ? list.length : 0,
-               executeOnly = ( structure === prefilters );
-
-       for ( ; i < length && ( executeOnly || !selection ); i++ ) {
-               selection = list[ i ]( options, originalOptions, jqXHR );
-               // If we got redirected to another dataType
-               // we try there if executing only and not done already
-               if ( typeof selection === "string" ) {
-                       if ( !executeOnly || inspected[ selection ] ) {
-                               selection = undefined;
-                       } else {
-                               options.dataTypes.unshift( selection );
-                               selection = inspectPrefiltersOrTransports(
-                                               structure, options, originalOptions, jqXHR, selection, inspected );
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
+
+       var inspected = {},
+               seekingTransport = ( structure === transports );
+
+       function inspect( dataType ) {
+               var selected;
+               inspected[ dataType ] = true;
+               jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
+                       var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
+                       if ( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
+                               options.dataTypes.unshift( dataTypeOrTransport );
+                               inspect( dataTypeOrTransport );
+                               return false;
+                       } else if ( seekingTransport ) {
+                               return !( selected = dataTypeOrTransport );
                        }
-               }
-       }
-       // If we're only executing or nothing was selected
-       // we try the catchall dataType if not done already
-       if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
-               selection = inspectPrefiltersOrTransports(
-                               structure, options, originalOptions, jqXHR, "*", inspected );
+               });
+               return selected;
        }
-       // unnecessary when only executing (prefilters)
-       // but it'll be ignored by the caller in that case
-       return selection;
+
+       return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
 }
 
 // A special extend for ajax options
 // that takes "flat" options (not to be deep extended)
 // Fixes #9887
 function ajaxExtend( target, src ) {
-       var key, deep,
+       var deep, key,
                flatOptions = jQuery.ajaxSettings.flatOptions || {};
+
        for ( key in src ) {
                if ( src[ key ] !== undefined ) {
-                       ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
+                       ( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];
                }
        }
        if ( deep ) {
                jQuery.extend( true, target, deep );
        }
+
+       return target;
 }
 
-jQuery.fn.load = function( url, params, callback ) {
-       if ( typeof url !== "string" && _load ) {
-               return _load.apply( this, arguments );
+/* Handles responses to an ajax request:
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+       var firstDataType, ct, finalDataType, type,
+               contents = s.contents,
+               dataTypes = s.dataTypes;
+
+       // Remove auto dataType and get content-type in the process
+       while ( dataTypes[ 0 ] === "*" ) {
+               dataTypes.shift();
+               if ( ct === undefined ) {
+                       ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
+               }
        }
 
-       // Don't do a request if no elements are being requested
-       if ( !this.length ) {
-               return this;
+       // Check if we're dealing with a known content-type
+       if ( ct ) {
+               for ( type in contents ) {
+                       if ( contents[ type ] && contents[ type ].test( ct ) ) {
+                               dataTypes.unshift( type );
+                               break;
+                       }
+               }
        }
 
-       var selector, type, response,
-               self = this,
-               off = url.indexOf(" ");
+       // Check to see if we have a response for the expected dataType
+       if ( dataTypes[ 0 ] in responses ) {
+               finalDataType = dataTypes[ 0 ];
+       } else {
+               // Try convertible dataTypes
+               for ( type in responses ) {
+                       if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
+                               finalDataType = type;
+                               break;
+                       }
+                       if ( !firstDataType ) {
+                               firstDataType = type;
+                       }
+               }
+               // Or just use first one
+               finalDataType = finalDataType || firstDataType;
+       }
 
-       if ( off >= 0 ) {
-               selector = url.slice( off, url.length );
-               url = url.slice( 0, off );
+       // If we found a dataType
+       // We add the dataType to the list if needed
+       // and return the corresponding response
+       if ( finalDataType ) {
+               if ( finalDataType !== dataTypes[ 0 ] ) {
+                       dataTypes.unshift( finalDataType );
+               }
+               return responses[ finalDataType ];
+       }
+}
+
+/* Chain conversions given the request and the original response
+ * Also sets the responseXXX fields on the jqXHR instance
+ */
+function ajaxConvert( s, response, jqXHR, isSuccess ) {
+       var conv2, current, conv, tmp, prev,
+               converters = {},
+               // Work with a copy of dataTypes in case we need to modify it for conversion
+               dataTypes = s.dataTypes.slice();
+
+       // Create converters map with lowercased keys
+       if ( dataTypes[ 1 ] ) {
+               for ( conv in s.converters ) {
+                       converters[ conv.toLowerCase() ] = s.converters[ conv ];
+               }
        }
 
-       // If it's a function
-       if ( jQuery.isFunction( params ) ) {
-
-               // We assume that it's the callback
-               callback = params;
-               params = undefined;
+       current = dataTypes.shift();
 
-       // Otherwise, build a param string
-       } else if ( params && typeof params === "object" ) {
-               type = "POST";
-       }
+       // Convert to each sequential dataType
+       while ( current ) {
 
-       // Request the remote document
-       jQuery.ajax({
-               url: url,
+               if ( s.responseFields[ current ] ) {
+                       jqXHR[ s.responseFields[ current ] ] = response;
+               }
 
-               // if "type" variable is undefined, then "GET" method will be used
-               type: type,
-               dataType: "html",
-               data: params,
-               complete: function( jqXHR, status ) {
-                       if ( callback ) {
-                               self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
-                       }
+               // Apply the dataFilter if provided
+               if ( !prev && isSuccess && s.dataFilter ) {
+                       response = s.dataFilter( response, s.dataType );
                }
-       }).done(function( responseText ) {
 
-               // Save response for use in complete callback
-               response = arguments;
+               prev = current;
+               current = dataTypes.shift();
 
-               // See if a selector was specified
-               self.html( selector ?
+               if ( current ) {
 
-                       // Create a dummy div to hold the results
-                       jQuery("<div>")
+                       // There's only work to do if current dataType is non-auto
+                       if ( current === "*" ) {
 
-                               // inject the contents of the document in, removing the scripts
-                               // to avoid any 'Permission Denied' errors in IE
-                               .append( responseText.replace( rscript, "" ) )
+                               current = prev;
 
-                               // Locate the specified elements
-                               .find( selector ) :
+                       // Convert response if prev dataType is non-auto and differs from current
+                       } else if ( prev !== "*" && prev !== current ) {
 
-                       // If not, just inject the full result
-                       responseText );
+                               // Seek a direct converter
+                               conv = converters[ prev + " " + current ] || converters[ "* " + current ];
 
-       });
+                               // If none found, seek a pair
+                               if ( !conv ) {
+                                       for ( conv2 in converters ) {
 
-       return this;
-};
+                                               // If conv2 outputs current
+                                               tmp = conv2.split( " " );
+                                               if ( tmp[ 1 ] === current ) {
 
-// Attach a bunch of functions for handling common AJAX events
-jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
-       jQuery.fn[ o ] = function( f ){
-               return this.on( o, f );
-       };
-});
+                                                       // If prev can be converted to accepted input
+                                                       conv = converters[ prev + " " + tmp[ 0 ] ] ||
+                                                               converters[ "* " + tmp[ 0 ] ];
+                                                       if ( conv ) {
+                                                               // Condense equivalence converters
+                                                               if ( conv === true ) {
+                                                                       conv = converters[ conv2 ];
 
-jQuery.each( [ "get", "post" ], function( i, method ) {
-       jQuery[ method ] = function( url, data, callback, type ) {
-               // shift arguments if data argument was omitted
-               if ( jQuery.isFunction( data ) ) {
-                       type = type || callback;
-                       callback = data;
-                       data = undefined;
+                                                               // Otherwise, insert the intermediate dataType
+                                                               } else if ( converters[ conv2 ] !== true ) {
+                                                                       current = tmp[ 0 ];
+                                                                       dataTypes.unshift( tmp[ 1 ] );
+                                                               }
+                                                               break;
+                                                       }
+                                               }
+                                       }
+                               }
+
+                               // Apply converter (if not an equivalence)
+                               if ( conv !== true ) {
+
+                                       // Unless errors are allowed to bubble, catch and return them
+                                       if ( conv && s[ "throws" ] ) {
+                                               response = conv( response );
+                                       } else {
+                                               try {
+                                                       response = conv( response );
+                                               } catch ( e ) {
+                                                       return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
+                                               }
+                                       }
+                               }
+                       }
                }
+       }
 
-               return jQuery.ajax({
-                       type: method,
-                       url: url,
-                       data: data,
-                       success: callback,
-                       dataType: type
-               });
-       };
-});
+       return { state: "success", data: response };
+}
 
 jQuery.extend({
 
-       getScript: function( url, callback ) {
-               return jQuery.get( url, undefined, callback, "script" );
-       },
-
-       getJSON: function( url, data, callback ) {
-               return jQuery.get( url, data, callback, "json" );
-       },
+       // Counter for holding the number of active queries
+       active: 0,
 
-       // Creates a full fledged settings object into target
-       // with both ajaxSettings and settings fields.
-       // If target is omitted, writes into ajaxSettings.
-       ajaxSetup: function( target, settings ) {
-               if ( settings ) {
-                       // Building a settings object
-                       ajaxExtend( target, jQuery.ajaxSettings );
-               } else {
-                       // Extending ajaxSettings
-                       settings = target;
-                       target = jQuery.ajaxSettings;
-               }
-               ajaxExtend( target, settings );
-               return target;
-       },
+       // Last-Modified header cache for next request
+       lastModified: {},
+       etag: {},
 
        ajaxSettings: {
                url: ajaxLocation,
+               type: "GET",
                isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
                global: true,
-               type: "GET",
-               contentType: "application/x-www-form-urlencoded; charset=UTF-8",
                processData: true,
                async: true,
+               contentType: "application/x-www-form-urlencoded; charset=UTF-8",
                /*
                timeout: 0,
                data: null,
@@ -7564,11 +8848,11 @@ jQuery.extend({
                */
 
                accepts: {
-                       xml: "application/xml, text/xml",
-                       html: "text/html",
+                       "*": allTypes,
                        text: "text/plain",
-                       json: "application/json, text/javascript",
-                       "*": allTypes
+                       html: "text/html",
+                       xml: "application/xml, text/xml",
+                       json: "application/json, text/javascript"
                },
 
                contents: {
@@ -7579,16 +8863,16 @@ jQuery.extend({
 
                responseFields: {
                        xml: "responseXML",
-                       text: "responseText"
+                       text: "responseText",
+                       json: "responseJSON"
                },
 
-               // List of data converters
-               // 1) key format is "source_type destination_type" (a single space in-between)
-               // 2) the catchall symbol "*" can be used for source_type
+               // Data converters
+               // Keys separate source (or catchall "*") and destination types with a single space
                converters: {
 
                        // Convert anything to text
-                       "* text": window.String,
+                       "* text": String,
 
                        // Text to html (true = no transformation)
                        "text html": true,
@@ -7605,11 +8889,24 @@ jQuery.extend({
                // and when you create one that shouldn't be
                // deep extended (see ajaxExtend)
                flatOptions: {
-                       context: true,
-                       url: true
+                       url: true,
+                       context: true
                }
        },
 
+       // Creates a full fledged settings object into target
+       // with both ajaxSettings and settings fields.
+       // If target is omitted, writes into ajaxSettings.
+       ajaxSetup: function( target, settings ) {
+               return settings ?
+
+                       // Building a settings object
+                       ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
+
+                       // Extending ajaxSettings
+                       ajaxExtend( jQuery.ajaxSettings, target );
+       },
+
        ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
        ajaxTransport: addToPrefiltersOrTransports( transports ),
 
@@ -7625,34 +8922,34 @@ jQuery.extend({
                // Force options to be an object
                options = options || {};
 
-               var // ifModified key
-                       ifModifiedKey,
-                       // Response headers
+               var // Cross-domain detection vars
+                       parts,
+                       // Loop variable
+                       i,
+                       // URL without anti-cache param
+                       cacheURL,
+                       // Response headers as string
                        responseHeadersString,
-                       responseHeaders,
-                       // transport
-                       transport,
                        // timeout handle
                        timeoutTimer,
-                       // Cross-domain detection vars
-                       parts,
+
                        // To know if global events are to be dispatched
                        fireGlobals,
-                       // Loop variable
-                       i,
+
+                       transport,
+                       // Response headers
+                       responseHeaders,
                        // Create the final options object
                        s = jQuery.ajaxSetup( {}, options ),
                        // Callbacks context
                        callbackContext = s.context || s,
-                       // Context for global events
-                       // It's the callbackContext if one was provided in the options
-                       // and if it's a DOM node or a jQuery collection
-                       globalEventContext = callbackContext !== s &&
-                               ( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
-                                               jQuery( callbackContext ) : jQuery.event,
+                       // Context for global events is callbackContext if it is a DOM node or jQuery collection
+                       globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?
+                               jQuery( callbackContext ) :
+                               jQuery.event,
                        // Deferreds
                        deferred = jQuery.Deferred(),
-                       completeDeferred = jQuery.Callbacks( "once memory" ),
+                       completeDeferred = jQuery.Callbacks("once memory"),
                        // Status-dependent callbacks
                        statusCode = s.statusCode || {},
                        // Headers (they are sent all at once)
@@ -7664,37 +8961,36 @@ jQuery.extend({
                        strAbort = "canceled",
                        // Fake xhr
                        jqXHR = {
-
                                readyState: 0,
 
-                               // Caches the header
-                               setRequestHeader: function( name, value ) {
-                                       if ( !state ) {
-                                               var lname = name.toLowerCase();
-                                               name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
-                                               requestHeaders[ name ] = value;
-                                       }
-                                       return this;
-                               },
-
-                               // Raw string
-                               getAllResponseHeaders: function() {
-                                       return state === 2 ? responseHeadersString : null;
-                               },
-
                                // Builds headers hashtable if needed
                                getResponseHeader: function( key ) {
                                        var match;
                                        if ( state === 2 ) {
                                                if ( !responseHeaders ) {
                                                        responseHeaders = {};
-                                                       while( ( match = rheaders.exec( responseHeadersString ) ) ) {
+                                                       while ( (match = rheaders.exec( responseHeadersString )) ) {
                                                                responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
                                                        }
                                                }
                                                match = responseHeaders[ key.toLowerCase() ];
                                        }
-                                       return match === undefined ? null : match;
+                                       return match == null ? null : match;
+                               },
+
+                               // Raw string
+                               getAllResponseHeaders: function() {
+                                       return state === 2 ? responseHeadersString : null;
+                               },
+
+                               // Caches the header
+                               setRequestHeader: function( name, value ) {
+                                       var lname = name.toLowerCase();
+                                       if ( !state ) {
+                                               name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
+                                               requestHeaders[ name ] = value;
+                                       }
+                                       return this;
                                },
 
                                // Overrides response content-type header
@@ -7705,164 +9001,58 @@ jQuery.extend({
                                        return this;
                                },
 
+                               // Status-dependent callbacks
+                               statusCode: function( map ) {
+                                       var code;
+                                       if ( map ) {
+                                               if ( state < 2 ) {
+                                                       for ( code in map ) {
+                                                               // Lazy-add the new callback in a way that preserves old ones
+                                                               statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
+                                                       }
+                                               } else {
+                                                       // Execute the appropriate callbacks
+                                                       jqXHR.always( map[ jqXHR.status ] );
+                                               }
+                                       }
+                                       return this;
+                               },
+
                                // Cancel the request
                                abort: function( statusText ) {
-                                       statusText = statusText || strAbort;
+                                       var finalText = statusText || strAbort;
                                        if ( transport ) {
-                                               transport.abort( statusText );
+                                               transport.abort( finalText );
                                        }
-                                       done( 0, statusText );
+                                       done( 0, finalText );
                                        return this;
                                }
-                       };
-
-               // Callback for when everything is done
-               // It is defined here because jslint complains if it is declared
-               // at the end of the function (which would be more logical and readable)
-               function done( status, nativeStatusText, responses, headers ) {
-                       var isSuccess, success, error, response, modified,
-                               statusText = nativeStatusText;
-
-                       // Called once
-                       if ( state === 2 ) {
-                               return;
-                       }
-
-                       // State is "done" now
-                       state = 2;
-
-                       // Clear timeout if it exists
-                       if ( timeoutTimer ) {
-                               clearTimeout( timeoutTimer );
-                       }
-
-                       // Dereference transport for early garbage collection
-                       // (no matter how long the jqXHR object will be used)
-                       transport = undefined;
-
-                       // Cache response headers
-                       responseHeadersString = headers || "";
-
-                       // Set readyState
-                       jqXHR.readyState = status > 0 ? 4 : 0;
-
-                       // Get response data
-                       if ( responses ) {
-                               response = ajaxHandleResponses( s, jqXHR, responses );
-                       }
-
-                       // If successful, handle type chaining
-                       if ( status >= 200 && status < 300 || status === 304 ) {
-
-                               // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
-                               if ( s.ifModified ) {
-
-                                       modified = jqXHR.getResponseHeader("Last-Modified");
-                                       if ( modified ) {
-                                               jQuery.lastModified[ ifModifiedKey ] = modified;
-                                       }
-                                       modified = jqXHR.getResponseHeader("Etag");
-                                       if ( modified ) {
-                                               jQuery.etag[ ifModifiedKey ] = modified;
-                                       }
-                               }
-
-                               // If not modified
-                               if ( status === 304 ) {
-
-                                       statusText = "notmodified";
-                                       isSuccess = true;
-
-                               // If we have data
-                               } else {
-
-                                       isSuccess = ajaxConvert( s, response );
-                                       statusText = isSuccess.state;
-                                       success = isSuccess.data;
-                                       error = isSuccess.error;
-                                       isSuccess = !error;
-                               }
-                       } else {
-                               // We extract error from statusText
-                               // then normalize statusText and status for non-aborts
-                               error = statusText;
-                               if ( !statusText || status ) {
-                                       statusText = "error";
-                                       if ( status < 0 ) {
-                                               status = 0;
-                                       }
-                               }
-                       }
-
-                       // Set data for the fake xhr object
-                       jqXHR.status = status;
-                       jqXHR.statusText = ( nativeStatusText || statusText ) + "";
-
-                       // Success/Error
-                       if ( isSuccess ) {
-                               deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
-                       } else {
-                               deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
-                       }
-
-                       // Status-dependent callbacks
-                       jqXHR.statusCode( statusCode );
-                       statusCode = undefined;
-
-                       if ( fireGlobals ) {
-                               globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
-                                               [ jqXHR, s, isSuccess ? success : error ] );
-                       }
-
-                       // Complete
-                       completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
-
-                       if ( fireGlobals ) {
-                               globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
-                               // Handle the global AJAX counter
-                               if ( !( --jQuery.active ) ) {
-                                       jQuery.event.trigger( "ajaxStop" );
-                               }
-                       }
-               }
+                       };
 
                // Attach deferreds
-               deferred.promise( jqXHR );
+               deferred.promise( jqXHR ).complete = completeDeferred.add;
                jqXHR.success = jqXHR.done;
                jqXHR.error = jqXHR.fail;
-               jqXHR.complete = completeDeferred.add;
-
-               // Status-dependent callbacks
-               jqXHR.statusCode = function( map ) {
-                       if ( map ) {
-                               var tmp;
-                               if ( state < 2 ) {
-                                       for ( tmp in map ) {
-                                               statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
-                                       }
-                               } else {
-                                       tmp = map[ jqXHR.status ];
-                                       jqXHR.always( tmp );
-                               }
-                       }
-                       return this;
-               };
 
                // Remove hash character (#7531: and string promotion)
                // Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
+               // Handle falsy url in the settings object (#10093: consistency with old signature)
                // We also use the url parameter if available
-               s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+               s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+               // Alias method option to type as per ticket #12004
+               s.type = options.method || options.type || s.method || s.type;
 
                // Extract dataTypes list
-               s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( core_rspace );
+               s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( rnotwhite ) || [ "" ];
 
                // A cross-domain request is in order when we have a protocol:host:port mismatch
                if ( s.crossDomain == null ) {
                        parts = rurl.exec( s.url.toLowerCase() );
                        s.crossDomain = !!( parts &&
                                ( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
-                                       ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
-                                               ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
+                                       ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? "80" : "443" ) ) !==
+                                               ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? "80" : "443" ) ) )
                        );
                }
 
@@ -7882,58 +9072,58 @@ jQuery.extend({
                // We can fire global events as of now if asked to
                fireGlobals = s.global;
 
+               // Watch for a new set of requests
+               if ( fireGlobals && jQuery.active++ === 0 ) {
+                       jQuery.event.trigger("ajaxStart");
+               }
+
                // Uppercase the type
                s.type = s.type.toUpperCase();
 
                // Determine if request has content
                s.hasContent = !rnoContent.test( s.type );
 
-               // Watch for a new set of requests
-               if ( fireGlobals && jQuery.active++ === 0 ) {
-                       jQuery.event.trigger( "ajaxStart" );
-               }
+               // Save the URL in case we're toying with the If-Modified-Since
+               // and/or If-None-Match header later on
+               cacheURL = s.url;
 
                // More options handling for requests with no content
                if ( !s.hasContent ) {
 
                        // If data is available, append data to url
                        if ( s.data ) {
-                               s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
+                               cacheURL = ( s.url += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
                                // #9682: remove data so that it's not used in an eventual retry
                                delete s.data;
                        }
 
-                       // Get ifModifiedKey before adding the anti-cache parameter
-                       ifModifiedKey = s.url;
-
                        // Add anti-cache in url if needed
                        if ( s.cache === false ) {
+                               s.url = rts.test( cacheURL ) ?
 
-                               var ts = jQuery.now(),
-                                       // try replacing _= if it is there
-                                       ret = s.url.replace( rts, "$1_=" + ts );
+                                       // If there is already a '_' parameter, set its value
+                                       cacheURL.replace( rts, "$1_=" + nonce++ ) :
 
-                               // if nothing was replaced, add timestamp to the end
-                               s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
+                                       // Otherwise add one to the end
+                                       cacheURL + ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + nonce++;
                        }
                }
 
-               // Set the correct header, if data is being sent
-               if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
-                       jqXHR.setRequestHeader( "Content-Type", s.contentType );
-               }
-
                // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
                if ( s.ifModified ) {
-                       ifModifiedKey = ifModifiedKey || s.url;
-                       if ( jQuery.lastModified[ ifModifiedKey ] ) {
-                               jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
+                       if ( jQuery.lastModified[ cacheURL ] ) {
+                               jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
                        }
-                       if ( jQuery.etag[ ifModifiedKey ] ) {
-                               jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
+                       if ( jQuery.etag[ cacheURL ] ) {
+                               jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
                        }
                }
 
+               // Set the correct header, if data is being sent
+               if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+                       jqXHR.setRequestHeader( "Content-Type", s.contentType );
+               }
+
                // Set the Accepts header for the server, depending on the dataType
                jqXHR.setRequestHeader(
                        "Accept",
@@ -7949,9 +9139,8 @@ jQuery.extend({
 
                // Allow custom headers/mimetypes and early abort
                if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
-                               // Abort if not done already and return
-                               return jqXHR.abort();
-
+                       // Abort if not done already and return
+                       return jqXHR.abort();
                }
 
                // aborting is no longer a cancellation
@@ -7970,21 +9159,22 @@ jQuery.extend({
                        done( -1, "No Transport" );
                } else {
                        jqXHR.readyState = 1;
+
                        // Send global event
                        if ( fireGlobals ) {
                                globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
                        }
                        // Timeout
                        if ( s.async && s.timeout > 0 ) {
-                               timeoutTimer = setTimeout( function(){
-                                       jqXHR.abort( "timeout" );
+                               timeoutTimer = setTimeout(function() {
+                                       jqXHR.abort("timeout");
                                }, s.timeout );
                        }
 
                        try {
                                state = 1;
                                transport.send( requestHeaders, done );
-                       } catch (e) {
+                       } catch ( e ) {
                                // Propagate exception as error if not done
                                if ( state < 2 ) {
                                        done( -1, e );
@@ -7995,421 +9185,422 @@ jQuery.extend({
                        }
                }
 
-               return jqXHR;
-       },
-
-       // Counter for holding the number of active queries
-       active: 0,
+               // Callback for when everything is done
+               function done( status, nativeStatusText, responses, headers ) {
+                       var isSuccess, success, error, response, modified,
+                               statusText = nativeStatusText;
 
-       // Last-Modified header cache for next request
-       lastModified: {},
-       etag: {}
+                       // Called once
+                       if ( state === 2 ) {
+                               return;
+                       }
 
-});
+                       // State is "done" now
+                       state = 2;
 
-/* Handles responses to an ajax request:
- * - sets all responseXXX fields accordingly
- * - finds the right dataType (mediates between content-type and expected dataType)
- * - returns the corresponding response
- */
-function ajaxHandleResponses( s, jqXHR, responses ) {
+                       // Clear timeout if it exists
+                       if ( timeoutTimer ) {
+                               clearTimeout( timeoutTimer );
+                       }
 
-       var ct, type, finalDataType, firstDataType,
-               contents = s.contents,
-               dataTypes = s.dataTypes,
-               responseFields = s.responseFields;
+                       // Dereference transport for early garbage collection
+                       // (no matter how long the jqXHR object will be used)
+                       transport = undefined;
 
-       // Fill responseXXX fields
-       for ( type in responseFields ) {
-               if ( type in responses ) {
-                       jqXHR[ responseFields[type] ] = responses[ type ];
-               }
-       }
+                       // Cache response headers
+                       responseHeadersString = headers || "";
 
-       // Remove auto dataType and get content-type in the process
-       while( dataTypes[ 0 ] === "*" ) {
-               dataTypes.shift();
-               if ( ct === undefined ) {
-                       ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
-               }
-       }
+                       // Set readyState
+                       jqXHR.readyState = status > 0 ? 4 : 0;
 
-       // Check if we're dealing with a known content-type
-       if ( ct ) {
-               for ( type in contents ) {
-                       if ( contents[ type ] && contents[ type ].test( ct ) ) {
-                               dataTypes.unshift( type );
-                               break;
-                       }
-               }
-       }
+                       // Determine if successful
+                       isSuccess = status >= 200 && status < 300 || status === 304;
 
-       // Check to see if we have a response for the expected dataType
-       if ( dataTypes[ 0 ] in responses ) {
-               finalDataType = dataTypes[ 0 ];
-       } else {
-               // Try convertible dataTypes
-               for ( type in responses ) {
-                       if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
-                               finalDataType = type;
-                               break;
-                       }
-                       if ( !firstDataType ) {
-                               firstDataType = type;
+                       // Get response data
+                       if ( responses ) {
+                               response = ajaxHandleResponses( s, jqXHR, responses );
                        }
-               }
-               // Or just use first one
-               finalDataType = finalDataType || firstDataType;
-       }
-
-       // If we found a dataType
-       // We add the dataType to the list if needed
-       // and return the corresponding response
-       if ( finalDataType ) {
-               if ( finalDataType !== dataTypes[ 0 ] ) {
-                       dataTypes.unshift( finalDataType );
-               }
-               return responses[ finalDataType ];
-       }
-}
-
-// Chain conversions given the request and the original response
-function ajaxConvert( s, response ) {
 
-       var conv, conv2, current, tmp,
-               // Work with a copy of dataTypes in case we need to modify it for conversion
-               dataTypes = s.dataTypes.slice(),
-               prev = dataTypes[ 0 ],
-               converters = {},
-               i = 0;
+                       // Convert no matter what (that way responseXXX fields are always set)
+                       response = ajaxConvert( s, response, jqXHR, isSuccess );
 
-       // Apply the dataFilter if provided
-       if ( s.dataFilter ) {
-               response = s.dataFilter( response, s.dataType );
-       }
+                       // If successful, handle type chaining
+                       if ( isSuccess ) {
 
-       // Create converters map with lowercased keys
-       if ( dataTypes[ 1 ] ) {
-               for ( conv in s.converters ) {
-                       converters[ conv.toLowerCase() ] = s.converters[ conv ];
-               }
-       }
+                               // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+                               if ( s.ifModified ) {
+                                       modified = jqXHR.getResponseHeader("Last-Modified");
+                                       if ( modified ) {
+                                               jQuery.lastModified[ cacheURL ] = modified;
+                                       }
+                                       modified = jqXHR.getResponseHeader("etag");
+                                       if ( modified ) {
+                                               jQuery.etag[ cacheURL ] = modified;
+                                       }
+                               }
 
-       // Convert to each sequential dataType, tolerating list modification
-       for ( ; (current = dataTypes[++i]); ) {
+                               // if no content
+                               if ( status === 204 || s.type === "HEAD" ) {
+                                       statusText = "nocontent";
 
-               // There's only work to do if current dataType is non-auto
-               if ( current !== "*" ) {
+                               // if not modified
+                               } else if ( status === 304 ) {
+                                       statusText = "notmodified";
 
-                       // Convert response if prev dataType is non-auto and differs from current
-                       if ( prev !== "*" && prev !== current ) {
+                               // If we have data, let's convert it
+                               } else {
+                                       statusText = response.state;
+                                       success = response.data;
+                                       error = response.error;
+                                       isSuccess = !error;
+                               }
+                       } else {
+                               // We extract error from statusText
+                               // then normalize statusText and status for non-aborts
+                               error = statusText;
+                               if ( status || !statusText ) {
+                                       statusText = "error";
+                                       if ( status < 0 ) {
+                                               status = 0;
+                                       }
+                               }
+                       }
 
-                               // Seek a direct converter
-                               conv = converters[ prev + " " + current ] || converters[ "* " + current ];
+                       // Set data for the fake xhr object
+                       jqXHR.status = status;
+                       jqXHR.statusText = ( nativeStatusText || statusText ) + "";
 
-                               // If none found, seek a pair
-                               if ( !conv ) {
-                                       for ( conv2 in converters ) {
+                       // Success/Error
+                       if ( isSuccess ) {
+                               deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+                       } else {
+                               deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+                       }
 
-                                               // If conv2 outputs current
-                                               tmp = conv2.split(" ");
-                                               if ( tmp[ 1 ] === current ) {
+                       // Status-dependent callbacks
+                       jqXHR.statusCode( statusCode );
+                       statusCode = undefined;
 
-                                                       // If prev can be converted to accepted input
-                                                       conv = converters[ prev + " " + tmp[ 0 ] ] ||
-                                                               converters[ "* " + tmp[ 0 ] ];
-                                                       if ( conv ) {
-                                                               // Condense equivalence converters
-                                                               if ( conv === true ) {
-                                                                       conv = converters[ conv2 ];
+                       if ( fireGlobals ) {
+                               globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
+                                       [ jqXHR, s, isSuccess ? success : error ] );
+                       }
 
-                                                               // Otherwise, insert the intermediate dataType
-                                                               } else if ( converters[ conv2 ] !== true ) {
-                                                                       current = tmp[ 0 ];
-                                                                       dataTypes.splice( i--, 0, current );
-                                                               }
+                       // Complete
+                       completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
 
-                                                               break;
-                                                       }
-                                               }
-                                       }
+                       if ( fireGlobals ) {
+                               globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+                               // Handle the global AJAX counter
+                               if ( !( --jQuery.active ) ) {
+                                       jQuery.event.trigger("ajaxStop");
                                }
+                       }
+               }
 
-                               // Apply converter (if not an equivalence)
-                               if ( conv !== true ) {
+               return jqXHR;
+       },
 
-                                       // Unless errors are allowed to bubble, catch and return them
-                                       if ( conv && s["throws"] ) {
-                                               response = conv( response );
-                                       } else {
-                                               try {
-                                                       response = conv( response );
-                                               } catch ( e ) {
-                                                       return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
-                                               }
-                                       }
-                               }
-                       }
+       getJSON: function( url, data, callback ) {
+               return jQuery.get( url, data, callback, "json" );
+       },
 
-                       // Update prev for next iteration
-                       prev = current;
-               }
+       getScript: function( url, callback ) {
+               return jQuery.get( url, undefined, callback, "script" );
        }
+});
 
-       return { state: "success", data: response };
-}
-var oldCallbacks = [],
-       rquestion = /\?/,
-       rjsonp = /(=)\?(?=&|$)|\?\?/,
-       nonce = jQuery.now();
+jQuery.each( [ "get", "post" ], function( i, method ) {
+       jQuery[ method ] = function( url, data, callback, type ) {
+               // shift arguments if data argument was omitted
+               if ( jQuery.isFunction( data ) ) {
+                       type = type || callback;
+                       callback = data;
+                       data = undefined;
+               }
 
-// Default jsonp settings
-jQuery.ajaxSetup({
-       jsonp: "callback",
-       jsonpCallback: function() {
-               var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
-               this[ callback ] = true;
-               return callback;
-       }
+               return jQuery.ajax({
+                       url: url,
+                       type: method,
+                       dataType: type,
+                       data: data,
+                       success: callback
+               });
+       };
+});
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ) {
+       jQuery.fn[ type ] = function( fn ) {
+               return this.on( type, fn );
+       };
 });
 
-// Detect, normalize options and install callbacks for jsonp requests
-jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
 
-       var callbackName, overwritten, responseContainer,
-               data = s.data,
-               url = s.url,
-               hasCallback = s.jsonp !== false,
-               replaceInUrl = hasCallback && rjsonp.test( url ),
-               replaceInData = hasCallback && !replaceInUrl && typeof data === "string" &&
-                       !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") &&
-                       rjsonp.test( data );
+jQuery._evalUrl = function( url ) {
+       return jQuery.ajax({
+               url: url,
+               type: "GET",
+               dataType: "script",
+               async: false,
+               global: false,
+               "throws": true
+       });
+};
+
+
+jQuery.fn.extend({
+       wrapAll: function( html ) {
+               if ( jQuery.isFunction( html ) ) {
+                       return this.each(function(i) {
+                               jQuery(this).wrapAll( html.call(this, i) );
+                       });
+               }
+
+               if ( this[0] ) {
+                       // The elements to wrap the target around
+                       var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
+
+                       if ( this[0].parentNode ) {
+                               wrap.insertBefore( this[0] );
+                       }
 
-       // Handle iff the expected data type is "jsonp" or we have a parameter to set
-       if ( s.dataTypes[ 0 ] === "jsonp" || replaceInUrl || replaceInData ) {
+                       wrap.map(function() {
+                               var elem = this;
 
-               // Get callback name, remembering preexisting value associated with it
-               callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
-                       s.jsonpCallback() :
-                       s.jsonpCallback;
-               overwritten = window[ callbackName ];
+                               while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
+                                       elem = elem.firstChild;
+                               }
 
-               // Insert callback into url or form data
-               if ( replaceInUrl ) {
-                       s.url = url.replace( rjsonp, "$1" + callbackName );
-               } else if ( replaceInData ) {
-                       s.data = data.replace( rjsonp, "$1" + callbackName );
-               } else if ( hasCallback ) {
-                       s.url += ( rquestion.test( url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
+                               return elem;
+                       }).append( this );
                }
 
-               // Use data converter to retrieve json after script execution
-               s.converters["script json"] = function() {
-                       if ( !responseContainer ) {
-                               jQuery.error( callbackName + " was not called" );
-                       }
-                       return responseContainer[ 0 ];
-               };
-
-               // force json dataType
-               s.dataTypes[ 0 ] = "json";
+               return this;
+       },
 
-               // Install callback
-               window[ callbackName ] = function() {
-                       responseContainer = arguments;
-               };
+       wrapInner: function( html ) {
+               if ( jQuery.isFunction( html ) ) {
+                       return this.each(function(i) {
+                               jQuery(this).wrapInner( html.call(this, i) );
+                       });
+               }
 
-               // Clean-up function (fires after converters)
-               jqXHR.always(function() {
-                       // Restore preexisting value
-                       window[ callbackName ] = overwritten;
+               return this.each(function() {
+                       var self = jQuery( this ),
+                               contents = self.contents();
 
-                       // Save back as free
-                       if ( s[ callbackName ] ) {
-                               // make sure that re-using the options doesn't screw things around
-                               s.jsonpCallback = originalSettings.jsonpCallback;
+                       if ( contents.length ) {
+                               contents.wrapAll( html );
 
-                               // save the callback name for future use
-                               oldCallbacks.push( callbackName );
+                       } else {
+                               self.append( html );
                        }
+               });
+       },
 
-                       // Call if it was a function and we have a response
-                       if ( responseContainer && jQuery.isFunction( overwritten ) ) {
-                               overwritten( responseContainer[ 0 ] );
-                       }
+       wrap: function( html ) {
+               var isFunction = jQuery.isFunction( html );
 
-                       responseContainer = overwritten = undefined;
+               return this.each(function(i) {
+                       jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
                });
-
-               // Delegate to script
-               return "script";
-       }
-});
-// Install script dataType
-jQuery.ajaxSetup({
-       accepts: {
-               script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
-       },
-       contents: {
-               script: /javascript|ecmascript/
        },
-       converters: {
-               "text script": function( text ) {
-                       jQuery.globalEval( text );
-                       return text;
-               }
-       }
-});
 
-// Handle cache's special case and global
-jQuery.ajaxPrefilter( "script", function( s ) {
-       if ( s.cache === undefined ) {
-               s.cache = false;
-       }
-       if ( s.crossDomain ) {
-               s.type = "GET";
-               s.global = false;
+       unwrap: function() {
+               return this.parent().each(function() {
+                       if ( !jQuery.nodeName( this, "body" ) ) {
+                               jQuery( this ).replaceWith( this.childNodes );
+                       }
+               }).end();
        }
 });
 
-// Bind script tag hack transport
-jQuery.ajaxTransport( "script", function(s) {
 
-       // This transport only deals with cross domain requests
-       if ( s.crossDomain ) {
+jQuery.expr.filters.hidden = function( elem ) {
+       // Support: Opera <= 12.12
+       // Opera reports offsetWidths and offsetHeights less than zero on some elements
+       return elem.offsetWidth <= 0 && elem.offsetHeight <= 0 ||
+               (!support.reliableHiddenOffsets() &&
+                       ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
+};
 
-               var script,
-                       head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
+jQuery.expr.filters.visible = function( elem ) {
+       return !jQuery.expr.filters.hidden( elem );
+};
 
-               return {
 
-                       send: function( _, callback ) {
 
-                               script = document.createElement( "script" );
 
-                               script.async = "async";
+var r20 = /%20/g,
+       rbracket = /\[\]$/,
+       rCRLF = /\r?\n/g,
+       rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
+       rsubmittable = /^(?:input|select|textarea|keygen)/i;
 
-                               if ( s.scriptCharset ) {
-                                       script.charset = s.scriptCharset;
-                               }
+function buildParams( prefix, obj, traditional, add ) {
+       var name;
 
-                               script.src = s.url;
+       if ( jQuery.isArray( obj ) ) {
+               // Serialize array item.
+               jQuery.each( obj, function( i, v ) {
+                       if ( traditional || rbracket.test( prefix ) ) {
+                               // Treat each array item as a scalar.
+                               add( prefix, v );
 
-                               // Attach handlers for all browsers
-                               script.onload = script.onreadystatechange = function( _, isAbort ) {
+                       } else {
+                               // Item is non-scalar (array or object), encode its numeric index.
+                               buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
+                       }
+               });
 
-                                       if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
+       } else if ( !traditional && jQuery.type( obj ) === "object" ) {
+               // Serialize object item.
+               for ( name in obj ) {
+                       buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+               }
 
-                                               // Handle memory leak in IE
-                                               script.onload = script.onreadystatechange = null;
+       } else {
+               // Serialize scalar item.
+               add( prefix, obj );
+       }
+}
 
-                                               // Remove the script
-                                               if ( head && script.parentNode ) {
-                                                       head.removeChild( script );
-                                               }
+// Serialize an array of form elements or a set of
+// key/values into a query string
+jQuery.param = function( a, traditional ) {
+       var prefix,
+               s = [],
+               add = function( key, value ) {
+                       // If value is a function, invoke it and return its value
+                       value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
+                       s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+               };
 
-                                               // Dereference the script
-                                               script = undefined;
+       // Set traditional to true for jQuery <= 1.3.2 behavior.
+       if ( traditional === undefined ) {
+               traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
+       }
 
-                                               // Callback if not abort
-                                               if ( !isAbort ) {
-                                                       callback( 200, "success" );
-                                               }
-                                       }
-                               };
-                               // Use insertBefore instead of appendChild  to circumvent an IE6 bug.
-                               // This arises when a base node is used (#2709 and #4378).
-                               head.insertBefore( script, head.firstChild );
-                       },
+       // If an array was passed in, assume that it is an array of form elements.
+       if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+               // Serialize the form elements
+               jQuery.each( a, function() {
+                       add( this.name, this.value );
+               });
 
-                       abort: function() {
-                               if ( script ) {
-                                       script.onload( 0, 1 );
-                               }
-                       }
-               };
-       }
-});
-var xhrCallbacks,
-       // #5280: Internet Explorer will keep connections alive if we don't abort on unload
-       xhrOnUnloadAbort = window.ActiveXObject ? function() {
-               // Abort all pending requests
-               for ( var key in xhrCallbacks ) {
-                       xhrCallbacks[ key ]( 0, 1 );
+       } else {
+               // If traditional, encode the "old" way (the way 1.3.2 or older
+               // did it), otherwise encode params recursively.
+               for ( prefix in a ) {
+                       buildParams( prefix, a[ prefix ], traditional, add );
                }
-       } : false,
-       xhrId = 0;
+       }
 
-// Functions to create xhrs
-function createStandardXHR() {
-       try {
-               return new window.XMLHttpRequest();
-       } catch( e ) {}
-}
+       // Return the resulting serialization
+       return s.join( "&" ).replace( r20, "+" );
+};
+
+jQuery.fn.extend({
+       serialize: function() {
+               return jQuery.param( this.serializeArray() );
+       },
+       serializeArray: function() {
+               return this.map(function() {
+                       // Can add propHook for "elements" to filter or add form elements
+                       var elements = jQuery.prop( this, "elements" );
+                       return elements ? jQuery.makeArray( elements ) : this;
+               })
+               .filter(function() {
+                       var type = this.type;
+                       // Use .is(":disabled") so that fieldset[disabled] works
+                       return this.name && !jQuery( this ).is( ":disabled" ) &&
+                               rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
+                               ( this.checked || !rcheckableType.test( type ) );
+               })
+               .map(function( i, elem ) {
+                       var val = jQuery( this ).val();
+
+                       return val == null ?
+                               null :
+                               jQuery.isArray( val ) ?
+                                       jQuery.map( val, function( val ) {
+                                               return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+                                       }) :
+                                       { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+               }).get();
+       }
+});
 
-function createActiveXHR() {
-       try {
-               return new window.ActiveXObject( "Microsoft.XMLHTTP" );
-       } catch( e ) {}
-}
 
 // Create the request object
 // (This is still attached to ajaxSettings for backward compatibility)
-jQuery.ajaxSettings.xhr = window.ActiveXObject ?
-       /* Microsoft failed to properly
-        * implement the XMLHttpRequest in IE7 (can't request local files),
-        * so we use the ActiveXObject when it is available
-        * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
-        * we need a fallback.
-        */
+jQuery.ajaxSettings.xhr = window.ActiveXObject !== undefined ?
+       // Support: IE6+
        function() {
-               return !this.isLocal && createStandardXHR() || createActiveXHR();
+
+               // XHR cannot access local files, always use ActiveX for that case
+               return !this.isLocal &&
+
+                       // Support: IE7-8
+                       // oldIE XHR does not support non-RFC2616 methods (#13240)
+                       // See http://msdn.microsoft.com/en-us/library/ie/ms536648(v=vs.85).aspx
+                       // and http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9
+                       // Although this check for six methods instead of eight
+                       // since IE also does not support "trace" and "connect"
+                       /^(get|post|head|put|delete|options)$/i.test( this.type ) &&
+
+                       createStandardXHR() || createActiveXHR();
        } :
        // For all other browsers, use the standard XMLHttpRequest object
        createStandardXHR;
 
-// Determine support properties
-(function( xhr ) {
-       jQuery.extend( jQuery.support, {
-               ajax: !!xhr,
-               cors: !!xhr && ( "withCredentials" in xhr )
+var xhrId = 0,
+       xhrCallbacks = {},
+       xhrSupported = jQuery.ajaxSettings.xhr();
+
+// Support: IE<10
+// Open requests must be manually aborted on unload (#5280)
+if ( window.ActiveXObject ) {
+       jQuery( window ).on( "unload", function() {
+               for ( var key in xhrCallbacks ) {
+                       xhrCallbacks[ key ]( undefined, true );
+               }
        });
-})( jQuery.ajaxSettings.xhr() );
+}
+
+// Determine support properties
+support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
+xhrSupported = support.ajax = !!xhrSupported;
 
 // Create transport if the browser can provide an xhr
-if ( jQuery.support.ajax ) {
+if ( xhrSupported ) {
 
-       jQuery.ajaxTransport(function( s ) {
+       jQuery.ajaxTransport(function( options ) {
                // Cross domain only allowed if supported through XMLHttpRequest
-               if ( !s.crossDomain || jQuery.support.cors ) {
+               if ( !options.crossDomain || support.cors ) {
 
                        var callback;
 
                        return {
                                send: function( headers, complete ) {
-
-                                       // Get a new xhr
-                                       var handle, i,
-                                               xhr = s.xhr();
+                                       var i,
+                                               xhr = options.xhr(),
+                                               id = ++xhrId;
 
                                        // Open the socket
-                                       // Passing null username, generates a login popup on Opera (#2865)
-                                       if ( s.username ) {
-                                               xhr.open( s.type, s.url, s.async, s.username, s.password );
-                                       } else {
-                                               xhr.open( s.type, s.url, s.async );
-                                       }
+                                       xhr.open( options.type, options.url, options.async, options.username, options.password );
 
                                        // Apply custom fields if provided
-                                       if ( s.xhrFields ) {
-                                               for ( i in s.xhrFields ) {
-                                                       xhr[ i ] = s.xhrFields[ i ];
+                                       if ( options.xhrFields ) {
+                                               for ( i in options.xhrFields ) {
+                                                       xhr[ i ] = options.xhrFields[ i ];
                                                }
                                        }
 
                                        // Override mime type if needed
-                                       if ( s.mimeType && xhr.overrideMimeType ) {
-                                               xhr.overrideMimeType( s.mimeType );
+                                       if ( options.mimeType && xhr.overrideMimeType ) {
+                                               xhr.overrideMimeType( options.mimeType );
                                        }
 
                                        // X-Requested-With header
@@ -8417,888 +9608,434 @@ if ( jQuery.support.ajax ) {
                                        // akin to a jigsaw puzzle, we simply never set it to be sure.
                                        // (it can always be set on a per-request basis or even using ajaxSetup)
                                        // For same-domain requests, won't change header if already provided.
-                                       if ( !s.crossDomain && !headers["X-Requested-With"] ) {
-                                               headers[ "X-Requested-With" ] = "XMLHttpRequest";
+                                       if ( !options.crossDomain && !headers["X-Requested-With"] ) {
+                                               headers["X-Requested-With"] = "XMLHttpRequest";
                                        }
 
-                                       // Need an extra try/catch for cross domain requests in Firefox 3
-                                       try {
-                                               for ( i in headers ) {
-                                                       xhr.setRequestHeader( i, headers[ i ] );
+                                       // Set headers
+                                       for ( i in headers ) {
+                                               // Support: IE<9
+                                               // IE's ActiveXObject throws a 'Type Mismatch' exception when setting
+                                               // request header to a null-value.
+                                               //
+                                               // To keep consistent with other XHR implementations, cast the value
+                                               // to string and ignore `undefined`.
+                                               if ( headers[ i ] !== undefined ) {
+                                                       xhr.setRequestHeader( i, headers[ i ] + "" );
                                                }
-                                       } catch( _ ) {}
+                                       }
 
                                        // Do send the request
                                        // This may raise an exception which is actually
                                        // handled in jQuery.ajax (so no try/catch here)
-                                       xhr.send( ( s.hasContent && s.data ) || null );
+                                       xhr.send( ( options.hasContent && options.data ) || null );
 
                                        // Listener
                                        callback = function( _, isAbort ) {
-
-                                               var status,
-                                                       statusText,
-                                                       responseHeaders,
-                                                       responses,
-                                                       xml;
-
-                                               // Firefox throws exceptions when accessing properties
-                                               // of an xhr when a network error occurred
-                                               // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
-                                               try {
-
-                                                       // Was never called and is aborted or complete
-                                                       if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
-
-                                                               // Only called once
-                                                               callback = undefined;
-
-                                                               // Do not keep as active anymore
-                                                               if ( handle ) {
-                                                                       xhr.onreadystatechange = jQuery.noop;
-                                                                       if ( xhrOnUnloadAbort ) {
-                                                                               delete xhrCallbacks[ handle ];
-                                                                       }
+                                               var status, statusText, responses;
+
+                                               // Was never called and is aborted or complete
+                                               if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
+                                                       // Clean up
+                                                       delete xhrCallbacks[ id ];
+                                                       callback = undefined;
+                                                       xhr.onreadystatechange = jQuery.noop;
+
+                                                       // Abort manually if needed
+                                                       if ( isAbort ) {
+                                                               if ( xhr.readyState !== 4 ) {
+                                                                       xhr.abort();
+                                                               }
+                                                       } else {
+                                                               responses = {};
+                                                               status = xhr.status;
+
+                                                               // Support: IE<10
+                                                               // Accessing binary-data responseText throws an exception
+                                                               // (#11426)
+                                                               if ( typeof xhr.responseText === "string" ) {
+                                                                       responses.text = xhr.responseText;
                                                                }
 
-                                                               // If it's an abort
-                                                               if ( isAbort ) {
-                                                                       // Abort it manually if needed
-                                                                       if ( xhr.readyState !== 4 ) {
-                                                                               xhr.abort();
-                                                                       }
-                                                               } else {
-                                                                       status = xhr.status;
-                                                                       responseHeaders = xhr.getAllResponseHeaders();
-                                                                       responses = {};
-                                                                       xml = xhr.responseXML;
-
-                                                                       // Construct response list
-                                                                       if ( xml && xml.documentElement /* #4958 */ ) {
-                                                                               responses.xml = xml;
-                                                                       }
-
-                                                                       // When requesting binary data, IE6-9 will throw an exception
-                                                                       // on any attempt to access responseText (#11426)
-                                                                       try {
-                                                                               responses.text = xhr.responseText;
-                                                                       } catch( e ) {
-                                                                       }
-
-                                                                       // Firefox throws an exception when accessing
-                                                                       // statusText for faulty cross-domain requests
-                                                                       try {
-                                                                               statusText = xhr.statusText;
-                                                                       } catch( e ) {
-                                                                               // We normalize with Webkit giving an empty statusText
-                                                                               statusText = "";
-                                                                       }
+                                                               // Firefox throws an exception when accessing
+                                                               // statusText for faulty cross-domain requests
+                                                               try {
+                                                                       statusText = xhr.statusText;
+                                                               } catch( e ) {
+                                                                       // We normalize with Webkit giving an empty statusText
+                                                                       statusText = "";
+                                                               }
 
-                                                                       // Filter status for non standard behaviors
+                                                               // Filter status for non standard behaviors
 
-                                                                       // If the request is local and we have data: assume a success
-                                                                       // (success with no data won't get notified, that's the best we
-                                                                       // can do given current implementations)
-                                                                       if ( !status && s.isLocal && !s.crossDomain ) {
-                                                                               status = responses.text ? 200 : 404;
-                                                                       // IE - #1450: sometimes returns 1223 when it should be 204
-                                                                       } else if ( status === 1223 ) {
-                                                                               status = 204;
-                                                                       }
+                                                               // If the request is local and we have data: assume a success
+                                                               // (success with no data won't get notified, that's the best we
+                                                               // can do given current implementations)
+                                                               if ( !status && options.isLocal && !options.crossDomain ) {
+                                                                       status = responses.text ? 200 : 404;
+                                                               // IE - #1450: sometimes returns 1223 when it should be 204
+                                                               } else if ( status === 1223 ) {
+                                                                       status = 204;
                                                                }
                                                        }
-                                               } catch( firefoxAccessException ) {
-                                                       if ( !isAbort ) {
-                                                               complete( -1, firefoxAccessException );
-                                                       }
                                                }
 
                                                // Call complete if needed
                                                if ( responses ) {
-                                                       complete( status, statusText, responses, responseHeaders );
+                                                       complete( status, statusText, responses, xhr.getAllResponseHeaders() );
                                                }
                                        };
 
-                                       if ( !s.async ) {
+                                       if ( !options.async ) {
                                                // if we're in sync mode we fire the callback
                                                callback();
                                        } else if ( xhr.readyState === 4 ) {
                                                // (IE6 & IE7) if it's in cache and has been
                                                // retrieved directly we need to fire the callback
-                                               setTimeout( callback, 0 );
+                                               setTimeout( callback );
                                        } else {
-                                               handle = ++xhrId;
-                                               if ( xhrOnUnloadAbort ) {
-                                                       // Create the active xhrs callbacks list if needed
-                                                       // and attach the unload handler
-                                                       if ( !xhrCallbacks ) {
-                                                               xhrCallbacks = {};
-                                                               jQuery( window ).unload( xhrOnUnloadAbort );
-                                                       }
-                                                       // Add to list of active xhrs callbacks
-                                                       xhrCallbacks[ handle ] = callback;
-                                               }
-                                               xhr.onreadystatechange = callback;
+                                               // Add to the list of active xhr callbacks
+                                               xhr.onreadystatechange = xhrCallbacks[ id ] = callback;
                                        }
                                },
 
                                abort: function() {
                                        if ( callback ) {
-                                               callback(0,1);
+                                               callback( undefined, true );
                                        }
                                }
                        };
                }
        });
 }
-var fxNow, timerId,
-       rfxtypes = /^(?:toggle|show|hide)$/,
-       rfxnum = new RegExp( "^(?:([-+])=|)(" + core_pnum + ")([a-z%]*)$", "i" ),
-       rrun = /queueHooks$/,
-       animationPrefilters = [ defaultPrefilter ],
-       tweeners = {
-               "*": [function( prop, value ) {
-                       var end, unit,
-                               tween = this.createTween( prop, value ),
-                               parts = rfxnum.exec( value ),
-                               target = tween.cur(),
-                               start = +target || 0,
-                               scale = 1,
-                               maxIterations = 20;
-
-                       if ( parts ) {
-                               end = +parts[2];
-                               unit = parts[3] || ( jQuery.cssNumber[ prop ] ? "" : "px" );
-
-                               // We need to compute starting value
-                               if ( unit !== "px" && start ) {
-                                       // Iteratively approximate from a nonzero starting point
-                                       // Prefer the current property, because this process will be trivial if it uses the same units
-                                       // Fallback to end or a simple constant
-                                       start = jQuery.css( tween.elem, prop, true ) || end || 1;
-
-                                       do {
-                                               // If previous iteration zeroed out, double until we get *something*
-                                               // Use a string for doubling factor so we don't accidentally see scale as unchanged below
-                                               scale = scale || ".5";
-
-                                               // Adjust and apply
-                                               start = start / scale;
-                                               jQuery.style( tween.elem, prop, start + unit );
-
-                                       // Update scale, tolerating zero or NaN from tween.cur()
-                                       // And breaking the loop if scale is unchanged or perfect, or if we've just had enough
-                                       } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
-                               }
-
-                               tween.unit = unit;
-                               tween.start = start;
-                               // If a +=/-= token was provided, we're doing a relative animation
-                               tween.end = parts[1] ? start + ( parts[1] + 1 ) * end : end;
-                       }
-                       return tween;
-               }]
-       };
-
-// Animations created synchronously will run synchronously
-function createFxNow() {
-       setTimeout(function() {
-               fxNow = undefined;
-       }, 0 );
-       return ( fxNow = jQuery.now() );
-}
-
-function createTweens( animation, props ) {
-       jQuery.each( props, function( prop, value ) {
-               var collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
-                       index = 0,
-                       length = collection.length;
-               for ( ; index < length; index++ ) {
-                       if ( collection[ index ].call( animation, prop, value ) ) {
-
-                               // we're done with this property
-                               return;
-                       }
-               }
-       });
-}
-
-function Animation( elem, properties, options ) {
-       var result,
-               index = 0,
-               tweenerIndex = 0,
-               length = animationPrefilters.length,
-               deferred = jQuery.Deferred().always( function() {
-                       // don't match elem in the :animated selector
-                       delete tick.elem;
-               }),
-               tick = function() {
-                       var currentTime = fxNow || createFxNow(),
-                               remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
-                               // archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
-                               temp = remaining / animation.duration || 0,
-                               percent = 1 - temp,
-                               index = 0,
-                               length = animation.tweens.length;
-
-                       for ( ; index < length ; index++ ) {
-                               animation.tweens[ index ].run( percent );
-                       }
-
-                       deferred.notifyWith( elem, [ animation, percent, remaining ]);
-
-                       if ( percent < 1 && length ) {
-                               return remaining;
-                       } else {
-                               deferred.resolveWith( elem, [ animation ] );
-                               return false;
-                       }
-               },
-               animation = deferred.promise({
-                       elem: elem,
-                       props: jQuery.extend( {}, properties ),
-                       opts: jQuery.extend( true, { specialEasing: {} }, options ),
-                       originalProperties: properties,
-                       originalOptions: options,
-                       startTime: fxNow || createFxNow(),
-                       duration: options.duration,
-                       tweens: [],
-                       createTween: function( prop, end, easing ) {
-                               var tween = jQuery.Tween( elem, animation.opts, prop, end,
-                                               animation.opts.specialEasing[ prop ] || animation.opts.easing );
-                               animation.tweens.push( tween );
-                               return tween;
-                       },
-                       stop: function( gotoEnd ) {
-                               var index = 0,
-                                       // if we are going to the end, we want to run all the tweens
-                                       // otherwise we skip this part
-                                       length = gotoEnd ? animation.tweens.length : 0;
-
-                               for ( ; index < length ; index++ ) {
-                                       animation.tweens[ index ].run( 1 );
-                               }
-
-                               // resolve when we played the last frame
-                               // otherwise, reject
-                               if ( gotoEnd ) {
-                                       deferred.resolveWith( elem, [ animation, gotoEnd ] );
-                               } else {
-                                       deferred.rejectWith( elem, [ animation, gotoEnd ] );
-                               }
-                               return this;
-                       }
-               }),
-               props = animation.props;
-
-       propFilter( props, animation.opts.specialEasing );
-
-       for ( ; index < length ; index++ ) {
-               result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
-               if ( result ) {
-                       return result;
-               }
-       }
-
-       createTweens( animation, props );
-
-       if ( jQuery.isFunction( animation.opts.start ) ) {
-               animation.opts.start.call( elem, animation );
-       }
-
-       jQuery.fx.timer(
-               jQuery.extend( tick, {
-                       anim: animation,
-                       queue: animation.opts.queue,
-                       elem: elem
-               })
-       );
 
-       // attach callbacks from options
-       return animation.progress( animation.opts.progress )
-               .done( animation.opts.done, animation.opts.complete )
-               .fail( animation.opts.fail )
-               .always( animation.opts.always );
+// Functions to create xhrs
+function createStandardXHR() {
+       try {
+               return new window.XMLHttpRequest();
+       } catch( e ) {}
 }
 
-function propFilter( props, specialEasing ) {
-       var index, name, easing, value, hooks;
-
-       // camelCase, specialEasing and expand cssHook pass
-       for ( index in props ) {
-               name = jQuery.camelCase( index );
-               easing = specialEasing[ name ];
-               value = props[ index ];
-               if ( jQuery.isArray( value ) ) {
-                       easing = value[ 1 ];
-                       value = props[ index ] = value[ 0 ];
-               }
-
-               if ( index !== name ) {
-                       props[ name ] = value;
-                       delete props[ index ];
-               }
-
-               hooks = jQuery.cssHooks[ name ];
-               if ( hooks && "expand" in hooks ) {
-                       value = hooks.expand( value );
-                       delete props[ name ];
-
-                       // not quite $.extend, this wont overwrite keys already present.
-                       // also - reusing 'index' from above because we have the correct "name"
-                       for ( index in value ) {
-                               if ( !( index in props ) ) {
-                                       props[ index ] = value[ index ];
-                                       specialEasing[ index ] = easing;
-                               }
-                       }
-               } else {
-                       specialEasing[ name ] = easing;
-               }
-       }
+function createActiveXHR() {
+       try {
+               return new window.ActiveXObject( "Microsoft.XMLHTTP" );
+       } catch( e ) {}
 }
 
-jQuery.Animation = jQuery.extend( Animation, {
 
-       tweener: function( props, callback ) {
-               if ( jQuery.isFunction( props ) ) {
-                       callback = props;
-                       props = [ "*" ];
-               } else {
-                       props = props.split(" ");
-               }
 
-               var prop,
-                       index = 0,
-                       length = props.length;
 
-               for ( ; index < length ; index++ ) {
-                       prop = props[ index ];
-                       tweeners[ prop ] = tweeners[ prop ] || [];
-                       tweeners[ prop ].unshift( callback );
-               }
+// Install script dataType
+jQuery.ajaxSetup({
+       accepts: {
+               script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
        },
-
-       prefilter: function( callback, prepend ) {
-               if ( prepend ) {
-                       animationPrefilters.unshift( callback );
-               } else {
-                       animationPrefilters.push( callback );
-               }
-       }
-});
-
-function defaultPrefilter( elem, props, opts ) {
-       var index, prop, value, length, dataShow, toggle, tween, hooks, oldfire,
-               anim = this,
-               style = elem.style,
-               orig = {},
-               handled = [],
-               hidden = elem.nodeType && isHidden( elem );
-
-       // handle queue: false promises
-       if ( !opts.queue ) {
-               hooks = jQuery._queueHooks( elem, "fx" );
-               if ( hooks.unqueued == null ) {
-                       hooks.unqueued = 0;
-                       oldfire = hooks.empty.fire;
-                       hooks.empty.fire = function() {
-                               if ( !hooks.unqueued ) {
-                                       oldfire();
-                               }
-                       };
-               }
-               hooks.unqueued++;
-
-               anim.always(function() {
-                       // doing this makes sure that the complete handler will be called
-                       // before this completes
-                       anim.always(function() {
-                               hooks.unqueued--;
-                               if ( !jQuery.queue( elem, "fx" ).length ) {
-                                       hooks.empty.fire();
-                               }
-                       });
-               });
-       }
-
-       // height/width overflow pass
-       if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
-               // Make sure that nothing sneaks out
-               // Record all 3 overflow attributes because IE does not
-               // change the overflow attribute when overflowX and
-               // overflowY are set to the same value
-               opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
-
-               // Set display property to inline-block for height/width
-               // animations on inline elements that are having width/height animated
-               if ( jQuery.css( elem, "display" ) === "inline" &&
-                               jQuery.css( elem, "float" ) === "none" ) {
-
-                       // inline-level elements accept inline-block;
-                       // block-level elements need to be inline with layout
-                       if ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === "inline" ) {
-                               style.display = "inline-block";
-
-                       } else {
-                               style.zoom = 1;
-                       }
+       contents: {
+               script: /(?:java|ecma)script/
+       },
+       converters: {
+               "text script": function( text ) {
+                       jQuery.globalEval( text );
+                       return text;
                }
        }
+});
 
-       if ( opts.overflow ) {
-               style.overflow = "hidden";
-               if ( !jQuery.support.shrinkWrapBlocks ) {
-                       anim.done(function() {
-                               style.overflow = opts.overflow[ 0 ];
-                               style.overflowX = opts.overflow[ 1 ];
-                               style.overflowY = opts.overflow[ 2 ];
-                       });
-               }
+// Handle cache's special case and global
+jQuery.ajaxPrefilter( "script", function( s ) {
+       if ( s.cache === undefined ) {
+               s.cache = false;
        }
+       if ( s.crossDomain ) {
+               s.type = "GET";
+               s.global = false;
+       }
+});
 
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function(s) {
 
-       // show/hide pass
-       for ( index in props ) {
-               value = props[ index ];
-               if ( rfxtypes.exec( value ) ) {
-                       delete props[ index ];
-                       toggle = toggle || value === "toggle";
-                       if ( value === ( hidden ? "hide" : "show" ) ) {
-                               continue;
-                       }
-                       handled.push( index );
-               }
-       }
+       // This transport only deals with cross domain requests
+       if ( s.crossDomain ) {
 
-       length = handled.length;
-       if ( length ) {
-               dataShow = jQuery._data( elem, "fxshow" ) || jQuery._data( elem, "fxshow", {} );
-               if ( "hidden" in dataShow ) {
-                       hidden = dataShow.hidden;
-               }
+               var script,
+                       head = document.head || jQuery("head")[0] || document.documentElement;
 
-               // store state if its toggle - enables .stop().toggle() to "reverse"
-               if ( toggle ) {
-                       dataShow.hidden = !hidden;
-               }
-               if ( hidden ) {
-                       jQuery( elem ).show();
-               } else {
-                       anim.done(function() {
-                               jQuery( elem ).hide();
-                       });
-               }
-               anim.done(function() {
-                       var prop;
-                       jQuery.removeData( elem, "fxshow", true );
-                       for ( prop in orig ) {
-                               jQuery.style( elem, prop, orig[ prop ] );
-                       }
-               });
-               for ( index = 0 ; index < length ; index++ ) {
-                       prop = handled[ index ];
-                       tween = anim.createTween( prop, hidden ? dataShow[ prop ] : 0 );
-                       orig[ prop ] = dataShow[ prop ] || jQuery.style( elem, prop );
+               return {
 
-                       if ( !( prop in dataShow ) ) {
-                               dataShow[ prop ] = tween.start;
-                               if ( hidden ) {
-                                       tween.end = tween.start;
-                                       tween.start = prop === "width" || prop === "height" ? 1 : 0;
-                               }
-                       }
-               }
-       }
-}
+                       send: function( _, callback ) {
 
-function Tween( elem, options, prop, end, easing ) {
-       return new Tween.prototype.init( elem, options, prop, end, easing );
-}
-jQuery.Tween = Tween;
+                               script = document.createElement("script");
 
-Tween.prototype = {
-       constructor: Tween,
-       init: function( elem, options, prop, end, easing, unit ) {
-               this.elem = elem;
-               this.prop = prop;
-               this.easing = easing || "swing";
-               this.options = options;
-               this.start = this.now = this.cur();
-               this.end = end;
-               this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
-       },
-       cur: function() {
-               var hooks = Tween.propHooks[ this.prop ];
+                               script.async = true;
 
-               return hooks && hooks.get ?
-                       hooks.get( this ) :
-                       Tween.propHooks._default.get( this );
-       },
-       run: function( percent ) {
-               var eased,
-                       hooks = Tween.propHooks[ this.prop ];
+                               if ( s.scriptCharset ) {
+                                       script.charset = s.scriptCharset;
+                               }
 
-               if ( this.options.duration ) {
-                       this.pos = eased = jQuery.easing[ this.easing ](
-                               percent, this.options.duration * percent, 0, 1, this.options.duration
-                       );
-               } else {
-                       this.pos = eased = percent;
-               }
-               this.now = ( this.end - this.start ) * eased + this.start;
+                               script.src = s.url;
 
-               if ( this.options.step ) {
-                       this.options.step.call( this.elem, this.now, this );
-               }
+                               // Attach handlers for all browsers
+                               script.onload = script.onreadystatechange = function( _, isAbort ) {
 
-               if ( hooks && hooks.set ) {
-                       hooks.set( this );
-               } else {
-                       Tween.propHooks._default.set( this );
-               }
-               return this;
-       }
-};
+                                       if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
 
-Tween.prototype.init.prototype = Tween.prototype;
+                                               // Handle memory leak in IE
+                                               script.onload = script.onreadystatechange = null;
 
-Tween.propHooks = {
-       _default: {
-               get: function( tween ) {
-                       var result;
+                                               // Remove the script
+                                               if ( script.parentNode ) {
+                                                       script.parentNode.removeChild( script );
+                                               }
 
-                       if ( tween.elem[ tween.prop ] != null &&
-                               (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
-                               return tween.elem[ tween.prop ];
-                       }
+                                               // Dereference the script
+                                               script = null;
 
-                       // passing any value as a 4th parameter to .css will automatically
-                       // attempt a parseFloat and fallback to a string if the parse fails
-                       // so, simple values such as "10px" are parsed to Float.
-                       // complex values such as "rotate(1rad)" are returned as is.
-                       result = jQuery.css( tween.elem, tween.prop, false, "" );
-                       // Empty strings, null, undefined and "auto" are converted to 0.
-                       return !result || result === "auto" ? 0 : result;
-               },
-               set: function( tween ) {
-                       // use step hook for back compat - use cssHook if its there - use .style if its
-                       // available and use plain properties where available
-                       if ( jQuery.fx.step[ tween.prop ] ) {
-                               jQuery.fx.step[ tween.prop ]( tween );
-                       } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
-                               jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
-                       } else {
-                               tween.elem[ tween.prop ] = tween.now;
+                                               // Callback if not abort
+                                               if ( !isAbort ) {
+                                                       callback( 200, "success" );
+                                               }
+                                       }
+                               };
+
+                               // Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending
+                               // Use native DOM manipulation to avoid our domManip AJAX trickery
+                               head.insertBefore( script, head.firstChild );
+                       },
+
+                       abort: function() {
+                               if ( script ) {
+                                       script.onload( undefined, true );
+                               }
                        }
-               }
+               };
        }
-};
+});
 
-// Remove in 2.0 - this supports IE8's panic based approach
-// to setting things on disconnected nodes
 
-Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
-       set: function( tween ) {
-               if ( tween.elem.nodeType && tween.elem.parentNode ) {
-                       tween.elem[ tween.prop ] = tween.now;
-               }
-       }
-};
 
-jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
-       var cssFn = jQuery.fn[ name ];
-       jQuery.fn[ name ] = function( speed, easing, callback ) {
-               return speed == null || typeof speed === "boolean" ||
-                       // special check for .toggle( handler, handler, ... )
-                       ( !i && jQuery.isFunction( speed ) && jQuery.isFunction( easing ) ) ?
-                       cssFn.apply( this, arguments ) :
-                       this.animate( genFx( name, true ), speed, easing, callback );
-       };
+
+var oldCallbacks = [],
+       rjsonp = /(=)\?(?=&|$)|\?\?/;
+
+// Default jsonp settings
+jQuery.ajaxSetup({
+       jsonp: "callback",
+       jsonpCallback: function() {
+               var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
+               this[ callback ] = true;
+               return callback;
+       }
 });
 
-jQuery.fn.extend({
-       fadeTo: function( speed, to, easing, callback ) {
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
 
-               // show any hidden elements after setting opacity to 0
-               return this.filter( isHidden ).css( "opacity", 0 ).show()
+       var callbackName, overwritten, responseContainer,
+               jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
+                       "url" :
+                       typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data ) && "data"
+               );
 
-                       // animate to the value specified
-                       .end().animate({ opacity: to }, speed, easing, callback );
-       },
-       animate: function( prop, speed, easing, callback ) {
-               var empty = jQuery.isEmptyObject( prop ),
-                       optall = jQuery.speed( speed, easing, callback ),
-                       doAnimation = function() {
-                               // Operate on a copy of prop so per-property easing won't be lost
-                               var anim = Animation( this, jQuery.extend( {}, prop ), optall );
+       // Handle iff the expected data type is "jsonp" or we have a parameter to set
+       if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
 
-                               // Empty animations resolve immediately
-                               if ( empty ) {
-                                       anim.stop( true );
-                               }
-                       };
+               // Get callback name, remembering preexisting value associated with it
+               callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
+                       s.jsonpCallback() :
+                       s.jsonpCallback;
 
-               return empty || optall.queue === false ?
-                       this.each( doAnimation ) :
-                       this.queue( optall.queue, doAnimation );
-       },
-       stop: function( type, clearQueue, gotoEnd ) {
-               var stopQueue = function( hooks ) {
-                       var stop = hooks.stop;
-                       delete hooks.stop;
-                       stop( gotoEnd );
+               // Insert callback into url or form data
+               if ( jsonProp ) {
+                       s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
+               } else if ( s.jsonp !== false ) {
+                       s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
+               }
+
+               // Use data converter to retrieve json after script execution
+               s.converters["script json"] = function() {
+                       if ( !responseContainer ) {
+                               jQuery.error( callbackName + " was not called" );
+                       }
+                       return responseContainer[ 0 ];
                };
 
-               if ( typeof type !== "string" ) {
-                       gotoEnd = clearQueue;
-                       clearQueue = type;
-                       type = undefined;
-               }
-               if ( clearQueue && type !== false ) {
-                       this.queue( type || "fx", [] );
-               }
+               // force json dataType
+               s.dataTypes[ 0 ] = "json";
 
-               return this.each(function() {
-                       var dequeue = true,
-                               index = type != null && type + "queueHooks",
-                               timers = jQuery.timers,
-                               data = jQuery._data( this );
+               // Install callback
+               overwritten = window[ callbackName ];
+               window[ callbackName ] = function() {
+                       responseContainer = arguments;
+               };
+
+               // Clean-up function (fires after converters)
+               jqXHR.always(function() {
+                       // Restore preexisting value
+                       window[ callbackName ] = overwritten;
+
+                       // Save back as free
+                       if ( s[ callbackName ] ) {
+                               // make sure that re-using the options doesn't screw things around
+                               s.jsonpCallback = originalSettings.jsonpCallback;
 
-                       if ( index ) {
-                               if ( data[ index ] && data[ index ].stop ) {
-                                       stopQueue( data[ index ] );
-                               }
-                       } else {
-                               for ( index in data ) {
-                                       if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
-                                               stopQueue( data[ index ] );
-                                       }
-                               }
+                               // save the callback name for future use
+                               oldCallbacks.push( callbackName );
                        }
 
-                       for ( index = timers.length; index--; ) {
-                               if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
-                                       timers[ index ].anim.stop( gotoEnd );
-                                       dequeue = false;
-                                       timers.splice( index, 1 );
-                               }
+                       // Call if it was a function and we have a response
+                       if ( responseContainer && jQuery.isFunction( overwritten ) ) {
+                               overwritten( responseContainer[ 0 ] );
                        }
 
-                       // start the next in the queue if the last step wasn't forced
-                       // timers currently will call their complete callbacks, which will dequeue
-                       // but only if they were gotoEnd
-                       if ( dequeue || !gotoEnd ) {
-                               jQuery.dequeue( this, type );
-                       }
+                       responseContainer = overwritten = undefined;
                });
+
+               // Delegate to script
+               return "script";
        }
 });
 
-// Generate parameters to create a standard animation
-function genFx( type, includeWidth ) {
-       var which,
-               attrs = { height: type },
-               i = 0;
 
-       // if we include width, step value is 1 to do all cssExpand values,
-       // if we don't include width, step value is 2 to skip over Left and Right
-       includeWidth = includeWidth? 1 : 0;
-       for( ; i < 4 ; i += 2 - includeWidth ) {
-               which = cssExpand[ i ];
-               attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
-       }
 
-       if ( includeWidth ) {
-               attrs.opacity = attrs.width = type;
-       }
 
-       return attrs;
-}
+// data: string of html
+// context (optional): If specified, the fragment will be created in this context, defaults to document
+// keepScripts (optional): If true, will include scripts passed in the html string
+jQuery.parseHTML = function( data, context, keepScripts ) {
+       if ( !data || typeof data !== "string" ) {
+               return null;
+       }
+       if ( typeof context === "boolean" ) {
+               keepScripts = context;
+               context = false;
+       }
+       context = context || document;
 
-// Generate shortcuts for custom animations
-jQuery.each({
-       slideDown: genFx("show"),
-       slideUp: genFx("hide"),
-       slideToggle: genFx("toggle"),
-       fadeIn: { opacity: "show" },
-       fadeOut: { opacity: "hide" },
-       fadeToggle: { opacity: "toggle" }
-}, function( name, props ) {
-       jQuery.fn[ name ] = function( speed, easing, callback ) {
-               return this.animate( props, speed, easing, callback );
-       };
-});
+       var parsed = rsingleTag.exec( data ),
+               scripts = !keepScripts && [];
 
-jQuery.speed = function( speed, easing, fn ) {
-       var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
-               complete: fn || !fn && easing ||
-                       jQuery.isFunction( speed ) && speed,
-               duration: speed,
-               easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
-       };
+       // Single tag
+       if ( parsed ) {
+               return [ context.createElement( parsed[1] ) ];
+       }
 
-       opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
-               opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
+       parsed = jQuery.buildFragment( [ data ], context, scripts );
 
-       // normalize opt.queue - true/undefined/null -> "fx"
-       if ( opt.queue == null || opt.queue === true ) {
-               opt.queue = "fx";
+       if ( scripts && scripts.length ) {
+               jQuery( scripts ).remove();
        }
 
-       // Queueing
-       opt.old = opt.complete;
-
-       opt.complete = function() {
-               if ( jQuery.isFunction( opt.old ) ) {
-                       opt.old.call( this );
-               }
+       return jQuery.merge( [], parsed.childNodes );
+};
 
-               if ( opt.queue ) {
-                       jQuery.dequeue( this, opt.queue );
-               }
-       };
 
-       return opt;
-};
+// Keep a copy of the old load method
+var _load = jQuery.fn.load;
 
-jQuery.easing = {
-       linear: function( p ) {
-               return p;
-       },
-       swing: function( p ) {
-               return 0.5 - Math.cos( p*Math.PI ) / 2;
+/**
+ * Load a url into a page
+ */
+jQuery.fn.load = function( url, params, callback ) {
+       if ( typeof url !== "string" && _load ) {
+               return _load.apply( this, arguments );
        }
-};
-
-jQuery.timers = [];
-jQuery.fx = Tween.prototype.init;
-jQuery.fx.tick = function() {
-       var timer,
-               timers = jQuery.timers,
-               i = 0;
 
-       fxNow = jQuery.now();
+       var selector, response, type,
+               self = this,
+               off = url.indexOf(" ");
 
-       for ( ; i < timers.length; i++ ) {
-               timer = timers[ i ];
-               // Checks the timer has not already been removed
-               if ( !timer() && timers[ i ] === timer ) {
-                       timers.splice( i--, 1 );
-               }
+       if ( off >= 0 ) {
+               selector = jQuery.trim( url.slice( off, url.length ) );
+               url = url.slice( 0, off );
        }
 
-       if ( !timers.length ) {
-               jQuery.fx.stop();
-       }
-       fxNow = undefined;
-};
+       // If it's a function
+       if ( jQuery.isFunction( params ) ) {
 
-jQuery.fx.timer = function( timer ) {
-       if ( timer() && jQuery.timers.push( timer ) && !timerId ) {
-               timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
-       }
-};
+               // We assume that it's the callback
+               callback = params;
+               params = undefined;
 
-jQuery.fx.interval = 13;
+       // Otherwise, build a param string
+       } else if ( params && typeof params === "object" ) {
+               type = "POST";
+       }
 
-jQuery.fx.stop = function() {
-       clearInterval( timerId );
-       timerId = null;
-};
+       // If we have elements to modify, make the request
+       if ( self.length > 0 ) {
+               jQuery.ajax({
+                       url: url,
 
-jQuery.fx.speeds = {
-       slow: 600,
-       fast: 200,
-       // Default speed
-       _default: 400
-};
+                       // if "type" variable is undefined, then "GET" method will be used
+                       type: type,
+                       dataType: "html",
+                       data: params
+               }).done(function( responseText ) {
 
-// Back Compat <1.8 extension point
-jQuery.fx.step = {};
+                       // Save response for use in complete callback
+                       response = arguments;
 
-if ( jQuery.expr && jQuery.expr.filters ) {
-       jQuery.expr.filters.animated = function( elem ) {
-               return jQuery.grep(jQuery.timers, function( fn ) {
-                       return elem === fn.elem;
-               }).length;
-       };
-}
-var rroot = /^(?:body|html)$/i;
+                       self.html( selector ?
 
-jQuery.fn.offset = function( options ) {
-       if ( arguments.length ) {
-               return options === undefined ?
-                       this :
-                       this.each(function( i ) {
-                               jQuery.offset.setOffset( this, options, i );
-                       });
-       }
+                               // If a selector was specified, locate the right elements in a dummy div
+                               // Exclude scripts to avoid IE 'Permission Denied' errors
+                               jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :
 
-       var docElem, body, win, clientTop, clientLeft, scrollTop, scrollLeft,
-               box = { top: 0, left: 0 },
-               elem = this[ 0 ],
-               doc = elem && elem.ownerDocument;
+                               // Otherwise use the full result
+                               responseText );
 
-       if ( !doc ) {
-               return;
+               }).complete( callback && function( jqXHR, status ) {
+                       self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
+               });
        }
 
-       if ( (body = doc.body) === elem ) {
-               return jQuery.offset.bodyOffset( elem );
-       }
+       return this;
+};
 
-       docElem = doc.documentElement;
 
-       // Make sure it's not a disconnected DOM node
-       if ( !jQuery.contains( docElem, elem ) ) {
-               return box;
-       }
 
-       // If we don't have gBCR, just use 0,0 rather than error
-       // BlackBerry 5, iOS 3 (original iPhone)
-       if ( typeof elem.getBoundingClientRect !== "undefined" ) {
-               box = elem.getBoundingClientRect();
-       }
-       win = getWindow( doc );
-       clientTop  = docElem.clientTop  || body.clientTop  || 0;
-       clientLeft = docElem.clientLeft || body.clientLeft || 0;
-       scrollTop  = win.pageYOffset || docElem.scrollTop;
-       scrollLeft = win.pageXOffset || docElem.scrollLeft;
-       return {
-               top: box.top  + scrollTop  - clientTop,
-               left: box.left + scrollLeft - clientLeft
-       };
+
+jQuery.expr.filters.animated = function( elem ) {
+       return jQuery.grep(jQuery.timers, function( fn ) {
+               return elem === fn.elem;
+       }).length;
 };
 
-jQuery.offset = {
 
-       bodyOffset: function( body ) {
-               var top = body.offsetTop,
-                       left = body.offsetLeft;
 
-               if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {
-                       top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
-                       left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
-               }
 
-               return { top: top, left: left };
-       },
 
+var docElem = window.document.documentElement;
+
+/**
+ * Gets a window from an element
+ */
+function getWindow( elem ) {
+       return jQuery.isWindow( elem ) ?
+               elem :
+               elem.nodeType === 9 ?
+                       elem.defaultView || elem.parentWindow :
+                       false;
+}
+
+jQuery.offset = {
        setOffset: function( elem, options, i ) {
-               var position = jQuery.css( elem, "position" );
+               var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
+                       position = jQuery.css( elem, "position" ),
+                       curElem = jQuery( elem ),
+                       props = {};
 
                // set position first, in-case top/left are set even on static elem
                if ( position === "static" ) {
                        elem.style.position = "relative";
                }
 
-               var curElem = jQuery( elem ),
-                       curOffset = curElem.offset(),
-                       curCSSTop = jQuery.css( elem, "top" ),
-                       curCSSLeft = jQuery.css( elem, "left" ),
-                       calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
-                       props = {}, curPosition = {}, curTop, curLeft;
+               curOffset = curElem.offset();
+               curCSSTop = jQuery.css( elem, "top" );
+               curCSSLeft = jQuery.css( elem, "left" );
+               calculatePosition = ( position === "absolute" || position === "fixed" ) &&
+                       jQuery.inArray("auto", [ curCSSTop, curCSSLeft ] ) > -1;
 
                // need to be able to calculate position if either top or left is auto and position is either absolute or fixed
                if ( calculatePosition ) {
@@ -9329,58 +10066,99 @@ jQuery.offset = {
        }
 };
 
-
 jQuery.fn.extend({
+       offset: function( options ) {
+               if ( arguments.length ) {
+                       return options === undefined ?
+                               this :
+                               this.each(function( i ) {
+                                       jQuery.offset.setOffset( this, options, i );
+                               });
+               }
+
+               var docElem, win,
+                       box = { top: 0, left: 0 },
+                       elem = this[ 0 ],
+                       doc = elem && elem.ownerDocument;
+
+               if ( !doc ) {
+                       return;
+               }
+
+               docElem = doc.documentElement;
+
+               // Make sure it's not a disconnected DOM node
+               if ( !jQuery.contains( docElem, elem ) ) {
+                       return box;
+               }
+
+               // If we don't have gBCR, just use 0,0 rather than error
+               // BlackBerry 5, iOS 3 (original iPhone)
+               if ( typeof elem.getBoundingClientRect !== strundefined ) {
+                       box = elem.getBoundingClientRect();
+               }
+               win = getWindow( doc );
+               return {
+                       top: box.top  + ( win.pageYOffset || docElem.scrollTop )  - ( docElem.clientTop  || 0 ),
+                       left: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )
+               };
+       },
 
        position: function() {
-               if ( !this[0] ) {
+               if ( !this[ 0 ] ) {
                        return;
                }
 
-               var elem = this[0],
+               var offsetParent, offset,
+                       parentOffset = { top: 0, left: 0 },
+                       elem = this[ 0 ];
+
+               // fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is its only offset parent
+               if ( jQuery.css( elem, "position" ) === "fixed" ) {
+                       // we assume that getBoundingClientRect is available when computed position is fixed
+                       offset = elem.getBoundingClientRect();
+               } else {
+                       // Get *real* offsetParent
+                       offsetParent = this.offsetParent();
 
-               // Get *real* offsetParent
-               offsetParent = this.offsetParent(),
+                       // Get correct offsets
+                       offset = this.offset();
+                       if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
+                               parentOffset = offsetParent.offset();
+                       }
 
-               // Get correct offsets
-               offset       = this.offset(),
-               parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
+                       // Add offsetParent borders
+                       parentOffset.top  += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
+                       parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
+               }
 
-               // Subtract element margins
+               // Subtract parent offsets and element margins
                // note: when an element has margin: auto the offsetLeft and marginLeft
                // are the same in Safari causing offset.left to incorrectly be 0
-               offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
-               offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
-
-               // Add offsetParent borders
-               parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
-               parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
-
-               // Subtract the two offsets
                return {
-                       top:  offset.top  - parentOffset.top,
-                       left: offset.left - parentOffset.left
+                       top:  offset.top  - parentOffset.top - jQuery.css( elem, "marginTop", true ),
+                       left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true)
                };
        },
 
        offsetParent: function() {
                return this.map(function() {
-                       var offsetParent = this.offsetParent || document.body;
-                       while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
+                       var offsetParent = this.offsetParent || docElem;
+
+                       while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position" ) === "static" ) ) {
                                offsetParent = offsetParent.offsetParent;
                        }
-                       return offsetParent || document.body;
+                       return offsetParent || docElem;
                });
        }
 });
 
-
 // Create scrollLeft and scrollTop methods
-jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
+jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
        var top = /Y/.test( prop );
 
        jQuery.fn[ method ] = function( val ) {
-               return jQuery.access( this, function( elem, method, val ) {
+               return access( this, function( elem, method, val ) {
                        var win = getWindow( elem );
 
                        if ( val === undefined ) {
@@ -9392,7 +10170,7 @@ jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( me
                        if ( win ) {
                                win.scrollTo(
                                        !top ? val : jQuery( win ).scrollLeft(),
-                                        top ? val : jQuery( win ).scrollTop()
+                                       top ? val : jQuery( win ).scrollTop()
                                );
 
                        } else {
@@ -9402,13 +10180,25 @@ jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( me
        };
 });
 
-function getWindow( elem ) {
-       return jQuery.isWindow( elem ) ?
-               elem :
-               elem.nodeType === 9 ?
-                       elem.defaultView || elem.parentWindow :
-                       false;
-}
+// Add the top/left cssHooks using jQuery.fn.position
+// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
+// getComputedStyle returns percent when specified for top/left/bottom/right
+// rather than make the css module depend on the offset module, we just check for it here
+jQuery.each( [ "top", "left" ], function( i, prop ) {
+       jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
+               function( elem, computed ) {
+                       if ( computed ) {
+                               computed = curCSS( elem, prop );
+                               // if curCSS returns percentage, fallback to offset
+                               return rnumnonpx.test( computed ) ?
+                                       jQuery( elem ).position()[ prop ] + "px" :
+                                       computed;
+                       }
+               }
+       );
+});
+
+
 // Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
 jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
        jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
@@ -9417,7 +10207,7 @@ jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
                        var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
                                extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
 
-                       return jQuery.access( this, function( elem, type, value ) {
+                       return access( this, function( elem, type, value ) {
                                var doc;
 
                                if ( jQuery.isWindow( elem ) ) {
@@ -9442,7 +10232,7 @@ jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
 
                                return value === undefined ?
                                        // Get width or height on the element, requesting but not forcing parseFloat
-                                       jQuery.css( elem, type, value, extra ) :
+                                       jQuery.css( elem, type, extra ) :
 
                                        // Set width or height on the element
                                        jQuery.style( elem, type, value, extra );
@@ -9450,23 +10240,69 @@ jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
                };
        });
 });
-// Expose jQuery to the global object
-window.jQuery = window.$ = jQuery;
-
-// Expose jQuery as an AMD module, but only for AMD loaders that
-// understand the issues with loading multiple versions of jQuery
-// in a page that all might call define(). The loader will indicate
-// they have special allowances for multiple jQuery versions by
-// specifying define.amd.jQuery = true. Register as a named module,
-// since jQuery can be concatenated with other files that may use define,
-// but not use a proper concatenation script that understands anonymous
-// AMD modules. A named AMD is safest and most robust way to register.
-// Lowercase jquery is used because AMD module names are derived from
-// file names, and jQuery is normally delivered in a lowercase file name.
-// Do this after creating the global so that if an AMD module wants to call
-// noConflict to hide this version of jQuery, it will work.
-if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
-       define( "jquery", [], function () { return jQuery; } );
+
+
+// The number of elements contained in the matched element set
+jQuery.fn.size = function() {
+       return this.length;
+};
+
+jQuery.fn.andSelf = jQuery.fn.addBack;
+
+
+
+
+// Register as a named AMD module, since jQuery can be concatenated with other
+// files that may use define, but not via a proper concatenation script that
+// understands anonymous AMD modules. A named AMD is safest and most robust
+// way to register. Lowercase jquery is used because AMD module names are
+// derived from file names, and jQuery is normally delivered in a lowercase
+// file name. Do this after creating the global so that if an AMD module wants
+// to call noConflict to hide this version of jQuery, it will work.
+
+// Note that for maximum portability, libraries that are not jQuery should
+// declare themselves as anonymous modules, and avoid setting a global if an
+// AMD loader is present. jQuery is a special case. For more information, see
+// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
+
+if ( typeof define === "function" && define.amd ) {
+       define( "jquery", [], function() {
+               return jQuery;
+       });
 }
 
-})( window );
+
+
+
+var
+       // Map over jQuery in case of overwrite
+       _jQuery = window.jQuery,
+
+       // Map over the $ in case of overwrite
+       _$ = window.$;
+
+jQuery.noConflict = function( deep ) {
+       if ( window.$ === jQuery ) {
+               window.$ = _$;
+       }
+
+       if ( deep && window.jQuery === jQuery ) {
+               window.jQuery = _jQuery;
+       }
+
+       return jQuery;
+};
+
+// Expose jQuery and $ identifiers, even in
+// AMD (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
+// and CommonJS for browser emulators (#13566)
+if ( typeof noGlobal === strundefined ) {
+       window.jQuery = window.$ = jQuery;
+}
+
+
+
+
+return jQuery;
+
+}));
diff --git a/resources/lib/jquery/jquery.migrate.js b/resources/lib/jquery/jquery.migrate.js
new file mode 100644 (file)
index 0000000..25b6c81
--- /dev/null
@@ -0,0 +1,521 @@
+/*!
+ * jQuery Migrate - v1.2.1 - 2013-05-08
+ * https://github.com/jquery/jquery-migrate
+ * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors; Licensed MIT
+ */
+(function( jQuery, window, undefined ) {
+// See http://bugs.jquery.com/ticket/13335
+// "use strict";
+
+
+var warnedAbout = {};
+
+// List of warnings already given; public read only
+jQuery.migrateWarnings = [];
+
+// Set to true to prevent console output; migrateWarnings still maintained
+// jQuery.migrateMute = false;
+
+// Show a message on the console so devs know we're active
+if ( !jQuery.migrateMute && window.console && window.console.log ) {
+       window.console.log("JQMIGRATE: Logging is active");
+}
+
+// Set to false to disable traces that appear with warnings
+if ( jQuery.migrateTrace === undefined ) {
+       jQuery.migrateTrace = true;
+}
+
+// Forget any warnings we've already given; public
+jQuery.migrateReset = function() {
+       warnedAbout = {};
+       jQuery.migrateWarnings.length = 0;
+};
+
+function migrateWarn( msg) {
+       var console = window.console;
+       if ( !warnedAbout[ msg ] ) {
+               warnedAbout[ msg ] = true;
+               jQuery.migrateWarnings.push( msg );
+               if ( console && console.warn && !jQuery.migrateMute ) {
+                       console.warn( "JQMIGRATE: " + msg );
+                       if ( jQuery.migrateTrace && console.trace ) {
+                               console.trace();
+                       }
+               }
+       }
+}
+
+function migrateWarnProp( obj, prop, value, msg ) {
+       if ( Object.defineProperty ) {
+               // On ES5 browsers (non-oldIE), warn if the code tries to get prop;
+               // allow property to be overwritten in case some other plugin wants it
+               try {
+                       Object.defineProperty( obj, prop, {
+                               configurable: true,
+                               enumerable: true,
+                               get: function() {
+                                       migrateWarn( msg );
+                                       return value;
+                               },
+                               set: function( newValue ) {
+                                       migrateWarn( msg );
+                                       value = newValue;
+                               }
+                       });
+                       return;
+               } catch( err ) {
+                       // IE8 is a dope about Object.defineProperty, can't warn there
+               }
+       }
+
+       // Non-ES5 (or broken) browser; just set the property
+       jQuery._definePropertyBroken = true;
+       obj[ prop ] = value;
+}
+
+if ( document.compatMode === "BackCompat" ) {
+       // jQuery has never supported or tested Quirks Mode
+       migrateWarn( "jQuery is not compatible with Quirks Mode" );
+}
+
+
+var attrFn = jQuery( "<input/>", { size: 1 } ).attr("size") && jQuery.attrFn,
+       oldAttr = jQuery.attr,
+       valueAttrGet = jQuery.attrHooks.value && jQuery.attrHooks.value.get ||
+               function() { return null; },
+       valueAttrSet = jQuery.attrHooks.value && jQuery.attrHooks.value.set ||
+               function() { return undefined; },
+       rnoType = /^(?:input|button)$/i,
+       rnoAttrNodeType = /^[238]$/,
+       rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
+       ruseDefault = /^(?:checked|selected)$/i;
+
+// jQuery.attrFn
+migrateWarnProp( jQuery, "attrFn", attrFn || {}, "jQuery.attrFn is deprecated" );
+
+jQuery.attr = function( elem, name, value, pass ) {
+       var lowerName = name.toLowerCase(),
+               nType = elem && elem.nodeType;
+
+       if ( pass ) {
+               // Since pass is used internally, we only warn for new jQuery
+               // versions where there isn't a pass arg in the formal params
+               if ( oldAttr.length < 4 ) {
+                       migrateWarn("jQuery.fn.attr( props, pass ) is deprecated");
+               }
+               if ( elem && !rnoAttrNodeType.test( nType ) &&
+                       (attrFn ? name in attrFn : jQuery.isFunction(jQuery.fn[name])) ) {
+                       return jQuery( elem )[ name ]( value );
+               }
+       }
+
+       // Warn if user tries to set `type`, since it breaks on IE 6/7/8; by checking
+       // for disconnected elements we don't warn on $( "<button>", { type: "button" } ).
+       if ( name === "type" && value !== undefined && rnoType.test( elem.nodeName ) && elem.parentNode ) {
+               migrateWarn("Can't change the 'type' of an input or button in IE 6/7/8");
+       }
+
+       // Restore boolHook for boolean property/attribute synchronization
+       if ( !jQuery.attrHooks[ lowerName ] && rboolean.test( lowerName ) ) {
+               jQuery.attrHooks[ lowerName ] = {
+                       get: function( elem, name ) {
+                               // Align boolean attributes with corresponding properties
+                               // Fall back to attribute presence where some booleans are not supported
+                               var attrNode,
+                                       property = jQuery.prop( elem, name );
+                               return property === true || typeof property !== "boolean" &&
+                                       ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
+
+                                       name.toLowerCase() :
+                                       undefined;
+                       },
+                       set: function( elem, value, name ) {
+                               var propName;
+                               if ( value === false ) {
+                                       // Remove boolean attributes when set to false
+                                       jQuery.removeAttr( elem, name );
+                               } else {
+                                       // value is true since we know at this point it's type boolean and not false
+                                       // Set boolean attributes to the same name and set the DOM property
+                                       propName = jQuery.propFix[ name ] || name;
+                                       if ( propName in elem ) {
+                                               // Only set the IDL specifically if it already exists on the element
+                                               elem[ propName ] = true;
+                                       }
+
+                                       elem.setAttribute( name, name.toLowerCase() );
+                               }
+                               return name;
+                       }
+               };
+
+               // Warn only for attributes that can remain distinct from their properties post-1.9
+               if ( ruseDefault.test( lowerName ) ) {
+                       migrateWarn( "jQuery.fn.attr('" + lowerName + "') may use property instead of attribute" );
+               }
+       }
+
+       return oldAttr.call( jQuery, elem, name, value );
+};
+
+// attrHooks: value
+jQuery.attrHooks.value = {
+       get: function( elem, name ) {
+               var nodeName = ( elem.nodeName || "" ).toLowerCase();
+               if ( nodeName === "button" ) {
+                       return valueAttrGet.apply( this, arguments );
+               }
+               if ( nodeName !== "input" && nodeName !== "option" ) {
+                       migrateWarn("jQuery.fn.attr('value') no longer gets properties");
+               }
+               return name in elem ?
+                       elem.value :
+                       null;
+       },
+       set: function( elem, value ) {
+               var nodeName = ( elem.nodeName || "" ).toLowerCase();
+               if ( nodeName === "button" ) {
+                       return valueAttrSet.apply( this, arguments );
+               }
+               if ( nodeName !== "input" && nodeName !== "option" ) {
+                       migrateWarn("jQuery.fn.attr('value', val) no longer sets properties");
+               }
+               // Does not return so that setAttribute is also used
+               elem.value = value;
+       }
+};
+
+
+var matched, browser,
+       oldInit = jQuery.fn.init,
+       oldParseJSON = jQuery.parseJSON,
+       // Note: XSS check is done below after string is trimmed
+       rquickExpr = /^([^<]*)(<[\w\W]+>)([^>]*)$/;
+
+// $(html) "looks like html" rule change
+jQuery.fn.init = function( selector, context, rootjQuery ) {
+       var match;
+
+       if ( selector && typeof selector === "string" && !jQuery.isPlainObject( context ) &&
+                       (match = rquickExpr.exec( jQuery.trim( selector ) )) && match[ 0 ] ) {
+               // This is an HTML string according to the "old" rules; is it still?
+               if ( selector.charAt( 0 ) !== "<" ) {
+                       migrateWarn("$(html) HTML strings must start with '<' character");
+               }
+               if ( match[ 3 ] ) {
+                       migrateWarn("$(html) HTML text after last tag is ignored");
+               }
+               // Consistently reject any HTML-like string starting with a hash (#9521)
+               // Note that this may break jQuery 1.6.x code that otherwise would work.
+               if ( match[ 0 ].charAt( 0 ) === "#" ) {
+                       migrateWarn("HTML string cannot start with a '#' character");
+                       jQuery.error("JQMIGRATE: Invalid selector string (XSS)");
+               }
+               // Now process using loose rules; let pre-1.8 play too
+               if ( context && context.context ) {
+                       // jQuery object as context; parseHTML expects a DOM object
+                       context = context.context;
+               }
+               if ( jQuery.parseHTML ) {
+                       return oldInit.call( this, jQuery.parseHTML( match[ 2 ], context, true ),
+                                       context, rootjQuery );
+               }
+       }
+       return oldInit.apply( this, arguments );
+};
+jQuery.fn.init.prototype = jQuery.fn;
+
+// Let $.parseJSON(falsy_value) return null
+jQuery.parseJSON = function( json ) {
+       if ( !json && json !== null ) {
+               migrateWarn("jQuery.parseJSON requires a valid JSON string");
+               return null;
+       }
+       return oldParseJSON.apply( this, arguments );
+};
+
+jQuery.uaMatch = function( ua ) {
+       ua = ua.toLowerCase();
+
+       var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
+               /(webkit)[ \/]([\w.]+)/.exec( ua ) ||
+               /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
+               /(msie) ([\w.]+)/.exec( ua ) ||
+               ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
+               [];
+
+       return {
+               browser: match[ 1 ] || "",
+               version: match[ 2 ] || "0"
+       };
+};
+
+// Don't clobber any existing jQuery.browser in case it's different
+if ( !jQuery.browser ) {
+       matched = jQuery.uaMatch( navigator.userAgent );
+       browser = {};
+
+       if ( matched.browser ) {
+               browser[ matched.browser ] = true;
+               browser.version = matched.version;
+       }
+
+       // Chrome is Webkit, but Webkit is also Safari.
+       if ( browser.chrome ) {
+               browser.webkit = true;
+       } else if ( browser.webkit ) {
+               browser.safari = true;
+       }
+
+       jQuery.browser = browser;
+}
+
+// Warn if the code tries to get jQuery.browser
+migrateWarnProp( jQuery, "browser", jQuery.browser, "jQuery.browser is deprecated" );
+
+jQuery.sub = function() {
+       function jQuerySub( selector, context ) {
+               return new jQuerySub.fn.init( selector, context );
+       }
+       jQuery.extend( true, jQuerySub, this );
+       jQuerySub.superclass = this;
+       jQuerySub.fn = jQuerySub.prototype = this();
+       jQuerySub.fn.constructor = jQuerySub;
+       jQuerySub.sub = this.sub;
+       jQuerySub.fn.init = function init( selector, context ) {
+               if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
+                       context = jQuerySub( context );
+               }
+
+               return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
+       };
+       jQuerySub.fn.init.prototype = jQuerySub.fn;
+       var rootjQuerySub = jQuerySub(document);
+       migrateWarn( "jQuery.sub() is deprecated" );
+       return jQuerySub;
+};
+
+
+// Ensure that $.ajax gets the new parseJSON defined in core.js
+jQuery.ajaxSetup({
+       converters: {
+               "text json": jQuery.parseJSON
+       }
+});
+
+
+var oldFnData = jQuery.fn.data;
+
+jQuery.fn.data = function( name ) {
+       var ret, evt,
+               elem = this[0];
+
+       // Handles 1.7 which has this behavior and 1.8 which doesn't
+       if ( elem && name === "events" && arguments.length === 1 ) {
+               ret = jQuery.data( elem, name );
+               evt = jQuery._data( elem, name );
+               if ( ( ret === undefined || ret === evt ) && evt !== undefined ) {
+                       migrateWarn("Use of jQuery.fn.data('events') is deprecated");
+                       return evt;
+               }
+       }
+       return oldFnData.apply( this, arguments );
+};
+
+
+var rscriptType = /\/(java|ecma)script/i,
+       oldSelf = jQuery.fn.andSelf || jQuery.fn.addBack;
+
+jQuery.fn.andSelf = function() {
+       migrateWarn("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()");
+       return oldSelf.apply( this, arguments );
+};
+
+// Since jQuery.clean is used internally on older versions, we only shim if it's missing
+if ( !jQuery.clean ) {
+       jQuery.clean = function( elems, context, fragment, scripts ) {
+               // Set context per 1.8 logic
+               context = context || document;
+               context = !context.nodeType && context[0] || context;
+               context = context.ownerDocument || context;
+
+               migrateWarn("jQuery.clean() is deprecated");
+
+               var i, elem, handleScript, jsTags,
+                       ret = [];
+
+               jQuery.merge( ret, jQuery.buildFragment( elems, context ).childNodes );
+
+               // Complex logic lifted directly from jQuery 1.8
+               if ( fragment ) {
+                       // Special handling of each script element
+                       handleScript = function( elem ) {
+                               // Check if we consider it executable
+                               if ( !elem.type || rscriptType.test( elem.type ) ) {
+                                       // Detach the script and store it in the scripts array (if provided) or the fragment
+                                       // Return truthy to indicate that it has been handled
+                                       return scripts ?
+                                               scripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) :
+                                               fragment.appendChild( elem );
+                               }
+                       };
+
+                       for ( i = 0; (elem = ret[i]) != null; i++ ) {
+                               // Check if we're done after handling an executable script
+                               if ( !( jQuery.nodeName( elem, "script" ) && handleScript( elem ) ) ) {
+                                       // Append to fragment and handle embedded scripts
+                                       fragment.appendChild( elem );
+                                       if ( typeof elem.getElementsByTagName !== "undefined" ) {
+                                               // handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration
+                                               jsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName("script") ), handleScript );
+
+                                               // Splice the scripts into ret after their former ancestor and advance our index beyond them
+                                               ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
+                                               i += jsTags.length;
+                                       }
+                               }
+                       }
+               }
+
+               return ret;
+       };
+}
+
+var eventAdd = jQuery.event.add,
+       eventRemove = jQuery.event.remove,
+       eventTrigger = jQuery.event.trigger,
+       oldToggle = jQuery.fn.toggle,
+       oldLive = jQuery.fn.live,
+       oldDie = jQuery.fn.die,
+       ajaxEvents = "ajaxStart|ajaxStop|ajaxSend|ajaxComplete|ajaxError|ajaxSuccess",
+       rajaxEvent = new RegExp( "\\b(?:" + ajaxEvents + ")\\b" ),
+       rhoverHack = /(?:^|\s)hover(\.\S+|)\b/,
+       hoverHack = function( events ) {
+               if ( typeof( events ) !== "string" || jQuery.event.special.hover ) {
+                       return events;
+               }
+               if ( rhoverHack.test( events ) ) {
+                       migrateWarn("'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'");
+               }
+               return events && events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
+       };
+
+// Event props removed in 1.9, put them back if needed; no practical way to warn them
+if ( jQuery.event.props && jQuery.event.props[ 0 ] !== "attrChange" ) {
+       jQuery.event.props.unshift( "attrChange", "attrName", "relatedNode", "srcElement" );
+}
+
+// Undocumented jQuery.event.handle was "deprecated" in jQuery 1.7
+if ( jQuery.event.dispatch ) {
+       migrateWarnProp( jQuery.event, "handle", jQuery.event.dispatch, "jQuery.event.handle is undocumented and deprecated" );
+}
+
+// Support for 'hover' pseudo-event and ajax event warnings
+jQuery.event.add = function( elem, types, handler, data, selector ){
+       if ( elem !== document && rajaxEvent.test( types ) ) {
+               migrateWarn( "AJAX events should be attached to document: " + types );
+       }
+       eventAdd.call( this, elem, hoverHack( types || "" ), handler, data, selector );
+};
+jQuery.event.remove = function( elem, types, handler, selector, mappedTypes ){
+       eventRemove.call( this, elem, hoverHack( types ) || "", handler, selector, mappedTypes );
+};
+
+jQuery.fn.error = function() {
+       var args = Array.prototype.slice.call( arguments, 0);
+       migrateWarn("jQuery.fn.error() is deprecated");
+       args.splice( 0, 0, "error" );
+       if ( arguments.length ) {
+               return this.bind.apply( this, args );
+       }
+       // error event should not bubble to window, although it does pre-1.7
+       this.triggerHandler.apply( this, args );
+       return this;
+};
+
+jQuery.fn.toggle = function( fn, fn2 ) {
+
+       // Don't mess with animation or css toggles
+       if ( !jQuery.isFunction( fn ) || !jQuery.isFunction( fn2 ) ) {
+               return oldToggle.apply( this, arguments );
+       }
+       migrateWarn("jQuery.fn.toggle(handler, handler...) is deprecated");
+
+       // Save reference to arguments for access in closure
+       var args = arguments,
+               guid = fn.guid || jQuery.guid++,
+               i = 0,
+               toggler = function( event ) {
+                       // Figure out which function to execute
+                       var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
+                       jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
+
+                       // Make sure that clicks stop
+                       event.preventDefault();
+
+                       // and execute the function
+                       return args[ lastToggle ].apply( this, arguments ) || false;
+               };
+
+       // link all the functions, so any of them can unbind this click handler
+       toggler.guid = guid;
+       while ( i < args.length ) {
+               args[ i++ ].guid = guid;
+       }
+
+       return this.click( toggler );
+};
+
+jQuery.fn.live = function( types, data, fn ) {
+       migrateWarn("jQuery.fn.live() is deprecated");
+       if ( oldLive ) {
+               return oldLive.apply( this, arguments );
+       }
+       jQuery( this.context ).on( types, this.selector, data, fn );
+       return this;
+};
+
+jQuery.fn.die = function( types, fn ) {
+       migrateWarn("jQuery.fn.die() is deprecated");
+       if ( oldDie ) {
+               return oldDie.apply( this, arguments );
+       }
+       jQuery( this.context ).off( types, this.selector || "**", fn );
+       return this;
+};
+
+// Turn global events into document-triggered events
+jQuery.event.trigger = function( event, data, elem, onlyHandlers  ){
+       if ( !elem && !rajaxEvent.test( event ) ) {
+               migrateWarn( "Global events are undocumented and deprecated" );
+       }
+       return eventTrigger.call( this,  event, data, elem || document, onlyHandlers  );
+};
+jQuery.each( ajaxEvents.split("|"),
+       function( _, name ) {
+               jQuery.event.special[ name ] = {
+                       setup: function() {
+                               var elem = this;
+
+                               // The document needs no shimming; must be !== for oldIE
+                               if ( elem !== document ) {
+                                       jQuery.event.add( document, name + "." + jQuery.guid, function() {
+                                               jQuery.event.trigger( name, null, elem, true );
+                                       });
+                                       jQuery._data( this, name, jQuery.guid++ );
+                               }
+                               return false;
+                       },
+                       teardown: function() {
+                               if ( this !== document ) {
+                                       jQuery.event.remove( document, name + "." + jQuery._data( this, name ) );
+                               }
+                               return false;
+                       }
+               };
+       }
+);
+
+
+})( jQuery, window );
index 416d6be..eb39dac 100644 (file)
@@ -10,5 +10,9 @@
        "ooui-outline-control-move-down": "Mover abaxo l'elementu",
        "ooui-outline-control-move-up": "Mover arriba l'elementu",
        "ooui-outline-control-remove": "Desaniciar elementu",
-       "ooui-toolbar-more": "Más"
+       "ooui-toolbar-more": "Más",
+       "ooui-dialog-confirm-title": "Confirmar",
+       "ooui-dialog-confirm-default-prompt": "¿Tas seguru?",
+       "ooui-dialog-confirm-default-ok": "Aceutar",
+       "ooui-dialog-confirm-default-cancel": "Encaboxar"
 }
index a7b9d9d..f7105ce 100644 (file)
@@ -13,5 +13,8 @@
        "ooui-outline-control-move-down": "আইটেম নিচে স্থানান্তর",
        "ooui-outline-control-move-up": "আইটেম উপরে স্থানান্তর",
        "ooui-outline-control-remove": "আইটেম সরান",
-       "ooui-toolbar-more": "আরও"
+       "ooui-toolbar-more": "আরও",
+       "ooui-dialog-confirm-title": "নিশ্চিত করুন",
+       "ooui-dialog-confirm-default-ok": "ঠিক আছে",
+       "ooui-dialog-confirm-default-cancel": "বাতিল"
 }
index 137322a..44247ca 100644 (file)
@@ -8,5 +8,7 @@
        },
        "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-move-up": "Lakaat an elfenn da bignat",
+       "ooui-outline-control-remove": "Tennañ an elfenn",
+       "ooui-toolbar-more": "Muioc'h"
 }
index 1ef2731..122be19 100644 (file)
@@ -9,5 +9,9 @@
        "ooui-outline-control-move-down": "Лаха яккха элемент",
        "ooui-outline-control-move-up": "Лаккха яккха элемент",
        "ooui-outline-control-remove": "ДӀадаха меттиг",
-       "ooui-toolbar-more": "Кхин тӀе"
+       "ooui-toolbar-more": "Кхин тӀе",
+       "ooui-dialog-confirm-title": "Бакъдан",
+       "ooui-dialog-confirm-default-prompt": "Бакъалла лаьий хӀуна?",
+       "ooui-dialog-confirm-default-ok": "ХӀаъ",
+       "ooui-dialog-confirm-default-cancel": "Цаоьшу"
 }
index 884a462..eadae99 100644 (file)
@@ -2,8 +2,12 @@
        "@metadata": {
                "authors": [
                        "Calak",
-                       "Muhammed taha"
+                       "Muhammed taha",
+                       "Serwan"
                ]
        },
-       "ooui-dialog-action-close": "دایخە"
+       "ooui-dialog-action-close": "دایخە",
+       "ooui-dialog-confirm-default-prompt": "ئایا تۆ دڵنیات ؟",
+       "ooui-dialog-confirm-default-ok": "باشە",
+       "ooui-dialog-confirm-default-cancel": "پاشگەزبوونەوە"
 }
index 9c69f49..ca6d5b4 100644 (file)
@@ -17,5 +17,9 @@
        "ooui-outline-control-move-down": "Přesunout položku dolů",
        "ooui-outline-control-move-up": "Přesunout položku nahoru",
        "ooui-outline-control-remove": "Odstranit položku",
-       "ooui-toolbar-more": "Další"
+       "ooui-toolbar-more": "Další",
+       "ooui-dialog-confirm-title": "Potvrzení",
+       "ooui-dialog-confirm-default-prompt": "Opravdu?",
+       "ooui-dialog-confirm-default-ok": "OK",
+       "ooui-dialog-confirm-default-cancel": "Storno"
 }
index 278c4b4..97ed48c 100644 (file)
@@ -17,5 +17,9 @@
        "ooui-outline-control-move-down": "Element nach unten verschieben",
        "ooui-outline-control-move-up": "Element nach oben verschieben",
        "ooui-outline-control-remove": "Element entfernen",
-       "ooui-toolbar-more": "Mehr"
+       "ooui-toolbar-more": "Mehr",
+       "ooui-dialog-confirm-title": "Bestätigen",
+       "ooui-dialog-confirm-default-prompt": "Bist du sicher?",
+       "ooui-dialog-confirm-default-ok": "Okay",
+       "ooui-dialog-confirm-default-cancel": "Abbrechen"
 }
index b2352ce..09415fd 100644 (file)
@@ -12,5 +12,6 @@
        "ooui-dialog-action-close": "Racnê",
        "ooui-outline-control-move-down": "Bendi bere cêr",
        "ooui-outline-control-move-up": "Bendi bere cor",
+       "ooui-outline-control-remove": "Obcey wedare",
        "ooui-toolbar-more": "Zewbi"
 }
diff --git a/resources/lib/oojs-ui/i18n/egl.json b/resources/lib/oojs-ui/i18n/egl.json
new file mode 100644 (file)
index 0000000..d4ef2d5
--- /dev/null
@@ -0,0 +1,17 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Lévi",
+                       "Gloria sah"
+               ]
+       },
+       "ooui-dialog-action-close": "Sèra",
+       "ooui-outline-control-move-down": "Spôsta in bâs",
+       "ooui-outline-control-move-up": "Spôsta in êlt",
+       "ooui-outline-control-remove": "Armōv l'elemèint",
+       "ooui-toolbar-more": "Êter",
+       "ooui-dialog-confirm-title": "Cunfermèr",
+       "ooui-dialog-confirm-default-prompt": "Sî-'v sicùr?",
+       "ooui-dialog-confirm-default-ok": "'D acòrdi",
+       "ooui-dialog-confirm-default-cancel": "Scanślèr"
+}
index 7f4874d..0b54f41 100644 (file)
@@ -7,6 +7,11 @@
        },
        "ooui-dialog-action-close": "Sèra",
        "ooui-outline-control-move-down": "Spôsta in bâs",
-       "ooui-outline-control-move-up": "Spôsta in êlt",
-       "ooui-toolbar-more": "Êter"
+       "ooui-outline-control-move-up": "Spôsta in êlta",
+       "ooui-outline-control-remove": "Tór vìa 'l elemèint",
+       "ooui-toolbar-more": "Êter",
+       "ooui-dialog-confirm-title": "Cunfirmèr",
+       "ooui-dialog-confirm-default-prompt": "Sî-'v sicùr?",
+       "ooui-dialog-confirm-default-ok": "'D acòrdi",
+       "ooui-dialog-confirm-default-cancel": "Scanślèr"
 }
index 5ff9915..2498a76 100644 (file)
@@ -20,5 +20,9 @@
     "ooui-outline-control-move-down": "Move item down",
     "ooui-outline-control-move-up": "Move item up",
     "ooui-outline-control-remove": "Remove item",
-    "ooui-toolbar-more": "More"
+    "ooui-toolbar-more": "More",
+    "ooui-dialog-confirm-title": "Confirm",
+    "ooui-dialog-confirm-default-prompt": "Are you sure?",
+    "ooui-dialog-confirm-default-ok": "OK",
+    "ooui-dialog-confirm-default-cancel": "Cancel"
 }
index 8cb2f01..76485ea 100644 (file)
                        "Jduranboger",
                        "PoLuX124",
                        "Ralgis",
-                       "Thehelpfulone"
+                       "Thehelpfulone",
+                       "Gloria sah"
                ]
        },
        "ooui-dialog-action-close": "Cerrar",
-       "ooui-outline-control-move-down": "Mover abajo",
-       "ooui-outline-control-move-up": "Mover arriba",
+       "ooui-outline-control-move-down": "Bajar elemento",
+       "ooui-outline-control-move-up": "Subir elemento",
        "ooui-outline-control-remove": "Eliminar elemento",
-       "ooui-toolbar-more": "Más"
+       "ooui-toolbar-more": "Más",
+       "ooui-dialog-confirm-title": "Confirmar",
+       "ooui-dialog-confirm-default-prompt": "¿Está seguro?",
+       "ooui-dialog-confirm-default-ok": "Aceptar",
+       "ooui-dialog-confirm-default-cancel": "Cancelar"
 }
index 03db1a8..164685c 100644 (file)
@@ -9,5 +9,9 @@
        "ooui-outline-control-move-down": "Liiguta üksust allapoole",
        "ooui-outline-control-move-up": "Liiguta üksust ülespoole",
        "ooui-outline-control-remove": "Eemalda üksus",
-       "ooui-toolbar-more": "Veel"
+       "ooui-toolbar-more": "Veel",
+       "ooui-dialog-confirm-title": "Kinnitus",
+       "ooui-dialog-confirm-default-prompt": "Kas oled kindel?",
+       "ooui-dialog-confirm-default-ok": "Sobib",
+       "ooui-dialog-confirm-default-cancel": "Loobu"
 }
index b2587ca..ec051ac 100644 (file)
@@ -17,5 +17,9 @@
        "ooui-outline-control-move-down": "انتقال مورد به پایین",
        "ooui-outline-control-move-up": "انتقال مورد به بالا",
        "ooui-outline-control-remove": "حذف مورد",
-       "ooui-toolbar-more": "بیشتر"
+       "ooui-toolbar-more": "بیشتر",
+       "ooui-dialog-confirm-title": "تأیید",
+       "ooui-dialog-confirm-default-prompt": "آیا مطمئن هستید؟",
+       "ooui-dialog-confirm-default-ok": "تأیید",
+       "ooui-dialog-confirm-default-cancel": "لغو"
 }
index bf05121..8e8b81e 100644 (file)
@@ -20,5 +20,9 @@
        "ooui-outline-control-move-down": "Siirrä kohdetta alaspäin",
        "ooui-outline-control-move-up": "Siirrä kohdetta ylöspäin",
        "ooui-outline-control-remove": "Poista kohde",
-       "ooui-toolbar-more": "Lisää"
+       "ooui-toolbar-more": "Lisää",
+       "ooui-dialog-confirm-title": "Vahvista",
+       "ooui-dialog-confirm-default-prompt": "Oletko varma?",
+       "ooui-dialog-confirm-default-ok": "OK",
+       "ooui-dialog-confirm-default-cancel": "Peruuta"
 }
index cc77b90..6b8871a 100644 (file)
@@ -32,5 +32,9 @@
        "ooui-outline-control-move-down": "Faire descendre l’élément",
        "ooui-outline-control-move-up": "Faire monter l’élément",
        "ooui-outline-control-remove": "Supprimer l’élément",
-       "ooui-toolbar-more": "Plus"
+       "ooui-toolbar-more": "Plus",
+       "ooui-dialog-confirm-title": "Confirmer",
+       "ooui-dialog-confirm-default-prompt": "Êtes-vous sûr ?",
+       "ooui-dialog-confirm-default-ok": "OK",
+       "ooui-dialog-confirm-default-cancel": "Annuler"
 }
index cd8c9f2..26660f9 100644 (file)
        "ooui-dialog-action-close": "סגירה",
        "ooui-outline-control-move-down": "להזיז את הפריט מטה",
        "ooui-outline-control-move-up": "להזיז את הפריט מעלה",
-       "ooui-outline-control-remove": "הסרת פריט",
-       "ooui-toolbar-more": "עוד"
+       "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": "ביטול"
 }
index b0a717a..5d9e3bb 100644 (file)
@@ -8,5 +8,9 @@
        "ooui-outline-control-move-down": "Ipababa ti banag",
        "ooui-outline-control-move-up": "Ipangato ti banag",
        "ooui-outline-control-remove": "Ikkaten ti banag",
-       "ooui-toolbar-more": "Adu pay"
+       "ooui-toolbar-more": "Adu pay",
+       "ooui-dialog-confirm-title": "Pasingkedan",
+       "ooui-dialog-confirm-default-prompt": "Siguradoka kadi?",
+       "ooui-dialog-confirm-default-ok": "Sige",
+       "ooui-dialog-confirm-default-cancel": "Ukasen"
 }
index ec9bd5e..162fa8c 100644 (file)
                        "Gianfranco",
                        "Minerva Titani",
                        "Raoli",
-                       "Una giornata uggiosa '94"
+                       "Una giornata uggiosa '94",
+                       "Ontsed"
                ]
        },
        "ooui-dialog-action-close": "Chiudi",
        "ooui-outline-control-move-down": "Sposta in basso",
        "ooui-outline-control-move-up": "Sposta in alto",
        "ooui-outline-control-remove": "Rimuovi elemento",
-       "ooui-toolbar-more": "Altro"
+       "ooui-toolbar-more": "Altro",
+       "ooui-dialog-confirm-title": "Conferma",
+       "ooui-dialog-confirm-default-prompt": "Sei sicuro?",
+       "ooui-dialog-confirm-default-ok": "OK",
+       "ooui-dialog-confirm-default-cancel": "Annulla"
 }
index aabe553..70c1e07 100644 (file)
@@ -11,5 +11,9 @@
        "ooui-outline-control-move-down": "項目を下に移動させる",
        "ooui-outline-control-move-up": "項目を上に移動させる",
        "ooui-outline-control-remove": "項目を除去",
-       "ooui-toolbar-more": "その他"
+       "ooui-toolbar-more": "その他",
+       "ooui-dialog-confirm-title": "確認",
+       "ooui-dialog-confirm-default-prompt": "本当によろしいですか?",
+       "ooui-dialog-confirm-default-ok": "OK",
+       "ooui-dialog-confirm-default-cancel": "キャンセル"
 }
index 73297b4..76b654b 100644 (file)
@@ -1,10 +1,15 @@
 {
        "@metadata": {
                "authors": [
-                       "Vikassy"
+                       "Vikassy",
+                       "Nayvik"
                ]
        },
        "ooui-dialog-action-close": "ಮುಚ್ಚಿ",
        "ooui-outline-control-remove": "ವಸ್ತು ತೆಗೆ",
-       "ooui-toolbar-more": "ಹೆಚ್ಚು"
+       "ooui-toolbar-more": "ಹೆಚ್ಚು",
+       "ooui-dialog-confirm-title": "ಧೃಡಪಡಿಸು",
+       "ooui-dialog-confirm-default-prompt": "ನೀವು ಖ‍ಚಿತವಾಗಿದ್ದೀರಾ?",
+       "ooui-dialog-confirm-default-ok": "ಸರಿ",
+       "ooui-dialog-confirm-default-cancel": "ರದ್ದು"
 }
index 8ce236e..afd8753 100644 (file)
@@ -5,12 +5,17 @@
                        "Hym411",
                        "Kwj2772",
                        "LFM",
-                       "아라"
+                       "아라",
+                       "고기랑"
                ]
        },
        "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-confirm-title": "확인",
+       "ooui-dialog-confirm-default-prompt": "확실합니까?",
+       "ooui-dialog-confirm-default-ok": "확인",
+       "ooui-dialog-confirm-default-cancel": "취소"
 }
index dfb3d22..18c66e9 100644 (file)
@@ -6,5 +6,7 @@
        },
        "ooui-dialog-action-close": "Джаб",
        "ooui-outline-control-move-down": "Элементни тюбюне кёчюр",
-       "ooui-outline-control-move-up": "Элементни башына кёчюр"
+       "ooui-outline-control-move-up": "Элементни башына кёчюр",
+       "ooui-outline-control-remove": "Пунктну кетер",
+       "ooui-toolbar-more": "Энтда"
 }
index 54c9245..e2e12ab 100644 (file)
@@ -14,5 +14,9 @@
        "ooui-outline-control-move-down": "Element erof réckelen",
        "ooui-outline-control-move-up": "Element erop réckelen",
        "ooui-outline-control-remove": "Element ewechhuelen",
-       "ooui-toolbar-more": "Méi"
+       "ooui-toolbar-more": "Méi",
+       "ooui-dialog-confirm-title": "Confirméieren",
+       "ooui-dialog-confirm-default-prompt": "Sidd Dir sécher?",
+       "ooui-dialog-confirm-default-ok": "OK",
+       "ooui-dialog-confirm-default-cancel": "Ofbriechen"
 }
diff --git a/resources/lib/oojs-ui/i18n/lzh.json b/resources/lib/oojs-ui/i18n/lzh.json
new file mode 100644 (file)
index 0000000..f296c3a
--- /dev/null
@@ -0,0 +1,8 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Joe young yu"
+               ]
+       },
+       "ooui-dialog-confirm-default-ok": "可"
+}
index 9918f8c..90685ea 100644 (file)
@@ -10,5 +10,9 @@
        "ooui-outline-control-move-down": "Помести надолу",
        "ooui-outline-control-move-up": "Помести нагоре",
        "ooui-outline-control-remove": "Отстрани ставка",
-       "ooui-toolbar-more": "Повеќе"
+       "ooui-toolbar-more": "Повеќе",
+       "ooui-dialog-confirm-title": "Потврди",
+       "ooui-dialog-confirm-default-prompt": "Дали сте сигурни?",
+       "ooui-dialog-confirm-default-ok": "ОК",
+       "ooui-dialog-confirm-default-cancel": "Откажи"
 }
index 03ffb8b..c2d9bc8 100644 (file)
@@ -2,12 +2,16 @@
        "@metadata": {
                "authors": [
                        "Anakmalaysia",
-                       "Aurora"
+                       "Aurora",
+                       "Pizza1016"
                ]
        },
        "ooui-dialog-action-close": "Tutup",
        "ooui-outline-control-move-down": "Alihkan perkara ke bawah",
        "ooui-outline-control-move-up": "Alihkan perkara ke atas",
        "ooui-outline-control-remove": "Buang perkara",
-       "ooui-toolbar-more": "Selebihnya"
+       "ooui-toolbar-more": "Selebihnya",
+       "ooui-dialog-confirm-title": "Mengesahkan",
+       "ooui-dialog-confirm-default-prompt": "Adakah anda pasti?",
+       "ooui-dialog-confirm-default-cancel": "Batal"
 }
index 6b7c78a..f7bbff4 100644 (file)
@@ -4,5 +4,10 @@
                        "RajeshPandey",
                        "सरोज कुमार ढकाल"
                ]
-       }
+       },
+       "ooui-dialog-action-close": "बन्द गर्ने",
+       "ooui-outline-control-move-down": "वस्तुलाई तल सार्ने",
+       "ooui-outline-control-move-up": "वस्तुलाई माथि सार्ने",
+       "ooui-outline-control-remove": "वस्तुलाई हटाउने",
+       "ooui-toolbar-more": "थप"
 }
index 2160937..dbae538 100644 (file)
                        "Siebrand",
                        "Southparkfan",
                        "सरोज कुमार ढकाल",
-                       "Sjoerddebruin"
+                       "Sjoerddebruin",
+                       "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-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"
 }
diff --git a/resources/lib/oojs-ui/i18n/oc.json b/resources/lib/oojs-ui/i18n/oc.json
new file mode 100644 (file)
index 0000000..a7f43a3
--- /dev/null
@@ -0,0 +1,16 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Cedric31",
+                       "Gloria sah"
+               ]
+       },
+       "ooui-dialog-action-close": "Tampar",
+       "ooui-outline-control-move-down": "Far davalar l’element",
+       "ooui-outline-control-move-up": "Far montar l’element",
+       "ooui-outline-control-remove": "Suprimir l’element",
+       "ooui-toolbar-more": "Mai",
+       "ooui-dialog-confirm-title": "Confirmar",
+       "ooui-dialog-confirm-default-prompt": "Sètz segur ?",
+       "ooui-dialog-confirm-default-cancel": "Anullar"
+}
index 0ee623e..b51f70d 100644 (file)
@@ -8,5 +8,8 @@
        "ooui-outline-control-move-down": "Bweeschs nunna",
        "ooui-outline-control-move-up": "Bweeschs nuff",
        "ooui-outline-control-remove": "Leschs",
-       "ooui-toolbar-more": "Mea"
+       "ooui-toolbar-more": "Mea",
+       "ooui-dialog-confirm-default-prompt": "Bischda sischa?",
+       "ooui-dialog-confirm-default-ok": "OK",
+       "ooui-dialog-confirm-default-cancel": "Abbresche"
 }
index 907e550..bea0c3a 100644 (file)
                        "WTM",
                        "Woytecr",
                        "Wpedzich",
-                       "Jacenty359"
+                       "Jacenty359",
+                       "Matik7",
+                       "Gloria sah",
+                       "Andrzej aa"
                ]
        },
        "ooui-dialog-action-close": "Zamknij",
        "ooui-outline-control-move-down": "Przenieś niżej",
        "ooui-outline-control-move-up": "Przenieś wyżej",
        "ooui-outline-control-remove": "Usuń element",
-       "ooui-toolbar-more": "Więcej"
+       "ooui-toolbar-more": "Więcej",
+       "ooui-dialog-confirm-title": "Potwierdź",
+       "ooui-dialog-confirm-default-prompt": "Jesteś pewien?",
+       "ooui-dialog-confirm-default-ok": "OK",
+       "ooui-dialog-confirm-default-cancel": "Anuluj"
 }
index 2527af2..e9ad6de 100644 (file)
@@ -17,5 +17,9 @@
        "ooui-outline-control-move-down": "Mover item para baixo",
        "ooui-outline-control-move-up": "Mover item para cima",
        "ooui-outline-control-remove": "Remover elemento",
-       "ooui-toolbar-more": "Mais"
+       "ooui-toolbar-more": "Mais",
+       "ooui-dialog-confirm-title": "Confirmar",
+       "ooui-dialog-confirm-default-prompt": "Tem a certeza?",
+       "ooui-dialog-confirm-default-ok": "Aceitar",
+       "ooui-dialog-confirm-default-cancel": "Cancelar"
 }
index d433fe1..87198e5 100644 (file)
@@ -23,5 +23,9 @@
        "ooui-outline-control-move-down": "Tool tip for a button that moves items in a list down one place",
        "ooui-outline-control-move-up": "Tool tip for a button that moves items in a list up one place",
        "ooui-outline-control-remove": "Tool tip for a button that removes items from a list.\n{{Identical|Remove item}}",
-       "ooui-toolbar-more": "Label for the toolbar group that contains a list of all other available tools.\n{{Identical|More}}"
+       "ooui-toolbar-more": "Label for the toolbar group that contains a list of all other available tools.\n{{Identical|More}}",
+       "ooui-dialog-confirm-title": "Title of the generic dialog used to confirm things.\n{{Identical|Confirm}}",
+       "ooui-dialog-confirm-default-prompt": "The default prompt of a confirmation dialog.\n{{Identical|Are you sure?}}",
+       "ooui-dialog-confirm-default-ok": "The default OK button text on a confirmation dialog.\n{{Identical|OK}}",
+       "ooui-dialog-confirm-default-cancel": "The default cancel button text on a confirmation dialog.\n{{Identical|Cancel}}"
 }
index b1bfb32..0181514 100644 (file)
@@ -4,12 +4,17 @@
                        "AlimanRuna",
                        "Firilacroco",
                        "Minisarm",
-                       "Stelistcristi"
+                       "Stelistcristi",
+                       "Gloria sah"
                ]
        },
        "ooui-dialog-action-close": "Închide",
        "ooui-outline-control-move-down": "Mută elementul mai jos",
        "ooui-outline-control-move-up": "Mută elementul mai sus",
        "ooui-outline-control-remove": "Elimină elementul",
-       "ooui-toolbar-more": "Mai mult"
+       "ooui-toolbar-more": "Mai mult",
+       "ooui-dialog-confirm-title": "Confirmare",
+       "ooui-dialog-confirm-default-prompt": "Sunteți sigur(ă)?",
+       "ooui-dialog-confirm-default-ok": "OK",
+       "ooui-dialog-confirm-default-cancel": "Revocare"
 }
index edb96a4..435f20c 100644 (file)
@@ -22,5 +22,9 @@
        "ooui-outline-control-move-down": "Переместить элемент вниз",
        "ooui-outline-control-move-up": "Переместить элемент вверх",
        "ooui-outline-control-remove": "Удалить пункт",
-       "ooui-toolbar-more": "Ещё"
+       "ooui-toolbar-more": "Ещё",
+       "ooui-dialog-confirm-title": "Подтвердить",
+       "ooui-dialog-confirm-default-prompt": "Вы уверены?",
+       "ooui-dialog-confirm-default-ok": "ОК",
+       "ooui-dialog-confirm-default-cancel": "Отмена"
 }
index 6297b85..a063cc8 100644 (file)
@@ -3,11 +3,13 @@
                "authors": [
                        "Gazeb",
                        "Gmelfi",
-                       "HalanTul"
+                       "HalanTul",
+                       "Gloria sah"
                ]
        },
        "ooui-dialog-action-close": "Chiùi",
        "ooui-outline-control-move-down": "Sposta di sutta",
        "ooui-outline-control-move-up": "Sposta di supra",
-       "ooui-toolbar-more": "Àutri cosi"
+       "ooui-toolbar-more": "Àutri cosi",
+       "ooui-dialog-confirm-title": "Cunferma"
 }
index 2dcb198..085f908 100644 (file)
@@ -7,6 +7,6 @@
        "ooui-dialog-action-close": "Claise",
        "ooui-outline-control-move-down": "Muiv eetem doon",
        "ooui-outline-control-move-up": "Muiv eetem up",
-       "ooui-outline-control-remove": "Remuiv eitem",
+       "ooui-outline-control-remove": "Remuiv eetem",
        "ooui-toolbar-more": "Mair"
 }
index 5e46ab6..44dfd60 100644 (file)
@@ -3,12 +3,17 @@
                "authors": [
                        "Euriditi",
                        "Kushtrim",
-                       "Elioqoshi"
+                       "Elioqoshi",
+                       "GretaDoci"
                ]
        },
        "ooui-dialog-action-close": "Mbylle",
        "ooui-outline-control-move-down": "Zhvendose artikullin më poshtë",
        "ooui-outline-control-move-up": "Zhvendose artikullin më lart",
        "ooui-outline-control-remove": "Hiq artikullin",
-       "ooui-toolbar-more": "Më tepër..."
+       "ooui-toolbar-more": "Më tepër...",
+       "ooui-dialog-confirm-title": "Konfirmo",
+       "ooui-dialog-confirm-default-prompt": "A jeni i sigurt?",
+       "ooui-dialog-confirm-default-ok": "Në rregull",
+       "ooui-dialog-confirm-default-cancel": "Anullo"
 }
index 889f623..08bbb59 100644 (file)
@@ -10,5 +10,8 @@
        "ooui-outline-control-move-down": "Премести ставку на доле",
        "ooui-outline-control-move-up": "Премести ставку на горе",
        "ooui-outline-control-remove": "Уклони ставку",
-       "ooui-toolbar-more": "Више"
+       "ooui-toolbar-more": "Више",
+       "ooui-dialog-confirm-title": "Потврди",
+       "ooui-dialog-confirm-default-ok": "У реду",
+       "ooui-dialog-confirm-default-cancel": "Откажи"
 }
diff --git a/resources/lib/oojs-ui/i18n/sr-el.json b/resources/lib/oojs-ui/i18n/sr-el.json
new file mode 100644 (file)
index 0000000..1f2da2d
--- /dev/null
@@ -0,0 +1,12 @@
+{
+       "@metadata": {
+               "authors": [
+                       "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"
+}
index 244a196..fbd03de 100644 (file)
@@ -18,5 +18,9 @@
        "ooui-outline-control-move-down": "Flytta ned objekt",
        "ooui-outline-control-move-up": "Flytta upp objekt",
        "ooui-outline-control-remove": "Ta bort objekt",
-       "ooui-toolbar-more": "Mer"
+       "ooui-toolbar-more": "Mer",
+       "ooui-dialog-confirm-title": "Bekräfta",
+       "ooui-dialog-confirm-default-prompt": "Är du säker?",
+       "ooui-dialog-confirm-default-ok": "OK",
+       "ooui-dialog-confirm-default-cancel": "Avbryt"
 }
diff --git a/resources/lib/oojs-ui/i18n/tg-cyrl.json b/resources/lib/oojs-ui/i18n/tg-cyrl.json
new file mode 100644 (file)
index 0000000..908c894
--- /dev/null
@@ -0,0 +1,12 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Ibrahim"
+               ]
+       },
+       "ooui-dialog-action-close": "Пӯшиш",
+       "ooui-outline-control-move-down": "Ҳаракати мавод ба поён",
+       "ooui-outline-control-move-up": "Ҳаракати мавод ба боло",
+       "ooui-outline-control-remove": "Ҳазви мавод",
+       "ooui-toolbar-more": "Бештар"
+}
index 8a295f4..178384c 100644 (file)
@@ -8,5 +8,10 @@
        "ooui-dialog-action-close": "Isara",
        "ooui-outline-control-move-down": "Ilipat ang aytem pababa",
        "ooui-outline-control-move-up": "Ilipat ang aytem pataas",
-       "ooui-toolbar-more": "Marami pa"
+       "ooui-outline-control-remove": "Tanggalin ang aytem",
+       "ooui-toolbar-more": "Marami pa",
+       "ooui-dialog-confirm-title": "Tiyakin",
+       "ooui-dialog-confirm-default-prompt": "Nakatitiyak ka ba?",
+       "ooui-dialog-confirm-default-ok": "Sige",
+       "ooui-dialog-confirm-default-cancel": "Huwag ituloy"
 }
index dde9316..1a91cdb 100644 (file)
@@ -2,11 +2,14 @@
        "@metadata": {
                "authors": [
                        "Candalua",
-                       "GatoSelvadego"
+                       "GatoSelvadego",
+                       "Gloria sah"
                ]
        },
        "ooui-dialog-action-close": "Sara",
        "ooui-outline-control-move-down": "Sposta in baso",
        "ooui-outline-control-move-up": "Sposta in sima",
-       "ooui-toolbar-more": "Altro"
+       "ooui-toolbar-more": "Altro",
+       "ooui-dialog-confirm-title": "Conferma",
+       "ooui-dialog-confirm-default-ok": "Va ben"
 }
index 377c254..9cc4543 100644 (file)
@@ -10,5 +10,9 @@
        "ooui-outline-control-move-down": "Chuyển mục xuống",
        "ooui-outline-control-move-up": "Chuyển mục lên",
        "ooui-outline-control-remove": "Xóa khoản",
-       "ooui-toolbar-more": "Thêm"
+       "ooui-toolbar-more": "Thêm",
+       "ooui-dialog-confirm-title": "Xác nhận",
+       "ooui-dialog-confirm-default-prompt": "Bạn có chắc chắn?",
+       "ooui-dialog-confirm-default-ok": "OK",
+       "ooui-dialog-confirm-default-cancel": "Hủy bỏ"
 }
index 0eec396..01a22d1 100644 (file)
@@ -9,5 +9,10 @@
        "ooui-dialog-action-close": "שליסן",
        "ooui-outline-control-move-down": "רוקן עלעמענט אראפ",
        "ooui-outline-control-move-up": "רוקן עלעמענט ארויף",
-       "ooui-toolbar-more": "נאך"
+       "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": "אַנולירן"
 }
index b5796ee..8d1c09f 100644 (file)
@@ -22,5 +22,9 @@
        "ooui-outline-control-move-down": "下移项",
        "ooui-outline-control-move-up": "上移项",
        "ooui-outline-control-remove": "删除项",
-       "ooui-toolbar-more": "更多"
+       "ooui-toolbar-more": "更多",
+       "ooui-dialog-confirm-title": "确认",
+       "ooui-dialog-confirm-default-prompt": "您确定吗?",
+       "ooui-dialog-confirm-default-ok": "好",
+       "ooui-dialog-confirm-default-cancel": "取消"
 }
index da9bacc..255658b 100644 (file)
                        "Shirayuki",
                        "Simon Shek",
                        "Spring Roll Conan",
-                       "Waihorace"
+                       "Waihorace",
+                       "Cwlin0416"
                ]
        },
        "ooui-dialog-action-close": "關閉",
-       "ooui-outline-control-move-down": "向下移項",
-       "ooui-outline-control-move-up": "向上移項",
-       "ooui-outline-control-remove": "移除項",
-       "ooui-toolbar-more": "更多"
+       "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": "取消"
 }
diff --git a/resources/lib/oojs-ui/images/fade-down.png b/resources/lib/oojs-ui/images/fade-down.png
deleted file mode 100644 (file)
index 50c7931..0000000
Binary files a/resources/lib/oojs-ui/images/fade-down.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/images/fade-up.png b/resources/lib/oojs-ui/images/fade-up.png
deleted file mode 100644 (file)
index 7a0cb87..0000000
Binary files a/resources/lib/oojs-ui/images/fade-up.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/images/icons/info.png b/resources/lib/oojs-ui/images/icons/info.png
new file mode 100644 (file)
index 0000000..f43804d
Binary files /dev/null and b/resources/lib/oojs-ui/images/icons/info.png differ
diff --git a/resources/lib/oojs-ui/images/icons/info.svg b/resources/lib/oojs-ui/images/icons/info.svg
new file mode 100644 (file)
index 0000000..8c5672a
--- /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="0px" y="0px" width="24" height="24" viewBox="0, 0, 24, 24">
+  <g id="help" opacity="0.75">
+    <path d="M11.499,17 C8.463,17 6,14.536 6,11.5 C6,8.463 8.462,6 11.499,6 C14.536,6 17,8.462 17,11.5 C17,14.536 14.536,17 11.499,17 z M11.501,5 C7.91,5 5,7.91 5,11.5 C5,15.09 7.91,18 11.501,18 C15.089,18 18,15.089 18,11.5 C18,7.911 15.089,5 11.501,5 z" fill="#000000"/>
+    <path d="M12,10 L12,14 L13,14 L13,15 L10,15 L10,14 L11,14 L11,11 L10,11 L10,10 z" fill="#000000"/>
+    <path d="M11,8 L12,8 L12,9 L11,9 z" fill="#000000"/>
+  </g>
+  <defs/>
+</svg>
diff --git a/resources/lib/oojs-ui/images/indicators/alert.png b/resources/lib/oojs-ui/images/indicators/alert.png
new file mode 100644 (file)
index 0000000..bfc83e7
Binary files /dev/null and b/resources/lib/oojs-ui/images/indicators/alert.png differ
diff --git a/resources/lib/oojs-ui/images/indicators/alert.svg b/resources/lib/oojs-ui/images/indicators/alert.svg
new file mode 100644 (file)
index 0000000..8ce4b25
--- /dev/null
@@ -0,0 +1,8 @@
+<?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="0px" y="0px" width="12" height="12" viewBox="0, 0, 12, 12">
+  <g id="deprecated" opacity="0.75">
+    <path d="M6,12 C2.686,12 -0,9.314 -0,6 C-0,2.686 2.686,-0 6,-0 C9.314,-0 12,2.686 12,6 C12,9.314 9.314,12 6,12 z M5,7 L7,7 L7,2 L5,2 z M5,10 L7,10 L7,8 L5,8 z" fill="#000000"/>
+  </g>
+  <defs/>
+</svg>
index aeb35a3..d10e0d4 100644 (file)
Binary files a/resources/lib/oojs-ui/images/indicators/required.png and b/resources/lib/oojs-ui/images/indicators/required.png differ
index 7c60ec0..ee1baf7 100644 (file)
@@ -2,7 +2,9 @@
 <!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="0px" y="0px" width="12" height="12" viewBox="0, 0, 12, 12">
   <g id="required" opacity="0.75">
-    <path d="M7,0 L7,4.268 L10.696,2.134 L11.696,3.866 L8,6 L11.696,8.134 L10.696,9.866 L7,7.732 L7,12 L5,12 L5,7.732 L1.304,9.866 L0.304,8.134 L4,6 L0.304,3.866 L1.304,2.134 L5,4.268 L5,0 z" fill="#000000"/>
+    <path d="M5,1 L7,1 L7,11 L5,11 z" fill="#000000"/>
+    <path d="M9.83,2.634 L10.83,4.366 L2.17,9.366 L1.17,7.634 z" fill="#000000"/>
+    <path d="M1.17,4.366 L2.17,2.634 L10.83,7.634 L9.83,9.366 z" fill="#000000"/>
   </g>
   <defs/>
 </svg>
index 8aedde5..47fce7a 100644 (file)
@@ -1,6 +1,51 @@
+.oo-ui-dialog-content .oo-ui-window-closeButton {
+  position: absolute;
+  top: 0;
+  left: 0;
+}
+
+.oo-ui-dialog-content .oo-ui-window-icon {
+  margin-left: 3.35em;
+}
+
+.oo-ui-dialog-content .oo-ui-window-body {
+  position: absolute;
+  top: 3.35em;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  overflow-y: auto;
+}
+
+.oo-ui-dialog-content .oo-ui-window-foot {
+  position: absolute;
+  top: 0;
+  right: 0;
+  height: 3.35em;
+}
+
+.oo-ui-dialog-content .oo-ui-window-foot .oo-ui-buttonedElement-button {
+  height: 100%;
+}
+
+.oo-ui-dialog-content .oo-ui-window-foot .oo-ui-buttonedElement-button .oo-ui-labeledElement-label {
+  display: inline-block;
+  width: 0;
+  text-indent: -9999px;
+}
+
+.oo-ui-dialog-medium .oo-ui-window-frame {
+  top: 0;
+  bottom: 0;
+  background-color: white;
+}
+
 .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-window-body {
   background-size: 2em auto;
 }
 
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
+  padding: 0 0 1em;
+}
+
 .oo-ui-optionWidget {
   padding: 0.8em 1em 0.8em 3.35em;
   font-weight: bold;
 .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 b6e8d3a..e915ee8 100644 (file)
@@ -9,7 +9,51 @@
           transition: all 250ms ease-in-out;
 }
 
-.oo-ui-dialog .oo-ui-window-frame {
+.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;
+  height: 3.8em;
+  padding: 0.5em;
+}
+
+.oo-ui-dialog-content .oo-ui-window-title {
+  line-height: 2.8em;
+}
+
+.oo-ui-dialog-content .oo-ui-window-icon {
+  width: 2.4em;
+  height: 2.8em;
+  line-height: 2.8em;
+}
+
+.oo-ui-dialog-content .oo-ui-window-closeButton {
+  float: right;
+  margin: 0.25em 0.25em;
+}
+
+.oo-ui-dialog-content .oo-ui-window-body {
+  top: 3.8em;
+  bottom: 4.8em;
+}
+
+.oo-ui-dialog-content-footless .oo-ui-window-body {
+  bottom: 0;
+}
+
+.oo-ui-dialog > .oo-ui-window-frame {
+  top: 1em;
+  bottom: 1em;
   background-color: #fff;
   border: solid 1px #ccc;
   border-radius: 0.5em;
           transition: all 250ms ease-in-out;
 }
 
+.oo-ui-dialog-small > .oo-ui-window-frame {
+  width: 400px;
+  max-height: 230px;
+}
+
+.oo-ui-dialog-medium > .oo-ui-window-frame {
+  width: 600px;
+  max-height: 460px;
+}
+
+.oo-ui-dialog-large > .oo-ui-window-frame {
+  width: 800px;
+  max-height: 690px;
+}
+
 .oo-ui-dialog-open {
   opacity: 1;
 }
 
-.oo-ui-dialog-open .oo-ui-window-frame {
+.oo-ui-dialog-open .oo-ui-window-frame {
   -webkit-transform: scale(1);
      -moz-transform: scale(1);
       -ms-transform: scale(1);
           transform: scale(1);
 }
 
+.oo-ui-dialog-content .oo-ui-window-head,
+.oo-ui-dialog-content .oo-ui-window-foot {
+  z-index: 1;
+}
+
 .oo-ui-dialog-content .oo-ui-window-body {
+  z-index: 2;
   box-shadow: 0 0 0.66em rgba(0, 0, 0, 0.25);
 }
 
+.oo-ui-dialog-content .oo-ui-window-foot {
+  bottom: 0;
+  height: 4.8em;
+  padding: 1em;
+}
+
+.oo-ui-dialog-content .oo-ui-window-foot .oo-ui-buttonedElement-framed {
+  margin: 0.125em 0.25em;
+}
+
+.oo-ui-dialog-content .oo-ui-window-overlay {
+  z-index: 3;
+}
+
 .oo-ui-frame-content {
   font-family: sans-serif;
   font-size: 0.8em;
 }
 
 .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));
   box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.07);
 }
 
+.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-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-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));
   box-shadow: none;
 }
 
-.oo-ui-bookletLayout > .oo-ui-gridLayout > .oo-ui-panelLayout {
-  -webkit-transition: width 250ms ease-in-out, height 250ms ease-in-out, top 250ms ease-in-out, left 250ms ease-in-out;
-     -moz-transition: width 250ms ease-in-out, height 250ms ease-in-out, top 250ms ease-in-out, left 250ms ease-in-out;
-      -ms-transition: width 250ms ease-in-out, height 250ms ease-in-out, top 250ms ease-in-out, left 250ms ease-in-out;
-       -o-transition: width 250ms ease-in-out, height 250ms ease-in-out, top 250ms ease-in-out, left 250ms ease-in-out;
-          transition: width 250ms ease-in-out, height 250ms ease-in-out, top 250ms ease-in-out, left 250ms ease-in-out;
+.oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
+  padding: 1.5em;
 }
 
 .oo-ui-bookletLayout-outlinePanel {
   font-size: 1.5em;
 }
 
+.oo-ui-panelLayout {
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+}
+
+.oo-ui-panelLayout-padded {
+  padding: 2em;
+}
+
 .oo-ui-barToolGroup .oo-ui-tool {
   margin: -1px 0 -1px -1px;
   border: solid 1px transparent;
   padding-right: 1.5em;
 }
 
+.oo-ui-outlineItemWidget.oo-ui-indicatedElement .oo-ui-indicatedElement-indicator {
+  opacity: 0.5;
+}
+
 .oo-ui-outlineItemWidget-level-0 {
   padding-left: 3.5em;
 }
   font-style: italic;
 }
 
-.oo-ui-outlineItemWidget.oo-ui-flaggableElement-empty .oo-ui-iconedElement-icon,
-.oo-ui-outlineItemWidget.oo-ui-flaggableElement-empty .oo-ui-indicatedElement-indicator {
+.oo-ui-outlineItemWidget.oo-ui-flaggableElement-empty .oo-ui-iconedElement-icon {
   opacity: 0.5;
 }
 
index bed97f3..0dcadd4 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (9d291a9222)
+ * OOjs UI v0.1.0-pre (7b283a9dcc)
  * 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: Wed Apr 16 2014 18:45:32 GMT-0700 (PDT)
+ * Date: Tue May 27 2014 15:41:42 GMT-0700 (PDT)
  */
 ( function ( OO ) {
 
@@ -112,7 +112,16 @@ var messages = {
        // Tool tip for a button that removes items from a list
        'ooui-outline-control-remove': 'Remove item',
        // Label for the toolbar group that contains a list of all other available tools
-       'ooui-toolbar-more': 'More'
+       'ooui-toolbar-more': 'More',
+
+       // Label for the generic dialog used to confirm things
+       'ooui-dialog-confirm-title': 'Confirm',
+       // The default prompt of a confirmation dialog
+       'ooui-dialog-confirm-default-prompt': 'Are you sure?',
+       // The default OK button text on a confirmation dialog
+       'ooui-dialog-confirm-default-ok': 'OK',
+       // The default cancel button text on a confirmation dialog
+       'ooui-dialog-confirm-default-cancel': 'Cancel'
 };
 
 /**
@@ -173,7 +182,8 @@ OO.ui.resolveMsg = function ( msg ) {
  * @param {Object} [config] Configuration options
  * @cfg {Function} [$] jQuery for the frame the widget is in
  * @cfg {string[]} [classes] CSS class names
- * @cfg {jQuery} [$content] Content elements to append
+ * @cfg {string} [text] Text to insert
+ * @cfg {jQuery} [$content] Content elements to append (after text)
  */
 OO.ui.Element = function OoUiElement( config ) {
        // Configuration initialization
@@ -188,6 +198,9 @@ OO.ui.Element = function OoUiElement( config ) {
        if ( $.isArray( config.classes ) ) {
                this.$element.addClass( config.classes.join( ' ' ) );
        }
+       if ( config.text ) {
+               this.$element.text( config.text );
+       }
        if ( config.$content ) {
                this.$element.append( config.$content );
        }
@@ -556,8 +569,6 @@ OO.ui.Element.prototype.getElementWindow = function () {
 
 /**
  * Get closest scrollable container.
- *
- * @see #static-method-getClosestScrollableContainer
  */
 OO.ui.Element.prototype.getClosestScrollableElementContainer = function () {
        return OO.ui.Element.getClosestScrollableContainer( this.$element[0] );
@@ -586,7 +597,6 @@ OO.ui.Element.prototype.setElementGroup = function ( group ) {
 /**
  * Scroll element into view.
  *
- * @see #static-method-scrollIntoView
  * @param {Object} [config={}]
  */
 OO.ui.Element.prototype.scrollElementIntoView = function ( config ) {
@@ -595,7 +605,7 @@ OO.ui.Element.prototype.scrollElementIntoView = function ( config ) {
 
 /**
  * Bind a handler for an event on this.$element
- * @see #static-method-onDOMEvent
+ *
  * @param {string} event
  * @param {Function} callback
  */
@@ -605,7 +615,7 @@ OO.ui.Element.prototype.onDOMEvent = function ( event, callback ) {
 
 /**
  * Unbind a handler bound with #offDOMEvent
- * @see #static-method-offDOMEvent
+ *
  * @param {string} event
  * @param {Function} callback
  */
@@ -615,32 +625,52 @@ OO.ui.Element.prototype.offDOMEvent = function ( event, callback ) {
 
 ( function () {
        // Static
-       var specialFocusin;
 
-       function handler( e ) {
-               jQuery.event.simulate( 'focusin', e.target, jQuery.event.fix( e ), /* bubble = */ true );
-       }
+       // jQuery 1.8.3 has a bug with handling focusin/focusout events inside iframes.
+       // Firefox doesn't support focusin/focusout at all, so we listen for 'focus'/'blur' on the
+       // document, and simulate a 'focusin'/'focusout' event on the target element and make
+       // it bubble from there.
+       //
+       // - http://jsfiddle.net/sw3hr/
+       // - http://bugs.jquery.com/ticket/14180
+       // - https://github.com/jquery/jquery/commit/1cecf64e5aa4153
+       function specialEvent( simulatedName, realName ) {
+               function handler( e ) {
+                       jQuery.event.simulate(
+                               simulatedName,
+                               e.target,
+                               jQuery.event.fix( e ),
+                               /* bubble = */ true
+                       );
+               }
 
-       specialFocusin = {
-               setup: function () {
-                       var doc = this.ownerDocument || this,
-                               attaches = $.data( doc, 'ooui-focusin-attaches' );
-                       if ( !attaches ) {
-                               doc.addEventListener( 'focus', handler, true );
-                       }
-                       $.data( doc, 'ooui-focusin-attaches', ( attaches || 0 ) + 1 );
-               },
-               teardown: function () {
-                       var doc = this.ownerDocument || this,
-                               attaches = $.data( doc, 'ooui-focusin-attaches' ) - 1;
-                       if ( !attaches ) {
-                               doc.removeEventListener( 'focus', handler, true );
-                               $.removeData( doc, 'ooui-focusin-attaches' );
-                       } else {
-                               $.data( doc, 'ooui-focusin-attaches', attaches );
+               return {
+                       setup: function () {
+                               var doc = this.ownerDocument || this,
+                                       attaches = $.data( doc, 'ooui-' + simulatedName + '-attaches' );
+                               if ( !attaches ) {
+                                       doc.addEventListener( realName, handler, true );
+                               }
+                               $.data( doc, 'ooui-' + simulatedName + '-attaches', ( attaches || 0 ) + 1 );
+                       },
+                       teardown: function () {
+                               var doc = this.ownerDocument || this,
+                                       attaches = $.data( doc, 'ooui-' + simulatedName + '-attaches' ) - 1;
+                               if ( !attaches ) {
+                                       doc.removeEventListener( realName, handler, true );
+                                       $.removeData( doc, 'ooui-' + simulatedName + '-attaches' );
+                               } else {
+                                       $.data( doc, 'ooui-' + simulatedName + '-attaches', attaches );
+                               }
                        }
-               }
-       };
+               };
+       }
+
+       var hasOwn = Object.prototype.hasOwnProperty,
+               specialEvents = {
+                       focusin: specialEvent( 'focusin', 'focus' ),
+                       focusout: specialEvent( 'focusout', 'blur' )
+               };
 
        /**
         * Bind a handler for an event on a DOM element.
@@ -657,25 +687,15 @@ OO.ui.Element.prototype.offDOMEvent = function ( event, callback ) {
        OO.ui.Element.onDOMEvent = function ( el, event, callback ) {
                var orig;
 
-               if ( event === 'focusin' ) {
-                       // jQuery 1.8.3 has a bug with handling focusin events inside iframes.
-                       // Firefox doesn't support focusin at all, so we listen for 'focus' on the
-                       // document, and simulate a 'focusin' event on the target element and make
-                       // it bubble from there.
-                       //
-                       // - http://jsfiddle.net/sw3hr/
-                       // - http://bugs.jquery.com/ticket/14180
-                       // - https://github.com/jquery/jquery/commit/1cecf64e5aa4153
-
+               if ( hasOwn.call( specialEvents, event ) ) {
                        // Replace jQuery's override with our own
-                       orig = $.event.special.focusin;
-                       $.event.special.focusin = specialFocusin;
+                       orig = $.event.special[event];
+                       $.event.special[event] = specialEvents[event];
 
                        $( el ).on( event, callback );
 
                        // Restore
-                       $.event.special.focusin = orig;
-
+                       $.event.special[event] = orig;
                } else {
                        $( el ).on( event, callback );
                }
@@ -691,11 +711,15 @@ OO.ui.Element.prototype.offDOMEvent = function ( event, callback ) {
         */
        OO.ui.Element.offDOMEvent = function ( el, event, callback ) {
                var orig;
-               if ( event === 'focusin' ) {
-                       orig = $.event.special.focusin;
-                       $.event.special.focusin = specialFocusin;
+               if ( hasOwn.call( specialEvents, event ) ) {
+                       // Replace jQuery's override with our own
+                       orig = $.event.special[event];
+                       $.event.special[event] = specialEvents[event];
+
                        $( el ).off( event, callback );
-                       $.event.special.focusin = orig;
+
+                       // Restore
+                       $.event.special[event] = orig;
                } else {
                        $( el ).off( event, callback );
                }
@@ -881,7 +905,7 @@ OO.ui.Frame.prototype.load = function () {
        this.loading = true;
 
        // Figure out directionality:
-       this.dir = this.$element.closest( '[dir]' ).prop( 'dir' ) || 'ltr';
+       this.dir = OO.ui.Element.getDir( this.$element ) || 'ltr';
 
        // Initialize contents
        doc.open();
@@ -962,6 +986,7 @@ OO.ui.Frame.prototype.setSize = function ( width, height ) {
  * @fires initialize
  */
 OO.ui.Window = function OoUiWindow( config ) {
+       var element = this;
        // Parent constructor
        OO.ui.Window.super.call( this, config );
 
@@ -992,7 +1017,14 @@ OO.ui.Window = function OoUiWindow( config ) {
                .append( this.frame.$element );
 
        // Events
-       this.frame.connect( this, { 'load': 'initialize' } );
+       this.frame.on( 'load', function () {
+               element.initialize();
+               // 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).
+               element.$element.hide().css( 'visibility', '' );
+       } );
 };
 
 /* Setup */
@@ -1237,12 +1269,6 @@ OO.ui.Window.prototype.initialize = function () {
                this.$overlay
        );
 
-       // Undo the visibility: hidden; hack from the constructor and apply display: none;
-       // We can do this safely now that the iframe has initialized
-       this.$element.hide().css( 'visibility', '' );
-
-       this.emit( 'initialize' );
-
        return this;
 };
 
@@ -1282,7 +1308,9 @@ OO.ui.Window.prototype.teardown = function () {
  * Do not override this method. See #setup for a way to make changes each time the window opens.
  *
  * @param {Object} [data] Window opening data
+ * @fires opening
  * @fires open
+ * @fires ready
  * @chainable
  */
 OO.ui.Window.prototype.open = function ( data ) {
@@ -1293,13 +1321,16 @@ OO.ui.Window.prototype.open = function ( data ) {
                        this.visible = true;
                        this.emit( 'opening', data );
                        this.setup( data );
-                       // Focus the content div (which has a tabIndex) to inactivate
-                       // (but not clear) selections in the parent frame.
-                       // Must happen after setup runs (otherwise focusing it doesn't work)
-                       // but before 'open' is emitted (so subclasses can give focus to something else)
-                       this.frame.$content.focus();
                        this.emit( 'open', data );
-                       this.opening = false;
+                       setTimeout( OO.ui.bind( function () {
+                               // Focus the content div (which has a tabIndex) to inactivate
+                               // (but not clear) selections in the parent frame.
+                               // Must happen after 'open' is emitted (to ensure it is visible)
+                               // but before 'ready' is emitted (so subclasses can give focus to something else)
+                               this.frame.$content.focus();
+                               this.emit( 'ready', data );
+                               this.opening = false;
+                       }, this ) );
                }, this ) );
        }
 
@@ -1312,6 +1343,7 @@ OO.ui.Window.prototype.open = function ( data ) {
  * See #teardown for a way to do something each time the window closes.
  *
  * @param {Object} [data] Window closing data
+ * @fires closing
  * @fires close
  * @chainable
  */
@@ -1535,6 +1567,7 @@ OO.ui.Dialog = function OoUiDialog( config ) {
        this.visible = false;
        this.footless = !!config.footless;
        this.size = null;
+       this.pending = 0;
        this.onWindowMouseWheelHandler = OO.ui.bind( this.onWindowMouseWheel, this );
        this.onDocumentKeyDownHandler = OO.ui.bind( this.onDocumentKeyDown, this );
 
@@ -1721,6 +1754,49 @@ OO.ui.Dialog.prototype.close = function ( data ) {
                }, 250 );
        }
 };
+
+/**
+ * Check if input is pending.
+ *
+ * @return {boolean}
+ */
+OO.ui.Dialog.prototype.isPending = function () {
+       return !!this.pending;
+};
+
+/**
+ * Increase the pending stack.
+ *
+ * @chainable
+ */
+OO.ui.Dialog.prototype.pushPending = function () {
+       if ( this.pending === 0 ) {
+               this.frame.$content.addClass( 'oo-ui-dialog-pending' );
+               this.$head.addClass( 'oo-ui-texture-pending' );
+               this.$foot.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-dialog-pending' );
+               this.$head.removeClass( 'oo-ui-texture-pending' );
+               this.$foot.removeClass( 'oo-ui-texture-pending' );
+       }
+       this.pending = Math.max( 0, this.pending - 1 );
+
+       return this;
+};
 /**
  * Container for elements.
  *
@@ -1835,6 +1911,103 @@ OO.ui.Widget.prototype.setDisabled = function ( disabled ) {
        this.wasDisabled = isDisabled;
        return this;
 };
+/**
+ * Dialog for showing a confirmation/warning message.
+ *
+ * @class
+ * @extends OO.ui.Dialog
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.ConfirmationDialog = function OoUiConfirmationDialog( config ) {
+       // Configuration initialization
+       config = $.extend( { 'size': 'small' }, config );
+
+       // Parent constructor
+       OO.ui.Dialog.call( this, config );
+};
+
+/* Inheritance */
+
+OO.inheritClass( OO.ui.ConfirmationDialog, OO.ui.Dialog );
+
+/* Static Properties */
+
+OO.ui.ConfirmationDialog.static.name = 'confirm';
+
+OO.ui.ConfirmationDialog.static.icon = 'help';
+
+OO.ui.ConfirmationDialog.static.title = OO.ui.deferMsg( 'ooui-dialog-confirm-title' );
+
+/* Methods */
+
+/**
+ * @inheritdoc
+ */
+OO.ui.ConfirmationDialog.prototype.initialize = function () {
+       // Parent method
+       OO.ui.Dialog.prototype.initialize.call( this );
+
+       // Set up the layout
+       var contentLayout = new OO.ui.PanelLayout( {
+               '$': this.$,
+               'padded': true
+       } );
+
+       this.$promptContainer = this.$( '<div>' ).addClass( 'oo-ui-dialog-confirm-promptContainer' );
+
+       this.cancelButton = new OO.ui.ButtonWidget();
+       this.cancelButton.connect( this, { 'click': [ 'emit', 'cancel' ] } );
+
+       this.okButton = new OO.ui.ButtonWidget();
+       this.okButton.connect( this, { 'click': [ 'emit', 'ok' ] } );
+
+       // Make the buttons
+       contentLayout.$element.append( this.$promptContainer );
+       this.$body.append( contentLayout.$element );
+
+       this.$foot.append(
+               this.okButton.$element,
+               this.cancelButton.$element
+       );
+
+       this.connect( this, {
+               'ok': 'close',
+               'cancel': 'close',
+               'close': [ 'emit', 'cancel' ]
+       } );
+};
+
+/*
+ * Open a confirmation dialog.
+ *
+ * @param {Object} [data] Window opening data including text of the dialog and text for the buttons
+ * @param {jQuery|string} [data.prompt] Text to display or list of nodes to use as content of the dialog.
+ * @param {jQuery|string|Function|null} [data.okLabel] Label of the OK button
+ * @param {jQuery|string|Function|null} [data.cancelLabel] Label of the cancel button
+ * @param {string|string[]} [data.okFlags="constructive"] Flags for the OK button
+ * @param {string|string[]} [data.cancelFlags="destructive"] Flags for the cancel button
+ */
+OO.ui.ConfirmationDialog.prototype.setup = function ( data ) {
+       // Parent method
+       OO.ui.Dialog.prototype.setup.call( this, data );
+
+       var prompt = data.prompt || OO.ui.deferMsg( 'ooui-dialog-confirm-default-prompt' ),
+               okLabel = data.okLabel || OO.ui.deferMsg( 'ooui-dialog-confirm-default-ok' ),
+               cancelLabel = data.cancelLabel || OO.ui.deferMsg( 'ooui-dialog-confirm-default-cancel' ),
+               okFlags = data.okFlags || 'constructive',
+               cancelFlags = data.cancelFlags || 'destructive';
+
+       if ( typeof prompt === 'string' ) {
+               this.$promptContainer.text( prompt );
+       } else {
+               this.$promptContainer.empty().append( prompt );
+       }
+
+       this.okButton.setLabel( okLabel ).clearFlags().setFlags( okFlags );
+       this.cancelButton.setLabel( cancelLabel ).clearFlags().setFlags( cancelFlags );
+};
 /**
  * Element with a button.
  *
@@ -1881,7 +2054,7 @@ OO.ui.ButtonedElement = function OoUiButtonedElement( $button, config ) {
  * @param {jQuery.Event} e Mouse down event
  */
 OO.ui.ButtonedElement.prototype.onMouseDown = function ( e ) {
-       if ( this.disabled || e.which !== 1 ) {
+       if ( this.isDisabled() || e.which !== 1 ) {
                return false;
        }
        // tabIndex should generally be interacted with via the property,
@@ -1902,7 +2075,7 @@ OO.ui.ButtonedElement.prototype.onMouseDown = function ( e ) {
  * @param {jQuery.Event} e Mouse up event
  */
 OO.ui.ButtonedElement.prototype.onMouseUp = function ( e ) {
-       if ( this.disabled || e.which !== 1 ) {
+       if ( this.isDisabled() || e.which !== 1 ) {
                return false;
        }
        // Restore the tab-index after the button is up to restore the button's accesssibility
@@ -2106,18 +2279,39 @@ OO.ui.FlaggableElement.prototype.getFlags = function () {
        return Object.keys( this.flags );
 };
 
+/**
+ * Clear all flags.
+ *
+ * @chainable
+ */
+OO.ui.FlaggableElement.prototype.clearFlags = function () {
+       var flag,
+               classPrefix = 'oo-ui-flaggableElement-';
+
+       for ( flag in this.flags ) {
+               delete this.flags[flag];
+               this.$element.removeClass( classPrefix + flag );
+       }
+
+       return this;
+};
+
 /**
  * Add one or more flags.
  *
- * @param {string[]|Object.<string, boolean>} flags List of flags to add, or list of set/remove
- *  values, keyed by flag name
+ * @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
  */
 OO.ui.FlaggableElement.prototype.setFlags = function ( flags ) {
        var i, len, flag,
                classPrefix = 'oo-ui-flaggableElement-';
 
-       if ( $.isArray( flags ) ) {
+       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
@@ -2148,7 +2342,6 @@ OO.ui.FlaggableElement.prototype.setFlags = function ( flags ) {
  * @constructor
  * @param {jQuery} $group Container node, assigned to #$group
  * @param {Object} [config] Configuration options
- * @cfg {Object.<string,string>} [aggregations] Events to aggregate, keyed by item event name
  */
 OO.ui.GroupElement = function OoUiGroupElement( $group, config ) {
        // Configuration
@@ -2158,8 +2351,7 @@ OO.ui.GroupElement = function OoUiGroupElement( $group, config ) {
        this.$group = $group;
        this.items = [];
        this.$items = this.$( [] );
-       this.aggregate = !$.isEmptyObject( config.aggregations );
-       this.aggregations = config.aggregations || {};
+       this.aggregateItemEvents = {};
 };
 
 /* Methods */
@@ -2173,6 +2365,59 @@ 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.
  *
@@ -2197,10 +2442,10 @@ OO.ui.GroupElement.prototype.addItems = function ( items, index ) {
                        }
                }
                // Add the item
-               if ( this.aggregate ) {
+               if ( item.connect && item.disconnect && !$.isEmptyObject( this.aggregateItemEvents ) ) {
                        events = {};
-                       for ( event in this.aggregations ) {
-                               events[event] = [ 'emit', this.aggregations[event], item ];
+                       for ( event in this.aggregateItemEvents ) {
+                               events[event] = [ 'emit', this.aggregateItemEvents[event], item ];
                        }
                        item.connect( this, events );
                }
@@ -2233,15 +2478,22 @@ OO.ui.GroupElement.prototype.addItems = function ( items, index ) {
  * @chainable
  */
 OO.ui.GroupElement.prototype.removeItems = function ( items ) {
-       var i, len, item, index;
+       var i, len, item, index, remove, itemEvent;
 
        // Remove specific items
        for ( i = 0, len = items.length; i < len; i++ ) {
                item = items[i];
                index = $.inArray( item, this.items );
                if ( index !== -1 ) {
-                       if ( this.aggregate ) {
-                               item.disconnect( this );
+                       if (
+                               item.connect && item.disconnect &&
+                               !$.isEmptyObject( this.aggregateItemEvents )
+                       ) {
+                               remove = {};
+                               if ( itemEvent in this.aggregateItemEvents ) {
+                                       remove[itemEvent] = [ 'emit', this.aggregateItemEvents[itemEvent], item ];
+                               }
+                               item.disconnect( this, remove );
                        }
                        item.setElementGroup( null );
                        this.items.splice( index, 1 );
@@ -2261,13 +2513,20 @@ OO.ui.GroupElement.prototype.removeItems = function ( items ) {
  * @chainable
  */
 OO.ui.GroupElement.prototype.clearItems = function () {
-       var i, len, item;
+       var i, len, item, remove, itemEvent;
 
        // Remove all items
        for ( i = 0, len = this.items.length; i < len; i++ ) {
                item = this.items[i];
-               if ( this.aggregate ) {
-                       item.disconnect( this );
+               if (
+                       item.connect && item.disconnect &&
+                       !$.isEmptyObject( this.aggregateItemEvents )
+               ) {
+                       remove = {};
+                       if ( itemEvent in this.aggregateItemEvents ) {
+                               remove[itemEvent] = [ 'emit', this.aggregateItemEvents[itemEvent], item ];
+                       }
+                       item.disconnect( this, remove );
                }
                item.setElementGroup( null );
        }
@@ -3286,9 +3545,7 @@ OO.ui.ToolFactory.prototype.extract = function ( collection, used ) {
  */
 OO.ui.ToolGroup = function OoUiToolGroup( toolbar, config ) {
        // Configuration initialization
-       config = $.extend( true, {
-               'aggregations': { 'disable': 'itemDisable' }
-       }, config );
+       config = config || {};
 
        // Parent constructor
        OO.ui.ToolGroup.super.call( this, config );
@@ -3315,6 +3572,7 @@ OO.ui.ToolGroup = function OoUiToolGroup( toolbar, config ) {
                'mouseout': OO.ui.bind( this.onMouseOut, this )
        } );
        this.toolbar.getToolFactory().connect( this, { 'register': 'onToolFactoryRegister' } );
+       this.aggregate( { 'disable': 'itemDisable' } );
        this.connect( this, { 'itemDisable': 'updateDisabled' } );
 
        // Initialization
@@ -3399,7 +3657,7 @@ OO.ui.ToolGroup.prototype.updateDisabled = function () {
  * @param {jQuery.Event} e Mouse down event
  */
 OO.ui.ToolGroup.prototype.onMouseDown = function ( e ) {
-       if ( !this.disabled && e.which === 1 ) {
+       if ( !this.isDisabled() && e.which === 1 ) {
                this.pressed = this.getTargetTool( e );
                if ( this.pressed ) {
                        this.pressed.setActive( true );
@@ -3431,7 +3689,7 @@ OO.ui.ToolGroup.prototype.onCapturedMouseUp = function ( e ) {
 OO.ui.ToolGroup.prototype.onMouseUp = function ( e ) {
        var tool = this.getTargetTool( e );
 
-       if ( !this.disabled && e.which === 1 && this.pressed && this.pressed === tool ) {
+       if ( !this.isDisabled() && e.which === 1 && this.pressed && this.pressed === tool ) {
                this.pressed.onSelect();
        }
 
@@ -3814,14 +4072,14 @@ OO.ui.GridLayout = function OoUiGridLayout( panels, config ) {
                this.$element.append( panels[i].$element );
        }
        if ( config.widths || config.heights ) {
-               this.layout( config.widths || [1], config.heights || [1] );
+               this.layout( config.widths || [ 1 ], config.heights || [ 1 ] );
        } else {
                // Arrange in columns by default
                widths = [];
                for ( i = 0, len = this.panels.length; i < len; i++ ) {
                        widths[i] = 1;
                }
-               this.layout( widths, [1] );
+               this.layout( widths, [ 1 ] );
        }
 };
 
@@ -3950,7 +4208,7 @@ OO.ui.GridLayout.prototype.getPanel = function ( x, y ) {
  * @constructor
  * @param {Object} [config] Configuration options
  * @cfg {boolean} [continuous=false] Show all pages, one after another
- * @cfg {boolean} [autoFocus=false] Focus on the first focusable element when changing to a page
+ * @cfg {boolean} [autoFocus=true] Focus on the first focusable element when changing to a page
  * @cfg {boolean} [outlined=false] Show an outline
  * @cfg {boolean} [editable=false] Show controls for adding, removing and reordering pages
  * @cfg {Object[]} [adders] List of adders for controls, each with name, icon and title properties
@@ -3967,7 +4225,7 @@ OO.ui.BookletLayout = function OoUiBookletLayout( config ) {
        this.pages = {};
        this.ignoreFocus = false;
        this.stackLayout = new OO.ui.StackLayout( { '$': this.$, 'continuous': !!config.continuous } );
-       this.autoFocus = !!config.autoFocus;
+       this.autoFocus = config.autoFocus === undefined ? true : !!config.autoFocus;
        this.outlineVisible = false;
        this.outlined = !!config.outlined;
        if ( this.outlined ) {
@@ -3977,7 +4235,8 @@ OO.ui.BookletLayout = function OoUiBookletLayout( config ) {
                this.outlineWidget = new OO.ui.OutlineWidget( { '$': this.$ } );
                this.outlinePanel = new OO.ui.PanelLayout( { '$': this.$, 'scrollable': true } );
                this.gridLayout = new OO.ui.GridLayout(
-                       [this.outlinePanel, this.stackLayout], { '$': this.$, 'widths': [1, 2] }
+                       [ this.outlinePanel, this.stackLayout ],
+                       { '$': this.$, 'widths': [ 1, 2 ] }
                );
                this.outlineVisible = true;
                if ( this.editable ) {
@@ -4388,9 +4647,6 @@ OO.ui.PanelLayout = function OoUiPanelLayout( config ) {
        if ( config.padded ) {
                this.$element.addClass( 'oo-ui-panelLayout-padded' );
        }
-
-       // Add directionality class:
-       this.$element.addClass( 'oo-ui-' + OO.ui.Element.getDir( this.$.context ) );
 };
 
 /* Setup */
@@ -4535,17 +4791,26 @@ OO.mixinClass( OO.ui.StackLayout, OO.ui.GroupElement );
 
 /**
  * @event set
- * @param {OO.ui.PanelLayout|null} [item] Current item
+ * @param {OO.ui.Layout|null} [item] Current item
  */
 
 /* Methods */
 
+/**
+ * Get the current item.
+ *
+ * @return {OO.ui.Layout|null} [description]
+ */
+OO.ui.StackLayout.prototype.getCurrentItem = function () {
+       return this.currentItem;
+};
+
 /**
  * Add items.
  *
  * Adding an existing item (by value) will move it.
  *
- * @param {OO.ui.PanelLayout[]} items Items to add
+ * @param {OO.ui.Layout[]} items Items to add
  * @param {number} [index] Index to insert items after
  * @chainable
  */
@@ -4564,7 +4829,7 @@ OO.ui.StackLayout.prototype.addItems = function ( items, index ) {
  *
  * Items will be detached, not removed, so they can be used later.
  *
- * @param {OO.ui.PanelLayout[]} items Items to remove
+ * @param {OO.ui.Layout[]} items Items to remove
  * @chainable
  */
 OO.ui.StackLayout.prototype.removeItems = function ( items ) {
@@ -4598,7 +4863,7 @@ OO.ui.StackLayout.prototype.clearItems = function () {
  *
  * Any currently shown item will be hidden.
  *
- * @param {OO.ui.PanelLayout} item Item to show
+ * @param {OO.ui.Layout} item Item to show
  * @chainable
  */
 OO.ui.StackLayout.prototype.setItem = function ( item ) {
@@ -4622,7 +4887,6 @@ OO.ui.StackLayout.prototype.setItem = function ( item ) {
 /**
  * Horizontal bar layout of tools as icon buttons.
  *
- * @abstract
  * @class
  * @extends OO.ui.ToolGroup
  *
@@ -4664,6 +4928,7 @@ OO.ui.BarToolGroup.static.name = 'bar';
  * @constructor
  * @param {OO.ui.Toolbar} toolbar
  * @param {Object} [config] Configuration options
+ * @cfg {string} [header] Text to display at the top of the pop-up
  */
 OO.ui.PopupToolGroup = function OoUiPopupToolGroup( toolbar, config ) {
        // Configuration initialization
@@ -4695,6 +4960,16 @@ OO.ui.PopupToolGroup = function OoUiPopupToolGroup( toolbar, config ) {
        this.$handle
                .addClass( 'oo-ui-popupToolGroup-handle' )
                .append( this.$icon, this.$label, this.$indicator );
+       // If the pop-up should have a header, add it to the top of the toolGroup.
+       // Note: If this feature is useful for other widgets, we could abstract it into an
+       // OO.ui.HeaderedElement mixin constructor.
+       if ( config.header !== undefined ) {
+               this.$group
+                       .prepend( this.$( '<span>' )
+                               .addClass( 'oo-ui-popupToolGroup-header' )
+                               .text( config.header )
+                       );
+       }
        this.$element
                .addClass( 'oo-ui-popupToolGroup' )
                .prepend( this.$handle );
@@ -4743,7 +5018,7 @@ OO.ui.PopupToolGroup.prototype.onBlur = function ( e ) {
  * @inheritdoc
  */
 OO.ui.PopupToolGroup.prototype.onMouseUp = function ( e ) {
-       if ( !this.disabled && e.which === 1 ) {
+       if ( !this.isDisabled() && e.which === 1 ) {
                this.setActive( false );
        }
        return OO.ui.ToolGroup.prototype.onMouseUp.call( this, e );
@@ -4764,7 +5039,7 @@ OO.ui.PopupToolGroup.prototype.onHandleMouseUp = function () {
  * @param {jQuery.Event} e Mouse down event
  */
 OO.ui.PopupToolGroup.prototype.onHandleMouseDown = function ( e ) {
-       if ( !this.disabled && e.which === 1 ) {
+       if ( !this.isDisabled() && e.which === 1 ) {
                this.setActive( !this.active );
        }
        return false;
@@ -4793,7 +5068,6 @@ OO.ui.PopupToolGroup.prototype.setActive = function ( value ) {
 /**
  * Drop down list layout of tools as labeled icon buttons.
  *
- * @abstract
  * @class
  * @extends OO.ui.PopupToolGroup
  *
@@ -4821,7 +5095,6 @@ OO.ui.ListToolGroup.static.name = 'list';
 /**
  * Drop down menu layout of tools as selectable menu items.
  *
- * @abstract
  * @class
  * @extends OO.ui.PopupToolGroup
  *
@@ -4911,7 +5184,7 @@ OO.mixinClass( OO.ui.PopupTool, OO.ui.PopuppableElement );
  * @inheritdoc
  */
 OO.ui.PopupTool.prototype.onSelect = function () {
-       if ( !this.disabled ) {
+       if ( !this.isDisabled() ) {
                if ( this.popup.isVisible() ) {
                        this.hidePopup();
                } else {
@@ -5128,7 +5401,6 @@ OO.mixinClass( OO.ui.ButtonGroupWidget, OO.ui.GroupElement );
 /**
  * Button widget.
  *
- * @abstract
  * @class
  * @extends OO.ui.Widget
  * @mixins OO.ui.ButtonedElement
@@ -5202,7 +5474,7 @@ OO.mixinClass( OO.ui.ButtonWidget, OO.ui.FlaggableElement );
  * @fires click
  */
 OO.ui.ButtonWidget.prototype.onClick = function () {
-       if ( !this.disabled ) {
+       if ( !this.isDisabled() ) {
                this.emit( 'click' );
                if ( this.isHyperlink ) {
                        return true;
@@ -5218,9 +5490,9 @@ OO.ui.ButtonWidget.prototype.onClick = function () {
  * @fires click
  */
 OO.ui.ButtonWidget.prototype.onKeyPress = function ( e ) {
-       if ( !this.disabled && e.which === OO.ui.Keys.SPACE ) {
+       if ( !this.isDisabled() && ( e.which === OO.ui.Keys.SPACE || e.which === OO.ui.Keys.ENTER ) ) {
+               this.onClick();
                if ( this.isHyperlink ) {
-                       this.onClick();
                        return true;
                }
        }
@@ -5259,7 +5531,7 @@ OO.ui.InputWidget = function OoUiInputWidget( config ) {
        // Initialization
        this.$input
                .attr( 'name', config.name )
-               .prop( 'disabled', this.disabled );
+               .prop( 'disabled', this.isDisabled() );
        this.setReadOnly( config.readOnly );
        this.$element.addClass( 'oo-ui-inputWidget' ).append( this.$input );
        this.setValue( config.value );
@@ -5294,7 +5566,7 @@ OO.ui.InputWidget.prototype.getInputElement = function () {
  * @param {jQuery.Event} e Key down, mouse up, cut, paste, change, input, or select event
  */
 OO.ui.InputWidget.prototype.onEdit = function () {
-       if ( !this.disabled ) {
+       if ( !this.isDisabled() ) {
                // Allow the stack to clear so the value will be updated
                setTimeout( OO.ui.bind( function () {
                        this.setValue( this.$input.val() );
@@ -5397,7 +5669,7 @@ OO.ui.InputWidget.prototype.isReadOnly = function () {
  */
 OO.ui.InputWidget.prototype.setReadOnly = function ( state ) {
        this.readOnly = !!state;
-       this.$input.prop( 'readonly', this.readOnly );
+       this.$input.prop( 'readOnly', this.readOnly );
        return this;
 };
 
@@ -5407,10 +5679,20 @@ OO.ui.InputWidget.prototype.setReadOnly = function ( state ) {
 OO.ui.InputWidget.prototype.setDisabled = function ( state ) {
        OO.ui.Widget.prototype.setDisabled.call( this, state );
        if ( this.$input ) {
-               this.$input.prop( 'disabled', this.disabled );
+               this.$input.prop( 'disabled', this.isDisabled() );
        }
        return this;
 };
+
+/**
+ * Focus the input.
+ *
+ * @chainable
+ */
+OO.ui.InputWidget.prototype.focus = function () {
+       this.$input.focus();
+       return this;
+};
 /**
  * Checkbox widget.
  *
@@ -5470,7 +5752,7 @@ OO.ui.CheckboxInputWidget.prototype.setValue = function ( value ) {
  * @inheritdoc
  */
 OO.ui.CheckboxInputWidget.prototype.onEdit = function () {
-       if ( !this.disabled ) {
+       if ( !this.isDisabled() ) {
                // Allow the stack to clear so the value will be updated
                setTimeout( OO.ui.bind( function () {
                        this.setValue( this.$input.prop( 'checked' ) );
@@ -5613,6 +5895,15 @@ OO.ui.LookupInputWidget.prototype.onLookupInputChange = function () {
        this.openLookupMenu();
 };
 
+/**
+ * Get lookup menu.
+ *
+ * @return {OO.ui.TextInputMenuWidget}
+ */
+OO.ui.LookupInputWidget.prototype.getLookupMenu = function () {
+       return this.lookupMenu;
+};
+
 /**
  * Open the menu.
  *
@@ -5758,7 +6049,6 @@ OO.ui.LookupInputWidget.prototype.getLookupMenuItemsFromData = function () {
  *
  * Use with OO.ui.SelectWidget.
  *
- * @abstract
  * @class
  * @extends OO.ui.Widget
  * @mixins OO.ui.IconedElement
@@ -5831,7 +6121,7 @@ OO.ui.OptionWidget.static.scrollIntoViewOnSelect = false;
  * @return {boolean} Item is selectable
  */
 OO.ui.OptionWidget.prototype.isSelectable = function () {
-       return this.constructor.static.selectable && !this.disabled;
+       return this.constructor.static.selectable && !this.isDisabled();
 };
 
 /**
@@ -5840,7 +6130,7 @@ OO.ui.OptionWidget.prototype.isSelectable = function () {
  * @return {boolean} Item is highlightable
  */
 OO.ui.OptionWidget.prototype.isHighlightable = function () {
-       return this.constructor.static.highlightable && !this.disabled;
+       return this.constructor.static.highlightable && !this.isDisabled();
 };
 
 /**
@@ -5849,7 +6139,7 @@ OO.ui.OptionWidget.prototype.isHighlightable = function () {
  * @return {boolean} Item is pressable
  */
 OO.ui.OptionWidget.prototype.isPressable = function () {
-       return this.constructor.static.pressable && !this.disabled;
+       return this.constructor.static.pressable && !this.isDisabled();
 };
 
 /**
@@ -5886,7 +6176,7 @@ OO.ui.OptionWidget.prototype.isPressed = function () {
  * @chainable
  */
 OO.ui.OptionWidget.prototype.setSelected = function ( state ) {
-       if ( !this.disabled && this.constructor.static.selectable ) {
+       if ( !this.isDisabled() && this.constructor.static.selectable ) {
                this.selected = !!state;
                if ( this.selected ) {
                        this.$element.addClass( 'oo-ui-optionWidget-selected' );
@@ -5907,7 +6197,7 @@ OO.ui.OptionWidget.prototype.setSelected = function ( state ) {
  * @chainable
  */
 OO.ui.OptionWidget.prototype.setHighlighted = function ( state ) {
-       if ( !this.disabled && this.constructor.static.highlightable ) {
+       if ( !this.isDisabled() && this.constructor.static.highlightable ) {
                this.highlighted = !!state;
                if ( this.highlighted ) {
                        this.$element.addClass( 'oo-ui-optionWidget-highlighted' );
@@ -5925,7 +6215,7 @@ OO.ui.OptionWidget.prototype.setHighlighted = function ( state ) {
  * @chainable
  */
 OO.ui.OptionWidget.prototype.setPressed = function ( state ) {
-       if ( !this.disabled && this.constructor.static.pressable ) {
+       if ( !this.isDisabled() && this.constructor.static.pressable ) {
                this.pressed = !!state;
                if ( this.pressed ) {
                        this.$element.addClass( 'oo-ui-optionWidget-pressed' );
@@ -5941,24 +6231,26 @@ OO.ui.OptionWidget.prototype.setPressed = function ( state ) {
  *
  * While flashing, the visual style of the pressed state is removed if present.
  *
- * @param {Function} [done] Callback to execute when flash effect is complete.
+ * @return {jQuery.Promise} Promise resolved when flashing is done
  */
-OO.ui.OptionWidget.prototype.flash = function ( done ) {
-       var $this = this.$element;
+OO.ui.OptionWidget.prototype.flash = function () {
+       var $this = this.$element,
+               deferred = $.Deferred();
 
-       if ( !this.disabled && this.constructor.static.pressable ) {
+       if ( !this.isDisabled() && this.constructor.static.pressable ) {
                $this.removeClass( 'oo-ui-optionWidget-highlighted oo-ui-optionWidget-pressed' );
                setTimeout( OO.ui.bind( function () {
-                       $this.addClass( 'oo-ui-optionWidget-highlighted' );
-                       if ( done ) {
-                               // Restore original classes
-                               $this
-                                       .toggleClass( 'oo-ui-optionWidget-highlighted', this.highlighted )
-                                       .toggleClass( 'oo-ui-optionWidget-pressed', this.pressed );
-                               setTimeout( done, 100 );
-                       }
+                       // Restore original classes
+                       $this
+                               .toggleClass( 'oo-ui-optionWidget-highlighted', this.highlighted )
+                               .toggleClass( 'oo-ui-optionWidget-pressed', this.pressed );
+                       setTimeout( function () {
+                               deferred.resolve();
+                       }, 100 );
                }, this ), 100 );
        }
+
+       return deferred.promise();
 };
 
 /**
@@ -5974,7 +6266,6 @@ OO.ui.OptionWidget.prototype.getData = function () {
  *
  * Use together with OO.ui.OptionWidget.
  *
- * @abstract
  * @class
  * @extends OO.ui.Widget
  * @mixins OO.ui.GroupElement
@@ -6070,7 +6361,7 @@ OO.ui.SelectWidget.static.tagName = 'ul';
 OO.ui.SelectWidget.prototype.onMouseDown = function ( e ) {
        var item;
 
-       if ( !this.disabled && e.which === 1 ) {
+       if ( !this.isDisabled() && e.which === 1 ) {
                this.togglePressed( true );
                item = this.getTargetItem( e );
                if ( item && item.isSelectable() ) {
@@ -6098,7 +6389,7 @@ OO.ui.SelectWidget.prototype.onMouseUp = function ( e ) {
                        this.selecting = item;
                }
        }
-       if ( !this.disabled && e.which === 1 && this.selecting ) {
+       if ( !this.isDisabled() && e.which === 1 && this.selecting ) {
                this.pressItem( null );
                this.chooseItem( this.selecting );
                this.selecting = null;
@@ -6116,7 +6407,7 @@ OO.ui.SelectWidget.prototype.onMouseUp = function ( e ) {
 OO.ui.SelectWidget.prototype.onMouseMove = function ( e ) {
        var item;
 
-       if ( !this.disabled && this.pressed ) {
+       if ( !this.isDisabled() && this.pressed ) {
                item = this.getTargetItem( e );
                if ( item && item !== this.selecting && item.isSelectable() ) {
                        this.pressItem( item );
@@ -6135,7 +6426,7 @@ OO.ui.SelectWidget.prototype.onMouseMove = function ( e ) {
 OO.ui.SelectWidget.prototype.onMouseOver = function ( e ) {
        var item;
 
-       if ( !this.disabled ) {
+       if ( !this.isDisabled() ) {
                item = this.getTargetItem( e );
                this.highlightItem( item && item.isHighlightable() ? item : null );
        }
@@ -6149,7 +6440,7 @@ OO.ui.SelectWidget.prototype.onMouseOver = function ( e ) {
  * @param {jQuery.Event} e Mouse over event
  */
 OO.ui.SelectWidget.prototype.onMouseLeave = function () {
-       if ( !this.disabled ) {
+       if ( !this.isDisabled() ) {
                this.highlightItem( null );
        }
        return false;
@@ -6503,6 +6794,7 @@ OO.inheritClass( OO.ui.MenuItemWidget, OO.ui.OptionWidget );
  * @constructor
  * @param {Object} [config] Configuration options
  * @cfg {OO.ui.InputWidget} [input] Input to bind keyboard handlers to
+ * @cfg {boolean} [autoHide=true] Hide the menu when the mouse is pressed outside the menu
  */
 OO.ui.MenuWidget = function OoUiMenuWidget( config ) {
        // Config intialization
@@ -6515,6 +6807,7 @@ OO.ui.MenuWidget = function OoUiMenuWidget( config ) {
        OO.ui.ClippableElement.call( this, this.$group, config );
 
        // Properties
+       this.autoHide = config.autoHide === undefined || !!config.autoHide;
        this.newItems = null;
        this.$input = config.input ? config.input.$input : null;
        this.$previousFocus = null;
@@ -6522,6 +6815,7 @@ OO.ui.MenuWidget = function OoUiMenuWidget( config ) {
        this.visible = false;
        this.flashing = false;
        this.onKeyDownHandler = OO.ui.bind( this.onKeyDown, this );
+       this.onDocumentMouseDownHandler = OO.ui.bind( this.onDocumentMouseDown, this );
 
        // Initialization
        this.$element.hide().addClass( 'oo-ui-menuWidget' );
@@ -6534,6 +6828,17 @@ OO.mixinClass( OO.ui.MenuWidget, OO.ui.ClippableElement );
 
 /* Methods */
 
+/**
+ * Handles document mouse down events.
+ *
+ * @param {jQuery.Event} e Key down event
+ */
+OO.ui.MenuWidget.prototype.onDocumentMouseDown = function ( e ) {
+       if ( !$.contains( this.$element[0], e.target ) ) {
+               this.hide();
+       }
+};
+
 /**
  * Handles key down events.
  *
@@ -6544,7 +6849,7 @@ OO.ui.MenuWidget.prototype.onKeyDown = function ( e ) {
                handled = false,
                highlightItem = this.getHighlightedItem();
 
-       if ( !this.disabled && this.visible ) {
+       if ( !this.isDisabled() && this.visible ) {
                if ( !highlightItem ) {
                        highlightItem = this.getSelectedItem();
                }
@@ -6629,7 +6934,7 @@ OO.ui.MenuWidget.prototype.chooseItem = function ( item ) {
 
        if ( item && !this.flashing ) {
                this.flashing = true;
-               item.flash( OO.ui.bind( function () {
+               item.flash().done( OO.ui.bind( function () {
                        this.hide();
                        this.flashing = false;
                }, this ) );
@@ -6699,6 +7004,13 @@ OO.ui.MenuWidget.prototype.show = function () {
                }
 
                this.setClipping( true );
+
+               // Auto-hide
+               if ( this.autoHide ) {
+                       this.getElementDocument().addEventListener(
+                               'mousedown', this.onDocumentMouseDownHandler, true
+                       );
+               }
        }
 
        return this;
@@ -6719,6 +7031,10 @@ OO.ui.MenuWidget.prototype.hide = function () {
                this.$previousFocus = null;
        }
 
+       this.getElementDocument().removeEventListener(
+               'mousedown', this.onDocumentMouseDownHandler, true
+       );
+
        this.setClipping( false );
 
        return this;
@@ -6821,7 +7137,7 @@ OO.ui.InlineMenuWidget.prototype.onClick = function ( e ) {
                return;
        }
 
-       if ( !this.disabled ) {
+       if ( !this.isDisabled() ) {
                if ( this.menu.isVisible() ) {
                        this.menu.hide();
                } else {
@@ -6934,9 +7250,9 @@ OO.ui.OutlineControlsWidget = function OoUiOutlineControlsWidget( outline, confi
                'add': 'onOutlineChange',
                'remove': 'onOutlineChange'
        } );
-       this.upButton.connect( this, { 'click': ['emit', 'move', -1] } );
-       this.downButton.connect( this, { 'click': ['emit', 'move', 1] } );
-       this.removeButton.connect( this, { 'click': ['emit', 'remove'] } );
+       this.upButton.connect( this, { 'click': [ 'emit', 'move', -1 ] } );
+       this.downButton.connect( this, { 'click': [ 'emit', 'move', 1 ] } );
+       this.removeButton.connect( this, { 'click': [ 'emit', 'remove' ] } );
 
        // Initialization
        this.$element.addClass( 'oo-ui-outlineControlsWidget' );
@@ -7477,7 +7793,7 @@ OO.ui.PopupButtonWidget.prototype.onClick = function ( e ) {
                return;
        }
 
-       if ( !this.disabled ) {
+       if ( !this.isDisabled() ) {
                if ( this.popup.isVisible() ) {
                        this.hidePopup();
                } else {
@@ -7632,13 +7948,6 @@ OO.ui.SearchWidget.prototype.getQuery = function () {
        return this.query;
 };
 
-/**
- * Reset the widget to initial value.
- */
-OO.ui.SearchWidget.prototype.clear = function () {
-       this.query.setValue( '' );
-};
-
 /**
  * Get the results list.
  *
@@ -7824,9 +8133,12 @@ OO.ui.TextInputWidget.prototype.isPending = function () {
  * @chainable
  */
 OO.ui.TextInputWidget.prototype.pushPending = function () {
+       if ( this.pending === 0 ) {
+               this.$element.addClass( 'oo-ui-textInputWidget-pending' );
+               this.$input.addClass( 'oo-ui-texture-pending' );
+       }
        this.pending++;
-       this.$element.addClass( 'oo-ui-textInputWidget-pending' );
-       this.$input.addClass( 'oo-ui-texture-pending' );
+
        return this;
 };
 
@@ -7838,11 +8150,22 @@ OO.ui.TextInputWidget.prototype.pushPending = function () {
  * @chainable
  */
 OO.ui.TextInputWidget.prototype.popPending = function () {
-       this.pending = Math.max( 0, this.pending - 1 );
-       if ( !this.pending ) {
+       if ( this.pending === 1 ) {
                this.$element.removeClass( 'oo-ui-textInputWidget-pending' );
                this.$input.removeClass( 'oo-ui-texture-pending' );
        }
+       this.pending = Math.max( 0, this.pending - 1 );
+
+       return this;
+};
+
+/**
+ * Select the contents of the input.
+ *
+ * @chainable
+ */
+OO.ui.TextInputWidget.prototype.select = function () {
+       this.$input.select();
        return this;
 };
 /**
@@ -8040,7 +8363,7 @@ OO.mixinClass( OO.ui.ToggleButtonWidget, OO.ui.ToggleWidget );
  * @inheritdoc
  */
 OO.ui.ToggleButtonWidget.prototype.onClick = function () {
-       if ( !this.disabled ) {
+       if ( !this.isDisabled() ) {
                this.setValue( !this.value );
        }
 
@@ -8065,7 +8388,6 @@ OO.ui.ToggleButtonWidget.prototype.setValue = function ( value ) {
 /**
  * Switch that slides on and off.
  *
- * @abstract
  * @class
  * @extends OO.ui.Widget
  * @mixins OO.ui.ToggleWidget
@@ -8112,7 +8434,7 @@ OO.mixinClass( OO.ui.ToggleSwitchWidget, OO.ui.ToggleWidget );
  * @param {jQuery.Event} e Mouse down event
  */
 OO.ui.ToggleSwitchWidget.prototype.onClick = function ( e ) {
-       if ( !this.disabled && e.which === 1 ) {
+       if ( !this.isDisabled() && e.which === 1 ) {
                this.setValue( !this.value );
        }
 };
index deb35ef..34547cf 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (9d291a9222)
+ * OOjs UI v0.1.0-pre (7b283a9dcc)
  * 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: Wed Apr 16 2014 18:45:32 GMT-0700 (PDT)
+ * Date: Tue May 27 2014 15:41:42 GMT-0700 (PDT)
  */
 
 /* Textures */
           backface-visibility: hidden;
 }
 
-.oo-ui-dialog .oo-ui-window-frame {
+.oo-ui-dialog .oo-ui-window-frame {
   position: fixed;
-  top: 1em;
   right: 0;
-  bottom: 1em;
   left: 0;
   min-height: 12em;
   margin: auto;
   overflow: hidden;
 }
 
-.oo-ui-dialog-small .oo-ui-window-frame {
-  width: 400px;
-  max-height: 230px;
-}
-
-.oo-ui-dialog-medium .oo-ui-window-frame {
-  width: 600px;
-  max-height: 460px;
-}
-
-.oo-ui-dialog-large .oo-ui-window-frame {
-  width: 800px;
-  max-height: 690px;
-}
-
-.oo-ui-dialog .oo-ui-frame {
+.oo-ui-dialog > .oo-ui-window-frame .oo-ui-frame {
   width: 100%;
   height: 100%;
 }
 
-.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;
-  height: 3.8em;
-  padding: 0.5em;
-}
-
-.oo-ui-dialog-content .oo-ui-window-title {
-  line-height: 2.8em;
-}
-
-.oo-ui-dialog-content .oo-ui-window-icon {
-  width: 2.4em;
-  height: 2.8em;
-  line-height: 2.8em;
-}
-
-.oo-ui-dialog-content .oo-ui-window-closeButton {
-  float: right;
-  margin: 0.25em 0.25em;
-}
-
-.oo-ui-dialog-content .oo-ui-window-body {
-  top: 3.8em;
-  bottom: 4.8em;
-}
-
-.oo-ui-dialog-content .oo-ui-window-foot {
-  bottom: 0;
-  height: 4.8em;
-  padding: 1em;
-}
-
 .oo-ui-dialog-content .oo-ui-window-foot .oo-ui-buttonedElement-framed {
   float: left;
-  margin: 0.125em 0.25em;
 }
 
 .oo-ui-dialog-content .oo-ui-window-foot .oo-ui-flaggableElement-primary,
   float: right;
 }
 
-.oo-ui-dialog-content-footless .oo-ui-window-body {
-  bottom: 0;
-}
-
 .oo-ui-dialog-content-footless .oo-ui-window-foot {
   display: none;
 }
 
 .oo-ui-buttonedElement-framed .oo-ui-buttonedElement-button {
   display: inline-block;
-  padding: 0.2em 0.8em;
-  margin: 0.1em 0;
   text-align: center;
   vertical-align: top;
 }
   vertical-align: middle;
 }
 
-.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-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-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 {
 
 .oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout {
   width: 100%;
-  padding: 1.5em;
   -webkit-box-sizing: border-box;
      -moz-box-sizing: border-box;
           box-sizing: border-box;
   padding: 0.5em 0;
 }
 
-.oo-ui-panelLayout {
-  position: absolute;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-}
-
 .oo-ui-panelLayout-scrollable {
   overflow-y: auto;
 }
 
-.oo-ui-panelLayout-padded {
-  padding: 2em;
-}
-
 .oo-ui-stackLayout > .oo-ui-panelLayout {
   display: none;
 }
   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;
 }
   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);
 }
 
 /* Indicators */
 
+.oo-ui-indicator-alert {
+  background-image: /* @embed */ url(images/indicators/alert.svg);
+}
+
 .oo-ui-indicator-down {
   background-image: /* @embed */ url(images/indicators/down.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
new file mode 100644 (file)
index 0000000..6a91939
--- /dev/null
@@ -0,0 +1,8 @@
+<?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/update-oojs-ui.sh b/resources/lib/oojs-ui/update-oojs-ui.sh
deleted file mode 100755 (executable)
index 3c6dca6..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-#!/usr/bin/env bash
-
-# FIXME this script is duplicated from update-oojs.sh - factor this out
-
-# This script generates a commit that updates the oojs-ui distribution
-# ./bin/update-oojs-ui.sh path/to/repo/for/oojs-ui
-
-function oojsuihash() {
-       grep "OOjs UI v" resources/lib/oojs-ui/oojs-ui.js \
-               | head -n 1 \
-               | grep -Eo '\([a-z0-9]+\)' \
-               | sed 's/^(//' \
-               | sed 's/)$//'
-}
-
-function oojsuitag() {
-       grep "OOjs UI v" resources/lib/oojs-ui/oojs-ui.js \
-               | head -n 1 \
-               | grep -Eo '\bv[0-9a-z.-]+\b'
-}
-
-function oojsuiversion() {
-       grep "OOjs UI v" resources/lib/oojs-ui/oojs-ui.js \
-               | head -n 1 \
-               | grep -Eo '\bv[0-9a-z.-]+\b.*$'
-}
-
-# cd to the MW root directory
-cd $(cd $(dirname $0)/../../..; pwd)
-
-if [ "x$1" == "x" ]
-then
-       echo >&2 "Usage: update-oojs-ui.sh path/to/repo/for/oojs-ui"
-       exit 1
-fi
-
-# Undo any changes in the oojs-ui directory
-git reset -- resources/lib/oojs-ui/
-git checkout -- resources/lib/oojs-ui/
-
-git fetch origin
-# Create a branch of MW if needed, and reset it to master
-git checkout -B update-oojsui origin/master
-
-# Get the old oojs-ui version
-OLDVERSION=$(oojsuihash)
-if [ "x$OLDVERSION" == "x" ]
-then
-       TAG=$(oojsuitag)
-fi
-
-# cd to the oojs-ui directory
-cd $1 || exit 1
-if [ "x$OLDVERSION" == "x" ]
-then
-       # Try the tag
-       OLDVERSION=$(git rev-parse $TAG)
-       if [ $? != 0 ]
-       then
-               echo Could not find OOjs UI version
-               cd -
-               exit 1
-       fi
-fi
-if [ "$(git rev-parse $OLDVERSION)" == "$(git rev-parse HEAD)" ]
-then
-       echo "No changes (already at $OLDVERSION)"
-       cd -
-       exit 0
-fi
-# Build the distribution
-npm install || exit 1
-grunt || exit 1
-# Get the list of changes
-NEWCHANGES=$(git log $OLDVERSION.. --oneline --no-merges --reverse --color=never)
-NEWCHANGESDISPLAY=$(git log $OLDVERSION.. --oneline --no-merges --reverse --color=always)
-# cd back to the VisualEditor directory
-cd -
-
-# Copy files from dist/ to resources/lib/oojs-ui
-cp -a $1/dist/{oojs-ui.js,oojs-ui.svg.css,oojs-ui-apex.css,oojs-ui-agora.css,images,i18n} resources/lib/oojs-ui/
-# Figure out what the new version is
-NEWVERSION=$(oojsuiversion)
-# Generate commit summary
-COMMITMSG=$(cat <<END
-Update OOjs UI to $NEWVERSION
-
-New changes:
-$NEWCHANGES
-END
-)
-# Commit
-git commit resources/lib/oojs-ui/ -m "$COMMITMSG"
-cat >&2 <<END
-
-
-Created commit with changes:
-$NEWCHANGESDISPLAY
-END
index 3680fbe..6471516 100644 (file)
@@ -12,8 +12,6 @@
        color: black;
        max-width: 15em;
        border-radius: 4px;
-       -moz-border-radius: 4px;
-       -webkit-border-radius: 4px;
        /*
        -moz-box-shadow: 0px 2px 8px #cccccc;
        -webkit-box-shadow: 0px 2px 8px #cccccc;
@@ -72,4 +70,4 @@
        left: 0px;
        width: 6px;
        height: 11px;
-}
\ No newline at end of file
+}
index f920e8b..58a99a5 100644 (file)
         return (typeof thing == 'function') ? (thing.call(ctx)) : thing;
     }
 
-    function fixTitle($ele) {
-        if ($ele.attr('title') || typeof($ele.attr('original-title')) != 'string') {
-            $ele.attr('original-title', $ele.attr('title') || '').removeAttr('title');
-        }
-    }
-
     function Tipsy(element, options) {
         this.$element = $(element);
         this.options = options;
         this.enabled = true;
-        fixTitle(this.$element);
+        this.fixTitle();
     }
 
     Tipsy.prototype = {
             }
         },
 
+
+        fixTitle: function() {
+            var $e = this.$element;
+            if ($e.attr('title') || typeof($e.attr('original-title')) != 'string') {
+                $e.attr('original-title', $e.attr('title') || '').removeAttr('title');
+            }
+        },
+
         getTitle: function() {
             var title, $e = this.$element, o = this.options;
-            fixTitle($e);
+            this.fixTitle();
             if (typeof o.title == 'string') {
                 title = $e.attr(o.title == 'title' ? 'original-title' : o.title);
             } else if (typeof o.title == 'function') {
 
         tip: function() {
             if (!this.$tip) {
-                this.$tip = $('<div class="tipsy"></div>').html('<div class="tipsy-arrow"></div><div class="tipsy-inner"/></div>');
+                this.$tip = $('<div class="tipsy"></div>').html('<div class="tipsy-arrow"></div><div class="tipsy-inner"></div>');
             }
             return this.$tip;
         },
         if (options === true) {
             return this.data('tipsy');
         } else if (typeof options == 'string') {
-            return this.data('tipsy')[options]();
+            var tipsy = this.data('tipsy');
+            if (tipsy) tipsy[options]();
+            return this;
         }
 
         options = $.extend({}, $.fn.tipsy.defaults, options);
             if (options.delayIn == 0) {
                 tipsy.show();
             } else {
+                tipsy.fixTitle();
                 setTimeout(function() { if (tipsy.hoverState == 'in') tipsy.show(); }, options.delayIn);
             }
         };
         return $(this).offset().left > ($(document).scrollLeft() + $(window).width() / 2) ? 'e' : 'w';
     };
 
+    /**
+     * yields a closure of the supplied parameters, producing a function that takes
+     * no arguments and is suitable for use as an autogravity function like so:
+     *
+     * @param margin (int) - distance from the viewable region edge that an
+     *        element should be before setting its tooltip's gravity to be away
+     *        from that edge.
+     * @param prefer (string, e.g. 'n', 'sw', 'w') - the direction to prefer
+     *        if there are no viewable region edges effecting the tooltip's
+     *        gravity. It will try to vary from this minimally, for example,
+     *        if 'sw' is preferred and an element is near the right viewable 
+     *        region edge, but not the top edge, it will set the gravity for
+     *        that element's tooltip to be 'se', preserving the southern
+     *        component.
+     */
+     $.fn.tipsy.autoBounds = function(margin, prefer) {
+        return function() {
+            var dir = {ns: prefer[0], ew: (prefer.length > 1 ? prefer[1] : false)},
+                boundTop = $(document).scrollTop() + margin,
+                boundLeft = $(document).scrollLeft() + margin,
+                $this = $(this);
+
+            if ($this.offset().top < boundTop) dir.ns = 'n';
+            if ($this.offset().left < boundLeft) dir.ew = 'w';
+            if ($(window).width() + $(document).scrollLeft() - $this.offset().left < margin) dir.ew = 'e';
+            if ($(window).height() + $(document).scrollTop() - $this.offset().top < margin) dir.ns = 's';
+
+            return dir.ns + (dir.ew ? dir.ew : '');
+        }
+    };
+
 })(jQuery);
index ea14723..8c2286d 100644 (file)
@@ -111,8 +111,6 @@ body .ui-button-large {
 .ui-button.ui-corner-top,
 .ui-button.ui-corner-left,
 .ui-button.ui-corner-tl {
-       -moz-border-radius-topleft: 4px;
-       -webkit-border-top-left-radius: 4px;
        border-top-left-radius: 4px;
 }
 .ui-button.ui-corner-all,
@@ -120,24 +118,18 @@ body .ui-button-large {
 
 .ui-button.ui-corner-right,
 .ui-button.ui-corner-tr {
-       -moz-border-radius-topright: 4px;
-       -webkit-border-top-right-radius: 4px;
        border-top-right-radius: 4px;
 }
 .ui-button.ui-corner-all,
 .ui-button.ui-corner-bottom,
 .ui-button.ui-corner-left,
 .ui-button.ui-corner-bl {
-       -moz-border-radius-bottomleft: 4px;
-       -webkit-border-bottom-left-radius: 4px;
        border-bottom-left-radius: 4px;
 }
 .ui-button.ui-corner-all,
 .ui-button.ui-corner-bottom,
 .ui-button.ui-corner-right,
 .ui-button.ui-corner-br {
-       -moz-border-radius-bottomright: 4px;
-       -webkit-border-bottom-right-radius: 4px;
        border-bottom-right-radius: 4px;
 }
 
@@ -157,8 +149,6 @@ body .ui-button {
        line-height: 1.4em;
        width: auto;
        overflow: visible;
-       -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.2);
-       -moz-box-shadow: 0 1px 3px rgba(0,0,0,.2);
        box-shadow: 0 1px 3px rgba(0,0,0,.2);
 }
 
@@ -180,15 +170,11 @@ body .ui-button:hover {
        background: -ms-linear-gradient(top, #fff 0%, #eee 90%) !important; /* IE10+ */
        background: linear-gradient(to bottom, #fff 0%, #eee 90%) !important;
        filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0); /* IE6-8 */
-       -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.1);
-       -moz-box-shadow: 0 1px 3px rgba(0,0,0,.1);
        box-shadow: 0 1px 3px rgba(0,0,0,.1);
 }
 body .ui-button:active,
 body .ui-button:focus {
        border-color: #8ad !important;
-       -webkit-box-shadow: 0 0 1px 1px rgba(167,215,249,.5);
-       -moz-box-shadow: 0 0 1px 1px rgba(167,215,249,.5);
        box-shadow: 0 0 1px 1px rgba(167,215,249,.5);
 }
 body .ui-button:active {
@@ -216,8 +202,6 @@ body .ui-button.ui-button-green {
        background: -ms-linear-gradient(top, #3c8 0%, #295 90%) !important; /* IE10+ */
        background: linear-gradient(to bottom, #3c8 0%, #295 90%) !important;
        filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#33cc88', endColorstr='#229955', GradientType=0); /* IE6-8 */
-       -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.3);
-       -moz-box-shadow: 0 1px 3px rgba(0,0,0,.3);
        box-shadow: 0 1px 3px rgba(0,0,0,.3);
 }
 body .ui-button.ui-button-green:hover {
@@ -228,15 +212,11 @@ body .ui-button.ui-button-green:hover {
        background: -ms-linear-gradient(top, #44d388 0%, #33a055 90%) !important; /* IE10+ */
        background: linear-gradient(to bottom, #44d388 0%, #33a055 90%) !important;
        filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#44d388', endColorstr='#33a055', GradientType=0); /* IE6-8 */
-       -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.25);
-       -moz-box-shadow: 0 1px 3px rgba(0,0,0,.25);
        box-shadow: 0 1px 3px rgba(0,0,0,.25);
 }
 body .ui-button.ui-button-green:active,
 body .ui-button.ui-button-green:focus {
        border-color: #172 !important;
-       -webkit-box-shadow: 0 0 2px 2px rgba(167,215,249,.75);
-       -moz-box-shadow: 0 0 2px 2px rgba(167,215,249,.75);
        box-shadow: 0 0 2px 2px rgba(167,215,249,.75);
 }
 body .ui-button.ui-button-green:active {
@@ -264,8 +244,6 @@ body .ui-button.ui-button-blue {
        background: -ms-linear-gradient(top, #48e 0%, #36b 90%) !important; /* IE10+ */
        background: linear-gradient(to bottom, #48e 0%, #36b 90%) !important;
        filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#4488ee', endColorstr='#3366bb', GradientType=0); /* IE6-8 */
-       -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.35);
-       -moz-box-shadow: 0 1px 3px rgba(0,0,0,.35);
        box-shadow: 0 1px 3px rgba(0,0,0,.35);
 }
 body .ui-button.ui-button-blue:hover {
@@ -280,8 +258,6 @@ body .ui-button.ui-button-blue:hover {
 body .ui-button.ui-button-blue:active,
 body .ui-button.ui-button-blue:focus {
        border-color: #357 !important;
-       -webkit-box-shadow: 0 0 2px 2px rgba(167,215,249,.75);
-       -moz-box-shadow: 0 0 2px 2px rgba(167,215,249,.75);
        box-shadow: 0 0 2px 2px rgba(167,215,249,.75);
 }
 body .ui-button.ui-button-blue:active {
@@ -309,8 +285,6 @@ body .ui-button.ui-button-red {
        background: -ms-linear-gradient(top, #d44 0%, #a22 90%) !important; /* IE10+ */
        background: linear-gradient(to bottom, #d44 0%, #a22 90%) !important;
        filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#dd4444', endColorstr='#aa2222', GradientType=0); /* IE6-8 */
-       -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.35);
-       -moz-box-shadow: 0 1px 3px rgba(0,0,0,.35);
        box-shadow: 0 1px 3px rgba(0,0,0,.35);
 }
 body .ui-button.ui-button-red:hover {
@@ -322,15 +296,11 @@ body .ui-button.ui-button-red:hover {
        background: -ms-linear-gradient(top, #ee4646 0%, #b03333 90%) !important; /* IE10+ */
        background: linear-gradient(to bottom, #ee4646 0%, #b03333 90%) !important;
        filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee4646', endColorstr='#b03333', GradientType=0); /* IE6-8 */
-       -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.3);
-       -moz-box-shadow: 0 1px 3px rgba(0,0,0,.3);
        box-shadow: 0 1px 3px rgba(0,0,0,.3);
 }
 body .ui-button.ui-button-red:active,
 body .ui-button.ui-button-red:focus {
        border-color: #747 !important;
-       -webkit-box-shadow: 0 0 2px 2px rgba(167,215,249,.7);
-       -moz-box-shadow: 0 0 2px 2px rgba(167,215,249,.7);
        box-shadow: 0 0 2px 2px rgba(167,215,249,.7);
 }
 body .ui-button.ui-button-red:active {
@@ -367,8 +337,6 @@ body .ui-button.disabled:hover {
        background: -ms-linear-gradient(top, #f6f6f6 0%, #eee 90%) !important; /* IE10+ */
        background: linear-gradient(to bottom, #f6f6f6 0%, #eee 90%) !important;
        filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f6f6f6', endColorstr='#eeeeee', GradientType=0); /* IE6-8 */
-       -webkit-box-shadow: 0 1px 3px rgba(0,0,0,0);
-       -moz-box-shadow: 0 1px 3px rgba(0,0,0,0);
        box-shadow: 0 1px 3px rgba(0,0,0,0);
 }
 body .ui-button-green.disabled .ui-button-text,
index e39371d..8f46645 100644 (file)
 ----------------------------------*/
 
 /* Corner radius */
-.ui-corner-tl { -moz-border-radius-topleft: 0; -webkit-border-top-left-radius: 0; }
-.ui-corner-tr { -moz-border-radius-topright: 0; -webkit-border-top-right-radius: 0; }
-.ui-corner-bl { -moz-border-radius-bottomleft: 0; -webkit-border-bottom-left-radius: 0; }
-.ui-corner-br { -moz-border-radius-bottomright: 0; -webkit-border-bottom-right-radius: 0; }
-.ui-corner-top { -moz-border-radius-topleft: 0; -webkit-border-top-left-radius: 0; -moz-border-radius-topright: 0; -webkit-border-top-right-radius: 0; }
-.ui-corner-bottom { -moz-border-radius-bottomleft: 0; -webkit-border-bottom-left-radius: 0; -moz-border-radius-bottomright: 0; -webkit-border-bottom-right-radius: 0; }
-.ui-corner-right {  -moz-border-radius-topright: 0; -webkit-border-top-right-radius: 0; -moz-border-radius-bottomright: 0; -webkit-border-bottom-right-radius: 0; }
-.ui-corner-left { -moz-border-radius-topleft: 0; -webkit-border-top-left-radius: 0; -moz-border-radius-bottomleft: 0; -webkit-border-bottom-left-radius: 0; }
-.ui-corner-all { -moz-border-radius: 0; -webkit-border-radius: 0; }
+.ui-corner-tl { border-top-left-radius: 0; }
+.ui-corner-tr { border-top-right-radius: 0; }
+.ui-corner-bl { border-bottom-left-radius: 0; }
+.ui-corner-br { border-bottom-right-radius: 0; }
+.ui-corner-top { border-top-left-radius: 0; border-top-right-radius: 0; }
+.ui-corner-bottom { border-bottom-left-radius: 0; border-bottom-right-radius: 0; }
+.ui-corner-right {  border-top-right-radius: 0; border-bottom-right-radius: 0; }
+.ui-corner-left { border-top-left-radius: 0; border-bottom-left-radius: 0; }
+.ui-corner-all { border-radius: 0; }
 
 /* Overlays */
 .ui-widget-overlay { background: #000000; opacity: .75;filter:Alpha(Opacity=75); }
-.ui-widget-shadow { margin: -7px 0 0 -7px; padding: 7px; /* @embed */ background: #000000 url(images/ui-bg_flat_70_000000_40x100.png) 50% 50% repeat-x; opacity: .20;filter:Alpha(Opacity=20); -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }
\ No newline at end of file
+.ui-widget-shadow { margin: -7px 0 0 -7px; padding: 7px; /* @embed */ background: #000000 url(images/ui-bg_flat_70_000000_40x100.png) 50% 50% repeat-x; opacity: .20;filter:Alpha(Opacity=20); border-radius: 8px; }
diff --git a/resources/src/jquery/jquery.accessKeyLabel.js b/resources/src/jquery/jquery.accessKeyLabel.js
new file mode 100644 (file)
index 0000000..80b8303
--- /dev/null
@@ -0,0 +1,200 @@
+/**
+ * jQuery plugin to update the tooltip to show the correct access key
+ *
+ * @class jQuery.plugin.accessKeyLabel
+ */
+( function ( $, mw ) {
+
+// Cached access key prefix for used browser
+var cachedAccessKeyPrefix,
+
+       // Wether to use 'test-' instead of correct prefix (used for testing)
+       useTestPrefix = false,
+
+       // tag names which can have a label tag
+       // https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Content_categories#Form-associated_content
+       labelable = 'button, input, textarea, keygen, meter, output, progress, select';
+
+/**
+ * Get the prefix for the access key for browsers that don't support accessKeyLabel.
+ *
+ * For browsers that support accessKeyLabel, #getAccessKeyLabel never calls here.
+ *
+ * @private
+ * @param {Object} [ua] An object with a 'userAgent' and 'platform' property.
+ * @return {string} Access key prefix
+ */
+function getAccessKeyPrefix( ua ) {
+       // use cached prefix if possible
+       if ( !ua && cachedAccessKeyPrefix ) {
+               return cachedAccessKeyPrefix;
+       }
+
+       var profile = $.client.profile( ua ),
+               accessKeyPrefix = 'alt-';
+
+       // Opera on any platform
+       if ( profile.name === 'opera' ) {
+               accessKeyPrefix = 'shift-esc-';
+
+       // Chrome on any platform
+       } else if ( profile.name === 'chrome' ) {
+               accessKeyPrefix = (
+                       profile.platform === 'mac'
+                               // Chrome on Mac
+                               ? 'ctrl-option-'
+                               // Chrome on Windows or Linux
+                               // (both alt- and alt-shift work, but alt with E, D, F etc does not
+                               // work since they are browser shortcuts)
+                               : 'alt-shift-'
+               );
+
+       // Non-Windows Safari with webkit_version > 526
+       } else if ( profile.platform !== 'win'
+               && profile.name === 'safari'
+               && profile.layoutVersion > 526
+       ) {
+               accessKeyPrefix = 'ctrl-alt-';
+
+       // Safari/Konqueror on any platform, or any browser on Mac
+       // (but not Safari on Windows)
+       } else if ( !( profile.platform === 'win' && profile.name === 'safari' )
+               && ( profile.name === 'safari'
+               || profile.platform === 'mac'
+               || profile.name === 'konqueror' )
+       ) {
+               accessKeyPrefix = 'ctrl-';
+
+       // Firefox/Iceweasel 2.x and later
+       } else if ( ( profile.name === 'firefox' || profile.name === 'iceweasel' )
+               && profile.versionBase > '1'
+       ) {
+               accessKeyPrefix = 'alt-shift-';
+       }
+
+       // cache prefix
+       if ( !ua ) {
+               cachedAccessKeyPrefix = accessKeyPrefix;
+       }
+       return accessKeyPrefix;
+}
+
+/**
+ * Get the access key label for an element.
+ *
+ * Will use native accessKeyLabel if available (currently only in Firefox 8+),
+ * falls back to #getAccessKeyPrefix.
+ *
+ * @private
+ * @param {HTMLElement} element Element to get the label for
+ * @return {string} Access key label
+ */
+function getAccessKeyLabel( element ) {
+       // abort early if no access key
+       if ( !element.accessKey ) {
+               return '';
+       }
+       // use accessKeyLabel if possible
+       // http://www.whatwg.org/specs/web-apps/current-work/multipage/editing.html#dom-accesskeylabel
+       if ( !useTestPrefix && element.accessKeyLabel ) {
+               return element.accessKeyLabel;
+       }
+       return ( useTestPrefix ? 'test-' : getAccessKeyPrefix() ) + element.accessKey;
+}
+
+/**
+ * Update the title for an element (on the element with the access key or it's label) to show
+ * the correct access key label.
+ *
+ * @private
+ * @param {HTMLElement} element Element with the accesskey
+ * @param {HTMLElement} titleElement Element with the title to update (may be the same as `element`)
+ */
+function updateTooltipOnElement( element, titleElement ) {
+       var array = ( mw.msg( 'word-separator' ) + mw.msg( 'brackets' ) ).split( '$1' ),
+               regexp = new RegExp( $.map( array, $.escapeRE ).join( '.*?' ) + '$' ),
+               oldTitle = titleElement.title,
+               rawTitle = oldTitle.replace( regexp, '' ),
+               newTitle = rawTitle,
+               accessKeyLabel = getAccessKeyLabel( element );
+
+       // don't add a title if the element didn't have one before
+       if ( !oldTitle ) {
+               return;
+       }
+
+       if ( accessKeyLabel ) {
+               // Should be build the same as in Linker::titleAttrib
+               newTitle += mw.msg( 'word-separator' ) + mw.msg( 'brackets', accessKeyLabel );
+       }
+       if ( oldTitle !== newTitle ) {
+               titleElement.title = newTitle;
+       }
+}
+
+/**
+ * Update the title for an element to show the correct access key label.
+ *
+ * @private
+ * @param {HTMLElement} element Element with the accesskey
+ */
+function updateTooltip( element ) {
+       var id, $element, $label, $labelParent;
+       updateTooltipOnElement( element, element );
+
+       // update associated label if there is one
+       $element = $( element );
+       if ( $element.is( labelable ) ) {
+               // Search it using 'for' attribute
+               id = element.id.replace( /"/g, '\\"' );
+               if ( id ) {
+                       $label = $( 'label[for="' + id + '"]' );
+                       if ( $label.length === 1 ) {
+                               updateTooltipOnElement( element, $label[0] );
+                       }
+               }
+
+               // Search it as parent, because the form control can also inside the label element itself
+               $labelParent = $element.parents( 'label' );
+               if ( $labelParent.length === 1 ) {
+                       updateTooltipOnElement( element, $labelParent[0] );
+               }
+       }
+}
+
+/**
+ * Update the titles for all elements in a jQuery selection.
+ *
+ * @return {jQuery}
+ * @chainable
+ */
+$.fn.updateTooltipAccessKeys = function () {
+       return this.each( function () {
+               updateTooltip( this );
+       } );
+};
+
+/**
+ * Exposed for testing.
+ *
+ * @method updateTooltipAccessKeys_getAccessKeyPrefix
+ * @inheritdoc #getAccessKeyPrefix
+ */
+$.fn.updateTooltipAccessKeys.getAccessKeyPrefix = getAccessKeyPrefix;
+
+/**
+ * Switch test mode on and off.
+ *
+ * @method updateTooltipAccessKeys_setTestMode
+ * @param {boolean} mode New mode
+ */
+$.fn.updateTooltipAccessKeys.setTestMode = function ( mode ) {
+       useTestPrefix = mode;
+};
+
+/**
+ * @class jQuery
+ * @mixins jQuery.plugin.accessKeyLabel
+ */
+
+}( jQuery, mediaWiki ) );
index c44e7c5..66a3c56 100644 (file)
@@ -49,7 +49,7 @@
                // Also add in the padding for the calculated arrow width.
                arrowWidth = parseInt( this.outerHeight(), 10 );
                $steps.filter( ':not(:last-child)' ).addClass( 'arrow' )
-                     .find( 'div' ).css( paddingSide, arrowWidth.toString() + 'px' );
+                       .find( 'div' ).css( paddingSide, arrowWidth.toString() + 'px' );
 
                this.data( 'arrowSteps', $steps );
                return this;
index f313663..fa7ea70 100644 (file)
@@ -34,4 +34,3 @@
 .mw-badge-important {
        background-color: #cc0000;
 }
-
index 398937e..7fe25ee 100644 (file)
@@ -1,14 +1,19 @@
 /**
- * jQuery.byteLength
- *
- * Calculate the byte length of a string (accounting for UTF-8).
- *
+ * @class jQuery.plugin.byteLength
  * @author Jan Paul Posma, 2011
  * @author Timo Tijhof, 2012
  * @author David Chan, 2013
  */
-jQuery.byteLength = function ( str ) {
 
+/**
+ * Calculate the byte length of a string (accounting for UTF-8).
+ *
+ * @static
+ * @inheritable
+ * @param {string} str
+ * @return {string}
+ */
+jQuery.byteLength = function ( str ) {
        // This basically figures out how many bytes a UTF-16 string (which is what js sees)
        // will take in UTF-8 by replacing a 2 byte character with 2 *'s, etc, and counting that.
        // Note, surrogate (\uD800-\uDFFF) characters are counted as 2 bytes, since there's two of them
@@ -27,5 +32,9 @@ jQuery.byteLength = function ( str ) {
                .replace( /[\u0080-\u07FF\uD800-\uDFFF]/g, '**' )
                .replace( /[\u0800-\uD7FF\uE000-\uFFFF]/g, '***' )
                .length;
-
 };
+
+/**
+ * @class jQuery
+ * @mixins jQuery.plugin.byteLength
+ */
index b206566..d99e9f0 100644 (file)
@@ -1,13 +1,15 @@
 /**
- * jQuery checkboxShiftClick
- *
- * This will enable checkboxes to be checked or unchecked in a row by clicking one,
- * holding shift and clicking another one.
- *
- * @author Timo Tijhof, 2011 - 2012
- * @license GPL v2
+ * @class jQuery.plugin.checkboxShiftClick
  */
 ( function ( $ ) {
+
+       /**
+        * Enable checkboxes to be checked or unchecked in a row by clicking one,
+        * holding shift and clicking another one.
+        *
+        * @return {jQuery}
+        * @chainable
+        */
        $.fn.checkboxShiftClick = function () {
                var prevCheckbox = null,
                        $box = this;
                } );
                return $box;
        };
+
+       /**
+        * @class jQuery
+        * @mixins jQuery.plugin.checkboxShiftClick
+        */
+
 }( jQuery ) );
index 6689b7c..662a688 100644 (file)
@@ -1,35 +1,36 @@
 /**
  * User-agent detection
+ *
+ * @class jQuery.client
+ * @singleton
  */
 ( function ( $ ) {
 
-       /* Private Members */
-
        /**
-        * @var {Object} profileCache Keyed by userAgent string,
+        * @private
+        * @property {Object} profileCache Keyed by userAgent string,
         * value is the parsed $.client.profile object for that user agent.
         */
        var profileCache = {};
 
-       /* Public Methods */
-
        $.client = {
 
                /**
                 * Get an object containing information about the client.
                 *
-                * @param {Object} nav An object with atleast a 'userAgent' and 'platform' key.
-                * Defaults to the global Navigator object.
+                * @param {Object} [nav] An object with a 'userAgent' and 'platform' property.
+                *  Defaults to the global `navigator` object.
                 * @return {Object} The resulting client object will be in the following format:
-                *  {
-                *   'name': 'firefox',
-                *   'layout': 'gecko',
-                *   'layoutVersion': 20101026,
-                *   'platform': 'linux'
-                *   'version': '3.5.1',
-                *   'versionBase': '3',
-                *   'versionNumber': 3.5,
-                *  }
+                *
+                *     {
+                *         'name': 'firefox',
+                *         'layout': 'gecko',
+                *         'layoutVersion': 20101026,
+                *         'platform': 'linux'
+                *         'version': '3.5.1',
+                *         'versionBase': '3',
+                *         'versionNumber': 3.5,
+                *     }
                 */
                profile: function ( nav ) {
                        /*jshint boss: true */
@@ -47,7 +48,7 @@
                                versionNumber,
                                key = nav.userAgent + '|' + nav.platform,
 
-                               /* Configuration */
+                               // Configuration
 
                                // Name of browsers or layout engines we don't recognize
                                uk = 'unknown',
                                // Translations for conforming operating system names
                                platformTranslations = [ ['sunos', 'solaris'], ['wow64', 'win'] ],
 
-                               /* Methods */
-
                                /**
                                 * Performs multiple replacements on a string
+                                * @ignore
                                 */
                                translate = function ( source, translations ) {
                                        var i;
                                        return source;
                                },
 
-                               /* Pre-processing */
+                               // Pre-processing
 
                                ua = nav.userAgent,
                                match,
                        // Everything will be in lowercase from now on
                        ua = ua.toLowerCase();
 
-                       /* Extraction */
+                       // Extraction
 
                        if ( match = new RegExp( '(' + names.join( '|' ) + ')' ).exec( ua ) ) {
                                name = translate( match[1], nameTranslations );
                                version = match[3];
                        }
 
-                       /* Edge Cases -- did I mention about how user agent string lie? */
+                       // Edge Cases -- did I mention about how user agent string lie?
 
                        // Decode Safari's crazy 400+ version numbers
                        if ( name === 'safari' && version > 400 ) {
 
                        versionNumber = parseFloat( version, 10 ) || 0.0;
 
-                       /* Caching */
+                       // Caching
 
                        return profileCache[ key  ] = {
                                name: name,
                 * algorithm, similar to PHP's version_compare ('1.2' < '1.11').
                 *
                 * A browser map is in the following format:
-                * {
-                *   // Multiple rules with configurable operators
-                *   'msie': [['>=', 7], ['!=', 9]],
-                *    // Match no versions
-                *   'iphone': false,
-                *    // Match any version
-                *   'android': null
-                * }
+                *
+                *     {
+                *         // Multiple rules with configurable operators
+                *         'msie': [['>=', 7], ['!=', 9]],
+                *         // Match no versions
+                *         'iphone': false,
+                *         // Match any version
+                *         'android': null
+                *     }
                 *
                 * It can optionally be split into ltr/rtl sections:
-                * {
-                *   'ltr': {
-                *     'android': null,
-                *     'iphone': false
-                *   },
-                *   'rtl': {
-                *     'android': false,
-                *     // rules are not inherited from ltr
-                *     'iphone': false
-                *   }
-                * }
+                *
+                *     {
+                *         'ltr': {
+                *             'android': null,
+                *             'iphone': false
+                *         },
+                *         'rtl': {
+                *             'android': false,
+                *             // rules are not inherited from ltr
+                *             'iphone': false
+                *         }
+                *     }
                 *
                 * @param {Object} map Browser support map
                 * @param {Object} [profile] A client-profile object
index 37bf176..be770a9 100644 (file)
@@ -1,17 +1,27 @@
-/**
+/*!
  * jQuery Color Utilities
- * Written by Krinkle in 2011
+ *
  * Released under the MIT and GPL licenses.
+ *
  * Mostly based on other plugins and functions (linted and optimized a little).
  * Sources cited inline.
  */
 ( function ( $ ) {
+       /**
+        * @class jQuery.colorUtil
+        * @singleton
+        */
        $.colorUtil = {
 
-               // Color Conversion function from highlightFade
-               // By Blair Mitchelmore
-               // http://jquery.offput.ca/highlightFade/
-               // Parse strings looking for color tuples [255,255,255]
+               /**
+                * Parse CSS color strings looking for color tuples
+                *
+                * Based on highlightFade by Blair Mitchelmore
+                * <http://jquery.offput.ca/highlightFade/>
+                *
+                * @param {Array|string} color
+                * @return {Array}
+                */
                getRGB: function ( color ) {
                        /*jshint boss:true */
                        var result;
                        return $.colorUtil.colors[$.trim(color).toLowerCase()];
                },
 
-               // Some named colors to work with
-               // From Interface by Stefan Petre
-               // http://interface.eyecon.ro/
+               /**
+                * Named color map
+                *
+                * Based on Interface by Stefan Petre
+                * <http://interface.eyecon.ro/>
+                *
+                * @property {Object}
+                */
                colors: {
                        aqua: [0,255,255],
                        azure: [240,255,255],
                },
 
                /**
-                * http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript
-                * Converts an RGB color value to HSL. Conversion formula
-                * adapted from http://en.wikipedia.org/wiki/HSL_color_space.
-                * Assumes r, g, and b are contained in the set [0, 255] and
-                * returns h, s, and l in the set [0, 1].
+                * Convert an RGB color value to HSL.
                 *
-                * @param       Number  R               The red color value
-                * @param       Number  G               The green color value
-                * @param       Number  B               The blue color value
-                * @return      Array                   The HSL representation
+                * Conversion formula based on
+                * <http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript>
+                *
+                * Adapted from <https://en.wikipedia.org/wiki/HSL_color_space>.
+                *
+                * Assumes `r`, `g`, and `b` are contained in the set `[0, 255]` and
+                * returns `h`, `s`, and `l` in the set `[0, 1]`.
+                *
+                * @param {number} r The red color value
+                * @param {number} g The green color value
+                * @param {number} b The blue color value
+                * @return {number[]} The HSL representation
                 */
-               rgbToHsl: function ( R, G, B ) {
+               rgbToHsl: function ( r, g, b ) {
+                       r = r / 255;
+                       g = g / 255;
+                       b = b / 255;
+
                        var d,
-                               r = R / 255,
-                               g = G / 255,
-                               b = B / 255,
-                               max = Math.max( r, g, b ), min = Math.min( r, g, b ),
+                               max = Math.max( r, g, b ),
+                               min = Math.min( r, g, b ),
                                h,
                                s,
                                l = (max + min) / 2;
                },
 
                /**
-                * http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript
-                * Converts an HSL color value to RGB. Conversion formula
-                * adapted from http://en.wikipedia.org/wiki/HSL_color_space.
-                * Assumes h, s, and l are contained in the set [0, 1] and
-                * returns r, g, and b in the set [0, 255].
+                * Convert an HSL color value to RGB.
+                *
+                * Conversion formula based on
+                * <http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript>
+                *
+                * Adapted from <https://en.wikipedia.org/wiki/HSL_color_space>.
+                *
+                * Assumes `h`, `s`, and `l` are contained in the set `[0, 1]` and
+                * returns `r`, `g`, and `b` in the set `[0, 255]`.
                 *
-                * @param       Number  h               The hue
-                * @param       Number  s               The saturation
-                * @param       Number  l               The lightness
-                * @return      Array                   The RGB representation
+                * @param {number} h The hue
+                * @param {number} s The saturation
+                * @param {number} l The lightness
+                * @return {number[]} The RGB representation
                 */
                hslToRgb: function ( h, s, l ) {
                        var r, g, b, hue2rgb, q, p;
                },
 
                /**
-                * Get's a brighter or darker rgb() value string.
+                * Get a brighter or darker rgb() value string.
                 *
-                * @author Krinkle
+                * Usage:
                 *
-                * @example     getCSSColorMod( 'red', +0.1 )
-                * @example     getCSSColorMod( 'rgb(200,50,50)', -0.2 )
+                *     $.colorUtil.getColorBrightness( 'red', +0.1 );
+                *     // > "rgb(255,50,50)"
+                *     $.colorUtil.getColorBrightness( 'rgb(200,50,50)', -0.2 );
+                *     // > "rgb(118,29,29)"
                 *
-                * @param       Mixed   currentColor current value in css
-                * @param       Number  mod wanted brightness modification between -1 and 1
-                * @return      String 'rgb(r,g,b)'
+                * @param {Mixed} currentColor Current value in css
+                * @param {number} mod Wanted brightness modification between -1 and 1
+                * @return {string} Like `'rgb(r,g,b)'`
                 */
                getColorBrightness: function ( currentColor, mod ) {
                        var rgbArr = $.colorUtil.getRGB( currentColor ),
index 56fc32d..de745c3 100644 (file)
@@ -1,14 +1,5 @@
 /**
- * Utility to stack stuff in an overlay fixed on the bottom of the page.
- *
- * Usage:
- * <code>
- *     var hovzer = $.getFootHovzer();
- *     hovzer.$.append( $myCollection );
- *     hovzer.update();
- * </code>
- *
- * @author Timo Tijhof, 2012
+ * @class jQuery.plugin.footHovzer
  */
 ( function ( $ ) {
        var $hovzer, footHovzer, prevHeight, newHeight;
                return $hovzer;
        }
 
+       /**
+        * Utility to stack stuff in an overlay fixed on the bottom of the page.
+        *
+        * Usage:
+        *
+        *     var hovzer = $.getFootHovzer();
+        *     hovzer.$.append( $myCollection );
+        *     hovzer.update();
+        *
+        * @static
+        * @inheritable
+        * @return {jQuery.footHovzer}
+        */
+       $.getFootHovzer = function () {
+               footHovzer.$ = getHovzer();
+               return footHovzer;
+       };
+
+       /**
+        * @private
+        * @class jQuery.footHovzer
+        */
        footHovzer = {
+
+               /**
+                * @property {jQuery} $ The stack container
+                */
+
+               /**
+                * Update dimensions of stack to account for changes in the subtree.
+                */
                update: function () {
                        var $body;
 
                        $body = $( 'body' );
                        if ( prevHeight === undefined ) {
-                               prevHeight = getHovzer().outerHeight( /*includeMargin=*/true );
+                               prevHeight = getHovzer().outerHeight( /* includeMargin = */ true );
                                $body.css( 'paddingBottom', '+=' + prevHeight + 'px' );
                        } else {
                                newHeight = getHovzer().outerHeight( true );
@@ -37,9 +58,9 @@
                }
        };
 
-       $.getFootHovzer = function () {
-               footHovzer.$ = getHovzer();
-               return footHovzer;
-       };
+       /**
+        * @class jQuery
+        * @mixins jQuery.plugin.footHovzer
+        */
 
 }( jQuery ) );
index 25b806b..c44831c 100644 (file)
@@ -1,7 +1,24 @@
 /**
- * Utility to get all attributes of an element directy as an object.
+ * @class jQuery.plugin.getAttrs
+ */
+
+/**
+ * Get the attributes of an element directy as a plain object.
+ *
+ * If there are more elements in the collection, like most jQuery get/read methods,
+ * this method will use the first element in the collection.
+ *
+ * In IE6, the `attributes` map of a node includes *all* allowed attributes
+ * for an element (including those not set). Those will have values like
+ * `undefined`, `null`, `0`, `false`, `""` or `"inherit"`.
  *
- * @author Timo Tijhof, 2011
+ * However there may be attributes genuinely set to one of those values, and there
+ * is no way to distinguish between attributes set to that and those not set and
+ * it being the default. If you need them, set `all` to `true`. They are filtered out
+ * by default.
+ *
+ * @param {boolean} [all=false]
+ * @return {Object}
  */
 jQuery.fn.getAttrs = function ( all ) {
        var map = this[0].attributes,
@@ -10,10 +27,6 @@ jQuery.fn.getAttrs = function ( all ) {
                i, v;
 
        for ( i = 0; i < len; i++ ) {
-               // IE6 includes *all* allowed attributes for thew element (including those
-               // not set). Those have values like undefined, null, 0, false, "" or "inherit".
-               // However there may be genuine attributes set to that. If you need them,
-               // set all to true. They are excluded by default.
                v = map[i].nodeValue;
                if ( all || ( v && v !== 'inherit' ) ) {
                        attrs[ map[i].nodeName ] = v;
@@ -22,3 +35,8 @@ jQuery.fn.getAttrs = function ( all ) {
 
        return attrs;
 };
+
+/**
+ * @class jQuery
+ * @mixins jQuery.plugin.getAttrs
+ */
index eb29db9..71b083b 100644 (file)
@@ -1,21 +1,27 @@
 /**
- * Responsive images based on 'srcset' and 'window.devicePixelRatio' emulation where needed.
+ * Responsive images based on `srcset` and `window.devicePixelRatio` emulation where needed.
  *
- * Call $().hidpi() on a document or part of a document to replace image srcs in that section.
+ * Call `.hidpi()` on a document or part of a document to proces image srcsets within that section.
  *
- * $.devicePixelRatio() can be used to supplement window.devicePixelRatio with support on
- * some additional browsers.
+ * `$.devicePixelRatio()` can be used as a substitute for `window.devicePixelRatio`.
+ * It provides a familiar interface to retrieve the pixel ratio for browsers that don't
+ * implement `window.devicePixelRatio` but do have a different way of getting it.
+ *
+ * @class jQuery.plugin.hidpi
  */
 ( function ( $ ) {
 
 /**
- * Detect reported or approximate device pixel ratio.
- * 1.0 means 1 CSS pixel is 1 hardware pixel
- * 2.0 means 1 CSS pixel is 2 hardware pixels
- * etc
+ * Get reported or approximate device pixel ratio.
+ *
+ * - 1.0 means 1 CSS pixel is 1 hardware pixel
+ * - 2.0 means 1 CSS pixel is 2 hardware pixels
+ * - etc.
  *
- * Uses window.devicePixelRatio if available, or CSS media queries on IE.
+ * Uses `window.devicePixelRatio` if available, or CSS media queries on IE.
  *
+ * @static
+ * @inheritable
  * @return {number} Device pixel ratio
  */
 $.devicePixelRatio = function () {
@@ -51,6 +57,7 @@ $.devicePixelRatio = function () {
  * native srcset support.
  *
  * @return {jQuery} This selection
+ * @chainable
  */
 $.fn.hidpi = function () {
        var $target = this,
@@ -81,9 +88,11 @@ $.fn.hidpi = function () {
  *
  * Exposed for testing.
  *
+ * @private
+ * @static
  * @param {number} devicePixelRatio
  * @param {string} srcset
- * @return {mixed} null or the matching src string
+ * @return {Mixed} null or the matching src string
  */
 $.matchSrcSet = function ( devicePixelRatio, srcset ) {
        var candidates,
@@ -112,4 +121,9 @@ $.matchSrcSet = function ( devicePixelRatio, srcset ) {
        return selectedSrc;
 };
 
+/**
+ * @class jQuery
+ * @mixins jQuery.plugin.hidpi
+ */
+
 }( jQuery ) );
index 0408151..1338218 100644 (file)
                                        middlebit.parentNode.replaceChild( spannode, middlebit );
                                }
                        // if this is an element with childnodes, and not a script, style or an element we created
-                       } else if ( node.nodeType === 1 && node.childNodes && !/(script|style)/i.test( node.tagName )
-                                       && !( node.tagName.toLowerCase() === 'span' && node.className.match( /\bhighlight/ ) ) ) {
+                       } else if ( node.nodeType === 1
+                               && node.childNodes
+                               && !/(script|style)/i.test( node.tagName )
+                               && !( node.tagName.toLowerCase() === 'span'
+                                       && node.className.match( /\bhighlight/ )
+                               )
+                       ) {
                                for ( i = 0; i < node.childNodes.length; ++i ) {
                                        // call the highlight function for each child node
                                        $.highlightText.innerHighlight( node.childNodes[i], pat );
index 55ea7c9..0f47150 100644 (file)
@@ -6,6 +6,10 @@
        -ms-user-select: none;
        user-select: none;
 }
+.mw-customtoggle,
+.mw-collapsible-toggle {
+       cursor: pointer;
+}
 
 /* collapse links in captions should be inline */
 caption .mw-collapsible-toggle {
index 01fde4c..05745f8 100644 (file)
@@ -1,27 +1,22 @@
 /**
  * jQuery makeCollapsible
  *
- * This will enable collapsible-functionality on all passed elements.
- * - Will prevent binding twice to the same element.
- * - Initial state is expanded by default, this can be overriden by adding class
- *   "mw-collapsed" to the "mw-collapsible" element.
- * - Elements made collapsible have jQuery data "mw-made-collapsible" set to true.
- * - The inner content is wrapped in a "div.mw-collapsible-content" (except for tables and lists).
+ * Dual licensed:
+ * - CC BY 3.0 <http://creativecommons.org/licenses/by/3.0>
+ * - GPL2 <http://www.gnu.org/licenses/old-licenses/gpl-2.0.html>
  *
- * @author Krinkle, 2011-2012
- *
- * Dual license:
- * @license CC BY 3.0 <http://creativecommons.org/licenses/by/3.0>
- * @license GPL2 <http://www.gnu.org/licenses/old-licenses/gpl-2.0.html>
+ * @class jQuery.plugin.makeCollapsible
  */
 ( function ( $, mw ) {
+
        /**
         * Handler for a click on a collapsible toggler.
         *
+        * @private
         * @param {jQuery} $collapsible
         * @param {string} action The action this function will take ('expand' or 'collapse').
-        * @param {jQuery|null} [optional] $defaultToggle
-        * @param {Object|undefined} options
+        * @param {jQuery|null} [$defaultToggle]
+        * @param {Object|undefined} [options]
         */
        function toggleElement( $collapsible, action, $defaultToggle, options ) {
                var $collapsibleContent, $containers, hookCallback;
        }
 
        /**
-        * Handles clicking/keypressing on the collapsible element toggle and other
+        * Handle clicking/keypressing on the collapsible element toggle and other
         * situations where a collapsible element is toggled (e.g. the initial
         * toggle for collapsed ones).
         *
+        * @private
         * @param {jQuery} $toggle the clickable toggle itself
         * @param {jQuery} $collapsible the collapsible element
         * @param {jQuery.Event|null} e either the event or null if unavailable
        }
 
        /**
-        * Make any element collapsible.
+        * Enable collapsible-functionality on all elements in the collection.
+        *
+        * - Will prevent binding twice to the same element.
+        * - Initial state is expanded by default, this can be overriden by adding class
+        *   "mw-collapsed" to the "mw-collapsible" element.
+        * - Elements made collapsible have jQuery data "mw-made-collapsible" set to true.
+        * - The inner content is wrapped in a "div.mw-collapsible-content" (except for tables and lists).
         *
-        * Supported options:
-        * - collapseText: text to be used for the toggler when clicking it would
-        *   collapse the element. Default: the 'data-collapsetext' attribute of
-        *   the collapsible element or the content of 'collapsible-collapse'
-        *   message.
-        * - expandText: text to be used for the toggler when clicking it would
-        *   expand the element. Default: the 'data-expandtext' attribute of
-        *   the collapsible element or the content of 'collapsible-expand'
-        *   message.
-        * - collapsed: boolean, whether to collapse immediately. By default
+        * @param {Object} [options]
+        * @param {string} [options.collapseText] Text used for the toggler, when clicking it would
+        *   collapse the element. Default: the 'data-collapsetext' attribute of the
+        *   collapsible element or the content of 'collapsible-collapse' message.
+        * @param {string} [options.expandText] Text used for the toggler, when clicking it would
+        *   expand the element. Default: the 'data-expandtext' attribute of the
+        *   collapsible element or the content of 'collapsible-expand' message.
+        * @param {boolean} [options.collapsed] Whether to collapse immediately. By default
         *   collapse only if the elements has the 'mw-collapsible' class.
-        * - $customTogglers: jQuerified list of elements to be used as togglers
+        * @param {jQuery} [options.$customTogglers] Elements to be used as togglers
         *   for this collapsible element. By default, if the collapsible element
         *   has an id attribute like 'mw-customcollapsible-XXX', elements with a
         *   *class* of 'mw-customtoggle-XXX' are made togglers for it.
-        * - plainMode: boolean, whether to use a "plain mode" when making the
+        * @param {boolean} [options.plainMode=false] Whether to use a "plain mode" when making the
         *   element collapsible - that is, hide entire tables and lists (instead
         *   of hiding only all rows but first of tables, and hiding each list
         *   item separately for lists) and don't wrap other elements in
         *   div.mw-collapsible-content. May only be used with custom togglers.
+        * @return {jQuery}
+        * @chainable
         */
        $.fn.makeCollapsible = function ( options ) {
                if ( options === undefined ) {
                                collapsibleId = $collapsible.attr( 'id' ) || '';
                                if ( collapsibleId.indexOf( 'mw-customcollapsible-' ) === 0 ) {
                                        $customTogglers = $( '.' + collapsibleId.replace( 'mw-customcollapsible', 'mw-customtoggle' ) );
+                                       $customTogglers.addClass( 'mw-customtoggle' );
                                }
                        }
 
                                                // Make sure the numeral order doesn't get messed up, force the first (soon to be second) item
                                                // to be "1". Except if the value-attribute is already used.
                                                // If no value was set WebKit returns "", Mozilla returns '-1', others return 0, null or undefined.
-                                               firstval = $firstItem.attr( 'value' );
+                                               firstval = $firstItem.prop( 'value' );
                                                if ( firstval === undefined || !firstval || firstval === '-1' || firstval === -1 ) {
-                                                       $firstItem.attr( 'value', '1' );
+                                                       $firstItem.prop( 'value', '1' );
                                                }
                                                $toggleLink = buildDefaultToggleLink();
                                                $toggleLink.wrap( '<li class="mw-collapsible-toggle-li"></li>' ).parent().prependTo( $collapsible );
                        }
                } );
        };
+
+       /**
+        * @class jQuery
+        * @mixins jQuery.plugin.makeCollapsible
+        */
+
 }( jQuery, mediaWiki ) );
index 6f7ada3..d458019 100644 (file)
                                if (!$input.data('placeholder-textinput')) {
                                        try {
                                                $replacement = $input.clone().attr({ 'type': 'text' });
-                                       } catch(e) {
+                                       } catch (e) {
                                                $replacement = $('<input>').attr($.extend(args(this), { 'type': 'text' }));
                                        }
                                        $replacement
index 86fcaea..1c47feb 100644 (file)
                this.methodCallTracker = {};
                this.missingTests = {};
 
-               this.ignoreFn = undefined === ignoreFn ? function () { return false; } : ignoreFn;
+               this.ignoreFn = ignoreFn === undefined ? function () { return false; } : ignoreFn;
 
                // Lazy limit in case something weird happends (like recurse (part of) ourself).
                this.lazyLimit = 2000;
index ed3d862..a20a948 100644 (file)
@@ -140,7 +140,7 @@ $.suggestions = {
         */
        configure: function ( context, property, value ) {
                var newCSS,
-                       $result, $results, childrenWidth,
+                       $result, $results, $spanForWidth, childrenWidth,
                        i, expWidth, maxWidth, text;
 
                // Validate creation using fallback values
@@ -215,10 +215,10 @@ $.suggestions = {
                                                        }
 
                                                        if ( expandFrom === 'start' ) {
-                                                               expandFrom = docDir === 'rtl' ? 'right': 'left';
+                                                               expandFrom = docDir === 'rtl' ? 'right' : 'left';
 
                                                        } else if ( expandFrom === 'end' ) {
-                                                               expandFrom = docDir === 'rtl' ? 'left': 'right';
+                                                               expandFrom = docDir === 'rtl' ? 'left' : 'right';
                                                        }
 
                                                        return expandFrom;
@@ -232,7 +232,7 @@ $.suggestions = {
                                                } else {
                                                        // Expand from right
                                                        newCSS.left = 'auto';
-                                                       newCSS.right = $( document ).width() - ( context.config.$region.offset().left + context.config.$region.outerWidth() );
+                                                       newCSS.right = $( 'body' ).width() - ( context.config.$region.offset().left + context.config.$region.outerWidth() );
                                                }
 
                                                context.data.$container.css( newCSS );
@@ -266,9 +266,11 @@ $.suggestions = {
                                                                $result.highlightText( context.data.prevText );
                                                        }
 
-                                                       // Widen results box if needed
-                                                       // New width is only calculated here, applied later
-                                                       childrenWidth = $result.children().outerWidth();
+                                                       // Widen results box if needed (new width is only calculated here, applied later).
+                                                       // We need this awful hack to calculate the actual pre-ellipsis width.
+                                                       $spanForWidth = $result.wrapInner( '<span>' ).children();
+                                                       childrenWidth = $spanForWidth.outerWidth();
+                                                       $spanForWidth.contents().unwrap();
                                                        if ( childrenWidth > $result.width() && childrenWidth > expWidth ) {
                                                                // factor in any padding, margin, or border space on the parent
                                                                expWidth = childrenWidth + ( context.data.$container.width() - $result.width() );
@@ -533,15 +535,20 @@ $.fn.suggestions = function () {
                                                        if ( $result.get( 0 ) !== $other.get( 0 ) ) {
                                                                return;
                                                        }
-                                                       // do not interfere with non-left clicks or if modifier keys are pressed (e.g. ctrl-click)
+                                                       // Do not interfere with non-left clicks or if modifier keys are pressed (e.g. ctrl-click).
                                                        if ( !( e.which !== 1 || e.altKey || e.ctrlKey || e.shiftKey || e.metaKey ) ) {
                                                                $.suggestions.highlight( context, $result, true );
-                                                               $.suggestions.hide( context );
                                                                if ( typeof context.config.result.select === 'function' ) {
                                                                        context.config.result.select.call( $result, context.data.$textbox );
                                                                }
+                                                               // This will hide the link we're just clicking on, which causes problems
+                                                               // when done synchronously in at least Firefox 3.6 (bug 62858).
+                                                               setTimeout( function () {
+                                                                       $.suggestions.hide( context );
+                                                               }, 0 );
                                                        }
-                                                       // but still restore focus to the textbox, so that the suggestions will be hidden properly
+                                                       // Always bring focus to the textbox, as that's probably where the user expects it
+                                                       // if they were just typing.
                                                        context.data.$textbox.focus();
                                                } )
                                )
@@ -561,14 +568,19 @@ $.fn.suggestions = function () {
                                                        if ( $special.get( 0 ) !== $other.get( 0 ) ) {
                                                                return;
                                                        }
-                                                       // do not interfere with non-left clicks or if modifier keys are pressed (e.g. ctrl-click)
+                                                       // Do not interfere with non-left clicks or if modifier keys are pressed (e.g. ctrl-click).
                                                        if ( !( e.which !== 1 || e.altKey || e.ctrlKey || e.shiftKey || e.metaKey ) ) {
-                                                               $.suggestions.hide( context );
                                                                if ( typeof context.config.special.select === 'function' ) {
                                                                        context.config.special.select.call( $special, context.data.$textbox );
                                                                }
+                                                               // This will hide the link we're just clicking on, which causes problems
+                                                               // when done synchronously in at least Firefox 3.6 (bug 62858).
+                                                               setTimeout( function () {
+                                                                       $.suggestions.hide( context );
+                                                               }, 0 );
                                                        }
-                                                       // but still restore focus to the textbox, so that the suggestions will be hidden properly
+                                                       // Always bring focus to the textbox, as that's probably where the user expects it
+                                                       // if they were just typing.
                                                        context.data.$textbox.focus();
                                                } )
                                                .mousemove( function ( e ) {
index cdae0ba..46cc8f2 100644 (file)
@@ -1,12 +1,12 @@
 /**
- * jQuery tabIndex
+ * @class jQuery.plugin.tabIndex
  */
 ( function ( $ ) {
 
        /**
-        * Finds the lowerst tabindex in use within a selection
+        * Find the lowest tabindex in use within a selection.
         *
-        * @return number Lowest tabindex on the page
+        * @return {number} Lowest tabindex on the page
         */
        $.fn.firstTabIndex = function () {
                var minTabIndex = null;
@@ -29,9 +29,9 @@
        };
 
        /**
-        * Finds the highest tabindex in use within a selection
+        * Find the highest tabindex in use within a selection.
         *
-        * @return number Highest tabindex on the page
+        * @return {number} Highest tabindex on the page
         */
        $.fn.lastTabIndex = function () {
                var maxTabIndex = null;
@@ -49,4 +49,9 @@
                return maxTabIndex;
        };
 
+       /**
+        * @class jQuery
+        * @mixins jQuery.plugin.tabIndex
+        */
+
 }( jQuery ) );
index 405a0e4..5b1e2a7 100644 (file)
        }
 
        function buildParserCache( table, $headers ) {
-               var rows = table.tBodies[0].rows,
-                       sortType,
+               var sortType, cells, len, i, parser,
+                       rows = table.tBodies[0].rows,
                        parsers = [];
 
                if ( rows[0] ) {
 
-                       var cells = rows[0].cells,
-                               len = cells.length,
-                               i, parser;
+                       cells = rows[0].cells;
+                       len = cells.length;
 
                        for ( i = 0; i < len; i++ ) {
                                parser = false;
        /* Other utility functions */
 
        function buildCache( table ) {
-               var totalRows = ( table.tBodies[0] && table.tBodies[0].rows.length ) || 0,
+               var i, j, $row, cols,
+                       totalRows = ( table.tBodies[0] && table.tBodies[0].rows.length ) || 0,
                        totalCells = ( table.tBodies[0].rows[0] && table.tBodies[0].rows[0].cells.length ) || 0,
                        parsers = table.config.parsers,
                        cache = {
                                normalized: []
                        };
 
-               for ( var i = 0; i < totalRows; ++i ) {
+               for ( i = 0; i < totalRows; ++i ) {
 
                        // Add the table data to main data array
-                       var $row = $( table.tBodies[0].rows[i] ),
-                               cols = [];
+                       $row = $( table.tBodies[0].rows[i] );
+                       cols = [];
 
                        // if this is a child row, add it to the last row's children and
                        // continue to the next row
 
                        cache.row.push( $row );
 
-                       for ( var j = 0; j < totalCells; ++j ) {
+                       for ( j = 0; j < totalCells; ++j ) {
                                cols.push( parsers[j].format( getElementSortKey( $row[0].cells[j] ), table, $row[0].cells[j] ) );
                        }
 
                        colspanOffset = 0,
                        columns,
                        i,
+                       rowspan,
+                       colspan,
+                       headerCount,
+                       longestTR,
+                       matrixRowIndex,
+                       matrixColumnIndex,
+                       exploded,
                        $tableHeaders = $( [] ),
                        $tableRows = $( 'thead:eq(0) > tr', table );
                if ( $tableRows.length <= 1 ) {
                        $tableHeaders = $tableRows.children( 'th' );
                } else {
-                       var rowspan,
-                               colspan,
-                               headerCount,
-                               longestTR,
-                               matrixRowIndex,
-                               matrixColumnIndex,
-                               exploded = [];
+                       exploded = [];
 
                        // Loop through all the dom cells of the thead
                        $tableRows.each( function ( rowIndex, row ) {
        }
 
        function isValueInArray( v, a ) {
-               var l = a.length;
-               for ( var i = 0; i < l; i++ ) {
+               var i,
+                       len = a.length;
+               for ( i = 0; i < len; i++ ) {
                        if ( a[i][0] === v ) {
                                return true;
                        }
                                                // Legacy fix of .sortbottoms
                                                // Wrap them inside inside a tfoot (because that's what they actually want to be) &
                                                // and put the <tfoot> at the end of the <table>
-                                               var $sortbottoms = $table.find( '> tbody > tr.sortbottom' );
+                                               var $tfoot,
+                                                       $sortbottoms = $table.find( '> tbody > tr.sortbottom' );
                                                if ( $sortbottoms.length ) {
-                                                       var $tfoot = $table.children( 'tfoot' );
+                                                       $tfoot = $table.children( 'tfoot' );
                                                        if ( $tfoot.length ) {
                                                                $tfoot.eq( 0 ).prepend( $sortbottoms );
                                                        } else {
                                        // Apply event handling to headers
                                        // this is too big, perhaps break it out?
                                        $headers.not( '.' + table.config.unsortableClass ).on( 'keypress click', function ( e ) {
+                                               var cell, columns, newSortList, i,
+                                                       totalRows,
+                                                       j, s, o;
+
                                                if ( e.type === 'click' && e.target.nodeName.toLowerCase() === 'a' ) {
                                                        // The user clicked on a link inside a table header.
                                                        // Do nothing and let the default link click action continue.
                                                // cells get event .change() and bubbles up to the <table> here
                                                cache = buildCache( table );
 
-                                               var totalRows = ( $table[0].tBodies[0] && $table[0].tBodies[0].rows.length ) || 0;
+                                               totalRows = ( $table[0].tBodies[0] && $table[0].tBodies[0].rows.length ) || 0;
                                                if ( !table.sortDisabled && totalRows > 0 ) {
                                                        // Get current column sort order
                                                        this.order = this.count % 2;
                                                        this.count++;
 
-                                                       var cell, columns, newSortList, i;
-
                                                        cell = this;
                                                        // Get current column index
                                                        columns = table.headerToColumns[ this.headerIndex ];
                                                                if ( isValueInArray( i, config.sortList ) ) {
                                                                        // The user has clicked on an already sorted column.
                                                                        // Reverse the sorting direction for all tables.
-                                                                       for ( var j = 0; j < config.sortList.length; j++ ) {
-                                                                               var s = config.sortList[j],
-                                                                                       o = config.headerList[s[0]];
+                                                                       for ( j = 0; j < config.sortList.length; j++ ) {
+                                                                               s = config.sortList[j];
+                                                                               o = config.headerList[s[0]];
                                                                                if ( isValueInArray( s[0], newSortList ) ) {
                                                                                        o.count = s[1];
                                                                                        o.count++;
                        },
 
                        addParser: function ( parser ) {
-                               var l = parsers.length,
+                               var i,
+                                       len = parsers.length,
                                        a = true;
-                               for ( var i = 0; i < l; i++ ) {
+                               for ( i = 0; i < len; i++ ) {
                                        if ( parsers[i].id.toLowerCase() === parser.id.toLowerCase() ) {
                                                a = false;
                                        }
                        return ts.rgx.IPAddress[0].test( s );
                },
                format: function ( s ) {
-                       var a = s.split( '.' ),
+                       var i, item,
+                               a = s.split( '.' ),
                                r = '',
-                               l = a.length;
-                       for ( var i = 0; i < l; i++ ) {
-                               var item = a[i];
+                               len = a.length;
+                       for ( i = 0; i < len; i++ ) {
+                               item = a[i];
                                if ( item.length === 1 ) {
                                        r += '00' + item;
                                } else if ( item.length === 2 ) {
                        return ( ts.dateRegex[0].test( s ) || ts.dateRegex[1].test( s ) || ts.dateRegex[2].test( s ) );
                },
                format: function ( s ) {
-                       var match;
+                       var match, y;
                        s = $.trim( s.toLowerCase() );
 
                        if ( ( match = s.match( ts.dateRegex[0] ) ) !== null ) {
                                s[2] = '0' + s[2];
                        }
 
-                       var y;
                        if ( ( y = parseInt( s[0], 10 ) ) < 100 ) {
                                // Guestimate years without centuries
                                if ( y < 30 ) {
index 156b314..042db91 100644 (file)
@@ -70,7 +70,7 @@
                                var retval, range,
                                        el = this.get( 0 );
 
-                               if ( $( el ).is( ':hidden' ) ) {
+                               if ( !el || $( el ).is( ':hidden' ) ) {
                                        retval = '';
                                } else if ( document.selection && document.selection.createRange ) {
                                        activateElementOnIE( el );
                         *
                         * @fixme document the options parameters
                         */
-                        getCaretPosition: function ( options ) {
+                       getCaretPosition: function ( options ) {
                                function getCaret( e ) {
                                        var caretPos = 0,
                                                endPos = 0,
                                                // Range containing text after the selection
                                                postRange;
 
-                                       if ( document.selection && document.selection.createRange ) {
+                                       if ( e && document.selection && document.selection.createRange ) {
                                                // IE doesn't properly report non-selected caret position through
                                                // the selection ranges when textarea isn't focused. This can
                                                // lead to saving a bogus empty selection, which then screws up
                                                } while ( ( !preFinished || !periFinished || !postFinished ) );
                                                caretPos = rawPreText.replace( /\r\n/g, '\n' ).length;
                                                endPos = caretPos + rawPeriText.replace( /\r\n/g, '\n' ).length;
-                                       } else if ( e.selectionStart || e.selectionStart === 0 ) {
+                                       } else if ( e && ( e.selectionStart || e.selectionStart === 0 ) ) {
                                                // Firefox support
                                                caretPos = e.selectionStart;
                                                endPos = e.selectionEnd;
index f8448e6..dcd2b0b 100644 (file)
@@ -2,16 +2,20 @@
  * Javascript for module editWarning
  */
 ( function ( mw, $ ) {
+       'use strict';
+
        $( function () {
+               var savedWindowOnBeforeUnload,
+                       $wpTextbox1 = $( '#wpTextbox1' ),
+                       $wpSummary = $( '#wpSummary' );
                // Check if EditWarning is enabled and if we need it
-               if ( $( '#wpTextbox1' ).length === 0 ) {
+               if ( $wpTextbox1.length === 0 ) {
                        return true;
                }
                // Get the original values of some form elements
-               $( '#wpTextbox1, #wpSummary' ).each( function () {
+               $wpTextbox1.add( $wpSummary ).each( function () {
                        $( this ).data( 'origtext', $( this ).val() );
                } );
-               var savedWindowOnBeforeUnload;
                $( window )
                        .on( 'beforeunload.editwarning', function () {
                                var retval;
@@ -20,8 +24,8 @@
                                // the original values
                                if (
                                        mw.config.get( 'wgAction' ) === 'submit' ||
-                                               $( '#wpTextbox1' ).data( 'origtext' ) !== $( '#wpTextbox1' ).val() ||
-                                               $( '#wpSummary' ).data( 'origtext' ) !== $( '#wpSummary' ).val()
+                                               $wpTextbox1.data( 'origtext' ) !== $wpTextbox1.val() ||
+                                               $wpSummary.data( 'origtext' ) !== $wpSummary.val()
                                ) {
                                        // Return our message
                                        retval = mw.msg( 'editwarning-warning' );
index 4c2fc3a..6b212c2 100644 (file)
@@ -1,9 +1,10 @@
-/**
+/*!
  * Live edit preview.
  */
 ( function ( mw, $ ) {
 
        /**
+        * @ignore
         * @param {jQuery.Event} e
         */
        function doLivePreview( e ) {
index 31ca107..afe9246 100644 (file)
@@ -46,12 +46,14 @@ td.diff-marker {
        text-align: right;
        font-weight: bold;
        font-size: 1.25em;
+       line-height: 1.2;
 }
 
 td.diff-addedline,
 td.diff-deletedline,
 td.diff-context {
        font-size: 88%;
+       line-height: 1.6;
        vertical-align: top;
        white-space: -moz-pre-wrap;
        white-space: pre-wrap;
index 2a02d87..8aa5a1f 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*!
  * JavaScript for History action
  */
 jQuery( function ( $ ) {
@@ -7,6 +7,7 @@ jQuery( function ( $ ) {
                $lis = $( '#pagehistory > li' );
 
        /**
+        * @ignore
         * @context {Element} input
         * @param e {jQuery.Event}
         */
index 727a525..2ded40c 100644 (file)
@@ -1,5 +1,5 @@
-/**
- * This module enables double-click-to-edit functionality.
+/*!
+ * Enables double-click-to-edit functionality.
  */
 ( function ( mw, $ ) {
        $( function () {
index 21f40c5..712cf29 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*!
  * Exif metadata display for MediaWiki file uploads
  *
  * Add an expand/collapse link and collapse by default if set to
index be88337..db89990 100644 (file)
@@ -23,7 +23,6 @@
        border: 1px solid #dcd9d9;
        text-shadow: 0 0.0625em 0 rgba(255, 255, 255, 0.5);
        border-radius: 5px;
-       -webkit-box-shadow: 0 2px 5px 0 #ccc;
        box-shadow: 0 2px 5px 0 #ccc;
        -webkit-transition: all 0.25s ease-in-out;
        -moz-transition: all 0.25s ease-in-out;
index 6e4df9f..4d2c47a 100644 (file)
         * @member mw.hook
         */
 
-       var config = mw.config.get( [ 'wgAction', 'wgCookiePrefix', 'wgCurRevisionId' ] ),
+       var config = mw.config.get( [ 'wgAction', 'wgCurRevisionId' ] ),
                // This should match EditPage::POST_EDIT_COOKIE_KEY_PREFIX:
-               cookieKey = config.wgCookiePrefix + 'PostEditRevision' + config.wgCurRevisionId,
+               cookieKey = 'PostEditRevision' + config.wgCurRevisionId,
+               cookieVal = mw.cookie.get( cookieKey ),
                $div, id;
 
        function showConfirmation( data ) {
                data = data || {};
                if ( data.message === undefined ) {
-                       data.message = $.parseHTML( mw.message( 'postedit-confirmation', data.user || mw.user ).escaped() );
+                       data.message = $.parseHTML( mw.message( 'postedit-confirmation-saved', data.user || mw.user ).escaped() );
                }
 
                $div = $(
 
        mw.hook( 'postEdit' ).add( showConfirmation );
 
-       if ( config.wgAction === 'view' && $.cookie( cookieKey ) === '1' ) {
-               $.cookie( cookieKey, null, { path: '/' } );
+       if ( config.wgAction === 'view' && cookieVal ) {
                mw.config.set( 'wgPostEdit', true );
 
-               mw.hook( 'postEdit' ).fire();
+               mw.hook( 'postEdit' ).fire( {
+                       // The following messages can be used here:
+                       // postedit-confirmation-saved
+                       // postedit-confirmation-created
+                       // postedit-confirmation-restored
+                       'message': mw.msg(
+                               'postedit-confirmation-' + cookieVal,
+                               mw.user
+                       )
+               } );
+               mw.cookie.set( cookieKey, null );
        }
 
 } ( mediaWiki, jQuery ) );
index 93befe3..ada101e 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*!
  * JavaScript to enable right click edit functionality.
  * When the user right-clicks in a heading, it will open the
  * edit screen.
index a90617d..7dd9730 100644 (file)
@@ -73,7 +73,7 @@
                                        var texts = [];
                                        if ( data.query && data.query.allpages ) {
                                                $.each( data.query.allpages, function ( i, category ) {
-                                                       texts.push( new mw.Title( category.title ).getNameText() );
+                                                       texts.push( new mw.Title( category.title ).getMainText() );
                                                } );
                                        }
                                        return texts;
index b37e2a6..f8dc836 100644 (file)
                        }
                },
                // Keyed by ajax url and symbolic name for the individual request
-               deferreds = {};
+               promises = {};
 
-       // Pre-populate with fake ajax deferreds to save http requests for tokens
+       // Pre-populate with fake ajax promises to save http requests for tokens
        // we already have on the page via the user.tokens module (bug 34733).
-       deferreds[ defaultOptions.ajax.url ] = {};
+       promises[ defaultOptions.ajax.url ] = {};
        $.each( mw.user.tokens.get(), function ( key, value ) {
                // This requires #getToken to use the same key as user.tokens.
                // Format: token-type + "Token" (eg. editToken, patrolToken, watchToken).
-               deferreds[ defaultOptions.ajax.url ][ key ] = $.Deferred()
+               promises[ defaultOptions.ajax.url ][ key ] = $.Deferred()
                        .resolve( value )
                        .promise( { abort: function () {} } );
        } );
 
                        // Return the Promise
                        return apiDeferred.promise( { abort: xhr.abort } ).fail( function ( code, details ) {
-                               mw.log( 'mw.Api error: ', code, details );
+                               if ( code !== 'abort' ) {
+                                       mw.log( 'mw.Api error: ', code, details );
+                               }
                        } );
                },
 
                 *
                 * @param {string} tokenType The name of the token, like options or edit.
                 * @param {Object} params API parameters
+                * @param {Object} [ajaxOptions]
                 * @return {jQuery.Promise} See #post
                 * @since 1.22
                 */
-               postWithToken: function ( tokenType, params ) {
+               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 ) {
                                params.token = token;
-                               return api.post( params ).then(
+                               return api.post( params, ajaxOptions ).then(
                                        // If no error, return to caller as-is
                                        null,
                                        // Error handler
                                        function ( code ) {
                                                if ( code === 'badtoken' ) {
                                                        // Clear from cache
-                                                       deferreds[ this.defaults.ajax.url ][ tokenType + 'Token' ] =
+                                                       promises[ api.defaults.ajax.url ][ tokenType + 'Token' ] =
                                                                params.token = undefined;
 
                                                        // Try again, once
                                                        return api.getToken( tokenType ).then( function ( token ) {
                                                                params.token = token;
-                                                               return api.post( params );
+                                                               return api.post( params, ajaxOptions );
                                                        } );
                                                }
 
                 */
                getToken: function ( type ) {
                        var apiPromise,
-                               deferredGroup = deferreds[ this.defaults.ajax.url ],
-                               d = deferredGroup && deferredGroup[ type + 'Token' ];
+                               promiseGroup = promises[ this.defaults.ajax.url ],
+                               d = promiseGroup && promiseGroup[ type + 'Token' ];
 
                        if ( !d ) {
-                               d = $.Deferred();
+                               apiPromise = this.get( { action: 'tokens', type: type } );
 
-                               apiPromise = this.get( { action: 'tokens', type: type } )
-                                       .done( function ( data ) {
+                               d = apiPromise
+                                       .then( function ( data ) {
                                                // If token type is not available for this user,
-                                               // key '...token' is missing or can contain Boolean false
+                                               // key '...token' is either missing or set to boolean false
                                                if ( data.tokens && data.tokens[type + 'token'] ) {
-                                                       d.resolve( data.tokens[type + 'token'] );
-                                               } else {
-                                                       d.reject( 'token-missing', data );
+                                                       return data.tokens[type + 'token'];
                                                }
-                                       } )
-                                       .fail( d.reject );
 
-                               // Attach abort handler
-                               d.abort = apiPromise.abort;
+                                               return $.Deferred().reject( 'token-missing', data );
+                                       }, function () {
+                                               // Clear promise. Do not cache errors.
+                                               delete promiseGroup[ type + 'Token' ];
+
+                                               // Pass on to allow the caller to handle the error
+                                               return this;
+                                       } )
+                                       // Attach abort handler
+                                       .promise( { abort: apiPromise.abort } );
 
-                               // Store deferred now so that we can use this again even if it isn't ready yet
-                               if ( !deferredGroup ) {
-                                       deferredGroup = deferreds[ this.defaults.ajax.url ] = {};
+                               // Store deferred now so that we can use it again even if it isn't ready yet
+                               if ( !promiseGroup ) {
+                                       promiseGroup = promises[ this.defaults.ajax.url ] = {};
                                }
-                               deferredGroup[ type + 'Token' ] = d;
+                               promiseGroup[ type + 'Token' ] = d;
                        }
 
-                       return d.promise( { abort: d.abort } );
+                       return d;
                }
        };
 
index aa33d86..af2dee1 100644 (file)
        function doWatchInternal( pages, ok, err, addParams ) {
                // XXX: Parameter addParams is undocumented because we inherit this
                // documentation in the public method...
-               var apiPromise = this.post(
+               var apiPromise = this.postWithToken( 'watch',
                        $.extend(
                                {
                                        action: 'watch',
                                        titles: $.isArray( pages ) ? pages.join( '|' ) : String( pages ),
-                                       token: mw.user.tokens.get( 'watchToken' ),
                                        uselang: mw.config.get( 'wgUserLanguage' )
                                },
                                addParams
index 486e993..48351bc 100644 (file)
@@ -21,7 +21,7 @@ mediaWiki.language.convertGrammar = function ( word, form ) {
                        }
 
                        // Add a hyphen (maqaf) before numbers and non-Hebrew letters
-                       if (  word.substr( 0, 1 ) < 'א' ||  word.substr( 0, 1 ) > 'ת' ) {
+                       if ( word.substr( 0, 1 ) < 'א' ||  word.substr( 0, 1 ) > 'ת' ) {
                                word = '־' + word;
                        }
        }
index fd77025..5b9afcf 100644 (file)
         */
        mw.language = {
                /**
-                * Language-related data (keyed by language, contains instances of mw.Map). Loaded dynamically
-                * (see ResourceLoaderLanguageDataModule in PHP docs, aka mediawiki.language.data module).
+                * Language-related data (keyed by language, contains instances of mw.Map).
+                * Loaded dynamically (see ResourceLoaderLanguageDataModule class in PHP, registered
+                * as mediawiki.language.data on the client).
                 *
                 * To set data:
                 *
                 *     // Override, extend or create the language data object of 'nl'
                 *     mw.language.setData( 'nl', 'myKey', 'My value' );
                 *
-                *     // Set multiple values at once
+                *     // Set multiple key/values pairs at once
                 *     mw.language.setData( 'nl', { foo: 'X', bar: 'Y' } );
                 *
                 * To get GrammarForms data for language 'nl':
@@ -47,8 +48,8 @@
                 *
                 * @param {string} langCode
                 * @param {string} dataKey
-                * @return {Mixed} Value stored in the mw.Map (or `undefined` if there is no map for the specified
-                *  langCode).
+                * @return {Mixed} Value stored in the mw.Map (or `undefined` if there is no map for the
+                *  specified langCode)
                 */
                getData: function ( langCode, dataKey ) {
                        var langData = mw.language.data;
@@ -64,8 +65,8 @@
                 * Creates the data mw.Map if there isn't one for the specified language already.
                 *
                 * @param {string} langCode
-                * @param {string|Object} dataKey Key or object of key/values.
-                * @param {Mixed} value Value for dataKey, ignored if dataKey is an object.
+                * @param {string|Object} dataKey Key or object of key/values
+                * @param {Mixed} [value] Value for dataKey, omit if dataKey is an object
                 */
                setData: function ( langCode, dataKey, value ) {
                        var langData = mw.language.data;
index 80b68cc..6556af9 100644 (file)
@@ -19,7 +19,7 @@
        background-image: url(@url);
 }
 
-.vertical-gradient ( @startColor: gray, @endColor: white, @startPos: 0, @endPos: 100% ) {
+.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+
        background-image: -webkit-gradient( linear, left top, left bottom, color-stop( @startPos, @startColor ), color-stop( @endPos, @endColor ) ); // Safari 4+, Chrome 2+
        background-image: linear-gradient( @startColor @startPos, @endColor @endPos ); // Standard
 }
 
-/* Note gzip compression means that it is okay to embed twice */
-/* http://pauginer.tumblr.com/post/36614680636/invisible-gradient-technique */
-.background-image-svg(@svg, @fallback) {
+/*
+ * 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
+ *
+ * We use gzip compression, which means that it is okay to embed twice.
+ *
+ * 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: url(@fallback);
-       /* SVG support using a transparent gradient to guarantee cross-browser
-        * compatibility (browsers able to understand gradient syntax support also SVG) */
-       /* @embed */ background-image: -webkit-linear-gradient(transparent, transparent), url(@svg);
-       /* @embed */ background-image: linear-gradient(transparent, transparent), url(@svg);
+       background-image: -webkit-linear-gradient(transparent, transparent), url(@svg);
+       background-image: linear-gradient(transparent, transparent), url(@svg);
 }
 
 /* Caution: Does not support localisable images */
@@ -51,3 +64,9 @@
        -webkit-transition: @string;
        transition: @string;
 }
+
+.box-sizing(@value) {
+       -moz-box-sizing: @value;
+       -webkit-box-sizing: @value;
+       box-sizing: @value;
+}
index f92d372..e7c962f 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*!
  * Show gallery captions when focused. Copied directly from jquery.mw-jump.js.
  * Also Dynamically resize images to justify them.
  */
                                                }
                                        }
                                }
-                       } )();
+                       }() );
                } );
        } );
-} )( jQuery, mediaWiki );
+}( jQuery, mediaWiki ) );
index 50301bd..4819be0 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*!
  * Change multi-page image navigation so that the current page display can be changed
  * without a page reload. Currently, the only image formats that can be multi-page images are
  * PDF and DjVu files
index 5fb14dd..1fe0e26 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*!
  * Animate patrol links to use asynchronous API requests to
  * patrol pages, rather than navigating to a different URI.
  *
index c75e59f..4aae606 100644 (file)
@@ -9,10 +9,6 @@
                .removeClass( 'client-nojs' );
 
        $( function () {
-               // Initialize utilities as soon as the document is ready (mw.util.$content).
-               // In the domready here instead of in mediawiki.page.ready to ensure that it gets enqueued
-               // before other modules hook into domready, so that mw.util.$content (defined by
-               // mw.util.init), is defined for them.
                mw.util.init();
 
                /**
index 850177f..15e9aba 100644 (file)
@@ -17,7 +17,7 @@
         * @param {string} [state="idle"] 'idle' or 'loading'. Default is 'idle'
         */
        function updateWatchLink( $link, action, state ) {
-               var accesskeyTip, msgKey, $li, otherAction;
+               var msgKey, $li, otherAction;
 
                // A valid but empty jQuery object shouldn't throw a TypeError
                if ( !$link.length ) {
@@ -32,7 +32,6 @@
                // message keys 'watch', 'watching', 'unwatch' or 'unwatching'.
                msgKey = state === 'loading' ? action + 'ing' : action;
                otherAction = action === 'watch' ? 'unwatch' : 'watch';
-               accesskeyTip = $link.attr( 'title' ).match( mw.util.tooltipAccessKeyRegexp );
                $li = $link.closest( 'li' );
 
                // Trigger a 'watchpage' event for this List item.
@@ -45,9 +44,8 @@
 
                $link
                        .text( mw.msg( msgKey ) )
-                       .attr( 'title', mw.msg( 'tooltip-ca-' + action ) +
-                               ( accesskeyTip ? ' ' + accesskeyTip[0] : '' )
-                       )
+                       .attr( 'title', mw.msg( 'tooltip-ca-' + action ) )
+                       .updateTooltipAccessKeys()
                        .attr( 'href', mw.util.wikiScript() + '?' + $.param( {
                                        title: title,
                                        action: action
                        $li.prop( 'id', 'ca-' + action );
                }
 
-               // Special case for vector icon
-               if ( $li.hasClass( 'icon' ) ) {
-                       if ( state === 'loading' ) {
-                               $link.addClass( 'loading' );
-                       } else {
-                               $link.removeClass( 'loading' );
-                       }
+               if ( state === 'loading' ) {
+                       $link.addClass( 'loading' );
+               } else {
+                       $link.removeClass( 'loading' );
                }
        }
 
 
                        $link = $( this );
 
+                       if ( $link.hasClass( 'loading' ) ) {
+                               return;
+                       }
+
                        updateWatchLink( $link, action, 'loading' );
 
                        api = new mw.Api();
diff --git a/resources/src/mediawiki.skinning/content.parsoid.less b/resources/src/mediawiki.skinning/content.parsoid.less
new file mode 100644 (file)
index 0000000..7bfb642
--- /dev/null
@@ -0,0 +1,76 @@
+/**
+ * Style Parsoid HTML+RDFa output consistent with wikitext from PHP parser.
+ */
+
+/**
+ * References
+ *
+ * Parser and Extension:Cite output reference numbers for <sup>[1]</sup> for <ref> tags.
+ *
+ * Markup:
+ * Cake is good<sup>[2]</sup>
+ * The cake is a lie<span class="reference">[1]</span>
+ *
+ * Styleguide 1.1.
+ */
+span.reference {
+       font-size: smaller;
+       line-height: normal;
+       vertical-align: super;
+}
+
+/**
+ * Block media items
+ */
+figure[typeof*='mw:Image'] {
+       margin: 0;
+
+       a {
+               border: 0;
+       }
+
+       &.mw-halign-right {
+               /* @noflip */
+               margin: .5em 0 1.3em 1.4em;
+               /* @noflip */
+               clear: right;
+               /* @noflip */
+               float: right;
+       }
+
+       /* @noflip */
+       &.mw-halign-left {
+               /* @noflip */
+               margin: .5em 1.4em 1.3em 0;
+               /* @noflip */
+               clear: left;
+               /* @noflip */
+               float: left;
+       }
+
+       &.mw-halign-center {
+               margin-left: auto;
+               margin-right: auto;
+       }
+
+       figcaption {
+               display: table-caption;
+               caption-side: bottom;
+               /* In mw-core the font-size is duplicated, 94% in thumbiner
+                  and again 94% in thumbcaption. 88% for font size of the
+                  caption results in the same behavior. */
+               font-size: 88%;
+               line-height: 1.4em;
+               text-align: left;
+
+               /* taken from .thumbcaption */
+               padding: 3px;
+       }
+}
+
+figure[typeof~='mw:Image/Thumb'], figure[typeof~='mw:Image/Frame'] {
+       display: table;
+       overflow: hidden;
+       text-align: center;
+       padding: 3px;
+}
index 9461fbd..92983df 100644 (file)
@@ -6,7 +6,7 @@
        border-top-right-radius: 0.8em;
 }
 
-/** colors also used in mediawiki.special.preferences.css */
+/* Colors also used in mediawiki.special.preferences.css */
 #mw-emailaddress-validity.valid {
        border: 1px solid #80FF80;
        background-color: #C0FFC0;
index bc2a0a2..67531f7 100644 (file)
@@ -1,9 +1,10 @@
-/**
+/*!
  * JavaScript for Special:ChangeEmail
  */
 ( function ( mw, $ ) {
        /**
         * Given an email validity status (true, false, null) update the label CSS class
+        * @ignore
         */
        function updateMailValidityLabel( mail ) {
                var isValid = mw.util.validateEmail( mail ),
index bed580d..0e026af 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*!
  * Styling for Special:Watchlist and Special:RecentChanges when preference 'usenewrc'
  * a.k.a. Enhanced Recent Changes is enabled.
  */
@@ -56,11 +56,6 @@ table.mw-enhanced-rc td.mw-enhanced-rc-nested {
        height: 15px;
 }
 
-/* let it look like it is clickable */
-.mw-enhancedchanges-arrow.mw-collapsible-toggle {
-       cursor: pointer;
-}
-
 .mw-enhanced-watched .mw-enhanced-rc-time {
        font-weight: bold;
 }
index 50349c3..eb7072c 100644 (file)
@@ -1,5 +1,4 @@
-
-/**** Special:AllMessages ****/
+/* Special:AllMessages */
 #mw-allmessagestable .allmessages-customised td.am_default {
        background-color: #fcffc4;
 }
        background-color: #b1ffb1;
 }
 
-/**** Special:Allpages ****/
+/* Special:Allpages */
 table.mw-allpages-table-form, table.mw-allpages-table-chunk {
        width: 100%;
 }
-td.mw-allpages-alphaindexline {
-       text-align: right;
-}
 .mw-allpages-nav {
        text-align: right;
        margin-bottom: 1em;
@@ -31,30 +27,30 @@ table.mw-allpages-table-form tr {
        vertical-align: top;
 }
 
-/**** Special:Block ****/
+/* Special:Block */
 tr.mw-block-hideuser {
        font-weight: bold;
 }
 
-/**** Special:BlockList ****/
+/* Special:BlockList */
 table.mw-blocklist span.mw-usertoollinks,
 span.mw-blocklist-actions {
        white-space: nowrap;
        font-size: 90%;
 }
 
-/**** Special:Contributions ****/
+/* Special:Contributions */
 .mw-uctop {
        font-weight: bold;
 }
 
-/**** Special:EmailUser ****/
+/* Special:EmailUser */
 td#mw-emailuser-sender,
 td#mw-emailuser-recipient {
        font-weight: bold;
 }
 
-/**** Special:ListGroupRights ****/
+/* Special:ListGroupRights */
 table.mw-listgrouprights-table tr {
        vertical-align: top;
 }
@@ -62,7 +58,7 @@ table.mw-listgrouprights-table tr {
        text-decoration: line-through;
 }
 
-/**** Special:Prefixindex ****/
+/* Special:Prefixindex */
 table.mw-prefixindex-list-table,
 table#mw-prefixindex-nav-table {
        width: 100%;
@@ -76,7 +72,7 @@ td#mw-prefixindex-nav-form {
 }
 
 
-/**** Special:Search ****/
+/* Special:Search */
 .searchresults {
 }
 
@@ -242,7 +238,7 @@ form#powersearch {
        clear: both;
 }
 
-/**** Special:Specialpages ****/
+/* Special:Specialpages */
 .mw-specialpagerestricted {
        font-weight: bold;
 }
@@ -256,12 +252,12 @@ form#powersearch {
        vertical-align: top;
 }
 
-/**** Special:Statistics ****/
+/* Special:Statistics */
 td.mw-statistics-numbers {
        text-align: right;
 }
 
-/**** Special:ProtectedPages ****/
+/* Special:ProtectedPages */
 table.mw-protectedpages span.mw-usertoollinks,
 span.mw-protectedpages-length,
 span.mw-protectedpages-actions {
@@ -273,7 +269,7 @@ span.mw-protectedpages-unknown {
        font-size: 90%;
 }
 
-/**** Special:UserRights ****/
+/* Special:UserRights */
 .mw-userrights-disabled {
        color: #888;
 }
index 8edb1cb..630d162 100644 (file)
@@ -1,5 +1,9 @@
-/*
+/*!
  * Namespace for mediawiki.special.* modules
  */
 
+/**
+ * @class mw.special
+ * @singleton
+ */
 mediaWiki.special = {};
index 75ae5ca..afb0905 100644 (file)
@@ -1,16 +1,16 @@
-/** Reuses colors from mediawiki.special.changeemail.css */
+/* Reuses colors from mediawiki.special.changeemail.css */
 .mw-email-not-authenticated .mw-input,
 .mw-email-none .mw-input{
        border: 1px solid #FF8080;
        background-color: #FFC0C0;
        color: black;
 }
-/** Authenticated email field has its own class too. Unstyled by default */
+/* Authenticated email field has its own class too. Unstyled by default */
 /*
 .mw-email-authenticated .mw-input { }
 */
 
-/**
+/*
  * Hide, but keep accessible for screen-readers.
  * Like .mw-jump, #jump-to-nav from skins/common/shared.css
  */
index 2cd27af..e553f44 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*!
  * JavaScript for Special:Preferences
  */
 jQuery( function ( $ ) {
@@ -46,9 +46,10 @@ jQuery( function ( $ ) {
        /**
         * It uses document.getElementById for security reasons (HTML injections in $()).
         *
+        * @ignore
         * @param String name: the name of a tab without the prefix ("mw-prefsection-")
         * @param String mode: [optional] A hash will be set according to the current
-        * open section. Set mode 'noHash' to surpress this.
+        *  open section. Set mode 'noHash' to surpress this.
         */
        function switchPrefTab( name, mode ) {
                var $tab, scrollTop;
@@ -159,10 +160,8 @@ jQuery( function ( $ ) {
                } );
        }
 
-       /**
-       * Timezone functions.
-       * Guesses Timezone from browser and updates fields onchange
-       */
+       // Timezone functions.
+       // Guesses Timezone from browser and updates fields onchange.
 
        $tzSelect = $( '#mw-input-wptimecorrection' );
        $tzTextbox = $( '#mw-input-wptimecorrection-other' );
@@ -201,7 +200,7 @@ jQuery( function ( $ ) {
                }
        }
 
-       function updateTimezoneSelection () {
+       function updateTimezoneSelection() {
                var minuteDiff, localTime,
                        type = $tzSelect.val();
 
index 79d793a..d43b62b 100644 (file)
@@ -1,9 +1,13 @@
-/**
+/*!
  * JavaScript for Special:RecentChanges
  */
 ( function ( mw, $ ) {
        var rc, $checkboxes, $select;
 
+       /**
+        * @class mw.special.recentchanges
+        * @singleton
+        */
        rc = {
                /**
                 * Handler to disable/enable the namespace selector checkboxes when the
@@ -17,6 +21,7 @@
                        $checkboxes.prop( 'disabled', isAllNS );
                },
 
+               /** */
                init: function () {
                        $select = $( '#namespace' );
                        $checkboxes = $( '#nsassociated, #nsinvert' );
index 914e47e..f6ed82c 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*
  * Fixes sister projects box moving down the extract
  * of the first result (bug #16886).
  * It only happens when the window is small and
diff --git a/resources/src/mediawiki.special/mediawiki.special.unwatchedPages.css b/resources/src/mediawiki.special/mediawiki.special.unwatchedPages.css
new file mode 100644 (file)
index 0000000..054f45f
--- /dev/null
@@ -0,0 +1,9 @@
+.mw-watched-item {
+       text-decoration: line-through;
+}
+
+.mw-watch-link-disabled {
+       pointer-events: none;
+       /* Fallback for older browsers not supporting pointer-events: none */
+       cursor: default;
+}
diff --git a/resources/src/mediawiki.special/mediawiki.special.unwatchedPages.js b/resources/src/mediawiki.special/mediawiki.special.unwatchedPages.js
new file mode 100644 (file)
index 0000000..a2c2228
--- /dev/null
@@ -0,0 +1,52 @@
+/*!
+ * JavaScript for Special:UnwatchedPages
+ */
+( function ( mw, $ ) {
+       $( function () {
+               $( 'a.mw-watch-link' ).click( function ( e ) {
+                       var promise,
+                               api = new mw.Api(),
+                               $link = $( this ),
+                               $subjectLink = $link.parents( 'li' ).children( 'a' ).eq( 0 ),
+                               title = mw.util.getParamValue( 'title', $link.attr( 'href' ) );
+                       // nice format
+                       title = mw.Title.newFromText( title ).toText();
+                       // Disable link whilst we're busy to avoid double handling
+                       if ( $link.data( 'mwDisabled' ) ) {
+                               // mw-watch-link-disabled disables pointer-events which prevents the click event
+                               // from happening in the first place. In older browsers we kill the event here.
+                               return false;
+                       }
+                       $link.data( 'mwDisabled', true ).addClass( 'mw-watch-link-disabled' );
+
+                       // Use the class to determine whether to watch or unwatch
+                       if ( !$subjectLink.hasClass( 'mw-watched-item' ) ) {
+                               $link.text( mw.msg( 'watching' ) );
+                               promise = api.watch( title ).done( function () {
+                                       $subjectLink.addClass( 'mw-watched-item' );
+                                       $link.text( mw.msg( 'unwatch' ) );
+                                       mw.notify( mw.msg( 'addedwatchtext-short', title ) );
+                               } ).fail( function () {
+                                       $link.text( mw.msg( 'watch' ) );
+                                       mw.notify( mw.msg( 'watcherrortext', title ) );
+                               } );
+                       } else {
+                               $link.text( mw.msg( 'unwatching' ) );
+                               promise = api.unwatch( title ).done( function () {
+                                       $subjectLink.removeClass( 'mw-watched-item' );
+                                       $link.text( mw.msg( 'watch' ) );
+                                       mw.notify( mw.msg( 'removedwatchtext-short', title ) );
+                               } ).fail( function () {
+                                       $link.text( mw.msg( 'unwatch' ) );
+                                       mw.notify( mw.msg( 'watcherrortext', title ) );
+                               } );
+                       }
+
+                       promise.always( function () {
+                               $link.data( 'mwDisabled', false ).removeClass( 'mw-watch-link-disabled' );
+                       } );
+
+                       e.preventDefault();
+               } );
+       } );
+}( mediaWiki, jQuery ) );
index 8a5ff59..3c7ad52 100644 (file)
@@ -1,11 +1,14 @@
 /**
  * JavaScript for Special:Upload
+ *
  * Note that additional code still lives in skins/common/upload.js
+ *
+ * @private
+ * @class mw.special.upload
+ * @singleton
  */
 ( function ( mw, $ ) {
-       /**
-        * Add a preview to the upload form
-        */
+       // Add a preview to the upload form
        $( function () {
                /**
                 * Is the FileAPI available with sufficient functionality?
@@ -18,8 +21,9 @@
                 * Check if this is a recognizable image type...
                 * Also excludes files over 10M to avoid going insane on memory usage.
                 *
-                * @todo is there a way we can ask the browser what's supported in <img>s?
-                * @todo put SVG back after working around Firefox 7 bug <https://bugzilla.wikimedia.org/show_bug.cgi?id=31643>
+                * TODO: Is there a way we can ask the browser what's supported in `<img>`s?
+                *
+                * TODO: Put SVG back after working around Firefox 7 bug <https://bugzilla.wikimedia.org/show_bug.cgi?id=31643>
                 *
                 * @param {File} file
                 * @return boolean
                 * in browsers supporting HTML5 FileAPI.
                 *
                 * As of this writing, known good:
+                *
                 * - Firefox 3.6+
                 * - Chrome 7.something
                 *
-                * @todo check file size limits and warn of likely failures
+                * TODO: Check file size limits and warn of likely failures
                 *
                 * @param {File} file
                 */
                 * to do preprocessing on the binary data first.
                 *
                 * @param {File} file
-                * @param {function} callback
-                * @param {function} callbackBinary
+                * @param {Function} callback
+                * @param {Function} callbackBinary
                 */
                function fetchPreview( file, callback, callbackBinary ) {
                        var reader = new FileReader();
 
                /**
                 * Format a file size attractively.
-                * @todo match numeric formatting
+                *
+                * TODO: Match numeric formatting
                 *
                 * @param {number} s
-                * @return string
+                * @return {string}
                 */
                function prettySize( s ) {
                        var sizeMsgs = ['size-bytes', 'size-kilobytes', 'size-megabytes', 'size-gigabytes'];
                        return true;
                }
 
-               /**
-                * Initialization
-                */
+               /* Initialization */
                if ( hasFileAPI() ) {
                        // Update thumbnail when the file selection control is updated.
                        $( '#wpUploadFile' ).change( function () {
                }
        } );
 
-       /**
-        * Disable all upload source fields except the selected one
-        */
+       // Disable all upload source fields except the selected one
        $( function () {
                var i, $row,
                        $rows = $( '.mw-htmlform-field-UploadSourceField' );
 
+               /**
+                * @param {jQuery} $currentRow
+                * @return {Function} Handler
+                * @return {jQuery.Event} return.e
+                */
                function createHandler( $currentRow ) {
-                       /**
-                        * @param {jQuery.Event}
-                        */
                        return function () {
                                $( '.mw-upload-source-error' ).remove();
                                if ( this.checked ) {
index d5fd2b8..b66f20e 100644 (file)
@@ -33,7 +33,7 @@ section.mw-form-header {
        margin-bottom: 10px;
 }
 
-/**** shuffled CAPTCHA ****/
+/* shuffled CAPTCHA */
 #wpCaptchaWord {
        margin-top: 6px;
 }
index 917426a..764e377 100644 (file)
@@ -1,6 +1,6 @@
-/**
- * Adds additional styling to the extension title/version list
-**/
+/*!
+ * Styling for Special:Version
+ */
 .mw-version-ext-name {
        font-weight: bold;
 }
@@ -11,4 +11,4 @@
 
 th.mw-version-ext-col-label {
        font-size: 0.9em;
-}
\ No newline at end of file
+}
index f7a7eae..78b0b33 100644 (file)
@@ -31,6 +31,9 @@
        margin: 0;
        .box-sizing(border-box);
 
+       // Disable weird iOS styling
+       -webkit-appearance: none;
+
        // IE6/IE7 hack
        // http://stackoverflow.com/a/5838575/365238
        *display: inline;
index 6157fa2..ee21932 100644 (file)
@@ -1,5 +1,6 @@
 // Form elements and layouts
 
+@import "mediawiki.mixins";
 @import "../../mixins/utilities";
 @import "../../mixins/forms";
 
@@ -24,7 +25,7 @@
 // Markup:
 // <form class="mw-ui-vform">
 //   <div class="mw-ui-vform-div">This is a form example.</div>
-//   <div>
+//   <div class="mw-ui-vform-div">
 //     <label>Username </label>
 //     <input value="input">
 //   </div>
@@ -50,6 +51,7 @@
 
        // MW currently doesn't use the type attribute everywhere on inputs.
        input,
+       select,
        .mw-ui-button {
                display: block;
                .box-sizing(border-box);
                width: 100%;
        }
 
-       // We exclude these because they'll generally use mw-ui-button.
+       // We exclude buttons because they'll generally use mw-ui-button.
        // Otherwise, we'll unintentionally override that.
-       input:not([type=button]):not([type=submit]):not([type=file]), {
+       input:not([type=button]):not([type=submit]):not([type=file]) {
                .agora-field-styling(); // mixins/forms.less
        }
 
+       // Give dropdown lists the same spacing as input fields for consistency.
+       // Values taken from .agora-field-styling() in mixins/form.less
+       select {
+               padding: 0.35em 0.5em 0.35em 0.5em;
+               vertical-align: middle;
+       }
+
        label {
                display: block;
                .box-sizing(border-box);
        //   <div class="warningbox">A warning to be noted</div>
        //   <div class="successbox">Action successful!</div>
        //   <div class="error">A different kind of error</div>
-       //   <div>
+       //   <div class="error">
+       //     <ul><li>There are problems with some of your input.</li></ul>
+       //   </div>
+       //   <div class="mw-ui-vform-div">
        //     <input type="text" value="input" class="mw-ui-input">
-       //   <div>
        //   </div>
+       //   <div class="mw-ui-vform-div">
+       //     <select>
+       //       <option value="1">Option 1</option>
+       //       <option value="2">Option 2</option>
+       //     </select>
+       //     <span class="error">The value you specified is not a valid option.</span>
+       //   </div>
+       //   <div>
        //     <button class="mw-ui-button">Button in vform</button>
        //   </div>
        // </form>
        //
        // Styleguide 3.1.
-       .error {
+       .error,
+       .errorbox,
+       .warningbox,
+       .successbox {
                .box-sizing(border-box);
                font-size: 0.9em;
-               margin: 0 0 1em;
+               margin: 0 0 1em 0;
                padding: 0.5em;
+               word-wrap: break-word;
+       }
+
+       // Colours taken from those for .errorbox in skins/common/shared.css
+       .error {
                color: #cc0000;
                border: 1px solid #fac5c5;
                background-color: #fae3e3;
                text-shadow: 0 1px #fae3e3;
-               word-wrap: break-word;
        }
 
-       .errorbox,
-       .warningbox,
-       .successbox {
-               .box-sizing(border-box);
-               font-size: 0.9em;
-               margin: 0 0 1em 0;
-               padding: 0.5em;
-               word-wrap: break-word;
+       // 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 {
+               display: block;
+               margin-top: 5px;
        }
 
 }
index a201a4e..3d7b732 100644 (file)
@@ -1,9 +1,3 @@
-.box-sizing(@value) {
-       -moz-box-sizing: @value;
-       -webkit-box-sizing: @value;
-       box-sizing: @value;
-}
-
 .agora-flush-left() {
        float: left;
        margin-left: 0;
index b7eea54..61691c7 100644 (file)
@@ -1,26 +1,11 @@
-#Wikimedia projects
+#mediawiki.ui
 
-This is the living style guide for MediaWiki UI used in Wikimedia Projects. It is generated from existing CSS programmatically. Please use it as a reference when developing code for MediaWiki to ensure your design is consistent with others across the site. Note this document is a work in progress and subject to change.
-
-##Brand
-
-Imagine a world in which every single human being can freely share in the sum of all knowledge.
-
-Sharing knowledge is the heart of our movement. Specifically, we care about sharing the “… highest possible quality to every single person on the planet in their own language” (Jimmy Wales). The focus of our identity is being credible and is moving toward being more inviting. We want our contributors to keep contributing while our assuring our readers that the information on any of the Wikimedia projects is reliable and accurate. Our personality should embody both of those traits with a slight sense of rebellion. We are unlike traditional projects (for instance, Encyclopedias that are only created by a few select individuals). We are a global movement, and as Jimmy Wales puts it: “Wikipedia is like rock’n’roll; it’s a cultural shift."
+This is the living style guide for mediawiki.ui.  It is generated from the mediawiki.ui LESS source code programmatically. Please use it as a reference when developing code for MediaWiki to ensure your design is consistent with others across the site. Note this document is a work in progress and subject to change.
 
 ##Design Philosophy
 
-The Wikimedia movement is a global volunteer community that aims to collect and develop the world's knowledge and to make it available to everyone for free, for any purpose. “Imagine a world in which every single human being can freely share in the sum of all knowledge.” 
-
-###Credible
-We strive for the most accurate, high quality and neutral information on all Wikimedia projects. We are fact-based and honest. We do not take sides. We are fair and impartial. 
-
 ###Inviting
-We are geeky about collecting and developing knowledge. We invite and welcome every single human being to share their knowledge with us and the rest of the world. We are open-minded and have a strong sense of community. Our aesthetics should be clean and encourage interaction. 
+Our aesthetics should be clean and encourage interaction.
 
 ###Worldly
-We are thoughtful and are aware of cultural differences. We are careful about words, color usage, and images that might offend. We are also aware of limited connectivity in some areas of the world and are thoughtful of image sizes and loading speed. 
-
-###Humble
-We are respectful of contributors’ effort and knowledge. We have a wealth of knowledge on all projects and many people to thank for that. We are humble. We are helpful and welcome help to expand the sum of all knowledge. 
-
+We are thoughtful and are aware of cultural differences. We are careful about words, color usage, and images that might offend. We are also aware of limited connectivity in some areas of the world and are thoughtful of image sizes and loading speed.  We work to support accessibility.
index 08690a3..df51efc 100644 (file)
@@ -12,7 +12,7 @@
 //
 // Third choice: Arial
 //
-// Our content is predominantly text, hence visual hierarchy must be clear. Use these recommended type sizes to inform and establish information hierarchy and organization. 
+// Wiki content is often predominantly text; hence, visual hierarchy must be clear. Use these recommended type sizes to inform and establish information hierarchy and organization.
 //
 // Unless if you plan to put extra attention and manually adjust spacing, avoid justifying texts and paragraphs as they are harder to read and create unnecessary visual distractions. Along with centered text, they convey a formal and less friendly environment. 
 //
diff --git a/resources/src/mediawiki/mediawiki.cookie.js b/resources/src/mediawiki/mediawiki.cookie.js
new file mode 100644 (file)
index 0000000..6f9f0ab
--- /dev/null
@@ -0,0 +1,126 @@
+( function ( mw, $ ) {
+       'use strict';
+
+       /**
+        * Provides an API for getting and setting cookies that is
+        * syntactically and functionally similar to the server-side cookie
+        * API (`WebRequest#getCookie` and `WebResponse#setcookie`).
+        *
+        * @author Sam Smith <samsmith@wikimedia.org>
+        * @author Matthew Flaschen <mflaschen@wikimedia.org>
+        * @author Timo Tijhof <krinklemail@gmail.com>
+        *
+        * @class mw.cookie
+        * @singleton
+        */
+       mw.cookie = {
+
+               /**
+                * Sets or deletes a cookie.
+                *
+                * While this is natural in JavaScript, contrary to `WebResponse#setcookie` in PHP, the
+                * default values for the `options` properties only apply if that property isn't set
+                * already in your options object (e.g. passing `{ secure: null }` or `{ secure: undefined }`
+                * overrides the default value for `options.secure`).
+                *
+                * @param {string} key
+                * @param {string|null} value Value of cookie. If `value` is `null` then this method will
+                *   instead remove a cookie by name of `key`.
+                * @param {Object|Date} [options] Options object, or expiry date
+                * @param {Date|null} [options.expires=wgCookieExpiration] The expiry date of the cookie.
+                *
+                *   Default cookie expiration is based on `wgCookieExpiration`.  If `wgCookieExpiration` is
+                *   0, a session cookie is set (expires when the browser is closed). For non-zero values of
+                *   `wgCookieExpiration`, the cookie expires `wgCookieExpiration` seconds from now.
+                *
+                *   If options.expires is null, then a session cookie is set.
+                * @param {string} [options.prefix=wgCookiePrefix] The prefix of the key
+                * @param {string} [options.domain=wgCookieDomain] The domain attribute of the cookie
+                * @param {string} [options.path=wgCookiePath] The path attribute of the cookie
+                * @param {boolean} [options.secure=false] Whether or not to include the secure attribute.
+                *   (Does **not** use the wgCookieSecure configuration variable)
+                */
+               set: function ( key, value, options ) {
+                       var config, defaultOptions, date;
+
+                       // wgCookieSecure is not used for now, since 'detect' could not work with
+                       // ResourceLoaderStartUpModule, as module cache is not fragmented by protocol.
+                       config = mw.config.get( [
+                               'wgCookiePrefix',
+                               'wgCookieDomain',
+                               'wgCookiePath',
+                               'wgCookieExpiration'
+                       ] );
+
+                       defaultOptions = {
+                               prefix: config.wgCookiePrefix,
+                               domain: config.wgCookieDomain,
+                               path: config.wgCookiePath,
+                               secure: false
+                       };
+
+                       // Options argument can also be a shortcut for the expiry
+                       // Expiry can be a Date or null
+                       if ( $.type( options ) !== 'object' ) {
+                               // Also takes care of options = undefined, in which case we also don't need $.extend()
+                               defaultOptions.expires = options;
+                               options = defaultOptions;
+                       } else {
+                               options = $.extend( defaultOptions, options );
+                       }
+
+                       // $.cookie makes session cookies when expiry is omitted,
+                       // however our default is to expire wgCookieExpiration seconds from now.
+                       // Note: If wgCookieExpiration is 0, that is considered a special value indicating
+                       // all cookies should be session cookies by default.
+                       if ( options.expires === undefined && config.wgCookieExpiration !== 0 ) {
+                               date = new Date();
+                               date.setTime( Number( date ) + ( config.wgCookieExpiration * 1000 ) );
+                               options.expires = date;
+                       } else if ( options.expires === null ) {
+                               // $.cookie makes a session cookie when expires is omitted
+                               delete options.expires;
+                       }
+
+                       // Process prefix
+                       key = options.prefix + key;
+                       delete options.prefix;
+
+                       // Process value
+                       if ( value !== null ) {
+                               value = String( value );
+                       }
+
+                       // Other options are handled by $.cookie
+                       $.cookie( key, value, options );
+               },
+
+               /**
+                * Gets the value of a cookie.
+                *
+                * @param {string} key
+                * @param {string} [prefix=wgCookiePrefix] The prefix of the key. If `prefix` is
+                *   `undefined` or `null`, then `wgCookiePrefix` is used
+                * @param {Mixed} [defaultValue=null]
+                * @return {string} If the cookie exists, then the value of the
+                *   cookie, otherwise `defaultValue`
+                */
+               get: function ( key, prefix, defaultValue ) {
+                       var result;
+
+                       if ( prefix === undefined || prefix === null ) {
+                               prefix = mw.config.get( 'wgCookiePrefix' );
+                       }
+
+                       // Was defaultValue omitted?
+                       if ( arguments.length < 3 ) {
+                               defaultValue = null;
+                       }
+
+                       result = $.cookie( prefix + key );
+
+                       return result !== null ? result : defaultValue;
+               }
+       };
+
+} ( mediaWiki, jQuery ) );
index bf49d1a..ab27da9 100644 (file)
@@ -1,4 +1,3 @@
-
 .mw-debug-profile-tipsy .tipsy-inner {
        /* undo max-width from vector on .tipsy-inner */
        max-width: none;
index 49c88c3..64ec6c3 100644 (file)
                        $container.find( '.mw-debug-profile-period' ).tipsy( {
                                fade: true,
                                gravity: function () {
-                                       return $.fn.tipsy.autoNS.call( this )
-                                               + $.fn.tipsy.autoWE.call( this );
+                                       return $.fn.tipsy.autoNS.call( this ) + $.fn.tipsy.autoWE.call( this );
                                },
                                className: 'mw-debug-profile-tipsy',
                                center: false,
index 5ba1a54..8be1321 100644 (file)
@@ -5,6 +5,182 @@
  */
 ( function ( mw, $ ) {
 
+       var cloneCounter = 0;
+
+       /**
+        * Helper function for hide-if to find the nearby form field.
+        *
+        * Find the closest match for the given name, "closest" being the minimum
+        * level of parents to go to find a form field matching the given name or
+        * ending in array keys matching the given name (e.g. "baz" matches
+        * "foo[bar][baz]").
+        *
+        * @param {jQuery} element
+        * @param {string} name
+        * @return {jQuery|null}
+        */
+       function hideIfGetField( $el, name ) {
+               var $found, $p,
+                       suffix = name.replace( /^([^\[]+)/, '[$1]' );
+
+               function nameFilter() {
+                       return this.name === name ||
+                               ( this.name === ( 'wp' + name ) ) ||
+                               this.name.slice( -suffix.length ) === suffix;
+               }
+
+               for ( $p = $el.parent(); $p.length > 0; $p = $p.parent() ) {
+                       $found = $p.find( '[name]' ).filter( nameFilter );
+                       if ( $found.length ) {
+                               return $found;
+                       }
+               }
+               return null;
+       }
+
+       /**
+        * Helper function for hide-if to return a test function and list of
+        * dependent fields for a hide-if specification.
+        *
+        * @param {jQuery} element
+        * @param {Array} hide-if spec
+        * @return {Array} 2 elements: jQuery of dependent fields, and test function
+        */
+       function hideIfParse( $el, spec ) {
+               var op, i, l, v, $field, $fields, fields, func, funcs, getVal;
+
+               op = spec[0];
+               l = spec.length;
+               switch ( op ) {
+                       case 'AND':
+                       case 'OR':
+                       case 'NAND':
+                       case 'NOR':
+                               funcs = [];
+                               fields = [];
+                               for ( i = 1; i < l; i++ ) {
+                                       if ( !$.isArray( spec[i] ) ) {
+                                               throw new Error( op + ' parameters must be arrays' );
+                                       }
+                                       v = hideIfParse( $el, spec[i] );
+                                       fields.push( v[0] );
+                                       funcs.push( v[1] );
+                               }
+                               $fields = $( fields );
+
+                               l = funcs.length;
+                               switch ( op ) {
+                                       case 'AND':
+                                               func = function () {
+                                                       var i;
+                                                       for ( i = 0; i < l; i++ ) {
+                                                               if ( !funcs[i]() ) {
+                                                                       return false;
+                                                               }
+                                                       }
+                                                       return true;
+                                               };
+                                               break;
+
+                                       case 'OR':
+                                               func = function () {
+                                                       var i;
+                                                       for ( i = 0; i < l; i++ ) {
+                                                               if ( funcs[i]() ) {
+                                                                       return true;
+                                                               }
+                                                       }
+                                                       return false;
+                                               };
+                                               break;
+
+                                       case 'NAND':
+                                               func = function () {
+                                                       var i;
+                                                       for ( i = 0; i < l; i++ ) {
+                                                               if ( !funcs[i]() ) {
+                                                                       return true;
+                                                               }
+                                                       }
+                                                       return false;
+                                               };
+                                               break;
+
+                                       case 'NOR':
+                                               func = function () {
+                                                       var i;
+                                                       for ( i = 0; i < l; i++ ) {
+                                                               if ( funcs[i]() ) {
+                                                                       return false;
+                                                               }
+                                                       }
+                                                       return true;
+                                               };
+                                               break;
+                               }
+
+                               return [ $fields, func ];
+
+                       case 'NOT':
+                               if ( l !== 2 ) {
+                                       throw new Error( 'NOT takes exactly one parameter' );
+                               }
+                               if ( !$.isArray( spec[1] ) ) {
+                                       throw new Error( 'NOT parameters must be arrays' );
+                               }
+                               v = hideIfParse( $el, spec[1] );
+                               $fields = v[0];
+                               func = v[1];
+                               return [ $fields, function () {
+                                       return !func();
+                               } ];
+
+                       case '===':
+                       case '!==':
+                               if ( l !== 3 ) {
+                                       throw new Error( op + ' takes exactly two parameters' );
+                               }
+                               $field = hideIfGetField( $el, spec[1] );
+                               if ( !$field ) {
+                                       return [ $(), function () {
+                                               return false;
+                                       } ];
+                               }
+                               v = spec[2];
+
+                               if ( $field.first().prop( 'type' ) === 'radio' ||
+                                       $field.first().prop( 'type' ) === 'checkbox'
+                               ) {
+                                       getVal = function () {
+                                               var $selected = $field.filter( ':checked' );
+                                               return $selected.length ? $selected.val() : '';
+                                       };
+                               } else {
+                                       getVal = function () {
+                                               return $field.val();
+                                       };
+                               }
+
+                               switch ( op ) {
+                                       case '===':
+                                               func = function () {
+                                                       return getVal() === v;
+                                               };
+                                               break;
+                                       case '!==':
+                                               func = function () {
+                                                       return getVal() !== v;
+                                               };
+                                               break;
+                               }
+
+                               return [ $field, func ];
+
+                       default:
+                               throw new Error( 'Unrecognized operation \'' + op + '\'' );
+               }
+       }
+
        /**
         * jQuery plugin to fade or snap to visible state.
         *
         */
        $.fn.goIn = function ( instantToggle ) {
                if ( instantToggle === true ) {
-                       return $( this ).show();
+                       return this.show();
                }
-               return $( this ).stop( true, true ).fadeIn();
+               return this.stop( true, true ).fadeIn();
        };
 
        /**
         */
        $.fn.goOut = function ( instantToggle ) {
                if ( instantToggle === true ) {
-                       return $( this ).hide();
+                       return this.hide();
                }
-               return $( this ).stop( true, true ).fadeOut();
+               return this.stop( true, true ).fadeOut();
        };
 
        /**
         * Bind a function to the jQuery object via live(), and also immediately trigger
         * the function on the objects with an 'instant' parameter set to true.
+        *
+        * @method liveAndTestAtStart
+        * @deprecated since 1.24 Use .on() and .each() directly.
         * @param {Function} callback
         * @param {boolean|jQuery.Event} callback.immediate True when the event is called immediately,
         *  an event object when triggered from an event.
+        * @return jQuery
+        * @chainable
         */
-       $.fn.liveAndTestAtStart = function ( callback ) {
-               $( this )
+       mw.log.deprecate( $.fn, 'liveAndTestAtStart', function ( callback ) {
+               this
+                       // Can't really migrate to .on() generically, needs knowledge of
+                       // calling code to know the correct selector. Fix callers and
+                       // get rid of this .liveAndTestAtStart() hack.
                        .live( 'change', callback )
                        .each( function () {
                                callback.call( this, true );
                        } );
-       };
+       } );
 
-       $( function () {
+       function enhance( $root ) {
 
-               // Animate the SelectOrOther fields, to only show the text field when
-               // 'other' is selected.
-               $( '.mw-htmlform-select-or-other' ).liveAndTestAtStart( function ( instant ) {
-                       var $other = $( '#' + $( this ).attr( 'id' ) + '-other' );
+               /**
+                * @ignore
+                * @param {boolean|jQuery.Event} instant
+                */
+               function handleSelectOrOther( instant ) {
+                       var $other = $root.find( '#' + $( this ).attr( 'id' ) + '-other' );
                        $other = $other.add( $other.siblings( 'br' ) );
                        if ( $( this ).val() === 'other' ) {
                                $other.goIn( instant );
                        } else {
                                $other.goOut( instant );
                        }
-               } );
+               }
 
-       } );
+               // Animate the SelectOrOther fields, to only show the text field when
+               // 'other' is selected.
+               $root
+                       .on( 'change', '.mw-htmlform-select-or-other', handleSelectOrOther )
+                       .each( function () {
+                               handleSelectOrOther.call( this, true );
+                       } );
 
-       function addMulti( $oldContainer, $container ) {
-               var name = $oldContainer.find( 'input:first-child' ).attr( 'name' ),
-                       oldClass = ( ' ' + $oldContainer.attr( 'class' ) + ' ' ).replace( /(mw-htmlform-field-HTMLMultiSelectField|mw-chosen)/g, '' ),
-                       $select = $( '<select>' ),
-                       dataPlaceholder = mw.message( 'htmlform-chosen-placeholder' );
-               oldClass = $.trim( oldClass );
-               $select.attr( {
-                       name: name,
-                       multiple: 'multiple',
-                       'data-placeholder': dataPlaceholder.plain(),
-                       'class': 'htmlform-chzn-select mw-input ' + oldClass
-               } );
-               $oldContainer.find( 'input' ).each( function () {
-                       var $oldInput = $( this ),
-                       checked = $oldInput.prop( 'checked' ),
-                       $option = $( '<option>' );
-                       $option.prop( 'value', $oldInput.prop( 'value' ) );
-                       if ( checked ) {
-                               $option.prop( 'selected', true );
+               // Set up hide-if elements
+               $root.find( '.mw-htmlform-hide-if' ).each( function () {
+                       var v, $fields, test, func,
+                               $el = $( this ),
+                               spec = $el.data( 'hideIf' );
+
+                       if ( !spec ) {
+                               return;
                        }
-                       $option.text( $oldInput.prop( 'value' ) );
-                       $select.append( $option );
+
+                       v = hideIfParse( $el, spec );
+                       $fields = v[0];
+                       test = v[1];
+                       func = function () {
+                               if ( test() ) {
+                                       $el.hide();
+                               } else {
+                                       $el.show();
+                               }
+                       };
+                       $fields.on( 'change', func );
+                       func();
                } );
-               $container.append( $select );
-       }
 
-       function convertCheckboxesToMulti( $oldContainer, type ) {
-               var $fieldLabel = $( '<td>' ),
-               $td = $( '<td>' ),
-               $fieldLabelText = $( '<label>' ),
-               $container;
-               if ( type === 'tr' ) {
-                       addMulti( $oldContainer, $td );
-                       $container = $( '<tr>' );
-                       $container.append( $td );
-               } else if ( type === 'div' ) {
-                       $fieldLabel = $( '<div>' );
-                       $container = $( '<div>' );
-                       addMulti( $oldContainer, $container );
+               function addMulti( $oldContainer, $container ) {
+                       var name = $oldContainer.find( 'input:first-child' ).attr( 'name' ),
+                               oldClass = ( ' ' + $oldContainer.attr( 'class' ) + ' ' ).replace( /(mw-htmlform-field-HTMLMultiSelectField|mw-chosen)/g, '' ),
+                               $select = $( '<select>' ),
+                               dataPlaceholder = mw.message( 'htmlform-chosen-placeholder' );
+                       oldClass = $.trim( oldClass );
+                       $select.attr( {
+                               name: name,
+                               multiple: 'multiple',
+                               'data-placeholder': dataPlaceholder.plain(),
+                               'class': 'htmlform-chzn-select mw-input ' + oldClass
+                       } );
+                       $oldContainer.find( 'input' ).each( function () {
+                               var $oldInput = $( this ),
+                               checked = $oldInput.prop( 'checked' ),
+                               $option = $( '<option>' );
+                               $option.prop( 'value', $oldInput.prop( 'value' ) );
+                               if ( checked ) {
+                                       $option.prop( 'selected', true );
+                               }
+                               $option.text( $oldInput.prop( 'value' ) );
+                               $select.append( $option );
+                       } );
+                       $container.append( $select );
+               }
+
+               function convertCheckboxesToMulti( $oldContainer, type ) {
+                       var $fieldLabel = $( '<td>' ),
+                       $td = $( '<td>' ),
+                       $fieldLabelText = $( '<label>' ),
+                       $container;
+                       if ( type === 'tr' ) {
+                               addMulti( $oldContainer, $td );
+                               $container = $( '<tr>' );
+                               $container.append( $td );
+                       } else if ( type === 'div' ) {
+                               $fieldLabel = $( '<div>' );
+                               $container = $( '<div>' );
+                               addMulti( $oldContainer, $container );
+                       }
+                       $fieldLabel.attr( 'class', 'mw-label' );
+                       $fieldLabelText.text( $oldContainer.find( '.mw-label label' ).text() );
+                       $fieldLabel.append( $fieldLabelText );
+                       $container.prepend( $fieldLabel );
+                       $oldContainer.replaceWith( $container );
+                       return $container;
                }
-               $fieldLabel.attr( 'class', 'mw-label' );
-               $fieldLabelText.text( $oldContainer.find( '.mw-label label' ).text() );
-               $fieldLabel.append( $fieldLabelText );
-               $container.prepend( $fieldLabel );
-               $oldContainer.replaceWith( $container );
-               return $container;
-       }
 
-       if ( $( '.mw-chosen' ).length ) {
-               mw.loader.using( 'jquery.chosen', function () {
-                       $( '.mw-chosen' ).each( function () {
-                               var type = this.nodeName.toLowerCase(),
-                                       $converted = convertCheckboxesToMulti( $( this ), type );
-                               $converted.find( '.htmlform-chzn-select' ).chosen( { width: 'auto' } );
+               if ( $root.find( '.mw-chosen' ).length ) {
+                       mw.loader.using( 'jquery.chosen', function () {
+                               $root.find( '.mw-chosen' ).each( function () {
+                                       var type = this.nodeName.toLowerCase(),
+                                               $converted = convertCheckboxesToMulti( $( this ), type );
+                                       $converted.find( '.htmlform-chzn-select' ).chosen( { width: 'auto' } );
+                               } );
                        } );
-               } );
-       }
+               }
 
-       $( function () {
-               var $matrixTooltips = $( '.mw-htmlform-matrix .mw-htmlform-tooltip' );
+               var $matrixTooltips = $root.find( '.mw-htmlform-matrix .mw-htmlform-tooltip' );
                if ( $matrixTooltips.length ) {
                        mw.loader.using( 'jquery.tipsy', function () {
                                $matrixTooltips.tipsy( { gravity: 's' } );
                        } );
                }
+
+               // Add/remove cloner clones without having to resubmit the form
+               $root.find( '.mw-htmlform-cloner-delete-button' ).click( function ( ev ) {
+                       ev.preventDefault();
+                       $( this ).closest( 'li.mw-htmlform-cloner-li' ).remove();
+               } );
+
+               $root.find( '.mw-htmlform-cloner-create-button' ).click( function ( ev ) {
+                       var $ul, $li, html;
+
+                       ev.preventDefault();
+
+                       $ul = $( this ).prev( 'ul.mw-htmlform-cloner-ul' );
+
+                       html = $ul.data( 'template' ).replace(
+                               $ul.data( 'uniqueId' ), 'clone' + ( ++cloneCounter ), 'g'
+                       );
+
+                       $li = $( '<li>' )
+                               .addClass( 'mw-htmlform-cloner-li' )
+                               .html( html )
+                               .appendTo( $ul );
+
+                       enhance( $li );
+               } );
+
+               mw.hook( 'htmlform.enhance' ).fire( $root );
+
+       }
+
+       $( function () {
+               enhance( $( document ) );
        } );
 
        /**
index 32a9927..9d34d62 100644 (file)
                var parser = new mw.jqueryMsg.parser( options );
 
                return function ( args ) {
-                       var key = args[0],
+                       var fallback,
+                               key = args[0],
                                argsArray = $.isArray( args[1] ) ? args[1] : slice.call( args, 1 );
                        try {
                                return parser.parse( key, argsArray );
                        } catch ( e ) {
-                               var fallback = parser.settings.messages.get( key );
+                               fallback = parser.settings.messages.get( key );
                                mw.log.warn( 'mediawiki.jqueryMsg: ' + key + ': ' + e.message );
                                return $( '<span>' ).text( fallback );
                        }
                                        for ( i = 0; i < ps.length; i++ ) {
                                                result = ps[i]();
                                                if ( result !== null ) {
-                                                        return result;
+                                                       return result;
                                                }
                                        }
                                        return null;
                                return function () {
                                        var result = null;
                                        if ( input.substr( pos, len ) === s ) {
-                                                result = s;
-                                                pos += len;
+                                               result = s;
+                                               pos += len;
                                        }
                                        return result;
                                };
                                for ( i = 0, len = attributes.length; i < len; i += 2 ) {
                                        attributeName = attributes[i];
                                        if ( $.inArray( attributeName, settings.allowedHtmlCommonAttributes ) === -1 &&
-                                            $.inArray( attributeName, settings.allowedHtmlAttributesByElement[startTagName] || [] ) === -1 ) {
+                                               $.inArray( attributeName, settings.allowedHtmlAttributesByElement[startTagName] || [] ) === -1 ) {
                                                return false;
                                        }
                                }
index f6154ee..c1815a5 100644 (file)
@@ -7,13 +7,13 @@
  * @alternateClassName mediaWiki
  * @singleton
  */
-
-var mw = ( function ( $, undefined ) {
+( function ( $ ) {
        'use strict';
 
        /* Private Members */
 
-       var hasOwn = Object.prototype.hasOwnProperty,
+       var mw,
+               hasOwn = Object.prototype.hasOwnProperty,
                slice = Array.prototype.slice,
                trackCallbacks = $.Callbacks( 'memory' ),
                trackQueue = [];
@@ -371,7 +371,7 @@ var mw = ( function ( $, undefined ) {
        /**
         * @class mw
         */
-       return {
+       mw = {
                /* Public Members */
 
                /**
@@ -471,7 +471,7 @@ var mw = ( function ( $, undefined ) {
                 *
                 * This was reserved for future use but never ended up being used.
                 *
-                * @deprecated since 1.22: Let deprecated identifiers keep their original name
+                * @deprecated since 1.22 Let deprecated identifiers keep their original name
                 *  and use mw.log#deprecate to create an access container for tracking.
                 * @property
                 */
@@ -538,7 +538,7 @@ var mw = ( function ( $, undefined ) {
                         */
                        log.warn = function () {
                                var console = window.console;
-                               if ( console && console.warn ) {
+                               if ( console && console.warn && console.warn.apply ) {
                                        console.warn.apply( console, arguments );
                                        if ( console.trace ) {
                                                console.trace();
@@ -786,7 +786,7 @@ var mw = ( function ( $, undefined ) {
                                                        try {
                                                                styleEl.styleSheet.cssText += cssText; // IE
                                                        } catch ( e ) {
-                                                               log( 'addEmbeddedCSS fail', e );
+                                                               log( 'Stylesheet error', e );
                                                        }
                                                } else {
                                                        styleEl.appendChild( document.createTextNode( String( cssText ) ) );
@@ -1043,71 +1043,30 @@ var mw = ( function ( $, undefined ) {
                         *  Ignored (and defaulted to `true`) if the document-ready event has already occurred.
                         */
                        function addScript( src, callback, async ) {
-                               /*jshint evil:true */
-                               var script, head, done;
-
-                               // Using isReady directly instead of storing it locally from
-                               // a $.fn.ready callback (bug 31895).
+                               // Using isReady directly instead of storing it locally from a $().ready callback (bug 31895)
                                if ( $.isReady || async ) {
-                                       // Can't use jQuery.getScript because that only uses <script> for cross-domain,
-                                       // it uses XHR and eval for same-domain scripts, which we don't want because it
-                                       // messes up line numbers.
-                                       // The below is based on jQuery ([jquery@1.9.1]/src/ajax/script.js)
-
-                                       // IE-safe way of getting an append target. In old IE document.head isn't supported
-                                       // and its getElementsByTagName can't find <head> until </head> is parsed.
-                                       done = false;
-                                       head = document.head || document.getElementsByTagName( 'head' )[0] || document.documentElement;
-
-                                       script = document.createElement( 'script' );
-                                       script.async = true;
-                                       script.src = src;
-                                       if ( $.isFunction( callback ) ) {
-                                               script.onload = script.onreadystatechange = function () {
-                                                       if (
-                                                               !done
-                                                               && (
-                                                                       !script.readyState
-                                                                       || /loaded|complete/.test( script.readyState )
-                                                               )
-                                                       ) {
-                                                               done = true;
-
-                                                               // Handle memory leak in IE
-                                                               script.onload = script.onreadystatechange = null;
-
-                                                               // Detach the element from the document
-                                                               if ( script.parentNode ) {
-                                                                       script.parentNode.removeChild( script );
-                                                               }
-
-                                                               // Dereference the element from javascript
-                                                               script = undefined;
-
-                                                               callback();
-                                                       }
-                                               };
-                                       }
-
-                                       if ( window.opera ) {
-                                               // Appending to the <head> blocks rendering completely in Opera,
-                                               // so append to the <body> after document ready. This means the
-                                               // scripts only start loading after the document has been rendered,
-                                               // but so be it. Opera users don't deserve faster web pages if their
-                                               // browser makes it impossible.
-                                               $( function () {
-                                                       document.body.appendChild( script );
-                                               } );
-                                       } else {
-                                               // Circumvent IE6 bugs with base elements (jqbug.com/2709, jqbug.com/4378)
-                                               // by prepending instead of appending.
-                                               head.insertBefore( script, head.firstChild );
-                                       }
+                                       $.ajax( {
+                                               url: src,
+                                               dataType: 'script',
+                                               // Force jQuery behaviour to be for crossDomain. Otherwise jQuery would use
+                                               // XHR for a same domain request instead of <script>, which changes the request
+                                               // headers (potentially missing a cache hit), and reduces caching in general
+                                               // since browsers cache XHR much less (if at all). And XHR means we retreive
+                                               // text, so we'd need to $.globalEval, which then messes up line numbers.
+                                               crossDomain: true,
+                                               cache: true,
+                                               async: true
+                                       } ).always( function () {
+                                               if ( callback  ) {
+                                                       callback();
+                                               }
+                                       } );
                                } else {
+                                       /*jshint evil:true */
                                        document.write( mw.html.element( 'script', { 'src': src }, '' ) );
-                                       if ( $.isFunction( callback ) ) {
-                                               // Document.write is synchronous, so this is called when it's done
-                                               // FIXME: that's a lie. doc.write isn't actually synchronous
+                                       if ( callback ) {
+                                               // Document.write is synchronous, so this is called when it's done.
+                                               // FIXME: That's a lie. doc.write isn't actually synchronous.
                                                callback();
                                        }
                                }
@@ -1647,7 +1606,7 @@ var mw = ( function ( $, undefined ) {
                                                version: version !== undefined ? parseInt( version, 10 ) : 0,
                                                dependencies: [],
                                                group: typeof group === 'string' ? group : null,
-                                               source: typeof source === 'string' ? source: 'local',
+                                               source: typeof source === 'string' ? source : 'local',
                                                state: 'registered'
                                        };
                                        if ( typeof dependencies === 'string' ) {
@@ -2025,7 +1984,9 @@ var mw = ( function ( $, undefined ) {
                                                                mw.loader.store.items = data.items;
                                                                return;
                                                        }
-                                               } catch ( e ) {}
+                                               } catch ( e ) {
+                                                       log( 'Storage error', e );
+                                               }
 
                                                if ( raw === undefined ) {
                                                        // localStorage failed; disable store
@@ -2102,6 +2063,7 @@ var mw = ( function ( $, undefined ) {
                                                                log( 'Detected malformed function stringification (bug 57567)' );
                                                        }
                                                } catch ( e ) {
+                                                       log( 'Storage error', e );
                                                        return;
                                                }
 
@@ -2172,7 +2134,9 @@ var mw = ( function ( $, undefined ) {
                                                                localStorage.removeItem( key );
                                                                data = JSON.stringify( mw.loader.store );
                                                                localStorage.setItem( key, data );
-                                                       } catch ( e ) {}
+                                                       } catch ( e ) {
+                                                               log( 'Storage error', e );
+                                                       }
                                                }
 
                                                return function () {
@@ -2403,17 +2367,17 @@ var mw = ( function ( $, undefined ) {
                }() )
        };
 
-}( jQuery ) );
+       // Alias $j to jQuery for backwards compatibility
+       // @deprecated since 1.23 Use $ or jQuery instead
+       mw.log.deprecate( window, '$j', $, 'Use $ or jQuery instead.' );
 
-// Alias $j to jQuery for backwards compatibility
-// @deprecated since 1.23 Use $ or jQuery instead
-mw.log.deprecate( window, '$j', jQuery, 'Use $ or jQuery instead.' );
+       // Attach to window and globally alias
+       window.mw = window.mediaWiki = mw;
 
-// Attach to window and globally alias
-window.mw = window.mediaWiki = mw;
+       // Auto-register from pre-loaded startup scripts
+       if ( $.isFunction( window.startUp ) ) {
+               window.startUp();
+               window.startUp = undefined;
+       }
 
-// Auto-register from pre-loaded startup scripts
-if ( jQuery.isFunction( window.startUp ) ) {
-       window.startUp();
-       window.startUp = undefined;
-}
+}( jQuery ) );
index 2ca0bbd..ad68967 100644 (file)
                                d = new Date(),
                                // Create HH:MM:SS.MIL timestamp
                                time = ( d.getHours() < 10 ? '0' + d.getHours() : d.getHours() ) +
-                                ':' + ( d.getMinutes() < 10 ? '0' + d.getMinutes() : d.getMinutes() ) +
-                                ':' + ( d.getSeconds() < 10 ? '0' + d.getSeconds() : d.getSeconds() ) +
-                                '.' + ( d.getMilliseconds() < 10 ? '00' + d.getMilliseconds() : ( d.getMilliseconds() < 100 ? '0' + d.getMilliseconds() : d.getMilliseconds() ) ),
-                                $log = $( '#mw-log-console' );
+                                       ':' + ( d.getMinutes() < 10 ? '0' + d.getMinutes() : d.getMinutes() ) +
+                                       ':' + ( d.getSeconds() < 10 ? '0' + d.getSeconds() : d.getSeconds() ) +
+                                       '.' + ( d.getMilliseconds() < 10 ? '00' + d.getMilliseconds() : ( d.getMilliseconds() < 100 ? '0' + d.getMilliseconds() : d.getMilliseconds() ) ),
+                               $log = $( '#mw-log-console' );
 
                        if ( !$log.length ) {
                                $log = $( '<div id="mw-log-console"></div>' ).css( {
index 639d51d..282cf6f 100644 (file)
@@ -3,7 +3,7 @@
  */
 ( function ( mw, $ ) {
        $( function () {
-               var map, resultRenderCache, searchboxesSelectors,
+               var api, map, resultRenderCache, searchboxesSelectors,
                        // Region where the suggestions box will appear directly below
                        // (using the same width). Can be a container element or the input
                        // itself, depending on what suits best in the environment.
                        }
                }
 
-               // General suggestions functionality for all search boxes
+               // Generic suggestions functionality for all search boxes
                searchboxesSelectors = [
                        // Primary searchbox on every page in standard skins
                        '#searchInput',
                        '#powerSearchText',
                        '#searchText',
                        // Generic selector for skins with multiple searchboxes (used by CologneBlue)
+                       // and for MediaWiki itself (special pages with page title inputs)
                        '.mw-searchInput'
                ];
                $( searchboxesSelectors.join( ', ' ) )
                        .suggestions( {
                                fetch: function ( query ) {
-                                       var $el;
-
-                                       if ( query.length !== 0 ) {
-                                               $el = $( this );
-                                               $el.data( 'request', ( new mw.Api() ).get( {
-                                                       action: 'opensearch',
-                                                       search: query,
-                                                       namespace: 0,
-                                                       suggest: ''
-                                               } ).done( function ( data ) {
-                                                       $el.suggestions( 'suggestions', data[1] );
-                                               } ) );
-                                       }
+                                       var $textbox = this,
+                                               node = this[0];
+
+                                       api = api || new mw.Api();
+
+                                       $.data( node, 'request', api.get( {
+                                               action: 'opensearch',
+                                               search: query,
+                                               namespace: 0,
+                                               suggest: ''
+                                       } ).done( function ( data ) {
+                                               $textbox.suggestions( 'suggestions', data[1] );
+                                       } ) );
                                },
                                cancel: function () {
-                                       var apiPromise = $( this ).data( 'request' );
-                                       // If the delay setting has caused the fetch to have not even happened
-                                       // yet, the apiPromise object will have never been set.
-                                       if ( apiPromise && $.isFunction( apiPromise.abort ) ) {
-                                               apiPromise.abort();
-                                               $( this ).removeData( 'request' );
+                                       var node = this[0],
+                                               request = $.data( node, 'request' );
+
+                                       if ( request ) {
+                                               request.abort();
+                                               $.removeData( node, 'request' );
                                        }
                                },
                                result: {
                                        render: renderFunction,
                                        select: function () {
-                                               return true; // allow the form to be submitted
+                                               // allow the form to be submitted
+                                               return true;
                                        }
                                },
                                delay: 120,
                                // make sure paste and cut events from the mouse and drag&drop events
                                // trigger the keypress handler and cause the suggestions to update
                                $( this ).trigger( 'keypress' );
+                       } )
+                       // In most skins (at least Monobook and Vector), the font-size is messed up in <body>.
+                       // (they use 2 elements to get a sane font-height). So, instead of making exceptions for
+                       // each skin or adding more stylesheets, just copy it from the active element so auto-fit.
+                       .each( function () {
+                               var $this = $( this );
+                               $this
+                                       .data( 'suggestions-context' )
+                                       .data.$container
+                                               .css( 'fontSize', $this.css( 'fontSize' ) );
                        } );
 
                // Ensure that the thing is actually present!
 
                // Special suggestions functionality for skin-provided search box
                $searchInput.suggestions( {
-                       result: {
-                               render: renderFunction,
-                               select: function () {
-                                       return true; // allow the form to be submitted
-                               }
-                       },
                        special: {
                                render: specialRenderFunction,
                                select: function ( $input ) {
 
                // If the form includes any fallback fulltext search buttons, remove them
                $searchInput.closest( 'form' ).find( '.mw-fallbackSearchButton' ).remove();
-
-               // In most skins (at least Monobook and Vector), the font-size is messed up in <body>.
-               // (they use 2 elements to get a sane font-height). So, instead of making exceptions for
-               // each skin or adding more stylesheets, just copy it from the active element so auto-fit.
-               $searchInput
-                       .data( 'suggestions-context' )
-                       .data.$container
-                               .css( 'fontSize', $searchInput.css( 'fontSize' ) );
-
        } );
 
 }( mediaWiki, jQuery ) );
index 6eb8552..e8dd473 100644 (file)
@@ -1,57 +1,47 @@
-/**
- * @private
- * @singleton
- * @class mw.toc
- */
 ( function ( mw, $ ) {
        'use strict';
 
        // Table of contents toggle
        mw.hook( 'wikipage.content' ).add( function ( $content ) {
+               var $toc, $tocTitle, $tocToggleLink, $tocList, hideToc;
+               $toc = $content.find( '#toc' );
+               $tocTitle = $content.find( '#toctitle' );
+               $tocToggleLink = $content.find( '#togglelink' );
+               $tocList = $toc.find( 'ul' ).eq( 0 );
 
-               /**
-                * Hide/show the table of contents element
-                *
-                * @param {jQuery} $toggleLink A jQuery object of the toggle link.
-                */
-               function toggleToc( $toggleLink ) {
-                       var $tocList = $content.find( '#toc ul:first' );
-
-                       // This function shouldn't be called if there's no TOC,
-                       // but just in case...
-                       if ( $tocList.length ) {
-                               if ( $tocList.is( ':hidden' ) ) {
-                                       $tocList.slideDown( 'fast' );
-                                       $toggleLink.text( mw.msg( 'hidetoc' ) );
-                                       $content.find( '#toc' ).removeClass( 'tochidden' );
-                                       $.cookie( 'mw_hidetoc', null, {
-                                               expires: 30,
-                                               path: '/'
-                                       } );
-                               } else {
-                                       $tocList.slideUp( 'fast' );
-                                       $toggleLink.text( mw.msg( 'showtoc' ) );
-                                       $content.find( '#toc' ).addClass( 'tochidden' );
-                                       $.cookie( 'mw_hidetoc', '1', {
-                                               expires: 30,
-                                               path: '/'
-                                       } );
-                               }
+               // Hide/show the table of contents element
+               function toggleToc() {
+                       if ( $tocList.is( ':hidden' ) ) {
+                               $tocList.slideDown( 'fast' );
+                               $tocToggleLink.text( mw.msg( 'hidetoc' ) );
+                               $toc.removeClass( 'tochidden' );
+                               $.cookie( 'mw_hidetoc', null, {
+                                       expires: 30,
+                                       path: '/'
+                               } );
+                       } else {
+                               $tocList.slideUp( 'fast' );
+                               $tocToggleLink.text( mw.msg( 'showtoc' ) );
+                               $toc.addClass( 'tochidden' );
+                               $.cookie( 'mw_hidetoc', '1', {
+                                       expires: 30,
+                                       path: '/'
+                               } );
                        }
                }
 
-               var $tocTitle, $tocToggleLink, hideTocCookie;
-               $tocTitle = $content.find( '#toctitle' );
-               $tocToggleLink = $content.find( '#togglelink' );
-               // Only add it if there is a TOC and there is no toggle added already
-               if ( $content.find( '#toc' ).length && $tocTitle.length && !$tocToggleLink.length ) {
-                       hideTocCookie = $.cookie( 'mw_hidetoc' );
+               // Only add it if there is a complete TOC and it doesn't
+               // have a toggle added already
+               if ( $toc.length && $tocTitle.length && $tocList.length && !$tocToggleLink.length ) {
+                       hideToc = $.cookie( 'mw_hidetoc' ) === '1';
+
                        $tocToggleLink = $( '<a href="#" class="internal" id="togglelink"></a>' )
-                               .text( mw.msg( 'hidetoc' ) )
+                               .text( hideToc ? mw.msg( 'showtoc' ) : mw.msg( 'hidetoc' ) )
                                .click( function ( e ) {
                                        e.preventDefault();
-                                       toggleToc( $( this ) );
+                                       toggleToc();
                                } );
+
                        $tocTitle.append(
                                $tocToggleLink
                                        .wrap( '<span class="toctoggle"></span>' )
@@ -60,8 +50,9 @@
                                                .append( ']&nbsp;' )
                        );
 
-                       if ( hideTocCookie === '1' ) {
-                               toggleToc( $tocToggleLink );
+                       if ( hideToc ) {
+                               $tocList.hide();
+                               $toc.addClass( 'tochidden' );
                        }
                }
        } );
index 8344111..c5694b7 100644 (file)
                        return mw.config.get( 'wgUserName' );
                },
 
-               /**
-                * @inheritdoc #getName
-                * @deprecated since 1.20 use #getName instead
-                */
-               name: function () {
-                       return user.getName();
-               },
-
                /**
                 * Get date user registered, if available
                 *
                        return user.getName() === null;
                },
 
-               /**
-                * @inheritdoc #isAnon
-                * @deprecated since 1.20 use #isAnon instead
-                */
-               anonymous: function () {
-                       return user.isAnon();
-               },
-
                /**
                 * Get an automatically generated random ID (stored in a session cookie)
                 *
                }
        };
 
+       /**
+        * @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 ) );
index a5bc7d9..887885e 100644 (file)
                 * (don't call before document ready)
                 */
                init: function () {
-                       /* Fill $content var */
                        util.$content = ( function () {
-                               var i, l, $content, selectors;
+                               var i, l, $node, selectors;
+
                                selectors = [
-                                       // The preferred standard for setting $content (class="mw-body")
-                                       // You may also use (class="mw-body mw-body-primary") if you use
-                                       // mw-body in multiple locations.
-                                       // Or class="mw-body-primary" if you want $content to be deeper
-                                       // in the dom than mw-body
+                                       // The preferred standard is class "mw-body".
+                                       // You may also use class "mw-body mw-body-primary" if you use
+                                       // mw-body in multiple locations. Or class "mw-body-primary" if
+                                       // you use mw-body deeper in the DOM.
                                        '.mw-body-primary',
                                        '.mw-body',
 
-                                       /* Legacy fallbacks for setting the content */
-                                       // Vector, Monobook, Chick, etc... based skins
-                                       '#bodyContent',
-
-                                       // Modern based skins
-                                       '#mw_contentholder',
-
-                                       // Standard, CologneBlue
-                                       '#article',
-
-                                       // #content is present on almost all if not all skins. Most skins (the above cases)
-                                       // have #content too, but as an outer wrapper instead of the article text container.
-                                       // The skins that don't have an outer wrapper do have #content for everything
-                                       // so it's a good fallback
-                                       '#content',
-
-                                       // If nothing better is found fall back to our bodytext div that is guaranteed to be here
+                                       // If the skin has no such class, fall back to the parser output
                                        '#mw-content-text',
 
-                                       // Should never happen... well, it could if someone is not finished writing a skin and has
-                                       // not inserted bodytext yet. But in any case <body> should always exist
+                                       // Should never happen... well, it could if someone is not finished writing a
+                                       // skin and has not yet inserted bodytext yet.
                                        'body'
                                ];
+
                                for ( i = 0, l = selectors.length; i < l; i++ ) {
-                                       $content = $( selectors[i] ).first();
-                                       if ( $content.length ) {
-                                               return $content;
+                                       $node = $( selectors[i] );
+                                       if ( $node.length ) {
+                                               return $node.first();
                                        }
                                }
 
-                               // Make sure we don't unset util.$content if it was preset and we don't find anything
+                               // Preserve existing customized value in case it was preset
                                return util.$content;
-                       } )();
+                       }() );
                },
 
                /* Main body */
 
                /**
                 * Encode page titles for use in a URL
+                *
                 * We want / and : to be included as literal characters in our title URLs
-                * as they otherwise fatally break the title
+                * as they otherwise fatally break the title.
+                *
+                * The others are decoded because we can, it's prettier and matches behaviour
+                * of `wfUrlencode` in PHP.
                 *
                 * @param {string} str String to be encoded.
                 */
                wikiUrlencode: function ( str ) {
                        return util.rawurlencode( str )
-                               .replace( /%20/g, '_' ).replace( /%3A/g, ':' ).replace( /%2F/g, '/' );
+                               .replace( /%20/g, '_' )
+                               // wfUrlencode replacements
+                               .replace( /%3B/g, ';' )
+                               .replace( /%40/g, '@' )
+                               .replace( /%24/g, '$' )
+                               .replace( /%21/g, '!' )
+                               .replace( /%2A/g, '*' )
+                               .replace( /%28/g, '(' )
+                               .replace( /%29/g, ')' )
+                               .replace( /%2C/g, ',' )
+                               .replace( /%2F/g, '/' )
+                               .replace( /%3A/g, ':' );
                },
 
                /**
                        return null;
                },
 
-               /**
-                * @property {string}
-                * Access key prefix.
-                */
-               tooltipAccessKeyPrefix: ( function () {
-                       var profile = $.client.profile();
-
-                       // Opera on any platform
-                       if ( profile.name === 'opera' ) {
-                               return 'shift-esc-';
-                       }
-
-                       // Chrome on any platform
-                       if ( profile.name === 'chrome' ) {
-                               if ( profile.platform === 'mac' ) {
-                                       // Chrome on Mac
-                                       return 'ctrl-option-';
-                               }
-                               // Chrome on Windows or Linux
-                               // (both alt- and alt-shift work, but alt with E, D, F etc does not
-                               // work since they are browser shortcuts)
-                               return 'alt-shift-';
-                       }
-
-                       // Non-Windows Safari with webkit_version > 526
-                       if ( profile.platform !== 'win'
-                               && profile.name === 'safari'
-                               && profile.layoutVersion > 526
-                       ) {
-                               return 'ctrl-alt-';
-                       }
-
-                       // Firefox 14+ on Mac
-                       if ( profile.platform === 'mac'
-                               && profile.name === 'firefox'
-                               && profile.versionNumber >= 14
-                       ) {
-                               return 'ctrl-option-';
-                       }
-
-                       // Safari/Konqueror on any platform, or any browser on Mac
-                       // (but not Safari on Windows)
-                       if ( !( profile.platform === 'win' && profile.name === 'safari' )
-                               && ( profile.name === 'safari'
-                               || profile.platform === 'mac'
-                               || profile.name === 'konqueror' )
-                       ) {
-                               return 'ctrl-';
-                       }
-
-                       // Firefox/Iceweasel 2.x and later
-                       if ( ( profile.name === 'firefox' || profile.name === 'iceweasel' )
-                               && profile.versionBase > '1' ) {
-                               return 'alt-shift-';
-                       }
-
-                       return 'alt-';
-               } )(),
-
-               /**
-                * @property {RegExp}
-                * Regex to match accesskey tooltips.
-                *
-                * Should match:
-                *
-                * - "ctrl-option-"
-                * - "alt-shift-"
-                * - "ctrl-alt-"
-                * - "ctrl-"
-                *
-                * The accesskey is matched in group $6.
-                */
-               tooltipAccessKeyRegexp: /\[(ctrl-)?(option-)?(alt-)?(shift-)?(esc-)?(.)\]$/,
-
                /**
                 * Add the appropriate prefix to the accesskey shown in the tooltip.
                 *
                                $nodes = $( $nodes );
                        }
 
-                       $nodes.attr( 'title', function ( i, val ) {
-                               if ( val && util.tooltipAccessKeyRegexp.test( val ) ) {
-                                       return val.replace( util.tooltipAccessKeyRegexp,
-                                               '[' + util.tooltipAccessKeyPrefix + '$6]' );
-                               }
-                               return val;
-                       } );
+                       $nodes.updateTooltipAccessKeys();
                },
 
-               /*
+               /**
+                * The content wrapper of the skin (e.g. `.mw-body`).
+                *
+                * Populated on document ready by #init. To use this property,
+                * wait for `$.ready` and be sure to have a module depedendency on
+                * `mediawiki.util` and `mediawiki.page.startup` which will ensure
+                * your document ready handler fires after #init.
+                *
+                * Because of the lazy-initialised nature of this property,
+                * you're discouraged from using it.
+                *
+                * If you need just the wikipage content (not any of the
+                * extra elements output by the skin), use `$( '#mw-content-text' )`
+                * instead. Or listen to mw.hook#wikipage_content which will
+                * allow your code to re-run when the page changes (e.g. live preview
+                * or re-render after ajax save).
+                *
                 * @property {jQuery}
-                * A jQuery object that refers to the content area element.
-                * Populated by #init.
                 */
                $content: null,
 
                                $item.attr( 'id', id );
                        }
 
-                       if ( tooltip ) {
-                               // Trim any existing accesskey hint and the trailing space
-                               tooltip = $.trim( tooltip.replace( util.tooltipAccessKeyRegexp, '' ) );
-                               if ( accesskey ) {
-                                       tooltip += ' [' + accesskey + ']';
-                               }
-                               $link.attr( 'title', tooltip );
-                               if ( accesskey ) {
-                                       util.updateTooltipAccessKeys( $link );
-                               }
-                       }
-
                        if ( accesskey ) {
                                $link.attr( 'accesskey', accesskey );
                        }
 
+                       if ( tooltip ) {
+                               $link.attr( 'title', tooltip ).updateTooltipAccessKeys();
+                       }
+
                        if ( nextnode ) {
                                if ( nextnode.nodeType || typeof nextnode === 'string' ) {
                                        // nextnode is a DOM element (was the only option before MW 1.17, in wikibits.js)
 
                },
 
-               /**
-                * Add a little box at the top of the screen to inform the user of
-                * something, replacing any previous message.
-                * Calling with no arguments, with an empty string or null will hide the message
-                *
-                * @param {Mixed} message The DOM-element, jQuery object or HTML-string to be put inside the message box.
-                * to allow CSS/JS to hide different boxes. null = no class used.
-                * @deprecated since 1.20 Use mw#notify
-                */
-               jsMessage: 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;
-               },
-
                /**
                 * Validate a string as representing a valid e-mail address
                 * according to HTML5 specification. Please note the specification
                                // RegExp is case insensitive
                                'i'
                        );
-                       return ( null !== mailtxt.match( html5EmailRegexp ) );
+                       return ( mailtxt.match( html5EmailRegexp ) !== null );
                },
 
                /**
         */
        mw.log.deprecate( util, 'wikiGetlink', util.getUrl, 'Use mw.util.getUrl instead.' );
 
+       /**
+        * Access key prefix. Might be wrong for browsers implementing the accessKeyLabel property.
+        * @property {string} tooltipAccessKeyPrefix
+        * @deprecated since 1.24 Use the module jquery.accessKeyLabel instead.
+        */
+       mw.log.deprecate( util, 'tooltipAccessKeyPrefix', $.fn.updateTooltipAccessKeys.getAccessKeyPrefix(), 'Use jquery.accessKeyLabel instead.' );
+
+       /**
+        * Regex to match accesskey tooltips.
+        *
+        * Should match:
+        *
+        * - "[ctrl-option-x]"
+        * - "[alt-shift-x]"
+        * - "[ctrl-alt-x]"
+        * - "[ctrl-x]"
+        *
+        * The accesskey is matched in group $6.
+        *
+        * Will probably not work for browsers implementing the accessKeyLabel property.
+        *
+        * @property {RegExp} tooltipAccessKeyRegexp
+        * @deprecated since 1.24 Use the module jquery.accessKeyLabel instead.
+        */
+       mw.log.deprecate( util, 'tooltipAccessKeyRegexp', /\[(ctrl-)?(option-)?(alt-)?(shift-)?(esc-)?(.)\]$/, 'Use jquery.accessKeyLabel instead.' );
+
+       /**
+        * Add a little box at the top of the screen to inform the user of
+        * something, replacing any previous message.
+        * Calling with no arguments, with an empty string or null will hide the message
+        *
+        * @method jsMessage
+        * @deprecated since 1.20 Use mw#notify
+        * @param {Mixed} message The DOM-element, jQuery object or HTML-string to be put inside the message box.
+        *  to allow CSS/JS to hide different boxes. null = no class used.
+        */
+       mw.log.deprecate( util, 'jsMessage', 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 mw.notify instead.' );
+
        mw.util = util;
 
 }( mediaWiki, jQuery ) );
index 967fd9f..3ab8af2 100644 (file)
@@ -1,17 +1,11 @@
 */
-!cologneblue/
-!cologneblue/*
 !common/
 !common/*
-!modern/
-!modern/*
 !monobook/
 !monobook/*
 !vector/
 !vector/*
 
 *.php
-!CologneBlue.php
-!Modern.php
 !MonoBook.php
 !Vector.php
diff --git a/skins/CologneBlue.php b/skins/CologneBlue.php
deleted file mode 100644 (file)
index 3b53468..0000000
+++ /dev/null
@@ -1,575 +0,0 @@
-<?php
-/**
- * Cologne Blue: A nicer-looking alternative to Standard.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @todo document
- * @file
- * @ingroup Skins
- */
-
-if ( !defined( 'MEDIAWIKI' ) ) {
-       die( -1 );
-}
-
-/**
- * @todo document
- * @ingroup Skins
- */
-class SkinCologneBlue extends SkinTemplate {
-       var $skinname = 'cologneblue', $stylename = 'cologneblue',
-               $template = 'CologneBlueTemplate';
-       var $useHeadElement = true;
-
-       /**
-        * @param OutputPage $out
-        */
-       function setupSkinUserCss( OutputPage $out ) {
-               parent::setupSkinUserCss( $out );
-               $out->addModuleStyles( 'mediawiki.legacy.oldshared' );
-               $out->addModuleStyles( 'skins.cologneblue' );
-       }
-
-       /**
-        * Override langlink formatting behavior not to uppercase the language names.
-        * See otherLanguages() in CologneBlueTemplate.
-        * @param string $name
-        * @return string
-        */
-       function formatLanguageName( $name ) {
-               return $name;
-       }
-}
-
-class CologneBlueTemplate extends BaseTemplate {
-       function execute() {
-               // Suppress warnings to prevent notices about missing indexes in $this->data
-               wfSuppressWarnings();
-               $this->html( 'headelement' );
-               echo $this->beforeContent();
-               $this->html( 'bodytext' );
-               echo "\n";
-               echo $this->afterContent();
-               $this->html( 'dataAfterContent' );
-               $this->printTrail();
-               echo "\n</body></html>";
-               wfRestoreWarnings();
-       }
-
-       /**
-        * Language/charset variant links for classic-style skins
-        * @return string
-        */
-       function variantLinks() {
-               $s = array();
-
-               $variants = $this->data['content_navigation']['variants'];
-
-               foreach ( $variants as $key => $link ) {
-                       $s[] = $this->makeListItem( $key, $link, array( 'tag' => 'span' ) );
-               }
-
-               return $this->getSkin()->getLanguage()->pipeList( $s );
-       }
-
-       function otherLanguages() {
-               global $wgHideInterlanguageLinks;
-               if ( $wgHideInterlanguageLinks ) {
-                       return "";
-               }
-
-               $html = '';
-
-               // We override SkinTemplate->formatLanguageName() in SkinCologneBlue
-               // not to capitalize the language names.
-               $language_urls = $this->data['language_urls'];
-               if ( !empty( $language_urls ) ) {
-                       $s = array();
-                       foreach ( $language_urls as $key => $data ) {
-                               $s[] = $this->makeListItem( $key, $data, array( 'tag' => 'span' ) );
-                       }
-
-                       $html = wfMessage( 'otherlanguages' )->text()
-                               . wfMessage( 'colon-separator' )->text()
-                               . $this->getSkin()->getLanguage()->pipeList( $s );
-               }
-
-               $html .= $this->renderAfterPortlet( 'lang' );
-
-               return $html;
-       }
-
-       /**
-        * @param string $name
-        */
-       protected function renderAfterPortlet( $name ) {
-               $content = '';
-               wfRunHooks( 'BaseTemplateAfterPortlet', array( $this, $name, &$content ) );
-
-               $html = $content !== '' ? "<div class='after-portlet after-portlet-$name'>$content</div>" : '';
-
-               return $html;
-       }
-
-       function pageTitleLinks() {
-               $s = array();
-               $footlinks = $this->getFooterLinks();
-
-               foreach ( $footlinks['places'] as $item ) {
-                       $s[] = $this->data[$item];
-               }
-
-               return $this->getSkin()->getLanguage()->pipeList( $s );
-       }
-
-       /**
-        * Used in bottomLinks() to eliminate repetitive code.
-        *
-        * @param string $key Key to be passed to makeListItem()
-        * @param array $navlink Navlink suitable for processNavlinkForDocument()
-        * @param string $message Key of the message to use in place of standard text
-        *
-        * @return string
-        */
-       function processBottomLink( $key, $navlink, $message = null ) {
-               if ( !$navlink ) {
-                       // Empty navlinks might be passed.
-                       return null;
-               }
-
-               if ( $message ) {
-                       $navlink['text'] = wfMessage( $message )->escaped();
-               }
-
-               return $this->makeListItem( $key, $this->processNavlinkForDocument( $navlink ), array( 'tag' => 'span' ) );
-       }
-
-       function bottomLinks() {
-               $toolbox = $this->getToolbox();
-               $content_nav = $this->data['content_navigation'];
-
-               $lines = array();
-
-               if ( $this->getSkin()->getOutput()->isArticleRelated() ) {
-                       // First row. Regular actions.
-                       $element = array();
-
-                       $editLinkMessage = $this->getSkin()->getTitle()->exists() ? 'editthispage' : 'create-this-page';
-                       $element[] = $this->processBottomLink( 'edit', $content_nav['views']['edit'], $editLinkMessage );
-                       $element[] = $this->processBottomLink( 'viewsource', $content_nav['views']['viewsource'], 'viewsource' );
-
-                       $element[] = $this->processBottomLink( 'watch', $content_nav['actions']['watch'], 'watchthispage' );
-                       $element[] = $this->processBottomLink( 'unwatch', $content_nav['actions']['unwatch'], 'unwatchthispage' );
-
-                       $element[] = $this->talkLink();
-
-                       $element[] = $this->processBottomLink( 'history', $content_nav['views']['history'], 'history' );
-                       $element[] = $this->processBottomLink( 'info', $toolbox['info'] );
-                       $element[] = $this->processBottomLink( 'whatlinkshere', $toolbox['whatlinkshere'] );
-                       $element[] = $this->processBottomLink( 'recentchangeslinked', $toolbox['recentchangeslinked'] );
-
-                       $element[] = $this->processBottomLink( 'contributions', $toolbox['contributions'] );
-                       $element[] = $this->processBottomLink( 'emailuser', $toolbox['emailuser'] );
-
-                       $lines[] = $this->getSkin()->getLanguage()->pipeList( array_filter( $element ) );
-
-                       // Second row. Privileged actions.
-                       $element = array();
-
-                       $element[] = $this->processBottomLink( 'delete', $content_nav['actions']['delete'], 'deletethispage' );
-                       $element[] = $this->processBottomLink( 'undelete', $content_nav['actions']['undelete'], 'undeletethispage' );
-
-                       $element[] = $this->processBottomLink( 'protect', $content_nav['actions']['protect'], 'protectthispage' );
-                       $element[] = $this->processBottomLink( 'unprotect', $content_nav['actions']['unprotect'], 'unprotectthispage' );
-
-                       $element[] = $this->processBottomLink( 'move', $content_nav['actions']['move'], 'movethispage' );
-
-                       $lines[] = $this->getSkin()->getLanguage()->pipeList( array_filter( $element ) );
-
-                       // Third row. Language links.
-                       $lines[] = $this->otherLanguages();
-               }
-
-               return implode( array_filter( $lines ), "<br />\n" ) . "<br />\n";
-       }
-
-       function talkLink() {
-               $title = $this->getSkin()->getTitle();
-
-               if ( $title->getNamespace() == NS_SPECIAL ) {
-                       // No discussion links for special pages
-                       return "";
-               }
-
-               $companionTitle = $title->isTalkPage() ? $title->getSubjectPage() : $title->getTalkPage();
-               $companionNamespace = $companionTitle->getNamespace();
-
-               // TODO these messages are only be used by CologneBlue,
-               // kill and replace with something more sensibly named?
-               $nsToMessage = array(
-                       NS_MAIN => 'articlepage',
-                       NS_USER => 'userpage',
-                       NS_PROJECT => 'projectpage',
-                       NS_FILE => 'imagepage',
-                       NS_MEDIAWIKI => 'mediawikipage',
-                       NS_TEMPLATE => 'templatepage',
-                       NS_HELP => 'viewhelppage',
-                       NS_CATEGORY => 'categorypage',
-                       NS_FILE => 'imagepage',
-               );
-
-               // Find out the message to use for link text. Use either the array above or,
-               // for non-talk pages, a generic "discuss this" message.
-               // Default is the same as for main namespace.
-               if ( isset( $nsToMessage[$companionNamespace] ) ) {
-                       $message = $nsToMessage[$companionNamespace];
-               } else {
-                       $message = $companionTitle->isTalkPage() ? 'talkpage' : 'articlepage';
-               }
-
-               // Obviously this can't be reasonable and just return the key for talk namespace, only for content ones.
-               // Thus we have to mangle it in exactly the same way SkinTemplate does. (bug 40805)
-               $key = $companionTitle->getNamespaceKey( '' );
-               if ( $companionTitle->isTalkPage() ) {
-                       $key = ( $key == 'main' ? 'talk' : $key . "_talk" );
-               }
-
-               // Use the regular navigational link, but replace its text. Everything else stays unmodified.
-               $namespacesLinks = $this->data['content_navigation']['namespaces'];
-               return $this->processBottomLink( $message, $namespacesLinks[$key], $message );
-       }
-
-       /**
-        * Takes a navigational link generated by SkinTemplate in whichever way
-        * and mangles attributes unsuitable for repeated use. In particular, this modifies the ids
-        * and removes the accesskeys. This is necessary to be able to use the same navlink twice,
-        * e.g. in sidebar and in footer.
-        *
-        * @param array $navlink Navigational link generated by SkinTemplate
-        * @param mixed $idPrefix Prefix to add to id of this navlink. If false, id is removed entirely. Default is 'cb-'.
-        */
-       function processNavlinkForDocument( $navlink, $idPrefix = 'cb-' ) {
-               if ( $navlink['id'] ) {
-                       $navlink['single-id'] = $navlink['id']; // to allow for tooltip generation
-                       $navlink['tooltiponly'] = true; // but no accesskeys
-
-                       // mangle or remove the id
-                       if ( $idPrefix === false ) {
-                               unset( $navlink['id'] );
-                       } else {
-                               $navlink['id'] = $idPrefix . $navlink['id'];
-                       }
-               }
-
-               return $navlink;
-       }
-
-       /**
-        * @return string
-        */
-       function beforeContent() {
-               ob_start();
-?>
-<div id="content">
-       <div id="topbar">
-               <p id="sitetitle" role="banner">
-                       <a href="<?php echo htmlspecialchars( $this->data['nav_urls']['mainpage']['href'] ) ?>">
-                               <?php echo wfMessage( 'sitetitle' )->escaped() ?>
-                       </a>
-               </p>
-               <p id="sitesub"><?php echo wfMessage( 'sitesubtitle' )->escaped() ?></p>
-               <div id="linkcollection" role="navigation">
-                       <div id="langlinks"><?php echo str_replace( '<br />', '', $this->otherLanguages() ) ?></div>
-                       <?php echo $this->getSkin()->getCategories() ?>
-                       <div id="titlelinks"><?php echo $this->pageTitleLinks() ?></div>
-                       <?php if ( $this->data['newtalk'] ) { ?>
-                       <div class="usermessage"><strong><?php echo $this->data['newtalk'] ?></strong></div>
-                       <?php } ?>
-               </div>
-       </div>
-       <div id="article" class="mw-body" role="main">
-               <?php if ( $this->getSkin()->getSiteNotice() ) { ?>
-               <div id="siteNotice"><?php echo $this->getSkin()->getSiteNotice() ?></div>
-               <?php } ?>
-               <h1 id="firstHeading" lang="<?php
-                       $this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getHtmlCode();
-                       $this->text( 'pageLanguage' );
-               ?>"><span dir="auto"><?php echo $this->data['title'] ?></span></h1>
-               <?php if ( $this->translator->translate( 'tagline' ) ) { ?>
-               <p class="tagline"><?php echo htmlspecialchars( $this->translator->translate( 'tagline' ) ) ?></p>
-               <?php } ?>
-               <?php if ( $this->getSkin()->getOutput()->getSubtitle() ) { ?>
-               <p class="subtitle"><?php echo $this->getSkin()->getOutput()->getSubtitle() ?></p>
-               <?php } ?>
-               <?php if ( $this->getSkin()->subPageSubtitle() ) { ?>
-               <p class="subpages"><?php echo $this->getSkin()->subPageSubtitle() ?></p>
-               <?php } ?>
-<?php
-               $s = ob_get_contents();
-               ob_end_clean();
-
-               return $s;
-       }
-
-       /**
-        * @return string
-        */
-       function afterContent() {
-               ob_start();
-?>
-       </div>
-       <div id="footer">
-               <div id="footer-navigation" role="navigation">
-<?php
-               // Page-related links
-               echo $this->bottomLinks();
-               echo "\n<br />";
-
-               // Footer and second searchbox
-               echo $this->getSkin()->getLanguage()->pipeList( array(
-                       $this->getSkin()->mainPageLink(),
-                       $this->getSkin()->aboutLink(),
-                       $this->searchForm( 'footer' )
-               ) );
-?>
-               </div>
-               <div id="footer-info" role="contentinfo">
-<?php
-               // Standard footer info
-               $footlinks = $this->getFooterLinks();
-               if ( $footlinks['info'] ) {
-                       foreach ( $footlinks['info'] as $item ) {
-                               echo $this->data[$item] . ' ';
-                       }
-               }
-?>
-               </div>
-       </div>
-</div>
-<div id="mw-navigation">
-       <h2><?php echo wfMessage( 'navigation-heading' )->escaped() ?></h2>
-       <div id="toplinks" role="navigation">
-               <p id="syslinks"><?php echo $this->sysLinks() ?></p>
-               <p id="variantlinks"><?php echo $this->variantLinks() ?></p>
-       </div>
-       <?php echo $this->quickBar() ?>
-</div>
-<?php
-               $s = ob_get_contents();
-               ob_end_clean();
-
-               return $s;
-       }
-
-       /**
-        * @return string
-        */
-       function sysLinks() {
-               $s = array(
-                       $this->getSkin()->mainPageLink(),
-                       Linker::linkKnown(
-                               Title::newFromText( wfMessage( 'aboutpage' )->inContentLanguage()->text() ),
-                               wfMessage( 'about' )->text()
-                       ),
-                       Linker::makeExternalLink(
-                               Skin::makeInternalOrExternalUrl( wfMessage( 'helppage' )->inContentLanguage()->text() ),
-                               wfMessage( 'help' )->text(),
-                               false
-                       ),
-                       Linker::linkKnown(
-                               Title::newFromText( wfMessage( 'faqpage' )->inContentLanguage()->text() ),
-                               wfMessage( 'faq' )->text()
-                       ),
-               );
-
-               $personalUrls = $this->getPersonalTools();
-               foreach ( array( 'logout', 'createaccount', 'login' ) as $key ) {
-                       if ( $personalUrls[$key] ) {
-                               $s[] = $this->makeListItem( $key, $personalUrls[$key], array( 'tag' => 'span' ) );
-                       }
-               }
-
-               return $this->getSkin()->getLanguage()->pipeList( $s );
-       }
-
-       /**
-        * Adds CologneBlue-specific items to the sidebar: qbedit, qbpageoptions and qbmyoptions menus.
-        *
-        * @param array $bar Sidebar data
-        * @return array Modified sidebar data
-        */
-       function sidebarAdditions( $bar ) {
-               // "This page" and "Edit" menus
-               // We need to do some massaging here... we reuse all of the items, except for $...['views']['view'],
-               // as $...['namespaces']['main'] and $...['namespaces']['talk'] together serve the same purpose.
-               // We also don't use $...['variants'], these are displayed in the top menu.
-               $content_navigation = $this->data['content_navigation'];
-               $qbpageoptions = array_merge(
-                       $content_navigation['namespaces'],
-                       array(
-                               'history' => $content_navigation['views']['history'],
-                               'watch' => $content_navigation['actions']['watch'],
-                               'unwatch' => $content_navigation['actions']['unwatch'],
-                       )
-               );
-               $content_navigation['actions']['watch'] = null;
-               $content_navigation['actions']['unwatch'] = null;
-               $qbedit = array_merge(
-                       array(
-                               'edit' => $content_navigation['views']['edit'],
-                               'addsection' => $content_navigation['views']['addsection'],
-                       ),
-                       $content_navigation['actions']
-               );
-
-               // Personal tools ("My pages")
-               $qbmyoptions = $this->getPersonalTools();
-               foreach ( array( 'logout', 'createaccount', 'login', ) as $key ) {
-                       $qbmyoptions[$key] = null;
-               }
-
-               // Use the closest reasonable name
-               $bar['cactions'] = $qbedit;
-               $bar['pageoptions'] = $qbpageoptions; // this is a non-standard portlet name, but nothing fits
-               $bar['personal'] = $qbmyoptions;
-
-               return $bar;
-       }
-
-       /**
-        * Compute the sidebar
-        * @access private
-        *
-        * @return string
-        */
-       function quickBar() {
-               // Massage the sidebar. We want to:
-               // * place SEARCH at the beginning
-               // * add new portlets before TOOLBOX (or at the end, if it's missing)
-               // * remove LANGUAGES (langlinks are displayed elsewhere)
-               $orig_bar = $this->data['sidebar'];
-               $bar = array();
-               $hasToolbox = false;
-
-               // Always display search first
-               $bar['SEARCH'] = true;
-               // Copy everything except for langlinks, inserting new items before toolbox
-               foreach ( $orig_bar as $heading => $data ) {
-                       if ( $heading == 'TOOLBOX' ) {
-                               // Insert the stuff
-                               $bar = $this->sidebarAdditions( $bar );
-                               $hasToolbox = true;
-                       }
-
-                       if ( $heading != 'LANGUAGES' ) {
-                               $bar[$heading] = $data;
-                       }
-               }
-               // If toolbox is missing, add our items at the end
-               if ( !$hasToolbox ) {
-                       $bar = $this->sidebarAdditions( $bar );
-               }
-
-               // Fill out special sidebar items with content
-               $orig_bar = $bar;
-               $bar = array();
-               foreach ( $orig_bar as $heading => $data ) {
-                       if ( $heading == 'SEARCH' ) {
-                               $bar['search'] = $this->searchForm( 'sidebar' );
-                       } elseif ( $heading == 'TOOLBOX' ) {
-                               $bar['tb'] = $this->getToolbox();
-                       } else {
-                               $bar[$heading] = $data;
-                       }
-               }
-
-               // Output the sidebar
-               // CologneBlue uses custom messages for some portlets, but we should keep the ids for consistency
-               $idToMessage = array(
-                       'search' => 'qbfind',
-                       'navigation' => 'qbbrowse',
-                       'tb' => 'toolbox',
-                       'cactions' => 'qbedit',
-                       'personal' => 'qbmyoptions',
-                       'pageoptions' => 'qbpageoptions',
-               );
-
-               $s = "<div id='quickbar'>\n";
-
-               foreach ( $bar as $heading => $data ) {
-                       $portletId = Sanitizer::escapeId( "p-$heading" );
-                       $headingMsg = wfMessage( $idToMessage[$heading] ? $idToMessage[$heading] : $heading );
-                       $headingHTML = "<h3>" . ( $headingMsg->exists() ? $headingMsg->escaped() : htmlspecialchars( $heading ) ) . "</h3>";
-                       $listHTML = "";
-
-                       if ( is_array( $data ) ) {
-                               // $data is an array of links
-                               foreach ( $data as $key => $link ) {
-                                       // Can be empty due to how the sidebar additions are done
-                                       if ( $link ) {
-                                               $listHTML .= $this->makeListItem( $key, $link );
-                                       }
-                               }
-                               if ( $listHTML ) {
-                                       $listHTML = "<ul>$listHTML</ul>";
-                               }
-                       } else {
-                               // $data is a HTML <ul>-list string
-                               $listHTML = $data;
-                       }
-
-                       if ( $listHTML ) {
-                               $role = ( $heading == 'search' ) ? 'search' : 'navigation';
-                               $s .= "<div class=\"portlet\" id=\"$portletId\" role=\"$role\">\n$headingHTML\n$listHTML\n</div>\n";
-                       }
-
-                       $s .= $this->renderAfterPortlet( $heading );
-               }
-
-               $s .= "</div>\n";
-               return $s;
-       }
-
-       /**
-        * @param string $label
-        * @return string
-        */
-       function searchForm( $which ) {
-               global $wgUseTwoButtonsSearchForm;
-
-               $search = $this->getSkin()->getRequest()->getText( 'search' );
-               $action = $this->data['searchaction'];
-               $s = "<form id=\"searchform-" . htmlspecialchars( $which ) . "\" method=\"get\" class=\"inline\" action=\"$action\">";
-               if ( $which == 'footer' ) {
-                       $s .= wfMessage( 'qbfind' )->text() . ": ";
-               }
-
-               $s .= $this->makeSearchInput( array( 'class' => 'mw-searchInput', 'type' => 'text', 'size' => '14' ) );
-               $s .= ( $which == 'footer' ? " " : "<br />" );
-               $s .= $this->makeSearchButton( 'go', array( 'class' => 'searchButton' ) );
-
-               if ( $wgUseTwoButtonsSearchForm ) {
-                       $s .= $this->makeSearchButton( 'fulltext', array( 'class' => 'searchButton' ) );
-               } else {
-                       $s .= '<div><a href="' . $action . '" rel="search">' . wfMessage( 'powersearch-legend' )->escaped() . "</a></div>\n";
-               }
-
-               $s .= '</form>';
-
-               return $s;
-       }
-}
diff --git a/skins/Modern.php b/skins/Modern.php
deleted file mode 100644 (file)
index 81c0f51..0000000
+++ /dev/null
@@ -1,169 +0,0 @@
-<?php
-/**
- * Modern skin, derived from monobook template.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @todo document
- * @file
- * @ingroup Skins
- */
-
-if ( !defined( 'MEDIAWIKI' ) ) {
-       die( -1 );
-}
-
-/**
- * Inherit main code from SkinTemplate, set the CSS and template filter.
- * @todo document
- * @ingroup Skins
- */
-class SkinModern extends SkinTemplate {
-       var $skinname = 'modern', $stylename = 'modern',
-               $template = 'ModernTemplate', $useHeadElement = true;
-
-       /**
-        * @param OutputPage $out
-        */
-       function setupSkinUserCss( OutputPage $out ) {
-               parent::setupSkinUserCss( $out );
-               $out->addModuleStyles( 'skins.modern' );
-       }
-}
-
-/**
- * @todo document
- * @ingroup Skins
- */
-class ModernTemplate extends MonoBookTemplate {
-
-       /**
-        * Template filter callback for Modern skin.
-        * Takes an associative array of data set from a SkinTemplate-based
-        * class, and a wrapper for MediaWiki's localization database, and
-        * outputs a formatted page.
-        *
-        * @access private
-        */
-       function execute() {
-               // Suppress warnings to prevent notices about missing indexes in $this->data
-               wfSuppressWarnings();
-
-               $this->html( 'headelement' );
-?>
-
-       <!-- heading -->
-       <div id="mw_header"><h1 id="firstHeading" lang="<?php
-               $this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getHtmlCode();
-               $this->text( 'pageLanguage' );
-       ?>"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1></div>
-
-       <div id="mw_main">
-       <div id="mw_contentwrapper">
-       <!-- navigation portlet -->
-<?php $this->cactions(); ?>
-
-       <!-- content -->
-       <div id="mw_content" role="main">
-       <!-- contentholder does nothing by default, but it allows users to style the text inside
-            the content area without affecting the meaning of 'em' in #mw_content, which is used
-            for the margins -->
-       <div id="mw_contentholder" class="mw-body">
-               <div class='mw-topboxes'>
-                       <div id="mw-js-message" style="display:none;"<?php $this->html( 'userlangattributes' ) ?>></div>
-                       <div class="mw-topbox" id="siteSub"><?php $this->msg( 'tagline' ) ?></div>
-                       <?php if ( $this->data['newtalk'] ) {
-                               ?><div class="usermessage mw-topbox"><?php $this->html( 'newtalk' ) ?></div>
-                       <?php } ?>
-                       <?php if ( $this->data['sitenotice'] ) {
-                               ?><div class="mw-topbox" id="siteNotice"><?php $this->html( 'sitenotice' ) ?></div>
-                       <?php } ?>
-               </div>
-
-               <div id="contentSub"<?php $this->html( 'userlangattributes' ) ?>><?php $this->html( 'subtitle' ) ?></div>
-
-               <?php if ( $this->data['undelete'] ) { ?><div id="contentSub2"><?php $this->html( 'undelete' ) ?></div><?php } ?>
-               <div id="jump-to-nav"><?php $this->msg( 'jumpto' ) ?> <a href="#mw_portlets"><?php $this->msg( 'jumptonavigation' ) ?></a><?php $this->msg( 'comma-separator' ) ?><a href="#searchInput"><?php $this->msg( 'jumptosearch' ) ?></a></div>
-
-               <?php $this->html( 'bodytext' ) ?>
-               <div class='mw_clear'></div>
-               <?php if ( $this->data['catlinks'] ) { $this->html( 'catlinks' ); } ?>
-               <?php $this->html( 'dataAfterContent' ) ?>
-       </div><!-- mw_contentholder -->
-       </div><!-- mw_content -->
-       </div><!-- mw_contentwrapper -->
-
-       <div id="mw_portlets"<?php $this->html( "userlangattributes" ) ?>>
-       <h2><?php $this->msg( 'navigation-heading' ) ?></h2>
-
-       <!-- portlets -->
-       <?php $this->renderPortals( $this->data['sidebar'] ); ?>
-
-       </div><!-- mw_portlets -->
-
-
-       </div><!-- main -->
-
-       <div class="mw_clear"></div>
-
-       <!-- personal portlet -->
-       <div class="portlet" id="p-personal" role="navigation">
-               <h3><?php $this->msg( 'personaltools' ) ?></h3>
-               <div class="pBody">
-                       <ul>
-<?php          foreach ( $this->getPersonalTools() as $key => $item ) { ?>
-                               <?php echo $this->makeListItem( $key, $item ); ?>
-
-<?php          } ?>
-                       </ul>
-               </div>
-       </div>
-
-
-       <!-- footer -->
-       <div id="footer" role="contentinfo"<?php $this->html( 'userlangattributes' ) ?>>
-                       <ul id="f-list">
-<?php
-               foreach ( $this->getFooterLinks( "flat" ) as $aLink ) {
-                       if ( isset( $this->data[$aLink] ) && $this->data[$aLink] ) {
-?>                             <li id="<?php echo $aLink ?>"><?php $this->html( $aLink ) ?></li>
-<?php          }
-               }
-?>
-                       </ul>
-<?php
-               foreach ( $this->getFooterIcons( "nocopyright" ) as $blockName => $footerIcons ) { ?>
-                       <div id="mw_<?php echo htmlspecialchars( $blockName ); ?>">
-<?php
-                       foreach ( $footerIcons as $icon ) { ?>
-                               <?php echo $this->getSkin()->makeFooterIcon( $icon, 'withoutImage' ); ?>
-
-<?php
-                       } ?>
-                       </div>
-<?php
-               }
-?>
-       </div>
-
-       <?php $this->printTrail(); ?>
-</body></html>
-<?php
-       wfRestoreWarnings();
-       } // end of execute() method
-} // end of class
-
-
index fe6a25f..72056b9 100644 (file)
@@ -36,8 +36,10 @@ if ( !defined( 'MEDIAWIKI' ) ) {
  */
 class SkinMonoBook extends SkinTemplate {
        /** Using monobook. */
-       var $skinname = 'monobook', $stylename = 'monobook',
-               $template = 'MonoBookTemplate', $useHeadElement = true;
+       public $skinname = 'monobook';
+       public $stylename = 'monobook';
+       public $template = 'MonoBookTemplate';
+       public $useHeadElement = true;
 
        /**
         * @param OutputPage $out
@@ -45,12 +47,11 @@ class SkinMonoBook extends SkinTemplate {
        function setupSkinUserCss( OutputPage $out ) {
                parent::setupSkinUserCss( $out );
 
-               $out->addModuleStyles( array( 'skins.common.interface', 'skins.monobook.styles' ) );
+               $out->addModuleStyles( array( 'mediawiki.skinning.interface', 'skins.monobook.styles' ) );
 
                // TODO: Migrate all of these
                $out->addStyle( 'monobook/IE60Fixes.css', 'screen', 'IE 6' );
                $out->addStyle( 'monobook/IE70Fixes.css', 'screen', 'IE 7' );
-
        }
 }
 
@@ -73,96 +74,144 @@ class MonoBookTemplate extends BaseTemplate {
                wfSuppressWarnings();
 
                $this->html( 'headelement' );
-?><div id="globalWrapper">
-<div id="column-content"><div id="content" class="mw-body-primary" role="main">
-       <a id="top"></a>
-       <?php if ( $this->data['sitenotice'] ) { ?><div id="siteNotice"><?php $this->html( 'sitenotice' ) ?></div><?php } ?>
-
-       <h1 id="firstHeading" class="firstHeading" lang="<?php
-               $this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getHtmlCode();
-               $this->text( 'pageLanguage' );
-       ?>"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1>
-       <div id="bodyContent" class="mw-body">
-               <div id="siteSub"><?php $this->msg( 'tagline' ) ?></div>
-               <div id="contentSub"<?php $this->html( 'userlangattributes' ) ?>><?php $this->html( 'subtitle' ) ?></div>
-<?php if ( $this->data['undelete'] ) { ?>
-               <div id="contentSub2"><?php $this->html( 'undelete' ) ?></div>
-<?php } ?><?php if ( $this->data['newtalk'] ) { ?>
-               <div class="usermessage"><?php $this->html( 'newtalk' ) ?></div>
-<?php } ?>
-               <div id="jump-to-nav" class="mw-jump"><?php $this->msg( 'jumpto' ) ?> <a href="#column-one"><?php $this->msg( 'jumptonavigation' ) ?></a><?php $this->msg( 'comma-separator' ) ?><a href="#searchInput"><?php $this->msg( 'jumptosearch' ) ?></a></div>
-
-               <!-- start content -->
-<?php $this->html( 'bodytext' ) ?>
-               <?php if ( $this->data['catlinks'] ) { $this->html( 'catlinks' ); } ?>
-               <!-- end content -->
-               <?php if ( $this->data['dataAfterContent'] ) { $this->html( 'dataAfterContent' ); } ?>
-               <div class="visualClear"></div>
-       </div>
-</div></div>
-<div id="column-one"<?php $this->html( 'userlangattributes' ) ?>>
-       <h2><?php $this->msg( 'navigation-heading' ) ?></h2>
-<?php $this->cactions(); ?>
-       <div class="portlet" id="p-personal" role="navigation">
-               <h3><?php $this->msg( 'personaltools' ) ?></h3>
-               <div class="pBody">
-                       <ul<?php $this->html( 'userlangattributes' ) ?>>
-<?php          foreach ( $this->getPersonalTools() as $key => $item ) { ?>
-                               <?php echo $this->makeListItem( $key, $item ); ?>
-
-<?php          } ?>
-                       </ul>
+               ?><div id="globalWrapper">
+               <div id="column-content">
+                       <div id="content" class="mw-body-primary" role="main">
+                               <a id="top"></a>
+                               <?php
+                               if ( $this->data['sitenotice'] ) {
+                                       ?>
+                                       <div id="siteNotice"><?php
+                                       $this->html( 'sitenotice' )
+                                       ?></div><?php
+                               }
+                               ?>
+
+                               <h1 id="firstHeading" class="firstHeading" lang="<?php
+                               $this->data['pageLanguage'] =
+                                       $this->getSkin()->getTitle()->getPageViewLanguage()->getHtmlCode();
+                               $this->text( 'pageLanguage' );
+                               ?>"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1>
+
+                               <div id="bodyContent" class="mw-body">
+                                       <div id="siteSub"><?php $this->msg( 'tagline' ) ?></div>
+                                       <div id="contentSub"<?php
+                                       $this->html( 'userlangattributes' ) ?>><?php $this->html( 'subtitle' )
+                                               ?></div>
+                                       <?php if ( $this->data['undelete'] ) { ?>
+                                               <div id="contentSub2"><?php $this->html( 'undelete' ) ?></div>
+                                       <?php
+}
+                                       ?><?php
+                                       if ( $this->data['newtalk'] ) {
+                                               ?>
+                                               <div class="usermessage"><?php $this->html( 'newtalk' ) ?></div>
+                                       <?php
+                                       }
+                                       ?>
+                                       <div id="jump-to-nav" class="mw-jump"><?php
+                                               $this->msg( 'jumpto' )
+                                               ?> <a href="#column-one"><?php
+                                                       $this->msg( 'jumptonavigation' )
+                                                       ?></a><?php
+                                               $this->msg( 'comma-separator' )
+                                               ?><a href="#searchInput"><?php
+                                                       $this->msg( 'jumptosearch' )
+                                                       ?></a></div>
+
+                                       <!-- start content -->
+                                       <?php $this->html( 'bodytext' ) ?>
+                                       <?php
+                                       if ( $this->data['catlinks'] ) {
+                                               $this->html( 'catlinks' );
+                                       }
+                                       ?>
+                                       <!-- end content -->
+                                       <?php
+                                       if ( $this->data['dataAfterContent'] ) {
+                                               $this->html( 'dataAfterContent'
+                                               );
+                                       }
+                                       ?>
+                                       <div class="visualClear"></div>
+                               </div>
+                       </div>
                </div>
-       </div>
-       <div class="portlet" id="p-logo" role="banner">
-<?php
-                       echo Html::element( 'a', array(
-                               'href' => $this->data['nav_urls']['mainpage']['href'],
-                               'style' => "background-image: url({$this->data['logopath']});" )
-                               + Linker::tooltipAndAccesskeyAttribs( 'p-logo' ) ); ?>
-
-       </div>
-<?php
-       $this->renderPortals( $this->data['sidebar'] );
-?>
-</div><!-- end of the left (by default at least) column -->
-<div class="visualClear"></div>
-<?php
-       $validFooterIcons = $this->getFooterIcons( "icononly" );
-       $validFooterLinks = $this->getFooterLinks( "flat" ); // Additional footer links
+               <div id="column-one"<?php $this->html( 'userlangattributes' ) ?>>
+                       <h2><?php $this->msg( 'navigation-heading' ) ?></h2>
+                       <?php $this->cactions(); ?>
+                       <div class="portlet" id="p-personal" role="navigation">
+                               <h3><?php $this->msg( 'personaltools' ) ?></h3>
+
+                               <div class="pBody">
+                                       <ul<?php $this->html( 'userlangattributes' ) ?>>
+                                               <?php foreach ( $this->getPersonalTools() as $key => $item ) { ?>
+                                                       <?php echo $this->makeListItem( $key, $item ); ?>
+
+                                               <?php
+}
+                                               ?>
+                                       </ul>
+                               </div>
+                       </div>
+                       <div class="portlet" id="p-logo" role="banner">
+                               <?php
+                               echo Html::element( 'a', array(
+                                               'href' => $this->data['nav_urls']['mainpage']['href'],
+                                               'style' => "background-image: url({$this->data['logopath']});" )
+                                       + Linker::tooltipAndAccesskeyAttribs( 'p-logo' ) ); ?>
+
+                       </div>
+                       <?php
+                       $this->renderPortals( $this->data['sidebar'] );
+                       ?>
+               </div><!-- end of the left (by default at least) column -->
+               <div class="visualClear"></div>
+               <?php
+               $validFooterIcons = $this->getFooterIcons( "icononly" );
+               $validFooterLinks = $this->getFooterLinks( "flat" ); // Additional footer links
+
+               if ( count( $validFooterIcons ) + count( $validFooterLinks ) > 0 ) {
+                       ?>
+                       <div id="footer" role="contentinfo"<?php $this->html( 'userlangattributes' ) ?>>
+                       <?php
+                       $footerEnd = '</div>';
+               } else {
+                       $footerEnd = '';
+               }
 
-       if ( count( $validFooterIcons ) + count( $validFooterLinks ) > 0 ) { ?>
-<div id="footer" role="contentinfo"<?php $this->html( 'userlangattributes' ) ?>>
-<?php
-               $footerEnd = '</div>';
-       } else {
-               $footerEnd = '';
-       }
-       foreach ( $validFooterIcons as $blockName => $footerIcons ) { ?>
-       <div id="f-<?php echo htmlspecialchars( $blockName ); ?>ico">
-<?php foreach ( $footerIcons as $icon ) { ?>
-               <?php echo $this->getSkin()->makeFooterIcon( $icon ); ?>
+               foreach ( $validFooterIcons as $blockName => $footerIcons ) {
+                       ?>
+                       <div id="f-<?php echo htmlspecialchars( $blockName ); ?>ico">
+                               <?php foreach ( $footerIcons as $icon ) { ?>
+                                       <?php echo $this->getSkin()->makeFooterIcon( $icon ); ?>
 
-<?php }
-?>
-       </div>
-<?php }
+                               <?php
+}
+                               ?>
+                       </div>
+               <?php
+               }
 
                if ( count( $validFooterLinks ) > 0 ) {
-?>     <ul id="f-list">
-<?php
-                       foreach ( $validFooterLinks as $aLink ) { ?>
-               <li id="<?php echo $aLink ?>"><?php $this->html( $aLink ) ?></li>
-<?php
-                       }
-?>
-       </ul>
-<?php  }
-echo $footerEnd;
-?>
+                       ?>
+                       <ul id="f-list">
+                               <?php
+                               foreach ( $validFooterLinks as $aLink ) {
+                                       ?>
+                                       <li id="<?php echo $aLink ?>"><?php $this->html( $aLink ) ?></li>
+                               <?php
+                               }
+                               ?>
+                       </ul>
+               <?php
+               }
 
-</div>
-<?php
+               echo $footerEnd;
+               ?>
+
+               </div>
+               <?php
                $this->printTrail();
                echo Html::closeElement( 'body' );
                echo Html::closeElement( 'html' );
@@ -204,28 +253,41 @@ echo $footerEnd;
 
        function searchBox() {
                global $wgUseTwoButtonsSearchForm;
-?>
-       <div id="p-search" class="portlet" role="search">
-               <h3><label for="searchInput"><?php $this->msg( 'search' ) ?></label></h3>
-               <div id="searchBody" class="pBody">
-                       <form action="<?php $this->text( 'wgScript' ) ?>" id="searchform">
-                               <input type='hidden' name="title" value="<?php $this->text( 'searchtitle' ) ?>"/>
-                               <?php echo $this->makeSearchInput( array( "id" => "searchInput" ) ); ?>
-
-                               <?php echo $this->makeSearchButton( "go", array( "id" => "searchGoButton", "class" => "searchButton" ) );
-                               if ( $wgUseTwoButtonsSearchForm ) { ?>&#160;
-                               <?php echo $this->makeSearchButton( "fulltext", array( "id" => "mw-searchButton", "class" => "searchButton" ) );
-                               } else { ?>
-
-                               <div><a href="<?php $this->text( 'searchaction' ) ?>" rel="search"><?php $this->msg( 'powersearch-legend' ) ?></a></div><?php
-                               } ?>
-
-                       </form>
-
-                       <?php $this->renderAfterPortlet( 'search' ); ?>
+               ?>
+               <div id="p-search" class="portlet" role="search">
+                       <h3><label for="searchInput"><?php $this->msg( 'search' ) ?></label></h3>
+
+                       <div id="searchBody" class="pBody">
+                               <form action="<?php $this->text( 'wgScript' ) ?>" id="searchform">
+                                       <input type='hidden' name="title" value="<?php $this->text( 'searchtitle' ) ?>"/>
+                                       <?php echo $this->makeSearchInput( array( "id" => "searchInput" ) ); ?>
+
+                                       <?php
+                                       echo $this->makeSearchButton(
+                                               "go",
+                                               array( "id" => "searchGoButton", "class" => "searchButton" )
+                                       );
+
+                                       if ( $wgUseTwoButtonsSearchForm ) {
+                                               ?>&#160;
+                                               <?php echo $this->makeSearchButton(
+                                                       "fulltext",
+                                                       array( "id" => "mw-searchButton", "class" => "searchButton" )
+                                               );
+                                       } else {
+                                               ?>
+
+                                               <div><a href="<?php
+                                               $this->text( 'searchaction' )
+                                               ?>" rel="search"><?php $this->msg( 'powersearch-legend' ) ?></a></div><?php
+                                       } ?>
+
+                               </form>
+
+                               <?php $this->renderAfterPortlet( 'search' ); ?>
+                       </div>
                </div>
-       </div>
-<?php
+       <?php
        }
 
        /**
@@ -233,63 +295,70 @@ echo $footerEnd;
         * Shared between MonoBook and Modern
         */
        function cactions() {
-?>
-       <div id="p-cactions" class="portlet" role="navigation">
-               <h3><?php $this->msg( 'views' ) ?></h3>
-               <div class="pBody">
-                       <ul><?php
-                               foreach ( $this->data['content_actions'] as $key => $tab ) {
-                                       echo '
+               ?>
+               <div id="p-cactions" class="portlet" role="navigation">
+                       <h3><?php $this->msg( 'views' ) ?></h3>
+
+                       <div class="pBody">
+                               <ul><?php
+                                       foreach ( $this->data['content_actions'] as $key => $tab ) {
+                                               echo '
                                ' . $this->makeListItem( $key, $tab );
-                               } ?>
+                                       } ?>
 
-                       </ul>
-<?php          $this->renderAfterPortlet( 'cactions' ); ?>
+                               </ul>
+                               <?php $this->renderAfterPortlet( 'cactions' ); ?>
+                       </div>
                </div>
-       </div>
-<?php
+       <?php
        }
+
        /*************************************************************************************************/
        function toolbox() {
-?>
-       <div class="portlet" id="p-tb" role="navigation">
-               <h3><?php $this->msg( 'toolbox' ) ?></h3>
-               <div class="pBody">
-                       <ul>
-<?php
-               foreach ( $this->getToolbox() as $key => $tbitem ) { ?>
-                               <?php echo $this->makeListItem( $key, $tbitem ); ?>
-
-<?php
-               }
-               wfRunHooks( 'MonoBookTemplateToolboxEnd', array( &$this ) );
-               wfRunHooks( 'SkinTemplateToolboxEnd', array( &$this, true ) );
-?>
-                       </ul>
-<?php          $this->renderAfterPortlet( 'tb' ); ?>
+               ?>
+               <div class="portlet" id="p-tb" role="navigation">
+                       <h3><?php $this->msg( 'toolbox' ) ?></h3>
+
+                       <div class="pBody">
+                               <ul>
+                                       <?php
+                                       foreach ( $this->getToolbox() as $key => $tbitem ) {
+                                               ?>
+                                               <?php echo $this->makeListItem( $key, $tbitem ); ?>
+
+                                       <?php
+                                       }
+                                       wfRunHooks( 'MonoBookTemplateToolboxEnd', array( &$this ) );
+                                       wfRunHooks( 'SkinTemplateToolboxEnd', array( &$this, true ) );
+                                       ?>
+                               </ul>
+                               <?php $this->renderAfterPortlet( 'tb' ); ?>
+                       </div>
                </div>
-       </div>
-<?php
+       <?php
        }
 
        /*************************************************************************************************/
        function languageBox() {
                if ( $this->data['language_urls'] !== false ) {
-?>
-       <div id="p-lang" class="portlet" role="navigation">
-               <h3<?php $this->html( 'userlangattributes' ) ?>><?php $this->msg( 'otherlanguages' ) ?></h3>
-               <div class="pBody">
-                       <ul>
-<?php          foreach ( $this->data['language_urls'] as $key => $langlink ) { ?>
-                               <?php echo $this->makeListItem( $key, $langlink ); ?>
-
-<?php          } ?>
-                       </ul>
+                       ?>
+                       <div id="p-lang" class="portlet" role="navigation">
+                               <h3<?php $this->html( 'userlangattributes' ) ?>><?php $this->msg( 'otherlanguages' ) ?></h3>
 
-<?php          $this->renderAfterPortlet( 'lang' ); ?>
-               </div>
-       </div>
-<?php
+                               <div class="pBody">
+                                       <ul>
+                                               <?php foreach ( $this->data['language_urls'] as $key => $langlink ) { ?>
+                                                       <?php echo $this->makeListItem( $key, $langlink ); ?>
+
+                                               <?php
+}
+                                               ?>
+                                       </ul>
+
+                                       <?php $this->renderAfterPortlet( 'lang' ); ?>
+                               </div>
+                       </div>
+               <?php
                }
        }
 
@@ -299,34 +368,45 @@ echo $footerEnd;
         * @param array|string $cont
         */
        function customBox( $bar, $cont ) {
-               $portletAttribs = array( 'class' => 'generated-sidebar portlet', 'id' => Sanitizer::escapeId( "p-$bar" ), 'role' => 'navigation' );
+               $portletAttribs = array(
+                       'class' => 'generated-sidebar portlet',
+                       'id' => Sanitizer::escapeId( "p-$bar" ),
+                       'role' => 'navigation'
+               );
+
                $tooltip = Linker::titleAttrib( "p-$bar" );
                if ( $tooltip !== false ) {
                        $portletAttribs['title'] = $tooltip;
                }
                echo '  ' . Html::openElement( 'div', $portletAttribs );
                $msgObj = wfMessage( $bar );
-?>
+               ?>
 
                <h3><?php echo htmlspecialchars( $msgObj->exists() ? $msgObj->text() : $bar ); ?></h3>
                <div class='pBody'>
-<?php   if ( is_array( $cont ) ) { ?>
-                       <ul>
-<?php                  foreach ( $cont as $key => $val ) { ?>
-                               <?php echo $this->makeListItem( $key, $val ); ?>
-
-<?php                  } ?>
-                       </ul>
-<?php   } else {
-                       # allow raw HTML block to be defined by extensions
-                       print $cont;
-               }
+                       <?php
+                       if ( is_array( $cont ) ) {
+                               ?>
+                               <ul>
+                                       <?php
+                                       foreach ( $cont as $key => $val ) {
+                                               ?>
+                                               <?php echo $this->makeListItem( $key, $val ); ?>
+
+                                       <?php
+                                       }
+                                       ?>
+                               </ul>
+                       <?php
+                       } else {
+                               # allow raw HTML block to be defined by extensions
+                               print $cont;
+                       }
 
-               $this->renderAfterPortlet( $bar );
-?>
+                       $this->renderAfterPortlet( $bar );
+                       ?>
                </div>
-       </div>
-<?php
+               </div>
+       <?php
        }
-
 } // end of class
index 8ede82a..35861c2 100644 (file)
@@ -32,12 +32,13 @@ if ( !defined( 'MEDIAWIKI' ) ) {
  * @ingroup Skins
  */
 class SkinVector extends SkinTemplate {
+       public $useHeadElement = true;
+       public $skinname = 'vector';
+       public $stylename = 'vector';
+       public $template = 'VectorTemplate';
 
        protected static $bodyClasses = array( 'vector-animateLayout' );
 
-       var $skinname = 'vector', $stylename = 'vector',
-               $template = 'VectorTemplate', $useHeadElement = true;
-
        /**
         * Initializes output page and sets up skin-specific parameters
         * @param OutputPage $out Object to initialize
@@ -57,7 +58,7 @@ class SkinVector extends SkinTemplate {
                                "/{$this->stylename}/csshover{$min}.htc\")}</style><![endif]-->"
                );
 
-               $out->addModules( array( 'skins.vector.js', 'skins.vector.collapsibleNav' ) );
+               $out->addModules( array( 'skins.vector.js' ) );
        }
 
        /**
@@ -67,7 +68,7 @@ class SkinVector extends SkinTemplate {
        function setupSkinUserCss( OutputPage $out ) {
                parent::setupSkinUserCss( $out );
 
-               $styles = array( 'skins.common.interface', 'skins.vector.styles' );
+               $styles = array( 'mediawiki.skinning.interface', 'skins.vector.styles' );
                wfRunHooks( 'SkinVectorStyleModules', array( $this, &$styles ) );
                $out->addModuleStyles( $styles );
        }
@@ -92,7 +93,6 @@ class SkinVector extends SkinTemplate {
  * @ingroup Skins
  */
 class VectorTemplate extends BaseTemplate {
-
        /* Functions */
 
        /**
@@ -105,7 +105,10 @@ class VectorTemplate extends BaseTemplate {
                $nav = $this->data['content_navigation'];
 
                if ( $wgVectorUseIconWatch ) {
-                       $mode = $this->getSkin()->getUser()->isWatched( $this->getSkin()->getRelevantTitle() ) ? 'unwatch' : 'watch';
+                       $mode = $this->getSkin()->getUser()->isWatched( $this->getSkin()->getRelevantTitle() )
+                               ? 'unwatch'
+                               : 'watch';
+
                        if ( isset( $nav['actions'][$mode] ) ) {
                                $nav['views'][$mode] = $nav['actions'][$mode];
                                $nav['views'][$mode]['class'] = rtrim( 'icon ' . $nav['views'][$mode]['class'], ' ' );
@@ -154,54 +157,95 @@ class VectorTemplate extends BaseTemplate {
                }
                // Output HTML Page
                $this->html( 'headelement' );
-?>
+               ?>
                <div id="mw-page-base" class="noprint"></div>
                <div id="mw-head-base" class="noprint"></div>
                <div id="content" class="mw-body" role="main">
                        <a id="top"></a>
+
                        <div id="mw-js-message" style="display:none;"<?php $this->html( 'userlangattributes' ) ?>></div>
-                       <?php if ( $this->data['sitenotice'] ) { ?>
-                       <div id="siteNotice"><?php $this->html( 'sitenotice' ) ?></div>
-                       <?php } ?>
+                       <?php
+                       if ( $this->data['sitenotice'] ) {
+                               ?>
+                               <div id="siteNotice"><?php $this->html( 'sitenotice' ) ?></div>
+                       <?php
+                       }
+                       ?>
                        <h1 id="firstHeading" class="firstHeading" lang="<?php
-                               $this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getHtmlCode();
-                               $this->text( 'pageLanguage' );
+                       $this->data['pageLanguage'] =
+                               $this->getSkin()->getTitle()->getPageViewLanguage()->getHtmlCode();
+                       $this->text( 'pageLanguage' );
                        ?>"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1>
                        <?php $this->html( 'prebodyhtml' ) ?>
-                       <div id="bodyContent">
-                               <?php if ( $this->data['isarticle'] ) { ?>
-                               <div id="siteSub"><?php $this->msg( 'tagline' ) ?></div>
-                               <?php } ?>
-                               <div id="contentSub"<?php $this->html( 'userlangattributes' ) ?>><?php $this->html( 'subtitle' ) ?></div>
-                               <?php if ( $this->data['undelete'] ) { ?>
-                               <div id="contentSub2"><?php $this->html( 'undelete' ) ?></div>
-                               <?php } ?>
-                               <?php if ( $this->data['newtalk'] ) { ?>
-                               <div class="usermessage"><?php $this->html( 'newtalk' ) ?></div>
-                               <?php } ?>
+                       <div id="bodyContent" class="mw-body-content">
+                               <?php
+                               if ( $this->data['isarticle'] ) {
+                                       ?>
+                                       <div id="siteSub"><?php $this->msg( 'tagline' ) ?></div>
+                               <?php
+                               }
+                               ?>
+                               <div id="contentSub"<?php
+                               $this->html( 'userlangattributes' )
+                               ?>><?php $this->html( 'subtitle' ) ?></div>
+                               <?php
+                               if ( $this->data['undelete'] ) {
+                                       ?>
+                                       <div id="contentSub2"><?php $this->html( 'undelete' ) ?></div>
+                               <?php
+                               }
+                               ?>
+                               <?php
+                               if ( $this->data['newtalk'] ) {
+                                       ?>
+                                       <div class="usermessage"><?php $this->html( 'newtalk' ) ?></div>
+                               <?php
+                               }
+                               ?>
                                <div id="jump-to-nav" class="mw-jump">
                                        <?php $this->msg( 'jumpto' ) ?>
-                                       <a href="#mw-navigation"><?php $this->msg( 'jumptonavigation' ) ?></a><?php $this->msg( 'comma-separator' ) ?>
+                                       <a href="#mw-navigation"><?php
+                                               $this->msg( 'jumptonavigation' )
+                                               ?></a><?php
+                                       $this->msg( 'comma-separator' )
+                                       ?>
                                        <a href="#p-search"><?php $this->msg( 'jumptosearch' ) ?></a>
                                </div>
                                <?php $this->html( 'bodycontent' ) ?>
-                               <?php if ( $this->data['printfooter'] ) { ?>
-                               <div class="printfooter">
-                               <?php $this->html( 'printfooter' ); ?>
-                               </div>
-                               <?php } ?>
-                               <?php if ( $this->data['catlinks'] ) { ?>
-                               <?php $this->html( 'catlinks' ); ?>
-                               <?php } ?>
-                               <?php if ( $this->data['dataAfterContent'] ) { ?>
-                               <?php $this->html( 'dataAfterContent' ); ?>
-                               <?php } ?>
+                               <?php
+                               if ( $this->data['printfooter'] ) {
+                                       ?>
+                                       <div class="printfooter">
+                                               <?php $this->html( 'printfooter' ); ?>
+                                       </div>
+                               <?php
+                               }
+                               ?>
+                               <?php
+                               if ( $this->data['catlinks'] ) {
+                                       ?>
+                                       <?php
+                                       $this->html( 'catlinks' );
+                                       ?>
+                               <?php
+                               }
+                               ?>
+                               <?php
+                               if ( $this->data['dataAfterContent'] ) {
+                                       ?>
+                                       <?php
+                                       $this->html( 'dataAfterContent' );
+                                       ?>
+                               <?php
+                               }
+                               ?>
                                <div class="visualClear"></div>
                                <?php $this->html( 'debughtml' ); ?>
                        </div>
                </div>
                <div id="mw-navigation">
                        <h2><?php $this->msg( 'navigation-heading' ) ?></h2>
+
                        <div id="mw-head">
                                <?php $this->renderNavigation( 'PERSONAL' ); ?>
                                <div id="left-navigation">
@@ -212,38 +256,74 @@ class VectorTemplate extends BaseTemplate {
                                </div>
                        </div>
                        <div id="mw-panel">
-                                       <div id="p-logo" role="banner"><a style="background-image: url(<?php $this->text( 'logopath' ) ?>);" href="<?php echo htmlspecialchars( $this->data['nav_urls']['mainpage']['href'] ) ?>" <?php echo Xml::expandAttributes( Linker::tooltipAndAccesskeyAttribs( 'p-logo' ) ) ?>></a></div>
+                               <div id="p-logo" role="banner"><a style="background-image: url(<?php
+                                       $this->text( 'logopath' )
+                                       ?>);" href="<?php
+                                       echo htmlspecialchars( $this->data['nav_urls']['mainpage']['href'] )
+                                       ?>" <?php
+                                       echo Xml::expandAttributes( Linker::tooltipAndAccesskeyAttribs( 'p-logo' ) )
+                                       ?>></a></div>
                                <?php $this->renderPortals( $this->data['sidebar'] ); ?>
                        </div>
                </div>
                <div id="footer" role="contentinfo"<?php $this->html( 'userlangattributes' ) ?>>
-                       <?php foreach ( $this->getFooterLinks() as $category => $links ) { ?>
-                               <ul id="footer-<?php echo $category ?>">
-                                       <?php foreach ( $links as $link ) { ?>
-                                               <li id="footer-<?php echo $category ?>-<?php echo $link ?>"><?php $this->html( $link ) ?></li>
-                                       <?php } ?>
+                       <?php
+                       foreach ( $this->getFooterLinks() as $category => $links ) {
+                               ?>
+                               <ul id="footer-<?php
+                               echo $category
+                               ?>">
+                                       <?php
+                                       foreach ( $links as $link ) {
+                                               ?>
+                                               <li id="footer-<?php
+                                               echo $category
+                                               ?>-<?php
+                                               echo $link
+                                               ?>"><?php
+                                                       $this->html( $link )
+                                                       ?></li>
+                                       <?php
+                                       }
+                                       ?>
                                </ul>
-                       <?php } ?>
+                       <?php
+                       }
+                       ?>
                        <?php $footericons = $this->getFooterIcons( "icononly" );
-                       if ( count( $footericons ) > 0 ) { ?>
+                       if ( count( $footericons ) > 0 ) {
+                               ?>
                                <ul id="footer-icons" class="noprint">
-<?php                  foreach ( $footericons as $blockName => $footerIcons ) { ?>
-                                       <li id="footer-<?php echo htmlspecialchars( $blockName ); ?>ico">
-<?php                          foreach ( $footerIcons as $icon ) { ?>
-                                               <?php echo $this->getSkin()->makeFooterIcon( $icon ); ?>
-
-<?php                          } ?>
-                                       </li>
-<?php                  } ?>
+                                       <?php
+                                       foreach ( $footericons as $blockName => $footerIcons ) {
+                                               ?>
+                                               <li id="footer-<?php
+                                               echo htmlspecialchars( $blockName ); ?>ico">
+                                                       <?php
+                                                       foreach ( $footerIcons as $icon ) {
+                                                               ?>
+                                                               <?php
+                                                               echo $this->getSkin()->makeFooterIcon( $icon );
+                                                               ?>
+
+                                                       <?php
+                                                       }
+                                                       ?>
+                                               </li>
+                                       <?php
+                                       }
+                                       ?>
                                </ul>
-                       <?php } ?>
+                       <?php
+                       }
+                       ?>
                        <div style="clear:both"></div>
                </div>
                <?php $this->printTrail(); ?>
 
        </body>
 </html>
-<?php
+       <?php
        }
 
        /**
@@ -281,7 +361,7 @@ class VectorTemplate extends BaseTemplate {
                                        break;
                                default:
                                        $this->renderPortal( $name, $content );
-                               break;
+                                       break;
                        }
                }
        }
@@ -298,34 +378,48 @@ class VectorTemplate extends BaseTemplate {
                }
                $msgObj = wfMessage( $msg );
                ?>
-<div class="portal" role="navigation" id='<?php echo Sanitizer::escapeId( "p-$name" ) ?>'<?php echo Linker::tooltip( 'p-' . $name ) ?> aria-labelledby='<?php echo Sanitizer::escapeId( "p-$name-label" ) ?>'>
-       <h3<?php $this->html( 'userlangattributes' ) ?> id='<?php echo Sanitizer::escapeId( "p-$name-label" ) ?>'><?php echo htmlspecialchars( $msgObj->exists() ? $msgObj->text() : $msg ); ?></h3>
-       <div class="body">
-<?php
-               if ( is_array( $content ) ) { ?>
-               <ul>
-<?php
-                       foreach ( $content as $key => $val ) { ?>
-                       <?php echo $this->makeListItem( $key, $val ); ?>
+               <div class="portal" role="navigation" id='<?php
+               echo Sanitizer::escapeId( "p-$name" )
+               ?>'<?php
+               echo Linker::tooltip( 'p-' . $name )
+               ?> aria-labelledby='<?php echo Sanitizer::escapeId( "p-$name-label" ) ?>'>
+                       <h3<?php
+                       $this->html( 'userlangattributes' )
+                       ?> id='<?php
+                       echo Sanitizer::escapeId( "p-$name-label" )
+                       ?>'><?php
+                               echo htmlspecialchars( $msgObj->exists() ? $msgObj->text() : $msg );
+                               ?></h3>
 
-<?php
-                       }
-                       if ( $hook !== null ) {
-                               wfRunHooks( $hook, array( &$this, true ) );
-                       }
-                       ?>
-               </ul>
-<?php
-               } else { ?>
-               <?php
-                       echo $content; /* Allow raw HTML block to be defined by extensions */
-               }
+                       <div class="body">
+                               <?php
+                               if ( is_array( $content ) ) {
+                                       ?>
+                                       <ul>
+                                               <?php
+                                               foreach ( $content as $key => $val ) {
+                                                       ?>
+                                                       <?php echo $this->makeListItem( $key, $val ); ?>
 
-               $this->renderAfterPortlet( $name );
-               ?>
-       </div>
-</div>
-<?php
+                                               <?php
+                                               }
+                                               if ( $hook !== null ) {
+                                                       wfRunHooks( $hook, array( &$this, true ) );
+                                               }
+                                               ?>
+                                       </ul>
+                               <?php
+                               } else {
+                                       ?>
+                                       <?php
+                                       echo $content; /* Allow raw HTML block to be defined by extensions */
+                               }
+
+                               $this->renderAfterPortlet( $name );
+                               ?>
+                       </div>
+               </div>
+       <?php
        }
 
        /**
@@ -341,7 +435,7 @@ class VectorTemplate extends BaseTemplate {
                // flexible arguments
                if ( !is_array( $elements ) ) {
                        $elements = array( $elements );
-               // If there's a series of elements, reverse them when in RTL mode
+                       // If there's a series of elements, reverse them when in RTL mode
                } elseif ( $this->data['rtl'] ) {
                        $elements = array_reverse( $elements );
                }
@@ -349,114 +443,219 @@ class VectorTemplate extends BaseTemplate {
                foreach ( $elements as $name => $element ) {
                        switch ( $element ) {
                                case 'NAMESPACES':
-?>
-<div id="p-namespaces" role="navigation" class="vectorTabs<?php if ( count( $this->data['namespace_urls'] ) == 0 ) { echo ' emptyPortlet'; } ?>" aria-labelledby="p-namespaces-label">
-       <h3 id="p-namespaces-label"><?php $this->msg( 'namespaces' ) ?></h3>
-       <ul<?php $this->html( 'userlangattributes' ) ?>>
-               <?php foreach ( $this->data['namespace_urls'] as $link ) { ?>
-                       <li <?php echo $link['attributes'] ?>><span><a href="<?php echo htmlspecialchars( $link['href'] ) ?>" <?php echo $link['key'] ?>><?php echo htmlspecialchars( $link['text'] ) ?></a></span></li>
-               <?php } ?>
-       </ul>
-</div>
-<?php
-                               break;
+                                       ?>
+                                       <div id="p-namespaces" role="navigation" class="vectorTabs<?php
+                                       if ( count( $this->data['namespace_urls'] ) == 0 ) {
+                                               echo ' emptyPortlet';
+                                       }
+                                       ?>" aria-labelledby="p-namespaces-label">
+                                               <h3 id="p-namespaces-label"><?php $this->msg( 'namespaces' ) ?></h3>
+                                               <ul<?php $this->html( 'userlangattributes' ) ?>>
+                                                       <?php
+                                                       foreach ( $this->data['namespace_urls'] as $link ) {
+                                                               ?>
+                                                               <li <?php
+                                                               echo $link['attributes']
+                                                               ?>><span><a href="<?php
+                                                                               echo htmlspecialchars( $link['href'] )
+                                                                               ?>" <?php
+                                                                               echo $link['key']
+                                                                               ?>><?php
+                                                                                       echo htmlspecialchars( $link['text'] )
+                                                                                       ?></a></span></li>
+                                                       <?php
+                                                       }
+                                                       ?>
+                                               </ul>
+                                       </div>
+                                       <?php
+                                       break;
                                case 'VARIANTS':
-?>
-<div id="p-variants" role="navigation" class="vectorMenu<?php if ( count( $this->data['variant_urls'] ) == 0 ) { echo ' emptyPortlet'; } ?>" aria-labelledby="p-variants-label">
-       <h3 id="mw-vector-current-variant">
-       <?php foreach ( $this->data['variant_urls'] as $link ) { ?>
-               <?php if ( stripos( $link['attributes'], 'selected' ) !== false ) { ?>
-                       <?php echo htmlspecialchars( $link['text'] ) ?>
-               <?php } ?>
-       <?php } ?>
-       </h3>
-       <h3 id="p-variants-label"><span><?php $this->msg( 'variants' ) ?></span><a href="#"></a></h3>
-       <div class="menu">
-               <ul>
-                       <?php foreach ( $this->data['variant_urls'] as $link ) { ?>
-                               <li<?php echo $link['attributes'] ?>><a href="<?php echo htmlspecialchars( $link['href'] ) ?>" lang="<?php echo htmlspecialchars( $link['lang'] ) ?>" hreflang="<?php echo htmlspecialchars( $link['hreflang'] ) ?>" <?php echo $link['key'] ?>><?php echo htmlspecialchars( $link['text'] ) ?></a></li>
-                       <?php } ?>
-               </ul>
-       </div>
-</div>
-<?php
-                               break;
+                                       ?>
+                                       <div id="p-variants" role="navigation" class="vectorMenu<?php
+                                       if ( count( $this->data['variant_urls'] ) == 0 ) {
+                                               echo ' emptyPortlet';
+                                       }
+                                       ?>" aria-labelledby="p-variants-label">
+                                               <h3 id="mw-vector-current-variant">
+                                                       <?php
+                                                       foreach ( $this->data['variant_urls'] as $link ) {
+                                                               ?>
+                                                               <?php
+                                                               if ( stripos( $link['attributes'], 'selected' ) !== false ) {
+                                                                       ?>
+                                                                       <?php
+                                                                       echo htmlspecialchars( $link['text'] )
+                                                                       ?>
+                                                               <?php
+                                                               }
+                                                               ?>
+                                                       <?php
+                                                       }
+                                                       ?>
+                                               </h3>
+
+                                               <h3 id="p-variants-label"><span><?php $this->msg( 'variants' ) ?></span><a href="#"></a></h3>
+
+                                               <div class="menu">
+                                                       <ul>
+                                                               <?php
+                                                               foreach ( $this->data['variant_urls'] as $link ) {
+                                                                       ?>
+                                                                       <li<?php
+                                                                       echo $link['attributes']
+                                                                       ?>><a href="<?php
+                                                                               echo htmlspecialchars( $link['href'] )
+                                                                               ?>" lang="<?php
+                                                                               echo htmlspecialchars( $link['lang'] )
+                                                                               ?>" hreflang="<?php
+                                                                               echo htmlspecialchars( $link['hreflang'] )
+                                                                               ?>" <?php
+                                                                               echo $link['key']
+                                                                               ?>><?php
+                                                                                       echo htmlspecialchars( $link['text'] )
+                                                                                       ?></a></li>
+                                                               <?php
+                                                               }
+                                                               ?>
+                                                       </ul>
+                                               </div>
+                                       </div>
+                                       <?php
+                                       break;
                                case 'VIEWS':
-?>
-<div id="p-views" role="navigation" class="vectorTabs<?php if ( count( $this->data['view_urls'] ) == 0 ) { echo ' emptyPortlet'; } ?>" aria-labelledby="p-views-label">
-       <h3 id="p-views-label"><?php $this->msg( 'views' ) ?></h3>
-       <ul<?php $this->html( 'userlangattributes' ) ?>>
-               <?php foreach ( $this->data['view_urls'] as $link ) { ?>
-                       <li<?php echo $link['attributes'] ?>><span><a href="<?php echo htmlspecialchars( $link['href'] ) ?>" <?php echo $link['key'] ?>><?php
-                               // $link['text'] can be undefined - bug 27764
-                               if ( array_key_exists( 'text', $link ) ) {
-                                       echo array_key_exists( 'img', $link ) ? '<img src="' . $link['img'] . '" alt="' . $link['text'] . '" />' : htmlspecialchars( $link['text'] );
-                               }
-                               ?></a></span></li>
-               <?php } ?>
-       </ul>
-</div>
-<?php
-                               break;
+                                       ?>
+                                       <div id="p-views" role="navigation" class="vectorTabs<?php
+                                       if ( count( $this->data['view_urls'] ) == 0 ) {
+                                               echo ' emptyPortlet';
+                                       }
+                                       ?>" aria-labelledby="p-views-label">
+                                               <h3 id="p-views-label"><?php $this->msg( 'views' ) ?></h3>
+                                               <ul<?php
+                                               $this->html( 'userlangattributes' )
+                                               ?>>
+                                                       <?php
+                                                       foreach ( $this->data['view_urls'] as $link ) {
+                                                               ?>
+                                                               <li<?php
+                                                               echo $link['attributes']
+                                                               ?>><span><a href="<?php
+                                                                               echo htmlspecialchars( $link['href'] )
+                                                                               ?>" <?php
+                                                                               echo $link['key']
+                                                                               ?>><?php
+                                                                                       // $link['text'] can be undefined - bug 27764
+                                                                                       if ( array_key_exists( 'text', $link ) ) {
+                                                                                               echo array_key_exists( 'img', $link )
+                                                                                                       ? '<img src="' . $link['img'] . '" alt="' . $link['text'] . '" />'
+                                                                                                       : htmlspecialchars( $link['text'] );
+                                                                                       }
+                                                                                       ?></a></span></li>
+                                                       <?php
+                                                       }
+                                                       ?>
+                                               </ul>
+                                       </div>
+                                       <?php
+                                       break;
                                case 'ACTIONS':
-?>
-<div id="p-cactions" role="navigation" class="vectorMenu<?php if ( count( $this->data['action_urls'] ) == 0 ) { echo ' emptyPortlet'; } ?>" aria-labelledby="p-cactions-label">
-       <h3 id="p-cactions-label"><span><?php $this->msg( 'actions' ) ?></span><a href="#"></a></h3>
-       <div class="menu">
-               <ul<?php $this->html( 'userlangattributes' ) ?>>
-                       <?php foreach ( $this->data['action_urls'] as $link ) { ?>
-                               <li<?php echo $link['attributes'] ?>><a href="<?php echo htmlspecialchars( $link['href'] ) ?>" <?php echo $link['key'] ?>><?php echo htmlspecialchars( $link['text'] ) ?></a></li>
-                       <?php } ?>
-               </ul>
-       </div>
-</div>
-<?php
-                               break;
+                                       ?>
+                                       <div id="p-cactions" role="navigation" class="vectorMenu<?php
+                                       if ( count( $this->data['action_urls'] ) == 0 ) {
+                                               echo ' emptyPortlet';
+                                       }
+                                       ?>" aria-labelledby="p-cactions-label">
+                                               <h3 id="p-cactions-label"><span><?php $this->msg( 'actions' ) ?></span><a href="#"></a></h3>
+
+                                               <div class="menu">
+                                                       <ul<?php $this->html( 'userlangattributes' ) ?>>
+                                                               <?php
+                                                               foreach ( $this->data['action_urls'] as $link ) {
+                                                                       ?>
+                                                                       <li<?php
+                                                                       echo $link['attributes']
+                                                                       ?>>
+                                                                               <a href="<?php
+                                                                               echo htmlspecialchars( $link['href'] )
+                                                                               ?>" <?php
+                                                                               echo $link['key'] ?>><?php echo htmlspecialchars( $link['text'] )
+                                                                                       ?></a>
+                                                                       </li>
+                                                               <?php
+                                                               }
+                                                               ?>
+                                                       </ul>
+                                               </div>
+                                       </div>
+                                       <?php
+                                       break;
                                case 'PERSONAL':
-?>
-<div id="p-personal" role="navigation" class="<?php if ( count( $this->data['personal_urls'] ) == 0 ) { echo ' emptyPortlet'; } ?>" aria-labelledby="p-personal-label">
-       <h3 id="p-personal-label"><?php $this->msg( 'personaltools' ) ?></h3>
-       <ul<?php $this->html( 'userlangattributes' ) ?>>
-<?php
-                                       $personalTools = $this->getPersonalTools();
-                                       foreach ( $personalTools as $key => $item ) {
-                                               echo $this->makeListItem( $key, $item );
+                                       ?>
+                                       <div id="p-personal" role="navigation" class="<?php
+                                       if ( count( $this->data['personal_urls'] ) == 0 ) {
+                                               echo ' emptyPortlet';
                                        }
-?>
-       </ul>
-</div>
-<?php
-                               break;
+                                       ?>" aria-labelledby="p-personal-label">
+                                               <h3 id="p-personal-label"><?php $this->msg( 'personaltools' ) ?></h3>
+                                               <ul<?php $this->html( 'userlangattributes' ) ?>>
+                                                       <?php
+                                                       $personalTools = $this->getPersonalTools();
+                                                       foreach ( $personalTools as $key => $item ) {
+                                                               echo $this->makeListItem( $key, $item );
+                                                       }
+                                                       ?>
+                                               </ul>
+                                       </div>
+                                       <?php
+                                       break;
                                case 'SEARCH':
-?>
-<div id="p-search" role="search">
-       <h3<?php $this->html( 'userlangattributes' ) ?>><label for="searchInput"><?php $this->msg( 'search' ) ?></label></h3>
-       <form action="<?php $this->text( 'wgScript' ) ?>" id="searchform">
-               <?php if ( $wgVectorUseSimpleSearch ) { ?>
-                       <div id="simpleSearch">
-               <?php } else { ?>
-                       <div>
-               <?php } ?>
-                       <?php
-                       echo $this->makeSearchInput( array( 'id' => 'searchInput' ) );
-                       echo Html::hidden( 'title', $this->get( 'searchtitle' ) );
-                       // We construct two buttons (for 'go' and 'fulltext' search modes), but only one will be
-                       // visible and actionable at a time (they are overlaid on top of each other in CSS).
-                       // * Browsers will use the 'fulltext' one by default (as it's the first in tree-order), which
-                       //   is desirable when they are unable to show search suggestions (either due to being broken
-                       //   or having JavaScript turned off).
-                       // * The mediawiki.searchSuggest module, after doing tests for the broken browsers, removes
-                       //   the 'fulltext' button and handles 'fulltext' search itself; this will reveal the 'go'
-                       //   button and cause it to be used.
-                       echo $this->makeSearchButton( 'fulltext', array( 'id' => 'mw-searchButton', 'class' => 'searchButton mw-fallbackSearchButton' ) );
-                       echo $this->makeSearchButton( 'go', array( 'id' => 'searchButton', 'class' => 'searchButton' ) );
-                       ?>
-               </div>
-       </form>
-</div>
-<?php
+                                       ?>
+                                       <div id="p-search" role="search">
+                                               <h3<?php $this->html( 'userlangattributes' ) ?>>
+                                                       <label for="searchInput"><?php $this->msg( 'search' ) ?></label>
+                                               </h3>
 
-                               break;
+                                               <form action="<?php $this->text( 'wgScript' ) ?>" id="searchform">
+                                                       <?php
+                                                       if ($wgVectorUseSimpleSearch) {
+                                                       ?>
+                                                       <div id="simpleSearch">
+                                                               <?php
+                                                       } else {
+                                                       ?>
+                                                               <div>
+                                                                       <?php
+                                                       }
+                                                       ?>
+                                                       <?php
+                                                       echo $this->makeSearchInput( array( 'id' => 'searchInput' ) );
+                                                       echo Html::hidden( 'title', $this->get( 'searchtitle' ) );
+                                                       // We construct two buttons (for 'go' and 'fulltext' search modes),
+                                                       // but only one will be visible and actionable at a time (they are
+                                                       // overlaid on top of each other in CSS).
+                                                       // * Browsers will use the 'fulltext' one by default (as it's the
+                                                       //   first in tree-order), which is desirable when they are unable
+                                                       //   to show search suggestions (either due to being broken or
+                                                       //   having JavaScript turned off).
+                                                       // * The mediawiki.searchSuggest module, after doing tests for the
+                                                       //   broken browsers, removes the 'fulltext' button and handles
+                                                       //   'fulltext' search itself; this will reveal the 'go' button and
+                                                       //   cause it to be used.
+                                                       echo $this->makeSearchButton(
+                                                               'fulltext',
+                                                               array( 'id' => 'mw-searchButton', 'class' => 'searchButton mw-fallbackSearchButton' )
+                                                       );
+                                                       echo $this->makeSearchButton(
+                                                               'go',
+                                                               array( 'id' => 'searchButton', 'class' => 'searchButton' )
+                                                       );
+                                                       ?>
+                                                               </div>
+                                               </form>
+                                       </div>
+                                       <?php
+
+                                       break;
                        }
                }
        }
diff --git a/skins/cologneblue/print.css b/skins/cologneblue/print.css
deleted file mode 100644 (file)
index d4b0551..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#sitetitle,
-#sitesub,
-#titlelinks,
-#footer-navigation {
-       display: none;
-}
diff --git a/skins/cologneblue/screen.css b/skins/cologneblue/screen.css
deleted file mode 100644 (file)
index ef9cf8f..0000000
+++ /dev/null
@@ -1,277 +0,0 @@
-body {
-       margin: 0;
-       padding: 0;
-       color: black;
-       font-family: serif;
-}
-
-#specialform {
-       display: inline;
-}
-
-#content {
-       top: 0;
-       margin: 0;
-       padding: 0;
-}
-
-#mw-data-after-content {
-       font-family: Verdana, Arial, sans-serif;
-       color: black;
-       font-size: 8pt;
-}
-
-#powersearch {
-       background: #DDEEFF;
-       border-style: solid;
-       border-width: 1px;
-       padding: 2px;
-}
-
-#quickbar {
-       width: 140px;
-       top: 18ex;
-       padding: 2px;
-       visibility: visible;
-       z-index: 99;
-}
-
-#article, #article td, #article th, #article p {
-       font-family: Verdana, Arial, sans-serif;
-       font-size: 10pt;
-       color: black;
-}
-
-#article p {
-       padding-top: 0;
-       padding-bottom: 0;
-       margin-top: 1ex;
-       margin-bottom: 0;
-}
-
-p, pre, .mw-code, td, th, li, dd, dt {
-       line-height: 12pt;
-}
-
-textarea {
-       overflow: auto;
-       width: 100%;
-       display: block;
-       -moz-box-sizing: border-box;
-       -webkit-box-sizing: border-box;
-       box-sizing: border-box;
-}
-
-#footer {
-       margin-right: 2%;
-       margin-top: 1em;
-       padding: 4px;
-       font-family: verdana, arial, sans-serif;
-       font-size: 10pt;
-       text-align: center;
-}
-
-#footer form {
-       display: inline;
-}
-
-#cb-ca-edit {
-       font-weight: bold;
-}
-
-#pagestats {
-       font-family: Verdana, Arial, sans-serif;
-       color: black;
-       font-size: 9pt;
-}
-
-
-
-#quickbar {
-       font-family: Verdana, Arial, sans-serif;
-       font-size: 8pt;
-       font-weight: bold;
-       line-height: 9.5pt;
-       text-decoration: none;
-       color: black;
-       padding: 0;
-       margin-top: 0;
-}
-
-#quickbar a {
-       color: #446688;
-}
-
-/* Hide, but keep accessible for screen-readers */
-#mw-navigation h2 {
-       position: absolute;
-       top: -9999px;
-}
-
-#quickbar h3 {
-       font-family: Verdana, Arial, sans-serif;
-       font-size: 10pt;
-       font-weight: bold;
-       line-height: 12pt;
-       text-decoration: none;
-       color: #666666;
-       padding: 0;
-       margin-bottom: 2px;
-       margin-top: 6px;
-}
-
-#quickbar form {
-       padding: 0;
-       margin-top: 0;
-}
-
-#quickbar .portlet ul,
-#quickbar .portlet li {
-       list-style-type: none;
-       margin: 0;
-       padding: 0;
-       line-height: inherit;
-}
-
-div.after-portlet {
-       display: inline;
-       padding-left: .5em;
-}
-
-h1 {
-       color: #666666;
-       font-family: Verdana, Arial, sans-serif;
-       font-size: 180%;
-       line-height: 21pt;
-}
-
-h1#firstHeading {
-       padding-bottom: 0;
-       margin-bottom: 0;
-}
-
-#article p.subtitle, #article p.subpages, #article p.tagline {
-       color: #666666;
-       font-size: 11pt;
-       font-weight: bold;
-       padding-top: 0;
-       margin-top: 0;
-       padding-bottom: 1ex;
-}
-
-a {
-       color: #223366;
-}
-
-a.external {
-       color: #336644;
-}
-
-a:visited {
-       color: #8D0749;
-}
-
-a.printable {
-       text-decoration: underline;
-}
-
-a.stub, #quickbar a.stub {
-       color: #772233;
-       text-decoration: none;
-}
-
-a.new, #quickbar span.new a, #footer span.new a {
-       color: #CC2200;
-}
-
-h2, h3, h4, h5, h6 {
-       margin-bottom: 0;
-}
-
-small {
-       font-size: 75%;
-}
-
-input.mw-searchInput {
-       width: 106px;
-}
-
-/* Directionality-specific styles */
-#quickbar { position: absolute; left: 4px; }
-#article { margin-left: 148px; margin-right: 4px; }
-#footer { margin-left: 152px; }
-
-
-#sitetitle, #sitesub, #toplinks, #linkcollection {
-       margin-top: 0;
-       margin-bottom: 0;
-}
-
-#sitetitle, #toplinks {
-       color: white;
-       text-transform: uppercase;
-       height: 32pt;
-}
-#sitetitle {
-       padding-left: 8px;
-       font-family: Times, serif;
-       font-weight: normal;
-       font-size: 32pt;
-       line-height: 32pt;
-       background-color: #6688AA;
-}
-#sitetitle a, #toplinks a {
-       color: white;
-       text-decoration: none;
-}
-/* Bring #sitetitle to top. Otherwise #toplinks is overlaid over it, making the link unclickable. */
-#sitetitle a {
-       position: relative;
-       z-index: 10
-}
-
-#toplinks {
-       font-family: Verdana, Arial, sans-serif;
-       position: absolute;
-       top: 0;
-       right: 8px;
-       width: 100%;
-       font-size: 8pt;
-}
-#toplinks a {
-       font-size: 10pt;
-}
-#toplinks p {
-       position: absolute;
-       right: 0;
-       margin: 0;
-       width: 100%;
-       text-align: right;
-}
-#toplinks #syslinks {
-       bottom: 0;
-}
-#toplinks #variantlinks {
-       bottom: 12pt;
-}
-
-#sitesub {
-       float: left;
-       margin-left: 8px;
-       font-family: Verdana, Arial, sans-serif;
-       font-size: 9pt;
-       font-weight: bold;
-       color: black;
-}
-
-#linkcollection {
-       margin-top: 0.5em;
-       font-size: small;
-       margin-right: 8px;
-       text-align: right;
-       padding-left: 140px;
-}
-/* Override text justification (user preference), see bug 31990 */
-#linkcollection * {
-       text-align: right;
-}
index c017e3c..6b9464a 100644 (file)
@@ -19,14 +19,15 @@ function debug( text ) {
                return false;
        }
 
-       var e = document.getElementById( 'sajax_debug' );
+       var b, m,
+               e = document.getElementById( 'sajax_debug' );
 
        if ( !e ) {
                e = document.createElement( 'p' );
                e.className = 'sajax_debug';
                e.id = 'sajax_debug';
 
-               var b = document.getElementsByTagName( 'body' )[0];
+               b = document.getElementsByTagName( 'body' )[0];
 
                if ( b.firstChild ) {
                        b.insertBefore( e, b.firstChild );
@@ -35,7 +36,7 @@ function debug( text ) {
                }
        }
 
-       var m = document.createElement( 'div' );
+       m = document.createElement( 'div' );
        m.appendChild( document.createTextNode( text ) );
 
        e.appendChild( m );
index 41d20fb..4157b55 100644 (file)
@@ -45,6 +45,7 @@ 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 {
@@ -59,12 +60,14 @@ table.toc td {
        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;
@@ -73,10 +76,12 @@ table.toc td {
        padding: 0;
        text-align: left;
 }
+
 #toc ul ul,
 .toc ul ul {
        margin: 0 0 0 2em;
 }
+
 #toc .toctoggle,
 .toc .toctoggle {
        font-size: 94%;
@@ -101,18 +106,27 @@ table.toc td {
        margin: 0 0 .5em .5em;
        border: 0;
 }
-div.floatright p { font-style: italic; }
+
+div.floatright p {
+       font-style: italic;
+}
+
 /* @noflip */div.floatleft, table.floatleft {
        margin: 0 .5em .5em 0;
        border: 0;
 }
-div.floatleft p { font-style: italic; }
+
+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;
@@ -121,31 +135,38 @@ div.thumbinner {
        text-align: center;
        overflow: hidden;
 }
+
 html .thumbimage {
        border: 1px solid #ccc;
 }
+
 html .thumbcaption {
        border: none;
        line-height: 1.4em;
        padding: 3px !important;
        font-size: 94%;
 }
+
 div.magnify {
        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 {
        margin: .5em 0 1.3em 1.4em;
 }
+
 /* @noflip */div.tleft {
        margin: .5em 1.4em 1.3em 0;
 }
+
 img.thumbborder {
        border: 1px solid #dddddd;
 }
index ad7942a..7b2cc40 100644 (file)
@@ -12,21 +12,27 @@ a {
        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;
 }
@@ -36,9 +42,11 @@ a.new:visited, #p-personal a.new:visited {
 .mw-body a.extiw:active {
        color: #36b;
 }
+
 .mw-body a.extiw:visited {
        color: #636;
 }
+
 .mw-body a.extiw:active {
        color: #b63;
 }
@@ -47,9 +55,11 @@ a.new:visited, #p-personal a.new:visited {
 .mw-body a.external {
        color: #36b;
 }
+
 .mw-body a.external:visited {
        color: #636; /* bug 3112 */
 }
+
 .mw-body a.external:active {
        color: #b63;
 }
@@ -59,6 +69,7 @@ img {
        border: none;
        vertical-align: middle;
 }
+
 hr {
        height: 1px;
        color: #aaa;
@@ -83,12 +94,15 @@ h6 {
        padding-bottom: .17em;
        border-bottom: 1px solid #aaa;
 }
+
 h1 {
        font-size: 188%;
 }
+
 h2 {
        font-size: 150%;
 }
+
 h3,
 h4,
 h5,
@@ -96,15 +110,19 @@ h6 {
        border-bottom: none;
        font-weight: bold;
 }
+
 h3 {
        font-size: 132%;
 }
+
 h4 {
        font-size: 116%;
 }
+
 h5 {
        font-size: 108%;
 }
+
 h6 {
        font-size: 100%;
 }
@@ -114,6 +132,7 @@ h1,
 h2 {
        margin-bottom: .6em;
 }
+
 h3,
 h4,
 h5 {
@@ -124,6 +143,7 @@ p {
        margin: .4em 0 .5em 0;
        line-height: 1.5em;
 }
+
 p img {
        margin: 0;
 }
@@ -134,23 +154,28 @@ ul {
        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;
@@ -170,9 +195,11 @@ pre, code, tt, kbd, samp, .mw-code {
         */
        font-family: monospace, Courier;
 }
+
 code {
        background-color: #f9f9f9;
 }
+
 pre, .mw-code {
        padding: 1em;
        border: 1px solid #ddd;
@@ -192,18 +219,22 @@ fieldset {
        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;
@@ -212,6 +243,7 @@ textarea {
        -webkit-box-sizing: border-box;
        box-sizing: border-box;
 }
+
 select {
        vertical-align: top;
 }
@@ -221,15 +253,17 @@ select {
        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%;
 }
-
index 7eca070..733fd11 100644 (file)
@@ -32,6 +32,7 @@
        text-align: center;
        margin: 0;
 }
+
 #localNotice {
        margin-bottom: 0.9em;
 }
 #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
+       margin-bottom: 1.4em;
 }
+
 #contentSub, #contentSub2 {
        font-size: 84%;
        line-height: 1.2em;
@@ -62,7 +65,7 @@
        color: #545454;
        width: auto;
 }
+
 span.subpages {
        display: block;
 }
-
index 65f3fbe..a6d3b55 100644 (file)
@@ -32,18 +32,22 @@ div.floatright {
        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;
 }
@@ -56,17 +60,20 @@ div.thumb {
        margin-bottom: 0.8em;
        background-color: transparent;
 }
+
 div.thumbinner {
-       border:1px solid #cccccc;
+       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;
@@ -78,32 +85,25 @@ html .thumbcaption {
 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;
 }
 
-/* table standards */
-table.rimage {
-       float: right;
-       width: 1pt;
-       position: relative;
-       margin-left: 1em;
-       margin-bottom: 1em;
-       text-align: center;
-}
-
 body {
        background: white;
        color: black;
@@ -151,9 +151,10 @@ ul {
        margin: 0 !important;
        direction: ltr;
 }
+
 #footer {
-       background : white;
-       color : black;
+       background: white;
+       color: black;
        margin-top: 1em;
        border-top: 1px solid #AAA;
        direction: ltr;
@@ -206,6 +207,12 @@ a:link, a:visited {
        content: " (" attr(href) ")";
 }
 
+#content a.external.text[href^='//']:after,
+#content a.external.autonumber[href^='//']:after {
+       /* Expand protocol-relative URLs for printing */
+       content: " (https:" attr(href) ")";
+}
+
 #globalWrapper {
        width: 100% !important;
        min-width: 0 !important;
@@ -260,7 +267,6 @@ span.texhtml {
 /* Galleries (see shared.css for more info) */
 li.gallerybox {
        vertical-align: top;
-       display: -moz-inline-box;
        display: inline-block;
 }
 
@@ -301,26 +307,32 @@ div.gallerytext {
 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;
@@ -338,12 +350,14 @@ table.mw_metadata {
        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 {
@@ -351,6 +365,7 @@ table.wikitable > * > tr > th,
        background: white;
        font-weight: bold;
 }
+
 table.wikitable > caption,
 .mw_metadata caption {
        font-weight: bold;
@@ -364,9 +379,11 @@ a.sortheader {
 .wikitable, .thumb, img {
        page-break-inside: avoid;
 }
+
 h2, h3, h4, h5, h6 {
        page-break-after: avoid;
 }
+
 p {
        widows: 3;
        orphans: 3;
index d81218e..ecd10fa 100644 (file)
@@ -54,4 +54,3 @@ td, h3, p, h1, pre {
 .dent {
        margin-left: 64px;
 }
-
index d646273..aedb6a9 100644 (file)
@@ -6,26 +6,32 @@
 .config-section {
        margin-top: 2em;
 }
+
 .config-block {
        margin-top: 2em;
        display: block;
 
 }
+
 .config-block-label {
        display: block;
        margin-bottom: .2em;
 }
+
 .config-block-label label, .config-label {
        font-weight: bold;
        padding-right: .5em;
        padding-top: .2em;
 }
+
 .config-block-elements {
        margin-left: 2em;
 }
+
 .config-block-elements li {
        list-style: none;
 }
+
 .config-input {
        clear: left;
        zoom: 100%; /* IE hack */
        font-size: 110%;
        color: green;
 }
+
 .success-box {
        font-size: 130%;
 }
 
 .config-cc-wrapper {
        clear: left;
-       /* If you change this height, also change it in WebInstaller_Options::submitCC() */
+       /* If you change this height, also change it in WebInstallerOptions::submitCC() */
        height: 54em;
 }
 
        margin-left: 2em;
 }
 
+.config-download-link a {
+       background: url(images/download-32.png) no-repeat center left;
+       padding-left: 40px; /* 32 px for the image (above), plus some breathing room */
+       height: 32px; /* provide enough vertical room for the image */
+       display: inline-block; /* allow the height property (above) to work */
+       line-height: 32px; /* center the text vertically */
+}
+
 #config-live-log {
        overflow: hidden;
        min-width: 20em;
index 9439663..dc0453d 100644 (file)
@@ -32,55 +32,104 @@ rss:before {
 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 {
+channel > title,
+item > title,
+feed > title,
+entry > title {
        font-weight: bold;
        border-bottom: solid 1px #aaa;
        margin-left: -0.5em;
 }
-channel>title, feed>title {
+
+channel > title, feed > title {
        font-size: larger;
 }
-item>title, entry>title {
+
+item > title, entry > title {
        font-size: large;
 }
+
 item, entry {
        margin-top: 1em;
        margin-left: 2em;
 }
 
-item>description, entry>summary {
+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 {
+       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,
index eea8b8e..250f15c 100644 (file)
@@ -8,19 +8,40 @@
  * 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 {
+       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 }
+#footer {
+       clear: both;
+}
+
 /* images */
 /* @noflip */
 div.floatright {
@@ -62,6 +83,7 @@ div.thumb {
        border-color: white;
        width: auto;
 }
+
 div.thumbinner {
        border: 1px solid #ccc;
        padding: 3px !important;
@@ -70,9 +92,11 @@ div.thumbinner {
        text-align: center;
        overflow: hidden;
 }
+
 html .thumbimage {
        border: 1px solid #ccc;
 }
+
 html .thumbcaption {
        border: none;
        text-align: left;
@@ -80,24 +104,28 @@ html .thumbcaption {
        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;
@@ -105,15 +133,20 @@ div.tleft {
        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; }
+.autocomment {
+       color: #4b4b4b;
+}
 
-img { border: none; }
+img {
+       border: none;
+}
 
 #toc,
 .toc {
@@ -132,16 +165,19 @@ img { border: none; }
 
        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;
@@ -150,6 +186,7 @@ table.toc td {
        font-size: 100%;
        font-weight: bold;
 }
+
 #toc ul,
 .toc ul {
        list-style-type: none;
@@ -157,10 +194,12 @@ table.toc td {
        padding: 0;
        text-align: left;
 }
+
 #toc ul ul,
 .toc ul ul {
        margin: 0 0 0 2em;
 }
+
 #toc .toctoggle,
 .toc .toctoggle {
        font-size: 94%;
@@ -177,31 +216,38 @@ table.toc td {
        margin: 1em 1em 1em 1em;
        width: 13em;
 }
+
 #preftoc li {
        border: 1px solid White;
 }
+
 #preftoc li.selected {
-       background-color:#f9f9f9;
-       border:1px dashed #aaaaaa;
+       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;
 }
@@ -211,6 +257,7 @@ fieldset.operaprefsection {
        width: 100%;
        text-align: center;
 }
+
 *.center * {
        margin-left: auto;
        margin-right: auto;
@@ -220,6 +267,7 @@ fieldset.operaprefsection {
 .small {
        font-size: 94%;
 }
+
 table.small {
        font-size: 100%;
 }
@@ -231,18 +279,22 @@ table.small {
        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;
@@ -269,6 +321,7 @@ span.changedby {
        text-align: center;
        color: #cc0000;
 }
+
 .editExternally {
        border-style: solid;
        border-width: 1px;
@@ -280,6 +333,7 @@ span.changedby {
        font-size: small;
        text-align: center;
 }
+
 .editExternallyHelp {
        font-style: italic;
        color: gray;
@@ -299,9 +353,11 @@ table.mw_metadata {
 table.mw_metadata caption {
        font-weight: bold;
 }
+
 table.mw_metadata th {
        font-weight: normal;
 }
+
 table.mw_metadata td {
        padding: 0.1em;
 }
@@ -310,23 +366,28 @@ 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;
 }
@@ -388,21 +449,26 @@ table.multipageimage td {
 .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;
 }
@@ -411,12 +477,15 @@ table.multipageimage 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;
 }
@@ -430,6 +499,7 @@ table.multipageimage td {
        background-color: #ccc;
        padding: 0.1em;
 }
+
 .MediaTransformError td {
        text-align: center;
        vertical-align: middle;
@@ -445,6 +515,7 @@ body {
        unicode-bidi: embed;
        background-color: #ffffec;
 }
+
 body.ns-0 {
        background-color: white;
 }
@@ -461,6 +532,7 @@ body.ns-0 {
 html > body.rtl div#article ul {
        display: table;
 }
+
 /* @noflip */
 html > body.rtl div#bodyContent ul#filetoc {
        display: block;
index 6b052b3..a5612e2 100644 (file)
@@ -14,6 +14,7 @@
        /* @noflip */
        direction: ltr;
 }
+
 .mw-content-rtl {
        /* @noflip */
        direction: rtl;
@@ -25,6 +26,7 @@
        /* @noflip */
        direction: ltr;
 }
+
 .sitedir-rtl textarea,
 .sitedir-rtl input {
        /* @noflip */
@@ -37,6 +39,12 @@ mark {
        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"],
@@ -52,6 +60,7 @@ input[dir="ltr"] {
        /* @noflip */
        direction: ltr;
 }
+
 textarea[dir="rtl"],
 input[dir="rtl"] {
        /* @noflip */
@@ -69,9 +78,11 @@ abbr[title],
 .mw-plusminus-pos {
        color: #006400; /* dark green */
 }
+
 .mw-plusminus-neg {
        color: #8b0000; /* dark red */
 }
+
 .mw-plusminus-null {
        color: #aaa; /* gray */
 }
@@ -100,9 +111,11 @@ span.changedby {
        direction: ltr;
        unicode-bidi: embed;
 }
+
 img.tex {
        vertical-align: middle;
 }
+
 span.texhtml {
        font-family: serif;
 }
@@ -145,9 +158,11 @@ 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;
@@ -200,9 +215,11 @@ div.patrollink {
 td.mw-label {
        text-align: right;
 }
+
 td.mw-input {
        text-align: left;
 }
+
 td.mw-submit {
        text-align: left;
 }
@@ -210,12 +227,15 @@ td.mw-submit {
 td.mw-label {
        vertical-align: top;
 }
+
 .prefsection td.mw-label {
        width: 20%;
 }
+
 .prefsection table {
        width: 100%;
 }
+
 .prefsection table.mw-htmlform-matrix {
        width: auto;
 }
@@ -284,14 +304,17 @@ input#wpSummary {
 .mw-content-ltr .thumbcaption {
        text-align: left;
 }
+
 /* @noflip */
 .mw-content-rtl .thumbcaption {
        text-align: right;
 }
+
 /* @noflip */
 .mw-content-ltr .magnify {
        float: right;
 }
+
 /* @noflip */
 .mw-content-rtl .magnify {
        float: left;
@@ -307,6 +330,7 @@ input#wpSummary {
         */
        text-align: left;
 }
+
 .catlinks ul {
        display: inline;
        margin: 0;
@@ -336,12 +360,14 @@ input#wpSummary {
 .catlinks li a.mw-redirect {
        font-style: italic;
 }
+
 /**
  * Hidden categories
  */
 .mw-hidden-cats-hidden {
        display: none;
 }
+
 .catlinks-allhidden {
        display: none;
 }
@@ -370,8 +396,8 @@ p.mw-revdel-editreasons {
        border-style: solid;
        border-color: #AAAAAA;
        border-width: 1px;
-       z-index:99;
-       font-size:95%;
+       z-index: 99;
+       font-size: 95%;
 }
 
 table.os-suggest-results {
@@ -389,6 +415,7 @@ table.os-suggest-results {
        color: black;
        padding: 2px;
 }
+
 .os-suggest-result-hl,
 .os-suggest-result-hl-webkit {
        background-color: #4C59A6;
@@ -400,6 +427,7 @@ table.os-suggest-results {
        left: 1ex;
        font-size: 65%;
 }
+
 .os-suggest-toggle-def {
        position: absolute;
        top: 0;
@@ -414,16 +442,20 @@ table.os-suggest-results {
 .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;
@@ -457,6 +489,7 @@ div.mw-warning-with-logexcerpt {
        border: 2px solid #2F6FAB;
        clear: both;
 }
+
 div.mw-warning-with-logexcerpt ul li {
        font-size: 90%;
 }
@@ -466,6 +499,7 @@ span.mw-revdelundel-link,
 strong.mw-revdelundel-link {
        font-size: 90%;
 }
+
 span.mw-revdelundel-hidden,
 input.mw-revdelundel-hidden {
        visibility: hidden;
@@ -504,6 +538,7 @@ a.feedlink {
        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 {
@@ -522,6 +557,7 @@ table.wikitable {
        border-collapse: collapse;
        color: black;
 }
+
 table.wikitable > tr > th,
 table.wikitable > tr > td,
 table.wikitable > * > tr > th,
@@ -529,11 +565,13 @@ 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;
 }
@@ -553,12 +591,15 @@ table.collapsed tr.collapsable {
 .success {
        font-size: larger;
 }
+
 .error {
        color: #cc0000;
 }
+
 .warning {
        color: #705000;
 }
+
 .success {
        color: #009000;
 }
@@ -574,6 +615,7 @@ table.collapsed tr.collapsable {
        zoom: 1;
        *display: inline;
 }
+
 .errorbox h2,
 .warningbox h2,
 .successbox h2 {
@@ -584,16 +626,19 @@ table.collapsed tr.collapsable {
        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;
@@ -642,23 +687,26 @@ table.collapsed tr.collapsable {
 .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).
@@ -666,13 +714,16 @@ table.collapsed tr.collapsable {
 .TablePager {
        min-width: 80%;
 }
+
 .TablePager_nav {
        margin: 0 auto;
 }
+
 .TablePager_nav td {
        padding: 3px;
        text-align: center;
 }
+
 .TablePager_nav a {
        text-decoration: none;
 }
@@ -681,12 +732,15 @@ table.collapsed tr.collapsable {
 .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;
 }
@@ -765,30 +819,35 @@ table.mw_metadata ul.metadata-langlist {
        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 {
@@ -861,6 +920,7 @@ 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 {
@@ -869,7 +929,7 @@ ul.mw-gallery-packed-hover li.gallerybox div.thumb img {
 
 ul.mw-gallery-packed-hover li.gallerybox,
 ul.mw-gallery-packed-overlay li.gallerybox {
-       position:relative;
+       position: relative;
 }
 
 ul.mw-gallery-packed-hover div.gallerytextwrapper {
@@ -880,7 +940,7 @@ ul.mw-gallery-packed-hover div.gallerytextwrapper {
 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;
+       position: absolute;
        background: white;
        background: rgba(255, 255, 255, 0.8);
        padding: 5px 10px;
@@ -941,6 +1001,7 @@ 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),
@@ -1009,18 +1070,21 @@ ol:lang(or) li {
 .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,
@@ -1050,17 +1114,20 @@ ol:lang(or) li {
        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;
+       padding: 5px 8px 4px 8px;
        border: 1px solid #5dc9f4;
        margin-left: 20px;
 }
+
 .tipsy {
        padding: 5px 5px 10px;
        font-size: 12px;
@@ -1068,6 +1135,7 @@ ol:lang(or) li {
        z-index: 100000;
        overflow: visible;
 }
+
 .tipsy-inner {
        padding: 5px 8px 4px 8px;
        background-color: #d6f3ff;
@@ -1076,6 +1144,7 @@ ol:lang(or) li {
        max-width: 300px;
        text-align: left;
 }
+
 .tipsy-arrow {
        position: absolute;
        /* @embed */
@@ -1083,6 +1152,7 @@ ol:lang(or) li {
        width: 13px;
        height: 13px;
 }
+
 .tipsy-se .tipsy-arrow {
        bottom: -2px;
        right: 10px;
@@ -1104,14 +1174,17 @@ ol:lang(or) li {
        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,
@@ -1135,12 +1208,14 @@ table.floatright {
        clear: right;
        float: right;
 }
+
 /* @noflip */ div.tleft,
 div.floatleft,
 table.floatleft {
        float: left;
        clear: left;
 }
+
 div.floatright,
 table.floatright,
 div.floatleft,
@@ -1203,6 +1278,7 @@ table.floatleft {
 .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 {
index a7ff2da..fdfca0a 100644 (file)
@@ -19,7 +19,6 @@ if ( mw.config.get( 'wgBreakFrames' ) ) {
 
 /**
  * User-agent sniffing.
- * To be removed in MediaWiki 1.23.
  *
  * @deprecated since 1.17 Use jquery.client instead
  */
@@ -51,8 +50,6 @@ mw.log.deprecate( win, 'ie6_bugs', false, msg );
 /**
  * DOM utilities for handling of events, text nodes and selecting elements
  *
- * To be removed in MediaWiki 1.23.
- *
  * @deprecated since 1.17 Use jQuery instead
  */
 msg = 'Use jQuery instead.';
@@ -104,8 +101,6 @@ $( win ).on( 'load', function () {
 /**
  * Toggle checkboxes with shift selection
  *
- * To be removed in MediaWiki 1.23.
- *
  * @deprecated since 1.17 Use jquery.checkboxShiftClick instead
  */
 msg = 'Use jquery.checkboxShiftClick instead.';
@@ -118,8 +113,6 @@ mw.log.deprecate( win, 'checkboxClickHandler', $.noop, msg );
 /**
  * Add a button to the default editor toolbar
  *
- * To be removed in MediaWiki 1.23.
- *
  * @deprecated since 1.17 Use mw.toolbar instead
  */
 mw.log.deprecate( win, 'mwEditButtons', [], 'Use mw.toolbar instead.' );
@@ -128,8 +121,6 @@ mw.log.deprecate( win, 'mwCustomEditButtons', [], 'Use mw.toolbar instead.' );
 /**
  * Spinner creation, injection and removal
  *
- * To be removed in MediaWiki 1.23.
- *
  * @deprecated since 1.18 Use jquery.spinner instead
  */
 mw.log.deprecate( win, 'injectSpinner', $.noop, 'Use jquery.spinner instead.' );
@@ -138,8 +129,6 @@ mw.log.deprecate( win, 'removeSpinner', $.noop, 'Use jquery.spinner instead.' );
 /**
  * Escape utilities
  *
- * To be removed in MediaWiki 1.23.
- *
  * @deprecated since 1.18 Use mw.html instead
  */
 mw.log.deprecate( win, 'escapeQuotes', $.noop, 'Use mw.html instead.' );
@@ -148,26 +137,32 @@ mw.log.deprecate( win, 'escapeQuotesHTML', $.noop, 'Use mw.html instead.' );
 /**
  * Display a message to the user
  *
- * To be removed in MediaWiki 1.23.
- *
  * @deprecated since 1.17 Use mediawiki.notify instead
  * @param {string|HTMLElement} message To be put inside the message box
  */
-mw.log.deprecate( win, 'jsMsg', mw.util.jsMessage, 'Use mediawiki.notify instead.' );
+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
  *
- * To be removed in MediaWiki 1.23.
- *
  * @deprecated since 1.17 Use mediawiki.util instead
  */
 msg = 'Use mediawiki.util instead.';
-mw.log.deprecate( win, 'tooltipAccessKeyPrefix', 'alt-', msg );
-mw.log.deprecate( win, 'tooltipAccessKeyRegexp', /\[(alt-)?(.)\]$/, msg );
 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
diff --git a/skins/modern/audio.png b/skins/modern/audio.png
deleted file mode 100644 (file)
index 68c8768..0000000
Binary files a/skins/modern/audio.png and /dev/null differ
diff --git a/skins/modern/bullet.gif b/skins/modern/bullet.gif
deleted file mode 100644 (file)
index b43de48..0000000
Binary files a/skins/modern/bullet.gif and /dev/null differ
diff --git a/skins/modern/discussionitem_icon.gif b/skins/modern/discussionitem_icon.gif
deleted file mode 100644 (file)
index e3ca6d9..0000000
Binary files a/skins/modern/discussionitem_icon.gif and /dev/null differ
diff --git a/skins/modern/document.png b/skins/modern/document.png
deleted file mode 100644 (file)
index ee46a50..0000000
Binary files a/skins/modern/document.png and /dev/null differ
diff --git a/skins/modern/external.png b/skins/modern/external.png
deleted file mode 100644 (file)
index 6308383..0000000
Binary files a/skins/modern/external.png and /dev/null differ
diff --git a/skins/modern/file_icon.gif b/skins/modern/file_icon.gif
deleted file mode 100644 (file)
index 69dbeaf..0000000
Binary files a/skins/modern/file_icon.gif and /dev/null differ
diff --git a/skins/modern/footer-grad.png b/skins/modern/footer-grad.png
deleted file mode 100644 (file)
index 72b8724..0000000
Binary files a/skins/modern/footer-grad.png and /dev/null differ
diff --git a/skins/modern/link_icon.gif b/skins/modern/link_icon.gif
deleted file mode 100644 (file)
index 168c1a2..0000000
Binary files a/skins/modern/link_icon.gif and /dev/null differ
diff --git a/skins/modern/lock_icon.gif b/skins/modern/lock_icon.gif
deleted file mode 100644 (file)
index 8284403..0000000
Binary files a/skins/modern/lock_icon.gif and /dev/null differ
diff --git a/skins/modern/mail_icon.gif b/skins/modern/mail_icon.gif
deleted file mode 100644 (file)
index cf5680d..0000000
Binary files a/skins/modern/mail_icon.gif and /dev/null differ
diff --git a/skins/modern/main.css b/skins/modern/main.css
deleted file mode 100644 (file)
index 6f73f0e..0000000
+++ /dev/null
@@ -1,912 +0,0 @@
-body {
-       margin: 0 0 0 0;
-       padding: 0 0 0 0;
-       font-size: x-small;
-
-
-       font-family: sans-serif;
-       color: black;
-       background-color: #f0f0f0;
-
-       direction: ltr;
-       unicode-bidi: embed;
-}
-
-#mw_main,
-#p-personal,
-#mw_header,
-.os-suggest {
-       font-size: 130%;
-}
-
-#mw_header {
-       position: absolute;
-       top: 0;
-       left: 0;
-       margin: 0 0 0 0;
-       padding: 0 0em 0 0em;
-       border: none;
-       height: 2em;
-       width: 100%;
-
-       background-color: #003366;
-       color: white;
-}
-
-#mw_header h1 {
-       margin: 0 0 0 0.5em;
-       padding: 0 0 0 0;
-       text-decoration: none;
-       font-size: 150%;
-}
-
-#p-personal {
-       position: absolute;
-       top: 2em;
-       left: 0;
-       height: 1.5em;
-       margin: 0 0 0 0;
-       padding: 0 0 0 0;
-       width: 100%;
-
-}
-
-#p-personal div.pBody {
-       margin: 0 0 0 0;
-       padding: 0 0 0 0;
-       height: 1.5em;
-       font-variant: small-caps;
-}
-
-#p-personal h3 {
-       display: none;
-}
-
-#p-personal ul {
-       margin: 0 0 0 0;
-       padding: 0 0 0 0;
-       display: block;
-       height: 1.5em;
-       background-color: #3c78b5;
-}
-
-#p-personal li {
-       display: block;
-       float: left;
-       height: 1.5em;
-       margin: 0 0 0 0;
-       vertical-align: middle;
-
-       font-weight: bold;
-       text-transform: lowercase;
-}
-
-#p-personal li a {
-       text-decoration: none;
-       color: white;
-       padding: 0 1em 0 1em;
-}
-
-#p-personal li a:hover {
-       text-decoration: none;
-       color: white;
-}
-
-#p-personal li:hover {
-       background-color: #003366;
-}
-
-#jump-to-nav {
-       display: none;
-}
-
-#mw_contentwrapper {
-       width: 100%;
-       margin: 0 0 0 -15em;
-       float: right;
-}
-
-#mw_content {
-       margin: 0 0 0 14em;
-
-       background-color: white;
-       border-top: solid 1px #bbbbbb;
-       border-left: solid 1px #bbbbbb;
-       border-bottom: solid 1px #bbbbbb;
-
-       line-height: 1.5em;
-       padding: 0 1em 1em 1em;
-}
-
-#mw_portlets {
-       width: 14em;
-
-       border-right: solid 1px #bbbbbb;
-       background-color: #f0f0f0;
-}
-
-/* Hide, but keep accessible for screen-readers */
-#mw_portlets h2 {
-       position: absolute;
-       top: -9999px;
-}
-
-#mw_main {
-       padding: 0 0 0 0;
-       margin: 0 0 0 0;
-       margin-top: 3.5em;
-}
-
-div.mw_clear {
-       margin: 0 0 0 0;
-       padding: 0 0 0 0;
-       clear: both;
-}
-
-.portlet {
-       padding: 0 0 0 0;
-       margin: 0 0 0 0;
-}
-
-.portlet div.pBody {
-       padding: 0em 0 0.5em 0;
-}
-
-textarea {
-       width: 100%;
-       padding: .1em;
-       display: block;
-       -moz-box-sizing: border-box;
-       -webkit-box-sizing: border-box;
-       box-sizing: border-box;
-}
-
-#searchBody {
-       text-align: center;
-}
-
-#searchInput {
-       width: 85%;
-       margin-left: auto;
-       margin-right: auto;
-}
-
-#p-search #searchform div div {
-       margin-top: .4em;
-}
-
-.portlet h3 {
-       padding: 0.1em 0 0.3em 1em;
-       margin: 0 0 0 0;
-       background-color: #dddddd;
-       font-weight: bold;
-       font-size: 0.83em;
-       border-bottom: solid 1px #3c78b5;
-       height: 1.1em;
-}
-
-.portlet ul {
-       margin: 0 0 0 1.5em;
-       padding: 0 0 0 0;
-}
-
-#mw_portlets .portlet ul {
-       line-height: 1.4em;
-}
-
-ul {
-       /* @embed */
-       list-style-image: url(bullet.gif);
-}
-
-#p-cactions {
-       height: 1.5em;
-       padding: 0 0 0 0;
-       margin: 0 0 0 14em;
-}
-
-#p-cactions div.pBody {
-       margin: 0 0 0 0;
-       padding: 0 0 0 0;
-}
-
-#p-cactions a,
-#p-cactions a:hover {
-       color: black;
-       text-decoration: none;
-}
-
-#p-cactions ul {
-       display: inline;
-       margin: 0 0 0 0;
-       padding: 0 0 0 0;
-}
-
-#p-cactions li {
-       margin: 0 0.5em 0 0.5em;
-       padding: 0 0.2em 0 0.2em;
-       display: block;
-       float: left;
-       height: 1.5em;
-       text-transform: lowercase;
-}
-
-#p-cactions li.selected {
-       background-color: #bbbbbb;
-}
-
-#p-cactions li a,
-#p-cactions li a:hover,
-#p-cactions li a:visited {
-       text-decoration: underline;
-       color: #003366;
-}
-
-#p-cactions li.selected a,
-#p-cactions li.selected a:hover,
-#p-cactions li.selected a:visited {
-       text-decoration: none;
-       color: white;
-}
-
-#p-cactions h3 {
-       display: none;
-}
-
-#siteSub {
-       display: none;
-}
-
-#footer {
-       background-color: #f0f0f0;
-       /* @embed */
-       background: url(footer-grad.png) repeat-x 0 0;
-       padding: 10px 1em 1em 1em;
-       clear:both;
-       color: #444444;
-}
-
-#footer a,
-#footer a:hover,
-#footer a:visited {
-       color: #444444;
-       text-decoration: underline;
-}
-
-img {
-       border: none;
-}
-
-#footer li {
-       display: inline;
-       list-style-type: none;
-       padding: 0 0 0 0;
-       margin: 0 0 0 0;
-}
-
-#footer ul {
-       padding: 0 0 0 0;
-       margin: 0 0 0 0;
-}
-
-p {
-       margin: 1em 0 1em 0;
-}
-
-hr {
-       height: 1px;
-       color: #aaa;
-       background-color: #aaa;
-       border: 0;
-       margin: .2em 0 .2em 0;
-}
-
-#contentSub {
-       color: #545454;
-       font-size: small;
-       padding-left: 2em;
-}
-
-#mw_portlets form {
-       margin: 0 0 0 0;
-       padding: 0 0 0 0;
-}
-
-a {
-       text-decoration: none;
-       color: #003366;
-       background: none;
-}
-a:visited {
-       color: #5a3696;
-}
-a:active {
-       color: #faa700;
-}
-a:hover {
-       text-decoration: underline;
-}
-a.stub {
-       color: #772233;
-}
-a.new {
-       color: #ba0000;
-}
-a.new:visited {
-       color: #a55858;
-}
-
-h1, h2 {
-       border-bottom: solid 1px #003366;
-}
-
-h1, h2, h3, h4, h5, h6 {
-       overflow: hidden;
-}
-
-#preftoc {
-       width: 100%;
-       margin: 0 0 0 0;
-       padding: 0 0 0 0;
-       height: 1.5em;
-       clear: right;
-}
-
-#preftoc li {
-       margin: 0 0.5em 0 0.5em;
-       padding: 0 0.2em 0 0.2em;
-       display: block;
-       float: left;
-       height: 1.5em;
-       text-transform: lowercase;
-}
-
-#preferences {
-       margin: 0 0 0 0;
-       padding: 0em 1em 1em 1em;
-       border: solid 1px #bbbbbb;
-       clear: left; /* Multi-line toc should not push data to horizontally */
-}
-
-#preferences fieldset {
-       margin-top: 0;
-       border: none;
-}
-
-.mainLegend {
-       display: none;
-}
-
-.htmlform-tip {
-       font-size: x-small;
-       padding: .2em 2em;
-       color: #666;
-}
-
-.prefsection legend {
-       font-weight: bold;
-}
-
-#preftoc li.selected {
-       background-color: #bbbbbb;
-}
-
-#preftoc li a,
-#preftoc li a:hover,
-#preftoc li a:visited {
-       text-decoration: underline;
-       color: #003366;
-}
-
-#preftoc li.selected a,
-#preftoc li.selected a:hover,
-#preftoc li.selected a:visited {
-       text-decoration: none;
-       color: white;
-}
-#mw_content a.external {
-       /* @embed */
-       background: url(external.png) center right no-repeat;
-       padding-right: 13px;
-}
-#mw_content a.external[href ^="https://"],
-.link-https {
-       /* @embed */
-       background: url(lock_icon.gif) center right no-repeat;
-       padding-right: 16px;
-}
-#mw_content a.external[href ^="mailto:"],
-.link-mailto {
-       /* @embed */
-       background: url(mail_icon.gif) center right no-repeat;
-       padding-right: 18px;
-}
-#mw_content a.external[href ^="news:"] {
-       /* @embed */
-       background: url(news_icon.png) center right no-repeat;
-       padding-right: 18px;
-}
-#mw_content a.external[href ^="ftp://"],
-.link-ftp {
-       /* @embed */
-       background: url(file_icon.gif) center right no-repeat;
-       padding-right: 18px;
-}
-#mw_content a.external[href ^="irc://"],
-#mw_content a.external[href ^="ircs://"],
-.link-irc {
-       /* @embed */
-       background: url(discussionitem_icon.gif) center right no-repeat;
-       padding-right: 18px;
-}
-
-#mw_content a.external[href $=".ogg"], #mw_content a.external[href $=".OGG"],
-#mw_content a.external[href $=".mid"], #mw_content a.external[href $=".MID"],
-#mw_content a.external[href $=".midi"], #mw_content a.external[href $=".MIDI"],
-#mw_content a.external[href $=".mp3"], #mw_content a.external[href $=".MP3"],
-#mw_content a.external[href $=".wav"], #mw_content a.external[href $=".WAV"],
-#mw_content a.external[href $=".wma"], #mw_content a.external[href $=".WMA"],
-.link-audio {
-       /* @embed */
-       background: url(audio.png) center right no-repeat;
-       padding-right: 13px;
-}
-#mw_content a.external[href $=".ogm"], #mw_content a.external[href $=".OGM"],
-#mw_content a.external[href $=".avi"], #mw_content a.external[href $=".AVI"],
-#mw_content a.external[href $=".mpeg"], #mw_content a.external[href $=".MPEG"],
-#mw_content a.external[href $=".mpg"], #mw_content a.external[href $=".MPG"],
-.link-video {
-       /* @embed */
-       background: url(video.png) center right no-repeat;
-       padding-right: 13px;
-}
-#mw_content a.external[href $=".pdf"], #mw_content a.external[href $=".PDF"],
-#mw_content a.external[href *=".pdf#"], #mw_content a.external[href *=".PDF#"],
-#mw_content a.external[href *=".pdf?"], #mw_content a.external[href *=".PDF?"],
-.link-document {
-       /* @embed */
-       background: url(document.png) center right no-repeat;
-       padding-right: 12px;
-}
-
-/* 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;
-}
-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 {
-       margin: .5em 0 .8em 1.4em;
-}
-/* @noflip */div.tleft {
-       margin: .5em 1.4em .8em 0;
-}
-img.thumbborder {
-       border: 1px solid #dddddd;
-}
-.mw-warning {
-       border: 1px solid #aaa;
-       background-color: #f9f9f9;
-       padding: 5px;
-       font-size: 95%;
-}
-
-#toc,
-.toc {
-       margin: 0 0 0 0;
-       padding: 0 0 0 0;
-       border-spacing: 0;
-       background-color: #f0f0f0;
-       border: solid 1px #bbbbbb;
-       display: -moz-inline-block;
-       display: inline-block;
-       display: table;
-
-       /* IE7 and earliers */
-       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 tr, #toc td {
-       margin: 0 0 0 0;
-       padding: 0 0 0 0;
-}
-
-#toctitle {
-       border-bottom: solid 1px #3c78b5;
-       background-color: #dddddd;
-       margin: 0 0 0 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: 0 1em 0 1em;
-       padding: 0;
-       text-align: left;
-}
-
-#toc ul ul,
-.toc ul ul {
-       margin: 0 0 0 2em;
-}
-
-#toc .toctoggle,
-.toc .toctoggle {
-       font-size: 94%;
-}
-
-.mw-warning {
-       margin-left: 50px;
-       margin-right: 50px;
-       text-align: center;
-}
-
-.catlinks {
-       border: solid 1px #bbbbbb;
-       background-color: #f0f0f0;
-       padding: 0.1em 0.3em 0.1em 0.3em;
-       margin: 0 0 0 0;
-}
-
-#mw_header h1,
-#p-personal,
-#p-cactions {
-       overflow: hidden;
-}
-
-/* disable interwiki styling */
-#mw_content a.extiw,
-#mw_content a.extiw:active {
-       color: #36b;
-}
-#mw_content a.external {
-       color: #36b;
-}
-
-
-.redirectText {
-       font-size: 150%;
-       margin: 5px;
-}
-
-.printfooter {
-       display: none;
-}
-
-.sharedUploadNotice {
-       font-style: italic;
-}
-
-span.updatedmarker {
-       color: black;
-       background-color: #0f0;
-}
-
-.previewnote {
-       text-indent: 3em;
-       color: #c00;
-       border-bottom: 1px solid #aaa;
-       padding-bottom: 1em;
-       margin-bottom: 1em;
-}
-
-.previewnote p {
-       margin: 0;
-       padding: 0;
-}
-
-.editExternally {
-       border: 1px solid gray;
-       background-color: #ffffff;
-       padding: 3px;
-       margin-top: 0.5em;
-       float: left;
-       font-size: small;
-       text-align: center;
-}
-.editExternallyHelp {
-       font-style: italic;
-       color: gray;
-}
-
-.toggle {
-       margin-left: 2em;
-       text-indent: -2em;
-}
-
-table.collapsed tr.collapsable {
-       display: none;
-}
-
-input#wpSummary {
-       width: 80%;
-}
-
-/* @bug 1714 */
-input#wpSave, input#wpDiff {
-       margin-right: 0.33em;
-}
-
-#wpSave {
-       font-weight: bold;
-}
-
-/* noarticletext */
-div.noarticletext {
-       border: 1px solid #ccc;
-       background: #fff;
-       padding: .2em 1em;
-       color: #000;
-}
-
-div#searchTargetContainer {
-       left: 10px;
-       top: 10px;
-       width: 90%;
-       background: white;
-}
-
-div#searchTarget {
-       padding: 3px;
-       margin: 5px;
-       background: #F0F0F0;
-       border: solid 1px blue;
-}
-
-div#searchTarget ul li {
-       list-style: none;
-}
-
-div#searchTarget ul li:before {
-       color: orange;
-       content: "\00BB \0020";
-}
-
-div#searchTargetHide {
-       float: right;
-       border: solid 1px black;
-       background: #DCDCDC;
-       padding: 2px;
-}
-
-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: 1.5em;
-}
-
-.mw-summary-preview {
-       margin: 0.1em 0;
-}
-
-/* Friendlier slave lag warnings */
-div.mw-lag-warn-normal,
-div.mw-lag-warn-high {
-       padding: 3px;
-       text-align: center;
-       margin: 3px auto;
-}
-div.mw-lag-warn-normal {
-       border: 1px solid #FFCC66;
-       background-color: #FFFFCC;
-}
-div.mw-lag-warn-high {
-       font-weight: bold;
-       border: 2px solid #FF0033;
-       background-color: #FFCCCC;
-}
-
-.MediaTransformError {
-       background-color: #ccc;
-       padding: 0.1em;
-}
-.MediaTransformError td {
-       text-align: center;
-       vertical-align: middle;
-       font-size: 90%;
-}
-ul {
-       line-height: 1.5em;
-       list-style-type: square;
-       margin: .3em 0 0 1.5em;
-       padding: 0;
-       /* @embed */
-       list-style-image: url(bullet.gif);
-}
-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;
-}
-
-#p-cactions li.new a {
-       color: #cc2200;
-}
-
-span.subpages {
-       font-size: 80%;
-       display: block;
-}
-
-pre, .mw-code {
-       border: solid 1px #3c78b5;
-       padding: 0.4em;
-       background-color: #f0f0f0;
-}
-
-.usermessage {
-       background-color: #dadaff;
-}
-
-.mw-topboxes {
-       border-collapse: collapse;
-       margin: 0 -1em 1em -1em;
-       padding: 0 0 8px 0;
-       /* @embed */
-       background: url(footer-grad.png) repeat-x bottom left;
-}
-
-.mw-topbox p {
-       padding: 0 0 0 0;
-       margin: 0 0 0 0;
-}
-
-.mw-topbox {
-       color: black;
-       font-weight: bold;
-       margin: 0 0 0 0;
-       padding: 0 1em 0 1em;
-       vertical-align: middle;
-       border-collapse: collapse;
-       border-bottom: solid 1px #bbbbbb;
-}
-
-#siteSub {
-       background-color: #dddddd;
-}
-
-/* emulate center */
-.center {
-       width: 100%;
-       text-align: center;
-}
-*.center * {
-       margin-left: auto;
-       margin-right: auto;
-}
-
-/* table standards */
-.toccolours {
-       border: 1px solid #bbbbbb;
-       background-color: #f0f0f0;
-       border-spacing: 0pt;
-       margin: 0pt;
-       padding: 0pt;
-}
-
-/* Tooltips are outside of the normal body code, so this helps make the size of the text sensible */
-.tipsy {
-       font-size: 130%;
-}
-
-/**
- * Lists:
- * The following lines don't have a visible effect on non-Gecko browsers
- * They fix a problem ith Gecko browsers rendering lists to the right of
- * left-floated objects in an RTL layout.
- */
-/* @noflip */
-html > body.rtl div#mw_contentholder ul {
-       display: table;
-}
-
-/* @noflip */
-html > body.rtl div#mw_contentholder ul#filetoc {
-       display: block;
-}
diff --git a/skins/modern/news_icon.png b/skins/modern/news_icon.png
deleted file mode 100644 (file)
index 4d3cb47..0000000
Binary files a/skins/modern/news_icon.png and /dev/null differ
diff --git a/skins/modern/print.css b/skins/modern/print.css
deleted file mode 100644 (file)
index 150d2d2..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-#mw_portlets,
-#p-cactions,
-#p-personal,
-#jump-to-nav,
-#footer,
-.mw-editsection,
-.mw-editsection-like,
-.noprint {
-       display: none;
-}
diff --git a/skins/modern/video.png b/skins/modern/video.png
deleted file mode 100644 (file)
index e535c0c..0000000
Binary files a/skins/modern/video.png and /dev/null differ
index f3e4100..cd9399f 100644 (file)
@@ -6,29 +6,35 @@ div#column-content {
        margin-left: 0;
        height: 1%;
 }
+
 div#column-content div#content {
        margin-left: 12.2em;
        margin-top: 3em;
        height: 1%;
 }
+
 .rtl div#column-content div#content {
        margin-right: 12.2em;
        margin-left: 0;
 }
+
 div#column-one {
        position: absolute;
        top: 0;
        left: 0;
        z-index: 4;
 }
+
 .rtl div#column-one {
        left: auto;
        right: 0;
 }
+
 div#footer {
        margin-left: 13.6em;
        border-left: 1px solid #fabd23;
 }
+
 .rtl div#footer {
        margin-left: 0;
        margin-right: 13.6em;
@@ -59,6 +65,7 @@ div#footer {
        cursor: default;
        float: none !important;
 }
+
 #p-cactions li a {
        display: inline-block !important;
        vertical-align: top;
@@ -66,17 +73,21 @@ div#footer {
        border: solid #aaa;
        border-width: 1px 1px 0;
 }
+
 #p-cactions li.selected a {
        border-color: #fabd23;
        padding-bottom: 0.17em;
 }
+
 #p-cactions li a:hover {
        padding-bottom: 0.17em;
 }
+
 #p-navigation a {
        display: inline-block;
        width: 100%;
 }
+
 #portal-personaltools {
        padding-bottom: 0.1em;
 }
@@ -92,10 +103,12 @@ div#footer {
 #p-logo a:hover {
        cursor: pointer;
 }
+
 div.visualClear {
-       width:100%;
+       width: 100%;
        line-height: 0;
 }
+
 textarea {
        width: 96%;
 }
index e8d3a8f..42f9ce6 100644 (file)
@@ -8,12 +8,12 @@ div#column-content div#content {
        margin-top: 3em;
        height: 1%;
 }
+
 .rtl div#column-content div#content {
        margin-right: 12.2em;
        margin-left: 0;
 }
 
-
 .rtl div#column-one {
        /* For some reason it tries to inherit the padding-top into every div,
         * and I can't figure out how to get it back off.
@@ -37,13 +37,13 @@ li#pt-userpage, li#pt-anonuserpage, li#pt-login {
        padding-right: 0;
        padding-left: 16px;
 }
+
 /* the tabs */
 
 #p-cactions {
        z-index: 3;
 }
 
-
 #p-cactions li {
        padding-bottom: 0 !important;
        border: none;
@@ -59,20 +59,25 @@ li#pt-userpage, li#pt-anonuserpage, li#pt-login {
        border: solid #aaa;
        border-width: 1px 1px 0;
 }
+
 #p-cactions li.selected a {
        border-color: #fabd23;
        padding-bottom: 0.17em;
 }
+
 #p-cactions li a:hover {
        padding-bottom: 0.17em;
 }
+
 #p-navigation a {
        display: inline-block;
        width: 100%;
 }
+
 #portal-personaltools {
        padding-bottom: 0.1em;
 }
+
 textarea {
        width: 96%;
 }
@@ -85,7 +90,6 @@ div.tleft {
 }
 */
 
-
 div#footer li {
        /* Work around bug with inline <li> tags with right margins and nowrap */
        margin-right: 0;
index c32e869..cb76ae3 100644 (file)
@@ -15,20 +15,24 @@ div#column-content {
        margin: 0 0 .6em -12.2em;
        padding: 0;
 }
+
 div#content {
        margin: 2.8em 0 0 12.2em;
        padding: 1em;
        position: relative;
        z-index: 2;
 }
+
 div#column-one {
        padding-top: 160px;
 }
+
 /* Hide, but keep accessible for screen-readers */
 #column-one h2 {
        position: absolute;
        top: -9999px;
 }
+
 div#content {
        background: white;
        color: black;
@@ -36,6 +40,7 @@ div#content {
        border-right: none;
        line-height: 1.5em;
 }
+
 /* the left column width is specified in class .portlet */
 
 /* Font size:
@@ -67,9 +72,11 @@ div#globalWrapper {
 a {
        color: #002bb8;
 }
+
 a:visited {
        color: #5a3696;
 }
+
 a.new,
 #p-personal a.new {
        color: #cc2200;
@@ -96,6 +103,7 @@ pre, .mw-code {
 #firstHeading {
        padding-top: 0;
 }
+
 /*
 ** the main content area
 */
@@ -104,9 +112,11 @@ pre, .mw-code {
        font-size: 95%;
        padding: 0 0.9em;
 }
+
 #localNotice {
        margin: 0;
 }
+
 #siteNotice p {
        margin: 0;
        padding: 0;
@@ -147,29 +157,34 @@ table.rimage {
        background: url(external-ltr.png) center right no-repeat;
        padding-right: 13px;
 }
+
 #bodyContent a.external[href ^="https://"],
 .link-https {
        /* @embed */
        background: url(lock_icon.gif) center right no-repeat;
        padding-right: 16px;
 }
+
 #bodyContent a.external[href ^="mailto:"],
 .link-mailto {
        /* @embed */
        background: url(mail_icon.gif) center right no-repeat;
        padding-right: 18px;
 }
+
 #bodyContent a.external[href ^="news:"] {
        /* @embed */
        background: url(news_icon.png) center right no-repeat;
        padding-right: 18px;
 }
+
 #bodyContent a.external[href ^="ftp://"],
 .link-ftp {
        /* @embed */
        background: url(file_icon.gif) center right no-repeat;
        padding-right: 18px;
 }
+
 #bodyContent a.external[href ^="irc://"],
 #bodyContent a.external[href ^="ircs://"],
 .link-irc {
@@ -177,6 +192,7 @@ table.rimage {
        background: url(discussionitem_icon.gif) center right no-repeat;
        padding-right: 18px;
 }
+
 #bodyContent a.external[href $=".ogg"], #bodyContent a.external[href $=".OGG"],
 #bodyContent a.external[href $=".mid"], #bodyContent a.external[href $=".MID"],
 #bodyContent a.external[href $=".midi"], #bodyContent a.external[href $=".MIDI"],
@@ -188,6 +204,7 @@ table.rimage {
        background: url(audio.png) center right no-repeat;
        padding-right: 13px;
 }
+
 #bodyContent a.external[href $=".ogm"], #bodyContent a.external[href $=".OGM"],
 #bodyContent a.external[href $=".avi"], #bodyContent a.external[href $=".AVI"],
 #bodyContent a.external[href $=".mpeg"], #bodyContent a.external[href $=".MPEG"],
@@ -197,6 +214,7 @@ table.rimage {
        background: url(video.png) center right no-repeat;
        padding-right: 13px;
 }
+
 #bodyContent a.external[href $=".pdf"], #bodyContent a.external[href $=".PDF"],
 #bodyContent a.external[href *=".pdf#"], #bodyContent a.external[href *=".PDF#"],
 #bodyContent a.external[href *=".pdf?"], #bodyContent a.external[href *=".PDF?"],
@@ -232,6 +250,7 @@ table.rimage {
        width: 11.6em;
        overflow: hidden;
 }
+
 .portlet h3 {
        background: transparent;
        padding: 0 1em 0 .5em;
@@ -242,6 +261,7 @@ table.rimage {
        font-weight: normal;
        white-space: nowrap;
 }
+
 .pBody {
        font-size: 95%;
        background-color: white;
@@ -250,16 +270,19 @@ table.rimage {
        border: 1px solid #aaa;
        padding: 0 .8em .3em .5em;
 }
+
 /* allows .pBody styles to wrap around content added via BaseTemplateAfterPortlet hook */
 .pBody:after {
        content: '';
        clear: both;
        display: block;
 }
+
 .portlet ul {
        line-height: 1.5em;
        font-size: 95%;
 }
+
 .portlet li {
        padding: 0;
        margin: 0;
@@ -278,9 +301,11 @@ table.rimage {
        width: 12em;
        overflow: visible;
 }
+
 #p-logo h3 {
        display: none;
 }
+
 #p-logo a,
 #p-logo a:hover {
        display: block;
@@ -298,28 +323,34 @@ table.rimage {
        position: relative;
        z-index: 3;
 }
+
 input.searchButton {
        margin-top: 1px;
        font-size: 95%;
 }
+
 #searchGoButton {
        padding-left: .5em;
        padding-right: .5em;
        font-weight: bold;
 }
+
 #searchInput {
        width: 10.9em;
        margin: 0;
        font-size: 95%;
 }
+
 #p-search .pBody {
        padding: .5em .4em .4em .4em;
        text-align: center;
 }
+
 #p-search #searchform div div {
        margin-top: .4em;
        font-size: 95%;
 }
+
 /*
 ** the personal toolbar
 */
@@ -329,6 +360,7 @@ input.searchButton {
        top: 0;
        z-index: 3;
 }
+
 #p-personal {
        width: 100%;
        white-space: nowrap;
@@ -339,9 +371,11 @@ input.searchButton {
        overflow: visible;
        line-height: 1.2em;
 }
+
 #p-personal h3 {
        display: none;
 }
+
 #p-personal .portlet,
 #p-personal .pBody {
        z-index: 0;
@@ -351,6 +385,7 @@ input.searchButton {
        overflow: visible;
        background: none;
 }
+
 /* this is the ul contained in the portlet */
 #p-personal ul {
        border: none;
@@ -365,6 +400,7 @@ input.searchButton {
        background: none;
        cursor: default;
 }
+
 #p-personal li {
        z-index: 0;
        border: none;
@@ -375,20 +411,24 @@ input.searchButton {
        line-height: 1.2em;
        background: none;
 }
+
 #p-personal li a {
        text-decoration: none;
        color: #005896;
        padding-bottom: .2em;
        background: none;
 }
+
 #p-personal li a:hover {
        background-color: white;
        padding-bottom: .2em;
        text-decoration: none;
 }
+
 #p-personal li.active a:hover {
        background-color: transparent;
 }
+
 /* The icon in front of the username / login link */
 li#pt-userpage,
 li#pt-anonuserpage,
@@ -397,17 +437,21 @@ li#pt-login {
        background: url(user.gif) top left no-repeat;
        padding-left: 20px;
 }
+
 #p-personal ul {
        text-transform: lowercase;
 }
+
 /* Don't lowercase username or IP addresses (IPv6) */
 li#pt-userpage,
 li#pt-anonuserpage {
        text-transform: none;
 }
+
 #p-personal li.active {
        font-weight: bold;
 }
+
 /*
 ** the page-related actions- page/talk, edit etc
 */
@@ -425,10 +469,12 @@ li#pt-anonuserpage {
        padding-left: 1em;
        font-size: 95%;
 }
+
 #p-cactions ul {
        list-style-type: none;
        list-style-image: none;
 }
+
 #p-cactions li {
        display: inline;
        border: 1px solid #aaa;
@@ -438,10 +484,12 @@ li#pt-anonuserpage {
        overflow: visible;
        background: white;
 }
+
 #p-cactions li.selected {
        border-color: #fabd23;
        font-weight: bold;
 }
+
 #p-cactions li a {
        background-color: #fbfbfb;
        color: #002bb8;
@@ -452,41 +500,51 @@ li#pt-anonuserpage {
        margin: 0;
        text-decoration: none;
 }
+
 #p-cactions li.selected a {
        z-index: 3;
        background-color: white;
 }
+
 #p-cactions .new a {
        color: #ba0000;
 }
+
 #p-cactions li a:hover {
        z-index: 3;
        text-decoration: none;
        background-color: white;
 }
+
 #p-cactions h3 {
        display: none;
 }
+
 #p-cactions li.istalk {
        margin-right: 0;
 }
+
 #p-cactions li.istalk a {
        padding-right: .5em;
 }
+
 #p-cactions #ca-addsection a {
        padding-left: .4em;
        padding-right: .4em;
 }
+
 /* offsets to distinguish the tab groups */
 li#ca-talk {
        margin-right: 1.6em;
 }
+
 li#ca-watch,
 li#ca-unwatch,
 li#ca-varlang-0,
 li#ca-print {
        margin-left: 1.6em;
 }
+
 #p-cactions .pBody {
        font-size: 1em;
        background-color: transparent;
@@ -495,6 +553,7 @@ li#ca-print {
        border: 0;
        padding: 0;
 }
+
 #p-cactions li a {
        text-transform: lowercase;
 }
@@ -517,6 +576,7 @@ li#ca-print {
 #t-ispermalink, #t-iscite {
        color: #999;
 }
+
 /*
 ** footer
 */
@@ -530,19 +590,23 @@ div#footer {
        text-align: center;
        font-size: 90%;
 }
+
 div#footer li {
        display: inline;
        margin: 0 1.3em;
 }
+
 #f-poweredbyico, #f-copyrightico {
        margin: 0 8px;
        position: relative;
        top: -2px; /* Bump it up just a tad */
 }
+
 #f-poweredbyico {
        float: right;
        height: 1%;
 }
+
 #f-copyrightico {
        float: left;
        height: 1%;
@@ -562,10 +626,12 @@ div#footer li {
        width: 100%;
        clear: both;
 }
+
 #preftoc li {
        background-color: #f0f0f0;
        color: #000;
 }
+
 #preftoc li {
        margin: 1px -2px 1px 2px;
        float: left;
@@ -579,6 +645,7 @@ div#footer li {
        list-style-image: none;
        z-index: 3;
 }
+
 #preftoc li.selected {
        font-weight: bold;
        background-color: #f9f9f9;
@@ -589,9 +656,11 @@ div#footer li {
        padding-top: 2px;
        margin-right: -3px;
 }
+
 #preftoc > li.selected {
        top: 2px;
 }
+
 #preftoc a,
 #preftoc a:active {
        display: block;
@@ -600,10 +669,12 @@ div#footer li {
        position: relative;
        text-decoration: none;
 }
+
 #preftoc li.selected a {
        cursor: default;
        text-decoration: none;
 }
+
 #preferences {
        margin: 0;
        border: 1px solid #aaa;
@@ -611,6 +682,7 @@ div#footer li {
        padding: 1.5em;
        background-color: #F9F9F9;
 }
+
 .prefsection {
        border: none;
        padding: 0;
@@ -620,12 +692,15 @@ div#footer li {
 .prefsection legend {
        font-weight: bold;
 }
+
 .prefsection table, .prefsection legend {
        background-color: #F9F9F9;
 }
+
 .mainLegend {
        display: none;
 }
+
 td.htmlform-tip {
        font-size: x-small;
        padding: .2em 2em;
@@ -694,6 +769,7 @@ span.updatedmarker {
        font-size: small;
        text-align: center;
 }
+
 .editExternallyHelp {
        font-style: italic;
        color: gray;
@@ -793,10 +869,12 @@ div.mw-lag-warn-high {
        text-align: center;
        margin: 3px auto;
 }
+
 div.mw-lag-warn-normal {
        border: 1px solid #FFCC66;
        background-color: #FFFFCC;
 }
+
 div.mw-lag-warn-high {
        font-weight: bold;
        border: 2px solid #FF0033;
@@ -807,6 +885,7 @@ div.mw-lag-warn-high {
        background-color: #ccc;
        padding: 0.1em;
 }
+
 .MediaTransformError td {
        text-align: center;
        vertical-align: middle;
@@ -830,6 +909,5 @@ div.mw-lag-warn-high {
 
 /* mediawiki.notification */
 .skin-monobook .mw-notification {
-       -webkit-box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.125);
        box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.125);
 }
diff --git a/skins/vector/collapsibleNav.js b/skins/vector/collapsibleNav.js
deleted file mode 100644 (file)
index 45258e5..0000000
+++ /dev/null
@@ -1,152 +0,0 @@
-/**
- * Collapsible navigation for Vector
- */
-( function ( mw, $ ) {
-       'use strict';
-       var map;
-
-       // Use the same function for all navigation headings - don't repeat
-       function toggle( $element ) {
-               var isCollapsed = $element.parent().is( '.collapsed' );
-
-               $.cookie(
-                       'vector-nav-' + $element.parent().attr( 'id' ),
-                       isCollapsed,
-                       { 'expires': 30, 'path': '/' }
-               );
-
-               $element
-                       .parent()
-                       .toggleClass( 'expanded' )
-                       .toggleClass( 'collapsed' )
-                       .find( '.body' )
-                       .slideToggle( 'fast' );
-               isCollapsed = !isCollapsed;
-
-               $element
-                       .find( '> a' )
-                       .attr( {
-                               'aria-pressed': isCollapsed ? 'false' : 'true',
-                               'aria-expanded': isCollapsed ? 'false' : 'true'
-                       } );
-       }
-
-       /* Browser Support */
-
-       map = {
-               // Left-to-right languages
-               ltr: {
-                       // Collapsible Nav is broken in Opera < 9.6 and Konqueror < 4
-                       opera: [['>=', 9.6]],
-                       konqueror: [['>=', 4.0]],
-                       blackberry: false,
-                       ipod: false,
-                       iphone: false,
-                       ps3: false
-               },
-               // Right-to-left languages
-               rtl: {
-                       opera: [['>=', 9.6]],
-                       konqueror: [['>=', 4.0]],
-                       blackberry: false,
-                       ipod: false,
-                       iphone: false,
-                       ps3: false
-               }
-       };
-       if ( !$.client.test( map ) ) {
-               return true;
-       }
-
-       $( function ( $ ) {
-               var $headings, tabIndex;
-
-               /* General Portal Modification */
-
-               // Always show the first portal
-               $( '#mw-panel > .portal:first' ).addClass( 'first persistent' );
-               // Apply a class to the entire panel to activate styles
-               $( '#mw-panel' ).addClass( 'collapsible-nav' );
-               // Use cookie data to restore preferences of what to show and hide
-               $( '#mw-panel > .portal:not(.persistent)' )
-                       .each( function ( i ) {
-                               var id = $(this).attr( 'id' ),
-                                       state = $.cookie( 'vector-nav-' + id );
-                               $(this).find( 'ul:first' ).attr( 'id', id + '-list' );
-                               // Add anchor tag to heading for better accessibility
-                               $( this ).find( 'h3' ).wrapInner(
-                                       $( '<a>' )
-                                               .attr( {
-                                                       href: '#',
-                                                       'aria-haspopup': 'true',
-                                                       'aria-controls': id + '-list',
-                                                       role: 'button'
-                                               } )
-                                               .click( false )
-                               );
-                               // In the case that we are not showing the new version, let's show the languages by default
-                               if (
-                                       state === 'true' ||
-                                       ( state === null && i < 1 ) ||
-                                       ( state === null && id === 'p-lang' )
-                               ) {
-                                       $(this)
-                                               .addClass( 'expanded' )
-                                               .removeClass( 'collapsed' )
-                                               .find( '.body' )
-                                               .hide() // bug 34450
-                                               .show();
-                                       $(this).find( 'h3 > a' )
-                                               .attr( {
-                                                       'aria-pressed': 'true',
-                                                       'aria-expanded': 'true'
-                                               } );
-                               } else {
-                                       $(this)
-                                               .addClass( 'collapsed' )
-                                               .removeClass( 'expanded' );
-                                       $(this).find( 'h3 > a' )
-                                               .attr( {
-                                                       'aria-pressed': 'false',
-                                                       'aria-expanded': 'false'
-                                               } );
-                               }
-                               // Re-save cookie
-                               if ( state !== null ) {
-                                       $.cookie( 'vector-nav-' + $(this).attr( 'id' ), state, { 'expires': 30, 'path': '/' } );
-                               }
-                       } );
-
-               /* Tab Indexing */
-
-               $headings = $( '#mw-panel > .portal:not(.persistent) > h3' );
-
-               // Get the highest tab index
-               tabIndex = $( document ).lastTabIndex() + 1;
-
-               // Fix the search not having a tabindex
-               $( '#searchInput' ).attr( 'tabindex', tabIndex++ );
-
-               // Make it keyboard accessible
-               $headings.attr( 'tabindex', function () {
-                       return tabIndex++;
-               });
-
-               // Toggle the selected menu's class and expand or collapse the menu
-               $( '#mw-panel' )
-                       .delegate( '.portal:not(.persistent) > h3', 'keydown', function ( e ) {
-                               // Make the space and enter keys act as a click
-                               if ( e.which === 13 /* Enter */ || e.which === 32 /* Space */ ) {
-                                       toggle( $(this) );
-                               }
-                       } )
-                       .delegate( '.portal:not(.persistent) > h3', 'mousedown', function ( e ) {
-                               if ( e.which !== 3 ) { // Right mouse click
-                                       toggle( $(this) );
-                                       $(this).blur();
-                               }
-                               return false;
-                       } );
-       });
-
-}( mediaWiki, jQuery ) );
index 0e49744..9344433 100644 (file)
@@ -9,7 +9,7 @@
                        return this;
                }
                // Merge options into the defaults
-               var $settings = $.extend( {}, $.collapsibleTabs.defaults, options );
+               var settings = $.extend( {}, $.collapsibleTabs.defaults, options );
 
                this.each( function () {
                        var $el = $( this );
@@ -17,9 +17,9 @@
                        $.collapsibleTabs.instances = ( $.collapsibleTabs.instances.length === 0 ?
                                $el : $.collapsibleTabs.instances.add( $el ) );
                        // attach the settings to the elements
-                       $el.data( 'collapsibleTabsSettings', $settings );
+                       $el.data( 'collapsibleTabsSettings', settings );
                        // attach data to our collapsible elements
-                       $el.children( $settings.collapsible ).each( function () {
+                       $el.children( settings.collapsible ).each( function () {
                                $.collapsibleTabs.addData( $( this ) );
                        } );
                } );
                        }
                },
                addData: function ( $collapsible ) {
-                       var $settings = $collapsible.parent().data( 'collapsibleTabsSettings' );
-                       if ( $settings ) {
+                       var settings = $collapsible.parent().data( 'collapsibleTabsSettings' );
+                       if ( settings ) {
                                $collapsible.data( 'collapsibleTabsSettings', {
-                                       expandedContainer: $settings.expandedContainer,
-                                       collapsedContainer: $settings.collapsedContainer,
+                                       expandedContainer: settings.expandedContainer,
+                                       collapsedContainer: settings.collapsedContainer,
                                        expandedWidth: $collapsible.width(),
                                        prevElement: $collapsible.prev()
                                } );
                        }
                },
                getSettings: function ( $collapsible ) {
-                       var $settings = $collapsible.data( 'collapsibleTabsSettings' );
-                       if ( !$settings ) {
+                       var settings = $collapsible.data( 'collapsibleTabsSettings' );
+                       if ( !settings ) {
                                $.collapsibleTabs.addData( $collapsible );
-                               $settings = $collapsible.data( 'collapsibleTabsSettings' );
+                               settings = $collapsible.data( 'collapsibleTabsSettings' );
                        }
-                       return $settings;
+                       return settings;
                },
                handleResize: function () {
                        $.collapsibleTabs.instances.each( function () {
diff --git a/skins/vector/components/collapsibleNav.less b/skins/vector/components/collapsibleNav.less
deleted file mode 100644 (file)
index e6f5c9a..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-/**
- * LESS Stylesheet for collapsible nav
- */
-@import "mediawiki.mixins.less";
-
-#mw-panel.collapsible-nav {
-       .portal {
-               background-position: left top;
-               background-repeat: no-repeat;
-               .background-image('images/portal-break.png');
-               padding: 0.25em 0 !important;
-               margin: -11px 9px 10px 11px;
-
-               h3 {
-                       font-size: @menu-main-heading-font-size;
-                       color: @collapsible-nav-heading-color;
-                       font-weight: normal;
-                       background-position: left center;
-                       background-repeat: no-repeat;
-                       .background-image-svg('images/arrow-expanded.svg', 'images/arrow-expanded.png');
-                       padding: @collapsible-nav-heading-padding;
-                       margin-bottom: 0;
-
-                       &:hover {
-                               cursor: pointer;
-                               text-decoration: none;
-                       }
-
-                       a {
-                               color: @collapsible-nav-heading-color;
-                               text-decoration: none;
-                       }
-               }
-
-               .body {
-                       margin: @collapsible-nav-body-margin;
-                       background-image: none !important;
-                       padding-top: 0;
-                       display: none;
-
-                       ul {
-                               li {
-                                       padding: 0.25em 0;
-                               }
-                       }
-               }
-
-
-               /* First */
-               &.first {
-                       background-image: none;
-                       margin-top: 0;
-                       h3 {
-                               display: none;
-                       }
-               }
-
-               /* Persistent */
-               &.persistent {
-                       .body {
-                               display: block;
-                               margin-left: 0.5em;
-                       }
-
-                       h3 {
-                               background-image: none !important;
-                               padding-left: 0.7em;
-                               cursor: default;
-                       }
-               }
-
-               /* Collapsed */
-               &.collapsed {
-                       h3 {
-                               color: @collapsible-nav-heading-collapsed-color;
-                               background-position: left center;
-                               background-repeat: no-repeat;
-                               .background-image-svg('images/arrow-collapsed-ltr.svg', 'images/arrow-collapsed-ltr.png');
-                               margin-bottom: 0;
-
-                               &:hover {
-                                       text-decoration: underline;
-                               }
-
-                               a {
-                                       color: @collapsible-nav-heading-collapsed-color;
-                               }
-                       }
-               }
-       }
-}
index 76d1873..f70c7a4 100644 (file)
@@ -127,7 +127,9 @@ pre, .mw-code {
        vertical-align: text-bottom;
 }
 
-#bodyContent {
+/* TODO: Remove #bodyContent selector (kept for backwards compatibility with cached html) */
+#bodyContent,
+.mw-body-content {
        position: relative;
        line-height: @content-line-height;
        font-size: @content-font-size;
index f3a5a49..8b384ac 100644 (file)
@@ -1,6 +1,5 @@
 @import "mediawiki.mixins";
 @import "personalMenu";
-@import "collapsibleNav";
 @import "search";
 @import "tabs";
 
@@ -87,37 +86,37 @@ div#mw-panel {
        left: 0;
 
        div.portal {
-               padding-bottom: 1.5em;
+               margin: 0 0.6em 0 0.7em;
+               padding: 0.25em 0;
                direction: ltr;
+               background-position: top left;
+               background-repeat: no-repeat;
+               .background-image('images/portal-break.png');
 
                h3 {
+                       font-size: @menu-main-heading-font-size;
+                       color: @menu-main-heading-color;
                        font-weight: normal;
-                       color: #444;
+                       margin: 0;
                        padding: @menu-main-heading-padding;
                        cursor: default;
                        border: none;
-                       font-size: @menu-main-heading-font-size;
                }
 
                div.body {
-                       padding-top: 0.5em;
                        margin: @menu-main-body-margin;
-
-                       .background-image('images/portal-break.png');
-                       background-repeat: no-repeat;
-                       background-position: top left;
+                       padding-top: 0;
 
                        ul {
                                list-style-type: none;
                                list-style-image: none;
-                               padding: @menu-main-body-padding;
                                margin: 0;
+                               padding: @menu-main-body-padding;
 
                                li {
                                        line-height: 1.125em;
-                                       padding: 0;
-                                       padding-bottom: 0.5em;
                                        margin: 0;
+                                       padding: 0.25em 0;
                                        font-size: @menu-main-body-font-size;
                                        word-wrap: break-word;
 
@@ -130,5 +129,16 @@ div#mw-panel {
                                }
                        }
                }
+
+               &.first {
+                       background-image: none;
+                       margin-top: 0;
+                       h3 {
+                               display: none;
+                       }
+                       div.body {
+                               margin-left: 0.5em;
+                       }
+               }
        }
 }
index cadb61c..05a1e61 100644 (file)
@@ -14,7 +14,6 @@
                padding: 0.75em 1.5em;
                border: solid 1px @content-border-color;
                border-radius: 0.75em;
-               -webkit-box-shadow: 0 2px 10px 0 rgba(0, 0, 0, 0.125);
                box-shadow: 0 2px 10px 0 rgba(0, 0, 0, 0.125);
        }
 }
index b76a825..a389ed6 100644 (file)
@@ -5,7 +5,6 @@
 #ca-watch.icon a {
        margin: 0;
        padding: 0;
-       outline: none;
        display: block;
        width: 26px;
        /* This hides the text but shows the background image */
 #ca-watch.icon a.loading {
        .background-image-svg('images/watch-icon-loading.svg', 'images/watch-icon-loading.png');
        .rotation(700ms);
+       /* Suppress the hilarious rotating focus outline on Firefox */
+       outline: none;
+       cursor: default;
+       pointer-events: none;
        background-position: 50% 60%;
        -webkit-transform-origin: 50% 57%;
        transform-origin: 50% 57%;
index 5a1fc05..8b286f4 100644 (file)
@@ -1,5 +1,7 @@
 /* Vector screen styles for high definition displays */
 
+@import "variables.less";
+
 div#content {
        margin-left: 11em;
        padding: 1.25em 1.5em 1.5em 1.5em;
diff --git a/skins/vector/screen.less b/skins/vector/screen.less
new file mode 100644 (file)
index 0000000..f7b374f
--- /dev/null
@@ -0,0 +1,10 @@
+/* Vector screen styles */
+
+@import "variables.less";
+
+@import "components/common.less";
+@import "components/animations.less";
+@import "components/navigation.less";
+@import "components/footer.less";
+@import 'components/notifications.less';
+@import "components/externalLinks.less";
diff --git a/skins/vector/styles.less b/skins/vector/styles.less
deleted file mode 100644 (file)
index 819286e..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-@import "variables.less";
-
-@media screen {
-       @import "components/common.less";
-       @import "components/animations.less";
-       @import "components/navigation.less";
-       @import "components/footer.less";
-       @import 'components/notifications.less';
-       @import "components/externalLinks.less";
-}
-
-@media screen and (min-width: 982px) {
-       @import "screen-hd.less";
-}
index 438fbcf..41cb1da 100644 (file)
 
 // Main menu
 @menu-main-font-size: inherit;
+
 @menu-main-heading-font-size: 0.75em;
-@menu-main-heading-padding: 0 1.75em 0.25em 0.25em;
+@menu-main-heading-padding: 0.25em 0 0.25em 0.25em;
+@menu-main-heading-color: #4d4d4d;
 
 @menu-main-body-font-size: 0.75em;
 @menu-main-body-link-color: #0645ad;
 @menu-main-body-link-visited-color: #0b0080;
 @menu-main-body-margin: 0 0 0 1.25em;
 @menu-main-body-padding: 0;
+
 @menu-main-logo-left: 0.5em;
 
 // Personal menu
 @menu-personal-font-size: 0.75em;
-
-// Collapsible nav
-@collapsible-nav-heading-color: #4d4d4d;
-@collapsible-nav-heading-collapsed-color: #0645ad;
-
-@collapsible-nav-heading-padding: 4px 0 3px 1.5em;
-@collapsible-nav-body-margin: 0 0 0 1.25em;
index 0bc114a..58ba2af 100644 (file)
@@ -2,6 +2,8 @@
  * Vector-specific scripts
  */
 jQuery( function ( $ ) {
+       $( '#searchInput' ).attr( 'tabindex', $( document ).lastTabIndex() + 1 );
+
        $( 'div.vectorMenu' ).each( function () {
                var $el = $( this );
                $el.find( '> h3 > a' ).parent()
@@ -25,6 +27,11 @@ jQuery( function ( $ ) {
                        .attr( 'tabindex', '-1' );
        } );
 
+       /**
+        * Sidebar
+        */
+       $( '#mw-panel > .portal:first' ).addClass( 'first' );
+
        /**
         * Collapsible tabs for Vector
         */
index 29c3269..37cf68f 100644 (file)
@@ -34,6 +34,7 @@ $wgAutoloadClasses += array(
        'TestFileIterator' => "$testDir/testHelpers.inc",
        'TestRecorder' => "$testDir/testHelpers.inc",
        'ITestRecorder' => "$testDir/testHelpers.inc",
+       'DjVuSupport' => "$testDir/testHelpers.inc",
 
        # tests/phpunit
        'MediaWikiTestCase' => "$testDir/phpunit/MediaWikiTestCase.php",
@@ -85,6 +86,7 @@ $wgAutoloadClasses += array(
 
        # tests/phpunit/media
        'FakeDimensionFile' => "$testDir/phpunit/includes/media/FakeDimensionFile.php",
+       'MediaWikiMediaTestCase' => "$testDir/phpunit/includes/media/MediaWikiMediaTestCase.php",
 
        # tests/phpunit/mocks
        'MockFSFile' => "$testDir/phpunit/mocks/filebackend/MockFSFile.php",
@@ -92,6 +94,7 @@ $wgAutoloadClasses += array(
        'MockBitmapHandler' => "$testDir/phpunit/mocks/media/MockBitmapHandler.php",
        'MockImageHandler' => "$testDir/phpunit/mocks/media/MockImageHandler.php",
        'MockSvgHandler' => "$testDir/phpunit/mocks/media/MockSvgHandler.php",
+       'MockDjVuHandler' => "$testDir/phpunit/mocks/media/MockDjVuHandler.php",
 
        # tests/parser
        'NewParserTest' => "$testDir/phpunit/includes/parser/NewParserTest.php",
index 235ddbf..a398596 100644 (file)
@@ -6,10 +6,10 @@
   },
   "devDependencies": {
     "grunt": "0.4.2",
-    "grunt-contrib-jshint": "0.9.2",
+    "grunt-contrib-jshint": "0.10.0",
     "grunt-contrib-watch": "0.6.1",
     "grunt-banana-checker": "0.1.0",
-    "grunt-jscs-checker": "0.4.1",
+    "grunt-jscs-checker": "0.4.4",
     "grunt-jsonlint": "1.0.4"
   }
 }
index 27d6bca..0bbee17 100644 (file)
@@ -64,6 +64,11 @@ class ParserTest {
         */
        private $dbClone;
 
+       /**
+        * @var DjVuSupport
+        */
+       private $djVuSupport;
+
        /**
         * @var string $oldTablePrefix Original table prefix
         */
@@ -136,6 +141,8 @@ class ParserTest {
                $this->runDisabled = isset( $options['run-disabled'] );
                $this->runParsoid = isset( $options['run-parsoid'] );
 
+               $this->djVuSupport = new DjVuSupport();
+
                $this->hooks = array();
                $this->functionHooks = array();
                self::setUp();
@@ -391,7 +398,11 @@ class ParserTest {
 
                foreach ( $filenames as $filename ) {
                        $contents = file_get_contents( $filename );
-                       preg_match_all( '/!!\s*(input|wikitext)\n(.*?)\n!!\s*(result|html|html\/\*|html\/php)/s', $contents, $matches );
+                       preg_match_all(
+                               '/!!\s*(input|wikitext)\n(.*?)\n!!\s*(result|html|html\/\*|html\/php)/s',
+                               $contents,
+                               $matches
+                       );
 
                        foreach ( $matches[1] as $match ) {
                                $dict .= $match . "\n";
@@ -545,6 +556,12 @@ class ParserTest {
                $user = $context->getUser();
                $options = ParserOptions::newFromContext( $context );
 
+               if ( isset( $opts['djvu'] ) ) {
+                       if ( !$this->djVuSupport->isEnabled() ) {
+                               return $this->showSkipped();
+                       }
+               }
+
                if ( isset( $opts['title'] ) ) {
                        $titleText = $opts['title'];
                } else {
@@ -746,6 +763,7 @@ class ParserTest {
 
                $settings = array(
                        'wgServer' => 'http://example.org',
+                       'wgServerName' => 'example.org',
                        'wgScript' => '/index.php',
                        'wgScriptPath' => '/',
                        'wgArticlePath' => '/wiki/$1',
@@ -997,6 +1015,34 @@ class ParserTest {
                                'fileExists'  => true
                ), $this->db->timestamp( '20010115123500' ), $user );
 
+               $image = wfLocalFile( Title::makeTitle( NS_FILE, 'Portrait.png' ) );
+               # again, note that size/width/height below are ignored; see above.
+               $image->recordUpload2( '', 'Upload of tall bitmap', 'Some tall bitmap', array(
+                       'size'        => 12345,
+                       'width'       => 180,
+                       'height'      => 240,
+                       'bits'        => 8,
+                       'media_type'  => MEDIATYPE_BITMAP,
+                       'mime'        => 'image/png',
+                       'metadata'    => serialize( array() ),
+                       'sha1'        => wfBaseConvert( '', 16, 36, 31 ),
+                       'fileExists'  => true
+               ), $this->db->timestamp( '20140515134200' ), $user );
+
+               $image = wfLocalFile( Title::makeTitle( NS_FILE, 'Portrait.svg' ) );
+               # again, note that size/width/height below are ignored; see above.
+               $image->recordUpload2( '', 'Upload of tall SVG', 'Some tall SVG', array(
+                       'size'        => 12345,
+                       'width'       => 180,
+                       'height'      => 240,
+                       'bits'        => 24,
+                       'media_type'  => MEDIATYPE_DRAWING,
+                       'mime'        => 'image/svg+xml',
+                       'metadata'    => serialize( array() ),
+                       'sha1'        => wfBaseConvert( '', 16, 36, 31 ),
+                       'fileExists'  => true
+               ), $this->db->timestamp( '20140325124200' ), $user );
+
                # This image will be blacklisted in [[MediaWiki:Bad image list]]
                $image = wfLocalFile( Title::makeTitle( NS_FILE, 'Bad.jpg' ) );
                $image->recordUpload2( '', 'zomgnotcensored', 'Borderline image', array(
@@ -1010,6 +1056,44 @@ class ParserTest {
                        'sha1' => wfBaseConvert( '3', 16, 36, 31 ),
                        'fileExists' => true
                ), $this->db->timestamp( '20010115123500' ), $user );
+
+               # A DjVu file
+               $image = wfLocalFile( Title::makeTitle( NS_FILE, 'LoremIpsum.djvu' ) );
+               $image->recordUpload2( '', 'Upload a DjVu', 'A DjVu', array(
+                       'size' => 3249,
+                       'width' => 2480,
+                       'height' => 3508,
+                       'media_type' => MEDIATYPE_BITMAP,
+                       'mime' => 'image/vnd.djvu',
+                       'metadata' => '<?xml version="1.0" ?>
+<!DOCTYPE DjVuXML PUBLIC "-//W3C//DTD DjVuXML 1.1//EN" "pubtext/DjVuXML-s.dtd">
+<DjVuXML>
+<HEAD></HEAD>
+<BODY><OBJECT height="3508" width="2480">
+<PARAM name="DPI" value="300" />
+<PARAM name="GAMMA" value="2.2" />
+</OBJECT>
+<OBJECT height="3508" width="2480">
+<PARAM name="DPI" value="300" />
+<PARAM name="GAMMA" value="2.2" />
+</OBJECT>
+<OBJECT height="3508" width="2480">
+<PARAM name="DPI" value="300" />
+<PARAM name="GAMMA" value="2.2" />
+</OBJECT>
+<OBJECT height="3508" width="2480">
+<PARAM name="DPI" value="300" />
+<PARAM name="GAMMA" value="2.2" />
+</OBJECT>
+<OBJECT height="3508" width="2480">
+<PARAM name="DPI" value="300" />
+<PARAM name="GAMMA" value="2.2" />
+</OBJECT>
+</BODY>
+</DjVuXML>',
+                       'sha1' => wfBaseConvert( '', 16, 36, 31 ),
+                       'fileExists' => true
+               ), $this->db->timestamp( '20010115123600' ), $user );
        }
 
        public function teardownDatabase() {
@@ -1088,6 +1172,16 @@ class ParserTest {
                        '<?xml version="1.0" encoding="utf-8"?>' .
                        '<svg xmlns="http://www.w3.org/2000/svg"' .
                        ' version="1.1" width="240" height="180"/>' );
+               wfMkdirParents( $dir . '/9/93', null, __METHOD__ );
+               copy( "$IP/tests/phpunit/data/media/Portrait.png", "$dir/9/93/Portrait.png" );
+               wfMkdirParents( $dir . '/f/fc', null, __METHOD__ );
+               file_put_contents( "$dir/f/fc/Portrait.svg",
+                       '<?xml version="1.0" encoding="utf-8"?>' .
+                       '<svg xmlns="http://www.w3.org/2000/svg"' .
+                       ' version="1.1" width="180" height="240"/>' );
+               wfMkdirParents( $dir . '/5/5f', null, __METHOD__ );
+               copy( "$IP/tests/phpunit/data/media/LoremIpsum.djvu", "$dir/5/5f/LoremIpsum.djvu" );
+
                return $dir;
        }
 
@@ -1155,6 +1249,11 @@ class ParserTest {
 
                                "$dir/0/09/Bad.jpg",
 
+                               "$dir/5/5f/LoremIpsum.djvu",
+                               "$dir/thumb/5/5f/LoremIpsum.djvu/page2-2480px-LoremIpsum.djvu.jpg",
+                               "$dir/thumb/5/5f/LoremIpsum.djvu/page2-3720px-LoremIpsum.djvu.jpg",
+                               "$dir/thumb/5/5f/LoremIpsum.djvu/page2-4960px-LoremIpsum.djvu.jpg",
+
                                "$dir/f/ff/Foobar.svg",
                                "$dir/thumb/f/ff/Foobar.svg/180px-Foobar.svg.png",
                                "$dir/thumb/f/ff/Foobar.svg/2000px-Foobar.svg.png",
@@ -1166,6 +1265,17 @@ class ParserTest {
                                "$dir/thumb/f/ff/Foobar.svg/langde-270px-Foobar.svg.png",
                                "$dir/thumb/f/ff/Foobar.svg/langde-360px-Foobar.svg.png",
 
+                               "$dir/9/93/Portrait.png",
+                               "$dir/thumb/9/93/Portrait.png/165px-Portrait.png",
+
+                               "$dir/f/fc/Portrait.svg",
+                               "$dir/thumb/f/fc/Portrait.svg/165px-Portrait.svg.png",
+                               "$dir/thumb/f/fc/Portrait.svg/225px-Portrait.svg.png",
+                               "$dir/thumb/f/fc/Portrait.svg/247px-Portrait.svg.png",
+                               "$dir/thumb/f/fc/Portrait.svg/330px-Portrait.svg.png",
+                               "$dir/thumb/f/fc/Portrait.svg/337px-Portrait.svg.png",
+                               "$dir/thumb/f/fc/Portrait.svg/450px-Portrait.svg.png",
+
                                "$dir/math/f/a/5/fa50b8b616463173474302ca3e63586b.png",
                        )
                );
@@ -1177,15 +1287,28 @@ class ParserTest {
                                "$dir/thumb/3/3a/Foobar.jpg",
                                "$dir/thumb/3/3a",
                                "$dir/thumb/3",
+                               "$dir/9/93",
+                               "$dir/9",
+                               "$dir/thumb/9/93/Portrait.png",
+                               "$dir/thumb/9/93/",
+                               "$dir/thumb/9/",
                                "$dir/e/ea",
                                "$dir/e",
+                               "$dir/f/fc/",
                                "$dir/f/ff/",
                                "$dir/f/",
+                               "$dir/thumb/f/fc/Portrait.svg",
+                               "$dir/thumb/f/fc/",
                                "$dir/thumb/f/ff/Foobar.svg",
                                "$dir/thumb/f/ff/",
                                "$dir/thumb/f/",
                                "$dir/0/09/",
                                "$dir/0/",
+                               "$dir/5/5f",
+                               "$dir/5",
+                               "$dir/thumb/5/5f/LoremIpsum.djvu",
+                               "$dir/thumb/5/5f",
+                               "$dir/thumb/5",
                                "$dir/thumb",
                                "$dir/math/f/a/5",
                                "$dir/math/f/a",
@@ -1279,6 +1402,19 @@ class ParserTest {
                return false;
        }
 
+       /**
+        * Print a skipped message.
+        *
+        * @return boolean
+        */
+       protected function showSkipped() {
+               if ( $this->showProgress ) {
+                       print $this->term->color( '1;33' ) . 'SKIPPED' . $this->term->reset() . "\n";
+               }
+
+               return true;
+       }
+
        /**
         * Run given strings through a diff and return the (colorized) output.
         * Requires writable /tmp directory and a 'diff' command in the PATH.
index e2bf9f6..55801aa 100644 (file)
@@ -3042,6 +3042,38 @@ should be left alone
 </p>
 !! end
 
+!! test
+Definition Lists: Hacky use to indent tables, with comments (bug 63979)
+!! wikitext
+<!-- foo -->
+::{|
+|foo
+|bar
+|}<!-- bar -->
+this text
+should be left alone
+!! html/parsoid
+<!-- foo -->
+<dl><dd><dl><dd><table><tr>
+<td>foo</td>
+<td>bar</td>
+</tr></table><!-- bar --></dd></dl></dd></dl>
+<p>this text
+should be left alone</p>
+!! end
+
+!! test
+Definition Lists: Hacky use to indent tables, with comment before table
+!! wikitext
+::<!-- foo -->{|
+|foo
+|}
+!! html/parsoid
+<dl><dd><dl><dd><!-- foo --><table><tr>
+<td>foo</td>
+</tr></table></dd></dl></dd></dl>
+!! end
+
 # Bug 52473
 !! test
 Definition Lists: Hacky use to indent tables (WS-insensitive)
@@ -3645,17 +3677,22 @@ Non-bracketed: http://example.com
 </p>
 !! end
 
+# parsoid doesn't explicitly mark autonumbered links, see bug 53505
 !! test
 External links: numbered
 !! wikitext
 Numbered: [http://example.com]
 Numbered: [http://example.net]
 Numbered: [http://example.com]
-!! html
+!! html/php
 <p>Numbered: <a rel="nofollow" class="external autonumber" href="http://example.com">[1]</a>
 Numbered: <a rel="nofollow" class="external autonumber" href="http://example.net">[2]</a>
 Numbered: <a rel="nofollow" class="external autonumber" href="http://example.com">[3]</a>
 </p>
+!! html/parsoid
+<p>Numbered: <a rel="mw:ExtLink" href="http://example.com"></a>
+Numbered: <a rel="mw:ExtLink" href="http://example.net"></a>
+Numbered: <a rel="mw:ExtLink" href="http://example.com"></a></p>
 !!end
 
 !! test
@@ -3685,28 +3722,50 @@ http://example.com/1$2345
 </p>
 !! end
 
+# parsoid doesn't explicitly mark autonumbered links, see bug 53505
 !! test
-External links: dollar sign in URL (named)
+External links: dollar sign in URL (autonumber)
 !! wikitext
 [http://example.com/1$2345]
-!! html
+!! html/php
 <p><a rel="nofollow" class="external autonumber" href="http://example.com/1$2345">[1]</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://example.com/1$2345"></a></p>
 !!end
 
 !! test
 External links: open square bracket forbidden in URL (bug 4377)
+!! options
+parsoid=wt2html,wt2wt,html2html
 !! wikitext
 http://example.com/1[2345
-!! html
+!! html/php
 <p><a rel="nofollow" class="external free" href="http://example.com/1">http://example.com/1</a>[2345
 </p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://example.com/1">http://example.com/1</a>[2345</p>
 !! end
 
 !! test
 External links: open square bracket forbidden in URL (named) (bug 4377)
+!! options
+parsoid=wt2html,html2html
 !! wikitext
 [http://example.com/1[2345]
+!! html/php
+<p><a rel="nofollow" class="external text" href="http://example.com/1">[2345</a>
+</p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://example.com/1">[2345</a></p>
+!!end
+
+# parsoid adds a space before the link name
+!! test
+External links: open square bracket forbidden in URL (named) (bug 4377)
+Parsoid variant.
+!! wikitext
+[http://example.com/1 [2345]
 !! html
 <p><a rel="nofollow" class="external text" href="http://example.com/1">[2345</a>
 </p>
@@ -3750,13 +3809,16 @@ External links: protocol-relative URL in brackets
 </p>
 !! end
 
+# parsoid doesn't explicitly mark autonumbered links, see bug 53505
 !! test
 External links: protocol-relative URL in brackets without text
 !! wikitext
 [//example.com]
-!! html
+!! html/php
 <p><a rel="nofollow" class="external autonumber" href="//example.com">[1]</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="//example.com"></a></p>
 !! end
 
 !! test
@@ -3882,54 +3944,95 @@ Old &amp; use: http://x&y
 External links: encoded ampersand
 !! wikitext
 Old &amp; use: http://x&amp;y
-!! html
+!! html/php
 <p>Old &amp; use: <a rel="nofollow" class="external free" href="http://x&amp;y">http://x&amp;y</a>
 </p>
+!! html/parsoid
+<p>Old <span typeof="mw:Entity">&amp;</span> use: <a rel="mw:ExtLink" href="http://x&amp;y">http://x&amp;y</a></p>
 !! end
 
 !! test
 External links: encoded equals (bug 6102)
 !! wikitext
 http://example.com/?foo&#61;bar
-!! html
+!! html/php
 <p><a rel="nofollow" class="external free" href="http://example.com/?foo=bar">http://example.com/?foo=bar</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://example.com/?foo=bar">http://example.com/?foo=bar</a></p>
 !! end
 
+##
+## Note that parsoid doesn't explicit mark autonumbered links, nor
+## does it number them.  As discussed in bug 53505, we can identify
+## autonumbered links via CSS.
+##
+
 !! test
 External links: [raw ampersand]
 !! wikitext
 Old &amp; use: [http://x&y]
-!! html
+!! html/php
 <p>Old &amp; use: <a rel="nofollow" class="external autonumber" href="http://x&amp;y">[1]</a>
 </p>
+!! html/parsoid
+<p>Old <span typeof="mw:Entity">&amp;</span> use: <a rel="mw:ExtLink" href="http://x&amp;y"></a></p>
 !! end
 
+# note that parsoid html is identical to [raw ampersand] case; so html2wt
+# mode will return the [raw ampersand] wikitext
 !! test
 External links: [encoded ampersand]
+!! options
+parsoid=wt2html,wt2wt,html2html
 !! wikitext
 Old &amp; use: [http://x&amp;y]
-!! html
+!! html/php
 <p>Old &amp; use: <a rel="nofollow" class="external autonumber" href="http://x&amp;y">[1]</a>
 </p>
+!! html/parsoid
+<p>Old <span typeof="mw:Entity">&amp;</span> use: <a rel="mw:ExtLink" href="http://x&amp;y"></a></p>
 !! end
 
+!! test
+External links: [raw equals]
+!! wikitext
+[http://example.com/?foo=bar]
+!! html/php
+<p><a rel="nofollow" class="external autonumber" href="http://example.com/?foo=bar">[1]</a>
+</p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://example.com/?foo=bar"></a></p>
+!! end
+
+# note that parsoid html is identical to [raw equals] case; so html2wt
+# mode will return the [raw equals] wikitext
 !! test
 External links: [encoded equals] (bug 6102)
+!! options
+parsoid=wt2html,wt2wt,html2html
 !! wikitext
 [http://example.com/?foo&#61;bar]
-!! html
+!! html/php
 <p><a rel="nofollow" class="external autonumber" href="http://example.com/?foo=bar">[1]</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://example.com/?foo=bar"></a></p>
 !! end
 
+# xxx parsoid strips the IDN character, so the round-trip tests will
+#     obviously fail and are disabled. --cscott
 !! test
 External links: [IDN ignored character reference in hostname; strip it right off]
+!! options
+parsoid=wt2html,wt2wt,html2html
 !! wikitext
 [http://e&zwnj;xample.com/]
-!! html
+!! html/php
 <p><a rel="nofollow" class="external autonumber" href="http://example.com/">[1]</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://example.com/"></a></p>
 !! end
 
 # FIXME: This test (the IDN characters in the text of a link) is an inconsistency.
@@ -3949,13 +4052,19 @@ External links: [IDN ignored character reference in hostname; strip it right off
 #
 # All our love,
 # The Parsoid team.
+# xxx parsoid strips the IDN character, so the round-trip tests will
+#     obviously fail and are disabled. --cscott
 !! test
 External links: IDN ignored character reference in hostname; strip it right off
+!! options
+parsoid=wt2html,html2html
 !! wikitext
 http://e&zwnj;xample.com/
-!! html
+!! html/php
 <p><a rel="nofollow" class="external free" href="http://example.com/">http://example.com/</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://example.com/">http://example.com/</a></p>
 !! end
 
 !! test
@@ -3967,13 +4076,16 @@ http://www.jpeg.org
 </p>
 !! end
 
+# parsoid doesn't explicitly mark autonumbered links, see bug 53505
 !! test
 External links: URL within URL (original bug 2)
 !! wikitext
 [http://www.unausa.org/newindex.asp?place=http://www.unausa.org/programs/mun.asp]
-!! html
+!! html/php
 <p><a rel="nofollow" class="external autonumber" href="http://www.unausa.org/newindex.asp?place=http://www.unausa.org/programs/mun.asp">[1]</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://www.unausa.org/newindex.asp?place=http://www.unausa.org/programs/mun.asp"></a></p>
 !! end
 
 !! test
@@ -4122,9 +4234,11 @@ Bug 2702: Mismatched <i>, <b> and <a> tags are invalid
 Bug 4781: %26 in URL
 !! wikitext
 http://www.example.com/?title=AT%26T
-!! html
+!! html/php
 <p><a rel="nofollow" class="external free" href="http://www.example.com/?title=AT%26T">http://www.example.com/?title=AT%26T</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://www.example.com/?title=AT%26T">http://www.example.com/?title=AT%26T</a></p>
 !! end
 
 # According to http://dev.w3.org/html5/spec/Overview.html#parsing-urls a plain
@@ -4133,18 +4247,22 @@ http://www.example.com/?title=AT%26T
 Bug 4781, 5267: %25 in URL
 !! wikitext
 http://www.example.com/?title=100%25_Bran
-!! html
+!! html/php
 <p><a rel="nofollow" class="external free" href="http://www.example.com/?title=100%25_Bran">http://www.example.com/?title=100%25_Bran</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://www.example.com/?title=100%25_Bran">http://www.example.com/?title=100%25_Bran</a></p>
 !! end
 
 !! test
 Bug 4781, 5267: %28, %29 in URL
 !! wikitext
 http://www.example.com/?title=Ben-Hur_%281959_film%29
-!! html
+!! html/php
 <p><a rel="nofollow" class="external free" href="http://www.example.com/?title=Ben-Hur_%281959_film%29">http://www.example.com/?title=Ben-Hur_%281959_film%29</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://www.example.com/?title=Ben-Hur_%281959_film%29">http://www.example.com/?title=Ben-Hur_%281959_film%29</a></p>
 !! end
 
 
@@ -4152,27 +4270,33 @@ http://www.example.com/?title=Ben-Hur_%281959_film%29
 Bug 4781: %26 in autonumber URL
 !! wikitext
 [http://www.example.com/?title=AT%26T]
-!! html
+!! html/php
 <p><a rel="nofollow" class="external autonumber" href="http://www.example.com/?title=AT%26T">[1]</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://www.example.com/?title=AT%26T"></a></p>
 !! end
 
 !! test
 Bug 4781, 5267: %26 in autonumber URL
 !! wikitext
 [http://www.example.com/?title=100%25_Bran]
-!! html
+!! html/php
 <p><a rel="nofollow" class="external autonumber" href="http://www.example.com/?title=100%25_Bran">[1]</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://www.example.com/?title=100%25_Bran"></a></p>
 !! end
 
 !! test
 Bug 4781, 5267: %28, %29 in autonumber URL
 !! wikitext
 [http://www.example.com/?title=Ben-Hur_%281959_film%29]
-!! html
+!! html/php
 <p><a rel="nofollow" class="external autonumber" href="http://www.example.com/?title=Ben-Hur_%281959_film%29">[1]</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://www.example.com/?title=Ben-Hur_%281959_film%29"></a></p>
 !! end
 
 
@@ -4180,13 +4304,15 @@ Bug 4781, 5267: %28, %29 in autonumber URL
 Bug 4781: %26 in bracketed URL
 !! wikitext
 [http://www.example.com/?title=AT%26T link]
-!! html
+!! html/php
 <p><a rel="nofollow" class="external text" href="http://www.example.com/?title=AT%26T">link</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://www.example.com/?title=AT%26T">link</a></p>
 !! end
 
 !! test
-Bug 4781, 5267: %26 in bracketed URL
+Bug 4781, 5267: %25 in bracketed URL
 !! wikitext
 [http://www.example.com/?title=100%25_Bran link]
 !! html
@@ -4198,11 +4324,57 @@ Bug 4781, 5267: %26 in bracketed URL
 Bug 4781, 5267: %28, %29 in bracketed URL
 !! wikitext
 [http://www.example.com/?title=Ben-Hur_%281959_film%29 link]
-!! html
+!! html/php
 <p><a rel="nofollow" class="external text" href="http://www.example.com/?title=Ben-Hur_%281959_film%29">link</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://www.example.com/?title=Ben-Hur_%281959_film%29">link</a></p>
 !! end
 
+# Note that parsoid does not munge anchor text; all non-space
+# characters are valid in HTML5 ids.
+!! test
+Anchor containing a #. (bug 63430)
+!! wikitext
+[[Main Page#And#Link]]
+!! html/php
+<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>
+!! end
+
+!! test
+External link containing a period in the anchor. (bug 63947)
+!! wikitext
+[//foo.org/bar#baz. bang]
+
+[//foo.org/bar. bang]
+!! html/php
+<p><a rel="nofollow" class="external text" href="//foo.org/bar#baz.">bang</a>
+</p><p><a rel="nofollow" class="external text" href="//foo.org/bar.">bang</a>
+</p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="//foo.org/bar#baz.">bang</a></p>
+<p><a rel="mw:ExtLink" href="//foo.org/bar.">bang</a></p>
+!! end
+
+!! test
+External link containing a single quote. (bug 63947)
+!! wikitext
+[//foo.org/bar'baz]
+
+[//foo.org/bar'baz bang]
+!! html/php
+<p><a rel="nofollow" class="external autonumber" href="//foo.org/bar'baz">[1]</a>
+</p><p><a rel="nofollow" class="external text" href="//foo.org/bar'baz">bang</a>
+</p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="//foo.org/bar'baz"></a></p>
+<p><a rel="mw:ExtLink" href="//foo.org/bar'baz">bang</a></p>
+!! end
+
+
 !! test
 External link containing double-single-quotes in text '' (bug 4598 sanity check)
 !! wikitext
@@ -4265,10 +4437,14 @@ Brackets in urls
 http://example.com/index.php?foozoid%5B%5D=bar
 
 http://example.com/index.php?foozoid&#x5B;&#x5D;=bar
-!! html
+!! html/php
 <p><a rel="nofollow" class="external free" href="http://example.com/index.php?foozoid%5B%5D=bar">http://example.com/index.php?foozoid%5B%5D=bar</a>
 </p><p><a rel="nofollow" class="external free" href="http://example.com/index.php?foozoid%5B%5D=bar">http://example.com/index.php?foozoid%5B%5D=bar</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://example.com/index.php?foozoid%5B%5D=bar">http://example.com/index.php?foozoid%5B%5D=bar</a></p>
+
+<p><a rel="mw:ExtLink" href="http://example.com/index.php?foozoid[]=bar">http://example.com/index.php?foozoid[]=bar</a></p>
 !! end
 
 !! test
@@ -4902,12 +5078,16 @@ Invalid attributes in table cell (bug 1830)
 !! end
 
 
+# The "|}" to close the table is missing from the input, so parsoid's
+# *2wt modes will fail.
 !! test
 Table security: embedded pipes (http://lists.wikimedia.org/mailman/htdig/wikitech-l/2006-April/022293.html)
+!! options
+parsoid=wt2html,html2html
 !! wikitext
 {|
 | |[ftp://|x||]" onmouseover="alert(document.cookie)">test
-!! html
+!! html/php
 <table>
 <tr>
 <td>[<a rel="nofollow" class="external free" href="ftp://%7Cx">ftp://%7Cx</a></td>
@@ -4916,6 +5096,10 @@ Table security: embedded pipes (http://lists.wikimedia.org/mailman/htdig/wikitec
 </tr>
 </table>
 
+!! html/parsoid
+<table><tbody>
+<tr>
+<td><a rel="mw:ExtLink" href="ftp://|x||"></a>" onmouseover="alert(document.cookie)">test</td></tr></tbody></table>
 !! end
 
 
@@ -5266,6 +5450,17 @@ Piped link with comment in link text
 </p>
 !! end
 
+!! test
+Piped link with multiple pipe characters in link text
+!! wikitext
+[[Main Page||The|Main|Page|]]
+!! html/php
+<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>
+!! end
+
 !! test
 Broken link
 !! wikitext
@@ -5454,22 +5649,37 @@ Link containing }
 </p>
 !! end
 
+!! article
+7% Solution
+!! text
+Just a test of an article title containing a percent.
+!! endarticle
+
 !! test
 Link containing % (not as a hex sequence)
 !! wikitext
 [[7% Solution]]
-!! html
-<p><a href="/index.php?title=7%25_Solution&amp;action=edit&amp;redlink=1" class="new" title="7% Solution (page does not exist)">7% Solution</a>
+!! html/php
+<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>
 !! end
 
+# note that the parsoid HTML is identical to the previous test output,
+# so the previous test ensures that the html2wt mode will generate the
+# "not as a hex sequence" wikitext.
 !! test
 Link containing % as a single hex sequence interpreted to char
+!! options
+parsoid=wt2wt,wt2html,html2html
 !! wikitext
 [[7%25 Solution]]
-!! html
-<p><a href="/index.php?title=7%25_Solution&amp;action=edit&amp;redlink=1" class="new" title="7% Solution (page does not exist)">7% Solution</a>
+!! html/php
+<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>
 !!end
 
 !! test
@@ -5481,14 +5691,18 @@ Link containing % as a double hex sequence interpreted to hex sequence
 </p>
 !!end
 
+# note that parsoid does not munge anchor text; all non-space
+# characters are valid in HTML5 anchors.
 !! test
 Link containing "#<" and "#>" % as a hex sequences- these are valid section anchors
 Example for such a section: == < ==
 !! wikitext
 [[%23%3c]][[%23%3e]]
-!! html
+!! html/php
 <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>
 !! end
 
 !! test
@@ -5504,9 +5718,11 @@ Link containing "<#" and ">#" as a hex sequences
 Link containing an equals sign
 !! wikitext
 [[Special:BookSources/isbn=4-00-026157-6]]
-!! html
+!! html/php
 <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>
 !! end
 
 !! article
@@ -5522,33 +5738,39 @@ Just a test of an article title containing a tilde.
 Link containing a tilde
 !! wikitext
 [[Foo~bar]]
-!! html
+!! html/php
 <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>
 !! end
 
 !! test
 Link containing double-single-quotes '' (bug 4598)
 !! wikitext
 [[Lista d''e paise d''o munno]]
-!! html
+!! html/php
 <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>
 !! end
 
 !! test
 Link containing double-single-quotes '' in text (bug 4598 sanity check)
 !! wikitext
 Some [[Link|pretty ''italics'' and stuff]]!
-!! html
+!! html/php
 <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>
 !! end
 
 !! test
 Link containing double-single-quotes '' in text embedded in italics (bug 4598 sanity check)
 !! wikitext
-''Some [[Link|pretty ''italics'' and stuff]]!
+''Some [[Link|pretty ''italics'' and stuff]]!''
 !! html
 <p><i>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>!</i>
 </p>
@@ -5564,12 +5786,17 @@ Link with double quotes in title part (literal) and alternate part (interpreted)
 [[''Pentecoste''|Pentecoste]]
 
 [[''Pentecoste''|''Pentecoste'']]
-!! html
+!! html/php
 <p><a href="/index.php?title=Special:Upload&amp;wpDestFile=Denys_Savchenko_%27%27Pentecoste%27%27.jpg" class="new" title="File:Denys Savchenko &#39;&#39;Pentecoste&#39;&#39;.jpg">File:Denys Savchenko <i>Pentecoste</i>.jpg</a>
 </p><p><a href="/index.php?title=%27%27Pentecoste%27%27&amp;action=edit&amp;redlink=1" class="new" title="''Pentecoste'' (page does not exist)">''Pentecoste''</a>
 </p><p><a href="/index.php?title=%27%27Pentecoste%27%27&amp;action=edit&amp;redlink=1" class="new" title="''Pentecoste'' (page does not exist)">Pentecoste</a>
 </p><p><a href="/index.php?title=%27%27Pentecoste%27%27&amp;action=edit&amp;redlink=1" class="new" title="''Pentecoste'' (page does not exist)"><i>Pentecoste</i></a>
 </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>
 !! end
 
 !! test
@@ -5591,9 +5818,11 @@ Broken image links with HTML captions (bug 39700)
 Plain link to URL
 !! wikitext
 [[http://www.example.com]]
-!! html
+!! html/php
 <p>[<a rel="nofollow" class="external autonumber" href="http://www.example.com">[1]</a>]
 </p>
+!! html/parsoid
+<p>[<a rel="mw:ExtLink" href="http://www.example.com"></a>]</p>
 !! end
 
 !! test
@@ -5609,9 +5838,11 @@ Plain link to URL with link text
 Plain link to protocol-relative URL
 !! wikitext
 [[//www.example.com]]
-!! html
+!! html/php
 <p>[<a rel="nofollow" class="external autonumber" href="//www.example.com">[1]</a>]
 </p>
+!! html/parsoid
+<p>[<a rel="mw:ExtLink" href="//www.example.com"></a>]</p>
 !! end
 
 !! test
@@ -5651,29 +5882,36 @@ Plain link to page with question mark in title
 Piped link to URL
 !! wikitext
 Piped link to URL: [[http://www.example.com|an example URL]]
-!! html
+!! html/php
 <p>Piped link to URL: [<a rel="nofollow" class="external text" href="http://www.example.com%7Can">example URL</a>]
 </p>
+!! html/parsoid
+<p>Piped link to URL: [<a rel="mw:ExtLink" href="http://www.example.com|an">example URL</a>]</p>
 !! end
 
 !! test
 BUG 2: [[page|http://url/]] should link to page, not http://url/
 !! wikitext
 [[Main Page|http://url/]]
-!! html
+!! html/php
 <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>
 !! end
 
+# Parsoid does not mark self-links, by design.
 !! test
 BUG 337: Escaped self-links should be bold
 !! options
 title=[[Bug462]]
 !! wikitext
 [[Bu&#103;462]] [[Bug462]]
-!! html
+!! html/php
 <p><strong class="selflink">Bu&#103;462</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>
 !! end
 
 !! test
@@ -5997,8 +6235,6 @@ Different interwiki prefixes mapping to the same URL
 
 !! test
 Interwiki links that cannot be represented in wiki syntax
-!! options
-parsoid
 !! wikitext
 [[meatball:ok]]
 [[meatball:ok#foo|ok with fragment]]
@@ -6006,10 +6242,10 @@ parsoid
 [http://de.wikipedia.org/wiki/Foo?action=history has query]
 [http://de.wikipedia.org/wiki/#foo is just fragment]
 
-!! html
+!! html/parsoid
 <p><a rel="mw:ExtLink" href="http://www.usemod.com/cgi-bin/mb.pl?ok">meatball:ok</a>
 <a rel="mw:ExtLink" href="http://www.usemod.com/cgi-bin/mb.pl?ok#foo">ok with fragment</a>
-<a rel="mw:ExtLink" href="http://www.usemod.com/cgi-bin/mb.pl?ok_as_well%3F">ok ending with ? mark</a>
+<a rel="mw:ExtLink" href="http://www.usemod.com/cgi-bin/mb.pl?ok_as_well?">ok ending with ? mark</a>
 <a rel="mw:ExtLink" href="http://de.wikipedia.org/wiki/Foo?action=history">has query</a>
 <a rel="mw:ExtLink" href="http://de.wikipedia.org/wiki/#foo">is just fragment</a></p>
 !! end
@@ -7519,7 +7755,7 @@ Magic Word: {{NUMBEROFFILES}}
 !! wikitext
 {{NUMBEROFFILES}}
 !! html
-<p>4
+<p>7
 </p>
 !! end
 
@@ -8748,7 +8984,7 @@ parsoid
 !!end
 
 !!test
-Templates: Inline Text: 1. Multiple tmeplate uses
+Templates: Inline Text: 1. Multiple template uses
 !! wikitext
 {{echo|Foo}}bar{{echo|baz}}
 !! html
@@ -9263,6 +9499,33 @@ Templates: Ugly templates: 4. newline-only template parameter inconsistency
 </p>
 !! end
 
+# Bug 64017 -- ugly wikitext with fostered content generates two template ranges that
+# have a true overlap (T1-start - T2-start - T1-end - T2-end).
+!! test
+Templates: Ugly templates: 5. Template encapsulation test: Non-trivial overlap of template ranges is properly handled
+!! wikitext
+{{echo|<table>}}
+{{echo|<div>foo}}
+{{echo|</table>}}
+!! html/parsoid
+<div about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&lt;table>"}},"i":0}},"\n",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&lt;div>foo"}},"i":1}},"\n",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&lt;/table>"}},"i":2}}]}' data-parsoid='{"stx":"html","autoInsertedEnd":true,"pi":[[{"k":"1","spc":["","","",""]}],[{"k":"1","spc":["","","",""]}],[{"k":"1","spc":["","","",""]}]]}'>foo
+</div><table about="#mwt1" data-parsoid='{"stx":"html"}'>
+</table>
+!! end
+
+# Bug 64017 -- ugly wikitext with fostered content generates two template ranges
+# that are "identical" and generate nesting cycles in the algorithm
+!! test
+Templates: Ugly templates: 6. Template encapsulation test: Cyclical nesting of template ranges is properly handled
+!! wikitext
+{{echo|<table><tr><td><table>}}
+{{echo|<div>}}
+{{echo|</div>}}
+!! html/parsoid
+<table about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&lt;table>&lt;tr>&lt;td>&lt;table>"}},"i":0}},"\n",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&lt;div>"}},"i":1}},"\n",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&lt;/div>"}},"i":2}}]}' data-parsoid='{"stx":"html","autoInsertedEnd":true,"pi":[[{"k":"1","spc":["","","",""]}],[{"k":"1","spc":["","","",""]}],[{"k":"1","spc":["","","",""]}]]}'><tbody><tr data-parsoid='{"stx":"html"}'><td data-parsoid='{"stx":"html"}'><div data-parsoid='{"stx":"html"}'>
+</div><table about="#mwt1" data-parsoid='{"stx":"html"}'>
+</table></td></tr></tbody></table>
+!! end
 
 !!test
 Parser Functions: 1. Simple example
@@ -10473,6 +10736,8 @@ parsoid=wt2html,wt2wt,html2html
 
 !! test
 Image with 'frameless' first.
+!! options
+parsoid=wt2html,wt2wt,html2html
 !! wikitext
 [[File:Foobar.jpg|frameless|caption]]
 
@@ -10484,10 +10749,16 @@ Image with 'frameless' first.
 </p><p><a href="/wiki/File:Foobar.jpg" class="image" title="caption"><img alt="caption" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" 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>
 </p><p><a href="/wiki/File:Foobar.jpg" class="image" title="caption"><img alt="caption" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" 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>
 </p>
+!! html/parsoid
+<p><span class="mw-default-size" typeof="mw:Image/Frameless" data-mw='{"caption":"caption"}'><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="25" width="220"/></a></span></p>
+<p><span class="mw-default-size" typeof="mw:Image/Frameless" data-mw='{"caption":"caption"}'><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="25" width="220"/></a></span></p>
+<p><span class="mw-default-size" typeof="mw:Image/Frameless" data-mw='{"caption":"caption"}'><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="25" width="220"/></a></span></p>
 !! end
 
 !! test
 Image with 'frame' first.
+!! options
+parsoid=wt2html,wt2wt,html2html
 !! wikitext
 [[File:Foobar.jpg|frame|caption]]
 [[File:Foobar.jpg|frame|frameless|caption]]
@@ -10497,10 +10768,14 @@ Image with 'frame' first.
 <div class="thumb tright"><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">caption</div></div></div>
 <div class="thumb tright"><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">caption</div></div></div>
 
+!! html/parsoid
+<figure class="mw-default-size" 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>caption</figcaption></figure><figure class="mw-default-size" 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>caption</figcaption></figure><figure class="mw-default-size" 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>caption</figcaption></figure>
 !! end
 
 !! test
 Image with 'thumb' first.
+!! options
+parsoid=wt2html,wt2wt,html2html
 !! wikitext
 [[File:Foobar.jpg|thumb|caption]]
 [[File:Foobar.jpg|thumb|frameless|caption]]
@@ -10510,18 +10785,24 @@ Image with 'thumb' first.
 <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>
 
+!! 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>
 !! end
 
 ###################
 # Image sizing.
 # See https://www.mediawiki.org/wiki/Help:Images#Size_and_frame
 # and https://bugzilla.wikimedia.org/show_bug.cgi?id=62258
-# Foobar has actual size of 1941x220
+# Foobar.jpg has actual size of 1941x220
+# Portrait.svg has actual size of 180x240
+# Portrait.png has actual size of 180x240
 # 1. Thumbs & frameless always reduce, can't be enlarged unless it's
 #    a scalable format.
 # 2. Framed images always ignore size options; always render at default size.
 # 3. "Unspecified format" and border are the only types which can be
 #    enlarged.
+# 4. Without an explicit size specification, thumbnails are
+#    resized to a square bounding box.
 
 !! test
 Image: "unspecified format" and border enlarge
@@ -10639,6 +10920,55 @@ parsoid=wt2html,wt2wt,html2html
 <figure class="mw-default-size" 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></figure><figure 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></figure><figure 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></figure><figure 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></figure>
 !! end
 
+!! test
+Image: thumbnails of the default size use a square bounding box.
+!! options
+thumbsize=220
+!! wikitext
+[[File:Foobar.jpg|thumb|landscape thumb]]
+
+[[File:Foobar.jpg|frameless|landscape frameless]]
+
+[[File:Portrait.png|thumb|should use 220x220px bounding box]]
+
+[[File:Portrait.png|frameless|should use 220x220px bounding box]]
+
+[[File:Portrait.svg|thumb|should use 220x220px bounding box]]
+
+[[File:Portrait.svg|frameless|should use 220x220px bounding box]]
+!! 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>landscape thumb</div></div></div>
+<p><a href="/wiki/File:Foobar.jpg" class="image" title="landscape frameless"><img alt="landscape frameless" src="http://example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" width="220" height="25" 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>
+</p>
+<div class="thumb tright"><div class="thumbinner" style="width:167px;"><a href="/wiki/File:Portrait.png" class="image"><img alt="" src="http://example.com/images/thumb/9/93/Portrait.png/165px-Portrait.png" width="165" height="220" class="thumbimage" srcset="http://example.com/images/9/93/Portrait.png 1.5x, http://example.com/images/9/93/Portrait.png 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Portrait.png" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>should use 220x220px bounding box</div></div></div>
+<p><a href="/wiki/File:Portrait.png" class="image" title="should use 220x220px bounding box"><img alt="should use 220x220px bounding box" src="http://example.com/images/thumb/9/93/Portrait.png/165px-Portrait.png" width="165" height="220" srcset="http://example.com/images/9/93/Portrait.png 1.5x, http://example.com/images/9/93/Portrait.png 2x" /></a>
+</p>
+<div class="thumb tright"><div class="thumbinner" style="width:167px;"><a href="/wiki/File:Portrait.svg" class="image"><img alt="" src="http://example.com/images/thumb/f/fc/Portrait.svg/165px-Portrait.svg.png" width="165" height="220" class="thumbimage" srcset="http://example.com/images/thumb/f/fc/Portrait.svg/247px-Portrait.svg.png 1.5x, http://example.com/images/thumb/f/fc/Portrait.svg/330px-Portrait.svg.png 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Portrait.svg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>should use 220x220px bounding box</div></div></div>
+<p><a href="/wiki/File:Portrait.svg" class="image" title="should use 220x220px bounding box"><img alt="should use 220x220px bounding box" src="http://example.com/images/thumb/f/fc/Portrait.svg/165px-Portrait.svg.png" width="165" height="220" srcset="http://example.com/images/thumb/f/fc/Portrait.svg/247px-Portrait.svg.png 1.5x, http://example.com/images/thumb/f/fc/Portrait.svg/330px-Portrait.svg.png 2x" /></a>
+</p>
+!! end
+
+!! test
+Image: bitmap thumbnails reduce only if thumb size is smaller than inherent size.
+!! options
+thumbsize=300
+!! wikitext
+[[File:Portrait.png|thumb|should use inherent 180x240px size]]
+
+[[File:Portrait.png|frameless|should use inherent 180x240px size]]
+
+[[File:Portrait.svg|thumb|will resize to 300x300px]]
+
+[[File:Portrait.svg|frameless|will resize to 300x300px]]
+!! html/php
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Portrait.png" class="image"><img alt="" src="http://example.com/images/9/93/Portrait.png" width="180" height="240" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Portrait.png" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>should use inherent 180x240px size</div></div></div>
+<p><a href="/wiki/File:Portrait.png" class="image" title="should use inherent 180x240px size"><img alt="should use inherent 180x240px size" src="http://example.com/images/9/93/Portrait.png" width="180" height="240" /></a>
+</p>
+<div class="thumb tright"><div class="thumbinner" style="width:227px;"><a href="/wiki/File:Portrait.svg" class="image"><img alt="" src="http://example.com/images/thumb/f/fc/Portrait.svg/225px-Portrait.svg.png" width="225" height="300" class="thumbimage" srcset="http://example.com/images/thumb/f/fc/Portrait.svg/337px-Portrait.svg.png 1.5x, http://example.com/images/thumb/f/fc/Portrait.svg/450px-Portrait.svg.png 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Portrait.svg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>will resize to 300x300px</div></div></div>
+<p><a href="/wiki/File:Portrait.svg" class="image" title="will resize to 300x300px"><img alt="will resize to 300x300px" src="http://example.com/images/thumb/f/fc/Portrait.svg/225px-Portrait.svg.png" width="225" height="300" srcset="http://example.com/images/thumb/f/fc/Portrait.svg/337px-Portrait.svg.png 1.5x, http://example.com/images/thumb/f/fc/Portrait.svg/450px-Portrait.svg.png 2x" /></a>
+</p>
+!! end
+
 ###################
 
 !! test
@@ -12612,27 +12942,33 @@ Attribute test: no value
 Bug 2095: link with three closing brackets
 !! wikitext
 [[Main Page]]]
-!! html
+!! html/php
 <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>
 !! end
 
 !! test
 Bug 2095: link with pipe and three closing brackets
 !! wikitext
 [[Main Page|link]]]
-!! html
+!! html/php
 <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>
 !! end
 
 !! test
 Bug 2095: link with pipe and three closing brackets, version 2
 !! wikitext
 [[Main Page|[http://example.com/]]]
-!! html
+!! html/php
 <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>
 !! end
 
 
@@ -13565,6 +13901,7 @@ HTML ordered list item with parameters oddity
 
 !! end
 
+# parsoid doesn't explicitly mark autonumbered links, see bug 53505
 !!test
 bug 5918: autonumbering
 !! wikitext
@@ -13577,13 +13914,19 @@ ftp://inlineftp
 [mailto:enclosed@mail.tld]
 
 mailto:inline@mail.tld
-!! html
+!! html/php
 <p><a rel="nofollow" class="external autonumber" href="http://first/">[1]</a> <a rel="nofollow" class="external autonumber" href="http://second">[2]</a> <a rel="nofollow" class="external autonumber" href="ftp://ftp">[3]</a>
 </p><p><a rel="nofollow" class="external free" href="ftp://inlineftp">ftp://inlineftp</a>
 </p><p><a rel="nofollow" class="external text" href="mailto:enclosed@mail.tld">With target</a>
 </p><p><a rel="nofollow" class="external autonumber" href="mailto:enclosed@mail.tld">[4]</a>
 </p><p><a rel="nofollow" class="external free" href="mailto:inline@mail.tld">mailto:inline@mail.tld</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://first/"></a> <a rel="mw:ExtLink" href="http://second"></a> <a rel="mw:ExtLink" href="ftp://ftp"></a></p>
+<p><a rel="mw:ExtLink" href="ftp://inlineftp">ftp://inlineftp</a></p>
+<p><a rel="mw:ExtLink" href="mailto:enclosed@mail.tld">With target</a></p>
+<p><a rel="mw:ExtLink" href="mailto:enclosed@mail.tld"></a></p>
+<p><a rel="mw:ExtLink" href="mailto:inline@mail.tld">mailto:inline@mail.tld</a></p>
 !! end
 
 
@@ -14786,17 +15129,39 @@ xxx
 !! test
 Handling of &#x0A; in URLs
 !! wikitext
-**irc://&#x0A;a
-!! html
+** irc://&#x0A;a
+!! html/php
 <ul>
 <li><ul>
-<li><a rel="nofollow" class="external free" href="irc://%0Aa">irc://%0Aa</a>
+<li> <a rel="nofollow" class="external free" href="irc://%0Aa">irc://%0Aa</a>
 </li>
 </ul>
 </li>
 </ul>
 
-!!end
+!! html/parsoid
+<ul><li><ul><li> <a rel="mw:ExtLink" href="irc://
+a">irc://
+a</a></li></ul></li></ul>
+!! end
+
+!! test
+Handling of %0A in URLs
+!! wikitext
+** irc://%0Aa
+!! html/php
+<ul>
+<li><ul>
+<li> <a rel="nofollow" class="external free" href="irc://%0Aa">irc://%0Aa</a>
+</li>
+</ul>
+</li>
+</ul>
+
+!! html/parsoid
+<ul><li><ul><li> <a rel="mw:ExtLink" href="irc://%0Aa">irc://%0Aa</a></li></ul></li></ul>
+!! end
+
 
 # The PHP parser strips the empty tags out for giggles; parsoid doesn't.
 !! test
@@ -15136,29 +15501,39 @@ foobar.jpg
 
 !! test
 HTML Hex character encoding (spells the word "JavaScript")
+!! options
+parsoid=wt2html,wt2wt,html2html
 !! wikitext
 &#x4A;&#x061;&#x0076;&#x00061;&#x000053;&#x0000063;&#114;&#x0000069;&#00000112;&#x0000000074;
-!! html
+!! html/php
 <p>&#x4a;&#x61;&#x76;&#x61;&#x53;&#x63;&#114;&#x69;&#112;&#x74;
 </p>
+!! html/parsoid
+<p><span typeof="mw:Entity">J</span><span typeof="mw:Entity">a</span><span typeof="mw:Entity">v</span><span typeof="mw:Entity">a</span><span typeof="mw:Entity">S</span><span typeof="mw:Entity">c</span><span typeof="mw:Entity">r</span><span typeof="mw:Entity">i</span><span typeof="mw:Entity">p</span><span typeof="mw:Entity">t</span></p>
 !! end
 
 !! test
 HTML Hex character encoding bogus encoding (bug 26437 regression check)
 !! wikitext
 &#xsee;&#XSEE;
-!! html
+!! html/php
 <p>&amp;#xsee;&amp;#XSEE;
 </p>
+!! html/parsoid
+<p>&amp;#xsee;&amp;#XSEE;</p>
 !! end
 
 !! test
 HTML Hex character encoding mixed case
+!! options
+parsoid=wt2html,wt2wt,html2html
 !! wikitext
 &#xEE;&#Xee;
-!! html
+!! html/php
 <p>&#xee;&#xee;
 </p>
+!! html/parsoid
+<p><span typeof="mw:Entity">î</span><span typeof="mw:Entity">î</span></p>
 !! end
 
 !! test
@@ -15305,6 +15680,17 @@ Width-sized image (using px, with preceding whitespace - test regression from r3
 </p>
 !!end
 
+!! test
+Image with page parameter
+!! options
+djvu
+!! wikitext
+[[File:LoremIpsum.djvu|page=2]]
+!! html
+<p><a href="/index.php?title=File:LoremIpsum.djvu&amp;page=2" class="image"><img alt="LoremIpsum.djvu" src="http://example.com/images/thumb/5/5f/LoremIpsum.djvu/page2-2480px-LoremIpsum.djvu.jpg" width="2480" height="3508" srcset="http://example.com/images/thumb/5/5f/LoremIpsum.djvu/page2-3720px-LoremIpsum.djvu.jpg 1.5x, http://example.com/images/thumb/5/5f/LoremIpsum.djvu/page2-4960px-LoremIpsum.djvu.jpg 2x" /></a>
+</p>
+!! end
+
 !! test
 Another italics / bold test
 !! wikitext
@@ -15351,11 +15737,13 @@ disabled
 !! test
 Images with the "|" character in the comment
 !! wikitext
-[[image:Foobar.jpg|thumb|An [http://test/?param1=|left|&param2=|x external] URL]]
-!! html
+[[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>
 
-!!end
+!! 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>
+!! end
 
 !! test
 [Before] HTML without raw HTML enabled ($wgRawHtml==false)
@@ -16626,9 +17014,11 @@ Bug 15196: localised external link numbers
 language=fa
 !! wikitext
 [http://en.wikipedia.org/]
-!! html
+!! html/php
 <p><a rel="nofollow" class="external autonumber" href="http://en.wikipedia.org/">[۱]</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://en.wikipedia.org/"></a></p>
 !! end
 
 !! test
@@ -17660,9 +18050,11 @@ Special:Foobar
 Bug 34939 - Case insensitive link parsing ([HttP://])
 !! wikitext
 [HttP://MediaWiki.Org/]
-!! html
+!! html/php
 <p><a rel="nofollow" class="external autonumber" href="HttP://MediaWiki.Org/">[1]</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="HttP://MediaWiki.Org/"></a></p>
 !! end
 
 !!test
@@ -17678,9 +18070,11 @@ Bug 34939 - Case insensitive link parsing ([HttP:// title])
 Bug 34939 - Case insensitive link parsing (HttP://)
 !! wikitext
 HttP://MediaWiki.Org/
-!! html
+!! html/php
 <p><a rel="nofollow" class="external free" href="HttP://MediaWiki.Org/">HttP://MediaWiki.Org/</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="HttP://MediaWiki.Org/">HttP://MediaWiki.Org/</a></p>
 !! end
 
 !!test
@@ -18141,6 +18535,16 @@ B <span about="#mwt4" class="reference" data-mw='{"name":"ref","attrs":{"group":
 <ol class="references" typeof="mw:Extension/references" about="#mwt8" data-parsoid='{"src":"&lt;references group=\"X\">\n&lt;ref name=\"b\">foo&lt;/ref>\n&lt;/references>","group":"X"}' data-mw='{"name":"references","body":{"extsrc":"&lt;ref name=\"b\">foo&lt;/ref>","html":"\n&lt;span about=\"#mwt10\" class=\"reference\" data-mw=&#39;{\"name\":\"ref\",\"body\":{\"html\":\"foo\"},\"attrs\":{\"name\":\"b\"}}&#39; rel=\"dc:references\" typeof=\"mw:Extension/ref\">&lt;a href=\"#cite_note-b-1\">[1]&lt;/a>&lt;/span>\n"},"attrs":{"group":"X"}}'><li about="#cite_note-b-3" id="cite_note-b-3" data-parsoid="{}"><span rel="mw:referencedBy" data-parsoid="{}"><a href="#cite_ref-b-3-0" data-parsoid="{}">↑</a></span> </li></ol>
 !! end
 
+!! test
+Entities in ref name
+!! options
+parsoid
+!! wikitext
+<ref name="test &amp; me">hi</ref>
+!! html
+<p data-parsoid='{}'><span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"hi"},"attrs":{"name":"test &amp; me"}}' id="cite_ref-test &amp; me-1-0" rel="dc:references" typeof="mw:Extension/ref" data-parsoid='{"src":"&lt;ref name=\"test &amp;amp; me\">hi&lt;/ref>"}'><a href="#cite_note-test &amp; me-1" data-parsoid="{}">[1]</a></span></p>
+!! end
+
 # This test is wt2html only because we're permitting the serializer to produce
 # dirty diffs, normalizing the unclosed references to the self-closed version.
 !! test
 <p>b</p></div>
 !! end
 
+!! test
+Substrings resembling wikitext in hrefs should not get nowiki escapes
+!! options
+parsoid=html2wt
+!! wikitext
+[[Foo''bar''baz]]
+!! html
+<a rel="mw:WikiLink" href="./Foo''bar''baz">Foo''bar''baz</a>
+!! end
+
 #-----------------------------
 # I/B quote minimization tests
 #-----------------------------
@@ -20408,9 +20822,9 @@ Bug 54262: New entities
 !! options
 parsoid=html2wt
 !! wikitext
-foo
+&nbsp;
 !! html
-<span typeof="mw:Entity">foo</span>
+<span typeof="mw:Entity">&nbsp;</span>
 !! end
 
 ## Note that there is no wikitext output for 'unknownproperty' ##
index 1131385..53e6722 100644 (file)
@@ -4,7 +4,6 @@
  * Base class that store and restore the Language objects
  */
 abstract class MediaWikiLangTestCase extends MediaWikiTestCase {
-
        protected function setUp() {
                global $wgLanguageCode, $wgContLang;
                parent::setUp();
index cc49fde..fa863fc 100644 (file)
@@ -39,28 +39,6 @@ class MediaWikiPHPUnitCommand extends PHPUnit_TextUI_Command {
 
        public static function main( $exit = true ) {
                $command = new self;
-
-               if ( wfIsWindows() ) {
-                       # Windows does not come anymore with ANSI.SYS loaded by default
-                       # PHPUnit uses the suite.xml parameters to enable/disable colors
-                       # which can be then forced to be enabled with --colors.
-                       # The below code inject a parameter just like if the user called
-                       # phpunit with a --no-color option (which does not exist). It
-                       # overrides the suite.xml setting.
-                       # Probably fix bug 29226
-                       $command->arguments['colors'] = false;
-               }
-
-               # Makes MediaWiki PHPUnit directory includable so the PHPUnit will
-               # be able to resolve relative files inclusion such as suites/*
-               # PHPUnit uses stream_resolve_include_path() internally
-               # See bug 32022
-               set_include_path(
-                       __DIR__
-                               . PATH_SEPARATOR
-                               . get_include_path()
-               );
-
                $command->run( $_SERVER['argv'], $exit );
        }
 
@@ -74,26 +52,6 @@ class MediaWikiPHPUnitCommand extends PHPUnit_TextUI_Command {
                }
        }
 
-       public function run( array $argv, $exit = true ) {
-               wfProfileIn( __METHOD__ );
-
-               $ret = parent::run( $argv, false );
-
-               wfProfileOut( __METHOD__ );
-
-               // Return to real wiki db, so profiling data is preserved
-               MediaWikiTestCase::teardownTestDB();
-
-               // Log profiling data, e.g. in the database or UDP
-               wfLogProfilingData();
-
-               if ( $exit ) {
-                       exit( $ret );
-               } else {
-                       return $ret;
-               }
-       }
-
        public function showHelp() {
                parent::showHelp();
 
index c8ec411..9eeb251 100644 (file)
@@ -1,6 +1,6 @@
 <?php
-class MediaWikiPHPUnitTestListener implements PHPUnit_Framework_TestListener {
 
+class MediaWikiPHPUnitTestListener implements PHPUnit_Framework_TestListener {
        /**
         * @var string
         */
@@ -35,7 +35,10 @@ class MediaWikiPHPUnitTestListener implements PHPUnit_Framework_TestListener {
         * @param float $time
         */
        public function addError( PHPUnit_Framework_Test $test, Exception $e, $time ) {
-               wfDebugLog( $this->logChannel, 'ERROR in ' . $this->getTestName( $test ) . ': ' . $this->getErrorName( $e ) );
+               wfDebugLog(
+                       $this->logChannel,
+                       'ERROR in ' . $this->getTestName( $test ) . ': ' . $this->getErrorName( $e )
+               );
        }
 
        /**
@@ -45,8 +48,13 @@ class MediaWikiPHPUnitTestListener implements PHPUnit_Framework_TestListener {
         * @param PHPUnit_Framework_AssertionFailedError $e
         * @param float $time
         */
-       public function addFailure( PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time ) {
-               wfDebugLog( $this->logChannel, 'FAILURE in ' . $this->getTestName( $test ) . ': ' . $this->getErrorName( $e ) );
+       public function addFailure( PHPUnit_Framework_Test $test,
+               PHPUnit_Framework_AssertionFailedError $e, $time
+       ) {
+               wfDebugLog(
+                       $this->logChannel,
+                       'FAILURE in ' . $this->getTestName( $test ) . ': ' . $this->getErrorName( $e )
+               );
        }
 
        /**
@@ -57,7 +65,10 @@ class MediaWikiPHPUnitTestListener implements PHPUnit_Framework_TestListener {
         * @param float $time
         */
        public function addIncompleteTest( PHPUnit_Framework_Test $test, Exception $e, $time ) {
-               wfDebugLog( $this->logChannel, 'Incomplete test ' . $this->getTestName( $test ) . ': ' . $this->getErrorName( $e ) );
+               wfDebugLog(
+                       $this->logChannel,
+                       'Incomplete test ' . $this->getTestName( $test ) . ': ' . $this->getErrorName( $e )
+               );
        }
 
        /**
@@ -70,7 +81,10 @@ class MediaWikiPHPUnitTestListener implements PHPUnit_Framework_TestListener {
         * @since Method available since Release 3.0.0
         */
        public function addSkippedTest( PHPUnit_Framework_Test $test, Exception $e, $time ) {
-               wfDebugLog( $this->logChannel, 'Skipped test ' . $this->getTestName( $test ) . ': ' . $this->getErrorName( $e ) );
+               wfDebugLog(
+                       $this->logChannel,
+                       'Skipped test ' . $this->getTestName( $test ) . ': ' . $this->getErrorName( $e )
+               );
        }
 
        /**
index 1c21e62..53b944d 100644 (file)
@@ -4,7 +4,6 @@
  * @since 1.18
  */
 abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
-
        /**
         * $called tracks whether the setUp and tearDown method has been called.
         * class extending MediaWikiTestCase usually override setUp and tearDown
@@ -254,7 +253,8 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 
                        $oldHex = strtoupper( dechex( $this->phpErrorLevel ) );
                        $newHex = strtoupper( dechex( $phpErrorLevel ) );
-                       $message = "PHP error_reporting setting was left dirty: was 0x$oldHex before test, 0x$newHex after test!";
+                       $message = "PHP error_reporting setting was left dirty: "
+                               . "was 0x$oldHex before test, 0x$newHex after test!";
 
                        $this->fail( $message );
                }
@@ -467,7 +467,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 
                //Make 1 page with 1 revision
                $page = WikiPage::factory( Title::newFromText( 'UTPage' ) );
-               if ( !$page->getId() == 0 ) {
+               if ( $page->getId() == 0 ) {
                        $page->doEditContent(
                                new WikitextContent( 'UTContent' ),
                                'UTPageSummary',
@@ -772,7 +772,9 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         * @param bool $ordered If the order of the values should match
         * @param bool $named If the keys should match
         */
-       protected function assertArrayEquals( array $expected, array $actual, $ordered = false, $named = false ) {
+       protected function assertArrayEquals( array $expected, array $actual,
+               $ordered = false, $named = false
+       ) {
                if ( !$ordered ) {
                        $this->objectAssociativeSort( $expected );
                        $this->objectAssociativeSort( $actual );
@@ -1105,5 +1107,4 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 
                $this->assertEmpty( $errors, implode( "\n", $errors ) );
        }
-
 }
index a03e9cc..f8c4c6c 100644 (file)
@@ -1,7 +1,6 @@
 <?php
 
 abstract class ResourceLoaderTestCase extends MediaWikiTestCase {
-
        protected static function getResourceLoaderContext() {
                $resourceLoader = new ResourceLoader();
                $request = new FauxRequest( array(
@@ -40,7 +39,6 @@ abstract class ResourceLoaderTestCase extends MediaWikiTestCase {
 /* Stubs */
 
 class ResourceLoaderTestModule extends ResourceLoaderModule {
-
        protected $dependencies = array();
        protected $group = null;
        protected $source = 'local';
@@ -65,4 +63,5 @@ class ResourceLoaderTestModule extends ResourceLoaderModule {
        }
 }
 
-class ResourceLoaderFileModuleTestModule extends ResourceLoaderFileModule {}
+class ResourceLoaderFileModuleTestModule extends ResourceLoaderFileModule {
+}
index b2fa7fb..cd9b9e2 100644 (file)
@@ -1,10 +1,20 @@
 == Things To Do ==
-* Most of the tests are named poorly; naming should describe a use case in story-like language, not simply identify the
-unit under test. An example would be the difference between testCalculate and testAddingIntegersTogetherWorks.
-* Many of the tests make multiple assertions, and are thus not unitary tests. By using data-providers and more use-case
-oriented test selection nearly all of these cases can be easily resolved.
-* Some of the test files are either incorrectly named or in the wrong folder. Tests should be organized in a mirrored
-structure to the source they are testing, and named the same, with the exception of the word "Test" at the end.
-* Shared set-up code or base classes are present, but usually named improperly or appear to be poorly factored. Support
-code should share as much of the same naming as the code it's supporting, and test and test-case depenencies should be
-considered to resolve other shared needs.
+
+* Most of the tests are named poorly;
+  naming should describe a use case in story-like language,
+  not simply identify the unit under test.
+  An example would be the difference between "testCalculate"
+  and "testAddingIntegersTogetherWorks".
+
+* Many of the tests make multiple assertions, and are thus not unitary tests.
+  By using data-providers and more use-case oriented test selection
+  nearly all of these cases can be easily resolved.
+
+* Some of the test files are either incorrectly named or in the wrong folder.
+  Tests should be organized in a mirrored structure to the source they are testing,
+  and named the same, with the exception of the word "Test" at the end.
+
+* Shared set-up code or base classes are present,
+  but usually named improperly or appear to be poorly factored.
+  Support code should share as much of the same naming  as the code it's supporting,
+  and test and test-case depenencies should be considered to resolve other shared needs.
index d929b79..121aade 100644 (file)
@@ -13,3 +13,24 @@ Running phpunit.php instead is recommended.
 EOF;
        require_once __DIR__ . "/phpunit.php";
 }
+
+class MediaWikiPHPUnitBootstrap {
+
+       public function __construct() {
+               wfProfileIn( __CLASS__ );
+       }
+
+       public function __destruct() {
+               wfProfileOut( __CLASS__ );
+
+               // Return to real wiki db, so profiling data is preserved
+               MediaWikiTestCase::teardownTestDB();
+
+               // Log profiling data, e.g. in the database or UDP
+               wfLogProfilingData();
+       }
+
+}
+
+// This will be destructed after all tests have been run
+$mediawikiPHPUnitBootstrap = new MediaWikiPHPUnitBootstrap();
diff --git a/tests/phpunit/data/gitinfo/info-testValidJsonData.json b/tests/phpunit/data/gitinfo/info-testValidJsonData.json
new file mode 100644 (file)
index 0000000..e955a2b
--- /dev/null
@@ -0,0 +1 @@
+{\r    "head": "refs/heads/master",\r    "headSHA1": "0123456789abcdef0123456789abcdef01234567",\r    "headCommitDate": "1070884800",\r    "branch": "master",\r    "remoteURL": "https://gerrit.wikimedia.org/r/mediawiki/core"\r}\r
\ No newline at end of file
diff --git a/tests/phpunit/data/media/Portrait.png b/tests/phpunit/data/media/Portrait.png
new file mode 100644 (file)
index 0000000..b5a92f6
Binary files /dev/null and b/tests/phpunit/data/media/Portrait.png differ
index 84f900f..b07c013 100644 (file)
@@ -66,7 +66,9 @@ class ArticleTest extends MediaWikiTestCase {
        }
 
        /**
-        * Checks for the existence of the backwards compatibility static functions (forwarders to WikiPage class)
+        * Checks for the existence of the backwards compatibility static functions
+        * (forwarders to WikiPage class)
+        *
         * @covers Article::selectFields
         * @covers Article::onArticleCreate
         * @covers Article::onArticleDelete
index 480d7d2..b248d24 100644 (file)
@@ -72,14 +72,20 @@ class BlockTest extends MediaWikiLangTestCase {
         * @covers Block::newFromTarget
         */
        public function testINewFromTargetReturnsCorrectBlock() {
-               $this->assertTrue( $this->block->equals( Block::newFromTarget( 'UTBlockee' ) ), "newFromTarget() returns the same block as the one that was made" );
+               $this->assertTrue(
+                       $this->block->equals( Block::newFromTarget( 'UTBlockee' ) ),
+                       "newFromTarget() returns the same block as the one that was made"
+               );
        }
 
        /**
         * @covers Block::newFromID
         */
        public function testINewFromIDReturnsCorrectBlock() {
-               $this->assertTrue( $this->block->equals( Block::newFromID( $this->blockId ) ), "newFromID() returns the same block as the one that was made" );
+               $this->assertTrue(
+                       $this->block->equals( Block::newFromID( $this->blockId ) ),
+                       "newFromID() returns the same block as the one that was made"
+               );
        }
 
        /**
@@ -88,7 +94,11 @@ class BlockTest extends MediaWikiLangTestCase {
        public function testBug26425BlockTimestampDefaultsToTime() {
                // delta to stop one-off errors when things happen to go over a second mark.
                $delta = abs( $this->madeAt - $this->block->mTimestamp );
-               $this->assertLessThan( 2, $delta, "If no timestamp is specified, the block is recorded as time()" );
+               $this->assertLessThan(
+                       2,
+                       $delta,
+                       "If no timestamp is specified, the block is recorded as time()"
+               );
        }
 
        /**
@@ -101,7 +111,11 @@ class BlockTest extends MediaWikiLangTestCase {
         */
        public function testBug29116NewFromTargetWithEmptyIp( $vagueTarget ) {
                $block = Block::newFromTarget( 'UTBlockee', $vagueTarget );
-               $this->assertTrue( $this->block->equals( $block ), "newFromTarget() returns the same block as the one that was made when given empty vagueTarget param " . var_export( $vagueTarget, true ) );
+               $this->assertTrue(
+                       $this->block->equals( $block ),
+                       "newFromTarget() returns the same block as the one that was made when "
+                               . "given empty vagueTarget param " . var_export( $vagueTarget, true )
+               );
        }
 
        public static function provideBug29116Data() {
@@ -215,7 +229,11 @@ class BlockTest extends MediaWikiLangTestCase {
                $user = null; // clear
 
                $block = Block::newFromID( $res['id'] );
-               $this->assertEquals( 'UserOnForeignWiki', $block->getTarget()->getName(), 'Correct blockee name' );
+               $this->assertEquals(
+                       'UserOnForeignWiki',
+                       $block->getTarget()->getName(),
+                       'Correct blockee name'
+               );
                $this->assertEquals( '14146', $block->getTarget()->getId(), 'Correct blockee id' );
                $this->assertEquals( 'MetaWikiUser', $block->getBlocker(), 'Correct blocker name' );
                $this->assertEquals( 'MetaWikiUser', $block->getByName(), 'Correct blocker name' );
index 4da8448..3c653b4 100644 (file)
@@ -75,7 +75,8 @@ class EditPageTest extends MediaWikiLangTestCase {
         *              * wpTextbox1: the text to submit
         *              * wpSummary: the edit summary
         *              * wpEditToken: the edit token (will be inserted if not provided)
-        *              * wpEdittime: timestamp of the edit's base revision (will be inserted if not provided)
+        *              * wpEdittime: timestamp of the edit's base revision (will be inserted
+        *                if not provided)
         *              * wpStarttime: timestamp when the edit started (will be inserted if not provided)
         *              * wpSectionTitle: the section to edit
         *              * wpMinorEdit: mark as minor edit
@@ -474,8 +475,14 @@ hello
                }
 
                $starttime = wfTimestampNow();
-               $adamsTime = wfTimestamp( TS_MW, (int)wfTimestamp( TS_UNIX, $starttime ) + (int)$adamsEdit['wpStarttime'] );
-               $bertasTime = wfTimestamp( TS_MW, (int)wfTimestamp( TS_UNIX, $starttime ) + (int)$bertasEdit['wpStarttime'] );
+               $adamsTime = wfTimestamp(
+                       TS_MW,
+                       (int)wfTimestamp( TS_UNIX, $starttime ) + (int)$adamsEdit['wpStarttime']
+               );
+               $bertasTime = wfTimestamp(
+                       TS_MW,
+                       (int)wfTimestamp( TS_UNIX, $starttime ) + (int)$bertasEdit['wpStarttime']
+               );
 
                $adamsEdit['wpStarttime'] = $adamsTime;
                $bertasEdit['wpStarttime'] = $bertasTime;
index cd3364e..07c2957 100644 (file)
@@ -75,7 +75,10 @@ class ExternalStoreFOO {
                        return null;
                }
 
-               if ( $itemID !== false && is_array( $this->data[$cluster][$id] ) && isset( $this->data[$cluster][$id][$itemID] ) ) {
+               if ( $itemID !== false
+                       && is_array( $this->data[$cluster][$id] )
+                       && isset( $this->data[$cluster][$id][$itemID] )
+               ) {
                        return $this->data[$cluster][$id][$itemID];
                }
 
index 3cf7abd..4a4130e 100644 (file)
@@ -130,8 +130,16 @@ class ExtraParserTest extends MediaWikiTestCase {
         * @covers Parser::getSection
         */
        public function testGetSection() {
-               $outputText2 = $this->parser->getSection( "Section 0\n== Heading 1 ==\nSection 1\n=== Heading 2 ===\nSection 2\n== Heading 3 ==\nSection 3\n", 2 );
-               $outputText1 = $this->parser->getSection( "Section 0\n== Heading 1 ==\nSection 1\n=== Heading 2 ===\nSection 2\n== Heading 3 ==\nSection 3\n", 1 );
+               $outputText2 = $this->parser->getSection(
+                       "Section 0\n== Heading 1 ==\nSection 1\n=== Heading 2 ===\n"
+                               . "Section 2\n== Heading 3 ==\nSection 3\n",
+                       2
+               );
+               $outputText1 = $this->parser->getSection(
+                       "Section 0\n== Heading 1 ==\nSection 1\n=== Heading 2 ===\n"
+                               . "Section 2\n== Heading 3 ==\nSection 3\n",
+                       1
+               );
 
                $this->assertEquals( "=== Heading 2 ===\nSection 2", $outputText2 );
                $this->assertEquals( "== Heading 1 ==\nSection 1\n=== Heading 2 ===\nSection 2", $outputText1 );
@@ -141,7 +149,12 @@ class ExtraParserTest extends MediaWikiTestCase {
         * @covers Parser::replaceSection
         */
        public function testReplaceSection() {
-               $outputText = $this->parser->replaceSection( "Section 0\n== Heading 1 ==\nSection 1\n=== Heading 2 ===\nSection 2\n== Heading 3 ==\nSection 3\n", 1, "New section 1" );
+               $outputText = $this->parser->replaceSection(
+                       "Section 0\n== Heading 1 ==\nSection 1\n=== Heading 2 ===\n"
+                               . "Section 2\n== Heading 3 ==\nSection 3\n",
+                       1,
+                       "New section 1"
+               );
 
                $this->assertEquals( "Section 0\nNew section 1\n\n== Heading 3 ==\nSection 3", $outputText );
        }
@@ -152,7 +165,11 @@ class ExtraParserTest extends MediaWikiTestCase {
         */
        public function testGetPreloadText() {
                $title = Title::newFromText( __FUNCTION__ );
-               $outputText = $this->parser->getPreloadText( "{{Foo}}<noinclude> censored</noinclude> information <!-- is very secret -->", $title, $this->options );
+               $outputText = $this->parser->getPreloadText(
+                       "{{Foo}}<noinclude> censored</noinclude> information <!-- is very secret -->",
+                       $title,
+                       $this->options
+               );
 
                $this->assertEquals( "{{Foo}} information <!-- is very secret -->", $outputText );
        }
index 910b766..c60170f 100644 (file)
@@ -4,11 +4,11 @@
  * @covers Fallback
  */
 class FallbackTest extends MediaWikiTestCase {
-
        public function testFallbackMbstringFunctions() {
-
                if ( !extension_loaded( 'mbstring' ) ) {
-                       $this->markTestSkipped( "The mb_string functions must be installed to test the fallback functions" );
+                       $this->markTestSkipped(
+                               "The mb_string functions must be installed to test the fallback functions"
+                       );
                }
 
                $sampleUTF = "Östergötland_coat_of_arms.png";
index 3246410..745a5b4 100644 (file)
@@ -1,7 +1,6 @@
 <?php
 
 class FauxRequestTest extends MediaWikiTestCase {
-
        /**
         * @covers FauxRequest::setHeader
         * @covers FauxRequest::getHeader
index 7f41cfd..4a974ba 100644 (file)
@@ -49,16 +49,32 @@ class FauxResponseTest extends MediaWikiTestCase {
                $this->assertEquals( null, $this->response->getheader( 'Location' ), 'Non-existing header' );
 
                $this->response->header( 'Location: http://localhost/' );
-               $this->assertEquals( 'http://localhost/', $this->response->getheader( 'Location' ), 'Set header' );
+               $this->assertEquals(
+                       'http://localhost/',
+                       $this->response->getheader( 'Location' ),
+                       'Set header'
+               );
 
                $this->response->header( 'Location: http://127.0.0.1/' );
-               $this->assertEquals( 'http://127.0.0.1/', $this->response->getheader( 'Location' ), 'Same header' );
+               $this->assertEquals(
+                       'http://127.0.0.1/',
+                       $this->response->getheader( 'Location' ),
+                       'Same header'
+               );
 
                $this->response->header( 'Location: http://127.0.0.2/', false );
-               $this->assertEquals( 'http://127.0.0.1/', $this->response->getheader( 'Location' ), 'Same header with override disabled' );
+               $this->assertEquals(
+                       'http://127.0.0.1/',
+                       $this->response->getheader( 'Location' ),
+                       'Same header with override disabled'
+               );
 
                $this->response->header( 'Location: http://localhost/' );
-               $this->assertEquals( 'http://localhost/', $this->response->getheader( 'LOCATION' ), 'Get header case insensitive' );
+               $this->assertEquals(
+                       'http://localhost/',
+                       $this->response->getheader( 'LOCATION' ),
+                       'Get header case insensitive'
+               );
        }
 
        /**
@@ -69,18 +85,34 @@ class FauxResponseTest extends MediaWikiTestCase {
                $this->assertEquals( 200, $this->response->getStatusCode(), 'Header with no message' );
 
                $this->response->header( 'HTTP/1.x 201' );
-               $this->assertEquals( 201, $this->response->getStatusCode(), 'Header with no message and protocol 1.x' );
+               $this->assertEquals(
+                       201,
+                       $this->response->getStatusCode(),
+                       'Header with no message and protocol 1.x'
+               );
 
                $this->response->header( 'HTTP/1.1 202 OK' );
                $this->assertEquals( 202, $this->response->getStatusCode(), 'Normal header' );
 
                $this->response->header( 'HTTP/1.x 203 OK' );
-               $this->assertEquals( 203, $this->response->getStatusCode(), 'Normal header with no message and protocol 1.x' );
+               $this->assertEquals(
+                       203,
+                       $this->response->getStatusCode(),
+                       'Normal header with no message and protocol 1.x'
+               );
 
                $this->response->header( 'HTTP/1.x 204 OK', false, 205 );
-               $this->assertEquals( 205, $this->response->getStatusCode(), 'Third parameter overrides the HTTP/... header' );
+               $this->assertEquals(
+                       205,
+                       $this->response->getStatusCode(),
+                       'Third parameter overrides the HTTP/... header'
+               );
 
                $this->response->header( 'Location: http://localhost/', false, 206 );
-               $this->assertEquals( 206, $this->response->getStatusCode(), 'Third parameter with another header' );
+               $this->assertEquals(
+                       206,
+                       $this->response->getStatusCode(),
+                       'Third parameter with another header'
+               );
        }
 }
diff --git a/tests/phpunit/includes/GitInfoTest.php b/tests/phpunit/includes/GitInfoTest.php
new file mode 100644 (file)
index 0000000..7c684d5
--- /dev/null
@@ -0,0 +1,42 @@
+<?php
+/**
+ * @covers GitInfo
+ */
+class GitInfoTest extends MediaWikiTestCase {
+
+       protected function setUp() {
+               parent::setUp();
+               $this->setMwGlobals( 'wgCacheDirectory', __DIR__ . '/../data' );
+       }
+
+       public function testValidJsonData() {
+               $dir = $GLOBALS['IP'] . '/testValidJsonData';
+               $fixture = new GitInfo( $dir );
+
+               $this->assertTrue( $fixture->cacheIsComplete() );
+               $this->assertEquals( 'refs/heads/master', $fixture->getHead() );
+               $this->assertEquals( '0123456789abcdef0123456789abcdef01234567',
+                       $fixture->getHeadSHA1() );
+               $this->assertEquals( '1070884800', $fixture->getHeadCommitDate() );
+               $this->assertEquals( 'master', $fixture->getCurrentBranch() );
+               $this->assertContains( '0123456789abcdef0123456789abcdef01234567',
+                       $fixture->getHeadViewUrl() );
+       }
+
+       public function testMissingJsonData() {
+               $dir = $GLOBALS['IP'] . '/testMissingJsonData';
+               $fixture = new GitInfo( $dir );
+
+               $this->assertFalse( $fixture->cacheIsComplete() );
+
+               $this->assertEquals( false, $fixture->getHead() );
+               $this->assertEquals( false, $fixture->getHeadSHA1() );
+               $this->assertEquals( false, $fixture->getHeadCommitDate() );
+               $this->assertEquals( false, $fixture->getCurrentBranch() );
+               $this->assertEquals( false, $fixture->getHeadViewUrl() );
+
+               // After calling all the outputs, the cache should be complete
+               $this->assertTrue( $fixture->cacheIsComplete() );
+       }
+
+}
index 4e30bdd..06b512d 100644 (file)
@@ -80,7 +80,11 @@ class GlobalTest extends MediaWikiTestCase {
        public function testExpandIRI() {
                $this->assertEquals(
                        "https://te.wikibooks.org/wiki/ఉబుంటు_వాడుకరి_మార్గదర్శని",
-                       wfExpandIRI( "https://te.wikibooks.org/wiki/%E0%B0%89%E0%B0%AC%E0%B1%81%E0%B0%82%E0%B0%9F%E0%B1%81_%E0%B0%B5%E0%B0%BE%E0%B0%A1%E0%B1%81%E0%B0%95%E0%B0%B0%E0%B0%BF_%E0%B0%AE%E0%B0%BE%E0%B0%B0%E0%B1%8D%E0%B0%97%E0%B0%A6%E0%B0%B0%E0%B1%8D%E0%B0%B6%E0%B0%A8%E0%B0%BF" ) );
+                       wfExpandIRI( "https://te.wikibooks.org/wiki/"
+                               . "%E0%B0%89%E0%B0%AC%E0%B1%81%E0%B0%82%E0%B0%9F%E0%B1%81_"
+                               . "%E0%B0%B5%E0%B0%BE%E0%B0%A1%E0%B1%81%E0%B0%95%E0%B0%B0%E0%B0%BF_"
+                               . "%E0%B0%AE%E0%B0%BE%E0%B0%B0%E0%B1%8D%E0%B0%97%E0%B0%A6%E0%B0%B0"
+                               . "%E0%B1%8D%E0%B0%B6%E0%B0%A8%E0%B0%BF" ) );
        }
 
        /**
@@ -125,11 +129,20 @@ class GlobalTest extends MediaWikiTestCase {
                        array( array( 'foo' => false ), '' ), // false test
                        array( array( 'foo' => null ), '' ), // null test
                        array( array( 'foo' => 'A&B=5+6@!"\'' ), 'foo=A%26B%3D5%2B6%40%21%22%27' ), // urlencoding test
-                       array( array( 'foo' => 'bar', 'baz' => 'is', 'asdf' => 'qwerty' ), 'foo=bar&baz=is&asdf=qwerty' ), // multi-item test
+                       array(
+                               array( 'foo' => 'bar', 'baz' => 'is', 'asdf' => 'qwerty' ),
+                               'foo=bar&baz=is&asdf=qwerty'
+                       ), // multi-item test
                        array( array( 'foo' => array( 'bar' => 'baz' ) ), 'foo%5Bbar%5D=baz' ),
-                       array( array( 'foo' => array( 'bar' => 'baz', 'qwerty' => 'asdf' ) ), 'foo%5Bbar%5D=baz&foo%5Bqwerty%5D=asdf' ),
+                       array(
+                               array( 'foo' => array( 'bar' => 'baz', 'qwerty' => 'asdf' ) ),
+                               'foo%5Bbar%5D=baz&foo%5Bqwerty%5D=asdf'
+                       ),
                        array( array( 'foo' => array( 'bar', 'baz' ) ), 'foo%5B0%5D=bar&foo%5B1%5D=baz' ),
-                       array( array( 'foo' => array( 'bar' => array( 'bar' => 'baz' ) ) ), 'foo%5Bbar%5D%5Bbar%5D=baz' ),
+                       array(
+                               array( 'foo' => array( 'bar' => array( 'bar' => 'baz' ) ) ),
+                               'foo%5Bbar%5D%5Bbar%5D=baz'
+                       ),
                );
        }
 
@@ -161,9 +174,15 @@ class GlobalTest extends MediaWikiTestCase {
                        array( 'foo=bar&qwerty=asdf', array( 'foo' => 'bar', 'qwerty' => 'asdf' ) ), // multiple value
                        array( 'foo=A%26B%3D5%2B6%40%21%22%27', array( 'foo' => 'A&B=5+6@!"\'' ) ), // urldecoding test
                        array( 'foo%5Bbar%5D=baz', array( 'foo' => array( 'bar' => 'baz' ) ) ),
-                       array( 'foo%5Bbar%5D=baz&foo%5Bqwerty%5D=asdf', array( 'foo' => array( 'bar' => 'baz', 'qwerty' => 'asdf' ) ) ),
+                       array(
+                               'foo%5Bbar%5D=baz&foo%5Bqwerty%5D=asdf',
+                               array( 'foo' => array( 'bar' => 'baz', 'qwerty' => 'asdf' ) )
+                       ),
                        array( 'foo%5B0%5D=bar&foo%5B1%5D=baz', array( 'foo' => array( 0 => 'bar', 1 => 'baz' ) ) ),
-                       array( 'foo%5Bbar%5D%5Bbar%5D=baz', array( 'foo' => array( 'bar' => array( 'bar' => 'baz' ) ) ) ),
+                       array(
+                               'foo%5Bbar%5D%5Bbar%5D=baz',
+                               array( 'foo' => array( 'bar' => array( 'bar' => 'baz' ) ) )
+                       ),
                );
        }
 
@@ -288,15 +307,24 @@ class GlobalTest extends MediaWikiTestCase {
                unlink( $wgDebugLogFile );
 
                wfDebug( "\00305This has böth UTF and control chars\003" );
-               $this->assertEquals( " 05This has böth UTF and control chars ", file_get_contents( $wgDebugLogFile ) );
+               $this->assertEquals(
+                       " 05This has böth UTF and control chars ",
+                       file_get_contents( $wgDebugLogFile )
+               );
                unlink( $wgDebugLogFile );
 
                wfDebugMem();
-               $this->assertGreaterThan( 1000, preg_replace( '/\D/', '', file_get_contents( $wgDebugLogFile ) ) );
+               $this->assertGreaterThan(
+                       1000,
+                       preg_replace( '/\D/', '', file_get_contents( $wgDebugLogFile ) )
+               );
                unlink( $wgDebugLogFile );
 
                wfDebugMem( true );
-               $this->assertGreaterThan( 1000000, preg_replace( '/\D/', '', file_get_contents( $wgDebugLogFile ) ) );
+               $this->assertGreaterThan(
+                       1000000,
+                       preg_replace( '/\D/', '', file_get_contents( $wgDebugLogFile ) )
+               );
                unlink( $wgDebugLogFile );
 
                $wgDebugLogFile = $old_log_file;
@@ -591,13 +619,48 @@ class GlobalTest extends MediaWikiTestCase {
                $protocols = array( 'HTTP' => 'http:', 'HTTPS' => 'https:', 'protocol-relative' => '' );
                foreach ( $protocols as $pDesc => $p ) {
                        $a = array_merge( $a, array(
-                               array( "$p//www.example.com", array(), false, "No matches for empty domains array, $pDesc URL" ),
-                               array( "$p//www.example.com", array( 'www.example.com' ), true, "Exact match in domains array, $pDesc URL" ),
-                               array( "$p//www.example.com", array( 'example.com' ), true, "Match without subdomain in domains array, $pDesc URL" ),
-                               array( "$p//www.example2.com", array( 'www.example.com', 'www.example2.com', 'www.example3.com' ), true, "Exact match with other domains in array, $pDesc URL" ),
-                               array( "$p//www.example2.com", array( 'example.com', 'example2.com', 'example3,com' ), true, "Match without subdomain with other domains in array, $pDesc URL" ),
-                               array( "$p//www.example4.com", array( 'example.com', 'example2.com', 'example3,com' ), false, "Domain not in array, $pDesc URL" ),
-                               array( "$p//nds-nl.wikipedia.org", array( 'nl.wikipedia.org' ), false, "Non-matching substring of domain, $pDesc URL" ),
+                               array(
+                                       "$p//www.example.com",
+                                       array(),
+                                       false,
+                                       "No matches for empty domains array, $pDesc URL"
+                               ),
+                               array(
+                                       "$p//www.example.com",
+                                       array( 'www.example.com' ),
+                                       true,
+                                       "Exact match in domains array, $pDesc URL"
+                               ),
+                               array(
+                                       "$p//www.example.com",
+                                       array( 'example.com' ),
+                                       true,
+                                       "Match without subdomain in domains array, $pDesc URL"
+                               ),
+                               array(
+                                       "$p//www.example2.com",
+                                       array( 'www.example.com', 'www.example2.com', 'www.example3.com' ),
+                                       true,
+                                       "Exact match with other domains in array, $pDesc URL"
+                               ),
+                               array(
+                                       "$p//www.example2.com",
+                                       array( 'example.com', 'example2.com', 'example3,com' ),
+                                       true,
+                                       "Match without subdomain with other domains in array, $pDesc URL"
+                               ),
+                               array(
+                                       "$p//www.example4.com",
+                                       array( 'example.com', 'example2.com', 'example3,com' ),
+                                       false,
+                                       "Domain not in array, $pDesc URL"
+                               ),
+                               array(
+                                       "$p//nds-nl.wikipedia.org",
+                                       array( 'nl.wikipedia.org' ),
+                                       false,
+                                       "Non-matching substring of domain, $pDesc URL"
+                               ),
                        ) );
                }
 
@@ -620,7 +683,9 @@ class GlobalTest extends MediaWikiTestCase {
         * @dataProvider provideWfShellMaintenanceCmdList
         * @covers ::wfShellMaintenanceCmd
         */
-       public function testWfShellMaintenanceCmd( $script, $parameters, $options, $expected, $description ) {
+       public function testWfShellMaintenanceCmd( $script, $parameters, $options,
+               $expected, $description
+       ) {
                if ( wfIsWindows() ) {
                        // Approximation that's good enough for our purposes just now
                        $expected = str_replace( "'", '"', $expected );
@@ -642,9 +707,13 @@ class GlobalTest extends MediaWikiTestCase {
                        array( 'eval.php', array( '--help', '--test', 'X' ), array( 'wrapper' => 'MWScript.php' ),
                                "'$wgPhpCli' 'MWScript.php' 'eval.php' '--help' '--test' 'X'",
                                "Called eval.php --help --test with wrapper option" ),
-                       array( 'eval.php', array( '--help', '--test', 'y' ), array( 'php' => 'php5', 'wrapper' => 'MWScript.php' ),
+                       array(
+                               'eval.php',
+                               array( '--help', '--test', 'y' ),
+                               array( 'php' => 'php5', 'wrapper' => 'MWScript.php' ),
                                "'php5' 'MWScript.php' 'eval.php' '--help' '--test' 'y'",
-                               "Called eval.php --help --test with wrapper and php option" ),
+                               "Called eval.php --help --test with wrapper and php option"
+                       ),
                );
        }
        /* @TODO many more! */
index 7da804e..79dd91d 100644 (file)
@@ -176,7 +176,13 @@ class WfBaseConvertTest extends MediaWikiTestCase {
 
        public function testPadding() {
                $number = "10101010101";
-               $this->assertSame( strlen( $number ) + 5, strlen( wfBaseConvert( $number, 2, 2, strlen( $number ) + 5 ) ) );
-               $this->assertSame( strlen( $number ), strlen( wfBaseConvert( $number, 2, 2, strlen( $number ) - 5 ) ) );
+               $this->assertSame(
+                       strlen( $number ) + 5,
+                       strlen( wfBaseConvert( $number, 2, 2, strlen( $number ) + 5 ) )
+               );
+               $this->assertSame(
+                       strlen( $number ),
+                       strlen( wfBaseConvert( $number, 2, 2, strlen( $number ) - 5 ) )
+               );
        }
 }
index 8c54804..516c1b9 100644 (file)
@@ -27,8 +27,11 @@ class WfBaseNameTest extends MediaWikiTestCase {
                        array( '/aaaa/', 'aaaa' ),
                        array( '\\aaaa\\', 'aaaa' ),
                        array( '\\aaaa\\', 'aaaa' ),
-                       array( '/mnt/upload3/wikipedia/en/thumb/8/8b/Zork_Grand_Inquisitor_box_cover.jpg/93px-Zork_Grand_Inquisitor_box_cover.jpg',
-                               '93px-Zork_Grand_Inquisitor_box_cover.jpg' ),
+                       array(
+                               '/mnt/upload3/wikipedia/en/thumb/8/8b/'
+                                       . 'Zork_Grand_Inquisitor_box_cover.jpg/93px-Zork_Grand_Inquisitor_box_cover.jpg',
+                               '93px-Zork_Grand_Inquisitor_box_cover.jpg'
+                       ),
                        array( 'C:\\Progra~1\\Wikime~1\\Wikipe~1\\VIEWER.EXE', 'VIEWER.EXE' ),
                        array( 'Östergötland_coat_of_arms.png', 'Östergötland_coat_of_arms.png' ),
                );
index b06f3d2..9effc30 100644 (file)
@@ -6,7 +6,9 @@ class WfExpandUrlTest extends MediaWikiTestCase {
        /**
         * @dataProvider provideExpandableUrls
         */
-       public function testWfExpandUrl( $fullUrl, $shortUrl, $defaultProto, $server, $canServer, $httpsMode, $message ) {
+       public function testWfExpandUrl( $fullUrl, $shortUrl, $defaultProto,
+               $server, $canServer, $httpsMode, $message
+       ) {
                // Fake $wgServer, $wgCanonicalServer and $wgRequest->getProtocol()
                $this->setMwGlobals( array(
                        'wgServer' => $server,
@@ -47,21 +49,24 @@ class WfExpandUrlTest extends MediaWikiTestCase {
                                                $retval[] = array(
                                                        'http://example.com', 'http://example.com',
                                                        $defaultProto, $server, $canServer, $httpsMode,
-                                                       "Testing fully qualified http URLs (no need to expand) ' .
-                                                       '(defaultProto: $protoDesc , wgServer: $server, wgCanonicalServer: $canServer, current request protocol: $mode )"
+                                                       "Testing fully qualified http URLs (no need to expand) "
+                                                               . "(defaultProto: $protoDesc , wgServer: $server, "
+                                                               . "wgCanonicalServer: $canServer, current request protocol: $mode )"
                                                );
                                                $retval[] = array(
                                                        'https://example.com', 'https://example.com',
                                                        $defaultProto, $server, $canServer, $httpsMode,
-                                                       "Testing fully qualified https URLs (no need to expand) ' .
-                                                       '(defaultProto: $protoDesc , wgServer: $server, wgCanonicalServer: $canServer, current request protocol: $mode )"
+                                                       "Testing fully qualified https URLs (no need to expand) "
+                                                               . "(defaultProto: $protoDesc , wgServer: $server, "
+                                                               . "wgCanonicalServer: $canServer, current request protocol: $mode )"
                                                );
                                                # Would be nice to support this, see fixme on wfExpandUrl()
                                                $retval[] = array(
                                                        "wiki/FooBar", 'wiki/FooBar',
                                                        $defaultProto, $server, $canServer, $httpsMode,
-                                                       "Test non-expandable relative URLs ' .
-                                                       '(defaultProto: $protoDesc , wgServer: $server, wgCanonicalServer: $canServer, current request protocol: $mode )"
+                                                       "Test non-expandable relative URLs (defaultProto: $protoDesc, "
+                                                               . "wgServer: $server, wgCanonicalServer: $canServer, "
+                                                               . "current request protocol: $mode )"
                                                );
 
                                                // Determine expected protocol
@@ -86,14 +91,20 @@ class WfExpandUrlTest extends MediaWikiTestCase {
                                                $retval[] = array(
                                                        "$p//wikipedia.org", '//wikipedia.org',
                                                        $defaultProto, $server, $canServer, $httpsMode,
-                                                       "Test protocol-relative URL ' .
-                                                       '(defaultProto: $protoDesc, wgServer: $server, wgCanonicalServer: $canServer, current request protocol: $mode )"
+                                                       "Test protocol-relative URL (defaultProto: $protoDesc, "
+                                                               . "wgServer: $server, wgCanonicalServer: $canServer, "
+                                                               . "current request protocol: $mode )"
                                                );
                                                $retval[] = array(
-                                                       "$srv/wiki/FooBar", '/wiki/FooBar',
-                                                       $defaultProto, $server, $canServer, $httpsMode,
-                                                       "Testing expanding URL beginning with / ' .
-                                                       '(defaultProto: $protoDesc , wgServer: $server, wgCanonicalServer: $canServer, current request protocol: $mode )"
+                                                       "$srv/wiki/FooBar",
+                                                       '/wiki/FooBar',
+                                                       $defaultProto,
+                                                       $server,
+                                                       $canServer,
+                                                       $httpsMode,
+                                                       "Testing expanding URL beginning with / (defaultProto: $protoDesc, "
+                                                               . "wgServer: $server, wgCanonicalServer: $canServer, "
+                                                               . "current request protocol: $mode )"
                                                );
                                        }
                                }
index 6229624..bdb3044 100644 (file)
@@ -4,7 +4,6 @@
  * @covers ::wfGetCaller
  */
 class WfGetCallerTest extends MediaWikiTestCase {
-
        public function testZero() {
                $this->assertEquals( __METHOD__, wfGetCaller( 1 ) );
        }
@@ -31,10 +30,16 @@ class WfGetCallerTest extends MediaWikiTestCase {
 
        public function testN() {
                $this->assertEquals( 'WfGetCallerTest::testN', self::intermediateFunction( 2, 0 ) );
-               $this->assertEquals( 'WfGetCallerTest::intermediateFunction', self::intermediateFunction( 1, 0 ) );
+               $this->assertEquals(
+                       'WfGetCallerTest::intermediateFunction',
+                       self::intermediateFunction( 1, 0 )
+               );
 
                for ( $i = 0; $i < 10; $i++ ) {
-                       $this->assertEquals( 'WfGetCallerTest::intermediateFunction', self::intermediateFunction( $i + 1, $i ) );
+                       $this->assertEquals(
+                               'WfGetCallerTest::intermediateFunction',
+                               self::intermediateFunction( $i + 1, $i )
+                       );
                }
        }
 }
index 5998f18..6335d11 100644 (file)
@@ -32,22 +32,52 @@ class WfTimestampTest extends MediaWikiTestCase {
                        array( '2001-01-15 12:34:56', TS_MW, '20010115123456', 'TS_DB to TS_MW' ),
                        array( '2001-01-15 12:34:56', TS_UNIX, 979562096, 'TS_DB to TS_UNIX' ),
                        array( '2001-01-15 12:34:56', TS_DB, '2001-01-15 12:34:56', 'TS_DB to TS_DB' ),
-                       array( '2001-01-15 12:34:56', TS_ISO_8601_BASIC, '20010115T123456Z', 'TS_DB to TS_ISO_8601_BASIC' ),
+                       array(
+                               '2001-01-15 12:34:56',
+                               TS_ISO_8601_BASIC,
+                               '20010115T123456Z',
+                               'TS_DB to TS_ISO_8601_BASIC'
+                       ),
 
                        # rfc2822 section 3.3
                        array( '20010115123456', TS_RFC2822, 'Mon, 15 Jan 2001 12:34:56 GMT', 'TS_MW to TS_RFC2822' ),
                        array( 'Mon, 15 Jan 2001 12:34:56 GMT', TS_MW, '20010115123456', 'TS_RFC2822 to TS_MW' ),
-                       array( ' Mon, 15 Jan 2001 12:34:56 GMT', TS_MW, '20010115123456', 'TS_RFC2822 with leading space to TS_MW' ),
-                       array( '15 Jan 2001 12:34:56 GMT', TS_MW, '20010115123456', 'TS_RFC2822 without optional day-of-week to TS_MW' ),
+                       array(
+                               ' Mon, 15 Jan 2001 12:34:56 GMT',
+                               TS_MW,
+                               '20010115123456',
+                               'TS_RFC2822 with leading space to TS_MW'
+                       ),
+                       array(
+                               '15 Jan 2001 12:34:56 GMT',
+                               TS_MW,
+                               '20010115123456',
+                               'TS_RFC2822 without optional day-of-week to TS_MW'
+                       ),
 
                        # FWS = ([*WSP CRLF] 1*WSP) / obs-FWS ; Folding white space
                        # obs-FWS = 1*WSP *(CRLF 1*WSP) ; Section 4.2
                        array( 'Mon, 15         Jan 2001 12:34:56 GMT', TS_MW, '20010115123456', 'TS_RFC2822 to TS_MW' ),
 
                        # WSP = SP / HTAB ; rfc2234
-                       array( "Mon, 15 Jan\x092001 12:34:56 GMT", TS_MW, '20010115123456', 'TS_RFC2822 with HTAB to TS_MW' ),
-                       array( "Mon, 15 Jan\x09 \x09  2001 12:34:56 GMT", TS_MW, '20010115123456', 'TS_RFC2822 with HTAB and SP to TS_MW' ),
-                       array( 'Sun, 6 Nov 94 08:49:37 GMT', TS_MW, '19941106084937', 'TS_RFC2822 with obsolete year to TS_MW' ),
+                       array(
+                               "Mon, 15 Jan\x092001 12:34:56 GMT",
+                               TS_MW,
+                               '20010115123456',
+                               'TS_RFC2822 with HTAB to TS_MW'
+                       ),
+                       array(
+                               "Mon, 15 Jan\x09 \x09  2001 12:34:56 GMT",
+                               TS_MW,
+                               '20010115123456',
+                               'TS_RFC2822 with HTAB and SP to TS_MW'
+                       ),
+                       array(
+                               'Sun, 6 Nov 94 08:49:37 GMT',
+                               TS_MW,
+                               '19941106084937',
+                               'TS_RFC2822 with obsolete year to TS_MW'
+                       ),
                );
        }
 
@@ -63,19 +93,33 @@ class WfTimestampTest extends MediaWikiTestCase {
 
        public static function provideOldTimestamps() {
                return array(
-                       array( '19011213204554', TS_RFC2822, 'Fri, 13 Dec 1901 20:45:54 GMT', 'Earliest time according to php documentation' ),
+                       array(
+                               '19011213204554',
+                               TS_RFC2822,
+                               'Fri, 13 Dec 1901 20:45:54 GMT',
+                               'Earliest time according to PHP documentation'
+                       ),
                        array( '20380119031407', TS_RFC2822, 'Tue, 19 Jan 2038 03:14:07 GMT', 'Latest 32 bit time' ),
                        array( '19011213204552', TS_UNIX, '-2147483648', 'Earliest 32 bit unix time' ),
                        array( '20380119031407', TS_UNIX, '2147483647', 'Latest 32 bit unix time' ),
                        array( '19011213204552', TS_RFC2822, 'Fri, 13 Dec 1901 20:45:52 GMT', 'Earliest 32 bit time' ),
-                       array( '19011213204551', TS_RFC2822, 'Fri, 13 Dec 1901 20:45:51 GMT', 'Earliest 32 bit time - 1' ),
+                       array(
+                               '19011213204551',
+                               TS_RFC2822,
+                               'Fri, 13 Dec 1901 20:45:51 GMT', 'Earliest 32 bit time - 1'
+                       ),
                        array( '20380119031408', TS_RFC2822, 'Tue, 19 Jan 2038 03:14:08 GMT', 'Latest 32 bit time + 1' ),
                        array( '19011212000000', TS_MW, '19011212000000', 'Convert to itself r74778#c10645' ),
                        array( '19011213204551', TS_UNIX, '-2147483649', 'Earliest 32 bit unix time - 1' ),
                        array( '20380119031408', TS_UNIX, '2147483648', 'Latest 32 bit unix time + 1' ),
                        array( '-2147483649', TS_MW, '19011213204551', '1901 negative unix time to MediaWiki' ),
                        array( '-5331871504', TS_MW, '18010115123456', '1801 negative unix time to MediaWiki' ),
-                       array( '0117-08-09 12:34:56', TS_RFC2822, 'Tue, 09 Aug 0117 12:34:56 GMT', 'Death of Roman Emperor [[Trajan]]' ),
+                       array(
+                               '0117-08-09 12:34:56',
+                               TS_RFC2822,
+                               'Tue, 09 Aug 0117 12:34:56 GMT',
+                               'Death of Roman Emperor [[Trajan]]'
+                       ),
 
                        /* @todo FIXME: 00 to 101 years are taken as being in [1970-2069] */
                        array( '-58979923200', TS_RFC2822, 'Sun, 01 Jan 0101 00:00:00 GMT', '1/1/101' ),
@@ -85,7 +129,12 @@ class WfTimestampTest extends MediaWikiTestCase {
                         * We are completely off RFC2822 requirement of year being
                         * 1900 or later.
                         */
-                       array( '-62142076800', TS_RFC2822, 'Wed, 18 Oct 0000 00:00:00 GMT', 'ISO 8601:2004 [[year 0]], also called [[1 BC]]' ),
+                       array(
+                               '-62142076800',
+                               TS_RFC2822,
+                               'Wed, 18 Oct 0000 00:00:00 GMT',
+                               'ISO 8601:2004 [[year 0]], also called [[1 BC]]'
+                       ),
                );
        }
 
@@ -106,7 +155,11 @@ class WfTimestampTest extends MediaWikiTestCase {
                        array( 'Sunday, 06-Nov-94 08:49:37 GMT', '19941106084937', 'RFC 850 date' ),
                        array( 'Sun Nov  6 08:49:37 1994', '19941106084937', "ANSI C's asctime() format" ),
                        // See http://www.squid-cache.org/mail-archive/squid-users/200307/0122.html and r77171
-                       array( 'Mon, 22 Nov 2010 14:12:42 GMT; length=52626', '20101122141242', 'Netscape extension to HTTP/1.0' ),
+                       array(
+                               'Mon, 22 Nov 2010 14:12:42 GMT; length=52626',
+                               '20101122141242',
+                               'Netscape extension to HTTP/1.0'
+                       ),
                );
        }
 
index ce6c82c..783b985 100644 (file)
@@ -62,12 +62,14 @@ class WfUrlencodeTest extends MediaWikiTestCase {
                        return $expectations;
                } elseif ( is_array( $expectations ) ) {
                        if ( !array_key_exists( $server, $expectations ) ) {
-                               throw new MWException( __METHOD__ . " expectation does not have any value for server name $server. Check the provider array.\n" );
+                               throw new MWException( __METHOD__ . " expectation does not have any "
+                                       . "value for server name $server. Check the provider array.\n" );
                        } else {
                                return $expectations[$server];
                        }
                } else {
-                       throw new MWException( __METHOD__ . " given invalid expectation for '$server'. Should be a string or an array( <http server name> => <string> ).\n" );
+                       throw new MWException( __METHOD__ . " given invalid expectation for "
+                               . "'$server'. Should be a string or an array( <http server name> => <string> ).\n" );
                }
        }
 
index 87af6c1..74d4b09 100644 (file)
@@ -13,11 +13,26 @@ class HooksTest extends MediaWikiTestCase {
                $i = new NothingClass();
 
                return array(
-                       array( 'Object and method', array( $i, 'someNonStatic' ), 'changed-nonstatic', 'changed-nonstatic' ),
+                       array(
+                               'Object and method',
+                               array( $i, 'someNonStatic' ),
+                               'changed-nonstatic',
+                               'changed-nonstatic'
+                       ),
                        array( 'Object and no method', array( $i ), 'changed-onevent', 'original' ),
-                       array( 'Object and method with data', array( $i, 'someNonStaticWithData', 'data' ), 'data', 'original' ),
+                       array(
+                               'Object and method with data',
+                               array( $i, 'someNonStaticWithData', 'data' ),
+                               'data',
+                               'original'
+                       ),
                        array( 'Object and static method', array( $i, 'someStatic' ), 'changed-static', 'original' ),
-                       array( 'Class::method static call', array( 'NothingClass::someStatic' ), 'changed-static', 'original' ),
+                       array(
+                               'Class::method static call',
+                               array( 'NothingClass::someStatic' ),
+                               'changed-static',
+                               'original'
+                       ),
                        array( 'Global function', array( 'NothingFunction' ), 'changed-func', 'original' ),
                        array( 'Global function with data', array( 'NothingFunctionData', 'data' ), 'data', 'original' ),
                        array( 'Closure', array( function ( &$foo, $bar ) {
@@ -76,17 +91,32 @@ class HooksTest extends MediaWikiTestCase {
                $b = new NothingClass();
 
                $wgHooks['MediaWikiHooksTest001'][] = $a;
-               $this->assertTrue( Hooks::isRegistered( 'MediaWikiHooksTest001' ), 'Hook registered via $wgHooks should be noticed by Hooks::isRegistered' );
+               $this->assertTrue(
+                       Hooks::isRegistered( 'MediaWikiHooksTest001' ),
+                       'Hook registered via $wgHooks should be noticed by Hooks::isRegistered'
+               );
 
                Hooks::register( 'MediaWikiHooksTest001', $b );
-               $this->assertEquals( 2, count( Hooks::getHandlers( 'MediaWikiHooksTest001' ) ), 'Hooks::getHandlers() should return hooks registered via wgHooks as well as Hooks::register' );
+               $this->assertEquals(
+                       2,
+                       count( Hooks::getHandlers( 'MediaWikiHooksTest001' ) ),
+                       'Hooks::getHandlers() should return hooks registered via wgHooks as well as Hooks::register'
+               );
 
                $foo = 'quux';
                $bar = 'qaax';
 
                Hooks::run( 'MediaWikiHooksTest001', array( &$foo, &$bar ) );
-               $this->assertEquals( 1, $a->calls, 'Hooks::run() should run hooks registered via wgHooks as well as Hooks::register' );
-               $this->assertEquals( 1, $b->calls, 'Hooks::run() should run hooks registered via wgHooks as well as Hooks::register' );
+               $this->assertEquals(
+                       1,
+                       $a->calls,
+                       'Hooks::run() should run hooks registered via wgHooks as well as Hooks::register'
+               );
+               $this->assertEquals(
+                       1,
+                       $b->calls,
+                       'Hooks::run() should run hooks registered via wgHooks as well as Hooks::register'
+               );
        }
 
        /**
index 98eff7b..c1b637b 100644 (file)
@@ -6,9 +6,15 @@
 class HtmlFormatterTest extends MediaWikiTestCase {
        /**
         * @dataProvider getHtmlData
-        * @covers HtmlFormatter::getText
+        *
+        * @param string $input
+        * @param $expectedText
+        * @param array $expectedRemoved
+        * @param callable|bool $callback
         */
-       public function testTransform( $input, $expectedText, $expectedRemoved = array(), $callback = false ) {
+       public function testTransform( $input, $expectedText,
+               $expectedRemoved = array(), $callback = false
+       ) {
                $input = self::normalize( $input );
                $formatter = new HtmlFormatter( HtmlFormatter::wrapHTML( $input ) );
                if ( $callback ) {
@@ -56,9 +62,11 @@ class HtmlFormatterTest extends MediaWikiTestCase {
                        ),
                        // basic tag removal
                        array(
+                               // @codingStandardsIgnoreStart Ignore long line warnings.
                                '<table><tr><td>foo</td></tr></table><div class="foo">foo</div><div class="foo quux">foo</div><span id="bar">bar</span>
 <strong class="foo" id="bar">foobar</strong><div class="notfoo">test</div><div class="baz"/>
 <span class="baz">baz</span>',
+                               // @codingStandardsIgnoreEnd
                                '<div class="notfoo">test</div>
 <span class="baz">baz</span>',
                                array(
@@ -89,12 +97,31 @@ class HtmlFormatterTest extends MediaWikiTestCase {
                        array(
                                '<span title="&quot; \' &amp;">&lt;Тест!&gt;</span> &amp;&lt;&#38;&#0038;&#x26;&#x026;',
                                '<span title="&quot; \' &amp;">&lt;Тест!&gt;</span> &amp;&lt;&amp;&amp;&amp;&amp;',
+                               array(),
+                               $removeTags, // Have some rules to trigger a DOM parse
                        ),
                        // https://bugzilla.wikimedia.org/show_bug.cgi?id=53086
                        array(
-                               'Foo<sup id="cite_ref-1" class="reference"><a href="#cite_note-1">[1]</a></sup> <a href="/wiki/Bar" title="Bar" class="mw-redirect">Bar</a>',
-                               'Foo<sup id="cite_ref-1" class="reference"><a href="#cite_note-1">[1]</a></sup> <a href="/wiki/Bar" title="Bar" class="mw-redirect">Bar</a>',
+                               'Foo<sup id="cite_ref-1" class="reference"><a href="#cite_note-1">[1]</a></sup>'
+                                       . ' <a href="/wiki/Bar" title="Bar" class="mw-redirect">Bar</a>',
+                               'Foo<sup id="cite_ref-1" class="reference"><a href="#cite_note-1">[1]</a></sup>'
+                                       . ' <a href="/wiki/Bar" title="Bar" class="mw-redirect">Bar</a>',
                        ),
                );
        }
+
+       public function testQuickProcessing() {
+               $f = new MockHtmlFormatter( 'foo' );
+               $f->filterContent();
+               $this->assertFalse( $f->hasDoc, 'HtmlFormatter should not needlessly parse HTML' );
+       }
+}
+
+class MockHtmlFormatter extends HtmlFormatter {
+       public $hasDoc = false;
+
+       public function getDoc() {
+               $this->hasDoc = true;
+               return parent::getDoc();
+       }
 }
index 21372a0..e934965 100644 (file)
@@ -590,7 +590,8 @@ class HtmlTest extends MediaWikiTestCase {
                # see remarks on http://msdn.microsoft.com/en-us/library/ie/ms535211%28v=vs.85%29.aspx
                $cases[] = array( '<button type=submit></button>',
                        'button', array( 'type' => 'submit' ),
-                       'According to standard the default type is "submit". Depending on compatibility mode IE might use "button", instead.',
+                       'According to standard the default type is "submit". '
+                               . 'Depending on compatibility mode IE might use "button", instead.',
                );
 
                # <select> specifc handling
@@ -640,13 +641,27 @@ class HtmlTest extends MediaWikiTestCase {
         */
        public function testFormValidationBlacklist() {
                $this->assertEmpty(
-                       Html::expandAttributes( array( 'min' => 1, 'max' => 100, 'pattern' => 'abc', 'required' => true, 'step' => 2 ) ),
+                       Html::expandAttributes( array(
+                               'min' => 1,
+                               'max' => 100,
+                               'pattern' => 'abc',
+                               'required' => true,
+                               'step' => 2
+                       ) ),
                        'Blacklist form validation attributes.'
                );
                $this->assertEquals(
                        ' step=any',
-                       Html::expandAttributes( array( 'min' => 1, 'max' => 100, 'pattern' => 'abc', 'required' => true, 'step' => 'any' ) ),
-                       'Allow special case "step=any".'
+                       Html::expandAttributes(
+                               array(
+                                       'min' => 1,
+                                       'max' => 100,
+                                       'pattern' => 'abc',
+                                       'required' => true,
+                                       'step' => 'any'
+                               ),
+                               'Allow special case "step=any".'
+                       )
                );
        }
 }
index 11d8ed6..9b53381 100644 (file)
@@ -177,7 +177,6 @@ class HttpTest extends MediaWikiTestCase {
  * Class to let us overwrite MWHttpRequest respHeaders variable
  */
 class MWHttpRequestTester extends MWHttpRequest {
-
        // function derived from the MWHttpRequest factory function but
        // returns appropriate tester class here
        public static function factory( $url, $options = null ) {
@@ -193,8 +192,9 @@ class MWHttpRequestTester extends MWHttpRequest {
                                return new CurlHttpRequestTester( $url, $options );
                        case 'php':
                                if ( !wfIniGetBool( 'allow_url_fopen' ) ) {
-                                       throw new MWException( __METHOD__ . ': allow_url_fopen needs to be enabled for pure PHP' .
-                                               ' http requests to work. If possible, curl should be used instead. See http://php.net/curl.' );
+                                       throw new MWException( __METHOD__ .
+                                               ': allow_url_fopen needs to be enabled for pure PHP HTTP requests to work. '
+                                                       . 'If possible, curl should be used instead. See http://php.net/curl.' );
                                }
 
                                return new PhpHttpRequestTester( $url, $options );
diff --git a/tests/phpunit/includes/ImportTest.php b/tests/phpunit/includes/ImportTest.php
new file mode 100644 (file)
index 0000000..8895403
--- /dev/null
@@ -0,0 +1,100 @@
+<?php
+
+/**
+ * Test class for Import methods.
+ *
+ * @group Database
+ *
+ * @author Sebastian Brückner < sebastian.brueckner@student.hpi.uni-potsdam.de >
+ */
+class ImportTest extends MediaWikiLangTestCase {
+
+       private function getInputStreamSource( $xml ) {
+               $file = 'data:application/xml,' . $xml;
+               $status = ImportStreamSource::newFromFile( $file );
+               if ( !$status->isGood() ) {
+                       throw new MWException( "Cannot create InputStreamSource." );
+               }
+               return $status->value;
+       }
+
+       /**
+        * @covers WikiImporter::handlePage
+        * @dataProvider getRedirectXML
+        * @param string $xml
+        */
+       public function testHandlePageContainsRedirect( $xml, $redirectTitle ) {
+               $source = $this->getInputStreamSource( $xml );
+
+               $redirect = NULL;
+               $callback = function( $title, $origTitle, $revCount, $sRevCount, $pageInfo ) use ( &$redirect ) {
+                       if ( array_key_exists( 'redirect', $pageInfo ) ) {
+                               $redirect = $pageInfo['redirect'];
+                       }
+               };
+
+               $importer = new WikiImporter( $source );
+               $importer->setPageOutCallback( $callback );
+               $importer->doImport();
+
+               $this->assertEquals( $redirectTitle, $redirect );
+       }
+
+       public function getRedirectXML() {
+               return array(
+                       array(
+                               <<< EOF
+<mediawiki>
+       <page>
+               <title>Test</title>
+               <ns>0</ns>
+               <id>21</id>
+               <redirect title="Test22"/>
+               <revision>
+                       <id>20</id>
+                       <timestamp>2014-05-27T10:00:00Z</timestamp>
+                       <contributor>
+                               <username>Admin</username>
+                               <id>10</id>
+                       </contributor>
+                       <comment>Admin moved page [[Test]] to [[Test22]]</comment>
+                       <text xml:space="preserve" bytes="20">#REDIRECT [[Test22]]</text>
+                       <sha1>tq456o9x3abm7r9ozi6km8yrbbc56o6</sha1>
+                       <model>wikitext</model>
+                       <format>text/x-wiki</format>
+               </revision>
+       </page>
+</mediawiki>
+EOF
+                       ,
+                               'Test22'
+                       ),
+                       array(
+                               <<< EOF
+<mediawiki>
+       <page>
+               <title>Test</title>
+               <ns>0</ns>
+               <id>42</id>
+               <revision>
+                       <id>421</id>
+                       <timestamp>2014-05-27T11:00:00Z</timestamp>
+                       <contributor>
+                               <username>Admin</username>
+                               <id>10</id>
+                       </contributor>
+                       <text xml:space="preserve" bytes="4">Abcd</text>
+                       <sha1>n7uomjq96szt60fy5w3x7ahf7q8m8rh</sha1>
+                       <model>wikitext</model>
+                       <format>text/x-wiki</format>
+               </revision>
+       </page>
+</mediawiki>
+EOF
+                       ,
+                               NULL
+                       ),
+               );
+       }
+
+}
index 351ad34..110cbac 100644 (file)
@@ -28,38 +28,52 @@ class LinkerTest extends MediaWikiLangTestCase {
 
                        ### ANONYMOUS USER ########################################
                        array(
-                               '<a href="/wiki/Special:Contributions/JohnDoe" title="Special:Contributions/JohnDoe" class="mw-userlink mw-anonuserlink">JohnDoe</a>',
+                               '<a href="/wiki/Special:Contributions/JohnDoe" '
+                                       . 'title="Special:Contributions/JohnDoe" '
+                                       . 'class="mw-userlink mw-anonuserlink">JohnDoe</a>',
                                0, 'JohnDoe', false,
                        ),
                        array(
-                               '<a href="/wiki/Special:Contributions/::1" title="Special:Contributions/::1" class="mw-userlink mw-anonuserlink">::1</a>',
+                               '<a href="/wiki/Special:Contributions/::1" '
+                                       . 'title="Special:Contributions/::1" '
+                                       . 'class="mw-userlink mw-anonuserlink">::1</a>',
                                0, '::1', false,
                                'Anonymous with pretty IPv6'
                        ),
                        array(
-                               '<a href="/wiki/Special:Contributions/0:0:0:0:0:0:0:1" title="Special:Contributions/0:0:0:0:0:0:0:1" class="mw-userlink mw-anonuserlink">::1</a>',
+                               '<a href="/wiki/Special:Contributions/0:0:0:0:0:0:0:1" '
+                                       . 'title="Special:Contributions/0:0:0:0:0:0:0:1" '
+                                       . 'class="mw-userlink mw-anonuserlink">::1</a>',
                                0, '0:0:0:0:0:0:0:1', false,
                                'Anonymous with almost pretty IPv6'
                        ),
                        array(
-                               '<a href="/wiki/Special:Contributions/0000:0000:0000:0000:0000:0000:0000:0001" title="Special:Contributions/0000:0000:0000:0000:0000:0000:0000:0001" class="mw-userlink mw-anonuserlink">::1</a>',
+                               '<a href="/wiki/Special:Contributions/0000:0000:0000:0000:0000:0000:0000:0001" '
+                                       . 'title="Special:Contributions/0000:0000:0000:0000:0000:0000:0000:0001" '
+                                       . 'class="mw-userlink mw-anonuserlink">::1</a>',
                                0, '0000:0000:0000:0000:0000:0000:0000:0001', false,
                                'Anonymous with full IPv6'
                        ),
                        array(
-                               '<a href="/wiki/Special:Contributions/::1" title="Special:Contributions/::1" class="mw-userlink mw-anonuserlink">AlternativeUsername</a>',
+                               '<a href="/wiki/Special:Contributions/::1" '
+                                       . 'title="Special:Contributions/::1" '
+                                       . 'class="mw-userlink mw-anonuserlink">AlternativeUsername</a>',
                                0, '::1', 'AlternativeUsername',
                                'Anonymous with pretty IPv6 and an alternative username'
                        ),
 
                        # IPV4
                        array(
-                               '<a href="/wiki/Special:Contributions/127.0.0.1" title="Special:Contributions/127.0.0.1" class="mw-userlink mw-anonuserlink">127.0.0.1</a>',
+                               '<a href="/wiki/Special:Contributions/127.0.0.1" '
+                                       . 'title="Special:Contributions/127.0.0.1" '
+                                       . 'class="mw-userlink mw-anonuserlink">127.0.0.1</a>',
                                0, '127.0.0.1', false,
                                'Anonymous with IPv4'
                        ),
                        array(
-                               '<a href="/wiki/Special:Contributions/127.0.0.1" title="Special:Contributions/127.0.0.1" class="mw-userlink mw-anonuserlink">AlternativeUsername</a>',
+                               '<a href="/wiki/Special:Contributions/127.0.0.1" '
+                                       . 'title="Special:Contributions/127.0.0.1" '
+                                       . 'class="mw-userlink mw-anonuserlink">AlternativeUsername</a>',
                                0, '127.0.0.1', 'AlternativeUsername',
                                'Anonymous with IPv4 and an alternative username'
                        ),
index 33643ac..9ff547c 100644 (file)
@@ -63,9 +63,15 @@ class LinksUpdateTest extends MediaWikiTestCase {
                $po->addLink( Title::newFromText( "linksupdatetest:Foo" ) ); // interwiki link should be ignored
                $po->addLink( Title::newFromText( "#Foo" ) ); // hash link should be ignored
 
-               $update = $this->assertLinksUpdate( $t, $po, 'pagelinks', 'pl_namespace, pl_title', 'pl_from = 111', array(
-                       array( NS_MAIN, 'Foo' ),
-               ) );
+               $update = $this->assertLinksUpdate(
+                       $t,
+                       $po,
+                       'pagelinks',
+                       'pl_namespace,
+                       pl_title',
+                       'pl_from = 111',
+                       array( array( NS_MAIN, 'Foo' ) )
+               );
                $this->assertArrayEquals( array(
                        Title::makeTitle( NS_MAIN, 'Foo' ),  // newFromText doesn't yield the same internal state....
                ), $update->getAddedLinks() );
@@ -76,10 +82,18 @@ class LinksUpdateTest extends MediaWikiTestCase {
                $po->addLink( Title::newFromText( "Bar" ) );
                $po->addLink( Title::newFromText( "Talk:Bar" ) );
 
-               $update = $this->assertLinksUpdate( $t, $po, 'pagelinks', 'pl_namespace, pl_title', 'pl_from = 111', array(
-                       array( NS_MAIN, 'Bar' ),
-                       array( NS_TALK, 'Bar' ),
-               ) );
+               $update = $this->assertLinksUpdate(
+                       $t,
+                       $po,
+                       'pagelinks',
+                       'pl_namespace,
+                       pl_title',
+                       'pl_from = 111',
+                       array(
+                               array( NS_MAIN, 'Bar' ),
+                               array( NS_TALK, 'Bar' ),
+                       )
+               );
                $this->assertArrayEquals( array(
                        Title::makeTitle( NS_MAIN, 'Bar' ),
                        Title::makeTitle( NS_TALK, 'Bar' ),
@@ -143,9 +157,15 @@ class LinksUpdateTest extends MediaWikiTestCase {
 
                $po->addTemplate( Title::newFromText( "Template:Foo" ), 23, 42 );
 
-               $this->assertLinksUpdate( $t, $po, 'templatelinks', 'tl_namespace, tl_title', 'tl_from = 111', array(
-                       array( NS_TEMPLATE, 'Foo' ),
-               ) );
+               $this->assertLinksUpdate(
+                       $t,
+                       $po,
+                       'templatelinks',
+                       'tl_namespace,
+                       tl_title',
+                       'tl_from = 111',
+                       array( array( NS_TEMPLATE, 'Foo' ) )
+               );
        }
 
        /**
@@ -180,19 +200,55 @@ class LinksUpdateTest extends MediaWikiTestCase {
         * @covers ParserOutput::setProperty
         */
        public function testUpdate_page_props() {
+               global $wgPagePropsHaveSortkey;
+
                /** @var ParserOutput $po */
                list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
 
-               $po->setProperty( "foo", "bar" );
+               $fields = array( 'pp_propname', 'pp_value' );
+               $expected = array();
 
-               $this->assertLinksUpdate( $t, $po, 'page_props', 'pp_propname, pp_value', 'pp_page = 111', array(
-                       array( 'foo', 'bar' ),
-               ) );
+               $po->setProperty( "bool", true );
+               $expected[] = array( "bool", true );
+
+               $po->setProperty( "float", 4.0 + 1.0/4.0 );
+               $expected[] = array( "float", 4.0 + 1.0/4.0 );
+
+               $po->setProperty( "int", -7 );
+               $expected[] = array( "int", -7 );
+
+               $po->setProperty( "string", "33 bar" );
+               $expected[] = array( "string", "33 bar" );
+
+               // compute expected sortkey values
+               if ( $wgPagePropsHaveSortkey ) {
+                       $fields[] = 'pp_sortkey';
+
+                       foreach ( $expected as &$row ) {
+                               $value = $row[1];
+
+                               if ( is_int( $value ) || is_float( $value ) || is_bool( $value ) ) {
+                                       $row[] = floatval( $value );
+                               } else {
+                                       $row[] = null;
+                               }
+                       }
+               }
+
+               $this->assertLinksUpdate( $t, $po, 'page_props', $fields, 'pp_page = 111', $expected );
+       }
+
+       public function testUpdate_page_props_without_sortkey() {
+               $this->setMwGlobals( 'wgPagePropsHaveSortkey', false );
+
+               $this->testUpdate_page_props();
        }
 
        // @todo test recursive, too!
 
-       protected function assertLinksUpdate( Title $title, ParserOutput $parserOutput, $table, $fields, $condition, array $expectedRows ) {
+       protected function assertLinksUpdate( Title $title, ParserOutput $parserOutput,
+               $table, $fields, $condition, array $expectedRows
+       ) {
                $update = new LinksUpdate( $title, $parserOutput );
 
                //NOTE: make sure LinksUpdate does not generate warnings when called inside a transaction.
index d210ce5..5c5052e 100644 (file)
@@ -67,20 +67,44 @@ class LocalFileTest extends MediaWikiTestCase {
         * @covers File::getArchivePath
         */
        public function testGetArchivePath() {
-               $this->assertEquals( 'mwstore://local-backend/test-public/archive', $this->file_hl0->getArchivePath() );
-               $this->assertEquals( 'mwstore://local-backend/test-public/archive/a/a2', $this->file_hl2->getArchivePath() );
-               $this->assertEquals( 'mwstore://local-backend/test-public/archive/!', $this->file_hl0->getArchivePath( '!' ) );
-               $this->assertEquals( 'mwstore://local-backend/test-public/archive/a/a2/!', $this->file_hl2->getArchivePath( '!' ) );
+               $this->assertEquals(
+                       'mwstore://local-backend/test-public/archive',
+                       $this->file_hl0->getArchivePath()
+               );
+               $this->assertEquals(
+                       'mwstore://local-backend/test-public/archive/a/a2',
+                       $this->file_hl2->getArchivePath()
+               );
+               $this->assertEquals(
+                       'mwstore://local-backend/test-public/archive/!',
+                       $this->file_hl0->getArchivePath( '!' )
+               );
+               $this->assertEquals(
+                       'mwstore://local-backend/test-public/archive/a/a2/!',
+                       $this->file_hl2->getArchivePath( '!' )
+               );
        }
 
        /**
         * @covers File::getThumbPath
         */
        public function testGetThumbPath() {
-               $this->assertEquals( 'mwstore://local-backend/test-thumb/Test!', $this->file_hl0->getThumbPath() );
-               $this->assertEquals( 'mwstore://local-backend/test-thumb/a/a2/Test!', $this->file_hl2->getThumbPath() );
-               $this->assertEquals( 'mwstore://local-backend/test-thumb/Test!/x', $this->file_hl0->getThumbPath( 'x' ) );
-               $this->assertEquals( 'mwstore://local-backend/test-thumb/a/a2/Test!/x', $this->file_hl2->getThumbPath( 'x' ) );
+               $this->assertEquals(
+                       'mwstore://local-backend/test-thumb/Test!',
+                       $this->file_hl0->getThumbPath()
+               );
+               $this->assertEquals(
+                       'mwstore://local-backend/test-thumb/a/a2/Test!',
+                       $this->file_hl2->getThumbPath()
+               );
+               $this->assertEquals(
+                       'mwstore://local-backend/test-thumb/Test!/x',
+                       $this->file_hl0->getThumbPath( 'x' )
+               );
+               $this->assertEquals(
+                       'mwstore://local-backend/test-thumb/a/a2/Test!/x',
+                       $this->file_hl2->getThumbPath( 'x' )
+               );
        }
 
        /**
@@ -108,9 +132,18 @@ class LocalFileTest extends MediaWikiTestCase {
         */
        public function testGetArchiveVirtualUrl() {
                $this->assertEquals( 'mwrepo://test/public/archive', $this->file_hl0->getArchiveVirtualUrl() );
-               $this->assertEquals( 'mwrepo://test/public/archive/a/a2', $this->file_hl2->getArchiveVirtualUrl() );
-               $this->assertEquals( 'mwrepo://test/public/archive/%21', $this->file_hl0->getArchiveVirtualUrl( '!' ) );
-               $this->assertEquals( 'mwrepo://test/public/archive/a/a2/%21', $this->file_hl2->getArchiveVirtualUrl( '!' ) );
+               $this->assertEquals(
+                       'mwrepo://test/public/archive/a/a2',
+                       $this->file_hl2->getArchiveVirtualUrl()
+               );
+               $this->assertEquals(
+                       'mwrepo://test/public/archive/%21',
+                       $this->file_hl0->getArchiveVirtualUrl( '!' )
+               );
+               $this->assertEquals(
+                       'mwrepo://test/public/archive/a/a2/%21',
+                       $this->file_hl2->getArchiveVirtualUrl( '!' )
+               );
        }
 
        /**
@@ -119,8 +152,14 @@ class LocalFileTest extends MediaWikiTestCase {
        public function testGetThumbVirtualUrl() {
                $this->assertEquals( 'mwrepo://test/thumb/Test%21', $this->file_hl0->getThumbVirtualUrl() );
                $this->assertEquals( 'mwrepo://test/thumb/a/a2/Test%21', $this->file_hl2->getThumbVirtualUrl() );
-               $this->assertEquals( 'mwrepo://test/thumb/Test%21/%21', $this->file_hl0->getThumbVirtualUrl( '!' ) );
-               $this->assertEquals( 'mwrepo://test/thumb/a/a2/Test%21/%21', $this->file_hl2->getThumbVirtualUrl( '!' ) );
+               $this->assertEquals(
+                       'mwrepo://test/thumb/Test%21/%21',
+                       $this->file_hl0->getThumbVirtualUrl( '!' )
+               );
+               $this->assertEquals(
+                       'mwrepo://test/thumb/a/a2/Test%21/%21',
+                       $this->file_hl2->getThumbVirtualUrl( '!' )
+               );
        }
 
        /**
@@ -136,6 +175,10 @@ class LocalFileTest extends MediaWikiTestCase {
         */
        public function testWfLocalFile() {
                $file = wfLocalFile( "File:Some_file_that_probably_doesn't exist.png" );
-               $this->assertThat( $file, $this->isInstanceOf( 'LocalFile' ), 'wfLocalFile() returns LocalFile for valid Titles' );
+               $this->assertThat(
+                       $file,
+                       $this->isInstanceOf( 'LocalFile' ),
+                       'wfLocalFile() returns LocalFile for valid Titles'
+               );
        }
 }
index b6fa139..350e83f 100644 (file)
@@ -36,7 +36,7 @@ class MWNamespaceTest extends MediaWikiTestCase {
         * @covers MWNamespace::isMovable
         */
        public function testIsMovable() {
-               $this->assertFalse( MWNamespace::isMovable( NS_CATEGORY ) );
+               $this->assertFalse( MWNamespace::isMovable( NS_SPECIAL ) );
                # @todo FIXME: Write more tests!!
        }
 
@@ -572,7 +572,11 @@ class MWNamespaceTest extends MediaWikiTestCase {
                        return $this->$method( $args );
                }
 
-               if ( preg_match( '/^assert(Has|Is|Can)(Not|)(Subject|Talk|Watchable|Content|Subpages|Capitalized)$/', $method, $m ) ) {
+               if ( preg_match(
+                       '/^assert(Has|Is|Can)(Not|)(Subject|Talk|Watchable|Content|Subpages|Capitalized)$/',
+                       $method,
+                       $m
+               ) ) {
                        # Interprets arguments:
                        $ns = $args[0];
                        $msg = isset( $args[1] ) ? $args[1] : " dummy message";
index 25b0805..7db985b 100644 (file)
@@ -124,7 +124,10 @@ class MessageTest extends MediaWikiLangTestCase {
                // NOTE: make sure internal caching of the message text is reset appropriately
                $msg = wfMessage( 'mainpage' );
                $this->assertEquals( 'Main Page', $msg->inLanguage( Language::factory( 'en' ) )->text() );
-               $this->assertEquals( 'Заглавная страница', $msg->inLanguage( Language::factory( 'ru' ) )->text() );
+               $this->assertEquals(
+                       'Заглавная страница',
+                       $msg->inLanguage( Language::factory( 'ru' ) )->text()
+               );
        }
 
        /**
@@ -133,8 +136,14 @@ class MessageTest extends MediaWikiLangTestCase {
        public function testMessageParams() {
                $this->assertEquals( 'Return to $1.', wfMessage( 'returnto' )->text() );
                $this->assertEquals( 'Return to $1.', wfMessage( 'returnto', array() )->text() );
-               $this->assertEquals( 'You have foo (bar).', wfMessage( 'youhavenewmessages', 'foo', 'bar' )->text() );
-               $this->assertEquals( 'You have foo (bar).', wfMessage( 'youhavenewmessages', array( 'foo', 'bar' ) )->text() );
+               $this->assertEquals(
+                       'You have foo (bar).',
+                       wfMessage( 'youhavenewmessages', 'foo', 'bar' )->text()
+               );
+               $this->assertEquals(
+                       'You have foo (bar).',
+                       wfMessage( 'youhavenewmessages', array( 'foo', 'bar' ) )->text()
+               );
        }
 
        /**
@@ -142,10 +151,22 @@ class MessageTest extends MediaWikiLangTestCase {
         * @covers Message::rawParams
         */
        public function testMessageParamSubstitution() {
-               $this->assertEquals( '(Заглавная страница)', wfMessage( 'parentheses', 'Заглавная страница' )->plain() );
-               $this->assertEquals( '(Заглавная страница $1)', wfMessage( 'parentheses', 'Заглавная страница $1' )->plain() );
-               $this->assertEquals( '(Заглавная страница)', wfMessage( 'parentheses' )->rawParams( 'Заглавная страница' )->plain() );
-               $this->assertEquals( '(Заглавная страница $1)', wfMessage( 'parentheses' )->rawParams( 'Заглавная страница $1' )->plain() );
+               $this->assertEquals(
+                       '(Заглавная страница)',
+                       wfMessage( 'parentheses', 'Заглавная страница' )->plain()
+               );
+               $this->assertEquals(
+                       '(Заглавная страница $1)',
+                       wfMessage( 'parentheses', 'Заглавная страница $1' )->plain()
+               );
+               $this->assertEquals(
+                       '(Заглавная страница)',
+                       wfMessage( 'parentheses' )->rawParams( 'Заглавная страница' )->plain()
+               );
+               $this->assertEquals(
+                       '(Заглавная страница $1)',
+                       wfMessage( 'parentheses' )->rawParams( 'Заглавная страница $1' )->plain()
+               );
        }
 
        /**
@@ -156,7 +177,11 @@ class MessageTest extends MediaWikiLangTestCase {
                $msg = new RawMessage( '$1$2$3$4$5$6$7$8$9$10$11$12' );
                // One less than above has placeholders
                $params = array( 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k' );
-               $this->assertEquals( 'abcdefghijka2', $msg->params( $params )->plain(), 'Params > 9 are replaced correctly' );
+               $this->assertEquals(
+                       'abcdefghijka2',
+                       $msg->params( $params )->plain(),
+                       'Params > 9 are replaced correctly'
+               );
        }
 
        /**
@@ -270,9 +295,17 @@ class MessageTest extends MediaWikiLangTestCase {
                // NOTE: make sure internal caching of the message text is reset appropriately.
                // NOTE: wgForceUIMsgAsContentMsg forces the messages *current* language to be used.
                $msg = wfMessage( 'mainpage' );
-               $this->assertEquals( 'Accueil', $msg->inContentLanguage()->plain(), 'inContentLanguage() with ForceUIMsg override enabled' );
+               $this->assertEquals(
+                       'Accueil',
+                       $msg->inContentLanguage()->plain(),
+                       'inContentLanguage() with ForceUIMsg override enabled'
+               );
                $this->assertEquals( 'Main Page', $msg->inLanguage( 'en' )->plain(), "inLanguage( 'en' )" );
-               $this->assertEquals( 'Main Page', $msg->inContentLanguage()->plain(), 'inContentLanguage() with ForceUIMsg override enabled' );
+               $this->assertEquals(
+                       'Main Page',
+                       $msg->inContentLanguage()->plain(),
+                       'inContentLanguage() with ForceUIMsg override enabled'
+               );
                $this->assertEquals( 'Hauptseite', $msg->inLanguage( 'de' )->plain(), "inLanguage( 'de' )" );
        }
 
index e60dc54..0d78268 100644 (file)
@@ -236,8 +236,10 @@ class PathRouterTest extends MediaWikiTestCase {
         * Ensure the router doesn't choke on long paths.
         */
        public function testLength() {
+               // @codingStandardsIgnoreStart Ignore long line warnings
                $matches = $this->basicRouter->parse( "/wiki/Lorem_ipsum_dolor_sit_amet,_consectetur_adipisicing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum." );
                $this->assertEquals( $matches, array( 'title' => "Lorem_ipsum_dolor_sit_amet,_consectetur_adipisicing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum." ) );
+               // @codingStandardsIgnoreEnd
        }
 
        /**
index 1776b5d..f595d2d 100644 (file)
@@ -25,8 +25,11 @@ class RequestContextTest extends MediaWikiTestCase {
 
                $curTitle = Title::newFromText( "C" );
                $context->setTitle( $curTitle );
-               $this->assertTrue( $curTitle->equals( $context->getWikiPage()->getTitle() ),
-                       "When a title is updated the WikiPage should be purged and recreated on-demand with the new title." );
+               $this->assertTrue(
+                       $curTitle->equals( $context->getWikiPage()->getTitle() ),
+                       "When a title is updated the WikiPage should be purged "
+                               . "and recreated on-demand with the new title."
+               );
        }
 
        /**
@@ -46,7 +49,9 @@ class RequestContextTest extends MediaWikiTestCase {
                        'sessionId' => 'd612ee607c87e749ef14da4983a702cd',
                        'userId' => $user->getId(),
                        'ip' => '192.0.2.0',
-                       'headers' => array( 'USER-AGENT' => 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:18.0) Gecko/20100101 Firefox/18.0' )
+                       'headers' => array(
+                               'USER-AGENT' => 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:18.0) Gecko/20100101 Firefox/18.0'
+                       )
                );
                $sc = RequestContext::importScopedSession( $sinfo ); // load new context
 
@@ -55,12 +60,24 @@ class RequestContextTest extends MediaWikiTestCase {
                $this->assertEquals( $sinfo['headers'], $info['headers'], "Correct headers." );
                $this->assertEquals( $sinfo['sessionId'], $info['sessionId'], "Correct session ID." );
                $this->assertEquals( $sinfo['userId'], $info['userId'], "Correct user ID." );
-               $this->assertEquals( $sinfo['ip'], $context->getRequest()->getIP(), "Correct context IP address." );
-               $this->assertEquals( $sinfo['headers'], $context->getRequest()->getAllHeaders(), "Correct context headers." );
+               $this->assertEquals(
+                       $sinfo['ip'],
+                       $context->getRequest()->getIP(),
+                       "Correct context IP address."
+               );
+               $this->assertEquals(
+                       $sinfo['headers'],
+                       $context->getRequest()->getAllHeaders(),
+                       "Correct context headers."
+               );
                $this->assertEquals( $sinfo['sessionId'], session_id(), "Correct context session ID." );
                $this->assertEquals( true, $context->getUser()->isLoggedIn(), "Correct context user." );
                $this->assertEquals( $sinfo['userId'], $context->getUser()->getId(), "Correct context user ID." );
-               $this->assertEquals( 'UnitTestContextUser', $context->getUser()->getName(), "Correct context user name." );
+               $this->assertEquals(
+                       'UnitTestContextUser',
+                       $context->getUser()->getName(),
+                       "Correct context user name."
+               );
 
                unset( $sc ); // restore previous context
 
index e69660e..9a429bc 100644 (file)
  * ^--- important, causes tests not to fail with timeout
  */
 class RevisionStorageTest extends MediaWikiTestCase {
-
        /**
         * @var WikiPage $the_page
         */
-       var $the_page;
+       private $the_page;
 
        function __construct( $name = null, array $data = array(), $dataName = '' ) {
                parent::__construct( $name, $data, $dataName );
@@ -52,7 +51,11 @@ class RevisionStorageTest extends MediaWikiTestCase {
                MWNamespace::getCanonicalNamespaces( true ); # reset namespace cache
                $wgContLang->resetNamespaces(); # reset namespace cache
                if ( !$this->the_page ) {
-                       $this->the_page = $this->createPage( 'RevisionStorageTest_the_page', "just a dummy page", CONTENT_MODEL_WIKITEXT );
+                       $this->the_page = $this->createPage(
+                               'RevisionStorageTest_the_page',
+                               "just a dummy page",
+                               CONTENT_MODEL_WIKITEXT
+                       );
                }
        }
 
@@ -174,7 +177,11 @@ class RevisionStorageTest extends MediaWikiTestCase {
         * @covers Revision::newFromArchiveRow
         */
        public function testNewFromArchiveRow() {
-               $page = $this->createPage( 'RevisionStorageTest_testNewFromArchiveRow', 'Lorem Ipsum', CONTENT_MODEL_WIKITEXT );
+               $page = $this->createPage(
+                       'RevisionStorageTest_testNewFromArchiveRow',
+                       'Lorem Ipsum',
+                       CONTENT_MODEL_WIKITEXT
+               );
                $orig = $page->getRevision();
                $page->doDeleteArticle( 'test Revision::newFromArchiveRow' );
 
@@ -205,7 +212,11 @@ class RevisionStorageTest extends MediaWikiTestCase {
         * @covers Revision::fetchRevision
         */
        public function testFetchRevision() {
-               $page = $this->createPage( 'RevisionStorageTest_testFetchRevision', 'one', CONTENT_MODEL_WIKITEXT );
+               $page = $this->createPage(
+                       'RevisionStorageTest_testFetchRevision',
+                       'one',
+                       CONTENT_MODEL_WIKITEXT
+               );
 
                // Hidden process cache assertion below
                $page->getRevision()->getId();
@@ -235,7 +246,10 @@ class RevisionStorageTest extends MediaWikiTestCase {
 
                $this->assertTrue( in_array( 'rev_id', $fields ), 'missing rev_id in list of fields' );
                $this->assertTrue( in_array( 'rev_page', $fields ), 'missing rev_page in list of fields' );
-               $this->assertTrue( in_array( 'rev_timestamp', $fields ), 'missing rev_timestamp in list of fields' );
+               $this->assertTrue(
+                       in_array( 'rev_timestamp', $fields ),
+                       'missing rev_timestamp in list of fields'
+               );
                $this->assertTrue( in_array( 'rev_user', $fields ), 'missing rev_user in list of fields' );
 
                if ( $wgContentHandlerUseDB ) {
@@ -351,7 +365,11 @@ class RevisionStorageTest extends MediaWikiTestCase {
         * @covers Revision::isCurrent
         */
        public function testIsCurrent() {
-               $page = $this->createPage( 'RevisionStorageTest_testIsCurrent', 'Lorem Ipsum', CONTENT_MODEL_WIKITEXT );
+               $page = $this->createPage(
+                       'RevisionStorageTest_testIsCurrent',
+                       'Lorem Ipsum',
+                       CONTENT_MODEL_WIKITEXT
+               );
                $rev1 = $page->getRevision();
 
                # @todo find out if this should be true
@@ -360,7 +378,10 @@ class RevisionStorageTest extends MediaWikiTestCase {
                $rev1x = Revision::newFromId( $rev1->getId() );
                $this->assertTrue( $rev1x->isCurrent() );
 
-               $page->doEditContent( ContentHandler::makeContent( 'Bla bla', $page->getTitle(), CONTENT_MODEL_WIKITEXT ), 'second rev' );
+               $page->doEditContent(
+                       ContentHandler::makeContent( 'Bla bla', $page->getTitle(), CONTENT_MODEL_WIKITEXT ),
+                       'second rev'
+               );
                $rev2 = $page->getRevision();
 
                # @todo find out if this should be true
@@ -377,12 +398,17 @@ class RevisionStorageTest extends MediaWikiTestCase {
         * @covers Revision::getPrevious
         */
        public function testGetPrevious() {
-               $page = $this->createPage( 'RevisionStorageTest_testGetPrevious', 'Lorem Ipsum testGetPrevious', CONTENT_MODEL_WIKITEXT );
+               $page = $this->createPage(
+                       'RevisionStorageTest_testGetPrevious',
+                       'Lorem Ipsum testGetPrevious',
+                       CONTENT_MODEL_WIKITEXT
+               );
                $rev1 = $page->getRevision();
 
                $this->assertNull( $rev1->getPrevious() );
 
-               $page->doEditContent( ContentHandler::makeContent( 'Bla bla', $page->getTitle(), CONTENT_MODEL_WIKITEXT ),
+               $page->doEditContent(
+                       ContentHandler::makeContent( 'Bla bla', $page->getTitle(), CONTENT_MODEL_WIKITEXT ),
                        'second rev testGetPrevious' );
                $rev2 = $page->getRevision();
 
@@ -394,13 +420,19 @@ class RevisionStorageTest extends MediaWikiTestCase {
         * @covers Revision::getNext
         */
        public function testGetNext() {
-               $page = $this->createPage( 'RevisionStorageTest_testGetNext', 'Lorem Ipsum testGetNext', CONTENT_MODEL_WIKITEXT );
+               $page = $this->createPage(
+                       'RevisionStorageTest_testGetNext',
+                       'Lorem Ipsum testGetNext',
+                       CONTENT_MODEL_WIKITEXT
+               );
                $rev1 = $page->getRevision();
 
                $this->assertNull( $rev1->getNext() );
 
-               $page->doEditContent( ContentHandler::makeContent( 'Bla bla', $page->getTitle(), CONTENT_MODEL_WIKITEXT ),
-                       'second rev testGetNext' );
+               $page->doEditContent(
+                       ContentHandler::makeContent( 'Bla bla', $page->getTitle(), CONTENT_MODEL_WIKITEXT ),
+                       'second rev testGetNext'
+               );
                $rev2 = $page->getRevision();
 
                $this->assertNotNull( $rev1->getNext() );
@@ -411,7 +443,11 @@ class RevisionStorageTest extends MediaWikiTestCase {
         * @covers Revision::newNullRevision
         */
        public function testNewNullRevision() {
-               $page = $this->createPage( 'RevisionStorageTest_testNewNullRevision', 'some testing text', CONTENT_MODEL_WIKITEXT );
+               $page = $this->createPage(
+                       'RevisionStorageTest_testNewNullRevision',
+                       'some testing text',
+                       CONTENT_MODEL_WIKITEXT
+               );
                $orig = $page->getRevision();
 
                $dbw = wfGetDB( DB_MASTER );
@@ -469,7 +505,8 @@ class RevisionStorageTest extends MediaWikiTestCase {
                # zero
                $revisions[0] = new Revision( array(
                        'page' => $page->getId(),
-                       'title' => $page->getTitle(), // we need the title to determine the page's default content model
+                       // we need the title to determine the page's default content model
+                       'title' => $page->getTitle(),
                        'timestamp' => '20120101000000',
                        'user' => $userA->getId(),
                        'text' => 'zero',
@@ -481,7 +518,8 @@ class RevisionStorageTest extends MediaWikiTestCase {
                # one
                $revisions[1] = new Revision( array(
                        'page' => $page->getId(),
-                       'title' => $page->getTitle(), // still need the title, because $page->getId() is 0 (there's no entry in the page table)
+                       // still need the title, because $page->getId() is 0 (there's no entry in the page table)
+                       'title' => $page->getTitle(),
                        'timestamp' => '20120101000100',
                        'user' => $userA->getId(),
                        'text' => 'one',
diff --git a/tests/phpunit/includes/RevisionStorageTestContentHandlerUseDB.php b/tests/phpunit/includes/RevisionStorageTestContentHandlerUseDB.php
new file mode 100644 (file)
index 0000000..d5e47c8
--- /dev/null
@@ -0,0 +1,89 @@
+<?php
+
+/**
+ * @group ContentHandler
+ * @group Database
+ * ^--- important, causes temporary tables to be used instead of the real database
+ */
+class RevisionTestContentHandlerUseDB extends RevisionStorageTest {
+
+       protected function setUp() {
+               $this->setMwGlobals( 'wgContentHandlerUseDB', false );
+
+               $dbw = wfGetDB( DB_MASTER );
+
+               $page_table = $dbw->tableName( 'page' );
+               $revision_table = $dbw->tableName( 'revision' );
+               $archive_table = $dbw->tableName( 'archive' );
+
+               if ( $dbw->fieldExists( $page_table, 'page_content_model' ) ) {
+                       $dbw->query( "alter table $page_table drop column page_content_model" );
+                       $dbw->query( "alter table $revision_table drop column rev_content_model" );
+                       $dbw->query( "alter table $revision_table drop column rev_content_format" );
+                       $dbw->query( "alter table $archive_table drop column ar_content_model" );
+                       $dbw->query( "alter table $archive_table drop column ar_content_format" );
+               }
+
+               parent::setUp();
+       }
+
+       /**
+        * @covers Revision::selectFields
+        */
+       public function testSelectFields() {
+               $fields = Revision::selectFields();
+
+               $this->assertTrue( in_array( 'rev_id', $fields ), 'missing rev_id in list of fields' );
+               $this->assertTrue( in_array( 'rev_page', $fields ), 'missing rev_page in list of fields' );
+               $this->assertTrue(
+                       in_array( 'rev_timestamp', $fields ),
+                       'missing rev_timestamp in list of fields'
+               );
+               $this->assertTrue( in_array( 'rev_user', $fields ), 'missing rev_user in list of fields' );
+
+               $this->assertFalse(
+                       in_array( 'rev_content_model', $fields ),
+                       'missing rev_content_model in list of fields'
+               );
+               $this->assertFalse(
+                       in_array( 'rev_content_format', $fields ),
+                       'missing rev_content_format in list of fields'
+               );
+       }
+
+       /**
+        * @covers Revision::getContentModel
+        */
+       public function testGetContentModel() {
+               try {
+                       $this->makeRevision( array( 'text' => 'hello hello.',
+                               'content_model' => CONTENT_MODEL_JAVASCRIPT ) );
+
+                       $this->fail( "Creating JavaScript content on a wikitext page should fail with "
+                               . "\$wgContentHandlerUseDB disabled" );
+               } catch ( MWException $ex ) {
+                       $this->assertTrue( true ); // ok
+               }
+       }
+
+       /**
+        * @covers Revision::getContentFormat
+        */
+       public function testGetContentFormat() {
+               try {
+                       // @todo change this to test failure on using a non-standard (but supported) format
+                       //       for a content model supported in the given location. As of 1.21, there are
+                       //       no alternative formats for any of the standard content models that could be
+                       //       used for this though.
+
+                       $this->makeRevision( array( 'text' => 'hello hello.',
+                               'content_model' => CONTENT_MODEL_JAVASCRIPT,
+                               'content_format' => 'text/javascript' ) );
+
+                       $this->fail( "Creating JavaScript content on a wikitext page should fail with "
+                               . "\$wgContentHandlerUseDB disabled" );
+               } catch ( MWException $ex ) {
+                       $this->assertTrue( true ); // ok
+               }
+       }
+}
diff --git a/tests/phpunit/includes/RevisionStorageTest_ContentHandlerUseDB.php b/tests/phpunit/includes/RevisionStorageTest_ContentHandlerUseDB.php
deleted file mode 100644 (file)
index f830e36..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-<?php
-
-/**
- * @group ContentHandler
- * @group Database
- * ^--- important, causes temporary tables to be used instead of the real database
- */
-class RevisionTest_ContentHandlerUseDB extends RevisionStorageTest {
-
-       protected function setUp() {
-               $this->setMwGlobals( 'wgContentHandlerUseDB', false );
-
-               $dbw = wfGetDB( DB_MASTER );
-
-               $page_table = $dbw->tableName( 'page' );
-               $revision_table = $dbw->tableName( 'revision' );
-               $archive_table = $dbw->tableName( 'archive' );
-
-               if ( $dbw->fieldExists( $page_table, 'page_content_model' ) ) {
-                       $dbw->query( "alter table $page_table drop column page_content_model" );
-                       $dbw->query( "alter table $revision_table drop column rev_content_model" );
-                       $dbw->query( "alter table $revision_table drop column rev_content_format" );
-                       $dbw->query( "alter table $archive_table drop column ar_content_model" );
-                       $dbw->query( "alter table $archive_table drop column ar_content_format" );
-               }
-
-               parent::setUp();
-       }
-
-       /**
-        * @covers Revision::selectFields
-        */
-       public function testSelectFields() {
-               $fields = Revision::selectFields();
-
-               $this->assertTrue( in_array( 'rev_id', $fields ), 'missing rev_id in list of fields' );
-               $this->assertTrue( in_array( 'rev_page', $fields ), 'missing rev_page in list of fields' );
-               $this->assertTrue( in_array( 'rev_timestamp', $fields ), 'missing rev_timestamp in list of fields' );
-               $this->assertTrue( in_array( 'rev_user', $fields ), 'missing rev_user in list of fields' );
-
-               $this->assertFalse( in_array( 'rev_content_model', $fields ), 'missing rev_content_model in list of fields' );
-               $this->assertFalse( in_array( 'rev_content_format', $fields ), 'missing rev_content_format in list of fields' );
-       }
-
-       /**
-        * @covers Revision::getContentModel
-        */
-       public function testGetContentModel() {
-               try {
-                       $this->makeRevision( array( 'text' => 'hello hello.',
-                               'content_model' => CONTENT_MODEL_JAVASCRIPT ) );
-
-                       $this->fail( "Creating JavaScript content on a wikitext page should fail with "
-                               . "\$wgContentHandlerUseDB disabled" );
-               } catch ( MWException $ex ) {
-                       $this->assertTrue( true ); // ok
-               }
-       }
-
-       /**
-        * @covers Revision::getContentFormat
-        */
-       public function testGetContentFormat() {
-               try {
-                       // @todo change this to test failure on using a non-standard (but supported) format
-                       //       for a content model supported in the given location. As of 1.21, there are
-                       //       no alternative formats for any of the standard content models that could be
-                       //       used for this though.
-
-                       $this->makeRevision( array( 'text' => 'hello hello.',
-                               'content_model' => CONTENT_MODEL_JAVASCRIPT,
-                               'content_format' => 'text/javascript' ) );
-
-                       $this->fail( "Creating JavaScript content on a wikitext page should fail with "
-                               . "\$wgContentHandlerUseDB disabled" );
-               } catch ( MWException $ex ) {
-                       $this->assertTrue( true ); // ok
-               }
-       }
-}
index 48a4017..4623b38 100644 (file)
@@ -173,7 +173,7 @@ class RevisionTest extends MediaWikiTestCase {
                        Revision::getRevisionText( $row ), "getRevisionText" );
        }
 
-       # =================================================================================================================
+       # =========================================================================
 
        /**
         * @param string $text
@@ -183,7 +183,9 @@ class RevisionTest extends MediaWikiTestCase {
         *
         * @return Revision
         */
-       function newTestRevision( $text, $title = "Test", $model = CONTENT_MODEL_WIKITEXT, $format = null ) {
+       function newTestRevision( $text, $title = "Test",
+               $model = CONTENT_MODEL_WIKITEXT, $format = null
+       ) {
                if ( is_string( $title ) ) {
                        $title = Title::newFromText( $title );
                }
@@ -273,8 +275,22 @@ class RevisionTest extends MediaWikiTestCase {
                //NOTE: we expect the help namespace to always contain wikitext
                return array(
                        array( 'hello world', 'Help:Hello', null, null, Revision::FOR_PUBLIC, 'hello world' ),
-                       array( serialize( 'hello world' ), 'Hello', "testing", null, Revision::FOR_PUBLIC, serialize( 'hello world' ) ),
-                       array( serialize( 'hello world' ), 'Dummy:Hello', null, null, Revision::FOR_PUBLIC, serialize( 'hello world' ) ),
+                       array(
+                               serialize( 'hello world' ),
+                               'Hello',
+                               "testing",
+                               null,
+                               Revision::FOR_PUBLIC,
+                               serialize( 'hello world' )
+                       ),
+                       array(
+                               serialize( 'hello world' ),
+                               'Dummy:Hello',
+                               null,
+                               null,
+                               Revision::FOR_PUBLIC,
+                               serialize( 'hello world' )
+                       ),
                );
        }
 
@@ -283,11 +299,16 @@ class RevisionTest extends MediaWikiTestCase {
         * @dataProvider dataGetContent
         * @covers Revision::getContent
         */
-       public function testGetContent( $text, $title, $model, $format, $audience, $expectedSerialization ) {
+       public function testGetContent( $text, $title, $model, $format,
+               $audience, $expectedSerialization
+       ) {
                $rev = $this->newTestRevision( $text, $title, $model, $format );
                $content = $rev->getContent( $audience );
 
-               $this->assertEquals( $expectedSerialization, is_null( $content ) ? null : $content->serialize( $format ) );
+               $this->assertEquals(
+                       $expectedSerialization,
+                       is_null( $content ) ? null : $content->serialize( $format )
+               );
        }
 
        function dataGetText() {
@@ -345,7 +366,11 @@ class RevisionTest extends MediaWikiTestCase {
        public function dataGetSha1() {
                return array(
                        array( "hello world.", CONTENT_MODEL_WIKITEXT, Revision::base36Sha1( "hello world." ) ),
-                       array( serialize( "hello world." ), "testing", Revision::base36Sha1( serialize( "hello world." ) ) ),
+                       array(
+                               serialize( "hello world." ),
+                               "testing",
+                               Revision::base36Sha1( serialize( "hello world." ) )
+                       ),
                );
        }
 
@@ -420,8 +445,10 @@ class RevisionTest extends MediaWikiTestCase {
                $content->setText( "bar" );
 
                $content2 = $rev->getContent( Revision::RAW );
-               $this->assertNotSame( $content, $content2, "expected a clone" ); // content is mutable, expect clone
-               $this->assertEquals( "foo", $content2->getText() ); // clone should contain the original text
+               // content is mutable, expect clone
+               $this->assertNotSame( $content, $content2, "expected a clone" );
+               // clone should contain the original text
+               $this->assertEquals( "foo", $content2->getText() );
 
                $content2->setText( "bla bla" );
                $this->assertEquals( "bar", $content->getText() ); // clones should be independent
index 7e81fab..758c2e2 100644 (file)
@@ -56,10 +56,12 @@ class TestSample extends MediaWikiLangTestCase {
                );
        }
 
+       // @codingStandardsIgnoreStart Ignore long line warning
        /**
         * @dataProvider provideTitles
-        * See http://www.phpunit.de/manual/3.4/en/appendixes.annotations.html#appendixes.annotations.dataProvider
+        * See http://phpunit.de/manual/3.7/en/appendixes.annotations.html#appendixes.annotations.dataProvider
         */
+       // @codingStandardsIgnoreEnd
        public function testCreateBasicListOfTitles( $titleName, $ns, $text ) {
                $title = Title::newFromText( $titleName, $ns );
                $this->assertEquals( $text, "$title", "see if '$titleName' matches '$text'" );
@@ -86,16 +88,18 @@ class TestSample extends MediaWikiLangTestCase {
 
        /**
         * @depends testSetUpMainPageTitleForNextTest
-        * See http://www.phpunit.de/manual/3.4/en/appendixes.annotations.html#appendixes.annotations.depends
+        * See http://phpunit.de/manual/3.7/en/appendixes.annotations.html#appendixes.annotations.depends
         */
        public function testCheckMainPageTitleIsConsideredLocal( $title ) {
                $this->assertTrue( $title->isLocal() );
        }
 
+       // @codingStandardsIgnoreStart Ignore long line warning
        /**
         * @expectedException MWException object
-        * See http://www.phpunit.de/manual/3.4/en/appendixes.annotations.html#appendixes.annotations.expectedException
+        * See http://phpunit.de/manual/3.7/en/appendixes.annotations.html#appendixes.annotations.expectedException
         */
+       // @codingStandardsIgnoreEnd
        public function testTitleObjectFromObject() {
                $title = Title::newFromText( Title::newFromText( "test" ) );
                $this->assertEquals( "Test", $title->isLocal() );
index f5551ed..50c1e50 100644 (file)
@@ -84,7 +84,11 @@ class SanitizerTest extends MediaWikiTestCase {
         * @covers Sanitizer::decodeCharReferences
         */
        public function testInvalidNumberedEntities() {
-               $this->assertEquals( UTF8_REPLACEMENT, Sanitizer::decodeCharReferences( "&#88888888888888;" ), 'Invalid numbered entity' );
+               $this->assertEquals(
+                       UTF8_REPLACEMENT,
+                       Sanitizer::decodeCharReferences( "&#88888888888888;" ),
+                       'Invalid numbered entity'
+               );
        }
 
        /**
@@ -180,9 +184,21 @@ class SanitizerTest extends MediaWikiTestCase {
                        array( array( 'foo' => 'bar' ), '    foo   =   bar    ', 'Spaced attribute' ),
                        array( array( 'foo' => 'bar' ), 'foo="bar"', 'Double-quoted attribute' ),
                        array( array( 'foo' => 'bar' ), 'foo=\'bar\'', 'Single-quoted attribute' ),
-                       array( array( 'foo' => 'bar', 'baz' => 'foo' ), 'foo=\'bar\'   baz="foo"', 'Several attributes' ),
-                       array( array( 'foo' => 'bar', 'baz' => 'foo' ), 'foo=\'bar\'   baz="foo"', 'Several attributes' ),
-                       array( array( 'foo' => 'bar', 'baz' => 'foo' ), 'foo=\'bar\'   baz="foo"', 'Several attributes' ),
+                       array(
+                               array( 'foo' => 'bar', 'baz' => 'foo' ),
+                               'foo=\'bar\'   baz="foo"',
+                               'Several attributes'
+                       ),
+                       array(
+                               array( 'foo' => 'bar', 'baz' => 'foo' ),
+                               'foo=\'bar\'   baz="foo"',
+                               'Several attributes'
+                       ),
+                       array(
+                               array( 'foo' => 'bar', 'baz' => 'foo' ),
+                               'foo=\'bar\'   baz="foo"',
+                               'Several attributes'
+                       ),
                        array( array( ':foo' => 'bar' ), ':foo=\'bar\'', 'Leading :' ),
                        array( array( '_foo' => 'bar' ), '_foo=\'bar\'', 'Leading _' ),
                        array( array( 'foo' => 'bar' ), 'Foo=\'bar\'', 'Leading capital' ),
@@ -203,9 +219,21 @@ class SanitizerTest extends MediaWikiTestCase {
                        array( array(), 'foo$=baz', 'Symbols are not allowed' ),
                        array( array(), 'foo@=baz', 'Symbols are not allowed' ),
                        array( array(), 'foo~=baz', 'Symbols are not allowed' ),
-                       array( array( 'foo' => '1[#^`*%w/(' ), 'foo=1[#^`*%w/(', 'All kind of characters are allowed as values' ),
-                       array( array( 'foo' => '1[#^`*%\'w/(' ), 'foo="1[#^`*%\'w/("', 'Double quotes are allowed if quoted by single quotes' ),
-                       array( array( 'foo' => '1[#^`*%"w/(' ), 'foo=\'1[#^`*%"w/(\'', 'Single quotes are allowed if quoted by double quotes' ),
+                       array(
+                               array( 'foo' => '1[#^`*%w/(' ),
+                               'foo=1[#^`*%w/(',
+                               'All kind of characters are allowed as values'
+                       ),
+                       array(
+                               array( 'foo' => '1[#^`*%\'w/(' ),
+                               'foo="1[#^`*%\'w/("',
+                               'Double quotes are allowed if quoted by single quotes'
+                       ),
+                       array(
+                               array( 'foo' => '1[#^`*%"w/(' ),
+                               'foo=\'1[#^`*%"w/(\'',
+                               'Single quotes are allowed if quoted by double quotes'
+                       ),
                        array( array( 'foo' => '&"' ), 'foo=&amp;&quot;', 'Special chars can be provided as entities' ),
                        array( array( 'foo' => '&foobar;' ), 'foo=&foobar;', 'Entity-like items are accepted' ),
                );
@@ -266,15 +294,29 @@ class SanitizerTest extends MediaWikiTestCase {
                                'Remove anything after a comment-start token' ),
                        array( '', "\\2f\\2a unifinished comment'",
                                'Remove anything after a backslash-escaped comment-start token' ),
-                       array( '/* insecure input */', 'filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'asdf.png\',sizingMethod=\'scale\');' ),
-                       array( '/* insecure input */', '-ms-filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'asdf.png\',sizingMethod=\'scale\')";' ),
+                       array(
+                               '/* insecure input */',
+                               'filter: progid:DXImageTransform.Microsoft.AlphaImageLoader'
+                                       . '(src=\'asdf.png\',sizingMethod=\'scale\');'
+                       ),
+                       array(
+                               '/* insecure input */',
+                               '-ms-filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader'
+                                       . '(src=\'asdf.png\',sizingMethod=\'scale\')";'
+                       ),
                        array( '/* insecure input */', 'width: expression(1+1);' ),
                        array( '/* insecure input */', 'background-image: image(asdf.png);' ),
                        array( '/* insecure input */', 'background-image: -webkit-image(asdf.png);' ),
                        array( '/* insecure input */', 'background-image: -moz-image(asdf.png);' ),
                        array( '/* insecure input */', 'background-image: image-set("asdf.png" 1x, "asdf.png" 2x);' ),
-                       array( '/* insecure input */', 'background-image: -webkit-image-set("asdf.png" 1x, "asdf.png" 2x);' ),
-                       array( '/* insecure input */', 'background-image: -moz-image-set("asdf.png" 1x, "asdf.png" 2x);' ),
+                       array(
+                               '/* insecure input */',
+                               'background-image: -webkit-image-set("asdf.png" 1x, "asdf.png" 2x);'
+                       ),
+                       array(
+                               '/* insecure input */',
+                               'background-image: -moz-image-set("asdf.png" 1x, "asdf.png" 2x);'
+                       ),
                );
        }
 
@@ -284,7 +326,12 @@ class SanitizerTest extends MediaWikiTestCase {
        public static function provideAttributeSupport() {
                /** array( <attributes>, <expected>, <message> ) */
                return array(
-                       array( 'div', ' role="presentation"', ' role="presentation"', 'Support for WAI-ARIA\'s role="presentation".' ),
+                       array(
+                               'div',
+                               ' role="presentation"',
+                               ' role="presentation"',
+                               'Support for WAI-ARIA\'s role="presentation".'
+                       ),
                        array( 'div', ' role="main"', '', "Other WAI-ARIA roles are currently not supported." ),
                );
        }
index 572740f..6547c87 100644 (file)
@@ -323,16 +323,41 @@ class SiteConfigurationTest extends MediaWikiTestCase {
                        'fallback' => 'tag',
                        'params' => 'en wiki enwiki',
                        'global' => array( 'enwiki' => 'enwiki' ) + $GLOBALS['global'],
-                       'merge' => array( 'enwiki' => 'enwiki', 'tag' => 'tag', 'wiki' => 'wiki', 'default' => 'default' ),
+                       'merge' => array(
+                               'enwiki' => 'enwiki',
+                               'tag' => 'tag',
+                               'wiki' => 'wiki',
+                               'default' => 'default'
+                       ),
                );
                $this->assertEquals( $getall, $this->mConf->getAll( 'enwiki' ), 'getAll()' );
 
                $this->mConf->extractAllGlobals( 'enwiki', 'wiki' );
 
-               $this->assertEquals( $getall['simple'], $GLOBALS['simple'], 'extractAllGlobals(): simple setting' );
-               $this->assertEquals( $getall['fallback'], $GLOBALS['fallback'], 'extractAllGlobals(): fallback setting' );
-               $this->assertEquals( $getall['params'], $GLOBALS['params'], 'extractAllGlobals(): parameter replacement' );
-               $this->assertEquals( $getall['global'], $GLOBALS['global'], 'extractAllGlobals(): merging with global' );
-               $this->assertEquals( $getall['merge'], $GLOBALS['merge'], 'extractAllGlobals(): merging setting' );
+               $this->assertEquals(
+                       $getall['simple'],
+                       $GLOBALS['simple'],
+                       'extractAllGlobals(): simple setting'
+               );
+               $this->assertEquals(
+                       $getall['fallback'],
+                       $GLOBALS['fallback'],
+                       'extractAllGlobals(): fallback setting'
+               );
+               $this->assertEquals(
+                       $getall['params'],
+                       $GLOBALS['params'],
+                       'extractAllGlobals(): parameter replacement'
+               );
+               $this->assertEquals(
+                       $getall['global'],
+                       $GLOBALS['global'],
+                       'extractAllGlobals(): merging with global'
+               );
+               $this->assertEquals(
+                       $getall['merge'],
+                       $GLOBALS['merge'],
+                       'extractAllGlobals(): merging setting'
+               );
        }
 }
index 8f54714..baa995d 100644 (file)
@@ -10,7 +10,6 @@
  */
 
 class SkinTemplateTest extends MediaWikiTestCase {
-
        /**
         * @dataProvider makeListItemProvider
         */
@@ -29,7 +28,13 @@ class SkinTemplateTest extends MediaWikiTestCase {
                        array(
                                '<li class="class" title="itemtitle"><a href="url" title="title">text</a></li>',
                                '',
-                               array( 'class' => 'class', 'itemtitle' => 'itemtitle', 'href' => 'url', 'title' => 'title', 'text' => 'text' ),
+                               array(
+                                       'class' => 'class',
+                                       'itemtitle' => 'itemtitle',
+                                       'href' => 'url',
+                                       'title' => 'title',
+                                       'text' => 'text'
+                               ),
                                array(),
                                'Test makteListItem with normal values'
                        )
index 9d42d1c..1a6cfe6 100644 (file)
@@ -233,7 +233,10 @@ class StatusTest extends MediaWikiLangTestCase {
                $status2->error( $message2 );
 
                $status1->merge( $status2 );
-               $this->assertEquals( 2, count( $status1->getWarningsArray() ) + count( $status1->getErrorsArray() ) );
+               $this->assertEquals(
+                       2,
+                       count( $status1->getWarningsArray() ) + count( $status1->getErrorsArray() )
+               );
        }
 
        /**
@@ -249,7 +252,10 @@ class StatusTest extends MediaWikiLangTestCase {
                $status2->value = 'FooValue';
 
                $status1->merge( $status2, true );
-               $this->assertEquals( 2, count( $status1->getWarningsArray() ) + count( $status1->getErrorsArray() ) );
+               $this->assertEquals(
+                       2,
+                       count( $status1->getWarningsArray() ) + count( $status1->getErrorsArray() )
+               );
                $this->assertEquals( 'FooValue', $status1->getValue() );
        }
 
@@ -259,7 +265,10 @@ class StatusTest extends MediaWikiLangTestCase {
        public function testHasMessage() {
                $status = new Status();
                $status->fatal( 'bad' );
+               $status->fatal( wfMessage( 'bad-msg' ) );
                $this->assertTrue( $status->hasMessage( 'bad' ) );
+               $this->assertTrue( $status->hasMessage( 'bad-msg' ) );
+               $this->assertTrue( $status->hasMessage( wfMessage( 'bad-msg' ) ) );
                $this->assertFalse( $status->hasMessage( 'good' ) );
        }
 
@@ -302,8 +311,9 @@ class StatusTest extends MediaWikiLangTestCase {
         * @dataProvider provideGetWikiTextAndHtml
         * @covers Status::getHtml
         * @todo test long and short context messages generated through this method
-        *       this can not really be done now due to use of $this->getWikiText using wfMessage()->plain()
-        *       It is possible to mock such methods but only if namespaces are used
+        *   this can not really be done now due to use of $this->getWikiText using
+        *   wfMessage()->plain(). It is possible to mock such methods but only if
+        *   namespaces are used.
         */
        public function testGetHtml( Status $status, $wikitext, $html ) {
                $this->assertEquals( $html, $status->getHTML() );
index 7d18206..610a6ac 100644 (file)
@@ -1,7 +1,8 @@
 <?php
 
 /**
- * Wraps the user object, so we can also retain full access to properties like password if we log in via the API
+ * Wraps the user object, so we can also retain full access to properties
+ * like password if we log in via the API.
  */
 class TestUser {
        public $username;
@@ -10,7 +11,9 @@ class TestUser {
        public $groups;
        public $user;
 
-       public function __construct( $username, $realname = 'Real Name', $email = 'sample@example.com', $groups = array() ) {
+       public function __construct( $username, $realname = 'Real Name',
+               $email = 'sample@example.com', $groups = array()
+       ) {
                $this->username = $username;
                $this->realname = $realname;
                $this->email = $email;
index 832316e..e4c7623 100644 (file)
@@ -77,7 +77,10 @@ class TitleArrayFromResultTest extends MediaWikiTestCase {
         * @covers TitleArrayFromResult::count
         */
        public function testCountWithVaryingValues( $numRows ) {
-               $object = $this->getTitleArrayFromResult( $this->getMockResultWrapper( $this->getRowWithTitle(), $numRows ) );
+               $object = $this->getTitleArrayFromResult( $this->getMockResultWrapper(
+                       $this->getRowWithTitle(),
+                       $numRows
+               ) );
                $this->assertEquals( $numRows, $object->count() );
        }
 
index c7cbc7b..ac80a9a 100644 (file)
@@ -228,15 +228,21 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                $this->runGroupPermissions( 'move', array( array( 'movenotallowedfile' ) ) );
 
                $this->setUserPerm( "" );
-               $this->runGroupPermissions( 'move', array( array( 'movenotallowedfile' ), array( 'movenotallowed' ) ) );
+               $this->runGroupPermissions(
+                       'move',
+                       array( array( 'movenotallowedfile' ), array( 'movenotallowed' ) )
+               );
 
                $this->setUser( 'anon' );
                $this->setUserPerm( "move" );
                $this->runGroupPermissions( 'move', array( array( 'movenotallowedfile' ) ) );
 
                $this->setUserPerm( "" );
-               $this->runGroupPermissions( 'move', array( array( 'movenotallowedfile' ), array( 'movenotallowed' ) ),
-                       array( array( 'movenotallowedfile' ), array( 'movenologintext' ) ) );
+               $this->runGroupPermissions(
+                       'move',
+                       array( array( 'movenotallowedfile' ), array( 'movenotallowed' ) ),
+                       array( array( 'movenotallowedfile' ), array( 'movenologintext' ) )
+               );
 
                if ( $this->isWikitextNS( NS_MAIN ) ) {
                        //NOTE: some content models don't allow moving
@@ -293,13 +299,25 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                $this->assertEquals( array(), $res );
 
                $this->setUser( 'anon' );
-               $check = array( 'edit' => array( array( array( 'badaccess-groups', "*, [[$prefix:Users|Users]]", 2 ) ),
-                       array( array( 'badaccess-group0' ) ),
-                       array(), true ),
-                       'protect' => array( array( array( 'badaccess-groups', "[[$prefix:Administrators|Administrators]]", 1 ), array( 'protect-cantedit' ) ),
+               $check = array(
+                       'edit' => array(
+                               array( array( 'badaccess-groups', "*, [[$prefix:Users|Users]]", 2 ) ),
+                               array( array( 'badaccess-group0' ) ),
+                               array(),
+                               true
+                       ),
+                       'protect' => array(
+                               array( array(
+                                       'badaccess-groups',
+                                       "[[$prefix:Administrators|Administrators]]", 1 ),
+                                       array( 'protect-cantedit'
+                               ) ),
                                array( array( 'badaccess-group0' ), array( 'protect-cantedit' ) ),
-                               array( array( 'protect-cantedit' ) ), false ),
-                       '' => array( array(), array(), array(), true ) );
+                               array( array( 'protect-cantedit' ) ),
+                               false
+                       ),
+                       '' => array( array(), array(), array(), true )
+               );
 
                foreach ( array( "edit", "protect", "" ) as $action ) {
                        $this->setUserPerm( null );
@@ -599,8 +617,13 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                $this->setTitle( NS_MAIN, "test page" );
                $this->setUserPerm( array( "edit", "bogus" ) );
 
-               $this->title->mCascadeSources = array( Title::makeTitle( NS_MAIN, "Bogus" ), Title::makeTitle( NS_MAIN, "UnBogus" ) );
-               $this->title->mCascadingRestrictions = array( "bogus" => array( 'bogus', "sysop", "protect", "" ) );
+               $this->title->mCascadeSources = array(
+                       Title::makeTitle( NS_MAIN, "Bogus" ),
+                       Title::makeTitle( NS_MAIN, "UnBogus" )
+               );
+               $this->title->mCascadingRestrictions = array(
+                       "bogus" => array( 'bogus', "sysop", "protect", "" )
+               );
 
                $this->assertEquals( false,
                        $this->title->userCan( 'bogus', $this->user ) );
index 118cf95..1c7b662 100644 (file)
@@ -29,9 +29,15 @@ class TitleTest extends MediaWikiTestCase {
                foreach ( range( 1, 255 ) as $num ) {
                        $chr = chr( $num );
                        if ( strpos( "#[]{}<>|", $chr ) !== false || preg_match( "/[\\x00-\\x1f\\x7f]/", $chr ) ) {
-                               $this->assertFalse( (bool)preg_match( "/[$titlechars]/", $chr ), "chr($num) = $chr is not a valid titlechar" );
+                               $this->assertFalse(
+                                       (bool)preg_match( "/[$titlechars]/", $chr ),
+                                       "chr($num) = $chr is not a valid titlechar"
+                               );
                        } else {
-                               $this->assertTrue( (bool)preg_match( "/[$titlechars]/", $chr ), "chr($num) = $chr is a valid titlechar" );
+                               $this->assertTrue(
+                                       (bool)preg_match( "/[$titlechars]/", $chr ),
+                                       "chr($num) = $chr is a valid titlechar"
+                               );
                        }
                }
        }
@@ -75,6 +81,7 @@ class TitleTest extends MediaWikiTestCase {
                        'Foo/.../Sandbox',
                        'Sandbox/...',
                        'A~~',
+                       ':A',
                        // Length is 256 total, but only title part matters
                        'Category:' . str_repeat( 'x', 248 ),
                        str_repeat( 'x', 252 ),
@@ -87,7 +94,9 @@ class TitleTest extends MediaWikiTestCase {
                        'remotetestiw: Talk: # anchor',
                        'remotetestiw: #bar',
                        'remotetestiw: Talk:',
-                       'remotetestiw: Talk: Foo'
+                       'remotetestiw: Talk: Foo',
+                       'localtestiw:remotetestiw:',
+                       'localtestiw:remotetestiw:foo'
                ) as $text ) {
                        $this->assertInstanceOf( 'Title', Title::newFromText( $text ), "Valid: $text" );
                }
@@ -229,7 +238,11 @@ class TitleTest extends MediaWikiTestCase {
                } else {
                        $par = null;
                }
-               $this->assertEquals( $expectedParam, $par, "Bug 31100 regression check: Title->fixSpecialName() should preserve parameter" );
+               $this->assertEquals(
+                       $expectedParam,
+                       $par,
+                       "Bug 31100 regression check: Title->fixSpecialName() should preserve parameter"
+               );
        }
 
        public static function provideBug31100() {
@@ -330,7 +343,11 @@ class TitleTest extends MediaWikiTestCase {
                        $allowableness = $expected
                                ? " should be allowed"
                                : " should NOT be allowed";
-                       $this->assertEquals( $expected, $errors, "User action '$action' on [[$source]] $allowableness." );
+                       $this->assertEquals(
+                               $expected,
+                               $errors,
+                               "User action '$action' on [[$source]] $allowableness."
+                       );
                } else {
                        $errors = $this->flattenErrorsArray( $errors );
                        foreach ( (array)$expected as $error ) {
@@ -398,7 +415,9 @@ class TitleTest extends MediaWikiTestCase {
         * @dataProvider provideGetPageViewLanguage
         * @covers Title::getPageViewLanguage
         */
-       public function testGetPageViewLanguage( $expected, $titleText, $contLang, $lang, $variant, $msg = '' ) {
+       public function testGetPageViewLanguage( $expected, $titleText, $contLang,
+               $lang, $variant, $msg = ''
+       ) {
                global $wgLanguageCode, $wgContLang, $wgLang, $wgDefaultLanguageVariant, $wgAllowUserJs;
 
                // Setup environnement for this test
index 8d095d6..ea44f36 100644 (file)
@@ -74,7 +74,10 @@ class UserArrayFromResultTest extends MediaWikiTestCase {
         * @covers UserArrayFromResult::count
         */
        public function testCountWithVaryingValues( $numRows ) {
-               $object = $this->getUserArrayFromResult( $this->getMockResultWrapper( $this->getRowWithUsername(), $numRows ) );
+               $object = $this->getUserArrayFromResult( $this->getMockResultWrapper(
+                       $this->getRowWithUsername(),
+                       $numRows
+               ) );
                $this->assertEquals( $numRows, $object->count() );
        }
 
index e6af126..a19d035 100644 (file)
@@ -196,13 +196,21 @@ class UserTest extends MediaWikiTestCase {
                }
 
                $user->clearInstanceCache();
-               $this->assertEquals( 3, $user->getEditCount(), 'After three edits, the user edit count should be 3' );
+               $this->assertEquals(
+                       3,
+                       $user->getEditCount(),
+                       'After three edits, the user edit count should be 3'
+               );
 
                // increase the edit count and clear the cache
                $user->incEditCount();
 
                $user->clearInstanceCache();
-               $this->assertEquals( 4, $user->getEditCount(), 'After increasing the edit count manually, the user edit count should be 4' );
+               $this->assertEquals(
+                       4,
+                       $user->getEditCount(),
+                       'After increasing the edit count manually, the user edit count should be 4'
+               );
        }
 
        /**
index 06ed1fd..7b12a4a 100644 (file)
@@ -10,10 +10,12 @@ class WebRequestTest extends MediaWikiTestCase {
                parent::setUp();
 
                $this->oldServer = $_SERVER;
+               IP::clearCaches();
        }
 
        protected function tearDown() {
                $_SERVER = $this->oldServer;
+               IP::clearCaches();
 
                parent::tearDown();
        }
@@ -317,14 +319,30 @@ class WebRequestTest extends MediaWikiTestCase {
                        array( '', array(), 'Empty Accept-Language header' ),
                        array( 'en', array( 'en' => 1 ), 'One language' ),
                        array( 'en, ar', array( 'en' => 1, 'ar' => 1 ), 'Two languages listed in appearance order.' ),
-                       array( 'zh-cn,zh-tw', array( 'zh-cn' => 1, 'zh-tw' => 1 ), 'Two equally prefered languages, listed in appearance order per rfc3282. Checks c9119' ),
-                       array( 'es, en; q=0.5', array( 'es' => 1, 'en' => '0.5' ), 'Spanish as first language and English and second' ),
+                       array(
+                               'zh-cn,zh-tw',
+                               array( 'zh-cn' => 1, 'zh-tw' => 1 ),
+                               'Two equally prefered languages, listed in appearance order per rfc3282. Checks c9119'
+                       ),
+                       array(
+                               'es, en; q=0.5',
+                               array( 'es' => 1, 'en' => '0.5' ),
+                               'Spanish as first language and English and second'
+                       ),
                        array( 'en; q=0.5, es', array( 'es' => 1, 'en' => '0.5' ), 'Less prefered language first' ),
                        array( 'fr, en; q=0.5, es', array( 'fr' => 1, 'es' => 1, 'en' => '0.5' ), 'Three languages' ),
                        array( 'en; q=0.5, es', array( 'es' => 1, 'en' => '0.5' ), 'Two languages' ),
                        array( 'en, zh;q=0', array( 'en' => 1 ), "It's Chinese to me" ),
-                       array( 'es; q=1, pt;q=0.7, it; q=0.6, de; q=0.1, ru;q=0', array( 'es' => '1', 'pt' => '0.7', 'it' => '0.6', 'de' => '0.1' ), 'Preference for romance languages' ),
-                       array( 'en-gb, en-us; q=1', array( 'en-gb' => 1, 'en-us' => '1' ), 'Two equally prefered English variants' ),
+                       array(
+                               'es; q=1, pt;q=0.7, it; q=0.6, de; q=0.1, ru;q=0',
+                               array( 'es' => '1', 'pt' => '0.7', 'it' => '0.6', 'de' => '0.1' ),
+                               'Preference for Romance languages'
+                       ),
+                       array(
+                               'en-gb, en-us; q=1',
+                               array( 'en-gb' => 1, 'en-us' => '1' ),
+                               'Two equally prefered English variants'
+                       ),
                );
        }
 
index 9470359..37f1975 100644 (file)
@@ -97,9 +97,12 @@ class WikiPageTest extends MediaWikiLangTestCase {
                $page = $this->newPage( "WikiPageTest_testDoEditContent" );
                $title = $page->getTitle();
 
-               $content = ContentHandler::makeContent( "[[Lorem ipsum]] dolor sit amet, consetetur sadipscing elitr, sed diam "
+               $content = ContentHandler::makeContent(
+                       "[[Lorem ipsum]] dolor sit amet, consetetur sadipscing elitr, sed diam "
                                . " nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat.",
-                       $title, CONTENT_MODEL_WIKITEXT );
+                       $title,
+                       CONTENT_MODEL_WIKITEXT
+               );
 
                $page->doEditContent( $content, "[[testing]] 1" );
 
@@ -125,9 +128,12 @@ class WikiPageTest extends MediaWikiLangTestCase {
                $this->assertTrue( $content->equals( $retrieved ), 'retrieved content doesn\'t equal original' );
 
                # ------------------------
-               $content = ContentHandler::makeContent( "At vero eos et accusam et justo duo [[dolores]] et ea rebum. "
+               $content = ContentHandler::makeContent(
+                       "At vero eos et accusam et justo duo [[dolores]] et ea rebum. "
                                . "Stet clita kasd [[gubergren]], no sea takimata sanctus est.",
-                       $title, CONTENT_MODEL_WIKITEXT );
+                       $title,
+                       CONTENT_MODEL_WIKITEXT
+               );
 
                $page->doEditContent( $content, "testing 2" );
 
@@ -231,9 +237,17 @@ class WikiPageTest extends MediaWikiLangTestCase {
        public function testDoQuickEditContent() {
                global $wgUser;
 
-               $page = $this->createPage( "WikiPageTest_testDoQuickEditContent", "original text", CONTENT_MODEL_WIKITEXT );
+               $page = $this->createPage(
+                       "WikiPageTest_testDoQuickEditContent",
+                       "original text",
+                       CONTENT_MODEL_WIKITEXT
+               );
 
-               $content = ContentHandler::makeContent( "quick text", $page->getTitle(), CONTENT_MODEL_WIKITEXT );
+               $content = ContentHandler::makeContent(
+                       "quick text",
+                       $page->getTitle(),
+                       CONTENT_MODEL_WIKITEXT
+               );
                $page->doQuickEditContent( $content, $wgUser, "testing q" );
 
                # ---------------------
@@ -245,19 +259,38 @@ class WikiPageTest extends MediaWikiLangTestCase {
         * @covers WikiPage::doDeleteArticle
         */
        public function testDoDeleteArticle() {
-               $page = $this->createPage( "WikiPageTest_testDoDeleteArticle", "[[original text]] foo", CONTENT_MODEL_WIKITEXT );
+               $page = $this->createPage(
+                       "WikiPageTest_testDoDeleteArticle",
+                       "[[original text]] foo",
+                       CONTENT_MODEL_WIKITEXT
+               );
                $id = $page->getId();
 
                $page->doDeleteArticle( "testing deletion" );
 
-               $this->assertFalse( $page->getTitle()->getArticleID() > 0, "Title object should now have page id 0" );
+               $this->assertFalse(
+                       $page->getTitle()->getArticleID() > 0,
+                       "Title object should now have page id 0"
+               );
                $this->assertFalse( $page->getId() > 0, "WikiPage should now have page id 0" );
-               $this->assertFalse( $page->exists(), "WikiPage::exists should return false after page was deleted" );
-               $this->assertNull( $page->getContent(), "WikiPage::getContent should return null after page was deleted" );
-               $this->assertFalse( $page->getText(), "WikiPage::getText should return false after page was deleted" );
+               $this->assertFalse(
+                       $page->exists(),
+                       "WikiPage::exists should return false after page was deleted"
+               );
+               $this->assertNull(
+                       $page->getContent(),
+                       "WikiPage::getContent should return null after page was deleted"
+               );
+               $this->assertFalse(
+                       $page->getText(),
+                       "WikiPage::getText should return false after page was deleted"
+               );
 
                $t = Title::newFromText( $page->getTitle()->getPrefixedText() );
-               $this->assertFalse( $t->exists(), "Title::exists should return false after page was deleted" );
+               $this->assertFalse(
+                       $t->exists(),
+                       "Title::exists should return false after page was deleted"
+               );
 
                # ------------------------
                $dbr = wfGetDB( DB_SLAVE );
@@ -272,7 +305,11 @@ class WikiPageTest extends MediaWikiLangTestCase {
         * @covers WikiPage::doDeleteUpdates
         */
        public function testDoDeleteUpdates() {
-               $page = $this->createPage( "WikiPageTest_testDoDeleteArticle", "[[original text]] foo", CONTENT_MODEL_WIKITEXT );
+               $page = $this->createPage(
+                       "WikiPageTest_testDoDeleteArticle",
+                       "[[original text]] foo",
+                       CONTENT_MODEL_WIKITEXT
+               );
                $id = $page->getId();
 
                $page->doDeleteUpdates( $id );
@@ -366,7 +403,11 @@ class WikiPageTest extends MediaWikiLangTestCase {
                        $this->markTestSkipped( '$wgContentHandlerUseDB is disabled' );
                }
 
-               $page = $this->createPage( "WikiPageTest_testGetContentModel", "some text", CONTENT_MODEL_JAVASCRIPT );
+               $page = $this->createPage(
+                       "WikiPageTest_testGetContentModel",
+                       "some text",
+                       CONTENT_MODEL_JAVASCRIPT
+               );
 
                $page = new WikiPage( $page->getTitle() );
                $this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $page->getContentModel() );
@@ -382,7 +423,11 @@ class WikiPageTest extends MediaWikiLangTestCase {
                        $this->markTestSkipped( '$wgContentHandlerUseDB is disabled' );
                }
 
-               $page = $this->createPage( "WikiPageTest_testGetContentHandler", "some text", CONTENT_MODEL_JAVASCRIPT );
+               $page = $this->createPage(
+                       "WikiPageTest_testGetContentHandler",
+                       "some text",
+                       CONTENT_MODEL_JAVASCRIPT
+               );
 
                $page = new WikiPage( $page->getTitle() );
                $this->assertEquals( 'JavaScriptContentHandler', get_class( $page->getContentHandler() ) );
@@ -440,7 +485,12 @@ class WikiPageTest extends MediaWikiLangTestCase {
        public static function provideGetRedirectTarget() {
                return array(
                        array( 'WikiPageTest_testGetRedirectTarget_1', CONTENT_MODEL_WIKITEXT, "hello world", null ),
-                       array( 'WikiPageTest_testGetRedirectTarget_2', CONTENT_MODEL_WIKITEXT, "#REDIRECT [[hello world]]", "Hello world" ),
+                       array(
+                               'WikiPageTest_testGetRedirectTarget_2',
+                               CONTENT_MODEL_WIKITEXT,
+                               "#REDIRECT [[hello world]]",
+                               "Hello world"
+                       ),
                );
        }
 
@@ -587,7 +637,10 @@ class WikiPageTest extends MediaWikiLangTestCase {
 
                $title = Title::newFromText( $title );
 
-               if ( !$wgContentHandlerUseDB && $model && ContentHandler::getDefaultModelFor( $title ) != $model ) {
+               if ( !$wgContentHandlerUseDB
+                       && $model
+                       && ContentHandler::getDefaultModelFor( $title ) != $model
+               ) {
                        $this->markTestSkipped( "Can not use non-default content model $model for "
                                . $title->getPrefixedDBkey() . " with \$wgContentHandlerUseDB disabled." );
                }
@@ -599,11 +652,21 @@ class WikiPageTest extends MediaWikiLangTestCase {
                $v = $page->isCountable();
                $w = $page->isCountable( $editInfo );
 
-               $this->assertEquals( $expected, $v, "isCountable( null ) returned unexpected value " . var_export( $v, true )
-                       . " instead of " . var_export( $expected, true ) . " in mode `$mode` for text \"$text\"" );
+               $this->assertEquals(
+                       $expected,
+                       $v,
+                       "isCountable( null ) returned unexpected value " . var_export( $v, true )
+                               . " instead of " . var_export( $expected, true )
+                       . " in mode `$mode` for text \"$text\""
+               );
 
-               $this->assertEquals( $expected, $w, "isCountable( \$editInfo ) returned unexpected value " . var_export( $v, true )
-                       . " instead of " . var_export( $expected, true ) . " in mode `$mode` for text \"$text\"" );
+               $this->assertEquals(
+                       $expected,
+                       $w,
+                       "isCountable( \$editInfo ) returned unexpected value " . var_export( $v, true )
+                               . " instead of " . var_export( $expected, true )
+                       . " in mode `$mode` for text \"$text\""
+               );
        }
 
        public static function provideGetParserOutput() {
@@ -661,7 +724,7 @@ class WikiPageTest extends MediaWikiLangTestCase {
                $this->assertFalse( $po, "getParserOutput() shall return false for non-existing revisions." );
        }
 
-       static $sections =
+       public static $sections =
 
                "Intro
 
@@ -727,7 +790,9 @@ more stuff
         * @dataProvider dataReplaceSection
         * @covers WikiPage::replaceSection
         */
-       public function testReplaceSection( $title, $model, $text, $section, $with, $sectionTitle, $expected ) {
+       public function testReplaceSection( $title, $model, $text, $section, $with,
+               $sectionTitle, $expected
+       ) {
                $this->hideDeprecated( "WikiPage::replaceSection" );
 
                $page = $this->createPage( $title, $text, $model );
@@ -741,7 +806,9 @@ more stuff
         * @dataProvider dataReplaceSection
         * @covers WikiPage::replaceSectionContent
         */
-       public function testReplaceSectionContent( $title, $model, $text, $section, $with, $sectionTitle, $expected ) {
+       public function testReplaceSectionContent( $title, $model, $text, $section,
+               $with, $sectionTitle, $expected
+       ) {
                $page = $this->createPage( $title, $text, $model );
 
                $content = ContentHandler::makeContent( $with, $page->getTitle(), $page->getContentModel() );
@@ -759,23 +826,38 @@ more stuff
        $rev1 = $page->getRevision();
 
        $text .= "\n\ntwo";
-       $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section two");
+       $page->doEditContent(
+               ContentHandler::makeContent( $text, $page->getTitle() ),
+               "adding section two"
+       );
        $rev2 = $page->getRevision();
 
        $text .= "\n\nthree";
-       $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section three");
+       $page->doEditContent(
+               ContentHandler::makeContent( $text, $page->getTitle() ),
+               "adding section three"
+       );
        $rev3 = $page->getRevision();
 
        $text .= "\n\nfour";
-       $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section four");
+       $page->doEditContent(
+               ContentHandler::makeContent( $text, $page->getTitle() ),
+               "adding section four"
+       );
        $rev4 = $page->getRevision();
 
        $text .= "\n\nfive";
-       $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section five");
+       $page->doEditContent(
+               ContentHandler::makeContent( $text, $page->getTitle() ),
+               "adding section five"
+       );
        $rev5 = $page->getRevision();
 
        $text .= "\n\nsix";
-       $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section six");
+       $page->doEditContent(
+               ContentHandler::makeContent( $text, $page->getTitle() ),
+               "adding section six"
+       );
        $rev6 = $page->getRevision();
 
        $undo6 = $page->getUndoText( $rev6 );
@@ -793,7 +875,8 @@ more stuff
         */
 
        /**
-        * @todo FIXME: this is a better rollback test than the one below, but it keeps failing in jenkins for some reason.
+        * @todo FIXME: this is a better rollback test than the one below, but it
+        * keeps failing in jenkins for some reason.
         */
        public function broken_testDoRollback() {
                $admin = new User();
@@ -818,8 +901,9 @@ more stuff
                $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ),
                        "adding section three", 0, false, $user2 );
 
-               # we are having issues with doRollback spuriously failing. apparently the last revision somehow goes missing
-               # or not committed under some circumstances. so, make sure the last revision has the right user name.
+               # we are having issues with doRollback spuriously failing. Apparently
+               # the last revision somehow goes missing or not committed under some
+               # circumstances. So, make sure the last revision has the right user name.
                $dbr = wfGetDB( DB_SLAVE );
                $this->assertEquals( 3, Revision::countByPageId( $dbr, $page->getId() ) );
 
@@ -835,11 +919,22 @@ more stuff
 
                # now, try the actual rollback
                $admin->addGroup( "sysop" ); #XXX: make the test user a sysop...
-               $token = $admin->getEditToken( array( $page->getTitle()->getPrefixedText(), $user2->getName() ), null );
-               $errors = $page->doRollback( $user2->getName(), "testing revert", $token, false, $details, $admin );
+               $token = $admin->getEditToken(
+                       array( $page->getTitle()->getPrefixedText(), $user2->getName() ),
+                       null
+               );
+               $errors = $page->doRollback(
+                       $user2->getName(),
+                       "testing revert",
+                       $token,
+                       false,
+                       $details,
+                       $admin
+               );
 
                if ( $errors ) {
-                       $this->fail( "Rollback failed:\n" . print_r( $errors, true ) . ";\n" . print_r( $details, true ) );
+                       $this->fail( "Rollback failed:\n" . print_r( $errors, true )
+                               . ";\n" . print_r( $details, true ) );
                }
 
                $page = new WikiPage( $page->getTitle() );
@@ -858,24 +953,45 @@ more stuff
 
                $text = "one";
                $page = $this->newPage( "WikiPageTest_testDoRollback" );
-               $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT ),
-                       "section one", EDIT_NEW, false, $admin );
+               $page->doEditContent(
+                       ContentHandler::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT ),
+                       "section one",
+                       EDIT_NEW,
+                       false,
+                       $admin
+               );
                $rev1 = $page->getRevision();
 
                $user1 = new User();
                $user1->setName( "127.0.1.11" );
                $text .= "\n\ntwo";
                $page = new WikiPage( $page->getTitle() );
-               $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT ),
-                       "adding section two", 0, false, $user1 );
+               $page->doEditContent(
+                       ContentHandler::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT ),
+                       "adding section two",
+                       0,
+                       false,
+                       $user1
+               );
 
                # now, try the rollback
                $admin->addGroup( "sysop" ); #XXX: make the test user a sysop...
-               $token = $admin->getEditToken( array( $page->getTitle()->getPrefixedText(), $user1->getName() ), null );
-               $errors = $page->doRollback( $user1->getName(), "testing revert", $token, false, $details, $admin );
+               $token = $admin->getEditToken(
+                       array( $page->getTitle()->getPrefixedText(), $user1->getName() ),
+                       null
+               );
+               $errors = $page->doRollback(
+                       $user1->getName(),
+                       "testing revert",
+                       $token,
+                       false,
+                       $details,
+                       $admin
+               );
 
                if ( $errors ) {
-                       $this->fail( "Rollback failed:\n" . print_r( $errors, true ) . ";\n" . print_r( $details, true ) );
+                       $this->fail( "Rollback failed:\n" . print_r( $errors, true )
+                               . ";\n" . print_r( $details, true ) );
                }
 
                $page = new WikiPage( $page->getTitle() );
@@ -894,8 +1010,13 @@ more stuff
 
                $text = "one";
                $page = $this->newPage( "WikiPageTest_testDoRollback" );
-               $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT ),
-                       "section one", EDIT_NEW, false, $admin );
+               $page->doEditContent(
+                       ContentHandler::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT ),
+                       "section one",
+                       EDIT_NEW,
+                       false,
+                       $admin
+               );
                $rev1 = $page->getRevision();
 
                $user1 = new User();
@@ -903,20 +1024,45 @@ more stuff
                $user1->addGroup( "sysop" ); #XXX: make the test user a sysop...
                $text .= "\n\ntwo";
                $page = new WikiPage( $page->getTitle() );
-               $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT ),
-                       "adding section two", 0, false, $user1 );
+               $page->doEditContent(
+                       ContentHandler::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT ),
+                       "adding section two",
+                       0,
+                       false,
+                       $user1
+               );
 
                # now, do a the rollback from the same user was doing the edit before
                $resultDetails = array();
-               $token = $user1->getEditToken( array( $page->getTitle()->getPrefixedText(), $user1->getName() ), null );
-               $errors = $page->doRollback( $user1->getName(), "testing revert same user", $token, false, $resultDetails, $admin );
+               $token = $user1->getEditToken(
+                       array( $page->getTitle()->getPrefixedText(), $user1->getName() ),
+                       null
+               );
+               $errors = $page->doRollback(
+                       $user1->getName(),
+                       "testing revert same user",
+                       $token,
+                       false,
+                       $resultDetails,
+                       $admin
+               );
 
                $this->assertEquals( array(), $errors, "Rollback failed same user" );
 
                # now, try the rollback
                $resultDetails = array();
-               $token = $admin->getEditToken( array( $page->getTitle()->getPrefixedText(), $user1->getName() ), null );
-               $errors = $page->doRollback( $user1->getName(), "testing revert", $token, false, $resultDetails, $admin );
+               $token = $admin->getEditToken(
+                       array( $page->getTitle()->getPrefixedText(), $user1->getName() ),
+                       null
+               );
+               $errors = $page->doRollback(
+                       $user1->getName(),
+                       "testing revert",
+                       $token,
+                       false,
+                       $resultDetails,
+                       $admin
+               );
 
                $this->assertEquals( array( array( 'alreadyrolled', 'WikiPageTest testDoRollback',
                        '127.0.1.11', 'Admin' ) ), $errors, "Rollback not failed" );
@@ -951,9 +1097,10 @@ more stuff
                        ),
 
                        array(
-                               'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut
-                               labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et
-                               ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.',
+                               'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
+                               eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam
+                               voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet
+                               clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.',
                                'Hello world!',
                                0,
                                '/^Replaced .*Hello/'
@@ -1019,11 +1166,15 @@ more stuff
 
                        array(
                                array(
-                                       array( "first edit: "
-                                               . "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam "
-                                               . " nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. "
-                                               . "At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea "
-                                               . "takimata sanctus est Lorem ipsum dolor sit amet.'", null ),
+                                       array(
+                                               "first edit: "
+                                                       . "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam "
+                                                       . " nonumy eirmod tempor invidunt ut labore et dolore magna "
+                                                       . "aliquyam erat, sed diam voluptua. At vero eos et accusam "
+                                                       . "et justo duo dolores et ea rebum. Stet clita kasd gubergren, "
+                                                       . "no sea  takimata sanctus est Lorem ipsum dolor sit amet.'",
+                                               null
+                                       ),
                                ),
                                '/first edit:.*\.\.\."/',
                                false
diff --git a/tests/phpunit/includes/WikiPageTestContentHandlerUseDB.php b/tests/phpunit/includes/WikiPageTestContentHandlerUseDB.php
new file mode 100644 (file)
index 0000000..3db7628
--- /dev/null
@@ -0,0 +1,61 @@
+<?php
+
+/**
+ * @group ContentHandler
+ * @group Database
+ * ^--- important, causes temporary tables to be used instead of the real database
+ */
+class WikiPageTestContentHandlerUseDB extends WikiPageTest {
+
+       protected function setUp() {
+               parent::setUp();
+               $this->setMwGlobals( 'wgContentHandlerUseDB', false );
+
+               $dbw = wfGetDB( DB_MASTER );
+
+               $page_table = $dbw->tableName( 'page' );
+               $revision_table = $dbw->tableName( 'revision' );
+               $archive_table = $dbw->tableName( 'archive' );
+
+               if ( $dbw->fieldExists( $page_table, 'page_content_model' ) ) {
+                       $dbw->query( "alter table $page_table drop column page_content_model" );
+                       $dbw->query( "alter table $revision_table drop column rev_content_model" );
+                       $dbw->query( "alter table $revision_table drop column rev_content_format" );
+                       $dbw->query( "alter table $archive_table drop column ar_content_model" );
+                       $dbw->query( "alter table $archive_table drop column ar_content_format" );
+               }
+       }
+
+       /**
+        * @covers WikiPage::getContentModel
+        */
+       public function testGetContentModel() {
+               $page = $this->createPage(
+                       "WikiPageTest_testGetContentModel",
+                       "some text",
+                       CONTENT_MODEL_JAVASCRIPT
+               );
+
+               $page = new WikiPage( $page->getTitle() );
+
+               // NOTE: since the content model is not recorded in the database,
+               //       we expect to get the default, namely CONTENT_MODEL_WIKITEXT
+               $this->assertEquals( CONTENT_MODEL_WIKITEXT, $page->getContentModel() );
+       }
+
+       /**
+        * @covers WikiPage::getContentHandler
+        */
+       public function testGetContentHandler() {
+               $page = $this->createPage(
+                       "WikiPageTest_testGetContentHandler",
+                       "some text",
+                       CONTENT_MODEL_JAVASCRIPT
+               );
+
+               // NOTE: since the content model is not recorded in the database,
+               //       we expect to get the default, namely CONTENT_MODEL_WIKITEXT
+               $page = new WikiPage( $page->getTitle() );
+               $this->assertEquals( 'WikitextContentHandler', get_class( $page->getContentHandler() ) );
+       }
+}
diff --git a/tests/phpunit/includes/WikiPageTest_ContentHandlerUseDB.php b/tests/phpunit/includes/WikiPageTest_ContentHandlerUseDB.php
deleted file mode 100644 (file)
index 2a723e8..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-
-/**
- * @group ContentHandler
- * @group Database
- * ^--- important, causes temporary tables to be used instead of the real database
- */
-class WikiPageTest_ContentHandlerUseDB extends WikiPageTest {
-
-       protected function setUp() {
-               parent::setUp();
-               $this->setMwGlobals( 'wgContentHandlerUseDB', false );
-
-               $dbw = wfGetDB( DB_MASTER );
-
-               $page_table = $dbw->tableName( 'page' );
-               $revision_table = $dbw->tableName( 'revision' );
-               $archive_table = $dbw->tableName( 'archive' );
-
-               if ( $dbw->fieldExists( $page_table, 'page_content_model' ) ) {
-                       $dbw->query( "alter table $page_table drop column page_content_model" );
-                       $dbw->query( "alter table $revision_table drop column rev_content_model" );
-                       $dbw->query( "alter table $revision_table drop column rev_content_format" );
-                       $dbw->query( "alter table $archive_table drop column ar_content_model" );
-                       $dbw->query( "alter table $archive_table drop column ar_content_format" );
-               }
-       }
-
-       /**
-        * @covers WikiPage::getContentModel
-        */
-       public function testGetContentModel() {
-               $page = $this->createPage( "WikiPageTest_testGetContentModel", "some text", CONTENT_MODEL_JAVASCRIPT );
-
-               $page = new WikiPage( $page->getTitle() );
-
-               // NOTE: since the content model is not recorded in the database,
-               //       we expect to get the default, namely CONTENT_MODEL_WIKITEXT
-               $this->assertEquals( CONTENT_MODEL_WIKITEXT, $page->getContentModel() );
-       }
-
-       /**
-        * @covers WikiPage::getContentHandler
-        */
-       public function testGetContentHandler() {
-               $page = $this->createPage( "WikiPageTest_testGetContentHandler", "some text", CONTENT_MODEL_JAVASCRIPT );
-
-               // NOTE: since the content model is not recorded in the database,
-               //       we expect to get the default, namely CONTENT_MODEL_WIKITEXT
-               $page = new WikiPage( $page->getTitle() );
-               $this->assertEquals( 'WikitextContentHandler', get_class( $page->getContentHandler() ) );
-       }
-}
index 56d28b5..9f154bb 100644 (file)
@@ -72,7 +72,10 @@ class XmlSelectTest extends MediaWikiTestCase {
         */
        public function testAddOption() {
                $this->select->addOption( 'foo' );
-               $this->assertEquals( '<select><option value="foo">foo</option></select>', $this->select->getHTML() );
+               $this->assertEquals(
+                       '<select><option value="foo">foo</option></select>',
+                       $this->select->getHTML()
+               );
        }
 
        /**
@@ -80,7 +83,10 @@ class XmlSelectTest extends MediaWikiTestCase {
         */
        public function testAddOptionWithDefault() {
                $this->select->addOption( 'foo', true );
-               $this->assertEquals( '<select><option value="1">foo</option></select>', $this->select->getHTML() );
+               $this->assertEquals(
+                       '<select><option value="1">foo</option></select>',
+                       $this->select->getHTML()
+               );
        }
 
        /**
@@ -88,7 +94,10 @@ class XmlSelectTest extends MediaWikiTestCase {
         */
        public function testAddOptionWithFalse() {
                $this->select->addOption( 'foo', false );
-               $this->assertEquals( '<select><option value="foo">foo</option></select>', $this->select->getHTML() );
+               $this->assertEquals(
+                       '<select><option value="foo">foo</option></select>',
+                       $this->select->getHTML()
+               );
        }
 
        /**
@@ -96,7 +105,10 @@ class XmlSelectTest extends MediaWikiTestCase {
         */
        public function testAddOptionWithValueZero() {
                $this->select->addOption( 'foo', 0 );
-               $this->assertEquals( '<select><option value="0">foo</option></select>', $this->select->getHTML() );
+               $this->assertEquals(
+                       '<select><option value="0">foo</option></select>',
+                       $this->select->getHTML()
+               );
        }
 
        /**
index 86b4c35..382e3d8 100644 (file)
@@ -151,7 +151,11 @@ class XmlTest extends MediaWikiTestCase {
                }
 
                $this->assertEquals(
-                       '<label for="year">From year (and earlier):</label> <input id="year" maxlength="4" size="7" type="number" value="2011" name="year" /> <label for="month">From month (and earlier):</label> <select id="month" name="month" class="mw-month-selector"><option value="-1">all</option>' . "\n" .
+                       '<label for="year">From year (and earlier):</label> ' .
+                               '<input id="year" maxlength="4" size="7" type="number" value="2011" name="year" /> ' .
+                               '<label for="month">From month (and earlier):</label> ' .
+                               '<select id="month" name="month" class="mw-month-selector">' .
+                               '<option value="-1">all</option>' . "\n" .
                                '<option value="1">January</option>' . "\n" .
                                '<option value="2" selected="">February</option>' . "\n" .
                                '<option value="3">March</option>' . "\n" .
@@ -168,7 +172,11 @@ class XmlTest extends MediaWikiTestCase {
                        "Date menu for february 2011"
                );
                $this->assertEquals(
-                       '<label for="year">From year (and earlier):</label> <input id="year" maxlength="4" size="7" type="number" value="2011" name="year" /> <label for="month">From month (and earlier):</label> <select id="month" name="month" class="mw-month-selector"><option value="-1">all</option>' . "\n" .
+                       '<label for="year">From year (and earlier):</label> ' .
+                               '<input id="year" maxlength="4" size="7" type="number" value="2011" name="year" /> ' .
+                               '<label for="month">From month (and earlier):</label> ' .
+                               '<select id="month" name="month" class="mw-month-selector">' .
+                               '<option value="-1">all</option>' . "\n" .
                                '<option value="1">January</option>' . "\n" .
                                '<option value="2">February</option>' . "\n" .
                                '<option value="3">March</option>' . "\n" .
@@ -198,7 +206,11 @@ class XmlTest extends MediaWikiTestCase {
                );
 
                $this->assertEquals(
-                       '<label for="year">From year (and earlier):</label> <input id="year" maxlength="4" size="7" type="number" name="year" /> <label for="month">From month (and earlier):</label> <select id="month" name="month" class="mw-month-selector"><option value="-1">all</option>' . "\n" .
+                       '<label for="year">From year (and earlier):</label> ' .
+                               '<input id="year" maxlength="4" size="7" type="number" name="year" /> ' .
+                               '<label for="month">From month (and earlier):</label> ' .
+                               '<select id="month" name="month" class="mw-month-selector">' .
+                               '<option value="-1">all</option>' . "\n" .
                                '<option value="1">January</option>' . "\n" .
                                '<option value="2">February</option>' . "\n" .
                                '<option value="3">March</option>' . "\n" .
index 2e1c265..9f8c139 100644 (file)
@@ -274,6 +274,100 @@ class ApiEditPageTest extends ApiTestCase {
                $this->assertEquals( "== header ==\n\ntest\n\n== header ==\n\ntest", $text );
        }
 
+       /**
+        * Ensure we can edit through a redirect, if adding a section
+        */
+       public function testEdit_redirect() {
+               static $count = 0;
+               $count++;
+
+               // assume NS_HELP defaults to wikitext
+               $name = "Help:ApiEditPageTest_testEdit_redirect_$count";
+               $title = Title::newFromText( $name );
+               $page = WikiPage::factory( $title );
+
+               $rname = "Help:ApiEditPageTest_testEdit_redirect_r$count";
+               $rtitle = Title::newFromText( $rname );
+               $rpage = WikiPage::factory( $rtitle );
+
+               // base edit for content
+               $page->doEditContent( new WikitextContent( "Foo" ),
+                       "testing 1", EDIT_NEW, false, self::$users['sysop']->user );
+               $this->forceRevisionDate( $page, '20120101000000' );
+               $baseTime = $page->getRevision()->getTimestamp();
+
+               // base edit for redirect
+               $rpage->doEditContent( new WikitextContent( "#REDIRECT [[$name]]" ),
+                       "testing 1", EDIT_NEW, false, self::$users['sysop']->user );
+               $this->forceRevisionDate( $rpage, '20120101000000' );
+
+               // conflicting edit to redirect
+               $rpage->doEditContent( new WikitextContent( "#REDIRECT [[$name]]\n\n[[Category:Test]]" ),
+                       "testing 2", EDIT_UPDATE, $page->getLatest(), self::$users['uploader']->user );
+               $this->forceRevisionDate( $rpage, '20120101020202' );
+
+               // try to save edit, following the redirect
+               list( $re, , ) = $this->doApiRequestWithToken( array(
+                       'action' => 'edit',
+                       'title' => $rname,
+                       'text' => 'nix bar!',
+                       'basetimestamp' => $baseTime,
+                       'section' => 'new',
+                       'redirect' => true,
+               ), null, self::$users['sysop']->user );
+
+               $this->assertEquals( 'Success', $re['edit']['result'],
+                       "no problems expected when following redirect" );
+       }
+
+       /**
+        * Ensure we cannot edit through a redirect, if attempting to overwrite content
+        */
+       public function testEdit_redirectText() {
+               static $count = 0;
+               $count++;
+
+               // assume NS_HELP defaults to wikitext
+               $name = "Help:ApiEditPageTest_testEdit_redirectText_$count";
+               $title = Title::newFromText( $name );
+               $page = WikiPage::factory( $title );
+
+               $rname = "Help:ApiEditPageTest_testEdit_redirectText_r$count";
+               $rtitle = Title::newFromText( $rname );
+               $rpage = WikiPage::factory( $rtitle );
+
+               // base edit for content
+               $page->doEditContent( new WikitextContent( "Foo" ),
+                       "testing 1", EDIT_NEW, false, self::$users['sysop']->user );
+               $this->forceRevisionDate( $page, '20120101000000' );
+               $baseTime = $page->getRevision()->getTimestamp();
+
+               // base edit for redirect
+               $rpage->doEditContent( new WikitextContent( "#REDIRECT [[$name]]" ),
+                       "testing 1", EDIT_NEW, false, self::$users['sysop']->user );
+               $this->forceRevisionDate( $rpage, '20120101000000' );
+
+               // conflicting edit to redirect
+               $rpage->doEditContent( new WikitextContent( "#REDIRECT [[$name]]\n\n[[Category:Test]]" ),
+                       "testing 2", EDIT_UPDATE, $page->getLatest(), self::$users['uploader']->user );
+               $this->forceRevisionDate( $rpage, '20120101020202' );
+
+               // try to save edit, following the redirect but without creating a section
+               try {
+                       $this->doApiRequestWithToken( array(
+                               'action' => 'edit',
+                               'title' => $rname,
+                               'text' => 'nix bar!',
+                               'basetimestamp' => $baseTime,
+                               'redirect' => true,
+                       ), null, self::$users['sysop']->user );
+
+                       $this->fail( 'redirect-appendonly error expected' );
+               } catch ( UsageException $ex ) {
+                       $this->assertEquals( 'redirect-appendonly', $ex->getCodeString() );
+               }
+       }
+
        public function testEditConflict() {
                static $count = 0;
                $count++;
@@ -310,60 +404,41 @@ class ApiEditPageTest extends ApiTestCase {
                }
        }
 
-       public function testEditConflict_redirect() {
+       /**
+        * Ensure that editing using section=new will prevent simple conflicts
+        */
+       public function testEditConflict_newSection() {
                static $count = 0;
                $count++;
 
                // assume NS_HELP defaults to wikitext
-               $name = "Help:ApiEditPageTest_testEditConflict_redirect_$count";
+               $name = "Help:ApiEditPageTest_testEditConflict_newSection_$count";
                $title = Title::newFromText( $name );
-               $page = WikiPage::factory( $title );
 
-               $rname = "Help:ApiEditPageTest_testEditConflict_redirect_r$count";
-               $rtitle = Title::newFromText( $rname );
-               $rpage = WikiPage::factory( $rtitle );
+               $page = WikiPage::factory( $title );
 
-               // base edit for content
+               // base edit
                $page->doEditContent( new WikitextContent( "Foo" ),
                        "testing 1", EDIT_NEW, false, self::$users['sysop']->user );
                $this->forceRevisionDate( $page, '20120101000000' );
                $baseTime = $page->getRevision()->getTimestamp();
 
-               // base edit for redirect
-               $rpage->doEditContent( new WikitextContent( "#REDIRECT [[$name]]" ),
-                       "testing 1", EDIT_NEW, false, self::$users['sysop']->user );
-               $this->forceRevisionDate( $rpage, '20120101000000' );
-
-               // conflicting edit to redirect
-               $rpage->doEditContent( new WikitextContent( "#REDIRECT [[$name]]\n\n[[Category:Test]]" ),
+               // conflicting edit
+               $page->doEditContent( new WikitextContent( "Foo bar" ),
                        "testing 2", EDIT_UPDATE, $page->getLatest(), self::$users['uploader']->user );
-               $this->forceRevisionDate( $rpage, '20120101020202' );
+               $this->forceRevisionDate( $page, '20120101020202' );
 
-               // try to save edit; should work, because we follow the redirect
+               // try to save edit, expect no conflict
                list( $re, , ) = $this->doApiRequestWithToken( array(
                        'action' => 'edit',
-                       'title' => $rname,
+                       'title' => $name,
                        'text' => 'nix bar!',
                        'basetimestamp' => $baseTime,
-                       'redirect' => true,
+                       'section' => 'new',
                ), null, self::$users['sysop']->user );
 
                $this->assertEquals( 'Success', $re['edit']['result'],
-                       "no edit conflict expected when following redirect" );
-
-               // try again, without following the redirect. Should fail.
-               try {
-                       $this->doApiRequestWithToken( array(
-                               'action' => 'edit',
-                               'title' => $rname,
-                               'text' => 'nix bar!',
-                               'basetimestamp' => $baseTime,
-                       ), null, self::$users['sysop']->user );
-
-                       $this->fail( 'edit conflict expected' );
-               } catch ( UsageException $ex ) {
-                       $this->assertEquals( 'editconflict', $ex->getCodeString() );
-               }
+                       "no edit conflict expected here" );
        }
 
        public function testEditConflict_bug41990() {
@@ -405,6 +480,7 @@ class ApiEditPageTest extends ApiTestCase {
                        'action' => 'edit',
                        'title' => $rname,
                        'text' => 'nix bar!',
+                       'section' => 'new',
                        'redirect' => true,
                ), null, self::$users['sysop']->user );
 
index f1199e0..67a75f3 100644 (file)
@@ -107,7 +107,8 @@ class ApiLoginTest extends ApiTestCase {
         * @group Broken
         */
        public function testApiLoginGotCookie() {
-               $this->markTestIncomplete( "The server can't do external HTTP requests, and the internal one won't give cookies" );
+               $this->markTestIncomplete( "The server can't do external HTTP requests, "
+                       . "and the internal one won't give cookies" );
 
                global $wgServer, $wgScriptPath;
 
@@ -147,7 +148,10 @@ class ApiLoginTest extends ApiTestCase {
                $this->assertNotEquals( false, $serverName );
                $serializedCookie = $cj->serializeToHttpRequest( $wgScriptPath, $serverName );
                $this->assertNotEquals( '', $serializedCookie );
-               $this->assertRegexp( '/_session=[^;]*; .*UserID=[0-9]*; .*UserName=' . $user->userName . '; .*Token=/', $serializedCookie );
+               $this->assertRegexp(
+                       '/_session=[^;]*; .*UserID=[0-9]*; .*UserName=' . $user->userName . '; .*Token=/',
+                       $serializedCookie
+               );
        }
 
        public function testRunLogin() {
index 15bd8bb..e031ce3 100644 (file)
@@ -318,7 +318,9 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
                $this->mUserMock->expects( $this->once() )
                        ->method( 'saveSettings' );
 
-               $request = $this->getSampleRequest( array( 'change' => 'willBeNull|willBeEmpty=|willBeHappy=Happy' ) );
+               $request = $this->getSampleRequest( array(
+                       'change' => 'willBeNull|willBeEmpty=|willBeHappy=Happy'
+               ) );
 
                $response = $this->executeQuery( $request );
 
@@ -382,7 +384,8 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
                        ->method( 'saveSettings' );
 
                $request = $this->getSampleRequest( array(
-                       'change' => 'testmultiselect-opt1=1|testmultiselect-opt2|testmultiselect-opt3=|testmultiselect-opt4=0'
+                       'change' => 'testmultiselect-opt1=1|testmultiselect-opt2|'
+                               . 'testmultiselect-opt3=|testmultiselect-opt4=0'
                ) );
 
                $response = $this->executeQuery( $request );
index d303d4b..d038a4f 100644 (file)
@@ -24,8 +24,12 @@ class ApiParseTest extends ApiTestCase {
 
                        $this->fail( "API did not return an error when parsing a nonexistent page" );
                } catch ( UsageException $ex ) {
-                       $this->assertEquals( 'missingtitle', $ex->getCodeString(),
-                               "Parse request for nonexistent page must give 'missingtitle' error: " . var_export( $ex->getMessageArray(), true ) );
+                       $this->assertEquals(
+                               'missingtitle',
+                               $ex->getCodeString(),
+                               "Parse request for nonexistent page must give 'missingtitle' error: "
+                                       . var_export( $ex->getMessageArray(), true )
+                       );
                }
        }
 }
index d25a4c1..7fce134 100644 (file)
@@ -31,8 +31,11 @@ class ApiPurgeTest extends ApiTestCase {
                $this->assertArrayHasKey( 'purge', $data[0],
                        "Must receive a 'purge' result from API" );
 
-               $this->assertEquals( 3, count( $data[0]['purge'] ),
-                       "Purge request for three articles should give back three results received: " . var_export( $data[0]['purge'], true ) );
+               $this->assertEquals(
+                       3,
+                       count( $data[0]['purge'] ),
+                       "Purge request for three articles should give back three results received: "
+                               . var_export( $data[0]['purge'], true ) );
 
                $pages = array( 'UTPage' => 'purged', $somePage => 'missing', '%5D' => 'invalid' );
                foreach ( $data[0]['purge'] as $v ) {
index 843c88d..87ad2cd 100644 (file)
@@ -72,7 +72,9 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
         *
         * @return array
         */
-       protected function doApiRequest( array $params, array $session = null, $appendModule = false, User $user = null ) {
+       protected function doApiRequest( array $params, array $session = null,
+               $appendModule = false, User $user = null
+       ) {
                global $wgRequest, $wgUser;
 
                if ( is_null( $session ) ) {
@@ -112,15 +114,19 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
 
        /**
         * Add an edit token to the API request
-        * This is cheating a bit -- we grab a token in the correct format and then add it to the pseudo-session and to the
-        * request, without actually requesting a "real" edit token
+        * This is cheating a bit -- we grab a token in the correct format and then
+        * add it to the pseudo-session and to the request, without actually
+        * requesting a "real" edit token.
+        *
         * @param array $params Key-value API params
         * @param array|null $session session array
         * @param User|null $user A User object for the context
         * @return mixed Result of the API call
         * @throws Exception in case wsToken is not set in the session
         */
-       protected function doApiRequestWithToken( array $params, array $session = null, User $user = null ) {
+       protected function doApiRequestWithToken( array $params, array $session = null,
+               User $user = null
+       ) {
                global $wgRequest;
 
                if ( $session === null ) {
index 42f02fa..40407dc 100644 (file)
@@ -40,10 +40,18 @@ abstract class ApiTestCaseUpload extends ApiTestCase {
                        $noOldArchive = ""; // yes this really needs to be set this way
                        $comment = "removing for test";
                        $restrictDeletedVersions = false;
-                       $status = FileDeleteForm::doDelete( $title, $file, $noOldArchive, $comment, $restrictDeletedVersions );
+                       $status = FileDeleteForm::doDelete(
+                               $title,
+                               $file,
+                               $noOldArchive,
+                               $comment,
+                               $restrictDeletedVersions
+                       );
+
                        if ( !$status->isGood() ) {
                                return false;
                        }
+
                        $page = WikiPage::factory( $title );
                        $page->doDeleteArticle( "removing for test" );
 
@@ -66,7 +74,8 @@ abstract class ApiTestCaseUpload extends ApiTestCase {
        }
 
        /**
-        * Helper function -- given a file on the filesystem, find matching content in the db (and associated articles) and remove them.
+        * Helper function -- given a file on the filesystem, find matching
+        * content in the db (and associated articles) and remove them.
         *
         * @param string $filePath path to file on the filesystem
         *
index ba7fb25..8ea761f 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * @group API
  * @group Database
  * user that will run tests.
  */
 
-// Note for reviewers: this intentionally duplicates functionality already in "ApiSetup" and so on.
-// This framework works better IMO and has less strangeness (such as test cases inheriting from "ApiSetup"...)
-// (and in the case of the other Upload tests, this flat out just actually works... )
+// Note for reviewers: this intentionally duplicates functionality already in
+// "ApiSetup" and so on. This framework works better IMO and has less
+// strangeness (such as test cases inheriting from "ApiSetup"...) (and in the
+// case of the other Upload tests, this flat out just actually works... )
 
-// TODO: port the other Upload tests, and other API tests to this framework
+// @todo Port the other Upload tests, and other API tests to this framework
 
 require_once 'ApiTestCaseUpload.php';
 
@@ -427,14 +427,16 @@ class ApiUploadTest extends ApiTestCaseUpload {
         */
        public function testUploadChunks( $session ) {
                $this->setMwGlobals( array(
-                       'wgUser' => self::$users['uploader']->user, // @todo FIXME: still used somewhere
+                       // @todo FIXME: still used somewhere
+                       'wgUser' => self::$users['uploader']->user,
                ) );
 
                $chunkSize = 1048576;
                // Download a large image file
                // ( using RandomImageGenerator for large files is not stable )
                $mimeType = 'image/jpeg';
-               $url = 'http://upload.wikimedia.org/wikipedia/commons/e/ed/Oberaargletscher_from_Oberaar%2C_2010_07.JPG';
+               $url = 'http://upload.wikimedia.org/wikipedia/commons/'
+                       . 'e/ed/Oberaargletscher_from_Oberaar%2C_2010_07.JPG';
                $filePath = wfTempDir() . '/Oberaargletscher_from_Oberaar.jpg';
                try {
                        // Only download if the file is not avaliable in the temp location:
@@ -464,13 +466,19 @@ class ApiUploadTest extends ApiTestCaseUpload {
                $chunkSessionKey = false;
                $resultOffset = 0;
                // Open the file:
-               $handle = @fopen( $filePath, "r" );
+               wfSuppressWarnings();
+               $handle = fopen( $filePath, "r" );
+               wfRestoreWarnings();
+
                if ( $handle === false ) {
                        $this->markTestIncomplete( "could not open file: $filePath" );
                }
+
                while ( !feof( $handle ) ) {
                        // Get the current chunk
-                       $chunkData = @fread( $handle, $chunkSize );
+                       wfSuppressWarnings();
+                       $chunkData = fread( $handle, $chunkSize );
+                       wfRestoreWarnings();
 
                        // Upload the current chunk into the $_FILE object:
                        $this->fakeUploadChunk( 'chunk', 'blob', $mimeType, $chunkData );
@@ -500,7 +508,8 @@ class ApiUploadTest extends ApiTestCaseUpload {
                        }
                        // Filekey set to chunk session
                        $params['filekey'] = $chunkSessionKey;
-                       // Update the offset ( always add chunkSize for subquent chunks should be in-sync with $result['upload']['offset'] )
+                       // Update the offset ( always add chunkSize for subquent chunks
+                       // should be in-sync with $result['upload']['offset'] )
                        $params['offset'] += $chunkSize;
                        // Make sure param offset is insync with resultOffset:
                        $this->assertEquals( $resultOffset, $params['offset'] );
@@ -528,7 +537,8 @@ class ApiUploadTest extends ApiTestCaseUpload {
                fclose( $handle );
 
                // Check that we got a valid file result:
-               wfDebug( __METHOD__ . " hohoh filesize {$fileSize} info {$result['upload']['imageinfo']['size']}\n\n" );
+               wfDebug( __METHOD__
+                       . " hohoh filesize {$fileSize} info {$result['upload']['imageinfo']['size']}\n\n" );
                $this->assertEquals( $fileSize, $result['upload']['imageinfo']['size'] );
                $this->assertEquals( $mimeType, $result['upload']['imageinfo']['mime'] );
                $this->assertTrue( isset( $result['upload']['filekey'] ) );
index a1fc2c2..38beb87 100644 (file)
@@ -14,8 +14,8 @@ class PrefixUniquenessTest extends MediaWikiTestCase {
                $prefixes = array();
 
                foreach ( $modules as $name => $class ) {
-                       /** @var ApiMain $module */
-                       $module = new $class( $main, $name );
+                       /** @var ApiQueryBase $module */
+                       $module = new $class( $query, $name );
                        $prefix = $module->getModulePrefix();
                        if ( isset( $prefixes[$prefix] ) ) {
                                $this->fail( "Module prefix '{$prefix}' is shared between {$class} and {$prefixes[$prefix]}" );
index 877e353..e3eea4c 100644 (file)
@@ -1,20 +1,23 @@
 <?php
-
 /**
  * RandomImageGenerator -- does what it says on the tin.
- * Requires Imagick, the ImageMagick library for PHP, or the command line equivalent (usually 'convert').
+ * Requires Imagick, the ImageMagick library for PHP, or the command line
+ * equivalent (usually 'convert').
  *
- * Because MediaWiki tests the uniqueness of media upload content, and filenames, it is sometimes useful to generate
- * files that are guaranteed (or at least very likely) to be unique in both those ways.
- * This generates a number of filenames with random names and random content (colored triangles)
+ * Because MediaWiki tests the uniqueness of media upload content, and
+ * filenames, it is sometimes useful to generate files that are guaranteed (or
+ * at least very likely) to be unique in both those ways. This generates a
+ * number of filenames with random names and random content (colored triangles).
  *
- * It is also useful to have fresh content because our tests currently run in a "destructive" mode, and don't create a fresh new wiki for each
- * test run.
- * Consequently, if we just had a few static files we kept re-uploading, we'd get lots of warnings about matching content or filenames,
- * and even if we deleted those files, we'd get warnings about archived files.
+ * It is also useful to have fresh content because our tests currently run in a
+ * "destructive" mode, and don't create a fresh new wiki for each test run.
+ * Consequently, if we just had a few static files we kept re-uploading, we'd
+ * get lots of warnings about matching content or filenames, and even if we
+ * deleted those files, we'd get warnings about archived files.
  *
- * This can also be used with a cronjob to generate random files all the time -- I use it to have a constant, never ending supply when I'm
- * testing interactively.
+ * This can also be used with a cronjob to generate random files all the time.
+ * I use it to have a constant, never ending supply when I'm testing
+ * interactively.
  *
  * @file
  * @author Neil Kandalgaonkar <neilk@wikimedia.org>
@@ -25,7 +28,6 @@
  * Can fetch a random image, or also write a number of them to disk with random filenames.
  */
 class RandomImageGenerator {
-
        private $dictionaryFile;
        private $minWidth = 400;
        private $maxWidth = 800;
@@ -34,10 +36,11 @@ class RandomImageGenerator {
        private $shapesToDraw = 5;
 
        /**
-        * Orientations: 0th row, 0th column, Exif orientation code, rotation 2x2 matrix that is opposite of orientation
-        * n.b. we do not handle the 'flipped' orientations, which is why there is no entry for 2, 4, 5, or 7. Those
-        * seem to be rare in real images anyway
-        * (we also would need a non-symmetric shape for the images to test those, like a letter F)
+        * Orientations: 0th row, 0th column, Exif orientation code, rotation 2x2
+        * matrix that is opposite of orientation. N.b. we do not handle the
+        * 'flipped' orientations, which is why there is no entry for 2, 4, 5, or 7.
+        * Those seem to be rare in real images anyway (we also would need a
+        * non-symmetric shape for the images to test those, like a letter F).
         */
        private static $orientations = array(
                array(
@@ -67,7 +70,9 @@ class RandomImageGenerator {
        );
 
        public function __construct( $options = array() ) {
-               foreach ( array( 'dictionaryFile', 'minWidth', 'minHeight', 'maxWidth', 'maxHeight', 'shapesToDraw' ) as $property ) {
+               foreach ( array( 'dictionaryFile', 'minWidth', 'minHeight',
+                       'maxWidth', 'maxHeight', 'shapesToDraw' ) as $property
+               ) {
                        if ( isset( $options[$property] ) ) {
                                $this->$property = $options[$property];
                        }
@@ -89,12 +94,14 @@ class RandomImageGenerator {
                        }
                }
                if ( !isset( $this->dictionaryFile ) ) {
-                       throw new Exception( "RandomImageGenerator: dictionary file not found or not specified properly" );
+                       throw new Exception( "RandomImageGenerator: dictionary file not "
+                               . "found or not specified properly" );
                }
        }
 
        /**
-        * Writes random images with random filenames to disk in the directory you specify, or current working directory
+        * Writes random images with random filenames to disk in the directory you
+        * specify, or current working directory.
         *
         * @param int $number Number of filenames to write
         * @param string $format Optional, must be understood by ImageMagick, such as 'jpg' or 'gif'
@@ -128,11 +135,15 @@ class RandomImageGenerator {
                        global $wgExiv2Command;
                        if ( class_exists( 'Imagick' ) && $wgExiv2Command && is_executable( $wgExiv2Command ) ) {
                                return 'writeImageWithApi';
-                       } elseif ( $wgUseImageMagick && $wgImageMagickConvertCommand && is_executable( $wgImageMagickConvertCommand ) ) {
+                       } elseif ( $wgUseImageMagick
+                               && $wgImageMagickConvertCommand
+                               && is_executable( $wgImageMagickConvertCommand )
+                       ) {
                                return 'writeImageWithCommandLine';
                        }
                }
-               throw new Exception( "RandomImageGenerator: could not find a suitable method to write images in '$format' format" );
+               throw new Exception( "RandomImageGenerator: could not find a suitable "
+                       . "method to write images in '$format' format" );
        }
 
        /**
@@ -163,9 +174,11 @@ class RandomImageGenerator {
 
        /**
         * Generate data representing an image of random size (within limits),
-        * consisting of randomly colored and sized upward pointing triangles against a random background color
-        * (This data is used in the writeImage* methods).
-        * @return {Mixed}
+        * consisting of randomly colored and sized upward pointing triangles
+        * against a random background color. (This data is used in the
+        * writeImage* methods).
+        *
+        * @return mixed
         */
        public function getImageSpec() {
                $spec = array();
@@ -264,8 +277,10 @@ class RandomImageGenerator {
 
                $image = new Imagick();
                /**
-                * If the format is 'jpg', will also add a random orientation -- the image will be drawn rotated with triangle points
-                * facing in some direction (0, 90, 180 or 270 degrees) and a countering rotation should turn the triangle points upward again
+                * If the format is 'jpg', will also add a random orientation -- the
+                * image will be drawn rotated with triangle points facing in some
+                * direction (0, 90, 180 or 270 degrees) and a countering rotation
+                * should turn the triangle points upward again.
                 */
                $orientation = self::$orientations[0]; // default is normal orientation
                if ( $format == 'jpg' ) {
@@ -289,8 +304,10 @@ class RandomImageGenerator {
 
                $image->writeImage( $filename );
 
-               // because the above setImageOrientation call doesn't work... nor can I get an external imagemagick binary to do this either...
-               // hacking this for now (only works if you have exiv2 installed, a program to read and manipulate exif)
+               // because the above setImageOrientation call doesn't work... nor can I
+               // get an external imagemagick binary to do this either... Hacking this
+               // for now (only works if you have exiv2 installed, a program to read
+               // and manipulate exif).
                if ( $wgExiv2Command ) {
                        $cmd = wfEscapeShellArg( $wgExiv2Command )
                                . " -M "
@@ -360,7 +377,8 @@ class RandomImageGenerator {
        }
 
        /**
-        * Based on an image specification, write such an image to disk, using the command line ImageMagick program ('convert').
+        * Based on an image specification, write such an image to disk, using the
+        * command line ImageMagick program ('convert').
         *
         * Sample command line:
         *  $ convert -size 100x60 xc:rgb(90,87,45) \
@@ -369,8 +387,8 @@ class RandomImageGenerator {
         *   -draw 'fill rgb(240,12,32)  circle 50,21 50,3'  filename.png
         *
         * @param array $spec Spec describing background and shapes to draw
-        * @param string $format File format to write (unused by this method but kept so it has the same signature as
-        * writeImageWithApi)
+        * @param string $format File format to write (unused by this method but
+        *   kept so it has the same signature as writeImageWithApi).
         * @param string $filename Filename to write to
         *
         * @return bool
@@ -410,7 +428,8 @@ class RandomImageGenerator {
        }
 
        /**
-        * Get an array of random pairs of random words, like array( array( 'foo', 'bar' ), array( 'quux', 'baz' ) );
+        * Get an array of random pairs of random words, like
+        * array( array( 'foo', 'bar' ), array( 'quux', 'baz' ) );
         *
         * @param int $number Number of pairs
         * @return array two-element arrays
@@ -447,8 +466,9 @@ class RandomImageGenerator {
                }
 
                /*
-                * This algorithm obtains N random lines from a file in one single pass. It does this by replacing elements of
-                * a fixed-size array of lines, less and less frequently as it reads the file.
+                * This algorithm obtains N random lines from a file in one single pass.
+                * It does this by replacing elements of a fixed-size array of lines,
+                * less and less frequently as it reads the file.
                 */
                $fh = fopen( $filepath, "r" );
                if ( !$fh ) {
index f1b773a..d8765ee 100644 (file)
@@ -173,7 +173,11 @@ abstract class ApiQueryContinueTestBase extends ApiQueryTestBase {
         * @param bool $numericIds If true, treat keys as ids to be merged instead of appending
         */
        protected function mergeResult( &$results, $newResult, $numericIds = false ) {
-               $this->assertEquals( is_array( $results ), is_array( $newResult ), 'Type of result and data do not match' );
+               $this->assertEquals(
+                       is_array( $results ),
+                       is_array( $newResult ),
+                       'Type of result and data do not match'
+               );
                if ( !is_array( $results ) ) {
                        $this->assertEquals( $results, $newResult, 'Repeated result must be the same as before' );
                } else {
index 49feec1..d47cafe 100644 (file)
@@ -359,7 +359,6 @@ class RCCacheEntryFactoryTest extends MediaWikiLangTestCase {
                        'rc_title' => $title,
                        'rc_namespace' => 0,
                        'rc_timestamp' => $timestamp,
-                       'rc_cur_time' => $timestamp,
                        'rc_old_len' => 212,
                        'rc_new_len' => 188,
                        'rc_comment' => '',
index 59b8d20..3f887dc 100644 (file)
@@ -59,7 +59,9 @@ class ComposerVersionNormalizerTest extends PHPUnit_Framework_TestCase {
        /**
         * @dataProvider complexVersionProvider
         */
-       public function testGivenComplexVersionWithoutDash_normalizeSuffixAddsDash( $withoutDash, $withDash ) {
+       public function testGivenComplexVersionWithoutDash_normalizeSuffixAddsDash(
+               $withoutDash, $withDash
+       ) {
                $normalizer = new ComposerVersionNormalizer();
 
                $this->assertEquals(
@@ -83,7 +85,9 @@ class ComposerVersionNormalizerTest extends PHPUnit_Framework_TestCase {
        /**
         * @dataProvider complexVersionProvider
         */
-       public function testGivenComplexVersionWithDash_normalizeSuffixReturnsAsIs( $withoutDash, $withDash ) {
+       public function testGivenComplexVersionWithDash_normalizeSuffixReturnsAsIs(
+               $withoutDash, $withDash
+       ) {
                $this->assertRemainsUnchanged( $withDash );
        }
 
@@ -114,7 +118,9 @@ class ComposerVersionNormalizerTest extends PHPUnit_Framework_TestCase {
        /**
         * @dataProvider levelNormalizationProvider
         */
-       public function testGivenFewerLevels_levelCountNormalizationEnsuresFourLevels( $expected, $version ) {
+       public function testGivenFewerLevels_levelCountNormalizationEnsuresFourLevels(
+               $expected, $version
+       ) {
                $normalizer = new ComposerVersionNormalizer();
 
                $this->assertEquals(
diff --git a/tests/phpunit/includes/config/ConfigFactoryTest.php b/tests/phpunit/includes/config/ConfigFactoryTest.php
new file mode 100644 (file)
index 0000000..0a6bf72
--- /dev/null
@@ -0,0 +1,46 @@
+<?php
+
+class ConfigFactoryTest extends MediaWikiTestCase {
+
+       /**
+        * @covers ConfigFactory::register
+        */
+       public function testRegister() {
+               $factory = new ConfigFactory();
+               $factory->register( 'unittest', 'GlobalVarConfig::newInstance' );
+               $this->assertTrue( True ); // No exception thrown
+               $this->setExpectedException( 'InvalidArgumentException' );
+               $factory->register( 'invalid', 'Invalid callback' );
+       }
+
+       /**
+        * @covers ConfigFactory::makeConfig
+        */
+       public function testMakeConfig() {
+               $factory = new ConfigFactory();
+               $factory->register( 'unittest', 'GlobalVarConfig::newInstance' );
+               $conf = $factory->makeConfig( 'unittest' );
+               $this->assertInstanceOf( 'Config', $conf );
+       }
+
+       /**
+        * @covers ConfigFactory::makeConfig
+        */
+       public function testMakeConfigWithNoBuilders() {
+               $factory = new ConfigFactory();
+               $this->setExpectedException( 'ConfigException' );
+               $factory->makeConfig( 'nobuilderregistered' );
+       }
+
+       /**
+        * @covers ConfigFactory::makeConfig
+        */
+       public function testMakeConfigWithInvalidCallback() {
+               $factory = new ConfigFactory();
+               $factory->register( 'unittest', function() {
+                       return true; // Not a Config object
+               });
+               $this->setExpectedException( 'UnexpectedValueException' );
+               $factory->makeConfig( 'unittest' );
+       }
+}
diff --git a/tests/phpunit/includes/config/GlobalConfigTest.php b/tests/phpunit/includes/config/GlobalConfigTest.php
deleted file mode 100644 (file)
index b605a46..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-<?php
-
-class GlobalConfigTest extends MediaWikiTestCase {
-
-       /** @var GlobalConfig $config */
-       protected $config;
-
-       protected function setUp() {
-               parent::setUp();
-               $this->config = new GlobalConfig;
-       }
-
-       public static function provideGet() {
-               return array(
-                       array( 'wgSitename', array( 'Sitename' ) ),
-                       array( 'wgFoo', array( 'Foo' ) ),
-                       array( 'efVariable', array( 'Variable', 'ef' ) ),
-                       array( 'Foo', array( 'Foo', '' ) ),
-               );
-       }
-
-       /**
-        * @param string $name
-        * @param array $params
-        * @dataProvider provideGet
-        * @covers GlobalConfig::get
-        */
-       public function testGet( $name, $params ) {
-               $rand = wfRandom();
-               $old = isset( $GLOBALS[$name] ) ? $GLOBALS[$name] : null;
-               $GLOBALS[$name] = $rand;
-               $out = call_user_func_array( array( $this->config, 'get' ), $params );
-               $this->assertEquals( $rand, $out );
-               if ( $old ) {
-                       $GLOBALS[$name] = $old;
-               }
-       }
-}
diff --git a/tests/phpunit/includes/config/GlobalVarConfigTest.php b/tests/phpunit/includes/config/GlobalVarConfigTest.php
new file mode 100644 (file)
index 0000000..7080b02
--- /dev/null
@@ -0,0 +1,36 @@
+<?php
+
+class GlobalVarConfigTest extends MediaWikiTestCase {
+
+       public function provideGet() {
+               $set = array(
+                       'wgSomething' => 'default1',
+                       'wgFoo' => 'default2',
+                       'efVariable' => 'default3',
+                       'BAR' => 'default4',
+               );
+
+               foreach ( $set as $var => $value ) {
+                       $GLOBALS[$var] = $value;
+               }
+
+               return array(
+                       array( 'Something', 'wg', 'default1' ),
+                       array( 'Foo', 'wg', 'default2' ),
+                       array( 'Variable', 'ef', 'default3' ),
+                       array( 'BAR', '', 'default4' ),
+               );
+       }
+
+       /**
+        * @param string $name
+        * @param string $prefix
+        * @param string $expected
+        * @dataProvider provideGet
+        * @covers GlobalVarConfig::get
+        */
+       public function testGet( $name, $prefix, $expected ) {
+               $config = new GlobalVarConfig( $prefix );
+               $this->assertEquals( $config->get( $name ), $expected );
+       }
+}
index f21aad8..2add9f2 100644 (file)
@@ -4,9 +4,9 @@
  * @group ContentHandler
  * @group Database
  *
- * @note Declare that we are using the database, because otherwise we'll fail in the "databaseless" test run.
- * This is because the LinkHolderArray used by the parser needs database access.
- *
+ * @note Declare that we are using the database, because otherwise we'll fail in
+ * the "databaseless" test run. This is because the LinkHolderArray used by the
+ * parser needs database access.
  */
 class ContentHandlerTest extends MediaWikiTestCase {
 
@@ -238,13 +238,45 @@ class ContentHandlerTest extends MediaWikiTestCase {
                        array( 'hallo', 'MediaWiki:Test.js', null, null, CONTENT_MODEL_JAVASCRIPT, 'hallo', false ),
                        array( serialize( 'hallo' ), 'Dummy:Test', null, null, "testing", 'hallo', false ),
 
-                       array( 'hallo', 'Help:Test', null, CONTENT_FORMAT_WIKITEXT, CONTENT_MODEL_WIKITEXT, 'hallo', false ),
-                       array( 'hallo', 'MediaWiki:Test.js', null, CONTENT_FORMAT_JAVASCRIPT, CONTENT_MODEL_JAVASCRIPT, 'hallo', false ),
+                       array(
+                               'hallo',
+                               'Help:Test',
+                               null,
+                               CONTENT_FORMAT_WIKITEXT,
+                               CONTENT_MODEL_WIKITEXT,
+                               'hallo',
+                               false
+                       ),
+                       array(
+                               'hallo',
+                               'MediaWiki:Test.js',
+                               null,
+                               CONTENT_FORMAT_JAVASCRIPT,
+                               CONTENT_MODEL_JAVASCRIPT,
+                               'hallo',
+                               false
+                       ),
                        array( serialize( 'hallo' ), 'Dummy:Test', null, "testing", "testing", 'hallo', false ),
 
                        array( 'hallo', 'Help:Test', CONTENT_MODEL_CSS, null, CONTENT_MODEL_CSS, 'hallo', false ),
-                       array( 'hallo', 'MediaWiki:Test.js', CONTENT_MODEL_CSS, null, CONTENT_MODEL_CSS, 'hallo', false ),
-                       array( serialize( 'hallo' ), 'Dummy:Test', CONTENT_MODEL_CSS, null, CONTENT_MODEL_CSS, serialize( 'hallo' ), false ),
+                       array(
+                               'hallo',
+                               'MediaWiki:Test.js',
+                               CONTENT_MODEL_CSS,
+                               null,
+                               CONTENT_MODEL_CSS,
+                               'hallo',
+                               false
+                       ),
+                       array(
+                               serialize( 'hallo' ),
+                               'Dummy:Test',
+                               CONTENT_MODEL_CSS,
+                               null,
+                               CONTENT_MODEL_CSS,
+                               serialize( 'hallo' ),
+                               false
+                       ),
 
                        array( 'hallo', 'Help:Test', CONTENT_MODEL_WIKITEXT, "testing", null, null, true ),
                        array( 'hallo', 'MediaWiki:Test.js', CONTENT_MODEL_CSS, "testing", null, null, true ),
@@ -256,7 +288,9 @@ class ContentHandlerTest extends MediaWikiTestCase {
         * @dataProvider dataMakeContent
         * @covers ContentHandler::makeContent
         */
-       public function testMakeContent( $data, $title, $modelId, $format, $expectedModelId, $expectedNativeData, $shouldFail ) {
+       public function testMakeContent( $data, $title, $modelId, $format,
+               $expectedModelId, $expectedNativeData, $shouldFail
+       ) {
                $title = Title::newFromText( $title );
 
                try {
@@ -291,7 +325,11 @@ class ContentHandlerTest extends MediaWikiTestCase {
                Hooks::register( 'testRunLegacyHooks', __CLASS__ . '::dummyHookHandler' );
 
                $content = new WikitextContent( 'test text' );
-               $ok = ContentHandler::runLegacyHooks( 'testRunLegacyHooks', array( 'foo', &$content, 'bar' ), false );
+               $ok = ContentHandler::runLegacyHooks(
+                       'testRunLegacyHooks',
+                       array( 'foo', &$content, 'bar' ),
+                       false
+               );
 
                $this->assertTrue( $ok, "runLegacyHooks should have returned true" );
                $this->assertEquals( "TEST TEXT", $content->getNativeData() );
@@ -362,8 +400,9 @@ class DummyContentForTesting extends AbstractContent {
        }
 
        /**
-        * @return string A string representing the content in a way useful for building a full text search index.
-        *   If no useful representation exists, this method returns an empty string.
+        * @return string A string representing the content in a way useful for
+        *   building a full text search index. If no useful representation exists,
+        *   this method returns an empty string.
         */
        public function getTextForSearchIndex() {
                return '';
@@ -378,7 +417,8 @@ class DummyContentForTesting extends AbstractContent {
        }
 
        /**
-        * Returns a textual representation of the content suitable for use in edit summaries and log messages.
+        * Returns a textual representation of the content suitable for use in edit
+        * summaries and log messages.
         *
         * @param int $maxlength Maximum length of the summary text.
         * @return string The summary text.
@@ -429,8 +469,8 @@ class DummyContentForTesting extends AbstractContent {
         * Returns true if this content is countable as a "real" wiki page, provided
         * that it's also in a countable location (e.g. a current revision in the main namespace).
         *
-        * @param bool $hasLinks if it is known whether this content contains links, provide this information here,
-        *  to avoid redundant parsing to find out.
+        * @param bool $hasLinks if it is known whether this content contains links,
+        * provide this information here, to avoid redundant parsing to find out.
         * @return bool
         */
        public function isCountable( $hasLinks = null ) {
@@ -446,7 +486,23 @@ class DummyContentForTesting extends AbstractContent {
         *
         * @return ParserOutput
         */
-       public function getParserOutput( Title $title, $revId = null, ParserOptions $options = null, $generateHtml = true ) {
+       public function getParserOutput( Title $title, $revId = null,
+               ParserOptions $options = null, $generateHtml = true
+       ) {
                return new ParserOutput( $this->getNativeData() );
        }
+
+       /**
+        * @see AbstractContent::fillParserOutput()
+        *
+        * @param Title $title Context title for parsing
+        * @param int|null $revId Revision ID (for {{REVISIONID}})
+        * @param ParserOptions|null $options Parser options
+        * @param bool $generateHtml Whether or not to generate HTML
+        * @param ParserOutput &$output The output object to fill (reference).
+        */
+       protected function fillParserOutput( Title $title, $revId,
+                       ParserOptions $options, $generateHtml, ParserOutput &$output ) {
+               $output = new ParserOutput( $this->getNativeData() );
+       }
 }
index bd6d41f..40484d3 100644 (file)
@@ -5,7 +5,7 @@
  * @group Database
  *        ^--- needed, because we do need the database to test link updates
  */
-class CssContentTest extends MediaWikiTestCase {
+class CssContentTest extends JavaScriptContentTest {
 
        protected function setUp() {
                parent::setUp();
index c8616ff..7193ec9 100644 (file)
@@ -243,7 +243,10 @@ class JavaScriptContentTest extends TextContentTest {
                $mw = MagicWord::get( "staticredirect" );
 
                $content = $this->newContent( "#REDIRECT [[FOO]]\n__STATICREDIRECT__" );
-               $this->assertFalse( $content->matchMagicWord( $mw ), "should not have matched magic word, since it's not wikitext" );
+               $this->assertFalse(
+                       $content->matchMagicWord( $mw ),
+                       "should not have matched magic word, since it's not wikitext"
+               );
        }
 
        /**
@@ -255,7 +258,10 @@ class JavaScriptContentTest extends TextContentTest {
                $content = $this->newContent( "#REDIRECT [[Someplace]]" );
                $newContent = $content->updateRedirect( $target );
 
-               $this->assertTrue( $content->equals( $newContent ), "content should be unchanged since it's not wikitext" );
+               $this->assertTrue(
+                       $content->equals( $newContent ),
+                       "content should be unchanged since it's not wikitext"
+               );
        }
 
        /**
index a1f099f..03cbbc0 100644 (file)
@@ -7,14 +7,21 @@
  */
 class TextContentTest extends MediaWikiLangTestCase {
        protected $context;
+       protected $savedContentGetParserOutput;
 
        protected function setUp() {
+               global $wgHooks;
+
                parent::setUp();
 
                // Anon user
                $user = new User();
                $user->setName( '127.0.0.1' );
 
+               $this->context = new RequestContext( new FauxRequest() );
+               $this->context->setTitle( Title::newFromText( 'Test' ) );
+               $this->context->setUser( $user );
+
                $this->setMwGlobals( array(
                        'wgUser' => $user,
                        'wgTextModelsToParse' => array(
@@ -26,9 +33,22 @@ class TextContentTest extends MediaWikiLangTestCase {
                        'wgAlwaysUseTidy' => false,
                ) );
 
-               $this->context = new RequestContext( new FauxRequest() );
-               $this->context->setTitle( Title::newFromText( 'Test' ) );
-               $this->context->setUser( $user );
+               // bypass hooks that force custom rendering
+               if ( isset( $wgHooks['ContentGetParserOutput'] )  ) {
+                       $this->savedContentGetParserOutput = $wgHooks['ContentGetParserOutput'];
+                       unset( $wgHooks['ContentGetParserOutput'] );
+               }
+       }
+
+       public function teardown() {
+               global $wgHooks;
+
+               // restore hooks that force custom rendering
+               if ( $this->savedContentGetParserOutput !== null ) {
+                       $wgHooks['ContentGetParserOutput'] = $this->savedContentGetParserOutput;
+               }
+
+               parent::teardown();
        }
 
        public function newContent( $text ) {
@@ -53,7 +73,9 @@ class TextContentTest extends MediaWikiLangTestCase {
         * @dataProvider dataGetParserOutput
         * @covers TextContent::getParserOutput
         */
-       public function testGetParserOutput( $title, $model, $text, $expectedHtml, $expectedFields = null ) {
+       public function testGetParserOutput( $title, $model, $text, $expectedHtml,
+               $expectedFields = null
+       ) {
                $title = Title::newFromText( $title );
                $content = ContentHandler::makeContent( $text, $title, $model );
 
@@ -105,7 +127,11 @@ class TextContentTest extends MediaWikiLangTestCase {
                $options = ParserOptions::newFromUserAndLang( $this->context->getUser(), $wgContLang );
 
                $content = $this->newContent( $text );
-               $content = $content->preSaveTransform( $this->context->getTitle(), $this->context->getUser(), $options );
+               $content = $content->preSaveTransform(
+                       $this->context->getTitle(),
+                       $this->context->getUser(),
+                       $options
+               );
 
                $this->assertEquals( $expected, $content->getNativeData() );
        }
@@ -223,8 +249,13 @@ class TextContentTest extends MediaWikiLangTestCase {
 
                $v = $content->isCountable( $hasLinks, $this->context->getTitle() );
 
-               $this->assertEquals( $expected, $v, 'isCountable() returned unexpected value ' . var_export( $v, true )
-                       . ' instead of ' . var_export( $expected, true ) . " in mode `$mode` for text \"$text\"" );
+               $this->assertEquals(
+                       $expected,
+                       $v,
+                       'isCountable() returned unexpected value ' . var_export( $v, true )
+                               . ' instead of ' . var_export( $expected, true )
+                               . " in mode `$mode` for text \"$text\""
+               );
        }
 
        public static function dataGetTextForSummary() {
index 73b975b..38fb573 100644 (file)
@@ -4,11 +4,10 @@
  * @group ContentHandler
  */
 class WikitextContentHandlerTest extends MediaWikiLangTestCase {
-
        /**
         * @var ContentHandler
         */
-       var $handler;
+       private $handler;
 
        protected function setUp() {
                parent::setUp();
@@ -23,7 +22,10 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
                $content = new WikitextContent( 'hello world' );
 
                $this->assertEquals( 'hello world', $this->handler->serializeContent( $content ) );
-               $this->assertEquals( 'hello world', $this->handler->serializeContent( $content, CONTENT_FORMAT_WIKITEXT ) );
+               $this->assertEquals(
+                       'hello world',
+                       $this->handler->serializeContent( $content, CONTENT_FORMAT_WIKITEXT )
+               );
 
                try {
                        $this->handler->serializeContent( $content, 'dummy/foo' );
@@ -98,7 +100,10 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
                        array( 'Category:Foo', '#REDIRECT [[:Category:Foo]]' ),
                        array( Title::makeTitle( NS_MAIN, 'en:Foo' ), '#REDIRECT [[en:Foo]]' ),
                        array( Title::makeTitle( NS_MAIN, 'Foo', '', 'en' ), '#REDIRECT [[:en:Foo]]' ),
-                       array( Title::makeTitle( NS_MAIN, 'Bar', 'fragment', 'google' ), '#REDIRECT [[google:Bar#fragment]]' ),
+                       array(
+                               Title::makeTitle( NS_MAIN, 'Bar', 'fragment', 'google' ),
+                               '#REDIRECT [[google:Bar#fragment]]'
+                       ),
                );
        }
 
@@ -183,9 +188,10 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
                        ),
 
                        array(
-                               'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut
-                               labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et
-                               ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.',
+                               'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
+                               eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam
+                               voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet
+                               clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.',
                                'Hello world!',
                                0,
                                '/^Replaced .*Hello/'
@@ -210,7 +216,10 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
 
                $summary = $this->handler->getAutosummary( $oldContent, $newContent, $flags );
 
-               $this->assertTrue( (bool)preg_match( $expected, $summary ), "Autosummary didn't match expected pattern $expected: $summary" );
+               $this->assertTrue(
+                       (bool)preg_match( $expected, $summary ),
+                       "Autosummary didn't match expected pattern $expected: $summary"
+               );
        }
 
        /**
@@ -224,6 +233,9 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
         * @todo Text case requires database, should be done by a test class in the Database group
         */
        /*
-       public function testGetUndoContent( Revision $current, Revision $undo, Revision $undoafter = null ) {}
+       public function testGetUndoContent( Revision $current, Revision $undo,
+               Revision $undoafter = null
+       ) {
+       }
        */
 }
index 1d133f3..bd4ae35 100644 (file)
@@ -7,7 +7,7 @@
  *        ^--- needed, because we do need the database to test link updates
  */
 class WikitextContentTest extends TextContentTest {
-       static $sections = "Intro
+       public static $sections = "Intro
 
 == stuff ==
 hello world
@@ -150,7 +150,10 @@ just a test"
                                "2",
                                "== TEST ==\nmore fun",
                                null,
-                               trim( preg_replace( '/^== test ==.*== foo ==/sm', "== TEST ==\nmore fun\n\n== foo ==", WikitextContentTest::$sections ) )
+                               trim( preg_replace(
+                                       '/^== test ==.*== foo ==/sm', "== TEST ==\nmore fun\n\n== foo ==",
+                                       WikitextContentTest::$sections
+                               ) )
                        ),
                        array( WikitextContentTest::$sections,
                                "8",
index 516ce3a..55e48d1 100644 (file)
  */
 class FakeDatabaseMysqlBase extends DatabaseMysqlBase {
        // From DatabaseBase
-       function __construct() {}
-       protected function closeConnection() {}
-       protected function doQuery( $sql ) {}
+       function __construct() {
+       }
+
+       protected function closeConnection() {
+       }
+
+       protected function doQuery( $sql ) {
+       }
 
        // From DatabaseMysql
-       protected function mysqlConnect( $realServer ) {}
-       protected function mysqlSetCharset( $charset ) {}
-       protected function mysqlFreeResult( $res ) {}
-       protected function mysqlFetchObject( $res ) {}
-       protected function mysqlFetchArray( $res ) {}
-       protected function mysqlNumRows( $res ) {}
-       protected function mysqlNumFields( $res ) {}
-       protected function mysqlFieldName( $res, $n ) {}
-       protected function mysqlFieldType( $res, $n ) {}
-       protected function mysqlDataSeek( $res, $row ) {}
-       protected function mysqlError( $conn = null ) {}
-       protected function mysqlFetchField( $res, $n ) {}
-       protected function mysqlPing() {}
+       protected function mysqlConnect( $realServer ) {
+       }
+
+       protected function mysqlSetCharset( $charset ) {
+       }
+
+       protected function mysqlFreeResult( $res ) {
+       }
+
+       protected function mysqlFetchObject( $res ) {
+       }
+
+       protected function mysqlFetchArray( $res ) {
+       }
+
+       protected function mysqlNumRows( $res ) {
+       }
+
+       protected function mysqlNumFields( $res ) {
+       }
+
+       protected function mysqlFieldName( $res, $n ) {
+       }
+
+       protected function mysqlFieldType( $res, $n ) {
+       }
+
+       protected function mysqlDataSeek( $res, $row ) {
+       }
+
+       protected function mysqlError( $conn = null ) {
+       }
+
+       protected function mysqlFetchField( $res, $n ) {
+       }
+
+       protected function mysqlPing() {
+       }
 
        // From interface DatabaseType
-       function insertId() {}
-       function lastErrno() {}
-       function affectedRows() {}
-       function getServerVersion() {}
+       function insertId() {
+       }
+
+       function lastErrno() {
+       }
+
+       function affectedRows() {
+       }
+
+       function getServerVersion() {
+       }
 }
 
 class DatabaseMysqlBaseTest extends MediaWikiTestCase {
-
        /**
         * @dataProvider provideDiapers
         * @covers DatabaseMysqlBase::addIdentifierQuotes
index bdd567e..5c2d4b7 100644 (file)
@@ -101,7 +101,11 @@ class DatabaseSQLTest extends MediaWikiTestCase {
                                        'tables' => array( 'table', 't2' => 'table2' ),
                                        'fields' => array( 'tid', 'field', 'alias' => 'field2', 't2.id' ),
                                        'conds' => array( 'alias' => 'text' ),
-                                       'options' => array( 'LIMIT' => 1, 'GROUP BY' => array( 'field', 'field2' ), 'HAVING' => array( 'COUNT(*) > 1', 'field' => 1 ) ),
+                                       'options' => array(
+                                               'LIMIT' => 1,
+                                               'GROUP BY' => array( 'field', 'field2' ),
+                                               'HAVING' => array( 'COUNT(*) > 1', 'field' => 1 )
+                                       ),
                                        'join_conds' => array( 't2' => array(
                                                'LEFT JOIN', 'tid = t2.id'
                                        ) ),
index 65726eb..88bf7d9 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 
 class MockDatabaseSqlite extends DatabaseSqliteStandalone {
-       var $lastQuery;
+       private $lastQuery;
 
        function __construct() {
                parent::__construct( ':memory:' );
@@ -27,11 +27,8 @@ class MockDatabaseSqlite extends DatabaseSqliteStandalone {
  * @group medium
  */
 class DatabaseSqliteTest extends MediaWikiTestCase {
-
-       /**
-        * @var MockDatabaseSqlite
-        */
-       var $db;
+       /** @var MockDatabaseSqlite */
+       protected $db;
 
        protected function setUp() {
                parent::setUp();
@@ -74,7 +71,8 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
                        array( // #2: including quote
                                'foo\'bar', "'foo''bar'"
                        ),
-                       array( // #3: including \0 (must be represented as hex, per https://bugs.php.net/bug.php?id=63419)
+                       // #3: including \0 (must be represented as hex, per https://bugs.php.net/bug.php?id=63419)
+                       array(
                                "x\0y",
                                "x'780079'",
                        ),
@@ -116,14 +114,21 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
        public function testReplaceVars() {
                $this->assertEquals( 'foo', $this->replaceVars( 'foo' ), "Don't break anything accidentally" );
 
-               $this->assertEquals( "CREATE TABLE /**/foo (foo_key INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, "
+               $this->assertEquals(
+                       "CREATE TABLE /**/foo (foo_key INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, "
                                . "foo_bar TEXT, foo_name TEXT NOT NULL DEFAULT '', foo_int INTEGER, foo_int2 INTEGER );",
-                       $this->replaceVars( "CREATE TABLE /**/foo (foo_key int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
-                       foo_bar char(13), foo_name varchar(255) binary NOT NULL DEFAULT '', foo_int tinyint ( 8 ), foo_int2 int(16) ) ENGINE=MyISAM;" )
+                       $this->replaceVars(
+                               "CREATE TABLE /**/foo (foo_key int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT, "
+                               . "foo_bar char(13), foo_name varchar(255) binary NOT NULL DEFAULT '', "
+                               . "foo_int tinyint ( 8 ), foo_int2 int(16) ) ENGINE=MyISAM;"
+                       )
                );
 
-               $this->assertEquals( "CREATE TABLE foo ( foo1 REAL, foo2 REAL, foo3 REAL );",
-                       $this->replaceVars( "CREATE TABLE foo ( foo1 FLOAT, foo2 DOUBLE( 1,10), foo3 DOUBLE PRECISION );" )
+               $this->assertEquals(
+                       "CREATE TABLE foo ( foo1 REAL, foo2 REAL, foo3 REAL );",
+                       $this->replaceVars(
+                               "CREATE TABLE foo ( foo1 FLOAT, foo2 DOUBLE( 1,10), foo3 DOUBLE PRECISION );"
+                       )
                );
 
                $this->assertEquals( "CREATE TABLE foo ( foo_binary1 BLOB, foo_binary2 BLOB );",
@@ -426,4 +431,22 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
                $row = $res->fetchRow();
                $this->assertFalse( (bool)$row['a'] );
        }
+
+       /**
+        * @covers DatabaseSqlite::numFields
+        */
+       public function testNumFields() {
+               $db = new DatabaseSqliteStandalone( ':memory:' );
+
+               $databaseCreation = $db->query( 'CREATE TABLE a ( a_1 )', __METHOD__ );
+               $this->assertInstanceOf( 'ResultWrapper', $databaseCreation, "Failed to create table a" );
+               $res = $db->select( 'a' , '*');
+               $this->assertEquals( 0,  $db->numFields($res), "expects to get 0 fields for an empty table" );
+               $insertion = $db->insert( 'a', array( 'a_1' => 10 ), __METHOD__ );
+               $this->assertTrue( $insertion, "Insertion failed" );
+               $res = $db->select( 'a' , '*');
+               $this->assertEquals( 1,  $db->numFields($res), "wrong number of fields" );
+
+               $this->assertTrue( $db->close(), "closing database" );
+       }
 }
index 35a8e4c..7e70439 100644 (file)
@@ -8,8 +8,9 @@ class DatabaseTest extends MediaWikiTestCase {
        /**
         * @var DatabaseBase
         */
-       var $db;
-       var $functionTest = false;
+       protected $db;
+
+       private $functionTest = false;
 
        protected function setUp() {
                parent::setUp();
@@ -215,7 +216,9 @@ class DatabaseTest extends MediaWikiTestCase {
                global $IP;
                $this->dropFunctions();
                $this->functionTest = true;
-               $this->assertTrue( $this->db->sourceFile( "$IP/tests/phpunit/data/db/{$this->db->getType()}/functions.sql" ) );
+               $this->assertTrue(
+                       $this->db->sourceFile( "$IP/tests/phpunit/data/db/{$this->db->getType()}/functions.sql" )
+               );
                $res = $this->db->query( 'SELECT mw_test_function() AS test', __METHOD__ );
                $this->assertEquals( 42, $res->fetchObject()->test );
        }
index 790f273..39c311f 100644 (file)
@@ -156,6 +156,10 @@ class DatabaseTestHelper extends DatabaseBase {
                return 'test';
        }
 
+       function isOpen() {
+               return true;
+       }
+
        protected function closeConnection() {
                return false;
        }
index 351908b..e914c72 100644 (file)
@@ -93,13 +93,32 @@ class ArrayDiffFormatterTest extends MediaWikiTestCase {
                );
                $otherTestCases[] = array(
                        $this->getMockDiff( array( $this->getMockDiffOp( 'change', array( 'd1' ), array( 'a1' ) ) ) ),
-                       array( array( 'action' => 'change', 'old' => 'd1', 'new' => 'mockLine', 'newline' => 1, 'oldline' => 1 ) ),
+                       array( array(
+                               'action' => 'change',
+                               'old' => 'd1',
+                               'new' => 'mockLine',
+                               'newline' => 1, 'oldline' => 1
+                       ) ),
                );
                $otherTestCases[] = array(
-                       $this->getMockDiff( array( $this->getMockDiffOp( 'change', array( 'd1', 'd2' ), array( 'a1', 'a2' ) ) ) ),
+                       $this->getMockDiff( array( $this->getMockDiffOp(
+                               'change',
+                               array( 'd1', 'd2' ),
+                               array( 'a1', 'a2' )
+                       ) ) ),
                        array(
-                               array( 'action' => 'change', 'old' => 'd1', 'new' => 'mockLine', 'newline' => 1, 'oldline' => 1 ),
-                               array( 'action' => 'change', 'old' => 'd2', 'new' => 'mockLine', 'newline' => 2, 'oldline' => 2 ),
+                               array(
+                                       'action' => 'change',
+                                       'old' => 'd1',
+                                       'new' => 'mockLine',
+                                       'newline' => 1, 'oldline' => 1
+                               ),
+                               array(
+                                       'action' => 'change',
+                                       'old' => 'd2',
+                                       'new' => 'mockLine',
+                                       'newline' => 2, 'oldline' => 2
+                               ),
                        ),
                );
 
index 1220270..a7bfbfe 100644 (file)
@@ -156,7 +156,10 @@ class FileBackendTest extends MediaWikiTestCase {
                        array( 'mwstore://backend/container/path', 'mwstore://backend/container/path' ),
                        array( 'mwstore://backend/container//path', 'mwstore://backend/container/path' ),
                        array( 'mwstore://backend/container///path', 'mwstore://backend/container/path' ),
-                       array( 'mwstore://backend/container///path//to///obj', 'mwstore://backend/container/path/to/obj' ),
+                       array(
+                               'mwstore://backend/container///path//to///obj',
+                               'mwstore://backend/container/path/to/obj'
+                       ),
                        array( 'mwstore://', null ),
                        array( 'mwstore://backend', null ),
                        array( 'mwstore://backend//container/path', null ),
@@ -1234,11 +1237,23 @@ class FileBackendTest extends MediaWikiTestCase {
                        $contents = $this->backend->getFileContentsMulti( array( 'srcs' => $source ) );
                        foreach ( $contents as $path => $data ) {
                                $this->assertNotEquals( false, $data, "Contents of $path exists ($backendName)." );
-                               $this->assertEquals( current( $content ), $data, "Contents of $path is correct ($backendName)." );
+                               $this->assertEquals(
+                                       current( $content ),
+                                       $data,
+                                       "Contents of $path is correct ($backendName)."
+                               );
                                next( $content );
                        }
-                       $this->assertEquals( $source, array_keys( $contents ), "Contents in right order ($backendName)." );
-                       $this->assertEquals( count( $source ), count( $contents ), "Contents array size correct ($backendName)." );
+                       $this->assertEquals(
+                               $source,
+                               array_keys( $contents ),
+                               "Contents in right order ($backendName)."
+                       );
+                       $this->assertEquals(
+                               count( $source ),
+                               count( $contents ),
+                               "Contents array size correct ($backendName)."
+                       );
                } else {
                        $data = $this->backend->getFileContents( array( 'src' => $source ) );
                        $this->assertNotEquals( false, $data, "Contents of $source exists ($backendName)." );
@@ -1297,18 +1312,34 @@ class FileBackendTest extends MediaWikiTestCase {
                                        "Creation of local copy of $path succeeded ($backendName)." );
                                $contents = file_get_contents( $tmpFile->getPath() );
                                $this->assertNotEquals( false, $contents, "Local copy of $path exists ($backendName)." );
-                               $this->assertEquals( current( $content ), $contents, "Local copy of $path is correct ($backendName)." );
+                               $this->assertEquals(
+                                       current( $content ),
+                                       $contents,
+                                       "Local copy of $path is correct ($backendName)."
+                               );
                                next( $content );
                        }
-                       $this->assertEquals( $source, array_keys( $tmpFiles ), "Local copies in right order ($backendName)." );
-                       $this->assertEquals( count( $source ), count( $tmpFiles ), "Local copies array size correct ($backendName)." );
+                       $this->assertEquals(
+                               $source,
+                               array_keys( $tmpFiles ),
+                               "Local copies in right order ($backendName)."
+                       );
+                       $this->assertEquals(
+                               count( $source ),
+                               count( $tmpFiles ),
+                               "Local copies array size correct ($backendName)."
+                       );
                } else {
                        $tmpFile = $this->backend->getLocalCopy( array( 'src' => $source ) );
                        $this->assertNotNull( $tmpFile,
                                "Creation of local copy of $source succeeded ($backendName)." );
                        $contents = file_get_contents( $tmpFile->getPath() );
                        $this->assertNotEquals( false, $contents, "Local copy of $source exists ($backendName)." );
-                       $this->assertEquals( $content[0], $contents, "Local copy of $source is correct ($backendName)." );
+                       $this->assertEquals(
+                               $content[0],
+                               $contents,
+                               "Local copy of $source is correct ($backendName)."
+                       );
                }
 
                $obj = new stdClass();
@@ -1367,11 +1398,23 @@ class FileBackendTest extends MediaWikiTestCase {
                                        "Creation of local copy of $path succeeded ($backendName)." );
                                $contents = file_get_contents( $tmpFile->getPath() );
                                $this->assertNotEquals( false, $contents, "Local ref of $path exists ($backendName)." );
-                               $this->assertEquals( current( $content ), $contents, "Local ref of $path is correct ($backendName)." );
+                               $this->assertEquals(
+                                       current( $content ),
+                                       $contents,
+                                       "Local ref of $path is correct ($backendName)."
+                               );
                                next( $content );
                        }
-                       $this->assertEquals( $source, array_keys( $tmpFiles ), "Local refs in right order ($backendName)." );
-                       $this->assertEquals( count( $source ), count( $tmpFiles ), "Local refs array size correct ($backendName)." );
+                       $this->assertEquals(
+                               $source,
+                               array_keys( $tmpFiles ),
+                               "Local refs in right order ($backendName)."
+                       );
+                       $this->assertEquals(
+                               count( $source ),
+                               count( $tmpFiles ),
+                               "Local refs array size correct ($backendName)."
+                       );
                } else {
                        $tmpFile = $this->backend->getLocalReference( array( 'src' => $source ) );
                        $this->assertNotNull( $tmpFile,
@@ -1950,7 +1993,10 @@ class FileBackendTest extends MediaWikiTestCase {
                $this->assertEquals( $expected, $list, "Correct file listing ($backendName)." );
 
                // Actual listing (no trailing slash) at root with advise
-               $iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont1", 'adviseStat' => 1 ) );
+               $iter = $this->backend->getFileList( array(
+                       'dir' => "$base/unittest-cont1",
+                       'adviseStat' => 1
+               ) );
                $list = $this->listToArray( $iter );
                sort( $list );
                $this->assertEquals( $expected, $list, "Correct file listing ($backendName)." );
@@ -1983,7 +2029,10 @@ class FileBackendTest extends MediaWikiTestCase {
                $this->assertEquals( $expected, $list, "Correct file listing ($backendName)." );
 
                // Actual listing (no trailing slash) at subdir with advise
-               $iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont1/e/subdir2/subdir", 'adviseStat' => 1 ) );
+               $iter = $this->backend->getFileList( array(
+                       'dir' => "$base/unittest-cont1/e/subdir2/subdir",
+                       'adviseStat' => 1
+               ) );
                $list = $this->listToArray( $iter );
                sort( $list );
                $this->assertEquals( $expected, $list, "Correct file listing ($backendName)." );
@@ -2019,13 +2068,18 @@ class FileBackendTest extends MediaWikiTestCase {
                sort( $expected );
 
                // Actual listing (top files only) at subdir
-               $iter = $this->backend->getTopFileList( array( 'dir' => "$base/unittest-cont1/e/subdir2/subdir" ) );
+               $iter = $this->backend->getTopFileList(
+                       array( 'dir' => "$base/unittest-cont1/e/subdir2/subdir" )
+               );
                $list = $this->listToArray( $iter );
                sort( $list );
                $this->assertEquals( $expected, $list, "Correct top file listing ($backendName)." );
 
                // Actual listing (top files only) at subdir with advise
-               $iter = $this->backend->getTopFileList( array( 'dir' => "$base/unittest-cont1/e/subdir2/subdir", 'adviseStat' => 1 ) );
+               $iter = $this->backend->getTopFileList( array(
+                       'dir' => "$base/unittest-cont1/e/subdir2/subdir",
+                       'adviseStat' => 1
+               ) );
                $list = $this->listToArray( $iter );
                sort( $list );
                $this->assertEquals( $expected, $list, "Correct top file listing ($backendName)." );
@@ -2162,7 +2216,10 @@ class FileBackendTest extends MediaWikiTestCase {
 
                // Actual listing (with trailing slash)
                $list = array();
-               $iter = $this->backend->getTopDirectoryList( array( 'dir' => "$base/unittest-cont1/e/subdir2/" ) );
+               $iter = $this->backend->getTopDirectoryList(
+                       array( 'dir' => "$base/unittest-cont1/e/subdir2/" )
+               );
+
                foreach ( $iter as $file ) {
                        $list[] = $file;
                }
@@ -2177,7 +2234,11 @@ class FileBackendTest extends MediaWikiTestCase {
                }
                sort( $list );
 
-               $this->assertEquals( $expected, $list, "Correct top dir listing ($backendName), second iteration." );
+               $this->assertEquals(
+                       $expected,
+                       $list,
+                       "Correct top dir listing ($backendName), second iteration."
+               );
 
                // Expected listing (recursive)
                $expected = array(
index 787d83c..3276cf9 100644 (file)
@@ -130,7 +130,17 @@ class StoreBatchTest extends MediaWikiTestCase {
         */
        public function teststore() {
                global $IP;
-               $this->storecohort( "Test1.png", "$IP/skins/monobook/wiki.png", "$IP/skins/monobook/video.png", false );
-               $this->storecohort( "Test2.png", "$IP/skins/monobook/wiki.png", "$IP/skins/monobook/video.png", true );
+               $this->storecohort(
+                       "Test1.png",
+                       "$IP/skins/monobook/wiki.png",
+                       "$IP/skins/monobook/video.png",
+                       false
+               );
+               $this->storecohort(
+                       "Test2.png",
+                       "$IP/skins/monobook/wiki.png",
+                       "$IP/skins/monobook/video.png",
+                       true
+               );
        }
 }
index c41acef..5a822f5 100644 (file)
@@ -30,11 +30,12 @@ class HtmlCheckMatrixTest extends MediaWikiTestCase {
        public function testValidateCallsUserDefinedValidationCallback() {
                $called = false;
                $field = new HTMLCheckMatrix( self::$defaultOptions + array(
-                               'validation-callback' => function() use ( &$called ) {
-                                               $called = true;
-                                               return false;
-                                       },
-                       ) );
+                       'validation-callback' => function () use ( &$called ) {
+                               $called = true;
+
+                               return false;
+                       },
+               ) );
                $this->assertEquals( false, $this->validate( $field, array() ) );
                $this->assertTrue( $called );
        }
index 8466684..064d518 100644 (file)
@@ -48,17 +48,24 @@ class InstallDocFormatterTest extends MediaWikiTestCase {
 
                        # Transform '$wgFooBar' links
                        array(
-                               '<span class="config-plainlink">[https://www.mediawiki.org/wiki/Manual:$wgFooBar $wgFooBar]</span>',
+                               '<span class="config-plainlink">'
+                                       . '[https://www.mediawiki.org/wiki/Manual:$wgFooBar $wgFooBar]</span>',
                                '$wgFooBar', 'Testing basic $wgFooBar' ),
                        array(
-                               '<span class="config-plainlink">[https://www.mediawiki.org/wiki/Manual:$wgFooBar45 $wgFooBar45]</span>',
+                               '<span class="config-plainlink">'
+                                       . '[https://www.mediawiki.org/wiki/Manual:$wgFooBar45 $wgFooBar45]</span>',
                                '$wgFooBar45', 'Testing $wgFooBar45 (with numbers)' ),
                        array(
-                               '<span class="config-plainlink">[https://www.mediawiki.org/wiki/Manual:$wgFoo_Bar $wgFoo_Bar]</span>',
+                               '<span class="config-plainlink">'
+                                       . '[https://www.mediawiki.org/wiki/Manual:$wgFoo_Bar $wgFoo_Bar]</span>',
                                '$wgFoo_Bar', 'Testing $wgFoo_Bar (with underscore)' ),
 
                        # Icky variables that shouldn't link
-                       array( '$myAwesomeVariable', '$myAwesomeVariable', 'Testing $myAwesomeVariable (not starting with $wg)' ),
+                       array(
+                               '$myAwesomeVariable',
+                               '$myAwesomeVariable',
+                               'Testing $myAwesomeVariable (not starting with $wg)'
+                       ),
                        array( '$()not!a&Var', '$()not!a&Var', 'Testing $()not!a&Var (obviously not a variable)' ),
                );
        }
index 66e6559..fdcecf9 100644 (file)
@@ -40,7 +40,11 @@ class OracleInstallerTest extends MediaWikiTestCase {
                        array( true, 'host:1521/service:shared', 'Host, port, service and shared server type' ),
                        array( true, 'host:1521/service:dedicated', 'Host, port, service and dedicated server type' ),
                        array( true, 'host:1521/service:pooled', 'Host, port, service and pooled server type' ),
-                       array( true, 'host:1521/service:shared/instance1', 'Host, port, service, server type and instance' ),
+                       array(
+                               true,
+                               'host:1521/service:shared/instance1',
+                               'Host, port, service, server type and instance'
+                       ),
                        array( true, 'host:1521//instance1', 'Host, port and instance' ),
                );
        }
index 3d2b5d8..3e232a9 100644 (file)
@@ -28,7 +28,11 @@ class RefreshLinksPartitionTest extends MediaWikiTestCase {
                }
 
                $title->getBacklinkCache()->clear();
-               $this->assertEquals( 20, $title->getBacklinkCache()->getNumLinks( 'pagelinks' ), 'Correct number of backlinks' );
+               $this->assertEquals(
+                       20,
+                       $title->getBacklinkCache()->getNumLinks( 'pagelinks' ),
+                       'Correct number of backlinks'
+               );
 
                $job = new RefreshLinksJob( $title, array( 'recursive' => true, 'table' => 'pagelinks' )
                        + Job::newRootJobParams( "refreshlinks:pagelinks:{$title->getPrefixedText()}" ) );
@@ -55,7 +59,12 @@ class RefreshLinksPartitionTest extends MediaWikiTestCase {
                $this->assertEquals( $extraParams['rootJobSignature'], $jobs[9]->params['rootJobSignature'],
                        'Recursive sub-job has root params' );
 
-               $jobs2 = BacklinkJobUtils::partitionBacklinkJob( $jobs[9], 9, 1, array( 'params' => $extraParams ) );
+               $jobs2 = BacklinkJobUtils::partitionBacklinkJob(
+                       $jobs[9],
+                       9,
+                       1,
+                       array( 'params' => $extraParams )
+               );
 
                $this->assertEquals( 10, count( $jobs2 ), 'Correct number of sub-jobs' );
                $this->assertEquals( $pages[9], current( $jobs2[0]->params['pages'] ),
@@ -73,7 +82,12 @@ class RefreshLinksPartitionTest extends MediaWikiTestCase {
                $this->assertEquals( $extraParams['rootJobSignature'], $jobs2[9]->params['rootJobSignature'],
                        'Recursive sub-job has root params' );
 
-               $jobs3 = BacklinkJobUtils::partitionBacklinkJob( $jobs2[9], 9, 1, array( 'params' => $extraParams ) );
+               $jobs3 = BacklinkJobUtils::partitionBacklinkJob(
+                       $jobs2[9],
+                       9,
+                       1,
+                       array( 'params' => $extraParams )
+               );
 
                $this->assertEquals( 2, count( $jobs3 ), 'Correct number of sub-jobs' );
                $this->assertEquals( $pages[18], current( $jobs3[0]->params['pages'] ),
index 5c0487b..5475a82 100644 (file)
@@ -25,7 +25,11 @@ class CSSMinTest extends MediaWikiTestCase {
        public function testMinify( $code, $expectedOutput ) {
                $minified = CSSMin::minify( $code );
 
-               $this->assertEquals( $expectedOutput, $minified, 'Minified output should be in the form expected.' );
+               $this->assertEquals(
+                       $expectedOutput,
+                       $minified,
+                       'Minified output should be in the form expected.'
+               );
        }
 
        public static function provideMinifyCases() {
@@ -69,7 +73,8 @@ class CSSMinTest extends MediaWikiTestCase {
        }
 
        /**
-        * This tests funky parameters to CSSMin::remap. testRemapRemapping tests the basic functionality.
+        * This tests funky parameters to CSSMin::remap. testRemapRemapping tests
+        * the basic functionality.
         *
         * @dataProvider provideRemapCases
         * @covers CSSMin::remap
@@ -78,7 +83,11 @@ class CSSMinTest extends MediaWikiTestCase {
                $remapped = call_user_func_array( 'CSSMin::remap', $params );
 
                $messageAdd = " Case: $message";
-               $this->assertEquals( $expectedOutput, $remapped, 'CSSMin::remap should return the expected url form.' . $messageAdd );
+               $this->assertEquals(
+                       $expectedOutput,
+                       $remapped,
+                       'CSSMin::remap should return the expected url form.' . $messageAdd
+               );
        }
 
        public static function provideRemapCases() {
@@ -201,7 +210,8 @@ class CSSMinTest extends MediaWikiTestCase {
                        array(
                                'Embedded file (inline @embed)',
                                'foo { background: /* @embed */ url(red.gif); }',
-                               "foo { background: url($red); background: url(http://localhost/w/red.gif?timestamp)!ie; }",
+                               "foo { background: url($red); "
+                                       . "background: url(http://localhost/w/red.gif?timestamp)!ie; }",
                        ),
                        array(
                                'Can not embed large files',
@@ -211,27 +221,35 @@ class CSSMinTest extends MediaWikiTestCase {
                        array(
                                'Two regular files in one rule',
                                'foo { background: url(red.gif), url(green.gif); }',
-                               'foo { background: url(http://localhost/w/red.gif?timestamp), url(http://localhost/w/green.gif?timestamp); }',
+                               'foo { background: url(http://localhost/w/red.gif?timestamp), '
+                                       . 'url(http://localhost/w/green.gif?timestamp); }',
                        ),
                        array(
                                'Two embedded files in one rule',
                                'foo { /* @embed */ background: url(red.gif), url(green.gif); }',
-                               "foo { background: url($red), url($green); background: url(http://localhost/w/red.gif?timestamp), url(http://localhost/w/green.gif?timestamp)!ie; }",
+                               "foo { background: url($red), url($green); "
+                                       . "background: url(http://localhost/w/red.gif?timestamp), "
+                                       . "url(http://localhost/w/green.gif?timestamp)!ie; }",
                        ),
                        array(
                                'Two embedded files in one rule (inline @embed)',
                                'foo { background: /* @embed */ url(red.gif), /* @embed */ url(green.gif); }',
-                               "foo { background: url($red), url($green); background: url(http://localhost/w/red.gif?timestamp), url(http://localhost/w/green.gif?timestamp)!ie; }",
+                               "foo { background: url($red), url($green); "
+                                       . "background: url(http://localhost/w/red.gif?timestamp), "
+                                       . "url(http://localhost/w/green.gif?timestamp)!ie; }",
                        ),
                        array(
                                'Two embedded files in one rule (inline @embed), one too large',
                                'foo { background: /* @embed */ url(red.gif), /* @embed */ url(large.png); }',
-                               "foo { background: url($red), url(http://localhost/w/large.png?timestamp); background: url(http://localhost/w/red.gif?timestamp), url(http://localhost/w/large.png?timestamp)!ie; }",
+                               "foo { background: url($red), url(http://localhost/w/large.png?timestamp); "
+                                       . "background: url(http://localhost/w/red.gif?timestamp), "
+                                       . "url(http://localhost/w/large.png?timestamp)!ie; }",
                        ),
                        array(
                                'Practical example with some noise',
                                'foo { /* @embed */ background: #f9f9f9 url(red.gif) 0 0 no-repeat; }',
-                               "foo { background: #f9f9f9 url($red) 0 0 no-repeat; background: #f9f9f9 url(http://localhost/w/red.gif?timestamp) 0 0 no-repeat!ie; }",
+                               "foo { background: #f9f9f9 url($red) 0 0 no-repeat; "
+                                       . "background: #f9f9f9 url(http://localhost/w/red.gif?timestamp) 0 0 no-repeat!ie; }",
                        ),
                        array(
                                'Does not mess with other properties',
@@ -324,7 +342,10 @@ class CSSMinTest extends MediaWikiTestCase {
                        // - Using a tab in a string value (turns into a space)
                        array( "foo { content: '\t'; }", "foo{content:'\t'}" ),
                        // - Using css-like syntax in string values
-                       array( 'foo::after { content: "{;}"; position: absolute; }', 'foo::after{content:"{;}";position:absolute}' ),
+                       array(
+                               'foo::after { content: "{;}"; position: absolute; }',
+                               'foo::after{content:"{;}";position:absolute}'
+                       ),
                );
        }
 }
index e2ec474..4911f73 100644 (file)
@@ -30,7 +30,8 @@
 abstract class GenericArrayObjectTest extends MediaWikiTestCase {
 
        /**
-        * Returns objects that can serve as elements in the concrete GenericArrayObject deriving class being tested.
+        * Returns objects that can serve as elements in the concrete
+        * GenericArrayObject deriving class being tested.
         *
         * @since 1.20
         *
@@ -170,7 +171,7 @@ abstract class GenericArrayObjectTest extends MediaWikiTestCase {
        /**
         * @since 1.20
         *
-        * @param callback $function
+        * @param callable $function
         *
         * @covers GenericArrayObject::getObjectType
         */
diff --git a/tests/phpunit/includes/libs/IPSetTest.php b/tests/phpunit/includes/libs/IPSetTest.php
new file mode 100644 (file)
index 0000000..aaee512
--- /dev/null
@@ -0,0 +1,252 @@
+<?php
+
+/**
+ * @group IPSet
+ */
+class IPSetTest extends MediaWikiTestCase {
+       /**
+        * Provides test cases for IPSetTest::testIPSet
+        *
+        * Returns an array of test cases. Each case is an array of (description,
+        * config, tests).  Description is just text output for failure messages,
+        * 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() {
+               return array(
+                       array(
+                               'old_list_subset',
+                               array(
+                                       '208.80.152.162',
+                                       '10.64.0.123',
+                                       '10.64.0.124',
+                                       '10.64.0.125',
+                                       '10.64.0.126',
+                                       '10.64.0.127',
+                                       '10.64.0.128',
+                                       '10.64.0.129',
+                                       '10.64.32.104',
+                                       '10.64.32.105',
+                                       '10.64.32.106',
+                                       '10.64.32.107',
+                                       '91.198.174.45',
+                                       '91.198.174.46',
+                                       '91.198.174.47',
+                                       '91.198.174.57',
+                                       '2620:0:862:1:A6BA:DBFF:FE30:CFB3',
+                                       '91.198.174.58',
+                                       '2620:0:862:1:A6BA:DBFF:FE38:FFDA',
+                                       '208.80.152.16',
+                                       '208.80.152.17',
+                                       '208.80.152.18',
+                                       '208.80.152.19',
+                                       '91.198.174.102',
+                                       '91.198.174.103',
+                                       '91.198.174.104',
+                                       '91.198.174.105',
+                                       '91.198.174.106',
+                                       '91.198.174.107',
+                                       '91.198.174.81',
+                                       '2620:0:862:1:26B6:FDFF:FEF5:B2D4',
+                                       '91.198.174.82',
+                                       '2620:0:862:1:26B6:FDFF:FEF5:ABB4',
+                                       '10.20.0.113',
+                                       '2620:0:862:102:26B6:FDFF:FEF5:AD9C',
+                                       '10.20.0.114',
+                                       '2620:0:862:102:26B6:FDFF:FEF5:7C38',
+                               ),
+                               array(
+                                       '0.0.0.0' => false,
+                                       '255.255.255.255' => false,
+                                       '10.64.0.122' => false,
+                                       '10.64.0.123' => true,
+                                       '10.64.0.124' => true,
+                                       '10.64.0.129' => true,
+                                       '10.64.0.130' => false,
+                                       '91.198.174.81' => true,
+                                       '91.198.174.80' => false,
+                                       '0::0' => false,
+                                       'ffff:ffff:ffff:ffff:FFFF:FFFF:FFFF:FFFF' => false,
+                                       '2001:db8::1234' => false,
+                                       '2620:0:862:1:26b6:fdff:fef5:abb3' => false,
+                                       '2620:0:862:1:26b6:fdff:fef5:abb4' => true,
+                                       '2620:0:862:1:26b6:fdff:fef5:abb5' => false,
+                               ),
+                       ),
+                       array(
+                               'new_cidr_set',
+                               array(
+                                       '208.80.154.0/26',
+                                       '2620:0:861:1::/64',
+                                       '208.80.154.128/26',
+                                       '2620:0:861:2::/64',
+                                       '208.80.154.64/26',
+                                       '2620:0:861:3::/64',
+                                       '208.80.155.96/27',
+                                       '2620:0:861:4::/64',
+                                       '10.64.0.0/22',
+                                       '2620:0:861:101::/64',
+                                       '10.64.16.0/22',
+                                       '2620:0:861:102::/64',
+                                       '10.64.32.0/22',
+                                       '2620:0:861:103::/64',
+                                       '10.64.48.0/22',
+                                       '2620:0:861:107::/64',
+                                       '91.198.174.0/25',
+                                       '2620:0:862:1::/64',
+                                       '10.20.0.0/24',
+                                       '2620:0:862:102::/64',
+                                       '10.128.0.0/24',
+                                       '2620:0:863:101::/64',
+                                       '10.2.4.26',
+                               ),
+                               array(
+                                       '0.0.0.0' => false,
+                                       '255.255.255.255' => false,
+                                       '10.2.4.25' => false,
+                                       '10.2.4.26' => true,
+                                       '10.2.4.27' => false,
+                                       '10.20.0.255' => true,
+                                       '10.128.0.0' => true,
+                                       '10.64.17.55' => true,
+                                       '10.64.20.0' => false,
+                                       '10.64.27.207' => false,
+                                       '10.64.31.255' => false,
+                                       '0::0' => false,
+                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' => false,
+                                       '2001:DB8::1' => false,
+                                       '2620:0:861:106::45' => false,
+                                       '2620:0:862:103::' => false,
+                                       '2620:0:862:102:10:20:0:113' => true,
+                               ),
+                       ),
+                       array(
+                               'empty_set',
+                               array(),
+                               array(
+                                       '0.0.0.0' => false,
+                                       '255.255.255.255' => false,
+                                       '10.2.4.25' => false,
+                                       '10.2.4.26' => false,
+                                       '10.2.4.27' => false,
+                                       '10.20.0.255' => false,
+                                       '10.128.0.0' => false,
+                                       '10.64.17.55' => false,
+                                       '10.64.20.0' => false,
+                                       '10.64.27.207' => false,
+                                       '10.64.31.255' => false,
+                                       '0::0' => false,
+                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' => false,
+                                       '2001:DB8::1' => false,
+                                       '2620:0:861:106::45' => false,
+                                       '2620:0:862:103::' => false,
+                                       '2620:0:862:102:10:20:0:113' => false,
+                               ),
+                       ),
+                       array(
+                               'edge_cases',
+                               array(
+                                       '0.0.0.0',
+                                       '255.255.255.255',
+                                       '::',
+                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',
+                                       '10.10.10.10/25', // host bits intentional
+                               ),
+                               array(
+                                       '0.0.0.0' => true,
+                                       '255.255.255.255' => true,
+                                       '10.2.4.25' => false,
+                                       '10.2.4.26' => false,
+                                       '10.2.4.27' => false,
+                                       '10.20.0.255' => false,
+                                       '10.128.0.0' => false,
+                                       '10.64.17.55' => false,
+                                       '10.64.20.0' => false,
+                                       '10.64.27.207' => false,
+                                       '10.64.31.255' => false,
+                                       '0::0' => true,
+                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' => true,
+                                       '2001:DB8::1' => false,
+                                       '2620:0:861:106::45' => false,
+                                       '2620:0:862:103::' => false,
+                                       '2620:0:862:102:10:20:0:113' => false,
+                                       '10.10.9.255' => false,
+                                       '10.10.10.0' => true,
+                                       '10.10.10.1' => true,
+                                       '10.10.10.10' => true,
+                                       '10.10.10.126' => true,
+                                       '10.10.10.127' => true,
+                                       '10.10.10.128' => false,
+                                       '10.10.10.177' => false,
+                                       '10.10.10.255' => false,
+                                       '10.10.11.0' => false,
+                               ),
+                       ),
+                       array(
+                               'exercise_optimizer',
+                               array(
+                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffff:0/112',
+                                       'ffff:ffff:ffff:ffff:ffff:ffff:fffe:0/112',
+                                       'ffff:ffff:ffff:ffff:ffff:ffff:fffd:0/112',
+                                       'ffff:ffff:ffff:ffff:ffff:ffff:fffc:0/112',
+                                       'ffff:ffff:ffff:ffff:ffff:ffff:fffb:0/112',
+                                       'ffff:ffff:ffff:ffff:ffff:ffff:fffa:0/112',
+                                       'ffff:ffff:ffff:ffff:ffff:ffff:fff9:8000/113',
+                                       'ffff:ffff:ffff:ffff:ffff:ffff:fff9:0/113',
+                                       'ffff:ffff:ffff:ffff:ffff:ffff:fff8:0/112',
+                                       'ffff:ffff:ffff:ffff:ffff:ffff:fff7:0/112',
+                                       'ffff:ffff:ffff:ffff:ffff:ffff:fff6:0/112',
+                                       'ffff:ffff:ffff:ffff:ffff:ffff:fff5:0/112',
+                                       'ffff:ffff:ffff:ffff:ffff:ffff:fff4:0/112',
+                                       'ffff:ffff:ffff:ffff:ffff:ffff:fff3:0/112',
+                                       'ffff:ffff:ffff:ffff:ffff:ffff:fff2:0/112',
+                                       'ffff:ffff:ffff:ffff:ffff:ffff:fff1:0/112',
+                                       'ffff:ffff:ffff:ffff:ffff:ffff:fff0:0/112',
+                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffef:0/112',
+                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffee:0/112',
+                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffec:0/111',
+                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffeb:0/112',
+                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffea:0/112',
+                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffe9:0/112',
+                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffe8:0/112',
+                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffe7:0/112',
+                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffe6:0/112',
+                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffe5:0/112',
+                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffe4:0/112',
+                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffe3:0/112',
+                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffe2:0/112',
+                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffe1:0/112',
+                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffe0:0/110',
+                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffc0:0/107',
+                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffa0:0/107',
+                               ),
+                               array(
+                                       '0.0.0.0' => false,
+                                       '255.255.255.255' => false,
+                                       '::' => false,
+                                       'ffff:ffff:ffff:ffff:ffff:ffff:ff9f:ffff' => false,
+                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffa0:0' => true,
+                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffc0:1234' => true,
+                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffed:ffff' => true,
+                                       'ffff:ffff:ffff:ffff:ffff:ffff:fff4:4444' => true,
+                                       'ffff:ffff:ffff:ffff:ffff:ffff:fff9:8080' => true,
+                                       'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' => true,
+                               ),
+                       ),
+               );
+       }
+
+       /**
+        * Validates IPSet loading and matching code
+        *
+        * @covers IPSet
+        * @dataProvider provider
+        */
+       public function testIPSet( $desc, array $cfg, array $tests ) {
+               $ipset = new IPSet( $cfg );
+               foreach ( $tests as $ip => $expected ) {
+                       $result = $ipset->match( $ip );
+                       $this->assertEquals( $expected, $result, "Incorrect match() result for $ip in dataset $desc" );
+               }
+       }
+}
index 01c330a..c8795b2 100644 (file)
@@ -14,16 +14,28 @@ class JavaScriptMinifierTest extends MediaWikiTestCase {
                         * At some point there was a bug that caused this comment to be ended at '* /',
                         * causing /M... to be left as the beginning of a regex.
                         */
-                       array( "/**\n * Foo\n * {\n * 'bar' : {\n * //Multiple rules with configurable operators\n * 'baz' : false\n * }\n */", "" ),
+                       array(
+                               "/**\n * Foo\n * {\n * 'bar' : {\n * "
+                                       . "//Multiple rules with configurable operators\n * 'baz' : false\n * }\n */",
+                               "" ),
 
                        /**
                         * '  Foo \' bar \
                         *  baz \' quox '  .
                         */
-                       array( "'  Foo  \\'  bar  \\\n  baz  \\'  quox  '  .length", "'  Foo  \\'  bar  \\\n  baz  \\'  quox  '.length" ),
-                       array( "\"  Foo  \\\"  bar  \\\n  baz  \\\"  quox  \"  .length", "\"  Foo  \\\"  bar  \\\n  baz  \\\"  quox  \".length" ),
+                       array(
+                               "'  Foo  \\'  bar  \\\n  baz  \\'  quox  '  .length",
+                               "'  Foo  \\'  bar  \\\n  baz  \\'  quox  '.length"
+                       ),
+                       array(
+                               "\"  Foo  \\\"  bar  \\\n  baz  \\\"  quox  \"  .length",
+                               "\"  Foo  \\\"  bar  \\\n  baz  \\\"  quox  \".length"
+                       ),
                        array( "// Foo b/ar baz", "" ),
-                       array( "/  Foo  \\/  bar  [  /  \\]  /  ]  baz  /  .length", "/  Foo  \\/  bar  [  /  \\]  /  ]  baz  /.length" ),
+                       array(
+                               "/  Foo  \\/  bar  [  /  \\]  /  ]  baz  /  .length",
+                               "/  Foo  \\/  bar  [  /  \\]  /  ]  baz  /.length"
+                       ),
 
                        // HTML comments
                        array( "<!-- Foo bar", "" ),
@@ -49,7 +61,10 @@ class JavaScriptMinifierTest extends MediaWikiTestCase {
 
                        // Semicolon insertion between an expression having an inline
                        // comment after it, and a statement on the next line (bug 27046).
-                       array( "var a = this //foo bar \n for ( b = 0; c < d; b++ ) {}", "var a=this\nfor(b=0;c<d;b++){}" ),
+                       array(
+                               "var a = this //foo bar \n for ( b = 0; c < d; b++ ) {}",
+                               "var a=this\nfor(b=0;c<d;b++){}"
+                       ),
 
                        // Token separation
                        array( "x  in  y", "x in y" ),
@@ -85,16 +100,28 @@ class JavaScriptMinifierTest extends MediaWikiTestCase {
                        array( "var foo=\"\\\nblah\\\n\";", "var foo=\"\\\nblah\\\n\";" ),
 
                        // Multiline quoted string followed by string with spaces
-                       array( "var foo=\"\\\nblah\\\n\";\nvar baz = \" foo \";\n", "var foo=\"\\\nblah\\\n\";var baz=\" foo \";" ),
+                       array(
+                               "var foo=\"\\\nblah\\\n\";\nvar baz = \" foo \";\n",
+                               "var foo=\"\\\nblah\\\n\";var baz=\" foo \";"
+                       ),
 
                        // URL in quoted string ( // is not a comment)
-                       array( "aNode.setAttribute('href','http://foo.bar.org/baz');", "aNode.setAttribute('href','http://foo.bar.org/baz');" ),
+                       array(
+                               "aNode.setAttribute('href','http://foo.bar.org/baz');",
+                               "aNode.setAttribute('href','http://foo.bar.org/baz');"
+                       ),
 
                        // URL in quoted string after multiline quoted string
-                       array( "var foo=\"\\\nblah\\\n\";\naNode.setAttribute('href','http://foo.bar.org/baz');", "var foo=\"\\\nblah\\\n\";aNode.setAttribute('href','http://foo.bar.org/baz');" ),
+                       array(
+                               "var foo=\"\\\nblah\\\n\";\naNode.setAttribute('href','http://foo.bar.org/baz');",
+                               "var foo=\"\\\nblah\\\n\";aNode.setAttribute('href','http://foo.bar.org/baz');"
+                       ),
 
                        // Division vs. regex nastiness
-                       array( "alert( (10+10) / '/'.charCodeAt( 0 ) + '//' );", "alert((10+10)/'/'.charCodeAt(0)+'//');" ),
+                       array(
+                               "alert( (10+10) / '/'.charCodeAt( 0 ) + '//' );",
+                               "alert((10+10)/'/'.charCodeAt(0)+'//');"
+                       ),
                        array( "if(1)/a /g.exec('Pa ss');", "if(1)/a /g.exec('Pa ss');" ),
 
                        // newline insertion after 1000 chars: break after the "++", not before
@@ -130,7 +157,11 @@ class JavaScriptMinifierTest extends MediaWikiTestCase {
                wfRestoreWarnings();
                $parser->parse( $minified, 'minify-test.js', 1 );
 
-               $this->assertEquals( $expectedOutput, $minified, "Minified output should be in the form expected." );
+               $this->assertEquals(
+                       $expectedOutput,
+                       $minified,
+                       "Minified output should be in the form expected."
+               );
        }
 
        public static function provideBug32548() {
index aedc23a..76cefe5 100644 (file)
@@ -2,17 +2,7 @@
 /**
  * @covers DjVuHandler
  */
-class DjVuTest extends MediaWikiTestCase {
-
-       /**
-        * @var string the directory where test files are
-        */
-       protected $filePath;
-
-       /**
-        * @var FSRepo the repository to use
-        */
-       protected $repo;
+class DjVuTest extends MediaWikiMediaTestCase {
 
        /**
         * @var DjVuHandler
@@ -20,60 +10,19 @@ class DjVuTest extends MediaWikiTestCase {
        protected $handler;
 
        protected function setUp() {
-               global $wgDjvuRenderer, $wgDjvuDump, $wgDjvuToXML;
                parent::setUp();
 
                //cli tool setup
-               $wgDjvuRenderer = $wgDjvuRenderer ? $wgDjvuRenderer : '/usr/bin/ddjvu';
-               $wgDjvuDump = $wgDjvuDump ? $wgDjvuDump : '/usr/bin/djvudump';
-               $wgDjvuToXML = $wgDjvuToXML ? $wgDjvuToXML : '/usr/bin/djvutoxml';
-               if (
-                       !$this->checkIfToolExists( $wgDjvuRenderer ) ||
-                       !$this->checkIfToolExists( $wgDjvuDump ) ||
-                       !$this->checkIfToolExists( $wgDjvuToXML )
-               ) {
-                       $this->markTestSkipped( 'This test needs the installation of the ddjvu, djvutoxml and djvudump tools' );
-               }
+               $djvuSupport = new DjVuSupport();
 
-               //file repo setup
-               $this->filePath = __DIR__ . '/../../data/media/';
-               $backend = new FSFileBackend( array(
-                       'name' => 'localtesting',
-                       'wikiId' => wfWikiId(),
-                       'lockManager' => new NullLockManager( array() ),
-                       'containerPaths' => array( 'data' => $this->filePath )
-               ) );
-               $this->repo = new FSRepo( array(
-                       'name' => 'temp',
-                       'url' => 'http://localhost/thumbtest',
-                       'backend' => $backend
-               ) );
+               if ( !$djvuSupport->isEnabled() ) {
+                       $this->markTestSkipped(
+                       'This test needs the installation of the ddjvu, djvutoxml and djvudump tools' );
+               }
 
                $this->handler = new DjVuHandler();
        }
 
-       /**
-        * Check if a tool exist
-        *
-        * @param string $path path to the tool
-        * @return bool
-        */
-       protected function checkIfToolExists( $path ) {
-               wfSuppressWarnings();
-               $result = file_exists( $path );
-               wfRestoreWarnings();
-               return $result;
-       }
-
-       protected function dataFile( $name, $type ) {
-               return new UnregisteredLocalFile(
-                       false,
-                       $this->repo,
-                       'mwstore://localtesting/data/' . $name,
-                       $type
-               );
-       }
-
        public function testGetImageSize() {
                $this->assertArrayEquals(
                        array( 2480, 3508, 'DjVu', 'width="2480" height="3508"' ),
@@ -83,7 +32,8 @@ class DjVuTest extends MediaWikiTestCase {
        }
 
        public function testInvalidFile() {
-               $this->assertFalse(
+               $this->assertEquals(
+                       'a:1:{s:5:"error";s:25:"Error extracting metadata";}',
                        $this->handler->getMetadata( null, $this->filePath . '/README' ),
                        'Getting Metadata for an inexistent file should returns false'
                );
index fb3e40e..44b2070 100644 (file)
@@ -45,7 +45,9 @@ class ExifBitmapTest extends MediaWikiTestCase {
         * @covers ExifBitmapHandler::isMetadataValid
         */
        public function testGoodMetadata() {
+               // @codingStandardsIgnoreStart Ignore Generic.Files.LineLength.TooLong
                $meta = 'a:16:{s:10:"ImageWidth";i:20;s:11:"ImageLength";i:20;s:13:"BitsPerSample";a:3:{i:0;i:8;i:1;i:8;i:2;i:8;}s:11:"Compression";i:5;s:25:"PhotometricInterpretation";i:2;s:16:"ImageDescription";s:17:"Created with GIMP";s:12:"StripOffsets";i:8;s:11:"Orientation";i:1;s:15:"SamplesPerPixel";i:3;s:12:"RowsPerStrip";i:64;s:15:"StripByteCounts";i:238;s:11:"XResolution";s:19:"1207959552/16777216";s:11:"YResolution";s:19:"1207959552/16777216";s:19:"PlanarConfiguration";i:1;s:14:"ResolutionUnit";i:2;s:22:"MEDIAWIKI_EXIF_VERSION";i:2;}';
+               // @codingStandardsIgnoreEnd
                $res = $this->handler->isMetadataValid( null, $meta );
                $this->assertEquals( ExifBitmapHandler::METADATA_GOOD, $res );
        }
@@ -54,7 +56,9 @@ class ExifBitmapTest extends MediaWikiTestCase {
         * @covers ExifBitmapHandler::isMetadataValid
         */
        public function testIsOldGood() {
+               // @codingStandardsIgnoreStart Ignore Generic.Files.LineLength.TooLong
                $meta = 'a:16:{s:10:"ImageWidth";i:20;s:11:"ImageLength";i:20;s:13:"BitsPerSample";a:3:{i:0;i:8;i:1;i:8;i:2;i:8;}s:11:"Compression";i:5;s:25:"PhotometricInterpretation";i:2;s:16:"ImageDescription";s:17:"Created with GIMP";s:12:"StripOffsets";i:8;s:11:"Orientation";i:1;s:15:"SamplesPerPixel";i:3;s:12:"RowsPerStrip";i:64;s:15:"StripByteCounts";i:238;s:11:"XResolution";s:19:"1207959552/16777216";s:11:"YResolution";s:19:"1207959552/16777216";s:19:"PlanarConfiguration";i:1;s:14:"ResolutionUnit";i:2;s:22:"MEDIAWIKI_EXIF_VERSION";i:1;}';
+               // @codingStandardsIgnoreEnd
                $res = $this->handler->isMetadataValid( null, $meta );
                $this->assertEquals( ExifBitmapHandler::METADATA_COMPATIBLE, $res );
        }
@@ -64,7 +68,9 @@ class ExifBitmapTest extends MediaWikiTestCase {
         * @covers ExifBitmapHandler::isMetadataValid
         */
        public function testPagedTiffHandledGracefully() {
+               // @codingStandardsIgnoreStart Ignore Generic.Files.LineLength.TooLong
                $meta = 'a:6:{s:9:"page_data";a:1:{i:1;a:5:{s:5:"width";i:643;s:6:"height";i:448;s:5:"alpha";s:4:"true";s:4:"page";i:1;s:6:"pixels";i:288064;}}s:10:"page_count";i:1;s:10:"first_page";i:1;s:9:"last_page";i:1;s:4:"exif";a:9:{s:10:"ImageWidth";i:643;s:11:"ImageLength";i:448;s:11:"Compression";i:5;s:25:"PhotometricInterpretation";i:2;s:11:"Orientation";i:1;s:15:"SamplesPerPixel";i:4;s:12:"RowsPerStrip";i:50;s:19:"PlanarConfiguration";i:1;s:22:"MEDIAWIKI_EXIF_VERSION";i:1;}s:21:"TIFF_METADATA_VERSION";s:3:"1.4";}';
+               // @codingStandardsIgnoreEnd
                $res = $this->handler->isMetadataValid( null, $meta );
                $this->assertEquals( ExifBitmapHandler::METADATA_BAD, $res );
        }
index 3cfbf1a..6a1e422 100644 (file)
@@ -6,26 +6,13 @@
  *
  * @todo covers tags
  */
-class ExifRotationTest extends MediaWikiTestCase {
+class ExifRotationTest extends MediaWikiMediaTestCase {
 
        protected function setUp() {
                parent::setUp();
                $this->checkPHPExtension( 'exif' );
 
                $this->handler = new BitmapHandler();
-               $filePath = __DIR__ . '/../../data/media';
-
-               $tmpDir = $this->getNewTempDirectory();
-
-               $this->repo = new FSRepo( array(
-                       'name' => 'temp',
-                       'url' => 'http://localhost/thumbtest',
-                       'backend' => new FSFileBackend( array(
-                               'name' => 'localtesting',
-                               'wikiId' => wfWikiId(),
-                               'containerPaths' => array( 'temp-thumb' => $tmpDir, 'data' => $filePath )
-                       ) )
-               ) );
 
                $this->setMwGlobals( array(
                        'wgShowEXIF' => true,
@@ -33,6 +20,13 @@ class ExifRotationTest extends MediaWikiTestCase {
                ) );
        }
 
+       /**
+        * Mark this test as creating thumbnail files.
+        */
+       protected function createsThumbnails() {
+               return true;
+       }
+
        /**
         * @dataProvider provideFiles
         */
@@ -70,8 +64,16 @@ class ExifRotationTest extends MediaWikiTestCase {
                        $file = $this->dataFile( $name, $type );
                        $thumb = $file->transform( $params, File::RENDER_NOW | File::RENDER_FORCE );
 
-                       $this->assertEquals( $out[0], $thumb->getWidth(), "$name: thumb reported width check for $size" );
-                       $this->assertEquals( $out[1], $thumb->getHeight(), "$name: thumb reported height check for $size" );
+                       $this->assertEquals(
+                               $out[0],
+                               $thumb->getWidth(),
+                               "$name: thumb reported width check for $size"
+                       );
+                       $this->assertEquals(
+                               $out[1],
+                               $thumb->getHeight(),
+                               "$name: thumb reported height check for $size"
+                       );
 
                        $gis = getimagesize( $thumb->getLocalCopyPath() );
                        if ( $out[0] > $info['width'] ) {
@@ -85,12 +87,6 @@ class ExifRotationTest extends MediaWikiTestCase {
                }
        }
 
-       /* Utility function */
-       private function dataFile( $name, $type ) {
-               return new UnregisteredLocalFile( false, $this->repo,
-                       "mwstore://localtesting/data/$name", $type );
-       }
-
        public static function provideFiles() {
                return array(
                        array(
@@ -160,8 +156,16 @@ class ExifRotationTest extends MediaWikiTestCase {
                        $file = $this->dataFile( $name, $type );
                        $thumb = $file->transform( $params, File::RENDER_NOW | File::RENDER_FORCE );
 
-                       $this->assertEquals( $out[0], $thumb->getWidth(), "$name: thumb reported width check for $size" );
-                       $this->assertEquals( $out[1], $thumb->getHeight(), "$name: thumb reported height check for $size" );
+                       $this->assertEquals(
+                               $out[0],
+                               $thumb->getWidth(),
+                               "$name: thumb reported width check for $size"
+                       );
+                       $this->assertEquals(
+                               $out[1],
+                               $thumb->getHeight(),
+                               "$name: thumb reported height check for $size"
+                       );
 
                        $gis = getimagesize( $thumb->getLocalCopyPath() );
                        if ( $out[0] > $info['width'] ) {
index a0ab92c..daaefc0 100644 (file)
@@ -1,28 +1,11 @@
 <?php
 
-class FormatMetadataTest extends MediaWikiTestCase {
-
-       /** @var FSFileBackend */
-       protected $backend;
-       /** @var FSRepo */
-       protected $repo;
+class FormatMetadataTest extends MediaWikiMediaTestCase {
 
        protected function setUp() {
                parent::setUp();
 
                $this->checkPHPExtension( 'exif' );
-               $filePath = __DIR__ . '/../../data/media';
-               $this->backend = new FSFileBackend( array(
-                       'name' => 'localtesting',
-                       'wikiId' => wfWikiId(),
-                       'containerPaths' => array( 'data' => $filePath )
-               ) );
-               $this->repo = new FSRepo( array(
-                       'name' => 'temp',
-                       'url' => 'http://localhost/thumbtest',
-                       'backend' => $this->backend
-               ) );
-
                $this->setMwGlobals( 'wgShowEXIF', true );
        }
 
@@ -82,9 +65,4 @@ class FormatMetadataTest extends MediaWikiTestCase {
                        // TODO: more test cases
                );
        }
-
-       private function dataFile( $name, $type ) {
-               return new UnregisteredLocalFile( false, $this->repo,
-                       "mwstore://localtesting/data/$name", $type );
-       }
 }
index d750540..17b2964 100644 (file)
@@ -1,29 +1,12 @@
 <?php
-class GIFHandlerTest extends MediaWikiTestCase {
+class GIFHandlerTest extends MediaWikiMediaTestCase {
 
-       /** @var FSFileBackend */
-       protected $backend;
        /** @var GIFHandler */
        protected $handler;
-       /** @var FSRepo */
-       protected $repo;
-       /** @var string */
-       protected $filePath;
 
        protected function setUp() {
                parent::setUp();
 
-               $this->filePath = __DIR__ . '/../../data/media';
-               $this->backend = new FSFileBackend( array(
-                       'name' => 'localtesting',
-                       'wikiId' => wfWikiId(),
-                       'containerPaths' => array( 'data' => $this->filePath )
-               ) );
-               $this->repo = new FSRepo( array(
-                       'name' => 'temp',
-                       'url' => 'http://localhost/thumbtest',
-                       'backend' => $this->backend
-               ) );
                $this->handler = new GIFHandler();
        }
 
@@ -90,7 +73,9 @@ class GIFHandlerTest extends MediaWikiTestCase {
                        array( '', GIFHandler::METADATA_BAD ),
                        array( null, GIFHandler::METADATA_BAD ),
                        array( 'Something invalid!', GIFHandler::METADATA_BAD ),
+                       // @codingStandardsIgnoreStart Ignore Generic.Files.LineLength.TooLong
                        array( 'a:4:{s:10:"frameCount";i:1;s:6:"looped";b:0;s:8:"duration";d:0.1000000000000000055511151231257827021181583404541015625;s:8:"metadata";a:2:{s:14:"GIFFileComment";a:1:{i:0;s:35:"GIF test file ⁕ Created with GIMP";}s:15:"_MW_GIF_VERSION";i:1;}}', GIFHandler::METADATA_GOOD ),
+                       // @codingStandardsIgnoreEnd
                );
        }
 
@@ -108,8 +93,10 @@ class GIFHandlerTest extends MediaWikiTestCase {
 
        public static function provideGetMetadata() {
                return array(
+                       // @codingStandardsIgnoreStart Ignore Generic.Files.LineLength.TooLong
                        array( 'nonanimated.gif', 'a:4:{s:10:"frameCount";i:1;s:6:"looped";b:0;s:8:"duration";d:0.1000000000000000055511151231257827021181583404541015625;s:8:"metadata";a:2:{s:14:"GIFFileComment";a:1:{i:0;s:35:"GIF test file ⁕ Created with GIMP";}s:15:"_MW_GIF_VERSION";i:1;}}' ),
                        array( 'animated-xmp.gif', 'a:4:{s:10:"frameCount";i:4;s:6:"looped";b:1;s:8:"duration";d:2.399999999999999911182158029987476766109466552734375;s:8:"metadata";a:5:{s:6:"Artist";s:7:"Bawolff";s:16:"ImageDescription";a:2:{s:9:"x-default";s:18:"A file to test GIF";s:5:"_type";s:4:"lang";}s:15:"SublocationDest";s:13:"The interwebs";s:14:"GIFFileComment";a:1:{i:0;s:16:"GIƒ·test·file";}s:15:"_MW_GIF_VERSION";i:1;}}' ),
+                       // @codingStandardsIgnoreEnd
                );
        }
 
@@ -148,9 +135,4 @@ class GIFHandlerTest extends MediaWikiTestCase {
                        ),
                );
        }
-
-       private function dataFile( $name, $type ) {
-               return new UnregisteredLocalFile( false, $this->repo,
-                       "mwstore://localtesting/data/$name", $type );
-       }
 }
index 81c1d28..b556a75 100644 (file)
@@ -74,7 +74,8 @@ class IPTCTest extends MediaWikiTestCase {
         */
        public function testIPTCParseUTF8() {
                // This has the magic "\x1c\x01\x5A\x00\x03\x1B\x25\x47" which marks content as UTF8.
-               $iptcData = "Photoshop 3.0\08BIM\4\4\0\0\0\0\0\x0F\x1c\x02\x19\x00\x02¼\x1c\x01\x5A\x00\x03\x1B\x25\x47";
+               $iptcData =
+                       "Photoshop 3.0\08BIM\4\4\0\0\0\0\0\x0F\x1c\x02\x19\x00\x02¼\x1c\x01\x5A\x00\x03\x1B\x25\x47";
                $res = IPTC::Parse( $iptcData );
                $this->assertEquals( array( '¼' ), $res['Keywords'] );
        }
index 7ffde3b..b10f55c 100644 (file)
@@ -70,7 +70,8 @@ class JpegMetadataExtractorTest extends MediaWikiTestCase {
 
        public function testPSIRExtraction() {
                $res = JpegMetadataExtractor::segmentSplitter( $this->filePath . 'jpeg-xmp-psir.jpg' );
-               $expected = '50686f746f73686f7020332e30003842494d04040000000000181c02190004746573741c02190003666f6f1c020000020004';
+               $expected = '50686f746f73686f7020332e30003842494d04040000000'
+                       . '000181c02190004746573741c02190003666f6f1c020000020004';
                $this->assertEquals( $expected, bin2hex( $res['PSIR'][0] ) );
        }
 
index 1b28de1..c856b1c 100644 (file)
@@ -2,29 +2,14 @@
 /**
  * @covers JpegHandler
  */
-class JpegTest extends MediaWikiTestCase {
-
-       protected $filePath;
+class JpegTest extends MediaWikiMediaTestCase {
 
        protected function setUp() {
                parent::setUp();
                $this->checkPHPExtension( 'exif' );
 
-               $this->filePath = __DIR__ . '/../../data/media/';
-
                $this->setMwGlobals( 'wgShowEXIF', true );
 
-               $this->backend = new FSFileBackend( array(
-                       'name' => 'localtesting',
-                       'wikiId' => wfWikiId(),
-                       'containerPaths' => array( 'data' => $this->filePath )
-               ) );
-               $this->repo = new FSRepo( array(
-                       'name' => 'temp',
-                       'url' => 'http://localhost/thumbtest',
-                       'backend' => $this->backend
-               ) );
-
                $this->handler = new JpegHandler;
        }
 
@@ -37,7 +22,9 @@ class JpegTest extends MediaWikiTestCase {
        public function testJpegMetadataExtraction() {
                $file = $this->dataFile( 'test.jpg', 'image/jpeg' );
                $res = $this->handler->getMetadata( $file, $this->filePath . 'test.jpg' );
+               // @codingStandardsIgnoreStart Ignore Generic.Files.LineLength.TooLong
                $expected = 'a:7:{s:16:"ImageDescription";s:9:"Test file";s:11:"XResolution";s:4:"72/1";s:11:"YResolution";s:4:"72/1";s:14:"ResolutionUnit";i:2;s:16:"YCbCrPositioning";i:1;s:15:"JPEGFileComment";a:1:{i:0;s:17:"Created with GIMP";}s:22:"MEDIAWIKI_EXIF_VERSION";i:2;}';
+               // @codingStandardsIgnoreEnd
 
                // Unserialize in case serialization format ever changes.
                $this->assertEquals( unserialize( $expected ), unserialize( $res ) );
@@ -62,9 +49,4 @@ class JpegTest extends MediaWikiTestCase {
 
                $this->assertEquals( $res, $expected );
        }
-
-       private function dataFile( $name, $type ) {
-               return new UnregisteredLocalFile( false, $this->repo,
-                       "mwstore://localtesting/data/$name", $type );
-       }
 }
diff --git a/tests/phpunit/includes/media/MediaWikiMediaTestCase.php b/tests/phpunit/includes/media/MediaWikiMediaTestCase.php
new file mode 100644 (file)
index 0000000..ebfcba9
--- /dev/null
@@ -0,0 +1,73 @@
+<?php
+/**
+ * Specificly for testing Media handlers. Sets up a FSFile backend
+ */
+abstract class MediaWikiMediaTestCase extends MediaWikiTestCase {
+
+       /** @var FSRepo */
+       protected $repo;
+       /** @var FSFileBackend */
+       protected $backend;
+       /** @var string */
+       protected $filePath;
+
+
+       protected function setUp() {
+               parent::setUp();
+
+               $this->filePath = $this->getFilePath();
+               $containers = array( 'data' => $this->filePath );
+               if ( $this->createsThumbnails() ) {
+                       // We need a temp directory for the thumbnails
+                       // the container is named 'temp-thumb' because it is the
+                       // thumb directory for a FSRepo named "temp".
+                       $containers['temp-thumb'] = $this->getNewTempDirectory();
+               }
+
+               $this->backend = new FSFileBackend( array(
+                       'name' => 'localtesting',
+                       'wikiId' => wfWikiId(),
+                       'containerPaths' => $containers
+               ) );
+               $this->repo = new FSRepo( array(
+                       'name' => 'temp',
+                       'url' => 'http://localhost/thumbtest',
+                       'backend' => $this->backend
+               ) );
+       }
+
+       /**
+        * 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
+        */
+       protected function getFilePath() {
+               return __DIR__ . '/../../data/media/';
+       }
+
+       /**
+        * Will the test create thumbnails (and thus do we need to set aside
+        * a temporary directory for them?)
+        *
+        * Override this method if your test case creates thumbnails
+        *
+        * @return boolean
+        */
+       protected function createsThumbnails() {
+               return false;
+       }
+
+       /**
+        * Utility function: Get a new file object for a file on disk but not actually in db.
+        *
+        * File must be in the path returned by getFilePath()
+        * @param $name String File name
+        * @param $type String MIME type
+        * @return UnregisteredLocalFile
+        */
+       protected function dataFile( $name, $type ) {
+               return new UnregisteredLocalFile( false, $this->repo,
+                       "mwstore://localtesting/data/$name", $type );
+       }
+}
index aa73e2d..14e4d57 100644 (file)
@@ -1,29 +1,11 @@
 <?php
-class PNGHandlerTest extends MediaWikiTestCase {
+class PNGHandlerTest extends MediaWikiMediaTestCase {
 
        /** @var PNGHandler */
        protected $handler;
-       /** @var FSRepo */
-       protected $repo;
-       /** @var FSFileBackend */
-       protected $backend;
-       /** @var string */
-       protected $filePath;
 
        protected function setUp() {
                parent::setUp();
-
-               $this->filePath = __DIR__ . '/../../data/media';
-               $this->backend = new FSFileBackend( array(
-                       'name' => 'localtesting',
-                       'wikiId' => wfWikiId(),
-                       'containerPaths' => array( 'data' => $this->filePath )
-               ) );
-               $this->repo = new FSRepo( array(
-                       'name' => 'temp',
-                       'url' => 'http://localhost/thumbtest',
-                       'backend' => $this->backend
-               ) );
                $this->handler = new PNGHandler();
        }
 
@@ -92,7 +74,9 @@ class PNGHandlerTest extends MediaWikiTestCase {
                        array( '', PNGHandler::METADATA_BAD ),
                        array( null, PNGHandler::METADATA_BAD ),
                        array( 'Something invalid!', PNGHandler::METADATA_BAD ),
+                       // @codingStandardsIgnoreStart Ignore Generic.Files.LineLength.TooLong
                        array( 'a:6:{s:10:"frameCount";i:0;s:9:"loopCount";i:1;s:8:"duration";d:0;s:8:"bitDepth";i:8;s:9:"colorType";s:10:"truecolour";s:8:"metadata";a:1:{s:15:"_MW_PNG_VERSION";i:1;}}', PNGHandler::METADATA_GOOD ),
+                       // @codingStandardsIgnoreEnd
                );
        }
 
@@ -111,8 +95,10 @@ class PNGHandlerTest extends MediaWikiTestCase {
 
        public static function provideGetMetadata() {
                return array(
+                       // @codingStandardsIgnoreStart Ignore Generic.Files.LineLength.TooLong
                        array( 'rgb-na-png.png', 'a:6:{s:10:"frameCount";i:0;s:9:"loopCount";i:1;s:8:"duration";d:0;s:8:"bitDepth";i:8;s:9:"colorType";s:10:"truecolour";s:8:"metadata";a:1:{s:15:"_MW_PNG_VERSION";i:1;}}' ),
                        array( 'xmp.png', 'a:6:{s:10:"frameCount";i:0;s:9:"loopCount";i:1;s:8:"duration";d:0;s:8:"bitDepth";i:1;s:9:"colorType";s:14:"index-coloured";s:8:"metadata";a:2:{s:12:"SerialNumber";s:9:"123456789";s:15:"_MW_PNG_VERSION";i:1;}}' ),
+                       // @codingStandardsIgnoreEnd
                );
        }
 
@@ -138,9 +124,4 @@ class PNGHandlerTest extends MediaWikiTestCase {
                        ),
                );
        }
-
-       private function dataFile( $name, $type ) {
-               return new UnregisteredLocalFile( false, $this->repo,
-                       "mwstore://localtesting/data/$name", $type );
-       }
 }
index ec7b0c9..fa63fa6 100644 (file)
@@ -121,12 +121,15 @@ class SVGMetadataExtractorTest extends MediaWikiTestCase {
 
        public static function provideSvgFilesWithXMLMetadata() {
                $base = __DIR__ . '/../../data/media';
+               // @codingStandardsIgnoreStart Ignore Generic.Files.LineLength.TooLong
                $metadata = '<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
       <ns4:Work xmlns:ns4="http://creativecommons.org/ns#" rdf:about="">
         <ns5:format xmlns:ns5="http://purl.org/dc/elements/1.1/">image/svg+xml</ns5:format>
         <ns5:type xmlns:ns5="http://purl.org/dc/elements/1.1/" rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
       </ns4:Work>
     </rdf:RDF>';
+               // @codingStandardsIgnoreEnd
+
                $metadata = str_replace( "\r", '', $metadata ); // Windows compat
                return array(
                        array(
index 97e6c43..e3bb05e 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 
-class SvgTest extends MediaWikiTestCase {
+class SvgTest extends MediaWikiMediaTestCase {
 
        protected function setUp() {
                parent::setUp();
@@ -9,17 +9,6 @@ class SvgTest extends MediaWikiTestCase {
 
                $this->setMwGlobals( 'wgShowEXIF', true );
 
-               $this->backend = new FSFileBackend( array(
-                       'name' => 'localtesting',
-                       'wikiId' => wfWikiId(),
-                       'containerPaths' => array( 'data' => $this->filePath )
-               ) );
-               $this->repo = new FSRepo( array(
-                       'name' => 'temp',
-                       'url' => 'http://localhost/thumbtest',
-                       'backend' => $this->backend
-               ) );
-
                $this->handler = new SvgHandler;
        }
 
@@ -40,14 +29,10 @@ class SvgTest extends MediaWikiTestCase {
                return array(
                        array( 'Tux.svg', array(
                                'ObjectName' => 'Tux',
-                               'ImageDescription' => 'For more information see: http://commons.wikimedia.org/wiki/Image:Tux.svg',
+                               'ImageDescription' =>
+                                       'For more information see: http://commons.wikimedia.org/wiki/Image:Tux.svg',
                        ) ),
                        array( 'Wikimedia-logo.svg', array() )
                );
        }
-
-       private function dataFile( $name, $type ) {
-               return new UnregisteredLocalFile( false, $this->repo,
-                       "mwstore://localtesting/data/$name", $type );
-       }
 }
index ca97698..26d7204 100644 (file)
@@ -29,7 +29,11 @@ class TiffTest extends MediaWikiTestCase {
         */
        public function testTiffMetadataExtraction() {
                $res = $this->handler->getMetadata( null, $this->filePath . 'test.tiff' );
+
+               // @codingStandardsIgnoreStart Ignore Generic.Files.LineLength.TooLong
                $expected = 'a:16:{s:10:"ImageWidth";i:20;s:11:"ImageLength";i:20;s:13:"BitsPerSample";a:3:{i:0;i:8;i:1;i:8;i:2;i:8;}s:11:"Compression";i:5;s:25:"PhotometricInterpretation";i:2;s:16:"ImageDescription";s:17:"Created with GIMP";s:12:"StripOffsets";i:8;s:11:"Orientation";i:1;s:15:"SamplesPerPixel";i:3;s:12:"RowsPerStrip";i:64;s:15:"StripByteCounts";i:238;s:11:"XResolution";s:19:"1207959552/16777216";s:11:"YResolution";s:19:"1207959552/16777216";s:19:"PlanarConfiguration";i:1;s:14:"ResolutionUnit";i:2;s:22:"MEDIAWIKI_EXIF_VERSION";i:2;}';
+               // @codingStandardsIgnoreEnd
+
                // Re-unserialize in case there are subtle differences between how versions
                // of php serialize stuff.
                $this->assertEquals( unserialize( $expected ), unserialize( $res ) );
index a736234..dff31c1 100644 (file)
@@ -89,7 +89,9 @@ class CleanUpTest extends MediaWikiTestCase {
                                ( $i > UNICODE_SURROGATE_LAST && $i < 0xfffe ) ||
                                ( $i > 0xffff && $i <= UNICODE_MAX )
                        ) {
-                               if ( isset( UtfNormal::$utfCanonicalComp[$char] ) || isset( UtfNormal::$utfCanonicalDecomp[$char] ) ) {
+                               if ( isset( UtfNormal::$utfCanonicalComp[$char] )
+                                       || isset( UtfNormal::$utfCanonicalDecomp[$char] )
+                               ) {
                                        $comp = UtfNormal::NFC( $char );
                                        $this->assertEquals(
                                                bin2hex( $comp ),
@@ -243,12 +245,14 @@ class CleanUpTest extends MediaWikiTestCase {
                                                }
                                        } elseif ( $first > 0xc1 && $first < 0xe0 && $second < 0xc0 ) {
                                                $this->assertEquals(
-                                                       bin2hex( UtfNormal::NFC( $head . chr( $first ) . chr( $second ) ) . UTF8_REPLACEMENT . $tail ),
+                                                       bin2hex( UtfNormal::NFC( $head . chr( $first ) .
+                                                                       chr( $second ) ) . UTF8_REPLACEMENT . $tail ),
                                                        bin2hex( $clean ),
                                                        "Valid 2-byte $x + broken tail" );
                                        } elseif ( $second > 0xc1 && $second < 0xe0 && $third < 0xc0 ) {
                                                $this->assertEquals(
-                                                       bin2hex( $head . UTF8_REPLACEMENT . UtfNormal::NFC( chr( $second ) . chr( $third ) . $tail ) ),
+                                                       bin2hex( $head . UTF8_REPLACEMENT .
+                                                               UtfNormal::NFC( chr( $second ) . chr( $third ) . $tail ) ),
                                                        bin2hex( $clean ),
                                                        "Broken head + valid 2-byte $x" );
                                        } elseif ( ( $first > 0xfd || $second > 0xfd ) &&
index 1670823..1972bb5 100644 (file)
@@ -138,7 +138,10 @@ class BagOStuffTest extends MediaWikiTestCase {
                $this->cache->add( $key1, $value1 );
                $this->cache->add( $key2, $value2 );
 
-               $this->assertEquals( $this->cache->getMulti( array( $key1, $key2 ) ), array( $key1 => $value1, $key2 => $value2 ) );
+               $this->assertEquals(
+                       $this->cache->getMulti( array( $key1, $key2 ) ),
+                       array( $key1 => $value1, $key2 => $value2 )
+               );
 
                // cleanup
                $this->cache->delete( $key1 );
index 2ad2735..b81c973 100644 (file)
@@ -48,7 +48,9 @@ class MagicVariableTest extends MediaWikiTestCase {
 
                # Needs a title to do magic word stuff
                $title = Title::newFromText( 'Tests' );
-               $title->mRedirect = false; # Else it needs a db connection just to check if it's a redirect (when deciding the page language)
+               # Else it needs a db connection just to check if it's a redirect
+               # (when deciding the page language).
+               $title->mRedirect = false;
 
                $this->testParser->setTitle( $title );
        }
index f3c499b..26efa4a 100644 (file)
@@ -31,6 +31,11 @@ class NewParserTest extends MediaWikiTestCase {
        public $fuzzSeed = 0;
        public $memoryLimit = 50;
 
+       /**
+        * @var DjVuSupport
+        */
+       private $djVuSupport;
+
        protected $file = false;
 
        public static function setUpBeforeClass() {
@@ -60,6 +65,7 @@ class NewParserTest extends MediaWikiTestCase {
                $tmpGlobals['wgContLang'] = Language::factory( 'en' );
                $tmpGlobals['wgSitename'] = 'MediaWiki';
                $tmpGlobals['wgServer'] = 'http://example.org';
+               $tmpGlobals['wgServerName'] = 'example.org';
                $tmpGlobals['wgScript'] = '/index.php';
                $tmpGlobals['wgScriptPath'] = '/';
                $tmpGlobals['wgArticlePath'] = '/wiki/$1';
@@ -130,6 +136,9 @@ class NewParserTest extends MediaWikiTestCase {
                // Vector images have to be handled slightly differently
                $tmpGlobals['wgMediaHandlers']['image/svg+xml'] = 'MockSvgHandler';
 
+               // DjVu images have to be handled slightly differently
+               $tmpGlobals['wgMediaHandlers']['image/vnd.djvu'] = 'MockDjVuHandler';
+
                $tmpHooks = $wgHooks;
                $tmpHooks['ParserTestParser'][] = 'ParserTestParserHook::setup';
                $tmpHooks['ParserGetVariableValueTs'][] = 'ParserTest::getFakeTimestamp';
@@ -138,6 +147,9 @@ class NewParserTest extends MediaWikiTestCase {
                # proper precedence when resolving links. (bug 51680)
                $tmpGlobals['wgExtraNamespaces'] = array( 100 => 'MemoryAlpha' );
 
+               //DjVu support
+               $this->djVuSupport = new DjVuSupport();
+
                $this->setMwGlobals( $tmpGlobals );
 
                $this->savedWeirdGlobals['image_alias'] = $wgNamespaceAliases['Image'];
@@ -273,6 +285,75 @@ class NewParserTest extends MediaWikiTestCase {
                                        'fileExists'  => true
                        ), $this->db->timestamp( '20010115123500' ), $user );
                }
+               $image = wfLocalFile( Title::makeTitle( NS_FILE, 'Portrait.png' ) );
+               if ( !$this->db->selectField( 'image', '1', array( 'img_name' => $image->getName() ) ) ) {
+                       $image->recordUpload2( '', 'Upload of tall bitmap', 'Some tall bitmap', array(
+                                       'size'        => 12345,
+                                       'width'       => 180,
+                                       'height'      => 240,
+                                       'bits'        => 8,
+                                       'media_type'  => MEDIATYPE_BITMAP,
+                                       'mime'        => 'image/png',
+                                       'metadata'    => serialize( array() ),
+                                       'sha1'        => wfBaseConvert( '', 16, 36, 31 ),
+                                       'fileExists'  => true
+                       ), $this->db->timestamp( '20140515134200' ), $user );
+               }
+               $image = wfLocalFile( Title::makeTitle( NS_FILE, 'Portrait.svg' ) );
+               if ( !$this->db->selectField( 'image', '1', array( 'img_name' => $image->getName() ) ) ) {
+                       $image->recordUpload2( '', 'Upload of tall SVG', 'Some tall SVG', array(
+                                       'size'        => 12345,
+                                       'width'       => 180,
+                                       'height'      => 240,
+                                       'bits'        => 24,
+                                       'media_type'  => MEDIATYPE_DRAWING,
+                                       'mime'        => 'image/svg+xml',
+                                       'metadata'    => serialize( array() ),
+                                       'sha1'        => wfBaseConvert( '', 16, 36, 31 ),
+                                       'fileExists'  => true
+                       ), $this->db->timestamp( '20140325124200' ), $user );
+               }
+
+               # A DjVu file
+               $image = wfLocalFile( Title::makeTitle( NS_FILE, 'LoremIpsum.djvu' ) );
+               if ( !$this->db->selectField( 'image', '1', array( 'img_name' => $image->getName() ) ) ) {
+                       $image->recordUpload2( '', 'Upload a DjVu', 'A DjVu', array(
+                               'size' => 3249,
+                               'width' => 2480,
+                               'height' => 3508,
+                               'bits' => 24,
+                               'media_type' => MEDIATYPE_BITMAP,
+                               'mime' => 'image/vnd.djvu',
+                               'metadata' => '<?xml version="1.0" ?>
+<!DOCTYPE DjVuXML PUBLIC "-//W3C//DTD DjVuXML 1.1//EN" "pubtext/DjVuXML-s.dtd">
+<DjVuXML>
+<HEAD></HEAD>
+<BODY><OBJECT height="3508" width="2480">
+<PARAM name="DPI" value="300" />
+<PARAM name="GAMMA" value="2.2" />
+</OBJECT>
+<OBJECT height="3508" width="2480">
+<PARAM name="DPI" value="300" />
+<PARAM name="GAMMA" value="2.2" />
+</OBJECT>
+<OBJECT height="3508" width="2480">
+<PARAM name="DPI" value="300" />
+<PARAM name="GAMMA" value="2.2" />
+</OBJECT>
+<OBJECT height="3508" width="2480">
+<PARAM name="DPI" value="300" />
+<PARAM name="GAMMA" value="2.2" />
+</OBJECT>
+<OBJECT height="3508" width="2480">
+<PARAM name="DPI" value="300" />
+<PARAM name="GAMMA" value="2.2" />
+</OBJECT>
+</BODY>
+</DjVuXML>',
+                               'sha1' => wfBaseConvert( '', 16, 36, 31 ),
+                               'fileExists' => true
+                       ), $this->db->timestamp( '20140115123600' ), $user );
+               }
        }
 
        //ParserTest setup/teardown functions
@@ -446,6 +527,14 @@ class NewParserTest extends MediaWikiTestCase {
                $backend->store( array(
                        'src' => "$IP/skins/monobook/headbg.jpg", 'dst' => "$base/local-public/0/09/Bad.jpg"
                ) );
+               $backend->prepare( array( 'dir' => "$base/local-public/9/93" ) );
+               $backend->store( array(
+                       'src' => "$IP/tests/phpunit/data/media/Portrait.png", 'dst' => "$base/local-public/9/93/Portrait.png"
+               ) );
+               $backend->prepare( array( 'dir' => "$base/local-public/5/5f" ) );
+               $backend->store( array(
+                       'src' => "$IP/tests/phpunit/data/media/LoremIpsum.djvu", 'dst' => "$base/local-public/5/5f/LoremIpsum.djvu"
+               ) );
 
                // No helpful SVG file to copy, so make one ourselves
                $data = '<?xml version="1.0" encoding="utf-8"?>' .
@@ -456,6 +545,15 @@ class NewParserTest extends MediaWikiTestCase {
                $backend->quickCreate( array(
                        'content' => $data, 'dst' => "$base/local-public/f/ff/Foobar.svg"
                ) );
+
+               $data = '<?xml version="1.0" encoding="utf-8"?>' .
+                       '<svg xmlns="http://www.w3.org/2000/svg"' .
+                       ' version="1.1" width="180" height="240"/>';
+
+               $backend->prepare( array( 'dir' => "$base/local-public/f/fc" ) );
+               $backend->quickCreate( array(
+                       'content' => $data, 'dst' => "$base/local-public/f/fc/Portrait.svg"
+               ) );
        }
 
        /**
@@ -525,6 +623,14 @@ class NewParserTest extends MediaWikiTestCase {
 
                                "$base/local-public/0/09/Bad.jpg",
 
+                               "$base/local-public/5/5f/LoremIpsum.djvu",
+                               "$base/local-thumb/5/5f/LoremIpsum.djvu/page2-2480px-LoremIpsum.djvu.jpg",
+                               "$base/local-thumb/5/5f/LoremIpsum.djvu/page2-3720px-LoremIpsum.djvu.jpg",
+                               "$base/local-thumb/5/5f/LoremIpsum.djvu/page2-4960px-LoremIpsum.djvu.jpg",
+
+                               "$base/local-public/9/93/Portrait.png",
+                               "$base/local-thumb/9/93/Portrait.png/165px-Portrait.png",
+
                                "$base/local-public/f/ff/Foobar.svg",
                                "$base/local-thumb/f/ff/Foobar.svg/180px-Foobar.svg.png",
                                "$base/local-thumb/f/ff/Foobar.svg/2000px-Foobar.svg.png",
@@ -536,6 +642,14 @@ class NewParserTest extends MediaWikiTestCase {
                                "$base/local-thumb/f/ff/Foobar.svg/langde-270px-Foobar.svg.png",
                                "$base/local-thumb/f/ff/Foobar.svg/langde-360px-Foobar.svg.png",
 
+                               "$base/local-public/f/fc/Portrait.svg",
+                               "$base/local-thumb/f/fc/Portrait.svg/165px-Portrait.svg.png",
+                               "$base/local-thumb/f/fc/Portrait.svg/225px-Portrait.svg.png",
+                               "$base/local-thumb/f/fc/Portrait.svg/247px-Portrait.svg.png",
+                               "$base/local-thumb/f/fc/Portrait.svg/330px-Portrait.svg.png",
+                               "$base/local-thumb/f/fc/Portrait.svg/337px-Portrait.svg.png",
+                               "$base/local-thumb/f/fc/Portrait.svg/450px-Portrait.svg.png",
+
                                "$base/local-public/math/f/a/5/fa50b8b616463173474302ca3e63586b.png",
                        )
                );
@@ -638,6 +752,11 @@ class NewParserTest extends MediaWikiTestCase {
                                        . "Current configuration is:\n\$wgTexvc = '$wgTexvc'" );
                        }
                }
+               if ( isset( $opts['djvu'] ) ) {
+                       if ( !$this->djVuSupport->isEnabled() ) {
+                               $this->markTestSkipped( "SKIPPED: djvu binaries do not exist or are not executable.\n" );
+                       }
+               }
 
                if ( isset( $opts['pst'] ) ) {
                        $out = $parser->preSaveTransform( $input, $title, $user, $options );
index e5c5cb2..29af2c2 100644 (file)
@@ -29,6 +29,62 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
                $this->assertEquals( $expected, $text );
        }
 
+       public static function provideStripOuterParagraph() {
+               // This mimics the most common use case (stripping paragraphs generated by the parser).
+               $message = new RawMessage( "Message text." );
+
+               return array(
+                       array(
+                               "<p>Text.</p>",
+                               "Text.",
+                       ),
+                       array(
+                               "<p class='foo'>Text.</p>",
+                               "<p class='foo'>Text.</p>",
+                       ),
+                       array(
+                               "<p>Text.\n</p>\n",
+                               "Text.",
+                       ),
+                       array(
+                               "<p>Text.</p><p>More text.</p>",
+                               "<p>Text.</p><p>More text.</p>",
+                       ),
+                       array(
+                               $message->parse(),
+                               "Message text.",
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider provideStripOuterParagraph
+        * @covers Parser::stripOuterParagraph
+        */
+       public function testStripOuterParagraph( $text, $expected ) {
+               $this->assertEquals( $expected, Parser::stripOuterParagraph( $text ) );
+       }
+
+       /**
+        * @expectedException MWException
+        * @expectedExceptionMessage Parser state cleared while parsing. Did you call Parser::parse recursively?
+        * @covers Parser::lock
+        */
+       public function testRecursiveParse() {
+               global $wgParser;
+               $title = Title::newFromText( 'foo' );
+               $po = new ParserOptions;
+               $wgParser->setHook( 'recursivecallparser', array( $this, 'helperParserFunc' ) );
+               $wgParser->parse( '<recursivecallparser>baz</recursivecallparser>', $title, $po );
+       }
+
+       public function helperParserFunc( $input, $args, $parser) {
+               $title = Title::newFromText( 'foo' );
+               $po = new ParserOptions;
+               $parser->parse( $input, $title, $po );
+               return 'bar';
+       }
+
        /**
         * @covers Parser::callParserFunction
         */
@@ -91,5 +147,6 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
                        ),
                ), $out->getSections(), 'getSections() with proper value when <h2> is used' );
        }
-       //@Todo Add tests for cleanSig() / cleanSigInSig(), getSection(), replaceSection(), getPreloadText()
+       // @todo Add tests for cleanSig() / cleanSigInSig(), getSection(),
+       // replaceSection(), getPreloadText()
 }
index cfb3f72..345fd0a 100644 (file)
@@ -16,7 +16,9 @@ class PreprocessorTest extends MediaWikiTestCase {
                global $wgParserConf, $wgContLang;
                parent::setUp();
                $this->mOptions = ParserOptions::newFromUserAndLang( new User, $wgContLang );
-               $name = isset( $wgParserConf['preprocessorClass'] ) ? $wgParserConf['preprocessorClass'] : 'Preprocessor_DOM';
+               $name = isset( $wgParserConf['preprocessorClass'] )
+                       ? $wgParserConf['preprocessorClass']
+                       : 'Preprocessor_DOM';
 
                $this->mPreprocessor = new $name( $this );
        }
@@ -26,6 +28,7 @@ class PreprocessorTest extends MediaWikiTestCase {
        }
 
        public static function provideCases() {
+               // @codingStandardsIgnoreStart Ignore Generic.Files.LineLength.TooLong
                return array(
                        array( "Foo", "<root>Foo</root>" ),
                        array( "<!-- Foo -->", "<root><comment>&lt;!-- Foo --&gt;</comment></root>" ),
@@ -113,6 +116,7 @@ class PreprocessorTest extends MediaWikiTestCase {
                        array( "{{Foo|} Bar=}}", "<root><template><title>Foo</title><part><name>} Bar</name>=<value></value></part></template></root>" ),
                        /* array( file_get_contents( __DIR__ . '/QuoteQuran.txt' ), file_get_contents( __DIR__ . '/QuoteQuranExpanded.txt' ) ), */
                );
+               // @codingStandardsIgnoreEnd
        }
 
        /**
@@ -157,6 +161,7 @@ class PreprocessorTest extends MediaWikiTestCase {
         * These are more complex test cases taken out of wiki articles.
         */
        public static function provideFiles() {
+               // @codingStandardsIgnoreStart Ignore Generic.Files.LineLength.TooLong
                return array(
                        array( "QuoteQuran" ), # http://en.wikipedia.org/w/index.php?title=Template:QuoteQuran/sandbox&oldid=237348988 GFDL + CC BY-SA by Striver
                        array( "Factorial" ), # http://en.wikipedia.org/w/index.php?title=Template:Factorial&oldid=98548758 GFDL + CC BY-SA by Polonium
@@ -164,6 +169,7 @@ class PreprocessorTest extends MediaWikiTestCase {
                        array( "Fundraising" ), # http://tl.wiktionary.org/w/index.php?title=MediaWiki:Sitenotice&oldid=5716 GFDL + CC BY-SA, copied there by Sky Harbor.
                        array( "NestedTemplates" ), # bug 27936
                );
+               // @codingStandardsIgnoreEnd
        }
 
        /**
@@ -190,6 +196,7 @@ class PreprocessorTest extends MediaWikiTestCase {
         * Tests from Bug 28642 · https://bugzilla.wikimedia.org/28642
         */
        public static function provideHeadings() {
+               // @codingStandardsIgnoreStart Ignore Generic.Files.LineLength.TooLong
                return array( /* These should become headings: */
                        array( "== h ==<!--c1-->", "<root><h level=\"2\" i=\"1\">== h ==<comment>&lt;!--c1--&gt;</comment></h></root>" ),
                        array( "== h ==         <!--c1-->", "<root><h level=\"2\" i=\"1\">== h ==       <comment>&lt;!--c1--&gt;</comment></h></root>" ),
@@ -227,6 +234,7 @@ class PreprocessorTest extends MediaWikiTestCase {
                        array( "== h ==<!--c1--> x <!--c2--><!--c3-->  ", "<root>== h ==<comment>&lt;!--c1--&gt;</comment> x <comment>&lt;!--c2--&gt;</comment><comment>&lt;!--c3--&gt;</comment>  </root>" ),
                        array( "== h ==<!--c1--><!--c2--><!--c3--> x ", "<root>== h ==<comment>&lt;!--c1--&gt;</comment><comment>&lt;!--c2--&gt;</comment><comment>&lt;!--c3--&gt;</comment> x </root>" ),
                );
+               // @codingStandardsIgnoreEnd
        }
 
        /**
index 259a9e2..e3c4cc8 100644 (file)
@@ -5,7 +5,13 @@
  */
 class TagHookTest extends MediaWikiTestCase {
        public static function provideValidNames() {
-               return array( array( 'foo' ), array( 'foo-bar' ), array( 'foo_bar' ), array( 'FOO-BAR' ), array( 'foo bar' ) );
+               return array(
+                       array( 'foo' ),
+                       array( 'foo-bar' ),
+                       array( 'foo_bar' ),
+                       array( 'FOO-BAR' ),
+                       array( 'foo bar' )
+               );
        }
 
        public static function provideBadNames() {
@@ -27,7 +33,11 @@ class TagHookTest extends MediaWikiTestCase {
                $parser = new Parser( $wgParserConf );
 
                $parser->setHook( $tag, array( $this, 'tagCallback' ) );
-               $parserOutput = $parser->parse( "Foo<$tag>Bar</$tag>Baz", Title::newFromText( 'Test' ), ParserOptions::newFromUserAndLang( new User, $wgContLang ) );
+               $parserOutput = $parser->parse(
+                       "Foo<$tag>Bar</$tag>Baz",
+                       Title::newFromText( 'Test' ),
+                       ParserOptions::newFromUserAndLang( new User, $wgContLang )
+               );
                $this->assertEquals( "<p>FooOneBaz\n</p>", $parserOutput->getText() );
 
                $parser->mPreprocessor = null; # Break the Parser <-> Preprocessor cycle
@@ -43,7 +53,11 @@ class TagHookTest extends MediaWikiTestCase {
                $parser = new Parser( $wgParserConf );
 
                $parser->setHook( $tag, array( $this, 'tagCallback' ) );
-               $parser->parse( "Foo<$tag>Bar</$tag>Baz", Title::newFromText( 'Test' ), ParserOptions::newFromUserAndLang( new User, $wgContLang ) );
+               $parser->parse(
+                       "Foo<$tag>Bar</$tag>Baz",
+                       Title::newFromText( 'Test' ),
+                       ParserOptions::newFromUserAndLang( new User, $wgContLang )
+               );
                $this->fail( 'Exception not thrown.' );
        }
 
@@ -56,7 +70,11 @@ class TagHookTest extends MediaWikiTestCase {
                $parser = new Parser( $wgParserConf );
 
                $parser->setFunctionTagHook( $tag, array( $this, 'functionTagCallback' ), 0 );
-               $parserOutput = $parser->parse( "Foo<$tag>Bar</$tag>Baz", Title::newFromText( 'Test' ), ParserOptions::newFromUserAndLang( new User, $wgContLang ) );
+               $parserOutput = $parser->parse(
+                       "Foo<$tag>Bar</$tag>Baz",
+                       Title::newFromText( 'Test' ),
+                       ParserOptions::newFromUserAndLang( new User, $wgContLang )
+               );
                $this->assertEquals( "<p>FooOneBaz\n</p>", $parserOutput->getText() );
 
                $parser->mPreprocessor = null; # Break the Parser <-> Preprocessor cycle
@@ -72,7 +90,11 @@ class TagHookTest extends MediaWikiTestCase {
                $parser = new Parser( $wgParserConf );
 
                $parser->setFunctionTagHook( $tag, array( $this, 'functionTagCallback' ), SFH_OBJECT_ARGS );
-               $parser->parse( "Foo<$tag>Bar</$tag>Baz", Title::newFromText( 'Test' ), ParserOptions::newFromUserAndLang( new User, $wgContLang ) );
+               $parser->parse(
+                       "Foo<$tag>Bar</$tag>Baz",
+                       Title::newFromText( 'Test' ),
+                       ParserOptions::newFromUserAndLang( new User, $wgContLang )
+               );
                $this->fail( 'Exception not thrown.' );
        }
 
diff --git a/tests/phpunit/includes/resourceloader/ResourceLoaderLESSTest.php b/tests/phpunit/includes/resourceloader/ResourceLoaderLESSTest.php
new file mode 100644 (file)
index 0000000..75e54d3
--- /dev/null
@@ -0,0 +1,28 @@
+<?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()->compile( $content, $lessFile );
+               $this->assertEquals( $expect, $result );
+       }
+}
index 5b51ef8..c4412de 100644 (file)
@@ -151,6 +151,7 @@ mw.loader.addSource( {
                                                        'test.x.foo',
                                                        'test.x.bar',
                                                        'test.x.util',
+                                                       'test.x.unknown',
                                                ),
                                        ) ),
                                        'test.group.foo.1' => new ResourceLoaderTestModule( array(
@@ -211,7 +212,6 @@ mw.loader.addSource( {
         "test.x.bar",
         "1388534400",
         [
-            "test.x.core",
             "test.x.util"
         ]
     ],
@@ -221,7 +221,7 @@ mw.loader.addSource( {
         [
             "test.x.foo",
             "test.x.bar",
-            "test.x.util"
+            "test.x.unknown"
         ]
     ],
     [
@@ -256,7 +256,10 @@ mw.loader.addSource( {
 
        /**
         * @dataProvider provideGetModuleRegistrations
+        * @covers ResourceLoaderStartupModule::optimizeDependencies
         * @covers ResourceLoaderStartUpModule::getModuleRegistrations
+        * @covers ResourceLoader::makeLoaderSourcesScript
+        * @covers ResourceLoader::makeLoaderRegisterScript
         */
        public function testGetModuleRegistrations( $case ) {
                if ( isset( $case['sources'] ) ) {
index ab0c8d9..d3736f5 100644 (file)
@@ -51,7 +51,8 @@ class ResourceLoaderTest extends ResourceLoaderTestCase {
        /* Test Methods */
 
        /**
-        * Ensures that the ResourceLoaderRegisterModules hook is called when a new ResourceLoader object is constructed
+        * Ensures that the ResourceLoaderRegisterModules hook is called when a new
+        * ResourceLoader object is constructed.
         * @covers ResourceLoader::__construct
         */
        public function testCreatingNewResourceLoaderCallsRegistrationHook() {
diff --git a/tests/phpunit/includes/resourceloader/fixtures/001-embeddable.css b/tests/phpunit/includes/resourceloader/fixtures/001-embeddable.css
new file mode 100644 (file)
index 0000000..b291c5e
--- /dev/null
@@ -0,0 +1,9 @@
+.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
new file mode 100644 (file)
index 0000000..7018aa2
--- /dev/null
@@ -0,0 +1,20 @@
+@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 b0c0f1b..3da1361 100644 (file)
@@ -57,7 +57,11 @@ class SearchEngineTest extends MediaWikiLangTestCase {
                }
 
                $this->insertPage( "Not_Main_Page", "This is not a main page", 0 );
-               $this->insertPage( 'Talk:Not_Main_Page', 'This is not a talk page to the main page, see [[smithee]]', 1 );
+               $this->insertPage(
+                       'Talk:Not_Main_Page',
+                       'This is not a talk page to the main page, see [[smithee]]',
+                       1
+               );
                $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 );
index c5d52d3..15b8865 100644 (file)
@@ -46,9 +46,24 @@ class MediaWikiSiteTest extends SiteTest {
                        // url, filepath, path arg, expected
                        array( 'https://en.wikipedia.org', '/w/$1', 'api.php', 'https://en.wikipedia.org/w/api.php' ),
                        array( 'https://en.wikipedia.org', '/w/', 'api.php', 'https://en.wikipedia.org/w/' ),
-                       array( 'https://en.wikipedia.org', '/foo/page.php?name=$1', 'api.php', 'https://en.wikipedia.org/foo/page.php?name=api.php' ),
-                       array( 'https://en.wikipedia.org', '/w/$1', '', 'https://en.wikipedia.org/w/' ),
-                       array( 'https://en.wikipedia.org', '/w/$1', 'foo/bar/api.php', 'https://en.wikipedia.org/w/foo/bar/api.php' ),
+                       array(
+                               'https://en.wikipedia.org',
+                               '/foo/page.php?name=$1',
+                               'api.php',
+                               'https://en.wikipedia.org/foo/page.php?name=api.php'
+                       ),
+                       array(
+                               'https://en.wikipedia.org',
+                               '/w/$1',
+                               '',
+                               'https://en.wikipedia.org/w/'
+                       ),
+                       array(
+                               'https://en.wikipedia.org',
+                               '/w/$1',
+                               'foo/bar/api.php',
+                               'https://en.wikipedia.org/w/foo/bar/api.php'
+                       ),
                );
        }
 
index 39462b4..f92dc66 100644 (file)
@@ -50,14 +50,14 @@ class QueryAllSpecialPagesTest extends MediaWikiTestCase {
                global $wgDBtype;
 
                foreach ( $this->queryPages as $page ) {
-
                        // With MySQL, skips special pages reopening a temporary table
                        // See http://bugs.mysql.com/bug.php?id=10327
                        if (
                                $wgDBtype === 'mysql'
                                && in_array( $page->getName(), $this->reopensTempTable )
                        ) {
-                               $this->markTestSkipped( "SQL query for page {$page->getName()} can not be tested on MySQL backend (it reopens a temporary table)" );
+                               $this->markTestSkipped( "SQL query for page {$page->getName()} "
+                                       . "can not be tested on MySQL backend (it reopens a temporary table)" );
                                continue;
                        }
 
index 0fbb059..dbebeb7 100644 (file)
@@ -13,14 +13,15 @@ class SpecialSearchTest extends MediaWikiTestCase {
        /**
         * @covers SpecialSearch::load
         * @dataProvider provideSearchOptionsTests
-        * @param array $requested Request parameters. For example array( 'ns5' => true, 'ns6' => true). NULL to use default options.
-        * @param array $userOptions User options to test with. For example array('searchNs5' => 1 );. NULL to use default options.
+        * @param array $requested Request parameters. For example:
+        *   array( 'ns5' => true, 'ns6' => true). Null to use default options.
+        * @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
         */
-       public function testProfileAndNamespaceLoading(
-               $requested, $userOptions, $expectedProfile, $expectedNS,
-               $message = 'Profile name and namespaces mismatches!'
+       public function testProfileAndNamespaceLoading( $requested, $userOptions,
+               $expectedProfile, $expectedNS, $message = 'Profile name and namespaces mismatches!'
        ) {
                $context = new RequestContext;
                $context->setUser(
index ac3e41e..1e5aca9 100644 (file)
@@ -89,7 +89,14 @@ class MediaWikiTitleCodecTest extends MediaWikiTestCase {
                        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' ),
                        array( false, 'Hansi_Maier', '', 'en', 'Hansi Maier' ),
-                       array( NS_USER_TALK, 'hansi__maier', '', 'en', 'User talk:hansi  maier', 'User talk:Hansi maier' ),
+                       array(
+                               NS_USER_TALK,
+                               'hansi__maier',
+                               '',
+                               'en',
+                               'User talk:hansi  maier',
+                               'User talk:Hansi maier'
+                       ),
 
                        // getGenderCache() provides a mock that considers first
                        // names ending in "a" to be female.
@@ -112,7 +119,11 @@ class MediaWikiTitleCodecTest extends MediaWikiTestCase {
 
                // test round trip
                $parsed = $codec->parseTitle( $actual, NS_MAIN );
-               $actual2 = $codec->formatTitle( $parsed->getNamespace(), $parsed->getText(), $parsed->getFragment() );
+               $actual2 = $codec->formatTitle(
+                       $parsed->getNamespace(),
+                       $parsed->getText(),
+                       $parsed->getFragment()
+               );
 
                $this->assertEquals( $normalized, $actual2, 'normalized after round trip' );
        }
index 879d821..7125247 100644 (file)
@@ -23,7 +23,9 @@ class UploadFromUrlTest extends ApiTestCase {
                }
        }
 
-       protected function doApiRequest( array $params, array $unused = null, $appendModule = false, User $user = null ) {
+       protected function doApiRequest( array $params, array $unused = null,
+               $appendModule = false, User $user = null
+       ) {
                $sessionId = session_id();
                session_write_close();
 
@@ -203,7 +205,10 @@ class UploadFromUrlTest extends ApiTestCase {
                        $page->doDeleteArticle( '' );
                }
 
-               $this->assertFalse( (bool)$talk->getArticleID( Title::GAID_FOR_UPDATE ), 'User talk does not exist' );
+               $this->assertFalse(
+                       (bool)$talk->getArticleID( Title::GAID_FOR_UPDATE ),
+                       'User talk does not exist'
+               );
 
                $this->doApiRequest( array(
                        'action' => 'upload',
@@ -236,7 +241,10 @@ class UploadFromUrlTest extends ApiTestCase {
                        ) );
                } catch ( UsageException $e ) {
                        $exception = true;
-                       $this->assertEquals( 'Using leavemessage without ignorewarnings is not supported', $e->getMessage() );
+                       $this->assertEquals(
+                               'Using leavemessage without ignorewarnings is not supported',
+                               $e->getMessage()
+                       );
                }
                $this->assertTrue( $exception );
 
index 1f60293..022f998 100755 (executable)
@@ -20,7 +20,8 @@ else if ( has_binary pear ); then
     pear channel-discover components.ez.no
     pear channel-discover pear.symfony.com
     pear update-channels
-    pear install --alldeps phpunit/PHPUnit
+    #Temporary fix for 64597
+    pear install --alldeps phpunit/PHPUnit-3.7.35
 else if ( has_binary apt-get ); then
     echo Installing phpunit with apt-get
     apt-get install phpunit
index dbdb588..4dd5cdd 100644 (file)
@@ -1,6 +1,8 @@
 <?php
 
+// @codingStandardsIgnoreStart Ignore Squiz.Classes.ValidClassName.NotCamelCaps
 class LanguageBe_taraskTest extends LanguageClassesTestCase {
+       // @codingStandardsIgnoreEnd
        /**
         * Make sure the language code we are given is indeed
         * be-tarask. This is to ensure LanguageClassesTestCase
index 0b2612b..b89b4df 100644 (file)
@@ -10,7 +10,7 @@ class LanguageGdTest extends LanguageClassesTestCase {
        /**
         * @dataProvider providerPlural
         * @covers Language::convertPlural
-       */
+        */
        public function testPlural( $result, $value ) {
                $forms = array( 'one', 'two', 'few', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
index 8edc6dd..c382244 100644 (file)
@@ -17,7 +17,7 @@ class LanguageHeTest extends LanguageClassesTestCase {
         * which is very rare. It also has a mistake, because
         * the number 10 itself is supposed to be just plural,
         * so currently it's overridden in MediaWiki.
-       */
+        */
 
        // @todo the below test*PluralForms test methods can be refactored
        //  to use a single test method and data provider..
index 8f8a8b5..a4ef06d 100644 (file)
@@ -16,7 +16,7 @@ class LanguageTest extends LanguageClassesTestCase {
        }
 
        /**
-        * @dataProvider provideFormattableTimes#
+        * @dataProvider provideFormattableTimes
         * @covers Language::formatTimePeriod
         */
        public function testFormatTimePeriod( $seconds, $format, $expected, $desc ) {
@@ -412,7 +412,10 @@ class LanguageTest extends LanguageClassesTestCase {
                        array( 'fr-Latn-F', 'region too short' ),
                        array( 'a-value', 'language too short with region' ),
                        array( 'tlh-a-b-foo', 'valid three-letter with wrong variant' ),
-                       array( 'i-notexist', 'grandfathered but not registered: invalid, even if we only test well-formedness' ),
+                       array(
+                               'i-notexist',
+                               'grandfathered but not registered: invalid, even if we only test well-formedness'
+                       ),
                        array( 'abcdefghi-012345678', 'numbers too long' ),
                        array( 'ab-abc-abc-abc-abc', 'invalid extensions' ),
                        array( 'ab-abcd-abc', 'invalid extensions' ),
@@ -508,12 +511,14 @@ class LanguageTest extends LanguageClassesTestCase {
         */
        public function testKnownCldrLanguageTag() {
                if ( !class_exists( 'LanguageNames' ) ) {
-                       $this->markTestSkipped( 'The LanguageNames class is not available. The cldr extension is probably not installed.' );
+                       $this->markTestSkipped( 'The LanguageNames class is not available. '
+                               . 'The CLDR extension is probably not installed.' );
                }
 
                $this->assertTrue(
                        (bool)Language::isKnownLanguageTag( 'pal' ),
-                       'validating code "pal" an ancient language, which probably will not appear in Names.php, but appears in CLDR in English'
+                       'validating code "pal" an ancient language, which probably will '
+                               . 'not appear in Names.php, but appears in CLDR in English'
                );
        }
 
@@ -658,7 +663,8 @@ class LanguageTest extends LanguageClassesTestCase {
                                '2009-W53-4',
                                'leap week'
                        ),
-                       // What follows is mostly copied from https://www.mediawiki.org/wiki/Help:Extension:ParserFunctions#.23time
+                       // What follows is mostly copied from
+                       // https://www.mediawiki.org/wiki/Help:Extension:ParserFunctions#.23time
                        array(
                                'Y',
                                '20120102090705',
@@ -1284,6 +1290,7 @@ class LanguageTest extends LanguageClassesTestCase {
        }
 
        public static function provideCheckTitleEncodingData() {
+               // @codingStandardsIgnoreStart Ignore Generic.Files.LineLength.TooLong
                return array(
                        array( "" ),
                        array( "United States of America" ), // 7bit ASCII
@@ -1334,6 +1341,7 @@ class LanguageTest extends LanguageClassesTestCase {
                                )
                        )
                );
+               // @codingStandardsIgnoreEnd
        }
 
        /**
@@ -1464,7 +1472,11 @@ class LanguageTest extends LanguageClassesTestCase {
                        array( array( 'formatDuration', 1023 * 60 * 60 ), '1023 hours', 'relative' ),
                        array( array( 'formatDuration', -1023 ), '-1023 seconds', 'negative relative' ),
                        array( array( 'formatDuration', 0 ), 'now', 'now' ),
-                       array( array( 'timeanddate', '20120102070000' ), '2012-1-1 7:00 +1 day', 'mixed, handled as absolute' ),
+                       array(
+                               array( 'timeanddate', '20120102070000' ),
+                               '2012-1-1 7:00 +1 day',
+                               'mixed, handled as absolute'
+                       ),
                        array( array( 'timeanddate', '19910203040506' ), '1991-2-3 4:05:06', 'absolute' ),
                        array( array( 'timeanddate', '19700101000000' ), '1970-1-1 0:00:00', 'absolute at epoch' ),
                        array( array( 'timeanddate', '19691231235959' ), '1969-12-31 23:59:59', 'time before epoch' ),
@@ -1472,6 +1484,29 @@ class LanguageTest extends LanguageClassesTestCase {
                );
        }
 
+       /**
+        * @dataProvider parseFormattedNumberProvider
+        */
+       public function testParseFormattedNumber( $langCode, $number ) {
+               $lang = Language::factory( $langCode );
+
+               $localisedNum = $lang->formatNum( $number );
+               $normalisedNum = $lang->parseFormattedNumber( $localisedNum );
+
+               $this->assertEquals( $number, $normalisedNum );
+       }
+
+       public function parseFormattedNumberProvider() {
+               return array(
+                       array( 'de', 377.01 ),
+                       array( 'fa', 334 ),
+                       array( 'fa', 382.772 ),
+                       array( 'ar', 1844 ),
+                       array( 'lzh', 3731 ),
+                       array( 'zh-classical', 7432 )
+               );
+       }
+
        /**
         * @covers Language::commafy()
         * @dataProvider provideCommafyData
@@ -1555,10 +1590,12 @@ class LanguageTest extends LanguageClassesTestCase {
        public static function provideGetParentLanguage() {
                return array(
                        array( 'zh-cn', 'zh', 'zh is the parent language of zh-cn' ),
-                       array( 'zh', 'zh', 'zh is defined as the parent language of zh, because zh converter can convert zh-cn to zh' ),
+                       array( 'zh', 'zh', 'zh is defined as the parent language of zh, '
+                               . 'because zh converter can convert zh-cn to zh' ),
                        array( 'zh-invalid', null, 'do not be fooled by arbitrarily composed language codes' ),
                        array( 'en-gb', null, 'en does not have converter' ),
-                       array( 'en', null, 'en does not have converter. Although FakeConverter handles en -> en conversion but it is useless' ),
+                       array( 'en', null, 'en does not have converter. Although FakeConverter '
+                                       . 'handles en -> en conversion but it is useless' ),
                );
        }
 
index 71d32c3..8e3b114 100644 (file)
@@ -110,7 +110,9 @@ class CLDRPluralRuleEvaluatorTest extends MediaWikiTestCase {
 
                        # Revision 33 samples
                        # expected, rule, number, comment
+                       // @codingStandardsIgnoreStart Ignore Generic.Files.LineLength.TooLong
                        array( 0, 'n in 1,3,5@integer 3~10, 103~110, 1003, … @decimal 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 103.0, 1003.0, …', 3, 'samples' ),
+                       // @codingStandardsIgnoreEnd
 
                        # Revision 33 some test cases from CLDR
                        array( 0, 'i = 1 and v = 0 or i = 0 and t = 1', '0.1', 'pt one' ),
@@ -122,6 +124,7 @@ class CLDRPluralRuleEvaluatorTest extends MediaWikiTestCase {
                        array( 1, 'i = 1 and v = 0 or i = 0 and t = 1', '0.2', 'pt other' ),
                        array( 1, 'i = 1 and v = 0 or i = 0 and t = 1', '10.0', 'pt other' ),
                        array( 1, 'i = 1 and v = 0 or i = 0 and t = 1', '100.0', 'pt other' ),
+                       // @codingStandardsIgnoreStart Ignore Generic.Files.LineLength.TooLong
                        array( 0, 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14', '2', 'bs few' ),
                        array( 0, 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14', '4', 'bs few' ),
                        array( 0, 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14', '22', 'bs few' ),
@@ -130,7 +133,7 @@ class CLDRPluralRuleEvaluatorTest extends MediaWikiTestCase {
                        array( 0, 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14', '0.4', 'bs few' ),
                        array( 0, 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14', '10.2', 'bs few' ),
                        array( 1, 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14', '10.0', 'bs other' ),
-
+                       // @codingStandardsIgnoreEnd
                );
 
                return $tests;
index 7d193f8..4f0d24f 100644 (file)
@@ -35,16 +35,22 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
         * @throws MWExcepion
         */
        protected function addRevision( Page $page, $text, $summary ) {
-               $status = $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), $summary );
+               $status = $page->doEditContent(
+                       ContentHandler::makeContent( $text, $page->getTitle() ),
+                       $summary
+               );
+
                if ( $status->isGood() ) {
                        $value = $status->getValue();
                        $revision = $value['revision'];
                        $revision_id = $revision->getId();
                        $text_id = $revision->getTextId();
+
                        if ( ( $revision_id > 0 ) && ( $text_id > 0 ) ) {
                                return array( $revision_id, $text_id );
                        }
                }
+
                throw new MWException( "Could not determine revision id (" . $status->getWikiText() . ")" );
        }
 
@@ -105,7 +111,10 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
                $this->assertEquals( '', array_pop( $lines ), "Output ends in LF" );
                $timestamp_re = "[0-9]{4}-[01][0-9]-[0-3][0-9] [0-2][0-9]:[0-5][0-9]:[0-6][0-9]";
                foreach ( $lines as $line ) {
-                       $this->assertRegExp( "/$timestamp_re: .* \(ID [0-9]+\) [0-9]* pages .*, [0-9]* revs .*, ETA/", $line );
+                       $this->assertRegExp(
+                               "/$timestamp_re: .* \(ID [0-9]+\) [0-9]* pages .*, [0-9]* revs .*, ETA/",
+                               $line
+                       );
                }
        }
 
@@ -234,7 +243,7 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
         *
         * @param string $name The name of the element to check for
         *   (e.g.: "mediawiki" for <mediawiki>...</mediawiki>)
-        * @param string|false $text If string, check if it equals the elements text.
+        * @param string|bool $text If string, check if it equals the elements text.
         *   If false, ignore the element's text
         * @param bool $skip_ws (optional) if true, skip past white spaces that trail the
         *   closing element.
@@ -299,7 +308,8 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
         * @param string $format The expected format model id (default: CONTENT_FORMAT_WIKITEXT)
         * @param int|bool $parentid (optional) id of the parent revision
         */
-       protected function assertRevision( $id, $summary, $text_id, $text_bytes, $text_sha1, $text = false, $parentid = false,
+       protected function assertRevision( $id, $summary, $text_id, $text_bytes,
+               $text_sha1, $text = false, $parentid = false,
                $model = CONTENT_MODEL_WIKITEXT, $format = CONTENT_FORMAT_WIKITEXT
        ) {
                $this->assertNodeStart( "revision" );
index 904f12f..744cf61 100644 (file)
@@ -151,6 +151,7 @@ class BaseDumpTest extends MediaWikiTestCase {
                $fname = $this->getNewTempFile();
 
                // The header of every prefetch file
+               // @codingStandardsIgnoreStart Ignore Generic.Files.LineLength.TooLong
                $header = '<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.7/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.7/ http://www.mediawiki.org/xml/export-0.7.xsd" version="0.7" xml:lang="en">
   <siteinfo>
     <sitename>wikisvn</sitename>
@@ -179,6 +180,7 @@ class BaseDumpTest extends MediaWikiTestCase {
     </namespaces>
   </siteinfo>
 ';
+               // @codingStandardsIgnoreEnd
 
                // An array holding the pages that are available for prefetch
                $available_pages = array();
index a763071..016b7e0 100644 (file)
@@ -389,7 +389,12 @@ class TextPassDumperTest extends DumpTestCase {
                $this->assertEmpty( $files, "Remaining unchecked files" );
 
                // ... and have dealt with more than one checkpoint file
-               $this->assertGreaterThan( 1, $checkpointFiles, "expected more than 1 checkpoint to have been created. Checkpoint interval is $checkpointAfter seconds, maybe your computer is too fast?" );
+               $this->assertGreaterThan(
+                       1,
+                       $checkpointFiles,
+                       "expected more than 1 checkpoint to have been created. "
+                               . "Checkpoint interval is $checkpointAfter seconds, maybe your computer is too fast?"
+               );
 
                $this->expectETAOutput();
        }
index 6963601..0cb0cdb 100644 (file)
@@ -137,7 +137,11 @@ class BackupDumperPageTest extends DumpTestCase {
                // -> Page is marked deleted. Hence not visible
 
                // Page 4
-               $this->assertPageStart( $this->pageId4, $this->talk_namespace, $this->pageTitle4->getPrefixedText() );
+               $this->assertPageStart(
+                       $this->pageId4,
+                       $this->talk_namespace,
+                       $this->pageTitle4->getPrefixedText()
+               );
                $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
                        $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe",
                        "Talk about BackupDumperTestP1 Text1" );
@@ -183,7 +187,11 @@ class BackupDumperPageTest extends DumpTestCase {
                // -> Page is marked deleted. Hence not visible
 
                // Page 4
-               $this->assertPageStart( $this->pageId4, $this->talk_namespace, $this->pageTitle4->getPrefixedText() );
+               $this->assertPageStart(
+                       $this->pageId4,
+                       $this->talk_namespace,
+                       $this->pageTitle4->getPrefixedText()
+               );
                $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
                        $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
                $this->assertPageEnd();
@@ -222,7 +230,11 @@ class BackupDumperPageTest extends DumpTestCase {
                // -> Page is marked deleted. Hence not visible
 
                // Page 4
-               $this->assertPageStart( $this->pageId4, $this->talk_namespace, $this->pageTitle4->getPrefixedText() );
+               $this->assertPageStart(
+                       $this->pageId4,
+                       $this->talk_namespace,
+                       $this->pageTitle4->getPrefixedText()
+               );
                $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
                        $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
                $this->assertPageEnd();
@@ -264,7 +276,11 @@ class BackupDumperPageTest extends DumpTestCase {
                // -> Page is marked deleted. Hence not visible
 
                // Page 4
-               $this->assertPageStart( $this->pageId4, $this->talk_namespace, $this->pageTitle4->getPrefixedText() );
+               $this->assertPageStart(
+                       $this->pageId4,
+                       $this->talk_namespace,
+                       $this->pageTitle4->getPrefixedText()
+               );
                $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
                        $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
                $this->assertPageEnd();
@@ -339,7 +355,11 @@ class BackupDumperPageTest extends DumpTestCase {
                // -> Page is marked deleted. Hence not visible
 
                // Page 4
-               $this->assertPageStart( $this->pageId4, $this->talk_namespace, $this->pageTitle4->getPrefixedText() );
+               $this->assertPageStart(
+                       $this->pageId4,
+                       $this->talk_namespace,
+                       $this->pageTitle4->getPrefixedText()
+               );
                $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
                        $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
                $this->assertPageEnd();
@@ -367,7 +387,11 @@ class BackupDumperPageTest extends DumpTestCase {
                // -> Page is marked deleted. Hence not visible
 
                // Page 4
-               $this->assertPageStart( $this->pageId4, $this->talk_namespace, $this->pageTitle4->getPrefixedText() );
+               $this->assertPageStart(
+                       $this->pageId4,
+                       $this->talk_namespace,
+                       $this->pageTitle4->getPrefixedText()
+               );
                $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
                        $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
                $this->assertPageEnd();
index 2e47e0c..8c40ffe 100644 (file)
@@ -105,15 +105,21 @@ class FetchTextTest extends MediaWikiTestCase {
         * @throws MWExcepion
         */
        private function addRevision( $page, $text, $summary ) {
-               $status = $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), $summary );
+               $status = $page->doEditContent(
+                       ContentHandler::makeContent( $text, $page->getTitle() ),
+                       $summary
+               );
+
                if ( $status->isGood() ) {
                        $value = $status->getValue();
                        $revision = $value['revision'];
                        $id = $revision->getTextId();
+
                        if ( $id > 0 ) {
                                return $id;
                        }
                }
+
                throw new MWException( "Could not determine text id" );
        }
 
@@ -127,14 +133,34 @@ class FetchTextTest extends MediaWikiTestCase {
                try {
                        $title = Title::newFromText( 'FetchTextTestPage1', $wikitextNamespace );
                        $page = WikiPage::factory( $title );
-                       $this->textId1 = $this->addRevision( $page, "FetchTextTestPage1Text1", "FetchTextTestPage1Summary1" );
+                       $this->textId1 = $this->addRevision(
+                               $page,
+                               "FetchTextTestPage1Text1",
+                               "FetchTextTestPage1Summary1"
+                       );
 
                        $title = Title::newFromText( 'FetchTextTestPage2', $wikitextNamespace );
                        $page = WikiPage::factory( $title );
-                       $this->textId2 = $this->addRevision( $page, "FetchTextTestPage2Text1", "FetchTextTestPage2Summary1" );
-                       $this->textId3 = $this->addRevision( $page, "FetchTextTestPage2Text2", "FetchTextTestPage2Summary2" );
-                       $this->textId4 = $this->addRevision( $page, "FetchTextTestPage2Text3", "FetchTextTestPage2Summary3" );
-                       $this->textId5 = $this->addRevision( $page, "FetchTextTestPage2Text4 some additional Text  ", "FetchTextTestPage2Summary4 extra " );
+                       $this->textId2 = $this->addRevision(
+                               $page,
+                               "FetchTextTestPage2Text1",
+                               "FetchTextTestPage2Summary1"
+                       );
+                       $this->textId3 = $this->addRevision(
+                               $page,
+                               "FetchTextTestPage2Text2",
+                               "FetchTextTestPage2Summary2"
+                       );
+                       $this->textId4 = $this->addRevision(
+                               $page,
+                               "FetchTextTestPage2Text3",
+                               "FetchTextTestPage2Summary3"
+                       );
+                       $this->textId5 = $this->addRevision(
+                               $page,
+                               "FetchTextTestPage2Text4 some additional Text  ",
+                               "FetchTextTestPage2Summary4 extra "
+                       );
                } catch ( Exception $e ) {
                        // We'd love to pass $e directly. However, ... see
                        // documentation of exceptionFromAddDBData
diff --git a/tests/phpunit/mocks/media/MockDjVuHandler.php b/tests/phpunit/mocks/media/MockDjVuHandler.php
new file mode 100644 (file)
index 0000000..31cb13d
--- /dev/null
@@ -0,0 +1,49 @@
+<?php
+/**
+ * Fake handler for DjVu images.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Media
+ */
+
+class MockDjVuHandler extends DjVuHandler {
+       function doTransform( $image, $dstPath, $dstUrl, $params, $flags = 0 ) {
+               if ( !$this->normaliseParams( $image, $params ) ) {
+                       return new TransformParameterError( $params );
+               }
+               $width = $params['width'];
+               $height = $params['height'];
+               $page = $params['page'];
+               if ( $page > $this->pageCount( $image ) ) {
+                       return new MediaTransformError(
+                               'thumbnail_error',
+                               $width,
+                               $height,
+                               wfMessage( 'djvu_page_error' )->text()
+                       );
+               }
+
+               $params = array(
+                       'width' => $width,
+                       'height' => $height,
+                       'page' => $page
+               );
+
+               return new ThumbnailImage( $image, $dstUrl, $dstPath, $params );
+       }
+}
index 8e2bc03..d2a4132 100755 (executable)
@@ -6,7 +6,8 @@
  * @file
  */
 
-// Set a flag which can be used to detect when other scripts have been entered through this entry point or not
+// Set a flag which can be used to detect when other scripts have been entered
+// through this entry point or not.
 define( 'MW_PHPUNIT_TEST', true );
 
 // Start up MediaWiki in command-line mode
@@ -16,8 +17,10 @@ class PHPUnitMaintClass extends Maintenance {
 
        public function __construct() {
                parent::__construct();
-               $this->addOption( 'with-phpunitdir',
-                       'Directory to include PHPUnit from, for example when using a git fetchout from upstream. Path will be prepended to PHP `include_path`.',
+               $this->addOption(
+                       'with-phpunitdir',
+                       'Directory to include PHPUnit from, for example when using a git '
+                               . 'fetchout from upstream. Path will be prepended to PHP `include_path`.',
                        false, # not required
                        true # need arg
                );
@@ -57,6 +60,8 @@ class PHPUnitMaintClass extends Maintenance {
                                return false;
                        }
                );
+               // xdebug's default of 100 is too low for MediaWiki
+               ini_set( 'xdebug.max_nesting_level', 1000 );
        }
 
        public function execute() {
@@ -91,6 +96,33 @@ class PHPUnitMaintClass extends Maintenance {
                        unset( $_SERVER['argv'][$key + 1] ); // its value
                        $_SERVER['argv'] = array_values( $_SERVER['argv'] );
                }
+
+               if ( !wfIsWindows() ) {
+                       # If we are not running on windows then we can enable phpunit colors
+                       # Windows does not come anymore with ANSI.SYS loaded by default
+                       # PHPUnit uses the suite.xml parameters to enable/disable colors
+                       # which can be then forced to be enabled with --colors.
+                       # The below code injects a parameter just like if the user called
+                       # Probably fix bug 29226
+                       $key = array_search( '--colors', $_SERVER['argv'] );
+                       if( $key === false ) {
+                               array_splice( $_SERVER['argv'], 1, 0, '--colors' );
+                       }
+               }
+
+               # Makes MediaWiki PHPUnit directory includable so the PHPUnit will
+               # be able to resolve relative files inclusion such as suites/*
+               # PHPUnit uses stream_resolve_include_path() internally
+               # See bug 32022
+               $key = array_search( '--include-path', $_SERVER['argv'] );
+               if( $key === false ) {
+                       array_splice( $_SERVER['argv'], 1, 0,
+                               __DIR__
+                               . PATH_SEPARATOR
+                               . get_include_path()
+                       );
+                       array_splice( $_SERVER['argv'], 1, 0, '--include-path' );
+               }
        }
 
        public function getDbType() {
index be18a49..12f147e 100644 (file)
@@ -10,9 +10,13 @@ class AutoLoaderTest extends MediaWikiTestCase {
                $this->testLocalClasses = array(
                        'TestAutoloadedLocalClass' => __DIR__ . '/../data/autoloader/TestAutoloadedLocalClass.php',
                        'TestAutoloadedCamlClass' => __DIR__ . '/../data/autoloader/TestAutoloadedCamlClass.php',
-                       'TestAutoloadedSerializedClass' => __DIR__ . '/../data/autoloader/TestAutoloadedSerializedClass.php',
+                       'TestAutoloadedSerializedClass' =>
+                               __DIR__ . '/../data/autoloader/TestAutoloadedSerializedClass.php',
+               );
+               $this->setMwGlobals(
+                       'wgAutoloadLocalClasses',
+                       $this->testLocalClasses + $wgAutoloadLocalClasses
                );
-               $this->setMwGlobals( 'wgAutoloadLocalClasses', $this->testLocalClasses + $wgAutoloadLocalClasses );
                AutoLoader::resetAutoloadLocalClassesLower();
 
                $this->testExtensionClasses = array(
index cfcc771..d7742a6 100644 (file)
@@ -31,7 +31,10 @@ class ResourcesTest extends MediaWikiTestCase {
        public function testStyleMedia( $moduleName, $media, $filename, $css ) {
                $cssText = CSSMin::minify( $css->cssText );
 
-               $this->assertTrue( strpos( $cssText, '@media' ) === false, 'Stylesheets should not both specify "media" and contain @media' );
+               $this->assertTrue(
+                       strpos( $cssText, '@media' ) === false,
+                       'Stylesheets should not both specify "media" and contain @media'
+               );
        }
 
        public function testDependencies() {
index 2393299..f5cd892 100644 (file)
@@ -21,6 +21,7 @@ class StructureTest extends MediaWikiTestCase {
                        'ApiQueryTestBase',
                        'ApiQueryContinueTestBase',
                        'MediaWikiLangTestCase',
+                       'MediaWikiMediaTestCase',
                        'MediaWikiTestCase',
                        'ResourceLoaderTestCase',
                        'PHPUnit_Framework_TestCase',
index 3b0bf6b..574c11e 100644 (file)
@@ -1,8 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
-<!-- colors don't work on Windows! -->
+<!--
+Colors don't work on Windows!
+phpunit.php enables colors for other OSs at runtime
+-->
 <phpunit bootstrap="./bootstrap.php"
-       colors="true"
+       colors="false"
        backupGlobals="false"
        convertErrorsToExceptions="true"
        convertNoticesToExceptions="true"
index 7f41e52..4d24d9d 100644 (file)
@@ -1,7 +1,8 @@
 <?php
 /**
  * This test suite runs unit tests registered by extensions.
- * See https://www.mediawiki.org/wiki/Manual:Hooks/UnitTestsList for details of how to register your tests.
+ * See https://www.mediawiki.org/wiki/Manual:Hooks/UnitTestsList for details of
+ * how to register your tests.
  */
 
 class ExtensionsTestSuite extends PHPUnit_Framework_TestSuite {
index cb9fa07..b2b5322 100644 (file)
@@ -44,6 +44,7 @@ return array(
        'test.mediawiki.qunit.suites' => array(
                'scripts' => array(
                        'tests/qunit/suites/resources/startup.test.js',
+                       'tests/qunit/suites/resources/jquery/jquery.accessKeyLabel.test.js',
                        'tests/qunit/suites/resources/jquery/jquery.autoEllipsis.test.js',
                        'tests/qunit/suites/resources/jquery/jquery.byteLength.test.js',
                        'tests/qunit/suites/resources/jquery/jquery.byteLimit.test.js',
@@ -70,13 +71,16 @@ return array(
                        'tests/qunit/suites/resources/mediawiki/mediawiki.user.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js',
                        'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.test.js',
+                       'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.category.test.js',
                        'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.parse.test.js',
                        'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.watch.test.js',
                        'tests/qunit/suites/resources/mediawiki.special/mediawiki.special.recentchanges.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.language.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.cldr.test.js',
+                       'tests/qunit/suites/resources/mediawiki/mediawiki.cookie.test.js',
                ),
                'dependencies' => array(
+                       'jquery.accessKeyLabel',
                        'jquery.autoEllipsis',
                        'jquery.byteLength',
                        'jquery.byteLimit',
@@ -94,6 +98,7 @@ return array(
                        'jquery.tablesorter',
                        'jquery.textSelection',
                        'mediawiki.api',
+                       'mediawiki.api.category',
                        'mediawiki.api.parse',
                        'mediawiki.api.watch',
                        'mediawiki.jqueryMsg',
@@ -105,6 +110,7 @@ return array(
                        'mediawiki.special.recentchanges',
                        'mediawiki.language',
                        'mediawiki.cldr',
+                       'mediawiki.cookie',
                        'test.mediawiki.qunit.testrunner',
                ),
        )
diff --git a/tests/qunit/suites/resources/jquery/jquery.accessKeyLabel.test.js b/tests/qunit/suites/resources/jquery/jquery.accessKeyLabel.test.js
new file mode 100644 (file)
index 0000000..f6ea1b4
--- /dev/null
@@ -0,0 +1,108 @@
+( function ( $ ) {
+       QUnit.module( 'jquery.accessKeyLabel', QUnit.newMwEnvironment( {
+               messages: {
+                       'brackets': '[$1]',
+                       'word-separator': ' '
+               }
+       } ) );
+
+       var getAccessKeyPrefixTestData = [
+                       //ua string, platform string, expected prefix
+                       // Internet Explorer
+                       ['Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)', 'Win32', 'alt-'],
+                       ['Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)', 'Win32', 'alt-'],
+                       ['Mozilla/5.0 (Windows NT 6.3; Win64; x64; Trident/7.0; rv:11.0) like Gecko', 'Win64', 'alt-'],
+                       // Firefox
+                       ['Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1.19) Gecko/20110420 Firefox/3.5.19', 'MacIntel', 'ctrl-'],
+                       ['Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.17) Gecko/20110422 Ubuntu/10.10 (maverick) Firefox/3.6.17', 'Linux i686', 'alt-shift-'],
+                       ['Mozilla/5.0 (Windows NT 6.0; rv:2.0.1) Gecko/20100101 Firefox/4.0.1', 'Win32', 'alt-shift-'],
+                       // Safari / Konqueror
+                       ['Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; nl-nl) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7', 'MacIntel', 'ctrl-alt-'],
+                       ['Mozilla/5.0 (Windows; U; Windows NT 6.0; cs-CZ) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7', 'Win32', 'alt-'],
+                       ['Mozilla/5.0 (X11; Linux i686) KHTML/4.9.1 (like Gecko) Konqueror/4.9', 'Linux i686', 'ctrl-'],
+                       // Opera
+                       ['Opera/9.80 (Windows NT 5.1)', 'Win32', 'shift-esc-'],
+                       ['Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.52 Safari/537.36 OPR/15.0.1147.130', 'Win32', 'shift-esc-'],
+                       // Chrome
+                       ['Mozilla/5.0 (Macintosh; Intel Mac OS X 10_5_8) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.112 Safari/534.30', 'MacIntel', 'ctrl-option-'],
+                       ['Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.68 Safari/534.30', 'Linux i686', 'alt-shift-']
+               ],
+               //strings appended to title to make sure updateTooltipAccessKeys handles them correctly
+               updateTooltipAccessKeysTestData = [ '', ' [a]', ' [test-a]', ' [alt-b]' ];
+
+       function makeInput( title, accessKey ) {
+               //The properties aren't escaped, so make sure you don't call this function with values that need to be escaped!
+               return '<input title="' + title + '" ' + ( accessKey ? 'accessKey="' + accessKey + '" ' : '' ) + ' />';
+       }
+
+       QUnit.test( 'getAccessKeyPrefix', getAccessKeyPrefixTestData.length, function ( assert ) {
+               var i;
+               for ( i = 0; i < getAccessKeyPrefixTestData.length; i++ ) {
+                       assert.equal( $.fn.updateTooltipAccessKeys.getAccessKeyPrefix( {
+                               userAgent: getAccessKeyPrefixTestData[i][0],
+                               platform: getAccessKeyPrefixTestData[i][1]
+                       } ), getAccessKeyPrefixTestData[i][2], 'Correct prefix for ' + getAccessKeyPrefixTestData[i][0] );
+               }
+       } );
+
+       QUnit.test( 'updateTooltipAccessKeys - current browser', 2, function ( assert ) {
+               var title = $( makeInput ( 'Title', 'a' ) ).updateTooltipAccessKeys().prop( 'title' ),
+                       //The new title should be something like "Title [alt-a]", but the exact label will depend on the browser.
+                       //The "a" could be capitalized, and the prefix could be anything, e.g. a simple "^" for ctrl-
+                       //(no browser is known using such a short prefix, though) or "Alt+Umschalt+" in German Firefox.
+                       result = /^Title \[(.+)[aA]\]$/.exec( title );
+               assert.ok( result, 'title should match expected structure.' );
+               assert.notEqual( result[1], 'test-', 'Prefix used for testing shouldn\'t be used in production.' );
+       } );
+
+       QUnit.test( 'updateTooltipAccessKeys - no access key', updateTooltipAccessKeysTestData.length, function ( assert ) {
+               var i, oldTitle, $input, newTitle;
+               for ( i = 0; i < updateTooltipAccessKeysTestData.length; i++ ) {
+                       oldTitle = 'Title' + updateTooltipAccessKeysTestData[i];
+                       $input = $( makeInput( oldTitle ) );
+                       $( '#qunit-fixture' ).append( $input );
+                       newTitle = $input.updateTooltipAccessKeys().prop( 'title' );
+                       assert.equal( newTitle, 'Title', 'title="' + oldTitle + '"' );
+               }
+       } );
+
+       QUnit.test( 'updateTooltipAccessKeys - with access key', updateTooltipAccessKeysTestData.length, function ( assert ) {
+               $.fn.updateTooltipAccessKeys.setTestMode( true );
+               var i, oldTitle, $input, newTitle;
+               for ( i = 0; i < updateTooltipAccessKeysTestData.length; i++ ) {
+                       oldTitle = 'Title' + updateTooltipAccessKeysTestData[i];
+                       $input = $( makeInput( oldTitle, 'a' ) );
+                       $( '#qunit-fixture' ).append( $input );
+                       newTitle = $input.updateTooltipAccessKeys().prop( 'title' );
+                       assert.equal( newTitle, 'Title [test-a]', 'title="' + oldTitle + '"' );
+               }
+               $.fn.updateTooltipAccessKeys.setTestMode( false );
+       } );
+
+       QUnit.test( 'updateTooltipAccessKeys with label element', 2, function ( assert ) {
+               $.fn.updateTooltipAccessKeys.setTestMode( true );
+               var html = '<label for="testInput" title="Title">Label</label><input id="testInput" accessKey="a" />',
+                       $label, $input;
+               $( '#qunit-fixture' ).html( html );
+               $label = $( '#qunit-fixture label' );
+               $input = $( '#qunit-fixture input' );
+               $input.updateTooltipAccessKeys();
+               assert.equal( $input.prop( 'title' ), '', 'No title attribute added to input element.' );
+               assert.equal( $label.prop( 'title' ), 'Title [test-a]', 'title updated for associated label element.' );
+               $.fn.updateTooltipAccessKeys.setTestMode( false );
+       } );
+
+       QUnit.test( 'updateTooltipAccessKeys with label element as parent', 2, function ( assert ) {
+               $.fn.updateTooltipAccessKeys.setTestMode( true );
+               var html = '<label title="Title">Label<input id="testInput" accessKey="a" /></label>',
+               $label, $input;
+               $( '#qunit-fixture' ).html( html );
+               $label = $( '#qunit-fixture label' );
+               $input = $( '#qunit-fixture input' );
+               $input.updateTooltipAccessKeys();
+               assert.equal( $input.prop( 'title' ), '', 'No title attribute added to input element.' );
+               assert.equal( $label.prop( 'title' ), 'Title [test-a]', 'title updated for associated label element.' );
+               $.fn.updateTooltipAccessKeys.setTestMode( false );
+       } );
+
+}( jQuery ) );
index e189524..842817f 100644 (file)
@@ -48,7 +48,7 @@
                // Put this text in the span and verify it doesn't fit
                $span.text( spanTextNew );
                // In IE6 width works like min-width, allow IE6's width to be "equal to"
-               if ( $.browser.msie && Number( $.browser.version ) === 6 ) {
+               if ( $.client.test( { 'msie': 6 }, $.client.profile(), true ) ) {
                        assert.gtOrEq( $span.width(), $span.parent().width(), 'Fit is maximal (adding two characters makes it not fit any more) - IE6: Maybe equal to as well due to width behaving like min-width in IE6' );
                } else {
                        assert.gt( $span.width(), $span.parent().width(), 'Fit is maximal (adding two characters makes it not fit any more)' );
index d9801d9..9216ac9 100644 (file)
@@ -1,5 +1,5 @@
 ( function ( $, mw ) {
-       var config, header,
+       var header,
 
                // Data set "simple"
                a1 = [ 'A', '1' ],
                        ['February 05 2010']
                ];
 
-       config = {
-               wgMonthNames: ['', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
-               wgMonthNamesShort: ['', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
-               wgDefaultDateFormat: 'dmy',
-               wgSeparatorTransformTable: ['', ''],
-               wgDigitTransformTable: ['', ''],
-               wgContentLanguage: 'en'
-       };
-
-       QUnit.module( 'jquery.tablesorter', QUnit.newMwEnvironment( { config: config } ) );
+       QUnit.module( 'jquery.tablesorter', QUnit.newMwEnvironment( {
+               config: {
+                       wgMonthNames: ['', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
+                       wgMonthNamesShort: ['', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+                       wgDefaultDateFormat: 'dmy',
+                       wgSeparatorTransformTable: ['', ''],
+                       wgDigitTransformTable: ['', ''],
+                       wgContentLanguage: 'en'
+               }
+       } ) );
 
        /**
         * Create an HTML table from an array of row arrays containing text strings.
index 25d9f73..2191c3b 100644 (file)
@@ -32,7 +32,7 @@
                }, opt.after );
 
                QUnit.test( opt.description, function ( assert ) {
-                       var $textarea, start, end, options, text,
+                       var $textarea, start, end, options, text, selected,
                                tests = 1;
                        if ( opt.after.selected !== null ) {
                                tests++;
@@ -63,7 +63,7 @@
                        assert.equal( text, opt.after.text, 'Checking full text after encapsulation' );
 
                        if ( opt.after.selected !== null ) {
-                               var selected = $textarea.textSelection( 'getSelection' );
+                               selected = $textarea.textSelection( 'getSelection' );
                                assert.equal( selected, opt.after.selected, 'Checking selected text after encapsulation.' );
                        }
 
 
        caretSample = 'Some big text that we like to work with. Nothing fancy... you know what I mean?';
 
-       /*
-        // @broken: Disabled per bug 34820
-        caretTest({
-        description: 'getCaretPosition with original/empty selection - bug 31847 with IE 6/7/8',
-        text: caretSample,
-        start: [0, caretSample.length], // Opera and Firefox (prior to FF 6.0) default caret to the end of the box (caretSample.length)
-        end: [0, caretSample.length], // Other browsers default it to the beginning (0), so check both.
-        mode: 'get'
-        });
-        */
+/*
+       // @broken: Disabled per bug 34820
+       caretTest({
+       description: 'getCaretPosition with original/empty selection - bug 31847 with IE 6/7/8',
+       text: caretSample,
+       start: [0, caretSample.length], // Opera and Firefox (prior to FF 6.0) default caret to the end of the box (caretSample.length)
+       end: [0, caretSample.length], // Other browsers default it to the beginning (0), so check both.
+       mode: 'get'
+       });
+*/
 
        caretTest( {
                description: 'set/getCaretPosition with forced empty selection',
diff --git a/tests/qunit/suites/resources/mediawiki.api/mediawiki.api.category.test.js b/tests/qunit/suites/resources/mediawiki.api/mediawiki.api.category.test.js
new file mode 100644 (file)
index 0000000..a0c7daf
--- /dev/null
@@ -0,0 +1,30 @@
+( function ( mw ) {
+       QUnit.module( 'mediawiki.api.category', QUnit.newMwEnvironment( {
+               setup: function () {
+                       this.server = this.sandbox.useFakeServer();
+               }
+       } ) );
+
+       QUnit.test( '.getCategoriesByPrefix()', function ( assert ) {
+               QUnit.expect( 1 );
+
+               var api = new mw.Api();
+
+               api.getCategoriesByPrefix( 'Foo' ).done( function ( matches ) {
+                       assert.deepEqual(
+                               matches,
+                               [ 'Food', 'Fool Supermarine S.6', 'Fools' ]
+                       );
+               } );
+
+               this.server.respond( function ( req ) {
+                       req.respond( 200, { 'Content-Type': 'application/json' },
+                               '{ "query": { "allpages": [ ' +
+                                       '{ "title": "Category:Food" },' +
+                                       '{ "title": "Category:Fool Supermarine S.6" },' +
+                                       '{ "title": "Category:Fools" }' +
+                                       '] } }'
+                       );
+               } );
+       } );
+}( mediaWiki ) );
index 70bcaf9..cd0db7c 100644 (file)
@@ -1,11 +1,7 @@
 ( function ( mw ) {
        QUnit.module( 'mediawiki.api.parse', QUnit.newMwEnvironment( {
                setup: function () {
-                       this.clock = this.sandbox.useFakeTimers();
                        this.server = this.sandbox.useFakeServer();
-               },
-               teardown: function () {
-                       this.clock.tick( 1 );
                }
        } ) );
 
index 4ee8afa..f156c72 100644 (file)
@@ -1,11 +1,7 @@
 ( function ( mw ) {
        QUnit.module( 'mediawiki.api', QUnit.newMwEnvironment( {
                setup: function () {
-                       this.clock = this.sandbox.useFakeTimers();
                        this.server = this.sandbox.useFakeServer();
-               },
-               teardown: function () {
-                       this.clock.tick( 1 );
                }
        } ) );
 
                this.server.respond();
        } );
 
-       QUnit.test( 'getToken( cached )', function ( assert ) {
+       QUnit.test( 'getToken( pre-populated )', function ( assert ) {
                QUnit.expect( 2 );
 
                var api = new mw.Api();
                assert.equal( this.server.requests.length, 0, 'Requests made' );
        } );
 
-       QUnit.test( 'getToken( uncached )', function ( assert ) {
-               QUnit.expect( 2 );
+       QUnit.test( 'getToken()', function ( assert ) {
+               QUnit.expect( 5 );
 
-               var api = new mw.Api();
+               var test = this,
+                       api = new mw.Api();
 
                // Get a token of a type that isn't prepopulated by user.tokens.
                // Could use "block" or "delete" here, but those could in theory
                // be added to user.tokens, use a fake one instead.
                api.getToken( 'testaction' )
                        .done( function ( token ) {
-                               assert.ok( token.length, 'Got a token' );
+                               assert.ok( token.length, 'Got testaction token' );
                        } )
                        .fail( function ( err ) {
-                               assert.equal( '', err, 'API error' );
+                               assert.equal( err, '', 'API error' );
+                       } );
+               api.getToken( 'testaction' )
+                       .done( function ( token ) {
+                               assert.ok( token.length, 'Got testaction token (cached)' );
+                       } )
+                       .fail( function ( err ) {
+                               assert.equal( err, '', 'API error' );
                        } );
 
-               assert.equal( this.server.requests.length, 1, 'Requests made' );
+               // Don't cache error (bug 65268)
+               api.getToken( 'testaction2' )
+                       .fail( function ( err ) {
+                               assert.equal( err, 'bite-me', 'Expected error' );
+                       } )
+                       .always( function () {
+                               // Make this request after the first one has finished.
+                               // If we make it simultaneously we still want it to share
+                               // the cache, but as soon as it is fulfilled as error we
+                               // reject it so that the next one tries fresh.
+                               api.getToken( 'testaction2' )
+                                       .done( function ( token ) {
+                                               assert.ok( token.length, 'Got testaction2 token (error was not be cached)' );
+                                       } )
+                                       .fail( function ( err ) {
+                                               assert.equal( err, '', 'API error' );
+                                       } );
+
+                               assert.equal( test.server.requests.length, 3, 'Requests made' );
+
+                               test.server.requests[2].respond( 200, { 'Content-Type': 'application/json' },
+                                       '{ "tokens": { "testaction2token": "0123abc" } }'
+                               );
+                       } );
+
+               this.server.requests[0].respond( 200, { 'Content-Type': 'application/json' },
+                       '{ "tokens": { "testactiontoken": "0123abc" } }'
+               );
+
+               this.server.requests[1].respond( 200, { 'Content-Type': 'application/json' },
+                       '{ "error": { "code": "bite-me", "info": "Smite me, O Mighty Smiter" } }'
+               );
+       } );
+
+       QUnit.test( 'postWithToken( tokenType, params )', function ( assert ) {
+               QUnit.expect( 1 );
+
+               var api = new mw.Api( { ajax: { url: '/postWithToken/api.php' } } );
+
+               // - Requests token
+               // - Performs action=example
+               api.postWithToken( 'testsimpletoken', { action: 'example', key: 'foo' } )
+                       .done( function ( data ) {
+                               assert.deepEqual( data, { example: { foo: 'quux' } } );
+                       } );
+
+               this.server.requests[0].respond( 200, { 'Content-Type': 'application/json' },
+                       '{ "tokens": { "testsimpletokentoken": "a-bad-token" } }'
+               );
+
+               this.server.requests[1].respond( 200, { 'Content-Type': 'application/json' },
+                       '{ "example": { "foo": "quux" } }'
+               );
+       } );
+
+       QUnit.test( 'postWithToken( tokenType, params, ajaxOptions )', function ( assert ) {
+               QUnit.expect( 3 );
+
+               var api = new mw.Api();
+
+               api.postWithToken(
+                       'edit',
+                       {
+                               action: 'example'
+                       },
+                       {
+                               headers: {
+                                       'X-Foo': 'Bar'
+                               }
+                       }
+               );
+
+               api.postWithToken(
+                       'edit',
+                       {
+                               action: 'example'
+                       },
+                       function () {
+                               assert.ok( false, 'This parameter cannot be a callback' );
+                       }
+               )
+               .always( function ( data ) {
+                       assert.equal( data.example, 'quux' );
+               } );
+
+               assert.equal( this.server.requests.length, 2, 'Request made' );
+               assert.equal( this.server.requests[0].requestHeaders['X-Foo'], 'Bar', 'Header sent' );
 
                this.server.respond( function ( request ) {
-                       request.respond( 200, { 'Content-Type': 'application/json' },
-                               '{ "tokens": { "testactiontoken": "0123abc" } }'
-                       );
+                       request.respond( 200, { 'Content-Type': 'application/json' }, '{ "example": "quux" }' );
                } );
        } );
 
+       QUnit.test( 'postWithToken() - badtoken', function ( assert ) {
+               QUnit.expect( 1 );
+
+               var api = new mw.Api();
+
+               // - Request: token
+               // - Request: action=example -> badtoken error
+               // - Request: new token
+               // - Request: action=example
+               api.postWithToken( 'testbadtoken', { action: 'example', key: 'foo' } )
+                       .done( function ( data ) {
+                               assert.deepEqual( data, { example: { foo: 'quux' } } );
+                       } );
+
+               this.server.requests[0].respond( 200, { 'Content-Type': 'application/json' },
+                       '{ "tokens": { "testbadtokentoken": "a-bad-token" } }'
+               );
+
+               this.server.requests[1].respond( 200, { 'Content-Type': 'application/json' },
+                       '{ "error": { "code": "badtoken" } }'
+               );
+
+               this.server.requests[2].respond( 200, { 'Content-Type': 'application/json' },
+                       '{ "tokens": { "testbadtokentoken": "a-good-token" } }'
+               );
+
+               this.server.requests[3].respond( 200, { 'Content-Type': 'application/json' },
+                       '{ "example": { "foo": "quux" } }'
+               );
+
+       } );
+
+       QUnit.test( 'postWithToken() - badtoken-cached', function ( assert ) {
+               QUnit.expect( 2 );
+
+               var api = new mw.Api();
+
+               // - Request: token
+               // - Request: action=example
+               api.postWithToken( 'testbadtokencache', { action: 'example', key: 'foo' } )
+                       .done( function ( data ) {
+                               assert.deepEqual( data, { example: { foo: 'quux' } } );
+                       } );
+
+               // - Cache: Try previously cached token
+               // - Request: action=example -> badtoken error
+               // - Request: new token
+               // - Request: action=example
+               api.postWithToken( 'testbadtokencache', { action: 'example', key: 'bar' } )
+                       .done( function ( data ) {
+                               assert.deepEqual( data, { example: { bar: 'quux' } } );
+                       } );
+
+               this.server.requests[0].respond( 200, { 'Content-Type': 'application/json' },
+                       '{ "tokens": { "testbadtokencachetoken": "a-good-token-once" } }'
+               );
+
+               this.server.requests[1].respond( 200, { 'Content-Type': 'application/json' },
+                       '{ "example": { "foo": "quux" } }'
+               );
+
+               this.server.requests[2].respond( 200, { 'Content-Type': 'application/json' },
+                       '{ "error": { "code": "badtoken" } }'
+               );
+
+               this.server.requests[3].respond( 200, { 'Content-Type': 'application/json' },
+                       '{ "tokens": { "testbadtokencachetoken": "a-good-new-token" } }'
+               );
+
+               this.server.requests[4].respond( 200, { 'Content-Type': 'application/json' },
+                       '{ "example": { "bar": "quux" } }'
+               );
+
+       } );
+
 }( mediaWiki ) );
index e178090..5965ab7 100644 (file)
@@ -1,11 +1,7 @@
 ( function ( mw ) {
        QUnit.module( 'mediawiki.api.watch', QUnit.newMwEnvironment( {
                setup: function () {
-                       this.clock = this.sandbox.useFakeTimers();
                        this.server = this.sandbox.useFakeServer();
-               },
-               teardown: function () {
-                       this.clock.tick( 1 );
                }
        } ) );
 
index f5fd16d..077ce70 100644 (file)
@@ -1,60 +1,6 @@
 /*jshint -W024 */
 ( function ( mw, $ ) {
-       // mw.Title relies on these three config vars
-       // Restore them after each test run
-       var config = {
-               wgFormattedNamespaces: {
-                       '-2': 'Media',
-                       '-1': 'Special',
-                       0: '',
-                       1: 'Talk',
-                       2: 'User',
-                       3: 'User talk',
-                       4: 'Wikipedia',
-                       5: 'Wikipedia talk',
-                       6: 'File',
-                       7: 'File talk',
-                       8: 'MediaWiki',
-                       9: 'MediaWiki talk',
-                       10: 'Template',
-                       11: 'Template talk',
-                       12: 'Help',
-                       13: 'Help talk',
-                       14: 'Category',
-                       15: 'Category talk',
-                       // testing custom / localized namespace
-                       100: 'Penguins'
-               },
-               wgNamespaceIds: {
-                       'media': -2,
-                       'special': -1,
-                       '': 0,
-                       'talk': 1,
-                       'user': 2,
-                       'user_talk': 3,
-                       'wikipedia': 4,
-                       'wikipedia_talk': 5,
-                       'file': 6,
-                       'file_talk': 7,
-                       'mediawiki': 8,
-                       'mediawiki_talk': 9,
-                       'template': 10,
-                       'template_talk': 11,
-                       'help': 12,
-                       'help_talk': 13,
-                       'category': 14,
-                       'category_talk': 15,
-                       'image': 6,
-                       'image_talk': 7,
-                       'project': 4,
-                       'project_talk': 5,
-                       // Testing custom namespaces and aliases
-                       'penguins': 100,
-                       'antarctic_waterfowl': 100
-               },
-               wgCaseSensitiveNamespaces: []
-       },
-       repeat = function ( input, multiplier ) {
+       var repeat = function ( input, multiplier ) {
                return new Array( multiplier + 1 ).join( input );
        },
        cases = {
@@ -74,6 +20,7 @@
                        'Foo/.../Sandbox',
                        'Sandbox/...',
                        'A~~',
+                       ':A',
                        // Length is 256 total, but only title part matters
                        'Category:' + repeat( 'x', 248 ),
                        repeat( 'x', 252 )
                ]
        };
 
-       QUnit.module( 'mediawiki.Title', QUnit.newMwEnvironment( { config: config } ) );
+       QUnit.module( 'mediawiki.Title', QUnit.newMwEnvironment( {
+               // mw.Title relies on these three config vars
+               // Restore them after each test run
+               config: {
+                       wgFormattedNamespaces: {
+                               '-2': 'Media',
+                               '-1': 'Special',
+                               0: '',
+                               1: 'Talk',
+                               2: 'User',
+                               3: 'User talk',
+                               4: 'Wikipedia',
+                               5: 'Wikipedia talk',
+                               6: 'File',
+                               7: 'File talk',
+                               8: 'MediaWiki',
+                               9: 'MediaWiki talk',
+                               10: 'Template',
+                               11: 'Template talk',
+                               12: 'Help',
+                               13: 'Help talk',
+                               14: 'Category',
+                               15: 'Category talk',
+                               // testing custom / localized namespace
+                               100: 'Penguins'
+                       },
+                       wgNamespaceIds: {
+                               'media': -2,
+                               'special': -1,
+                               '': 0,
+                               'talk': 1,
+                               'user': 2,
+                               'user_talk': 3,
+                               'wikipedia': 4,
+                               'wikipedia_talk': 5,
+                               'file': 6,
+                               'file_talk': 7,
+                               'mediawiki': 8,
+                               'mediawiki_talk': 9,
+                               'template': 10,
+                               'template_talk': 11,
+                               'help': 12,
+                               'help_talk': 13,
+                               'category': 14,
+                               'category_talk': 15,
+                               'image': 6,
+                               'image_talk': 7,
+                               'project': 4,
+                               'project_talk': 5,
+                               // Testing custom namespaces and aliases
+                               'penguins': 100,
+                               'antarctic_waterfowl': 100
+                       },
+                       wgCaseSensitiveNamespaces: []
+               }
+       } ) );
 
        QUnit.test( 'constructor', cases.invalid.length, function ( assert ) {
                var i, title;
diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.cookie.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.cookie.test.js
new file mode 100644 (file)
index 0000000..c9653da
--- /dev/null
@@ -0,0 +1,172 @@
+( function ( mw, $ ) {
+
+       var NOW = 9012, // miliseconds
+               DEFAULT_DURATION = 5678, // seconds
+               expiryDate = new Date();
+
+       expiryDate.setTime( NOW + ( DEFAULT_DURATION * 1000 ) );
+
+       QUnit.module( 'mediawiki.cookie', QUnit.newMwEnvironment( {
+               setup: function () {
+                       this.stub( $, 'cookie' ).returns( null );
+
+                       this.sandbox.useFakeTimers( NOW );
+               },
+               config: {
+                       wgCookiePrefix: 'mywiki',
+                       wgCookieDomain: 'example.org',
+                       wgCookiePath: '/path',
+                       wgCookieExpiration: DEFAULT_DURATION
+               }
+       } ) );
+
+       QUnit.test( 'set( key, value )', 7, function ( assert ) {
+               var call;
+
+               // Simple case
+               mw.cookie.set( 'foo', 'bar' );
+
+               call = $.cookie.lastCall.args;
+               assert.strictEqual( call[ 0 ], 'mywikifoo' );
+               assert.strictEqual( call[ 1 ], 'bar' );
+               assert.deepEqual( call[ 2 ], {
+                       expires: expiryDate,
+                       domain: 'example.org',
+                       path: '/path',
+                       secure: false
+               } );
+
+               mw.cookie.set( 'foo', null );
+               call = $.cookie.lastCall.args;
+               assert.strictEqual( call[ 1 ], null, 'null removes cookie' );
+
+               mw.cookie.set( 'foo', undefined );
+               call = $.cookie.lastCall.args;
+               assert.strictEqual( call[ 1 ], 'undefined', 'undefined is value' );
+
+               mw.cookie.set( 'foo', false );
+               call = $.cookie.lastCall.args;
+               assert.strictEqual( call[ 1 ], 'false', 'false is a value' );
+
+               mw.cookie.set( 'foo', 0 );
+               call = $.cookie.lastCall.args;
+               assert.strictEqual( call[ 1 ], '0', '0 is value' );
+       } );
+
+       QUnit.test( 'set( key, value, expires )', 5, function ( assert ) {
+               var date, options;
+
+               date = new Date();
+               date.setTime( 1234 );
+
+               mw.cookie.set( 'foo', 'bar' );
+               options = $.cookie.lastCall.args[ 2 ];
+               assert.deepEqual( options.expires, expiryDate, 'Default cookie expiration is used' );
+
+               mw.cookie.set( 'foo', 'bar', date );
+               options = $.cookie.lastCall.args[ 2 ];
+               assert.strictEqual( options.expires, date, 'Custom expiration date' );
+
+               mw.cookie.set( 'foo', 'bar', null );
+               options = $.cookie.lastCall.args[ 2 ];
+               assert.strictEqual( options.expires, undefined, 'Expiry null forces session cookie' );
+
+               // Per DefaultSettings.php, when wgCookieExpiration is 0, the default should
+               // be session cookies
+               mw.config.set( 'wgCookieExpiration', 0 );
+
+               mw.cookie.set( 'foo', 'bar' );
+               options = $.cookie.lastCall.args[ 2 ];
+               assert.strictEqual( options.expires, undefined, 'wgCookieExpiration=0 results in session cookies by default' );
+
+               mw.cookie.set( 'foo', 'bar', date );
+               options = $.cookie.lastCall.args[ 2 ];
+               assert.strictEqual( options.expires, date, 'Custom expiration when default is session cookies' );
+       } );
+
+       QUnit.test( 'set( key, value, options )', 4, function ( assert ) {
+               var date, call;
+
+               mw.cookie.set( 'foo', 'bar', {
+                       prefix: 'myPrefix',
+                       domain: 'myDomain',
+                       path: 'myPath',
+                       secure: true
+               } );
+
+               call = $.cookie.lastCall.args;
+               assert.strictEqual( call[0], 'myPrefixfoo' );
+               assert.deepEqual( call[ 2 ], {
+                       expires: expiryDate,
+                       domain: 'myDomain',
+                       path: 'myPath',
+                       secure: true
+               }, 'Options (without expires)' );
+
+               date = new Date();
+               date.setTime( 1234 );
+
+               mw.cookie.set( 'foo', 'bar', {
+                       expires: date,
+                       prefix: 'myPrefix',
+                       domain: 'myDomain',
+                       path: 'myPath',
+                       secure: true
+               } );
+
+               call = $.cookie.lastCall.args;
+               assert.strictEqual( call[0], 'myPrefixfoo' );
+               assert.deepEqual( call[ 2 ], {
+                       expires: date,
+                       domain: 'myDomain',
+                       path: 'myPath',
+                       secure: true
+               }, 'Options (incl. expires)' );
+       } );
+
+       QUnit.test( 'get( key ) - no values', 6, function ( assert ) {
+               var key, value;
+
+               mw.cookie.get( 'foo' );
+
+               key = $.cookie.lastCall.args[ 0 ];
+               assert.strictEqual( key, 'mywikifoo', 'Default prefix' );
+
+               mw.cookie.get( 'foo', undefined );
+               key = $.cookie.lastCall.args[ 0 ];
+               assert.strictEqual( key, 'mywikifoo', 'Use default prefix for undefined' );
+
+               mw.cookie.get( 'foo', null );
+               key = $.cookie.lastCall.args[ 0 ];
+               assert.strictEqual( key, 'mywikifoo', 'Use default prefix for null' );
+
+               mw.cookie.get( 'foo', '' );
+               key = $.cookie.lastCall.args[ 0 ];
+               assert.strictEqual( key, 'foo', 'Don\'t use default prefix for empty string' );
+
+               value = mw.cookie.get( 'foo' );
+               assert.strictEqual( value, null, 'Return null by default' );
+
+               value = mw.cookie.get( 'foo', null, 'bar' );
+               assert.strictEqual( value, 'bar', 'Custom default value' );
+       } );
+
+       QUnit.test( 'get( key ) - with value', 1, function ( assert ) {
+               var value;
+
+               $.cookie.returns( 'bar' );
+
+               value = mw.cookie.get( 'foo' );
+               assert.strictEqual( value, 'bar', 'Return value of cookie' );
+       } );
+
+       QUnit.test( 'get( key, prefix )', 1, function ( assert ) {
+               var key;
+
+               mw.cookie.get( 'foo', 'bar' );
+
+               key = $.cookie.lastCall.args[ 0 ];
+               assert.strictEqual( key, 'barfoo' );
+       } );
+
+} ( mediaWiki, jQuery ) );
index 995c1ed..bc4b253 100644 (file)
                setup: function () {
                        this.originalMwLanguage = mw.language;
 
-                       // Messages that are reused in multiple tests
-                       mw.messages.set( {
-                               // The values for gender are not significant,
-                               // what matters is which of the values is choosen by the parser
-                               'gender-msg': '$1: {{GENDER:$2|blue|pink|green}}',
-                               'gender-msg-currentuser': '{{GENDER:|blue|pink|green}}',
-
-                               'plural-msg': 'Found $1 {{PLURAL:$1|item|items}}',
-
-                               // Assume the grammar form grammar_case_foo is not valid in any language
-                               'grammar-msg': 'Przeszukaj {{GRAMMAR:grammar_case_foo|{{SITENAME}}}}',
-
-                               'formatnum-msg': '{{formatnum:$1}}',
-
-                               'portal-url': 'Project:Community portal',
-                               'see-portal-url': '{{Int:portal-url}} is an important community page.',
-
-                               'jquerymsg-test-statistics-users': '注册[[Special:ListUsers|用户]]',
-
-                               'jquerymsg-test-version-entrypoints-index-php': '[https://www.mediawiki.org/wiki/Manual:index.php index.php]',
-
-                               'external-link-replace': 'Foo [$1 bar]'
-                       } );
-
-                       mw.config.set( {
-                               wgArticlePath: '/wiki/$1'
-                       } );
-
                        specialCharactersPageName = '"Who" wants to be a millionaire & live on \'Exotic Island\'?';
 
                        expectedListUsers = '注册<a title="Special:ListUsers" href="/wiki/Special:ListUsers">用户</a>';
                },
                teardown: function () {
                        mw.language = this.originalMwLanguage;
+               },
+               config: {
+                       wgArticlePath: '/wiki/$1'
+               },
+               // Messages that are reused in multiple tests
+               messages: {
+                       // The values for gender are not significant,
+                       // what matters is which of the values is choosen by the parser
+                       'gender-msg': '$1: {{GENDER:$2|blue|pink|green}}',
+                       'gender-msg-currentuser': '{{GENDER:|blue|pink|green}}',
+
+                       'plural-msg': 'Found $1 {{PLURAL:$1|item|items}}',
+
+                       // Assume the grammar form grammar_case_foo is not valid in any language
+                       'grammar-msg': 'Przeszukaj {{GRAMMAR:grammar_case_foo|{{SITENAME}}}}',
+
+                       'formatnum-msg': '{{formatnum:$1}}',
+
+                       'portal-url': 'Project:Community portal',
+                       'see-portal-url': '{{Int:portal-url}} is an important community page.',
+
+                       'jquerymsg-test-statistics-users': '注册[[Special:ListUsers|用户]]',
+
+                       'jquerymsg-test-version-entrypoints-index-php': '[https://www.mediawiki.org/wiki/Manual:index.php index.php]',
+
+                       'external-link-replace': 'Foo [$1 bar]'
                }
        } ) );
 
                        expectedMultipleBars,
                        expectedSpecialCharacters;
 
-               /*
-                The below three are all identical to or based on real messages.  For disambiguations-text,
-                the bold was removed because it is not yet implemented.
-                */
+               // The below three are all identical to or based on real messages.  For disambiguations-text,
+               // the bold was removed because it is not yet implemented.
 
                assert.htmlEqual(
                        formatParse( 'jquerymsg-test-statistics-users' ),
index a9b2f33..0f6b445 100644 (file)
@@ -9,26 +9,24 @@
 
        QUnit.module( 'mediawiki', QUnit.newMwEnvironment( {
                setup: function () {
-                       // Messages used in multiple tests
-                       mw.messages.set( {
-                               'other-message': 'Other Message',
-                               'mediawiki-test-pagetriage-del-talk-page-notify-summary': 'Notifying author of deletion nomination for [[$1]]',
-                               'gender-plural-msg': '{{GENDER:$1|he|she|they}} {{PLURAL:$2|is|are}} awesome',
-                               'grammar-msg': 'Przeszukaj {{GRAMMAR:grammar_case_foo|{{SITENAME}}}}',
-                               'formatnum-msg': '{{formatnum:$1}}',
-                               'int-msg': 'Some {{int:other-message}}',
-                               'mediawiki-test-version-entrypoints-index-php': '[https://www.mediawiki.org/wiki/Manual:index.php index.php]',
-                               'external-link-replace': 'Foo [$1 bar]'
-                       } );
-
-                       mw.config.set( {
-                               wgArticlePath: '/wiki/$1',
-
-                               // For formatnum tests
-                               wgUserLanguage: 'en'
-                       } );
-
                        specialCharactersPageName = '"Who" wants to be a millionaire & live on \'Exotic Island\'?';
+               },
+               config: {
+                       wgArticlePath: '/wiki/$1',
+
+                       // For formatnum tests
+                       wgUserLanguage: 'en'
+               },
+               // Messages used in multiple tests
+               messages: {
+                       'other-message': 'Other Message',
+                       'mediawiki-test-pagetriage-del-talk-page-notify-summary': 'Notifying author of deletion nomination for [[$1]]',
+                       'gender-plural-msg': '{{GENDER:$1|he|she|they}} {{PLURAL:$2|is|are}} awesome',
+                       'grammar-msg': 'Przeszukaj {{GRAMMAR:grammar_case_foo|{{SITENAME}}}}',
+                       'formatnum-msg': '{{formatnum:$1}}',
+                       'int-msg': 'Some {{int:other-message}}',
+                       'mediawiki-test-version-entrypoints-index-php': '[https://www.mediawiki.org/wiki/Manual:index.php index.php]',
+                       'external-link-replace': 'Foo [$1 bar]'
                }
        } ) );
 
                assert.strictEqual( window.$j, window.jQuery, '$j alias to jQuery' );
                this.restoreWarnings();
 
+               // window.mw and window.mediaWiki are not deprecated, but for some reason
+               // PhantomJS is triggerring the accessors on all mw.* properties in this test,
+               // and with that lots of unrelated deprecation notices.
+               this.suppressWarnings();
                assert.ok( window.mediaWiki, 'mediaWiki defined' );
                assert.ok( window.mw, 'mw defined' );
                assert.strictEqual( window.mw, window.mediaWiki, 'mw alias to mediaWiki' );
+               this.restoreWarnings();
        } );
 
        QUnit.test( 'mw.Map', 28, function ( assert ) {
index 3f856b9..e43516b 100644 (file)
@@ -1,5 +1,10 @@
 ( function ( mw, $ ) {
-       QUnit.module( 'mediawiki.toc', QUnit.newMwEnvironment() );
+       QUnit.module( 'mediawiki.toc', QUnit.newMwEnvironment( {
+               setup: function () {
+                       // Prevent live cookies like mw_hidetoc=1 from interferring with the test
+                       this.stub( $, 'cookie' ).returns( null );
+               }
+       } ) );
 
        QUnit.asyncTest( 'toggleToc', 4, function ( assert ) {
                var tocHtml, $toggleLink, $tocList;
index f422bc1..91321a2 100644 (file)
@@ -1,26 +1,22 @@
-( function ( mw, $ ) {
-       QUnit.module( 'mediawiki.user', QUnit.newMwEnvironment() );
+( function ( mw ) {
+       QUnit.module( 'mediawiki.user', QUnit.newMwEnvironment( {
+               setup: function () {
+                       this.server = this.sandbox.useFakeServer();
+               }
+       } ) );
 
        QUnit.test( 'options', 1, function ( assert ) {
                assert.ok( mw.user.options instanceof mw.Map, 'options instance of mw.Map' );
        } );
 
-       QUnit.test( 'user status', 11, function ( assert ) {
-               /**
-                * Tests can be run under three different conditions:
-                *   1) From tests/qunit/index.html, user will be anonymous.
-                *   2) Logged in on [[Special:JavaScriptTest/qunit]]
-                *   3) Anonymously at the same special page.
-                */
+       QUnit.test( 'user status', 7, function ( assert ) {
 
-               // Forge an anonymous user:
+               // Forge an anonymous user
                mw.config.set( 'wgUserName', null );
                delete mw.config.values.wgUserId;
 
                assert.strictEqual( mw.user.getName(), null, 'user.getName() returns null when anonymous' );
-               assert.strictEqual( mw.user.name(), null, 'user.name() compatibility' );
                assert.assertTrue( mw.user.isAnon(), 'user.isAnon() returns true when anonymous' );
-               assert.assertTrue( mw.user.anonymous(), 'user.anonymous() compatibility' );
                assert.strictEqual( mw.user.getId(), 0, 'user.getId() returns 0 when anonymous' );
 
                // Not part of startUp module
                mw.config.set( 'wgUserId', 123 );
 
                assert.equal( mw.user.getName(), 'John', 'user.getName() returns username when logged-in' );
-               assert.equal( mw.user.name(), 'John', 'user.name() compatibility' );
                assert.assertFalse( mw.user.isAnon(), 'user.isAnon() returns false when logged-in' );
-               assert.assertFalse( mw.user.anonymous(), 'user.anonymous() compatibility' );
                assert.strictEqual( mw.user.getId(), 123, 'user.getId() returns correct ID when logged-in' );
 
                assert.equal( mw.user.id(), 'John', 'user.id Returns username when logged-in' );
        } );
 
-       QUnit.asyncTest( 'getGroups', 3, function ( assert ) {
+       QUnit.test( 'getUserInfos', 3, function ( assert ) {
                mw.user.getGroups( function ( groups ) {
-                       // First group should always be '*'
-                       assert.equal( $.type( groups ), 'array', 'Callback gets an array' );
-                       assert.notStrictEqual( $.inArray( '*', groups ), -1, '"*"" is in the list' );
-                       // Sort needed because of different methods if creating the arrays,
-                       // only the content matters.
-                       assert.deepEqual( groups.sort(), mw.config.get( 'wgUserGroups' ).sort(), 'Array contains all groups, just like wgUserGroups' );
-                       QUnit.start();
+                       assert.deepEqual( groups, [ '*', 'user' ], 'Result' );
                } );
-       } );
-
-       QUnit.test( 'getRights', 2, function ( assert ) {
-               QUnit.stop();
-               QUnit.stop();
 
                mw.user.getRights( function ( rights ) {
-                       assert.equal( $.type( rights ), 'array', 'Callback gets an array' );
-                       QUnit.start();
+                       assert.deepEqual( rights, [ 'read', 'edit', 'createtalk' ], 'Result (callback)' );
                } );
 
                mw.user.getRights().done( function ( rights ) {
-                       assert.equal( $.type( rights ), 'array', 'Using promise interface instead of callback' );
-                       QUnit.start();
+                       assert.deepEqual( rights, [ 'read', 'edit', 'createtalk' ], 'Result (promise)' );
                } );
+
+               this.server.respondWith( /meta=userinfo/, function ( request ) {
+                       request.respond( 200, { 'Content-Type': 'application/json' },
+                               '{ "query": { "userinfo": { "groups": [ "*", "user" ], "rights": [ "read", "edit", "createtalk" ] } } }'
+                       );
+               } );
+
+               this.server.respond();
        } );
-}( mediaWiki, jQuery ) );
+}( mediaWiki ) );
index 9707ab9..1526679 100644 (file)
@@ -1,11 +1,15 @@
 ( function ( mw, $ ) {
        QUnit.module( 'mediawiki.util', QUnit.newMwEnvironment( {
                setup: function () {
-                       this.taPrefix = mw.util.tooltipAccessKeyPrefix;
-                       mw.util.tooltipAccessKeyPrefix = 'ctrl-alt-';
+                       $.fn.updateTooltipAccessKeys.setTestMode( true );
                },
                teardown: function () {
-                       mw.util.tooltipAccessKeyPrefix = this.taPrefix;
+                       $.fn.updateTooltipAccessKeys.setTestMode( false );
+               },
+               messages: {
+                       // Used by accessKeyLabel in test for addPortletLink
+                       'brackets': '[$1]',
+                       'word-separator': ' '
                }
        } ) );
 
                assert.equal( mw.util.rawurlencode( 'Test:A & B/Here' ), 'Test%3AA%20%26%20B%2FHere' );
        } );
 
-       QUnit.test( 'wikiUrlencode', 1, function ( assert ) {
+       QUnit.test( 'wikiUrlencode', 10, function ( assert ) {
                assert.equal( mw.util.wikiUrlencode( 'Test:A & B/Here' ), 'Test:A_%26_B/Here' );
+               // See also wfUrlencodeTest.php#provideURLS
+               $.each( {
+                       '+': '%2B',
+                       '&': '%26',
+                       '=': '%3D',
+                       ':': ':',
+                       ';@$-_.!*': ';@$-_.!*',
+                       '/': '/',
+                       '[]': '%5B%5D',
+                       '<>': '%3C%3E',
+                       '\'': '%27'
+               }, function ( input, output ) {
+                       assert.equal( mw.util.wikiUrlencode( input ), output );
+               } );
        } );
 
        QUnit.test( 'getUrl', 4, function ( assert ) {
@@ -26,7 +44,7 @@
                assert.equal( href, '/wiki/Sandbox', 'Simple title; Get link for "Sandbox"' );
 
                href = mw.util.getUrl( 'Foo:Sandbox ? 5+5=10 ! (test)/subpage' );
-               assert.equal( href, '/wiki/Foo:Sandbox_%3F_5%2B5%3D10_%21_%28test%29/subpage',
+               assert.equal( href, '/wiki/Foo:Sandbox_%3F_5%2B5%3D10_!_(test)/subpage',
                        'Advanced title; Get link for "Foo:Sandbox ? 5+5=10 ! (test)/subpage"' );
 
                href = mw.util.getUrl();
        } );
 
        QUnit.test( 'tooltipAccessKey', 4, function ( assert ) {
+               this.suppressWarnings();
+
                assert.equal( typeof mw.util.tooltipAccessKeyPrefix, 'string', 'tooltipAccessKeyPrefix must be a string' );
                assert.equal( $.type( mw.util.tooltipAccessKeyRegexp ), 'regexp', 'tooltipAccessKeyRegexp is a regexp' );
                assert.ok( mw.util.updateTooltipAccessKeys, 'updateTooltipAccessKeys is non-empty' );
                'Example [a]'.replace( mw.util.tooltipAccessKeyRegexp, function ( sub, m1, m2, m3, m4, m5, m6 ) {
                        assert.equal( m6, 'a', 'tooltipAccessKeyRegexp finds the accesskey hint' );
                } );
+
+               this.restoreWarnings();
        } );
 
        QUnit.test( '$content', 2, function ( assert ) {
                assert.ok( $.isDomElement( tbRL ), 'addPortletLink returns a valid DOM Element according to $.isDomElement' );
 
                tbMW = mw.util.addPortletLink( 'p-test-tb', '//mediawiki.org/',
-                       'MediaWiki.org', 't-mworg', 'Go to MediaWiki.org ', 'm', tbRL );
+                       'MediaWiki.org', 't-mworg', 'Go to MediaWiki.org', 'm', tbRL );
                $tbMW = $( tbMW );
 
                assert.propEqual(
                        $tbMW.find( 'a' ).getAttrs(),
                        {
                                href: '//mediawiki.org/',
-                               title: 'Go to MediaWiki.org [ctrl-alt-m]',
+                               title: 'Go to MediaWiki.org [test-m]',
                                accesskey: 'm'
                        },
                        'Validate attributes of anchor tag in created element'
                cuQuux = mw.util.addPortletLink( 'p-test-custom', '#', 'Quux', null, 'Example [shift-x]', 'q' );
                $cuQuux = $( cuQuux );
 
-               assert.equal( $cuQuux.find( 'a' ).attr( 'title' ), 'Example [ctrl-alt-q]', 'Existing accesskey is stripped and updated' );
+               assert.equal( $cuQuux.find( 'a' ).attr( 'title' ), 'Example [test-q]', 'Existing accesskey is stripped and updated' );
 
                assert.equal(
                        $( '#p-test-custom #c-barmenu ul li' ).length,
        } );
 
        QUnit.test( 'jsMessage', 1, function ( assert ) {
+               this.suppressWarnings();
                var a = mw.util.jsMessage( 'MediaWiki is <b>Awesome</b>.' );
+               this.restoreWarnings();
                assert.ok( a, 'Basic checking of return value' );
 
                // Clean up
index 6ff2b24..818b24e 100644 (file)
@@ -664,3 +664,37 @@ class DelayedParserTest {
        }
 
 }
+
+/**
+ * Initialize and detect the DjVu files support
+ */
+class DjVuSupport {
+
+       /**
+        * Initialises DjVu tools global with default values
+        */
+       public function __construct() {
+               global $wgDjvuRenderer, $wgDjvuDump, $wgDjvuToXML, $wgFileExtensions;
+
+               $wgDjvuRenderer = $wgDjvuRenderer ? $wgDjvuRenderer : '/usr/bin/ddjvu';
+               $wgDjvuDump = $wgDjvuDump ? $wgDjvuDump : '/usr/bin/djvudump';
+               $wgDjvuToXML = $wgDjvuToXML ? $wgDjvuToXML : '/usr/bin/djvutoxml';
+
+               if ( !in_array( 'djvu', $wgFileExtensions ) ) {
+                       $wgFileExtensions[] = 'djvu';
+               }
+       }
+
+       /**
+        * Returns if the DjVu tools are usable
+        *
+        * @return bool
+        */
+       public function isEnabled() {
+               global $wgDjvuRenderer, $wgDjvuDump, $wgDjvuToXML;
+
+               return is_executable( $wgDjvuRenderer )
+                       && is_executable( $wgDjvuDump )
+                       && is_executable( $wgDjvuToXML );
+       }
+}
index 3f8e0d3..d7bf453 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -36,6 +36,10 @@ if ( defined( 'THUMB_HANDLER' ) ) {
 }
 
 wfLogProfilingData();
+// Commit and close up!
+$factory = wfGetLBFactory();
+$factory->commitMasterChanges();
+$factory->shutdown();
 
 //--------------------------------------------------------------------------
 
@@ -112,6 +116,10 @@ function wfStreamThumb( array $params ) {
                $params['width'] = $params['w'];
                unset( $params['w'] );
        }
+       if ( isset( $params['width'] ) && substr( $params['width'], -2 ) == 'px' ) {
+               // strip the px (pixel) suffix, if found
+               $params['width'] = substr( $width, 0, strlen( $width ) - 2 );
+       }
        if ( isset( $params['p'] ) ) {
                $params['page'] = $params['p'];
        }
@@ -171,6 +179,12 @@ function wfStreamThumb( array $params ) {
                $varyHeader[] = 'Cookie';
        }
 
+       // Check if the file is hidden
+       if ( $img->isDeleted( File::DELETED_FILE ) ) {
+               wfThumbError( 404, "The source file '$fileName' does not exist." );
+               return;
+       }
+
        // Do rendering parameters extraction from thumbnail name.
        if ( isset( $params['thumbName'] ) ) {
                $params = wfExtractThumbParams( $img, $params );
@@ -243,8 +257,10 @@ function wfStreamThumb( array $params ) {
                }
        }
 
+       $rel404 = isset( $params['rel404'] ) ? $params['rel404'] : null;
        unset( $params['r'] ); // ignore 'r' because we unconditionally pass File::RENDER
        unset( $params['f'] ); // We're done with 'f' parameter.
+       unset( $params['rel404'] ); // moved to $rel404
 
        // Get the normalized thumbnail name from the parameters...
        try {
@@ -263,10 +279,10 @@ function wfStreamThumb( array $params ) {
        // for the thumb params and the parent directory for the source file name.
        // Check that the zone relative path matches up so squid caches won't pick
        // up thumbs that would not be purged on source file deletion (bug 34231).
-       if ( isset( $params['rel404'] ) ) { // thumbnail was handled via 404
-               if ( rawurldecode( $params['rel404'] ) === $img->getThumbRel( $thumbName ) ) {
+       if ( $rel404 !== null ) { // thumbnail was handled via 404
+               if ( rawurldecode( $rel404 ) === $img->getThumbRel( $thumbName ) ) {
                        // Request for the canonical thumbnail name
-               } elseif ( rawurldecode( $params['rel404'] ) === $img->getThumbRel( $thumbName2 ) ) {
+               } elseif ( rawurldecode( $rel404 ) === $img->getThumbRel( $thumbName2 ) ) {
                        // Request for the "long" thumbnail name; redirect to canonical name
                        $response = RequestContext::getMain()->getRequest()->response();
                        $response->header( "HTTP/1.1 301 " . HttpStatus::getMessage( 301 ) );
@@ -284,7 +300,7 @@ function wfStreamThumb( array $params ) {
                } else {
                        wfThumbError( 404, "The given path of the specified thumbnail is incorrect;
                                expected '" . $img->getThumbRel( $thumbName ) . "' but got '" .
-                               rawurldecode( $params['rel404'] ) . "'." );
+                               rawurldecode( $rel404 ) . "'." );
                        return;
                }
        }
@@ -306,27 +322,21 @@ function wfStreamThumb( array $params ) {
        }
 
        $user = RequestContext::getMain()->getUser();
-       if ( $user->pingLimiter( 'renderfile' ) ) {
+       if ( !wfThumbIsStandard( $img, $params ) && $user->pingLimiter( 'renderfile-nonstandard' ) ) {
                wfThumbError( 500, wfMessage( 'actionthrottledtext' ) );
                return;
-       } elseif ( wfThumbIsAttemptThrottled( $img, $thumbName, 5 ) ) {
-               wfThumbError( 500, wfMessage( 'thumbnail_image-failure-limit', 5 ) );
+       } elseif ( $user->pingLimiter( 'renderfile' ) ) {
+               wfThumbError( 500, wfMessage( 'actionthrottledtext' ) );
                return;
        }
 
-       // Thumbnail isn't already there, so create the new thumbnail...
-       try {
-               $thumb = $img->transform( $params, File::RENDER_NOW );
-       } catch ( Exception $ex ) {
-               // Tried to select a page on a non-paged file?
-               $thumb = false;
-       }
+       // Actually generate a new thumbnail
+       list( $thumb, $errorMsg ) = wfGenerateThumbnail( $img, $params, $thumbName, $thumbPath );
 
        // Check for thumbnail generation errors...
-       $errorMsg = false;
        $msg = wfMessage( 'thumbnail_error' );
        if ( !$thumb ) {
-               $errorMsg = $msg->rawParams( 'File::transform() returned false' )->escaped();
+               $errorMsg = $errorMsg ?: $msg->rawParams( 'File::transform() returned false' )->escaped();
        } elseif ( $thumb->isError() ) {
                $errorMsg = $thumb->getHtmlMsg();
        } elseif ( !$thumb->hasFile() ) {
@@ -337,7 +347,6 @@ function wfStreamThumb( array $params ) {
        }
 
        if ( $errorMsg !== false ) {
-               wfThumbIncrAttemptFailures( $img, $thumbName );
                wfThumbError( 500, $errorMsg );
        } else {
                // Stream the file if there were no errors
@@ -346,42 +355,138 @@ function wfStreamThumb( array $params ) {
 }
 
 /**
- * @param File $img
+ * Actually try to generate a new thumbnail
+ *
+ * @param File $file
+ * @param array $params
  * @param string $thumbName
- * @param int $limit
- * @return int|bool
+ * @param string $thumbPath
+ * @return array (MediaTransformOutput|bool, string|bool error message HTML)
  */
-function wfThumbIsAttemptThrottled( File $img, $thumbName, $limit ) {
-       global $wgMemc;
+function wfGenerateThumbnail( File $file, array $params, $thumbName, $thumbPath ) {
+       global $wgMemc, $wgAttemptFailureEpoch;
 
-       return ( $wgMemc->get( wfThumbAttemptKey( $img, $thumbName ) ) >= $limit );
-}
+       $key = wfMemcKey( 'attempt-failures', $wgAttemptFailureEpoch,
+               $file->getRepo()->getName(), md5( $file->getName() ), md5( $thumbName ) );
 
-/**
- * @param File $img
- * @param string $thumbName
- */
-function wfThumbIncrAttemptFailures( File $img, $thumbName ) {
-       global $wgMemc;
+       // Check if this file keeps failing to render
+       if ( $wgMemc->get( $key ) >= 4 ) {
+               return array( false, wfMessage( 'thumbnail_image-failure-limit', 4 ) );
+       }
+
+       $done = false;
+       // Record failures on PHP fatals in addition to caching exceptions
+       register_shutdown_function( function() use ( &$done, $key ) {
+               if ( !$done ) { // transform() gave a fatal
+                       global $wgMemc;
+                       // Randomize TTL to reduce stampedes
+                       $wgMemc->incrWithInit( $key, 3600 + mt_rand( 0, 300 ) );
+               }
+       } );
 
-       $key = wfThumbAttemptKey( $img, $thumbName );
-       if ( !$wgMemc->incr( $key, 1 ) ) {
-               if ( !$wgMemc->add( $key, 1, 3600 ) ) {
-                       $wgMemc->incr( $key, 1 );
+       $thumb = false;
+       $errorHtml = false;
+
+       // Thumbnail isn't already there, so create the new thumbnail...
+       try {
+               $work = new PoolCounterWorkViaCallback( 'FileRender', sha1( $file->getName() ),
+                       array(
+                               'doWork' => function() use ( $file, $params ) {
+                                       return $file->transform( $params, File::RENDER_NOW );
+                               },
+                               'getCachedWork' => function() use ( $file, $params, $thumbPath ) {
+                                       // If the worker that finished made this thumbnail then use it.
+                                       // Otherwise, it probably made a different thumbnail for this file.
+                                       return $file->getRepo()->fileExists( $thumbPath )
+                                               ? $file->transform( $params, File::RENDER_NOW )
+                                               : false; // retry once more in exclusive mode
+                               },
+                               'fallback' => function() {
+                                       return wfMessage( 'generic-pool-error' )->parse();
+                               },
+                               'error' => function ( $status ) {
+                                       return $status->getHTML();
+                               }
+                       )
+               );
+               $result = $work->execute();
+               if ( $result instanceof MediaTransformOutput ) {
+                       $thumb = $result;
+               } elseif ( is_string( $result ) ) { // error
+                       $errorHtml = $result;
                }
+       } catch ( Exception $e ) {
+               // Tried to select a page on a non-paged file?
+       }
+
+       $done = true; // no PHP fatal occured
+
+       if ( !$thumb || $thumb->isError() ) {
+               // Randomize TTL to reduce stampedes
+               $wgMemc->incrWithInit( $key, 3600 + mt_rand( 0, 300 ) );
        }
+
+       return array( $thumb, $errorHtml );
 }
 
 /**
- * @param File $img
- * @param string $thumbName
- * @return string
+ * Returns true if this thumbnail is one that MediaWiki generates
+ * links to on file description pages and possibly parser output.
+ *
+ * $params is considered non-standard if they involve a non-standard
+ * width or any non-default parameters aside from width and page number.
+ * The number of possible files with standard parameters is far less than
+ * that of all combinations; rate-limiting for them can thus be more generious.
+ *
+ * @param File $file
+ * @param array $params
+ * @return bool
  */
-function wfThumbAttemptKey( File $img, $thumbName ) {
-       global $wgAttemptFailureEpoch;
+function wfThumbIsStandard( File $file, array $params ) {
+       global $wgThumbLimits, $wgImageLimits;
+
+       $handler = $file->getHandler();
+       if ( !$handler || !isset( $params['width'] ) ) {
+               return false;
+       }
+
+       $basicParams = array();
+       if ( isset( $params['page'] ) ) {
+               $basicParams['page'] = $params['page'];
+       }
+
+       // Check if the width matches one of $wgThumbLimits
+       if ( in_array( $params['width'], $wgThumbLimits ) ) {
+               $normalParams = $basicParams + array( 'width' => $params['width'] );
+               // Append any default values to the map (e.g. "lossy", "lossless", ...)
+               $handler->normaliseParams( $file, $normalParams );
+       } else {
+               // If not, then check if the width matchs one of $wgImageLimits
+               $match = false;
+               foreach ( $wgImageLimits as $pair ) {
+                       $normalParams = $basicParams + array( 'width' => $pair[0], 'height' => $pair[1] );
+                       // Decide whether the thumbnail should be scaled on width or height.
+                       // Also append any default values to the map (e.g. "lossy", "lossless", ...)
+                       $handler->normaliseParams( $file, $normalParams );
+                       // Check if this standard thumbnail size maps to the given width
+                       if ( $normalParams['width'] == $params['width'] ) {
+                               $match = true;
+                               break;
+                       }
+               }
+               if ( !$match ) {
+                       return false; // not standard for description pages
+               }
+       }
+
+       // Check that the given values for non-page, non-width, params are just defaults
+       foreach ( $params as $key => $value ) {
+               if ( !isset( $normalParams[$key] ) || $normalParams[$key] != $value ) {
+                       return false;
+               }
+       }
 
-       return wfMemcKey( 'attempt-failures', $wgAttemptFailureEpoch,
-               $img->getRepo()->getName(), md5( $img->getName() ), md5( $thumbName ) );
+       return true;
 }
 
 /**